diff --git a/CHANGELOG.md b/CHANGELOG.md index 77e3a7e2..da4a1154 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,24 @@ +# v1.10.13 +## 04/23/2021 + +1. [](#new) + * Added refresh action button for Folder to ease the regeneration of the slug based on the title. Available also as API entry `Grav.default.Forms.Fields.FolderField.Regenerate()` [#1738](https://github.com/getgrav/grav-plugin-admin/issues/1738) +1. [](#improved) + * Removed sourcemaps references from fork-awesome.min.css [#2122](https://github.com/getgrav/grav-plugin-admin/issues/2122) + * Support native spell checkers in CodeMirror editor [#1266](https://github.com/getgrav/grav-plugin-admin/issues/1266) + * Added new 'Content Highlight' color to presets + * Copying Pages now prompts a dedicated modal that allows for picking title, folder name, parent location, page template and visibility [#1738](https://github.com/getgrav/grav-plugin-admin/issues/1738) + * Updated with latest language translations from Crowdin.com +1. [](#bugfix) + * Moved preset CSS compile to earlier in the process to ensure compilation happens in time. + * Prevent Save actions from Flex Objects to trigger the unsaved unload notice [#2125](https://github.com/getgrav/grav-plugin-admin/issues/2125) + * Fixed audit vulnerabilities in module dependencies and house cleanup [#2096](https://github.com/getgrav/grav-plugin-admin/issues/2096) + * Fixed issue preventing Drag & Drop of media files while in Expert Mode [#1927](https://github.com/getgrav/grav-plugin-admin/issues/1927) + * Fixed broken link colors in `preset.css` which was causing issues with tabs and dropdowns + * Fixed permissions for page related tasks and actions + * Fixed permission check for configuration save [#2130](https://github.com/getgrav/grav-plugin-admin/issues/2130) + * Fixed missing/wrong page categories and tags when multi-language support is enabled [#2107](https://github.com/getgrav/grav-plugin-admin/issues/2107) + # v1.10.12 ## 04/15/2021 diff --git a/admin.php b/admin.php index e58f3a23..e2ad4332 100644 --- a/admin.php +++ b/admin.php @@ -578,13 +578,6 @@ class AdminPlugin extends Plugin $assets->setJsPipeline(false); $assets->setCssPipeline(false); - // Compile a missing preset.css file - $preset_css = 'asset://admin-preset.css'; - $preset_path = $this->grav['locator']->findResource($preset_css); - if (!$preset_path) { - $this->grav['admin-whitelabel']->compilePresetScss($this->config->get('plugins.admin.whitelabel')); - } - } /** @@ -600,6 +593,7 @@ class AdminPlugin extends Plugin $twig_paths[] = __DIR__ . '/themes/' . $this->theme . '/templates'; $this->grav['twig']->twig_paths = $twig_paths; + } /** @@ -1116,6 +1110,13 @@ class AdminPlugin extends Plugin // Initialize white label functionality $this->grav['admin-whitelabel'] = new WhiteLabel(); + // Compile a missing preset.css file + $preset_css = 'asset://admin-preset.css'; + $preset_path = $this->grav['locator']->findResource($preset_css); + if (!$preset_path) { + $this->grav['admin-whitelabel']->compilePresetScss($this->config->get('plugins.admin.whitelabel')); + } + // These events are needed for login. $this->enable([ 'onTwigExtensions' => ['onTwigExtensions', 1000], diff --git a/blueprints.yaml b/blueprints.yaml index ee46ce71..b5f63c29 100644 --- a/blueprints.yaml +++ b/blueprints.yaml @@ -1,7 +1,7 @@ name: Admin Panel slug: admin type: plugin -version: 1.10.12 +version: 1.10.13 description: Adds an advanced administration panel to manage your site icon: empire author: @@ -513,6 +513,11 @@ form: default: '#d1dee7' help: PLUGIN_ADMIN.CONTENT_TABS_TEXT_HELP + whitelabel.color_scheme.colors.content-highlight: + type: colorscheme.color + default: '#ffffd7' + help: PLUGIN_ADMIN.CONTENT_HIGHLIGHT_HELP + whitelabel.color_scheme.colors.button-bg: type: colorscheme.color default: '#41bea8' diff --git a/blueprints/admin/pages/copy.yaml b/blueprints/admin/pages/copy.yaml new file mode 100644 index 00000000..fdceee35 --- /dev/null +++ b/blueprints/admin/pages/copy.yaml @@ -0,0 +1,43 @@ +rules: + slug: + pattern: '[a-zA-Zа-яA-Я0-9_\-]+' + min: 1 + max: 200 + +form: + validation: loose + fields: + + section: + type: section + title: PLUGIN_ADMIN.COPY_PAGE + + title: + type: text + label: PLUGIN_ADMIN.PAGE_TITLE + help: PLUGIN_ADMIN.PAGE_TITLE_HELP + validate: + required: true + + folder: + type: text + label: PLUGIN_ADMIN.FOLDER_NAME + help: PLUGIN_ADMIN.FOLDER_NAME_HELP + validate: + rule: slug + required: true + + header.published: + id: move-header-published + type: toggle + label: PLUGIN_ADMIN.PUBLISHED + help: PLUGIN_ADMIN.PUBLISHED_HELP + highlight: '' + default: '' + size: medium + options: + '': PLUGIN_ADMIN.AUTO + 1: PLUGIN_ADMIN.YES + 0: PLUGIN_ADMIN.NO + validate: + type: bool diff --git a/blueprints/admin/pages/new.yaml b/blueprints/admin/pages/new.yaml index d62c6aed..3101983d 100644 --- a/blueprints/admin/pages/new.yaml +++ b/blueprints/admin/pages/new.yaml @@ -51,7 +51,7 @@ form: highlight: '' default: '' options: - '': Auto + '': PLUGIN_ADMIN.AUTO 1: PLUGIN_ADMIN.YES 0: PLUGIN_ADMIN.NO validate: diff --git a/classes/plugin/AdminBaseController.php b/classes/plugin/AdminBaseController.php index acf54555..d2f2935b 100644 --- a/classes/plugin/AdminBaseController.php +++ b/classes/plugin/AdminBaseController.php @@ -528,14 +528,9 @@ class AdminBaseController $permissions = ['admin.super']; switch ($type) { - case 'configuration': case 'config': - case 'system': - $permissions[] = 'admin.configuration.system'; - break; - case 'settings': - case 'site': - $permissions[] = 'admin.configuration.site'; + $type = $this->route ?: 'system'; + $permissions[] = 'admin.configuration.' . $type; break; case 'plugins': $permissions[] = 'admin.plugins'; diff --git a/classes/plugin/AdminController.php b/classes/plugin/AdminController.php index c689c4cb..04413ba8 100644 --- a/classes/plugin/AdminController.php +++ b/classes/plugin/AdminController.php @@ -1271,7 +1271,7 @@ class AdminController extends AdminBaseController return false; } - if (!$this->authorizeTask('new folder', ['admin.pages', 'admin.super'])) { + if (!$this->authorizeTask('new folder', ['admin.pages', 'admin.pages.create', 'admin.super'])) { return false; } @@ -1465,7 +1465,7 @@ class AdminController extends AdminBaseController return false; } - if (!$this->authorizeTask('copy page', ['admin.pages', 'admin.super'])) { + if (!$this->authorizeTask('copy page', ['admin.pages', 'admin.pages.create', 'admin.super'])) { return false; } @@ -1554,7 +1554,7 @@ class AdminController extends AdminBaseController return false; } - if (!$this->authorizeTask('reorder pages', ['admin.pages', 'admin.super'])) { + if (!$this->authorizeTask('reorder pages', ['admin.pages', 'admin.pages.update', 'admin.super'])) { return false; } @@ -1579,7 +1579,7 @@ class AdminController extends AdminBaseController return false; } - if (!$this->authorizeTask('delete page', ['admin.pages', 'admin.super'])) { + if (!$this->authorizeTask('delete page', ['admin.pages', 'admin.pages.delete', 'admin.super'])) { return false; } @@ -1625,7 +1625,7 @@ class AdminController extends AdminBaseController return false; } - if (!$this->authorizeTask('switch language', ['admin.pages', 'admin.super'])) { + if (!$this->authorizeTask('switch language', ['admin.pages', 'admin.pages.list', 'admin.super'])) { return false; } @@ -1666,7 +1666,7 @@ class AdminController extends AdminBaseController return false; } - if (!$this->authorizeTask('save as', ['admin.pages', 'admin.super'])) { + if (!$this->authorizeTask('save as', ['admin.pages', 'admin.pages.create', 'admin.super'])) { return false; } @@ -1831,7 +1831,7 @@ class AdminController extends AdminBaseController return false; } - if (!$this->authorizeTask('get childtypes', ['admin.pages', 'admin.super'])) { + if (!$this->authorizeTask('get childtypes', ['admin.pages', 'admin.pages.list', 'admin.super'])) { $this->admin->json_response = [ 'status' => 'error', 'message' => $this->admin::translate('PLUGIN_ADMIN.INSUFFICIENT_PERMISSIONS_FOR_TASK') @@ -1885,7 +1885,7 @@ class AdminController extends AdminBaseController return false; } - if (!$this->authorizeTask('filter pages', ['admin.pages', 'admin.super'])) { + if (!$this->authorizeTask('filter pages', ['admin.pages', 'admin.pages.list', 'admin.super'])) { $this->admin->json_response = [ 'status' => 'error', 'message' => $this->admin::translate('PLUGIN_ADMIN.INSUFFICIENT_PERMISSIONS_FOR_TASK') @@ -2020,7 +2020,7 @@ class AdminController extends AdminBaseController */ protected function taskProcessMarkdown() { - if (!$this->authorizeTask('process markdown', ['admin.pages', 'admin.super'])) { + if (!$this->authorizeTask('process markdown', ['admin.pages', 'admin.pages.read', 'admin.super'])) { $this->admin->json_response = [ 'status' => 'error', 'message' => $this->admin::translate('PLUGIN_ADMIN.INSUFFICIENT_PERMISSIONS_FOR_TASK') @@ -2080,7 +2080,7 @@ class AdminController extends AdminBaseController return false; } - if (!$this->authorizeTask('list media', ['admin.pages', 'admin.super'])) { + if (!$this->authorizeTask('list media', ['admin.pages', 'admin.pages.read', 'admin.super'])) { $this->admin->json_response = [ 'status' => 'error', 'message' => $this->admin::translate('PLUGIN_ADMIN.INSUFFICIENT_PERMISSIONS_FOR_TASK') @@ -2142,7 +2142,7 @@ class AdminController extends AdminBaseController return false; } - if (!$this->authorizeTask('add media', ['admin.pages', 'admin.super'])) { + if (!$this->authorizeTask('add media', ['admin.pages', 'admin.pages.update', 'admin.super'])) { $this->admin->json_response = [ 'status' => 'error', 'message' => $this->admin::translate('PLUGIN_ADMIN.INSUFFICIENT_PERMISSIONS_FOR_TASK') @@ -2392,7 +2392,7 @@ class AdminController extends AdminBaseController return false; } - if (!$this->authorizeTask('delete media', ['admin.pages', 'admin.super'])) { + if (!$this->authorizeTask('delete media', ['admin.pages', 'admin.pages.update', 'admin.super'])) { $this->admin->json_response = [ 'status' => 'error', 'message' => $this->admin::translate('PLUGIN_ADMIN.INSUFFICIENT_PERMISSIONS_FOR_TASK') @@ -2979,7 +2979,7 @@ class AdminController extends AdminBaseController */ protected function taskConvertUrls() { - if (!$this->authorizeTask('access page', ['admin.pages', 'admin.super'])) { + if (!$this->authorizeTask('access page', ['admin.pages', 'admin.pages.list', 'admin.super'])) { $this->admin->json_response = [ 'status' => 'error', 'message' => $this->admin::translate('PLUGIN_ADMIN.INSUFFICIENT_PERMISSIONS_FOR_TASK') diff --git a/languages/cs.yaml b/languages/cs.yaml index 8246f8b1..ab878282 100644 --- a/languages/cs.yaml +++ b/languages/cs.yaml @@ -1097,7 +1097,7 @@ PLUGIN_ADMIN: REDIRECT_OPTION_301: "301 - Přesunuto trvale" REDIRECT_OPTION_302: "302 - Přesunuto dočasně" REDIRECT_OPTION_303: "303 - Viz ostatní" - IMAGES_CLS_TITLE: "Cumulative Layout Shift (CLS)" + IMAGES_CLS_TITLE: "Kumulativní posun rozložení (CLS)" IMAGES_CLS_AUTO_SIZES: "Povolit automatické velikosti" IMAGES_CLS_AUTO_SIZES_HELP: "Automaticky přidat atributy \"šířka\" a \"výška\" k obrázkům do CLS adresy" IMAGES_CLS_ASPECT_RATIO: "Povolit poměr stran" diff --git a/languages/en.yaml b/languages/en.yaml index 155c8010..e16c156d 100644 --- a/languages/en.yaml +++ b/languages/en.yaml @@ -548,6 +548,7 @@ PLUGIN_ADMIN: REVERSE_PROXY_HELP: "Enable this if you are behind a reverse proxy and you are having trouble with URLs containing incorrect ports" INVALID_FRONTMATTER_COULD_NOT_SAVE: "Invalid frontmatter, could not save" ADD_FOLDER: "Add Folder" + COPY_PAGE: "Copy Page" PROXY_URL: "Proxy URL" PROXY_URL_HELP: "Enter the proxy HOST or IP and PORT" NOTHING_TO_SAVE: "Nothing to Save" @@ -1044,6 +1045,7 @@ PLUGIN_ADMIN: CONTENT_HEADER_HELP: "Content header" CONTENT_TABS_BG_HELP: "Content tabs bg" CONTENT_TABS_TEXT_HELP: "Content tabs text" + CONTENT_HIGHLIGHT_HELP: "Content highlight" BUTTON_BG_HELP: "Button bg" BUTTON_TEXT_HELP: "Button text" NOTICE_BG_HELP: "Notice bg" @@ -1099,10 +1101,11 @@ PLUGIN_ADMIN: REDIRECT_OPTION_301: "301 - Moved permanently" REDIRECT_OPTION_302: "302 - Moved temporarily" REDIRECT_OPTION_303: "303 - See Other" - IMAGES_CLS_TITLE: "Cumative Layer Shift (CLS)" + IMAGES_CLS_TITLE: "Cumulative Layout Shift (CLS)" IMAGES_CLS_AUTO_SIZES: "Enable Auto Sizes" IMAGES_CLS_AUTO_SIZES_HELP: "Automatically add 'width' and 'height' attributes to images to address CLS" IMAGES_CLS_ASPECT_RATIO: "Enable Aspect Ratio" IMAGES_CLS_ASPECT_RATIO_HELP: "Optional CSS variable that gets applied via a 'style' attribute which can be used in CSS for custom styling" IMAGES_CLS_RETINA_SCALE: "Retina Scale Factor" - IMAGES_CLS_RETINA_SCALE_HELP: "Will take the calculated size and divide by scale factor to display a higher resolution image at a smaller pixel size for better handling of HiDPI resolutions" \ No newline at end of file + IMAGES_CLS_RETINA_SCALE_HELP: "Will take the calculated size and divide by scale factor to display a higher resolution image at a smaller pixel size for better handling of HiDPI resolutions" + AUTOREGENERATE_FOLDER_SLUG: "Auto-regenerate based on page title" diff --git a/languages/gl.yaml b/languages/gl.yaml index 69fa6d0e..912ba5c6 100644 --- a/languages/gl.yaml +++ b/languages/gl.yaml @@ -1,5 +1,6 @@ --- PLUGIN_ADMIN: + ADMIN_NOSCRIPT_MSG: "Porfavor habilite JavaScript no seu navegador." ADMIN_BETA_MSG: "Esta é unha versión beta! Utilícea en produción asumindo o risco..." ADMIN_REPORT_ISSUE: "Atopou unha incidencia? Informe dela en GitHub" EMAIL_FOOTER: "Xerado con Grav - O CMS moderno sobre ficheiro plano" @@ -46,11 +47,13 @@ PLUGIN_ADMIN: CLOSE: "Pechar" CANCEL: "Anular" CONTINUE: "Continuar" + CONFIRM: "Confirmar" MODAL_DELETE_PAGE_CONFIRMATION_REQUIRED_TITLE: "Requírese confirmación" MODAL_CHANGED_DETECTED_TITLE: "Cambios detectados" MODAL_CHANGED_DETECTED_DESC: "Ten cambios sen gardar. Confirma que quere deixar sen gardar?" MODAL_DELETE_FILE_CONFIRMATION_REQUIRED_TITLE: "Confirmación requirida" MODAL_DELETE_FILE_CONFIRMATION_REQUIRED_DESC: "Confirma que quere eliminar este ficheiro? Esta acción non se pode desfacer." + MODAL_UPDATE_GRAV_CONFIRMATION_REQUIRED_DESC: "Está a piques de actualizar Grav á última versión dispoñible. Quere continuar?" ADD_FILTERS: "Engadir filtros" SEARCH_PAGES: "Buscar páxinas" VERSION: "Versión" @@ -68,6 +71,7 @@ PLUGIN_ADMIN: LICENSE: "Licenza" DESCRIPTION: "Descrición" README: "Léame" + DOCS: "Documentos" REMOVE_THEME: "Retirar tema" INSTALL_THEME: "Instalar tema" THEME: "Tema" @@ -105,6 +109,7 @@ PLUGIN_ADMIN: BACKUP_NOT_FOUND: "Non se atopou a copia de seguranza" BACKUP_DATE: "Data da copia" STATISTICS: "Estatísticas" + VIEWS_STATISTICS: "Estatísticas de Visualización de Páxina" TODAY: "Hoxe" WEEK: "Semana" MONTH: "Mes" @@ -332,6 +337,7 @@ PLUGIN_ADMIN: LANGUAGES: "Idiomas" SUPPORTED: "Compatíbel" SUPPORTED_HELP: "Lista de códigos de idioma en dúas letras separada por comas (por exemplo 'en,fr,gl'" + SUPPORTED_PLACEHOLDER: "p.ex. pt, gl" TRANSLATIONS_FALLBACK: "Desfacer traducións" TRANSLATIONS_FALLBACK_HELP: "Retroceder ata as traducións permitidas se o idioma activo non existe" ACTIVE_LANGUAGE_IN_SESSION: "Idioma activo na sesión" @@ -341,6 +347,7 @@ PLUGIN_ADMIN: EXPIRES_HELP: "Determinar a cabeceira de expiración. O valor dáse en segundos" CACHE_CONTROL: "Control de caché HTTP" CACHE_CONTROL_HELP: "Determinar un valor de control de caché válido como 'no-cache, no-store, must-revalidate'" + CACHE_CONTROL_PLACEHOLDER: "p.ex. public, max-age=31536000" LAST_MODIFIED: "Última modificación" LAST_MODIFIED_HELP: "Determinar a cabeceira de última modificación pode axudar a optimizar o cacheo no servidor proxy e no navegador" ETAG: "ETag" @@ -409,6 +416,8 @@ PLUGIN_ADMIN: JAVASCRIPT_MINIFY_HELP: "Minimizar o JS durante o entubado" ENABLED_TIMESTAMPS_ON_ASSETS: "Activar o selo de tempo nos recursos" ENABLED_TIMESTAMPS_ON_ASSETS_HELP: "Activar selo de tempo de recurso" + ENABLED_SRI_ON_ASSETS: "Activar SRI nos recursos" + ENABLED_SRI_ON_ASSETS_HELP: "Activar SRI de activos" COLLECTIONS: "Coleccións" ERROR_HANDLER: "Erro no manipulador" DISPLAY_ERRORS: "Presentar os erros" @@ -431,6 +440,8 @@ PLUGIN_ADMIN: CACHE_ALL_HELP: "Executar todas as imaxes por medio do sistema de caché do Grav mesmo se non foron manipuladas" IMAGES_DEBUG: "Marca de auga na imaxe depurada" IMAGES_DEBUG_HELP: "Amosar unha capa superposta en imaxes para indicar a profundidade de píxels da imaxe cando se traballa con retina, por exemplo" + IMAGES_LOADING: "Comportamento de Carga de Imaxes" + IMAGES_LOADING_HELP: "O atributo de carga permite a un navegador aprazar a carga de imaxes e iframes fóra de pantalla ata que os usuarios se desprazan preto deles. a carga admite tres valores: automático, preguiceiro, ansioso" IMAGES_SEOFRIENDLY: "Nomes de imaxe amigábeis co SEO" IMAGES_SEOFRIENDLY_HELP: "Ao estar activado, o nome da imaxe desprégase primeiro, logo unha pequena sinatura electrónica para reflectir as operacións procesadas" UPLOAD_LIMIT: "Límite de carga de ficheiro" @@ -491,6 +502,8 @@ PLUGIN_ADMIN: PLUGIN_STATUS: "Status do complemento" INCLUDE_DEFAULT_LANG: "Incluír idioma predeterminado" INCLUDE_DEFAULT_LANG_HELP: "Isto precederá todos os URL no idioma predeterminado co idioma predeterminado, i.e. '/en/blog/publicacion'" + INCLUDE_DEFAULT_LANG_FILE_EXTENSION: "Incluír o idioma predeterminado na extensión de ficheiro" + INCLUDE_DEFAULT_LANG_HELP_FILE_EXTENSION: "Se está activado, o idioma predeterminado será anterior á extensión do ficheiro (e.x. `.gl.md`). Desactívao para manter o idioma predeterminado usando a extensión de ficheiro `.md`." PAGES_FALLBACK_ONLY: "Soamente as páxinas inversas" PAGES_FALLBACK_ONLY_HELP: "Soamente 'inversa' para atopar o contido da páxina nos idiomas dispoñíbeis, o comportamento predeterminado é presentar calquera idioma se o idioma activo falta" ALLOW_URL_TAXONOMY_FILTERS: "Filtros da taxonomía de URL" @@ -579,6 +592,7 @@ PLUGIN_ADMIN: FRONTMATTER_PROCESS_TWIG_HELP: "Ao activalo, pode utilizar as variábeis de configuración do Twig na páxina de texto preliminar" FRONTMATTER_IGNORE_FIELDS: "Ignorar os campos de texto preliminar" FRONTMATTER_IGNORE_FIELDS_HELP: "Certos campos de texto preliminar poden conter Twig pero non deberían ser procesados, tales como 'formularios'" + FRONTMATTER_IGNORE_FIELDS_PLACEHOLDER: "p.ex. formularios" PACKAGE_X_INSTALLED_SUCCESSFULLY: "O paquete %s instalouse correctamente" ORDERING_DISABLED_BECAUSE_PARENT_SETTING_ORDER: "A orde de configuración vén da superior, a ordenación está desactivada" ORDERING_DISABLED_BECAUSE_PAGE_NOT_VISIBLE: "A páxina non é visíbel, a ordenación está desactivada" @@ -628,6 +642,8 @@ PLUGIN_ADMIN: REDIS_PORT: "Porto de Redis" REDIS_PORT_HELP: "O porto do servidor Redis" REDIS_PASSWORD: "Contrasinal/secreto de Redis" + REDIS_DATABASE: "ID de Base de Datos Redis" + REDIS_DATABASE_HELP: "O ID da Base de Datos de Instancias de Redis" ALL: "Todos" FROM: "desde" TO: "ata" @@ -638,6 +654,8 @@ PLUGIN_ADMIN: FORCE_SSL_HELP: "Forzar globalmente SSL, se está activado cando se accede a través de HTTP, o Grav devolver unha redirección á páxina HTTPS" NEWS_FEED: "Canle de novas" EXTERNAL_URL: "URL externo" + SESSION_SAMESITE: "O atributo SameSite da sesión" + SESSION_SAMESITE_HELP: "Lax|Strict|None. Vexa https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite para máis información" CUSTOM_BASE_URL: "URL de base personalizado" CUSTOM_BASE_URL_HELP: "Utilíceo se quere reescribir o dominio do sitio ou utilizar un subcartafol diferente ao utilizado polo Grav. Exemplo: http://localhost" FILEUPLOAD_PREVENT_SELF: 'Non se pode utilizar "%s" fóra das páxinas' @@ -744,8 +762,11 @@ PLUGIN_ADMIN: SCHEDULER: "Programador" SCHEDULER_INSTALL_INSTRUCTIONS: "Instalar instrucións" SCHEDULER_INSTALLED_READY: "Instalado e listo" + SCHEDULER_CRON_NA: "Cron Non Dispoñible para o usuario: %s" + SCHEDULER_NOT_ENABLED: "Non habilitado para o usuario: %s" SCHEDULER_SETUP: "Configuración do programador" SCHEDULER_INSTRUCTIONS: "O Programador do Grav permite crear e programar tarefas personalizadas. Tamén fornece un método para os complementos do Grav que integra programaticamente e dinamicamente engadir tarefas que se executarán periodicamente." + SCHEDULER_POST_INSTRUCTIONS: "Para habilitar a funcionalidade do programador, debes engadir o Grav Scheduler ao ficheiro crontab do teu sistema para o usuario %s. Executa o comando anterior desde o terminal para engadilo automaticamente. Unha vez gardada, actualiza esta páxina para ver o estado." SCHEDULER_JOBS: "Tarefas do programador pesonalizadas" SCHEDULER_STATUS: "Status do programador" SCHEDULER_RUNAT: "Executar en" @@ -756,6 +777,7 @@ PLUGIN_ADMIN: SCHEDULER_OUTPUT_TYPE_HELP: "Ben engade o mesmo ficheiro en cada execución ou sobrescribe o ficheiro con cada execución" SCHEDULER_EMAIL: "Correo" SCHEDULER_EMAIL_HELP: "Correo ao que enviar a saída. NOTA: require que se defina o ficheiro de saída" + SCHEDULER_WARNING: "O planificador usa o sistema crontab do seu sistema para executar comandos. Debería empregalo só se é un usuario avanzado e sabe o que está a facer. A mala configuración ou o abuso poden provocar vulnerabilidades na seguridade." SECURITY: "Seguranza" XSS_SECURITY: "XSS Seguranza por contido" XSS_WHITELIST_PERMISSIONS: "Permisos da lista branca" @@ -793,6 +815,45 @@ PLUGIN_ADMIN: BACKUPS_PROFILE_SCHEDULE_AT: "Executar a tarefa programada" COMMAND: "Orde" EXTRA_ARGUMENTS: "Argumentos extra" + DEFAULT_LANG: "Anular o idioma predeterminado" + DEFAULT_LANG_HELP: "O predeterminado é o primeiro idioma compatible. Isto pódese anular configurando esta opción, pero debe ser un dos idiomas compatibles" + DEBUGGER_PROVIDER: "Provedor de depurador" + DEBUGGER_PROVIDER_HELP: "Por defecto é a barra de depuración de PHP, pero a extensión do navegador Clockwork proporciona un enfoque menos intrusivo" + DEBUGGER_DEBUGBAR: "Barra de depuración de PHP" + DEBUGGER_CLOCKWORK: "Extensión do navegador Clockwork" + PAGE_ROUTE_NOT_FOUND: "Non se atopou a ruta da páxina" + PAGE_ROUTE_FOUND: "Ruta da páxina atopada" + NO_ROUTE_PROVIDED: "Non se proporcionou ningunha ruta" + CONTENT_LANGUAGE_FALLBACKS: "Idioma alternativo do contido" + CONTENT_LANGUAGE_FALLBACKS_HELP: "De xeito predeterminado, se o contido non está traducido, Grav amosará o contido no idioma predeterminado. Use esta configuración para anular ese comportamento por idioma." + CONTENT_LANGUAGE_FALLBACK: "Idiomas alternativos" + CONTENT_LANGUAGE_FALLBACK_HELP: "Insira unha lista de códigos de idioma. Teña en conta que se omite o código de idioma predeterminado, non se usará." + CONTENT_FALLBACK_LANGUAGE_HELP: "Especifique o código de idioma que desexa personalizar." + EXPERIMENTAL: "Experimental" + PAGES_TYPE: "Tipo de páxina Frontend" + PAGES_TYPE_HELP: "Esta opción habilita as páxinas Flex Object no front-end. As páxinas Flex de administración requiren un complemento Flex Objects" + ACCOUNTS_TYPE: "Tipo de contas" + REGULAR: "Regular" + FILE: "Arquivo" + SANITIZE_SVG: "Sanear SVG" + SANITIZE_SVG_HELP: "Elimina calquera código XSS do SVG" + ACCOUNTS: "Contas" + USER_ACCOUNTS: "Contas de Usuario" + USER_GROUPS: "Grupos de usuarios" + GROUP_NAME: "Nome do grupo" + DISPLAY_NAME: "Nome de Visualización" + ICON: "Ícona" + ACCESS: "Acceso" + NO_ACCESS: "Sen Acceso" + SUPER_USER: "Super Usuario" + ALLOWED: "Permitido" + DENIED: "Denegado" + MODULE: "Módulo" + NON_MODULE: "Non Módulo" + ADD_MODULE: "Engadir Módulo" + ACCESS_SITE: "Sitio Web" + ACCESS_SITE_LOGIN: "Ingresar no Sitio" + ACCESS_ADMIN: "Administrador" CONFIGURATION: "Configuración" ADMIN_CACHING: "Activar o cacheo da administración" ADMIN_CACHING_HELP: "O cacheo da administración pode controlarse independentemente respecto do front-end" @@ -803,3 +864,4 @@ PLUGIN_ADMIN: DASHBOARD: "Panel de control" NOTIFICATIONS: "Notificacións" PAGEMEDIA_RESIZER: "> A seguinte configuración aplícase ás imaxes cargadas a través da páxina de medios. Redimensionar largo / alto reducirá automaticamente proporcionalmente unha imaxe a nivel máis baixo se excede os límites definidos na configuración. Os valores de resolución mínima e máxima define os límites das imaxes cargadas. Defínase os campos como 0 para evitar calquera manipulación." + IMAGES_CLS_AUTO_SIZES: "Habilitar Tamaños Automáticos" diff --git a/languages/nl.yaml b/languages/nl.yaml index 0d371cc3..49b2c802 100644 --- a/languages/nl.yaml +++ b/languages/nl.yaml @@ -46,11 +46,13 @@ PLUGIN_ADMIN: CLOSE: "Sluiten" CANCEL: "Annuleer" CONTINUE: "Verder" + CONFIRM: "Bevestig" MODAL_DELETE_PAGE_CONFIRMATION_REQUIRED_TITLE: "Bevestiging vereist" MODAL_CHANGED_DETECTED_TITLE: "Wijzigingen gedetecteerd" MODAL_CHANGED_DETECTED_DESC: "Je hebt niet bewaarde wijzigingen. Wil je doorgaan zonder ze te op te slaan?" MODAL_DELETE_FILE_CONFIRMATION_REQUIRED_TITLE: "Bevestiging vereist" MODAL_DELETE_FILE_CONFIRMATION_REQUIRED_DESC: "Weet je zeker dat je dit bestand wilt verwijderen? Dit kan niet ongedaan worden gemaakt." + MODAL_UPDATE_GRAV_CONFIRMATION_REQUIRED_DESC: "U staat op het punt Grav te upgraden naar de nieuwste versie die beschikbaar is. Wilt u doorgaan?" ADD_FILTERS: "Filters toevoegen" SEARCH_PAGES: "Pagina's zoeken" VERSION: "Versie" @@ -68,6 +70,7 @@ PLUGIN_ADMIN: LICENSE: "Licentie" DESCRIPTION: "Omschrijving" README: "Leesmij" + DOCS: "Documentatie" REMOVE_THEME: "Verwijder Thema" INSTALL_THEME: "Installeer Thema" THEME: "Thema" @@ -332,6 +335,7 @@ PLUGIN_ADMIN: LANGUAGES: "Talen" SUPPORTED: "Ondersteund" SUPPORTED_HELP: "Door komma's gescheiden lijst van tweeletterige taalcodes (bijvoorbeeld 'en,fr,de')" + SUPPORTED_PLACEHOLDER: "bijv. en, fr" TRANSLATIONS_FALLBACK: "Noodoplossing vertalingen" TRANSLATIONS_FALLBACK_HELP: "Terugvallen op ondersteunde vertaling als de actieve taal niet bestaat" ACTIVE_LANGUAGE_IN_SESSION: "Actieve taal in sessie" @@ -431,6 +435,7 @@ PLUGIN_ADMIN: CACHE_ALL_HELP: "Verwerk alle afbeeldingen met het Grav cache systeem, zelfs als er geen aanpassingen aan gebeurd zijn" IMAGES_DEBUG: "Debug watermerk op afbeelding" IMAGES_DEBUG_HELP: "Bedek de afbeeldingen met een laag die de pixel diepte van de afbeelding weergeeft wanneer er met bijvoorbeeld retina gewerkt wordt" + IMAGES_LOADING: "Gedrag laden van afbeeldingen" IMAGES_SEOFRIENDLY: "SEO-Friendly Afbeeldingnamen" IMAGES_SEOFRIENDLY_HELP: "Wanneer ingeschakeld, wordt de afbeeldingsnaam eerst weergegeven, dan een kleinere hash om de verwerkte bewerkingen weer te geven" UPLOAD_LIMIT: "Bestand upload limiet" @@ -491,6 +496,8 @@ PLUGIN_ADMIN: PLUGIN_STATUS: "Plugin status" INCLUDE_DEFAULT_LANG: "Standaardtaal meerekenen" INCLUDE_DEFAULT_LANG_HELP: "Dit zal aan alle URLs in de standaardtaal, de standaardtaal toevoegen. bvb. 'nl/blog/mijn-artikel'" + INCLUDE_DEFAULT_LANG_FILE_EXTENSION: "Standaard taal opnemen in de bestandsextensie" + INCLUDE_DEFAULT_LANG_HELP_FILE_EXTENSION: "Indien ingeschakeld, zal het de standaard taal aan de bestandsextensie toevoegen (bijv. `.en.md`). Schakel deze uit om de standaardtaal te behouden met `.md` bestandsextensie." PAGES_FALLBACK_ONLY: "Alleen pagina fallback" PAGES_FALLBACK_ONLY_HELP: "Alleen 'fallback' om pagina-inhoud te vinden in ondersteunde talen, de standaardinstelling is om elke taal weer te geven die gevonden wordt als de actieve taal ontbreekt" ALLOW_URL_TAXONOMY_FILTERS: "URL taxonomie filters" @@ -579,6 +586,7 @@ PLUGIN_ADMIN: FRONTMATTER_PROCESS_TWIG_HELP: "Wanneer ingeschakeld, kunt u Twig config variabelen gebruiken in Frontmatter op de pagina" FRONTMATTER_IGNORE_FIELDS: "Negeer Frontmatter velden" FRONTMATTER_IGNORE_FIELDS_HELP: "Bepaalde Frontmatter velden kunnen Twig bevatten maar moeten niet verwerkt worden, zoals 'forms'" + FRONTMATTER_IGNORE_FIELDS_PLACEHOLDER: "bijv. formulieren" PACKAGE_X_INSTALLED_SUCCESSFULLY: "Pakket %s succesvol geïnstalleerd" ORDERING_DISABLED_BECAUSE_PARENT_SETTING_ORDER: "Volgorde bepaald door bovenliggende pagina, volgorde uitgeschakeld" ORDERING_DISABLED_BECAUSE_PAGE_NOT_VISIBLE: "Pagina is niet zichtbaar, sorteren gedeactiveerd" @@ -744,6 +752,8 @@ PLUGIN_ADMIN: SCHEDULER: "Taakplanner" SCHEDULER_INSTALL_INSTRUCTIONS: "Installeerinstructies" SCHEDULER_INSTALLED_READY: "Geïnstalleerd en klaar" + SCHEDULER_CRON_NA: "Cron niet beschikbaar voor gebruiker: %s" + SCHEDULER_NOT_ENABLED: "Niet geactiveerd voor gebruiker: %s" SCHEDULER_SETUP: "Taakplanner Setup" SCHEDULER_INSTRUCTIONS: "Met de Grav Scheduler kunt u aangepaste taken maken en inplannen. Het biedt ook een methode voor Grav plugins om programmatisch en dynamisch toe te voegen aan taken die periodiek uitgevoerd moeten worden." SCHEDULER_JOBS: "Custom plannertaken" @@ -793,6 +803,44 @@ PLUGIN_ADMIN: BACKUPS_PROFILE_SCHEDULE_AT: "Voer geplande taak uit" COMMAND: "Opdracht" EXTRA_ARGUMENTS: "Extra argumenten" + DEFAULT_LANG: "Standaardtaal veranderen" + PAGE_ROUTE_NOT_FOUND: "Pagina niet gevonden" + PAGE_ROUTE_FOUND: "Pagina gevonden" + NO_ROUTE_PROVIDED: "Geen route opgegeven." + CONTENT_LANGUAGE_FALLBACK: "Terugvallen op talen" + EXPERIMENTAL: "Experimenteel" + ACCOUNTS_TYPE: "Account Type" + ACCOUNTS_STORAGE: "Account opslag" + REGULAR: "Standaard" + FILE: "Bestand" + SANITIZE_SVG_HELP: "Verwijdert elke XSS code van SVG" + ACCOUNTS: "Accounts" + USER_ACCOUNTS: "Gebruikersaccounts" + PAGE_AUTHORS: "Pagina auteurs" + PAGE_GROUPS: "Pagina groepen" + READ: "Lezen" + PUBLISH: "Publiceren" + ACCESS_SITE: "Website" + ACCESS_SITE_LOGIN: "Inloggen" + ACCESS_ADMIN: "Beheer" + ACCESS_ADMIN_LOGIN: "Inloggen op Admin" + ACCESS_ADMIN_SUPER: "Super user" + ACCESS_ADMIN_CACHE: "Cache legen" + ACCESS_ADMIN_CONFIGURATION: "Instellingen" + ACCESS_ADMIN_CONFIGURATION_SYSTEM: "Systeemconfiguratie beheren" + ACCESS_ADMIN_CONFIGURATION_SITE: "Siteconfiguratie beheren" + ACCESS_ADMIN_CONFIGURATION_MEDIA: "Mediaconfiguratie beheren" + ACCESS_ADMIN_CONFIGURATION_INFO: "Server Informatie bekijken" + ACCESS_ADMIN_SETTINGS: "Instellingen" + ACCESS_ADMIN_PAGES: "Beheer pagina's" + ACCESS_ADMIN_MAINTENANCE: "Onderhoud website" + ACCESS_ADMIN_STATISTICS: "Website statistieken" + ACCESS_ADMIN_PLUGINS: "Plugins beheren" + ACCESS_ADMIN_THEMES: "Thema's beheren" + ACCESS_ADMIN_TOOLS: "Toegang tot tools" + ACCESS_ADMIN_USERS: "Beheer gebruikers" + USERS: "Gebruikers" + ACL: "Toegangsbeheer" CONFIGURATION: "Instellingen" ADMIN_CACHING: "Admin Caching inschakelen" ADMIN_CACHING_HELP: "Caching van de admin kan onafhankelijk van de front-end site beheerd worden" diff --git a/presets.yaml b/presets.yaml index 5887e045..af7d95ee 100644 --- a/presets.yaml +++ b/presets.yaml @@ -26,6 +26,7 @@ default: content-header: '#414147' content-tabs-bg: '#e6e6e6' content-tabs-text: '#808080' + content-highlight: '#ffffd7' button-bg: '#0090D9' button-text: '#ffffff' notice-bg: '#06A599' @@ -62,6 +63,7 @@ original: content-header: '#314d5b' content-tabs-bg: '#D4D4D4' content-tabs-text: '#737c81' + content-highlight: '#ffffd7' button-bg: '#41bea8' button-text: '#ffffff' notice-bg: '#00a6cf' @@ -98,6 +100,7 @@ modern: content-header: '#636468' content-tabs-bg: '#f0f0f0' content-tabs-text: '#929699' + content-highlight: '#ffffd7' button-bg: '#3EA7E6' button-text: '#ffffff' notice-bg: '#3EA7E6' @@ -134,6 +137,7 @@ modern-dark: content-header: '#b4bed6' content-tabs-bg: '#4a5873' content-tabs-text: '#d1ddf0' + content-highlight: '#ffffd7' button-bg: '#3EA7E6' button-text: '#ffffff' notice-bg: '#3EA7E6' @@ -170,6 +174,7 @@ modern-lite: content-header: '#636468' content-tabs-bg: '#f0f0f0' content-tabs-text: '#929699' + content-highlight: '#ffffd7' button-bg: '#3EA7E6' button-text: '#ffffff' notice-bg: '#f24d77' @@ -206,6 +211,7 @@ one-dark: content-header: '#727C8C' content-tabs-bg: '#25272E' content-tabs-text: '#9ea5b3' + content-highlight: '#ffffd7' button-bg: '#383F4C' button-text: '#d8dadf' notice-bg: '#18a4ba' @@ -238,6 +244,7 @@ firewatch-light: content-header: '#635e53' content-tabs-bg: '#D6D3CC' content-tabs-text: '#6f6a5e' + content-highlight: '#ffffd7' button-bg: '#075289' button-text: '#faf8f5' notice-bg: '#718ECD' @@ -278,6 +285,7 @@ remedy: content-header: '#F9E7C4' content-tabs-bg: '#272625' content-tabs-text: '#938977' + content-highlight: '#ffffd7' button-bg: '#5a7185' button-text: '#f9e7c4' notice-bg: '#5a7185' @@ -314,6 +322,7 @@ ocean: content-header: '#636468' content-tabs-bg: '#eef6ff' content-tabs-text: '#41627a' + content-highlight: '#ffffd7' button-bg: '#027FD4' button-text: '#ffffff' notice-bg: '#8e5b8f' @@ -350,6 +359,7 @@ cobalt2: content-header: '#ffc600' content-tabs-bg: '#173043' content-tabs-text: '#acb8c5' + content-highlight: '#ffffd7' button-bg: '#0476e0' button-text: '#ffffff' notice-bg: '#0476e0' diff --git a/themes/grav/app/forms/fields/folder.js b/themes/grav/app/forms/fields/folder.js new file mode 100644 index 00000000..df9edc80 --- /dev/null +++ b/themes/grav/app/forms/fields/folder.js @@ -0,0 +1,20 @@ +import $ from 'jquery'; + +const Regenerate = (field = '[name="data[folder]"]') => { + const element = $(field); + const title = $('[name="data[header][title]"]'); + const slug = $.slugify(title.val(), {custom: {"'": ''}}); + + element.addClass('highlight').val(slug); + + setTimeout(() => element.removeClass('highlight'), 500); +}; + +$(document).on('click', '[data-regenerate]', (event) => { + const target = $(event.currentTarget); + const field = $(target.data('regenerate')); + + Regenerate(field); +}); + +export default Regenerate; diff --git a/themes/grav/app/forms/fields/index.js b/themes/grav/app/forms/fields/index.js index 54df3403..06c1fa15 100644 --- a/themes/grav/app/forms/fields/index.js +++ b/themes/grav/app/forms/fields/index.js @@ -6,6 +6,7 @@ import DateTimeField, { Instance as DateTimeFieldInstance } from './datetime'; import EditorField, { Instance as EditorFieldInstance } from './editor'; import ColorpickerField, { Instance as ColorpickerFieldInstance } from './colorpicker'; import FilesField, { Instance as FilesFieldInstance } from './files'; +import FolderFieldInstance from './folder'; import SelectUniqueField, { Instance as SelectUniqueInstance } from './selectunique'; import IconpickerField, { Instance as IconpickerInstance } from './iconpicker'; import CronField, { Instance as CronFieldInstance } from './cron'; @@ -52,6 +53,9 @@ export default { FilesField, Instance: FilesFieldInstance }, + FolderField: { + Regenerate: FolderFieldInstance + }, SelectUniqueField: { SelectUniqueField, Instance: SelectUniqueInstance diff --git a/themes/grav/app/forms/state.js b/themes/grav/app/forms/state.js index 13ce8957..01d069f9 100644 --- a/themes/grav/app/forms/state.js +++ b/themes/grav/app/forms/state.js @@ -12,7 +12,7 @@ const DOMBehaviors = { }, preventUnload() { - let selector = '[name="task"][value^="save"], [data-delete-action]'; + let selector = '[name="task"][value^="save"], [data-delete-action], [data-flex-safe-action]'; if ($._data(window, 'events') && ($._data(window, 'events').beforeunload || []).filter((event) => event.namespace === '_grav').length) { return; } diff --git a/themes/grav/app/pages/page/add.js b/themes/grav/app/pages/page/add.js index af2645c5..86fcfcd8 100644 --- a/themes/grav/app/pages/page/add.js +++ b/themes/grav/app/pages/page/add.js @@ -4,8 +4,8 @@ import request from '../../utils/request'; import { config } from 'grav-config'; let custom = false; -let folder = $('[data-remodal-id="modal"] input[name="data[folder]"], [data-remodal-id="module"] input[name="data[folder]"]'); -let title = $('[data-remodal-id="modal"] input[name="data[title]"], [data-remodal-id="module"] input[name="data[title]"]'); +let folder = $('[data-remodal-id="modal"] input[name="data[folder]"], [data-remodal-id="module"] input[name="data[folder]"], [data-remodal-id="modal-page-copy"] input[name="data[folder]"]'); +let title = $('[data-remodal-id="modal"] input[name="data[title]"], [data-remodal-id="module"] input[name="data[title]"], [data-remodal-id="modal-page-copy"] input[name="data[title]"]'); let getFields = (type, target) => { target = $(target); let query = `[data-remodal-id="${target.closest('[data-remodal-id]').data('remodal-id')}"]`; diff --git a/themes/grav/app/pages/page/media.js b/themes/grav/app/pages/page/media.js index 17e46982..832b7eda 100644 --- a/themes/grav/app/pages/page/media.js +++ b/themes/grav/app/pages/page/media.js @@ -108,7 +108,9 @@ export default class PageMedia extends FilesField { onDropzoneComplete(file) { super.onDropzoneComplete(file); - this.sortable.options.onSort(); + if (this.sortable) { + this.sortable.options.onSort(); + } // accepted $('.dz-preview').prop('draggable', 'true'); @@ -116,7 +118,9 @@ export default class PageMedia extends FilesField { onDropzoneRemovedFile(file, ...extra) { super.onDropzoneRemovedFile(file, ...extra); - this.sortable.options.onSort(); + if (this.sortable) { + this.sortable.options.onSort(); + } } attachDragDrop() { diff --git a/themes/grav/css-compiled/preset.css b/themes/grav/css-compiled/preset.css index eef5dc81..fbc0eb87 100644 --- a/themes/grav/css-compiled/preset.css +++ b/themes/grav/css-compiled/preset.css @@ -292,10 +292,6 @@ tr td.gpm-details { #admin-main .admin-block { background: #ffffff; color: #6f7b8a; } - #admin-main .admin-block a:not(.button) { - color: #0090D9; } - #admin-main .admin-block a:not(.button):hover { - color: #007fc0; } #admin-main .admin-block h1 { color: #414147; border-bottom: 1px solid #f7f7f7; } @@ -438,6 +434,9 @@ form .form-input-wrapper .form-input-addon { form .form-input-wrapper .form-input-addon.copy-to-clipboard:hover { background: #007fc0; } +form .form-input-wrapper input[name="data[folder]"].highlight { + background-color: #ffffd7; } + form .selectize-control.single.plugin-remove_button .selectize-input .item, form .selectize-control.single.plugin-remove_button .selectize-input .remove-single, form .selectize-control.multi .selectize-input .item, form .selectize-control.multi .selectize-input .remove-single { diff --git a/themes/grav/css-compiled/preset.css.map b/themes/grav/css-compiled/preset.css.map index 1ea76fca..11b7ae92 100644 --- a/themes/grav/css-compiled/preset.css.map +++ b/themes/grav/css-compiled/preset.css.map @@ -14,5 +14,5 @@ "../scss/template/modules/_input-range.scss" ], "names": [], - "mappings": "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" + "mappings": "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" } \ No newline at end of file diff --git a/themes/grav/css-compiled/template.css b/themes/grav/css-compiled/template.css index 47fe3ffb..3fe1bf5b 100644 --- a/themes/grav/css-compiled/template.css +++ b/themes/grav/css-compiled/template.css @@ -961,9 +961,13 @@ form .form-input-addon-wrapper { align-items: center; } form .form-input-addon-wrapper .form-input-addon.copy-to-clipboard { cursor: pointer; } + form .form-input-addon-wrapper .form-input-addon[data-regenerate] { + cursor: pointer; } form .form-input-addon-wrapper input { height: 35px; display: table-cell; } + form .form-input-addon-wrapper input[name="data[folder]"] { + transition: background-color .5s ease; } form .form-input-addon-wrapper .form-input-prepend { border-radius: 4px 0 0 4px; border-right-width: 0 !important; } @@ -3780,6 +3784,9 @@ html.remodal-is-locked { .admin-pages .form-tabs:first-child { margin-top: -1rem; } +.admin-pages .form-tabs.side-tabs .tabs-nav { + margin-right: 0 !important; } + .admin-pages .form-tabs .tabs-nav { margin-right: 180px; } @media only all and (max-width: 47.938em) { diff --git a/themes/grav/css-compiled/template.css.map b/themes/grav/css-compiled/template.css.map index b37bc029..b80ff50c 100644 --- a/themes/grav/css-compiled/template.css.map +++ b/themes/grav/css-compiled/template.css.map @@ -125,5 +125,5 @@ "../scss/template/_custom.scss" ], "names": [], - "mappings": "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" + "mappings": "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" } \ No newline at end of file diff --git a/themes/grav/css/fork-awesome.min.css b/themes/grav/css/fork-awesome.min.css index 56c72424..82222e06 100755 --- a/themes/grav/css/fork-awesome.min.css +++ b/themes/grav/css/fork-awesome.min.css @@ -9,4 +9,4 @@ Permission is hereby granted, free of charge, to any person obtaining a copy of The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */@font-face{font-family:FontAwesome;src:url(../fonts/forkawesome-webfont.eot?v=1.1.5);src:url(../fonts/forkawesome-webfont.eot?#iefix&v=1.1.5) format('embedded-opentype'),url(../fonts/forkawesome-webfont.woff2?v=1.1.5) format('woff2'),url(../fonts/forkawesome-webfont.woff?v=1.1.5) format('woff'),url(../fonts/forkawesome-webfont.ttf?v=1.1.5) format('truetype'),url(../fonts/forkawesome-webfont.svg?v=1.1.5#forkawesomeregular) format('svg');font-weight:400;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-close:before,.fa-remove:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-repeat:before,.fa-rotate-right:before{content:"\f01e"}.fa-refresh:before,.fa-sync:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before,.fa-video:before{content:"\f03d"}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-exclamation-triangle:before,.fa-warning:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell-o:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-globe-e:before{content:"\f304"}.fa-globe-w:before{content:"\f305"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-community:before,.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-floppy-o:before,.fa-save:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus-g:before,.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-bolt:before,.fa-flash:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before,.fa-utensils:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-chain-broken:before,.fa-unlink:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"\f150"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"\f151"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"\f152"}.fa-eur:before,.fa-euro:before{content:"\f153"}.fa-gbp:before,.fa-pound:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-inr:before,.fa-rupee:before{content:"\f156"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"\f158"}.fa-krw:before,.fa-won:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before,.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-desc:before,.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-amount-asc:before,.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-desc:before,.fa-sort-amount-up:before{content:"\f161"}.fa-sort-numeric-asc:before,.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-desc:before,.fa-sort-numeric-up:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-try:before,.fa-turkish-lira:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-bank:before,.fa-institution:before,.fa-university:before{content:"\f19c"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before,.fa-utensil-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:"\f1c5"}.fa-file-archive-o:before,.fa-file-zip-o:before{content:"\f1c6"}.fa-file-audio-o:before,.fa-file-sound-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:"\f1d0"}.fa-empire:before,.fa-ge:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-paper-plane:before,.fa-send:before{content:"\f1d8"}.fa-paper-plane-o:before,.fa-send-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before,.fa-heading:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before,.fa-closed-captioning:before{content:"\f20a"}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before,.fa-gem:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-bed:before,.fa-hotel:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-medium-square:before{content:"\f2f8"}.fa-y-combinator:before,.fa-yc:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-television:before,.fa-tv:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo-v:before,.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-phone-volume:before,.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:"\f2a3"}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-address-card:before,.fa-vcard:before{content:"\f2bb"}.fa-address-card-o:before,.fa-vcard-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.fa-mastodon:before{content:"\f2e1"}.fa-mastodon-alt:before{content:"\f2e2"}.fa-fork-awesome:before,.fa-fork-circle:before{content:"\f2e3"}.fa-peertube:before{content:"\f2e4"}.fa-diaspora:before{content:"\f2e5"}.fa-friendica:before{content:"\f2e6"}.fa-gnu-social:before{content:"\f2e7"}.fa-liberapay-square:before{content:"\f2e8"}.fa-liberapay:before{content:"\f2e9"}.fa-scuttlebutt:before,.fa-ssb:before{content:"\f2ea"}.fa-hubzilla:before{content:"\f2eb"}.fa-social-home:before{content:"\f2ec"}.fa-artstation:before{content:"\f2ed"}.fa-discord:before{content:"\f2ee"}.fa-discord-alt:before{content:"\f2ef"}.fa-patreon:before{content:"\f2f0"}.fa-snowdrift:before{content:"\f2f1"}.fa-activitypub:before{content:"\f2f2"}.fa-ethereum:before{content:"\f2f3"}.fa-keybase:before{content:"\f2f4"}.fa-shaarli:before{content:"\f2f5"}.fa-shaarli-o:before{content:"\f2f6"}.fa-cut-key:before,.fa-key-modern:before{content:"\f2f7"}.fa-xmpp:before{content:"\f2f9"}.fa-archive-org:before{content:"\f2fc"}.fa-freedombox:before{content:"\f2fd"}.fa-facebook-messenger:before{content:"\f2fe"}.fa-debian:before{content:"\f2ff"}.fa-mastodon-square:before{content:"\f300"}.fa-tipeee:before{content:"\f301"}.fa-react:before{content:"\f302"}.fa-dogmazic:before{content:"\f303"}.fa-zotero:before{content:"\f309"}.fa-nodejs:before{content:"\f308"}.fa-nextcloud:before{content:"\f306"}.fa-nextcloud-square:before{content:"\f307"}.fa-hackaday:before{content:"\f30a"}.fa-laravel:before{content:"\f30b"}.fa-signalapp:before{content:"\f30c"}.fa-gnupg:before{content:"\f30d"}.fa-php:before{content:"\f30e"}.fa-ffmpeg:before{content:"\f30f"}.fa-joplin:before{content:"\f310"}.fa-syncthing:before{content:"\f311"}.fa-inkscape:before{content:"\f312"}.fa-matrix-org:before{content:"\f313"}.fa-pixelfed:before{content:"\f314"}.fa-bootstrap:before{content:"\f315"}.fa-dev-to:before{content:"\f316"}.fa-hashnode:before{content:"\f317"}.fa-jirafeau:before{content:"\f318"}.fa-emby:before{content:"\f319"}.fa-wikidata:before{content:"\f31a"}.fa-gimp:before{content:"\f31b"}.fa-c:before{content:"\f31c"}.fa-digitalocean:before{content:"\f31d"}.fa-att:before{content:"\f31e"}.fa-gitea:before{content:"\f31f"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}/*# sourceMappingURL=fork-awesome.min.css.map */ + */@font-face{font-family:FontAwesome;src:url(../fonts/forkawesome-webfont.eot?v=1.1.5);src:url(../fonts/forkawesome-webfont.eot?#iefix&v=1.1.5) format('embedded-opentype'),url(../fonts/forkawesome-webfont.woff2?v=1.1.5) format('woff2'),url(../fonts/forkawesome-webfont.woff?v=1.1.5) format('woff'),url(../fonts/forkawesome-webfont.ttf?v=1.1.5) format('truetype'),url(../fonts/forkawesome-webfont.svg?v=1.1.5#forkawesomeregular) format('svg');font-weight:400;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-close:before,.fa-remove:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-repeat:before,.fa-rotate-right:before{content:"\f01e"}.fa-refresh:before,.fa-sync:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before,.fa-video:before{content:"\f03d"}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-exclamation-triangle:before,.fa-warning:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell-o:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-globe-e:before{content:"\f304"}.fa-globe-w:before{content:"\f305"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-community:before,.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-floppy-o:before,.fa-save:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus-g:before,.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-bolt:before,.fa-flash:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before,.fa-utensils:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-chain-broken:before,.fa-unlink:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"\f150"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"\f151"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"\f152"}.fa-eur:before,.fa-euro:before{content:"\f153"}.fa-gbp:before,.fa-pound:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-inr:before,.fa-rupee:before{content:"\f156"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"\f158"}.fa-krw:before,.fa-won:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before,.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-desc:before,.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-amount-asc:before,.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-desc:before,.fa-sort-amount-up:before{content:"\f161"}.fa-sort-numeric-asc:before,.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-desc:before,.fa-sort-numeric-up:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-try:before,.fa-turkish-lira:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-bank:before,.fa-institution:before,.fa-university:before{content:"\f19c"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before,.fa-utensil-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:"\f1c5"}.fa-file-archive-o:before,.fa-file-zip-o:before{content:"\f1c6"}.fa-file-audio-o:before,.fa-file-sound-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:"\f1d0"}.fa-empire:before,.fa-ge:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-paper-plane:before,.fa-send:before{content:"\f1d8"}.fa-paper-plane-o:before,.fa-send-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before,.fa-heading:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before,.fa-closed-captioning:before{content:"\f20a"}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before,.fa-gem:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-bed:before,.fa-hotel:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-medium-square:before{content:"\f2f8"}.fa-y-combinator:before,.fa-yc:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-television:before,.fa-tv:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo-v:before,.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-phone-volume:before,.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:"\f2a3"}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-address-card:before,.fa-vcard:before{content:"\f2bb"}.fa-address-card-o:before,.fa-vcard-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.fa-mastodon:before{content:"\f2e1"}.fa-mastodon-alt:before{content:"\f2e2"}.fa-fork-awesome:before,.fa-fork-circle:before{content:"\f2e3"}.fa-peertube:before{content:"\f2e4"}.fa-diaspora:before{content:"\f2e5"}.fa-friendica:before{content:"\f2e6"}.fa-gnu-social:before{content:"\f2e7"}.fa-liberapay-square:before{content:"\f2e8"}.fa-liberapay:before{content:"\f2e9"}.fa-scuttlebutt:before,.fa-ssb:before{content:"\f2ea"}.fa-hubzilla:before{content:"\f2eb"}.fa-social-home:before{content:"\f2ec"}.fa-artstation:before{content:"\f2ed"}.fa-discord:before{content:"\f2ee"}.fa-discord-alt:before{content:"\f2ef"}.fa-patreon:before{content:"\f2f0"}.fa-snowdrift:before{content:"\f2f1"}.fa-activitypub:before{content:"\f2f2"}.fa-ethereum:before{content:"\f2f3"}.fa-keybase:before{content:"\f2f4"}.fa-shaarli:before{content:"\f2f5"}.fa-shaarli-o:before{content:"\f2f6"}.fa-cut-key:before,.fa-key-modern:before{content:"\f2f7"}.fa-xmpp:before{content:"\f2f9"}.fa-archive-org:before{content:"\f2fc"}.fa-freedombox:before{content:"\f2fd"}.fa-facebook-messenger:before{content:"\f2fe"}.fa-debian:before{content:"\f2ff"}.fa-mastodon-square:before{content:"\f300"}.fa-tipeee:before{content:"\f301"}.fa-react:before{content:"\f302"}.fa-dogmazic:before{content:"\f303"}.fa-zotero:before{content:"\f309"}.fa-nodejs:before{content:"\f308"}.fa-nextcloud:before{content:"\f306"}.fa-nextcloud-square:before{content:"\f307"}.fa-hackaday:before{content:"\f30a"}.fa-laravel:before{content:"\f30b"}.fa-signalapp:before{content:"\f30c"}.fa-gnupg:before{content:"\f30d"}.fa-php:before{content:"\f30e"}.fa-ffmpeg:before{content:"\f30f"}.fa-joplin:before{content:"\f310"}.fa-syncthing:before{content:"\f311"}.fa-inkscape:before{content:"\f312"}.fa-matrix-org:before{content:"\f313"}.fa-pixelfed:before{content:"\f314"}.fa-bootstrap:before{content:"\f315"}.fa-dev-to:before{content:"\f316"}.fa-hashnode:before{content:"\f317"}.fa-jirafeau:before{content:"\f318"}.fa-emby:before{content:"\f319"}.fa-wikidata:before{content:"\f31a"}.fa-gimp:before{content:"\f31b"}.fa-c:before{content:"\f31c"}.fa-digitalocean:before{content:"\f31d"}.fa-att:before{content:"\f31e"}.fa-gitea:before{content:"\f31f"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} diff --git a/themes/grav/gulpfile.babel.js b/themes/grav/gulpfile.babel.js deleted file mode 100644 index 53d7fa9b..00000000 --- a/themes/grav/gulpfile.babel.js +++ /dev/null @@ -1,35 +0,0 @@ -import gulp from 'gulp'; -import sass from 'gulp-sass'; -import sourcemaps from 'gulp-sourcemaps'; -import cleanCSS from 'gulp-clean-css'; - -const paths = { - styles: { - src: 'scss/**/*.scss', - dest: 'css-compiled' - } -}; - -export function styles() { - return gulp.src(paths.styles.src) - .pipe(sourcemaps.init()) - .pipe(sass({ outputStyle: 'compressed' })) - .on('error', sass.logError) - .pipe(cleanCSS()) - .pipe(sourcemaps.write()) - .pipe(gulp.dest(paths.styles.dest)); -} - -export function css() { - return styles(); -} - -function watchFiles() { - gulp.watch(paths.styles.src, styles); -} - -export { watchFiles as watch }; - -const build = gulp.series(styles); - -export default build; diff --git a/themes/grav/js/admin.min.js b/themes/grav/js/admin.min.js index 04a3a8d3..2068dd43 100644 --- a/themes/grav/js/admin.min.js +++ b/themes/grav/js/admin.min.js @@ -1,17 +1,17 @@ /* * ATTENTION: An "eval-source-map" devtool has been used. - * This devtool is not neither made for production nor for readable output files. + * This devtool is neither made for production nor for readable output files. * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) * or disable the default devtool with "devtool: false". * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). */ -var Grav;Grav = +var Grav; /******/ (() => { // webpackBootstrap /******/ var __webpack_modules__ = ({ /***/ "./app/dashboard/backup.js": -/*!*********************************!* +/*!*********************************!*\ !*** ./app/dashboard/backup.js ***! \*********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { @@ -22,40 +22,40 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var jque /***/ }), /***/ "./app/dashboard/cache.js": -/*!********************************!* +/*!********************************!*\ !*** ./app/dashboard/cache.js ***! \********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => /* binding */ Cache,\n/* harmony export */ \"Instance\": () => /* binding */ Instance\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! grav-config */ \"grav-config\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(grav_config__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _utils_request__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/request */ \"./app/utils/request.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\n\nvar getUrl = function getUrl() {\n var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n if (type) {\n type = \"cleartype:\".concat(type, \"/\");\n }\n\n return \"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.base_url_relative, \"/cache.json/task\").concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.param_sep, \"clearCache/\").concat(type, \"admin-nonce\").concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.param_sep).concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.admin_nonce);\n};\n\nvar Cache = /*#__PURE__*/function () {\n function Cache() {\n var _this = this;\n\n _classCallCheck(this, Cache);\n\n this.element = jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-clear-cache]');\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('body').on('click', '[data-clear-cache]', function (event) {\n return _this.clear(event, event.target);\n });\n }\n\n _createClass(Cache, [{\n key: \"clear\",\n value: function clear(event, element) {\n var _this2 = this;\n\n var type = '';\n\n if (event && event.preventDefault) {\n event.preventDefault();\n }\n\n if (typeof event === 'string') {\n type = event;\n }\n\n element = element ? jquery__WEBPACK_IMPORTED_MODULE_0___default()(element) : jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"[data-clear-cache-type=\\\"\".concat(type, \"\\\"]\"));\n type = type || jquery__WEBPACK_IMPORTED_MODULE_0___default()(element).data('clear-cache-type') || '';\n var url = element.data('clearCache') || getUrl(type);\n this.disable();\n (0,_utils_request__WEBPACK_IMPORTED_MODULE_2__.default)(url, function () {\n return _this2.enable();\n });\n }\n }, {\n key: \"enable\",\n value: function enable() {\n this.element.removeAttr('disabled').find('> .fa').removeClass('fa-refresh fa-spin fa-retweet').addClass('fa-retweet');\n }\n }, {\n key: \"disable\",\n value: function disable() {\n this.element.attr('disabled', 'disabled').find('> .fa').removeClass('fa-retweet').addClass('fa-refresh fa-spin');\n }\n }]);\n\n return Cache;\n}();\n\n\nvar Instance = new Cache();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL2Rhc2hib2FyZC9jYWNoZS5qcz9jYjJiIl0sIm5hbWVzIjpbImdldFVybCIsInR5cGUiLCJjb25maWciLCJDYWNoZSIsImVsZW1lbnQiLCIkIiwib24iLCJldmVudCIsImNsZWFyIiwidGFyZ2V0IiwicHJldmVudERlZmF1bHQiLCJkYXRhIiwidXJsIiwiZGlzYWJsZSIsInJlcXVlc3QiLCJlbmFibGUiLCJyZW1vdmVBdHRyIiwiZmluZCIsInJlbW92ZUNsYXNzIiwiYWRkQ2xhc3MiLCJhdHRyIiwiSW5zdGFuY2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7O0FBRUEsSUFBTUEsTUFBTSxHQUFHLFNBQVRBLE1BQVMsR0FBZTtBQUFBLE1BQWRDLElBQWMsdUVBQVAsRUFBTzs7QUFDMUIsTUFBSUEsSUFBSixFQUFVO0FBQ05BLFFBQUksdUJBQWdCQSxJQUFoQixNQUFKO0FBQ0g7O0FBRUQsbUJBQVVDLGlFQUFWLDZCQUFxREEseURBQXJELHdCQUFtRkQsSUFBbkYsd0JBQXFHQyx5REFBckcsU0FBd0hBLDJEQUF4SDtBQUNILENBTkQ7O0lBUXFCQyxLO0FBQ2pCLG1CQUFjO0FBQUE7O0FBQUE7O0FBQ1YsU0FBS0MsT0FBTCxHQUFlQyw2Q0FBQyxDQUFDLG9CQUFELENBQWhCO0FBQ0FBLGlEQUFDLENBQUMsTUFBRCxDQUFELENBQVVDLEVBQVYsQ0FBYSxPQUFiLEVBQXNCLG9CQUF0QixFQUE0QyxVQUFDQyxLQUFEO0FBQUEsYUFBVyxLQUFJLENBQUNDLEtBQUwsQ0FBV0QsS0FBWCxFQUFrQkEsS0FBSyxDQUFDRSxNQUF4QixDQUFYO0FBQUEsS0FBNUM7QUFDSDs7OzswQkFFS0YsSyxFQUFPSCxPLEVBQVM7QUFBQTs7QUFDbEIsVUFBSUgsSUFBSSxHQUFHLEVBQVg7O0FBRUEsVUFBSU0sS0FBSyxJQUFJQSxLQUFLLENBQUNHLGNBQW5CLEVBQW1DO0FBQUVILGFBQUssQ0FBQ0csY0FBTjtBQUF5Qjs7QUFDOUQsVUFBSSxPQUFPSCxLQUFQLEtBQWlCLFFBQXJCLEVBQStCO0FBQUVOLFlBQUksR0FBR00sS0FBUDtBQUFlOztBQUVoREgsYUFBTyxHQUFHQSxPQUFPLEdBQUdDLDZDQUFDLENBQUNELE9BQUQsQ0FBSixHQUFnQkMsNkNBQUMsb0NBQTRCSixJQUE1QixTQUFsQztBQUNBQSxVQUFJLEdBQUdBLElBQUksSUFBSUksNkNBQUMsQ0FBQ0QsT0FBRCxDQUFELENBQVdPLElBQVgsQ0FBZ0Isa0JBQWhCLENBQVIsSUFBK0MsRUFBdEQ7QUFDQSxVQUFJQyxHQUFHLEdBQUdSLE9BQU8sQ0FBQ08sSUFBUixDQUFhLFlBQWIsS0FBOEJYLE1BQU0sQ0FBQ0MsSUFBRCxDQUE5QztBQUVBLFdBQUtZLE9BQUw7QUFFQUMsNkRBQU8sQ0FBQ0YsR0FBRCxFQUFNO0FBQUEsZUFBTSxNQUFJLENBQUNHLE1BQUwsRUFBTjtBQUFBLE9BQU4sQ0FBUDtBQUNIOzs7NkJBRVE7QUFDTCxXQUFLWCxPQUFMLENBQ0tZLFVBREwsQ0FDZ0IsVUFEaEIsRUFFS0MsSUFGTCxDQUVVLE9BRlYsRUFFbUJDLFdBRm5CLENBRStCLCtCQUYvQixFQUVnRUMsUUFGaEUsQ0FFeUUsWUFGekU7QUFHSDs7OzhCQUVTO0FBQ04sV0FBS2YsT0FBTCxDQUNLZ0IsSUFETCxDQUNVLFVBRFYsRUFDc0IsVUFEdEIsRUFFS0gsSUFGTCxDQUVVLE9BRlYsRUFFbUJDLFdBRm5CLENBRStCLFlBRi9CLEVBRTZDQyxRQUY3QyxDQUVzRCxvQkFGdEQ7QUFHSDs7Ozs7OztBQUdMLElBQUlFLFFBQVEsR0FBRyxJQUFJbEIsS0FBSixFQUFmIiwiZmlsZSI6Ii4vYXBwL2Rhc2hib2FyZC9jYWNoZS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICdncmF2LWNvbmZpZyc7XG5pbXBvcnQgcmVxdWVzdCBmcm9tICcuLi91dGlscy9yZXF1ZXN0JztcblxuY29uc3QgZ2V0VXJsID0gKHR5cGUgPSAnJykgPT4ge1xuICAgIGlmICh0eXBlKSB7XG4gICAgICAgIHR5cGUgPSBgY2xlYXJ0eXBlOiR7dHlwZX0vYDtcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7Y29uZmlnLmJhc2VfdXJsX3JlbGF0aXZlfS9jYWNoZS5qc29uL3Rhc2ske2NvbmZpZy5wYXJhbV9zZXB9Y2xlYXJDYWNoZS8ke3R5cGV9YWRtaW4tbm9uY2Uke2NvbmZpZy5wYXJhbV9zZXB9JHtjb25maWcuYWRtaW5fbm9uY2V9YDtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENhY2hlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gJCgnW2RhdGEtY2xlYXItY2FjaGVdJyk7XG4gICAgICAgICQoJ2JvZHknKS5vbignY2xpY2snLCAnW2RhdGEtY2xlYXItY2FjaGVdJywgKGV2ZW50KSA9PiB0aGlzLmNsZWFyKGV2ZW50LCBldmVudC50YXJnZXQpKTtcbiAgICB9XG5cbiAgICBjbGVhcihldmVudCwgZWxlbWVudCkge1xuICAgICAgICBsZXQgdHlwZSA9ICcnO1xuXG4gICAgICAgIGlmIChldmVudCAmJiBldmVudC5wcmV2ZW50RGVmYXVsdCkgeyBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyB9XG4gICAgICAgIGlmICh0eXBlb2YgZXZlbnQgPT09ICdzdHJpbmcnKSB7IHR5cGUgPSBldmVudDsgfVxuXG4gICAgICAgIGVsZW1lbnQgPSBlbGVtZW50ID8gJChlbGVtZW50KSA6ICQoYFtkYXRhLWNsZWFyLWNhY2hlLXR5cGU9XCIke3R5cGV9XCJdYCk7XG4gICAgICAgIHR5cGUgPSB0eXBlIHx8ICQoZWxlbWVudCkuZGF0YSgnY2xlYXItY2FjaGUtdHlwZScpIHx8ICcnO1xuICAgICAgICBsZXQgdXJsID0gZWxlbWVudC5kYXRhKCdjbGVhckNhY2hlJykgfHwgZ2V0VXJsKHR5cGUpO1xuXG4gICAgICAgIHRoaXMuZGlzYWJsZSgpO1xuXG4gICAgICAgIHJlcXVlc3QodXJsLCAoKSA9PiB0aGlzLmVuYWJsZSgpKTtcbiAgICB9XG5cbiAgICBlbmFibGUoKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudFxuICAgICAgICAgICAgLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJylcbiAgICAgICAgICAgIC5maW5kKCc+IC5mYScpLnJlbW92ZUNsYXNzKCdmYS1yZWZyZXNoIGZhLXNwaW4gZmEtcmV0d2VldCcpLmFkZENsYXNzKCdmYS1yZXR3ZWV0Jyk7XG4gICAgfVxuXG4gICAgZGlzYWJsZSgpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50XG4gICAgICAgICAgICAuYXR0cignZGlzYWJsZWQnLCAnZGlzYWJsZWQnKVxuICAgICAgICAgICAgLmZpbmQoJz4gLmZhJykucmVtb3ZlQ2xhc3MoJ2ZhLXJldHdlZXQnKS5hZGRDbGFzcygnZmEtcmVmcmVzaCBmYS1zcGluJyk7XG4gICAgfVxufVxuXG5sZXQgSW5zdGFuY2UgPSBuZXcgQ2FjaGUoKTtcblxuZXhwb3J0IHsgSW5zdGFuY2UgfTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./app/dashboard/cache.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Cache),\n/* harmony export */ \"Instance\": () => (/* binding */ Instance)\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! grav-config */ \"grav-config\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(grav_config__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _utils_request__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/request */ \"./app/utils/request.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\n\nvar getUrl = function getUrl() {\n var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n if (type) {\n type = \"cleartype:\".concat(type, \"/\");\n }\n\n return \"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.base_url_relative, \"/cache.json/task\").concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.param_sep, \"clearCache/\").concat(type, \"admin-nonce\").concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.param_sep).concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.admin_nonce);\n};\n\nvar Cache = /*#__PURE__*/function () {\n function Cache() {\n var _this = this;\n\n _classCallCheck(this, Cache);\n\n this.element = jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-clear-cache]');\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('body').on('click', '[data-clear-cache]', function (event) {\n return _this.clear(event, event.target);\n });\n }\n\n _createClass(Cache, [{\n key: \"clear\",\n value: function clear(event, element) {\n var _this2 = this;\n\n var type = '';\n\n if (event && event.preventDefault) {\n event.preventDefault();\n }\n\n if (typeof event === 'string') {\n type = event;\n }\n\n element = element ? jquery__WEBPACK_IMPORTED_MODULE_0___default()(element) : jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"[data-clear-cache-type=\\\"\".concat(type, \"\\\"]\"));\n type = type || jquery__WEBPACK_IMPORTED_MODULE_0___default()(element).data('clear-cache-type') || '';\n var url = element.data('clearCache') || getUrl(type);\n this.disable();\n (0,_utils_request__WEBPACK_IMPORTED_MODULE_2__.default)(url, function () {\n return _this2.enable();\n });\n }\n }, {\n key: \"enable\",\n value: function enable() {\n this.element.removeAttr('disabled').find('> .fa').removeClass('fa-refresh fa-spin fa-retweet').addClass('fa-retweet');\n }\n }, {\n key: \"disable\",\n value: function disable() {\n this.element.attr('disabled', 'disabled').find('> .fa').removeClass('fa-retweet').addClass('fa-refresh fa-spin');\n }\n }]);\n\n return Cache;\n}();\n\n\nvar Instance = new Cache();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL2Rhc2hib2FyZC9jYWNoZS5qcz9jYjJiIl0sIm5hbWVzIjpbImdldFVybCIsInR5cGUiLCJjb25maWciLCJDYWNoZSIsImVsZW1lbnQiLCIkIiwib24iLCJldmVudCIsImNsZWFyIiwidGFyZ2V0IiwicHJldmVudERlZmF1bHQiLCJkYXRhIiwidXJsIiwiZGlzYWJsZSIsInJlcXVlc3QiLCJlbmFibGUiLCJyZW1vdmVBdHRyIiwiZmluZCIsInJlbW92ZUNsYXNzIiwiYWRkQ2xhc3MiLCJhdHRyIiwiSW5zdGFuY2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7O0FBRUEsSUFBTUEsTUFBTSxHQUFHLFNBQVRBLE1BQVMsR0FBZTtBQUFBLE1BQWRDLElBQWMsdUVBQVAsRUFBTzs7QUFDMUIsTUFBSUEsSUFBSixFQUFVO0FBQ05BLFFBQUksdUJBQWdCQSxJQUFoQixNQUFKO0FBQ0g7O0FBRUQsbUJBQVVDLGlFQUFWLDZCQUFxREEseURBQXJELHdCQUFtRkQsSUFBbkYsd0JBQXFHQyx5REFBckcsU0FBd0hBLDJEQUF4SDtBQUNILENBTkQ7O0lBUXFCQyxLO0FBQ2pCLG1CQUFjO0FBQUE7O0FBQUE7O0FBQ1YsU0FBS0MsT0FBTCxHQUFlQyw2Q0FBQyxDQUFDLG9CQUFELENBQWhCO0FBQ0FBLGlEQUFDLENBQUMsTUFBRCxDQUFELENBQVVDLEVBQVYsQ0FBYSxPQUFiLEVBQXNCLG9CQUF0QixFQUE0QyxVQUFDQyxLQUFEO0FBQUEsYUFBVyxLQUFJLENBQUNDLEtBQUwsQ0FBV0QsS0FBWCxFQUFrQkEsS0FBSyxDQUFDRSxNQUF4QixDQUFYO0FBQUEsS0FBNUM7QUFDSDs7OztXQUVELGVBQU1GLEtBQU4sRUFBYUgsT0FBYixFQUFzQjtBQUFBOztBQUNsQixVQUFJSCxJQUFJLEdBQUcsRUFBWDs7QUFFQSxVQUFJTSxLQUFLLElBQUlBLEtBQUssQ0FBQ0csY0FBbkIsRUFBbUM7QUFBRUgsYUFBSyxDQUFDRyxjQUFOO0FBQXlCOztBQUM5RCxVQUFJLE9BQU9ILEtBQVAsS0FBaUIsUUFBckIsRUFBK0I7QUFBRU4sWUFBSSxHQUFHTSxLQUFQO0FBQWU7O0FBRWhESCxhQUFPLEdBQUdBLE9BQU8sR0FBR0MsNkNBQUMsQ0FBQ0QsT0FBRCxDQUFKLEdBQWdCQyw2Q0FBQyxvQ0FBNEJKLElBQTVCLFNBQWxDO0FBQ0FBLFVBQUksR0FBR0EsSUFBSSxJQUFJSSw2Q0FBQyxDQUFDRCxPQUFELENBQUQsQ0FBV08sSUFBWCxDQUFnQixrQkFBaEIsQ0FBUixJQUErQyxFQUF0RDtBQUNBLFVBQUlDLEdBQUcsR0FBR1IsT0FBTyxDQUFDTyxJQUFSLENBQWEsWUFBYixLQUE4QlgsTUFBTSxDQUFDQyxJQUFELENBQTlDO0FBRUEsV0FBS1ksT0FBTDtBQUVBQyw2REFBTyxDQUFDRixHQUFELEVBQU07QUFBQSxlQUFNLE1BQUksQ0FBQ0csTUFBTCxFQUFOO0FBQUEsT0FBTixDQUFQO0FBQ0g7OztXQUVELGtCQUFTO0FBQ0wsV0FBS1gsT0FBTCxDQUNLWSxVQURMLENBQ2dCLFVBRGhCLEVBRUtDLElBRkwsQ0FFVSxPQUZWLEVBRW1CQyxXQUZuQixDQUUrQiwrQkFGL0IsRUFFZ0VDLFFBRmhFLENBRXlFLFlBRnpFO0FBR0g7OztXQUVELG1CQUFVO0FBQ04sV0FBS2YsT0FBTCxDQUNLZ0IsSUFETCxDQUNVLFVBRFYsRUFDc0IsVUFEdEIsRUFFS0gsSUFGTCxDQUVVLE9BRlYsRUFFbUJDLFdBRm5CLENBRStCLFlBRi9CLEVBRTZDQyxRQUY3QyxDQUVzRCxvQkFGdEQ7QUFHSDs7Ozs7OztBQUdMLElBQUlFLFFBQVEsR0FBRyxJQUFJbEIsS0FBSixFQUFmIiwiZmlsZSI6Ii4vYXBwL2Rhc2hib2FyZC9jYWNoZS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICdncmF2LWNvbmZpZyc7XG5pbXBvcnQgcmVxdWVzdCBmcm9tICcuLi91dGlscy9yZXF1ZXN0JztcblxuY29uc3QgZ2V0VXJsID0gKHR5cGUgPSAnJykgPT4ge1xuICAgIGlmICh0eXBlKSB7XG4gICAgICAgIHR5cGUgPSBgY2xlYXJ0eXBlOiR7dHlwZX0vYDtcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7Y29uZmlnLmJhc2VfdXJsX3JlbGF0aXZlfS9jYWNoZS5qc29uL3Rhc2ske2NvbmZpZy5wYXJhbV9zZXB9Y2xlYXJDYWNoZS8ke3R5cGV9YWRtaW4tbm9uY2Uke2NvbmZpZy5wYXJhbV9zZXB9JHtjb25maWcuYWRtaW5fbm9uY2V9YDtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENhY2hlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gJCgnW2RhdGEtY2xlYXItY2FjaGVdJyk7XG4gICAgICAgICQoJ2JvZHknKS5vbignY2xpY2snLCAnW2RhdGEtY2xlYXItY2FjaGVdJywgKGV2ZW50KSA9PiB0aGlzLmNsZWFyKGV2ZW50LCBldmVudC50YXJnZXQpKTtcbiAgICB9XG5cbiAgICBjbGVhcihldmVudCwgZWxlbWVudCkge1xuICAgICAgICBsZXQgdHlwZSA9ICcnO1xuXG4gICAgICAgIGlmIChldmVudCAmJiBldmVudC5wcmV2ZW50RGVmYXVsdCkgeyBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyB9XG4gICAgICAgIGlmICh0eXBlb2YgZXZlbnQgPT09ICdzdHJpbmcnKSB7IHR5cGUgPSBldmVudDsgfVxuXG4gICAgICAgIGVsZW1lbnQgPSBlbGVtZW50ID8gJChlbGVtZW50KSA6ICQoYFtkYXRhLWNsZWFyLWNhY2hlLXR5cGU9XCIke3R5cGV9XCJdYCk7XG4gICAgICAgIHR5cGUgPSB0eXBlIHx8ICQoZWxlbWVudCkuZGF0YSgnY2xlYXItY2FjaGUtdHlwZScpIHx8ICcnO1xuICAgICAgICBsZXQgdXJsID0gZWxlbWVudC5kYXRhKCdjbGVhckNhY2hlJykgfHwgZ2V0VXJsKHR5cGUpO1xuXG4gICAgICAgIHRoaXMuZGlzYWJsZSgpO1xuXG4gICAgICAgIHJlcXVlc3QodXJsLCAoKSA9PiB0aGlzLmVuYWJsZSgpKTtcbiAgICB9XG5cbiAgICBlbmFibGUoKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudFxuICAgICAgICAgICAgLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJylcbiAgICAgICAgICAgIC5maW5kKCc+IC5mYScpLnJlbW92ZUNsYXNzKCdmYS1yZWZyZXNoIGZhLXNwaW4gZmEtcmV0d2VldCcpLmFkZENsYXNzKCdmYS1yZXR3ZWV0Jyk7XG4gICAgfVxuXG4gICAgZGlzYWJsZSgpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50XG4gICAgICAgICAgICAuYXR0cignZGlzYWJsZWQnLCAnZGlzYWJsZWQnKVxuICAgICAgICAgICAgLmZpbmQoJz4gLmZhJykucmVtb3ZlQ2xhc3MoJ2ZhLXJldHdlZXQnKS5hZGRDbGFzcygnZmEtcmVmcmVzaCBmYS1zcGluJyk7XG4gICAgfVxufVxuXG5sZXQgSW5zdGFuY2UgPSBuZXcgQ2FjaGUoKTtcblxuZXhwb3J0IHsgSW5zdGFuY2UgfTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./app/dashboard/cache.js\n"); /***/ }), /***/ "./app/dashboard/chart.js": -/*!********************************!* +/*!********************************!*\ !*** ./app/dashboard/chart.js ***! \********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"defaults\": () => /* binding */ defaults,\n/* harmony export */ \"default\": () => /* binding */ Chart,\n/* harmony export */ \"UpdatesChart\": () => /* binding */ UpdatesChart,\n/* harmony export */ \"Instances\": () => /* binding */ Instances\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var chartist__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! chartist */ \"./node_modules/chartist/dist/chartist.js\");\n/* harmony import */ var chartist__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(chartist__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! grav-config */ \"grav-config\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(grav_config__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _utils_gpm__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/gpm */ \"./app/utils/gpm.js\");\n/* harmony import */ var _updates__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../updates */ \"./app/updates/index.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _get(target, property, receiver) { if (typeof Reflect !== \"undefined\" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); }\n\nfunction _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\n\n // let isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n\nvar defaults = {\n data: {\n series: [100, 0]\n },\n options: {\n Pie: {\n donut: true,\n donutWidth: 10,\n startAngle: 0,\n total: 100,\n showLabel: false,\n height: 150,\n // chartPadding: !isFirefox ? 10 : 25 // workaround for older versions of firefox\n chartPadding: 5\n },\n Bar: {\n height: 164,\n chartPadding: 20,\n // workaround for older versions of firefox\n axisX: {\n showGrid: false,\n labelOffset: {\n x: 0,\n y: 0\n }\n },\n axisY: {\n offset: 15,\n showLabel: true,\n showGrid: true,\n labelOffset: {\n x: 5,\n y: 5\n },\n scaleMinSpace: 25\n }\n }\n }\n};\n\nvar Chart = /*#__PURE__*/function () {\n function Chart(element) {\n var _this = this;\n\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var data = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n _classCallCheck(this, Chart);\n\n this.element = jquery__WEBPACK_IMPORTED_MODULE_0___default()(element) || [];\n\n if (!this.element[0]) {\n return;\n }\n\n var type = (this.element.data('chart-type') || 'pie').toLowerCase();\n this.type = type.charAt(0).toUpperCase() + type.substr(1).toLowerCase();\n options = Object.assign({}, defaults.options[this.type], options);\n data = Object.assign({}, defaults.data, data);\n Object.assign(this, {\n options: options,\n data: data\n });\n this.chart = (chartist__WEBPACK_IMPORTED_MODULE_1___default())[this.type](this.element.find('.ct-chart').empty()[0], this.data, this.options);\n this.chart.on('created', function () {\n _this.element.find('.hidden').removeClass('hidden'); // FIX: workaround for chartist issue not allowing HTML in labels anymore\n // https://github.com/gionkunz/chartist-js/issues/937\n\n\n _this.element.find('.ct-label').each(function (index, label) {\n label = jquery__WEBPACK_IMPORTED_MODULE_0___default()(label);\n var text = label.html().replace('<', '<').replace('>', '>');\n label.html(text);\n });\n });\n }\n\n _createClass(Chart, [{\n key: \"updateData\",\n value: function updateData(data) {\n Object.assign(this.data, data);\n this.chart.update(this.data);\n }\n }]);\n\n return Chart;\n}();\n\n\n;\nvar UpdatesChart = /*#__PURE__*/function (_Chart) {\n _inherits(UpdatesChart, _Chart);\n\n var _super = _createSuper(UpdatesChart);\n\n function UpdatesChart(element) {\n var _this2;\n\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var data = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n _classCallCheck(this, UpdatesChart);\n\n _this2 = _super.call(this, element, options, data);\n\n _this2.chart.on('draw', function (data) {\n return _this2.draw(data);\n });\n\n _utils_gpm__WEBPACK_IMPORTED_MODULE_3__.Instance.on('fetched', function (response) {\n if (!response.payload) {\n return;\n }\n\n var payload = response.payload.grav;\n var missing = (response.payload.resources.total + (payload.isUpdatable ? 1 : 0)) * 100 / (response.payload.installed + (payload.isUpdatable ? 1 : 0));\n var updated = 100 - missing;\n\n _this2.updateData({\n series: [updated, missing]\n });\n\n if (response.payload.resources.total) {\n _updates__WEBPACK_IMPORTED_MODULE_4__.Instance.maintenance('show');\n }\n });\n return _this2;\n }\n\n _createClass(UpdatesChart, [{\n key: \"draw\",\n value: function draw(data) {\n if (data.index) {\n return;\n }\n\n var notice = grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.PLUGIN_ADMIN[data.value === 100 ? 'FULLY_UPDATED' : 'UPDATES_AVAILABLE'];\n this.element.find('.numeric span').text(\"\".concat(Math.round(data.value), \"%\"));\n this.element.find('.js__updates-available-description').html(notice);\n this.element.find('.hidden').removeClass('hidden');\n }\n }, {\n key: \"updateData\",\n value: function updateData(data) {\n _get(_getPrototypeOf(UpdatesChart.prototype), \"updateData\", this).call(this, data); // missing updates\n\n\n if (this.data.series[0] < 100) {\n this.element.closest('#updates').find('[data-update-packages]').fadeIn();\n }\n }\n }]);\n\n return UpdatesChart;\n}(Chart);\nvar charts = {};\njquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-chart-name]').each(function () {\n var element = jquery__WEBPACK_IMPORTED_MODULE_0___default()(this);\n var name = element.data('chart-name') || '';\n var options = element.data('chart-options') || {};\n var data = element.data('chart-data') || {};\n\n if (name === 'updates') {\n charts[name] = new UpdatesChart(element, options, data);\n } else {\n charts[name] = new Chart(element, options, data);\n }\n});\nvar Instances = charts;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL2Rhc2hib2FyZC9jaGFydC5qcz8xZTg2Il0sIm5hbWVzIjpbImRlZmF1bHRzIiwiZGF0YSIsInNlcmllcyIsIm9wdGlvbnMiLCJQaWUiLCJkb251dCIsImRvbnV0V2lkdGgiLCJzdGFydEFuZ2xlIiwidG90YWwiLCJzaG93TGFiZWwiLCJoZWlnaHQiLCJjaGFydFBhZGRpbmciLCJCYXIiLCJheGlzWCIsInNob3dHcmlkIiwibGFiZWxPZmZzZXQiLCJ4IiwieSIsImF4aXNZIiwib2Zmc2V0Iiwic2NhbGVNaW5TcGFjZSIsIkNoYXJ0IiwiZWxlbWVudCIsIiQiLCJ0eXBlIiwidG9Mb3dlckNhc2UiLCJjaGFyQXQiLCJ0b1VwcGVyQ2FzZSIsInN1YnN0ciIsIk9iamVjdCIsImFzc2lnbiIsImNoYXJ0IiwiY2hhcnRpc3QiLCJmaW5kIiwiZW1wdHkiLCJvbiIsInJlbW92ZUNsYXNzIiwiZWFjaCIsImluZGV4IiwibGFiZWwiLCJ0ZXh0IiwiaHRtbCIsInJlcGxhY2UiLCJ1cGRhdGUiLCJVcGRhdGVzQ2hhcnQiLCJkcmF3IiwiZ3BtIiwicmVzcG9uc2UiLCJwYXlsb2FkIiwiZ3JhdiIsIm1pc3NpbmciLCJyZXNvdXJjZXMiLCJpc1VwZGF0YWJsZSIsImluc3RhbGxlZCIsInVwZGF0ZWQiLCJ1cGRhdGVEYXRhIiwidXBkYXRlcyIsIm5vdGljZSIsInRyYW5zbGF0aW9ucyIsInZhbHVlIiwiTWF0aCIsInJvdW5kIiwiY2xvc2VzdCIsImZhZGVJbiIsImNoYXJ0cyIsIm5hbWUiLCJJbnN0YW5jZXMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7Q0FHQTs7QUFFTyxJQUFNQSxRQUFRLEdBQUc7QUFDcEJDLE1BQUksRUFBRTtBQUNGQyxVQUFNLEVBQUUsQ0FBQyxHQUFELEVBQU0sQ0FBTjtBQUROLEdBRGM7QUFJcEJDLFNBQU8sRUFBRTtBQUNM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Q0FBdUJjLElBQXZCLENBQTRCLFlBQVc7QUFDbkMsTUFBSWYsT0FBTyxHQUFHQyw2Q0FBQyxDQUFDLElBQUQsQ0FBZjtBQUNBLE1BQUkwQyxJQUFJLEdBQUczQyxPQUFPLENBQUNyQixJQUFSLENBQWEsWUFBYixLQUE4QixFQUF6QztBQUNBLE1BQUlFLE9BQU8sR0FBR21CLE9BQU8sQ0FBQ3JCLElBQVIsQ0FBYSxlQUFiLEtBQWlDLEVBQS9DO0FBQ0EsTUFBSUEsSUFBSSxHQUFHcUIsT0FBTyxDQUFDckIsSUFBUixDQUFhLFlBQWIsS0FBOEIsRUFBekM7O0FBRUEsTUFBSWdFLElBQUksS0FBSyxTQUFiLEVBQXdCO0FBQ3BCRCxVQUFNLENBQUNDLElBQUQsQ0FBTixHQUFlLElBQUlyQixZQUFKLENBQWlCdEIsT0FBakIsRUFBMEJuQixPQUExQixFQUFtQ0YsSUFBbkMsQ0FBZjtBQUNILEdBRkQsTUFFTztBQUNIK0QsVUFBTSxDQUFDQyxJQUFELENBQU4sR0FBZSxJQUFJNUMsS0FBSixDQUFVQyxPQUFWLEVBQW1CbkIsT0FBbkIsRUFBNEJGLElBQTVCLENBQWY7QUFDSDtBQUNKLENBWEQ7QUFhTyxJQUFJaUUsU0FBUyxHQUFHRixNQUFoQiIsImZpbGUiOiIuL2FwcC9kYXNoYm9hcmQvY2hhcnQuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IGNoYXJ0aXN0IGZyb20gJ2NoYXJ0aXN0JztcbmltcG9ydCB7IHRyYW5zbGF0aW9ucyB9IGZyb20gJ2dyYXYtY29uZmlnJztcbmltcG9ydCB7IEluc3RhbmNlIGFzIGdwbSB9IGZyb20gJy4uL3V0aWxzL2dwbSc7XG5pbXBvcnQgeyBJbnN0YW5jZSBhcyB1cGRhdGVzIH0gZnJvbSAnLi4vdXBkYXRlcyc7XG5cbi8vIGxldCBpc0ZpcmVmb3ggPSBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZignZmlyZWZveCcpID4gLTE7XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0cyA9IHtcbiAgICBkYXRhOiB7XG4gICAgICAgIHNlcmllczogWzEwMCwgMF1cbiAgICB9LFxuICAgIG9wdGlvbnM6IHtcbiAgICAgICAgUGllOiB7XG4gICAgICAgICAgICBkb251dDogdHJ1ZSxcbiAgICAgICAgICAgIGRvbnV0V2lkdGg6IDEwLFxuICAgICAgICAgICAgc3RhcnRBbmdsZTogMCxcbiAgICAgICAgICAgIHRvdGFsOiAxMDAsXG4gICAgICAgICAgICBzaG93TGFiZWw6IGZhbHNlLFxuICAgICAgICAgICAgaGVpZ2h0OiAxNTAsXG4gICAgICAgICAgICAvLyBjaGFydFBhZGRpbmc6ICFpc0ZpcmVmb3ggPyAxMCA6IDI1IC8vIHdvcmthcm91bmQgZm9yIG9sZGVyIHZlcnNpb25zIG9mIGZpcmVmb3hcbiAgICAgICAgICAgIGNoYXJ0UGFkZGluZzogNVxuICAgICAgICB9LFxuICAgICAgICBCYXI6IHtcbiAgICAgICAgICAgIGhlaWdodDogMTY0LFxuICAgICAgICAgICAgY2hhcnRQYWRkaW5nOiAyMCwgLy8gd29ya2Fyb3VuZCBmb3Igb2xkZXIgdmVyc2lvbnMgb2YgZmlyZWZveFxuXG4gICAgICAgICAgICBheGlzWDoge1xuICAgICAgICAgICAgICAgIHNob3dHcmlkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBsYWJlbE9mZnNldDoge1xuICAgICAgICAgICAgICAgICAgICB4OiAwLFxuICAgICAgICAgICAgICAgICAgICB5OiAwXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGF4aXNZOiB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0OiAxNSxcbiAgICAgICAgICAgICAgICBzaG93TGFiZWw6IHRydWUsXG4gICAgICAgICAgICAgICAgc2hvd0dyaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgbGFiZWxPZmZzZXQ6IHtcbiAgICAgICAgICAgICAgICAgICAgeDogNSxcbiAgICAgICAgICAgICAgICAgICAgeTogNVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2NhbGVNaW5TcGFjZTogMjVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENoYXJ0IHtcbiAgICBjb25zdHJ1Y3RvcihlbGVtZW50LCBvcHRpb25zID0ge30sIGRhdGEgPSB7fSkge1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSAkKGVsZW1lbnQpIHx8IFtdO1xuICAgICAgICBpZiAoIXRoaXMuZWxlbWVudFswXSkgeyByZXR1cm47IH1cblxuICAgICAgICBsZXQgdHlwZSA9ICh0aGlzLmVsZW1lbnQuZGF0YSgnY2hhcnQtdHlwZScpIHx8ICdwaWUnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdHlwZS5zdWJzdHIoMSkudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdHMub3B0aW9uc1t0aGlzLnR5cGVdLCBvcHRpb25zKTtcbiAgICAgICAgZGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRzLmRhdGEsIGRhdGEpO1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIHtcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBkYXRhXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNoYXJ0ID0gY2hhcnRpc3RbdGhpcy50eXBlXSh0aGlzLmVsZW1lbnQuZmluZCgnLmN0LWNoYXJ0JykuZW1wdHkoKVswXSwgdGhpcy5kYXRhLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICB0aGlzLmNoYXJ0Lm9uKCdjcmVhdGVkJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmZpbmQoJy5oaWRkZW4nKS5yZW1vdmVDbGFzcygnaGlkZGVuJyk7XG5cbiAgICAgICAgICAgIC8vIEZJWDogd29ya2Fyb3VuZCBmb3IgY2hhcnRpc3QgaXNzdWUgbm90IGFsbG93aW5nIEhUTUwgaW4gbGFiZWxzIGFueW1vcmVcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9naW9ua3Vuei9jaGFydGlzdC1qcy9pc3N1ZXMvOTM3XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuZmluZCgnLmN0LWxhYmVsJykuZWFjaCgoaW5kZXgsIGxhYmVsKSA9PiB7XG4gICAgICAgICAgICAgICAgbGFiZWwgPSAkKGxhYmVsKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gbGFiZWwuaHRtbCgpLnJlcGxhY2UoJyZsdDsnLCAnPCcpLnJlcGxhY2UoJyZndDsnLCAnPicpO1xuICAgICAgICAgICAgICAgIGxhYmVsLmh0bWwodGV4dCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdXBkYXRlRGF0YShkYXRhKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5kYXRhLCBkYXRhKTtcbiAgICAgICAgdGhpcy5jaGFydC51cGRhdGUodGhpcy5kYXRhKTtcbiAgICB9XG59O1xuXG5leHBvcnQgY2xhc3MgVXBkYXRlc0NoYXJ0IGV4dGVuZHMgQ2hhcnQge1xuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQsIG9wdGlvbnMgPSB7fSwgZGF0YSA9IHt9KSB7XG4gICAgICAgIHN1cGVyKGVsZW1lbnQsIG9wdGlvbnMsIGRhdGEpO1xuXG4gICAgICAgIHRoaXMuY2hhcnQub24oJ2RyYXcnLCAoZGF0YSkgPT4gdGhpcy5kcmF3KGRhdGEpKTtcblxuICAgICAgICBncG0ub24oJ2ZldGNoZWQnLCAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIGlmICghcmVzcG9uc2UucGF5bG9hZCkgeyByZXR1cm47IH1cblxuICAgICAgICAgICAgbGV0IHBheWxvYWQgPSByZXNwb25zZS5wYXlsb2FkLmdyYXY7XG4gICAgICAgICAgICBsZXQgbWlzc2luZyA9IChyZXNwb25zZS5wYXlsb2FkLnJlc291cmNlcy50b3RhbCArIChwYXlsb2FkLmlzVXBkYXRhYmxlID8gMSA6IDApKSAqIDEwMCAvIChyZXNwb25zZS5wYXlsb2FkLmluc3RhbGxlZCArIChwYXlsb2FkLmlzVXBkYXRhYmxlID8gMSA6IDApKTtcbiAgICAgICAgICAgIGxldCB1cGRhdGVkID0gMTAwIC0gbWlzc2luZztcblxuICAgICAgICAgICAgdGhpcy51cGRhdGVEYXRhKHsgc2VyaWVzOiBbdXBkYXRlZCwgbWlzc2luZ10gfSk7XG5cbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5wYXlsb2FkLnJlc291cmNlcy50b3RhbCkge1xuICAgICAgICAgICAgICAgIHVwZGF0ZXMubWFpbnRlbmFuY2UoJ3Nob3cnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZHJhdyhkYXRhKSB7XG4gICAgICAgIGlmIChkYXRhLmluZGV4KSB7IHJldHVybjsgfVxuXG4gICAgICAgIGxldCBub3RpY2UgPSB0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOW2RhdGEudmFsdWUgPT09IDEwMCA/ICdGVUxMWV9VUERBVEVEJyA6ICdVUERBVEVTX0FWQUlMQUJMRSddO1xuICAgICAgICB0aGlzLmVsZW1lbnQuZmluZCgnLm51bWVyaWMgc3BhbicpLnRleHQoYCR7TWF0aC5yb3VuZChkYXRhLnZhbHVlKX0lYCk7XG4gICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCcuanNfX3VwZGF0ZXMtYXZhaWxhYmxlLWRlc2NyaXB0aW9uJykuaHRtbChub3RpY2UpO1xuICAgICAgICB0aGlzLmVsZW1lbnQuZmluZCgnLmhpZGRlbicpLnJlbW92ZUNsYXNzKCdoaWRkZW4nKTtcbiAgICB9XG5cbiAgICB1cGRhdGVEYXRhKGRhdGEpIHtcbiAgICAgICAgc3VwZXIudXBkYXRlRGF0YShkYXRhKTtcblxuICAgICAgICAvLyBtaXNzaW5nIHVwZGF0ZXNcbiAgICAgICAgaWYgKHRoaXMuZGF0YS5zZXJpZXNbMF0gPCAxMDApIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5jbG9zZXN0KCcjdXBkYXRlcycpLmZpbmQoJ1tkYXRhLXVwZGF0ZS1wYWNrYWdlc10nKS5mYWRlSW4oKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxubGV0IGNoYXJ0cyA9IHt9O1xuXG4kKCdbZGF0YS1jaGFydC1uYW1lXScpLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgbGV0IGVsZW1lbnQgPSAkKHRoaXMpO1xuICAgIGxldCBuYW1lID0gZWxlbWVudC5kYXRhKCdjaGFydC1uYW1lJykgfHwgJyc7XG4gICAgbGV0IG9wdGlvbnMgPSBlbGVtZW50LmRhdGEoJ2NoYXJ0LW9wdGlvbnMnKSB8fCB7fTtcbiAgICBsZXQgZGF0YSA9IGVsZW1lbnQuZGF0YSgnY2hhcnQtZGF0YScpIHx8IHt9O1xuXG4gICAgaWYgKG5hbWUgPT09ICd1cGRhdGVzJykge1xuICAgICAgICBjaGFydHNbbmFtZV0gPSBuZXcgVXBkYXRlc0NoYXJ0KGVsZW1lbnQsIG9wdGlvbnMsIGRhdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNoYXJ0c1tuYW1lXSA9IG5ldyBDaGFydChlbGVtZW50LCBvcHRpb25zLCBkYXRhKTtcbiAgICB9XG59KTtcblxuZXhwb3J0IGxldCBJbnN0YW5jZXMgPSBjaGFydHM7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./app/dashboard/chart.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"defaults\": () => (/* binding */ defaults),\n/* harmony export */ \"default\": () => (/* binding */ Chart),\n/* harmony export */ \"UpdatesChart\": () => (/* binding */ UpdatesChart),\n/* harmony export */ \"Instances\": () => (/* binding */ Instances)\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var chartist__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! chartist */ \"./node_modules/chartist/dist/chartist.js\");\n/* harmony import */ var chartist__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(chartist__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! grav-config */ \"grav-config\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(grav_config__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _utils_gpm__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/gpm */ \"./app/utils/gpm.js\");\n/* harmony import */ var _updates__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../updates */ \"./app/updates/index.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _get(target, property, receiver) { if (typeof Reflect !== \"undefined\" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); }\n\nfunction _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\n\n // let isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n\nvar defaults = {\n data: {\n series: [100, 0]\n },\n options: {\n Pie: {\n donut: true,\n donutWidth: 10,\n startAngle: 0,\n total: 100,\n showLabel: false,\n height: 150,\n // chartPadding: !isFirefox ? 10 : 25 // workaround for older versions of firefox\n chartPadding: 5\n },\n Bar: {\n height: 164,\n chartPadding: 20,\n // workaround for older versions of firefox\n axisX: {\n showGrid: false,\n labelOffset: {\n x: 0,\n y: 0\n }\n },\n axisY: {\n offset: 15,\n showLabel: true,\n showGrid: true,\n labelOffset: {\n x: 5,\n y: 5\n },\n scaleMinSpace: 25\n }\n }\n }\n};\n\nvar Chart = /*#__PURE__*/function () {\n function Chart(element) {\n var _this = this;\n\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var data = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n _classCallCheck(this, Chart);\n\n this.element = jquery__WEBPACK_IMPORTED_MODULE_0___default()(element) || [];\n\n if (!this.element[0]) {\n return;\n }\n\n var type = (this.element.data('chart-type') || 'pie').toLowerCase();\n this.type = type.charAt(0).toUpperCase() + type.substr(1).toLowerCase();\n options = Object.assign({}, defaults.options[this.type], options);\n data = Object.assign({}, defaults.data, data);\n Object.assign(this, {\n options: options,\n data: data\n });\n this.chart = (chartist__WEBPACK_IMPORTED_MODULE_1___default())[this.type](this.element.find('.ct-chart').empty()[0], this.data, this.options);\n this.chart.on('created', function () {\n _this.element.find('.hidden').removeClass('hidden'); // FIX: workaround for chartist issue not allowing HTML in labels anymore\n // https://github.com/gionkunz/chartist-js/issues/937\n\n\n _this.element.find('.ct-label').each(function (index, label) {\n label = jquery__WEBPACK_IMPORTED_MODULE_0___default()(label);\n var text = label.html().replace('<', '<').replace('>', '>');\n label.html(text);\n });\n });\n }\n\n _createClass(Chart, [{\n key: \"updateData\",\n value: function updateData(data) {\n Object.assign(this.data, data);\n this.chart.update(this.data);\n }\n }]);\n\n return Chart;\n}();\n\n\n;\nvar UpdatesChart = /*#__PURE__*/function (_Chart) {\n _inherits(UpdatesChart, _Chart);\n\n var _super = _createSuper(UpdatesChart);\n\n function UpdatesChart(element) {\n var _this2;\n\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var data = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n _classCallCheck(this, UpdatesChart);\n\n _this2 = _super.call(this, element, options, data);\n\n _this2.chart.on('draw', function (data) {\n return _this2.draw(data);\n });\n\n _utils_gpm__WEBPACK_IMPORTED_MODULE_3__.Instance.on('fetched', function (response) {\n if (!response.payload) {\n return;\n }\n\n var payload = response.payload.grav;\n var missing = (response.payload.resources.total + (payload.isUpdatable ? 1 : 0)) * 100 / (response.payload.installed + (payload.isUpdatable ? 1 : 0));\n var updated = 100 - missing;\n\n _this2.updateData({\n series: [updated, missing]\n });\n\n if (response.payload.resources.total) {\n _updates__WEBPACK_IMPORTED_MODULE_4__.Instance.maintenance('show');\n }\n });\n return _this2;\n }\n\n _createClass(UpdatesChart, [{\n key: \"draw\",\n value: function draw(data) {\n if (data.index) {\n return;\n }\n\n var notice = grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.PLUGIN_ADMIN[data.value === 100 ? 'FULLY_UPDATED' : 'UPDATES_AVAILABLE'];\n this.element.find('.numeric span').text(\"\".concat(Math.round(data.value), \"%\"));\n this.element.find('.js__updates-available-description').html(notice);\n this.element.find('.hidden').removeClass('hidden');\n }\n }, {\n key: \"updateData\",\n value: function updateData(data) {\n _get(_getPrototypeOf(UpdatesChart.prototype), \"updateData\", this).call(this, data); // missing updates\n\n\n if (this.data.series[0] < 100) {\n this.element.closest('#updates').find('[data-update-packages]').fadeIn();\n }\n }\n }]);\n\n return UpdatesChart;\n}(Chart);\nvar charts = {};\njquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-chart-name]').each(function () {\n var element = jquery__WEBPACK_IMPORTED_MODULE_0___default()(this);\n var name = element.data('chart-name') || '';\n var options = element.data('chart-options') || {};\n var data = element.data('chart-data') || {};\n\n if (name === 'updates') {\n charts[name] = new UpdatesChart(element, options, data);\n } else {\n charts[name] = new Chart(element, options, data);\n }\n});\nvar Instances = charts;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL2Rhc2hib2FyZC9jaGFydC5qcz8xZTg2Il0sIm5hbWVzIjpbImRlZmF1bHRzIiwiZGF0YSIsInNlcmllcyIsIm9wdGlvbnMiLCJQaWUiLCJkb251dCIsImRvbnV0V2lkdGgiLCJzdGFydEFuZ2xlIiwidG90YWwiLCJzaG93TGFiZWwiLCJoZWlnaHQiLCJjaGFydFBhZGRpbmciLCJCYXIiLCJheGlzWCIsInNob3dHcmlkIiwibGFiZWxPZmZzZXQiLCJ4IiwieSIsImF4aXNZIiwib2Zmc2V0Iiwic2NhbGVNaW5TcGFjZSIsIkNoYXJ0IiwiZWxlbWVudCIsIiQiLCJ0eXBlIiwidG9Mb3dlckNhc2UiLCJjaGFyQXQiLCJ0b1VwcGVyQ2FzZSIsInN1YnN0ciIsIk9iamVjdCIsImFzc2lnbiIsImNoYXJ0IiwiY2hhcnRpc3QiLCJmaW5kIiwiZW1wdHkiLCJvbiIsInJlbW92ZUNsYXNzIiwiZWFjaCIsImluZGV4IiwibGFiZWwiLCJ0ZXh0IiwiaHRtbCIsInJlcGxhY2UiLCJ1cGRhdGUiLCJVcGRhdGVzQ2hhcnQiLCJkcmF3IiwiZ3BtIiwicmVzcG9uc2UiLCJwYXlsb2FkIiwiZ3JhdiIsIm1pc3NpbmciLCJyZXNvdXJjZXMiLCJpc1VwZGF0YWJsZSIsImluc3RhbGxlZCIsInVwZGF0ZWQiLCJ1cGRhdGVEYXRhIiwidXBkYXRlcyIsIm5vdGljZSIsInRyYW5zbGF0aW9ucyIsInZhbHVlIiwiTWF0aCIsInJvdW5kIiwiY2xvc2VzdCIsImZhZGVJbiIsImNoYXJ0cyIsIm5hbWUiLCJJbnN0YW5jZXMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7Q0FHQTs7QUFFTyxJQUFNQSxRQUFRLEdBQUc7QUFDcEJDLE1BQUksRUFBRTtBQUNGQyxVQUFNLEVBQUUsQ0FBQyxHQUFELEVBQU0sQ0FBTjtBQUROLEdBRGM7QUFJcEJDLFNBQU8sRUFBRTtBQUNM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QUMsbUJBQUQsQ0FBRCxDQUF1QmMsSUFBdkIsQ0FBNEIsWUFBVztBQUNuQyxNQUFJZixPQUFPLEdBQUdDLDZDQUFDLENBQUMsSUFBRCxDQUFmO0FBQ0EsTUFBSTBDLElBQUksR0FBRzNDLE9BQU8sQ0FBQ3JCLElBQVIsQ0FBYSxZQUFiLEtBQThCLEVBQXpDO0FBQ0EsTUFBSUUsT0FBTyxHQUFHbUIsT0FBTyxDQUFDckIsSUFBUixDQUFhLGVBQWIsS0FBaUMsRUFBL0M7QUFDQSxNQUFJQSxJQUFJLEdBQUdxQixPQUFPLENBQUNyQixJQUFSLENBQWEsWUFBYixLQUE4QixFQUF6Qzs7QUFFQSxNQUFJZ0UsSUFBSSxLQUFLLFNBQWIsRUFBd0I7QUFDcEJELFVBQU0sQ0FBQ0MsSUFBRCxDQUFOLEdBQWUsSUFBSXJCLFlBQUosQ0FBaUJ0QixPQUFqQixFQUEwQm5CLE9BQTFCLEVBQW1DRixJQUFuQyxDQUFmO0FBQ0gsR0FGRCxNQUVPO0FBQ0grRCxVQUFNLENBQUNDLElBQUQsQ0FBTixHQUFlLElBQUk1QyxLQUFKLENBQVVDLE9BQVYsRUFBbUJuQixPQUFuQixFQUE0QkYsSUFBNUIsQ0FBZjtBQUNIO0FBQ0osQ0FYRDtBQWFPLElBQUlpRSxTQUFTLEdBQUdGLE1BQWhCIiwiZmlsZSI6Ii4vYXBwL2Rhc2hib2FyZC9jaGFydC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgY2hhcnRpc3QgZnJvbSAnY2hhcnRpc3QnO1xuaW1wb3J0IHsgdHJhbnNsYXRpb25zIH0gZnJvbSAnZ3Jhdi1jb25maWcnO1xuaW1wb3J0IHsgSW5zdGFuY2UgYXMgZ3BtIH0gZnJvbSAnLi4vdXRpbHMvZ3BtJztcbmltcG9ydCB7IEluc3RhbmNlIGFzIHVwZGF0ZXMgfSBmcm9tICcuLi91cGRhdGVzJztcblxuLy8gbGV0IGlzRmlyZWZveCA9IG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdmaXJlZm94JykgPiAtMTtcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRzID0ge1xuICAgIGRhdGE6IHtcbiAgICAgICAgc2VyaWVzOiBbMTAwLCAwXVxuICAgIH0sXG4gICAgb3B0aW9uczoge1xuICAgICAgICBQaWU6IHtcbiAgICAgICAgICAgIGRvbnV0OiB0cnVlLFxuICAgICAgICAgICAgZG9udXRXaWR0aDogMTAsXG4gICAgICAgICAgICBzdGFydEFuZ2xlOiAwLFxuICAgICAgICAgICAgdG90YWw6IDEwMCxcbiAgICAgICAgICAgIHNob3dMYWJlbDogZmFsc2UsXG4gICAgICAgICAgICBoZWlnaHQ6IDE1MCxcbiAgICAgICAgICAgIC8vIGNoYXJ0UGFkZGluZzogIWlzRmlyZWZveCA/IDEwIDogMjUgLy8gd29ya2Fyb3VuZCBmb3Igb2xkZXIgdmVyc2lvbnMgb2YgZmlyZWZveFxuICAgICAgICAgICAgY2hhcnRQYWRkaW5nOiA1XG4gICAgICAgIH0sXG4gICAgICAgIEJhcjoge1xuICAgICAgICAgICAgaGVpZ2h0OiAxNjQsXG4gICAgICAgICAgICBjaGFydFBhZGRpbmc6IDIwLCAvLyB3b3JrYXJvdW5kIGZvciBvbGRlciB2ZXJzaW9ucyBvZiBmaXJlZm94XG5cbiAgICAgICAgICAgIGF4aXNYOiB7XG4gICAgICAgICAgICAgICAgc2hvd0dyaWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGxhYmVsT2Zmc2V0OiB7XG4gICAgICAgICAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICAgICAgICAgIHk6IDBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXhpc1k6IHtcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IDE1LFxuICAgICAgICAgICAgICAgIHNob3dMYWJlbDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBzaG93R3JpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBsYWJlbE9mZnNldDoge1xuICAgICAgICAgICAgICAgICAgICB4OiA1LFxuICAgICAgICAgICAgICAgICAgICB5OiA1XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzY2FsZU1pblNwYWNlOiAyNVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2hhcnQge1xuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQsIG9wdGlvbnMgPSB7fSwgZGF0YSA9IHt9KSB7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9ICQoZWxlbWVudCkgfHwgW107XG4gICAgICAgIGlmICghdGhpcy5lbGVtZW50WzBdKSB7IHJldHVybjsgfVxuXG4gICAgICAgIGxldCB0eXBlID0gKHRoaXMuZWxlbWVudC5kYXRhKCdjaGFydC10eXBlJykgfHwgJ3BpZScpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0eXBlLnN1YnN0cigxKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0cy5vcHRpb25zW3RoaXMudHlwZV0sIG9wdGlvbnMpO1xuICAgICAgICBkYXRhID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdHMuZGF0YSwgZGF0YSk7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywge1xuICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgIGRhdGFcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY2hhcnQgPSBjaGFydGlzdFt0aGlzLnR5cGVdKHRoaXMuZWxlbWVudC5maW5kKCcuY3QtY2hhcnQnKS5lbXB0eSgpWzBdLCB0aGlzLmRhdGEsIHRoaXMub3B0aW9ucyk7XG4gICAgICAgIHRoaXMuY2hhcnQub24oJ2NyZWF0ZWQnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuZmluZCgnLmhpZGRlbicpLnJlbW92ZUNsYXNzKCdoaWRkZW4nKTtcblxuICAgICAgICAgICAgLy8gRklYOiB3b3JrYXJvdW5kIGZvciBjaGFydGlzdCBpc3N1ZSBub3QgYWxsb3dpbmcgSFRNTCBpbiBsYWJlbHMgYW55bW9yZVxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2dpb25rdW56L2NoYXJ0aXN0LWpzL2lzc3Vlcy85MzdcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCcuY3QtbGFiZWwnKS5lYWNoKChpbmRleCwgbGFiZWwpID0+IHtcbiAgICAgICAgICAgICAgICBsYWJlbCA9ICQobGFiZWwpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRleHQgPSBsYWJlbC5odG1sKCkucmVwbGFjZSgnJmx0OycsICc8JykucmVwbGFjZSgnJmd0OycsICc+Jyk7XG4gICAgICAgICAgICAgICAgbGFiZWwuaHRtbCh0ZXh0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB1cGRhdGVEYXRhKGRhdGEpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLmRhdGEsIGRhdGEpO1xuICAgICAgICB0aGlzLmNoYXJ0LnVwZGF0ZSh0aGlzLmRhdGEpO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjbGFzcyBVcGRhdGVzQ2hhcnQgZXh0ZW5kcyBDaGFydCB7XG4gICAgY29uc3RydWN0b3IoZWxlbWVudCwgb3B0aW9ucyA9IHt9LCBkYXRhID0ge30pIHtcbiAgICAgICAgc3VwZXIoZWxlbWVudCwgb3B0aW9ucywgZGF0YSk7XG5cbiAgICAgICAgdGhpcy5jaGFydC5vbignZHJhdycsIChkYXRhKSA9PiB0aGlzLmRyYXcoZGF0YSkpO1xuXG4gICAgICAgIGdwbS5vbignZmV0Y2hlZCcsIChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5wYXlsb2FkKSB7IHJldHVybjsgfVxuXG4gICAgICAgICAgICBsZXQgcGF5bG9hZCA9IHJlc3BvbnNlLnBheWxvYWQuZ3JhdjtcbiAgICAgICAgICAgIGxldCBtaXNzaW5nID0gKHJlc3BvbnNlLnBheWxvYWQucmVzb3VyY2VzLnRvdGFsICsgKHBheWxvYWQuaXNVcGRhdGFibGUgPyAxIDogMCkpICogMTAwIC8gKHJlc3BvbnNlLnBheWxvYWQuaW5zdGFsbGVkICsgKHBheWxvYWQuaXNVcGRhdGFibGUgPyAxIDogMCkpO1xuICAgICAgICAgICAgbGV0IHVwZGF0ZWQgPSAxMDAgLSBtaXNzaW5nO1xuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZURhdGEoeyBzZXJpZXM6IFt1cGRhdGVkLCBtaXNzaW5nXSB9KTtcblxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnBheWxvYWQucmVzb3VyY2VzLnRvdGFsKSB7XG4gICAgICAgICAgICAgICAgdXBkYXRlcy5tYWludGVuYW5jZSgnc2hvdycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBkcmF3KGRhdGEpIHtcbiAgICAgICAgaWYgKGRhdGEuaW5kZXgpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgbGV0IG5vdGljZSA9IHRyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU5bZGF0YS52YWx1ZSA9PT0gMTAwID8gJ0ZVTExZX1VQREFURUQnIDogJ1VQREFURVNfQVZBSUxBQkxFJ107XG4gICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCcubnVtZXJpYyBzcGFuJykudGV4dChgJHtNYXRoLnJvdW5kKGRhdGEudmFsdWUpfSVgKTtcbiAgICAgICAgdGhpcy5lbGVtZW50LmZpbmQoJy5qc19fdXBkYXRlcy1hdmFpbGFibGUtZGVzY3JpcHRpb24nKS5odG1sKG5vdGljZSk7XG4gICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCcuaGlkZGVuJykucmVtb3ZlQ2xhc3MoJ2hpZGRlbicpO1xuICAgIH1cblxuICAgIHVwZGF0ZURhdGEoZGF0YSkge1xuICAgICAgICBzdXBlci51cGRhdGVEYXRhKGRhdGEpO1xuXG4gICAgICAgIC8vIG1pc3NpbmcgdXBkYXRlc1xuICAgICAgICBpZiAodGhpcy5kYXRhLnNlcmllc1swXSA8IDEwMCkge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmNsb3Nlc3QoJyN1cGRhdGVzJykuZmluZCgnW2RhdGEtdXBkYXRlLXBhY2thZ2VzXScpLmZhZGVJbigpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5sZXQgY2hhcnRzID0ge307XG5cbiQoJ1tkYXRhLWNoYXJ0LW5hbWVdJykuZWFjaChmdW5jdGlvbigpIHtcbiAgICBsZXQgZWxlbWVudCA9ICQodGhpcyk7XG4gICAgbGV0IG5hbWUgPSBlbGVtZW50LmRhdGEoJ2NoYXJ0LW5hbWUnKSB8fCAnJztcbiAgICBsZXQgb3B0aW9ucyA9IGVsZW1lbnQuZGF0YSgnY2hhcnQtb3B0aW9ucycpIHx8IHt9O1xuICAgIGxldCBkYXRhID0gZWxlbWVudC5kYXRhKCdjaGFydC1kYXRhJykgfHwge307XG5cbiAgICBpZiAobmFtZSA9PT0gJ3VwZGF0ZXMnKSB7XG4gICAgICAgIGNoYXJ0c1tuYW1lXSA9IG5ldyBVcGRhdGVzQ2hhcnQoZWxlbWVudCwgb3B0aW9ucywgZGF0YSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY2hhcnRzW25hbWVdID0gbmV3IENoYXJ0KGVsZW1lbnQsIG9wdGlvbnMsIGRhdGEpO1xuICAgIH1cbn0pO1xuXG5leHBvcnQgbGV0IEluc3RhbmNlcyA9IGNoYXJ0cztcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./app/dashboard/chart.js\n"); /***/ }), /***/ "./app/dashboard/index.js": -/*!********************************!* +/*!********************************!*\ !*** ./app/dashboard/index.js ***! \********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => __WEBPACK_DEFAULT_EXPORT__\n/* harmony export */ });\n/* harmony import */ var _chart__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./chart */ \"./app/dashboard/chart.js\");\n/* harmony import */ var _cache__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./cache */ \"./app/dashboard/cache.js\");\n/* harmony import */ var _backup__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./backup */ \"./app/dashboard/backup.js\");\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n Chart: {\n Chart: _chart__WEBPACK_IMPORTED_MODULE_0__.default,\n UpdatesChart: _chart__WEBPACK_IMPORTED_MODULE_0__.UpdatesChart,\n Instances: _chart__WEBPACK_IMPORTED_MODULE_0__.Instances\n },\n Cache: _cache__WEBPACK_IMPORTED_MODULE_1__.Instance\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL2Rhc2hib2FyZC9pbmRleC5qcz9hMTk1Il0sIm5hbWVzIjpbIkNoYXJ0IiwiVXBkYXRlc0NoYXJ0IiwiSW5zdGFuY2VzIiwiQ2FjaGUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFFQSxpRUFBZTtBQUNYQSxPQUFLLEVBQUU7QUFDSEEsU0FBSyxFQUFMQSwyQ0FERztBQUVIQyxnQkFBWSxFQUFaQSxnREFGRztBQUdIQyxhQUFTLEVBQVRBLDZDQUFTQTtBQUhOLEdBREk7QUFNWEMsT0FBSyxFQUFMQSw0Q0FBS0E7QUFOTSxDQUFmIiwiZmlsZSI6Ii4vYXBwL2Rhc2hib2FyZC9pbmRleC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBDaGFydCwgeyBVcGRhdGVzQ2hhcnQsIEluc3RhbmNlcyB9IGZyb20gJy4vY2hhcnQnO1xuaW1wb3J0IHsgSW5zdGFuY2UgYXMgQ2FjaGUgfSBmcm9tICcuL2NhY2hlJztcbmltcG9ydCAnLi9iYWNrdXAnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgQ2hhcnQ6IHtcbiAgICAgICAgQ2hhcnQsXG4gICAgICAgIFVwZGF0ZXNDaGFydCxcbiAgICAgICAgSW5zdGFuY2VzXG4gICAgfSxcbiAgICBDYWNoZVxufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./app/dashboard/index.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _chart__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./chart */ \"./app/dashboard/chart.js\");\n/* harmony import */ var _cache__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./cache */ \"./app/dashboard/cache.js\");\n/* harmony import */ var _backup__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./backup */ \"./app/dashboard/backup.js\");\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n Chart: {\n Chart: _chart__WEBPACK_IMPORTED_MODULE_0__.default,\n UpdatesChart: _chart__WEBPACK_IMPORTED_MODULE_0__.UpdatesChart,\n Instances: _chart__WEBPACK_IMPORTED_MODULE_0__.Instances\n },\n Cache: _cache__WEBPACK_IMPORTED_MODULE_1__.Instance\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL2Rhc2hib2FyZC9pbmRleC5qcz9hMTk1Il0sIm5hbWVzIjpbIkNoYXJ0IiwiVXBkYXRlc0NoYXJ0IiwiSW5zdGFuY2VzIiwiQ2FjaGUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFFQSxpRUFBZTtBQUNYQSxPQUFLLEVBQUU7QUFDSEEsU0FBSyxFQUFMQSwyQ0FERztBQUVIQyxnQkFBWSxFQUFaQSxnREFGRztBQUdIQyxhQUFTLEVBQVRBLDZDQUFTQTtBQUhOLEdBREk7QUFNWEMsT0FBSyxFQUFMQSw0Q0FBS0E7QUFOTSxDQUFmIiwiZmlsZSI6Ii4vYXBwL2Rhc2hib2FyZC9pbmRleC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBDaGFydCwgeyBVcGRhdGVzQ2hhcnQsIEluc3RhbmNlcyB9IGZyb20gJy4vY2hhcnQnO1xuaW1wb3J0IHsgSW5zdGFuY2UgYXMgQ2FjaGUgfSBmcm9tICcuL2NhY2hlJztcbmltcG9ydCAnLi9iYWNrdXAnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgQ2hhcnQ6IHtcbiAgICAgICAgQ2hhcnQsXG4gICAgICAgIFVwZGF0ZXNDaGFydCxcbiAgICAgICAgSW5zdGFuY2VzXG4gICAgfSxcbiAgICBDYWNoZVxufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./app/dashboard/index.js\n"); /***/ }), /***/ "./app/forms/fields/acl-picker.js": -/*!****************************************!* +/*!****************************************!*\ !*** ./app/forms/fields/acl-picker.js ***! \****************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { @@ -66,117 +66,128 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var jque /***/ }), /***/ "./app/forms/fields/array.js": -/*!***********************************!* +/*!***********************************!*\ !*** ./app/forms/fields/array.js ***! \***********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => /* binding */ ArrayField,\n/* harmony export */ \"Instance\": () => /* binding */ Instance\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var sortablejs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! sortablejs */ \"./node_modules/sortablejs/modular/sortable.complete.esm.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\nvar body = jquery__WEBPACK_IMPORTED_MODULE_0___default()('body');\n\nvar Template = /*#__PURE__*/function () {\n function Template(container) {\n _classCallCheck(this, Template);\n\n this.container = jquery__WEBPACK_IMPORTED_MODULE_0___default()(container);\n\n if (this.getName() === undefined) {\n this.container = this.container.closest('[data-grav-array-name]');\n }\n }\n\n _createClass(Template, [{\n key: \"getName\",\n value: function getName() {\n return this.container.data('grav-array-name') || '';\n }\n }, {\n key: \"getKeyPlaceholder\",\n value: function getKeyPlaceholder() {\n return this.container.data('grav-array-keyname') || 'Key';\n }\n }, {\n key: \"getValuePlaceholder\",\n value: function getValuePlaceholder() {\n return this.container.data('grav-array-valuename') || 'Value';\n }\n }, {\n key: \"isValueOnly\",\n value: function isValueOnly() {\n return this.container.find('[data-grav-array-mode=\"value_only\"]:first').length || false;\n }\n }, {\n key: \"isTextArea\",\n value: function isTextArea() {\n return this.container.data('grav-array-textarea') || false;\n }\n }, {\n key: \"shouldBeDisabled\",\n value: function shouldBeDisabled() {\n // check for toggleables, if field is toggleable and it's not enabled, render disabled\n var toggle = this.container.closest('.form-field').find('[data-grav-field=\"toggleable\"] input[type=\"checkbox\"]');\n return toggle.length && toggle.is(':not(:checked)');\n }\n }, {\n key: \"getNewRow\",\n value: function getNewRow() {\n var tpl = '';\n var value = this.isTextArea() ? \"\") : \"\");\n\n if (this.isValueOnly()) {\n tpl += \"\\n
\\n \\n \".concat(value, \"\\n \");\n } else {\n tpl += \"\\n
\\n \\n \\n \").concat(value, \"\\n \");\n }\n\n tpl += \"\\n \\n \\n
\";\n return tpl;\n }\n }]);\n\n return Template;\n}();\n\nvar ArrayField = /*#__PURE__*/function () {\n function ArrayField() {\n var _this = this;\n\n _classCallCheck(this, ArrayField);\n\n body.on('input', '[data-grav-array-type=\"key\"], [data-grav-array-type=\"value\"]', function (event) {\n return _this.actionInput(event);\n });\n body.on('click touch', '[data-grav-array-action]:not([data-grav-array-action=\"sort\"])', function (event) {\n return _this.actionEvent(event);\n });\n this.arrays = jquery__WEBPACK_IMPORTED_MODULE_0___default()();\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-grav-field=\"array\"]').each(function (index, list) {\n return _this.addArray(list);\n });\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('body').on('mutation._grav', this._onAddedNodes.bind(this));\n }\n\n _createClass(ArrayField, [{\n key: \"addArray\",\n value: function addArray(list) {\n var _this2 = this;\n\n list = jquery__WEBPACK_IMPORTED_MODULE_0___default()(list);\n list.find('[data-grav-array-type=\"container\"]').each(function (index, container) {\n container = jquery__WEBPACK_IMPORTED_MODULE_0___default()(container);\n\n if (container.data('array-sort') || container[0].hasAttribute('data-array-nosort')) {\n return;\n }\n\n container.data('array-sort', new sortablejs__WEBPACK_IMPORTED_MODULE_1__.default(container.get(0), {\n handle: '.fa-bars',\n animation: 150,\n onUpdate: function onUpdate() {\n var item = container.find('[data-grav-array-type=\"row\"]:first');\n\n _this2._setTemplate(item);\n\n var template = item.data('array-template');\n\n _this2.refreshNames(template);\n }\n }));\n });\n }\n }, {\n key: \"actionInput\",\n value: function actionInput(event) {\n var element = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.target);\n var type = element.data('grav-array-type');\n\n this._setTemplate(element);\n\n var template = element.data('array-template');\n var keyElement = type === 'key' ? element : element.siblings('[data-grav-array-type=\"key\"]:first');\n var valueElement = type === 'value' ? element : element.siblings('[data-grav-array-type=\"value\"]:first');\n var escaped_name = !template.isValueOnly() ? keyElement.val() : this.getIndexFor(element);\n escaped_name = escaped_name.toString().replace(/\\[/g, '%5B').replace(/]/g, '%5D');\n var name = \"\".concat(template.getName(), \"[\").concat(escaped_name, \"]\");\n\n if (!template.isValueOnly() && !keyElement.val() && !valueElement.val()) {\n valueElement.attr('name', '');\n } else {\n // valueElement.attr('name', !valueElement.val() ? template.getName() : name);\n valueElement.attr('name', name);\n }\n\n this.refreshNames(template);\n }\n }, {\n key: \"actionEvent\",\n value: function actionEvent(event) {\n event && event.preventDefault();\n var element = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.target);\n var action = element.data('grav-array-action');\n var container = element.parents('[data-grav-array-type=\"container\"]');\n\n this._setTemplate(element);\n\n this[\"\".concat(action, \"Action\")](element);\n var siblings = container.find('> div');\n container[siblings.length > 1 ? 'removeClass' : 'addClass']('one-child');\n }\n }, {\n key: \"addAction\",\n value: function addAction(element) {\n var template = element.data('array-template');\n var row = element.closest('[data-grav-array-type=\"row\"]');\n row.after(template.getNewRow());\n }\n }, {\n key: \"remAction\",\n value: function remAction(element) {\n var template = element.data('array-template');\n var row = element.closest('[data-grav-array-type=\"row\"]');\n var isLast = !row.siblings().length;\n\n if (isLast) {\n var newRow = jquery__WEBPACK_IMPORTED_MODULE_0___default()(template.getNewRow());\n row.after(newRow);\n newRow.find('[data-grav-array-type=\"value\"]:last').attr('name', template.getName());\n }\n\n row.remove();\n this.refreshNames(template);\n }\n }, {\n key: \"refreshNames\",\n value: function refreshNames(template) {\n if (!template.isValueOnly()) {\n return;\n }\n\n var row = template.container.find('> div > [data-grav-array-type=\"row\"]');\n var inputs = row.find('[name]:not([name=\"\"])');\n inputs.each(function (index, input) {\n input = jquery__WEBPACK_IMPORTED_MODULE_0___default()(input);\n var preserved_name = input.closest('[data-grav-array-name]');\n var name = \"\".concat(preserved_name.attr('data-grav-array-name'), \"[\").concat(index, \"]\");\n input.attr('name', name);\n });\n\n if (!inputs.length) {\n row.find('[data-grav-array-type=\"value\"]').attr('name', template.getName());\n }\n }\n }, {\n key: \"getIndexFor\",\n value: function getIndexFor(element) {\n var template = element.data('array-template');\n var row = element.closest('[data-grav-array-type=\"row\"]');\n return template.container.find(\"\".concat(template.isValueOnly() ? '> div ' : '', \" > [data-grav-array-type=\\\"row\\\"]\")).index(row);\n }\n }, {\n key: \"_setTemplate\",\n value: function _setTemplate(element) {\n if (!element.data('array-template')) {\n element.data('array-template', new Template(element.closest('[data-grav-array-name]')));\n }\n }\n }, {\n key: \"_onAddedNodes\",\n value: function _onAddedNodes(event, target\n /* , record, instance */\n ) {\n var _this3 = this;\n\n var arrays = jquery__WEBPACK_IMPORTED_MODULE_0___default()(target).find('[data-grav-field=\"array\"]');\n\n if (!arrays.length) {\n return;\n }\n\n arrays.each(function (index, list) {\n list = jquery__WEBPACK_IMPORTED_MODULE_0___default()(list);\n\n if (!~_this3.arrays.index(list)) {\n _this3.addArray(list);\n }\n });\n }\n }]);\n\n return ArrayField;\n}();\n\n\nvar Instance = new ArrayField();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL2Zvcm1zL2ZpZWxkcy9hcnJheS5qcz8zODRhIl0sIm5hbWVzIjpbImJvZHkiLCIkIiwiVGVtcGxhdGUiLCJjb250YWluZXIiLCJnZXROYW1lIiwidW5kZWZpbmVkIiwiY2xvc2VzdCIsImRhdGEiLCJmaW5kIiwibGVuZ3RoIiwidG9nZ2xlIiwiaXMiLCJ0cGwiLCJ2YWx1ZSIsImlzVGV4dEFyZWEiLCJzaG91bGRCZURpc2FibGVkIiwiZ2V0VmFsdWVQbGFjZWhvbGRlciIsImlzVmFsdWVPbmx5IiwiZ2V0S2V5UGxhY2Vob2xkZXIiLCJBcnJheUZpZWxkIiwib24iLCJldmVudCIsImFjdGlvbklucHV0IiwiYWN0aW9uRXZlbnQiLCJhcnJheXMiLCJlYWNoIiwiaW5kZXgiLCJsaXN0IiwiYWRkQXJyYXkiLCJfb25BZGRlZE5vZGVzIiwiYmluZCIsImhhc0F0dHJpYnV0ZSIsIlNvcnRhYmxlIiwiZ2V0IiwiaGFuZGxlIiwiYW5pbWF0aW9uIiwib25VcGRhdGUiLCJpdGVtIiwiX3NldFRlbXBsYXRlIiwidGVtcGxhdGUiLCJyZWZyZXNoTmFtZXMiLCJlbGVtZW50IiwidGFyZ2V0IiwidHlwZSIsImtleUVsZW1lbnQiLCJzaWJsaW5ncyIsInZhbHVlRWxlbWVudCIsImVzY2FwZWRfbmFtZSIsInZhbCIsImdldEluZGV4Rm9yIiwidG9TdHJpbmciLCJyZXBsYWNlIiwibmFtZSIsImF0dHIiLCJwcmV2ZW50RGVmYXVsdCIsImFjdGlvbiIsInBhcmVudHMiLCJyb3ciLCJhZnRlciIsImdldE5ld1JvdyIsImlzTGFzdCIsIm5ld1JvdyIsInJlbW92ZSIsImlucHV0cyIsImlucHV0IiwicHJlc2VydmVkX25hbWUiLCJJbnN0YW5jZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBRUEsSUFBSUEsSUFBSSxHQUFHQyw2Q0FBQyxDQUFDLE1BQUQsQ0FBWjs7SUFFTUMsUTtBQUNGLG9CQUFZQyxTQUFaLEVBQXVC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QUNsQyxJQUFSLENBQWEsZ0JBQWIsRUFBK0IsSUFBSUwsUUFBSixDQUFhdUMsT0FBTyxDQUFDbkMsT0FBUixDQUFnQix3QkFBaEIsQ0FBYixDQUEvQjtBQUNIO0FBQ0o7OztrQ0FFYWUsSyxFQUFPcUI7QUFBTTtNQUEwQjtBQUFBOztBQUNqRCxVQUFJbEIsTUFBTSxHQUFHdkIsNkNBQUMsQ0FBQ3lDLE1BQUQsQ0FBRCxDQUFVbEMsSUFBVixDQUFlLDJCQUFmLENBQWI7O0FBQ0EsVUFBSSxDQUFDZ0IsTUFBTSxDQUFDZixNQUFaLEVBQW9CO0FBQUU7QUFBUzs7QUFFL0JlLFlBQU0sQ0FBQ0MsSUFBUCxDQUFZLFVBQUNDLEtBQUQsRUFBUUMsSUFBUixFQUFpQjtBQUN6QkEsWUFBSSxHQUFHMUIsNkNBQUMsQ0FBQzBCLElBQUQsQ0FBUjs7QUFDQSxZQUFJLENBQUMsQ0FBQyxNQUFJLENBQUNILE1BQUwsQ0FBWUUsS0FBWixDQUFrQkMsSUFBbEIsQ0FBTixFQUErQjtBQUMzQixnQkFBSSxDQUFDQyxRQUFMLENBQWNELElBQWQ7QUFDSDtBQUNKLE9BTEQ7QUFNSDs7Ozs7OztBQUdFLElBQUl1QyxRQUFRLEdBQUcsSUFBSS9DLFVBQUosRUFBZiIsImZpbGUiOiIuL2FwcC9mb3Jtcy9maWVsZHMvYXJyYXkuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IFNvcnRhYmxlIGZyb20gJ3NvcnRhYmxlanMnO1xuXG5sZXQgYm9keSA9ICQoJ2JvZHknKTtcblxuY2xhc3MgVGVtcGxhdGUge1xuICAgIGNvbnN0cnVjdG9yKGNvbnRhaW5lcikge1xuICAgICAgICB0aGlzLmNvbnRhaW5lciA9ICQoY29udGFpbmVyKTtcblxuICAgICAgICBpZiAodGhpcy5nZXROYW1lKCkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIgPSB0aGlzLmNvbnRhaW5lci5jbG9zZXN0KCdbZGF0YS1ncmF2LWFycmF5LW5hbWVdJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXROYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXIuZGF0YSgnZ3Jhdi1hcnJheS1uYW1lJykgfHwgJyc7XG4gICAgfVxuXG4gICAgZ2V0S2V5UGxhY2Vob2xkZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lci5kYXRhKCdncmF2LWFycmF5LWtleW5hbWUnKSB8fCAnS2V5JztcbiAgICB9XG5cbiAgICBnZXRWYWx1ZVBsYWNlaG9sZGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXIuZGF0YSgnZ3Jhdi1hcnJheS12YWx1ZW5hbWUnKSB8fCAnVmFsdWUnO1xuICAgIH1cblxuICAgIGlzVmFsdWVPbmx5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXIuZmluZCgnW2RhdGEtZ3Jhdi1hcnJheS1tb2RlPVwidmFsdWVfb25seVwiXTpmaXJzdCcpLmxlbmd0aCB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICBpc1RleHRBcmVhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXIuZGF0YSgnZ3Jhdi1hcnJheS10ZXh0YXJlYScpIHx8IGZhbHNlO1xuICAgIH1cblxuICAgIHNob3VsZEJlRGlzYWJsZWQoKSB7XG4gICAgICAgIC8vIGNoZWNrIGZvciB0b2dnbGVhYmxlcywgaWYgZmllbGQgaXMgdG9nZ2xlYWJsZSBhbmQgaXQncyBub3QgZW5hYmxlZCwgcmVuZGVyIGRpc2FibGVkXG4gICAgICAgIGxldCB0b2dnbGUgPSB0aGlzLmNvbnRhaW5lci5jbG9zZXN0KCcuZm9ybS1maWVsZCcpLmZpbmQoJ1tkYXRhLWdyYXYtZmllbGQ9XCJ0b2dnbGVhYmxlXCJdIGlucHV0W3R5cGU9XCJjaGVja2JveFwiXScpO1xuICAgICAgICByZXR1cm4gdG9nZ2xlLmxlbmd0aCAmJiB0b2dnbGUuaXMoJzpub3QoOmNoZWNrZWQpJyk7XG4gICAgfVxuXG4gICAgZ2V0TmV3Um93KCkge1xuICAgICAgICBsZXQgdHBsID0gJyc7Y29uc3QgdmFsdWUgPSB0aGlzLmlzVGV4dEFyZWEoKVxuICAgICAgICAgICAgPyBgPHRleHRhcmVhICR7dGhpcy5zaG91bGRCZURpc2FibGVkKCkgPyAnZGlzYWJsZWQ9XCJkaXNhYmxlZFwiJyA6ICcnfSBkYXRhLWdyYXYtYXJyYXktdHlwZT1cInZhbHVlXCIgbmFtZT1cIlwiIHBsYWNlaG9sZGVyPVwiJHt0aGlzLmdldFZhbHVlUGxhY2Vob2xkZXIoKX1cIj48L3RleHRhcmVhPmBcbiAgICAgICAgICAgIDogYDxpbnB1dCAke3RoaXMuc2hvdWxkQmVEaXNhYmxlZCgpID8gJ2Rpc2FibGVkPVwiZGlzYWJsZWRcIicgOiAnJ30gZGF0YS1ncmF2LWFycmF5LXR5cGU9XCJ2YWx1ZVwiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cIlwiIHZhbHVlPVwiXCIgIHBsYWNlaG9sZGVyPVwiJHt0aGlzLmdldFZhbHVlUGxhY2Vob2xkZXIoKX1cIiAvPmA7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNWYWx1ZU9ubHkoKSkge1xuICAgICAgICAgICAgdHBsICs9IGBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXJvdyBhcnJheS1maWVsZC12YWx1ZV9vbmx5XCIgZGF0YS1ncmF2LWFycmF5LXR5cGU9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWdyYXYtYXJyYXktYWN0aW9uPVwic29ydFwiIGNsYXNzPVwiZmEgZmEtYmFyc1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAke3ZhbHVlfVxuICAgICAgICAgICAgYDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRwbCArPSBgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1yb3dcIiBkYXRhLWdyYXYtYXJyYXktdHlwZT1cInJvd1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtZ3Jhdi1hcnJheS1hY3Rpb249XCJzb3J0XCIgY2xhc3M9XCJmYSBmYS1iYXJzXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxpbnB1dCAke3RoaXMuc2hvdWxkQmVEaXNhYmxlZCgpID8gJ2Rpc2FibGVkPVwiZGlzYWJsZWRcIicgOiAnJ30gZGF0YS1ncmF2LWFycmF5LXR5cGU9XCJrZXlcIiB0eXBlPVwidGV4dFwiIHZhbHVlPVwiXCIgcGxhY2Vob2xkZXI9XCIke3RoaXMuZ2V0S2V5UGxhY2Vob2xkZXIoKX1cIiAvPlxuICAgICAgICAgICAgICAgICR7dmFsdWV9XG4gICAgICAgICAgICBgO1xuICAgICAgICB9XG5cbiAgICAgICAgdHBsICs9IGBcbiAgICAgICAgICAgIDxzcGFuIGRhdGEtZ3Jhdi1hcnJheS1hY3Rpb249XCJyZW1cIiBjbGFzcz1cImZhIGZhLW1pbnVzXCI+PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gZGF0YS1ncmF2LWFycmF5LWFjdGlvbj1cImFkZFwiIGNsYXNzPVwiZmEgZmEtcGx1c1wiPjwvc3Bhbj5cbiAgICAgICAgPC9kaXY+YDtcblxuICAgICAgICByZXR1cm4gdHBsO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXJyYXlGaWVsZCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGJvZHkub24oJ2lucHV0JywgJ1tkYXRhLWdyYXYtYXJyYXktdHlwZT1cImtleVwiXSwgW2RhdGEtZ3Jhdi1hcnJheS10eXBlPVwidmFsdWVcIl0nLCAoZXZlbnQpID0+IHRoaXMuYWN0aW9uSW5wdXQoZXZlbnQpKTtcbiAgICAgICAgYm9keS5vbignY2xpY2sgdG91Y2gnLCAnW2RhdGEtZ3Jhdi1hcnJheS1hY3Rpb25dOm5vdChbZGF0YS1ncmF2LWFycmF5LWFjdGlvbj1cInNvcnRcIl0pJywgKGV2ZW50KSA9PiB0aGlzLmFjdGlvbkV2ZW50KGV2ZW50KSk7XG5cbiAgICAgICAgdGhpcy5hcnJheXMgPSAkKCk7XG5cbiAgICAgICAgJCgnW2RhdGEtZ3Jhdi1maWVsZD1cImFycmF5XCJdJykuZWFjaCgoaW5kZXgsIGxpc3QpID0+IHRoaXMuYWRkQXJyYXkobGlzdCkpO1xuICAgICAgICAkKCdib2R5Jykub24oJ211dGF0aW9uLl9ncmF2JywgdGhpcy5fb25BZGRlZE5vZGVzLmJpbmQodGhpcykpO1xuICAgIH1cblxuICAgIGFkZEFycmF5KGxpc3QpIHtcbiAgICAgICAgbGlzdCA9ICQobGlzdCk7XG5cbiAgICAgICAgbGlzdC5maW5kKCdbZGF0YS1ncmF2LWFycmF5LXR5cGU9XCJjb250YWluZXJcIl0nKS5lYWNoKChpbmRleCwgY29udGFpbmVyKSA9PiB7XG4gICAgICAgICAgICBjb250YWluZXIgPSAkKGNvbnRhaW5lcik7XG4gICAgICAgICAgICBpZiAoY29udGFpbmVyLmRhdGEoJ2FycmF5LXNvcnQnKSB8fCBjb250YWluZXJbMF0uaGFzQXR0cmlidXRlKCdkYXRhLWFycmF5LW5vc29ydCcpKSB7IHJldHVybjsgfVxuXG4gICAgICAgICAgICBjb250YWluZXIuZGF0YSgnYXJyYXktc29ydCcsIG5ldyBTb3J0YWJsZShjb250YWluZXIuZ2V0KDApLCB7XG4gICAgICAgICAgICAgICAgaGFuZGxlOiAnLmZhLWJhcnMnLFxuICAgICAgICAgICAgICAgIGFuaW1hdGlvbjogMTUwLFxuICAgICAgICAgICAgICAgIG9uVXBkYXRlOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBjb250YWluZXIuZmluZCgnW2RhdGEtZ3Jhdi1hcnJheS10eXBlPVwicm93XCJdOmZpcnN0Jyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NldFRlbXBsYXRlKGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IGl0ZW0uZGF0YSgnYXJyYXktdGVtcGxhdGUnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoTmFtZXModGVtcGxhdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYWN0aW9uSW5wdXQoZXZlbnQpIHtcbiAgICAgICAgbGV0IGVsZW1lbnQgPSAkKGV2ZW50LnRhcmdldCk7XG4gICAgICAgIGxldCB0eXBlID0gZWxlbWVudC5kYXRhKCdncmF2LWFycmF5LXR5cGUnKTtcblxuICAgICAgICB0aGlzLl9zZXRUZW1wbGF0ZShlbGVtZW50KTtcblxuICAgICAgICBsZXQgdGVtcGxhdGUgPSBlbGVtZW50LmRhdGEoJ2FycmF5LXRlbXBsYXRlJyk7XG4gICAgICAgIGxldCBrZXlFbGVtZW50ID0gdHlwZSA9PT0gJ2tleScgPyBlbGVtZW50IDogZWxlbWVudC5zaWJsaW5ncygnW2RhdGEtZ3Jhdi1hcnJheS10eXBlPVwia2V5XCJdOmZpcnN0Jyk7XG4gICAgICAgIGxldCB2YWx1ZUVsZW1lbnQgPSB0eXBlID09PSAndmFsdWUnID8gZWxlbWVudCA6IGVsZW1lbnQuc2libGluZ3MoJ1tkYXRhLWdyYXYtYXJyYXktdHlwZT1cInZhbHVlXCJdOmZpcnN0Jyk7XG5cbiAgICAgICAgbGV0IGVzY2FwZWRfbmFtZSA9ICF0ZW1wbGF0ZS5pc1ZhbHVlT25seSgpID8ga2V5RWxlbWVudC52YWwoKSA6IHRoaXMuZ2V0SW5kZXhGb3IoZWxlbWVudCk7XG4gICAgICAgIGVzY2FwZWRfbmFtZSA9IGVzY2FwZWRfbmFtZS50b1N0cmluZygpLnJlcGxhY2UoL1xcWy9nLCAnJTVCJykucmVwbGFjZSgvXS9nLCAnJTVEJyk7XG4gICAgICAgIGxldCBuYW1lID0gYCR7dGVtcGxhdGUuZ2V0TmFtZSgpfVske2VzY2FwZWRfbmFtZX1dYDtcblxuICAgICAgICBpZiAoIXRlbXBsYXRlLmlzVmFsdWVPbmx5KCkgJiYgKCFrZXlFbGVtZW50LnZhbCgpICYmICF2YWx1ZUVsZW1lbnQudmFsKCkpKSB7XG4gICAgICAgICAgICB2YWx1ZUVsZW1lbnQuYXR0cignbmFtZScsICcnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHZhbHVlRWxlbWVudC5hdHRyKCduYW1lJywgIXZhbHVlRWxlbWVudC52YWwoKSA/IHRlbXBsYXRlLmdldE5hbWUoKSA6IG5hbWUpO1xuICAgICAgICAgICAgdmFsdWVFbGVtZW50LmF0dHIoJ25hbWUnLCBuYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVmcmVzaE5hbWVzKHRlbXBsYXRlKTtcbiAgICB9XG5cbiAgICBhY3Rpb25FdmVudChldmVudCkge1xuICAgICAgICBldmVudCAmJiBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBsZXQgZWxlbWVudCA9ICQoZXZlbnQudGFyZ2V0KTtcbiAgICAgICAgbGV0IGFjdGlvbiA9IGVsZW1lbnQuZGF0YSgnZ3Jhdi1hcnJheS1hY3Rpb24nKTtcbiAgICAgICAgbGV0IGNvbnRhaW5lciA9IGVsZW1lbnQucGFyZW50cygnW2RhdGEtZ3Jhdi1hcnJheS10eXBlPVwiY29udGFpbmVyXCJdJyk7XG5cbiAgICAgICAgdGhpcy5fc2V0VGVtcGxhdGUoZWxlbWVudCk7XG5cbiAgICAgICAgdGhpc1tgJHthY3Rpb259QWN0aW9uYF0oZWxlbWVudCk7XG5cbiAgICAgICAgbGV0IHNpYmxpbmdzID0gY29udGFpbmVyLmZpbmQoJz4gZGl2Jyk7XG4gICAgICAgIGNvbnRhaW5lcltzaWJsaW5ncy5sZW5ndGggPiAxID8gJ3JlbW92ZUNsYXNzJyA6ICdhZGRDbGFzcyddKCdvbmUtY2hpbGQnKTtcbiAgICB9XG5cbiAgICBhZGRBY3Rpb24oZWxlbWVudCkge1xuICAgICAgICBsZXQgdGVtcGxhdGUgPSBlbGVtZW50LmRhdGEoJ2FycmF5LXRlbXBsYXRlJyk7XG4gICAgICAgIGxldCByb3cgPSBlbGVtZW50LmNsb3Nlc3QoJ1tkYXRhLWdyYXYtYXJyYXktdHlwZT1cInJvd1wiXScpO1xuXG4gICAgICAgIHJvdy5hZnRlcih0ZW1wbGF0ZS5nZXROZXdSb3coKSk7XG4gICAgfVxuXG4gICAgcmVtQWN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHRlbXBsYXRlID0gZWxlbWVudC5kYXRhKCdhcnJheS10ZW1wbGF0ZScpO1xuICAgICAgICBsZXQgcm93ID0gZWxlbWVudC5jbG9zZXN0KCdbZGF0YS1ncmF2LWFycmF5LXR5cGU9XCJyb3dcIl0nKTtcbiAgICAgICAgbGV0IGlzTGFzdCA9ICFyb3cuc2libGluZ3MoKS5sZW5ndGg7XG5cbiAgICAgICAgaWYgKGlzTGFzdCkge1xuICAgICAgICAgICAgbGV0IG5ld1JvdyA9ICQodGVtcGxhdGUuZ2V0TmV3Um93KCkpO1xuICAgICAgICAgICAgcm93LmFmdGVyKG5ld1Jvdyk7XG4gICAgICAgICAgICBuZXdSb3cuZmluZCgnW2RhdGEtZ3Jhdi1hcnJheS10eXBlPVwidmFsdWVcIl06bGFzdCcpLmF0dHIoJ25hbWUnLCB0ZW1wbGF0ZS5nZXROYW1lKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcm93LnJlbW92ZSgpO1xuICAgICAgICB0aGlzLnJlZnJlc2hOYW1lcyh0ZW1wbGF0ZSk7XG4gICAgfVxuXG4gICAgcmVmcmVzaE5hbWVzKHRlbXBsYXRlKSB7XG4gICAgICAgIGlmICghdGVtcGxhdGUuaXNWYWx1ZU9ubHkoKSkgeyByZXR1cm47IH1cblxuICAgICAgICBsZXQgcm93ID0gdGVtcGxhdGUuY29udGFpbmVyLmZpbmQoJz4gZGl2ID4gW2RhdGEtZ3Jhdi1hcnJheS10eXBlPVwicm93XCJdJyk7XG4gICAgICAgIGxldCBpbnB1dHMgPSByb3cuZmluZCgnW25hbWVdOm5vdChbbmFtZT1cIlwiXSknKTtcblxuICAgICAgICBpbnB1dHMuZWFjaCgoaW5kZXgsIGlucHV0KSA9PiB7XG4gICAgICAgICAgICBpbnB1dCA9ICQoaW5wdXQpO1xuICAgICAgICAgICAgY29uc3QgcHJlc2VydmVkX25hbWUgPSBpbnB1dC5jbG9zZXN0KCdbZGF0YS1ncmF2LWFycmF5LW5hbWVdJyk7XG4gICAgICAgICAgICBjb25zdCBuYW1lID0gYCR7cHJlc2VydmVkX25hbWUuYXR0cignZGF0YS1ncmF2LWFycmF5LW5hbWUnKX1bJHtpbmRleH1dYDtcbiAgICAgICAgICAgIGlucHV0LmF0dHIoJ25hbWUnLCBuYW1lKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCFpbnB1dHMubGVuZ3RoKSB7XG4gICAgICAgICAgICByb3cuZmluZCgnW2RhdGEtZ3Jhdi1hcnJheS10eXBlPVwidmFsdWVcIl0nKS5hdHRyKCduYW1lJywgdGVtcGxhdGUuZ2V0TmFtZSgpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldEluZGV4Rm9yKGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHRlbXBsYXRlID0gZWxlbWVudC5kYXRhKCdhcnJheS10ZW1wbGF0ZScpO1xuICAgICAgICBsZXQgcm93ID0gZWxlbWVudC5jbG9zZXN0KCdbZGF0YS1ncmF2LWFycmF5LXR5cGU9XCJyb3dcIl0nKTtcblxuICAgICAgICByZXR1cm4gdGVtcGxhdGUuY29udGFpbmVyLmZpbmQoYCR7dGVtcGxhdGUuaXNWYWx1ZU9ubHkoKSA/ICc+IGRpdiAnIDogJyd9ID4gW2RhdGEtZ3Jhdi1hcnJheS10eXBlPVwicm93XCJdYCkuaW5kZXgocm93KTtcbiAgICB9XG5cbiAgICBfc2V0VGVtcGxhdGUoZWxlbWVudCkge1xuICAgICAgICBpZiAoIWVsZW1lbnQuZGF0YSgnYXJyYXktdGVtcGxhdGUnKSkge1xuICAgICAgICAgICAgZWxlbWVudC5kYXRhKCdhcnJheS10ZW1wbGF0ZScsIG5ldyBUZW1wbGF0ZShlbGVtZW50LmNsb3Nlc3QoJ1tkYXRhLWdyYXYtYXJyYXktbmFtZV0nKSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX29uQWRkZWROb2RlcyhldmVudCwgdGFyZ2V0LyogLCByZWNvcmQsIGluc3RhbmNlICovKSB7XG4gICAgICAgIGxldCBhcnJheXMgPSAkKHRhcmdldCkuZmluZCgnW2RhdGEtZ3Jhdi1maWVsZD1cImFycmF5XCJdJyk7XG4gICAgICAgIGlmICghYXJyYXlzLmxlbmd0aCkgeyByZXR1cm47IH1cblxuICAgICAgICBhcnJheXMuZWFjaCgoaW5kZXgsIGxpc3QpID0+IHtcbiAgICAgICAgICAgIGxpc3QgPSAkKGxpc3QpO1xuICAgICAgICAgICAgaWYgKCF+dGhpcy5hcnJheXMuaW5kZXgobGlzdCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEFycmF5KGxpc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG5cbmV4cG9ydCBsZXQgSW5zdGFuY2UgPSBuZXcgQXJyYXlGaWVsZCgpO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./app/forms/fields/array.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ ArrayField),\n/* harmony export */ \"Instance\": () => (/* binding */ Instance)\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var sortablejs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! sortablejs */ \"./node_modules/sortablejs/modular/sortable.esm.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\nvar body = jquery__WEBPACK_IMPORTED_MODULE_0___default()('body');\n\nvar Template = /*#__PURE__*/function () {\n function Template(container) {\n _classCallCheck(this, Template);\n\n this.container = jquery__WEBPACK_IMPORTED_MODULE_0___default()(container);\n\n if (this.getName() === undefined) {\n this.container = this.container.closest('[data-grav-array-name]');\n }\n }\n\n _createClass(Template, [{\n key: \"getName\",\n value: function getName() {\n return this.container.data('grav-array-name') || '';\n }\n }, {\n key: \"getKeyPlaceholder\",\n value: function getKeyPlaceholder() {\n return this.container.data('grav-array-keyname') || 'Key';\n }\n }, {\n key: \"getValuePlaceholder\",\n value: function getValuePlaceholder() {\n return this.container.data('grav-array-valuename') || 'Value';\n }\n }, {\n key: \"isValueOnly\",\n value: function isValueOnly() {\n return this.container.find('[data-grav-array-mode=\"value_only\"]:first').length || false;\n }\n }, {\n key: \"isTextArea\",\n value: function isTextArea() {\n return this.container.data('grav-array-textarea') || false;\n }\n }, {\n key: \"shouldBeDisabled\",\n value: function shouldBeDisabled() {\n // check for toggleables, if field is toggleable and it's not enabled, render disabled\n var toggle = this.container.closest('.form-field').find('[data-grav-field=\"toggleable\"] input[type=\"checkbox\"]');\n return toggle.length && toggle.is(':not(:checked)');\n }\n }, {\n key: \"getNewRow\",\n value: function getNewRow() {\n var tpl = '';\n var value = this.isTextArea() ? \"\") : \"\");\n\n if (this.isValueOnly()) {\n tpl += \"\\n
\\n \\n \".concat(value, \"\\n \");\n } else {\n tpl += \"\\n
\\n \\n \\n \").concat(value, \"\\n \");\n }\n\n tpl += \"\\n \\n \\n
\";\n return tpl;\n }\n }]);\n\n return Template;\n}();\n\nvar ArrayField = /*#__PURE__*/function () {\n function ArrayField() {\n var _this = this;\n\n _classCallCheck(this, ArrayField);\n\n body.on('input', '[data-grav-array-type=\"key\"], [data-grav-array-type=\"value\"]', function (event) {\n return _this.actionInput(event);\n });\n body.on('click touch', '[data-grav-array-action]:not([data-grav-array-action=\"sort\"])', function (event) {\n return _this.actionEvent(event);\n });\n this.arrays = jquery__WEBPACK_IMPORTED_MODULE_0___default()();\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-grav-field=\"array\"]').each(function (index, list) {\n return _this.addArray(list);\n });\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('body').on('mutation._grav', this._onAddedNodes.bind(this));\n }\n\n _createClass(ArrayField, [{\n key: \"addArray\",\n value: function addArray(list) {\n var _this2 = this;\n\n list = jquery__WEBPACK_IMPORTED_MODULE_0___default()(list);\n list.find('[data-grav-array-type=\"container\"]').each(function (index, container) {\n container = jquery__WEBPACK_IMPORTED_MODULE_0___default()(container);\n\n if (container.data('array-sort') || container[0].hasAttribute('data-array-nosort')) {\n return;\n }\n\n container.data('array-sort', new sortablejs__WEBPACK_IMPORTED_MODULE_1__.default(container.get(0), {\n handle: '.fa-bars',\n animation: 150,\n onUpdate: function onUpdate() {\n var item = container.find('[data-grav-array-type=\"row\"]:first');\n\n _this2._setTemplate(item);\n\n var template = item.data('array-template');\n\n _this2.refreshNames(template);\n }\n }));\n });\n }\n }, {\n key: \"actionInput\",\n value: function actionInput(event) {\n var element = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.target);\n var type = element.data('grav-array-type');\n\n this._setTemplate(element);\n\n var template = element.data('array-template');\n var keyElement = type === 'key' ? element : element.siblings('[data-grav-array-type=\"key\"]:first');\n var valueElement = type === 'value' ? element : element.siblings('[data-grav-array-type=\"value\"]:first');\n var escaped_name = !template.isValueOnly() ? keyElement.val() : this.getIndexFor(element);\n escaped_name = escaped_name.toString().replace(/\\[/g, '%5B').replace(/]/g, '%5D');\n var name = \"\".concat(template.getName(), \"[\").concat(escaped_name, \"]\");\n\n if (!template.isValueOnly() && !keyElement.val() && !valueElement.val()) {\n valueElement.attr('name', '');\n } else {\n // valueElement.attr('name', !valueElement.val() ? template.getName() : name);\n valueElement.attr('name', name);\n }\n\n this.refreshNames(template);\n }\n }, {\n key: \"actionEvent\",\n value: function actionEvent(event) {\n event && event.preventDefault();\n var element = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.target);\n var action = element.data('grav-array-action');\n var container = element.parents('[data-grav-array-type=\"container\"]');\n\n this._setTemplate(element);\n\n this[\"\".concat(action, \"Action\")](element);\n var siblings = container.find('> div');\n container[siblings.length > 1 ? 'removeClass' : 'addClass']('one-child');\n }\n }, {\n key: \"addAction\",\n value: function addAction(element) {\n var template = element.data('array-template');\n var row = element.closest('[data-grav-array-type=\"row\"]');\n row.after(template.getNewRow());\n }\n }, {\n key: \"remAction\",\n value: function remAction(element) {\n var template = element.data('array-template');\n var row = element.closest('[data-grav-array-type=\"row\"]');\n var isLast = !row.siblings().length;\n\n if (isLast) {\n var newRow = jquery__WEBPACK_IMPORTED_MODULE_0___default()(template.getNewRow());\n row.after(newRow);\n newRow.find('[data-grav-array-type=\"value\"]:last').attr('name', template.getName());\n }\n\n row.remove();\n this.refreshNames(template);\n }\n }, {\n key: \"refreshNames\",\n value: function refreshNames(template) {\n if (!template.isValueOnly()) {\n return;\n }\n\n var row = template.container.find('> div > [data-grav-array-type=\"row\"]');\n var inputs = row.find('[name]:not([name=\"\"])');\n inputs.each(function (index, input) {\n input = jquery__WEBPACK_IMPORTED_MODULE_0___default()(input);\n var preserved_name = input.closest('[data-grav-array-name]');\n var name = \"\".concat(preserved_name.attr('data-grav-array-name'), \"[\").concat(index, \"]\");\n input.attr('name', name);\n });\n\n if (!inputs.length) {\n row.find('[data-grav-array-type=\"value\"]').attr('name', template.getName());\n }\n }\n }, {\n key: \"getIndexFor\",\n value: function getIndexFor(element) {\n var template = element.data('array-template');\n var row = element.closest('[data-grav-array-type=\"row\"]');\n return template.container.find(\"\".concat(template.isValueOnly() ? '> div ' : '', \" > [data-grav-array-type=\\\"row\\\"]\")).index(row);\n }\n }, {\n key: \"_setTemplate\",\n value: function _setTemplate(element) {\n if (!element.data('array-template')) {\n element.data('array-template', new Template(element.closest('[data-grav-array-name]')));\n }\n }\n }, {\n key: \"_onAddedNodes\",\n value: function _onAddedNodes(event, target\n /* , record, instance */\n ) {\n var _this3 = this;\n\n var arrays = jquery__WEBPACK_IMPORTED_MODULE_0___default()(target).find('[data-grav-field=\"array\"]');\n\n if (!arrays.length) {\n return;\n }\n\n arrays.each(function (index, list) {\n list = jquery__WEBPACK_IMPORTED_MODULE_0___default()(list);\n\n if (!~_this3.arrays.index(list)) {\n _this3.addArray(list);\n }\n });\n }\n }]);\n\n return ArrayField;\n}();\n\n\nvar Instance = new ArrayField();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL2Zvcm1zL2ZpZWxkcy9hcnJheS5qcz8zODRhIl0sIm5hbWVzIjpbImJvZHkiLCIkIiwiVGVtcGxhdGUiLCJjb250YWluZXIiLCJnZXROYW1lIiwidW5kZWZpbmVkIiwiY2xvc2VzdCIsImRhdGEiLCJmaW5kIiwibGVuZ3RoIiwidG9nZ2xlIiwiaXMiLCJ0cGwiLCJ2YWx1ZSIsImlzVGV4dEFyZWEiLCJzaG91bGRCZURpc2FibGVkIiwiZ2V0VmFsdWVQbGFjZWhvbGRlciIsImlzVmFsdWVPbmx5IiwiZ2V0S2V5UGxhY2Vob2xkZXIiLCJBcnJheUZpZWxkIiwib24iLCJldmVudCIsImFjdGlvbklucHV0IiwiYWN0aW9uRXZlbnQiLCJhcnJheXMiLCJlYWNoIiwiaW5kZXgiLCJsaXN0IiwiYWRkQXJyYXkiLCJfb25BZGRlZE5vZGVzIiwiYmluZCIsImhhc0F0dHJpYnV0ZSIsIlNvcnRhYmxlIiwiZ2V0IiwiaGFuZGxlIiwiYW5pbWF0aW9uIiwib25VcGRhdGUiLCJpdGVtIiwiX3NldFRlbXBsYXRlIiwidGVtcGxhdGUiLCJyZWZyZXNoTmFtZXMiLCJlbGVtZW50IiwidGFyZ2V0IiwidHlwZSIsImtleUVsZW1lbnQiLCJzaWJsaW5ncyIsInZhbHVlRWxlbWVudCIsImVzY2FwZWRfbmFtZSIsInZhbCIsImdldEluZGV4Rm9yIiwidG9TdHJpbmciLCJyZXBsYWNlIiwibmFtZSIsImF0dHIiLCJwcmV2ZW50RGVmYXVsdCIsImFjdGlvbiIsInBhcmVudHMiLCJyb3ciLCJhZnRlciIsImdldE5ld1JvdyIsImlzTGFzdCIsIm5ld1JvdyIsInJlbW92ZSIsImlucHV0cyIsImlucHV0IiwicHJlc2VydmVkX25hbWUiLCJJbnN0YW5jZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBRUEsSUFBSUEsSUFBSSxHQUFHQyw2Q0FBQyxDQUFDLE1BQUQsQ0FBWjs7SUFFTUMsUTtBQUNGLG9CQUFZQyxTQUFaLEVBQXVCO0FBQUE7O0FBQ25CLFNBQUtBLFNBQUwsR0FBaUJGLDZDQUFDLENBQUNFLFNBQUQsQ0FBbEI7O0FBRUEsUUFBSSxLQUFLQyxPQUFMLE9BQW1CQyxTQUF2QixFQUFrQztBQUM5QixXQUFLRixTQUFMLEdBQWlCLEtBQUtBLFNBQUwsQ0FBZUcsT0FBZixDQUF1Qix3QkFBdkIsQ0FBakI7QUFDSDtBQUNKOzs7O1dBRUQsbUJBQVU7QUFDTixhQUFPLEtBQUtILFNBQUwsQ0FBZUksSUFBZixDQUFvQixpQkFBcEIsS0FBMEMsRUFBakQ7QUFDSDs7O1dBRUQsNkJBQW9CO0FBQ2hCLGFBQU8sS0FBS0osU0FBTCxDQUFlSSxJQUFmLENBQW9CLG9CQUFwQixLQUE2QyxLQUFwRDtBQUNIOzs7V0FFRCwrQkFBc0I7QUFDbEIsYUFBTyxLQUFLSixTQUFMLENBQWVJLElBQWYsQ0FBb0Isc0JBQXBCLEtBQStDLE9BQXREO0FBQ0g7OztXQUVELHVCQUFjO0FBQ1YsYUFBTyxLQUFLSixTQUFMLENBQWVLLElBQWYsQ0FBb0IsMkNBQXBCLEVBQWlFQyxNQUFqRSxJQUEyRSxLQUFsRjtBQUNIOzs7V0FFRCxzQkFBYTtBQUNULGFBQU8sS0FBS04sU0FBTCxDQUFlSSxJQUFmLENBQW9CLHFCQUFwQixLQUE4QyxLQUFyRDtBQUNIOzs7V0FFRCw0QkFBbUI7QUFDZjtBQUNBLFVBQUlHLE1BQU0sR0FBRyxLQUFLUCxTQUFMLENBQWVHLE9BQWYsQ0FBdUIsYUFBdkIsRUFBc0NFLElBQXRDLENBQTJDLHVEQUEzQyxDQUFiO0FBQ0EsYUFBT0UsTUFBTSxDQUFDRCxNQUFQLElBQWlCQyxNQUFNLENBQUNDLEVBQVAsQ0FBVSxnQkFBVixDQUF4QjtBQUNIOzs7V0FFRCxxQkFBWTtBQUNSLFVBQUlDLEdBQUcsR0FBRyxFQUFWO0FBQWEsVUFBTUMsS0FBSyxHQUFHLEtBQUtDLFVBQUwseUJBQ1IsS0FBS0MsZ0JBQUwsS0FBMEIscUJBQTFCLEdBQWtELEVBRDFDLHFFQUNrRyxLQUFLQyxtQkFBTCxFQURsRyx1Q0FFWCxLQUFLRCxnQkFBTCxLQUEwQixxQkFBMUIsR0FBa0QsRUFGdkMsK0ZBRXFILEtBQUtDLG1CQUFMLEVBRnJILFVBQWQ7O0FBSWIsVUFBSSxLQUFLQyxXQUFMLEVBQUosRUFBd0I7QUFDcEJMLFdBQUcsOE1BR0dDLEtBSEgsbUJBQUg7QUFLSCxPQU5ELE1BTU87QUFDSEQsV0FBRyw4TEFHVSxLQUFLRyxnQkFBTCxLQUEwQixxQkFBMUIsR0FBa0QsRUFINUQsa0ZBRytILEtBQUtHLGlCQUFMLEVBSC9ILG9DQUlHTCxLQUpILG1CQUFIO0FBTUg7O0FBRURELFNBQUcscUxBQUg7QUFLQSxhQUFPQSxHQUFQO0FBQ0g7Ozs7OztJQUdnQk8sVTtBQUNqQix3QkFBYztBQUFBOztBQUFBOztBQUNWbkIsUUFBSSxDQUFDb0IsRUFBTCxDQUFRLE9BQVIsRUFBaUIsOERBQWpCLEVBQWlGLFVBQUNDLEtBQUQ7QUFBQSxhQUFXLEtBQUksQ0FBQ0MsV0FBTCxDQUFpQkQsS0FBakIsQ0FBWDtBQUFBLEtBQWpGO0FBQ0FyQixRQUFJLENBQUNvQixFQUFMLENBQVEsYUFBUixFQUF1QiwrREFBdkIsRUFBd0YsVUFBQ0MsS0FBRDtBQUFBLGFBQVcsS0FBSSxDQUFDRSxXQUFMLENBQWlCRixLQUFqQixDQUFYO0FBQUEsS0FBeEY7QUFFQSxTQUFLRyxNQUFMLEdBQWN2Qiw2Q0FBQyxFQUFmO0FBRUFBLGlEQUFDLENBQUMsMkJBQUQsQ0FBRCxDQUErQndCLElBQS9CLENBQW9DLFVBQUNDLEtBQUQsRUFBUUMsSUFBUjtBQUFBLGFBQWlCLEtBQUksQ0FBQ0MsUUFBTCxDQUFjRCxJQUFkLENBQWpCO0FBQUEsS0FBcEM7QUFDQTFCLGlEQUFDLENBQUMsTUFBRCxDQUFELENBQVVtQixFQUFWLENBQWEsZ0JBQWIsRUFBK0IsS0FBS1MsYUFBTCxDQUFtQkMsSUFBbkIsQ0FBd0IsSUFBeEIsQ0FBL0I7QUFDSDs7OztXQUVELGtCQUFTSCxJQUFULEVBQWU7QUFBQTs7QUFDWEEsVUFBSSxHQUFHMUIsNkNBQUMsQ0FBQzBCLElBQUQsQ0FBUjtBQUVBQSxVQUFJLENBQUNuQixJQUFMLENBQVUsb0NBQVYsRUFBZ0RpQixJQUFoRCxDQUFxRCxVQUFDQyxLQUFELEVBQVF2QixTQUFSLEVBQXNCO0FBQ3ZFQSxpQkFBUyxHQUFHRiw2Q0FBQyxDQUFDRSxTQUFELENBQWI7O0FBQ0EsWUFBSUEsU0FBUyxDQUFDSSxJQUFWLENBQWUsWUFBZixLQUFnQ0osU0FBUyxDQUFDLENBQUQsQ0FBVCxDQUFhNEIsWUFBYixDQUEwQixtQkFBMUIsQ0FBcEMsRUFBb0Y7QUFBRTtBQUFTOztBQUUvRjVCLGlCQUFTLENBQUNJLElBQVYsQ0FBZSxZQUFmLEVBQTZCLElBQUl5QiwrQ0FBSixDQUFhN0IsU0FBUyxDQUFDOEIsR0FBVixDQUFjLENBQWQsQ0FBYixFQUErQjtBQUN4REMsZ0JBQU0sRUFBRSxVQURnRDtBQUV4REMsbUJBQVMsRUFBRSxHQUY2QztBQUd4REMsa0JBQVEsRUFBRSxvQkFBTTtBQUNaLGdCQUFNQyxJQUFJLEdBQUdsQyxTQUFTLENBQUNLLElBQVYsQ0FBZSxvQ0FBZixDQUFiOztBQUNBLGtCQUFJLENBQUM4QixZQUFMLENBQWtCRCxJQUFsQjs7QUFDQSxnQkFBTUUsUUFBUSxHQUFHRixJQUFJLENBQUM5QixJQUFMLENBQVUsZ0JBQVYsQ0FBakI7O0FBQ0Esa0JBQUksQ0FBQ2lDLFlBQUwsQ0FBa0JELFFBQWxCO0FBQ0g7QUFSdUQsU0FBL0IsQ0FBN0I7QUFVSCxPQWREO0FBZUg7OztXQUVELHFCQUFZbEIsS0FBWixFQUFtQjtBQUNmLFVBQUlvQixPQUFPLEdBQUd4Qyw2Q0FBQyxDQUFDb0IsS0FBSyxDQUFDcUIsTUFBUCxDQUFmO0FBQ0EsVUFBSUMsSUFBSSxHQUFHRixPQUFPLENBQUNsQyxJQUFSLENBQWEsaUJBQWIsQ0FBWDs7QUFFQSxXQUFLK0IsWUFBTCxDQUFrQkcsT0FBbEI7O0FBRUEsVUFBSUYsUUFBUSxHQUFHRSxPQUFPLENBQUNsQyxJQUFSLENBQWEsZ0JBQWIsQ0FBZjtBQUNBLFVBQUlxQyxVQUFVLEdBQUdELElBQUksS0FBSyxLQUFULEdBQWlCRixPQUFqQixHQUEyQkEsT0FBTyxDQUFDSSxRQUFSLENBQWlCLG9DQUFqQixDQUE1QztBQUNBLFVBQUlDLFlBQVksR0FBR0gsSUFBSSxLQUFLLE9BQVQsR0FBbUJGLE9BQW5CLEdBQTZCQSxPQUFPLENBQUNJLFFBQVIsQ0FBaUIsc0NBQWpCLENBQWhEO0FBRUEsVUFBSUUsWUFBWSxHQUFHLENBQUNSLFFBQVEsQ0FBQ3RCLFdBQVQsRUFBRCxHQUEwQjJCLFVBQVUsQ0FBQ0ksR0FBWCxFQUExQixHQUE2QyxLQUFLQyxXQUFMLENBQWlCUixPQUFqQixDQUFoRTtBQUNBTSxrQkFBWSxHQUFHQSxZQUFZLENBQUNHLFFBQWIsR0FBd0JDLE9BQXhCLENBQWdDLEtBQWhDLEVBQXVDLEtBQXZDLEVBQThDQSxPQUE5QyxDQUFzRCxJQUF0RCxFQUE0RCxLQUE1RCxDQUFmO0FBQ0EsVUFBSUMsSUFBSSxhQUFNYixRQUFRLENBQUNuQyxPQUFULEVBQU4sY0FBNEIyQyxZQUE1QixNQUFSOztBQUVBLFVBQUksQ0FBQ1IsUUFBUSxDQUFDdEIsV0FBVCxFQUFELElBQTRCLENBQUMyQixVQUFVLENBQUNJLEdBQVgsRUFBRCxJQUFxQixDQUFDRixZQUFZLENBQUNFLEdBQWIsRUFBdEQsRUFBMkU7QUFDdkVGLG9CQUFZLENBQUNPLElBQWIsQ0FBa0IsTUFBbEIsRUFBMEIsRUFBMUI7QUFDSCxPQUZELE1BRU87QUFDSDtBQUNBUCxvQkFBWSxDQUFDTyxJQUFiLENBQWtCLE1BQWxCLEVBQTBCRCxJQUExQjtBQUNIOztBQUVELFdBQUtaLFlBQUwsQ0FBa0JELFFBQWxCO0FBQ0g7OztXQUVELHFCQUFZbEIsS0FBWixFQUFtQjtBQUNmQSxXQUFLLElBQUlBLEtBQUssQ0FBQ2lDLGNBQU4sRUFBVDtBQUNBLFVBQUliLE9BQU8sR0FBR3hDLDZDQUFDLENBQUNvQixLQUFLLENBQUNxQixNQUFQLENBQWY7QUFDQSxVQUFJYSxNQUFNLEdBQUdkLE9BQU8sQ0FBQ2xDLElBQVIsQ0FBYSxtQkFBYixDQUFiO0FBQ0EsVUFBSUosU0FBUyxHQUFHc0MsT0FBTyxDQUFDZSxPQUFSLENBQWdCLG9DQUFoQixDQUFoQjs7QUFFQSxXQUFLbEIsWUFBTCxDQUFrQkcsT0FBbEI7O0FBRUEscUJBQVFjLE1BQVIsYUFBd0JkLE9BQXhCO0FBRUEsVUFBSUksUUFBUSxHQUFHMUMsU0FBUyxDQUFDSyxJQUFWLENBQWUsT0FBZixDQUFmO0FBQ0FMLGVBQVMsQ0FBQzBDLFFBQVEsQ0FBQ3BDLE1BQVQsR0FBa0IsQ0FBbEIsR0FBc0IsYUFBdEIsR0FBc0MsVUFBdkMsQ0FBVCxDQUE0RCxXQUE1RDtBQUNIOzs7V0FFRCxtQkFBVWdDLE9BQVYsRUFBbUI7QUFDZixVQUFJRixRQUFRLEdBQUdFLE9BQU8sQ0FBQ2xDLElBQVIsQ0FBYSxnQkFBYixDQUFmO0FBQ0EsVUFBSWtELEdBQUcsR0FBR2hCLE9BQU8sQ0FBQ25DLE9BQVIsQ0FBZ0IsOEJBQWhCLENBQVY7QUFFQW1ELFNBQUcsQ0FBQ0MsS0FBSixDQUFVbkIsUUFBUSxDQUFDb0IsU0FBVCxFQUFWO0FBQ0g7OztXQUVELG1CQUFVbEIsT0FBVixFQUFtQjtBQUNmLFVBQUlGLFFBQVEsR0FBR0UsT0FBTyxDQUFDbEMsSUFBUixDQUFhLGdCQUFiLENBQWY7QUFDQSxVQUFJa0QsR0FBRyxHQUFHaEIsT0FBTyxDQUFDbkMsT0FBUixDQUFnQiw4QkFBaEIsQ0FBVjtBQUNBLFVBQUlzRCxNQUFNLEdBQUcsQ0FBQ0gsR0FBRyxDQUFDWixRQUFKLEdBQWVwQyxNQUE3Qjs7QUFFQSxVQUFJbUQsTUFBSixFQUFZO0FBQ1IsWUFBSUMsTUFBTSxHQUFHNUQsNkNBQUMsQ0FBQ3NDLFFBQVEsQ0FBQ29CLFNBQVQsRUFBRCxDQUFkO0FBQ0FGLFdBQUcsQ0FBQ0MsS0FBSixDQUFVRyxNQUFWO0FBQ0FBLGNBQU0sQ0FBQ3JELElBQVAsQ0FBWSxxQ0FBWixFQUFtRDZDLElBQW5ELENBQXdELE1BQXhELEVBQWdFZCxRQUFRLENBQUNuQyxPQUFULEVBQWhFO0FBQ0g7O0FBRURxRCxTQUFHLENBQUNLLE1BQUo7QUFDQSxXQUFLdEIsWUFBTCxDQUFrQkQsUUFBbEI7QUFDSDs7O1dBRUQsc0JBQWFBLFFBQWIsRUFBdUI7QUFDbkIsVUFBSSxDQUFDQSxRQUFRLENBQUN0QixXQUFULEVBQUwsRUFBNkI7QUFBRTtBQUFTOztBQUV4QyxVQUFJd0MsR0FBRyxHQUFHbEIsUUFBUSxDQUFDcEMsU0FBVCxDQUFtQkssSUFBbkIsQ0FBd0Isc0NBQXhCLENBQVY7QUFDQSxVQUFJdUQsTUFBTSxHQUFHTixHQUFHLENBQUNqRCxJQUFKLENBQVMsdUJBQVQsQ0FBYjtBQUVBdUQsWUFBTSxDQUFDdEMsSUFBUCxDQUFZLFVBQUNDLEtBQUQsRUFBUXNDLEtBQVIsRUFBa0I7QUFDMUJBLGFBQUssR0FBRy9ELDZDQUFDLENBQUMrRCxLQUFELENBQVQ7QUFDQSxZQUFNQyxjQUFjLEdBQUdELEtBQUssQ0FBQzFELE9BQU4sQ0FBYyx3QkFBZCxDQUF2QjtBQUNBLFlBQU04QyxJQUFJLGFBQU1hLGNBQWMsQ0FBQ1osSUFBZixDQUFvQixzQkFBcEIsQ0FBTixjQUFxRDNCLEtBQXJELE1BQVY7QUFDQXNDLGFBQUssQ0FBQ1gsSUFBTixDQUFXLE1BQVgsRUFBbUJELElBQW5CO0FBQ0gsT0FMRDs7QUFPQSxVQUFJLENBQUNXLE1BQU0sQ0FBQ3RELE1BQVosRUFBb0I7QUFDaEJnRCxXQUFHLENBQUNqRCxJQUFKLENBQVMsZ0NBQVQsRUFBMkM2QyxJQUEzQyxDQUFnRCxNQUFoRCxFQUF3RGQsUUFBUSxDQUFDbkMsT0FBVCxFQUF4RDtBQUNIO0FBQ0o7OztXQUVELHFCQUFZcUMsT0FBWixFQUFxQjtBQUNqQixVQUFJRixRQUFRLEdBQUdFLE9BQU8sQ0FBQ2xDLElBQVIsQ0FBYSxnQkFBYixDQUFmO0FBQ0EsVUFBSWtELEdBQUcsR0FBR2hCLE9BQU8sQ0FBQ25DLE9BQVIsQ0FBZ0IsOEJBQWhCLENBQVY7QUFFQSxhQUFPaUMsUUFBUSxDQUFDcEMsU0FBVCxDQUFtQkssSUFBbkIsV0FBMkIrQixRQUFRLENBQUN0QixXQUFULEtBQXlCLFFBQXpCLEdBQW9DLEVBQS9ELHdDQUFvR1MsS0FBcEcsQ0FBMEcrQixHQUExRyxDQUFQO0FBQ0g7OztXQUVELHNCQUFhaEIsT0FBYixFQUFzQjtBQUNsQixVQUFJLENBQUNBLE9BQU8sQ0FBQ2xDLElBQVIsQ0FBYSxnQkFBYixDQUFMLEVBQXFDO0FBQ2pDa0MsZUFBTyxDQUFDbEMsSUFBUixDQUFhLGdCQUFiLEVBQStCLElBQUlMLFFBQUosQ0FBYXVDLE9BQU8sQ0FBQ25DLE9BQVIsQ0FBZ0Isd0JBQWhCLENBQWIsQ0FBL0I7QUFDSDtBQUNKOzs7V0FFRCx1QkFBY2UsS0FBZCxFQUFxQnFCO0FBQU07QUFBM0IsTUFBcUQ7QUFBQTs7QUFDakQsVUFBSWxCLE1BQU0sR0FBR3ZCLDZDQUFDLENBQUN5QyxNQUFELENBQUQsQ0FBVWxDLElBQVYsQ0FBZSwyQkFBZixDQUFiOztBQUNBLFVBQUksQ0FBQ2dCLE1BQU0sQ0FBQ2YsTUFBWixFQUFvQjtBQUFFO0FBQVM7O0FBRS9CZSxZQUFNLENBQUNDLElBQVAsQ0FBWSxVQUFDQyxLQUFELEVBQVFDLElBQVIsRUFBaUI7QUFDekJBLFlBQUksR0FBRzFCLDZDQUFDLENBQUMwQixJQUFELENBQVI7O0FBQ0EsWUFBSSxDQUFDLENBQUMsTUFBSSxDQUFDSCxNQUFMLENBQVlFLEtBQVosQ0FBa0JDLElBQWxCLENBQU4sRUFBK0I7QUFDM0IsZ0JBQUksQ0FBQ0MsUUFBTCxDQUFjRCxJQUFkO0FBQ0g7QUFDSixPQUxEO0FBTUg7Ozs7Ozs7QUFHRSxJQUFJdUMsUUFBUSxHQUFHLElBQUkvQyxVQUFKLEVBQWYiLCJmaWxlIjoiLi9hcHAvZm9ybXMvZmllbGRzL2FycmF5LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCBTb3J0YWJsZSBmcm9tICdzb3J0YWJsZWpzJztcblxubGV0IGJvZHkgPSAkKCdib2R5Jyk7XG5cbmNsYXNzIFRlbXBsYXRlIHtcbiAgICBjb25zdHJ1Y3Rvcihjb250YWluZXIpIHtcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSAkKGNvbnRhaW5lcik7XG5cbiAgICAgICAgaWYgKHRoaXMuZ2V0TmFtZSgpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy5jb250YWluZXIuY2xvc2VzdCgnW2RhdGEtZ3Jhdi1hcnJheS1uYW1lXScpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0TmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyLmRhdGEoJ2dyYXYtYXJyYXktbmFtZScpIHx8ICcnO1xuICAgIH1cblxuICAgIGdldEtleVBsYWNlaG9sZGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXIuZGF0YSgnZ3Jhdi1hcnJheS1rZXluYW1lJykgfHwgJ0tleSc7XG4gICAgfVxuXG4gICAgZ2V0VmFsdWVQbGFjZWhvbGRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyLmRhdGEoJ2dyYXYtYXJyYXktdmFsdWVuYW1lJykgfHwgJ1ZhbHVlJztcbiAgICB9XG5cbiAgICBpc1ZhbHVlT25seSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyLmZpbmQoJ1tkYXRhLWdyYXYtYXJyYXktbW9kZT1cInZhbHVlX29ubHlcIl06Zmlyc3QnKS5sZW5ndGggfHwgZmFsc2U7XG4gICAgfVxuXG4gICAgaXNUZXh0QXJlYSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyLmRhdGEoJ2dyYXYtYXJyYXktdGV4dGFyZWEnKSB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICBzaG91bGRCZURpc2FibGVkKCkge1xuICAgICAgICAvLyBjaGVjayBmb3IgdG9nZ2xlYWJsZXMsIGlmIGZpZWxkIGlzIHRvZ2dsZWFibGUgYW5kIGl0J3Mgbm90IGVuYWJsZWQsIHJlbmRlciBkaXNhYmxlZFxuICAgICAgICBsZXQgdG9nZ2xlID0gdGhpcy5jb250YWluZXIuY2xvc2VzdCgnLmZvcm0tZmllbGQnKS5maW5kKCdbZGF0YS1ncmF2LWZpZWxkPVwidG9nZ2xlYWJsZVwiXSBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0nKTtcbiAgICAgICAgcmV0dXJuIHRvZ2dsZS5sZW5ndGggJiYgdG9nZ2xlLmlzKCc6bm90KDpjaGVja2VkKScpO1xuICAgIH1cblxuICAgIGdldE5ld1JvdygpIHtcbiAgICAgICAgbGV0IHRwbCA9ICcnO2NvbnN0IHZhbHVlID0gdGhpcy5pc1RleHRBcmVhKClcbiAgICAgICAgICAgID8gYDx0ZXh0YXJlYSAke3RoaXMuc2hvdWxkQmVEaXNhYmxlZCgpID8gJ2Rpc2FibGVkPVwiZGlzYWJsZWRcIicgOiAnJ30gZGF0YS1ncmF2LWFycmF5LXR5cGU9XCJ2YWx1ZVwiIG5hbWU9XCJcIiBwbGFjZWhvbGRlcj1cIiR7dGhpcy5nZXRWYWx1ZVBsYWNlaG9sZGVyKCl9XCI+PC90ZXh0YXJlYT5gXG4gICAgICAgICAgICA6IGA8aW5wdXQgJHt0aGlzLnNob3VsZEJlRGlzYWJsZWQoKSA/ICdkaXNhYmxlZD1cImRpc2FibGVkXCInIDogJyd9IGRhdGEtZ3Jhdi1hcnJheS10eXBlPVwidmFsdWVcIiB0eXBlPVwidGV4dFwiIG5hbWU9XCJcIiB2YWx1ZT1cIlwiICBwbGFjZWhvbGRlcj1cIiR7dGhpcy5nZXRWYWx1ZVBsYWNlaG9sZGVyKCl9XCIgLz5gO1xuXG4gICAgICAgIGlmICh0aGlzLmlzVmFsdWVPbmx5KCkpIHtcbiAgICAgICAgICAgIHRwbCArPSBgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1yb3cgYXJyYXktZmllbGQtdmFsdWVfb25seVwiIGRhdGEtZ3Jhdi1hcnJheS10eXBlPVwicm93XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1ncmF2LWFycmF5LWFjdGlvbj1cInNvcnRcIiBjbGFzcz1cImZhIGZhLWJhcnNcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgJHt2YWx1ZX1cbiAgICAgICAgICAgIGA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cGwgKz0gYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tcm93XCIgZGF0YS1ncmF2LWFycmF5LXR5cGU9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWdyYXYtYXJyYXktYWN0aW9uPVwic29ydFwiIGNsYXNzPVwiZmEgZmEtYmFyc1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgJHt0aGlzLnNob3VsZEJlRGlzYWJsZWQoKSA/ICdkaXNhYmxlZD1cImRpc2FibGVkXCInIDogJyd9IGRhdGEtZ3Jhdi1hcnJheS10eXBlPVwia2V5XCIgdHlwZT1cInRleHRcIiB2YWx1ZT1cIlwiIHBsYWNlaG9sZGVyPVwiJHt0aGlzLmdldEtleVBsYWNlaG9sZGVyKCl9XCIgLz5cbiAgICAgICAgICAgICAgICAke3ZhbHVlfVxuICAgICAgICAgICAgYDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRwbCArPSBgXG4gICAgICAgICAgICA8c3BhbiBkYXRhLWdyYXYtYXJyYXktYWN0aW9uPVwicmVtXCIgY2xhc3M9XCJmYSBmYS1taW51c1wiPjwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGRhdGEtZ3Jhdi1hcnJheS1hY3Rpb249XCJhZGRcIiBjbGFzcz1cImZhIGZhLXBsdXNcIj48L3NwYW4+XG4gICAgICAgIDwvZGl2PmA7XG5cbiAgICAgICAgcmV0dXJuIHRwbDtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFycmF5RmllbGQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBib2R5Lm9uKCdpbnB1dCcsICdbZGF0YS1ncmF2LWFycmF5LXR5cGU9XCJrZXlcIl0sIFtkYXRhLWdyYXYtYXJyYXktdHlwZT1cInZhbHVlXCJdJywgKGV2ZW50KSA9PiB0aGlzLmFjdGlvbklucHV0KGV2ZW50KSk7XG4gICAgICAgIGJvZHkub24oJ2NsaWNrIHRvdWNoJywgJ1tkYXRhLWdyYXYtYXJyYXktYWN0aW9uXTpub3QoW2RhdGEtZ3Jhdi1hcnJheS1hY3Rpb249XCJzb3J0XCJdKScsIChldmVudCkgPT4gdGhpcy5hY3Rpb25FdmVudChldmVudCkpO1xuXG4gICAgICAgIHRoaXMuYXJyYXlzID0gJCgpO1xuXG4gICAgICAgICQoJ1tkYXRhLWdyYXYtZmllbGQ9XCJhcnJheVwiXScpLmVhY2goKGluZGV4LCBsaXN0KSA9PiB0aGlzLmFkZEFycmF5KGxpc3QpKTtcbiAgICAgICAgJCgnYm9keScpLm9uKCdtdXRhdGlvbi5fZ3JhdicsIHRoaXMuX29uQWRkZWROb2Rlcy5iaW5kKHRoaXMpKTtcbiAgICB9XG5cbiAgICBhZGRBcnJheShsaXN0KSB7XG4gICAgICAgIGxpc3QgPSAkKGxpc3QpO1xuXG4gICAgICAgIGxpc3QuZmluZCgnW2RhdGEtZ3Jhdi1hcnJheS10eXBlPVwiY29udGFpbmVyXCJdJykuZWFjaCgoaW5kZXgsIGNvbnRhaW5lcikgPT4ge1xuICAgICAgICAgICAgY29udGFpbmVyID0gJChjb250YWluZXIpO1xuICAgICAgICAgICAgaWYgKGNvbnRhaW5lci5kYXRhKCdhcnJheS1zb3J0JykgfHwgY29udGFpbmVyWzBdLmhhc0F0dHJpYnV0ZSgnZGF0YS1hcnJheS1ub3NvcnQnKSkgeyByZXR1cm47IH1cblxuICAgICAgICAgICAgY29udGFpbmVyLmRhdGEoJ2FycmF5LXNvcnQnLCBuZXcgU29ydGFibGUoY29udGFpbmVyLmdldCgwKSwge1xuICAgICAgICAgICAgICAgIGhhbmRsZTogJy5mYS1iYXJzJyxcbiAgICAgICAgICAgICAgICBhbmltYXRpb246IDE1MCxcbiAgICAgICAgICAgICAgICBvblVwZGF0ZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gY29udGFpbmVyLmZpbmQoJ1tkYXRhLWdyYXYtYXJyYXktdHlwZT1cInJvd1wiXTpmaXJzdCcpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZXRUZW1wbGF0ZShpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGVtcGxhdGUgPSBpdGVtLmRhdGEoJ2FycmF5LXRlbXBsYXRlJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaE5hbWVzKHRlbXBsYXRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFjdGlvbklucHV0KGV2ZW50KSB7XG4gICAgICAgIGxldCBlbGVtZW50ID0gJChldmVudC50YXJnZXQpO1xuICAgICAgICBsZXQgdHlwZSA9IGVsZW1lbnQuZGF0YSgnZ3Jhdi1hcnJheS10eXBlJyk7XG5cbiAgICAgICAgdGhpcy5fc2V0VGVtcGxhdGUoZWxlbWVudCk7XG5cbiAgICAgICAgbGV0IHRlbXBsYXRlID0gZWxlbWVudC5kYXRhKCdhcnJheS10ZW1wbGF0ZScpO1xuICAgICAgICBsZXQga2V5RWxlbWVudCA9IHR5cGUgPT09ICdrZXknID8gZWxlbWVudCA6IGVsZW1lbnQuc2libGluZ3MoJ1tkYXRhLWdyYXYtYXJyYXktdHlwZT1cImtleVwiXTpmaXJzdCcpO1xuICAgICAgICBsZXQgdmFsdWVFbGVtZW50ID0gdHlwZSA9PT0gJ3ZhbHVlJyA/IGVsZW1lbnQgOiBlbGVtZW50LnNpYmxpbmdzKCdbZGF0YS1ncmF2LWFycmF5LXR5cGU9XCJ2YWx1ZVwiXTpmaXJzdCcpO1xuXG4gICAgICAgIGxldCBlc2NhcGVkX25hbWUgPSAhdGVtcGxhdGUuaXNWYWx1ZU9ubHkoKSA/IGtleUVsZW1lbnQudmFsKCkgOiB0aGlzLmdldEluZGV4Rm9yKGVsZW1lbnQpO1xuICAgICAgICBlc2NhcGVkX25hbWUgPSBlc2NhcGVkX25hbWUudG9TdHJpbmcoKS5yZXBsYWNlKC9cXFsvZywgJyU1QicpLnJlcGxhY2UoL10vZywgJyU1RCcpO1xuICAgICAgICBsZXQgbmFtZSA9IGAke3RlbXBsYXRlLmdldE5hbWUoKX1bJHtlc2NhcGVkX25hbWV9XWA7XG5cbiAgICAgICAgaWYgKCF0ZW1wbGF0ZS5pc1ZhbHVlT25seSgpICYmICgha2V5RWxlbWVudC52YWwoKSAmJiAhdmFsdWVFbGVtZW50LnZhbCgpKSkge1xuICAgICAgICAgICAgdmFsdWVFbGVtZW50LmF0dHIoJ25hbWUnLCAnJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyB2YWx1ZUVsZW1lbnQuYXR0cignbmFtZScsICF2YWx1ZUVsZW1lbnQudmFsKCkgPyB0ZW1wbGF0ZS5nZXROYW1lKCkgOiBuYW1lKTtcbiAgICAgICAgICAgIHZhbHVlRWxlbWVudC5hdHRyKCduYW1lJywgbmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlZnJlc2hOYW1lcyh0ZW1wbGF0ZSk7XG4gICAgfVxuXG4gICAgYWN0aW9uRXZlbnQoZXZlbnQpIHtcbiAgICAgICAgZXZlbnQgJiYgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgbGV0IGVsZW1lbnQgPSAkKGV2ZW50LnRhcmdldCk7XG4gICAgICAgIGxldCBhY3Rpb24gPSBlbGVtZW50LmRhdGEoJ2dyYXYtYXJyYXktYWN0aW9uJyk7XG4gICAgICAgIGxldCBjb250YWluZXIgPSBlbGVtZW50LnBhcmVudHMoJ1tkYXRhLWdyYXYtYXJyYXktdHlwZT1cImNvbnRhaW5lclwiXScpO1xuXG4gICAgICAgIHRoaXMuX3NldFRlbXBsYXRlKGVsZW1lbnQpO1xuXG4gICAgICAgIHRoaXNbYCR7YWN0aW9ufUFjdGlvbmBdKGVsZW1lbnQpO1xuXG4gICAgICAgIGxldCBzaWJsaW5ncyA9IGNvbnRhaW5lci5maW5kKCc+IGRpdicpO1xuICAgICAgICBjb250YWluZXJbc2libGluZ3MubGVuZ3RoID4gMSA/ICdyZW1vdmVDbGFzcycgOiAnYWRkQ2xhc3MnXSgnb25lLWNoaWxkJyk7XG4gICAgfVxuXG4gICAgYWRkQWN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHRlbXBsYXRlID0gZWxlbWVudC5kYXRhKCdhcnJheS10ZW1wbGF0ZScpO1xuICAgICAgICBsZXQgcm93ID0gZWxlbWVudC5jbG9zZXN0KCdbZGF0YS1ncmF2LWFycmF5LXR5cGU9XCJyb3dcIl0nKTtcblxuICAgICAgICByb3cuYWZ0ZXIodGVtcGxhdGUuZ2V0TmV3Um93KCkpO1xuICAgIH1cblxuICAgIHJlbUFjdGlvbihlbGVtZW50KSB7XG4gICAgICAgIGxldCB0ZW1wbGF0ZSA9IGVsZW1lbnQuZGF0YSgnYXJyYXktdGVtcGxhdGUnKTtcbiAgICAgICAgbGV0IHJvdyA9IGVsZW1lbnQuY2xvc2VzdCgnW2RhdGEtZ3Jhdi1hcnJheS10eXBlPVwicm93XCJdJyk7XG4gICAgICAgIGxldCBpc0xhc3QgPSAhcm93LnNpYmxpbmdzKCkubGVuZ3RoO1xuXG4gICAgICAgIGlmIChpc0xhc3QpIHtcbiAgICAgICAgICAgIGxldCBuZXdSb3cgPSAkKHRlbXBsYXRlLmdldE5ld1JvdygpKTtcbiAgICAgICAgICAgIHJvdy5hZnRlcihuZXdSb3cpO1xuICAgICAgICAgICAgbmV3Um93LmZpbmQoJ1tkYXRhLWdyYXYtYXJyYXktdHlwZT1cInZhbHVlXCJdOmxhc3QnKS5hdHRyKCduYW1lJywgdGVtcGxhdGUuZ2V0TmFtZSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJvdy5yZW1vdmUoKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoTmFtZXModGVtcGxhdGUpO1xuICAgIH1cblxuICAgIHJlZnJlc2hOYW1lcyh0ZW1wbGF0ZSkge1xuICAgICAgICBpZiAoIXRlbXBsYXRlLmlzVmFsdWVPbmx5KCkpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgbGV0IHJvdyA9IHRlbXBsYXRlLmNvbnRhaW5lci5maW5kKCc+IGRpdiA+IFtkYXRhLWdyYXYtYXJyYXktdHlwZT1cInJvd1wiXScpO1xuICAgICAgICBsZXQgaW5wdXRzID0gcm93LmZpbmQoJ1tuYW1lXTpub3QoW25hbWU9XCJcIl0pJyk7XG5cbiAgICAgICAgaW5wdXRzLmVhY2goKGluZGV4LCBpbnB1dCkgPT4ge1xuICAgICAgICAgICAgaW5wdXQgPSAkKGlucHV0KTtcbiAgICAgICAgICAgIGNvbnN0IHByZXNlcnZlZF9uYW1lID0gaW5wdXQuY2xvc2VzdCgnW2RhdGEtZ3Jhdi1hcnJheS1uYW1lXScpO1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IGAke3ByZXNlcnZlZF9uYW1lLmF0dHIoJ2RhdGEtZ3Jhdi1hcnJheS1uYW1lJyl9WyR7aW5kZXh9XWA7XG4gICAgICAgICAgICBpbnB1dC5hdHRyKCduYW1lJywgbmFtZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghaW5wdXRzLmxlbmd0aCkge1xuICAgICAgICAgICAgcm93LmZpbmQoJ1tkYXRhLWdyYXYtYXJyYXktdHlwZT1cInZhbHVlXCJdJykuYXR0cignbmFtZScsIHRlbXBsYXRlLmdldE5hbWUoKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRJbmRleEZvcihlbGVtZW50KSB7XG4gICAgICAgIGxldCB0ZW1wbGF0ZSA9IGVsZW1lbnQuZGF0YSgnYXJyYXktdGVtcGxhdGUnKTtcbiAgICAgICAgbGV0IHJvdyA9IGVsZW1lbnQuY2xvc2VzdCgnW2RhdGEtZ3Jhdi1hcnJheS10eXBlPVwicm93XCJdJyk7XG5cbiAgICAgICAgcmV0dXJuIHRlbXBsYXRlLmNvbnRhaW5lci5maW5kKGAke3RlbXBsYXRlLmlzVmFsdWVPbmx5KCkgPyAnPiBkaXYgJyA6ICcnfSA+IFtkYXRhLWdyYXYtYXJyYXktdHlwZT1cInJvd1wiXWApLmluZGV4KHJvdyk7XG4gICAgfVxuXG4gICAgX3NldFRlbXBsYXRlKGVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCFlbGVtZW50LmRhdGEoJ2FycmF5LXRlbXBsYXRlJykpIHtcbiAgICAgICAgICAgIGVsZW1lbnQuZGF0YSgnYXJyYXktdGVtcGxhdGUnLCBuZXcgVGVtcGxhdGUoZWxlbWVudC5jbG9zZXN0KCdbZGF0YS1ncmF2LWFycmF5LW5hbWVdJykpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9vbkFkZGVkTm9kZXMoZXZlbnQsIHRhcmdldC8qICwgcmVjb3JkLCBpbnN0YW5jZSAqLykge1xuICAgICAgICBsZXQgYXJyYXlzID0gJCh0YXJnZXQpLmZpbmQoJ1tkYXRhLWdyYXYtZmllbGQ9XCJhcnJheVwiXScpO1xuICAgICAgICBpZiAoIWFycmF5cy5sZW5ndGgpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgYXJyYXlzLmVhY2goKGluZGV4LCBsaXN0KSA9PiB7XG4gICAgICAgICAgICBsaXN0ID0gJChsaXN0KTtcbiAgICAgICAgICAgIGlmICghfnRoaXMuYXJyYXlzLmluZGV4KGxpc3QpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRBcnJheShsaXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5leHBvcnQgbGV0IEluc3RhbmNlID0gbmV3IEFycmF5RmllbGQoKTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./app/forms/fields/array.js\n"); /***/ }), /***/ "./app/forms/fields/collections.js": -/*!*****************************************!* +/*!*****************************************!*\ !*** ./app/forms/fields/collections.js ***! \*****************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => /* binding */ CollectionsField,\n/* harmony export */ \"Instance\": () => /* binding */ Instance\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var sortablejs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! sortablejs */ \"./node_modules/sortablejs/modular/sortable.complete.esm.js\");\n/* harmony import */ var _utils_jquery_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/jquery-utils */ \"./app/utils/jquery-utils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\n\nvar CollectionsField = /*#__PURE__*/function () {\n function CollectionsField() {\n var _this = this;\n\n _classCallCheck(this, CollectionsField);\n\n this.lists = jquery__WEBPACK_IMPORTED_MODULE_0___default()();\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-type=\"collection\"]').each(function (index, list) {\n return _this.addList(list);\n });\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('body').on('mutation._grav', this._onAddedNodes.bind(this));\n }\n\n _createClass(CollectionsField, [{\n key: \"addList\",\n value: function addList(list) {\n var _this2 = this;\n\n list = jquery__WEBPACK_IMPORTED_MODULE_0___default()(list);\n this.lists = this.lists.add(list);\n list.on('click', '> .collection-actions [data-action=\"add\"]', function (event) {\n return _this2.addItem(event);\n });\n list.on('click', '> ul > li > .item-actions [data-action=\"delete\"]', function (event) {\n return _this2.removeItem(event);\n });\n list.on('click', '> ul > li > .item-actions [data-action=\"collapse\"]', function (event) {\n return _this2.collapseItem(event);\n });\n list.on('click', '> ul > li > .item-actions [data-action=\"expand\"]', function (event) {\n return _this2.expandItem(event);\n });\n list.on('click', '> .collection-actions [data-action-sort=\"date\"]', function (event) {\n return _this2.sortItems(event);\n });\n list.on('click', '> .collection-actions [data-action=\"collapse_all\"]', function (event) {\n return _this2.collapseItems(event);\n });\n list.on('click', '> .collection-actions [data-action=\"expand_all\"]', function (event) {\n return _this2.expandItems(event);\n });\n list.on('input change', '[data-key-observe]', function (event) {\n return _this2.observeKey(event);\n });\n list.find('[data-collection-holder]').each(function (index, container) {\n container = jquery__WEBPACK_IMPORTED_MODULE_0___default()(container);\n\n if (container.data('collection-sort') || container[0].hasAttribute('data-collection-nosort')) {\n return;\n }\n\n container.data('collection-sort', new sortablejs__WEBPACK_IMPORTED_MODULE_1__.default(container.get(0), {\n forceFallback: false,\n handle: '.collection-sort',\n animation: 150,\n onUpdate: function onUpdate() {\n return _this2.reindex(container);\n }\n }));\n });\n\n this._updateActionsStateBasedOnMinMax(list);\n }\n }, {\n key: \"addItem\",\n value: function addItem(event) {\n var button = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.currentTarget);\n var position = button.data('action-add') || 'bottom';\n var list = jquery__WEBPACK_IMPORTED_MODULE_0___default()(button.closest('[data-type=\"collection\"]'));\n var template = jquery__WEBPACK_IMPORTED_MODULE_0___default()(list.find('> [data-collection-template=\"new\"]').data('collection-template-html'));\n\n this._updateActionsStateBasedOnMinMax(list);\n\n var items = list.closest('[data-type=\"collection\"]').find('> ul > [data-collection-item]');\n var maxItems = list.data('max');\n\n if (typeof maxItems !== 'undefined' && items.length >= maxItems) {\n return;\n }\n\n list.find('> [data-collection-holder]')[position === 'top' ? 'prepend' : 'append'](template);\n this.reindex(list);\n items = list.closest('[data-type=\"collection\"]').find('> ul > [data-collection-item]');\n var topAction = list.closest('[data-type=\"collection\"]').find('[data-action-add=\"top\"]');\n var sortAction = list.closest('[data-type=\"collection\"]').find('[data-action=\"sort\"]');\n\n if (items.length) {\n if (topAction.length) {\n topAction.parent().removeClass('hidden');\n }\n\n if (sortAction.length && items.length > 1) {\n sortAction.removeClass('hidden');\n }\n } // refresh toggleables in a list\n\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-grav-field=\"toggleable\"] input[type=\"checkbox\"]').trigger('change');\n }\n }, {\n key: \"removeItem\",\n value: function removeItem(event) {\n var button = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.currentTarget);\n var item = button.closest('[data-collection-item]');\n var list = jquery__WEBPACK_IMPORTED_MODULE_0___default()(button.closest('[data-type=\"collection\"]'));\n var items = list.closest('[data-type=\"collection\"]').find('> ul > [data-collection-item]');\n var minItems = list.data('min');\n\n if (typeof minItems !== 'undefined' && items.length <= minItems) {\n return;\n }\n\n item.remove();\n this.reindex(list);\n items = list.closest('[data-type=\"collection\"]').find('> ul > [data-collection-item]');\n var topAction = list.closest('[data-type=\"collection\"]').find('[data-action-add=\"top\"]');\n var sortAction = list.closest('[data-type=\"collection\"]').find('[data-action=\"sort\"]');\n\n if (!items.length) {\n if (topAction.length) {\n topAction.parent().addClass('hidden');\n }\n }\n\n if (sortAction.length && items.length <= 1) {\n sortAction.addClass('hidden');\n }\n\n this._updateActionsStateBasedOnMinMax(list);\n }\n }, {\n key: \"collapseItems\",\n value: function collapseItems(event) {\n var button = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.currentTarget);\n var items = jquery__WEBPACK_IMPORTED_MODULE_0___default()(button.closest('[data-type=\"collection\"]')).find('> ul > [data-collection-item] > .item-actions [data-action=\"collapse\"]');\n items.click();\n }\n }, {\n key: \"collapseItem\",\n value: function collapseItem(event) {\n var button = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.currentTarget);\n var item = button.closest('[data-collection-item]');\n button.attr('data-action', 'expand').removeClass('fa-chevron-circle-down').addClass('fa-chevron-circle-right');\n item.addClass('collection-collapsed');\n }\n }, {\n key: \"expandItems\",\n value: function expandItems(event) {\n var button = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.currentTarget);\n var items = jquery__WEBPACK_IMPORTED_MODULE_0___default()(button.closest('[data-type=\"collection\"]')).find('> ul > [data-collection-item] > .item-actions [data-action=\"expand\"]');\n items.click();\n }\n }, {\n key: \"expandItem\",\n value: function expandItem(event) {\n var button = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.currentTarget);\n var item = button.closest('[data-collection-item]');\n button.attr('data-action', 'collapse').removeClass('fa-chevron-circle-right').addClass('fa-chevron-circle-down');\n item.removeClass('collection-collapsed');\n }\n }, {\n key: \"sortItems\",\n value: function sortItems(event) {\n var button = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.currentTarget);\n var sortby = button.data('action-sort');\n var sortby_dir = button.data('action-sort-dir') || 'asc';\n var list = jquery__WEBPACK_IMPORTED_MODULE_0___default()(button.closest('[data-type=\"collection\"]'));\n var items = list.closest('[data-type=\"collection\"]').find('> ul > [data-collection-item]');\n items.sort(function (a, b) {\n var A = jquery__WEBPACK_IMPORTED_MODULE_0___default()(a).find('[name$=\"[' + sortby + ']\"]');\n var B = jquery__WEBPACK_IMPORTED_MODULE_0___default()(b).find('[name$=\"[' + sortby + ']\"]');\n var sort;\n\n if (sortby_dir === 'asc') {\n sort = A.val() < B.val() ? -1 : A.val() > B.val() ? 1 : 0;\n } else {\n sort = A.val() > B.val() ? -1 : A.val() < B.val() ? 1 : 0;\n }\n\n return sort;\n }).each(function (_, container) {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(container).parent().append(container);\n });\n this.reindex(list);\n }\n }, {\n key: \"observeKey\",\n value: function observeKey(event) {\n var input = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.target);\n var value = input.val();\n var item = input.closest('[data-collection-key]');\n item.data('collection-key-backup', item.data('collection-key')).data('collection-key', value);\n this.reindex(null, item);\n }\n }, {\n key: \"reindex\",\n value: function reindex(list, items) {\n items = items || jquery__WEBPACK_IMPORTED_MODULE_0___default()(list).closest('[data-type=\"collection\"]').find('> ul > [data-collection-item]');\n items.each(function (index, item) {\n item = jquery__WEBPACK_IMPORTED_MODULE_0___default()(item);\n var observed = item.find('[data-key-observe]');\n var observedValue = observed.val();\n var hasCustomKey = observed.length;\n var currentKey = item.data('collection-key-backup');\n item.attr('data-collection-key', hasCustomKey ? observedValue : index);\n ['name', 'data-grav-field-name', 'for', 'id', 'data-grav-file-settings', 'data-file-post-add', 'data-file-post-remove', 'data-grav-array-name'].forEach(function (prop) {\n item.find('[' + prop + '], [_' + prop + ']').each(function () {\n var element = jquery__WEBPACK_IMPORTED_MODULE_0___default()(this);\n var indexes = [];\n var array_index = null;\n var regexps = [new RegExp('\\\\[(\\\\d+|\\\\*|' + currentKey + ')\\\\]', 'g'), new RegExp('\\\\.(\\\\d+|\\\\*|' + currentKey + ')\\\\.', 'g')]; // special case to preserve array field index keys\n\n if (prop === 'name' && element.data('gravArrayType')) {\n var match_index = element.attr(prop).match(/\\[[0-9]{1,}\\]$/);\n var pattern = element[0].closest('[data-grav-array-name]').dataset.gravArrayName;\n\n if (match_index && pattern) {\n array_index = match_index[0];\n element.attr(prop, \"\".concat(pattern).concat(match_index[0]));\n return;\n }\n }\n\n if (hasCustomKey && !observedValue) {\n element.attr(\"_\".concat(prop), element.attr(prop));\n element.attr(prop, null);\n return;\n }\n\n if (element.attr(\"_\".concat(prop))) {\n element.attr(prop, element.attr(\"_\".concat(prop)));\n element.attr(\"_\".concat(prop), null);\n }\n\n element.parents('[data-collection-key]').map(function (idx, parent) {\n return indexes.push(jquery__WEBPACK_IMPORTED_MODULE_0___default()(parent).attr('data-collection-key'));\n });\n indexes.reverse();\n var matchedKey = currentKey;\n var replaced = element.attr(prop).replace(regexps[0], function ()\n /* str, p1, offset */\n {\n var extras = '';\n\n if (array_index) {\n extras = array_index;\n console.log(indexes, extras);\n }\n\n matchedKey = indexes.shift() || matchedKey;\n return \"[\".concat(matchedKey, \"]\").concat(extras);\n });\n replaced = replaced.replace(regexps[1], function ()\n /* str, p1, offset */\n {\n matchedKey = indexes.shift() || matchedKey;\n return \".\".concat(matchedKey, \".\");\n });\n element.attr(prop, replaced);\n });\n });\n });\n }\n }, {\n key: \"_onAddedNodes\",\n value: function _onAddedNodes(event, target\n /* , record, instance */\n ) {\n var _this3 = this;\n\n var collections = jquery__WEBPACK_IMPORTED_MODULE_0___default()(target).find('[data-type=\"collection\"]');\n\n if (!collections.length) {\n return;\n }\n\n collections.each(function (index, collection) {\n collection = jquery__WEBPACK_IMPORTED_MODULE_0___default()(collection);\n\n if (!~_this3.lists.index(collection)) {\n _this3.addList(collection);\n }\n });\n }\n }, {\n key: \"_updateActionsStateBasedOnMinMax\",\n value: function _updateActionsStateBasedOnMinMax(list) {\n var items = list.closest('[data-type=\"collection\"]').find('> ul > [data-collection-item]');\n var minItems = list.data('min');\n var maxItems = list.data('max');\n list.find('> .collection-actions [data-action=\"add\"]').attr('disabled', false);\n list.find('> ul > li > .item-actions [data-action=\"delete\"]').attr('disabled', false);\n\n if (typeof minItems !== 'undefined' && items.length <= minItems) {\n list.find('> ul > li > .item-actions [data-action=\"delete\"]').attr('disabled', true);\n }\n\n if (typeof maxItems !== 'undefined' && items.length >= maxItems) {\n list.find('> .collection-actions [data-action=\"add\"]').attr('disabled', true);\n }\n }\n }]);\n\n return CollectionsField;\n}();\n\n\nvar Instance = new CollectionsField();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL2Zvcm1zL2ZpZWxkcy9jb2xsZWN0aW9ucy5qcz82YzU1Il0sIm5hbWVzIjpbIkNvbGxlY3Rpb25zRmllbGQiLCJsaXN0cyIsIiQiLCJlYWNoIiwiaW5kZXgiLCJsaXN0IiwiYWRkTGlzdCIsIm9uIiwiX29uQWRkZWROb2RlcyIsImJpbmQiLCJhZGQiLCJldmVudCIsImFkZEl0ZW0iLCJyZW1vdmVJdGVtIiwiY29sbGFwc2VJdGVtIiwiZXhwYW5kSXRlbSIsInNvcnRJdGVtcyIsImNvbGxhcHNlSXRlbXMiLCJleHBhbmRJdGVtcyIsIm9ic2VydmVLZXkiLCJmaW5kIiwiY29udGFpbmVyIiwiZGF0YSIsImhhc0F0dHJpYnV0ZSIsIlNvcnRhYmxlIiwiZ2V0IiwiZm9yY2VGYWxsYmFjayIsImhhbmRsZSIsImFuaW1hdGlvbiIsIm9uVXBkYXRlIiwicmVpbmRleCIsIl91cGRhdGVBY3Rpb25zU3RhdGVCYXNlZE9uTWluTWF4IiwiYnV0dG9uIiwiY3VycmVudFRhcmdldCIsInBvc2l0aW9uIiwiY2xvc2VzdCIsInRlbXBsYXRlIiwiaXRlbXMiLCJtYXhJdGVtcyIsImxlbmd0aCIsInRvcEFjdGlvbiIsInNvcnRBY3Rpb24iLCJwYXJlbnQiLCJyZW1vdmVDbGFzcyIsInRyaWdnZXIiLCJpdGVtIiwibWluSXRlbXMiLCJyZW1vdmUiLCJhZGRDbGFzcyIsImNsaWNrIiwiYXR0ciIsInNvcnRieSIsInNvcnRieV9kaXIiLCJzb3J0IiwiYSIsImIiLCJBIiwiQiIsInZhbCIsIl8iLCJhcHBlbmQiLCJpbnB1dCIsInRhcmdldCIsInZhbHVlIiwib2JzZXJ2ZWQiLCJvYnNlcnZlZFZhbHVlIiwiaGFzQ3VzdG9tS2V5IiwiY3VycmVudEtleSIsImZvckVhY2giLCJwcm9wIiwiZWxlbWVudCIsImluZGV4ZXMiLCJhcnJheV9pbmRleCIsInJlZ2V4cHMiLCJSZWdFeHAiLCJtYXRjaF9pbmRleCIsIm1hdGNoIiwicGF0dGVybiIsImRhdGFzZXQiLCJncmF2QXJyYXlOYW1lIiwicGFyZW50cyIsIm1hcCIsImlkeCIsInB1c2giLCJyZXZlcnNlIiwibWF0Y2hlZEtleSIsInJlcGxhY2VkIiwicmVwbGFjZSIsImV4dHJhcyIsImNvbnNvbGUiLCJsb2ciLCJzaGlmdCIsImNvbGxlY3Rpb25zIiwiY29sbGVjdGlvbiIsIkluc3RhbmNlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7O0lBRXFCQSxnQjtBQUNqQiw4QkFBYztBQUFBOztBQUFBOztBQUNWLFNBQUtDLEtBQUwsR0FBYUMsNkNBQUMsRUFBZDtBQUVBQSxpREFBQyxDQUFDLDBCQUFELENBQUQsQ0FBOEJDLElBQTlCLENBQW1DLFVBQUNDLEtBQUQsRUFBUUMsSUFBUjtBQUFBLGFBQWlCLEtBQUksQ0FBQ0MsT0FBTCxDQUFhRCxJQUFiLENBQWpCO0FBQUEsS0FBbkM7QUFDQUgsaURBQUMsQ0FBQyxNQUFELENBQUQsQ0FBVUssRUFBVixDQUFhLGdCQUFiLEVBQStCLEtBQUtDLGFBQUwsQ0FBbUJDLElBQW5CLENBQXdCLElBQXhCLENBQS9CO0FBRUg7Ozs7NEJBRU9KLEksRUFBTTtBQUFBOztBQUNWQSxVQUFJLEdBQUdILDZDQUFDLENBQUNHLElBQUQsQ0FBUjtBQUNBLFdBQUtKLEtBQUwsR0FBYSxLQUFLQSxLQUFMLENBQVdTLEdBQVgsQ0FBZUwsSUFBZixDQUFiO0FBRUFBLFVBQUksQ0FBQ0UsRUFBTCxDQUFRLE9BQVIsRUFBaUIsMkNBQWpCLEVBQThELFVBQUNJLEtBQUQ7QUFBQSxlQUFXLE1BQUksQ0FBQ0MsT0FBTCxDQUFhRCxLQUFiLENBQVg7QUFBQSxPQUE5RDtBQUNBTixVQUFJLENBQUNFLEVBQUwsQ0FBUSxPQUFSLEVBQWlCLGtEQUFqQixFQUFxRSxVQUFDSSxLQUFEO0FBQUEsZUFBVyxNQUFJLENBQUNFLFVBQUwsQ0FBZ0JGLEtBQWhCLENBQVg7QUFBQSxPQUFyRTtBQUNBTixVQUFJLENBQUNFLEVBQUwsQ0FBUSxPQUFSLEVBQWlCLG9EQUFqQixF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QyxDQUE4QywrQkFBOUMsQ0FBWjtBQUNBLFVBQUkwQixRQUFRLEdBQUd6QyxJQUFJLENBQUNpQixJQUFMLENBQVUsS0FBVixDQUFmO0FBQ0EsVUFBSWdCLFFBQVEsR0FBR2pDLElBQUksQ0FBQ2lCLElBQUwsQ0FBVSxLQUFWLENBQWY7QUFFQWpCLFVBQUksQ0FBQ2UsSUFBTCxDQUFVLDJDQUFWLEVBQXVEOEIsSUFBdkQsQ0FBNEQsVUFBNUQsRUFBd0UsS0FBeEU7QUFDQTdDLFVBQUksQ0FBQ2UsSUFBTCxDQUFVLGtEQUFWLEVBQThEOEIsSUFBOUQsQ0FBbUUsVUFBbkUsRUFBK0UsS0FBL0U7O0FBRUEsVUFBSSxPQUFPSixRQUFQLEtBQW9CLFdBQXBCLElBQW1DVCxLQUFLLENBQUNFLE1BQU4sSUFBZ0JPLFFBQXZELEVBQWlFO0FBQzdEekMsWUFBSSxDQUFDZSxJQUFMLENBQVUsa0RBQVYsRUFBOEQ4QixJQUE5RCxDQUFtRSxVQUFuRSxFQUErRSxJQUEvRTtBQUNIOztBQUVELFVBQUksT0FBT1osUUFBUCxLQUFvQixXQUFwQixJQUFtQ0QsS0FBSyxDQUFDRSxNQUFOLElBQWdCRCxRQUF2RCxFQUFpRTtBQUM3RGpDLFlBQUksQ0FBQ2UsSUFBTCxDQUFVLDJDQUFWLEVBQXVEOEIsSUFBdkQsQ0FBNEQsVUFBNUQsRUFBd0UsSUFBeEU7QUFDSDtBQUNKOzs7Ozs7O0FBR0UsSUFBSTRDLFFBQVEsR0FBRyxJQUFJOUYsZ0JBQUosRUFBZiIsImZpbGUiOiIuL2FwcC9mb3Jtcy9maWVsZHMvY29sbGVjdGlvbnMuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IFNvcnRhYmxlIGZyb20gJ3NvcnRhYmxlanMnO1xuaW1wb3J0ICcuLi8uLi91dGlscy9qcXVlcnktdXRpbHMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb2xsZWN0aW9uc0ZpZWxkIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5saXN0cyA9ICQoKTtcblxuICAgICAgICAkKCdbZGF0YS10eXBlPVwiY29sbGVjdGlvblwiXScpLmVhY2goKGluZGV4LCBsaXN0KSA9PiB0aGlzLmFkZExpc3QobGlzdCkpO1xuICAgICAgICAkKCdib2R5Jykub24oJ211dGF0aW9uLl9ncmF2JywgdGhpcy5fb25BZGRlZE5vZGVzLmJpbmQodGhpcykpO1xuXG4gICAgfVxuXG4gICAgYWRkTGlzdChsaXN0KSB7XG4gICAgICAgIGxpc3QgPSAkKGxpc3QpO1xuICAgICAgICB0aGlzLmxpc3RzID0gdGhpcy5saXN0cy5hZGQobGlzdCk7XG5cbiAgICAgICAgbGlzdC5vbignY2xpY2snLCAnPiAuY29sbGVjdGlvbi1hY3Rpb25zIFtkYXRhLWFjdGlvbj1cImFkZFwiXScsIChldmVudCkgPT4gdGhpcy5hZGRJdGVtKGV2ZW50KSk7XG4gICAgICAgIGxpc3Qub24oJ2NsaWNrJywgJz4gdWwgPiBsaSA+IC5pdGVtLWFjdGlvbnMgW2RhdGEtYWN0aW9uPVwiZGVsZXRlXCJdJywgKGV2ZW50KSA9PiB0aGlzLnJlbW92ZUl0ZW0oZXZlbnQpKTtcbiAgICAgICAgbGlzdC5vbignY2xpY2snLCAnPiB1bCA+IGxpID4gLml0ZW0tYWN0aW9ucyBbZGF0YS1hY3Rpb249XCJjb2xsYXBzZVwiXScsIChldmVudCkgPT4gdGhpcy5jb2xsYXBzZUl0ZW0oZXZlbnQpKTtcbiAgICAgICAgbGlzdC5vbignY2xpY2snLCAnPiB1bCA+IGxpID4gLml0ZW0tYWN0aW9ucyBbZGF0YS1hY3Rpb249XCJleHBhbmRcIl0nLCAoZXZlbnQpID0+IHRoaXMuZXhwYW5kSXRlbShldmVudCkpO1xuICAgICAgICBsaXN0Lm9uKCdjbGljaycsICc+IC5jb2xsZWN0aW9uLWFjdGlvbnMgW2RhdGEtYWN0aW9uLXNvcnQ9XCJkYXRlXCJdJywgKGV2ZW50KSA9PiB0aGlzLnNvcnRJdGVtcyhldmVudCkpO1xuICAgICAgICBsaXN0Lm9uKCdjbGljaycsICc+IC5jb2xsZWN0aW9uLWFjdGlvbnMgW2RhdGEtYWN0aW9uPVwiY29sbGFwc2VfYWxsXCJdJywgKGV2ZW50KSA9PiB0aGlzLmNvbGxhcHNlSXRlbXMoZXZlbnQpKTtcbiAgICAgICAgbGlzdC5vbignY2xpY2snLCAnPiAuY29sbGVjdGlvbi1hY3Rpb25zIFtkYXRhLWFjdGlvbj1cImV4cGFuZF9hbGxcIl0nLCAoZXZlbnQpID0+IHRoaXMuZXhwYW5kSXRlbXMoZXZlbnQpKTtcbiAgICAgICAgbGlzdC5vbignaW5wdXQgY2hhbmdlJywgJ1tkYXRhLWtleS1vYnNlcnZlXScsIChldmVudCkgPT4gdGhpcy5vYnNlcnZlS2V5KGV2ZW50KSk7XG5cbiAgICAgICAgbGlzdC5maW5kKCdbZGF0YS1jb2xsZWN0aW9uLWhvbGRlcl0nKS5lYWNoKChpbmRleCwgY29udGFpbmVyKSA9PiB7XG4gICAgICAgICAgICBjb250YWluZXIgPSAkKGNvbnRhaW5lcik7XG4gICAgICAgICAgICBpZiAoY29udGFpbmVyLmRhdGEoJ2NvbGxlY3Rpb24tc29ydCcpIHx8IGNvbnRhaW5lclswXS5oYXNBdHRyaWJ1dGUoJ2RhdGEtY29sbGVjdGlvbi1ub3NvcnQnKSkgeyByZXR1cm47IH1cblxuICAgICAgICAgICAgY29udGFpbmVyLmRhdGEoJ2NvbGxlY3Rpb24tc29ydCcsIG5ldyBTb3J0YWJsZShjb250YWluZXIuZ2V0KDApLCB7XG4gICAgICAgICAgICAgICAgZm9yY2VGYWxsYmFjazogZmFsc2UsXG4gICAgICAgICAgICAgICAgaGFuZGxlOiAnLmNvbGxlY3Rpb24tc29ydCcsXG4gICAgICAgICAgICAgICAgYW5pbWF0aW9uOiAxNTAsXG4gICAgICAgICAgICAgICAgb25VcGRhdGU6ICgpID0+IHRoaXMucmVpbmRleChjb250YWluZXIpXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX3VwZGF0ZUFjdGlvbnNTdGF0ZUJhc2VkT25NaW5NYXgobGlzdCk7XG4gICAgfVxuXG4gICAgYWRkSXRlbShldmVudCkge1xuICAgICAgICBsZXQgYnV0dG9uID0gJChldmVudC5jdXJyZW50VGFyZ2V0KTtcbiAgICAgICAgbGV0IHBvc2l0aW9uID0gYnV0dG9uLmRhdGEoJ2FjdGlvbi1hZGQnKSB8fCAnYm90dG9tJztcbiAgICAgICAgbGV0IGxpc3QgPSAkKGJ1dHRvbi5jbG9zZXN0KCdbZGF0YS10eXBlPVwiY29sbGVjdGlvblwiXScpKTtcbiAgICAgICAgbGV0IHRlbXBsYXRlID0gJChsaXN0LmZpbmQoJz4gW2RhdGEtY29sbGVjdGlvbi10ZW1wbGF0ZT1cIm5ld1wiXScpLmRhdGEoJ2NvbGxlY3Rpb24tdGVtcGxhdGUtaHRtbCcpKTtcblxuICAgICAgICB0aGlzLl91cGRhdGVBY3Rpb25zU3RhdGVCYXNlZE9uTWluTWF4KGxpc3QpO1xuICAgICAgICBsZXQgaXRlbXMgPSBsaXN0LmNsb3Nlc3QoJ1tkYXRhLXR5cGU9XCJjb2xsZWN0aW9uXCJdJykuZmluZCgnPiB1bCA+IFtkYXRhLWNvbGxlY3Rpb24taXRlbV0nKTtcbiAgICAgICAgbGV0IG1heEl0ZW1zID0gbGlzdC5kYXRhKCdtYXgnKTtcbiAgICAgICAgaWYgKHR5cGVvZiBtYXhJdGVtcyAhPT0gJ3VuZGVmaW5lZCcgJiYgaXRlbXMubGVuZ3RoID49IG1heEl0ZW1zKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsaXN0LmZpbmQoJz4gW2RhdGEtY29sbGVjdGlvbi1ob2xkZXJdJylbcG9zaXRpb24gPT09ICd0b3AnID8gJ3ByZXBlbmQnIDogJ2FwcGVuZCddKHRlbXBsYXRlKTtcbiAgICAgICAgdGhpcy5yZWluZGV4KGxpc3QpO1xuXG4gICAgICAgIGl0ZW1zID0gbGlzdC5jbG9zZXN0KCdbZGF0YS10eXBlPVwiY29sbGVjdGlvblwiXScpLmZpbmQoJz4gdWwgPiBbZGF0YS1jb2xsZWN0aW9uLWl0ZW1dJyk7XG4gICAgICAgIGxldCB0b3BBY3Rpb24gPSBsaXN0LmNsb3Nlc3QoJ1tkYXRhLXR5cGU9XCJjb2xsZWN0aW9uXCJdJykuZmluZCgnW2RhdGEtYWN0aW9uLWFkZD1cInRvcFwiXScpO1xuICAgICAgICBsZXQgc29ydEFjdGlvbiA9IGxpc3QuY2xvc2VzdCgnW2RhdGEtdHlwZT1cImNvbGxlY3Rpb25cIl0nKS5maW5kKCdbZGF0YS1hY3Rpb249XCJzb3J0XCJdJyk7XG5cbiAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKHRvcEFjdGlvbi5sZW5ndGgpIHsgdG9wQWN0aW9uLnBhcmVudCgpLnJlbW92ZUNsYXNzKCdoaWRkZW4nKTsgfVxuICAgICAgICAgICAgaWYgKHNvcnRBY3Rpb24ubGVuZ3RoICYmIGl0ZW1zLmxlbmd0aCA+IDEpIHsgc29ydEFjdGlvbi5yZW1vdmVDbGFzcygnaGlkZGVuJyk7IH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJlZnJlc2ggdG9nZ2xlYWJsZXMgaW4gYSBsaXN0XG4gICAgICAgICQoJ1tkYXRhLWdyYXYtZmllbGQ9XCJ0b2dnbGVhYmxlXCJdIGlucHV0W3R5cGU9XCJjaGVja2JveFwiXScpLnRyaWdnZXIoJ2NoYW5nZScpO1xuICAgIH1cblxuICAgIHJlbW92ZUl0ZW0oZXZlbnQpIHtcbiAgICAgICAgbGV0IGJ1dHRvbiA9ICQoZXZlbnQuY3VycmVudFRhcmdldCk7XG4gICAgICAgIGxldCBpdGVtID0gYnV0dG9uLmNsb3Nlc3QoJ1tkYXRhLWNvbGxlY3Rpb24taXRlbV0nKTtcbiAgICAgICAgbGV0IGxpc3QgPSAkKGJ1dHRvbi5jbG9zZXN0KCdbZGF0YS10eXBlPVwiY29sbGVjdGlvblwiXScpKTtcblxuICAgICAgICBsZXQgaXRlbXMgPSBsaXN0LmNsb3Nlc3QoJ1tkYXRhLXR5cGU9XCJjb2xsZWN0aW9uXCJdJykuZmluZCgnPiB1bCA+IFtkYXRhLWNvbGxlY3Rpb24taXRlbV0nKTtcbiAgICAgICAgbGV0IG1pbkl0ZW1zID0gbGlzdC5kYXRhKCdtaW4nKTtcblxuICAgICAgICBpZiAodHlwZW9mIG1pbkl0ZW1zICE9PSAndW5kZWZpbmVkJyAmJiBpdGVtcy5sZW5ndGggPD0gbWluSXRlbXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGl0ZW0ucmVtb3ZlKCk7XG4gICAgICAgIHRoaXMucmVpbmRleChsaXN0KTtcblxuICAgICAgICBpdGVtcyA9IGxpc3QuY2xvc2VzdCgnW2RhdGEtdHlwZT1cImNvbGxlY3Rpb25cIl0nKS5maW5kKCc+IHVsID4gW2RhdGEtY29sbGVjdGlvbi1pdGVtXScpO1xuICAgICAgICBsZXQgdG9wQWN0aW9uID0gbGlzdC5jbG9zZXN0KCdbZGF0YS10eXBlPVwiY29sbGVjdGlvblwiXScpLmZpbmQoJ1tkYXRhLWFjdGlvbi1hZGQ9XCJ0b3BcIl0nKTtcbiAgICAgICAgbGV0IHNvcnRBY3Rpb24gPSBsaXN0LmNsb3Nlc3QoJ1tkYXRhLXR5cGU9XCJjb2xsZWN0aW9uXCJdJykuZmluZCgnW2RhdGEtYWN0aW9uPVwic29ydFwiXScpO1xuXG4gICAgICAgIGlmICghaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAodG9wQWN0aW9uLmxlbmd0aCkgeyB0b3BBY3Rpb24ucGFyZW50KCkuYWRkQ2xhc3MoJ2hpZGRlbicpOyB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc29ydEFjdGlvbi5sZW5ndGggJiYgaXRlbXMubGVuZ3RoIDw9IDEpIHsgc29ydEFjdGlvbi5hZGRDbGFzcygnaGlkZGVuJyk7IH1cbiAgICAgICAgdGhpcy5fdXBkYXRlQWN0aW9uc1N0YXRlQmFzZWRPbk1pbk1heChsaXN0KTtcbiAgICB9XG5cbiAgICBjb2xsYXBzZUl0ZW1zKGV2ZW50KSB7XG4gICAgICAgIGxldCBidXR0b24gPSAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpO1xuICAgICAgICBsZXQgaXRlbXMgPSAkKGJ1dHRvbi5jbG9zZXN0KCdbZGF0YS10eXBlPVwiY29sbGVjdGlvblwiXScpKS5maW5kKCc+IHVsID4gW2RhdGEtY29sbGVjdGlvbi1pdGVtXSA+IC5pdGVtLWFjdGlvbnMgW2RhdGEtYWN0aW9uPVwiY29sbGFwc2VcIl0nKTtcblxuICAgICAgICBpdGVtcy5jbGljaygpO1xuICAgIH1cblxuICAgIGNvbGxhcHNlSXRlbShldmVudCkge1xuICAgICAgICBsZXQgYnV0dG9uID0gJChldmVudC5jdXJyZW50VGFyZ2V0KTtcbiAgICAgICAgbGV0IGl0ZW0gPSBidXR0b24uY2xvc2VzdCgnW2RhdGEtY29sbGVjdGlvbi1pdGVtXScpO1xuXG4gICAgICAgIGJ1dHRvbi5hdHRyKCdkYXRhLWFjdGlvbicsICdleHBhbmQnKS5yZW1vdmVDbGFzcygnZmEtY2hldnJvbi1jaXJjbGUtZG93bicpLmFkZENsYXNzKCdmYS1jaGV2cm9uLWNpcmNsZS1yaWdodCcpO1xuICAgICAgICBpdGVtLmFkZENsYXNzKCdjb2xsZWN0aW9uLWNvbGxhcHNlZCcpO1xuICAgIH1cblxuICAgIGV4cGFuZEl0ZW1zKGV2ZW50KSB7XG4gICAgICAgIGxldCBidXR0b24gPSAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpO1xuICAgICAgICBsZXQgaXRlbXMgPSAkKGJ1dHRvbi5jbG9zZXN0KCdbZGF0YS10eXBlPVwiY29sbGVjdGlvblwiXScpKS5maW5kKCc+IHVsID4gW2RhdGEtY29sbGVjdGlvbi1pdGVtXSA+IC5pdGVtLWFjdGlvbnMgW2RhdGEtYWN0aW9uPVwiZXhwYW5kXCJdJyk7XG5cbiAgICAgICAgaXRlbXMuY2xpY2soKTtcbiAgICB9XG5cbiAgICBleHBhbmRJdGVtKGV2ZW50KSB7XG4gICAgICAgIGxldCBidXR0b24gPSAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpO1xuICAgICAgICBsZXQgaXRlbSA9IGJ1dHRvbi5jbG9zZXN0KCdbZGF0YS1jb2xsZWN0aW9uLWl0ZW1dJyk7XG5cbiAgICAgICAgYnV0dG9uLmF0dHIoJ2RhdGEtYWN0aW9uJywgJ2NvbGxhcHNlJykucmVtb3ZlQ2xhc3MoJ2ZhLWNoZXZyb24tY2lyY2xlLXJpZ2h0JykuYWRkQ2xhc3MoJ2ZhLWNoZXZyb24tY2lyY2xlLWRvd24nKTtcbiAgICAgICAgaXRlbS5yZW1vdmVDbGFzcygnY29sbGVjdGlvbi1jb2xsYXBzZWQnKTtcbiAgICB9XG5cbiAgICBzb3J0SXRlbXMoZXZlbnQpIHtcbiAgICAgICAgbGV0IGJ1dHRvbiA9ICQoZXZlbnQuY3VycmVudFRhcmdldCk7XG4gICAgICAgIGxldCBzb3J0YnkgPSBidXR0b24uZGF0YSgnYWN0aW9uLXNvcnQnKTtcbiAgICAgICAgbGV0IHNvcnRieV9kaXIgPSBidXR0b24uZGF0YSgnYWN0aW9uLXNvcnQtZGlyJykgfHwgJ2FzYyc7XG4gICAgICAgIGxldCBsaXN0ID0gJChidXR0b24uY2xvc2VzdCgnW2RhdGEtdHlwZT1cImNvbGxlY3Rpb25cIl0nKSk7XG4gICAgICAgIGxldCBpdGVtcyA9IGxpc3QuY2xvc2VzdCgnW2RhdGEtdHlwZT1cImNvbGxlY3Rpb25cIl0nKS5maW5kKCc+IHVsID4gW2RhdGEtY29sbGVjdGlvbi1pdGVtXScpO1xuXG4gICAgICAgIGl0ZW1zLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgIGxldCBBID0gJChhKS5maW5kKCdbbmFtZSQ9XCJbJyArIHNvcnRieSArICddXCJdJyk7XG4gICAgICAgICAgICBsZXQgQiA9ICQoYikuZmluZCgnW25hbWUkPVwiWycgKyBzb3J0YnkgKyAnXVwiXScpO1xuICAgICAgICAgICAgbGV0IHNvcnQ7XG5cbiAgICAgICAgICAgIGlmIChzb3J0YnlfZGlyID09PSAnYXNjJykge1xuICAgICAgICAgICAgICAgIHNvcnQgPSAoQS52YWwoKSA8IEIudmFsKCkpID8gLTEgOiAoQS52YWwoKSA+IEIudmFsKCkpID8gMSA6IDA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNvcnQgPSAoQS52YWwoKSA+IEIudmFsKCkpID8gLTEgOiAoQS52YWwoKSA8IEIudmFsKCkpID8gMSA6IDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBzb3J0O1xuICAgICAgICB9KS5lYWNoKChfLCBjb250YWluZXIpID0+IHtcbiAgICAgICAgICAgICQoY29udGFpbmVyKS5wYXJlbnQoKS5hcHBlbmQoY29udGFpbmVyKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5yZWluZGV4KGxpc3QpO1xuICAgIH1cblxuICAgIG9ic2VydmVLZXkoZXZlbnQpIHtcbiAgICAgICAgbGV0IGlucHV0ID0gJChldmVudC50YXJnZXQpO1xuICAgICAgICBsZXQgdmFsdWUgPSBpbnB1dC52YWwoKTtcbiAgICAgICAgbGV0IGl0ZW0gPSBpbnB1dC5jbG9zZXN0KCdbZGF0YS1jb2xsZWN0aW9uLWtleV0nKTtcblxuICAgICAgICBpdGVtLmRhdGEoJ2NvbGxlY3Rpb24ta2V5LWJhY2t1cCcsIGl0ZW0uZGF0YSgnY29sbGVjdGlvbi1rZXknKSkuZGF0YSgnY29sbGVjdGlvbi1rZXknLCB2YWx1ZSk7XG4gICAgICAgIHRoaXMucmVpbmRleChudWxsLCBpdGVtKTtcbiAgICB9XG5cbiAgICByZWluZGV4KGxpc3QsIGl0ZW1zKSB7XG4gICAgICAgIGl0ZW1zID0gaXRlbXMgfHwgJChsaXN0KS5jbG9zZXN0KCdbZGF0YS10eXBlPVwiY29sbGVjdGlvblwiXScpLmZpbmQoJz4gdWwgPiBbZGF0YS1jb2xsZWN0aW9uLWl0ZW1dJyk7XG5cbiAgICAgICAgaXRlbXMuZWFjaCgoaW5kZXgsIGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGl0ZW0gPSAkKGl0ZW0pO1xuXG4gICAgICAgICAgICBsZXQgb2JzZXJ2ZWQgPSBpdGVtLmZpbmQoJ1tkYXRhLWtleS1vYnNlcnZlXScpO1xuICAgICAgICAgICAgbGV0IG9ic2VydmVkVmFsdWUgPSBvYnNlcnZlZC52YWwoKTtcbiAgICAgICAgICAgIGxldCBoYXNDdXN0b21LZXkgPSBvYnNlcnZlZC5sZW5ndGg7XG4gICAgICAgICAgICBsZXQgY3VycmVudEtleSA9IGl0ZW0uZGF0YSgnY29sbGVjdGlvbi1rZXktYmFja3VwJyk7XG5cbiAgICAgICAgICAgIGl0ZW0uYXR0cignZGF0YS1jb2xsZWN0aW9uLWtleScsIGhhc0N1c3RvbUtleSA/IG9ic2VydmVkVmFsdWUgOiBpbmRleCk7XG5cbiAgICAgICAgICAgIFsnbmFtZScsICdkYXRhLWdyYXYtZmllbGQtbmFtZScsICdmb3InLCAnaWQnLCAnZGF0YS1ncmF2LWZpbGUtc2V0dGluZ3MnLCAnZGF0YS1maWxlLXBvc3QtYWRkJywgJ2RhdGEtZmlsZS1wb3N0LXJlbW92ZScsICdkYXRhLWdyYXYtYXJyYXktbmFtZSddLmZvckVhY2goKHByb3ApID0+IHtcbiAgICAgICAgICAgICAgICBpdGVtLmZpbmQoJ1snICsgcHJvcCArICddLCBbXycgKyBwcm9wICsgJ10nKS5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZWxlbWVudCA9ICQodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbmRleGVzID0gW107XG4gICAgICAgICAgICAgICAgICAgIGxldCBhcnJheV9pbmRleCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZWdleHBzID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlZ0V4cCgnXFxcXFsoXFxcXGQrfFxcXFwqfCcgKyBjdXJyZW50S2V5ICsgJylcXFxcXScsICdnJyksXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmVnRXhwKCdcXFxcLihcXFxcZCt8XFxcXCp8JyArIGN1cnJlbnRLZXkgKyAnKVxcXFwuJywgJ2cnKVxuICAgICAgICAgICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSB0byBwcmVzZXJ2ZSBhcnJheSBmaWVsZCBpbmRleCBrZXlzXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wID09PSAnbmFtZScgJiYgZWxlbWVudC5kYXRhKCdncmF2QXJyYXlUeXBlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoX2luZGV4ID0gZWxlbWVudC5hdHRyKHByb3ApLm1hdGNoKC9cXFtbMC05XXsxLH1cXF0kLyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXR0ZXJuID0gZWxlbWVudFswXS5jbG9zZXN0KCdbZGF0YS1ncmF2LWFycmF5LW5hbWVdJykuZGF0YXNldC5ncmF2QXJyYXlOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoX2luZGV4ICYmIHBhdHRlcm4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheV9pbmRleCA9IG1hdGNoX2luZGV4WzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuYXR0cihwcm9wLCBgJHtwYXR0ZXJufSR7bWF0Y2hfaW5kZXhbMF19YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0N1c3RvbUtleSAmJiAhb2JzZXJ2ZWRWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5hdHRyKGBfJHtwcm9wfWAsIGVsZW1lbnQuYXR0cihwcm9wKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmF0dHIocHJvcCwgbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5hdHRyKGBfJHtwcm9wfWApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmF0dHIocHJvcCwgZWxlbWVudC5hdHRyKGBfJHtwcm9wfWApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuYXR0cihgXyR7cHJvcH1gLCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQucGFyZW50cygnW2RhdGEtY29sbGVjdGlvbi1rZXldJykubWFwKChpZHgsIHBhcmVudCkgPT4gaW5kZXhlcy5wdXNoKCQocGFyZW50KS5hdHRyKCdkYXRhLWNvbGxlY3Rpb24ta2V5JykpKTtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXhlcy5yZXZlcnNlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IG1hdGNoZWRLZXkgPSBjdXJyZW50S2V5O1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVwbGFjZWQgPSBlbGVtZW50LmF0dHIocHJvcCkucmVwbGFjZShyZWdleHBzWzBdLCAoLyogc3RyLCBwMSwgb2Zmc2V0ICovKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXh0cmFzID0gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJyYXlfaW5kZXgpIHsgZXh0cmFzID0gYXJyYXlfaW5kZXg7IGNvbnNvbGUubG9nKGluZGV4ZXMsIGV4dHJhcyk7IH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZEtleSA9IGluZGV4ZXMuc2hpZnQoKSB8fCBtYXRjaGVkS2V5O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbJHttYXRjaGVkS2V5fV0ke2V4dHJhc31gO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICByZXBsYWNlZCA9IHJlcGxhY2VkLnJlcGxhY2UocmVnZXhwc1sxXSwgKC8qIHN0ciwgcDEsIG9mZnNldCAqLykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZEtleSA9IGluZGV4ZXMuc2hpZnQoKSB8fCBtYXRjaGVkS2V5O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAuJHttYXRjaGVkS2V5fS5gO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmF0dHIocHJvcCwgcmVwbGFjZWQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9vbkFkZGVkTm9kZXMoZXZlbnQsIHRhcmdldC8qICwgcmVjb3JkLCBpbnN0YW5jZSAqLykge1xuICAgICAgICBsZXQgY29sbGVjdGlvbnMgPSAkKHRhcmdldCkuZmluZCgnW2RhdGEtdHlwZT1cImNvbGxlY3Rpb25cIl0nKTtcbiAgICAgICAgaWYgKCFjb2xsZWN0aW9ucy5sZW5ndGgpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgY29sbGVjdGlvbnMuZWFjaCgoaW5kZXgsIGNvbGxlY3Rpb24pID0+IHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb24gPSAkKGNvbGxlY3Rpb24pO1xuICAgICAgICAgICAgaWYgKCF+dGhpcy5saXN0cy5pbmRleChjb2xsZWN0aW9uKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkTGlzdChjb2xsZWN0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX3VwZGF0ZUFjdGlvbnNTdGF0ZUJhc2VkT25NaW5NYXgobGlzdCkge1xuICAgICAgICBsZXQgaXRlbXMgPSBsaXN0LmNsb3Nlc3QoJ1tkYXRhLXR5cGU9XCJjb2xsZWN0aW9uXCJdJykuZmluZCgnPiB1bCA+IFtkYXRhLWNvbGxlY3Rpb24taXRlbV0nKTtcbiAgICAgICAgbGV0IG1pbkl0ZW1zID0gbGlzdC5kYXRhKCdtaW4nKTtcbiAgICAgICAgbGV0IG1heEl0ZW1zID0gbGlzdC5kYXRhKCdtYXgnKTtcblxuICAgICAgICBsaXN0LmZpbmQoJz4gLmNvbGxlY3Rpb24tYWN0aW9ucyBbZGF0YS1hY3Rpb249XCJhZGRcIl0nKS5hdHRyKCdkaXNhYmxlZCcsIGZhbHNlKTtcbiAgICAgICAgbGlzdC5maW5kKCc+IHVsID4gbGkgPiAuaXRlbS1hY3Rpb25zIFtkYXRhLWFjdGlvbj1cImRlbGV0ZVwiXScpLmF0dHIoJ2Rpc2FibGVkJywgZmFsc2UpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgbWluSXRlbXMgIT09ICd1bmRlZmluZWQnICYmIGl0ZW1zLmxlbmd0aCA8PSBtaW5JdGVtcykge1xuICAgICAgICAgICAgbGlzdC5maW5kKCc+IHVsID4gbGkgPiAuaXRlbS1hY3Rpb25zIFtkYXRhLWFjdGlvbj1cImRlbGV0ZVwiXScpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIG1heEl0ZW1zICE9PSAndW5kZWZpbmVkJyAmJiBpdGVtcy5sZW5ndGggPj0gbWF4SXRlbXMpIHtcbiAgICAgICAgICAgIGxpc3QuZmluZCgnPiAuY29sbGVjdGlvbi1hY3Rpb25zIFtkYXRhLWFjdGlvbj1cImFkZFwiXScpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBsZXQgSW5zdGFuY2UgPSBuZXcgQ29sbGVjdGlvbnNGaWVsZCgpO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./app/forms/fields/collections.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ CollectionsField),\n/* harmony export */ \"Instance\": () => (/* binding */ Instance)\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var sortablejs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! sortablejs */ \"./node_modules/sortablejs/modular/sortable.esm.js\");\n/* harmony import */ var _utils_jquery_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/jquery-utils */ \"./app/utils/jquery-utils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\n\nvar CollectionsField = /*#__PURE__*/function () {\n function CollectionsField() {\n var _this = this;\n\n _classCallCheck(this, CollectionsField);\n\n this.lists = jquery__WEBPACK_IMPORTED_MODULE_0___default()();\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-type=\"collection\"]').each(function (index, list) {\n return _this.addList(list);\n });\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('body').on('mutation._grav', this._onAddedNodes.bind(this));\n }\n\n _createClass(CollectionsField, [{\n key: \"addList\",\n value: function addList(list) {\n var _this2 = this;\n\n list = jquery__WEBPACK_IMPORTED_MODULE_0___default()(list);\n this.lists = this.lists.add(list);\n list.on('click', '> .collection-actions [data-action=\"add\"]', function (event) {\n return _this2.addItem(event);\n });\n list.on('click', '> ul > li > .item-actions [data-action=\"delete\"]', function (event) {\n return _this2.removeItem(event);\n });\n list.on('click', '> ul > li > .item-actions [data-action=\"collapse\"]', function (event) {\n return _this2.collapseItem(event);\n });\n list.on('click', '> ul > li > .item-actions [data-action=\"expand\"]', function (event) {\n return _this2.expandItem(event);\n });\n list.on('click', '> .collection-actions [data-action-sort=\"date\"]', function (event) {\n return _this2.sortItems(event);\n });\n list.on('click', '> .collection-actions [data-action=\"collapse_all\"]', function (event) {\n return _this2.collapseItems(event);\n });\n list.on('click', '> .collection-actions [data-action=\"expand_all\"]', function (event) {\n return _this2.expandItems(event);\n });\n list.on('input change', '[data-key-observe]', function (event) {\n return _this2.observeKey(event);\n });\n list.find('[data-collection-holder]').each(function (index, container) {\n container = jquery__WEBPACK_IMPORTED_MODULE_0___default()(container);\n\n if (container.data('collection-sort') || container[0].hasAttribute('data-collection-nosort')) {\n return;\n }\n\n container.data('collection-sort', new sortablejs__WEBPACK_IMPORTED_MODULE_1__.default(container.get(0), {\n forceFallback: false,\n handle: '.collection-sort',\n animation: 150,\n onUpdate: function onUpdate() {\n return _this2.reindex(container);\n }\n }));\n });\n\n this._updateActionsStateBasedOnMinMax(list);\n }\n }, {\n key: \"addItem\",\n value: function addItem(event) {\n var button = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.currentTarget);\n var position = button.data('action-add') || 'bottom';\n var list = jquery__WEBPACK_IMPORTED_MODULE_0___default()(button.closest('[data-type=\"collection\"]'));\n var template = jquery__WEBPACK_IMPORTED_MODULE_0___default()(list.find('> [data-collection-template=\"new\"]').data('collection-template-html'));\n\n this._updateActionsStateBasedOnMinMax(list);\n\n var items = list.closest('[data-type=\"collection\"]').find('> ul > [data-collection-item]');\n var maxItems = list.data('max');\n\n if (typeof maxItems !== 'undefined' && items.length >= maxItems) {\n return;\n }\n\n list.find('> [data-collection-holder]')[position === 'top' ? 'prepend' : 'append'](template);\n this.reindex(list);\n items = list.closest('[data-type=\"collection\"]').find('> ul > [data-collection-item]');\n var topAction = list.closest('[data-type=\"collection\"]').find('[data-action-add=\"top\"]');\n var sortAction = list.closest('[data-type=\"collection\"]').find('[data-action=\"sort\"]');\n\n if (items.length) {\n if (topAction.length) {\n topAction.parent().removeClass('hidden');\n }\n\n if (sortAction.length && items.length > 1) {\n sortAction.removeClass('hidden');\n }\n } // refresh toggleables in a list\n\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-grav-field=\"toggleable\"] input[type=\"checkbox\"]').trigger('change');\n }\n }, {\n key: \"removeItem\",\n value: function removeItem(event) {\n var button = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.currentTarget);\n var item = button.closest('[data-collection-item]');\n var list = jquery__WEBPACK_IMPORTED_MODULE_0___default()(button.closest('[data-type=\"collection\"]'));\n var items = list.closest('[data-type=\"collection\"]').find('> ul > [data-collection-item]');\n var minItems = list.data('min');\n\n if (typeof minItems !== 'undefined' && items.length <= minItems) {\n return;\n }\n\n item.remove();\n this.reindex(list);\n items = list.closest('[data-type=\"collection\"]').find('> ul > [data-collection-item]');\n var topAction = list.closest('[data-type=\"collection\"]').find('[data-action-add=\"top\"]');\n var sortAction = list.closest('[data-type=\"collection\"]').find('[data-action=\"sort\"]');\n\n if (!items.length) {\n if (topAction.length) {\n topAction.parent().addClass('hidden');\n }\n }\n\n if (sortAction.length && items.length <= 1) {\n sortAction.addClass('hidden');\n }\n\n this._updateActionsStateBasedOnMinMax(list);\n }\n }, {\n key: \"collapseItems\",\n value: function collapseItems(event) {\n var button = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.currentTarget);\n var items = jquery__WEBPACK_IMPORTED_MODULE_0___default()(button.closest('[data-type=\"collection\"]')).find('> ul > [data-collection-item] > .item-actions [data-action=\"collapse\"]');\n items.click();\n }\n }, {\n key: \"collapseItem\",\n value: function collapseItem(event) {\n var button = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.currentTarget);\n var item = button.closest('[data-collection-item]');\n button.attr('data-action', 'expand').removeClass('fa-chevron-circle-down').addClass('fa-chevron-circle-right');\n item.addClass('collection-collapsed');\n }\n }, {\n key: \"expandItems\",\n value: function expandItems(event) {\n var button = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.currentTarget);\n var items = jquery__WEBPACK_IMPORTED_MODULE_0___default()(button.closest('[data-type=\"collection\"]')).find('> ul > [data-collection-item] > .item-actions [data-action=\"expand\"]');\n items.click();\n }\n }, {\n key: \"expandItem\",\n value: function expandItem(event) {\n var button = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.currentTarget);\n var item = button.closest('[data-collection-item]');\n button.attr('data-action', 'collapse').removeClass('fa-chevron-circle-right').addClass('fa-chevron-circle-down');\n item.removeClass('collection-collapsed');\n }\n }, {\n key: \"sortItems\",\n value: function sortItems(event) {\n var button = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.currentTarget);\n var sortby = button.data('action-sort');\n var sortby_dir = button.data('action-sort-dir') || 'asc';\n var list = jquery__WEBPACK_IMPORTED_MODULE_0___default()(button.closest('[data-type=\"collection\"]'));\n var items = list.closest('[data-type=\"collection\"]').find('> ul > [data-collection-item]');\n items.sort(function (a, b) {\n var A = jquery__WEBPACK_IMPORTED_MODULE_0___default()(a).find('[name$=\"[' + sortby + ']\"]');\n var B = jquery__WEBPACK_IMPORTED_MODULE_0___default()(b).find('[name$=\"[' + sortby + ']\"]');\n var sort;\n\n if (sortby_dir === 'asc') {\n sort = A.val() < B.val() ? -1 : A.val() > B.val() ? 1 : 0;\n } else {\n sort = A.val() > B.val() ? -1 : A.val() < B.val() ? 1 : 0;\n }\n\n return sort;\n }).each(function (_, container) {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(container).parent().append(container);\n });\n this.reindex(list);\n }\n }, {\n key: \"observeKey\",\n value: function observeKey(event) {\n var input = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.target);\n var value = input.val();\n var item = input.closest('[data-collection-key]');\n item.data('collection-key-backup', item.data('collection-key')).data('collection-key', value);\n this.reindex(null, item);\n }\n }, {\n key: \"reindex\",\n value: function reindex(list, items) {\n items = items || jquery__WEBPACK_IMPORTED_MODULE_0___default()(list).closest('[data-type=\"collection\"]').find('> ul > [data-collection-item]');\n items.each(function (index, item) {\n item = jquery__WEBPACK_IMPORTED_MODULE_0___default()(item);\n var observed = item.find('[data-key-observe]');\n var observedValue = observed.val();\n var hasCustomKey = observed.length;\n var currentKey = item.data('collection-key-backup');\n item.attr('data-collection-key', hasCustomKey ? observedValue : index);\n ['name', 'data-grav-field-name', 'for', 'id', 'data-grav-file-settings', 'data-file-post-add', 'data-file-post-remove', 'data-grav-array-name'].forEach(function (prop) {\n item.find('[' + prop + '], [_' + prop + ']').each(function () {\n var element = jquery__WEBPACK_IMPORTED_MODULE_0___default()(this);\n var indexes = [];\n var array_index = null;\n var regexps = [new RegExp('\\\\[(\\\\d+|\\\\*|' + currentKey + ')\\\\]', 'g'), new RegExp('\\\\.(\\\\d+|\\\\*|' + currentKey + ')\\\\.', 'g')]; // special case to preserve array field index keys\n\n if (prop === 'name' && element.data('gravArrayType')) {\n var match_index = element.attr(prop).match(/\\[[0-9]{1,}\\]$/);\n var pattern = element[0].closest('[data-grav-array-name]').dataset.gravArrayName;\n\n if (match_index && pattern) {\n array_index = match_index[0];\n element.attr(prop, \"\".concat(pattern).concat(match_index[0]));\n return;\n }\n }\n\n if (hasCustomKey && !observedValue) {\n element.attr(\"_\".concat(prop), element.attr(prop));\n element.attr(prop, null);\n return;\n }\n\n if (element.attr(\"_\".concat(prop))) {\n element.attr(prop, element.attr(\"_\".concat(prop)));\n element.attr(\"_\".concat(prop), null);\n }\n\n element.parents('[data-collection-key]').map(function (idx, parent) {\n return indexes.push(jquery__WEBPACK_IMPORTED_MODULE_0___default()(parent).attr('data-collection-key'));\n });\n indexes.reverse();\n var matchedKey = currentKey;\n var replaced = element.attr(prop).replace(regexps[0], function ()\n /* str, p1, offset */\n {\n var extras = '';\n\n if (array_index) {\n extras = array_index;\n console.log(indexes, extras);\n }\n\n matchedKey = indexes.shift() || matchedKey;\n return \"[\".concat(matchedKey, \"]\").concat(extras);\n });\n replaced = replaced.replace(regexps[1], function ()\n /* str, p1, offset */\n {\n matchedKey = indexes.shift() || matchedKey;\n return \".\".concat(matchedKey, \".\");\n });\n element.attr(prop, replaced);\n });\n });\n });\n }\n }, {\n key: \"_onAddedNodes\",\n value: function _onAddedNodes(event, target\n /* , record, instance */\n ) {\n var _this3 = this;\n\n var collections = jquery__WEBPACK_IMPORTED_MODULE_0___default()(target).find('[data-type=\"collection\"]');\n\n if (!collections.length) {\n return;\n }\n\n collections.each(function (index, collection) {\n collection = jquery__WEBPACK_IMPORTED_MODULE_0___default()(collection);\n\n if (!~_this3.lists.index(collection)) {\n _this3.addList(collection);\n }\n });\n }\n }, {\n key: \"_updateActionsStateBasedOnMinMax\",\n value: function _updateActionsStateBasedOnMinMax(list) {\n var items = list.closest('[data-type=\"collection\"]').find('> ul > [data-collection-item]');\n var minItems = list.data('min');\n var maxItems = list.data('max');\n list.find('> .collection-actions [data-action=\"add\"]').attr('disabled', false);\n list.find('> ul > li > .item-actions [data-action=\"delete\"]').attr('disabled', false);\n\n if (typeof minItems !== 'undefined' && items.length <= minItems) {\n list.find('> ul > li > .item-actions [data-action=\"delete\"]').attr('disabled', true);\n }\n\n if (typeof maxItems !== 'undefined' && items.length >= maxItems) {\n list.find('> .collection-actions [data-action=\"add\"]').attr('disabled', true);\n }\n }\n }]);\n\n return CollectionsField;\n}();\n\n\nvar Instance = new CollectionsField();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL2Zvcm1zL2ZpZWxkcy9jb2xsZWN0aW9ucy5qcz82YzU1Il0sIm5hbWVzIjpbIkNvbGxlY3Rpb25zRmllbGQiLCJsaXN0cyIsIiQiLCJlYWNoIiwiaW5kZXgiLCJsaXN0IiwiYWRkTGlzdCIsIm9uIiwiX29uQWRkZWROb2RlcyIsImJpbmQiLCJhZGQiLCJldmVudCIsImFkZEl0ZW0iLCJyZW1vdmVJdGVtIiwiY29sbGFwc2VJdGVtIiwiZXhwYW5kSXRlbSIsInNvcnRJdGVtcyIsImNvbGxhcHNlSXRlbXMiLCJleHBhbmRJdGVtcyIsIm9ic2VydmVLZXkiLCJmaW5kIiwiY29udGFpbmVyIiwiZGF0YSIsImhhc0F0dHJpYnV0ZSIsIlNvcnRhYmxlIiwiZ2V0IiwiZm9yY2VGYWxsYmFjayIsImhhbmRsZSIsImFuaW1hdGlvbiIsIm9uVXBkYXRlIiwicmVpbmRleCIsIl91cGRhdGVBY3Rpb25zU3RhdGVCYXNlZE9uTWluTWF4IiwiYnV0dG9uIiwiY3VycmVudFRhcmdldCIsInBvc2l0aW9uIiwiY2xvc2VzdCIsInRlbXBsYXRlIiwiaXRlbXMiLCJtYXhJdGVtcyIsImxlbmd0aCIsInRvcEFjdGlvbiIsInNvcnRBY3Rpb24iLCJwYXJlbnQiLCJyZW1vdmVDbGFzcyIsInRyaWdnZXIiLCJpdGVtIiwibWluSXRlbXMiLCJyZW1vdmUiLCJhZGRDbGFzcyIsImNsaWNrIiwiYXR0ciIsInNvcnRieSIsInNvcnRieV9kaXIiLCJzb3J0IiwiYSIsImIiLCJBIiwiQiIsInZhbCIsIl8iLCJhcHBlbmQiLCJpbnB1dCIsInRhcmdldCIsInZhbHVlIiwib2JzZXJ2ZWQiLCJvYnNlcnZlZFZhbHVlIiwiaGFzQ3VzdG9tS2V5IiwiY3VycmVudEtleSIsImZvckVhY2giLCJwcm9wIiwiZWxlbWVudCIsImluZGV4ZXMiLCJhcnJheV9pbmRleCIsInJlZ2V4cHMiLCJSZWdFeHAiLCJtYXRjaF9pbmRleCIsIm1hdGNoIiwicGF0dGVybiIsImRhdGFzZXQiLCJncmF2QXJyYXlOYW1lIiwicGFyZW50cyIsIm1hcCIsImlkeCIsInB1c2giLCJyZXZlcnNlIiwibWF0Y2hlZEtleSIsInJlcGxhY2VkIiwicmVwbGFjZSIsImV4dHJhcyIsImNvbnNvbGUiLCJsb2ciLCJzaGlmdCIsImNvbGxlY3Rpb25zIiwiY29sbGVjdGlvbiIsIkluc3RhbmNlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7O0lBRXFCQSxnQjtBQUNqQiw4QkFBYztBQUFBOztBQUFBOztBQUNWLFNBQUtDLEtBQUwsR0FBYUMsNkNBQUMsRUFBZDtBQUVBQSxpREFBQyxDQUFDLDBCQUFELENBQUQsQ0FBOEJDLElBQTlCLENBQW1DLFVBQUNDLEtBQUQsRUFBUUMsSUFBUjtBQUFBLGFBQWlCLEtBQUksQ0FBQ0MsT0FBTCxDQUFhRCxJQUFiLENBQWpCO0FBQUEsS0FBbkM7QUFDQUgsaURBQUMsQ0FBQyxNQUFELENBQUQsQ0FBVUssRUFBVixDQUFhLGdCQUFiLEVBQStCLEtBQUtDLGFBQUwsQ0FBbUJDLElBQW5CLENBQXdCLElBQXhCLENBQS9CO0FBRUg7Ozs7V0FFRCxpQkFBUUosSUFBUixFQUFjO0FBQUE7O0FBQ1ZBLFVBQUksR0FBR0gsNkNBQUMsQ0FBQ0csSUFBRCxDQUFSO0FBQ0EsV0FBS0osS0FBTCxHQUFhLEtBQUtBLEtBQUwsQ0FBV1MsR0FBWCxDQUFlTCxJQUFmLENBQWI7QUFFQUEsVUFBSSxDQUFDRSxFQUFMLENBQVEsT0FBUixFQUFpQiwyQ0FBakIsRUFBOEQsVUFBQ0ksS0FBRDtBQUFBLGVBQVcsTUFBSSxDQUFDQyxPQUFMLENBQWFELEtBQWIsQ0FBWDtBQUFBLE9BQTlEO0FBQ0FOLFVBQUksQ0FBQ0UsRUFBTCxDQUFRLE9BQVIsRUFBaUIsa0RBQWpCLEVBQXFFLFVBQUNJLEtBQUQ7QUFBQSxlQUFXLE1BQUksQ0FBQ0UsVUFBTCxDQUFnQkYsS0FBaEIsQ0FBWDtBQUFBLE9BQXJFO0FBQ0FOLFVBQUksQ0FBQ0UsRUFBTCxDQUFRLE9BQVIsRUFBaUIs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QUFiO0FBQ0g7QUFDSixPQUxEO0FBTUg7OztXQUVELDBDQUFpQ3hGLElBQWpDLEVBQXVDO0FBQ25DLFVBQUlnQyxLQUFLLEdBQUdoQyxJQUFJLENBQUM4QixPQUFMLENBQWEsMEJBQWIsRUFBeUNmLElBQXpDLENBQThDLCtCQUE5QyxDQUFaO0FBQ0EsVUFBSTBCLFFBQVEsR0FBR3pDLElBQUksQ0FBQ2lCLElBQUwsQ0FBVSxLQUFWLENBQWY7QUFDQSxVQUFJZ0IsUUFBUSxHQUFHakMsSUFBSSxDQUFDaUIsSUFBTCxDQUFVLEtBQVYsQ0FBZjtBQUVBakIsVUFBSSxDQUFDZSxJQUFMLENBQVUsMkNBQVYsRUFBdUQ4QixJQUF2RCxDQUE0RCxVQUE1RCxFQUF3RSxLQUF4RTtBQUNBN0MsVUFBSSxDQUFDZSxJQUFMLENBQVUsa0RBQVYsRUFBOEQ4QixJQUE5RCxDQUFtRSxVQUFuRSxFQUErRSxLQUEvRTs7QUFFQSxVQUFJLE9BQU9KLFFBQVAsS0FBb0IsV0FBcEIsSUFBbUNULEtBQUssQ0FBQ0UsTUFBTixJQUFnQk8sUUFBdkQsRUFBaUU7QUFDN0R6QyxZQUFJLENBQUNlLElBQUwsQ0FBVSxrREFBVixFQUE4RDhCLElBQTlELENBQW1FLFVBQW5FLEVBQStFLElBQS9FO0FBQ0g7O0FBRUQsVUFBSSxPQUFPWixRQUFQLEtBQW9CLFdBQXBCLElBQW1DRCxLQUFLLENBQUNFLE1BQU4sSUFBZ0JELFFBQXZELEVBQWlFO0FBQzdEakMsWUFBSSxDQUFDZSxJQUFMLENBQVUsMkNBQVYsRUFBdUQ4QixJQUF2RCxDQUE0RCxVQUE1RCxFQUF3RSxJQUF4RTtBQUNIO0FBQ0o7Ozs7Ozs7QUFHRSxJQUFJNEMsUUFBUSxHQUFHLElBQUk5RixnQkFBSixFQUFmIiwiZmlsZSI6Ii4vYXBwL2Zvcm1zL2ZpZWxkcy9jb2xsZWN0aW9ucy5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgU29ydGFibGUgZnJvbSAnc29ydGFibGVqcyc7XG5pbXBvcnQgJy4uLy4uL3V0aWxzL2pxdWVyeS11dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbGxlY3Rpb25zRmllbGQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmxpc3RzID0gJCgpO1xuXG4gICAgICAgICQoJ1tkYXRhLXR5cGU9XCJjb2xsZWN0aW9uXCJdJykuZWFjaCgoaW5kZXgsIGxpc3QpID0+IHRoaXMuYWRkTGlzdChsaXN0KSk7XG4gICAgICAgICQoJ2JvZHknKS5vbignbXV0YXRpb24uX2dyYXYnLCB0aGlzLl9vbkFkZGVkTm9kZXMuYmluZCh0aGlzKSk7XG5cbiAgICB9XG5cbiAgICBhZGRMaXN0KGxpc3QpIHtcbiAgICAgICAgbGlzdCA9ICQobGlzdCk7XG4gICAgICAgIHRoaXMubGlzdHMgPSB0aGlzLmxpc3RzLmFkZChsaXN0KTtcblxuICAgICAgICBsaXN0Lm9uKCdjbGljaycsICc+IC5jb2xsZWN0aW9uLWFjdGlvbnMgW2RhdGEtYWN0aW9uPVwiYWRkXCJdJywgKGV2ZW50KSA9PiB0aGlzLmFkZEl0ZW0oZXZlbnQpKTtcbiAgICAgICAgbGlzdC5vbignY2xpY2snLCAnPiB1bCA+IGxpID4gLml0ZW0tYWN0aW9ucyBbZGF0YS1hY3Rpb249XCJkZWxldGVcIl0nLCAoZXZlbnQpID0+IHRoaXMucmVtb3ZlSXRlbShldmVudCkpO1xuICAgICAgICBsaXN0Lm9uKCdjbGljaycsICc+IHVsID4gbGkgPiAuaXRlbS1hY3Rpb25zIFtkYXRhLWFjdGlvbj1cImNvbGxhcHNlXCJdJywgKGV2ZW50KSA9PiB0aGlzLmNvbGxhcHNlSXRlbShldmVudCkpO1xuICAgICAgICBsaXN0Lm9uKCdjbGljaycsICc+IHVsID4gbGkgPiAuaXRlbS1hY3Rpb25zIFtkYXRhLWFjdGlvbj1cImV4cGFuZFwiXScsIChldmVudCkgPT4gdGhpcy5leHBhbmRJdGVtKGV2ZW50KSk7XG4gICAgICAgIGxpc3Qub24oJ2NsaWNrJywgJz4gLmNvbGxlY3Rpb24tYWN0aW9ucyBbZGF0YS1hY3Rpb24tc29ydD1cImRhdGVcIl0nLCAoZXZlbnQpID0+IHRoaXMuc29ydEl0ZW1zKGV2ZW50KSk7XG4gICAgICAgIGxpc3Qub24oJ2NsaWNrJywgJz4gLmNvbGxlY3Rpb24tYWN0aW9ucyBbZGF0YS1hY3Rpb249XCJjb2xsYXBzZV9hbGxcIl0nLCAoZXZlbnQpID0+IHRoaXMuY29sbGFwc2VJdGVtcyhldmVudCkpO1xuICAgICAgICBsaXN0Lm9uKCdjbGljaycsICc+IC5jb2xsZWN0aW9uLWFjdGlvbnMgW2RhdGEtYWN0aW9uPVwiZXhwYW5kX2FsbFwiXScsIChldmVudCkgPT4gdGhpcy5leHBhbmRJdGVtcyhldmVudCkpO1xuICAgICAgICBsaXN0Lm9uKCdpbnB1dCBjaGFuZ2UnLCAnW2RhdGEta2V5LW9ic2VydmVdJywgKGV2ZW50KSA9PiB0aGlzLm9ic2VydmVLZXkoZXZlbnQpKTtcblxuICAgICAgICBsaXN0LmZpbmQoJ1tkYXRhLWNvbGxlY3Rpb24taG9sZGVyXScpLmVhY2goKGluZGV4LCBjb250YWluZXIpID0+IHtcbiAgICAgICAgICAgIGNvbnRhaW5lciA9ICQoY29udGFpbmVyKTtcbiAgICAgICAgICAgIGlmIChjb250YWluZXIuZGF0YSgnY29sbGVjdGlvbi1zb3J0JykgfHwgY29udGFpbmVyWzBdLmhhc0F0dHJpYnV0ZSgnZGF0YS1jb2xsZWN0aW9uLW5vc29ydCcpKSB7IHJldHVybjsgfVxuXG4gICAgICAgICAgICBjb250YWluZXIuZGF0YSgnY29sbGVjdGlvbi1zb3J0JywgbmV3IFNvcnRhYmxlKGNvbnRhaW5lci5nZXQoMCksIHtcbiAgICAgICAgICAgICAgICBmb3JjZUZhbGxiYWNrOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBoYW5kbGU6ICcuY29sbGVjdGlvbi1zb3J0JyxcbiAgICAgICAgICAgICAgICBhbmltYXRpb246IDE1MCxcbiAgICAgICAgICAgICAgICBvblVwZGF0ZTogKCkgPT4gdGhpcy5yZWluZGV4KGNvbnRhaW5lcilcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fdXBkYXRlQWN0aW9uc1N0YXRlQmFzZWRPbk1pbk1heChsaXN0KTtcbiAgICB9XG5cbiAgICBhZGRJdGVtKGV2ZW50KSB7XG4gICAgICAgIGxldCBidXR0b24gPSAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpO1xuICAgICAgICBsZXQgcG9zaXRpb24gPSBidXR0b24uZGF0YSgnYWN0aW9uLWFkZCcpIHx8ICdib3R0b20nO1xuICAgICAgICBsZXQgbGlzdCA9ICQoYnV0dG9uLmNsb3Nlc3QoJ1tkYXRhLXR5cGU9XCJjb2xsZWN0aW9uXCJdJykpO1xuICAgICAgICBsZXQgdGVtcGxhdGUgPSAkKGxpc3QuZmluZCgnPiBbZGF0YS1jb2xsZWN0aW9uLXRlbXBsYXRlPVwibmV3XCJdJykuZGF0YSgnY29sbGVjdGlvbi10ZW1wbGF0ZS1odG1sJykpO1xuXG4gICAgICAgIHRoaXMuX3VwZGF0ZUFjdGlvbnNTdGF0ZUJhc2VkT25NaW5NYXgobGlzdCk7XG4gICAgICAgIGxldCBpdGVtcyA9IGxpc3QuY2xvc2VzdCgnW2RhdGEtdHlwZT1cImNvbGxlY3Rpb25cIl0nKS5maW5kKCc+IHVsID4gW2RhdGEtY29sbGVjdGlvbi1pdGVtXScpO1xuICAgICAgICBsZXQgbWF4SXRlbXMgPSBsaXN0LmRhdGEoJ21heCcpO1xuICAgICAgICBpZiAodHlwZW9mIG1heEl0ZW1zICE9PSAndW5kZWZpbmVkJyAmJiBpdGVtcy5sZW5ndGggPj0gbWF4SXRlbXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxpc3QuZmluZCgnPiBbZGF0YS1jb2xsZWN0aW9uLWhvbGRlcl0nKVtwb3NpdGlvbiA9PT0gJ3RvcCcgPyAncHJlcGVuZCcgOiAnYXBwZW5kJ10odGVtcGxhdGUpO1xuICAgICAgICB0aGlzLnJlaW5kZXgobGlzdCk7XG5cbiAgICAgICAgaXRlbXMgPSBsaXN0LmNsb3Nlc3QoJ1tkYXRhLXR5cGU9XCJjb2xsZWN0aW9uXCJdJykuZmluZCgnPiB1bCA+IFtkYXRhLWNvbGxlY3Rpb24taXRlbV0nKTtcbiAgICAgICAgbGV0IHRvcEFjdGlvbiA9IGxpc3QuY2xvc2VzdCgnW2RhdGEtdHlwZT1cImNvbGxlY3Rpb25cIl0nKS5maW5kKCdbZGF0YS1hY3Rpb24tYWRkPVwidG9wXCJdJyk7XG4gICAgICAgIGxldCBzb3J0QWN0aW9uID0gbGlzdC5jbG9zZXN0KCdbZGF0YS10eXBlPVwiY29sbGVjdGlvblwiXScpLmZpbmQoJ1tkYXRhLWFjdGlvbj1cInNvcnRcIl0nKTtcblxuICAgICAgICBpZiAoaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAodG9wQWN0aW9uLmxlbmd0aCkgeyB0b3BBY3Rpb24ucGFyZW50KCkucmVtb3ZlQ2xhc3MoJ2hpZGRlbicpOyB9XG4gICAgICAgICAgICBpZiAoc29ydEFjdGlvbi5sZW5ndGggJiYgaXRlbXMubGVuZ3RoID4gMSkgeyBzb3J0QWN0aW9uLnJlbW92ZUNsYXNzKCdoaWRkZW4nKTsgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmVmcmVzaCB0b2dnbGVhYmxlcyBpbiBhIGxpc3RcbiAgICAgICAgJCgnW2RhdGEtZ3Jhdi1maWVsZD1cInRvZ2dsZWFibGVcIl0gaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdJykudHJpZ2dlcignY2hhbmdlJyk7XG4gICAgfVxuXG4gICAgcmVtb3ZlSXRlbShldmVudCkge1xuICAgICAgICBsZXQgYnV0dG9uID0gJChldmVudC5jdXJyZW50VGFyZ2V0KTtcbiAgICAgICAgbGV0IGl0ZW0gPSBidXR0b24uY2xvc2VzdCgnW2RhdGEtY29sbGVjdGlvbi1pdGVtXScpO1xuICAgICAgICBsZXQgbGlzdCA9ICQoYnV0dG9uLmNsb3Nlc3QoJ1tkYXRhLXR5cGU9XCJjb2xsZWN0aW9uXCJdJykpO1xuXG4gICAgICAgIGxldCBpdGVtcyA9IGxpc3QuY2xvc2VzdCgnW2RhdGEtdHlwZT1cImNvbGxlY3Rpb25cIl0nKS5maW5kKCc+IHVsID4gW2RhdGEtY29sbGVjdGlvbi1pdGVtXScpO1xuICAgICAgICBsZXQgbWluSXRlbXMgPSBsaXN0LmRhdGEoJ21pbicpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgbWluSXRlbXMgIT09ICd1bmRlZmluZWQnICYmIGl0ZW1zLmxlbmd0aCA8PSBtaW5JdGVtcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaXRlbS5yZW1vdmUoKTtcbiAgICAgICAgdGhpcy5yZWluZGV4KGxpc3QpO1xuXG4gICAgICAgIGl0ZW1zID0gbGlzdC5jbG9zZXN0KCdbZGF0YS10eXBlPVwiY29sbGVjdGlvblwiXScpLmZpbmQoJz4gdWwgPiBbZGF0YS1jb2xsZWN0aW9uLWl0ZW1dJyk7XG4gICAgICAgIGxldCB0b3BBY3Rpb24gPSBsaXN0LmNsb3Nlc3QoJ1tkYXRhLXR5cGU9XCJjb2xsZWN0aW9uXCJdJykuZmluZCgnW2RhdGEtYWN0aW9uLWFkZD1cInRvcFwiXScpO1xuICAgICAgICBsZXQgc29ydEFjdGlvbiA9IGxpc3QuY2xvc2VzdCgnW2RhdGEtdHlwZT1cImNvbGxlY3Rpb25cIl0nKS5maW5kKCdbZGF0YS1hY3Rpb249XCJzb3J0XCJdJyk7XG5cbiAgICAgICAgaWYgKCFpdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICh0b3BBY3Rpb24ubGVuZ3RoKSB7IHRvcEFjdGlvbi5wYXJlbnQoKS5hZGRDbGFzcygnaGlkZGVuJyk7IH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzb3J0QWN0aW9uLmxlbmd0aCAmJiBpdGVtcy5sZW5ndGggPD0gMSkgeyBzb3J0QWN0aW9uLmFkZENsYXNzKCdoaWRkZW4nKTsgfVxuICAgICAgICB0aGlzLl91cGRhdGVBY3Rpb25zU3RhdGVCYXNlZE9uTWluTWF4KGxpc3QpO1xuICAgIH1cblxuICAgIGNvbGxhcHNlSXRlbXMoZXZlbnQpIHtcbiAgICAgICAgbGV0IGJ1dHRvbiA9ICQoZXZlbnQuY3VycmVudFRhcmdldCk7XG4gICAgICAgIGxldCBpdGVtcyA9ICQoYnV0dG9uLmNsb3Nlc3QoJ1tkYXRhLXR5cGU9XCJjb2xsZWN0aW9uXCJdJykpLmZpbmQoJz4gdWwgPiBbZGF0YS1jb2xsZWN0aW9uLWl0ZW1dID4gLml0ZW0tYWN0aW9ucyBbZGF0YS1hY3Rpb249XCJjb2xsYXBzZVwiXScpO1xuXG4gICAgICAgIGl0ZW1zLmNsaWNrKCk7XG4gICAgfVxuXG4gICAgY29sbGFwc2VJdGVtKGV2ZW50KSB7XG4gICAgICAgIGxldCBidXR0b24gPSAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpO1xuICAgICAgICBsZXQgaXRlbSA9IGJ1dHRvbi5jbG9zZXN0KCdbZGF0YS1jb2xsZWN0aW9uLWl0ZW1dJyk7XG5cbiAgICAgICAgYnV0dG9uLmF0dHIoJ2RhdGEtYWN0aW9uJywgJ2V4cGFuZCcpLnJlbW92ZUNsYXNzKCdmYS1jaGV2cm9uLWNpcmNsZS1kb3duJykuYWRkQ2xhc3MoJ2ZhLWNoZXZyb24tY2lyY2xlLXJpZ2h0Jyk7XG4gICAgICAgIGl0ZW0uYWRkQ2xhc3MoJ2NvbGxlY3Rpb24tY29sbGFwc2VkJyk7XG4gICAgfVxuXG4gICAgZXhwYW5kSXRlbXMoZXZlbnQpIHtcbiAgICAgICAgbGV0IGJ1dHRvbiA9ICQoZXZlbnQuY3VycmVudFRhcmdldCk7XG4gICAgICAgIGxldCBpdGVtcyA9ICQoYnV0dG9uLmNsb3Nlc3QoJ1tkYXRhLXR5cGU9XCJjb2xsZWN0aW9uXCJdJykpLmZpbmQoJz4gdWwgPiBbZGF0YS1jb2xsZWN0aW9uLWl0ZW1dID4gLml0ZW0tYWN0aW9ucyBbZGF0YS1hY3Rpb249XCJleHBhbmRcIl0nKTtcblxuICAgICAgICBpdGVtcy5jbGljaygpO1xuICAgIH1cblxuICAgIGV4cGFuZEl0ZW0oZXZlbnQpIHtcbiAgICAgICAgbGV0IGJ1dHRvbiA9ICQoZXZlbnQuY3VycmVudFRhcmdldCk7XG4gICAgICAgIGxldCBpdGVtID0gYnV0dG9uLmNsb3Nlc3QoJ1tkYXRhLWNvbGxlY3Rpb24taXRlbV0nKTtcblxuICAgICAgICBidXR0b24uYXR0cignZGF0YS1hY3Rpb24nLCAnY29sbGFwc2UnKS5yZW1vdmVDbGFzcygnZmEtY2hldnJvbi1jaXJjbGUtcmlnaHQnKS5hZGRDbGFzcygnZmEtY2hldnJvbi1jaXJjbGUtZG93bicpO1xuICAgICAgICBpdGVtLnJlbW92ZUNsYXNzKCdjb2xsZWN0aW9uLWNvbGxhcHNlZCcpO1xuICAgIH1cblxuICAgIHNvcnRJdGVtcyhldmVudCkge1xuICAgICAgICBsZXQgYnV0dG9uID0gJChldmVudC5jdXJyZW50VGFyZ2V0KTtcbiAgICAgICAgbGV0IHNvcnRieSA9IGJ1dHRvbi5kYXRhKCdhY3Rpb24tc29ydCcpO1xuICAgICAgICBsZXQgc29ydGJ5X2RpciA9IGJ1dHRvbi5kYXRhKCdhY3Rpb24tc29ydC1kaXInKSB8fCAnYXNjJztcbiAgICAgICAgbGV0IGxpc3QgPSAkKGJ1dHRvbi5jbG9zZXN0KCdbZGF0YS10eXBlPVwiY29sbGVjdGlvblwiXScpKTtcbiAgICAgICAgbGV0IGl0ZW1zID0gbGlzdC5jbG9zZXN0KCdbZGF0YS10eXBlPVwiY29sbGVjdGlvblwiXScpLmZpbmQoJz4gdWwgPiBbZGF0YS1jb2xsZWN0aW9uLWl0ZW1dJyk7XG5cbiAgICAgICAgaXRlbXMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgbGV0IEEgPSAkKGEpLmZpbmQoJ1tuYW1lJD1cIlsnICsgc29ydGJ5ICsgJ11cIl0nKTtcbiAgICAgICAgICAgIGxldCBCID0gJChiKS5maW5kKCdbbmFtZSQ9XCJbJyArIHNvcnRieSArICddXCJdJyk7XG4gICAgICAgICAgICBsZXQgc29ydDtcblxuICAgICAgICAgICAgaWYgKHNvcnRieV9kaXIgPT09ICdhc2MnKSB7XG4gICAgICAgICAgICAgICAgc29ydCA9IChBLnZhbCgpIDwgQi52YWwoKSkgPyAtMSA6IChBLnZhbCgpID4gQi52YWwoKSkgPyAxIDogMDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc29ydCA9IChBLnZhbCgpID4gQi52YWwoKSkgPyAtMSA6IChBLnZhbCgpIDwgQi52YWwoKSkgPyAxIDogMDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHNvcnQ7XG4gICAgICAgIH0pLmVhY2goKF8sIGNvbnRhaW5lcikgPT4ge1xuICAgICAgICAgICAgJChjb250YWluZXIpLnBhcmVudCgpLmFwcGVuZChjb250YWluZXIpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnJlaW5kZXgobGlzdCk7XG4gICAgfVxuXG4gICAgb2JzZXJ2ZUtleShldmVudCkge1xuICAgICAgICBsZXQgaW5wdXQgPSAkKGV2ZW50LnRhcmdldCk7XG4gICAgICAgIGxldCB2YWx1ZSA9IGlucHV0LnZhbCgpO1xuICAgICAgICBsZXQgaXRlbSA9IGlucHV0LmNsb3Nlc3QoJ1tkYXRhLWNvbGxlY3Rpb24ta2V5XScpO1xuXG4gICAgICAgIGl0ZW0uZGF0YSgnY29sbGVjdGlvbi1rZXktYmFja3VwJywgaXRlbS5kYXRhKCdjb2xsZWN0aW9uLWtleScpKS5kYXRhKCdjb2xsZWN0aW9uLWtleScsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5yZWluZGV4KG51bGwsIGl0ZW0pO1xuICAgIH1cblxuICAgIHJlaW5kZXgobGlzdCwgaXRlbXMpIHtcbiAgICAgICAgaXRlbXMgPSBpdGVtcyB8fCAkKGxpc3QpLmNsb3Nlc3QoJ1tkYXRhLXR5cGU9XCJjb2xsZWN0aW9uXCJdJykuZmluZCgnPiB1bCA+IFtkYXRhLWNvbGxlY3Rpb24taXRlbV0nKTtcblxuICAgICAgICBpdGVtcy5lYWNoKChpbmRleCwgaXRlbSkgPT4ge1xuICAgICAgICAgICAgaXRlbSA9ICQoaXRlbSk7XG5cbiAgICAgICAgICAgIGxldCBvYnNlcnZlZCA9IGl0ZW0uZmluZCgnW2RhdGEta2V5LW9ic2VydmVdJyk7XG4gICAgICAgICAgICBsZXQgb2JzZXJ2ZWRWYWx1ZSA9IG9ic2VydmVkLnZhbCgpO1xuICAgICAgICAgICAgbGV0IGhhc0N1c3RvbUtleSA9IG9ic2VydmVkLmxlbmd0aDtcbiAgICAgICAgICAgIGxldCBjdXJyZW50S2V5ID0gaXRlbS5kYXRhKCdjb2xsZWN0aW9uLWtleS1iYWNrdXAnKTtcblxuICAgICAgICAgICAgaXRlbS5hdHRyKCdkYXRhLWNvbGxlY3Rpb24ta2V5JywgaGFzQ3VzdG9tS2V5ID8gb2JzZXJ2ZWRWYWx1ZSA6IGluZGV4KTtcblxuICAgICAgICAgICAgWyduYW1lJywgJ2RhdGEtZ3Jhdi1maWVsZC1uYW1lJywgJ2ZvcicsICdpZCcsICdkYXRhLWdyYXYtZmlsZS1zZXR0aW5ncycsICdkYXRhLWZpbGUtcG9zdC1hZGQnLCAnZGF0YS1maWxlLXBvc3QtcmVtb3ZlJywgJ2RhdGEtZ3Jhdi1hcnJheS1uYW1lJ10uZm9yRWFjaCgocHJvcCkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0uZmluZCgnWycgKyBwcm9wICsgJ10sIFtfJyArIHByb3AgKyAnXScpLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBlbGVtZW50ID0gJCh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFycmF5X2luZGV4ID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlZ2V4cHMgPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmVnRXhwKCdcXFxcWyhcXFxcZCt8XFxcXCp8JyArIGN1cnJlbnRLZXkgKyAnKVxcXFxdJywgJ2cnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZWdFeHAoJ1xcXFwuKFxcXFxkK3xcXFxcKnwnICsgY3VycmVudEtleSArICcpXFxcXC4nLCAnZycpXG4gICAgICAgICAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIHRvIHByZXNlcnZlIGFycmF5IGZpZWxkIGluZGV4IGtleXNcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3AgPT09ICduYW1lJyAmJiBlbGVtZW50LmRhdGEoJ2dyYXZBcnJheVR5cGUnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hfaW5kZXggPSBlbGVtZW50LmF0dHIocHJvcCkubWF0Y2goL1xcW1swLTldezEsfVxcXSQvKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhdHRlcm4gPSBlbGVtZW50WzBdLmNsb3Nlc3QoJ1tkYXRhLWdyYXYtYXJyYXktbmFtZV0nKS5kYXRhc2V0LmdyYXZBcnJheU5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hfaW5kZXggJiYgcGF0dGVybikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5X2luZGV4ID0gbWF0Y2hfaW5kZXhbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5hdHRyKHByb3AsIGAke3BhdHRlcm59JHttYXRjaF9pbmRleFswXX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoaGFzQ3VzdG9tS2V5ICYmICFvYnNlcnZlZFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmF0dHIoYF8ke3Byb3B9YCwgZWxlbWVudC5hdHRyKHByb3ApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuYXR0cihwcm9wLCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmF0dHIoYF8ke3Byb3B9YCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuYXR0cihwcm9wLCBlbGVtZW50LmF0dHIoYF8ke3Byb3B9YCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5hdHRyKGBfJHtwcm9wfWAsIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5wYXJlbnRzKCdbZGF0YS1jb2xsZWN0aW9uLWtleV0nKS5tYXAoKGlkeCwgcGFyZW50KSA9PiBpbmRleGVzLnB1c2goJChwYXJlbnQpLmF0dHIoJ2RhdGEtY29sbGVjdGlvbi1rZXknKSkpO1xuICAgICAgICAgICAgICAgICAgICBpbmRleGVzLnJldmVyc2UoKTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgbWF0Y2hlZEtleSA9IGN1cnJlbnRLZXk7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXBsYWNlZCA9IGVsZW1lbnQuYXR0cihwcm9wKS5yZXBsYWNlKHJlZ2V4cHNbMF0sICgvKiBzdHIsIHAxLCBvZmZzZXQgKi8pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBleHRyYXMgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcnJheV9pbmRleCkgeyBleHRyYXMgPSBhcnJheV9pbmRleDsgY29uc29sZS5sb2coaW5kZXhlcywgZXh0cmFzKTsgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVkS2V5ID0gaW5kZXhlcy5zaGlmdCgpIHx8IG1hdGNoZWRLZXk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFske21hdGNoZWRLZXl9XSR7ZXh0cmFzfWA7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHJlcGxhY2VkID0gcmVwbGFjZWQucmVwbGFjZShyZWdleHBzWzFdLCAoLyogc3RyLCBwMSwgb2Zmc2V0ICovKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVkS2V5ID0gaW5kZXhlcy5zaGlmdCgpIHx8IG1hdGNoZWRLZXk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYC4ke21hdGNoZWRLZXl9LmA7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuYXR0cihwcm9wLCByZXBsYWNlZCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX29uQWRkZWROb2RlcyhldmVudCwgdGFyZ2V0LyogLCByZWNvcmQsIGluc3RhbmNlICovKSB7XG4gICAgICAgIGxldCBjb2xsZWN0aW9ucyA9ICQodGFyZ2V0KS5maW5kKCdbZGF0YS10eXBlPVwiY29sbGVjdGlvblwiXScpO1xuICAgICAgICBpZiAoIWNvbGxlY3Rpb25zLmxlbmd0aCkgeyByZXR1cm47IH1cblxuICAgICAgICBjb2xsZWN0aW9ucy5lYWNoKChpbmRleCwgY29sbGVjdGlvbikgPT4ge1xuICAgICAgICAgICAgY29sbGVjdGlvbiA9ICQoY29sbGVjdGlvbik7XG4gICAgICAgICAgICBpZiAoIX50aGlzLmxpc3RzLmluZGV4KGNvbGxlY3Rpb24pKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRMaXN0KGNvbGxlY3Rpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfdXBkYXRlQWN0aW9uc1N0YXRlQmFzZWRPbk1pbk1heChsaXN0KSB7XG4gICAgICAgIGxldCBpdGVtcyA9IGxpc3QuY2xvc2VzdCgnW2RhdGEtdHlwZT1cImNvbGxlY3Rpb25cIl0nKS5maW5kKCc+IHVsID4gW2RhdGEtY29sbGVjdGlvbi1pdGVtXScpO1xuICAgICAgICBsZXQgbWluSXRlbXMgPSBsaXN0LmRhdGEoJ21pbicpO1xuICAgICAgICBsZXQgbWF4SXRlbXMgPSBsaXN0LmRhdGEoJ21heCcpO1xuXG4gICAgICAgIGxpc3QuZmluZCgnPiAuY29sbGVjdGlvbi1hY3Rpb25zIFtkYXRhLWFjdGlvbj1cImFkZFwiXScpLmF0dHIoJ2Rpc2FibGVkJywgZmFsc2UpO1xuICAgICAgICBsaXN0LmZpbmQoJz4gdWwgPiBsaSA+IC5pdGVtLWFjdGlvbnMgW2RhdGEtYWN0aW9uPVwiZGVsZXRlXCJdJykuYXR0cignZGlzYWJsZWQnLCBmYWxzZSk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBtaW5JdGVtcyAhPT0gJ3VuZGVmaW5lZCcgJiYgaXRlbXMubGVuZ3RoIDw9IG1pbkl0ZW1zKSB7XG4gICAgICAgICAgICBsaXN0LmZpbmQoJz4gdWwgPiBsaSA+IC5pdGVtLWFjdGlvbnMgW2RhdGEtYWN0aW9uPVwiZGVsZXRlXCJdJykuYXR0cignZGlzYWJsZWQnLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgbWF4SXRlbXMgIT09ICd1bmRlZmluZWQnICYmIGl0ZW1zLmxlbmd0aCA+PSBtYXhJdGVtcykge1xuICAgICAgICAgICAgbGlzdC5maW5kKCc+IC5jb2xsZWN0aW9uLWFjdGlvbnMgW2RhdGEtYWN0aW9uPVwiYWRkXCJdJykuYXR0cignZGlzYWJsZWQnLCB0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGxldCBJbnN0YW5jZSA9IG5ldyBDb2xsZWN0aW9uc0ZpZWxkKCk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./app/forms/fields/collections.js\n"); /***/ }), /***/ "./app/forms/fields/colorpicker.js": -/*!*****************************************!* +/*!*****************************************!*\ !*** ./app/forms/fields/colorpicker.js ***! \*****************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => /* binding */ ColorpickerField,\n/* harmony export */ \"Instance\": () => /* binding */ Instance\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var mout_math_clamp__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! mout/math/clamp */ \"./node_modules/mout/math/clamp.js\");\n/* harmony import */ var mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(mout_math_clamp__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var mout_function_bind__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! mout/function/bind */ \"./node_modules/mout/function/bind.js\");\n/* harmony import */ var mout_function_bind__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(mout_function_bind__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _utils_colors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../utils/colors */ \"./app/utils/colors.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\n\nvar isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\nvar body = jquery__WEBPACK_IMPORTED_MODULE_0___default()('body');\nvar MOUSEDOWN = 'mousedown touchstart MSPointerDown pointerdown';\nvar MOUSEMOVE = 'mousemove touchmove MSPointerMove pointermove';\nvar MOUSEUP = 'mouseup touchend MSPointerUp pointerup';\nvar FOCUSIN = isFirefox ? 'focus' : 'focusin';\n\nvar ColorpickerField = /*#__PURE__*/function () {\n function ColorpickerField(selector) {\n var _this = this;\n\n _classCallCheck(this, ColorpickerField);\n\n this.selector = selector;\n this.field = jquery__WEBPACK_IMPORTED_MODULE_0___default()(this.selector);\n this.options = Object.assign({}, this.field.data('grav-colorpicker'));\n this.built = false;\n this.attach();\n\n if (this.options.update) {\n this.field.on('change._grav_colorpicker', function (event, field, hex, opacity) {\n var backgroundColor = hex;\n var rgb = (0,_utils_colors__WEBPACK_IMPORTED_MODULE_3__.hex2rgb)(hex);\n\n if (opacity < 1) {\n backgroundColor = 'rgba(' + rgb.r + ', ' + rgb.g + ', ' + rgb.b + ', ' + opacity + ')';\n }\n\n var target = field.closest(_this.options.update);\n\n if (!target.length) {\n target = field.siblings(_this.options.update);\n }\n\n if (!target.length) {\n target = field.parent('.g-colorpicker').find(_this.options.update);\n }\n\n target.css({\n backgroundColor: backgroundColor\n });\n });\n }\n }\n\n _createClass(ColorpickerField, [{\n key: \"attach\",\n value: function attach() {\n var _this2 = this;\n\n body.on(FOCUSIN, this.selector, function (event) {\n return _this2.show(event, event.currentTarget);\n });\n body.on(MOUSEDOWN, this.selector + ' .g-colorpicker, ' + this.selector + ' .g-colorpicker i', this.bound('iconClick'));\n body.on('keydown', this.selector, function (event) {\n switch (event.keyCode) {\n case 9:\n // tab\n _this2.hide();\n\n break;\n\n case 13: // enter\n\n case 27:\n // esc\n _this2.hide();\n\n event.currentTarget.blur();\n break;\n }\n\n return true;\n }); // Update on keyup\n\n body.on('keyup', this.selector, function (event) {\n _this2.updateFromInput(true, event.currentTarget);\n\n return true;\n }); // Update on paste\n\n body.on('paste', this.selector, function (event) {\n setTimeout(function () {\n return _this2.updateFromInput(true, event.currentTarget);\n }, 1);\n });\n }\n }, {\n key: \"show\",\n value: function show(event, target) {\n target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(target);\n\n if (!this.built) {\n this.build();\n }\n\n this.element = target;\n this.reposition();\n this.wrapper.addClass('cp-visible');\n this.updateFromInput();\n this.wrapper.on(MOUSEDOWN, '.cp-grid, .cp-slider, .cp-opacity-slider', this.bound('bodyDown'));\n body.on(MOUSEMOVE, this.bound('bodyMove'));\n body.on(MOUSEDOWN, this.bound('bodyClick'));\n body.on(MOUSEUP, this.bound('targetReset'));\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('#admin-main > .content-wrapper').on('scroll', this.bound('reposition'));\n }\n }, {\n key: \"hide\",\n value: function hide() {\n if (!this.built) {\n return;\n }\n\n this.wrapper.removeClass('cp-visible');\n this.wrapper.undelegate(MOUSEDOWN, '.cp-grid, .cp-slider, .cp-opacity-slider', this.bound('bodyDown'));\n body.off(MOUSEMOVE, this.bound('bodyMove'));\n body.off(MOUSEDOWN, this.bound('bodyClick'));\n body.off(MOUSEUP, this.bound('targetReset'));\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('#admin-main > .content-wrapper').on('scroll', this.bound('reposition'));\n }\n }, {\n key: \"build\",\n value: function build() {\n var _this3 = this;\n\n this.wrapper = jquery__WEBPACK_IMPORTED_MODULE_0___default()('
');\n this.slider = jquery__WEBPACK_IMPORTED_MODULE_0___default()('
').appendTo(this.wrapper).append(jquery__WEBPACK_IMPORTED_MODULE_0___default()('
'));\n this.opacitySlider = jquery__WEBPACK_IMPORTED_MODULE_0___default()('
').appendTo(this.wrapper).append(jquery__WEBPACK_IMPORTED_MODULE_0___default()('
'));\n this.grid = jquery__WEBPACK_IMPORTED_MODULE_0___default()('
').appendTo(this.wrapper).append(jquery__WEBPACK_IMPORTED_MODULE_0___default()('
')).append(jquery__WEBPACK_IMPORTED_MODULE_0___default()('
'));\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('
').appendTo(this.grid.find('.cp-picker'));\n var tabs = jquery__WEBPACK_IMPORTED_MODULE_0___default()('
').appendTo(this.wrapper);\n this.tabs = {\n hue: jquery__WEBPACK_IMPORTED_MODULE_0___default()('
').text('HUE').appendTo(tabs),\n brightness: jquery__WEBPACK_IMPORTED_MODULE_0___default()('
').text('BRI').appendTo(tabs),\n saturation: jquery__WEBPACK_IMPORTED_MODULE_0___default()('
').text('SAT').appendTo(tabs),\n wheel: jquery__WEBPACK_IMPORTED_MODULE_0___default()('
').text('WHEEL').appendTo(tabs),\n transparent: jquery__WEBPACK_IMPORTED_MODULE_0___default()('
').text('TRANSPARENT').appendTo(tabs)\n };\n tabs.on(MOUSEDOWN, '> div', function (event) {\n var element = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.currentTarget);\n\n if (element.is(_this3.tabs.transparent)) {\n var sliderHeight = _this3.opacitySlider.height();\n\n _this3.opacity = 0;\n\n _this3.opacitySlider.find('.cp-picker').css({\n 'top': mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(sliderHeight - sliderHeight * _this3.opacity, 0, sliderHeight)\n });\n\n _this3.move(_this3.opacitySlider, {\n manualOpacity: true\n });\n\n return;\n }\n\n var active = tabs.find('.active');\n var mode = active.attr('class').replace(/\\s|active|cp-tab-/g, '');\n var newMode = element.attr('class').replace(/\\s|active|cp-tab-/g, '');\n\n _this3.wrapper.removeClass('cp-mode-' + mode).addClass('cp-mode-' + newMode);\n\n active.removeClass('active');\n element.addClass('active');\n _this3.mode = newMode;\n\n _this3.updateFromInput();\n });\n this.wrapper.appendTo('.content-wrapper');\n this.built = true;\n this.mode = 'hue';\n }\n }, {\n key: \"reposition\",\n value: function reposition() {\n var ct = jquery__WEBPACK_IMPORTED_MODULE_0___default()('.content-wrapper')[0];\n var offset = this.element[0].getBoundingClientRect();\n var ctOffset = ct.getBoundingClientRect();\n var delta = {\n x: 0,\n y: 0\n };\n\n if (this.options.offset) {\n delta.x = this.options.offset.x || 0;\n delta.y = this.options.offset.y || 0;\n }\n\n this.wrapper.css({\n top: offset.top + offset.height + ct.scrollTop - ctOffset.top + delta.y,\n left: offset.left + ct.scrollLeft - ctOffset.left + delta.x\n });\n }\n }, {\n key: \"iconClick\",\n value: function iconClick(event) {\n if (this.wrapper && this.wrapper.hasClass('cp-visible')) {\n return true;\n }\n\n event && event.preventDefault();\n var input = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.currentTarget).find('input');\n setTimeout(function () {\n return input.focus();\n }, 50);\n }\n }, {\n key: \"bodyMove\",\n value: function bodyMove(event) {\n event && event.preventDefault();\n\n if (this.target) {\n this.move(this.target, event);\n }\n }\n }, {\n key: \"bodyClick\",\n value: function bodyClick(event) {\n var target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.target);\n\n if (!target.closest('.cp-wrapper').length && !target.is(this.selector)) {\n this.hide();\n }\n }\n }, {\n key: \"bodyDown\",\n value: function bodyDown(event) {\n event && event.preventDefault();\n this.target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.currentTarget);\n this.move(this.target, event, true);\n }\n }, {\n key: \"targetReset\",\n value: function targetReset(event) {\n event && event.preventDefault();\n this.target = null;\n }\n }, {\n key: \"move\",\n value: function move(target, event) {\n var input = this.element;\n var picker = target.find('.cp-picker');\n var clientRect = target[0].getBoundingClientRect();\n var offsetX = clientRect.left + window.scrollX;\n var offsetY = clientRect.top + window.scrollY;\n var x = Math.round((event ? event.pageX : 0) - offsetX);\n var y = Math.round((event ? event.pageY : 0) - offsetY);\n var wx;\n var wy;\n var r;\n var phi; // Touch support\n\n var touchEvents = event.changedTouches || event.originalEvent && event.originalEvent.changedTouches;\n\n if (event && touchEvents) {\n x = (touchEvents ? touchEvents[0].pageX : 0) - offsetX;\n y = (touchEvents ? touchEvents[0].pageY : 0) - offsetY;\n }\n\n if (event && event.manualOpacity) {\n y = clientRect.height;\n } // Constrain picker to its container\n\n\n if (x < 0) x = 0;\n if (y < 0) y = 0;\n if (x > clientRect.width) x = clientRect.width;\n if (y > clientRect.height) y = clientRect.height; // Constrain color wheel values to the wheel\n\n if (target.parent('.cp-mode-wheel').length && picker.parent('.cp-grid').length) {\n wx = 75 - x;\n wy = 75 - y;\n r = Math.sqrt(wx * wx + wy * wy);\n phi = Math.atan2(wy, wx);\n if (phi < 0) phi += Math.PI * 2;\n\n if (r > 75) {\n x = 75 - 75 * Math.cos(phi);\n y = 75 - 75 * Math.sin(phi);\n }\n\n x = Math.round(x);\n y = Math.round(y);\n } // Move the picker\n\n\n if (target.hasClass('cp-grid')) {\n picker.css({\n top: y,\n left: x\n });\n this.updateFromPicker(input, target);\n } else {\n picker.css({\n top: y\n });\n this.updateFromPicker(input, target);\n }\n }\n }, {\n key: \"updateFromInput\",\n value: function updateFromInput(dontFireEvent, element) {\n element = element ? jquery__WEBPACK_IMPORTED_MODULE_0___default()(element) : this.element;\n var value = element.val();\n var opacity = value.replace(/\\s/g, '').match(/^rgba?\\([0-9]{1,3},[0-9]{1,3},[0-9]{1,3},(.+)\\)/);\n var hex;\n var hsb;\n value = (0,_utils_colors__WEBPACK_IMPORTED_MODULE_3__.rgbstr2hex)(value) || value;\n opacity = opacity ? mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(opacity[1], 0, 1) : 1;\n\n if (!(hex = (0,_utils_colors__WEBPACK_IMPORTED_MODULE_3__.parseHex)(value))) {\n hex = '#ffffff';\n }\n\n hsb = (0,_utils_colors__WEBPACK_IMPORTED_MODULE_3__.hex2hsb)(hex);\n\n if (this.built) {\n // opacity\n this.opacity = opacity;\n var sliderHeight = this.opacitySlider.height();\n this.opacitySlider.find('.cp-picker').css({\n 'top': mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(sliderHeight - sliderHeight * this.opacity, 0, sliderHeight)\n }); // bg color\n\n var gridHeight = this.grid.height();\n var gridWidth = this.grid.width();\n var r;\n var phi;\n var x;\n var y;\n sliderHeight = this.slider.height();\n\n switch (this.mode) {\n case 'wheel':\n // Set grid position\n r = mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(Math.ceil(hsb.s * 0.75), 0, gridHeight / 2);\n phi = hsb.h * Math.PI / 180;\n x = mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(75 - Math.cos(phi) * r, 0, gridWidth);\n y = mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(75 - Math.sin(phi) * r, 0, gridHeight);\n this.grid.css({\n backgroundColor: 'transparent'\n }).find('.cp-picker').css({\n top: y,\n left: x\n }); // Set slider position\n\n y = 150 - hsb.b / (100 / gridHeight);\n if (hex === '') y = 0;\n this.slider.find('.cp-picker').css({\n top: y\n }); // Update panel color\n\n this.slider.css({\n backgroundColor: (0,_utils_colors__WEBPACK_IMPORTED_MODULE_3__.hsb2hex)({\n h: hsb.h,\n s: hsb.s,\n b: 100\n })\n });\n break;\n\n case 'saturation':\n // Set grid position\n x = mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(5 * hsb.h / 12, 0, 150);\n y = mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(gridHeight - Math.ceil(hsb.b / (100 / gridHeight)), 0, gridHeight);\n this.grid.find('.cp-picker').css({\n top: y,\n left: x\n }); // Set slider position\n\n y = mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(sliderHeight - hsb.s * (sliderHeight / 100), 0, sliderHeight);\n this.slider.find('.cp-picker').css({\n top: y\n }); // Update UI\n\n this.slider.css({\n backgroundColor: (0,_utils_colors__WEBPACK_IMPORTED_MODULE_3__.hsb2hex)({\n h: hsb.h,\n s: 100,\n b: hsb.b\n })\n });\n this.grid.find('.cp-grid-inner').css({\n opacity: hsb.s / 100\n });\n break;\n\n case 'brightness':\n // Set grid position\n x = mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(5 * hsb.h / 12, 0, 150);\n y = mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(gridHeight - Math.ceil(hsb.s / (100 / gridHeight)), 0, gridHeight);\n this.grid.find('.cp-picker').css({\n top: y,\n left: x\n }); // Set slider position\n\n y = mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(sliderHeight - hsb.b * (sliderHeight / 100), 0, sliderHeight);\n this.slider.find('.cp-picker').css({\n top: y\n }); // Update UI\n\n this.slider.css({\n backgroundColor: (0,_utils_colors__WEBPACK_IMPORTED_MODULE_3__.hsb2hex)({\n h: hsb.h,\n s: hsb.s,\n b: 100\n })\n });\n this.grid.find('.cp-grid-inner').css({\n opacity: 1 - hsb.b / 100\n });\n break;\n\n case 'hue':\n default:\n // Set grid position\n x = mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(Math.ceil(hsb.s / (100 / gridWidth)), 0, gridWidth);\n y = mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(gridHeight - Math.ceil(hsb.b / (100 / gridHeight)), 0, gridHeight);\n this.grid.find('.cp-picker').css({\n top: y,\n left: x\n }); // Set slider position\n\n y = mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(sliderHeight - hsb.h / (360 / sliderHeight), 0, sliderHeight);\n this.slider.find('.cp-picker').css({\n top: y\n }); // Update panel color\n\n this.grid.css({\n backgroundColor: (0,_utils_colors__WEBPACK_IMPORTED_MODULE_3__.hsb2hex)({\n h: hsb.h,\n s: 100,\n b: 100\n })\n });\n break;\n }\n }\n\n if (!dontFireEvent) {\n element.val(this.getValue(hex));\n }\n\n (this.element || element).trigger('change._grav_colorpicker', [element, hex, opacity]);\n }\n }, {\n key: \"updateFromPicker\",\n value: function updateFromPicker(input, target) {\n var getCoords = function getCoords(picker, container) {\n var left, top;\n if (!picker.length || !container) return null;\n left = picker[0].getBoundingClientRect().left;\n top = picker[0].getBoundingClientRect().top;\n return {\n x: left - container[0].getBoundingClientRect().left + picker[0].offsetWidth / 2,\n y: top - container[0].getBoundingClientRect().top + picker[0].offsetHeight / 2\n };\n };\n\n var hex;\n var hue;\n var saturation;\n var brightness;\n var x;\n var y;\n var r;\n var phi; // Panel objects\n\n var grid = this.wrapper.find('.cp-grid');\n var slider = this.wrapper.find('.cp-slider');\n var opacitySlider = this.wrapper.find('.cp-opacity-slider'); // Picker objects\n\n var gridPicker = grid.find('.cp-picker');\n var sliderPicker = slider.find('.cp-picker');\n var opacityPicker = opacitySlider.find('.cp-picker'); // Picker positions\n\n var gridPos = getCoords(gridPicker, grid);\n var sliderPos = getCoords(sliderPicker, slider);\n var opacityPos = getCoords(opacityPicker, opacitySlider); // Sizes\n\n var gridWidth = grid[0].getBoundingClientRect().width;\n var gridHeight = grid[0].getBoundingClientRect().height;\n var sliderHeight = slider[0].getBoundingClientRect().height;\n var opacitySliderHeight = opacitySlider[0].getBoundingClientRect().height;\n var value = this.element.val();\n value = (0,_utils_colors__WEBPACK_IMPORTED_MODULE_3__.rgbstr2hex)(value) || value;\n\n if (!(hex = (0,_utils_colors__WEBPACK_IMPORTED_MODULE_3__.parseHex)(value))) {\n hex = '#ffffff';\n } // Handle colors\n\n\n if (target.hasClass('cp-grid') || target.hasClass('cp-slider')) {\n // Determine HSB values\n switch (this.mode) {\n case 'wheel':\n // Calculate hue, saturation, and brightness\n x = gridWidth / 2 - gridPos.x;\n y = gridHeight / 2 - gridPos.y;\n r = Math.sqrt(x * x + y * y);\n phi = Math.atan2(y, x);\n if (phi < 0) phi += Math.PI * 2;\n\n if (r > 75) {\n r = 75;\n gridPos.x = 69 - 75 * Math.cos(phi);\n gridPos.y = 69 - 75 * Math.sin(phi);\n }\n\n saturation = mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(r / 0.75, 0, 100);\n hue = mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(phi * 180 / Math.PI, 0, 360);\n brightness = mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(100 - Math.floor(sliderPos.y * (100 / sliderHeight)), 0, 100);\n hex = (0,_utils_colors__WEBPACK_IMPORTED_MODULE_3__.hsb2hex)({\n h: hue,\n s: saturation,\n b: brightness\n }); // Update UI\n\n slider.css({\n backgroundColor: (0,_utils_colors__WEBPACK_IMPORTED_MODULE_3__.hsb2hex)({\n h: hue,\n s: saturation,\n b: 100\n })\n });\n break;\n\n case 'saturation':\n // Calculate hue, saturation, and brightness\n hue = mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(parseInt(gridPos.x * (360 / gridWidth), 10), 0, 360);\n saturation = mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(100 - Math.floor(sliderPos.y * (100 / sliderHeight)), 0, 100);\n brightness = mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(100 - Math.floor(gridPos.y * (100 / gridHeight)), 0, 100);\n hex = (0,_utils_colors__WEBPACK_IMPORTED_MODULE_3__.hsb2hex)({\n h: hue,\n s: saturation,\n b: brightness\n }); // Update UI\n\n slider.css({\n backgroundColor: (0,_utils_colors__WEBPACK_IMPORTED_MODULE_3__.hsb2hex)({\n h: hue,\n s: 100,\n b: brightness\n })\n });\n grid.find('.cp-grid-inner').css({\n opacity: saturation / 100\n });\n break;\n\n case 'brightness':\n // Calculate hue, saturation, and brightness\n hue = mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(parseInt(gridPos.x * (360 / gridWidth), 10), 0, 360);\n saturation = mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(100 - Math.floor(gridPos.y * (100 / gridHeight)), 0, 100);\n brightness = mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(100 - Math.floor(sliderPos.y * (100 / sliderHeight)), 0, 100);\n hex = (0,_utils_colors__WEBPACK_IMPORTED_MODULE_3__.hsb2hex)({\n h: hue,\n s: saturation,\n b: brightness\n }); // Update UI\n\n slider.css({\n backgroundColor: (0,_utils_colors__WEBPACK_IMPORTED_MODULE_3__.hsb2hex)({\n h: hue,\n s: saturation,\n b: 100\n })\n });\n grid.find('.cp-grid-inner').css({\n opacity: 1 - brightness / 100\n });\n break;\n\n default:\n // Calculate hue, saturation, and brightness\n hue = mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(360 - parseInt(sliderPos.y * (360 / sliderHeight), 10), 0, 360);\n saturation = mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(Math.floor(gridPos.x * (100 / gridWidth)), 0, 100);\n brightness = mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(100 - Math.floor(gridPos.y * (100 / gridHeight)), 0, 100);\n hex = (0,_utils_colors__WEBPACK_IMPORTED_MODULE_3__.hsb2hex)({\n h: hue,\n s: saturation,\n b: brightness\n }); // Update UI\n\n grid.css({\n backgroundColor: (0,_utils_colors__WEBPACK_IMPORTED_MODULE_3__.hsb2hex)({\n h: hue,\n s: 100,\n b: 100\n })\n });\n break;\n }\n } // Handle opacity\n\n\n if (target.hasClass('cp-opacity-slider')) {\n this.opacity = parseFloat(1 - opacityPos.y / opacitySliderHeight).toFixed(2);\n } // Adjust case\n\n\n input.val(this.getValue(hex)); // Handle change event\n\n this.element.trigger('change._grav_colorpicker', [this.element, hex, this.opacity]);\n }\n }, {\n key: \"getValue\",\n value: function getValue(hex) {\n if (this.opacity === 1) {\n return hex;\n }\n\n var rgb = (0,_utils_colors__WEBPACK_IMPORTED_MODULE_3__.hex2rgb)(hex);\n return 'rgba(' + rgb.r + ', ' + rgb.g + ', ' + rgb.b + ', ' + this.opacity + ')';\n }\n }, {\n key: \"bound\",\n value: function bound(name) {\n var bound = this._bound || (this._bound = {});\n return bound[name] || (bound[name] = mout_function_bind__WEBPACK_IMPORTED_MODULE_2___default()(this[name], this));\n }\n }]);\n\n return ColorpickerField;\n}();\n\n\nvar Instance = new ColorpickerField('[data-grav-colorpicker]');//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL2Zvcm1zL2ZpZWxkcy9jb2xvcnBpY2tlci5qcz9iYTk4Il0sIm5hbWVzIjpbImlzRmlyZWZveCIsIm5hdmlnYXRvciIsInVzZXJBZ2VudCIsInRvTG93ZXJDYXNlIiwiaW5kZXhPZiIsImJvZHkiLCIkIiwiTU9VU0VET1dOIiwiTU9VU0VNT1ZFIiwiTU9VU0VVUCIsIkZPQ1VTSU4iLCJDb2xvcnBpY2tlckZpZWxkIiwic2VsZWN0b3IiLCJmaWVsZCIsIm9wdGlvbnMiLCJPYmplY3QiLCJhc3NpZ24iLCJkYXRhIiwiYnVpbHQiLCJhdHRhY2giLCJ1cGRhdGUiLCJvbiIsImV2ZW50IiwiaGV4Iiwib3BhY2l0eSIsImJhY2tncm91bmRDb2xvciIsInJnYiIsImhleDJyZ2IiLCJyIiwiZyIsImIiLCJ0YXJnZXQiLCJjbG9zZXN0IiwibGVuZ3RoIiwic2libGluZ3MiLCJwYXJlbnQiLCJmaW5kIiwiY3NzIiwic2hvdyIsImN1cnJlbnRUYXJnZXQiLCJib3VuZCIsImtleUNvZGUiLCJoaWRlIiwiYmx1ciIsInVwZGF0ZUZyb21JbnB1dCIsInNldFRpbWVvdXQiLCJidWlsZCIsImVsZW1lbnQiLCJyZXBvc2l0aW9uIiwid3JhcHBlciIsImFkZENsYXNzIiwicmVtb3ZlQ2xhc3MiLCJ1bmRlbGVnYXRlIiwib2ZmIiwic2xpZGVyIiwiYXBwZW5kVG8iLCJhcHBlbmQiLCJvcGFjaXR5U2xpZGVyIiwiZ3JpZCIsInRhYnMiLCJodWUiLCJ0ZXh0IiwiYnJpZ2h0bmVzcyIsInNhdHVyYXRpb24iLCJ3aGVlbCIsInRyYW5zcGFyZW50IiwiaXMiLCJzbGlkZXJIZWlnaHQiLCJoZWlnaHQiLCJjbGFtcCIsIm1vdmUiLCJtYW51YWxPcGFjaXR5IiwiYWN0aXZlIiwibW9kZSIsImF0dHIiLCJyZXBsYWNlIiwibmV3TW9kZSIsImN0Iiwib2Zmc2V0IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwiY3RPZmZzZXQiLCJkZWx0YSIsIngiLCJ5IiwidG9wIiwic2Nyb2xsVG9wIiwibGVmdCIsInNjcm9sbExlZnQiLCJoYXNDbGFzcyIsInByZXZlbnREZWZhdWx0IiwiaW5wdXQiLCJmb2N1cyIsInBpY2tlciIsImNsaWVudFJlY3QiLCJvZmZzZXRYIiwid2luZG93Iiwic2Nyb2xsWCIsIm9mZnNldFkiLCJzY3JvbGxZIiwiTWF0aCIsInJvdW5kIiwicGFnZVgiLCJwYWdlWSIsInd4Iiwid3kiLCJwaGkiLCJ0b3VjaEV2ZW50cyIsImNoYW5nZWRUb3VjaGVzIiwib3JpZ2luYWxFdmVudCIsIndpZHRoIiwic3FydCIsImF0YW4yIiwiUEkiLCJjb3MiLCJzaW4iLCJ1cGRhdGVGcm9tUGlja2VyIiwiZG9udEZpcmVFdmVudCIsInZhbHVlIiwidmFsIiwibWF0Y2giLCJoc2IiLCJyZ2JzdHIyaGV4IiwicGFyc2VIZXgiLCJoZXgyaHNiIiwiZ3JpZEhlaWdodCIsImdyaWRXaWR0aCIsImNlaWwiLCJzIiwiaCIsImhzYjJoZXgiLCJnZXRWYWx1ZSIsInRyaWdnZXIiLCJnZXRDb29yZHMiLCJjb250YWluZXIiLCJvZmZzZXRXaWR0aCIsIm9mZnNldEhlaWdodCIsImdyaWRQaWNrZXIiLCJzbGlkZXJQaWNrZXIiLCJvcGFjaXR5UGlja2VyIiwiZ3JpZFBvcyIsInNsaWRlclBvcyIsIm9wYWNpdHlQb3MiLCJvcGFjaXR5U2xpZGVySGVpZ2h0IiwiZmxvb3IiLCJwYXJzZUludCIsInBhcnNlRmxvYXQiLCJ0b0ZpeGVkIiwibmFtZSIsIl9ib3VuZCIsImJpbmQiLCJJbnN0YW5jZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQSxJQUFNQSxTQUFTLEdBQUdDLFNBQVMsQ0FBQ0MsU0FBVixDQUFvQkMsV0FBcEIsR0FBa0NDLE9BQWxDLENBQTBDLFNBQTFDLElBQXVELENBQUMsQ0FBMUU7QUFDQSxJQUFNQyxJQUFJLEdBQUdDLDZDQUFDLENBQUMsTUFBRCxDQUFkO0FBRUEsSUFBTUMsU0FBUyxHQUFHLGdEQUFsQjtB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ci5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgY2xhbXAgZnJvbSAnbW91dC9tYXRoL2NsYW1wJztcbmltcG9ydCBiaW5kIGZyb20gJ21vdXQvZnVuY3Rpb24vYmluZCc7XG5pbXBvcnQgeyByZ2JzdHIyaGV4LCBoc2IyaGV4LCBoZXgyaHNiLCBoZXgycmdiLCBwYXJzZUhleCB9IGZyb20gJy4uLy4uL3V0aWxzL2NvbG9ycyc7XG5cbmNvbnN0IGlzRmlyZWZveCA9IG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdmaXJlZm94JykgPiAtMTtcbmNvbnN0IGJvZHkgPSAkKCdib2R5Jyk7XG5cbmNvbnN0IE1PVVNFRE9XTiA9ICdtb3VzZWRvd24gdG91Y2hzdGFydCBNU1BvaW50ZXJEb3duIHBvaW50ZXJkb3duJztcbmNvbnN0IE1PVVNFTU9WRSA9ICdtb3VzZW1vdmUgdG91Y2htb3ZlIE1TUG9pbnRlck1vdmUgcG9pbnRlcm1vdmUnO1xuY29uc3QgTU9VU0VVUCA9ICdtb3VzZXVwIHRvdWNoZW5kIE1TUG9pbnRlclVwIHBvaW50ZXJ1cCc7XG5jb25zdCBGT0NVU0lOID0gaXNGaXJlZm94ID8gJ2ZvY3VzJyA6ICdmb2N1c2luJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29sb3JwaWNrZXJGaWVsZCB7XG4gICAgY29uc3RydWN0b3Ioc2VsZWN0b3IpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yO1xuICAgICAgICB0aGlzLmZpZWxkID0gJCh0aGlzLnNlbGVjdG9yKTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5maWVsZC5kYXRhKCdncmF2LWNvbG9ycGlja2VyJykpO1xuICAgICAgICB0aGlzLmJ1aWx0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYXR0YWNoKCk7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy51cGRhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuZmllbGQub24oJ2NoYW5nZS5fZ3Jhdl9jb2xvcnBpY2tlcicsIChldmVudCwgZmllbGQsIGhleCwgb3BhY2l0eSkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBiYWNrZ3JvdW5kQ29sb3IgPSBoZXg7XG4gICAgICAgICAgICAgICAgbGV0IHJnYiA9IGhleDJyZ2IoaGV4KTtcblxuICAgICAgICAgICAgICAgIGlmIChvcGFjaXR5IDwgMSkge1xuICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3IgPSAncmdiYSgnICsgcmdiLnIgKyAnLCAnICsgcmdiLmcgKyAnLCAnICsgcmdiLmIgKyAnLCAnICsgb3BhY2l0eSArICcpJztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0ID0gZmllbGQuY2xvc2VzdCh0aGlzLm9wdGlvbnMudXBkYXRlKTtcbiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gZmllbGQuc2libGluZ3ModGhpcy5vcHRpb25zLnVwZGF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghdGFyZ2V0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBmaWVsZC5wYXJlbnQoJy5nLWNvbG9ycGlja2VyJykuZmluZCh0aGlzLm9wdGlvbnMudXBkYXRlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0YXJnZXQuY3NzKHsgYmFja2dyb3VuZENvbG9yIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhdHRhY2goKSB7XG4gICAgICAgIGJvZHkub24oRk9DVVNJTiwgdGhpcy5zZWxlY3RvciwgKGV2ZW50KSA9PiB0aGlzLnNob3coZXZlbnQsIGV2ZW50LmN1cnJlbnRUYXJnZXQpKTtcbiAgICAgICAgYm9keS5vbihNT1VTRURPV04sIHRoaXMuc2VsZWN0b3IgKyAnIC5nLWNvbG9ycGlja2VyLCAnICsgdGhpcy5zZWxlY3RvciArICcgLmctY29sb3JwaWNrZXIgaScsIHRoaXMuYm91bmQoJ2ljb25DbGljaycpKTtcbiAgICAgICAgYm9keS5vbigna2V5ZG93bicsIHRoaXMuc2VsZWN0b3IsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgc3dpdGNoIChldmVudC5rZXlDb2RlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSA5OiAvLyB0YWJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTM6IC8vIGVudGVyXG4gICAgICAgICAgICAgICAgY2FzZSAyNzogLy8gZXNjXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICAgICAgICAgICAgICBldmVudC5jdXJyZW50VGFyZ2V0LmJsdXIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVXBkYXRlIG9uIGtleXVwXG4gICAgICAgIGJvZHkub24oJ2tleXVwJywgdGhpcy5zZWxlY3RvciwgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUZyb21JbnB1dCh0cnVlLCBldmVudC5jdXJyZW50VGFyZ2V0KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBVcGRhdGUgb24gcGFzdGVcbiAgICAgICAgYm9keS5vbigncGFzdGUnLCB0aGlzLnNlbGVjdG9yLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy51cGRhdGVGcm9tSW5wdXQodHJ1ZSwgZXZlbnQuY3VycmVudFRhcmdldCksIDEpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzaG93KGV2ZW50LCB0YXJnZXQpIHtcbiAgICAgICAgdGFyZ2V0ID0gJCh0YXJnZXQpO1xuXG4gICAgICAgIGlmICghdGhpcy5idWlsdCkge1xuICAgICAgICAgICAgdGhpcy5idWlsZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lbGVtZW50ID0gdGFyZ2V0O1xuICAgICAgICB0aGlzLnJlcG9zaXRpb24oKTtcbiAgICAgICAgdGhpcy53cmFwcGVyLmFkZENsYXNzKCdjcC12aXNpYmxlJyk7XG4gICAgICAgIHRoaXMudXBkYXRlRnJvbUlucHV0KCk7XG5cbiAgICAgICAgdGhpcy53cmFwcGVyLm9uKE1PVVNFRE9XTiwgJy5jcC1ncmlkLCAuY3Atc2xpZGVyLCAuY3Atb3BhY2l0eS1zbGlkZXInLCB0aGlzLmJvdW5kKCdib2R5RG93bicpKTtcbiAgICAgICAgYm9keS5vbihNT1VTRU1PVkUsIHRoaXMuYm91bmQoJ2JvZHlNb3ZlJykpO1xuICAgICAgICBib2R5Lm9uKE1PVVNFRE9XTiwgdGhpcy5ib3VuZCgnYm9keUNsaWNrJykpO1xuICAgICAgICBib2R5Lm9uKE1PVVNFVVAsIHRoaXMuYm91bmQoJ3RhcmdldFJlc2V0JykpO1xuICAgICAgICAkKCcjYWRtaW4tbWFpbiA+IC5jb250ZW50LXdyYXBwZXInKS5vbignc2Nyb2xsJywgdGhpcy5ib3VuZCgncmVwb3NpdGlvbicpKTtcbiAgICB9XG5cbiAgICBoaWRlKCkge1xuICAgICAgICBpZiAoIXRoaXMuYnVpbHQpIHsgcmV0dXJuOyB9XG4gICAgICAgIHRoaXMud3JhcHBlci5yZW1vdmVDbGFzcygnY3AtdmlzaWJsZScpO1xuXG4gICAgICAgIHRoaXMud3JhcHBlci51bmRlbGVnYXRlKE1PVVNFRE9XTiwgJy5jcC1ncmlkLCAuY3Atc2xpZGVyLCAuY3Atb3BhY2l0eS1zbGlkZXInLCB0aGlzLmJvdW5kKCdib2R5RG93bicpKTtcbiAgICAgICAgYm9keS5vZmYoTU9VU0VNT1ZFLCB0aGlzLmJvdW5kKCdib2R5TW92ZScpKTtcbiAgICAgICAgYm9keS5vZmYoTU9VU0VET1dOLCB0aGlzLmJvdW5kKCdib2R5Q2xpY2snKSk7XG4gICAgICAgIGJvZHkub2ZmKE1PVVNFVVAsIHRoaXMuYm91bmQoJ3RhcmdldFJlc2V0JykpO1xuICAgICAgICAkKCcjYWRtaW4tbWFpbiA+IC5jb250ZW50LXdyYXBwZXInKS5vbignc2Nyb2xsJywgdGhpcy5ib3VuZCgncmVwb3NpdGlvbicpKTtcbiAgICB9XG5cbiAgICBidWlsZCgpIHtcbiAgICAgICAgdGhpcy53cmFwcGVyID0gJCgnPGRpdiBjbGFzcz1cImNwLXdyYXBwZXIgY3Atd2l0aC1vcGFjaXR5IGNwLW1vZGUtaHVlXCIgLz4nKTtcbiAgICAgICAgdGhpcy5zbGlkZXIgPSAkKCc8ZGl2IGNsYXNzPVwiY3Atc2xpZGVyIGNwLXNwcml0ZVwiIC8+JykuYXBwZW5kVG8odGhpcy53cmFwcGVyKS5hcHBlbmQoJCgnPGRpdiBjbGFzcz1cImNwLXBpY2tlclwiIC8+JykpO1xuICAgICAgICB0aGlzLm9wYWNpdHlTbGlkZXIgPSAkKCc8ZGl2IGNsYXNzPVwiY3Atb3BhY2l0eS1zbGlkZXIgY3Atc3ByaXRlXCIgLz4nKS5hcHBlbmRUbyh0aGlzLndyYXBwZXIpLmFwcGVuZCgkKCc8ZGl2IGNsYXNzPVwiY3AtcGlja2VyXCIgLz4nKSk7XG4gICAgICAgIHRoaXMuZ3JpZCA9ICQoJzxkaXYgY2xhc3M9XCJjcC1ncmlkIGNwLXNwcml0ZVwiIC8+JykuYXBwZW5kVG8odGhpcy53cmFwcGVyKS5hcHBlbmQoJCgnPGRpdiBjbGFzcz1cImNwLWdyaWQtaW5uZXJcIiAvPicpKS5hcHBlbmQoJCgnPGRpdiBjbGFzcz1cImNwLXBpY2tlclwiIC8+JykpO1xuXG4gICAgICAgICQoJzxkaXYgLz4nKS5hcHBlbmRUbyh0aGlzLmdyaWQuZmluZCgnLmNwLXBpY2tlcicpKTtcblxuICAgICAgICBsZXQgdGFicyA9ICQoJzxkaXYgY2xhc3M9XCJjcC10YWJzXCIgLz4nKS5hcHBlbmRUbyh0aGlzLndyYXBwZXIpO1xuICAgICAgICB0aGlzLnRhYnMgPSB7XG4gICAgICAgICAgICBodWU6ICQoJzxkaXYgY2xhc3M9XCJjcC10YWItaHVlIGFjdGl2ZVwiIC8+JykudGV4dCgnSFVFJykuYXBwZW5kVG8odGFicyksXG4gICAgICAgICAgICBicmlnaHRuZXNzOiAkKCc8ZGl2IGNsYXNzPVwiY3AtdGFiLWJyaWdodG5lc3NcIiAvPicpLnRleHQoJ0JSSScpLmFwcGVuZFRvKHRhYnMpLFxuICAgICAgICAgICAgc2F0dXJhdGlvbjogJCgnPGRpdiBjbGFzcz1cImNwLXRhYi1zYXR1cmF0aW9uXCIgLz4nKS50ZXh0KCdTQVQnKS5hcHBlbmRUbyh0YWJzKSxcbiAgICAgICAgICAgIHdoZWVsOiAkKCc8ZGl2IGNsYXNzPVwiY3AtdGFiLXdoZWVsXCIgLz4nKS50ZXh0KCdXSEVFTCcpLmFwcGVuZFRvKHRhYnMpLFxuICAgICAgICAgICAgdHJhbnNwYXJlbnQ6ICQoJzxkaXYgY2xhc3M9XCJjcC10YWItdHJhbnNwXCIgLz4nKS50ZXh0KCdUUkFOU1BBUkVOVCcpLmFwcGVuZFRvKHRhYnMpXG4gICAgICAgIH07XG5cbiAgICAgICAgdGFicy5vbihNT1VTRURPV04sICc+IGRpdicsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQuaXModGhpcy50YWJzLnRyYW5zcGFyZW50KSkge1xuICAgICAgICAgICAgICAgIGxldCBzbGlkZXJIZWlnaHQgPSB0aGlzLm9wYWNpdHlTbGlkZXIuaGVpZ2h0KCk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLm9wYWNpdHkgPSAwO1xuICAgICAgICAgICAgICAgIHRoaXMub3BhY2l0eVNsaWRlci5maW5kKCcuY3AtcGlja2VyJykuY3NzKHsgJ3RvcCc6IGNsYW1wKHNsaWRlckhlaWdodCAtIChzbGlkZXJIZWlnaHQgKiB0aGlzLm9wYWNpdHkpLCAwLCBzbGlkZXJIZWlnaHQpIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMubW92ZSh0aGlzLm9wYWNpdHlTbGlkZXIsIHsgbWFudWFsT3BhY2l0eTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBhY3RpdmUgPSB0YWJzLmZpbmQoJy5hY3RpdmUnKTtcbiAgICAgICAgICAgIGxldCBtb2RlID0gYWN0aXZlLmF0dHIoJ2NsYXNzJykucmVwbGFjZSgvXFxzfGFjdGl2ZXxjcC10YWItL2csICcnKTtcbiAgICAgICAgICAgIGxldCBuZXdNb2RlID0gZWxlbWVudC5hdHRyKCdjbGFzcycpLnJlcGxhY2UoL1xcc3xhY3RpdmV8Y3AtdGFiLS9nLCAnJyk7XG5cbiAgICAgICAgICAgIHRoaXMud3JhcHBlci5yZW1vdmVDbGFzcygnY3AtbW9kZS0nICsgbW9kZSkuYWRkQ2xhc3MoJ2NwLW1vZGUtJyArIG5ld01vZGUpO1xuICAgICAgICAgICAgYWN0aXZlLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTtcbiAgICAgICAgICAgIGVsZW1lbnQuYWRkQ2xhc3MoJ2FjdGl2ZScpO1xuXG4gICAgICAgICAgICB0aGlzLm1vZGUgPSBuZXdNb2RlO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVGcm9tSW5wdXQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy53cmFwcGVyLmFwcGVuZFRvKCcuY29udGVudC13cmFwcGVyJyk7XG5cbiAgICAgICAgdGhpcy5idWlsdCA9IHRydWU7XG4gICAgICAgIHRoaXMubW9kZSA9ICdodWUnO1xuICAgIH1cblxuICAgIHJlcG9zaXRpb24oKSB7XG4gICAgICAgIGxldCBjdCA9ICQoJy5jb250ZW50LXdyYXBwZXInKVswXTtcbiAgICAgICAgbGV0IG9mZnNldCA9IHRoaXMuZWxlbWVudFswXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgbGV0IGN0T2Zmc2V0ID0gY3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGxldCBkZWx0YSA9IHsgeDogMCwgeTogMCB9O1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMub2Zmc2V0KSB7XG4gICAgICAgICAgICBkZWx0YS54ID0gdGhpcy5vcHRpb25zLm9mZnNldC54IHx8IDA7XG4gICAgICAgICAgICBkZWx0YS55ID0gdGhpcy5vcHRpb25zLm9mZnNldC55IHx8IDA7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLndyYXBwZXIuY3NzKHtcbiAgICAgICAgICAgIHRvcDogb2Zmc2V0LnRvcCArIG9mZnNldC5oZWlnaHQgKyBjdC5zY3JvbGxUb3AgLSBjdE9mZnNldC50b3AgKyBkZWx0YS55LFxuICAgICAgICAgICAgbGVmdDogb2Zmc2V0LmxlZnQgKyBjdC5zY3JvbGxMZWZ0IC0gY3RPZmZzZXQubGVmdCArIGRlbHRhLnhcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWNvbkNsaWNrKGV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLndyYXBwZXIgJiYgdGhpcy53cmFwcGVyLmhhc0NsYXNzKCdjcC12aXNpYmxlJykpIHsgcmV0dXJuIHRydWU7IH1cblxuICAgICAgICBldmVudCAmJiBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIGxldCBpbnB1dCA9ICQoZXZlbnQuY3VycmVudFRhcmdldCkuZmluZCgnaW5wdXQnKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiBpbnB1dC5mb2N1cygpLCA1MCk7XG4gICAgfVxuXG4gICAgYm9keU1vdmUoZXZlbnQpIHtcbiAgICAgICAgZXZlbnQgJiYgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBpZiAodGhpcy50YXJnZXQpIHsgdGhpcy5tb3ZlKHRoaXMudGFyZ2V0LCBldmVudCk7IH1cbiAgICB9XG5cbiAgICBib2R5Q2xpY2soZXZlbnQpIHtcbiAgICAgICAgbGV0IHRhcmdldCA9ICQoZXZlbnQudGFyZ2V0KTtcblxuICAgICAgICBpZiAoIXRhcmdldC5jbG9zZXN0KCcuY3Atd3JhcHBlcicpLmxlbmd0aCAmJiAhdGFyZ2V0LmlzKHRoaXMuc2VsZWN0b3IpKSB7XG4gICAgICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGJvZHlEb3duKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50ICYmIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgdGhpcy50YXJnZXQgPSAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpO1xuICAgICAgICB0aGlzLm1vdmUodGhpcy50YXJnZXQsIGV2ZW50LCB0cnVlKTtcbiAgICB9XG5cbiAgICB0YXJnZXRSZXNldChldmVudCkge1xuICAgICAgICBldmVudCAmJiBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIHRoaXMudGFyZ2V0ID0gbnVsbDtcbiAgICB9XG5cbiAgICBtb3ZlKHRhcmdldCwgZXZlbnQpIHtcbiAgICAgICAgbGV0IGlucHV0ID0gdGhpcy5lbGVtZW50O1xuICAgICAgICBsZXQgcGlja2VyID0gdGFyZ2V0LmZpbmQoJy5jcC1waWNrZXInKTtcbiAgICAgICAgbGV0IGNsaWVudFJlY3QgPSB0YXJnZXRbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGxldCBvZmZzZXRYID0gY2xpZW50UmVjdC5sZWZ0ICsgd2luZG93LnNjcm9sbFg7XG4gICAgICAgIGxldCBvZmZzZXRZID0gY2xpZW50UmVjdC50b3AgKyB3aW5kb3cuc2Nyb2xsWTtcbiAgICAgICAgbGV0IHggPSBNYXRoLnJvdW5kKChldmVudCA/IGV2ZW50LnBhZ2VYIDogMCkgLSBvZmZzZXRYKTtcbiAgICAgICAgbGV0IHkgPSBNYXRoLnJvdW5kKChldmVudCA/IGV2ZW50LnBhZ2VZIDogMCkgLSBvZmZzZXRZKTtcbiAgICAgICAgbGV0IHd4O1xuICAgICAgICBsZXQgd3k7XG4gICAgICAgIGxldCByO1xuICAgICAgICBsZXQgcGhpO1xuXG4gICAgICAgIC8vIFRvdWNoIHN1cHBvcnRcbiAgICAgICAgbGV0IHRvdWNoRXZlbnRzID0gZXZlbnQuY2hhbmdlZFRvdWNoZXMgfHwgKGV2ZW50Lm9yaWdpbmFsRXZlbnQgJiYgZXZlbnQub3JpZ2luYWxFdmVudC5jaGFuZ2VkVG91Y2hlcyk7XG4gICAgICAgIGlmIChldmVudCAmJiB0b3VjaEV2ZW50cykge1xuICAgICAgICAgICAgeCA9ICh0b3VjaEV2ZW50cyA/IHRvdWNoRXZlbnRzWzBdLnBhZ2VYIDogMCkgLSBvZmZzZXRYO1xuICAgICAgICAgICAgeSA9ICh0b3VjaEV2ZW50cyA/IHRvdWNoRXZlbnRzWzBdLnBhZ2VZIDogMCkgLSBvZmZzZXRZO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50ICYmIGV2ZW50Lm1hbnVhbE9wYWNpdHkpIHtcbiAgICAgICAgICAgIHkgPSBjbGllbnRSZWN0LmhlaWdodDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnN0cmFpbiBwaWNrZXIgdG8gaXRzIGNvbnRhaW5lclxuICAgICAgICBpZiAoeCA8IDApIHggPSAwO1xuICAgICAgICBpZiAoeSA8IDApIHkgPSAwO1xuICAgICAgICBpZiAoeCA+IGNsaWVudFJlY3Qud2lkdGgpIHggPSBjbGllbnRSZWN0LndpZHRoO1xuICAgICAgICBpZiAoeSA+IGNsaWVudFJlY3QuaGVpZ2h0KSB5ID0gY2xpZW50UmVjdC5oZWlnaHQ7XG5cbiAgICAgICAgLy8gQ29uc3RyYWluIGNvbG9yIHdoZWVsIHZhbHVlcyB0byB0aGUgd2hlZWxcbiAgICAgICAgaWYgKHRhcmdldC5wYXJlbnQoJy5jcC1tb2RlLXdoZWVsJykubGVuZ3RoICYmIHBpY2tlci5wYXJlbnQoJy5jcC1ncmlkJykubGVuZ3RoKSB7XG4gICAgICAgICAgICB3eCA9IDc1IC0geDtcbiAgICAgICAgICAgIHd5ID0gNzUgLSB5O1xuICAgICAgICAgICAgciA9IE1hdGguc3FydCh3eCAqIHd4ICsgd3kgKiB3eSk7XG4gICAgICAgICAgICBwaGkgPSBNYXRoLmF0YW4yKHd5LCB3eCk7XG5cbiAgICAgICAgICAgIGlmIChwaGkgPCAwKSBwaGkgKz0gTWF0aC5QSSAqIDI7XG4gICAgICAgICAgICBpZiAociA+IDc1KSB7XG4gICAgICAgICAgICAgICAgeCA9IDc1IC0gKDc1ICogTWF0aC5jb3MocGhpKSk7XG4gICAgICAgICAgICAgICAgeSA9IDc1IC0gKDc1ICogTWF0aC5zaW4ocGhpKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHggPSBNYXRoLnJvdW5kKHgpO1xuICAgICAgICAgICAgeSA9IE1hdGgucm91bmQoeSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNb3ZlIHRoZSBwaWNrZXJcbiAgICAgICAgaWYgKHRhcmdldC5oYXNDbGFzcygnY3AtZ3JpZCcpKSB7XG4gICAgICAgICAgICBwaWNrZXIuY3NzKHtcbiAgICAgICAgICAgICAgICB0b3A6IHksXG4gICAgICAgICAgICAgICAgbGVmdDogeFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlRnJvbVBpY2tlcihpbnB1dCwgdGFyZ2V0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBpY2tlci5jc3Moe1xuICAgICAgICAgICAgICAgIHRvcDogeVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUZyb21QaWNrZXIoaW5wdXQsIHRhcmdldCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVGcm9tSW5wdXQoZG9udEZpcmVFdmVudCwgZWxlbWVudCkge1xuICAgICAgICBlbGVtZW50ID0gZWxlbWVudCA/ICQoZWxlbWVudCkgOiB0aGlzLmVsZW1lbnQ7XG4gICAgICAgIGxldCB2YWx1ZSA9IGVsZW1lbnQudmFsKCk7XG4gICAgICAgIGxldCBvcGFjaXR5ID0gdmFsdWUucmVwbGFjZSgvXFxzL2csICcnKS5tYXRjaCgvXnJnYmE/XFwoWzAtOV17MSwzfSxbMC05XXsxLDN9LFswLTldezEsM30sKC4rKVxcKS8pO1xuICAgICAgICBsZXQgaGV4O1xuICAgICAgICBsZXQgaHNiO1xuXG4gICAgICAgIHZhbHVlID0gcmdic3RyMmhleCh2YWx1ZSkgfHwgdmFsdWU7XG4gICAgICAgIG9wYWNpdHkgPSBvcGFjaXR5ID8gY2xhbXAob3BhY2l0eVsxXSwgMCwgMSkgOiAxO1xuXG4gICAgICAgIGlmICghKGhleCA9IHBhcnNlSGV4KHZhbHVlKSkpIHsgaGV4ID0gJyNmZmZmZmYnOyB9XG4gICAgICAgIGhzYiA9IGhleDJoc2IoaGV4KTtcblxuICAgICAgICBpZiAodGhpcy5idWlsdCkge1xuICAgICAgICAgICAgLy8gb3BhY2l0eVxuICAgICAgICAgICAgdGhpcy5vcGFjaXR5ID0gb3BhY2l0eTtcbiAgICAgICAgICAgIHZhciBzbGlkZXJIZWlnaHQgPSB0aGlzLm9wYWNpdHlTbGlkZXIuaGVpZ2h0KCk7XG4gICAgICAgICAgICB0aGlzLm9wYWNpdHlTbGlkZXIuZmluZCgnLmNwLXBpY2tlcicpLmNzcyh7ICd0b3AnOiBjbGFtcChzbGlkZXJIZWlnaHQgLSAoc2xpZGVySGVpZ2h0ICogdGhpcy5vcGFjaXR5KSwgMCwgc2xpZGVySGVpZ2h0KSB9KTtcblxuICAgICAgICAgICAgLy8gYmcgY29sb3JcbiAgICAgICAgICAgIGxldCBncmlkSGVpZ2h0ID0gdGhpcy5ncmlkLmhlaWdodCgpO1xuICAgICAgICAgICAgbGV0IGdyaWRXaWR0aCA9IHRoaXMuZ3JpZC53aWR0aCgpO1xuICAgICAgICAgICAgbGV0IHI7XG4gICAgICAgICAgICBsZXQgcGhpO1xuICAgICAgICAgICAgbGV0IHg7XG4gICAgICAgICAgICBsZXQgeTtcblxuICAgICAgICAgICAgc2xpZGVySGVpZ2h0ID0gdGhpcy5zbGlkZXIuaGVpZ2h0KCk7XG5cbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5tb2RlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnd2hlZWwnOlxuICAgICAgICAgICAgICAgICAgICAvLyBTZXQgZ3JpZCBwb3NpdGlvblxuICAgICAgICAgICAgICAgICAgICByID0gY2xhbXAoTWF0aC5jZWlsKGhzYi5zICogMC43NSksIDAsIGdyaWRIZWlnaHQgLyAyKTtcbiAgICAgICAgICAgICAgICAgICAgcGhpID0gaHNiLmggKiBNYXRoLlBJIC8gMTgwO1xuICAgICAgICAgICAgICAgICAgICB4ID0gY2xhbXAoNzUgLSBNYXRoLmNvcyhwaGkpICogciwgMCwgZ3JpZFdpZHRoKTtcbiAgICAgICAgICAgICAgICAgICAgeSA9IGNsYW1wKDc1IC0gTWF0aC5zaW4ocGhpKSAqIHIsIDAsIGdyaWRIZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyaWQuY3NzKHsgYmFja2dyb3VuZENvbG9yOiAndHJhbnNwYXJlbnQnIH0pLmZpbmQoJy5jcC1waWNrZXInKS5jc3Moe1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiB5LFxuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogeFxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBTZXQgc2xpZGVyIHBvc2l0aW9uXG4gICAgICAgICAgICAgICAgICAgIHkgPSAxNTAgLSAoaHNiLmIgLyAoMTAwIC8gZ3JpZEhlaWdodCkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGV4ID09PSAnJykgeSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2xpZGVyLmZpbmQoJy5jcC1waWNrZXInKS5jc3MoeyB0b3A6IHkgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHBhbmVsIGNvbG9yXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2xpZGVyLmNzcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGhzYjJoZXgoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGg6IGhzYi5oLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHM6IGhzYi5zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGI6IDEwMFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAnc2F0dXJhdGlvbic6XG4gICAgICAgICAgICAgICAgICAgIC8vIFNldCBncmlkIHBvc2l0aW9uXG4gICAgICAgICAgICAgICAgICAgIHggPSBjbGFtcCgoNSAqIGhzYi5oKSAvIDEyLCAwLCAxNTApO1xuICAgICAgICAgICAgICAgICAgICB5ID0gY2xhbXAoZ3JpZEhlaWdodCAtIE1hdGguY2VpbChoc2IuYiAvICgxMDAgLyBncmlkSGVpZ2h0KSksIDAsIGdyaWRIZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyaWQuZmluZCgnLmNwLXBpY2tlcicpLmNzcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3A6IHksXG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiB4XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFNldCBzbGlkZXIgcG9zaXRpb25cbiAgICAgICAgICAgICAgICAgICAgeSA9IGNsYW1wKHNsaWRlckhlaWdodCAtIChoc2IucyAqIChzbGlkZXJIZWlnaHQgLyAxMDApKSwgMCwgc2xpZGVySGVpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zbGlkZXIuZmluZCgnLmNwLXBpY2tlcicpLmNzcyh7IHRvcDogeSB9KTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgVUlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zbGlkZXIuY3NzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogaHNiMmhleCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaDogaHNiLmgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgczogMTAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGI6IGhzYi5iXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncmlkLmZpbmQoJy5jcC1ncmlkLWlubmVyJykuY3NzKHsgb3BhY2l0eTogaHNiLnMgLyAxMDAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAnYnJpZ2h0bmVzcyc6XG4gICAgICAgICAgICAgICAgICAgIC8vIFNldCBncmlkIHBvc2l0aW9uXG4gICAgICAgICAgICAgICAgICAgIHggPSBjbGFtcCgoNSAqIGhzYi5oKSAvIDEyLCAwLCAxNTApO1xuICAgICAgICAgICAgICAgICAgICB5ID0gY2xhbXAoZ3JpZEhlaWdodCAtIE1hdGguY2VpbChoc2IucyAvICgxMDAgLyBncmlkSGVpZ2h0KSksIDAsIGdyaWRIZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyaWQuZmluZCgnLmNwLXBpY2tlcicpLmNzcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3A6IHksXG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiB4XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFNldCBzbGlkZXIgcG9zaXRpb25cbiAgICAgICAgICAgICAgICAgICAgeSA9IGNsYW1wKHNsaWRlckhlaWdodCAtIChoc2IuYiAqIChzbGlkZXJIZWlnaHQgLyAxMDApKSwgMCwgc2xpZGVySGVpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zbGlkZXIuZmluZCgnLmNwLXBpY2tlcicpLmNzcyh7IHRvcDogeSB9KTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgVUlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zbGlkZXIuY3NzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogaHNiMmhleCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaDogaHNiLmgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgczogaHNiLnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYjogMTAwXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncmlkLmZpbmQoJy5jcC1ncmlkLWlubmVyJykuY3NzKHsgb3BhY2l0eTogMSAtIChoc2IuYiAvIDEwMCkgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2h1ZSc6XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgLy8gU2V0IGdyaWQgcG9zaXRpb25cbiAgICAgICAgICAgICAgICAgICAgeCA9IGNsYW1wKE1hdGguY2VpbChoc2IucyAvICgxMDAgLyBncmlkV2lkdGgpKSwgMCwgZ3JpZFdpZHRoKTtcbiAgICAgICAgICAgICAgICAgICAgeSA9IGNsYW1wKGdyaWRIZWlnaHQgLSBNYXRoLmNlaWwoaHNiLmIgLyAoMTAwIC8gZ3JpZEhlaWdodCkpLCAwLCBncmlkSGVpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncmlkLmZpbmQoJy5jcC1waWNrZXInKS5jc3Moe1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiB5LFxuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogeFxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBTZXQgc2xpZGVyIHBvc2l0aW9uXG4gICAgICAgICAgICAgICAgICAgIHkgPSBjbGFtcChzbGlkZXJIZWlnaHQgLSAoaHNiLmggLyAoMzYwIC8gc2xpZGVySGVpZ2h0KSksIDAsIHNsaWRlckhlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2xpZGVyLmZpbmQoJy5jcC1waWNrZXInKS5jc3MoeyB0b3A6IHkgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHBhbmVsIGNvbG9yXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JpZC5jc3Moe1xuICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBoc2IyaGV4KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoOiBoc2IuaCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzOiAxMDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYjogMTAwXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWRvbnRGaXJlRXZlbnQpIHsgZWxlbWVudC52YWwodGhpcy5nZXRWYWx1ZShoZXgpKTsgfVxuXG4gICAgICAgICh0aGlzLmVsZW1lbnQgfHwgZWxlbWVudCkudHJpZ2dlcignY2hhbmdlLl9ncmF2X2NvbG9ycGlja2VyJywgW2VsZW1lbnQsIGhleCwgb3BhY2l0eV0pO1xuXG4gICAgfVxuXG4gICAgdXBkYXRlRnJvbVBpY2tlcihpbnB1dCwgdGFyZ2V0KSB7XG4gICAgICAgIHZhciBnZXRDb29yZHMgPSBmdW5jdGlvbihwaWNrZXIsIGNvbnRhaW5lcikge1xuXG4gICAgICAgICAgICB2YXIgbGVmdCwgdG9wO1xuICAgICAgICAgICAgaWYgKCFwaWNrZXIubGVuZ3RoIHx8ICFjb250YWluZXIpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgbGVmdCA9IHBpY2tlclswXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O1xuICAgICAgICAgICAgdG9wID0gcGlja2VyWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB4OiBsZWZ0IC0gY29udGFpbmVyWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgKyAocGlja2VyWzBdLm9mZnNldFdpZHRoIC8gMiksXG4gICAgICAgICAgICAgICAgeTogdG9wIC0gY29udGFpbmVyWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCArIChwaWNrZXJbMF0ub2Zmc2V0SGVpZ2h0IC8gMilcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgaGV4O1xuICAgICAgICBsZXQgaHVlO1xuICAgICAgICBsZXQgc2F0dXJhdGlvbjtcbiAgICAgICAgbGV0IGJyaWdodG5lc3M7XG4gICAgICAgIGxldCB4O1xuICAgICAgICBsZXQgeTtcbiAgICAgICAgbGV0IHI7XG4gICAgICAgIGxldCBwaGk7XG5cbiAgICAgICAgLy8gUGFuZWwgb2JqZWN0c1xuICAgICAgICBsZXQgZ3JpZCA9IHRoaXMud3JhcHBlci5maW5kKCcuY3AtZ3JpZCcpO1xuICAgICAgICBsZXQgc2xpZGVyID0gdGhpcy53cmFwcGVyLmZpbmQoJy5jcC1zbGlkZXInKTtcbiAgICAgICAgbGV0IG9wYWNpdHlTbGlkZXIgPSB0aGlzLndyYXBwZXIuZmluZCgnLmNwLW9wYWNpdHktc2xpZGVyJyk7XG5cbiAgICAgICAgLy8gUGlja2VyIG9iamVjdHNcbiAgICAgICAgbGV0IGdyaWRQaWNrZXIgPSBncmlkLmZpbmQoJy5jcC1waWNrZXInKTtcbiAgICAgICAgbGV0IHNsaWRlclBpY2tlciA9IHNsaWRlci5maW5kKCcuY3AtcGlja2VyJyk7XG4gICAgICAgIGxldCBvcGFjaXR5UGlja2VyID0gb3BhY2l0eVNsaWRlci5maW5kKCcuY3AtcGlja2VyJyk7XG5cbiAgICAgICAgLy8gUGlja2VyIHBvc2l0aW9uc1xuICAgICAgICBsZXQgZ3JpZFBvcyA9IGdldENvb3JkcyhncmlkUGlja2VyLCBncmlkKTtcbiAgICAgICAgbGV0IHNsaWRlclBvcyA9IGdldENvb3JkcyhzbGlkZXJQaWNrZXIsIHNsaWRlcik7XG4gICAgICAgIGxldCBvcGFjaXR5UG9zID0gZ2V0Q29vcmRzKG9wYWNpdHlQaWNrZXIsIG9wYWNpdHlTbGlkZXIpO1xuXG4gICAgICAgIC8vIFNpemVzXG4gICAgICAgIGxldCBncmlkV2lkdGggPSBncmlkWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgICAgICBsZXQgZ3JpZEhlaWdodCA9IGdyaWRbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuICAgICAgICBsZXQgc2xpZGVySGVpZ2h0ID0gc2xpZGVyWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcbiAgICAgICAgbGV0IG9wYWNpdHlTbGlkZXJIZWlnaHQgPSBvcGFjaXR5U2xpZGVyWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcblxuICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLmVsZW1lbnQudmFsKCk7XG4gICAgICAgIHZhbHVlID0gcmdic3RyMmhleCh2YWx1ZSkgfHwgdmFsdWU7XG4gICAgICAgIGlmICghKGhleCA9IHBhcnNlSGV4KHZhbHVlKSkpIHsgaGV4ID0gJyNmZmZmZmYnOyB9XG5cbiAgICAgICAgLy8gSGFuZGxlIGNvbG9yc1xuICAgICAgICBpZiAodGFyZ2V0Lmhhc0NsYXNzKCdjcC1ncmlkJykgfHwgdGFyZ2V0Lmhhc0NsYXNzKCdjcC1zbGlkZXInKSkge1xuXG4gICAgICAgICAgICAvLyBEZXRlcm1pbmUgSFNCIHZhbHVlc1xuICAgICAgICAgICAgc3dpdGNoICh0aGlzLm1vZGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICd3aGVlbCc6XG4gICAgICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBodWUsIHNhdHVyYXRpb24sIGFuZCBicmlnaHRuZXNzXG4gICAgICAgICAgICAgICAgICAgIHggPSAoZ3JpZFdpZHRoIC8gMikgLSBncmlkUG9zLng7XG4gICAgICAgICAgICAgICAgICAgIHkgPSAoZ3JpZEhlaWdodCAvIDIpIC0gZ3JpZFBvcy55O1xuICAgICAgICAgICAgICAgICAgICByID0gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkpO1xuICAgICAgICAgICAgICAgICAgICBwaGkgPSBNYXRoLmF0YW4yKHksIHgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocGhpIDwgMCkgcGhpICs9IE1hdGguUEkgKiAyO1xuICAgICAgICAgICAgICAgICAgICBpZiAociA+IDc1KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByID0gNzU7XG4gICAgICAgICAgICAgICAgICAgICAgICBncmlkUG9zLnggPSA2OSAtICg3NSAqIE1hdGguY29zKHBoaSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZ3JpZFBvcy55ID0gNjkgLSAoNzUgKiBNYXRoLnNpbihwaGkpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzYXR1cmF0aW9uID0gY2xhbXAociAvIDAuNzUsIDAsIDEwMCk7XG4gICAgICAgICAgICAgICAgICAgIGh1ZSA9IGNsYW1wKHBoaSAqIDE4MCAvIE1hdGguUEksIDAsIDM2MCk7XG4gICAgICAgICAgICAgICAgICAgIGJyaWdodG5lc3MgPSBjbGFtcCgxMDAgLSBNYXRoLmZsb29yKHNsaWRlclBvcy55ICogKDEwMCAvIHNsaWRlckhlaWdodCkpLCAwLCAxMDApO1xuICAgICAgICAgICAgICAgICAgICBoZXggPSBoc2IyaGV4KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGg6IGh1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHM6IHNhdHVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBiOiBicmlnaHRuZXNzXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBVSVxuICAgICAgICAgICAgICAgICAgICBzbGlkZXIuY3NzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogaHNiMmhleCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaDogaHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHM6IHNhdHVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYjogMTAwXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdzYXR1cmF0aW9uJzpcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGh1ZSwgc2F0dXJhdGlvbiwgYW5kIGJyaWdodG5lc3NcbiAgICAgICAgICAgICAgICAgICAgaHVlID0gY2xhbXAocGFyc2VJbnQoZ3JpZFBvcy54ICogKDM2MCAvIGdyaWRXaWR0aCksIDEwKSwgMCwgMzYwKTtcbiAgICAgICAgICAgICAgICAgICAgc2F0dXJhdGlvbiA9IGNsYW1wKDEwMCAtIE1hdGguZmxvb3Ioc2xpZGVyUG9zLnkgKiAoMTAwIC8gc2xpZGVySGVpZ2h0KSksIDAsIDEwMCk7XG4gICAgICAgICAgICAgICAgICAgIGJyaWdodG5lc3MgPSBjbGFtcCgxMDAgLSBNYXRoLmZsb29yKGdyaWRQb3MueSAqICgxMDAgLyBncmlkSGVpZ2h0KSksIDAsIDEwMCk7XG4gICAgICAgICAgICAgICAgICAgIGhleCA9IGhzYjJoZXgoe1xuICAgICAgICAgICAgICAgICAgICAgICAgaDogaHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgczogc2F0dXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGI6IGJyaWdodG5lc3NcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIFVJXG4gICAgICAgICAgICAgICAgICAgIHNsaWRlci5jc3Moe1xuICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBoc2IyaGV4KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoOiBodWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgczogMTAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGI6IGJyaWdodG5lc3NcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBncmlkLmZpbmQoJy5jcC1ncmlkLWlubmVyJykuY3NzKHsgb3BhY2l0eTogc2F0dXJhdGlvbiAvIDEwMCB9KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdicmlnaHRuZXNzJzpcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGh1ZSwgc2F0dXJhdGlvbiwgYW5kIGJyaWdodG5lc3NcbiAgICAgICAgICAgICAgICAgICAgaHVlID0gY2xhbXAocGFyc2VJbnQoZ3JpZFBvcy54ICogKDM2MCAvIGdyaWRXaWR0aCksIDEwKSwgMCwgMzYwKTtcbiAgICAgICAgICAgICAgICAgICAgc2F0dXJhdGlvbiA9IGNsYW1wKDEwMCAtIE1hdGguZmxvb3IoZ3JpZFBvcy55ICogKDEwMCAvIGdyaWRIZWlnaHQpKSwgMCwgMTAwKTtcbiAgICAgICAgICAgICAgICAgICAgYnJpZ2h0bmVzcyA9IGNsYW1wKDEwMCAtIE1hdGguZmxvb3Ioc2xpZGVyUG9zLnkgKiAoMTAwIC8gc2xpZGVySGVpZ2h0KSksIDAsIDEwMCk7XG4gICAgICAgICAgICAgICAgICAgIGhleCA9IGhzYjJoZXgoe1xuICAgICAgICAgICAgICAgICAgICAgICAgaDogaHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgczogc2F0dXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGI6IGJyaWdodG5lc3NcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIFVJXG4gICAgICAgICAgICAgICAgICAgIHNsaWRlci5jc3Moe1xuICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBoc2IyaGV4KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoOiBodWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgczogc2F0dXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiOiAxMDBcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBncmlkLmZpbmQoJy5jcC1ncmlkLWlubmVyJykuY3NzKHsgb3BhY2l0eTogMSAtIChicmlnaHRuZXNzIC8gMTAwKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgaHVlLCBzYXR1cmF0aW9uLCBhbmQgYnJpZ2h0bmVzc1xuICAgICAgICAgICAgICAgICAgICBodWUgPSBjbGFtcCgzNjAgLSBwYXJzZUludChzbGlkZXJQb3MueSAqICgzNjAgLyBzbGlkZXJIZWlnaHQpLCAxMCksIDAsIDM2MCk7XG4gICAgICAgICAgICAgICAgICAgIHNhdHVyYXRpb24gPSBjbGFtcChNYXRoLmZsb29yKGdyaWRQb3MueCAqICgxMDAgLyBncmlkV2lkdGgpKSwgMCwgMTAwKTtcbiAgICAgICAgICAgICAgICAgICAgYnJpZ2h0bmVzcyA9IGNsYW1wKDEwMCAtIE1hdGguZmxvb3IoZ3JpZFBvcy55ICogKDEwMCAvIGdyaWRIZWlnaHQpKSwgMCwgMTAwKTtcbiAgICAgICAgICAgICAgICAgICAgaGV4ID0gaHNiMmhleCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBoOiBodWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzOiBzYXR1cmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgYjogYnJpZ2h0bmVzc1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgVUlcbiAgICAgICAgICAgICAgICAgICAgZ3JpZC5jc3Moe1xuICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBoc2IyaGV4KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoOiBodWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgczogMTAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGI6IDEwMFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgb3BhY2l0eVxuICAgICAgICBpZiAodGFyZ2V0Lmhhc0NsYXNzKCdjcC1vcGFjaXR5LXNsaWRlcicpKSB7XG4gICAgICAgICAgICB0aGlzLm9wYWNpdHkgPSBwYXJzZUZsb2F0KDEgLSAob3BhY2l0eVBvcy55IC8gb3BhY2l0eVNsaWRlckhlaWdodCkpLnRvRml4ZWQoMik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGp1c3QgY2FzZVxuICAgICAgICBpbnB1dC52YWwodGhpcy5nZXRWYWx1ZShoZXgpKTtcblxuICAgICAgICAvLyBIYW5kbGUgY2hhbmdlIGV2ZW50XG4gICAgICAgIHRoaXMuZWxlbWVudC50cmlnZ2VyKCdjaGFuZ2UuX2dyYXZfY29sb3JwaWNrZXInLCBbdGhpcy5lbGVtZW50LCBoZXgsIHRoaXMub3BhY2l0eV0pO1xuXG4gICAgfVxuXG4gICAgZ2V0VmFsdWUoaGV4KSB7XG4gICAgICAgIGlmICh0aGlzLm9wYWNpdHkgPT09IDEpIHsgcmV0dXJuIGhleDsgfVxuICAgICAgICBsZXQgcmdiID0gaGV4MnJnYihoZXgpO1xuXG4gICAgICAgIHJldHVybiAncmdiYSgnICsgcmdiLnIgKyAnLCAnICsgcmdiLmcgKyAnLCAnICsgcmdiLmIgKyAnLCAnICsgdGhpcy5vcGFjaXR5ICsgJyknO1xuICAgIH1cblxuICAgIGJvdW5kKG5hbWUpIHtcbiAgICAgICAgbGV0IGJvdW5kID0gdGhpcy5fYm91bmQgfHwgKHRoaXMuX2JvdW5kID0ge30pO1xuICAgICAgICByZXR1cm4gYm91bmRbbmFtZV0gfHwgKGJvdW5kW25hbWVdID0gYmluZCh0aGlzW25hbWVdLCB0aGlzKSk7XG4gICAgfVxufVxuXG5leHBvcnQgbGV0IEluc3RhbmNlID0gbmV3IENvbG9ycGlja2VyRmllbGQoJ1tkYXRhLWdyYXYtY29sb3JwaWNrZXJdJyk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./app/forms/fields/colorpicker.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ ColorpickerField),\n/* harmony export */ \"Instance\": () => (/* binding */ Instance)\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var mout_math_clamp__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! mout/math/clamp */ \"./node_modules/mout/math/clamp.js\");\n/* harmony import */ var mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(mout_math_clamp__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var mout_function_bind__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! mout/function/bind */ \"./node_modules/mout/function/bind.js\");\n/* harmony import */ var mout_function_bind__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(mout_function_bind__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _utils_colors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../utils/colors */ \"./app/utils/colors.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\n\nvar isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\nvar body = jquery__WEBPACK_IMPORTED_MODULE_0___default()('body');\nvar MOUSEDOWN = 'mousedown touchstart MSPointerDown pointerdown';\nvar MOUSEMOVE = 'mousemove touchmove MSPointerMove pointermove';\nvar MOUSEUP = 'mouseup touchend MSPointerUp pointerup';\nvar FOCUSIN = isFirefox ? 'focus' : 'focusin';\n\nvar ColorpickerField = /*#__PURE__*/function () {\n function ColorpickerField(selector) {\n var _this = this;\n\n _classCallCheck(this, ColorpickerField);\n\n this.selector = selector;\n this.field = jquery__WEBPACK_IMPORTED_MODULE_0___default()(this.selector);\n this.options = Object.assign({}, this.field.data('grav-colorpicker'));\n this.built = false;\n this.attach();\n\n if (this.options.update) {\n this.field.on('change._grav_colorpicker', function (event, field, hex, opacity) {\n var backgroundColor = hex;\n var rgb = (0,_utils_colors__WEBPACK_IMPORTED_MODULE_3__.hex2rgb)(hex);\n\n if (opacity < 1) {\n backgroundColor = 'rgba(' + rgb.r + ', ' + rgb.g + ', ' + rgb.b + ', ' + opacity + ')';\n }\n\n var target = field.closest(_this.options.update);\n\n if (!target.length) {\n target = field.siblings(_this.options.update);\n }\n\n if (!target.length) {\n target = field.parent('.g-colorpicker').find(_this.options.update);\n }\n\n target.css({\n backgroundColor: backgroundColor\n });\n });\n }\n }\n\n _createClass(ColorpickerField, [{\n key: \"attach\",\n value: function attach() {\n var _this2 = this;\n\n body.on(FOCUSIN, this.selector, function (event) {\n return _this2.show(event, event.currentTarget);\n });\n body.on(MOUSEDOWN, this.selector + ' .g-colorpicker, ' + this.selector + ' .g-colorpicker i', this.bound('iconClick'));\n body.on('keydown', this.selector, function (event) {\n switch (event.keyCode) {\n case 9:\n // tab\n _this2.hide();\n\n break;\n\n case 13: // enter\n\n case 27:\n // esc\n _this2.hide();\n\n event.currentTarget.blur();\n break;\n }\n\n return true;\n }); // Update on keyup\n\n body.on('keyup', this.selector, function (event) {\n _this2.updateFromInput(true, event.currentTarget);\n\n return true;\n }); // Update on paste\n\n body.on('paste', this.selector, function (event) {\n setTimeout(function () {\n return _this2.updateFromInput(true, event.currentTarget);\n }, 1);\n });\n }\n }, {\n key: \"show\",\n value: function show(event, target) {\n target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(target);\n\n if (!this.built) {\n this.build();\n }\n\n this.element = target;\n this.reposition();\n this.wrapper.addClass('cp-visible');\n this.updateFromInput();\n this.wrapper.on(MOUSEDOWN, '.cp-grid, .cp-slider, .cp-opacity-slider', this.bound('bodyDown'));\n body.on(MOUSEMOVE, this.bound('bodyMove'));\n body.on(MOUSEDOWN, this.bound('bodyClick'));\n body.on(MOUSEUP, this.bound('targetReset'));\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('#admin-main > .content-wrapper').on('scroll', this.bound('reposition'));\n }\n }, {\n key: \"hide\",\n value: function hide() {\n if (!this.built) {\n return;\n }\n\n this.wrapper.removeClass('cp-visible');\n this.wrapper.undelegate(MOUSEDOWN, '.cp-grid, .cp-slider, .cp-opacity-slider', this.bound('bodyDown'));\n body.off(MOUSEMOVE, this.bound('bodyMove'));\n body.off(MOUSEDOWN, this.bound('bodyClick'));\n body.off(MOUSEUP, this.bound('targetReset'));\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('#admin-main > .content-wrapper').on('scroll', this.bound('reposition'));\n }\n }, {\n key: \"build\",\n value: function build() {\n var _this3 = this;\n\n this.wrapper = jquery__WEBPACK_IMPORTED_MODULE_0___default()('
');\n this.slider = jquery__WEBPACK_IMPORTED_MODULE_0___default()('
').appendTo(this.wrapper).append(jquery__WEBPACK_IMPORTED_MODULE_0___default()('
'));\n this.opacitySlider = jquery__WEBPACK_IMPORTED_MODULE_0___default()('
').appendTo(this.wrapper).append(jquery__WEBPACK_IMPORTED_MODULE_0___default()('
'));\n this.grid = jquery__WEBPACK_IMPORTED_MODULE_0___default()('
').appendTo(this.wrapper).append(jquery__WEBPACK_IMPORTED_MODULE_0___default()('
')).append(jquery__WEBPACK_IMPORTED_MODULE_0___default()('
'));\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('
').appendTo(this.grid.find('.cp-picker'));\n var tabs = jquery__WEBPACK_IMPORTED_MODULE_0___default()('
').appendTo(this.wrapper);\n this.tabs = {\n hue: jquery__WEBPACK_IMPORTED_MODULE_0___default()('
').text('HUE').appendTo(tabs),\n brightness: jquery__WEBPACK_IMPORTED_MODULE_0___default()('
').text('BRI').appendTo(tabs),\n saturation: jquery__WEBPACK_IMPORTED_MODULE_0___default()('
').text('SAT').appendTo(tabs),\n wheel: jquery__WEBPACK_IMPORTED_MODULE_0___default()('
').text('WHEEL').appendTo(tabs),\n transparent: jquery__WEBPACK_IMPORTED_MODULE_0___default()('
').text('TRANSPARENT').appendTo(tabs)\n };\n tabs.on(MOUSEDOWN, '> div', function (event) {\n var element = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.currentTarget);\n\n if (element.is(_this3.tabs.transparent)) {\n var sliderHeight = _this3.opacitySlider.height();\n\n _this3.opacity = 0;\n\n _this3.opacitySlider.find('.cp-picker').css({\n 'top': mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(sliderHeight - sliderHeight * _this3.opacity, 0, sliderHeight)\n });\n\n _this3.move(_this3.opacitySlider, {\n manualOpacity: true\n });\n\n return;\n }\n\n var active = tabs.find('.active');\n var mode = active.attr('class').replace(/\\s|active|cp-tab-/g, '');\n var newMode = element.attr('class').replace(/\\s|active|cp-tab-/g, '');\n\n _this3.wrapper.removeClass('cp-mode-' + mode).addClass('cp-mode-' + newMode);\n\n active.removeClass('active');\n element.addClass('active');\n _this3.mode = newMode;\n\n _this3.updateFromInput();\n });\n this.wrapper.appendTo('.content-wrapper');\n this.built = true;\n this.mode = 'hue';\n }\n }, {\n key: \"reposition\",\n value: function reposition() {\n var ct = jquery__WEBPACK_IMPORTED_MODULE_0___default()('.content-wrapper')[0];\n var offset = this.element[0].getBoundingClientRect();\n var ctOffset = ct.getBoundingClientRect();\n var delta = {\n x: 0,\n y: 0\n };\n\n if (this.options.offset) {\n delta.x = this.options.offset.x || 0;\n delta.y = this.options.offset.y || 0;\n }\n\n this.wrapper.css({\n top: offset.top + offset.height + ct.scrollTop - ctOffset.top + delta.y,\n left: offset.left + ct.scrollLeft - ctOffset.left + delta.x\n });\n }\n }, {\n key: \"iconClick\",\n value: function iconClick(event) {\n if (this.wrapper && this.wrapper.hasClass('cp-visible')) {\n return true;\n }\n\n event && event.preventDefault();\n var input = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.currentTarget).find('input');\n setTimeout(function () {\n return input.focus();\n }, 50);\n }\n }, {\n key: \"bodyMove\",\n value: function bodyMove(event) {\n event && event.preventDefault();\n\n if (this.target) {\n this.move(this.target, event);\n }\n }\n }, {\n key: \"bodyClick\",\n value: function bodyClick(event) {\n var target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.target);\n\n if (!target.closest('.cp-wrapper').length && !target.is(this.selector)) {\n this.hide();\n }\n }\n }, {\n key: \"bodyDown\",\n value: function bodyDown(event) {\n event && event.preventDefault();\n this.target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.currentTarget);\n this.move(this.target, event, true);\n }\n }, {\n key: \"targetReset\",\n value: function targetReset(event) {\n event && event.preventDefault();\n this.target = null;\n }\n }, {\n key: \"move\",\n value: function move(target, event) {\n var input = this.element;\n var picker = target.find('.cp-picker');\n var clientRect = target[0].getBoundingClientRect();\n var offsetX = clientRect.left + window.scrollX;\n var offsetY = clientRect.top + window.scrollY;\n var x = Math.round((event ? event.pageX : 0) - offsetX);\n var y = Math.round((event ? event.pageY : 0) - offsetY);\n var wx;\n var wy;\n var r;\n var phi; // Touch support\n\n var touchEvents = event.changedTouches || event.originalEvent && event.originalEvent.changedTouches;\n\n if (event && touchEvents) {\n x = (touchEvents ? touchEvents[0].pageX : 0) - offsetX;\n y = (touchEvents ? touchEvents[0].pageY : 0) - offsetY;\n }\n\n if (event && event.manualOpacity) {\n y = clientRect.height;\n } // Constrain picker to its container\n\n\n if (x < 0) x = 0;\n if (y < 0) y = 0;\n if (x > clientRect.width) x = clientRect.width;\n if (y > clientRect.height) y = clientRect.height; // Constrain color wheel values to the wheel\n\n if (target.parent('.cp-mode-wheel').length && picker.parent('.cp-grid').length) {\n wx = 75 - x;\n wy = 75 - y;\n r = Math.sqrt(wx * wx + wy * wy);\n phi = Math.atan2(wy, wx);\n if (phi < 0) phi += Math.PI * 2;\n\n if (r > 75) {\n x = 75 - 75 * Math.cos(phi);\n y = 75 - 75 * Math.sin(phi);\n }\n\n x = Math.round(x);\n y = Math.round(y);\n } // Move the picker\n\n\n if (target.hasClass('cp-grid')) {\n picker.css({\n top: y,\n left: x\n });\n this.updateFromPicker(input, target);\n } else {\n picker.css({\n top: y\n });\n this.updateFromPicker(input, target);\n }\n }\n }, {\n key: \"updateFromInput\",\n value: function updateFromInput(dontFireEvent, element) {\n element = element ? jquery__WEBPACK_IMPORTED_MODULE_0___default()(element) : this.element;\n var value = element.val();\n var opacity = value.replace(/\\s/g, '').match(/^rgba?\\([0-9]{1,3},[0-9]{1,3},[0-9]{1,3},(.+)\\)/);\n var hex;\n var hsb;\n value = (0,_utils_colors__WEBPACK_IMPORTED_MODULE_3__.rgbstr2hex)(value) || value;\n opacity = opacity ? mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(opacity[1], 0, 1) : 1;\n\n if (!(hex = (0,_utils_colors__WEBPACK_IMPORTED_MODULE_3__.parseHex)(value))) {\n hex = '#ffffff';\n }\n\n hsb = (0,_utils_colors__WEBPACK_IMPORTED_MODULE_3__.hex2hsb)(hex);\n\n if (this.built) {\n // opacity\n this.opacity = opacity;\n var sliderHeight = this.opacitySlider.height();\n this.opacitySlider.find('.cp-picker').css({\n 'top': mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(sliderHeight - sliderHeight * this.opacity, 0, sliderHeight)\n }); // bg color\n\n var gridHeight = this.grid.height();\n var gridWidth = this.grid.width();\n var r;\n var phi;\n var x;\n var y;\n sliderHeight = this.slider.height();\n\n switch (this.mode) {\n case 'wheel':\n // Set grid position\n r = mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(Math.ceil(hsb.s * 0.75), 0, gridHeight / 2);\n phi = hsb.h * Math.PI / 180;\n x = mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(75 - Math.cos(phi) * r, 0, gridWidth);\n y = mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(75 - Math.sin(phi) * r, 0, gridHeight);\n this.grid.css({\n backgroundColor: 'transparent'\n }).find('.cp-picker').css({\n top: y,\n left: x\n }); // Set slider position\n\n y = 150 - hsb.b / (100 / gridHeight);\n if (hex === '') y = 0;\n this.slider.find('.cp-picker').css({\n top: y\n }); // Update panel color\n\n this.slider.css({\n backgroundColor: (0,_utils_colors__WEBPACK_IMPORTED_MODULE_3__.hsb2hex)({\n h: hsb.h,\n s: hsb.s,\n b: 100\n })\n });\n break;\n\n case 'saturation':\n // Set grid position\n x = mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(5 * hsb.h / 12, 0, 150);\n y = mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(gridHeight - Math.ceil(hsb.b / (100 / gridHeight)), 0, gridHeight);\n this.grid.find('.cp-picker').css({\n top: y,\n left: x\n }); // Set slider position\n\n y = mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(sliderHeight - hsb.s * (sliderHeight / 100), 0, sliderHeight);\n this.slider.find('.cp-picker').css({\n top: y\n }); // Update UI\n\n this.slider.css({\n backgroundColor: (0,_utils_colors__WEBPACK_IMPORTED_MODULE_3__.hsb2hex)({\n h: hsb.h,\n s: 100,\n b: hsb.b\n })\n });\n this.grid.find('.cp-grid-inner').css({\n opacity: hsb.s / 100\n });\n break;\n\n case 'brightness':\n // Set grid position\n x = mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(5 * hsb.h / 12, 0, 150);\n y = mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(gridHeight - Math.ceil(hsb.s / (100 / gridHeight)), 0, gridHeight);\n this.grid.find('.cp-picker').css({\n top: y,\n left: x\n }); // Set slider position\n\n y = mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(sliderHeight - hsb.b * (sliderHeight / 100), 0, sliderHeight);\n this.slider.find('.cp-picker').css({\n top: y\n }); // Update UI\n\n this.slider.css({\n backgroundColor: (0,_utils_colors__WEBPACK_IMPORTED_MODULE_3__.hsb2hex)({\n h: hsb.h,\n s: hsb.s,\n b: 100\n })\n });\n this.grid.find('.cp-grid-inner').css({\n opacity: 1 - hsb.b / 100\n });\n break;\n\n case 'hue':\n default:\n // Set grid position\n x = mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(Math.ceil(hsb.s / (100 / gridWidth)), 0, gridWidth);\n y = mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(gridHeight - Math.ceil(hsb.b / (100 / gridHeight)), 0, gridHeight);\n this.grid.find('.cp-picker').css({\n top: y,\n left: x\n }); // Set slider position\n\n y = mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(sliderHeight - hsb.h / (360 / sliderHeight), 0, sliderHeight);\n this.slider.find('.cp-picker').css({\n top: y\n }); // Update panel color\n\n this.grid.css({\n backgroundColor: (0,_utils_colors__WEBPACK_IMPORTED_MODULE_3__.hsb2hex)({\n h: hsb.h,\n s: 100,\n b: 100\n })\n });\n break;\n }\n }\n\n if (!dontFireEvent) {\n element.val(this.getValue(hex));\n }\n\n (this.element || element).trigger('change._grav_colorpicker', [element, hex, opacity]);\n }\n }, {\n key: \"updateFromPicker\",\n value: function updateFromPicker(input, target) {\n var getCoords = function getCoords(picker, container) {\n var left, top;\n if (!picker.length || !container) return null;\n left = picker[0].getBoundingClientRect().left;\n top = picker[0].getBoundingClientRect().top;\n return {\n x: left - container[0].getBoundingClientRect().left + picker[0].offsetWidth / 2,\n y: top - container[0].getBoundingClientRect().top + picker[0].offsetHeight / 2\n };\n };\n\n var hex;\n var hue;\n var saturation;\n var brightness;\n var x;\n var y;\n var r;\n var phi; // Panel objects\n\n var grid = this.wrapper.find('.cp-grid');\n var slider = this.wrapper.find('.cp-slider');\n var opacitySlider = this.wrapper.find('.cp-opacity-slider'); // Picker objects\n\n var gridPicker = grid.find('.cp-picker');\n var sliderPicker = slider.find('.cp-picker');\n var opacityPicker = opacitySlider.find('.cp-picker'); // Picker positions\n\n var gridPos = getCoords(gridPicker, grid);\n var sliderPos = getCoords(sliderPicker, slider);\n var opacityPos = getCoords(opacityPicker, opacitySlider); // Sizes\n\n var gridWidth = grid[0].getBoundingClientRect().width;\n var gridHeight = grid[0].getBoundingClientRect().height;\n var sliderHeight = slider[0].getBoundingClientRect().height;\n var opacitySliderHeight = opacitySlider[0].getBoundingClientRect().height;\n var value = this.element.val();\n value = (0,_utils_colors__WEBPACK_IMPORTED_MODULE_3__.rgbstr2hex)(value) || value;\n\n if (!(hex = (0,_utils_colors__WEBPACK_IMPORTED_MODULE_3__.parseHex)(value))) {\n hex = '#ffffff';\n } // Handle colors\n\n\n if (target.hasClass('cp-grid') || target.hasClass('cp-slider')) {\n // Determine HSB values\n switch (this.mode) {\n case 'wheel':\n // Calculate hue, saturation, and brightness\n x = gridWidth / 2 - gridPos.x;\n y = gridHeight / 2 - gridPos.y;\n r = Math.sqrt(x * x + y * y);\n phi = Math.atan2(y, x);\n if (phi < 0) phi += Math.PI * 2;\n\n if (r > 75) {\n r = 75;\n gridPos.x = 69 - 75 * Math.cos(phi);\n gridPos.y = 69 - 75 * Math.sin(phi);\n }\n\n saturation = mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(r / 0.75, 0, 100);\n hue = mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(phi * 180 / Math.PI, 0, 360);\n brightness = mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(100 - Math.floor(sliderPos.y * (100 / sliderHeight)), 0, 100);\n hex = (0,_utils_colors__WEBPACK_IMPORTED_MODULE_3__.hsb2hex)({\n h: hue,\n s: saturation,\n b: brightness\n }); // Update UI\n\n slider.css({\n backgroundColor: (0,_utils_colors__WEBPACK_IMPORTED_MODULE_3__.hsb2hex)({\n h: hue,\n s: saturation,\n b: 100\n })\n });\n break;\n\n case 'saturation':\n // Calculate hue, saturation, and brightness\n hue = mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(parseInt(gridPos.x * (360 / gridWidth), 10), 0, 360);\n saturation = mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(100 - Math.floor(sliderPos.y * (100 / sliderHeight)), 0, 100);\n brightness = mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(100 - Math.floor(gridPos.y * (100 / gridHeight)), 0, 100);\n hex = (0,_utils_colors__WEBPACK_IMPORTED_MODULE_3__.hsb2hex)({\n h: hue,\n s: saturation,\n b: brightness\n }); // Update UI\n\n slider.css({\n backgroundColor: (0,_utils_colors__WEBPACK_IMPORTED_MODULE_3__.hsb2hex)({\n h: hue,\n s: 100,\n b: brightness\n })\n });\n grid.find('.cp-grid-inner').css({\n opacity: saturation / 100\n });\n break;\n\n case 'brightness':\n // Calculate hue, saturation, and brightness\n hue = mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(parseInt(gridPos.x * (360 / gridWidth), 10), 0, 360);\n saturation = mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(100 - Math.floor(gridPos.y * (100 / gridHeight)), 0, 100);\n brightness = mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(100 - Math.floor(sliderPos.y * (100 / sliderHeight)), 0, 100);\n hex = (0,_utils_colors__WEBPACK_IMPORTED_MODULE_3__.hsb2hex)({\n h: hue,\n s: saturation,\n b: brightness\n }); // Update UI\n\n slider.css({\n backgroundColor: (0,_utils_colors__WEBPACK_IMPORTED_MODULE_3__.hsb2hex)({\n h: hue,\n s: saturation,\n b: 100\n })\n });\n grid.find('.cp-grid-inner').css({\n opacity: 1 - brightness / 100\n });\n break;\n\n default:\n // Calculate hue, saturation, and brightness\n hue = mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(360 - parseInt(sliderPos.y * (360 / sliderHeight), 10), 0, 360);\n saturation = mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(Math.floor(gridPos.x * (100 / gridWidth)), 0, 100);\n brightness = mout_math_clamp__WEBPACK_IMPORTED_MODULE_1___default()(100 - Math.floor(gridPos.y * (100 / gridHeight)), 0, 100);\n hex = (0,_utils_colors__WEBPACK_IMPORTED_MODULE_3__.hsb2hex)({\n h: hue,\n s: saturation,\n b: brightness\n }); // Update UI\n\n grid.css({\n backgroundColor: (0,_utils_colors__WEBPACK_IMPORTED_MODULE_3__.hsb2hex)({\n h: hue,\n s: 100,\n b: 100\n })\n });\n break;\n }\n } // Handle opacity\n\n\n if (target.hasClass('cp-opacity-slider')) {\n this.opacity = parseFloat(1 - opacityPos.y / opacitySliderHeight).toFixed(2);\n } // Adjust case\n\n\n input.val(this.getValue(hex)); // Handle change event\n\n this.element.trigger('change._grav_colorpicker', [this.element, hex, this.opacity]);\n }\n }, {\n key: \"getValue\",\n value: function getValue(hex) {\n if (this.opacity === 1) {\n return hex;\n }\n\n var rgb = (0,_utils_colors__WEBPACK_IMPORTED_MODULE_3__.hex2rgb)(hex);\n return 'rgba(' + rgb.r + ', ' + rgb.g + ', ' + rgb.b + ', ' + this.opacity + ')';\n }\n }, {\n key: \"bound\",\n value: function bound(name) {\n var bound = this._bound || (this._bound = {});\n return bound[name] || (bound[name] = mout_function_bind__WEBPACK_IMPORTED_MODULE_2___default()(this[name], this));\n }\n }]);\n\n return ColorpickerField;\n}();\n\n\nvar Instance = new ColorpickerField('[data-grav-colorpicker]');//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL2Zvcm1zL2ZpZWxkcy9jb2xvcnBpY2tlci5qcz9iYTk4Il0sIm5hbWVzIjpbImlzRmlyZWZveCIsIm5hdmlnYXRvciIsInVzZXJBZ2VudCIsInRvTG93ZXJDYXNlIiwiaW5kZXhPZiIsImJvZHkiLCIkIiwiTU9VU0VET1dOIiwiTU9VU0VNT1ZFIiwiTU9VU0VVUCIsIkZPQ1VTSU4iLCJDb2xvcnBpY2tlckZpZWxkIiwic2VsZWN0b3IiLCJmaWVsZCIsIm9wdGlvbnMiLCJPYmplY3QiLCJhc3NpZ24iLCJkYXRhIiwiYnVpbHQiLCJhdHRhY2giLCJ1cGRhdGUiLCJvbiIsImV2ZW50IiwiaGV4Iiwib3BhY2l0eSIsImJhY2tncm91bmRDb2xvciIsInJnYiIsImhleDJyZ2IiLCJyIiwiZyIsImIiLCJ0YXJnZXQiLCJjbG9zZXN0IiwibGVuZ3RoIiwic2libGluZ3MiLCJwYXJlbnQiLCJmaW5kIiwiY3NzIiwic2hvdyIsImN1cnJlbnRUYXJnZXQiLCJib3VuZCIsImtleUNvZGUiLCJoaWRlIiwiYmx1ciIsInVwZGF0ZUZyb21JbnB1dCIsInNldFRpbWVvdXQiLCJidWlsZCIsImVsZW1lbnQiLCJyZXBvc2l0aW9uIiwid3JhcHBlciIsImFkZENsYXNzIiwicmVtb3ZlQ2xhc3MiLCJ1bmRlbGVnYXRlIiwib2ZmIiwic2xpZGVyIiwiYXBwZW5kVG8iLCJhcHBlbmQiLCJvcGFjaXR5U2xpZGVyIiwiZ3JpZCIsInRhYnMiLCJodWUiLCJ0ZXh0IiwiYnJpZ2h0bmVzcyIsInNhdHVyYXRpb24iLCJ3aGVlbCIsInRyYW5zcGFyZW50IiwiaXMiLCJzbGlkZXJIZWlnaHQiLCJoZWlnaHQiLCJjbGFtcCIsIm1vdmUiLCJtYW51YWxPcGFjaXR5IiwiYWN0aXZlIiwibW9kZSIsImF0dHIiLCJyZXBsYWNlIiwibmV3TW9kZSIsImN0Iiwib2Zmc2V0IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwiY3RPZmZzZXQiLCJkZWx0YSIsIngiLCJ5IiwidG9wIiwic2Nyb2xsVG9wIiwibGVmdCIsInNjcm9sbExlZnQiLCJoYXNDbGFzcyIsInByZXZlbnREZWZhdWx0IiwiaW5wdXQiLCJmb2N1cyIsInBpY2tlciIsImNsaWVudFJlY3QiLCJvZmZzZXRYIiwid2luZG93Iiwic2Nyb2xsWCIsIm9mZnNldFkiLCJzY3JvbGxZIiwiTWF0aCIsInJvdW5kIiwicGFnZVgiLCJwYWdlWSIsInd4Iiwid3kiLCJwaGkiLCJ0b3VjaEV2ZW50cyIsImNoYW5nZWRUb3VjaGVzIiwib3JpZ2luYWxFdmVudCIsIndpZHRoIiwic3FydCIsImF0YW4yIiwiUEkiLCJjb3MiLCJzaW4iLCJ1cGRhdGVGcm9tUGlja2VyIiwiZG9udEZpcmVFdmVudCIsInZhbHVlIiwidmFsIiwibWF0Y2giLCJoc2IiLCJyZ2JzdHIyaGV4IiwicGFyc2VIZXgiLCJoZXgyaHNiIiwiZ3JpZEhlaWdodCIsImdyaWRXaWR0aCIsImNlaWwiLCJzIiwiaCIsImhzYjJoZXgiLCJnZXRWYWx1ZSIsInRyaWdnZXIiLCJnZXRDb29yZHMiLCJjb250YWluZXIiLCJvZmZzZXRXaWR0aCIsIm9mZnNldEhlaWdodCIsImdyaWRQaWNrZXIiLCJzbGlkZXJQaWNrZXIiLCJvcGFjaXR5UGlja2VyIiwiZ3JpZFBvcyIsInNsaWRlclBvcyIsIm9wYWNpdHlQb3MiLCJvcGFjaXR5U2xpZGVySGVpZ2h0IiwiZmxvb3IiLCJwYXJzZUludCIsInBhcnNlRmxvYXQiLCJ0b0ZpeGVkIiwibmFtZSIsIl9ib3VuZCIsImJpbmQiLCJJbnN0YW5jZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQSxJQUFNQSxTQUFTLEdBQUdDLFNBQVMsQ0FBQ0MsU0FBVixDQUFvQkMsV0FBcEIsR0FBa0NDLE9BQWxDLENBQTBDLFNBQTFDLElBQXVELENBQUMsQ0FBMUU7QUFDQSxJQUFNQyxJQUFJLEdBQUdDLDZDQUFDLENBQUMsTUFBRCxDQUFkO0FBRUEsSUFBTUMsU0FBUyxHQUFHLGdEQUFsQjtB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LElBQUwsQ0FBRCxFQUFhLElBQWIsQ0FBbEMsQ0FBUDtBQUNIOzs7Ozs7O0FBR0UsSUFBSUcsUUFBUSxHQUFHLElBQUkzSSxnQkFBSixDQUFxQix5QkFBckIsQ0FBZiIsImZpbGUiOiIuL2FwcC9mb3Jtcy9maWVsZHMvY29sb3JwaWNrZXIuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IGNsYW1wIGZyb20gJ21vdXQvbWF0aC9jbGFtcCc7XG5pbXBvcnQgYmluZCBmcm9tICdtb3V0L2Z1bmN0aW9uL2JpbmQnO1xuaW1wb3J0IHsgcmdic3RyMmhleCwgaHNiMmhleCwgaGV4MmhzYiwgaGV4MnJnYiwgcGFyc2VIZXggfSBmcm9tICcuLi8uLi91dGlscy9jb2xvcnMnO1xuXG5jb25zdCBpc0ZpcmVmb3ggPSBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZignZmlyZWZveCcpID4gLTE7XG5jb25zdCBib2R5ID0gJCgnYm9keScpO1xuXG5jb25zdCBNT1VTRURPV04gPSAnbW91c2Vkb3duIHRvdWNoc3RhcnQgTVNQb2ludGVyRG93biBwb2ludGVyZG93bic7XG5jb25zdCBNT1VTRU1PVkUgPSAnbW91c2Vtb3ZlIHRvdWNobW92ZSBNU1BvaW50ZXJNb3ZlIHBvaW50ZXJtb3ZlJztcbmNvbnN0IE1PVVNFVVAgPSAnbW91c2V1cCB0b3VjaGVuZCBNU1BvaW50ZXJVcCBwb2ludGVydXAnO1xuY29uc3QgRk9DVVNJTiA9IGlzRmlyZWZveCA/ICdmb2N1cycgOiAnZm9jdXNpbic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbG9ycGlja2VyRmllbGQge1xuICAgIGNvbnN0cnVjdG9yKHNlbGVjdG9yKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICAgICAgdGhpcy5maWVsZCA9ICQodGhpcy5zZWxlY3Rvcik7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuZmllbGQuZGF0YSgnZ3Jhdi1jb2xvcnBpY2tlcicpKTtcbiAgICAgICAgdGhpcy5idWlsdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmF0dGFjaCgpO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudXBkYXRlKSB7XG4gICAgICAgICAgICB0aGlzLmZpZWxkLm9uKCdjaGFuZ2UuX2dyYXZfY29sb3JwaWNrZXInLCAoZXZlbnQsIGZpZWxkLCBoZXgsIG9wYWNpdHkpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgYmFja2dyb3VuZENvbG9yID0gaGV4O1xuICAgICAgICAgICAgICAgIGxldCByZ2IgPSBoZXgycmdiKGhleCk7XG5cbiAgICAgICAgICAgICAgICBpZiAob3BhY2l0eSA8IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yID0gJ3JnYmEoJyArIHJnYi5yICsgJywgJyArIHJnYi5nICsgJywgJyArIHJnYi5iICsgJywgJyArIG9wYWNpdHkgKyAnKSc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IHRhcmdldCA9IGZpZWxkLmNsb3Nlc3QodGhpcy5vcHRpb25zLnVwZGF0ZSk7XG4gICAgICAgICAgICAgICAgaWYgKCF0YXJnZXQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IGZpZWxkLnNpYmxpbmdzKHRoaXMub3B0aW9ucy51cGRhdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gZmllbGQucGFyZW50KCcuZy1jb2xvcnBpY2tlcicpLmZpbmQodGhpcy5vcHRpb25zLnVwZGF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGFyZ2V0LmNzcyh7IGJhY2tncm91bmRDb2xvciB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXR0YWNoKCkge1xuICAgICAgICBib2R5Lm9uKEZPQ1VTSU4sIHRoaXMuc2VsZWN0b3IsIChldmVudCkgPT4gdGhpcy5zaG93KGV2ZW50LCBldmVudC5jdXJyZW50VGFyZ2V0KSk7XG4gICAgICAgIGJvZHkub24oTU9VU0VET1dOLCB0aGlzLnNlbGVjdG9yICsgJyAuZy1jb2xvcnBpY2tlciwgJyArIHRoaXMuc2VsZWN0b3IgKyAnIC5nLWNvbG9ycGlja2VyIGknLCB0aGlzLmJvdW5kKCdpY29uQ2xpY2snKSk7XG4gICAgICAgIGJvZHkub24oJ2tleWRvd24nLCB0aGlzLnNlbGVjdG9yLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQua2V5Q29kZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgOTogLy8gdGFiXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDEzOiAvLyBlbnRlclxuICAgICAgICAgICAgICAgIGNhc2UgMjc6IC8vIGVzY1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuY3VycmVudFRhcmdldC5ibHVyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBvbiBrZXl1cFxuICAgICAgICBib2R5Lm9uKCdrZXl1cCcsIHRoaXMuc2VsZWN0b3IsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVGcm9tSW5wdXQodHJ1ZSwgZXZlbnQuY3VycmVudFRhcmdldCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVXBkYXRlIG9uIHBhc3RlXG4gICAgICAgIGJvZHkub24oJ3Bhc3RlJywgdGhpcy5zZWxlY3RvciwgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMudXBkYXRlRnJvbUlucHV0KHRydWUsIGV2ZW50LmN1cnJlbnRUYXJnZXQpLCAxKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2hvdyhldmVudCwgdGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldCA9ICQodGFyZ2V0KTtcblxuICAgICAgICBpZiAoIXRoaXMuYnVpbHQpIHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZWxlbWVudCA9IHRhcmdldDtcbiAgICAgICAgdGhpcy5yZXBvc2l0aW9uKCk7XG4gICAgICAgIHRoaXMud3JhcHBlci5hZGRDbGFzcygnY3AtdmlzaWJsZScpO1xuICAgICAgICB0aGlzLnVwZGF0ZUZyb21JbnB1dCgpO1xuXG4gICAgICAgIHRoaXMud3JhcHBlci5vbihNT1VTRURPV04sICcuY3AtZ3JpZCwgLmNwLXNsaWRlciwgLmNwLW9wYWNpdHktc2xpZGVyJywgdGhpcy5ib3VuZCgnYm9keURvd24nKSk7XG4gICAgICAgIGJvZHkub24oTU9VU0VNT1ZFLCB0aGlzLmJvdW5kKCdib2R5TW92ZScpKTtcbiAgICAgICAgYm9keS5vbihNT1VTRURPV04sIHRoaXMuYm91bmQoJ2JvZHlDbGljaycpKTtcbiAgICAgICAgYm9keS5vbihNT1VTRVVQLCB0aGlzLmJvdW5kKCd0YXJnZXRSZXNldCcpKTtcbiAgICAgICAgJCgnI2FkbWluLW1haW4gPiAuY29udGVudC13cmFwcGVyJykub24oJ3Njcm9sbCcsIHRoaXMuYm91bmQoJ3JlcG9zaXRpb24nKSk7XG4gICAgfVxuXG4gICAgaGlkZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmJ1aWx0KSB7IHJldHVybjsgfVxuICAgICAgICB0aGlzLndyYXBwZXIucmVtb3ZlQ2xhc3MoJ2NwLXZpc2libGUnKTtcblxuICAgICAgICB0aGlzLndyYXBwZXIudW5kZWxlZ2F0ZShNT1VTRURPV04sICcuY3AtZ3JpZCwgLmNwLXNsaWRlciwgLmNwLW9wYWNpdHktc2xpZGVyJywgdGhpcy5ib3VuZCgnYm9keURvd24nKSk7XG4gICAgICAgIGJvZHkub2ZmKE1PVVNFTU9WRSwgdGhpcy5ib3VuZCgnYm9keU1vdmUnKSk7XG4gICAgICAgIGJvZHkub2ZmKE1PVVNFRE9XTiwgdGhpcy5ib3VuZCgnYm9keUNsaWNrJykpO1xuICAgICAgICBib2R5Lm9mZihNT1VTRVVQLCB0aGlzLmJvdW5kKCd0YXJnZXRSZXNldCcpKTtcbiAgICAgICAgJCgnI2FkbWluLW1haW4gPiAuY29udGVudC13cmFwcGVyJykub24oJ3Njcm9sbCcsIHRoaXMuYm91bmQoJ3JlcG9zaXRpb24nKSk7XG4gICAgfVxuXG4gICAgYnVpbGQoKSB7XG4gICAgICAgIHRoaXMud3JhcHBlciA9ICQoJzxkaXYgY2xhc3M9XCJjcC13cmFwcGVyIGNwLXdpdGgtb3BhY2l0eSBjcC1tb2RlLWh1ZVwiIC8+Jyk7XG4gICAgICAgIHRoaXMuc2xpZGVyID0gJCgnPGRpdiBjbGFzcz1cImNwLXNsaWRlciBjcC1zcHJpdGVcIiAvPicpLmFwcGVuZFRvKHRoaXMud3JhcHBlcikuYXBwZW5kKCQoJzxkaXYgY2xhc3M9XCJjcC1waWNrZXJcIiAvPicpKTtcbiAgICAgICAgdGhpcy5vcGFjaXR5U2xpZGVyID0gJCgnPGRpdiBjbGFzcz1cImNwLW9wYWNpdHktc2xpZGVyIGNwLXNwcml0ZVwiIC8+JykuYXBwZW5kVG8odGhpcy53cmFwcGVyKS5hcHBlbmQoJCgnPGRpdiBjbGFzcz1cImNwLXBpY2tlclwiIC8+JykpO1xuICAgICAgICB0aGlzLmdyaWQgPSAkKCc8ZGl2IGNsYXNzPVwiY3AtZ3JpZCBjcC1zcHJpdGVcIiAvPicpLmFwcGVuZFRvKHRoaXMud3JhcHBlcikuYXBwZW5kKCQoJzxkaXYgY2xhc3M9XCJjcC1ncmlkLWlubmVyXCIgLz4nKSkuYXBwZW5kKCQoJzxkaXYgY2xhc3M9XCJjcC1waWNrZXJcIiAvPicpKTtcblxuICAgICAgICAkKCc8ZGl2IC8+JykuYXBwZW5kVG8odGhpcy5ncmlkLmZpbmQoJy5jcC1waWNrZXInKSk7XG5cbiAgICAgICAgbGV0IHRhYnMgPSAkKCc8ZGl2IGNsYXNzPVwiY3AtdGFic1wiIC8+JykuYXBwZW5kVG8odGhpcy53cmFwcGVyKTtcbiAgICAgICAgdGhpcy50YWJzID0ge1xuICAgICAgICAgICAgaHVlOiAkKCc8ZGl2IGNsYXNzPVwiY3AtdGFiLWh1ZSBhY3RpdmVcIiAvPicpLnRleHQoJ0hVRScpLmFwcGVuZFRvKHRhYnMpLFxuICAgICAgICAgICAgYnJpZ2h0bmVzczogJCgnPGRpdiBjbGFzcz1cImNwLXRhYi1icmlnaHRuZXNzXCIgLz4nKS50ZXh0KCdCUkknKS5hcHBlbmRUbyh0YWJzKSxcbiAgICAgICAgICAgIHNhdHVyYXRpb246ICQoJzxkaXYgY2xhc3M9XCJjcC10YWItc2F0dXJhdGlvblwiIC8+JykudGV4dCgnU0FUJykuYXBwZW5kVG8odGFicyksXG4gICAgICAgICAgICB3aGVlbDogJCgnPGRpdiBjbGFzcz1cImNwLXRhYi13aGVlbFwiIC8+JykudGV4dCgnV0hFRUwnKS5hcHBlbmRUbyh0YWJzKSxcbiAgICAgICAgICAgIHRyYW5zcGFyZW50OiAkKCc8ZGl2IGNsYXNzPVwiY3AtdGFiLXRyYW5zcFwiIC8+JykudGV4dCgnVFJBTlNQQVJFTlQnKS5hcHBlbmRUbyh0YWJzKVxuICAgICAgICB9O1xuXG4gICAgICAgIHRhYnMub24oTU9VU0VET1dOLCAnPiBkaXYnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGxldCBlbGVtZW50ID0gJChldmVudC5jdXJyZW50VGFyZ2V0KTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50LmlzKHRoaXMudGFicy50cmFuc3BhcmVudCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgc2xpZGVySGVpZ2h0ID0gdGhpcy5vcGFjaXR5U2xpZGVyLmhlaWdodCgpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5vcGFjaXR5ID0gMDtcbiAgICAgICAgICAgICAgICB0aGlzLm9wYWNpdHlTbGlkZXIuZmluZCgnLmNwLXBpY2tlcicpLmNzcyh7ICd0b3AnOiBjbGFtcChzbGlkZXJIZWlnaHQgLSAoc2xpZGVySGVpZ2h0ICogdGhpcy5vcGFjaXR5KSwgMCwgc2xpZGVySGVpZ2h0KSB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLm1vdmUodGhpcy5vcGFjaXR5U2xpZGVyLCB7IG1hbnVhbE9wYWNpdHk6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgYWN0aXZlID0gdGFicy5maW5kKCcuYWN0aXZlJyk7XG4gICAgICAgICAgICBsZXQgbW9kZSA9IGFjdGl2ZS5hdHRyKCdjbGFzcycpLnJlcGxhY2UoL1xcc3xhY3RpdmV8Y3AtdGFiLS9nLCAnJyk7XG4gICAgICAgICAgICBsZXQgbmV3TW9kZSA9IGVsZW1lbnQuYXR0cignY2xhc3MnKS5yZXBsYWNlKC9cXHN8YWN0aXZlfGNwLXRhYi0vZywgJycpO1xuXG4gICAgICAgICAgICB0aGlzLndyYXBwZXIucmVtb3ZlQ2xhc3MoJ2NwLW1vZGUtJyArIG1vZGUpLmFkZENsYXNzKCdjcC1tb2RlLScgKyBuZXdNb2RlKTtcbiAgICAgICAgICAgIGFjdGl2ZS5yZW1vdmVDbGFzcygnYWN0aXZlJyk7XG4gICAgICAgICAgICBlbGVtZW50LmFkZENsYXNzKCdhY3RpdmUnKTtcblxuICAgICAgICAgICAgdGhpcy5tb2RlID0gbmV3TW9kZTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRnJvbUlucHV0KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMud3JhcHBlci5hcHBlbmRUbygnLmNvbnRlbnQtd3JhcHBlcicpO1xuXG4gICAgICAgIHRoaXMuYnVpbHQgPSB0cnVlO1xuICAgICAgICB0aGlzLm1vZGUgPSAnaHVlJztcbiAgICB9XG5cbiAgICByZXBvc2l0aW9uKCkge1xuICAgICAgICBsZXQgY3QgPSAkKCcuY29udGVudC13cmFwcGVyJylbMF07XG4gICAgICAgIGxldCBvZmZzZXQgPSB0aGlzLmVsZW1lbnRbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGxldCBjdE9mZnNldCA9IGN0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBsZXQgZGVsdGEgPSB7IHg6IDAsIHk6IDAgfTtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLm9mZnNldCkge1xuICAgICAgICAgICAgZGVsdGEueCA9IHRoaXMub3B0aW9ucy5vZmZzZXQueCB8fCAwO1xuICAgICAgICAgICAgZGVsdGEueSA9IHRoaXMub3B0aW9ucy5vZmZzZXQueSB8fCAwO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy53cmFwcGVyLmNzcyh7XG4gICAgICAgICAgICB0b3A6IG9mZnNldC50b3AgKyBvZmZzZXQuaGVpZ2h0ICsgY3Quc2Nyb2xsVG9wIC0gY3RPZmZzZXQudG9wICsgZGVsdGEueSxcbiAgICAgICAgICAgIGxlZnQ6IG9mZnNldC5sZWZ0ICsgY3Quc2Nyb2xsTGVmdCAtIGN0T2Zmc2V0LmxlZnQgKyBkZWx0YS54XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGljb25DbGljayhldmVudCkge1xuICAgICAgICBpZiAodGhpcy53cmFwcGVyICYmIHRoaXMud3JhcHBlci5oYXNDbGFzcygnY3AtdmlzaWJsZScpKSB7IHJldHVybiB0cnVlOyB9XG5cbiAgICAgICAgZXZlbnQgJiYgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBsZXQgaW5wdXQgPSAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpLmZpbmQoJ2lucHV0Jyk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gaW5wdXQuZm9jdXMoKSwgNTApO1xuICAgIH1cblxuICAgIGJvZHlNb3ZlKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50ICYmIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgaWYgKHRoaXMudGFyZ2V0KSB7IHRoaXMubW92ZSh0aGlzLnRhcmdldCwgZXZlbnQpOyB9XG4gICAgfVxuXG4gICAgYm9keUNsaWNrKGV2ZW50KSB7XG4gICAgICAgIGxldCB0YXJnZXQgPSAkKGV2ZW50LnRhcmdldCk7XG5cbiAgICAgICAgaWYgKCF0YXJnZXQuY2xvc2VzdCgnLmNwLXdyYXBwZXInKS5sZW5ndGggJiYgIXRhcmdldC5pcyh0aGlzLnNlbGVjdG9yKSkge1xuICAgICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBib2R5RG93bihldmVudCkge1xuICAgICAgICBldmVudCAmJiBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIHRoaXMudGFyZ2V0ID0gJChldmVudC5jdXJyZW50VGFyZ2V0KTtcbiAgICAgICAgdGhpcy5tb3ZlKHRoaXMudGFyZ2V0LCBldmVudCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgdGFyZ2V0UmVzZXQoZXZlbnQpIHtcbiAgICAgICAgZXZlbnQgJiYgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICB0aGlzLnRhcmdldCA9IG51bGw7XG4gICAgfVxuXG4gICAgbW92ZSh0YXJnZXQsIGV2ZW50KSB7XG4gICAgICAgIGxldCBpbnB1dCA9IHRoaXMuZWxlbWVudDtcbiAgICAgICAgbGV0IHBpY2tlciA9IHRhcmdldC5maW5kKCcuY3AtcGlja2VyJyk7XG4gICAgICAgIGxldCBjbGllbnRSZWN0ID0gdGFyZ2V0WzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBsZXQgb2Zmc2V0WCA9IGNsaWVudFJlY3QubGVmdCArIHdpbmRvdy5zY3JvbGxYO1xuICAgICAgICBsZXQgb2Zmc2V0WSA9IGNsaWVudFJlY3QudG9wICsgd2luZG93LnNjcm9sbFk7XG4gICAgICAgIGxldCB4ID0gTWF0aC5yb3VuZCgoZXZlbnQgPyBldmVudC5wYWdlWCA6IDApIC0gb2Zmc2V0WCk7XG4gICAgICAgIGxldCB5ID0gTWF0aC5yb3VuZCgoZXZlbnQgPyBldmVudC5wYWdlWSA6IDApIC0gb2Zmc2V0WSk7XG4gICAgICAgIGxldCB3eDtcbiAgICAgICAgbGV0IHd5O1xuICAgICAgICBsZXQgcjtcbiAgICAgICAgbGV0IHBoaTtcblxuICAgICAgICAvLyBUb3VjaCBzdXBwb3J0XG4gICAgICAgIGxldCB0b3VjaEV2ZW50cyA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzIHx8IChldmVudC5vcmlnaW5hbEV2ZW50ICYmIGV2ZW50Lm9yaWdpbmFsRXZlbnQuY2hhbmdlZFRvdWNoZXMpO1xuICAgICAgICBpZiAoZXZlbnQgJiYgdG91Y2hFdmVudHMpIHtcbiAgICAgICAgICAgIHggPSAodG91Y2hFdmVudHMgPyB0b3VjaEV2ZW50c1swXS5wYWdlWCA6IDApIC0gb2Zmc2V0WDtcbiAgICAgICAgICAgIHkgPSAodG91Y2hFdmVudHMgPyB0b3VjaEV2ZW50c1swXS5wYWdlWSA6IDApIC0gb2Zmc2V0WTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudCAmJiBldmVudC5tYW51YWxPcGFjaXR5KSB7XG4gICAgICAgICAgICB5ID0gY2xpZW50UmVjdC5oZWlnaHQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb25zdHJhaW4gcGlja2VyIHRvIGl0cyBjb250YWluZXJcbiAgICAgICAgaWYgKHggPCAwKSB4ID0gMDtcbiAgICAgICAgaWYgKHkgPCAwKSB5ID0gMDtcbiAgICAgICAgaWYgKHggPiBjbGllbnRSZWN0LndpZHRoKSB4ID0gY2xpZW50UmVjdC53aWR0aDtcbiAgICAgICAgaWYgKHkgPiBjbGllbnRSZWN0LmhlaWdodCkgeSA9IGNsaWVudFJlY3QuaGVpZ2h0O1xuXG4gICAgICAgIC8vIENvbnN0cmFpbiBjb2xvciB3aGVlbCB2YWx1ZXMgdG8gdGhlIHdoZWVsXG4gICAgICAgIGlmICh0YXJnZXQucGFyZW50KCcuY3AtbW9kZS13aGVlbCcpLmxlbmd0aCAmJiBwaWNrZXIucGFyZW50KCcuY3AtZ3JpZCcpLmxlbmd0aCkge1xuICAgICAgICAgICAgd3ggPSA3NSAtIHg7XG4gICAgICAgICAgICB3eSA9IDc1IC0geTtcbiAgICAgICAgICAgIHIgPSBNYXRoLnNxcnQod3ggKiB3eCArIHd5ICogd3kpO1xuICAgICAgICAgICAgcGhpID0gTWF0aC5hdGFuMih3eSwgd3gpO1xuXG4gICAgICAgICAgICBpZiAocGhpIDwgMCkgcGhpICs9IE1hdGguUEkgKiAyO1xuICAgICAgICAgICAgaWYgKHIgPiA3NSkge1xuICAgICAgICAgICAgICAgIHggPSA3NSAtICg3NSAqIE1hdGguY29zKHBoaSkpO1xuICAgICAgICAgICAgICAgIHkgPSA3NSAtICg3NSAqIE1hdGguc2luKHBoaSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB4ID0gTWF0aC5yb3VuZCh4KTtcbiAgICAgICAgICAgIHkgPSBNYXRoLnJvdW5kKHkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTW92ZSB0aGUgcGlja2VyXG4gICAgICAgIGlmICh0YXJnZXQuaGFzQ2xhc3MoJ2NwLWdyaWQnKSkge1xuICAgICAgICAgICAgcGlja2VyLmNzcyh7XG4gICAgICAgICAgICAgICAgdG9wOiB5LFxuICAgICAgICAgICAgICAgIGxlZnQ6IHhcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUZyb21QaWNrZXIoaW5wdXQsIHRhcmdldCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwaWNrZXIuY3NzKHtcbiAgICAgICAgICAgICAgICB0b3A6IHlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVGcm9tUGlja2VyKGlucHV0LCB0YXJnZXQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlRnJvbUlucHV0KGRvbnRGaXJlRXZlbnQsIGVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQgPyAkKGVsZW1lbnQpIDogdGhpcy5lbGVtZW50O1xuICAgICAgICBsZXQgdmFsdWUgPSBlbGVtZW50LnZhbCgpO1xuICAgICAgICBsZXQgb3BhY2l0eSA9IHZhbHVlLnJlcGxhY2UoL1xccy9nLCAnJykubWF0Y2goL15yZ2JhP1xcKFswLTldezEsM30sWzAtOV17MSwzfSxbMC05XXsxLDN9LCguKylcXCkvKTtcbiAgICAgICAgbGV0IGhleDtcbiAgICAgICAgbGV0IGhzYjtcblxuICAgICAgICB2YWx1ZSA9IHJnYnN0cjJoZXgodmFsdWUpIHx8IHZhbHVlO1xuICAgICAgICBvcGFjaXR5ID0gb3BhY2l0eSA/IGNsYW1wKG9wYWNpdHlbMV0sIDAsIDEpIDogMTtcblxuICAgICAgICBpZiAoIShoZXggPSBwYXJzZUhleCh2YWx1ZSkpKSB7IGhleCA9ICcjZmZmZmZmJzsgfVxuICAgICAgICBoc2IgPSBoZXgyaHNiKGhleCk7XG5cbiAgICAgICAgaWYgKHRoaXMuYnVpbHQpIHtcbiAgICAgICAgICAgIC8vIG9wYWNpdHlcbiAgICAgICAgICAgIHRoaXMub3BhY2l0eSA9IG9wYWNpdHk7XG4gICAgICAgICAgICB2YXIgc2xpZGVySGVpZ2h0ID0gdGhpcy5vcGFjaXR5U2xpZGVyLmhlaWdodCgpO1xuICAgICAgICAgICAgdGhpcy5vcGFjaXR5U2xpZGVyLmZpbmQoJy5jcC1waWNrZXInKS5jc3MoeyAndG9wJzogY2xhbXAoc2xpZGVySGVpZ2h0IC0gKHNsaWRlckhlaWdodCAqIHRoaXMub3BhY2l0eSksIDAsIHNsaWRlckhlaWdodCkgfSk7XG5cbiAgICAgICAgICAgIC8vIGJnIGNvbG9yXG4gICAgICAgICAgICBsZXQgZ3JpZEhlaWdodCA9IHRoaXMuZ3JpZC5oZWlnaHQoKTtcbiAgICAgICAgICAgIGxldCBncmlkV2lkdGggPSB0aGlzLmdyaWQud2lkdGgoKTtcbiAgICAgICAgICAgIGxldCByO1xuICAgICAgICAgICAgbGV0IHBoaTtcbiAgICAgICAgICAgIGxldCB4O1xuICAgICAgICAgICAgbGV0IHk7XG5cbiAgICAgICAgICAgIHNsaWRlckhlaWdodCA9IHRoaXMuc2xpZGVyLmhlaWdodCgpO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMubW9kZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3doZWVsJzpcbiAgICAgICAgICAgICAgICAgICAgLy8gU2V0IGdyaWQgcG9zaXRpb25cbiAgICAgICAgICAgICAgICAgICAgciA9IGNsYW1wKE1hdGguY2VpbChoc2IucyAqIDAuNzUpLCAwLCBncmlkSGVpZ2h0IC8gMik7XG4gICAgICAgICAgICAgICAgICAgIHBoaSA9IGhzYi5oICogTWF0aC5QSSAvIDE4MDtcbiAgICAgICAgICAgICAgICAgICAgeCA9IGNsYW1wKDc1IC0gTWF0aC5jb3MocGhpKSAqIHIsIDAsIGdyaWRXaWR0aCk7XG4gICAgICAgICAgICAgICAgICAgIHkgPSBjbGFtcCg3NSAtIE1hdGguc2luKHBoaSkgKiByLCAwLCBncmlkSGVpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncmlkLmNzcyh7IGJhY2tncm91bmRDb2xvcjogJ3RyYW5zcGFyZW50JyB9KS5maW5kKCcuY3AtcGlja2VyJykuY3NzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogeSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IHhcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHNsaWRlciBwb3NpdGlvblxuICAgICAgICAgICAgICAgICAgICB5ID0gMTUwIC0gKGhzYi5iIC8gKDEwMCAvIGdyaWRIZWlnaHQpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhleCA9PT0gJycpIHkgPSAwO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNsaWRlci5maW5kKCcuY3AtcGlja2VyJykuY3NzKHsgdG9wOiB5IH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBwYW5lbCBjb2xvclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNsaWRlci5jc3Moe1xuICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBoc2IyaGV4KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoOiBoc2IuaCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzOiBoc2IucyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiOiAxMDBcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ3NhdHVyYXRpb24nOlxuICAgICAgICAgICAgICAgICAgICAvLyBTZXQgZ3JpZCBwb3NpdGlvblxuICAgICAgICAgICAgICAgICAgICB4ID0gY2xhbXAoKDUgKiBoc2IuaCkgLyAxMiwgMCwgMTUwKTtcbiAgICAgICAgICAgICAgICAgICAgeSA9IGNsYW1wKGdyaWRIZWlnaHQgLSBNYXRoLmNlaWwoaHNiLmIgLyAoMTAwIC8gZ3JpZEhlaWdodCkpLCAwLCBncmlkSGVpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncmlkLmZpbmQoJy5jcC1waWNrZXInKS5jc3Moe1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiB5LFxuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogeFxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBTZXQgc2xpZGVyIHBvc2l0aW9uXG4gICAgICAgICAgICAgICAgICAgIHkgPSBjbGFtcChzbGlkZXJIZWlnaHQgLSAoaHNiLnMgKiAoc2xpZGVySGVpZ2h0IC8gMTAwKSksIDAsIHNsaWRlckhlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2xpZGVyLmZpbmQoJy5jcC1waWNrZXInKS5jc3MoeyB0b3A6IHkgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIFVJXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2xpZGVyLmNzcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGhzYjJoZXgoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGg6IGhzYi5oLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHM6IDEwMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiOiBoc2IuYlxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JpZC5maW5kKCcuY3AtZ3JpZC1pbm5lcicpLmNzcyh7IG9wYWNpdHk6IGhzYi5zIC8gMTAwIH0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ2JyaWdodG5lc3MnOlxuICAgICAgICAgICAgICAgICAgICAvLyBTZXQgZ3JpZCBwb3NpdGlvblxuICAgICAgICAgICAgICAgICAgICB4ID0gY2xhbXAoKDUgKiBoc2IuaCkgLyAxMiwgMCwgMTUwKTtcbiAgICAgICAgICAgICAgICAgICAgeSA9IGNsYW1wKGdyaWRIZWlnaHQgLSBNYXRoLmNlaWwoaHNiLnMgLyAoMTAwIC8gZ3JpZEhlaWdodCkpLCAwLCBncmlkSGVpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncmlkLmZpbmQoJy5jcC1waWNrZXInKS5jc3Moe1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiB5LFxuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogeFxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBTZXQgc2xpZGVyIHBvc2l0aW9uXG4gICAgICAgICAgICAgICAgICAgIHkgPSBjbGFtcChzbGlkZXJIZWlnaHQgLSAoaHNiLmIgKiAoc2xpZGVySGVpZ2h0IC8gMTAwKSksIDAsIHNsaWRlckhlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2xpZGVyLmZpbmQoJy5jcC1waWNrZXInKS5jc3MoeyB0b3A6IHkgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIFVJXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2xpZGVyLmNzcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGhzYjJoZXgoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGg6IGhzYi5oLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHM6IGhzYi5zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGI6IDEwMFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JpZC5maW5kKCcuY3AtZ3JpZC1pbm5lcicpLmNzcyh7IG9wYWNpdHk6IDEgLSAoaHNiLmIgLyAxMDApIH0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdodWUnOlxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIC8vIFNldCBncmlkIHBvc2l0aW9uXG4gICAgICAgICAgICAgICAgICAgIHggPSBjbGFtcChNYXRoLmNlaWwoaHNiLnMgLyAoMTAwIC8gZ3JpZFdpZHRoKSksIDAsIGdyaWRXaWR0aCk7XG4gICAgICAgICAgICAgICAgICAgIHkgPSBjbGFtcChncmlkSGVpZ2h0IC0gTWF0aC5jZWlsKGhzYi5iIC8gKDEwMCAvIGdyaWRIZWlnaHQpKSwgMCwgZ3JpZEhlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JpZC5maW5kKCcuY3AtcGlja2VyJykuY3NzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogeSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IHhcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHNsaWRlciBwb3NpdGlvblxuICAgICAgICAgICAgICAgICAgICB5ID0gY2xhbXAoc2xpZGVySGVpZ2h0IC0gKGhzYi5oIC8gKDM2MCAvIHNsaWRlckhlaWdodCkpLCAwLCBzbGlkZXJIZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNsaWRlci5maW5kKCcuY3AtcGlja2VyJykuY3NzKHsgdG9wOiB5IH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBwYW5lbCBjb2xvclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyaWQuY3NzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogaHNiMmhleCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaDogaHNiLmgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgczogMTAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGI6IDEwMFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkb250RmlyZUV2ZW50KSB7IGVsZW1lbnQudmFsKHRoaXMuZ2V0VmFsdWUoaGV4KSk7IH1cblxuICAgICAgICAodGhpcy5lbGVtZW50IHx8IGVsZW1lbnQpLnRyaWdnZXIoJ2NoYW5nZS5fZ3Jhdl9jb2xvcnBpY2tlcicsIFtlbGVtZW50LCBoZXgsIG9wYWNpdHldKTtcblxuICAgIH1cblxuICAgIHVwZGF0ZUZyb21QaWNrZXIoaW5wdXQsIHRhcmdldCkge1xuICAgICAgICB2YXIgZ2V0Q29vcmRzID0gZnVuY3Rpb24ocGlja2VyLCBjb250YWluZXIpIHtcblxuICAgICAgICAgICAgdmFyIGxlZnQsIHRvcDtcbiAgICAgICAgICAgIGlmICghcGlja2VyLmxlbmd0aCB8fCAhY29udGFpbmVyKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGxlZnQgPSBwaWNrZXJbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdDtcbiAgICAgICAgICAgIHRvcCA9IHBpY2tlclswXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3A7XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgeDogbGVmdCAtIGNvbnRhaW5lclswXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0ICsgKHBpY2tlclswXS5vZmZzZXRXaWR0aCAvIDIpLFxuICAgICAgICAgICAgICAgIHk6IHRvcCAtIGNvbnRhaW5lclswXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyAocGlja2VyWzBdLm9mZnNldEhlaWdodCAvIDIpXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IGhleDtcbiAgICAgICAgbGV0IGh1ZTtcbiAgICAgICAgbGV0IHNhdHVyYXRpb247XG4gICAgICAgIGxldCBicmlnaHRuZXNzO1xuICAgICAgICBsZXQgeDtcbiAgICAgICAgbGV0IHk7XG4gICAgICAgIGxldCByO1xuICAgICAgICBsZXQgcGhpO1xuXG4gICAgICAgIC8vIFBhbmVsIG9iamVjdHNcbiAgICAgICAgbGV0IGdyaWQgPSB0aGlzLndyYXBwZXIuZmluZCgnLmNwLWdyaWQnKTtcbiAgICAgICAgbGV0IHNsaWRlciA9IHRoaXMud3JhcHBlci5maW5kKCcuY3Atc2xpZGVyJyk7XG4gICAgICAgIGxldCBvcGFjaXR5U2xpZGVyID0gdGhpcy53cmFwcGVyLmZpbmQoJy5jcC1vcGFjaXR5LXNsaWRlcicpO1xuXG4gICAgICAgIC8vIFBpY2tlciBvYmplY3RzXG4gICAgICAgIGxldCBncmlkUGlja2VyID0gZ3JpZC5maW5kKCcuY3AtcGlja2VyJyk7XG4gICAgICAgIGxldCBzbGlkZXJQaWNrZXIgPSBzbGlkZXIuZmluZCgnLmNwLXBpY2tlcicpO1xuICAgICAgICBsZXQgb3BhY2l0eVBpY2tlciA9IG9wYWNpdHlTbGlkZXIuZmluZCgnLmNwLXBpY2tlcicpO1xuXG4gICAgICAgIC8vIFBpY2tlciBwb3NpdGlvbnNcbiAgICAgICAgbGV0IGdyaWRQb3MgPSBnZXRDb29yZHMoZ3JpZFBpY2tlciwgZ3JpZCk7XG4gICAgICAgIGxldCBzbGlkZXJQb3MgPSBnZXRDb29yZHMoc2xpZGVyUGlja2VyLCBzbGlkZXIpO1xuICAgICAgICBsZXQgb3BhY2l0eVBvcyA9IGdldENvb3JkcyhvcGFjaXR5UGlja2VyLCBvcGFjaXR5U2xpZGVyKTtcblxuICAgICAgICAvLyBTaXplc1xuICAgICAgICBsZXQgZ3JpZFdpZHRoID0gZ3JpZFswXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICAgICAgbGV0IGdyaWRIZWlnaHQgPSBncmlkWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcbiAgICAgICAgbGV0IHNsaWRlckhlaWdodCA9IHNsaWRlclswXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG4gICAgICAgIGxldCBvcGFjaXR5U2xpZGVySGVpZ2h0ID0gb3BhY2l0eVNsaWRlclswXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG5cbiAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5lbGVtZW50LnZhbCgpO1xuICAgICAgICB2YWx1ZSA9IHJnYnN0cjJoZXgodmFsdWUpIHx8IHZhbHVlO1xuICAgICAgICBpZiAoIShoZXggPSBwYXJzZUhleCh2YWx1ZSkpKSB7IGhleCA9ICcjZmZmZmZmJzsgfVxuXG4gICAgICAgIC8vIEhhbmRsZSBjb2xvcnNcbiAgICAgICAgaWYgKHRhcmdldC5oYXNDbGFzcygnY3AtZ3JpZCcpIHx8IHRhcmdldC5oYXNDbGFzcygnY3Atc2xpZGVyJykpIHtcblxuICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIEhTQiB2YWx1ZXNcbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5tb2RlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnd2hlZWwnOlxuICAgICAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgaHVlLCBzYXR1cmF0aW9uLCBhbmQgYnJpZ2h0bmVzc1xuICAgICAgICAgICAgICAgICAgICB4ID0gKGdyaWRXaWR0aCAvIDIpIC0gZ3JpZFBvcy54O1xuICAgICAgICAgICAgICAgICAgICB5ID0gKGdyaWRIZWlnaHQgLyAyKSAtIGdyaWRQb3MueTtcbiAgICAgICAgICAgICAgICAgICAgciA9IE1hdGguc3FydCh4ICogeCArIHkgKiB5KTtcbiAgICAgICAgICAgICAgICAgICAgcGhpID0gTWF0aC5hdGFuMih5LCB4KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBoaSA8IDApIHBoaSArPSBNYXRoLlBJICogMjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHIgPiA3NSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgciA9IDc1O1xuICAgICAgICAgICAgICAgICAgICAgICAgZ3JpZFBvcy54ID0gNjkgLSAoNzUgKiBNYXRoLmNvcyhwaGkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyaWRQb3MueSA9IDY5IC0gKDc1ICogTWF0aC5zaW4ocGhpKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc2F0dXJhdGlvbiA9IGNsYW1wKHIgLyAwLjc1LCAwLCAxMDApO1xuICAgICAgICAgICAgICAgICAgICBodWUgPSBjbGFtcChwaGkgKiAxODAgLyBNYXRoLlBJLCAwLCAzNjApO1xuICAgICAgICAgICAgICAgICAgICBicmlnaHRuZXNzID0gY2xhbXAoMTAwIC0gTWF0aC5mbG9vcihzbGlkZXJQb3MueSAqICgxMDAgLyBzbGlkZXJIZWlnaHQpKSwgMCwgMTAwKTtcbiAgICAgICAgICAgICAgICAgICAgaGV4ID0gaHNiMmhleCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBoOiBodWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzOiBzYXR1cmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgYjogYnJpZ2h0bmVzc1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgVUlcbiAgICAgICAgICAgICAgICAgICAgc2xpZGVyLmNzcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGhzYjJoZXgoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGg6IGh1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzOiBzYXR1cmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGI6IDEwMFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAnc2F0dXJhdGlvbic6XG4gICAgICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBodWUsIHNhdHVyYXRpb24sIGFuZCBicmlnaHRuZXNzXG4gICAgICAgICAgICAgICAgICAgIGh1ZSA9IGNsYW1wKHBhcnNlSW50KGdyaWRQb3MueCAqICgzNjAgLyBncmlkV2lkdGgpLCAxMCksIDAsIDM2MCk7XG4gICAgICAgICAgICAgICAgICAgIHNhdHVyYXRpb24gPSBjbGFtcCgxMDAgLSBNYXRoLmZsb29yKHNsaWRlclBvcy55ICogKDEwMCAvIHNsaWRlckhlaWdodCkpLCAwLCAxMDApO1xuICAgICAgICAgICAgICAgICAgICBicmlnaHRuZXNzID0gY2xhbXAoMTAwIC0gTWF0aC5mbG9vcihncmlkUG9zLnkgKiAoMTAwIC8gZ3JpZEhlaWdodCkpLCAwLCAxMDApO1xuICAgICAgICAgICAgICAgICAgICBoZXggPSBoc2IyaGV4KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGg6IGh1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHM6IHNhdHVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBiOiBicmlnaHRuZXNzXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBVSVxuICAgICAgICAgICAgICAgICAgICBzbGlkZXIuY3NzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogaHNiMmhleCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaDogaHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHM6IDEwMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiOiBicmlnaHRuZXNzXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgZ3JpZC5maW5kKCcuY3AtZ3JpZC1pbm5lcicpLmNzcyh7IG9wYWNpdHk6IHNhdHVyYXRpb24gLyAxMDAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAnYnJpZ2h0bmVzcyc6XG4gICAgICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBodWUsIHNhdHVyYXRpb24sIGFuZCBicmlnaHRuZXNzXG4gICAgICAgICAgICAgICAgICAgIGh1ZSA9IGNsYW1wKHBhcnNlSW50KGdyaWRQb3MueCAqICgzNjAgLyBncmlkV2lkdGgpLCAxMCksIDAsIDM2MCk7XG4gICAgICAgICAgICAgICAgICAgIHNhdHVyYXRpb24gPSBjbGFtcCgxMDAgLSBNYXRoLmZsb29yKGdyaWRQb3MueSAqICgxMDAgLyBncmlkSGVpZ2h0KSksIDAsIDEwMCk7XG4gICAgICAgICAgICAgICAgICAgIGJyaWdodG5lc3MgPSBjbGFtcCgxMDAgLSBNYXRoLmZsb29yKHNsaWRlclBvcy55ICogKDEwMCAvIHNsaWRlckhlaWdodCkpLCAwLCAxMDApO1xuICAgICAgICAgICAgICAgICAgICBoZXggPSBoc2IyaGV4KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGg6IGh1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHM6IHNhdHVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBiOiBicmlnaHRuZXNzXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBVSVxuICAgICAgICAgICAgICAgICAgICBzbGlkZXIuY3NzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogaHNiMmhleCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaDogaHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHM6IHNhdHVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYjogMTAwXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgZ3JpZC5maW5kKCcuY3AtZ3JpZC1pbm5lcicpLmNzcyh7IG9wYWNpdHk6IDEgLSAoYnJpZ2h0bmVzcyAvIDEwMCkgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGh1ZSwgc2F0dXJhdGlvbiwgYW5kIGJyaWdodG5lc3NcbiAgICAgICAgICAgICAgICAgICAgaHVlID0gY2xhbXAoMzYwIC0gcGFyc2VJbnQoc2xpZGVyUG9zLnkgKiAoMzYwIC8gc2xpZGVySGVpZ2h0KSwgMTApLCAwLCAzNjApO1xuICAgICAgICAgICAgICAgICAgICBzYXR1cmF0aW9uID0gY2xhbXAoTWF0aC5mbG9vcihncmlkUG9zLnggKiAoMTAwIC8gZ3JpZFdpZHRoKSksIDAsIDEwMCk7XG4gICAgICAgICAgICAgICAgICAgIGJyaWdodG5lc3MgPSBjbGFtcCgxMDAgLSBNYXRoLmZsb29yKGdyaWRQb3MueSAqICgxMDAgLyBncmlkSGVpZ2h0KSksIDAsIDEwMCk7XG4gICAgICAgICAgICAgICAgICAgIGhleCA9IGhzYjJoZXgoe1xuICAgICAgICAgICAgICAgICAgICAgICAgaDogaHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgczogc2F0dXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGI6IGJyaWdodG5lc3NcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIFVJXG4gICAgICAgICAgICAgICAgICAgIGdyaWQuY3NzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogaHNiMmhleCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaDogaHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHM6IDEwMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiOiAxMDBcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSGFuZGxlIG9wYWNpdHlcbiAgICAgICAgaWYgKHRhcmdldC5oYXNDbGFzcygnY3Atb3BhY2l0eS1zbGlkZXInKSkge1xuICAgICAgICAgICAgdGhpcy5vcGFjaXR5ID0gcGFyc2VGbG9hdCgxIC0gKG9wYWNpdHlQb3MueSAvIG9wYWNpdHlTbGlkZXJIZWlnaHQpKS50b0ZpeGVkKDIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRqdXN0IGNhc2VcbiAgICAgICAgaW5wdXQudmFsKHRoaXMuZ2V0VmFsdWUoaGV4KSk7XG5cbiAgICAgICAgLy8gSGFuZGxlIGNoYW5nZSBldmVudFxuICAgICAgICB0aGlzLmVsZW1lbnQudHJpZ2dlcignY2hhbmdlLl9ncmF2X2NvbG9ycGlja2VyJywgW3RoaXMuZWxlbWVudCwgaGV4LCB0aGlzLm9wYWNpdHldKTtcblxuICAgIH1cblxuICAgIGdldFZhbHVlKGhleCkge1xuICAgICAgICBpZiAodGhpcy5vcGFjaXR5ID09PSAxKSB7IHJldHVybiBoZXg7IH1cbiAgICAgICAgbGV0IHJnYiA9IGhleDJyZ2IoaGV4KTtcblxuICAgICAgICByZXR1cm4gJ3JnYmEoJyArIHJnYi5yICsgJywgJyArIHJnYi5nICsgJywgJyArIHJnYi5iICsgJywgJyArIHRoaXMub3BhY2l0eSArICcpJztcbiAgICB9XG5cbiAgICBib3VuZChuYW1lKSB7XG4gICAgICAgIGxldCBib3VuZCA9IHRoaXMuX2JvdW5kIHx8ICh0aGlzLl9ib3VuZCA9IHt9KTtcbiAgICAgICAgcmV0dXJuIGJvdW5kW25hbWVdIHx8IChib3VuZFtuYW1lXSA9IGJpbmQodGhpc1tuYW1lXSwgdGhpcykpO1xuICAgIH1cbn1cblxuZXhwb3J0IGxldCBJbnN0YW5jZSA9IG5ldyBDb2xvcnBpY2tlckZpZWxkKCdbZGF0YS1ncmF2LWNvbG9ycGlja2VyXScpO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./app/forms/fields/colorpicker.js\n"); /***/ }), /***/ "./app/forms/fields/cron.js": -/*!**********************************!* +/*!**********************************!*\ !*** ./app/forms/fields/cron.js ***! \**********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => /* binding */ CronField,\n/* harmony export */ \"Instance\": () => /* binding */ Instance\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils_cron_ui__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils/cron-ui */ \"./app/utils/cron-ui.js\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! grav-config */ \"grav-config\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(grav_config__WEBPACK_IMPORTED_MODULE_2__);\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\n\nvar CronField = /*#__PURE__*/function () {\n function CronField() {\n var _this = this;\n\n _classCallCheck(this, CronField);\n\n this.items = jquery__WEBPACK_IMPORTED_MODULE_0___default()();\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-grav-field=\"cron\"]').each(function (index, cron) {\n return _this.addCron(cron);\n });\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('body').on('mutation._grav', this._onAddedNodes.bind(this));\n }\n\n _createClass(CronField, [{\n key: \"addCron\",\n value: function addCron(cron) {\n cron = jquery__WEBPACK_IMPORTED_MODULE_0___default()(cron);\n this.items = this.items.add(cron);\n cron.find('.cron-selector').each(function (index, container) {\n container = jquery__WEBPACK_IMPORTED_MODULE_0___default()(container);\n var input = container.closest('[data-grav-field]').find('input');\n container.jqCron({\n numeric_zero_pad: true,\n enabled_minute: true,\n multiple_dom: true,\n multiple_month: true,\n multiple_mins: true,\n multiple_dow: true,\n multiple_time_hours: true,\n multiple_time_minutes: true,\n default_period: 'hour',\n default_value: input.val() || '* * * * *',\n no_reset_button: false,\n bind_to: input,\n bind_method: {\n set: function set($element, value) {\n $element.val(value);\n }\n },\n texts: {\n en: {\n empty: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE[\"CRON.EVERY\"],\n empty_minutes: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE[\"CRON.EVERY\"],\n empty_time_hours: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE[\"CRON.EVERY_HOUR\"],\n empty_time_minutes: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE[\"CRON.EVERY_MINUTE\"],\n empty_day_of_week: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE[\"CRON.EVERY_DAY_OF_WEEK\"],\n empty_day_of_month: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE[\"CRON.EVERY_DAY_OF_MONTH\"],\n empty_month: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE[\"CRON.EVERY_MONTH\"],\n name_minute: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE[\"NICETIME.MINUTE\"],\n name_hour: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE[\"NICETIME.HOUR\"],\n name_day: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE[\"NICETIME.DAY\"],\n name_week: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE[\"NICETIME.WEEK\"],\n name_month: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE[\"NICETIME.MONTH\"],\n name_year: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE[\"NICETIME.YEAR\"],\n text_period: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE[\"CRON.TEXT_PERIOD\"],\n text_mins: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE[\"CRON.TEXT_MINS\"],\n text_time: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE[\"CRON.TEXT_TIME\"],\n text_dow: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE[\"CRON.TEXT_DOW\"],\n text_month: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE[\"CRON.TEXT_MONTH\"],\n text_dom: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE[\"CRON.TEXT_DOM\"],\n error1: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE[\"CRON.ERROR1\"],\n error2: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE[\"CRON.ERROR2\"],\n error3: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE[\"CRON.ERROR3\"],\n error4: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE[\"CRON.ERROR4\"],\n weekdays: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE.DAYS_OF_THE_WEEK,\n months: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE.MONTHS_OF_THE_YEAR\n }\n }\n });\n });\n }\n }, {\n key: \"_onAddedNodes\",\n value: function _onAddedNodes(event, target\n /* , record, instance */\n ) {\n var _this2 = this;\n\n var crons = jquery__WEBPACK_IMPORTED_MODULE_0___default()(target).find('[data-grav-field=\"cron\"]');\n\n if (!crons.length) {\n return;\n }\n\n crons.each(function (index, list) {\n list = jquery__WEBPACK_IMPORTED_MODULE_0___default()(list);\n\n if (!~_this2.items.index(list)) {\n _this2.addCron(list);\n }\n });\n }\n }]);\n\n return CronField;\n}();\n\n\nvar Instance = new CronField();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL2Zvcm1zL2ZpZWxkcy9jcm9uLmpzP2M0NzgiXSwibmFtZXMiOlsiQ3JvbkZpZWxkIiwiaXRlbXMiLCIkIiwiZWFjaCIsImluZGV4IiwiY3JvbiIsImFkZENyb24iLCJvbiIsIl9vbkFkZGVkTm9kZXMiLCJiaW5kIiwiYWRkIiwiZmluZCIsImNvbnRhaW5lciIsImlucHV0IiwiY2xvc2VzdCIsImpxQ3JvbiIsIm51bWVyaWNfemVyb19wYWQiLCJlbmFibGVkX21pbnV0ZSIsIm11bHRpcGxlX2RvbSIsIm11bHRpcGxlX21vbnRoIiwibXVsdGlwbGVfbWlucyIsIm11bHRpcGxlX2RvdyIsIm11bHRpcGxlX3RpbWVfaG91cnMiLCJtdWx0aXBsZV90aW1lX21pbnV0ZXMiLCJkZWZhdWx0X3BlcmlvZCIsImRlZmF1bHRfdmFsdWUiLCJ2YWwiLCJub19yZXNldF9idXR0b24iLCJiaW5kX3RvIiwiYmluZF9tZXRob2QiLCJzZXQiLCIkZWxlbWVudCIsInZhbHVlIiwidGV4dHMiLCJlbiIsImVtcHR5IiwidHJhbnNsYXRpb25zIiwiZW1wdHlfbWludXRlcyIsImVtcHR5X3RpbWVfaG91cnMiLCJlbXB0eV90aW1lX21pbnV0ZXMiLCJlbXB0eV9kYXlfb2Zfd2VlayIsImVtcHR5X2RheV9vZl9tb250aCIsImVtcHR5X21vbnRoIiwibmFtZV9taW51dGUiLCJuYW1lX2hvdXIiLCJuYW1lX2RheSIsIm5hbWVfd2VlayIsIm5hbWVfbW9udGgiLCJuYW1lX3llYXIiLCJ0ZXh0X3BlcmlvZCIsInRleHRfbWlucyIsInRleHRfdGltZSIsInRleHRfZG93IiwidGV4dF9tb250aCIsInRleHRfZG9tIiwiZXJyb3IxIiwiZXJyb3IyIiwiZXJyb3IzIiwiZXJyb3I0Iiwid2Vla2RheXMiLCJtb250aHMiLCJldmVudCIsInRhcmdldCIsImNyb25zIiwibGVuZ3RoIiwibGlzdCIsIkluc3RhbmNlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7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TTtNQUEwQjtBQUFBOztBQUNqRCxVQUFJQyxLQUFLLEdBQUc3RCw2Q0FBQyxDQUFDNEQsTUFBRCxDQUFELENBQVVuRCxJQUFWLENBQWUsMEJBQWYsQ0FBWjs7QUFDQSxVQUFJLENBQUNvRCxLQUFLLENBQUNDLE1BQVgsRUFBbUI7QUFBRTtBQUFTOztBQUU5QkQsV0FBSyxDQUFDNUQsSUFBTixDQUFXLFVBQUNDLEtBQUQsRUFBUTZELElBQVIsRUFBaUI7QUFDeEJBLFlBQUksR0FBRy9ELDZDQUFDLENBQUMrRCxJQUFELENBQVI7O0FBQ0EsWUFBSSxDQUFDLENBQUMsTUFBSSxDQUFDaEUsS0FBTCxDQUFXRyxLQUFYLENBQWlCNkQsSUFBakIsQ0FBTixFQUE4QjtBQUMxQixnQkFBSSxDQUFDM0QsT0FBTCxDQUFhMkQsSUFBYjtBQUNIO0FBQ0osT0FMRDtBQU1IOzs7Ozs7O0FBR0UsSUFBSUMsUUFBUSxHQUFHLElBQUlsRSxTQUFKLEVBQWYiLCJmaWxlIjoiLi9hcHAvZm9ybXMvZmllbGRzL2Nyb24uanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0ICcuLi8uLi91dGlscy9jcm9uLXVpJztcbmltcG9ydCB7IHRyYW5zbGF0aW9ucyB9IGZyb20gJ2dyYXYtY29uZmlnJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ3JvbkZpZWxkIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5pdGVtcyA9ICQoKTtcblxuICAgICAgICAkKCdbZGF0YS1ncmF2LWZpZWxkPVwiY3JvblwiXScpLmVhY2goKGluZGV4LCBjcm9uKSA9PiB0aGlzLmFkZENyb24oY3JvbikpO1xuICAgICAgICAkKCdib2R5Jykub24oJ211dGF0aW9uLl9ncmF2JywgdGhpcy5fb25BZGRlZE5vZGVzLmJpbmQodGhpcykpO1xuICAgIH1cblxuICAgIGFkZENyb24oY3Jvbikge1xuICAgICAgICBjcm9uID0gJChjcm9uKTtcbiAgICAgICAgdGhpcy5pdGVtcyA9IHRoaXMuaXRlbXMuYWRkKGNyb24pO1xuXG4gICAgICAgIGNyb24uZmluZCgnLmNyb24tc2VsZWN0b3InKS5lYWNoKChpbmRleCwgY29udGFpbmVyKSA9PiB7XG4gICAgICAgICAgICBjb250YWluZXIgPSAkKGNvbnRhaW5lcik7XG4gICAgICAgICAgICBjb25zdCBpbnB1dCA9IGNvbnRhaW5lci5jbG9zZXN0KCdbZGF0YS1ncmF2LWZpZWxkXScpLmZpbmQoJ2lucHV0Jyk7XG5cbiAgICAgICAgICAgIGNvbnRhaW5lci5qcUNyb24oe1xuICAgICAgICAgICAgICAgIG51bWVyaWNfemVyb19wYWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgZW5hYmxlZF9taW51dGU6IHRydWUsXG4gICAgICAgICAgICAgICAgbXVsdGlwbGVfZG9tOiB0cnVlLFxuICAgICAgICAgICAgICAgIG11bHRpcGxlX21vbnRoOiB0cnVlLFxuICAgICAgICAgICAgICAgIG11bHRpcGxlX21pbnM6IHRydWUsXG4gICAgICAgICAgICAgICAgbXVsdGlwbGVfZG93OiB0cnVlLFxuICAgICAgICAgICAgICAgIG11bHRpcGxlX3RpbWVfaG91cnM6IHRydWUsXG4gICAgICAgICAgICAgICAgbXVsdGlwbGVfdGltZV9taW51dGVzOiB0cnVlLFxuICAgICAgICAgICAgICAgIGRlZmF1bHRfcGVyaW9kOiAnaG91cicsXG4gICAgICAgICAgICAgICAgZGVmYXVsdF92YWx1ZTogaW5wdXQudmFsKCkgfHwgJyogKiAqICogKicsXG4gICAgICAgICAgICAgICAgbm9fcmVzZXRfYnV0dG9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBiaW5kX3RvOiBpbnB1dCxcbiAgICAgICAgICAgICAgICBiaW5kX21ldGhvZDoge1xuICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uKCRlbGVtZW50LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgJGVsZW1lbnQudmFsKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdGV4dHM6IHtcbiAgICAgICAgICAgICAgICAgICAgZW46IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5OiB0cmFuc2xhdGlvbnMuR1JBVl9DT1JFWydDUk9OLkVWRVJZJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICBlbXB0eV9taW51dGVzOiB0cmFuc2xhdGlvbnMuR1JBVl9DT1JFWydDUk9OLkVWRVJZJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICBlbXB0eV90aW1lX2hvdXJzOiB0cmFuc2xhdGlvbnMuR1JBVl9DT1JFWydDUk9OLkVWRVJZX0hPVVInXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5X3RpbWVfbWludXRlczogdHJhbnNsYXRpb25zLkdSQVZfQ09SRVsnQ1JPTi5FVkVSWV9NSU5VVEUnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5X2RheV9vZl93ZWVrOiB0cmFuc2xhdGlvbnMuR1JBVl9DT1JFWydDUk9OLkVWRVJZX0RBWV9PRl9XRUVLJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICBlbXB0eV9kYXlfb2ZfbW9udGg6IHRyYW5zbGF0aW9ucy5HUkFWX0NPUkVbJ0NST04uRVZFUllfREFZX09GX01PTlRIJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICBlbXB0eV9tb250aDogdHJhbnNsYXRpb25zLkdSQVZfQ09SRVsnQ1JPTi5FVkVSWV9NT05USCddLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV9taW51dGU6IHRyYW5zbGF0aW9ucy5HUkFWX0NPUkVbJ05JQ0VUSU1FLk1JTlVURSddLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV9ob3VyOiB0cmFuc2xhdGlvbnMuR1JBVl9DT1JFWydOSUNFVElNRS5IT1VSJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lX2RheTogdHJhbnNsYXRpb25zLkdSQVZfQ09SRVsnTklDRVRJTUUuREFZJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lX3dlZWs6IHRyYW5zbGF0aW9ucy5HUkFWX0NPUkVbJ05JQ0VUSU1FLldFRUsnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfbW9udGg6IHRyYW5zbGF0aW9ucy5HUkFWX0NPUkVbJ05JQ0VUSU1FLk1PTlRIJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lX3llYXI6IHRyYW5zbGF0aW9ucy5HUkFWX0NPUkVbJ05JQ0VUSU1FLllFQVInXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfcGVyaW9kOiB0cmFuc2xhdGlvbnMuR1JBVl9DT1JFWydDUk9OLlRFWFRfUEVSSU9EJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X21pbnM6IHRyYW5zbGF0aW9ucy5HUkFWX0NPUkVbJ0NST04uVEVYVF9NSU5TJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3RpbWU6IHRyYW5zbGF0aW9ucy5HUkFWX0NPUkVbJ0NST04uVEVYVF9USU1FJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2RvdzogdHJhbnNsYXRpb25zLkdSQVZfQ09SRVsnQ1JPTi5URVhUX0RPVyddLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9tb250aDogdHJhbnNsYXRpb25zLkdSQVZfQ09SRVsnQ1JPTi5URVhUX01PTlRIJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2RvbTogdHJhbnNsYXRpb25zLkdSQVZfQ09SRVsnQ1JPTi5URVhUX0RPTSddLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IxOiB0cmFuc2xhdGlvbnMuR1JBVl9DT1JFWydDUk9OLkVSUk9SMSddLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IyOiB0cmFuc2xhdGlvbnMuR1JBVl9DT1JFWydDUk9OLkVSUk9SMiddLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IzOiB0cmFuc2xhdGlvbnMuR1JBVl9DT1JFWydDUk9OLkVSUk9SMyddLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I0OiB0cmFuc2xhdGlvbnMuR1JBVl9DT1JFWydDUk9OLkVSUk9SNCddLFxuICAgICAgICAgICAgICAgICAgICAgICAgd2Vla2RheXM6IHRyYW5zbGF0aW9ucy5HUkFWX0NPUkVbJ0RBWVNfT0ZfVEhFX1dFRUsnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoczogdHJhbnNsYXRpb25zLkdSQVZfQ09SRVsnTU9OVEhTX09GX1RIRV9ZRUFSJ11cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfb25BZGRlZE5vZGVzKGV2ZW50LCB0YXJnZXQvKiAsIHJlY29yZCwgaW5zdGFuY2UgKi8pIHtcbiAgICAgICAgbGV0IGNyb25zID0gJCh0YXJnZXQpLmZpbmQoJ1tkYXRhLWdyYXYtZmllbGQ9XCJjcm9uXCJdJyk7XG4gICAgICAgIGlmICghY3JvbnMubGVuZ3RoKSB7IHJldHVybjsgfVxuXG4gICAgICAgIGNyb25zLmVhY2goKGluZGV4LCBsaXN0KSA9PiB7XG4gICAgICAgICAgICBsaXN0ID0gJChsaXN0KTtcbiAgICAgICAgICAgIGlmICghfnRoaXMuaXRlbXMuaW5kZXgobGlzdCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZENyb24obGlzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuZXhwb3J0IGxldCBJbnN0YW5jZSA9IG5ldyBDcm9uRmllbGQoKTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./app/forms/fields/cron.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ CronField),\n/* harmony export */ \"Instance\": () => (/* binding */ Instance)\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils_cron_ui__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils/cron-ui */ \"./app/utils/cron-ui.js\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! grav-config */ \"grav-config\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(grav_config__WEBPACK_IMPORTED_MODULE_2__);\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\n\nvar CronField = /*#__PURE__*/function () {\n function CronField() {\n var _this = this;\n\n _classCallCheck(this, CronField);\n\n this.items = jquery__WEBPACK_IMPORTED_MODULE_0___default()();\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-grav-field=\"cron\"]').each(function (index, cron) {\n return _this.addCron(cron);\n });\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('body').on('mutation._grav', this._onAddedNodes.bind(this));\n }\n\n _createClass(CronField, [{\n key: \"addCron\",\n value: function addCron(cron) {\n cron = jquery__WEBPACK_IMPORTED_MODULE_0___default()(cron);\n this.items = this.items.add(cron);\n cron.find('.cron-selector').each(function (index, container) {\n container = jquery__WEBPACK_IMPORTED_MODULE_0___default()(container);\n var input = container.closest('[data-grav-field]').find('input');\n container.jqCron({\n numeric_zero_pad: true,\n enabled_minute: true,\n multiple_dom: true,\n multiple_month: true,\n multiple_mins: true,\n multiple_dow: true,\n multiple_time_hours: true,\n multiple_time_minutes: true,\n default_period: 'hour',\n default_value: input.val() || '* * * * *',\n no_reset_button: false,\n bind_to: input,\n bind_method: {\n set: function set($element, value) {\n $element.val(value);\n }\n },\n texts: {\n en: {\n empty: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE[\"CRON.EVERY\"],\n empty_minutes: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE[\"CRON.EVERY\"],\n empty_time_hours: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE[\"CRON.EVERY_HOUR\"],\n empty_time_minutes: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE[\"CRON.EVERY_MINUTE\"],\n empty_day_of_week: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE[\"CRON.EVERY_DAY_OF_WEEK\"],\n empty_day_of_month: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE[\"CRON.EVERY_DAY_OF_MONTH\"],\n empty_month: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE[\"CRON.EVERY_MONTH\"],\n name_minute: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE[\"NICETIME.MINUTE\"],\n name_hour: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE[\"NICETIME.HOUR\"],\n name_day: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE[\"NICETIME.DAY\"],\n name_week: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE[\"NICETIME.WEEK\"],\n name_month: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE[\"NICETIME.MONTH\"],\n name_year: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE[\"NICETIME.YEAR\"],\n text_period: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE[\"CRON.TEXT_PERIOD\"],\n text_mins: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE[\"CRON.TEXT_MINS\"],\n text_time: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE[\"CRON.TEXT_TIME\"],\n text_dow: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE[\"CRON.TEXT_DOW\"],\n text_month: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE[\"CRON.TEXT_MONTH\"],\n text_dom: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE[\"CRON.TEXT_DOM\"],\n error1: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE[\"CRON.ERROR1\"],\n error2: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE[\"CRON.ERROR2\"],\n error3: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE[\"CRON.ERROR3\"],\n error4: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE[\"CRON.ERROR4\"],\n weekdays: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE.DAYS_OF_THE_WEEK,\n months: grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.GRAV_CORE.MONTHS_OF_THE_YEAR\n }\n }\n });\n });\n }\n }, {\n key: \"_onAddedNodes\",\n value: function _onAddedNodes(event, target\n /* , record, instance */\n ) {\n var _this2 = this;\n\n var crons = jquery__WEBPACK_IMPORTED_MODULE_0___default()(target).find('[data-grav-field=\"cron\"]');\n\n if (!crons.length) {\n return;\n }\n\n crons.each(function (index, list) {\n list = jquery__WEBPACK_IMPORTED_MODULE_0___default()(list);\n\n if (!~_this2.items.index(list)) {\n _this2.addCron(list);\n }\n });\n }\n }]);\n\n return CronField;\n}();\n\n\nvar Instance = new CronField();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL2Zvcm1zL2ZpZWxkcy9jcm9uLmpzP2M0NzgiXSwibmFtZXMiOlsiQ3JvbkZpZWxkIiwiaXRlbXMiLCIkIiwiZWFjaCIsImluZGV4IiwiY3JvbiIsImFkZENyb24iLCJvbiIsIl9vbkFkZGVkTm9kZXMiLCJiaW5kIiwiYWRkIiwiZmluZCIsImNvbnRhaW5lciIsImlucHV0IiwiY2xvc2VzdCIsImpxQ3JvbiIsIm51bWVyaWNfemVyb19wYWQiLCJlbmFibGVkX21pbnV0ZSIsIm11bHRpcGxlX2RvbSIsIm11bHRpcGxlX21vbnRoIiwibXVsdGlwbGVfbWlucyIsIm11bHRpcGxlX2RvdyIsIm11bHRpcGxlX3RpbWVfaG91cnMiLCJtdWx0aXBsZV90aW1lX21pbnV0ZXMiLCJkZWZhdWx0X3BlcmlvZCIsImRlZmF1bHRfdmFsdWUiLCJ2YWwiLCJub19yZXNldF9idXR0b24iLCJiaW5kX3RvIiwiYmluZF9tZXRob2QiLCJzZXQiLCIkZWxlbWVudCIsInZhbHVlIiwidGV4dHMiLCJlbiIsImVtcHR5IiwidHJhbnNsYXRpb25zIiwiZW1wdHlfbWludXRlcyIsImVtcHR5X3RpbWVfaG91cnMiLCJlbXB0eV90aW1lX21pbnV0ZXMiLCJlbXB0eV9kYXlfb2Zfd2VlayIsImVtcHR5X2RheV9vZl9tb250aCIsImVtcHR5X21vbnRoIiwibmFtZV9taW51dGUiLCJuYW1lX2hvdXIiLCJuYW1lX2RheSIsIm5hbWVfd2VlayIsIm5hbWVfbW9udGgiLCJuYW1lX3llYXIiLCJ0ZXh0X3BlcmlvZCIsInRleHRfbWlucyIsInRleHRfdGltZSIsInRleHRfZG93IiwidGV4dF9tb250aCIsInRleHRfZG9tIiwiZXJyb3IxIiwiZXJyb3IyIiwiZXJyb3IzIiwiZXJyb3I0Iiwid2Vla2RheXMiLCJtb250aHMiLCJldmVudCIsInRhcmdldCIsImNyb25zIiwibGVuZ3RoIiwibGlzdCIsIkluc3RhbmNlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7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QixLQUFkLEVBQXFCQztBQUFNO0FBQTNCLE1BQXFEO0FBQUE7O0FBQ2pELFVBQUlDLEtBQUssR0FBRzdELDZDQUFDLENBQUM0RCxNQUFELENBQUQsQ0FBVW5ELElBQVYsQ0FBZSwwQkFBZixDQUFaOztBQUNBLFVBQUksQ0FBQ29ELEtBQUssQ0FBQ0MsTUFBWCxFQUFtQjtBQUFFO0FBQVM7O0FBRTlCRCxXQUFLLENBQUM1RCxJQUFOLENBQVcsVUFBQ0MsS0FBRCxFQUFRNkQsSUFBUixFQUFpQjtBQUN4QkEsWUFBSSxHQUFHL0QsNkNBQUMsQ0FBQytELElBQUQsQ0FBUjs7QUFDQSxZQUFJLENBQUMsQ0FBQyxNQUFJLENBQUNoRSxLQUFMLENBQVdHLEtBQVgsQ0FBaUI2RCxJQUFqQixDQUFOLEVBQThCO0FBQzFCLGdCQUFJLENBQUMzRCxPQUFMLENBQWEyRCxJQUFiO0FBQ0g7QUFDSixPQUxEO0FBTUg7Ozs7Ozs7QUFHRSxJQUFJQyxRQUFRLEdBQUcsSUFBSWxFLFNBQUosRUFBZiIsImZpbGUiOiIuL2FwcC9mb3Jtcy9maWVsZHMvY3Jvbi5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgJy4uLy4uL3V0aWxzL2Nyb24tdWknO1xuaW1wb3J0IHsgdHJhbnNsYXRpb25zIH0gZnJvbSAnZ3Jhdi1jb25maWcnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDcm9uRmllbGQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLml0ZW1zID0gJCgpO1xuXG4gICAgICAgICQoJ1tkYXRhLWdyYXYtZmllbGQ9XCJjcm9uXCJdJykuZWFjaCgoaW5kZXgsIGNyb24pID0+IHRoaXMuYWRkQ3Jvbihjcm9uKSk7XG4gICAgICAgICQoJ2JvZHknKS5vbignbXV0YXRpb24uX2dyYXYnLCB0aGlzLl9vbkFkZGVkTm9kZXMuYmluZCh0aGlzKSk7XG4gICAgfVxuXG4gICAgYWRkQ3Jvbihjcm9uKSB7XG4gICAgICAgIGNyb24gPSAkKGNyb24pO1xuICAgICAgICB0aGlzLml0ZW1zID0gdGhpcy5pdGVtcy5hZGQoY3Jvbik7XG5cbiAgICAgICAgY3Jvbi5maW5kKCcuY3Jvbi1zZWxlY3RvcicpLmVhY2goKGluZGV4LCBjb250YWluZXIpID0+IHtcbiAgICAgICAgICAgIGNvbnRhaW5lciA9ICQoY29udGFpbmVyKTtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0ID0gY29udGFpbmVyLmNsb3Nlc3QoJ1tkYXRhLWdyYXYtZmllbGRdJykuZmluZCgnaW5wdXQnKTtcblxuICAgICAgICAgICAgY29udGFpbmVyLmpxQ3Jvbih7XG4gICAgICAgICAgICAgICAgbnVtZXJpY196ZXJvX3BhZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBlbmFibGVkX21pbnV0ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBtdWx0aXBsZV9kb206IHRydWUsXG4gICAgICAgICAgICAgICAgbXVsdGlwbGVfbW9udGg6IHRydWUsXG4gICAgICAgICAgICAgICAgbXVsdGlwbGVfbWluczogdHJ1ZSxcbiAgICAgICAgICAgICAgICBtdWx0aXBsZV9kb3c6IHRydWUsXG4gICAgICAgICAgICAgICAgbXVsdGlwbGVfdGltZV9ob3VyczogdHJ1ZSxcbiAgICAgICAgICAgICAgICBtdWx0aXBsZV90aW1lX21pbnV0ZXM6IHRydWUsXG4gICAgICAgICAgICAgICAgZGVmYXVsdF9wZXJpb2Q6ICdob3VyJyxcbiAgICAgICAgICAgICAgICBkZWZhdWx0X3ZhbHVlOiBpbnB1dC52YWwoKSB8fCAnKiAqICogKiAqJyxcbiAgICAgICAgICAgICAgICBub19yZXNldF9idXR0b246IGZhbHNlLFxuICAgICAgICAgICAgICAgIGJpbmRfdG86IGlucHV0LFxuICAgICAgICAgICAgICAgIGJpbmRfbWV0aG9kOiB7XG4gICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24oJGVsZW1lbnQsIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkZWxlbWVudC52YWwodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB0ZXh0czoge1xuICAgICAgICAgICAgICAgICAgICBlbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHk6IHRyYW5zbGF0aW9ucy5HUkFWX0NPUkVbJ0NST04uRVZFUlknXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5X21pbnV0ZXM6IHRyYW5zbGF0aW9ucy5HUkFWX0NPUkVbJ0NST04uRVZFUlknXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5X3RpbWVfaG91cnM6IHRyYW5zbGF0aW9ucy5HUkFWX0NPUkVbJ0NST04uRVZFUllfSE9VUiddLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHlfdGltZV9taW51dGVzOiB0cmFuc2xhdGlvbnMuR1JBVl9DT1JFWydDUk9OLkVWRVJZX01JTlVURSddLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHlfZGF5X29mX3dlZWs6IHRyYW5zbGF0aW9ucy5HUkFWX0NPUkVbJ0NST04uRVZFUllfREFZX09GX1dFRUsnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5X2RheV9vZl9tb250aDogdHJhbnNsYXRpb25zLkdSQVZfQ09SRVsnQ1JPTi5FVkVSWV9EQVlfT0ZfTU9OVEgnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5X21vbnRoOiB0cmFuc2xhdGlvbnMuR1JBVl9DT1JFWydDUk9OLkVWRVJZX01PTlRIJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lX21pbnV0ZTogdHJhbnNsYXRpb25zLkdSQVZfQ09SRVsnTklDRVRJTUUuTUlOVVRFJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lX2hvdXI6IHRyYW5zbGF0aW9ucy5HUkFWX0NPUkVbJ05JQ0VUSU1FLkhPVVInXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfZGF5OiB0cmFuc2xhdGlvbnMuR1JBVl9DT1JFWydOSUNFVElNRS5EQVknXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfd2VlazogdHJhbnNsYXRpb25zLkdSQVZfQ09SRVsnTklDRVRJTUUuV0VFSyddLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV9tb250aDogdHJhbnNsYXRpb25zLkdSQVZfQ09SRVsnTklDRVRJTUUuTU9OVEgnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfeWVhcjogdHJhbnNsYXRpb25zLkdSQVZfQ09SRVsnTklDRVRJTUUuWUVBUiddLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9wZXJpb2Q6IHRyYW5zbGF0aW9ucy5HUkFWX0NPUkVbJ0NST04uVEVYVF9QRVJJT0QnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfbWluczogdHJhbnNsYXRpb25zLkdSQVZfQ09SRVsnQ1JPTi5URVhUX01JTlMnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfdGltZTogdHJhbnNsYXRpb25zLkdSQVZfQ09SRVsnQ1JPTi5URVhUX1RJTUUnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfZG93OiB0cmFuc2xhdGlvbnMuR1JBVl9DT1JFWydDUk9OLlRFWFRfRE9XJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X21vbnRoOiB0cmFuc2xhdGlvbnMuR1JBVl9DT1JFWydDUk9OLlRFWFRfTU9OVEgnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfZG9tOiB0cmFuc2xhdGlvbnMuR1JBVl9DT1JFWydDUk9OLlRFWFRfRE9NJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjE6IHRyYW5zbGF0aW9ucy5HUkFWX0NPUkVbJ0NST04uRVJST1IxJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjI6IHRyYW5zbGF0aW9ucy5HUkFWX0NPUkVbJ0NST04uRVJST1IyJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjM6IHRyYW5zbGF0aW9ucy5HUkFWX0NPUkVbJ0NST04uRVJST1IzJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjQ6IHRyYW5zbGF0aW9ucy5HUkFWX0NPUkVbJ0NST04uRVJST1I0J10sXG4gICAgICAgICAgICAgICAgICAgICAgICB3ZWVrZGF5czogdHJhbnNsYXRpb25zLkdSQVZfQ09SRVsnREFZU19PRl9USEVfV0VFSyddLFxuICAgICAgICAgICAgICAgICAgICAgICAgbW9udGhzOiB0cmFuc2xhdGlvbnMuR1JBVl9DT1JFWydNT05USFNfT0ZfVEhFX1lFQVInXVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9vbkFkZGVkTm9kZXMoZXZlbnQsIHRhcmdldC8qICwgcmVjb3JkLCBpbnN0YW5jZSAqLykge1xuICAgICAgICBsZXQgY3JvbnMgPSAkKHRhcmdldCkuZmluZCgnW2RhdGEtZ3Jhdi1maWVsZD1cImNyb25cIl0nKTtcbiAgICAgICAgaWYgKCFjcm9ucy5sZW5ndGgpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgY3JvbnMuZWFjaCgoaW5kZXgsIGxpc3QpID0+IHtcbiAgICAgICAgICAgIGxpc3QgPSAkKGxpc3QpO1xuICAgICAgICAgICAgaWYgKCF+dGhpcy5pdGVtcy5pbmRleChsaXN0KSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkQ3JvbihsaXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5leHBvcnQgbGV0IEluc3RhbmNlID0gbmV3IENyb25GaWVsZCgpO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./app/forms/fields/cron.js\n"); /***/ }), /***/ "./app/forms/fields/datetime.js": -/*!**************************************!* +/*!**************************************!*\ !*** ./app/forms/fields/datetime.js ***! \**************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => /* binding */ DateTimeField,\n/* harmony export */ \"Instance\": () => /* binding */ Instance\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! grav-config */ \"grav-config\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(grav_config__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _utils_bootstrap_datetimepicker__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/bootstrap-datetimepicker */ \"./app/utils/bootstrap-datetimepicker.js\");\n/* harmony import */ var _utils_bootstrap_datetimepicker__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_utils_bootstrap_datetimepicker__WEBPACK_IMPORTED_MODULE_2__);\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\n\nvar DateTimeField = /*#__PURE__*/function () {\n _createClass(DateTimeField, [{\n key: \"defaults\",\n get: function get() {\n return {\n showTodayButton: true,\n showClear: true,\n locale: grav_config__WEBPACK_IMPORTED_MODULE_1__.config.language || 'en',\n icons: {\n time: 'fa fa-clock-o',\n date: 'fa fa-calendar-o',\n up: 'fa fa-chevron-up',\n down: 'fa fa-chevron-down',\n previous: 'fa fa-chevron-left',\n next: 'fa fa-chevron-right',\n today: 'fa fa-bullseye',\n clear: 'fa fa-trash-o',\n close: 'fa fa-remove'\n }\n };\n }\n }]);\n\n function DateTimeField(options) {\n var _this = this;\n\n _classCallCheck(this, DateTimeField);\n\n this.items = jquery__WEBPACK_IMPORTED_MODULE_0___default()();\n this.options = Object.assign({}, this.defaults, options);\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-grav-datetime]').each(function (index, field) {\n return _this.addItem(field);\n });\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('body').on('mutation._grav', this._onAddedNodes.bind(this));\n }\n\n _createClass(DateTimeField, [{\n key: \"addItem\",\n value: function addItem(list) {\n list = jquery__WEBPACK_IMPORTED_MODULE_0___default()(list);\n this.items = this.items.add(list);\n\n if (list.data('DateTimePicker')) {\n return;\n }\n\n var options = Object.assign({}, this.options, list.data('grav-datetime') || {});\n list.datetimepicker(options).on('dp.show dp.update', this._disableDecades);\n list.siblings('.field-icons').on('click', function () {\n return list.mousedown().focus();\n });\n }\n }, {\n key: \"_onAddedNodes\",\n value: function _onAddedNodes(event, target\n /* , record, instance */\n ) {\n var _this2 = this;\n\n var fields = jquery__WEBPACK_IMPORTED_MODULE_0___default()(target).find('[data-grav-datetime]');\n\n if (!fields.length) {\n return;\n }\n\n fields.each(function (index, field) {\n field = jquery__WEBPACK_IMPORTED_MODULE_0___default()(field);\n\n if (!~_this2.items.index(field)) {\n _this2.addItem(field);\n }\n });\n }\n }, {\n key: \"_disableDecades\",\n value: function _disableDecades() {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.datepicker-years .picker-switch').removeAttr('title').on('click', function (e) {\n return e.stopPropagation();\n });\n }\n }]);\n\n return DateTimeField;\n}();\n\n\nvar Instance = new DateTimeField();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL2Zvcm1zL2ZpZWxkcy9kYXRldGltZS5qcz9kMWMyIl0sIm5hbWVzIjpbIkRhdGVUaW1lRmllbGQiLCJzaG93VG9kYXlCdXR0b24iLCJzaG93Q2xlYXIiLCJsb2NhbGUiLCJjb25maWciLCJpY29ucyIsInRpbWUiLCJkYXRlIiwidXAiLCJkb3duIiwicHJldmlvdXMiLCJuZXh0IiwidG9kYXkiLCJjbGVhciIsImNsb3NlIiwib3B0aW9ucyIsIml0ZW1zIiwiJCIsIk9iamVjdCIsImFzc2lnbiIsImRlZmF1bHRzIiwiZWFjaCIsImluZGV4IiwiZmllbGQiLCJhZGRJdGVtIiwib24iLCJfb25BZGRlZE5vZGVzIiwiYmluZCIsImxpc3QiLCJhZGQiLCJkYXRhIiwiZGF0ZXRpbWVwaWNrZXIiLCJfZGlzYWJsZURlY2FkZXMiLCJzaWJsaW5ncyIsIm1vdXNlZG93biIsImZvY3VzIiwiZXZlbnQiLCJ0YXJnZXQiLCJmaWVsZHMiLCJmaW5kIiwibGVuZ3RoIiwicmVtb3ZlQXR0ciIsImUiLCJzdG9wUHJvcGFnYXRpb24iLCJJbnN0YW5jZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7O0lBRXFCQSxhOzs7d0JBRUY7QUFDWCxhQUFPO0FBQ0hDLHVCQUFlLEVBQUUsSUFEZDtBQUVIQyxpQkFBUyxFQUFFLElBRlI7QUFHSEMsY0FBTSxFQUFFQyx3REFBQSxJQUFtQixJQUh4QjtBQUlIQyxhQUFLLEVBQUU7QUFDSEMsY0FBSSxFQUFFLGVBREg7QUFFSEMsY0FBSSxFQUFFLGtCQUZIO0FBR0hDLFlBQUUsRUFBRSxrQkFIRDtBQUlIQyxjQUFJLEVBQUUsb0JBSkg7QUFLSEMsa0JBQVEsRUFBRSxvQkFMUDtBQU1IQyxjQUFJLEVBQUUscUJBTkg7QUFPSEMsZUFBSyxFQUFFLGdCQVBKO0FBUUhDLGVBQUssRUFBRSxlQVJKO0FBU0hDLGVBQUssRUFBRTtBQVRKO0FBSkosT0FBUDtBQWdCSDs7O0FBRUQseUJBQVlDLE9BQVosRUFBcUI7QUFBQTs7QUFBQTs7QUFDakIsU0FBS0MsS0FBTCxHQUFhQyw2Q0FBQyxFQUFkO0FBQ0EsU0FBS0YsT0FBTCxHQUFlRyxNQUFNLENBQUNDLE1BQVAsQ0FBYyxFQUFkLEVBQWtCLEtBQUtDLFFBQXZCLEVBQWlDTCxPQUFqQyxDQUFmO0FBRUFFLGlEQUFDLENBQUMsc0JBQUQsQ0FBRCxDQUEwQkksSUFBMUIsQ0FBK0IsVUFBQ0MsS0FBRCxFQUFRQyxLQUFSO0FBQUEsYUFBa0IsS0FBSSxDQUFDQyxPQUFMLENBQWFELEtBQWIsQ0FBbEI7QUFBQSxLQUEvQjtBQUNBTixpREFBQyxDQUFDLE1BQUQsQ0FBRCxDQUFVUSxFQUFWLENBQWEsZ0JBQWIsRUFBK0IsS0FBS0MsYUFBTCxDQUFtQkMsSUFBbkIsQ0FBd0IsSUFBeEIsQ0FBL0I7QUFFSDs7Ozs0QkFFT0MsSSxFQUFNO0FBQ1ZBLFVBQUksR0FBR1gsNkNBQUMsQ0FBQ1csSUFBRCxDQUFSO0FBQ0EsV0FBS1osS0FBTCxHQUFhLEtBQUtBLEtBQUwsQ0FBV2EsR0FBWCxDQUFlRCxJQUFmLENBQWI7O0FBRUEsVUFBSUEsSUFBSSxDQUFDRSxJQUFMLENBQVUsZ0JBQVYsQ0FBSixFQUFpQztBQUFFO0FBQVM7O0FBRTVDLFVBQUlmLE9BQU8sR0FBR0csTUFBTSxDQUFDQyxNQUFQLENBQWMsRUFBZCxFQUFrQixLQUFLSixPQUF2QixFQUFnQ2EsSUFBSSxDQUFDRSxJQUFMLENBQVUsZUFBVixLQUE4QixFQUE5RCxDQUFkO0FBQ0FGLFVBQUksQ0FBQ0csY0FBTCxDQUFvQmhCLE9BQXBCLEVBQTZCVSxFQUE3QixDQUFnQyxtQkFBaEMsRUFBcUQsS0FBS08sZUFBMUQ7QUFDQUosVUFBSSxDQUFDSyxRQUFMLENBQWMsY0FBZCxFQUE4QlIsRUFBOUIsQ0FBaUMsT0FBakMsRUFBMEM7QUFBQSxlQUFNRyxJQUFJLENBQUNNLFNBQUwsR0FBaUJDLEtBQWpCLEVBQU47QUFBQSxPQUExQztBQUNIOzs7a0NBRWFDLEssRUFBT0M7QUFBTTtNQUEwQjtBQUFBOztBQUNqRCxVQUFJQyxNQUFNLEdBQUdyQiw2Q0FBQyxDQUFDb0IsTUFBRCxDQUFELENBQVVFLElBQVYsQ0FBZSxzQkFBZixDQUFiOztBQUNBLFVBQUksQ0FBQ0QsTUFBTSxDQUFDRSxNQUFaLEVBQW9CO0FBQUU7QUFBUzs7QUFFL0JGLFlBQU0sQ0FBQ2pCLElBQVAsQ0FBWSxVQUFDQyxLQUFELEVBQVFDLEtBQVIsRUFBa0I7QUFDMUJBLGFBQUssR0FBR04sNkNBQUMsQ0FBQ00sS0FBRCxDQUFUOztBQUNBLFlBQUksQ0FBQyxDQUFDLE1BQUksQ0FBQ1AsS0FBTCxDQUFXTSxLQUFYLENBQWlCQyxLQUFqQixDQUFOLEVBQStCO0FBQzNCLGdCQUFJLENBQUNDLE9BQUwsQ0FBYUQsS0FBYjtBQUNIO0FBQ0osT0FMRDtBQU1IOzs7c0NBRWlCO0FBQ2ROLG1EQUFDLENBQUMsa0NBQUQsQ0FBRCxDQUFzQ3dCLFVBQXRDLENBQWlELE9BQWpELEVBQTBEaEIsRUFBMUQsQ0FBNkQsT0FBN0QsRUFBc0UsVUFBQ2lCLENBQUQ7QUFBQSxlQUFPQSxDQUFDLENBQUNDLGVBQUYsRUFBUDtBQUFBLE9BQXRFO0FBQ0g7Ozs7Ozs7QUFHRSxJQUFJQyxRQUFRLEdBQUcsSUFBSTVDLGFBQUosRUFBZiIsImZpbGUiOiIuL2FwcC9mb3Jtcy9maWVsZHMvZGF0ZXRpbWUuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnZ3Jhdi1jb25maWcnO1xuaW1wb3J0ICcuLi8uLi91dGlscy9ib290c3RyYXAtZGF0ZXRpbWVwaWNrZXInO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEYXRlVGltZUZpZWxkIHtcblxuICAgIGdldCBkZWZhdWx0cygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNob3dUb2RheUJ1dHRvbjogdHJ1ZSxcbiAgICAgICAgICAgIHNob3dDbGVhcjogdHJ1ZSxcbiAgICAgICAgICAgIGxvY2FsZTogY29uZmlnLmxhbmd1YWdlIHx8ICdlbicsXG4gICAgICAgICAgICBpY29uczoge1xuICAgICAgICAgICAgICAgIHRpbWU6ICdmYSBmYS1jbG9jay1vJyxcbiAgICAgICAgICAgICAgICBkYXRlOiAnZmEgZmEtY2FsZW5kYXItbycsXG4gICAgICAgICAgICAgICAgdXA6ICdmYSBmYS1jaGV2cm9uLXVwJyxcbiAgICAgICAgICAgICAgICBkb3duOiAnZmEgZmEtY2hldnJvbi1kb3duJyxcbiAgICAgICAgICAgICAgICBwcmV2aW91czogJ2ZhIGZhLWNoZXZyb24tbGVmdCcsXG4gICAgICAgICAgICAgICAgbmV4dDogJ2ZhIGZhLWNoZXZyb24tcmlnaHQnLFxuICAgICAgICAgICAgICAgIHRvZGF5OiAnZmEgZmEtYnVsbHNleWUnLFxuICAgICAgICAgICAgICAgIGNsZWFyOiAnZmEgZmEtdHJhc2gtbycsXG4gICAgICAgICAgICAgICAgY2xvc2U6ICdmYSBmYS1yZW1vdmUnXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICB0aGlzLml0ZW1zID0gJCgpO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmRlZmF1bHRzLCBvcHRpb25zKTtcblxuICAgICAgICAkKCdbZGF0YS1ncmF2LWRhdGV0aW1lXScpLmVhY2goKGluZGV4LCBmaWVsZCkgPT4gdGhpcy5hZGRJdGVtKGZpZWxkKSk7XG4gICAgICAgICQoJ2JvZHknKS5vbignbXV0YXRpb24uX2dyYXYnLCB0aGlzLl9vbkFkZGVkTm9kZXMuYmluZCh0aGlzKSk7XG5cbiAgICB9XG5cbiAgICBhZGRJdGVtKGxpc3QpIHtcbiAgICAgICAgbGlzdCA9ICQobGlzdCk7XG4gICAgICAgIHRoaXMuaXRlbXMgPSB0aGlzLml0ZW1zLmFkZChsaXN0KTtcblxuICAgICAgICBpZiAobGlzdC5kYXRhKCdEYXRlVGltZVBpY2tlcicpKSB7IHJldHVybjsgfVxuXG4gICAgICAgIGxldCBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRpb25zLCBsaXN0LmRhdGEoJ2dyYXYtZGF0ZXRpbWUnKSB8fCB7fSk7XG4gICAgICAgIGxpc3QuZGF0ZXRpbWVwaWNrZXIob3B0aW9ucykub24oJ2RwLnNob3cgZHAudXBkYXRlJywgdGhpcy5fZGlzYWJsZURlY2FkZXMpO1xuICAgICAgICBsaXN0LnNpYmxpbmdzKCcuZmllbGQtaWNvbnMnKS5vbignY2xpY2snLCAoKSA9PiBsaXN0Lm1vdXNlZG93bigpLmZvY3VzKCkpO1xuICAgIH1cblxuICAgIF9vbkFkZGVkTm9kZXMoZXZlbnQsIHRhcmdldC8qICwgcmVjb3JkLCBpbnN0YW5jZSAqLykge1xuICAgICAgICBsZXQgZmllbGRzID0gJCh0YXJnZXQpLmZpbmQoJ1tkYXRhLWdyYXYtZGF0ZXRpbWVdJyk7XG4gICAgICAgIGlmICghZmllbGRzLmxlbmd0aCkgeyByZXR1cm47IH1cblxuICAgICAgICBmaWVsZHMuZWFjaCgoaW5kZXgsIGZpZWxkKSA9PiB7XG4gICAgICAgICAgICBmaWVsZCA9ICQoZmllbGQpO1xuICAgICAgICAgICAgaWYgKCF+dGhpcy5pdGVtcy5pbmRleChmaWVsZCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW0oZmllbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfZGlzYWJsZURlY2FkZXMoKSB7XG4gICAgICAgICQoJy5kYXRlcGlja2VyLXllYXJzIC5waWNrZXItc3dpdGNoJykucmVtb3ZlQXR0cigndGl0bGUnKS5vbignY2xpY2snLCAoZSkgPT4gZS5zdG9wUHJvcGFnYXRpb24oKSk7XG4gICAgfVxufVxuXG5leHBvcnQgbGV0IEluc3RhbmNlID0gbmV3IERhdGVUaW1lRmllbGQoKTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./app/forms/fields/datetime.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ DateTimeField),\n/* harmony export */ \"Instance\": () => (/* binding */ Instance)\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! grav-config */ \"grav-config\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(grav_config__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _utils_bootstrap_datetimepicker__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/bootstrap-datetimepicker */ \"./app/utils/bootstrap-datetimepicker.js\");\n/* harmony import */ var _utils_bootstrap_datetimepicker__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_utils_bootstrap_datetimepicker__WEBPACK_IMPORTED_MODULE_2__);\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\n\nvar DateTimeField = /*#__PURE__*/function () {\n function DateTimeField(options) {\n var _this = this;\n\n _classCallCheck(this, DateTimeField);\n\n this.items = jquery__WEBPACK_IMPORTED_MODULE_0___default()();\n this.options = Object.assign({}, this.defaults, options);\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-grav-datetime]').each(function (index, field) {\n return _this.addItem(field);\n });\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('body').on('mutation._grav', this._onAddedNodes.bind(this));\n }\n\n _createClass(DateTimeField, [{\n key: \"defaults\",\n get: function get() {\n return {\n showTodayButton: true,\n showClear: true,\n locale: grav_config__WEBPACK_IMPORTED_MODULE_1__.config.language || 'en',\n icons: {\n time: 'fa fa-clock-o',\n date: 'fa fa-calendar-o',\n up: 'fa fa-chevron-up',\n down: 'fa fa-chevron-down',\n previous: 'fa fa-chevron-left',\n next: 'fa fa-chevron-right',\n today: 'fa fa-bullseye',\n clear: 'fa fa-trash-o',\n close: 'fa fa-remove'\n }\n };\n }\n }, {\n key: \"addItem\",\n value: function addItem(list) {\n list = jquery__WEBPACK_IMPORTED_MODULE_0___default()(list);\n this.items = this.items.add(list);\n\n if (list.data('DateTimePicker')) {\n return;\n }\n\n var options = Object.assign({}, this.options, list.data('grav-datetime') || {});\n list.datetimepicker(options).on('dp.show dp.update', this._disableDecades);\n list.siblings('.field-icons').on('click', function () {\n return list.mousedown().focus();\n });\n }\n }, {\n key: \"_onAddedNodes\",\n value: function _onAddedNodes(event, target\n /* , record, instance */\n ) {\n var _this2 = this;\n\n var fields = jquery__WEBPACK_IMPORTED_MODULE_0___default()(target).find('[data-grav-datetime]');\n\n if (!fields.length) {\n return;\n }\n\n fields.each(function (index, field) {\n field = jquery__WEBPACK_IMPORTED_MODULE_0___default()(field);\n\n if (!~_this2.items.index(field)) {\n _this2.addItem(field);\n }\n });\n }\n }, {\n key: \"_disableDecades\",\n value: function _disableDecades() {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.datepicker-years .picker-switch').removeAttr('title').on('click', function (e) {\n return e.stopPropagation();\n });\n }\n }]);\n\n return DateTimeField;\n}();\n\n\nvar Instance = new DateTimeField();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL2Zvcm1zL2ZpZWxkcy9kYXRldGltZS5qcz9kMWMyIl0sIm5hbWVzIjpbIkRhdGVUaW1lRmllbGQiLCJvcHRpb25zIiwiaXRlbXMiLCIkIiwiT2JqZWN0IiwiYXNzaWduIiwiZGVmYXVsdHMiLCJlYWNoIiwiaW5kZXgiLCJmaWVsZCIsImFkZEl0ZW0iLCJvbiIsIl9vbkFkZGVkTm9kZXMiLCJiaW5kIiwic2hvd1RvZGF5QnV0dG9uIiwic2hvd0NsZWFyIiwibG9jYWxlIiwiY29uZmlnIiwiaWNvbnMiLCJ0aW1lIiwiZGF0ZSIsInVwIiwiZG93biIsInByZXZpb3VzIiwibmV4dCIsInRvZGF5IiwiY2xlYXIiLCJjbG9zZSIsImxpc3QiLCJhZGQiLCJkYXRhIiwiZGF0ZXRpbWVwaWNrZXIiLCJfZGlzYWJsZURlY2FkZXMiLCJzaWJsaW5ncyIsIm1vdXNlZG93biIsImZvY3VzIiwiZXZlbnQiLCJ0YXJnZXQiLCJmaWVsZHMiLCJmaW5kIiwibGVuZ3RoIiwicmVtb3ZlQXR0ciIsImUiLCJzdG9wUHJvcGFnYXRpb24iLCJJbnN0YW5jZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7O0lBRXFCQSxhO0FBcUJqQix5QkFBWUMsT0FBWixFQUFxQjtBQUFBOztBQUFBOztBQUNqQixTQUFLQyxLQUFMLEdBQWFDLDZDQUFDLEVBQWQ7QUFDQSxTQUFLRixPQUFMLEdBQWVHLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjLEVBQWQsRUFBa0IsS0FBS0MsUUFBdkIsRUFBaUNMLE9BQWpDLENBQWY7QUFFQUUsaURBQUMsQ0FBQyxzQkFBRCxDQUFELENBQTBCSSxJQUExQixDQUErQixVQUFDQyxLQUFELEVBQVFDLEtBQVI7QUFBQSxhQUFrQixLQUFJLENBQUNDLE9BQUwsQ0FBYUQsS0FBYixDQUFsQjtBQUFBLEtBQS9CO0FBQ0FOLGlEQUFDLENBQUMsTUFBRCxDQUFELENBQVVRLEVBQVYsQ0FBYSxnQkFBYixFQUErQixLQUFLQyxhQUFMLENBQW1CQyxJQUFuQixDQUF3QixJQUF4QixDQUEvQjtBQUVIOzs7O1NBMUJELGVBQWU7QUFDWCxhQUFPO0FBQ0hDLHVCQUFlLEVBQUUsSUFEZDtBQUVIQyxpQkFBUyxFQUFFLElBRlI7QUFHSEMsY0FBTSxFQUFFQyx3REFBQSxJQUFtQixJQUh4QjtBQUlIQyxhQUFLLEVBQUU7QUFDSEMsY0FBSSxFQUFFLGVBREg7QUFFSEMsY0FBSSxFQUFFLGtCQUZIO0FBR0hDLFlBQUUsRUFBRSxrQkFIRDtBQUlIQyxjQUFJLEVBQUUsb0JBSkg7QUFLSEMsa0JBQVEsRUFBRSxvQkFMUDtBQU1IQyxjQUFJLEVBQUUscUJBTkg7QUFPSEMsZUFBSyxFQUFFLGdCQVBKO0FBUUhDLGVBQUssRUFBRSxlQVJKO0FBU0hDLGVBQUssRUFBRTtBQVRKO0FBSkosT0FBUDtBQWdCSDs7O1dBV0QsaUJBQVFDLElBQVIsRUFBYztBQUNWQSxVQUFJLEdBQUd6Qiw2Q0FBQyxDQUFDeUIsSUFBRCxDQUFSO0FBQ0EsV0FBSzFCLEtBQUwsR0FBYSxLQUFLQSxLQUFMLENBQVcyQixHQUFYLENBQWVELElBQWYsQ0FBYjs7QUFFQSxVQUFJQSxJQUFJLENBQUNFLElBQUwsQ0FBVSxnQkFBVixDQUFKLEVBQWlDO0FBQUU7QUFBUzs7QUFFNUMsVUFBSTdCLE9BQU8sR0FBR0csTUFBTSxDQUFDQyxNQUFQLENBQWMsRUFBZCxFQUFrQixLQUFLSixPQUF2QixFQUFnQzJCLElBQUksQ0FBQ0UsSUFBTCxDQUFVLGVBQVYsS0FBOEIsRUFBOUQsQ0FBZDtBQUNBRixVQUFJLENBQUNHLGNBQUwsQ0FBb0I5QixPQUFwQixFQUE2QlUsRUFBN0IsQ0FBZ0MsbUJBQWhDLEVBQXFELEtBQUtxQixlQUExRDtBQUNBSixVQUFJLENBQUNLLFFBQUwsQ0FBYyxjQUFkLEVBQThCdEIsRUFBOUIsQ0FBaUMsT0FBakMsRUFBMEM7QUFBQSxlQUFNaUIsSUFBSSxDQUFDTSxTQUFMLEdBQWlCQyxLQUFqQixFQUFOO0FBQUEsT0FBMUM7QUFDSDs7O1dBRUQsdUJBQWNDLEtBQWQsRUFBcUJDO0FBQU07QUFBM0IsTUFBcUQ7QUFBQTs7QUFDakQsVUFBSUMsTUFBTSxHQUFHbkMsNkNBQUMsQ0FBQ2tDLE1BQUQsQ0FBRCxDQUFVRSxJQUFWLENBQWUsc0JBQWYsQ0FBYjs7QUFDQSxVQUFJLENBQUNELE1BQU0sQ0FBQ0UsTUFBWixFQUFvQjtBQUFFO0FBQVM7O0FBRS9CRixZQUFNLENBQUMvQixJQUFQLENBQVksVUFBQ0MsS0FBRCxFQUFRQyxLQUFSLEVBQWtCO0FBQzFCQSxhQUFLLEdBQUdOLDZDQUFDLENBQUNNLEtBQUQsQ0FBVDs7QUFDQSxZQUFJLENBQUMsQ0FBQyxNQUFJLENBQUNQLEtBQUwsQ0FBV00sS0FBWCxDQUFpQkMsS0FBakIsQ0FBTixFQUErQjtBQUMzQixnQkFBSSxDQUFDQyxPQUFMLENBQWFELEtBQWI7QUFDSDtBQUNKLE9BTEQ7QUFNSDs7O1dBRUQsMkJBQWtCO0FBQ2ROLG1EQUFDLENBQUMsa0NBQUQsQ0FBRCxDQUFzQ3NDLFVBQXRDLENBQWlELE9BQWpELEVBQTBEOUIsRUFBMUQsQ0FBNkQsT0FBN0QsRUFBc0UsVUFBQytCLENBQUQ7QUFBQSxlQUFPQSxDQUFDLENBQUNDLGVBQUYsRUFBUDtBQUFBLE9BQXRFO0FBQ0g7Ozs7Ozs7QUFHRSxJQUFJQyxRQUFRLEdBQUcsSUFBSTVDLGFBQUosRUFBZiIsImZpbGUiOiIuL2FwcC9mb3Jtcy9maWVsZHMvZGF0ZXRpbWUuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnZ3Jhdi1jb25maWcnO1xuaW1wb3J0ICcuLi8uLi91dGlscy9ib290c3RyYXAtZGF0ZXRpbWVwaWNrZXInO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEYXRlVGltZUZpZWxkIHtcblxuICAgIGdldCBkZWZhdWx0cygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNob3dUb2RheUJ1dHRvbjogdHJ1ZSxcbiAgICAgICAgICAgIHNob3dDbGVhcjogdHJ1ZSxcbiAgICAgICAgICAgIGxvY2FsZTogY29uZmlnLmxhbmd1YWdlIHx8ICdlbicsXG4gICAgICAgICAgICBpY29uczoge1xuICAgICAgICAgICAgICAgIHRpbWU6ICdmYSBmYS1jbG9jay1vJyxcbiAgICAgICAgICAgICAgICBkYXRlOiAnZmEgZmEtY2FsZW5kYXItbycsXG4gICAgICAgICAgICAgICAgdXA6ICdmYSBmYS1jaGV2cm9uLXVwJyxcbiAgICAgICAgICAgICAgICBkb3duOiAnZmEgZmEtY2hldnJvbi1kb3duJyxcbiAgICAgICAgICAgICAgICBwcmV2aW91czogJ2ZhIGZhLWNoZXZyb24tbGVmdCcsXG4gICAgICAgICAgICAgICAgbmV4dDogJ2ZhIGZhLWNoZXZyb24tcmlnaHQnLFxuICAgICAgICAgICAgICAgIHRvZGF5OiAnZmEgZmEtYnVsbHNleWUnLFxuICAgICAgICAgICAgICAgIGNsZWFyOiAnZmEgZmEtdHJhc2gtbycsXG4gICAgICAgICAgICAgICAgY2xvc2U6ICdmYSBmYS1yZW1vdmUnXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICB0aGlzLml0ZW1zID0gJCgpO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmRlZmF1bHRzLCBvcHRpb25zKTtcblxuICAgICAgICAkKCdbZGF0YS1ncmF2LWRhdGV0aW1lXScpLmVhY2goKGluZGV4LCBmaWVsZCkgPT4gdGhpcy5hZGRJdGVtKGZpZWxkKSk7XG4gICAgICAgICQoJ2JvZHknKS5vbignbXV0YXRpb24uX2dyYXYnLCB0aGlzLl9vbkFkZGVkTm9kZXMuYmluZCh0aGlzKSk7XG5cbiAgICB9XG5cbiAgICBhZGRJdGVtKGxpc3QpIHtcbiAgICAgICAgbGlzdCA9ICQobGlzdCk7XG4gICAgICAgIHRoaXMuaXRlbXMgPSB0aGlzLml0ZW1zLmFkZChsaXN0KTtcblxuICAgICAgICBpZiAobGlzdC5kYXRhKCdEYXRlVGltZVBpY2tlcicpKSB7IHJldHVybjsgfVxuXG4gICAgICAgIGxldCBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRpb25zLCBsaXN0LmRhdGEoJ2dyYXYtZGF0ZXRpbWUnKSB8fCB7fSk7XG4gICAgICAgIGxpc3QuZGF0ZXRpbWVwaWNrZXIob3B0aW9ucykub24oJ2RwLnNob3cgZHAudXBkYXRlJywgdGhpcy5fZGlzYWJsZURlY2FkZXMpO1xuICAgICAgICBsaXN0LnNpYmxpbmdzKCcuZmllbGQtaWNvbnMnKS5vbignY2xpY2snLCAoKSA9PiBsaXN0Lm1vdXNlZG93bigpLmZvY3VzKCkpO1xuICAgIH1cblxuICAgIF9vbkFkZGVkTm9kZXMoZXZlbnQsIHRhcmdldC8qICwgcmVjb3JkLCBpbnN0YW5jZSAqLykge1xuICAgICAgICBsZXQgZmllbGRzID0gJCh0YXJnZXQpLmZpbmQoJ1tkYXRhLWdyYXYtZGF0ZXRpbWVdJyk7XG4gICAgICAgIGlmICghZmllbGRzLmxlbmd0aCkgeyByZXR1cm47IH1cblxuICAgICAgICBmaWVsZHMuZWFjaCgoaW5kZXgsIGZpZWxkKSA9PiB7XG4gICAgICAgICAgICBmaWVsZCA9ICQoZmllbGQpO1xuICAgICAgICAgICAgaWYgKCF+dGhpcy5pdGVtcy5pbmRleChmaWVsZCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW0oZmllbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfZGlzYWJsZURlY2FkZXMoKSB7XG4gICAgICAgICQoJy5kYXRlcGlja2VyLXllYXJzIC5waWNrZXItc3dpdGNoJykucmVtb3ZlQXR0cigndGl0bGUnKS5vbignY2xpY2snLCAoZSkgPT4gZS5zdG9wUHJvcGFnYXRpb24oKSk7XG4gICAgfVxufVxuXG5leHBvcnQgbGV0IEluc3RhbmNlID0gbmV3IERhdGVUaW1lRmllbGQoKTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./app/forms/fields/datetime.js\n"); /***/ }), /***/ "./app/forms/fields/editor.js": -/*!************************************!* +/*!************************************!*\ !*** ./app/forms/fields/editor.js ***! \************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => /* binding */ EditorField,\n/* harmony export */ \"Toolbar\": () => /* binding */ Toolbar,\n/* harmony export */ \"Instance\": () => /* binding */ Instance\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _editor_buttons__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./editor/buttons */ \"./app/forms/fields/editor/buttons.js\");\n/* harmony import */ var codemirror__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! codemirror */ \"./node_modules/codemirror/lib/codemirror.js\");\n/* harmony import */ var codemirror__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(codemirror__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var watchjs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! watchjs */ \"./node_modules/watchjs/src/watch.js\");\n/* harmony import */ var watchjs__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(watchjs__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var js_yaml__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! js-yaml */ \"./node_modules/js-yaml/index.js\");\n/* harmony import */ var js_yaml__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(js_yaml__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var codemirror_mode_css_css__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! codemirror/mode/css/css */ \"./node_modules/codemirror/mode/css/css.js\");\n/* harmony import */ var codemirror_mode_css_css__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(codemirror_mode_css_css__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var codemirror_mode_gfm_gfm__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! codemirror/mode/gfm/gfm */ \"./node_modules/codemirror/mode/gfm/gfm.js\");\n/* harmony import */ var codemirror_mode_gfm_gfm__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(codemirror_mode_gfm_gfm__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var codemirror_mode_htmlmixed_htmlmixed__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! codemirror/mode/htmlmixed/htmlmixed */ \"./node_modules/codemirror/mode/htmlmixed/htmlmixed.js\");\n/* harmony import */ var codemirror_mode_htmlmixed_htmlmixed__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(codemirror_mode_htmlmixed_htmlmixed__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var codemirror_mode_javascript_javascript__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! codemirror/mode/javascript/javascript */ \"./node_modules/codemirror/mode/javascript/javascript.js\");\n/* harmony import */ var codemirror_mode_javascript_javascript__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(codemirror_mode_javascript_javascript__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var codemirror_mode_markdown_markdown__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! codemirror/mode/markdown/markdown */ \"./node_modules/codemirror/mode/markdown/markdown.js\");\n/* harmony import */ var codemirror_mode_markdown_markdown__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(codemirror_mode_markdown_markdown__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var codemirror_mode_php_php__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! codemirror/mode/php/php */ \"./node_modules/codemirror/mode/php/php.js\");\n/* harmony import */ var codemirror_mode_php_php__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(codemirror_mode_php_php__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var codemirror_mode_sass_sass__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! codemirror/mode/sass/sass */ \"./node_modules/codemirror/mode/sass/sass.js\");\n/* harmony import */ var codemirror_mode_sass_sass__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(codemirror_mode_sass_sass__WEBPACK_IMPORTED_MODULE_11__);\n/* harmony import */ var codemirror_mode_twig_twig__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! codemirror/mode/twig/twig */ \"./node_modules/codemirror/mode/twig/twig.js\");\n/* harmony import */ var codemirror_mode_twig_twig__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(codemirror_mode_twig_twig__WEBPACK_IMPORTED_MODULE_12__);\n/* harmony import */ var codemirror_mode_xml_xml__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! codemirror/mode/xml/xml */ \"./node_modules/codemirror/mode/xml/xml.js\");\n/* harmony import */ var codemirror_mode_xml_xml__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(codemirror_mode_xml_xml__WEBPACK_IMPORTED_MODULE_13__);\n/* harmony import */ var codemirror_mode_yaml_yaml__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! codemirror/mode/yaml/yaml */ \"./node_modules/codemirror/mode/yaml/yaml.js\");\n/* harmony import */ var codemirror_mode_yaml_yaml__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(codemirror_mode_yaml_yaml__WEBPACK_IMPORTED_MODULE_14__);\n/* harmony import */ var codemirror_addon_edit_continuelist__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! codemirror/addon/edit/continuelist */ \"./node_modules/codemirror/addon/edit/continuelist.js\");\n/* harmony import */ var codemirror_addon_edit_continuelist__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(codemirror_addon_edit_continuelist__WEBPACK_IMPORTED_MODULE_15__);\n/* harmony import */ var codemirror_addon_mode_overlay__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! codemirror/addon/mode/overlay */ \"./node_modules/codemirror/addon/mode/overlay.js\");\n/* harmony import */ var codemirror_addon_mode_overlay__WEBPACK_IMPORTED_MODULE_16___default = /*#__PURE__*/__webpack_require__.n(codemirror_addon_mode_overlay__WEBPACK_IMPORTED_MODULE_16__);\n/* harmony import */ var codemirror_addon_selection_active_line__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! codemirror/addon/selection/active-line */ \"./node_modules/codemirror/addon/selection/active-line.js\");\n/* harmony import */ var codemirror_addon_selection_active_line__WEBPACK_IMPORTED_MODULE_17___default = /*#__PURE__*/__webpack_require__.n(codemirror_addon_selection_active_line__WEBPACK_IMPORTED_MODULE_17__);\n/* harmony import */ var codemirror_addon_lint_lint__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! codemirror/addon/lint/lint */ \"./node_modules/codemirror/addon/lint/lint.js\");\n/* harmony import */ var codemirror_addon_lint_lint__WEBPACK_IMPORTED_MODULE_18___default = /*#__PURE__*/__webpack_require__.n(codemirror_addon_lint_lint__WEBPACK_IMPORTED_MODULE_18__);\n/* harmony import */ var codemirror_addon_lint_lint_css__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! codemirror/addon/lint/lint.css */ \"./node_modules/codemirror/addon/lint/lint.css\");\n/* harmony import */ var codemirror_addon_lint_css_lint__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! codemirror/addon/lint/css-lint */ \"./node_modules/codemirror/addon/lint/css-lint.js\");\n/* harmony import */ var codemirror_addon_lint_css_lint__WEBPACK_IMPORTED_MODULE_20___default = /*#__PURE__*/__webpack_require__.n(codemirror_addon_lint_css_lint__WEBPACK_IMPORTED_MODULE_20__);\n/* harmony import */ var codemirror_addon_lint_javascript_lint__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! codemirror/addon/lint/javascript-lint */ \"./node_modules/codemirror/addon/lint/javascript-lint.js\");\n/* harmony import */ var codemirror_addon_lint_javascript_lint__WEBPACK_IMPORTED_MODULE_21___default = /*#__PURE__*/__webpack_require__.n(codemirror_addon_lint_javascript_lint__WEBPACK_IMPORTED_MODULE_21__);\n/* harmony import */ var codemirror_addon_lint_json_lint__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! codemirror/addon/lint/json-lint */ \"./node_modules/codemirror/addon/lint/json-lint.js\");\n/* harmony import */ var codemirror_addon_lint_json_lint__WEBPACK_IMPORTED_MODULE_22___default = /*#__PURE__*/__webpack_require__.n(codemirror_addon_lint_json_lint__WEBPACK_IMPORTED_MODULE_22__);\n/* harmony import */ var codemirror_addon_lint_yaml_lint__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! codemirror/addon/lint/yaml-lint */ \"./node_modules/codemirror/addon/lint/yaml-lint.js\");\n/* harmony import */ var codemirror_addon_lint_yaml_lint__WEBPACK_IMPORTED_MODULE_23___default = /*#__PURE__*/__webpack_require__.n(codemirror_addon_lint_yaml_lint__WEBPACK_IMPORTED_MODULE_23__);\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\n\n\n__webpack_require__.g.jsyaml = (js_yaml__WEBPACK_IMPORTED_MODULE_4___default()); // Modes\n\n\n\n\n\n\n\n\n\n\n // Add-ons\n\n\n\n\n\n\n\n\n\n\nvar IS_MOUSEDOWN = false;\nvar ThemesMap = ['paper'];\nvar Defaults = {\n codemirror: {\n mode: 'htmlmixed',\n theme: 'paper',\n lineWrapping: true,\n dragDrop: true,\n autoCloseTags: true,\n matchTags: true,\n autoCloseBrackets: true,\n matchBrackets: true,\n indentUnit: 4,\n indentWithTabs: false,\n tabSize: 4,\n hintOptions: {\n completionSingle: false\n },\n extraKeys: {\n 'Enter': 'newlineAndIndentContinueMarkdownList'\n }\n }\n};\n\nvar EditorField = /*#__PURE__*/function () {\n function EditorField(options) {\n var _this = this;\n\n _classCallCheck(this, EditorField);\n\n var body = jquery__WEBPACK_IMPORTED_MODULE_0___default()('body');\n this.editors = jquery__WEBPACK_IMPORTED_MODULE_0___default()();\n this.options = Object.assign({}, Defaults, options);\n this.buttons = _editor_buttons__WEBPACK_IMPORTED_MODULE_1__.default;\n this.buttonStrategies = _editor_buttons__WEBPACK_IMPORTED_MODULE_1__.strategies;\n (0,watchjs__WEBPACK_IMPORTED_MODULE_3__.watch)(_editor_buttons__WEBPACK_IMPORTED_MODULE_1__.default, function ()\n /* key, modifier, prev, next */\n {\n _this.editors.each(function (index, editor) {\n return jquery__WEBPACK_IMPORTED_MODULE_0___default()(editor).data('toolbar').renderButtons();\n });\n });\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-grav-editor]').each(function (index, editor) {\n return _this.addEditor(editor);\n });\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(function () {\n body.trigger('grav-editor-ready');\n });\n body.on('mutation._grav', this._onAddedNodes.bind(this));\n body.on('mouseup._grav', function () {\n if (!IS_MOUSEDOWN) {\n return true;\n }\n\n body.unbind('mousemove._grav');\n IS_MOUSEDOWN = false;\n });\n body.on('mousedown._grav', '.grav-editor-resizer', function (event) {\n event && event.preventDefault();\n IS_MOUSEDOWN = true;\n var target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.currentTarget);\n var container = target.siblings('.grav-editor-content');\n var editor = container.find('.CodeMirror');\n var codemirror = container.find('textarea').data('codemirror');\n body.on('mousemove._grav', function (event) {\n editor.css('height', Math.max(100, event.pageY - container.offset().top));\n codemirror.refresh();\n });\n });\n }\n\n _createClass(EditorField, [{\n key: \"addButton\",\n value: function addButton(button, options) {\n if (options && (options.before || options.after)) {\n var index = this.buttons.navigation.findIndex(function (obj) {\n var key = Object.keys(obj).shift();\n return obj[key].identifier === (options.before || options.after);\n });\n\n if (!~index) {\n options = 'end';\n } else {\n this.buttons.navigation.splice(options.before ? index : index + 1, 0, button);\n }\n }\n\n if (options === 'start') {\n this.buttons.navigation.splice(0, 0, button);\n }\n\n if (!options || options === 'end') {\n this.buttons.navigation.push(button);\n }\n }\n }, {\n key: \"addEditor\",\n value: function addEditor(textarea) {\n textarea = jquery__WEBPACK_IMPORTED_MODULE_0___default()(textarea);\n var options = Object.assign({}, this.options.codemirror, textarea.data('grav-editor').codemirror);\n var theme = options.theme || 'paper';\n this.editors = this.editors.add(textarea);\n\n if (theme && !~ThemesMap.indexOf(theme)) {\n ThemesMap.push(theme); // let themeCSS = `https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.12.0/theme/${theme}.min.css`;\n // $('head').append($('').attr('href', themeCSS));\n }\n\n if (options.mode === 'yaml') {\n Object.assign(options.extraKeys, {\n Tab: function Tab(cm) {\n cm.replaceSelection(' ', 'end');\n }\n });\n }\n\n var editor = codemirror__WEBPACK_IMPORTED_MODULE_2___default().fromTextArea(textarea.get(0), options);\n textarea.data('codemirror', editor);\n textarea.data('toolbar', new Toolbar(textarea));\n textarea.addClass('code-mirrored');\n\n if (options.toolbar === false) {\n textarea.data('toolbar').ui.navigation.addClass('grav-editor-hide-toolbar');\n }\n\n editor.on('change', function () {\n return editor.save();\n });\n }\n }, {\n key: \"_onAddedNodes\",\n value: function _onAddedNodes(event, target\n /* , record, instance */\n ) {\n var _this2 = this;\n\n var editors = jquery__WEBPACK_IMPORTED_MODULE_0___default()(target).find('[data-grav-editor]');\n\n if (!editors.length) {\n return;\n }\n\n editors.each(function (index, editor) {\n editor = jquery__WEBPACK_IMPORTED_MODULE_0___default()(editor);\n\n if (!~_this2.editors.index(editor)) {\n _this2.addEditor(editor);\n }\n });\n }\n }]);\n\n return EditorField;\n}();\n\n\nvar Toolbar = /*#__PURE__*/function () {\n _createClass(Toolbar, null, [{\n key: \"templates\",\n value: function templates() {\n return {\n navigation: \"\\n
\\n
\\n
\\n
\\n \"\n };\n }\n }]);\n\n function Toolbar(editor) {\n _classCallCheck(this, Toolbar);\n\n this.editor = jquery__WEBPACK_IMPORTED_MODULE_0___default()(editor);\n this.codemirror = this.editor.data('codemirror');\n this.buttons = _editor_buttons__WEBPACK_IMPORTED_MODULE_1__.default.navigation;\n this.ui = {\n navigation: jquery__WEBPACK_IMPORTED_MODULE_0___default()(Toolbar.templates().navigation)\n };\n this.editor.parent('.grav-editor-content').before(this.ui.navigation).after(this.ui.states);\n this.renderButtons();\n }\n\n _createClass(Toolbar, [{\n key: \"renderButtons\",\n value: function renderButtons() {\n var _this3 = this;\n\n var map = {\n 'actions': 'navigation',\n 'modes': 'states'\n };\n ['actions', 'modes'].forEach(function (type) {\n _this3.ui.navigation.find(\".grav-editor-\".concat(type)).empty().append('
    ');\n\n _editor_buttons__WEBPACK_IMPORTED_MODULE_1__.default[map[type]].forEach(function (button) {\n return _this3.renderButton(button, type);\n });\n });\n }\n }, {\n key: \"renderButton\",\n value: function renderButton(button, type) {\n var _this4 = this;\n\n var location = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n Object.keys(button).forEach(function (key) {\n var obj = button[key];\n\n if (!obj.modes) {\n obj.modes = [];\n }\n\n if (!~_this4.codemirror.options.ignore.indexOf(key) && (!obj.modes.length || obj.modes.indexOf(_this4.codemirror.options.mode) > -1)) {\n var hint = obj.title ? \"data-hint=\\\"\".concat(obj.title, \"\\\"\") : '';\n var element = jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"
  • \").concat(obj.label, \"
  • \"));\n\n (location || _this4.ui.navigation.find(\".grav-editor-\".concat(type, \" ul:not(.dropdown-menu)\"))).append(element);\n\n if (obj.shortcut) {\n _this4.addShortcut(obj.identifier, obj.shortcut, element);\n }\n\n obj.action && obj.action.call(obj.action, {\n codemirror: _this4.codemirror,\n button: element,\n textarea: _this4.editor,\n ui: _this4.ui\n });\n\n if (obj.children) {\n var childrenContainer = jquery__WEBPACK_IMPORTED_MODULE_0___default()('
      ');\n element.addClass('button-group').find('a').wrap('
      ');\n element.find('a').append(' ');\n element.append(childrenContainer);\n obj.children.forEach(function (child) {\n return _this4.renderButton(child, type, childrenContainer);\n });\n }\n }\n });\n }\n }, {\n key: \"addShortcut\",\n value: function addShortcut(identifier, shortcut, element) {\n var _this5 = this;\n\n var map = {};\n\n if (!Array.isArray(shortcut)) {\n shortcut = [shortcut];\n }\n\n shortcut.forEach(function (key) {\n map[key] = function () {\n element.trigger(\"click.editor.\".concat(identifier), [_this5.codemirror]);\n };\n });\n this.codemirror.addKeyMap(map);\n }\n }]);\n\n return Toolbar;\n}();\nvar Instance = new EditorField();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL2Zvcm1zL2ZpZWxkcy9lZGl0b3IuanM/MzJkMyJdLCJuYW1lcyI6WyJnbG9iYWwiLCJqc3lhbWwiLCJJU19NT1VTRURPV04iLCJUaGVtZXNNYXAiLCJEZWZhdWx0cyIsImNvZGVtaXJyb3IiLCJtb2RlIiwidGhlbWUiLCJsaW5lV3JhcHBpbmciLCJkcmFnRHJvcCIsImF1dG9DbG9zZVRhZ3MiLCJtYXRjaFRhZ3MiLCJhdXRvQ2xvc2VCcmFja2V0cyIsIm1hdGNoQnJhY2tldHMiLCJpbmRlbnRVbml0IiwiaW5kZW50V2l0aFRhYnMiLCJ0YWJTaXplIiwiaGludE9wdGlvbnMiLCJjb21wbGV0aW9uU2luZ2xlIiwiZXh0cmFLZXlzIiwiRWRpdG9yRmllbGQiLCJvcHRpb25zIiwiYm9keSIsIiQiLCJlZGl0b3JzIiwiT2JqZWN0IiwiYXNzaWduIiwiYnV0dG9ucyIsIkJ1dHRvbnMiLCJidXR0b25TdHJhdGVnaWVzIiwid2F0Y2giLCJlYWNoIiwiaW5kZXgiLCJlZGl0b3IiLCJkYXRhIiwicmVuZGVyQnV0dG9ucyIsImFkZEVkaXRvciIsInRyaWdnZXIiLCJvbiIsIl9vbkFkZGVkTm9kZXMiLCJiaW5kIiwidW5iaW5kIiwiZXZlbnQiLCJwcmV2ZW50RGVmYXVsdCIsInRhcmdldCIsImN1cnJlbnRUYXJnZXQiLCJjb250YWluZXIiLCJzaWJsaW5ncyIsImZpbmQiLCJjc3MiLCJNYXRoIiwibWF4IiwicGFnZVkiLCJvZmZzZXQiLCJ0b3AiLCJyZWZyZXNoIiwiYnV0dG9uIiwiYmVmb3JlIiwiYWZ0ZXIiLCJuYXZpZ2F0aW9uIiwiZmluZEluZGV4Iiwib2JqIiwia2V5Iiwia2V5cyIsInNoaWZ0IiwiaWRlbnRpZmllciIsInNwbGljZSIsInB1c2giLCJ0ZXh0YXJlYSIsImFkZCIsImluZGV4T2YiLCJUYWIiLCJjbSIsInJlcGxhY2VTZWxlY3Rpb24iLCJnZXQiLCJUb29sYmFyIiwiYWRkQ2xhc3MiLCJ0b29sYmFyIiwidWkiLCJzYXZlIiwibGVuZ3RoIiwidGVtcGxhdGVzIiwicGFyZW50Iiwic3RhdGVzIiwibWFwIiwiZm9yRWFjaCIsInR5cGUiLCJlbXB0eSIsImFwcGVuZCIsInJlbmRlckJ1dHRvbiIsImxvY2F0aW9uIiwibW9kZXMiLCJpZ25vcmUiLCJoaW50IiwidGl0bGUiLCJlbGVtZW50IiwibGFiZWwiLCJzaG9ydGN1dCIsImFkZFNob3J0Y3V0IiwiYWN0aW9uIiwiY2FsbCIsImNoaWxkcmVuIiwiY2hpbGRyZW5Db250YWluZXIiLCJ3cmFwIiwiY2hpbGQiLCJBcnJheSIsImlzQXJyYXkiLCJhZGRLZXlNYXAiLCJJbnN0YW5jZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQUEscUJBQU0sQ0FBQ0MsTUFBUCxHQUFnQkEsZ0RBQWhCLEMsQ0FFQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Q0FHQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQSxJQUFJQyxZQUFZLEdBQUcsS0FBbkI7QUFDQSxJQUFNQyxTQUFTLEdBQUcsQ0FBQyxPQUFELENBQWxCO0FBQ0EsSUFBTUMsUUFBUSxHQUFHO0FBQ2JDLFlBQVUsRUFBRTtBQUNSQyxRQUFJLEVBQUUsV0FERTtBQUVSQyxTQUFLLEVBQUUsT0FGQztBQUdSQyxnQkFBWSxFQUFFLElBSE47QUFJUkMsWUFBUSxFQUFFLElBSkY7QUFLUkMsaUJBQWEsRUFBRSxJQUxQO0FBTVJDLGFBQVMsRUFBRSxJQU5IO0FBT1JDLHFCQUFpQixFQUFFLElBUFg7QUFRUkMsaUJBQWEsRUFBRSxJQVJQO0FBU1JDLGNBQVUsRUFBRSxDQVRKO0FBVVJDLGtCQUFjLEVBQUUsS0FWUjtBQVdSQyxXQUFPLEVBQUUsQ0FYRDtBQVlSQyxlQUFXLEVBQUU7QUFBRUMsc0JBQWdCLEVBQUU7QUFB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QXFCLFVBQUNtQixLQUFEO0FBQUEscUJBQVcsTUFBSSxDQUFDZixZQUFMLENBQWtCZSxLQUFsQixFQUF5QmxCLElBQXpCLEVBQStCZ0IsaUJBQS9CLENBQVg7QUFBQSxhQUFyQjtBQUNIO0FBQ0o7QUFDSixPQTNCRDtBQTRCSDtBQWpFTDtBQUFBO0FBQUEsZ0NBbUVnQnJDLFVBbkVoQixFQW1FNEJnQyxRQW5FNUIsRUFtRXNDRixPQW5FdEMsRUFtRStDO0FBQUE7O0FBQ3ZDLFVBQUlYLEdBQUcsR0FBRyxFQUFWOztBQUNBLFVBQUksQ0FBQ3FCLEtBQUssQ0FBQ0MsT0FBTixDQUFjVCxRQUFkLENBQUwsRUFBOEI7QUFDMUJBLGdCQUFRLEdBQUcsQ0FBQ0EsUUFBRCxDQUFYO0FBQ0g7O0FBRURBLGNBQVEsQ0FBQ1osT0FBVCxDQUFpQixVQUFDdkIsR0FBRCxFQUFTO0FBQ3RCc0IsV0FBRyxDQUFDdEIsR0FBRCxDQUFILEdBQVcsWUFBTTtBQUNiaUMsaUJBQU8sQ0FBQzFELE9BQVIsd0JBQWdDNEIsVUFBaEMsR0FBOEMsQ0FBQyxNQUFJLENBQUM1RCxVQUFOLENBQTlDO0FBQ0gsU0FGRDtBQUdILE9BSkQ7QUFNQSxXQUFLQSxVQUFMLENBQWdCc0csU0FBaEIsQ0FBMEJ2QixHQUExQjtBQUNIO0FBaEZMOztBQUFBO0FBQUE7QUFtRk8sSUFBSXdCLFFBQVEsR0FBRyxJQUFJeEYsV0FBSixFQUFmIiwiZmlsZSI6Ii4vYXBwL2Zvcm1zL2ZpZWxkcy9lZGl0b3IuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IEJ1dHRvbnMsIHsgc3RyYXRlZ2llcyBhcyBidXR0b25TdHJhdGVnaWVzIH0gZnJvbSAnLi9lZGl0b3IvYnV0dG9ucyc7XG5pbXBvcnQgY29kZW1pcnJvciBmcm9tICdjb2RlbWlycm9yJztcbmltcG9ydCB7IHdhdGNoIH0gZnJvbSAnd2F0Y2hqcyc7XG5pbXBvcnQganN5YW1sIGZyb20gJ2pzLXlhbWwnO1xuXG5nbG9iYWwuanN5YW1sID0ganN5YW1sO1xuXG4vLyBNb2Rlc1xuaW1wb3J0ICdjb2RlbWlycm9yL21vZGUvY3NzL2Nzcyc7XG5pbXBvcnQgJ2NvZGVtaXJyb3IvbW9kZS9nZm0vZ2ZtJztcbmltcG9ydCAnY29kZW1pcnJvci9tb2RlL2h0bWxtaXhlZC9odG1sbWl4ZWQnO1xuaW1wb3J0ICdjb2RlbWlycm9yL21vZGUvamF2YXNjcmlwdC9qYXZhc2NyaXB0JztcbmltcG9ydCAnY29kZW1pcnJvci9tb2RlL21hcmtkb3duL21hcmtkb3duJztcbmltcG9ydCAnY29kZW1pcnJvci9tb2RlL3BocC9waHAnO1xuaW1wb3J0ICdjb2RlbWlycm9yL21vZGUvc2Fzcy9zYXNzJztcbmltcG9ydCAnY29kZW1pcnJvci9tb2RlL3R3aWcvdHdpZyc7XG5pbXBvcnQgJ2NvZGVtaXJyb3IvbW9kZS94bWwveG1sJztcbmltcG9ydCAnY29kZW1pcnJvci9tb2RlL3lhbWwveWFtbCc7XG5cbi8vIEFkZC1vbnNcbmltcG9ydCAnY29kZW1pcnJvci9hZGRvbi9lZGl0L2NvbnRpbnVlbGlzdCc7XG5pbXBvcnQgJ2NvZGVtaXJyb3IvYWRkb24vbW9kZS9vdmVybGF5JztcbmltcG9ydCAnY29kZW1pcnJvci9hZGRvbi9zZWxlY3Rpb24vYWN0aXZlLWxpbmUnO1xuaW1wb3J0ICdjb2RlbWlycm9yL2FkZG9uL2xpbnQvbGludCc7XG5pbXBvcnQgJ2NvZGVtaXJyb3IvYWRkb24vbGludC9saW50LmNzcyc7XG5pbXBvcnQgJ2NvZGVtaXJyb3IvYWRkb24vbGludC9jc3MtbGludCc7XG5pbXBvcnQgJ2NvZGVtaXJyb3IvYWRkb24vbGludC9qYXZhc2NyaXB0LWxpbnQnO1xuaW1wb3J0ICdjb2RlbWlycm9yL2FkZG9uL2xpbnQvanNvbi1saW50JztcbmltcG9ydCAnY29kZW1pcnJvci9hZGRvbi9saW50L3lhbWwtbGludCc7XG5cbmxldCBJU19NT1VTRURPV04gPSBmYWxzZTtcbmNvbnN0IFRoZW1lc01hcCA9IFsncGFwZXInXTtcbmNvbnN0IERlZmF1bHRzID0ge1xuICAgIGNvZGVtaXJyb3I6IHtcbiAgICAgICAgbW9kZTogJ2h0bWxtaXhlZCcsXG4gICAgICAgIHRoZW1lOiAncGFwZXInLFxuICAgICAgICBsaW5lV3JhcHBpbmc6IHRydWUsXG4gICAgICAgIGRyYWdEcm9wOiB0cnVlLFxuICAgICAgICBhdXRvQ2xvc2VUYWdzOiB0cnVlLFxuICAgICAgICBtYXRjaFRhZ3M6IHRydWUsXG4gICAgICAgIGF1dG9DbG9zZUJyYWNrZXRzOiB0cnVlLFxuICAgICAgICBtYXRjaEJyYWNrZXRzOiB0cnVlLFxuICAgICAgICBpbmRlbnRVbml0OiA0LFxuICAgICAgICBpbmRlbnRXaXRoVGFiczogZmFsc2UsXG4gICAgICAgIHRhYlNpemU6IDQsXG4gICAgICAgIGhpbnRPcHRpb25zOiB7IGNvbXBsZXRpb25TaW5nbGU6IGZhbHNlIH0sXG4gICAgICAgIGV4dHJhS2V5czogeyAnRW50ZXInOiAnbmV3bGluZUFuZEluZGVudENvbnRpbnVlTWFya2Rvd25MaXN0JyB9XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRWRpdG9yRmllbGQge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IGJvZHkgPSAkKCdib2R5Jyk7XG4gICAgICAgIHRoaXMuZWRpdG9ycyA9ICQoKTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgRGVmYXVsdHMsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmJ1dHRvbnMgPSBCdXR0b25zO1xuICAgICAgICB0aGlzLmJ1dHRvblN0cmF0ZWdpZXMgPSBidXR0b25TdHJhdGVnaWVzO1xuXG4gICAgICAgIHdhdGNoKEJ1dHRvbnMsICgvKiBrZXksIG1vZGlmaWVyLCBwcmV2LCBuZXh0ICovKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVkaXRvcnMuZWFjaCgoaW5kZXgsIGVkaXRvcikgPT4gJChlZGl0b3IpLmRhdGEoJ3Rvb2xiYXInKS5yZW5kZXJCdXR0b25zKCkpO1xuICAgICAgICB9KTtcblxuICAgICAgICAkKCdbZGF0YS1ncmF2LWVkaXRvcl0nKS5lYWNoKChpbmRleCwgZWRpdG9yKSA9PiB0aGlzLmFkZEVkaXRvcihlZGl0b3IpKTtcblxuICAgICAgICAkKCgpID0+IHsgYm9keS50cmlnZ2VyKCdncmF2LWVkaXRvci1yZWFkeScpOyB9KTtcbiAgICAgICAgYm9keS5vbignbXV0YXRpb24uX2dyYXYnLCB0aGlzLl9vbkFkZGVkTm9kZXMuYmluZCh0aGlzKSk7XG5cbiAgICAgICAgYm9keS5vbignbW91c2V1cC5fZ3JhdicsICgpID0+IHtcbiAgICAgICAgICAgIGlmICghSVNfTU9VU0VET1dOKSB7IHJldHVybiB0cnVlOyB9XG4gICAgICAgICAgICBib2R5LnVuYmluZCgnbW91c2Vtb3ZlLl9ncmF2Jyk7XG4gICAgICAgICAgICBJU19NT1VTRURPV04gPSBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGJvZHkub24oJ21vdXNlZG93bi5fZ3JhdicsICcuZ3Jhdi1lZGl0b3ItcmVzaXplcicsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgZXZlbnQgJiYgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIElTX01PVVNFRE9XTiA9IHRydWU7XG5cbiAgICAgICAgICAgIGxldCB0YXJnZXQgPSAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpO1xuICAgICAgICAgICAgbGV0IGNvbnRhaW5lciA9IHRhcmdldC5zaWJsaW5ncygnLmdyYXYtZWRpdG9yLWNvbnRlbnQnKTtcbiAgICAgICAgICAgIGxldCBlZGl0b3IgPSBjb250YWluZXIuZmluZCgnLkNvZGVNaXJyb3InKTtcbiAgICAgICAgICAgIGxldCBjb2RlbWlycm9yID0gY29udGFpbmVyLmZpbmQoJ3RleHRhcmVhJykuZGF0YSgnY29kZW1pcnJvcicpO1xuXG4gICAgICAgICAgICBib2R5Lm9uKCdtb3VzZW1vdmUuX2dyYXYnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBlZGl0b3IuY3NzKCdoZWlnaHQnLCBNYXRoLm1heCgxMDAsIGV2ZW50LnBhZ2VZIC0gY29udGFpbmVyLm9mZnNldCgpLnRvcCkpO1xuICAgICAgICAgICAgICAgIGNvZGVtaXJyb3IucmVmcmVzaCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFkZEJ1dHRvbihidXR0b24sIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgJiYgKG9wdGlvbnMuYmVmb3JlIHx8IG9wdGlvbnMuYWZ0ZXIpKSB7XG4gICAgICAgICAgICBsZXQgaW5kZXggPSB0aGlzLmJ1dHRvbnMubmF2aWdhdGlvbi5maW5kSW5kZXgoKG9iaikgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBrZXkgPSBPYmplY3Qua2V5cyhvYmopLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9ialtrZXldLmlkZW50aWZpZXIgPT09IChvcHRpb25zLmJlZm9yZSB8fCBvcHRpb25zLmFmdGVyKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoIX5pbmRleCkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSAnZW5kJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5idXR0b25zLm5hdmlnYXRpb24uc3BsaWNlKG9wdGlvbnMuYmVmb3JlID8gaW5kZXggOiBpbmRleCArIDEsIDAsIGJ1dHRvbik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zID09PSAnc3RhcnQnKSB7IHRoaXMuYnV0dG9ucy5uYXZpZ2F0aW9uLnNwbGljZSgwLCAwLCBidXR0b24pOyB9XG4gICAgICAgIGlmICghb3B0aW9ucyB8fCBvcHRpb25zID09PSAnZW5kJykgeyB0aGlzLmJ1dHRvbnMubmF2aWdhdGlvbi5wdXNoKGJ1dHRvbik7IH1cbiAgICB9XG5cbiAgICBhZGRFZGl0b3IodGV4dGFyZWEpIHtcbiAgICAgICAgdGV4dGFyZWEgPSAkKHRleHRhcmVhKTtcbiAgICAgICAgbGV0IG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29kZW1pcnJvcixcbiAgICAgICAgICAgIHRleHRhcmVhLmRhdGEoJ2dyYXYtZWRpdG9yJykuY29kZW1pcnJvclxuICAgICAgICApO1xuICAgICAgICBsZXQgdGhlbWUgPSBvcHRpb25zLnRoZW1lIHx8ICdwYXBlcic7XG5cbiAgICAgICAgdGhpcy5lZGl0b3JzID0gdGhpcy5lZGl0b3JzLmFkZCh0ZXh0YXJlYSk7XG4gICAgICAgIGlmICh0aGVtZSAmJiAhflRoZW1lc01hcC5pbmRleE9mKHRoZW1lKSkge1xuICAgICAgICAgICAgVGhlbWVzTWFwLnB1c2godGhlbWUpO1xuICAgICAgICAgICAgLy8gbGV0IHRoZW1lQ1NTID0gYGh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2NvZGVtaXJyb3IvNS4xMi4wL3RoZW1lLyR7dGhlbWV9Lm1pbi5jc3NgO1xuICAgICAgICAgICAgLy8gJCgnaGVhZCcpLmFwcGVuZCgkKCc8bGluayByZWw9XCJzdHlsZXNoZWV0XCIgdHlwZT1cInRleHQvY3NzXCIgLz4nKS5hdHRyKCdocmVmJywgdGhlbWVDU1MpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLm1vZGUgPT09ICd5YW1sJykge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihvcHRpb25zLmV4dHJhS2V5cywgeyBUYWI6IGZ1bmN0aW9uKGNtKSB7IGNtLnJlcGxhY2VTZWxlY3Rpb24oJyAgICAnLCAnZW5kJyk7IH19KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBlZGl0b3IgPSBjb2RlbWlycm9yLmZyb21UZXh0QXJlYSh0ZXh0YXJlYS5nZXQoMCksIG9wdGlvbnMpO1xuICAgICAgICB0ZXh0YXJlYS5kYXRhKCdjb2RlbWlycm9yJywgZWRpdG9yKTtcbiAgICAgICAgdGV4dGFyZWEuZGF0YSgndG9vbGJhcicsIG5ldyBUb29sYmFyKHRleHRhcmVhKSk7XG4gICAgICAgIHRleHRhcmVhLmFkZENsYXNzKCdjb2RlLW1pcnJvcmVkJyk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMudG9vbGJhciA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRleHRhcmVhLmRhdGEoJ3Rvb2xiYXInKS51aS5uYXZpZ2F0aW9uLmFkZENsYXNzKCdncmF2LWVkaXRvci1oaWRlLXRvb2xiYXInKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVkaXRvci5vbignY2hhbmdlJywgKCkgPT4gZWRpdG9yLnNhdmUoKSk7XG4gICAgfVxuXG4gICAgX29uQWRkZWROb2RlcyhldmVudCwgdGFyZ2V0LyogLCByZWNvcmQsIGluc3RhbmNlICovKSB7XG4gICAgICAgIGxldCBlZGl0b3JzID0gJCh0YXJnZXQpLmZpbmQoJ1tkYXRhLWdyYXYtZWRpdG9yXScpO1xuICAgICAgICBpZiAoIWVkaXRvcnMubGVuZ3RoKSB7IHJldHVybjsgfVxuXG4gICAgICAgIGVkaXRvcnMuZWFjaCgoaW5kZXgsIGVkaXRvcikgPT4ge1xuICAgICAgICAgICAgZWRpdG9yID0gJChlZGl0b3IpO1xuICAgICAgICAgICAgaWYgKCF+dGhpcy5lZGl0b3JzLmluZGV4KGVkaXRvcikpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEVkaXRvcihlZGl0b3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUb29sYmFyIHtcbiAgICBzdGF0aWMgdGVtcGxhdGVzKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmF2aWdhdGlvbjogYFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmF2LWVkaXRvci10b29sYmFyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmF2LWVkaXRvci1hY3Rpb25zXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmF2LWVkaXRvci1tb2Rlc1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgYFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGVkaXRvcikge1xuICAgICAgICB0aGlzLmVkaXRvciA9ICQoZWRpdG9yKTtcbiAgICAgICAgdGhpcy5jb2RlbWlycm9yID0gdGhpcy5lZGl0b3IuZGF0YSgnY29kZW1pcnJvcicpO1xuICAgICAgICB0aGlzLmJ1dHRvbnMgPSBCdXR0b25zLm5hdmlnYXRpb247XG4gICAgICAgIHRoaXMudWkgPSB7XG4gICAgICAgICAgICBuYXZpZ2F0aW9uOiAkKFRvb2xiYXIudGVtcGxhdGVzKCkubmF2aWdhdGlvbilcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmVkaXRvci5wYXJlbnQoJy5ncmF2LWVkaXRvci1jb250ZW50JylcbiAgICAgICAgICAgIC5iZWZvcmUodGhpcy51aS5uYXZpZ2F0aW9uKVxuICAgICAgICAgICAgLmFmdGVyKHRoaXMudWkuc3RhdGVzKTtcblxuICAgICAgICB0aGlzLnJlbmRlckJ1dHRvbnMoKTtcbiAgICB9XG5cbiAgICByZW5kZXJCdXR0b25zKCkge1xuICAgICAgICBsZXQgbWFwID0geyAnYWN0aW9ucyc6ICduYXZpZ2F0aW9uJywgJ21vZGVzJzogJ3N0YXRlcyd9O1xuXG4gICAgICAgIFsnYWN0aW9ucycsICdtb2RlcyddLmZvckVhY2goKHR5cGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMudWkubmF2aWdhdGlvbi5maW5kKGAuZ3Jhdi1lZGl0b3ItJHt0eXBlfWApLmVtcHR5KCkuYXBwZW5kKCc8dWwgLz4nKTtcbiAgICAgICAgICAgIEJ1dHRvbnNbbWFwW3R5cGVdXS5mb3JFYWNoKChidXR0b24pID0+IHRoaXMucmVuZGVyQnV0dG9uKGJ1dHRvbiwgdHlwZSkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZW5kZXJCdXR0b24oYnV0dG9uLCB0eXBlLCBsb2NhdGlvbiA9IG51bGwpIHtcbiAgICAgICAgT2JqZWN0LmtleXMoYnV0dG9uKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgIGxldCBvYmogPSBidXR0b25ba2V5XTtcbiAgICAgICAgICAgIGlmICghb2JqLm1vZGVzKSB7IG9iai5tb2RlcyA9IFtdOyB9XG4gICAgICAgICAgICBpZiAoIX50aGlzLmNvZGVtaXJyb3Iub3B0aW9ucy5pZ25vcmUuaW5kZXhPZihrZXkpICYmICghb2JqLm1vZGVzLmxlbmd0aCB8fCBvYmoubW9kZXMuaW5kZXhPZih0aGlzLmNvZGVtaXJyb3Iub3B0aW9ucy5tb2RlKSA+IC0xKSkge1xuICAgICAgICAgICAgICAgIGxldCBoaW50ID0gb2JqLnRpdGxlID8gYGRhdGEtaGludD1cIiR7b2JqLnRpdGxlfVwiYCA6ICcnO1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50ID0gJChgPGxpIGNsYXNzPVwiZ3Jhdi1lZGl0b3ItYnV0dG9uLSR7a2V5fVwiPjxhIGNsYXNzPVwiaGludC0tdG9wXCIgJHtoaW50fT4ke29iai5sYWJlbH08L2E+PC9saT5gKTtcbiAgICAgICAgICAgICAgICAobG9jYXRpb24gfHwgdGhpcy51aS5uYXZpZ2F0aW9uLmZpbmQoYC5ncmF2LWVkaXRvci0ke3R5cGV9IHVsOm5vdCguZHJvcGRvd24tbWVudSlgKSkuYXBwZW5kKGVsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKG9iai5zaG9ydGN1dCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZFNob3J0Y3V0KG9iai5pZGVudGlmaWVyLCBvYmouc2hvcnRjdXQsIGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIG9iai5hY3Rpb24gJiYgb2JqLmFjdGlvbi5jYWxsKG9iai5hY3Rpb24sIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZW1pcnJvcjogdGhpcy5jb2RlbWlycm9yLFxuICAgICAgICAgICAgICAgICAgICBidXR0b246IGVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIHRleHRhcmVhOiB0aGlzLmVkaXRvcixcbiAgICAgICAgICAgICAgICAgICAgdWk6IHRoaXMudWlcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGlmIChvYmouY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVuQ29udGFpbmVyID0gJCgnPHVsIGNsYXNzPVwiZHJvcGRvd24tbWVudVwiIC8+Jyk7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuYWRkQ2xhc3MoJ2J1dHRvbi1ncm91cCcpLmZpbmQoJ2EnKS53cmFwKCc8ZGl2IGNsYXNzPVwiZHJvcGRvd24tdG9nZ2xlXCIgZGF0YS10b2dnbGU9XCJkcm9wZG93blwiPjwvZGl2PicpO1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmZpbmQoJ2EnKS5hcHBlbmQoJyA8aSBjbGFzcz1cImZhIGZhLWNhcmV0LWRvd25cIj48L2k+Jyk7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuYXBwZW5kKGNoaWxkcmVuQ29udGFpbmVyKTtcbiAgICAgICAgICAgICAgICAgICAgb2JqLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB0aGlzLnJlbmRlckJ1dHRvbihjaGlsZCwgdHlwZSwgY2hpbGRyZW5Db250YWluZXIpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFkZFNob3J0Y3V0KGlkZW50aWZpZXIsIHNob3J0Y3V0LCBlbGVtZW50KSB7XG4gICAgICAgIGxldCBtYXAgPSB7fTtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHNob3J0Y3V0KSkge1xuICAgICAgICAgICAgc2hvcnRjdXQgPSBbc2hvcnRjdXRdO1xuICAgICAgICB9XG5cbiAgICAgICAgc2hvcnRjdXQuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICBtYXBba2V5XSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnRyaWdnZXIoYGNsaWNrLmVkaXRvci4ke2lkZW50aWZpZXJ9YCwgW3RoaXMuY29kZW1pcnJvcl0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jb2RlbWlycm9yLmFkZEtleU1hcChtYXApO1xuICAgIH1cbn1cblxuZXhwb3J0IGxldCBJbnN0YW5jZSA9IG5ldyBFZGl0b3JGaWVsZCgpO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./app/forms/fields/editor.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ EditorField),\n/* harmony export */ \"Toolbar\": () => (/* binding */ Toolbar),\n/* harmony export */ \"Instance\": () => (/* binding */ Instance)\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _editor_buttons__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./editor/buttons */ \"./app/forms/fields/editor/buttons.js\");\n/* harmony import */ var codemirror__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! codemirror */ \"./node_modules/codemirror/lib/codemirror.js\");\n/* harmony import */ var codemirror__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(codemirror__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var watchjs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! watchjs */ \"./node_modules/watchjs/src/watch.js\");\n/* harmony import */ var watchjs__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(watchjs__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var js_yaml__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! js-yaml */ \"./node_modules/js-yaml/dist/js-yaml.mjs\");\n/* harmony import */ var codemirror_mode_css_css__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! codemirror/mode/css/css */ \"./node_modules/codemirror/mode/css/css.js\");\n/* harmony import */ var codemirror_mode_css_css__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(codemirror_mode_css_css__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var codemirror_mode_gfm_gfm__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! codemirror/mode/gfm/gfm */ \"./node_modules/codemirror/mode/gfm/gfm.js\");\n/* harmony import */ var codemirror_mode_gfm_gfm__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(codemirror_mode_gfm_gfm__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var codemirror_mode_htmlmixed_htmlmixed__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! codemirror/mode/htmlmixed/htmlmixed */ \"./node_modules/codemirror/mode/htmlmixed/htmlmixed.js\");\n/* harmony import */ var codemirror_mode_htmlmixed_htmlmixed__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(codemirror_mode_htmlmixed_htmlmixed__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var codemirror_mode_javascript_javascript__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! codemirror/mode/javascript/javascript */ \"./node_modules/codemirror/mode/javascript/javascript.js\");\n/* harmony import */ var codemirror_mode_javascript_javascript__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(codemirror_mode_javascript_javascript__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var codemirror_mode_markdown_markdown__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! codemirror/mode/markdown/markdown */ \"./node_modules/codemirror/mode/markdown/markdown.js\");\n/* harmony import */ var codemirror_mode_markdown_markdown__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(codemirror_mode_markdown_markdown__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var codemirror_mode_php_php__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! codemirror/mode/php/php */ \"./node_modules/codemirror/mode/php/php.js\");\n/* harmony import */ var codemirror_mode_php_php__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(codemirror_mode_php_php__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var codemirror_mode_sass_sass__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! codemirror/mode/sass/sass */ \"./node_modules/codemirror/mode/sass/sass.js\");\n/* harmony import */ var codemirror_mode_sass_sass__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(codemirror_mode_sass_sass__WEBPACK_IMPORTED_MODULE_11__);\n/* harmony import */ var codemirror_mode_twig_twig__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! codemirror/mode/twig/twig */ \"./node_modules/codemirror/mode/twig/twig.js\");\n/* harmony import */ var codemirror_mode_twig_twig__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(codemirror_mode_twig_twig__WEBPACK_IMPORTED_MODULE_12__);\n/* harmony import */ var codemirror_mode_xml_xml__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! codemirror/mode/xml/xml */ \"./node_modules/codemirror/mode/xml/xml.js\");\n/* harmony import */ var codemirror_mode_xml_xml__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(codemirror_mode_xml_xml__WEBPACK_IMPORTED_MODULE_13__);\n/* harmony import */ var codemirror_mode_yaml_yaml__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! codemirror/mode/yaml/yaml */ \"./node_modules/codemirror/mode/yaml/yaml.js\");\n/* harmony import */ var codemirror_mode_yaml_yaml__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(codemirror_mode_yaml_yaml__WEBPACK_IMPORTED_MODULE_14__);\n/* harmony import */ var codemirror_addon_edit_continuelist__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! codemirror/addon/edit/continuelist */ \"./node_modules/codemirror/addon/edit/continuelist.js\");\n/* harmony import */ var codemirror_addon_edit_continuelist__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(codemirror_addon_edit_continuelist__WEBPACK_IMPORTED_MODULE_15__);\n/* harmony import */ var codemirror_addon_mode_overlay__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! codemirror/addon/mode/overlay */ \"./node_modules/codemirror/addon/mode/overlay.js\");\n/* harmony import */ var codemirror_addon_mode_overlay__WEBPACK_IMPORTED_MODULE_16___default = /*#__PURE__*/__webpack_require__.n(codemirror_addon_mode_overlay__WEBPACK_IMPORTED_MODULE_16__);\n/* harmony import */ var codemirror_addon_selection_active_line__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! codemirror/addon/selection/active-line */ \"./node_modules/codemirror/addon/selection/active-line.js\");\n/* harmony import */ var codemirror_addon_selection_active_line__WEBPACK_IMPORTED_MODULE_17___default = /*#__PURE__*/__webpack_require__.n(codemirror_addon_selection_active_line__WEBPACK_IMPORTED_MODULE_17__);\n/* harmony import */ var codemirror_addon_lint_lint__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! codemirror/addon/lint/lint */ \"./node_modules/codemirror/addon/lint/lint.js\");\n/* harmony import */ var codemirror_addon_lint_lint__WEBPACK_IMPORTED_MODULE_18___default = /*#__PURE__*/__webpack_require__.n(codemirror_addon_lint_lint__WEBPACK_IMPORTED_MODULE_18__);\n/* harmony import */ var codemirror_addon_lint_lint_css__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! codemirror/addon/lint/lint.css */ \"./node_modules/codemirror/addon/lint/lint.css\");\n/* harmony import */ var codemirror_addon_lint_css_lint__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! codemirror/addon/lint/css-lint */ \"./node_modules/codemirror/addon/lint/css-lint.js\");\n/* harmony import */ var codemirror_addon_lint_css_lint__WEBPACK_IMPORTED_MODULE_20___default = /*#__PURE__*/__webpack_require__.n(codemirror_addon_lint_css_lint__WEBPACK_IMPORTED_MODULE_20__);\n/* harmony import */ var codemirror_addon_lint_javascript_lint__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! codemirror/addon/lint/javascript-lint */ \"./node_modules/codemirror/addon/lint/javascript-lint.js\");\n/* harmony import */ var codemirror_addon_lint_javascript_lint__WEBPACK_IMPORTED_MODULE_21___default = /*#__PURE__*/__webpack_require__.n(codemirror_addon_lint_javascript_lint__WEBPACK_IMPORTED_MODULE_21__);\n/* harmony import */ var codemirror_addon_lint_json_lint__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! codemirror/addon/lint/json-lint */ \"./node_modules/codemirror/addon/lint/json-lint.js\");\n/* harmony import */ var codemirror_addon_lint_json_lint__WEBPACK_IMPORTED_MODULE_22___default = /*#__PURE__*/__webpack_require__.n(codemirror_addon_lint_json_lint__WEBPACK_IMPORTED_MODULE_22__);\n/* harmony import */ var codemirror_addon_lint_yaml_lint__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! codemirror/addon/lint/yaml-lint */ \"./node_modules/codemirror/addon/lint/yaml-lint.js\");\n/* harmony import */ var codemirror_addon_lint_yaml_lint__WEBPACK_IMPORTED_MODULE_23___default = /*#__PURE__*/__webpack_require__.n(codemirror_addon_lint_yaml_lint__WEBPACK_IMPORTED_MODULE_23__);\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\n\n\n__webpack_require__.g.jsyaml = js_yaml__WEBPACK_IMPORTED_MODULE_4__.default; // Modes\n\n\n\n\n\n\n\n\n\n\n // Add-ons\n\n\n\n\n\n\n\n\n\n\nvar IS_MOUSEDOWN = false;\nvar ThemesMap = ['paper'];\nvar Defaults = {\n codemirror: {\n mode: 'htmlmixed',\n theme: 'paper',\n lineWrapping: true,\n dragDrop: true,\n autoCloseTags: true,\n matchTags: true,\n autoCloseBrackets: true,\n matchBrackets: true,\n indentUnit: 4,\n indentWithTabs: false,\n tabSize: 4,\n hintOptions: {\n completionSingle: false\n },\n extraKeys: {\n 'Enter': 'newlineAndIndentContinueMarkdownList'\n }\n }\n};\n\nvar EditorField = /*#__PURE__*/function () {\n function EditorField(options) {\n var _this = this;\n\n _classCallCheck(this, EditorField);\n\n var body = jquery__WEBPACK_IMPORTED_MODULE_0___default()('body');\n this.editors = jquery__WEBPACK_IMPORTED_MODULE_0___default()();\n this.options = Object.assign({}, Defaults, options);\n this.buttons = _editor_buttons__WEBPACK_IMPORTED_MODULE_1__.default;\n this.buttonStrategies = _editor_buttons__WEBPACK_IMPORTED_MODULE_1__.strategies;\n (0,watchjs__WEBPACK_IMPORTED_MODULE_3__.watch)(_editor_buttons__WEBPACK_IMPORTED_MODULE_1__.default, function ()\n /* key, modifier, prev, next */\n {\n _this.editors.each(function (index, editor) {\n return jquery__WEBPACK_IMPORTED_MODULE_0___default()(editor).data('toolbar').renderButtons();\n });\n });\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-grav-editor]').each(function (index, editor) {\n return _this.addEditor(editor);\n });\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(function () {\n body.trigger('grav-editor-ready');\n });\n body.on('mutation._grav', this._onAddedNodes.bind(this));\n body.on('mouseup._grav', function () {\n if (!IS_MOUSEDOWN) {\n return true;\n }\n\n body.unbind('mousemove._grav');\n IS_MOUSEDOWN = false;\n });\n body.on('mousedown._grav', '.grav-editor-resizer', function (event) {\n event && event.preventDefault();\n IS_MOUSEDOWN = true;\n var target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.currentTarget);\n var container = target.siblings('.grav-editor-content');\n var editor = container.find('.CodeMirror');\n var codemirror = container.find('textarea').data('codemirror');\n body.on('mousemove._grav', function (event) {\n editor.css('height', Math.max(100, event.pageY - container.offset().top));\n codemirror.refresh();\n });\n });\n }\n\n _createClass(EditorField, [{\n key: \"addButton\",\n value: function addButton(button, options) {\n if (options && (options.before || options.after)) {\n var index = this.buttons.navigation.findIndex(function (obj) {\n var key = Object.keys(obj).shift();\n return obj[key].identifier === (options.before || options.after);\n });\n\n if (!~index) {\n options = 'end';\n } else {\n this.buttons.navigation.splice(options.before ? index : index + 1, 0, button);\n }\n }\n\n if (options === 'start') {\n this.buttons.navigation.splice(0, 0, button);\n }\n\n if (!options || options === 'end') {\n this.buttons.navigation.push(button);\n }\n }\n }, {\n key: \"addEditor\",\n value: function addEditor(textarea) {\n textarea = jquery__WEBPACK_IMPORTED_MODULE_0___default()(textarea);\n var options = Object.assign({}, this.options.codemirror, textarea.data('grav-editor').codemirror);\n var theme = options.theme || 'paper';\n this.editors = this.editors.add(textarea);\n\n if (theme && !~ThemesMap.indexOf(theme)) {\n ThemesMap.push(theme); // let themeCSS = `https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.12.0/theme/${theme}.min.css`;\n // $('head').append($('').attr('href', themeCSS));\n }\n\n if (options.mode === 'yaml') {\n Object.assign(options.extraKeys, {\n Tab: function Tab(cm) {\n cm.replaceSelection(' ', 'end');\n }\n });\n }\n\n var editor = codemirror__WEBPACK_IMPORTED_MODULE_2___default().fromTextArea(textarea.get(0), options);\n textarea.data('codemirror', editor);\n textarea.data('toolbar', new Toolbar(textarea));\n textarea.addClass('code-mirrored');\n\n if (options.toolbar === false) {\n textarea.data('toolbar').ui.navigation.addClass('grav-editor-hide-toolbar');\n }\n\n editor.on('change', function () {\n return editor.save();\n });\n }\n }, {\n key: \"_onAddedNodes\",\n value: function _onAddedNodes(event, target\n /* , record, instance */\n ) {\n var _this2 = this;\n\n var editors = jquery__WEBPACK_IMPORTED_MODULE_0___default()(target).find('[data-grav-editor]');\n\n if (!editors.length) {\n return;\n }\n\n editors.each(function (index, editor) {\n editor = jquery__WEBPACK_IMPORTED_MODULE_0___default()(editor);\n\n if (!~_this2.editors.index(editor)) {\n _this2.addEditor(editor);\n }\n });\n }\n }]);\n\n return EditorField;\n}();\n\n\nvar Toolbar = /*#__PURE__*/function () {\n function Toolbar(editor) {\n _classCallCheck(this, Toolbar);\n\n this.editor = jquery__WEBPACK_IMPORTED_MODULE_0___default()(editor);\n this.codemirror = this.editor.data('codemirror');\n this.buttons = _editor_buttons__WEBPACK_IMPORTED_MODULE_1__.default.navigation;\n this.ui = {\n navigation: jquery__WEBPACK_IMPORTED_MODULE_0___default()(Toolbar.templates().navigation)\n };\n this.editor.parent('.grav-editor-content').before(this.ui.navigation).after(this.ui.states);\n this.renderButtons();\n }\n\n _createClass(Toolbar, [{\n key: \"renderButtons\",\n value: function renderButtons() {\n var _this3 = this;\n\n var map = {\n 'actions': 'navigation',\n 'modes': 'states'\n };\n ['actions', 'modes'].forEach(function (type) {\n _this3.ui.navigation.find(\".grav-editor-\".concat(type)).empty().append('
        ');\n\n _editor_buttons__WEBPACK_IMPORTED_MODULE_1__.default[map[type]].forEach(function (button) {\n return _this3.renderButton(button, type);\n });\n });\n }\n }, {\n key: \"renderButton\",\n value: function renderButton(button, type) {\n var _this4 = this;\n\n var location = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n Object.keys(button).forEach(function (key) {\n var obj = button[key];\n\n if (!obj.modes) {\n obj.modes = [];\n }\n\n if (!~_this4.codemirror.options.ignore.indexOf(key) && (!obj.modes.length || obj.modes.indexOf(_this4.codemirror.options.mode) > -1)) {\n var hint = obj.title ? \"data-hint=\\\"\".concat(obj.title, \"\\\"\") : '';\n var element = jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"
      • \").concat(obj.label, \"
      • \"));\n\n (location || _this4.ui.navigation.find(\".grav-editor-\".concat(type, \" ul:not(.dropdown-menu)\"))).append(element);\n\n if (obj.shortcut) {\n _this4.addShortcut(obj.identifier, obj.shortcut, element);\n }\n\n obj.action && obj.action.call(obj.action, {\n codemirror: _this4.codemirror,\n button: element,\n textarea: _this4.editor,\n ui: _this4.ui\n });\n\n if (obj.children) {\n var childrenContainer = jquery__WEBPACK_IMPORTED_MODULE_0___default()('
          ');\n element.addClass('button-group').find('a').wrap('
          ');\n element.find('a').append(' ');\n element.append(childrenContainer);\n obj.children.forEach(function (child) {\n return _this4.renderButton(child, type, childrenContainer);\n });\n }\n }\n });\n }\n }, {\n key: \"addShortcut\",\n value: function addShortcut(identifier, shortcut, element) {\n var _this5 = this;\n\n var map = {};\n\n if (!Array.isArray(shortcut)) {\n shortcut = [shortcut];\n }\n\n shortcut.forEach(function (key) {\n map[key] = function () {\n element.trigger(\"click.editor.\".concat(identifier), [_this5.codemirror]);\n };\n });\n this.codemirror.addKeyMap(map);\n }\n }], [{\n key: \"templates\",\n value: function templates() {\n return {\n navigation: \"\\n
          \\n
          \\n
          \\n
          \\n \"\n };\n }\n }]);\n\n return Toolbar;\n}();\nvar Instance = new EditorField();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL2Zvcm1zL2ZpZWxkcy9lZGl0b3IuanM/MzJkMyJdLCJuYW1lcyI6WyJnbG9iYWwiLCJqc3lhbWwiLCJJU19NT1VTRURPV04iLCJUaGVtZXNNYXAiLCJEZWZhdWx0cyIsImNvZGVtaXJyb3IiLCJtb2RlIiwidGhlbWUiLCJsaW5lV3JhcHBpbmciLCJkcmFnRHJvcCIsImF1dG9DbG9zZVRhZ3MiLCJtYXRjaFRhZ3MiLCJhdXRvQ2xvc2VCcmFja2V0cyIsIm1hdGNoQnJhY2tldHMiLCJpbmRlbnRVbml0IiwiaW5kZW50V2l0aFRhYnMiLCJ0YWJTaXplIiwiaGludE9wdGlvbnMiLCJjb21wbGV0aW9uU2luZ2xlIiwiZXh0cmFLZXlzIiwiRWRpdG9yRmllbGQiLCJvcHRpb25zIiwiYm9keSIsIiQiLCJlZGl0b3JzIiwiT2JqZWN0IiwiYXNzaWduIiwiYnV0dG9ucyIsIkJ1dHRvbnMiLCJidXR0b25TdHJhdGVnaWVzIiwid2F0Y2giLCJlYWNoIiwiaW5kZXgiLCJlZGl0b3IiLCJkYXRhIiwicmVuZGVyQnV0dG9ucyIsImFkZEVkaXRvciIsInRyaWdnZXIiLCJvbiIsIl9vbkFkZGVkTm9kZXMiLCJiaW5kIiwidW5iaW5kIiwiZXZlbnQiLCJwcmV2ZW50RGVmYXVsdCIsInRhcmdldCIsImN1cnJlbnRUYXJnZXQiLCJjb250YWluZXIiLCJzaWJsaW5ncyIsImZpbmQiLCJjc3MiLCJNYXRoIiwibWF4IiwicGFnZVkiLCJvZmZzZXQiLCJ0b3AiLCJyZWZyZXNoIiwiYnV0dG9uIiwiYmVmb3JlIiwiYWZ0ZXIiLCJuYXZpZ2F0aW9uIiwiZmluZEluZGV4Iiwib2JqIiwia2V5Iiwia2V5cyIsInNoaWZ0IiwiaWRlbnRpZmllciIsInNwbGljZSIsInB1c2giLCJ0ZXh0YXJlYSIsImFkZCIsImluZGV4T2YiLCJUYWIiLCJjbSIsInJlcGxhY2VTZWxlY3Rpb24iLCJnZXQiLCJUb29sYmFyIiwiYWRkQ2xhc3MiLCJ0b29sYmFyIiwidWkiLCJzYXZlIiwibGVuZ3RoIiwidGVtcGxhdGVzIiwicGFyZW50Iiwic3RhdGVzIiwibWFwIiwiZm9yRWFjaCIsInR5cGUiLCJlbXB0eSIsImFwcGVuZCIsInJlbmRlckJ1dHRvbiIsImxvY2F0aW9uIiwibW9kZXMiLCJpZ25vcmUiLCJoaW50IiwidGl0bGUiLCJlbGVtZW50IiwibGFiZWwiLCJzaG9ydGN1dCIsImFkZFNob3J0Y3V0IiwiYWN0aW9uIiwiY2FsbCIsImNoaWxkcmVuIiwiY2hpbGRyZW5Db250YWluZXIiLCJ3cmFwIiwiY2hpbGQiLCJBcnJheSIsImlzQXJyYXkiLCJhZGRLZXlNYXAiLCJJbnN0YW5jZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBQSxxQkFBTSxDQUFDQyxNQUFQLEdBQWdCQSw0Q0FBaEIsQyxDQUVBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtDQUdBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBLElBQUlDLFlBQVksR0FBRyxLQUFuQjtBQUNBLElBQU1DLFNBQVMsR0FBRyxDQUFDLE9BQUQsQ0FBbEI7QUFDQSxJQUFNQyxRQUFRLEdBQUc7QUFDYkMsWUFBVSxFQUFFO0FBQ1JDLFFBQUksRUFBRSxXQURFO0FBRVJDLFNBQUssRUFBRSxPQUZDO0FBR1JDLGdCQUFZLEVBQUUsSUFITjtBQUlSQyxZQUFRLEVBQUUsSUFKRjtBQUtSQyxpQkFBYSxFQUFFLElBTFA7QUFNUkMsYUFBUyxFQUFFLElBTkg7QUFPUkMscUJBQWlCLEVBQUUsSUFQWDtBQVFSQyxpQkFBYSxFQUFFLElBUlA7QUFTUkMsY0FBVSxFQUFFLENBVEo7QUFVUkMsa0JBQWMsRUFBRSxLQVZSO0FBV1JDLFdBQU8sRUFBRSxDQVhEO0FBWVJDLGVBQVcsRUFBRTtBQUFFQyxzQkFBZ0IsRUFBRTtBQUFw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VyxNQUFJLENBQUNmLFlBQUwsQ0FBa0JlLEtBQWxCLEVBQXlCbEIsSUFBekIsRUFBK0JnQixpQkFBL0IsQ0FBWDtBQUFBLGFBQXJCO0FBQ0g7QUFDSjtBQUNKLE9BM0JEO0FBNEJIO0FBakVMO0FBQUE7QUFBQSxXQW1FSSxxQkFBWXJDLFVBQVosRUFBd0JnQyxRQUF4QixFQUFrQ0YsT0FBbEMsRUFBMkM7QUFBQTs7QUFDdkMsVUFBSVgsR0FBRyxHQUFHLEVBQVY7O0FBQ0EsVUFBSSxDQUFDcUIsS0FBSyxDQUFDQyxPQUFOLENBQWNULFFBQWQsQ0FBTCxFQUE4QjtBQUMxQkEsZ0JBQVEsR0FBRyxDQUFDQSxRQUFELENBQVg7QUFDSDs7QUFFREEsY0FBUSxDQUFDWixPQUFULENBQWlCLFVBQUN2QixHQUFELEVBQVM7QUFDdEJzQixXQUFHLENBQUN0QixHQUFELENBQUgsR0FBVyxZQUFNO0FBQ2JpQyxpQkFBTyxDQUFDMUQsT0FBUix3QkFBZ0M0QixVQUFoQyxHQUE4QyxDQUFDLE1BQUksQ0FBQzVELFVBQU4sQ0FBOUM7QUFDSCxTQUZEO0FBR0gsT0FKRDtBQU1BLFdBQUtBLFVBQUwsQ0FBZ0JzRyxTQUFoQixDQUEwQnZCLEdBQTFCO0FBQ0g7QUFoRkw7QUFBQTtBQUFBLFdBQ0kscUJBQW1CO0FBQ2YsYUFBTztBQUNIekIsa0JBQVU7QUFEUCxPQUFQO0FBUUg7QUFWTDs7QUFBQTtBQUFBO0FBbUZPLElBQUlpRCxRQUFRLEdBQUcsSUFBSXhGLFdBQUosRUFBZiIsImZpbGUiOiIuL2FwcC9mb3Jtcy9maWVsZHMvZWRpdG9yLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCBCdXR0b25zLCB7IHN0cmF0ZWdpZXMgYXMgYnV0dG9uU3RyYXRlZ2llcyB9IGZyb20gJy4vZWRpdG9yL2J1dHRvbnMnO1xuaW1wb3J0IGNvZGVtaXJyb3IgZnJvbSAnY29kZW1pcnJvcic7XG5pbXBvcnQgeyB3YXRjaCB9IGZyb20gJ3dhdGNoanMnO1xuaW1wb3J0IGpzeWFtbCBmcm9tICdqcy15YW1sJztcblxuZ2xvYmFsLmpzeWFtbCA9IGpzeWFtbDtcblxuLy8gTW9kZXNcbmltcG9ydCAnY29kZW1pcnJvci9tb2RlL2Nzcy9jc3MnO1xuaW1wb3J0ICdjb2RlbWlycm9yL21vZGUvZ2ZtL2dmbSc7XG5pbXBvcnQgJ2NvZGVtaXJyb3IvbW9kZS9odG1sbWl4ZWQvaHRtbG1peGVkJztcbmltcG9ydCAnY29kZW1pcnJvci9tb2RlL2phdmFzY3JpcHQvamF2YXNjcmlwdCc7XG5pbXBvcnQgJ2NvZGVtaXJyb3IvbW9kZS9tYXJrZG93bi9tYXJrZG93bic7XG5pbXBvcnQgJ2NvZGVtaXJyb3IvbW9kZS9waHAvcGhwJztcbmltcG9ydCAnY29kZW1pcnJvci9tb2RlL3Nhc3Mvc2Fzcyc7XG5pbXBvcnQgJ2NvZGVtaXJyb3IvbW9kZS90d2lnL3R3aWcnO1xuaW1wb3J0ICdjb2RlbWlycm9yL21vZGUveG1sL3htbCc7XG5pbXBvcnQgJ2NvZGVtaXJyb3IvbW9kZS95YW1sL3lhbWwnO1xuXG4vLyBBZGQtb25zXG5pbXBvcnQgJ2NvZGVtaXJyb3IvYWRkb24vZWRpdC9jb250aW51ZWxpc3QnO1xuaW1wb3J0ICdjb2RlbWlycm9yL2FkZG9uL21vZGUvb3ZlcmxheSc7XG5pbXBvcnQgJ2NvZGVtaXJyb3IvYWRkb24vc2VsZWN0aW9uL2FjdGl2ZS1saW5lJztcbmltcG9ydCAnY29kZW1pcnJvci9hZGRvbi9saW50L2xpbnQnO1xuaW1wb3J0ICdjb2RlbWlycm9yL2FkZG9uL2xpbnQvbGludC5jc3MnO1xuaW1wb3J0ICdjb2RlbWlycm9yL2FkZG9uL2xpbnQvY3NzLWxpbnQnO1xuaW1wb3J0ICdjb2RlbWlycm9yL2FkZG9uL2xpbnQvamF2YXNjcmlwdC1saW50JztcbmltcG9ydCAnY29kZW1pcnJvci9hZGRvbi9saW50L2pzb24tbGludCc7XG5pbXBvcnQgJ2NvZGVtaXJyb3IvYWRkb24vbGludC95YW1sLWxpbnQnO1xuXG5sZXQgSVNfTU9VU0VET1dOID0gZmFsc2U7XG5jb25zdCBUaGVtZXNNYXAgPSBbJ3BhcGVyJ107XG5jb25zdCBEZWZhdWx0cyA9IHtcbiAgICBjb2RlbWlycm9yOiB7XG4gICAgICAgIG1vZGU6ICdodG1sbWl4ZWQnLFxuICAgICAgICB0aGVtZTogJ3BhcGVyJyxcbiAgICAgICAgbGluZVdyYXBwaW5nOiB0cnVlLFxuICAgICAgICBkcmFnRHJvcDogdHJ1ZSxcbiAgICAgICAgYXV0b0Nsb3NlVGFnczogdHJ1ZSxcbiAgICAgICAgbWF0Y2hUYWdzOiB0cnVlLFxuICAgICAgICBhdXRvQ2xvc2VCcmFja2V0czogdHJ1ZSxcbiAgICAgICAgbWF0Y2hCcmFja2V0czogdHJ1ZSxcbiAgICAgICAgaW5kZW50VW5pdDogNCxcbiAgICAgICAgaW5kZW50V2l0aFRhYnM6IGZhbHNlLFxuICAgICAgICB0YWJTaXplOiA0LFxuICAgICAgICBoaW50T3B0aW9uczogeyBjb21wbGV0aW9uU2luZ2xlOiBmYWxzZSB9LFxuICAgICAgICBleHRyYUtleXM6IHsgJ0VudGVyJzogJ25ld2xpbmVBbmRJbmRlbnRDb250aW51ZU1hcmtkb3duTGlzdCcgfVxuICAgIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVkaXRvckZpZWxkIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIGxldCBib2R5ID0gJCgnYm9keScpO1xuICAgICAgICB0aGlzLmVkaXRvcnMgPSAkKCk7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIERlZmF1bHRzLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5idXR0b25zID0gQnV0dG9ucztcbiAgICAgICAgdGhpcy5idXR0b25TdHJhdGVnaWVzID0gYnV0dG9uU3RyYXRlZ2llcztcblxuICAgICAgICB3YXRjaChCdXR0b25zLCAoLyoga2V5LCBtb2RpZmllciwgcHJldiwgbmV4dCAqLykgPT4ge1xuICAgICAgICAgICAgdGhpcy5lZGl0b3JzLmVhY2goKGluZGV4LCBlZGl0b3IpID0+ICQoZWRpdG9yKS5kYXRhKCd0b29sYmFyJykucmVuZGVyQnV0dG9ucygpKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgJCgnW2RhdGEtZ3Jhdi1lZGl0b3JdJykuZWFjaCgoaW5kZXgsIGVkaXRvcikgPT4gdGhpcy5hZGRFZGl0b3IoZWRpdG9yKSk7XG5cbiAgICAgICAgJCgoKSA9PiB7IGJvZHkudHJpZ2dlcignZ3Jhdi1lZGl0b3ItcmVhZHknKTsgfSk7XG4gICAgICAgIGJvZHkub24oJ211dGF0aW9uLl9ncmF2JywgdGhpcy5fb25BZGRlZE5vZGVzLmJpbmQodGhpcykpO1xuXG4gICAgICAgIGJvZHkub24oJ21vdXNldXAuX2dyYXYnLCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIUlTX01PVVNFRE9XTikgeyByZXR1cm4gdHJ1ZTsgfVxuICAgICAgICAgICAgYm9keS51bmJpbmQoJ21vdXNlbW92ZS5fZ3JhdicpO1xuICAgICAgICAgICAgSVNfTU9VU0VET1dOID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgICAgICBib2R5Lm9uKCdtb3VzZWRvd24uX2dyYXYnLCAnLmdyYXYtZWRpdG9yLXJlc2l6ZXInLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGV2ZW50ICYmIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBJU19NT1VTRURPV04gPSB0cnVlO1xuXG4gICAgICAgICAgICBsZXQgdGFyZ2V0ID0gJChldmVudC5jdXJyZW50VGFyZ2V0KTtcbiAgICAgICAgICAgIGxldCBjb250YWluZXIgPSB0YXJnZXQuc2libGluZ3MoJy5ncmF2LWVkaXRvci1jb250ZW50Jyk7XG4gICAgICAgICAgICBsZXQgZWRpdG9yID0gY29udGFpbmVyLmZpbmQoJy5Db2RlTWlycm9yJyk7XG4gICAgICAgICAgICBsZXQgY29kZW1pcnJvciA9IGNvbnRhaW5lci5maW5kKCd0ZXh0YXJlYScpLmRhdGEoJ2NvZGVtaXJyb3InKTtcblxuICAgICAgICAgICAgYm9keS5vbignbW91c2Vtb3ZlLl9ncmF2JywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgZWRpdG9yLmNzcygnaGVpZ2h0JywgTWF0aC5tYXgoMTAwLCBldmVudC5wYWdlWSAtIGNvbnRhaW5lci5vZmZzZXQoKS50b3ApKTtcbiAgICAgICAgICAgICAgICBjb2RlbWlycm9yLnJlZnJlc2goKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhZGRCdXR0b24oYnV0dG9uLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zICYmIChvcHRpb25zLmJlZm9yZSB8fCBvcHRpb25zLmFmdGVyKSkge1xuICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5idXR0b25zLm5hdmlnYXRpb24uZmluZEluZGV4KChvYmopID0+IHtcbiAgICAgICAgICAgICAgICBsZXQga2V5ID0gT2JqZWN0LmtleXMob2JqKS5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBvYmpba2V5XS5pZGVudGlmaWVyID09PSAob3B0aW9ucy5iZWZvcmUgfHwgb3B0aW9ucy5hZnRlcik7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKCF+aW5kZXgpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zID0gJ2VuZCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuYnV0dG9ucy5uYXZpZ2F0aW9uLnNwbGljZShvcHRpb25zLmJlZm9yZSA/IGluZGV4IDogaW5kZXggKyAxLCAwLCBidXR0b24pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucyA9PT0gJ3N0YXJ0JykgeyB0aGlzLmJ1dHRvbnMubmF2aWdhdGlvbi5zcGxpY2UoMCwgMCwgYnV0dG9uKTsgfVxuICAgICAgICBpZiAoIW9wdGlvbnMgfHwgb3B0aW9ucyA9PT0gJ2VuZCcpIHsgdGhpcy5idXR0b25zLm5hdmlnYXRpb24ucHVzaChidXR0b24pOyB9XG4gICAgfVxuXG4gICAgYWRkRWRpdG9yKHRleHRhcmVhKSB7XG4gICAgICAgIHRleHRhcmVhID0gJCh0ZXh0YXJlYSk7XG4gICAgICAgIGxldCBvcHRpb25zID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvZGVtaXJyb3IsXG4gICAgICAgICAgICB0ZXh0YXJlYS5kYXRhKCdncmF2LWVkaXRvcicpLmNvZGVtaXJyb3JcbiAgICAgICAgKTtcbiAgICAgICAgbGV0IHRoZW1lID0gb3B0aW9ucy50aGVtZSB8fCAncGFwZXInO1xuXG4gICAgICAgIHRoaXMuZWRpdG9ycyA9IHRoaXMuZWRpdG9ycy5hZGQodGV4dGFyZWEpO1xuICAgICAgICBpZiAodGhlbWUgJiYgIX5UaGVtZXNNYXAuaW5kZXhPZih0aGVtZSkpIHtcbiAgICAgICAgICAgIFRoZW1lc01hcC5wdXNoKHRoZW1lKTtcbiAgICAgICAgICAgIC8vIGxldCB0aGVtZUNTUyA9IGBodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9jb2RlbWlycm9yLzUuMTIuMC90aGVtZS8ke3RoZW1lfS5taW4uY3NzYDtcbiAgICAgICAgICAgIC8vICQoJ2hlYWQnKS5hcHBlbmQoJCgnPGxpbmsgcmVsPVwic3R5bGVzaGVldFwiIHR5cGU9XCJ0ZXh0L2Nzc1wiIC8+JykuYXR0cignaHJlZicsIHRoZW1lQ1NTKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5tb2RlID09PSAneWFtbCcpIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24ob3B0aW9ucy5leHRyYUtleXMsIHsgVGFiOiBmdW5jdGlvbihjbSkgeyBjbS5yZXBsYWNlU2VsZWN0aW9uKCcgICAgJywgJ2VuZCcpOyB9fSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZWRpdG9yID0gY29kZW1pcnJvci5mcm9tVGV4dEFyZWEodGV4dGFyZWEuZ2V0KDApLCBvcHRpb25zKTtcbiAgICAgICAgdGV4dGFyZWEuZGF0YSgnY29kZW1pcnJvcicsIGVkaXRvcik7XG4gICAgICAgIHRleHRhcmVhLmRhdGEoJ3Rvb2xiYXInLCBuZXcgVG9vbGJhcih0ZXh0YXJlYSkpO1xuICAgICAgICB0ZXh0YXJlYS5hZGRDbGFzcygnY29kZS1taXJyb3JlZCcpO1xuXG4gICAgICAgIGlmIChvcHRpb25zLnRvb2xiYXIgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0ZXh0YXJlYS5kYXRhKCd0b29sYmFyJykudWkubmF2aWdhdGlvbi5hZGRDbGFzcygnZ3Jhdi1lZGl0b3ItaGlkZS10b29sYmFyJyk7XG4gICAgICAgIH1cblxuICAgICAgICBlZGl0b3Iub24oJ2NoYW5nZScsICgpID0+IGVkaXRvci5zYXZlKCkpO1xuICAgIH1cblxuICAgIF9vbkFkZGVkTm9kZXMoZXZlbnQsIHRhcmdldC8qICwgcmVjb3JkLCBpbnN0YW5jZSAqLykge1xuICAgICAgICBsZXQgZWRpdG9ycyA9ICQodGFyZ2V0KS5maW5kKCdbZGF0YS1ncmF2LWVkaXRvcl0nKTtcbiAgICAgICAgaWYgKCFlZGl0b3JzLmxlbmd0aCkgeyByZXR1cm47IH1cblxuICAgICAgICBlZGl0b3JzLmVhY2goKGluZGV4LCBlZGl0b3IpID0+IHtcbiAgICAgICAgICAgIGVkaXRvciA9ICQoZWRpdG9yKTtcbiAgICAgICAgICAgIGlmICghfnRoaXMuZWRpdG9ycy5pbmRleChlZGl0b3IpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRFZGl0b3IoZWRpdG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVG9vbGJhciB7XG4gICAgc3RhdGljIHRlbXBsYXRlcygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hdmlnYXRpb246IGBcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3Jhdi1lZGl0b3ItdG9vbGJhclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3Jhdi1lZGl0b3ItYWN0aW9uc1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3Jhdi1lZGl0b3ItbW9kZXNcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIGBcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihlZGl0b3IpIHtcbiAgICAgICAgdGhpcy5lZGl0b3IgPSAkKGVkaXRvcik7XG4gICAgICAgIHRoaXMuY29kZW1pcnJvciA9IHRoaXMuZWRpdG9yLmRhdGEoJ2NvZGVtaXJyb3InKTtcbiAgICAgICAgdGhpcy5idXR0b25zID0gQnV0dG9ucy5uYXZpZ2F0aW9uO1xuICAgICAgICB0aGlzLnVpID0ge1xuICAgICAgICAgICAgbmF2aWdhdGlvbjogJChUb29sYmFyLnRlbXBsYXRlcygpLm5hdmlnYXRpb24pXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5lZGl0b3IucGFyZW50KCcuZ3Jhdi1lZGl0b3ItY29udGVudCcpXG4gICAgICAgICAgICAuYmVmb3JlKHRoaXMudWkubmF2aWdhdGlvbilcbiAgICAgICAgICAgIC5hZnRlcih0aGlzLnVpLnN0YXRlcyk7XG5cbiAgICAgICAgdGhpcy5yZW5kZXJCdXR0b25zKCk7XG4gICAgfVxuXG4gICAgcmVuZGVyQnV0dG9ucygpIHtcbiAgICAgICAgbGV0IG1hcCA9IHsgJ2FjdGlvbnMnOiAnbmF2aWdhdGlvbicsICdtb2Rlcyc6ICdzdGF0ZXMnfTtcblxuICAgICAgICBbJ2FjdGlvbnMnLCAnbW9kZXMnXS5mb3JFYWNoKCh0eXBlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVpLm5hdmlnYXRpb24uZmluZChgLmdyYXYtZWRpdG9yLSR7dHlwZX1gKS5lbXB0eSgpLmFwcGVuZCgnPHVsIC8+Jyk7XG4gICAgICAgICAgICBCdXR0b25zW21hcFt0eXBlXV0uZm9yRWFjaCgoYnV0dG9uKSA9PiB0aGlzLnJlbmRlckJ1dHRvbihidXR0b24sIHR5cGUpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmVuZGVyQnV0dG9uKGJ1dHRvbiwgdHlwZSwgbG9jYXRpb24gPSBudWxsKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKGJ1dHRvbikuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICBsZXQgb2JqID0gYnV0dG9uW2tleV07XG4gICAgICAgICAgICBpZiAoIW9iai5tb2RlcykgeyBvYmoubW9kZXMgPSBbXTsgfVxuICAgICAgICAgICAgaWYgKCF+dGhpcy5jb2RlbWlycm9yLm9wdGlvbnMuaWdub3JlLmluZGV4T2Yoa2V5KSAmJiAoIW9iai5tb2Rlcy5sZW5ndGggfHwgb2JqLm1vZGVzLmluZGV4T2YodGhpcy5jb2RlbWlycm9yLm9wdGlvbnMubW9kZSkgPiAtMSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgaGludCA9IG9iai50aXRsZSA/IGBkYXRhLWhpbnQ9XCIke29iai50aXRsZX1cImAgOiAnJztcbiAgICAgICAgICAgICAgICBsZXQgZWxlbWVudCA9ICQoYDxsaSBjbGFzcz1cImdyYXYtZWRpdG9yLWJ1dHRvbi0ke2tleX1cIj48YSBjbGFzcz1cImhpbnQtLXRvcFwiICR7aGludH0+JHtvYmoubGFiZWx9PC9hPjwvbGk+YCk7XG4gICAgICAgICAgICAgICAgKGxvY2F0aW9uIHx8IHRoaXMudWkubmF2aWdhdGlvbi5maW5kKGAuZ3Jhdi1lZGl0b3ItJHt0eXBlfSB1bDpub3QoLmRyb3Bkb3duLW1lbnUpYCkpLmFwcGVuZChlbGVtZW50KTtcblxuICAgICAgICAgICAgICAgIGlmIChvYmouc2hvcnRjdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRTaG9ydGN1dChvYmouaWRlbnRpZmllciwgb2JqLnNob3J0Y3V0LCBlbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBvYmouYWN0aW9uICYmIG9iai5hY3Rpb24uY2FsbChvYmouYWN0aW9uLCB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGVtaXJyb3I6IHRoaXMuY29kZW1pcnJvcixcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uOiBlbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICB0ZXh0YXJlYTogdGhpcy5lZGl0b3IsXG4gICAgICAgICAgICAgICAgICAgIHVpOiB0aGlzLnVpXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAob2JqLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlbkNvbnRhaW5lciA9ICQoJzx1bCBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIiAvPicpO1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmFkZENsYXNzKCdidXR0b24tZ3JvdXAnKS5maW5kKCdhJykud3JhcCgnPGRpdiBjbGFzcz1cImRyb3Bkb3duLXRvZ2dsZVwiIGRhdGEtdG9nZ2xlPVwiZHJvcGRvd25cIj48L2Rpdj4nKTtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5maW5kKCdhJykuYXBwZW5kKCcgPGkgY2xhc3M9XCJmYSBmYS1jYXJldC1kb3duXCI+PC9pPicpO1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmFwcGVuZChjaGlsZHJlbkNvbnRhaW5lcik7XG4gICAgICAgICAgICAgICAgICAgIG9iai5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4gdGhpcy5yZW5kZXJCdXR0b24oY2hpbGQsIHR5cGUsIGNoaWxkcmVuQ29udGFpbmVyKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhZGRTaG9ydGN1dChpZGVudGlmaWVyLCBzaG9ydGN1dCwgZWxlbWVudCkge1xuICAgICAgICBsZXQgbWFwID0ge307XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShzaG9ydGN1dCkpIHtcbiAgICAgICAgICAgIHNob3J0Y3V0ID0gW3Nob3J0Y3V0XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNob3J0Y3V0LmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgbWFwW2tleV0gPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC50cmlnZ2VyKGBjbGljay5lZGl0b3IuJHtpZGVudGlmaWVyfWAsIFt0aGlzLmNvZGVtaXJyb3JdKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY29kZW1pcnJvci5hZGRLZXlNYXAobWFwKTtcbiAgICB9XG59XG5cbmV4cG9ydCBsZXQgSW5zdGFuY2UgPSBuZXcgRWRpdG9yRmllbGQoKTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./app/forms/fields/editor.js\n"); /***/ }), /***/ "./app/forms/fields/editor/buttons.js": -/*!********************************************!* +/*!********************************************!*\ !*** ./app/forms/fields/editor/buttons.js ***! \********************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"strategies\": () => /* binding */ strategies,\n/* harmony export */ \"default\": () => __WEBPACK_DEFAULT_EXPORT__\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! grav-config */ \"grav-config\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(grav_config__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _utils_request__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../utils/request */ \"./app/utils/request.js\");\n\n\n\n\nvar replacer = function replacer(_ref) {\n var name = _ref.name,\n replace = _ref.replace,\n codemirror = _ref.codemirror,\n button = _ref.button,\n _ref$mode = _ref.mode,\n mode = _ref$mode === void 0 ? 'replaceSelections' : _ref$mode,\n runner = _ref.runner;\n button.on(\"click.editor.\".concat(name), function () {\n strategies[mode]({\n token: '$1',\n template: replace,\n codemirror: codemirror,\n runner: runner\n });\n });\n};\n\nvar strategies = {\n replaceSelections: function replaceSelections(_ref2) {\n var template = _ref2.template,\n token = _ref2.token,\n codemirror = _ref2.codemirror,\n runner = _ref2.runner;\n var replacements = [];\n var ranges = [];\n var selections = codemirror.getSelections();\n var list = codemirror.listSelections();\n var accumulator = {};\n selections.forEach(function (selection, index) {\n var markup = template.replace(token, selection);\n var cursor = markup.indexOf('$cur');\n var _list$index$anchor = list[index].anchor,\n line = _list$index$anchor.line,\n ch = _list$index$anchor.ch;\n markup = markup.replace('$cur', '');\n markup = runner ? runner(selection, markup, list) : markup;\n replacements.push(markup);\n\n if (!accumulator[line]) {\n accumulator[line] = 0;\n }\n\n ch += accumulator[line] + (cursor === -1 ? markup.length : cursor);\n var range = {\n ch: ch,\n line: line\n };\n ranges.push({\n anchor: range,\n head: range\n });\n accumulator[line] += markup.length - selection.length;\n });\n codemirror.replaceSelections(replacements);\n codemirror.setSelections(ranges);\n codemirror.focus();\n },\n replaceLine: function replaceLine(_ref3) {\n var template = _ref3.template,\n token = _ref3.token,\n codemirror = _ref3.codemirror,\n runner = _ref3.runner;\n var list = codemirror.listSelections();\n var range;\n list.forEach(function (selection) {\n var lines = {\n min: Math.min(selection.anchor.line, selection.head.line),\n max: Math.max(selection.anchor.line, selection.head.line)\n };\n codemirror.eachLine(lines.min, lines.max + 1, function (handler) {\n var markup = template.replace(token, handler.text);\n var line = codemirror.getLineNumber(handler);\n markup = runner ? runner(handler, markup) : markup;\n codemirror.replaceRange(markup, {\n line: line,\n ch: 0\n }, {\n line: line,\n ch: markup.length\n });\n range = {\n line: line,\n ch: markup.length\n };\n });\n });\n codemirror.setSelection(range, range, 'end');\n codemirror.focus();\n },\n replaceRange: function replaceRange() {}\n};\n\nvar flipDisabled = function flipDisabled(codemirror, button, type) {\n var hasHistory = codemirror.historySize()[type];\n var element = button.find('a');\n button[hasHistory ? 'removeClass' : 'addClass']('button-disabled');\n\n if (!hasHistory) {\n element.attr('title-disabled', element.attr('title'));\n element.attr('data-hint-disabled', element.attr('data-hint'));\n element.removeAttr('title').removeAttr('data-hint');\n } else {\n element.attr('title', element.attr('title-disabled'));\n element.attr('data-hint', element.attr('data-hint-disabled'));\n element.removeAttr('title-disabled').removeAttr('data-hint-disabled');\n }\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n navigation: [{\n undo: {\n identifier: 'undo',\n title: grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.UNDO,\n label: '',\n modes: [],\n action: function action(_ref4) {\n var codemirror = _ref4.codemirror,\n button = _ref4.button,\n textarea = _ref4.textarea;\n button.addClass('button-disabled');\n codemirror.on('change', function () {\n return flipDisabled(codemirror, button, 'undo');\n });\n button.on('click.editor.undo', function () {\n codemirror.undo();\n });\n }\n }\n }, {\n redo: {\n identifier: 'redo',\n title: grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.REDO,\n label: '',\n modes: [],\n action: function action(_ref5) {\n var codemirror = _ref5.codemirror,\n button = _ref5.button,\n textarea = _ref5.textarea;\n button.addClass('button-disabled');\n codemirror.on('change', function () {\n return flipDisabled(codemirror, button, 'redo');\n });\n button.on('click.editor.redo', function () {\n codemirror.redo();\n });\n }\n }\n }, {\n headers: {\n identifier: 'headers',\n title: grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.HEADERS,\n label: '',\n modes: ['gfm', 'markdown'],\n children: [{\n h1: {\n identifier: 'h1',\n label: '1',\n modes: ['gfm', 'markdown'],\n action: function action(_ref6) {\n var codemirror = _ref6.codemirror,\n button = _ref6.button,\n textarea = _ref6.textarea;\n replacer({\n name: 'h1',\n replace: '# $1',\n codemirror: codemirror,\n button: button,\n mode: 'replaceLine'\n });\n }\n }\n }, {\n h2: {\n identifier: 'h2',\n label: '2',\n modes: ['gfm', 'markdown'],\n action: function action(_ref7) {\n var codemirror = _ref7.codemirror,\n button = _ref7.button,\n textarea = _ref7.textarea;\n replacer({\n name: 'h2',\n replace: '## $1',\n codemirror: codemirror,\n button: button,\n mode: 'replaceLine'\n });\n }\n }\n }, {\n h3: {\n identifier: 'h3',\n label: '3',\n modes: ['gfm', 'markdown'],\n action: function action(_ref8) {\n var codemirror = _ref8.codemirror,\n button = _ref8.button,\n textarea = _ref8.textarea;\n replacer({\n name: 'h3',\n replace: '### $1',\n codemirror: codemirror,\n button: button,\n mode: 'replaceLine'\n });\n }\n }\n }, {\n h4: {\n identifier: 'h4',\n label: '4',\n modes: ['gfm', 'markdown'],\n action: function action(_ref9) {\n var codemirror = _ref9.codemirror,\n button = _ref9.button,\n textarea = _ref9.textarea;\n replacer({\n name: 'h4',\n replace: '#### $1',\n codemirror: codemirror,\n button: button,\n mode: 'replaceLine'\n });\n }\n }\n }, {\n h5: {\n identifier: 'h5',\n label: '5',\n modes: ['gfm', 'markdown'],\n action: function action(_ref10) {\n var codemirror = _ref10.codemirror,\n button = _ref10.button,\n textarea = _ref10.textarea;\n replacer({\n name: 'h5',\n replace: '##### $1',\n codemirror: codemirror,\n button: button,\n mode: 'replaceLine'\n });\n }\n }\n }, {\n h6: {\n identifier: 'h6',\n label: '6',\n modes: ['gfm', 'markdown'],\n action: function action(_ref11) {\n var codemirror = _ref11.codemirror,\n button = _ref11.button,\n textarea = _ref11.textarea;\n replacer({\n name: 'h6',\n replace: '###### $1',\n codemirror: codemirror,\n button: button,\n mode: 'replaceLine'\n });\n }\n }\n }]\n }\n }, {\n bold: {\n identifier: 'bold',\n title: grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.BOLD,\n label: '',\n modes: ['gfm', 'markdown'],\n shortcut: ['Ctrl-B', 'Cmd-B'],\n action: function action(_ref12) {\n var codemirror = _ref12.codemirror,\n button = _ref12.button,\n textarea = _ref12.textarea;\n replacer({\n name: 'bold',\n replace: '**$1$cur**',\n codemirror: codemirror,\n button: button\n });\n }\n }\n }, {\n italic: {\n identifier: 'italic',\n title: grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.ITALIC,\n label: '',\n modes: ['gfm', 'markdown'],\n shortcut: ['Ctrl-I', 'Cmd-I'],\n action: function action(_ref13) {\n var codemirror = _ref13.codemirror,\n button = _ref13.button,\n textarea = _ref13.textarea;\n replacer({\n name: 'italic',\n replace: '_$1$cur_',\n codemirror: codemirror,\n button: button\n });\n }\n }\n }, {\n strike: {\n identifier: 'strike',\n title: grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.STRIKETHROUGH,\n label: '',\n modes: ['gfm', 'markdown'],\n action: function action(_ref14) {\n var codemirror = _ref14.codemirror,\n button = _ref14.button,\n textarea = _ref14.textarea;\n replacer({\n name: 'strike',\n replace: '~~$1$cur~~',\n codemirror: codemirror,\n button: button\n });\n }\n }\n }, {\n delimiter: {\n identifier: 'delimiter',\n title: grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.SUMMARY_DELIMITER,\n label: '',\n modes: ['gfm', 'markdown'],\n action: function action(_ref15) {\n var codemirror = _ref15.codemirror,\n button = _ref15.button,\n textarea = _ref15.textarea;\n replacer({\n name: 'delimiter',\n replace: \"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.site.delimiter, \"$1\"),\n codemirror: codemirror,\n button: button,\n mode: 'replaceLine'\n });\n }\n }\n }, {\n link: {\n identifier: 'link',\n title: grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.LINK,\n label: '',\n modes: ['gfm', 'markdown'],\n shortcut: ['Ctrl-K', 'Cmd-K'],\n action: function action(_ref16) {\n var codemirror = _ref16.codemirror,\n button = _ref16.button,\n textarea = _ref16.textarea;\n replacer({\n name: 'link',\n replace: '[$1]($cur)',\n codemirror: codemirror,\n button: button\n });\n }\n }\n }, {\n image: {\n identifier: 'image',\n title: grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.IMAGE,\n label: '',\n modes: ['gfm', 'markdown'],\n action: function action(_ref17) {\n var codemirror = _ref17.codemirror,\n button = _ref17.button,\n textarea = _ref17.textarea;\n replacer({\n name: 'image',\n replace: '![$1](http://$cur)',\n codemirror: codemirror,\n button: button\n });\n }\n }\n }, {\n blockquote: {\n identifier: 'blockquote',\n title: grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.BLOCKQUOTE,\n label: '',\n modes: ['gfm', 'markdown'],\n action: function action(_ref18) {\n var codemirror = _ref18.codemirror,\n button = _ref18.button,\n textarea = _ref18.textarea;\n replacer({\n name: 'blockquote',\n replace: '> $1',\n codemirror: codemirror,\n button: button,\n mode: 'replaceLine'\n });\n }\n }\n }, {\n listUl: {\n identifier: 'listUl',\n title: grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.UNORDERED_LIST,\n label: '',\n modes: ['gfm', 'markdown'],\n action: function action(_ref19) {\n var codemirror = _ref19.codemirror,\n button = _ref19.button,\n textarea = _ref19.textarea;\n replacer({\n name: 'listUl',\n replace: '* $1',\n codemirror: codemirror,\n button: button,\n mode: 'replaceLine'\n });\n }\n }\n }, {\n listOl: {\n identifier: 'listOl',\n title: grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.ORDERED_LIST,\n label: '',\n modes: ['gfm', 'markdown'],\n action: function action(_ref20) {\n var codemirror = _ref20.codemirror,\n button = _ref20.button,\n textarea = _ref20.textarea;\n replacer({\n name: 'listOl',\n replace: '. $1',\n codemirror: codemirror,\n button: button,\n mode: 'replaceLine',\n runner: function runner(line, markup) {\n var lineNo = codemirror.getLineNumber(line);\n var previousLine = codemirror.getLine(lineNo - 1) || '';\n var match = previousLine.match(/^(\\d+)\\./);\n var prefix = 1 + (match ? Number(match[1]) : 0);\n return \"\".concat(prefix).concat(markup);\n }\n });\n }\n }\n }],\n states: [{\n code: {\n identifier: 'editor',\n title: grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.EDITOR,\n label: '',\n action: function action(_ref21) {\n var codemirror = _ref21.codemirror,\n button = _ref21.button,\n textarea = _ref21.textarea,\n ui = _ref21.ui;\n\n if (textarea.data('grav-editor-mode') === 'editor') {\n button.addClass('editor-active');\n }\n\n button.on('click.states.editor', function () {\n button.siblings().removeClass('editor-active');\n button.addClass('editor-active');\n textarea.data('grav-editor-mode', 'editor');\n var previewContainer = textarea.data('grav-editor-preview-container');\n var content = textarea.parent('.grav-editor-content');\n content.addClass('is-active');\n ui.navigation.find('.grav-editor-actions').css('visibility', 'visible');\n\n if (previewContainer) {\n previewContainer.removeClass('is-active');\n }\n });\n }\n }\n }, {\n preview: {\n identifier: 'preview',\n title: grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.PREVIEW,\n label: '',\n modes: ['gfm', 'markdown'],\n action: function action(_ref22) {\n var codemirror = _ref22.codemirror,\n button = _ref22.button,\n textarea = _ref22.textarea,\n ui = _ref22.ui;\n\n if (textarea.data('grav-editor-mode') === 'preview') {\n button.addClass('editor-active');\n }\n\n button.on('click.states.preview', function () {\n var previewContainer = textarea.data('grav-editor-preview-container');\n var content = textarea.parent('.grav-editor-content');\n button.siblings().removeClass('editor-active');\n button.addClass('editor-active');\n textarea.data('grav-editor-mode', 'preview');\n\n if (!previewContainer) {\n previewContainer = jquery__WEBPACK_IMPORTED_MODULE_0___default()('
          ');\n content.after(previewContainer);\n textarea.data('grav-editor-preview-container', previewContainer);\n }\n\n previewContainer.css({\n height: content.height()\n });\n previewContainer.addClass('is-active');\n content.removeClass('is-active');\n ui.navigation.find('.grav-editor-actions').css('visibility', 'hidden');\n var url = \"\".concat(textarea.data('grav-urlpreview'), \"/task\").concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.param_sep, \"processmarkdown\");\n var params = textarea.closest('form').serializeArray();\n var body = {};\n params.map(function (obj) {\n body[obj.name] = obj.value;\n });\n (0,_utils_request__WEBPACK_IMPORTED_MODULE_2__.default)(url, {\n method: 'post',\n body: body\n }, function (response) {\n return previewContainer.html(response.preview);\n });\n });\n }\n }\n }, {\n fullscreen: {\n identifier: 'fullscreen',\n title: grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.FULLSCREEN,\n label: '',\n action: function action(_ref23) {\n var codemirror = _ref23.codemirror,\n button = _ref23.button,\n textarea = _ref23.textarea;\n button.on('click.editor.fullscreen', function () {\n var container = textarea.closest('.grav-editor');\n var wrapper = codemirror.getWrapperElement();\n var contentWrapper = jquery__WEBPACK_IMPORTED_MODULE_0___default()('.content-wrapper');\n\n if (!container.hasClass('grav-editor-fullscreen')) {\n textarea.data('fullScreenRestore', {\n scrollTop: __webpack_require__.g.pageYOffset,\n scrollLeft: __webpack_require__.g.pageXOffset,\n width: wrapper.style.width,\n height: wrapper.style.height\n });\n wrapper.style.width = '';\n wrapper.style.height = textarea.parent('.grav-editor-content').height() + 'px';\n __webpack_require__.g.document.documentElement.style.overflow = 'hidden';\n var hints = container.find('.grav-editor-toolbar .hint--top');\n\n if (hints) {\n hints.removeClass('hint--top').addClass('hint--bottom');\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(hints[hints.length - 1]).addClass('hint--bottom-left');\n }\n\n if (contentWrapper) {\n contentWrapper.css('overflow', 'visible');\n }\n } else {\n __webpack_require__.g.document.documentElement.style.overflow = '';\n var state = textarea.data('fullScreenRestore');\n wrapper.style.width = state.width;\n wrapper.style.height = state.height;\n __webpack_require__.g.scrollTo(state.scrollLeft, state.scrollTop);\n\n var _hints = container.find('.grav-editor-toolbar .hint--bottom');\n\n if (_hints) {\n _hints.removeClass('hint--bottom').addClass('hint--top');\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(_hints[_hints.length - 1]).removeClass('hint--bottom-left');\n }\n\n if (contentWrapper) {\n contentWrapper.css('overflow', 'auto');\n }\n }\n\n container.toggleClass('grav-editor-fullscreen');\n setTimeout(function () {\n codemirror.refresh(); // this.preview.parent().css('height', this.code.height());\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(__webpack_require__.g).trigger('resize');\n }, 5);\n });\n }\n }\n }]\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL2Zvcm1zL2ZpZWxkcy9lZGl0b3IvYnV0dG9ucy5qcz84OGQyIl0sIm5hbWVzIjpbInJlcGxhY2VyIiwibmFtZSIsInJlcGxhY2UiLCJjb2RlbWlycm9yIiwiYnV0dG9uIiwibW9kZSIsInJ1bm5lciIsIm9uIiwic3RyYXRlZ2llcyIsInRva2VuIiwidGVtcGxhdGUiLCJyZXBsYWNlU2VsZWN0aW9ucyIsInJlcGxhY2VtZW50cyIsInJhbmdlcyIsInNlbGVjdGlvbnMiLCJnZXRTZWxlY3Rpb25zIiwibGlzdCIsImxpc3RTZWxlY3Rpb25zIiwiYWNjdW11bGF0b3IiLCJmb3JFYWNoIiwic2VsZWN0aW9uIiwiaW5kZXgiLCJtYXJrdXAiLCJjdXJzb3IiLCJpbmRleE9mIiwiYW5jaG9yIiwibGluZSIsImNoIiwicHVzaCIsImxlbmd0aCIsInJhbmdlIiwiaGVhZCIsInNldFNlbGVjdGlvbnMiLCJmb2N1cyIsInJlcGxhY2VMaW5lIiwibGluZXMiLCJtaW4iLCJNYXRoIiwibWF4IiwiZWFjaExpbmUiLCJoYW5kbGVyIiwidGV4dCIsImdldExpbmVOdW1iZXIiLCJyZXBsYWNlUmFuZ2UiLCJzZXRTZWxlY3Rpb24iLCJmbGlwRGlzYWJsZWQiLCJ0eXBlIiwiaGFzSGlzdG9yeSIsImhpc3RvcnlTaXplIiwiZWxlbWVudCIsImZpbmQiLCJhdHRyIiwicmVtb3ZlQXR0ciIsIm5hdmlnYXRpb24iLCJ1bmRvIiwiaWRlbnRpZmllciIsInRpdGxlIiwidHJhbnNsYXRpb25zIiwibGFiZWwiLCJtb2RlcyIsImFjdGlvbiIsInRleHRhcmVhIiwiYWRkQ2xhc3MiLCJyZWRvIiwiaGVhZGVycyIsImNoaWxkcmVuIiwiaDEiLCJoMiIsImgzIiwiaDQiLCJoNSIsImg2IiwiYm9sZCIsInNob3J0Y3V0IiwiaXRhbGljIiwic3RyaWtlIiwiZGVsaW1pdGVyIiwiY29uZmlnIiwibGluayIsImltYWdlIiwiYmxvY2txdW90ZSIsImxpc3RVbCIsImxpc3RPbCIsImxpbmVObyIsInByZXZpb3VzTGluZSIsImdldExpbmUiLCJtYXRjaCIsInByZWZpeCIsIk51bWJlciIsInN0YXRlcyIsImNvZGUiLCJ1aSIsImRhdGEiLCJzaWJsaW5ncyIsInJlbW92ZUNsYXNzIiwicHJldmlld0NvbnRhaW5lciIsImNvbnRlbnQiLCJwYXJlbnQiLCJjc3MiLCJwcmV2aWV3IiwiJCIsImFmdGVyIiwiaGVpZ2h0IiwidXJsIiwicGFyYW1zIiwiY2xvc2VzdCIsInNlcmlhbGl6ZUFycmF5IiwiYm9keSIsIm1hcCIsIm9iaiIsInZhbHVlIiwicmVxdWVzdCIsIm1ldGhvZCIsInJlc3BvbnNlIiwiaHRtbCIsImZ1bGxzY3JlZW4iLCJjb250YWluZXIiLCJ3cmFwcGVyIiwiZ2V0V3JhcHBlckVsZW1lbnQiLCJjb250ZW50V3JhcHBlciIsImhhc0NsYXNzIiwic2Nyb2xsVG9wIiwiZ2xvYmFsIiwicGFnZVlPZmZzZXQiLCJzY3JvbGxMZWZ0IiwicGFnZVhPZmZzZXQiLCJ3aWR0aCIsInN0eWxlIiwiZG9jdW1lbnQiLCJkb2N1bWVudEVsZW1lbnQiLCJvdmVyZmxvdyIsImhpbnRzIiwic3RhdGUiLCJzY3JvbGxUbyIsInRvZ2dsZUNsYXNzIiwic2V0VGltZW91dCIsInJlZnJlc2giLCJ0cmlnZ2VyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBOztBQUVBLElBQUlBLFFBQVEsR0FBRyxTQUFYQSxRQUFXLE9BQStFO0FBQUEsTUFBNUVDLElBQTRFLFFBQTVFQSxJQUE0RTtBQUFBLE1BQXRFQyxPQUFzRSxRQUF0RUEsT0FBc0U7QUFBQSxNQUE3REMsVUFBNkQsUUFBN0RBLFVBQTZEO0FBQUEsTUFBakRDLE1BQWlELFFBQWpEQSxNQUFpRDtBQUFBLHVCQUF6Q0MsSUFBeUM7QUFBQSxNQUF6Q0EsSUFBeUMsMEJBQWxDLG1CQUFrQztBQUFBLE1BQWJDLE1BQWEsUUFBYkEsTUFBYTtBQUMxRkYsUUFBTSxDQUFDRyxFQUFQLHdCQUEwQk4sSUFBMUIsR0FBa0MsWUFB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a0IsbUJBQVMsQ0FBQ2tCLFdBQVYsQ0FBc0Isd0JBQXRCO0FBRUFDLG9CQUFVLENBQUMsWUFBTTtBQUNicEksc0JBQVUsQ0FBQ3FJLE9BQVgsR0FEYSxDQUViOztBQUNBcEMseURBQUMsQ0FBQ3NCLHFCQUFELENBQUQsQ0FBVWUsT0FBVixDQUFrQixRQUFsQjtBQUNILFdBSlMsRUFJUCxDQUpPLENBQVY7QUFLSCxTQWhERDtBQWlESDtBQXRETztBQURiLEdBaEVLO0FBbk5HLENBQWYiLCJmaWxlIjoiLi9hcHAvZm9ybXMvZmllbGRzL2VkaXRvci9idXR0b25zLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCB7IGNvbmZpZywgdHJhbnNsYXRpb25zIH0gZnJvbSAnZ3Jhdi1jb25maWcnO1xuaW1wb3J0IHJlcXVlc3QgZnJvbSAnLi4vLi4vLi4vdXRpbHMvcmVxdWVzdCc7XG5cbmxldCByZXBsYWNlciA9ICh7IG5hbWUsIHJlcGxhY2UsIGNvZGVtaXJyb3IsIGJ1dHRvbiwgbW9kZSA9ICdyZXBsYWNlU2VsZWN0aW9ucycsIHJ1bm5lciB9KSA9PiB7XG4gICAgYnV0dG9uLm9uKGBjbGljay5lZGl0b3IuJHtuYW1lfWAsICgpID0+IHtcbiAgICAgICAgc3RyYXRlZ2llc1ttb2RlXSh7IHRva2VuOiAnJDEnLCB0ZW1wbGF0ZTogcmVwbGFjZSwgY29kZW1pcnJvciwgcnVubmVyIH0pO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGxldCBzdHJhdGVnaWVzID0ge1xuICAgIHJlcGxhY2VTZWxlY3Rpb25zKHsgdGVtcGxhdGUsIHRva2VuLCBjb2RlbWlycm9yLCBydW5uZXIgfSkge1xuICAgICAgICBsZXQgcmVwbGFjZW1lbnRzID0gW107XG4gICAgICAgIGxldCByYW5nZXMgPSBbXTtcbiAgICAgICAgbGV0IHNlbGVjdGlvbnMgPSBjb2RlbWlycm9yLmdldFNlbGVjdGlvbnMoKTtcbiAgICAgICAgbGV0IGxpc3QgPSBjb2RlbWlycm9yLmxpc3RTZWxlY3Rpb25zKCk7XG4gICAgICAgIGxldCBhY2N1bXVsYXRvciA9IHt9O1xuXG4gICAgICAgIHNlbGVjdGlvbnMuZm9yRWFjaCgoc2VsZWN0aW9uLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgbGV0IG1hcmt1cCA9IHRlbXBsYXRlLnJlcGxhY2UodG9rZW4sIHNlbGVjdGlvbik7XG5cbiAgICAgICAgICAgIGxldCBjdXJzb3IgPSBtYXJrdXAuaW5kZXhPZignJGN1cicpO1xuICAgICAgICAgICAgbGV0IHsgbGluZSwgY2ggfSA9IGxpc3RbaW5kZXhdLmFuY2hvcjtcblxuICAgICAgICAgICAgbWFya3VwID0gbWFya3VwLnJlcGxhY2UoJyRjdXInLCAnJyk7XG4gICAgICAgICAgICBtYXJrdXAgPSBydW5uZXIgPyBydW5uZXIoc2VsZWN0aW9uLCBtYXJrdXAsIGxpc3QpIDogbWFya3VwO1xuICAgICAgICAgICAgcmVwbGFjZW1lbnRzLnB1c2gobWFya3VwKTtcblxuICAgICAgICAgICAgaWYgKCFhY2N1bXVsYXRvcltsaW5lXSkgeyBhY2N1bXVsYXRvcltsaW5lXSA9IDA7IH1cblxuICAgICAgICAgICAgY2ggKz0gYWNjdW11bGF0b3JbbGluZV0gKyAoY3Vyc29yID09PSAtMSA/IG1hcmt1cC5sZW5ndGggOiBjdXJzb3IpO1xuICAgICAgICAgICAgbGV0IHJhbmdlID0geyBjaCwgbGluZSB9O1xuXG4gICAgICAgICAgICByYW5nZXMucHVzaCh7IGFuY2hvcjogcmFuZ2UsIGhlYWQ6IHJhbmdlIH0pO1xuICAgICAgICAgICAgYWNjdW11bGF0b3JbbGluZV0gKz0gbWFya3VwLmxlbmd0aCAtIHNlbGVjdGlvbi5sZW5ndGg7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvZGVtaXJyb3IucmVwbGFjZVNlbGVjdGlvbnMocmVwbGFjZW1lbnRzKTtcbiAgICAgICAgY29kZW1pcnJvci5zZXRTZWxlY3Rpb25zKHJhbmdlcyk7XG4gICAgICAgIGNvZGVtaXJyb3IuZm9jdXMoKTtcbiAgICB9LFxuICAgIHJlcGxhY2VMaW5lKHsgdGVtcGxhdGUsIHRva2VuLCBjb2RlbWlycm9yLCBydW5uZXIgfSkge1xuICAgICAgICBsZXQgbGlzdCA9IGNvZGVtaXJyb3IubGlzdFNlbGVjdGlvbnMoKTtcbiAgICAgICAgbGV0IHJhbmdlO1xuXG4gICAgICAgIGxpc3QuZm9yRWFjaCgoc2VsZWN0aW9uKSA9PiB7XG4gICAgICAgICAgICBsZXQgbGluZXMgPSB7XG4gICAgICAgICAgICAgICAgbWluOiBNYXRoLm1pbihzZWxlY3Rpb24uYW5jaG9yLmxpbmUsIHNlbGVjdGlvbi5oZWFkLmxpbmUpLFxuICAgICAgICAgICAgICAgIG1heDogTWF0aC5tYXgoc2VsZWN0aW9uLmFuY2hvci5saW5lLCBzZWxlY3Rpb24uaGVhZC5saW5lKVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29kZW1pcnJvci5lYWNoTGluZShsaW5lcy5taW4sIGxpbmVzLm1heCArIDEsIChoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IG1hcmt1cCA9IHRlbXBsYXRlLnJlcGxhY2UodG9rZW4sIGhhbmRsZXIudGV4dCk7XG4gICAgICAgICAgICAgICAgbGV0IGxpbmUgPSBjb2RlbWlycm9yLmdldExpbmVOdW1iZXIoaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgbWFya3VwID0gcnVubmVyID8gcnVubmVyKGhhbmRsZXIsIG1hcmt1cCkgOiBtYXJrdXA7XG4gICAgICAgICAgICAgICAgY29kZW1pcnJvci5yZXBsYWNlUmFuZ2UobWFya3VwLCB7IGxpbmUsIGNoOiAwIH0sIHsgbGluZSwgY2g6IG1hcmt1cC5sZW5ndGggfSk7XG4gICAgICAgICAgICAgICAgcmFuZ2UgPSB7IGxpbmUsIGNoOiBtYXJrdXAubGVuZ3RoIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29kZW1pcnJvci5zZXRTZWxlY3Rpb24ocmFuZ2UsIHJhbmdlLCAnZW5kJyk7XG4gICAgICAgIGNvZGVtaXJyb3IuZm9jdXMoKTtcbiAgICB9LFxuICAgIHJlcGxhY2VSYW5nZSgpIHt9XG59O1xuXG5jb25zdCBmbGlwRGlzYWJsZWQgPSAoY29kZW1pcnJvciwgYnV0dG9uLCB0eXBlKSA9PiB7XG4gICAgbGV0IGhhc0hpc3RvcnkgPSBjb2RlbWlycm9yLmhpc3RvcnlTaXplKClbdHlwZV07XG4gICAgbGV0IGVsZW1lbnQgPSBidXR0b24uZmluZCgnYScpO1xuICAgIGJ1dHRvbltoYXNIaXN0b3J5ID8gJ3JlbW92ZUNsYXNzJyA6ICdhZGRDbGFzcyddKCdidXR0b24tZGlzYWJsZWQnKTtcblxuICAgIGlmICghaGFzSGlzdG9yeSkge1xuICAgICAgICBlbGVtZW50LmF0dHIoJ3RpdGxlLWRpc2FibGVkJywgZWxlbWVudC5hdHRyKCd0aXRsZScpKTtcbiAgICAgICAgZWxlbWVudC5hdHRyKCdkYXRhLWhpbnQtZGlzYWJsZWQnLCBlbGVtZW50LmF0dHIoJ2RhdGEtaGludCcpKTtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyKCd0aXRsZScpLnJlbW92ZUF0dHIoJ2RhdGEtaGludCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGVsZW1lbnQuYXR0cigndGl0bGUnLCBlbGVtZW50LmF0dHIoJ3RpdGxlLWRpc2FibGVkJykpO1xuICAgICAgICBlbGVtZW50LmF0dHIoJ2RhdGEtaGludCcsIGVsZW1lbnQuYXR0cignZGF0YS1oaW50LWRpc2FibGVkJykpO1xuICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHIoJ3RpdGxlLWRpc2FibGVkJykucmVtb3ZlQXR0cignZGF0YS1oaW50LWRpc2FibGVkJyk7XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQge1xuICAgIG5hdmlnYXRpb246IFtcbiAgICAgICAge1xuICAgICAgICAgICAgdW5kbzoge1xuICAgICAgICAgICAgICAgIGlkZW50aWZpZXI6ICd1bmRvJyxcbiAgICAgICAgICAgICAgICB0aXRsZTogdHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5VTkRPLFxuICAgICAgICAgICAgICAgIGxhYmVsOiAnPGkgY2xhc3M9XCJmYSBmYS1mdyBmYS11bmRvXCI+PC9pPicsXG4gICAgICAgICAgICAgICAgbW9kZXM6IFtdLFxuICAgICAgICAgICAgICAgIGFjdGlvbih7IGNvZGVtaXJyb3IsIGJ1dHRvbiwgdGV4dGFyZWF9KSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbi5hZGRDbGFzcygnYnV0dG9uLWRpc2FibGVkJyk7XG4gICAgICAgICAgICAgICAgICAgIGNvZGVtaXJyb3Iub24oJ2NoYW5nZScsICgpID0+IGZsaXBEaXNhYmxlZChjb2RlbWlycm9yLCBidXR0b24sICd1bmRvJykpO1xuICAgICAgICAgICAgICAgICAgICBidXR0b24ub24oJ2NsaWNrLmVkaXRvci51bmRvJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZW1pcnJvci51bmRvKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgcmVkbzoge1xuICAgICAgICAgICAgICAgIGlkZW50aWZpZXI6ICdyZWRvJyxcbiAgICAgICAgICAgICAgICB0aXRsZTogdHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5SRURPLFxuICAgICAgICAgICAgICAgIGxhYmVsOiAnPGkgY2xhc3M9XCJmYSBmYS1mdyBmYS1yZXBlYXRcIj48L2k+JyxcbiAgICAgICAgICAgICAgICBtb2RlczogW10sXG4gICAgICAgICAgICAgICAgYWN0aW9uKHsgY29kZW1pcnJvciwgYnV0dG9uLCB0ZXh0YXJlYX0pIHtcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uLmFkZENsYXNzKCdidXR0b24tZGlzYWJsZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgY29kZW1pcnJvci5vbignY2hhbmdlJywgKCkgPT4gZmxpcERpc2FibGVkKGNvZGVtaXJyb3IsIGJ1dHRvbiwgJ3JlZG8nKSk7XG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbi5vbignY2xpY2suZWRpdG9yLnJlZG8nLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlbWlycm9yLnJlZG8oKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgaWRlbnRpZmllcjogJ2hlYWRlcnMnLFxuICAgICAgICAgICAgICAgIHRpdGxlOiB0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLkhFQURFUlMsXG4gICAgICAgICAgICAgICAgbGFiZWw6ICc8aSBjbGFzcz1cImZhIGZhLWZ3IGZhLWhlYWRlclwiPjwvaT4nLFxuICAgICAgICAgICAgICAgIG1vZGVzOiBbJ2dmbScsICdtYXJrZG93biddLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGgxOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcjogJ2gxJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJzxpIGNsYXNzPVwiZmEgZmEtZncgZmEtaGVhZGVyXCI+PC9pPjEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVzOiBbJ2dmbScsICdtYXJrZG93biddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbih7IGNvZGVtaXJyb3IsIGJ1dHRvbiwgdGV4dGFyZWEgfSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlcih7IG5hbWU6ICdoMScsIHJlcGxhY2U6ICcjICQxJywgY29kZW1pcnJvciwgYnV0dG9uLCBtb2RlOiAncmVwbGFjZUxpbmUnIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaDI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyOiAnaDInLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnPGkgY2xhc3M9XCJmYSBmYS1mdyBmYS1oZWFkZXJcIj48L2k+MicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZXM6IFsnZ2ZtJywgJ21hcmtkb3duJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uKHsgY29kZW1pcnJvciwgYnV0dG9uLCB0ZXh0YXJlYSB9KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VyKHsgbmFtZTogJ2gyJywgcmVwbGFjZTogJyMjICQxJywgY29kZW1pcnJvciwgYnV0dG9uLCBtb2RlOiAncmVwbGFjZUxpbmUnIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaDM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyOiAnaDMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnPGkgY2xhc3M9XCJmYSBmYS1mdyBmYS1oZWFkZXJcIj48L2k+MycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZXM6IFsnZ2ZtJywgJ21hcmtkb3duJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uKHsgY29kZW1pcnJvciwgYnV0dG9uLCB0ZXh0YXJlYSB9KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VyKHsgbmFtZTogJ2gzJywgcmVwbGFjZTogJyMjIyAkMScsIGNvZGVtaXJyb3IsIGJ1dHRvbiwgbW9kZTogJ3JlcGxhY2VMaW5lJyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGg0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcjogJ2g0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJzxpIGNsYXNzPVwiZmEgZmEtZncgZmEtaGVhZGVyXCI+PC9pPjQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVzOiBbJ2dmbScsICdtYXJrZG93biddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbih7IGNvZGVtaXJyb3IsIGJ1dHRvbiwgdGV4dGFyZWEgfSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlcih7IG5hbWU6ICdoNCcsIHJlcGxhY2U6ICcjIyMjICQxJywgY29kZW1pcnJvciwgYnV0dG9uLCBtb2RlOiAncmVwbGFjZUxpbmUnIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaDU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyOiAnaDUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnPGkgY2xhc3M9XCJmYSBmYS1mdyBmYS1oZWFkZXJcIj48L2k+NScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZXM6IFsnZ2ZtJywgJ21hcmtkb3duJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uKHsgY29kZW1pcnJvciwgYnV0dG9uLCB0ZXh0YXJlYSB9KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VyKHsgbmFtZTogJ2g1JywgcmVwbGFjZTogJyMjIyMjICQxJywgY29kZW1pcnJvciwgYnV0dG9uLCBtb2RlOiAncmVwbGFjZUxpbmUnIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaDY6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyOiAnaDYnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnPGkgY2xhc3M9XCJmYSBmYS1mdyBmYS1oZWFkZXJcIj48L2k+NicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZXM6IFsnZ2ZtJywgJ21hcmtkb3duJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uKHsgY29kZW1pcnJvciwgYnV0dG9uLCB0ZXh0YXJlYSB9KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VyKHsgbmFtZTogJ2g2JywgcmVwbGFjZTogJyMjIyMjIyAkMScsIGNvZGVtaXJyb3IsIGJ1dHRvbiwgbW9kZTogJ3JlcGxhY2VMaW5lJyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGJvbGQ6IHtcbiAgICAgICAgICAgICAgICBpZGVudGlmaWVyOiAnYm9sZCcsXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uQk9MRCxcbiAgICAgICAgICAgICAgICBsYWJlbDogJzxpIGNsYXNzPVwiZmEgZmEtZncgZmEtYm9sZFwiPjwvaT4nLFxuICAgICAgICAgICAgICAgIG1vZGVzOiBbJ2dmbScsICdtYXJrZG93biddLFxuICAgICAgICAgICAgICAgIHNob3J0Y3V0OiBbJ0N0cmwtQicsICdDbWQtQiddLFxuICAgICAgICAgICAgICAgIGFjdGlvbih7IGNvZGVtaXJyb3IsIGJ1dHRvbiwgdGV4dGFyZWEgfSkge1xuICAgICAgICAgICAgICAgICAgICByZXBsYWNlcih7IG5hbWU6ICdib2xkJywgcmVwbGFjZTogJyoqJDEkY3VyKionLCBjb2RlbWlycm9yLCBidXR0b24gfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBpdGFsaWM6IHtcbiAgICAgICAgICAgICAgICBpZGVudGlmaWVyOiAnaXRhbGljJyxcbiAgICAgICAgICAgICAgICB0aXRsZTogdHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5JVEFMSUMsXG4gICAgICAgICAgICAgICAgbGFiZWw6ICc8aSBjbGFzcz1cImZhIGZhLWZ3IGZhLWl0YWxpY1wiPjwvaT4nLFxuICAgICAgICAgICAgICAgIG1vZGVzOiBbJ2dmbScsICdtYXJrZG93biddLFxuICAgICAgICAgICAgICAgIHNob3J0Y3V0OiBbJ0N0cmwtSScsICdDbWQtSSddLFxuICAgICAgICAgICAgICAgIGFjdGlvbih7IGNvZGVtaXJyb3IsIGJ1dHRvbiwgdGV4dGFyZWEgfSkge1xuICAgICAgICAgICAgICAgICAgICByZXBsYWNlcih7IG5hbWU6ICdpdGFsaWMnLCByZXBsYWNlOiAnXyQxJGN1cl8nLCBjb2RlbWlycm9yLCBidXR0b24gfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBzdHJpa2U6IHtcbiAgICAgICAgICAgICAgICBpZGVudGlmaWVyOiAnc3RyaWtlJyxcbiAgICAgICAgICAgICAgICB0aXRsZTogdHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5TVFJJS0VUSFJPVUdILFxuICAgICAgICAgICAgICAgIGxhYmVsOiAnPGkgY2xhc3M9XCJmYSBmYS1mdyBmYS1zdHJpa2V0aHJvdWdoXCI+PC9pPicsXG4gICAgICAgICAgICAgICAgbW9kZXM6IFsnZ2ZtJywgJ21hcmtkb3duJ10sXG4gICAgICAgICAgICAgICAgYWN0aW9uKHsgY29kZW1pcnJvciwgYnV0dG9uLCB0ZXh0YXJlYSB9KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcGxhY2VyKHsgbmFtZTogJ3N0cmlrZScsIHJlcGxhY2U6ICd+fiQxJGN1cn5+JywgY29kZW1pcnJvciwgYnV0dG9uIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwge1xuICAgICAgICAgICAgZGVsaW1pdGVyOiB7XG4gICAgICAgICAgICAgICAgaWRlbnRpZmllcjogJ2RlbGltaXRlcicsXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uU1VNTUFSWV9ERUxJTUlURVIsXG4gICAgICAgICAgICAgICAgbGFiZWw6ICc8aSBjbGFzcz1cImZhIGZhLWZ3IGZhLW1pbnVzXCI+PC9pPicsXG4gICAgICAgICAgICAgICAgbW9kZXM6IFsnZ2ZtJywgJ21hcmtkb3duJ10sXG4gICAgICAgICAgICAgICAgYWN0aW9uKHsgY29kZW1pcnJvciwgYnV0dG9uLCB0ZXh0YXJlYSB9KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcGxhY2VyKHsgbmFtZTogJ2RlbGltaXRlcicsIHJlcGxhY2U6IGAke2NvbmZpZy5zaXRlLmRlbGltaXRlcn0kMWAsIGNvZGVtaXJyb3IsIGJ1dHRvbiwgbW9kZTogJ3JlcGxhY2VMaW5lJyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGxpbms6IHtcbiAgICAgICAgICAgICAgICBpZGVudGlmaWVyOiAnbGluaycsXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uTElOSyxcbiAgICAgICAgICAgICAgICBsYWJlbDogJzxpIGNsYXNzPVwiZmEgZmEtZncgZmEtbGlua1wiPjwvaT4nLFxuICAgICAgICAgICAgICAgIG1vZGVzOiBbJ2dmbScsICdtYXJrZG93biddLFxuICAgICAgICAgICAgICAgIHNob3J0Y3V0OiBbJ0N0cmwtSycsICdDbWQtSyddLFxuICAgICAgICAgICAgICAgIGFjdGlvbih7IGNvZGVtaXJyb3IsIGJ1dHRvbiwgdGV4dGFyZWEgfSkge1xuICAgICAgICAgICAgICAgICAgICByZXBsYWNlcih7IG5hbWU6ICdsaW5rJywgcmVwbGFjZTogJ1skMV0oJGN1ciknLCBjb2RlbWlycm9yLCBidXR0b24gfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBpbWFnZToge1xuICAgICAgICAgICAgICAgIGlkZW50aWZpZXI6ICdpbWFnZScsXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uSU1BR0UsXG4gICAgICAgICAgICAgICAgbGFiZWw6ICc8aSBjbGFzcz1cImZhIGZhLWZ3IGZhLXBpY3R1cmUtb1wiPjwvaT4nLFxuICAgICAgICAgICAgICAgIG1vZGVzOiBbJ2dmbScsICdtYXJrZG93biddLFxuICAgICAgICAgICAgICAgIGFjdGlvbih7IGNvZGVtaXJyb3IsIGJ1dHRvbiwgdGV4dGFyZWEgfSkge1xuICAgICAgICAgICAgICAgICAgICByZXBsYWNlcih7IG5hbWU6ICdpbWFnZScsIHJlcGxhY2U6ICchWyQxXShodHRwOi8vJGN1ciknLCBjb2RlbWlycm9yLCBidXR0b24gfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBibG9ja3F1b3RlOiB7XG4gICAgICAgICAgICAgICAgaWRlbnRpZmllcjogJ2Jsb2NrcXVvdGUnLFxuICAgICAgICAgICAgICAgIHRpdGxlOiB0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLkJMT0NLUVVPVEUsXG4gICAgICAgICAgICAgICAgbGFiZWw6ICc8aSBjbGFzcz1cImZhIGZhLWZ3IGZhLXF1b3RlLXJpZ2h0XCI+PC9pPicsXG4gICAgICAgICAgICAgICAgbW9kZXM6IFsnZ2ZtJywgJ21hcmtkb3duJ10sXG4gICAgICAgICAgICAgICAgYWN0aW9uKHsgY29kZW1pcnJvciwgYnV0dG9uLCB0ZXh0YXJlYSB9KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcGxhY2VyKHsgbmFtZTogJ2Jsb2NrcXVvdGUnLCByZXBsYWNlOiAnPiAkMScsIGNvZGVtaXJyb3IsIGJ1dHRvbiwgbW9kZTogJ3JlcGxhY2VMaW5lJyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGxpc3RVbDoge1xuICAgICAgICAgICAgICAgIGlkZW50aWZpZXI6ICdsaXN0VWwnLFxuICAgICAgICAgICAgICAgIHRpdGxlOiB0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLlVOT1JERVJFRF9MSVNULFxuICAgICAgICAgICAgICAgIGxhYmVsOiAnPGkgY2xhc3M9XCJmYSBmYS1mdyBmYS1saXN0LXVsXCI+PC9pPicsXG4gICAgICAgICAgICAgICAgbW9kZXM6IFsnZ2ZtJywgJ21hcmtkb3duJ10sXG4gICAgICAgICAgICAgICAgYWN0aW9uKHsgY29kZW1pcnJvciwgYnV0dG9uLCB0ZXh0YXJlYSB9KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcGxhY2VyKHsgbmFtZTogJ2xpc3RVbCcsIHJlcGxhY2U6ICcqICQxJywgY29kZW1pcnJvciwgYnV0dG9uLCBtb2RlOiAncmVwbGFjZUxpbmUnIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwge1xuICAgICAgICAgICAgbGlzdE9sOiB7XG4gICAgICAgICAgICAgICAgaWRlbnRpZmllcjogJ2xpc3RPbCcsXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uT1JERVJFRF9MSVNULFxuICAgICAgICAgICAgICAgIGxhYmVsOiAnPGkgY2xhc3M9XCJmYSBmYS1mdyBmYS1saXN0LW9sXCI+PC9pPicsXG4gICAgICAgICAgICAgICAgbW9kZXM6IFsnZ2ZtJywgJ21hcmtkb3duJ10sXG4gICAgICAgICAgICAgICAgYWN0aW9uKHsgY29kZW1pcnJvciwgYnV0dG9uLCB0ZXh0YXJlYSB9KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcGxhY2VyKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdsaXN0T2wnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZTogJy4gJDEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZW1pcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGU6ICdyZXBsYWNlTGluZScsXG4gICAgICAgICAgICAgICAgICAgICAgICBydW5uZXI6IGZ1bmN0aW9uKGxpbmUsIG1hcmt1cCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaW5lTm8gPSBjb2RlbWlycm9yLmdldExpbmVOdW1iZXIobGluZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByZXZpb3VzTGluZSA9IGNvZGVtaXJyb3IuZ2V0TGluZShsaW5lTm8gLSAxKSB8fCAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWF0Y2ggPSBwcmV2aW91c0xpbmUubWF0Y2goL14oXFxkKylcXC4vKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcHJlZml4ID0gMSArIChtYXRjaCA/IE51bWJlcihtYXRjaFsxXSkgOiAwKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHtwcmVmaXh9JHttYXJrdXB9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgXSxcbiAgICBzdGF0ZXM6IFt7XG4gICAgICAgIGNvZGU6IHtcbiAgICAgICAgICAgIGlkZW50aWZpZXI6ICdlZGl0b3InLFxuICAgICAgICAgICAgdGl0bGU6IHRyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uRURJVE9SLFxuICAgICAgICAgICAgbGFiZWw6ICc8aSBjbGFzcz1cImZhIGZhLWZ3IGZhLWNvZGVcIj48L2k+JyxcbiAgICAgICAgICAgIGFjdGlvbih7IGNvZGVtaXJyb3IsIGJ1dHRvbiwgdGV4dGFyZWEsIHVpIH0pIHtcbiAgICAgICAgICAgICAgICBpZiAodGV4dGFyZWEuZGF0YSgnZ3Jhdi1lZGl0b3ItbW9kZScpID09PSAnZWRpdG9yJykge1xuICAgICAgICAgICAgICAgICAgICBidXR0b24uYWRkQ2xhc3MoJ2VkaXRvci1hY3RpdmUnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBidXR0b24ub24oJ2NsaWNrLnN0YXRlcy5lZGl0b3InLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbi5zaWJsaW5ncygpLnJlbW92ZUNsYXNzKCdlZGl0b3ItYWN0aXZlJyk7XG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbi5hZGRDbGFzcygnZWRpdG9yLWFjdGl2ZScpO1xuICAgICAgICAgICAgICAgICAgICB0ZXh0YXJlYS5kYXRhKCdncmF2LWVkaXRvci1tb2RlJywgJ2VkaXRvcicpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcHJldmlld0NvbnRhaW5lciA9IHRleHRhcmVhLmRhdGEoJ2dyYXYtZWRpdG9yLXByZXZpZXctY29udGFpbmVyJyk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gdGV4dGFyZWEucGFyZW50KCcuZ3Jhdi1lZGl0b3ItY29udGVudCcpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQuYWRkQ2xhc3MoJ2lzLWFjdGl2ZScpO1xuICAgICAgICAgICAgICAgICAgICB1aS5uYXZpZ2F0aW9uLmZpbmQoJy5ncmF2LWVkaXRvci1hY3Rpb25zJykuY3NzKCd2aXNpYmlsaXR5JywgJ3Zpc2libGUnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZpZXdDb250YWluZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpZXdDb250YWluZXIucmVtb3ZlQ2xhc3MoJ2lzLWFjdGl2ZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIHByZXZpZXc6IHtcbiAgICAgICAgICAgIGlkZW50aWZpZXI6ICdwcmV2aWV3JyxcbiAgICAgICAgICAgIHRpdGxlOiB0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLlBSRVZJRVcsXG4gICAgICAgICAgICBsYWJlbDogJzxpIGNsYXNzPVwiZmEgZmEtZncgZmEtZXllXCI+PC9pPicsXG4gICAgICAgICAgICBtb2RlczogWydnZm0nLCAnbWFya2Rvd24nXSxcbiAgICAgICAgICAgIGFjdGlvbih7IGNvZGVtaXJyb3IsIGJ1dHRvbiwgdGV4dGFyZWEsIHVpIH0pIHtcbiAgICAgICAgICAgICAgICBpZiAodGV4dGFyZWEuZGF0YSgnZ3Jhdi1lZGl0b3ItbW9kZScpID09PSAncHJldmlldycpIHtcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uLmFkZENsYXNzKCdlZGl0b3ItYWN0aXZlJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJ1dHRvbi5vbignY2xpY2suc3RhdGVzLnByZXZpZXcnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwcmV2aWV3Q29udGFpbmVyID0gdGV4dGFyZWEuZGF0YSgnZ3Jhdi1lZGl0b3ItcHJldmlldy1jb250YWluZXInKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSB0ZXh0YXJlYS5wYXJlbnQoJy5ncmF2LWVkaXRvci1jb250ZW50Jyk7XG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbi5zaWJsaW5ncygpLnJlbW92ZUNsYXNzKCdlZGl0b3ItYWN0aXZlJyk7XG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbi5hZGRDbGFzcygnZWRpdG9yLWFjdGl2ZScpO1xuICAgICAgICAgICAgICAgICAgICB0ZXh0YXJlYS5kYXRhKCdncmF2LWVkaXRvci1tb2RlJywgJ3ByZXZpZXcnKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIXByZXZpZXdDb250YWluZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpZXdDb250YWluZXIgPSAkKCc8ZGl2IGNsYXNzPVwiZ3Jhdi1lZGl0b3ItcHJldmlld1wiIC8+Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LmFmdGVyKHByZXZpZXdDb250YWluZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dGFyZWEuZGF0YSgnZ3Jhdi1lZGl0b3ItcHJldmlldy1jb250YWluZXInLCBwcmV2aWV3Q29udGFpbmVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHByZXZpZXdDb250YWluZXIuY3NzKHsgaGVpZ2h0OiBjb250ZW50LmhlaWdodCgpIH0pO1xuICAgICAgICAgICAgICAgICAgICBwcmV2aWV3Q29udGFpbmVyLmFkZENsYXNzKCdpcy1hY3RpdmUnKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudC5yZW1vdmVDbGFzcygnaXMtYWN0aXZlJyk7XG4gICAgICAgICAgICAgICAgICAgIHVpLm5hdmlnYXRpb24uZmluZCgnLmdyYXYtZWRpdG9yLWFjdGlvbnMnKS5jc3MoJ3Zpc2liaWxpdHknLCAnaGlkZGVuJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9IGAke3RleHRhcmVhLmRhdGEoJ2dyYXYtdXJscHJldmlldycpfS90YXNrJHtjb25maWcucGFyYW1fc2VwfXByb2Nlc3NtYXJrZG93bmA7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXJhbXMgPSB0ZXh0YXJlYS5jbG9zZXN0KCdmb3JtJykuc2VyaWFsaXplQXJyYXkoKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJvZHkgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm1hcCgob2JqKSA9PiB7IGJvZHlbb2JqLm5hbWVdID0gb2JqLnZhbHVlOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCh1cmwsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ3Bvc3QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keVxuICAgICAgICAgICAgICAgICAgICB9LCAocmVzcG9uc2UpID0+IHByZXZpZXdDb250YWluZXIuaHRtbChyZXNwb25zZS5wcmV2aWV3KSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGZ1bGxzY3JlZW46IHtcbiAgICAgICAgICAgIGlkZW50aWZpZXI6ICdmdWxsc2NyZWVuJyxcbiAgICAgICAgICAgIHRpdGxlOiB0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLkZVTExTQ1JFRU4sXG4gICAgICAgICAgICBsYWJlbDogJzxpIGNsYXNzPVwiZmEgZmEtZncgZmEtZXhwYW5kXCI+PC9pPicsXG4gICAgICAgICAgICBhY3Rpb24oeyBjb2RlbWlycm9yLCBidXR0b24sIHRleHRhcmVhIH0pIHtcbiAgICAgICAgICAgICAgICBidXR0b24ub24oJ2NsaWNrLmVkaXRvci5mdWxsc2NyZWVuJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29udGFpbmVyID0gdGV4dGFyZWEuY2xvc2VzdCgnLmdyYXYtZWRpdG9yJyk7XG4gICAgICAgICAgICAgICAgICAgIGxldCB3cmFwcGVyID0gY29kZW1pcnJvci5nZXRXcmFwcGVyRWxlbWVudCgpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudFdyYXBwZXIgPSAkKCcuY29udGVudC13cmFwcGVyJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjb250YWluZXIuaGFzQ2xhc3MoJ2dyYXYtZWRpdG9yLWZ1bGxzY3JlZW4nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dGFyZWEuZGF0YSgnZnVsbFNjcmVlblJlc3RvcmUnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9wOiBnbG9iYWwucGFnZVlPZmZzZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsTGVmdDogZ2xvYmFsLnBhZ2VYT2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiB3cmFwcGVyLnN0eWxlLndpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogd3JhcHBlci5zdHlsZS5oZWlnaHRcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyLnN0eWxlLndpZHRoID0gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyLnN0eWxlLmhlaWdodCA9IHRleHRhcmVhLnBhcmVudCgnLmdyYXYtZWRpdG9yLWNvbnRlbnQnKS5oZWlnaHQoKSArICdweCc7XG4gICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWwuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoaW50cyA9IGNvbnRhaW5lci5maW5kKCcuZ3Jhdi1lZGl0b3ItdG9vbGJhciAuaGludC0tdG9wJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoaW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbnRzLnJlbW92ZUNsYXNzKCdoaW50LS10b3AnKS5hZGRDbGFzcygnaGludC0tYm90dG9tJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJChoaW50c1toaW50cy5sZW5ndGggLSAxXSkuYWRkQ2xhc3MoJ2hpbnQtLWJvdHRvbS1sZWZ0Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudFdyYXBwZXIpIHsgY29udGVudFdyYXBwZXIuY3NzKCdvdmVyZmxvdycsICd2aXNpYmxlJyk7IH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdGF0ZSA9IHRleHRhcmVhLmRhdGEoJ2Z1bGxTY3JlZW5SZXN0b3JlJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXIuc3R5bGUud2lkdGggPSBzdGF0ZS53aWR0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXIuc3R5bGUuaGVpZ2h0ID0gc3RhdGUuaGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsLnNjcm9sbFRvKHN0YXRlLnNjcm9sbExlZnQsIHN0YXRlLnNjcm9sbFRvcCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoaW50cyA9IGNvbnRhaW5lci5maW5kKCcuZ3Jhdi1lZGl0b3ItdG9vbGJhciAuaGludC0tYm90dG9tJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoaW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbnRzLnJlbW92ZUNsYXNzKCdoaW50LS1ib3R0b20nKS5hZGRDbGFzcygnaGludC0tdG9wJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJChoaW50c1toaW50cy5sZW5ndGggLSAxXSkucmVtb3ZlQ2xhc3MoJ2hpbnQtLWJvdHRvbS1sZWZ0Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudFdyYXBwZXIpIHsgY29udGVudFdyYXBwZXIuY3NzKCdvdmVyZmxvdycsICdhdXRvJyk7IH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci50b2dnbGVDbGFzcygnZ3Jhdi1lZGl0b3ItZnVsbHNjcmVlbicpO1xuXG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZW1pcnJvci5yZWZyZXNoKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLnByZXZpZXcucGFyZW50KCkuY3NzKCdoZWlnaHQnLCB0aGlzLmNvZGUuaGVpZ2h0KCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgJChnbG9iYWwpLnRyaWdnZXIoJ3Jlc2l6ZScpO1xuICAgICAgICAgICAgICAgICAgICB9LCA1KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1dXG59O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./app/forms/fields/editor/buttons.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"strategies\": () => (/* binding */ strategies),\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! grav-config */ \"grav-config\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(grav_config__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _utils_request__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../utils/request */ \"./app/utils/request.js\");\n\n\n\n\nvar replacer = function replacer(_ref) {\n var name = _ref.name,\n replace = _ref.replace,\n codemirror = _ref.codemirror,\n button = _ref.button,\n _ref$mode = _ref.mode,\n mode = _ref$mode === void 0 ? 'replaceSelections' : _ref$mode,\n runner = _ref.runner;\n button.on(\"click.editor.\".concat(name), function () {\n strategies[mode]({\n token: '$1',\n template: replace,\n codemirror: codemirror,\n runner: runner\n });\n });\n};\n\nvar strategies = {\n replaceSelections: function replaceSelections(_ref2) {\n var template = _ref2.template,\n token = _ref2.token,\n codemirror = _ref2.codemirror,\n runner = _ref2.runner;\n var replacements = [];\n var ranges = [];\n var selections = codemirror.getSelections();\n var list = codemirror.listSelections();\n var accumulator = {};\n selections.forEach(function (selection, index) {\n var markup = template.replace(token, selection);\n var cursor = markup.indexOf('$cur');\n var _list$index$anchor = list[index].anchor,\n line = _list$index$anchor.line,\n ch = _list$index$anchor.ch;\n markup = markup.replace('$cur', '');\n markup = runner ? runner(selection, markup, list) : markup;\n replacements.push(markup);\n\n if (!accumulator[line]) {\n accumulator[line] = 0;\n }\n\n ch += accumulator[line] + (cursor === -1 ? markup.length : cursor);\n var range = {\n ch: ch,\n line: line\n };\n ranges.push({\n anchor: range,\n head: range\n });\n accumulator[line] += markup.length - selection.length;\n });\n codemirror.replaceSelections(replacements);\n codemirror.setSelections(ranges);\n codemirror.focus();\n },\n replaceLine: function replaceLine(_ref3) {\n var template = _ref3.template,\n token = _ref3.token,\n codemirror = _ref3.codemirror,\n runner = _ref3.runner;\n var list = codemirror.listSelections();\n var range;\n list.forEach(function (selection) {\n var lines = {\n min: Math.min(selection.anchor.line, selection.head.line),\n max: Math.max(selection.anchor.line, selection.head.line)\n };\n codemirror.eachLine(lines.min, lines.max + 1, function (handler) {\n var markup = template.replace(token, handler.text);\n var line = codemirror.getLineNumber(handler);\n markup = runner ? runner(handler, markup) : markup;\n codemirror.replaceRange(markup, {\n line: line,\n ch: 0\n }, {\n line: line,\n ch: markup.length\n });\n range = {\n line: line,\n ch: markup.length\n };\n });\n });\n codemirror.setSelection(range, range, 'end');\n codemirror.focus();\n },\n replaceRange: function replaceRange() {}\n};\n\nvar flipDisabled = function flipDisabled(codemirror, button, type) {\n var hasHistory = codemirror.historySize()[type];\n var element = button.find('a');\n button[hasHistory ? 'removeClass' : 'addClass']('button-disabled');\n\n if (!hasHistory) {\n element.attr('title-disabled', element.attr('title'));\n element.attr('data-hint-disabled', element.attr('data-hint'));\n element.removeAttr('title').removeAttr('data-hint');\n } else {\n element.attr('title', element.attr('title-disabled'));\n element.attr('data-hint', element.attr('data-hint-disabled'));\n element.removeAttr('title-disabled').removeAttr('data-hint-disabled');\n }\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n navigation: [{\n undo: {\n identifier: 'undo',\n title: grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.UNDO,\n label: '',\n modes: [],\n action: function action(_ref4) {\n var codemirror = _ref4.codemirror,\n button = _ref4.button,\n textarea = _ref4.textarea;\n button.addClass('button-disabled');\n codemirror.on('change', function () {\n return flipDisabled(codemirror, button, 'undo');\n });\n button.on('click.editor.undo', function () {\n codemirror.undo();\n });\n }\n }\n }, {\n redo: {\n identifier: 'redo',\n title: grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.REDO,\n label: '',\n modes: [],\n action: function action(_ref5) {\n var codemirror = _ref5.codemirror,\n button = _ref5.button,\n textarea = _ref5.textarea;\n button.addClass('button-disabled');\n codemirror.on('change', function () {\n return flipDisabled(codemirror, button, 'redo');\n });\n button.on('click.editor.redo', function () {\n codemirror.redo();\n });\n }\n }\n }, {\n headers: {\n identifier: 'headers',\n title: grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.HEADERS,\n label: '',\n modes: ['gfm', 'markdown'],\n children: [{\n h1: {\n identifier: 'h1',\n label: '1',\n modes: ['gfm', 'markdown'],\n action: function action(_ref6) {\n var codemirror = _ref6.codemirror,\n button = _ref6.button,\n textarea = _ref6.textarea;\n replacer({\n name: 'h1',\n replace: '# $1',\n codemirror: codemirror,\n button: button,\n mode: 'replaceLine'\n });\n }\n }\n }, {\n h2: {\n identifier: 'h2',\n label: '2',\n modes: ['gfm', 'markdown'],\n action: function action(_ref7) {\n var codemirror = _ref7.codemirror,\n button = _ref7.button,\n textarea = _ref7.textarea;\n replacer({\n name: 'h2',\n replace: '## $1',\n codemirror: codemirror,\n button: button,\n mode: 'replaceLine'\n });\n }\n }\n }, {\n h3: {\n identifier: 'h3',\n label: '3',\n modes: ['gfm', 'markdown'],\n action: function action(_ref8) {\n var codemirror = _ref8.codemirror,\n button = _ref8.button,\n textarea = _ref8.textarea;\n replacer({\n name: 'h3',\n replace: '### $1',\n codemirror: codemirror,\n button: button,\n mode: 'replaceLine'\n });\n }\n }\n }, {\n h4: {\n identifier: 'h4',\n label: '4',\n modes: ['gfm', 'markdown'],\n action: function action(_ref9) {\n var codemirror = _ref9.codemirror,\n button = _ref9.button,\n textarea = _ref9.textarea;\n replacer({\n name: 'h4',\n replace: '#### $1',\n codemirror: codemirror,\n button: button,\n mode: 'replaceLine'\n });\n }\n }\n }, {\n h5: {\n identifier: 'h5',\n label: '5',\n modes: ['gfm', 'markdown'],\n action: function action(_ref10) {\n var codemirror = _ref10.codemirror,\n button = _ref10.button,\n textarea = _ref10.textarea;\n replacer({\n name: 'h5',\n replace: '##### $1',\n codemirror: codemirror,\n button: button,\n mode: 'replaceLine'\n });\n }\n }\n }, {\n h6: {\n identifier: 'h6',\n label: '6',\n modes: ['gfm', 'markdown'],\n action: function action(_ref11) {\n var codemirror = _ref11.codemirror,\n button = _ref11.button,\n textarea = _ref11.textarea;\n replacer({\n name: 'h6',\n replace: '###### $1',\n codemirror: codemirror,\n button: button,\n mode: 'replaceLine'\n });\n }\n }\n }]\n }\n }, {\n bold: {\n identifier: 'bold',\n title: grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.BOLD,\n label: '',\n modes: ['gfm', 'markdown'],\n shortcut: ['Ctrl-B', 'Cmd-B'],\n action: function action(_ref12) {\n var codemirror = _ref12.codemirror,\n button = _ref12.button,\n textarea = _ref12.textarea;\n replacer({\n name: 'bold',\n replace: '**$1$cur**',\n codemirror: codemirror,\n button: button\n });\n }\n }\n }, {\n italic: {\n identifier: 'italic',\n title: grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.ITALIC,\n label: '',\n modes: ['gfm', 'markdown'],\n shortcut: ['Ctrl-I', 'Cmd-I'],\n action: function action(_ref13) {\n var codemirror = _ref13.codemirror,\n button = _ref13.button,\n textarea = _ref13.textarea;\n replacer({\n name: 'italic',\n replace: '_$1$cur_',\n codemirror: codemirror,\n button: button\n });\n }\n }\n }, {\n strike: {\n identifier: 'strike',\n title: grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.STRIKETHROUGH,\n label: '',\n modes: ['gfm', 'markdown'],\n action: function action(_ref14) {\n var codemirror = _ref14.codemirror,\n button = _ref14.button,\n textarea = _ref14.textarea;\n replacer({\n name: 'strike',\n replace: '~~$1$cur~~',\n codemirror: codemirror,\n button: button\n });\n }\n }\n }, {\n delimiter: {\n identifier: 'delimiter',\n title: grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.SUMMARY_DELIMITER,\n label: '',\n modes: ['gfm', 'markdown'],\n action: function action(_ref15) {\n var codemirror = _ref15.codemirror,\n button = _ref15.button,\n textarea = _ref15.textarea;\n replacer({\n name: 'delimiter',\n replace: \"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.site.delimiter, \"$1\"),\n codemirror: codemirror,\n button: button,\n mode: 'replaceLine'\n });\n }\n }\n }, {\n link: {\n identifier: 'link',\n title: grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.LINK,\n label: '',\n modes: ['gfm', 'markdown'],\n shortcut: ['Ctrl-K', 'Cmd-K'],\n action: function action(_ref16) {\n var codemirror = _ref16.codemirror,\n button = _ref16.button,\n textarea = _ref16.textarea;\n replacer({\n name: 'link',\n replace: '[$1]($cur)',\n codemirror: codemirror,\n button: button\n });\n }\n }\n }, {\n image: {\n identifier: 'image',\n title: grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.IMAGE,\n label: '',\n modes: ['gfm', 'markdown'],\n action: function action(_ref17) {\n var codemirror = _ref17.codemirror,\n button = _ref17.button,\n textarea = _ref17.textarea;\n replacer({\n name: 'image',\n replace: '![$1](http://$cur)',\n codemirror: codemirror,\n button: button\n });\n }\n }\n }, {\n blockquote: {\n identifier: 'blockquote',\n title: grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.BLOCKQUOTE,\n label: '',\n modes: ['gfm', 'markdown'],\n action: function action(_ref18) {\n var codemirror = _ref18.codemirror,\n button = _ref18.button,\n textarea = _ref18.textarea;\n replacer({\n name: 'blockquote',\n replace: '> $1',\n codemirror: codemirror,\n button: button,\n mode: 'replaceLine'\n });\n }\n }\n }, {\n listUl: {\n identifier: 'listUl',\n title: grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.UNORDERED_LIST,\n label: '',\n modes: ['gfm', 'markdown'],\n action: function action(_ref19) {\n var codemirror = _ref19.codemirror,\n button = _ref19.button,\n textarea = _ref19.textarea;\n replacer({\n name: 'listUl',\n replace: '* $1',\n codemirror: codemirror,\n button: button,\n mode: 'replaceLine'\n });\n }\n }\n }, {\n listOl: {\n identifier: 'listOl',\n title: grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.ORDERED_LIST,\n label: '',\n modes: ['gfm', 'markdown'],\n action: function action(_ref20) {\n var codemirror = _ref20.codemirror,\n button = _ref20.button,\n textarea = _ref20.textarea;\n replacer({\n name: 'listOl',\n replace: '. $1',\n codemirror: codemirror,\n button: button,\n mode: 'replaceLine',\n runner: function runner(line, markup) {\n var lineNo = codemirror.getLineNumber(line);\n var previousLine = codemirror.getLine(lineNo - 1) || '';\n var match = previousLine.match(/^(\\d+)\\./);\n var prefix = 1 + (match ? Number(match[1]) : 0);\n return \"\".concat(prefix).concat(markup);\n }\n });\n }\n }\n }],\n states: [{\n code: {\n identifier: 'editor',\n title: grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.EDITOR,\n label: '',\n action: function action(_ref21) {\n var codemirror = _ref21.codemirror,\n button = _ref21.button,\n textarea = _ref21.textarea,\n ui = _ref21.ui;\n\n if (textarea.data('grav-editor-mode') === 'editor') {\n button.addClass('editor-active');\n }\n\n button.on('click.states.editor', function () {\n button.siblings().removeClass('editor-active');\n button.addClass('editor-active');\n textarea.data('grav-editor-mode', 'editor');\n var previewContainer = textarea.data('grav-editor-preview-container');\n var content = textarea.parent('.grav-editor-content');\n content.addClass('is-active');\n ui.navigation.find('.grav-editor-actions').css('visibility', 'visible');\n\n if (previewContainer) {\n previewContainer.removeClass('is-active');\n }\n });\n }\n }\n }, {\n preview: {\n identifier: 'preview',\n title: grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.PREVIEW,\n label: '',\n modes: ['gfm', 'markdown'],\n action: function action(_ref22) {\n var codemirror = _ref22.codemirror,\n button = _ref22.button,\n textarea = _ref22.textarea,\n ui = _ref22.ui;\n\n if (textarea.data('grav-editor-mode') === 'preview') {\n button.addClass('editor-active');\n }\n\n button.on('click.states.preview', function () {\n var previewContainer = textarea.data('grav-editor-preview-container');\n var content = textarea.parent('.grav-editor-content');\n button.siblings().removeClass('editor-active');\n button.addClass('editor-active');\n textarea.data('grav-editor-mode', 'preview');\n\n if (!previewContainer) {\n previewContainer = jquery__WEBPACK_IMPORTED_MODULE_0___default()('
          ');\n content.after(previewContainer);\n textarea.data('grav-editor-preview-container', previewContainer);\n }\n\n previewContainer.css({\n height: content.height()\n });\n previewContainer.addClass('is-active');\n content.removeClass('is-active');\n ui.navigation.find('.grav-editor-actions').css('visibility', 'hidden');\n var url = \"\".concat(textarea.data('grav-urlpreview'), \"/task\").concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.param_sep, \"processmarkdown\");\n var params = textarea.closest('form').serializeArray();\n var body = {};\n params.map(function (obj) {\n body[obj.name] = obj.value;\n });\n (0,_utils_request__WEBPACK_IMPORTED_MODULE_2__.default)(url, {\n method: 'post',\n body: body\n }, function (response) {\n return previewContainer.html(response.preview);\n });\n });\n }\n }\n }, {\n fullscreen: {\n identifier: 'fullscreen',\n title: grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.FULLSCREEN,\n label: '',\n action: function action(_ref23) {\n var codemirror = _ref23.codemirror,\n button = _ref23.button,\n textarea = _ref23.textarea;\n button.on('click.editor.fullscreen', function () {\n var container = textarea.closest('.grav-editor');\n var wrapper = codemirror.getWrapperElement();\n var contentWrapper = jquery__WEBPACK_IMPORTED_MODULE_0___default()('.content-wrapper');\n\n if (!container.hasClass('grav-editor-fullscreen')) {\n textarea.data('fullScreenRestore', {\n scrollTop: __webpack_require__.g.pageYOffset,\n scrollLeft: __webpack_require__.g.pageXOffset,\n width: wrapper.style.width,\n height: wrapper.style.height\n });\n wrapper.style.width = '';\n wrapper.style.height = textarea.parent('.grav-editor-content').height() + 'px';\n __webpack_require__.g.document.documentElement.style.overflow = 'hidden';\n var hints = container.find('.grav-editor-toolbar .hint--top');\n\n if (hints) {\n hints.removeClass('hint--top').addClass('hint--bottom');\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(hints[hints.length - 1]).addClass('hint--bottom-left');\n }\n\n if (contentWrapper) {\n contentWrapper.css('overflow', 'visible');\n }\n } else {\n __webpack_require__.g.document.documentElement.style.overflow = '';\n var state = textarea.data('fullScreenRestore');\n wrapper.style.width = state.width;\n wrapper.style.height = state.height;\n __webpack_require__.g.scrollTo(state.scrollLeft, state.scrollTop);\n\n var _hints = container.find('.grav-editor-toolbar .hint--bottom');\n\n if (_hints) {\n _hints.removeClass('hint--bottom').addClass('hint--top');\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(_hints[_hints.length - 1]).removeClass('hint--bottom-left');\n }\n\n if (contentWrapper) {\n contentWrapper.css('overflow', 'auto');\n }\n }\n\n container.toggleClass('grav-editor-fullscreen');\n setTimeout(function () {\n codemirror.refresh(); // this.preview.parent().css('height', this.code.height());\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(__webpack_require__.g).trigger('resize');\n }, 5);\n });\n }\n }\n }]\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL2Zvcm1zL2ZpZWxkcy9lZGl0b3IvYnV0dG9ucy5qcz84OGQyIl0sIm5hbWVzIjpbInJlcGxhY2VyIiwibmFtZSIsInJlcGxhY2UiLCJjb2RlbWlycm9yIiwiYnV0dG9uIiwibW9kZSIsInJ1bm5lciIsIm9uIiwic3RyYXRlZ2llcyIsInRva2VuIiwidGVtcGxhdGUiLCJyZXBsYWNlU2VsZWN0aW9ucyIsInJlcGxhY2VtZW50cyIsInJhbmdlcyIsInNlbGVjdGlvbnMiLCJnZXRTZWxlY3Rpb25zIiwibGlzdCIsImxpc3RTZWxlY3Rpb25zIiwiYWNjdW11bGF0b3IiLCJmb3JFYWNoIiwic2VsZWN0aW9uIiwiaW5kZXgiLCJtYXJrdXAiLCJjdXJzb3IiLCJpbmRleE9mIiwiYW5jaG9yIiwibGluZSIsImNoIiwicHVzaCIsImxlbmd0aCIsInJhbmdlIiwiaGVhZCIsInNldFNlbGVjdGlvbnMiLCJmb2N1cyIsInJlcGxhY2VMaW5lIiwibGluZXMiLCJtaW4iLCJNYXRoIiwibWF4IiwiZWFjaExpbmUiLCJoYW5kbGVyIiwidGV4dCIsImdldExpbmVOdW1iZXIiLCJyZXBsYWNlUmFuZ2UiLCJzZXRTZWxlY3Rpb24iLCJmbGlwRGlzYWJsZWQiLCJ0eXBlIiwiaGFzSGlzdG9yeSIsImhpc3RvcnlTaXplIiwiZWxlbWVudCIsImZpbmQiLCJhdHRyIiwicmVtb3ZlQXR0ciIsIm5hdmlnYXRpb24iLCJ1bmRvIiwiaWRlbnRpZmllciIsInRpdGxlIiwidHJhbnNsYXRpb25zIiwibGFiZWwiLCJtb2RlcyIsImFjdGlvbiIsInRleHRhcmVhIiwiYWRkQ2xhc3MiLCJyZWRvIiwiaGVhZGVycyIsImNoaWxkcmVuIiwiaDEiLCJoMiIsImgzIiwiaDQiLCJoNSIsImg2IiwiYm9sZCIsInNob3J0Y3V0IiwiaXRhbGljIiwic3RyaWtlIiwiZGVsaW1pdGVyIiwiY29uZmlnIiwibGluayIsImltYWdlIiwiYmxvY2txdW90ZSIsImxpc3RVbCIsImxpc3RPbCIsImxpbmVObyIsInByZXZpb3VzTGluZSIsImdldExpbmUiLCJtYXRjaCIsInByZWZpeCIsIk51bWJlciIsInN0YXRlcyIsImNvZGUiLCJ1aSIsImRhdGEiLCJzaWJsaW5ncyIsInJlbW92ZUNsYXNzIiwicHJldmlld0NvbnRhaW5lciIsImNvbnRlbnQiLCJwYXJlbnQiLCJjc3MiLCJwcmV2aWV3IiwiJCIsImFmdGVyIiwiaGVpZ2h0IiwidXJsIiwicGFyYW1zIiwiY2xvc2VzdCIsInNlcmlhbGl6ZUFycmF5IiwiYm9keSIsIm1hcCIsIm9iaiIsInZhbHVlIiwicmVxdWVzdCIsIm1ldGhvZCIsInJlc3BvbnNlIiwiaHRtbCIsImZ1bGxzY3JlZW4iLCJjb250YWluZXIiLCJ3cmFwcGVyIiwiZ2V0V3JhcHBlckVsZW1lbnQiLCJjb250ZW50V3JhcHBlciIsImhhc0NsYXNzIiwic2Nyb2xsVG9wIiwiZ2xvYmFsIiwicGFnZVlPZmZzZXQiLCJzY3JvbGxMZWZ0IiwicGFnZVhPZmZzZXQiLCJ3aWR0aCIsInN0eWxlIiwiZG9jdW1lbnQiLCJkb2N1bWVudEVsZW1lbnQiLCJvdmVyZmxvdyIsImhpbnRzIiwic3RhdGUiLCJzY3JvbGxUbyIsInRvZ2dsZUNsYXNzIiwic2V0VGltZW91dCIsInJlZnJlc2giLCJ0cmlnZ2VyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBOztBQUVBLElBQUlBLFFBQVEsR0FBRyxTQUFYQSxRQUFXLE9BQStFO0FBQUEsTUFBNUVDLElBQTRFLFFBQTVFQSxJQUE0RTtBQUFBLE1BQXRFQyxPQUFzRSxRQUF0RUEsT0FBc0U7QUFBQSxNQUE3REMsVUFBNkQsUUFBN0RBLFVBQTZEO0FBQUEsTUFBakRDLE1BQWlELFFBQWpEQSxNQUFpRDtBQUFBLHVCQUF6Q0MsSUFBeUM7QUFBQSxNQUF6Q0EsSUFBeUMsMEJBQWxDLG1CQUFrQztBQUFBLE1BQWJDLE1BQWEsUUFBYkEsTUFBYTtBQUMxRkYsUUFBTSxDQUFDRyxFQUFQLHdCQUEwQk4sSUFBMUIsR0FBa0MsWUFB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a0IsbUJBQVMsQ0FBQ2tCLFdBQVYsQ0FBc0Isd0JBQXRCO0FBRUFDLG9CQUFVLENBQUMsWUFBTTtBQUNicEksc0JBQVUsQ0FBQ3FJLE9BQVgsR0FEYSxDQUViOztBQUNBcEMseURBQUMsQ0FBQ3NCLHFCQUFELENBQUQsQ0FBVWUsT0FBVixDQUFrQixRQUFsQjtBQUNILFdBSlMsRUFJUCxDQUpPLENBQVY7QUFLSCxTQWhERDtBQWlESDtBQXRETztBQURiLEdBaEVLO0FBbk5HLENBQWYiLCJmaWxlIjoiLi9hcHAvZm9ybXMvZmllbGRzL2VkaXRvci9idXR0b25zLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCB7IGNvbmZpZywgdHJhbnNsYXRpb25zIH0gZnJvbSAnZ3Jhdi1jb25maWcnO1xuaW1wb3J0IHJlcXVlc3QgZnJvbSAnLi4vLi4vLi4vdXRpbHMvcmVxdWVzdCc7XG5cbmxldCByZXBsYWNlciA9ICh7IG5hbWUsIHJlcGxhY2UsIGNvZGVtaXJyb3IsIGJ1dHRvbiwgbW9kZSA9ICdyZXBsYWNlU2VsZWN0aW9ucycsIHJ1bm5lciB9KSA9PiB7XG4gICAgYnV0dG9uLm9uKGBjbGljay5lZGl0b3IuJHtuYW1lfWAsICgpID0+IHtcbiAgICAgICAgc3RyYXRlZ2llc1ttb2RlXSh7IHRva2VuOiAnJDEnLCB0ZW1wbGF0ZTogcmVwbGFjZSwgY29kZW1pcnJvciwgcnVubmVyIH0pO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGxldCBzdHJhdGVnaWVzID0ge1xuICAgIHJlcGxhY2VTZWxlY3Rpb25zKHsgdGVtcGxhdGUsIHRva2VuLCBjb2RlbWlycm9yLCBydW5uZXIgfSkge1xuICAgICAgICBsZXQgcmVwbGFjZW1lbnRzID0gW107XG4gICAgICAgIGxldCByYW5nZXMgPSBbXTtcbiAgICAgICAgbGV0IHNlbGVjdGlvbnMgPSBjb2RlbWlycm9yLmdldFNlbGVjdGlvbnMoKTtcbiAgICAgICAgbGV0IGxpc3QgPSBjb2RlbWlycm9yLmxpc3RTZWxlY3Rpb25zKCk7XG4gICAgICAgIGxldCBhY2N1bXVsYXRvciA9IHt9O1xuXG4gICAgICAgIHNlbGVjdGlvbnMuZm9yRWFjaCgoc2VsZWN0aW9uLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgbGV0IG1hcmt1cCA9IHRlbXBsYXRlLnJlcGxhY2UodG9rZW4sIHNlbGVjdGlvbik7XG5cbiAgICAgICAgICAgIGxldCBjdXJzb3IgPSBtYXJrdXAuaW5kZXhPZignJGN1cicpO1xuICAgICAgICAgICAgbGV0IHsgbGluZSwgY2ggfSA9IGxpc3RbaW5kZXhdLmFuY2hvcjtcblxuICAgICAgICAgICAgbWFya3VwID0gbWFya3VwLnJlcGxhY2UoJyRjdXInLCAnJyk7XG4gICAgICAgICAgICBtYXJrdXAgPSBydW5uZXIgPyBydW5uZXIoc2VsZWN0aW9uLCBtYXJrdXAsIGxpc3QpIDogbWFya3VwO1xuICAgICAgICAgICAgcmVwbGFjZW1lbnRzLnB1c2gobWFya3VwKTtcblxuICAgICAgICAgICAgaWYgKCFhY2N1bXVsYXRvcltsaW5lXSkgeyBhY2N1bXVsYXRvcltsaW5lXSA9IDA7IH1cblxuICAgICAgICAgICAgY2ggKz0gYWNjdW11bGF0b3JbbGluZV0gKyAoY3Vyc29yID09PSAtMSA/IG1hcmt1cC5sZW5ndGggOiBjdXJzb3IpO1xuICAgICAgICAgICAgbGV0IHJhbmdlID0geyBjaCwgbGluZSB9O1xuXG4gICAgICAgICAgICByYW5nZXMucHVzaCh7IGFuY2hvcjogcmFuZ2UsIGhlYWQ6IHJhbmdlIH0pO1xuICAgICAgICAgICAgYWNjdW11bGF0b3JbbGluZV0gKz0gbWFya3VwLmxlbmd0aCAtIHNlbGVjdGlvbi5sZW5ndGg7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvZGVtaXJyb3IucmVwbGFjZVNlbGVjdGlvbnMocmVwbGFjZW1lbnRzKTtcbiAgICAgICAgY29kZW1pcnJvci5zZXRTZWxlY3Rpb25zKHJhbmdlcyk7XG4gICAgICAgIGNvZGVtaXJyb3IuZm9jdXMoKTtcbiAgICB9LFxuICAgIHJlcGxhY2VMaW5lKHsgdGVtcGxhdGUsIHRva2VuLCBjb2RlbWlycm9yLCBydW5uZXIgfSkge1xuICAgICAgICBsZXQgbGlzdCA9IGNvZGVtaXJyb3IubGlzdFNlbGVjdGlvbnMoKTtcbiAgICAgICAgbGV0IHJhbmdlO1xuXG4gICAgICAgIGxpc3QuZm9yRWFjaCgoc2VsZWN0aW9uKSA9PiB7XG4gICAgICAgICAgICBsZXQgbGluZXMgPSB7XG4gICAgICAgICAgICAgICAgbWluOiBNYXRoLm1pbihzZWxlY3Rpb24uYW5jaG9yLmxpbmUsIHNlbGVjdGlvbi5oZWFkLmxpbmUpLFxuICAgICAgICAgICAgICAgIG1heDogTWF0aC5tYXgoc2VsZWN0aW9uLmFuY2hvci5saW5lLCBzZWxlY3Rpb24uaGVhZC5saW5lKVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29kZW1pcnJvci5lYWNoTGluZShsaW5lcy5taW4sIGxpbmVzLm1heCArIDEsIChoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IG1hcmt1cCA9IHRlbXBsYXRlLnJlcGxhY2UodG9rZW4sIGhhbmRsZXIudGV4dCk7XG4gICAgICAgICAgICAgICAgbGV0IGxpbmUgPSBjb2RlbWlycm9yLmdldExpbmVOdW1iZXIoaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgbWFya3VwID0gcnVubmVyID8gcnVubmVyKGhhbmRsZXIsIG1hcmt1cCkgOiBtYXJrdXA7XG4gICAgICAgICAgICAgICAgY29kZW1pcnJvci5yZXBsYWNlUmFuZ2UobWFya3VwLCB7IGxpbmUsIGNoOiAwIH0sIHsgbGluZSwgY2g6IG1hcmt1cC5sZW5ndGggfSk7XG4gICAgICAgICAgICAgICAgcmFuZ2UgPSB7IGxpbmUsIGNoOiBtYXJrdXAubGVuZ3RoIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29kZW1pcnJvci5zZXRTZWxlY3Rpb24ocmFuZ2UsIHJhbmdlLCAnZW5kJyk7XG4gICAgICAgIGNvZGVtaXJyb3IuZm9jdXMoKTtcbiAgICB9LFxuICAgIHJlcGxhY2VSYW5nZSgpIHt9XG59O1xuXG5jb25zdCBmbGlwRGlzYWJsZWQgPSAoY29kZW1pcnJvciwgYnV0dG9uLCB0eXBlKSA9PiB7XG4gICAgbGV0IGhhc0hpc3RvcnkgPSBjb2RlbWlycm9yLmhpc3RvcnlTaXplKClbdHlwZV07XG4gICAgbGV0IGVsZW1lbnQgPSBidXR0b24uZmluZCgnYScpO1xuICAgIGJ1dHRvbltoYXNIaXN0b3J5ID8gJ3JlbW92ZUNsYXNzJyA6ICdhZGRDbGFzcyddKCdidXR0b24tZGlzYWJsZWQnKTtcblxuICAgIGlmICghaGFzSGlzdG9yeSkge1xuICAgICAgICBlbGVtZW50LmF0dHIoJ3RpdGxlLWRpc2FibGVkJywgZWxlbWVudC5hdHRyKCd0aXRsZScpKTtcbiAgICAgICAgZWxlbWVudC5hdHRyKCdkYXRhLWhpbnQtZGlzYWJsZWQnLCBlbGVtZW50LmF0dHIoJ2RhdGEtaGludCcpKTtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyKCd0aXRsZScpLnJlbW92ZUF0dHIoJ2RhdGEtaGludCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGVsZW1lbnQuYXR0cigndGl0bGUnLCBlbGVtZW50LmF0dHIoJ3RpdGxlLWRpc2FibGVkJykpO1xuICAgICAgICBlbGVtZW50LmF0dHIoJ2RhdGEtaGludCcsIGVsZW1lbnQuYXR0cignZGF0YS1oaW50LWRpc2FibGVkJykpO1xuICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHIoJ3RpdGxlLWRpc2FibGVkJykucmVtb3ZlQXR0cignZGF0YS1oaW50LWRpc2FibGVkJyk7XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQge1xuICAgIG5hdmlnYXRpb246IFtcbiAgICAgICAge1xuICAgICAgICAgICAgdW5kbzoge1xuICAgICAgICAgICAgICAgIGlkZW50aWZpZXI6ICd1bmRvJyxcbiAgICAgICAgICAgICAgICB0aXRsZTogdHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5VTkRPLFxuICAgICAgICAgICAgICAgIGxhYmVsOiAnPGkgY2xhc3M9XCJmYSBmYS1mdyBmYS11bmRvXCI+PC9pPicsXG4gICAgICAgICAgICAgICAgbW9kZXM6IFtdLFxuICAgICAgICAgICAgICAgIGFjdGlvbih7IGNvZGVtaXJyb3IsIGJ1dHRvbiwgdGV4dGFyZWF9KSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbi5hZGRDbGFzcygnYnV0dG9uLWRpc2FibGVkJyk7XG4gICAgICAgICAgICAgICAgICAgIGNvZGVtaXJyb3Iub24oJ2NoYW5nZScsICgpID0+IGZsaXBEaXNhYmxlZChjb2RlbWlycm9yLCBidXR0b24sICd1bmRvJykpO1xuICAgICAgICAgICAgICAgICAgICBidXR0b24ub24oJ2NsaWNrLmVkaXRvci51bmRvJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZW1pcnJvci51bmRvKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgcmVkbzoge1xuICAgICAgICAgICAgICAgIGlkZW50aWZpZXI6ICdyZWRvJyxcbiAgICAgICAgICAgICAgICB0aXRsZTogdHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5SRURPLFxuICAgICAgICAgICAgICAgIGxhYmVsOiAnPGkgY2xhc3M9XCJmYSBmYS1mdyBmYS1yZXBlYXRcIj48L2k+JyxcbiAgICAgICAgICAgICAgICBtb2RlczogW10sXG4gICAgICAgICAgICAgICAgYWN0aW9uKHsgY29kZW1pcnJvciwgYnV0dG9uLCB0ZXh0YXJlYX0pIHtcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uLmFkZENsYXNzKCdidXR0b24tZGlzYWJsZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgY29kZW1pcnJvci5vbignY2hhbmdlJywgKCkgPT4gZmxpcERpc2FibGVkKGNvZGVtaXJyb3IsIGJ1dHRvbiwgJ3JlZG8nKSk7XG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbi5vbignY2xpY2suZWRpdG9yLnJlZG8nLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlbWlycm9yLnJlZG8oKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgaWRlbnRpZmllcjogJ2hlYWRlcnMnLFxuICAgICAgICAgICAgICAgIHRpdGxlOiB0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLkhFQURFUlMsXG4gICAgICAgICAgICAgICAgbGFiZWw6ICc8aSBjbGFzcz1cImZhIGZhLWZ3IGZhLWhlYWRlclwiPjwvaT4nLFxuICAgICAgICAgICAgICAgIG1vZGVzOiBbJ2dmbScsICdtYXJrZG93biddLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGgxOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcjogJ2gxJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJzxpIGNsYXNzPVwiZmEgZmEtZncgZmEtaGVhZGVyXCI+PC9pPjEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVzOiBbJ2dmbScsICdtYXJrZG93biddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbih7IGNvZGVtaXJyb3IsIGJ1dHRvbiwgdGV4dGFyZWEgfSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlcih7IG5hbWU6ICdoMScsIHJlcGxhY2U6ICcjICQxJywgY29kZW1pcnJvciwgYnV0dG9uLCBtb2RlOiAncmVwbGFjZUxpbmUnIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaDI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyOiAnaDInLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnPGkgY2xhc3M9XCJmYSBmYS1mdyBmYS1oZWFkZXJcIj48L2k+MicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZXM6IFsnZ2ZtJywgJ21hcmtkb3duJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uKHsgY29kZW1pcnJvciwgYnV0dG9uLCB0ZXh0YXJlYSB9KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VyKHsgbmFtZTogJ2gyJywgcmVwbGFjZTogJyMjICQxJywgY29kZW1pcnJvciwgYnV0dG9uLCBtb2RlOiAncmVwbGFjZUxpbmUnIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaDM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyOiAnaDMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnPGkgY2xhc3M9XCJmYSBmYS1mdyBmYS1oZWFkZXJcIj48L2k+MycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZXM6IFsnZ2ZtJywgJ21hcmtkb3duJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uKHsgY29kZW1pcnJvciwgYnV0dG9uLCB0ZXh0YXJlYSB9KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VyKHsgbmFtZTogJ2gzJywgcmVwbGFjZTogJyMjIyAkMScsIGNvZGVtaXJyb3IsIGJ1dHRvbiwgbW9kZTogJ3JlcGxhY2VMaW5lJyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGg0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcjogJ2g0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJzxpIGNsYXNzPVwiZmEgZmEtZncgZmEtaGVhZGVyXCI+PC9pPjQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVzOiBbJ2dmbScsICdtYXJrZG93biddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbih7IGNvZGVtaXJyb3IsIGJ1dHRvbiwgdGV4dGFyZWEgfSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlcih7IG5hbWU6ICdoNCcsIHJlcGxhY2U6ICcjIyMjICQxJywgY29kZW1pcnJvciwgYnV0dG9uLCBtb2RlOiAncmVwbGFjZUxpbmUnIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaDU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyOiAnaDUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnPGkgY2xhc3M9XCJmYSBmYS1mdyBmYS1oZWFkZXJcIj48L2k+NScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZXM6IFsnZ2ZtJywgJ21hcmtkb3duJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uKHsgY29kZW1pcnJvciwgYnV0dG9uLCB0ZXh0YXJlYSB9KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VyKHsgbmFtZTogJ2g1JywgcmVwbGFjZTogJyMjIyMjICQxJywgY29kZW1pcnJvciwgYnV0dG9uLCBtb2RlOiAncmVwbGFjZUxpbmUnIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaDY6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyOiAnaDYnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnPGkgY2xhc3M9XCJmYSBmYS1mdyBmYS1oZWFkZXJcIj48L2k+NicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZXM6IFsnZ2ZtJywgJ21hcmtkb3duJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uKHsgY29kZW1pcnJvciwgYnV0dG9uLCB0ZXh0YXJlYSB9KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VyKHsgbmFtZTogJ2g2JywgcmVwbGFjZTogJyMjIyMjIyAkMScsIGNvZGVtaXJyb3IsIGJ1dHRvbiwgbW9kZTogJ3JlcGxhY2VMaW5lJyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGJvbGQ6IHtcbiAgICAgICAgICAgICAgICBpZGVudGlmaWVyOiAnYm9sZCcsXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uQk9MRCxcbiAgICAgICAgICAgICAgICBsYWJlbDogJzxpIGNsYXNzPVwiZmEgZmEtZncgZmEtYm9sZFwiPjwvaT4nLFxuICAgICAgICAgICAgICAgIG1vZGVzOiBbJ2dmbScsICdtYXJrZG93biddLFxuICAgICAgICAgICAgICAgIHNob3J0Y3V0OiBbJ0N0cmwtQicsICdDbWQtQiddLFxuICAgICAgICAgICAgICAgIGFjdGlvbih7IGNvZGVtaXJyb3IsIGJ1dHRvbiwgdGV4dGFyZWEgfSkge1xuICAgICAgICAgICAgICAgICAgICByZXBsYWNlcih7IG5hbWU6ICdib2xkJywgcmVwbGFjZTogJyoqJDEkY3VyKionLCBjb2RlbWlycm9yLCBidXR0b24gfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBpdGFsaWM6IHtcbiAgICAgICAgICAgICAgICBpZGVudGlmaWVyOiAnaXRhbGljJyxcbiAgICAgICAgICAgICAgICB0aXRsZTogdHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5JVEFMSUMsXG4gICAgICAgICAgICAgICAgbGFiZWw6ICc8aSBjbGFzcz1cImZhIGZhLWZ3IGZhLWl0YWxpY1wiPjwvaT4nLFxuICAgICAgICAgICAgICAgIG1vZGVzOiBbJ2dmbScsICdtYXJrZG93biddLFxuICAgICAgICAgICAgICAgIHNob3J0Y3V0OiBbJ0N0cmwtSScsICdDbWQtSSddLFxuICAgICAgICAgICAgICAgIGFjdGlvbih7IGNvZGVtaXJyb3IsIGJ1dHRvbiwgdGV4dGFyZWEgfSkge1xuICAgICAgICAgICAgICAgICAgICByZXBsYWNlcih7IG5hbWU6ICdpdGFsaWMnLCByZXBsYWNlOiAnXyQxJGN1cl8nLCBjb2RlbWlycm9yLCBidXR0b24gfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBzdHJpa2U6IHtcbiAgICAgICAgICAgICAgICBpZGVudGlmaWVyOiAnc3RyaWtlJyxcbiAgICAgICAgICAgICAgICB0aXRsZTogdHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5TVFJJS0VUSFJPVUdILFxuICAgICAgICAgICAgICAgIGxhYmVsOiAnPGkgY2xhc3M9XCJmYSBmYS1mdyBmYS1zdHJpa2V0aHJvdWdoXCI+PC9pPicsXG4gICAgICAgICAgICAgICAgbW9kZXM6IFsnZ2ZtJywgJ21hcmtkb3duJ10sXG4gICAgICAgICAgICAgICAgYWN0aW9uKHsgY29kZW1pcnJvciwgYnV0dG9uLCB0ZXh0YXJlYSB9KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcGxhY2VyKHsgbmFtZTogJ3N0cmlrZScsIHJlcGxhY2U6ICd+fiQxJGN1cn5+JywgY29kZW1pcnJvciwgYnV0dG9uIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwge1xuICAgICAgICAgICAgZGVsaW1pdGVyOiB7XG4gICAgICAgICAgICAgICAgaWRlbnRpZmllcjogJ2RlbGltaXRlcicsXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uU1VNTUFSWV9ERUxJTUlURVIsXG4gICAgICAgICAgICAgICAgbGFiZWw6ICc8aSBjbGFzcz1cImZhIGZhLWZ3IGZhLW1pbnVzXCI+PC9pPicsXG4gICAgICAgICAgICAgICAgbW9kZXM6IFsnZ2ZtJywgJ21hcmtkb3duJ10sXG4gICAgICAgICAgICAgICAgYWN0aW9uKHsgY29kZW1pcnJvciwgYnV0dG9uLCB0ZXh0YXJlYSB9KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcGxhY2VyKHsgbmFtZTogJ2RlbGltaXRlcicsIHJlcGxhY2U6IGAke2NvbmZpZy5zaXRlLmRlbGltaXRlcn0kMWAsIGNvZGVtaXJyb3IsIGJ1dHRvbiwgbW9kZTogJ3JlcGxhY2VMaW5lJyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGxpbms6IHtcbiAgICAgICAgICAgICAgICBpZGVudGlmaWVyOiAnbGluaycsXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uTElOSyxcbiAgICAgICAgICAgICAgICBsYWJlbDogJzxpIGNsYXNzPVwiZmEgZmEtZncgZmEtbGlua1wiPjwvaT4nLFxuICAgICAgICAgICAgICAgIG1vZGVzOiBbJ2dmbScsICdtYXJrZG93biddLFxuICAgICAgICAgICAgICAgIHNob3J0Y3V0OiBbJ0N0cmwtSycsICdDbWQtSyddLFxuICAgICAgICAgICAgICAgIGFjdGlvbih7IGNvZGVtaXJyb3IsIGJ1dHRvbiwgdGV4dGFyZWEgfSkge1xuICAgICAgICAgICAgICAgICAgICByZXBsYWNlcih7IG5hbWU6ICdsaW5rJywgcmVwbGFjZTogJ1skMV0oJGN1ciknLCBjb2RlbWlycm9yLCBidXR0b24gfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBpbWFnZToge1xuICAgICAgICAgICAgICAgIGlkZW50aWZpZXI6ICdpbWFnZScsXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uSU1BR0UsXG4gICAgICAgICAgICAgICAgbGFiZWw6ICc8aSBjbGFzcz1cImZhIGZhLWZ3IGZhLXBpY3R1cmUtb1wiPjwvaT4nLFxuICAgICAgICAgICAgICAgIG1vZGVzOiBbJ2dmbScsICdtYXJrZG93biddLFxuICAgICAgICAgICAgICAgIGFjdGlvbih7IGNvZGVtaXJyb3IsIGJ1dHRvbiwgdGV4dGFyZWEgfSkge1xuICAgICAgICAgICAgICAgICAgICByZXBsYWNlcih7IG5hbWU6ICdpbWFnZScsIHJlcGxhY2U6ICchWyQxXShodHRwOi8vJGN1ciknLCBjb2RlbWlycm9yLCBidXR0b24gfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBibG9ja3F1b3RlOiB7XG4gICAgICAgICAgICAgICAgaWRlbnRpZmllcjogJ2Jsb2NrcXVvdGUnLFxuICAgICAgICAgICAgICAgIHRpdGxlOiB0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLkJMT0NLUVVPVEUsXG4gICAgICAgICAgICAgICAgbGFiZWw6ICc8aSBjbGFzcz1cImZhIGZhLWZ3IGZhLXF1b3RlLXJpZ2h0XCI+PC9pPicsXG4gICAgICAgICAgICAgICAgbW9kZXM6IFsnZ2ZtJywgJ21hcmtkb3duJ10sXG4gICAgICAgICAgICAgICAgYWN0aW9uKHsgY29kZW1pcnJvciwgYnV0dG9uLCB0ZXh0YXJlYSB9KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcGxhY2VyKHsgbmFtZTogJ2Jsb2NrcXVvdGUnLCByZXBsYWNlOiAnPiAkMScsIGNvZGVtaXJyb3IsIGJ1dHRvbiwgbW9kZTogJ3JlcGxhY2VMaW5lJyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGxpc3RVbDoge1xuICAgICAgICAgICAgICAgIGlkZW50aWZpZXI6ICdsaXN0VWwnLFxuICAgICAgICAgICAgICAgIHRpdGxlOiB0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLlVOT1JERVJFRF9MSVNULFxuICAgICAgICAgICAgICAgIGxhYmVsOiAnPGkgY2xhc3M9XCJmYSBmYS1mdyBmYS1saXN0LXVsXCI+PC9pPicsXG4gICAgICAgICAgICAgICAgbW9kZXM6IFsnZ2ZtJywgJ21hcmtkb3duJ10sXG4gICAgICAgICAgICAgICAgYWN0aW9uKHsgY29kZW1pcnJvciwgYnV0dG9uLCB0ZXh0YXJlYSB9KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcGxhY2VyKHsgbmFtZTogJ2xpc3RVbCcsIHJlcGxhY2U6ICcqICQxJywgY29kZW1pcnJvciwgYnV0dG9uLCBtb2RlOiAncmVwbGFjZUxpbmUnIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwge1xuICAgICAgICAgICAgbGlzdE9sOiB7XG4gICAgICAgICAgICAgICAgaWRlbnRpZmllcjogJ2xpc3RPbCcsXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uT1JERVJFRF9MSVNULFxuICAgICAgICAgICAgICAgIGxhYmVsOiAnPGkgY2xhc3M9XCJmYSBmYS1mdyBmYS1saXN0LW9sXCI+PC9pPicsXG4gICAgICAgICAgICAgICAgbW9kZXM6IFsnZ2ZtJywgJ21hcmtkb3duJ10sXG4gICAgICAgICAgICAgICAgYWN0aW9uKHsgY29kZW1pcnJvciwgYnV0dG9uLCB0ZXh0YXJlYSB9KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcGxhY2VyKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdsaXN0T2wnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZTogJy4gJDEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZW1pcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGU6ICdyZXBsYWNlTGluZScsXG4gICAgICAgICAgICAgICAgICAgICAgICBydW5uZXI6IGZ1bmN0aW9uKGxpbmUsIG1hcmt1cCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaW5lTm8gPSBjb2RlbWlycm9yLmdldExpbmVOdW1iZXIobGluZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByZXZpb3VzTGluZSA9IGNvZGVtaXJyb3IuZ2V0TGluZShsaW5lTm8gLSAxKSB8fCAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWF0Y2ggPSBwcmV2aW91c0xpbmUubWF0Y2goL14oXFxkKylcXC4vKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcHJlZml4ID0gMSArIChtYXRjaCA/IE51bWJlcihtYXRjaFsxXSkgOiAwKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHtwcmVmaXh9JHttYXJrdXB9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgXSxcbiAgICBzdGF0ZXM6IFt7XG4gICAgICAgIGNvZGU6IHtcbiAgICAgICAgICAgIGlkZW50aWZpZXI6ICdlZGl0b3InLFxuICAgICAgICAgICAgdGl0bGU6IHRyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uRURJVE9SLFxuICAgICAgICAgICAgbGFiZWw6ICc8aSBjbGFzcz1cImZhIGZhLWZ3IGZhLWNvZGVcIj48L2k+JyxcbiAgICAgICAgICAgIGFjdGlvbih7IGNvZGVtaXJyb3IsIGJ1dHRvbiwgdGV4dGFyZWEsIHVpIH0pIHtcbiAgICAgICAgICAgICAgICBpZiAodGV4dGFyZWEuZGF0YSgnZ3Jhdi1lZGl0b3ItbW9kZScpID09PSAnZWRpdG9yJykge1xuICAgICAgICAgICAgICAgICAgICBidXR0b24uYWRkQ2xhc3MoJ2VkaXRvci1hY3RpdmUnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBidXR0b24ub24oJ2NsaWNrLnN0YXRlcy5lZGl0b3InLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbi5zaWJsaW5ncygpLnJlbW92ZUNsYXNzKCdlZGl0b3ItYWN0aXZlJyk7XG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbi5hZGRDbGFzcygnZWRpdG9yLWFjdGl2ZScpO1xuICAgICAgICAgICAgICAgICAgICB0ZXh0YXJlYS5kYXRhKCdncmF2LWVkaXRvci1tb2RlJywgJ2VkaXRvcicpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcHJldmlld0NvbnRhaW5lciA9IHRleHRhcmVhLmRhdGEoJ2dyYXYtZWRpdG9yLXByZXZpZXctY29udGFpbmVyJyk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gdGV4dGFyZWEucGFyZW50KCcuZ3Jhdi1lZGl0b3ItY29udGVudCcpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQuYWRkQ2xhc3MoJ2lzLWFjdGl2ZScpO1xuICAgICAgICAgICAgICAgICAgICB1aS5uYXZpZ2F0aW9uLmZpbmQoJy5ncmF2LWVkaXRvci1hY3Rpb25zJykuY3NzKCd2aXNpYmlsaXR5JywgJ3Zpc2libGUnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZpZXdDb250YWluZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpZXdDb250YWluZXIucmVtb3ZlQ2xhc3MoJ2lzLWFjdGl2ZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIHByZXZpZXc6IHtcbiAgICAgICAgICAgIGlkZW50aWZpZXI6ICdwcmV2aWV3JyxcbiAgICAgICAgICAgIHRpdGxlOiB0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLlBSRVZJRVcsXG4gICAgICAgICAgICBsYWJlbDogJzxpIGNsYXNzPVwiZmEgZmEtZncgZmEtZXllXCI+PC9pPicsXG4gICAgICAgICAgICBtb2RlczogWydnZm0nLCAnbWFya2Rvd24nXSxcbiAgICAgICAgICAgIGFjdGlvbih7IGNvZGVtaXJyb3IsIGJ1dHRvbiwgdGV4dGFyZWEsIHVpIH0pIHtcbiAgICAgICAgICAgICAgICBpZiAodGV4dGFyZWEuZGF0YSgnZ3Jhdi1lZGl0b3ItbW9kZScpID09PSAncHJldmlldycpIHtcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uLmFkZENsYXNzKCdlZGl0b3ItYWN0aXZlJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJ1dHRvbi5vbignY2xpY2suc3RhdGVzLnByZXZpZXcnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwcmV2aWV3Q29udGFpbmVyID0gdGV4dGFyZWEuZGF0YSgnZ3Jhdi1lZGl0b3ItcHJldmlldy1jb250YWluZXInKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSB0ZXh0YXJlYS5wYXJlbnQoJy5ncmF2LWVkaXRvci1jb250ZW50Jyk7XG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbi5zaWJsaW5ncygpLnJlbW92ZUNsYXNzKCdlZGl0b3ItYWN0aXZlJyk7XG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbi5hZGRDbGFzcygnZWRpdG9yLWFjdGl2ZScpO1xuICAgICAgICAgICAgICAgICAgICB0ZXh0YXJlYS5kYXRhKCdncmF2LWVkaXRvci1tb2RlJywgJ3ByZXZpZXcnKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIXByZXZpZXdDb250YWluZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpZXdDb250YWluZXIgPSAkKCc8ZGl2IGNsYXNzPVwiZ3Jhdi1lZGl0b3ItcHJldmlld1wiIC8+Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LmFmdGVyKHByZXZpZXdDb250YWluZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dGFyZWEuZGF0YSgnZ3Jhdi1lZGl0b3ItcHJldmlldy1jb250YWluZXInLCBwcmV2aWV3Q29udGFpbmVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHByZXZpZXdDb250YWluZXIuY3NzKHsgaGVpZ2h0OiBjb250ZW50LmhlaWdodCgpIH0pO1xuICAgICAgICAgICAgICAgICAgICBwcmV2aWV3Q29udGFpbmVyLmFkZENsYXNzKCdpcy1hY3RpdmUnKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudC5yZW1vdmVDbGFzcygnaXMtYWN0aXZlJyk7XG4gICAgICAgICAgICAgICAgICAgIHVpLm5hdmlnYXRpb24uZmluZCgnLmdyYXYtZWRpdG9yLWFjdGlvbnMnKS5jc3MoJ3Zpc2liaWxpdHknLCAnaGlkZGVuJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9IGAke3RleHRhcmVhLmRhdGEoJ2dyYXYtdXJscHJldmlldycpfS90YXNrJHtjb25maWcucGFyYW1fc2VwfXByb2Nlc3NtYXJrZG93bmA7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXJhbXMgPSB0ZXh0YXJlYS5jbG9zZXN0KCdmb3JtJykuc2VyaWFsaXplQXJyYXkoKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJvZHkgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm1hcCgob2JqKSA9PiB7IGJvZHlbb2JqLm5hbWVdID0gb2JqLnZhbHVlOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCh1cmwsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ3Bvc3QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keVxuICAgICAgICAgICAgICAgICAgICB9LCAocmVzcG9uc2UpID0+IHByZXZpZXdDb250YWluZXIuaHRtbChyZXNwb25zZS5wcmV2aWV3KSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGZ1bGxzY3JlZW46IHtcbiAgICAgICAgICAgIGlkZW50aWZpZXI6ICdmdWxsc2NyZWVuJyxcbiAgICAgICAgICAgIHRpdGxlOiB0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLkZVTExTQ1JFRU4sXG4gICAgICAgICAgICBsYWJlbDogJzxpIGNsYXNzPVwiZmEgZmEtZncgZmEtZXhwYW5kXCI+PC9pPicsXG4gICAgICAgICAgICBhY3Rpb24oeyBjb2RlbWlycm9yLCBidXR0b24sIHRleHRhcmVhIH0pIHtcbiAgICAgICAgICAgICAgICBidXR0b24ub24oJ2NsaWNrLmVkaXRvci5mdWxsc2NyZWVuJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29udGFpbmVyID0gdGV4dGFyZWEuY2xvc2VzdCgnLmdyYXYtZWRpdG9yJyk7XG4gICAgICAgICAgICAgICAgICAgIGxldCB3cmFwcGVyID0gY29kZW1pcnJvci5nZXRXcmFwcGVyRWxlbWVudCgpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudFdyYXBwZXIgPSAkKCcuY29udGVudC13cmFwcGVyJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjb250YWluZXIuaGFzQ2xhc3MoJ2dyYXYtZWRpdG9yLWZ1bGxzY3JlZW4nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dGFyZWEuZGF0YSgnZnVsbFNjcmVlblJlc3RvcmUnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9wOiBnbG9iYWwucGFnZVlPZmZzZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsTGVmdDogZ2xvYmFsLnBhZ2VYT2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiB3cmFwcGVyLnN0eWxlLndpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogd3JhcHBlci5zdHlsZS5oZWlnaHRcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyLnN0eWxlLndpZHRoID0gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyLnN0eWxlLmhlaWdodCA9IHRleHRhcmVhLnBhcmVudCgnLmdyYXYtZWRpdG9yLWNvbnRlbnQnKS5oZWlnaHQoKSArICdweCc7XG4gICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWwuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoaW50cyA9IGNvbnRhaW5lci5maW5kKCcuZ3Jhdi1lZGl0b3ItdG9vbGJhciAuaGludC0tdG9wJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoaW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbnRzLnJlbW92ZUNsYXNzKCdoaW50LS10b3AnKS5hZGRDbGFzcygnaGludC0tYm90dG9tJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJChoaW50c1toaW50cy5sZW5ndGggLSAxXSkuYWRkQ2xhc3MoJ2hpbnQtLWJvdHRvbS1sZWZ0Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudFdyYXBwZXIpIHsgY29udGVudFdyYXBwZXIuY3NzKCdvdmVyZmxvdycsICd2aXNpYmxlJyk7IH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdGF0ZSA9IHRleHRhcmVhLmRhdGEoJ2Z1bGxTY3JlZW5SZXN0b3JlJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXIuc3R5bGUud2lkdGggPSBzdGF0ZS53aWR0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXIuc3R5bGUuaGVpZ2h0ID0gc3RhdGUuaGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsLnNjcm9sbFRvKHN0YXRlLnNjcm9sbExlZnQsIHN0YXRlLnNjcm9sbFRvcCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoaW50cyA9IGNvbnRhaW5lci5maW5kKCcuZ3Jhdi1lZGl0b3ItdG9vbGJhciAuaGludC0tYm90dG9tJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoaW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbnRzLnJlbW92ZUNsYXNzKCdoaW50LS1ib3R0b20nKS5hZGRDbGFzcygnaGludC0tdG9wJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJChoaW50c1toaW50cy5sZW5ndGggLSAxXSkucmVtb3ZlQ2xhc3MoJ2hpbnQtLWJvdHRvbS1sZWZ0Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudFdyYXBwZXIpIHsgY29udGVudFdyYXBwZXIuY3NzKCdvdmVyZmxvdycsICdhdXRvJyk7IH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci50b2dnbGVDbGFzcygnZ3Jhdi1lZGl0b3ItZnVsbHNjcmVlbicpO1xuXG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZW1pcnJvci5yZWZyZXNoKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLnByZXZpZXcucGFyZW50KCkuY3NzKCdoZWlnaHQnLCB0aGlzLmNvZGUuaGVpZ2h0KCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgJChnbG9iYWwpLnRyaWdnZXIoJ3Jlc2l6ZScpO1xuICAgICAgICAgICAgICAgICAgICB9LCA1KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1dXG59O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./app/forms/fields/editor/buttons.js\n"); /***/ }), /***/ "./app/forms/fields/filepicker.js": -/*!****************************************!* +/*!****************************************!*\ !*** ./app/forms/fields/filepicker.js ***! \****************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => /* binding */ FilePickerField,\n/* harmony export */ \"Instance\": () => /* binding */ Instance\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! grav-config */ \"grav-config\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(grav_config__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _utils_request__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/request */ \"./app/utils/request.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n // const insertTextAt = (string, index, text) => [string.slice(0, index), text, string.slice(index)].join('');\n\nvar FilePickerField = /*#__PURE__*/function () {\n function FilePickerField(options) {\n var _this = this;\n\n _classCallCheck(this, FilePickerField);\n\n this.items = jquery__WEBPACK_IMPORTED_MODULE_0___default()();\n this.options = Object.assign({}, this.defaults, options);\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-grav-filepicker]').each(function (index, element) {\n return _this.addItem(element);\n });\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('body').on('mutation._grav', this._onAddedNodes.bind(this));\n }\n\n _createClass(FilePickerField, [{\n key: \"_onAddedNodes\",\n value: function _onAddedNodes(event, target\n /* , record, instance */\n ) {\n var _this2 = this;\n\n var fields = jquery__WEBPACK_IMPORTED_MODULE_0___default()(target).find('[data-grav-filepicker]');\n\n if (!fields.length) {\n return;\n }\n\n fields.each(function (index, field) {\n field = jquery__WEBPACK_IMPORTED_MODULE_0___default()(field);\n\n if (!~_this2.items.index(field)) {\n _this2.addItem(field);\n }\n });\n }\n }, {\n key: \"addItem\",\n value: function addItem(element) {\n element = jquery__WEBPACK_IMPORTED_MODULE_0___default()(element);\n this.items = this.items.add(element);\n var tag = element.prop('tagName').toLowerCase();\n var isInput = tag === 'input' || tag === 'select';\n var field = isInput ? element : element.find('input, select');\n var folder = '';\n var thumbs = {};\n var onDemand = field.closest('[data-ondemand]').length > 0;\n\n if (!field.length || field.get(0).selectize) {\n return;\n }\n\n var getData = function getData(field, callback) {\n var mode = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'all';\n var url = grav_config__WEBPACK_IMPORTED_MODULE_1__.config.current_url + \".json/task\".concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.param_sep, \"getFilesInFolder\");\n var parent = field.closest('[data-grav-filepicker]');\n var name = parent.data('name');\n var value = parent.data('value');\n var params = JSON.stringify(grav_config__WEBPACK_IMPORTED_MODULE_1__.uri_params || '{}');\n (0,_utils_request__WEBPACK_IMPORTED_MODULE_2__.default)(url, {\n method: 'post',\n body: {\n name: name,\n params: params\n }\n }, function (response) {\n if (typeof response.files === 'undefined') {\n return;\n }\n\n var data = [];\n thumbs = response.thumbs || {};\n\n for (var i = 0; i < response.files.length; i++) {\n if (mode === 'selected' && response.files[i] !== value) {\n continue;\n }\n\n data.push({\n 'name': response.files[i],\n 'status': 'available',\n thumb: thumbs[response.files[i]] || ''\n });\n }\n\n for (var _i = 0; _i < response.pending.length; _i++) {\n if (mode === 'selected' && response.pending[_i] !== value) {\n continue;\n }\n\n data.push({\n 'name': response.pending[_i],\n 'status': 'pending',\n thumb: thumbs[response.pending[_i]] || ''\n });\n }\n\n folder = response.folder;\n callback(data, value);\n });\n };\n\n var imagesPreview = field.closest('[data-preview-images]').length > 0;\n var selectedIsRendered = false;\n\n var renderOption = function renderOption(item, escape) {\n var image = '';\n\n if (imagesPreview && folder && (!item.status || item.status === 'available') && item.name.match(/\\.(jpg|jpeg|png|gif)$/i)) {\n // const fallback2x = insertTextAt(`${config.base_url_relative}/../${folder}/${item.name}`, -4, '@2x');\n // const fallback3x = insertTextAt(`${config.base_url_relative}/../${folder}/${item.name}`, -4, '@3x');\n var source = thumbs[item.name] || \"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.base_url_relative, \"/../\").concat(folder, \"/\").concat(item.name); // onerror=\"if(this.src==='${fallback2x}'){this.src='${fallback3x}';}else{this.src='${fallback2x}'}\"\n\n image = \"\");\n }\n\n return \"
          \\n \\n \".concat(image, \" \").concat(escape(item.name), \"\\n \\n
          \");\n };\n\n field.selectize({\n plugins: ['required-fix'],\n valueField: 'name',\n labelField: 'name',\n searchField: 'name',\n optgroups: [{\n $order: 1,\n value: 'pending',\n label: 'Pending'\n }, {\n $order: 2,\n value: 'available',\n label: 'Available'\n }],\n optgroupField: 'status',\n // lockOptgroupOrder: true,\n create: false,\n preload: false,\n // 'focus',\n render: {\n option: function option(item, escape) {\n return renderOption(item, escape);\n },\n item: function item(_item, escape) {\n return renderOption(_item, escape);\n }\n },\n onInitialize: function onInitialize() {\n if (!onDemand) {\n this.load(function (callback) {\n return getData(field, function (data) {\n return callback(data);\n }, 'selected');\n });\n }\n },\n onLoad: function onLoad()\n /* data */\n {\n if (!selectedIsRendered) {\n var name = this.getValue();\n this.updateOption(name, {\n name: name\n });\n selectedIsRendered = true;\n }\n },\n onFocus: function onFocus() {\n this.load(function (callback) {\n return getData(field, function (data) {\n return callback(data);\n });\n });\n }\n });\n }\n }]);\n\n return FilePickerField;\n}();\n\n\nvar Instance = new FilePickerField();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL2Zvcm1zL2ZpZWxkcy9maWxlcGlja2VyLmpzPzcxM2QiXSwibmFtZXMiOlsiRmlsZVBpY2tlckZpZWxkIiwib3B0aW9ucyIsIml0ZW1zIiwiJCIsIk9iamVjdCIsImFzc2lnbiIsImRlZmF1bHRzIiwiZWFjaCIsImluZGV4IiwiZWxlbWVudCIsImFkZEl0ZW0iLCJvbiIsIl9vbkFkZGVkTm9kZXMiLCJiaW5kIiwiZXZlbnQiLCJ0YXJnZXQiLCJmaWVsZHMiLCJmaW5kIiwibGVuZ3RoIiwiZmllbGQiLCJhZGQiLCJ0YWciLCJwcm9wIiwidG9Mb3dlckNhc2UiLCJpc0lucHV0IiwiZm9sZGVyIiwidGh1bWJzIiwib25EZW1hbmQiLCJjbG9zZXN0IiwiZ2V0Iiwic2VsZWN0aXplIiwiZ2V0RGF0YSIsImNhbGxiYWNrIiwibW9kZSIsInVybCIsImNvbmZpZyIsInBhcmVudCIsIm5hbWUiLCJkYXRhIiwidmFsdWUiLCJwYXJhbXMiLCJKU09OIiwic3RyaW5naWZ5IiwidXJpX3BhcmFtcyIsInJlcXVlc3QiLCJtZXRob2QiLCJib2R5IiwicmVzcG9uc2UiLCJmaWxlcyIsImkiLCJwdXNoIiwidGh1bWIiLCJwZW5kaW5nIiwiaW1hZ2VzUHJldmlldyIsInNlbGVjdGVkSXNSZW5kZXJlZCIsInJlbmRlck9wdGlvbiIsIml0ZW0iLCJlc2NhcGUiLCJpbWFnZSIsInN0YXR1cyIsIm1hdGNoIiwic291cmNlIiwicGx1Z2lucyIsInZhbHVlRmllbGQiLCJsYWJlbEZpZWxkIiwic2VhcmNoRmllbGQiLCJvcHRncm91cHMiLCIkb3JkZXIiLCJsYWJlbCIsIm9wdGdyb3VwRmllbGQiLCJjcmVhdGUiLCJwcmVsb2FkIiwicmVuZGVyIiwib3B0aW9uIiwib25Jbml0aWFsaXplIiwibG9hZCIsIm9uTG9hZCIsImdldFZhbHVlIiwidXBkYXRlT3B0aW9uIiwib25Gb2N1cyIsIkluc3RhbmNlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtDQUdBOztJQUVxQkEsZTtBQUVqQiwyQkFBWUMsT0FBWixFQUFxQjtBQUFBOztBQUFBOztBQUNqQixTQUFLQyxLQUFMLEdBQWFDLDZDQUFDLEVBQWQ7QUFDQSxTQUFLRixPQUFMLEdBQWVHLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjLEVBQWQsRUFBa0IsS0FBS0MsUUFBdkIsRUFBaUNMLE9BQWpDLENBQWY7QUFFQUUsaURBQUMsQ0FBQyx3QkFBRCxDQUFELENBQTRCSSxJQUE1QixDQUFpQyxVQUFDQyxLQUFELEVBQVFDLE9BQVI7QUFBQSxhQUFvQixLQUFJLENBQUNDLE9BQUwsQ0FBYUQsT0FBYixDQUFwQjtBQUFBLEtBQWpDO0FBQ0FOLGlEQUFDLENBQUMsTUFBRCxDQUFELENBQVVRLEVBQVYsQ0FBYSxnQkFBYixFQUErQixLQUFLQyxhQUFMLENBQW1CQyxJQUFuQixDQUF3QixJQUF4QixDQUEvQjtBQUNIOzs7O2tDQUVhQyxLLEVBQU9DO0FBQU07TUFBMEI7QUFBQTs7QUFDakQsVUFBSUMsTUFBTSxHQUFHYiw2Q0FBQyxDQUFDWSxNQUFELENBQUQsQ0FBVUUsSUFBVixDQUFlLHdCQUFmLENBQWI7O0FBQ0EsVUFBSSxDQUFDRCxNQUFNLENBQUNFLE1BQVosRUFBb0I7QUFBRTtBQUFTOztBQUUvQkYsWUFBTSxDQUFDVCxJQUFQLENBQVksVUFBQ0MsS0FBRCxFQUFRVyxLQUFSLEVBQWtCO0FBQzFCQSxhQUFLLEdBQUdoQiw2Q0FBQyxDQUFDZ0IsS0FBRCxDQUFUOztBQUNBLFlBQUksQ0FBQyxDQUFDLE1BQUksQ0FBQ2pCLEtBQUwsQ0FBV00sS0FBWCxDQUFpQlcsS0FBakIsQ0FBTixFQUErQjtBQUMzQixnQkFBSSxDQUFDVCxPQUFMLENBQWFTLEtBQWI7QUFDSDtBQUNKLE9BTEQ7QUFNSDs7OzRCQUVPVixPLEVBQVM7QUFDYkEsYUFBTyxHQUFHTiw2Q0FBQyxDQUFDTSxPQUFELENBQVg7QUFDQSxXQUFLUCxLQUFMLEdBQWEsS0FBS0EsS0FBTCxDQUFXa0IsR0FBWCxDQUFlWCxPQUFmLENBQWI7QUFFQSxVQUFJWSxHQUFHLEdBQUdaLE9BQU8sQ0FBQ2EsSUFBUixDQUFhLFNBQWIsRUFBd0JDLFdBQXhCLEVBQVY7QUFDQSxVQUFJQyxPQUFPLEdBQUdILEdBQUcsS0FBSyxPQUFSLElBQW1CQSxHQUFHLEtBQUssUUFBekM7QUFFQSxVQUFJRixLQUFLLEdBQUlLLE9BQU8sR0FBR2YsT0FBSCxHQUFhQSxPQUFPLENBQUNRLElBQVIsQ0FBYSxlQUFiLENBQWpDO0FBRUEsVUFBSVEsTUFBTSxHQUFHLEVBQWI7QUFDQSxVQUFJQyxNQUFNLEdBQUcsRUFBYjtBQUVBLFVBQUlDLFFBQVEsR0FBR1IsS0FBSyxDQUFDUyxPQUFOLENBQWMsaUJBQWQsRUFBaUNWLE1BQWpDLEdBQTBDLENBQXpEOztBQUVBLFVBQUksQ0FBQ0MsS0FBSyxDQUFDRCxNQUFQLElBQWlCQyxLQUFLLENBQUNVLEdBQU4sQ0FBVSxDQUFWLEVBQWFDLFNBQWxDLEVBQTZDO0FBQUU7QUFBUzs7QUFFeEQsVUFBSUMsT0FBTyxHQUFHLFNBQVNBLE9BQVQsQ0FBaUJaLEtBQWpCLEVBQXdCYSxRQUF4QixFQUFnRDtBQUFBLFlBQWRDLElBQWMsdUVBQVAsS0FBTztBQUMxRCxZQUFJQyxHQUFHLEdBQUdDLDJEQUFBLHVCQUFrQ0EseURBQWxDLHFCQUFWO0FBQ0EsWUFBSUMsTUFBTSxHQUFHakIsS0FBSyxDQUFDUyxPQUFOLENBQWMsd0JBQWQsQ0FBYjtBQUNBLFlBQUlTLElBQUksR0FBR0QsTUFBTSxDQUFDRSxJQUFQLENBQVksTUFBWixDQUFYO0FBQ0EsWUFBSUMsS0FBSyxHQUFHSCxNQUFNLENBQUNFLElBQVAsQ0FBWSxPQUFaLENBQVo7QUFDQSxZQUFJRSxNQUFNLEdBQUdDLElBQUksQ0FBQ0MsU0FBTCxDQUFlQyxtREFBVSxJQUFJLElBQTdCLENBQWI7QUFFQUMsK0RBQU8sQ0FBQ1YsR0FBRCxFQUFNO0FBQ1RXLGdCQUFNLEVBQUUsTUFEQztBQUVUQyxjQUFJLEVBQUU7QUFBRVQsZ0JBQUksRUFBSkEsSUFBRjtBQUFRRyxrQkFBTSxFQUFOQTtBQUFSO0FBRkcsU0FBTixFQUdKLFVBQUNPLFFBQUQsRUFBYztBQUNiLGNBQUksT0FBT0EsUUFBUSxDQUFDQyxLQUFoQixLQUEwQixXQUE5QixFQUEyQztBQUN2QztBQUNIOztBQUVELGNBQUlWLElBQUksR0FBRyxFQUFYO0FBQ0FaLGdCQUFNLEdBQUdxQixRQUFRLENBQUNyQixNQUFULElBQW1CLEVBQTVCOztBQUVBLGVBQUssSUFBSXVCLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUdGLFFBQVEsQ0FBQ0MsS0FBVCxDQUFlOUIsTUFBbkMsRUFBMkMrQixDQUFDLEVBQTVDLEVBQWdEO0FBQzVDLGdCQUFJaEIsSUFBSSxLQUFLLFVBQVQsSUFBdUJjLFFBQVEsQ0FBQ0MsS0FBVCxDQUFlQyxDQUFmLE1BQXNCVixLQUFqRCxFQUF3RDtBQUFFO0FBQVc7O0FBQ3JFRCxnQkFBSSxDQUFDWSxJQUFMLENBQVU7QUFBRSxzQkFBUUgsUUFBUSxDQUFDQyxLQUFULENBQWVDLENBQWYsQ0FBVjtBQUE2Qix3QkFBVSxXQUF2QztBQUFvREUsbUJBQUssRUFBRXpCLE1BQU0sQ0FBQ3FCLFFBQVEsQ0FBQ0MsS0FBVCxDQUFlQyxDQUFmLENBQUQsQ0FBTixJQUE2QjtBQUF4RixhQUFWO0FBQ0g7O0FBRUQsZUFBSyxJQUFJQSxFQUFDLEdBQUcsQ0FBYixFQUFnQkEsRUFBQyxHQUFHRixRQUFRLENBQUNLLE9BQVQsQ0FBaUJsQyxNQUFyQyxFQUE2QytCLEVBQUMsRUFBOUMsRUFBa0Q7QUFDOUMsZ0JBQUloQixJQUFJLEtBQUssVUFBVCxJQUF1QmMsUUFBUSxDQUFDSyxPQUFULENBQWlCSCxFQUFqQixNQUF3QlYsS0FBbkQsRUFBMEQ7QUFBRTtBQUFXOztBQUN2RUQsZ0JBQUksQ0FBQ1ksSUFBTCxDQUFVO0FBQUUsc0JBQVFILFFBQVEsQ0FBQ0ssT0FBVCxDQUFpQkgsRUFBakIsQ0FBVjtBQUErQix3QkFBVSxTQUF6QztBQUFvREUsbUJBQUssRUFBRXpCLE1BQU0sQ0FBQ3FCLFFBQVEsQ0FBQ0ssT0FBVCxDQUFpQkgsRUFBakIsQ0FBRCxDQUFOLElBQStCO0FBQTFGLGFBQVY7QUFDSDs7QUFFRHhCLGdCQUFNLEdBQUdzQixRQUFRLENBQUN0QixNQUFsQjtBQUNBTyxrQkFBUSxDQUFDTSxJQUFELEVBQU9DLEtBQVAsQ0FBUjtBQUNILFNBdkJNLENBQVA7QUF3QkgsT0EvQkQ7O0FBaUNBLFVBQUljLGFBQWEsR0FBR2xDLEtBQUssQ0FBQ1MsT0FBTixDQUFjLHVCQUFkLEVBQXVDVixNQUF2QyxHQUFnRCxDQUFwRTtBQUNBLFVBQUlvQyxrQkFBa0IsR0FBRyxLQUF6Qjs7QUFFQSxVQUFJQyxZQUFZLEdBQUcsU0FBU0EsWUFBVCxDQUFzQkMsSUFBdEIsRUFBNEJDLE1BQTVCLEVBQW9DO0FBQ25ELFlBQUlDLEtBQUssR0FBRyxFQUFaOztBQUNBLFlBQUlMLGFBQWEsSUFBSTVCLE1BQWpCLEtBQTRCLENBQUMrQixJQUFJLENBQUNHLE1BQU4sSUFBZ0JILElBQUksQ0FBQ0csTUFBTCxLQUFnQixXQUE1RCxLQUE0RUgsSUFBSSxDQUFDbkIsSUFBTCxDQUFVdUIsS0FBVixDQUFnQix3QkFBaEIsQ0FBaEYsRUFBMkg7QUFDdkg7QUFDQTtBQUNBLGNBQU1DLE1BQU0sR0FBR25DLE1BQU0sQ0FBQzhCLElBQUksQ0FBQ25CLElBQU4sQ0FBTixjQUF3QkYsaUVBQXhCLGlCQUF1RFYsTUFBdkQsY0FBaUUrQixJQUFJLENBQUNuQixJQUF0RSxDQUFmLENBSHVILENBS3ZIOztBQUNBcUIsZUFBSyx5REFBK0NHLE1BQS9DLFVBQUw7QUFDSDs7QUFFRCw0R0FFa0JILEtBRmxCLHlEQUVvRUQsTUFBTSxDQUFDRCxJQUFJLENBQUNuQixJQUFOLENBRjFFO0FBS0gsT0FoQkQ7O0FBa0JBbEIsV0FBSyxDQUFDVyxTQUFOLENBQWdCO0FBQ1pnQyxlQUFPLEVBQUUsQ0FBQyxjQUFELENBREc7QUFFWkMsa0JBQVUsRUFBRSxNQUZBO0FBR1pDLGtCQUFVLEVBQUUsTUFIQTtBQUlaQyxtQkFBVyxFQUFFLE1BSkQ7QUFLWkMsaUJBQVMsRUFBRSxDQUNQO0FBQUNDLGdCQUFNLEVBQUUsQ0FBVDtBQUFZNUIsZUFBSyxFQUFFLFNBQW5CO0FBQThCNkIsZUFBSyxFQUFFO0FBQXJDLFNBRE8sRUFFUDtBQUFDRCxnQkFBTSxFQUFFLENBQVQ7QUFBWTVCLGVBQUssRUFBRSxXQUFuQjtBQUFnQzZCLGVBQUssRUFBRTtBQUF2QyxTQUZPLENBTEM7QUFTWkMscUJBQWEsRUFBRSxRQVRIO0FBVVo7QUFDQUMsY0FBTSxFQUFFLEtBWEk7QUFZWkMsZUFBTyxFQUFFLEtBWkc7QUFZSTtBQUNoQkMsY0FBTSxFQUFFO0FBQ0pDLGdCQUFNLEVBQUUsZ0JBQVNqQixJQUFULEVBQWVDLE1BQWYsRUFBdUI7QUFDM0IsbUJBQU9GLFlBQVksQ0FBQ0MsSUFBRCxFQUFPQyxNQUFQLENBQW5CO0FBQ0gsV0FIRztBQUtKRCxjQUFJLEVBQUUsY0FBU0EsS0FBVCxFQUFlQyxNQUFmLEVBQXVCO0FBQ3pCLG1CQUFPRixZQUFZLENBQUNDLEtBQUQsRUFBT0MsTUFBUCxDQUFuQjtBQUNIO0FBUEcsU0FiSTtBQXVCWmlCLG9CQUFZLEVBQUUsd0JBQVc7QUFDckIsY0FBSSxDQUFDL0MsUUFBTCxFQUFlO0FBQ1gsaUJBQUtnRCxJQUFMLENBQVUsVUFBQzNDLFFBQUQ7QUFBQSxxQkFBY0QsT0FBTyxDQUFDWixLQUFELEVBQVEsVUFBQ21CLElBQUQ7QUFBQSx1QkFBVU4sUUFBUSxDQUFDTSxJQUFELENBQWxCO0FBQUEsZUFBUixFQUFrQyxVQUFsQyxDQUFyQjtBQUFBLGFBQVY7QUFDSDtBQUNKLFNBM0JXO0FBNkJac0MsY0FBTSxFQUFFO0FBQVM7QUFBWTtBQUN6QixjQUFJLENBQUN0QixrQkFBTCxFQUF5QjtBQUNyQixnQkFBSWpCLElBQUksR0FBRyxLQUFLd0MsUUFBTCxFQUFYO0FBQ0EsaUJBQUtDLFlBQUwsQ0FBa0J6QyxJQUFsQixFQUF3QjtBQUFFQSxrQkFBSSxFQUFKQTtBQUFGLGFBQXhCO0FBRUFpQiw4QkFBa0IsR0FBRyxJQUFyQjtBQUNIO0FBQ0osU0FwQ1c7QUFzQ1p5QixlQUFPLEVBQUUsbUJBQVc7QUFDaEIsZUFBS0osSUFBTCxDQUFVLFVBQUMzQyxRQUFEO0FBQUEsbUJBQWNELE9BQU8sQ0FBQ1osS0FBRCxFQUFRLFVBQUNtQixJQUFEO0FBQUEscUJBQVVOLFFBQVEsQ0FBQ00sSUFBRCxDQUFsQjtBQUFBLGFBQVIsQ0FBckI7QUFBQSxXQUFWO0FBQ0g7QUF4Q1csT0FBaEI7QUEwQ0g7Ozs7Ozs7QUFHRSxJQUFJMEMsUUFBUSxHQUFHLElBQUloRixlQUFKLEVBQWYiLCJmaWxlIjoiLi9hcHAvZm9ybXMvZmllbGRzL2ZpbGVwaWNrZXIuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IHsgY29uZmlnLCB1cmlfcGFyYW1zIH0gZnJvbSAnZ3Jhdi1jb25maWcnO1xuaW1wb3J0IHJlcXVlc3QgZnJvbSAnLi4vLi4vdXRpbHMvcmVxdWVzdCc7XG5cbi8vIGNvbnN0IGluc2VydFRleHRBdCA9IChzdHJpbmcsIGluZGV4LCB0ZXh0KSA9PiBbc3RyaW5nLnNsaWNlKDAsIGluZGV4KSwgdGV4dCwgc3RyaW5nLnNsaWNlKGluZGV4KV0uam9pbignJyk7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZpbGVQaWNrZXJGaWVsZCB7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuaXRlbXMgPSAkKCk7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuZGVmYXVsdHMsIG9wdGlvbnMpO1xuXG4gICAgICAgICQoJ1tkYXRhLWdyYXYtZmlsZXBpY2tlcl0nKS5lYWNoKChpbmRleCwgZWxlbWVudCkgPT4gdGhpcy5hZGRJdGVtKGVsZW1lbnQpKTtcbiAgICAgICAgJCgnYm9keScpLm9uKCdtdXRhdGlvbi5fZ3JhdicsIHRoaXMuX29uQWRkZWROb2Rlcy5iaW5kKHRoaXMpKTtcbiAgICB9XG5cbiAgICBfb25BZGRlZE5vZGVzKGV2ZW50LCB0YXJnZXQvKiAsIHJlY29yZCwgaW5zdGFuY2UgKi8pIHtcbiAgICAgICAgbGV0IGZpZWxkcyA9ICQodGFyZ2V0KS5maW5kKCdbZGF0YS1ncmF2LWZpbGVwaWNrZXJdJyk7XG4gICAgICAgIGlmICghZmllbGRzLmxlbmd0aCkgeyByZXR1cm47IH1cblxuICAgICAgICBmaWVsZHMuZWFjaCgoaW5kZXgsIGZpZWxkKSA9PiB7XG4gICAgICAgICAgICBmaWVsZCA9ICQoZmllbGQpO1xuICAgICAgICAgICAgaWYgKCF+dGhpcy5pdGVtcy5pbmRleChmaWVsZCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW0oZmllbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhZGRJdGVtKGVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7XG4gICAgICAgIHRoaXMuaXRlbXMgPSB0aGlzLml0ZW1zLmFkZChlbGVtZW50KTtcblxuICAgICAgICBsZXQgdGFnID0gZWxlbWVudC5wcm9wKCd0YWdOYW1lJykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IGlzSW5wdXQgPSB0YWcgPT09ICdpbnB1dCcgfHwgdGFnID09PSAnc2VsZWN0JztcblxuICAgICAgICBsZXQgZmllbGQgPSAoaXNJbnB1dCA/IGVsZW1lbnQgOiBlbGVtZW50LmZpbmQoJ2lucHV0LCBzZWxlY3QnKSk7XG5cbiAgICAgICAgbGV0IGZvbGRlciA9ICcnO1xuICAgICAgICBsZXQgdGh1bWJzID0ge307XG5cbiAgICAgICAgbGV0IG9uRGVtYW5kID0gZmllbGQuY2xvc2VzdCgnW2RhdGEtb25kZW1hbmRdJykubGVuZ3RoID4gMDtcblxuICAgICAgICBpZiAoIWZpZWxkLmxlbmd0aCB8fCBmaWVsZC5nZXQoMCkuc2VsZWN0aXplKSB7IHJldHVybjsgfVxuXG4gICAgICAgIGxldCBnZXREYXRhID0gZnVuY3Rpb24gZ2V0RGF0YShmaWVsZCwgY2FsbGJhY2ssIG1vZGUgPSAnYWxsJykge1xuICAgICAgICAgICAgbGV0IHVybCA9IGNvbmZpZy5jdXJyZW50X3VybCArIGAuanNvbi90YXNrJHtjb25maWcucGFyYW1fc2VwfWdldEZpbGVzSW5Gb2xkZXJgO1xuICAgICAgICAgICAgbGV0IHBhcmVudCA9IGZpZWxkLmNsb3Nlc3QoJ1tkYXRhLWdyYXYtZmlsZXBpY2tlcl0nKTtcbiAgICAgICAgICAgIGxldCBuYW1lID0gcGFyZW50LmRhdGEoJ25hbWUnKTtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IHBhcmVudC5kYXRhKCd2YWx1ZScpO1xuICAgICAgICAgICAgbGV0IHBhcmFtcyA9IEpTT04uc3RyaW5naWZ5KHVyaV9wYXJhbXMgfHwgJ3t9Jyk7XG5cbiAgICAgICAgICAgIHJlcXVlc3QodXJsLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAncG9zdCcsXG4gICAgICAgICAgICAgICAgYm9keTogeyBuYW1lLCBwYXJhbXMgfVxuICAgICAgICAgICAgfSwgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXNwb25zZS5maWxlcyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBkYXRhID0gW107XG4gICAgICAgICAgICAgICAgdGh1bWJzID0gcmVzcG9uc2UudGh1bWJzIHx8IHt9O1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXNwb25zZS5maWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gJ3NlbGVjdGVkJyAmJiByZXNwb25zZS5maWxlc1tpXSAhPT0gdmFsdWUpIHsgY29udGludWU7IH1cbiAgICAgICAgICAgICAgICAgICAgZGF0YS5wdXNoKHsgJ25hbWUnOiByZXNwb25zZS5maWxlc1tpXSwgJ3N0YXR1cyc6ICdhdmFpbGFibGUnLCB0aHVtYjogdGh1bWJzW3Jlc3BvbnNlLmZpbGVzW2ldXSB8fCAnJyB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3BvbnNlLnBlbmRpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdzZWxlY3RlZCcgJiYgcmVzcG9uc2UucGVuZGluZ1tpXSAhPT0gdmFsdWUpIHsgY29udGludWU7IH1cbiAgICAgICAgICAgICAgICAgICAgZGF0YS5wdXNoKHsgJ25hbWUnOiByZXNwb25zZS5wZW5kaW5nW2ldLCAnc3RhdHVzJzogJ3BlbmRpbmcnLCB0aHVtYjogdGh1bWJzW3Jlc3BvbnNlLnBlbmRpbmdbaV1dIHx8ICcnIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZvbGRlciA9IHJlc3BvbnNlLmZvbGRlcjtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhkYXRhLCB2YWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgaW1hZ2VzUHJldmlldyA9IGZpZWxkLmNsb3Nlc3QoJ1tkYXRhLXByZXZpZXctaW1hZ2VzXScpLmxlbmd0aCA+IDA7XG4gICAgICAgIGxldCBzZWxlY3RlZElzUmVuZGVyZWQgPSBmYWxzZTtcblxuICAgICAgICBsZXQgcmVuZGVyT3B0aW9uID0gZnVuY3Rpb24gcmVuZGVyT3B0aW9uKGl0ZW0sIGVzY2FwZSkge1xuICAgICAgICAgICAgbGV0IGltYWdlID0gJyc7XG4gICAgICAgICAgICBpZiAoaW1hZ2VzUHJldmlldyAmJiBmb2xkZXIgJiYgKCFpdGVtLnN0YXR1cyB8fCBpdGVtLnN0YXR1cyA9PT0gJ2F2YWlsYWJsZScpICYmIGl0ZW0ubmFtZS5tYXRjaCgvXFwuKGpwZ3xqcGVnfHBuZ3xnaWYpJC9pKSkge1xuICAgICAgICAgICAgICAgIC8vIGNvbnN0IGZhbGxiYWNrMnggPSBpbnNlcnRUZXh0QXQoYCR7Y29uZmlnLmJhc2VfdXJsX3JlbGF0aXZlfS8uLi8ke2ZvbGRlcn0vJHtpdGVtLm5hbWV9YCwgLTQsICdAMngnKTtcbiAgICAgICAgICAgICAgICAvLyBjb25zdCBmYWxsYmFjazN4ID0gaW5zZXJ0VGV4dEF0KGAke2NvbmZpZy5iYXNlX3VybF9yZWxhdGl2ZX0vLi4vJHtmb2xkZXJ9LyR7aXRlbS5uYW1lfWAsIC00LCAnQDN4Jyk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc291cmNlID0gdGh1bWJzW2l0ZW0ubmFtZV0gfHwgYCR7Y29uZmlnLmJhc2VfdXJsX3JlbGF0aXZlfS8uLi8ke2ZvbGRlcn0vJHtpdGVtLm5hbWV9YDtcblxuICAgICAgICAgICAgICAgIC8vIG9uZXJyb3I9XCJpZih0aGlzLnNyYz09PScke2ZhbGxiYWNrMnh9Jyl7dGhpcy5zcmM9JyR7ZmFsbGJhY2szeH0nO31lbHNle3RoaXMuc3JjPScke2ZhbGxiYWNrMnh9J31cIlxuICAgICAgICAgICAgICAgIGltYWdlID0gYDxpbWcgY2xhc3M9XCJmaWxlcGlja2VyLWZpZWxkLWltYWdlXCIgc3JjPVwiJHtzb3VyY2V9XCIgLz5gO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gYDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtpbWFnZX0gPHNwYW4gY2xhc3M9XCJuYW1lIGZpbGVwaWNrZXItZmllbGQtbmFtZVwiPiR7ZXNjYXBlKGl0ZW0ubmFtZSl9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5gO1xuICAgICAgICB9O1xuXG4gICAgICAgIGZpZWxkLnNlbGVjdGl6ZSh7XG4gICAgICAgICAgICBwbHVnaW5zOiBbJ3JlcXVpcmVkLWZpeCddLFxuICAgICAgICAgICAgdmFsdWVGaWVsZDogJ25hbWUnLFxuICAgICAgICAgICAgbGFiZWxGaWVsZDogJ25hbWUnLFxuICAgICAgICAgICAgc2VhcmNoRmllbGQ6ICduYW1lJyxcbiAgICAgICAgICAgIG9wdGdyb3VwczogW1xuICAgICAgICAgICAgICAgIHskb3JkZXI6IDEsIHZhbHVlOiAncGVuZGluZycsIGxhYmVsOiAnUGVuZGluZyd9LFxuICAgICAgICAgICAgICAgIHskb3JkZXI6IDIsIHZhbHVlOiAnYXZhaWxhYmxlJywgbGFiZWw6ICdBdmFpbGFibGUnfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIG9wdGdyb3VwRmllbGQ6ICdzdGF0dXMnLFxuICAgICAgICAgICAgLy8gbG9ja09wdGdyb3VwT3JkZXI6IHRydWUsXG4gICAgICAgICAgICBjcmVhdGU6IGZhbHNlLFxuICAgICAgICAgICAgcHJlbG9hZDogZmFsc2UsIC8vICdmb2N1cycsXG4gICAgICAgICAgICByZW5kZXI6IHtcbiAgICAgICAgICAgICAgICBvcHRpb246IGZ1bmN0aW9uKGl0ZW0sIGVzY2FwZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVuZGVyT3B0aW9uKGl0ZW0sIGVzY2FwZSk7XG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIGl0ZW06IGZ1bmN0aW9uKGl0ZW0sIGVzY2FwZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVuZGVyT3B0aW9uKGl0ZW0sIGVzY2FwZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgb25Jbml0aWFsaXplOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBpZiAoIW9uRGVtYW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZCgoY2FsbGJhY2spID0+IGdldERhdGEoZmllbGQsIChkYXRhKSA9PiBjYWxsYmFjayhkYXRhKSwgJ3NlbGVjdGVkJykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIG9uTG9hZDogZnVuY3Rpb24oLyogZGF0YSAqLykge1xuICAgICAgICAgICAgICAgIGlmICghc2VsZWN0ZWRJc1JlbmRlcmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuYW1lID0gdGhpcy5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZU9wdGlvbihuYW1lLCB7IG5hbWUgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRJc1JlbmRlcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBvbkZvY3VzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWQoKGNhbGxiYWNrKSA9PiBnZXREYXRhKGZpZWxkLCAoZGF0YSkgPT4gY2FsbGJhY2soZGF0YSkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5leHBvcnQgbGV0IEluc3RhbmNlID0gbmV3IEZpbGVQaWNrZXJGaWVsZCgpO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./app/forms/fields/filepicker.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ FilePickerField),\n/* harmony export */ \"Instance\": () => (/* binding */ Instance)\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! grav-config */ \"grav-config\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(grav_config__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _utils_request__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/request */ \"./app/utils/request.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n // const insertTextAt = (string, index, text) => [string.slice(0, index), text, string.slice(index)].join('');\n\nvar FilePickerField = /*#__PURE__*/function () {\n function FilePickerField(options) {\n var _this = this;\n\n _classCallCheck(this, FilePickerField);\n\n this.items = jquery__WEBPACK_IMPORTED_MODULE_0___default()();\n this.options = Object.assign({}, this.defaults, options);\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-grav-filepicker]').each(function (index, element) {\n return _this.addItem(element);\n });\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('body').on('mutation._grav', this._onAddedNodes.bind(this));\n }\n\n _createClass(FilePickerField, [{\n key: \"_onAddedNodes\",\n value: function _onAddedNodes(event, target\n /* , record, instance */\n ) {\n var _this2 = this;\n\n var fields = jquery__WEBPACK_IMPORTED_MODULE_0___default()(target).find('[data-grav-filepicker]');\n\n if (!fields.length) {\n return;\n }\n\n fields.each(function (index, field) {\n field = jquery__WEBPACK_IMPORTED_MODULE_0___default()(field);\n\n if (!~_this2.items.index(field)) {\n _this2.addItem(field);\n }\n });\n }\n }, {\n key: \"addItem\",\n value: function addItem(element) {\n element = jquery__WEBPACK_IMPORTED_MODULE_0___default()(element);\n this.items = this.items.add(element);\n var tag = element.prop('tagName').toLowerCase();\n var isInput = tag === 'input' || tag === 'select';\n var field = isInput ? element : element.find('input, select');\n var folder = '';\n var thumbs = {};\n var onDemand = field.closest('[data-ondemand]').length > 0;\n\n if (!field.length || field.get(0).selectize) {\n return;\n }\n\n var getData = function getData(field, callback) {\n var mode = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'all';\n var url = grav_config__WEBPACK_IMPORTED_MODULE_1__.config.current_url + \".json/task\".concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.param_sep, \"getFilesInFolder\");\n var parent = field.closest('[data-grav-filepicker]');\n var name = parent.data('name');\n var value = parent.data('value');\n var params = JSON.stringify(grav_config__WEBPACK_IMPORTED_MODULE_1__.uri_params || '{}');\n (0,_utils_request__WEBPACK_IMPORTED_MODULE_2__.default)(url, {\n method: 'post',\n body: {\n name: name,\n params: params\n }\n }, function (response) {\n if (typeof response.files === 'undefined') {\n return;\n }\n\n var data = [];\n thumbs = response.thumbs || {};\n\n for (var i = 0; i < response.files.length; i++) {\n if (mode === 'selected' && response.files[i] !== value) {\n continue;\n }\n\n data.push({\n 'name': response.files[i],\n 'status': 'available',\n thumb: thumbs[response.files[i]] || ''\n });\n }\n\n for (var _i = 0; _i < response.pending.length; _i++) {\n if (mode === 'selected' && response.pending[_i] !== value) {\n continue;\n }\n\n data.push({\n 'name': response.pending[_i],\n 'status': 'pending',\n thumb: thumbs[response.pending[_i]] || ''\n });\n }\n\n folder = response.folder;\n callback(data, value);\n });\n };\n\n var imagesPreview = field.closest('[data-preview-images]').length > 0;\n var selectedIsRendered = false;\n\n var renderOption = function renderOption(item, escape) {\n var image = '';\n\n if (imagesPreview && folder && (!item.status || item.status === 'available') && item.name.match(/\\.(jpg|jpeg|png|gif)$/i)) {\n // const fallback2x = insertTextAt(`${config.base_url_relative}/../${folder}/${item.name}`, -4, '@2x');\n // const fallback3x = insertTextAt(`${config.base_url_relative}/../${folder}/${item.name}`, -4, '@3x');\n var source = thumbs[item.name] || \"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.base_url_relative, \"/../\").concat(folder, \"/\").concat(item.name); // onerror=\"if(this.src==='${fallback2x}'){this.src='${fallback3x}';}else{this.src='${fallback2x}'}\"\n\n image = \"\");\n }\n\n return \"
          \\n \\n \".concat(image, \" \").concat(escape(item.name), \"\\n \\n
          \");\n };\n\n field.selectize({\n plugins: ['required-fix'],\n valueField: 'name',\n labelField: 'name',\n searchField: 'name',\n optgroups: [{\n $order: 1,\n value: 'pending',\n label: 'Pending'\n }, {\n $order: 2,\n value: 'available',\n label: 'Available'\n }],\n optgroupField: 'status',\n // lockOptgroupOrder: true,\n create: false,\n preload: false,\n // 'focus',\n render: {\n option: function option(item, escape) {\n return renderOption(item, escape);\n },\n item: function item(_item, escape) {\n return renderOption(_item, escape);\n }\n },\n onInitialize: function onInitialize() {\n if (!onDemand) {\n this.load(function (callback) {\n return getData(field, function (data) {\n return callback(data);\n }, 'selected');\n });\n }\n },\n onLoad: function onLoad()\n /* data */\n {\n if (!selectedIsRendered) {\n var name = this.getValue();\n this.updateOption(name, {\n name: name\n });\n selectedIsRendered = true;\n }\n },\n onFocus: function onFocus() {\n this.load(function (callback) {\n return getData(field, function (data) {\n return callback(data);\n });\n });\n }\n });\n }\n }]);\n\n return FilePickerField;\n}();\n\n\nvar Instance = new FilePickerField();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL2Zvcm1zL2ZpZWxkcy9maWxlcGlja2VyLmpzPzcxM2QiXSwibmFtZXMiOlsiRmlsZVBpY2tlckZpZWxkIiwib3B0aW9ucyIsIml0ZW1zIiwiJCIsIk9iamVjdCIsImFzc2lnbiIsImRlZmF1bHRzIiwiZWFjaCIsImluZGV4IiwiZWxlbWVudCIsImFkZEl0ZW0iLCJvbiIsIl9vbkFkZGVkTm9kZXMiLCJiaW5kIiwiZXZlbnQiLCJ0YXJnZXQiLCJmaWVsZHMiLCJmaW5kIiwibGVuZ3RoIiwiZmllbGQiLCJhZGQiLCJ0YWciLCJwcm9wIiwidG9Mb3dlckNhc2UiLCJpc0lucHV0IiwiZm9sZGVyIiwidGh1bWJzIiwib25EZW1hbmQiLCJjbG9zZXN0IiwiZ2V0Iiwic2VsZWN0aXplIiwiZ2V0RGF0YSIsImNhbGxiYWNrIiwibW9kZSIsInVybCIsImNvbmZpZyIsInBhcmVudCIsIm5hbWUiLCJkYXRhIiwidmFsdWUiLCJwYXJhbXMiLCJKU09OIiwic3RyaW5naWZ5IiwidXJpX3BhcmFtcyIsInJlcXVlc3QiLCJtZXRob2QiLCJib2R5IiwicmVzcG9uc2UiLCJmaWxlcyIsImkiLCJwdXNoIiwidGh1bWIiLCJwZW5kaW5nIiwiaW1hZ2VzUHJldmlldyIsInNlbGVjdGVkSXNSZW5kZXJlZCIsInJlbmRlck9wdGlvbiIsIml0ZW0iLCJlc2NhcGUiLCJpbWFnZSIsInN0YXR1cyIsIm1hdGNoIiwic291cmNlIiwicGx1Z2lucyIsInZhbHVlRmllbGQiLCJsYWJlbEZpZWxkIiwic2VhcmNoRmllbGQiLCJvcHRncm91cHMiLCIkb3JkZXIiLCJsYWJlbCIsIm9wdGdyb3VwRmllbGQiLCJjcmVhdGUiLCJwcmVsb2FkIiwicmVuZGVyIiwib3B0aW9uIiwib25Jbml0aWFsaXplIiwibG9hZCIsIm9uTG9hZCIsImdldFZhbHVlIiwidXBkYXRlT3B0aW9uIiwib25Gb2N1cyIsIkluc3RhbmNlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7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Q0osU0FwQ1c7QUFzQ1p5QixlQUFPLEVBQUUsbUJBQVc7QUFDaEIsZUFBS0osSUFBTCxDQUFVLFVBQUMzQyxRQUFEO0FBQUEsbUJBQWNELE9BQU8sQ0FBQ1osS0FBRCxFQUFRLFVBQUNtQixJQUFEO0FBQUEscUJBQVVOLFFBQVEsQ0FBQ00sSUFBRCxDQUFsQjtBQUFBLGFBQVIsQ0FBckI7QUFBQSxXQUFWO0FBQ0g7QUF4Q1csT0FBaEI7QUEwQ0g7Ozs7Ozs7QUFHRSxJQUFJMEMsUUFBUSxHQUFHLElBQUloRixlQUFKLEVBQWYiLCJmaWxlIjoiLi9hcHAvZm9ybXMvZmllbGRzL2ZpbGVwaWNrZXIuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IHsgY29uZmlnLCB1cmlfcGFyYW1zIH0gZnJvbSAnZ3Jhdi1jb25maWcnO1xuaW1wb3J0IHJlcXVlc3QgZnJvbSAnLi4vLi4vdXRpbHMvcmVxdWVzdCc7XG5cbi8vIGNvbnN0IGluc2VydFRleHRBdCA9IChzdHJpbmcsIGluZGV4LCB0ZXh0KSA9PiBbc3RyaW5nLnNsaWNlKDAsIGluZGV4KSwgdGV4dCwgc3RyaW5nLnNsaWNlKGluZGV4KV0uam9pbignJyk7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZpbGVQaWNrZXJGaWVsZCB7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuaXRlbXMgPSAkKCk7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuZGVmYXVsdHMsIG9wdGlvbnMpO1xuXG4gICAgICAgICQoJ1tkYXRhLWdyYXYtZmlsZXBpY2tlcl0nKS5lYWNoKChpbmRleCwgZWxlbWVudCkgPT4gdGhpcy5hZGRJdGVtKGVsZW1lbnQpKTtcbiAgICAgICAgJCgnYm9keScpLm9uKCdtdXRhdGlvbi5fZ3JhdicsIHRoaXMuX29uQWRkZWROb2Rlcy5iaW5kKHRoaXMpKTtcbiAgICB9XG5cbiAgICBfb25BZGRlZE5vZGVzKGV2ZW50LCB0YXJnZXQvKiAsIHJlY29yZCwgaW5zdGFuY2UgKi8pIHtcbiAgICAgICAgbGV0IGZpZWxkcyA9ICQodGFyZ2V0KS5maW5kKCdbZGF0YS1ncmF2LWZpbGVwaWNrZXJdJyk7XG4gICAgICAgIGlmICghZmllbGRzLmxlbmd0aCkgeyByZXR1cm47IH1cblxuICAgICAgICBmaWVsZHMuZWFjaCgoaW5kZXgsIGZpZWxkKSA9PiB7XG4gICAgICAgICAgICBmaWVsZCA9ICQoZmllbGQpO1xuICAgICAgICAgICAgaWYgKCF+dGhpcy5pdGVtcy5pbmRleChmaWVsZCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW0oZmllbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhZGRJdGVtKGVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7XG4gICAgICAgIHRoaXMuaXRlbXMgPSB0aGlzLml0ZW1zLmFkZChlbGVtZW50KTtcblxuICAgICAgICBsZXQgdGFnID0gZWxlbWVudC5wcm9wKCd0YWdOYW1lJykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IGlzSW5wdXQgPSB0YWcgPT09ICdpbnB1dCcgfHwgdGFnID09PSAnc2VsZWN0JztcblxuICAgICAgICBsZXQgZmllbGQgPSAoaXNJbnB1dCA/IGVsZW1lbnQgOiBlbGVtZW50LmZpbmQoJ2lucHV0LCBzZWxlY3QnKSk7XG5cbiAgICAgICAgbGV0IGZvbGRlciA9ICcnO1xuICAgICAgICBsZXQgdGh1bWJzID0ge307XG5cbiAgICAgICAgbGV0IG9uRGVtYW5kID0gZmllbGQuY2xvc2VzdCgnW2RhdGEtb25kZW1hbmRdJykubGVuZ3RoID4gMDtcblxuICAgICAgICBpZiAoIWZpZWxkLmxlbmd0aCB8fCBmaWVsZC5nZXQoMCkuc2VsZWN0aXplKSB7IHJldHVybjsgfVxuXG4gICAgICAgIGxldCBnZXREYXRhID0gZnVuY3Rpb24gZ2V0RGF0YShmaWVsZCwgY2FsbGJhY2ssIG1vZGUgPSAnYWxsJykge1xuICAgICAgICAgICAgbGV0IHVybCA9IGNvbmZpZy5jdXJyZW50X3VybCArIGAuanNvbi90YXNrJHtjb25maWcucGFyYW1fc2VwfWdldEZpbGVzSW5Gb2xkZXJgO1xuICAgICAgICAgICAgbGV0IHBhcmVudCA9IGZpZWxkLmNsb3Nlc3QoJ1tkYXRhLWdyYXYtZmlsZXBpY2tlcl0nKTtcbiAgICAgICAgICAgIGxldCBuYW1lID0gcGFyZW50LmRhdGEoJ25hbWUnKTtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IHBhcmVudC5kYXRhKCd2YWx1ZScpO1xuICAgICAgICAgICAgbGV0IHBhcmFtcyA9IEpTT04uc3RyaW5naWZ5KHVyaV9wYXJhbXMgfHwgJ3t9Jyk7XG5cbiAgICAgICAgICAgIHJlcXVlc3QodXJsLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAncG9zdCcsXG4gICAgICAgICAgICAgICAgYm9keTogeyBuYW1lLCBwYXJhbXMgfVxuICAgICAgICAgICAgfSwgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXNwb25zZS5maWxlcyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBkYXRhID0gW107XG4gICAgICAgICAgICAgICAgdGh1bWJzID0gcmVzcG9uc2UudGh1bWJzIHx8IHt9O1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXNwb25zZS5maWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gJ3NlbGVjdGVkJyAmJiByZXNwb25zZS5maWxlc1tpXSAhPT0gdmFsdWUpIHsgY29udGludWU7IH1cbiAgICAgICAgICAgICAgICAgICAgZGF0YS5wdXNoKHsgJ25hbWUnOiByZXNwb25zZS5maWxlc1tpXSwgJ3N0YXR1cyc6ICdhdmFpbGFibGUnLCB0aHVtYjogdGh1bWJzW3Jlc3BvbnNlLmZpbGVzW2ldXSB8fCAnJyB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3BvbnNlLnBlbmRpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdzZWxlY3RlZCcgJiYgcmVzcG9uc2UucGVuZGluZ1tpXSAhPT0gdmFsdWUpIHsgY29udGludWU7IH1cbiAgICAgICAgICAgICAgICAgICAgZGF0YS5wdXNoKHsgJ25hbWUnOiByZXNwb25zZS5wZW5kaW5nW2ldLCAnc3RhdHVzJzogJ3BlbmRpbmcnLCB0aHVtYjogdGh1bWJzW3Jlc3BvbnNlLnBlbmRpbmdbaV1dIHx8ICcnIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZvbGRlciA9IHJlc3BvbnNlLmZvbGRlcjtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhkYXRhLCB2YWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgaW1hZ2VzUHJldmlldyA9IGZpZWxkLmNsb3Nlc3QoJ1tkYXRhLXByZXZpZXctaW1hZ2VzXScpLmxlbmd0aCA+IDA7XG4gICAgICAgIGxldCBzZWxlY3RlZElzUmVuZGVyZWQgPSBmYWxzZTtcblxuICAgICAgICBsZXQgcmVuZGVyT3B0aW9uID0gZnVuY3Rpb24gcmVuZGVyT3B0aW9uKGl0ZW0sIGVzY2FwZSkge1xuICAgICAgICAgICAgbGV0IGltYWdlID0gJyc7XG4gICAgICAgICAgICBpZiAoaW1hZ2VzUHJldmlldyAmJiBmb2xkZXIgJiYgKCFpdGVtLnN0YXR1cyB8fCBpdGVtLnN0YXR1cyA9PT0gJ2F2YWlsYWJsZScpICYmIGl0ZW0ubmFtZS5tYXRjaCgvXFwuKGpwZ3xqcGVnfHBuZ3xnaWYpJC9pKSkge1xuICAgICAgICAgICAgICAgIC8vIGNvbnN0IGZhbGxiYWNrMnggPSBpbnNlcnRUZXh0QXQoYCR7Y29uZmlnLmJhc2VfdXJsX3JlbGF0aXZlfS8uLi8ke2ZvbGRlcn0vJHtpdGVtLm5hbWV9YCwgLTQsICdAMngnKTtcbiAgICAgICAgICAgICAgICAvLyBjb25zdCBmYWxsYmFjazN4ID0gaW5zZXJ0VGV4dEF0KGAke2NvbmZpZy5iYXNlX3VybF9yZWxhdGl2ZX0vLi4vJHtmb2xkZXJ9LyR7aXRlbS5uYW1lfWAsIC00LCAnQDN4Jyk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc291cmNlID0gdGh1bWJzW2l0ZW0ubmFtZV0gfHwgYCR7Y29uZmlnLmJhc2VfdXJsX3JlbGF0aXZlfS8uLi8ke2ZvbGRlcn0vJHtpdGVtLm5hbWV9YDtcblxuICAgICAgICAgICAgICAgIC8vIG9uZXJyb3I9XCJpZih0aGlzLnNyYz09PScke2ZhbGxiYWNrMnh9Jyl7dGhpcy5zcmM9JyR7ZmFsbGJhY2szeH0nO31lbHNle3RoaXMuc3JjPScke2ZhbGxiYWNrMnh9J31cIlxuICAgICAgICAgICAgICAgIGltYWdlID0gYDxpbWcgY2xhc3M9XCJmaWxlcGlja2VyLWZpZWxkLWltYWdlXCIgc3JjPVwiJHtzb3VyY2V9XCIgLz5gO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gYDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtpbWFnZX0gPHNwYW4gY2xhc3M9XCJuYW1lIGZpbGVwaWNrZXItZmllbGQtbmFtZVwiPiR7ZXNjYXBlKGl0ZW0ubmFtZSl9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5gO1xuICAgICAgICB9O1xuXG4gICAgICAgIGZpZWxkLnNlbGVjdGl6ZSh7XG4gICAgICAgICAgICBwbHVnaW5zOiBbJ3JlcXVpcmVkLWZpeCddLFxuICAgICAgICAgICAgdmFsdWVGaWVsZDogJ25hbWUnLFxuICAgICAgICAgICAgbGFiZWxGaWVsZDogJ25hbWUnLFxuICAgICAgICAgICAgc2VhcmNoRmllbGQ6ICduYW1lJyxcbiAgICAgICAgICAgIG9wdGdyb3VwczogW1xuICAgICAgICAgICAgICAgIHskb3JkZXI6IDEsIHZhbHVlOiAncGVuZGluZycsIGxhYmVsOiAnUGVuZGluZyd9LFxuICAgICAgICAgICAgICAgIHskb3JkZXI6IDIsIHZhbHVlOiAnYXZhaWxhYmxlJywgbGFiZWw6ICdBdmFpbGFibGUnfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIG9wdGdyb3VwRmllbGQ6ICdzdGF0dXMnLFxuICAgICAgICAgICAgLy8gbG9ja09wdGdyb3VwT3JkZXI6IHRydWUsXG4gICAgICAgICAgICBjcmVhdGU6IGZhbHNlLFxuICAgICAgICAgICAgcHJlbG9hZDogZmFsc2UsIC8vICdmb2N1cycsXG4gICAgICAgICAgICByZW5kZXI6IHtcbiAgICAgICAgICAgICAgICBvcHRpb246IGZ1bmN0aW9uKGl0ZW0sIGVzY2FwZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVuZGVyT3B0aW9uKGl0ZW0sIGVzY2FwZSk7XG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIGl0ZW06IGZ1bmN0aW9uKGl0ZW0sIGVzY2FwZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVuZGVyT3B0aW9uKGl0ZW0sIGVzY2FwZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgb25Jbml0aWFsaXplOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBpZiAoIW9uRGVtYW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZCgoY2FsbGJhY2spID0+IGdldERhdGEoZmllbGQsIChkYXRhKSA9PiBjYWxsYmFjayhkYXRhKSwgJ3NlbGVjdGVkJykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIG9uTG9hZDogZnVuY3Rpb24oLyogZGF0YSAqLykge1xuICAgICAgICAgICAgICAgIGlmICghc2VsZWN0ZWRJc1JlbmRlcmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuYW1lID0gdGhpcy5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZU9wdGlvbihuYW1lLCB7IG5hbWUgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRJc1JlbmRlcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBvbkZvY3VzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWQoKGNhbGxiYWNrKSA9PiBnZXREYXRhKGZpZWxkLCAoZGF0YSkgPT4gY2FsbGJhY2soZGF0YSkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5leHBvcnQgbGV0IEluc3RhbmNlID0gbmV3IEZpbGVQaWNrZXJGaWVsZCgpO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./app/forms/fields/filepicker.js\n"); /***/ }), /***/ "./app/forms/fields/files.js": -/*!***********************************!* +/*!***********************************!*\ !*** ./app/forms/fields/files.js ***! \***********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => /* binding */ FilesField,\n/* harmony export */ \"UriToMarkdown\": () => /* binding */ UriToMarkdown,\n/* harmony export */ \"Instance\": () => /* binding */ Instance\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var dropzone__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! dropzone */ \"./node_modules/dropzone/dist/dropzone.js\");\n/* harmony import */ var dropzone__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(dropzone__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _utils_request__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/request */ \"./app/utils/request.js\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! grav-config */ \"grav-config\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(grav_config__WEBPACK_IMPORTED_MODULE_3__);\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n // import EXIF from 'exif-js';\n\n\n // translations\n\nvar Dictionary = {\n dictCancelUpload: grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.DROPZONE_CANCEL_UPLOAD,\n dictCancelUploadConfirmation: grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.DROPZONE_CANCEL_UPLOAD_CONFIRMATION,\n dictDefaultMessage: grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.DROPZONE_DEFAULT_MESSAGE,\n dictFallbackMessage: grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.DROPZONE_FALLBACK_MESSAGE,\n dictFallbackText: grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.DROPZONE_FALLBACK_TEXT,\n dictFileTooBig: grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.DROPZONE_FILE_TOO_BIG,\n dictInvalidFileType: grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.DROPZONE_INVALID_FILE_TYPE,\n dictMaxFilesExceeded: grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.DROPZONE_MAX_FILES_EXCEEDED,\n dictRemoveFile: grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.DROPZONE_REMOVE_FILE,\n dictResponseError: grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.DROPZONE_RESPONSE_ERROR\n};\n(dropzone__WEBPACK_IMPORTED_MODULE_1___default().autoDiscover) = false;\n(dropzone__WEBPACK_IMPORTED_MODULE_1___default().options.gravPageDropzone) = {};\n\n(dropzone__WEBPACK_IMPORTED_MODULE_1___default().confirm) = function (question, accepted, rejected) {\n var doc = jquery__WEBPACK_IMPORTED_MODULE_0___default()(document);\n var modalSelector = '[data-remodal-id=\"delete-media\"]';\n\n var removeEvents = function removeEvents() {\n doc.off('confirmation', modalSelector, accept);\n doc.off('cancellation', modalSelector, reject);\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(modalSelector).find('.remodal-confirm').removeClass('pointer-events-disabled');\n };\n\n var accept = function accept() {\n accepted && accepted();\n removeEvents();\n };\n\n var reject = function reject() {\n rejected && rejected();\n removeEvents();\n };\n\n (jquery__WEBPACK_IMPORTED_MODULE_0___default().remodal.lookup)[jquery__WEBPACK_IMPORTED_MODULE_0___default()(modalSelector).data('remodal')].open();\n doc.on('confirmation', modalSelector, accept);\n doc.on('cancellation', modalSelector, reject);\n};\n\nvar DropzoneMediaConfig = {\n timeout: 0,\n thumbnailWidth: 200,\n thumbnailHeight: 150,\n addRemoveLinks: false,\n dictDefaultMessage: grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.DROP_FILES_HERE_TO_UPLOAD.replace(/</g, '<').replace(/>/g, '>'),\n dictRemoveFileConfirmation: '[placeholder]',\n previewTemplate: \"\\n \").trim()\n}; // global.EXIF = EXIF;\n\nvar ACCEPT_FUNC = function ACCEPT_FUNC(file, done, settings) {\n var resolution = settings.resolution;\n if (!resolution) return done();\n var reader = new FileReader();\n var error = '';\n var hasMin = resolution.min && (resolution.min.width || resolution.min.height);\n var hasMax = resolution.max && (resolution.max.width || resolution.max.height);\n\n if (hasMin || !(settings.resizeWidth || settings.resizeHeight) && hasMax) {\n reader.onload = function (event) {\n var image = new Image();\n image.src = event.target.result;\n\n image.onerror = function () {\n done(grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.FILE_ERROR_UPLOAD);\n };\n\n image.onload = function () {\n var _this = this;\n\n if (resolution.min) {\n Object.keys(resolution.min).forEach(function (attr) {\n if (resolution.min[attr] && _this[attr] < resolution.min[attr]) {\n error += grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_FORM.RESOLUTION_MIN.replace(/{{attr}}/g, attr).replace(/{{min}}/g, resolution.min[attr]);\n }\n });\n }\n\n if (!(settings.resizeWidth || settings.resizeHeight)) {\n if (resolution.max) {\n Object.keys(resolution.max).forEach(function (attr) {\n if (resolution.max[attr] && _this[attr] > resolution.max[attr]) {\n error += grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_FORM.RESOLUTION_MAX.replace(/{{attr}}/g, attr).replace(/{{max}}/g, resolution.max[attr]);\n }\n });\n }\n }\n\n URL.revokeObjectURL(image.src); // release memory\n\n return error ? done(error) : done();\n };\n };\n\n reader.readAsDataURL(file);\n } else {\n return error ? done(error) : done();\n }\n};\n\nvar FilesField = /*#__PURE__*/function () {\n function FilesField() {\n var _this2 = this;\n\n var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n _ref$container = _ref.container,\n container = _ref$container === void 0 ? '.dropzone.files-upload' : _ref$container,\n _ref$options = _ref.options,\n options = _ref$options === void 0 ? {} : _ref$options;\n\n _classCallCheck(this, FilesField);\n\n this.container = jquery__WEBPACK_IMPORTED_MODULE_0___default()(container);\n\n if (!this.container.length) {\n return;\n }\n\n this.urls = {};\n this.customPost = this.container.data('filePostAdd') || {};\n this.options = Object.assign({}, Dictionary, DropzoneMediaConfig, {\n klass: this,\n url: this.container.data('file-url-add') || grav_config__WEBPACK_IMPORTED_MODULE_3__.config.current_url,\n acceptedFiles: this.container.data('media-types'),\n init: this.initDropzone\n }, this.container.data('dropzone-options'), options);\n this.options = Object.assign({}, this.options, {\n accept: function accept(file, done) {\n ACCEPT_FUNC(file, done, this.options);\n }\n });\n this.dropzone = new (dropzone__WEBPACK_IMPORTED_MODULE_1___default())(container, this.options);\n this.dropzone.on('complete', this.onDropzoneComplete.bind(this));\n this.dropzone.on('success', this.onDropzoneSuccess.bind(this));\n this.dropzone.on('removedfile', this.onDropzoneRemovedFile.bind(this));\n this.dropzone.on('sending', this.onDropzoneSending.bind(this));\n this.dropzone.on('error', this.onDropzoneError.bind(this));\n this.container.on('mouseenter', '[data-dz-view]', function (e) {\n var value = JSON.parse(_this2.container.find('[name][type=\"hidden\"]').val() || '{}');\n var target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(e.currentTarget);\n var file = target.parent('.dz-preview').find('.dz-filename');\n var filename = encodeURI(file.text());\n var URL = Object.keys(value).filter(function (key) {\n return value[key].name === filename;\n }).shift();\n target.attr('href', \"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_3__.config.base_url_simple, \"/\").concat(URL));\n });\n }\n\n _createClass(FilesField, [{\n key: \"initDropzone\",\n value: function initDropzone() {\n var _this3 = this;\n\n var files = this.options.klass.container.find('[data-file]');\n var dropzone = this;\n\n if (!files.length) {\n return;\n }\n\n files.each(function (index, file) {\n file = jquery__WEBPACK_IMPORTED_MODULE_0___default()(file);\n var data = file.data('file');\n var mock = {\n name: data.name,\n size: data.size,\n type: data.type,\n status: (dropzone__WEBPACK_IMPORTED_MODULE_1___default().ADDED),\n accepted: true,\n url: _this3.options.url,\n removeUrl: data.remove\n };\n dropzone.files.push(mock);\n dropzone.options.addedfile.call(dropzone, mock);\n\n if (mock.type.match(/^image\\//)) {\n dropzone.options.thumbnail.call(dropzone, mock, data.path);\n dropzone.createThumbnailFromUrl(mock, data.path);\n }\n\n file.remove();\n });\n }\n }, {\n key: \"getURI\",\n value: function getURI() {\n return this.container.data('mediaUri') || '';\n }\n }, {\n key: \"onDropzoneSending\",\n value: function onDropzoneSending(file, xhr, formData) {\n var _this4 = this;\n\n if (Object.keys(this.customPost).length) {\n Object.keys(this.customPost).forEach(function (key) {\n formData.append(key, _this4.customPost[key]);\n });\n } else {\n formData.append('name', this.options.dotNotation);\n formData.append('task', 'filesupload');\n formData.append('uri', this.getURI());\n }\n\n formData.append('admin-nonce', grav_config__WEBPACK_IMPORTED_MODULE_3__.config.admin_nonce);\n }\n }, {\n key: \"onDropzoneSuccess\",\n value: function onDropzoneSuccess(file, response, xhr) {\n response = typeof response === 'string' ? JSON.parse(response) : response;\n\n if (this.options.reloadPage) {\n __webpack_require__.g.location.reload();\n } // store params for removing file from session before it gets saved\n\n\n if (response.session) {\n file.sessionParams = response.session;\n file.removeUrl = this.options.url; // Touch field value to force a mutation detection\n\n var input = this.container.find('[name][type=\"hidden\"]');\n var value = input.val();\n input.val(value + ' ');\n }\n\n return this.handleError({\n file: file,\n data: response,\n mode: 'removeFile',\n msg: \"

          \".concat(grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.FILE_ERROR_UPLOAD, \" \").concat(file.name, \"

          \\n
          \").concat(response.message, \"
          \")\n });\n }\n }, {\n key: \"onDropzoneComplete\",\n value: function onDropzoneComplete(file) {\n if (!file.accepted && !file.rejected) {\n var data = {\n status: 'error',\n message: \"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.FILE_UNSUPPORTED, \": \").concat(file.name.match(/\\..+/).join(''))\n };\n return this.handleError({\n file: file,\n data: data,\n mode: 'removeFile',\n msg: \"

          \".concat(grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.FILE_ERROR_ADD, \" \").concat(file.name, \"

          \\n
          \").concat(data.message, \"
          \")\n });\n }\n\n if (this.options.reloadPage) {\n __webpack_require__.g.location.reload();\n }\n }\n }, {\n key: \"b64_to_utf8\",\n value: function b64_to_utf8(str) {\n str = str.replace(/\\s/g, '');\n return decodeURIComponent(escape(window.atob(str)));\n }\n }, {\n key: \"onDropzoneRemovedFile\",\n value: function onDropzoneRemovedFile(file) {\n var _this5 = this;\n\n if (!file.accepted || file.rejected) {\n return;\n }\n\n var url = file.removeUrl || this.urls[\"delete\"] || this.options.url;\n var path = (url || '').match(/path:(.*)\\//);\n var body = {\n filename: file.name,\n uri: this.getURI()\n };\n\n if (file.sessionParams) {\n body.task = 'filessessionremove';\n body.session = file.sessionParams;\n }\n\n var customPost = this.container.data('filePostRemove') || {};\n\n if (Object.keys(customPost).length) {\n body = {};\n Object.keys(customPost).forEach(function (key) {\n body[key] = customPost[key];\n });\n }\n\n body['filename'] = file.name;\n body['admin-nonce'] = grav_config__WEBPACK_IMPORTED_MODULE_3__.config.admin_nonce;\n (0,_utils_request__WEBPACK_IMPORTED_MODULE_2__.default)(url, {\n method: 'post',\n body: body\n }, function () {\n if (!path) {\n return;\n }\n\n path = _this5.b64_to_utf8(path[1]);\n\n var input = _this5.container.find('[name][type=\"hidden\"]');\n\n var data = JSON.parse(input.val() || '{}');\n delete data[path];\n input.val(JSON.stringify(data));\n });\n }\n }, {\n key: \"onDropzoneError\",\n value: function onDropzoneError(file, response, xhr) {\n var message = xhr ? response.error.message : response;\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(file.previewElement).find('[data-dz-errormessage]').html(message);\n return this.handleError({\n file: file,\n data: {\n status: 'error'\n },\n msg: \"
          \".concat(message, \"
          \")\n });\n }\n }, {\n key: \"handleError\",\n value: function handleError(options) {\n var file = options.file,\n data = options.data,\n mode = options.mode,\n msg = options.msg;\n\n if (data.status !== 'error' && data.status !== 'unauthorized') {\n return;\n }\n\n switch (mode) {\n case 'addBack':\n if (file instanceof File) {\n this.dropzone.addFile.call(this.dropzone, file);\n } else {\n this.dropzone.files.push(file);\n this.dropzone.options.addedfile.call(this.dropzone, file);\n this.dropzone.options.thumbnail.call(this.dropzone, file, file.extras.url);\n }\n\n break;\n\n case 'removeFile':\n default:\n if (~this.dropzone.files.indexOf(file)) {\n file.rejected = true;\n this.dropzone.removeFile.call(this.dropzone, file, {\n silent: true\n });\n }\n\n break;\n }\n\n var modal = jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-remodal-id=\"generic\"]');\n modal.find('.error-content').html(msg);\n (jquery__WEBPACK_IMPORTED_MODULE_0___default().remodal.lookup)[modal.data('remodal')].open();\n }\n }]);\n\n return FilesField;\n}();\n\n\nfunction UriToMarkdown(uri) {\n uri = uri.replace(/@3x|@2x|@1x/, '');\n uri = uri.replace(/\\(/g, '%28');\n uri = uri.replace(/\\)/g, '%29');\n var title = uri.split('.').slice(0, -1).join('.');\n return uri.match(/\\.(jpe?g|png|gif|svg|mp4|webm|ogv|mov)$/i) ? \"![\".concat(title, \"](\").concat(uri, \" \\\"\").concat(title, \"\\\")\") : \"[\".concat(decodeURI(uri), \"](\").concat(uri, \")\");\n}\nvar instances = [];\nvar cache = jquery__WEBPACK_IMPORTED_MODULE_0___default()();\n\nvar onAddedNodes = function onAddedNodes(event, target\n/* , record, instance */\n) {\n var files = jquery__WEBPACK_IMPORTED_MODULE_0___default()(target).find('.dropzone.files-upload');\n\n if (!files.length) {\n return;\n }\n\n files.each(function (index, file) {\n file = jquery__WEBPACK_IMPORTED_MODULE_0___default()(file);\n\n if (!~cache.index(file)) {\n addNode(file);\n }\n });\n};\n\nvar addNode = function addNode(container) {\n container = jquery__WEBPACK_IMPORTED_MODULE_0___default()(container);\n var input = container.find('input[type=\"file\"]');\n var settings = container.data('grav-file-settings') || {};\n\n if (settings.accept && ~settings.accept.indexOf('*')) {\n settings.accept = [''];\n }\n\n var options = {\n url: container.data('file-url-add') || (container.closest('form').attr('action') || grav_config__WEBPACK_IMPORTED_MODULE_3__.config.current_url) + '.json',\n paramName: settings.paramName || 'file',\n dotNotation: settings.name || 'file',\n acceptedFiles: settings.accept ? settings.accept.join(',') : input.attr('accept') || container.data('media-types'),\n maxFilesize: typeof settings.filesize !== 'undefined' ? settings.filesize : 256,\n maxFiles: settings.limit || null,\n resizeWidth: settings.resizeWidth || null,\n resizeHeight: settings.resizeHeight || null,\n resizeQuality: settings.resizeQuality || null,\n resolution: settings.resolution || null,\n accept: function accept(file, done) {\n ACCEPT_FUNC(file, done, settings);\n }\n };\n cache = cache.add(container);\n container = container[0];\n instances.push(new FilesField({\n container: container,\n options: options\n }));\n};\n\nvar Instance = function () {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.dropzone.files-upload').each(function (i, container) {\n return addNode(container);\n });\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('body').on('mutation._grav', onAddedNodes);\n return instances;\n}();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL2Zvcm1zL2ZpZWxkcy9maWxlcy5qcz82MTc5Il0sIm5hbWVzIjpbIkRpY3Rpb25hcnkiLCJkaWN0Q2FuY2VsVXBsb2FkIiwidHJhbnNsYXRpb25zIiwiZGljdENhbmNlbFVwbG9hZENvbmZpcm1hdGlvbiIsImRpY3REZWZhdWx0TWVzc2FnZSIsImRpY3RGYWxsYmFja01lc3NhZ2UiLCJkaWN0RmFsbGJhY2tUZXh0IiwiZGljdEZpbGVUb29CaWciLCJkaWN0SW52YWxpZEZpbGVUeXBlIiwiZGljdE1heEZpbGVzRXhjZWVkZWQiLCJkaWN0UmVtb3ZlRmlsZSIsImRpY3RSZXNwb25zZUVycm9yIiwiRFJPUFpPTkVfUkVTUE9OU0VfRVJST1IiLCJEcm9wem9uZSIsInF1ZXN0aW9uIiwiYWNjZXB0ZWQiLCJyZWplY3RlZCIsImRvYyIsIiQiLCJkb2N1bWVudCIsIm1vZGFsU2VsZWN0b3IiLCJyZW1vdmVFdmVudHMiLCJvZmYiLCJhY2NlcHQiLCJyZWplY3QiLCJmaW5kIiwicmVtb3ZlQ2xhc3MiLCJkYXRhIiwib3BlbiIsIm9uIiwiRHJvcHpvbmVNZWRpYUNvbmZpZyIsInRpbWVvdXQiLCJ0aHVtYm5haWxXaWR0aCIsInRodW1ibmFpbEhlaWdodCIsImFkZFJlbW92ZUxpbmtzIiwicmVwbGFjZSIsImRpY3RSZW1vdmVGaWxlQ29uZmlybWF0aW9uIiwicHJldmlld1RlbXBsYXRlIiwidHJpbSIsIkFDQ0VQVF9GVU5DIiwiZmlsZSIsImRvbmUiLCJzZXR0aW5ncyIsInJlc29sdXRpb24iLCJyZWFkZXIiLCJGaWxlUmVhZGVyIiwiZXJyb3IiLCJoYXNNaW4iLCJtaW4iLCJ3aWR0aCIsImhlaWdodCIsImhhc01heCIsIm1heCIsInJlc2l6ZVdpZHRoIiwicmVzaXplSGVpZ2h0Iiwib25sb2FkIiwiZXZlbnQiLCJpbWFnZSIsIkltYWdlIiwic3JjIiwidGFyZ2V0IiwicmVzdWx0Iiwib25lcnJvciIsIk9iamVjdCIsImtleXMiLCJmb3JFYWNoIiwiYXR0ciIsIlVSTCIsInJldm9rZU9iamVjdFVSTCIsInJlYWRBc0RhdGFVUkwiLCJGaWxlc0ZpZWxkIiwiY29udGFpbmVyIiwib3B0aW9ucyIsImxlbmd0aCIsInVybHMiLCJjdXN0b21Qb3N0IiwiYXNzaWduIiwia2xhc3MiLCJ1cmwiLCJjb25maWciLCJhY2NlcHRlZEZpbGVzIiwiaW5pdCIsImluaXREcm9wem9uZSIsImRyb3B6b25lIiwib25Ecm9wem9uZUNvbXBsZXRlIiwiYmluZCIsIm9uRHJvcHpvbmVTdWNjZXNzIiwib25Ecm9wem9uZVJlbW92ZWRGaWxlIiwib25Ecm9wem9uZVNlbmRpbmciLCJvbkRyb3B6b25lRXJyb3IiLCJlIiwidmFsdWUiLCJKU09OIiwicGFyc2UiLCJ2YWwiLCJjdXJyZW50VGFyZ2V0IiwicGFyZW50IiwiZmlsZW5hbWUiLCJlbmNvZGVVUkkiLCJ0ZXh0IiwiZmlsdGVyIiwia2V5IiwibmFtZSIsInNoaWZ0IiwiZmlsZXMiLCJlYWNoIiwiaW5kZXgiLCJtb2NrIiwic2l6ZSIsInR5cGUiLCJzdGF0dXMiLCJyZW1vdmVVcmwiLCJyZW1vdmUiLCJwdXNoIiwiYWRkZWRmaWxlIiwiY2FsbCIsIm1hdGNoIiwidGh1bWJuYWlsIiwicGF0aCIsImNyZWF0ZVRodW1ibmFpbEZyb21VcmwiLCJ4aHIiLCJmb3JtRGF0YSIsImFwcGVuZCIsImRvdE5vdGF0aW9uIiwiZ2V0VVJJIiwicmVzcG9uc2UiLCJyZWxvYWRQYWdlIiwiZ2xvYmFsIiwibG9jYXRpb24iLCJyZWxvYWQiLCJzZXNzaW9uIiwic2Vzc2lvblBhcmFtcyIsImlucHV0IiwiaGFuZGxlRXJyb3IiLCJtb2RlIiwibXNnIiwibWVzc2FnZSIsImpvaW4iLCJzdHIiLCJkZWNvZGVVUklDb21wb25lbnQiLCJlc2NhcGUiLCJ3aW5kb3ciLCJhdG9iIiwiYm9keSIsInVyaSIsInRhc2siLCJyZXF1ZXN0IiwibWV0aG9kIiwiYjY0X3RvX3V0ZjgiLCJzdHJpbmdpZnkiLCJwcmV2aWV3RWxlbWVudCIsImh0bWwiLCJGaWxlIiwiYWRkRmlsZSIsImV4dHJhcyIsImluZGV4T2YiLCJyZW1vdmVGaWxlIiwic2lsZW50IiwibW9kYWwiLCJVcmlUb01hcmtkb3duIiwidGl0bGUiLCJzcGxpdCIsInNsaWNlIiwiZGVjb2RlVVJJIiwiaW5zdGFuY2VzIiwiY2FjaGUiLCJvbkFkZGVkTm9kZXMiLCJhZGROb2RlIiwiY2xvc2VzdCIsInBhcmFtTmFtZSIsIm1heEZpbGVzaXplIiwiZmlsZXNpemUiLCJtYXhGaWxlcyIsImxpbWl0IiwicmVzaXplUXVhbGl0eSIsImFkZCIsIkluc3RhbmNlIiwiaSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0NBRUE7O0FBQ0E7Q0FHQTs7QUFDQSxJQUFNQSxVQUFVLEdBQUc7QUFDZkMsa0JBQWdCLEVBQUVDLHlGQURIO0FBRWZDLDhCQUE0QixFQUFFRCxzR0FGZjtBQUdmRSxvQkFBa0IsRUFBRUYsMkZBSEw7QUFJZkcscUJBQW1CLEVBQUVILDRGQUpOO0FBS2ZJLGtCQUFnQixFQUFFSix5RkFMSDtBQU1mSyxnQkFBYyxFQUFFTCx3RkFORDtBQU9mTSxxQkFBbUIsRUFBRU4sNkZBUE47QUFRZk8sc0JBQW9CLEVBQUVQLDhGQVJQO0FBU2ZRLGdCQUFjLEVBQUVSLHVGQVREO0FBVWZTLG1CQUFpQixFQUFFVCwwRkFBaURVO0FBVnJELENBQW5CO0FBYUFDLDhEQUFBLEdBQXdCLEtBQXhCO0FBQ0FBLDBFQUFBLEdBQW9DLEVBQXBDOztBQUNBQSx5REFBQSxHQUFtQixVQUFDQyxRQUFELEVBQVdDLFFBQVgsRUFBcUJDLFFBQXJCLEVBQWtDO0FBQ2pELE1BQUlDLEdBQUcsR0FBR0MsNkNBQUMsQ0FBQ0MsUUFBRCxDQUFYO0FBQ0EsTUFBSUMsYUFBYSxHQUFHLGtDQUFwQjs7QUFFQSxNQUFJQyxZQUFZLEdBQUcsU0FBZkEsWUFBZSxHQUFNO0FBQ3JCSixPQUFHLENBQUNLLEdBQUosQ0FBUSxjQUFSLEVBQXdCRixhQUF4QixFQUF1Q0csTUFBdkM7QUFDQU4sT0FBRyxDQUFDSyxH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QUErRCxHQUxsRTtBQU1WQyxZQUFRLEVBQUVsSSxRQUFRLENBQUNtSSxLQUFULElBQWtCLElBTmxCO0FBT1Z4SCxlQUFXLEVBQUVYLFFBQVEsQ0FBQ1csV0FBVCxJQUF3QixJQVAzQjtBQVFWQyxnQkFBWSxFQUFFWixRQUFRLENBQUNZLFlBQVQsSUFBeUIsSUFSN0I7QUFTVndILGlCQUFhLEVBQUVwSSxRQUFRLENBQUNvSSxhQUFULElBQTBCLElBVC9CO0FBVVZuSSxjQUFVLEVBQUVELFFBQVEsQ0FBQ0MsVUFBVCxJQUF1QixJQVZ6QjtBQVdWcEIsVUFBTSxFQUFFLGdCQUFTaUIsSUFBVCxFQUFlQyxJQUFmLEVBQXFCO0FBQUVGLGlCQUFXLENBQUNDLElBQUQsRUFBT0MsSUFBUCxFQUFhQyxRQUFiLENBQVg7QUFBb0M7QUFYekQsR0FBZDtBQWNBMkgsT0FBSyxHQUFHQSxLQUFLLENBQUNVLEdBQU4sQ0FBVXhHLFNBQVYsQ0FBUjtBQUNBQSxXQUFTLEdBQUdBLFNBQVMsQ0FBQyxDQUFELENBQXJCO0FBQ0E2RixXQUFTLENBQUNuRCxJQUFWLENBQWUsSUFBSTNDLFVBQUosQ0FBZTtBQUFFQyxhQUFTLEVBQVRBLFNBQUY7QUFBYUMsV0FBTyxFQUFQQTtBQUFiLEdBQWYsQ0FBZjtBQUNILENBMUJEOztBQTRCTyxJQUFJd0csUUFBUSxHQUFJLFlBQU07QUFDekI5SiwrQ0FBQyxDQUFDLHdCQUFELENBQUQsQ0FBNEJ1RixJQUE1QixDQUFpQyxVQUFDd0UsQ0FBRCxFQUFJMUcsU0FBSjtBQUFBLFdBQWtCZ0csT0FBTyxDQUFDaEcsU0FBRCxDQUF6QjtBQUFBLEdBQWpDO0FBQ0FyRCwrQ0FBQyxDQUFDLE1BQUQsQ0FBRCxDQUFVVyxFQUFWLENBQWEsZ0JBQWIsRUFBK0J5SSxZQUEvQjtBQUVBLFNBQU9GLFNBQVA7QUFDSCxDQUxxQixFQUFmIiwiZmlsZSI6Ii4vYXBwL2Zvcm1zL2ZpZWxkcy9maWxlcy5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgRHJvcHpvbmUgZnJvbSAnZHJvcHpvbmUnO1xuLy8gaW1wb3J0IEVYSUYgZnJvbSAnZXhpZi1qcyc7XG5pbXBvcnQgcmVxdWVzdCBmcm9tICcuLi8uLi91dGlscy9yZXF1ZXN0JztcbmltcG9ydCB7IGNvbmZpZywgdHJhbnNsYXRpb25zIH0gZnJvbSAnZ3Jhdi1jb25maWcnO1xuXG4vLyB0cmFuc2xhdGlvbnNcbmNvbnN0IERpY3Rpb25hcnkgPSB7XG4gICAgZGljdENhbmNlbFVwbG9hZDogdHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5EUk9QWk9ORV9DQU5DRUxfVVBMT0FELFxuICAgIGRpY3RDYW5jZWxVcGxvYWRDb25maXJtYXRpb246IHRyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uRFJPUFpPTkVfQ0FOQ0VMX1VQTE9BRF9DT05GSVJNQVRJT04sXG4gICAgZGljdERlZmF1bHRNZXNzYWdlOiB0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLkRST1BaT05FX0RFRkFVTFRfTUVTU0FHRSxcbiAgICBkaWN0RmFsbGJhY2tNZXNzYWdlOiB0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLkRST1BaT05FX0ZBTExCQUNLX01FU1NBR0UsXG4gICAgZGljdEZhbGxiYWNrVGV4dDogdHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5EUk9QWk9ORV9GQUxMQkFDS19URVhULFxuICAgIGRpY3RGaWxlVG9vQmlnOiB0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLkRST1BaT05FX0ZJTEVfVE9PX0JJRyxcbiAgICBkaWN0SW52YWxpZEZpbGVUeXBlOiB0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLkRST1BaT05FX0lOVkFMSURfRklMRV9UWVBFLFxuICAgIGRpY3RNYXhGaWxlc0V4Y2VlZGVkOiB0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLkRST1BaT05FX01BWF9GSUxFU19FWENFRURFRCxcbiAgICBkaWN0UmVtb3ZlRmlsZTogdHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5EUk9QWk9ORV9SRU1PVkVfRklMRSxcbiAgICBkaWN0UmVzcG9uc2VFcnJvcjogdHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5EUk9QWk9ORV9SRVNQT05TRV9FUlJPUlxufTtcblxuRHJvcHpvbmUuYXV0b0Rpc2NvdmVyID0gZmFsc2U7XG5Ecm9wem9uZS5vcHRpb25zLmdyYXZQYWdlRHJvcHpvbmUgPSB7fTtcbkRyb3B6b25lLmNvbmZpcm0gPSAocXVlc3Rpb24sIGFjY2VwdGVkLCByZWplY3RlZCkgPT4ge1xuICAgIGxldCBkb2MgPSAkKGRvY3VtZW50KTtcbiAgICBsZXQgbW9kYWxTZWxlY3RvciA9ICdbZGF0YS1yZW1vZGFsLWlkPVwiZGVsZXRlLW1lZGlhXCJdJztcblxuICAgIGxldCByZW1vdmVFdmVudHMgPSAoKSA9PiB7XG4gICAgICAgIGRvYy5vZmYoJ2NvbmZpcm1hdGlvbicsIG1vZGFsU2VsZWN0b3IsIGFjY2VwdCk7XG4gICAgICAgIGRvYy5vZmYoJ2NhbmNlbGxhdGlvbicsIG1vZGFsU2VsZWN0b3IsIHJlamVjdCk7XG5cbiAgICAgICAgJChtb2RhbFNlbGVjdG9yKS5maW5kKCcucmVtb2RhbC1jb25maXJtJykucmVtb3ZlQ2xhc3MoJ3BvaW50ZXItZXZlbnRzLWRpc2FibGVkJyk7XG4gICAgfTtcblxuICAgIGxldCBhY2NlcHQgPSAoKSA9PiB7XG4gICAgICAgIGFjY2VwdGVkICYmIGFjY2VwdGVkKCk7XG4gICAgICAgIHJlbW92ZUV2ZW50cygpO1xuICAgIH07XG5cbiAgICBsZXQgcmVqZWN0ID0gKCkgPT4ge1xuICAgICAgICByZWplY3RlZCAmJiByZWplY3RlZCgpO1xuICAgICAgICByZW1vdmVFdmVudHMoKTtcbiAgICB9O1xuXG4gICAgJC5yZW1vZGFsLmxvb2t1cFskKG1vZGFsU2VsZWN0b3IpLmRhdGEoJ3JlbW9kYWwnKV0ub3BlbigpO1xuICAgIGRvYy5vbignY29uZmlybWF0aW9uJywgbW9kYWxTZWxlY3RvciwgYWNjZXB0KTtcbiAgICBkb2Mub24oJ2NhbmNlbGxhdGlvbicsIG1vZGFsU2VsZWN0b3IsIHJlamVjdCk7XG59O1xuXG5jb25zdCBEcm9wem9uZU1lZGlhQ29uZmlnID0ge1xuICAgIHRpbWVvdXQ6IDAsXG4gICAgdGh1bWJuYWlsV2lkdGg6IDIwMCxcbiAgICB0aHVtYm5haWxIZWlnaHQ6IDE1MCxcbiAgICBhZGRSZW1vdmVMaW5rczogZmFsc2UsXG4gICAgZGljdERlZmF1bHRNZXNzYWdlOiB0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLkRST1BfRklMRVNfSEVSRV9UT19VUExPQUQucmVwbGFjZSgvJmx0Oy9nLCAnPCcpLnJlcGxhY2UoLyZndDsvZywgJz4nKSxcbiAgICBkaWN0UmVtb3ZlRmlsZUNvbmZpcm1hdGlvbjogJ1twbGFjZWhvbGRlcl0nLFxuICAgIHByZXZpZXdUZW1wbGF0ZTogYFxuICAgICAgICA8ZGl2IGNsYXNzPVwiZHotcHJldmlldyBkei1maWxlLXByZXZpZXcgZHotbm8tZWRpdG9yXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImR6LWRldGFpbHNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkei1maWxlbmFtZVwiPjxzcGFuIGRhdGEtZHotbmFtZT48L3NwYW4+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHotc2l6ZVwiIGRhdGEtZHotc2l6ZT48L2Rpdj5cbiAgICAgICAgICAgIDxpbWcgZGF0YS1kei10aHVtYm5haWwgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHotcHJvZ3Jlc3NcIj48c3BhbiBjbGFzcz1cImR6LXVwbG9hZFwiIGRhdGEtZHotdXBsb2FkcHJvZ3Jlc3M+PC9zcGFuPjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkei1zdWNjZXNzLW1hcmtcIj48c3Bhbj7inJQ8L3NwYW4+PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImR6LWVycm9yLW1hcmtcIj48c3Bhbj7inJg8L3NwYW4+PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImR6LWVycm9yLW1lc3NhZ2VcIj48c3BhbiBkYXRhLWR6LWVycm9ybWVzc2FnZT48L3NwYW4+PC9kaXY+XG4gICAgICAgICAgPGEgY2xhc3M9XCJkei11bnNldFwiIHRpdGxlPVwiJHt0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLlVOU0VUfVwiIGhyZWY9XCIjXCIgZGF0YS1kei11bnNldD4ke3RyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uVU5TRVR9PC9hPlxuICAgICAgICAgIDxhIGNsYXNzPVwiZHotcmVtb3ZlXCIgdGl0bGU9XCIke3RyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uREVMRVRFfVwiIGhyZWY9XCJqYXZhc2NyaXB0OnVuZGVmaW5lZDtcIiBkYXRhLWR6LXJlbW92ZT4ke3RyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uREVMRVRFfTwvYT5cbiAgICAgICAgICA8YSBjbGFzcz1cImR6LW1ldGFkYXRhXCIgdGl0bGU9XCIke3RyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uTUVUQURBVEF9XCIgaHJlZj1cIiNcIiB0YXJnZXQ9XCJfYmxhbmtcIiBkYXRhLWR6LW1ldGFkYXRhPiR7dHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5NRVRBREFUQX08L2E+XG4gICAgICAgICAgPGEgY2xhc3M9XCJkei12aWV3XCIgdGl0bGU9XCIke3RyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uVklFV31cIiBocmVmPVwiI1wiIHRhcmdldD1cIl9ibGFua1wiIGRhdGEtZHotdmlldz4ke3RyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uVklFV308L2E+XG4gICAgICAgIDwvZGl2PmAudHJpbSgpXG59O1xuXG4vLyBnbG9iYWwuRVhJRiA9IEVYSUY7XG5cbmNvbnN0IEFDQ0VQVF9GVU5DID0gZnVuY3Rpb24oZmlsZSwgZG9uZSwgc2V0dGluZ3MpIHtcbiAgICBjb25zdCByZXNvbHV0aW9uID0gc2V0dGluZ3MucmVzb2x1dGlvbjtcbiAgICBpZiAoIXJlc29sdXRpb24pIHJldHVybiBkb25lKCk7XG5cbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgIGxldCBlcnJvciA9ICcnO1xuICAgIGNvbnN0IGhhc01pbiA9IChyZXNvbHV0aW9uLm1pbiAmJiAocmVzb2x1dGlvbi5taW4ud2lkdGggfHwgcmVzb2x1dGlvbi5taW4uaGVpZ2h0KSk7XG4gICAgY29uc3QgaGFzTWF4ID0gKHJlc29sdXRpb24ubWF4ICYmIChyZXNvbHV0aW9uLm1heC53aWR0aCB8fCByZXNvbHV0aW9uLm1heC5oZWlnaHQpKTtcbiAgICBpZiAoaGFzTWluIHx8ICghKHNldHRpbmdzLnJlc2l6ZVdpZHRoIHx8IHNldHRpbmdzLnJlc2l6ZUhlaWdodCkgJiYgaGFzTWF4KSkge1xuICAgICAgICByZWFkZXIub25sb2FkID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGltYWdlID0gbmV3IEltYWdlKCk7XG4gICAgICAgICAgICBpbWFnZS5zcmMgPSBldmVudC50YXJnZXQucmVzdWx0O1xuICAgICAgICAgICAgaW1hZ2Uub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGRvbmUodHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5GSUxFX0VSUk9SX1VQTE9BRCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaW1hZ2Uub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc29sdXRpb24ubWluKSB7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHJlc29sdXRpb24ubWluKS5mb3JFYWNoKChhdHRyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x1dGlvbi5taW5bYXR0cl0gJiYgdGhpc1thdHRyXSA8IHJlc29sdXRpb24ubWluW2F0dHJdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgKz0gdHJhbnNsYXRpb25zLlBMVUdJTl9GT1JNLlJFU09MVVRJT05fTUlOLnJlcGxhY2UoL3t7YXR0cn19L2csIGF0dHIpLnJlcGxhY2UoL3t7bWlufX0vZywgcmVzb2x1dGlvbi5taW5bYXR0cl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIShzZXR0aW5ncy5yZXNpemVXaWR0aCB8fCBzZXR0aW5ncy5yZXNpemVIZWlnaHQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHV0aW9uLm1heCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXMocmVzb2x1dGlvbi5tYXgpLmZvckVhY2goKGF0dHIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x1dGlvbi5tYXhbYXR0cl0gJiYgdGhpc1thdHRyXSA+IHJlc29sdXRpb24ubWF4W2F0dHJdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yICs9IHRyYW5zbGF0aW9ucy5QTFVHSU5fRk9STS5SRVNPTFVUSU9OX01BWC5yZXBsYWNlKC97e2F0dHJ9fS9nLCBhdHRyKS5yZXBsYWNlKC97e21heH19L2csIHJlc29sdXRpb24ubWF4W2F0dHJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwoaW1hZ2Uuc3JjKTsgLy8gcmVsZWFzZSBtZW1vcnlcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IgPyBkb25lKGVycm9yKSA6IGRvbmUoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH07XG5cbiAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGVycm9yID8gZG9uZShlcnJvcikgOiBkb25lKCk7XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmlsZXNGaWVsZCB7XG4gICAgY29uc3RydWN0b3IoeyBjb250YWluZXIgPSAnLmRyb3B6b25lLmZpbGVzLXVwbG9hZCcsIG9wdGlvbnMgPSB7fSB9ID0ge30pIHtcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSAkKGNvbnRhaW5lcik7XG4gICAgICAgIGlmICghdGhpcy5jb250YWluZXIubGVuZ3RoKSB7IHJldHVybjsgfVxuXG4gICAgICAgIHRoaXMudXJscyA9IHt9O1xuICAgICAgICB0aGlzLmN1c3RvbVBvc3QgPSB0aGlzLmNvbnRhaW5lci5kYXRhKCdmaWxlUG9zdEFkZCcpIHx8IHt9O1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBEaWN0aW9uYXJ5LCBEcm9wem9uZU1lZGlhQ29uZmlnLCB7XG4gICAgICAgICAgICBrbGFzczogdGhpcyxcbiAgICAgICAgICAgIHVybDogdGhpcy5jb250YWluZXIuZGF0YSgnZmlsZS11cmwtYWRkJykgfHwgY29uZmlnLmN1cnJlbnRfdXJsLFxuICAgICAgICAgICAgYWNjZXB0ZWRGaWxlczogdGhpcy5jb250YWluZXIuZGF0YSgnbWVkaWEtdHlwZXMnKSxcbiAgICAgICAgICAgIGluaXQ6IHRoaXMuaW5pdERyb3B6b25lXG4gICAgICAgIH0sIHRoaXMuY29udGFpbmVyLmRhdGEoJ2Ryb3B6b25lLW9wdGlvbnMnKSwgb3B0aW9ucyk7XG5cbiAgICAgICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRpb25zLCB7XG4gICAgICAgICAgICBhY2NlcHQ6IGZ1bmN0aW9uKGZpbGUsIGRvbmUpIHsgQUNDRVBUX0ZVTkMoZmlsZSwgZG9uZSwgdGhpcy5vcHRpb25zKTsgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmRyb3B6b25lID0gbmV3IERyb3B6b25lKGNvbnRhaW5lciwgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgdGhpcy5kcm9wem9uZS5vbignY29tcGxldGUnLCB0aGlzLm9uRHJvcHpvbmVDb21wbGV0ZS5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy5kcm9wem9uZS5vbignc3VjY2VzcycsIHRoaXMub25Ecm9wem9uZVN1Y2Nlc3MuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuZHJvcHpvbmUub24oJ3JlbW92ZWRmaWxlJywgdGhpcy5vbkRyb3B6b25lUmVtb3ZlZEZpbGUuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuZHJvcHpvbmUub24oJ3NlbmRpbmcnLCB0aGlzLm9uRHJvcHpvbmVTZW5kaW5nLmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLmRyb3B6b25lLm9uKCdlcnJvcicsIHRoaXMub25Ecm9wem9uZUVycm9yLmJpbmQodGhpcykpO1xuXG4gICAgICAgIHRoaXMuY29udGFpbmVyLm9uKCdtb3VzZWVudGVyJywgJ1tkYXRhLWR6LXZpZXddJywgKGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gSlNPTi5wYXJzZSh0aGlzLmNvbnRhaW5lci5maW5kKCdbbmFtZV1bdHlwZT1cImhpZGRlblwiXScpLnZhbCgpIHx8ICd7fScpO1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gJChlLmN1cnJlbnRUYXJnZXQpO1xuICAgICAgICAgICAgY29uc3QgZmlsZSA9IHRhcmdldC5wYXJlbnQoJy5kei1wcmV2aWV3JykuZmluZCgnLmR6LWZpbGVuYW1lJyk7XG4gICAgICAgICAgICBjb25zdCBmaWxlbmFtZSA9IGVuY29kZVVSSShmaWxlLnRleHQoKSk7XG5cbiAgICAgICAgICAgIGNvbnN0IFVSTCA9IE9iamVjdC5rZXlzKHZhbHVlKS5maWx0ZXIoKGtleSkgPT4gdmFsdWVba2V5XS5uYW1lID09PSBmaWxlbmFtZSkuc2hpZnQoKTtcbiAgICAgICAgICAgIHRhcmdldC5hdHRyKCdocmVmJywgYCR7Y29uZmlnLmJhc2VfdXJsX3NpbXBsZX0vJHtVUkx9YCk7XG4gICAgICAgIH0pO1xuXG4gICAgfVxuXG4gICAgaW5pdERyb3B6b25lKCkge1xuICAgICAgICBsZXQgZmlsZXMgPSB0aGlzLm9wdGlvbnMua2xhc3MuY29udGFpbmVyLmZpbmQoJ1tkYXRhLWZpbGVdJyk7XG4gICAgICAgIGxldCBkcm9wem9uZSA9IHRoaXM7XG4gICAgICAgIGlmICghZmlsZXMubGVuZ3RoKSB7IHJldHVybjsgfVxuXG4gICAgICAgIGZpbGVzLmVhY2goKGluZGV4LCBmaWxlKSA9PiB7XG4gICAgICAgICAgICBmaWxlID0gJChmaWxlKTtcbiAgICAgICAgICAgIGxldCBkYXRhID0gZmlsZS5kYXRhKCdmaWxlJyk7XG4gICAgICAgICAgICBsZXQgbW9jayA9IHtcbiAgICAgICAgICAgICAgICBuYW1lOiBkYXRhLm5hbWUsXG4gICAgICAgICAgICAgICAgc2l6ZTogZGF0YS5zaXplLFxuICAgICAgICAgICAgICAgIHR5cGU6IGRhdGEudHlwZSxcbiAgICAgICAgICAgICAgICBzdGF0dXM6IERyb3B6b25lLkFEREVELFxuICAgICAgICAgICAgICAgIGFjY2VwdGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHVybDogdGhpcy5vcHRpb25zLnVybCxcbiAgICAgICAgICAgICAgICByZW1vdmVVcmw6IGRhdGEucmVtb3ZlXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBkcm9wem9uZS5maWxlcy5wdXNoKG1vY2spO1xuICAgICAgICAgICAgZHJvcHpvbmUub3B0aW9ucy5hZGRlZGZpbGUuY2FsbChkcm9wem9uZSwgbW9jayk7XG4gICAgICAgICAgICBpZiAobW9jay50eXBlLm1hdGNoKC9eaW1hZ2VcXC8vKSkge1xuICAgICAgICAgICAgICAgIGRyb3B6b25lLm9wdGlvbnMudGh1bWJuYWlsLmNhbGwoZHJvcHpvbmUsIG1vY2ssIGRhdGEucGF0aCk7XG4gICAgICAgICAgICAgICAgZHJvcHpvbmUuY3JlYXRlVGh1bWJuYWlsRnJvbVVybChtb2NrLCBkYXRhLnBhdGgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmaWxlLnJlbW92ZSgpO1xuICAgICAgICB9KTtcblxuICAgIH1cblxuICAgIGdldFVSSSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyLmRhdGEoJ21lZGlhVXJpJykgfHwgJyc7XG4gICAgfVxuXG4gICAgb25Ecm9wem9uZVNlbmRpbmcoZmlsZSwgeGhyLCBmb3JtRGF0YSkge1xuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5jdXN0b21Qb3N0KS5sZW5ndGgpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHRoaXMuY3VzdG9tUG9zdCkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgdGhpcy5jdXN0b21Qb3N0W2tleV0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ25hbWUnLCB0aGlzLm9wdGlvbnMuZG90Tm90YXRpb24pO1xuICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKCd0YXNrJywgJ2ZpbGVzdXBsb2FkJyk7XG4gICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ3VyaScsIHRoaXMuZ2V0VVJJKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdhZG1pbi1ub25jZScsIGNvbmZpZy5hZG1pbl9ub25jZSk7XG4gICAgfVxuXG4gICAgb25Ecm9wem9uZVN1Y2Nlc3MoZmlsZSwgcmVzcG9uc2UsIHhocikge1xuICAgICAgICByZXNwb25zZSA9IHR5cGVvZiByZXNwb25zZSA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKHJlc3BvbnNlKSA6IHJlc3BvbnNlO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlbG9hZFBhZ2UpIHtcbiAgICAgICAgICAgIGdsb2JhbC5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHN0b3JlIHBhcmFtcyBmb3IgcmVtb3ZpbmcgZmlsZSBmcm9tIHNlc3Npb24gYmVmb3JlIGl0IGdldHMgc2F2ZWRcbiAgICAgICAgaWYgKHJlc3BvbnNlLnNlc3Npb24pIHtcbiAgICAgICAgICAgIGZpbGUuc2Vzc2lvblBhcmFtcyA9IHJlc3BvbnNlLnNlc3Npb247XG4gICAgICAgICAgICBmaWxlLnJlbW92ZVVybCA9IHRoaXMub3B0aW9ucy51cmw7XG5cbiAgICAgICAgICAgIC8vIFRvdWNoIGZpZWxkIHZhbHVlIHRvIGZvcmNlIGEgbXV0YXRpb24gZGV0ZWN0aW9uXG4gICAgICAgICAgICBjb25zdCBpbnB1dCA9IHRoaXMuY29udGFpbmVyLmZpbmQoJ1tuYW1lXVt0eXBlPVwiaGlkZGVuXCJdJyk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGlucHV0LnZhbCgpO1xuICAgICAgICAgICAgaW5wdXQudmFsKHZhbHVlICsgJyAnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZUVycm9yKHtcbiAgICAgICAgICAgIGZpbGUsXG4gICAgICAgICAgICBkYXRhOiByZXNwb25zZSxcbiAgICAgICAgICAgIG1vZGU6ICdyZW1vdmVGaWxlJyxcbiAgICAgICAgICAgIG1zZzogYDxwPiR7dHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5GSUxFX0VSUk9SX1VQTE9BRH0gPHN0cm9uZz4ke2ZpbGUubmFtZX08L3N0cm9uZz48L3A+XG4gICAgICAgICAgICA8cHJlPiR7cmVzcG9uc2UubWVzc2FnZX08L3ByZT5gXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uRHJvcHpvbmVDb21wbGV0ZShmaWxlKSB7XG4gICAgICAgIGlmICghZmlsZS5hY2NlcHRlZCAmJiAhZmlsZS5yZWplY3RlZCkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB7XG4gICAgICAgICAgICAgICAgc3RhdHVzOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGAke3RyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uRklMRV9VTlNVUFBPUlRFRH06ICR7ZmlsZS5uYW1lLm1hdGNoKC9cXC4uKy8pLmpvaW4oJycpfWBcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZUVycm9yKHtcbiAgICAgICAgICAgICAgICBmaWxlLFxuICAgICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgICAgbW9kZTogJ3JlbW92ZUZpbGUnLFxuICAgICAgICAgICAgICAgIG1zZzogYDxwPiR7dHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5GSUxFX0VSUk9SX0FERH0gPHN0cm9uZz4ke2ZpbGUubmFtZX08L3N0cm9uZz48L3A+XG4gICAgICAgICAgICAgICAgPHByZT4ke2RhdGEubWVzc2FnZX08L3ByZT5gXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVsb2FkUGFnZSkge1xuICAgICAgICAgICAgZ2xvYmFsLmxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYjY0X3RvX3V0Zjgoc3RyKSB7XG4gICAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKC9cXHMvZywgJycpO1xuICAgICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZSh3aW5kb3cuYXRvYihzdHIpKSk7XG4gICAgfVxuXG4gICAgb25Ecm9wem9uZVJlbW92ZWRGaWxlKGZpbGUsIC4uLmV4dHJhKSB7XG4gICAgICAgIGlmICghZmlsZS5hY2NlcHRlZCB8fCBmaWxlLnJlamVjdGVkKSB7IHJldHVybjsgfVxuICAgICAgICBsZXQgdXJsID0gZmlsZS5yZW1vdmVVcmwgfHwgdGhpcy51cmxzLmRlbGV0ZSB8fCB0aGlzLm9wdGlvbnMudXJsO1xuICAgICAgICBsZXQgcGF0aCA9ICh1cmwgfHwgJycpLm1hdGNoKC9wYXRoOiguKilcXC8vKTtcbiAgICAgICAgbGV0IGJvZHkgPSB7IGZpbGVuYW1lOiBmaWxlLm5hbWUsIHVyaTogdGhpcy5nZXRVUkkoKSB9O1xuXG4gICAgICAgIGlmIChmaWxlLnNlc3Npb25QYXJhbXMpIHtcbiAgICAgICAgICAgIGJvZHkudGFzayA9ICdmaWxlc3Nlc3Npb25yZW1vdmUnO1xuICAgICAgICAgICAgYm9keS5zZXNzaW9uID0gZmlsZS5zZXNzaW9uUGFyYW1zO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3VzdG9tUG9zdCA9IHRoaXMuY29udGFpbmVyLmRhdGEoJ2ZpbGVQb3N0UmVtb3ZlJykgfHwge307XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhjdXN0b21Qb3N0KS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGJvZHkgPSB7fTtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGN1c3RvbVBvc3QpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgICAgIGJvZHlba2V5XSA9IGN1c3RvbVBvc3Rba2V5XTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgYm9keVsnZmlsZW5hbWUnXSA9IGZpbGUubmFtZTtcbiAgICAgICAgYm9keVsnYWRtaW4tbm9uY2UnXSA9IGNvbmZpZy5hZG1pbl9ub25jZTtcblxuICAgICAgICByZXF1ZXN0KHVybCwgeyBtZXRob2Q6ICdwb3N0JywgYm9keSB9LCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXBhdGgpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgICAgIHBhdGggPSB0aGlzLmI2NF90b191dGY4KHBhdGhbMV0pO1xuICAgICAgICAgICAgbGV0IGlucHV0ID0gdGhpcy5jb250YWluZXIuZmluZCgnW25hbWVdW3R5cGU9XCJoaWRkZW5cIl0nKTtcbiAgICAgICAgICAgIGxldCBkYXRhID0gSlNPTi5wYXJzZShpbnB1dC52YWwoKSB8fCAne30nKTtcbiAgICAgICAgICAgIGRlbGV0ZSBkYXRhW3BhdGhdO1xuICAgICAgICAgICAgaW5wdXQudmFsKEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25Ecm9wem9uZUVycm9yKGZpbGUsIHJlc3BvbnNlLCB4aHIpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB4aHIgPyByZXNwb25zZS5lcnJvci5tZXNzYWdlIDogcmVzcG9uc2U7XG4gICAgICAgICQoZmlsZS5wcmV2aWV3RWxlbWVudCkuZmluZCgnW2RhdGEtZHotZXJyb3JtZXNzYWdlXScpLmh0bWwobWVzc2FnZSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlRXJyb3Ioe1xuICAgICAgICAgICAgZmlsZSxcbiAgICAgICAgICAgIGRhdGE6IHsgc3RhdHVzOiAnZXJyb3InIH0sXG4gICAgICAgICAgICBtc2c6IGA8cHJlPiR7bWVzc2FnZX08L3ByZT5gXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGhhbmRsZUVycm9yKG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IHsgZmlsZSwgZGF0YSwgbW9kZSwgbXNnIH0gPSBvcHRpb25zO1xuICAgICAgICBpZiAoZGF0YS5zdGF0dXMgIT09ICdlcnJvcicgJiYgZGF0YS5zdGF0dXMgIT09ICd1bmF1dGhvcml6ZWQnKSB7IHJldHVybjsgfVxuXG4gICAgICAgIHN3aXRjaCAobW9kZSkge1xuICAgICAgICAgICAgY2FzZSAnYWRkQmFjayc6XG4gICAgICAgICAgICAgICAgaWYgKGZpbGUgaW5zdGFuY2VvZiBGaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJvcHpvbmUuYWRkRmlsZS5jYWxsKHRoaXMuZHJvcHpvbmUsIGZpbGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJvcHpvbmUuZmlsZXMucHVzaChmaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcm9wem9uZS5vcHRpb25zLmFkZGVkZmlsZS5jYWxsKHRoaXMuZHJvcHpvbmUsIGZpbGUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyb3B6b25lLm9wdGlvbnMudGh1bWJuYWlsLmNhbGwodGhpcy5kcm9wem9uZSwgZmlsZSwgZmlsZS5leHRyYXMudXJsKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3JlbW92ZUZpbGUnOlxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBpZiAofnRoaXMuZHJvcHpvbmUuZmlsZXMuaW5kZXhPZihmaWxlKSkge1xuICAgICAgICAgICAgICAgICAgICBmaWxlLnJlamVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcm9wem9uZS5yZW1vdmVGaWxlLmNhbGwodGhpcy5kcm9wem9uZSwgZmlsZSwgeyBzaWxlbnQ6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbW9kYWwgPSAkKCdbZGF0YS1yZW1vZGFsLWlkPVwiZ2VuZXJpY1wiXScpO1xuICAgICAgICBtb2RhbC5maW5kKCcuZXJyb3ItY29udGVudCcpLmh0bWwobXNnKTtcbiAgICAgICAgJC5yZW1vZGFsLmxvb2t1cFttb2RhbC5kYXRhKCdyZW1vZGFsJyldLm9wZW4oKTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBVcmlUb01hcmtkb3duKHVyaSkge1xuICAgIHVyaSA9IHVyaS5yZXBsYWNlKC9AM3h8QDJ4fEAxeC8sICcnKTtcbiAgICB1cmkgPSB1cmkucmVwbGFjZSgvXFwoL2csICclMjgnKTtcbiAgICB1cmkgPSB1cmkucmVwbGFjZSgvXFwpL2csICclMjknKTtcblxuICAgIGNvbnN0IHRpdGxlID0gdXJpLnNwbGl0KCcuJykuc2xpY2UoMCwgLTEpLmpvaW4oJy4nKTtcblxuICAgIHJldHVybiB1cmkubWF0Y2goL1xcLihqcGU/Z3xwbmd8Z2lmfHN2Z3xtcDR8d2VibXxvZ3Z8bW92KSQvaSkgPyBgIVske3RpdGxlfV0oJHt1cml9IFwiJHt0aXRsZX1cIilgIDogYFske2RlY29kZVVSSSh1cmkpfV0oJHt1cml9KWA7XG59XG5cbmxldCBpbnN0YW5jZXMgPSBbXTtcbmxldCBjYWNoZSA9ICQoKTtcbmNvbnN0IG9uQWRkZWROb2RlcyA9IChldmVudCwgdGFyZ2V0LyogLCByZWNvcmQsIGluc3RhbmNlICovKSA9PiB7XG4gICAgbGV0IGZpbGVzID0gJCh0YXJnZXQpLmZpbmQoJy5kcm9wem9uZS5maWxlcy11cGxvYWQnKTtcbiAgICBpZiAoIWZpbGVzLmxlbmd0aCkgeyByZXR1cm47IH1cblxuICAgIGZpbGVzLmVhY2goKGluZGV4LCBmaWxlKSA9PiB7XG4gICAgICAgIGZpbGUgPSAkKGZpbGUpO1xuICAgICAgICBpZiAoIX5jYWNoZS5pbmRleChmaWxlKSkge1xuICAgICAgICAgICAgYWRkTm9kZShmaWxlKTtcbiAgICAgICAgfVxuICAgIH0pO1xufTtcblxuY29uc3QgYWRkTm9kZSA9IChjb250YWluZXIpID0+IHtcbiAgICBjb250YWluZXIgPSAkKGNvbnRhaW5lcik7XG4gICAgbGV0IGlucHV0ID0gY29udGFpbmVyLmZpbmQoJ2lucHV0W3R5cGU9XCJmaWxlXCJdJyk7XG4gICAgbGV0IHNldHRpbmdzID0gY29udGFpbmVyLmRhdGEoJ2dyYXYtZmlsZS1zZXR0aW5ncycpIHx8IHt9O1xuXG4gICAgaWYgKHNldHRpbmdzLmFjY2VwdCAmJiB+c2V0dGluZ3MuYWNjZXB0LmluZGV4T2YoJyonKSkge1xuICAgICAgICBzZXR0aW5ncy5hY2NlcHQgPSBbJyddO1xuICAgIH1cblxuICAgIGxldCBvcHRpb25zID0ge1xuICAgICAgICB1cmw6IGNvbnRhaW5lci5kYXRhKCdmaWxlLXVybC1hZGQnKSB8fCAoY29udGFpbmVyLmNsb3Nlc3QoJ2Zvcm0nKS5hdHRyKCdhY3Rpb24nKSB8fCBjb25maWcuY3VycmVudF91cmwpICsgJy5qc29uJyxcbiAgICAgICAgcGFyYW1OYW1lOiBzZXR0aW5ncy5wYXJhbU5hbWUgfHwgJ2ZpbGUnLFxuICAgICAgICBkb3ROb3RhdGlvbjogc2V0dGluZ3MubmFtZSB8fCAnZmlsZScsXG4gICAgICAgIGFjY2VwdGVkRmlsZXM6IHNldHRpbmdzLmFjY2VwdCA/IHNldHRpbmdzLmFjY2VwdC5qb2luKCcsJykgOiBpbnB1dC5hdHRyKCdhY2NlcHQnKSB8fCBjb250YWluZXIuZGF0YSgnbWVkaWEtdHlwZXMnKSxcbiAgICAgICAgbWF4RmlsZXNpemU6IHR5cGVvZiBzZXR0aW5ncy5maWxlc2l6ZSAhPT0gJ3VuZGVmaW5lZCcgPyBzZXR0aW5ncy5maWxlc2l6ZSA6IDI1NixcbiAgICAgICAgbWF4RmlsZXM6IHNldHRpbmdzLmxpbWl0IHx8IG51bGwsXG4gICAgICAgIHJlc2l6ZVdpZHRoOiBzZXR0aW5ncy5yZXNpemVXaWR0aCB8fCBudWxsLFxuICAgICAgICByZXNpemVIZWlnaHQ6IHNldHRpbmdzLnJlc2l6ZUhlaWdodCB8fCBudWxsLFxuICAgICAgICByZXNpemVRdWFsaXR5OiBzZXR0aW5ncy5yZXNpemVRdWFsaXR5IHx8IG51bGwsXG4gICAgICAgIHJlc29sdXRpb246IHNldHRpbmdzLnJlc29sdXRpb24gfHwgbnVsbCxcbiAgICAgICAgYWNjZXB0OiBmdW5jdGlvbihmaWxlLCBkb25lKSB7IEFDQ0VQVF9GVU5DKGZpbGUsIGRvbmUsIHNldHRpbmdzKTsgfVxuICAgIH07XG5cbiAgICBjYWNoZSA9IGNhY2hlLmFkZChjb250YWluZXIpO1xuICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lclswXTtcbiAgICBpbnN0YW5jZXMucHVzaChuZXcgRmlsZXNGaWVsZCh7IGNvbnRhaW5lciwgb3B0aW9ucyB9KSk7XG59O1xuXG5leHBvcnQgbGV0IEluc3RhbmNlID0gKCgpID0+IHtcbiAgICAkKCcuZHJvcHpvbmUuZmlsZXMtdXBsb2FkJykuZWFjaCgoaSwgY29udGFpbmVyKSA9PiBhZGROb2RlKGNvbnRhaW5lcikpO1xuICAgICQoJ2JvZHknKS5vbignbXV0YXRpb24uX2dyYXYnLCBvbkFkZGVkTm9kZXMpO1xuXG4gICAgcmV0dXJuIGluc3RhbmNlcztcbn0pKCk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./app/forms/fields/files.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ FilesField),\n/* harmony export */ \"UriToMarkdown\": () => (/* binding */ UriToMarkdown),\n/* harmony export */ \"Instance\": () => (/* binding */ Instance)\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var dropzone__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! dropzone */ \"./node_modules/dropzone/dist/dropzone.js\");\n/* harmony import */ var dropzone__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(dropzone__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _utils_request__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/request */ \"./app/utils/request.js\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! grav-config */ \"grav-config\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(grav_config__WEBPACK_IMPORTED_MODULE_3__);\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n // import EXIF from 'exif-js';\n\n\n // translations\n\nvar Dictionary = {\n dictCancelUpload: grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.DROPZONE_CANCEL_UPLOAD,\n dictCancelUploadConfirmation: grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.DROPZONE_CANCEL_UPLOAD_CONFIRMATION,\n dictDefaultMessage: grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.DROPZONE_DEFAULT_MESSAGE,\n dictFallbackMessage: grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.DROPZONE_FALLBACK_MESSAGE,\n dictFallbackText: grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.DROPZONE_FALLBACK_TEXT,\n dictFileTooBig: grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.DROPZONE_FILE_TOO_BIG,\n dictInvalidFileType: grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.DROPZONE_INVALID_FILE_TYPE,\n dictMaxFilesExceeded: grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.DROPZONE_MAX_FILES_EXCEEDED,\n dictRemoveFile: grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.DROPZONE_REMOVE_FILE,\n dictResponseError: grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.DROPZONE_RESPONSE_ERROR\n};\n(dropzone__WEBPACK_IMPORTED_MODULE_1___default().autoDiscover) = false;\n(dropzone__WEBPACK_IMPORTED_MODULE_1___default().options.gravPageDropzone) = {};\n\n(dropzone__WEBPACK_IMPORTED_MODULE_1___default().confirm) = function (question, accepted, rejected) {\n var doc = jquery__WEBPACK_IMPORTED_MODULE_0___default()(document);\n var modalSelector = '[data-remodal-id=\"delete-media\"]';\n\n var removeEvents = function removeEvents() {\n doc.off('confirmation', modalSelector, accept);\n doc.off('cancellation', modalSelector, reject);\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(modalSelector).find('.remodal-confirm').removeClass('pointer-events-disabled');\n };\n\n var accept = function accept() {\n accepted && accepted();\n removeEvents();\n };\n\n var reject = function reject() {\n rejected && rejected();\n removeEvents();\n };\n\n (jquery__WEBPACK_IMPORTED_MODULE_0___default().remodal.lookup)[jquery__WEBPACK_IMPORTED_MODULE_0___default()(modalSelector).data('remodal')].open();\n doc.on('confirmation', modalSelector, accept);\n doc.on('cancellation', modalSelector, reject);\n};\n\nvar DropzoneMediaConfig = {\n timeout: 0,\n thumbnailWidth: 200,\n thumbnailHeight: 150,\n addRemoveLinks: false,\n dictDefaultMessage: grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.DROP_FILES_HERE_TO_UPLOAD.replace(/</g, '<').replace(/>/g, '>'),\n dictRemoveFileConfirmation: '[placeholder]',\n previewTemplate: \"\\n \").trim()\n}; // global.EXIF = EXIF;\n\nvar ACCEPT_FUNC = function ACCEPT_FUNC(file, done, settings) {\n var resolution = settings.resolution;\n if (!resolution) return done();\n var reader = new FileReader();\n var error = '';\n var hasMin = resolution.min && (resolution.min.width || resolution.min.height);\n var hasMax = resolution.max && (resolution.max.width || resolution.max.height);\n\n if (hasMin || !(settings.resizeWidth || settings.resizeHeight) && hasMax) {\n reader.onload = function (event) {\n var image = new Image();\n image.src = event.target.result;\n\n image.onerror = function () {\n done(grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.FILE_ERROR_UPLOAD);\n };\n\n image.onload = function () {\n var _this = this;\n\n if (resolution.min) {\n Object.keys(resolution.min).forEach(function (attr) {\n if (resolution.min[attr] && _this[attr] < resolution.min[attr]) {\n error += grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_FORM.RESOLUTION_MIN.replace(/{{attr}}/g, attr).replace(/{{min}}/g, resolution.min[attr]);\n }\n });\n }\n\n if (!(settings.resizeWidth || settings.resizeHeight)) {\n if (resolution.max) {\n Object.keys(resolution.max).forEach(function (attr) {\n if (resolution.max[attr] && _this[attr] > resolution.max[attr]) {\n error += grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_FORM.RESOLUTION_MAX.replace(/{{attr}}/g, attr).replace(/{{max}}/g, resolution.max[attr]);\n }\n });\n }\n }\n\n URL.revokeObjectURL(image.src); // release memory\n\n return error ? done(error) : done();\n };\n };\n\n reader.readAsDataURL(file);\n } else {\n return error ? done(error) : done();\n }\n};\n\nvar FilesField = /*#__PURE__*/function () {\n function FilesField() {\n var _this2 = this;\n\n var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n _ref$container = _ref.container,\n container = _ref$container === void 0 ? '.dropzone.files-upload' : _ref$container,\n _ref$options = _ref.options,\n options = _ref$options === void 0 ? {} : _ref$options;\n\n _classCallCheck(this, FilesField);\n\n this.container = jquery__WEBPACK_IMPORTED_MODULE_0___default()(container);\n\n if (!this.container.length) {\n return;\n }\n\n this.urls = {};\n this.customPost = this.container.data('filePostAdd') || {};\n this.options = Object.assign({}, Dictionary, DropzoneMediaConfig, {\n klass: this,\n url: this.container.data('file-url-add') || grav_config__WEBPACK_IMPORTED_MODULE_3__.config.current_url,\n acceptedFiles: this.container.data('media-types'),\n init: this.initDropzone\n }, this.container.data('dropzone-options'), options);\n this.options = Object.assign({}, this.options, {\n accept: function accept(file, done) {\n ACCEPT_FUNC(file, done, this.options);\n }\n });\n this.dropzone = new (dropzone__WEBPACK_IMPORTED_MODULE_1___default())(container, this.options);\n this.dropzone.on('complete', this.onDropzoneComplete.bind(this));\n this.dropzone.on('success', this.onDropzoneSuccess.bind(this));\n this.dropzone.on('removedfile', this.onDropzoneRemovedFile.bind(this));\n this.dropzone.on('sending', this.onDropzoneSending.bind(this));\n this.dropzone.on('error', this.onDropzoneError.bind(this));\n this.container.on('mouseenter', '[data-dz-view]', function (e) {\n var value = JSON.parse(_this2.container.find('[name][type=\"hidden\"]').val() || '{}');\n var target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(e.currentTarget);\n var file = target.parent('.dz-preview').find('.dz-filename');\n var filename = encodeURI(file.text());\n var URL = Object.keys(value).filter(function (key) {\n return value[key].name === filename;\n }).shift();\n target.attr('href', \"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_3__.config.base_url_simple, \"/\").concat(URL));\n });\n }\n\n _createClass(FilesField, [{\n key: \"initDropzone\",\n value: function initDropzone() {\n var _this3 = this;\n\n var files = this.options.klass.container.find('[data-file]');\n var dropzone = this;\n\n if (!files.length) {\n return;\n }\n\n files.each(function (index, file) {\n file = jquery__WEBPACK_IMPORTED_MODULE_0___default()(file);\n var data = file.data('file');\n var mock = {\n name: data.name,\n size: data.size,\n type: data.type,\n status: (dropzone__WEBPACK_IMPORTED_MODULE_1___default().ADDED),\n accepted: true,\n url: _this3.options.url,\n removeUrl: data.remove\n };\n dropzone.files.push(mock);\n dropzone.options.addedfile.call(dropzone, mock);\n\n if (mock.type.match(/^image\\//)) {\n dropzone.options.thumbnail.call(dropzone, mock, data.path);\n dropzone.createThumbnailFromUrl(mock, data.path);\n }\n\n file.remove();\n });\n }\n }, {\n key: \"getURI\",\n value: function getURI() {\n return this.container.data('mediaUri') || '';\n }\n }, {\n key: \"onDropzoneSending\",\n value: function onDropzoneSending(file, xhr, formData) {\n var _this4 = this;\n\n if (Object.keys(this.customPost).length) {\n Object.keys(this.customPost).forEach(function (key) {\n formData.append(key, _this4.customPost[key]);\n });\n } else {\n formData.append('name', this.options.dotNotation);\n formData.append('task', 'filesupload');\n formData.append('uri', this.getURI());\n }\n\n formData.append('admin-nonce', grav_config__WEBPACK_IMPORTED_MODULE_3__.config.admin_nonce);\n }\n }, {\n key: \"onDropzoneSuccess\",\n value: function onDropzoneSuccess(file, response, xhr) {\n response = typeof response === 'string' ? JSON.parse(response) : response;\n\n if (this.options.reloadPage) {\n __webpack_require__.g.location.reload();\n } // store params for removing file from session before it gets saved\n\n\n if (response.session) {\n file.sessionParams = response.session;\n file.removeUrl = this.options.url; // Touch field value to force a mutation detection\n\n var input = this.container.find('[name][type=\"hidden\"]');\n var value = input.val();\n input.val(value + ' ');\n }\n\n return this.handleError({\n file: file,\n data: response,\n mode: 'removeFile',\n msg: \"

          \".concat(grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.FILE_ERROR_UPLOAD, \" \").concat(file.name, \"

          \\n
          \").concat(response.message, \"
          \")\n });\n }\n }, {\n key: \"onDropzoneComplete\",\n value: function onDropzoneComplete(file) {\n if (!file.accepted && !file.rejected) {\n var data = {\n status: 'error',\n message: \"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.FILE_UNSUPPORTED, \": \").concat(file.name.match(/\\..+/).join(''))\n };\n return this.handleError({\n file: file,\n data: data,\n mode: 'removeFile',\n msg: \"

          \".concat(grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.FILE_ERROR_ADD, \" \").concat(file.name, \"

          \\n
          \").concat(data.message, \"
          \")\n });\n }\n\n if (this.options.reloadPage) {\n __webpack_require__.g.location.reload();\n }\n }\n }, {\n key: \"b64_to_utf8\",\n value: function b64_to_utf8(str) {\n str = str.replace(/\\s/g, '');\n return decodeURIComponent(escape(window.atob(str)));\n }\n }, {\n key: \"onDropzoneRemovedFile\",\n value: function onDropzoneRemovedFile(file) {\n var _this5 = this;\n\n if (!file.accepted || file.rejected) {\n return;\n }\n\n var url = file.removeUrl || this.urls[\"delete\"] || this.options.url;\n var path = (url || '').match(/path:(.*)\\//);\n var body = {\n filename: file.name,\n uri: this.getURI()\n };\n\n if (file.sessionParams) {\n body.task = 'filessessionremove';\n body.session = file.sessionParams;\n }\n\n var customPost = this.container.data('filePostRemove') || {};\n\n if (Object.keys(customPost).length) {\n body = {};\n Object.keys(customPost).forEach(function (key) {\n body[key] = customPost[key];\n });\n }\n\n body['filename'] = file.name;\n body['admin-nonce'] = grav_config__WEBPACK_IMPORTED_MODULE_3__.config.admin_nonce;\n (0,_utils_request__WEBPACK_IMPORTED_MODULE_2__.default)(url, {\n method: 'post',\n body: body\n }, function () {\n if (!path) {\n return;\n }\n\n path = _this5.b64_to_utf8(path[1]);\n\n var input = _this5.container.find('[name][type=\"hidden\"]');\n\n var data = JSON.parse(input.val() || '{}');\n delete data[path];\n input.val(JSON.stringify(data));\n });\n }\n }, {\n key: \"onDropzoneError\",\n value: function onDropzoneError(file, response, xhr) {\n var message = xhr ? response.error.message : response;\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(file.previewElement).find('[data-dz-errormessage]').html(message);\n return this.handleError({\n file: file,\n data: {\n status: 'error'\n },\n msg: \"
          \".concat(message, \"
          \")\n });\n }\n }, {\n key: \"handleError\",\n value: function handleError(options) {\n var file = options.file,\n data = options.data,\n mode = options.mode,\n msg = options.msg;\n\n if (data.status !== 'error' && data.status !== 'unauthorized') {\n return;\n }\n\n switch (mode) {\n case 'addBack':\n if (file instanceof File) {\n this.dropzone.addFile.call(this.dropzone, file);\n } else {\n this.dropzone.files.push(file);\n this.dropzone.options.addedfile.call(this.dropzone, file);\n this.dropzone.options.thumbnail.call(this.dropzone, file, file.extras.url);\n }\n\n break;\n\n case 'removeFile':\n default:\n if (~this.dropzone.files.indexOf(file)) {\n file.rejected = true;\n this.dropzone.removeFile.call(this.dropzone, file, {\n silent: true\n });\n }\n\n break;\n }\n\n var modal = jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-remodal-id=\"generic\"]');\n modal.find('.error-content').html(msg);\n (jquery__WEBPACK_IMPORTED_MODULE_0___default().remodal.lookup)[modal.data('remodal')].open();\n }\n }]);\n\n return FilesField;\n}();\n\n\nfunction UriToMarkdown(uri) {\n uri = uri.replace(/@3x|@2x|@1x/, '');\n uri = uri.replace(/\\(/g, '%28');\n uri = uri.replace(/\\)/g, '%29');\n var title = uri.split('.').slice(0, -1).join('.');\n return uri.match(/\\.(jpe?g|png|gif|svg|mp4|webm|ogv|mov)$/i) ? \"![\".concat(title, \"](\").concat(uri, \" \\\"\").concat(title, \"\\\")\") : \"[\".concat(decodeURI(uri), \"](\").concat(uri, \")\");\n}\nvar instances = [];\nvar cache = jquery__WEBPACK_IMPORTED_MODULE_0___default()();\n\nvar onAddedNodes = function onAddedNodes(event, target\n/* , record, instance */\n) {\n var files = jquery__WEBPACK_IMPORTED_MODULE_0___default()(target).find('.dropzone.files-upload');\n\n if (!files.length) {\n return;\n }\n\n files.each(function (index, file) {\n file = jquery__WEBPACK_IMPORTED_MODULE_0___default()(file);\n\n if (!~cache.index(file)) {\n addNode(file);\n }\n });\n};\n\nvar addNode = function addNode(container) {\n container = jquery__WEBPACK_IMPORTED_MODULE_0___default()(container);\n var input = container.find('input[type=\"file\"]');\n var settings = container.data('grav-file-settings') || {};\n\n if (settings.accept && ~settings.accept.indexOf('*')) {\n settings.accept = [''];\n }\n\n var options = {\n url: container.data('file-url-add') || (container.closest('form').attr('action') || grav_config__WEBPACK_IMPORTED_MODULE_3__.config.current_url) + '.json',\n paramName: settings.paramName || 'file',\n dotNotation: settings.name || 'file',\n acceptedFiles: settings.accept ? settings.accept.join(',') : input.attr('accept') || container.data('media-types'),\n maxFilesize: typeof settings.filesize !== 'undefined' ? settings.filesize : 256,\n maxFiles: settings.limit || null,\n resizeWidth: settings.resizeWidth || null,\n resizeHeight: settings.resizeHeight || null,\n resizeQuality: settings.resizeQuality || null,\n resolution: settings.resolution || null,\n accept: function accept(file, done) {\n ACCEPT_FUNC(file, done, settings);\n }\n };\n cache = cache.add(container);\n container = container[0];\n instances.push(new FilesField({\n container: container,\n options: options\n }));\n};\n\nvar Instance = function () {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.dropzone.files-upload').each(function (i, container) {\n return addNode(container);\n });\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('body').on('mutation._grav', onAddedNodes);\n return instances;\n}();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL2Zvcm1zL2ZpZWxkcy9maWxlcy5qcz82MTc5Il0sIm5hbWVzIjpbIkRpY3Rpb25hcnkiLCJkaWN0Q2FuY2VsVXBsb2FkIiwidHJhbnNsYXRpb25zIiwiZGljdENhbmNlbFVwbG9hZENvbmZpcm1hdGlvbiIsImRpY3REZWZhdWx0TWVzc2FnZSIsImRpY3RGYWxsYmFja01lc3NhZ2UiLCJkaWN0RmFsbGJhY2tUZXh0IiwiZGljdEZpbGVUb29CaWciLCJkaWN0SW52YWxpZEZpbGVUeXBlIiwiZGljdE1heEZpbGVzRXhjZWVkZWQiLCJkaWN0UmVtb3ZlRmlsZSIsImRpY3RSZXNwb25zZUVycm9yIiwiRFJPUFpPTkVfUkVTUE9OU0VfRVJST1IiLCJEcm9wem9uZSIsInF1ZXN0aW9uIiwiYWNjZXB0ZWQiLCJyZWplY3RlZCIsImRvYyIsIiQiLCJkb2N1bWVudCIsIm1vZGFsU2VsZWN0b3IiLCJyZW1vdmVFdmVudHMiLCJvZmYiLCJhY2NlcHQiLCJyZWplY3QiLCJmaW5kIiwicmVtb3ZlQ2xhc3MiLCJkYXRhIiwib3BlbiIsIm9uIiwiRHJvcHpvbmVNZWRpYUNvbmZpZyIsInRpbWVvdXQiLCJ0aHVtYm5haWxXaWR0aCIsInRodW1ibmFpbEhlaWdodCIsImFkZFJlbW92ZUxpbmtzIiwicmVwbGFjZSIsImRpY3RSZW1vdmVGaWxlQ29uZmlybWF0aW9uIiwicHJldmlld1RlbXBsYXRlIiwidHJpbSIsIkFDQ0VQVF9GVU5DIiwiZmlsZSIsImRvbmUiLCJzZXR0aW5ncyIsInJlc29sdXRpb24iLCJyZWFkZXIiLCJGaWxlUmVhZGVyIiwiZXJyb3IiLCJoYXNNaW4iLCJtaW4iLCJ3aWR0aCIsImhlaWdodCIsImhhc01heCIsIm1heCIsInJlc2l6ZVdpZHRoIiwicmVzaXplSGVpZ2h0Iiwib25sb2FkIiwiZXZlbnQiLCJpbWFnZSIsIkltYWdlIiwic3JjIiwidGFyZ2V0IiwicmVzdWx0Iiwib25lcnJvciIsIk9iamVjdCIsImtleXMiLCJmb3JFYWNoIiwiYXR0ciIsIlVSTCIsInJldm9rZU9iamVjdFVSTCIsInJlYWRBc0RhdGFVUkwiLCJGaWxlc0ZpZWxkIiwiY29udGFpbmVyIiwib3B0aW9ucyIsImxlbmd0aCIsInVybHMiLCJjdXN0b21Qb3N0IiwiYXNzaWduIiwia2xhc3MiLCJ1cmwiLCJjb25maWciLCJhY2NlcHRlZEZpbGVzIiwiaW5pdCIsImluaXREcm9wem9uZSIsImRyb3B6b25lIiwib25Ecm9wem9uZUNvbXBsZXRlIiwiYmluZCIsIm9uRHJvcHpvbmVTdWNjZXNzIiwib25Ecm9wem9uZVJlbW92ZWRGaWxlIiwib25Ecm9wem9uZVNlbmRpbmciLCJvbkRyb3B6b25lRXJyb3IiLCJlIiwidmFsdWUiLCJKU09OIiwicGFyc2UiLCJ2YWwiLCJjdXJyZW50VGFyZ2V0IiwicGFyZW50IiwiZmlsZW5hbWUiLCJlbmNvZGVVUkkiLCJ0ZXh0IiwiZmlsdGVyIiwia2V5IiwibmFtZSIsInNoaWZ0IiwiZmlsZXMiLCJlYWNoIiwiaW5kZXgiLCJtb2NrIiwic2l6ZSIsInR5cGUiLCJzdGF0dXMiLCJyZW1vdmVVcmwiLCJyZW1vdmUiLCJwdXNoIiwiYWRkZWRmaWxlIiwiY2FsbCIsIm1hdGNoIiwidGh1bWJuYWlsIiwicGF0aCIsImNyZWF0ZVRodW1ibmFpbEZyb21VcmwiLCJ4aHIiLCJmb3JtRGF0YSIsImFwcGVuZCIsImRvdE5vdGF0aW9uIiwiZ2V0VVJJIiwicmVzcG9uc2UiLCJyZWxvYWRQYWdlIiwiZ2xvYmFsIiwibG9jYXRpb24iLCJyZWxvYWQiLCJzZXNzaW9uIiwic2Vzc2lvblBhcmFtcyIsImlucHV0IiwiaGFuZGxlRXJyb3IiLCJtb2RlIiwibXNnIiwibWVzc2FnZSIsImpvaW4iLCJzdHIiLCJkZWNvZGVVUklDb21wb25lbnQiLCJlc2NhcGUiLCJ3aW5kb3ciLCJhdG9iIiwiYm9keSIsInVyaSIsInRhc2siLCJyZXF1ZXN0IiwibWV0aG9kIiwiYjY0X3RvX3V0ZjgiLCJzdHJpbmdpZnkiLCJwcmV2aWV3RWxlbWVudCIsImh0bWwiLCJGaWxlIiwiYWRkRmlsZSIsImV4dHJhcyIsImluZGV4T2YiLCJyZW1vdmVGaWxlIiwic2lsZW50IiwibW9kYWwiLCJVcmlUb01hcmtkb3duIiwidGl0bGUiLCJzcGxpdCIsInNsaWNlIiwiZGVjb2RlVVJJIiwiaW5zdGFuY2VzIiwiY2FjaGUiLCJvbkFkZGVkTm9kZXMiLCJhZGROb2RlIiwiY2xvc2VzdCIsInBhcmFtTmFtZSIsIm1heEZpbGVzaXplIiwiZmlsZXNpemUiLCJtYXhGaWxlcyIsImxpbWl0IiwicmVzaXplUXVhbGl0eSIsImFkZCIsIkluc3RhbmNlIiwiaSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0NBRUE7O0FBQ0E7Q0FHQTs7QUFDQSxJQUFNQSxVQUFVLEdBQUc7QUFDZkMsa0JBQWdCLEVBQUVDLHlGQURIO0FBRWZDLDhCQUE0QixFQUFFRCxzR0FGZjtBQUdmRSxvQkFBa0IsRUFBRUYsMkZBSEw7QUFJZkcscUJBQW1CLEVBQUVILDRGQUpOO0FBS2ZJLGtCQUFnQixFQUFFSix5RkFMSDtBQU1mSyxnQkFBYyxFQUFFTCx3RkFORDtBQU9mTSxxQkFBbUIsRUFBRU4sNkZBUE47QUFRZk8sc0JBQW9CLEVBQUVQLDhGQVJQO0FBU2ZRLGdCQUFjLEVBQUVSLHVGQVREO0FBVWZTLG1CQUFpQixFQUFFVCwwRkFBaURVO0FBVnJELENBQW5CO0FBYUFDLDhEQUFBLEdBQXdCLEtBQXhCO0FBQ0FBLDBFQUFBLEdBQW9DLEVBQXBDOztBQUNBQSx5REFBQSxHQUFtQixVQUFDQyxRQUFELEVBQVdDLFFBQVgsRUFBcUJDLFFBQXJCLEVBQWtDO0FBQ2pELE1BQUlDLEdBQUcsR0FBR0MsNkNBQUMsQ0FBQ0MsUUFBRCxDQUFYO0FBQ0EsTUFBSUMsYUFBYSxHQUFHLGtDQUFwQjs7QUFFQSxNQUFJQyxZQUFZLEdBQUcsU0FBZkEsWUFBZSxHQUFNO0FBQ3JCSixPQUFHLENBQUNLLEdBQUosQ0FBUSxjQUFSLEVBQXdCRixhQUF4QixFQUF1Q0csTUFBdkM7QUFDQU4sT0FBRyxDQUFDSyxH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SCxDQUxxQixFQUFmIiwiZmlsZSI6Ii4vYXBwL2Zvcm1zL2ZpZWxkcy9maWxlcy5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgRHJvcHpvbmUgZnJvbSAnZHJvcHpvbmUnO1xuLy8gaW1wb3J0IEVYSUYgZnJvbSAnZXhpZi1qcyc7XG5pbXBvcnQgcmVxdWVzdCBmcm9tICcuLi8uLi91dGlscy9yZXF1ZXN0JztcbmltcG9ydCB7IGNvbmZpZywgdHJhbnNsYXRpb25zIH0gZnJvbSAnZ3Jhdi1jb25maWcnO1xuXG4vLyB0cmFuc2xhdGlvbnNcbmNvbnN0IERpY3Rpb25hcnkgPSB7XG4gICAgZGljdENhbmNlbFVwbG9hZDogdHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5EUk9QWk9ORV9DQU5DRUxfVVBMT0FELFxuICAgIGRpY3RDYW5jZWxVcGxvYWRDb25maXJtYXRpb246IHRyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uRFJPUFpPTkVfQ0FOQ0VMX1VQTE9BRF9DT05GSVJNQVRJT04sXG4gICAgZGljdERlZmF1bHRNZXNzYWdlOiB0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLkRST1BaT05FX0RFRkFVTFRfTUVTU0FHRSxcbiAgICBkaWN0RmFsbGJhY2tNZXNzYWdlOiB0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLkRST1BaT05FX0ZBTExCQUNLX01FU1NBR0UsXG4gICAgZGljdEZhbGxiYWNrVGV4dDogdHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5EUk9QWk9ORV9GQUxMQkFDS19URVhULFxuICAgIGRpY3RGaWxlVG9vQmlnOiB0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLkRST1BaT05FX0ZJTEVfVE9PX0JJRyxcbiAgICBkaWN0SW52YWxpZEZpbGVUeXBlOiB0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLkRST1BaT05FX0lOVkFMSURfRklMRV9UWVBFLFxuICAgIGRpY3RNYXhGaWxlc0V4Y2VlZGVkOiB0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLkRST1BaT05FX01BWF9GSUxFU19FWENFRURFRCxcbiAgICBkaWN0UmVtb3ZlRmlsZTogdHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5EUk9QWk9ORV9SRU1PVkVfRklMRSxcbiAgICBkaWN0UmVzcG9uc2VFcnJvcjogdHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5EUk9QWk9ORV9SRVNQT05TRV9FUlJPUlxufTtcblxuRHJvcHpvbmUuYXV0b0Rpc2NvdmVyID0gZmFsc2U7XG5Ecm9wem9uZS5vcHRpb25zLmdyYXZQYWdlRHJvcHpvbmUgPSB7fTtcbkRyb3B6b25lLmNvbmZpcm0gPSAocXVlc3Rpb24sIGFjY2VwdGVkLCByZWplY3RlZCkgPT4ge1xuICAgIGxldCBkb2MgPSAkKGRvY3VtZW50KTtcbiAgICBsZXQgbW9kYWxTZWxlY3RvciA9ICdbZGF0YS1yZW1vZGFsLWlkPVwiZGVsZXRlLW1lZGlhXCJdJztcblxuICAgIGxldCByZW1vdmVFdmVudHMgPSAoKSA9PiB7XG4gICAgICAgIGRvYy5vZmYoJ2NvbmZpcm1hdGlvbicsIG1vZGFsU2VsZWN0b3IsIGFjY2VwdCk7XG4gICAgICAgIGRvYy5vZmYoJ2NhbmNlbGxhdGlvbicsIG1vZGFsU2VsZWN0b3IsIHJlamVjdCk7XG5cbiAgICAgICAgJChtb2RhbFNlbGVjdG9yKS5maW5kKCcucmVtb2RhbC1jb25maXJtJykucmVtb3ZlQ2xhc3MoJ3BvaW50ZXItZXZlbnRzLWRpc2FibGVkJyk7XG4gICAgfTtcblxuICAgIGxldCBhY2NlcHQgPSAoKSA9PiB7XG4gICAgICAgIGFjY2VwdGVkICYmIGFjY2VwdGVkKCk7XG4gICAgICAgIHJlbW92ZUV2ZW50cygpO1xuICAgIH07XG5cbiAgICBsZXQgcmVqZWN0ID0gKCkgPT4ge1xuICAgICAgICByZWplY3RlZCAmJiByZWplY3RlZCgpO1xuICAgICAgICByZW1vdmVFdmVudHMoKTtcbiAgICB9O1xuXG4gICAgJC5yZW1vZGFsLmxvb2t1cFskKG1vZGFsU2VsZWN0b3IpLmRhdGEoJ3JlbW9kYWwnKV0ub3BlbigpO1xuICAgIGRvYy5vbignY29uZmlybWF0aW9uJywgbW9kYWxTZWxlY3RvciwgYWNjZXB0KTtcbiAgICBkb2Mub24oJ2NhbmNlbGxhdGlvbicsIG1vZGFsU2VsZWN0b3IsIHJlamVjdCk7XG59O1xuXG5jb25zdCBEcm9wem9uZU1lZGlhQ29uZmlnID0ge1xuICAgIHRpbWVvdXQ6IDAsXG4gICAgdGh1bWJuYWlsV2lkdGg6IDIwMCxcbiAgICB0aHVtYm5haWxIZWlnaHQ6IDE1MCxcbiAgICBhZGRSZW1vdmVMaW5rczogZmFsc2UsXG4gICAgZGljdERlZmF1bHRNZXNzYWdlOiB0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLkRST1BfRklMRVNfSEVSRV9UT19VUExPQUQucmVwbGFjZSgvJmx0Oy9nLCAnPCcpLnJlcGxhY2UoLyZndDsvZywgJz4nKSxcbiAgICBkaWN0UmVtb3ZlRmlsZUNvbmZpcm1hdGlvbjogJ1twbGFjZWhvbGRlcl0nLFxuICAgIHByZXZpZXdUZW1wbGF0ZTogYFxuICAgICAgICA8ZGl2IGNsYXNzPVwiZHotcHJldmlldyBkei1maWxlLXByZXZpZXcgZHotbm8tZWRpdG9yXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImR6LWRldGFpbHNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkei1maWxlbmFtZVwiPjxzcGFuIGRhdGEtZHotbmFtZT48L3NwYW4+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHotc2l6ZVwiIGRhdGEtZHotc2l6ZT48L2Rpdj5cbiAgICAgICAgICAgIDxpbWcgZGF0YS1kei10aHVtYm5haWwgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHotcHJvZ3Jlc3NcIj48c3BhbiBjbGFzcz1cImR6LXVwbG9hZFwiIGRhdGEtZHotdXBsb2FkcHJvZ3Jlc3M+PC9zcGFuPjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkei1zdWNjZXNzLW1hcmtcIj48c3Bhbj7inJQ8L3NwYW4+PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImR6LWVycm9yLW1hcmtcIj48c3Bhbj7inJg8L3NwYW4+PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImR6LWVycm9yLW1lc3NhZ2VcIj48c3BhbiBkYXRhLWR6LWVycm9ybWVzc2FnZT48L3NwYW4+PC9kaXY+XG4gICAgICAgICAgPGEgY2xhc3M9XCJkei11bnNldFwiIHRpdGxlPVwiJHt0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLlVOU0VUfVwiIGhyZWY9XCIjXCIgZGF0YS1kei11bnNldD4ke3RyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uVU5TRVR9PC9hPlxuICAgICAgICAgIDxhIGNsYXNzPVwiZHotcmVtb3ZlXCIgdGl0bGU9XCIke3RyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uREVMRVRFfVwiIGhyZWY9XCJqYXZhc2NyaXB0OnVuZGVmaW5lZDtcIiBkYXRhLWR6LXJlbW92ZT4ke3RyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uREVMRVRFfTwvYT5cbiAgICAgICAgICA8YSBjbGFzcz1cImR6LW1ldGFkYXRhXCIgdGl0bGU9XCIke3RyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uTUVUQURBVEF9XCIgaHJlZj1cIiNcIiB0YXJnZXQ9XCJfYmxhbmtcIiBkYXRhLWR6LW1ldGFkYXRhPiR7dHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5NRVRBREFUQX08L2E+XG4gICAgICAgICAgPGEgY2xhc3M9XCJkei12aWV3XCIgdGl0bGU9XCIke3RyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uVklFV31cIiBocmVmPVwiI1wiIHRhcmdldD1cIl9ibGFua1wiIGRhdGEtZHotdmlldz4ke3RyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uVklFV308L2E+XG4gICAgICAgIDwvZGl2PmAudHJpbSgpXG59O1xuXG4vLyBnbG9iYWwuRVhJRiA9IEVYSUY7XG5cbmNvbnN0IEFDQ0VQVF9GVU5DID0gZnVuY3Rpb24oZmlsZSwgZG9uZSwgc2V0dGluZ3MpIHtcbiAgICBjb25zdCByZXNvbHV0aW9uID0gc2V0dGluZ3MucmVzb2x1dGlvbjtcbiAgICBpZiAoIXJlc29sdXRpb24pIHJldHVybiBkb25lKCk7XG5cbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgIGxldCBlcnJvciA9ICcnO1xuICAgIGNvbnN0IGhhc01pbiA9IChyZXNvbHV0aW9uLm1pbiAmJiAocmVzb2x1dGlvbi5taW4ud2lkdGggfHwgcmVzb2x1dGlvbi5taW4uaGVpZ2h0KSk7XG4gICAgY29uc3QgaGFzTWF4ID0gKHJlc29sdXRpb24ubWF4ICYmIChyZXNvbHV0aW9uLm1heC53aWR0aCB8fCByZXNvbHV0aW9uLm1heC5oZWlnaHQpKTtcbiAgICBpZiAoaGFzTWluIHx8ICghKHNldHRpbmdzLnJlc2l6ZVdpZHRoIHx8IHNldHRpbmdzLnJlc2l6ZUhlaWdodCkgJiYgaGFzTWF4KSkge1xuICAgICAgICByZWFkZXIub25sb2FkID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGltYWdlID0gbmV3IEltYWdlKCk7XG4gICAgICAgICAgICBpbWFnZS5zcmMgPSBldmVudC50YXJnZXQucmVzdWx0O1xuICAgICAgICAgICAgaW1hZ2Uub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGRvbmUodHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5GSUxFX0VSUk9SX1VQTE9BRCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaW1hZ2Uub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc29sdXRpb24ubWluKSB7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHJlc29sdXRpb24ubWluKS5mb3JFYWNoKChhdHRyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x1dGlvbi5taW5bYXR0cl0gJiYgdGhpc1thdHRyXSA8IHJlc29sdXRpb24ubWluW2F0dHJdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgKz0gdHJhbnNsYXRpb25zLlBMVUdJTl9GT1JNLlJFU09MVVRJT05fTUlOLnJlcGxhY2UoL3t7YXR0cn19L2csIGF0dHIpLnJlcGxhY2UoL3t7bWlufX0vZywgcmVzb2x1dGlvbi5taW5bYXR0cl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIShzZXR0aW5ncy5yZXNpemVXaWR0aCB8fCBzZXR0aW5ncy5yZXNpemVIZWlnaHQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHV0aW9uLm1heCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXMocmVzb2x1dGlvbi5tYXgpLmZvckVhY2goKGF0dHIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x1dGlvbi5tYXhbYXR0cl0gJiYgdGhpc1thdHRyXSA+IHJlc29sdXRpb24ubWF4W2F0dHJdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yICs9IHRyYW5zbGF0aW9ucy5QTFVHSU5fRk9STS5SRVNPTFVUSU9OX01BWC5yZXBsYWNlKC97e2F0dHJ9fS9nLCBhdHRyKS5yZXBsYWNlKC97e21heH19L2csIHJlc29sdXRpb24ubWF4W2F0dHJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwoaW1hZ2Uuc3JjKTsgLy8gcmVsZWFzZSBtZW1vcnlcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IgPyBkb25lKGVycm9yKSA6IGRvbmUoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH07XG5cbiAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGVycm9yID8gZG9uZShlcnJvcikgOiBkb25lKCk7XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmlsZXNGaWVsZCB7XG4gICAgY29uc3RydWN0b3IoeyBjb250YWluZXIgPSAnLmRyb3B6b25lLmZpbGVzLXVwbG9hZCcsIG9wdGlvbnMgPSB7fSB9ID0ge30pIHtcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSAkKGNvbnRhaW5lcik7XG4gICAgICAgIGlmICghdGhpcy5jb250YWluZXIubGVuZ3RoKSB7IHJldHVybjsgfVxuXG4gICAgICAgIHRoaXMudXJscyA9IHt9O1xuICAgICAgICB0aGlzLmN1c3RvbVBvc3QgPSB0aGlzLmNvbnRhaW5lci5kYXRhKCdmaWxlUG9zdEFkZCcpIHx8IHt9O1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBEaWN0aW9uYXJ5LCBEcm9wem9uZU1lZGlhQ29uZmlnLCB7XG4gICAgICAgICAgICBrbGFzczogdGhpcyxcbiAgICAgICAgICAgIHVybDogdGhpcy5jb250YWluZXIuZGF0YSgnZmlsZS11cmwtYWRkJykgfHwgY29uZmlnLmN1cnJlbnRfdXJsLFxuICAgICAgICAgICAgYWNjZXB0ZWRGaWxlczogdGhpcy5jb250YWluZXIuZGF0YSgnbWVkaWEtdHlwZXMnKSxcbiAgICAgICAgICAgIGluaXQ6IHRoaXMuaW5pdERyb3B6b25lXG4gICAgICAgIH0sIHRoaXMuY29udGFpbmVyLmRhdGEoJ2Ryb3B6b25lLW9wdGlvbnMnKSwgb3B0aW9ucyk7XG5cbiAgICAgICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRpb25zLCB7XG4gICAgICAgICAgICBhY2NlcHQ6IGZ1bmN0aW9uKGZpbGUsIGRvbmUpIHsgQUNDRVBUX0ZVTkMoZmlsZSwgZG9uZSwgdGhpcy5vcHRpb25zKTsgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmRyb3B6b25lID0gbmV3IERyb3B6b25lKGNvbnRhaW5lciwgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgdGhpcy5kcm9wem9uZS5vbignY29tcGxldGUnLCB0aGlzLm9uRHJvcHpvbmVDb21wbGV0ZS5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy5kcm9wem9uZS5vbignc3VjY2VzcycsIHRoaXMub25Ecm9wem9uZVN1Y2Nlc3MuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuZHJvcHpvbmUub24oJ3JlbW92ZWRmaWxlJywgdGhpcy5vbkRyb3B6b25lUmVtb3ZlZEZpbGUuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuZHJvcHpvbmUub24oJ3NlbmRpbmcnLCB0aGlzLm9uRHJvcHpvbmVTZW5kaW5nLmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLmRyb3B6b25lLm9uKCdlcnJvcicsIHRoaXMub25Ecm9wem9uZUVycm9yLmJpbmQodGhpcykpO1xuXG4gICAgICAgIHRoaXMuY29udGFpbmVyLm9uKCdtb3VzZWVudGVyJywgJ1tkYXRhLWR6LXZpZXddJywgKGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gSlNPTi5wYXJzZSh0aGlzLmNvbnRhaW5lci5maW5kKCdbbmFtZV1bdHlwZT1cImhpZGRlblwiXScpLnZhbCgpIHx8ICd7fScpO1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gJChlLmN1cnJlbnRUYXJnZXQpO1xuICAgICAgICAgICAgY29uc3QgZmlsZSA9IHRhcmdldC5wYXJlbnQoJy5kei1wcmV2aWV3JykuZmluZCgnLmR6LWZpbGVuYW1lJyk7XG4gICAgICAgICAgICBjb25zdCBmaWxlbmFtZSA9IGVuY29kZVVSSShmaWxlLnRleHQoKSk7XG5cbiAgICAgICAgICAgIGNvbnN0IFVSTCA9IE9iamVjdC5rZXlzKHZhbHVlKS5maWx0ZXIoKGtleSkgPT4gdmFsdWVba2V5XS5uYW1lID09PSBmaWxlbmFtZSkuc2hpZnQoKTtcbiAgICAgICAgICAgIHRhcmdldC5hdHRyKCdocmVmJywgYCR7Y29uZmlnLmJhc2VfdXJsX3NpbXBsZX0vJHtVUkx9YCk7XG4gICAgICAgIH0pO1xuXG4gICAgfVxuXG4gICAgaW5pdERyb3B6b25lKCkge1xuICAgICAgICBsZXQgZmlsZXMgPSB0aGlzLm9wdGlvbnMua2xhc3MuY29udGFpbmVyLmZpbmQoJ1tkYXRhLWZpbGVdJyk7XG4gICAgICAgIGxldCBkcm9wem9uZSA9IHRoaXM7XG4gICAgICAgIGlmICghZmlsZXMubGVuZ3RoKSB7IHJldHVybjsgfVxuXG4gICAgICAgIGZpbGVzLmVhY2goKGluZGV4LCBmaWxlKSA9PiB7XG4gICAgICAgICAgICBmaWxlID0gJChmaWxlKTtcbiAgICAgICAgICAgIGxldCBkYXRhID0gZmlsZS5kYXRhKCdmaWxlJyk7XG4gICAgICAgICAgICBsZXQgbW9jayA9IHtcbiAgICAgICAgICAgICAgICBuYW1lOiBkYXRhLm5hbWUsXG4gICAgICAgICAgICAgICAgc2l6ZTogZGF0YS5zaXplLFxuICAgICAgICAgICAgICAgIHR5cGU6IGRhdGEudHlwZSxcbiAgICAgICAgICAgICAgICBzdGF0dXM6IERyb3B6b25lLkFEREVELFxuICAgICAgICAgICAgICAgIGFjY2VwdGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHVybDogdGhpcy5vcHRpb25zLnVybCxcbiAgICAgICAgICAgICAgICByZW1vdmVVcmw6IGRhdGEucmVtb3ZlXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBkcm9wem9uZS5maWxlcy5wdXNoKG1vY2spO1xuICAgICAgICAgICAgZHJvcHpvbmUub3B0aW9ucy5hZGRlZGZpbGUuY2FsbChkcm9wem9uZSwgbW9jayk7XG4gICAgICAgICAgICBpZiAobW9jay50eXBlLm1hdGNoKC9eaW1hZ2VcXC8vKSkge1xuICAgICAgICAgICAgICAgIGRyb3B6b25lLm9wdGlvbnMudGh1bWJuYWlsLmNhbGwoZHJvcHpvbmUsIG1vY2ssIGRhdGEucGF0aCk7XG4gICAgICAgICAgICAgICAgZHJvcHpvbmUuY3JlYXRlVGh1bWJuYWlsRnJvbVVybChtb2NrLCBkYXRhLnBhdGgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmaWxlLnJlbW92ZSgpO1xuICAgICAgICB9KTtcblxuICAgIH1cblxuICAgIGdldFVSSSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyLmRhdGEoJ21lZGlhVXJpJykgfHwgJyc7XG4gICAgfVxuXG4gICAgb25Ecm9wem9uZVNlbmRpbmcoZmlsZSwgeGhyLCBmb3JtRGF0YSkge1xuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5jdXN0b21Qb3N0KS5sZW5ndGgpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHRoaXMuY3VzdG9tUG9zdCkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgdGhpcy5jdXN0b21Qb3N0W2tleV0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ25hbWUnLCB0aGlzLm9wdGlvbnMuZG90Tm90YXRpb24pO1xuICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKCd0YXNrJywgJ2ZpbGVzdXBsb2FkJyk7XG4gICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ3VyaScsIHRoaXMuZ2V0VVJJKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdhZG1pbi1ub25jZScsIGNvbmZpZy5hZG1pbl9ub25jZSk7XG4gICAgfVxuXG4gICAgb25Ecm9wem9uZVN1Y2Nlc3MoZmlsZSwgcmVzcG9uc2UsIHhocikge1xuICAgICAgICByZXNwb25zZSA9IHR5cGVvZiByZXNwb25zZSA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKHJlc3BvbnNlKSA6IHJlc3BvbnNlO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlbG9hZFBhZ2UpIHtcbiAgICAgICAgICAgIGdsb2JhbC5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHN0b3JlIHBhcmFtcyBmb3IgcmVtb3ZpbmcgZmlsZSBmcm9tIHNlc3Npb24gYmVmb3JlIGl0IGdldHMgc2F2ZWRcbiAgICAgICAgaWYgKHJlc3BvbnNlLnNlc3Npb24pIHtcbiAgICAgICAgICAgIGZpbGUuc2Vzc2lvblBhcmFtcyA9IHJlc3BvbnNlLnNlc3Npb247XG4gICAgICAgICAgICBmaWxlLnJlbW92ZVVybCA9IHRoaXMub3B0aW9ucy51cmw7XG5cbiAgICAgICAgICAgIC8vIFRvdWNoIGZpZWxkIHZhbHVlIHRvIGZvcmNlIGEgbXV0YXRpb24gZGV0ZWN0aW9uXG4gICAgICAgICAgICBjb25zdCBpbnB1dCA9IHRoaXMuY29udGFpbmVyLmZpbmQoJ1tuYW1lXVt0eXBlPVwiaGlkZGVuXCJdJyk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGlucHV0LnZhbCgpO1xuICAgICAgICAgICAgaW5wdXQudmFsKHZhbHVlICsgJyAnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZUVycm9yKHtcbiAgICAgICAgICAgIGZpbGUsXG4gICAgICAgICAgICBkYXRhOiByZXNwb25zZSxcbiAgICAgICAgICAgIG1vZGU6ICdyZW1vdmVGaWxlJyxcbiAgICAgICAgICAgIG1zZzogYDxwPiR7dHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5GSUxFX0VSUk9SX1VQTE9BRH0gPHN0cm9uZz4ke2ZpbGUubmFtZX08L3N0cm9uZz48L3A+XG4gICAgICAgICAgICA8cHJlPiR7cmVzcG9uc2UubWVzc2FnZX08L3ByZT5gXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uRHJvcHpvbmVDb21wbGV0ZShmaWxlKSB7XG4gICAgICAgIGlmICghZmlsZS5hY2NlcHRlZCAmJiAhZmlsZS5yZWplY3RlZCkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB7XG4gICAgICAgICAgICAgICAgc3RhdHVzOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGAke3RyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uRklMRV9VTlNVUFBPUlRFRH06ICR7ZmlsZS5uYW1lLm1hdGNoKC9cXC4uKy8pLmpvaW4oJycpfWBcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZUVycm9yKHtcbiAgICAgICAgICAgICAgICBmaWxlLFxuICAgICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgICAgbW9kZTogJ3JlbW92ZUZpbGUnLFxuICAgICAgICAgICAgICAgIG1zZzogYDxwPiR7dHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5GSUxFX0VSUk9SX0FERH0gPHN0cm9uZz4ke2ZpbGUubmFtZX08L3N0cm9uZz48L3A+XG4gICAgICAgICAgICAgICAgPHByZT4ke2RhdGEubWVzc2FnZX08L3ByZT5gXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVsb2FkUGFnZSkge1xuICAgICAgICAgICAgZ2xvYmFsLmxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYjY0X3RvX3V0Zjgoc3RyKSB7XG4gICAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKC9cXHMvZywgJycpO1xuICAgICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZSh3aW5kb3cuYXRvYihzdHIpKSk7XG4gICAgfVxuXG4gICAgb25Ecm9wem9uZVJlbW92ZWRGaWxlKGZpbGUsIC4uLmV4dHJhKSB7XG4gICAgICAgIGlmICghZmlsZS5hY2NlcHRlZCB8fCBmaWxlLnJlamVjdGVkKSB7IHJldHVybjsgfVxuICAgICAgICBsZXQgdXJsID0gZmlsZS5yZW1vdmVVcmwgfHwgdGhpcy51cmxzLmRlbGV0ZSB8fCB0aGlzLm9wdGlvbnMudXJsO1xuICAgICAgICBsZXQgcGF0aCA9ICh1cmwgfHwgJycpLm1hdGNoKC9wYXRoOiguKilcXC8vKTtcbiAgICAgICAgbGV0IGJvZHkgPSB7IGZpbGVuYW1lOiBmaWxlLm5hbWUsIHVyaTogdGhpcy5nZXRVUkkoKSB9O1xuXG4gICAgICAgIGlmIChmaWxlLnNlc3Npb25QYXJhbXMpIHtcbiAgICAgICAgICAgIGJvZHkudGFzayA9ICdmaWxlc3Nlc3Npb25yZW1vdmUnO1xuICAgICAgICAgICAgYm9keS5zZXNzaW9uID0gZmlsZS5zZXNzaW9uUGFyYW1zO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3VzdG9tUG9zdCA9IHRoaXMuY29udGFpbmVyLmRhdGEoJ2ZpbGVQb3N0UmVtb3ZlJykgfHwge307XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhjdXN0b21Qb3N0KS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGJvZHkgPSB7fTtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGN1c3RvbVBvc3QpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgICAgIGJvZHlba2V5XSA9IGN1c3RvbVBvc3Rba2V5XTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgYm9keVsnZmlsZW5hbWUnXSA9IGZpbGUubmFtZTtcbiAgICAgICAgYm9keVsnYWRtaW4tbm9uY2UnXSA9IGNvbmZpZy5hZG1pbl9ub25jZTtcblxuICAgICAgICByZXF1ZXN0KHVybCwgeyBtZXRob2Q6ICdwb3N0JywgYm9keSB9LCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXBhdGgpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgICAgIHBhdGggPSB0aGlzLmI2NF90b191dGY4KHBhdGhbMV0pO1xuICAgICAgICAgICAgbGV0IGlucHV0ID0gdGhpcy5jb250YWluZXIuZmluZCgnW25hbWVdW3R5cGU9XCJoaWRkZW5cIl0nKTtcbiAgICAgICAgICAgIGxldCBkYXRhID0gSlNPTi5wYXJzZShpbnB1dC52YWwoKSB8fCAne30nKTtcbiAgICAgICAgICAgIGRlbGV0ZSBkYXRhW3BhdGhdO1xuICAgICAgICAgICAgaW5wdXQudmFsKEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25Ecm9wem9uZUVycm9yKGZpbGUsIHJlc3BvbnNlLCB4aHIpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB4aHIgPyByZXNwb25zZS5lcnJvci5tZXNzYWdlIDogcmVzcG9uc2U7XG4gICAgICAgICQoZmlsZS5wcmV2aWV3RWxlbWVudCkuZmluZCgnW2RhdGEtZHotZXJyb3JtZXNzYWdlXScpLmh0bWwobWVzc2FnZSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlRXJyb3Ioe1xuICAgICAgICAgICAgZmlsZSxcbiAgICAgICAgICAgIGRhdGE6IHsgc3RhdHVzOiAnZXJyb3InIH0sXG4gICAgICAgICAgICBtc2c6IGA8cHJlPiR7bWVzc2FnZX08L3ByZT5gXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGhhbmRsZUVycm9yKG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IHsgZmlsZSwgZGF0YSwgbW9kZSwgbXNnIH0gPSBvcHRpb25zO1xuICAgICAgICBpZiAoZGF0YS5zdGF0dXMgIT09ICdlcnJvcicgJiYgZGF0YS5zdGF0dXMgIT09ICd1bmF1dGhvcml6ZWQnKSB7IHJldHVybjsgfVxuXG4gICAgICAgIHN3aXRjaCAobW9kZSkge1xuICAgICAgICAgICAgY2FzZSAnYWRkQmFjayc6XG4gICAgICAgICAgICAgICAgaWYgKGZpbGUgaW5zdGFuY2VvZiBGaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJvcHpvbmUuYWRkRmlsZS5jYWxsKHRoaXMuZHJvcHpvbmUsIGZpbGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJvcHpvbmUuZmlsZXMucHVzaChmaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcm9wem9uZS5vcHRpb25zLmFkZGVkZmlsZS5jYWxsKHRoaXMuZHJvcHpvbmUsIGZpbGUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyb3B6b25lLm9wdGlvbnMudGh1bWJuYWlsLmNhbGwodGhpcy5kcm9wem9uZSwgZmlsZSwgZmlsZS5leHRyYXMudXJsKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3JlbW92ZUZpbGUnOlxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBpZiAofnRoaXMuZHJvcHpvbmUuZmlsZXMuaW5kZXhPZihmaWxlKSkge1xuICAgICAgICAgICAgICAgICAgICBmaWxlLnJlamVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcm9wem9uZS5yZW1vdmVGaWxlLmNhbGwodGhpcy5kcm9wem9uZSwgZmlsZSwgeyBzaWxlbnQ6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbW9kYWwgPSAkKCdbZGF0YS1yZW1vZGFsLWlkPVwiZ2VuZXJpY1wiXScpO1xuICAgICAgICBtb2RhbC5maW5kKCcuZXJyb3ItY29udGVudCcpLmh0bWwobXNnKTtcbiAgICAgICAgJC5yZW1vZGFsLmxvb2t1cFttb2RhbC5kYXRhKCdyZW1vZGFsJyldLm9wZW4oKTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBVcmlUb01hcmtkb3duKHVyaSkge1xuICAgIHVyaSA9IHVyaS5yZXBsYWNlKC9AM3h8QDJ4fEAxeC8sICcnKTtcbiAgICB1cmkgPSB1cmkucmVwbGFjZSgvXFwoL2csICclMjgnKTtcbiAgICB1cmkgPSB1cmkucmVwbGFjZSgvXFwpL2csICclMjknKTtcblxuICAgIGNvbnN0IHRpdGxlID0gdXJpLnNwbGl0KCcuJykuc2xpY2UoMCwgLTEpLmpvaW4oJy4nKTtcblxuICAgIHJldHVybiB1cmkubWF0Y2goL1xcLihqcGU/Z3xwbmd8Z2lmfHN2Z3xtcDR8d2VibXxvZ3Z8bW92KSQvaSkgPyBgIVske3RpdGxlfV0oJHt1cml9IFwiJHt0aXRsZX1cIilgIDogYFske2RlY29kZVVSSSh1cmkpfV0oJHt1cml9KWA7XG59XG5cbmxldCBpbnN0YW5jZXMgPSBbXTtcbmxldCBjYWNoZSA9ICQoKTtcbmNvbnN0IG9uQWRkZWROb2RlcyA9IChldmVudCwgdGFyZ2V0LyogLCByZWNvcmQsIGluc3RhbmNlICovKSA9PiB7XG4gICAgbGV0IGZpbGVzID0gJCh0YXJnZXQpLmZpbmQoJy5kcm9wem9uZS5maWxlcy11cGxvYWQnKTtcbiAgICBpZiAoIWZpbGVzLmxlbmd0aCkgeyByZXR1cm47IH1cblxuICAgIGZpbGVzLmVhY2goKGluZGV4LCBmaWxlKSA9PiB7XG4gICAgICAgIGZpbGUgPSAkKGZpbGUpO1xuICAgICAgICBpZiAoIX5jYWNoZS5pbmRleChmaWxlKSkge1xuICAgICAgICAgICAgYWRkTm9kZShmaWxlKTtcbiAgICAgICAgfVxuICAgIH0pO1xufTtcblxuY29uc3QgYWRkTm9kZSA9IChjb250YWluZXIpID0+IHtcbiAgICBjb250YWluZXIgPSAkKGNvbnRhaW5lcik7XG4gICAgbGV0IGlucHV0ID0gY29udGFpbmVyLmZpbmQoJ2lucHV0W3R5cGU9XCJmaWxlXCJdJyk7XG4gICAgbGV0IHNldHRpbmdzID0gY29udGFpbmVyLmRhdGEoJ2dyYXYtZmlsZS1zZXR0aW5ncycpIHx8IHt9O1xuXG4gICAgaWYgKHNldHRpbmdzLmFjY2VwdCAmJiB+c2V0dGluZ3MuYWNjZXB0LmluZGV4T2YoJyonKSkge1xuICAgICAgICBzZXR0aW5ncy5hY2NlcHQgPSBbJyddO1xuICAgIH1cblxuICAgIGxldCBvcHRpb25zID0ge1xuICAgICAgICB1cmw6IGNvbnRhaW5lci5kYXRhKCdmaWxlLXVybC1hZGQnKSB8fCAoY29udGFpbmVyLmNsb3Nlc3QoJ2Zvcm0nKS5hdHRyKCdhY3Rpb24nKSB8fCBjb25maWcuY3VycmVudF91cmwpICsgJy5qc29uJyxcbiAgICAgICAgcGFyYW1OYW1lOiBzZXR0aW5ncy5wYXJhbU5hbWUgfHwgJ2ZpbGUnLFxuICAgICAgICBkb3ROb3RhdGlvbjogc2V0dGluZ3MubmFtZSB8fCAnZmlsZScsXG4gICAgICAgIGFjY2VwdGVkRmlsZXM6IHNldHRpbmdzLmFjY2VwdCA/IHNldHRpbmdzLmFjY2VwdC5qb2luKCcsJykgOiBpbnB1dC5hdHRyKCdhY2NlcHQnKSB8fCBjb250YWluZXIuZGF0YSgnbWVkaWEtdHlwZXMnKSxcbiAgICAgICAgbWF4RmlsZXNpemU6IHR5cGVvZiBzZXR0aW5ncy5maWxlc2l6ZSAhPT0gJ3VuZGVmaW5lZCcgPyBzZXR0aW5ncy5maWxlc2l6ZSA6IDI1NixcbiAgICAgICAgbWF4RmlsZXM6IHNldHRpbmdzLmxpbWl0IHx8IG51bGwsXG4gICAgICAgIHJlc2l6ZVdpZHRoOiBzZXR0aW5ncy5yZXNpemVXaWR0aCB8fCBudWxsLFxuICAgICAgICByZXNpemVIZWlnaHQ6IHNldHRpbmdzLnJlc2l6ZUhlaWdodCB8fCBudWxsLFxuICAgICAgICByZXNpemVRdWFsaXR5OiBzZXR0aW5ncy5yZXNpemVRdWFsaXR5IHx8IG51bGwsXG4gICAgICAgIHJlc29sdXRpb246IHNldHRpbmdzLnJlc29sdXRpb24gfHwgbnVsbCxcbiAgICAgICAgYWNjZXB0OiBmdW5jdGlvbihmaWxlLCBkb25lKSB7IEFDQ0VQVF9GVU5DKGZpbGUsIGRvbmUsIHNldHRpbmdzKTsgfVxuICAgIH07XG5cbiAgICBjYWNoZSA9IGNhY2hlLmFkZChjb250YWluZXIpO1xuICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lclswXTtcbiAgICBpbnN0YW5jZXMucHVzaChuZXcgRmlsZXNGaWVsZCh7IGNvbnRhaW5lciwgb3B0aW9ucyB9KSk7XG59O1xuXG5leHBvcnQgbGV0IEluc3RhbmNlID0gKCgpID0+IHtcbiAgICAkKCcuZHJvcHpvbmUuZmlsZXMtdXBsb2FkJykuZWFjaCgoaSwgY29udGFpbmVyKSA9PiBhZGROb2RlKGNvbnRhaW5lcikpO1xuICAgICQoJ2JvZHknKS5vbignbXV0YXRpb24uX2dyYXYnLCBvbkFkZGVkTm9kZXMpO1xuXG4gICAgcmV0dXJuIGluc3RhbmNlcztcbn0pKCk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./app/forms/fields/files.js\n"); + +/***/ }), + +/***/ "./app/forms/fields/folder.js": +/*!************************************!*\ + !*** ./app/forms/fields/folder.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n\n\nvar Regenerate = function Regenerate() {\n var field = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '[name=\"data[folder]\"]';\n var element = jquery__WEBPACK_IMPORTED_MODULE_0___default()(field);\n var title = jquery__WEBPACK_IMPORTED_MODULE_0___default()('[name=\"data[header][title]\"]');\n var slug = jquery__WEBPACK_IMPORTED_MODULE_0___default().slugify(title.val(), {\n custom: {\n \"'\": ''\n }\n });\n element.addClass('highlight').val(slug);\n setTimeout(function () {\n return element.removeClass('highlight');\n }, 500);\n};\n\njquery__WEBPACK_IMPORTED_MODULE_0___default()(document).on('click', '[data-regenerate]', function (event) {\n var target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.currentTarget);\n var field = jquery__WEBPACK_IMPORTED_MODULE_0___default()(target.data('regenerate'));\n Regenerate(field);\n});\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Regenerate);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL2Zvcm1zL2ZpZWxkcy9mb2xkZXIuanM/OTdmZSJdLCJuYW1lcyI6WyJSZWdlbmVyYXRlIiwiZmllbGQiLCJlbGVtZW50IiwiJCIsInRpdGxlIiwic2x1ZyIsInZhbCIsImN1c3RvbSIsImFkZENsYXNzIiwic2V0VGltZW91dCIsInJlbW92ZUNsYXNzIiwiZG9jdW1lbnQiLCJvbiIsImV2ZW50IiwidGFyZ2V0IiwiY3VycmVudFRhcmdldCIsImRhdGEiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBOztBQUVBLElBQU1BLFVBQVUsR0FBRyxTQUFiQSxVQUFhLEdBQXFDO0FBQUEsTUFBcENDLEtBQW9DLHVFQUE1Qix1QkFBNEI7QUFDcEQsTUFBTUMsT0FBTyxHQUFHQyw2Q0FBQyxDQUFDRixLQUFELENBQWpCO0FBQ0EsTUFBTUcsS0FBSyxHQUFHRCw2Q0FBQyxDQUFDLDhCQUFELENBQWY7QUFDQSxNQUFNRSxJQUFJLEdBQUdGLHFEQUFBLENBQVVDLEtBQUssQ0FBQ0UsR0FBTixFQUFWLEVBQXVCO0FBQUNDLFVBQU0sRUFBRTtBQUFDLFdBQUs7QUFBTjtBQUFULEdBQXZCLENBQWI7QUFFQUwsU0FBTyxDQUFDTSxRQUFSLENBQWlCLFdBQWpCLEVBQThCRixHQUE5QixDQUFrQ0QsSUFBbEM7QUFFQUksWUFBVSxDQUFDO0FBQUEsV0FBTVAsT0FBTyxDQUFDUSxXQUFSLENBQW9CLFdBQXBCLENBQU47QUFBQSxHQUFELEVBQXlDLEdBQXpDLENBQVY7QUFDSCxDQVJEOztBQVVBUCw2Q0FBQyxDQUFDUSxRQUFELENBQUQsQ0FBWUMsRUFBWixDQUFlLE9BQWYsRUFBd0IsbUJBQXhCLEVBQTZDLFVBQUNDLEtBQUQsRUFBVztBQUNwRCxNQUFNQyxNQUFNLEdBQUdYLDZDQUFDLENBQUNVLEtBQUssQ0FBQ0UsYUFBUCxDQUFoQjtBQUNBLE1BQU1kLEtBQUssR0FBR0UsNkNBQUMsQ0FBQ1csTUFBTSxDQUFDRSxJQUFQLENBQVksWUFBWixDQUFELENBQWY7QUFFQWhCLFlBQVUsQ0FBQ0MsS0FBRCxDQUFWO0FBQ0gsQ0FMRDtBQU9BLGlFQUFlRCxVQUFmIiwiZmlsZSI6Ii4vYXBwL2Zvcm1zL2ZpZWxkcy9mb2xkZXIuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuXG5jb25zdCBSZWdlbmVyYXRlID0gKGZpZWxkID0gJ1tuYW1lPVwiZGF0YVtmb2xkZXJdXCJdJykgPT4ge1xuICAgIGNvbnN0IGVsZW1lbnQgPSAkKGZpZWxkKTtcbiAgICBjb25zdCB0aXRsZSA9ICQoJ1tuYW1lPVwiZGF0YVtoZWFkZXJdW3RpdGxlXVwiXScpO1xuICAgIGNvbnN0IHNsdWcgPSAkLnNsdWdpZnkodGl0bGUudmFsKCksIHtjdXN0b206IHtcIidcIjogJyd9fSk7XG5cbiAgICBlbGVtZW50LmFkZENsYXNzKCdoaWdobGlnaHQnKS52YWwoc2x1Zyk7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IGVsZW1lbnQucmVtb3ZlQ2xhc3MoJ2hpZ2hsaWdodCcpLCA1MDApO1xufTtcblxuJChkb2N1bWVudCkub24oJ2NsaWNrJywgJ1tkYXRhLXJlZ2VuZXJhdGVdJywgKGV2ZW50KSA9PiB7XG4gICAgY29uc3QgdGFyZ2V0ID0gJChldmVudC5jdXJyZW50VGFyZ2V0KTtcbiAgICBjb25zdCBmaWVsZCA9ICQodGFyZ2V0LmRhdGEoJ3JlZ2VuZXJhdGUnKSk7XG5cbiAgICBSZWdlbmVyYXRlKGZpZWxkKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBSZWdlbmVyYXRlO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./app/forms/fields/folder.js\n"); /***/ }), /***/ "./app/forms/fields/iconpicker.js": -/*!****************************************!* +/*!****************************************!*\ !*** ./app/forms/fields/iconpicker.js ***! \****************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => /* binding */ IconpickerField,\n/* harmony export */ \"Instance\": () => /* binding */ Instance\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n/* Icon Picker by QueryLoop\n * Author: @eliorivero\n * URL: http://queryloop.com/\n * License: GPLv2\n */\n\nvar defaults = {\n 'mode': 'dialog',\n // show overlay 'dialog' panel or slide down 'inline' panel\n 'closeOnPick': true,\n // whether to close panel after picking or 'no'\n 'save': 'class',\n // save icon 'class' or 'code'\n 'size': '',\n 'classes': {\n 'launcher': '',\n // extra classes for launcher buttons\n 'clear': 'remove-times',\n // extra classes for button that removes preview and clears field\n 'highlight': '',\n // extra classes when highlighting an icon\n 'close': '' // extra classes for close button\n\n },\n 'iconSets': {\n // example data structure. Used to specify which launchers will be created\n 'genericon': 'Genericon',\n // create a launcher to pick genericon icons\n 'fa': 'FontAwesome' // create a launcher to pick fontawesome icons\n\n }\n};\n\nvar QL_Icon_Picker = /*#__PURE__*/function () {\n function QL_Icon_Picker(element, options) {\n _classCallCheck(this, QL_Icon_Picker);\n\n this.iconSet = '';\n this.iconSetName = '';\n this.$field = '';\n this.element = element;\n this.settings = jquery__WEBPACK_IMPORTED_MODULE_0___default().extend({}, defaults, options);\n this._defaults = defaults;\n this.init();\n }\n\n _createClass(QL_Icon_Picker, [{\n key: \"init\",\n value: function init() {\n var $brick = jquery__WEBPACK_IMPORTED_MODULE_0___default()(this.element);\n var pickerId = $brick.data('pickerid');\n var $preview = jquery__WEBPACK_IMPORTED_MODULE_0___default()('
          ');\n this.$field = $brick.find('input'); // Add preview area\n\n this.makePreview($brick, pickerId, $preview); // Make button to clear field and remove preview\n\n this.makeClear(pickerId, $preview); // Make buttons that open the panel of icons\n\n this.makeLaunchers($brick, pickerId); // Prepare display styles, inline and dialog\n\n this.makeDisplay($brick);\n }\n }, {\n key: \"makePreview\",\n value: function makePreview($brick, pickerId, $preview) {\n var $icon = jquery__WEBPACK_IMPORTED_MODULE_0___default()('');\n var iconValue = this.$field.val();\n $preview.prependTo($brick);\n $icon.prependTo($preview);\n\n if (iconValue !== '') {\n $preview.addClass('icon-preview-on');\n $icon.addClass(iconValue);\n }\n }\n }, {\n key: \"makeClear\",\n value: function makeClear(pickerId, $preview) {\n var base = this;\n var $clear = jquery__WEBPACK_IMPORTED_MODULE_0___default()(''); // Hide button to remove icon and preview and append it to preview area\n\n $clear.hide().prependTo($preview); // If there's a icon saved in the field, show remove icon button\n\n if (base.$field.val() !== '') {\n $clear.show();\n }\n\n $preview.on('click', '.remove-icon', function (e) {\n e.preventDefault();\n base.$field.val('');\n $preview.removeClass('icon-preview-on').find('i').removeClass();\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(this).hide();\n });\n }\n }, {\n key: \"makeDisplay\",\n value: function makeDisplay($brick) {\n var base = this;\n var close = base.settings.classes.close;\n var $body = jquery__WEBPACK_IMPORTED_MODULE_0___default()('body');\n var $close = jquery__WEBPACK_IMPORTED_MODULE_0___default()('');\n\n if (base.settings.mode === 'inline') {\n $brick.find('.icon-set').append($close).removeClass('dialog').addClass('ip-inline ' + base.settings.size).parent().addClass('icon-set-wrap');\n } else if (base.settings.mode === 'dialog') {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.icon-set').addClass('dialog ' + base.settings.size);\n\n if (jquery__WEBPACK_IMPORTED_MODULE_0___default()('.icon-picker-overlay').length <= 0) {\n $body.append('
          ').append($close);\n }\n }\n\n $body.on('click', '.icon-picker-close, .icon-picker-overlay', function (e) {\n e.preventDefault();\n base.closePicker($brick, jquery__WEBPACK_IMPORTED_MODULE_0___default()(base.iconSet), base.settings.mode);\n }).on('mouseenter mouseleave', '.icon-picker-close', function (e) {\n if (e.type === 'mouseenter') {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(this).addClass(close);\n } else {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(this).removeClass(close);\n }\n });\n }\n }, {\n key: \"makeLaunchers\",\n value: function makeLaunchers($brick) {\n var base = this;\n var dataIconSets = $brick.data('iconsets');\n var iconSet;\n\n if (typeof dataIconSets === 'undefined') {\n dataIconSets = base.settings.iconSets;\n }\n\n for (iconSet in dataIconSets) {\n if (dataIconSets.hasOwnProperty(iconSet)) {\n $brick.append('' + dataIconSets[iconSet] + '');\n }\n }\n\n $brick.find('.launch-icons').on('click', function (e) {\n e.preventDefault();\n var $self = jquery__WEBPACK_IMPORTED_MODULE_0___default()(this);\n var theseIcons = $self.data('icons');\n base.iconSetName = theseIcons;\n base.iconSet = '.' + theseIcons + '-set'; // Initialize picker\n\n base.iconPick($brick); // Show icon picker\n\n base.showPicker($brick, jquery__WEBPACK_IMPORTED_MODULE_0___default()(base.iconSet), base.settings.mode);\n });\n }\n }, {\n key: \"iconPick\",\n value: function iconPick($brick) {\n var base = this;\n var highlight = 'icon-highlight ' + base.settings.classes.highlight;\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(base.iconSet).on('click', 'li', function (e) {\n e.preventDefault();\n var $icon = jquery__WEBPACK_IMPORTED_MODULE_0___default()(this);\n var icon = $icon.data(base.settings.save); // Mark as selected\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.icon-selected').removeClass('icon-selected');\n $icon.addClass('icon-selected');\n\n if (base.$field.data('format') === 'short') {\n icon = icon.slice(6);\n } // Save icon value to field\n\n\n base.$field.val(icon); // Close icon picker\n\n if (base.settings.closeOnPick) {\n base.closePicker($brick, $icon.closest(base.iconSet), base.settings.mode);\n } // Set preview\n\n\n base.setPreview($icon.data('class')); // Broadcast event passing the selected icon.\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('body').trigger('iconselected.queryloop', icon);\n });\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(base.iconSet).on('mouseenter mouseleave', 'li', function (e) {\n if (e.type === 'mouseenter') {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(this).addClass(highlight);\n } else {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(this).removeClass(highlight);\n }\n });\n }\n }, {\n key: \"showPicker\",\n value: function showPicker($brick, $icons, mode) {\n if (mode === 'inline') {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.icon-set').removeClass('ip-inline-open');\n $brick.find($icons).toggleClass('ip-inline-open');\n } else if (mode === 'dialog') {\n $brick.find('.icon-picker-close').addClass('make-visible');\n $brick.find('.icon-picker-overlay').addClass('make-visible');\n $icons.addClass('dialog-open');\n }\n\n $icons.find('.icon-selected').removeClass('icon-selected');\n var selectedIcon = this.$field.val().replace(' ', '.');\n\n if (selectedIcon !== '') {\n if (this.settings.save === 'class') {\n $icons.find('.' + selectedIcon).addClass('icon-selected');\n } else {\n $icons.find('[data-code=\"' + selectedIcon + '\"]').addClass('icon-selected');\n }\n } // Broadcast event when the picker is shown passing the picker mode.\n\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('body').trigger('iconpickershow.queryloop', mode);\n }\n }, {\n key: \"closePicker\",\n value: function closePicker($brick, $icons, mode) {\n // Remove event so they don't fire from a different picker\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(this.iconSet).off('click', 'li');\n\n if (mode === 'inline') {\n $brick.find($icons).removeClass('ip-inline-open');\n } else if (mode === 'dialog') {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.icon-picker-close, .icon-picker-overlay').removeClass('make-visible');\n } // Broadcast event when the picker is closed passing the picker mode.\n\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('body').trigger('iconpickerclose.queryloop', mode);\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.icon-set').removeClass('dialog-open');\n }\n }, {\n key: \"setPreview\",\n value: function setPreview(preview) {\n var $preview = jquery__WEBPACK_IMPORTED_MODULE_0___default()(this.element).find('.icon-preview');\n $preview.addClass('icon-preview-on').find('i').removeClass().addClass(this.iconSetName).addClass(preview);\n $preview.find('a').show();\n }\n }]);\n\n return QL_Icon_Picker;\n}();\n/* Grav */\n// extend $ with 3rd party QL Icon Picker\n\n\n(jquery__WEBPACK_IMPORTED_MODULE_0___default().fn.qlIconPicker) = function (options) {\n this.each(function () {\n if (!jquery__WEBPACK_IMPORTED_MODULE_0___default().data(this, 'plugin_qlIconPicker')) {\n jquery__WEBPACK_IMPORTED_MODULE_0___default().data(this, 'plugin_qlIconPicker', new QL_Icon_Picker(this, options));\n }\n });\n return this;\n};\n\nvar IconpickerField = /*#__PURE__*/function () {\n function IconpickerField(options) {\n var _this = this;\n\n _classCallCheck(this, IconpickerField);\n\n this.items = jquery__WEBPACK_IMPORTED_MODULE_0___default()();\n this.options = Object.assign({}, this.defaults, options);\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-grav-iconpicker]').each(function (index, element) {\n return _this.addItem(element);\n });\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('body').on('mutation._grav', this._onAddedNodes.bind(this));\n }\n\n _createClass(IconpickerField, [{\n key: \"_onAddedNodes\",\n value: function _onAddedNodes(event, target\n /* , record, instance */\n ) {\n var _this2 = this;\n\n var fields = jquery__WEBPACK_IMPORTED_MODULE_0___default()(target).find('[data-grav-iconpicker]');\n\n if (!fields.length) {\n return;\n }\n\n fields.each(function (index, field) {\n field = jquery__WEBPACK_IMPORTED_MODULE_0___default()(field);\n\n if (!~_this2.items.index(field)) {\n _this2.addItem(field);\n }\n });\n }\n }, {\n key: \"addItem\",\n value: function addItem(element) {\n element = jquery__WEBPACK_IMPORTED_MODULE_0___default()(element);\n this.items = this.items.add(element);\n element.find('.icon-picker').qlIconPicker({\n 'save': 'class'\n }); // hack to remove extra icon sets that are just copies\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.icon-set:not(:first)').remove();\n }\n }]);\n\n return IconpickerField;\n}();\n\n\nvar Instance = new IconpickerField(); // Fix to close the dialog when clicking outside\n\njquery__WEBPACK_IMPORTED_MODULE_0___default()(document).on('click', function (event) {\n var target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.target);\n var match = '.icon-set.dialog-open, .launch-icons[data-icons]';\n\n if (!target.is(match) && !target.closest(match).length) {\n var dialogs = jquery__WEBPACK_IMPORTED_MODULE_0___default()('.icon-set.dialog-open'); // skip if there's no dialog open\n\n if (dialogs.length) {\n dialogs.each(function (index, dialog) {\n var picker = jquery__WEBPACK_IMPORTED_MODULE_0___default()(dialog).siblings('.icon-picker');\n var data = picker.data('plugin_qlIconPicker');\n data.closePicker(picker, jquery__WEBPACK_IMPORTED_MODULE_0___default()(data.iconSet), data.settings.mode);\n });\n }\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL2Zvcm1zL2ZpZWxkcy9pY29ucGlja2VyLmpzPzVkNDEiXSwibmFtZXMiOlsiZGVmYXVsdHMiLCJRTF9JY29uX1BpY2tlciIsImVsZW1lbnQiLCJvcHRpb25zIiwiaWNvblNldCIsImljb25TZXROYW1lIiwiJGZpZWxkIiwic2V0dGluZ3MiLCIkIiwiX2RlZmF1bHRzIiwiaW5pdCIsIiRicmljayIsInBpY2tlcklkIiwiZGF0YSIsIiRwcmV2aWV3IiwiZmluZCIsIm1ha2VQcmV2aWV3IiwibWFrZUNsZWFyIiwibWFrZUxhdW5jaGVycyIsIm1ha2VEaXNwbGF5IiwiJGljb24iLCJpY29uVmFsdWUiLCJ2YWwiLCJwcmVwZW5kVG8iLCJhZGRDbGFzcyIsImJhc2UiLCIkY2xlYXIiLCJjbGFzc2VzIiwiY2xlYXIiLCJoaWRlIiwic2hvdyIsIm9uIiwiZSIsInByZXZlbnREZWZhdWx0IiwicmVtb3ZlQ2xhc3MiLCJjbG9zZSIsIiRib2R5IiwiJGNsb3NlIiwibW9kZSIsImFwcGVuZCIsInNpemUiLCJwYXJlbnQiLCJsZW5ndGgiLCJjbG9zZVBpY2tlciIsInR5cGUiLCJkYXRhSWNvblNldHMiLCJpY29uU2V0cyIsImhhc093blByb3BlcnR5IiwibGF1bmNoZXIiLCIkc2VsZiIsInRoZXNlSWNvbnMiLCJpY29uUGljayIsInNob3dQaWNrZXIiLCJoaWdobGlnaHQiLCJpY29uIiwic2F2ZSIsInNsaWNlIiwiY2xvc2VPblBpY2siLCJjbG9zZXN0Iiwic2V0UHJldmlldyIsInRyaWdnZXIiLCIkaWNvbnMiLCJ0b2dnbGVDbGFzcyIsInNlbGVjdGVkSWNvbiIsInJlcGxhY2UiLCJvZmYiLCJwcmV2aWV3IiwiZWFjaCIsIkljb25waWNrZXJGaWVsZCIsIml0ZW1zIiwiT2JqZWN0IiwiYXNzaWduIiwiaW5kZXgiLCJhZGRJdGVtIiwiX29uQWRkZWROb2RlcyIsImJpbmQiLCJldmVudCIsInRhcmdldCIsImZpZWxkcyIsImZpZWxkIiwiYWRkIiwicWxJY29uUGlja2VyIiwicmVtb3ZlIiwiSW5zdGFuY2UiLCJkb2N1bWVudCIsIm1hdGNoIiwiaXMiLCJkaWFsb2dzIiwiZGlhbG9nIiwicGlja2VyIiwic2libGluZ3MiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsSUFBSUEsUUFBUSxHQUFHO0FBQ1gsVUFBUSxRQURHO0FBQ087QUFDbEIsaUJBQWUsSUFGSjtBQUVVO0FBQ3JCLFVBQVEsT0FIRztBQUdNO0FBQ2pCLFVBQVEsRUFKRztBQUtYLGFBQVc7QUFDUCxnQkFBWSxFQURMO0FBQ1M7QUFDaEIsYUFBUyxjQUZGO0FBRWtCO0FBQ3pCLGlCQUFhLEVBSE47QUFHVTtBQUNqQixhQUFTLEVBSkYsQ0FJSzs7QUFKTCxHQUxBO0FBV1gsY0FBWTtBQUFFO0FBQ1YsaUJBQWEsV0FETDtBQUNrQjtBQUMxQixVQUFNLGFBRkUsQ0FFWTs7QUFGWjtBQVhELENBQWY7O0lBaUJNQyxjO0FBRUYsMEJBQVlDLE9BQVosRUFBcUJDLE9BQXJCLEVBQThCO0FBQUE7O0FBQzFCLFNBQUtDLE9BQUwsR0FBZSxFQUFmO0FBQ0EsU0FBS0MsV0FBTCxHQUFtQixFQUFuQjtBQUNBLFNBQUtDLE1BQUwsR0FBYyxFQUFkO0FBQ0EsU0FBS0osT0FBTCxHQUFlQSxPQUFmO0FBQ0EsU0FBS0ssUUFBTCxHQUFnQkMsb0RBQUEsQ0FBUyxFQUFULEVBQWFSLFFBQWIsRUFBdUJHLE9BQXZCLENBQWhCO0FBQ0EsU0FBS00sU0FBTCxHQUFpQlQsUUFBakI7QUFDQSxTQUFLVSxJQUFMO0FBQ0g7Ozs7MkJBRU07QUFDSCxVQUFJQyxNQUFNLEdBQUdILDZDQUFDLENBQUMsS0FBS04sT0FBTixDQUFkO0FBQ0EsVUFBSVUsUUFBUSxHQUFHRCxNQUFNLENBQUNFLElBQVAsQ0FBWSxVQUFaLENBQWY7QUFDQSxVQUFJQyxRQUFRLEdBQUdOLDZDQUFDLENBQUMsMkNBQTJDSSxRQUEzQyxHQUFzRCxNQUF2RCxDQUFoQjtBQUVBLFdBQUtOLE1BQUwsR0FBY0ssTUFBTSxDQUFDSSxJQUFQLENBQVksT0FBWixDQUFkLENBTEcsQ0FPSDs7QUFDQSxXQUFLQyxXQUFMLENBQWlCTCxNQUFqQixFQUF5QkMsUUFBekIsRUFBbUNFLFFBQW5DLEVBUkcsQ0FVSDs7QUFDQSxXQUFLRyxTQUFMLENBQWVMLFFBQWYsRUFBeUJFLFFBQXpCLEVBWEcsQ0FhSDs7QUFDQSxXQUFLSSxhQUFMLENBQW1CUCxNQUFuQixFQUEyQkMsUUFBM0IsRUFkRyxDQWdCSDs7QUFDQSxXQUFLTyxXQUFMLENBQWlCUixNQUFqQjtBQUNIOzs7Z0NBRVdBLE0sRUFBUUMsUSxFQUFVRSxRLEVBQVU7QUFDcEMsVUFBSU0sS0FBSyxHQUFHWiw2Q0FBQyxDQUFDLE9BQUQsQ0FBYjtBQUNBLFVBQUlhLFNBQVMsR0FBRyxLQUFLZixNQUFMLENBQVlnQixHQUFaLEVBQWhCO0FBRUFSLGNBQVEsQ0FBQ1MsU0FBVCxDQUFtQlosTUFBbkI7QUFDQVMsV0FBSyxDQUFDRyxTQUFOLENBQWdCVCxRQUFoQjs7QUFDQSxVQUFJTyxTQUFTLEtBQUssRUFBbEIsRUFBc0I7QUFDbEJQLGdCQUFRLENBQUNVLFFBQVQsQ0FBa0IsaUJBQWxCO0FBQ0FKLGFBQUssQ0FBQ0ksUUFBTixDQUFlSCxTQUFmO0FBQ0g7QUFDSjs7OzhCQUVTVCxRLEVBQVVFLFEsRUFBVTtBQUMxQixVQUFJVyxJQUFJLEdBQUcsSUFBWDtBQUNBLFVBQUlDLE1BQU0sR0FBR2xCLDZDQUFDLENBQUMsMkJBQTJCaUIsSUFBSSxDQUFDbEIsUUFBTCxDQUFjb0IsT0FBZCxDQUFzQkMsS0FBakQsR0FBeUQsTUFBMUQsQ0FBZCxDQUYwQixDQUkxQjs7QUFDQUYsWUFBTSxDQUFDRyxJQUFQLEdBQWNOLFNBQWQsQ0FBd0JULFFBQXhCLEVBTDBCLENBTTFCOztBQUNBLFVBQUlXLElBQUksQ0FBQ25CLE1BQUwsQ0FBWWdCLEdBQVosT0FBc0IsRUFBMUIsRUFBOEI7QUFDMUJJLGNBQU0sQ0FBQ0ksSUFBUDtBQUNIOztBQUVEaEIsY0FBUSxDQUFDaUIsRUFBVCxDQUFZLE9BQVosRUFBcUIsY0FBckIsRUFBcUMsVUFBU0MsQ0FBVCxFQUFZO0FBQzdDQSxTQUFDLENBQUNDLGNBQUY7QUFDQVIsWUFBSSxDQUFDbkIsTUFBTCxDQUFZZ0IsR0FBWixDQUFnQixFQUFoQjtBQUNBUixnQkFBUSxDQUFDb0IsV0FBVCxDQUFxQixpQkFBckIsRUFBd0NuQixJQUF4QyxDQUE2QyxHQUE3QyxFQUFrRG1CLFdBQWxEO0FBQ0ExQixxREFBQyxDQUFDLElBQUQsQ0FBRCxDQUFRcUIsSUFBUjtBQUNILE9BTEQ7QUFNSDs7O2dDQUVXbEIsTSxFQUFRO0FBQ2hCLFVBQUljLElBQUksR0FBRyxJQUFYO0FBQ0EsVUFBSVUsS0FBSyxHQUFHVixJQUFJLENBQUNsQixRQUFMLENBQWNvQixPQUFkLENBQXNCUSxLQUFsQztBQUNBLFVBQUlDLEtBQUssR0FBRzVCLDZDQUFDLENBQUMsTUFBRCxDQUFiO0FBRUEsVUFBSTZCLE1BQU0sR0FBRzdCLDZDQUFDLENBQUMseUNBQUQsQ0FBZDs7QUFFQSxVQUFJaUIsSUFBSSxDQUFDbEIsUUFBTCxDQUFjK0IsSUFBZCxLQUF1QixRQUEzQixFQUFxQztBQUNqQzNCLGNBQU0sQ0FBQ0ksSUFBUCxDQUFZLFdBQVosRUFBeUJ3QixNQUF6QixDQUFnQ0YsTUFBaEMsRUFBd0NILFdBQXhDLENBQW9ELFFBQXBELEVBQThEVixRQUE5RCxDQUF1RSxlQUFlQyxJQUFJLENBQUNsQixRQUFMLENBQWNpQyxJQUFwRyxFQUEwR0MsTUFBMUcsR0FBbUhqQixRQUFuSCxDQUE0SCxlQUE1SDtBQUNILE9BRkQsTUFFTyxJQUFJQyxJQUFJLENBQUNsQixRQUFMLENBQWMrQixJQUFkLEtBQXVCLFFBQTNCLEVBQXFDO0FBQ3hDOUIscURBQUMsQ0FBQyxXQUFELENBQUQsQ0FBZWdCLFFBQWYsQ0FBd0IsWUFBWUMsSUFBSSxDQUFDbEIsUUFBTCxDQUFjaUMsSUFBbEQ7O0FBQ0EsWUFBSWhDLDZDQUFDLENBQUMsc0JBQUQsQ0FBRCxDQUEwQmtDLE1BQTFCLElBQW9DLENBQXhDLEVBQTJDO0FBQ3ZDTixlQUFLLENBQUNHLE1BQU4sQ0FBYSxvQ0FBYixFQUFtREEsTUFBbkQsQ0FBMERGLE1BQTFEO0FBQ0g7QUFDSjs7QUFDREQsV0FBSyxDQUNBTCxFQURMLENBQ1EsT0FEUixFQUNpQiwwQ0FEakIsRUFDNkQsVUFBU0MsQ0FBVCxFQUFZO0FBQ2pFQSxTQUFDLENBQUNDLGNBQUY7QUFDQVIsWUFBSSxDQUFDa0IsV0FBTCxDQUFpQmhDLE1BQWpCLEVBQXlCSCw2Q0FBQyxDQUFDaUIsSUFBSSxDQUFDckIsT0FBTixDQUExQixFQUEwQ3FCLElBQUksQ0FBQ2xCLFFBQUwsQ0FBYytCLElBQXhEO0FBQ0gsT0FKTCxFQUtLUCxFQUxMLENBS1EsdUJBTFIsRUFLaUMsb0JBTGpDLEVBS3VELFVBQVNDLENBQVQsRUFBWTtBQUMzRCxZQUFJQSxDQUFDLENBQUNZLElBQUYsS0FBVyxZQUFmLEVBQTZCO0FBQ3pCcEMsdURBQUMsQ0FBQyxJQUFELENBQUQsQ0FBUWdCLFFBQVIsQ0FBaUJXLEtBQWpCO0FBQ0gsU0FGRCxNQUVPO0FBQ0gzQix1REFBQyxDQUFDLElBQUQsQ0FBRCxDQUFRMEIsV0FBUixDQUFvQkMsS0FBcEI7QUFDSDtBQUNKLE9BWEw7QUFZSDs7O2tDQUVheEIsTSxFQUFRO0FBQ2xCLFVBQUljLElBQUksR0FBRyxJQUFYO0FBQ0EsVUFBSW9CLFlBQVksR0FBR2xDLE1BQU0sQ0FBQ0UsSUFBUCxDQUFZLFVBQVosQ0FBbkI7QUFDQSxVQUFJVCxPQUFKOztBQUVBLFVBQUksT0FBT3lDLFlBQVAsS0FBd0IsV0FBNUIsRUFBeUM7QUFDckNBLG9CQUFZLEdBQUdwQixJQUFJLENBQUNsQixRQUFMLENBQWN1QyxRQUE3QjtBQUNIOztBQUNELFdBQUsxQyxPQUFMLElBQWdCeUMsWUFBaEIsRUFBOEI7QUFDMUIsWUFBSUEsWUFBWSxDQUFDRSxjQUFiLENBQTRCM0MsT0FBNUIsQ0FBSixFQUEwQztBQUN0Q08sZ0JBQU0sQ0FBQzRCLE1BQVAsQ0FBYyxtQ0FBbUNkLElBQUksQ0FBQ2xCLFFBQUwsQ0FBY29CLE9BQWQsQ0FBc0JxQixRQUF6RCxHQUFvRSxnQkFBcEUsR0FBdUY1QyxPQUF2RixHQUFpRyxJQUFqRyxHQUF3R3lDLFlBQVksQ0FBQ3pDLE9BQUQsQ0FBcEgsR0FBZ0ksTUFBOUk7QUFDSDtBQUNKOztBQUVETyxZQUFNLENBQUNJLElBQVAsQ0FBWSxlQUFaLEVBQTZCZ0IsRUFBN0IsQ0FBZ0MsT0FBaEMsRUFBeUMsVUFBU0MsQ0FBVCxFQUFZO0FBQ2pEQSxTQUFDLENBQUNDLGNBQUY7QUFDQSxZQUFJZ0IsS0FBSyxHQUFHekMsNkNBQUMsQ0FBQyxJQUFELENBQWI7QUFDQSxZQUFJMEMsVUFBVSxHQUFHRCxLQUFLLENBQUNwQyxJQUFOLENBQVcsT0FBWCxDQUFqQjtBQUVBWSxZQUFJLENBQUNwQixXQUFMLEdBQW1CNkMsVUFBbkI7QUFDQXpCLFlBQUksQ0FBQ3JCLE9BQUwsR0FBZSxNQUFNOEMsVUFBTixHQUFtQixNQUFsQyxDQU5pRCxDQVFqRDs7QUFDQXpCLFlBQUksQ0FBQzBCLFFBQUwsQ0FBY3hDLE1BQWQsRUFUaUQsQ0FXakQ7O0FBQ0FjLFlBQUksQ0FBQzJCLFVBQUwsQ0FBZ0J6QyxNQUFoQixFQUF3QkgsNkNBQUMsQ0FBQ2lCLElBQUksQ0FBQ3JCLE9BQU4sQ0FBekIsRUFBeUNxQixJQUFJLENBQUNsQixRQUFMLENBQWMrQixJQUF2RDtBQUNILE9BYkQ7QUFjSDs7OzZCQUVRM0IsTSxFQUFRO0FBQ2IsVUFBSWMsSUFBSSxHQUFHLElBQVg7QUFDQSxVQUFJNEIsU0FBUyxHQUFHLG9CQUFvQjVCLElBQUksQ0FBQ2xCLFFBQUwsQ0FBY29CLE9BQWQsQ0FBc0IwQixTQUExRDtBQUVBN0MsbURBQUMsQ0FBQ2lCLElBQUksQ0FBQ3JCLE9BQU4sQ0FBRCxDQUFnQjJCLEVBQWhCLENBQW1CLE9BQW5CLEVBQTRCLElBQTVCLEVBQWtDLFVBQVNDLENBQVQsRUFBWTtBQUMxQ0EsU0FBQyxDQUFDQyxjQUFGO0FBQ0EsWUFBSWIsS0FBSyxHQUFHWiw2Q0FBQyxDQUFDLElBQUQsQ0FBYjtBQUNBLFlBQUk4QyxJQUFJLEdBQUdsQyxLQUFLLENBQUNQLElBQU4sQ0FBV1ksSUFBSSxDQUFDbEIsUUFBTCxDQUFjZ0QsSUFBekIsQ0FBWCxDQUgwQyxDQUsxQzs7QUFDQS9DLHFEQUFDLENBQUMsZ0JBQUQsQ0FBRCxDQUFvQjBCLFdBQXBCLENBQWdDLGVBQWhDO0FBQ0FkLGFBQUssQ0FBQ0ksUUFBTixDQUFlLGVBQWY7O0FBQ0EsWUFBSUMsSUFBSSxDQUFDbkIsTUFBTCxDQUFZTyxJQUFaLENBQWlCLFFBQWpCLE1BQStCLE9BQW5DLEVBQTRDO0FBQ3hDeUMsY0FBSSxHQUFHQSxJQUFJLENBQUNFLEtBQUwsQ0FBVyxDQUFYLENBQVA7QUFDSCxTQVZ5QyxDQVkxQzs7O0FBQ0EvQixZQUFJLENBQUNuQixNQUFMLENBQVlnQixHQUFaLENBQWdCZ0MsSUFBaEIsRUFiMEMsQ0FlMUM7O0FBQ0EsWUFBSTdCLElBQUksQ0FBQ2xCLFFBQUwsQ0FBY2tELFdBQWxCLEVBQStCO0FBQzNCaEMsY0FBSSxDQUFDa0IsV0FBTCxDQUFpQmhDLE1BQWpCLEVBQXlCUyxLQUFLLENBQUNzQyxPQUFOLENBQWNqQyxJQUFJLENBQUNyQixPQUFuQixDQUF6QixFQUFzRHFCLElBQUksQ0FBQ2xCLFFBQUwsQ0FBYytCLElBQXBFO0FBQ0gsU0FsQnlDLENBb0IxQzs7O0FBQ0FiLFlBQUksQ0FBQ2tDLFVBQUwsQ0FBZ0J2QyxLQUFLLENBQUNQLElBQU4sQ0FBVyxPQUFYLENBQWhCLEVBckIwQyxDQXVCMUM7O0FBQ0FMLHFEQUFDLENBQUMsTUFBRCxDQUFELENBQVVvRCxPQUFWLENBQWtCLHdCQUFsQixFQUE0Q04sSUFBNUM7QUFDSCxPQXpCRDtBQTBCQTlDLG1EQUFDLENBQUNpQixJQUFJLENBQUNyQixPQUFOLENBQUQsQ0FBZ0IyQixFQUFoQixDQUFtQix1QkFBbkIsRUFBNEMsSUFBNUMsRUFBa0QsVUFBU0MsQ0FBVCxFQUFZO0FBQzFELFlBQUlBLENBQUMsQ0FBQ1ksSUFBRixLQUFXLFlBQWYsRUFBNkI7QUFDekJwQyx1REFBQyxDQUFDLElBQUQsQ0FBRCxDQUFRZ0IsUUFBUixDQUFpQjZCLFNBQWpCO0FBQ0gsU0FGRCxNQUVPO0FBQ0g3Qyx1REFBQyxDQUFDLElBQUQsQ0FBRCxDQUFRMEIsV0FBUixDQUFvQm1CLFNBQXBCO0FBQ0g7QUFDSixPQU5EO0FBT0g7OzsrQkFFVTFDLE0sRUFBUWtELE0sRUFBUXZCLEksRUFBTTtBQUM3QixVQUFJQSxJQUFJLEtBQUssUUFBYixFQUF1QjtBQUNuQjlCLHFEQUFDLENBQUMsV0FBRCxDQUFELENBQWUwQixXQUFmLENBQTJCLGdCQUEzQjtBQUNBdkIsY0FBTSxDQUFDSSxJQUFQLENBQVk4QyxNQUFaLEVBQW9CQyxXQUFwQixDQUFnQyxnQkFBaEM7QUFDSCxPQUhELE1BR08sSUFBSXhCLElBQUksS0FBSyxRQUFiLEVBQXVCO0FBQzFCM0IsY0FBTSxDQUFDSSxJQUFQLENBQVksb0JBQVosRUFBa0NTLFFBQWxDLENBQTJDLGNBQTNDO0FBQ0FiLGNBQU0sQ0FBQ0ksSUFBUCxDQUFZLHNCQUFaLEVBQW9DUyxRQUFwQyxDQUE2QyxjQUE3QztBQUNBcUMsY0FBTSxDQUFDckMsUUFBUCxDQUFnQixhQUFoQjtBQUNIOztBQUVEcUMsWUFBTSxDQUFDOUMsSUFBUCxDQUFZLGdCQUFaLEVBQThCbUIsV0FBOUIsQ0FBMEMsZUFBMUM7QUFDQSxVQUFJNkIsWUFBWSxHQUFHLEtBQUt6RCxNQUFMLENBQVlnQixHQUFaLEdBQWtCMEMsT0FBbEIsQ0FBMEIsR0FBMUIsRUFBK0IsR0FBL0IsQ0FBbkI7O0FBQ0EsVUFBSUQsWUFBWSxLQUFLLEVBQXJCLEVBQXlCO0FBQ3JCLFlBQUksS0FBS3hELFFBQUwsQ0FBY2dELElBQWQsS0FBdUIsT0FBM0IsRUFBb0M7QUFDaENNLGdCQUFNLENBQUM5QyxJQUFQLENBQVksTUFBTWdELFlBQWxCLEVBQWdDdkMsUUFBaEMsQ0FBeUMsZUFBekM7QUFDSCxTQUZELE1BRU87QUFDSHFDLGdCQUFNLENBQUM5QyxJQUFQLENBQVksaUJBQWlCZ0QsWUFBakIsR0FBZ0MsSUFBNUMsRUFBa0R2QyxRQUFsRCxDQUEyRCxlQUEzRDtBQUNIO0FBQ0osT0FsQjRCLENBbUI3Qjs7O0FBQ0FoQixtREFBQyxDQUFDLE1BQUQsQ0FBRCxDQUFVb0QsT0FBVixDQUFrQiwwQkFBbEIsRUFBOEN0QixJQUE5QztBQUNIOzs7Z0NBRVczQixNLEVBQVFrRCxNLEVBQVF2QixJLEVBQU07QUFDOUI7QUFDQTlCLG1EQUFDLENBQUMsS0FBS0osT0FBTixDQUFELENBQWdCNkQsR0FBaEIsQ0FBb0IsT0FBcEIsRUFBNkIsSUFBN0I7O0FBRUEsVUFBSTNCLElBQUksS0FBSyxRQUFiLEVBQXVCO0FBQ25CM0IsY0FBTSxDQUFDSSxJQUFQLENBQVk4QyxNQUFaLEVBQW9CM0IsV0FBcEIsQ0FBZ0MsZ0JBQWhDO0FBQ0gsT0FGRCxNQUVPLElBQUlJLElBQUksS0FBSyxRQUFiLEVBQXVCO0FBQzFCOUIscURBQUMsQ0FBQywwQ0FBRCxDQUFELENBQThDMEIsV0FBOUMsQ0FBMEQsY0FBMUQ7QUFDSCxPQVI2QixDQVM5Qjs7O0FBQ0ExQixtREFBQyxDQUFDLE1BQUQsQ0FBRCxDQUFVb0QsT0FBVixDQUFrQiwyQkFBbEIsRUFBK0N0QixJQUEvQztBQUNBOUIsbURBQUMsQ0FBQyxXQUFELENBQUQsQ0FBZTBCLFdBQWYsQ0FBMkIsYUFBM0I7QUFDSDs7OytCQUVVZ0MsTyxFQUFTO0FBQ2hCLFVBQUlwRCxRQUFRLEdBQUdOLDZDQUFDLENBQUMsS0FBS04sT0FBTixDQUFELENBQWdCYSxJQUFoQixDQUFxQixlQUFyQixDQUFmO0FBRUFELGNBQVEsQ0FBQ1UsUUFBVCxDQUFrQixpQkFBbEIsRUFBcUNULElBQXJDLENBQTBDLEdBQTFDLEVBQStDbUIsV0FBL0MsR0FDS1YsUUFETCxDQUNjLEtBQUtuQixXQURuQixFQUVLbUIsUUFGTCxDQUVjMEMsT0FGZDtBQUdBcEQsY0FBUSxDQUFDQyxJQUFULENBQWMsR0FBZCxFQUFtQmUsSUFBbkI7QUFDSDs7Ozs7QUFHTDtBQUNBOzs7QUFDQXRCLCtEQUFBLEdBQW9CLFVBQVNMLE9BQVQsRUFBa0I7QUFDbEMsT0FBS2dFLElBQUwsQ0FBVSxZQUFXO0FBQ2pCLFFBQUksQ0FBQzNELGtEQUFBLENBQU8sSUFBUCxFQUFhLHFCQUFiLENBQUwsRUFBMEM7QUFDdENBLHdEQUFBLENBQU8sSUFBUCxFQUFhLHFCQUFiLEVBQW9DLElBQUlQLGNBQUosQ0FBbUIsSUFBbkIsRUFBeUJFLE9BQXpCLENBQXBDO0FBQ0g7QUFDSixHQUpEO0FBTUEsU0FBTyxJQUFQO0FBQ0gsQ0FSRDs7SUFVcUJpRSxlO0FBRWpCLDJCQUFZakUsT0FBWixFQUFxQjtBQUFBOztBQUFBOztBQUNqQixTQUFLa0UsS0FBTCxHQUFhN0QsNkNBQUMsRUFBZDtBQUNBLFNBQUtMLE9BQUwsR0FBZW1FLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjLEVBQWQsRUFBa0IsS0FBS3ZFLFFBQXZCLEVBQWlDRyxPQUFqQyxDQUFmO0FBRUFLLGlEQUFDLENBQUMsd0JBQUQsQ0FBRCxDQUE0QjJELElBQTVCLENBQWlDLFVBQUNLLEtBQUQsRUFBUXRFLE9BQVI7QUFBQSxhQUFvQixLQUFJLENBQUN1RSxPQUFMLENBQWF2RSxPQUFiLENBQXBCO0FBQUEsS0FBakM7QUFDQU0saURBQUMsQ0FBQyxNQUFELENBQUQsQ0FBVXVCLEVBQVYsQ0FBYSxnQkFBYixFQUErQixLQUFLMkMsYUFBTCxDQUFtQkMsSUFBbkIsQ0FBd0IsSUFBeEIsQ0FBL0I7QUFDSDs7OztrQ0FFYUMsSyxFQUFPQztBQUFNO01BQTBCO0FBQUE7O0FBQ2pELFVBQUlDLE1BQU0sR0FBR3RFLDZDQUFDLENBQUNxRSxNQUFELENBQUQsQ0FBVTlELElBQVYsQ0FBZSx3QkFBZixDQUFiOztBQUNBLFVBQUksQ0FBQytELE1BQU0sQ0FBQ3BDLE1BQVosRUFBb0I7QUFBRTtBQUFTOztBQUUvQm9DLFlBQU0sQ0FBQ1gsSUFBUCxDQUFZLFVBQUNLLEtBQUQsRUFBUU8sS0FBUixFQUFrQjtBQUMxQkEsYUFBSyxHQUFHdkUsNkNBQUMsQ0FBQ3VFLEtBQUQsQ0FBVDs7QUFDQSxZQUFJLENBQUMsQ0FBQyxNQUFJLENBQUNWLEtBQUwsQ0FBV0csS0FBWCxDQUFpQk8sS0FBakIsQ0FBTixFQUErQjtBQUMzQixnQkFBSSxDQUFDTixPQUFMLENBQWFNLEtBQWI7QUFDSDtBQUNKLE9BTEQ7QUFNSDs7OzRCQUVPN0UsTyxFQUFTO0FBQ2JBLGFBQU8sR0FBR00sNkNBQUMsQ0FBQ04sT0FBRCxDQUFYO0FBQ0EsV0FBS21FLEtBQUwsR0FBYSxLQUFLQSxLQUFMLENBQVdXLEdBQVgsQ0FBZTlFLE9BQWYsQ0FBYjtBQUNBQSxhQUFPLENBQUNhLElBQVIsQ0FBYSxjQUFiLEVBQTZCa0UsWUFBN0IsQ0FBMEM7QUFDdEMsZ0JBQVE7QUFEOEIsT0FBMUMsRUFIYSxDQU9iOztBQUNBekUsbURBQUMsQ0FBQyx1QkFBRCxDQUFELENBQTJCMEUsTUFBM0I7QUFDSDs7Ozs7OztBQUdFLElBQUlDLFFBQVEsR0FBRyxJQUFJZixlQUFKLEVBQWYsQyxDQUVQOztBQUNBNUQsNkNBQUMsQ0FBQzRFLFFBQUQsQ0FBRCxDQUFZckQsRUFBWixDQUFlLE9BQWYsRUFBd0IsVUFBQzZDLEtBQUQsRUFBVztBQUMvQixNQUFNQyxNQUFNLEdBQUdyRSw2Q0FBQyxDQUFDb0UsS0FBSyxDQUFDQyxNQUFQLENBQWhCO0FBQ0EsTUFBTVEsS0FBSyxHQUFHLGtEQUFkOztBQUNBLE1BQUksQ0FBQ1IsTUFBTSxDQUFDUyxFQUFQLENBQVVELEtBQVYsQ0FBRCxJQUFxQixDQUFDUixNQUFNLENBQUNuQixPQUFQLENBQWUyQixLQUFmLEVBQXNCM0MsTUFBaEQsRUFBd0Q7QUFDcEQsUUFBTTZDLE9BQU8sR0FBRy9FLDZDQUFDLENBQUMsdUJBQUQsQ0FBakIsQ0FEb0QsQ0FHcEQ7O0FBQ0EsUUFBSStFLE9BQU8sQ0FBQzdDLE1BQVosRUFBb0I7QUFDaEI2QyxhQUFPLENBQUNwQixJQUFSLENBQWEsVUFBQ0ssS0FBRCxFQUFRZ0IsTUFBUixFQUFtQjtBQUM1QixZQUFNQyxNQUFNLEdBQUdqRiw2Q0FBQyxDQUFDZ0YsTUFBRCxDQUFELENBQVVFLFFBQVYsQ0FBbUIsY0FBbkIsQ0FBZjtBQUNBLFlBQU03RSxJQUFJLEdBQUc0RSxNQUFNLENBQUM1RSxJQUFQLENBQVkscUJBQVosQ0FBYjtBQUNBQSxZQUFJLENBQUM4QixXQUFMLENBQWlCOEMsTUFBakIsRUFBeUJqRiw2Q0FBQyxDQUFDSyxJQUFJLENBQUNULE9BQU4sQ0FBMUIsRUFBMENTLElBQUksQ0FBQ04sUUFBTCxDQUFjK0IsSUFBeEQ7QUFDSCxPQUpEO0FBS0g7QUFDSjtBQUNKLENBZkQiLCJmaWxlIjoiLi9hcHAvZm9ybXMvZmllbGRzL2ljb25waWNrZXIuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuXG4vKiBJY29uIFBpY2tlciBieSBRdWVyeUxvb3BcbiAqIEF1dGhvcjogQGVsaW9yaXZlcm9cbiAqIFVSTDogaHR0cDovL3F1ZXJ5bG9vcC5jb20vXG4gKiBMaWNlbnNlOiBHUEx2MlxuICovXG5cbnZhciBkZWZhdWx0cyA9IHtcbiAgICAnbW9kZSc6ICdkaWFsb2cnLCAvLyBzaG93IG92ZXJsYXkgJ2RpYWxvZycgcGFuZWwgb3Igc2xpZGUgZG93biAnaW5saW5lJyBwYW5lbFxuICAgICdjbG9zZU9uUGljayc6IHRydWUsIC8vIHdoZXRoZXIgdG8gY2xvc2UgcGFuZWwgYWZ0ZXIgcGlja2luZyBvciAnbm8nXG4gICAgJ3NhdmUnOiAnY2xhc3MnLCAvLyBzYXZlIGljb24gJ2NsYXNzJyBvciAnY29kZSdcbiAgICAnc2l6ZSc6ICcnLFxuICAgICdjbGFzc2VzJzoge1xuICAgICAgICAnbGF1bmNoZXInOiAnJywgLy8gZXh0cmEgY2xhc3NlcyBmb3IgbGF1bmNoZXIgYnV0dG9uc1xuICAgICAgICAnY2xlYXInOiAncmVtb3ZlLXRpbWVzJywgLy8gZXh0cmEgY2xhc3NlcyBmb3IgYnV0dG9uIHRoYXQgcmVtb3ZlcyBwcmV2aWV3IGFuZCBjbGVhcnMgZmllbGRcbiAgICAgICAgJ2hpZ2hsaWdodCc6ICcnLCAvLyBleHRyYSBjbGFzc2VzIHdoZW4gaGlnaGxpZ2h0aW5nIGFuIGljb25cbiAgICAgICAgJ2Nsb3NlJzogJycgLy8gZXh0cmEgY2xhc3NlcyBmb3IgY2xvc2UgYnV0dG9uXG4gICAgfSxcbiAgICAnaWNvblNldHMnOiB7IC8vIGV4YW1wbGUgZGF0YSBzdHJ1Y3R1cmUuIFVzZWQgdG8gc3BlY2lmeSB3aGljaCBsYXVuY2hlcnMgd2lsbCBiZSBjcmVhdGVkXG4gICAgICAgICdnZW5lcmljb24nOiAnR2VuZXJpY29uJywgLy8gY3JlYXRlIGEgbGF1bmNoZXIgdG8gcGljayBnZW5lcmljb24gaWNvbnNcbiAgICAgICAgJ2ZhJzogJ0ZvbnRBd2Vzb21lJyAvLyBjcmVhdGUgYSBsYXVuY2hlciB0byBwaWNrIGZvbnRhd2Vzb21lIGljb25zXG4gICAgfVxufTtcblxuY2xhc3MgUUxfSWNvbl9QaWNrZXIge1xuXG4gICAgY29uc3RydWN0b3IoZWxlbWVudCwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLmljb25TZXQgPSAnJztcbiAgICAgICAgdGhpcy5pY29uU2V0TmFtZSA9ICcnO1xuICAgICAgICB0aGlzLiRmaWVsZCA9ICcnO1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICB0aGlzLnNldHRpbmdzID0gJC5leHRlbmQoe30sIGRlZmF1bHRzLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5fZGVmYXVsdHMgPSBkZWZhdWx0cztcbiAgICAgICAgdGhpcy5pbml0KCk7XG4gICAgfVxuXG4gICAgaW5pdCgpIHtcbiAgICAgICAgdmFyICRicmljayA9ICQodGhpcy5lbGVtZW50KTtcbiAgICAgICAgdmFyIHBpY2tlcklkID0gJGJyaWNrLmRhdGEoJ3BpY2tlcmlkJyk7XG4gICAgICAgIHZhciAkcHJldmlldyA9ICQoJzxkaXYgY2xhc3M9XCJpY29uLXByZXZpZXcgaWNvbi1wcmV2aWV3LScgKyBwaWNrZXJJZCArICdcIiAvPicpO1xuXG4gICAgICAgIHRoaXMuJGZpZWxkID0gJGJyaWNrLmZpbmQoJ2lucHV0Jyk7XG5cbiAgICAgICAgLy8gQWRkIHByZXZpZXcgYXJlYVxuICAgICAgICB0aGlzLm1ha2VQcmV2aWV3KCRicmljaywgcGlja2VySWQsICRwcmV2aWV3KTtcblxuICAgICAgICAvLyBNYWtlIGJ1dHRvbiB0byBjbGVhciBmaWVsZCBhbmQgcmVtb3ZlIHByZXZpZXdcbiAgICAgICAgdGhpcy5tYWtlQ2xlYXIocGlja2VySWQsICRwcmV2aWV3KTtcblxuICAgICAgICAvLyBNYWtlIGJ1dHRvbnMgdGhhdCBvcGVuIHRoZSBwYW5lbCBvZiBpY29uc1xuICAgICAgICB0aGlzLm1ha2VMYXVuY2hlcnMoJGJyaWNrLCBwaWNrZXJJZCk7XG5cbiAgICAgICAgLy8gUHJlcGFyZSBkaXNwbGF5IHN0eWxlcywgaW5saW5lIGFuZCBkaWFsb2dcbiAgICAgICAgdGhpcy5tYWtlRGlzcGxheSgkYnJpY2spO1xuICAgIH1cblxuICAgIG1ha2VQcmV2aWV3KCRicmljaywgcGlja2VySWQsICRwcmV2aWV3KSB7XG4gICAgICAgIHZhciAkaWNvbiA9ICQoJzxpIC8+Jyk7XG4gICAgICAgIHZhciBpY29uVmFsdWUgPSB0aGlzLiRmaWVsZC52YWwoKTtcblxuICAgICAgICAkcHJldmlldy5wcmVwZW5kVG8oJGJyaWNrKTtcbiAgICAgICAgJGljb24ucHJlcGVuZFRvKCRwcmV2aWV3KTtcbiAgICAgICAgaWYgKGljb25WYWx1ZSAhPT0gJycpIHtcbiAgICAgICAgICAgICRwcmV2aWV3LmFkZENsYXNzKCdpY29uLXByZXZpZXctb24nKTtcbiAgICAgICAgICAgICRpY29uLmFkZENsYXNzKGljb25WYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBtYWtlQ2xlYXIocGlja2VySWQsICRwcmV2aWV3KSB7XG4gICAgICAgIHZhciBiYXNlID0gdGhpcztcbiAgICAgICAgdmFyICRjbGVhciA9ICQoJzxhIGNsYXNzPVwicmVtb3ZlLWljb24gJyArIGJhc2Uuc2V0dGluZ3MuY2xhc3Nlcy5jbGVhciArICdcIiAvPicpO1xuXG4gICAgICAgIC8vIEhpZGUgYnV0dG9uIHRvIHJlbW92ZSBpY29uIGFuZCBwcmV2aWV3IGFuZCBhcHBlbmQgaXQgdG8gcHJldmlldyBhcmVhXG4gICAgICAgICRjbGVhci5oaWRlKCkucHJlcGVuZFRvKCRwcmV2aWV3KTtcbiAgICAgICAgLy8gSWYgdGhlcmUncyBhIGljb24gc2F2ZWQgaW4gdGhlIGZpZWxkLCBzaG93IHJlbW92ZSBpY29uIGJ1dHRvblxuICAgICAgICBpZiAoYmFzZS4kZmllbGQudmFsKCkgIT09ICcnKSB7XG4gICAgICAgICAgICAkY2xlYXIuc2hvdygpO1xuICAgICAgICB9XG5cbiAgICAgICAgJHByZXZpZXcub24oJ2NsaWNrJywgJy5yZW1vdmUtaWNvbicsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGJhc2UuJGZpZWxkLnZhbCgnJyk7XG4gICAgICAgICAgICAkcHJldmlldy5yZW1vdmVDbGFzcygnaWNvbi1wcmV2aWV3LW9uJykuZmluZCgnaScpLnJlbW92ZUNsYXNzKCk7XG4gICAgICAgICAgICAkKHRoaXMpLmhpZGUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbWFrZURpc3BsYXkoJGJyaWNrKSB7XG4gICAgICAgIHZhciBiYXNlID0gdGhpcztcbiAgICAgICAgdmFyIGNsb3NlID0gYmFzZS5zZXR0aW5ncy5jbGFzc2VzLmNsb3NlO1xuICAgICAgICB2YXIgJGJvZHkgPSAkKCdib2R5Jyk7XG5cbiAgICAgICAgdmFyICRjbG9zZSA9ICQoJzxhIGhyZWY9XCIjXCIgY2xhc3M9XCJpY29uLXBpY2tlci1jbG9zZVwiLz4nKTtcblxuICAgICAgICBpZiAoYmFzZS5zZXR0aW5ncy5tb2RlID09PSAnaW5saW5lJykge1xuICAgICAgICAgICAgJGJyaWNrLmZpbmQoJy5pY29uLXNldCcpLmFwcGVuZCgkY2xvc2UpLnJlbW92ZUNsYXNzKCdkaWFsb2cnKS5hZGRDbGFzcygnaXAtaW5saW5lICcgKyBiYXNlLnNldHRpbmdzLnNpemUpLnBhcmVudCgpLmFkZENsYXNzKCdpY29uLXNldC13cmFwJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoYmFzZS5zZXR0aW5ncy5tb2RlID09PSAnZGlhbG9nJykge1xuICAgICAgICAgICAgJCgnLmljb24tc2V0JykuYWRkQ2xhc3MoJ2RpYWxvZyAnICsgYmFzZS5zZXR0aW5ncy5zaXplKTtcbiAgICAgICAgICAgIGlmICgkKCcuaWNvbi1waWNrZXItb3ZlcmxheScpLmxlbmd0aCA8PSAwKSB7XG4gICAgICAgICAgICAgICAgJGJvZHkuYXBwZW5kKCc8ZGl2IGNsYXNzPVwiaWNvbi1waWNrZXItb3ZlcmxheVwiLz4nKS5hcHBlbmQoJGNsb3NlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAkYm9keVxuICAgICAgICAgICAgLm9uKCdjbGljaycsICcuaWNvbi1waWNrZXItY2xvc2UsIC5pY29uLXBpY2tlci1vdmVybGF5JywgZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBiYXNlLmNsb3NlUGlja2VyKCRicmljaywgJChiYXNlLmljb25TZXQpLCBiYXNlLnNldHRpbmdzLm1vZGUpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5vbignbW91c2VlbnRlciBtb3VzZWxlYXZlJywgJy5pY29uLXBpY2tlci1jbG9zZScsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS50eXBlID09PSAnbW91c2VlbnRlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcyhjbG9zZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmVDbGFzcyhjbG9zZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbWFrZUxhdW5jaGVycygkYnJpY2spIHtcbiAgICAgICAgdmFyIGJhc2UgPSB0aGlzO1xuICAgICAgICB2YXIgZGF0YUljb25TZXRzID0gJGJyaWNrLmRhdGEoJ2ljb25zZXRzJyk7XG4gICAgICAgIHZhciBpY29uU2V0O1xuXG4gICAgICAgIGlmICh0eXBlb2YgZGF0YUljb25TZXRzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgZGF0YUljb25TZXRzID0gYmFzZS5zZXR0aW5ncy5pY29uU2V0cztcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGljb25TZXQgaW4gZGF0YUljb25TZXRzKSB7XG4gICAgICAgICAgICBpZiAoZGF0YUljb25TZXRzLmhhc093blByb3BlcnR5KGljb25TZXQpKSB7XG4gICAgICAgICAgICAgICAgJGJyaWNrLmFwcGVuZCgnPGEgY2xhc3M9XCJsYXVuY2gtaWNvbnMgYnV0dG9uICcgKyBiYXNlLnNldHRpbmdzLmNsYXNzZXMubGF1bmNoZXIgKyAnXCIgZGF0YS1pY29ucz1cIicgKyBpY29uU2V0ICsgJ1wiPicgKyBkYXRhSWNvblNldHNbaWNvblNldF0gKyAnPC9hPicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgJGJyaWNrLmZpbmQoJy5sYXVuY2gtaWNvbnMnKS5vbignY2xpY2snLCBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB2YXIgJHNlbGYgPSAkKHRoaXMpO1xuICAgICAgICAgICAgdmFyIHRoZXNlSWNvbnMgPSAkc2VsZi5kYXRhKCdpY29ucycpO1xuXG4gICAgICAgICAgICBiYXNlLmljb25TZXROYW1lID0gdGhlc2VJY29ucztcbiAgICAgICAgICAgIGJhc2UuaWNvblNldCA9ICcuJyArIHRoZXNlSWNvbnMgKyAnLXNldCc7XG5cbiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgcGlja2VyXG4gICAgICAgICAgICBiYXNlLmljb25QaWNrKCRicmljayk7XG5cbiAgICAgICAgICAgIC8vIFNob3cgaWNvbiBwaWNrZXJcbiAgICAgICAgICAgIGJhc2Uuc2hvd1BpY2tlcigkYnJpY2ssICQoYmFzZS5pY29uU2V0KSwgYmFzZS5zZXR0aW5ncy5tb2RlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWNvblBpY2soJGJyaWNrKSB7XG4gICAgICAgIHZhciBiYXNlID0gdGhpcztcbiAgICAgICAgdmFyIGhpZ2hsaWdodCA9ICdpY29uLWhpZ2hsaWdodCAnICsgYmFzZS5zZXR0aW5ncy5jbGFzc2VzLmhpZ2hsaWdodDtcblxuICAgICAgICAkKGJhc2UuaWNvblNldCkub24oJ2NsaWNrJywgJ2xpJywgZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdmFyICRpY29uID0gJCh0aGlzKTtcbiAgICAgICAgICAgIHZhciBpY29uID0gJGljb24uZGF0YShiYXNlLnNldHRpbmdzLnNhdmUpO1xuXG4gICAgICAgICAgICAvLyBNYXJrIGFzIHNlbGVjdGVkXG4gICAgICAgICAgICAkKCcuaWNvbi1zZWxlY3RlZCcpLnJlbW92ZUNsYXNzKCdpY29uLXNlbGVjdGVkJyk7XG4gICAgICAgICAgICAkaWNvbi5hZGRDbGFzcygnaWNvbi1zZWxlY3RlZCcpO1xuICAgICAgICAgICAgaWYgKGJhc2UuJGZpZWxkLmRhdGEoJ2Zvcm1hdCcpID09PSAnc2hvcnQnKSB7XG4gICAgICAgICAgICAgICAgaWNvbiA9IGljb24uc2xpY2UoNik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNhdmUgaWNvbiB2YWx1ZSB0byBmaWVsZFxuICAgICAgICAgICAgYmFzZS4kZmllbGQudmFsKGljb24pO1xuXG4gICAgICAgICAgICAvLyBDbG9zZSBpY29uIHBpY2tlclxuICAgICAgICAgICAgaWYgKGJhc2Uuc2V0dGluZ3MuY2xvc2VPblBpY2spIHtcbiAgICAgICAgICAgICAgICBiYXNlLmNsb3NlUGlja2VyKCRicmljaywgJGljb24uY2xvc2VzdChiYXNlLmljb25TZXQpLCBiYXNlLnNldHRpbmdzLm1vZGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTZXQgcHJldmlld1xuICAgICAgICAgICAgYmFzZS5zZXRQcmV2aWV3KCRpY29uLmRhdGEoJ2NsYXNzJykpO1xuXG4gICAgICAgICAgICAvLyBCcm9hZGNhc3QgZXZlbnQgcGFzc2luZyB0aGUgc2VsZWN0ZWQgaWNvbi5cbiAgICAgICAgICAgICQoJ2JvZHknKS50cmlnZ2VyKCdpY29uc2VsZWN0ZWQucXVlcnlsb29wJywgaWNvbik7XG4gICAgICAgIH0pO1xuICAgICAgICAkKGJhc2UuaWNvblNldCkub24oJ21vdXNlZW50ZXIgbW91c2VsZWF2ZScsICdsaScsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIGlmIChlLnR5cGUgPT09ICdtb3VzZWVudGVyJykge1xuICAgICAgICAgICAgICAgICQodGhpcykuYWRkQ2xhc3MoaGlnaGxpZ2h0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmVDbGFzcyhoaWdobGlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzaG93UGlja2VyKCRicmljaywgJGljb25zLCBtb2RlKSB7XG4gICAgICAgIGlmIChtb2RlID09PSAnaW5saW5lJykge1xuICAgICAgICAgICAgJCgnLmljb24tc2V0JykucmVtb3ZlQ2xhc3MoJ2lwLWlubGluZS1vcGVuJyk7XG4gICAgICAgICAgICAkYnJpY2suZmluZCgkaWNvbnMpLnRvZ2dsZUNsYXNzKCdpcC1pbmxpbmUtb3BlbicpO1xuICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT09ICdkaWFsb2cnKSB7XG4gICAgICAgICAgICAkYnJpY2suZmluZCgnLmljb24tcGlja2VyLWNsb3NlJykuYWRkQ2xhc3MoJ21ha2UtdmlzaWJsZScpO1xuICAgICAgICAgICAgJGJyaWNrLmZpbmQoJy5pY29uLXBpY2tlci1vdmVybGF5JykuYWRkQ2xhc3MoJ21ha2UtdmlzaWJsZScpO1xuICAgICAgICAgICAgJGljb25zLmFkZENsYXNzKCdkaWFsb2ctb3BlbicpO1xuICAgICAgICB9XG5cbiAgICAgICAgJGljb25zLmZpbmQoJy5pY29uLXNlbGVjdGVkJykucmVtb3ZlQ2xhc3MoJ2ljb24tc2VsZWN0ZWQnKTtcbiAgICAgICAgdmFyIHNlbGVjdGVkSWNvbiA9IHRoaXMuJGZpZWxkLnZhbCgpLnJlcGxhY2UoJyAnLCAnLicpO1xuICAgICAgICBpZiAoc2VsZWN0ZWRJY29uICE9PSAnJykge1xuICAgICAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3Muc2F2ZSA9PT0gJ2NsYXNzJykge1xuICAgICAgICAgICAgICAgICRpY29ucy5maW5kKCcuJyArIHNlbGVjdGVkSWNvbikuYWRkQ2xhc3MoJ2ljb24tc2VsZWN0ZWQnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgJGljb25zLmZpbmQoJ1tkYXRhLWNvZGU9XCInICsgc2VsZWN0ZWRJY29uICsgJ1wiXScpLmFkZENsYXNzKCdpY29uLXNlbGVjdGVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQnJvYWRjYXN0IGV2ZW50IHdoZW4gdGhlIHBpY2tlciBpcyBzaG93biBwYXNzaW5nIHRoZSBwaWNrZXIgbW9kZS5cbiAgICAgICAgJCgnYm9keScpLnRyaWdnZXIoJ2ljb25waWNrZXJzaG93LnF1ZXJ5bG9vcCcsIG1vZGUpO1xuICAgIH1cblxuICAgIGNsb3NlUGlja2VyKCRicmljaywgJGljb25zLCBtb2RlKSB7XG4gICAgICAgIC8vIFJlbW92ZSBldmVudCBzbyB0aGV5IGRvbid0IGZpcmUgZnJvbSBhIGRpZmZlcmVudCBwaWNrZXJcbiAgICAgICAgJCh0aGlzLmljb25TZXQpLm9mZignY2xpY2snLCAnbGknKTtcblxuICAgICAgICBpZiAobW9kZSA9PT0gJ2lubGluZScpIHtcbiAgICAgICAgICAgICRicmljay5maW5kKCRpY29ucykucmVtb3ZlQ2xhc3MoJ2lwLWlubGluZS1vcGVuJyk7XG4gICAgICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gJ2RpYWxvZycpIHtcbiAgICAgICAgICAgICQoJy5pY29uLXBpY2tlci1jbG9zZSwgLmljb24tcGlja2VyLW92ZXJsYXknKS5yZW1vdmVDbGFzcygnbWFrZS12aXNpYmxlJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQnJvYWRjYXN0IGV2ZW50IHdoZW4gdGhlIHBpY2tlciBpcyBjbG9zZWQgcGFzc2luZyB0aGUgcGlja2VyIG1vZGUuXG4gICAgICAgICQoJ2JvZHknKS50cmlnZ2VyKCdpY29ucGlja2VyY2xvc2UucXVlcnlsb29wJywgbW9kZSk7XG4gICAgICAgICQoJy5pY29uLXNldCcpLnJlbW92ZUNsYXNzKCdkaWFsb2ctb3BlbicpO1xuICAgIH1cblxuICAgIHNldFByZXZpZXcocHJldmlldykge1xuICAgICAgICB2YXIgJHByZXZpZXcgPSAkKHRoaXMuZWxlbWVudCkuZmluZCgnLmljb24tcHJldmlldycpO1xuXG4gICAgICAgICRwcmV2aWV3LmFkZENsYXNzKCdpY29uLXByZXZpZXctb24nKS5maW5kKCdpJykucmVtb3ZlQ2xhc3MoKVxuICAgICAgICAgICAgLmFkZENsYXNzKHRoaXMuaWNvblNldE5hbWUpXG4gICAgICAgICAgICAuYWRkQ2xhc3MocHJldmlldyk7XG4gICAgICAgICRwcmV2aWV3LmZpbmQoJ2EnKS5zaG93KCk7XG4gICAgfVxufVxuXG4vKiBHcmF2ICovXG4vLyBleHRlbmQgJCB3aXRoIDNyZCBwYXJ0eSBRTCBJY29uIFBpY2tlclxuJC5mbi5xbEljb25QaWNrZXIgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoISQuZGF0YSh0aGlzLCAncGx1Z2luX3FsSWNvblBpY2tlcicpKSB7XG4gICAgICAgICAgICAkLmRhdGEodGhpcywgJ3BsdWdpbl9xbEljb25QaWNrZXInLCBuZXcgUUxfSWNvbl9QaWNrZXIodGhpcywgb3B0aW9ucykpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEljb25waWNrZXJGaWVsZCB7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuaXRlbXMgPSAkKCk7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuZGVmYXVsdHMsIG9wdGlvbnMpO1xuXG4gICAgICAgICQoJ1tkYXRhLWdyYXYtaWNvbnBpY2tlcl0nKS5lYWNoKChpbmRleCwgZWxlbWVudCkgPT4gdGhpcy5hZGRJdGVtKGVsZW1lbnQpKTtcbiAgICAgICAgJCgnYm9keScpLm9uKCdtdXRhdGlvbi5fZ3JhdicsIHRoaXMuX29uQWRkZWROb2Rlcy5iaW5kKHRoaXMpKTtcbiAgICB9XG5cbiAgICBfb25BZGRlZE5vZGVzKGV2ZW50LCB0YXJnZXQvKiAsIHJlY29yZCwgaW5zdGFuY2UgKi8pIHtcbiAgICAgICAgbGV0IGZpZWxkcyA9ICQodGFyZ2V0KS5maW5kKCdbZGF0YS1ncmF2LWljb25waWNrZXJdJyk7XG4gICAgICAgIGlmICghZmllbGRzLmxlbmd0aCkgeyByZXR1cm47IH1cblxuICAgICAgICBmaWVsZHMuZWFjaCgoaW5kZXgsIGZpZWxkKSA9PiB7XG4gICAgICAgICAgICBmaWVsZCA9ICQoZmllbGQpO1xuICAgICAgICAgICAgaWYgKCF+dGhpcy5pdGVtcy5pbmRleChmaWVsZCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW0oZmllbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhZGRJdGVtKGVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7XG4gICAgICAgIHRoaXMuaXRlbXMgPSB0aGlzLml0ZW1zLmFkZChlbGVtZW50KTtcbiAgICAgICAgZWxlbWVudC5maW5kKCcuaWNvbi1waWNrZXInKS5xbEljb25QaWNrZXIoe1xuICAgICAgICAgICAgJ3NhdmUnOiAnY2xhc3MnXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGhhY2sgdG8gcmVtb3ZlIGV4dHJhIGljb24gc2V0cyB0aGF0IGFyZSBqdXN0IGNvcGllc1xuICAgICAgICAkKCcuaWNvbi1zZXQ6bm90KDpmaXJzdCknKS5yZW1vdmUoKTtcbiAgICB9XG59XG5cbmV4cG9ydCBsZXQgSW5zdGFuY2UgPSBuZXcgSWNvbnBpY2tlckZpZWxkKCk7XG5cbi8vIEZpeCB0byBjbG9zZSB0aGUgZGlhbG9nIHdoZW4gY2xpY2tpbmcgb3V0c2lkZVxuJChkb2N1bWVudCkub24oJ2NsaWNrJywgKGV2ZW50KSA9PiB7XG4gICAgY29uc3QgdGFyZ2V0ID0gJChldmVudC50YXJnZXQpO1xuICAgIGNvbnN0IG1hdGNoID0gJy5pY29uLXNldC5kaWFsb2ctb3BlbiwgLmxhdW5jaC1pY29uc1tkYXRhLWljb25zXSc7XG4gICAgaWYgKCF0YXJnZXQuaXMobWF0Y2gpICYmICF0YXJnZXQuY2xvc2VzdChtYXRjaCkubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGRpYWxvZ3MgPSAkKCcuaWNvbi1zZXQuZGlhbG9nLW9wZW4nKTtcblxuICAgICAgICAvLyBza2lwIGlmIHRoZXJlJ3Mgbm8gZGlhbG9nIG9wZW5cbiAgICAgICAgaWYgKGRpYWxvZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgICBkaWFsb2dzLmVhY2goKGluZGV4LCBkaWFsb2cpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwaWNrZXIgPSAkKGRpYWxvZykuc2libGluZ3MoJy5pY29uLXBpY2tlcicpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBwaWNrZXIuZGF0YSgncGx1Z2luX3FsSWNvblBpY2tlcicpO1xuICAgICAgICAgICAgICAgIGRhdGEuY2xvc2VQaWNrZXIocGlja2VyLCAkKGRhdGEuaWNvblNldCksIGRhdGEuc2V0dGluZ3MubW9kZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbn0pO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./app/forms/fields/iconpicker.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ IconpickerField),\n/* harmony export */ \"Instance\": () => (/* binding */ Instance)\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n/* Icon Picker by QueryLoop\n * Author: @eliorivero\n * URL: http://queryloop.com/\n * License: GPLv2\n */\n\nvar defaults = {\n 'mode': 'dialog',\n // show overlay 'dialog' panel or slide down 'inline' panel\n 'closeOnPick': true,\n // whether to close panel after picking or 'no'\n 'save': 'class',\n // save icon 'class' or 'code'\n 'size': '',\n 'classes': {\n 'launcher': '',\n // extra classes for launcher buttons\n 'clear': 'remove-times',\n // extra classes for button that removes preview and clears field\n 'highlight': '',\n // extra classes when highlighting an icon\n 'close': '' // extra classes for close button\n\n },\n 'iconSets': {\n // example data structure. Used to specify which launchers will be created\n 'genericon': 'Genericon',\n // create a launcher to pick genericon icons\n 'fa': 'FontAwesome' // create a launcher to pick fontawesome icons\n\n }\n};\n\nvar QL_Icon_Picker = /*#__PURE__*/function () {\n function QL_Icon_Picker(element, options) {\n _classCallCheck(this, QL_Icon_Picker);\n\n this.iconSet = '';\n this.iconSetName = '';\n this.$field = '';\n this.element = element;\n this.settings = jquery__WEBPACK_IMPORTED_MODULE_0___default().extend({}, defaults, options);\n this._defaults = defaults;\n this.init();\n }\n\n _createClass(QL_Icon_Picker, [{\n key: \"init\",\n value: function init() {\n var $brick = jquery__WEBPACK_IMPORTED_MODULE_0___default()(this.element);\n var pickerId = $brick.data('pickerid');\n var $preview = jquery__WEBPACK_IMPORTED_MODULE_0___default()('
          ');\n this.$field = $brick.find('input'); // Add preview area\n\n this.makePreview($brick, pickerId, $preview); // Make button to clear field and remove preview\n\n this.makeClear(pickerId, $preview); // Make buttons that open the panel of icons\n\n this.makeLaunchers($brick, pickerId); // Prepare display styles, inline and dialog\n\n this.makeDisplay($brick);\n }\n }, {\n key: \"makePreview\",\n value: function makePreview($brick, pickerId, $preview) {\n var $icon = jquery__WEBPACK_IMPORTED_MODULE_0___default()('');\n var iconValue = this.$field.val();\n $preview.prependTo($brick);\n $icon.prependTo($preview);\n\n if (iconValue !== '') {\n $preview.addClass('icon-preview-on');\n $icon.addClass(iconValue);\n }\n }\n }, {\n key: \"makeClear\",\n value: function makeClear(pickerId, $preview) {\n var base = this;\n var $clear = jquery__WEBPACK_IMPORTED_MODULE_0___default()(''); // Hide button to remove icon and preview and append it to preview area\n\n $clear.hide().prependTo($preview); // If there's a icon saved in the field, show remove icon button\n\n if (base.$field.val() !== '') {\n $clear.show();\n }\n\n $preview.on('click', '.remove-icon', function (e) {\n e.preventDefault();\n base.$field.val('');\n $preview.removeClass('icon-preview-on').find('i').removeClass();\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(this).hide();\n });\n }\n }, {\n key: \"makeDisplay\",\n value: function makeDisplay($brick) {\n var base = this;\n var close = base.settings.classes.close;\n var $body = jquery__WEBPACK_IMPORTED_MODULE_0___default()('body');\n var $close = jquery__WEBPACK_IMPORTED_MODULE_0___default()('');\n\n if (base.settings.mode === 'inline') {\n $brick.find('.icon-set').append($close).removeClass('dialog').addClass('ip-inline ' + base.settings.size).parent().addClass('icon-set-wrap');\n } else if (base.settings.mode === 'dialog') {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.icon-set').addClass('dialog ' + base.settings.size);\n\n if (jquery__WEBPACK_IMPORTED_MODULE_0___default()('.icon-picker-overlay').length <= 0) {\n $body.append('
          ').append($close);\n }\n }\n\n $body.on('click', '.icon-picker-close, .icon-picker-overlay', function (e) {\n e.preventDefault();\n base.closePicker($brick, jquery__WEBPACK_IMPORTED_MODULE_0___default()(base.iconSet), base.settings.mode);\n }).on('mouseenter mouseleave', '.icon-picker-close', function (e) {\n if (e.type === 'mouseenter') {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(this).addClass(close);\n } else {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(this).removeClass(close);\n }\n });\n }\n }, {\n key: \"makeLaunchers\",\n value: function makeLaunchers($brick) {\n var base = this;\n var dataIconSets = $brick.data('iconsets');\n var iconSet;\n\n if (typeof dataIconSets === 'undefined') {\n dataIconSets = base.settings.iconSets;\n }\n\n for (iconSet in dataIconSets) {\n if (dataIconSets.hasOwnProperty(iconSet)) {\n $brick.append('' + dataIconSets[iconSet] + '');\n }\n }\n\n $brick.find('.launch-icons').on('click', function (e) {\n e.preventDefault();\n var $self = jquery__WEBPACK_IMPORTED_MODULE_0___default()(this);\n var theseIcons = $self.data('icons');\n base.iconSetName = theseIcons;\n base.iconSet = '.' + theseIcons + '-set'; // Initialize picker\n\n base.iconPick($brick); // Show icon picker\n\n base.showPicker($brick, jquery__WEBPACK_IMPORTED_MODULE_0___default()(base.iconSet), base.settings.mode);\n });\n }\n }, {\n key: \"iconPick\",\n value: function iconPick($brick) {\n var base = this;\n var highlight = 'icon-highlight ' + base.settings.classes.highlight;\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(base.iconSet).on('click', 'li', function (e) {\n e.preventDefault();\n var $icon = jquery__WEBPACK_IMPORTED_MODULE_0___default()(this);\n var icon = $icon.data(base.settings.save); // Mark as selected\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.icon-selected').removeClass('icon-selected');\n $icon.addClass('icon-selected');\n\n if (base.$field.data('format') === 'short') {\n icon = icon.slice(6);\n } // Save icon value to field\n\n\n base.$field.val(icon); // Close icon picker\n\n if (base.settings.closeOnPick) {\n base.closePicker($brick, $icon.closest(base.iconSet), base.settings.mode);\n } // Set preview\n\n\n base.setPreview($icon.data('class')); // Broadcast event passing the selected icon.\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('body').trigger('iconselected.queryloop', icon);\n });\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(base.iconSet).on('mouseenter mouseleave', 'li', function (e) {\n if (e.type === 'mouseenter') {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(this).addClass(highlight);\n } else {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(this).removeClass(highlight);\n }\n });\n }\n }, {\n key: \"showPicker\",\n value: function showPicker($brick, $icons, mode) {\n if (mode === 'inline') {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.icon-set').removeClass('ip-inline-open');\n $brick.find($icons).toggleClass('ip-inline-open');\n } else if (mode === 'dialog') {\n $brick.find('.icon-picker-close').addClass('make-visible');\n $brick.find('.icon-picker-overlay').addClass('make-visible');\n $icons.addClass('dialog-open');\n }\n\n $icons.find('.icon-selected').removeClass('icon-selected');\n var selectedIcon = this.$field.val().replace(' ', '.');\n\n if (selectedIcon !== '') {\n if (this.settings.save === 'class') {\n $icons.find('.' + selectedIcon).addClass('icon-selected');\n } else {\n $icons.find('[data-code=\"' + selectedIcon + '\"]').addClass('icon-selected');\n }\n } // Broadcast event when the picker is shown passing the picker mode.\n\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('body').trigger('iconpickershow.queryloop', mode);\n }\n }, {\n key: \"closePicker\",\n value: function closePicker($brick, $icons, mode) {\n // Remove event so they don't fire from a different picker\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(this.iconSet).off('click', 'li');\n\n if (mode === 'inline') {\n $brick.find($icons).removeClass('ip-inline-open');\n } else if (mode === 'dialog') {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.icon-picker-close, .icon-picker-overlay').removeClass('make-visible');\n } // Broadcast event when the picker is closed passing the picker mode.\n\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('body').trigger('iconpickerclose.queryloop', mode);\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.icon-set').removeClass('dialog-open');\n }\n }, {\n key: \"setPreview\",\n value: function setPreview(preview) {\n var $preview = jquery__WEBPACK_IMPORTED_MODULE_0___default()(this.element).find('.icon-preview');\n $preview.addClass('icon-preview-on').find('i').removeClass().addClass(this.iconSetName).addClass(preview);\n $preview.find('a').show();\n }\n }]);\n\n return QL_Icon_Picker;\n}();\n/* Grav */\n// extend $ with 3rd party QL Icon Picker\n\n\n(jquery__WEBPACK_IMPORTED_MODULE_0___default().fn.qlIconPicker) = function (options) {\n this.each(function () {\n if (!jquery__WEBPACK_IMPORTED_MODULE_0___default().data(this, 'plugin_qlIconPicker')) {\n jquery__WEBPACK_IMPORTED_MODULE_0___default().data(this, 'plugin_qlIconPicker', new QL_Icon_Picker(this, options));\n }\n });\n return this;\n};\n\nvar IconpickerField = /*#__PURE__*/function () {\n function IconpickerField(options) {\n var _this = this;\n\n _classCallCheck(this, IconpickerField);\n\n this.items = jquery__WEBPACK_IMPORTED_MODULE_0___default()();\n this.options = Object.assign({}, this.defaults, options);\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-grav-iconpicker]').each(function (index, element) {\n return _this.addItem(element);\n });\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('body').on('mutation._grav', this._onAddedNodes.bind(this));\n }\n\n _createClass(IconpickerField, [{\n key: \"_onAddedNodes\",\n value: function _onAddedNodes(event, target\n /* , record, instance */\n ) {\n var _this2 = this;\n\n var fields = jquery__WEBPACK_IMPORTED_MODULE_0___default()(target).find('[data-grav-iconpicker]');\n\n if (!fields.length) {\n return;\n }\n\n fields.each(function (index, field) {\n field = jquery__WEBPACK_IMPORTED_MODULE_0___default()(field);\n\n if (!~_this2.items.index(field)) {\n _this2.addItem(field);\n }\n });\n }\n }, {\n key: \"addItem\",\n value: function addItem(element) {\n element = jquery__WEBPACK_IMPORTED_MODULE_0___default()(element);\n this.items = this.items.add(element);\n element.find('.icon-picker').qlIconPicker({\n 'save': 'class'\n }); // hack to remove extra icon sets that are just copies\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.icon-set:not(:first)').remove();\n }\n }]);\n\n return IconpickerField;\n}();\n\n\nvar Instance = new IconpickerField(); // Fix to close the dialog when clicking outside\n\njquery__WEBPACK_IMPORTED_MODULE_0___default()(document).on('click', function (event) {\n var target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.target);\n var match = '.icon-set.dialog-open, .launch-icons[data-icons]';\n\n if (!target.is(match) && !target.closest(match).length) {\n var dialogs = jquery__WEBPACK_IMPORTED_MODULE_0___default()('.icon-set.dialog-open'); // skip if there's no dialog open\n\n if (dialogs.length) {\n dialogs.each(function (index, dialog) {\n var picker = jquery__WEBPACK_IMPORTED_MODULE_0___default()(dialog).siblings('.icon-picker');\n var data = picker.data('plugin_qlIconPicker');\n data.closePicker(picker, jquery__WEBPACK_IMPORTED_MODULE_0___default()(data.iconSet), data.settings.mode);\n });\n }\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL2Zvcm1zL2ZpZWxkcy9pY29ucGlja2VyLmpzPzVkNDEiXSwibmFtZXMiOlsiZGVmYXVsdHMiLCJRTF9JY29uX1BpY2tlciIsImVsZW1lbnQiLCJvcHRpb25zIiwiaWNvblNldCIsImljb25TZXROYW1lIiwiJGZpZWxkIiwic2V0dGluZ3MiLCIkIiwiX2RlZmF1bHRzIiwiaW5pdCIsIiRicmljayIsInBpY2tlcklkIiwiZGF0YSIsIiRwcmV2aWV3IiwiZmluZCIsIm1ha2VQcmV2aWV3IiwibWFrZUNsZWFyIiwibWFrZUxhdW5jaGVycyIsIm1ha2VEaXNwbGF5IiwiJGljb24iLCJpY29uVmFsdWUiLCJ2YWwiLCJwcmVwZW5kVG8iLCJhZGRDbGFzcyIsImJhc2UiLCIkY2xlYXIiLCJjbGFzc2VzIiwiY2xlYXIiLCJoaWRlIiwic2hvdyIsIm9uIiwiZSIsInByZXZlbnREZWZhdWx0IiwicmVtb3ZlQ2xhc3MiLCJjbG9zZSIsIiRib2R5IiwiJGNsb3NlIiwibW9kZSIsImFwcGVuZCIsInNpemUiLCJwYXJlbnQiLCJsZW5ndGgiLCJjbG9zZVBpY2tlciIsInR5cGUiLCJkYXRhSWNvblNldHMiLCJpY29uU2V0cyIsImhhc093blByb3BlcnR5IiwibGF1bmNoZXIiLCIkc2VsZiIsInRoZXNlSWNvbnMiLCJpY29uUGljayIsInNob3dQaWNrZXIiLCJoaWdobGlnaHQiLCJpY29uIiwic2F2ZSIsInNsaWNlIiwiY2xvc2VPblBpY2siLCJjbG9zZXN0Iiwic2V0UHJldmlldyIsInRyaWdnZXIiLCIkaWNvbnMiLCJ0b2dnbGVDbGFzcyIsInNlbGVjdGVkSWNvbiIsInJlcGxhY2UiLCJvZmYiLCJwcmV2aWV3IiwiZWFjaCIsIkljb25waWNrZXJGaWVsZCIsIml0ZW1zIiwiT2JqZWN0IiwiYXNzaWduIiwiaW5kZXgiLCJhZGRJdGVtIiwiX29uQWRkZWROb2RlcyIsImJpbmQiLCJldmVudCIsInRhcmdldCIsImZpZWxkcyIsImZpZWxkIiwiYWRkIiwicWxJY29uUGlja2VyIiwicmVtb3ZlIiwiSW5zdGFuY2UiLCJkb2N1bWVudCIsIm1hdGNoIiwiaXMiLCJkaWFsb2dzIiwiZGlhbG9nIiwicGlja2VyIiwic2libGluZ3MiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsSUFBSUEsUUFBUSxHQUFHO0FBQ1gsVUFBUSxRQURHO0FBQ087QUFDbEIsaUJBQWUsSUFGSjtBQUVVO0FBQ3JCLFVBQVEsT0FIRztBQUdNO0FBQ2pCLFVBQVEsRUFKRztBQUtYLGFBQVc7QUFDUCxnQkFBWSxFQURMO0FBQ1M7QUFDaEIsYUFBUyxjQUZGO0FBRWtCO0FBQ3pCLGlCQUFhLEVBSE47QUFHVTtBQUNqQixhQUFTLEVBSkYsQ0FJSzs7QUFKTCxHQUxBO0FBV1gsY0FBWTtBQUFFO0FBQ1YsaUJBQWEsV0FETDtBQUNrQjtBQUMxQixVQUFNLGFBRkUsQ0FFWTs7QUFGWjtBQVhELENBQWY7O0lBaUJNQyxjO0FBRUYsMEJBQVlDLE9BQVosRUFBcUJDLE9BQXJCLEVBQThCO0FBQUE7O0FBQzFCLFNBQUtDLE9BQUwsR0FBZSxFQUFmO0FBQ0EsU0FBS0MsV0FBTCxHQUFtQixFQUFuQjtBQUNBLFNBQUtDLE1BQUwsR0FBYyxFQUFkO0FBQ0EsU0FBS0osT0FBTCxHQUFlQSxPQUFmO0FBQ0EsU0FBS0ssUUFBTCxHQUFnQkMsb0RBQUEsQ0FBUyxFQUFULEVBQWFSLFFBQWIsRUFBdUJHLE9BQXZCLENBQWhCO0FBQ0EsU0FBS00sU0FBTCxHQUFpQlQsUUFBakI7QUFDQSxTQUFLVSxJQUFMO0FBQ0g7Ozs7V0FFRCxnQkFBTztBQUNILFVBQUlDLE1BQU0sR0FBR0gsNkNBQUMsQ0FBQyxLQUFLTixPQUFOLENBQWQ7QUFDQSxVQUFJVSxRQUFRLEdBQUdELE1BQU0sQ0FBQ0UsSUFBUCxDQUFZLFVBQVosQ0FBZjtBQUNBLFVBQUlDLFFBQVEsR0FBR04sNkNBQUMsQ0FBQywyQ0FBMkNJLFFBQTNDLEdBQXNELE1BQXZELENBQWhC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NkMsYUFBTyxDQUFDcEIsSUFBUixDQUFhLFVBQUNLLEtBQUQsRUFBUWdCLE1BQVIsRUFBbUI7QUFDNUIsWUFBTUMsTUFBTSxHQUFHakYsNkNBQUMsQ0FBQ2dGLE1BQUQsQ0FBRCxDQUFVRSxRQUFWLENBQW1CLGNBQW5CLENBQWY7QUFDQSxZQUFNN0UsSUFBSSxHQUFHNEUsTUFBTSxDQUFDNUUsSUFBUCxDQUFZLHFCQUFaLENBQWI7QUFDQUEsWUFBSSxDQUFDOEIsV0FBTCxDQUFpQjhDLE1BQWpCLEVBQXlCakYsNkNBQUMsQ0FBQ0ssSUFBSSxDQUFDVCxPQUFOLENBQTFCLEVBQTBDUyxJQUFJLENBQUNOLFFBQUwsQ0FBYytCLElBQXhEO0FBQ0gsT0FKRDtBQUtIO0FBQ0o7QUFDSixDQWZEIiwiZmlsZSI6Ii4vYXBwL2Zvcm1zL2ZpZWxkcy9pY29ucGlja2VyLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcblxuLyogSWNvbiBQaWNrZXIgYnkgUXVlcnlMb29wXG4gKiBBdXRob3I6IEBlbGlvcml2ZXJvXG4gKiBVUkw6IGh0dHA6Ly9xdWVyeWxvb3AuY29tL1xuICogTGljZW5zZTogR1BMdjJcbiAqL1xuXG52YXIgZGVmYXVsdHMgPSB7XG4gICAgJ21vZGUnOiAnZGlhbG9nJywgLy8gc2hvdyBvdmVybGF5ICdkaWFsb2cnIHBhbmVsIG9yIHNsaWRlIGRvd24gJ2lubGluZScgcGFuZWxcbiAgICAnY2xvc2VPblBpY2snOiB0cnVlLCAvLyB3aGV0aGVyIHRvIGNsb3NlIHBhbmVsIGFmdGVyIHBpY2tpbmcgb3IgJ25vJ1xuICAgICdzYXZlJzogJ2NsYXNzJywgLy8gc2F2ZSBpY29uICdjbGFzcycgb3IgJ2NvZGUnXG4gICAgJ3NpemUnOiAnJyxcbiAgICAnY2xhc3Nlcyc6IHtcbiAgICAgICAgJ2xhdW5jaGVyJzogJycsIC8vIGV4dHJhIGNsYXNzZXMgZm9yIGxhdW5jaGVyIGJ1dHRvbnNcbiAgICAgICAgJ2NsZWFyJzogJ3JlbW92ZS10aW1lcycsIC8vIGV4dHJhIGNsYXNzZXMgZm9yIGJ1dHRvbiB0aGF0IHJlbW92ZXMgcHJldmlldyBhbmQgY2xlYXJzIGZpZWxkXG4gICAgICAgICdoaWdobGlnaHQnOiAnJywgLy8gZXh0cmEgY2xhc3NlcyB3aGVuIGhpZ2hsaWdodGluZyBhbiBpY29uXG4gICAgICAgICdjbG9zZSc6ICcnIC8vIGV4dHJhIGNsYXNzZXMgZm9yIGNsb3NlIGJ1dHRvblxuICAgIH0sXG4gICAgJ2ljb25TZXRzJzogeyAvLyBleGFtcGxlIGRhdGEgc3RydWN0dXJlLiBVc2VkIHRvIHNwZWNpZnkgd2hpY2ggbGF1bmNoZXJzIHdpbGwgYmUgY3JlYXRlZFxuICAgICAgICAnZ2VuZXJpY29uJzogJ0dlbmVyaWNvbicsIC8vIGNyZWF0ZSBhIGxhdW5jaGVyIHRvIHBpY2sgZ2VuZXJpY29uIGljb25zXG4gICAgICAgICdmYSc6ICdGb250QXdlc29tZScgLy8gY3JlYXRlIGEgbGF1bmNoZXIgdG8gcGljayBmb250YXdlc29tZSBpY29uc1xuICAgIH1cbn07XG5cbmNsYXNzIFFMX0ljb25fUGlja2VyIHtcblxuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5pY29uU2V0ID0gJyc7XG4gICAgICAgIHRoaXMuaWNvblNldE5hbWUgPSAnJztcbiAgICAgICAgdGhpcy4kZmllbGQgPSAnJztcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy5zZXR0aW5ncyA9ICQuZXh0ZW5kKHt9LCBkZWZhdWx0cywgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRzID0gZGVmYXVsdHM7XG4gICAgICAgIHRoaXMuaW5pdCgpO1xuICAgIH1cblxuICAgIGluaXQoKSB7XG4gICAgICAgIHZhciAkYnJpY2sgPSAkKHRoaXMuZWxlbWVudCk7XG4gICAgICAgIHZhciBwaWNrZXJJZCA9ICRicmljay5kYXRhKCdwaWNrZXJpZCcpO1xuICAgICAgICB2YXIgJHByZXZpZXcgPSAkKCc8ZGl2IGNsYXNzPVwiaWNvbi1wcmV2aWV3IGljb24tcHJldmlldy0nICsgcGlja2VySWQgKyAnXCIgLz4nKTtcblxuICAgICAgICB0aGlzLiRmaWVsZCA9ICRicmljay5maW5kKCdpbnB1dCcpO1xuXG4gICAgICAgIC8vIEFkZCBwcmV2aWV3IGFyZWFcbiAgICAgICAgdGhpcy5tYWtlUHJldmlldygkYnJpY2ssIHBpY2tlcklkLCAkcHJldmlldyk7XG5cbiAgICAgICAgLy8gTWFrZSBidXR0b24gdG8gY2xlYXIgZmllbGQgYW5kIHJlbW92ZSBwcmV2aWV3XG4gICAgICAgIHRoaXMubWFrZUNsZWFyKHBpY2tlcklkLCAkcHJldmlldyk7XG5cbiAgICAgICAgLy8gTWFrZSBidXR0b25zIHRoYXQgb3BlbiB0aGUgcGFuZWwgb2YgaWNvbnNcbiAgICAgICAgdGhpcy5tYWtlTGF1bmNoZXJzKCRicmljaywgcGlja2VySWQpO1xuXG4gICAgICAgIC8vIFByZXBhcmUgZGlzcGxheSBzdHlsZXMsIGlubGluZSBhbmQgZGlhbG9nXG4gICAgICAgIHRoaXMubWFrZURpc3BsYXkoJGJyaWNrKTtcbiAgICB9XG5cbiAgICBtYWtlUHJldmlldygkYnJpY2ssIHBpY2tlcklkLCAkcHJldmlldykge1xuICAgICAgICB2YXIgJGljb24gPSAkKCc8aSAvPicpO1xuICAgICAgICB2YXIgaWNvblZhbHVlID0gdGhpcy4kZmllbGQudmFsKCk7XG5cbiAgICAgICAgJHByZXZpZXcucHJlcGVuZFRvKCRicmljayk7XG4gICAgICAgICRpY29uLnByZXBlbmRUbygkcHJldmlldyk7XG4gICAgICAgIGlmIChpY29uVmFsdWUgIT09ICcnKSB7XG4gICAgICAgICAgICAkcHJldmlldy5hZGRDbGFzcygnaWNvbi1wcmV2aWV3LW9uJyk7XG4gICAgICAgICAgICAkaWNvbi5hZGRDbGFzcyhpY29uVmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbWFrZUNsZWFyKHBpY2tlcklkLCAkcHJldmlldykge1xuICAgICAgICB2YXIgYmFzZSA9IHRoaXM7XG4gICAgICAgIHZhciAkY2xlYXIgPSAkKCc8YSBjbGFzcz1cInJlbW92ZS1pY29uICcgKyBiYXNlLnNldHRpbmdzLmNsYXNzZXMuY2xlYXIgKyAnXCIgLz4nKTtcblxuICAgICAgICAvLyBIaWRlIGJ1dHRvbiB0byByZW1vdmUgaWNvbiBhbmQgcHJldmlldyBhbmQgYXBwZW5kIGl0IHRvIHByZXZpZXcgYXJlYVxuICAgICAgICAkY2xlYXIuaGlkZSgpLnByZXBlbmRUbygkcHJldmlldyk7XG4gICAgICAgIC8vIElmIHRoZXJlJ3MgYSBpY29uIHNhdmVkIGluIHRoZSBmaWVsZCwgc2hvdyByZW1vdmUgaWNvbiBidXR0b25cbiAgICAgICAgaWYgKGJhc2UuJGZpZWxkLnZhbCgpICE9PSAnJykge1xuICAgICAgICAgICAgJGNsZWFyLnNob3coKTtcbiAgICAgICAgfVxuXG4gICAgICAgICRwcmV2aWV3Lm9uKCdjbGljaycsICcucmVtb3ZlLWljb24nLCBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBiYXNlLiRmaWVsZC52YWwoJycpO1xuICAgICAgICAgICAgJHByZXZpZXcucmVtb3ZlQ2xhc3MoJ2ljb24tcHJldmlldy1vbicpLmZpbmQoJ2knKS5yZW1vdmVDbGFzcygpO1xuICAgICAgICAgICAgJCh0aGlzKS5oaWRlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG1ha2VEaXNwbGF5KCRicmljaykge1xuICAgICAgICB2YXIgYmFzZSA9IHRoaXM7XG4gICAgICAgIHZhciBjbG9zZSA9IGJhc2Uuc2V0dGluZ3MuY2xhc3Nlcy5jbG9zZTtcbiAgICAgICAgdmFyICRib2R5ID0gJCgnYm9keScpO1xuXG4gICAgICAgIHZhciAkY2xvc2UgPSAkKCc8YSBocmVmPVwiI1wiIGNsYXNzPVwiaWNvbi1waWNrZXItY2xvc2VcIi8+Jyk7XG5cbiAgICAgICAgaWYgKGJhc2Uuc2V0dGluZ3MubW9kZSA9PT0gJ2lubGluZScpIHtcbiAgICAgICAgICAgICRicmljay5maW5kKCcuaWNvbi1zZXQnKS5hcHBlbmQoJGNsb3NlKS5yZW1vdmVDbGFzcygnZGlhbG9nJykuYWRkQ2xhc3MoJ2lwLWlubGluZSAnICsgYmFzZS5zZXR0aW5ncy5zaXplKS5wYXJlbnQoKS5hZGRDbGFzcygnaWNvbi1zZXQtd3JhcCcpO1xuICAgICAgICB9IGVsc2UgaWYgKGJhc2Uuc2V0dGluZ3MubW9kZSA9PT0gJ2RpYWxvZycpIHtcbiAgICAgICAgICAgICQoJy5pY29uLXNldCcpLmFkZENsYXNzKCdkaWFsb2cgJyArIGJhc2Uuc2V0dGluZ3Muc2l6ZSk7XG4gICAgICAgICAgICBpZiAoJCgnLmljb24tcGlja2VyLW92ZXJsYXknKS5sZW5ndGggPD0gMCkge1xuICAgICAgICAgICAgICAgICRib2R5LmFwcGVuZCgnPGRpdiBjbGFzcz1cImljb24tcGlja2VyLW92ZXJsYXlcIi8+JykuYXBwZW5kKCRjbG9zZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgJGJvZHlcbiAgICAgICAgICAgIC5vbignY2xpY2snLCAnLmljb24tcGlja2VyLWNsb3NlLCAuaWNvbi1waWNrZXItb3ZlcmxheScsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgYmFzZS5jbG9zZVBpY2tlcigkYnJpY2ssICQoYmFzZS5pY29uU2V0KSwgYmFzZS5zZXR0aW5ncy5tb2RlKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAub24oJ21vdXNlZW50ZXIgbW91c2VsZWF2ZScsICcuaWNvbi1waWNrZXItY2xvc2UnLCBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGUudHlwZSA9PT0gJ21vdXNlZW50ZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICQodGhpcykuYWRkQ2xhc3MoY2xvc2UpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoY2xvc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIG1ha2VMYXVuY2hlcnMoJGJyaWNrKSB7XG4gICAgICAgIHZhciBiYXNlID0gdGhpcztcbiAgICAgICAgdmFyIGRhdGFJY29uU2V0cyA9ICRicmljay5kYXRhKCdpY29uc2V0cycpO1xuICAgICAgICB2YXIgaWNvblNldDtcblxuICAgICAgICBpZiAodHlwZW9mIGRhdGFJY29uU2V0cyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGRhdGFJY29uU2V0cyA9IGJhc2Uuc2V0dGluZ3MuaWNvblNldHM7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChpY29uU2V0IGluIGRhdGFJY29uU2V0cykge1xuICAgICAgICAgICAgaWYgKGRhdGFJY29uU2V0cy5oYXNPd25Qcm9wZXJ0eShpY29uU2V0KSkge1xuICAgICAgICAgICAgICAgICRicmljay5hcHBlbmQoJzxhIGNsYXNzPVwibGF1bmNoLWljb25zIGJ1dHRvbiAnICsgYmFzZS5zZXR0aW5ncy5jbGFzc2VzLmxhdW5jaGVyICsgJ1wiIGRhdGEtaWNvbnM9XCInICsgaWNvblNldCArICdcIj4nICsgZGF0YUljb25TZXRzW2ljb25TZXRdICsgJzwvYT4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgICRicmljay5maW5kKCcubGF1bmNoLWljb25zJykub24oJ2NsaWNrJywgZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdmFyICRzZWxmID0gJCh0aGlzKTtcbiAgICAgICAgICAgIHZhciB0aGVzZUljb25zID0gJHNlbGYuZGF0YSgnaWNvbnMnKTtcblxuICAgICAgICAgICAgYmFzZS5pY29uU2V0TmFtZSA9IHRoZXNlSWNvbnM7XG4gICAgICAgICAgICBiYXNlLmljb25TZXQgPSAnLicgKyB0aGVzZUljb25zICsgJy1zZXQnO1xuXG4gICAgICAgICAgICAvLyBJbml0aWFsaXplIHBpY2tlclxuICAgICAgICAgICAgYmFzZS5pY29uUGljaygkYnJpY2spO1xuXG4gICAgICAgICAgICAvLyBTaG93IGljb24gcGlja2VyXG4gICAgICAgICAgICBiYXNlLnNob3dQaWNrZXIoJGJyaWNrLCAkKGJhc2UuaWNvblNldCksIGJhc2Uuc2V0dGluZ3MubW9kZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGljb25QaWNrKCRicmljaykge1xuICAgICAgICB2YXIgYmFzZSA9IHRoaXM7XG4gICAgICAgIHZhciBoaWdobGlnaHQgPSAnaWNvbi1oaWdobGlnaHQgJyArIGJhc2Uuc2V0dGluZ3MuY2xhc3Nlcy5oaWdobGlnaHQ7XG5cbiAgICAgICAgJChiYXNlLmljb25TZXQpLm9uKCdjbGljaycsICdsaScsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHZhciAkaWNvbiA9ICQodGhpcyk7XG4gICAgICAgICAgICB2YXIgaWNvbiA9ICRpY29uLmRhdGEoYmFzZS5zZXR0aW5ncy5zYXZlKTtcblxuICAgICAgICAgICAgLy8gTWFyayBhcyBzZWxlY3RlZFxuICAgICAgICAgICAgJCgnLmljb24tc2VsZWN0ZWQnKS5yZW1vdmVDbGFzcygnaWNvbi1zZWxlY3RlZCcpO1xuICAgICAgICAgICAgJGljb24uYWRkQ2xhc3MoJ2ljb24tc2VsZWN0ZWQnKTtcbiAgICAgICAgICAgIGlmIChiYXNlLiRmaWVsZC5kYXRhKCdmb3JtYXQnKSA9PT0gJ3Nob3J0Jykge1xuICAgICAgICAgICAgICAgIGljb24gPSBpY29uLnNsaWNlKDYpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTYXZlIGljb24gdmFsdWUgdG8gZmllbGRcbiAgICAgICAgICAgIGJhc2UuJGZpZWxkLnZhbChpY29uKTtcblxuICAgICAgICAgICAgLy8gQ2xvc2UgaWNvbiBwaWNrZXJcbiAgICAgICAgICAgIGlmIChiYXNlLnNldHRpbmdzLmNsb3NlT25QaWNrKSB7XG4gICAgICAgICAgICAgICAgYmFzZS5jbG9zZVBpY2tlcigkYnJpY2ssICRpY29uLmNsb3Nlc3QoYmFzZS5pY29uU2V0KSwgYmFzZS5zZXR0aW5ncy5tb2RlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2V0IHByZXZpZXdcbiAgICAgICAgICAgIGJhc2Uuc2V0UHJldmlldygkaWNvbi5kYXRhKCdjbGFzcycpKTtcblxuICAgICAgICAgICAgLy8gQnJvYWRjYXN0IGV2ZW50IHBhc3NpbmcgdGhlIHNlbGVjdGVkIGljb24uXG4gICAgICAgICAgICAkKCdib2R5JykudHJpZ2dlcignaWNvbnNlbGVjdGVkLnF1ZXJ5bG9vcCcsIGljb24pO1xuICAgICAgICB9KTtcbiAgICAgICAgJChiYXNlLmljb25TZXQpLm9uKCdtb3VzZWVudGVyIG1vdXNlbGVhdmUnLCAnbGknLCBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICBpZiAoZS50eXBlID09PSAnbW91c2VlbnRlcicpIHtcbiAgICAgICAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKGhpZ2hsaWdodCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoaGlnaGxpZ2h0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2hvd1BpY2tlcigkYnJpY2ssICRpY29ucywgbW9kZSkge1xuICAgICAgICBpZiAobW9kZSA9PT0gJ2lubGluZScpIHtcbiAgICAgICAgICAgICQoJy5pY29uLXNldCcpLnJlbW92ZUNsYXNzKCdpcC1pbmxpbmUtb3BlbicpO1xuICAgICAgICAgICAgJGJyaWNrLmZpbmQoJGljb25zKS50b2dnbGVDbGFzcygnaXAtaW5saW5lLW9wZW4nKTtcbiAgICAgICAgfSBlbHNlIGlmIChtb2RlID09PSAnZGlhbG9nJykge1xuICAgICAgICAgICAgJGJyaWNrLmZpbmQoJy5pY29uLXBpY2tlci1jbG9zZScpLmFkZENsYXNzKCdtYWtlLXZpc2libGUnKTtcbiAgICAgICAgICAgICRicmljay5maW5kKCcuaWNvbi1waWNrZXItb3ZlcmxheScpLmFkZENsYXNzKCdtYWtlLXZpc2libGUnKTtcbiAgICAgICAgICAgICRpY29ucy5hZGRDbGFzcygnZGlhbG9nLW9wZW4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgICRpY29ucy5maW5kKCcuaWNvbi1zZWxlY3RlZCcpLnJlbW92ZUNsYXNzKCdpY29uLXNlbGVjdGVkJyk7XG4gICAgICAgIHZhciBzZWxlY3RlZEljb24gPSB0aGlzLiRmaWVsZC52YWwoKS5yZXBsYWNlKCcgJywgJy4nKTtcbiAgICAgICAgaWYgKHNlbGVjdGVkSWNvbiAhPT0gJycpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNldHRpbmdzLnNhdmUgPT09ICdjbGFzcycpIHtcbiAgICAgICAgICAgICAgICAkaWNvbnMuZmluZCgnLicgKyBzZWxlY3RlZEljb24pLmFkZENsYXNzKCdpY29uLXNlbGVjdGVkJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICRpY29ucy5maW5kKCdbZGF0YS1jb2RlPVwiJyArIHNlbGVjdGVkSWNvbiArICdcIl0nKS5hZGRDbGFzcygnaWNvbi1zZWxlY3RlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEJyb2FkY2FzdCBldmVudCB3aGVuIHRoZSBwaWNrZXIgaXMgc2hvd24gcGFzc2luZyB0aGUgcGlja2VyIG1vZGUuXG4gICAgICAgICQoJ2JvZHknKS50cmlnZ2VyKCdpY29ucGlja2Vyc2hvdy5xdWVyeWxvb3AnLCBtb2RlKTtcbiAgICB9XG5cbiAgICBjbG9zZVBpY2tlcigkYnJpY2ssICRpY29ucywgbW9kZSkge1xuICAgICAgICAvLyBSZW1vdmUgZXZlbnQgc28gdGhleSBkb24ndCBmaXJlIGZyb20gYSBkaWZmZXJlbnQgcGlja2VyXG4gICAgICAgICQodGhpcy5pY29uU2V0KS5vZmYoJ2NsaWNrJywgJ2xpJyk7XG5cbiAgICAgICAgaWYgKG1vZGUgPT09ICdpbmxpbmUnKSB7XG4gICAgICAgICAgICAkYnJpY2suZmluZCgkaWNvbnMpLnJlbW92ZUNsYXNzKCdpcC1pbmxpbmUtb3BlbicpO1xuICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT09ICdkaWFsb2cnKSB7XG4gICAgICAgICAgICAkKCcuaWNvbi1waWNrZXItY2xvc2UsIC5pY29uLXBpY2tlci1vdmVybGF5JykucmVtb3ZlQ2xhc3MoJ21ha2UtdmlzaWJsZScpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEJyb2FkY2FzdCBldmVudCB3aGVuIHRoZSBwaWNrZXIgaXMgY2xvc2VkIHBhc3NpbmcgdGhlIHBpY2tlciBtb2RlLlxuICAgICAgICAkKCdib2R5JykudHJpZ2dlcignaWNvbnBpY2tlcmNsb3NlLnF1ZXJ5bG9vcCcsIG1vZGUpO1xuICAgICAgICAkKCcuaWNvbi1zZXQnKS5yZW1vdmVDbGFzcygnZGlhbG9nLW9wZW4nKTtcbiAgICB9XG5cbiAgICBzZXRQcmV2aWV3KHByZXZpZXcpIHtcbiAgICAgICAgdmFyICRwcmV2aWV3ID0gJCh0aGlzLmVsZW1lbnQpLmZpbmQoJy5pY29uLXByZXZpZXcnKTtcblxuICAgICAgICAkcHJldmlldy5hZGRDbGFzcygnaWNvbi1wcmV2aWV3LW9uJykuZmluZCgnaScpLnJlbW92ZUNsYXNzKClcbiAgICAgICAgICAgIC5hZGRDbGFzcyh0aGlzLmljb25TZXROYW1lKVxuICAgICAgICAgICAgLmFkZENsYXNzKHByZXZpZXcpO1xuICAgICAgICAkcHJldmlldy5maW5kKCdhJykuc2hvdygpO1xuICAgIH1cbn1cblxuLyogR3JhdiAqL1xuLy8gZXh0ZW5kICQgd2l0aCAzcmQgcGFydHkgUUwgSWNvbiBQaWNrZXJcbiQuZm4ucWxJY29uUGlja2VyID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKCEkLmRhdGEodGhpcywgJ3BsdWdpbl9xbEljb25QaWNrZXInKSkge1xuICAgICAgICAgICAgJC5kYXRhKHRoaXMsICdwbHVnaW5fcWxJY29uUGlja2VyJywgbmV3IFFMX0ljb25fUGlja2VyKHRoaXMsIG9wdGlvbnMpKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJY29ucGlja2VyRmllbGQge1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICB0aGlzLml0ZW1zID0gJCgpO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmRlZmF1bHRzLCBvcHRpb25zKTtcblxuICAgICAgICAkKCdbZGF0YS1ncmF2LWljb25waWNrZXJdJykuZWFjaCgoaW5kZXgsIGVsZW1lbnQpID0+IHRoaXMuYWRkSXRlbShlbGVtZW50KSk7XG4gICAgICAgICQoJ2JvZHknKS5vbignbXV0YXRpb24uX2dyYXYnLCB0aGlzLl9vbkFkZGVkTm9kZXMuYmluZCh0aGlzKSk7XG4gICAgfVxuXG4gICAgX29uQWRkZWROb2RlcyhldmVudCwgdGFyZ2V0LyogLCByZWNvcmQsIGluc3RhbmNlICovKSB7XG4gICAgICAgIGxldCBmaWVsZHMgPSAkKHRhcmdldCkuZmluZCgnW2RhdGEtZ3Jhdi1pY29ucGlja2VyXScpO1xuICAgICAgICBpZiAoIWZpZWxkcy5sZW5ndGgpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgZmllbGRzLmVhY2goKGluZGV4LCBmaWVsZCkgPT4ge1xuICAgICAgICAgICAgZmllbGQgPSAkKGZpZWxkKTtcbiAgICAgICAgICAgIGlmICghfnRoaXMuaXRlbXMuaW5kZXgoZmllbGQpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRJdGVtKGZpZWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYWRkSXRlbShlbGVtZW50KSB7XG4gICAgICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpO1xuICAgICAgICB0aGlzLml0ZW1zID0gdGhpcy5pdGVtcy5hZGQoZWxlbWVudCk7XG4gICAgICAgIGVsZW1lbnQuZmluZCgnLmljb24tcGlja2VyJykucWxJY29uUGlja2VyKHtcbiAgICAgICAgICAgICdzYXZlJzogJ2NsYXNzJ1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBoYWNrIHRvIHJlbW92ZSBleHRyYSBpY29uIHNldHMgdGhhdCBhcmUganVzdCBjb3BpZXNcbiAgICAgICAgJCgnLmljb24tc2V0Om5vdCg6Zmlyc3QpJykucmVtb3ZlKCk7XG4gICAgfVxufVxuXG5leHBvcnQgbGV0IEluc3RhbmNlID0gbmV3IEljb25waWNrZXJGaWVsZCgpO1xuXG4vLyBGaXggdG8gY2xvc2UgdGhlIGRpYWxvZyB3aGVuIGNsaWNraW5nIG91dHNpZGVcbiQoZG9jdW1lbnQpLm9uKCdjbGljaycsIChldmVudCkgPT4ge1xuICAgIGNvbnN0IHRhcmdldCA9ICQoZXZlbnQudGFyZ2V0KTtcbiAgICBjb25zdCBtYXRjaCA9ICcuaWNvbi1zZXQuZGlhbG9nLW9wZW4sIC5sYXVuY2gtaWNvbnNbZGF0YS1pY29uc10nO1xuICAgIGlmICghdGFyZ2V0LmlzKG1hdGNoKSAmJiAhdGFyZ2V0LmNsb3Nlc3QobWF0Y2gpLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBkaWFsb2dzID0gJCgnLmljb24tc2V0LmRpYWxvZy1vcGVuJyk7XG5cbiAgICAgICAgLy8gc2tpcCBpZiB0aGVyZSdzIG5vIGRpYWxvZyBvcGVuXG4gICAgICAgIGlmIChkaWFsb2dzLmxlbmd0aCkge1xuICAgICAgICAgICAgZGlhbG9ncy5lYWNoKChpbmRleCwgZGlhbG9nKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGlja2VyID0gJChkaWFsb2cpLnNpYmxpbmdzKCcuaWNvbi1waWNrZXInKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gcGlja2VyLmRhdGEoJ3BsdWdpbl9xbEljb25QaWNrZXInKTtcbiAgICAgICAgICAgICAgICBkYXRhLmNsb3NlUGlja2VyKHBpY2tlciwgJChkYXRhLmljb25TZXQpLCBkYXRhLnNldHRpbmdzLm1vZGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59KTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./app/forms/fields/iconpicker.js\n"); /***/ }), /***/ "./app/forms/fields/indeterminate.js": -/*!*******************************************!* +/*!*******************************************!*\ !*** ./app/forms/fields/indeterminate.js ***! \*******************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { @@ -187,18 +198,18 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var jque /***/ }), /***/ "./app/forms/fields/index.js": -/*!***********************************!* +/*!***********************************!*\ !*** ./app/forms/fields/index.js ***! \***********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => __WEBPACK_DEFAULT_EXPORT__\n/* harmony export */ });\n/* harmony import */ var _filepicker__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./filepicker */ \"./app/forms/fields/filepicker.js\");\n/* harmony import */ var _selectize__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./selectize */ \"./app/forms/fields/selectize.js\");\n/* harmony import */ var _array__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./array */ \"./app/forms/fields/array.js\");\n/* harmony import */ var _collections__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./collections */ \"./app/forms/fields/collections.js\");\n/* harmony import */ var _datetime__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./datetime */ \"./app/forms/fields/datetime.js\");\n/* harmony import */ var _editor__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./editor */ \"./app/forms/fields/editor.js\");\n/* harmony import */ var _colorpicker__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./colorpicker */ \"./app/forms/fields/colorpicker.js\");\n/* harmony import */ var _files__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./files */ \"./app/forms/fields/files.js\");\n/* harmony import */ var _selectunique__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./selectunique */ \"./app/forms/fields/selectunique.js\");\n/* harmony import */ var _iconpicker__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./iconpicker */ \"./app/forms/fields/iconpicker.js\");\n/* harmony import */ var _cron__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./cron */ \"./app/forms/fields/cron.js\");\n/* harmony import */ var _parents__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./parents */ \"./app/forms/fields/parents.js\");\n/* harmony import */ var _acl_picker__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./acl-picker */ \"./app/forms/fields/acl-picker.js\");\n/* harmony import */ var _permissions__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./permissions */ \"./app/forms/fields/permissions.js\");\n/* harmony import */ var _indeterminate__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./indeterminate */ \"./app/forms/fields/indeterminate.js\");\n/* harmony import */ var _mediapicker__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./mediapicker */ \"./app/forms/fields/mediapicker.js\");\n/* harmony import */ var _multilevel__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./multilevel */ \"./app/forms/fields/multilevel.js\");\n/* harmony import */ var _text__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./text */ \"./app/forms/fields/text.js\");\n/* harmony import */ var _range__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./range */ \"./app/forms/fields/range.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n FilepickerField: {\n FilepickerField: _filepicker__WEBPACK_IMPORTED_MODULE_0__.default,\n Instance: _filepicker__WEBPACK_IMPORTED_MODULE_0__.Instance\n },\n SelectizeField: {\n SelectizeField: _selectize__WEBPACK_IMPORTED_MODULE_1__.default,\n Instance: _selectize__WEBPACK_IMPORTED_MODULE_1__.Instance\n },\n ArrayField: {\n ArrayField: _array__WEBPACK_IMPORTED_MODULE_2__.default,\n Instance: _array__WEBPACK_IMPORTED_MODULE_2__.Instance\n },\n CollectionsField: {\n CollectionsField: _collections__WEBPACK_IMPORTED_MODULE_3__.default,\n Instance: _collections__WEBPACK_IMPORTED_MODULE_3__.Instance\n },\n DateTimeField: {\n DateTimeField: _datetime__WEBPACK_IMPORTED_MODULE_4__.default,\n Instance: _datetime__WEBPACK_IMPORTED_MODULE_4__.Instance\n },\n EditorField: {\n EditorField: _editor__WEBPACK_IMPORTED_MODULE_5__.default,\n Instance: _editor__WEBPACK_IMPORTED_MODULE_5__.Instance\n },\n ColorpickerField: {\n ColorpickerField: _colorpicker__WEBPACK_IMPORTED_MODULE_6__.default,\n Instance: _colorpicker__WEBPACK_IMPORTED_MODULE_6__.Instance\n },\n FilesField: {\n FilesField: _files__WEBPACK_IMPORTED_MODULE_7__.default,\n Instance: _files__WEBPACK_IMPORTED_MODULE_7__.Instance\n },\n SelectUniqueField: {\n SelectUniqueField: _selectunique__WEBPACK_IMPORTED_MODULE_8__.default,\n Instance: _selectunique__WEBPACK_IMPORTED_MODULE_8__.Instance\n },\n IconpickerField: {\n IconpickerField: _iconpicker__WEBPACK_IMPORTED_MODULE_9__.default,\n Instance: _iconpicker__WEBPACK_IMPORTED_MODULE_9__.Instance\n },\n CronField: {\n CronField: _cron__WEBPACK_IMPORTED_MODULE_10__.default,\n Instance: _cron__WEBPACK_IMPORTED_MODULE_10__.Instance\n },\n ParentsField: {\n ParentsField: _parents__WEBPACK_IMPORTED_MODULE_11__.default,\n Instance: _parents__WEBPACK_IMPORTED_MODULE_11__.Instances\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL2Zvcm1zL2ZpZWxkcy9pbmRleC5qcz8xOGI1Il0sIm5hbWVzIjpbIkZpbGVwaWNrZXJGaWVsZCIsIkluc3RhbmNlIiwiRmlsZXBpY2tlckZpZWxkSW5zdGFuY2UiLCJTZWxlY3RpemVGaWVsZCIsIlNlbGVjdGl6ZUZpZWxkSW5zdGFuY2UiLCJBcnJheUZpZWxkIiwiQXJyYXlGaWVsZEluc3RhbmNlIiwiQ29sbGVjdGlvbnNGaWVsZCIsIkNvbGxlY3Rpb25zRmllbGRJbnN0YW5jZSIsIkRhdGVUaW1lRmllbGQiLCJEYXRlVGltZUZpZWxkSW5zdGFuY2UiLCJFZGl0b3JGaWVsZCIsIkVkaXRvckZpZWxkSW5zdGFuY2UiLCJDb2xvcnBpY2tlckZpZWxkIiwiQ29sb3JwaWNrZXJGaWVsZEluc3RhbmNlIiwiRmlsZXNGaWVsZCIsIkZpbGVzRmllbGRJbnN0YW5jZSIsIlNlbGVjdFVuaXF1ZUZpZWxkIiwiU2VsZWN0VW5pcXVlSW5zdGFuY2UiLCJJY29ucGlja2VyRmllbGQiLCJJY29ucGlja2VySW5zdGFuY2UiLCJDcm9uRmllbGQiLCJDcm9uRmllbGRJbnN0YW5jZSIsIlBhcmVudHNGaWVsZCIsIlBhcmVudHNGaWVsZEluc3RhbmNlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUEsaUVBQWU7QUFDWEEsaUJBQWUsRUFBRTtBQUNiQSxtQkFBZSxFQUFmQSxnREFEYTtBQUViQyxZQUFRLEVBQUVDLGlEQUF1QkE7QUFGcEIsR0FETjtBQUtYQyxnQkFBYyxFQUFFO0FBQ1pBLGtCQUFjLEVBQWRBLCtDQURZO0FBRVpGLFlBQVEsRUFBRUcsZ0RBQXNCQTtBQUZwQixHQUxMO0FBU1hDLFlBQVUsRUFBRTtBQUNSQSxjQUFVLEVBQVZBLDJDQURRO0FBRVJKLFlBQVEsRUFBRUssNENBQWtCQTtBQUZwQixHQVREO0FBYVhDLGtCQUFnQixFQUFFO0FBQ2RBLG9CQUFnQixFQUFoQkEsaURBRGM7QUFFZE4sWUFBUSxFQUFFTyxrREFBd0JBO0FBRnBCLEdBYlA7QUFpQlhDLGVBQWEsRUFBRTtBQUNYQSxpQkFBYSxFQUFiQSw4Q0FEVztBQUVYUixZQUFRLEVBQUVTLCtDQUFxQkE7QUFGcEIsR0FqQko7QUFxQlhDLGFBQVcsRUFBRTtBQUNUQSxlQUFXLEVBQVhBLDRDQURTO0FBRVRWLFlBQVEsRUFBRVcsNkNBQW1CQTtBQUZwQixHQXJCRjtBQXlCWEMsa0JBQWdCLEVBQUU7QUFDZEEsb0JBQWdCLEVBQWhCQSxpREFEYztBQUVkWixZQUFRLEVBQUVhLGtEQUF3QkE7QUFGcEIsR0F6QlA7QUE2QlhDLFlBQVUsRUFBRTtBQUNSQSxjQUFVLEVBQVZBLDJDQURRO0FBRVJkLFlBQVEsRUFBRWUsNENBQWtCQTtBQUZwQixHQTdCRDtBQWlDWEMsbUJBQWlCLEVBQUU7QUFDZkEscUJBQWlCLEVBQWpCQSxrREFEZTtBQUVmaEIsWUFBUSxFQUFFaUIsbURBQW9CQTtBQUZmLEdBakNSO0FBcUNYQyxpQkFBZSxFQUFFO0FBQ2JBLG1CQUFlLEVBQWZBLGdEQURhO0FBRWJsQixZQUFRLEVBQUVtQixpREFBa0JBO0FBRmYsR0FyQ047QUF5Q1hDLFdBQVMsRUFBRTtBQUNQQSxhQUFTLEVBQVRBLDJDQURPO0FBRVBwQixZQUFRLEVBQUVxQiw0Q0FBaUJBO0FBRnBCLEdBekNBO0FBNkNYQyxjQUFZLEVBQUU7QUFDVkEsZ0JBQVksRUFBWkEsOENBRFU7QUFFVnRCLFlBQVEsRUFBRXVCLGdEQUFvQkE7QUFGcEI7QUE3Q0gsQ0FBZiIsImZpbGUiOiIuL2FwcC9mb3Jtcy9maWVsZHMvaW5kZXguanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRmlsZXBpY2tlckZpZWxkLCB7IEluc3RhbmNlIGFzIEZpbGVwaWNrZXJGaWVsZEluc3RhbmNlIH0gZnJvbSAnLi9maWxlcGlja2VyJztcbmltcG9ydCBTZWxlY3RpemVGaWVsZCwgeyBJbnN0YW5jZSBhcyBTZWxlY3RpemVGaWVsZEluc3RhbmNlIH0gZnJvbSAnLi9zZWxlY3RpemUnO1xuaW1wb3J0IEFycmF5RmllbGQsIHsgSW5zdGFuY2UgYXMgQXJyYXlGaWVsZEluc3RhbmNlIH0gZnJvbSAnLi9hcnJheSc7XG5pbXBvcnQgQ29sbGVjdGlvbnNGaWVsZCwgeyBJbnN0YW5jZSBhcyBDb2xsZWN0aW9uc0ZpZWxkSW5zdGFuY2UgfSBmcm9tICcuL2NvbGxlY3Rpb25zJztcbmltcG9ydCBEYXRlVGltZUZpZWxkLCB7IEluc3RhbmNlIGFzIERhdGVUaW1lRmllbGRJbnN0YW5jZSB9IGZyb20gJy4vZGF0ZXRpbWUnO1xuaW1wb3J0IEVkaXRvckZpZWxkLCB7IEluc3RhbmNlIGFzIEVkaXRvckZpZWxkSW5zdGFuY2UgfSBmcm9tICcuL2VkaXRvcic7XG5pbXBvcnQgQ29sb3JwaWNrZXJGaWVsZCwgeyBJbnN0YW5jZSBhcyBDb2xvcnBpY2tlckZpZWxkSW5zdGFuY2UgfSBmcm9tICcuL2NvbG9ycGlja2VyJztcbmltcG9ydCBGaWxlc0ZpZWxkLCB7IEluc3RhbmNlIGFzIEZpbGVzRmllbGRJbnN0YW5jZSB9IGZyb20gJy4vZmlsZXMnO1xuaW1wb3J0IFNlbGVjdFVuaXF1ZUZpZWxkLCB7IEluc3RhbmNlIGFzIFNlbGVjdFVuaXF1ZUluc3RhbmNlIH0gZnJvbSAnLi9zZWxlY3R1bmlxdWUnO1xuaW1wb3J0IEljb25waWNrZXJGaWVsZCwgeyBJbnN0YW5jZSBhcyBJY29ucGlja2VySW5zdGFuY2UgfSBmcm9tICcuL2ljb25waWNrZXInO1xuaW1wb3J0IENyb25GaWVsZCwgeyBJbnN0YW5jZSBhcyBDcm9uRmllbGRJbnN0YW5jZSB9IGZyb20gJy4vY3Jvbic7XG5pbXBvcnQgUGFyZW50c0ZpZWxkLCB7IEluc3RhbmNlcyBhcyBQYXJlbnRzRmllbGRJbnN0YW5jZSB9IGZyb20gJy4vcGFyZW50cyc7XG5cbmltcG9ydCAnLi9hY2wtcGlja2VyJztcbmltcG9ydCAnLi9wZXJtaXNzaW9ucyc7XG5pbXBvcnQgJy4vaW5kZXRlcm1pbmF0ZSc7XG5pbXBvcnQgJy4vbWVkaWFwaWNrZXInO1xuaW1wb3J0ICcuL211bHRpbGV2ZWwnO1xuaW1wb3J0ICcuL3RleHQnO1xuaW1wb3J0ICcuL3JhbmdlJztcblxuZXhwb3J0IGRlZmF1bHQge1xuICAgIEZpbGVwaWNrZXJGaWVsZDoge1xuICAgICAgICBGaWxlcGlja2VyRmllbGQsXG4gICAgICAgIEluc3RhbmNlOiBGaWxlcGlja2VyRmllbGRJbnN0YW5jZVxuICAgIH0sXG4gICAgU2VsZWN0aXplRmllbGQ6IHtcbiAgICAgICAgU2VsZWN0aXplRmllbGQsXG4gICAgICAgIEluc3RhbmNlOiBTZWxlY3RpemVGaWVsZEluc3RhbmNlXG4gICAgfSxcbiAgICBBcnJheUZpZWxkOiB7XG4gICAgICAgIEFycmF5RmllbGQsXG4gICAgICAgIEluc3RhbmNlOiBBcnJheUZpZWxkSW5zdGFuY2VcbiAgICB9LFxuICAgIENvbGxlY3Rpb25zRmllbGQ6IHtcbiAgICAgICAgQ29sbGVjdGlvbnNGaWVsZCxcbiAgICAgICAgSW5zdGFuY2U6IENvbGxlY3Rpb25zRmllbGRJbnN0YW5jZVxuICAgIH0sXG4gICAgRGF0ZVRpbWVGaWVsZDoge1xuICAgICAgICBEYXRlVGltZUZpZWxkLFxuICAgICAgICBJbnN0YW5jZTogRGF0ZVRpbWVGaWVsZEluc3RhbmNlXG4gICAgfSxcbiAgICBFZGl0b3JGaWVsZDoge1xuICAgICAgICBFZGl0b3JGaWVsZCxcbiAgICAgICAgSW5zdGFuY2U6IEVkaXRvckZpZWxkSW5zdGFuY2VcbiAgICB9LFxuICAgIENvbG9ycGlja2VyRmllbGQ6IHtcbiAgICAgICAgQ29sb3JwaWNrZXJGaWVsZCxcbiAgICAgICAgSW5zdGFuY2U6IENvbG9ycGlja2VyRmllbGRJbnN0YW5jZVxuICAgIH0sXG4gICAgRmlsZXNGaWVsZDoge1xuICAgICAgICBGaWxlc0ZpZWxkLFxuICAgICAgICBJbnN0YW5jZTogRmlsZXNGaWVsZEluc3RhbmNlXG4gICAgfSxcbiAgICBTZWxlY3RVbmlxdWVGaWVsZDoge1xuICAgICAgICBTZWxlY3RVbmlxdWVGaWVsZCxcbiAgICAgICAgSW5zdGFuY2U6IFNlbGVjdFVuaXF1ZUluc3RhbmNlXG4gICAgfSxcbiAgICBJY29ucGlja2VyRmllbGQ6IHtcbiAgICAgICAgSWNvbnBpY2tlckZpZWxkLFxuICAgICAgICBJbnN0YW5jZTogSWNvbnBpY2tlckluc3RhbmNlXG4gICAgfSxcbiAgICBDcm9uRmllbGQ6IHtcbiAgICAgICAgQ3JvbkZpZWxkLFxuICAgICAgICBJbnN0YW5jZTogQ3JvbkZpZWxkSW5zdGFuY2VcbiAgICB9LFxuICAgIFBhcmVudHNGaWVsZDoge1xuICAgICAgICBQYXJlbnRzRmllbGQsXG4gICAgICAgIEluc3RhbmNlOiBQYXJlbnRzRmllbGRJbnN0YW5jZVxuICAgIH1cbn07XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./app/forms/fields/index.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _filepicker__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./filepicker */ \"./app/forms/fields/filepicker.js\");\n/* harmony import */ var _selectize__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./selectize */ \"./app/forms/fields/selectize.js\");\n/* harmony import */ var _array__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./array */ \"./app/forms/fields/array.js\");\n/* harmony import */ var _collections__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./collections */ \"./app/forms/fields/collections.js\");\n/* harmony import */ var _datetime__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./datetime */ \"./app/forms/fields/datetime.js\");\n/* harmony import */ var _editor__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./editor */ \"./app/forms/fields/editor.js\");\n/* harmony import */ var _colorpicker__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./colorpicker */ \"./app/forms/fields/colorpicker.js\");\n/* harmony import */ var _files__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./files */ \"./app/forms/fields/files.js\");\n/* harmony import */ var _folder__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./folder */ \"./app/forms/fields/folder.js\");\n/* harmony import */ var _selectunique__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./selectunique */ \"./app/forms/fields/selectunique.js\");\n/* harmony import */ var _iconpicker__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./iconpicker */ \"./app/forms/fields/iconpicker.js\");\n/* harmony import */ var _cron__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./cron */ \"./app/forms/fields/cron.js\");\n/* harmony import */ var _parents__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./parents */ \"./app/forms/fields/parents.js\");\n/* harmony import */ var _acl_picker__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./acl-picker */ \"./app/forms/fields/acl-picker.js\");\n/* harmony import */ var _permissions__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./permissions */ \"./app/forms/fields/permissions.js\");\n/* harmony import */ var _indeterminate__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./indeterminate */ \"./app/forms/fields/indeterminate.js\");\n/* harmony import */ var _mediapicker__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./mediapicker */ \"./app/forms/fields/mediapicker.js\");\n/* harmony import */ var _multilevel__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./multilevel */ \"./app/forms/fields/multilevel.js\");\n/* harmony import */ var _text__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./text */ \"./app/forms/fields/text.js\");\n/* harmony import */ var _range__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./range */ \"./app/forms/fields/range.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n FilepickerField: {\n FilepickerField: _filepicker__WEBPACK_IMPORTED_MODULE_0__.default,\n Instance: _filepicker__WEBPACK_IMPORTED_MODULE_0__.Instance\n },\n SelectizeField: {\n SelectizeField: _selectize__WEBPACK_IMPORTED_MODULE_1__.default,\n Instance: _selectize__WEBPACK_IMPORTED_MODULE_1__.Instance\n },\n ArrayField: {\n ArrayField: _array__WEBPACK_IMPORTED_MODULE_2__.default,\n Instance: _array__WEBPACK_IMPORTED_MODULE_2__.Instance\n },\n CollectionsField: {\n CollectionsField: _collections__WEBPACK_IMPORTED_MODULE_3__.default,\n Instance: _collections__WEBPACK_IMPORTED_MODULE_3__.Instance\n },\n DateTimeField: {\n DateTimeField: _datetime__WEBPACK_IMPORTED_MODULE_4__.default,\n Instance: _datetime__WEBPACK_IMPORTED_MODULE_4__.Instance\n },\n EditorField: {\n EditorField: _editor__WEBPACK_IMPORTED_MODULE_5__.default,\n Instance: _editor__WEBPACK_IMPORTED_MODULE_5__.Instance\n },\n ColorpickerField: {\n ColorpickerField: _colorpicker__WEBPACK_IMPORTED_MODULE_6__.default,\n Instance: _colorpicker__WEBPACK_IMPORTED_MODULE_6__.Instance\n },\n FilesField: {\n FilesField: _files__WEBPACK_IMPORTED_MODULE_7__.default,\n Instance: _files__WEBPACK_IMPORTED_MODULE_7__.Instance\n },\n FolderField: {\n Regenerate: _folder__WEBPACK_IMPORTED_MODULE_8__.default\n },\n SelectUniqueField: {\n SelectUniqueField: _selectunique__WEBPACK_IMPORTED_MODULE_9__.default,\n Instance: _selectunique__WEBPACK_IMPORTED_MODULE_9__.Instance\n },\n IconpickerField: {\n IconpickerField: _iconpicker__WEBPACK_IMPORTED_MODULE_10__.default,\n Instance: _iconpicker__WEBPACK_IMPORTED_MODULE_10__.Instance\n },\n CronField: {\n CronField: _cron__WEBPACK_IMPORTED_MODULE_11__.default,\n Instance: _cron__WEBPACK_IMPORTED_MODULE_11__.Instance\n },\n ParentsField: {\n ParentsField: _parents__WEBPACK_IMPORTED_MODULE_12__.default,\n Instance: _parents__WEBPACK_IMPORTED_MODULE_12__.Instances\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL2Zvcm1zL2ZpZWxkcy9pbmRleC5qcz8xOGI1Il0sIm5hbWVzIjpbIkZpbGVwaWNrZXJGaWVsZCIsIkluc3RhbmNlIiwiRmlsZXBpY2tlckZpZWxkSW5zdGFuY2UiLCJTZWxlY3RpemVGaWVsZCIsIlNlbGVjdGl6ZUZpZWxkSW5zdGFuY2UiLCJBcnJheUZpZWxkIiwiQXJyYXlGaWVsZEluc3RhbmNlIiwiQ29sbGVjdGlvbnNGaWVsZCIsIkNvbGxlY3Rpb25zRmllbGRJbnN0YW5jZSIsIkRhdGVUaW1lRmllbGQiLCJEYXRlVGltZUZpZWxkSW5zdGFuY2UiLCJFZGl0b3JGaWVsZCIsIkVkaXRvckZpZWxkSW5zdGFuY2UiLCJDb2xvcnBpY2tlckZpZWxkIiwiQ29sb3JwaWNrZXJGaWVsZEluc3RhbmNlIiwiRmlsZXNGaWVsZCIsIkZpbGVzRmllbGRJbnN0YW5jZSIsIkZvbGRlckZpZWxkIiwiUmVnZW5lcmF0ZSIsIkZvbGRlckZpZWxkSW5zdGFuY2UiLCJTZWxlY3RVbmlxdWVGaWVsZCIsIlNlbGVjdFVuaXF1ZUluc3RhbmNlIiwiSWNvbnBpY2tlckZpZWxkIiwiSWNvbnBpY2tlckluc3RhbmNlIiwiQ3JvbkZpZWxkIiwiQ3JvbkZpZWxkSW5zdGFuY2UiLCJQYXJlbnRzRmllbGQiLCJQYXJlbnRzRmllbGRJbnN0YW5jZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBLGlFQUFlO0FBQ1hBLGlCQUFlLEVBQUU7QUFDYkEsbUJBQWUsRUFBZkEsZ0RBRGE7QUFFYkMsWUFBUSxFQUFFQyxpREFBdUJBO0FBRnBCLEdBRE47QUFLWEMsZ0JBQWMsRUFBRTtBQUNaQSxrQkFBYyxFQUFkQSwrQ0FEWTtBQUVaRixZQUFRLEVBQUVHLGdEQUFzQkE7QUFGcEIsR0FMTDtBQVNYQyxZQUFVLEVBQUU7QUFDUkEsY0FBVSxFQUFWQSwyQ0FEUTtBQUVSSixZQUFRLEVBQUVLLDRDQUFrQkE7QUFGcEIsR0FURDtBQWFYQyxrQkFBZ0IsRUFBRTtBQUNkQSxvQkFBZ0IsRUFBaEJBLGlEQURjO0FBRWROLFlBQVEsRUFBRU8sa0RBQXdCQTtBQUZwQixHQWJQO0FBaUJYQyxlQUFhLEVBQUU7QUFDWEEsaUJBQWEsRUFBYkEsOENBRFc7QUFFWFIsWUFBUSxFQUFFUywrQ0FBcUJBO0FBRnBCLEdBakJKO0FBcUJYQyxhQUFXLEVBQUU7QUFDVEEsZUFBVyxFQUFYQSw0Q0FEUztBQUVUVixZQUFRLEVBQUVXLDZDQUFtQkE7QUFGcEIsR0FyQkY7QUF5QlhDLGtCQUFnQixFQUFFO0FBQ2RBLG9CQUFnQixFQUFoQkEsaURBRGM7QUFFZFosWUFBUSxFQUFFYSxrREFBd0JBO0FBRnBCLEdBekJQO0FBNkJYQyxZQUFVLEVBQUU7QUFDUkEsY0FBVSxFQUFWQSwyQ0FEUTtBQUVSZCxZQUFRLEVBQUVlLDRDQUFrQkE7QUFGcEIsR0E3QkQ7QUFpQ1hDLGFBQVcsRUFBRTtBQUNUQyxjQUFVLEVBQUVDLDRDQUFtQkE7QUFEdEIsR0FqQ0Y7QUFvQ1hDLG1CQUFpQixFQUFFO0FBQ2ZBLHFCQUFpQixFQUFqQkEsa0RBRGU7QUFFZm5CLFlBQVEsRUFBRW9CLG1EQUFvQkE7QUFGZixHQXBDUjtBQXdDWEMsaUJBQWUsRUFBRTtBQUNiQSxtQkFBZSxFQUFmQSxpREFEYTtBQUVickIsWUFBUSxFQUFFc0Isa0RBQWtCQTtBQUZmLEdBeENOO0FBNENYQyxXQUFTLEVBQUU7QUFDUEEsYUFBUyxFQUFUQSwyQ0FETztBQUVQdkIsWUFBUSxFQUFFd0IsNENBQWlCQTtBQUZwQixHQTVDQTtBQWdEWEMsY0FBWSxFQUFFO0FBQ1ZBLGdCQUFZLEVBQVpBLDhDQURVO0FBRVZ6QixZQUFRLEVBQUUwQixnREFBb0JBO0FBRnBCO0FBaERILENBQWYiLCJmaWxlIjoiLi9hcHAvZm9ybXMvZmllbGRzL2luZGV4LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEZpbGVwaWNrZXJGaWVsZCwgeyBJbnN0YW5jZSBhcyBGaWxlcGlja2VyRmllbGRJbnN0YW5jZSB9IGZyb20gJy4vZmlsZXBpY2tlcic7XG5pbXBvcnQgU2VsZWN0aXplRmllbGQsIHsgSW5zdGFuY2UgYXMgU2VsZWN0aXplRmllbGRJbnN0YW5jZSB9IGZyb20gJy4vc2VsZWN0aXplJztcbmltcG9ydCBBcnJheUZpZWxkLCB7IEluc3RhbmNlIGFzIEFycmF5RmllbGRJbnN0YW5jZSB9IGZyb20gJy4vYXJyYXknO1xuaW1wb3J0IENvbGxlY3Rpb25zRmllbGQsIHsgSW5zdGFuY2UgYXMgQ29sbGVjdGlvbnNGaWVsZEluc3RhbmNlIH0gZnJvbSAnLi9jb2xsZWN0aW9ucyc7XG5pbXBvcnQgRGF0ZVRpbWVGaWVsZCwgeyBJbnN0YW5jZSBhcyBEYXRlVGltZUZpZWxkSW5zdGFuY2UgfSBmcm9tICcuL2RhdGV0aW1lJztcbmltcG9ydCBFZGl0b3JGaWVsZCwgeyBJbnN0YW5jZSBhcyBFZGl0b3JGaWVsZEluc3RhbmNlIH0gZnJvbSAnLi9lZGl0b3InO1xuaW1wb3J0IENvbG9ycGlja2VyRmllbGQsIHsgSW5zdGFuY2UgYXMgQ29sb3JwaWNrZXJGaWVsZEluc3RhbmNlIH0gZnJvbSAnLi9jb2xvcnBpY2tlcic7XG5pbXBvcnQgRmlsZXNGaWVsZCwgeyBJbnN0YW5jZSBhcyBGaWxlc0ZpZWxkSW5zdGFuY2UgfSBmcm9tICcuL2ZpbGVzJztcbmltcG9ydCBGb2xkZXJGaWVsZEluc3RhbmNlIGZyb20gJy4vZm9sZGVyJztcbmltcG9ydCBTZWxlY3RVbmlxdWVGaWVsZCwgeyBJbnN0YW5jZSBhcyBTZWxlY3RVbmlxdWVJbnN0YW5jZSB9IGZyb20gJy4vc2VsZWN0dW5pcXVlJztcbmltcG9ydCBJY29ucGlja2VyRmllbGQsIHsgSW5zdGFuY2UgYXMgSWNvbnBpY2tlckluc3RhbmNlIH0gZnJvbSAnLi9pY29ucGlja2VyJztcbmltcG9ydCBDcm9uRmllbGQsIHsgSW5zdGFuY2UgYXMgQ3JvbkZpZWxkSW5zdGFuY2UgfSBmcm9tICcuL2Nyb24nO1xuaW1wb3J0IFBhcmVudHNGaWVsZCwgeyBJbnN0YW5jZXMgYXMgUGFyZW50c0ZpZWxkSW5zdGFuY2UgfSBmcm9tICcuL3BhcmVudHMnO1xuXG5pbXBvcnQgJy4vYWNsLXBpY2tlcic7XG5pbXBvcnQgJy4vcGVybWlzc2lvbnMnO1xuaW1wb3J0ICcuL2luZGV0ZXJtaW5hdGUnO1xuaW1wb3J0ICcuL21lZGlhcGlja2VyJztcbmltcG9ydCAnLi9tdWx0aWxldmVsJztcbmltcG9ydCAnLi90ZXh0JztcbmltcG9ydCAnLi9yYW5nZSc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBGaWxlcGlja2VyRmllbGQ6IHtcbiAgICAgICAgRmlsZXBpY2tlckZpZWxkLFxuICAgICAgICBJbnN0YW5jZTogRmlsZXBpY2tlckZpZWxkSW5zdGFuY2VcbiAgICB9LFxuICAgIFNlbGVjdGl6ZUZpZWxkOiB7XG4gICAgICAgIFNlbGVjdGl6ZUZpZWxkLFxuICAgICAgICBJbnN0YW5jZTogU2VsZWN0aXplRmllbGRJbnN0YW5jZVxuICAgIH0sXG4gICAgQXJyYXlGaWVsZDoge1xuICAgICAgICBBcnJheUZpZWxkLFxuICAgICAgICBJbnN0YW5jZTogQXJyYXlGaWVsZEluc3RhbmNlXG4gICAgfSxcbiAgICBDb2xsZWN0aW9uc0ZpZWxkOiB7XG4gICAgICAgIENvbGxlY3Rpb25zRmllbGQsXG4gICAgICAgIEluc3RhbmNlOiBDb2xsZWN0aW9uc0ZpZWxkSW5zdGFuY2VcbiAgICB9LFxuICAgIERhdGVUaW1lRmllbGQ6IHtcbiAgICAgICAgRGF0ZVRpbWVGaWVsZCxcbiAgICAgICAgSW5zdGFuY2U6IERhdGVUaW1lRmllbGRJbnN0YW5jZVxuICAgIH0sXG4gICAgRWRpdG9yRmllbGQ6IHtcbiAgICAgICAgRWRpdG9yRmllbGQsXG4gICAgICAgIEluc3RhbmNlOiBFZGl0b3JGaWVsZEluc3RhbmNlXG4gICAgfSxcbiAgICBDb2xvcnBpY2tlckZpZWxkOiB7XG4gICAgICAgIENvbG9ycGlja2VyRmllbGQsXG4gICAgICAgIEluc3RhbmNlOiBDb2xvcnBpY2tlckZpZWxkSW5zdGFuY2VcbiAgICB9LFxuICAgIEZpbGVzRmllbGQ6IHtcbiAgICAgICAgRmlsZXNGaWVsZCxcbiAgICAgICAgSW5zdGFuY2U6IEZpbGVzRmllbGRJbnN0YW5jZVxuICAgIH0sXG4gICAgRm9sZGVyRmllbGQ6IHtcbiAgICAgICAgUmVnZW5lcmF0ZTogRm9sZGVyRmllbGRJbnN0YW5jZVxuICAgIH0sXG4gICAgU2VsZWN0VW5pcXVlRmllbGQ6IHtcbiAgICAgICAgU2VsZWN0VW5pcXVlRmllbGQsXG4gICAgICAgIEluc3RhbmNlOiBTZWxlY3RVbmlxdWVJbnN0YW5jZVxuICAgIH0sXG4gICAgSWNvbnBpY2tlckZpZWxkOiB7XG4gICAgICAgIEljb25waWNrZXJGaWVsZCxcbiAgICAgICAgSW5zdGFuY2U6IEljb25waWNrZXJJbnN0YW5jZVxuICAgIH0sXG4gICAgQ3JvbkZpZWxkOiB7XG4gICAgICAgIENyb25GaWVsZCxcbiAgICAgICAgSW5zdGFuY2U6IENyb25GaWVsZEluc3RhbmNlXG4gICAgfSxcbiAgICBQYXJlbnRzRmllbGQ6IHtcbiAgICAgICAgUGFyZW50c0ZpZWxkLFxuICAgICAgICBJbnN0YW5jZTogUGFyZW50c0ZpZWxkSW5zdGFuY2VcbiAgICB9XG59O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./app/forms/fields/index.js\n"); /***/ }), /***/ "./app/forms/fields/mediapicker.js": -/*!*****************************************!* +/*!*****************************************!*\ !*** ./app/forms/fields/mediapicker.js ***! \*****************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { @@ -209,7 +220,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var jque /***/ }), /***/ "./app/forms/fields/multilevel.js": -/*!****************************************!* +/*!****************************************!*\ !*** ./app/forms/fields/multilevel.js ***! \****************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { @@ -220,18 +231,18 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var jque /***/ }), /***/ "./app/forms/fields/parents.js": -/*!*************************************!* +/*!*************************************!*\ !*** ./app/forms/fields/parents.js ***! \*************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Instances\": () => /* binding */ Instances,\n/* harmony export */ \"default\": () => /* binding */ Parents,\n/* harmony export */ \"b64_encode_unicode\": () => /* binding */ b64_encode_unicode,\n/* harmony export */ \"b64_decode_unicode\": () => /* binding */ b64_decode_unicode\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils_finderjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils/finderjs */ \"./app/utils/finderjs.js\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! grav-config */ \"grav-config\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(grav_config__WEBPACK_IMPORTED_MODULE_2__);\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\nvar XHRUUID = 0;\nvar Instances = {};\n\nvar Parents = /*#__PURE__*/function () {\n function Parents(container, field, data) {\n var _this = this;\n\n _classCallCheck(this, Parents);\n\n this.container = jquery__WEBPACK_IMPORTED_MODULE_0___default()(container);\n this.fieldName = field.attr('name');\n this.field = jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"[name=\\\"\".concat(this.fieldName, \"\\\"]\"));\n this.data = data;\n this.parentLabel = jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"[data-parents-field-label=\\\"\".concat(this.fieldName, \"\\\"]\"));\n this.parentName = jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"[data-parents-field-name=\\\"\".concat(this.fieldName, \"\\\"]\"));\n var dataLoad = this.dataLoad;\n this.finder = new _utils_finderjs__WEBPACK_IMPORTED_MODULE_1__.default(this.container, function (parent, callback) {\n return dataLoad.call(_this, parent, callback);\n }, {\n labelKey: 'name',\n defaultPath: this.field.val(),\n createItemContent: function createItemContent(item) {\n return Parents.createItemContent(this.config, item);\n }\n });\n /*\n this.finder.$emitter.on('leaf-selected', (item) => {\n console.log('selected', item);\n this.finder.emit('create-column', () => this.createSimpleColumn(item));\n });\n this.finder.$emitter.on('item-selected', (selected) => {\n console.log('selected', selected);\n // for future use only - create column-card creation for file with details like in macOS finder\n // this.finder.$emitter('create-column', () => this.createSimpleColumn(selected));\n }); */\n\n this.finder.$emitter.on('column-created', function () {\n _this.container[0].scrollLeft = _this.container[0].scrollWidth - _this.container[0].clientWidth;\n });\n }\n\n _createClass(Parents, [{\n key: \"createSimpleColumn\",\n value: function createSimpleColumn(item) {}\n }, {\n key: \"dataLoad\",\n value: function dataLoad(parent, callback) {\n var _this2 = this;\n\n if (!parent) {\n return callback(this.data);\n }\n\n if (parent.type !== 'dir' || !parent['has-children']) {\n return false;\n }\n\n var UUID = ++XHRUUID;\n this.startLoader();\n jquery__WEBPACK_IMPORTED_MODULE_0___default().ajax({\n url: \"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_2__.config.current_url),\n method: 'post',\n data: Object.assign({}, getExtraFormData(this.container), {\n route: b64_encode_unicode(parent.value),\n field: this.field.data('fieldName'),\n action: 'getLevelListing',\n 'admin-nonce': grav_config__WEBPACK_IMPORTED_MODULE_2__.config.admin_nonce\n }),\n success: function success(response) {\n _this2.stopLoader();\n\n if (response.status === 'error') {\n _this2.finder.$emitter.emit('create-column', Parents.createErrorColumn(response.message)[0]);\n\n return false;\n } // stale request\n\n\n if (UUID !== XHRUUID) {\n return false;\n }\n\n return callback(response.data);\n }\n });\n }\n }, {\n key: \"startLoader\",\n value: function startLoader() {\n this.loadingIndicator = Parents.createLoadingColumn();\n this.finder.$emitter.emit('create-column', this.loadingIndicator[0]);\n return this.loadingIndicator;\n }\n }, {\n key: \"stopLoader\",\n value: function stopLoader() {\n return this.loadingIndicator && this.loadingIndicator.remove();\n }\n }], [{\n key: \"createItemContent\",\n value: function createItemContent(config, item) {\n var frag = document.createDocumentFragment();\n var label = jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"\"));\n var infoContainer = jquery__WEBPACK_IMPORTED_MODULE_0___default()('');\n var iconPrepend = jquery__WEBPACK_IMPORTED_MODULE_0___default()('');\n var iconAppend = jquery__WEBPACK_IMPORTED_MODULE_0___default()('');\n var badge = jquery__WEBPACK_IMPORTED_MODULE_0___default()('');\n var prependClasses = ['fa'];\n var appendClasses = ['fa']; // prepend icon\n\n if (item.children || item.type === 'dir') {\n prependClasses.push('fa-folder');\n } else if (item.type === 'root') {\n prependClasses.push('fa-sitemap');\n } else if (item.type === 'file') {\n prependClasses.push('fa-file-o');\n }\n\n iconPrepend.addClass(prependClasses.join(' ')); // text label\n\n label.text(item[config.labelKey]).prepend(iconPrepend);\n label.appendTo(frag); // append icon\n\n if (item.children || item['has-children']) {\n appendClasses.push('fa-caret-right');\n badge.text(item.size || item.count || 0);\n badge.appendTo(infoContainer);\n }\n\n iconAppend.addClass(appendClasses.join(' '));\n iconAppend.appendTo(infoContainer);\n infoContainer.appendTo(frag);\n return frag;\n }\n }, {\n key: \"createLoadingColumn\",\n value: function createLoadingColumn() {\n return jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"\\n
          \\n
          \\n
          Loading...
          \\n
          \\n
          \\n \");\n }\n }, {\n key: \"createErrorColumn\",\n value: function createErrorColumn(error) {\n return jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"\\n
          \\n
          \\n \\n \".concat(error, \"\\n
          \\n
          \\n \"));\n }\n }]);\n\n return Parents;\n}();\n\n\nvar b64_encode_unicode = function b64_encode_unicode(str) {\n return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function toSolidBytes(match, p1) {\n return String.fromCharCode('0x' + p1);\n }));\n};\nvar b64_decode_unicode = function b64_decode_unicode(str) {\n return decodeURIComponent(atob(str).split('').map(function (c) {\n return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);\n }).join(''));\n};\n\nvar getExtraFormData = function getExtraFormData(container) {\n var form = container.closest('form');\n\n if (container.closest('[data-remodal-id]').length) {\n form = jquery__WEBPACK_IMPORTED_MODULE_0___default()('form#blueprints');\n }\n\n var data = {};\n var unique_id = form.find('[name=\"__unique_form_id__\"]');\n data['__form-name__'] = form.find('[name=\"__form-name__\"]').val();\n data['form-nonce'] = form.find('[name=\"form-nonce\"]').val();\n\n if (unique_id.length) {\n data['__unique_form_id__'] = unique_id.val();\n }\n\n return data;\n};\n\njquery__WEBPACK_IMPORTED_MODULE_0___default()(document).on('click', '[data-parents]', function (event) {\n event.preventDefault();\n event.stopPropagation();\n var target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.currentTarget);\n var field = target.closest('.parents-wrapper').find('input[name]');\n var fieldName = field.attr('name');\n\n if (!field.length) {\n fieldName = target.data('parents');\n field = jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"[name=\\\"\".concat(target.data('parents'), \"\\\"]\")).first();\n }\n\n var modal = jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"[data-remodal-id=\\\"\".concat(target.data('remodalTarget') || 'parents', \"\\\"]\"));\n var loader = modal.find('.grav-loading');\n var content = modal.find('.parents-content');\n loader.css('display', 'block');\n content.html('');\n jquery__WEBPACK_IMPORTED_MODULE_0___default().ajax({\n url: \"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_2__.config.current_url),\n method: 'post',\n data: Object.assign({}, getExtraFormData(target), {\n route: b64_encode_unicode(field.val()),\n field: field.data('fieldName'),\n action: 'getLevelListing',\n 'admin-nonce': grav_config__WEBPACK_IMPORTED_MODULE_2__.config.admin_nonce,\n initial: true\n }),\n success: function success(response) {\n loader.css('display', 'none');\n\n if (response.status === 'error') {\n content.html(response.message);\n return true;\n }\n\n if (!Instances[\"\".concat(fieldName, \"-\").concat(modal.data('remodalId'))]) {\n Instances[\"\".concat(fieldName, \"-\").concat(modal.data('remodalId'))] = new Parents(content, field, response.data);\n } else {\n Instances[\"\".concat(fieldName, \"-\").concat(modal.data('remodalId'))].finder.reload(response.data);\n }\n\n modal.data('parents', Instances[\"\".concat(fieldName, \"-\").concat(modal.data('remodalId'))]);\n modal.data('parents-selectedField', field);\n }\n });\n}); // apply finder selection to field\n\njquery__WEBPACK_IMPORTED_MODULE_0___default()(document).on('click', '[data-remodal-id].parents-container [data-parents-select]', function (event) {\n var modal = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.currentTarget).closest('[data-remodal-id]');\n var parents = modal.data('parents');\n var selectedField = modal.data('parentsSelectedField');\n var finder = parents.finder;\n var field = parents.field;\n var parentLabel = parents.parentLabel;\n var parentName = parents.parentName;\n var selection = finder.findLastActive().item[0];\n var value = selection._item[finder.config.valueKey];\n var name = selection._item[finder.config.labelKey];\n console.log('click [data-parents-select]', selectedField);\n\n if (selectedField.closest('.remodal').length) {\n var index = field.index(selectedField) - 1;\n selectedField.val(value);\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(parentLabel[index]).text(value);\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(parentName[index]).text(name);\n } else {\n field.val(value);\n parentLabel.text(value);\n parentName.text(name);\n finder.config.defaultPath = value;\n }\n\n var remodal = (jquery__WEBPACK_IMPORTED_MODULE_0___default().remodal.lookup)[jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"[data-remodal-id=\\\"\".concat(modal.data('remodalId'), \"\\\"]\")).data('remodal')];\n remodal.close();\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL2Zvcm1zL2ZpZWxkcy9wYXJlbnRzLmpzPzQ5YzgiXSwibmFtZXMiOlsiWEhSVVVJRCIsIkluc3RhbmNlcyIsIlBhcmVudHMiLCJjb250YWluZXIiLCJmaWVsZCIsImRhdGEiLCIkIiwiZmllbGROYW1lIiwiYXR0ciIsInBhcmVudExhYmVsIiwicGFyZW50TmFtZSIsImRhdGFMb2FkIiwiZmluZGVyIiwiRmluZGVyIiwicGFyZW50IiwiY2FsbGJhY2siLCJjYWxsIiwibGFiZWxLZXkiLCJkZWZhdWx0UGF0aCIsInZhbCIsImNyZWF0ZUl0ZW1Db250ZW50IiwiaXRlbSIsImNvbmZpZyIsIiRlbWl0dGVyIiwib24iLCJzY3JvbGxMZWZ0Iiwic2Nyb2xsV2lkdGgiLCJjbGllbnRXaWR0aCIsInR5cGUiLCJVVUlEIiwic3RhcnRMb2FkZXIiLCJ1cmwiLCJncmF2Q29uZmlnIiwibWV0aG9kIiwiT2JqZWN0IiwiYXNzaWduIiwiZ2V0RXh0cmFGb3JtRGF0YSIsInJvdXRlIiwiYjY0X2VuY29kZV91bmljb2RlIiwidmFsdWUiLCJhY3Rpb24iLCJhZG1pbl9ub25jZSIsInN1Y2Nlc3MiLCJyZXNwb25zZSIsInN0b3BMb2FkZXIiLCJzdGF0dXMiLCJlbWl0IiwiY3JlYXRlRXJyb3JDb2x1bW4iLCJtZXNzYWdlIiwibG9hZGluZ0luZGljYXRvciIsImNyZWF0ZUxvYWRpbmdDb2x1bW4iLCJyZW1vdmUiLCJmcmFnIiwiZG9jdW1lbnQiLCJjcmVhdGVEb2N1bWVudEZyYWdtZW50IiwibGFiZWwiLCJpbmZvQ29udGFpbmVyIiwiaWNvblByZXBlbmQiLCJpY29uQXBwZW5kIiwiYmFkZ2UiLCJwcmVwZW5kQ2xhc3NlcyIsImFwcGVuZENsYXNzZXMiLCJjaGlsZHJlbiIsInB1c2giLCJhZGRDbGFzcyIsImpvaW4iLCJ0ZXh0IiwicHJlcGVuZCIsImFwcGVuZFRvIiwic2l6ZSIsImNvdW50IiwiZXJyb3IiLCJzdHIiLCJidG9hIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwicmVwbGFjZSIsInRvU29saWRCeXRlcyIsIm1hdGNoIiwicDEiLCJTdHJpbmciLCJmcm9tQ2hhckNvZGUiLCJiNjRfZGVjb2RlX3VuaWNvZGUiLCJkZWNvZGVVUklDb21wb25lbnQiLCJhdG9iIiwic3BsaXQiLCJtYXAiLCJjIiwiY2hhckNvZGVBdCIsInRvU3RyaW5nIiwic2xpY2UiLCJmb3JtIiwiY2xvc2VzdCIsImxlbmd0aCIsInVuaXF1ZV9pZCIsImZpbmQiLCJldmVudCIsInByZXZlbnREZWZhdWx0Iiwic3RvcFByb3BhZ2F0aW9uIiwidGFyZ2V0IiwiY3VycmVudFRhcmdldCIsImZpcnN0IiwibW9kYWwiLCJsb2FkZXIiLCJjb250ZW50IiwiY3NzIiwiaHRtbCIsImluaXRpYWwiLCJyZWxvYWQiLCJwYXJlbnRzIiwic2VsZWN0ZWRGaWVsZCIsInNlbGVjdGlvbiIsImZpbmRMYXN0QWN0aXZlIiwiX2l0ZW0iLCJ2YWx1ZUtleSIsIm5hbWUiLCJjb25zb2xlIiwibG9nIiwiaW5kZXgiLCJyZW1vZGFsIiwiY2xvc2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUVBLElBQUlBLE9BQU8sR0FBRyxDQUFkO0FBQ08sSUFBTUMsU0FBUyxHQUFHLEVBQWxCOztJQUVjQyxPO0FBQ2pCLG1CQUFZQyxTQUFaLEVBQXVCQyxLQUF2QixFQUE4QkMsSUFBOUIsRUFBb0M7QUFBQTs7QUFBQTs7QUFDaEMsU0FBS0YsU0FBTCxHQUFpQkcsNkNBQUMsQ0FBQ0gsU0FBRCxDQUFsQjtBQUNBLFNBQUtJLFNBQUwsR0FBaUJILEtBQUssQ0FBQ0ksSUFBTixDQUFXLE1BQVgsQ0FBakI7QUFDQSxTQUFLSixLQUFMLEdBQWFFLDZDQUFDLG1CQUFXLEtBQUtDLFNBQWhCLFNBQWQ7QUFDQSxTQUFLRixJQUFMLEdBQVlBLElBQVo7QUFDQSxTQUFLSSxXQUFMLEdBQW1CSCw2Q0FBQyx1Q0FBK0IsS0FBS0MsU0FBcEMsU0FBcEI7QUFDQSxTQUFLRyxVQUFMLEdBQWtCSiw2Q0FBQyxzQ0FBOEIsS0FBS0MsU0FBbkMsU0FBbkI7QUFFQSxRQUFNSSxRQUFRLEdBQUcsS0FBS0EsUUFBdEI7QUFFQSxTQUFLQyxNQUFMLEdBQWMsSUFBSUMsb0RBQUosQ0FDVixLQUFLVixTQURLLEVBRVYsVUFBQ1csTUFBRCxFQUFTQyxRQUFULEVBQXNCO0FBQ2xCLGFBQU9KLFFBQVEsQ0FBQ0ssSUFBVCxDQUFjLEtBQWQsRUFBb0JGLE1BQXBCLEVBQTRCQyxRQUE1QixDQUFQO0FBQ0gsS0FKUyxFQUtWO0FBQ0lFLGNBQVEsRUFBRSxNQURkO0FBRUlDLGlCQUFXLEVBQUUsS0FBS2QsS0FBTCxDQUFXZSxHQUFYLEVBRmpCO0FBR0lDLHVCQUFpQixFQUFFLDJCQUFTQyxJQUFULEVBQWU7QUFDOUIsZUFBT25CLE9BQU8sQ0FBQ2tCLGlCQUFSLENBQTBCLEtBQUtFLE1BQS9CLEVBQXVDRCxJQUF2QyxDQUFQO0FBQ0g7QUFMTCxLQUxVLENBQWQ7QUFjQTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFHUSxTQUFLVCxNQUFMLENBQVlXLFFBQVosQ0FBcUJDLEVBQXJCLENBQXdCLGdCQUF4QixFQUEwQyxZQUFNO0FBQzVDLFdBQUksQ0FBQ3JCLFNBQUwsQ0FBZSxDQUFmLEVBQWtCc0IsVUFBbEIsR0FBK0IsS0FBSSxDQUFDdEIsU0FBTCxDQUFlLENBQWYsRUFBa0J1QixXQUFsQixHQUFnQyxLQUFJLENBQUN2QixTQUFMLENBQWUsQ0FBZixFQUFrQndCLFdBQWpGO0FBQ0gsS0FGRDtBQUdIOzs7O3VDQStEa0JOLEksRUFBTSxDQUFFOzs7NkJBRWxCUCxNLEVBQVFDLFEsRUFBVTtBQUFBOztBQUN2QixVQUFJLENBQUNELE1BQUwsRUFBYTtBQUNULGVBQU9DLFFBQVEsQ0FBQyxLQUFLVixJQUFOLENBQWY7QUFDSDs7QUFFRCxVQUFJUyxNQUFNLENBQUNjLElBQVAsS0FBZ0IsS0FBaEIsSUFBeUIsQ0FBQ2QsTUFBTSxDQUFDLGNBQUQsQ0FBcEMsRUFBc0Q7QUFDbEQsZUFBTyxLQUFQO0FBQ0g7O0FBRUQsVUFBTWUsSUFBSSxHQUFHLEVBQUU3QixPQUFmO0FBQ0EsV0FBSzhCLFdBQUw7QUFFQXhCLHdEQUFBLENBQU87QUFDSHlCLFdBQUcsWUFBS0MsMkRBQUwsQ0FEQTtBQUVIQyxjQUFNLEVBQUUsTUFGTDtBQUdINUIsWUFBSSxFQUFFNkIsTUFBTSxDQUFDQyxNQUFQLENBQWMsRUFBZCxFQUFrQkMsZ0JBQWdCLENBQUMsS0FBS2pDLFNBQU4sQ0FBbEMsRUFBb0Q7QUFDdERrQyxlQUFLLEVBQUVDLGtCQUFrQixDQUFDeEIsTUFBTSxDQUFDeUIsS0FBUixDQUQ2QjtBQUV0RG5DLGVBQUssRUFBRSxLQUFLQSxLQUFMLENBQVdDLElBQVgsQ0FBZ0IsV0FBaEIsQ0FGK0M7QUFHdERtQyxnQkFBTSxFQUFFLGlCQUg4QztBQUl0RCx5QkFBZVIsMkRBQXNCUztBQUppQixTQUFwRCxDQUhIO0FBU0hDLGVBQU8sRUFBRSxpQkFBQ0MsUUFBRCxFQUFjO0FBQ25CLGdCQUFJLENBQUNDLFVBQUw7O0FBRUEsY0FBSUQsUUFBUSxDQUFDRSxNQUFULEtBQW9CLE9BQXhCLEVBQWlDO0FBQzdCLGtCQUFJLENBQUNqQyxNQUFMLENBQVlXLFFBQVosQ0FBcUJ1QixJQUFyQixDQUEwQixlQUExQixFQUEyQzVDLE9BQU8sQ0FBQzZDLGlCQUFSLENBQTBCSixRQUFRLENBQUNLLE9BQW5DLEVBQTRDLENBQTVDLENBQTNDOztBQUNBLG1CQUFPLEtBQVA7QUFDSCxXQU5rQixDQU9uQjs7O0FBQ0EsY0FBSW5CLElBQUksS0FBSzdCLE9BQWIsRUFBc0I7QUFDbEIsbUJBQU8sS0FBUDtBQUNIOztBQUVELGlCQUFPZSxRQUFRLENBQUM0QixRQUFRLENBQUN0QyxJQUFWLENBQWY7QUFDSDtBQXRCRSxPQUFQO0FBd0JIOzs7a0NBRWE7QUFDVixXQUFLNEMsZ0JBQUwsR0FBd0IvQyxPQUFPLENBQUNnRCxtQkFBUixFQUF4QjtBQUNBLFdBQUt0QyxNQUFMLENBQVlXLFFBQVosQ0FBcUJ1QixJQUFyQixDQUEwQixlQUExQixFQUEyQyxLQUFLRyxnQkFBTCxDQUFzQixDQUF0QixDQUEzQztBQUVBLGFBQU8sS0FBS0EsZ0JBQVo7QUFDSDs7O2lDQUVZO0FBQ1QsYUFBTyxLQUFLQSxnQkFBTCxJQUF5QixLQUFLQSxnQkFBTCxDQUFzQkUsTUFBdEIsRUFBaEM7QUFDSDs7O3NDQTlHd0I3QixNLEVBQVFELEksRUFBTTtBQUNuQyxVQUFNK0IsSUFBSSxHQUFHQyxRQUFRLENBQUNDLHNCQUFULEVBQWI7QUFFQSxVQUFNQyxLQUFLLEdBQUdqRCw2Q0FBQyx5QkFBaUJlLElBQUksQ0FBQ0MsTUFBTSxDQUFDTCxRQUFSLENBQXJCLFdBQWY7QUFDQSxVQUFNdUMsYUFBYSxHQUFHbEQsNkNBQUMsQ0FBQyxpQ0FBRCxDQUF2QjtBQUNBLFVBQU1tRCxXQUFXLEdBQUduRCw2Q0FBQyxDQUFDLE9BQUQsQ0FBckI7QUFDQSxVQUFNb0QsVUFBVSxHQUFHcEQsNkNBQUMsQ0FBQyxPQUFELENBQXBCO0FBQ0EsVUFBTXFELEtBQUssR0FBR3JELDZDQUFDLENBQUMsd0JBQUQsQ0FBZjtBQUNBLFVBQU1zRCxjQUFjLEdBQUcsQ0FBQyxJQUFELENBQXZCO0FBQ0EsVUFBTUMsYUFBYSxHQUFHLENBQUMsSUFBRCxDQUF0QixDQVRtQyxDQVduQzs7QUFDQSxVQUFJeEMsSUFBSSxDQUFDeUMsUUFBTCxJQUFpQnpDLElBQUksQ0FBQ08sSUFBTCxLQUFjLEtBQW5DLEVBQTBDO0FBQ3RDZ0Msc0JBQWMsQ0FBQ0csSUFBZixDQUFvQixXQUFwQjtBQUNILE9BRkQsTUFFTyxJQUFJMUMsSUFBSSxDQUFDTyxJQUFMLEtBQWMsTUFBbEIsRUFBMEI7QUFDN0JnQyxzQkFBYyxDQUFDRyxJQUFmLENBQW9CLFlBQXBCO0FBQ0gsT0FGTSxNQUVBLElBQUkxQyxJQUFJLENBQUNPLElBQUwsS0FBYyxNQUFsQixFQUEwQjtBQUM3QmdDLHNCQUFjLENBQUNHLElBQWYsQ0FBb0IsV0FBcEI7QUFDSDs7QUFFRE4saUJBQVcsQ0FBQ08sUUFBWixDQUFxQkosY0FBYyxDQUFDSyxJQUFmLENBQW9CLEdBQXBCLENBQXJCLEVBcEJtQyxDQXNCbkM7O0FBQ0FWLFdBQUssQ0FBQ1csSUFBTixDQUFXN0MsSUFBSSxDQUFDQyxNQUFNLENBQUNMLFFBQVIsQ0FBZixFQUFrQ2tELE9BQWxDLENBQTBDVixXQUExQztBQUNBRixXQUFLLENBQUNhLFFBQU4sQ0FBZWhCLElBQWYsRUF4Qm1DLENBMEJuQzs7QUFDQSxVQUFJL0IsSUFBSSxDQUFDeUMsUUFBTCxJQUFpQnpDLElBQUksQ0FBQyxjQUFELENBQXpCLEVBQTJDO0FBQ3ZDd0MscUJBQWEsQ0FBQ0UsSUFBZCxDQUFtQixnQkFBbkI7QUFDQUosYUFBSyxDQUFDTyxJQUFOLENBQVc3QyxJQUFJLENBQUNnRCxJQUFMLElBQWFoRCxJQUFJLENBQUNpRCxLQUFsQixJQUEyQixDQUF0QztBQUNBWCxhQUFLLENBQUNTLFFBQU4sQ0FBZVosYUFBZjtBQUNIOztBQUVERSxnQkFBVSxDQUFDTSxRQUFYLENBQW9CSCxhQUFhLENBQUNJLElBQWQsQ0FBbUIsR0FBbkIsQ0FBcEI7QUFDQVAsZ0JBQVUsQ0FBQ1UsUUFBWCxDQUFvQlosYUFBcEI7QUFDQUEsbUJBQWEsQ0FBQ1ksUUFBZCxDQUF1QmhCLElBQXZCO0FBRUEsYUFBT0EsSUFBUDtBQUNIOzs7MENBRTRCO0FBQ3pCLGFBQU85Qyw2Q0FBQyxpUkFBUjtBQU9IOzs7c0NBRXdCaUUsSyxFQUFPO0FBQzVCLGFBQU9qRSw2Q0FBQyw0TkFJWWlFLEtBSlosbUVBQVI7QUFRSDs7Ozs7OztBQXNERSxJQUFNakMsa0JBQWtCLEdBQUcsU0FBckJBLGtCQUFxQixDQUFDa0MsR0FBRCxFQUFTO0FBQ3ZDLFNBQU9DLElBQUksQ0FBQ0Msa0JBQWtCLENBQUNGLEdBQUQsQ0FBbEIsQ0FBd0JHLE9BQXhCLENBQWdDLGlCQUFoQyxFQUNSLFNBQVNDLFlBQVQsQ0FBc0JDLEtBQXRCLEVBQTZCQyxFQUE3QixFQUFpQztBQUM3QixXQUFPQyxNQUFNLENBQUNDLFlBQVAsQ0FBb0IsT0FBT0YsRUFBM0IsQ0FBUDtBQUNILEdBSE8sQ0FBRCxDQUFYO0FBSUgsQ0FMTTtBQU9BLElBQU1HLGtCQUFrQixHQUFHLFNBQXJCQSxrQkFBcUIsQ0FBQ1QsR0FBRCxFQUFTO0FBQ3ZDLFNBQU9VLGtCQUFrQixDQUFDQyxJQUFJLENBQUNYLEdBQUQsQ0FBSixDQUFVWSxLQUFWLENBQWdCLEVBQWhCLEVBQW9CQyxHQUFwQixDQUF3QixVQUFTQyxDQUFULEVBQVk7QUFDMUQsV0FBTyxNQUFNLENBQUMsT0FBT0EsQ0FBQyxDQUFDQyxVQUFGLENBQWEsQ0FBYixFQUFnQkMsUUFBaEIsQ0FBeUIsRUFBekIsQ0FBUixFQUFzQ0MsS0FBdEMsQ0FBNEMsQ0FBQyxDQUE3QyxDQUFiO0FBQ0gsR0FGeUIsRUFFdkJ4QixJQUZ1QixDQUVsQixFQUZrQixDQUFELENBQXpCO0FBR0gsQ0FKTTs7QUFNUCxJQUFNN0IsZ0JBQWdCLEdBQUcsU0FBbkJBLGdCQUFtQixDQUFDakMsU0FBRCxFQUFlO0FBQ3BDLE1BQUl1RixJQUFJLEdBQUd2RixTQUFTLENBQUN3RixPQUFWLENBQWtCLE1BQWxCLENBQVg7O0FBQ0EsTUFBSXhGLFNBQVMsQ0FBQ3dGLE9BQVYsQ0FBa0IsbUJBQWxCLEVBQXVDQyxNQUEzQyxFQUFtRDtBQUMvQ0YsUUFBSSxHQUFHcEYsNkNBQUMsQ0FBQyxpQkFBRCxDQUFSO0FBQ0g7O0FBQ0QsTUFBTUQsSUFBSSxHQUFHLEVBQWI7QUFDQSxNQUFNd0YsU0FBUyxHQUFHSCxJQUFJLENBQUNJLElBQUwsQ0FBVSw2QkFBVixDQUFsQjtBQUVBekYsTUFBSSxDQUFDLGVBQUQsQ0FBSixHQUF3QnFGLElBQUksQ0FBQ0ksSUFBTCxDQUFVLHdCQUFWLEVBQW9DM0UsR0FBcEMsRUFBeEI7QUFDQWQsTUFBSSxDQUFDLFlBQUQsQ0FBSixHQUFxQnFGLElBQUksQ0FBQ0ksSUFBTCxDQUFVLHFCQUFWLEVBQWlDM0UsR0FBakMsRUFBckI7O0FBRUEsTUFBSTBFLFNBQVMsQ0FBQ0QsTUFBZCxFQUFzQjtBQUNsQnZGLFFBQUksQ0FBQyxvQkFBRCxDQUFKLEdBQTZCd0YsU0FBUyxDQUFDMUUsR0FBVixFQUE3QjtBQUNIOztBQUVELFNBQU9kLElBQVA7QUFDSCxDQWhCRDs7QUFrQkFDLDZDQUFDLENBQUMrQyxRQUFELENBQUQsQ0FBWTdCLEVBQVosQ0FBZSxPQUFmLEVBQXdCLGdCQUF4QixFQUEwQyxVQUFDdUUsS0FBRCxFQUFXO0FBQ2pEQSxPQUFLLENBQUNDLGNBQU47QUFDQUQsT0FBSyxDQUFDRSxlQUFOO0FBRUEsTUFBTUMsTUFBTSxHQUFHNUYsNkNBQUMsQ0FBQ3lGLEtBQUssQ0FBQ0ksYUFBUCxDQUFoQjtBQUNBLE1BQUkvRixLQUFLLEdBQUc4RixNQUFNLENBQUNQLE9BQVAsQ0FBZSxrQkFBZixFQUFtQ0csSUFBbkMsQ0FBd0MsYUFBeEMsQ0FBWjtBQUNBLE1BQUl2RixTQUFTLEdBQUdILEtBQUssQ0FBQ0ksSUFBTixDQUFXLE1BQVgsQ0FBaEI7O0FBRUEsTUFBSSxDQUFDSixLQUFLLENBQUN3RixNQUFYLEVBQW1CO0FBQ2ZyRixhQUFTLEdBQUcyRixNQUFNLENBQUM3RixJQUFQLENBQVksU0FBWixDQUFaO0FBQ0FELFNBQUssR0FBR0UsNkNBQUMsbUJBQVc0RixNQUFNLENBQUM3RixJQUFQLENBQVksU0FBWixDQUFYLFNBQUQsQ0FBd0MrRixLQUF4QyxFQUFSO0FBQ0g7O0FBRUQsTUFBTUMsS0FBSyxHQUFHL0YsNkNBQUMsOEJBQXNCNEYsTUFBTSxDQUFDN0YsSUFBUCxDQUFZLGVBQVosS0FBZ0MsU0FBdEQsU0FBZjtBQUNBLE1BQU1pRyxNQUFNLEdBQUdELEtBQUssQ0FBQ1AsSUFBTixDQUFXLGVBQVgsQ0FBZjtBQUNBLE1BQU1TLE9BQU8sR0FBR0YsS0FBSyxDQUFDUCxJQUFOLENBQVcsa0JBQVgsQ0FBaEI7QUFFQVEsUUFBTSxDQUFDRSxHQUFQLENBQVcsU0FBWCxFQUFzQixPQUF0QjtBQUNBRCxTQUFPLENBQUNFLElBQVIsQ0FBYSxFQUFiO0FBQ0FuRyxvREFBQSxDQUFPO0FBQ0h5QixPQUFHLFlBQUtDLDJEQUFMLENBREE7QUFFSEMsVUFBTSxFQUFFLE1BRkw7QUFHSDVCLFFBQUksRUFBRTZCLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjLEVBQWQsRUFBa0JDLGdCQUFnQixDQUFDOEQsTUFBRCxDQUFsQyxFQUE0QztBQUM5QzdELFdBQUssRUFBRUMsa0JBQWtCLENBQUNsQyxLQUFLLENBQUNlLEdBQU4sRUFBRCxDQURxQjtBQUU5Q2YsV0FBSyxFQUFFQSxLQUFLLENBQUNDLElBQU4sQ0FBVyxXQUFYLENBRnVDO0FBRzlDbUMsWUFBTSxFQUFFLGlCQUhzQztBQUk5QyxxQkFBZVIsMkRBSitCO0FBSzlDMEUsYUFBTyxFQUFFO0FBTHFDLEtBQTVDLENBSEg7QUFVSGhFLFdBVkcsbUJBVUtDLFFBVkwsRUFVZTtBQUNkMkQsWUFBTSxDQUFDRSxHQUFQLENBQVcsU0FBWCxFQUFzQixNQUF0Qjs7QUFFQSxVQUFJN0QsUUFBUSxDQUFDRSxNQUFULEtBQW9CLE9BQXhCLEVBQWlDO0FBQzdCMEQsZUFBTyxDQUFDRSxJQUFSLENBQWE5RCxRQUFRLENBQUNLLE9BQXRCO0FBQ0EsZUFBTyxJQUFQO0FBQ0g7O0FBRUQsVUFBSSxDQUFDL0MsU0FBUyxXQUFJTSxTQUFKLGNBQWlCOEYsS0FBSyxDQUFDaEcsSUFBTixDQUFXLFdBQVgsQ0FBakIsRUFBZCxFQUEyRDtBQUN2REosaUJBQVMsV0FBSU0sU0FBSixjQUFpQjhGLEtBQUssQ0FBQ2hHLElBQU4sQ0FBVyxXQUFYLENBQWpCLEVBQVQsR0FBdUQsSUFBSUgsT0FBSixDQUFZcUcsT0FBWixFQUFxQm5HLEtBQXJCLEVBQTRCdUMsUUFBUSxDQUFDdEMsSUFBckMsQ0FBdkQ7QUFDSCxPQUZELE1BRU87QUFDSEosaUJBQVMsV0FBSU0sU0FBSixjQUFpQjhGLEtBQUssQ0FBQ2hHLElBQU4sQ0FBVyxXQUFYLENBQWpCLEVBQVQsQ0FBcURPLE1BQXJELENBQTREK0YsTUFBNUQsQ0FBbUVoRSxRQUFRLENBQUN0QyxJQUE1RTtBQUNIOztBQUVEZ0csV0FBSyxDQUFDaEcsSUFBTixDQUFXLFNBQVgsRUFBc0JKLFNBQVMsV0FBSU0sU0FBSixjQUFpQjhGLEtBQUssQ0FBQ2hHLElBQU4sQ0FBVyxXQUFYLENBQWpCLEVBQS9CO0FBQ0FnRyxXQUFLLENBQUNoRyxJQUFOLENBQVcsdUJBQVgsRUFBb0NELEtBQXBDO0FBQ0g7QUExQkUsR0FBUDtBQTRCSCxDQS9DRCxFLENBaURBOztBQUNBRSw2Q0FBQyxDQUFDK0MsUUFBRCxDQUFELENBQVk3QixFQUFaLENBQWUsT0FBZixFQUF3QiwyREFBeEIsRUFBcUYsVUFBQ3VFLEtBQUQsRUFBVztBQUM1RixNQUFNTSxLQUFLLEdBQUcvRiw2Q0FBQyxDQUFDeUYsS0FBSyxDQUFDSSxhQUFQLENBQUQsQ0FBdUJSLE9BQXZCLENBQStCLG1CQUEvQixDQUFkO0FBQ0EsTUFBTWlCLE9BQU8sR0FBR1AsS0FBSyxDQUFDaEcsSUFBTixDQUFXLFNBQVgsQ0FBaEI7QUFDQSxNQUFNd0csYUFBYSxHQUFHUixLQUFLLENBQUNoRyxJQUFOLENBQVcsc0JBQVgsQ0FBdEI7QUFDQSxNQUFNTyxNQUFNLEdBQUdnRyxPQUFPLENBQUNoRyxNQUF2QjtBQUNBLE1BQU1SLEtBQUssR0FBR3dHLE9BQU8sQ0FBQ3hHLEtBQXRCO0FBQ0EsTUFBTUssV0FBVyxHQUFHbUcsT0FBTyxDQUFDbkcsV0FBNUI7QUFDQSxNQUFNQyxVQUFVLEdBQUdrRyxPQUFPLENBQUNsRyxVQUEzQjtBQUNBLE1BQU1vRyxTQUFTLEdBQUdsRyxNQUFNLENBQUNtRyxjQUFQLEdBQXdCMUYsSUFBeEIsQ0FBNkIsQ0FBN0IsQ0FBbEI7QUFDQSxNQUFNa0IsS0FBSyxHQUFHdUUsU0FBUyxDQUFDRSxLQUFWLENBQWdCcEcsTUFBTSxDQUFDVSxNQUFQLENBQWMyRixRQUE5QixDQUFkO0FBQ0EsTUFBTUMsSUFBSSxHQUFHSixTQUFTLENBQUNFLEtBQVYsQ0FBZ0JwRyxNQUFNLENBQUNVLE1BQVAsQ0FBY0wsUUFBOUIsQ0FBYjtBQUVBa0csU0FBTyxDQUFDQyxHQUFSLENBQVksNkJBQVosRUFBMkNQLGFBQTNDOztBQUNBLE1BQUlBLGFBQWEsQ0FBQ2xCLE9BQWQsQ0FBc0IsVUFBdEIsRUFBa0NDLE1BQXRDLEVBQThDO0FBQzFDLFFBQU15QixLQUFLLEdBQUdqSCxLQUFLLENBQUNpSCxLQUFOLENBQVlSLGFBQVosSUFBNkIsQ0FBM0M7QUFDQUEsaUJBQWEsQ0FBQzFGLEdBQWQsQ0FBa0JvQixLQUFsQjtBQUNBakMsaURBQUMsQ0FBQ0csV0FBVyxDQUFDNEcsS0FBRCxDQUFaLENBQUQsQ0FBc0JuRCxJQUF0QixDQUEyQjNCLEtBQTNCO0FBQ0FqQyxpREFBQyxDQUFDSSxVQUFVLENBQUMyRyxLQUFELENBQVgsQ0FBRCxDQUFxQm5ELElBQXJCLENBQTBCZ0QsSUFBMUI7QUFDSCxHQUxELE1BS087QUFDSDlHLFNBQUssQ0FBQ2UsR0FBTixDQUFVb0IsS0FBVjtBQUNBOUIsZUFBVyxDQUFDeUQsSUFBWixDQUFpQjNCLEtBQWpCO0FBQ0E3QixjQUFVLENBQUN3RCxJQUFYLENBQWdCZ0QsSUFBaEI7QUFDQXRHLFVBQU0sQ0FBQ1UsTUFBUCxDQUFjSixXQUFkLEdBQTRCcUIsS0FBNUI7QUFFSDs7QUFDRCxNQUFNK0UsT0FBTyxHQUFHaEgsOERBQUEsQ0FBaUJBLDZDQUFDLDhCQUFzQitGLEtBQUssQ0FBQ2hHLElBQU4sQ0FBVyxXQUFYLENBQXRCLFNBQUQsQ0FBb0RBLElBQXBELENBQXlELFNBQXpELENBQWpCLENBQWhCO0FBQ0FpSCxTQUFPLENBQUNDLEtBQVI7QUFDSCxDQTNCRCIsImZpbGUiOiIuL2FwcC9mb3Jtcy9maWVsZHMvcGFyZW50cy5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgRmluZGVyIGZyb20gJy4uLy4uL3V0aWxzL2ZpbmRlcmpzJztcbmltcG9ydCB7IGNvbmZpZyBhcyBncmF2Q29uZmlnIH0gZnJvbSAnZ3Jhdi1jb25maWcnO1xuXG5sZXQgWEhSVVVJRCA9IDA7XG5leHBvcnQgY29uc3QgSW5zdGFuY2VzID0ge307XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBhcmVudHMge1xuICAgIGNvbnN0cnVjdG9yKGNvbnRhaW5lciwgZmllbGQsIGRhdGEpIHtcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSAkKGNvbnRhaW5lcik7XG4gICAgICAgIHRoaXMuZmllbGROYW1lID0gZmllbGQuYXR0cignbmFtZScpO1xuICAgICAgICB0aGlzLmZpZWxkID0gJChgW25hbWU9XCIke3RoaXMuZmllbGROYW1lfVwiXWApO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgICAgICB0aGlzLnBhcmVudExhYmVsID0gJChgW2RhdGEtcGFyZW50cy1maWVsZC1sYWJlbD1cIiR7dGhpcy5maWVsZE5hbWV9XCJdYCk7XG4gICAgICAgIHRoaXMucGFyZW50TmFtZSA9ICQoYFtkYXRhLXBhcmVudHMtZmllbGQtbmFtZT1cIiR7dGhpcy5maWVsZE5hbWV9XCJdYCk7XG5cbiAgICAgICAgY29uc3QgZGF0YUxvYWQgPSB0aGlzLmRhdGFMb2FkO1xuXG4gICAgICAgIHRoaXMuZmluZGVyID0gbmV3IEZpbmRlcihcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLFxuICAgICAgICAgICAgKHBhcmVudCwgY2FsbGJhY2spID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YUxvYWQuY2FsbCh0aGlzLCBwYXJlbnQsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGFiZWxLZXk6ICduYW1lJyxcbiAgICAgICAgICAgICAgICBkZWZhdWx0UGF0aDogdGhpcy5maWVsZC52YWwoKSxcbiAgICAgICAgICAgICAgICBjcmVhdGVJdGVtQ29udGVudDogZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGFyZW50cy5jcmVhdGVJdGVtQ29udGVudCh0aGlzLmNvbmZpZywgaXRlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAgIC8qXG4gICAgICAgIHRoaXMuZmluZGVyLiRlbWl0dGVyLm9uKCdsZWFmLXNlbGVjdGVkJywgKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdzZWxlY3RlZCcsIGl0ZW0pO1xuICAgICAgICAgICAgdGhpcy5maW5kZXIuZW1pdCgnY3JlYXRlLWNvbHVtbicsICgpID0+IHRoaXMuY3JlYXRlU2ltcGxlQ29sdW1uKGl0ZW0pKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5maW5kZXIuJGVtaXR0ZXIub24oJ2l0ZW0tc2VsZWN0ZWQnLCAoc2VsZWN0ZWQpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdzZWxlY3RlZCcsIHNlbGVjdGVkKTtcbiAgICAgICAgICAgIC8vIGZvciBmdXR1cmUgdXNlIG9ubHkgLSBjcmVhdGUgY29sdW1uLWNhcmQgY3JlYXRpb24gZm9yIGZpbGUgd2l0aCBkZXRhaWxzIGxpa2UgaW4gbWFjT1MgZmluZGVyXG4gICAgICAgICAgICAvLyB0aGlzLmZpbmRlci4kZW1pdHRlcignY3JlYXRlLWNvbHVtbicsICgpID0+IHRoaXMuY3JlYXRlU2ltcGxlQ29sdW1uKHNlbGVjdGVkKSk7XG4gICAgICAgIH0pOyAqL1xuXG4gICAgICAgIHRoaXMuZmluZGVyLiRlbWl0dGVyLm9uKCdjb2x1bW4tY3JlYXRlZCcsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyWzBdLnNjcm9sbExlZnQgPSB0aGlzLmNvbnRhaW5lclswXS5zY3JvbGxXaWR0aCAtIHRoaXMuY29udGFpbmVyWzBdLmNsaWVudFdpZHRoO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY3JlYXRlSXRlbUNvbnRlbnQoY29uZmlnLCBpdGVtKSB7XG4gICAgICAgIGNvbnN0IGZyYWcgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG5cbiAgICAgICAgY29uc3QgbGFiZWwgPSAkKGA8c3BhbiB0aXRsZT1cIiR7aXRlbVtjb25maWcubGFiZWxLZXldfVwiIC8+YCk7XG4gICAgICAgIGNvbnN0IGluZm9Db250YWluZXIgPSAkKCc8c3BhbiBjbGFzcz1cImluZm8tY29udGFpbmVyXCIgLz4nKTtcbiAgICAgICAgY29uc3QgaWNvblByZXBlbmQgPSAkKCc8aSAvPicpO1xuICAgICAgICBjb25zdCBpY29uQXBwZW5kID0gJCgnPGkgLz4nKTtcbiAgICAgICAgY29uc3QgYmFkZ2UgPSAkKCc8c3BhbiBjbGFzcz1cImJhZGdlXCIgLz4nKTtcbiAgICAgICAgY29uc3QgcHJlcGVuZENsYXNzZXMgPSBbJ2ZhJ107XG4gICAgICAgIGNvbnN0IGFwcGVuZENsYXNzZXMgPSBbJ2ZhJ107XG5cbiAgICAgICAgLy8gcHJlcGVuZCBpY29uXG4gICAgICAgIGlmIChpdGVtLmNoaWxkcmVuIHx8IGl0ZW0udHlwZSA9PT0gJ2RpcicpIHtcbiAgICAgICAgICAgIHByZXBlbmRDbGFzc2VzLnB1c2goJ2ZhLWZvbGRlcicpO1xuICAgICAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PT0gJ3Jvb3QnKSB7XG4gICAgICAgICAgICBwcmVwZW5kQ2xhc3Nlcy5wdXNoKCdmYS1zaXRlbWFwJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXRlbS50eXBlID09PSAnZmlsZScpIHtcbiAgICAgICAgICAgIHByZXBlbmRDbGFzc2VzLnB1c2goJ2ZhLWZpbGUtbycpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWNvblByZXBlbmQuYWRkQ2xhc3MocHJlcGVuZENsYXNzZXMuam9pbignICcpKTtcblxuICAgICAgICAvLyB0ZXh0IGxhYmVsXG4gICAgICAgIGxhYmVsLnRleHQoaXRlbVtjb25maWcubGFiZWxLZXldKS5wcmVwZW5kKGljb25QcmVwZW5kKTtcbiAgICAgICAgbGFiZWwuYXBwZW5kVG8oZnJhZyk7XG5cbiAgICAgICAgLy8gYXBwZW5kIGljb25cbiAgICAgICAgaWYgKGl0ZW0uY2hpbGRyZW4gfHwgaXRlbVsnaGFzLWNoaWxkcmVuJ10pIHtcbiAgICAgICAgICAgIGFwcGVuZENsYXNzZXMucHVzaCgnZmEtY2FyZXQtcmlnaHQnKTtcbiAgICAgICAgICAgIGJhZGdlLnRleHQoaXRlbS5zaXplIHx8IGl0ZW0uY291bnQgfHwgMCk7XG4gICAgICAgICAgICBiYWRnZS5hcHBlbmRUbyhpbmZvQ29udGFpbmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGljb25BcHBlbmQuYWRkQ2xhc3MoYXBwZW5kQ2xhc3Nlcy5qb2luKCcgJykpO1xuICAgICAgICBpY29uQXBwZW5kLmFwcGVuZFRvKGluZm9Db250YWluZXIpO1xuICAgICAgICBpbmZvQ29udGFpbmVyLmFwcGVuZFRvKGZyYWcpO1xuXG4gICAgICAgIHJldHVybiBmcmFnO1xuICAgIH1cblxuICAgIHN0YXRpYyBjcmVhdGVMb2FkaW5nQ29sdW1uKCkge1xuICAgICAgICByZXR1cm4gJChgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmpzLWNvbCBsZWFmLWNvbFwiIHN0eWxlPVwib3ZlcmZsb3c6IGhpZGRlbjtcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVhZi1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyYXYtbG9hZGluZ1wiPjxkaXYgY2xhc3M9XCJncmF2LWxvYWRlclwiPkxvYWRpbmcuLi48L2Rpdj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICBgKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY3JlYXRlRXJyb3JDb2x1bW4oZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuICQoYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZqcy1jb2wgbGVhZi1jb2xcIiBzdHlsZT1cIm92ZXJmbG93OiBoaWRkZW47XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlYWYtcm93IGVycm9yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZncgZmEtd2FybmluZ1wiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+JHtlcnJvcn08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgYCk7XG4gICAgfVxuXG4gICAgY3JlYXRlU2ltcGxlQ29sdW1uKGl0ZW0pIHt9XG5cbiAgICBkYXRhTG9hZChwYXJlbnQsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICghcGFyZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sodGhpcy5kYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJlbnQudHlwZSAhPT0gJ2RpcicgfHwgIXBhcmVudFsnaGFzLWNoaWxkcmVuJ10pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IFVVSUQgPSArK1hIUlVVSUQ7XG4gICAgICAgIHRoaXMuc3RhcnRMb2FkZXIoKTtcblxuICAgICAgICAkLmFqYXgoe1xuICAgICAgICAgICAgdXJsOiBgJHtncmF2Q29uZmlnLmN1cnJlbnRfdXJsfWAsXG4gICAgICAgICAgICBtZXRob2Q6ICdwb3N0JyxcbiAgICAgICAgICAgIGRhdGE6IE9iamVjdC5hc3NpZ24oe30sIGdldEV4dHJhRm9ybURhdGEodGhpcy5jb250YWluZXIpLCB7XG4gICAgICAgICAgICAgICAgcm91dGU6IGI2NF9lbmNvZGVfdW5pY29kZShwYXJlbnQudmFsdWUpLFxuICAgICAgICAgICAgICAgIGZpZWxkOiB0aGlzLmZpZWxkLmRhdGEoJ2ZpZWxkTmFtZScpLFxuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2dldExldmVsTGlzdGluZycsXG4gICAgICAgICAgICAgICAgJ2FkbWluLW5vbmNlJzogZ3JhdkNvbmZpZy5hZG1pbl9ub25jZVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBzdWNjZXNzOiAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3BMb2FkZXIoKTtcblxuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09ICdlcnJvcicpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kZXIuJGVtaXR0ZXIuZW1pdCgnY3JlYXRlLWNvbHVtbicsIFBhcmVudHMuY3JlYXRlRXJyb3JDb2x1bW4ocmVzcG9uc2UubWVzc2FnZSlbMF0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHN0YWxlIHJlcXVlc3RcbiAgICAgICAgICAgICAgICBpZiAoVVVJRCAhPT0gWEhSVVVJRCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKHJlc3BvbnNlLmRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzdGFydExvYWRlcigpIHtcbiAgICAgICAgdGhpcy5sb2FkaW5nSW5kaWNhdG9yID0gUGFyZW50cy5jcmVhdGVMb2FkaW5nQ29sdW1uKCk7XG4gICAgICAgIHRoaXMuZmluZGVyLiRlbWl0dGVyLmVtaXQoJ2NyZWF0ZS1jb2x1bW4nLCB0aGlzLmxvYWRpbmdJbmRpY2F0b3JbMF0pO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRpbmdJbmRpY2F0b3I7XG4gICAgfVxuXG4gICAgc3RvcExvYWRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGluZ0luZGljYXRvciAmJiB0aGlzLmxvYWRpbmdJbmRpY2F0b3IucmVtb3ZlKCk7XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgYjY0X2VuY29kZV91bmljb2RlID0gKHN0cikgPT4ge1xuICAgIHJldHVybiBidG9hKGVuY29kZVVSSUNvbXBvbmVudChzdHIpLnJlcGxhY2UoLyUoWzAtOUEtRl17Mn0pL2csXG4gICAgICAgIGZ1bmN0aW9uIHRvU29saWRCeXRlcyhtYXRjaCwgcDEpIHtcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKCcweCcgKyBwMSk7XG4gICAgICAgIH0pKTtcbn07XG5cbmV4cG9ydCBjb25zdCBiNjRfZGVjb2RlX3VuaWNvZGUgPSAoc3RyKSA9PiB7XG4gICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChhdG9iKHN0cikuc3BsaXQoJycpLm1hcChmdW5jdGlvbihjKSB7XG4gICAgICAgIHJldHVybiAnJScgKyAoJzAwJyArIGMuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikpLnNsaWNlKC0yKTtcbiAgICB9KS5qb2luKCcnKSk7XG59O1xuXG5jb25zdCBnZXRFeHRyYUZvcm1EYXRhID0gKGNvbnRhaW5lcikgPT4ge1xuICAgIGxldCBmb3JtID0gY29udGFpbmVyLmNsb3Nlc3QoJ2Zvcm0nKTtcbiAgICBpZiAoY29udGFpbmVyLmNsb3Nlc3QoJ1tkYXRhLXJlbW9kYWwtaWRdJykubGVuZ3RoKSB7XG4gICAgICAgIGZvcm0gPSAkKCdmb3JtI2JsdWVwcmludHMnKTtcbiAgICB9XG4gICAgY29uc3QgZGF0YSA9IHt9O1xuICAgIGNvbnN0IHVuaXF1ZV9pZCA9IGZvcm0uZmluZCgnW25hbWU9XCJfX3VuaXF1ZV9mb3JtX2lkX19cIl0nKTtcblxuICAgIGRhdGFbJ19fZm9ybS1uYW1lX18nXSA9IGZvcm0uZmluZCgnW25hbWU9XCJfX2Zvcm0tbmFtZV9fXCJdJykudmFsKCk7XG4gICAgZGF0YVsnZm9ybS1ub25jZSddID0gZm9ybS5maW5kKCdbbmFtZT1cImZvcm0tbm9uY2VcIl0nKS52YWwoKTtcblxuICAgIGlmICh1bmlxdWVfaWQubGVuZ3RoKSB7XG4gICAgICAgIGRhdGFbJ19fdW5pcXVlX2Zvcm1faWRfXyddID0gdW5pcXVlX2lkLnZhbCgpO1xuICAgIH1cblxuICAgIHJldHVybiBkYXRhO1xufTtcblxuJChkb2N1bWVudCkub24oJ2NsaWNrJywgJ1tkYXRhLXBhcmVudHNdJywgKGV2ZW50KSA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIGNvbnN0IHRhcmdldCA9ICQoZXZlbnQuY3VycmVudFRhcmdldCk7XG4gICAgbGV0IGZpZWxkID0gdGFyZ2V0LmNsb3Nlc3QoJy5wYXJlbnRzLXdyYXBwZXInKS5maW5kKCdpbnB1dFtuYW1lXScpO1xuICAgIGxldCBmaWVsZE5hbWUgPSBmaWVsZC5hdHRyKCduYW1lJyk7XG5cbiAgICBpZiAoIWZpZWxkLmxlbmd0aCkge1xuICAgICAgICBmaWVsZE5hbWUgPSB0YXJnZXQuZGF0YSgncGFyZW50cycpO1xuICAgICAgICBmaWVsZCA9ICQoYFtuYW1lPVwiJHt0YXJnZXQuZGF0YSgncGFyZW50cycpfVwiXWApLmZpcnN0KCk7XG4gICAgfVxuXG4gICAgY29uc3QgbW9kYWwgPSAkKGBbZGF0YS1yZW1vZGFsLWlkPVwiJHt0YXJnZXQuZGF0YSgncmVtb2RhbFRhcmdldCcpIHx8ICdwYXJlbnRzJ31cIl1gKTtcbiAgICBjb25zdCBsb2FkZXIgPSBtb2RhbC5maW5kKCcuZ3Jhdi1sb2FkaW5nJyk7XG4gICAgY29uc3QgY29udGVudCA9IG1vZGFsLmZpbmQoJy5wYXJlbnRzLWNvbnRlbnQnKTtcblxuICAgIGxvYWRlci5jc3MoJ2Rpc3BsYXknLCAnYmxvY2snKTtcbiAgICBjb250ZW50Lmh0bWwoJycpO1xuICAgICQuYWpheCh7XG4gICAgICAgIHVybDogYCR7Z3JhdkNvbmZpZy5jdXJyZW50X3VybH1gLFxuICAgICAgICBtZXRob2Q6ICdwb3N0JyxcbiAgICAgICAgZGF0YTogT2JqZWN0LmFzc2lnbih7fSwgZ2V0RXh0cmFGb3JtRGF0YSh0YXJnZXQpLCB7XG4gICAgICAgICAgICByb3V0ZTogYjY0X2VuY29kZV91bmljb2RlKGZpZWxkLnZhbCgpKSxcbiAgICAgICAgICAgIGZpZWxkOiBmaWVsZC5kYXRhKCdmaWVsZE5hbWUnKSxcbiAgICAgICAgICAgIGFjdGlvbjogJ2dldExldmVsTGlzdGluZycsXG4gICAgICAgICAgICAnYWRtaW4tbm9uY2UnOiBncmF2Q29uZmlnLmFkbWluX25vbmNlLFxuICAgICAgICAgICAgaW5pdGlhbDogdHJ1ZVxuICAgICAgICB9KSxcbiAgICAgICAgc3VjY2VzcyhyZXNwb25zZSkge1xuICAgICAgICAgICAgbG9hZGVyLmNzcygnZGlzcGxheScsICdub25lJyk7XG5cbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09ICdlcnJvcicpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50Lmh0bWwocmVzcG9uc2UubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghSW5zdGFuY2VzW2Ake2ZpZWxkTmFtZX0tJHttb2RhbC5kYXRhKCdyZW1vZGFsSWQnKX1gXSkge1xuICAgICAgICAgICAgICAgIEluc3RhbmNlc1tgJHtmaWVsZE5hbWV9LSR7bW9kYWwuZGF0YSgncmVtb2RhbElkJyl9YF0gPSBuZXcgUGFyZW50cyhjb250ZW50LCBmaWVsZCwgcmVzcG9uc2UuZGF0YSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIEluc3RhbmNlc1tgJHtmaWVsZE5hbWV9LSR7bW9kYWwuZGF0YSgncmVtb2RhbElkJyl9YF0uZmluZGVyLnJlbG9hZChyZXNwb25zZS5kYXRhKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbW9kYWwuZGF0YSgncGFyZW50cycsIEluc3RhbmNlc1tgJHtmaWVsZE5hbWV9LSR7bW9kYWwuZGF0YSgncmVtb2RhbElkJyl9YF0pO1xuICAgICAgICAgICAgbW9kYWwuZGF0YSgncGFyZW50cy1zZWxlY3RlZEZpZWxkJywgZmllbGQpO1xuICAgICAgICB9XG4gICAgfSk7XG59KTtcblxuLy8gYXBwbHkgZmluZGVyIHNlbGVjdGlvbiB0byBmaWVsZFxuJChkb2N1bWVudCkub24oJ2NsaWNrJywgJ1tkYXRhLXJlbW9kYWwtaWRdLnBhcmVudHMtY29udGFpbmVyIFtkYXRhLXBhcmVudHMtc2VsZWN0XScsIChldmVudCkgPT4ge1xuICAgIGNvbnN0IG1vZGFsID0gJChldmVudC5jdXJyZW50VGFyZ2V0KS5jbG9zZXN0KCdbZGF0YS1yZW1vZGFsLWlkXScpO1xuICAgIGNvbnN0IHBhcmVudHMgPSBtb2RhbC5kYXRhKCdwYXJlbnRzJyk7XG4gICAgY29uc3Qgc2VsZWN0ZWRGaWVsZCA9IG1vZGFsLmRhdGEoJ3BhcmVudHNTZWxlY3RlZEZpZWxkJyk7XG4gICAgY29uc3QgZmluZGVyID0gcGFyZW50cy5maW5kZXI7XG4gICAgY29uc3QgZmllbGQgPSBwYXJlbnRzLmZpZWxkO1xuICAgIGNvbnN0IHBhcmVudExhYmVsID0gcGFyZW50cy5wYXJlbnRMYWJlbDtcbiAgICBjb25zdCBwYXJlbnROYW1lID0gcGFyZW50cy5wYXJlbnROYW1lO1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IGZpbmRlci5maW5kTGFzdEFjdGl2ZSgpLml0ZW1bMF07XG4gICAgY29uc3QgdmFsdWUgPSBzZWxlY3Rpb24uX2l0ZW1bZmluZGVyLmNvbmZpZy52YWx1ZUtleV07XG4gICAgY29uc3QgbmFtZSA9IHNlbGVjdGlvbi5faXRlbVtmaW5kZXIuY29uZmlnLmxhYmVsS2V5XTtcblxuICAgIGNvbnNvbGUubG9nKCdjbGljayBbZGF0YS1wYXJlbnRzLXNlbGVjdF0nLCBzZWxlY3RlZEZpZWxkKTtcbiAgICBpZiAoc2VsZWN0ZWRGaWVsZC5jbG9zZXN0KCcucmVtb2RhbCcpLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBpbmRleCA9IGZpZWxkLmluZGV4KHNlbGVjdGVkRmllbGQpIC0gMTtcbiAgICAgICAgc2VsZWN0ZWRGaWVsZC52YWwodmFsdWUpO1xuICAgICAgICAkKHBhcmVudExhYmVsW2luZGV4XSkudGV4dCh2YWx1ZSk7XG4gICAgICAgICQocGFyZW50TmFtZVtpbmRleF0pLnRleHQobmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZmllbGQudmFsKHZhbHVlKTtcbiAgICAgICAgcGFyZW50TGFiZWwudGV4dCh2YWx1ZSk7XG4gICAgICAgIHBhcmVudE5hbWUudGV4dChuYW1lKTtcbiAgICAgICAgZmluZGVyLmNvbmZpZy5kZWZhdWx0UGF0aCA9IHZhbHVlO1xuXG4gICAgfVxuICAgIGNvbnN0IHJlbW9kYWwgPSAkLnJlbW9kYWwubG9va3VwWyQoYFtkYXRhLXJlbW9kYWwtaWQ9XCIke21vZGFsLmRhdGEoJ3JlbW9kYWxJZCcpfVwiXWApLmRhdGEoJ3JlbW9kYWwnKV07XG4gICAgcmVtb2RhbC5jbG9zZSgpO1xufSk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./app/forms/fields/parents.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Instances\": () => (/* binding */ Instances),\n/* harmony export */ \"default\": () => (/* binding */ Parents),\n/* harmony export */ \"b64_encode_unicode\": () => (/* binding */ b64_encode_unicode),\n/* harmony export */ \"b64_decode_unicode\": () => (/* binding */ b64_decode_unicode)\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils_finderjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils/finderjs */ \"./app/utils/finderjs.js\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! grav-config */ \"grav-config\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(grav_config__WEBPACK_IMPORTED_MODULE_2__);\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\nvar XHRUUID = 0;\nvar Instances = {};\n\nvar Parents = /*#__PURE__*/function () {\n function Parents(container, field, data) {\n var _this = this;\n\n _classCallCheck(this, Parents);\n\n this.container = jquery__WEBPACK_IMPORTED_MODULE_0___default()(container);\n this.fieldName = field.attr('name');\n this.field = jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"[name=\\\"\".concat(this.fieldName, \"\\\"]\"));\n this.data = data;\n this.parentLabel = jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"[data-parents-field-label=\\\"\".concat(this.fieldName, \"\\\"]\"));\n this.parentName = jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"[data-parents-field-name=\\\"\".concat(this.fieldName, \"\\\"]\"));\n var dataLoad = this.dataLoad;\n this.finder = new _utils_finderjs__WEBPACK_IMPORTED_MODULE_1__.default(this.container, function (parent, callback) {\n return dataLoad.call(_this, parent, callback);\n }, {\n labelKey: 'name',\n defaultPath: this.field.val(),\n createItemContent: function createItemContent(item) {\n return Parents.createItemContent(this.config, item);\n }\n });\n /*\n this.finder.$emitter.on('leaf-selected', (item) => {\n console.log('selected', item);\n this.finder.emit('create-column', () => this.createSimpleColumn(item));\n });\n this.finder.$emitter.on('item-selected', (selected) => {\n console.log('selected', selected);\n // for future use only - create column-card creation for file with details like in macOS finder\n // this.finder.$emitter('create-column', () => this.createSimpleColumn(selected));\n }); */\n\n this.finder.$emitter.on('column-created', function () {\n _this.container[0].scrollLeft = _this.container[0].scrollWidth - _this.container[0].clientWidth;\n });\n }\n\n _createClass(Parents, [{\n key: \"createSimpleColumn\",\n value: function createSimpleColumn(item) {}\n }, {\n key: \"dataLoad\",\n value: function dataLoad(parent, callback) {\n var _this2 = this;\n\n if (!parent) {\n return callback(this.data);\n }\n\n if (parent.type !== 'dir' || !parent['has-children']) {\n return false;\n }\n\n var UUID = ++XHRUUID;\n this.startLoader();\n jquery__WEBPACK_IMPORTED_MODULE_0___default().ajax({\n url: \"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_2__.config.current_url),\n method: 'post',\n data: Object.assign({}, getExtraFormData(this.container), {\n route: b64_encode_unicode(parent.value),\n field: this.field.data('fieldName'),\n action: 'getLevelListing',\n 'admin-nonce': grav_config__WEBPACK_IMPORTED_MODULE_2__.config.admin_nonce\n }),\n success: function success(response) {\n _this2.stopLoader();\n\n if (response.status === 'error') {\n _this2.finder.$emitter.emit('create-column', Parents.createErrorColumn(response.message)[0]);\n\n return false;\n } // stale request\n\n\n if (UUID !== XHRUUID) {\n return false;\n }\n\n return callback(response.data);\n }\n });\n }\n }, {\n key: \"startLoader\",\n value: function startLoader() {\n this.loadingIndicator = Parents.createLoadingColumn();\n this.finder.$emitter.emit('create-column', this.loadingIndicator[0]);\n return this.loadingIndicator;\n }\n }, {\n key: \"stopLoader\",\n value: function stopLoader() {\n return this.loadingIndicator && this.loadingIndicator.remove();\n }\n }], [{\n key: \"createItemContent\",\n value: function createItemContent(config, item) {\n var frag = document.createDocumentFragment();\n var label = jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"\"));\n var infoContainer = jquery__WEBPACK_IMPORTED_MODULE_0___default()('');\n var iconPrepend = jquery__WEBPACK_IMPORTED_MODULE_0___default()('');\n var iconAppend = jquery__WEBPACK_IMPORTED_MODULE_0___default()('');\n var badge = jquery__WEBPACK_IMPORTED_MODULE_0___default()('');\n var prependClasses = ['fa'];\n var appendClasses = ['fa']; // prepend icon\n\n if (item.children || item.type === 'dir') {\n prependClasses.push('fa-folder');\n } else if (item.type === 'root') {\n prependClasses.push('fa-sitemap');\n } else if (item.type === 'file') {\n prependClasses.push('fa-file-o');\n }\n\n iconPrepend.addClass(prependClasses.join(' ')); // text label\n\n label.text(item[config.labelKey]).prepend(iconPrepend);\n label.appendTo(frag); // append icon\n\n if (item.children || item['has-children']) {\n appendClasses.push('fa-caret-right');\n badge.text(item.size || item.count || 0);\n badge.appendTo(infoContainer);\n }\n\n iconAppend.addClass(appendClasses.join(' '));\n iconAppend.appendTo(infoContainer);\n infoContainer.appendTo(frag);\n return frag;\n }\n }, {\n key: \"createLoadingColumn\",\n value: function createLoadingColumn() {\n return jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"\\n
          \\n
          \\n
          Loading...
          \\n
          \\n
          \\n \");\n }\n }, {\n key: \"createErrorColumn\",\n value: function createErrorColumn(error) {\n return jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"\\n
          \\n
          \\n \\n \".concat(error, \"\\n
          \\n
          \\n \"));\n }\n }]);\n\n return Parents;\n}();\n\n\nvar b64_encode_unicode = function b64_encode_unicode(str) {\n return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function toSolidBytes(match, p1) {\n return String.fromCharCode('0x' + p1);\n }));\n};\nvar b64_decode_unicode = function b64_decode_unicode(str) {\n return decodeURIComponent(atob(str).split('').map(function (c) {\n return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);\n }).join(''));\n};\n\nvar getExtraFormData = function getExtraFormData(container) {\n var form = container.closest('form');\n\n if (container.closest('[data-remodal-id]').length) {\n form = jquery__WEBPACK_IMPORTED_MODULE_0___default()('form#blueprints');\n }\n\n var data = {};\n var unique_id = form.find('[name=\"__unique_form_id__\"]');\n data['__form-name__'] = form.find('[name=\"__form-name__\"]').val();\n data['form-nonce'] = form.find('[name=\"form-nonce\"]').val();\n\n if (unique_id.length) {\n data['__unique_form_id__'] = unique_id.val();\n }\n\n return data;\n};\n\njquery__WEBPACK_IMPORTED_MODULE_0___default()(document).on('click', '[data-parents]', function (event) {\n event.preventDefault();\n event.stopPropagation();\n var target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.currentTarget);\n var field = target.closest('.parents-wrapper').find('input[name]');\n var fieldName = field.attr('name');\n\n if (!field.length) {\n fieldName = target.data('parents');\n field = jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"[name=\\\"\".concat(target.data('parents'), \"\\\"]\")).first();\n }\n\n var modal = jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"[data-remodal-id=\\\"\".concat(target.data('remodalTarget') || 'parents', \"\\\"]\"));\n var loader = modal.find('.grav-loading');\n var content = modal.find('.parents-content');\n loader.css('display', 'block');\n content.html('');\n jquery__WEBPACK_IMPORTED_MODULE_0___default().ajax({\n url: \"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_2__.config.current_url),\n method: 'post',\n data: Object.assign({}, getExtraFormData(target), {\n route: b64_encode_unicode(field.val()),\n field: field.data('fieldName'),\n action: 'getLevelListing',\n 'admin-nonce': grav_config__WEBPACK_IMPORTED_MODULE_2__.config.admin_nonce,\n initial: true\n }),\n success: function success(response) {\n loader.css('display', 'none');\n\n if (response.status === 'error') {\n content.html(response.message);\n return true;\n }\n\n if (!Instances[\"\".concat(fieldName, \"-\").concat(modal.data('remodalId'))]) {\n Instances[\"\".concat(fieldName, \"-\").concat(modal.data('remodalId'))] = new Parents(content, field, response.data);\n } else {\n Instances[\"\".concat(fieldName, \"-\").concat(modal.data('remodalId'))].finder.reload(response.data);\n }\n\n modal.data('parents', Instances[\"\".concat(fieldName, \"-\").concat(modal.data('remodalId'))]);\n modal.data('parents-selectedField', field);\n }\n });\n}); // apply finder selection to field\n\njquery__WEBPACK_IMPORTED_MODULE_0___default()(document).on('click', '[data-remodal-id].parents-container [data-parents-select]', function (event) {\n var modal = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.currentTarget).closest('[data-remodal-id]');\n var parents = modal.data('parents');\n var selectedField = modal.data('parentsSelectedField');\n var finder = parents.finder;\n var field = parents.field;\n var parentLabel = parents.parentLabel;\n var parentName = parents.parentName;\n var selection = finder.findLastActive().item[0];\n var value = selection._item[finder.config.valueKey];\n var name = selection._item[finder.config.labelKey];\n console.log('click [data-parents-select]', selectedField);\n\n if (selectedField.closest('.remodal').length) {\n var index = field.index(selectedField) - 1;\n selectedField.val(value);\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(parentLabel[index]).text(value);\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(parentName[index]).text(name);\n } else {\n field.val(value);\n parentLabel.text(value);\n parentName.text(name);\n finder.config.defaultPath = value;\n }\n\n var remodal = (jquery__WEBPACK_IMPORTED_MODULE_0___default().remodal.lookup)[jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"[data-remodal-id=\\\"\".concat(modal.data('remodalId'), \"\\\"]\")).data('remodal')];\n remodal.close();\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL2Zvcm1zL2ZpZWxkcy9wYXJlbnRzLmpzPzQ5YzgiXSwibmFtZXMiOlsiWEhSVVVJRCIsIkluc3RhbmNlcyIsIlBhcmVudHMiLCJjb250YWluZXIiLCJmaWVsZCIsImRhdGEiLCIkIiwiZmllbGROYW1lIiwiYXR0ciIsInBhcmVudExhYmVsIiwicGFyZW50TmFtZSIsImRhdGFMb2FkIiwiZmluZGVyIiwiRmluZGVyIiwicGFyZW50IiwiY2FsbGJhY2siLCJjYWxsIiwibGFiZWxLZXkiLCJkZWZhdWx0UGF0aCIsInZhbCIsImNyZWF0ZUl0ZW1Db250ZW50IiwiaXRlbSIsImNvbmZpZyIsIiRlbWl0dGVyIiwib24iLCJzY3JvbGxMZWZ0Iiwic2Nyb2xsV2lkdGgiLCJjbGllbnRXaWR0aCIsInR5cGUiLCJVVUlEIiwic3RhcnRMb2FkZXIiLCJ1cmwiLCJncmF2Q29uZmlnIiwibWV0aG9kIiwiT2JqZWN0IiwiYXNzaWduIiwiZ2V0RXh0cmFGb3JtRGF0YSIsInJvdXRlIiwiYjY0X2VuY29kZV91bmljb2RlIiwidmFsdWUiLCJhY3Rpb24iLCJhZG1pbl9ub25jZSIsInN1Y2Nlc3MiLCJyZXNwb25zZSIsInN0b3BMb2FkZXIiLCJzdGF0dXMiLCJlbWl0IiwiY3JlYXRlRXJyb3JDb2x1bW4iLCJtZXNzYWdlIiwibG9hZGluZ0luZGljYXRvciIsImNyZWF0ZUxvYWRpbmdDb2x1bW4iLCJyZW1vdmUiLCJmcmFnIiwiZG9jdW1lbnQiLCJjcmVhdGVEb2N1bWVudEZyYWdtZW50IiwibGFiZWwiLCJpbmZvQ29udGFpbmVyIiwiaWNvblByZXBlbmQiLCJpY29uQXBwZW5kIiwiYmFkZ2UiLCJwcmVwZW5kQ2xhc3NlcyIsImFwcGVuZENsYXNzZXMiLCJjaGlsZHJlbiIsInB1c2giLCJhZGRDbGFzcyIsImpvaW4iLCJ0ZXh0IiwicHJlcGVuZCIsImFwcGVuZFRvIiwic2l6ZSIsImNvdW50IiwiZXJyb3IiLCJzdHIiLCJidG9hIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwicmVwbGFjZSIsInRvU29saWRCeXRlcyIsIm1hdGNoIiwicDEiLCJTdHJpbmciLCJmcm9tQ2hhckNvZGUiLCJiNjRfZGVjb2RlX3VuaWNvZGUiLCJkZWNvZGVVUklDb21wb25lbnQiLCJhdG9iIiwic3BsaXQiLCJtYXAiLCJjIiwiY2hhckNvZGVBdCIsInRvU3RyaW5nIiwic2xpY2UiLCJmb3JtIiwiY2xvc2VzdCIsImxlbmd0aCIsInVuaXF1ZV9pZCIsImZpbmQiLCJldmVudCIsInByZXZlbnREZWZhdWx0Iiwic3RvcFByb3BhZ2F0aW9uIiwidGFyZ2V0IiwiY3VycmVudFRhcmdldCIsImZpcnN0IiwibW9kYWwiLCJsb2FkZXIiLCJjb250ZW50IiwiY3NzIiwiaHRtbCIsImluaXRpYWwiLCJyZWxvYWQiLCJwYXJlbnRzIiwic2VsZWN0ZWRGaWVsZCIsInNlbGVjdGlvbiIsImZpbmRMYXN0QWN0aXZlIiwiX2l0ZW0iLCJ2YWx1ZUtleSIsIm5hbWUiLCJjb25zb2xlIiwibG9nIiwiaW5kZXgiLCJyZW1vZGFsIiwiY2xvc2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUVBLElBQUlBLE9BQU8sR0FBRyxDQUFkO0FBQ08sSUFBTUMsU0FBUyxHQUFHLEVBQWxCOztJQUVjQyxPO0FBQ2pCLG1CQUFZQyxTQUFaLEVBQXVCQyxLQUF2QixFQUE4QkMsSUFBOUIsRUFBb0M7QUFBQTs7QUFBQTs7QUFDaEMsU0FBS0YsU0FBTCxHQUFpQkcsNkNBQUMsQ0FBQ0gsU0FBRCxDQUFsQjtBQUNBLFNBQUtJLFNBQUwsR0FBaUJILEtBQUssQ0FBQ0ksSUFBTixDQUFXLE1BQVgsQ0FBakI7QUFDQSxTQUFLSixLQUFMLEdBQWFFLDZDQUFDLG1CQUFXLEtBQUtDLFNBQWhCLFNBQWQ7QUFDQSxTQUFLRixJQUFMLEdBQVlBLElBQVo7QUFDQSxTQUFLSSxXQUFMLEdBQW1CSCw2Q0FBQyx1Q0FBK0IsS0FBS0MsU0FBcEMsU0FBcEI7QUFDQSxTQUFLRyxVQUFMLEdB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QUFZLDZCQUFaLEVBQTJDUCxhQUEzQzs7QUFDQSxNQUFJQSxhQUFhLENBQUNsQixPQUFkLENBQXNCLFVBQXRCLEVBQWtDQyxNQUF0QyxFQUE4QztBQUMxQyxRQUFNeUIsS0FBSyxHQUFHakgsS0FBSyxDQUFDaUgsS0FBTixDQUFZUixhQUFaLElBQTZCLENBQTNDO0FBQ0FBLGlCQUFhLENBQUMxRixHQUFkLENBQWtCb0IsS0FBbEI7QUFDQWpDLGlEQUFDLENBQUNHLFdBQVcsQ0FBQzRHLEtBQUQsQ0FBWixDQUFELENBQXNCbkQsSUFBdEIsQ0FBMkIzQixLQUEzQjtBQUNBakMsaURBQUMsQ0FBQ0ksVUFBVSxDQUFDMkcsS0FBRCxDQUFYLENBQUQsQ0FBcUJuRCxJQUFyQixDQUEwQmdELElBQTFCO0FBQ0gsR0FMRCxNQUtPO0FBQ0g5RyxTQUFLLENBQUNlLEdBQU4sQ0FBVW9CLEtBQVY7QUFDQTlCLGVBQVcsQ0FBQ3lELElBQVosQ0FBaUIzQixLQUFqQjtBQUNBN0IsY0FBVSxDQUFDd0QsSUFBWCxDQUFnQmdELElBQWhCO0FBQ0F0RyxVQUFNLENBQUNVLE1BQVAsQ0FBY0osV0FBZCxHQUE0QnFCLEtBQTVCO0FBRUg7O0FBQ0QsTUFBTStFLE9BQU8sR0FBR2hILDhEQUFBLENBQWlCQSw2Q0FBQyw4QkFBc0IrRixLQUFLLENBQUNoRyxJQUFOLENBQVcsV0FBWCxDQUF0QixTQUFELENBQW9EQSxJQUFwRCxDQUF5RCxTQUF6RCxDQUFqQixDQUFoQjtBQUNBaUgsU0FBTyxDQUFDQyxLQUFSO0FBQ0gsQ0EzQkQiLCJmaWxlIjoiLi9hcHAvZm9ybXMvZmllbGRzL3BhcmVudHMuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IEZpbmRlciBmcm9tICcuLi8uLi91dGlscy9maW5kZXJqcyc7XG5pbXBvcnQgeyBjb25maWcgYXMgZ3JhdkNvbmZpZyB9IGZyb20gJ2dyYXYtY29uZmlnJztcblxubGV0IFhIUlVVSUQgPSAwO1xuZXhwb3J0IGNvbnN0IEluc3RhbmNlcyA9IHt9O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQYXJlbnRzIHtcbiAgICBjb25zdHJ1Y3Rvcihjb250YWluZXIsIGZpZWxkLCBkYXRhKSB7XG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gJChjb250YWluZXIpO1xuICAgICAgICB0aGlzLmZpZWxkTmFtZSA9IGZpZWxkLmF0dHIoJ25hbWUnKTtcbiAgICAgICAgdGhpcy5maWVsZCA9ICQoYFtuYW1lPVwiJHt0aGlzLmZpZWxkTmFtZX1cIl1gKTtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICAgICAgdGhpcy5wYXJlbnRMYWJlbCA9ICQoYFtkYXRhLXBhcmVudHMtZmllbGQtbGFiZWw9XCIke3RoaXMuZmllbGROYW1lfVwiXWApO1xuICAgICAgICB0aGlzLnBhcmVudE5hbWUgPSAkKGBbZGF0YS1wYXJlbnRzLWZpZWxkLW5hbWU9XCIke3RoaXMuZmllbGROYW1lfVwiXWApO1xuXG4gICAgICAgIGNvbnN0IGRhdGFMb2FkID0gdGhpcy5kYXRhTG9hZDtcblxuICAgICAgICB0aGlzLmZpbmRlciA9IG5ldyBGaW5kZXIoXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lcixcbiAgICAgICAgICAgIChwYXJlbnQsIGNhbGxiYWNrKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGFMb2FkLmNhbGwodGhpcywgcGFyZW50LCBjYWxsYmFjayk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsS2V5OiAnbmFtZScsXG4gICAgICAgICAgICAgICAgZGVmYXVsdFBhdGg6IHRoaXMuZmllbGQudmFsKCksXG4gICAgICAgICAgICAgICAgY3JlYXRlSXRlbUNvbnRlbnQ6IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBhcmVudHMuY3JlYXRlSXRlbUNvbnRlbnQodGhpcy5jb25maWcsIGl0ZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgICAgICAvKlxuICAgICAgICB0aGlzLmZpbmRlci4kZW1pdHRlci5vbignbGVhZi1zZWxlY3RlZCcsIChpdGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnc2VsZWN0ZWQnLCBpdGVtKTtcbiAgICAgICAgICAgIHRoaXMuZmluZGVyLmVtaXQoJ2NyZWF0ZS1jb2x1bW4nLCAoKSA9PiB0aGlzLmNyZWF0ZVNpbXBsZUNvbHVtbihpdGVtKSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZmluZGVyLiRlbWl0dGVyLm9uKCdpdGVtLXNlbGVjdGVkJywgKHNlbGVjdGVkKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnc2VsZWN0ZWQnLCBzZWxlY3RlZCk7XG4gICAgICAgICAgICAvLyBmb3IgZnV0dXJlIHVzZSBvbmx5IC0gY3JlYXRlIGNvbHVtbi1jYXJkIGNyZWF0aW9uIGZvciBmaWxlIHdpdGggZGV0YWlscyBsaWtlIGluIG1hY09TIGZpbmRlclxuICAgICAgICAgICAgLy8gdGhpcy5maW5kZXIuJGVtaXR0ZXIoJ2NyZWF0ZS1jb2x1bW4nLCAoKSA9PiB0aGlzLmNyZWF0ZVNpbXBsZUNvbHVtbihzZWxlY3RlZCkpO1xuICAgICAgICB9KTsgKi9cblxuICAgICAgICB0aGlzLmZpbmRlci4kZW1pdHRlci5vbignY29sdW1uLWNyZWF0ZWQnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lclswXS5zY3JvbGxMZWZ0ID0gdGhpcy5jb250YWluZXJbMF0uc2Nyb2xsV2lkdGggLSB0aGlzLmNvbnRhaW5lclswXS5jbGllbnRXaWR0aDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGNyZWF0ZUl0ZW1Db250ZW50KGNvbmZpZywgaXRlbSkge1xuICAgICAgICBjb25zdCBmcmFnID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuXG4gICAgICAgIGNvbnN0IGxhYmVsID0gJChgPHNwYW4gdGl0bGU9XCIke2l0ZW1bY29uZmlnLmxhYmVsS2V5XX1cIiAvPmApO1xuICAgICAgICBjb25zdCBpbmZvQ29udGFpbmVyID0gJCgnPHNwYW4gY2xhc3M9XCJpbmZvLWNvbnRhaW5lclwiIC8+Jyk7XG4gICAgICAgIGNvbnN0IGljb25QcmVwZW5kID0gJCgnPGkgLz4nKTtcbiAgICAgICAgY29uc3QgaWNvbkFwcGVuZCA9ICQoJzxpIC8+Jyk7XG4gICAgICAgIGNvbnN0IGJhZGdlID0gJCgnPHNwYW4gY2xhc3M9XCJiYWRnZVwiIC8+Jyk7XG4gICAgICAgIGNvbnN0IHByZXBlbmRDbGFzc2VzID0gWydmYSddO1xuICAgICAgICBjb25zdCBhcHBlbmRDbGFzc2VzID0gWydmYSddO1xuXG4gICAgICAgIC8vIHByZXBlbmQgaWNvblxuICAgICAgICBpZiAoaXRlbS5jaGlsZHJlbiB8fCBpdGVtLnR5cGUgPT09ICdkaXInKSB7XG4gICAgICAgICAgICBwcmVwZW5kQ2xhc3Nlcy5wdXNoKCdmYS1mb2xkZXInKTtcbiAgICAgICAgfSBlbHNlIGlmIChpdGVtLnR5cGUgPT09ICdyb290Jykge1xuICAgICAgICAgICAgcHJlcGVuZENsYXNzZXMucHVzaCgnZmEtc2l0ZW1hcCcpO1xuICAgICAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PT0gJ2ZpbGUnKSB7XG4gICAgICAgICAgICBwcmVwZW5kQ2xhc3Nlcy5wdXNoKCdmYS1maWxlLW8nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGljb25QcmVwZW5kLmFkZENsYXNzKHByZXBlbmRDbGFzc2VzLmpvaW4oJyAnKSk7XG5cbiAgICAgICAgLy8gdGV4dCBsYWJlbFxuICAgICAgICBsYWJlbC50ZXh0KGl0ZW1bY29uZmlnLmxhYmVsS2V5XSkucHJlcGVuZChpY29uUHJlcGVuZCk7XG4gICAgICAgIGxhYmVsLmFwcGVuZFRvKGZyYWcpO1xuXG4gICAgICAgIC8vIGFwcGVuZCBpY29uXG4gICAgICAgIGlmIChpdGVtLmNoaWxkcmVuIHx8IGl0ZW1bJ2hhcy1jaGlsZHJlbiddKSB7XG4gICAgICAgICAgICBhcHBlbmRDbGFzc2VzLnB1c2goJ2ZhLWNhcmV0LXJpZ2h0Jyk7XG4gICAgICAgICAgICBiYWRnZS50ZXh0KGl0ZW0uc2l6ZSB8fCBpdGVtLmNvdW50IHx8IDApO1xuICAgICAgICAgICAgYmFkZ2UuYXBwZW5kVG8oaW5mb0NvbnRhaW5lcik7XG4gICAgICAgIH1cblxuICAgICAgICBpY29uQXBwZW5kLmFkZENsYXNzKGFwcGVuZENsYXNzZXMuam9pbignICcpKTtcbiAgICAgICAgaWNvbkFwcGVuZC5hcHBlbmRUbyhpbmZvQ29udGFpbmVyKTtcbiAgICAgICAgaW5mb0NvbnRhaW5lci5hcHBlbmRUbyhmcmFnKTtcblxuICAgICAgICByZXR1cm4gZnJhZztcbiAgICB9XG5cbiAgICBzdGF0aWMgY3JlYXRlTG9hZGluZ0NvbHVtbigpIHtcbiAgICAgICAgcmV0dXJuICQoYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZqcy1jb2wgbGVhZi1jb2xcIiBzdHlsZT1cIm92ZXJmbG93OiBoaWRkZW47XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlYWYtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmF2LWxvYWRpbmdcIj48ZGl2IGNsYXNzPVwiZ3Jhdi1sb2FkZXJcIj5Mb2FkaW5nLi4uPC9kaXY+PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgYCk7XG4gICAgfVxuXG4gICAgc3RhdGljIGNyZWF0ZUVycm9yQ29sdW1uKGVycm9yKSB7XG4gICAgICAgIHJldHVybiAkKGBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmanMtY29sIGxlYWYtY29sXCIgc3R5bGU9XCJvdmVyZmxvdzogaGlkZGVuO1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWFmLXJvdyBlcnJvclwiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWZ3IGZhLXdhcm5pbmdcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPiR7ZXJyb3J9PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIGApO1xuICAgIH1cblxuICAgIGNyZWF0ZVNpbXBsZUNvbHVtbihpdGVtKSB7fVxuXG4gICAgZGF0YUxvYWQocGFyZW50LCBjYWxsYmFjaykge1xuICAgICAgICBpZiAoIXBhcmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKHRoaXMuZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFyZW50LnR5cGUgIT09ICdkaXInIHx8ICFwYXJlbnRbJ2hhcy1jaGlsZHJlbiddKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBVVUlEID0gKytYSFJVVUlEO1xuICAgICAgICB0aGlzLnN0YXJ0TG9hZGVyKCk7XG5cbiAgICAgICAgJC5hamF4KHtcbiAgICAgICAgICAgIHVybDogYCR7Z3JhdkNvbmZpZy5jdXJyZW50X3VybH1gLFxuICAgICAgICAgICAgbWV0aG9kOiAncG9zdCcsXG4gICAgICAgICAgICBkYXRhOiBPYmplY3QuYXNzaWduKHt9LCBnZXRFeHRyYUZvcm1EYXRhKHRoaXMuY29udGFpbmVyKSwge1xuICAgICAgICAgICAgICAgIHJvdXRlOiBiNjRfZW5jb2RlX3VuaWNvZGUocGFyZW50LnZhbHVlKSxcbiAgICAgICAgICAgICAgICBmaWVsZDogdGhpcy5maWVsZC5kYXRhKCdmaWVsZE5hbWUnKSxcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdnZXRMZXZlbExpc3RpbmcnLFxuICAgICAgICAgICAgICAgICdhZG1pbi1ub25jZSc6IGdyYXZDb25maWcuYWRtaW5fbm9uY2VcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgc3VjY2VzczogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdG9wTG9hZGVyKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZGVyLiRlbWl0dGVyLmVtaXQoJ2NyZWF0ZS1jb2x1bW4nLCBQYXJlbnRzLmNyZWF0ZUVycm9yQ29sdW1uKHJlc3BvbnNlLm1lc3NhZ2UpWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBzdGFsZSByZXF1ZXN0XG4gICAgICAgICAgICAgICAgaWYgKFVVSUQgIT09IFhIUlVVSUQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhyZXNwb25zZS5kYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3RhcnRMb2FkZXIoKSB7XG4gICAgICAgIHRoaXMubG9hZGluZ0luZGljYXRvciA9IFBhcmVudHMuY3JlYXRlTG9hZGluZ0NvbHVtbigpO1xuICAgICAgICB0aGlzLmZpbmRlci4kZW1pdHRlci5lbWl0KCdjcmVhdGUtY29sdW1uJywgdGhpcy5sb2FkaW5nSW5kaWNhdG9yWzBdKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5sb2FkaW5nSW5kaWNhdG9yO1xuICAgIH1cblxuICAgIHN0b3BMb2FkZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRpbmdJbmRpY2F0b3IgJiYgdGhpcy5sb2FkaW5nSW5kaWNhdG9yLnJlbW92ZSgpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IGI2NF9lbmNvZGVfdW5pY29kZSA9IChzdHIpID0+IHtcbiAgICByZXR1cm4gYnRvYShlbmNvZGVVUklDb21wb25lbnQoc3RyKS5yZXBsYWNlKC8lKFswLTlBLUZdezJ9KS9nLFxuICAgICAgICBmdW5jdGlvbiB0b1NvbGlkQnl0ZXMobWF0Y2gsIHAxKSB7XG4gICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSgnMHgnICsgcDEpO1xuICAgICAgICB9KSk7XG59O1xuXG5leHBvcnQgY29uc3QgYjY0X2RlY29kZV91bmljb2RlID0gKHN0cikgPT4ge1xuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoYXRvYihzdHIpLnNwbGl0KCcnKS5tYXAoZnVuY3Rpb24oYykge1xuICAgICAgICByZXR1cm4gJyUnICsgKCcwMCcgKyBjLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpKS5zbGljZSgtMik7XG4gICAgfSkuam9pbignJykpO1xufTtcblxuY29uc3QgZ2V0RXh0cmFGb3JtRGF0YSA9IChjb250YWluZXIpID0+IHtcbiAgICBsZXQgZm9ybSA9IGNvbnRhaW5lci5jbG9zZXN0KCdmb3JtJyk7XG4gICAgaWYgKGNvbnRhaW5lci5jbG9zZXN0KCdbZGF0YS1yZW1vZGFsLWlkXScpLmxlbmd0aCkge1xuICAgICAgICBmb3JtID0gJCgnZm9ybSNibHVlcHJpbnRzJyk7XG4gICAgfVxuICAgIGNvbnN0IGRhdGEgPSB7fTtcbiAgICBjb25zdCB1bmlxdWVfaWQgPSBmb3JtLmZpbmQoJ1tuYW1lPVwiX191bmlxdWVfZm9ybV9pZF9fXCJdJyk7XG5cbiAgICBkYXRhWydfX2Zvcm0tbmFtZV9fJ10gPSBmb3JtLmZpbmQoJ1tuYW1lPVwiX19mb3JtLW5hbWVfX1wiXScpLnZhbCgpO1xuICAgIGRhdGFbJ2Zvcm0tbm9uY2UnXSA9IGZvcm0uZmluZCgnW25hbWU9XCJmb3JtLW5vbmNlXCJdJykudmFsKCk7XG5cbiAgICBpZiAodW5pcXVlX2lkLmxlbmd0aCkge1xuICAgICAgICBkYXRhWydfX3VuaXF1ZV9mb3JtX2lkX18nXSA9IHVuaXF1ZV9pZC52YWwoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YTtcbn07XG5cbiQoZG9jdW1lbnQpLm9uKCdjbGljaycsICdbZGF0YS1wYXJlbnRzXScsIChldmVudCkgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBjb25zdCB0YXJnZXQgPSAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpO1xuICAgIGxldCBmaWVsZCA9IHRhcmdldC5jbG9zZXN0KCcucGFyZW50cy13cmFwcGVyJykuZmluZCgnaW5wdXRbbmFtZV0nKTtcbiAgICBsZXQgZmllbGROYW1lID0gZmllbGQuYXR0cignbmFtZScpO1xuXG4gICAgaWYgKCFmaWVsZC5sZW5ndGgpIHtcbiAgICAgICAgZmllbGROYW1lID0gdGFyZ2V0LmRhdGEoJ3BhcmVudHMnKTtcbiAgICAgICAgZmllbGQgPSAkKGBbbmFtZT1cIiR7dGFyZ2V0LmRhdGEoJ3BhcmVudHMnKX1cIl1gKS5maXJzdCgpO1xuICAgIH1cblxuICAgIGNvbnN0IG1vZGFsID0gJChgW2RhdGEtcmVtb2RhbC1pZD1cIiR7dGFyZ2V0LmRhdGEoJ3JlbW9kYWxUYXJnZXQnKSB8fCAncGFyZW50cyd9XCJdYCk7XG4gICAgY29uc3QgbG9hZGVyID0gbW9kYWwuZmluZCgnLmdyYXYtbG9hZGluZycpO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBtb2RhbC5maW5kKCcucGFyZW50cy1jb250ZW50Jyk7XG5cbiAgICBsb2FkZXIuY3NzKCdkaXNwbGF5JywgJ2Jsb2NrJyk7XG4gICAgY29udGVudC5odG1sKCcnKTtcbiAgICAkLmFqYXgoe1xuICAgICAgICB1cmw6IGAke2dyYXZDb25maWcuY3VycmVudF91cmx9YCxcbiAgICAgICAgbWV0aG9kOiAncG9zdCcsXG4gICAgICAgIGRhdGE6IE9iamVjdC5hc3NpZ24oe30sIGdldEV4dHJhRm9ybURhdGEodGFyZ2V0KSwge1xuICAgICAgICAgICAgcm91dGU6IGI2NF9lbmNvZGVfdW5pY29kZShmaWVsZC52YWwoKSksXG4gICAgICAgICAgICBmaWVsZDogZmllbGQuZGF0YSgnZmllbGROYW1lJyksXG4gICAgICAgICAgICBhY3Rpb246ICdnZXRMZXZlbExpc3RpbmcnLFxuICAgICAgICAgICAgJ2FkbWluLW5vbmNlJzogZ3JhdkNvbmZpZy5hZG1pbl9ub25jZSxcbiAgICAgICAgICAgIGluaXRpYWw6IHRydWVcbiAgICAgICAgfSksXG4gICAgICAgIHN1Y2Nlc3MocmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGxvYWRlci5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpO1xuXG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgICAgICAgY29udGVudC5odG1sKHJlc3BvbnNlLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIUluc3RhbmNlc1tgJHtmaWVsZE5hbWV9LSR7bW9kYWwuZGF0YSgncmVtb2RhbElkJyl9YF0pIHtcbiAgICAgICAgICAgICAgICBJbnN0YW5jZXNbYCR7ZmllbGROYW1lfS0ke21vZGFsLmRhdGEoJ3JlbW9kYWxJZCcpfWBdID0gbmV3IFBhcmVudHMoY29udGVudCwgZmllbGQsIHJlc3BvbnNlLmRhdGEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBJbnN0YW5jZXNbYCR7ZmllbGROYW1lfS0ke21vZGFsLmRhdGEoJ3JlbW9kYWxJZCcpfWBdLmZpbmRlci5yZWxvYWQocmVzcG9uc2UuZGF0YSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG1vZGFsLmRhdGEoJ3BhcmVudHMnLCBJbnN0YW5jZXNbYCR7ZmllbGROYW1lfS0ke21vZGFsLmRhdGEoJ3JlbW9kYWxJZCcpfWBdKTtcbiAgICAgICAgICAgIG1vZGFsLmRhdGEoJ3BhcmVudHMtc2VsZWN0ZWRGaWVsZCcsIGZpZWxkKTtcbiAgICAgICAgfVxuICAgIH0pO1xufSk7XG5cbi8vIGFwcGx5IGZpbmRlciBzZWxlY3Rpb24gdG8gZmllbGRcbiQoZG9jdW1lbnQpLm9uKCdjbGljaycsICdbZGF0YS1yZW1vZGFsLWlkXS5wYXJlbnRzLWNvbnRhaW5lciBbZGF0YS1wYXJlbnRzLXNlbGVjdF0nLCAoZXZlbnQpID0+IHtcbiAgICBjb25zdCBtb2RhbCA9ICQoZXZlbnQuY3VycmVudFRhcmdldCkuY2xvc2VzdCgnW2RhdGEtcmVtb2RhbC1pZF0nKTtcbiAgICBjb25zdCBwYXJlbnRzID0gbW9kYWwuZGF0YSgncGFyZW50cycpO1xuICAgIGNvbnN0IHNlbGVjdGVkRmllbGQgPSBtb2RhbC5kYXRhKCdwYXJlbnRzU2VsZWN0ZWRGaWVsZCcpO1xuICAgIGNvbnN0IGZpbmRlciA9IHBhcmVudHMuZmluZGVyO1xuICAgIGNvbnN0IGZpZWxkID0gcGFyZW50cy5maWVsZDtcbiAgICBjb25zdCBwYXJlbnRMYWJlbCA9IHBhcmVudHMucGFyZW50TGFiZWw7XG4gICAgY29uc3QgcGFyZW50TmFtZSA9IHBhcmVudHMucGFyZW50TmFtZTtcbiAgICBjb25zdCBzZWxlY3Rpb24gPSBmaW5kZXIuZmluZExhc3RBY3RpdmUoKS5pdGVtWzBdO1xuICAgIGNvbnN0IHZhbHVlID0gc2VsZWN0aW9uLl9pdGVtW2ZpbmRlci5jb25maWcudmFsdWVLZXldO1xuICAgIGNvbnN0IG5hbWUgPSBzZWxlY3Rpb24uX2l0ZW1bZmluZGVyLmNvbmZpZy5sYWJlbEtleV07XG5cbiAgICBjb25zb2xlLmxvZygnY2xpY2sgW2RhdGEtcGFyZW50cy1zZWxlY3RdJywgc2VsZWN0ZWRGaWVsZCk7XG4gICAgaWYgKHNlbGVjdGVkRmllbGQuY2xvc2VzdCgnLnJlbW9kYWwnKS5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBmaWVsZC5pbmRleChzZWxlY3RlZEZpZWxkKSAtIDE7XG4gICAgICAgIHNlbGVjdGVkRmllbGQudmFsKHZhbHVlKTtcbiAgICAgICAgJChwYXJlbnRMYWJlbFtpbmRleF0pLnRleHQodmFsdWUpO1xuICAgICAgICAkKHBhcmVudE5hbWVbaW5kZXhdKS50ZXh0KG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGZpZWxkLnZhbCh2YWx1ZSk7XG4gICAgICAgIHBhcmVudExhYmVsLnRleHQodmFsdWUpO1xuICAgICAgICBwYXJlbnROYW1lLnRleHQobmFtZSk7XG4gICAgICAgIGZpbmRlci5jb25maWcuZGVmYXVsdFBhdGggPSB2YWx1ZTtcblxuICAgIH1cbiAgICBjb25zdCByZW1vZGFsID0gJC5yZW1vZGFsLmxvb2t1cFskKGBbZGF0YS1yZW1vZGFsLWlkPVwiJHttb2RhbC5kYXRhKCdyZW1vZGFsSWQnKX1cIl1gKS5kYXRhKCdyZW1vZGFsJyldO1xuICAgIHJlbW9kYWwuY2xvc2UoKTtcbn0pO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./app/forms/fields/parents.js\n"); /***/ }), /***/ "./app/forms/fields/permissions.js": -/*!*****************************************!* +/*!*****************************************!*\ !*** ./app/forms/fields/permissions.js ***! \*****************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { @@ -242,7 +253,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var jque /***/ }), /***/ "./app/forms/fields/range.js": -/*!***********************************!* +/*!***********************************!*\ !*** ./app/forms/fields/range.js ***! \***********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { @@ -253,29 +264,29 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var jque /***/ }), /***/ "./app/forms/fields/selectize.js": -/*!***************************************!* +/*!***************************************!*\ !*** ./app/forms/fields/selectize.js ***! \***************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => /* binding */ SelectizeField,\n/* harmony export */ \"Instance\": () => /* binding */ Instance\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var selectize__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! selectize */ \"./node_modules/selectize/dist/js/selectize.js\");\n/* harmony import */ var selectize__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(selectize__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _utils_selectize_required_fix__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/selectize-required-fix */ \"./app/utils/selectize-required-fix.js\");\n/* harmony import */ var _utils_selectize_option_click__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../utils/selectize-option-click */ \"./app/utils/selectize-option-click.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\n\nvar PagesRoute = {\n option: function option(item, escape) {\n var label = escape(item.text).split(' ');\n var arrows = label.shift();\n var slug = label.shift();\n return \"
          \\n \".concat(arrows, \"\\n \\n \").concat(slug.replace('(', '/').replace(')', ''), \"\\n \").concat(label.join(' '), \"\\n \\n
          \");\n }\n};\n\nvar SelectizeField = /*#__PURE__*/function () {\n function SelectizeField() {\n var _this = this;\n\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n _classCallCheck(this, SelectizeField);\n\n this.options = Object.assign({}, options);\n this.elements = [];\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-grav-selectize]').each(function (index, element) {\n return _this.add(element);\n });\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('body').on('mutation._grav', this._onAddedNodes.bind(this));\n }\n\n _createClass(SelectizeField, [{\n key: \"add\",\n value: function add(element) {\n element = jquery__WEBPACK_IMPORTED_MODULE_0___default()(element);\n\n if (element.closest('template').length) {\n return false;\n }\n\n var tag = element.prop('tagName').toLowerCase();\n var isInput = tag === 'input' || tag === 'select';\n var data = (isInput ? element.closest('[data-grav-selectize]') : element).data('grav-selectize') || {};\n var field = isInput ? element : element.find('input, select');\n\n if (field.attr('name') === 'data[route]') {\n data = jquery__WEBPACK_IMPORTED_MODULE_0___default().extend({}, data, {\n render: PagesRoute\n });\n }\n\n if (!field.length || field.get(0).selectize) {\n return;\n }\n\n var plugins = jquery__WEBPACK_IMPORTED_MODULE_0___default().merge(data.plugins ? data.plugins : [], ['required-fix']);\n field.selectize(jquery__WEBPACK_IMPORTED_MODULE_0___default().extend({}, data, {\n plugins: plugins\n }));\n this.elements.push(field.data('selectize'));\n }\n }, {\n key: \"_onAddedNodes\",\n value: function _onAddedNodes(event, target\n /* , record, instance */\n ) {\n var _this2 = this;\n\n var fields = jquery__WEBPACK_IMPORTED_MODULE_0___default()(target).find('select.fancy, input.fancy, [data-grav-selectize]').filter(function (index, element) {\n return !jquery__WEBPACK_IMPORTED_MODULE_0___default()(element).closest('template').length;\n });\n\n if (!fields.length) {\n return;\n }\n\n fields.each(function (index, field) {\n return _this2.add(field);\n });\n }\n }]);\n\n return SelectizeField;\n}();\n\n\nvar Instance = new SelectizeField();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL2Zvcm1zL2ZpZWxkcy9zZWxlY3RpemUuanM/NzM1MyJdLCJuYW1lcyI6WyJQYWdlc1JvdXRlIiwib3B0aW9uIiwiaXRlbSIsImVzY2FwZSIsImxhYmVsIiwidGV4dCIsInNwbGl0IiwiYXJyb3dzIiwic2hpZnQiLCJzbHVnIiwicmVwbGFjZSIsImpvaW4iLCJTZWxlY3RpemVGaWVsZCIsIm9wdGlvbnMiLCJPYmplY3QiLCJhc3NpZ24iLCJlbGVtZW50cyIsIiQiLCJlYWNoIiwiaW5kZXgiLCJlbGVtZW50IiwiYWRkIiwib24iLCJfb25BZGRlZE5vZGVzIiwiYmluZCIsImNsb3Nlc3QiLCJsZW5ndGgiLCJ0YWciLCJwcm9wIiwidG9Mb3dlckNhc2UiLCJpc0lucHV0IiwiZGF0YSIsImZpZWxkIiwiZmluZCIsImF0dHIiLCJyZW5kZXIiLCJnZXQiLCJzZWxlY3RpemUiLCJwbHVnaW5zIiwicHVzaCIsImV2ZW50IiwidGFyZ2V0IiwiZmllbGRzIiwiZmlsdGVyIiwiSW5zdGFuY2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQSxJQUFNQSxVQUFVLEdBQUc7QUFDZkMsUUFBTSxFQUFFLGdCQUFTQyxJQUFULEVBQWVDLE1BQWYsRUFBdUI7QUFDM0IsUUFBTUMsS0FBSyxHQUFHRCxNQUFNLENBQUNELElBQUksQ0FBQ0csSUFBTixDQUFOLENBQWtCQyxLQUFsQixDQUF3QixHQUF4QixDQUFkO0FBQ0EsUUFBTUMsTUFBTSxHQUFHSCxLQUFLLENBQUNJLEtBQU4sRUFBZjtBQUNBLFFBQU1DLElBQUksR0FBR0wsS0FBSyxDQUFDSSxLQUFOLEVBQWI7QUFFQSxtR0FDOEJELE1BRDlCLHNGQUdvQ0UsSUFBSSxDQUFDQyxPQUFMLENBQWEsR0FBYixFQUFrQixHQUFsQixFQUF1QkEsT0FBdkIsQ0FBK0IsR0FBL0IsRUFBb0MsRUFBcEMsQ0FIcEMsNENBSWdCTixLQUFLLENBQUNPLElB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QUFBLE9BQVo7QUFDSDs7Ozs7OztBQUdFLElBQUlZLFFBQVEsR0FBRyxJQUFJaEMsY0FBSixFQUFmIiwiZmlsZSI6Ii4vYXBwL2Zvcm1zL2ZpZWxkcy9zZWxlY3RpemUuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0ICdzZWxlY3RpemUnO1xuaW1wb3J0ICcuLi8uLi91dGlscy9zZWxlY3RpemUtcmVxdWlyZWQtZml4JztcbmltcG9ydCAnLi4vLi4vdXRpbHMvc2VsZWN0aXplLW9wdGlvbi1jbGljayc7XG5cbmNvbnN0IFBhZ2VzUm91dGUgPSB7XG4gICAgb3B0aW9uOiBmdW5jdGlvbihpdGVtLCBlc2NhcGUpIHtcbiAgICAgICAgY29uc3QgbGFiZWwgPSBlc2NhcGUoaXRlbS50ZXh0KS5zcGxpdCgnICcpO1xuICAgICAgICBjb25zdCBhcnJvd3MgPSBsYWJlbC5zaGlmdCgpO1xuICAgICAgICBjb25zdCBzbHVnID0gbGFiZWwuc2hpZnQoKTtcblxuICAgICAgICByZXR1cm4gYDxkaXYgY2xhc3M9XCJzZWxlY3RpemUtcm91dGUtb3B0aW9uXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZ3JleVwiPiR7YXJyb3dzfTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC11cGRhdGVcIj4ke3NsdWcucmVwbGFjZSgnKCcsICcvJykucmVwbGFjZSgnKScsICcnKX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4+JHtsYWJlbC5qb2luKCcgJyl9PC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5gO1xuICAgIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlbGVjdGl6ZUZpZWxkIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMuZWxlbWVudHMgPSBbXTtcblxuICAgICAgICAkKCdbZGF0YS1ncmF2LXNlbGVjdGl6ZV0nKS5lYWNoKChpbmRleCwgZWxlbWVudCkgPT4gdGhpcy5hZGQoZWxlbWVudCkpO1xuICAgICAgICAkKCdib2R5Jykub24oJ211dGF0aW9uLl9ncmF2JywgdGhpcy5fb25BZGRlZE5vZGVzLmJpbmQodGhpcykpO1xuICAgIH1cblxuICAgIGFkZChlbGVtZW50KSB7XG4gICAgICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpO1xuXG4gICAgICAgIGlmIChlbGVtZW50LmNsb3Nlc3QoJ3RlbXBsYXRlJykubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdGFnID0gZWxlbWVudC5wcm9wKCd0YWdOYW1lJykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IGlzSW5wdXQgPSB0YWcgPT09ICdpbnB1dCcgfHwgdGFnID09PSAnc2VsZWN0JztcblxuICAgICAgICBsZXQgZGF0YSA9IChpc0lucHV0ID8gZWxlbWVudC5jbG9zZXN0KCdbZGF0YS1ncmF2LXNlbGVjdGl6ZV0nKSA6IGVsZW1lbnQpLmRhdGEoJ2dyYXYtc2VsZWN0aXplJykgfHwge307XG4gICAgICAgIGxldCBmaWVsZCA9IChpc0lucHV0ID8gZWxlbWVudCA6IGVsZW1lbnQuZmluZCgnaW5wdXQsIHNlbGVjdCcpKTtcblxuICAgICAgICBpZiAoZmllbGQuYXR0cignbmFtZScpID09PSAnZGF0YVtyb3V0ZV0nKSB7XG4gICAgICAgICAgICBkYXRhID0gJC5leHRlbmQoe30sIGRhdGEsIHsgcmVuZGVyOiBQYWdlc1JvdXRlIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFmaWVsZC5sZW5ndGggfHwgZmllbGQuZ2V0KDApLnNlbGVjdGl6ZSkgeyByZXR1cm47IH1cbiAgICAgICAgY29uc3QgcGx1Z2lucyA9ICQubWVyZ2UoZGF0YS5wbHVnaW5zID8gZGF0YS5wbHVnaW5zIDogW10sIFsncmVxdWlyZWQtZml4J10pO1xuICAgICAgICBmaWVsZC5zZWxlY3RpemUoJC5leHRlbmQoe30sIGRhdGEsIHsgcGx1Z2lucyB9KSk7XG5cbiAgICAgICAgdGhpcy5lbGVtZW50cy5wdXNoKGZpZWxkLmRhdGEoJ3NlbGVjdGl6ZScpKTtcbiAgICB9XG5cbiAgICBfb25BZGRlZE5vZGVzKGV2ZW50LCB0YXJnZXQvKiAsIHJlY29yZCwgaW5zdGFuY2UgKi8pIHtcbiAgICAgICAgbGV0IGZpZWxkcyA9ICQodGFyZ2V0KS5maW5kKCdzZWxlY3QuZmFuY3ksIGlucHV0LmZhbmN5LCBbZGF0YS1ncmF2LXNlbGVjdGl6ZV0nKS5maWx0ZXIoKGluZGV4LCBlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gISQoZWxlbWVudCkuY2xvc2VzdCgndGVtcGxhdGUnKS5sZW5ndGg7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghZmllbGRzLmxlbmd0aCkgeyByZXR1cm47IH1cblxuICAgICAgICBmaWVsZHMuZWFjaCgoaW5kZXgsIGZpZWxkKSA9PiB0aGlzLmFkZChmaWVsZCkpO1xuICAgIH1cbn1cblxuZXhwb3J0IGxldCBJbnN0YW5jZSA9IG5ldyBTZWxlY3RpemVGaWVsZCgpO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./app/forms/fields/selectize.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ SelectizeField),\n/* harmony export */ \"Instance\": () => (/* binding */ Instance)\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var selectize__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! selectize */ \"./node_modules/selectize/dist/js/selectize.js\");\n/* harmony import */ var selectize__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(selectize__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _utils_selectize_required_fix__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/selectize-required-fix */ \"./app/utils/selectize-required-fix.js\");\n/* harmony import */ var _utils_selectize_option_click__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../utils/selectize-option-click */ \"./app/utils/selectize-option-click.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\n\nvar PagesRoute = {\n option: function option(item, escape) {\n var label = escape(item.text).split(' ');\n var arrows = label.shift();\n var slug = label.shift();\n return \"
          \\n \".concat(arrows, \"\\n \\n \").concat(slug.replace('(', '/').replace(')', ''), \"\\n \").concat(label.join(' '), \"\\n \\n
          \");\n }\n};\n\nvar SelectizeField = /*#__PURE__*/function () {\n function SelectizeField() {\n var _this = this;\n\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n _classCallCheck(this, SelectizeField);\n\n this.options = Object.assign({}, options);\n this.elements = [];\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-grav-selectize]').each(function (index, element) {\n return _this.add(element);\n });\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('body').on('mutation._grav', this._onAddedNodes.bind(this));\n }\n\n _createClass(SelectizeField, [{\n key: \"add\",\n value: function add(element) {\n element = jquery__WEBPACK_IMPORTED_MODULE_0___default()(element);\n\n if (element.closest('template').length) {\n return false;\n }\n\n var tag = element.prop('tagName').toLowerCase();\n var isInput = tag === 'input' || tag === 'select';\n var data = (isInput ? element.closest('[data-grav-selectize]') : element).data('grav-selectize') || {};\n var field = isInput ? element : element.find('input, select');\n\n if (field.attr('name') === 'data[route]') {\n data = jquery__WEBPACK_IMPORTED_MODULE_0___default().extend({}, data, {\n render: PagesRoute\n });\n }\n\n if (!field.length || field.get(0).selectize) {\n return;\n }\n\n var plugins = jquery__WEBPACK_IMPORTED_MODULE_0___default().merge(data.plugins ? data.plugins : [], ['required-fix']);\n field.selectize(jquery__WEBPACK_IMPORTED_MODULE_0___default().extend({}, data, {\n plugins: plugins\n }));\n this.elements.push(field.data('selectize'));\n }\n }, {\n key: \"_onAddedNodes\",\n value: function _onAddedNodes(event, target\n /* , record, instance */\n ) {\n var _this2 = this;\n\n var fields = jquery__WEBPACK_IMPORTED_MODULE_0___default()(target).find('select.fancy, input.fancy, [data-grav-selectize]').filter(function (index, element) {\n return !jquery__WEBPACK_IMPORTED_MODULE_0___default()(element).closest('template').length;\n });\n\n if (!fields.length) {\n return;\n }\n\n fields.each(function (index, field) {\n return _this2.add(field);\n });\n }\n }]);\n\n return SelectizeField;\n}();\n\n\nvar Instance = new SelectizeField();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL2Zvcm1zL2ZpZWxkcy9zZWxlY3RpemUuanM/NzM1MyJdLCJuYW1lcyI6WyJQYWdlc1JvdXRlIiwib3B0aW9uIiwiaXRlbSIsImVzY2FwZSIsImxhYmVsIiwidGV4dCIsInNwbGl0IiwiYXJyb3dzIiwic2hpZnQiLCJzbHVnIiwicmVwbGFjZSIsImpvaW4iLCJTZWxlY3RpemVGaWVsZCIsIm9wdGlvbnMiLCJPYmplY3QiLCJhc3NpZ24iLCJlbGVtZW50cyIsIiQiLCJlYWNoIiwiaW5kZXgiLCJlbGVtZW50IiwiYWRkIiwib24iLCJfb25BZGRlZE5vZGVzIiwiYmluZCIsImNsb3Nlc3QiLCJsZW5ndGgiLCJ0YWciLCJwcm9wIiwidG9Mb3dlckNhc2UiLCJpc0lucHV0IiwiZGF0YSIsImZpZWxkIiwiZmluZCIsImF0dHIiLCJyZW5kZXIiLCJnZXQiLCJzZWxlY3RpemUiLCJwbHVnaW5zIiwicHVzaCIsImV2ZW50IiwidGFyZ2V0IiwiZmllbGRzIiwiZmlsdGVyIiwiSW5zdGFuY2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQSxJQUFNQSxVQUFVLEdBQUc7QUFDZkMsUUFBTSxFQUFFLGdCQUFTQyxJQUFULEVBQWVDLE1BQWYsRUFBdUI7QUFDM0IsUUFBTUMsS0FBSyxHQUFHRCxNQUFNLENBQUNELElBQUksQ0FBQ0csSUFBTixDQUFOLENBQWtCQyxLQUFsQixDQUF3QixHQUF4QixDQUFkO0FBQ0EsUUFBTUMsTUFBTSxHQUFHSCxLQUFLLENBQUNJLEtBQU4sRUFBZjtBQUNBLFFBQU1DLElBQUksR0FBR0wsS0FBSyxDQUFDSSxLQUFOLEVBQWI7QUFFQSxtR0FDOEJELE1BRDlCLHNGQUdvQ0UsSUFBSSxDQUFDQyxPQUFMLENBQWEsR0FBYixFQUFrQixHQUFsQixFQUF1QkEsT0FBdkIsQ0FBK0IsR0FBL0IsRUFBb0MsRUFBcEMsQ0FIcEMsNENBSWdCTixLQUFLLENBQUNPLElB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QUFMLENBQVNXLEtBQVQsQ0FBbEI7QUFBQSxPQUFaO0FBQ0g7Ozs7Ozs7QUFHRSxJQUFJWSxRQUFRLEdBQUcsSUFBSWhDLGNBQUosRUFBZiIsImZpbGUiOiIuL2FwcC9mb3Jtcy9maWVsZHMvc2VsZWN0aXplLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCAnc2VsZWN0aXplJztcbmltcG9ydCAnLi4vLi4vdXRpbHMvc2VsZWN0aXplLXJlcXVpcmVkLWZpeCc7XG5pbXBvcnQgJy4uLy4uL3V0aWxzL3NlbGVjdGl6ZS1vcHRpb24tY2xpY2snO1xuXG5jb25zdCBQYWdlc1JvdXRlID0ge1xuICAgIG9wdGlvbjogZnVuY3Rpb24oaXRlbSwgZXNjYXBlKSB7XG4gICAgICAgIGNvbnN0IGxhYmVsID0gZXNjYXBlKGl0ZW0udGV4dCkuc3BsaXQoJyAnKTtcbiAgICAgICAgY29uc3QgYXJyb3dzID0gbGFiZWwuc2hpZnQoKTtcbiAgICAgICAgY29uc3Qgc2x1ZyA9IGxhYmVsLnNoaWZ0KCk7XG5cbiAgICAgICAgcmV0dXJuIGA8ZGl2IGNsYXNzPVwic2VsZWN0aXplLXJvdXRlLW9wdGlvblwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWdyZXlcIj4ke2Fycm93c308L3NwYW4+XG4gICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtdXBkYXRlXCI+JHtzbHVnLnJlcGxhY2UoJygnLCAnLycpLnJlcGxhY2UoJyknLCAnJyl9PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuPiR7bGFiZWwuam9pbignICcpfTwvc3Bhbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+YDtcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTZWxlY3RpemVGaWVsZCB7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmVsZW1lbnRzID0gW107XG5cbiAgICAgICAgJCgnW2RhdGEtZ3Jhdi1zZWxlY3RpemVdJykuZWFjaCgoaW5kZXgsIGVsZW1lbnQpID0+IHRoaXMuYWRkKGVsZW1lbnQpKTtcbiAgICAgICAgJCgnYm9keScpLm9uKCdtdXRhdGlvbi5fZ3JhdicsIHRoaXMuX29uQWRkZWROb2Rlcy5iaW5kKHRoaXMpKTtcbiAgICB9XG5cbiAgICBhZGQoZWxlbWVudCkge1xuICAgICAgICBlbGVtZW50ID0gJChlbGVtZW50KTtcblxuICAgICAgICBpZiAoZWxlbWVudC5jbG9zZXN0KCd0ZW1wbGF0ZScpLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHRhZyA9IGVsZW1lbnQucHJvcCgndGFnTmFtZScpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBpc0lucHV0ID0gdGFnID09PSAnaW5wdXQnIHx8IHRhZyA9PT0gJ3NlbGVjdCc7XG5cbiAgICAgICAgbGV0IGRhdGEgPSAoaXNJbnB1dCA/IGVsZW1lbnQuY2xvc2VzdCgnW2RhdGEtZ3Jhdi1zZWxlY3RpemVdJykgOiBlbGVtZW50KS5kYXRhKCdncmF2LXNlbGVjdGl6ZScpIHx8IHt9O1xuICAgICAgICBsZXQgZmllbGQgPSAoaXNJbnB1dCA/IGVsZW1lbnQgOiBlbGVtZW50LmZpbmQoJ2lucHV0LCBzZWxlY3QnKSk7XG5cbiAgICAgICAgaWYgKGZpZWxkLmF0dHIoJ25hbWUnKSA9PT0gJ2RhdGFbcm91dGVdJykge1xuICAgICAgICAgICAgZGF0YSA9ICQuZXh0ZW5kKHt9LCBkYXRhLCB7IHJlbmRlcjogUGFnZXNSb3V0ZSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZmllbGQubGVuZ3RoIHx8IGZpZWxkLmdldCgwKS5zZWxlY3RpemUpIHsgcmV0dXJuOyB9XG4gICAgICAgIGNvbnN0IHBsdWdpbnMgPSAkLm1lcmdlKGRhdGEucGx1Z2lucyA/IGRhdGEucGx1Z2lucyA6IFtdLCBbJ3JlcXVpcmVkLWZpeCddKTtcbiAgICAgICAgZmllbGQuc2VsZWN0aXplKCQuZXh0ZW5kKHt9LCBkYXRhLCB7IHBsdWdpbnMgfSkpO1xuXG4gICAgICAgIHRoaXMuZWxlbWVudHMucHVzaChmaWVsZC5kYXRhKCdzZWxlY3RpemUnKSk7XG4gICAgfVxuXG4gICAgX29uQWRkZWROb2RlcyhldmVudCwgdGFyZ2V0LyogLCByZWNvcmQsIGluc3RhbmNlICovKSB7XG4gICAgICAgIGxldCBmaWVsZHMgPSAkKHRhcmdldCkuZmluZCgnc2VsZWN0LmZhbmN5LCBpbnB1dC5mYW5jeSwgW2RhdGEtZ3Jhdi1zZWxlY3RpemVdJykuZmlsdGVyKChpbmRleCwgZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuICEkKGVsZW1lbnQpLmNsb3Nlc3QoJ3RlbXBsYXRlJykubGVuZ3RoO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIWZpZWxkcy5sZW5ndGgpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgZmllbGRzLmVhY2goKGluZGV4LCBmaWVsZCkgPT4gdGhpcy5hZGQoZmllbGQpKTtcbiAgICB9XG59XG5cbmV4cG9ydCBsZXQgSW5zdGFuY2UgPSBuZXcgU2VsZWN0aXplRmllbGQoKTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./app/forms/fields/selectize.js\n"); /***/ }), /***/ "./app/forms/fields/selectunique.js": -/*!******************************************!* +/*!******************************************!*\ !*** ./app/forms/fields/selectunique.js ***! \******************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => /* binding */ SelectUniqueField,\n/* harmony export */ \"Instance\": () => /* binding */ Instance\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var mout_object_forIn__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! mout/object/forIn */ \"./node_modules/mout/object/forIn.js\");\n/* harmony import */ var mout_object_forIn__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(mout_object_forIn__WEBPACK_IMPORTED_MODULE_1__);\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n // import { config } from 'grav-config';\n\nvar Data = {};\n\nvar SelectUniqueField = /*#__PURE__*/function () {\n function SelectUniqueField(options) {\n var _this = this;\n\n _classCallCheck(this, SelectUniqueField);\n\n var body = jquery__WEBPACK_IMPORTED_MODULE_0___default()('body');\n this.items = jquery__WEBPACK_IMPORTED_MODULE_0___default()();\n this.options = Object.assign({}, this.defaults, options);\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-select-observe]').each(function (index, element) {\n return _this.addSelect(element);\n }).last().trigger('change', {\n load: true\n });\n body.on('mutation._grav', this._onAddedNodes.bind(this));\n body.on('mutation_removed._grav', this._onRemovedNodes.bind(this));\n }\n\n _createClass(SelectUniqueField, [{\n key: \"_onAddedNodes\",\n value: function _onAddedNodes(event, target, record, instance) {\n var _this2 = this;\n\n var fields = jquery__WEBPACK_IMPORTED_MODULE_0___default()(target).find('[data-select-observe]');\n\n if (!fields.length) {\n return;\n }\n\n fields.each(function (index, field) {\n field = jquery__WEBPACK_IMPORTED_MODULE_0___default()(field);\n\n if (!~_this2.items.index(field)) {\n _this2.addSelect(field);\n }\n });\n }\n }, {\n key: \"_onRemovedNodes\",\n value: function _onRemovedNodes(event, data\n /* , instance */\n ) {\n var _this3 = this;\n\n var target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(data.target);\n var holder = target.data('collectionHolder');\n\n if (!holder) {\n return false;\n }\n\n var node = jquery__WEBPACK_IMPORTED_MODULE_0___default()(data.mutation.removedNodes);\n var value = node.find('[data-select-observe]').val();\n\n if (value) {\n Data[holder].state[value] = value;\n }\n\n target.find('[data-select-observe]').each(function (index, field) {\n field = jquery__WEBPACK_IMPORTED_MODULE_0___default()(field);\n\n if (field.val() !== value) {\n _this3.updateOptions(field);\n }\n });\n }\n }, {\n key: \"addSelect\",\n value: function addSelect(element) {\n var _this4 = this;\n\n this.items = this.items.add(element);\n element = jquery__WEBPACK_IMPORTED_MODULE_0___default()(element);\n var value = element.attr('value');\n var holder = element.closest('[data-collection-holder]').data('collectionHolder');\n var options = element.closest('[data-select-unique]').data('selectUnique');\n\n if (!Data[holder]) {\n var data = {};\n\n if (Array.isArray(options)) {\n options.slice(0).map(function (item) {\n data[item] = item;\n });\n } else {\n data = Object.assign({}, options);\n }\n\n Data[holder] = {\n original: null,\n state: null\n };\n Data[holder].original = Object.assign({}, data);\n Data[holder].state = Object.assign({}, data);\n }\n\n this.updateOptions(element);\n element.data('originalValue', value);\n element.on('change', function (event, extras) {\n var target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.currentTarget);\n\n if (target.data('dummyChange')) {\n target.data('dummyChange', false);\n return false;\n }\n\n _this4.refreshOptions(target, extras && extras.load ? null : element.data('originalValue'));\n\n element.data('originalValue', target.val());\n });\n }\n }, {\n key: \"updateOptions\",\n value: function updateOptions(element) {\n element = jquery__WEBPACK_IMPORTED_MODULE_0___default()(element);\n var value = element.attr('value');\n var holder = element.closest('[data-collection-holder]').data('collectionHolder');\n mout_object_forIn__WEBPACK_IMPORTED_MODULE_1___default()(Data[holder].state, function (v, k) {\n var selected = k === value ? 'selected=\"selected\"' : '';\n\n if (element.get(0).selectize) {\n var selectize = element.data('selectize');\n selectize.removeOption(k);\n selectize.addOption({\n value: k,\n text: v\n });\n } else {\n element.append(\"\"));\n }\n\n if (selected) {\n if (element.get(0).selectize) {\n var _selectize = element.data('selectize');\n\n _selectize.setValue(k);\n }\n\n delete Data[holder].state[value];\n }\n });\n }\n }, {\n key: \"refreshOptions\",\n value: function refreshOptions(element, originalValue) {\n var value = element.val();\n var holder = element.closest('[data-collection-holder]').data('collectionHolder');\n delete Data[holder].state[value];\n\n if (originalValue && Data[holder].original[originalValue]) {\n Data[holder].state[originalValue] = Data[holder].original[originalValue];\n }\n\n this.items.each(function (index, select) {\n select = jquery__WEBPACK_IMPORTED_MODULE_0___default()(select);\n\n if (select[0] === element[0]) {\n return;\n }\n\n var selectedValue = select.val();\n select.data('dummyChange', true);\n\n if (select.get(0).selectize) {\n var selectize = select.data('selectize');\n\n if (selectize) {\n selectize.clearOptions();\n\n if (selectedValue) {\n selectize.addOption({\n value: selectedValue,\n text: Data[holder].original[selectedValue] || selectedValue\n });\n }\n\n mout_object_forIn__WEBPACK_IMPORTED_MODULE_1___default()(Data[holder].state, function (v, k) {\n selectize.addOption({\n value: k,\n text: v\n });\n });\n selectize.setValue(selectedValue, true);\n }\n } else {\n select.empty();\n mout_object_forIn__WEBPACK_IMPORTED_MODULE_1___default()(Data[holder].state, function (v, k) {\n var selected = k === selectedValue ? 'selected=\"selected\"' : '';\n select.append(\"\"));\n });\n }\n\n select.data('dummyChange', false);\n });\n }\n }]);\n\n return SelectUniqueField;\n}();\n\n\nvar Instance = new SelectUniqueField();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL2Zvcm1zL2ZpZWxkcy9zZWxlY3R1bmlxdWUuanM/MjA0OSJdLCJuYW1lcyI6WyJEYXRhIiwiU2VsZWN0VW5pcXVlRmllbGQiLCJvcHRpb25zIiwiYm9keSIsIiQiLCJpdGVtcyIsIk9iamVjdCIsImFzc2lnbiIsImRlZmF1bHRzIiwiZWFjaCIsImluZGV4IiwiZWxlbWVudCIsImFkZFNlbGVjdCIsImxhc3QiLCJ0cmlnZ2VyIiwibG9hZCIsIm9uIiwiX29uQWRkZWROb2RlcyIsImJpbmQiLCJfb25SZW1vdmVkTm9kZXMiLCJldmVudCIsInRhcmdldCIsInJlY29yZCIsImluc3RhbmNlIiwiZmllbGRzIiwiZmluZCIsImxlbmd0aCIsImZpZWxkIiwiZGF0YSIsImhvbGRlciIsIm5vZGUiLCJtdXRhdGlvbiIsInJlbW92ZWROb2RlcyIsInZhbHVlIiwidmFsIiwic3RhdGUiLCJ1cGRhdGVPcHRpb25zIiwiYWRkIiwiYXR0ciIsImNsb3Nlc3QiLCJBcnJheSIsImlzQXJyYXkiLCJzbGljZSIsIm1hcCIsIml0ZW0iLCJvcmlnaW5hbCIsImV4dHJhcyIsImN1cnJlbnRUYXJnZXQiLCJyZWZyZXNoT3B0aW9ucyIsImZvckluIiwidiIsImsiLCJzZWxlY3RlZCIsImdldCIsInNlbGVjdGl6ZSIsInJlbW92ZU9wdGlvbiIsImFkZE9wdGlvbiIsInRleHQiLCJhcHBlbmQiLCJzZXRWYWx1ZSIsIm9yaWdpbmFsVmFsdWUiLCJzZWxlY3QiLCJzZWxlY3RlZFZhbHVlIiwiY2xlYXJPcHRpb25zIiwiZW1wdHkiLCJJbnN0YW5jZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7Q0FFQTs7QUFFQSxJQUFNQSxJQUFJLEdBQUcsRUFBYjs7SUFDcUJDLGlCO0FBRWpCLDZCQUFZQyxPQUFaLEVBQXFCO0FBQUE7O0FBQUE7O0FBQ2pCLFFBQU1DLElBQUksR0FBR0MsNkNBQUMsQ0FBQyxNQUFELENBQWQ7QUFDQSxTQUFLQyxLQUFM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QUQsa0JBQU0sQ0FBQ0gsTUFBUCwyQkFBZ0NQLENBQWhDLGdCQUFzQ0MsUUFBdEMsY0FBa0RGLENBQWxEO0FBQ0gsV0FISSxDQUFMO0FBSUg7O0FBRURXLGNBQU0sQ0FBQ2pDLElBQVAsQ0FBWSxhQUFaLEVBQTJCLEtBQTNCO0FBQ0gsT0FuQ0Q7QUFvQ0g7Ozs7Ozs7QUFHRSxJQUFJcUMsUUFBUSxHQUFHLElBQUloRSxpQkFBSixFQUFmIiwiZmlsZSI6Ii4vYXBwL2Zvcm1zL2ZpZWxkcy9zZWxlY3R1bmlxdWUuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IGZvckluIGZyb20gJ21vdXQvb2JqZWN0L2ZvckluJztcbi8vIGltcG9ydCB7IGNvbmZpZyB9IGZyb20gJ2dyYXYtY29uZmlnJztcblxuY29uc3QgRGF0YSA9IHt9O1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VsZWN0VW5pcXVlRmllbGQge1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICBjb25zdCBib2R5ID0gJCgnYm9keScpO1xuICAgICAgICB0aGlzLml0ZW1zID0gJCgpO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmRlZmF1bHRzLCBvcHRpb25zKTtcblxuICAgICAgICAkKCdbZGF0YS1zZWxlY3Qtb2JzZXJ2ZV0nKS5lYWNoKChpbmRleCwgZWxlbWVudCkgPT4gdGhpcy5hZGRTZWxlY3QoZWxlbWVudCkpLmxhc3QoKS50cmlnZ2VyKCdjaGFuZ2UnLCB7IGxvYWQ6IHRydWUgfSk7XG4gICAgICAgIGJvZHkub24oJ211dGF0aW9uLl9ncmF2JywgdGhpcy5fb25BZGRlZE5vZGVzLmJpbmQodGhpcykpO1xuICAgICAgICBib2R5Lm9uKCdtdXRhdGlvbl9yZW1vdmVkLl9ncmF2JywgdGhpcy5fb25SZW1vdmVkTm9kZXMuYmluZCh0aGlzKSk7XG4gICAgfVxuXG4gICAgX29uQWRkZWROb2RlcyhldmVudCwgdGFyZ2V0LCByZWNvcmQsIGluc3RhbmNlKSB7XG4gICAgICAgIGxldCBmaWVsZHMgPSAkKHRhcmdldCkuZmluZCgnW2RhdGEtc2VsZWN0LW9ic2VydmVdJyk7XG4gICAgICAgIGlmICghZmllbGRzLmxlbmd0aCkgeyByZXR1cm47IH1cblxuICAgICAgICBmaWVsZHMuZWFjaCgoaW5kZXgsIGZpZWxkKSA9PiB7XG4gICAgICAgICAgICBmaWVsZCA9ICQoZmllbGQpO1xuICAgICAgICAgICAgaWYgKCF+dGhpcy5pdGVtcy5pbmRleChmaWVsZCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFNlbGVjdChmaWVsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9vblJlbW92ZWROb2RlcyhldmVudCwgZGF0YS8qICwgaW5zdGFuY2UgKi8pIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gJChkYXRhLnRhcmdldCk7XG4gICAgICAgIGNvbnN0IGhvbGRlciA9IHRhcmdldC5kYXRhKCdjb2xsZWN0aW9uSG9sZGVyJyk7XG4gICAgICAgIGlmICghaG9sZGVyKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gICAgICAgIGNvbnN0IG5vZGUgPSAkKGRhdGEubXV0YXRpb24ucmVtb3ZlZE5vZGVzKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBub2RlLmZpbmQoJ1tkYXRhLXNlbGVjdC1vYnNlcnZlXScpLnZhbCgpO1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIERhdGFbaG9sZGVyXS5zdGF0ZVt2YWx1ZV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRhcmdldC5maW5kKCdbZGF0YS1zZWxlY3Qtb2JzZXJ2ZV0nKS5lYWNoKChpbmRleCwgZmllbGQpID0+IHtcbiAgICAgICAgICAgIGZpZWxkID0gJChmaWVsZCk7XG5cbiAgICAgICAgICAgIGlmIChmaWVsZC52YWwoKSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZU9wdGlvbnMoZmllbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhZGRTZWxlY3QoZWxlbWVudCkge1xuICAgICAgICB0aGlzLml0ZW1zID0gdGhpcy5pdGVtcy5hZGQoZWxlbWVudCk7XG4gICAgICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpO1xuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gZWxlbWVudC5hdHRyKCd2YWx1ZScpO1xuICAgICAgICBjb25zdCBob2xkZXIgPSBlbGVtZW50LmNsb3Nlc3QoJ1tkYXRhLWNvbGxlY3Rpb24taG9sZGVyXScpLmRhdGEoJ2NvbGxlY3Rpb25Ib2xkZXInKTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGVsZW1lbnQuY2xvc2VzdCgnW2RhdGEtc2VsZWN0LXVuaXF1ZV0nKS5kYXRhKCdzZWxlY3RVbmlxdWUnKTtcblxuICAgICAgICBpZiAoIURhdGFbaG9sZGVyXSkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB7fTtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMpKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5zbGljZSgwKS5tYXAoKGl0ZW0pID0+IHsgZGF0YVtpdGVtXSA9IGl0ZW07IH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIERhdGFbaG9sZGVyXSA9IHsgb3JpZ2luYWw6IG51bGwsIHN0YXRlOiBudWxsIH07XG4gICAgICAgICAgICBEYXRhW2hvbGRlcl0ub3JpZ2luYWwgPSBPYmplY3QuYXNzaWduKHt9LCBkYXRhKTtcbiAgICAgICAgICAgIERhdGFbaG9sZGVyXS5zdGF0ZSA9IE9iamVjdC5hc3NpZ24oe30sIGRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cGRhdGVPcHRpb25zKGVsZW1lbnQpO1xuXG4gICAgICAgIGVsZW1lbnQuZGF0YSgnb3JpZ2luYWxWYWx1ZScsIHZhbHVlKTtcbiAgICAgICAgZWxlbWVudC5vbignY2hhbmdlJywgKGV2ZW50LCBleHRyYXMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9ICQoZXZlbnQuY3VycmVudFRhcmdldCk7XG4gICAgICAgICAgICBpZiAodGFyZ2V0LmRhdGEoJ2R1bW15Q2hhbmdlJykpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXQuZGF0YSgnZHVtbXlDaGFuZ2UnLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hPcHRpb25zKHRhcmdldCwgZXh0cmFzICYmIGV4dHJhcy5sb2FkID8gbnVsbCA6IGVsZW1lbnQuZGF0YSgnb3JpZ2luYWxWYWx1ZScpKTtcbiAgICAgICAgICAgIGVsZW1lbnQuZGF0YSgnb3JpZ2luYWxWYWx1ZScsIHRhcmdldC52YWwoKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHVwZGF0ZU9wdGlvbnMoZWxlbWVudCkge1xuICAgICAgICBlbGVtZW50ID0gJChlbGVtZW50KTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBlbGVtZW50LmF0dHIoJ3ZhbHVlJyk7XG4gICAgICAgIGNvbnN0IGhvbGRlciA9IGVsZW1lbnQuY2xvc2VzdCgnW2RhdGEtY29sbGVjdGlvbi1ob2xkZXJdJykuZGF0YSgnY29sbGVjdGlvbkhvbGRlcicpO1xuXG4gICAgICAgIGZvckluKERhdGFbaG9sZGVyXS5zdGF0ZSwgKHYsIGspID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkID0gayA9PT0gdmFsdWUgPyAnc2VsZWN0ZWQ9XCJzZWxlY3RlZFwiJyA6ICcnO1xuXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5nZXQoMCkuc2VsZWN0aXplKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0aXplID0gZWxlbWVudC5kYXRhKCdzZWxlY3RpemUnKTtcbiAgICAgICAgICAgICAgICBzZWxlY3RpemUucmVtb3ZlT3B0aW9uKGspO1xuICAgICAgICAgICAgICAgIHNlbGVjdGl6ZS5hZGRPcHRpb24oeyB2YWx1ZTogaywgdGV4dDogdiB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5hcHBlbmQoYDxvcHRpb24gdmFsdWU9XCIke2t9XCIgJHtzZWxlY3RlZH0+JHt2fTwvb3B0aW9uPmApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5nZXQoMCkuc2VsZWN0aXplKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGl6ZSA9IGVsZW1lbnQuZGF0YSgnc2VsZWN0aXplJyk7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGl6ZS5zZXRWYWx1ZShrKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVsZXRlIERhdGFbaG9sZGVyXS5zdGF0ZVt2YWx1ZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlZnJlc2hPcHRpb25zKGVsZW1lbnQsIG9yaWdpbmFsVmFsdWUpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBlbGVtZW50LnZhbCgpO1xuICAgICAgICBjb25zdCBob2xkZXIgPSBlbGVtZW50LmNsb3Nlc3QoJ1tkYXRhLWNvbGxlY3Rpb24taG9sZGVyXScpLmRhdGEoJ2NvbGxlY3Rpb25Ib2xkZXInKTtcbiAgICAgICAgZGVsZXRlIERhdGFbaG9sZGVyXS5zdGF0ZVt2YWx1ZV07XG5cbiAgICAgICAgaWYgKG9yaWdpbmFsVmFsdWUgJiYgRGF0YVtob2xkZXJdLm9yaWdpbmFsW29yaWdpbmFsVmFsdWVdKSB7XG4gICAgICAgICAgICBEYXRhW2hvbGRlcl0uc3RhdGVbb3JpZ2luYWxWYWx1ZV0gPSBEYXRhW2hvbGRlcl0ub3JpZ2luYWxbb3JpZ2luYWxWYWx1ZV07XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLml0ZW1zLmVhY2goKGluZGV4LCBzZWxlY3QpID0+IHtcbiAgICAgICAgICAgIHNlbGVjdCA9ICQoc2VsZWN0KTtcbiAgICAgICAgICAgIGlmIChzZWxlY3RbMF0gPT09IGVsZW1lbnRbMF0pIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkVmFsdWUgPSBzZWxlY3QudmFsKCk7XG4gICAgICAgICAgICBzZWxlY3QuZGF0YSgnZHVtbXlDaGFuZ2UnLCB0cnVlKTtcblxuICAgICAgICAgICAgaWYgKHNlbGVjdC5nZXQoMCkuc2VsZWN0aXplKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0aXplID0gc2VsZWN0LmRhdGEoJ3NlbGVjdGl6ZScpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGl6ZSkge1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RpemUuY2xlYXJPcHRpb25zKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGl6ZS5hZGRPcHRpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBzZWxlY3RlZFZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IERhdGFbaG9sZGVyXS5vcmlnaW5hbFtzZWxlY3RlZFZhbHVlXSB8fCBzZWxlY3RlZFZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGZvckluKERhdGFbaG9sZGVyXS5zdGF0ZSwgKHYsIGspID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGl6ZS5hZGRPcHRpb24oeyB2YWx1ZTogaywgdGV4dDogdiB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aXplLnNldFZhbHVlKHNlbGVjdGVkVmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0LmVtcHR5KCk7XG4gICAgICAgICAgICAgICAgZm9ySW4oRGF0YVtob2xkZXJdLnN0YXRlLCAodiwgaykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IGsgPT09IHNlbGVjdGVkVmFsdWUgPyAnc2VsZWN0ZWQ9XCJzZWxlY3RlZFwiJyA6ICcnO1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3QuYXBwZW5kKGA8b3B0aW9uIHZhbHVlPVwiJHtrfVwiICR7c2VsZWN0ZWR9PiR7dn08L29wdGlvbj5gKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2VsZWN0LmRhdGEoJ2R1bW15Q2hhbmdlJywgZmFsc2UpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbmV4cG9ydCBsZXQgSW5zdGFuY2UgPSBuZXcgU2VsZWN0VW5pcXVlRmllbGQoKTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./app/forms/fields/selectunique.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ SelectUniqueField),\n/* harmony export */ \"Instance\": () => (/* binding */ Instance)\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var mout_object_forIn__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! mout/object/forIn */ \"./node_modules/mout/object/forIn.js\");\n/* harmony import */ var mout_object_forIn__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(mout_object_forIn__WEBPACK_IMPORTED_MODULE_1__);\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n // import { config } from 'grav-config';\n\nvar Data = {};\n\nvar SelectUniqueField = /*#__PURE__*/function () {\n function SelectUniqueField(options) {\n var _this = this;\n\n _classCallCheck(this, SelectUniqueField);\n\n var body = jquery__WEBPACK_IMPORTED_MODULE_0___default()('body');\n this.items = jquery__WEBPACK_IMPORTED_MODULE_0___default()();\n this.options = Object.assign({}, this.defaults, options);\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-select-observe]').each(function (index, element) {\n return _this.addSelect(element);\n }).last().trigger('change', {\n load: true\n });\n body.on('mutation._grav', this._onAddedNodes.bind(this));\n body.on('mutation_removed._grav', this._onRemovedNodes.bind(this));\n }\n\n _createClass(SelectUniqueField, [{\n key: \"_onAddedNodes\",\n value: function _onAddedNodes(event, target, record, instance) {\n var _this2 = this;\n\n var fields = jquery__WEBPACK_IMPORTED_MODULE_0___default()(target).find('[data-select-observe]');\n\n if (!fields.length) {\n return;\n }\n\n fields.each(function (index, field) {\n field = jquery__WEBPACK_IMPORTED_MODULE_0___default()(field);\n\n if (!~_this2.items.index(field)) {\n _this2.addSelect(field);\n }\n });\n }\n }, {\n key: \"_onRemovedNodes\",\n value: function _onRemovedNodes(event, data\n /* , instance */\n ) {\n var _this3 = this;\n\n var target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(data.target);\n var holder = target.data('collectionHolder');\n\n if (!holder) {\n return false;\n }\n\n var node = jquery__WEBPACK_IMPORTED_MODULE_0___default()(data.mutation.removedNodes);\n var value = node.find('[data-select-observe]').val();\n\n if (value) {\n Data[holder].state[value] = value;\n }\n\n target.find('[data-select-observe]').each(function (index, field) {\n field = jquery__WEBPACK_IMPORTED_MODULE_0___default()(field);\n\n if (field.val() !== value) {\n _this3.updateOptions(field);\n }\n });\n }\n }, {\n key: \"addSelect\",\n value: function addSelect(element) {\n var _this4 = this;\n\n this.items = this.items.add(element);\n element = jquery__WEBPACK_IMPORTED_MODULE_0___default()(element);\n var value = element.attr('value');\n var holder = element.closest('[data-collection-holder]').data('collectionHolder');\n var options = element.closest('[data-select-unique]').data('selectUnique');\n\n if (!Data[holder]) {\n var data = {};\n\n if (Array.isArray(options)) {\n options.slice(0).map(function (item) {\n data[item] = item;\n });\n } else {\n data = Object.assign({}, options);\n }\n\n Data[holder] = {\n original: null,\n state: null\n };\n Data[holder].original = Object.assign({}, data);\n Data[holder].state = Object.assign({}, data);\n }\n\n this.updateOptions(element);\n element.data('originalValue', value);\n element.on('change', function (event, extras) {\n var target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.currentTarget);\n\n if (target.data('dummyChange')) {\n target.data('dummyChange', false);\n return false;\n }\n\n _this4.refreshOptions(target, extras && extras.load ? null : element.data('originalValue'));\n\n element.data('originalValue', target.val());\n });\n }\n }, {\n key: \"updateOptions\",\n value: function updateOptions(element) {\n element = jquery__WEBPACK_IMPORTED_MODULE_0___default()(element);\n var value = element.attr('value');\n var holder = element.closest('[data-collection-holder]').data('collectionHolder');\n mout_object_forIn__WEBPACK_IMPORTED_MODULE_1___default()(Data[holder].state, function (v, k) {\n var selected = k === value ? 'selected=\"selected\"' : '';\n\n if (element.get(0).selectize) {\n var selectize = element.data('selectize');\n selectize.removeOption(k);\n selectize.addOption({\n value: k,\n text: v\n });\n } else {\n element.append(\"\"));\n }\n\n if (selected) {\n if (element.get(0).selectize) {\n var _selectize = element.data('selectize');\n\n _selectize.setValue(k);\n }\n\n delete Data[holder].state[value];\n }\n });\n }\n }, {\n key: \"refreshOptions\",\n value: function refreshOptions(element, originalValue) {\n var value = element.val();\n var holder = element.closest('[data-collection-holder]').data('collectionHolder');\n delete Data[holder].state[value];\n\n if (originalValue && Data[holder].original[originalValue]) {\n Data[holder].state[originalValue] = Data[holder].original[originalValue];\n }\n\n this.items.each(function (index, select) {\n select = jquery__WEBPACK_IMPORTED_MODULE_0___default()(select);\n\n if (select[0] === element[0]) {\n return;\n }\n\n var selectedValue = select.val();\n select.data('dummyChange', true);\n\n if (select.get(0).selectize) {\n var selectize = select.data('selectize');\n\n if (selectize) {\n selectize.clearOptions();\n\n if (selectedValue) {\n selectize.addOption({\n value: selectedValue,\n text: Data[holder].original[selectedValue] || selectedValue\n });\n }\n\n mout_object_forIn__WEBPACK_IMPORTED_MODULE_1___default()(Data[holder].state, function (v, k) {\n selectize.addOption({\n value: k,\n text: v\n });\n });\n selectize.setValue(selectedValue, true);\n }\n } else {\n select.empty();\n mout_object_forIn__WEBPACK_IMPORTED_MODULE_1___default()(Data[holder].state, function (v, k) {\n var selected = k === selectedValue ? 'selected=\"selected\"' : '';\n select.append(\"\"));\n });\n }\n\n select.data('dummyChange', false);\n });\n }\n }]);\n\n return SelectUniqueField;\n}();\n\n\nvar Instance = new SelectUniqueField();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL2Zvcm1zL2ZpZWxkcy9zZWxlY3R1bmlxdWUuanM/MjA0OSJdLCJuYW1lcyI6WyJEYXRhIiwiU2VsZWN0VW5pcXVlRmllbGQiLCJvcHRpb25zIiwiYm9keSIsIiQiLCJpdGVtcyIsIk9iamVjdCIsImFzc2lnbiIsImRlZmF1bHRzIiwiZWFjaCIsImluZGV4IiwiZWxlbWVudCIsImFkZFNlbGVjdCIsImxhc3QiLCJ0cmlnZ2VyIiwibG9hZCIsIm9uIiwiX29uQWRkZWROb2RlcyIsImJpbmQiLCJfb25SZW1vdmVkTm9kZXMiLCJldmVudCIsInRhcmdldCIsInJlY29yZCIsImluc3RhbmNlIiwiZmllbGRzIiwiZmluZCIsImxlbmd0aCIsImZpZWxkIiwiZGF0YSIsImhvbGRlciIsIm5vZGUiLCJtdXRhdGlvbiIsInJlbW92ZWROb2RlcyIsInZhbHVlIiwidmFsIiwic3RhdGUiLCJ1cGRhdGVPcHRpb25zIiwiYWRkIiwiYXR0ciIsImNsb3Nlc3QiLCJBcnJheSIsImlzQXJyYXkiLCJzbGljZSIsIm1hcCIsIml0ZW0iLCJvcmlnaW5hbCIsImV4dHJhcyIsImN1cnJlbnRUYXJnZXQiLCJyZWZyZXNoT3B0aW9ucyIsImZvckluIiwidiIsImsiLCJzZWxlY3RlZCIsImdldCIsInNlbGVjdGl6ZSIsInJlbW92ZU9wdGlvbiIsImFkZE9wdGlvbiIsInRleHQiLCJhcHBlbmQiLCJzZXRWYWx1ZSIsIm9yaWdpbmFsVmFsdWUiLCJzZWxlY3QiLCJzZWxlY3RlZFZhbHVlIiwiY2xlYXJPcHRpb25zIiwiZW1wdHkiLCJJbnN0YW5jZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7Q0FFQTs7QUFFQSxJQUFNQSxJQUFJLEdBQUcsRUFBYjs7SUFDcUJDLGlCO0FBRWpCLDZCQUFZQyxPQUFaLEVBQXFCO0FBQUE7O0FBQUE7O0FBQ2pCLFFBQU1DLElBQUksR0FBR0MsNkNBQUMsQ0FBQyxNQUFELENBQWQ7QUFDQSxTQUFLQyxLQUFMLEdBQWFELDZDQUFDLEVBQWQ7QUFDQSxTQUFLRixPQUFMLEdBQWVJLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjLEVBQWQsRUFBa0IsS0FBS0MsUUFBdkIsRUFBaUNOLE9BQWpDLENBQWY7QUFFQUUsaURBQUMsQ0FBQyx1QkFBRCxDQUFELENBQTJCSyxJQUEzQixDQUFnQyxVQUFDQyxLQUFELEVBQVFDLE9BQVI7QUFBQSxhQUFvQixLQUFJLENBQUNDLFNBQUwsQ0FBZUQsT0FBZixDQUFwQjtBQUFBLEtBQWhDLEVBQTZFRSxJQUE3RSxHQUFvRkMsT0FBcEYsQ0FBNEYsUUFBNUYsRUFBc0c7QUFBRUMsVUFBSSxFQUFFO0FBQVIsS0FBdEc7QUFDQVosUUFBSSxDQUFDYSxFQUFMLENBQVEsZ0JBQVIsRUFBMEIsS0FBS0MsYUFBTCxDQUFtQkMsSUFBbkIsQ0FBd0IsSUFBeEIsQ0FBMUI7QUFDQWYsUUFBSSxDQUFDYSxFQUFMLENBQVEsd0JBQVIsRUFBa0MsS0FBS0csZUFBTCxDQUFxQkQsSUFBckIsQ0FBMEIsSUFBMUIsQ0FBbEM7QUFDSDs7OztXQUVELHVCQUFjRSxLQUFkLEVBQXFCQyxNQUFyQixFQUE2QkMsTUFBN0IsRUFBcUNDLFFBQXJDLEVBQStDO0FBQUE7O0FBQzNDLFVBQUlDLE1BQU0sR0FBR3BCLDZDQUFDLENBQUNpQixNQUFELENBQUQsQ0FBVUksSUFBVixDQUFlLHVCQUFmLENBQWI7O0FBQ0EsVUFBSSxDQUFDRCxNQUFNLENBQUNFLE1BQVosRUFBb0I7QUFBRTtBQUFTOztBQUUvQkYsWUFBTSxDQUFDZixJQUFQLENBQVksVUFBQ0MsS0FBRCxFQUFRaUIsS0FBUixFQUFrQjtBQUMxQkEsYUFBSyxHQUFHdkIsNkNBQUMsQ0FBQ3VCLEtBQUQsQ0FBVDs7QUFDQSxZQUFJLENBQUMsQ0FBQyxNQUFJLENBQUN0QixLQUFMLENBQVdLLEtBQVgsQ0FBaUJpQixLQUFqQixDQUFOLEVBQStCO0FBQzNCLGdCQUFJLENBQUNmLFNBQUwsQ0FBZWUsS0FBZjtBQUNIO0FBQ0osT0FMRDtBQU1IOzs7V0FFRCx5QkFBZ0JQLEtBQWhCLEVBQXVCUTtBQUFJO0FBQTNCLE1BQTZDO0FBQUE7O0FBQ3pDLFVBQU1QLE1BQU0sR0FBR2pCLDZDQUFDLENBQUN3QixJQUFJLENBQUNQLE1BQU4sQ0FBaEI7QUFDQSxVQUFNUSxNQUFNLEdBQUdSLE1BQU0sQ0FBQ08sSUFBUCxDQUFZLGtCQUFaLENBQWY7O0FBQ0EsVUFBSSxDQUFDQyxNQUFMLEVBQWE7QUFBRSxlQUFPLEtBQVA7QUFBZTs7QUFFOUIsVUFBTUMsSUFBSSxHQUFHMUIsNkNBQUMsQ0FBQ3dCLElBQUksQ0FBQ0csUUFBTCxDQUFjQyxZQUFmLENBQWQ7QUFDQSxVQUFNQyxLQUFLLEdBQUdILElBQUksQ0FBQ0wsSUFBTCxDQUFVLHVCQUFWLEVBQW1DUyxHQUFuQyxFQUFkOztBQUNBLFVBQUlELEtBQUosRUFBVztBQUNQakMsWUFBSSxDQUFDNkIsTUFBRCxDQUFKLENBQWFNLEtBQWIsQ0FBbUJGLEtBQW5CLElBQTRCQSxLQUE1QjtBQUNIOztBQUVEWixZQUFNLENBQUNJLElBQVAsQ0FBWSx1QkFBWixFQUFxQ2hCLElBQXJDLENBQTBDLFVBQUNDLEtBQUQsRUFBUWlCLEtBQVIsRUFBa0I7QUFDeERBLGFBQUssR0FBR3ZCLDZDQUFDLENBQUN1QixLQUFELENBQVQ7O0FBRUEsWUFBSUEsS0FBSyxDQUFDTyxHQUFOLE9BQWdCRCxLQUFwQixFQUEyQjtBQUN2QixnQkFBSSxDQUFDRyxhQUFMLENBQW1CVCxLQUFuQjtBQUNIO0FBQ0osT0FORDtBQU9IOzs7V0FFRCxtQkFBVWhCLE9BQVYsRUFBbUI7QUFBQTs7QUFDZixXQUFLTixLQUFMLEdBQWEsS0FBS0EsS0FBTCxDQUFXZ0MsR0FBWCxDQUFlMUIsT0FBZixDQUFiO0FBQ0FBLGFBQU8sR0FBR1AsNkNBQUMsQ0FBQ08sT0FBRCxDQUFYO0FBRUEsVUFBTXNCLEtBQUssR0FBR3RCLE9BQU8sQ0FBQzJCLElBQVIsQ0FBYSxPQUFiLENBQWQ7QUFDQSxVQUFNVCxNQUFNLEdBQUdsQixPQUFPLENBQUM0QixPQUFSLENBQWdCLDBCQUFoQixFQUE0Q1gsSUFBNUMsQ0FBaUQsa0JBQWpELENBQWY7QUFDQSxVQUFNMUIsT0FBTyxHQUFHUyxPQUFPLENBQUM0QixPQUFSLENBQWdCLHNCQUFoQixFQUF3Q1gsSUFBeEMsQ0FBNkMsY0FBN0MsQ0FBaEI7O0FBRUEsVUFBSSxDQUFDNUIsSUFBSSxDQUFDNkIsTUFBRCxDQUFULEVBQW1CO0FBQ2YsWUFBSUQsSUFBSSxHQUFHLEVBQVg7O0FBQ0EsWUFBSVksS0FBSyxDQUFDQyxPQUFOLENBQWN2QyxPQUFkLENBQUosRUFBNEI7QUFDeEJBLGlCQUFPLENBQUN3QyxLQUFSLENBQWMsQ0FBZCxFQUFpQkMsR0FBakIsQ0FBcUIsVUFBQ0MsSUFBRCxFQUFVO0FBQUVoQixnQkFBSSxDQUFDZ0IsSUFBRCxDQUFKLEdBQWFBLElBQWI7QUFBb0IsV0FBckQ7QUFDSCxTQUZELE1BRU87QUFDSGhCLGNBQUksR0FBR3RCLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjLEVBQWQsRUFBa0JMLE9BQWxCLENBQVA7QUFDSDs7QUFFREYsWUFBSSxDQUFDNkIsTUFBRCxDQUFKLEdBQWU7QUFBRWdCLGtCQUFRLEVBQUUsSUFBWjtBQUFrQlYsZUFBSyxFQUFFO0FBQXpCLFNBQWY7QUFDQW5DLFlBQUksQ0FBQzZCLE1BQUQsQ0FBSixDQUFhZ0IsUUFBYixHQUF3QnZDLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjLEVBQWQsRUFBa0JxQixJQUFsQixDQUF4QjtBQUNBNUIsWUFBSSxDQUFDNkIsTUFBRCxDQUFKLENBQWFNLEtBQWIsR0FBcUI3QixNQUFNLENBQUNDLE1BQVAsQ0FBYyxFQUFkLEVBQWtCcUIsSUFBbEIsQ0FBckI7QUFDSDs7QUFFRCxXQUFLUSxhQUFMLENBQW1CekIsT0FBbkI7QUFFQUEsYUFBTyxDQUFDaUIsSUFBUixDQUFhLGVBQWIsRUFBOEJLLEtBQTlCO0FBQ0F0QixhQUFPLENBQUNLLEVBQVIsQ0FBVyxRQUFYLEVBQXFCLFVBQUNJLEtBQUQsRUFBUTBCLE1BQVIsRUFBbUI7QUFDcEMsWUFBTXpCLE1BQU0sR0FBR2pCLDZDQUFDLENBQUNnQixLQUFLLENBQUMyQixhQUFQLENBQWhCOztBQUNBLFlBQUkxQixNQUFNLENBQUNPLElBQVAsQ0FBWSxhQUFaLENBQUosRUFBZ0M7QUFDNUJQLGdCQUFNLENBQUNPLElBQVAsQ0FBWSxhQUFaLEVBQTJCLEtBQTNCO0FBQ0EsaUJBQU8sS0FBUDtBQUNIOztBQUVELGNBQUksQ0FBQ29CLGNBQUwsQ0FBb0IzQixNQUFwQixFQUE0QnlCLE1BQU0sSUFBSUEsTUFBTSxDQUFDL0IsSUFBakIsR0FBd0IsSUFBeEIsR0FBK0JKLE9BQU8sQ0FBQ2lCLElBQVIsQ0FBYSxlQUFiLENBQTNEOztBQUNBakIsZUFBTyxDQUFDaUIsSUFBUixDQUFhLGVBQWIsRUFBOEJQLE1BQU0sQ0FBQ2EsR0FBUCxFQUE5QjtBQUNILE9BVEQ7QUFVSDs7O1dBRUQsdUJBQWN2QixPQUFkLEVBQXVCO0FBQ25CQSxhQUFPLEdBQUdQLDZDQUFDLENBQUNPLE9BQUQsQ0FBWDtBQUNBLFVBQU1zQixLQUFLLEdBQUd0QixPQUFPLENBQUMyQixJQUFSLENBQWEsT0FBYixDQUFkO0FBQ0EsVUFBTVQsTUFBTSxHQUFHbEIsT0FBTyxDQUFDNEIsT0FBUixDQUFnQiwwQkFBaEIsRUFBNENYLElBQTVDLENBQWlELGtCQUFqRCxDQUFmO0FBRUFxQiw4REFBSyxDQUFDakQsSUFBSSxDQUFDNkIsTUFBRCxDQUFKLENBQWFNLEtBQWQsRUFBcUIsVUFBQ2UsQ0FBRCxFQUFJQyxDQUFKLEVBQVU7QUFDaEMsWUFBTUMsUUFBUSxHQUFHRCxDQUFDLEtBQUtsQixLQUFOLEdBQWMscUJBQWQsR0FBc0MsRUFBdkQ7O0FBRUEsWUFBSXRCLE9BQU8sQ0FBQzBDLEdBQVIsQ0FBWSxDQUFaLEVBQWVDLFNBQW5CLEVBQThCO0FBQzFCLGNBQU1BLFNBQVMsR0FBRzNDLE9BQU8sQ0FBQ2lCLElBQVIsQ0FBYSxXQUFiLENBQWxCO0FBQ0EwQixtQkFBUyxDQUFDQyxZQUFWLENBQXVCSixDQUF2QjtBQUNBRyxtQkFBUyxDQUFDRSxTQUFWLENBQW9CO0FBQUV2QixpQkFBSyxFQUFFa0IsQ0FBVDtBQUFZTSxnQkFBSSxFQUFFUDtBQUFsQixXQUFwQjtBQUNILFNBSkQsTUFJTztBQUNIdkMsaUJBQU8sQ0FBQytDLE1BQVIsMkJBQWlDUCxDQUFqQyxnQkFBdUNDLFFBQXZDLGNBQW1ERixDQUFuRDtBQUNIOztBQUVELFlBQUlFLFFBQUosRUFBYztBQUNWLGNBQUl6QyxPQUFPLENBQUMwQyxHQUFSLENBQVksQ0FBWixFQUFlQyxTQUFuQixFQUE4QjtBQUMxQixnQkFBTUEsVUFBUyxHQUFHM0MsT0FBTyxDQUFDaUIsSUFBUixDQUFhLFdBQWIsQ0FBbEI7O0FBQ0EwQixzQkFBUyxDQUFDSyxRQUFWLENBQW1CUixDQUFuQjtBQUNIOztBQUNELGlCQUFPbkQsSUFBSSxDQUFDNkIsTUFBRCxDQUFKLENBQWFNLEtBQWIsQ0FBbUJGLEtBQW5CLENBQVA7QUFDSDtBQUNKLE9BbEJJLENBQUw7QUFtQkg7OztXQUVELHdCQUFldEIsT0FBZixFQUF3QmlELGFBQXhCLEVBQXVDO0FBQ25DLFVBQU0zQixLQUFLLEdBQUd0QixPQUFPLENBQUN1QixHQUFSLEVBQWQ7QUFDQSxVQUFNTCxNQUFNLEdBQUdsQixPQUFPLENBQUM0QixPQUFSLENBQWdCLDBCQUFoQixFQUE0Q1gsSUFBNUMsQ0FBaUQsa0JBQWpELENBQWY7QUFDQSxhQUFPNUIsSUFBSSxDQUFDNkIsTUFBRCxDQUFKLENBQWFNLEtBQWIsQ0FBbUJGLEtBQW5CLENBQVA7O0FBRUEsVUFBSTJCLGFBQWEsSUFBSTVELElBQUksQ0FBQzZCLE1BQUQsQ0FBSixDQUFhZ0IsUUFBYixDQUFzQmUsYUFBdEIsQ0FBckIsRUFBMkQ7QUFDdkQ1RCxZQUFJLENBQUM2QixNQUFELENBQUosQ0FBYU0sS0FBYixDQUFtQnlCLGFBQW5CLElBQW9DNUQsSUFBSSxDQUFDNkIsTUFBRCxDQUFKLENBQWFnQixRQUFiLENBQXNCZSxhQUF0QixDQUFwQztBQUNIOztBQUVELFdBQUt2RCxLQUFMLENBQVdJLElBQVgsQ0FBZ0IsVUFBQ0MsS0FBRCxFQUFRbUQsTUFBUixFQUFtQjtBQUMvQkEsY0FBTSxHQUFHekQsNkNBQUMsQ0FBQ3lELE1BQUQsQ0FBVjs7QUFDQSxZQUFJQSxNQUFNLENBQUMsQ0FBRCxDQUFOLEtBQWNsRCxPQUFPLENBQUMsQ0FBRCxDQUF6QixFQUE4QjtBQUFFO0FBQVM7O0FBRXpDLFlBQU1tRCxhQUFhLEdBQUdELE1BQU0sQ0FBQzNCLEdBQVAsRUFBdEI7QUFDQTJCLGNBQU0sQ0FBQ2pDLElBQVAsQ0FBWSxhQUFaLEVBQTJCLElBQTNCOztBQUVBLFlBQUlpQyxNQUFNLENBQUNSLEdBQVAsQ0FBVyxDQUFYLEVBQWNDLFNBQWxCLEVBQTZCO0FBQ3pCLGNBQU1BLFNBQVMsR0FBR08sTUFBTSxDQUFDakMsSUFBUCxDQUFZLFdBQVosQ0FBbEI7O0FBRUEsY0FBSTBCLFNBQUosRUFBZTtBQUNYQSxxQkFBUyxDQUFDUyxZQUFWOztBQUVBLGdCQUFJRCxhQUFKLEVBQW1CO0FBQ2ZSLHVCQUFTLENBQUNFLFNBQVYsQ0FBb0I7QUFDaEJ2QixxQkFBSyxFQUFFNkIsYUFEUztBQUVoQkwsb0JBQUksRUFBRXpELElBQUksQ0FBQzZCLE1BQUQsQ0FBSixDQUFhZ0IsUUFBYixDQUFzQmlCLGFBQXRCLEtBQXdDQTtBQUY5QixlQUFwQjtBQUlIOztBQUVEYixvRUFBSyxDQUFDakQsSUFBSSxDQUFDNkIsTUFBRCxDQUFKLENBQWFNLEtBQWQsRUFBcUIsVUFBQ2UsQ0FBRCxFQUFJQyxDQUFKLEVBQVU7QUFDaENHLHVCQUFTLENBQUNFLFNBQVYsQ0FBb0I7QUFBRXZCLHFCQUFLLEVBQUVrQixDQUFUO0FBQVlNLG9CQUFJLEVBQUVQO0FBQWxCLGVBQXBCO0FBQ0gsYUFGSSxDQUFMO0FBSUFJLHFCQUFTLENBQUNLLFFBQVYsQ0FBbUJHLGFBQW5CLEVBQWtDLElBQWxDO0FBQ0g7QUFDSixTQW5CRCxNQW1CTztBQUNIRCxnQkFBTSxDQUFDRyxLQUFQO0FBQ0FmLGtFQUFLLENBQUNqRCxJQUFJLENBQUM2QixNQUFELENBQUosQ0FBYU0sS0FBZCxFQUFxQixVQUFDZSxDQUFELEVBQUlDLENBQUosRUFBVTtBQUNoQyxnQkFBTUMsUUFBUSxHQUFHRCxDQUFDLEtBQUtXLGFBQU4sR0FBc0IscUJBQXRCLEdBQThDLEVBQS9EO0FBQ0FELGtCQUFNLENBQUNILE1BQVAsMkJBQWdDUCxDQUFoQyxnQkFBc0NDLFFBQXRDLGNBQWtERixDQUFsRDtBQUNILFdBSEksQ0FBTDtBQUlIOztBQUVEVyxjQUFNLENBQUNqQyxJQUFQLENBQVksYUFBWixFQUEyQixLQUEzQjtBQUNILE9BbkNEO0FBb0NIOzs7Ozs7O0FBR0UsSUFBSXFDLFFBQVEsR0FBRyxJQUFJaEUsaUJBQUosRUFBZiIsImZpbGUiOiIuL2FwcC9mb3Jtcy9maWVsZHMvc2VsZWN0dW5pcXVlLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCBmb3JJbiBmcm9tICdtb3V0L29iamVjdC9mb3JJbic7XG4vLyBpbXBvcnQgeyBjb25maWcgfSBmcm9tICdncmF2LWNvbmZpZyc7XG5cbmNvbnN0IERhdGEgPSB7fTtcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlbGVjdFVuaXF1ZUZpZWxkIHtcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgYm9keSA9ICQoJ2JvZHknKTtcbiAgICAgICAgdGhpcy5pdGVtcyA9ICQoKTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5kZWZhdWx0cywgb3B0aW9ucyk7XG5cbiAgICAgICAgJCgnW2RhdGEtc2VsZWN0LW9ic2VydmVdJykuZWFjaCgoaW5kZXgsIGVsZW1lbnQpID0+IHRoaXMuYWRkU2VsZWN0KGVsZW1lbnQpKS5sYXN0KCkudHJpZ2dlcignY2hhbmdlJywgeyBsb2FkOiB0cnVlIH0pO1xuICAgICAgICBib2R5Lm9uKCdtdXRhdGlvbi5fZ3JhdicsIHRoaXMuX29uQWRkZWROb2Rlcy5iaW5kKHRoaXMpKTtcbiAgICAgICAgYm9keS5vbignbXV0YXRpb25fcmVtb3ZlZC5fZ3JhdicsIHRoaXMuX29uUmVtb3ZlZE5vZGVzLmJpbmQodGhpcykpO1xuICAgIH1cblxuICAgIF9vbkFkZGVkTm9kZXMoZXZlbnQsIHRhcmdldCwgcmVjb3JkLCBpbnN0YW5jZSkge1xuICAgICAgICBsZXQgZmllbGRzID0gJCh0YXJnZXQpLmZpbmQoJ1tkYXRhLXNlbGVjdC1vYnNlcnZlXScpO1xuICAgICAgICBpZiAoIWZpZWxkcy5sZW5ndGgpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgZmllbGRzLmVhY2goKGluZGV4LCBmaWVsZCkgPT4ge1xuICAgICAgICAgICAgZmllbGQgPSAkKGZpZWxkKTtcbiAgICAgICAgICAgIGlmICghfnRoaXMuaXRlbXMuaW5kZXgoZmllbGQpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTZWxlY3QoZmllbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfb25SZW1vdmVkTm9kZXMoZXZlbnQsIGRhdGEvKiAsIGluc3RhbmNlICovKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9ICQoZGF0YS50YXJnZXQpO1xuICAgICAgICBjb25zdCBob2xkZXIgPSB0YXJnZXQuZGF0YSgnY29sbGVjdGlvbkhvbGRlcicpO1xuICAgICAgICBpZiAoIWhvbGRlcikgeyByZXR1cm4gZmFsc2U7IH1cblxuICAgICAgICBjb25zdCBub2RlID0gJChkYXRhLm11dGF0aW9uLnJlbW92ZWROb2Rlcyk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gbm9kZS5maW5kKCdbZGF0YS1zZWxlY3Qtb2JzZXJ2ZV0nKS52YWwoKTtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICBEYXRhW2hvbGRlcl0uc3RhdGVbdmFsdWVdID0gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICB0YXJnZXQuZmluZCgnW2RhdGEtc2VsZWN0LW9ic2VydmVdJykuZWFjaCgoaW5kZXgsIGZpZWxkKSA9PiB7XG4gICAgICAgICAgICBmaWVsZCA9ICQoZmllbGQpO1xuXG4gICAgICAgICAgICBpZiAoZmllbGQudmFsKCkgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVPcHRpb25zKGZpZWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYWRkU2VsZWN0KGVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5pdGVtcyA9IHRoaXMuaXRlbXMuYWRkKGVsZW1lbnQpO1xuICAgICAgICBlbGVtZW50ID0gJChlbGVtZW50KTtcblxuICAgICAgICBjb25zdCB2YWx1ZSA9IGVsZW1lbnQuYXR0cigndmFsdWUnKTtcbiAgICAgICAgY29uc3QgaG9sZGVyID0gZWxlbWVudC5jbG9zZXN0KCdbZGF0YS1jb2xsZWN0aW9uLWhvbGRlcl0nKS5kYXRhKCdjb2xsZWN0aW9uSG9sZGVyJyk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBlbGVtZW50LmNsb3Nlc3QoJ1tkYXRhLXNlbGVjdC11bmlxdWVdJykuZGF0YSgnc2VsZWN0VW5pcXVlJyk7XG5cbiAgICAgICAgaWYgKCFEYXRhW2hvbGRlcl0pIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0ge307XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zKSkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuc2xpY2UoMCkubWFwKChpdGVtKSA9PiB7IGRhdGFbaXRlbV0gPSBpdGVtOyB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBEYXRhW2hvbGRlcl0gPSB7IG9yaWdpbmFsOiBudWxsLCBzdGF0ZTogbnVsbCB9O1xuICAgICAgICAgICAgRGF0YVtob2xkZXJdLm9yaWdpbmFsID0gT2JqZWN0LmFzc2lnbih7fSwgZGF0YSk7XG4gICAgICAgICAgICBEYXRhW2hvbGRlcl0uc3RhdGUgPSBPYmplY3QuYXNzaWduKHt9LCBkYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlT3B0aW9ucyhlbGVtZW50KTtcblxuICAgICAgICBlbGVtZW50LmRhdGEoJ29yaWdpbmFsVmFsdWUnLCB2YWx1ZSk7XG4gICAgICAgIGVsZW1lbnQub24oJ2NoYW5nZScsIChldmVudCwgZXh0cmFzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpO1xuICAgICAgICAgICAgaWYgKHRhcmdldC5kYXRhKCdkdW1teUNoYW5nZScpKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0LmRhdGEoJ2R1bW15Q2hhbmdlJywgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoT3B0aW9ucyh0YXJnZXQsIGV4dHJhcyAmJiBleHRyYXMubG9hZCA/IG51bGwgOiBlbGVtZW50LmRhdGEoJ29yaWdpbmFsVmFsdWUnKSk7XG4gICAgICAgICAgICBlbGVtZW50LmRhdGEoJ29yaWdpbmFsVmFsdWUnLCB0YXJnZXQudmFsKCkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB1cGRhdGVPcHRpb25zKGVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZWxlbWVudC5hdHRyKCd2YWx1ZScpO1xuICAgICAgICBjb25zdCBob2xkZXIgPSBlbGVtZW50LmNsb3Nlc3QoJ1tkYXRhLWNvbGxlY3Rpb24taG9sZGVyXScpLmRhdGEoJ2NvbGxlY3Rpb25Ib2xkZXInKTtcblxuICAgICAgICBmb3JJbihEYXRhW2hvbGRlcl0uc3RhdGUsICh2LCBrKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IGsgPT09IHZhbHVlID8gJ3NlbGVjdGVkPVwic2VsZWN0ZWRcIicgOiAnJztcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0KDApLnNlbGVjdGl6ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGl6ZSA9IGVsZW1lbnQuZGF0YSgnc2VsZWN0aXplJyk7XG4gICAgICAgICAgICAgICAgc2VsZWN0aXplLnJlbW92ZU9wdGlvbihrKTtcbiAgICAgICAgICAgICAgICBzZWxlY3RpemUuYWRkT3B0aW9uKHsgdmFsdWU6IGssIHRleHQ6IHYgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuYXBwZW5kKGA8b3B0aW9uIHZhbHVlPVwiJHtrfVwiICR7c2VsZWN0ZWR9PiR7dn08L29wdGlvbj5gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0KDApLnNlbGVjdGl6ZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RpemUgPSBlbGVtZW50LmRhdGEoJ3NlbGVjdGl6ZScpO1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RpemUuc2V0VmFsdWUoayk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlbGV0ZSBEYXRhW2hvbGRlcl0uc3RhdGVbdmFsdWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZWZyZXNoT3B0aW9ucyhlbGVtZW50LCBvcmlnaW5hbFZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZWxlbWVudC52YWwoKTtcbiAgICAgICAgY29uc3QgaG9sZGVyID0gZWxlbWVudC5jbG9zZXN0KCdbZGF0YS1jb2xsZWN0aW9uLWhvbGRlcl0nKS5kYXRhKCdjb2xsZWN0aW9uSG9sZGVyJyk7XG4gICAgICAgIGRlbGV0ZSBEYXRhW2hvbGRlcl0uc3RhdGVbdmFsdWVdO1xuXG4gICAgICAgIGlmIChvcmlnaW5hbFZhbHVlICYmIERhdGFbaG9sZGVyXS5vcmlnaW5hbFtvcmlnaW5hbFZhbHVlXSkge1xuICAgICAgICAgICAgRGF0YVtob2xkZXJdLnN0YXRlW29yaWdpbmFsVmFsdWVdID0gRGF0YVtob2xkZXJdLm9yaWdpbmFsW29yaWdpbmFsVmFsdWVdO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pdGVtcy5lYWNoKChpbmRleCwgc2VsZWN0KSA9PiB7XG4gICAgICAgICAgICBzZWxlY3QgPSAkKHNlbGVjdCk7XG4gICAgICAgICAgICBpZiAoc2VsZWN0WzBdID09PSBlbGVtZW50WzBdKSB7IHJldHVybjsgfVxuXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZFZhbHVlID0gc2VsZWN0LnZhbCgpO1xuICAgICAgICAgICAgc2VsZWN0LmRhdGEoJ2R1bW15Q2hhbmdlJywgdHJ1ZSk7XG5cbiAgICAgICAgICAgIGlmIChzZWxlY3QuZ2V0KDApLnNlbGVjdGl6ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGl6ZSA9IHNlbGVjdC5kYXRhKCdzZWxlY3RpemUnKTtcblxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aXplLmNsZWFyT3B0aW9ucygpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RpemUuYWRkT3B0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc2VsZWN0ZWRWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBEYXRhW2hvbGRlcl0ub3JpZ2luYWxbc2VsZWN0ZWRWYWx1ZV0gfHwgc2VsZWN0ZWRWYWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBmb3JJbihEYXRhW2hvbGRlcl0uc3RhdGUsICh2LCBrKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RpemUuYWRkT3B0aW9uKHsgdmFsdWU6IGssIHRleHQ6IHYgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGl6ZS5zZXRWYWx1ZShzZWxlY3RlZFZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNlbGVjdC5lbXB0eSgpO1xuICAgICAgICAgICAgICAgIGZvckluKERhdGFbaG9sZGVyXS5zdGF0ZSwgKHYsIGspID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBrID09PSBzZWxlY3RlZFZhbHVlID8gJ3NlbGVjdGVkPVwic2VsZWN0ZWRcIicgOiAnJztcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0LmFwcGVuZChgPG9wdGlvbiB2YWx1ZT1cIiR7a31cIiAke3NlbGVjdGVkfT4ke3Z9PC9vcHRpb24+YCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNlbGVjdC5kYXRhKCdkdW1teUNoYW5nZScsIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5leHBvcnQgbGV0IEluc3RhbmNlID0gbmV3IFNlbGVjdFVuaXF1ZUZpZWxkKCk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./app/forms/fields/selectunique.js\n"); /***/ }), /***/ "./app/forms/fields/text.js": -/*!**********************************!* +/*!**********************************!*\ !*** ./app/forms/fields/text.js ***! \**********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { @@ -286,95 +297,95 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var jque /***/ }), /***/ "./app/forms/form.js": -/*!***************************!* +/*!***************************!*\ !*** ./app/forms/form.js ***! \***************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => /* binding */ Form,\n/* harmony export */ \"Instance\": () => /* binding */ Instance\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n/* Dependencies for checking if changes happened since load on a form\nimport toastr from '../utils/toastr';\nimport { translations } from 'grav-config';\nimport { Instance as FormState } from './state';\n*/\n\nvar Form = /*#__PURE__*/function () {\n function Form(form) {\n var _this = this;\n\n _classCallCheck(this, Form);\n\n this.form = jquery__WEBPACK_IMPORTED_MODULE_0___default()(form);\n\n if (!this.form.length || this.form.prop('tagName').toLowerCase() !== 'form') {\n return;\n }\n /* Option for not saving while nothing in a form has changed\n this.form.on('submit', (event) => {\n if (FormState.equals()) {\n event.preventDefault();\n toastr.info(translations.PLUGIN_ADMIN.NOTHING_TO_SAVE);\n }\n }); */\n\n\n this._attachShortcuts();\n\n this._attachToggleables();\n\n this._attachDisabledFields();\n\n this._submitUncheckedFields();\n\n this.observer = new MutationObserver(this.addedNodes);\n this.form.each(function (index, form) {\n return _this.observer.observe(form, {\n subtree: true,\n childList: true\n });\n });\n }\n\n _createClass(Form, [{\n key: \"_attachShortcuts\",\n value: function _attachShortcuts() {\n // CTRL + S / CMD + S - shortcut for [Save] when available\n var saveTask = jquery__WEBPACK_IMPORTED_MODULE_0___default()('#titlebar [name=\"task\"][value=\"save\"][form=\"blueprints\"]');\n\n if (saveTask.length) {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(__webpack_require__.g).on('keydown', function (event) {\n var key = String.fromCharCode(event.which).toLowerCase();\n\n if (!event.shiftKey && (event.ctrlKey && !event.altKey || event.metaKey) && key === 's') {\n event.preventDefault();\n saveTask.click();\n }\n });\n }\n }\n }, {\n key: \"_attachToggleables\",\n value: function _attachToggleables() {\n var query = '[data-grav-field=\"toggleable\"] input[type=\"checkbox\"]';\n this.form.on('change', query, function (event) {\n var toggle = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.target);\n var enabled = toggle.is(':checked');\n var parent = toggle.closest('.form-field');\n var label = parent.find('label.toggleable');\n var fields = parent.find('.form-data');\n var inputs = fields.find('input, select, textarea, button');\n label.add(fields).css('opacity', enabled ? '' : 0.7);\n inputs.map(function (index, input) {\n var isSelectize = input.selectize;\n input = jquery__WEBPACK_IMPORTED_MODULE_0___default()(input);\n\n if (isSelectize) {\n isSelectize[enabled ? 'enable' : 'disable']();\n } else {\n input.prop('disabled', !enabled);\n }\n });\n });\n this.form.find(query).trigger('change');\n }\n }, {\n key: \"_attachDisabledFields\",\n value: function _attachDisabledFields() {\n var prefix = '.form-field-toggleable .form-data';\n var query = [];\n ['input', 'select', 'label[for]', 'textarea', '.selectize-control'].forEach(function (item) {\n query.push(\"\".concat(prefix, \" \").concat(item));\n });\n this.form.on('mousedown', query.join(', '), function (event) {\n var input = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.target);\n var isFor = input.prop('for');\n var isSelectize = (input.hasClass('selectize-control') || input.parents('.selectize-control')).length;\n\n if (isFor) {\n input = jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"[id=\\\"\".concat(isFor, \"\\\"]\"));\n }\n\n if (isSelectize) {\n input = input.closest('.selectize-control').siblings('select[name]');\n }\n\n if (!input.prop('disabled')) {\n return true;\n }\n\n var toggle = input.closest('.form-field').find('[data-grav-field=\"toggleable\"] input[type=\"checkbox\"]');\n toggle.trigger('click');\n });\n }\n }, {\n key: \"_submitUncheckedFields\",\n value: function _submitUncheckedFields() {\n var submitted = false;\n this.form.each(function (index, form) {\n form = jquery__WEBPACK_IMPORTED_MODULE_0___default()(form);\n form.on('submit', function () {\n // workaround for MS Edge, submitting multiple forms at the same time\n if (submitted) {\n return false;\n }\n\n var formId = form.attr('id');\n var unchecked = form.find('input[type=\"checkbox\"]:not(:checked):not(:disabled)');\n var submit = form.find('[type=\"submit\"]').add(\"[form=\\\"\".concat(formId, \"\\\"][type=\\\"submit\\\"]\"));\n\n if (!unchecked.length) {\n return true;\n }\n\n submit.addClass('pointer-events-disabled');\n unchecked.each(function (index, element) {\n element = jquery__WEBPACK_IMPORTED_MODULE_0___default()(element);\n var name = element.prop('name');\n var fake = jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"\"));\n form.append(fake);\n });\n submitted = true;\n return true;\n });\n });\n }\n }, {\n key: \"addedNodes\",\n value: function addedNodes(mutations) {\n var _this2 = this;\n\n mutations.forEach(function (mutation) {\n if (mutation.type !== 'childList') {\n return;\n }\n\n if (mutation.addedNodes) {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('body').trigger('mutation._grav', mutation.target, mutation, _this2);\n }\n\n if (mutation.removedNodes) {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('body').trigger('mutation_removed._grav', {\n target: mutation.target,\n mutation: mutation\n }, _this2);\n }\n });\n }\n }]);\n\n return Form;\n}();\n\n\nvar Instance = new Form('form#blueprints');//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL2Zvcm1zL2Zvcm0uanM/OTQ2MyJdLCJuYW1lcyI6WyJGb3JtIiwiZm9ybSIsIiQiLCJsZW5ndGgiLCJwcm9wIiwidG9Mb3dlckNhc2UiLCJfYXR0YWNoU2hvcnRjdXRzIiwiX2F0dGFjaFRvZ2dsZWFibGVzIiwiX2F0dGFjaERpc2FibGVkRmllbGRzIiwiX3N1Ym1pdFVuY2hlY2tlZEZpZWxkcyIsIm9ic2VydmVyIiwiTXV0YXRpb25PYnNlcnZlciIsImFkZGVkTm9kZXMiLCJlYWNoIiwiaW5kZXgiLCJvYnNlcnZlIiwic3VidHJlZSIsImNoaWxkTGlzdCIsInNhdmVUYXNrIiwiZ2xvYmFsIiwib24iLCJldmVudCIsImtleSIsIlN0cmluZyIsImZyb21DaGFyQ29kZSIsIndoaWNoIiwic2hpZnRLZXkiLCJjdHJsS2V5IiwiYWx0S2V5IiwibWV0YUtleSIsInByZXZlbnREZWZhdWx0IiwiY2xpY2siLCJxdWVyeSIsInRvZ2dsZSIsInRhcmdldCIsImVuYWJsZWQiLCJpcyIsInBhcmVudCIsImNsb3Nlc3QiLCJsYWJlbCIsImZpbmQiLCJmaWVsZHMiLCJpbnB1dHMiLCJhZGQiLCJjc3MiLCJtYXAiLCJpbnB1dCIsImlzU2VsZWN0aXplIiwic2VsZWN0aXplIiwidHJpZ2dlciIsInByZWZpeCIsImZvckVhY2giLCJpdGVtIiwicHVzaCIsImpvaW4iLCJpc0ZvciIsImhhc0NsYXNzIiwicGFyZW50cyIsInNpYmxpbmdzIiwic3VibWl0dGVkIiwiZm9ybUlkIiwiYXR0ciIsInVuY2hlY2tlZCIsInN1Ym1pdCIsImFkZENsYXNzIiwiZWxlbWVudCIsIm5hbWUiLCJmYWtlIiwiYXBwZW5kIiwibXV0YXRpb25zIiwibXV0YXRpb24iLCJ0eXBlIiwicmVtb3ZlZE5vZGVzIiwiSW5zdGFuY2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0lBRXFCQSxJO0FBQ2pCLGdCQUFZ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WUQsSUFBWjtBQUNILFdBTEQ7QUFNQVIsbUJBQVMsR0FBRyxJQUFaO0FBQ0EsaUJBQU8sSUFBUDtBQUNILFNBbkJEO0FBb0JILE9BdEJEO0FBdUJIOzs7K0JBRVVVLFMsRUFBVztBQUFBOztBQUNsQkEsZUFBUyxDQUFDbEIsT0FBVixDQUFrQixVQUFDbUIsUUFBRCxFQUFjO0FBQzVCLFlBQUlBLFFBQVEsQ0FBQ0MsSUFBVCxLQUFrQixXQUF0QixFQUFtQztBQUFFO0FBQVM7O0FBRTlDLFlBQUlELFFBQVEsQ0FBQzFELFVBQWIsRUFBeUI7QUFDckJWLHVEQUFDLENBQUMsTUFBRCxDQUFELENBQVUrQyxPQUFWLENBQWtCLGdCQUFsQixFQUFvQ3FCLFFBQVEsQ0FBQ3BDLE1BQTdDLEVBQXFEb0MsUUFBckQsRUFBK0QsTUFBL0Q7QUFDSDs7QUFFRCxZQUFJQSxRQUFRLENBQUNFLFlBQWIsRUFBMkI7QUFDdkJ0RSx1REFBQyxDQUFDLE1BQUQsQ0FBRCxDQUFVK0MsT0FBVixDQUFrQix3QkFBbEIsRUFBNEM7QUFBRWYsa0JBQU0sRUFBRW9DLFFBQVEsQ0FBQ3BDLE1BQW5CO0FBQTJCb0Msb0JBQVEsRUFBUkE7QUFBM0IsV0FBNUMsRUFBbUYsTUFBbkY7QUFDSDtBQUNKLE9BVkQ7QUFXSDs7Ozs7OztBQUdFLElBQUlHLFFBQVEsR0FBRyxJQUFJekUsSUFBSixDQUFTLGlCQUFULENBQWYiLCJmaWxlIjoiLi9hcHAvZm9ybXMvZm9ybS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5cbi8qIERlcGVuZGVuY2llcyBmb3IgY2hlY2tpbmcgaWYgY2hhbmdlcyBoYXBwZW5lZCBzaW5jZSBsb2FkIG9uIGEgZm9ybVxuaW1wb3J0IHRvYXN0ciBmcm9tICcuLi91dGlscy90b2FzdHInO1xuaW1wb3J0IHsgdHJhbnNsYXRpb25zIH0gZnJvbSAnZ3Jhdi1jb25maWcnO1xuaW1wb3J0IHsgSW5zdGFuY2UgYXMgRm9ybVN0YXRlIH0gZnJvbSAnLi9zdGF0ZSc7XG4qL1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGb3JtIHtcbiAgICBjb25zdHJ1Y3Rvcihmb3JtKSB7XG4gICAgICAgIHRoaXMuZm9ybSA9ICQoZm9ybSk7XG4gICAgICAgIGlmICghdGhpcy5mb3JtLmxlbmd0aCB8fCB0aGlzLmZvcm0ucHJvcCgndGFnTmFtZScpLnRvTG93ZXJDYXNlKCkgIT09ICdmb3JtJykgeyByZXR1cm47IH1cblxuICAgICAgICAvKiBPcHRpb24gZm9yIG5vdCBzYXZpbmcgd2hpbGUgbm90aGluZyBpbiBhIGZvcm0gaGFzIGNoYW5nZWRcblxuICAgICAgICB0aGlzLmZvcm0ub24oJ3N1Ym1pdCcsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKEZvcm1TdGF0ZS5lcXVhbHMoKSkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdG9hc3RyLmluZm8odHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5OT1RISU5HX1RPX1NBVkUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTsgKi9cblxuICAgICAgICB0aGlzLl9hdHRhY2hTaG9ydGN1dHMoKTtcbiAgICAgICAgdGhpcy5fYXR0YWNoVG9nZ2xlYWJsZXMoKTtcbiAgICAgICAgdGhpcy5fYXR0YWNoRGlzYWJsZWRGaWVsZHMoKTtcbiAgICAgICAgdGhpcy5fc3VibWl0VW5jaGVja2VkRmllbGRzKCk7XG5cbiAgICAgICAgdGhpcy5vYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKHRoaXMuYWRkZWROb2Rlcyk7XG4gICAgICAgIHRoaXMuZm9ybS5lYWNoKChpbmRleCwgZm9ybSkgPT4gdGhpcy5vYnNlcnZlci5vYnNlcnZlKGZvcm0sIHsgc3VidHJlZTogdHJ1ZSwgY2hpbGRMaXN0OiB0cnVlIH0pKTtcbiAgICB9XG5cbiAgICBfYXR0YWNoU2hvcnRjdXRzKCkge1xuICAgICAgICAvLyBDVFJMICsgUyAvIENNRCArIFMgLSBzaG9ydGN1dCBmb3IgW1NhdmVdIHdoZW4gYXZhaWxhYmxlXG4gICAgICAgIGxldCBzYXZlVGFzayA9ICQoJyN0aXRsZWJhciBbbmFtZT1cInRhc2tcIl1bdmFsdWU9XCJzYXZlXCJdW2Zvcm09XCJibHVlcHJpbnRzXCJdJyk7XG5cbiAgICAgICAgaWYgKHNhdmVUYXNrLmxlbmd0aCkge1xuICAgICAgICAgICAgJChnbG9iYWwpLm9uKCdrZXlkb3duJywgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGV2ZW50LndoaWNoKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGlmICghZXZlbnQuc2hpZnRLZXkgJiYgKChldmVudC5jdHJsS2V5ICYmICFldmVudC5hbHRLZXkpIHx8IGV2ZW50Lm1ldGFLZXkpICYmIGtleSA9PT0gJ3MnKSB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIHNhdmVUYXNrLmNsaWNrKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfYXR0YWNoVG9nZ2xlYWJsZXMoKSB7XG4gICAgICAgIGxldCBxdWVyeSA9ICdbZGF0YS1ncmF2LWZpZWxkPVwidG9nZ2xlYWJsZVwiXSBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0nO1xuXG4gICAgICAgIHRoaXMuZm9ybS5vbignY2hhbmdlJywgcXVlcnksIChldmVudCkgPT4ge1xuICAgICAgICAgICAgbGV0IHRvZ2dsZSA9ICQoZXZlbnQudGFyZ2V0KTtcbiAgICAgICAgICAgIGxldCBlbmFibGVkID0gdG9nZ2xlLmlzKCc6Y2hlY2tlZCcpO1xuICAgICAgICAgICAgbGV0IHBhcmVudCA9IHRvZ2dsZS5jbG9zZXN0KCcuZm9ybS1maWVsZCcpO1xuICAgICAgICAgICAgbGV0IGxhYmVsID0gcGFyZW50LmZpbmQoJ2xhYmVsLnRvZ2dsZWFibGUnKTtcbiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBwYXJlbnQuZmluZCgnLmZvcm0tZGF0YScpO1xuICAgICAgICAgICAgbGV0IGlucHV0cyA9IGZpZWxkcy5maW5kKCdpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSwgYnV0dG9uJyk7XG5cbiAgICAgICAgICAgIGxhYmVsLmFkZChmaWVsZHMpLmNzcygnb3BhY2l0eScsIGVuYWJsZWQgPyAnJyA6IDAuNyk7XG4gICAgICAgICAgICBpbnB1dHMubWFwKChpbmRleCwgaW5wdXQpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgaXNTZWxlY3RpemUgPSBpbnB1dC5zZWxlY3RpemU7XG4gICAgICAgICAgICAgICAgaW5wdXQgPSAkKGlucHV0KTtcblxuICAgICAgICAgICAgICAgIGlmIChpc1NlbGVjdGl6ZSkge1xuICAgICAgICAgICAgICAgICAgICBpc1NlbGVjdGl6ZVtlbmFibGVkID8gJ2VuYWJsZScgOiAnZGlzYWJsZSddKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXQucHJvcCgnZGlzYWJsZWQnLCAhZW5hYmxlZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZm9ybS5maW5kKHF1ZXJ5KS50cmlnZ2VyKCdjaGFuZ2UnKTtcbiAgICB9XG5cbiAgICBfYXR0YWNoRGlzYWJsZWRGaWVsZHMoKSB7XG4gICAgICAgIGxldCBwcmVmaXggPSAnLmZvcm0tZmllbGQtdG9nZ2xlYWJsZSAuZm9ybS1kYXRhJztcbiAgICAgICAgbGV0IHF1ZXJ5ID0gW107XG5cbiAgICAgICAgWydpbnB1dCcsICdzZWxlY3QnLCAnbGFiZWxbZm9yXScsICd0ZXh0YXJlYScsICcuc2VsZWN0aXplLWNvbnRyb2wnXS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICBxdWVyeS5wdXNoKGAke3ByZWZpeH0gJHtpdGVtfWApO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmZvcm0ub24oJ21vdXNlZG93bicsIHF1ZXJ5LmpvaW4oJywgJyksIChldmVudCkgPT4ge1xuICAgICAgICAgICAgbGV0IGlucHV0ID0gJChldmVudC50YXJnZXQpO1xuICAgICAgICAgICAgbGV0IGlzRm9yID0gaW5wdXQucHJvcCgnZm9yJyk7XG4gICAgICAgICAgICBsZXQgaXNTZWxlY3RpemUgPSAoaW5wdXQuaGFzQ2xhc3MoJ3NlbGVjdGl6ZS1jb250cm9sJykgfHwgaW5wdXQucGFyZW50cygnLnNlbGVjdGl6ZS1jb250cm9sJykpLmxlbmd0aDtcblxuICAgICAgICAgICAgaWYgKGlzRm9yKSB7IGlucHV0ID0gJChgW2lkPVwiJHtpc0Zvcn1cIl1gKTsgfVxuICAgICAgICAgICAgaWYgKGlzU2VsZWN0aXplKSB7IGlucHV0ID0gaW5wdXQuY2xvc2VzdCgnLnNlbGVjdGl6ZS1jb250cm9sJykuc2libGluZ3MoJ3NlbGVjdFtuYW1lXScpOyB9XG5cbiAgICAgICAgICAgIGlmICghaW5wdXQucHJvcCgnZGlzYWJsZWQnKSkgeyByZXR1cm4gdHJ1ZTsgfVxuXG4gICAgICAgICAgICBsZXQgdG9nZ2xlID0gaW5wdXQuY2xvc2VzdCgnLmZvcm0tZmllbGQnKS5maW5kKCdbZGF0YS1ncmF2LWZpZWxkPVwidG9nZ2xlYWJsZVwiXSBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0nKTtcbiAgICAgICAgICAgIHRvZ2dsZS50cmlnZ2VyKCdjbGljaycpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfc3VibWl0VW5jaGVja2VkRmllbGRzKCkge1xuICAgICAgICBsZXQgc3VibWl0dGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZm9ybS5lYWNoKChpbmRleCwgZm9ybSkgPT4ge1xuICAgICAgICAgICAgZm9ybSA9ICQoZm9ybSk7XG4gICAgICAgICAgICBmb3JtLm9uKCdzdWJtaXQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gd29ya2Fyb3VuZCBmb3IgTVMgRWRnZSwgc3VibWl0dGluZyBtdWx0aXBsZSBmb3JtcyBhdCB0aGUgc2FtZSB0aW1lXG4gICAgICAgICAgICAgICAgaWYgKHN1Ym1pdHRlZCkgeyByZXR1cm4gZmFsc2U7IH1cblxuICAgICAgICAgICAgICAgIGxldCBmb3JtSWQgPSBmb3JtLmF0dHIoJ2lkJyk7XG4gICAgICAgICAgICAgICAgbGV0IHVuY2hlY2tlZCA9IGZvcm0uZmluZCgnaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdOm5vdCg6Y2hlY2tlZCk6bm90KDpkaXNhYmxlZCknKTtcbiAgICAgICAgICAgICAgICBsZXQgc3VibWl0ID0gZm9ybS5maW5kKCdbdHlwZT1cInN1Ym1pdFwiXScpLmFkZChgW2Zvcm09XCIke2Zvcm1JZH1cIl1bdHlwZT1cInN1Ym1pdFwiXWApO1xuXG4gICAgICAgICAgICAgICAgaWYgKCF1bmNoZWNrZWQubGVuZ3RoKSB7IHJldHVybiB0cnVlOyB9XG5cbiAgICAgICAgICAgICAgICBzdWJtaXQuYWRkQ2xhc3MoJ3BvaW50ZXItZXZlbnRzLWRpc2FibGVkJyk7XG4gICAgICAgICAgICAgICAgdW5jaGVja2VkLmVhY2goKGluZGV4LCBlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IGVsZW1lbnQucHJvcCgnbmFtZScpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZmFrZSA9ICQoYDxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cIiR7bmFtZX1cIiB2YWx1ZT1cIjBcIiAvPmApO1xuICAgICAgICAgICAgICAgICAgICBmb3JtLmFwcGVuZChmYWtlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBzdWJtaXR0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFkZGVkTm9kZXMobXV0YXRpb25zKSB7XG4gICAgICAgIG11dGF0aW9ucy5mb3JFYWNoKChtdXRhdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKG11dGF0aW9uLnR5cGUgIT09ICdjaGlsZExpc3QnKSB7IHJldHVybjsgfVxuXG4gICAgICAgICAgICBpZiAobXV0YXRpb24uYWRkZWROb2Rlcykge1xuICAgICAgICAgICAgICAgICQoJ2JvZHknKS50cmlnZ2VyKCdtdXRhdGlvbi5fZ3JhdicsIG11dGF0aW9uLnRhcmdldCwgbXV0YXRpb24sIHRoaXMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobXV0YXRpb24ucmVtb3ZlZE5vZGVzKSB7XG4gICAgICAgICAgICAgICAgJCgnYm9keScpLnRyaWdnZXIoJ211dGF0aW9uX3JlbW92ZWQuX2dyYXYnLCB7IHRhcmdldDogbXV0YXRpb24udGFyZ2V0LCBtdXRhdGlvbiB9LCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5leHBvcnQgbGV0IEluc3RhbmNlID0gbmV3IEZvcm0oJ2Zvcm0jYmx1ZXByaW50cycpO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./app/forms/form.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Form),\n/* harmony export */ \"Instance\": () => (/* binding */ Instance)\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n/* Dependencies for checking if changes happened since load on a form\nimport toastr from '../utils/toastr';\nimport { translations } from 'grav-config';\nimport { Instance as FormState } from './state';\n*/\n\nvar Form = /*#__PURE__*/function () {\n function Form(form) {\n var _this = this;\n\n _classCallCheck(this, Form);\n\n this.form = jquery__WEBPACK_IMPORTED_MODULE_0___default()(form);\n\n if (!this.form.length || this.form.prop('tagName').toLowerCase() !== 'form') {\n return;\n }\n /* Option for not saving while nothing in a form has changed\n this.form.on('submit', (event) => {\n if (FormState.equals()) {\n event.preventDefault();\n toastr.info(translations.PLUGIN_ADMIN.NOTHING_TO_SAVE);\n }\n }); */\n\n\n this._attachShortcuts();\n\n this._attachToggleables();\n\n this._attachDisabledFields();\n\n this._submitUncheckedFields();\n\n this.observer = new MutationObserver(this.addedNodes);\n this.form.each(function (index, form) {\n return _this.observer.observe(form, {\n subtree: true,\n childList: true\n });\n });\n }\n\n _createClass(Form, [{\n key: \"_attachShortcuts\",\n value: function _attachShortcuts() {\n // CTRL + S / CMD + S - shortcut for [Save] when available\n var saveTask = jquery__WEBPACK_IMPORTED_MODULE_0___default()('#titlebar [name=\"task\"][value=\"save\"][form=\"blueprints\"]');\n\n if (saveTask.length) {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(__webpack_require__.g).on('keydown', function (event) {\n var key = String.fromCharCode(event.which).toLowerCase();\n\n if (!event.shiftKey && (event.ctrlKey && !event.altKey || event.metaKey) && key === 's') {\n event.preventDefault();\n saveTask.click();\n }\n });\n }\n }\n }, {\n key: \"_attachToggleables\",\n value: function _attachToggleables() {\n var query = '[data-grav-field=\"toggleable\"] input[type=\"checkbox\"]';\n this.form.on('change', query, function (event) {\n var toggle = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.target);\n var enabled = toggle.is(':checked');\n var parent = toggle.closest('.form-field');\n var label = parent.find('label.toggleable');\n var fields = parent.find('.form-data');\n var inputs = fields.find('input, select, textarea, button');\n label.add(fields).css('opacity', enabled ? '' : 0.7);\n inputs.map(function (index, input) {\n var isSelectize = input.selectize;\n input = jquery__WEBPACK_IMPORTED_MODULE_0___default()(input);\n\n if (isSelectize) {\n isSelectize[enabled ? 'enable' : 'disable']();\n } else {\n input.prop('disabled', !enabled);\n }\n });\n });\n this.form.find(query).trigger('change');\n }\n }, {\n key: \"_attachDisabledFields\",\n value: function _attachDisabledFields() {\n var prefix = '.form-field-toggleable .form-data';\n var query = [];\n ['input', 'select', 'label[for]', 'textarea', '.selectize-control'].forEach(function (item) {\n query.push(\"\".concat(prefix, \" \").concat(item));\n });\n this.form.on('mousedown', query.join(', '), function (event) {\n var input = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.target);\n var isFor = input.prop('for');\n var isSelectize = (input.hasClass('selectize-control') || input.parents('.selectize-control')).length;\n\n if (isFor) {\n input = jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"[id=\\\"\".concat(isFor, \"\\\"]\"));\n }\n\n if (isSelectize) {\n input = input.closest('.selectize-control').siblings('select[name]');\n }\n\n if (!input.prop('disabled')) {\n return true;\n }\n\n var toggle = input.closest('.form-field').find('[data-grav-field=\"toggleable\"] input[type=\"checkbox\"]');\n toggle.trigger('click');\n });\n }\n }, {\n key: \"_submitUncheckedFields\",\n value: function _submitUncheckedFields() {\n var submitted = false;\n this.form.each(function (index, form) {\n form = jquery__WEBPACK_IMPORTED_MODULE_0___default()(form);\n form.on('submit', function () {\n // workaround for MS Edge, submitting multiple forms at the same time\n if (submitted) {\n return false;\n }\n\n var formId = form.attr('id');\n var unchecked = form.find('input[type=\"checkbox\"]:not(:checked):not(:disabled)');\n var submit = form.find('[type=\"submit\"]').add(\"[form=\\\"\".concat(formId, \"\\\"][type=\\\"submit\\\"]\"));\n\n if (!unchecked.length) {\n return true;\n }\n\n submit.addClass('pointer-events-disabled');\n unchecked.each(function (index, element) {\n element = jquery__WEBPACK_IMPORTED_MODULE_0___default()(element);\n var name = element.prop('name');\n var fake = jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"\"));\n form.append(fake);\n });\n submitted = true;\n return true;\n });\n });\n }\n }, {\n key: \"addedNodes\",\n value: function addedNodes(mutations) {\n var _this2 = this;\n\n mutations.forEach(function (mutation) {\n if (mutation.type !== 'childList') {\n return;\n }\n\n if (mutation.addedNodes) {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('body').trigger('mutation._grav', mutation.target, mutation, _this2);\n }\n\n if (mutation.removedNodes) {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('body').trigger('mutation_removed._grav', {\n target: mutation.target,\n mutation: mutation\n }, _this2);\n }\n });\n }\n }]);\n\n return Form;\n}();\n\n\nvar Instance = new Form('form#blueprints');//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL2Zvcm1zL2Zvcm0uanM/OTQ2MyJdLCJuYW1lcyI6WyJGb3JtIiwiZm9ybSIsIiQiLCJsZW5ndGgiLCJwcm9wIiwidG9Mb3dlckNhc2UiLCJfYXR0YWNoU2hvcnRjdXRzIiwiX2F0dGFjaFRvZ2dsZWFibGVzIiwiX2F0dGFjaERpc2FibGVkRmllbGRzIiwiX3N1Ym1pdFVuY2hlY2tlZEZpZWxkcyIsIm9ic2VydmVyIiwiTXV0YXRpb25PYnNlcnZlciIsImFkZGVkTm9kZXMiLCJlYWNoIiwiaW5kZXgiLCJvYnNlcnZlIiwic3VidHJlZSIsImNoaWxkTGlzdCIsInNhdmVUYXNrIiwiZ2xvYmFsIiwib24iLCJldmVudCIsImtleSIsIlN0cmluZyIsImZyb21DaGFyQ29kZSIsIndoaWNoIiwic2hpZnRLZXkiLCJjdHJsS2V5IiwiYWx0S2V5IiwibWV0YUtleSIsInByZXZlbnREZWZhdWx0IiwiY2xpY2siLCJxdWVyeSIsInRvZ2dsZSIsInRhcmdldCIsImVuYWJsZWQiLCJpcyIsInBhcmVudCIsImNsb3Nlc3QiLCJsYWJlbCIsImZpbmQiLCJmaWVsZHMiLCJpbnB1dHMiLCJhZGQiLCJjc3MiLCJtYXAiLCJpbnB1dCIsImlzU2VsZWN0aXplIiwic2VsZWN0aXplIiwidHJpZ2dlciIsInByZWZpeCIsImZvckVhY2giLCJpdGVtIiwicHVzaCIsImpvaW4iLCJpc0ZvciIsImhhc0NsYXNzIiwicGFyZW50cyIsInNpYmxpbmdzIiwic3VibWl0dGVkIiwiZm9ybUlkIiwiYXR0ciIsInVuY2hlY2tlZCIsInN1Ym1pdCIsImFkZENsYXNzIiwiZWxlbWVudCIsIm5hbWUiLCJmYWtlIiwiYXBwZW5kIiwibXV0YXRpb25zIiwibXV0YXRpb24iLCJ0eXBlIiwicmVtb3ZlZE5vZGVzIiwiSW5zdGFuY2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0lBRXFCQSxJO0FBQ2pCLGdCQUFZ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QkFBSSxDQUFDbUUsTUFBTCxDQUFZRCxJQUFaO0FBQ0gsV0FMRDtBQU1BUixtQkFBUyxHQUFHLElBQVo7QUFDQSxpQkFBTyxJQUFQO0FBQ0gsU0FuQkQ7QUFvQkgsT0F0QkQ7QUF1Qkg7OztXQUVELG9CQUFXVSxTQUFYLEVBQXNCO0FBQUE7O0FBQ2xCQSxlQUFTLENBQUNsQixPQUFWLENBQWtCLFVBQUNtQixRQUFELEVBQWM7QUFDNUIsWUFBSUEsUUFBUSxDQUFDQyxJQUFULEtBQWtCLFdBQXRCLEVBQW1DO0FBQUU7QUFBUzs7QUFFOUMsWUFBSUQsUUFBUSxDQUFDMUQsVUFBYixFQUF5QjtBQUNyQlYsdURBQUMsQ0FBQyxNQUFELENBQUQsQ0FBVStDLE9BQVYsQ0FBa0IsZ0JBQWxCLEVBQW9DcUIsUUFBUSxDQUFDcEMsTUFBN0MsRUFBcURvQyxRQUFyRCxFQUErRCxNQUEvRDtBQUNIOztBQUVELFlBQUlBLFFBQVEsQ0FBQ0UsWUFBYixFQUEyQjtBQUN2QnRFLHVEQUFDLENBQUMsTUFBRCxDQUFELENBQVUrQyxPQUFWLENBQWtCLHdCQUFsQixFQUE0QztBQUFFZixrQkFBTSxFQUFFb0MsUUFBUSxDQUFDcEMsTUFBbkI7QUFBMkJvQyxvQkFBUSxFQUFSQTtBQUEzQixXQUE1QyxFQUFtRixNQUFuRjtBQUNIO0FBQ0osT0FWRDtBQVdIOzs7Ozs7O0FBR0UsSUFBSUcsUUFBUSxHQUFHLElBQUl6RSxJQUFKLENBQVMsaUJBQVQsQ0FBZiIsImZpbGUiOiIuL2FwcC9mb3Jtcy9mb3JtLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcblxuLyogRGVwZW5kZW5jaWVzIGZvciBjaGVja2luZyBpZiBjaGFuZ2VzIGhhcHBlbmVkIHNpbmNlIGxvYWQgb24gYSBmb3JtXG5pbXBvcnQgdG9hc3RyIGZyb20gJy4uL3V0aWxzL3RvYXN0cic7XG5pbXBvcnQgeyB0cmFuc2xhdGlvbnMgfSBmcm9tICdncmF2LWNvbmZpZyc7XG5pbXBvcnQgeyBJbnN0YW5jZSBhcyBGb3JtU3RhdGUgfSBmcm9tICcuL3N0YXRlJztcbiovXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZvcm0ge1xuICAgIGNvbnN0cnVjdG9yKGZvcm0pIHtcbiAgICAgICAgdGhpcy5mb3JtID0gJChmb3JtKTtcbiAgICAgICAgaWYgKCF0aGlzLmZvcm0ubGVuZ3RoIHx8IHRoaXMuZm9ybS5wcm9wKCd0YWdOYW1lJykudG9Mb3dlckNhc2UoKSAhPT0gJ2Zvcm0nKSB7IHJldHVybjsgfVxuXG4gICAgICAgIC8qIE9wdGlvbiBmb3Igbm90IHNhdmluZyB3aGlsZSBub3RoaW5nIGluIGEgZm9ybSBoYXMgY2hhbmdlZFxuXG4gICAgICAgIHRoaXMuZm9ybS5vbignc3VibWl0JywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoRm9ybVN0YXRlLmVxdWFscygpKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0b2FzdHIuaW5mbyh0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLk5PVEhJTkdfVE9fU0FWRSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pOyAqL1xuXG4gICAgICAgIHRoaXMuX2F0dGFjaFNob3J0Y3V0cygpO1xuICAgICAgICB0aGlzLl9hdHRhY2hUb2dnbGVhYmxlcygpO1xuICAgICAgICB0aGlzLl9hdHRhY2hEaXNhYmxlZEZpZWxkcygpO1xuICAgICAgICB0aGlzLl9zdWJtaXRVbmNoZWNrZWRGaWVsZHMoKTtcblxuICAgICAgICB0aGlzLm9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIodGhpcy5hZGRlZE5vZGVzKTtcbiAgICAgICAgdGhpcy5mb3JtLmVhY2goKGluZGV4LCBmb3JtKSA9PiB0aGlzLm9ic2VydmVyLm9ic2VydmUoZm9ybSwgeyBzdWJ0cmVlOiB0cnVlLCBjaGlsZExpc3Q6IHRydWUgfSkpO1xuICAgIH1cblxuICAgIF9hdHRhY2hTaG9ydGN1dHMoKSB7XG4gICAgICAgIC8vIENUUkwgKyBTIC8gQ01EICsgUyAtIHNob3J0Y3V0IGZvciBbU2F2ZV0gd2hlbiBhdmFpbGFibGVcbiAgICAgICAgbGV0IHNhdmVUYXNrID0gJCgnI3RpdGxlYmFyIFtuYW1lPVwidGFza1wiXVt2YWx1ZT1cInNhdmVcIl1bZm9ybT1cImJsdWVwcmludHNcIl0nKTtcblxuICAgICAgICBpZiAoc2F2ZVRhc2subGVuZ3RoKSB7XG4gICAgICAgICAgICAkKGdsb2JhbCkub24oJ2tleWRvd24nLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoZXZlbnQud2hpY2gpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFldmVudC5zaGlmdEtleSAmJiAoKGV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LmFsdEtleSkgfHwgZXZlbnQubWV0YUtleSkgJiYga2V5ID09PSAncycpIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgc2F2ZVRhc2suY2xpY2soKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9hdHRhY2hUb2dnbGVhYmxlcygpIHtcbiAgICAgICAgbGV0IHF1ZXJ5ID0gJ1tkYXRhLWdyYXYtZmllbGQ9XCJ0b2dnbGVhYmxlXCJdIGlucHV0W3R5cGU9XCJjaGVja2JveFwiXSc7XG5cbiAgICAgICAgdGhpcy5mb3JtLm9uKCdjaGFuZ2UnLCBxdWVyeSwgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBsZXQgdG9nZ2xlID0gJChldmVudC50YXJnZXQpO1xuICAgICAgICAgICAgbGV0IGVuYWJsZWQgPSB0b2dnbGUuaXMoJzpjaGVja2VkJyk7XG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gdG9nZ2xlLmNsb3Nlc3QoJy5mb3JtLWZpZWxkJyk7XG4gICAgICAgICAgICBsZXQgbGFiZWwgPSBwYXJlbnQuZmluZCgnbGFiZWwudG9nZ2xlYWJsZScpO1xuICAgICAgICAgICAgbGV0IGZpZWxkcyA9IHBhcmVudC5maW5kKCcuZm9ybS1kYXRhJyk7XG4gICAgICAgICAgICBsZXQgaW5wdXRzID0gZmllbGRzLmZpbmQoJ2lucHV0LCBzZWxlY3QsIHRleHRhcmVhLCBidXR0b24nKTtcblxuICAgICAgICAgICAgbGFiZWwuYWRkKGZpZWxkcykuY3NzKCdvcGFjaXR5JywgZW5hYmxlZCA/ICcnIDogMC43KTtcbiAgICAgICAgICAgIGlucHV0cy5tYXAoKGluZGV4LCBpbnB1dCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBpc1NlbGVjdGl6ZSA9IGlucHV0LnNlbGVjdGl6ZTtcbiAgICAgICAgICAgICAgICBpbnB1dCA9ICQoaW5wdXQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGlzU2VsZWN0aXplKSB7XG4gICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0aXplW2VuYWJsZWQgPyAnZW5hYmxlJyA6ICdkaXNhYmxlJ10oKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpbnB1dC5wcm9wKCdkaXNhYmxlZCcsICFlbmFibGVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5mb3JtLmZpbmQocXVlcnkpLnRyaWdnZXIoJ2NoYW5nZScpO1xuICAgIH1cblxuICAgIF9hdHRhY2hEaXNhYmxlZEZpZWxkcygpIHtcbiAgICAgICAgbGV0IHByZWZpeCA9ICcuZm9ybS1maWVsZC10b2dnbGVhYmxlIC5mb3JtLWRhdGEnO1xuICAgICAgICBsZXQgcXVlcnkgPSBbXTtcblxuICAgICAgICBbJ2lucHV0JywgJ3NlbGVjdCcsICdsYWJlbFtmb3JdJywgJ3RleHRhcmVhJywgJy5zZWxlY3RpemUtY29udHJvbCddLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIHF1ZXJ5LnB1c2goYCR7cHJlZml4fSAke2l0ZW19YCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZm9ybS5vbignbW91c2Vkb3duJywgcXVlcnkuam9pbignLCAnKSwgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBsZXQgaW5wdXQgPSAkKGV2ZW50LnRhcmdldCk7XG4gICAgICAgICAgICBsZXQgaXNGb3IgPSBpbnB1dC5wcm9wKCdmb3InKTtcbiAgICAgICAgICAgIGxldCBpc1NlbGVjdGl6ZSA9IChpbnB1dC5oYXNDbGFzcygnc2VsZWN0aXplLWNvbnRyb2wnKSB8fCBpbnB1dC5wYXJlbnRzKCcuc2VsZWN0aXplLWNvbnRyb2wnKSkubGVuZ3RoO1xuXG4gICAgICAgICAgICBpZiAoaXNGb3IpIHsgaW5wdXQgPSAkKGBbaWQ9XCIke2lzRm9yfVwiXWApOyB9XG4gICAgICAgICAgICBpZiAoaXNTZWxlY3RpemUpIHsgaW5wdXQgPSBpbnB1dC5jbG9zZXN0KCcuc2VsZWN0aXplLWNvbnRyb2wnKS5zaWJsaW5ncygnc2VsZWN0W25hbWVdJyk7IH1cblxuICAgICAgICAgICAgaWYgKCFpbnB1dC5wcm9wKCdkaXNhYmxlZCcpKSB7IHJldHVybiB0cnVlOyB9XG5cbiAgICAgICAgICAgIGxldCB0b2dnbGUgPSBpbnB1dC5jbG9zZXN0KCcuZm9ybS1maWVsZCcpLmZpbmQoJ1tkYXRhLWdyYXYtZmllbGQ9XCJ0b2dnbGVhYmxlXCJdIGlucHV0W3R5cGU9XCJjaGVja2JveFwiXScpO1xuICAgICAgICAgICAgdG9nZ2xlLnRyaWdnZXIoJ2NsaWNrJyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9zdWJtaXRVbmNoZWNrZWRGaWVsZHMoKSB7XG4gICAgICAgIGxldCBzdWJtaXR0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5mb3JtLmVhY2goKGluZGV4LCBmb3JtKSA9PiB7XG4gICAgICAgICAgICBmb3JtID0gJChmb3JtKTtcbiAgICAgICAgICAgIGZvcm0ub24oJ3N1Ym1pdCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyB3b3JrYXJvdW5kIGZvciBNUyBFZGdlLCBzdWJtaXR0aW5nIG11bHRpcGxlIGZvcm1zIGF0IHRoZSBzYW1lIHRpbWVcbiAgICAgICAgICAgICAgICBpZiAoc3VibWl0dGVkKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGZvcm1JZCA9IGZvcm0uYXR0cignaWQnKTtcbiAgICAgICAgICAgICAgICBsZXQgdW5jaGVja2VkID0gZm9ybS5maW5kKCdpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl06bm90KDpjaGVja2VkKTpub3QoOmRpc2FibGVkKScpO1xuICAgICAgICAgICAgICAgIGxldCBzdWJtaXQgPSBmb3JtLmZpbmQoJ1t0eXBlPVwic3VibWl0XCJdJykuYWRkKGBbZm9ybT1cIiR7Zm9ybUlkfVwiXVt0eXBlPVwic3VibWl0XCJdYCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXVuY2hlY2tlZC5sZW5ndGgpIHsgcmV0dXJuIHRydWU7IH1cblxuICAgICAgICAgICAgICAgIHN1Ym1pdC5hZGRDbGFzcygncG9pbnRlci1ldmVudHMtZGlzYWJsZWQnKTtcbiAgICAgICAgICAgICAgICB1bmNoZWNrZWQuZWFjaCgoaW5kZXgsIGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuYW1lID0gZWxlbWVudC5wcm9wKCduYW1lJyk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmYWtlID0gJChgPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwiJHtuYW1lfVwiIHZhbHVlPVwiMFwiIC8+YCk7XG4gICAgICAgICAgICAgICAgICAgIGZvcm0uYXBwZW5kKGZha2UpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHN1Ym1pdHRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYWRkZWROb2RlcyhtdXRhdGlvbnMpIHtcbiAgICAgICAgbXV0YXRpb25zLmZvckVhY2goKG11dGF0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAobXV0YXRpb24udHlwZSAhPT0gJ2NoaWxkTGlzdCcpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgICAgIGlmIChtdXRhdGlvbi5hZGRlZE5vZGVzKSB7XG4gICAgICAgICAgICAgICAgJCgnYm9keScpLnRyaWdnZXIoJ211dGF0aW9uLl9ncmF2JywgbXV0YXRpb24udGFyZ2V0LCBtdXRhdGlvbiwgdGhpcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChtdXRhdGlvbi5yZW1vdmVkTm9kZXMpIHtcbiAgICAgICAgICAgICAgICAkKCdib2R5JykudHJpZ2dlcignbXV0YXRpb25fcmVtb3ZlZC5fZ3JhdicsIHsgdGFyZ2V0OiBtdXRhdGlvbi50YXJnZXQsIG11dGF0aW9uIH0sIHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG5cbmV4cG9ydCBsZXQgSW5zdGFuY2UgPSBuZXcgRm9ybSgnZm9ybSNibHVlcHJpbnRzJyk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./app/forms/form.js\n"); /***/ }), /***/ "./app/forms/index.js": -/*!****************************!* +/*!****************************!*\ !*** ./app/forms/index.js ***! \****************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => __WEBPACK_DEFAULT_EXPORT__\n/* harmony export */ });\n/* harmony import */ var _state__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./state */ \"./app/forms/state.js\");\n/* harmony import */ var _form__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./form */ \"./app/forms/form.js\");\n/* harmony import */ var _fields__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./fields */ \"./app/forms/fields/index.js\");\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n Form: {\n Form: _form__WEBPACK_IMPORTED_MODULE_1__.default,\n Instance: _form__WEBPACK_IMPORTED_MODULE_1__.Instance\n },\n Fields: _fields__WEBPACK_IMPORTED_MODULE_2__.default,\n FormState: {\n FormState: _state__WEBPACK_IMPORTED_MODULE_0__.default,\n Instance: _state__WEBPACK_IMPORTED_MODULE_0__.Instance\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL2Zvcm1zL2luZGV4LmpzPzkyNzMiXSwibmFtZXMiOlsiRm9ybSIsIkluc3RhbmNlIiwiRm9ybUluc3RhbmNlIiwiRmllbGRzIiwiRm9ybVN0YXRlIiwiRm9ybVN0YXRlSW5zdGFuY2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBRUE7QUFFQSxpRUFBZTtBQUNYQSxNQUFJLEVBQUU7QUFDRkEsUUFBSSxFQUFKQSwwQ0FERTtBQUVGQyxZQUFRLEVBQUVDLDJDQUFZQTtBQUZwQixHQURLO0FBS1hDLFFBQU0sRUFBTkEsNENBTFc7QUFNWEMsV0FBUyxFQUFFO0FBQ1BBLGFBQVMsRUFBVEEsMkNBRE87QUFFUEgsWUFBUSxFQUFFSSw0Q0FBaUJBO0FBRnBCO0FBTkEsQ0FBZiIsImZpbGUiOiIuL2FwcC9mb3Jtcy9pbmRleC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBGb3JtU3RhdGUsIHsgSW5zdGFuY2UgYXMgRm9ybVN0YXRlSW5zdGFuY2UgfSBmcm9tICcuL3N0YXRlJztcbmltcG9ydCBGb3JtLCB7IEluc3RhbmNlIGFzIEZvcm1JbnN0YW5jZSB9IGZyb20gJy4vZm9ybSc7XG5cbmltcG9ydCBGaWVsZHMgZnJvbSAnLi9maWVsZHMnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgRm9ybToge1xuICAgICAgICBGb3JtLFxuICAgICAgICBJbnN0YW5jZTogRm9ybUluc3RhbmNlXG4gICAgfSxcbiAgICBGaWVsZHMsXG4gICAgRm9ybVN0YXRlOiB7XG4gICAgICAgIEZvcm1TdGF0ZSxcbiAgICAgICAgSW5zdGFuY2U6IEZvcm1TdGF0ZUluc3RhbmNlXG4gICAgfVxufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./app/forms/index.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _state__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./state */ \"./app/forms/state.js\");\n/* harmony import */ var _form__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./form */ \"./app/forms/form.js\");\n/* harmony import */ var _fields__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./fields */ \"./app/forms/fields/index.js\");\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n Form: {\n Form: _form__WEBPACK_IMPORTED_MODULE_1__.default,\n Instance: _form__WEBPACK_IMPORTED_MODULE_1__.Instance\n },\n Fields: _fields__WEBPACK_IMPORTED_MODULE_2__.default,\n FormState: {\n FormState: _state__WEBPACK_IMPORTED_MODULE_0__.default,\n Instance: _state__WEBPACK_IMPORTED_MODULE_0__.Instance\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL2Zvcm1zL2luZGV4LmpzPzkyNzMiXSwibmFtZXMiOlsiRm9ybSIsIkluc3RhbmNlIiwiRm9ybUluc3RhbmNlIiwiRmllbGRzIiwiRm9ybVN0YXRlIiwiRm9ybVN0YXRlSW5zdGFuY2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBRUE7QUFFQSxpRUFBZTtBQUNYQSxNQUFJLEVBQUU7QUFDRkEsUUFBSSxFQUFKQSwwQ0FERTtBQUVGQyxZQUFRLEVBQUVDLDJDQUFZQTtBQUZwQixHQURLO0FBS1hDLFFBQU0sRUFBTkEsNENBTFc7QUFNWEMsV0FBUyxFQUFFO0FBQ1BBLGFBQVMsRUFBVEEsMkNBRE87QUFFUEgsWUFBUSxFQUFFSSw0Q0FBaUJBO0FBRnBCO0FBTkEsQ0FBZiIsImZpbGUiOiIuL2FwcC9mb3Jtcy9pbmRleC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBGb3JtU3RhdGUsIHsgSW5zdGFuY2UgYXMgRm9ybVN0YXRlSW5zdGFuY2UgfSBmcm9tICcuL3N0YXRlJztcbmltcG9ydCBGb3JtLCB7IEluc3RhbmNlIGFzIEZvcm1JbnN0YW5jZSB9IGZyb20gJy4vZm9ybSc7XG5cbmltcG9ydCBGaWVsZHMgZnJvbSAnLi9maWVsZHMnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgRm9ybToge1xuICAgICAgICBGb3JtLFxuICAgICAgICBJbnN0YW5jZTogRm9ybUluc3RhbmNlXG4gICAgfSxcbiAgICBGaWVsZHMsXG4gICAgRm9ybVN0YXRlOiB7XG4gICAgICAgIEZvcm1TdGF0ZSxcbiAgICAgICAgSW5zdGFuY2U6IEZvcm1TdGF0ZUluc3RhbmNlXG4gICAgfVxufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./app/forms/index.js\n"); /***/ }), /***/ "./app/forms/state.js": -/*!****************************!* +/*!****************************!*\ !*** ./app/forms/state.js ***! \****************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => /* binding */ FormState,\n/* harmony export */ \"Instance\": () => /* binding */ Instance,\n/* harmony export */ \"DOMBehaviors\": () => /* binding */ DOMBehaviors\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var immutable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! immutable */ \"./node_modules/immutable/dist/immutable.js\");\n/* harmony import */ var immutable__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(immutable__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var immutablediff__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! immutablediff */ \"./node_modules/immutablediff/src/diff.js\");\n/* harmony import */ var immutablediff__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(immutablediff__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _utils_jquery_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/jquery-utils */ \"./app/utils/jquery-utils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\n\nvar FormLoadState = {};\nvar DOMBehaviors = {\n attach: function attach() {\n this.preventUnload();\n this.preventClickAway();\n },\n preventUnload: function preventUnload() {\n var selector = '[name=\"task\"][value^=\"save\"], [data-delete-action]';\n\n if (jquery__WEBPACK_IMPORTED_MODULE_0___default()._data(window, 'events') && (jquery__WEBPACK_IMPORTED_MODULE_0___default()._data(window, 'events').beforeunload || []).filter(function (event) {\n return event.namespace === '_grav';\n }).length) {\n return;\n } // Allow some elements to leave the page without native confirmation\n\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(selector).on('click._grav', function (event) {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(__webpack_require__.g).off('beforeunload');\n }); // Catch browser uri change / refresh attempt and stop it if the form state is dirty\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(__webpack_require__.g).on('beforeunload._grav', function () {\n if (Instance.equals() === false) {\n return 'You have made changes on this page that you have not yet confirmed. If you navigate away from this page you will lose your unsaved changes.';\n }\n });\n },\n preventClickAway: function preventClickAway() {\n var selector = 'a[href]:not([href^=\"#\"]):not([target=\"_blank\"]):not([href^=\"javascript:\"])';\n\n if (jquery__WEBPACK_IMPORTED_MODULE_0___default()._data(jquery__WEBPACK_IMPORTED_MODULE_0___default()(selector).get(0), 'events') && (jquery__WEBPACK_IMPORTED_MODULE_0___default()._data(jquery__WEBPACK_IMPORTED_MODULE_0___default()(selector).get(0), 'events').click || []).filter(function (event) {\n return event.namespace === '_grav';\n })) {\n return;\n } // Prevent clicking away if the form state is dirty\n // instead, display a confirmation before continuing\n\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(selector).on('click._grav', function (event) {\n var isClean = Instance.equals();\n\n if (isClean === null || isClean) {\n return true;\n }\n\n event.preventDefault();\n var destination = jquery__WEBPACK_IMPORTED_MODULE_0___default()(this).attr('href');\n var modal = jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-remodal-id=\"changes\"]');\n var lookup = (jquery__WEBPACK_IMPORTED_MODULE_0___default().remodal.lookup)[modal.data('remodal')];\n var buttons = jquery__WEBPACK_IMPORTED_MODULE_0___default()('a.button', modal);\n\n var handler = function handler(event) {\n event.preventDefault();\n var action = jquery__WEBPACK_IMPORTED_MODULE_0___default()(this).data('leave-action');\n buttons.off('click', handler);\n lookup.close();\n\n if (action === 'continue') {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(__webpack_require__.g).off('beforeunload');\n __webpack_require__.g.location.href = destination;\n }\n };\n\n buttons.on('click', handler);\n lookup.open();\n });\n }\n};\n\nvar FormState = /*#__PURE__*/function () {\n function FormState() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\n ignore: [],\n form_id: 'blueprints'\n };\n\n _classCallCheck(this, FormState);\n\n this.options = options;\n this.refresh();\n\n if (!this.form || !this.fields.length) {\n return;\n }\n\n FormLoadState = this.collect();\n this.loadState = FormLoadState;\n DOMBehaviors.attach();\n }\n\n _createClass(FormState, [{\n key: \"refresh\",\n value: function refresh() {\n this.form = jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"form#\".concat(this.options.form_id)).filter(':noparents(.remodal)');\n this.fields = jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"form#\".concat(this.options.form_id, \" *, [form=\\\"\").concat(this.options.form_id, \"\\\"]\")).filter(':input:not(.no-form)').filter(':noparents(.remodal)');\n return this;\n }\n }, {\n key: \"collect\",\n value: function collect() {\n var _this = this;\n\n if (!this.form || !this.fields.length) {\n return;\n }\n\n var values = {};\n this.refresh().fields.each(function (index, field) {\n field = jquery__WEBPACK_IMPORTED_MODULE_0___default()(field);\n var name = field.prop('name');\n var type = field.prop('type');\n var tag = field.prop('tagName').toLowerCase();\n var value;\n\n if (name.startsWith('toggleable_') || name === 'data[lang]' || name === 'data[redirect]') {\n return;\n }\n\n switch (type) {\n case 'checkbox':\n value = field.is(':checked');\n break;\n\n case 'radio':\n if (!field.is(':checked')) {\n return;\n }\n\n value = field.val();\n break;\n\n default:\n value = field.val();\n }\n\n if (tag === 'select' && value === null) {\n value = '';\n }\n\n if (Array.isArray(value)) {\n value = value.join('|');\n }\n\n if (name && !~_this.options.ignore.indexOf(name)) {\n values[name] = value;\n }\n });\n return immutable__WEBPACK_IMPORTED_MODULE_1___default().OrderedMap(values);\n }\n }, {\n key: \"diff\",\n value: function diff() {\n return immutablediff__WEBPACK_IMPORTED_MODULE_2___default()(FormLoadState, this.collect());\n } // When the form doesn't exist or there are no fields, `equals` returns `null`\n // for this reason, _NEVER_ check with !Instance.equals(), use Instance.equals() === false\n\n }, {\n key: \"equals\",\n value: function equals() {\n if (!this.form || !this.fields.length) {\n return null;\n }\n\n return immutable__WEBPACK_IMPORTED_MODULE_1___default().is(FormLoadState, this.collect());\n }\n }]);\n\n return FormState;\n}();\n\n\n;\nvar Instance = new FormState();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL2Zvcm1zL3N0YXRlLmpzPzY3ZTMiXSwibmFtZXMiOlsiRm9ybUxvYWRTdGF0ZSIsIkRPTUJlaGF2aW9ycyIsImF0dGFjaCIsInByZXZlbnRVbmxvYWQiLCJwcmV2ZW50Q2xpY2tBd2F5Iiwic2VsZWN0b3IiLCIkIiwid2luZG93IiwiYmVmb3JldW5sb2FkIiwiZmlsdGVyIiwiZXZlbnQiLCJuYW1lc3BhY2UiLCJsZW5ndGgiLCJvbiIsImdsb2JhbCIsIm9mZiIsIkluc3RhbmNlIiwiZXF1YWxzIiwiZ2V0IiwiY2xpY2siLCJpc0NsZWFuIiwicHJldmVudERlZmF1bHQiLCJkZXN0aW5hdGlvbiIsImF0dHIiLCJtb2RhbCIsImxvb2t1cCIsImRhdGEiLCJidXR0b25zIiwiaGFuZGxlciIsImFjdGlvbiIsImNsb3NlIiwibG9jYXRpb24iLCJocmVmIiwib3BlbiIsIkZvcm1TdGF0ZSIsIm9wdGlvbnMiLCJpZ25vcmUiLCJmb3JtX2lkIiwicmVmcmVzaCIsImZvcm0iLCJmaWVsZHMiLCJjb2xsZWN0IiwibG9hZFN0YXRlIiwidmFsdWVzIiwiZWFjaCIsImluZGV4IiwiZmllbGQiLCJuYW1lIiwicHJvcCIsInR5cGUiLCJ0YWciLCJ0b0xvd2VyQ2FzZSIsInZhbHVlIiwic3RhcnRzV2l0aCIsImlzIiwidmFsIiwiQXJyYXkiLCJpc0FycmF5Iiwiam9pbiIsImluZGV4T2YiLCJJbW11dGFibGUiLCJpbW11dGFibGVkaWZmIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQSxJQUFJQSxhQUFhLEdBQUcsRUFBcEI7QUFFQSxJQUFNQyxZQUFZLEdBQUc7QUFDakJDLFFBRGlCLG9CQUNSO0FBQ0wsU0FBS0MsYUFBTDtBQUNBLFNBQUtDLGdCQUFMO0FBQ0gsR0FKZ0I7QUFNakJELGVBTmlCLDJCQU1EO0FBQ1osUUFBSUUsUUFBUSxHQUFHLG9EQUFmOztBQUNBLFFBQUlDLG1EQUFB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Z0IsS0FBS3lDLE9BQUwsRUFBaEIsQ0FBcEI7QUFDSCxLLENBRUQ7QUFDQTs7Ozs2QkFDUztBQUNMLFVBQUksQ0FBQyxLQUFLRixJQUFOLElBQWMsQ0FBQyxLQUFLQyxNQUFMLENBQVk1QixNQUEvQixFQUF1QztBQUFFLGVBQU8sSUFBUDtBQUFjOztBQUN2RCxhQUFPZ0QsbURBQUEsQ0FBYTVELGFBQWIsRUFBNEIsS0FBS3lDLE9BQUwsRUFBNUIsQ0FBUDtBQUNIOzs7Ozs7O0FBQ0o7QUFFTSxJQUFJekIsUUFBUSxHQUFHLElBQUlrQixTQUFKLEVBQWYiLCJmaWxlIjoiLi9hcHAvZm9ybXMvc3RhdGUuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IEltbXV0YWJsZSBmcm9tICdpbW11dGFibGUnO1xuaW1wb3J0IGltbXV0YWJsZWRpZmYgZnJvbSAnaW1tdXRhYmxlZGlmZic7XG5pbXBvcnQgJy4uL3V0aWxzL2pxdWVyeS11dGlscyc7XG5cbmxldCBGb3JtTG9hZFN0YXRlID0ge307XG5cbmNvbnN0IERPTUJlaGF2aW9ycyA9IHtcbiAgICBhdHRhY2goKSB7XG4gICAgICAgIHRoaXMucHJldmVudFVubG9hZCgpO1xuICAgICAgICB0aGlzLnByZXZlbnRDbGlja0F3YXkoKTtcbiAgICB9LFxuXG4gICAgcHJldmVudFVubG9hZCgpIHtcbiAgICAgICAgbGV0IHNlbGVjdG9yID0gJ1tuYW1lPVwidGFza1wiXVt2YWx1ZV49XCJzYXZlXCJdLCBbZGF0YS1kZWxldGUtYWN0aW9uXSc7XG4gICAgICAgIGlmICgkLl9kYXRhKHdpbmRvdywgJ2V2ZW50cycpICYmICgkLl9kYXRhKHdpbmRvdywgJ2V2ZW50cycpLmJlZm9yZXVubG9hZCB8fCBbXSkuZmlsdGVyKChldmVudCkgPT4gZXZlbnQubmFtZXNwYWNlID09PSAnX2dyYXYnKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFsbG93IHNvbWUgZWxlbWVudHMgdG8gbGVhdmUgdGhlIHBhZ2Ugd2l0aG91dCBuYXRpdmUgY29uZmlybWF0aW9uXG4gICAgICAgICQoc2VsZWN0b3IpLm9uKCdjbGljay5fZ3JhdicsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICAkKGdsb2JhbCkub2ZmKCdiZWZvcmV1bmxvYWQnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQ2F0Y2ggYnJvd3NlciB1cmkgY2hhbmdlIC8gcmVmcmVzaCBhdHRlbXB0IGFuZCBzdG9wIGl0IGlmIHRoZSBmb3JtIHN0YXRlIGlzIGRpcnR5XG4gICAgICAgICQoZ2xvYmFsKS5vbignYmVmb3JldW5sb2FkLl9ncmF2JywgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKEluc3RhbmNlLmVxdWFscygpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnWW91IGhhdmUgbWFkZSBjaGFuZ2VzIG9uIHRoaXMgcGFnZSB0aGF0IHlvdSBoYXZlIG5vdCB5ZXQgY29uZmlybWVkLiBJZiB5b3UgbmF2aWdhdGUgYXdheSBmcm9tIHRoaXMgcGFnZSB5b3Ugd2lsbCBsb3NlIHlvdXIgdW5zYXZlZCBjaGFuZ2VzLic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBwcmV2ZW50Q2xpY2tBd2F5KCkge1xuICAgICAgICBsZXQgc2VsZWN0b3IgPSAnYVtocmVmXTpub3QoW2hyZWZePVwiI1wiXSk6bm90KFt0YXJnZXQ9XCJfYmxhbmtcIl0pOm5vdChbaHJlZl49XCJqYXZhc2NyaXB0OlwiXSknO1xuXG4gICAgICAgIGlmICgkLl9kYXRhKCQoc2VsZWN0b3IpLmdldCgwKSwgJ2V2ZW50cycpICYmICgkLl9kYXRhKCQoc2VsZWN0b3IpLmdldCgwKSwgJ2V2ZW50cycpLmNsaWNrIHx8IFtdKS5maWx0ZXIoKGV2ZW50KSA9PiBldmVudC5uYW1lc3BhY2UgPT09ICdfZ3JhdicpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQcmV2ZW50IGNsaWNraW5nIGF3YXkgaWYgdGhlIGZvcm0gc3RhdGUgaXMgZGlydHlcbiAgICAgICAgLy8gaW5zdGVhZCwgZGlzcGxheSBhIGNvbmZpcm1hdGlvbiBiZWZvcmUgY29udGludWluZ1xuICAgICAgICAkKHNlbGVjdG9yKS5vbignY2xpY2suX2dyYXYnLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgbGV0IGlzQ2xlYW4gPSBJbnN0YW5jZS5lcXVhbHMoKTtcbiAgICAgICAgICAgIGlmIChpc0NsZWFuID09PSBudWxsIHx8IGlzQ2xlYW4pIHsgcmV0dXJuIHRydWU7IH1cblxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgbGV0IGRlc3RpbmF0aW9uID0gJCh0aGlzKS5hdHRyKCdocmVmJyk7XG4gICAgICAgICAgICBsZXQgbW9kYWwgPSAkKCdbZGF0YS1yZW1vZGFsLWlkPVwiY2hhbmdlc1wiXScpO1xuICAgICAgICAgICAgbGV0IGxvb2t1cCA9ICQucmVtb2RhbC5sb29rdXBbbW9kYWwuZGF0YSgncmVtb2RhbCcpXTtcbiAgICAgICAgICAgIGxldCBidXR0b25zID0gJCgnYS5idXR0b24nLCBtb2RhbCk7XG5cbiAgICAgICAgICAgIGxldCBoYW5kbGVyID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGxldCBhY3Rpb24gPSAkKHRoaXMpLmRhdGEoJ2xlYXZlLWFjdGlvbicpO1xuXG4gICAgICAgICAgICAgICAgYnV0dG9ucy5vZmYoJ2NsaWNrJywgaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgbG9va3VwLmNsb3NlKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uID09PSAnY29udGludWUnKSB7XG4gICAgICAgICAgICAgICAgICAgICQoZ2xvYmFsKS5vZmYoJ2JlZm9yZXVubG9hZCcpO1xuICAgICAgICAgICAgICAgICAgICBnbG9iYWwubG9jYXRpb24uaHJlZiA9IGRlc3RpbmF0aW9uO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGJ1dHRvbnMub24oJ2NsaWNrJywgaGFuZGxlcik7XG4gICAgICAgICAgICBsb29rdXAub3BlbigpO1xuICAgICAgICB9KTtcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGb3JtU3RhdGUge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7XG4gICAgICAgIGlnbm9yZTogW10sXG4gICAgICAgIGZvcm1faWQ6ICdibHVlcHJpbnRzJ1xuICAgIH0pIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgdGhpcy5yZWZyZXNoKCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmZvcm0gfHwgIXRoaXMuZmllbGRzLmxlbmd0aCkgeyByZXR1cm47IH1cbiAgICAgICAgRm9ybUxvYWRTdGF0ZSA9IHRoaXMuY29sbGVjdCgpO1xuICAgICAgICB0aGlzLmxvYWRTdGF0ZSA9IEZvcm1Mb2FkU3RhdGU7XG4gICAgICAgIERPTUJlaGF2aW9ycy5hdHRhY2goKTtcbiAgICB9XG5cbiAgICByZWZyZXNoKCkge1xuICAgICAgICB0aGlzLmZvcm0gPSAkKGBmb3JtIyR7dGhpcy5vcHRpb25zLmZvcm1faWR9YCkuZmlsdGVyKCc6bm9wYXJlbnRzKC5yZW1vZGFsKScpO1xuICAgICAgICB0aGlzLmZpZWxkcyA9ICQoYGZvcm0jJHt0aGlzLm9wdGlvbnMuZm9ybV9pZH0gKiwgW2Zvcm09XCIke3RoaXMub3B0aW9ucy5mb3JtX2lkfVwiXWApLmZpbHRlcignOmlucHV0Om5vdCgubm8tZm9ybSknKS5maWx0ZXIoJzpub3BhcmVudHMoLnJlbW9kYWwpJyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgY29sbGVjdCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmZvcm0gfHwgIXRoaXMuZmllbGRzLmxlbmd0aCkgeyByZXR1cm47IH1cblxuICAgICAgICBsZXQgdmFsdWVzID0ge307XG4gICAgICAgIHRoaXMucmVmcmVzaCgpLmZpZWxkcy5lYWNoKChpbmRleCwgZmllbGQpID0+IHtcbiAgICAgICAgICAgIGZpZWxkID0gJChmaWVsZCk7XG4gICAgICAgICAgICBsZXQgbmFtZSA9IGZpZWxkLnByb3AoJ25hbWUnKTtcbiAgICAgICAgICAgIGxldCB0eXBlID0gZmllbGQucHJvcCgndHlwZScpO1xuICAgICAgICAgICAgbGV0IHRhZyA9IGZpZWxkLnByb3AoJ3RhZ05hbWUnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgbGV0IHZhbHVlO1xuXG4gICAgICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKCd0b2dnbGVhYmxlXycpIHx8IG5hbWUgPT09ICdkYXRhW2xhbmddJyB8fCBuYW1lID09PSAnZGF0YVtyZWRpcmVjdF0nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdjaGVja2JveCc6XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZmllbGQuaXMoJzpjaGVja2VkJyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3JhZGlvJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5pcygnOmNoZWNrZWQnKSkgeyByZXR1cm47IH1cbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBmaWVsZC52YWwoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBmaWVsZC52YWwoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRhZyA9PT0gJ3NlbGVjdCcgJiYgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9ICcnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLmpvaW4oJ3wnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG5hbWUgJiYgIX50aGlzLm9wdGlvbnMuaWdub3JlLmluZGV4T2YobmFtZSkpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZXNbbmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIEltbXV0YWJsZS5PcmRlcmVkTWFwKHZhbHVlcyk7XG4gICAgfVxuXG4gICAgZGlmZigpIHtcbiAgICAgICAgcmV0dXJuIGltbXV0YWJsZWRpZmYoRm9ybUxvYWRTdGF0ZSwgdGhpcy5jb2xsZWN0KCkpO1xuICAgIH1cblxuICAgIC8vIFdoZW4gdGhlIGZvcm0gZG9lc24ndCBleGlzdCBvciB0aGVyZSBhcmUgbm8gZmllbGRzLCBgZXF1YWxzYCByZXR1cm5zIGBudWxsYFxuICAgIC8vIGZvciB0aGlzIHJlYXNvbiwgX05FVkVSXyBjaGVjayB3aXRoICFJbnN0YW5jZS5lcXVhbHMoKSwgdXNlIEluc3RhbmNlLmVxdWFscygpID09PSBmYWxzZVxuICAgIGVxdWFscygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmZvcm0gfHwgIXRoaXMuZmllbGRzLmxlbmd0aCkgeyByZXR1cm4gbnVsbDsgfVxuICAgICAgICByZXR1cm4gSW1tdXRhYmxlLmlzKEZvcm1Mb2FkU3RhdGUsIHRoaXMuY29sbGVjdCgpKTtcbiAgICB9XG59O1xuXG5leHBvcnQgbGV0IEluc3RhbmNlID0gbmV3IEZvcm1TdGF0ZSgpO1xuXG5leHBvcnQgeyBET01CZWhhdmlvcnMgfTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./app/forms/state.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ FormState),\n/* harmony export */ \"Instance\": () => (/* binding */ Instance),\n/* harmony export */ \"DOMBehaviors\": () => (/* binding */ DOMBehaviors)\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var immutable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! immutable */ \"./node_modules/immutable/dist/immutable.js\");\n/* harmony import */ var immutable__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(immutable__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var immutablediff__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! immutablediff */ \"./node_modules/immutablediff/src/diff.js\");\n/* harmony import */ var immutablediff__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(immutablediff__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _utils_jquery_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/jquery-utils */ \"./app/utils/jquery-utils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\n\nvar FormLoadState = {};\nvar DOMBehaviors = {\n attach: function attach() {\n this.preventUnload();\n this.preventClickAway();\n },\n preventUnload: function preventUnload() {\n var selector = '[name=\"task\"][value^=\"save\"], [data-delete-action], [data-flex-safe-action]';\n\n if (jquery__WEBPACK_IMPORTED_MODULE_0___default()._data(window, 'events') && (jquery__WEBPACK_IMPORTED_MODULE_0___default()._data(window, 'events').beforeunload || []).filter(function (event) {\n return event.namespace === '_grav';\n }).length) {\n return;\n } // Allow some elements to leave the page without native confirmation\n\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(selector).on('click._grav', function (event) {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(__webpack_require__.g).off('beforeunload');\n }); // Catch browser uri change / refresh attempt and stop it if the form state is dirty\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(__webpack_require__.g).on('beforeunload._grav', function () {\n if (Instance.equals() === false) {\n return 'You have made changes on this page that you have not yet confirmed. If you navigate away from this page you will lose your unsaved changes.';\n }\n });\n },\n preventClickAway: function preventClickAway() {\n var selector = 'a[href]:not([href^=\"#\"]):not([target=\"_blank\"]):not([href^=\"javascript:\"])';\n\n if (jquery__WEBPACK_IMPORTED_MODULE_0___default()._data(jquery__WEBPACK_IMPORTED_MODULE_0___default()(selector).get(0), 'events') && (jquery__WEBPACK_IMPORTED_MODULE_0___default()._data(jquery__WEBPACK_IMPORTED_MODULE_0___default()(selector).get(0), 'events').click || []).filter(function (event) {\n return event.namespace === '_grav';\n })) {\n return;\n } // Prevent clicking away if the form state is dirty\n // instead, display a confirmation before continuing\n\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(selector).on('click._grav', function (event) {\n var isClean = Instance.equals();\n\n if (isClean === null || isClean) {\n return true;\n }\n\n event.preventDefault();\n var destination = jquery__WEBPACK_IMPORTED_MODULE_0___default()(this).attr('href');\n var modal = jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-remodal-id=\"changes\"]');\n var lookup = (jquery__WEBPACK_IMPORTED_MODULE_0___default().remodal.lookup)[modal.data('remodal')];\n var buttons = jquery__WEBPACK_IMPORTED_MODULE_0___default()('a.button', modal);\n\n var handler = function handler(event) {\n event.preventDefault();\n var action = jquery__WEBPACK_IMPORTED_MODULE_0___default()(this).data('leave-action');\n buttons.off('click', handler);\n lookup.close();\n\n if (action === 'continue') {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(__webpack_require__.g).off('beforeunload');\n __webpack_require__.g.location.href = destination;\n }\n };\n\n buttons.on('click', handler);\n lookup.open();\n });\n }\n};\n\nvar FormState = /*#__PURE__*/function () {\n function FormState() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\n ignore: [],\n form_id: 'blueprints'\n };\n\n _classCallCheck(this, FormState);\n\n this.options = options;\n this.refresh();\n\n if (!this.form || !this.fields.length) {\n return;\n }\n\n FormLoadState = this.collect();\n this.loadState = FormLoadState;\n DOMBehaviors.attach();\n }\n\n _createClass(FormState, [{\n key: \"refresh\",\n value: function refresh() {\n this.form = jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"form#\".concat(this.options.form_id)).filter(':noparents(.remodal)');\n this.fields = jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"form#\".concat(this.options.form_id, \" *, [form=\\\"\").concat(this.options.form_id, \"\\\"]\")).filter(':input:not(.no-form)').filter(':noparents(.remodal)');\n return this;\n }\n }, {\n key: \"collect\",\n value: function collect() {\n var _this = this;\n\n if (!this.form || !this.fields.length) {\n return;\n }\n\n var values = {};\n this.refresh().fields.each(function (index, field) {\n field = jquery__WEBPACK_IMPORTED_MODULE_0___default()(field);\n var name = field.prop('name');\n var type = field.prop('type');\n var tag = field.prop('tagName').toLowerCase();\n var value;\n\n if (name.startsWith('toggleable_') || name === 'data[lang]' || name === 'data[redirect]') {\n return;\n }\n\n switch (type) {\n case 'checkbox':\n value = field.is(':checked');\n break;\n\n case 'radio':\n if (!field.is(':checked')) {\n return;\n }\n\n value = field.val();\n break;\n\n default:\n value = field.val();\n }\n\n if (tag === 'select' && value === null) {\n value = '';\n }\n\n if (Array.isArray(value)) {\n value = value.join('|');\n }\n\n if (name && !~_this.options.ignore.indexOf(name)) {\n values[name] = value;\n }\n });\n return immutable__WEBPACK_IMPORTED_MODULE_1___default().OrderedMap(values);\n }\n }, {\n key: \"diff\",\n value: function diff() {\n return immutablediff__WEBPACK_IMPORTED_MODULE_2___default()(FormLoadState, this.collect());\n } // When the form doesn't exist or there are no fields, `equals` returns `null`\n // for this reason, _NEVER_ check with !Instance.equals(), use Instance.equals() === false\n\n }, {\n key: \"equals\",\n value: function equals() {\n if (!this.form || !this.fields.length) {\n return null;\n }\n\n return immutable__WEBPACK_IMPORTED_MODULE_1___default().is(FormLoadState, this.collect());\n }\n }]);\n\n return FormState;\n}();\n\n\n;\nvar Instance = new FormState();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL2Zvcm1zL3N0YXRlLmpzPzY3ZTMiXSwibmFtZXMiOlsiRm9ybUxvYWRTdGF0ZSIsIkRPTUJlaGF2aW9ycyIsImF0dGFjaCIsInByZXZlbnRVbmxvYWQiLCJwcmV2ZW50Q2xpY2tBd2F5Iiwic2VsZWN0b3IiLCIkIiwid2luZG93IiwiYmVmb3JldW5sb2FkIiwiZmlsdGVyIiwiZXZlbnQiLCJuYW1lc3BhY2UiLCJsZW5ndGgiLCJvbiIsImdsb2JhbCIsIm9mZiIsIkluc3RhbmNlIiwiZXF1YWxzIiwiZ2V0IiwiY2xpY2siLCJpc0NsZWFuIiwicHJldmVudERlZmF1bHQiLCJkZXN0aW5hdGlvbiIsImF0dHIiLCJtb2RhbCIsImxvb2t1cCIsImRhdGEiLCJidXR0b25zIiwiaGFuZGxlciIsImFjdGlvbiIsImNsb3NlIiwibG9jYXRpb24iLCJocmVmIiwib3BlbiIsIkZvcm1TdGF0ZSIsIm9wdGlvbnMiLCJpZ25vcmUiLCJmb3JtX2lkIiwicmVmcmVzaCIsImZvcm0iLCJmaWVsZHMiLCJjb2xsZWN0IiwibG9hZFN0YXRlIiwidmFsdWVzIiwiZWFjaCIsImluZGV4IiwiZmllbGQiLCJuYW1lIiwicHJvcCIsInR5cGUiLCJ0YWciLCJ0b0xvd2VyQ2FzZSIsInZhbHVlIiwic3RhcnRzV2l0aCIsImlzIiwidmFsIiwiQXJyYXkiLCJpc0FycmF5Iiwiam9pbiIsImluZGV4T2YiLCJJbW11dGFibGUiLCJpbW11dGFibGVkaWZmIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQSxJQUFJQSxhQUFhLEdBQUcsRUFBcEI7QUFFQSxJQUFNQyxZQUFZLEdBQUc7QUFDakJDLFFBRGlCLG9CQUNSO0FBQ0wsU0FBS0MsYUFBTDtBQUNBLFNBQUtDLGdCQUFMO0FBQ0gsR0FKZ0I7QUFNakJELGVBTmlCLDJCQU1EO0FBQ1osUUFBSUUsUUFBUSxHQUFHLDZFQUFmOztBQUNBLFFBQUlDLG1EQUFB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Q0FBQzdELGFBQUQsRUFBZ0IsS0FBS3lDLE9BQUwsRUFBaEIsQ0FBcEI7QUFDSCxLLENBRUQ7QUFDQTs7OztXQUNBLGtCQUFTO0FBQ0wsVUFBSSxDQUFDLEtBQUtGLElBQU4sSUFBYyxDQUFDLEtBQUtDLE1BQUwsQ0FBWTVCLE1BQS9CLEVBQXVDO0FBQUUsZUFBTyxJQUFQO0FBQWM7O0FBQ3ZELGFBQU9nRCxtREFBQSxDQUFhNUQsYUFBYixFQUE0QixLQUFLeUMsT0FBTCxFQUE1QixDQUFQO0FBQ0g7Ozs7Ozs7QUFDSjtBQUVNLElBQUl6QixRQUFRLEdBQUcsSUFBSWtCLFNBQUosRUFBZiIsImZpbGUiOiIuL2FwcC9mb3Jtcy9zdGF0ZS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgSW1tdXRhYmxlIGZyb20gJ2ltbXV0YWJsZSc7XG5pbXBvcnQgaW1tdXRhYmxlZGlmZiBmcm9tICdpbW11dGFibGVkaWZmJztcbmltcG9ydCAnLi4vdXRpbHMvanF1ZXJ5LXV0aWxzJztcblxubGV0IEZvcm1Mb2FkU3RhdGUgPSB7fTtcblxuY29uc3QgRE9NQmVoYXZpb3JzID0ge1xuICAgIGF0dGFjaCgpIHtcbiAgICAgICAgdGhpcy5wcmV2ZW50VW5sb2FkKCk7XG4gICAgICAgIHRoaXMucHJldmVudENsaWNrQXdheSgpO1xuICAgIH0sXG5cbiAgICBwcmV2ZW50VW5sb2FkKCkge1xuICAgICAgICBsZXQgc2VsZWN0b3IgPSAnW25hbWU9XCJ0YXNrXCJdW3ZhbHVlXj1cInNhdmVcIl0sIFtkYXRhLWRlbGV0ZS1hY3Rpb25dLCBbZGF0YS1mbGV4LXNhZmUtYWN0aW9uXSc7XG4gICAgICAgIGlmICgkLl9kYXRhKHdpbmRvdywgJ2V2ZW50cycpICYmICgkLl9kYXRhKHdpbmRvdywgJ2V2ZW50cycpLmJlZm9yZXVubG9hZCB8fCBbXSkuZmlsdGVyKChldmVudCkgPT4gZXZlbnQubmFtZXNwYWNlID09PSAnX2dyYXYnKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFsbG93IHNvbWUgZWxlbWVudHMgdG8gbGVhdmUgdGhlIHBhZ2Ugd2l0aG91dCBuYXRpdmUgY29uZmlybWF0aW9uXG4gICAgICAgICQoc2VsZWN0b3IpLm9uKCdjbGljay5fZ3JhdicsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICAkKGdsb2JhbCkub2ZmKCdiZWZvcmV1bmxvYWQnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQ2F0Y2ggYnJvd3NlciB1cmkgY2hhbmdlIC8gcmVmcmVzaCBhdHRlbXB0IGFuZCBzdG9wIGl0IGlmIHRoZSBmb3JtIHN0YXRlIGlzIGRpcnR5XG4gICAgICAgICQoZ2xvYmFsKS5vbignYmVmb3JldW5sb2FkLl9ncmF2JywgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKEluc3RhbmNlLmVxdWFscygpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnWW91IGhhdmUgbWFkZSBjaGFuZ2VzIG9uIHRoaXMgcGFnZSB0aGF0IHlvdSBoYXZlIG5vdCB5ZXQgY29uZmlybWVkLiBJZiB5b3UgbmF2aWdhdGUgYXdheSBmcm9tIHRoaXMgcGFnZSB5b3Ugd2lsbCBsb3NlIHlvdXIgdW5zYXZlZCBjaGFuZ2VzLic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBwcmV2ZW50Q2xpY2tBd2F5KCkge1xuICAgICAgICBsZXQgc2VsZWN0b3IgPSAnYVtocmVmXTpub3QoW2hyZWZePVwiI1wiXSk6bm90KFt0YXJnZXQ9XCJfYmxhbmtcIl0pOm5vdChbaHJlZl49XCJqYXZhc2NyaXB0OlwiXSknO1xuXG4gICAgICAgIGlmICgkLl9kYXRhKCQoc2VsZWN0b3IpLmdldCgwKSwgJ2V2ZW50cycpICYmICgkLl9kYXRhKCQoc2VsZWN0b3IpLmdldCgwKSwgJ2V2ZW50cycpLmNsaWNrIHx8IFtdKS5maWx0ZXIoKGV2ZW50KSA9PiBldmVudC5uYW1lc3BhY2UgPT09ICdfZ3JhdicpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQcmV2ZW50IGNsaWNraW5nIGF3YXkgaWYgdGhlIGZvcm0gc3RhdGUgaXMgZGlydHlcbiAgICAgICAgLy8gaW5zdGVhZCwgZGlzcGxheSBhIGNvbmZpcm1hdGlvbiBiZWZvcmUgY29udGludWluZ1xuICAgICAgICAkKHNlbGVjdG9yKS5vbignY2xpY2suX2dyYXYnLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgbGV0IGlzQ2xlYW4gPSBJbnN0YW5jZS5lcXVhbHMoKTtcbiAgICAgICAgICAgIGlmIChpc0NsZWFuID09PSBudWxsIHx8IGlzQ2xlYW4pIHsgcmV0dXJuIHRydWU7IH1cblxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgbGV0IGRlc3RpbmF0aW9uID0gJCh0aGlzKS5hdHRyKCdocmVmJyk7XG4gICAgICAgICAgICBsZXQgbW9kYWwgPSAkKCdbZGF0YS1yZW1vZGFsLWlkPVwiY2hhbmdlc1wiXScpO1xuICAgICAgICAgICAgbGV0IGxvb2t1cCA9ICQucmVtb2RhbC5sb29rdXBbbW9kYWwuZGF0YSgncmVtb2RhbCcpXTtcbiAgICAgICAgICAgIGxldCBidXR0b25zID0gJCgnYS5idXR0b24nLCBtb2RhbCk7XG5cbiAgICAgICAgICAgIGxldCBoYW5kbGVyID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGxldCBhY3Rpb24gPSAkKHRoaXMpLmRhdGEoJ2xlYXZlLWFjdGlvbicpO1xuXG4gICAgICAgICAgICAgICAgYnV0dG9ucy5vZmYoJ2NsaWNrJywgaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgbG9va3VwLmNsb3NlKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uID09PSAnY29udGludWUnKSB7XG4gICAgICAgICAgICAgICAgICAgICQoZ2xvYmFsKS5vZmYoJ2JlZm9yZXVubG9hZCcpO1xuICAgICAgICAgICAgICAgICAgICBnbG9iYWwubG9jYXRpb24uaHJlZiA9IGRlc3RpbmF0aW9uO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGJ1dHRvbnMub24oJ2NsaWNrJywgaGFuZGxlcik7XG4gICAgICAgICAgICBsb29rdXAub3BlbigpO1xuICAgICAgICB9KTtcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGb3JtU3RhdGUge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7XG4gICAgICAgIGlnbm9yZTogW10sXG4gICAgICAgIGZvcm1faWQ6ICdibHVlcHJpbnRzJ1xuICAgIH0pIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgdGhpcy5yZWZyZXNoKCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmZvcm0gfHwgIXRoaXMuZmllbGRzLmxlbmd0aCkgeyByZXR1cm47IH1cbiAgICAgICAgRm9ybUxvYWRTdGF0ZSA9IHRoaXMuY29sbGVjdCgpO1xuICAgICAgICB0aGlzLmxvYWRTdGF0ZSA9IEZvcm1Mb2FkU3RhdGU7XG4gICAgICAgIERPTUJlaGF2aW9ycy5hdHRhY2goKTtcbiAgICB9XG5cbiAgICByZWZyZXNoKCkge1xuICAgICAgICB0aGlzLmZvcm0gPSAkKGBmb3JtIyR7dGhpcy5vcHRpb25zLmZvcm1faWR9YCkuZmlsdGVyKCc6bm9wYXJlbnRzKC5yZW1vZGFsKScpO1xuICAgICAgICB0aGlzLmZpZWxkcyA9ICQoYGZvcm0jJHt0aGlzLm9wdGlvbnMuZm9ybV9pZH0gKiwgW2Zvcm09XCIke3RoaXMub3B0aW9ucy5mb3JtX2lkfVwiXWApLmZpbHRlcignOmlucHV0Om5vdCgubm8tZm9ybSknKS5maWx0ZXIoJzpub3BhcmVudHMoLnJlbW9kYWwpJyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgY29sbGVjdCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmZvcm0gfHwgIXRoaXMuZmllbGRzLmxlbmd0aCkgeyByZXR1cm47IH1cblxuICAgICAgICBsZXQgdmFsdWVzID0ge307XG4gICAgICAgIHRoaXMucmVmcmVzaCgpLmZpZWxkcy5lYWNoKChpbmRleCwgZmllbGQpID0+IHtcbiAgICAgICAgICAgIGZpZWxkID0gJChmaWVsZCk7XG4gICAgICAgICAgICBsZXQgbmFtZSA9IGZpZWxkLnByb3AoJ25hbWUnKTtcbiAgICAgICAgICAgIGxldCB0eXBlID0gZmllbGQucHJvcCgndHlwZScpO1xuICAgICAgICAgICAgbGV0IHRhZyA9IGZpZWxkLnByb3AoJ3RhZ05hbWUnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgbGV0IHZhbHVlO1xuXG4gICAgICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKCd0b2dnbGVhYmxlXycpIHx8IG5hbWUgPT09ICdkYXRhW2xhbmddJyB8fCBuYW1lID09PSAnZGF0YVtyZWRpcmVjdF0nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdjaGVja2JveCc6XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZmllbGQuaXMoJzpjaGVja2VkJyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3JhZGlvJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5pcygnOmNoZWNrZWQnKSkgeyByZXR1cm47IH1cbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBmaWVsZC52YWwoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBmaWVsZC52YWwoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRhZyA9PT0gJ3NlbGVjdCcgJiYgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9ICcnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLmpvaW4oJ3wnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG5hbWUgJiYgIX50aGlzLm9wdGlvbnMuaWdub3JlLmluZGV4T2YobmFtZSkpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZXNbbmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIEltbXV0YWJsZS5PcmRlcmVkTWFwKHZhbHVlcyk7XG4gICAgfVxuXG4gICAgZGlmZigpIHtcbiAgICAgICAgcmV0dXJuIGltbXV0YWJsZWRpZmYoRm9ybUxvYWRTdGF0ZSwgdGhpcy5jb2xsZWN0KCkpO1xuICAgIH1cblxuICAgIC8vIFdoZW4gdGhlIGZvcm0gZG9lc24ndCBleGlzdCBvciB0aGVyZSBhcmUgbm8gZmllbGRzLCBgZXF1YWxzYCByZXR1cm5zIGBudWxsYFxuICAgIC8vIGZvciB0aGlzIHJlYXNvbiwgX05FVkVSXyBjaGVjayB3aXRoICFJbnN0YW5jZS5lcXVhbHMoKSwgdXNlIEluc3RhbmNlLmVxdWFscygpID09PSBmYWxzZVxuICAgIGVxdWFscygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmZvcm0gfHwgIXRoaXMuZmllbGRzLmxlbmd0aCkgeyByZXR1cm4gbnVsbDsgfVxuICAgICAgICByZXR1cm4gSW1tdXRhYmxlLmlzKEZvcm1Mb2FkU3RhdGUsIHRoaXMuY29sbGVjdCgpKTtcbiAgICB9XG59O1xuXG5leHBvcnQgbGV0IEluc3RhbmNlID0gbmV3IEZvcm1TdGF0ZSgpO1xuXG5leHBvcnQgeyBET01CZWhhdmlvcnMgfTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./app/forms/state.js\n"); /***/ }), /***/ "./app/main.js": -/*!*********************!* +/*!*********************!*\ !*** ./app/main.js ***! \*********************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => __WEBPACK_DEFAULT_EXPORT__\n/* harmony export */ });\n/* harmony import */ var _babel_polyfill__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/polyfill */ \"./node_modules/@babel/polyfill/lib/index.js\");\n/* harmony import */ var _babel_polyfill__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_polyfill__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _utils_remodal__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils/remodal */ \"./app/utils/remodal.js\");\n/* harmony import */ var simplebar__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! simplebar */ \"./node_modules/simplebar/dist/simplebar.esm.js\");\n/* harmony import */ var _utils_gpm__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./utils/gpm */ \"./app/utils/gpm.js\");\n/* harmony import */ var _utils_keepalive__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./utils/keepalive */ \"./app/utils/keepalive.js\");\n/* harmony import */ var _updates__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./updates */ \"./app/updates/index.js\");\n/* harmony import */ var _dashboard__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./dashboard */ \"./app/dashboard/index.js\");\n/* harmony import */ var _pages__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./pages */ \"./app/pages/index.js\");\n/* harmony import */ var _forms__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./forms */ \"./app/forms/index.js\");\n/* harmony import */ var _utils_cookies__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./utils/cookies */ \"./app/utils/cookies.js\");\n/* harmony import */ var _plugins__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./plugins */ \"./app/plugins/index.js\");\n/* harmony import */ var _themes__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./themes */ \"./app/themes/index.js\");\n/* harmony import */ var _media__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./media */ \"./app/media/index.js\");\n/* harmony import */ var _utils_toastr__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./utils/toastr */ \"./app/utils/toastr.js\");\n/* harmony import */ var _utils_request__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./utils/request */ \"./app/utils/request.js\");\n/* harmony import */ var _utils_2fa__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./utils/2fa */ \"./app/utils/2fa.js\");\n/* harmony import */ var _tools__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./tools */ \"./app/tools/index.js\");\n/* harmony import */ var _whitelabel__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./whitelabel */ \"./app/whitelabel/index.js\");\n/* harmony import */ var _utils_bootstrap_transition__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./utils/bootstrap-transition */ \"./app/utils/bootstrap-transition.js\");\n/* harmony import */ var _utils_bootstrap_collapse__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./utils/bootstrap-collapse */ \"./app/utils/bootstrap-collapse.js\");\n/* harmony import */ var _utils_bootstrap_dropdown__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./utils/bootstrap-dropdown */ \"./app/utils/bootstrap-dropdown.js\");\n/* harmony import */ var _utils_tabs_memory__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./utils/tabs-memory */ \"./app/utils/tabs-memory.js\");\n/* harmony import */ var _utils_changelog__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./utils/changelog */ \"./app/utils/changelog.js\");\n/* harmony import */ var _utils_sidebar__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./utils/sidebar */ \"./app/utils/sidebar.js\");\n// polyfills\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n // bootstrap jQuery extensions\n\n\n\n // tabs memory\n\n // changelog\n\n // Main Sidebar\n\n // starts the keep alive, auto runs every X seconds\n\n_utils_keepalive__WEBPACK_IMPORTED_MODULE_5__.default.start(); // global event to catch sidebar_state changes\n\njquery__WEBPACK_IMPORTED_MODULE_1___default()(__webpack_require__.g).on('sidebar_state._grav', function () {\n Object.keys(_dashboard__WEBPACK_IMPORTED_MODULE_7__.default.Chart.Instances).forEach(function (chart) {\n setTimeout(function () {\n return _dashboard__WEBPACK_IMPORTED_MODULE_7__.default.Chart.Instances[chart].chart.update();\n }, 10);\n });\n});\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n GPM: {\n GPM: _utils_gpm__WEBPACK_IMPORTED_MODULE_4__.default,\n Instance: _utils_gpm__WEBPACK_IMPORTED_MODULE_4__.Instance\n },\n KeepAlive: _utils_keepalive__WEBPACK_IMPORTED_MODULE_5__.default,\n Dashboard: _dashboard__WEBPACK_IMPORTED_MODULE_7__.default,\n Pages: _pages__WEBPACK_IMPORTED_MODULE_8__.default,\n Forms: _forms__WEBPACK_IMPORTED_MODULE_9__.default,\n Updates: {\n Updates: _updates__WEBPACK_IMPORTED_MODULE_6__.default,\n Notifications: _updates__WEBPACK_IMPORTED_MODULE_6__.Notifications,\n Feed: _updates__WEBPACK_IMPORTED_MODULE_6__.Feed,\n Instance: _updates__WEBPACK_IMPORTED_MODULE_6__.Instance\n },\n Sidebar: {\n Sidebar: _utils_sidebar__WEBPACK_IMPORTED_MODULE_24__.default,\n Instance: _utils_sidebar__WEBPACK_IMPORTED_MODULE_24__.Instance\n },\n MediaFilter: {\n MediaFilter: _media__WEBPACK_IMPORTED_MODULE_13__.default,\n Instance: _media__WEBPACK_IMPORTED_MODULE_13__.Instance\n },\n Scrollbar: {\n Scrollbar: {\n deprecated: true\n },\n Instance: {\n deprecated: true\n }\n },\n Utils: {\n request: _utils_request__WEBPACK_IMPORTED_MODULE_15__.default,\n toastr: _utils_toastr__WEBPACK_IMPORTED_MODULE_14__.default,\n Cookies: _utils_cookies__WEBPACK_IMPORTED_MODULE_10__.default\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL21haW4uanM/ZjE2MSJdLCJuYW1lcyI6WyJLZWVwQWxpdmUiLCIkIiwiZ2xvYmFsIiwib24iLCJPYmplY3QiLCJrZXlzIiwiRGFzaGJvYXJkIiwiZm9yRWFjaCIsImNoYXJ0Iiwic2V0VGltZW91dCIsInVwZGF0ZSIsIkdQTSIsIkluc3RhbmNlIiwiZ3BtIiwiUGFnZXMiLCJGb3JtcyIsIlVwZGF0ZXMiLCJOb3RpZmljYXRpb25zIiwiRmVlZCIsInVwZGF0ZXMiLCJTaWRlYmFyIiwic2lkZWJhciIsIk1lZGlhRmlsdGVyIiwiTWVkaWFGaWx0ZXJJbnN0YW5jZSIsIlNjcm9sbGJhciIsImRlcHJlY2F0ZWQiLCJVdGlscyIsInJlcXVlc3QiLCJ0b2FzdHIiLCJDb29raWVzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Q0FHQTs7QUFDQTtBQUNBO0NBR0E7O0NBR0E7O0NBR0E7O0NBR0E7O0FBQ0FBLDJEQUFBLEcsQ0FFQTs7QUFDQUMsNkNBQUMsQ0FBQ0MscUJBQUQsQ0FBRCxDQUFVQyxFQUFWLENBQWEscUJBQWIsRUFBb0MsWUFBTTtBQUN0Q0MsUUFBTSxDQUFDQyxJQUFQLENBQVlDLCtEQUFaLEVBQXVDQyxPQUF2QyxDQUErQyxVQUFDQyxLQUFELEVBQVc7QUFDdERDLGNBQVUsQ0FBQztBQUFBLGFBQU1ILCtEQUFBLENBQTBCRSxLQUExQixFQUFpQ0EsS0FBakMsQ0FBdUNFLE1BQXZDLEVBQU47QUFBQSxLQUFELEVBQXdELEVBQXhELENBQVY7QUFDSCxHQUZEO0FBR0gsQ0FKRDtBQU1BLGlFQUFlO0FBQ1hDLEtBQUcsRUFBRTtBQUNEQSxPQUFHLEVBQUhBLCtDQURDO0FBRURDLFlBQVEsRUFBRUMsZ0RBQUdBO0FBRlosR0FETTtBQUtYYixXQUFTLEVBQVRBLHFEQUxXO0FBTVhNLFdBQVMsRUFBVEEsK0NBTlc7QUFPWFEsT0FBSyxFQUFMQSwyQ0FQVztBQVFYQyxPQUFLLEVBQUxBLDJDQVJXO0FBU1hDLFNBQU8sRUFBRTtBQUNMQSxXQUFPLEVBQVBBLDZDQURLO0FBRUxDLGlCQUFhLEVBQWJBLG1EQUZLO0FBR0xDLFFBQUksRUFBSkEsMENBSEs7QUFJTE4sWUFBUSxFQUFFTyw4Q0FBT0E7QUFKWixHQVRFO0FBZVhDLFNBQU8sRUFBRTtBQUNMQSxXQUFPLEVBQVBBLG9EQURLO0FBRUxSLFlBQVEsRUFBRVMscURBQU9BO0FBRlosR0FmRTtBQW1CWEMsYUFBVyxFQUFFO0FBQ1RBLGVBQVcsRUFBWEEsNENBRFM7QUFFVFYsWUFBUSxFQUFFVyw2Q0FBbUJBO0FBRnBCLEdBbkJGO0FBdUJYQyxXQUFTLEVBQUU7QUFBRUEsYUFBUyxFQUFFO0FBQUVDLGdCQUFVLEVBQUU7QUFBZCxLQUFiO0FBQW1DYixZQUFRLEVBQUU7QUFBRWEsZ0JBQVUsRUFBRTtBQUFkO0FBQTdDLEdBdkJBO0FBd0JYQyxPQUFLLEVBQUU7QUFBRUMsV0FBTyxFQUFQQSxvREFBRjtBQUFXQyxVQUFNLEVBQU5BLG1EQUFYO0FBQW1CQyxXQUFPLEVBQVBBLG9EQUFPQTtBQUExQjtBQXhCSSxDQUFmIiwiZmlsZSI6Ii4vYXBwL21haW4uanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBwb2x5ZmlsbHNcbmltcG9ydCAnQGJhYmVsL3BvbHlmaWxsJztcblxuaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCAnLi91dGlscy9yZW1vZGFsJztcbmltcG9ydCAnc2ltcGxlYmFyJztcbmltcG9ydCBHUE0sIHsgSW5zdGFuY2UgYXMgZ3BtIH0gZnJvbSAnLi91dGlscy9ncG0nO1xuaW1wb3J0IEtlZXBBbGl2ZSBmcm9tICcuL3V0aWxzL2tlZXBhbGl2ZSc7XG5pbXBvcnQgVXBkYXRlcywgeyBJbnN0YW5jZSBhcyB1cGRhdGVzLCBOb3RpZmljYXRpb25zLCBGZWVkIH0gZnJvbSAnLi91cGRhdGVzJztcbmltcG9ydCBEYXNoYm9hcmQgZnJvbSAnLi9kYXNoYm9hcmQnO1xuaW1wb3J0IFBhZ2VzIGZyb20gJy4vcGFnZXMnO1xuaW1wb3J0IEZvcm1zIGZyb20gJy4vZm9ybXMnO1xuaW1wb3J0IENvb2tpZXMgZnJvbSAnLi91dGlscy9jb29raWVzJztcbmltcG9ydCAnLi9wbHVnaW5zJztcbmltcG9ydCAnLi90aGVtZXMnO1xuaW1wb3J0IE1lZGlhRmlsdGVyLCB7IEluc3RhbmNlIGFzIE1lZGlhRmlsdGVySW5zdGFuY2V9IGZyb20gJy4vbWVkaWEnO1xuaW1wb3J0IHRvYXN0ciBmcm9tICcuL3V0aWxzL3RvYXN0cic7XG5pbXBvcnQgcmVxdWVzdCBmcm9tICcuL3V0aWxzL3JlcXVlc3QnO1xuaW1wb3J0ICcuL3V0aWxzLzJmYSc7XG5pbXBvcnQgJy4vdG9vbHMnO1xuaW1wb3J0ICcuL3doaXRlbGFiZWwnO1xuXG4vLyBib290c3RyYXAgalF1ZXJ5IGV4dGVuc2lvbnNcbmltcG9ydCAnLi91dGlscy9ib290c3RyYXAtdHJhbnNpdGlvbic7XG5pbXBvcnQgJy4vdXRpbHMvYm9vdHN0cmFwLWNvbGxhcHNlJztcbmltcG9ydCAnLi91dGlscy9ib290c3RyYXAtZHJvcGRvd24nO1xuXG4vLyB0YWJzIG1lbW9yeVxuaW1wb3J0ICcuL3V0aWxzL3RhYnMtbWVtb3J5JztcblxuLy8gY2hhbmdlbG9nXG5pbXBvcnQgJy4vdXRpbHMvY2hhbmdlbG9nJztcblxuLy8gTWFpbiBTaWRlYmFyXG5pbXBvcnQgU2lkZWJhciwgeyBJbnN0YW5jZSBhcyBzaWRlYmFyIH0gZnJvbSAnLi91dGlscy9zaWRlYmFyJztcblxuLy8gc3RhcnRzIHRoZSBrZWVwIGFsaXZlLCBhdXRvIHJ1bnMgZXZlcnkgWCBzZWNvbmRzXG5LZWVwQWxpdmUuc3RhcnQoKTtcblxuLy8gZ2xvYmFsIGV2ZW50IHRvIGNhdGNoIHNpZGViYXJfc3RhdGUgY2hhbmdlc1xuJChnbG9iYWwpLm9uKCdzaWRlYmFyX3N0YXRlLl9ncmF2JywgKCkgPT4ge1xuICAgIE9iamVjdC5rZXlzKERhc2hib2FyZC5DaGFydC5JbnN0YW5jZXMpLmZvckVhY2goKGNoYXJ0KSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gRGFzaGJvYXJkLkNoYXJ0Lkluc3RhbmNlc1tjaGFydF0uY2hhcnQudXBkYXRlKCksIDEwKTtcbiAgICB9KTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgR1BNOiB7XG4gICAgICAgIEdQTSxcbiAgICAgICAgSW5zdGFuY2U6IGdwbVxuICAgIH0sXG4gICAgS2VlcEFsaXZlLFxuICAgIERhc2hib2FyZCxcbiAgICBQYWdlcyxcbiAgICBGb3JtcyxcbiAgICBVcGRhdGVzOiB7XG4gICAgICAgIFVwZGF0ZXMsXG4gICAgICAgIE5vdGlmaWNhdGlvbnMsXG4gICAgICAgIEZlZWQsXG4gICAgICAgIEluc3RhbmNlOiB1cGRhdGVzXG4gICAgfSxcbiAgICBTaWRlYmFyOiB7XG4gICAgICAgIFNpZGViYXIsXG4gICAgICAgIEluc3RhbmNlOiBzaWRlYmFyXG4gICAgfSxcbiAgICBNZWRpYUZpbHRlcjoge1xuICAgICAgICBNZWRpYUZpbHRlcixcbiAgICAgICAgSW5zdGFuY2U6IE1lZGlhRmlsdGVySW5zdGFuY2VcbiAgICB9LFxuICAgIFNjcm9sbGJhcjogeyBTY3JvbGxiYXI6IHsgZGVwcmVjYXRlZDogdHJ1ZSB9LCBJbnN0YW5jZTogeyBkZXByZWNhdGVkOiB0cnVlIH0gfSxcbiAgICBVdGlsczogeyByZXF1ZXN0LCB0b2FzdHIsIENvb2tpZXMgfVxufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./app/main.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _babel_polyfill__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/polyfill */ \"./node_modules/@babel/polyfill/lib/index.js\");\n/* harmony import */ var _babel_polyfill__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_polyfill__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _utils_remodal__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils/remodal */ \"./app/utils/remodal.js\");\n/* harmony import */ var simplebar__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! simplebar */ \"./node_modules/simplebar/dist/simplebar.esm.js\");\n/* harmony import */ var _utils_gpm__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./utils/gpm */ \"./app/utils/gpm.js\");\n/* harmony import */ var _utils_keepalive__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./utils/keepalive */ \"./app/utils/keepalive.js\");\n/* harmony import */ var _updates__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./updates */ \"./app/updates/index.js\");\n/* harmony import */ var _dashboard__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./dashboard */ \"./app/dashboard/index.js\");\n/* harmony import */ var _pages__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./pages */ \"./app/pages/index.js\");\n/* harmony import */ var _forms__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./forms */ \"./app/forms/index.js\");\n/* harmony import */ var _utils_cookies__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./utils/cookies */ \"./app/utils/cookies.js\");\n/* harmony import */ var _plugins__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./plugins */ \"./app/plugins/index.js\");\n/* harmony import */ var _themes__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./themes */ \"./app/themes/index.js\");\n/* harmony import */ var _media__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./media */ \"./app/media/index.js\");\n/* harmony import */ var _utils_toastr__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./utils/toastr */ \"./app/utils/toastr.js\");\n/* harmony import */ var _utils_request__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./utils/request */ \"./app/utils/request.js\");\n/* harmony import */ var _utils_2fa__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./utils/2fa */ \"./app/utils/2fa.js\");\n/* harmony import */ var _tools__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./tools */ \"./app/tools/index.js\");\n/* harmony import */ var _whitelabel__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./whitelabel */ \"./app/whitelabel/index.js\");\n/* harmony import */ var _utils_bootstrap_transition__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./utils/bootstrap-transition */ \"./app/utils/bootstrap-transition.js\");\n/* harmony import */ var _utils_bootstrap_collapse__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./utils/bootstrap-collapse */ \"./app/utils/bootstrap-collapse.js\");\n/* harmony import */ var _utils_bootstrap_dropdown__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./utils/bootstrap-dropdown */ \"./app/utils/bootstrap-dropdown.js\");\n/* harmony import */ var _utils_tabs_memory__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./utils/tabs-memory */ \"./app/utils/tabs-memory.js\");\n/* harmony import */ var _utils_changelog__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./utils/changelog */ \"./app/utils/changelog.js\");\n/* harmony import */ var _utils_sidebar__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./utils/sidebar */ \"./app/utils/sidebar.js\");\n// polyfills\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n // bootstrap jQuery extensions\n\n\n\n // tabs memory\n\n // changelog\n\n // Main Sidebar\n\n // starts the keep alive, auto runs every X seconds\n\n_utils_keepalive__WEBPACK_IMPORTED_MODULE_5__.default.start(); // global event to catch sidebar_state changes\n\njquery__WEBPACK_IMPORTED_MODULE_1___default()(__webpack_require__.g).on('sidebar_state._grav', function () {\n Object.keys(_dashboard__WEBPACK_IMPORTED_MODULE_7__.default.Chart.Instances).forEach(function (chart) {\n setTimeout(function () {\n return _dashboard__WEBPACK_IMPORTED_MODULE_7__.default.Chart.Instances[chart].chart.update();\n }, 10);\n });\n});\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n GPM: {\n GPM: _utils_gpm__WEBPACK_IMPORTED_MODULE_4__.default,\n Instance: _utils_gpm__WEBPACK_IMPORTED_MODULE_4__.Instance\n },\n KeepAlive: _utils_keepalive__WEBPACK_IMPORTED_MODULE_5__.default,\n Dashboard: _dashboard__WEBPACK_IMPORTED_MODULE_7__.default,\n Pages: _pages__WEBPACK_IMPORTED_MODULE_8__.default,\n Forms: _forms__WEBPACK_IMPORTED_MODULE_9__.default,\n Updates: {\n Updates: _updates__WEBPACK_IMPORTED_MODULE_6__.default,\n Notifications: _updates__WEBPACK_IMPORTED_MODULE_6__.Notifications,\n Feed: _updates__WEBPACK_IMPORTED_MODULE_6__.Feed,\n Instance: _updates__WEBPACK_IMPORTED_MODULE_6__.Instance\n },\n Sidebar: {\n Sidebar: _utils_sidebar__WEBPACK_IMPORTED_MODULE_24__.default,\n Instance: _utils_sidebar__WEBPACK_IMPORTED_MODULE_24__.Instance\n },\n MediaFilter: {\n MediaFilter: _media__WEBPACK_IMPORTED_MODULE_13__.default,\n Instance: _media__WEBPACK_IMPORTED_MODULE_13__.Instance\n },\n Scrollbar: {\n Scrollbar: {\n deprecated: true\n },\n Instance: {\n deprecated: true\n }\n },\n Utils: {\n request: _utils_request__WEBPACK_IMPORTED_MODULE_15__.default,\n toastr: _utils_toastr__WEBPACK_IMPORTED_MODULE_14__.default,\n Cookies: _utils_cookies__WEBPACK_IMPORTED_MODULE_10__.default\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL21haW4uanM/ZjE2MSJdLCJuYW1lcyI6WyJLZWVwQWxpdmUiLCIkIiwiZ2xvYmFsIiwib24iLCJPYmplY3QiLCJrZXlzIiwiRGFzaGJvYXJkIiwiZm9yRWFjaCIsImNoYXJ0Iiwic2V0VGltZW91dCIsInVwZGF0ZSIsIkdQTSIsIkluc3RhbmNlIiwiZ3BtIiwiUGFnZXMiLCJGb3JtcyIsIlVwZGF0ZXMiLCJOb3RpZmljYXRpb25zIiwiRmVlZCIsInVwZGF0ZXMiLCJTaWRlYmFyIiwic2lkZWJhciIsIk1lZGlhRmlsdGVyIiwiTWVkaWFGaWx0ZXJJbnN0YW5jZSIsIlNjcm9sbGJhciIsImRlcHJlY2F0ZWQiLCJVdGlscyIsInJlcXVlc3QiLCJ0b2FzdHIiLCJDb29raWVzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Q0FHQTs7QUFDQTtBQUNBO0NBR0E7O0NBR0E7O0NBR0E7O0NBR0E7O0FBQ0FBLDJEQUFBLEcsQ0FFQTs7QUFDQUMsNkNBQUMsQ0FBQ0MscUJBQUQsQ0FBRCxDQUFVQyxFQUFWLENBQWEscUJBQWIsRUFBb0MsWUFBTTtBQUN0Q0MsUUFBTSxDQUFDQyxJQUFQLENBQVlDLCtEQUFaLEVBQXVDQyxPQUF2QyxDQUErQyxVQUFDQyxLQUFELEVBQVc7QUFDdERDLGNBQVUsQ0FBQztBQUFBLGFBQU1ILCtEQUFBLENBQTBCRSxLQUExQixFQUFpQ0EsS0FBakMsQ0FBdUNFLE1BQXZDLEVBQU47QUFBQSxLQUFELEVBQXdELEVBQXhELENBQVY7QUFDSCxHQUZEO0FBR0gsQ0FKRDtBQU1BLGlFQUFlO0FBQ1hDLEtBQUcsRUFBRTtBQUNEQSxPQUFHLEVBQUhBLCtDQURDO0FBRURDLFlBQVEsRUFBRUMsZ0RBQUdBO0FBRlosR0FETTtBQUtYYixXQUFTLEVBQVRBLHFEQUxXO0FBTVhNLFdBQVMsRUFBVEEsK0NBTlc7QUFPWFEsT0FBSyxFQUFMQSwyQ0FQVztBQVFYQyxPQUFLLEVBQUxBLDJDQVJXO0FBU1hDLFNBQU8sRUFBRTtBQUNMQSxXQUFPLEVBQVBBLDZDQURLO0FBRUxDLGlCQUFhLEVBQWJBLG1EQUZLO0FBR0xDLFFBQUksRUFBSkEsMENBSEs7QUFJTE4sWUFBUSxFQUFFTyw4Q0FBT0E7QUFKWixHQVRFO0FBZVhDLFNBQU8sRUFBRTtBQUNMQSxXQUFPLEVBQVBBLG9EQURLO0FBRUxSLFlBQVEsRUFBRVMscURBQU9BO0FBRlosR0FmRTtBQW1CWEMsYUFBVyxFQUFFO0FBQ1RBLGVBQVcsRUFBWEEsNENBRFM7QUFFVFYsWUFBUSxFQUFFVyw2Q0FBbUJBO0FBRnBCLEdBbkJGO0FBdUJYQyxXQUFTLEVBQUU7QUFBRUEsYUFBUyxFQUFFO0FBQUVDLGdCQUFVLEVBQUU7QUFBZCxLQUFiO0FBQW1DYixZQUFRLEVBQUU7QUFBRWEsZ0JBQVUsRUFBRTtBQUFkO0FBQTdDLEdBdkJBO0FBd0JYQyxPQUFLLEVBQUU7QUFBRUMsV0FBTyxFQUFQQSxvREFBRjtBQUFXQyxVQUFNLEVBQU5BLG1EQUFYO0FBQW1CQyxXQUFPLEVBQVBBLG9EQUFPQTtBQUExQjtBQXhCSSxDQUFmIiwiZmlsZSI6Ii4vYXBwL21haW4uanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBwb2x5ZmlsbHNcbmltcG9ydCAnQGJhYmVsL3BvbHlmaWxsJztcblxuaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCAnLi91dGlscy9yZW1vZGFsJztcbmltcG9ydCAnc2ltcGxlYmFyJztcbmltcG9ydCBHUE0sIHsgSW5zdGFuY2UgYXMgZ3BtIH0gZnJvbSAnLi91dGlscy9ncG0nO1xuaW1wb3J0IEtlZXBBbGl2ZSBmcm9tICcuL3V0aWxzL2tlZXBhbGl2ZSc7XG5pbXBvcnQgVXBkYXRlcywgeyBJbnN0YW5jZSBhcyB1cGRhdGVzLCBOb3RpZmljYXRpb25zLCBGZWVkIH0gZnJvbSAnLi91cGRhdGVzJztcbmltcG9ydCBEYXNoYm9hcmQgZnJvbSAnLi9kYXNoYm9hcmQnO1xuaW1wb3J0IFBhZ2VzIGZyb20gJy4vcGFnZXMnO1xuaW1wb3J0IEZvcm1zIGZyb20gJy4vZm9ybXMnO1xuaW1wb3J0IENvb2tpZXMgZnJvbSAnLi91dGlscy9jb29raWVzJztcbmltcG9ydCAnLi9wbHVnaW5zJztcbmltcG9ydCAnLi90aGVtZXMnO1xuaW1wb3J0IE1lZGlhRmlsdGVyLCB7IEluc3RhbmNlIGFzIE1lZGlhRmlsdGVySW5zdGFuY2V9IGZyb20gJy4vbWVkaWEnO1xuaW1wb3J0IHRvYXN0ciBmcm9tICcuL3V0aWxzL3RvYXN0cic7XG5pbXBvcnQgcmVxdWVzdCBmcm9tICcuL3V0aWxzL3JlcXVlc3QnO1xuaW1wb3J0ICcuL3V0aWxzLzJmYSc7XG5pbXBvcnQgJy4vdG9vbHMnO1xuaW1wb3J0ICcuL3doaXRlbGFiZWwnO1xuXG4vLyBib290c3RyYXAgalF1ZXJ5IGV4dGVuc2lvbnNcbmltcG9ydCAnLi91dGlscy9ib290c3RyYXAtdHJhbnNpdGlvbic7XG5pbXBvcnQgJy4vdXRpbHMvYm9vdHN0cmFwLWNvbGxhcHNlJztcbmltcG9ydCAnLi91dGlscy9ib290c3RyYXAtZHJvcGRvd24nO1xuXG4vLyB0YWJzIG1lbW9yeVxuaW1wb3J0ICcuL3V0aWxzL3RhYnMtbWVtb3J5JztcblxuLy8gY2hhbmdlbG9nXG5pbXBvcnQgJy4vdXRpbHMvY2hhbmdlbG9nJztcblxuLy8gTWFpbiBTaWRlYmFyXG5pbXBvcnQgU2lkZWJhciwgeyBJbnN0YW5jZSBhcyBzaWRlYmFyIH0gZnJvbSAnLi91dGlscy9zaWRlYmFyJztcblxuLy8gc3RhcnRzIHRoZSBrZWVwIGFsaXZlLCBhdXRvIHJ1bnMgZXZlcnkgWCBzZWNvbmRzXG5LZWVwQWxpdmUuc3RhcnQoKTtcblxuLy8gZ2xvYmFsIGV2ZW50IHRvIGNhdGNoIHNpZGViYXJfc3RhdGUgY2hhbmdlc1xuJChnbG9iYWwpLm9uKCdzaWRlYmFyX3N0YXRlLl9ncmF2JywgKCkgPT4ge1xuICAgIE9iamVjdC5rZXlzKERhc2hib2FyZC5DaGFydC5JbnN0YW5jZXMpLmZvckVhY2goKGNoYXJ0KSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gRGFzaGJvYXJkLkNoYXJ0Lkluc3RhbmNlc1tjaGFydF0uY2hhcnQudXBkYXRlKCksIDEwKTtcbiAgICB9KTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgR1BNOiB7XG4gICAgICAgIEdQTSxcbiAgICAgICAgSW5zdGFuY2U6IGdwbVxuICAgIH0sXG4gICAgS2VlcEFsaXZlLFxuICAgIERhc2hib2FyZCxcbiAgICBQYWdlcyxcbiAgICBGb3JtcyxcbiAgICBVcGRhdGVzOiB7XG4gICAgICAgIFVwZGF0ZXMsXG4gICAgICAgIE5vdGlmaWNhdGlvbnMsXG4gICAgICAgIEZlZWQsXG4gICAgICAgIEluc3RhbmNlOiB1cGRhdGVzXG4gICAgfSxcbiAgICBTaWRlYmFyOiB7XG4gICAgICAgIFNpZGViYXIsXG4gICAgICAgIEluc3RhbmNlOiBzaWRlYmFyXG4gICAgfSxcbiAgICBNZWRpYUZpbHRlcjoge1xuICAgICAgICBNZWRpYUZpbHRlcixcbiAgICAgICAgSW5zdGFuY2U6IE1lZGlhRmlsdGVySW5zdGFuY2VcbiAgICB9LFxuICAgIFNjcm9sbGJhcjogeyBTY3JvbGxiYXI6IHsgZGVwcmVjYXRlZDogdHJ1ZSB9LCBJbnN0YW5jZTogeyBkZXByZWNhdGVkOiB0cnVlIH0gfSxcbiAgICBVdGlsczogeyByZXF1ZXN0LCB0b2FzdHIsIENvb2tpZXMgfVxufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./app/main.js\n"); /***/ }), /***/ "./app/media/index.js": -/*!****************************!* +/*!****************************!*\ !*** ./app/media/index.js ***! \****************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => /* binding */ Filter,\n/* harmony export */ \"Instance\": () => /* binding */ Instance\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! grav-config */ \"grav-config\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(grav_config__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _utils_request__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/request */ \"./app/utils/request.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\n\nvar Filter = /*#__PURE__*/function () {\n function Filter() {\n _classCallCheck(this, Filter);\n\n this.URI = \"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.base_url_relative, \"/media-manager/\");\n }\n\n _createClass(Filter, [{\n key: \"filter\",\n value: function filter(name, value) {\n var filtered = [];\n var keys = Object.keys(grav_config__WEBPACK_IMPORTED_MODULE_1__.uri_params);\n\n if (!~keys.indexOf(name)) {\n keys.push(name);\n }\n\n keys.forEach(function (key) {\n var filter = Filter.cleanValue(key === name ? value : grav_config__WEBPACK_IMPORTED_MODULE_1__.uri_params[key]);\n\n if (filter !== '*') {\n filtered.push(\"\".concat(key).concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.param_sep).concat(filter));\n }\n });\n __webpack_require__.g.location = this.URI + filtered.join('/');\n }\n }], [{\n key: \"cleanValue\",\n value: function cleanValue(value) {\n return encodeURIComponent(value.replace('/', '\\\\'));\n }\n }]);\n\n return Filter;\n}();\n\n\nvar Instance = new Filter();\nvar isLoading = false;\nvar filters = {};\nvar global_index = 1;\nvar files_ended = false;\nvar MEDIA_PAGINATION_INTERVAL = 20;\n/* handle changing file type / date filter */\n\njquery__WEBPACK_IMPORTED_MODULE_0___default()('body').on('change', '.thumbs-list-container select.filter', function (event) {\n var target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.currentTarget);\n var filterName = target.data('name');\n var filterValue = target.val();\n\n if (filterValue) {\n filters[filterName] = filterValue;\n } else {\n delete filters[filterName];\n }\n\n filterFiles();\n});\n/* initialize media uploader */\n\nif (jquery__WEBPACK_IMPORTED_MODULE_0___default()('.thumbs-list-container .dropzone')[0]) {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.thumbs-list-container .dropzone')[0].dropzone.on('queuecomplete', function () {\n var body = {};\n\n if (filters.page) {\n body.page = filters.page;\n }\n\n if (filters.date) {\n body.date = filters.date;\n }\n\n if (filters.type) {\n body.type = filters.type;\n }\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.dropzone')[0].dropzone.files.forEach(function (file) {\n file.previewElement.remove();\n });\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.dropzone').first().removeClass('dz-started');\n (0,_utils_request__WEBPACK_IMPORTED_MODULE_2__.default)(\"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.base_url_relative, \"/media-manager.json/task\").concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.param_sep, \"clearMediaCache\"), {\n method: 'post',\n body: body\n }, function () {\n filterFiles();\n });\n });\n}\n/* handle loading media */\n\n\nvar loadMedia = function loadMedia(filters, callback) {\n var url = \"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.base_url_relative, \"/media.json/tmpl\").concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.param_sep, \"media-list-content/index\").concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.param_sep).concat(global_index);\n\n if (filters.page) {\n url += \"/page\".concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.param_sep).concat(filters.page.split('/').join('%5C'));\n }\n\n if (filters.type && filters.type !== '*') {\n url += \"/type\".concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.param_sep).concat(filters.type);\n }\n\n if (filters.date && filters.date !== '*') {\n url += \"/date\".concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.param_sep).concat(filters.date);\n }\n\n if (!isLoading) {\n isLoading = true;\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.spinning-wheel').show();\n jquery__WEBPACK_IMPORTED_MODULE_0___default().get(url, function (content) {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.js__files').append(content);\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.spinning-wheel').hide();\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.media-container .media-range').trigger('change');\n isLoading = false;\n global_index++;\n callback(content);\n });\n }\n};\n\nvar cleanFilesList = function cleanFilesList() {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.js__files .card-item').remove();\n};\n\nvar resetActiveStateInSidebar = function resetActiveStateInSidebar() {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.pages-list-container .row').removeClass('active'); // clear active state in sidebar\n};\n\nvar showEmptyState = function showEmptyState() {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.thumbs-list-container').append('

          No media found

          ');\n};\n\nvar filterFiles = function filterFiles() {\n cleanFilesList();\n global_index = 0;\n files_ended = false;\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.empty-space').remove();\n loadMedia(filters, function (content) {\n if (!content.trim().length) {\n showEmptyState();\n } else {\n if (!filters.page && (!filters.date || filters.date === '*') && (!filters.type || filters.type === '*')) {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.js__files').trigger('fillView');\n }\n }\n });\n};\n/* handle changing page */\n\n\njquery__WEBPACK_IMPORTED_MODULE_0___default()('body').on('click', '.pages-list-container .js__page-link', function (event) {\n var page = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.target).data('page');\n filters['page'] = page;\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.media-list-title .page-indicator').html(page); // set indication\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.js__reset-pages-filter').removeClass('hidden'); // activate reset pages icon\n\n resetActiveStateInSidebar();\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.target).parents('.row').addClass('active'); // set active state in sidebar\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.js__file-uploader').removeClass('hidden'); // customize processing URL, as the page changes dynamically\n\n if (jquery__WEBPACK_IMPORTED_MODULE_0___default()('.dropzone')[0]) {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.dropzone')[0].dropzone.on('processing', function (file) {\n this.options.url = \"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.base_url_relative, \"/media-manager\").concat(page, \".json/task\").concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.param_sep, \"addmedia\");\n });\n }\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.js__button-clear-media-cache').addClass('hidden');\n filterFiles();\n disableInfiniteScrolling(); // only infinite scroll on main list, not inside single pages\n});\n/* handle clearing page filter */\n\njquery__WEBPACK_IMPORTED_MODULE_0___default()('body').on('click', '.js__reset-pages-filter', function (event) {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.media-list-title .page-indicator').html('All Pages'); // set indication\n\n cleanFilesList();\n resetActiveStateInSidebar();\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.js__reset-pages-filter').addClass('hidden'); // remove reset pages icon\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.js__file-uploader').addClass('hidden');\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.js__button-clear-media-cache').removeClass('hidden');\n delete filters['page'];\n filterFiles();\n});\n/* handle infinite loading */\n\nvar enableInfiniteScrolling = function enableInfiniteScrolling() {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.spinning-wheel').hide();\n var view = jquery__WEBPACK_IMPORTED_MODULE_0___default()('.mediapicker-scroll').last();\n\n if (!view.length) {\n return;\n }\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(view).on('scroll', function () {\n if (jquery__WEBPACK_IMPORTED_MODULE_0___default()(this).scrollTop() + jquery__WEBPACK_IMPORTED_MODULE_0___default()(this).innerHeight() + 100 >= jquery__WEBPACK_IMPORTED_MODULE_0___default()(this)[0].scrollHeight) {\n fillView();\n }\n });\n};\n\nvar loadNextBatch = function loadNextBatch(callback) {\n if (files_ended) {\n return;\n }\n\n loadMedia({}, function (content) {\n if (!jquery__WEBPACK_IMPORTED_MODULE_0___default()(content).length || content.split('card-item').length - 1 < MEDIA_PAGINATION_INTERVAL) {\n files_ended = true;\n } else {\n if (callback) {\n callback();\n }\n }\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.media-container .media-range').trigger('input');\n });\n};\n\nvar fillView = function fillView() {\n if (!jquery__WEBPACK_IMPORTED_MODULE_0___default()('.js__files').find('.card-item').last().offset()) {\n setTimeout(function () {\n // retry later\n fillView();\n }, 300);\n return;\n }\n\n if (jquery__WEBPACK_IMPORTED_MODULE_0___default()('.js__files').find('.card-item').last().offset().top - 1 <= jquery__WEBPACK_IMPORTED_MODULE_0___default()('.media-container').height()) {\n loadNextBatch(function () {\n fillView();\n });\n }\n};\n/* disable infinite loading */\n\n\nvar disableInfiniteScrolling = function disableInfiniteScrolling() {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.spinning-wheel').hide();\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.content-wrapper').unbind('scroll');\n};\n\njquery__WEBPACK_IMPORTED_MODULE_0___default()('.js__files').on('fillView', function (event) {\n // the first batch got the max number of media files, try loading more\n if (jquery__WEBPACK_IMPORTED_MODULE_0___default()('.js__files')[0].innerHTML.split('card-item').length - 1 === MEDIA_PAGINATION_INTERVAL) {\n fillView();\n enableInfiniteScrolling();\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL21lZGlhL2luZGV4LmpzPzE1NDAiXSwibmFtZXMiOlsiRmlsdGVyIiwiVVJJIiwiY29uZmlnIiwibmFtZSIsInZhbHVlIiwiZmlsdGVyZWQiLCJrZXlzIiwiT2JqZWN0IiwidXJpX3BhcmFtcyIsImluZGV4T2YiLCJwdXNoIiwiZm9yRWFjaCIsImtleSIsImZpbHRlciIsImNsZWFuVmFsdWUiLCJnbG9iYWwiLCJsb2NhdGlvbiIsImpvaW4iLCJlbmNvZGVVUklDb21wb25lbnQiLCJyZXBsYWNlIiwiSW5zdGFuY2UiLCJpc0xvYWRpbmciLCJmaWx0ZXJzIiwiZ2xvYmFsX2luZGV4IiwiZmlsZXNfZW5kZWQiLCJNRURJQV9QQUdJTkFUSU9OX0lOVEVSVkFMIiwiJCIsIm9uIiwiZXZlbnQiLCJ0YXJnZXQiLCJjdXJyZW50VGFyZ2V0IiwiZmlsdGVyTmFtZSIsImRhdGEiLCJmaWx0ZXJWYWx1ZSIsInZhbCIsImZpbHRlckZpbGVzIiwiZHJvcHpvbmUiLCJib2R5IiwicGFnZSIsImRhdGUiLCJ0eXBlIiwiZmlsZXMiLCJmaWxlIiwicHJldmlld0VsZW1lbnQiLCJyZW1vdmUiLCJmaXJzdCIsInJlbW92ZUNsYXNzIiwicmVxdWVzdCIsIm1ldGhvZCIsImxvYWRNZWRpYSIsImNhbGxiYWNrIiwidXJsIiwic3BsaXQiLCJzaG93IiwiY29udGVudCIsImFwcGVuZCIsImhpZGUiLCJ0cmlnZ2VyIiwiY2xlYW5GaWxlc0xpc3QiLCJyZXNldEFjdGl2ZVN0YXRlSW5TaWRlYmFyIiwic2hvd0VtcHR5U3RhdGUiLCJ0cmltIiwibGVuZ3RoIiwiaHRtbCIsInBhcmVudHMiLCJhZGRDbGFzcyIsIm9wdGlvbnMiLCJkaXNhYmxlSW5maW5pdGVTY3JvbGxpbmciLCJlbmFibGVJbmZpbml0ZVNjcm9sbGluZyIsInZpZXciLCJsYXN0Iiwic2Nyb2xsVG9wIiwiaW5uZXJIZWlnaHQiLCJzY3JvbGxIZWlnaHQiLCJmaWxsVmlldyIsImxvYWROZXh0QmF0Y2giLCJmaW5kIiwib2Zmc2V0Iiwic2V0VGltZW91dCIsInRvcCIsImhlaWdodCIsInVuYmluZCIsImlubmVySFRNTCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTs7SUFFcUJBLE07QUFDakIsb0JBQWM7QUFBQTs7QUFDVixTQUFLQyxHQUFMLGFBQWNDLGlFQUFkO0FBQ0g7Ozs7MkJBRU1DLEksRUFBTUMsSyxFQUFPO0FBQ2hCLFVBQUlDLFFBQVEsR0FBRyxFQUFmO0FBQ0EsVUFBSUMsSUFBSSxHQUFHQyxNQUFNLENBQUNELElBQVAsQ0FBWUUsbURBQVosQ0FBWDs7QUFDQSxVQUFJLENBQUMsQ0FBQ0YsSUFBSSxDQUFDRyxPQUFMLENBQWFOLElBQWIsQ0FBTixFQUEwQjtBQUFFRyxZQUFJLENBQUNJLElBQUwsQ0FBVVAsSUFBVjtBQUFrQjs7QUFFOUNHLFVBQUksQ0FBQ0ssT0FBTCxDQUFhLFVBQUNDLEdBQUQsRUFBUztBQUNsQixZQUFJQyxNQUFNLEdBQUdiLE1BQU0sQ0FBQ2MsVUFBUCxDQUFrQkYsR0FBRyxLQUFLVCxJQUFSLEdBQWVDLEtBQWYsR0FBdUJJLG1EQUFVLENBQUNJLEdBQUQsQ0FBbkQsQ0FBYjs7QUFDQSxZQUFJQyxNQUFNLEtBQUssR0FBZixFQUFvQjtBQUNoQlIsa0JBQVEsQ0FBQ0ssSUFBVCxXQUFpQkUsR0FBakIsU0FBdUJWLHlEQUF2QixTQUEwQ1csTUFBMUM7QUFDSDtBQUNKLE9BTEQ7QUFPQUUsMkJBQU0sQ0FBQ0MsUUFBUCxHQUFrQixLQUFLZixHQUFMLEdBQVdJLFFBQVEsQ0FBQ1ksSUFBVCxDQUFjLEdBQWQsQ0FBN0I7QUFDSDs7OytCQUVpQmIsSyxFQUFPO0FBQ3JCLGFBQU9jLGtCQUFrQixDQUFDZCxLQUFLLENBQUNlLE9BQU4sQ0FBYyxHQUFkLEVBQW1CLElBQW5CLENBQUQsQ0FBekI7QUFDSDs7Ozs7OztBQUdFLElBQUlDLFFBQVEsR0FBRyxJQUFJcEIsTUFBSixFQUFmO0FBQ1AsSUFBSXFCLFNBQVMsR0FBRyxLQUFoQjtB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QUFoQixDQUFxQixZQUFyQixFQUFtQ04sSUFBbkMsR0FBMENPLE1BQTFDLEVBQUwsRUFBeUQ7QUFDckRDLGNBQVUsQ0FBQyxZQUFXO0FBQ2xCO0FBQ0FKLGNBQVE7QUFDWCxLQUhTLEVBR1AsR0FITyxDQUFWO0FBS0E7QUFDSDs7QUFFRCxNQUFJaEQsNkNBQUMsQ0FBQyxZQUFELENBQUQsQ0FBZ0JrRCxJQUFoQixDQUFxQixZQUFyQixFQUFtQ04sSUFBbkMsR0FBMENPLE1BQTFDLEdBQW1ERSxHQUFuRCxHQUF5RCxDQUF6RCxJQUE4RHJELDZDQUFDLENBQUMsa0JBQUQsQ0FBRCxDQUFzQnNELE1BQXRCLEVBQWxFLEVBQWtHO0FBQzlGTCxpQkFBYSxDQUFDLFlBQVc7QUFDckJELGNBQVE7QUFDWCxLQUZZLENBQWI7QUFHSDtBQUNKLENBZkQ7QUFpQkE7OztBQUNBLElBQUlQLHdCQUF3QixHQUFHLFNBQVNBLHdCQUFULEdBQW9DO0FBQy9EekMsK0NBQUMsQ0FBQyxpQkFBRCxDQUFELENBQXFCOEIsSUFBckI7QUFDQTlCLCtDQUFDLENBQUMsa0JBQUQsQ0FBRCxDQUFzQnVELE1BQXRCLENBQTZCLFFBQTdCO0FBQ0gsQ0FIRDs7QUFLQXZELDZDQUFDLENBQUMsWUFBRCxDQUFELENBQWdCQyxFQUFoQixDQUFtQixVQUFuQixFQUErQixVQUFTQyxLQUFULEVBQWdCO0FBQzNDO0FBQ0EsTUFBS0YsNkNBQUMsQ0FBQyxZQUFELENBQUQsQ0FBZ0IsQ0FBaEIsRUFBbUJ3RCxTQUFuQixDQUE2QjlCLEtBQTdCLENBQW1DLFdBQW5DLEVBQWdEVSxNQUFoRCxHQUF5RCxDQUExRCxLQUFpRXJDLHlCQUFyRSxFQUFnRztBQUM1RmlELFlBQVE7QUFDUk4sMkJBQXVCO0FBQzFCO0FBQ0osQ0FORCIsImZpbGUiOiIuL2FwcC9tZWRpYS9pbmRleC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgeyBjb25maWcsIHVyaV9wYXJhbXMgfSBmcm9tICdncmF2LWNvbmZpZyc7XG5pbXBvcnQgcmVxdWVzdCBmcm9tICcuLi91dGlscy9yZXF1ZXN0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmlsdGVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5VUkkgPSBgJHtjb25maWcuYmFzZV91cmxfcmVsYXRpdmV9L21lZGlhLW1hbmFnZXIvYDtcbiAgICB9XG5cbiAgICBmaWx0ZXIobmFtZSwgdmFsdWUpIHtcbiAgICAgICAgbGV0IGZpbHRlcmVkID0gW107XG4gICAgICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXModXJpX3BhcmFtcyk7XG4gICAgICAgIGlmICghfmtleXMuaW5kZXhPZihuYW1lKSkgeyBrZXlzLnB1c2gobmFtZSk7IH1cblxuICAgICAgICBrZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgbGV0IGZpbHRlciA9IEZpbHRlci5jbGVhblZhbHVlKGtleSA9PT0gbmFtZSA/IHZhbHVlIDogdXJpX3BhcmFtc1trZXldKTtcbiAgICAgICAgICAgIGlmIChmaWx0ZXIgIT09ICcqJykge1xuICAgICAgICAgICAgICAgIGZpbHRlcmVkLnB1c2goYCR7a2V5fSR7Y29uZmlnLnBhcmFtX3NlcH0ke2ZpbHRlcn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgZ2xvYmFsLmxvY2F0aW9uID0gdGhpcy5VUkkgKyBmaWx0ZXJlZC5qb2luKCcvJyk7XG4gICAgfVxuXG4gICAgc3RhdGljIGNsZWFuVmFsdWUodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZS5yZXBsYWNlKCcvJywgJ1xcXFwnKSk7XG4gICAgfVxufVxuXG5leHBvcnQgbGV0IEluc3RhbmNlID0gbmV3IEZpbHRlcigpO1xudmFyIGlzTG9hZGluZyA9IGZhbHNlO1xuXG52YXIgZmlsdGVycyA9IHt9O1xudmFyIGdsb2JhbF9pbmRleCA9IDE7XG52YXIgZmlsZXNfZW5kZWQgPSBmYWxzZTtcbmNvbnN0IE1FRElBX1BBR0lOQVRJT05fSU5URVJWQUwgPSAyMDtcblxuLyogaGFuZGxlIGNoYW5naW5nIGZpbGUgdHlwZSAvIGRhdGUgZmlsdGVyICovXG4kKCdib2R5Jykub24oJ2NoYW5nZScsICcudGh1bWJzLWxpc3QtY29udGFpbmVyIHNlbGVjdC5maWx0ZXInLCAoZXZlbnQpID0+IHtcbiAgICBsZXQgdGFyZ2V0ID0gJChldmVudC5jdXJyZW50VGFyZ2V0KTtcbiAgICBsZXQgZmlsdGVyTmFtZSA9IHRhcmdldC5kYXRhKCduYW1lJyk7XG4gICAgbGV0IGZpbHRlclZhbHVlID0gdGFyZ2V0LnZhbCgpO1xuXG4gICAgaWYgKGZpbHRlclZhbHVlKSB7XG4gICAgICAgIGZpbHRlcnNbZmlsdGVyTmFtZV0gPSBmaWx0ZXJWYWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgZmlsdGVyc1tmaWx0ZXJOYW1lXTtcbiAgICB9XG5cbiAgICBmaWx0ZXJGaWxlcygpO1xufSk7XG5cbi8qIGluaXRpYWxpemUgbWVkaWEgdXBsb2FkZXIgKi9cbmlmICgkKCcudGh1bWJzLWxpc3QtY29udGFpbmVyIC5kcm9wem9uZScpWzBdKSB7XG4gICAgJCgnLnRodW1icy1saXN0LWNvbnRhaW5lciAuZHJvcHpvbmUnKVswXS5kcm9wem9uZS5vbigncXVldWVjb21wbGV0ZScsIGZ1bmN0aW9uKCkge1xuICAgICAgICBsZXQgYm9keSA9IHt9O1xuICAgICAgICBpZiAoZmlsdGVycy5wYWdlKSB7IGJvZHkucGFnZSA9IGZpbHRlcnMucGFnZTsgfVxuICAgICAgICBpZiAoZmlsdGVycy5kYXRlKSB7IGJvZHkuZGF0ZSA9IGZpbHRlcnMuZGF0ZTsgfVxuICAgICAgICBpZiAoZmlsdGVycy50eXBlKSB7IGJvZHkudHlwZSA9IGZpbHRlcnMudHlwZTsgfVxuXG4gICAgICAgICQoJy5kcm9wem9uZScpWzBdLmRyb3B6b25lLmZpbGVzLmZvckVhY2goZnVuY3Rpb24oZmlsZSkgeyBmaWxlLnByZXZpZXdFbGVtZW50LnJlbW92ZSgpOyB9KTtcbiAgICAgICAgJCgnLmRyb3B6b25lJykuZmlyc3QoKS5yZW1vdmVDbGFzcygnZHotc3RhcnRlZCcpO1xuXG4gICAgICAgIHJlcXVlc3QoYCR7Y29uZmlnLmJhc2VfdXJsX3JlbGF0aXZlfS9tZWRpYS1tYW5hZ2VyLmpzb24vdGFzayR7Y29uZmlnLnBhcmFtX3NlcH1jbGVhck1lZGlhQ2FjaGVgLCB7IG1ldGhvZDogJ3Bvc3QnLCBib2R5IH0sICgpID0+IHtcbiAgICAgICAgICAgIGZpbHRlckZpbGVzKCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuXG4vKiBoYW5kbGUgbG9hZGluZyBtZWRpYSAqL1xudmFyIGxvYWRNZWRpYSA9IGZ1bmN0aW9uIGxvYWRNZWRpYShmaWx0ZXJzLCBjYWxsYmFjaykge1xuICAgIHZhciB1cmwgPSBgJHtjb25maWcuYmFzZV91cmxfcmVsYXRpdmV9L21lZGlhLmpzb24vdG1wbCR7Y29uZmlnLnBhcmFtX3NlcH1tZWRpYS1saXN0LWNvbnRlbnQvaW5kZXgke2NvbmZpZy5wYXJhbV9zZXB9JHtnbG9iYWxfaW5kZXh9YDtcblxuICAgIGlmIChmaWx0ZXJzLnBhZ2UpIHtcbiAgICAgICAgdXJsICs9IGAvcGFnZSR7Y29uZmlnLnBhcmFtX3NlcH0keyhmaWx0ZXJzLnBhZ2UpLnNwbGl0KCcvJykuam9pbignJTVDJyl9YDtcbiAgICB9XG4gICAgaWYgKGZpbHRlcnMudHlwZSAmJiBmaWx0ZXJzLnR5cGUgIT09ICcqJykge1xuICAgICAgICB1cmwgKz0gYC90eXBlJHtjb25maWcucGFyYW1fc2VwfSR7ZmlsdGVycy50eXBlfWA7XG4gICAgfVxuICAgIGlmIChmaWx0ZXJzLmRhdGUgJiYgZmlsdGVycy5kYXRlICE9PSAnKicpIHtcbiAgICAgICAgdXJsICs9IGAvZGF0ZSR7Y29uZmlnLnBhcmFtX3NlcH0ke2ZpbHRlcnMuZGF0ZX1gO1xuICAgIH1cblxuICAgIGlmICghaXNMb2FkaW5nKSB7XG4gICAgICAgIGlzTG9hZGluZyA9IHRydWU7XG5cbiAgICAgICAgJCgnLnNwaW5uaW5nLXdoZWVsJykuc2hvdygpO1xuICAgICAgICAkLmdldCh1cmwsIGZ1bmN0aW9uKGNvbnRlbnQpIHtcbiAgICAgICAgICAgICQoJy5qc19fZmlsZXMnKS5hcHBlbmQoY29udGVudCk7XG4gICAgICAgICAgICAkKCcuc3Bpbm5pbmctd2hlZWwnKS5oaWRlKCk7XG4gICAgICAgICAgICAkKCcubWVkaWEtY29udGFpbmVyIC5tZWRpYS1yYW5nZScpLnRyaWdnZXIoJ2NoYW5nZScpO1xuICAgICAgICAgICAgaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICBnbG9iYWxfaW5kZXgrKztcblxuICAgICAgICAgICAgY2FsbGJhY2soY29udGVudCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn07XG5cbnZhciBjbGVhbkZpbGVzTGlzdCA9IGZ1bmN0aW9uIGNsZWFuRmlsZXNMaXN0KCkge1xuICAgICQoJy5qc19fZmlsZXMgLmNhcmQtaXRlbScpLnJlbW92ZSgpO1xufTtcblxudmFyIHJlc2V0QWN0aXZlU3RhdGVJblNpZGViYXIgPSBmdW5jdGlvbiByZXNldEFjdGl2ZVN0YXRlSW5TaWRlYmFyKCkge1xuICAgICQoJy5wYWdlcy1saXN0LWNvbnRhaW5lciAucm93JykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpOyAvLyBjbGVhciBhY3RpdmUgc3RhdGUgaW4gc2lkZWJhclxufTtcblxudmFyIHNob3dFbXB0eVN0YXRlID0gZnVuY3Rpb24gc2hvd0VtcHR5U3RhdGUoKSB7XG4gICAgJCgnLnRodW1icy1saXN0LWNvbnRhaW5lcicpLmFwcGVuZCgnPHAgY2xhc3M9XCJjYXJkLWl0ZW0gZW1wdHktc3BhY2VcIj5ObyBtZWRpYSBmb3VuZDwvcD4nKTtcbn07XG5cbnZhciBmaWx0ZXJGaWxlcyA9IGZ1bmN0aW9uIGZpbHRlckZpbGVzKCkge1xuICAgIGNsZWFuRmlsZXNMaXN0KCk7XG4gICAgZ2xvYmFsX2luZGV4ID0gMDtcbiAgICBmaWxlc19lbmRlZCA9IGZhbHNlO1xuICAgICQoJy5lbXB0eS1zcGFjZScpLnJlbW92ZSgpO1xuICAgIGxvYWRNZWRpYShmaWx0ZXJzLCBmdW5jdGlvbihjb250ZW50KSB7XG4gICAgICAgIGlmICghY29udGVudC50cmltKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICBzaG93RW1wdHlTdGF0ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFmaWx0ZXJzLnBhZ2UgJiYgKCFmaWx0ZXJzLmRhdGUgfHwgZmlsdGVycy5kYXRlID09PSAnKicpICYmICghZmlsdGVycy50eXBlIHx8IGZpbHRlcnMudHlwZSA9PT0gJyonKSkge1xuICAgICAgICAgICAgICAgICQoJy5qc19fZmlsZXMnKS50cmlnZ2VyKCdmaWxsVmlldycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59O1xuXG4vKiBoYW5kbGUgY2hhbmdpbmcgcGFnZSAqL1xuJCgnYm9keScpLm9uKCdjbGljaycsICcucGFnZXMtbGlzdC1jb250YWluZXIgLmpzX19wYWdlLWxpbmsnLCAoZXZlbnQpID0+IHtcbiAgICB2YXIgcGFnZSA9ICQoZXZlbnQudGFyZ2V0KS5kYXRhKCdwYWdlJyk7XG4gICAgZmlsdGVyc1sncGFnZSddID0gcGFnZTtcblxuICAgICQoJy5tZWRpYS1saXN0LXRpdGxlIC5wYWdlLWluZGljYXRvcicpLmh0bWwocGFnZSk7IC8vIHNldCBpbmRpY2F0aW9uXG4gICAgJCgnLmpzX19yZXNldC1wYWdlcy1maWx0ZXInKS5yZW1vdmVDbGFzcygnaGlkZGVuJyk7IC8vIGFjdGl2YXRlIHJlc2V0IHBhZ2VzIGljb25cbiAgICByZXNldEFjdGl2ZVN0YXRlSW5TaWRlYmFyKCk7XG4gICAgJChldmVudC50YXJnZXQpLnBhcmVudHMoJy5yb3cnKS5hZGRDbGFzcygnYWN0aXZlJyk7IC8vIHNldCBhY3RpdmUgc3RhdGUgaW4gc2lkZWJhclxuICAgICQoJy5qc19fZmlsZS11cGxvYWRlcicpLnJlbW92ZUNsYXNzKCdoaWRkZW4nKTtcblxuICAgIC8vIGN1c3RvbWl6ZSBwcm9jZXNzaW5nIFVSTCwgYXMgdGhlIHBhZ2UgY2hhbmdlcyBkeW5hbWljYWxseVxuICAgIGlmICgkKCcuZHJvcHpvbmUnKVswXSkge1xuICAgICAgICAkKCcuZHJvcHpvbmUnKVswXS5kcm9wem9uZS5vbigncHJvY2Vzc2luZycsIGZ1bmN0aW9uKGZpbGUpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy51cmwgPSBgJHtjb25maWcuYmFzZV91cmxfcmVsYXRpdmV9L21lZGlhLW1hbmFnZXIke3BhZ2V9Lmpzb24vdGFzayR7Y29uZmlnLnBhcmFtX3NlcH1hZGRtZWRpYWA7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgICQoJy5qc19fYnV0dG9uLWNsZWFyLW1lZGlhLWNhY2hlJykuYWRkQ2xhc3MoJ2hpZGRlbicpO1xuICAgIGZpbHRlckZpbGVzKCk7XG5cbiAgICBkaXNhYmxlSW5maW5pdGVTY3JvbGxpbmcoKTsgLy8gb25seSBpbmZpbml0ZSBzY3JvbGwgb24gbWFpbiBsaXN0LCBub3QgaW5zaWRlIHNpbmdsZSBwYWdlc1xufSk7XG5cbi8qIGhhbmRsZSBjbGVhcmluZyBwYWdlIGZpbHRlciAqL1xuJCgnYm9keScpLm9uKCdjbGljaycsICcuanNfX3Jlc2V0LXBhZ2VzLWZpbHRlcicsIChldmVudCkgPT4ge1xuICAgICQoJy5tZWRpYS1saXN0LXRpdGxlIC5wYWdlLWluZGljYXRvcicpLmh0bWwoJ0FsbCBQYWdlcycpOyAvLyBzZXQgaW5kaWNhdGlvblxuICAgIGNsZWFuRmlsZXNMaXN0KCk7XG4gICAgcmVzZXRBY3RpdmVTdGF0ZUluU2lkZWJhcigpO1xuICAgICQoJy5qc19fcmVzZXQtcGFnZXMtZmlsdGVyJykuYWRkQ2xhc3MoJ2hpZGRlbicpOyAvLyByZW1vdmUgcmVzZXQgcGFnZXMgaWNvblxuICAgICQoJy5qc19fZmlsZS11cGxvYWRlcicpLmFkZENsYXNzKCdoaWRkZW4nKTtcbiAgICAkKCcuanNfX2J1dHRvbi1jbGVhci1tZWRpYS1jYWNoZScpLnJlbW92ZUNsYXNzKCdoaWRkZW4nKTtcbiAgICBkZWxldGUgZmlsdGVyc1sncGFnZSddO1xuXG4gICAgZmlsdGVyRmlsZXMoKTtcbn0pO1xuXG4vKiBoYW5kbGUgaW5maW5pdGUgbG9hZGluZyAqL1xudmFyIGVuYWJsZUluZmluaXRlU2Nyb2xsaW5nID0gZnVuY3Rpb24gZW5hYmxlSW5maW5pdGVTY3JvbGxpbmcoKSB7XG4gICAgJCgnLnNwaW5uaW5nLXdoZWVsJykuaGlkZSgpO1xuICAgIHZhciB2aWV3ID0gJCgnLm1lZGlhcGlja2VyLXNjcm9sbCcpLmxhc3QoKTtcblxuICAgIGlmICghdmlldy5sZW5ndGgpIHsgcmV0dXJuOyB9XG5cbiAgICAkKHZpZXcpLm9uKCdzY3JvbGwnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKCgkKHRoaXMpLnNjcm9sbFRvcCgpICsgJCh0aGlzKS5pbm5lckhlaWdodCgpICsgMTAwKSA+PSAkKHRoaXMpWzBdLnNjcm9sbEhlaWdodCkge1xuICAgICAgICAgICAgZmlsbFZpZXcoKTtcbiAgICAgICAgfVxuICAgIH0pO1xufTtcblxudmFyIGxvYWROZXh0QmF0Y2ggPSBmdW5jdGlvbiBsb2FkTmV4dEJhdGNoKGNhbGxiYWNrKSB7XG4gICAgaWYgKGZpbGVzX2VuZGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2FkTWVkaWEoe30sIGZ1bmN0aW9uKGNvbnRlbnQpIHtcbiAgICAgICAgaWYgKCEkKGNvbnRlbnQpLmxlbmd0aCB8fCAoKGNvbnRlbnQuc3BsaXQoJ2NhcmQtaXRlbScpLmxlbmd0aCAtIDEpIDwgTUVESUFfUEFHSU5BVElPTl9JTlRFUlZBTCkpIHtcbiAgICAgICAgICAgIGZpbGVzX2VuZGVkID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAkKCcubWVkaWEtY29udGFpbmVyIC5tZWRpYS1yYW5nZScpLnRyaWdnZXIoJ2lucHV0Jyk7XG4gICAgfSk7XG59O1xuXG52YXIgZmlsbFZpZXcgPSBmdW5jdGlvbiBmaWxsVmlldygpIHtcbiAgICBpZiAoISQoJy5qc19fZmlsZXMnKS5maW5kKCcuY2FyZC1pdGVtJykubGFzdCgpLm9mZnNldCgpKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAvLyByZXRyeSBsYXRlclxuICAgICAgICAgICAgZmlsbFZpZXcoKTtcbiAgICAgICAgfSwgMzAwKTtcblxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCQoJy5qc19fZmlsZXMnKS5maW5kKCcuY2FyZC1pdGVtJykubGFzdCgpLm9mZnNldCgpLnRvcCAtIDEgPD0gJCgnLm1lZGlhLWNvbnRhaW5lcicpLmhlaWdodCgpKSB7XG4gICAgICAgIGxvYWROZXh0QmF0Y2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBmaWxsVmlldygpO1xuICAgICAgICB9KTtcbiAgICB9XG59O1xuXG4vKiBkaXNhYmxlIGluZmluaXRlIGxvYWRpbmcgKi9cbnZhciBkaXNhYmxlSW5maW5pdGVTY3JvbGxpbmcgPSBmdW5jdGlvbiBkaXNhYmxlSW5maW5pdGVTY3JvbGxpbmcoKSB7XG4gICAgJCgnLnNwaW5uaW5nLXdoZWVsJykuaGlkZSgpO1xuICAgICQoJy5jb250ZW50LXdyYXBwZXInKS51bmJpbmQoJ3Njcm9sbCcpO1xufTtcblxuJCgnLmpzX19maWxlcycpLm9uKCdmaWxsVmlldycsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgLy8gdGhlIGZpcnN0IGJhdGNoIGdvdCB0aGUgbWF4IG51bWJlciBvZiBtZWRpYSBmaWxlcywgdHJ5IGxvYWRpbmcgbW9yZVxuICAgIGlmICgoJCgnLmpzX19maWxlcycpWzBdLmlubmVySFRNTC5zcGxpdCgnY2FyZC1pdGVtJykubGVuZ3RoIC0gMSkgPT09IE1FRElBX1BBR0lOQVRJT05fSU5URVJWQUwpIHtcbiAgICAgICAgZmlsbFZpZXcoKTtcbiAgICAgICAgZW5hYmxlSW5maW5pdGVTY3JvbGxpbmcoKTtcbiAgICB9XG59KTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./app/media/index.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Filter),\n/* harmony export */ \"Instance\": () => (/* binding */ Instance)\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! grav-config */ \"grav-config\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(grav_config__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _utils_request__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/request */ \"./app/utils/request.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\n\nvar Filter = /*#__PURE__*/function () {\n function Filter() {\n _classCallCheck(this, Filter);\n\n this.URI = \"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.base_url_relative, \"/media-manager/\");\n }\n\n _createClass(Filter, [{\n key: \"filter\",\n value: function filter(name, value) {\n var filtered = [];\n var keys = Object.keys(grav_config__WEBPACK_IMPORTED_MODULE_1__.uri_params);\n\n if (!~keys.indexOf(name)) {\n keys.push(name);\n }\n\n keys.forEach(function (key) {\n var filter = Filter.cleanValue(key === name ? value : grav_config__WEBPACK_IMPORTED_MODULE_1__.uri_params[key]);\n\n if (filter !== '*') {\n filtered.push(\"\".concat(key).concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.param_sep).concat(filter));\n }\n });\n __webpack_require__.g.location = this.URI + filtered.join('/');\n }\n }], [{\n key: \"cleanValue\",\n value: function cleanValue(value) {\n return encodeURIComponent(value.replace('/', '\\\\'));\n }\n }]);\n\n return Filter;\n}();\n\n\nvar Instance = new Filter();\nvar isLoading = false;\nvar filters = {};\nvar global_index = 1;\nvar files_ended = false;\nvar MEDIA_PAGINATION_INTERVAL = 20;\n/* handle changing file type / date filter */\n\njquery__WEBPACK_IMPORTED_MODULE_0___default()('body').on('change', '.thumbs-list-container select.filter', function (event) {\n var target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.currentTarget);\n var filterName = target.data('name');\n var filterValue = target.val();\n\n if (filterValue) {\n filters[filterName] = filterValue;\n } else {\n delete filters[filterName];\n }\n\n filterFiles();\n});\n/* initialize media uploader */\n\nif (jquery__WEBPACK_IMPORTED_MODULE_0___default()('.thumbs-list-container .dropzone')[0]) {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.thumbs-list-container .dropzone')[0].dropzone.on('queuecomplete', function () {\n var body = {};\n\n if (filters.page) {\n body.page = filters.page;\n }\n\n if (filters.date) {\n body.date = filters.date;\n }\n\n if (filters.type) {\n body.type = filters.type;\n }\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.dropzone')[0].dropzone.files.forEach(function (file) {\n file.previewElement.remove();\n });\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.dropzone').first().removeClass('dz-started');\n (0,_utils_request__WEBPACK_IMPORTED_MODULE_2__.default)(\"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.base_url_relative, \"/media-manager.json/task\").concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.param_sep, \"clearMediaCache\"), {\n method: 'post',\n body: body\n }, function () {\n filterFiles();\n });\n });\n}\n/* handle loading media */\n\n\nvar loadMedia = function loadMedia(filters, callback) {\n var url = \"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.base_url_relative, \"/media.json/tmpl\").concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.param_sep, \"media-list-content/index\").concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.param_sep).concat(global_index);\n\n if (filters.page) {\n url += \"/page\".concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.param_sep).concat(filters.page.split('/').join('%5C'));\n }\n\n if (filters.type && filters.type !== '*') {\n url += \"/type\".concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.param_sep).concat(filters.type);\n }\n\n if (filters.date && filters.date !== '*') {\n url += \"/date\".concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.param_sep).concat(filters.date);\n }\n\n if (!isLoading) {\n isLoading = true;\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.spinning-wheel').show();\n jquery__WEBPACK_IMPORTED_MODULE_0___default().get(url, function (content) {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.js__files').append(content);\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.spinning-wheel').hide();\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.media-container .media-range').trigger('change');\n isLoading = false;\n global_index++;\n callback(content);\n });\n }\n};\n\nvar cleanFilesList = function cleanFilesList() {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.js__files .card-item').remove();\n};\n\nvar resetActiveStateInSidebar = function resetActiveStateInSidebar() {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.pages-list-container .row').removeClass('active'); // clear active state in sidebar\n};\n\nvar showEmptyState = function showEmptyState() {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.thumbs-list-container').append('

          No media found

          ');\n};\n\nvar filterFiles = function filterFiles() {\n cleanFilesList();\n global_index = 0;\n files_ended = false;\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.empty-space').remove();\n loadMedia(filters, function (content) {\n if (!content.trim().length) {\n showEmptyState();\n } else {\n if (!filters.page && (!filters.date || filters.date === '*') && (!filters.type || filters.type === '*')) {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.js__files').trigger('fillView');\n }\n }\n });\n};\n/* handle changing page */\n\n\njquery__WEBPACK_IMPORTED_MODULE_0___default()('body').on('click', '.pages-list-container .js__page-link', function (event) {\n var page = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.target).data('page');\n filters['page'] = page;\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.media-list-title .page-indicator').html(page); // set indication\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.js__reset-pages-filter').removeClass('hidden'); // activate reset pages icon\n\n resetActiveStateInSidebar();\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.target).parents('.row').addClass('active'); // set active state in sidebar\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.js__file-uploader').removeClass('hidden'); // customize processing URL, as the page changes dynamically\n\n if (jquery__WEBPACK_IMPORTED_MODULE_0___default()('.dropzone')[0]) {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.dropzone')[0].dropzone.on('processing', function (file) {\n this.options.url = \"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.base_url_relative, \"/media-manager\").concat(page, \".json/task\").concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.param_sep, \"addmedia\");\n });\n }\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.js__button-clear-media-cache').addClass('hidden');\n filterFiles();\n disableInfiniteScrolling(); // only infinite scroll on main list, not inside single pages\n});\n/* handle clearing page filter */\n\njquery__WEBPACK_IMPORTED_MODULE_0___default()('body').on('click', '.js__reset-pages-filter', function (event) {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.media-list-title .page-indicator').html('All Pages'); // set indication\n\n cleanFilesList();\n resetActiveStateInSidebar();\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.js__reset-pages-filter').addClass('hidden'); // remove reset pages icon\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.js__file-uploader').addClass('hidden');\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.js__button-clear-media-cache').removeClass('hidden');\n delete filters['page'];\n filterFiles();\n});\n/* handle infinite loading */\n\nvar enableInfiniteScrolling = function enableInfiniteScrolling() {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.spinning-wheel').hide();\n var view = jquery__WEBPACK_IMPORTED_MODULE_0___default()('.mediapicker-scroll').last();\n\n if (!view.length) {\n return;\n }\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(view).on('scroll', function () {\n if (jquery__WEBPACK_IMPORTED_MODULE_0___default()(this).scrollTop() + jquery__WEBPACK_IMPORTED_MODULE_0___default()(this).innerHeight() + 100 >= jquery__WEBPACK_IMPORTED_MODULE_0___default()(this)[0].scrollHeight) {\n fillView();\n }\n });\n};\n\nvar loadNextBatch = function loadNextBatch(callback) {\n if (files_ended) {\n return;\n }\n\n loadMedia({}, function (content) {\n if (!jquery__WEBPACK_IMPORTED_MODULE_0___default()(content).length || content.split('card-item').length - 1 < MEDIA_PAGINATION_INTERVAL) {\n files_ended = true;\n } else {\n if (callback) {\n callback();\n }\n }\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.media-container .media-range').trigger('input');\n });\n};\n\nvar fillView = function fillView() {\n if (!jquery__WEBPACK_IMPORTED_MODULE_0___default()('.js__files').find('.card-item').last().offset()) {\n setTimeout(function () {\n // retry later\n fillView();\n }, 300);\n return;\n }\n\n if (jquery__WEBPACK_IMPORTED_MODULE_0___default()('.js__files').find('.card-item').last().offset().top - 1 <= jquery__WEBPACK_IMPORTED_MODULE_0___default()('.media-container').height()) {\n loadNextBatch(function () {\n fillView();\n });\n }\n};\n/* disable infinite loading */\n\n\nvar disableInfiniteScrolling = function disableInfiniteScrolling() {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.spinning-wheel').hide();\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.content-wrapper').unbind('scroll');\n};\n\njquery__WEBPACK_IMPORTED_MODULE_0___default()('.js__files').on('fillView', function (event) {\n // the first batch got the max number of media files, try loading more\n if (jquery__WEBPACK_IMPORTED_MODULE_0___default()('.js__files')[0].innerHTML.split('card-item').length - 1 === MEDIA_PAGINATION_INTERVAL) {\n fillView();\n enableInfiniteScrolling();\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL21lZGlhL2luZGV4LmpzPzE1NDAiXSwibmFtZXMiOlsiRmlsdGVyIiwiVVJJIiwiY29uZmlnIiwibmFtZSIsInZhbHVlIiwiZmlsdGVyZWQiLCJrZXlzIiwiT2JqZWN0IiwidXJpX3BhcmFtcyIsImluZGV4T2YiLCJwdXNoIiwiZm9yRWFjaCIsImtleSIsImZpbHRlciIsImNsZWFuVmFsdWUiLCJnbG9iYWwiLCJsb2NhdGlvbiIsImpvaW4iLCJlbmNvZGVVUklDb21wb25lbnQiLCJyZXBsYWNlIiwiSW5zdGFuY2UiLCJpc0xvYWRpbmciLCJmaWx0ZXJzIiwiZ2xvYmFsX2luZGV4IiwiZmlsZXNfZW5kZWQiLCJNRURJQV9QQUdJTkFUSU9OX0lOVEVSVkFMIiwiJCIsIm9uIiwiZXZlbnQiLCJ0YXJnZXQiLCJjdXJyZW50VGFyZ2V0IiwiZmlsdGVyTmFtZSIsImRhdGEiLCJmaWx0ZXJWYWx1ZSIsInZhbCIsImZpbHRlckZpbGVzIiwiZHJvcHpvbmUiLCJib2R5IiwicGFnZSIsImRhdGUiLCJ0eXBlIiwiZmlsZXMiLCJmaWxlIiwicHJldmlld0VsZW1lbnQiLCJyZW1vdmUiLCJmaXJzdCIsInJlbW92ZUNsYXNzIiwicmVxdWVzdCIsIm1ldGhvZCIsImxvYWRNZWRpYSIsImNhbGxiYWNrIiwidXJsIiwic3BsaXQiLCJzaG93IiwiY29udGVudCIsImFwcGVuZCIsImhpZGUiLCJ0cmlnZ2VyIiwiY2xlYW5GaWxlc0xpc3QiLCJyZXNldEFjdGl2ZVN0YXRlSW5TaWRlYmFyIiwic2hvd0VtcHR5U3RhdGUiLCJ0cmltIiwibGVuZ3RoIiwiaHRtbCIsInBhcmVudHMiLCJhZGRDbGFzcyIsIm9wdGlvbnMiLCJkaXNhYmxlSW5maW5pdGVTY3JvbGxpbmciLCJlbmFibGVJbmZpbml0ZVNjcm9sbGluZyIsInZpZXciLCJsYXN0Iiwic2Nyb2xsVG9wIiwiaW5uZXJIZWlnaHQiLCJzY3JvbGxIZWlnaHQiLCJmaWxsVmlldyIsImxvYWROZXh0QmF0Y2giLCJmaW5kIiwib2Zmc2V0Iiwic2V0VGltZW91dCIsInRvcCIsImhlaWdodCIsInVuYmluZCIsImlubmVySFRNTCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTs7SUFFcUJBLE07QUFDakIsb0JBQWM7QUFBQTs7QUFDVixTQUFLQyxHQUFMLGFBQWNDLGlFQUFkO0FBQ0g7Ozs7V0FFRCxnQkFBT0MsSUFBUCxFQUFhQyxLQUFiLEVBQW9CO0FBQ2hCLFVBQUlDLFFBQVEsR0FBRyxFQUFmO0FBQ0EsVUFBSUMsSUFBSSxHQUFHQyxNQUFNLENBQUNELElBQVAsQ0FBWUUsbURBQVosQ0FBWDs7QUFDQSxVQUFJLENBQUMsQ0FBQ0YsSUFBSSxDQUFDRyxPQUFMLENBQWFOLElBQWIsQ0FBTixFQUEwQjtBQUFFRyxZQUFJLENBQUNJLElBQUwsQ0FBVVAsSUFBVjtBQUFrQjs7QUFFOUNHLFVBQUksQ0FBQ0ssT0FBTCxDQUFhLFVBQUNDLEdBQUQsRUFBUztBQUNsQixZQUFJQyxNQUFNLEdBQUdiLE1BQU0sQ0FBQ2MsVUFBUCxDQUFrQkYsR0FBRyxLQUFLVCxJQUFSLEdBQWVDLEtBQWYsR0FBdUJJLG1EQUFVLENBQUNJLEdBQUQsQ0FBbkQsQ0FBYjs7QUFDQSxZQUFJQyxNQUFNLEtBQUssR0FBZixFQUFvQjtBQUNoQlIsa0JBQVEsQ0FBQ0ssSUFBVCxXQUFpQkUsR0FBakIsU0FBdUJWLHlEQUF2QixTQUEwQ1csTUFBMUM7QUFDSDtBQUNKLE9BTEQ7QUFPQUUsMkJBQU0sQ0FBQ0MsUUFBUCxHQUFrQixLQUFLZixHQUFMLEdBQVdJLFFBQVEsQ0FBQ1ksSUFBVCxDQUFjLEdBQWQsQ0FBN0I7QUFDSDs7O1dBRUQsb0JBQWtCYixLQUFsQixFQUF5QjtBQUNyQixhQUFPYyxrQkFBa0IsQ0FBQ2QsS0FBSyxDQUFDZSxPQUFOLENBQWMsR0FBZCxFQUFtQixJQUFuQixDQUFELENBQXpCO0FBQ0g7Ozs7Ozs7QUFHRSxJQUFJQyxRQUFRLEdBQUcsSUFBSXBCLE1BQUosRUFBZjtBQUNQLElB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QUMsWUFBRCxDQUFELENBQWdCa0QsSUFBaEIsQ0FBcUIsWUFBckIsRUFBbUNOLElBQW5DLEdBQTBDTyxNQUExQyxFQUFMLEVBQXlEO0FBQ3JEQyxjQUFVLENBQUMsWUFBVztBQUNsQjtBQUNBSixjQUFRO0FBQ1gsS0FIUyxFQUdQLEdBSE8sQ0FBVjtBQUtBO0FBQ0g7O0FBRUQsTUFBSWhELDZDQUFDLENBQUMsWUFBRCxDQUFELENBQWdCa0QsSUFBaEIsQ0FBcUIsWUFBckIsRUFBbUNOLElBQW5DLEdBQTBDTyxNQUExQyxHQUFtREUsR0FBbkQsR0FBeUQsQ0FBekQsSUFBOERyRCw2Q0FBQyxDQUFDLGtCQUFELENBQUQsQ0FBc0JzRCxNQUF0QixFQUFsRSxFQUFrRztBQUM5RkwsaUJBQWEsQ0FBQyxZQUFXO0FBQ3JCRCxjQUFRO0FBQ1gsS0FGWSxDQUFiO0FBR0g7QUFDSixDQWZEO0FBaUJBOzs7QUFDQSxJQUFJUCx3QkFBd0IsR0FBRyxTQUFTQSx3QkFBVCxHQUFvQztBQUMvRHpDLCtDQUFDLENBQUMsaUJBQUQsQ0FBRCxDQUFxQjhCLElBQXJCO0FBQ0E5QiwrQ0FBQyxDQUFDLGtCQUFELENBQUQsQ0FBc0J1RCxNQUF0QixDQUE2QixRQUE3QjtBQUNILENBSEQ7O0FBS0F2RCw2Q0FBQyxDQUFDLFlBQUQsQ0FBRCxDQUFnQkMsRUFBaEIsQ0FBbUIsVUFBbkIsRUFBK0IsVUFBU0MsS0FBVCxFQUFnQjtBQUMzQztBQUNBLE1BQUtGLDZDQUFDLENBQUMsWUFBRCxDQUFELENBQWdCLENBQWhCLEVBQW1Cd0QsU0FBbkIsQ0FBNkI5QixLQUE3QixDQUFtQyxXQUFuQyxFQUFnRFUsTUFBaEQsR0FBeUQsQ0FBMUQsS0FBaUVyQyx5QkFBckUsRUFBZ0c7QUFDNUZpRCxZQUFRO0FBQ1JOLDJCQUF1QjtBQUMxQjtBQUNKLENBTkQiLCJmaWxlIjoiLi9hcHAvbWVkaWEvaW5kZXguanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IHsgY29uZmlnLCB1cmlfcGFyYW1zIH0gZnJvbSAnZ3Jhdi1jb25maWcnO1xuaW1wb3J0IHJlcXVlc3QgZnJvbSAnLi4vdXRpbHMvcmVxdWVzdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZpbHRlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuVVJJID0gYCR7Y29uZmlnLmJhc2VfdXJsX3JlbGF0aXZlfS9tZWRpYS1tYW5hZ2VyL2A7XG4gICAgfVxuXG4gICAgZmlsdGVyKG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIGxldCBmaWx0ZXJlZCA9IFtdO1xuICAgICAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKHVyaV9wYXJhbXMpO1xuICAgICAgICBpZiAoIX5rZXlzLmluZGV4T2YobmFtZSkpIHsga2V5cy5wdXNoKG5hbWUpOyB9XG5cbiAgICAgICAga2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgIGxldCBmaWx0ZXIgPSBGaWx0ZXIuY2xlYW5WYWx1ZShrZXkgPT09IG5hbWUgPyB2YWx1ZSA6IHVyaV9wYXJhbXNba2V5XSk7XG4gICAgICAgICAgICBpZiAoZmlsdGVyICE9PSAnKicpIHtcbiAgICAgICAgICAgICAgICBmaWx0ZXJlZC5wdXNoKGAke2tleX0ke2NvbmZpZy5wYXJhbV9zZXB9JHtmaWx0ZXJ9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGdsb2JhbC5sb2NhdGlvbiA9IHRoaXMuVVJJICsgZmlsdGVyZWQuam9pbignLycpO1xuICAgIH1cblxuICAgIHN0YXRpYyBjbGVhblZhbHVlKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQodmFsdWUucmVwbGFjZSgnLycsICdcXFxcJykpO1xuICAgIH1cbn1cblxuZXhwb3J0IGxldCBJbnN0YW5jZSA9IG5ldyBGaWx0ZXIoKTtcbnZhciBpc0xvYWRpbmcgPSBmYWxzZTtcblxudmFyIGZpbHRlcnMgPSB7fTtcbnZhciBnbG9iYWxfaW5kZXggPSAxO1xudmFyIGZpbGVzX2VuZGVkID0gZmFsc2U7XG5jb25zdCBNRURJQV9QQUdJTkFUSU9OX0lOVEVSVkFMID0gMjA7XG5cbi8qIGhhbmRsZSBjaGFuZ2luZyBmaWxlIHR5cGUgLyBkYXRlIGZpbHRlciAqL1xuJCgnYm9keScpLm9uKCdjaGFuZ2UnLCAnLnRodW1icy1saXN0LWNvbnRhaW5lciBzZWxlY3QuZmlsdGVyJywgKGV2ZW50KSA9PiB7XG4gICAgbGV0IHRhcmdldCA9ICQoZXZlbnQuY3VycmVudFRhcmdldCk7XG4gICAgbGV0IGZpbHRlck5hbWUgPSB0YXJnZXQuZGF0YSgnbmFtZScpO1xuICAgIGxldCBmaWx0ZXJWYWx1ZSA9IHRhcmdldC52YWwoKTtcblxuICAgIGlmIChmaWx0ZXJWYWx1ZSkge1xuICAgICAgICBmaWx0ZXJzW2ZpbHRlck5hbWVdID0gZmlsdGVyVmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIGZpbHRlcnNbZmlsdGVyTmFtZV07XG4gICAgfVxuXG4gICAgZmlsdGVyRmlsZXMoKTtcbn0pO1xuXG4vKiBpbml0aWFsaXplIG1lZGlhIHVwbG9hZGVyICovXG5pZiAoJCgnLnRodW1icy1saXN0LWNvbnRhaW5lciAuZHJvcHpvbmUnKVswXSkge1xuICAgICQoJy50aHVtYnMtbGlzdC1jb250YWluZXIgLmRyb3B6b25lJylbMF0uZHJvcHpvbmUub24oJ3F1ZXVlY29tcGxldGUnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgbGV0IGJvZHkgPSB7fTtcbiAgICAgICAgaWYgKGZpbHRlcnMucGFnZSkgeyBib2R5LnBhZ2UgPSBmaWx0ZXJzLnBhZ2U7IH1cbiAgICAgICAgaWYgKGZpbHRlcnMuZGF0ZSkgeyBib2R5LmRhdGUgPSBmaWx0ZXJzLmRhdGU7IH1cbiAgICAgICAgaWYgKGZpbHRlcnMudHlwZSkgeyBib2R5LnR5cGUgPSBmaWx0ZXJzLnR5cGU7IH1cblxuICAgICAgICAkKCcuZHJvcHpvbmUnKVswXS5kcm9wem9uZS5maWxlcy5mb3JFYWNoKGZ1bmN0aW9uKGZpbGUpIHsgZmlsZS5wcmV2aWV3RWxlbWVudC5yZW1vdmUoKTsgfSk7XG4gICAgICAgICQoJy5kcm9wem9uZScpLmZpcnN0KCkucmVtb3ZlQ2xhc3MoJ2R6LXN0YXJ0ZWQnKTtcblxuICAgICAgICByZXF1ZXN0KGAke2NvbmZpZy5iYXNlX3VybF9yZWxhdGl2ZX0vbWVkaWEtbWFuYWdlci5qc29uL3Rhc2ske2NvbmZpZy5wYXJhbV9zZXB9Y2xlYXJNZWRpYUNhY2hlYCwgeyBtZXRob2Q6ICdwb3N0JywgYm9keSB9LCAoKSA9PiB7XG4gICAgICAgICAgICBmaWx0ZXJGaWxlcygpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cblxuLyogaGFuZGxlIGxvYWRpbmcgbWVkaWEgKi9cbnZhciBsb2FkTWVkaWEgPSBmdW5jdGlvbiBsb2FkTWVkaWEoZmlsdGVycywgY2FsbGJhY2spIHtcbiAgICB2YXIgdXJsID0gYCR7Y29uZmlnLmJhc2VfdXJsX3JlbGF0aXZlfS9tZWRpYS5qc29uL3RtcGwke2NvbmZpZy5wYXJhbV9zZXB9bWVkaWEtbGlzdC1jb250ZW50L2luZGV4JHtjb25maWcucGFyYW1fc2VwfSR7Z2xvYmFsX2luZGV4fWA7XG5cbiAgICBpZiAoZmlsdGVycy5wYWdlKSB7XG4gICAgICAgIHVybCArPSBgL3BhZ2Uke2NvbmZpZy5wYXJhbV9zZXB9JHsoZmlsdGVycy5wYWdlKS5zcGxpdCgnLycpLmpvaW4oJyU1QycpfWA7XG4gICAgfVxuICAgIGlmIChmaWx0ZXJzLnR5cGUgJiYgZmlsdGVycy50eXBlICE9PSAnKicpIHtcbiAgICAgICAgdXJsICs9IGAvdHlwZSR7Y29uZmlnLnBhcmFtX3NlcH0ke2ZpbHRlcnMudHlwZX1gO1xuICAgIH1cbiAgICBpZiAoZmlsdGVycy5kYXRlICYmIGZpbHRlcnMuZGF0ZSAhPT0gJyonKSB7XG4gICAgICAgIHVybCArPSBgL2RhdGUke2NvbmZpZy5wYXJhbV9zZXB9JHtmaWx0ZXJzLmRhdGV9YDtcbiAgICB9XG5cbiAgICBpZiAoIWlzTG9hZGluZykge1xuICAgICAgICBpc0xvYWRpbmcgPSB0cnVlO1xuXG4gICAgICAgICQoJy5zcGlubmluZy13aGVlbCcpLnNob3coKTtcbiAgICAgICAgJC5nZXQodXJsLCBmdW5jdGlvbihjb250ZW50KSB7XG4gICAgICAgICAgICAkKCcuanNfX2ZpbGVzJykuYXBwZW5kKGNvbnRlbnQpO1xuICAgICAgICAgICAgJCgnLnNwaW5uaW5nLXdoZWVsJykuaGlkZSgpO1xuICAgICAgICAgICAgJCgnLm1lZGlhLWNvbnRhaW5lciAubWVkaWEtcmFuZ2UnKS50cmlnZ2VyKCdjaGFuZ2UnKTtcbiAgICAgICAgICAgIGlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgZ2xvYmFsX2luZGV4Kys7XG5cbiAgICAgICAgICAgIGNhbGxiYWNrKGNvbnRlbnQpO1xuICAgICAgICB9KTtcbiAgICB9XG59O1xuXG52YXIgY2xlYW5GaWxlc0xpc3QgPSBmdW5jdGlvbiBjbGVhbkZpbGVzTGlzdCgpIHtcbiAgICAkKCcuanNfX2ZpbGVzIC5jYXJkLWl0ZW0nKS5yZW1vdmUoKTtcbn07XG5cbnZhciByZXNldEFjdGl2ZVN0YXRlSW5TaWRlYmFyID0gZnVuY3Rpb24gcmVzZXRBY3RpdmVTdGF0ZUluU2lkZWJhcigpIHtcbiAgICAkKCcucGFnZXMtbGlzdC1jb250YWluZXIgLnJvdycpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTsgLy8gY2xlYXIgYWN0aXZlIHN0YXRlIGluIHNpZGViYXJcbn07XG5cbnZhciBzaG93RW1wdHlTdGF0ZSA9IGZ1bmN0aW9uIHNob3dFbXB0eVN0YXRlKCkge1xuICAgICQoJy50aHVtYnMtbGlzdC1jb250YWluZXInKS5hcHBlbmQoJzxwIGNsYXNzPVwiY2FyZC1pdGVtIGVtcHR5LXNwYWNlXCI+Tm8gbWVkaWEgZm91bmQ8L3A+Jyk7XG59O1xuXG52YXIgZmlsdGVyRmlsZXMgPSBmdW5jdGlvbiBmaWx0ZXJGaWxlcygpIHtcbiAgICBjbGVhbkZpbGVzTGlzdCgpO1xuICAgIGdsb2JhbF9pbmRleCA9IDA7XG4gICAgZmlsZXNfZW5kZWQgPSBmYWxzZTtcbiAgICAkKCcuZW1wdHktc3BhY2UnKS5yZW1vdmUoKTtcbiAgICBsb2FkTWVkaWEoZmlsdGVycywgZnVuY3Rpb24oY29udGVudCkge1xuICAgICAgICBpZiAoIWNvbnRlbnQudHJpbSgpLmxlbmd0aCkge1xuICAgICAgICAgICAgc2hvd0VtcHR5U3RhdGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghZmlsdGVycy5wYWdlICYmICghZmlsdGVycy5kYXRlIHx8IGZpbHRlcnMuZGF0ZSA9PT0gJyonKSAmJiAoIWZpbHRlcnMudHlwZSB8fCBmaWx0ZXJzLnR5cGUgPT09ICcqJykpIHtcbiAgICAgICAgICAgICAgICAkKCcuanNfX2ZpbGVzJykudHJpZ2dlcignZmlsbFZpZXcnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufTtcblxuLyogaGFuZGxlIGNoYW5naW5nIHBhZ2UgKi9cbiQoJ2JvZHknKS5vbignY2xpY2snLCAnLnBhZ2VzLWxpc3QtY29udGFpbmVyIC5qc19fcGFnZS1saW5rJywgKGV2ZW50KSA9PiB7XG4gICAgdmFyIHBhZ2UgPSAkKGV2ZW50LnRhcmdldCkuZGF0YSgncGFnZScpO1xuICAgIGZpbHRlcnNbJ3BhZ2UnXSA9IHBhZ2U7XG5cbiAgICAkKCcubWVkaWEtbGlzdC10aXRsZSAucGFnZS1pbmRpY2F0b3InKS5odG1sKHBhZ2UpOyAvLyBzZXQgaW5kaWNhdGlvblxuICAgICQoJy5qc19fcmVzZXQtcGFnZXMtZmlsdGVyJykucmVtb3ZlQ2xhc3MoJ2hpZGRlbicpOyAvLyBhY3RpdmF0ZSByZXNldCBwYWdlcyBpY29uXG4gICAgcmVzZXRBY3RpdmVTdGF0ZUluU2lkZWJhcigpO1xuICAgICQoZXZlbnQudGFyZ2V0KS5wYXJlbnRzKCcucm93JykuYWRkQ2xhc3MoJ2FjdGl2ZScpOyAvLyBzZXQgYWN0aXZlIHN0YXRlIGluIHNpZGViYXJcbiAgICAkKCcuanNfX2ZpbGUtdXBsb2FkZXInKS5yZW1vdmVDbGFzcygnaGlkZGVuJyk7XG5cbiAgICAvLyBjdXN0b21pemUgcHJvY2Vzc2luZyBVUkwsIGFzIHRoZSBwYWdlIGNoYW5nZXMgZHluYW1pY2FsbHlcbiAgICBpZiAoJCgnLmRyb3B6b25lJylbMF0pIHtcbiAgICAgICAgJCgnLmRyb3B6b25lJylbMF0uZHJvcHpvbmUub24oJ3Byb2Nlc3NpbmcnLCBmdW5jdGlvbihmaWxlKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMudXJsID0gYCR7Y29uZmlnLmJhc2VfdXJsX3JlbGF0aXZlfS9tZWRpYS1tYW5hZ2VyJHtwYWdlfS5qc29uL3Rhc2ske2NvbmZpZy5wYXJhbV9zZXB9YWRkbWVkaWFgO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAkKCcuanNfX2J1dHRvbi1jbGVhci1tZWRpYS1jYWNoZScpLmFkZENsYXNzKCdoaWRkZW4nKTtcbiAgICBmaWx0ZXJGaWxlcygpO1xuXG4gICAgZGlzYWJsZUluZmluaXRlU2Nyb2xsaW5nKCk7IC8vIG9ubHkgaW5maW5pdGUgc2Nyb2xsIG9uIG1haW4gbGlzdCwgbm90IGluc2lkZSBzaW5nbGUgcGFnZXNcbn0pO1xuXG4vKiBoYW5kbGUgY2xlYXJpbmcgcGFnZSBmaWx0ZXIgKi9cbiQoJ2JvZHknKS5vbignY2xpY2snLCAnLmpzX19yZXNldC1wYWdlcy1maWx0ZXInLCAoZXZlbnQpID0+IHtcbiAgICAkKCcubWVkaWEtbGlzdC10aXRsZSAucGFnZS1pbmRpY2F0b3InKS5odG1sKCdBbGwgUGFnZXMnKTsgLy8gc2V0IGluZGljYXRpb25cbiAgICBjbGVhbkZpbGVzTGlzdCgpO1xuICAgIHJlc2V0QWN0aXZlU3RhdGVJblNpZGViYXIoKTtcbiAgICAkKCcuanNfX3Jlc2V0LXBhZ2VzLWZpbHRlcicpLmFkZENsYXNzKCdoaWRkZW4nKTsgLy8gcmVtb3ZlIHJlc2V0IHBhZ2VzIGljb25cbiAgICAkKCcuanNfX2ZpbGUtdXBsb2FkZXInKS5hZGRDbGFzcygnaGlkZGVuJyk7XG4gICAgJCgnLmpzX19idXR0b24tY2xlYXItbWVkaWEtY2FjaGUnKS5yZW1vdmVDbGFzcygnaGlkZGVuJyk7XG4gICAgZGVsZXRlIGZpbHRlcnNbJ3BhZ2UnXTtcblxuICAgIGZpbHRlckZpbGVzKCk7XG59KTtcblxuLyogaGFuZGxlIGluZmluaXRlIGxvYWRpbmcgKi9cbnZhciBlbmFibGVJbmZpbml0ZVNjcm9sbGluZyA9IGZ1bmN0aW9uIGVuYWJsZUluZmluaXRlU2Nyb2xsaW5nKCkge1xuICAgICQoJy5zcGlubmluZy13aGVlbCcpLmhpZGUoKTtcbiAgICB2YXIgdmlldyA9ICQoJy5tZWRpYXBpY2tlci1zY3JvbGwnKS5sYXN0KCk7XG5cbiAgICBpZiAoIXZpZXcubGVuZ3RoKSB7IHJldHVybjsgfVxuXG4gICAgJCh2aWV3KS5vbignc2Nyb2xsJywgZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICgoJCh0aGlzKS5zY3JvbGxUb3AoKSArICQodGhpcykuaW5uZXJIZWlnaHQoKSArIDEwMCkgPj0gJCh0aGlzKVswXS5zY3JvbGxIZWlnaHQpIHtcbiAgICAgICAgICAgIGZpbGxWaWV3KCk7XG4gICAgICAgIH1cbiAgICB9KTtcbn07XG5cbnZhciBsb2FkTmV4dEJhdGNoID0gZnVuY3Rpb24gbG9hZE5leHRCYXRjaChjYWxsYmFjaykge1xuICAgIGlmIChmaWxlc19lbmRlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbG9hZE1lZGlhKHt9LCBmdW5jdGlvbihjb250ZW50KSB7XG4gICAgICAgIGlmICghJChjb250ZW50KS5sZW5ndGggfHwgKChjb250ZW50LnNwbGl0KCdjYXJkLWl0ZW0nKS5sZW5ndGggLSAxKSA8IE1FRElBX1BBR0lOQVRJT05fSU5URVJWQUwpKSB7XG4gICAgICAgICAgICBmaWxlc19lbmRlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgJCgnLm1lZGlhLWNvbnRhaW5lciAubWVkaWEtcmFuZ2UnKS50cmlnZ2VyKCdpbnB1dCcpO1xuICAgIH0pO1xufTtcblxudmFyIGZpbGxWaWV3ID0gZnVuY3Rpb24gZmlsbFZpZXcoKSB7XG4gICAgaWYgKCEkKCcuanNfX2ZpbGVzJykuZmluZCgnLmNhcmQtaXRlbScpLmxhc3QoKS5vZmZzZXQoKSkge1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgLy8gcmV0cnkgbGF0ZXJcbiAgICAgICAgICAgIGZpbGxWaWV3KCk7XG4gICAgICAgIH0sIDMwMCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICgkKCcuanNfX2ZpbGVzJykuZmluZCgnLmNhcmQtaXRlbScpLmxhc3QoKS5vZmZzZXQoKS50b3AgLSAxIDw9ICQoJy5tZWRpYS1jb250YWluZXInKS5oZWlnaHQoKSkge1xuICAgICAgICBsb2FkTmV4dEJhdGNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgZmlsbFZpZXcoKTtcbiAgICAgICAgfSk7XG4gICAgfVxufTtcblxuLyogZGlzYWJsZSBpbmZpbml0ZSBsb2FkaW5nICovXG52YXIgZGlzYWJsZUluZmluaXRlU2Nyb2xsaW5nID0gZnVuY3Rpb24gZGlzYWJsZUluZmluaXRlU2Nyb2xsaW5nKCkge1xuICAgICQoJy5zcGlubmluZy13aGVlbCcpLmhpZGUoKTtcbiAgICAkKCcuY29udGVudC13cmFwcGVyJykudW5iaW5kKCdzY3JvbGwnKTtcbn07XG5cbiQoJy5qc19fZmlsZXMnKS5vbignZmlsbFZpZXcnLCBmdW5jdGlvbihldmVudCkge1xuICAgIC8vIHRoZSBmaXJzdCBiYXRjaCBnb3QgdGhlIG1heCBudW1iZXIgb2YgbWVkaWEgZmlsZXMsIHRyeSBsb2FkaW5nIG1vcmVcbiAgICBpZiAoKCQoJy5qc19fZmlsZXMnKVswXS5pbm5lckhUTUwuc3BsaXQoJ2NhcmQtaXRlbScpLmxlbmd0aCAtIDEpID09PSBNRURJQV9QQUdJTkFUSU9OX0lOVEVSVkFMKSB7XG4gICAgICAgIGZpbGxWaWV3KCk7XG4gICAgICAgIGVuYWJsZUluZmluaXRlU2Nyb2xsaW5nKCk7XG4gICAgfVxufSk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./app/media/index.js\n"); /***/ }), /***/ "./app/pages/filter.js": -/*!*****************************!* +/*!*****************************!*\ !*** ./app/pages/filter.js ***! \*****************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => /* binding */ PagesFilter,\n/* harmony export */ \"Instance\": () => /* binding */ Instance\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! grav-config */ \"grav-config\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(grav_config__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _utils_request__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/request */ \"./app/utils/request.js\");\n/* harmony import */ var debounce__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! debounce */ \"./node_modules/debounce/index.js\");\n/* harmony import */ var debounce__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(debounce__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _tree__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tree */ \"./app/pages/tree.js\");\n/* harmony import */ var selectize__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! selectize */ \"./node_modules/selectize/dist/js/selectize.js\");\n/* harmony import */ var selectize__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(selectize__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _utils_selectize_required_fix_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/selectize-required-fix.js */ \"./app/utils/selectize-required-fix.js\");\n/* harmony import */ var _utils_storage__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/storage */ \"./app/utils/storage.js\");\n/* harmony import */ var _utils_storage__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_utils_storage__WEBPACK_IMPORTED_MODULE_7__);\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\n\n\n\n\n\n/* @formatter:off */\n\n/* eslint-disable */\n\nvar options = [{\n flag: grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.MODULE,\n key: 'Module',\n cat: 'mode'\n}, {\n flag: grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.VISIBLE,\n key: 'Visible',\n cat: 'mode'\n}, {\n flag: grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.ROUTABLE,\n key: 'Routable',\n cat: 'mode'\n}, {\n flag: grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.PUBLISHED,\n key: 'Published',\n cat: 'mode'\n}, {\n flag: grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.NON_MODULE,\n key: 'NonModule',\n cat: 'mode'\n}, {\n flag: grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.NON_VISIBLE,\n key: 'NonVisible',\n cat: 'mode'\n}, {\n flag: grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.NON_ROUTABLE,\n key: 'NonRoutable',\n cat: 'mode'\n}, {\n flag: grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.NON_PUBLISHED,\n key: 'NonPublished',\n cat: 'mode'\n}];\n/* @formatter:on */\n\n/* eslint-enable */\n\nvar PagesFilter = /*#__PURE__*/function () {\n function PagesFilter(filters, search) {\n var _this = this;\n\n _classCallCheck(this, PagesFilter);\n\n this.filters = jquery__WEBPACK_IMPORTED_MODULE_0___default()(filters);\n this.search = jquery__WEBPACK_IMPORTED_MODULE_0___default()(search);\n this.options = options;\n this.tree = _tree__WEBPACK_IMPORTED_MODULE_4__.Instance;\n var storage = JSON.parse(localStorage.getItem('grav:admin:pages:filter') || '{}');\n\n if (!this.filters.length || !this.search.length) {\n return;\n }\n\n this.labels = this.filters.data('filter-labels');\n this.search.on('input', debounce__WEBPACK_IMPORTED_MODULE_3___default()(function () {\n return _this.filter();\n }, 250));\n this.filters.on('change', function () {\n return _this.filter();\n }); // restore state\n\n if (storage.flags || storage.query) {\n this.setValues(storage);\n this.filter();\n }\n\n this._initSelectize();\n }\n\n _createClass(PagesFilter, [{\n key: \"filter\",\n value: function filter(value) {\n var _this2 = this;\n\n var data = {\n flags: '',\n query: ''\n };\n\n if (_typeof(value) === 'object') {\n Object.assign(data, value);\n }\n\n if (typeof value === 'string') {\n data.query = value;\n }\n\n if (typeof value === 'undefined') {\n data.flags = this.filters.val();\n data.query = this.search.val();\n }\n\n if (!Object.keys(data).filter(function (key) {\n return data[key] !== '';\n }).length) {\n this.resetValues();\n return;\n }\n\n data.flags = data.flags.replace(/(\\s{1,})?,(\\s{1,})?/g, ',');\n this.setValues({\n flags: data.flags,\n query: data.query\n }, 'silent');\n (0,_utils_request__WEBPACK_IMPORTED_MODULE_2__.default)(\"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.base_url_relative, \"/pages-filter.json/task\").concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.param_sep, \"filterPages\"), {\n method: 'post',\n body: data\n }, function (response) {\n _this2.refreshDOM(response);\n });\n }\n }, {\n key: \"refreshDOM\",\n value: function refreshDOM(response) {\n var _this3 = this;\n\n var items = jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-nav-id]');\n\n if (!response) {\n items.removeClass('search-match').show();\n this.tree.restore();\n return;\n }\n\n items.removeClass('search-match').hide();\n response.results.forEach(function (page) {\n var match = items.filter(\"[data-nav-id=\\\"\".concat(page, \"\\\"]\")).addClass('search-match').show();\n match.parents('[data-nav-id]').addClass('search-match').show();\n\n _this3.tree.expand(page, 'no-store');\n });\n }\n }, {\n key: \"setValues\",\n value: function setValues(_ref, silent) {\n var _ref$flags = _ref.flags,\n flags = _ref$flags === void 0 ? '' : _ref$flags,\n _ref$query = _ref.query,\n query = _ref$query === void 0 ? '' : _ref$query;\n var flagsArray = flags.replace(/(\\s{1,})?,(\\s{1,})?/g, ',').split(',');\n\n if (this.filters.val() !== flags) {\n var selectize = this.filters.data('selectize');\n this.filters[selectize ? 'setValue' : 'val'](flagsArray, silent);\n }\n\n if (this.search.val() !== query) {\n this.search.val(query);\n }\n\n localStorage.setItem('grav:admin:pages:filter', JSON.stringify({\n flags: flags,\n query: query\n }));\n }\n }, {\n key: \"resetValues\",\n value: function resetValues() {\n this.setValues('', 'silent');\n this.refreshDOM();\n }\n }, {\n key: \"_initSelectize\",\n value: function _initSelectize() {\n var _this4 = this;\n\n var extras = {\n type: this.filters.data('filter-types') || {},\n access: this.filters.data('filter-access-levels') || {}\n };\n Object.keys(extras).forEach(function (cat) {\n Object.keys(extras[cat]).forEach(function (key) {\n _this4.options.push({\n cat: cat,\n key: key,\n flag: extras[cat][key]\n });\n });\n });\n this.filters.selectize({\n maxItems: null,\n valueField: 'key',\n labelField: 'flag',\n searchField: ['flag', 'key'],\n options: this.options,\n optgroups: this.labels,\n optgroupField: 'cat',\n optgroupLabelField: 'name',\n optgroupValueField: 'id',\n optgroupOrder: this.labels.map(function (item) {\n return item.id;\n }),\n plugins: ['optgroup_columns', 'required-fix']\n });\n }\n }]);\n\n return PagesFilter;\n}();\n\n\nvar Instance = new PagesFilter('input[name=\"page-filter\"]', 'input[name=\"page-search\"]');\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL3BhZ2VzL2ZpbHRlci5qcz80NzRmIl0sIm5hbWVzIjpbIm9wdGlvbnMiLCJmbGFnIiwidHJhbnNsYXRpb25zIiwia2V5IiwiY2F0IiwiUGFnZXNGaWx0ZXIiLCJmaWx0ZXJzIiwic2VhcmNoIiwiJCIsInRyZWUiLCJwYWdlc1RyZWUiLCJzdG9yYWdlIiwiSlNPTiIsInBhcnNlIiwibG9jYWxTdG9yYWdlIiwiZ2V0SXRlbSIsImxlbmd0aCIsImxhYmVscyIsImRhdGEiLCJvbiIsImRlYm91bmNlIiwiZmlsdGVyIiwiZmxhZ3MiLCJxdWVyeSIsInNldFZhbHVlcyIsIl9pbml0U2VsZWN0aXplIiwidmFsdWUiLCJPYmplY3QiLCJhc3NpZ24iLCJ2YWwiLCJrZXlzIiwicmVzZXRWYWx1ZXMiLCJyZXBsYWNlIiwicmVxdWVzdCIsImNvbmZpZyIsIm1ldGhvZCIsImJvZHkiLCJyZXNwb25zZSIsInJlZnJlc2hET00iLCJpdGVtcyIsInJlbW92ZUNsYXNzIiwic2hvdyIsInJlc3RvcmUiLCJoaWRlIiwicmVzdWx0cyIsImZvckVhY2giLCJwYWdlIiwibWF0Y2giLCJhZGRDbGFzcyIsInBhcmVudHMiLCJleHBhbmQiLCJzaWxlbnQiLCJmbGFnc0FycmF5Iiwic3BsaXQiLCJzZWxlY3RpemUiLCJzZXRJdGVtIiwic3RyaW5naWZ5IiwiZXh0cmFzIiwidHlwZSIsImFjY2VzcyIsInB1c2giLCJtYXhJdGVtcyIsInZhbHVlRmllbGQiLCJsYWJlbEZpZWxkIiwic2VhcmNoRmllbGQiLCJvcHRncm91cHMiLCJvcHRncm91cEZpZWxkIiwib3B0Z3JvdXBMYWJlbEZpZWxkIiwib3B0Z3JvdXBWYWx1ZUZpZWxkIiwib3B0Z3JvdXBPcmRlciIsIm1hcCIsIml0ZW0iLCJpZCIsInBsdWdpbnMiLCJJbnN0YW5jZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QWdCLFVBQUNDLElBQUQ7QUFBQSxpQkFBVUEsSUFBSSxDQUFDQyxFQUFmO0FBQUEsU0FBaEIsQ0FWSTtBQVduQkMsZUFBTyxFQUFFLENBQUMsa0JBQUQsRUFBcUIsY0FBckI7QUFYVSxPQUF2QjtBQWFIOzs7Ozs7O0FBR0wsSUFBSUMsUUFBUSxHQUFHLElBQUlyRSxXQUFKLENBQWdCLDJCQUFoQixFQUE2QywyQkFBN0MsQ0FBZiIsImZpbGUiOiIuL2FwcC9wYWdlcy9maWx0ZXIuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IHsgY29uZmlnLCB0cmFuc2xhdGlvbnMgfSBmcm9tICdncmF2LWNvbmZpZyc7XG5pbXBvcnQgcmVxdWVzdCBmcm9tICcuLi91dGlscy9yZXF1ZXN0JztcbmltcG9ydCBkZWJvdW5jZSBmcm9tICdkZWJvdW5jZSc7XG5pbXBvcnQgeyBJbnN0YW5jZSBhcyBwYWdlc1RyZWUgfSBmcm9tICcuL3RyZWUnO1xuaW1wb3J0ICdzZWxlY3RpemUnO1xuaW1wb3J0ICcuLi91dGlscy9zZWxlY3RpemUtcmVxdWlyZWQtZml4LmpzJztcbmltcG9ydCAnLi4vdXRpbHMvc3RvcmFnZSc7XG5cbi8qIEBmb3JtYXR0ZXI6b2ZmICovXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuY29uc3Qgb3B0aW9ucyA9IFtcbiAgICB7IGZsYWc6IHRyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uTU9EVUxFLCAgICAgICAga2V5OiAnTW9kdWxlJywgICAgICBjYXQ6ICdtb2RlJyB9LFxuICAgIHsgZmxhZzogdHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5WSVNJQkxFLCAgICAgICBrZXk6ICdWaXNpYmxlJywgICAgICBjYXQ6ICdtb2RlJyB9LFxuICAgIHsgZmxhZzogdHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5ST1VUQUJMRSwgICAgICBrZXk6ICdSb3V0YWJsZScsICAgICBjYXQ6ICdtb2RlJyB9LFxuICAgIHsgZmxhZzogdHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5QVUJMSVNIRUQsICAgICBrZXk6ICdQdWJsaXNoZWQnLCAgICBjYXQ6ICdtb2RlJyB9LFxuICAgIHsgZmxhZzogdHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5OT05fTU9EVUxFLCAgICBrZXk6ICdOb25Nb2R1bGUnLCAgIGNhdDogJ21vZGUnIH0sXG4gICAgeyBmbGFnOiB0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLk5PTl9WSVNJQkxFLCAgIGtleTogJ05vblZpc2libGUnLCAgIGNhdDogJ21vZGUnIH0sXG4gICAgeyBmbGFnOiB0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLk5PTl9ST1VUQUJMRSwgIGtleTogJ05vblJvdXRhYmxlJywgIGNhdDogJ21vZGUnIH0sXG4gICAgeyBmbGFnOiB0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLk5PTl9QVUJMSVNIRUQsIGtleTogJ05vblB1Ymxpc2hlZCcsIGNhdDogJ21vZGUnIH1cbl07XG4vKiBAZm9ybWF0dGVyOm9uICovXG4vKiBlc2xpbnQtZW5hYmxlICovXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBhZ2VzRmlsdGVyIHtcbiAgICBjb25zdHJ1Y3RvcihmaWx0ZXJzLCBzZWFyY2gpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJzID0gJChmaWx0ZXJzKTtcbiAgICAgICAgdGhpcy5zZWFyY2ggPSAkKHNlYXJjaCk7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIHRoaXMudHJlZSA9IHBhZ2VzVHJlZTtcbiAgICAgICAgbGV0IHN0b3JhZ2UgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdncmF2OmFkbWluOnBhZ2VzOmZpbHRlcicpIHx8ICd7fScpO1xuXG4gICAgICAgIGlmICghdGhpcy5maWx0ZXJzLmxlbmd0aCB8fCAhdGhpcy5zZWFyY2gubGVuZ3RoKSB7IHJldHVybjsgfVxuXG4gICAgICAgIHRoaXMubGFiZWxzID0gdGhpcy5maWx0ZXJzLmRhdGEoJ2ZpbHRlci1sYWJlbHMnKTtcblxuICAgICAgICB0aGlzLnNlYXJjaC5vbignaW5wdXQnLCBkZWJvdW5jZSgoKSA9PiB0aGlzLmZpbHRlcigpLCAyNTApKTtcbiAgICAgICAgdGhpcy5maWx0ZXJzLm9uKCdjaGFuZ2UnLCAoKSA9PiB0aGlzLmZpbHRlcigpKTtcblxuICAgICAgICAvLyByZXN0b3JlIHN0YXRlXG4gICAgICAgIGlmIChzdG9yYWdlLmZsYWdzIHx8IHN0b3JhZ2UucXVlcnkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWVzKHN0b3JhZ2UpO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2luaXRTZWxlY3RpemUoKTtcbiAgICB9XG5cbiAgICBmaWx0ZXIodmFsdWUpIHtcbiAgICAgICAgbGV0IGRhdGEgPSB7IGZsYWdzOiAnJywgcXVlcnk6ICcnIH07XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZGF0YSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBkYXRhLnF1ZXJ5ID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGRhdGEuZmxhZ3MgPSB0aGlzLmZpbHRlcnMudmFsKCk7XG4gICAgICAgICAgICBkYXRhLnF1ZXJ5ID0gdGhpcy5zZWFyY2gudmFsKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIU9iamVjdC5rZXlzKGRhdGEpLmZpbHRlcigoa2V5KSA9PiBkYXRhW2tleV0gIT09ICcnKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXRWYWx1ZXMoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGRhdGEuZmxhZ3MgPSBkYXRhLmZsYWdzLnJlcGxhY2UoLyhcXHN7MSx9KT8sKFxcc3sxLH0pPy9nLCAnLCcpO1xuICAgICAgICB0aGlzLnNldFZhbHVlcyh7IGZsYWdzOiBkYXRhLmZsYWdzLCBxdWVyeTogZGF0YS5xdWVyeSB9LCAnc2lsZW50Jyk7XG5cbiAgICAgICAgcmVxdWVzdChgJHtjb25maWcuYmFzZV91cmxfcmVsYXRpdmV9L3BhZ2VzLWZpbHRlci5qc29uL3Rhc2ske2NvbmZpZy5wYXJhbV9zZXB9ZmlsdGVyUGFnZXNgLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdwb3N0JyxcbiAgICAgICAgICAgIGJvZHk6IGRhdGFcbiAgICAgICAgfSwgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hET00ocmVzcG9uc2UpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZWZyZXNoRE9NKHJlc3BvbnNlKSB7XG4gICAgICAgIGxldCBpdGVtcyA9ICQoJ1tkYXRhLW5hdi1pZF0nKTtcblxuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgICBpdGVtcy5yZW1vdmVDbGFzcygnc2VhcmNoLW1hdGNoJykuc2hvdygpO1xuICAgICAgICAgICAgdGhpcy50cmVlLnJlc3RvcmUoKTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaXRlbXMucmVtb3ZlQ2xhc3MoJ3NlYXJjaC1tYXRjaCcpLmhpZGUoKTtcblxuICAgICAgICByZXNwb25zZS5yZXN1bHRzLmZvckVhY2goKHBhZ2UpID0+IHtcbiAgICAgICAgICAgIGxldCBtYXRjaCA9IGl0ZW1zLmZpbHRlcihgW2RhdGEtbmF2LWlkPVwiJHtwYWdlfVwiXWApLmFkZENsYXNzKCdzZWFyY2gtbWF0Y2gnKS5zaG93KCk7XG4gICAgICAgICAgICBtYXRjaC5wYXJlbnRzKCdbZGF0YS1uYXYtaWRdJykuYWRkQ2xhc3MoJ3NlYXJjaC1tYXRjaCcpLnNob3coKTtcblxuICAgICAgICAgICAgdGhpcy50cmVlLmV4cGFuZChwYWdlLCAnbm8tc3RvcmUnKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0VmFsdWVzKHsgZmxhZ3MgPSAnJywgcXVlcnkgPSAnJ30sIHNpbGVudCkge1xuICAgICAgICBsZXQgZmxhZ3NBcnJheSA9IGZsYWdzLnJlcGxhY2UoLyhcXHN7MSx9KT8sKFxcc3sxLH0pPy9nLCAnLCcpLnNwbGl0KCcsJyk7XG4gICAgICAgIGlmICh0aGlzLmZpbHRlcnMudmFsKCkgIT09IGZsYWdzKSB7XG4gICAgICAgICAgICBsZXQgc2VsZWN0aXplID0gdGhpcy5maWx0ZXJzLmRhdGEoJ3NlbGVjdGl6ZScpO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJzW3NlbGVjdGl6ZSA/ICdzZXRWYWx1ZScgOiAndmFsJ10oZmxhZ3NBcnJheSwgc2lsZW50KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zZWFyY2gudmFsKCkgIT09IHF1ZXJ5KSB7IHRoaXMuc2VhcmNoLnZhbChxdWVyeSk7IH1cblxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnZ3JhdjphZG1pbjpwYWdlczpmaWx0ZXInLCBKU09OLnN0cmluZ2lmeSh7IGZsYWdzLCBxdWVyeSB9KSk7XG4gICAgfVxuXG4gICAgcmVzZXRWYWx1ZXMoKSB7XG4gICAgICAgIHRoaXMuc2V0VmFsdWVzKCcnLCAnc2lsZW50Jyk7XG4gICAgICAgIHRoaXMucmVmcmVzaERPTSgpO1xuICAgIH1cblxuICAgIF9pbml0U2VsZWN0aXplKCkge1xuICAgICAgICBsZXQgZXh0cmFzID0ge1xuICAgICAgICAgICAgdHlwZTogdGhpcy5maWx0ZXJzLmRhdGEoJ2ZpbHRlci10eXBlcycpIHx8IHt9LFxuICAgICAgICAgICAgYWNjZXNzOiB0aGlzLmZpbHRlcnMuZGF0YSgnZmlsdGVyLWFjY2Vzcy1sZXZlbHMnKSB8fCB7fVxuICAgICAgICB9O1xuXG4gICAgICAgIE9iamVjdC5rZXlzKGV4dHJhcykuZm9yRWFjaCgoY2F0KSA9PiB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhleHRyYXNbY2F0XSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBjYXQsXG4gICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgZmxhZzogZXh0cmFzW2NhdF1ba2V5XVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZmlsdGVycy5zZWxlY3RpemUoe1xuICAgICAgICAgICAgbWF4SXRlbXM6IG51bGwsXG4gICAgICAgICAgICB2YWx1ZUZpZWxkOiAna2V5JyxcbiAgICAgICAgICAgIGxhYmVsRmllbGQ6ICdmbGFnJyxcbiAgICAgICAgICAgIHNlYXJjaEZpZWxkOiBbJ2ZsYWcnLCAna2V5J10sXG4gICAgICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICAgICAgICBvcHRncm91cHM6IHRoaXMubGFiZWxzLFxuICAgICAgICAgICAgb3B0Z3JvdXBGaWVsZDogJ2NhdCcsXG4gICAgICAgICAgICBvcHRncm91cExhYmVsRmllbGQ6ICduYW1lJyxcbiAgICAgICAgICAgIG9wdGdyb3VwVmFsdWVGaWVsZDogJ2lkJyxcbiAgICAgICAgICAgIG9wdGdyb3VwT3JkZXI6IHRoaXMubGFiZWxzLm1hcCgoaXRlbSkgPT4gaXRlbS5pZCksXG4gICAgICAgICAgICBwbHVnaW5zOiBbJ29wdGdyb3VwX2NvbHVtbnMnLCAncmVxdWlyZWQtZml4J11cbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5sZXQgSW5zdGFuY2UgPSBuZXcgUGFnZXNGaWx0ZXIoJ2lucHV0W25hbWU9XCJwYWdlLWZpbHRlclwiXScsICdpbnB1dFtuYW1lPVwicGFnZS1zZWFyY2hcIl0nKTtcbmV4cG9ydCB7IEluc3RhbmNlIH07XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./app/pages/filter.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ PagesFilter),\n/* harmony export */ \"Instance\": () => (/* binding */ Instance)\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! grav-config */ \"grav-config\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(grav_config__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _utils_request__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/request */ \"./app/utils/request.js\");\n/* harmony import */ var debounce__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! debounce */ \"./node_modules/debounce/index.js\");\n/* harmony import */ var debounce__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(debounce__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _tree__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tree */ \"./app/pages/tree.js\");\n/* harmony import */ var selectize__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! selectize */ \"./node_modules/selectize/dist/js/selectize.js\");\n/* harmony import */ var selectize__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(selectize__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _utils_selectize_required_fix_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/selectize-required-fix.js */ \"./app/utils/selectize-required-fix.js\");\n/* harmony import */ var _utils_storage__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/storage */ \"./app/utils/storage.js\");\n/* harmony import */ var _utils_storage__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_utils_storage__WEBPACK_IMPORTED_MODULE_7__);\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\n\n\n\n\n\n/* @formatter:off */\n\n/* eslint-disable */\n\nvar options = [{\n flag: grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.MODULE,\n key: 'Module',\n cat: 'mode'\n}, {\n flag: grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.VISIBLE,\n key: 'Visible',\n cat: 'mode'\n}, {\n flag: grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.ROUTABLE,\n key: 'Routable',\n cat: 'mode'\n}, {\n flag: grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.PUBLISHED,\n key: 'Published',\n cat: 'mode'\n}, {\n flag: grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.NON_MODULE,\n key: 'NonModule',\n cat: 'mode'\n}, {\n flag: grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.NON_VISIBLE,\n key: 'NonVisible',\n cat: 'mode'\n}, {\n flag: grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.NON_ROUTABLE,\n key: 'NonRoutable',\n cat: 'mode'\n}, {\n flag: grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.NON_PUBLISHED,\n key: 'NonPublished',\n cat: 'mode'\n}];\n/* @formatter:on */\n\n/* eslint-enable */\n\nvar PagesFilter = /*#__PURE__*/function () {\n function PagesFilter(filters, search) {\n var _this = this;\n\n _classCallCheck(this, PagesFilter);\n\n this.filters = jquery__WEBPACK_IMPORTED_MODULE_0___default()(filters);\n this.search = jquery__WEBPACK_IMPORTED_MODULE_0___default()(search);\n this.options = options;\n this.tree = _tree__WEBPACK_IMPORTED_MODULE_4__.Instance;\n var storage = JSON.parse(localStorage.getItem('grav:admin:pages:filter') || '{}');\n\n if (!this.filters.length || !this.search.length) {\n return;\n }\n\n this.labels = this.filters.data('filter-labels');\n this.search.on('input', debounce__WEBPACK_IMPORTED_MODULE_3___default()(function () {\n return _this.filter();\n }, 250));\n this.filters.on('change', function () {\n return _this.filter();\n }); // restore state\n\n if (storage.flags || storage.query) {\n this.setValues(storage);\n this.filter();\n }\n\n this._initSelectize();\n }\n\n _createClass(PagesFilter, [{\n key: \"filter\",\n value: function filter(value) {\n var _this2 = this;\n\n var data = {\n flags: '',\n query: ''\n };\n\n if (_typeof(value) === 'object') {\n Object.assign(data, value);\n }\n\n if (typeof value === 'string') {\n data.query = value;\n }\n\n if (typeof value === 'undefined') {\n data.flags = this.filters.val();\n data.query = this.search.val();\n }\n\n if (!Object.keys(data).filter(function (key) {\n return data[key] !== '';\n }).length) {\n this.resetValues();\n return;\n }\n\n data.flags = data.flags.replace(/(\\s{1,})?,(\\s{1,})?/g, ',');\n this.setValues({\n flags: data.flags,\n query: data.query\n }, 'silent');\n (0,_utils_request__WEBPACK_IMPORTED_MODULE_2__.default)(\"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.base_url_relative, \"/pages-filter.json/task\").concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.param_sep, \"filterPages\"), {\n method: 'post',\n body: data\n }, function (response) {\n _this2.refreshDOM(response);\n });\n }\n }, {\n key: \"refreshDOM\",\n value: function refreshDOM(response) {\n var _this3 = this;\n\n var items = jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-nav-id]');\n\n if (!response) {\n items.removeClass('search-match').show();\n this.tree.restore();\n return;\n }\n\n items.removeClass('search-match').hide();\n response.results.forEach(function (page) {\n var match = items.filter(\"[data-nav-id=\\\"\".concat(page, \"\\\"]\")).addClass('search-match').show();\n match.parents('[data-nav-id]').addClass('search-match').show();\n\n _this3.tree.expand(page, 'no-store');\n });\n }\n }, {\n key: \"setValues\",\n value: function setValues(_ref, silent) {\n var _ref$flags = _ref.flags,\n flags = _ref$flags === void 0 ? '' : _ref$flags,\n _ref$query = _ref.query,\n query = _ref$query === void 0 ? '' : _ref$query;\n var flagsArray = flags.replace(/(\\s{1,})?,(\\s{1,})?/g, ',').split(',');\n\n if (this.filters.val() !== flags) {\n var selectize = this.filters.data('selectize');\n this.filters[selectize ? 'setValue' : 'val'](flagsArray, silent);\n }\n\n if (this.search.val() !== query) {\n this.search.val(query);\n }\n\n localStorage.setItem('grav:admin:pages:filter', JSON.stringify({\n flags: flags,\n query: query\n }));\n }\n }, {\n key: \"resetValues\",\n value: function resetValues() {\n this.setValues('', 'silent');\n this.refreshDOM();\n }\n }, {\n key: \"_initSelectize\",\n value: function _initSelectize() {\n var _this4 = this;\n\n var extras = {\n type: this.filters.data('filter-types') || {},\n access: this.filters.data('filter-access-levels') || {}\n };\n Object.keys(extras).forEach(function (cat) {\n Object.keys(extras[cat]).forEach(function (key) {\n _this4.options.push({\n cat: cat,\n key: key,\n flag: extras[cat][key]\n });\n });\n });\n this.filters.selectize({\n maxItems: null,\n valueField: 'key',\n labelField: 'flag',\n searchField: ['flag', 'key'],\n options: this.options,\n optgroups: this.labels,\n optgroupField: 'cat',\n optgroupLabelField: 'name',\n optgroupValueField: 'id',\n optgroupOrder: this.labels.map(function (item) {\n return item.id;\n }),\n plugins: ['optgroup_columns', 'required-fix']\n });\n }\n }]);\n\n return PagesFilter;\n}();\n\n\nvar Instance = new PagesFilter('input[name=\"page-filter\"]', 'input[name=\"page-search\"]');\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL3BhZ2VzL2ZpbHRlci5qcz80NzRmIl0sIm5hbWVzIjpbIm9wdGlvbnMiLCJmbGFnIiwidHJhbnNsYXRpb25zIiwia2V5IiwiY2F0IiwiUGFnZXNGaWx0ZXIiLCJmaWx0ZXJzIiwic2VhcmNoIiwiJCIsInRyZWUiLCJwYWdlc1RyZWUiLCJzdG9yYWdlIiwiSlNPTiIsInBhcnNlIiwibG9jYWxTdG9yYWdlIiwiZ2V0SXRlbSIsImxlbmd0aCIsImxhYmVscyIsImRhdGEiLCJvbiIsImRlYm91bmNlIiwiZmlsdGVyIiwiZmxhZ3MiLCJxdWVyeSIsInNldFZhbHVlcyIsIl9pbml0U2VsZWN0aXplIiwidmFsdWUiLCJPYmplY3QiLCJhc3NpZ24iLCJ2YWwiLCJrZXlzIiwicmVzZXRWYWx1ZXMiLCJyZXBsYWNlIiwicmVxdWVzdCIsImNvbmZpZyIsIm1ldGhvZCIsImJvZHkiLCJyZXNwb25zZSIsInJlZnJlc2hET00iLCJpdGVtcyIsInJlbW92ZUNsYXNzIiwic2hvdyIsInJlc3RvcmUiLCJoaWRlIiwicmVzdWx0cyIsImZvckVhY2giLCJwYWdlIiwibWF0Y2giLCJhZGRDbGFzcyIsInBhcmVudHMiLCJleHBhbmQiLCJzaWxlbnQiLCJmbGFnc0FycmF5Iiwic3BsaXQiLCJzZWxlY3RpemUiLCJzZXRJdGVtIiwic3RyaW5naWZ5IiwiZXh0cmFzIiwidHlwZSIsImFjY2VzcyIsInB1c2giLCJtYXhJdGVtcyIsInZhbHVlRmllbGQiLCJsYWJlbEZpZWxkIiwic2VhcmNoRmllbGQiLCJvcHRncm91cHMiLCJvcHRncm91cEZpZWxkIiwib3B0Z3JvdXBMYWJlbEZpZWxkIiwib3B0Z3JvdXBWYWx1ZUZpZWxkIiwib3B0Z3JvdXBPcmRlciIsIm1hcCIsIml0ZW0iLCJpZCIsInBsdWdpbnMiLCJJbnN0YW5jZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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cUJBQWEsRUFBRSxLQUFLcEQsTUFBTCxDQUFZcUQsR0FBWixDQUFnQixVQUFDQyxJQUFEO0FBQUEsaUJBQVVBLElBQUksQ0FBQ0MsRUFBZjtBQUFBLFNBQWhCLENBVkk7QUFXbkJDLGVBQU8sRUFBRSxDQUFDLGtCQUFELEVBQXFCLGNBQXJCO0FBWFUsT0FBdkI7QUFhSDs7Ozs7OztBQUdMLElBQUlDLFFBQVEsR0FBRyxJQUFJckUsV0FBSixDQUFnQiwyQkFBaEIsRUFBNkMsMkJBQTdDLENBQWYiLCJmaWxlIjoiLi9hcHAvcGFnZXMvZmlsdGVyLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCB7IGNvbmZpZywgdHJhbnNsYXRpb25zIH0gZnJvbSAnZ3Jhdi1jb25maWcnO1xuaW1wb3J0IHJlcXVlc3QgZnJvbSAnLi4vdXRpbHMvcmVxdWVzdCc7XG5pbXBvcnQgZGVib3VuY2UgZnJvbSAnZGVib3VuY2UnO1xuaW1wb3J0IHsgSW5zdGFuY2UgYXMgcGFnZXNUcmVlIH0gZnJvbSAnLi90cmVlJztcbmltcG9ydCAnc2VsZWN0aXplJztcbmltcG9ydCAnLi4vdXRpbHMvc2VsZWN0aXplLXJlcXVpcmVkLWZpeC5qcyc7XG5pbXBvcnQgJy4uL3V0aWxzL3N0b3JhZ2UnO1xuXG4vKiBAZm9ybWF0dGVyOm9mZiAqL1xuLyogZXNsaW50LWRpc2FibGUgKi9cbmNvbnN0IG9wdGlvbnMgPSBbXG4gICAgeyBmbGFnOiB0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLk1PRFVMRSwgICAgICAgIGtleTogJ01vZHVsZScsICAgICAgY2F0OiAnbW9kZScgfSxcbiAgICB7IGZsYWc6IHRyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uVklTSUJMRSwgICAgICAga2V5OiAnVmlzaWJsZScsICAgICAgY2F0OiAnbW9kZScgfSxcbiAgICB7IGZsYWc6IHRyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uUk9VVEFCTEUsICAgICAga2V5OiAnUm91dGFibGUnLCAgICAgY2F0OiAnbW9kZScgfSxcbiAgICB7IGZsYWc6IHRyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uUFVCTElTSEVELCAgICAga2V5OiAnUHVibGlzaGVkJywgICAgY2F0OiAnbW9kZScgfSxcbiAgICB7IGZsYWc6IHRyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uTk9OX01PRFVMRSwgICAga2V5OiAnTm9uTW9kdWxlJywgICBjYXQ6ICdtb2RlJyB9LFxuICAgIHsgZmxhZzogdHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5OT05fVklTSUJMRSwgICBrZXk6ICdOb25WaXNpYmxlJywgICBjYXQ6ICdtb2RlJyB9LFxuICAgIHsgZmxhZzogdHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5OT05fUk9VVEFCTEUsICBrZXk6ICdOb25Sb3V0YWJsZScsICBjYXQ6ICdtb2RlJyB9LFxuICAgIHsgZmxhZzogdHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5OT05fUFVCTElTSEVELCBrZXk6ICdOb25QdWJsaXNoZWQnLCBjYXQ6ICdtb2RlJyB9XG5dO1xuLyogQGZvcm1hdHRlcjpvbiAqL1xuLyogZXNsaW50LWVuYWJsZSAqL1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQYWdlc0ZpbHRlciB7XG4gICAgY29uc3RydWN0b3IoZmlsdGVycywgc2VhcmNoKSB7XG4gICAgICAgIHRoaXMuZmlsdGVycyA9ICQoZmlsdGVycyk7XG4gICAgICAgIHRoaXMuc2VhcmNoID0gJChzZWFyY2gpO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB0aGlzLnRyZWUgPSBwYWdlc1RyZWU7XG4gICAgICAgIGxldCBzdG9yYWdlID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZ3JhdjphZG1pbjpwYWdlczpmaWx0ZXInKSB8fCAne30nKTtcblxuICAgICAgICBpZiAoIXRoaXMuZmlsdGVycy5sZW5ndGggfHwgIXRoaXMuc2VhcmNoLmxlbmd0aCkgeyByZXR1cm47IH1cblxuICAgICAgICB0aGlzLmxhYmVscyA9IHRoaXMuZmlsdGVycy5kYXRhKCdmaWx0ZXItbGFiZWxzJyk7XG5cbiAgICAgICAgdGhpcy5zZWFyY2gub24oJ2lucHV0JywgZGVib3VuY2UoKCkgPT4gdGhpcy5maWx0ZXIoKSwgMjUwKSk7XG4gICAgICAgIHRoaXMuZmlsdGVycy5vbignY2hhbmdlJywgKCkgPT4gdGhpcy5maWx0ZXIoKSk7XG5cbiAgICAgICAgLy8gcmVzdG9yZSBzdGF0ZVxuICAgICAgICBpZiAoc3RvcmFnZS5mbGFncyB8fCBzdG9yYWdlLnF1ZXJ5KSB7XG4gICAgICAgICAgICB0aGlzLnNldFZhbHVlcyhzdG9yYWdlKTtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9pbml0U2VsZWN0aXplKCk7XG4gICAgfVxuXG4gICAgZmlsdGVyKHZhbHVlKSB7XG4gICAgICAgIGxldCBkYXRhID0geyBmbGFnczogJycsIHF1ZXJ5OiAnJyB9O1xuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGRhdGEsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZGF0YS5xdWVyeSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBkYXRhLmZsYWdzID0gdGhpcy5maWx0ZXJzLnZhbCgpO1xuICAgICAgICAgICAgZGF0YS5xdWVyeSA9IHRoaXMuc2VhcmNoLnZhbCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFPYmplY3Qua2V5cyhkYXRhKS5maWx0ZXIoKGtleSkgPT4gZGF0YVtrZXldICE9PSAnJykubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0VmFsdWVzKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBkYXRhLmZsYWdzID0gZGF0YS5mbGFncy5yZXBsYWNlKC8oXFxzezEsfSk/LChcXHN7MSx9KT8vZywgJywnKTtcbiAgICAgICAgdGhpcy5zZXRWYWx1ZXMoeyBmbGFnczogZGF0YS5mbGFncywgcXVlcnk6IGRhdGEucXVlcnkgfSwgJ3NpbGVudCcpO1xuXG4gICAgICAgIHJlcXVlc3QoYCR7Y29uZmlnLmJhc2VfdXJsX3JlbGF0aXZlfS9wYWdlcy1maWx0ZXIuanNvbi90YXNrJHtjb25maWcucGFyYW1fc2VwfWZpbHRlclBhZ2VzYCwge1xuICAgICAgICAgICAgbWV0aG9kOiAncG9zdCcsXG4gICAgICAgICAgICBib2R5OiBkYXRhXG4gICAgICAgIH0sIChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoRE9NKHJlc3BvbnNlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmVmcmVzaERPTShyZXNwb25zZSkge1xuICAgICAgICBsZXQgaXRlbXMgPSAkKCdbZGF0YS1uYXYtaWRdJyk7XG5cbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgICAgaXRlbXMucmVtb3ZlQ2xhc3MoJ3NlYXJjaC1tYXRjaCcpLnNob3coKTtcbiAgICAgICAgICAgIHRoaXMudHJlZS5yZXN0b3JlKCk7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGl0ZW1zLnJlbW92ZUNsYXNzKCdzZWFyY2gtbWF0Y2gnKS5oaWRlKCk7XG5cbiAgICAgICAgcmVzcG9uc2UucmVzdWx0cy5mb3JFYWNoKChwYWdlKSA9PiB7XG4gICAgICAgICAgICBsZXQgbWF0Y2ggPSBpdGVtcy5maWx0ZXIoYFtkYXRhLW5hdi1pZD1cIiR7cGFnZX1cIl1gKS5hZGRDbGFzcygnc2VhcmNoLW1hdGNoJykuc2hvdygpO1xuICAgICAgICAgICAgbWF0Y2gucGFyZW50cygnW2RhdGEtbmF2LWlkXScpLmFkZENsYXNzKCdzZWFyY2gtbWF0Y2gnKS5zaG93KCk7XG5cbiAgICAgICAgICAgIHRoaXMudHJlZS5leHBhbmQocGFnZSwgJ25vLXN0b3JlJyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldFZhbHVlcyh7IGZsYWdzID0gJycsIHF1ZXJ5ID0gJyd9LCBzaWxlbnQpIHtcbiAgICAgICAgbGV0IGZsYWdzQXJyYXkgPSBmbGFncy5yZXBsYWNlKC8oXFxzezEsfSk/LChcXHN7MSx9KT8vZywgJywnKS5zcGxpdCgnLCcpO1xuICAgICAgICBpZiAodGhpcy5maWx0ZXJzLnZhbCgpICE9PSBmbGFncykge1xuICAgICAgICAgICAgbGV0IHNlbGVjdGl6ZSA9IHRoaXMuZmlsdGVycy5kYXRhKCdzZWxlY3RpemUnKTtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyc1tzZWxlY3RpemUgPyAnc2V0VmFsdWUnIDogJ3ZhbCddKGZsYWdzQXJyYXksIHNpbGVudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc2VhcmNoLnZhbCgpICE9PSBxdWVyeSkgeyB0aGlzLnNlYXJjaC52YWwocXVlcnkpOyB9XG5cbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2dyYXY6YWRtaW46cGFnZXM6ZmlsdGVyJywgSlNPTi5zdHJpbmdpZnkoeyBmbGFncywgcXVlcnkgfSkpO1xuICAgIH1cblxuICAgIHJlc2V0VmFsdWVzKCkge1xuICAgICAgICB0aGlzLnNldFZhbHVlcygnJywgJ3NpbGVudCcpO1xuICAgICAgICB0aGlzLnJlZnJlc2hET00oKTtcbiAgICB9XG5cbiAgICBfaW5pdFNlbGVjdGl6ZSgpIHtcbiAgICAgICAgbGV0IGV4dHJhcyA9IHtcbiAgICAgICAgICAgIHR5cGU6IHRoaXMuZmlsdGVycy5kYXRhKCdmaWx0ZXItdHlwZXMnKSB8fCB7fSxcbiAgICAgICAgICAgIGFjY2VzczogdGhpcy5maWx0ZXJzLmRhdGEoJ2ZpbHRlci1hY2Nlc3MtbGV2ZWxzJykgfHwge31cbiAgICAgICAgfTtcblxuICAgICAgICBPYmplY3Qua2V5cyhleHRyYXMpLmZvckVhY2goKGNhdCkgPT4ge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoZXh0cmFzW2NhdF0pLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgY2F0LFxuICAgICAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgICAgIGZsYWc6IGV4dHJhc1tjYXRdW2tleV1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmZpbHRlcnMuc2VsZWN0aXplKHtcbiAgICAgICAgICAgIG1heEl0ZW1zOiBudWxsLFxuICAgICAgICAgICAgdmFsdWVGaWVsZDogJ2tleScsXG4gICAgICAgICAgICBsYWJlbEZpZWxkOiAnZmxhZycsXG4gICAgICAgICAgICBzZWFyY2hGaWVsZDogWydmbGFnJywgJ2tleSddLFxuICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgICAgICAgb3B0Z3JvdXBzOiB0aGlzLmxhYmVscyxcbiAgICAgICAgICAgIG9wdGdyb3VwRmllbGQ6ICdjYXQnLFxuICAgICAgICAgICAgb3B0Z3JvdXBMYWJlbEZpZWxkOiAnbmFtZScsXG4gICAgICAgICAgICBvcHRncm91cFZhbHVlRmllbGQ6ICdpZCcsXG4gICAgICAgICAgICBvcHRncm91cE9yZGVyOiB0aGlzLmxhYmVscy5tYXAoKGl0ZW0pID0+IGl0ZW0uaWQpLFxuICAgICAgICAgICAgcGx1Z2luczogWydvcHRncm91cF9jb2x1bW5zJywgJ3JlcXVpcmVkLWZpeCddXG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxubGV0IEluc3RhbmNlID0gbmV3IFBhZ2VzRmlsdGVyKCdpbnB1dFtuYW1lPVwicGFnZS1maWx0ZXJcIl0nLCAnaW5wdXRbbmFtZT1cInBhZ2Utc2VhcmNoXCJdJyk7XG5leHBvcnQgeyBJbnN0YW5jZSB9O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./app/pages/filter.js\n"); /***/ }), /***/ "./app/pages/index.js": -/*!****************************!* +/*!****************************!*\ !*** ./app/pages/index.js ***! \****************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => __WEBPACK_DEFAULT_EXPORT__\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var sortablejs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! sortablejs */ \"./node_modules/sortablejs/modular/sortable.complete.esm.js\");\n/* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./filter */ \"./app/pages/filter.js\");\n/* harmony import */ var _page__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./page */ \"./app/pages/page/index.js\");\n\n\n\n\n\nvar pad = function pad(n, s) {\n return \"000\".concat(n).substr(-s);\n}; // Pages Ordering\n\n\nvar Ordering = null;\nvar orderingElement = jquery__WEBPACK_IMPORTED_MODULE_0___default()('#ordering');\n\nif (orderingElement.length) {\n Ordering = new sortablejs__WEBPACK_IMPORTED_MODULE_1__.default(orderingElement.get(0), {\n filter: '.ignore',\n onUpdate: function onUpdate() {\n /* Old single page index behavior\n let item = $(event.item);\n let index = orderingElement.children().index(item) + 1;\n $('[data-order]').val(index);\n */\n var indexes = [];\n var children = orderingElement.children();\n var padZero = (children.length + '').split('').length;\n children.each(function (index, item) {\n item = jquery__WEBPACK_IMPORTED_MODULE_0___default()(item);\n indexes.push(item.data('id'));\n item.find('.page-order').text(\"\".concat(pad(index + 1, padZero), \".\"));\n });\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-order]').val(indexes.join(','));\n }\n });\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(document).on('input', '[name=\"data[folder]\"]', function (event) {\n var target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.currentTarget);\n var activeOrder = jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-id][data-active-id]');\n activeOrder.data('id', target.val());\n Ordering.options.onUpdate();\n });\n}\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n Ordering: Ordering,\n Page: _page__WEBPACK_IMPORTED_MODULE_3__.default,\n PageFilters: {\n PageFilters: _filter__WEBPACK_IMPORTED_MODULE_2__.default,\n Instance: _filter__WEBPACK_IMPORTED_MODULE_2__.Instance\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL3BhZ2VzL2luZGV4LmpzPzdhMzUiXSwibmFtZXMiOlsicGFkIiwibiIsInMiLCJzdWJzdHIiLCJPcmRlcmluZyIsIm9yZGVyaW5nRWxlbWVudCIsIiQiLCJsZW5ndGgiLCJTb3J0YWJsZSIsImdldCIsImZpbHRlciIsIm9uVXBkYXRlIiwiaW5kZXhlcyIsImNoaWxkcmVuIiwicGFkWmVybyIsInNwbGl0IiwiZWFjaCIsImluZGV4IiwiaXRlbSIsInB1c2giLCJkYXRhIiwiZmluZCIsInRleHQiLCJ2YWwiLCJqb2luIiwiZG9jdW1lbnQiLCJvbiIsImV2ZW50IiwidGFyZ2V0IiwiY3VycmVudFRhcmdldCIsImFjdGl2ZU9yZGVyIiwib3B0aW9ucyIsIlBhZ2UiLCJQYWdlRmlsdGVycyIsIkluc3RhbmNlIiwiUGFnZUZpbHRlcnNJbnN0YW5jZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsSUFBTUEsR0FBRyxHQUFHLFNBQU5BLEdBQU0sQ0FBQ0MsQ0FBRCxFQUFJQyxDQUFKO0FBQUEsU0FBVSxhQUFPRCxDQUFQLEVBQVlFLE1BQVosQ0FBbUIsQ0FBQ0QsQ0FBcEIsQ0FBVjtBQUFBLENBQVosQyxDQUVBOzs7QUFDQSxJQUFJRSxRQUFRLEdBQUcsSUFBZjtBQUNBLElBQUlDLGVBQWUsR0FBR0MsNkNBQUMsQ0FBQyxXQUFELENBQXZCOztBQUNBLElBQUlELGVBQWUsQ0FBQ0UsTUFBcEIsRUFBNEI7QUFDeEJILFVBQVEsR0FBRyxJQUFJSSwrQ0FBSixDQUFhSCxlQUFlLENBQUNJLEdBQWhCLENBQW9CLENBQXBCLENBQWIsRUFBcUM7QUFDNUNDLFVBQU0sRUFBRSxTQURvQztBQUU1Q0MsWUFBUSxFQUFFLG9CQUFXO0FBQ2pCO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFHWSxVQUFJQyxPQUFPLEdBQUcsRUFBZDtBQUNBLFVBQU1DLFFBQVEsR0FBR1IsZUFBZSxDQUFDUSxRQUFoQixFQUFqQjtBQUNBLFVBQU1DLE9BQU8sR0FBRyxDQUFDRCxRQUFRLENBQUNOLE1BQVQsR0FBa0IsRUFBbkIsRUFBdUJRLEtBQXZCLENBQTZCLEVBQTdCLEVBQWlDUixNQUFqRDtBQUNBTSxjQUFRLENBQUNHLElBQVQsQ0FBYyxVQUFDQyxLQUFELEVBQVFDLElBQVIsRUFBaUI7QUFDM0JBLFlBQUksR0FBR1osNkNBQUMsQ0FBQ1ksSUFBRCxDQUFSO0FBQ0FOLGVBQU8sQ0FBQ08sSUFBUixDQUFhRCxJQUFJLENBQUNFLElBQUwsQ0FBVSxJQUFWLENBQWI7QUFDQUYsWUFBSSxDQUFDRyxJQUFMLENBQVUsYUFBVixFQUF5QkMsSUFBekIsV0FBaUN0QixHQUFHLENBQUNpQixLQUFLLEdBQUcsQ0FBVCxFQUFZSCxPQUFaLENBQXBDO0FBQ0gsT0FKRDtBQU1BUixtREFBQyxDQUFDLGNBQUQsQ0FBRCxDQUFrQmlCLEdBQWxCLENBQXNCWCxPQUFPLENBQUNZLElBQVIsQ0FBYSxHQUFiLENBQXRCO0FBQ0g7QUFwQjJDLEdBQXJDLENBQVg7QUF1QkFsQiwrQ0FBQyxDQUFDbUIsUUFBRCxDQUFELENBQVlDLEVBQVosQ0FBZSxPQUFmLEVBQXdCLHVCQUF4QixFQUFpRCxVQUFDQyxLQUFELEVBQVc7QUFDeEQsUUFBTUMsTUFBTSxHQUFHdEIsNkNBQUMsQ0FBQ3FCLEtBQUssQ0FBQ0UsYUFBUCxDQUFoQjtBQUNBLFFBQU1DLFdBQVcsR0FBR3hCLDZDQUFDLENBQUMsMkJBQUQsQ0FBckI7QUFFQXdCLGVBQVcsQ0FBQ1YsSUFBWixDQUFpQixJQUFqQixFQUF1QlEsTUFBTSxDQUFDTCxHQUFQLEVBQXZCO0FBRUFuQixZQUFRLENBQUMyQixPQUFULENBQWlCcEIsUUFBakI7QUFDSCxHQVBEO0FBU0g7O0FBRUQsaUVBQWU7QUFDWFAsVUFBUSxFQUFSQSxRQURXO0FBRVg0QixNQUFJLEVBQUpBLDBDQUZXO0FBR1hDLGFBQVcsRUFBRTtBQUNUQSxlQUFXLEVBQVhBLDRDQURTO0FBRVRDLFlBQVEsRUFBRUMsNkNBQW1CQTtBQUZwQjtBQUhGLENBQWYiLCJmaWxlIjoiLi9hcHAvcGFnZXMvaW5kZXguanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IFNvcnRhYmxlIGZyb20gJ3NvcnRhYmxlanMnO1xuaW1wb3J0IFBhZ2VGaWx0ZXJzLCB7IEluc3RhbmNlIGFzIFBhZ2VGaWx0ZXJzSW5zdGFuY2UgfSBmcm9tICcuL2ZpbHRlcic7XG5pbXBvcnQgUGFnZSBmcm9tICcuL3BhZ2UnO1xuXG5jb25zdCBwYWQgPSAobiwgcykgPT4gKGAwMDAke259YCkuc3Vic3RyKC1zKTtcblxuLy8gUGFnZXMgT3JkZXJpbmdcbmxldCBPcmRlcmluZyA9IG51bGw7XG5sZXQgb3JkZXJpbmdFbGVtZW50ID0gJCgnI29yZGVyaW5nJyk7XG5pZiAob3JkZXJpbmdFbGVtZW50Lmxlbmd0aCkge1xuICAgIE9yZGVyaW5nID0gbmV3IFNvcnRhYmxlKG9yZGVyaW5nRWxlbWVudC5nZXQoMCksIHtcbiAgICAgICAgZmlsdGVyOiAnLmlnbm9yZScsXG4gICAgICAgIG9uVXBkYXRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIC8qIE9sZCBzaW5nbGUgcGFnZSBpbmRleCBiZWhhdmlvclxuXG4gICAgICAgICAgICBsZXQgaXRlbSA9ICQoZXZlbnQuaXRlbSk7XG4gICAgICAgICAgICBsZXQgaW5kZXggPSBvcmRlcmluZ0VsZW1lbnQuY2hpbGRyZW4oKS5pbmRleChpdGVtKSArIDE7XG4gICAgICAgICAgICAkKCdbZGF0YS1vcmRlcl0nKS52YWwoaW5kZXgpO1xuICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgbGV0IGluZGV4ZXMgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gb3JkZXJpbmdFbGVtZW50LmNoaWxkcmVuKCk7XG4gICAgICAgICAgICBjb25zdCBwYWRaZXJvID0gKGNoaWxkcmVuLmxlbmd0aCArICcnKS5zcGxpdCgnJykubGVuZ3RoO1xuICAgICAgICAgICAgY2hpbGRyZW4uZWFjaCgoaW5kZXgsIGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICBpdGVtID0gJChpdGVtKTtcbiAgICAgICAgICAgICAgICBpbmRleGVzLnB1c2goaXRlbS5kYXRhKCdpZCcpKTtcbiAgICAgICAgICAgICAgICBpdGVtLmZpbmQoJy5wYWdlLW9yZGVyJykudGV4dChgJHtwYWQoaW5kZXggKyAxLCBwYWRaZXJvKX0uYCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgJCgnW2RhdGEtb3JkZXJdJykudmFsKGluZGV4ZXMuam9pbignLCcpKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgJChkb2N1bWVudCkub24oJ2lucHV0JywgJ1tuYW1lPVwiZGF0YVtmb2xkZXJdXCJdJywgKGV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9ICQoZXZlbnQuY3VycmVudFRhcmdldCk7XG4gICAgICAgIGNvbnN0IGFjdGl2ZU9yZGVyID0gJCgnW2RhdGEtaWRdW2RhdGEtYWN0aXZlLWlkXScpO1xuXG4gICAgICAgIGFjdGl2ZU9yZGVyLmRhdGEoJ2lkJywgdGFyZ2V0LnZhbCgpKTtcblxuICAgICAgICBPcmRlcmluZy5vcHRpb25zLm9uVXBkYXRlKCk7XG4gICAgfSk7XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICAgIE9yZGVyaW5nLFxuICAgIFBhZ2UsXG4gICAgUGFnZUZpbHRlcnM6IHtcbiAgICAgICAgUGFnZUZpbHRlcnMsXG4gICAgICAgIEluc3RhbmNlOiBQYWdlRmlsdGVyc0luc3RhbmNlXG4gICAgfVxufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./app/pages/index.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var sortablejs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! sortablejs */ \"./node_modules/sortablejs/modular/sortable.esm.js\");\n/* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./filter */ \"./app/pages/filter.js\");\n/* harmony import */ var _page__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./page */ \"./app/pages/page/index.js\");\n\n\n\n\n\nvar pad = function pad(n, s) {\n return \"000\".concat(n).substr(-s);\n}; // Pages Ordering\n\n\nvar Ordering = null;\nvar orderingElement = jquery__WEBPACK_IMPORTED_MODULE_0___default()('#ordering');\n\nif (orderingElement.length) {\n Ordering = new sortablejs__WEBPACK_IMPORTED_MODULE_1__.default(orderingElement.get(0), {\n filter: '.ignore',\n onUpdate: function onUpdate() {\n /* Old single page index behavior\n let item = $(event.item);\n let index = orderingElement.children().index(item) + 1;\n $('[data-order]').val(index);\n */\n var indexes = [];\n var children = orderingElement.children();\n var padZero = (children.length + '').split('').length;\n children.each(function (index, item) {\n item = jquery__WEBPACK_IMPORTED_MODULE_0___default()(item);\n indexes.push(item.data('id'));\n item.find('.page-order').text(\"\".concat(pad(index + 1, padZero), \".\"));\n });\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-order]').val(indexes.join(','));\n }\n });\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(document).on('input', '[name=\"data[folder]\"]', function (event) {\n var target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.currentTarget);\n var activeOrder = jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-id][data-active-id]');\n activeOrder.data('id', target.val());\n Ordering.options.onUpdate();\n });\n}\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n Ordering: Ordering,\n Page: _page__WEBPACK_IMPORTED_MODULE_3__.default,\n PageFilters: {\n PageFilters: _filter__WEBPACK_IMPORTED_MODULE_2__.default,\n Instance: _filter__WEBPACK_IMPORTED_MODULE_2__.Instance\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL3BhZ2VzL2luZGV4LmpzPzdhMzUiXSwibmFtZXMiOlsicGFkIiwibiIsInMiLCJzdWJzdHIiLCJPcmRlcmluZyIsIm9yZGVyaW5nRWxlbWVudCIsIiQiLCJsZW5ndGgiLCJTb3J0YWJsZSIsImdldCIsImZpbHRlciIsIm9uVXBkYXRlIiwiaW5kZXhlcyIsImNoaWxkcmVuIiwicGFkWmVybyIsInNwbGl0IiwiZWFjaCIsImluZGV4IiwiaXRlbSIsInB1c2giLCJkYXRhIiwiZmluZCIsInRleHQiLCJ2YWwiLCJqb2luIiwiZG9jdW1lbnQiLCJvbiIsImV2ZW50IiwidGFyZ2V0IiwiY3VycmVudFRhcmdldCIsImFjdGl2ZU9yZGVyIiwib3B0aW9ucyIsIlBhZ2UiLCJQYWdlRmlsdGVycyIsIkluc3RhbmNlIiwiUGFnZUZpbHRlcnNJbnN0YW5jZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsSUFBTUEsR0FBRyxHQUFHLFNBQU5BLEdBQU0sQ0FBQ0MsQ0FBRCxFQUFJQyxDQUFKO0FBQUEsU0FBVSxhQUFPRCxDQUFQLEVBQVlFLE1BQVosQ0FBbUIsQ0FBQ0QsQ0FBcEIsQ0FBVjtBQUFBLENBQVosQyxDQUVBOzs7QUFDQSxJQUFJRSxRQUFRLEdBQUcsSUFBZjtBQUNBLElBQUlDLGVBQWUsR0FBR0MsNkNBQUMsQ0FBQyxXQUFELENBQXZCOztBQUNBLElBQUlELGVBQWUsQ0FBQ0UsTUFBcEIsRUFBNEI7QUFDeEJILFVBQVEsR0FBRyxJQUFJSSwrQ0FBSixDQUFhSCxlQUFlLENBQUNJLEdBQWhCLENBQW9CLENBQXBCLENBQWIsRUFBcUM7QUFDNUNDLFVBQU0sRUFBRSxTQURvQztBQUU1Q0MsWUFBUSxFQUFFLG9CQUFXO0FBQ2pCO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFHWSxVQUFJQyxPQUFPLEdBQUcsRUFBZDtBQUNBLFVBQU1DLFFBQVEsR0FBR1IsZUFBZSxDQUFDUSxRQUFoQixFQUFqQjtBQUNBLFVBQU1DLE9BQU8sR0FBRyxDQUFDRCxRQUFRLENBQUNOLE1BQVQsR0FBa0IsRUFBbkIsRUFBdUJRLEtBQXZCLENBQTZCLEVBQTdCLEVBQWlDUixNQUFqRDtBQUNBTSxjQUFRLENBQUNHLElBQVQsQ0FBYyxVQUFDQyxLQUFELEVBQVFDLElBQVIsRUFBaUI7QUFDM0JBLFlBQUksR0FBR1osNkNBQUMsQ0FBQ1ksSUFBRCxDQUFSO0FBQ0FOLGVBQU8sQ0FBQ08sSUFBUixDQUFhRCxJQUFJLENBQUNFLElBQUwsQ0FBVSxJQUFWLENBQWI7QUFDQUYsWUFBSSxDQUFDRyxJQUFMLENBQVUsYUFBVixFQUF5QkMsSUFBekIsV0FBaUN0QixHQUFHLENBQUNpQixLQUFLLEdBQUcsQ0FBVCxFQUFZSCxPQUFaLENBQXBDO0FBQ0gsT0FKRDtBQU1BUixtREFBQyxDQUFDLGNBQUQsQ0FBRCxDQUFrQmlCLEdBQWxCLENBQXNCWCxPQUFPLENBQUNZLElBQVIsQ0FBYSxHQUFiLENBQXRCO0FBQ0g7QUFwQjJDLEdBQXJDLENBQVg7QUF1QkFsQiwrQ0FBQyxDQUFDbUIsUUFBRCxDQUFELENBQVlDLEVBQVosQ0FBZSxPQUFmLEVBQXdCLHVCQUF4QixFQUFpRCxVQUFDQyxLQUFELEVBQVc7QUFDeEQsUUFBTUMsTUFBTSxHQUFHdEIsNkNBQUMsQ0FBQ3FCLEtBQUssQ0FBQ0UsYUFBUCxDQUFoQjtBQUNBLFFBQU1DLFdBQVcsR0FBR3hCLDZDQUFDLENBQUMsMkJBQUQsQ0FBckI7QUFFQXdCLGVBQVcsQ0FBQ1YsSUFBWixDQUFpQixJQUFqQixFQUF1QlEsTUFBTSxDQUFDTCxHQUFQLEVBQXZCO0FBRUFuQixZQUFRLENBQUMyQixPQUFULENBQWlCcEIsUUFBakI7QUFDSCxHQVBEO0FBU0g7O0FBRUQsaUVBQWU7QUFDWFAsVUFBUSxFQUFSQSxRQURXO0FBRVg0QixNQUFJLEVBQUpBLDBDQUZXO0FBR1hDLGFBQVcsRUFBRTtBQUNUQSxlQUFXLEVBQVhBLDRDQURTO0FBRVRDLFlBQVEsRUFBRUMsNkNBQW1CQTtBQUZwQjtBQUhGLENBQWYiLCJmaWxlIjoiLi9hcHAvcGFnZXMvaW5kZXguanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IFNvcnRhYmxlIGZyb20gJ3NvcnRhYmxlanMnO1xuaW1wb3J0IFBhZ2VGaWx0ZXJzLCB7IEluc3RhbmNlIGFzIFBhZ2VGaWx0ZXJzSW5zdGFuY2UgfSBmcm9tICcuL2ZpbHRlcic7XG5pbXBvcnQgUGFnZSBmcm9tICcuL3BhZ2UnO1xuXG5jb25zdCBwYWQgPSAobiwgcykgPT4gKGAwMDAke259YCkuc3Vic3RyKC1zKTtcblxuLy8gUGFnZXMgT3JkZXJpbmdcbmxldCBPcmRlcmluZyA9IG51bGw7XG5sZXQgb3JkZXJpbmdFbGVtZW50ID0gJCgnI29yZGVyaW5nJyk7XG5pZiAob3JkZXJpbmdFbGVtZW50Lmxlbmd0aCkge1xuICAgIE9yZGVyaW5nID0gbmV3IFNvcnRhYmxlKG9yZGVyaW5nRWxlbWVudC5nZXQoMCksIHtcbiAgICAgICAgZmlsdGVyOiAnLmlnbm9yZScsXG4gICAgICAgIG9uVXBkYXRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIC8qIE9sZCBzaW5nbGUgcGFnZSBpbmRleCBiZWhhdmlvclxuXG4gICAgICAgICAgICBsZXQgaXRlbSA9ICQoZXZlbnQuaXRlbSk7XG4gICAgICAgICAgICBsZXQgaW5kZXggPSBvcmRlcmluZ0VsZW1lbnQuY2hpbGRyZW4oKS5pbmRleChpdGVtKSArIDE7XG4gICAgICAgICAgICAkKCdbZGF0YS1vcmRlcl0nKS52YWwoaW5kZXgpO1xuICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgbGV0IGluZGV4ZXMgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gb3JkZXJpbmdFbGVtZW50LmNoaWxkcmVuKCk7XG4gICAgICAgICAgICBjb25zdCBwYWRaZXJvID0gKGNoaWxkcmVuLmxlbmd0aCArICcnKS5zcGxpdCgnJykubGVuZ3RoO1xuICAgICAgICAgICAgY2hpbGRyZW4uZWFjaCgoaW5kZXgsIGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICBpdGVtID0gJChpdGVtKTtcbiAgICAgICAgICAgICAgICBpbmRleGVzLnB1c2goaXRlbS5kYXRhKCdpZCcpKTtcbiAgICAgICAgICAgICAgICBpdGVtLmZpbmQoJy5wYWdlLW9yZGVyJykudGV4dChgJHtwYWQoaW5kZXggKyAxLCBwYWRaZXJvKX0uYCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgJCgnW2RhdGEtb3JkZXJdJykudmFsKGluZGV4ZXMuam9pbignLCcpKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgJChkb2N1bWVudCkub24oJ2lucHV0JywgJ1tuYW1lPVwiZGF0YVtmb2xkZXJdXCJdJywgKGV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9ICQoZXZlbnQuY3VycmVudFRhcmdldCk7XG4gICAgICAgIGNvbnN0IGFjdGl2ZU9yZGVyID0gJCgnW2RhdGEtaWRdW2RhdGEtYWN0aXZlLWlkXScpO1xuXG4gICAgICAgIGFjdGl2ZU9yZGVyLmRhdGEoJ2lkJywgdGFyZ2V0LnZhbCgpKTtcblxuICAgICAgICBPcmRlcmluZy5vcHRpb25zLm9uVXBkYXRlKCk7XG4gICAgfSk7XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICAgIE9yZGVyaW5nLFxuICAgIFBhZ2UsXG4gICAgUGFnZUZpbHRlcnM6IHtcbiAgICAgICAgUGFnZUZpbHRlcnMsXG4gICAgICAgIEluc3RhbmNlOiBQYWdlRmlsdGVyc0luc3RhbmNlXG4gICAgfVxufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./app/pages/index.js\n"); /***/ }), /***/ "./app/pages/page/add.js": -/*!*******************************!* +/*!*******************************!*\ !*** ./app/pages/page/add.js ***! \*******************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils_jquery_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils/jquery-utils */ \"./app/utils/jquery-utils.js\");\n/* harmony import */ var _utils_request__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/request */ \"./app/utils/request.js\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! grav-config */ \"grav-config\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(grav_config__WEBPACK_IMPORTED_MODULE_3__);\n\n\n\n\nvar custom = false;\nvar folder = jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-remodal-id=\"modal\"] input[name=\"data[folder]\"], [data-remodal-id=\"module\"] input[name=\"data[folder]\"]');\nvar title = jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-remodal-id=\"modal\"] input[name=\"data[title]\"], [data-remodal-id=\"module\"] input[name=\"data[title]\"]');\n\nvar getFields = function getFields(type, target) {\n target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(target);\n var query = \"[data-remodal-id=\\\"\".concat(target.closest('[data-remodal-id]').data('remodal-id'), \"\\\"]\");\n return {\n title: type === 'title' ? jquery__WEBPACK_IMPORTED_MODULE_0___default()(target) : jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"\".concat(query, \" input[name=\\\"data[title]\\\"]\")),\n folder: type === 'folder' ? jquery__WEBPACK_IMPORTED_MODULE_0___default()(target) : jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"\".concat(query, \" input[name=\\\"data[folder]\\\"]\"))\n };\n};\n\ntitle.on('input focus blur', function (event) {\n if (custom) {\n return true;\n }\n\n var elements = getFields('title', event.currentTarget);\n var slug = jquery__WEBPACK_IMPORTED_MODULE_0___default().slugify(elements.title.val(), {\n custom: {\n \"'\": ''\n }\n });\n elements.folder.val(slug);\n});\nfolder.on('input', function (event) {\n var elements = getFields('folder', event.currentTarget);\n var input = elements.folder.get(0);\n var value = elements.folder.val();\n var selection = {\n start: input.selectionStart,\n end: input.selectionEnd\n };\n value = value.toLowerCase().replace(/\\s/g, '-').replace(/[^a-z0-9_\\-]/g, '');\n elements.folder.val(value);\n custom = !!value; // restore cursor position\n\n input.setSelectionRange(selection.start, selection.end);\n});\nfolder.on('focus blur', function (event) {\n return getFields('title', event.currentTarget).title.trigger('input');\n});\njquery__WEBPACK_IMPORTED_MODULE_0___default()(document).on('change', '[name=\"data[route]\"]', function (event) {\n var rawroute = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.currentTarget).val();\n var pageTemplate = jquery__WEBPACK_IMPORTED_MODULE_0___default()('[name=\"data[name]\"]');\n var URI = \"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_3__.config.base_url_relative, \"/ajax.json/task\").concat(grav_config__WEBPACK_IMPORTED_MODULE_3__.config.param_sep, \"getChildTypes\");\n\n if (pageTemplate.length === 0) {\n return;\n }\n\n (0,_utils_request__WEBPACK_IMPORTED_MODULE_2__.default)(URI, {\n method: 'post',\n body: {\n rawroute: rawroute\n }\n }, function (response) {\n var type = response.child_type;\n\n if (type !== '' && type !== 'default') {\n pageTemplate.val(type);\n pageTemplate.data('selectize').setValue(type);\n }\n });\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL3BhZ2VzL3BhZ2UvYWRkLmpzP2IyMjgiXSwibmFtZXMiOlsiY3VzdG9tIiwiZm9sZGVyIiwiJCIsInRpdGxlIiwiZ2V0RmllbGRzIiwidHlwZSIsInRhcmdldCIsInF1ZXJ5IiwiY2xvc2VzdCIsImRhdGEiLCJvbiIsImV2ZW50IiwiZWxlbWVudHMiLCJjdXJyZW50VGFyZ2V0Iiwic2x1ZyIsInZhbCIsImlucHV0IiwiZ2V0IiwidmFsdWUiLCJzZWxlY3Rpb24iLCJzdGFydCIsInNlbGVjdGlvblN0YXJ0IiwiZW5kIiwic2VsZWN0aW9uRW5kIiwidG9Mb3dlckNhc2UiLCJyZXBsYWNlIiwic2V0U2VsZWN0aW9uUmFuZ2UiLCJ0cmlnZ2VyIiwiZG9jdW1lbnQiLCJyYXdyb3V0ZSIsInBhZ2VUZW1wbGF0ZSIsIlVSSSIsImNvbmZpZyIsImxlbmd0aCIsInJlcXVlc3QiLCJtZXRob2QiLCJib2R5IiwicmVzcG9uc2UiLCJjaGlsZF90eXBlIiwic2V0VmFsdWUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBLElBQUlBLE1BQU0sR0FBRyxLQUFiO0FBQ0EsSUFBSUMsTUFBTSxHQUFHQyw2Q0FBQyxDQUFDLDZHQUFELENBQWQ7QUFDQSxJQUFJQyxLQUFLLEdBQUdELDZDQUFDLENBQUMsMkdBQUQsQ0FBYjs7QUFDQSxJQUFJRSxTQUFTLEdBQUcsU0FBWkEsU0FBWSxDQUFDQyxJQUFELEVBQU9DLE1BQVAsRUFBa0I7QUFDOUJBLFFBQU0sR0FBR0osNkNBQUMsQ0FBQ0ksTUFBRCxDQUFWO0FBQ0EsTUFBSUMsS0FBSyxnQ0FBd0JELE1BQU0sQ0FBQ0UsT0FBUCxDQUFlLG1CQUFmLEVBQW9DQyxJQUFwQyxDQUF5QyxZQUF6QyxDQUF4QixRQUFUO0FBRUEsU0FBTztBQUNITixTQUFLLEVBQUVFLElBQUksS0FBSyxPQUFULEdBQW1CSCw2Q0FBQyxDQUFDSSxNQUFELENBQXBCLEdBQStCSiw2Q0FBQyxX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WSxDQUFDZixHQUFiLENBQWlCVixJQUFqQjtBQUNBeUIsa0JBQVksQ0FBQ3JCLElBQWIsQ0FBa0IsV0FBbEIsRUFBK0I4QixRQUEvQixDQUF3Q2xDLElBQXhDO0FBQ0g7QUFDSixHQVRNLENBQVA7QUFVSCxDQW5CRCIsImZpbGUiOiIuL2FwcC9wYWdlcy9wYWdlL2FkZC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgJy4uLy4uL3V0aWxzL2pxdWVyeS11dGlscyc7XG5pbXBvcnQgcmVxdWVzdCBmcm9tICcuLi8uLi91dGlscy9yZXF1ZXN0JztcbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJ2dyYXYtY29uZmlnJztcblxubGV0IGN1c3RvbSA9IGZhbHNlO1xubGV0IGZvbGRlciA9ICQoJ1tkYXRhLXJlbW9kYWwtaWQ9XCJtb2RhbFwiXSBpbnB1dFtuYW1lPVwiZGF0YVtmb2xkZXJdXCJdLCBbZGF0YS1yZW1vZGFsLWlkPVwibW9kdWxlXCJdIGlucHV0W25hbWU9XCJkYXRhW2ZvbGRlcl1cIl0nKTtcbmxldCB0aXRsZSA9ICQoJ1tkYXRhLXJlbW9kYWwtaWQ9XCJtb2RhbFwiXSBpbnB1dFtuYW1lPVwiZGF0YVt0aXRsZV1cIl0sIFtkYXRhLXJlbW9kYWwtaWQ9XCJtb2R1bGVcIl0gaW5wdXRbbmFtZT1cImRhdGFbdGl0bGVdXCJdJyk7XG5sZXQgZ2V0RmllbGRzID0gKHR5cGUsIHRhcmdldCkgPT4ge1xuICAgIHRhcmdldCA9ICQodGFyZ2V0KTtcbiAgICBsZXQgcXVlcnkgPSBgW2RhdGEtcmVtb2RhbC1pZD1cIiR7dGFyZ2V0LmNsb3Nlc3QoJ1tkYXRhLXJlbW9kYWwtaWRdJykuZGF0YSgncmVtb2RhbC1pZCcpfVwiXWA7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB0aXRsZTogdHlwZSA9PT0gJ3RpdGxlJyA/ICQodGFyZ2V0KSA6ICQoYCR7cXVlcnl9IGlucHV0W25hbWU9XCJkYXRhW3RpdGxlXVwiXWApLFxuICAgICAgICBmb2xkZXI6IHR5cGUgPT09ICdmb2xkZXInID8gJCh0YXJnZXQpIDogJChgJHtxdWVyeX0gaW5wdXRbbmFtZT1cImRhdGFbZm9sZGVyXVwiXWApXG4gICAgfTtcbn07XG5cbnRpdGxlLm9uKCdpbnB1dCBmb2N1cyBibHVyJywgKGV2ZW50KSA9PiB7XG4gICAgaWYgKGN1c3RvbSkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgIGxldCBlbGVtZW50cyA9IGdldEZpZWxkcygndGl0bGUnLCBldmVudC5jdXJyZW50VGFyZ2V0KTtcblxuICAgIGxldCBzbHVnID0gJC5zbHVnaWZ5KGVsZW1lbnRzLnRpdGxlLnZhbCgpLCB7Y3VzdG9tOiB7XCInXCI6ICcnfX0pO1xuICAgIGVsZW1lbnRzLmZvbGRlci52YWwoc2x1Zyk7XG59KTtcblxuZm9sZGVyLm9uKCdpbnB1dCcsIChldmVudCkgPT4ge1xuICAgIGxldCBlbGVtZW50cyA9IGdldEZpZWxkcygnZm9sZGVyJywgZXZlbnQuY3VycmVudFRhcmdldCk7XG5cbiAgICBsZXQgaW5wdXQgPSBlbGVtZW50cy5mb2xkZXIuZ2V0KDApO1xuICAgIGxldCB2YWx1ZSA9IGVsZW1lbnRzLmZvbGRlci52YWwoKTtcbiAgICBsZXQgc2VsZWN0aW9uID0ge1xuICAgICAgICBzdGFydDogaW5wdXQuc2VsZWN0aW9uU3RhcnQsXG4gICAgICAgIGVuZDogaW5wdXQuc2VsZWN0aW9uRW5kXG4gICAgfTtcblxuICAgIHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXHMvZywgJy0nKS5yZXBsYWNlKC9bXmEtejAtOV9cXC1dL2csICcnKTtcbiAgICBlbGVtZW50cy5mb2xkZXIudmFsKHZhbHVlKTtcbiAgICBjdXN0b20gPSAhIXZhbHVlO1xuXG4gICAgLy8gcmVzdG9yZSBjdXJzb3IgcG9zaXRpb25cbiAgICBpbnB1dC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb24uc3RhcnQsIHNlbGVjdGlvbi5lbmQpO1xuXG59KTtcblxuZm9sZGVyLm9uKCdmb2N1cyBibHVyJywgKGV2ZW50KSA9PiBnZXRGaWVsZHMoJ3RpdGxlJywgZXZlbnQuY3VycmVudFRhcmdldCkudGl0bGUudHJpZ2dlcignaW5wdXQnKSk7XG5cbiQoZG9jdW1lbnQpLm9uKCdjaGFuZ2UnLCAnW25hbWU9XCJkYXRhW3JvdXRlXVwiXScsIChldmVudCkgPT4ge1xuICAgIGNvbnN0IHJhd3JvdXRlID0gJChldmVudC5jdXJyZW50VGFyZ2V0KS52YWwoKTtcbiAgICBjb25zdCBwYWdlVGVtcGxhdGUgPSAkKCdbbmFtZT1cImRhdGFbbmFtZV1cIl0nKTtcbiAgICBjb25zdCBVUkkgPSBgJHtjb25maWcuYmFzZV91cmxfcmVsYXRpdmV9L2FqYXguanNvbi90YXNrJHtjb25maWcucGFyYW1fc2VwfWdldENoaWxkVHlwZXNgO1xuXG4gICAgaWYgKHBhZ2VUZW1wbGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJlcXVlc3QoVVJJLCB7XG4gICAgICAgIG1ldGhvZDogJ3Bvc3QnLFxuICAgICAgICBib2R5OiB7IHJhd3JvdXRlIH1cbiAgICB9LCAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgY29uc3QgdHlwZSA9IHJlc3BvbnNlLmNoaWxkX3R5cGU7XG4gICAgICAgIGlmICh0eXBlICE9PSAnJyAmJiB0eXBlICE9PSAnZGVmYXVsdCcpIHtcbiAgICAgICAgICAgIHBhZ2VUZW1wbGF0ZS52YWwodHlwZSk7XG4gICAgICAgICAgICBwYWdlVGVtcGxhdGUuZGF0YSgnc2VsZWN0aXplJykuc2V0VmFsdWUodHlwZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn0pO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./app/pages/page/add.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils_jquery_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils/jquery-utils */ \"./app/utils/jquery-utils.js\");\n/* harmony import */ var _utils_request__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/request */ \"./app/utils/request.js\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! grav-config */ \"grav-config\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(grav_config__WEBPACK_IMPORTED_MODULE_3__);\n\n\n\n\nvar custom = false;\nvar folder = jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-remodal-id=\"modal\"] input[name=\"data[folder]\"], [data-remodal-id=\"module\"] input[name=\"data[folder]\"], [data-remodal-id=\"modal-page-copy\"] input[name=\"data[folder]\"]');\nvar title = jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-remodal-id=\"modal\"] input[name=\"data[title]\"], [data-remodal-id=\"module\"] input[name=\"data[title]\"], [data-remodal-id=\"modal-page-copy\"] input[name=\"data[title]\"]');\n\nvar getFields = function getFields(type, target) {\n target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(target);\n var query = \"[data-remodal-id=\\\"\".concat(target.closest('[data-remodal-id]').data('remodal-id'), \"\\\"]\");\n return {\n title: type === 'title' ? jquery__WEBPACK_IMPORTED_MODULE_0___default()(target) : jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"\".concat(query, \" input[name=\\\"data[title]\\\"]\")),\n folder: type === 'folder' ? jquery__WEBPACK_IMPORTED_MODULE_0___default()(target) : jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"\".concat(query, \" input[name=\\\"data[folder]\\\"]\"))\n };\n};\n\ntitle.on('input focus blur', function (event) {\n if (custom) {\n return true;\n }\n\n var elements = getFields('title', event.currentTarget);\n var slug = jquery__WEBPACK_IMPORTED_MODULE_0___default().slugify(elements.title.val(), {\n custom: {\n \"'\": ''\n }\n });\n elements.folder.val(slug);\n});\nfolder.on('input', function (event) {\n var elements = getFields('folder', event.currentTarget);\n var input = elements.folder.get(0);\n var value = elements.folder.val();\n var selection = {\n start: input.selectionStart,\n end: input.selectionEnd\n };\n value = value.toLowerCase().replace(/\\s/g, '-').replace(/[^a-z0-9_\\-]/g, '');\n elements.folder.val(value);\n custom = !!value; // restore cursor position\n\n input.setSelectionRange(selection.start, selection.end);\n});\nfolder.on('focus blur', function (event) {\n return getFields('title', event.currentTarget).title.trigger('input');\n});\njquery__WEBPACK_IMPORTED_MODULE_0___default()(document).on('change', '[name=\"data[route]\"]', function (event) {\n var rawroute = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.currentTarget).val();\n var pageTemplate = jquery__WEBPACK_IMPORTED_MODULE_0___default()('[name=\"data[name]\"]');\n var URI = \"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_3__.config.base_url_relative, \"/ajax.json/task\").concat(grav_config__WEBPACK_IMPORTED_MODULE_3__.config.param_sep, \"getChildTypes\");\n\n if (pageTemplate.length === 0) {\n return;\n }\n\n (0,_utils_request__WEBPACK_IMPORTED_MODULE_2__.default)(URI, {\n method: 'post',\n body: {\n rawroute: rawroute\n }\n }, function (response) {\n var type = response.child_type;\n\n if (type !== '' && type !== 'default') {\n pageTemplate.val(type);\n pageTemplate.data('selectize').setValue(type);\n }\n });\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL3BhZ2VzL3BhZ2UvYWRkLmpzP2IyMjgiXSwibmFtZXMiOlsiY3VzdG9tIiwiZm9sZGVyIiwiJCIsInRpdGxlIiwiZ2V0RmllbGRzIiwidHlwZSIsInRhcmdldCIsInF1ZXJ5IiwiY2xvc2VzdCIsImRhdGEiLCJvbiIsImV2ZW50IiwiZWxlbWVudHMiLCJjdXJyZW50VGFyZ2V0Iiwic2x1ZyIsInZhbCIsImlucHV0IiwiZ2V0IiwidmFsdWUiLCJzZWxlY3Rpb24iLCJzdGFydCIsInNlbGVjdGlvblN0YXJ0IiwiZW5kIiwic2VsZWN0aW9uRW5kIiwidG9Mb3dlckNhc2UiLCJyZXBsYWNlIiwic2V0U2VsZWN0aW9uUmFuZ2UiLCJ0cmlnZ2VyIiwiZG9jdW1lbnQiLCJyYXdyb3V0ZSIsInBhZ2VUZW1wbGF0ZSIsIlVSSSIsImNvbmZpZyIsImxlbmd0aCIsInJlcXVlc3QiLCJtZXRob2QiLCJib2R5IiwicmVzcG9uc2UiLCJjaGlsZF90eXBlIiwic2V0VmFsdWUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBLElBQUlBLE1BQU0sR0FBRyxLQUFiO0FBQ0EsSUFBSUMsTUFBTSxHQUFHQyw2Q0FBQyxDQUFDLDZLQUFELENBQWQ7QUFDQSxJQUFJQyxLQUFLLEdBQUdELDZDQUFDLENBQUMsMEtBQUQsQ0FBYjs7QUFDQSxJQUFJRSxTQUFTLEdBQUcsU0FBWkEsU0FBWSxDQUFDQyxJQUFELEVBQU9DLE1BQVAsRUFBa0I7QUFDOUJBLFFBQU0sR0FBR0osNkNBQUMsQ0FBQ0ksTUFBRCxDQUFWO0FBQ0EsTUFBSUMsS0FBSyxnQ0FBd0JELE1BQU0sQ0FBQ0UsT0FBUCxDQUFlLG1CQUFmLEVBQW9DQyxJQUFwQyxDQUF5QyxZQUF6QyxDQUF4QixRQUFUO0FBRUEsU0FBTztBQUNITixTQUFLLEVBQUVFLElBQUksS0FBSyxPQUFULEdBQW1CSCw2Q0FBQyxDQUFDSSxNQUFELENBQXBCLEdBQStCSiw2Q0FBQyxX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WSxDQUFDZixHQUFiLENBQWlCVixJQUFqQjtBQUNBeUIsa0JBQVksQ0FBQ3JCLElBQWIsQ0FBa0IsV0FBbEIsRUFBK0I4QixRQUEvQixDQUF3Q2xDLElBQXhDO0FBQ0g7QUFDSixHQVRNLENBQVA7QUFVSCxDQW5CRCIsImZpbGUiOiIuL2FwcC9wYWdlcy9wYWdlL2FkZC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgJy4uLy4uL3V0aWxzL2pxdWVyeS11dGlscyc7XG5pbXBvcnQgcmVxdWVzdCBmcm9tICcuLi8uLi91dGlscy9yZXF1ZXN0JztcbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJ2dyYXYtY29uZmlnJztcblxubGV0IGN1c3RvbSA9IGZhbHNlO1xubGV0IGZvbGRlciA9ICQoJ1tkYXRhLXJlbW9kYWwtaWQ9XCJtb2RhbFwiXSBpbnB1dFtuYW1lPVwiZGF0YVtmb2xkZXJdXCJdLCBbZGF0YS1yZW1vZGFsLWlkPVwibW9kdWxlXCJdIGlucHV0W25hbWU9XCJkYXRhW2ZvbGRlcl1cIl0sIFtkYXRhLXJlbW9kYWwtaWQ9XCJtb2RhbC1wYWdlLWNvcHlcIl0gaW5wdXRbbmFtZT1cImRhdGFbZm9sZGVyXVwiXScpO1xubGV0IHRpdGxlID0gJCgnW2RhdGEtcmVtb2RhbC1pZD1cIm1vZGFsXCJdIGlucHV0W25hbWU9XCJkYXRhW3RpdGxlXVwiXSwgW2RhdGEtcmVtb2RhbC1pZD1cIm1vZHVsZVwiXSBpbnB1dFtuYW1lPVwiZGF0YVt0aXRsZV1cIl0sIFtkYXRhLXJlbW9kYWwtaWQ9XCJtb2RhbC1wYWdlLWNvcHlcIl0gaW5wdXRbbmFtZT1cImRhdGFbdGl0bGVdXCJdJyk7XG5sZXQgZ2V0RmllbGRzID0gKHR5cGUsIHRhcmdldCkgPT4ge1xuICAgIHRhcmdldCA9ICQodGFyZ2V0KTtcbiAgICBsZXQgcXVlcnkgPSBgW2RhdGEtcmVtb2RhbC1pZD1cIiR7dGFyZ2V0LmNsb3Nlc3QoJ1tkYXRhLXJlbW9kYWwtaWRdJykuZGF0YSgncmVtb2RhbC1pZCcpfVwiXWA7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB0aXRsZTogdHlwZSA9PT0gJ3RpdGxlJyA/ICQodGFyZ2V0KSA6ICQoYCR7cXVlcnl9IGlucHV0W25hbWU9XCJkYXRhW3RpdGxlXVwiXWApLFxuICAgICAgICBmb2xkZXI6IHR5cGUgPT09ICdmb2xkZXInID8gJCh0YXJnZXQpIDogJChgJHtxdWVyeX0gaW5wdXRbbmFtZT1cImRhdGFbZm9sZGVyXVwiXWApXG4gICAgfTtcbn07XG5cbnRpdGxlLm9uKCdpbnB1dCBmb2N1cyBibHVyJywgKGV2ZW50KSA9PiB7XG4gICAgaWYgKGN1c3RvbSkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgIGxldCBlbGVtZW50cyA9IGdldEZpZWxkcygndGl0bGUnLCBldmVudC5jdXJyZW50VGFyZ2V0KTtcblxuICAgIGxldCBzbHVnID0gJC5zbHVnaWZ5KGVsZW1lbnRzLnRpdGxlLnZhbCgpLCB7Y3VzdG9tOiB7XCInXCI6ICcnfX0pO1xuICAgIGVsZW1lbnRzLmZvbGRlci52YWwoc2x1Zyk7XG59KTtcblxuZm9sZGVyLm9uKCdpbnB1dCcsIChldmVudCkgPT4ge1xuICAgIGxldCBlbGVtZW50cyA9IGdldEZpZWxkcygnZm9sZGVyJywgZXZlbnQuY3VycmVudFRhcmdldCk7XG5cbiAgICBsZXQgaW5wdXQgPSBlbGVtZW50cy5mb2xkZXIuZ2V0KDApO1xuICAgIGxldCB2YWx1ZSA9IGVsZW1lbnRzLmZvbGRlci52YWwoKTtcbiAgICBsZXQgc2VsZWN0aW9uID0ge1xuICAgICAgICBzdGFydDogaW5wdXQuc2VsZWN0aW9uU3RhcnQsXG4gICAgICAgIGVuZDogaW5wdXQuc2VsZWN0aW9uRW5kXG4gICAgfTtcblxuICAgIHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXHMvZywgJy0nKS5yZXBsYWNlKC9bXmEtejAtOV9cXC1dL2csICcnKTtcbiAgICBlbGVtZW50cy5mb2xkZXIudmFsKHZhbHVlKTtcbiAgICBjdXN0b20gPSAhIXZhbHVlO1xuXG4gICAgLy8gcmVzdG9yZSBjdXJzb3IgcG9zaXRpb25cbiAgICBpbnB1dC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb24uc3RhcnQsIHNlbGVjdGlvbi5lbmQpO1xuXG59KTtcblxuZm9sZGVyLm9uKCdmb2N1cyBibHVyJywgKGV2ZW50KSA9PiBnZXRGaWVsZHMoJ3RpdGxlJywgZXZlbnQuY3VycmVudFRhcmdldCkudGl0bGUudHJpZ2dlcignaW5wdXQnKSk7XG5cbiQoZG9jdW1lbnQpLm9uKCdjaGFuZ2UnLCAnW25hbWU9XCJkYXRhW3JvdXRlXVwiXScsIChldmVudCkgPT4ge1xuICAgIGNvbnN0IHJhd3JvdXRlID0gJChldmVudC5jdXJyZW50VGFyZ2V0KS52YWwoKTtcbiAgICBjb25zdCBwYWdlVGVtcGxhdGUgPSAkKCdbbmFtZT1cImRhdGFbbmFtZV1cIl0nKTtcbiAgICBjb25zdCBVUkkgPSBgJHtjb25maWcuYmFzZV91cmxfcmVsYXRpdmV9L2FqYXguanNvbi90YXNrJHtjb25maWcucGFyYW1fc2VwfWdldENoaWxkVHlwZXNgO1xuXG4gICAgaWYgKHBhZ2VUZW1wbGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJlcXVlc3QoVVJJLCB7XG4gICAgICAgIG1ldGhvZDogJ3Bvc3QnLFxuICAgICAgICBib2R5OiB7IHJhd3JvdXRlIH1cbiAgICB9LCAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgY29uc3QgdHlwZSA9IHJlc3BvbnNlLmNoaWxkX3R5cGU7XG4gICAgICAgIGlmICh0eXBlICE9PSAnJyAmJiB0eXBlICE9PSAnZGVmYXVsdCcpIHtcbiAgICAgICAgICAgIHBhZ2VUZW1wbGF0ZS52YWwodHlwZSk7XG4gICAgICAgICAgICBwYWdlVGVtcGxhdGUuZGF0YSgnc2VsZWN0aXplJykuc2V0VmFsdWUodHlwZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn0pO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./app/pages/page/add.js\n"); /***/ }), /***/ "./app/pages/page/delete.js": -/*!**********************************!* +/*!**********************************!*\ !*** ./app/pages/page/delete.js ***! \**********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { @@ -385,7 +396,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var jque /***/ }), /***/ "./app/pages/page/disable-buttons.js": -/*!*******************************************!* +/*!*******************************************!*\ !*** ./app/pages/page/disable-buttons.js ***! \*******************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { @@ -396,29 +407,29 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var jque /***/ }), /***/ "./app/pages/page/index.js": -/*!*********************************!* +/*!*********************************!*\ !*** ./app/pages/page/index.js ***! \*********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => __WEBPACK_DEFAULT_EXPORT__\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _add__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./add */ \"./app/pages/page/add.js\");\n/* harmony import */ var _move__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./move */ \"./app/pages/page/move.js\");\n/* harmony import */ var _delete__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./delete */ \"./app/pages/page/delete.js\");\n/* harmony import */ var _unset__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./unset */ \"./app/pages/page/unset.js\");\n/* harmony import */ var _disable_buttons__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./disable-buttons */ \"./app/pages/page/disable-buttons.js\");\n/* harmony import */ var _media__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./media */ \"./app/pages/page/media.js\");\n/* harmony import */ var _multilang__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./multilang */ \"./app/pages/page/multilang.js\");\n\n\n\n\n\n\n\n\nvar switcher = jquery__WEBPACK_IMPORTED_MODULE_0___default()('input[type=\"radio\"][name=\"mode-switch\"]');\n\nif (switcher) {\n var link = switcher.closest(':checked').data('leave-url');\n var fakeLink = jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"\"));\n switcher.parent().append(fakeLink);\n switcher.siblings('label').on('mousedown touchdown', function (event) {\n event.preventDefault(); // let remodal = $.remodal.lookup[$('[data-remodal-id=\"changes\"]').data('remodal')];\n\n var confirm = jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-remodal-id=\"changes\"] [data-leave-action=\"continue\"]');\n confirm.one('click', function () {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(__webpack_require__.g).on('beforeunload._grav');\n fakeLink.off('click._grav');\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.target).trigger('click');\n });\n fakeLink.trigger('click._grav');\n });\n switcher.on('change', function (event) {\n var radio = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.target);\n link = radio.data('leave-url');\n setTimeout(function () {\n return fakeLink.attr('href', link).get(0).click();\n }, 5);\n });\n}\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n Media: {\n PageMedia: _media__WEBPACK_IMPORTED_MODULE_6__.default,\n PageMediaInstances: _media__WEBPACK_IMPORTED_MODULE_6__.Instance\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL3BhZ2VzL3BhZ2UvaW5kZXguanM/YzAxYyJdLCJuYW1lcyI6WyJzd2l0Y2hlciIsIiQiLCJsaW5rIiwiY2xvc2VzdCIsImRhdGEiLCJmYWtlTGluayIsInBhcmVudCIsImFwcGVuZCIsInNpYmxpbmdzIiwib24iLCJldmVudCIsInByZXZlbnREZWZhdWx0IiwiY29uZmlybSIsIm9uZSIsImdsb2JhbCIsIm9mZiIsInRhcmdldCIsInRyaWdnZXIiLCJyYWRpbyIsInNldFRpbWVvdXQiLCJhdHRyIiwiZ2V0IiwiY2xpY2siLCJNZWRpYSIsIlBhZ2VNZWRpYSIsIlBhZ2VNZWRpYUluc3RhbmNlcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQSxJQUFNQSxRQUFRLEdBQUdDLDZDQUFDLENBQUMseUNBQUQsQ0FBbEI7O0FBRUEsSUFBSUQsUUFBSixFQUFjO0FBQ1YsTUFBSUUsSUFBSSxHQUFHRixRQUFRLENBQUNHLE9BQVQsQ0FBaUIsVUFBakIsRUFBNkJDLElBQTdCLENBQWtDLFdBQWxDLENBQVg7QUFDQSxNQUFJQyxRQUFRLEdBQUdKLDZDQUFDLHFCQUFhQyxJQUFiLFdBQWhCO0FBRUFGLFVBQVEsQ0FBQ00sTUFBVCxHQUFrQkMsTUFBbEIsQ0FBeUJGLFFBQXpCO0FBRUFMLFVBQVEsQ0FBQ1EsUUFBVCxDQUFrQixPQUFsQixFQUEyQkMsRUFBM0IsQ0FBOEIscUJBQTlCLEVBQXFELFVBQUNDLEtBQUQsRUFBVztBQUM1REEsU0FBSyxDQUFDQyxjQUFOLEdBRDRELENBRzVEOztBQUNBLFFBQUlDLE9BQU8sR0FBR1gsNkNBQUMsQ0FBQyw0REFBRCxDQUFmO0FBRUFXLFdBQU8sQ0FBQ0MsR0FBUixDQUFZLE9BQVosRUFBcUIsWUFBTTtBQUN2QlosbURBQUMsQ0FBQ2EscUJBQUQsQ0FBRCxDQUFVTCxFQUFWLENBQWEsb0JBQWI7QUFDQUosY0FBUSxDQUFDVSxHQUFULENBQWEsYUFBYjtBQUVBZCxtREFBQyxDQUFDUyxLQUFLLENBQUNNLE1BQVAsQ0FBRCxDQUFnQkMsT0FBaEIsQ0FBd0IsT0FBeEI7QUFDSCxLQUxEO0FBT0FaLFlBQVEsQ0FBQ1ksT0FBVCxDQUFpQixhQUFqQjtBQUNILEdBZEQ7QUFnQkFqQixVQUFRLENBQUNTLEVBQVQsQ0FBWSxRQUFaLEVBQXNCLFVBQUNDLEtBQUQsRUFBVztBQUM3QixRQUFJUSxLQUFLLEdBQUdqQiw2Q0FBQyxDQUFDUyxLQUFLLENBQUNNLE1BQVAsQ0FBYjtBQUNBZCxRQUFJLEdBQUdnQixLQUFLLENBQUNkLElBQU4sQ0FBVyxXQUFYLENBQVA7QUFFQWUsY0FBVSxDQUFDO0FBQUEsYUFBTWQsUUFBUSxDQUFDZSxJQUFULENBQWMsTUFBZCxFQUFzQmxCLElBQXRCLEVBQTRCbUIsR0FBNUIsQ0FBZ0MsQ0FBaEMsRUFBbUNDLEtBQW5DLEVBQU47QUFBQSxLQUFELEVBQW1ELENBQW5ELENBQVY7QUFDSCxHQUxEO0FBTUg7O0FBRUQsaUVBQWU7QUFDWEMsT0FBSyxFQUFFO0FBQ0hDLGFBQVMsRUFBVEEsMkNBREc7QUFFSEMsc0JBQWtCLEVBQWxCQSw0Q0FBa0JBO0FBRmY7QUFESSxDQUFmIiwiZmlsZSI6Ii4vYXBwL3BhZ2VzL3BhZ2UvaW5kZXguanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0ICcuL2FkZCc7XG5pbXBvcnQgJy4vbW92ZSc7XG5pbXBvcnQgJy4vZGVsZXRlJztcbmltcG9ydCAnLi91bnNldCc7XG5pbXBvcnQgJy4vZGlzYWJsZS1idXR0b25zJztcbmltcG9ydCBQYWdlTWVkaWEsIHsgSW5zdGFuY2UgYXMgUGFnZU1lZGlhSW5zdGFuY2VzIH0gZnJvbSAnLi9tZWRpYSc7XG5pbXBvcnQgJy4vbXVsdGlsYW5nJztcblxuY29uc3Qgc3dpdGNoZXIgPSAkKCdpbnB1dFt0eXBlPVwicmFkaW9cIl1bbmFtZT1cIm1vZGUtc3dpdGNoXCJdJyk7XG5cbmlmIChzd2l0Y2hlcikge1xuICAgIGxldCBsaW5rID0gc3dpdGNoZXIuY2xvc2VzdCgnOmNoZWNrZWQnKS5kYXRhKCdsZWF2ZS11cmwnKTtcbiAgICBsZXQgZmFrZUxpbmsgPSAkKGA8YSBocmVmPVwiJHtsaW5rfVwiIC8+YCk7XG5cbiAgICBzd2l0Y2hlci5wYXJlbnQoKS5hcHBlbmQoZmFrZUxpbmspO1xuXG4gICAgc3dpdGNoZXIuc2libGluZ3MoJ2xhYmVsJykub24oJ21vdXNlZG93biB0b3VjaGRvd24nLCAoZXZlbnQpID0+IHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAvLyBsZXQgcmVtb2RhbCA9ICQucmVtb2RhbC5sb29rdXBbJCgnW2RhdGEtcmVtb2RhbC1pZD1cImNoYW5nZXNcIl0nKS5kYXRhKCdyZW1vZGFsJyldO1xuICAgICAgICBsZXQgY29uZmlybSA9ICQoJ1tkYXRhLXJlbW9kYWwtaWQ9XCJjaGFuZ2VzXCJdIFtkYXRhLWxlYXZlLWFjdGlvbj1cImNvbnRpbnVlXCJdJyk7XG5cbiAgICAgICAgY29uZmlybS5vbmUoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgJChnbG9iYWwpLm9uKCdiZWZvcmV1bmxvYWQuX2dyYXYnKTtcbiAgICAgICAgICAgIGZha2VMaW5rLm9mZignY2xpY2suX2dyYXYnKTtcblxuICAgICAgICAgICAgJChldmVudC50YXJnZXQpLnRyaWdnZXIoJ2NsaWNrJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZha2VMaW5rLnRyaWdnZXIoJ2NsaWNrLl9ncmF2Jyk7XG4gICAgfSk7XG5cbiAgICBzd2l0Y2hlci5vbignY2hhbmdlJywgKGV2ZW50KSA9PiB7XG4gICAgICAgIGxldCByYWRpbyA9ICQoZXZlbnQudGFyZ2V0KTtcbiAgICAgICAgbGluayA9IHJhZGlvLmRhdGEoJ2xlYXZlLXVybCcpO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gZmFrZUxpbmsuYXR0cignaHJlZicsIGxpbmspLmdldCgwKS5jbGljaygpLCA1KTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICAgIE1lZGlhOiB7XG4gICAgICAgIFBhZ2VNZWRpYSxcbiAgICAgICAgUGFnZU1lZGlhSW5zdGFuY2VzXG4gICAgfVxufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./app/pages/page/index.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _add__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./add */ \"./app/pages/page/add.js\");\n/* harmony import */ var _move__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./move */ \"./app/pages/page/move.js\");\n/* harmony import */ var _delete__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./delete */ \"./app/pages/page/delete.js\");\n/* harmony import */ var _unset__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./unset */ \"./app/pages/page/unset.js\");\n/* harmony import */ var _disable_buttons__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./disable-buttons */ \"./app/pages/page/disable-buttons.js\");\n/* harmony import */ var _media__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./media */ \"./app/pages/page/media.js\");\n/* harmony import */ var _multilang__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./multilang */ \"./app/pages/page/multilang.js\");\n\n\n\n\n\n\n\n\nvar switcher = jquery__WEBPACK_IMPORTED_MODULE_0___default()('input[type=\"radio\"][name=\"mode-switch\"]');\n\nif (switcher) {\n var link = switcher.closest(':checked').data('leave-url');\n var fakeLink = jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"\"));\n switcher.parent().append(fakeLink);\n switcher.siblings('label').on('mousedown touchdown', function (event) {\n event.preventDefault(); // let remodal = $.remodal.lookup[$('[data-remodal-id=\"changes\"]').data('remodal')];\n\n var confirm = jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-remodal-id=\"changes\"] [data-leave-action=\"continue\"]');\n confirm.one('click', function () {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(__webpack_require__.g).on('beforeunload._grav');\n fakeLink.off('click._grav');\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.target).trigger('click');\n });\n fakeLink.trigger('click._grav');\n });\n switcher.on('change', function (event) {\n var radio = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.target);\n link = radio.data('leave-url');\n setTimeout(function () {\n return fakeLink.attr('href', link).get(0).click();\n }, 5);\n });\n}\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n Media: {\n PageMedia: _media__WEBPACK_IMPORTED_MODULE_6__.default,\n PageMediaInstances: _media__WEBPACK_IMPORTED_MODULE_6__.Instance\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL3BhZ2VzL3BhZ2UvaW5kZXguanM/YzAxYyJdLCJuYW1lcyI6WyJzd2l0Y2hlciIsIiQiLCJsaW5rIiwiY2xvc2VzdCIsImRhdGEiLCJmYWtlTGluayIsInBhcmVudCIsImFwcGVuZCIsInNpYmxpbmdzIiwib24iLCJldmVudCIsInByZXZlbnREZWZhdWx0IiwiY29uZmlybSIsIm9uZSIsImdsb2JhbCIsIm9mZiIsInRhcmdldCIsInRyaWdnZXIiLCJyYWRpbyIsInNldFRpbWVvdXQiLCJhdHRyIiwiZ2V0IiwiY2xpY2siLCJNZWRpYSIsIlBhZ2VNZWRpYSIsIlBhZ2VNZWRpYUluc3RhbmNlcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQSxJQUFNQSxRQUFRLEdBQUdDLDZDQUFDLENBQUMseUNBQUQsQ0FBbEI7O0FBRUEsSUFBSUQsUUFBSixFQUFjO0FBQ1YsTUFBSUUsSUFBSSxHQUFHRixRQUFRLENBQUNHLE9BQVQsQ0FBaUIsVUFBakIsRUFBNkJDLElBQTdCLENBQWtDLFdBQWxDLENBQVg7QUFDQSxNQUFJQyxRQUFRLEdBQUdKLDZDQUFDLHFCQUFhQyxJQUFiLFdBQWhCO0FBRUFGLFVBQVEsQ0FBQ00sTUFBVCxHQUFrQkMsTUFBbEIsQ0FBeUJGLFFBQXpCO0FBRUFMLFVBQVEsQ0FBQ1EsUUFBVCxDQUFrQixPQUFsQixFQUEyQkMsRUFBM0IsQ0FBOEIscUJBQTlCLEVBQXFELFVBQUNDLEtBQUQsRUFBVztBQUM1REEsU0FBSyxDQUFDQyxjQUFOLEdBRDRELENBRzVEOztBQUNBLFFBQUlDLE9BQU8sR0FBR1gsNkNBQUMsQ0FBQyw0REFBRCxDQUFmO0FBRUFXLFdBQU8sQ0FBQ0MsR0FBUixDQUFZLE9BQVosRUFBcUIsWUFBTTtBQUN2QlosbURBQUMsQ0FBQ2EscUJBQUQsQ0FBRCxDQUFVTCxFQUFWLENBQWEsb0JBQWI7QUFDQUosY0FBUSxDQUFDVSxHQUFULENBQWEsYUFBYjtBQUVBZCxtREFBQyxDQUFDUyxLQUFLLENBQUNNLE1BQVAsQ0FBRCxDQUFnQkMsT0FBaEIsQ0FBd0IsT0FBeEI7QUFDSCxLQUxEO0FBT0FaLFlBQVEsQ0FBQ1ksT0FBVCxDQUFpQixhQUFqQjtBQUNILEdBZEQ7QUFnQkFqQixVQUFRLENBQUNTLEVBQVQsQ0FBWSxRQUFaLEVBQXNCLFVBQUNDLEtBQUQsRUFBVztBQUM3QixRQUFJUSxLQUFLLEdBQUdqQiw2Q0FBQyxDQUFDUyxLQUFLLENBQUNNLE1BQVAsQ0FBYjtBQUNBZCxRQUFJLEdBQUdnQixLQUFLLENBQUNkLElBQU4sQ0FBVyxXQUFYLENBQVA7QUFFQWUsY0FBVSxDQUFDO0FBQUEsYUFBTWQsUUFBUSxDQUFDZSxJQUFULENBQWMsTUFBZCxFQUFzQmxCLElBQXRCLEVBQTRCbUIsR0FBNUIsQ0FBZ0MsQ0FBaEMsRUFBbUNDLEtBQW5DLEVBQU47QUFBQSxLQUFELEVBQW1ELENBQW5ELENBQVY7QUFDSCxHQUxEO0FBTUg7O0FBRUQsaUVBQWU7QUFDWEMsT0FBSyxFQUFFO0FBQ0hDLGFBQVMsRUFBVEEsMkNBREc7QUFFSEMsc0JBQWtCLEVBQWxCQSw0Q0FBa0JBO0FBRmY7QUFESSxDQUFmIiwiZmlsZSI6Ii4vYXBwL3BhZ2VzL3BhZ2UvaW5kZXguanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0ICcuL2FkZCc7XG5pbXBvcnQgJy4vbW92ZSc7XG5pbXBvcnQgJy4vZGVsZXRlJztcbmltcG9ydCAnLi91bnNldCc7XG5pbXBvcnQgJy4vZGlzYWJsZS1idXR0b25zJztcbmltcG9ydCBQYWdlTWVkaWEsIHsgSW5zdGFuY2UgYXMgUGFnZU1lZGlhSW5zdGFuY2VzIH0gZnJvbSAnLi9tZWRpYSc7XG5pbXBvcnQgJy4vbXVsdGlsYW5nJztcblxuY29uc3Qgc3dpdGNoZXIgPSAkKCdpbnB1dFt0eXBlPVwicmFkaW9cIl1bbmFtZT1cIm1vZGUtc3dpdGNoXCJdJyk7XG5cbmlmIChzd2l0Y2hlcikge1xuICAgIGxldCBsaW5rID0gc3dpdGNoZXIuY2xvc2VzdCgnOmNoZWNrZWQnKS5kYXRhKCdsZWF2ZS11cmwnKTtcbiAgICBsZXQgZmFrZUxpbmsgPSAkKGA8YSBocmVmPVwiJHtsaW5rfVwiIC8+YCk7XG5cbiAgICBzd2l0Y2hlci5wYXJlbnQoKS5hcHBlbmQoZmFrZUxpbmspO1xuXG4gICAgc3dpdGNoZXIuc2libGluZ3MoJ2xhYmVsJykub24oJ21vdXNlZG93biB0b3VjaGRvd24nLCAoZXZlbnQpID0+IHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAvLyBsZXQgcmVtb2RhbCA9ICQucmVtb2RhbC5sb29rdXBbJCgnW2RhdGEtcmVtb2RhbC1pZD1cImNoYW5nZXNcIl0nKS5kYXRhKCdyZW1vZGFsJyldO1xuICAgICAgICBsZXQgY29uZmlybSA9ICQoJ1tkYXRhLXJlbW9kYWwtaWQ9XCJjaGFuZ2VzXCJdIFtkYXRhLWxlYXZlLWFjdGlvbj1cImNvbnRpbnVlXCJdJyk7XG5cbiAgICAgICAgY29uZmlybS5vbmUoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgJChnbG9iYWwpLm9uKCdiZWZvcmV1bmxvYWQuX2dyYXYnKTtcbiAgICAgICAgICAgIGZha2VMaW5rLm9mZignY2xpY2suX2dyYXYnKTtcblxuICAgICAgICAgICAgJChldmVudC50YXJnZXQpLnRyaWdnZXIoJ2NsaWNrJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZha2VMaW5rLnRyaWdnZXIoJ2NsaWNrLl9ncmF2Jyk7XG4gICAgfSk7XG5cbiAgICBzd2l0Y2hlci5vbignY2hhbmdlJywgKGV2ZW50KSA9PiB7XG4gICAgICAgIGxldCByYWRpbyA9ICQoZXZlbnQudGFyZ2V0KTtcbiAgICAgICAgbGluayA9IHJhZGlvLmRhdGEoJ2xlYXZlLXVybCcpO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gZmFrZUxpbmsuYXR0cignaHJlZicsIGxpbmspLmdldCgwKS5jbGljaygpLCA1KTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICAgIE1lZGlhOiB7XG4gICAgICAgIFBhZ2VNZWRpYSxcbiAgICAgICAgUGFnZU1lZGlhSW5zdGFuY2VzXG4gICAgfVxufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./app/pages/page/index.js\n"); /***/ }), /***/ "./app/pages/page/media.js": -/*!*********************************!* +/*!*********************************!*\ !*** ./app/pages/page/media.js ***! \*********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => /* binding */ PageMedia,\n/* harmony export */ \"Instance\": () => /* binding */ Instance\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils_request__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils/request */ \"./app/utils/request.js\");\n/* harmony import */ var _forms_fields_files__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../forms/fields/files */ \"./app/forms/fields/files.js\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! grav-config */ \"grav-config\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(grav_config__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _forms_fields_editor__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../forms/fields/editor */ \"./app/forms/fields/editor.js\");\n/* harmony import */ var sortablejs__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! sortablejs */ \"./node_modules/sortablejs/modular/sortable.complete.esm.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _get(target, property, receiver) { if (typeof Reflect !== \"undefined\" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); }\n\nfunction _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\n\n\nvar previewTemplate = \"\\n \").trim();\n\nvar PageMedia = /*#__PURE__*/function (_FilesField) {\n _inherits(PageMedia, _FilesField);\n\n var _super = _createSuper(PageMedia);\n\n function PageMedia() {\n var _this;\n\n var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n _ref$container = _ref.container,\n container = _ref$container === void 0 ? '#grav-dropzone' : _ref$container,\n _ref$options = _ref.options,\n options = _ref$options === void 0 ? {} : _ref$options;\n\n _classCallCheck(this, PageMedia);\n\n options = Object.assign(options, {\n previewTemplate: previewTemplate\n });\n _this = _super.call(this, {\n container: container,\n options: options\n });\n\n if (!_this.container.length) {\n return _possibleConstructorReturn(_this);\n }\n\n _this.urls = {\n fetch: \"\".concat(_this.container.data('media-url'), \"/task\").concat(grav_config__WEBPACK_IMPORTED_MODULE_3__.config.param_sep, \"listmedia\"),\n add: \"\".concat(_this.container.data('media-url'), \"/task\").concat(grav_config__WEBPACK_IMPORTED_MODULE_3__.config.param_sep, \"addmedia\"),\n \"delete\": \"\".concat(_this.container.data('media-url'), \"/task\").concat(grav_config__WEBPACK_IMPORTED_MODULE_3__.config.param_sep, \"delmedia\")\n };\n _this.dropzone.options.url = _this.urls.add;\n\n if (typeof _this.options.fetchMedia === 'undefined' || _this.options.fetchMedia) {\n _this.fetchMedia();\n }\n\n if (typeof _this.options.attachDragDrop === 'undefined' || _this.options.attachDragDrop) {\n _this.attachDragDrop();\n }\n\n var field = jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"[name=\\\"\".concat(_this.container.data('dropzone-field'), \"\\\"]\"));\n\n if (field.length) {\n _this.sortable = new sortablejs__WEBPACK_IMPORTED_MODULE_5__.default(_this.container.get(0), {\n animation: 150,\n // forceFallback: true,\n setData: function setData(dataTransfer, target) {\n target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(target);\n var uri = encodeURI(target.find('.dz-filename').text());\n var shortcode = (0,_forms_fields_files__WEBPACK_IMPORTED_MODULE_2__.UriToMarkdown)(uri);\n\n _this.dropzone.disable();\n\n target.addClass('hide-backface');\n dataTransfer.effectAllowed = 'copy';\n dataTransfer.setData('text', shortcode);\n },\n onSort: function onSort() {\n var names = [];\n\n _this.container.find('[data-dz-name]').each(function (index, file) {\n file = jquery__WEBPACK_IMPORTED_MODULE_0___default()(file);\n var name = file.text().trim();\n names.push(name);\n });\n\n field.val(names.join(','));\n }\n });\n }\n\n return _this;\n }\n\n _createClass(PageMedia, [{\n key: \"fetchMedia\",\n value: function fetchMedia() {\n var _this2 = this;\n\n var order = this.container.closest('.form-field').find('[name=\"data[header][media_order]\"]').val();\n var body = {\n uri: this.getURI(),\n order: order\n };\n var url = this.urls.fetch;\n (0,_utils_request__WEBPACK_IMPORTED_MODULE_1__.default)(url, {\n method: 'post',\n body: body\n }, function (response) {\n var results = response.results;\n Object.keys(results).forEach(function (name) {\n var data = results[name];\n var mock = {\n name: name,\n size: data.size,\n accepted: true,\n extras: data\n };\n\n _this2.dropzone.files.push(mock);\n\n _this2.dropzone.options.addedfile.call(_this2.dropzone, mock);\n\n _this2.dropzone.options.thumbnail.call(_this2.dropzone, mock, data.url);\n });\n\n _this2.container.find('.dz-preview').prop('draggable', 'true');\n });\n }\n }, {\n key: \"onDropzoneSending\",\n value: function onDropzoneSending(file, xhr, formData) {\n /*\n // Cannot call super because Safari and IE API don't implement `delete`\n super.onDropzoneSending(file, xhr, formData);\n formData.delete('task');\n */\n formData.append('name', this.options.dotNotation || file.name);\n formData.append('admin-nonce', grav_config__WEBPACK_IMPORTED_MODULE_3__.config.admin_nonce);\n formData.append('uri', this.getURI());\n }\n }, {\n key: \"onDropzoneComplete\",\n value: function onDropzoneComplete(file) {\n _get(_getPrototypeOf(PageMedia.prototype), \"onDropzoneComplete\", this).call(this, file);\n\n this.sortable.options.onSort(); // accepted\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.dz-preview').prop('draggable', 'true');\n }\n }, {\n key: \"onDropzoneRemovedFile\",\n value: function onDropzoneRemovedFile(file) {\n var _get2;\n\n for (var _len = arguments.length, extra = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n extra[_key - 1] = arguments[_key];\n }\n\n (_get2 = _get(_getPrototypeOf(PageMedia.prototype), \"onDropzoneRemovedFile\", this)).call.apply(_get2, [this, file].concat(extra));\n\n this.sortable.options.onSort();\n }\n }, {\n key: \"attachDragDrop\",\n value: function attachDragDrop() {\n var _this3 = this;\n\n this.container.delegate('[data-dz-insert]', 'click', function (e) {\n var target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(e.currentTarget).parent('.dz-preview').find('.dz-filename');\n var editor = _forms_fields_editor__WEBPACK_IMPORTED_MODULE_4__.Instance.editors.filter(function (index, editor) {\n return jquery__WEBPACK_IMPORTED_MODULE_0___default()(editor).attr('name') === 'data[content]';\n });\n\n if (editor.length) {\n editor = editor.data('codemirror');\n editor.focus();\n var filename = encodeURI(target.text());\n var shortcode = (0,_forms_fields_files__WEBPACK_IMPORTED_MODULE_2__.UriToMarkdown)(filename);\n editor.doc.replaceSelection(shortcode);\n }\n });\n this.container.delegate('[data-dz-view]', 'mouseenter', function (e) {\n var target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(e.currentTarget);\n var file = target.parent('.dz-preview').find('.dz-filename');\n var filename = encodeURI(file.text());\n var URL = target.closest('[data-media-path]').data('media-path');\n\n var original = _this3.dropzone.files.filter(function (file) {\n return encodeURI(file.name) === filename;\n }).shift();\n\n original = original && (original.extras && original.extras.original || encodeURI(original.name));\n target.attr('href', \"\".concat(URL, \"/\").concat(original));\n });\n this.container.delegate('[data-dz-metadata]', 'click', function (e) {\n e.preventDefault();\n var target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(e.currentTarget);\n var file = target.parent('.dz-preview').find('.dz-filename');\n var filename = encodeURI(file.text());\n var fileObj = _this3.dropzone.files.filter(function (file) {\n return file.name === __webpack_require__.g.decodeURI(filename);\n }).shift() || {};\n\n if (!fileObj.extras) {\n fileObj.extras = {\n metadata: []\n };\n }\n\n if (Array.isArray(fileObj.extras.metadata) && !fileObj.extras.metadata.length) {\n fileObj.extras.metadata = {\n '': \"\".concat(__webpack_require__.g.decodeURI(filename), \".meta.yaml doesn't exist\")\n };\n }\n\n fileObj = fileObj.extras;\n var modal_element = jquery__WEBPACK_IMPORTED_MODULE_0___default()('body').find('[data-remodal-id=\"metadata\"]');\n var modal = (jquery__WEBPACK_IMPORTED_MODULE_0___default().remodal.lookup)[modal_element.data('remodal')];\n modal_element.find('h1 strong').html(filename);\n\n if (fileObj.url) {\n modal_element.find('.meta-preview').html(\"\"));\n }\n\n var container = modal_element.find('.meta-content').html('
            ').find('ul');\n Object.keys(fileObj.metadata).forEach(function (meta) {\n container.append(\"
          • \".concat(meta ? meta + ':' : '', \" \").concat(fileObj.metadata[meta], \"
          • \"));\n });\n modal.open();\n });\n this.container.delegate('.dz-preview', 'dragstart', function (e) {\n var target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(e.currentTarget);\n var uri = encodeURI(target.find('.dz-filename').text());\n var shortcode = (0,_forms_fields_files__WEBPACK_IMPORTED_MODULE_2__.UriToMarkdown)(uri);\n\n _this3.dropzone.disable();\n\n target.addClass('hide-backface');\n e.originalEvent.dataTransfer.effectAllowed = 'copy';\n e.originalEvent.dataTransfer.setData('text', shortcode);\n });\n this.container.delegate('.dz-preview', 'dragend', function (e) {\n var target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(e.currentTarget);\n\n _this3.dropzone.enable();\n\n target.removeClass('hide-backface');\n });\n }\n }]);\n\n return PageMedia;\n}(_forms_fields_files__WEBPACK_IMPORTED_MODULE_2__.default);\n\n\nvar Instance = new PageMedia();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL3BhZ2VzL3BhZ2UvbWVkaWEuanM/ZTlhMiJdLCJuYW1lcyI6WyJwcmV2aWV3VGVtcGxhdGUiLCJ0cmFuc2xhdGlvbnMiLCJ0cmltIiwiUGFnZU1lZGlhIiwiY29udGFpbmVyIiwib3B0aW9ucyIsIk9iamVjdCIsImFzc2lnbiIsImxlbmd0aCIsInVybHMiLCJmZXRjaCIsImRhdGEiLCJjb25maWciLCJhZGQiLCJkcm9wem9uZSIsInVybCIsImZldGNoTWVkaWEiLCJhdHRhY2hEcmFnRHJvcCIsImZpZWxkIiwiJCIsInNvcnRhYmxlIiwiU29ydGFibGUiLCJnZXQiLCJhbmltYXRpb24iLCJzZXREYXRhIiwiZGF0YVRyYW5zZmVyIiwidGFyZ2V0IiwidXJpIiwiZW5jb2RlVVJJIiwiZmluZCIsInRleHQiLCJzaG9ydGNvZGUiLCJVcmlUb01hcmtkb3duIiwiZGlzYWJsZSIsImFkZENsYXNzIiwiZWZmZWN0QWxsb3dlZCIsIm9uU29ydCIsIm5hbWVzIiwiZWFjaCIsImluZGV4IiwiZmlsZSIsIm5hbWUiLCJwdXNoIiwidmFsIiwiam9pbiIsIm9yZGVyIiwiY2xvc2VzdCIsImJvZHkiLCJnZXRVUkkiLCJyZXF1ZXN0IiwibWV0aG9kIiwicmVzcG9uc2UiLCJyZXN1bHRzIiwia2V5cyIsImZvckVhY2giLCJtb2NrIiwic2l6ZSIsImFjY2VwdGVkIiwiZXh0cmFzIiwiZmlsZXMiLCJhZGRlZGZpbGUiLCJjYWxsIiwidGh1bWJuYWlsIiwicHJvcCIsInhociIsImZvcm1EYXRhIiwiYXBwZW5kIiwiZG90Tm90YXRpb24iLCJleHRyYSIsImRlbGVnYXRlIiwiZSIsImN1cnJlbnRUYXJnZXQiLCJwYXJlbnQiLCJlZGl0b3IiLCJFZGl0b3IiLCJhdHRyIiwiZm9jdXMiLCJmaWxlbmFtZSIsImRvYyIsInJlcGxhY2VTZWxlY3Rpb24iLCJVUkwiLCJvcmlnaW5hbCIsImZpbHRlciIsInNoaWZ0IiwicHJldmVudERlZmF1bHQiLCJmaWxlT2JqIiwiZ2xvYmFsIiwiZGVjb2RlVVJJIiwibWV0YWRhdGEiLCJBcnJheSIsImlzQXJyYXkiLCJtb2RhbF9lbGVtZW50IiwibW9kYWwiLCJodG1sIiwibWV0YSIsIm9wZW4iLCJvcmlnaW5hbEV2ZW50IiwiZW5hYmxlIiwicmVtb3ZlQ2xhc3MiLCJGaWxlc0ZpZWxkIiwiSW5zdGFuY2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBLElBQU1BLGVBQWUsR0FBRyw0bEJBV1lDLHlFQVhaLDhEQVc2RkEseUVBWDdGLDBEQVljQSwyRUFaZCw4REFZK0ZBLDJFQVovRixzREFhVUEsdUVBYlYsMERBYW1GQSx1RUFibkYsd0RBY1lBLHlFQWRaLDhEQWM2RkEseUVBZDdGLHNCQWVaQyxJQWZZLEVBQXhCOztJQWlCcUJDLFM7Ozs7O0FBQ2pCLHVCQUFpRTtBQUFBOztBQUFBLG1GQUFKLEVBQUk7QUFBQSw4QkFBbkRDLFNBQW1EO0FBQUEsUUFBbkRBLFNBQW1ELCtCQUF2QyxnQkFBdUM7QUFBQSw0QkFBckJDLE9BQXFCO0FBQUEsUUFBckJBLE9BQXFCLDZCQUFYLEVBQVc7O0FBQUE7O0FBQzdEQSxXQUFPLEdBQUdDLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjRixPQUFkLEVBQXVCO0FBQUVMLHFCQUFlLEVBQWZBO0FBQUYsS0FBdkIsQ0FBVjtBQUNBLDhCQUFNO0FBQUVJLGVBQVMsRUFBVEEsU0FBRjtBQUFhQyxhQUFPLEVBQVBBO0FBQWIsS0FBTjs7QUFDQSxRQUFJLENBQUMsTUFBS0QsU0FBTCxDQUFlSSxNQUFwQixFQUE0QjtBQUFFO0FBQVM7O0FBRXZDLFVBQUtDLElBQUwsR0FBWTtBQUNSQyxXQUFLLFlBQUssTUFBS04sU0FBTCxDQUFlTyxJQUFmLENBQW9CLFdBQXBCLENBQUwsa0JBQTZDQyx5REFBN0MsY0FERztBQUVSQyxTQUFHLFlBQUssTUFBS1QsU0FBTCxDQUFlTyxJQUFmLENBQW9CLFdBQXBC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QyxNQUE3QztBQUNBbUMsU0FBQyxDQUFDMEIsYUFBRixDQUFnQnZFLFlBQWhCLENBQTZCRCxPQUE3QixDQUFxQyxNQUFyQyxFQUE2Q08sU0FBN0M7QUFDSCxPQVJEO0FBVUEsV0FBSzNCLFNBQUwsQ0FBZWlFLFFBQWYsQ0FBd0IsYUFBeEIsRUFBdUMsU0FBdkMsRUFBa0QsVUFBQ0MsQ0FBRCxFQUFPO0FBQ3JELFlBQUk1QyxNQUFNLEdBQUdQLDZDQUFDLENBQUNtRCxDQUFDLENBQUNDLGFBQUgsQ0FBZDs7QUFDQSxjQUFJLENBQUN6RCxRQUFMLENBQWNtRixNQUFkOztBQUNBdkUsY0FBTSxDQUFDd0UsV0FBUCxDQUFtQixlQUFuQjtBQUNILE9BSkQ7QUFLSDs7OztFQTdLa0NDLHdEOzs7QUFnTGhDLElBQUlDLFFBQVEsR0FBRyxJQUFJakcsU0FBSixFQUFmIiwiZmlsZSI6Ii4vYXBwL3BhZ2VzL3BhZ2UvbWVkaWEuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IHJlcXVlc3QgZnJvbSAnLi4vLi4vdXRpbHMvcmVxdWVzdCc7XG5pbXBvcnQgRmlsZXNGaWVsZCwgeyBVcmlUb01hcmtkb3duIH0gZnJvbSAnLi4vLi4vZm9ybXMvZmllbGRzL2ZpbGVzJztcbmltcG9ydCB7IGNvbmZpZywgdHJhbnNsYXRpb25zIH0gZnJvbSAnZ3Jhdi1jb25maWcnO1xuaW1wb3J0IHsgSW5zdGFuY2UgYXMgRWRpdG9yIH0gZnJvbSAnLi4vLi4vZm9ybXMvZmllbGRzL2VkaXRvcic7XG5pbXBvcnQgU29ydGFibGUgZnJvbSAnc29ydGFibGVqcyc7XG5cbmNvbnN0IHByZXZpZXdUZW1wbGF0ZSA9IGBcbiAgICA8ZGl2IGNsYXNzPVwiZHotcHJldmlldyBkei1maWxlLXByZXZpZXdcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkei1kZXRhaWxzXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkei1maWxlbmFtZVwiPjxzcGFuIGRhdGEtZHotbmFtZT48L3NwYW4+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkei1zaXplXCIgZGF0YS1kei1zaXplPjwvZGl2PlxuICAgICAgICA8aW1nIGRhdGEtZHotdGh1bWJuYWlsIC8+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkei1wcm9ncmVzc1wiPjxzcGFuIGNsYXNzPVwiZHotdXBsb2FkXCIgZGF0YS1kei11cGxvYWRwcm9ncmVzcz48L3NwYW4+PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZHotc3VjY2Vzcy1tYXJrXCI+PHNwYW4+4pyUPC9zcGFuPjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImR6LWVycm9yLW1hcmtcIj48c3Bhbj7inJg8L3NwYW4+PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZHotZXJyb3ItbWVzc2FnZVwiPjxzcGFuIGRhdGEtZHotZXJyb3JtZXNzYWdlPjwvc3Bhbj48L2Rpdj5cbiAgICAgIDxhIGNsYXNzPVwiZHotcmVtb3ZlXCIgdGl0bGU9XCIke3RyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uREVMRVRFfVwiIGhyZWY9XCJqYXZhc2NyaXB0OnVuZGVmaW5lZDtcIiBkYXRhLWR6LXJlbW92ZT4ke3RyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uREVMRVRFfTwvYT5cbiAgICAgIDxhIGNsYXNzPVwiZHotbWV0YWRhdGFcIiB0aXRsZT1cIiR7dHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5NRVRBREFUQX1cIiBocmVmPVwiI1wiIHRhcmdldD1cIl9ibGFua1wiIGRhdGEtZHotbWV0YWRhdGE+JHt0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLk1FVEFEQVRBfTwvYT5cbiAgICAgIDxhIGNsYXNzPVwiZHotdmlld1wiIHRpdGxlPVwiJHt0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLlZJRVd9XCIgaHJlZj1cIiNcIiB0YXJnZXQ9XCJfYmxhbmtcIiBkYXRhLWR6LXZpZXc+JHt0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLlZJRVd9PC9hPlxuICAgICAgPGEgY2xhc3M9XCJkei1pbnNlcnRcIiB0aXRsZT1cIiR7dHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5JTlNFUlR9XCIgaHJlZj1cImphdmFzY3JpcHQ6dW5kZWZpbmVkO1wiIGRhdGEtZHotaW5zZXJ0PiR7dHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5JTlNFUlR9PC9hPlxuICAgIDwvZGl2PmAudHJpbSgpO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQYWdlTWVkaWEgZXh0ZW5kcyBGaWxlc0ZpZWxkIHtcbiAgICBjb25zdHJ1Y3Rvcih7IGNvbnRhaW5lciA9ICcjZ3Jhdi1kcm9wem9uZScsIG9wdGlvbnMgPSB7fSB9ID0ge30pIHtcbiAgICAgICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24ob3B0aW9ucywgeyBwcmV2aWV3VGVtcGxhdGUgfSk7XG4gICAgICAgIHN1cGVyKHsgY29udGFpbmVyLCBvcHRpb25zIH0pO1xuICAgICAgICBpZiAoIXRoaXMuY29udGFpbmVyLmxlbmd0aCkgeyByZXR1cm47IH1cblxuICAgICAgICB0aGlzLnVybHMgPSB7XG4gICAgICAgICAgICBmZXRjaDogYCR7dGhpcy5jb250YWluZXIuZGF0YSgnbWVkaWEtdXJsJyl9L3Rhc2ske2NvbmZpZy5wYXJhbV9zZXB9bGlzdG1lZGlhYCxcbiAgICAgICAgICAgIGFkZDogYCR7dGhpcy5jb250YWluZXIuZGF0YSgnbWVkaWEtdXJsJyl9L3Rhc2ske2NvbmZpZy5wYXJhbV9zZXB9YWRkbWVkaWFgLFxuICAgICAgICAgICAgZGVsZXRlOiBgJHt0aGlzLmNvbnRhaW5lci5kYXRhKCdtZWRpYS11cmwnKX0vdGFzayR7Y29uZmlnLnBhcmFtX3NlcH1kZWxtZWRpYWBcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmRyb3B6b25lLm9wdGlvbnMudXJsID0gdGhpcy51cmxzLmFkZDtcblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5mZXRjaE1lZGlhID09PSAndW5kZWZpbmVkJyB8fCB0aGlzLm9wdGlvbnMuZmV0Y2hNZWRpYSkge1xuICAgICAgICAgICAgdGhpcy5mZXRjaE1lZGlhKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5hdHRhY2hEcmFnRHJvcCA9PT0gJ3VuZGVmaW5lZCcgfHwgdGhpcy5vcHRpb25zLmF0dGFjaERyYWdEcm9wKSB7XG4gICAgICAgICAgICB0aGlzLmF0dGFjaERyYWdEcm9wKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWVsZCA9ICQoYFtuYW1lPVwiJHt0aGlzLmNvbnRhaW5lci5kYXRhKCdkcm9wem9uZS1maWVsZCcpfVwiXWApO1xuXG4gICAgICAgIGlmIChmaWVsZC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuc29ydGFibGUgPSBuZXcgU29ydGFibGUodGhpcy5jb250YWluZXIuZ2V0KDApLCB7XG4gICAgICAgICAgICAgICAgYW5pbWF0aW9uOiAxNTAsXG4gICAgICAgICAgICAgICAgLy8gZm9yY2VGYWxsYmFjazogdHJ1ZSxcbiAgICAgICAgICAgICAgICBzZXREYXRhOiAoZGF0YVRyYW5zZmVyLCB0YXJnZXQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gJCh0YXJnZXQpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdXJpID0gZW5jb2RlVVJJKHRhcmdldC5maW5kKCcuZHotZmlsZW5hbWUnKS50ZXh0KCkpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2hvcnRjb2RlID0gVXJpVG9NYXJrZG93bih1cmkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyb3B6b25lLmRpc2FibGUoKTtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmFkZENsYXNzKCdoaWRlLWJhY2tmYWNlJyk7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkID0gJ2NvcHknO1xuICAgICAgICAgICAgICAgICAgICBkYXRhVHJhbnNmZXIuc2V0RGF0YSgndGV4dCcsIHNob3J0Y29kZSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvblNvcnQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5hbWVzID0gW107XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmZpbmQoJ1tkYXRhLWR6LW5hbWVdJykuZWFjaCgoaW5kZXgsIGZpbGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgPSAkKGZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGZpbGUudGV4dCgpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzLnB1c2gobmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLnZhbChuYW1lcy5qb2luKCcsJykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZmV0Y2hNZWRpYSgpIHtcbiAgICAgICAgY29uc3Qgb3JkZXIgPSB0aGlzLmNvbnRhaW5lci5jbG9zZXN0KCcuZm9ybS1maWVsZCcpLmZpbmQoJ1tuYW1lPVwiZGF0YVtoZWFkZXJdW21lZGlhX29yZGVyXVwiXScpLnZhbCgpO1xuICAgICAgICBjb25zdCBib2R5ID0geyB1cmk6IHRoaXMuZ2V0VVJJKCksIG9yZGVyIH07XG4gICAgICAgIGxldCB1cmwgPSB0aGlzLnVybHMuZmV0Y2g7XG5cbiAgICAgICAgcmVxdWVzdCh1cmwsIHsgbWV0aG9kOiAncG9zdCcsIGJvZHkgfSwgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0cyA9IHJlc3BvbnNlLnJlc3VsdHM7XG5cbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHJlc3VsdHMpLmZvckVhY2goKG5hbWUpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IHJlc3VsdHNbbmFtZV07XG4gICAgICAgICAgICAgICAgbGV0IG1vY2sgPSB7IG5hbWUsIHNpemU6IGRhdGEuc2l6ZSwgYWNjZXB0ZWQ6IHRydWUsIGV4dHJhczogZGF0YSB9O1xuXG4gICAgICAgICAgICAgICAgdGhpcy5kcm9wem9uZS5maWxlcy5wdXNoKG1vY2spO1xuICAgICAgICAgICAgICAgIHRoaXMuZHJvcHpvbmUub3B0aW9ucy5hZGRlZGZpbGUuY2FsbCh0aGlzLmRyb3B6b25lLCBtb2NrKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRyb3B6b25lLm9wdGlvbnMudGh1bWJuYWlsLmNhbGwodGhpcy5kcm9wem9uZSwgbW9jaywgZGF0YS51cmwpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmZpbmQoJy5kei1wcmV2aWV3JykucHJvcCgnZHJhZ2dhYmxlJywgJ3RydWUnKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25Ecm9wem9uZVNlbmRpbmcoZmlsZSwgeGhyLCBmb3JtRGF0YSkge1xuICAgICAgICAvKlxuICAgICAgICAvLyBDYW5ub3QgY2FsbCBzdXBlciBiZWNhdXNlIFNhZmFyaSBhbmQgSUUgQVBJIGRvbid0IGltcGxlbWVudCBgZGVsZXRlYFxuICAgICAgICBzdXBlci5vbkRyb3B6b25lU2VuZGluZyhmaWxlLCB4aHIsIGZvcm1EYXRhKTtcbiAgICAgICAgZm9ybURhdGEuZGVsZXRlKCd0YXNrJyk7XG4gICAgICAgICovXG5cbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKCduYW1lJywgdGhpcy5vcHRpb25zLmRvdE5vdGF0aW9uIHx8IGZpbGUubmFtZSk7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnYWRtaW4tbm9uY2UnLCBjb25maWcuYWRtaW5fbm9uY2UpO1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ3VyaScsIHRoaXMuZ2V0VVJJKCkpO1xuICAgIH1cblxuICAgIG9uRHJvcHpvbmVDb21wbGV0ZShmaWxlKSB7XG4gICAgICAgIHN1cGVyLm9uRHJvcHpvbmVDb21wbGV0ZShmaWxlKTtcbiAgICAgICAgdGhpcy5zb3J0YWJsZS5vcHRpb25zLm9uU29ydCgpO1xuXG4gICAgICAgIC8vIGFjY2VwdGVkXG4gICAgICAgICQoJy5kei1wcmV2aWV3JykucHJvcCgnZHJhZ2dhYmxlJywgJ3RydWUnKTtcbiAgICB9XG5cbiAgICBvbkRyb3B6b25lUmVtb3ZlZEZpbGUoZmlsZSwgLi4uZXh0cmEpIHtcbiAgICAgICAgc3VwZXIub25Ecm9wem9uZVJlbW92ZWRGaWxlKGZpbGUsIC4uLmV4dHJhKTtcbiAgICAgICAgdGhpcy5zb3J0YWJsZS5vcHRpb25zLm9uU29ydCgpO1xuICAgIH1cblxuICAgIGF0dGFjaERyYWdEcm9wKCkge1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5kZWxlZ2F0ZSgnW2RhdGEtZHotaW5zZXJ0XScsICdjbGljaycsIChlKSA9PiB7XG4gICAgICAgICAgICBsZXQgdGFyZ2V0ID0gJChlLmN1cnJlbnRUYXJnZXQpLnBhcmVudCgnLmR6LXByZXZpZXcnKS5maW5kKCcuZHotZmlsZW5hbWUnKTtcbiAgICAgICAgICAgIGxldCBlZGl0b3IgPSBFZGl0b3IuZWRpdG9ycy5maWx0ZXIoKGluZGV4LCBlZGl0b3IpID0+ICQoZWRpdG9yKS5hdHRyKCduYW1lJykgPT09ICdkYXRhW2NvbnRlbnRdJyk7XG5cbiAgICAgICAgICAgIGlmIChlZGl0b3IubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZWRpdG9yID0gZWRpdG9yLmRhdGEoJ2NvZGVtaXJyb3InKTtcbiAgICAgICAgICAgICAgICBlZGl0b3IuZm9jdXMoKTtcblxuICAgICAgICAgICAgICAgIGxldCBmaWxlbmFtZSA9IGVuY29kZVVSSSh0YXJnZXQudGV4dCgpKTtcbiAgICAgICAgICAgICAgICBsZXQgc2hvcnRjb2RlID0gVXJpVG9NYXJrZG93bihmaWxlbmFtZSk7XG4gICAgICAgICAgICAgICAgZWRpdG9yLmRvYy5yZXBsYWNlU2VsZWN0aW9uKHNob3J0Y29kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY29udGFpbmVyLmRlbGVnYXRlKCdbZGF0YS1kei12aWV3XScsICdtb3VzZWVudGVyJywgKGUpID0+IHtcbiAgICAgICAgICAgIGxldCB0YXJnZXQgPSAkKGUuY3VycmVudFRhcmdldCk7XG4gICAgICAgICAgICBsZXQgZmlsZSA9IHRhcmdldC5wYXJlbnQoJy5kei1wcmV2aWV3JykuZmluZCgnLmR6LWZpbGVuYW1lJyk7XG4gICAgICAgICAgICBsZXQgZmlsZW5hbWUgPSBlbmNvZGVVUkkoZmlsZS50ZXh0KCkpO1xuICAgICAgICAgICAgbGV0IFVSTCA9IHRhcmdldC5jbG9zZXN0KCdbZGF0YS1tZWRpYS1wYXRoXScpLmRhdGEoJ21lZGlhLXBhdGgnKTtcbiAgICAgICAgICAgIGxldCBvcmlnaW5hbCA9IHRoaXMuZHJvcHpvbmUuZmlsZXMuZmlsdGVyKChmaWxlKSA9PiBlbmNvZGVVUkkoZmlsZS5uYW1lKSA9PT0gZmlsZW5hbWUpLnNoaWZ0KCk7XG5cbiAgICAgICAgICAgIG9yaWdpbmFsID0gb3JpZ2luYWwgJiYgKChvcmlnaW5hbC5leHRyYXMgJiYgb3JpZ2luYWwuZXh0cmFzLm9yaWdpbmFsKSB8fCBlbmNvZGVVUkkob3JpZ2luYWwubmFtZSkpO1xuXG4gICAgICAgICAgICB0YXJnZXQuYXR0cignaHJlZicsIGAke1VSTH0vJHtvcmlnaW5hbH1gKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jb250YWluZXIuZGVsZWdhdGUoJ1tkYXRhLWR6LW1ldGFkYXRhXScsICdjbGljaycsIChlKSA9PiB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSAkKGUuY3VycmVudFRhcmdldCk7XG4gICAgICAgICAgICBjb25zdCBmaWxlID0gdGFyZ2V0LnBhcmVudCgnLmR6LXByZXZpZXcnKS5maW5kKCcuZHotZmlsZW5hbWUnKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVuYW1lID0gZW5jb2RlVVJJKGZpbGUudGV4dCgpKTtcblxuICAgICAgICAgICAgbGV0IGZpbGVPYmogPSB0aGlzLmRyb3B6b25lLmZpbGVzLmZpbHRlcigoZmlsZSkgPT4gZmlsZS5uYW1lID09PSBnbG9iYWwuZGVjb2RlVVJJKGZpbGVuYW1lKSkuc2hpZnQoKSB8fCB7fTtcblxuICAgICAgICAgICAgaWYgKCFmaWxlT2JqLmV4dHJhcykge1xuICAgICAgICAgICAgICAgIGZpbGVPYmouZXh0cmFzID0geyBtZXRhZGF0YTogW10gfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmlsZU9iai5leHRyYXMubWV0YWRhdGEpICYmICFmaWxlT2JqLmV4dHJhcy5tZXRhZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBmaWxlT2JqLmV4dHJhcy5tZXRhZGF0YSA9IHsgJyc6IGAke2dsb2JhbC5kZWNvZGVVUkkoZmlsZW5hbWUpfS5tZXRhLnlhbWwgZG9lc24ndCBleGlzdGAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZmlsZU9iaiA9IGZpbGVPYmouZXh0cmFzO1xuXG4gICAgICAgICAgICBjb25zdCBtb2RhbF9lbGVtZW50ID0gJCgnYm9keScpLmZpbmQoJ1tkYXRhLXJlbW9kYWwtaWQ9XCJtZXRhZGF0YVwiXScpO1xuICAgICAgICAgICAgY29uc3QgbW9kYWwgPSAkLnJlbW9kYWwubG9va3VwW21vZGFsX2VsZW1lbnQuZGF0YSgncmVtb2RhbCcpXTtcblxuICAgICAgICAgICAgbW9kYWxfZWxlbWVudC5maW5kKCdoMSBzdHJvbmcnKS5odG1sKGZpbGVuYW1lKTtcbiAgICAgICAgICAgIGlmIChmaWxlT2JqLnVybCkge1xuICAgICAgICAgICAgICAgIG1vZGFsX2VsZW1lbnQuZmluZCgnLm1ldGEtcHJldmlldycpLmh0bWwoYDxpbWcgc3JjPVwiJHtmaWxlT2JqLnVybH1cIiAvPmApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSBtb2RhbF9lbGVtZW50LmZpbmQoJy5tZXRhLWNvbnRlbnQnKS5odG1sKCc8dWwgLz4nKS5maW5kKCd1bCcpO1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoZmlsZU9iai5tZXRhZGF0YSkuZm9yRWFjaCgobWV0YSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmQoYDxsaT48c3Ryb25nPiR7bWV0YSA/IG1ldGEgKyAnOicgOiAnJ308L3N0cm9uZz4gJHtmaWxlT2JqLm1ldGFkYXRhW21ldGFdfTwvbGk+YCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgbW9kYWwub3BlbigpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNvbnRhaW5lci5kZWxlZ2F0ZSgnLmR6LXByZXZpZXcnLCAnZHJhZ3N0YXJ0JywgKGUpID0+IHtcbiAgICAgICAgICAgIGxldCB0YXJnZXQgPSAkKGUuY3VycmVudFRhcmdldCk7XG4gICAgICAgICAgICBsZXQgdXJpID0gZW5jb2RlVVJJKHRhcmdldC5maW5kKCcuZHotZmlsZW5hbWUnKS50ZXh0KCkpO1xuICAgICAgICAgICAgbGV0IHNob3J0Y29kZSA9IFVyaVRvTWFya2Rvd24odXJpKTtcbiAgICAgICAgICAgIHRoaXMuZHJvcHpvbmUuZGlzYWJsZSgpO1xuICAgICAgICAgICAgdGFyZ2V0LmFkZENsYXNzKCdoaWRlLWJhY2tmYWNlJyk7XG4gICAgICAgICAgICBlLm9yaWdpbmFsRXZlbnQuZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQgPSAnY29weSc7XG4gICAgICAgICAgICBlLm9yaWdpbmFsRXZlbnQuZGF0YVRyYW5zZmVyLnNldERhdGEoJ3RleHQnLCBzaG9ydGNvZGUpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNvbnRhaW5lci5kZWxlZ2F0ZSgnLmR6LXByZXZpZXcnLCAnZHJhZ2VuZCcsIChlKSA9PiB7XG4gICAgICAgICAgICBsZXQgdGFyZ2V0ID0gJChlLmN1cnJlbnRUYXJnZXQpO1xuICAgICAgICAgICAgdGhpcy5kcm9wem9uZS5lbmFibGUoKTtcbiAgICAgICAgICAgIHRhcmdldC5yZW1vdmVDbGFzcygnaGlkZS1iYWNrZmFjZScpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbmV4cG9ydCBsZXQgSW5zdGFuY2UgPSBuZXcgUGFnZU1lZGlhKCk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./app/pages/page/media.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ PageMedia),\n/* harmony export */ \"Instance\": () => (/* binding */ Instance)\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils_request__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils/request */ \"./app/utils/request.js\");\n/* harmony import */ var _forms_fields_files__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../forms/fields/files */ \"./app/forms/fields/files.js\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! grav-config */ \"grav-config\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(grav_config__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _forms_fields_editor__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../forms/fields/editor */ \"./app/forms/fields/editor.js\");\n/* harmony import */ var sortablejs__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! sortablejs */ \"./node_modules/sortablejs/modular/sortable.esm.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _get(target, property, receiver) { if (typeof Reflect !== \"undefined\" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); }\n\nfunction _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\n\n\nvar previewTemplate = \"\\n \").trim();\n\nvar PageMedia = /*#__PURE__*/function (_FilesField) {\n _inherits(PageMedia, _FilesField);\n\n var _super = _createSuper(PageMedia);\n\n function PageMedia() {\n var _this;\n\n var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n _ref$container = _ref.container,\n container = _ref$container === void 0 ? '#grav-dropzone' : _ref$container,\n _ref$options = _ref.options,\n options = _ref$options === void 0 ? {} : _ref$options;\n\n _classCallCheck(this, PageMedia);\n\n options = Object.assign(options, {\n previewTemplate: previewTemplate\n });\n _this = _super.call(this, {\n container: container,\n options: options\n });\n\n if (!_this.container.length) {\n return _possibleConstructorReturn(_this);\n }\n\n _this.urls = {\n fetch: \"\".concat(_this.container.data('media-url'), \"/task\").concat(grav_config__WEBPACK_IMPORTED_MODULE_3__.config.param_sep, \"listmedia\"),\n add: \"\".concat(_this.container.data('media-url'), \"/task\").concat(grav_config__WEBPACK_IMPORTED_MODULE_3__.config.param_sep, \"addmedia\"),\n \"delete\": \"\".concat(_this.container.data('media-url'), \"/task\").concat(grav_config__WEBPACK_IMPORTED_MODULE_3__.config.param_sep, \"delmedia\")\n };\n _this.dropzone.options.url = _this.urls.add;\n\n if (typeof _this.options.fetchMedia === 'undefined' || _this.options.fetchMedia) {\n _this.fetchMedia();\n }\n\n if (typeof _this.options.attachDragDrop === 'undefined' || _this.options.attachDragDrop) {\n _this.attachDragDrop();\n }\n\n var field = jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"[name=\\\"\".concat(_this.container.data('dropzone-field'), \"\\\"]\"));\n\n if (field.length) {\n _this.sortable = new sortablejs__WEBPACK_IMPORTED_MODULE_5__.default(_this.container.get(0), {\n animation: 150,\n // forceFallback: true,\n setData: function setData(dataTransfer, target) {\n target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(target);\n var uri = encodeURI(target.find('.dz-filename').text());\n var shortcode = (0,_forms_fields_files__WEBPACK_IMPORTED_MODULE_2__.UriToMarkdown)(uri);\n\n _this.dropzone.disable();\n\n target.addClass('hide-backface');\n dataTransfer.effectAllowed = 'copy';\n dataTransfer.setData('text', shortcode);\n },\n onSort: function onSort() {\n var names = [];\n\n _this.container.find('[data-dz-name]').each(function (index, file) {\n file = jquery__WEBPACK_IMPORTED_MODULE_0___default()(file);\n var name = file.text().trim();\n names.push(name);\n });\n\n field.val(names.join(','));\n }\n });\n }\n\n return _this;\n }\n\n _createClass(PageMedia, [{\n key: \"fetchMedia\",\n value: function fetchMedia() {\n var _this2 = this;\n\n var order = this.container.closest('.form-field').find('[name=\"data[header][media_order]\"]').val();\n var body = {\n uri: this.getURI(),\n order: order\n };\n var url = this.urls.fetch;\n (0,_utils_request__WEBPACK_IMPORTED_MODULE_1__.default)(url, {\n method: 'post',\n body: body\n }, function (response) {\n var results = response.results;\n Object.keys(results).forEach(function (name) {\n var data = results[name];\n var mock = {\n name: name,\n size: data.size,\n accepted: true,\n extras: data\n };\n\n _this2.dropzone.files.push(mock);\n\n _this2.dropzone.options.addedfile.call(_this2.dropzone, mock);\n\n _this2.dropzone.options.thumbnail.call(_this2.dropzone, mock, data.url);\n });\n\n _this2.container.find('.dz-preview').prop('draggable', 'true');\n });\n }\n }, {\n key: \"onDropzoneSending\",\n value: function onDropzoneSending(file, xhr, formData) {\n /*\n // Cannot call super because Safari and IE API don't implement `delete`\n super.onDropzoneSending(file, xhr, formData);\n formData.delete('task');\n */\n formData.append('name', this.options.dotNotation || file.name);\n formData.append('admin-nonce', grav_config__WEBPACK_IMPORTED_MODULE_3__.config.admin_nonce);\n formData.append('uri', this.getURI());\n }\n }, {\n key: \"onDropzoneComplete\",\n value: function onDropzoneComplete(file) {\n _get(_getPrototypeOf(PageMedia.prototype), \"onDropzoneComplete\", this).call(this, file);\n\n if (this.sortable) {\n this.sortable.options.onSort();\n } // accepted\n\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.dz-preview').prop('draggable', 'true');\n }\n }, {\n key: \"onDropzoneRemovedFile\",\n value: function onDropzoneRemovedFile(file) {\n var _get2;\n\n for (var _len = arguments.length, extra = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n extra[_key - 1] = arguments[_key];\n }\n\n (_get2 = _get(_getPrototypeOf(PageMedia.prototype), \"onDropzoneRemovedFile\", this)).call.apply(_get2, [this, file].concat(extra));\n\n if (this.sortable) {\n this.sortable.options.onSort();\n }\n }\n }, {\n key: \"attachDragDrop\",\n value: function attachDragDrop() {\n var _this3 = this;\n\n this.container.delegate('[data-dz-insert]', 'click', function (e) {\n var target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(e.currentTarget).parent('.dz-preview').find('.dz-filename');\n var editor = _forms_fields_editor__WEBPACK_IMPORTED_MODULE_4__.Instance.editors.filter(function (index, editor) {\n return jquery__WEBPACK_IMPORTED_MODULE_0___default()(editor).attr('name') === 'data[content]';\n });\n\n if (editor.length) {\n editor = editor.data('codemirror');\n editor.focus();\n var filename = encodeURI(target.text());\n var shortcode = (0,_forms_fields_files__WEBPACK_IMPORTED_MODULE_2__.UriToMarkdown)(filename);\n editor.doc.replaceSelection(shortcode);\n }\n });\n this.container.delegate('[data-dz-view]', 'mouseenter', function (e) {\n var target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(e.currentTarget);\n var file = target.parent('.dz-preview').find('.dz-filename');\n var filename = encodeURI(file.text());\n var URL = target.closest('[data-media-path]').data('media-path');\n\n var original = _this3.dropzone.files.filter(function (file) {\n return encodeURI(file.name) === filename;\n }).shift();\n\n original = original && (original.extras && original.extras.original || encodeURI(original.name));\n target.attr('href', \"\".concat(URL, \"/\").concat(original));\n });\n this.container.delegate('[data-dz-metadata]', 'click', function (e) {\n e.preventDefault();\n var target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(e.currentTarget);\n var file = target.parent('.dz-preview').find('.dz-filename');\n var filename = encodeURI(file.text());\n var fileObj = _this3.dropzone.files.filter(function (file) {\n return file.name === __webpack_require__.g.decodeURI(filename);\n }).shift() || {};\n\n if (!fileObj.extras) {\n fileObj.extras = {\n metadata: []\n };\n }\n\n if (Array.isArray(fileObj.extras.metadata) && !fileObj.extras.metadata.length) {\n fileObj.extras.metadata = {\n '': \"\".concat(__webpack_require__.g.decodeURI(filename), \".meta.yaml doesn't exist\")\n };\n }\n\n fileObj = fileObj.extras;\n var modal_element = jquery__WEBPACK_IMPORTED_MODULE_0___default()('body').find('[data-remodal-id=\"metadata\"]');\n var modal = (jquery__WEBPACK_IMPORTED_MODULE_0___default().remodal.lookup)[modal_element.data('remodal')];\n modal_element.find('h1 strong').html(filename);\n\n if (fileObj.url) {\n modal_element.find('.meta-preview').html(\"\"));\n }\n\n var container = modal_element.find('.meta-content').html('
              ').find('ul');\n Object.keys(fileObj.metadata).forEach(function (meta) {\n container.append(\"
            • \".concat(meta ? meta + ':' : '', \" \").concat(fileObj.metadata[meta], \"
            • \"));\n });\n modal.open();\n });\n this.container.delegate('.dz-preview', 'dragstart', function (e) {\n var target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(e.currentTarget);\n var uri = encodeURI(target.find('.dz-filename').text());\n var shortcode = (0,_forms_fields_files__WEBPACK_IMPORTED_MODULE_2__.UriToMarkdown)(uri);\n\n _this3.dropzone.disable();\n\n target.addClass('hide-backface');\n e.originalEvent.dataTransfer.effectAllowed = 'copy';\n e.originalEvent.dataTransfer.setData('text', shortcode);\n });\n this.container.delegate('.dz-preview', 'dragend', function (e) {\n var target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(e.currentTarget);\n\n _this3.dropzone.enable();\n\n target.removeClass('hide-backface');\n });\n }\n }]);\n\n return PageMedia;\n}(_forms_fields_files__WEBPACK_IMPORTED_MODULE_2__.default);\n\n\nvar Instance = new PageMedia();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL3BhZ2VzL3BhZ2UvbWVkaWEuanM/ZTlhMiJdLCJuYW1lcyI6WyJwcmV2aWV3VGVtcGxhdGUiLCJ0cmFuc2xhdGlvbnMiLCJ0cmltIiwiUGFnZU1lZGlhIiwiY29udGFpbmVyIiwib3B0aW9ucyIsIk9iamVjdCIsImFzc2lnbiIsImxlbmd0aCIsInVybHMiLCJmZXRjaCIsImRhdGEiLCJjb25maWciLCJhZGQiLCJkcm9wem9uZSIsInVybCIsImZldGNoTWVkaWEiLCJhdHRhY2hEcmFnRHJvcCIsImZpZWxkIiwiJCIsInNvcnRhYmxlIiwiU29ydGFibGUiLCJnZXQiLCJhbmltYXRpb24iLCJzZXREYXRhIiwiZGF0YVRyYW5zZmVyIiwidGFyZ2V0IiwidXJpIiwiZW5jb2RlVVJJIiwiZmluZCIsInRleHQiLCJzaG9ydGNvZGUiLCJVcmlUb01hcmtkb3duIiwiZGlzYWJsZSIsImFkZENsYXNzIiwiZWZmZWN0QWxsb3dlZCIsIm9uU29ydCIsIm5hbWVzIiwiZWFjaCIsImluZGV4IiwiZmlsZSIsIm5hbWUiLCJwdXNoIiwidmFsIiwiam9pbiIsIm9yZGVyIiwiY2xvc2VzdCIsImJvZHkiLCJnZXRVUkkiLCJyZXF1ZXN0IiwibWV0aG9kIiwicmVzcG9uc2UiLCJyZXN1bHRzIiwia2V5cyIsImZvckVhY2giLCJtb2NrIiwic2l6ZSIsImFjY2VwdGVkIiwiZXh0cmFzIiwiZmlsZXMiLCJhZGRlZGZpbGUiLCJjYWxsIiwidGh1bWJuYWlsIiwicHJvcCIsInhociIsImZvcm1EYXRhIiwiYXBwZW5kIiwiZG90Tm90YXRpb24iLCJleHRyYSIsImRlbGVnYXRlIiwiZSIsImN1cnJlbnRUYXJnZXQiLCJwYXJlbnQiLCJlZGl0b3IiLCJFZGl0b3IiLCJhdHRyIiwiZm9jdXMiLCJmaWxlbmFtZSIsImRvYyIsInJlcGxhY2VTZWxlY3Rpb24iLCJVUkwiLCJvcmlnaW5hbCIsImZpbHRlciIsInNoaWZ0IiwicHJldmVudERlZmF1bHQiLCJmaWxlT2JqIiwiZ2xvYmFsIiwiZGVjb2RlVVJJIiwibWV0YWRhdGEiLCJBcnJheSIsImlzQXJyYXkiLCJtb2RhbF9lbGVtZW50IiwibW9kYWwiLCJodG1sIiwibWV0YSIsIm9wZW4iLCJvcmlnaW5hbEV2ZW50IiwiZW5hYmxlIiwicmVtb3ZlQ2xhc3MiLCJGaWxlc0ZpZWxkIiwiSW5zdGFuY2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBLElBQU1BLGVBQWUsR0FBRyw0bEJBV1lDLHlFQVhaLDhEQVc2RkEseUVBWDdGLDBEQVljQSwyRUFaZCw4REFZK0ZBLDJFQVovRixzREFhVUEsdUVBYlYsMERBYW1GQSx1RUFibkYsd0RBY1lBLHlFQWRaLDhEQWM2RkEseUVBZDdGLHNCQWVaQyxJQWZZLEVBQXhCOztJQWlCcUJDLFM7Ozs7O0FBQ2pCLHVCQUFpRTtBQUFBOztBQUFBLG1GQUFKLEVBQUk7QUFBQSw4QkFBbkRDLFNBQW1EO0FBQUEsUUFBbkRBLFNBQW1ELCtCQUF2QyxnQkFBdUM7QUFBQSw0QkFBckJDLE9BQXFCO0FBQUEsUUFBckJBLE9BQXFCLDZCQUFYLEVBQVc7O0FBQUE7O0FBQzdEQSxXQUFPLEdBQUdDLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjRixPQUFkLEVBQXVCO0FBQUVMLHFCQUFlLEVBQWZBO0FBQUYsS0FBdkIsQ0FBVjtBQUNBLDhCQUFNO0FBQUVJLGVBQVMsRUFBVEEsU0FBRjtBQUFhQyxhQUFPLEVBQVBBO0FBQWIsS0FBTjs7QUFDQSxRQUFJLENBQUMsTUFBS0QsU0FBTCxDQUFlSSxNQUFwQixFQUE0QjtBQUFFO0FBQVM7O0FBRXZDLFVBQUtDLElBQUwsR0FBWTtBQUNSQyxXQUFLLFlBQUssTUFBS04sU0FBTCxDQUFlTyxJQUFmLENBQW9CLFdBQXBCLENBQUwsa0JBQTZDQyx5REFBN0MsY0FERztBQUVSQyxTQUFHLFlBQUssTUFBS1QsU0FBTCxDQUFlTyxJQUFmLENBQW9CLFdBQXBCLENBQUwsa0JBQTZDQyx5REFBN0MsYUFGSztBQUdSLDBCQUFXLE1BQUtSLFNBQUwsQ0FBZU8sSUFBZixDQUFvQixXQUFwQixDQUFYLGtCQUFtREMseURBQW5EO0FBSFEsS0FBWjtBQU1BLFVBQUtFLFFBQUwsQ0FBY1QsT0FBZCxDQUFzQlUsR0FBdEIsR0FBNEIsTUFBS04sSUFBTCxDQUFVSSxHQUF0Qzs7QUFFQSxRQUFJLE9BQU8sTUFBS1IsT0FBTCxDQUFhVyxVQUFwQixLQUFtQyxXQUFuQyxJQUFrRCxNQUFLWCxPQUFMLENBQWFXLFVBQW5FLEVBQStFO0FBQzNFLFlBQUtBLFVBQUw7QUFDSDs7QUFFRCxRQUFJLE9BQU8sTUFBS1gsT0FBTCxDQUFhWSxjQUFwQixLQUF1QyxXQUF2QyxJQUFzRCxNQUFLWixPQUFMLENBQWFZLGNBQXZFLEVBQXVGO0FBQ25GLFlBQUtBLGNBQUw7QUFDSDs7QUFFRCxRQUFNQyxLQUFLLEdBQUdDLDZDQUFDLG1CQUFXLE1BQUtmLFNBQUwsQ0FBZU8sSUFBZixDQUFvQixnQkFBcEIsQ0FBWCxTQUFmOztBQUVBLFFBQUlPLEtBQUssQ0FBQ1YsTUFBVixFQUFrQjtBQUNkLFlBQUtZLFFBQUwsR0FBZ0IsSUFBSUMsK0NBQUosQ0FBYSxNQUFLakIsU0FBTCxDQUFla0IsR0FBZixDQUFtQixDQUFuQixDQUFiLEVBQW9DO0FBQ2hEQyxpQkFBUyxFQUFFLEdBRHFDO0FBRWhEO0FBQ0FDLGVBQU8sRUFBRSxpQkFBQ0MsWUFBRCxFQUFlQyxNQUFmLEVBQTBCO0FBQy9CQSxnQkFBTSxHQUFHUCw2Q0FBQyxDQUFDTyxNQUFELENBQVY7QUFDQSxjQUFJQyxHQUFHLEdBQUdDLFNBQVMsQ0FBQ0YsTUFBTSxDQUFDRyxJQUFQLENBQVksY0FBWixFQUE0QkMsSUFBNUIsRUFBRCxDQUFuQjtBQUNBLGNBQUlDLFNBQVMsR0FBR0Msa0VBQWEsQ0FBQ0wsR0FBRCxDQUE3Qjs7QUFDQSxnQkFBS2IsUUFBTCxDQUFjbUIsT0FBZDs7QUFDQVAsZ0JBQU0sQ0FBQ1EsUUFBUCxDQUFnQixlQUFoQjtBQUNBVCxzQkFBWSxDQUFDVSxhQUFiLEdBQTZCLE1BQTdCO0FBQ0FWLHNCQUFZLENBQUNELE9BQWIsQ0FBcUIsTUFBckIsRUFBNkJPLFNBQTdCO0FBQ0gsU0FYK0M7QUFZaERLLGNBQU0sRUFBRSxrQkFBTTtBQUNWLGNBQUlDLEtBQUssR0FBRyxFQUFaOztBQUNBLGdCQUFLakMsU0FBTCxDQUFleUIsSUFBZixDQUFvQixnQkFBcEIsRUFBc0NTLElBQXRDLENBQTJDLFVBQUNDLEtBQUQsRUFBUUMsSUFBUixFQUFpQjtBQUN4REEsZ0JBQUksR0FBR3JCLDZDQUFDLENBQUNxQixJQUFELENBQVI7QUFDQSxnQkFBTUMsSUFBSSxHQUFHRCxJQUFJLENBQUNWLElBQUwsR0FBWTVCLElBQVosRUFBYjtBQUNBbUMsaUJBQUssQ0FBQ0ssSUFBTixDQUFXRCxJQUFYO0FBQ0gsV0FKRDs7QUFNQXZCLGVBQUssQ0FBQ3lCLEdBQU4sQ0FBVU4sS0FBSyxDQUFDTyxJQUFOLENBQVcsR0FBWCxDQUFWO0FBQ0g7QUFyQitDLE9BQXBDLENBQWhCO0FBdUJIOztBQS9DNEQ7QUFnRGhFOzs7O1dBRUQsc0JBQWE7QUFBQTs7QUFDVCxVQUFNQyxLQUFLLEdBQUcsS0FBS3pDLFNBQUwsQ0FBZTBDLE9BQWYsQ0FBdUIsYUFBdkIsRUFBc0NqQixJQUF0QyxDQUEyQyxvQ0FBM0MsRUFBaUZjLEdBQWpGLEVBQWQ7QUFDQSxVQUFNSSxJQUFJLEdBQUc7QUFBRXBCLFdBQUcsRUFBRSxLQUFLcUIsTUFBTCxFQUFQO0FBQXNCSCxhQUFLLEVBQUxBO0FBQXRCLE9BQWI7QUFDQSxVQUFJOUIsR0FBRyxHQUFHLEtBQUtOLElBQUwsQ0FBVUMsS0FBcEI7QUFFQXVDLDZEQUFPLENBQUNsQyxHQUFELEVBQU07QUFBRW1DLGNBQU0sRUFBRSxNQUFWO0FBQWtCSCxZQUFJLEVBQUpBO0FBQWxCLE9BQU4sRUFBZ0MsVUFBQ0ksUUFBRCxFQUFjO0FBQ2pELFlBQUlDLE9BQU8sR0FBR0QsUUFBUSxDQUFDQyxPQUF2QjtBQUVBOUMsY0FBTSxDQUFDK0MsSUFBUCxDQUFZRCxPQUFaLEVBQXFCRSxPQUFyQixDQUE2QixVQUFDYixJQUFELEVBQVU7QUFDbkMsY0FBSTlCLElBQUksR0FBR3lDLE9BQU8sQ0FBQ1gsSUFBRCxDQUFsQjtBQUNBLGNBQUljLElBQUksR0FBRztBQUFFZCxnQkFBSSxFQUFKQSxJQUFGO0FBQVFlLGdCQUFJLEVBQUU3QyxJQUFJLENBQUM2QyxJQUFuQjtBQUF5QkMsb0JBQVEsRUFBRSxJQUFuQztBQUF5Q0Msa0JBQU0sRUFBRS9DO0FBQWpELFdBQVg7O0FBRUEsZ0JBQUksQ0FBQ0csUUFBTCxDQUFjNkMsS0FBZCxDQUFvQmpCLElBQXBCLENBQXlCYSxJQUF6Qjs7QUFDQSxnQkFBSSxDQUFDekMsUUFBTCxDQUFjVCxPQUFkLENBQXNCdUQsU0FBdEIsQ0FBZ0NDLElBQWhDLENBQXFDLE1BQUksQ0FBQy9DLFFBQTFDLEVBQW9EeUMsSUFBcEQ7O0FBQ0EsZ0JBQUksQ0FBQ3pDLFFBQUwsQ0FBY1QsT0FBZCxDQUFzQnlELFNBQXRCLENBQWdDRCxJQUFoQyxDQUFxQyxNQUFJLENBQUMvQyxRQUExQyxFQUFvRHlDLElBQXBELEVBQTBENUMsSUFBSSxDQUFDSSxHQUEvRDtBQUNILFNBUEQ7O0FBU0EsY0FBSSxDQUFDWCxTQUFMLENBQWV5QixJQUFmLENBQW9CLGFBQXBCLEVBQW1Da0MsSUFBbkMsQ0FBd0MsV0FBeEMsRUFBcUQsTUFBckQ7QUFDSCxPQWJNLENBQVA7QUFjSDs7O1dBRUQsMkJBQWtCdkIsSUFBbEIsRUFBd0J3QixHQUF4QixFQUE2QkMsUUFBN0IsRUFBdUM7QUFDbkM7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUVRQSxjQUFRLENBQUNDLE1BQVQsQ0FBZ0IsTUFBaEIsRUFBd0IsS0FBSzdELE9BQUwsQ0FBYThELFdBQWIsSUFBNEIzQixJQUFJLENBQUNDLElBQXpEO0FBQ0F3QixjQUFRLENBQUNDLE1BQVQsQ0FBZ0IsYUFBaEIsRUFBK0J0RCwyREFBL0I7QUFDQXFELGNBQVEsQ0FBQ0MsTUFBVCxDQUFnQixLQUFoQixFQUF1QixLQUFLbEIsTUFBTCxFQUF2QjtBQUNIOzs7V0FFRCw0QkFBbUJSLElBQW5CLEVBQXlCO0FBQ3JCLHdGQUF5QkEsSUFBekI7O0FBQ0EsVUFBSSxLQUFLcEIsUUFBVCxFQUFtQjtBQUNmLGFBQUtBLFFBQUwsQ0FBY2YsT0FBZCxDQUFzQitCLE1BQXRCO0FBQ0gsT0FKb0IsQ0FNckI7OztBQUNBakIsbURBQUMsQ0FBQyxhQUFELENBQUQsQ0FBaUI0QyxJQUFqQixDQUFzQixXQUF0QixFQUFtQyxNQUFuQztBQUNIOzs7V0FFRCwrQkFBc0J2QixJQUF0QixFQUFzQztBQUFBOztBQUFBLHdDQUFQNEIsS0FBTztBQUFQQSxhQUFPO0FBQUE7O0FBQ2xDLG1IQUE0QjVCLElBQTVCLFNBQXFDNEIsS0FBckM7O0FBQ0EsVUFBSSxLQUFLaEQsUUFBVCxFQUFtQjtBQUNmLGFBQUtBLFFBQUwsQ0FBY2YsT0FBZCxDQUFzQitCLE1BQXRCO0FBQ0g7QUFDSjs7O1dBRUQsMEJBQWlCO0FBQUE7O0FBQ2IsV0FBS2hDLFNBQUwsQ0FBZWlFLFFBQWYsQ0FBd0Isa0JBQXhCLEVBQTRDLE9BQTVDLEVBQXFELFVBQUNDLENBQUQsRUFBTztBQUN4RCxZQUFJNUMsTUFBTSxHQUFHUCw2Q0FBQyxDQUFDbUQsQ0FBQyxDQUFDQyxhQUFILENBQUQsQ0FBbUJDLE1BQW5CLENBQTBCLGFBQTFCLEVBQXlDM0MsSUFBekMsQ0FBOEMsY0FBOUMsQ0FBYjtBQUNBLFlBQUk0QyxNQUFNLEdBQUdDLHlFQUFBLENBQXNCLFVBQUNuQyxLQUFELEVBQVFrQyxNQUFSO0FBQUEsaUJBQW1CdEQsNkNBQUMsQ0FBQ3NELE1BQUQsQ0FBRCxDQUFVRSxJQUFWLENBQWUsTUFBZixNQUEyQixlQUE5QztBQUFBLFNBQXRCLENBQWI7O0FBRUEsWUFBSUYsTUFBTSxDQUFDakUsTUFBWCxFQUFtQjtBQUNmaUUsZ0JBQU0sR0FBR0EsTUFBTSxDQUFDOUQsSUFBUCxDQUFZLFlBQVosQ0FBVDtBQUNBOEQsZ0JBQU0sQ0FBQ0csS0FBUDtBQUVBLGNBQUlDLFFBQVEsR0FBR2pELFNBQVMsQ0FBQ0YsTUFBTSxDQUFDSSxJQUFQLEVBQUQsQ0FBeEI7QUFDQSxjQUFJQyxTQUFTLEdBQUdDLGtFQUFhLENBQUM2QyxRQUFELENBQTdCO0FBQ0FKLGdCQUFNLENBQUNLLEdBQVAsQ0FBV0MsZ0JBQVgsQ0FBNEJoRCxTQUE1QjtBQUNIO0FBQ0osT0FaRDtBQWNBLFdBQUszQixTQUFMLENBQWVpRSxRQUFmLENBQXdCLGdCQUF4QixFQUEwQyxZQUExQyxFQUF3RCxVQUFDQyxDQUFELEVBQU87QUFDM0QsWUFBSTVDLE1BQU0sR0FBR1AsNkNBQUMsQ0FBQ21ELENBQUMsQ0FBQ0MsYUFBSCxDQUFkO0FBQ0EsWUFBSS9CLElBQUksR0FBR2QsTUFBTSxDQUFDOEMsTUFBUCxDQUFjLGFBQWQsRUFBNkIzQyxJQUE3QixDQUFrQyxjQUFsQyxDQUFYO0FBQ0EsWUFBSWdELFFBQVEsR0FBR2pELFNBQVMsQ0FBQ1ksSUFBSSxDQUFDVixJQUFMLEVBQUQsQ0FBeEI7QUFDQSxZQUFJa0QsR0FBRyxHQUFHdEQsTUFBTSxDQUFDb0IsT0FBUCxDQUFlLG1CQUFmLEVBQW9DbkMsSUFBcEMsQ0FBeUMsWUFBekMsQ0FBVjs7QUFDQSxZQUFJc0UsUUFBUSxHQUFHLE1BQUksQ0FBQ25FLFFBQUwsQ0FBYzZDLEtBQWQsQ0FBb0J1QixNQUFwQixDQUEyQixVQUFDMUMsSUFBRDtBQUFBLGlCQUFVWixTQUFTLENBQUNZLElBQUksQ0FBQ0MsSUFBTixDQUFULEtBQXlCb0MsUUFBbkM7QUFBQSxTQUEzQixFQUF3RU0sS0FBeEUsRUFBZjs7QUFFQUYsZ0JBQVEsR0FBR0EsUUFBUSxLQUFNQSxRQUFRLENBQUN2QixNQUFULElBQW1CdUIsUUFBUSxDQUFDdkIsTUFBVCxDQUFnQnVCLFFBQXBDLElBQWlEckQsU0FBUyxDQUFDcUQsUUFBUSxDQUFDeEMsSUFBVixDQUEvRCxDQUFuQjtBQUVBZixjQUFNLENBQUNpRCxJQUFQLENBQVksTUFBWixZQUF1QkssR0FBdkIsY0FBOEJDLFFBQTlCO0FBQ0gsT0FWRDtBQVlBLFdBQUs3RSxTQUFMLENBQWVpRSxRQUFmLENBQXdCLG9CQUF4QixFQUE4QyxPQUE5QyxFQUF1RCxVQUFDQyxDQUFELEVBQU87QUFDMURBLFNBQUMsQ0FBQ2MsY0FBRjtBQUNBLFlBQU0xRCxNQUFNLEdBQUdQLDZDQUFDLENBQUNtRCxDQUFDLENBQUNDLGFBQUgsQ0FBaEI7QUFDQSxZQUFNL0IsSUFBSSxHQUFHZCxNQUFNLENBQUM4QyxNQUFQLENBQWMsYUFBZCxFQUE2QjNDLElBQTdCLENBQWtDLGNBQWxDLENBQWI7QUFDQSxZQUFNZ0QsUUFBUSxHQUFHakQsU0FBUyxDQUFDWSxJQUFJLENBQUNWLElBQUwsRUFBRCxDQUExQjtBQUVBLFlBQUl1RCxPQUFPLEdBQUcsTUFBSSxDQUFDdkUsUUFBTCxDQUFjNkMsS0FBZCxDQUFvQnVCLE1BQXBCLENBQTJCLFVBQUMxQyxJQUFEO0FBQUEsaUJBQVVBLElBQUksQ0FBQ0MsSUFBTCxLQUFjNkMscUJBQU0sQ0FBQ0MsU0FBUCxDQUFpQlYsUUFBakIsQ0FBeEI7QUFBQSxTQUEzQixFQUErRU0sS0FBL0UsTUFBMEYsRUFBeEc7O0FBRUEsWUFBSSxDQUFDRSxPQUFPLENBQUMzQixNQUFiLEVBQXFCO0FBQ2pCMkIsaUJBQU8sQ0FBQzNCLE1BQVIsR0FBaUI7QUFBRThCLG9CQUFRLEVBQUU7QUFBWixXQUFqQjtBQUNIOztBQUVELFlBQUlDLEtBQUssQ0FBQ0MsT0FBTixDQUFjTCxPQUFPLENBQUMzQixNQUFSLENBQWU4QixRQUE3QixLQUEwQyxDQUFDSCxPQUFPLENBQUMzQixNQUFSLENBQWU4QixRQUFmLENBQXdCaEYsTUFBdkUsRUFBK0U7QUFDM0U2RSxpQkFBTyxDQUFDM0IsTUFBUixDQUFlOEIsUUFBZixHQUEwQjtBQUFFLDBCQUFPRixxQkFBTSxDQUFDQyxTQUFQLENBQWlCVixRQUFqQixDQUFQO0FBQUYsV0FBMUI7QUFDSDs7QUFFRFEsZUFBTyxHQUFHQSxPQUFPLENBQUMzQixNQUFsQjtBQUVBLFlBQU1pQyxhQUFhLEdBQUd4RSw2Q0FBQyxDQUFDLE1BQUQsQ0FBRCxDQUFVVSxJQUFWLENBQWUsOEJBQWYsQ0FBdEI7QUFDQSxZQUFNK0QsS0FBSyxHQUFHekUsOERBQUEsQ0FBaUJ3RSxhQUFhLENBQUNoRixJQUFkLENBQW1CLFNBQW5CLENBQWpCLENBQWQ7QUFFQWdGLHFCQUFhLENBQUM5RCxJQUFkLENBQW1CLFdBQW5CLEVBQWdDZ0UsSUFBaEMsQ0FBcUNoQixRQUFyQzs7QUFDQSxZQUFJUSxPQUFPLENBQUN0RSxHQUFaLEVBQWlCO0FBQ2I0RSx1QkFBYSxDQUFDOUQsSUFBZCxDQUFtQixlQUFuQixFQUFvQ2dFLElBQXBDLHNCQUFzRFIsT0FBTyxDQUFDdEUsR0FBOUQ7QUFDSDs7QUFFRCxZQUFNWCxTQUFTLEdBQUd1RixhQUFhLENBQUM5RCxJQUFkLENBQW1CLGVBQW5CLEVBQW9DZ0UsSUFBcEMsQ0FBeUMsUUFBekMsRUFBbURoRSxJQUFuRCxDQUF3RCxJQUF4RCxDQUFsQjtBQUNBdkIsY0FBTSxDQUFDK0MsSUFBUCxDQUFZZ0MsT0FBTyxDQUFDRyxRQUFwQixFQUE4QmxDLE9BQTlCLENBQXNDLFVBQUN3QyxJQUFELEVBQVU7QUFDNUMxRixtQkFBUyxDQUFDOEQsTUFBVix1QkFBZ0M0QixJQUFJLEdBQUdBLElBQUksR0FBRyxHQUFWLEdBQWdCLEVBQXBELHVCQUFtRVQsT0FBTyxDQUFDRyxRQUFSLENBQWlCTSxJQUFqQixDQUFuRTtBQUNILFNBRkQ7QUFJQUYsYUFBSyxDQUFDRyxJQUFOO0FBQ0gsT0FoQ0Q7QUFrQ0EsV0FBSzNGLFNBQUwsQ0FBZWlFLFFBQWYsQ0FBd0IsYUFBeEIsRUFBdUMsV0FBdkMsRUFBb0QsVUFBQ0MsQ0FBRCxFQUFPO0FBQ3ZELFlBQUk1QyxNQUFNLEdBQUdQLDZDQUFDLENBQUNtRCxDQUFDLENBQUNDLGFBQUgsQ0FBZDtBQUNBLFlBQUk1QyxHQUFHLEdBQUdDLFNBQVMsQ0FBQ0YsTUFBTSxDQUFDRyxJQUFQLENBQVksY0FBWixFQUE0QkMsSUFBNUIsRUFBRCxDQUFuQjtBQUNBLFlBQUlDLFNBQVMsR0FBR0Msa0VBQWEsQ0FBQ0wsR0FBRCxDQUE3Qjs7QUFDQSxjQUFJLENBQUNiLFFBQUwsQ0FBY21CLE9BQWQ7O0FBQ0FQLGNBQU0sQ0FBQ1EsUUFBUCxDQUFnQixlQUFoQjtBQUNBb0MsU0FBQyxDQUFDMEIsYUFBRixDQUFnQnZFLFlBQWhCLENBQTZCVSxhQUE3QixHQUE2QyxNQUE3QztBQUNBbUMsU0FBQyxDQUFDMEIsYUFBRixDQUFnQnZFLFlBQWhCLENBQTZCRCxPQUE3QixDQUFxQyxNQUFyQyxFQUE2Q08sU0FBN0M7QUFDSCxPQVJEO0FBVUEsV0FBSzNCLFNBQUwsQ0FBZWlFLFFBQWYsQ0FBd0IsYUFBeEIsRUFBdUMsU0FBdkMsRUFBa0QsVUFBQ0MsQ0FBRCxFQUFPO0FBQ3JELFlBQUk1QyxNQUFNLEdBQUdQLDZDQUFDLENBQUNtRCxDQUFDLENBQUNDLGFBQUgsQ0FBZDs7QUFDQSxjQUFJLENBQUN6RCxRQUFMLENBQWNtRixNQUFkOztBQUNBdkUsY0FBTSxDQUFDd0UsV0FBUCxDQUFtQixlQUFuQjtBQUNILE9BSkQ7QUFLSDs7OztFQWpMa0NDLHdEOzs7QUFvTGhDLElBQUlDLFFBQVEsR0FBRyxJQUFJakcsU0FBSixFQUFmIiwiZmlsZSI6Ii4vYXBwL3BhZ2VzL3BhZ2UvbWVkaWEuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IHJlcXVlc3QgZnJvbSAnLi4vLi4vdXRpbHMvcmVxdWVzdCc7XG5pbXBvcnQgRmlsZXNGaWVsZCwgeyBVcmlUb01hcmtkb3duIH0gZnJvbSAnLi4vLi4vZm9ybXMvZmllbGRzL2ZpbGVzJztcbmltcG9ydCB7IGNvbmZpZywgdHJhbnNsYXRpb25zIH0gZnJvbSAnZ3Jhdi1jb25maWcnO1xuaW1wb3J0IHsgSW5zdGFuY2UgYXMgRWRpdG9yIH0gZnJvbSAnLi4vLi4vZm9ybXMvZmllbGRzL2VkaXRvcic7XG5pbXBvcnQgU29ydGFibGUgZnJvbSAnc29ydGFibGVqcyc7XG5cbmNvbnN0IHByZXZpZXdUZW1wbGF0ZSA9IGBcbiAgICA8ZGl2IGNsYXNzPVwiZHotcHJldmlldyBkei1maWxlLXByZXZpZXdcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkei1kZXRhaWxzXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkei1maWxlbmFtZVwiPjxzcGFuIGRhdGEtZHotbmFtZT48L3NwYW4+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkei1zaXplXCIgZGF0YS1kei1zaXplPjwvZGl2PlxuICAgICAgICA8aW1nIGRhdGEtZHotdGh1bWJuYWlsIC8+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkei1wcm9ncmVzc1wiPjxzcGFuIGNsYXNzPVwiZHotdXBsb2FkXCIgZGF0YS1kei11cGxvYWRwcm9ncmVzcz48L3NwYW4+PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZHotc3VjY2Vzcy1tYXJrXCI+PHNwYW4+4pyUPC9zcGFuPjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImR6LWVycm9yLW1hcmtcIj48c3Bhbj7inJg8L3NwYW4+PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZHotZXJyb3ItbWVzc2FnZVwiPjxzcGFuIGRhdGEtZHotZXJyb3JtZXNzYWdlPjwvc3Bhbj48L2Rpdj5cbiAgICAgIDxhIGNsYXNzPVwiZHotcmVtb3ZlXCIgdGl0bGU9XCIke3RyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uREVMRVRFfVwiIGhyZWY9XCJqYXZhc2NyaXB0OnVuZGVmaW5lZDtcIiBkYXRhLWR6LXJlbW92ZT4ke3RyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uREVMRVRFfTwvYT5cbiAgICAgIDxhIGNsYXNzPVwiZHotbWV0YWRhdGFcIiB0aXRsZT1cIiR7dHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5NRVRBREFUQX1cIiBocmVmPVwiI1wiIHRhcmdldD1cIl9ibGFua1wiIGRhdGEtZHotbWV0YWRhdGE+JHt0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLk1FVEFEQVRBfTwvYT5cbiAgICAgIDxhIGNsYXNzPVwiZHotdmlld1wiIHRpdGxlPVwiJHt0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLlZJRVd9XCIgaHJlZj1cIiNcIiB0YXJnZXQ9XCJfYmxhbmtcIiBkYXRhLWR6LXZpZXc+JHt0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLlZJRVd9PC9hPlxuICAgICAgPGEgY2xhc3M9XCJkei1pbnNlcnRcIiB0aXRsZT1cIiR7dHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5JTlNFUlR9XCIgaHJlZj1cImphdmFzY3JpcHQ6dW5kZWZpbmVkO1wiIGRhdGEtZHotaW5zZXJ0PiR7dHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5JTlNFUlR9PC9hPlxuICAgIDwvZGl2PmAudHJpbSgpO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQYWdlTWVkaWEgZXh0ZW5kcyBGaWxlc0ZpZWxkIHtcbiAgICBjb25zdHJ1Y3Rvcih7IGNvbnRhaW5lciA9ICcjZ3Jhdi1kcm9wem9uZScsIG9wdGlvbnMgPSB7fSB9ID0ge30pIHtcbiAgICAgICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24ob3B0aW9ucywgeyBwcmV2aWV3VGVtcGxhdGUgfSk7XG4gICAgICAgIHN1cGVyKHsgY29udGFpbmVyLCBvcHRpb25zIH0pO1xuICAgICAgICBpZiAoIXRoaXMuY29udGFpbmVyLmxlbmd0aCkgeyByZXR1cm47IH1cblxuICAgICAgICB0aGlzLnVybHMgPSB7XG4gICAgICAgICAgICBmZXRjaDogYCR7dGhpcy5jb250YWluZXIuZGF0YSgnbWVkaWEtdXJsJyl9L3Rhc2ske2NvbmZpZy5wYXJhbV9zZXB9bGlzdG1lZGlhYCxcbiAgICAgICAgICAgIGFkZDogYCR7dGhpcy5jb250YWluZXIuZGF0YSgnbWVkaWEtdXJsJyl9L3Rhc2ske2NvbmZpZy5wYXJhbV9zZXB9YWRkbWVkaWFgLFxuICAgICAgICAgICAgZGVsZXRlOiBgJHt0aGlzLmNvbnRhaW5lci5kYXRhKCdtZWRpYS11cmwnKX0vdGFzayR7Y29uZmlnLnBhcmFtX3NlcH1kZWxtZWRpYWBcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmRyb3B6b25lLm9wdGlvbnMudXJsID0gdGhpcy51cmxzLmFkZDtcblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5mZXRjaE1lZGlhID09PSAndW5kZWZpbmVkJyB8fCB0aGlzLm9wdGlvbnMuZmV0Y2hNZWRpYSkge1xuICAgICAgICAgICAgdGhpcy5mZXRjaE1lZGlhKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5hdHRhY2hEcmFnRHJvcCA9PT0gJ3VuZGVmaW5lZCcgfHwgdGhpcy5vcHRpb25zLmF0dGFjaERyYWdEcm9wKSB7XG4gICAgICAgICAgICB0aGlzLmF0dGFjaERyYWdEcm9wKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWVsZCA9ICQoYFtuYW1lPVwiJHt0aGlzLmNvbnRhaW5lci5kYXRhKCdkcm9wem9uZS1maWVsZCcpfVwiXWApO1xuXG4gICAgICAgIGlmIChmaWVsZC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuc29ydGFibGUgPSBuZXcgU29ydGFibGUodGhpcy5jb250YWluZXIuZ2V0KDApLCB7XG4gICAgICAgICAgICAgICAgYW5pbWF0aW9uOiAxNTAsXG4gICAgICAgICAgICAgICAgLy8gZm9yY2VGYWxsYmFjazogdHJ1ZSxcbiAgICAgICAgICAgICAgICBzZXREYXRhOiAoZGF0YVRyYW5zZmVyLCB0YXJnZXQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gJCh0YXJnZXQpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdXJpID0gZW5jb2RlVVJJKHRhcmdldC5maW5kKCcuZHotZmlsZW5hbWUnKS50ZXh0KCkpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2hvcnRjb2RlID0gVXJpVG9NYXJrZG93bih1cmkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyb3B6b25lLmRpc2FibGUoKTtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmFkZENsYXNzKCdoaWRlLWJhY2tmYWNlJyk7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkID0gJ2NvcHknO1xuICAgICAgICAgICAgICAgICAgICBkYXRhVHJhbnNmZXIuc2V0RGF0YSgndGV4dCcsIHNob3J0Y29kZSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvblNvcnQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5hbWVzID0gW107XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmZpbmQoJ1tkYXRhLWR6LW5hbWVdJykuZWFjaCgoaW5kZXgsIGZpbGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgPSAkKGZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGZpbGUudGV4dCgpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzLnB1c2gobmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLnZhbChuYW1lcy5qb2luKCcsJykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZmV0Y2hNZWRpYSgpIHtcbiAgICAgICAgY29uc3Qgb3JkZXIgPSB0aGlzLmNvbnRhaW5lci5jbG9zZXN0KCcuZm9ybS1maWVsZCcpLmZpbmQoJ1tuYW1lPVwiZGF0YVtoZWFkZXJdW21lZGlhX29yZGVyXVwiXScpLnZhbCgpO1xuICAgICAgICBjb25zdCBib2R5ID0geyB1cmk6IHRoaXMuZ2V0VVJJKCksIG9yZGVyIH07XG4gICAgICAgIGxldCB1cmwgPSB0aGlzLnVybHMuZmV0Y2g7XG5cbiAgICAgICAgcmVxdWVzdCh1cmwsIHsgbWV0aG9kOiAncG9zdCcsIGJvZHkgfSwgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0cyA9IHJlc3BvbnNlLnJlc3VsdHM7XG5cbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHJlc3VsdHMpLmZvckVhY2goKG5hbWUpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IHJlc3VsdHNbbmFtZV07XG4gICAgICAgICAgICAgICAgbGV0IG1vY2sgPSB7IG5hbWUsIHNpemU6IGRhdGEuc2l6ZSwgYWNjZXB0ZWQ6IHRydWUsIGV4dHJhczogZGF0YSB9O1xuXG4gICAgICAgICAgICAgICAgdGhpcy5kcm9wem9uZS5maWxlcy5wdXNoKG1vY2spO1xuICAgICAgICAgICAgICAgIHRoaXMuZHJvcHpvbmUub3B0aW9ucy5hZGRlZGZpbGUuY2FsbCh0aGlzLmRyb3B6b25lLCBtb2NrKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRyb3B6b25lLm9wdGlvbnMudGh1bWJuYWlsLmNhbGwodGhpcy5kcm9wem9uZSwgbW9jaywgZGF0YS51cmwpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmZpbmQoJy5kei1wcmV2aWV3JykucHJvcCgnZHJhZ2dhYmxlJywgJ3RydWUnKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25Ecm9wem9uZVNlbmRpbmcoZmlsZSwgeGhyLCBmb3JtRGF0YSkge1xuICAgICAgICAvKlxuICAgICAgICAvLyBDYW5ub3QgY2FsbCBzdXBlciBiZWNhdXNlIFNhZmFyaSBhbmQgSUUgQVBJIGRvbid0IGltcGxlbWVudCBgZGVsZXRlYFxuICAgICAgICBzdXBlci5vbkRyb3B6b25lU2VuZGluZyhmaWxlLCB4aHIsIGZvcm1EYXRhKTtcbiAgICAgICAgZm9ybURhdGEuZGVsZXRlKCd0YXNrJyk7XG4gICAgICAgICovXG5cbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKCduYW1lJywgdGhpcy5vcHRpb25zLmRvdE5vdGF0aW9uIHx8IGZpbGUubmFtZSk7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnYWRtaW4tbm9uY2UnLCBjb25maWcuYWRtaW5fbm9uY2UpO1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ3VyaScsIHRoaXMuZ2V0VVJJKCkpO1xuICAgIH1cblxuICAgIG9uRHJvcHpvbmVDb21wbGV0ZShmaWxlKSB7XG4gICAgICAgIHN1cGVyLm9uRHJvcHpvbmVDb21wbGV0ZShmaWxlKTtcbiAgICAgICAgaWYgKHRoaXMuc29ydGFibGUpIHtcbiAgICAgICAgICAgIHRoaXMuc29ydGFibGUub3B0aW9ucy5vblNvcnQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFjY2VwdGVkXG4gICAgICAgICQoJy5kei1wcmV2aWV3JykucHJvcCgnZHJhZ2dhYmxlJywgJ3RydWUnKTtcbiAgICB9XG5cbiAgICBvbkRyb3B6b25lUmVtb3ZlZEZpbGUoZmlsZSwgLi4uZXh0cmEpIHtcbiAgICAgICAgc3VwZXIub25Ecm9wem9uZVJlbW92ZWRGaWxlKGZpbGUsIC4uLmV4dHJhKTtcbiAgICAgICAgaWYgKHRoaXMuc29ydGFibGUpIHtcbiAgICAgICAgICAgIHRoaXMuc29ydGFibGUub3B0aW9ucy5vblNvcnQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGF0dGFjaERyYWdEcm9wKCkge1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5kZWxlZ2F0ZSgnW2RhdGEtZHotaW5zZXJ0XScsICdjbGljaycsIChlKSA9PiB7XG4gICAgICAgICAgICBsZXQgdGFyZ2V0ID0gJChlLmN1cnJlbnRUYXJnZXQpLnBhcmVudCgnLmR6LXByZXZpZXcnKS5maW5kKCcuZHotZmlsZW5hbWUnKTtcbiAgICAgICAgICAgIGxldCBlZGl0b3IgPSBFZGl0b3IuZWRpdG9ycy5maWx0ZXIoKGluZGV4LCBlZGl0b3IpID0+ICQoZWRpdG9yKS5hdHRyKCduYW1lJykgPT09ICdkYXRhW2NvbnRlbnRdJyk7XG5cbiAgICAgICAgICAgIGlmIChlZGl0b3IubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZWRpdG9yID0gZWRpdG9yLmRhdGEoJ2NvZGVtaXJyb3InKTtcbiAgICAgICAgICAgICAgICBlZGl0b3IuZm9jdXMoKTtcblxuICAgICAgICAgICAgICAgIGxldCBmaWxlbmFtZSA9IGVuY29kZVVSSSh0YXJnZXQudGV4dCgpKTtcbiAgICAgICAgICAgICAgICBsZXQgc2hvcnRjb2RlID0gVXJpVG9NYXJrZG93bihmaWxlbmFtZSk7XG4gICAgICAgICAgICAgICAgZWRpdG9yLmRvYy5yZXBsYWNlU2VsZWN0aW9uKHNob3J0Y29kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY29udGFpbmVyLmRlbGVnYXRlKCdbZGF0YS1kei12aWV3XScsICdtb3VzZWVudGVyJywgKGUpID0+IHtcbiAgICAgICAgICAgIGxldCB0YXJnZXQgPSAkKGUuY3VycmVudFRhcmdldCk7XG4gICAgICAgICAgICBsZXQgZmlsZSA9IHRhcmdldC5wYXJlbnQoJy5kei1wcmV2aWV3JykuZmluZCgnLmR6LWZpbGVuYW1lJyk7XG4gICAgICAgICAgICBsZXQgZmlsZW5hbWUgPSBlbmNvZGVVUkkoZmlsZS50ZXh0KCkpO1xuICAgICAgICAgICAgbGV0IFVSTCA9IHRhcmdldC5jbG9zZXN0KCdbZGF0YS1tZWRpYS1wYXRoXScpLmRhdGEoJ21lZGlhLXBhdGgnKTtcbiAgICAgICAgICAgIGxldCBvcmlnaW5hbCA9IHRoaXMuZHJvcHpvbmUuZmlsZXMuZmlsdGVyKChmaWxlKSA9PiBlbmNvZGVVUkkoZmlsZS5uYW1lKSA9PT0gZmlsZW5hbWUpLnNoaWZ0KCk7XG5cbiAgICAgICAgICAgIG9yaWdpbmFsID0gb3JpZ2luYWwgJiYgKChvcmlnaW5hbC5leHRyYXMgJiYgb3JpZ2luYWwuZXh0cmFzLm9yaWdpbmFsKSB8fCBlbmNvZGVVUkkob3JpZ2luYWwubmFtZSkpO1xuXG4gICAgICAgICAgICB0YXJnZXQuYXR0cignaHJlZicsIGAke1VSTH0vJHtvcmlnaW5hbH1gKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jb250YWluZXIuZGVsZWdhdGUoJ1tkYXRhLWR6LW1ldGFkYXRhXScsICdjbGljaycsIChlKSA9PiB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSAkKGUuY3VycmVudFRhcmdldCk7XG4gICAgICAgICAgICBjb25zdCBmaWxlID0gdGFyZ2V0LnBhcmVudCgnLmR6LXByZXZpZXcnKS5maW5kKCcuZHotZmlsZW5hbWUnKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVuYW1lID0gZW5jb2RlVVJJKGZpbGUudGV4dCgpKTtcblxuICAgICAgICAgICAgbGV0IGZpbGVPYmogPSB0aGlzLmRyb3B6b25lLmZpbGVzLmZpbHRlcigoZmlsZSkgPT4gZmlsZS5uYW1lID09PSBnbG9iYWwuZGVjb2RlVVJJKGZpbGVuYW1lKSkuc2hpZnQoKSB8fCB7fTtcblxuICAgICAgICAgICAgaWYgKCFmaWxlT2JqLmV4dHJhcykge1xuICAgICAgICAgICAgICAgIGZpbGVPYmouZXh0cmFzID0geyBtZXRhZGF0YTogW10gfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmlsZU9iai5leHRyYXMubWV0YWRhdGEpICYmICFmaWxlT2JqLmV4dHJhcy5tZXRhZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBmaWxlT2JqLmV4dHJhcy5tZXRhZGF0YSA9IHsgJyc6IGAke2dsb2JhbC5kZWNvZGVVUkkoZmlsZW5hbWUpfS5tZXRhLnlhbWwgZG9lc24ndCBleGlzdGAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZmlsZU9iaiA9IGZpbGVPYmouZXh0cmFzO1xuXG4gICAgICAgICAgICBjb25zdCBtb2RhbF9lbGVtZW50ID0gJCgnYm9keScpLmZpbmQoJ1tkYXRhLXJlbW9kYWwtaWQ9XCJtZXRhZGF0YVwiXScpO1xuICAgICAgICAgICAgY29uc3QgbW9kYWwgPSAkLnJlbW9kYWwubG9va3VwW21vZGFsX2VsZW1lbnQuZGF0YSgncmVtb2RhbCcpXTtcblxuICAgICAgICAgICAgbW9kYWxfZWxlbWVudC5maW5kKCdoMSBzdHJvbmcnKS5odG1sKGZpbGVuYW1lKTtcbiAgICAgICAgICAgIGlmIChmaWxlT2JqLnVybCkge1xuICAgICAgICAgICAgICAgIG1vZGFsX2VsZW1lbnQuZmluZCgnLm1ldGEtcHJldmlldycpLmh0bWwoYDxpbWcgc3JjPVwiJHtmaWxlT2JqLnVybH1cIiAvPmApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSBtb2RhbF9lbGVtZW50LmZpbmQoJy5tZXRhLWNvbnRlbnQnKS5odG1sKCc8dWwgLz4nKS5maW5kKCd1bCcpO1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoZmlsZU9iai5tZXRhZGF0YSkuZm9yRWFjaCgobWV0YSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmQoYDxsaT48c3Ryb25nPiR7bWV0YSA/IG1ldGEgKyAnOicgOiAnJ308L3N0cm9uZz4gJHtmaWxlT2JqLm1ldGFkYXRhW21ldGFdfTwvbGk+YCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgbW9kYWwub3BlbigpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNvbnRhaW5lci5kZWxlZ2F0ZSgnLmR6LXByZXZpZXcnLCAnZHJhZ3N0YXJ0JywgKGUpID0+IHtcbiAgICAgICAgICAgIGxldCB0YXJnZXQgPSAkKGUuY3VycmVudFRhcmdldCk7XG4gICAgICAgICAgICBsZXQgdXJpID0gZW5jb2RlVVJJKHRhcmdldC5maW5kKCcuZHotZmlsZW5hbWUnKS50ZXh0KCkpO1xuICAgICAgICAgICAgbGV0IHNob3J0Y29kZSA9IFVyaVRvTWFya2Rvd24odXJpKTtcbiAgICAgICAgICAgIHRoaXMuZHJvcHpvbmUuZGlzYWJsZSgpO1xuICAgICAgICAgICAgdGFyZ2V0LmFkZENsYXNzKCdoaWRlLWJhY2tmYWNlJyk7XG4gICAgICAgICAgICBlLm9yaWdpbmFsRXZlbnQuZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQgPSAnY29weSc7XG4gICAgICAgICAgICBlLm9yaWdpbmFsRXZlbnQuZGF0YVRyYW5zZmVyLnNldERhdGEoJ3RleHQnLCBzaG9ydGNvZGUpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNvbnRhaW5lci5kZWxlZ2F0ZSgnLmR6LXByZXZpZXcnLCAnZHJhZ2VuZCcsIChlKSA9PiB7XG4gICAgICAgICAgICBsZXQgdGFyZ2V0ID0gJChlLmN1cnJlbnRUYXJnZXQpO1xuICAgICAgICAgICAgdGhpcy5kcm9wem9uZS5lbmFibGUoKTtcbiAgICAgICAgICAgIHRhcmdldC5yZW1vdmVDbGFzcygnaGlkZS1iYWNrZmFjZScpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbmV4cG9ydCBsZXQgSW5zdGFuY2UgPSBuZXcgUGFnZU1lZGlhKCk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./app/pages/page/media.js\n"); /***/ }), /***/ "./app/pages/page/move.js": -/*!********************************!* +/*!********************************!*\ !*** ./app/pages/page/move.js ***! \********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { @@ -429,7 +440,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var jque /***/ }), /***/ "./app/pages/page/multilang.js": -/*!*************************************!* +/*!*************************************!*\ !*** ./app/pages/page/multilang.js ***! \*************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { @@ -440,7 +451,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var jque /***/ }), /***/ "./app/pages/page/unset.js": -/*!*********************************!* +/*!*********************************!*\ !*** ./app/pages/page/unset.js ***! \*********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { @@ -451,18 +462,18 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var jque /***/ }), /***/ "./app/pages/tree.js": -/*!***************************!* +/*!***************************!*\ !*** ./app/pages/tree.js ***! \***************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => /* binding */ PagesTree,\n/* harmony export */ \"Instance\": () => /* binding */ Instance\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils_storage__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/storage */ \"./app/utils/storage.js\");\n/* harmony import */ var _utils_storage__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_utils_storage__WEBPACK_IMPORTED_MODULE_1__);\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\nvar sessionKey = 'grav:admin:pages';\n\nif (!sessionStorage.getItem(sessionKey)) {\n sessionStorage.setItem(sessionKey, '{}');\n}\n\nvar PagesTree = /*#__PURE__*/function () {\n function PagesTree(query) {\n var _this = this;\n\n var elements = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;\n\n _classCallCheck(this, PagesTree);\n\n this.query = query;\n this.elements = jquery__WEBPACK_IMPORTED_MODULE_0___default()(elements !== undefined ? elements : this.query);\n this.session = JSON.parse(sessionStorage.getItem(sessionKey) || '{}');\n\n if (!this.elements.length) {\n return;\n }\n\n this.restore();\n this.elements.find('.page-icon').on('click', function (event) {\n return _this.toggle(event.target);\n });\n this.elements.data('tree_init', 1);\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-page-toggleall]').on('click', function (event) {\n var element = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.target).closest('[data-page-toggleall]');\n var action = element.data('page-toggleall');\n\n _this[action]();\n });\n }\n\n _createClass(PagesTree, [{\n key: \"reload\",\n value: function reload() {\n var elements = jquery__WEBPACK_IMPORTED_MODULE_0___default()(this.query).filter(function (index, element) {\n return !jquery__WEBPACK_IMPORTED_MODULE_0___default()(element).data('tree_init');\n });\n\n if (!elements.length) {\n return;\n }\n\n this.constructor(this.query, elements);\n }\n }, {\n key: \"toggle\",\n value: function toggle(elements) {\n var _this2 = this;\n\n var dontStore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (typeof elements === 'string') {\n elements = jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"[data-nav-id=\\\"\".concat(elements, \"\\\"]\")).find('[data-toggle=\"children\"]');\n }\n\n elements = jquery__WEBPACK_IMPORTED_MODULE_0___default()(elements || this.elements);\n elements.each(function (index, element) {\n element = jquery__WEBPACK_IMPORTED_MODULE_0___default()(element);\n\n var state = _this2.getState(element.closest('[data-toggle=\"children\"]'));\n\n _this2[state.isOpen ? 'collapse' : 'expand'](state.id, dontStore);\n });\n }\n }, {\n key: \"collapse\",\n value: function collapse(elements) {\n var _this3 = this;\n\n var dontStore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (typeof elements === 'string') {\n elements = jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"[data-nav-id=\\\"\".concat(elements, \"\\\"]\")).find('[data-toggle=\"children\"]');\n }\n\n elements = jquery__WEBPACK_IMPORTED_MODULE_0___default()(elements || this.elements);\n elements.each(function (index, element) {\n element = jquery__WEBPACK_IMPORTED_MODULE_0___default()(element);\n\n var state = _this3.getState(element);\n\n if (state.isOpen) {\n state.children.hide();\n state.icon.removeClass('children-open').addClass('children-closed');\n\n if (!dontStore) {\n delete _this3.session[state.id];\n }\n }\n });\n\n if (!dontStore) {\n this.save();\n }\n }\n }, {\n key: \"expand\",\n value: function expand(elements) {\n var _this4 = this;\n\n var dontStore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (typeof elements === 'string') {\n var element = jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"[data-nav-id=\\\"\".concat(elements, \"\\\"]\"));\n var parents = element.parents('[data-nav-id]'); // loop back through parents, we don't want to expand an hidden child\n\n if (parents.length) {\n parents = parents.find('[data-toggle=\"children\"]:first');\n parents = parents.add(element.find('[data-toggle=\"children\"]:first'));\n return this.expand(parents, dontStore);\n }\n\n elements = element.find('[data-toggle=\"children\"]:first');\n }\n\n elements = jquery__WEBPACK_IMPORTED_MODULE_0___default()(elements || this.elements);\n elements.each(function (index, element) {\n element = jquery__WEBPACK_IMPORTED_MODULE_0___default()(element);\n\n var state = _this4.getState(element);\n\n if (!state.isOpen) {\n state.children.show();\n state.icon.removeClass('children-closed').addClass('children-open');\n\n if (!dontStore) {\n _this4.session[state.id] = 1;\n }\n }\n });\n\n if (!dontStore) {\n this.save();\n }\n }\n }, {\n key: \"restore\",\n value: function restore() {\n var _this5 = this;\n\n this.collapse(null, true);\n Object.keys(this.session).forEach(function (key) {\n _this5.expand(key, 'no-store');\n });\n }\n }, {\n key: \"save\",\n value: function save() {\n return sessionStorage.setItem(sessionKey, JSON.stringify(this.session));\n }\n }, {\n key: \"getState\",\n value: function getState(element) {\n element = jquery__WEBPACK_IMPORTED_MODULE_0___default()(element);\n return {\n id: element.closest('[data-nav-id]').data('nav-id'),\n children: element.closest('li.page-item').find('ul:first'),\n icon: element.find('.page-icon'),\n\n get isOpen() {\n return this.icon.hasClass('children-open');\n }\n\n };\n }\n }]);\n\n return PagesTree;\n}();\n\n\nvar Instance = new PagesTree('[data-toggle=\"children\"]');\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL3BhZ2VzL3RyZWUuanM/MWEzNSJdLCJuYW1lcyI6WyJzZXNzaW9uS2V5Iiwic2Vzc2lvblN0b3JhZ2UiLCJnZXRJdGVtIiwic2V0SXRlbSIsIlBhZ2VzVHJlZSIsInF1ZXJ5IiwiZWxlbWVudHMiLCJ1bmRlZmluZWQiLCIkIiwic2Vzc2lvbiIsIkpTT04iLCJwYXJzZSIsImxlbmd0aCIsInJlc3RvcmUiLCJmaW5kIiwib24iLCJldmVudCIsInRvZ2dsZSIsInRhcmdldCIsImRhdGEiLCJlbGVtZW50IiwiY2xvc2VzdCIsImFjdGlvbiIsImZpbHRlciIsImluZGV4IiwiY29uc3RydWN0b3IiLCJkb250U3RvcmUiLCJlYWNoIiwic3RhdGUiLCJnZXRTdGF0ZSIsImlzT3BlbiIsImlkIiwiY2hpbGRyZW4iLCJoaWRlIiwiaWNvbiIsInJlbW92ZUNsYXNzIiwiYWRkQ2xhc3MiLCJzYXZlIiwicGFyZW50cyIsImFkZCIsImV4cGFuZCIsInNob3ciLCJjb2xsYXBzZSIsIk9iamVjdCIsImtleXMiLCJmb3JFYWNoIiwia2V5Iiwic3RyaW5naWZ5IiwiaGFzQ2xhc3MiLCJJbnN0YW5jZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUVBLElBQU1BLFVBQVUsR0FBRyxrQkFBbkI7O0FBRUEsSUFBSSxDQUFDQyxjQUFjLENBQUNDLE9BQWYsQ0FBdUJGLFVBQXZCLENBQUwsRUFBeUM7QUFDckNDLGdCQUFjLENBQUNFLE9BQWYsQ0FBdUJILFVBQXZCLEVBQW1DLElBQW5DO0FBQ0g7O0lBRW9CSSxTO0FBQ2pCLHFCQUFZQyxLQUFaLEVBQXlDO0FBQUE7O0FBQUEsUUFBdEJDLFFBQXNCLHVFQUFYQyxTQUFXOztBQUFBOztBQUNyQyxTQUFLRixLQUFMLEdBQWFBLEtBQWI7QUFDQSxTQUFLQyxRQUFMLEdBQWdCRSw2Q0FBQyxDQUFDRixRQUFRLEtBQUtDLFNBQWIsR0FBeUJELFFBQXpCLEdBQW9DLEtBQUtELEtBQTFDLENBQWpCO0FBQ0EsU0FBS0ksT0FBTCxHQUFlQyxJQUFJLENBQUNDLEtBQUwsQ0FBV1YsY0FBYyxDQUFDQyxPQUFmLENBQXVCRixVQUF2QixLQUFzQyxJQUFqRCxDQUFmOztBQUVBLFFBQUksQ0FBQyxLQUFLTSxRQUFMLENBQWNNLE1BQW5CLEVBQTJCO0FBQUU7QUFBUzs7QUFFdEMsU0FBS0MsT0FBTDtBQUVBLFNBQUtQLFFBQUwsQ0FBY1EsSUFBZCxDQUFtQixZQUFuQixFQUFpQ0MsRUFBakMsQ0FBb0MsT0FBcEMsRUFBNkMsVUFBQ0MsS0FBRDtBQUFBLGFBQVcsS0FBSSxDQUFDQyxNQUFMLENBQVlELEtBQUssQ0FBQ0UsTUFBbEIsQ0FBWDtBQUFBLEtBQTdDO0FBQ0EsU0FBS1osUUFBTCxDQUFjYSxJQUFkLENBQW1CLFdBQW5CLEVBQWdDLENBQWhDO0FBRUFYLGlEQUFDLENBQUMsdUJBQUQsQ0FBRCxDQUEyQk8sRUFBM0IsQ0FBOEIsT0FBOUIsRUFBdUMsVUFBQ0MsS0FBRCxFQUFXO0FBQzlDLFVBQUlJLE9BQU8sR0FBR1osNkNBQUMsQ0FBQ1EsS0FBSyxDQUFDRSxNQUFQLENBQUQsQ0FBZ0JHLE9BQWhCLENBQXdCLHVCQUF4QixDQUFkO0FBQ0EsVUFBSUMsTUFBTSxHQUFHRixPQUFPLENBQUNELElBQVIsQ0FBYSxnQkFBYixDQUFiOztBQUVBLFdBQUksQ0FBQ0csTUFBRCxDQUFKO0FBQ0gsS0FMRDtBQU1IOzs7OzZCQUVRO0FBQ0wsVUFBTWhCLFFBQVEsR0FBR0UsNkNBQUMsQ0FBQyxLQUFLSCxLQUFOLENBQUQsQ0FBY2tCLE1BQWQsQ0FBcUIsVUFBQ0MsS0FBRCxFQUFRSixPQUFSO0FBQUEsZUFBb0IsQ0FBQ1osNkNBQUMsQ0FBQ1ksT0FBRCxDQUFELENBQVdELElBQVgsQ0FBZ0IsV0FBaEIsQ0FBckI7QUFBQSxPQUFyQixDQUFqQjs7QUFDQSxVQUFJLENBQUNiLFFBQVEsQ0FBQ00sTUFBZCxFQUFzQjtBQUFFO0FBQVM7O0FBQ2pDLFdBQUthLFdBQUwsQ0FBaUIsS0FBS3BCLEtBQXRCLEVBQTZCQyxRQUE3QjtBQUNIOzs7MkJBRU1BLFEsRUFBNkI7QUFBQTs7QUFBQSxVQUFuQm9CLFNBQW1CLHVFQUFQLEtBQU87O0FBQ2hDLFVBQUksT0FBT3BCLFFBQVAsS0FBb0IsUUFBeEIsRUFBa0M7QUFDOUJBLGdCQUFRLEdBQUdFLDZDQUFDLDBCQUFrQkYsUUFBbEIsU0FBRCxDQUFpQ1EsSUFBakMsQ0FBc0MsMEJBQXRDLENBQVg7QUFDSDs7QUFFRFIsY0FBUSxHQUFHRSw2Q0FBQyxDQUFDRixRQUFRLElBQUksS0FBS0EsUUFBbEIsQ0FBWjtBQUNBQSxjQUFRLENBQUNxQixJQUFULENBQWMsVUFBQ0gsS0FBRCxFQUFRSixPQUFSLEVBQW9CO0FBQzlCQSxlQUFPLEdBQUdaLDZDQUFDLENBQUNZLE9BQUQsQ0FBWDs7QUFDQSxZQUFJUSxLQUFLLEdBQUcsTUFBSSxDQUFDQyxRQUFMLENBQWNULE9BQU8sQ0FBQ0MsT0FBUixDQUFnQiwwQkFBaEIsQ0FBZCxDQUFaOztBQUNBLGNBQUksQ0FBQ08sS0FBSyxDQUFDRSxNQUFOLEdBQWUsVUFBZixHQUE0QixRQUE3QixDQUFKLENBQTJDRixLQUFLLENBQUNHLEVBQWpELEVBQXFETCxTQUFyRDtBQUNILE9BSkQ7QUFLSDs7OzZCQUVRcEIsUSxFQUE2QjtBQUFBOztBQUFBLFVBQW5Cb0IsU0FBbUIsdUVBQVAsS0FBTzs7QUFDbEMsVUFBSSxPQUFPcEIsUUFBUCxLQUFvQixRQUF4QixFQUFrQztBQUM5QkEsZ0JBQVEsR0FBR0UsNkNBQUMsMEJBQWtCRixRQUFsQixTQUFELENBQWlDUSxJQUFqQyxDQUFzQywwQkFBdEMsQ0FBWDtBQUNIOztBQUVEUixjQUFRLEdBQUdFLDZDQUFDLENBQUNGLFFBQVEsSUFBSSxLQUFLQSxRQUFsQixDQUFaO0FBQ0FBLGNBQVEsQ0FBQ3FCLElBQVQsQ0FBYyxVQUFDSCxLQUFELEVBQVFKLE9BQVIsRUFBb0I7QUFDOUJBLGVBQU8sR0FBR1osNkNBQUMsQ0FBQ1ksT0FBRCxDQUFYOztBQUNBLFlBQUlRLEtBQUssR0FBRyxNQUFJLENBQUNDLFFBQUwsQ0FBY1QsT0FBZCxDQUFaOztBQUVBLFlBQUlRLEtBQUssQ0FBQ0UsTUFBVixFQUFrQjtBQUNkRixlQUFLLENBQUNJLFFBQU4sQ0FBZUMsSUFBZjtBQUNBTCxlQUFLLENBQUNNLElBQU4sQ0FBV0MsV0FBWCxDQUF1QixlQUF2QixFQUF3Q0MsUUFBeEMsQ0FBaUQsaUJBQWpEOztBQUNBLGNBQUksQ0FBQ1YsU0FBTCxFQUFnQjtBQUFFLG1CQUFPLE1BQUksQ0FBQ2pCLE9BQUwsQ0FBYW1CLEtBQUssQ0FBQ0csRUFBbkIsQ0FBUDtBQUFnQztBQUNyRDtBQUNKLE9BVEQ7O0FBV0EsVUFBSSxDQUFDTCxTQUFMLEVBQWdCO0FBQUUsYUFBS1csSUFBTDtBQUFjO0FBQ25DOzs7MkJBRU0vQixRLEVBQTZCO0FBQUE7O0FBQUEsVUFBbkJvQixTQUFtQix1RUFBUCxLQUFPOztBQUNoQyxVQUFJLE9BQU9wQixRQUFQLEtBQW9CLFFBQXhCLEVBQWtDO0FBQzlCLFlBQUljLE9BQU8sR0FBR1osNkNBQUMsMEJBQWtCRixRQUFsQixTQUFmO0FBQ0EsWUFBSWdDLE9BQU8sR0FBR2xCLE9BQU8sQ0FBQ2tCLE9BQVIsQ0FBZ0IsZUFBaEIsQ0FBZCxDQUY4QixDQUk5Qjs7QUFDQSxZQUFJQSxPQUFPLENBQUMxQixNQUFaLEVBQW9CO0FBQ2hCMEIsaUJBQU8sR0FBR0EsT0FBTyxDQUFDeEIsSUFBUixDQUFhLGdDQUFiLENBQVY7QUFDQXdCLGlCQUFPLEdBQUdBLE9BQU8sQ0FBQ0MsR0FBUixDQUFZbkIsT0FBTyxDQUFDTixJQUFSLENBQWEsZ0NBQWIsQ0FBWixDQUFWO0FBQ0EsaUJBQU8sS0FBSzBCLE1BQUwsQ0FBWUYsT0FBWixFQUFxQlosU0FBckIsQ0FBUDtBQUNIOztBQUVEcEIsZ0JBQVEsR0FBR2MsT0FBTyxDQUFDTixJQUFSLENBQWEsZ0NBQWIsQ0FBWDtBQUNIOztBQUVEUixjQUFRLEdBQUdFLDZDQUFDLENBQUNGLFFBQVEsSUFBSSxLQUFLQSxRQUFsQixDQUFaO0FBQ0FBLGNBQVEsQ0FBQ3FCLElBQVQsQ0FBYyxVQUFDSCxLQUFELEVBQVFKLE9BQVIsRUFBb0I7QUFDOUJBLGVBQU8sR0FBR1osNkNBQUMsQ0FBQ1ksT0FBRCxDQUFYOztBQUNBLFlBQUlRLEtBQUssR0FBRyxNQUFJLENBQUNDLFFBQUwsQ0FBY1QsT0FBZCxDQUFaOztBQUVBLFlBQUksQ0FBQ1EsS0FBSyxDQUFDRSxNQUFYLEVBQW1CO0FBQ2ZGLGVBQUssQ0FBQ0ksUUFBTixDQUFlUyxJQUFmO0FBQ0FiLGVBQUssQ0FBQ00sSUFBTixDQUFXQyxXQUFYLENBQXVCLGlCQUF2QixFQUEwQ0MsUUFBMUMsQ0FBbUQsZUFBbkQ7O0FBQ0EsY0FBSSxDQUFDVixTQUFMLEVBQWdCO0FBQUUsa0JBQUksQ0FBQ2pCLE9BQUwsQ0FBYW1CLEtBQUssQ0FBQ0csRUFBbkIsSUFBeUIsQ0FBekI7QUFBNkI7QUFDbEQ7QUFDSixPQVREOztBQVdBLFVBQUksQ0FBQ0wsU0FBTCxFQUFnQjtBQUFFLGFBQUtXLElBQUw7QUFBYztBQUNuQzs7OzhCQUVTO0FBQUE7O0FBQ04sV0FBS0ssUUFBTCxDQUFjLElBQWQsRUFBb0IsSUFBcEI7QUFFQUMsWUFBTSxDQUFDQyxJQUFQLENBQVksS0FBS25DLE9BQWpCLEVBQTBCb0MsT0FBMUIsQ0FBa0MsVUFBQ0MsR0FBRCxFQUFTO0FBQ3ZDLGNBQUksQ0FBQ04sTUFBTCxDQUFZTSxHQUFaLEVBQWlCLFVBQWpCO0FBQ0gsT0FGRDtBQUdIOzs7MkJBRU07QUFDSCxhQUFPN0MsY0FBYyxDQUFDRSxPQUFmLENBQXVCSCxVQUF2QixFQUFtQ1UsSUFBSSxDQUFDcUMsU0FBTCxDQUFlLEtBQUt0QyxPQUFwQixDQUFuQyxDQUFQO0FBQ0g7Ozs2QkFFUVcsTyxFQUFTO0FBQ2RBLGFBQU8sR0FBR1osNkNBQUMsQ0FBQ1ksT0FBRCxDQUFYO0FBRUEsYUFBTztBQUNIVyxVQUFFLEVBQUVYLE9BQU8sQ0FBQ0MsT0FBUixDQUFnQixlQUFoQixFQUFpQ0YsSUFBakMsQ0FBc0MsUUFBdEMsQ0FERDtBQUVIYSxnQkFBUSxFQUFFWixPQUFPLENBQUNDLE9BQVIsQ0FBZ0IsY0FBaEIsRUFBZ0NQLElBQWhDLENBQXFDLFVBQXJDLENBRlA7QUFHSG9CLFlBQUksRUFBRWQsT0FBTyxDQUFDTixJQUFSLENBQWEsWUFBYixDQUhIOztBQUlILFlBQUlnQixNQUFKLEdBQWE7QUFBRSxpQkFBTyxLQUFLSSxJQUFMLENBQVVjLFFBQVYsQ0FBbUIsZUFBbkIsQ0FBUDtBQUE2Qzs7QUFKekQsT0FBUDtBQU1IOzs7Ozs7O0FBR0wsSUFBSUMsUUFBUSxHQUFHLElBQUk3QyxTQUFKLENBQWMsMEJBQWQsQ0FBZiIsImZpbGUiOiIuL2FwcC9wYWdlcy90cmVlLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCAnLi4vdXRpbHMvc3RvcmFnZSc7XG5cbmNvbnN0IHNlc3Npb25LZXkgPSAnZ3JhdjphZG1pbjpwYWdlcyc7XG5cbmlmICghc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShzZXNzaW9uS2V5KSkge1xuICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oc2Vzc2lvbktleSwgJ3t9Jyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBhZ2VzVHJlZSB7XG4gICAgY29uc3RydWN0b3IocXVlcnksIGVsZW1lbnRzID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMucXVlcnkgPSBxdWVyeTtcbiAgICAgICAgdGhpcy5lbGVtZW50cyA9ICQoZWxlbWVudHMgIT09IHVuZGVmaW5lZCA/IGVsZW1lbnRzIDogdGhpcy5xdWVyeSk7XG4gICAgICAgIHRoaXMuc2Vzc2lvbiA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShzZXNzaW9uS2V5KSB8fCAne30nKTtcblxuICAgICAgICBpZiAoIXRoaXMuZWxlbWVudHMubGVuZ3RoKSB7IHJldHVybjsgfVxuXG4gICAgICAgIHRoaXMucmVzdG9yZSgpO1xuXG4gICAgICAgIHRoaXMuZWxlbWVudHMuZmluZCgnLnBhZ2UtaWNvbicpLm9uKCdjbGljaycsIChldmVudCkgPT4gdGhpcy50b2dnbGUoZXZlbnQudGFyZ2V0KSk7XG4gICAgICAgIHRoaXMuZWxlbWVudHMuZGF0YSgndHJlZV9pbml0JywgMSk7XG5cbiAgICAgICAgJCgnW2RhdGEtcGFnZS10b2dnbGVhbGxdJykub24oJ2NsaWNrJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBsZXQgZWxlbWVudCA9ICQoZXZlbnQudGFyZ2V0KS5jbG9zZXN0KCdbZGF0YS1wYWdlLXRvZ2dsZWFsbF0nKTtcbiAgICAgICAgICAgIGxldCBhY3Rpb24gPSBlbGVtZW50LmRhdGEoJ3BhZ2UtdG9nZ2xlYWxsJyk7XG5cbiAgICAgICAgICAgIHRoaXNbYWN0aW9uXSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZWxvYWQoKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gJCh0aGlzLnF1ZXJ5KS5maWx0ZXIoKGluZGV4LCBlbGVtZW50KSA9PiAhJChlbGVtZW50KS5kYXRhKCd0cmVlX2luaXQnKSk7XG4gICAgICAgIGlmICghZWxlbWVudHMubGVuZ3RoKSB7IHJldHVybjsgfVxuICAgICAgICB0aGlzLmNvbnN0cnVjdG9yKHRoaXMucXVlcnksIGVsZW1lbnRzKTtcbiAgICB9XG5cbiAgICB0b2dnbGUoZWxlbWVudHMsIGRvbnRTdG9yZSA9IGZhbHNlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZWxlbWVudHMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBlbGVtZW50cyA9ICQoYFtkYXRhLW5hdi1pZD1cIiR7ZWxlbWVudHN9XCJdYCkuZmluZCgnW2RhdGEtdG9nZ2xlPVwiY2hpbGRyZW5cIl0nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVsZW1lbnRzID0gJChlbGVtZW50cyB8fCB0aGlzLmVsZW1lbnRzKTtcbiAgICAgICAgZWxlbWVudHMuZWFjaCgoaW5kZXgsIGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpO1xuICAgICAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5nZXRTdGF0ZShlbGVtZW50LmNsb3Nlc3QoJ1tkYXRhLXRvZ2dsZT1cImNoaWxkcmVuXCJdJykpO1xuICAgICAgICAgICAgdGhpc1tzdGF0ZS5pc09wZW4gPyAnY29sbGFwc2UnIDogJ2V4cGFuZCddKHN0YXRlLmlkLCBkb250U3RvcmUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjb2xsYXBzZShlbGVtZW50cywgZG9udFN0b3JlID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50cyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGVsZW1lbnRzID0gJChgW2RhdGEtbmF2LWlkPVwiJHtlbGVtZW50c31cIl1gKS5maW5kKCdbZGF0YS10b2dnbGU9XCJjaGlsZHJlblwiXScpO1xuICAgICAgICB9XG5cbiAgICAgICAgZWxlbWVudHMgPSAkKGVsZW1lbnRzIHx8IHRoaXMuZWxlbWVudHMpO1xuICAgICAgICBlbGVtZW50cy5lYWNoKChpbmRleCwgZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7XG4gICAgICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLmdldFN0YXRlKGVsZW1lbnQpO1xuXG4gICAgICAgICAgICBpZiAoc3RhdGUuaXNPcGVuKSB7XG4gICAgICAgICAgICAgICAgc3RhdGUuY2hpbGRyZW4uaGlkZSgpO1xuICAgICAgICAgICAgICAgIHN0YXRlLmljb24ucmVtb3ZlQ2xhc3MoJ2NoaWxkcmVuLW9wZW4nKS5hZGRDbGFzcygnY2hpbGRyZW4tY2xvc2VkJyk7XG4gICAgICAgICAgICAgICAgaWYgKCFkb250U3RvcmUpIHsgZGVsZXRlIHRoaXMuc2Vzc2lvbltzdGF0ZS5pZF07IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCFkb250U3RvcmUpIHsgdGhpcy5zYXZlKCk7IH1cbiAgICB9XG5cbiAgICBleHBhbmQoZWxlbWVudHMsIGRvbnRTdG9yZSA9IGZhbHNlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZWxlbWVudHMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBsZXQgZWxlbWVudCA9ICQoYFtkYXRhLW5hdi1pZD1cIiR7ZWxlbWVudHN9XCJdYCk7XG4gICAgICAgICAgICBsZXQgcGFyZW50cyA9IGVsZW1lbnQucGFyZW50cygnW2RhdGEtbmF2LWlkXScpO1xuXG4gICAgICAgICAgICAvLyBsb29wIGJhY2sgdGhyb3VnaCBwYXJlbnRzLCB3ZSBkb24ndCB3YW50IHRvIGV4cGFuZCBhbiBoaWRkZW4gY2hpbGRcbiAgICAgICAgICAgIGlmIChwYXJlbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHBhcmVudHMgPSBwYXJlbnRzLmZpbmQoJ1tkYXRhLXRvZ2dsZT1cImNoaWxkcmVuXCJdOmZpcnN0Jyk7XG4gICAgICAgICAgICAgICAgcGFyZW50cyA9IHBhcmVudHMuYWRkKGVsZW1lbnQuZmluZCgnW2RhdGEtdG9nZ2xlPVwiY2hpbGRyZW5cIl06Zmlyc3QnKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXhwYW5kKHBhcmVudHMsIGRvbnRTdG9yZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGVsZW1lbnRzID0gZWxlbWVudC5maW5kKCdbZGF0YS10b2dnbGU9XCJjaGlsZHJlblwiXTpmaXJzdCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgZWxlbWVudHMgPSAkKGVsZW1lbnRzIHx8IHRoaXMuZWxlbWVudHMpO1xuICAgICAgICBlbGVtZW50cy5lYWNoKChpbmRleCwgZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7XG4gICAgICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLmdldFN0YXRlKGVsZW1lbnQpO1xuXG4gICAgICAgICAgICBpZiAoIXN0YXRlLmlzT3Blbikge1xuICAgICAgICAgICAgICAgIHN0YXRlLmNoaWxkcmVuLnNob3coKTtcbiAgICAgICAgICAgICAgICBzdGF0ZS5pY29uLnJlbW92ZUNsYXNzKCdjaGlsZHJlbi1jbG9zZWQnKS5hZGRDbGFzcygnY2hpbGRyZW4tb3BlbicpO1xuICAgICAgICAgICAgICAgIGlmICghZG9udFN0b3JlKSB7IHRoaXMuc2Vzc2lvbltzdGF0ZS5pZF0gPSAxOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghZG9udFN0b3JlKSB7IHRoaXMuc2F2ZSgpOyB9XG4gICAgfVxuXG4gICAgcmVzdG9yZSgpIHtcbiAgICAgICAgdGhpcy5jb2xsYXBzZShudWxsLCB0cnVlKTtcblxuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLnNlc3Npb24pLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5leHBhbmQoa2V5LCAnbm8tc3RvcmUnKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2F2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oc2Vzc2lvbktleSwgSlNPTi5zdHJpbmdpZnkodGhpcy5zZXNzaW9uKSk7XG4gICAgfVxuXG4gICAgZ2V0U3RhdGUoZWxlbWVudCkge1xuICAgICAgICBlbGVtZW50ID0gJChlbGVtZW50KTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IGVsZW1lbnQuY2xvc2VzdCgnW2RhdGEtbmF2LWlkXScpLmRhdGEoJ25hdi1pZCcpLFxuICAgICAgICAgICAgY2hpbGRyZW46IGVsZW1lbnQuY2xvc2VzdCgnbGkucGFnZS1pdGVtJykuZmluZCgndWw6Zmlyc3QnKSxcbiAgICAgICAgICAgIGljb246IGVsZW1lbnQuZmluZCgnLnBhZ2UtaWNvbicpLFxuICAgICAgICAgICAgZ2V0IGlzT3BlbigpIHsgcmV0dXJuIHRoaXMuaWNvbi5oYXNDbGFzcygnY2hpbGRyZW4tb3BlbicpOyB9XG4gICAgICAgIH07XG4gICAgfVxufVxuXG5sZXQgSW5zdGFuY2UgPSBuZXcgUGFnZXNUcmVlKCdbZGF0YS10b2dnbGU9XCJjaGlsZHJlblwiXScpO1xuZXhwb3J0IHsgSW5zdGFuY2UgfTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./app/pages/tree.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ PagesTree),\n/* harmony export */ \"Instance\": () => (/* binding */ Instance)\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils_storage__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/storage */ \"./app/utils/storage.js\");\n/* harmony import */ var _utils_storage__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_utils_storage__WEBPACK_IMPORTED_MODULE_1__);\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\nvar sessionKey = 'grav:admin:pages';\n\nif (!sessionStorage.getItem(sessionKey)) {\n sessionStorage.setItem(sessionKey, '{}');\n}\n\nvar PagesTree = /*#__PURE__*/function () {\n function PagesTree(query) {\n var _this = this;\n\n var elements = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;\n\n _classCallCheck(this, PagesTree);\n\n this.query = query;\n this.elements = jquery__WEBPACK_IMPORTED_MODULE_0___default()(elements !== undefined ? elements : this.query);\n this.session = JSON.parse(sessionStorage.getItem(sessionKey) || '{}');\n\n if (!this.elements.length) {\n return;\n }\n\n this.restore();\n this.elements.find('.page-icon').on('click', function (event) {\n return _this.toggle(event.target);\n });\n this.elements.data('tree_init', 1);\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-page-toggleall]').on('click', function (event) {\n var element = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.target).closest('[data-page-toggleall]');\n var action = element.data('page-toggleall');\n\n _this[action]();\n });\n }\n\n _createClass(PagesTree, [{\n key: \"reload\",\n value: function reload() {\n var elements = jquery__WEBPACK_IMPORTED_MODULE_0___default()(this.query).filter(function (index, element) {\n return !jquery__WEBPACK_IMPORTED_MODULE_0___default()(element).data('tree_init');\n });\n\n if (!elements.length) {\n return;\n }\n\n this.constructor(this.query, elements);\n }\n }, {\n key: \"toggle\",\n value: function toggle(elements) {\n var _this2 = this;\n\n var dontStore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (typeof elements === 'string') {\n elements = jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"[data-nav-id=\\\"\".concat(elements, \"\\\"]\")).find('[data-toggle=\"children\"]');\n }\n\n elements = jquery__WEBPACK_IMPORTED_MODULE_0___default()(elements || this.elements);\n elements.each(function (index, element) {\n element = jquery__WEBPACK_IMPORTED_MODULE_0___default()(element);\n\n var state = _this2.getState(element.closest('[data-toggle=\"children\"]'));\n\n _this2[state.isOpen ? 'collapse' : 'expand'](state.id, dontStore);\n });\n }\n }, {\n key: \"collapse\",\n value: function collapse(elements) {\n var _this3 = this;\n\n var dontStore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (typeof elements === 'string') {\n elements = jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"[data-nav-id=\\\"\".concat(elements, \"\\\"]\")).find('[data-toggle=\"children\"]');\n }\n\n elements = jquery__WEBPACK_IMPORTED_MODULE_0___default()(elements || this.elements);\n elements.each(function (index, element) {\n element = jquery__WEBPACK_IMPORTED_MODULE_0___default()(element);\n\n var state = _this3.getState(element);\n\n if (state.isOpen) {\n state.children.hide();\n state.icon.removeClass('children-open').addClass('children-closed');\n\n if (!dontStore) {\n delete _this3.session[state.id];\n }\n }\n });\n\n if (!dontStore) {\n this.save();\n }\n }\n }, {\n key: \"expand\",\n value: function expand(elements) {\n var _this4 = this;\n\n var dontStore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (typeof elements === 'string') {\n var element = jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"[data-nav-id=\\\"\".concat(elements, \"\\\"]\"));\n var parents = element.parents('[data-nav-id]'); // loop back through parents, we don't want to expand an hidden child\n\n if (parents.length) {\n parents = parents.find('[data-toggle=\"children\"]:first');\n parents = parents.add(element.find('[data-toggle=\"children\"]:first'));\n return this.expand(parents, dontStore);\n }\n\n elements = element.find('[data-toggle=\"children\"]:first');\n }\n\n elements = jquery__WEBPACK_IMPORTED_MODULE_0___default()(elements || this.elements);\n elements.each(function (index, element) {\n element = jquery__WEBPACK_IMPORTED_MODULE_0___default()(element);\n\n var state = _this4.getState(element);\n\n if (!state.isOpen) {\n state.children.show();\n state.icon.removeClass('children-closed').addClass('children-open');\n\n if (!dontStore) {\n _this4.session[state.id] = 1;\n }\n }\n });\n\n if (!dontStore) {\n this.save();\n }\n }\n }, {\n key: \"restore\",\n value: function restore() {\n var _this5 = this;\n\n this.collapse(null, true);\n Object.keys(this.session).forEach(function (key) {\n _this5.expand(key, 'no-store');\n });\n }\n }, {\n key: \"save\",\n value: function save() {\n return sessionStorage.setItem(sessionKey, JSON.stringify(this.session));\n }\n }, {\n key: \"getState\",\n value: function getState(element) {\n element = jquery__WEBPACK_IMPORTED_MODULE_0___default()(element);\n return {\n id: element.closest('[data-nav-id]').data('nav-id'),\n children: element.closest('li.page-item').find('ul:first'),\n icon: element.find('.page-icon'),\n\n get isOpen() {\n return this.icon.hasClass('children-open');\n }\n\n };\n }\n }]);\n\n return PagesTree;\n}();\n\n\nvar Instance = new PagesTree('[data-toggle=\"children\"]');\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL3BhZ2VzL3RyZWUuanM/MWEzNSJdLCJuYW1lcyI6WyJzZXNzaW9uS2V5Iiwic2Vzc2lvblN0b3JhZ2UiLCJnZXRJdGVtIiwic2V0SXRlbSIsIlBhZ2VzVHJlZSIsInF1ZXJ5IiwiZWxlbWVudHMiLCJ1bmRlZmluZWQiLCIkIiwic2Vzc2lvbiIsIkpTT04iLCJwYXJzZSIsImxlbmd0aCIsInJlc3RvcmUiLCJmaW5kIiwib24iLCJldmVudCIsInRvZ2dsZSIsInRhcmdldCIsImRhdGEiLCJlbGVtZW50IiwiY2xvc2VzdCIsImFjdGlvbiIsImZpbHRlciIsImluZGV4IiwiY29uc3RydWN0b3IiLCJkb250U3RvcmUiLCJlYWNoIiwic3RhdGUiLCJnZXRTdGF0ZSIsImlzT3BlbiIsImlkIiwiY2hpbGRyZW4iLCJoaWRlIiwiaWNvbiIsInJlbW92ZUNsYXNzIiwiYWRkQ2xhc3MiLCJzYXZlIiwicGFyZW50cyIsImFkZCIsImV4cGFuZCIsInNob3ciLCJjb2xsYXBzZSIsIk9iamVjdCIsImtleXMiLCJmb3JFYWNoIiwia2V5Iiwic3RyaW5naWZ5IiwiaGFzQ2xhc3MiLCJJbnN0YW5jZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUVBLElBQU1BLFVBQVUsR0FBRyxrQkFBbkI7O0FBRUEsSUFBSSxDQUFDQyxjQUFjLENBQUNDLE9BQWYsQ0FBdUJGLFVBQXZCLENBQUwsRUFBeUM7QUFDckNDLGdCQUFjLENBQUNFLE9BQWYsQ0FBdUJILFVBQXZCLEVBQW1DLElBQW5DO0FBQ0g7O0lBRW9CSSxTO0FBQ2pCLHFCQUFZQyxLQUFaLEVBQXlDO0FBQUE7O0FBQUEsUUFBdEJDLFFBQXNCLHVFQUFYQyxTQUFXOztBQUFBOztBQUNyQyxTQUFLRixLQUFMLEdBQWFBLEtBQWI7QUFDQSxTQUFLQyxRQUFMLEdBQWdCRSw2Q0FBQyxDQUFDRixRQUFRLEtBQUtDLFNBQWIsR0FBeUJELFFBQXpCLEdBQW9DLEtBQUtELEtB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c0MsUUFBdEMsQ0FERDtBQUVIYSxnQkFBUSxFQUFFWixPQUFPLENBQUNDLE9BQVIsQ0FBZ0IsY0FBaEIsRUFBZ0NQLElBQWhDLENBQXFDLFVBQXJDLENBRlA7QUFHSG9CLFlBQUksRUFBRWQsT0FBTyxDQUFDTixJQUFSLENBQWEsWUFBYixDQUhIOztBQUlILFlBQUlnQixNQUFKLEdBQWE7QUFBRSxpQkFBTyxLQUFLSSxJQUFMLENBQVVjLFFBQVYsQ0FBbUIsZUFBbkIsQ0FBUDtBQUE2Qzs7QUFKekQsT0FBUDtBQU1IOzs7Ozs7O0FBR0wsSUFBSUMsUUFBUSxHQUFHLElBQUk3QyxTQUFKLENBQWMsMEJBQWQsQ0FBZiIsImZpbGUiOiIuL2FwcC9wYWdlcy90cmVlLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCAnLi4vdXRpbHMvc3RvcmFnZSc7XG5cbmNvbnN0IHNlc3Npb25LZXkgPSAnZ3JhdjphZG1pbjpwYWdlcyc7XG5cbmlmICghc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShzZXNzaW9uS2V5KSkge1xuICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oc2Vzc2lvbktleSwgJ3t9Jyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBhZ2VzVHJlZSB7XG4gICAgY29uc3RydWN0b3IocXVlcnksIGVsZW1lbnRzID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMucXVlcnkgPSBxdWVyeTtcbiAgICAgICAgdGhpcy5lbGVtZW50cyA9ICQoZWxlbWVudHMgIT09IHVuZGVmaW5lZCA/IGVsZW1lbnRzIDogdGhpcy5xdWVyeSk7XG4gICAgICAgIHRoaXMuc2Vzc2lvbiA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShzZXNzaW9uS2V5KSB8fCAne30nKTtcblxuICAgICAgICBpZiAoIXRoaXMuZWxlbWVudHMubGVuZ3RoKSB7IHJldHVybjsgfVxuXG4gICAgICAgIHRoaXMucmVzdG9yZSgpO1xuXG4gICAgICAgIHRoaXMuZWxlbWVudHMuZmluZCgnLnBhZ2UtaWNvbicpLm9uKCdjbGljaycsIChldmVudCkgPT4gdGhpcy50b2dnbGUoZXZlbnQudGFyZ2V0KSk7XG4gICAgICAgIHRoaXMuZWxlbWVudHMuZGF0YSgndHJlZV9pbml0JywgMSk7XG5cbiAgICAgICAgJCgnW2RhdGEtcGFnZS10b2dnbGVhbGxdJykub24oJ2NsaWNrJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBsZXQgZWxlbWVudCA9ICQoZXZlbnQudGFyZ2V0KS5jbG9zZXN0KCdbZGF0YS1wYWdlLXRvZ2dsZWFsbF0nKTtcbiAgICAgICAgICAgIGxldCBhY3Rpb24gPSBlbGVtZW50LmRhdGEoJ3BhZ2UtdG9nZ2xlYWxsJyk7XG5cbiAgICAgICAgICAgIHRoaXNbYWN0aW9uXSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZWxvYWQoKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gJCh0aGlzLnF1ZXJ5KS5maWx0ZXIoKGluZGV4LCBlbGVtZW50KSA9PiAhJChlbGVtZW50KS5kYXRhKCd0cmVlX2luaXQnKSk7XG4gICAgICAgIGlmICghZWxlbWVudHMubGVuZ3RoKSB7IHJldHVybjsgfVxuICAgICAgICB0aGlzLmNvbnN0cnVjdG9yKHRoaXMucXVlcnksIGVsZW1lbnRzKTtcbiAgICB9XG5cbiAgICB0b2dnbGUoZWxlbWVudHMsIGRvbnRTdG9yZSA9IGZhbHNlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZWxlbWVudHMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBlbGVtZW50cyA9ICQoYFtkYXRhLW5hdi1pZD1cIiR7ZWxlbWVudHN9XCJdYCkuZmluZCgnW2RhdGEtdG9nZ2xlPVwiY2hpbGRyZW5cIl0nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVsZW1lbnRzID0gJChlbGVtZW50cyB8fCB0aGlzLmVsZW1lbnRzKTtcbiAgICAgICAgZWxlbWVudHMuZWFjaCgoaW5kZXgsIGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpO1xuICAgICAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5nZXRTdGF0ZShlbGVtZW50LmNsb3Nlc3QoJ1tkYXRhLXRvZ2dsZT1cImNoaWxkcmVuXCJdJykpO1xuICAgICAgICAgICAgdGhpc1tzdGF0ZS5pc09wZW4gPyAnY29sbGFwc2UnIDogJ2V4cGFuZCddKHN0YXRlLmlkLCBkb250U3RvcmUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjb2xsYXBzZShlbGVtZW50cywgZG9udFN0b3JlID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50cyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGVsZW1lbnRzID0gJChgW2RhdGEtbmF2LWlkPVwiJHtlbGVtZW50c31cIl1gKS5maW5kKCdbZGF0YS10b2dnbGU9XCJjaGlsZHJlblwiXScpO1xuICAgICAgICB9XG5cbiAgICAgICAgZWxlbWVudHMgPSAkKGVsZW1lbnRzIHx8IHRoaXMuZWxlbWVudHMpO1xuICAgICAgICBlbGVtZW50cy5lYWNoKChpbmRleCwgZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7XG4gICAgICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLmdldFN0YXRlKGVsZW1lbnQpO1xuXG4gICAgICAgICAgICBpZiAoc3RhdGUuaXNPcGVuKSB7XG4gICAgICAgICAgICAgICAgc3RhdGUuY2hpbGRyZW4uaGlkZSgpO1xuICAgICAgICAgICAgICAgIHN0YXRlLmljb24ucmVtb3ZlQ2xhc3MoJ2NoaWxkcmVuLW9wZW4nKS5hZGRDbGFzcygnY2hpbGRyZW4tY2xvc2VkJyk7XG4gICAgICAgICAgICAgICAgaWYgKCFkb250U3RvcmUpIHsgZGVsZXRlIHRoaXMuc2Vzc2lvbltzdGF0ZS5pZF07IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCFkb250U3RvcmUpIHsgdGhpcy5zYXZlKCk7IH1cbiAgICB9XG5cbiAgICBleHBhbmQoZWxlbWVudHMsIGRvbnRTdG9yZSA9IGZhbHNlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZWxlbWVudHMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBsZXQgZWxlbWVudCA9ICQoYFtkYXRhLW5hdi1pZD1cIiR7ZWxlbWVudHN9XCJdYCk7XG4gICAgICAgICAgICBsZXQgcGFyZW50cyA9IGVsZW1lbnQucGFyZW50cygnW2RhdGEtbmF2LWlkXScpO1xuXG4gICAgICAgICAgICAvLyBsb29wIGJhY2sgdGhyb3VnaCBwYXJlbnRzLCB3ZSBkb24ndCB3YW50IHRvIGV4cGFuZCBhbiBoaWRkZW4gY2hpbGRcbiAgICAgICAgICAgIGlmIChwYXJlbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHBhcmVudHMgPSBwYXJlbnRzLmZpbmQoJ1tkYXRhLXRvZ2dsZT1cImNoaWxkcmVuXCJdOmZpcnN0Jyk7XG4gICAgICAgICAgICAgICAgcGFyZW50cyA9IHBhcmVudHMuYWRkKGVsZW1lbnQuZmluZCgnW2RhdGEtdG9nZ2xlPVwiY2hpbGRyZW5cIl06Zmlyc3QnKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXhwYW5kKHBhcmVudHMsIGRvbnRTdG9yZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGVsZW1lbnRzID0gZWxlbWVudC5maW5kKCdbZGF0YS10b2dnbGU9XCJjaGlsZHJlblwiXTpmaXJzdCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgZWxlbWVudHMgPSAkKGVsZW1lbnRzIHx8IHRoaXMuZWxlbWVudHMpO1xuICAgICAgICBlbGVtZW50cy5lYWNoKChpbmRleCwgZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7XG4gICAgICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLmdldFN0YXRlKGVsZW1lbnQpO1xuXG4gICAgICAgICAgICBpZiAoIXN0YXRlLmlzT3Blbikge1xuICAgICAgICAgICAgICAgIHN0YXRlLmNoaWxkcmVuLnNob3coKTtcbiAgICAgICAgICAgICAgICBzdGF0ZS5pY29uLnJlbW92ZUNsYXNzKCdjaGlsZHJlbi1jbG9zZWQnKS5hZGRDbGFzcygnY2hpbGRyZW4tb3BlbicpO1xuICAgICAgICAgICAgICAgIGlmICghZG9udFN0b3JlKSB7IHRoaXMuc2Vzc2lvbltzdGF0ZS5pZF0gPSAxOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghZG9udFN0b3JlKSB7IHRoaXMuc2F2ZSgpOyB9XG4gICAgfVxuXG4gICAgcmVzdG9yZSgpIHtcbiAgICAgICAgdGhpcy5jb2xsYXBzZShudWxsLCB0cnVlKTtcblxuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLnNlc3Npb24pLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5leHBhbmQoa2V5LCAnbm8tc3RvcmUnKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2F2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oc2Vzc2lvbktleSwgSlNPTi5zdHJpbmdpZnkodGhpcy5zZXNzaW9uKSk7XG4gICAgfVxuXG4gICAgZ2V0U3RhdGUoZWxlbWVudCkge1xuICAgICAgICBlbGVtZW50ID0gJChlbGVtZW50KTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IGVsZW1lbnQuY2xvc2VzdCgnW2RhdGEtbmF2LWlkXScpLmRhdGEoJ25hdi1pZCcpLFxuICAgICAgICAgICAgY2hpbGRyZW46IGVsZW1lbnQuY2xvc2VzdCgnbGkucGFnZS1pdGVtJykuZmluZCgndWw6Zmlyc3QnKSxcbiAgICAgICAgICAgIGljb246IGVsZW1lbnQuZmluZCgnLnBhZ2UtaWNvbicpLFxuICAgICAgICAgICAgZ2V0IGlzT3BlbigpIHsgcmV0dXJuIHRoaXMuaWNvbi5oYXNDbGFzcygnY2hpbGRyZW4tb3BlbicpOyB9XG4gICAgICAgIH07XG4gICAgfVxufVxuXG5sZXQgSW5zdGFuY2UgPSBuZXcgUGFnZXNUcmVlKCdbZGF0YS10b2dnbGU9XCJjaGlsZHJlblwiXScpO1xuZXhwb3J0IHsgSW5zdGFuY2UgfTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./app/pages/tree.js\n"); /***/ }), /***/ "./app/plugins/index.js": -/*!******************************!* +/*!******************************!*\ !*** ./app/plugins/index.js ***! \******************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { @@ -473,7 +484,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var jque /***/ }), /***/ "./app/themes/index.js": -/*!*****************************!* +/*!*****************************!*\ !*** ./app/themes/index.js ***! \*****************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { @@ -484,7 +495,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var jque /***/ }), /***/ "./app/tools/index.js": -/*!****************************!* +/*!****************************!*\ !*** ./app/tools/index.js ***! \****************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { @@ -497,7 +508,7 @@ __webpack_require__.r(__webpack_exports__); /***/ }), /***/ "./app/tools/logs.js": -/*!***************************!* +/*!***************************!*\ !*** ./app/tools/logs.js ***! \***************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { @@ -508,7 +519,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var jque /***/ }), /***/ "./app/updates/channel-switcher.js": -/*!*****************************************!* +/*!*****************************************!*\ !*** ./app/updates/channel-switcher.js ***! \*****************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { @@ -519,7 +530,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var jque /***/ }), /***/ "./app/updates/check.js": -/*!******************************!* +/*!******************************!*\ !*** ./app/updates/check.js ***! \******************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { @@ -530,40 +541,40 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var jque /***/ }), /***/ "./app/updates/feed.js": -/*!*****************************!* +/*!*****************************!*\ !*** ./app/updates/feed.js ***! \*****************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => __WEBPACK_DEFAULT_EXPORT__\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! grav-config */ \"grav-config\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(grav_config__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _utils_request__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/request */ \"./app/utils/request.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\nvar URI = \"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.base_url_relative, \"/ajax.json/task\").concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.param_sep, \"getNewsFeed\");\n\nvar Feed = /*#__PURE__*/function () {\n function Feed() {\n _classCallCheck(this, Feed);\n\n this.data = null;\n }\n\n _createClass(Feed, [{\n key: \"fetch\",\n value: function fetch() {\n var _this = this;\n\n var refresh = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};\n (0,_utils_request__WEBPACK_IMPORTED_MODULE_2__.default)(URI, {\n method: 'post',\n body: {\n refresh: refresh\n }\n }, function (response) {\n _this.data = response;\n callback(response);\n });\n }\n }, {\n key: \"refresh\",\n value: function refresh() {\n var _refresh = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n var feed = jquery__WEBPACK_IMPORTED_MODULE_0___default()('#news-feed .widget-content');\n\n if (!feed.length) {\n return;\n }\n\n var loader = feed.find('.widget-loader');\n loader.find('div').remove();\n loader.find('.fa-warning').removeClass('fa-warning').addClass('fa-refresh fa-spin');\n loader.show();\n feed.find('> ul').hide();\n\n if (!this.data || this.data.error || _refresh) {\n this.fetch(_refresh, this.updateContent.bind(this));\n } else {\n this.updateContent();\n }\n }\n }, {\n key: \"updateContent\",\n value: function updateContent() {\n var feed = jquery__WEBPACK_IMPORTED_MODULE_0___default()('#news-feed .widget-content');\n\n if (!feed.length) {\n return;\n }\n\n var loader = feed.find('.widget-loader').hide();\n var content = feed.find('> ul').empty().show();\n\n if (this.data.error || this.data.status === 'error') {\n loader.show().find('div').remove();\n loader.find('.fa-refresh').removeClass('fa-refresh fa-spin').addClass('fa-warning');\n loader.append(\"
              \".concat(this.data.error ? this.data.error.message : this.data.message || 'Unable to download news feed', \"
              \"));\n return;\n }\n\n if (this.data && this.data.feed_data) {\n content.append(this.data.feed_data);\n }\n }\n }]);\n\n return Feed;\n}();\n\nvar feed = new Feed();\njquery__WEBPACK_IMPORTED_MODULE_0___default()(document).ready(function () {\n return feed.refresh();\n});\njquery__WEBPACK_IMPORTED_MODULE_0___default()(document).on('click', '[data-refresh=\"feed\"]', function (event) {\n event.preventDefault();\n feed.refresh(true);\n});\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (feed);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL3VwZGF0ZXMvZmVlZC5qcz9mMTVlIl0sIm5hbWVzIjpbIlVSSSIsImNvbmZpZyIsIkZlZWQiLCJkYXRhIiwicmVmcmVzaCIsImNhbGxiYWNrIiwicmVxdWVzdCIsIm1ldGhvZCIsImJvZHkiLCJyZXNwb25zZSIsImZlZWQiLCIkIiwibGVuZ3RoIiwibG9hZGVyIiwiZmluZCIsInJlbW92ZSIsInJlbW92ZUNsYXNzIiwiYWRkQ2xhc3MiLCJzaG93IiwiaGlkZSIsImVycm9yIiwiZmV0Y2giLCJ1cGRhdGVDb250ZW50IiwiYmluZCIsImNvbnRlbnQiLCJlbXB0eSIsInN0YXR1cyIsImFwcGVuZCIsIm1lc3NhZ2UiLCJmZWVkX2RhdGEiLCJkb2N1bWVudCIsInJlYWR5Iiwib24iLCJldmVudCIsInByZXZlbnREZWZhdWx0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFFQSxJQUFNQSxHQUFHLGFBQU1DLGlFQUFOLDRCQUFnREEseURBQWhELGdCQUFUOztJQUVNQyxJO0FBQ0Ysa0JBQWM7QUFBQTs7QUFDVixTQUFLQyxJQUFMLEdBQVksSUFBWjtBQUNIOzs7OzRCQUVnRDtBQUFBOztBQUFBLFVBQTNDQyxPQUEyQyx1RUFBakMsS0FBaUM7QUFBQSxVQUExQkMsUUFBMEIsdUVBQWYsWUFBVyxDQUFFLENBQUU7QUFDN0NDLDZEQUFPLENBQUNOLEdBQUQsRUFBTTtBQUNUTyxjQUFNLEVBQUUsTUFEQztBQUVUQyxZQUFJLEVBQUU7QUFBRUosaUJBQU8sRUFBUEE7QUFBRjtBQUZHLE9BQU4sRUFHSixVQUFDSyxRQUFELEVBQWM7QUFDYixhQUFJLENBQUNOLElBQUwsR0FBWU0sUUFBWjtBQUNBSixnQkFBUSxDQUFDSSxRQUFELENBQVI7QUFDSCxPQU5NLENBQVA7QUFPSDs7OzhCQUV3QjtBQUFBLFVBQWpCTCxRQUFpQix1RUFBUCxLQUFPOztBQUNyQixVQUFNTSxJQUFJLEdBQUdDLDZDQUFDLENBQUMsNEJBQUQsQ0FBZDs7QUFDQSxVQUFJLENBQUNELElBQUksQ0FBQ0UsTUFBVixFQUFrQjtBQUFFO0FBQVM7O0FBRTdCLFVBQUlDLE1BQU0sR0FBR0gsSUFBSSxDQUFDSSxJQUFMLENBQVUsZ0JBQVYsQ0FBYjtBQUNBRCxZQUFNLENBQUNDLElBQVAsQ0FBWSxLQUFaLEVBQW1CQyxNQUFuQjtBQUNBRixZQUFNLENBQUNDLElBQVAsQ0FBWSxhQUFaLEVBQTJCRSxXQUEzQixDQUF1QyxZQUF2QyxFQUFxREMsUUFBckQsQ0FBOEQsb0JBQTlEO0FBQ0FKLFlBQU0sQ0FBQ0ssSUFBUDtBQUVBUixVQUFJLENBQUNJLElBQUwsQ0FBVSxNQUFWLEVBQWtCSyxJQUFsQjs7QUFFQSxVQUFJLENBQUMsS0FBS2hCLElBQU4sSUFBYyxLQUFLQSxJQUFMLENBQVVpQixLQUF4QixJQUFpQ2hCLFFBQXJDLEVBQThDO0FBQzFDLGFBQUtpQixLQUFMLENBQVdqQixRQUFYLEVBQW9CLEtBQUtrQixhQUFMLENBQW1CQyxJQUFuQixDQUF3QixJQUF4QixDQUFwQjtBQUNILE9BRkQsTUFFTztBQUNILGFBQUtELGFBQUw7QUFDSDtBQUNKOzs7b0NBRWU7QUFDWixVQUFNWixJQUFJLEdBQUdDLDZDQUFDLENBQUMsNEJBQUQsQ0FBZDs7QUFDQSxVQUFJLENBQUNELElBQUksQ0FBQ0UsTUFBVixFQUFrQjtBQUFFO0FBQVM7O0FBRTdCLFVBQUlDLE1BQU0sR0FBR0gsSUFBSSxDQUFDSSxJQUFMLENBQVUsZ0JBQVYsRUFBNEJLLElBQTVCLEVBQWI7QUFDQSxVQUFJSyxPQUFPLEdBQUdkLElBQUksQ0FBQ0ksSUFBTCxDQUFVLE1BQVYsRUFBa0JXLEtBQWxCLEdBQTBCUCxJQUExQixFQUFkOztBQUVBLFVBQUksS0FBS2YsSUFBTCxDQUFVaUIsS0FBVixJQUFtQixLQUFLakIsSUFBTCxDQUFVdUIsTUFBVixLQUFxQixPQUE1QyxFQUFxRDtBQUNqRGIsY0FBTSxDQUFDSyxJQUFQLEdBQWNKLElBQWQsQ0FBbUIsS0FBbkIsRUFBMEJDLE1BQTFCO0FBQ0FGLGNBQU0sQ0FBQ0MsSUFBUCxDQUFZLGFBQVosRUFBMkJFLFdBQTNCLENBQXVDLG9CQUF2QyxFQUE2REMsUUFBN0QsQ0FBc0UsWUFBdEU7QUFDQUosY0FBTSxDQUFDYyxNQUFQLGdCQUFzQixLQUFLeEIsSUFBTCxDQUFVaUIsS0FBVixHQUFrQixLQUFLakIsSUFBTCxDQUFVaUIsS0FBVixDQUFnQlEsT0FBbEMsR0FBNEMsS0FBS3pCLElBQUwsQ0FBVXlCLE9BQVYsSUFBcUIsOEJBQXZGO0FBRUE7QUFDSDs7QUFFRCxVQUFJLEtBQUt6QixJQUFMLElBQWEsS0FBS0EsSUFBTCxDQUFVMEIsU0FBM0IsRUFBc0M7QUFDbENMLGVBQU8sQ0FBQ0csTUFBUixDQUFlLEtBQUt4QixJQUFMLENBQVUwQixTQUF6QjtBQUNIO0FBQ0o7Ozs7OztBQUdMLElBQUluQixJQUFJLEdBQUcsSUFBSVIsSUFBSixFQUFYO0FBQ0FTLDZDQUFDLENBQUNtQixRQUFELENBQUQsQ0FBWUMsS0FBWixDQUFrQjtBQUFBLFNBQU1yQixJQUFJLENBQUNOLE9BQUwsRUFBTjtBQUFBLENBQWxCO0FBQ0FPLDZDQUFDLENBQUNtQixRQUFELENBQUQsQ0FBWUUsRUFBWixDQUFlLE9BQWYsRUFBd0IsdUJBQXhCLEVBQWlELFVBQUNDLEtBQUQsRUFBVztBQUN4REEsT0FBSyxDQUFDQyxjQUFOO0FBQ0F4QixNQUFJLENBQUNOLE9BQUwsQ0FBYSxJQUFiO0FBQ0gsQ0FIRDtBQUtBLGlFQUFlTSxJQUFmIiwiZmlsZSI6Ii4vYXBwL3VwZGF0ZXMvZmVlZC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICdncmF2LWNvbmZpZyc7XG5pbXBvcnQgcmVxdWVzdCBmcm9tICcuLi91dGlscy9yZXF1ZXN0JztcblxuY29uc3QgVVJJID0gYCR7Y29uZmlnLmJhc2VfdXJsX3JlbGF0aXZlfS9hamF4Lmpzb24vdGFzayR7Y29uZmlnLnBhcmFtX3NlcH1nZXROZXdzRmVlZGA7XG5cbmNsYXNzIEZlZWQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmRhdGEgPSBudWxsO1xuICAgIH1cblxuICAgIGZldGNoKHJlZnJlc2ggPSBmYWxzZSwgY2FsbGJhY2sgPSBmdW5jdGlvbigpIHt9KSB7XG4gICAgICAgIHJlcXVlc3QoVVJJLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdwb3N0JyxcbiAgICAgICAgICAgIGJvZHk6IHsgcmVmcmVzaCB9XG4gICAgICAgIH0sIChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5kYXRhID0gcmVzcG9uc2U7XG4gICAgICAgICAgICBjYWxsYmFjayhyZXNwb25zZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlZnJlc2gocmVmcmVzaCA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IGZlZWQgPSAkKCcjbmV3cy1mZWVkIC53aWRnZXQtY29udGVudCcpO1xuICAgICAgICBpZiAoIWZlZWQubGVuZ3RoKSB7IHJldHVybjsgfVxuXG4gICAgICAgIGxldCBsb2FkZXIgPSBmZWVkLmZpbmQoJy53aWRnZXQtbG9hZGVyJyk7XG4gICAgICAgIGxvYWRlci5maW5kKCdkaXYnKS5yZW1vdmUoKTtcbiAgICAgICAgbG9hZGVyLmZpbmQoJy5mYS13YXJuaW5nJykucmVtb3ZlQ2xhc3MoJ2ZhLXdhcm5pbmcnKS5hZGRDbGFzcygnZmEtcmVmcmVzaCBmYS1zcGluJyk7XG4gICAgICAgIGxvYWRlci5zaG93KCk7XG5cbiAgICAgICAgZmVlZC5maW5kKCc+IHVsJykuaGlkZSgpO1xuXG4gICAgICAgIGlmICghdGhpcy5kYXRhIHx8IHRoaXMuZGF0YS5lcnJvciB8fCByZWZyZXNoKSB7XG4gICAgICAgICAgICB0aGlzLmZldGNoKHJlZnJlc2gsIHRoaXMudXBkYXRlQ29udGVudC5iaW5kKHRoaXMpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ29udGVudCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlQ29udGVudCgpIHtcbiAgICAgICAgY29uc3QgZmVlZCA9ICQoJyNuZXdzLWZlZWQgLndpZGdldC1jb250ZW50Jyk7XG4gICAgICAgIGlmICghZmVlZC5sZW5ndGgpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgbGV0IGxvYWRlciA9IGZlZWQuZmluZCgnLndpZGdldC1sb2FkZXInKS5oaWRlKCk7XG4gICAgICAgIGxldCBjb250ZW50ID0gZmVlZC5maW5kKCc+IHVsJykuZW1wdHkoKS5zaG93KCk7XG5cbiAgICAgICAgaWYgKHRoaXMuZGF0YS5lcnJvciB8fCB0aGlzLmRhdGEuc3RhdHVzID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgICBsb2FkZXIuc2hvdygpLmZpbmQoJ2RpdicpLnJlbW92ZSgpO1xuICAgICAgICAgICAgbG9hZGVyLmZpbmQoJy5mYS1yZWZyZXNoJykucmVtb3ZlQ2xhc3MoJ2ZhLXJlZnJlc2ggZmEtc3BpbicpLmFkZENsYXNzKCdmYS13YXJuaW5nJyk7XG4gICAgICAgICAgICBsb2FkZXIuYXBwZW5kKGA8ZGl2PiR7dGhpcy5kYXRhLmVycm9yID8gdGhpcy5kYXRhLmVycm9yLm1lc3NhZ2UgOiB0aGlzLmRhdGEubWVzc2FnZSB8fCAnVW5hYmxlIHRvIGRvd25sb2FkIG5ld3MgZmVlZCd9PC9kaXY+YCk7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmRhdGEgJiYgdGhpcy5kYXRhLmZlZWRfZGF0YSkge1xuICAgICAgICAgICAgY29udGVudC5hcHBlbmQodGhpcy5kYXRhLmZlZWRfZGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmxldCBmZWVkID0gbmV3IEZlZWQoKTtcbiQoZG9jdW1lbnQpLnJlYWR5KCgpID0+IGZlZWQucmVmcmVzaCgpKTtcbiQoZG9jdW1lbnQpLm9uKCdjbGljaycsICdbZGF0YS1yZWZyZXNoPVwiZmVlZFwiXScsIChldmVudCkgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZmVlZC5yZWZyZXNoKHRydWUpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGZlZWQ7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./app/updates/feed.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! grav-config */ \"grav-config\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(grav_config__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _utils_request__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/request */ \"./app/utils/request.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\nvar URI = \"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.base_url_relative, \"/ajax.json/task\").concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.param_sep, \"getNewsFeed\");\n\nvar Feed = /*#__PURE__*/function () {\n function Feed() {\n _classCallCheck(this, Feed);\n\n this.data = null;\n }\n\n _createClass(Feed, [{\n key: \"fetch\",\n value: function fetch() {\n var _this = this;\n\n var refresh = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};\n (0,_utils_request__WEBPACK_IMPORTED_MODULE_2__.default)(URI, {\n method: 'post',\n body: {\n refresh: refresh\n }\n }, function (response) {\n _this.data = response;\n callback(response);\n });\n }\n }, {\n key: \"refresh\",\n value: function refresh() {\n var _refresh = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n var feed = jquery__WEBPACK_IMPORTED_MODULE_0___default()('#news-feed .widget-content');\n\n if (!feed.length) {\n return;\n }\n\n var loader = feed.find('.widget-loader');\n loader.find('div').remove();\n loader.find('.fa-warning').removeClass('fa-warning').addClass('fa-refresh fa-spin');\n loader.show();\n feed.find('> ul').hide();\n\n if (!this.data || this.data.error || _refresh) {\n this.fetch(_refresh, this.updateContent.bind(this));\n } else {\n this.updateContent();\n }\n }\n }, {\n key: \"updateContent\",\n value: function updateContent() {\n var feed = jquery__WEBPACK_IMPORTED_MODULE_0___default()('#news-feed .widget-content');\n\n if (!feed.length) {\n return;\n }\n\n var loader = feed.find('.widget-loader').hide();\n var content = feed.find('> ul').empty().show();\n\n if (this.data.error || this.data.status === 'error') {\n loader.show().find('div').remove();\n loader.find('.fa-refresh').removeClass('fa-refresh fa-spin').addClass('fa-warning');\n loader.append(\"
              \".concat(this.data.error ? this.data.error.message : this.data.message || 'Unable to download news feed', \"
              \"));\n return;\n }\n\n if (this.data && this.data.feed_data) {\n content.append(this.data.feed_data);\n }\n }\n }]);\n\n return Feed;\n}();\n\nvar feed = new Feed();\njquery__WEBPACK_IMPORTED_MODULE_0___default()(document).ready(function () {\n return feed.refresh();\n});\njquery__WEBPACK_IMPORTED_MODULE_0___default()(document).on('click', '[data-refresh=\"feed\"]', function (event) {\n event.preventDefault();\n feed.refresh(true);\n});\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (feed);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL3VwZGF0ZXMvZmVlZC5qcz9mMTVlIl0sIm5hbWVzIjpbIlVSSSIsImNvbmZpZyIsIkZlZWQiLCJkYXRhIiwicmVmcmVzaCIsImNhbGxiYWNrIiwicmVxdWVzdCIsIm1ldGhvZCIsImJvZHkiLCJyZXNwb25zZSIsImZlZWQiLCIkIiwibGVuZ3RoIiwibG9hZGVyIiwiZmluZCIsInJlbW92ZSIsInJlbW92ZUNsYXNzIiwiYWRkQ2xhc3MiLCJzaG93IiwiaGlkZSIsImVycm9yIiwiZmV0Y2giLCJ1cGRhdGVDb250ZW50IiwiYmluZCIsImNvbnRlbnQiLCJlbXB0eSIsInN0YXR1cyIsImFwcGVuZCIsIm1lc3NhZ2UiLCJmZWVkX2RhdGEiLCJkb2N1bWVudCIsInJlYWR5Iiwib24iLCJldmVudCIsInByZXZlbnREZWZhdWx0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFFQSxJQUFNQSxHQUFHLGFBQU1DLGlFQUFOLDRCQUFnREEseURBQWhELGdCQUFUOztJQUVNQyxJO0FBQ0Ysa0JBQWM7QUFBQTs7QUFDVixTQUFLQyxJQUFMLEdBQVksSUFBWjtBQUNIOzs7O1dBRUQsaUJBQWlEO0FBQUE7O0FBQUEsVUFBM0NDLE9BQTJDLHVFQUFqQyxLQUFpQztBQUFBLFVBQTFCQyxRQUEwQix1RUFBZixZQUFXLENBQUUsQ0FBRTtBQUM3Q0MsNkRBQU8sQ0FBQ04sR0FBRCxFQUFNO0FBQ1RPLGNBQU0sRUFBRSxNQURDO0FBRVRDLFlBQUksRUFBRTtBQUFFSixpQkFBTyxFQUFQQTtBQUFGO0FBRkcsT0FBTixFQUdKLFVBQUNLLFFBQUQsRUFBYztBQUNiLGFBQUksQ0FBQ04sSUFBTCxHQUFZTSxRQUFaO0FBQ0FKLGdCQUFRLENBQUNJLFFBQUQsQ0FBUjtBQUNILE9BTk0sQ0FBUDtBQU9IOzs7V0FFRCxtQkFBeUI7QUFBQSxVQUFqQkwsUUFBaUIsdUVBQVAsS0FBTzs7QUFDckIsVUFBTU0sSUFBSSxHQUFHQyw2Q0FBQyxDQUFDLDRCQUFELENBQWQ7O0FBQ0EsVUFBSSxDQUFDRCxJQUFJLENBQUNFLE1BQVYsRUFBa0I7QUFBRTtBQUFTOztBQUU3QixVQUFJQyxNQUFNLEdBQUdILElBQUksQ0FBQ0ksSUFBTCxDQUFVLGdCQUFWLENBQWI7QUFDQUQsWUFBTSxDQUFDQyxJQUFQLENBQVksS0FBWixFQUFtQkMsTUFBbkI7QUFDQUYsWUFBTSxDQUFDQyxJQUFQLENBQVksYUFBWixFQUEyQkUsV0FBM0IsQ0FBdUMsWUFBdkMsRUFBcURDLFFBQXJELENBQThELG9CQUE5RDtBQUNBSixZQUFNLENBQUNLLElBQVA7QUFFQVIsVUFBSSxDQUFDSSxJQUFMLENBQVUsTUFBVixFQUFrQkssSUFBbEI7O0FBRUEsVUFBSSxDQUFDLEtBQUtoQixJQUFOLElBQWMsS0FBS0EsSUFBTCxDQUFVaUIsS0FBeEIsSUFBaUNoQixRQUFyQyxFQUE4QztBQUMxQyxhQUFLaUIsS0FBTCxDQUFXakIsUUFBWCxFQUFvQixLQUFLa0IsYUFBTCxDQUFtQkMsSUFBbkIsQ0FBd0IsSUFBeEIsQ0FBcEI7QUFDSCxPQUZELE1BRU87QUFDSCxhQUFLRCxhQUFMO0FBQ0g7QUFDSjs7O1dBRUQseUJBQWdCO0FBQ1osVUFBTVosSUFBSSxHQUFHQyw2Q0FBQyxDQUFDLDRCQUFELENBQWQ7O0FBQ0EsVUFBSSxDQUFDRCxJQUFJLENBQUNFLE1BQVYsRUFBa0I7QUFBRTtBQUFTOztBQUU3QixVQUFJQyxNQUFNLEdBQUdILElBQUksQ0FBQ0ksSUFBTCxDQUFVLGdCQUFWLEVBQTRCSyxJQUE1QixFQUFiO0FBQ0EsVUFBSUssT0FBTyxHQUFHZCxJQUFJLENBQUNJLElBQUwsQ0FBVSxNQUFWLEVBQWtCVyxLQUFsQixHQUEwQlAsSUFBMUIsRUFBZDs7QUFFQSxVQUFJLEtBQUtmLElBQUwsQ0FBVWlCLEtBQVYsSUFBbUIsS0FBS2pCLElBQUwsQ0FBVXVCLE1BQVYsS0FBcUIsT0FBNUMsRUFBcUQ7QUFDakRiLGNBQU0sQ0FBQ0ssSUFBUCxHQUFjSixJQUFkLENBQW1CLEtBQW5CLEVBQTBCQyxNQUExQjtBQUNBRixjQUFNLENBQUNDLElBQVAsQ0FBWSxhQUFaLEVBQTJCRSxXQUEzQixDQUF1QyxvQkFBdkMsRUFBNkRDLFFBQTdELENBQXNFLFlBQXRFO0FBQ0FKLGNBQU0sQ0FBQ2MsTUFBUCxnQkFBc0IsS0FBS3hCLElBQUwsQ0FBVWlCLEtBQVYsR0FBa0IsS0FBS2pCLElBQUwsQ0FBVWlCLEtBQVYsQ0FBZ0JRLE9BQWxDLEdBQTRDLEtBQUt6QixJQUFMLENBQVV5QixPQUFWLElBQXFCLDhCQUF2RjtBQUVBO0FBQ0g7O0FBRUQsVUFBSSxLQUFLekIsSUFBTCxJQUFhLEtBQUtBLElBQUwsQ0FBVTBCLFNBQTNCLEVBQXNDO0FBQ2xDTCxlQUFPLENBQUNHLE1BQVIsQ0FBZSxLQUFLeEIsSUFBTCxDQUFVMEIsU0FBekI7QUFDSDtBQUNKOzs7Ozs7QUFHTCxJQUFJbkIsSUFBSSxHQUFHLElBQUlSLElBQUosRUFBWDtBQUNBUyw2Q0FBQyxDQUFDbUIsUUFBRCxDQUFELENBQVlDLEtBQVosQ0FBa0I7QUFBQSxTQUFNckIsSUFBSSxDQUFDTixPQUFMLEVBQU47QUFBQSxDQUFsQjtBQUNBTyw2Q0FBQyxDQUFDbUIsUUFBRCxDQUFELENBQVlFLEVBQVosQ0FBZSxPQUFmLEVBQXdCLHVCQUF4QixFQUFpRCxVQUFDQyxLQUFELEVBQVc7QUFDeERBLE9BQUssQ0FBQ0MsY0FBTjtBQUNBeEIsTUFBSSxDQUFDTixPQUFMLENBQWEsSUFBYjtBQUNILENBSEQ7QUFLQSxpRUFBZU0sSUFBZiIsImZpbGUiOiIuL2FwcC91cGRhdGVzL2ZlZWQuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnZ3Jhdi1jb25maWcnO1xuaW1wb3J0IHJlcXVlc3QgZnJvbSAnLi4vdXRpbHMvcmVxdWVzdCc7XG5cbmNvbnN0IFVSSSA9IGAke2NvbmZpZy5iYXNlX3VybF9yZWxhdGl2ZX0vYWpheC5qc29uL3Rhc2ske2NvbmZpZy5wYXJhbV9zZXB9Z2V0TmV3c0ZlZWRgO1xuXG5jbGFzcyBGZWVkIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5kYXRhID0gbnVsbDtcbiAgICB9XG5cbiAgICBmZXRjaChyZWZyZXNoID0gZmFsc2UsIGNhbGxiYWNrID0gZnVuY3Rpb24oKSB7fSkge1xuICAgICAgICByZXF1ZXN0KFVSSSwge1xuICAgICAgICAgICAgbWV0aG9kOiAncG9zdCcsXG4gICAgICAgICAgICBib2R5OiB7IHJlZnJlc2ggfVxuICAgICAgICB9LCAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGF0YSA9IHJlc3BvbnNlO1xuICAgICAgICAgICAgY2FsbGJhY2socmVzcG9uc2UpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZWZyZXNoKHJlZnJlc2ggPSBmYWxzZSkge1xuICAgICAgICBjb25zdCBmZWVkID0gJCgnI25ld3MtZmVlZCAud2lkZ2V0LWNvbnRlbnQnKTtcbiAgICAgICAgaWYgKCFmZWVkLmxlbmd0aCkgeyByZXR1cm47IH1cblxuICAgICAgICBsZXQgbG9hZGVyID0gZmVlZC5maW5kKCcud2lkZ2V0LWxvYWRlcicpO1xuICAgICAgICBsb2FkZXIuZmluZCgnZGl2JykucmVtb3ZlKCk7XG4gICAgICAgIGxvYWRlci5maW5kKCcuZmEtd2FybmluZycpLnJlbW92ZUNsYXNzKCdmYS13YXJuaW5nJykuYWRkQ2xhc3MoJ2ZhLXJlZnJlc2ggZmEtc3BpbicpO1xuICAgICAgICBsb2FkZXIuc2hvdygpO1xuXG4gICAgICAgIGZlZWQuZmluZCgnPiB1bCcpLmhpZGUoKTtcblxuICAgICAgICBpZiAoIXRoaXMuZGF0YSB8fCB0aGlzLmRhdGEuZXJyb3IgfHwgcmVmcmVzaCkge1xuICAgICAgICAgICAgdGhpcy5mZXRjaChyZWZyZXNoLCB0aGlzLnVwZGF0ZUNvbnRlbnQuYmluZCh0aGlzKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbnRlbnQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZUNvbnRlbnQoKSB7XG4gICAgICAgIGNvbnN0IGZlZWQgPSAkKCcjbmV3cy1mZWVkIC53aWRnZXQtY29udGVudCcpO1xuICAgICAgICBpZiAoIWZlZWQubGVuZ3RoKSB7IHJldHVybjsgfVxuXG4gICAgICAgIGxldCBsb2FkZXIgPSBmZWVkLmZpbmQoJy53aWRnZXQtbG9hZGVyJykuaGlkZSgpO1xuICAgICAgICBsZXQgY29udGVudCA9IGZlZWQuZmluZCgnPiB1bCcpLmVtcHR5KCkuc2hvdygpO1xuXG4gICAgICAgIGlmICh0aGlzLmRhdGEuZXJyb3IgfHwgdGhpcy5kYXRhLnN0YXR1cyA9PT0gJ2Vycm9yJykge1xuICAgICAgICAgICAgbG9hZGVyLnNob3coKS5maW5kKCdkaXYnKS5yZW1vdmUoKTtcbiAgICAgICAgICAgIGxvYWRlci5maW5kKCcuZmEtcmVmcmVzaCcpLnJlbW92ZUNsYXNzKCdmYS1yZWZyZXNoIGZhLXNwaW4nKS5hZGRDbGFzcygnZmEtd2FybmluZycpO1xuICAgICAgICAgICAgbG9hZGVyLmFwcGVuZChgPGRpdj4ke3RoaXMuZGF0YS5lcnJvciA/IHRoaXMuZGF0YS5lcnJvci5tZXNzYWdlIDogdGhpcy5kYXRhLm1lc3NhZ2UgfHwgJ1VuYWJsZSB0byBkb3dubG9hZCBuZXdzIGZlZWQnfTwvZGl2PmApO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5kYXRhICYmIHRoaXMuZGF0YS5mZWVkX2RhdGEpIHtcbiAgICAgICAgICAgIGNvbnRlbnQuYXBwZW5kKHRoaXMuZGF0YS5mZWVkX2RhdGEpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5sZXQgZmVlZCA9IG5ldyBGZWVkKCk7XG4kKGRvY3VtZW50KS5yZWFkeSgoKSA9PiBmZWVkLnJlZnJlc2goKSk7XG4kKGRvY3VtZW50KS5vbignY2xpY2snLCAnW2RhdGEtcmVmcmVzaD1cImZlZWRcIl0nLCAoZXZlbnQpID0+IHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGZlZWQucmVmcmVzaCh0cnVlKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBmZWVkO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./app/updates/feed.js\n"); /***/ }), /***/ "./app/updates/index.js": -/*!******************************!* +/*!******************************!*\ !*** ./app/updates/index.js ***! \******************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => /* binding */ Updates,\n/* harmony export */ \"Instance\": () => /* binding */ Instance,\n/* harmony export */ \"Notifications\": () => /* reexport safe */ _notifications__WEBPACK_IMPORTED_MODULE_4__.default,\n/* harmony export */ \"Feed\": () => /* reexport safe */ _feed__WEBPACK_IMPORTED_MODULE_5__.default\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var mout_array_unique__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! mout/array/unique */ \"./node_modules/mout/array/unique.js\");\n/* harmony import */ var mout_array_unique__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(mout_array_unique__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! grav-config */ \"grav-config\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(grav_config__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _utils_gpm__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/gpm */ \"./app/utils/gpm.js\");\n/* harmony import */ var _notifications__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./notifications */ \"./app/updates/notifications.js\");\n/* harmony import */ var _feed__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./feed */ \"./app/updates/feed.js\");\n/* harmony import */ var _check__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./check */ \"./app/updates/check.js\");\n/* harmony import */ var _update__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./update */ \"./app/updates/update.js\");\n/* harmony import */ var _channel_switcher__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./channel-switcher */ \"./app/updates/channel-switcher.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\n\n\n\n\n\n\n\nvar Updates = /*#__PURE__*/function () {\n function Updates() {\n var payload = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n _classCallCheck(this, Updates);\n\n this.setPayload(payload);\n this.task = \"task\".concat(grav_config__WEBPACK_IMPORTED_MODULE_2__.config.param_sep);\n this.updateURL = '';\n }\n\n _createClass(Updates, [{\n key: \"setPayload\",\n value: function setPayload() {\n var payload = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n this.payload = payload;\n return this;\n }\n }, {\n key: \"fetch\",\n value: function fetch() {\n var _this = this;\n\n var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n _utils_gpm__WEBPACK_IMPORTED_MODULE_3__.Instance.fetch(function (response) {\n return _this.setPayload(response);\n }, force);\n return this;\n }\n }, {\n key: \"maintenance\",\n value: function maintenance() {\n var mode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'hide';\n var element = jquery__WEBPACK_IMPORTED_MODULE_0___default()('#updates [data-update-packages]');\n element[mode === 'show' ? 'fadeIn' : 'fadeOut']();\n\n if (mode === 'hide') {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.badges.with-updates').removeClass('with-updates').find('.badge.updates').remove();\n }\n\n return this;\n }\n }, {\n key: \"grav\",\n value: function grav() {\n var payload = this.payload.grav;\n\n if (payload && payload.isUpdatable) {\n var task = this.task;\n var bar = '';\n\n if (!payload.isSymlink) {\n this.updateURL = \"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_2__.config.base_url_relative, \"/update.json/\").concat(task, \"updategrav/admin-nonce\").concat(grav_config__WEBPACK_IMPORTED_MODULE_2__.config.param_sep).concat(grav_config__WEBPACK_IMPORTED_MODULE_2__.config.admin_nonce);\n bar += \"\");\n } else {\n bar += \"\");\n }\n\n bar += \"\\n Grav v\".concat(payload.available, \" \").concat(grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.PLUGIN_ADMIN.IS_NOW_AVAILABLE, \"! (\").concat(grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.PLUGIN_ADMIN.CURRENT, \" v\").concat(payload.version, \")\\n \");\n var element = jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-gpm-grav]').removeClass('hidden');\n\n if (element.is(':empty')) {\n element.hide();\n }\n\n element.addClass('grav').html(\"\".concat(bar)).slideDown(150, function () {\n var c = 5;\n var x = setInterval(function () {\n c -= 1;\n element.find('.pointer-events-none .cnt-down').text('(' + c + 's)');\n }, 1000);\n setTimeout(function () {\n clearInterval(x);\n element.find('.pointer-events-none .cnt-down').remove();\n element.find('.pointer-events-none').removeClass('pointer-events-none');\n }, 5000);\n }).parent('#messages').addClass('default-box-shadow');\n }\n\n return this;\n }\n }, {\n key: \"resources\",\n value: function resources() {\n if (!this.payload || !this.payload.resources || !this.payload.resources.total) {\n return this.maintenance('hide');\n }\n\n var is_current_package_latest = true;\n var map = ['plugins', 'themes'];\n var singles = ['plugin', 'theme'];\n var _this$payload$resourc = this.payload.resources,\n plugins = _this$payload$resourc.plugins,\n themes = _this$payload$resourc.themes;\n\n if (!this.payload.resources.total) {\n return this;\n }\n\n [plugins, themes].forEach(function (resources, index) {\n if (!resources || Array.isArray(resources)) {\n return;\n }\n\n var length = Object.keys(resources).length;\n var type = map[index]; // sidebar\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"#admin-menu a[href$=\\\"/\".concat(map[index], \"\\\"]\")).find('.badges').addClass('with-updates').find('.badge.updates').text(length);\n var type_translation = ''; // update all\n\n if (type === 'plugins') {\n type_translation = grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.PLUGIN_ADMIN.PLUGINS;\n } else {\n type_translation = grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.PLUGIN_ADMIN.THEMES;\n }\n\n var updateAll = jquery__WEBPACK_IMPORTED_MODULE_0___default()(\".grav-update.\".concat(type));\n updateAll.css('display', 'block').html(\"\\n

              \\n \").concat(grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.PLUGIN_ADMIN.UPDATE, \" \").concat(grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.PLUGIN_ADMIN.ALL, \" \").concat(type_translation, \"\\n \\n \").concat(length, \" \").concat(grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.PLUGIN_ADMIN.OF_YOUR, \" \").concat(type_translation.toLowerCase(), \" \").concat(grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.PLUGIN_ADMIN.HAVE_AN_UPDATE_AVAILABLE, \"\\n

              \\n \"));\n var existing_slugs = jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-update-packages]').attr('data-packages-slugs') || '';\n\n if (existing_slugs) {\n existing_slugs = existing_slugs.split(',');\n } else {\n existing_slugs = [];\n }\n\n var slugs = mout_array_unique__WEBPACK_IMPORTED_MODULE_1___default()(existing_slugs.concat(Object.keys(resources))).join();\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-update-packages]').attr('data-packages-slugs', \"\".concat(slugs));\n Object.keys(resources).forEach(function (item) {\n // listing page\n var container = jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"[data-gpm-\".concat(singles[index], \"=\\\"\").concat(item, \"\\\"]\"));\n var element = container.find('.gpm-name');\n var url = element.find('a');\n var content_wrapper = container.parents('.content-wrapper');\n\n if (type === 'plugins' && !element.find('.badge.update').length) {\n element.append(\"\").concat(grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.PLUGIN_ADMIN.UPDATE_AVAILABLE, \"!\"));\n content_wrapper.addClass('has-updates');\n } else if (type === 'themes') {\n element.append(\"\"));\n content_wrapper.addClass('has-updates');\n } // details page\n\n\n if (container.length) {\n var details = jquery__WEBPACK_IMPORTED_MODULE_0___default()(\".grav-update.\".concat(singles[index]));\n\n if (details.length) {\n var releaseType = resources[item].type === 'testing' ? 'test release' : '';\n details.html(\"\\n

              \\n \").concat(grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.PLUGIN_ADMIN.UPDATE, \" \").concat(singles[index].charAt(0).toUpperCase() + singles[index].substr(1).toLowerCase(), \"\\n \\n v\").concat(resources[item].available, \" \").concat(releaseType, \" \").concat(grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.PLUGIN_ADMIN.OF_THIS, \" \").concat(singles[index], \" \").concat(grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.PLUGIN_ADMIN.IS_NOW_AVAILABLE, \"!\\n

              \\n \")).css('display', 'block');\n is_current_package_latest = false;\n }\n }\n });\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-update-packages]').removeClass('hidden');\n });\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.content-wrapper').addClass('updates-checked');\n\n if (!is_current_package_latest) {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.warning-reinstall-not-latest-release').removeClass('hidden');\n }\n }\n }]);\n\n return Updates;\n}();\n\n\nvar Instance = new Updates();\n // automatically refresh UI for updates (graph, sidebar, plugin/themes pages) after every fetch\n\n_utils_gpm__WEBPACK_IMPORTED_MODULE_3__.Instance.on('fetched', function (response, raw) {\n Instance.setPayload(response.payload || {});\n Instance.grav().resources();\n});\n\nif (grav_config__WEBPACK_IMPORTED_MODULE_2__.config.enable_auto_updates_check === '1') {\n _utils_gpm__WEBPACK_IMPORTED_MODULE_3__.Instance.fetch();\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL3VwZGF0ZXMvaW5kZXguanM/MjBmMCJdLCJuYW1lcyI6WyJVcGRhdGVzIiwicGF5bG9hZCIsInNldFBheWxvYWQiLCJ0YXNrIiwiY29uZmlnIiwidXBkYXRlVVJMIiwiZm9yY2UiLCJncG0iLCJyZXNwb25zZSIsIm1vZGUiLCJlbGVtZW50IiwiJCIsInJlbW92ZUNsYXNzIiwiZmluZCIsInJlbW92ZSIsImdyYXYiLCJpc1VwZGF0YWJsZSIsImJhciIsImlzU3ltbGluayIsInRyYW5zbGF0aW9ucyIsImF2YWlsYWJsZSIsInZlcnNpb24iLCJpcyIsImhpZGUiLCJhZGRDbGFzcyIsImh0bWwiLCJzbGlkZURvd24iLCJjIiwieCIsInNldEludGVydmFsIiwidGV4dCIsInNldFRpbWVvdXQiLCJjbGVhckludGVydmFsIiwicGFyZW50IiwicmVzb3VyY2VzIiwidG90YWwiLCJtYWludGVuYW5jZSIsImlzX2N1cnJlbnRfcGFja2FnZV9sYXRlc3QiLCJtYXAiLCJzaW5nbGVzIiwicGx1Z2lucyIsInRoZW1lcyIsImZvckVhY2giLCJpbmRleCIsIkFycmF5IiwiaXNBcnJheSIsImxlbmd0aCIsIk9iamVjdCIsImtleXMiLCJ0eXBlIiwidHlwZV90cmFuc2xhdGlvbiIsInVwZGF0ZUFsbCIsImNzcyIsImpvaW4iLCJ0b0xvd2VyQ2FzZSIsImV4aXN0aW5nX3NsdWdzIiwiYXR0ciIsInNwbGl0Iiwic2x1Z3MiLCJ1bmlxdWUiLCJjb25jYXQiLCJpdGVtIiwiY29udGFpbmVyIiwidXJsIiwiY29udGVudF93cmFwcGVyIiwicGFyZW50cyIsImFwcGVuZCIsImRldGFpbHMiLCJyZWxlYXNlVHlwZSIsImNoYXJBdCIsInRvVXBwZXJDYXNlIiwic3Vic3RyIiwiSW5zdGFuY2UiLCJyYXciXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7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QUhEOztBQUtBLElBQUk5Qix5RUFBQSxLQUFxQyxHQUF6QyxFQUE4QztBQUMxQ0csd0RBQUE7QUFDSCIsImZpbGUiOiIuL2FwcC91cGRhdGVzL2luZGV4LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCB1bmlxdWUgZnJvbSAnbW91dC9hcnJheS91bmlxdWUnO1xuaW1wb3J0IHsgY29uZmlnLCB0cmFuc2xhdGlvbnMgfSBmcm9tICdncmF2LWNvbmZpZyc7XG5pbXBvcnQgeyBJbnN0YW5jZSBhcyBncG0gfSBmcm9tICcuLi91dGlscy9ncG0nO1xuaW1wb3J0IE5vdGlmaWNhdGlvbnMgZnJvbSAnLi9ub3RpZmljYXRpb25zJztcblxuaW1wb3J0IEZlZWQgZnJvbSAnLi9mZWVkJztcbmltcG9ydCAnLi9jaGVjayc7XG5pbXBvcnQgJy4vdXBkYXRlJztcbmltcG9ydCAnLi9jaGFubmVsLXN3aXRjaGVyJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXBkYXRlcyB7XG4gICAgY29uc3RydWN0b3IocGF5bG9hZCA9IHt9KSB7XG4gICAgICAgIHRoaXMuc2V0UGF5bG9hZChwYXlsb2FkKTtcbiAgICAgICAgdGhpcy50YXNrID0gYHRhc2ske2NvbmZpZy5wYXJhbV9zZXB9YDtcbiAgICAgICAgdGhpcy51cGRhdGVVUkwgPSAnJztcbiAgICB9XG5cbiAgICBzZXRQYXlsb2FkKHBheWxvYWQgPSB7fSkge1xuICAgICAgICB0aGlzLnBheWxvYWQgPSBwYXlsb2FkO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZldGNoKGZvcmNlID0gZmFsc2UpIHtcbiAgICAgICAgZ3BtLmZldGNoKChyZXNwb25zZSkgPT4gdGhpcy5zZXRQYXlsb2FkKHJlc3BvbnNlKSwgZm9yY2UpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIG1haW50ZW5hbmNlKG1vZGUgPSAnaGlkZScpIHtcbiAgICAgICAgbGV0IGVsZW1lbnQgPSAkKCcjdXBkYXRlcyBbZGF0YS11cGRhdGUtcGFja2FnZXNdJyk7XG5cbiAgICAgICAgZWxlbWVudFttb2RlID09PSAnc2hvdycgPyAnZmFkZUluJyA6ICdmYWRlT3V0J10oKTtcblxuICAgICAgICBpZiAobW9kZSA9PT0gJ2hpZGUnKSB7XG4gICAgICAgICAgICAkKCcuYmFkZ2VzLndpdGgtdXBkYXRlcycpLnJlbW92ZUNsYXNzKCd3aXRoLXVwZGF0ZXMnKS5maW5kKCcuYmFkZ2UudXBkYXRlcycpLnJlbW92ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZ3JhdigpIHtcbiAgICAgICAgbGV0IHBheWxvYWQgPSB0aGlzLnBheWxvYWQuZ3JhdjtcblxuICAgICAgICBpZiAocGF5bG9hZCAmJiBwYXlsb2FkLmlzVXBkYXRhYmxlKSB7XG4gICAgICAgICAgICBsZXQgdGFzayA9IHRoaXMudGFzaztcbiAgICAgICAgICAgIGxldCBiYXIgPSAnJztcblxuICAgICAgICAgICAgaWYgKCFwYXlsb2FkLmlzU3ltbGluaykge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVVJMID0gYCR7Y29uZmlnLmJhc2VfdXJsX3JlbGF0aXZlfS91cGRhdGUuanNvbi8ke3Rhc2t9dXBkYXRlZ3Jhdi9hZG1pbi1ub25jZSR7Y29uZmlnLnBhcmFtX3NlcH0ke2NvbmZpZy5hZG1pbl9ub25jZX1gO1xuICAgICAgICAgICAgICAgIGJhciArPSBgPGJ1dHRvbiBkYXRhLXJlbW9kYWwtdGFyZ2V0PVwidXBkYXRlLWdyYXZcIiBjbGFzcz1cImJ1dHRvbiBidXR0b24tc21hbGwgc2Vjb25kYXJ5IHBvaW50ZXItZXZlbnRzLW5vbmVcIiBpZD1cImdyYXYtdXBkYXRlLWJ1dHRvblwiPiR7dHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5VUERBVEVfR1JBVl9OT1d9IDxzcGFuIGNsYXNzPVwiY250LWRvd25cIj4oNXMpPC9zcGFuPjwvYnV0dG9uPmA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGJhciArPSBgPHNwYW4gY2xhc3M9XCJoaW50LS1sZWZ0XCIgc3R5bGU9XCJmbG9hdDogcmlnaHQ7XCIgZGF0YS1oaW50PVwiJHt0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLkdSQVZfU1lNQk9MSUNBTExZX0xJTktFRH1cIj48aSBjbGFzcz1cImZhIGZhLWZ3IGZhLWxpbmtcIj48L2k+PC9zcGFuPmA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJhciArPSBgXG4gICAgICAgICAgICAgICAgR3JhdiA8Yj52JHtwYXlsb2FkLmF2YWlsYWJsZX08L2I+ICR7dHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5JU19OT1dfQVZBSUxBQkxFfSEgPHNwYW4gY2xhc3M9XCJsZXNzXCI+KCR7dHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5DVVJSRU5UfSB2JHtwYXlsb2FkLnZlcnNpb259KTwvc3Bhbj5cbiAgICAgICAgICAgIGA7XG5cbiAgICAgICAgICAgIGxldCBlbGVtZW50ID0gJCgnW2RhdGEtZ3BtLWdyYXZdJykucmVtb3ZlQ2xhc3MoJ2hpZGRlbicpO1xuXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5pcygnOmVtcHR5JykpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmhpZGUoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZWxlbWVudFxuICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnZ3JhdicpXG4gICAgICAgICAgICAgICAgLmh0bWwoYCR7YmFyfWApXG4gICAgICAgICAgICAgICAgLnNsaWRlRG93bigxNTAsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IDU7XG4gICAgICAgICAgICAgICAgICAgIHZhciB4ID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjIC09IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmZpbmQoJy5wb2ludGVyLWV2ZW50cy1ub25lIC5jbnQtZG93bicpLnRleHQoJygnICsgYyArICdzKScpO1xuICAgICAgICAgICAgICAgICAgICB9LCAxMDAwKTtcblxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuZmluZCgnLnBvaW50ZXItZXZlbnRzLW5vbmUgLmNudC1kb3duJykucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmZpbmQoJy5wb2ludGVyLWV2ZW50cy1ub25lJykucmVtb3ZlQ2xhc3MoJ3BvaW50ZXItZXZlbnRzLW5vbmUnKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgNTAwMCk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAucGFyZW50KCcjbWVzc2FnZXMnKS5hZGRDbGFzcygnZGVmYXVsdC1ib3gtc2hhZG93Jyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICByZXNvdXJjZXMoKSB7XG4gICAgICAgIGlmICghdGhpcy5wYXlsb2FkIHx8ICF0aGlzLnBheWxvYWQucmVzb3VyY2VzIHx8ICF0aGlzLnBheWxvYWQucmVzb3VyY2VzLnRvdGFsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tYWludGVuYW5jZSgnaGlkZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGlzX2N1cnJlbnRfcGFja2FnZV9sYXRlc3QgPSB0cnVlO1xuICAgICAgICBsZXQgbWFwID0gWydwbHVnaW5zJywgJ3RoZW1lcyddO1xuICAgICAgICBsZXQgc2luZ2xlcyA9IFsncGx1Z2luJywgJ3RoZW1lJ107XG4gICAgICAgIGxldCB7IHBsdWdpbnMsIHRoZW1lcyB9ID0gdGhpcy5wYXlsb2FkLnJlc291cmNlcztcblxuICAgICAgICBpZiAoIXRoaXMucGF5bG9hZC5yZXNvdXJjZXMudG90YWwpIHsgcmV0dXJuIHRoaXM7IH1cblxuICAgICAgICBbcGx1Z2lucywgdGhlbWVzXS5mb3JFYWNoKGZ1bmN0aW9uKHJlc291cmNlcywgaW5kZXgpIHtcbiAgICAgICAgICAgIGlmICghcmVzb3VyY2VzIHx8IEFycmF5LmlzQXJyYXkocmVzb3VyY2VzKSkgeyByZXR1cm47IH1cbiAgICAgICAgICAgIGxldCBsZW5ndGggPSBPYmplY3Qua2V5cyhyZXNvdXJjZXMpLmxlbmd0aDtcbiAgICAgICAgICAgIGxldCB0eXBlID0gbWFwW2luZGV4XTtcblxuICAgICAgICAgICAgLy8gc2lkZWJhclxuICAgICAgICAgICAgJChgI2FkbWluLW1lbnUgYVtocmVmJD1cIi8ke21hcFtpbmRleF19XCJdYClcbiAgICAgICAgICAgICAgICAuZmluZCgnLmJhZGdlcycpXG4gICAgICAgICAgICAgICAgLmFkZENsYXNzKCd3aXRoLXVwZGF0ZXMnKVxuICAgICAgICAgICAgICAgIC5maW5kKCcuYmFkZ2UudXBkYXRlcycpLnRleHQobGVuZ3RoKTtcblxuICAgICAgICAgICAgdmFyIHR5cGVfdHJhbnNsYXRpb24gPSAnJztcbiAgICAgICAgICAgIC8vIHVwZGF0ZSBhbGxcblxuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdwbHVnaW5zJykge1xuICAgICAgICAgICAgICAgIHR5cGVfdHJhbnNsYXRpb24gPSB0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLlBMVUdJTlM7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHR5cGVfdHJhbnNsYXRpb24gPSB0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLlRIRU1FUztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHVwZGF0ZUFsbCA9ICQoYC5ncmF2LXVwZGF0ZS4ke3R5cGV9YCk7XG4gICAgICAgICAgICB1cGRhdGVBbGwuY3NzKCdkaXNwbGF5JywgJ2Jsb2NrJykuaHRtbChgXG4gICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYnV0dG9uIGJ1dHRvbi1zbWFsbCBzZWNvbmRhcnlcIiBkYXRhLXJlbW9kYWwtdGFyZ2V0PVwidXBkYXRlLXBhY2thZ2VzXCIgZGF0YS1wYWNrYWdlcy1zbHVncz1cIiR7T2JqZWN0LmtleXMocmVzb3VyY2VzKS5qb2luKCl9XCIgZGF0YS0ke3NpbmdsZXNbaW5kZXhdfS1hY3Rpb249XCJzdGFydC1wYWNrYWdlcy11cGRhdGVcIj4ke3RyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uVVBEQVRFfSAke3RyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uQUxMfSAke3R5cGVfdHJhbnNsYXRpb259PC9hPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYnVsbGhvcm5cIj48L2k+XG4gICAgICAgICAgICAgICAgJHtsZW5ndGh9ICR7dHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5PRl9ZT1VSfSAke3R5cGVfdHJhbnNsYXRpb24udG9Mb3dlckNhc2UoKX0gJHt0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLkhBVkVfQU5fVVBEQVRFX0FWQUlMQUJMRX1cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIGApO1xuXG4gICAgICAgICAgICBsZXQgZXhpc3Rpbmdfc2x1Z3MgPSAkKCdbZGF0YS11cGRhdGUtcGFja2FnZXNdJykuYXR0cignZGF0YS1wYWNrYWdlcy1zbHVncycpIHx8ICcnO1xuXG4gICAgICAgICAgICBpZiAoZXhpc3Rpbmdfc2x1Z3MpIHtcbiAgICAgICAgICAgICAgICBleGlzdGluZ19zbHVncyA9IGV4aXN0aW5nX3NsdWdzLnNwbGl0KCcsJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGV4aXN0aW5nX3NsdWdzID0gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBzbHVncyA9IHVuaXF1ZShleGlzdGluZ19zbHVncy5jb25jYXQoT2JqZWN0LmtleXMocmVzb3VyY2VzKSkpLmpvaW4oKTtcbiAgICAgICAgICAgICQoJ1tkYXRhLXVwZGF0ZS1wYWNrYWdlc10nKS5hdHRyKCdkYXRhLXBhY2thZ2VzLXNsdWdzJywgYCR7c2x1Z3N9YCk7XG5cbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHJlc291cmNlcykuZm9yRWFjaChmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgICAgICAgICAgLy8gbGlzdGluZyBwYWdlXG4gICAgICAgICAgICAgICAgbGV0IGNvbnRhaW5lciA9ICQoYFtkYXRhLWdwbS0ke3NpbmdsZXNbaW5kZXhdfT1cIiR7aXRlbX1cIl1gKTtcbiAgICAgICAgICAgICAgICBsZXQgZWxlbWVudCA9IGNvbnRhaW5lci5maW5kKCcuZ3BtLW5hbWUnKTtcbiAgICAgICAgICAgICAgICBsZXQgdXJsID0gZWxlbWVudC5maW5kKCdhJyk7XG4gICAgICAgICAgICAgICAgbGV0IGNvbnRlbnRfd3JhcHBlciA9IGNvbnRhaW5lci5wYXJlbnRzKCcuY29udGVudC13cmFwcGVyJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3BsdWdpbnMnICYmICFlbGVtZW50LmZpbmQoJy5iYWRnZS51cGRhdGUnKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5hcHBlbmQoYDxhIGNsYXNzPVwicGx1Z2luLXVwZGF0ZS1idXR0b25cIiBocmVmPVwiJHt1cmwuYXR0cignaHJlZicpfVwiPjxzcGFuIGNsYXNzPVwiYmFkZ2UgdXBkYXRlXCI+JHt0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLlVQREFURV9BVkFJTEFCTEV9ITwvc3Bhbj48L2E+YCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfd3JhcHBlci5hZGRDbGFzcygnaGFzLXVwZGF0ZXMnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICd0aGVtZXMnKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuYXBwZW5kKGA8ZGl2IGNsYXNzPVwiZ3BtLXJpYmJvblwiPjxhIGhyZWY9XCIke3VybC5hdHRyKCdocmVmJyl9XCI+JHt0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLlVQREFURS50b1VwcGVyQ2FzZSgpfTwvYT48L2Rpdj5gKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudF93cmFwcGVyLmFkZENsYXNzKCdoYXMtdXBkYXRlcycpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGRldGFpbHMgcGFnZVxuICAgICAgICAgICAgICAgIGlmIChjb250YWluZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkZXRhaWxzID0gJChgLmdyYXYtdXBkYXRlLiR7c2luZ2xlc1tpbmRleF19YCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXRhaWxzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlbGVhc2VUeXBlID0gcmVzb3VyY2VzW2l0ZW1dLnR5cGUgPT09ICd0ZXN0aW5nJyA/ICc8c3BhbiBjbGFzcz1cImdwbS10ZXN0aW5nXCI+dGVzdCByZWxlYXNlPC9zcGFuPicgOiAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbHMuaHRtbChgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJidXR0b24gYnV0dG9uLXNtYWxsIHNlY29uZGFyeVwiIGRhdGEtcmVtb2RhbC10YXJnZXQ9XCJ1cGRhdGUtcGFja2FnZXNcIiBkYXRhLXBhY2thZ2VzLXNsdWdzPVwiJHtpdGVtfVwiIGRhdGEtJHtzaW5nbGVzW2luZGV4XX0tYWN0aW9uPVwic3RhcnQtcGFja2FnZS1pbnN0YWxsYXRpb25cIj4ke3RyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uVVBEQVRFfSAke3NpbmdsZXNbaW5kZXhdLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc2luZ2xlc1tpbmRleF0uc3Vic3RyKDEpLnRvTG93ZXJDYXNlKCl9PC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWJ1bGxob3JuXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPnYke3Jlc291cmNlc1tpdGVtXS5hdmFpbGFibGV9PC9zdHJvbmc+ICR7cmVsZWFzZVR5cGV9ICR7dHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5PRl9USElTfSAke3NpbmdsZXNbaW5kZXhdfSAke3RyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uSVNfTk9XX0FWQUlMQUJMRX0hXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgYCkuY3NzKCdkaXNwbGF5JywgJ2Jsb2NrJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlzX2N1cnJlbnRfcGFja2FnZV9sYXRlc3QgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAkKCdbZGF0YS11cGRhdGUtcGFja2FnZXNdJykucmVtb3ZlQ2xhc3MoJ2hpZGRlbicpO1xuICAgICAgICB9KTtcblxuICAgICAgICAkKCcuY29udGVudC13cmFwcGVyJykuYWRkQ2xhc3MoJ3VwZGF0ZXMtY2hlY2tlZCcpO1xuXG4gICAgICAgIGlmICghaXNfY3VycmVudF9wYWNrYWdlX2xhdGVzdCkge1xuICAgICAgICAgICAgJCgnLndhcm5pbmctcmVpbnN0YWxsLW5vdC1sYXRlc3QtcmVsZWFzZScpLnJlbW92ZUNsYXNzKCdoaWRkZW4nKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxubGV0IEluc3RhbmNlID0gbmV3IFVwZGF0ZXMoKTtcbmV4cG9ydCB7IEluc3RhbmNlLCBOb3RpZmljYXRpb25zLCBGZWVkIH07XG5cbi8vIGF1dG9tYXRpY2FsbHkgcmVmcmVzaCBVSSBmb3IgdXBkYXRlcyAoZ3JhcGgsIHNpZGViYXIsIHBsdWdpbi90aGVtZXMgcGFnZXMpIGFmdGVyIGV2ZXJ5IGZldGNoXG5ncG0ub24oJ2ZldGNoZWQnLCAocmVzcG9uc2UsIHJhdykgPT4ge1xuICAgIEluc3RhbmNlLnNldFBheWxvYWQocmVzcG9uc2UucGF5bG9hZCB8fCB7fSk7XG4gICAgSW5zdGFuY2UuZ3JhdigpLnJlc291cmNlcygpO1xufSk7XG5cbmlmIChjb25maWcuZW5hYmxlX2F1dG9fdXBkYXRlc19jaGVjayA9PT0gJzEnKSB7XG4gICAgZ3BtLmZldGNoKCk7XG59XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./app/updates/index.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Updates),\n/* harmony export */ \"Instance\": () => (/* binding */ Instance),\n/* harmony export */ \"Notifications\": () => (/* reexport safe */ _notifications__WEBPACK_IMPORTED_MODULE_4__.default),\n/* harmony export */ \"Feed\": () => (/* reexport safe */ _feed__WEBPACK_IMPORTED_MODULE_5__.default)\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var mout_array_unique__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! mout/array/unique */ \"./node_modules/mout/array/unique.js\");\n/* harmony import */ var mout_array_unique__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(mout_array_unique__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! grav-config */ \"grav-config\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(grav_config__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _utils_gpm__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/gpm */ \"./app/utils/gpm.js\");\n/* harmony import */ var _notifications__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./notifications */ \"./app/updates/notifications.js\");\n/* harmony import */ var _feed__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./feed */ \"./app/updates/feed.js\");\n/* harmony import */ var _check__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./check */ \"./app/updates/check.js\");\n/* harmony import */ var _update__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./update */ \"./app/updates/update.js\");\n/* harmony import */ var _channel_switcher__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./channel-switcher */ \"./app/updates/channel-switcher.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\n\n\n\n\n\n\n\nvar Updates = /*#__PURE__*/function () {\n function Updates() {\n var payload = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n _classCallCheck(this, Updates);\n\n this.setPayload(payload);\n this.task = \"task\".concat(grav_config__WEBPACK_IMPORTED_MODULE_2__.config.param_sep);\n this.updateURL = '';\n }\n\n _createClass(Updates, [{\n key: \"setPayload\",\n value: function setPayload() {\n var payload = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n this.payload = payload;\n return this;\n }\n }, {\n key: \"fetch\",\n value: function fetch() {\n var _this = this;\n\n var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n _utils_gpm__WEBPACK_IMPORTED_MODULE_3__.Instance.fetch(function (response) {\n return _this.setPayload(response);\n }, force);\n return this;\n }\n }, {\n key: \"maintenance\",\n value: function maintenance() {\n var mode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'hide';\n var element = jquery__WEBPACK_IMPORTED_MODULE_0___default()('#updates [data-update-packages]');\n element[mode === 'show' ? 'fadeIn' : 'fadeOut']();\n\n if (mode === 'hide') {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.badges.with-updates').removeClass('with-updates').find('.badge.updates').remove();\n }\n\n return this;\n }\n }, {\n key: \"grav\",\n value: function grav() {\n var payload = this.payload.grav;\n\n if (payload && payload.isUpdatable) {\n var task = this.task;\n var bar = '';\n\n if (!payload.isSymlink) {\n this.updateURL = \"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_2__.config.base_url_relative, \"/update.json/\").concat(task, \"updategrav/admin-nonce\").concat(grav_config__WEBPACK_IMPORTED_MODULE_2__.config.param_sep).concat(grav_config__WEBPACK_IMPORTED_MODULE_2__.config.admin_nonce);\n bar += \"\");\n } else {\n bar += \"\");\n }\n\n bar += \"\\n Grav v\".concat(payload.available, \" \").concat(grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.PLUGIN_ADMIN.IS_NOW_AVAILABLE, \"! (\").concat(grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.PLUGIN_ADMIN.CURRENT, \" v\").concat(payload.version, \")\\n \");\n var element = jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-gpm-grav]').removeClass('hidden');\n\n if (element.is(':empty')) {\n element.hide();\n }\n\n element.addClass('grav').html(\"\".concat(bar)).slideDown(150, function () {\n var c = 5;\n var x = setInterval(function () {\n c -= 1;\n element.find('.pointer-events-none .cnt-down').text('(' + c + 's)');\n }, 1000);\n setTimeout(function () {\n clearInterval(x);\n element.find('.pointer-events-none .cnt-down').remove();\n element.find('.pointer-events-none').removeClass('pointer-events-none');\n }, 5000);\n }).parent('#messages').addClass('default-box-shadow');\n }\n\n return this;\n }\n }, {\n key: \"resources\",\n value: function resources() {\n if (!this.payload || !this.payload.resources || !this.payload.resources.total) {\n return this.maintenance('hide');\n }\n\n var is_current_package_latest = true;\n var map = ['plugins', 'themes'];\n var singles = ['plugin', 'theme'];\n var _this$payload$resourc = this.payload.resources,\n plugins = _this$payload$resourc.plugins,\n themes = _this$payload$resourc.themes;\n\n if (!this.payload.resources.total) {\n return this;\n }\n\n [plugins, themes].forEach(function (resources, index) {\n if (!resources || Array.isArray(resources)) {\n return;\n }\n\n var length = Object.keys(resources).length;\n var type = map[index]; // sidebar\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"#admin-menu a[href$=\\\"/\".concat(map[index], \"\\\"]\")).find('.badges').addClass('with-updates').find('.badge.updates').text(length);\n var type_translation = ''; // update all\n\n if (type === 'plugins') {\n type_translation = grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.PLUGIN_ADMIN.PLUGINS;\n } else {\n type_translation = grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.PLUGIN_ADMIN.THEMES;\n }\n\n var updateAll = jquery__WEBPACK_IMPORTED_MODULE_0___default()(\".grav-update.\".concat(type));\n updateAll.css('display', 'block').html(\"\\n

              \\n \").concat(grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.PLUGIN_ADMIN.UPDATE, \" \").concat(grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.PLUGIN_ADMIN.ALL, \" \").concat(type_translation, \"\\n \\n \").concat(length, \" \").concat(grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.PLUGIN_ADMIN.OF_YOUR, \" \").concat(type_translation.toLowerCase(), \" \").concat(grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.PLUGIN_ADMIN.HAVE_AN_UPDATE_AVAILABLE, \"\\n

              \\n \"));\n var existing_slugs = jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-update-packages]').attr('data-packages-slugs') || '';\n\n if (existing_slugs) {\n existing_slugs = existing_slugs.split(',');\n } else {\n existing_slugs = [];\n }\n\n var slugs = mout_array_unique__WEBPACK_IMPORTED_MODULE_1___default()(existing_slugs.concat(Object.keys(resources))).join();\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-update-packages]').attr('data-packages-slugs', \"\".concat(slugs));\n Object.keys(resources).forEach(function (item) {\n // listing page\n var container = jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"[data-gpm-\".concat(singles[index], \"=\\\"\").concat(item, \"\\\"]\"));\n var element = container.find('.gpm-name');\n var url = element.find('a');\n var content_wrapper = container.parents('.content-wrapper');\n\n if (type === 'plugins' && !element.find('.badge.update').length) {\n element.append(\"\").concat(grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.PLUGIN_ADMIN.UPDATE_AVAILABLE, \"!\"));\n content_wrapper.addClass('has-updates');\n } else if (type === 'themes') {\n element.append(\"\"));\n content_wrapper.addClass('has-updates');\n } // details page\n\n\n if (container.length) {\n var details = jquery__WEBPACK_IMPORTED_MODULE_0___default()(\".grav-update.\".concat(singles[index]));\n\n if (details.length) {\n var releaseType = resources[item].type === 'testing' ? 'test release' : '';\n details.html(\"\\n

              \\n \").concat(grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.PLUGIN_ADMIN.UPDATE, \" \").concat(singles[index].charAt(0).toUpperCase() + singles[index].substr(1).toLowerCase(), \"\\n \\n v\").concat(resources[item].available, \" \").concat(releaseType, \" \").concat(grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.PLUGIN_ADMIN.OF_THIS, \" \").concat(singles[index], \" \").concat(grav_config__WEBPACK_IMPORTED_MODULE_2__.translations.PLUGIN_ADMIN.IS_NOW_AVAILABLE, \"!\\n

              \\n \")).css('display', 'block');\n is_current_package_latest = false;\n }\n }\n });\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-update-packages]').removeClass('hidden');\n });\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.content-wrapper').addClass('updates-checked');\n\n if (!is_current_package_latest) {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.warning-reinstall-not-latest-release').removeClass('hidden');\n }\n }\n }]);\n\n return Updates;\n}();\n\n\nvar Instance = new Updates();\n // automatically refresh UI for updates (graph, sidebar, plugin/themes pages) after every fetch\n\n_utils_gpm__WEBPACK_IMPORTED_MODULE_3__.Instance.on('fetched', function (response, raw) {\n Instance.setPayload(response.payload || {});\n Instance.grav().resources();\n});\n\nif (grav_config__WEBPACK_IMPORTED_MODULE_2__.config.enable_auto_updates_check === '1') {\n _utils_gpm__WEBPACK_IMPORTED_MODULE_3__.Instance.fetch();\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL3VwZGF0ZXMvaW5kZXguanM/MjBmMCJdLCJuYW1lcyI6WyJVcGRhdGVzIiwicGF5bG9hZCIsInNldFBheWxvYWQiLCJ0YXNrIiwiY29uZmlnIiwidXBkYXRlVVJMIiwiZm9yY2UiLCJncG0iLCJyZXNwb25zZSIsIm1vZGUiLCJlbGVtZW50IiwiJCIsInJlbW92ZUNsYXNzIiwiZmluZCIsInJlbW92ZSIsImdyYXYiLCJpc1VwZGF0YWJsZSIsImJhciIsImlzU3ltbGluayIsInRyYW5zbGF0aW9ucyIsImF2YWlsYWJsZSIsInZlcnNpb24iLCJpcyIsImhpZGUiLCJhZGRDbGFzcyIsImh0bWwiLCJzbGlkZURvd24iLCJjIiwieCIsInNldEludGVydmFsIiwidGV4dCIsInNldFRpbWVvdXQiLCJjbGVhckludGVydmFsIiwicGFyZW50IiwicmVzb3VyY2VzIiwidG90YWwiLCJtYWludGVuYW5jZSIsImlzX2N1cnJlbnRfcGFja2FnZV9sYXRlc3QiLCJtYXAiLCJzaW5nbGVzIiwicGx1Z2lucyIsInRoZW1lcyIsImZvckVhY2giLCJpbmRleCIsIkFycmF5IiwiaXNBcnJheSIsImxlbmd0aCIsIk9iamVjdCIsImtleXMiLCJ0eXBlIiwidHlwZV90cmFuc2xhdGlvbiIsInVwZGF0ZUFsbCIsImNzcyIsImpvaW4iLCJ0b0xvd2VyQ2FzZSIsImV4aXN0aW5nX3NsdWdzIiwiYXR0ciIsInNwbGl0Iiwic2x1Z3MiLCJ1bmlxdWUiLCJjb25jYXQiLCJpdGVtIiwiY29udGFpbmVyIiwidXJsIiwiY29udGVudF93cmFwcGVyIiwicGFyZW50cyIsImFwcGVuZCIsImRldGFpbHMiLCJyZWxlYXNlVHlwZSIsImNoYXJBdCIsInRvVXBwZXJDYXNlIiwic3Vic3RyIiwiSW5zdGFuY2UiLCJyYXciXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7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SUFBVCxHQUFnQm1CLFNBQWhCO0FBQ0gsQ0FIRDs7QUFLQSxJQUFJOUIseUVBQUEsS0FBcUMsR0FBekMsRUFBOEM7QUFDMUNHLHdEQUFBO0FBQ0giLCJmaWxlIjoiLi9hcHAvdXBkYXRlcy9pbmRleC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgdW5pcXVlIGZyb20gJ21vdXQvYXJyYXkvdW5pcXVlJztcbmltcG9ydCB7IGNvbmZpZywgdHJhbnNsYXRpb25zIH0gZnJvbSAnZ3Jhdi1jb25maWcnO1xuaW1wb3J0IHsgSW5zdGFuY2UgYXMgZ3BtIH0gZnJvbSAnLi4vdXRpbHMvZ3BtJztcbmltcG9ydCBOb3RpZmljYXRpb25zIGZyb20gJy4vbm90aWZpY2F0aW9ucyc7XG5cbmltcG9ydCBGZWVkIGZyb20gJy4vZmVlZCc7XG5pbXBvcnQgJy4vY2hlY2snO1xuaW1wb3J0ICcuL3VwZGF0ZSc7XG5pbXBvcnQgJy4vY2hhbm5lbC1zd2l0Y2hlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFVwZGF0ZXMge1xuICAgIGNvbnN0cnVjdG9yKHBheWxvYWQgPSB7fSkge1xuICAgICAgICB0aGlzLnNldFBheWxvYWQocGF5bG9hZCk7XG4gICAgICAgIHRoaXMudGFzayA9IGB0YXNrJHtjb25maWcucGFyYW1fc2VwfWA7XG4gICAgICAgIHRoaXMudXBkYXRlVVJMID0gJyc7XG4gICAgfVxuXG4gICAgc2V0UGF5bG9hZChwYXlsb2FkID0ge30pIHtcbiAgICAgICAgdGhpcy5wYXlsb2FkID0gcGF5bG9hZDtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBmZXRjaChmb3JjZSA9IGZhbHNlKSB7XG4gICAgICAgIGdwbS5mZXRjaCgocmVzcG9uc2UpID0+IHRoaXMuc2V0UGF5bG9hZChyZXNwb25zZSksIGZvcmNlKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBtYWludGVuYW5jZShtb2RlID0gJ2hpZGUnKSB7XG4gICAgICAgIGxldCBlbGVtZW50ID0gJCgnI3VwZGF0ZXMgW2RhdGEtdXBkYXRlLXBhY2thZ2VzXScpO1xuXG4gICAgICAgIGVsZW1lbnRbbW9kZSA9PT0gJ3Nob3cnID8gJ2ZhZGVJbicgOiAnZmFkZU91dCddKCk7XG5cbiAgICAgICAgaWYgKG1vZGUgPT09ICdoaWRlJykge1xuICAgICAgICAgICAgJCgnLmJhZGdlcy53aXRoLXVwZGF0ZXMnKS5yZW1vdmVDbGFzcygnd2l0aC11cGRhdGVzJykuZmluZCgnLmJhZGdlLnVwZGF0ZXMnKS5yZW1vdmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGdyYXYoKSB7XG4gICAgICAgIGxldCBwYXlsb2FkID0gdGhpcy5wYXlsb2FkLmdyYXY7XG5cbiAgICAgICAgaWYgKHBheWxvYWQgJiYgcGF5bG9hZC5pc1VwZGF0YWJsZSkge1xuICAgICAgICAgICAgbGV0IHRhc2sgPSB0aGlzLnRhc2s7XG4gICAgICAgICAgICBsZXQgYmFyID0gJyc7XG5cbiAgICAgICAgICAgIGlmICghcGF5bG9hZC5pc1N5bWxpbmspIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVVSTCA9IGAke2NvbmZpZy5iYXNlX3VybF9yZWxhdGl2ZX0vdXBkYXRlLmpzb24vJHt0YXNrfXVwZGF0ZWdyYXYvYWRtaW4tbm9uY2Uke2NvbmZpZy5wYXJhbV9zZXB9JHtjb25maWcuYWRtaW5fbm9uY2V9YDtcbiAgICAgICAgICAgICAgICBiYXIgKz0gYDxidXR0b24gZGF0YS1yZW1vZGFsLXRhcmdldD1cInVwZGF0ZS1ncmF2XCIgY2xhc3M9XCJidXR0b24gYnV0dG9uLXNtYWxsIHNlY29uZGFyeSBwb2ludGVyLWV2ZW50cy1ub25lXCIgaWQ9XCJncmF2LXVwZGF0ZS1idXR0b25cIj4ke3RyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uVVBEQVRFX0dSQVZfTk9XfSA8c3BhbiBjbGFzcz1cImNudC1kb3duXCI+KDVzKTwvc3Bhbj48L2J1dHRvbj5gO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBiYXIgKz0gYDxzcGFuIGNsYXNzPVwiaGludC0tbGVmdFwiIHN0eWxlPVwiZmxvYXQ6IHJpZ2h0O1wiIGRhdGEtaGludD1cIiR7dHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5HUkFWX1NZTUJPTElDQUxMWV9MSU5LRUR9XCI+PGkgY2xhc3M9XCJmYSBmYS1mdyBmYS1saW5rXCI+PC9pPjwvc3Bhbj5gO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBiYXIgKz0gYFxuICAgICAgICAgICAgICAgIEdyYXYgPGI+diR7cGF5bG9hZC5hdmFpbGFibGV9PC9iPiAke3RyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uSVNfTk9XX0FWQUlMQUJMRX0hIDxzcGFuIGNsYXNzPVwibGVzc1wiPigke3RyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uQ1VSUkVOVH0gdiR7cGF5bG9hZC52ZXJzaW9ufSk8L3NwYW4+XG4gICAgICAgICAgICBgO1xuXG4gICAgICAgICAgICBsZXQgZWxlbWVudCA9ICQoJ1tkYXRhLWdwbS1ncmF2XScpLnJlbW92ZUNsYXNzKCdoaWRkZW4nKTtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQuaXMoJzplbXB0eScpKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5oaWRlKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2dyYXYnKVxuICAgICAgICAgICAgICAgIC5odG1sKGAke2Jhcn1gKVxuICAgICAgICAgICAgICAgIC5zbGlkZURvd24oMTUwLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSA1O1xuICAgICAgICAgICAgICAgICAgICB2YXIgeCA9IHNldEludGVydmFsKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYyAtPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5maW5kKCcucG9pbnRlci1ldmVudHMtbm9uZSAuY250LWRvd24nKS50ZXh0KCcoJyArIGMgKyAncyknKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgMTAwMCk7XG5cbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoeCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmZpbmQoJy5wb2ludGVyLWV2ZW50cy1ub25lIC5jbnQtZG93bicpLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5maW5kKCcucG9pbnRlci1ldmVudHMtbm9uZScpLnJlbW92ZUNsYXNzKCdwb2ludGVyLWV2ZW50cy1ub25lJyk7XG4gICAgICAgICAgICAgICAgICAgIH0sIDUwMDApO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnBhcmVudCgnI21lc3NhZ2VzJykuYWRkQ2xhc3MoJ2RlZmF1bHQtYm94LXNoYWRvdycpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcmVzb3VyY2VzKCkge1xuICAgICAgICBpZiAoIXRoaXMucGF5bG9hZCB8fCAhdGhpcy5wYXlsb2FkLnJlc291cmNlcyB8fCAhdGhpcy5wYXlsb2FkLnJlc291cmNlcy50b3RhbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFpbnRlbmFuY2UoJ2hpZGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBpc19jdXJyZW50X3BhY2thZ2VfbGF0ZXN0ID0gdHJ1ZTtcbiAgICAgICAgbGV0IG1hcCA9IFsncGx1Z2lucycsICd0aGVtZXMnXTtcbiAgICAgICAgbGV0IHNpbmdsZXMgPSBbJ3BsdWdpbicsICd0aGVtZSddO1xuICAgICAgICBsZXQgeyBwbHVnaW5zLCB0aGVtZXMgfSA9IHRoaXMucGF5bG9hZC5yZXNvdXJjZXM7XG5cbiAgICAgICAgaWYgKCF0aGlzLnBheWxvYWQucmVzb3VyY2VzLnRvdGFsKSB7IHJldHVybiB0aGlzOyB9XG5cbiAgICAgICAgW3BsdWdpbnMsIHRoZW1lc10uZm9yRWFjaChmdW5jdGlvbihyZXNvdXJjZXMsIGluZGV4KSB7XG4gICAgICAgICAgICBpZiAoIXJlc291cmNlcyB8fCBBcnJheS5pc0FycmF5KHJlc291cmNlcykpIHsgcmV0dXJuOyB9XG4gICAgICAgICAgICBsZXQgbGVuZ3RoID0gT2JqZWN0LmtleXMocmVzb3VyY2VzKS5sZW5ndGg7XG4gICAgICAgICAgICBsZXQgdHlwZSA9IG1hcFtpbmRleF07XG5cbiAgICAgICAgICAgIC8vIHNpZGViYXJcbiAgICAgICAgICAgICQoYCNhZG1pbi1tZW51IGFbaHJlZiQ9XCIvJHttYXBbaW5kZXhdfVwiXWApXG4gICAgICAgICAgICAgICAgLmZpbmQoJy5iYWRnZXMnKVxuICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnd2l0aC11cGRhdGVzJylcbiAgICAgICAgICAgICAgICAuZmluZCgnLmJhZGdlLnVwZGF0ZXMnKS50ZXh0KGxlbmd0aCk7XG5cbiAgICAgICAgICAgIHZhciB0eXBlX3RyYW5zbGF0aW9uID0gJyc7XG4gICAgICAgICAgICAvLyB1cGRhdGUgYWxsXG5cbiAgICAgICAgICAgIGlmICh0eXBlID09PSAncGx1Z2lucycpIHtcbiAgICAgICAgICAgICAgICB0eXBlX3RyYW5zbGF0aW9uID0gdHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5QTFVHSU5TO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0eXBlX3RyYW5zbGF0aW9uID0gdHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5USEVNRVM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB1cGRhdGVBbGwgPSAkKGAuZ3Jhdi11cGRhdGUuJHt0eXBlfWApO1xuICAgICAgICAgICAgdXBkYXRlQWxsLmNzcygnZGlzcGxheScsICdibG9jaycpLmh0bWwoYFxuICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cImJ1dHRvbiBidXR0b24tc21hbGwgc2Vjb25kYXJ5XCIgZGF0YS1yZW1vZGFsLXRhcmdldD1cInVwZGF0ZS1wYWNrYWdlc1wiIGRhdGEtcGFja2FnZXMtc2x1Z3M9XCIke09iamVjdC5rZXlzKHJlc291cmNlcykuam9pbigpfVwiIGRhdGEtJHtzaW5nbGVzW2luZGV4XX0tYWN0aW9uPVwic3RhcnQtcGFja2FnZXMtdXBkYXRlXCI+JHt0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLlVQREFURX0gJHt0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLkFMTH0gJHt0eXBlX3RyYW5zbGF0aW9ufTwvYT5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWJ1bGxob3JuXCI+PC9pPlxuICAgICAgICAgICAgICAgICR7bGVuZ3RofSAke3RyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uT0ZfWU9VUn0gJHt0eXBlX3RyYW5zbGF0aW9uLnRvTG93ZXJDYXNlKCl9ICR7dHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5IQVZFX0FOX1VQREFURV9BVkFJTEFCTEV9XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICBgKTtcblxuICAgICAgICAgICAgbGV0IGV4aXN0aW5nX3NsdWdzID0gJCgnW2RhdGEtdXBkYXRlLXBhY2thZ2VzXScpLmF0dHIoJ2RhdGEtcGFja2FnZXMtc2x1Z3MnKSB8fCAnJztcblxuICAgICAgICAgICAgaWYgKGV4aXN0aW5nX3NsdWdzKSB7XG4gICAgICAgICAgICAgICAgZXhpc3Rpbmdfc2x1Z3MgPSBleGlzdGluZ19zbHVncy5zcGxpdCgnLCcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBleGlzdGluZ19zbHVncyA9IFtdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgc2x1Z3MgPSB1bmlxdWUoZXhpc3Rpbmdfc2x1Z3MuY29uY2F0KE9iamVjdC5rZXlzKHJlc291cmNlcykpKS5qb2luKCk7XG4gICAgICAgICAgICAkKCdbZGF0YS11cGRhdGUtcGFja2FnZXNdJykuYXR0cignZGF0YS1wYWNrYWdlcy1zbHVncycsIGAke3NsdWdzfWApO1xuXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhyZXNvdXJjZXMpLmZvckVhY2goZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICAgICAgICAgIC8vIGxpc3RpbmcgcGFnZVxuICAgICAgICAgICAgICAgIGxldCBjb250YWluZXIgPSAkKGBbZGF0YS1ncG0tJHtzaW5nbGVzW2luZGV4XX09XCIke2l0ZW19XCJdYCk7XG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSBjb250YWluZXIuZmluZCgnLmdwbS1uYW1lJyk7XG4gICAgICAgICAgICAgICAgbGV0IHVybCA9IGVsZW1lbnQuZmluZCgnYScpO1xuICAgICAgICAgICAgICAgIGxldCBjb250ZW50X3dyYXBwZXIgPSBjb250YWluZXIucGFyZW50cygnLmNvbnRlbnQtd3JhcHBlcicpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdwbHVnaW5zJyAmJiAhZWxlbWVudC5maW5kKCcuYmFkZ2UudXBkYXRlJykubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuYXBwZW5kKGA8YSBjbGFzcz1cInBsdWdpbi11cGRhdGUtYnV0dG9uXCIgaHJlZj1cIiR7dXJsLmF0dHIoJ2hyZWYnKX1cIj48c3BhbiBjbGFzcz1cImJhZGdlIHVwZGF0ZVwiPiR7dHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5VUERBVEVfQVZBSUxBQkxFfSE8L3NwYW4+PC9hPmApO1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50X3dyYXBwZXIuYWRkQ2xhc3MoJ2hhcy11cGRhdGVzJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAndGhlbWVzJykge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmFwcGVuZChgPGRpdiBjbGFzcz1cImdwbS1yaWJib25cIj48YSBocmVmPVwiJHt1cmwuYXR0cignaHJlZicpfVwiPiR7dHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5VUERBVEUudG9VcHBlckNhc2UoKX08L2E+PC9kaXY+YCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfd3JhcHBlci5hZGRDbGFzcygnaGFzLXVwZGF0ZXMnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBkZXRhaWxzIHBhZ2VcbiAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGV0YWlscyA9ICQoYC5ncmF2LXVwZGF0ZS4ke3NpbmdsZXNbaW5kZXhdfWApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGV0YWlscy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZWxlYXNlVHlwZSA9IHJlc291cmNlc1tpdGVtXS50eXBlID09PSAndGVzdGluZycgPyAnPHNwYW4gY2xhc3M9XCJncG0tdGVzdGluZ1wiPnRlc3QgcmVsZWFzZTwvc3Bhbj4nIDogJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzLmh0bWwoYFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYnV0dG9uIGJ1dHRvbi1zbWFsbCBzZWNvbmRhcnlcIiBkYXRhLXJlbW9kYWwtdGFyZ2V0PVwidXBkYXRlLXBhY2thZ2VzXCIgZGF0YS1wYWNrYWdlcy1zbHVncz1cIiR7aXRlbX1cIiBkYXRhLSR7c2luZ2xlc1tpbmRleF19LWFjdGlvbj1cInN0YXJ0LXBhY2thZ2UtaW5zdGFsbGF0aW9uXCI+JHt0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLlVQREFURX0gJHtzaW5nbGVzW2luZGV4XS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHNpbmdsZXNbaW5kZXhdLnN1YnN0cigxKS50b0xvd2VyQ2FzZSgpfTwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1idWxsaG9yblwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz52JHtyZXNvdXJjZXNbaXRlbV0uYXZhaWxhYmxlfTwvc3Ryb25nPiAke3JlbGVhc2VUeXBlfSAke3RyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uT0ZfVEhJU30gJHtzaW5nbGVzW2luZGV4XX0gJHt0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLklTX05PV19BVkFJTEFCTEV9IVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIGApLmNzcygnZGlzcGxheScsICdibG9jaycpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpc19jdXJyZW50X3BhY2thZ2VfbGF0ZXN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgJCgnW2RhdGEtdXBkYXRlLXBhY2thZ2VzXScpLnJlbW92ZUNsYXNzKCdoaWRkZW4nKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgJCgnLmNvbnRlbnQtd3JhcHBlcicpLmFkZENsYXNzKCd1cGRhdGVzLWNoZWNrZWQnKTtcblxuICAgICAgICBpZiAoIWlzX2N1cnJlbnRfcGFja2FnZV9sYXRlc3QpIHtcbiAgICAgICAgICAgICQoJy53YXJuaW5nLXJlaW5zdGFsbC1ub3QtbGF0ZXN0LXJlbGVhc2UnKS5yZW1vdmVDbGFzcygnaGlkZGVuJyk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmxldCBJbnN0YW5jZSA9IG5ldyBVcGRhdGVzKCk7XG5leHBvcnQgeyBJbnN0YW5jZSwgTm90aWZpY2F0aW9ucywgRmVlZCB9O1xuXG4vLyBhdXRvbWF0aWNhbGx5IHJlZnJlc2ggVUkgZm9yIHVwZGF0ZXMgKGdyYXBoLCBzaWRlYmFyLCBwbHVnaW4vdGhlbWVzIHBhZ2VzKSBhZnRlciBldmVyeSBmZXRjaFxuZ3BtLm9uKCdmZXRjaGVkJywgKHJlc3BvbnNlLCByYXcpID0+IHtcbiAgICBJbnN0YW5jZS5zZXRQYXlsb2FkKHJlc3BvbnNlLnBheWxvYWQgfHwge30pO1xuICAgIEluc3RhbmNlLmdyYXYoKS5yZXNvdXJjZXMoKTtcbn0pO1xuXG5pZiAoY29uZmlnLmVuYWJsZV9hdXRvX3VwZGF0ZXNfY2hlY2sgPT09ICcxJykge1xuICAgIGdwbS5mZXRjaCgpO1xufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./app/updates/index.js\n"); /***/ }), /***/ "./app/updates/notifications.js": -/*!**************************************!* +/*!**************************************!*\ !*** ./app/updates/notifications.js ***! \**************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => __WEBPACK_DEFAULT_EXPORT__\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! grav-config */ \"grav-config\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(grav_config__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _utils_request__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/request */ \"./app/utils/request.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\n\nvar canFetchNotifications = function canFetchNotifications() {\n return grav_config__WEBPACK_IMPORTED_MODULE_1__.config.notifications.enabled;\n};\n\nvar notificationsFilters = function notificationsFilters() {\n return grav_config__WEBPACK_IMPORTED_MODULE_1__.config.notifications.filters;\n};\n\nvar Notifications = /*#__PURE__*/function () {\n function Notifications() {\n _classCallCheck(this, Notifications);\n }\n\n _createClass(Notifications, [{\n key: \"fetch\",\n // Grav.default.Notifications.fetch()\n value: function fetch() {\n var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n _ref$filter = _ref.filter,\n filter = _ref$filter === void 0 ? notificationsFilters() : _ref$filter,\n _ref$refresh = _ref.refresh,\n refresh = _ref$refresh === void 0 ? false : _ref$refresh;\n\n if (!canFetchNotifications()) {\n return false;\n }\n\n var feed = jquery__WEBPACK_IMPORTED_MODULE_0___default()('#notifications');\n var loader = feed.find('.widget-loader');\n var content = feed.find('.widget-content > ul');\n loader.find('div').remove();\n loader.find('.fa-warning').removeClass('fa-warning').addClass('fa-refresh fa-spin');\n loader.show();\n content.hide();\n\n var processNotifications = function processNotifications(response) {\n var notifications = response.notifications;\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('#notifications').find('.widget-content > ul').empty();\n\n if (notifications) {\n Object.keys(notifications).forEach(function (location) {\n return Notifications.processLocation(location, notifications[location]);\n });\n }\n };\n\n (0,_utils_request__WEBPACK_IMPORTED_MODULE_2__.default)(\"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.base_url_relative, \"/task\").concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.param_sep, \"getNotifications\"), {\n method: 'post',\n body: {\n refresh: refresh,\n filter: filter\n }\n }, function (response) {\n processNotifications(response);\n })[\"catch\"](function () {\n var widget = jquery__WEBPACK_IMPORTED_MODULE_0___default()('#notifications .widget-content');\n widget.find('.widget-loader').find('div').remove();\n widget.find('.widget-loader').append('
              Failed to retrieve notifications
              ').find('.fa-spin').removeClass('fa-spin fa-refresh').addClass('fa-warning');\n });\n }\n }], [{\n key: \"addShowAllInFeed\",\n value: function addShowAllInFeed() {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('#notifications ul').append('
            • Show all
            • ');\n }\n }, {\n key: \"showNotificationInFeed\",\n value: function showNotificationInFeed(notification) {\n var notifications = jquery__WEBPACK_IMPORTED_MODULE_0___default()('#notifications').removeClass('hidden');\n var loader = notifications.find('.widget-loader').hide();\n var content = notifications.find('.widget-content > ul').show();\n loader.find('div').remove();\n loader.find('.fa-warning').removeClass('fa-warning').addClass('fa-refresh fa-spin');\n content.append(notification).find('li:nth-child(n+11)').addClass('hidden'); // hide all items > 10\n\n if (content.find('li.hidden').length) {\n Notifications.addShowAllInFeed();\n }\n }\n }, {\n key: \"showNotificationInTop\",\n value: function showNotificationInTop(notification) {\n var container = jquery__WEBPACK_IMPORTED_MODULE_0___default()('.top-notifications-container');\n var dummy = jquery__WEBPACK_IMPORTED_MODULE_0___default()('
              ').html(notification);\n container.removeClass('hidden').append(dummy.children());\n dummy.children().slideDown(150);\n }\n }, {\n key: \"showNotificationInDashboard\",\n value: function showNotificationInDashboard(notification) {\n var container = jquery__WEBPACK_IMPORTED_MODULE_0___default()('.dashboard-notifications-container');\n var dummy = jquery__WEBPACK_IMPORTED_MODULE_0___default()('
              ').html(notification);\n container.removeClass('hidden').append(dummy.children());\n dummy.children().slideDown(150);\n }\n }, {\n key: \"showNotificationInPlugins\",\n value: function showNotificationInPlugins(notification) {\n var container = jquery__WEBPACK_IMPORTED_MODULE_0___default()('.plugins-notifications-container');\n var dummy = jquery__WEBPACK_IMPORTED_MODULE_0___default()('
              ').html(notification);\n container.removeClass('hidden').append(dummy.children());\n dummy.children().slideDown(150);\n }\n }, {\n key: \"showNotificationInThemes\",\n value: function showNotificationInThemes(notification) {\n var container = jquery__WEBPACK_IMPORTED_MODULE_0___default()('.themes-notifications-container');\n var dummy = jquery__WEBPACK_IMPORTED_MODULE_0___default()('
              ').html(notification);\n container.removeClass('hidden').append(dummy.children());\n dummy.children().slideDown(150);\n }\n }, {\n key: \"processLocation\",\n value: function processLocation(location, notification) {\n switch (location) {\n case 'feed':\n Notifications.showNotificationInFeed(notification);\n break;\n\n case 'top':\n if (!notification.read) {\n Notifications.showNotificationInTop(notification);\n }\n\n break;\n\n case 'dashboard':\n if (!notification.read) {\n Notifications.showNotificationInDashboard(notification);\n }\n\n break;\n\n case 'plugins':\n if (!notification.read) {\n Notifications.showNotificationInPlugins(notification);\n }\n\n break;\n\n case 'themes':\n if (!notification.read) {\n Notifications.showNotificationInThemes(notification);\n }\n\n break;\n }\n }\n }]);\n\n return Notifications;\n}();\n\nvar notifications = new Notifications();\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (notifications);\n\nif (canFetchNotifications()) {\n notifications.fetch();\n /* Hide a notification and store it hidden */\n // \n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(document).on('click', '[data-notification-action=\"hide-notification\"]', function (event) {\n var notification_id = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.target).parents('.hide-notification').data('notification-id');\n var url = \"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.base_url_relative, \"/notifications.json/task\").concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.param_sep, \"hideNotification/notification_id\").concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.param_sep).concat(notification_id);\n (0,_utils_request__WEBPACK_IMPORTED_MODULE_2__.default)(url, {\n method: 'post'\n }, function () {});\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.target).parents('.single-notification').hide();\n });\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(document).on('click', '[data-notification-action=\"hide-notification\"]', function (event) {\n var target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.currentTarget);\n var notification = target.parent();\n notification.slideUp(function () {\n return notification.remove();\n });\n });\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(document).on('click', '[data-notification-action=\"show-all-notifications\"]', function (event) {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('#notifications .show-all').hide();\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('#notifications .hidden').removeClass('hidden');\n });\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(document).on('click', '[data-refresh=\"notifications\"]', function (event) {\n event.preventDefault();\n notifications.fetch({\n filter: ['feed'],\n refresh: true\n });\n });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL3VwZGF0ZXMvbm90aWZpY2F0aW9ucy5qcz9mYmNkIl0sIm5hbWVzIjpbImNhbkZldGNoTm90aWZpY2F0aW9ucyIsImNvbmZpZyIsIm5vdGlmaWNhdGlvbnNGaWx0ZXJzIiwiTm90aWZpY2F0aW9ucyIsImZpbHRlciIsInJlZnJlc2giLCJmZWVkIiwiJCIsImxvYWRlciIsImZpbmQiLCJjb250ZW50IiwicmVtb3ZlIiwicmVtb3ZlQ2xhc3MiLCJhZGRDbGFzcyIsInNob3ciLCJoaWRlIiwicHJvY2Vzc05vdGlmaWNhdGlvbnMiLCJyZXNwb25zZSIsIm5vdGlmaWNhdGlvbnMiLCJlbXB0eSIsIk9iamVjdCIsImtleXMiLCJmb3JFYWNoIiwibG9jYXRpb24iLCJwcm9jZXNzTG9jYXRpb24iLCJyZXF1ZXN0IiwibWV0aG9kIiwiYm9keSIsIndpZGdldCIsImFwcGVuZCIsIm5vdGlmaWNhdGlvbiIsImxlbmd0aCIsImFkZFNob3dBbGxJbkZlZWQiLCJjb250YWluZXIiLCJkdW1teSIsImh0bWwiLCJjaGlsZHJlbiIsInNsaWRlRG93biIsInNob3dOb3RpZmljYXRpb25JbkZlZWQiLCJyZWFkIiwic2hvd05vdGlmaWNhdGlvbkluVG9wIiwic2hvd05vdGlmaWNhdGlvbkluRGFzaGJvYXJkIiwic2hvd05vdGlmaWNhdGlvbkluUGx1Z2lucyIsInNob3dOb3RpZmljYXRpb25JblRoZW1lcyIsImZldGNoIiwiZG9jdW1lbnQiLCJvbiIsImV2ZW50Iiwibm90aWZpY2F0aW9uX2lkIiwidGFyZ2V0IiwicGFyZW50cyIsImRhdGEiLCJ1cmwiLCJjdXJyZW50VGFyZ2V0IiwicGFyZW50Iiwic2xpZGVVcCIsInByZXZlbnREZWZhdWx0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7O0FBRUEsSUFBTUEscUJBQXFCLEdBQUcsU0FBeEJBLHFCQUF3QjtBQUFBLFNBQU1DLHFFQUFOO0FBQUEsQ0FBOUI7O0FB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TjtBQUFBLEtBQXJCO0FBQ0gsR0FMRDtBQU9BSiwrQ0FBQyxDQUFDc0MsUUFBRCxDQUFELENBQVlDLEVBQVosQ0FBZSxPQUFmLEVBQXdCLHFEQUF4QixFQUErRSxVQUFDQyxLQUFELEVBQVc7QUFDdEZ4QyxpREFBQyxDQUFDLDBCQUFELENBQUQsQ0FBOEJRLElBQTlCO0FBQ0FSLGlEQUFDLENBQUMsd0JBQUQsQ0FBRCxDQUE0QkssV0FBNUIsQ0FBd0MsUUFBeEM7QUFDSCxHQUhEO0FBS0FMLCtDQUFDLENBQUNzQyxRQUFELENBQUQsQ0FBWUMsRUFBWixDQUFlLE9BQWYsRUFBd0IsZ0NBQXhCLEVBQTBELFVBQUNDLEtBQUQsRUFBVztBQUNqRUEsU0FBSyxDQUFDUyxjQUFOO0FBQ0F0QyxpQkFBYSxDQUFDMEIsS0FBZCxDQUFvQjtBQUFFeEMsWUFBTSxFQUFFLENBQUMsTUFBRCxDQUFWO0FBQW9CQyxhQUFPLEVBQUU7QUFBN0IsS0FBcEI7QUFDSCxHQUhEO0FBSUgiLCJmaWxlIjoiLi9hcHAvdXBkYXRlcy9ub3RpZmljYXRpb25zLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJ2dyYXYtY29uZmlnJztcbmltcG9ydCByZXF1ZXN0IGZyb20gJy4uL3V0aWxzL3JlcXVlc3QnO1xuXG5jb25zdCBjYW5GZXRjaE5vdGlmaWNhdGlvbnMgPSAoKSA9PiBjb25maWcubm90aWZpY2F0aW9ucy5lbmFibGVkO1xuY29uc3Qgbm90aWZpY2F0aW9uc0ZpbHRlcnMgPSAoKSA9PiBjb25maWcubm90aWZpY2F0aW9ucy5maWx0ZXJzO1xuXG5jbGFzcyBOb3RpZmljYXRpb25zIHtcblxuICAgIHN0YXRpYyBhZGRTaG93QWxsSW5GZWVkKCkge1xuICAgICAgICAkKCcjbm90aWZpY2F0aW9ucyB1bCcpLmFwcGVuZCgnPGxpIGNsYXNzPVwic2hvdy1hbGxcIiBkYXRhLW5vdGlmaWNhdGlvbi1hY3Rpb249XCJzaG93LWFsbC1ub3RpZmljYXRpb25zXCI+U2hvdyBhbGw8L2xpPicpO1xuICAgIH1cblxuICAgIHN0YXRpYyBzaG93Tm90aWZpY2F0aW9uSW5GZWVkKG5vdGlmaWNhdGlvbikge1xuICAgICAgICBsZXQgbm90aWZpY2F0aW9ucyA9ICQoJyNub3RpZmljYXRpb25zJykucmVtb3ZlQ2xhc3MoJ2hpZGRlbicpO1xuXG4gICAgICAgIGxldCBsb2FkZXIgPSBub3RpZmljYXRpb25zLmZpbmQoJy53aWRnZXQtbG9hZGVyJykuaGlkZSgpO1xuICAgICAgICBsZXQgY29udGVudCA9IG5vdGlmaWNhdGlvbnMuZmluZCgnLndpZGdldC1jb250ZW50ID4gdWwnKS5zaG93KCk7XG4gICAgICAgIGxvYWRlci5maW5kKCdkaXYnKS5yZW1vdmUoKTtcbiAgICAgICAgbG9hZGVyLmZpbmQoJy5mYS13YXJuaW5nJykucmVtb3ZlQ2xhc3MoJ2ZhLXdhcm5pbmcnKS5hZGRDbGFzcygnZmEtcmVmcmVzaCBmYS1zcGluJyk7XG5cbiAgICAgICAgY29udGVudFxuICAgICAgICAgICAgLmFwcGVuZChub3RpZmljYXRpb24pXG4gICAgICAgICAgICAuZmluZCgnbGk6bnRoLWNoaWxkKG4rMTEpJykuYWRkQ2xhc3MoJ2hpZGRlbicpOyAvLyBoaWRlIGFsbCBpdGVtcyA+IDEwXG5cbiAgICAgICAgaWYgKGNvbnRlbnQuZmluZCgnbGkuaGlkZGVuJykubGVuZ3RoKSB7XG4gICAgICAgICAgICBOb3RpZmljYXRpb25zLmFkZFNob3dBbGxJbkZlZWQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBzaG93Tm90aWZpY2F0aW9uSW5Ub3Aobm90aWZpY2F0aW9uKSB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9ICQoJy50b3Atbm90aWZpY2F0aW9ucy1jb250YWluZXInKTtcbiAgICAgICAgY29uc3QgZHVtbXkgPSAkKCc8ZGl2IC8+JykuaHRtbChub3RpZmljYXRpb24pO1xuXG4gICAgICAgIGNvbnRhaW5lci5yZW1vdmVDbGFzcygnaGlkZGVuJykuYXBwZW5kKGR1bW15LmNoaWxkcmVuKCkpO1xuICAgICAgICBkdW1teS5jaGlsZHJlbigpLnNsaWRlRG93bigxNTApO1xuICAgIH1cblxuICAgIHN0YXRpYyBzaG93Tm90aWZpY2F0aW9uSW5EYXNoYm9hcmQobm90aWZpY2F0aW9uKSB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9ICQoJy5kYXNoYm9hcmQtbm90aWZpY2F0aW9ucy1jb250YWluZXInKTtcbiAgICAgICAgY29uc3QgZHVtbXkgPSAkKCc8ZGl2IC8+JykuaHRtbChub3RpZmljYXRpb24pO1xuXG4gICAgICAgIGNvbnRhaW5lci5yZW1vdmVDbGFzcygnaGlkZGVuJykuYXBwZW5kKGR1bW15LmNoaWxkcmVuKCkpO1xuICAgICAgICBkdW1teS5jaGlsZHJlbigpLnNsaWRlRG93bigxNTApO1xuICAgIH1cblxuICAgIHN0YXRpYyBzaG93Tm90aWZpY2F0aW9uSW5QbHVnaW5zKG5vdGlmaWNhdGlvbikge1xuICAgICAgICBjb25zdCBjb250YWluZXIgPSAkKCcucGx1Z2lucy1ub3RpZmljYXRpb25zLWNvbnRhaW5lcicpO1xuICAgICAgICBjb25zdCBkdW1teSA9ICQoJzxkaXYgLz4nKS5odG1sKG5vdGlmaWNhdGlvbik7XG5cbiAgICAgICAgY29udGFpbmVyLnJlbW92ZUNsYXNzKCdoaWRkZW4nKS5hcHBlbmQoZHVtbXkuY2hpbGRyZW4oKSk7XG4gICAgICAgIGR1bW15LmNoaWxkcmVuKCkuc2xpZGVEb3duKDE1MCk7XG4gICAgfVxuXG4gICAgc3RhdGljIHNob3dOb3RpZmljYXRpb25JblRoZW1lcyhub3RpZmljYXRpb24pIHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gJCgnLnRoZW1lcy1ub3RpZmljYXRpb25zLWNvbnRhaW5lcicpO1xuICAgICAgICBjb25zdCBkdW1teSA9ICQoJzxkaXYgLz4nKS5odG1sKG5vdGlmaWNhdGlvbik7XG5cbiAgICAgICAgY29udGFpbmVyLnJlbW92ZUNsYXNzKCdoaWRkZW4nKS5hcHBlbmQoZHVtbXkuY2hpbGRyZW4oKSk7XG4gICAgICAgIGR1bW15LmNoaWxkcmVuKCkuc2xpZGVEb3duKDE1MCk7XG4gICAgfVxuXG4gICAgc3RhdGljIHByb2Nlc3NMb2NhdGlvbihsb2NhdGlvbiwgbm90aWZpY2F0aW9uKSB7XG4gICAgICAgIHN3aXRjaCAobG9jYXRpb24pIHtcbiAgICAgICAgICAgIGNhc2UgJ2ZlZWQnOlxuICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbnMuc2hvd05vdGlmaWNhdGlvbkluRmVlZChub3RpZmljYXRpb24pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgICAgICAgICBpZiAoIW5vdGlmaWNhdGlvbi5yZWFkKSB7XG4gICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbnMuc2hvd05vdGlmaWNhdGlvbkluVG9wKG5vdGlmaWNhdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZGFzaGJvYXJkJzpcbiAgICAgICAgICAgICAgICBpZiAoIW5vdGlmaWNhdGlvbi5yZWFkKSB7XG4gICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbnMuc2hvd05vdGlmaWNhdGlvbkluRGFzaGJvYXJkKG5vdGlmaWNhdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncGx1Z2lucyc6XG4gICAgICAgICAgICAgICAgaWYgKCFub3RpZmljYXRpb24ucmVhZCkge1xuICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25zLnNob3dOb3RpZmljYXRpb25JblBsdWdpbnMobm90aWZpY2F0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICd0aGVtZXMnOlxuICAgICAgICAgICAgICAgIGlmICghbm90aWZpY2F0aW9uLnJlYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9ucy5zaG93Tm90aWZpY2F0aW9uSW5UaGVtZXMobm90aWZpY2F0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHcmF2LmRlZmF1bHQuTm90aWZpY2F0aW9ucy5mZXRjaCgpXG4gICAgZmV0Y2goeyBmaWx0ZXIgPSBub3RpZmljYXRpb25zRmlsdGVycygpLCByZWZyZXNoID0gZmFsc2UgfSA9IHt9KSB7XG4gICAgICAgIGlmICghY2FuRmV0Y2hOb3RpZmljYXRpb25zKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBmZWVkID0gJCgnI25vdGlmaWNhdGlvbnMnKTtcbiAgICAgICAgbGV0IGxvYWRlciA9IGZlZWQuZmluZCgnLndpZGdldC1sb2FkZXInKTtcbiAgICAgICAgbGV0IGNvbnRlbnQgPSBmZWVkLmZpbmQoJy53aWRnZXQtY29udGVudCA+IHVsJyk7XG4gICAgICAgIGxvYWRlci5maW5kKCdkaXYnKS5yZW1vdmUoKTtcbiAgICAgICAgbG9hZGVyLmZpbmQoJy5mYS13YXJuaW5nJykucmVtb3ZlQ2xhc3MoJ2ZhLXdhcm5pbmcnKS5hZGRDbGFzcygnZmEtcmVmcmVzaCBmYS1zcGluJyk7XG4gICAgICAgIGxvYWRlci5zaG93KCk7XG4gICAgICAgIGNvbnRlbnQuaGlkZSgpO1xuXG4gICAgICAgIGxldCBwcm9jZXNzTm90aWZpY2F0aW9ucyA9IChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgbGV0IG5vdGlmaWNhdGlvbnMgPSByZXNwb25zZS5ub3RpZmljYXRpb25zO1xuXG4gICAgICAgICAgICAkKCcjbm90aWZpY2F0aW9ucycpLmZpbmQoJy53aWRnZXQtY29udGVudCA+IHVsJykuZW1wdHkoKTtcblxuICAgICAgICAgICAgaWYgKG5vdGlmaWNhdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhub3RpZmljYXRpb25zKS5mb3JFYWNoKChsb2NhdGlvbikgPT4gTm90aWZpY2F0aW9ucy5wcm9jZXNzTG9jYXRpb24obG9jYXRpb24sIG5vdGlmaWNhdGlvbnNbbG9jYXRpb25dKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgcmVxdWVzdChgJHtjb25maWcuYmFzZV91cmxfcmVsYXRpdmV9L3Rhc2ske2NvbmZpZy5wYXJhbV9zZXB9Z2V0Tm90aWZpY2F0aW9uc2AsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ3Bvc3QnLFxuICAgICAgICAgICAgYm9keTogeyByZWZyZXNoLCBmaWx0ZXIgfVxuICAgICAgICB9LCAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIHByb2Nlc3NOb3RpZmljYXRpb25zKHJlc3BvbnNlKTtcbiAgICAgICAgfSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgbGV0IHdpZGdldCA9ICQoJyNub3RpZmljYXRpb25zIC53aWRnZXQtY29udGVudCcpO1xuICAgICAgICAgICAgd2lkZ2V0XG4gICAgICAgICAgICAgICAgLmZpbmQoJy53aWRnZXQtbG9hZGVyJylcbiAgICAgICAgICAgICAgICAuZmluZCgnZGl2JykucmVtb3ZlKCk7XG5cbiAgICAgICAgICAgIHdpZGdldFxuICAgICAgICAgICAgICAgIC5maW5kKCcud2lkZ2V0LWxvYWRlcicpXG4gICAgICAgICAgICAgICAgLmFwcGVuZCgnPGRpdj5GYWlsZWQgdG8gcmV0cmlldmUgbm90aWZpY2F0aW9uczwvZGl2PicpXG4gICAgICAgICAgICAgICAgLmZpbmQoJy5mYS1zcGluJylcbiAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ2ZhLXNwaW4gZmEtcmVmcmVzaCcpLmFkZENsYXNzKCdmYS13YXJuaW5nJyk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxubGV0IG5vdGlmaWNhdGlvbnMgPSBuZXcgTm90aWZpY2F0aW9ucygpO1xuZXhwb3J0IGRlZmF1bHQgbm90aWZpY2F0aW9ucztcblxuaWYgKGNhbkZldGNoTm90aWZpY2F0aW9ucygpKSB7XG4gICAgbm90aWZpY2F0aW9ucy5mZXRjaCgpO1xuXG4gICAgLyogSGlkZSBhIG5vdGlmaWNhdGlvbiBhbmQgc3RvcmUgaXQgaGlkZGVuICovXG4gICAgLy8gPGEgaHJlZj1cIiNcIiBkYXRhLW5vdGlmaWNhdGlvbi1hY3Rpb249XCJoaWRlLW5vdGlmaWNhdGlvblwiIGRhdGEtbm90aWZpY2F0aW9uLWlkPVwiJHtub3RpZmljYXRpb24uaWR9XCIgY2xhc3M9XCJjbG9zZSBoaWRlLW5vdGlmaWNhdGlvblwiPjxpIGNsYXNzPVwiZmEgZmEtY2xvc2VcIj48L2k+PC9hPlxuICAgICQoZG9jdW1lbnQpLm9uKCdjbGljaycsICdbZGF0YS1ub3RpZmljYXRpb24tYWN0aW9uPVwiaGlkZS1ub3RpZmljYXRpb25cIl0nLCAoZXZlbnQpID0+IHtcbiAgICAgICAgbGV0IG5vdGlmaWNhdGlvbl9pZCA9ICQoZXZlbnQudGFyZ2V0KS5wYXJlbnRzKCcuaGlkZS1ub3RpZmljYXRpb24nKS5kYXRhKCdub3RpZmljYXRpb24taWQnKTtcblxuICAgICAgICBsZXQgdXJsID0gYCR7Y29uZmlnLmJhc2VfdXJsX3JlbGF0aXZlfS9ub3RpZmljYXRpb25zLmpzb24vdGFzayR7Y29uZmlnLnBhcmFtX3NlcH1oaWRlTm90aWZpY2F0aW9uL25vdGlmaWNhdGlvbl9pZCR7Y29uZmlnLnBhcmFtX3NlcH0ke25vdGlmaWNhdGlvbl9pZH1gO1xuXG4gICAgICAgIHJlcXVlc3QodXJsLCB7IG1ldGhvZDogJ3Bvc3QnIH0sICgpID0+IHt9KTtcblxuICAgICAgICAkKGV2ZW50LnRhcmdldCkucGFyZW50cygnLnNpbmdsZS1ub3RpZmljYXRpb24nKS5oaWRlKCk7XG4gICAgfSk7XG5cbiAgICAkKGRvY3VtZW50KS5vbignY2xpY2snLCAnW2RhdGEtbm90aWZpY2F0aW9uLWFjdGlvbj1cImhpZGUtbm90aWZpY2F0aW9uXCJdJywgKGV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9ICQoZXZlbnQuY3VycmVudFRhcmdldCk7XG4gICAgICAgIGNvbnN0IG5vdGlmaWNhdGlvbiA9IHRhcmdldC5wYXJlbnQoKTtcblxuICAgICAgICBub3RpZmljYXRpb24uc2xpZGVVcCgoKSA9PiBub3RpZmljYXRpb24ucmVtb3ZlKCkpO1xuICAgIH0pO1xuXG4gICAgJChkb2N1bWVudCkub24oJ2NsaWNrJywgJ1tkYXRhLW5vdGlmaWNhdGlvbi1hY3Rpb249XCJzaG93LWFsbC1ub3RpZmljYXRpb25zXCJdJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICQoJyNub3RpZmljYXRpb25zIC5zaG93LWFsbCcpLmhpZGUoKTtcbiAgICAgICAgJCgnI25vdGlmaWNhdGlvbnMgLmhpZGRlbicpLnJlbW92ZUNsYXNzKCdoaWRkZW4nKTtcbiAgICB9KTtcblxuICAgICQoZG9jdW1lbnQpLm9uKCdjbGljaycsICdbZGF0YS1yZWZyZXNoPVwibm90aWZpY2F0aW9uc1wiXScsIChldmVudCkgPT4ge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBub3RpZmljYXRpb25zLmZldGNoKHsgZmlsdGVyOiBbJ2ZlZWQnXSwgcmVmcmVzaDogdHJ1ZSB9KTtcbiAgICB9KTtcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./app/updates/notifications.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! grav-config */ \"grav-config\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(grav_config__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _utils_request__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/request */ \"./app/utils/request.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\n\nvar canFetchNotifications = function canFetchNotifications() {\n return grav_config__WEBPACK_IMPORTED_MODULE_1__.config.notifications.enabled;\n};\n\nvar notificationsFilters = function notificationsFilters() {\n return grav_config__WEBPACK_IMPORTED_MODULE_1__.config.notifications.filters;\n};\n\nvar Notifications = /*#__PURE__*/function () {\n function Notifications() {\n _classCallCheck(this, Notifications);\n }\n\n _createClass(Notifications, [{\n key: \"fetch\",\n value: // Grav.default.Notifications.fetch()\n function fetch() {\n var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n _ref$filter = _ref.filter,\n filter = _ref$filter === void 0 ? notificationsFilters() : _ref$filter,\n _ref$refresh = _ref.refresh,\n refresh = _ref$refresh === void 0 ? false : _ref$refresh;\n\n if (!canFetchNotifications()) {\n return false;\n }\n\n var feed = jquery__WEBPACK_IMPORTED_MODULE_0___default()('#notifications');\n var loader = feed.find('.widget-loader');\n var content = feed.find('.widget-content > ul');\n loader.find('div').remove();\n loader.find('.fa-warning').removeClass('fa-warning').addClass('fa-refresh fa-spin');\n loader.show();\n content.hide();\n\n var processNotifications = function processNotifications(response) {\n var notifications = response.notifications;\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('#notifications').find('.widget-content > ul').empty();\n\n if (notifications) {\n Object.keys(notifications).forEach(function (location) {\n return Notifications.processLocation(location, notifications[location]);\n });\n }\n };\n\n (0,_utils_request__WEBPACK_IMPORTED_MODULE_2__.default)(\"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.base_url_relative, \"/task\").concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.param_sep, \"getNotifications\"), {\n method: 'post',\n body: {\n refresh: refresh,\n filter: filter\n }\n }, function (response) {\n processNotifications(response);\n })[\"catch\"](function () {\n var widget = jquery__WEBPACK_IMPORTED_MODULE_0___default()('#notifications .widget-content');\n widget.find('.widget-loader').find('div').remove();\n widget.find('.widget-loader').append('
              Failed to retrieve notifications
              ').find('.fa-spin').removeClass('fa-spin fa-refresh').addClass('fa-warning');\n });\n }\n }], [{\n key: \"addShowAllInFeed\",\n value: function addShowAllInFeed() {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('#notifications ul').append('
            • Show all
            • ');\n }\n }, {\n key: \"showNotificationInFeed\",\n value: function showNotificationInFeed(notification) {\n var notifications = jquery__WEBPACK_IMPORTED_MODULE_0___default()('#notifications').removeClass('hidden');\n var loader = notifications.find('.widget-loader').hide();\n var content = notifications.find('.widget-content > ul').show();\n loader.find('div').remove();\n loader.find('.fa-warning').removeClass('fa-warning').addClass('fa-refresh fa-spin');\n content.append(notification).find('li:nth-child(n+11)').addClass('hidden'); // hide all items > 10\n\n if (content.find('li.hidden').length) {\n Notifications.addShowAllInFeed();\n }\n }\n }, {\n key: \"showNotificationInTop\",\n value: function showNotificationInTop(notification) {\n var container = jquery__WEBPACK_IMPORTED_MODULE_0___default()('.top-notifications-container');\n var dummy = jquery__WEBPACK_IMPORTED_MODULE_0___default()('
              ').html(notification);\n container.removeClass('hidden').append(dummy.children());\n dummy.children().slideDown(150);\n }\n }, {\n key: \"showNotificationInDashboard\",\n value: function showNotificationInDashboard(notification) {\n var container = jquery__WEBPACK_IMPORTED_MODULE_0___default()('.dashboard-notifications-container');\n var dummy = jquery__WEBPACK_IMPORTED_MODULE_0___default()('
              ').html(notification);\n container.removeClass('hidden').append(dummy.children());\n dummy.children().slideDown(150);\n }\n }, {\n key: \"showNotificationInPlugins\",\n value: function showNotificationInPlugins(notification) {\n var container = jquery__WEBPACK_IMPORTED_MODULE_0___default()('.plugins-notifications-container');\n var dummy = jquery__WEBPACK_IMPORTED_MODULE_0___default()('
              ').html(notification);\n container.removeClass('hidden').append(dummy.children());\n dummy.children().slideDown(150);\n }\n }, {\n key: \"showNotificationInThemes\",\n value: function showNotificationInThemes(notification) {\n var container = jquery__WEBPACK_IMPORTED_MODULE_0___default()('.themes-notifications-container');\n var dummy = jquery__WEBPACK_IMPORTED_MODULE_0___default()('
              ').html(notification);\n container.removeClass('hidden').append(dummy.children());\n dummy.children().slideDown(150);\n }\n }, {\n key: \"processLocation\",\n value: function processLocation(location, notification) {\n switch (location) {\n case 'feed':\n Notifications.showNotificationInFeed(notification);\n break;\n\n case 'top':\n if (!notification.read) {\n Notifications.showNotificationInTop(notification);\n }\n\n break;\n\n case 'dashboard':\n if (!notification.read) {\n Notifications.showNotificationInDashboard(notification);\n }\n\n break;\n\n case 'plugins':\n if (!notification.read) {\n Notifications.showNotificationInPlugins(notification);\n }\n\n break;\n\n case 'themes':\n if (!notification.read) {\n Notifications.showNotificationInThemes(notification);\n }\n\n break;\n }\n }\n }]);\n\n return Notifications;\n}();\n\nvar notifications = new Notifications();\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (notifications);\n\nif (canFetchNotifications()) {\n notifications.fetch();\n /* Hide a notification and store it hidden */\n // \n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(document).on('click', '[data-notification-action=\"hide-notification\"]', function (event) {\n var notification_id = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.target).parents('.hide-notification').data('notification-id');\n var url = \"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.base_url_relative, \"/notifications.json/task\").concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.param_sep, \"hideNotification/notification_id\").concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.param_sep).concat(notification_id);\n (0,_utils_request__WEBPACK_IMPORTED_MODULE_2__.default)(url, {\n method: 'post'\n }, function () {});\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.target).parents('.single-notification').hide();\n });\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(document).on('click', '[data-notification-action=\"hide-notification\"]', function (event) {\n var target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.currentTarget);\n var notification = target.parent();\n notification.slideUp(function () {\n return notification.remove();\n });\n });\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(document).on('click', '[data-notification-action=\"show-all-notifications\"]', function (event) {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('#notifications .show-all').hide();\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('#notifications .hidden').removeClass('hidden');\n });\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(document).on('click', '[data-refresh=\"notifications\"]', function (event) {\n event.preventDefault();\n notifications.fetch({\n filter: ['feed'],\n refresh: true\n });\n });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL3VwZGF0ZXMvbm90aWZpY2F0aW9ucy5qcz9mYmNkIl0sIm5hbWVzIjpbImNhbkZldGNoTm90aWZpY2F0aW9ucyIsImNvbmZpZyIsIm5vdGlmaWNhdGlvbnNGaWx0ZXJzIiwiTm90aWZpY2F0aW9ucyIsImZpbHRlciIsInJlZnJlc2giLCJmZWVkIiwiJCIsImxvYWRlciIsImZpbmQiLCJjb250ZW50IiwicmVtb3ZlIiwicmVtb3ZlQ2xhc3MiLCJhZGRDbGFzcyIsInNob3ciLCJoaWRlIiwicHJvY2Vzc05vdGlmaWNhdGlvbnMiLCJyZXNwb25zZSIsIm5vdGlmaWNhdGlvbnMiLCJlbXB0eSIsIk9iamVjdCIsImtleXMiLCJmb3JFYWNoIiwibG9jYXRpb24iLCJwcm9jZXNzTG9jYXRpb24iLCJyZXF1ZXN0IiwibWV0aG9kIiwiYm9keSIsIndpZGdldCIsImFwcGVuZCIsIm5vdGlmaWNhdGlvbiIsImxlbmd0aCIsImFkZFNob3dBbGxJbkZlZWQiLCJjb250YWluZXIiLCJkdW1teSIsImh0bWwiLCJjaGlsZHJlbiIsInNsaWRlRG93biIsInNob3dOb3RpZmljYXRpb25JbkZlZWQiLCJyZWFkIiwic2hvd05vdGlmaWNhdGlvbkluVG9wIiwic2hvd05vdGlmaWNhdGlvbkluRGFzaGJvYXJkIiwic2hvd05vdGlmaWNhdGlvbkluUGx1Z2lucyIsInNob3dOb3RpZmljYXRpb25JblRoZW1lcyIsImZldGNoIiwiZG9jdW1lbnQiLCJvbiIsImV2ZW50Iiwibm90aWZpY2F0aW9uX2lkIiwidGFyZ2V0IiwicGFyZW50cyIsImRhdGEiLCJ1cmwiLCJjdXJyZW50VGFyZ2V0IiwicGFyZW50Iiwic2xpZGVVcCIsInByZXZlbnREZWZhdWx0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7O0FBRUEsSUFBTUEscUJBQXFCLEdBQUcsU0FBeEJBLHFCQUF3QjtBQUFBLFNBQU1DLHFFQUFOO0FBQUEsQ0FBOUI7O0FB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LE1BQVAsRUFBckI7QUFFQXhCLGdCQUFZLENBQUN5QixPQUFiLENBQXFCO0FBQUEsYUFBTXpCLFlBQVksQ0FBQ25CLE1BQWIsRUFBTjtBQUFBLEtBQXJCO0FBQ0gsR0FMRDtBQU9BSiwrQ0FBQyxDQUFDc0MsUUFBRCxDQUFELENBQVlDLEVBQVosQ0FBZSxPQUFmLEVBQXdCLHFEQUF4QixFQUErRSxVQUFDQyxLQUFELEVBQVc7QUFDdEZ4QyxpREFBQyxDQUFDLDBCQUFELENBQUQsQ0FBOEJRLElBQTlCO0FBQ0FSLGlEQUFDLENBQUMsd0JBQUQsQ0FBRCxDQUE0QkssV0FBNUIsQ0FBd0MsUUFBeEM7QUFDSCxHQUhEO0FBS0FMLCtDQUFDLENBQUNzQyxRQUFELENBQUQsQ0FBWUMsRUFBWixDQUFlLE9BQWYsRUFBd0IsZ0NBQXhCLEVBQTBELFVBQUNDLEtBQUQsRUFBVztBQUNqRUEsU0FBSyxDQUFDUyxjQUFOO0FBQ0F0QyxpQkFBYSxDQUFDMEIsS0FBZCxDQUFvQjtBQUFFeEMsWUFBTSxFQUFFLENBQUMsTUFBRCxDQUFWO0FBQW9CQyxhQUFPLEVBQUU7QUFBN0IsS0FBcEI7QUFDSCxHQUhEO0FBSUgiLCJmaWxlIjoiLi9hcHAvdXBkYXRlcy9ub3RpZmljYXRpb25zLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJ2dyYXYtY29uZmlnJztcbmltcG9ydCByZXF1ZXN0IGZyb20gJy4uL3V0aWxzL3JlcXVlc3QnO1xuXG5jb25zdCBjYW5GZXRjaE5vdGlmaWNhdGlvbnMgPSAoKSA9PiBjb25maWcubm90aWZpY2F0aW9ucy5lbmFibGVkO1xuY29uc3Qgbm90aWZpY2F0aW9uc0ZpbHRlcnMgPSAoKSA9PiBjb25maWcubm90aWZpY2F0aW9ucy5maWx0ZXJzO1xuXG5jbGFzcyBOb3RpZmljYXRpb25zIHtcblxuICAgIHN0YXRpYyBhZGRTaG93QWxsSW5GZWVkKCkge1xuICAgICAgICAkKCcjbm90aWZpY2F0aW9ucyB1bCcpLmFwcGVuZCgnPGxpIGNsYXNzPVwic2hvdy1hbGxcIiBkYXRhLW5vdGlmaWNhdGlvbi1hY3Rpb249XCJzaG93LWFsbC1ub3RpZmljYXRpb25zXCI+U2hvdyBhbGw8L2xpPicpO1xuICAgIH1cblxuICAgIHN0YXRpYyBzaG93Tm90aWZpY2F0aW9uSW5GZWVkKG5vdGlmaWNhdGlvbikge1xuICAgICAgICBsZXQgbm90aWZpY2F0aW9ucyA9ICQoJyNub3RpZmljYXRpb25zJykucmVtb3ZlQ2xhc3MoJ2hpZGRlbicpO1xuXG4gICAgICAgIGxldCBsb2FkZXIgPSBub3RpZmljYXRpb25zLmZpbmQoJy53aWRnZXQtbG9hZGVyJykuaGlkZSgpO1xuICAgICAgICBsZXQgY29udGVudCA9IG5vdGlmaWNhdGlvbnMuZmluZCgnLndpZGdldC1jb250ZW50ID4gdWwnKS5zaG93KCk7XG4gICAgICAgIGxvYWRlci5maW5kKCdkaXYnKS5yZW1vdmUoKTtcbiAgICAgICAgbG9hZGVyLmZpbmQoJy5mYS13YXJuaW5nJykucmVtb3ZlQ2xhc3MoJ2ZhLXdhcm5pbmcnKS5hZGRDbGFzcygnZmEtcmVmcmVzaCBmYS1zcGluJyk7XG5cbiAgICAgICAgY29udGVudFxuICAgICAgICAgICAgLmFwcGVuZChub3RpZmljYXRpb24pXG4gICAgICAgICAgICAuZmluZCgnbGk6bnRoLWNoaWxkKG4rMTEpJykuYWRkQ2xhc3MoJ2hpZGRlbicpOyAvLyBoaWRlIGFsbCBpdGVtcyA+IDEwXG5cbiAgICAgICAgaWYgKGNvbnRlbnQuZmluZCgnbGkuaGlkZGVuJykubGVuZ3RoKSB7XG4gICAgICAgICAgICBOb3RpZmljYXRpb25zLmFkZFNob3dBbGxJbkZlZWQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBzaG93Tm90aWZpY2F0aW9uSW5Ub3Aobm90aWZpY2F0aW9uKSB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9ICQoJy50b3Atbm90aWZpY2F0aW9ucy1jb250YWluZXInKTtcbiAgICAgICAgY29uc3QgZHVtbXkgPSAkKCc8ZGl2IC8+JykuaHRtbChub3RpZmljYXRpb24pO1xuXG4gICAgICAgIGNvbnRhaW5lci5yZW1vdmVDbGFzcygnaGlkZGVuJykuYXBwZW5kKGR1bW15LmNoaWxkcmVuKCkpO1xuICAgICAgICBkdW1teS5jaGlsZHJlbigpLnNsaWRlRG93bigxNTApO1xuICAgIH1cblxuICAgIHN0YXRpYyBzaG93Tm90aWZpY2F0aW9uSW5EYXNoYm9hcmQobm90aWZpY2F0aW9uKSB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9ICQoJy5kYXNoYm9hcmQtbm90aWZpY2F0aW9ucy1jb250YWluZXInKTtcbiAgICAgICAgY29uc3QgZHVtbXkgPSAkKCc8ZGl2IC8+JykuaHRtbChub3RpZmljYXRpb24pO1xuXG4gICAgICAgIGNvbnRhaW5lci5yZW1vdmVDbGFzcygnaGlkZGVuJykuYXBwZW5kKGR1bW15LmNoaWxkcmVuKCkpO1xuICAgICAgICBkdW1teS5jaGlsZHJlbigpLnNsaWRlRG93bigxNTApO1xuICAgIH1cblxuICAgIHN0YXRpYyBzaG93Tm90aWZpY2F0aW9uSW5QbHVnaW5zKG5vdGlmaWNhdGlvbikge1xuICAgICAgICBjb25zdCBjb250YWluZXIgPSAkKCcucGx1Z2lucy1ub3RpZmljYXRpb25zLWNvbnRhaW5lcicpO1xuICAgICAgICBjb25zdCBkdW1teSA9ICQoJzxkaXYgLz4nKS5odG1sKG5vdGlmaWNhdGlvbik7XG5cbiAgICAgICAgY29udGFpbmVyLnJlbW92ZUNsYXNzKCdoaWRkZW4nKS5hcHBlbmQoZHVtbXkuY2hpbGRyZW4oKSk7XG4gICAgICAgIGR1bW15LmNoaWxkcmVuKCkuc2xpZGVEb3duKDE1MCk7XG4gICAgfVxuXG4gICAgc3RhdGljIHNob3dOb3RpZmljYXRpb25JblRoZW1lcyhub3RpZmljYXRpb24pIHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gJCgnLnRoZW1lcy1ub3RpZmljYXRpb25zLWNvbnRhaW5lcicpO1xuICAgICAgICBjb25zdCBkdW1teSA9ICQoJzxkaXYgLz4nKS5odG1sKG5vdGlmaWNhdGlvbik7XG5cbiAgICAgICAgY29udGFpbmVyLnJlbW92ZUNsYXNzKCdoaWRkZW4nKS5hcHBlbmQoZHVtbXkuY2hpbGRyZW4oKSk7XG4gICAgICAgIGR1bW15LmNoaWxkcmVuKCkuc2xpZGVEb3duKDE1MCk7XG4gICAgfVxuXG4gICAgc3RhdGljIHByb2Nlc3NMb2NhdGlvbihsb2NhdGlvbiwgbm90aWZpY2F0aW9uKSB7XG4gICAgICAgIHN3aXRjaCAobG9jYXRpb24pIHtcbiAgICAgICAgICAgIGNhc2UgJ2ZlZWQnOlxuICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbnMuc2hvd05vdGlmaWNhdGlvbkluRmVlZChub3RpZmljYXRpb24pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgICAgICAgICBpZiAoIW5vdGlmaWNhdGlvbi5yZWFkKSB7XG4gICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbnMuc2hvd05vdGlmaWNhdGlvbkluVG9wKG5vdGlmaWNhdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZGFzaGJvYXJkJzpcbiAgICAgICAgICAgICAgICBpZiAoIW5vdGlmaWNhdGlvbi5yZWFkKSB7XG4gICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbnMuc2hvd05vdGlmaWNhdGlvbkluRGFzaGJvYXJkKG5vdGlmaWNhdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncGx1Z2lucyc6XG4gICAgICAgICAgICAgICAgaWYgKCFub3RpZmljYXRpb24ucmVhZCkge1xuICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25zLnNob3dOb3RpZmljYXRpb25JblBsdWdpbnMobm90aWZpY2F0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICd0aGVtZXMnOlxuICAgICAgICAgICAgICAgIGlmICghbm90aWZpY2F0aW9uLnJlYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9ucy5zaG93Tm90aWZpY2F0aW9uSW5UaGVtZXMobm90aWZpY2F0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHcmF2LmRlZmF1bHQuTm90aWZpY2F0aW9ucy5mZXRjaCgpXG4gICAgZmV0Y2goeyBmaWx0ZXIgPSBub3RpZmljYXRpb25zRmlsdGVycygpLCByZWZyZXNoID0gZmFsc2UgfSA9IHt9KSB7XG4gICAgICAgIGlmICghY2FuRmV0Y2hOb3RpZmljYXRpb25zKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBmZWVkID0gJCgnI25vdGlmaWNhdGlvbnMnKTtcbiAgICAgICAgbGV0IGxvYWRlciA9IGZlZWQuZmluZCgnLndpZGdldC1sb2FkZXInKTtcbiAgICAgICAgbGV0IGNvbnRlbnQgPSBmZWVkLmZpbmQoJy53aWRnZXQtY29udGVudCA+IHVsJyk7XG4gICAgICAgIGxvYWRlci5maW5kKCdkaXYnKS5yZW1vdmUoKTtcbiAgICAgICAgbG9hZGVyLmZpbmQoJy5mYS13YXJuaW5nJykucmVtb3ZlQ2xhc3MoJ2ZhLXdhcm5pbmcnKS5hZGRDbGFzcygnZmEtcmVmcmVzaCBmYS1zcGluJyk7XG4gICAgICAgIGxvYWRlci5zaG93KCk7XG4gICAgICAgIGNvbnRlbnQuaGlkZSgpO1xuXG4gICAgICAgIGxldCBwcm9jZXNzTm90aWZpY2F0aW9ucyA9IChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgbGV0IG5vdGlmaWNhdGlvbnMgPSByZXNwb25zZS5ub3RpZmljYXRpb25zO1xuXG4gICAgICAgICAgICAkKCcjbm90aWZpY2F0aW9ucycpLmZpbmQoJy53aWRnZXQtY29udGVudCA+IHVsJykuZW1wdHkoKTtcblxuICAgICAgICAgICAgaWYgKG5vdGlmaWNhdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhub3RpZmljYXRpb25zKS5mb3JFYWNoKChsb2NhdGlvbikgPT4gTm90aWZpY2F0aW9ucy5wcm9jZXNzTG9jYXRpb24obG9jYXRpb24sIG5vdGlmaWNhdGlvbnNbbG9jYXRpb25dKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgcmVxdWVzdChgJHtjb25maWcuYmFzZV91cmxfcmVsYXRpdmV9L3Rhc2ske2NvbmZpZy5wYXJhbV9zZXB9Z2V0Tm90aWZpY2F0aW9uc2AsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ3Bvc3QnLFxuICAgICAgICAgICAgYm9keTogeyByZWZyZXNoLCBmaWx0ZXIgfVxuICAgICAgICB9LCAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIHByb2Nlc3NOb3RpZmljYXRpb25zKHJlc3BvbnNlKTtcbiAgICAgICAgfSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgbGV0IHdpZGdldCA9ICQoJyNub3RpZmljYXRpb25zIC53aWRnZXQtY29udGVudCcpO1xuICAgICAgICAgICAgd2lkZ2V0XG4gICAgICAgICAgICAgICAgLmZpbmQoJy53aWRnZXQtbG9hZGVyJylcbiAgICAgICAgICAgICAgICAuZmluZCgnZGl2JykucmVtb3ZlKCk7XG5cbiAgICAgICAgICAgIHdpZGdldFxuICAgICAgICAgICAgICAgIC5maW5kKCcud2lkZ2V0LWxvYWRlcicpXG4gICAgICAgICAgICAgICAgLmFwcGVuZCgnPGRpdj5GYWlsZWQgdG8gcmV0cmlldmUgbm90aWZpY2F0aW9uczwvZGl2PicpXG4gICAgICAgICAgICAgICAgLmZpbmQoJy5mYS1zcGluJylcbiAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ2ZhLXNwaW4gZmEtcmVmcmVzaCcpLmFkZENsYXNzKCdmYS13YXJuaW5nJyk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxubGV0IG5vdGlmaWNhdGlvbnMgPSBuZXcgTm90aWZpY2F0aW9ucygpO1xuZXhwb3J0IGRlZmF1bHQgbm90aWZpY2F0aW9ucztcblxuaWYgKGNhbkZldGNoTm90aWZpY2F0aW9ucygpKSB7XG4gICAgbm90aWZpY2F0aW9ucy5mZXRjaCgpO1xuXG4gICAgLyogSGlkZSBhIG5vdGlmaWNhdGlvbiBhbmQgc3RvcmUgaXQgaGlkZGVuICovXG4gICAgLy8gPGEgaHJlZj1cIiNcIiBkYXRhLW5vdGlmaWNhdGlvbi1hY3Rpb249XCJoaWRlLW5vdGlmaWNhdGlvblwiIGRhdGEtbm90aWZpY2F0aW9uLWlkPVwiJHtub3RpZmljYXRpb24uaWR9XCIgY2xhc3M9XCJjbG9zZSBoaWRlLW5vdGlmaWNhdGlvblwiPjxpIGNsYXNzPVwiZmEgZmEtY2xvc2VcIj48L2k+PC9hPlxuICAgICQoZG9jdW1lbnQpLm9uKCdjbGljaycsICdbZGF0YS1ub3RpZmljYXRpb24tYWN0aW9uPVwiaGlkZS1ub3RpZmljYXRpb25cIl0nLCAoZXZlbnQpID0+IHtcbiAgICAgICAgbGV0IG5vdGlmaWNhdGlvbl9pZCA9ICQoZXZlbnQudGFyZ2V0KS5wYXJlbnRzKCcuaGlkZS1ub3RpZmljYXRpb24nKS5kYXRhKCdub3RpZmljYXRpb24taWQnKTtcblxuICAgICAgICBsZXQgdXJsID0gYCR7Y29uZmlnLmJhc2VfdXJsX3JlbGF0aXZlfS9ub3RpZmljYXRpb25zLmpzb24vdGFzayR7Y29uZmlnLnBhcmFtX3NlcH1oaWRlTm90aWZpY2F0aW9uL25vdGlmaWNhdGlvbl9pZCR7Y29uZmlnLnBhcmFtX3NlcH0ke25vdGlmaWNhdGlvbl9pZH1gO1xuXG4gICAgICAgIHJlcXVlc3QodXJsLCB7IG1ldGhvZDogJ3Bvc3QnIH0sICgpID0+IHt9KTtcblxuICAgICAgICAkKGV2ZW50LnRhcmdldCkucGFyZW50cygnLnNpbmdsZS1ub3RpZmljYXRpb24nKS5oaWRlKCk7XG4gICAgfSk7XG5cbiAgICAkKGRvY3VtZW50KS5vbignY2xpY2snLCAnW2RhdGEtbm90aWZpY2F0aW9uLWFjdGlvbj1cImhpZGUtbm90aWZpY2F0aW9uXCJdJywgKGV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9ICQoZXZlbnQuY3VycmVudFRhcmdldCk7XG4gICAgICAgIGNvbnN0IG5vdGlmaWNhdGlvbiA9IHRhcmdldC5wYXJlbnQoKTtcblxuICAgICAgICBub3RpZmljYXRpb24uc2xpZGVVcCgoKSA9PiBub3RpZmljYXRpb24ucmVtb3ZlKCkpO1xuICAgIH0pO1xuXG4gICAgJChkb2N1bWVudCkub24oJ2NsaWNrJywgJ1tkYXRhLW5vdGlmaWNhdGlvbi1hY3Rpb249XCJzaG93LWFsbC1ub3RpZmljYXRpb25zXCJdJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICQoJyNub3RpZmljYXRpb25zIC5zaG93LWFsbCcpLmhpZGUoKTtcbiAgICAgICAgJCgnI25vdGlmaWNhdGlvbnMgLmhpZGRlbicpLnJlbW92ZUNsYXNzKCdoaWRkZW4nKTtcbiAgICB9KTtcblxuICAgICQoZG9jdW1lbnQpLm9uKCdjbGljaycsICdbZGF0YS1yZWZyZXNoPVwibm90aWZpY2F0aW9uc1wiXScsIChldmVudCkgPT4ge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBub3RpZmljYXRpb25zLmZldGNoKHsgZmlsdGVyOiBbJ2ZlZWQnXSwgcmVmcmVzaDogdHJ1ZSB9KTtcbiAgICB9KTtcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./app/updates/notifications.js\n"); /***/ }), /***/ "./app/updates/update.js": -/*!*******************************!* +/*!*******************************!*\ !*** ./app/updates/update.js ***! \*******************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { @@ -574,7 +585,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var jque /***/ }), /***/ "./app/utils/2fa.js": -/*!**************************!* +/*!**************************!*\ !*** ./app/utils/2fa.js ***! \**************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { @@ -585,7 +596,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var jque /***/ }), /***/ "./app/utils/bootstrap-collapse.js": -/*!*****************************************!* +/*!*****************************************!*\ !*** ./app/utils/bootstrap-collapse.js ***! \*****************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { @@ -596,7 +607,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var jque /***/ }), /***/ "./app/utils/bootstrap-datetimepicker.js": -/*!***********************************************!* +/*!***********************************************!*\ !*** ./app/utils/bootstrap-datetimepicker.js ***! \***********************************************/ /***/ ((module, exports, __webpack_require__) => { @@ -606,7 +617,7 @@ eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPAC /***/ }), /***/ "./app/utils/bootstrap-dropdown.js": -/*!*****************************************!* +/*!*****************************************!*\ !*** ./app/utils/bootstrap-dropdown.js ***! \*****************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { @@ -617,7 +628,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var jque /***/ }), /***/ "./app/utils/bootstrap-transition.js": -/*!*******************************************!* +/*!*******************************************!*\ !*** ./app/utils/bootstrap-transition.js ***! \*******************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { @@ -628,7 +639,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var jque /***/ }), /***/ "./app/utils/changelog.js": -/*!********************************!* +/*!********************************!*\ !*** ./app/utils/changelog.js ***! \********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { @@ -639,29 +650,29 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var jque /***/ }), /***/ "./app/utils/colors.js": -/*!*****************************!* +/*!*****************************!*\ !*** ./app/utils/colors.js ***! \*****************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"parseHex\": () => /* binding */ parseHex,\n/* harmony export */ \"hsb2rgb\": () => /* binding */ hsb2rgb,\n/* harmony export */ \"rgb2hex\": () => /* binding */ rgb2hex,\n/* harmony export */ \"rgbstr2hex\": () => /* binding */ rgbstr2hex,\n/* harmony export */ \"hsb2hex\": () => /* binding */ hsb2hex,\n/* harmony export */ \"hex2hsb\": () => /* binding */ hex2hsb,\n/* harmony export */ \"rgb2hsb\": () => /* binding */ rgb2hsb,\n/* harmony export */ \"hex2rgb\": () => /* binding */ hex2rgb\n/* harmony export */ });\n// Parses a string and returns a valid hex string when possible\n// parseHex('#fff') => '#ffffff'\nvar parseHex = function parseHex(string) {\n string = string.replace(/[^A-F0-9]/ig, '');\n if (string.length !== 3 && string.length !== 6) return '';\n\n if (string.length === 3) {\n string = string[0] + string[0] + string[1] + string[1] + string[2] + string[2];\n }\n\n return '#' + string.toLowerCase();\n}; // Converts an HSB object to an RGB object\n// hsb2rgb({h: 0, s: 0, b: 100}) => {r: 255, g: 255, b: 255}\n\nvar hsb2rgb = function hsb2rgb(hsb) {\n var rgb = {};\n var h = Math.round(hsb.h);\n var s = Math.round(hsb.s * 255 / 100);\n var v = Math.round(hsb.b * 255 / 100);\n\n if (s === 0) {\n rgb.r = rgb.g = rgb.b = v;\n } else {\n var t1 = v;\n var t2 = (255 - s) * v / 255;\n var t3 = (t1 - t2) * (h % 60) / 60;\n if (h === 360) h = 0;\n\n if (h < 60) {\n rgb.r = t1;\n rgb.b = t2;\n rgb.g = t2 + t3;\n } else if (h < 120) {\n rgb.g = t1;\n rgb.b = t2;\n rgb.r = t1 - t3;\n } else if (h < 180) {\n rgb.g = t1;\n rgb.r = t2;\n rgb.b = t2 + t3;\n } else if (h < 240) {\n rgb.b = t1;\n rgb.r = t2;\n rgb.g = t1 - t3;\n } else if (h < 300) {\n rgb.b = t1;\n rgb.g = t2;\n rgb.r = t2 + t3;\n } else if (h < 360) {\n rgb.r = t1;\n rgb.g = t2;\n rgb.b = t1 - t3;\n } else {\n rgb.r = 0;\n rgb.g = 0;\n rgb.b = 0;\n }\n }\n\n return {\n r: Math.round(rgb.r),\n g: Math.round(rgb.g),\n b: Math.round(rgb.b)\n };\n}; // Converts an RGB object to a HEX string\n// rgb2hex({r: 255, g: 255, b: 255}) => #ffffff\n\nvar rgb2hex = function rgb2hex(rgb) {\n var hex = [rgb.r.toString(16), rgb.g.toString(16), rgb.b.toString(16)];\n hex.forEach(function (val, nr) {\n if (val.length === 1) hex[nr] = '0' + val;\n });\n return '#' + hex.join('');\n}; // Converts and RGB(a) string to a HEX string\n// rgbstr2hex('rgba(255, 255, 255, 0.5)') => #ffffff\n\nvar rgbstr2hex = function rgbstr2hex(rgb) {\n rgb = rgb.match(/^rgba?[\\s+]?\\([\\s+]?(\\d+)[\\s+]?,[\\s+]?(\\d+)[\\s+]?,[\\s+]?(\\d+)[\\s+]?/i);\n return rgb && rgb.length === 4 ? '#' + ('0' + parseInt(rgb[1], 10).toString(16)).slice(-2) + ('0' + parseInt(rgb[2], 10).toString(16)).slice(-2) + ('0' + parseInt(rgb[3], 10).toString(16)).slice(-2) : '';\n}; // Converts an HSB object to a HEX string\n// hsb2hex({h: 0, s: 0, b: 100}) => #ffffff\n\nvar hsb2hex = function hsb2hex(hsb) {\n return rgb2hex(hsb2rgb(hsb));\n}; // Converts a HEX string to an HSB object\n// hex2hsb('#ffffff') => {h: 0, s: 0, b: 100}\n\nvar hex2hsb = function hex2hsb(hex) {\n var hsb = rgb2hsb(hex2rgb(hex));\n if (hsb.s === 0) hsb.h = 360;\n return hsb;\n}; // Converts an RGB object to an HSB object\n// rgb2hsb({r: 255, g: 255, b: 255}) => {h: 0, s: 0, b: 100}\n\nvar rgb2hsb = function rgb2hsb(rgb) {\n var hsb = {\n h: 0,\n s: 0,\n b: 0\n };\n var min = Math.min(rgb.r, rgb.g, rgb.b);\n var max = Math.max(rgb.r, rgb.g, rgb.b);\n var delta = max - min;\n hsb.b = max;\n hsb.s = max !== 0 ? 255 * delta / max : 0;\n\n if (hsb.s !== 0) {\n if (rgb.r === max) {\n hsb.h = (rgb.g - rgb.b) / delta;\n } else if (rgb.g === max) {\n hsb.h = 2 + (rgb.b - rgb.r) / delta;\n } else {\n hsb.h = 4 + (rgb.r - rgb.g) / delta;\n }\n } else {\n hsb.h = -1;\n }\n\n hsb.h *= 60;\n\n if (hsb.h < 0) {\n hsb.h += 360;\n }\n\n hsb.s *= 100 / 255;\n hsb.b *= 100 / 255;\n return hsb;\n}; // Converts a HEX string to an RGB object\n// hex2rgb('#ffffff') => {r: 255, g: 255, b: 255}\n\nvar hex2rgb = function hex2rgb(hex) {\n hex = parseInt(hex.indexOf('#') > -1 ? hex.substring(1) : hex, 16);\n return {\n /* jshint ignore:start */\n r: hex >> 16,\n g: (hex & 0x00FF00) >> 8,\n b: hex & 0x0000FF\n /* jshint ignore:end */\n\n };\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL3V0aWxzL2NvbG9ycy5qcz9lMGE4Il0sIm5hbWVzIjpbInBhcnNlSGV4Iiwic3RyaW5nIiwicmVwbGFjZSIsImxlbmd0aCIsInRvTG93ZXJDYXNlIiwiaHNiMnJnYiIsImhzYiIsInJnYiIsImgiLCJNYXRoIiwicm91bmQiLCJzIiwidiIsImIiLCJyIiwiZyIsInQxIiwidDIiLCJ0MyIsInJnYjJoZXgiLCJoZXgiLCJ0b1N0cmluZyIsImZvckVhY2giLCJ2YWwiLCJuciIsImpvaW4iLCJyZ2JzdHIyaGV4IiwibWF0Y2giLCJwYXJzZUludCIsInNsaWNlIiwiaHNiMmhleCIsImhleDJoc2IiLCJyZ2IyaHNiIiwiaGV4MnJnYiIsIm1pbiIsIm1heCIsImRlbHRhIiwiaW5kZXhPZiIsInN1YnN0cmluZyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ08sSUFBTUEsUUFBUSxHQUFHLFNBQVhBLFFBQVcsQ0FBQ0MsTUFBRCxFQUFZO0FBQ2hDQSxRQUFNLEdBQUdBLE1BQU0sQ0FBQ0MsT0FBUCxDQUFlLGFBQWYsRUFBOEIsRUFBOUIsQ0FBVDtBQUNBLE1BQUlELE1BQU0sQ0FBQ0UsTUFBUCxLQUFrQixDQUFsQixJQUF1QkYsTUFBTSxDQUFDRSxNQUFQLEtBQWtCLENBQTdDLEVBQWdELE9BQU8sRUFBUDs7QUFDaEQsTUFBSUYsTUFBTSxDQUFDRSxNQUFQLEtBQWtCLENBQXRCLEVBQXlCO0FBQ3JCRixVQUFNLEdBQUdBLE1BQU0sQ0FBQyxDQUFELENBQU4sR0FBWUEsTUFBTSxDQUFDLENBQUQsQ0FBbEIsR0FBd0JBLE1BQU0sQ0FBQyxDQUFELENBQTlCLEdBQW9DQSxNQUFNLENBQUMsQ0FBRCxDQUExQyxHQUFnREEsTUFBTSxDQUFDLENBQUQsQ0FBdEQsR0FBNERBLE1BQU0sQ0FBQyxDQUFELENBQTNFO0FBQ0g7O0FBRUQsU0FBTyxNQUFNQSxNQUFNLENBQUNHLFdBQVAsRUFBYjtBQUNILENBUk0sQyxDQVVQ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OUJNLEMsQ0FnQ1A7QUFDQTs7QUFDTyxJQUFNMkIsT0FBTyxHQUFHLFNBQVZBLE9BQVUsQ0FBQ2IsR0FBRCxFQUFTO0FBQzVCQSxLQUFHLEdBQUdRLFFBQVEsQ0FBR1IsR0FBRyxDQUFDaUIsT0FBSixDQUFZLEdBQVosSUFBbUIsQ0FBQyxDQUFyQixHQUEwQmpCLEdBQUcsQ0FBQ2tCLFNBQUosQ0FBYyxDQUFkLENBQTFCLEdBQTZDbEIsR0FBL0MsRUFBcUQsRUFBckQsQ0FBZDtBQUVBLFNBQU87QUFDSDtBQUNBTixLQUFDLEVBQUVNLEdBQUcsSUFBSSxFQUZQO0FBR0hMLEtBQUMsRUFBRSxDQUFDSyxHQUFHLEdBQUcsUUFBUCxLQUFvQixDQUhwQjtBQUlIUCxLQUFDLEVBQUdPLEdBQUcsR0FBRztBQUNWOztBQUxHLEdBQVA7QUFPSCxDQVZNIiwiZmlsZSI6Ii4vYXBwL3V0aWxzL2NvbG9ycy5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIFBhcnNlcyBhIHN0cmluZyBhbmQgcmV0dXJucyBhIHZhbGlkIGhleCBzdHJpbmcgd2hlbiBwb3NzaWJsZVxuLy8gcGFyc2VIZXgoJyNmZmYnKSA9PiAnI2ZmZmZmZidcbmV4cG9ydCBjb25zdCBwYXJzZUhleCA9IChzdHJpbmcpID0+IHtcbiAgICBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZSgvW15BLUYwLTldL2lnLCAnJyk7XG4gICAgaWYgKHN0cmluZy5sZW5ndGggIT09IDMgJiYgc3RyaW5nLmxlbmd0aCAhPT0gNikgcmV0dXJuICcnO1xuICAgIGlmIChzdHJpbmcubGVuZ3RoID09PSAzKSB7XG4gICAgICAgIHN0cmluZyA9IHN0cmluZ1swXSArIHN0cmluZ1swXSArIHN0cmluZ1sxXSArIHN0cmluZ1sxXSArIHN0cmluZ1syXSArIHN0cmluZ1syXTtcbiAgICB9XG5cbiAgICByZXR1cm4gJyMnICsgc3RyaW5nLnRvTG93ZXJDYXNlKCk7XG59O1xuXG4vLyBDb252ZXJ0cyBhbiBIU0Igb2JqZWN0IHRvIGFuIFJHQiBvYmplY3Rcbi8vIGhzYjJyZ2Ioe2g6IDAsIHM6IDAsIGI6IDEwMH0pID0+IHtyOiAyNTUsIGc6IDI1NSwgYjogMjU1fVxuZXhwb3J0IGNvbnN0IGhzYjJyZ2IgPSAoaHNiKSA9PiB7XG4gICAgbGV0IHJnYiA9IHt9O1xuICAgIGxldCBoID0gTWF0aC5yb3VuZChoc2IuaCk7XG4gICAgbGV0IHMgPSBNYXRoLnJvdW5kKGhzYi5zICogMjU1IC8gMTAwKTtcbiAgICBsZXQgdiA9IE1hdGgucm91bmQoaHNiLmIgKiAyNTUgLyAxMDApO1xuICAgIGlmIChzID09PSAwKSB7XG4gICAgICAgIHJnYi5yID0gcmdiLmcgPSByZ2IuYiA9IHY7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHQxID0gdjtcbiAgICAgICAgdmFyIHQyID0gKDI1NSAtIHMpICogdiAvIDI1NTtcbiAgICAgICAgdmFyIHQzID0gKHQxIC0gdDIpICogKGggJSA2MCkgLyA2MDtcbiAgICAgICAgaWYgKGggPT09IDM2MCkgaCA9IDA7XG4gICAgICAgIGlmIChoIDwgNjApIHtcbiAgICAgICAgICAgIHJnYi5yID0gdDE7XG4gICAgICAgICAgICByZ2IuYiA9IHQyO1xuICAgICAgICAgICAgcmdiLmcgPSB0MiArIHQzO1xuICAgICAgICB9IGVsc2UgaWYgKGggPCAxMjApIHtcbiAgICAgICAgICAgIHJnYi5nID0gdDE7XG4gICAgICAgICAgICByZ2IuYiA9IHQyO1xuICAgICAgICAgICAgcmdiLnIgPSB0MSAtIHQzO1xuICAgICAgICB9IGVsc2UgaWYgKGggPCAxODApIHtcbiAgICAgICAgICAgIHJnYi5nID0gdDE7XG4gICAgICAgICAgICByZ2IuciA9IHQyO1xuICAgICAgICAgICAgcmdiLmIgPSB0MiArIHQzO1xuICAgICAgICB9IGVsc2UgaWYgKGggPCAyNDApIHtcbiAgICAgICAgICAgIHJnYi5iID0gdDE7XG4gICAgICAgICAgICByZ2IuciA9IHQyO1xuICAgICAgICAgICAgcmdiLmcgPSB0MSAtIHQzO1xuICAgICAgICB9IGVsc2UgaWYgKGggPCAzMDApIHtcbiAgICAgICAgICAgIHJnYi5iID0gdDE7XG4gICAgICAgICAgICByZ2IuZyA9IHQyO1xuICAgICAgICAgICAgcmdiLnIgPSB0MiArIHQzO1xuICAgICAgICB9IGVsc2UgaWYgKGggPCAzNjApIHtcbiAgICAgICAgICAgIHJnYi5yID0gdDE7XG4gICAgICAgICAgICByZ2IuZyA9IHQyO1xuICAgICAgICAgICAgcmdiLmIgPSB0MSAtIHQzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmdiLnIgPSAwO1xuICAgICAgICAgICAgcmdiLmcgPSAwO1xuICAgICAgICAgICAgcmdiLmIgPSAwO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHI6IE1hdGgucm91bmQocmdiLnIpLFxuICAgICAgICBnOiBNYXRoLnJvdW5kKHJnYi5nKSxcbiAgICAgICAgYjogTWF0aC5yb3VuZChyZ2IuYilcbiAgICB9O1xufTtcblxuLy8gQ29udmVydHMgYW4gUkdCIG9iamVjdCB0byBhIEhFWCBzdHJpbmdcbi8vIHJnYjJoZXgoe3I6IDI1NSwgZzogMjU1LCBiOiAyNTV9KSA9PiAjZmZmZmZmXG5leHBvcnQgY29uc3QgcmdiMmhleCA9IChyZ2IpID0+IHtcbiAgICB2YXIgaGV4ID0gW1xuICAgICAgICByZ2Iuci50b1N0cmluZygxNiksXG4gICAgICAgIHJnYi5nLnRvU3RyaW5nKDE2KSxcbiAgICAgICAgcmdiLmIudG9TdHJpbmcoMTYpXG4gICAgXTtcblxuICAgIGhleC5mb3JFYWNoKCh2YWwsIG5yKSA9PiB7XG4gICAgICAgIGlmICh2YWwubGVuZ3RoID09PSAxKSBoZXhbbnJdID0gJzAnICsgdmFsO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuICcjJyArIGhleC5qb2luKCcnKTtcbn07XG5cbi8vIENvbnZlcnRzIGFuZCBSR0IoYSkgc3RyaW5nIHRvIGEgSEVYIHN0cmluZ1xuLy8gcmdic3RyMmhleCgncmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpJykgPT4gI2ZmZmZmZlxuZXhwb3J0IGNvbnN0IHJnYnN0cjJoZXggPSAocmdiKSA9PiB7XG4gICAgcmdiID0gcmdiLm1hdGNoKC9ecmdiYT9bXFxzK10/XFwoW1xccytdPyhcXGQrKVtcXHMrXT8sW1xccytdPyhcXGQrKVtcXHMrXT8sW1xccytdPyhcXGQrKVtcXHMrXT8vaSk7XG5cbiAgICByZXR1cm4gKHJnYiAmJiByZ2IubGVuZ3RoID09PSA0KSA/ICcjJyArXG4gICAgKCcwJyArIHBhcnNlSW50KHJnYlsxXSwgMTApLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTIpICtcbiAgICAoJzAnICsgcGFyc2VJbnQocmdiWzJdLCAxMCkudG9TdHJpbmcoMTYpKS5zbGljZSgtMikgK1xuICAgICgnMCcgKyBwYXJzZUludChyZ2JbM10sIDEwKS50b1N0cmluZygxNikpLnNsaWNlKC0yKSA6ICcnO1xufTtcblxuLy8gQ29udmVydHMgYW4gSFNCIG9iamVjdCB0byBhIEhFWCBzdHJpbmdcbi8vIGhzYjJoZXgoe2g6IDAsIHM6IDAsIGI6IDEwMH0pID0+ICNmZmZmZmZcbmV4cG9ydCBjb25zdCBoc2IyaGV4ID0gKGhzYikgPT4ge1xuICAgIHJldHVybiByZ2IyaGV4KGhzYjJyZ2IoaHNiKSk7XG59O1xuXG4vLyBDb252ZXJ0cyBhIEhFWCBzdHJpbmcgdG8gYW4gSFNCIG9iamVjdFxuLy8gaGV4MmhzYignI2ZmZmZmZicpID0+IHtoOiAwLCBzOiAwLCBiOiAxMDB9XG5leHBvcnQgY29uc3QgaGV4MmhzYiA9IChoZXgpID0+IHtcbiAgICBsZXQgaHNiID0gcmdiMmhzYihoZXgycmdiKGhleCkpO1xuICAgIGlmIChoc2IucyA9PT0gMCkgaHNiLmggPSAzNjA7XG5cbiAgICByZXR1cm4gaHNiO1xufTtcblxuLy8gQ29udmVydHMgYW4gUkdCIG9iamVjdCB0byBhbiBIU0Igb2JqZWN0XG4vLyByZ2IyaHNiKHtyOiAyNTUsIGc6IDI1NSwgYjogMjU1fSkgPT4ge2g6IDAsIHM6IDAsIGI6IDEwMH1cbmV4cG9ydCBjb25zdCByZ2IyaHNiID0gKHJnYikgPT4ge1xuICAgIGxldCBoc2IgPSB7XG4gICAgICAgIGg6IDAsXG4gICAgICAgIHM6IDAsXG4gICAgICAgIGI6IDBcbiAgICB9O1xuICAgIGxldCBtaW4gPSBNYXRoLm1pbihyZ2IuciwgcmdiLmcsIHJnYi5iKTtcbiAgICBsZXQgbWF4ID0gTWF0aC5tYXgocmdiLnIsIHJnYi5nLCByZ2IuYik7XG4gICAgbGV0IGRlbHRhID0gbWF4IC0gbWluO1xuICAgIGhzYi5iID0gbWF4O1xuICAgIGhzYi5zID0gbWF4ICE9PSAwID8gMjU1ICogZGVsdGEgLyBtYXggOiAwO1xuICAgIGlmIChoc2IucyAhPT0gMCkge1xuICAgICAgICBpZiAocmdiLnIgPT09IG1heCkge1xuICAgICAgICAgICAgaHNiLmggPSAocmdiLmcgLSByZ2IuYikgLyBkZWx0YTtcbiAgICAgICAgfSBlbHNlIGlmIChyZ2IuZyA9PT0gbWF4KSB7XG4gICAgICAgICAgICBoc2IuaCA9IDIgKyAocmdiLmIgLSByZ2IucikgLyBkZWx0YTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGhzYi5oID0gNCArIChyZ2IuciAtIHJnYi5nKSAvIGRlbHRhO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaHNiLmggPSAtMTtcbiAgICB9XG4gICAgaHNiLmggKj0gNjA7XG4gICAgaWYgKGhzYi5oIDwgMCkge1xuICAgICAgICBoc2IuaCArPSAzNjA7XG4gICAgfVxuICAgIGhzYi5zICo9IDEwMCAvIDI1NTtcbiAgICBoc2IuYiAqPSAxMDAgLyAyNTU7XG5cbiAgICByZXR1cm4gaHNiO1xufTtcblxuLy8gQ29udmVydHMgYSBIRVggc3RyaW5nIHRvIGFuIFJHQiBvYmplY3Rcbi8vIGhleDJyZ2IoJyNmZmZmZmYnKSA9PiB7cjogMjU1LCBnOiAyNTUsIGI6IDI1NX1cbmV4cG9ydCBjb25zdCBoZXgycmdiID0gKGhleCkgPT4ge1xuICAgIGhleCA9IHBhcnNlSW50KCgoaGV4LmluZGV4T2YoJyMnKSA+IC0xKSA/IGhleC5zdWJzdHJpbmcoMSkgOiBoZXgpLCAxNik7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICAgIHI6IGhleCA+PiAxNixcbiAgICAgICAgZzogKGhleCAmIDB4MDBGRjAwKSA+PiA4LFxuICAgICAgICBiOiAoaGV4ICYgMHgwMDAwRkYpXG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfTtcbn07XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./app/utils/colors.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"parseHex\": () => (/* binding */ parseHex),\n/* harmony export */ \"hsb2rgb\": () => (/* binding */ hsb2rgb),\n/* harmony export */ \"rgb2hex\": () => (/* binding */ rgb2hex),\n/* harmony export */ \"rgbstr2hex\": () => (/* binding */ rgbstr2hex),\n/* harmony export */ \"hsb2hex\": () => (/* binding */ hsb2hex),\n/* harmony export */ \"hex2hsb\": () => (/* binding */ hex2hsb),\n/* harmony export */ \"rgb2hsb\": () => (/* binding */ rgb2hsb),\n/* harmony export */ \"hex2rgb\": () => (/* binding */ hex2rgb)\n/* harmony export */ });\n// Parses a string and returns a valid hex string when possible\n// parseHex('#fff') => '#ffffff'\nvar parseHex = function parseHex(string) {\n string = string.replace(/[^A-F0-9]/ig, '');\n if (string.length !== 3 && string.length !== 6) return '';\n\n if (string.length === 3) {\n string = string[0] + string[0] + string[1] + string[1] + string[2] + string[2];\n }\n\n return '#' + string.toLowerCase();\n}; // Converts an HSB object to an RGB object\n// hsb2rgb({h: 0, s: 0, b: 100}) => {r: 255, g: 255, b: 255}\n\nvar hsb2rgb = function hsb2rgb(hsb) {\n var rgb = {};\n var h = Math.round(hsb.h);\n var s = Math.round(hsb.s * 255 / 100);\n var v = Math.round(hsb.b * 255 / 100);\n\n if (s === 0) {\n rgb.r = rgb.g = rgb.b = v;\n } else {\n var t1 = v;\n var t2 = (255 - s) * v / 255;\n var t3 = (t1 - t2) * (h % 60) / 60;\n if (h === 360) h = 0;\n\n if (h < 60) {\n rgb.r = t1;\n rgb.b = t2;\n rgb.g = t2 + t3;\n } else if (h < 120) {\n rgb.g = t1;\n rgb.b = t2;\n rgb.r = t1 - t3;\n } else if (h < 180) {\n rgb.g = t1;\n rgb.r = t2;\n rgb.b = t2 + t3;\n } else if (h < 240) {\n rgb.b = t1;\n rgb.r = t2;\n rgb.g = t1 - t3;\n } else if (h < 300) {\n rgb.b = t1;\n rgb.g = t2;\n rgb.r = t2 + t3;\n } else if (h < 360) {\n rgb.r = t1;\n rgb.g = t2;\n rgb.b = t1 - t3;\n } else {\n rgb.r = 0;\n rgb.g = 0;\n rgb.b = 0;\n }\n }\n\n return {\n r: Math.round(rgb.r),\n g: Math.round(rgb.g),\n b: Math.round(rgb.b)\n };\n}; // Converts an RGB object to a HEX string\n// rgb2hex({r: 255, g: 255, b: 255}) => #ffffff\n\nvar rgb2hex = function rgb2hex(rgb) {\n var hex = [rgb.r.toString(16), rgb.g.toString(16), rgb.b.toString(16)];\n hex.forEach(function (val, nr) {\n if (val.length === 1) hex[nr] = '0' + val;\n });\n return '#' + hex.join('');\n}; // Converts and RGB(a) string to a HEX string\n// rgbstr2hex('rgba(255, 255, 255, 0.5)') => #ffffff\n\nvar rgbstr2hex = function rgbstr2hex(rgb) {\n rgb = rgb.match(/^rgba?[\\s+]?\\([\\s+]?(\\d+)[\\s+]?,[\\s+]?(\\d+)[\\s+]?,[\\s+]?(\\d+)[\\s+]?/i);\n return rgb && rgb.length === 4 ? '#' + ('0' + parseInt(rgb[1], 10).toString(16)).slice(-2) + ('0' + parseInt(rgb[2], 10).toString(16)).slice(-2) + ('0' + parseInt(rgb[3], 10).toString(16)).slice(-2) : '';\n}; // Converts an HSB object to a HEX string\n// hsb2hex({h: 0, s: 0, b: 100}) => #ffffff\n\nvar hsb2hex = function hsb2hex(hsb) {\n return rgb2hex(hsb2rgb(hsb));\n}; // Converts a HEX string to an HSB object\n// hex2hsb('#ffffff') => {h: 0, s: 0, b: 100}\n\nvar hex2hsb = function hex2hsb(hex) {\n var hsb = rgb2hsb(hex2rgb(hex));\n if (hsb.s === 0) hsb.h = 360;\n return hsb;\n}; // Converts an RGB object to an HSB object\n// rgb2hsb({r: 255, g: 255, b: 255}) => {h: 0, s: 0, b: 100}\n\nvar rgb2hsb = function rgb2hsb(rgb) {\n var hsb = {\n h: 0,\n s: 0,\n b: 0\n };\n var min = Math.min(rgb.r, rgb.g, rgb.b);\n var max = Math.max(rgb.r, rgb.g, rgb.b);\n var delta = max - min;\n hsb.b = max;\n hsb.s = max !== 0 ? 255 * delta / max : 0;\n\n if (hsb.s !== 0) {\n if (rgb.r === max) {\n hsb.h = (rgb.g - rgb.b) / delta;\n } else if (rgb.g === max) {\n hsb.h = 2 + (rgb.b - rgb.r) / delta;\n } else {\n hsb.h = 4 + (rgb.r - rgb.g) / delta;\n }\n } else {\n hsb.h = -1;\n }\n\n hsb.h *= 60;\n\n if (hsb.h < 0) {\n hsb.h += 360;\n }\n\n hsb.s *= 100 / 255;\n hsb.b *= 100 / 255;\n return hsb;\n}; // Converts a HEX string to an RGB object\n// hex2rgb('#ffffff') => {r: 255, g: 255, b: 255}\n\nvar hex2rgb = function hex2rgb(hex) {\n hex = parseInt(hex.indexOf('#') > -1 ? hex.substring(1) : hex, 16);\n return {\n /* jshint ignore:start */\n r: hex >> 16,\n g: (hex & 0x00FF00) >> 8,\n b: hex & 0x0000FF\n /* jshint ignore:end */\n\n };\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL3V0aWxzL2NvbG9ycy5qcz9lMGE4Il0sIm5hbWVzIjpbInBhcnNlSGV4Iiwic3RyaW5nIiwicmVwbGFjZSIsImxlbmd0aCIsInRvTG93ZXJDYXNlIiwiaHNiMnJnYiIsImhzYiIsInJnYiIsImgiLCJNYXRoIiwicm91bmQiLCJzIiwidiIsImIiLCJyIiwiZyIsInQxIiwidDIiLCJ0MyIsInJnYjJoZXgiLCJoZXgiLCJ0b1N0cmluZyIsImZvckVhY2giLCJ2YWwiLCJuciIsImpvaW4iLCJyZ2JzdHIyaGV4IiwibWF0Y2giLCJwYXJzZUludCIsInNsaWNlIiwiaHNiMmhleCIsImhleDJoc2IiLCJyZ2IyaHNiIiwiaGV4MnJnYiIsIm1pbiIsIm1heCIsImRlbHRhIiwiaW5kZXhPZiIsInN1YnN0cmluZyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ08sSUFBTUEsUUFBUSxHQUFHLFNBQVhBLFFBQVcsQ0FBQ0MsTUFBRCxFQUFZO0FBQ2hDQSxRQUFNLEdBQUdBLE1BQU0sQ0FBQ0MsT0FBUCxDQUFlLGFBQWYsRUFBOEIsRUFBOUIsQ0FBVDtBQUNBLE1BQUlELE1BQU0sQ0FBQ0UsTUFBUCxLQUFrQixDQUFsQixJQUF1QkYsTUFBTSxDQUFDRSxNQUFQLEtBQWtCLENBQTdDLEVBQWdELE9BQU8sRUFBUDs7QUFDaEQsTUFBSUYsTUFBTSxDQUFDRSxNQUFQLEtBQWtCLENBQXRCLEVBQXlCO0FBQ3JCRixVQUFNLEdBQUdBLE1BQU0sQ0FBQyxDQUFELENBQU4sR0FBWUEsTUFBTSxDQUFDLENBQUQsQ0FBbEIsR0FBd0JBLE1BQU0sQ0FBQyxDQUFELENBQTlCLEdBQW9DQSxNQUFNLENBQUMsQ0FBRCxDQUExQyxHQUFnREEsTUFBTSxDQUFDLENBQUQsQ0FBdEQsR0FBNERBLE1BQU0sQ0FBQyxDQUFELENBQTNFO0FBQ0g7O0FBRUQsU0FBTyxNQUFNQSxNQUFNLENBQUNHLFdBQVAsRUFBYjtBQUNILENBUk0sQyxDQVVQ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OUJNLEMsQ0FnQ1A7QUFDQTs7QUFDTyxJQUFNMkIsT0FBTyxHQUFHLFNBQVZBLE9BQVUsQ0FBQ2IsR0FBRCxFQUFTO0FBQzVCQSxLQUFHLEdBQUdRLFFBQVEsQ0FBR1IsR0FBRyxDQUFDaUIsT0FBSixDQUFZLEdBQVosSUFBbUIsQ0FBQyxDQUFyQixHQUEwQmpCLEdBQUcsQ0FBQ2tCLFNBQUosQ0FBYyxDQUFkLENBQTFCLEdBQTZDbEIsR0FBL0MsRUFBcUQsRUFBckQsQ0FBZDtBQUVBLFNBQU87QUFDSDtBQUNBTixLQUFDLEVBQUVNLEdBQUcsSUFBSSxFQUZQO0FBR0hMLEtBQUMsRUFBRSxDQUFDSyxHQUFHLEdBQUcsUUFBUCxLQUFvQixDQUhwQjtBQUlIUCxLQUFDLEVBQUdPLEdBQUcsR0FBRztBQUNWOztBQUxHLEdBQVA7QUFPSCxDQVZNIiwiZmlsZSI6Ii4vYXBwL3V0aWxzL2NvbG9ycy5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIFBhcnNlcyBhIHN0cmluZyBhbmQgcmV0dXJucyBhIHZhbGlkIGhleCBzdHJpbmcgd2hlbiBwb3NzaWJsZVxuLy8gcGFyc2VIZXgoJyNmZmYnKSA9PiAnI2ZmZmZmZidcbmV4cG9ydCBjb25zdCBwYXJzZUhleCA9IChzdHJpbmcpID0+IHtcbiAgICBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZSgvW15BLUYwLTldL2lnLCAnJyk7XG4gICAgaWYgKHN0cmluZy5sZW5ndGggIT09IDMgJiYgc3RyaW5nLmxlbmd0aCAhPT0gNikgcmV0dXJuICcnO1xuICAgIGlmIChzdHJpbmcubGVuZ3RoID09PSAzKSB7XG4gICAgICAgIHN0cmluZyA9IHN0cmluZ1swXSArIHN0cmluZ1swXSArIHN0cmluZ1sxXSArIHN0cmluZ1sxXSArIHN0cmluZ1syXSArIHN0cmluZ1syXTtcbiAgICB9XG5cbiAgICByZXR1cm4gJyMnICsgc3RyaW5nLnRvTG93ZXJDYXNlKCk7XG59O1xuXG4vLyBDb252ZXJ0cyBhbiBIU0Igb2JqZWN0IHRvIGFuIFJHQiBvYmplY3Rcbi8vIGhzYjJyZ2Ioe2g6IDAsIHM6IDAsIGI6IDEwMH0pID0+IHtyOiAyNTUsIGc6IDI1NSwgYjogMjU1fVxuZXhwb3J0IGNvbnN0IGhzYjJyZ2IgPSAoaHNiKSA9PiB7XG4gICAgbGV0IHJnYiA9IHt9O1xuICAgIGxldCBoID0gTWF0aC5yb3VuZChoc2IuaCk7XG4gICAgbGV0IHMgPSBNYXRoLnJvdW5kKGhzYi5zICogMjU1IC8gMTAwKTtcbiAgICBsZXQgdiA9IE1hdGgucm91bmQoaHNiLmIgKiAyNTUgLyAxMDApO1xuICAgIGlmIChzID09PSAwKSB7XG4gICAgICAgIHJnYi5yID0gcmdiLmcgPSByZ2IuYiA9IHY7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHQxID0gdjtcbiAgICAgICAgdmFyIHQyID0gKDI1NSAtIHMpICogdiAvIDI1NTtcbiAgICAgICAgdmFyIHQzID0gKHQxIC0gdDIpICogKGggJSA2MCkgLyA2MDtcbiAgICAgICAgaWYgKGggPT09IDM2MCkgaCA9IDA7XG4gICAgICAgIGlmIChoIDwgNjApIHtcbiAgICAgICAgICAgIHJnYi5yID0gdDE7XG4gICAgICAgICAgICByZ2IuYiA9IHQyO1xuICAgICAgICAgICAgcmdiLmcgPSB0MiArIHQzO1xuICAgICAgICB9IGVsc2UgaWYgKGggPCAxMjApIHtcbiAgICAgICAgICAgIHJnYi5nID0gdDE7XG4gICAgICAgICAgICByZ2IuYiA9IHQyO1xuICAgICAgICAgICAgcmdiLnIgPSB0MSAtIHQzO1xuICAgICAgICB9IGVsc2UgaWYgKGggPCAxODApIHtcbiAgICAgICAgICAgIHJnYi5nID0gdDE7XG4gICAgICAgICAgICByZ2IuciA9IHQyO1xuICAgICAgICAgICAgcmdiLmIgPSB0MiArIHQzO1xuICAgICAgICB9IGVsc2UgaWYgKGggPCAyNDApIHtcbiAgICAgICAgICAgIHJnYi5iID0gdDE7XG4gICAgICAgICAgICByZ2IuciA9IHQyO1xuICAgICAgICAgICAgcmdiLmcgPSB0MSAtIHQzO1xuICAgICAgICB9IGVsc2UgaWYgKGggPCAzMDApIHtcbiAgICAgICAgICAgIHJnYi5iID0gdDE7XG4gICAgICAgICAgICByZ2IuZyA9IHQyO1xuICAgICAgICAgICAgcmdiLnIgPSB0MiArIHQzO1xuICAgICAgICB9IGVsc2UgaWYgKGggPCAzNjApIHtcbiAgICAgICAgICAgIHJnYi5yID0gdDE7XG4gICAgICAgICAgICByZ2IuZyA9IHQyO1xuICAgICAgICAgICAgcmdiLmIgPSB0MSAtIHQzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmdiLnIgPSAwO1xuICAgICAgICAgICAgcmdiLmcgPSAwO1xuICAgICAgICAgICAgcmdiLmIgPSAwO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHI6IE1hdGgucm91bmQocmdiLnIpLFxuICAgICAgICBnOiBNYXRoLnJvdW5kKHJnYi5nKSxcbiAgICAgICAgYjogTWF0aC5yb3VuZChyZ2IuYilcbiAgICB9O1xufTtcblxuLy8gQ29udmVydHMgYW4gUkdCIG9iamVjdCB0byBhIEhFWCBzdHJpbmdcbi8vIHJnYjJoZXgoe3I6IDI1NSwgZzogMjU1LCBiOiAyNTV9KSA9PiAjZmZmZmZmXG5leHBvcnQgY29uc3QgcmdiMmhleCA9IChyZ2IpID0+IHtcbiAgICB2YXIgaGV4ID0gW1xuICAgICAgICByZ2Iuci50b1N0cmluZygxNiksXG4gICAgICAgIHJnYi5nLnRvU3RyaW5nKDE2KSxcbiAgICAgICAgcmdiLmIudG9TdHJpbmcoMTYpXG4gICAgXTtcblxuICAgIGhleC5mb3JFYWNoKCh2YWwsIG5yKSA9PiB7XG4gICAgICAgIGlmICh2YWwubGVuZ3RoID09PSAxKSBoZXhbbnJdID0gJzAnICsgdmFsO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuICcjJyArIGhleC5qb2luKCcnKTtcbn07XG5cbi8vIENvbnZlcnRzIGFuZCBSR0IoYSkgc3RyaW5nIHRvIGEgSEVYIHN0cmluZ1xuLy8gcmdic3RyMmhleCgncmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpJykgPT4gI2ZmZmZmZlxuZXhwb3J0IGNvbnN0IHJnYnN0cjJoZXggPSAocmdiKSA9PiB7XG4gICAgcmdiID0gcmdiLm1hdGNoKC9ecmdiYT9bXFxzK10/XFwoW1xccytdPyhcXGQrKVtcXHMrXT8sW1xccytdPyhcXGQrKVtcXHMrXT8sW1xccytdPyhcXGQrKVtcXHMrXT8vaSk7XG5cbiAgICByZXR1cm4gKHJnYiAmJiByZ2IubGVuZ3RoID09PSA0KSA/ICcjJyArXG4gICAgKCcwJyArIHBhcnNlSW50KHJnYlsxXSwgMTApLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTIpICtcbiAgICAoJzAnICsgcGFyc2VJbnQocmdiWzJdLCAxMCkudG9TdHJpbmcoMTYpKS5zbGljZSgtMikgK1xuICAgICgnMCcgKyBwYXJzZUludChyZ2JbM10sIDEwKS50b1N0cmluZygxNikpLnNsaWNlKC0yKSA6ICcnO1xufTtcblxuLy8gQ29udmVydHMgYW4gSFNCIG9iamVjdCB0byBhIEhFWCBzdHJpbmdcbi8vIGhzYjJoZXgoe2g6IDAsIHM6IDAsIGI6IDEwMH0pID0+ICNmZmZmZmZcbmV4cG9ydCBjb25zdCBoc2IyaGV4ID0gKGhzYikgPT4ge1xuICAgIHJldHVybiByZ2IyaGV4KGhzYjJyZ2IoaHNiKSk7XG59O1xuXG4vLyBDb252ZXJ0cyBhIEhFWCBzdHJpbmcgdG8gYW4gSFNCIG9iamVjdFxuLy8gaGV4MmhzYignI2ZmZmZmZicpID0+IHtoOiAwLCBzOiAwLCBiOiAxMDB9XG5leHBvcnQgY29uc3QgaGV4MmhzYiA9IChoZXgpID0+IHtcbiAgICBsZXQgaHNiID0gcmdiMmhzYihoZXgycmdiKGhleCkpO1xuICAgIGlmIChoc2IucyA9PT0gMCkgaHNiLmggPSAzNjA7XG5cbiAgICByZXR1cm4gaHNiO1xufTtcblxuLy8gQ29udmVydHMgYW4gUkdCIG9iamVjdCB0byBhbiBIU0Igb2JqZWN0XG4vLyByZ2IyaHNiKHtyOiAyNTUsIGc6IDI1NSwgYjogMjU1fSkgPT4ge2g6IDAsIHM6IDAsIGI6IDEwMH1cbmV4cG9ydCBjb25zdCByZ2IyaHNiID0gKHJnYikgPT4ge1xuICAgIGxldCBoc2IgPSB7XG4gICAgICAgIGg6IDAsXG4gICAgICAgIHM6IDAsXG4gICAgICAgIGI6IDBcbiAgICB9O1xuICAgIGxldCBtaW4gPSBNYXRoLm1pbihyZ2IuciwgcmdiLmcsIHJnYi5iKTtcbiAgICBsZXQgbWF4ID0gTWF0aC5tYXgocmdiLnIsIHJnYi5nLCByZ2IuYik7XG4gICAgbGV0IGRlbHRhID0gbWF4IC0gbWluO1xuICAgIGhzYi5iID0gbWF4O1xuICAgIGhzYi5zID0gbWF4ICE9PSAwID8gMjU1ICogZGVsdGEgLyBtYXggOiAwO1xuICAgIGlmIChoc2IucyAhPT0gMCkge1xuICAgICAgICBpZiAocmdiLnIgPT09IG1heCkge1xuICAgICAgICAgICAgaHNiLmggPSAocmdiLmcgLSByZ2IuYikgLyBkZWx0YTtcbiAgICAgICAgfSBlbHNlIGlmIChyZ2IuZyA9PT0gbWF4KSB7XG4gICAgICAgICAgICBoc2IuaCA9IDIgKyAocmdiLmIgLSByZ2IucikgLyBkZWx0YTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGhzYi5oID0gNCArIChyZ2IuciAtIHJnYi5nKSAvIGRlbHRhO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaHNiLmggPSAtMTtcbiAgICB9XG4gICAgaHNiLmggKj0gNjA7XG4gICAgaWYgKGhzYi5oIDwgMCkge1xuICAgICAgICBoc2IuaCArPSAzNjA7XG4gICAgfVxuICAgIGhzYi5zICo9IDEwMCAvIDI1NTtcbiAgICBoc2IuYiAqPSAxMDAgLyAyNTU7XG5cbiAgICByZXR1cm4gaHNiO1xufTtcblxuLy8gQ29udmVydHMgYSBIRVggc3RyaW5nIHRvIGFuIFJHQiBvYmplY3Rcbi8vIGhleDJyZ2IoJyNmZmZmZmYnKSA9PiB7cjogMjU1LCBnOiAyNTUsIGI6IDI1NX1cbmV4cG9ydCBjb25zdCBoZXgycmdiID0gKGhleCkgPT4ge1xuICAgIGhleCA9IHBhcnNlSW50KCgoaGV4LmluZGV4T2YoJyMnKSA+IC0xKSA/IGhleC5zdWJzdHJpbmcoMSkgOiBoZXgpLCAxNik7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICAgIHI6IGhleCA+PiAxNixcbiAgICAgICAgZzogKGhleCAmIDB4MDBGRjAwKSA+PiA4LFxuICAgICAgICBiOiAoaGV4ICYgMHgwMDAwRkYpXG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfTtcbn07XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./app/utils/colors.js\n"); /***/ }), /***/ "./app/utils/cookies.js": -/*!******************************!* +/*!******************************!*\ !*** ./app/utils/cookies.js ***! \******************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => __WEBPACK_DEFAULT_EXPORT__\n/* harmony export */ });\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n/*\n * Cookies.js - 1.2.3-grav\n * https://github.com/ScottHamper/Cookies\n *\n * With SameSite support by Grav\n *\n * This is free and unencumbered software released into the public domain.\n */\nvar factory = function factory(window) {\n var _arguments = arguments;\n\n if (_typeof(window.document) !== 'object') {\n throw new Error('Cookies.js requires a `window` with a `document` object');\n }\n\n var Cookies = function Cookies(key, value, options) {\n alert('a');\n return _arguments.length === 1 ? Cookies.get(key) : Cookies.set(key, value, options);\n }; // Allows for setter injection in unit tests\n\n\n Cookies._document = window.document; // Used to ensure cookie keys do not collide with\n // built-in `Object` properties\n\n Cookies._cacheKeyPrefix = 'cookey.'; // Hurr hurr, :)\n\n Cookies._maxExpireDate = new Date('Fri, 31 Dec 9999 23:59:59 UTC');\n Cookies.defaults = {\n path: '/',\n secure: false,\n sameSite: 'Lax'\n };\n\n Cookies.get = function (key) {\n if (Cookies._cachedDocumentCookie !== Cookies._document.cookie) {\n Cookies._renewCache();\n }\n\n var value = Cookies._cache[Cookies._cacheKeyPrefix + key];\n return value === undefined ? undefined : decodeURIComponent(value);\n };\n\n Cookies.set = function (key, value, options) {\n options = Cookies._getExtendedOptions(options);\n options.expires = Cookies._getExpiresDate(value === undefined ? -1 : options.expires);\n Cookies._document.cookie = Cookies._generateCookieString(key, value, options);\n return Cookies;\n };\n\n Cookies.expire = function (key, options) {\n return Cookies.set(key, undefined, options);\n };\n\n Cookies._getExtendedOptions = function (options) {\n return {\n path: options && options.path || Cookies.defaults.path,\n domain: options && options.domain || Cookies.defaults.domain,\n expires: options && options.expires || Cookies.defaults.expires,\n secure: options && options.secure !== undefined ? options.secure : Cookies.defaults.secure,\n sameSite: options && options.sameSite || Cookies.defaults.sameSite\n };\n };\n\n Cookies._isValidDate = function (date) {\n return Object.prototype.toString.call(date) === '[object Date]' && !isNaN(date.getTime());\n };\n\n Cookies._getExpiresDate = function (expires, now) {\n now = now || new Date();\n\n if (typeof expires === 'number') {\n expires = expires === Infinity ? Cookies._maxExpireDate : new Date(now.getTime() + expires * 1000);\n } else if (typeof expires === 'string') {\n expires = new Date(expires);\n }\n\n if (expires && !Cookies._isValidDate(expires)) {\n throw new Error('`expires` parameter cannot be converted to a valid Date instance');\n }\n\n return expires;\n };\n\n Cookies._generateCookieString = function (key, value, options) {\n key = key.replace(/[^#$&+\\^`|]/g, encodeURIComponent);\n key = key.replace(/\\(/g, '%28').replace(/\\)/g, '%29');\n value = (value + '').replace(/[^!#$&-+\\--:<-\\[\\]-~]/g, encodeURIComponent);\n options = options || {};\n var cookieString = key + '=' + value;\n cookieString += options.path ? ';path=' + options.path : '';\n cookieString += options.domain ? ';domain=' + options.domain : '';\n cookieString += options.expires ? ';expires=' + options.expires.toUTCString() : '';\n cookieString += options.secure ? ';secure' : '';\n cookieString += options.sameSite ? ';SameSite=' + options.sameSite : '';\n return cookieString;\n };\n\n Cookies._getCacheFromString = function (documentCookie) {\n var cookieCache = {};\n var cookiesArray = documentCookie ? documentCookie.split('; ') : [];\n\n for (var i = 0; i < cookiesArray.length; i++) {\n var cookieKvp = Cookies._getKeyValuePairFromCookieString(cookiesArray[i]);\n\n if (cookieCache[Cookies._cacheKeyPrefix + cookieKvp.key] === undefined) {\n cookieCache[Cookies._cacheKeyPrefix + cookieKvp.key] = cookieKvp.value;\n }\n }\n\n return cookieCache;\n };\n\n Cookies._getKeyValuePairFromCookieString = function (cookieString) {\n // \"=\" is a valid character in a cookie value according to RFC6265, so cannot `split('=')`\n var separatorIndex = cookieString.indexOf('='); // IE omits the \"=\" when the cookie value is an empty string\n\n separatorIndex = separatorIndex < 0 ? cookieString.length : separatorIndex;\n var key = cookieString.substr(0, separatorIndex);\n var decodedKey;\n\n try {\n decodedKey = decodeURIComponent(key);\n } catch (e) {\n if (console && typeof console.error === 'function') {\n console.error('Could not decode cookie with key \"' + key + '\"', e);\n }\n }\n\n return {\n key: decodedKey,\n value: cookieString.substr(separatorIndex + 1) // Defer decoding value until accessed\n\n };\n };\n\n Cookies._renewCache = function () {\n Cookies._cache = Cookies._getCacheFromString(Cookies._document.cookie);\n Cookies._cachedDocumentCookie = Cookies._document.cookie;\n };\n\n Cookies._areEnabled = function () {\n var testKey = 'cookies.js';\n var areEnabled = Cookies.set(testKey, 1).get(testKey) === '1';\n Cookies.expire(testKey);\n return areEnabled;\n };\n\n Cookies.enabled = Cookies._areEnabled();\n return Cookies;\n};\n\n__webpack_require__.g.Cookies = __webpack_require__.g && _typeof(__webpack_require__.g.document) === 'object' ? factory(__webpack_require__.g) : factory;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__webpack_require__.g.Cookies);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL3V0aWxzL2Nvb2tpZXMuanM/ZWNlNSJdLCJuYW1lcyI6WyJmYWN0b3J5Iiwid2luZG93IiwiZG9jdW1lbnQiLCJFcnJvciIsIkNvb2tpZXMiLCJrZXkiLCJ2YWx1ZSIsIm9wdGlvbnMiLCJhbGVydCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImdldCIsInNldCIsIl9kb2N1bWVudCIsIl9jYWNoZUtleVByZWZpeCIsIl9tYXhFeHBpcmVEYXRlIiwiRGF0ZSIsImRlZmF1bHRzIiwicGF0aCIsInNlY3VyZSIsInNhbWVTaXRlIiwiX2NhY2hlZERvY3VtZW50Q29va2llIiwiY29va2llIiwiX3JlbmV3Q2FjaGUiLCJfY2FjaGUiLCJ1bmRlZmluZWQiLCJkZWNvZGVVUklDb21wb25lbnQiLCJfZ2V0RXh0ZW5kZWRPcHRpb25zIiwiZXhwaXJlcyIsIl9nZXRFeHBpcmVzRGF0ZSIsIl9nZW5lcmF0ZUNvb2tpZVN0cmluZyIsImV4cGlyZSIsImRvbWFpbiIsIl9pc1ZhbGlkRGF0ZSIsImRhdGUiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJ0b1N0cmluZyIsImNhbGwiLCJpc05hTiIsImdldFRpbWUiLCJub3ciLCJJbmZpbml0eSIsInJlcGxhY2UiLCJlbmNvZGVVUklDb21wb25lbnQiLCJjb29raWVTdHJpbmciLCJ0b1VUQ1N0cmluZyIsIl9nZXRDYWNoZUZyb21TdHJpbmciLCJkb2N1bWVudENvb2tpZSIsImNvb2tpZUNhY2hlIiwiY29va2llc0FycmF5Iiwic3BsaXQiLCJpIiwiY29va2llS3ZwIiwiX2dldEtleVZhbHVlUGFpckZyb21Db29raWVTdHJpbmciLCJzZXBhcmF0b3JJbmRleCIsImluZGV4T2YiLCJzdWJzdHIiLCJkZWNvZGVkS2V5IiwiZSIsImNvbnNvbGUiLCJlcnJvciIsIl9hcmVFbmFibGVkIiwidGVzdEtleSIsImFyZUVuYWJsZWQiLCJlbmFibGVkIiwiZ2xvYmFsIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtB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QUFvRWxFLE9BQXJGO0FBRUEsaUVBQWVrRSxxQkFBTSxDQUFDOUQsT0FBdEIiLCJmaWxlIjoiLi9hcHAvdXRpbHMvY29va2llcy5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb29raWVzLmpzIC0gMS4yLjMtZ3JhdlxuICogaHR0cHM6Ly9naXRodWIuY29tL1Njb3R0SGFtcGVyL0Nvb2tpZXNcbiAqXG4gKiBXaXRoIFNhbWVTaXRlIHN1cHBvcnQgYnkgR3JhdlxuICpcbiAqIFRoaXMgaXMgZnJlZSBhbmQgdW5lbmN1bWJlcmVkIHNvZnR3YXJlIHJlbGVhc2VkIGludG8gdGhlIHB1YmxpYyBkb21haW4uXG4gKi9cblxuY29uc3QgZmFjdG9yeSA9IGZ1bmN0aW9uKHdpbmRvdykge1xuICAgIGlmICh0eXBlb2Ygd2luZG93LmRvY3VtZW50ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nvb2tpZXMuanMgcmVxdWlyZXMgYSBgd2luZG93YCB3aXRoIGEgYGRvY3VtZW50YCBvYmplY3QnKTtcbiAgICB9XG5cbiAgICBjb25zdCBDb29raWVzID0gKGtleSwgdmFsdWUsIG9wdGlvbnMpID0+IHtcbiAgICAgICAgYWxlcnQoJ2EnKTtcbiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDFcbiAgICAgICAgICAgID8gQ29va2llcy5nZXQoa2V5KVxuICAgICAgICAgICAgOiBDb29raWVzLnNldChrZXksIHZhbHVlLCBvcHRpb25zKTtcbiAgICB9O1xuXG4gICAgLy8gQWxsb3dzIGZvciBzZXR0ZXIgaW5qZWN0aW9uIGluIHVuaXQgdGVzdHNcbiAgICBDb29raWVzLl9kb2N1bWVudCA9IHdpbmRvdy5kb2N1bWVudDtcblxuICAgIC8vIFVzZWQgdG8gZW5zdXJlIGNvb2tpZSBrZXlzIGRvIG5vdCBjb2xsaWRlIHdpdGhcbiAgICAvLyBidWlsdC1pbiBgT2JqZWN0YCBwcm9wZXJ0aWVzXG4gICAgQ29va2llcy5fY2FjaGVLZXlQcmVmaXggPSAnY29va2V5Lic7IC8vIEh1cnIgaHVyciwgOilcblxuICAgIENvb2tpZXMuX21heEV4cGlyZURhdGUgPSBuZXcgRGF0ZSgnRnJpLCAzMSBEZWMgOTk5OSAyMzo1OTo1OSBVVEMnKTtcblxuICAgIENvb2tpZXMuZGVmYXVsdHMgPSB7XG4gICAgICAgIHBhdGg6ICcvJyxcbiAgICAgICAgc2VjdXJlOiBmYWxzZSxcbiAgICAgICAgc2FtZVNpdGU6ICdMYXgnXG4gICAgfTtcblxuICAgIENvb2tpZXMuZ2V0ID0gKGtleSkgPT4ge1xuICAgICAgICBpZiAoQ29va2llcy5fY2FjaGVkRG9jdW1lbnRDb29raWUgIT09IENvb2tpZXMuX2RvY3VtZW50LmNvb2tpZSkge1xuICAgICAgICAgICAgQ29va2llcy5fcmVuZXdDYWNoZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSBDb29raWVzLl9jYWNoZVtDb29raWVzLl9jYWNoZUtleVByZWZpeCArIGtleV07XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBkZWNvZGVVUklDb21wb25lbnQodmFsdWUpO1xuICAgIH07XG5cbiAgICBDb29raWVzLnNldCA9IChrZXksIHZhbHVlLCBvcHRpb25zKSA9PiB7XG4gICAgICAgIG9wdGlvbnMgPSBDb29raWVzLl9nZXRFeHRlbmRlZE9wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgIG9wdGlvbnMuZXhwaXJlcyA9IENvb2tpZXMuX2dldEV4cGlyZXNEYXRlKHZhbHVlID09PSB1bmRlZmluZWQgPyAtMSA6IG9wdGlvbnMuZXhwaXJlcyk7XG5cbiAgICAgICAgQ29va2llcy5fZG9jdW1lbnQuY29va2llID0gQ29va2llcy5fZ2VuZXJhdGVDb29raWVTdHJpbmcoa2V5LCB2YWx1ZSwgb3B0aW9ucyk7XG5cbiAgICAgICAgcmV0dXJuIENvb2tpZXM7XG4gICAgfTtcblxuICAgIENvb2tpZXMuZXhwaXJlID0gKGtleSwgb3B0aW9ucykgPT4ge1xuICAgICAgICByZXR1cm4gQ29va2llcy5zZXQoa2V5LCB1bmRlZmluZWQsIG9wdGlvbnMpO1xuICAgIH07XG5cbiAgICBDb29raWVzLl9nZXRFeHRlbmRlZE9wdGlvbnMgPSAob3B0aW9ucykgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcGF0aDogb3B0aW9ucyAmJiBvcHRpb25zLnBhdGggfHwgQ29va2llcy5kZWZhdWx0cy5wYXRoLFxuICAgICAgICAgICAgZG9tYWluOiBvcHRpb25zICYmIG9wdGlvbnMuZG9tYWluIHx8IENvb2tpZXMuZGVmYXVsdHMuZG9tYWluLFxuICAgICAgICAgICAgZXhwaXJlczogb3B0aW9ucyAmJiBvcHRpb25zLmV4cGlyZXMgfHwgQ29va2llcy5kZWZhdWx0cy5leHBpcmVzLFxuICAgICAgICAgICAgc2VjdXJlOiBvcHRpb25zICYmIG9wdGlvbnMuc2VjdXJlICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLnNlY3VyZSA6IENvb2tpZXMuZGVmYXVsdHMuc2VjdXJlLFxuICAgICAgICAgICAgc2FtZVNpdGU6IG9wdGlvbnMgJiYgb3B0aW9ucy5zYW1lU2l0ZSB8fCBDb29raWVzLmRlZmF1bHRzLnNhbWVTaXRlXG4gICAgICAgIH07XG4gICAgfTtcblxuICAgIENvb2tpZXMuX2lzVmFsaWREYXRlID0gKGRhdGUpID0+IHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkYXRlKSA9PT0gJ1tvYmplY3QgRGF0ZV0nICYmICFpc05hTihkYXRlLmdldFRpbWUoKSk7XG4gICAgfTtcblxuICAgIENvb2tpZXMuX2dldEV4cGlyZXNEYXRlID0gKGV4cGlyZXMsIG5vdykgPT4ge1xuICAgICAgICBub3cgPSBub3cgfHwgbmV3IERhdGUoKTtcblxuICAgICAgICBpZiAodHlwZW9mIGV4cGlyZXMgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBleHBpcmVzID0gZXhwaXJlcyA9PT0gSW5maW5pdHlcbiAgICAgICAgICAgICAgICA/IENvb2tpZXMuX21heEV4cGlyZURhdGVcbiAgICAgICAgICAgICAgICA6IG5ldyBEYXRlKG5vdy5nZXRUaW1lKCkgKyBleHBpcmVzICogMTAwMCk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cGlyZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBleHBpcmVzID0gbmV3IERhdGUoZXhwaXJlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXhwaXJlcyAmJiAhQ29va2llcy5faXNWYWxpZERhdGUoZXhwaXJlcykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignYGV4cGlyZXNgIHBhcmFtZXRlciBjYW5ub3QgYmUgY29udmVydGVkIHRvIGEgdmFsaWQgRGF0ZSBpbnN0YW5jZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGV4cGlyZXM7XG4gICAgfTtcblxuICAgIENvb2tpZXMuX2dlbmVyYXRlQ29va2llU3RyaW5nID0gKGtleSwgdmFsdWUsIG9wdGlvbnMpID0+IHtcbiAgICAgICAga2V5ID0ga2V5LnJlcGxhY2UoL1teIyQmK1xcXmB8XS9nLCBlbmNvZGVVUklDb21wb25lbnQpO1xuICAgICAgICBrZXkgPSBrZXkucmVwbGFjZSgvXFwoL2csICclMjgnKS5yZXBsYWNlKC9cXCkvZywgJyUyOScpO1xuICAgICAgICB2YWx1ZSA9ICh2YWx1ZSArICcnKS5yZXBsYWNlKC9bXiEjJCYtK1xcLS06PC1cXFtcXF0tfl0vZywgZW5jb2RlVVJJQ29tcG9uZW50KTtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgICAgbGV0IGNvb2tpZVN0cmluZyA9IGtleSArICc9JyArIHZhbHVlO1xuICAgICAgICBjb29raWVTdHJpbmcgKz0gb3B0aW9ucy5wYXRoID8gJztwYXRoPScgKyBvcHRpb25zLnBhdGggOiAnJztcbiAgICAgICAgY29va2llU3RyaW5nICs9IG9wdGlvbnMuZG9tYWluID8gJztkb21haW49JyArIG9wdGlvbnMuZG9tYWluIDogJyc7XG4gICAgICAgIGNvb2tpZVN0cmluZyArPSBvcHRpb25zLmV4cGlyZXMgPyAnO2V4cGlyZXM9JyArIG9wdGlvbnMuZXhwaXJlcy50b1VUQ1N0cmluZygpIDogJyc7XG4gICAgICAgIGNvb2tpZVN0cmluZyArPSBvcHRpb25zLnNlY3VyZSA/ICc7c2VjdXJlJyA6ICcnO1xuICAgICAgICBjb29raWVTdHJpbmcgKz0gb3B0aW9ucy5zYW1lU2l0ZSA/ICc7U2FtZVNpdGU9JyArIG9wdGlvbnMuc2FtZVNpdGUgOiAnJztcblxuICAgICAgICByZXR1cm4gY29va2llU3RyaW5nO1xuICAgIH07XG5cbiAgICBDb29raWVzLl9nZXRDYWNoZUZyb21TdHJpbmcgPSAoZG9jdW1lbnRDb29raWUpID0+IHtcbiAgICAgICAgbGV0IGNvb2tpZUNhY2hlID0ge307XG4gICAgICAgIGNvbnN0IGNvb2tpZXNBcnJheSA9IGRvY3VtZW50Q29va2llID8gZG9jdW1lbnRDb29raWUuc3BsaXQoJzsgJykgOiBbXTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvb2tpZXNBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgY29va2llS3ZwID0gQ29va2llcy5fZ2V0S2V5VmFsdWVQYWlyRnJvbUNvb2tpZVN0cmluZyhjb29raWVzQXJyYXlbaV0pO1xuXG4gICAgICAgICAgICBpZiAoY29va2llQ2FjaGVbQ29va2llcy5fY2FjaGVLZXlQcmVmaXggKyBjb29raWVLdnAua2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29va2llQ2FjaGVbQ29va2llcy5fY2FjaGVLZXlQcmVmaXggKyBjb29raWVLdnAua2V5XSA9IGNvb2tpZUt2cC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb29raWVDYWNoZTtcbiAgICB9O1xuXG4gICAgQ29va2llcy5fZ2V0S2V5VmFsdWVQYWlyRnJvbUNvb2tpZVN0cmluZyA9IChjb29raWVTdHJpbmcpID0+IHtcbiAgICAgICAgLy8gXCI9XCIgaXMgYSB2YWxpZCBjaGFyYWN0ZXIgaW4gYSBjb29raWUgdmFsdWUgYWNjb3JkaW5nIHRvIFJGQzYyNjUsIHNvIGNhbm5vdCBgc3BsaXQoJz0nKWBcbiAgICAgICAgbGV0IHNlcGFyYXRvckluZGV4ID0gY29va2llU3RyaW5nLmluZGV4T2YoJz0nKTtcblxuICAgICAgICAvLyBJRSBvbWl0cyB0aGUgXCI9XCIgd2hlbiB0aGUgY29va2llIHZhbHVlIGlzIGFuIGVtcHR5IHN0cmluZ1xuICAgICAgICBzZXBhcmF0b3JJbmRleCA9IHNlcGFyYXRvckluZGV4IDwgMCA/IGNvb2tpZVN0cmluZy5sZW5ndGggOiBzZXBhcmF0b3JJbmRleDtcblxuICAgICAgICBjb25zdCBrZXkgPSBjb29raWVTdHJpbmcuc3Vic3RyKDAsIHNlcGFyYXRvckluZGV4KTtcbiAgICAgICAgbGV0IGRlY29kZWRLZXk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBkZWNvZGVkS2V5ID0gZGVjb2RlVVJJQ29tcG9uZW50KGtleSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChjb25zb2xlICYmIHR5cGVvZiBjb25zb2xlLmVycm9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignQ291bGQgbm90IGRlY29kZSBjb29raWUgd2l0aCBrZXkgXCInICsga2V5ICsgJ1wiJywgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAga2V5OiBkZWNvZGVkS2V5LFxuICAgICAgICAgICAgdmFsdWU6IGNvb2tpZVN0cmluZy5zdWJzdHIoc2VwYXJhdG9ySW5kZXggKyAxKSAvLyBEZWZlciBkZWNvZGluZyB2YWx1ZSB1bnRpbCBhY2Nlc3NlZFxuICAgICAgICB9O1xuICAgIH07XG5cbiAgICBDb29raWVzLl9yZW5ld0NhY2hlID0gKCkgPT4ge1xuICAgICAgICBDb29raWVzLl9jYWNoZSA9IENvb2tpZXMuX2dldENhY2hlRnJvbVN0cmluZyhDb29raWVzLl9kb2N1bWVudC5jb29raWUpO1xuICAgICAgICBDb29raWVzLl9jYWNoZWREb2N1bWVudENvb2tpZSA9IENvb2tpZXMuX2RvY3VtZW50LmNvb2tpZTtcbiAgICB9O1xuXG4gICAgQ29va2llcy5fYXJlRW5hYmxlZCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgdGVzdEtleSA9ICdjb29raWVzLmpzJztcbiAgICAgICAgY29uc3QgYXJlRW5hYmxlZCA9IENvb2tpZXMuc2V0KHRlc3RLZXksIDEpLmdldCh0ZXN0S2V5KSA9PT0gJzEnO1xuICAgICAgICBDb29raWVzLmV4cGlyZSh0ZXN0S2V5KTtcbiAgICAgICAgcmV0dXJuIGFyZUVuYWJsZWQ7XG4gICAgfTtcblxuICAgIENvb2tpZXMuZW5hYmxlZCA9IENvb2tpZXMuX2FyZUVuYWJsZWQoKTtcblxuICAgIHJldHVybiBDb29raWVzO1xufTtcblxuZ2xvYmFsLkNvb2tpZXMgPSAoZ2xvYmFsICYmIHR5cGVvZiBnbG9iYWwuZG9jdW1lbnQgPT09ICdvYmplY3QnKSA/IGZhY3RvcnkoZ2xvYmFsKSA6IGZhY3Rvcnk7XG5cbmV4cG9ydCBkZWZhdWx0IGdsb2JhbC5Db29raWVzO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./app/utils/cookies.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n/*\n * Cookies.js - 1.2.3-grav\n * https://github.com/ScottHamper/Cookies\n *\n * With SameSite support by Grav\n *\n * This is free and unencumbered software released into the public domain.\n */\nvar factory = function factory(window) {\n var _arguments = arguments;\n\n if (_typeof(window.document) !== 'object') {\n throw new Error('Cookies.js requires a `window` with a `document` object');\n }\n\n var Cookies = function Cookies(key, value, options) {\n alert('a');\n return _arguments.length === 1 ? Cookies.get(key) : Cookies.set(key, value, options);\n }; // Allows for setter injection in unit tests\n\n\n Cookies._document = window.document; // Used to ensure cookie keys do not collide with\n // built-in `Object` properties\n\n Cookies._cacheKeyPrefix = 'cookey.'; // Hurr hurr, :)\n\n Cookies._maxExpireDate = new Date('Fri, 31 Dec 9999 23:59:59 UTC');\n Cookies.defaults = {\n path: '/',\n secure: false,\n sameSite: 'Lax'\n };\n\n Cookies.get = function (key) {\n if (Cookies._cachedDocumentCookie !== Cookies._document.cookie) {\n Cookies._renewCache();\n }\n\n var value = Cookies._cache[Cookies._cacheKeyPrefix + key];\n return value === undefined ? undefined : decodeURIComponent(value);\n };\n\n Cookies.set = function (key, value, options) {\n options = Cookies._getExtendedOptions(options);\n options.expires = Cookies._getExpiresDate(value === undefined ? -1 : options.expires);\n Cookies._document.cookie = Cookies._generateCookieString(key, value, options);\n return Cookies;\n };\n\n Cookies.expire = function (key, options) {\n return Cookies.set(key, undefined, options);\n };\n\n Cookies._getExtendedOptions = function (options) {\n return {\n path: options && options.path || Cookies.defaults.path,\n domain: options && options.domain || Cookies.defaults.domain,\n expires: options && options.expires || Cookies.defaults.expires,\n secure: options && options.secure !== undefined ? options.secure : Cookies.defaults.secure,\n sameSite: options && options.sameSite || Cookies.defaults.sameSite\n };\n };\n\n Cookies._isValidDate = function (date) {\n return Object.prototype.toString.call(date) === '[object Date]' && !isNaN(date.getTime());\n };\n\n Cookies._getExpiresDate = function (expires, now) {\n now = now || new Date();\n\n if (typeof expires === 'number') {\n expires = expires === Infinity ? Cookies._maxExpireDate : new Date(now.getTime() + expires * 1000);\n } else if (typeof expires === 'string') {\n expires = new Date(expires);\n }\n\n if (expires && !Cookies._isValidDate(expires)) {\n throw new Error('`expires` parameter cannot be converted to a valid Date instance');\n }\n\n return expires;\n };\n\n Cookies._generateCookieString = function (key, value, options) {\n key = key.replace(/[^#$&+\\^`|]/g, encodeURIComponent);\n key = key.replace(/\\(/g, '%28').replace(/\\)/g, '%29');\n value = (value + '').replace(/[^!#$&-+\\--:<-\\[\\]-~]/g, encodeURIComponent);\n options = options || {};\n var cookieString = key + '=' + value;\n cookieString += options.path ? ';path=' + options.path : '';\n cookieString += options.domain ? ';domain=' + options.domain : '';\n cookieString += options.expires ? ';expires=' + options.expires.toUTCString() : '';\n cookieString += options.secure ? ';secure' : '';\n cookieString += options.sameSite ? ';SameSite=' + options.sameSite : '';\n return cookieString;\n };\n\n Cookies._getCacheFromString = function (documentCookie) {\n var cookieCache = {};\n var cookiesArray = documentCookie ? documentCookie.split('; ') : [];\n\n for (var i = 0; i < cookiesArray.length; i++) {\n var cookieKvp = Cookies._getKeyValuePairFromCookieString(cookiesArray[i]);\n\n if (cookieCache[Cookies._cacheKeyPrefix + cookieKvp.key] === undefined) {\n cookieCache[Cookies._cacheKeyPrefix + cookieKvp.key] = cookieKvp.value;\n }\n }\n\n return cookieCache;\n };\n\n Cookies._getKeyValuePairFromCookieString = function (cookieString) {\n // \"=\" is a valid character in a cookie value according to RFC6265, so cannot `split('=')`\n var separatorIndex = cookieString.indexOf('='); // IE omits the \"=\" when the cookie value is an empty string\n\n separatorIndex = separatorIndex < 0 ? cookieString.length : separatorIndex;\n var key = cookieString.substr(0, separatorIndex);\n var decodedKey;\n\n try {\n decodedKey = decodeURIComponent(key);\n } catch (e) {\n if (console && typeof console.error === 'function') {\n console.error('Could not decode cookie with key \"' + key + '\"', e);\n }\n }\n\n return {\n key: decodedKey,\n value: cookieString.substr(separatorIndex + 1) // Defer decoding value until accessed\n\n };\n };\n\n Cookies._renewCache = function () {\n Cookies._cache = Cookies._getCacheFromString(Cookies._document.cookie);\n Cookies._cachedDocumentCookie = Cookies._document.cookie;\n };\n\n Cookies._areEnabled = function () {\n var testKey = 'cookies.js';\n var areEnabled = Cookies.set(testKey, 1).get(testKey) === '1';\n Cookies.expire(testKey);\n return areEnabled;\n };\n\n Cookies.enabled = Cookies._areEnabled();\n return Cookies;\n};\n\n__webpack_require__.g.Cookies = __webpack_require__.g && _typeof(__webpack_require__.g.document) === 'object' ? factory(__webpack_require__.g) : factory;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__webpack_require__.g.Cookies);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL3V0aWxzL2Nvb2tpZXMuanM/ZWNlNSJdLCJuYW1lcyI6WyJmYWN0b3J5Iiwid2luZG93IiwiZG9jdW1lbnQiLCJFcnJvciIsIkNvb2tpZXMiLCJrZXkiLCJ2YWx1ZSIsIm9wdGlvbnMiLCJhbGVydCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImdldCIsInNldCIsIl9kb2N1bWVudCIsIl9jYWNoZUtleVByZWZpeCIsIl9tYXhFeHBpcmVEYXRlIiwiRGF0ZSIsImRlZmF1bHRzIiwicGF0aCIsInNlY3VyZSIsInNhbWVTaXRlIiwiX2NhY2hlZERvY3VtZW50Q29va2llIiwiY29va2llIiwiX3JlbmV3Q2FjaGUiLCJfY2FjaGUiLCJ1bmRlZmluZWQiLCJkZWNvZGVVUklDb21wb25lbnQiLCJfZ2V0RXh0ZW5kZWRPcHRpb25zIiwiZXhwaXJlcyIsIl9nZXRFeHBpcmVzRGF0ZSIsIl9nZW5lcmF0ZUNvb2tpZVN0cmluZyIsImV4cGlyZSIsImRvbWFpbiIsIl9pc1ZhbGlkRGF0ZSIsImRhdGUiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJ0b1N0cmluZyIsImNhbGwiLCJpc05hTiIsImdldFRpbWUiLCJub3ciLCJJbmZpbml0eSIsInJlcGxhY2UiLCJlbmNvZGVVUklDb21wb25lbnQiLCJjb29raWVTdHJpbmciLCJ0b1VUQ1N0cmluZyIsIl9nZXRDYWNoZUZyb21TdHJpbmciLCJkb2N1bWVudENvb2tpZSIsImNvb2tpZUNhY2hlIiwiY29va2llc0FycmF5Iiwic3BsaXQiLCJpIiwiY29va2llS3ZwIiwiX2dldEtleVZhbHVlUGFpckZyb21Db29raWVTdHJpbmciLCJzZXBhcmF0b3JJbmRleCIsImluZGV4T2YiLCJzdWJzdHIiLCJkZWNvZGVkS2V5IiwiZSIsImNvbnNvbGUiLCJlcnJvciIsIl9hcmVFbmFibGVkIiwidGVzdEtleSIsImFyZUVuYWJsZWQiLCJlbmFibGVkIiwiZ2xvYmFsIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtB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QUFvRWxFLE9BQXJGO0FBRUEsaUVBQWVrRSxxQkFBTSxDQUFDOUQsT0FBdEIiLCJmaWxlIjoiLi9hcHAvdXRpbHMvY29va2llcy5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb29raWVzLmpzIC0gMS4yLjMtZ3JhdlxuICogaHR0cHM6Ly9naXRodWIuY29tL1Njb3R0SGFtcGVyL0Nvb2tpZXNcbiAqXG4gKiBXaXRoIFNhbWVTaXRlIHN1cHBvcnQgYnkgR3JhdlxuICpcbiAqIFRoaXMgaXMgZnJlZSBhbmQgdW5lbmN1bWJlcmVkIHNvZnR3YXJlIHJlbGVhc2VkIGludG8gdGhlIHB1YmxpYyBkb21haW4uXG4gKi9cblxuY29uc3QgZmFjdG9yeSA9IGZ1bmN0aW9uKHdpbmRvdykge1xuICAgIGlmICh0eXBlb2Ygd2luZG93LmRvY3VtZW50ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nvb2tpZXMuanMgcmVxdWlyZXMgYSBgd2luZG93YCB3aXRoIGEgYGRvY3VtZW50YCBvYmplY3QnKTtcbiAgICB9XG5cbiAgICBjb25zdCBDb29raWVzID0gKGtleSwgdmFsdWUsIG9wdGlvbnMpID0+IHtcbiAgICAgICAgYWxlcnQoJ2EnKTtcbiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDFcbiAgICAgICAgICAgID8gQ29va2llcy5nZXQoa2V5KVxuICAgICAgICAgICAgOiBDb29raWVzLnNldChrZXksIHZhbHVlLCBvcHRpb25zKTtcbiAgICB9O1xuXG4gICAgLy8gQWxsb3dzIGZvciBzZXR0ZXIgaW5qZWN0aW9uIGluIHVuaXQgdGVzdHNcbiAgICBDb29raWVzLl9kb2N1bWVudCA9IHdpbmRvdy5kb2N1bWVudDtcblxuICAgIC8vIFVzZWQgdG8gZW5zdXJlIGNvb2tpZSBrZXlzIGRvIG5vdCBjb2xsaWRlIHdpdGhcbiAgICAvLyBidWlsdC1pbiBgT2JqZWN0YCBwcm9wZXJ0aWVzXG4gICAgQ29va2llcy5fY2FjaGVLZXlQcmVmaXggPSAnY29va2V5Lic7IC8vIEh1cnIgaHVyciwgOilcblxuICAgIENvb2tpZXMuX21heEV4cGlyZURhdGUgPSBuZXcgRGF0ZSgnRnJpLCAzMSBEZWMgOTk5OSAyMzo1OTo1OSBVVEMnKTtcblxuICAgIENvb2tpZXMuZGVmYXVsdHMgPSB7XG4gICAgICAgIHBhdGg6ICcvJyxcbiAgICAgICAgc2VjdXJlOiBmYWxzZSxcbiAgICAgICAgc2FtZVNpdGU6ICdMYXgnXG4gICAgfTtcblxuICAgIENvb2tpZXMuZ2V0ID0gKGtleSkgPT4ge1xuICAgICAgICBpZiAoQ29va2llcy5fY2FjaGVkRG9jdW1lbnRDb29raWUgIT09IENvb2tpZXMuX2RvY3VtZW50LmNvb2tpZSkge1xuICAgICAgICAgICAgQ29va2llcy5fcmVuZXdDYWNoZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSBDb29raWVzLl9jYWNoZVtDb29raWVzLl9jYWNoZUtleVByZWZpeCArIGtleV07XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBkZWNvZGVVUklDb21wb25lbnQodmFsdWUpO1xuICAgIH07XG5cbiAgICBDb29raWVzLnNldCA9IChrZXksIHZhbHVlLCBvcHRpb25zKSA9PiB7XG4gICAgICAgIG9wdGlvbnMgPSBDb29raWVzLl9nZXRFeHRlbmRlZE9wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgIG9wdGlvbnMuZXhwaXJlcyA9IENvb2tpZXMuX2dldEV4cGlyZXNEYXRlKHZhbHVlID09PSB1bmRlZmluZWQgPyAtMSA6IG9wdGlvbnMuZXhwaXJlcyk7XG5cbiAgICAgICAgQ29va2llcy5fZG9jdW1lbnQuY29va2llID0gQ29va2llcy5fZ2VuZXJhdGVDb29raWVTdHJpbmcoa2V5LCB2YWx1ZSwgb3B0aW9ucyk7XG5cbiAgICAgICAgcmV0dXJuIENvb2tpZXM7XG4gICAgfTtcblxuICAgIENvb2tpZXMuZXhwaXJlID0gKGtleSwgb3B0aW9ucykgPT4ge1xuICAgICAgICByZXR1cm4gQ29va2llcy5zZXQoa2V5LCB1bmRlZmluZWQsIG9wdGlvbnMpO1xuICAgIH07XG5cbiAgICBDb29raWVzLl9nZXRFeHRlbmRlZE9wdGlvbnMgPSAob3B0aW9ucykgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcGF0aDogb3B0aW9ucyAmJiBvcHRpb25zLnBhdGggfHwgQ29va2llcy5kZWZhdWx0cy5wYXRoLFxuICAgICAgICAgICAgZG9tYWluOiBvcHRpb25zICYmIG9wdGlvbnMuZG9tYWluIHx8IENvb2tpZXMuZGVmYXVsdHMuZG9tYWluLFxuICAgICAgICAgICAgZXhwaXJlczogb3B0aW9ucyAmJiBvcHRpb25zLmV4cGlyZXMgfHwgQ29va2llcy5kZWZhdWx0cy5leHBpcmVzLFxuICAgICAgICAgICAgc2VjdXJlOiBvcHRpb25zICYmIG9wdGlvbnMuc2VjdXJlICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLnNlY3VyZSA6IENvb2tpZXMuZGVmYXVsdHMuc2VjdXJlLFxuICAgICAgICAgICAgc2FtZVNpdGU6IG9wdGlvbnMgJiYgb3B0aW9ucy5zYW1lU2l0ZSB8fCBDb29raWVzLmRlZmF1bHRzLnNhbWVTaXRlXG4gICAgICAgIH07XG4gICAgfTtcblxuICAgIENvb2tpZXMuX2lzVmFsaWREYXRlID0gKGRhdGUpID0+IHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkYXRlKSA9PT0gJ1tvYmplY3QgRGF0ZV0nICYmICFpc05hTihkYXRlLmdldFRpbWUoKSk7XG4gICAgfTtcblxuICAgIENvb2tpZXMuX2dldEV4cGlyZXNEYXRlID0gKGV4cGlyZXMsIG5vdykgPT4ge1xuICAgICAgICBub3cgPSBub3cgfHwgbmV3IERhdGUoKTtcblxuICAgICAgICBpZiAodHlwZW9mIGV4cGlyZXMgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBleHBpcmVzID0gZXhwaXJlcyA9PT0gSW5maW5pdHlcbiAgICAgICAgICAgICAgICA/IENvb2tpZXMuX21heEV4cGlyZURhdGVcbiAgICAgICAgICAgICAgICA6IG5ldyBEYXRlKG5vdy5nZXRUaW1lKCkgKyBleHBpcmVzICogMTAwMCk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cGlyZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBleHBpcmVzID0gbmV3IERhdGUoZXhwaXJlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXhwaXJlcyAmJiAhQ29va2llcy5faXNWYWxpZERhdGUoZXhwaXJlcykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignYGV4cGlyZXNgIHBhcmFtZXRlciBjYW5ub3QgYmUgY29udmVydGVkIHRvIGEgdmFsaWQgRGF0ZSBpbnN0YW5jZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGV4cGlyZXM7XG4gICAgfTtcblxuICAgIENvb2tpZXMuX2dlbmVyYXRlQ29va2llU3RyaW5nID0gKGtleSwgdmFsdWUsIG9wdGlvbnMpID0+IHtcbiAgICAgICAga2V5ID0ga2V5LnJlcGxhY2UoL1teIyQmK1xcXmB8XS9nLCBlbmNvZGVVUklDb21wb25lbnQpO1xuICAgICAgICBrZXkgPSBrZXkucmVwbGFjZSgvXFwoL2csICclMjgnKS5yZXBsYWNlKC9cXCkvZywgJyUyOScpO1xuICAgICAgICB2YWx1ZSA9ICh2YWx1ZSArICcnKS5yZXBsYWNlKC9bXiEjJCYtK1xcLS06PC1cXFtcXF0tfl0vZywgZW5jb2RlVVJJQ29tcG9uZW50KTtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgICAgbGV0IGNvb2tpZVN0cmluZyA9IGtleSArICc9JyArIHZhbHVlO1xuICAgICAgICBjb29raWVTdHJpbmcgKz0gb3B0aW9ucy5wYXRoID8gJztwYXRoPScgKyBvcHRpb25zLnBhdGggOiAnJztcbiAgICAgICAgY29va2llU3RyaW5nICs9IG9wdGlvbnMuZG9tYWluID8gJztkb21haW49JyArIG9wdGlvbnMuZG9tYWluIDogJyc7XG4gICAgICAgIGNvb2tpZVN0cmluZyArPSBvcHRpb25zLmV4cGlyZXMgPyAnO2V4cGlyZXM9JyArIG9wdGlvbnMuZXhwaXJlcy50b1VUQ1N0cmluZygpIDogJyc7XG4gICAgICAgIGNvb2tpZVN0cmluZyArPSBvcHRpb25zLnNlY3VyZSA/ICc7c2VjdXJlJyA6ICcnO1xuICAgICAgICBjb29raWVTdHJpbmcgKz0gb3B0aW9ucy5zYW1lU2l0ZSA/ICc7U2FtZVNpdGU9JyArIG9wdGlvbnMuc2FtZVNpdGUgOiAnJztcblxuICAgICAgICByZXR1cm4gY29va2llU3RyaW5nO1xuICAgIH07XG5cbiAgICBDb29raWVzLl9nZXRDYWNoZUZyb21TdHJpbmcgPSAoZG9jdW1lbnRDb29raWUpID0+IHtcbiAgICAgICAgbGV0IGNvb2tpZUNhY2hlID0ge307XG4gICAgICAgIGNvbnN0IGNvb2tpZXNBcnJheSA9IGRvY3VtZW50Q29va2llID8gZG9jdW1lbnRDb29raWUuc3BsaXQoJzsgJykgOiBbXTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvb2tpZXNBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgY29va2llS3ZwID0gQ29va2llcy5fZ2V0S2V5VmFsdWVQYWlyRnJvbUNvb2tpZVN0cmluZyhjb29raWVzQXJyYXlbaV0pO1xuXG4gICAgICAgICAgICBpZiAoY29va2llQ2FjaGVbQ29va2llcy5fY2FjaGVLZXlQcmVmaXggKyBjb29raWVLdnAua2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29va2llQ2FjaGVbQ29va2llcy5fY2FjaGVLZXlQcmVmaXggKyBjb29raWVLdnAua2V5XSA9IGNvb2tpZUt2cC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb29raWVDYWNoZTtcbiAgICB9O1xuXG4gICAgQ29va2llcy5fZ2V0S2V5VmFsdWVQYWlyRnJvbUNvb2tpZVN0cmluZyA9IChjb29raWVTdHJpbmcpID0+IHtcbiAgICAgICAgLy8gXCI9XCIgaXMgYSB2YWxpZCBjaGFyYWN0ZXIgaW4gYSBjb29raWUgdmFsdWUgYWNjb3JkaW5nIHRvIFJGQzYyNjUsIHNvIGNhbm5vdCBgc3BsaXQoJz0nKWBcbiAgICAgICAgbGV0IHNlcGFyYXRvckluZGV4ID0gY29va2llU3RyaW5nLmluZGV4T2YoJz0nKTtcblxuICAgICAgICAvLyBJRSBvbWl0cyB0aGUgXCI9XCIgd2hlbiB0aGUgY29va2llIHZhbHVlIGlzIGFuIGVtcHR5IHN0cmluZ1xuICAgICAgICBzZXBhcmF0b3JJbmRleCA9IHNlcGFyYXRvckluZGV4IDwgMCA/IGNvb2tpZVN0cmluZy5sZW5ndGggOiBzZXBhcmF0b3JJbmRleDtcblxuICAgICAgICBjb25zdCBrZXkgPSBjb29raWVTdHJpbmcuc3Vic3RyKDAsIHNlcGFyYXRvckluZGV4KTtcbiAgICAgICAgbGV0IGRlY29kZWRLZXk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBkZWNvZGVkS2V5ID0gZGVjb2RlVVJJQ29tcG9uZW50KGtleSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChjb25zb2xlICYmIHR5cGVvZiBjb25zb2xlLmVycm9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignQ291bGQgbm90IGRlY29kZSBjb29raWUgd2l0aCBrZXkgXCInICsga2V5ICsgJ1wiJywgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAga2V5OiBkZWNvZGVkS2V5LFxuICAgICAgICAgICAgdmFsdWU6IGNvb2tpZVN0cmluZy5zdWJzdHIoc2VwYXJhdG9ySW5kZXggKyAxKSAvLyBEZWZlciBkZWNvZGluZyB2YWx1ZSB1bnRpbCBhY2Nlc3NlZFxuICAgICAgICB9O1xuICAgIH07XG5cbiAgICBDb29raWVzLl9yZW5ld0NhY2hlID0gKCkgPT4ge1xuICAgICAgICBDb29raWVzLl9jYWNoZSA9IENvb2tpZXMuX2dldENhY2hlRnJvbVN0cmluZyhDb29raWVzLl9kb2N1bWVudC5jb29raWUpO1xuICAgICAgICBDb29raWVzLl9jYWNoZWREb2N1bWVudENvb2tpZSA9IENvb2tpZXMuX2RvY3VtZW50LmNvb2tpZTtcbiAgICB9O1xuXG4gICAgQ29va2llcy5fYXJlRW5hYmxlZCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgdGVzdEtleSA9ICdjb29raWVzLmpzJztcbiAgICAgICAgY29uc3QgYXJlRW5hYmxlZCA9IENvb2tpZXMuc2V0KHRlc3RLZXksIDEpLmdldCh0ZXN0S2V5KSA9PT0gJzEnO1xuICAgICAgICBDb29raWVzLmV4cGlyZSh0ZXN0S2V5KTtcbiAgICAgICAgcmV0dXJuIGFyZUVuYWJsZWQ7XG4gICAgfTtcblxuICAgIENvb2tpZXMuZW5hYmxlZCA9IENvb2tpZXMuX2FyZUVuYWJsZWQoKTtcblxuICAgIHJldHVybiBDb29raWVzO1xufTtcblxuZ2xvYmFsLkNvb2tpZXMgPSAoZ2xvYmFsICYmIHR5cGVvZiBnbG9iYWwuZG9jdW1lbnQgPT09ICdvYmplY3QnKSA/IGZhY3RvcnkoZ2xvYmFsKSA6IGZhY3Rvcnk7XG5cbmV4cG9ydCBkZWZhdWx0IGdsb2JhbC5Db29raWVzO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./app/utils/cookies.js\n"); /***/ }), /***/ "./app/utils/cron-ui.js": -/*!******************************!* +/*!******************************!*\ !*** ./app/utils/cron-ui.js ***! \******************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { @@ -672,40 +683,40 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var jque /***/ }), /***/ "./app/utils/finderjs.js": -/*!*******************************!* +/*!*******************************!*\ !*** ./app/utils/finderjs.js ***! \*******************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"DEFAULTS\": () => /* binding */ DEFAULTS,\n/* harmony export */ \"default\": () => __WEBPACK_DEFAULT_EXPORT__\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var eventemitter3__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! eventemitter3 */ \"./node_modules/eventemitter3/index.js\");\n/* harmony import */ var eventemitter3__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(eventemitter3__WEBPACK_IMPORTED_MODULE_1__);\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\n * (c) Trilby Media, LLC\n * Author Djamil Legato\n *\n * Based on Mark Matyas's Finderjs\n * MIT License\n */\n\n\nvar DEFAULTS = {\n labelKey: 'name',\n valueKey: 'value',\n // new\n childKey: 'children',\n iconKey: 'icon',\n // new\n itemKey: 'item-key',\n // new\n pathBar: true,\n className: {\n container: 'fjs-container',\n pathBar: 'fjs-path-bar',\n col: 'fjs-col',\n list: 'fjs-list',\n item: 'fjs-item',\n active: 'fjs-active',\n children: 'fjs-has-children',\n url: 'fjs-url',\n itemPrepend: 'fjs-item-prepend',\n itemContent: 'fjs-item-content',\n itemAppend: 'fjs-item-append'\n }\n};\n\nvar Finder = /*#__PURE__*/function () {\n function Finder(container, data, options) {\n var _this = this;\n\n _classCallCheck(this, Finder);\n\n this.$emitter = new (eventemitter3__WEBPACK_IMPORTED_MODULE_1___default())();\n this.container = jquery__WEBPACK_IMPORTED_MODULE_0___default()(container);\n this.data = data;\n this.config = jquery__WEBPACK_IMPORTED_MODULE_0___default().extend({}, DEFAULTS, options); // dom events\n\n this.container.on('click', this.clickEvent.bind(this));\n this.container.on('keydown', this.keydownEvent.bind(this)); // internal events\n\n this.$emitter.on('item-selected', this.itemSelected.bind(this));\n this.$emitter.on('create-column', this.addColumn.bind(this));\n this.$emitter.on('navigate', this.navigate.bind(this));\n this.$emitter.on('go-to', this.goTo.bind(this, this.data));\n this.container.addClass(this.config.className.container).attr('tabindex', 0);\n this.createColumn(this.data);\n\n if (this.config.pathBar) {\n this.pathBar = this.createPathBar();\n this.pathBar.on('click', '[data-breadcrumb-node]', function (event) {\n event.preventDefault();\n var location = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.currentTarget).data('breadcrumbNode');\n\n _this.goTo(_this.data, location);\n });\n } // '' is \n\n\n if (this.config.defaultPath || this.config.defaultPath === '') {\n this.goTo(this.data, this.config.defaultPath);\n }\n }\n\n _createClass(Finder, [{\n key: \"reload\",\n value: function reload() {\n var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.data;\n this.createColumn(data); // '' is \n\n if (this.config.defaultPath || this.config.defaultPath === '') {\n this.goTo(data, this.config.defaultPath);\n }\n }\n }, {\n key: \"createColumn\",\n value: function createColumn(data, parent) {\n var _this2 = this;\n\n var callback = function callback(data) {\n return _this2.createColumn(data, parent);\n };\n\n if (typeof data === 'function') {\n data.call(this, parent, callback);\n } else if (Array.isArray(data) || _typeof(data) === 'object') {\n if (_typeof(data) === 'object') {\n data = Array.from(data);\n }\n\n var list = this.createList(data);\n var div = jquery__WEBPACK_IMPORTED_MODULE_0___default()('
              ');\n div.append(list).addClass(this.config.className.col);\n this.$emitter.emit('create-column', div);\n return div;\n } else {\n throw new Error('Unknown data type');\n }\n }\n }, {\n key: \"createPathBar\",\n value: function createPathBar() {\n this.container.siblings(\".\".concat(this.config.className.pathBar)).remove();\n var pathBar = jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"
              \"));\n pathBar.insertAfter(this.container);\n return pathBar;\n }\n }, {\n key: \"clickEvent\",\n value: function clickEvent(event) {\n event.stopPropagation();\n event.preventDefault();\n var target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.target);\n var column = target.closest(\".\".concat(this.config.className.col));\n var item = target.closest(\".\".concat(this.config.className.item));\n\n if (item.length) {\n this.$emitter.emit('item-selected', {\n column: column,\n item: item\n });\n }\n }\n }, {\n key: \"keydownEvent\",\n value: function keydownEvent(event) {\n var codes = {\n 37: 'left',\n 38: 'up',\n 39: 'right',\n 40: 'down'\n };\n\n if (event.keyCode in codes) {\n event.stopPropagation();\n event.preventDefault();\n this.$emitter.emit('navigate', {\n direction: codes[event.keyCode]\n });\n }\n }\n }, {\n key: \"itemSelected\",\n value: function itemSelected(value) {\n var element = value.item;\n\n if (!element.length) {\n return false;\n }\n\n var item = element[0]._item;\n var column = value.column;\n var data = item[this.config.childKey] || this.data;\n var active = jquery__WEBPACK_IMPORTED_MODULE_0___default()(column).find(\".\".concat(this.config.className.active));\n\n if (active.length) {\n active.removeClass(this.config.className.active);\n }\n\n element.addClass(this.config.className.active);\n column.nextAll().remove(); // ?!?!?\n\n this.container[0].focus();\n window.scrollTo(window.pageXOffset, window.pageYOffset);\n this.updatePathBar();\n var newColumn;\n\n if (data) {\n newColumn = this.createColumn(data, item);\n this.$emitter.emit('interior-selected', item);\n } else {\n this.$emitter.emit('leaf-selected', item);\n }\n\n return newColumn;\n }\n }, {\n key: \"addColumn\",\n value: function addColumn(column) {\n this.container.append(column);\n this.$emitter.emit('column-created', column);\n }\n }, {\n key: \"navigate\",\n value: function navigate(value) {\n var active = this.findLastActive();\n var direction = value.direction;\n var column;\n var item;\n var target;\n\n if (active) {\n item = active.item;\n column = active.column;\n\n if (direction === 'up' && item.prev().length) {\n target = item.prev();\n } else if (direction === 'down' && item.next().length) {\n target = item.next();\n } else if (direction === 'right' && column.next().length) {\n column = column.next();\n target = column.find(\".\".concat(this.config.className.item)).first();\n } else if (direction === 'left' && column.prev().length) {\n column = column.prev();\n target = column.find(\".\".concat(this.config.className.active)).first() || column.find(\".\".concat(this.config.className.item));\n }\n } else {\n column = this.container.find(\".\".concat(this.config.className.col)).first();\n target = column.find(\".\".concat(this.config.className.item)).first();\n }\n\n if (target) {\n this.$emitter.emit('item-selected', {\n column: column,\n item: target\n });\n }\n }\n }, {\n key: \"goTo\",\n value: function goTo(data, path) {\n var _this3 = this;\n\n path = Array.isArray(path) ? path : path.split('/').map(function (bit) {\n return bit.trim();\n }).filter(Boolean);\n\n if (path.length) {\n this.container.children().remove();\n }\n\n if (typeof data === 'function') {\n data.call(this, null, function (data) {\n return _this3.selectPath(path, data);\n });\n } else {\n this.selectPath(path, data);\n }\n }\n }, {\n key: \"selectPath\",\n value: function selectPath(path, data, column) {\n var _this4 = this;\n\n column = column || (path.length ? this.createColumn(data) : this.container.find(\"> .\".concat(this.config.className.col)));\n var current = path[0] || '';\n var children = data.find(function (item) {\n return item[_this4.config.itemKey] === current;\n });\n var newColumn = this.itemSelected({\n column: column,\n item: column.find(\"[data-fjs-item=\\\"\".concat(current, \"\\\"]\")).first()\n });\n path.shift();\n\n if (path.length && children) {\n this.selectPath(path, children[this.config.childKey], newColumn);\n }\n }\n }, {\n key: \"findLastActive\",\n value: function findLastActive() {\n var active = this.container.find(\".\".concat(this.config.className.active));\n\n if (!active.length) {\n return null;\n }\n\n var item = active.last();\n var column = item.closest(\".\".concat(this.config.className.col));\n return {\n item: item,\n column: column\n };\n }\n }, {\n key: \"createList\",\n value: function createList(data) {\n var _this5 = this;\n\n var list = jquery__WEBPACK_IMPORTED_MODULE_0___default()('
                ');\n var items = data.map(function (item) {\n return _this5.createItem(item);\n });\n var fragments = items.reduce(function (fragment, current) {\n fragment.appendChild(current[0] || current);\n return fragment;\n }, document.createDocumentFragment());\n list.append(fragments).addClass(this.config.className.list);\n return list;\n }\n }, {\n key: \"createItem\",\n value: function createItem(item) {\n var listItem = jquery__WEBPACK_IMPORTED_MODULE_0___default()('
              • ');\n var listItemClasses = [this.config.className.item];\n var link = jquery__WEBPACK_IMPORTED_MODULE_0___default()('');\n var createItemContent = this.config.createItemContent || this.createItemContent;\n var fragment = createItemContent.call(this, item);\n link.append(fragment).attr('href', '').attr('tabindex', -1);\n\n if (item.url) {\n link.attr('href', item.url);\n listItemClasses.push(item.className);\n }\n\n if (item[this.config.childKey]) {\n listItemClasses.push(this.config.className[this.config.childKey]);\n }\n\n listItemClasses.push(\"fjs-item-\".concat(item.type));\n listItem.addClass(listItemClasses.join(' '));\n listItem.append(link).attr('data-fjs-item', item[this.config.itemKey]);\n listItem[0]._item = item;\n return listItem;\n }\n }, {\n key: \"updatePathBar\",\n value: function updatePathBar() {\n var _this6 = this;\n\n if (!this.config.pathBar) {\n return false;\n }\n\n var activeItems = this.container.find(\".\".concat(this.config.className.active));\n var itemKeys = '';\n this.pathBar.children().empty();\n activeItems.each(function (index, activeItem) {\n var item = activeItem._item;\n var isLast = index + 1 === activeItems.length;\n itemKeys += \"/\".concat(item[_this6.config.itemKey]);\n\n _this6.pathBar.append(\"\\n \\n \\n \").concat(jquery__WEBPACK_IMPORTED_MODULE_0___default()('
                ').text(item[_this6.config.labelKey]).html(), \"\\n \").concat(!isLast ? '' : '', \"\\n \\n \"));\n });\n }\n }, {\n key: \"getIcon\",\n value: function getIcon(type) {\n switch (type) {\n case 'root':\n return 'fa-sitemap';\n\n case 'file':\n return 'fa-file-o';\n\n case 'dir':\n default:\n return 'fa-folder';\n }\n }\n }]);\n\n return Finder;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Finder);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL3V0aWxzL2ZpbmRlcmpzLmpzP2NmNGMiXSwibmFtZXMiOlsiREVGQVVMVFMiLCJsYWJlbEtleSIsInZhbHVlS2V5IiwiY2hpbGRLZXkiLCJpY29uS2V5IiwiaXRlbUtleSIsInBhdGhCYXIiLCJjbGFzc05hbWUiLCJjb250YWluZXIiLCJjb2wiLCJsaXN0IiwiaXRlbSIsImFjdGl2ZSIsImNoaWxkcmVuIiwidXJsIiwiaXRlbVByZXBlbmQiLCJpdGVtQ29udGVudCIsIml0ZW1BcHBlbmQiLCJGaW5kZXIiLCJkYXRhIiwib3B0aW9ucyIsIiRlbWl0dGVyIiwiRXZlbnRFbWl0dGVyIiwiJCIsImNvbmZpZyIsIm9uIiwiY2xpY2tFdmVudCIsImJpbmQiLCJrZXlkb3duRXZlbnQiLCJpdGVtU2VsZWN0ZWQiLCJhZGRDb2x1bW4iLCJuYXZpZ2F0ZSIsImdvVG8iLCJhZGRDbGFzcyIsImF0dHIiLCJjcmVhdGVDb2x1bW4iLCJjcmVhdGVQYXRoQmFyIiwiZXZlbnQiLCJwcmV2ZW50RGVmYXVsdCIsImxvY2F0aW9uIiwiY3VycmVudFRhcmdldCIsImRlZmF1bHRQYXRoIiwicGFyZW50IiwiY2FsbGJhY2siLCJjYWxsIiwiQXJyYXkiLCJpc0FycmF5IiwiZnJvbSIsImNyZWF0ZUxpc3QiLCJkaXYiLCJhcHBlbmQiLCJlbWl0IiwiRXJyb3IiLCJzaWJsaW5ncyIsInJlbW92ZSIsImluc2VydEFmdGVyIiwic3RvcFByb3BhZ2F0aW9uIiwidGFyZ2V0IiwiY29sdW1uIiwiY2xvc2VzdCIsImxlbmd0aCIsImNvZGVzIiwia2V5Q29kZSIsImRpcmVjdGlvbiIsInZhbHVlIiwiZWxlbWVudCIsIl9pdGVtIiwiZmluZCIsInJlbW92ZUNsYXNzIiwibmV4dEFsbCIsImZvY3VzIiwid2luZG93Iiwic2Nyb2xsVG8iLCJwYWdlWE9mZnNldCIsInBhZ2VZT2Zmc2V0IiwidXBkYXRlUGF0aEJhciIsIm5ld0NvbHVtbiIsImZpbmRMYXN0QWN0aXZlIiwicHJldiIsIm5leHQiLCJmaXJzdCIsInBhdGgiLCJzcGxpdCIsIm1hcCIsImJpdCIsInRyaW0iLCJmaWx0ZXIiLCJCb29sZWFuIiwic2VsZWN0UGF0aCIsImN1cnJlbnQiLCJzaGlmdCIsImxhc3QiLCJpdGVtcyIsImNyZWF0ZUl0ZW0iLCJmcmFnbWVudHMiLCJyZWR1Y2UiLCJmcmFnbWVudCIsImFwcGVuZENoaWxkIiwiZG9jdW1lbnQiLCJjcmVhdGVEb2N1bWVudEZyYWdtZW50IiwibGlzdEl0ZW0iLCJsaXN0SXRlbUNsYXNzZXMiLCJsaW5rIiwiY3JlYXRlSXRlbUNvbnRlbnQiLCJwdXNoIiwidHlwZSIsImpvaW4iLCJhY3RpdmVJdGVtcyIsIml0ZW1LZXlzIiwiZW1wdHkiLCJlYWNoIiwiaW5kZXgiLCJhY3RpdmVJdGVtIiwiaXNMYXN0IiwiZ2V0SWNvbiIsInRleHQiLCJodG1sIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVPLElBQU1BLFFBQVEsR0FBRztBQUNwQkMsVUFBUSxFQUFFLE1BRFU7QUFFcEJDLFVBQVEsRUFBRSxPQUZVO0FBRUQ7QUFDbkJDLFVBQVEsRUFBRSxVQUhVO0FBSXBCQyxTQUFPLEVBQUUsTUFKVztBQUlIO0FBQ2pCQyxTQUFPLEVBQUUsVUFMVztBQUtDO0FBQ3JCQyxTQUFPLEVBQUUsSUFOVztBQU9wQkMsV0FBUyxFQUFFO0FBQ1BDLGFBQVMsRUFBRSxlQURKO0FBRVBGLFdBQU8sRUFBRSxjQUZGO0FBR1BHLE9BQUcsRUFBRSxTQUhFO0FBSVBDLFFBQUksRUFBRSxVQUpDO0FBS1BDLFFBQUksRUFBRSxVQUxDO0FBTVBDLFVBQU0sRUFBRSxZQU5EO0FBT1BDLFlBQVEsRUFBRSxrQkFQSDtBQVFQQyxPQUFHLEVBQUUsU0FSRTtBQVNQQyxlQUFXLEVBQUUsa0JBVE47QUFVUEMsZUFBVyxFQUFFLGtCQVZOO0FBV1BDLGNBQVUsRUFBRTtBQVhMO0FBUFMsQ0FBakI7O0lBc0JEQyxNO0FBQ0Ysa0JBQVlWLFNBQVosRUFBdUJXLElBQXZCLEVBQTZCQyxPQUE3QixFQUFzQztBQUFBOztBQUFBOztBQUNsQyxTQUFLQyxRQUFMLEdBQWdCLElBQUlDLHNEQUFKLEVBQWhCO0FBQ0EsU0FBS2QsU0FBTCxHQUFpQmUsNkNBQUMsQ0FBQ2YsU0FBRCxDQUFsQjtBQUNBLFNBQUtXLElBQUwsR0FBWUEsSUFBWjtBQUVBLFNBQUtLLE1BQUwsR0FBY0Qsb0RBQUEsQ0FBUyxFQUFULEVBQWF2QixRQUFiLEVBQXVCb0IsT0FBdkIsQ0FBZCxDQUxrQyxDQU9sQzs7QUFDQSxTQUFLWixTQUFMLENBQWVpQixFQUFmLENBQWtCLE9BQWxCLEVBQTJCLEtBQUtDLFVBQUwsQ0FBZ0JDLElBQWhCLENBQXFCLElBQXJCLENBQTNCO0FBQ0EsU0FBS25CLFNBQUwsQ0FBZWlCLEVBQWYsQ0FBa0IsU0FBbEIsRUFBNkIsS0FBS0csWUFBTCxDQUFrQkQsSUFBbEIsQ0FBdUIsSUFBdkIsQ0FBN0IsRUFUa0MsQ0FXbEM7O0FBQ0EsU0FBS04sUUFBTCxDQUFjSSxFQUFkLENBQWlCLGVBQWpCLEVBQWtDLEtBQUtJLFlBQUwsQ0FBa0JGLElBQWxCLENBQXVCLElBQXZCLENBQWxDO0FBQ0EsU0FBS04sUUFBTCxDQUFjSSxFQUFkLENBQWlCLGVBQWpCLEVBQWtDLEtBQUtLLFNBQUwsQ0FBZUgsSUFBZixDQUFvQixJQUFwQixDQUFsQztBQUNBLFNBQUtOLFFBQUwsQ0FBY0ksRUFBZCxDQUFpQixVQUFqQixFQUE2QixLQUFLTSxRQUFMLENBQWNKLElBQWQsQ0FBbUIsSUFBbkIsQ0FBN0I7QUFDQSxTQUFLTixRQUFMLENBQWNJLEVBQWQsQ0FBaUIsT0FBakIsRUFBMEIsS0FBS08sSUFBTCxDQUFVTCxJQUFWLENBQWUsSUFBZixFQUFxQixLQUFLUixJQUExQixDQUExQjtBQUVBLFNBQUtYLFNBQUwsQ0FBZXlCLFFBQWYsQ0FBd0IsS0FBS1QsTUFBTCxDQUFZakIsU0FBWixDQUFzQkMsU0FBOUMsRUFBeUQwQixJQUF6RCxDQUE4RCxVQUE5RCxFQUEwRSxDQUExRTtBQUVBLFNBQUtDLFlBQUwsQ0FBa0IsS0FBS2hCLElBQXZCOztBQUVBLFFBQUksS0FBS0ssTUFBTCxDQUFZbEIsT0FBaEIsRUFBeUI7QUFDckIsV0FBS0EsT0FBTCxHQUFlLEtBQUs4QixhQUFMLEVBQWY7QUFDQSxXQUFLOUIsT0FBTCxDQUFhbUIsRUFBYixDQUFnQixPQUFoQixFQUF5Qix3QkFBekIsRUFBbUQsVUFBQ1ksS0FBRCxFQUFXO0FBQzFEQSxhQUFLLENBQUNDLGNBQU47QUFDQSxZQUFNQyxRQUFRLEdBQUdoQiw2Q0FBQyxDQUFDYyxLQUFLLENBQUNHLGFBQVAsQ0FBRCxDQUF1QnJCLElBQXZCLENBQTRCLGdCQUE1QixDQUFqQjs7QUFDQSxhQUFJLENBQUNhLElBQUwsQ0FBVSxLQUFJLENBQUNiLElBQWYsRUFBcUJvQixRQUFyQjtBQUNILE9BSkQ7QUFLSCxLQTVCaUMsQ0E4QmxDOzs7QUFDQSxRQUFJLEtBQUtmLE1BQUwsQ0FBWWlCLFdBQVosSUFBMkIsS0FBS2pCLE1BQUwsQ0FBWWlCLFdBQVosS0FBNEIsRUFBM0QsRUFBK0Q7QUFDM0QsV0FBS1QsSUFBTCxDQUFVLEtBQUtiLElBQWYsRUFBcUIsS0FBS0ssTUFBTCxDQUFZaUIsV0FBakM7QUFDSDtBQUNKOzs7OzZCQUV3QjtBQUFBLFVBQWxCdEIsSUFBa0IsdUVBQVgsS0FBS0EsSUFBTTtBQUNyQixXQUFLZ0IsWUFBTCxDQUFrQmhCLElBQWxCLEVBRHFCLENBR3JCOztBQUNBLFVBQUksS0FBS0ssTUFBTCxDQUFZaUIsV0FBWixJQUEyQixLQUFLakIsTUFBTCxDQUFZaUIsV0FBWixLQUE0QixFQUEzRCxFQUErRDtBQUMzRCxhQUFLVCxJQUFMLENBQVViLElBQVYsRUFBZ0IsS0FBS0ssTUFBTCxDQUFZaUIsV0FBNUI7QUFDSDtBQUNKOzs7aUNBRVl0QixJLEVBQU11QixNLEVBQVE7QUFBQTs7QUFDdkIsVUFBTUMsUUFBUSxHQUFHLFNBQVhBLFFBQVcsQ0FBQ3hCLElBQUQ7QUFBQSxlQUFVLE1BQUksQ0FBQ2dCLFlBQUwsQ0FBa0JoQixJQUFsQixFQUF3QnVCLE1BQXhCLENBQVY7QUFBQSxPQUFqQjs7QUFFQSxVQUFJLE9BQU92QixJQUFQLEtBQWdCLFVBQXBCLEVBQWdDO0FBQzVCQSxZQUFJLENBQUN5QixJQUFMLENBQVUsSUFBVixFQUFnQkYsTUFBaEIsRUFBd0JDLFFBQXhCO0FBQ0gsT0FGRCxNQUVPLElBQUlFLEtBQUssQ0FBQ0MsT0FBTixDQUFjM0IsSUFBZCxLQUF1QixRQUFPQSxJQUFQLE1BQWdCLFFBQTNDLEVBQXFEO0FBQ3hELFlBQUksUUFBT0EsSUFBUCxNQUFnQixRQUFwQixFQUE4QjtBQUMxQkEsY0FBSSxHQUFHMEIsS0FBSyxDQUFDRSxJQUFOLENBQVc1QixJQUFYLENBQVA7QUFDSDs7QUFDRCxZQUFNVCxJQUFJLEdBQUcsS0FBS3NDLFVBQUwsQ0FBZ0I3QixJQUFoQixDQUFiO0FBQ0EsWUFBTThCLEdBQUcsR0FBRzFCLDZDQUFDLENBQUMsU0FBRCxDQUFiO0FBQ0EwQixXQUFHLENBQUNDLE1BQUosQ0FBV3hDLElBQVgsRUFBaUJ1QixRQUFqQixDQUEwQixLQUFLVCxNQUFMLENBQVlqQixTQUFaLENBQXNCRSxHQUFoRDtBQUNBLGFBQUtZLFFBQUwsQ0FBYzhCLElBQWQsQ0FBbUIsZUFBbkIsRUFBb0NGLEdBQXBDO0FBRUEsZUFBT0EsR0FBUDtBQUNILE9BVk0sTUFVQTtBQUNILGNBQU0sSUFBSUcsS0FBSixDQUFVLG1CQUFWLENBQU47QUFDSDtBQUNKOzs7b0NBRWU7QUFDWixXQUFLNUMsU0FBTCxDQUFlNkMsUUFBZixZQUE0QixLQUFLN0IsTUFBTCxDQUFZakIsU0FBWixDQUFzQkQsT0FBbEQsR0FBNkRnRCxNQUE3RDtBQUNBLFVBQU1oRCxPQUFPLEdBQUdpQiw2Q0FBQyx3QkFBZ0IsS0FBS0MsTUFBTCxDQUFZakIsU0FBWixDQUFzQkQsT0FBdEMsV0FBakI7QUFDQUEsYUFBTyxDQUFDaUQsV0FBUixDQUFvQixLQUFLL0MsU0FBekI7QUFFQSxhQUFPRixPQUFQO0FBQ0g7OzsrQkFFVStCLEssRUFBTztBQUNkQSxXQUFLLENBQUNtQixlQUFOO0FBQ0FuQixXQUFLLENBQUNDLGNBQU47QUFFQSxVQUFNbUIsTUFBTSxHQUFHbEMsNkNBQUMsQ0FBQ2MsS0FBSyxDQUFDb0IsTUFBUCxDQUFoQjtBQUNBLFVBQU1DLE1BQU0sR0FBR0QsTUFBTSxDQUFDRSxPQUFQLFlBQW1CLEtBQUtuQyxNQUFMLENBQVlqQixTQUFaLENBQXNCRSxHQUF6QyxFQUFmO0FBQ0EsVUFBTUUsSUFBSSxHQUFHOEMsTUFBTSxDQUFDRSxPQUFQLFlBQW1CLEtBQUtuQyxNQUFMLENBQVlqQixTQUFaLENBQXNCSSxJQUF6QyxFQUFiOztBQUVBLFVBQUlBLElBQUksQ0FBQ2lELE1BQVQsRUFBaUI7QUFDYixhQUFLdkMsUUFBTCxDQUFjOEIsSUFBZCxDQUFtQixlQUFuQixFQUFvQztBQUFFTyxnQkFBTSxFQUFOQSxNQUFGO0FBQVUvQyxjQUFJLEVBQUpBO0FBQVYsU0FBcEM7QUFDSDtBQUNKOzs7aUNBRVkwQixLLEVBQU87QUFDaEIsVUFBTXdCLEtBQUssR0FBRztBQUFFLFlBQUksTUFBTjtBQUFjLFlBQUksSUFBbEI7QUFBd0IsWUFBSSxPQUE1QjtBQUFxQyxZQUFJO0FBQXpDLE9BQWQ7O0FBRUEsVUFBSXhCLEtBQUssQ0FBQ3lCLE9BQU4sSUFBaUJELEtBQXJCLEVBQTRCO0FBQ3hCeEIsYUFBSyxDQUFDbUIsZUFBTjtBQUNBbkIsYUFBSyxDQUFDQyxjQUFOO0FBRUEsYUFBS2pCLFFBQUwsQ0FBYzhCLElBQWQsQ0FBbUIsVUFBbkIsRUFBK0I7QUFDM0JZLG1CQUFTLEVBQUVGLEtBQUssQ0FBQ3hCLEtBQUssQ0FBQ3lCLE9BQVA7QUFEVyxTQUEvQjtBQUdIO0FBQ0o7OztpQ0FFWUUsSyxFQUFPO0FBQ2hCLFVBQU1DLE9BQU8sR0FBR0QsS0FBSyxDQUFDckQsSUFBdEI7O0FBQ0EsVUFBSSxDQUFDc0QsT0FBTyxDQUFDTCxNQUFiLEVBQXFCO0FBQUUsZUFBTyxLQUFQO0FBQWU7O0FBQ3RDLFVBQU1qRCxJQUFJLEdBQUdzRCxPQUFPLENBQUMsQ0FBRCxDQUFQLENBQVdDLEtBQXhCO0FBQ0EsVUFBTVIsTUFBTSxHQUFHTSxLQUFLLENBQUNOLE1BQXJCO0FBQ0EsVUFBTXZDLElBQUksR0FBR1IsSUFBSSxDQUFDLEtBQUthLE1BQUwsQ0FBWXJCLFFBQWIsQ0FBSixJQUE4QixLQUFLZ0IsSUFBaEQ7QUFDQSxVQUFNUCxNQUFNLEdBQUdXLDZDQUFDLENBQUNtQyxNQUFELENBQUQsQ0FBVVMsSUFBVixZQUFtQixLQUFLM0MsTUFBTCxDQUFZakIsU0FBWixDQUFzQkssTUFBekMsRUFBZjs7QUFFQSxVQUFJQSxNQUFNLENBQUNnRCxNQUFYLEVBQW1CO0FBQ2ZoRCxjQUFNLENBQUN3RCxXQUFQLENBQW1CLEtBQUs1QyxNQUFMLENBQVlqQixTQUFaLENBQXNCSyxNQUF6QztBQUNIOztBQUVEcUQsYUFBTyxDQUFDaEMsUUFBUixDQUFpQixLQUFLVCxNQUFMLENBQVlqQixTQUFaLENBQXNCSyxNQUF2QztBQUNBOEMsWUFBTSxDQUFDVyxPQUFQLEdBQWlCZixNQUFqQixHQWJnQixDQWFXOztBQUUzQixXQUFLOUMsU0FBTCxDQUFlLENBQWYsRUFBa0I4RCxLQUFsQjtBQUNBQyxZQUFNLENBQUNDLFFBQVAsQ0FBZ0JELE1BQU0sQ0FBQ0UsV0FBdkIsRUFBb0NGLE1BQU0sQ0FBQ0csV0FBM0M7QUFFQSxXQUFLQyxhQUFMO0FBRUEsVUFBSUMsU0FBSjs7QUFDQSxVQUFJekQsSUFBSixFQUFVO0FBQ055RCxpQkFBUyxHQUFHLEtBQUt6QyxZQUFMLENBQWtCaEIsSUFBbEIsRUFBd0JSLElBQXhCLENBQVo7QUFDQSxhQUFLVSxRQUFMLENBQWM4QixJQUFkLENBQW1CLG1CQUFuQixFQUF3Q3hDLElBQXhDO0FBQ0gsT0FIRCxNQUdPO0FBQ0gsYUFBS1UsUUFBTCxDQUFjOEIsSUFBZCxDQUFtQixlQUFuQixFQUFvQ3hDLElBQXBDO0FBQ0g7O0FBRUQsYUFBT2lFLFNBQVA7QUFDSDs7OzhCQUVTbEIsTSxFQUFRO0FBQ2QsV0FBS2xELFNBQUwsQ0FBZTBDLE1BQWYsQ0FBc0JRLE1BQXRCO0FBQ0EsV0FBS3JDLFFBQUwsQ0FBYzhCLElBQWQsQ0FBbUIsZ0JBQW5CLEVBQXFDTyxNQUFyQztBQUNIOzs7NkJBRVFNLEssRUFBTztBQUNaLFVBQU1wRCxNQUFNLEdBQUcsS0FBS2lFLGNBQUwsRUFBZjtBQUNBLFVBQU1kLFNBQVMsR0FBR0MsS0FBSyxDQUFDRCxTQUF4QjtBQUNBLFVBQUlMLE1BQUo7QUFDQSxVQUFJL0MsSUFBSjtBQUNBLFVBQUk4QyxNQUFKOztBQUVBLFVBQUk3QyxNQUFKLEVBQVk7QUFDUkQsWUFBSSxHQUFHQyxNQUFNLENBQUNELElBQWQ7QUFDQStDLGNBQU0sR0FBRzlDLE1BQU0sQ0FBQzhDLE1BQWhCOztBQUVBLFlBQUlLLFNBQVMsS0FBSyxJQUFkLElBQXNCcEQsSUFBSSxDQUFDbUUsSUFBTCxHQUFZbEIsTUFBdEMsRUFBOEM7QUFDMUNILGdCQUFNLEdBQUc5QyxJQUFJLENBQUNtRSxJQUFMLEVBQVQ7QUFDSCxTQUZELE1BRU8sSUFBSWYsU0FBUyxLQUFLLE1BQWQsSUFBd0JwRCxJQUFJLENBQUNvRSxJQUFMLEdBQVluQixNQUF4QyxFQUFnRDtBQUNuREgsZ0JBQU0sR0FBRzlDLElBQUksQ0FBQ29FLElBQUwsRUFBVDtBQUNILFNBRk0sTUFFQSxJQUFJaEIsU0FBUyxLQUFLLE9BQWQsSUFBeUJMLE1BQU0sQ0FBQ3FCLElBQVAsR0FBY25CLE1BQTNDLEVBQW1EO0FBQ3RERixnQkFBTSxHQUFHQSxNQUFNLENBQUNxQixJQUFQLEVBQVQ7QUFDQXRCLGdCQUFNLEdBQUdDLE1BQU0sQ0FBQ1MsSUFBUCxZQUFnQixLQUFLM0MsTUFBTCxDQUFZakIsU0FBWixDQUFzQkksSUFBdEMsR0FBOENxRSxLQUE5QyxFQUFUO0FBQ0gsU0FITSxNQUdBLElBQUlqQixTQUFTLEtBQUssTUFBZCxJQUF3QkwsTUFBTSxDQUFDb0IsSUFBUCxHQUFjbEIsTUFBMUMsRUFBa0Q7QUFDckRGLGdCQUFNLEdBQUdBLE1BQU0sQ0FBQ29CLElBQVAsRUFBVDtBQUNBckIsZ0JBQU0sR0FBR0MsTUFBTSxDQUFDUyxJQUFQLFlBQWdCLEtBQUszQyxNQUFMLENBQVlqQixTQUFaLENBQXNCSyxNQUF0QyxHQUFnRG9FLEtBQWhELE1BQTJEdEIsTUFBTSxDQUFDUyxJQUFQLFlBQWdCLEtBQUszQyxNQUFMLENBQVlqQixTQUFaLENBQXNCSSxJQUF0QyxFQUFwRTtBQUNIO0FBQ0osT0FmRCxNQWVPO0FBQ0grQyxjQUFNLEdBQUcsS0FBS2xELFNBQUwsQ0FBZTJELElBQWYsWUFBd0IsS0FBSzNDLE1BQUwsQ0FBWWpCLFNBQVosQ0FBc0JFLEdBQTlDLEdBQXFEdUUsS0FBckQsRUFBVDtBQUNBdkIsY0FBTSxHQUFHQyxNQUFNLENBQUNTLElBQVAsWUFBZ0IsS0FBSzNDLE1BQUwsQ0FBWWpCLFNBQVosQ0FBc0JJLElBQXRDLEdBQThDcUUsS0FBOUMsRUFBVDtBQUNIOztBQUVELFVBQUl2QixNQUFKLEVBQVk7QUFDUixhQUFLcEMsUUFBTCxDQUFjOEIsSUFBZCxDQUFtQixlQUFuQixFQUFvQztBQUNoQ08sZ0JBQU0sRUFBTkEsTUFEZ0M7QUFFaEMvQyxjQUFJLEVBQUU4QztBQUYwQixTQUFwQztBQUlIO0FBQ0o7Ozt5QkFFSXRDLEksRUFBTThELEksRUFBTTtBQUFBOztBQUNiQSxVQUFJLEdBQUdwQyxLQUFLLENBQUNDLE9BQU4sQ0FBY21DLElBQWQsSUFBc0JBLElBQXRCLEdBQTZCQSxJQUFJLENBQUNDLEtBQUwsQ0FBVyxHQUFYLEVBQWdCQyxHQUFoQixDQUFvQixVQUFBQyxHQUFHO0FBQUEsZUFBSUEsR0FBRyxDQUFDQyxJQUFKLEVBQUo7QUFBQSxPQUF2QixFQUF1Q0MsTUFBdkMsQ0FBOENDLE9BQTlDLENBQXBDOztBQUVBLFVBQUlOLElBQUksQ0FBQ3JCLE1BQVQsRUFBaUI7QUFDYixhQUFLcEQsU0FBTCxDQUFlSyxRQUFmLEdBQTBCeUMsTUFBMUI7QUFDSDs7QUFFRCxVQUFJLE9BQU9uQyxJQUFQLEtBQWdCLFVBQXBCLEVBQWdDO0FBQzVCQSxZQUFJLENBQUN5QixJQUFMLENBQVUsSUFBVixFQUFnQixJQUFoQixFQUFzQixVQUFDekIsSUFBRDtBQUFBLGlCQUFVLE1BQUksQ0FBQ3FFLFVBQUwsQ0FBZ0JQLElBQWhCLEVBQXNCOUQsSUFBdEIsQ0FBVjtBQUFBLFNBQXRCO0FBQ0gsT0FGRCxNQUVPO0FBQ0gsYUFBS3FFLFVBQUwsQ0FBZ0JQLElBQWhCLEVBQXNCOUQsSUFBdEI7QUFDSDtBQUNKOzs7K0JBRVU4RCxJLEVBQU05RCxJLEVBQU11QyxNLEVBQVE7QUFBQTs7QUFDM0JBLFlBQU0sR0FBR0EsTUFBTSxLQUFLdUIsSUFBSSxDQUFDckIsTUFBTCxHQUFjLEtBQUt6QixZQUFMLENBQWtCaEIsSUFBbEIsQ0FBZCxHQUF3QyxLQUFLWCxTQUFMLENBQWUyRCxJQUFmLGNBQTBCLEtBQUszQyxNQUFMLENBQVlqQixTQUFaLENBQXNCRSxHQUFoRCxFQUE3QyxDQUFmO0FBRUEsVUFBTWdGLE9BQU8sR0FBR1IsSUFBSSxDQUFDLENBQUQsQ0FBSixJQUFXLEVBQTNCO0FBQ0EsVUFBTXBFLFFBQVEsR0FBR00sSUFBSSxDQUFDZ0QsSUFBTCxDQUFVLFVBQUN4RCxJQUFEO0FBQUEsZUFBVUEsSUFBSSxDQUFDLE1BQUksQ0FBQ2EsTUFBTCxDQUFZbkIsT0FBYixDQUFKLEtBQThCb0YsT0FBeEM7QUFBQSxPQUFWLENBQWpCO0FBQ0EsVUFBTWIsU0FBUyxHQUFHLEtBQUsvQyxZQUFMLENBQWtCO0FBQ2hDNkIsY0FBTSxFQUFOQSxNQURnQztBQUVoQy9DLFlBQUksRUFBRStDLE1BQU0sQ0FBQ1MsSUFBUCw0QkFBK0JzQixPQUEvQixVQUE0Q1QsS0FBNUM7QUFGMEIsT0FBbEIsQ0FBbEI7QUFLQUMsVUFBSSxDQUFDUyxLQUFMOztBQUVBLFVBQUlULElBQUksQ0FBQ3JCLE1BQUwsSUFBZS9DLFFBQW5CLEVBQTZCO0FBQ3pCLGFBQUsyRSxVQUFMLENBQWdCUCxJQUFoQixFQUFzQnBFLFFBQVEsQ0FBQyxLQUFLVyxNQUFMLENBQVlyQixRQUFiLENBQTlCLEVBQXNEeUUsU0FBdEQ7QUFDSDtBQUNKOzs7cUNBRWdCO0FBQ2IsVUFBTWhFLE1BQU0sR0FBRyxLQUFLSixTQUFMLENBQWUyRCxJQUFmLFlBQXdCLEtBQUszQyxNQUFMLENBQVlqQixTQUFaLENBQXNCSyxNQUE5QyxFQUFmOztBQUNBLFVBQUksQ0FBQ0EsTUFBTSxDQUFDZ0QsTUFBWixFQUFvQjtBQUNoQixlQUFPLElBQVA7QUFDSDs7QUFFRCxVQUFNakQsSUFBSSxHQUFHQyxNQUFNLENBQUMrRSxJQUFQLEVBQWI7QUFDQSxVQUFNakMsTUFBTSxHQUFHL0MsSUFBSSxDQUFDZ0QsT0FBTCxZQUFpQixLQUFLbkMsTUFBTCxDQUFZakIsU0FBWixDQUFzQkUsR0FBdkMsRUFBZjtBQUVBLGFBQU87QUFBRUUsWUFBSSxFQUFKQSxJQUFGO0FBQVErQyxjQUFNLEVBQU5BO0FBQVIsT0FBUDtBQUNIOzs7K0JBRVV2QyxJLEVBQU07QUFBQTs7QUFDYixVQUFNVCxJQUFJLEdBQUdhLDZDQUFDLENBQUMsUUFBRCxDQUFkO0FBQ0EsVUFBTXFFLEtBQUssR0FBR3pFLElBQUksQ0FBQ2dFLEdBQUwsQ0FBUyxVQUFDeEUsSUFBRDtBQUFBLGVBQVUsTUFBSSxDQUFDa0YsVUFBTCxDQUFnQmxGLElBQWhCLENBQVY7QUFBQSxPQUFULENBQWQ7QUFFQSxVQUFNbUYsU0FBUyxHQUFHRixLQUFLLENBQUNHLE1BQU4sQ0FBYSxVQUFDQyxRQUFELEVBQVdQLE9BQVgsRUFBdUI7QUFDbERPLGdCQUFRLENBQUNDLFdBQVQsQ0FBcUJSLE9BQU8sQ0FBQyxDQUFELENBQVAsSUFBY0EsT0FBbkM7QUFFQSxlQUFPTyxRQUFQO0FBQ0gsT0FKaUIsRUFJZkUsUUFBUSxDQUFDQyxzQkFBVCxFQUplLENBQWxCO0FBTUF6RixVQUFJLENBQUN3QyxNQUFMLENBQVk0QyxTQUFaLEVBQXVCN0QsUUFBdkIsQ0FBZ0MsS0FBS1QsTUFBTCxDQUFZakIsU0FBWixDQUFzQkcsSUFBdEQ7QUFFQSxhQUFPQSxJQUFQO0FBQ0g7OzsrQkFFVUMsSSxFQUFNO0FBQ2IsVUFBTXlGLFFBQVEsR0FBRzdFLDZDQUFDLENBQUMsUUFBRCxDQUFsQjtBQUNBLFVBQU04RSxlQUFlLEdBQUcsQ0FBQyxLQUFLN0UsTUFBTCxDQUFZakIsU0FBWixDQUFzQkksSUFBdkIsQ0FBeEI7QUFDQSxVQUFNMkYsSUFBSSxHQUFHL0UsNkNBQUMsQ0FBQyxPQUFELENBQWQ7QUFDQSxVQUFNZ0YsaUJBQWlCLEdBQUcsS0FBSy9FLE1BQUwsQ0FBWStFLGlCQUFaLElBQWlDLEtBQUtBLGlCQUFoRTtBQUNBLFVBQU1QLFFBQVEsR0FBR08saUJBQWlCLENBQUMzRCxJQUFsQixDQUF1QixJQUF2QixFQUE2QmpDLElBQTdCLENBQWpCO0FBQ0EyRixVQUFJLENBQUNwRCxNQUFMLENBQVk4QyxRQUFaLEVBQ0s5RCxJQURMLENBQ1UsTUFEVixFQUNrQixFQURsQixFQUVLQSxJQUZMLENBRVUsVUFGVixFQUVzQixDQUFDLENBRnZCOztBQUlBLFVBQUl2QixJQUFJLENBQUNHLEdBQVQsRUFBYztBQUNWd0YsWUFBSSxDQUFDcEUsSUFBTCxDQUFVLE1BQVYsRUFBa0J2QixJQUFJLENBQUNHLEdBQXZCO0FBQ0F1Rix1QkFBZSxDQUFDRyxJQUFoQixDQUFxQjdGLElBQUksQ0FBQ0osU0FBMUI7QUFDSDs7QUFFRCxVQUFJSSxJQUFJLENBQUMsS0FBS2EsTUFBTCxDQUFZckIsUUFBYixDQUFSLEVBQWdDO0FBQzVCa0csdUJBQWUsQ0FBQ0csSUFBaEIsQ0FBcUIsS0FBS2hGLE1BQUwsQ0FBWWpCLFNBQVosQ0FBc0IsS0FBS2lCLE1BQUwsQ0FBWXJCLFFBQWxDLENBQXJCO0FBQ0g7O0FBRURrRyxxQkFBZSxDQUFDRyxJQUFoQixvQkFBaUM3RixJQUFJLENBQUM4RixJQUF0QztBQUNBTCxjQUFRLENBQUNuRSxRQUFULENBQWtCb0UsZUFBZSxDQUFDSyxJQUFoQixDQUFxQixHQUFyQixDQUFsQjtBQUNBTixjQUFRLENBQUNsRCxNQUFULENBQWdCb0QsSUFBaEIsRUFDS3BFLElBREwsQ0FDVSxlQURWLEVBQzJCdkIsSUFBSSxDQUFDLEtBQUthLE1BQUwsQ0FBWW5CLE9BQWIsQ0FEL0I7QUFHQStGLGNBQVEsQ0FBQyxDQUFELENBQVIsQ0FBWWxDLEtBQVosR0FBb0J2RCxJQUFwQjtBQUVBLGFBQU95RixRQUFQO0FBQ0g7OztvQ0FFZTtBQUFBOztBQUNaLFVBQUksQ0FBQyxLQUFLNUUsTUFBTCxDQUFZbEIsT0FBakIsRUFBMEI7QUFBRSxlQUFPLEtBQVA7QUFBZTs7QUFFM0MsVUFBTXFHLFdBQVcsR0FBRyxLQUFLbkcsU0FBTCxDQUFlMkQsSUFBZixZQUF3QixLQUFLM0MsTUFBTCxDQUFZakIsU0FBWixDQUFzQkssTUFBOUMsRUFBcEI7QUFDQSxVQUFJZ0csUUFBUSxHQUFHLEVBQWY7QUFDQSxXQUFLdEcsT0FBTCxDQUFhTyxRQUFiLEdBQXdCZ0csS0FBeEI7QUFDQUYsaUJBQVcsQ0FBQ0csSUFBWixDQUFpQixVQUFDQyxLQUFELEVBQVFDLFVBQVIsRUFBdUI7QUFDcEMsWUFBTXJHLElBQUksR0FBR3FHLFVBQVUsQ0FBQzlDLEtBQXhCO0FBQ0EsWUFBTStDLE1BQU0sR0FBSUYsS0FBSyxHQUFHLENBQVQsS0FBZ0JKLFdBQVcsQ0FBQy9DLE1BQTNDO0FBQ0FnRCxnQkFBUSxlQUFRakcsSUFBSSxDQUFDLE1BQUksQ0FBQ2EsTUFBTCxDQUFZbkIsT0FBYixDQUFaLENBQVI7O0FBQ0EsY0FBSSxDQUFDQyxPQUFMLENBQWE0QyxNQUFiLDJFQUNtRHZDLElBQUksQ0FBQzhGLElBRHhELGdCQUNpRTlGLElBQUksQ0FBQzhGLElBQUwsS0FBYyxLQUFkLG9DQUErQ0csUUFBL0MsVUFBNkQsRUFEOUgsd0RBRTZCLE1BQUksQ0FBQ00sT0FBTCxDQUFhdkcsSUFBSSxDQUFDOEYsSUFBbEIsQ0FGN0IsK0VBRzZDbEYsNkNBQUMsQ0FBQyxTQUFELENBQUQsQ0FBYTRGLElBQWIsQ0FBa0J4RyxJQUFJLENBQUMsTUFBSSxDQUFDYSxNQUFMLENBQVl2QixRQUFiLENBQXRCLEVBQThDbUgsSUFBOUMsRUFIN0MsMENBSVUsQ0FBQ0gsTUFBRCxHQUFVLDJDQUFWLEdBQXdELEVBSmxFO0FBT0gsT0FYRDtBQVlIOzs7NEJBRU9SLEksRUFBTTtBQUNWLGNBQVFBLElBQVI7QUFDSSxhQUFLLE1BQUw7QUFDSSxpQkFBTyxZQUFQOztBQUNKLGFBQUssTUFBTDtBQUNJLGlCQUFPLFdBQVA7O0FBQ0osYUFBSyxLQUFMO0FBQ0E7QUFDSSxpQkFBTyxXQUFQO0FBUFI7QUFTSDs7Ozs7O0FBR0wsaUVBQWV2RixNQUFmIiwiZmlsZSI6Ii4vYXBwL3V0aWxzL2ZpbmRlcmpzLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiAoYykgVHJpbGJ5IE1lZGlhLCBMTENcbiAqIEF1dGhvciBEamFtaWwgTGVnYXRvXG4gKlxuICogQmFzZWQgb24gTWFyayBNYXR5YXMncyBGaW5kZXJqc1xuICogTUlUIExpY2Vuc2VcbiAqL1xuXG5pbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tICdldmVudGVtaXR0ZXIzJztcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRTID0ge1xuICAgIGxhYmVsS2V5OiAnbmFtZScsXG4gICAgdmFsdWVLZXk6ICd2YWx1ZScsIC8vIG5ld1xuICAgIGNoaWxkS2V5OiAnY2hpbGRyZW4nLFxuICAgIGljb25LZXk6ICdpY29uJywgLy8gbmV3XG4gICAgaXRlbUtleTogJ2l0ZW0ta2V5JywgLy8gbmV3XG4gICAgcGF0aEJhcjogdHJ1ZSxcbiAgICBjbGFzc05hbWU6IHtcbiAgICAgICAgY29udGFpbmVyOiAnZmpzLWNvbnRhaW5lcicsXG4gICAgICAgIHBhdGhCYXI6ICdmanMtcGF0aC1iYXInLFxuICAgICAgICBjb2w6ICdmanMtY29sJyxcbiAgICAgICAgbGlzdDogJ2Zqcy1saXN0JyxcbiAgICAgICAgaXRlbTogJ2Zqcy1pdGVtJyxcbiAgICAgICAgYWN0aXZlOiAnZmpzLWFjdGl2ZScsXG4gICAgICAgIGNoaWxkcmVuOiAnZmpzLWhhcy1jaGlsZHJlbicsXG4gICAgICAgIHVybDogJ2Zqcy11cmwnLFxuICAgICAgICBpdGVtUHJlcGVuZDogJ2Zqcy1pdGVtLXByZXBlbmQnLFxuICAgICAgICBpdGVtQ29udGVudDogJ2Zqcy1pdGVtLWNvbnRlbnQnLFxuICAgICAgICBpdGVtQXBwZW5kOiAnZmpzLWl0ZW0tYXBwZW5kJ1xuICAgIH1cbn07XG5cbmNsYXNzIEZpbmRlciB7XG4gICAgY29uc3RydWN0b3IoY29udGFpbmVyLCBkYXRhLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuJGVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gJChjb250YWluZXIpO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuXG4gICAgICAgIHRoaXMuY29uZmlnID0gJC5leHRlbmQoe30sIERFRkFVTFRTLCBvcHRpb25zKTtcblxuICAgICAgICAvLyBkb20gZXZlbnRzXG4gICAgICAgIHRoaXMuY29udGFpbmVyLm9uKCdjbGljaycsIHRoaXMuY2xpY2tFdmVudC5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy5jb250YWluZXIub24oJ2tleWRvd24nLCB0aGlzLmtleWRvd25FdmVudC5iaW5kKHRoaXMpKTtcblxuICAgICAgICAvLyBpbnRlcm5hbCBldmVudHNcbiAgICAgICAgdGhpcy4kZW1pdHRlci5vbignaXRlbS1zZWxlY3RlZCcsIHRoaXMuaXRlbVNlbGVjdGVkLmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLiRlbWl0dGVyLm9uKCdjcmVhdGUtY29sdW1uJywgdGhpcy5hZGRDb2x1bW4uYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuJGVtaXR0ZXIub24oJ25hdmlnYXRlJywgdGhpcy5uYXZpZ2F0ZS5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy4kZW1pdHRlci5vbignZ28tdG8nLCB0aGlzLmdvVG8uYmluZCh0aGlzLCB0aGlzLmRhdGEpKTtcblxuICAgICAgICB0aGlzLmNvbnRhaW5lci5hZGRDbGFzcyh0aGlzLmNvbmZpZy5jbGFzc05hbWUuY29udGFpbmVyKS5hdHRyKCd0YWJpbmRleCcsIDApO1xuXG4gICAgICAgIHRoaXMuY3JlYXRlQ29sdW1uKHRoaXMuZGF0YSk7XG5cbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLnBhdGhCYXIpIHtcbiAgICAgICAgICAgIHRoaXMucGF0aEJhciA9IHRoaXMuY3JlYXRlUGF0aEJhcigpO1xuICAgICAgICAgICAgdGhpcy5wYXRoQmFyLm9uKCdjbGljaycsICdbZGF0YS1icmVhZGNydW1iLW5vZGVdJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBsb2NhdGlvbiA9ICQoZXZlbnQuY3VycmVudFRhcmdldCkuZGF0YSgnYnJlYWRjcnVtYk5vZGUnKTtcbiAgICAgICAgICAgICAgICB0aGlzLmdvVG8odGhpcy5kYXRhLCBsb2NhdGlvbik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vICcnIGlzIDxSb290PlxuICAgICAgICBpZiAodGhpcy5jb25maWcuZGVmYXVsdFBhdGggfHwgdGhpcy5jb25maWcuZGVmYXVsdFBhdGggPT09ICcnKSB7XG4gICAgICAgICAgICB0aGlzLmdvVG8odGhpcy5kYXRhLCB0aGlzLmNvbmZpZy5kZWZhdWx0UGF0aCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZWxvYWQoZGF0YSA9IHRoaXMuZGF0YSkge1xuICAgICAgICB0aGlzLmNyZWF0ZUNvbHVtbihkYXRhKTtcblxuICAgICAgICAvLyAnJyBpcyA8Um9vdD5cbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmRlZmF1bHRQYXRoIHx8IHRoaXMuY29uZmlnLmRlZmF1bHRQYXRoID09PSAnJykge1xuICAgICAgICAgICAgdGhpcy5nb1RvKGRhdGEsIHRoaXMuY29uZmlnLmRlZmF1bHRQYXRoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNyZWF0ZUNvbHVtbihkYXRhLCBwYXJlbnQpIHtcbiAgICAgICAgY29uc3QgY2FsbGJhY2sgPSAoZGF0YSkgPT4gdGhpcy5jcmVhdGVDb2x1bW4oZGF0YSwgcGFyZW50KTtcblxuICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGRhdGEuY2FsbCh0aGlzLCBwYXJlbnQsIGNhbGxiYWNrKTtcbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGRhdGEpIHx8IHR5cGVvZiBkYXRhID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBkYXRhID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBBcnJheS5mcm9tKGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbGlzdCA9IHRoaXMuY3JlYXRlTGlzdChkYXRhKTtcbiAgICAgICAgICAgIGNvbnN0IGRpdiA9ICQoJzxkaXYgLz4nKTtcbiAgICAgICAgICAgIGRpdi5hcHBlbmQobGlzdCkuYWRkQ2xhc3ModGhpcy5jb25maWcuY2xhc3NOYW1lLmNvbCk7XG4gICAgICAgICAgICB0aGlzLiRlbWl0dGVyLmVtaXQoJ2NyZWF0ZS1jb2x1bW4nLCBkaXYpO1xuXG4gICAgICAgICAgICByZXR1cm4gZGl2O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGRhdGEgdHlwZScpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY3JlYXRlUGF0aEJhcigpIHtcbiAgICAgICAgdGhpcy5jb250YWluZXIuc2libGluZ3MoYC4ke3RoaXMuY29uZmlnLmNsYXNzTmFtZS5wYXRoQmFyfWApLnJlbW92ZSgpO1xuICAgICAgICBjb25zdCBwYXRoQmFyID0gJChgPGRpdiBjbGFzcz1cIiR7dGhpcy5jb25maWcuY2xhc3NOYW1lLnBhdGhCYXJ9XCIgLz5gKTtcbiAgICAgICAgcGF0aEJhci5pbnNlcnRBZnRlcih0aGlzLmNvbnRhaW5lcik7XG5cbiAgICAgICAgcmV0dXJuIHBhdGhCYXI7XG4gICAgfVxuXG4gICAgY2xpY2tFdmVudChldmVudCkge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBjb25zdCB0YXJnZXQgPSAkKGV2ZW50LnRhcmdldCk7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IHRhcmdldC5jbG9zZXN0KGAuJHt0aGlzLmNvbmZpZy5jbGFzc05hbWUuY29sfWApO1xuICAgICAgICBjb25zdCBpdGVtID0gdGFyZ2V0LmNsb3Nlc3QoYC4ke3RoaXMuY29uZmlnLmNsYXNzTmFtZS5pdGVtfWApO1xuXG4gICAgICAgIGlmIChpdGVtLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy4kZW1pdHRlci5lbWl0KCdpdGVtLXNlbGVjdGVkJywgeyBjb2x1bW4sIGl0ZW0gfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBrZXlkb3duRXZlbnQoZXZlbnQpIHtcbiAgICAgICAgY29uc3QgY29kZXMgPSB7IDM3OiAnbGVmdCcsIDM4OiAndXAnLCAzOTogJ3JpZ2h0JywgNDA6ICdkb3duJyB9O1xuXG4gICAgICAgIGlmIChldmVudC5rZXlDb2RlIGluIGNvZGVzKSB7XG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgIHRoaXMuJGVtaXR0ZXIuZW1pdCgnbmF2aWdhdGUnLCB7XG4gICAgICAgICAgICAgICAgZGlyZWN0aW9uOiBjb2Rlc1tldmVudC5rZXlDb2RlXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpdGVtU2VsZWN0ZWQodmFsdWUpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHZhbHVlLml0ZW07XG4gICAgICAgIGlmICghZWxlbWVudC5sZW5ndGgpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBlbGVtZW50WzBdLl9pdGVtO1xuICAgICAgICBjb25zdCBjb2x1bW4gPSB2YWx1ZS5jb2x1bW47XG4gICAgICAgIGNvbnN0IGRhdGEgPSBpdGVtW3RoaXMuY29uZmlnLmNoaWxkS2V5XSB8fCB0aGlzLmRhdGE7XG4gICAgICAgIGNvbnN0IGFjdGl2ZSA9ICQoY29sdW1uKS5maW5kKGAuJHt0aGlzLmNvbmZpZy5jbGFzc05hbWUuYWN0aXZlfWApO1xuXG4gICAgICAgIGlmIChhY3RpdmUubGVuZ3RoKSB7XG4gICAgICAgICAgICBhY3RpdmUucmVtb3ZlQ2xhc3ModGhpcy5jb25maWcuY2xhc3NOYW1lLmFjdGl2ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBlbGVtZW50LmFkZENsYXNzKHRoaXMuY29uZmlnLmNsYXNzTmFtZS5hY3RpdmUpO1xuICAgICAgICBjb2x1bW4ubmV4dEFsbCgpLnJlbW92ZSgpOyAvLyA/IT8hP1xuXG4gICAgICAgIHRoaXMuY29udGFpbmVyWzBdLmZvY3VzKCk7XG4gICAgICAgIHdpbmRvdy5zY3JvbGxUbyh3aW5kb3cucGFnZVhPZmZzZXQsIHdpbmRvdy5wYWdlWU9mZnNldCk7XG5cbiAgICAgICAgdGhpcy51cGRhdGVQYXRoQmFyKCk7XG5cbiAgICAgICAgbGV0IG5ld0NvbHVtbjtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgIG5ld0NvbHVtbiA9IHRoaXMuY3JlYXRlQ29sdW1uKGRhdGEsIGl0ZW0pO1xuICAgICAgICAgICAgdGhpcy4kZW1pdHRlci5lbWl0KCdpbnRlcmlvci1zZWxlY3RlZCcsIGl0ZW0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy4kZW1pdHRlci5lbWl0KCdsZWFmLXNlbGVjdGVkJywgaXRlbSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3Q29sdW1uO1xuICAgIH1cblxuICAgIGFkZENvbHVtbihjb2x1bW4pIHtcbiAgICAgICAgdGhpcy5jb250YWluZXIuYXBwZW5kKGNvbHVtbik7XG4gICAgICAgIHRoaXMuJGVtaXR0ZXIuZW1pdCgnY29sdW1uLWNyZWF0ZWQnLCBjb2x1bW4pO1xuICAgIH1cblxuICAgIG5hdmlnYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMuZmluZExhc3RBY3RpdmUoKTtcbiAgICAgICAgY29uc3QgZGlyZWN0aW9uID0gdmFsdWUuZGlyZWN0aW9uO1xuICAgICAgICBsZXQgY29sdW1uO1xuICAgICAgICBsZXQgaXRlbTtcbiAgICAgICAgbGV0IHRhcmdldDtcblxuICAgICAgICBpZiAoYWN0aXZlKSB7XG4gICAgICAgICAgICBpdGVtID0gYWN0aXZlLml0ZW07XG4gICAgICAgICAgICBjb2x1bW4gPSBhY3RpdmUuY29sdW1uO1xuXG4gICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09PSAndXAnICYmIGl0ZW0ucHJldigpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRhcmdldCA9IGl0ZW0ucHJldigpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT09ICdkb3duJyAmJiBpdGVtLm5leHQoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXQgPSBpdGVtLm5leHQoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09PSAncmlnaHQnICYmIGNvbHVtbi5uZXh0KCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29sdW1uID0gY29sdW1uLm5leHQoKTtcbiAgICAgICAgICAgICAgICB0YXJnZXQgPSBjb2x1bW4uZmluZChgLiR7dGhpcy5jb25maWcuY2xhc3NOYW1lLml0ZW19YCkuZmlyc3QoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09PSAnbGVmdCcgJiYgY29sdW1uLnByZXYoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb2x1bW4gPSBjb2x1bW4ucHJldigpO1xuICAgICAgICAgICAgICAgIHRhcmdldCA9IGNvbHVtbi5maW5kKGAuJHt0aGlzLmNvbmZpZy5jbGFzc05hbWUuYWN0aXZlfWApLmZpcnN0KCkgfHwgY29sdW1uLmZpbmQoYC4ke3RoaXMuY29uZmlnLmNsYXNzTmFtZS5pdGVtfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29sdW1uID0gdGhpcy5jb250YWluZXIuZmluZChgLiR7dGhpcy5jb25maWcuY2xhc3NOYW1lLmNvbH1gKS5maXJzdCgpO1xuICAgICAgICAgICAgdGFyZ2V0ID0gY29sdW1uLmZpbmQoYC4ke3RoaXMuY29uZmlnLmNsYXNzTmFtZS5pdGVtfWApLmZpcnN0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgICAgICB0aGlzLiRlbWl0dGVyLmVtaXQoJ2l0ZW0tc2VsZWN0ZWQnLCB7XG4gICAgICAgICAgICAgICAgY29sdW1uLFxuICAgICAgICAgICAgICAgIGl0ZW06IHRhcmdldFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnb1RvKGRhdGEsIHBhdGgpIHtcbiAgICAgICAgcGF0aCA9IEFycmF5LmlzQXJyYXkocGF0aCkgPyBwYXRoIDogcGF0aC5zcGxpdCgnLycpLm1hcChiaXQgPT4gYml0LnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pO1xuXG4gICAgICAgIGlmIChwYXRoLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuY2hpbGRyZW4oKS5yZW1vdmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgZGF0YS5jYWxsKHRoaXMsIG51bGwsIChkYXRhKSA9PiB0aGlzLnNlbGVjdFBhdGgocGF0aCwgZGF0YSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RQYXRoKHBhdGgsIGRhdGEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2VsZWN0UGF0aChwYXRoLCBkYXRhLCBjb2x1bW4pIHtcbiAgICAgICAgY29sdW1uID0gY29sdW1uIHx8IChwYXRoLmxlbmd0aCA/IHRoaXMuY3JlYXRlQ29sdW1uKGRhdGEpIDogdGhpcy5jb250YWluZXIuZmluZChgPiAuJHt0aGlzLmNvbmZpZy5jbGFzc05hbWUuY29sfWApKTtcblxuICAgICAgICBjb25zdCBjdXJyZW50ID0gcGF0aFswXSB8fCAnJztcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBkYXRhLmZpbmQoKGl0ZW0pID0+IGl0ZW1bdGhpcy5jb25maWcuaXRlbUtleV0gPT09IGN1cnJlbnQpO1xuICAgICAgICBjb25zdCBuZXdDb2x1bW4gPSB0aGlzLml0ZW1TZWxlY3RlZCh7XG4gICAgICAgICAgICBjb2x1bW4sXG4gICAgICAgICAgICBpdGVtOiBjb2x1bW4uZmluZChgW2RhdGEtZmpzLWl0ZW09XCIke2N1cnJlbnR9XCJdYCkuZmlyc3QoKVxuICAgICAgICB9KTtcblxuICAgICAgICBwYXRoLnNoaWZ0KCk7XG5cbiAgICAgICAgaWYgKHBhdGgubGVuZ3RoICYmIGNoaWxkcmVuKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdFBhdGgocGF0aCwgY2hpbGRyZW5bdGhpcy5jb25maWcuY2hpbGRLZXldLCBuZXdDb2x1bW4pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZmluZExhc3RBY3RpdmUoKSB7XG4gICAgICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMuY29udGFpbmVyLmZpbmQoYC4ke3RoaXMuY29uZmlnLmNsYXNzTmFtZS5hY3RpdmV9YCk7XG4gICAgICAgIGlmICghYWN0aXZlLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpdGVtID0gYWN0aXZlLmxhc3QoKTtcbiAgICAgICAgY29uc3QgY29sdW1uID0gaXRlbS5jbG9zZXN0KGAuJHt0aGlzLmNvbmZpZy5jbGFzc05hbWUuY29sfWApO1xuXG4gICAgICAgIHJldHVybiB7IGl0ZW0sIGNvbHVtbiB9O1xuICAgIH1cblxuICAgIGNyZWF0ZUxpc3QoZGF0YSkge1xuICAgICAgICBjb25zdCBsaXN0ID0gJCgnPHVsIC8+Jyk7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZGF0YS5tYXAoKGl0ZW0pID0+IHRoaXMuY3JlYXRlSXRlbShpdGVtKSk7XG5cbiAgICAgICAgY29uc3QgZnJhZ21lbnRzID0gaXRlbXMucmVkdWNlKChmcmFnbWVudCwgY3VycmVudCkgPT4ge1xuICAgICAgICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoY3VycmVudFswXSB8fCBjdXJyZW50KTtcblxuICAgICAgICAgICAgcmV0dXJuIGZyYWdtZW50O1xuICAgICAgICB9LCBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkpO1xuXG4gICAgICAgIGxpc3QuYXBwZW5kKGZyYWdtZW50cykuYWRkQ2xhc3ModGhpcy5jb25maWcuY2xhc3NOYW1lLmxpc3QpO1xuXG4gICAgICAgIHJldHVybiBsaXN0O1xuICAgIH1cblxuICAgIGNyZWF0ZUl0ZW0oaXRlbSkge1xuICAgICAgICBjb25zdCBsaXN0SXRlbSA9ICQoJzxsaSAvPicpO1xuICAgICAgICBjb25zdCBsaXN0SXRlbUNsYXNzZXMgPSBbdGhpcy5jb25maWcuY2xhc3NOYW1lLml0ZW1dO1xuICAgICAgICBjb25zdCBsaW5rID0gJCgnPGEgLz4nKTtcbiAgICAgICAgY29uc3QgY3JlYXRlSXRlbUNvbnRlbnQgPSB0aGlzLmNvbmZpZy5jcmVhdGVJdGVtQ29udGVudCB8fCB0aGlzLmNyZWF0ZUl0ZW1Db250ZW50O1xuICAgICAgICBjb25zdCBmcmFnbWVudCA9IGNyZWF0ZUl0ZW1Db250ZW50LmNhbGwodGhpcywgaXRlbSk7XG4gICAgICAgIGxpbmsuYXBwZW5kKGZyYWdtZW50KVxuICAgICAgICAgICAgLmF0dHIoJ2hyZWYnLCAnJylcbiAgICAgICAgICAgIC5hdHRyKCd0YWJpbmRleCcsIC0xKTtcblxuICAgICAgICBpZiAoaXRlbS51cmwpIHtcbiAgICAgICAgICAgIGxpbmsuYXR0cignaHJlZicsIGl0ZW0udXJsKTtcbiAgICAgICAgICAgIGxpc3RJdGVtQ2xhc3Nlcy5wdXNoKGl0ZW0uY2xhc3NOYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpdGVtW3RoaXMuY29uZmlnLmNoaWxkS2V5XSkge1xuICAgICAgICAgICAgbGlzdEl0ZW1DbGFzc2VzLnB1c2godGhpcy5jb25maWcuY2xhc3NOYW1lW3RoaXMuY29uZmlnLmNoaWxkS2V5XSk7XG4gICAgICAgIH1cblxuICAgICAgICBsaXN0SXRlbUNsYXNzZXMucHVzaChgZmpzLWl0ZW0tJHtpdGVtLnR5cGV9YCk7XG4gICAgICAgIGxpc3RJdGVtLmFkZENsYXNzKGxpc3RJdGVtQ2xhc3Nlcy5qb2luKCcgJykpO1xuICAgICAgICBsaXN0SXRlbS5hcHBlbmQobGluaylcbiAgICAgICAgICAgIC5hdHRyKCdkYXRhLWZqcy1pdGVtJywgaXRlbVt0aGlzLmNvbmZpZy5pdGVtS2V5XSk7XG5cbiAgICAgICAgbGlzdEl0ZW1bMF0uX2l0ZW0gPSBpdGVtO1xuXG4gICAgICAgIHJldHVybiBsaXN0SXRlbTtcbiAgICB9XG5cbiAgICB1cGRhdGVQYXRoQmFyKCkge1xuICAgICAgICBpZiAoIXRoaXMuY29uZmlnLnBhdGhCYXIpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgICAgICAgY29uc3QgYWN0aXZlSXRlbXMgPSB0aGlzLmNvbnRhaW5lci5maW5kKGAuJHt0aGlzLmNvbmZpZy5jbGFzc05hbWUuYWN0aXZlfWApO1xuICAgICAgICBsZXQgaXRlbUtleXMgPSAnJztcbiAgICAgICAgdGhpcy5wYXRoQmFyLmNoaWxkcmVuKCkuZW1wdHkoKTtcbiAgICAgICAgYWN0aXZlSXRlbXMuZWFjaCgoaW5kZXgsIGFjdGl2ZUl0ZW0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBhY3RpdmVJdGVtLl9pdGVtO1xuICAgICAgICAgICAgY29uc3QgaXNMYXN0ID0gKGluZGV4ICsgMSkgPT09IGFjdGl2ZUl0ZW1zLmxlbmd0aDtcbiAgICAgICAgICAgIGl0ZW1LZXlzICs9IGAvJHtpdGVtW3RoaXMuY29uZmlnLml0ZW1LZXldfWA7XG4gICAgICAgICAgICB0aGlzLnBhdGhCYXIuYXBwZW5kKGBcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJyZWFkY3J1bWItbm9kZSBicmVhZGNydW1iLW5vZGUtJHtpdGVtLnR5cGV9XCIgJHtpdGVtLnR5cGUgPT09ICdkaXInID8gYGRhdGEtYnJlYWRjcnVtYi1ub2RlPVwiJHtpdGVtS2V5c31cImAgOiAnJ30+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZncgJHt0aGlzLmdldEljb24oaXRlbS50eXBlKX1cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnJlYWRjcnVtYi1ub2RlLW5hbWVcIj4keyQoJzxkaXYgLz4nKS50ZXh0KGl0ZW1bdGhpcy5jb25maWcubGFiZWxLZXldKS5odG1sKCl9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAkeyFpc0xhc3QgPyAnPGkgY2xhc3M9XCJmYSBmYS1mdyBmYS1jaGV2cm9uLXJpZ2h0XCI+PC9pPicgOiAnJ31cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICBgKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0SWNvbih0eXBlKSB7XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSAncm9vdCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdmYS1zaXRlbWFwJztcbiAgICAgICAgICAgIGNhc2UgJ2ZpbGUnOlxuICAgICAgICAgICAgICAgIHJldHVybiAnZmEtZmlsZS1vJztcbiAgICAgICAgICAgIGNhc2UgJ2Rpcic6XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAnZmEtZm9sZGVyJztcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRmluZGVyO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./app/utils/finderjs.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"DEFAULTS\": () => (/* binding */ DEFAULTS),\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var eventemitter3__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! eventemitter3 */ \"./node_modules/eventemitter3/index.js\");\n/* harmony import */ var eventemitter3__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(eventemitter3__WEBPACK_IMPORTED_MODULE_1__);\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\n * (c) Trilby Media, LLC\n * Author Djamil Legato\n *\n * Based on Mark Matyas's Finderjs\n * MIT License\n */\n\n\nvar DEFAULTS = {\n labelKey: 'name',\n valueKey: 'value',\n // new\n childKey: 'children',\n iconKey: 'icon',\n // new\n itemKey: 'item-key',\n // new\n pathBar: true,\n className: {\n container: 'fjs-container',\n pathBar: 'fjs-path-bar',\n col: 'fjs-col',\n list: 'fjs-list',\n item: 'fjs-item',\n active: 'fjs-active',\n children: 'fjs-has-children',\n url: 'fjs-url',\n itemPrepend: 'fjs-item-prepend',\n itemContent: 'fjs-item-content',\n itemAppend: 'fjs-item-append'\n }\n};\n\nvar Finder = /*#__PURE__*/function () {\n function Finder(container, data, options) {\n var _this = this;\n\n _classCallCheck(this, Finder);\n\n this.$emitter = new (eventemitter3__WEBPACK_IMPORTED_MODULE_1___default())();\n this.container = jquery__WEBPACK_IMPORTED_MODULE_0___default()(container);\n this.data = data;\n this.config = jquery__WEBPACK_IMPORTED_MODULE_0___default().extend({}, DEFAULTS, options); // dom events\n\n this.container.on('click', this.clickEvent.bind(this));\n this.container.on('keydown', this.keydownEvent.bind(this)); // internal events\n\n this.$emitter.on('item-selected', this.itemSelected.bind(this));\n this.$emitter.on('create-column', this.addColumn.bind(this));\n this.$emitter.on('navigate', this.navigate.bind(this));\n this.$emitter.on('go-to', this.goTo.bind(this, this.data));\n this.container.addClass(this.config.className.container).attr('tabindex', 0);\n this.createColumn(this.data);\n\n if (this.config.pathBar) {\n this.pathBar = this.createPathBar();\n this.pathBar.on('click', '[data-breadcrumb-node]', function (event) {\n event.preventDefault();\n var location = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.currentTarget).data('breadcrumbNode');\n\n _this.goTo(_this.data, location);\n });\n } // '' is \n\n\n if (this.config.defaultPath || this.config.defaultPath === '') {\n this.goTo(this.data, this.config.defaultPath);\n }\n }\n\n _createClass(Finder, [{\n key: \"reload\",\n value: function reload() {\n var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.data;\n this.createColumn(data); // '' is \n\n if (this.config.defaultPath || this.config.defaultPath === '') {\n this.goTo(data, this.config.defaultPath);\n }\n }\n }, {\n key: \"createColumn\",\n value: function createColumn(data, parent) {\n var _this2 = this;\n\n var callback = function callback(data) {\n return _this2.createColumn(data, parent);\n };\n\n if (typeof data === 'function') {\n data.call(this, parent, callback);\n } else if (Array.isArray(data) || _typeof(data) === 'object') {\n if (_typeof(data) === 'object') {\n data = Array.from(data);\n }\n\n var list = this.createList(data);\n var div = jquery__WEBPACK_IMPORTED_MODULE_0___default()('
                ');\n div.append(list).addClass(this.config.className.col);\n this.$emitter.emit('create-column', div);\n return div;\n } else {\n throw new Error('Unknown data type');\n }\n }\n }, {\n key: \"createPathBar\",\n value: function createPathBar() {\n this.container.siblings(\".\".concat(this.config.className.pathBar)).remove();\n var pathBar = jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"
                \"));\n pathBar.insertAfter(this.container);\n return pathBar;\n }\n }, {\n key: \"clickEvent\",\n value: function clickEvent(event) {\n event.stopPropagation();\n event.preventDefault();\n var target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.target);\n var column = target.closest(\".\".concat(this.config.className.col));\n var item = target.closest(\".\".concat(this.config.className.item));\n\n if (item.length) {\n this.$emitter.emit('item-selected', {\n column: column,\n item: item\n });\n }\n }\n }, {\n key: \"keydownEvent\",\n value: function keydownEvent(event) {\n var codes = {\n 37: 'left',\n 38: 'up',\n 39: 'right',\n 40: 'down'\n };\n\n if (event.keyCode in codes) {\n event.stopPropagation();\n event.preventDefault();\n this.$emitter.emit('navigate', {\n direction: codes[event.keyCode]\n });\n }\n }\n }, {\n key: \"itemSelected\",\n value: function itemSelected(value) {\n var element = value.item;\n\n if (!element.length) {\n return false;\n }\n\n var item = element[0]._item;\n var column = value.column;\n var data = item[this.config.childKey] || this.data;\n var active = jquery__WEBPACK_IMPORTED_MODULE_0___default()(column).find(\".\".concat(this.config.className.active));\n\n if (active.length) {\n active.removeClass(this.config.className.active);\n }\n\n element.addClass(this.config.className.active);\n column.nextAll().remove(); // ?!?!?\n\n this.container[0].focus();\n window.scrollTo(window.pageXOffset, window.pageYOffset);\n this.updatePathBar();\n var newColumn;\n\n if (data) {\n newColumn = this.createColumn(data, item);\n this.$emitter.emit('interior-selected', item);\n } else {\n this.$emitter.emit('leaf-selected', item);\n }\n\n return newColumn;\n }\n }, {\n key: \"addColumn\",\n value: function addColumn(column) {\n this.container.append(column);\n this.$emitter.emit('column-created', column);\n }\n }, {\n key: \"navigate\",\n value: function navigate(value) {\n var active = this.findLastActive();\n var direction = value.direction;\n var column;\n var item;\n var target;\n\n if (active) {\n item = active.item;\n column = active.column;\n\n if (direction === 'up' && item.prev().length) {\n target = item.prev();\n } else if (direction === 'down' && item.next().length) {\n target = item.next();\n } else if (direction === 'right' && column.next().length) {\n column = column.next();\n target = column.find(\".\".concat(this.config.className.item)).first();\n } else if (direction === 'left' && column.prev().length) {\n column = column.prev();\n target = column.find(\".\".concat(this.config.className.active)).first() || column.find(\".\".concat(this.config.className.item));\n }\n } else {\n column = this.container.find(\".\".concat(this.config.className.col)).first();\n target = column.find(\".\".concat(this.config.className.item)).first();\n }\n\n if (target) {\n this.$emitter.emit('item-selected', {\n column: column,\n item: target\n });\n }\n }\n }, {\n key: \"goTo\",\n value: function goTo(data, path) {\n var _this3 = this;\n\n path = Array.isArray(path) ? path : path.split('/').map(function (bit) {\n return bit.trim();\n }).filter(Boolean);\n\n if (path.length) {\n this.container.children().remove();\n }\n\n if (typeof data === 'function') {\n data.call(this, null, function (data) {\n return _this3.selectPath(path, data);\n });\n } else {\n this.selectPath(path, data);\n }\n }\n }, {\n key: \"selectPath\",\n value: function selectPath(path, data, column) {\n var _this4 = this;\n\n column = column || (path.length ? this.createColumn(data) : this.container.find(\"> .\".concat(this.config.className.col)));\n var current = path[0] || '';\n var children = data.find(function (item) {\n return item[_this4.config.itemKey] === current;\n });\n var newColumn = this.itemSelected({\n column: column,\n item: column.find(\"[data-fjs-item=\\\"\".concat(current, \"\\\"]\")).first()\n });\n path.shift();\n\n if (path.length && children) {\n this.selectPath(path, children[this.config.childKey], newColumn);\n }\n }\n }, {\n key: \"findLastActive\",\n value: function findLastActive() {\n var active = this.container.find(\".\".concat(this.config.className.active));\n\n if (!active.length) {\n return null;\n }\n\n var item = active.last();\n var column = item.closest(\".\".concat(this.config.className.col));\n return {\n item: item,\n column: column\n };\n }\n }, {\n key: \"createList\",\n value: function createList(data) {\n var _this5 = this;\n\n var list = jquery__WEBPACK_IMPORTED_MODULE_0___default()('
                  ');\n var items = data.map(function (item) {\n return _this5.createItem(item);\n });\n var fragments = items.reduce(function (fragment, current) {\n fragment.appendChild(current[0] || current);\n return fragment;\n }, document.createDocumentFragment());\n list.append(fragments).addClass(this.config.className.list);\n return list;\n }\n }, {\n key: \"createItem\",\n value: function createItem(item) {\n var listItem = jquery__WEBPACK_IMPORTED_MODULE_0___default()('
                • ');\n var listItemClasses = [this.config.className.item];\n var link = jquery__WEBPACK_IMPORTED_MODULE_0___default()('');\n var createItemContent = this.config.createItemContent || this.createItemContent;\n var fragment = createItemContent.call(this, item);\n link.append(fragment).attr('href', '').attr('tabindex', -1);\n\n if (item.url) {\n link.attr('href', item.url);\n listItemClasses.push(item.className);\n }\n\n if (item[this.config.childKey]) {\n listItemClasses.push(this.config.className[this.config.childKey]);\n }\n\n listItemClasses.push(\"fjs-item-\".concat(item.type));\n listItem.addClass(listItemClasses.join(' '));\n listItem.append(link).attr('data-fjs-item', item[this.config.itemKey]);\n listItem[0]._item = item;\n return listItem;\n }\n }, {\n key: \"updatePathBar\",\n value: function updatePathBar() {\n var _this6 = this;\n\n if (!this.config.pathBar) {\n return false;\n }\n\n var activeItems = this.container.find(\".\".concat(this.config.className.active));\n var itemKeys = '';\n this.pathBar.children().empty();\n activeItems.each(function (index, activeItem) {\n var item = activeItem._item;\n var isLast = index + 1 === activeItems.length;\n itemKeys += \"/\".concat(item[_this6.config.itemKey]);\n\n _this6.pathBar.append(\"\\n \\n \\n \").concat(jquery__WEBPACK_IMPORTED_MODULE_0___default()('
                  ').text(item[_this6.config.labelKey]).html(), \"\\n \").concat(!isLast ? '' : '', \"\\n \\n \"));\n });\n }\n }, {\n key: \"getIcon\",\n value: function getIcon(type) {\n switch (type) {\n case 'root':\n return 'fa-sitemap';\n\n case 'file':\n return 'fa-file-o';\n\n case 'dir':\n default:\n return 'fa-folder';\n }\n }\n }]);\n\n return Finder;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Finder);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL3V0aWxzL2ZpbmRlcmpzLmpzP2NmNGMiXSwibmFtZXMiOlsiREVGQVVMVFMiLCJsYWJlbEtleSIsInZhbHVlS2V5IiwiY2hpbGRLZXkiLCJpY29uS2V5IiwiaXRlbUtleSIsInBhdGhCYXIiLCJjbGFzc05hbWUiLCJjb250YWluZXIiLCJjb2wiLCJsaXN0IiwiaXRlbSIsImFjdGl2ZSIsImNoaWxkcmVuIiwidXJsIiwiaXRlbVByZXBlbmQiLCJpdGVtQ29udGVudCIsIml0ZW1BcHBlbmQiLCJGaW5kZXIiLCJkYXRhIiwib3B0aW9ucyIsIiRlbWl0dGVyIiwiRXZlbnRFbWl0dGVyIiwiJCIsImNvbmZpZyIsIm9uIiwiY2xpY2tFdmVudCIsImJpbmQiLCJrZXlkb3duRXZlbnQiLCJpdGVtU2VsZWN0ZWQiLCJhZGRDb2x1bW4iLCJuYXZpZ2F0ZSIsImdvVG8iLCJhZGRDbGFzcyIsImF0dHIiLCJjcmVhdGVDb2x1bW4iLCJjcmVhdGVQYXRoQmFyIiwiZXZlbnQiLCJwcmV2ZW50RGVmYXVsdCIsImxvY2F0aW9uIiwiY3VycmVudFRhcmdldCIsImRlZmF1bHRQYXRoIiwicGFyZW50IiwiY2FsbGJhY2siLCJjYWxsIiwiQXJyYXkiLCJpc0FycmF5IiwiZnJvbSIsImNyZWF0ZUxpc3QiLCJkaXYiLCJhcHBlbmQiLCJlbWl0IiwiRXJyb3IiLCJzaWJsaW5ncyIsInJlbW92ZSIsImluc2VydEFmdGVyIiwic3RvcFByb3BhZ2F0aW9uIiwidGFyZ2V0IiwiY29sdW1uIiwiY2xvc2VzdCIsImxlbmd0aCIsImNvZGVzIiwia2V5Q29kZSIsImRpcmVjdGlvbiIsInZhbHVlIiwiZWxlbWVudCIsIl9pdGVtIiwiZmluZCIsInJlbW92ZUNsYXNzIiwibmV4dEFsbCIsImZvY3VzIiwid2luZG93Iiwic2Nyb2xsVG8iLCJwYWdlWE9mZnNldCIsInBhZ2VZT2Zmc2V0IiwidXBkYXRlUGF0aEJhciIsIm5ld0NvbHVtbiIsImZpbmRMYXN0QWN0aXZlIiwicHJldiIsIm5leHQiLCJmaXJzdCIsInBhdGgiLCJzcGxpdCIsIm1hcCIsImJpdCIsInRyaW0iLCJmaWx0ZXIiLCJCb29sZWFuIiwic2VsZWN0UGF0aCIsImN1cnJlbnQiLCJzaGlmdCIsImxhc3QiLCJpdGVtcyIsImNyZWF0ZUl0ZW0iLCJmcmFnbWVudHMiLCJyZWR1Y2UiLCJmcmFnbWVudCIsImFwcGVuZENoaWxkIiwiZG9jdW1lbnQiLCJjcmVhdGVEb2N1bWVudEZyYWdtZW50IiwibGlzdEl0ZW0iLCJsaXN0SXRlbUNsYXNzZXMiLCJsaW5rIiwiY3JlYXRlSXRlbUNvbnRlbnQiLCJwdXNoIiwidHlwZSIsImpvaW4iLCJhY3RpdmVJdGVtcyIsIml0ZW1LZXlzIiwiZW1wdHkiLCJlYWNoIiwiaW5kZXgiLCJhY3RpdmVJdGVtIiwiaXNMYXN0IiwiZ2V0SWNvbiIsInRleHQiLCJodG1sIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVPLElBQU1BLFFBQVEsR0FBRztBQUNwQkMsVUFBUSxFQUFFLE1BRFU7QUFFcEJDLFVBQVEsRUFBRSxPQUZVO0FBRUQ7QUFDbkJDLFVBQVEsRUFBRSxVQUhVO0FBSXBCQyxTQUFPLEVBQUUsTUFKVztBQUlIO0FBQ2pCQyxTQUFPLEVBQUUsVUFMVztBQUtDO0FBQ3JCQyxTQUFPLEVBQUUsSUFOVztBQU9wQkMsV0FBUyxFQUFFO0FBQ1BDLGFBQVMsRUFBRSxlQURKO0FBRVBGLFdBQU8sRUFBRSxjQUZGO0FBR1BHLE9BQUcsRUFBRSxTQUhFO0FBSVBDLFFBQUksRUFBRSxVQUpDO0FBS1BDLFFBQUksRUFBRSxVQUxDO0FBTVBDLFVBQU0sRUFBRSxZQU5EO0FBT1BDLFlBQVEsRUFBRSxrQkFQSDtBQVFQQyxPQUFHLEVBQUUsU0FSRTtBQVNQQyxlQUFXLEVBQUUsa0JBVE47QUFVUEMsZUFBVyxFQUFFLGtCQVZOO0FBV1BDLGNBQVUsRUFBRTtBQVhMO0FBUFMsQ0FBakI7O0lBc0JE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RyxJQUFJLENBQUMsTUFBSSxDQUFDYSxNQUFMLENBQVl2QixRQUFiLENBQXRCLEVBQThDbUgsSUFBOUMsRUFIN0MsMENBSVUsQ0FBQ0gsTUFBRCxHQUFVLDJDQUFWLEdBQXdELEVBSmxFO0FBT0gsT0FYRDtBQVlIOzs7V0FFRCxpQkFBUVIsSUFBUixFQUFjO0FBQ1YsY0FBUUEsSUFBUjtBQUNJLGFBQUssTUFBTDtBQUNJLGlCQUFPLFlBQVA7O0FBQ0osYUFBSyxNQUFMO0FBQ0ksaUJBQU8sV0FBUDs7QUFDSixhQUFLLEtBQUw7QUFDQTtBQUNJLGlCQUFPLFdBQVA7QUFQUjtBQVNIOzs7Ozs7QUFHTCxpRUFBZXZGLE1BQWYiLCJmaWxlIjoiLi9hcHAvdXRpbHMvZmluZGVyanMuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIChjKSBUcmlsYnkgTWVkaWEsIExMQ1xuICogQXV0aG9yIERqYW1pbCBMZWdhdG9cbiAqXG4gKiBCYXNlZCBvbiBNYXJrIE1hdHlhcydzIEZpbmRlcmpzXG4gKiBNSVQgTGljZW5zZVxuICovXG5cbmltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gJ2V2ZW50ZW1pdHRlcjMnO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVFMgPSB7XG4gICAgbGFiZWxLZXk6ICduYW1lJyxcbiAgICB2YWx1ZUtleTogJ3ZhbHVlJywgLy8gbmV3XG4gICAgY2hpbGRLZXk6ICdjaGlsZHJlbicsXG4gICAgaWNvbktleTogJ2ljb24nLCAvLyBuZXdcbiAgICBpdGVtS2V5OiAnaXRlbS1rZXknLCAvLyBuZXdcbiAgICBwYXRoQmFyOiB0cnVlLFxuICAgIGNsYXNzTmFtZToge1xuICAgICAgICBjb250YWluZXI6ICdmanMtY29udGFpbmVyJyxcbiAgICAgICAgcGF0aEJhcjogJ2Zqcy1wYXRoLWJhcicsXG4gICAgICAgIGNvbDogJ2Zqcy1jb2wnLFxuICAgICAgICBsaXN0OiAnZmpzLWxpc3QnLFxuICAgICAgICBpdGVtOiAnZmpzLWl0ZW0nLFxuICAgICAgICBhY3RpdmU6ICdmanMtYWN0aXZlJyxcbiAgICAgICAgY2hpbGRyZW46ICdmanMtaGFzLWNoaWxkcmVuJyxcbiAgICAgICAgdXJsOiAnZmpzLXVybCcsXG4gICAgICAgIGl0ZW1QcmVwZW5kOiAnZmpzLWl0ZW0tcHJlcGVuZCcsXG4gICAgICAgIGl0ZW1Db250ZW50OiAnZmpzLWl0ZW0tY29udGVudCcsXG4gICAgICAgIGl0ZW1BcHBlbmQ6ICdmanMtaXRlbS1hcHBlbmQnXG4gICAgfVxufTtcblxuY2xhc3MgRmluZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihjb250YWluZXIsIGRhdGEsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy4kZW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSAkKGNvbnRhaW5lcik7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG5cbiAgICAgICAgdGhpcy5jb25maWcgPSAkLmV4dGVuZCh7fSwgREVGQVVMVFMsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIGRvbSBldmVudHNcbiAgICAgICAgdGhpcy5jb250YWluZXIub24oJ2NsaWNrJywgdGhpcy5jbGlja0V2ZW50LmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5vbigna2V5ZG93bicsIHRoaXMua2V5ZG93bkV2ZW50LmJpbmQodGhpcykpO1xuXG4gICAgICAgIC8vIGludGVybmFsIGV2ZW50c1xuICAgICAgICB0aGlzLiRlbWl0dGVyLm9uKCdpdGVtLXNlbGVjdGVkJywgdGhpcy5pdGVtU2VsZWN0ZWQuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuJGVtaXR0ZXIub24oJ2NyZWF0ZS1jb2x1bW4nLCB0aGlzLmFkZENvbHVtbi5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy4kZW1pdHRlci5vbignbmF2aWdhdGUnLCB0aGlzLm5hdmlnYXRlLmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLiRlbWl0dGVyLm9uKCdnby10bycsIHRoaXMuZ29Uby5iaW5kKHRoaXMsIHRoaXMuZGF0YSkpO1xuXG4gICAgICAgIHRoaXMuY29udGFpbmVyLmFkZENsYXNzKHRoaXMuY29uZmlnLmNsYXNzTmFtZS5jb250YWluZXIpLmF0dHIoJ3RhYmluZGV4JywgMCk7XG5cbiAgICAgICAgdGhpcy5jcmVhdGVDb2x1bW4odGhpcy5kYXRhKTtcblxuICAgICAgICBpZiAodGhpcy5jb25maWcucGF0aEJhcikge1xuICAgICAgICAgICAgdGhpcy5wYXRoQmFyID0gdGhpcy5jcmVhdGVQYXRoQmFyKCk7XG4gICAgICAgICAgICB0aGlzLnBhdGhCYXIub24oJ2NsaWNrJywgJ1tkYXRhLWJyZWFkY3J1bWItbm9kZV0nLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxvY2F0aW9uID0gJChldmVudC5jdXJyZW50VGFyZ2V0KS5kYXRhKCdicmVhZGNydW1iTm9kZScpO1xuICAgICAgICAgICAgICAgIHRoaXMuZ29Ubyh0aGlzLmRhdGEsIGxvY2F0aW9uKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gJycgaXMgPFJvb3Q+XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5kZWZhdWx0UGF0aCB8fCB0aGlzLmNvbmZpZy5kZWZhdWx0UGF0aCA9PT0gJycpIHtcbiAgICAgICAgICAgIHRoaXMuZ29Ubyh0aGlzLmRhdGEsIHRoaXMuY29uZmlnLmRlZmF1bHRQYXRoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbG9hZChkYXRhID0gdGhpcy5kYXRhKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlQ29sdW1uKGRhdGEpO1xuXG4gICAgICAgIC8vICcnIGlzIDxSb290PlxuICAgICAgICBpZiAodGhpcy5jb25maWcuZGVmYXVsdFBhdGggfHwgdGhpcy5jb25maWcuZGVmYXVsdFBhdGggPT09ICcnKSB7XG4gICAgICAgICAgICB0aGlzLmdvVG8oZGF0YSwgdGhpcy5jb25maWcuZGVmYXVsdFBhdGgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY3JlYXRlQ29sdW1uKGRhdGEsIHBhcmVudCkge1xuICAgICAgICBjb25zdCBjYWxsYmFjayA9IChkYXRhKSA9PiB0aGlzLmNyZWF0ZUNvbHVtbihkYXRhLCBwYXJlbnQpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgZGF0YS5jYWxsKHRoaXMsIHBhcmVudCwgY2FsbGJhY2spO1xuICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkgfHwgdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IEFycmF5LmZyb20oZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBsaXN0ID0gdGhpcy5jcmVhdGVMaXN0KGRhdGEpO1xuICAgICAgICAgICAgY29uc3QgZGl2ID0gJCgnPGRpdiAvPicpO1xuICAgICAgICAgICAgZGl2LmFwcGVuZChsaXN0KS5hZGRDbGFzcyh0aGlzLmNvbmZpZy5jbGFzc05hbWUuY29sKTtcbiAgICAgICAgICAgIHRoaXMuJGVtaXR0ZXIuZW1pdCgnY3JlYXRlLWNvbHVtbicsIGRpdik7XG5cbiAgICAgICAgICAgIHJldHVybiBkaXY7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gZGF0YSB0eXBlJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjcmVhdGVQYXRoQmFyKCkge1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5zaWJsaW5ncyhgLiR7dGhpcy5jb25maWcuY2xhc3NOYW1lLnBhdGhCYXJ9YCkucmVtb3ZlKCk7XG4gICAgICAgIGNvbnN0IHBhdGhCYXIgPSAkKGA8ZGl2IGNsYXNzPVwiJHt0aGlzLmNvbmZpZy5jbGFzc05hbWUucGF0aEJhcn1cIiAvPmApO1xuICAgICAgICBwYXRoQmFyLmluc2VydEFmdGVyKHRoaXMuY29udGFpbmVyKTtcblxuICAgICAgICByZXR1cm4gcGF0aEJhcjtcbiAgICB9XG5cbiAgICBjbGlja0V2ZW50KGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIGNvbnN0IHRhcmdldCA9ICQoZXZlbnQudGFyZ2V0KTtcbiAgICAgICAgY29uc3QgY29sdW1uID0gdGFyZ2V0LmNsb3Nlc3QoYC4ke3RoaXMuY29uZmlnLmNsYXNzTmFtZS5jb2x9YCk7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0YXJnZXQuY2xvc2VzdChgLiR7dGhpcy5jb25maWcuY2xhc3NOYW1lLml0ZW19YCk7XG5cbiAgICAgICAgaWYgKGl0ZW0ubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLiRlbWl0dGVyLmVtaXQoJ2l0ZW0tc2VsZWN0ZWQnLCB7IGNvbHVtbiwgaXRlbSB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGtleWRvd25FdmVudChldmVudCkge1xuICAgICAgICBjb25zdCBjb2RlcyA9IHsgMzc6ICdsZWZ0JywgMzg6ICd1cCcsIDM5OiAncmlnaHQnLCA0MDogJ2Rvd24nIH07XG5cbiAgICAgICAgaWYgKGV2ZW50LmtleUNvZGUgaW4gY29kZXMpIHtcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgdGhpcy4kZW1pdHRlci5lbWl0KCduYXZpZ2F0ZScsIHtcbiAgICAgICAgICAgICAgICBkaXJlY3Rpb246IGNvZGVzW2V2ZW50LmtleUNvZGVdXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGl0ZW1TZWxlY3RlZCh2YWx1ZSkge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdmFsdWUuaXRlbTtcbiAgICAgICAgaWYgKCFlbGVtZW50Lmxlbmd0aCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgICAgY29uc3QgaXRlbSA9IGVsZW1lbnRbMF0uX2l0ZW07XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IHZhbHVlLmNvbHVtbjtcbiAgICAgICAgY29uc3QgZGF0YSA9IGl0ZW1bdGhpcy5jb25maWcuY2hpbGRLZXldIHx8IHRoaXMuZGF0YTtcbiAgICAgICAgY29uc3QgYWN0aXZlID0gJChjb2x1bW4pLmZpbmQoYC4ke3RoaXMuY29uZmlnLmNsYXNzTmFtZS5hY3RpdmV9YCk7XG5cbiAgICAgICAgaWYgKGFjdGl2ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGFjdGl2ZS5yZW1vdmVDbGFzcyh0aGlzLmNvbmZpZy5jbGFzc05hbWUuYWN0aXZlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVsZW1lbnQuYWRkQ2xhc3ModGhpcy5jb25maWcuY2xhc3NOYW1lLmFjdGl2ZSk7XG4gICAgICAgIGNvbHVtbi5uZXh0QWxsKCkucmVtb3ZlKCk7IC8vID8hPyE/XG5cbiAgICAgICAgdGhpcy5jb250YWluZXJbMF0uZm9jdXMoKTtcbiAgICAgICAgd2luZG93LnNjcm9sbFRvKHdpbmRvdy5wYWdlWE9mZnNldCwgd2luZG93LnBhZ2VZT2Zmc2V0KTtcblxuICAgICAgICB0aGlzLnVwZGF0ZVBhdGhCYXIoKTtcblxuICAgICAgICBsZXQgbmV3Q29sdW1uO1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgbmV3Q29sdW1uID0gdGhpcy5jcmVhdGVDb2x1bW4oZGF0YSwgaXRlbSk7XG4gICAgICAgICAgICB0aGlzLiRlbWl0dGVyLmVtaXQoJ2ludGVyaW9yLXNlbGVjdGVkJywgaXRlbSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLiRlbWl0dGVyLmVtaXQoJ2xlYWYtc2VsZWN0ZWQnLCBpdGVtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXdDb2x1bW47XG4gICAgfVxuXG4gICAgYWRkQ29sdW1uKGNvbHVtbikge1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmQoY29sdW1uKTtcbiAgICAgICAgdGhpcy4kZW1pdHRlci5lbWl0KCdjb2x1bW4tY3JlYXRlZCcsIGNvbHVtbik7XG4gICAgfVxuXG4gICAgbmF2aWdhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgYWN0aXZlID0gdGhpcy5maW5kTGFzdEFjdGl2ZSgpO1xuICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSB2YWx1ZS5kaXJlY3Rpb247XG4gICAgICAgIGxldCBjb2x1bW47XG4gICAgICAgIGxldCBpdGVtO1xuICAgICAgICBsZXQgdGFyZ2V0O1xuXG4gICAgICAgIGlmIChhY3RpdmUpIHtcbiAgICAgICAgICAgIGl0ZW0gPSBhY3RpdmUuaXRlbTtcbiAgICAgICAgICAgIGNvbHVtbiA9IGFjdGl2ZS5jb2x1bW47XG5cbiAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT09ICd1cCcgJiYgaXRlbS5wcmV2KCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gaXRlbS5wcmV2KCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gJ2Rvd24nICYmIGl0ZW0ubmV4dCgpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRhcmdldCA9IGl0ZW0ubmV4dCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT09ICdyaWdodCcgJiYgY29sdW1uLm5leHQoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb2x1bW4gPSBjb2x1bW4ubmV4dCgpO1xuICAgICAgICAgICAgICAgIHRhcmdldCA9IGNvbHVtbi5maW5kKGAuJHt0aGlzLmNvbmZpZy5jbGFzc05hbWUuaXRlbX1gKS5maXJzdCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT09ICdsZWZ0JyAmJiBjb2x1bW4ucHJldigpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNvbHVtbiA9IGNvbHVtbi5wcmV2KCk7XG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gY29sdW1uLmZpbmQoYC4ke3RoaXMuY29uZmlnLmNsYXNzTmFtZS5hY3RpdmV9YCkuZmlyc3QoKSB8fCBjb2x1bW4uZmluZChgLiR7dGhpcy5jb25maWcuY2xhc3NOYW1lLml0ZW19YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb2x1bW4gPSB0aGlzLmNvbnRhaW5lci5maW5kKGAuJHt0aGlzLmNvbmZpZy5jbGFzc05hbWUuY29sfWApLmZpcnN0KCk7XG4gICAgICAgICAgICB0YXJnZXQgPSBjb2x1bW4uZmluZChgLiR7dGhpcy5jb25maWcuY2xhc3NOYW1lLml0ZW19YCkuZmlyc3QoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgICAgIHRoaXMuJGVtaXR0ZXIuZW1pdCgnaXRlbS1zZWxlY3RlZCcsIHtcbiAgICAgICAgICAgICAgICBjb2x1bW4sXG4gICAgICAgICAgICAgICAgaXRlbTogdGFyZ2V0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdvVG8oZGF0YSwgcGF0aCkge1xuICAgICAgICBwYXRoID0gQXJyYXkuaXNBcnJheShwYXRoKSA/IHBhdGggOiBwYXRoLnNwbGl0KCcvJykubWFwKGJpdCA9PiBiaXQudHJpbSgpKS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgICAgICAgaWYgKHBhdGgubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jaGlsZHJlbigpLnJlbW92ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBkYXRhLmNhbGwodGhpcywgbnVsbCwgKGRhdGEpID0+IHRoaXMuc2VsZWN0UGF0aChwYXRoLCBkYXRhKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdFBhdGgocGF0aCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZWxlY3RQYXRoKHBhdGgsIGRhdGEsIGNvbHVtbikge1xuICAgICAgICBjb2x1bW4gPSBjb2x1bW4gfHwgKHBhdGgubGVuZ3RoID8gdGhpcy5jcmVhdGVDb2x1bW4oZGF0YSkgOiB0aGlzLmNvbnRhaW5lci5maW5kKGA+IC4ke3RoaXMuY29uZmlnLmNsYXNzTmFtZS5jb2x9YCkpO1xuXG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBwYXRoWzBdIHx8ICcnO1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGRhdGEuZmluZCgoaXRlbSkgPT4gaXRlbVt0aGlzLmNvbmZpZy5pdGVtS2V5XSA9PT0gY3VycmVudCk7XG4gICAgICAgIGNvbnN0IG5ld0NvbHVtbiA9IHRoaXMuaXRlbVNlbGVjdGVkKHtcbiAgICAgICAgICAgIGNvbHVtbixcbiAgICAgICAgICAgIGl0ZW06IGNvbHVtbi5maW5kKGBbZGF0YS1manMtaXRlbT1cIiR7Y3VycmVudH1cIl1gKS5maXJzdCgpXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHBhdGguc2hpZnQoKTtcblxuICAgICAgICBpZiAocGF0aC5sZW5ndGggJiYgY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0UGF0aChwYXRoLCBjaGlsZHJlblt0aGlzLmNvbmZpZy5jaGlsZEtleV0sIG5ld0NvbHVtbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmaW5kTGFzdEFjdGl2ZSgpIHtcbiAgICAgICAgY29uc3QgYWN0aXZlID0gdGhpcy5jb250YWluZXIuZmluZChgLiR7dGhpcy5jb25maWcuY2xhc3NOYW1lLmFjdGl2ZX1gKTtcbiAgICAgICAgaWYgKCFhY3RpdmUubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGl0ZW0gPSBhY3RpdmUubGFzdCgpO1xuICAgICAgICBjb25zdCBjb2x1bW4gPSBpdGVtLmNsb3Nlc3QoYC4ke3RoaXMuY29uZmlnLmNsYXNzTmFtZS5jb2x9YCk7XG5cbiAgICAgICAgcmV0dXJuIHsgaXRlbSwgY29sdW1uIH07XG4gICAgfVxuXG4gICAgY3JlYXRlTGlzdChkYXRhKSB7XG4gICAgICAgIGNvbnN0IGxpc3QgPSAkKCc8dWwgLz4nKTtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBkYXRhLm1hcCgoaXRlbSkgPT4gdGhpcy5jcmVhdGVJdGVtKGl0ZW0pKTtcblxuICAgICAgICBjb25zdCBmcmFnbWVudHMgPSBpdGVtcy5yZWR1Y2UoKGZyYWdtZW50LCBjdXJyZW50KSA9PiB7XG4gICAgICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChjdXJyZW50WzBdIHx8IGN1cnJlbnQpO1xuXG4gICAgICAgICAgICByZXR1cm4gZnJhZ21lbnQ7XG4gICAgICAgIH0sIGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSk7XG5cbiAgICAgICAgbGlzdC5hcHBlbmQoZnJhZ21lbnRzKS5hZGRDbGFzcyh0aGlzLmNvbmZpZy5jbGFzc05hbWUubGlzdCk7XG5cbiAgICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgfVxuXG4gICAgY3JlYXRlSXRlbShpdGVtKSB7XG4gICAgICAgIGNvbnN0IGxpc3RJdGVtID0gJCgnPGxpIC8+Jyk7XG4gICAgICAgIGNvbnN0IGxpc3RJdGVtQ2xhc3NlcyA9IFt0aGlzLmNvbmZpZy5jbGFzc05hbWUuaXRlbV07XG4gICAgICAgIGNvbnN0IGxpbmsgPSAkKCc8YSAvPicpO1xuICAgICAgICBjb25zdCBjcmVhdGVJdGVtQ29udGVudCA9IHRoaXMuY29uZmlnLmNyZWF0ZUl0ZW1Db250ZW50IHx8IHRoaXMuY3JlYXRlSXRlbUNvbnRlbnQ7XG4gICAgICAgIGNvbnN0IGZyYWdtZW50ID0gY3JlYXRlSXRlbUNvbnRlbnQuY2FsbCh0aGlzLCBpdGVtKTtcbiAgICAgICAgbGluay5hcHBlbmQoZnJhZ21lbnQpXG4gICAgICAgICAgICAuYXR0cignaHJlZicsICcnKVxuICAgICAgICAgICAgLmF0dHIoJ3RhYmluZGV4JywgLTEpO1xuXG4gICAgICAgIGlmIChpdGVtLnVybCkge1xuICAgICAgICAgICAgbGluay5hdHRyKCdocmVmJywgaXRlbS51cmwpO1xuICAgICAgICAgICAgbGlzdEl0ZW1DbGFzc2VzLnB1c2goaXRlbS5jbGFzc05hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGl0ZW1bdGhpcy5jb25maWcuY2hpbGRLZXldKSB7XG4gICAgICAgICAgICBsaXN0SXRlbUNsYXNzZXMucHVzaCh0aGlzLmNvbmZpZy5jbGFzc05hbWVbdGhpcy5jb25maWcuY2hpbGRLZXldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxpc3RJdGVtQ2xhc3Nlcy5wdXNoKGBmanMtaXRlbS0ke2l0ZW0udHlwZX1gKTtcbiAgICAgICAgbGlzdEl0ZW0uYWRkQ2xhc3MobGlzdEl0ZW1DbGFzc2VzLmpvaW4oJyAnKSk7XG4gICAgICAgIGxpc3RJdGVtLmFwcGVuZChsaW5rKVxuICAgICAgICAgICAgLmF0dHIoJ2RhdGEtZmpzLWl0ZW0nLCBpdGVtW3RoaXMuY29uZmlnLml0ZW1LZXldKTtcblxuICAgICAgICBsaXN0SXRlbVswXS5faXRlbSA9IGl0ZW07XG5cbiAgICAgICAgcmV0dXJuIGxpc3RJdGVtO1xuICAgIH1cblxuICAgIHVwZGF0ZVBhdGhCYXIoKSB7XG4gICAgICAgIGlmICghdGhpcy5jb25maWcucGF0aEJhcikgeyByZXR1cm4gZmFsc2U7IH1cblxuICAgICAgICBjb25zdCBhY3RpdmVJdGVtcyA9IHRoaXMuY29udGFpbmVyLmZpbmQoYC4ke3RoaXMuY29uZmlnLmNsYXNzTmFtZS5hY3RpdmV9YCk7XG4gICAgICAgIGxldCBpdGVtS2V5cyA9ICcnO1xuICAgICAgICB0aGlzLnBhdGhCYXIuY2hpbGRyZW4oKS5lbXB0eSgpO1xuICAgICAgICBhY3RpdmVJdGVtcy5lYWNoKChpbmRleCwgYWN0aXZlSXRlbSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaXRlbSA9IGFjdGl2ZUl0ZW0uX2l0ZW07XG4gICAgICAgICAgICBjb25zdCBpc0xhc3QgPSAoaW5kZXggKyAxKSA9PT0gYWN0aXZlSXRlbXMubGVuZ3RoO1xuICAgICAgICAgICAgaXRlbUtleXMgKz0gYC8ke2l0ZW1bdGhpcy5jb25maWcuaXRlbUtleV19YDtcbiAgICAgICAgICAgIHRoaXMucGF0aEJhci5hcHBlbmQoYFxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnJlYWRjcnVtYi1ub2RlIGJyZWFkY3J1bWItbm9kZS0ke2l0ZW0udHlwZX1cIiAke2l0ZW0udHlwZSA9PT0gJ2RpcicgPyBgZGF0YS1icmVhZGNydW1iLW5vZGU9XCIke2l0ZW1LZXlzfVwiYCA6ICcnfT5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1mdyAke3RoaXMuZ2V0SWNvbihpdGVtLnR5cGUpfVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJicmVhZGNydW1iLW5vZGUtbmFtZVwiPiR7JCgnPGRpdiAvPicpLnRleHQoaXRlbVt0aGlzLmNvbmZpZy5sYWJlbEtleV0pLmh0bWwoKX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICR7IWlzTGFzdCA/ICc8aSBjbGFzcz1cImZhIGZhLWZ3IGZhLWNoZXZyb24tcmlnaHRcIj48L2k+JyA6ICcnfVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIGApO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRJY29uKHR5cGUpIHtcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdyb290JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2ZhLXNpdGVtYXAnO1xuICAgICAgICAgICAgY2FzZSAnZmlsZSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdmYS1maWxlLW8nO1xuICAgICAgICAgICAgY2FzZSAnZGlyJzpcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdmYS1mb2xkZXInO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBGaW5kZXI7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./app/utils/finderjs.js\n"); /***/ }), /***/ "./app/utils/formatbytes.js": -/*!**********************************!* +/*!**********************************!*\ !*** ./app/utils/formatbytes.js ***! \**********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => /* binding */ formatBytes\n/* harmony export */ });\nvar sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\nfunction formatBytes(bytes, decimals) {\n if (bytes === 0) return '0 Byte';\n var k = 1000;\n var value = Math.floor(Math.log(bytes) / Math.log(k));\n var decimal = decimals + 1 || 3;\n return (bytes / Math.pow(k, value)).toPrecision(decimal) + ' ' + sizes[value];\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL3V0aWxzL2Zvcm1hdGJ5dGVzLmpzP2FhZDMiXSwibmFtZXMiOlsic2l6ZXMiLCJmb3JtYXRCeXRlcyIsImJ5dGVzIiwiZGVjaW1hbHMiLCJrIiwidmFsdWUiLCJNYXRoIiwiZmxvb3IiLCJsb2ciLCJkZWNpbWFsIiwicG93IiwidG9QcmVjaXNpb24iXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxJQUFNQSxLQUFLLEdBQUcsQ0FBQyxPQUFELEVBQVUsSUFBVixFQUFnQixJQUFoQixFQUFzQixJQUF0QixFQUE0QixJQUE1QixFQUFrQyxJQUFsQyxFQUF3QyxJQUF4QyxFQUE4QyxJQUE5QyxFQUFvRCxJQUFwRCxDQUFkO0FBRWUsU0FBU0MsV0FBVCxDQUFxQkMsS0FBckIsRUFBNEJDLFFBQTVCLEVBQXNDO0FBQ2pELE1BQUlELEtBQUssS0FBSyxDQUFkLEVBQWlCLE9BQU8sUUFBUDtBQUVqQixNQUFJRSxDQUFDLEdBQUcsSUFBUjtBQUNBLE1BQUlDLEtBQUssR0FBR0MsSUFBSSxDQUFDQyxLQUFMLENBQVdELElBQUksQ0FBQ0UsR0FBTCxDQUFTTixLQUFULElBQWtCSSxJQUFJLENBQUNFLEdBQUwsQ0FBU0osQ0FBVCxDQUE3QixDQUFaO0FBQ0EsTUFBSUssT0FBTyxHQUFHTixRQUFRLEdBQUcsQ0FBWCxJQUFnQixDQUE5QjtBQUVBLFNBQU8sQ0FBQ0QsS0FBSyxHQUFHSSxJQUFJLENBQUNJLEdBQUwsQ0FBU04sQ0FBVCxFQUFZQyxLQUFaLENBQVQsRUFBNkJNLFdBQTdCLENBQXlDRixPQUF6QyxJQUFvRCxHQUFwRCxHQUEwRFQsS0FBSyxDQUFDSyxLQUFELENBQXRFO0FBQ0giLCJmaWxlIjoiLi9hcHAvdXRpbHMvZm9ybWF0Ynl0ZXMuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBzaXplcyA9IFsnQnl0ZXMnLCAnS0InLCAnTUInLCAnR0InLCAnVEInLCAnUEInLCAnRUInLCAnWkInLCAnWUInXTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZm9ybWF0Qnl0ZXMoYnl0ZXMsIGRlY2ltYWxzKSB7XG4gICAgaWYgKGJ5dGVzID09PSAwKSByZXR1cm4gJzAgQnl0ZSc7XG5cbiAgICBsZXQgayA9IDEwMDA7XG4gICAgbGV0IHZhbHVlID0gTWF0aC5mbG9vcihNYXRoLmxvZyhieXRlcykgLyBNYXRoLmxvZyhrKSk7XG4gICAgbGV0IGRlY2ltYWwgPSBkZWNpbWFscyArIDEgfHwgMztcblxuICAgIHJldHVybiAoYnl0ZXMgLyBNYXRoLnBvdyhrLCB2YWx1ZSkpLnRvUHJlY2lzaW9uKGRlY2ltYWwpICsgJyAnICsgc2l6ZXNbdmFsdWVdO1xufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./app/utils/formatbytes.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ formatBytes)\n/* harmony export */ });\nvar sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\nfunction formatBytes(bytes, decimals) {\n if (bytes === 0) return '0 Byte';\n var k = 1000;\n var value = Math.floor(Math.log(bytes) / Math.log(k));\n var decimal = decimals + 1 || 3;\n return (bytes / Math.pow(k, value)).toPrecision(decimal) + ' ' + sizes[value];\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL3V0aWxzL2Zvcm1hdGJ5dGVzLmpzP2FhZDMiXSwibmFtZXMiOlsic2l6ZXMiLCJmb3JtYXRCeXRlcyIsImJ5dGVzIiwiZGVjaW1hbHMiLCJrIiwidmFsdWUiLCJNYXRoIiwiZmxvb3IiLCJsb2ciLCJkZWNpbWFsIiwicG93IiwidG9QcmVjaXNpb24iXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxJQUFNQSxLQUFLLEdBQUcsQ0FBQyxPQUFELEVBQVUsSUFBVixFQUFnQixJQUFoQixFQUFzQixJQUF0QixFQUE0QixJQUE1QixFQUFrQyxJQUFsQyxFQUF3QyxJQUF4QyxFQUE4QyxJQUE5QyxFQUFvRCxJQUFwRCxDQUFkO0FBRWUsU0FBU0MsV0FBVCxDQUFxQkMsS0FBckIsRUFBNEJDLFFBQTVCLEVBQXNDO0FBQ2pELE1BQUlELEtBQUssS0FBSyxDQUFkLEVBQWlCLE9BQU8sUUFBUDtBQUVqQixNQUFJRSxDQUFDLEdBQUcsSUFBUjtBQUNBLE1BQUlDLEtBQUssR0FBR0MsSUFBSSxDQUFDQyxLQUFMLENBQVdELElBQUksQ0FBQ0UsR0FBTCxDQUFTTixLQUFULElBQWtCSSxJQUFJLENBQUNFLEdBQUwsQ0FBU0osQ0FBVCxDQUE3QixDQUFaO0FBQ0EsTUFBSUssT0FBTyxHQUFHTixRQUFRLEdBQUcsQ0FBWCxJQUFnQixDQUE5QjtBQUVBLFNBQU8sQ0FBQ0QsS0FBSyxHQUFHSSxJQUFJLENBQUNJLEdBQUwsQ0FBU04sQ0FBVCxFQUFZQyxLQUFaLENBQVQsRUFBNkJNLFdBQTdCLENBQXlDRixPQUF6QyxJQUFvRCxHQUFwRCxHQUEwRFQsS0FBSyxDQUFDSyxLQUFELENBQXRFO0FBQ0giLCJmaWxlIjoiLi9hcHAvdXRpbHMvZm9ybWF0Ynl0ZXMuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBzaXplcyA9IFsnQnl0ZXMnLCAnS0InLCAnTUInLCAnR0InLCAnVEInLCAnUEInLCAnRUInLCAnWkInLCAnWUInXTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZm9ybWF0Qnl0ZXMoYnl0ZXMsIGRlY2ltYWxzKSB7XG4gICAgaWYgKGJ5dGVzID09PSAwKSByZXR1cm4gJzAgQnl0ZSc7XG5cbiAgICBsZXQgayA9IDEwMDA7XG4gICAgbGV0IHZhbHVlID0gTWF0aC5mbG9vcihNYXRoLmxvZyhieXRlcykgLyBNYXRoLmxvZyhrKSk7XG4gICAgbGV0IGRlY2ltYWwgPSBkZWNpbWFscyArIDEgfHwgMztcblxuICAgIHJldHVybiAoYnl0ZXMgLyBNYXRoLnBvdyhrLCB2YWx1ZSkpLnRvUHJlY2lzaW9uKGRlY2ltYWwpICsgJyAnICsgc2l6ZXNbdmFsdWVdO1xufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./app/utils/formatbytes.js\n"); /***/ }), /***/ "./app/utils/gpm.js": -/*!**************************!* +/*!**************************!*\ !*** ./app/utils/gpm.js ***! \**************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => /* binding */ GPM,\n/* harmony export */ \"Instance\": () => /* binding */ Instance\n/* harmony export */ });\n/* harmony import */ var _response__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./response */ \"./app/utils/response.js\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! grav-config */ \"grav-config\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(grav_config__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! events */ \"./node_modules/events/events.js\");\n/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(events__WEBPACK_IMPORTED_MODULE_2__);\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\nvar GPM = /*#__PURE__*/function (_EventEmitter) {\n _inherits(GPM, _EventEmitter);\n\n var _super = _createSuper(GPM);\n\n function GPM() {\n var _this;\n\n var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'getUpdates';\n\n _classCallCheck(this, GPM);\n\n _this = _super.call(this);\n _this.payload = {};\n _this.raw = {};\n _this.action = action;\n return _this;\n }\n\n _createClass(GPM, [{\n key: \"setPayload\",\n value: function setPayload() {\n var payload = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n this.payload = payload;\n this.emit('payload', payload);\n return this;\n }\n }, {\n key: \"setAction\",\n value: function setAction() {\n var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'getUpdates';\n this.action = action;\n this.emit('action', action);\n return this;\n }\n }, {\n key: \"fetch\",\n value: function (_fetch) {\n function fetch() {\n return _fetch.apply(this, arguments);\n }\n\n fetch.toString = function () {\n return _fetch.toString();\n };\n\n return fetch;\n }(function () {\n var _this2 = this;\n\n var callback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {\n return true;\n };\n var flush = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var data = new FormData();\n data.append('admin-nonce', grav_config__WEBPACK_IMPORTED_MODULE_1__.config.admin_nonce);\n\n if (flush) {\n data.append('flush', true);\n }\n\n this.emit('fetching', this);\n fetch(\"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.base_url_relative, \"/update.json/task\").concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.param_sep, \"getUpdates\"), {\n credentials: 'same-origin',\n method: 'post',\n body: data\n }).then(function (response) {\n _this2.raw = response;\n return response;\n }).then(_response__WEBPACK_IMPORTED_MODULE_0__.parseStatus).then(_response__WEBPACK_IMPORTED_MODULE_0__.parseJSON).then(function (response) {\n return _this2.response(response);\n }).then(function (response) {\n return callback(response, _this2.raw);\n }).then(function (response) {\n return _this2.emit('fetched', _this2.payload, _this2.raw, _this2);\n })[\"catch\"](_response__WEBPACK_IMPORTED_MODULE_0__.userFeedbackError);\n })\n }, {\n key: \"response\",\n value: function response(_response) {\n this.payload = _response;\n return _response;\n }\n }]);\n\n return GPM;\n}((events__WEBPACK_IMPORTED_MODULE_2___default()));\n\n\nvar Instance = new GPM();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL3V0aWxzL2dwbS5qcz83OWI2Il0sIm5hbWVzIjpbIkdQTSIsImFjdGlvbiIsInBheWxvYWQiLCJyYXciLCJlbWl0IiwiY2FsbGJhY2siLCJmbHVzaCIsImRhdGEiLCJGb3JtRGF0YSIsImFwcGVuZCIsImNvbmZpZyIsImZldGNoIiwiY3JlZGVudGlhbHMiLCJtZXRob2QiLCJib2R5IiwidGhlbiIsInJlc3BvbnNlIiwicGFyc2VTdGF0dXMiLCJwYXJzZUpTT04iLCJ1c2VyRmVlZGJhY2tFcnJvciIsIkV2ZW50RW1pdHRlciIsIkluc3RhbmNlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTs7SUFFcUJBLEc7Ozs7O0FBQ2pCLGlCQUFtQztBQUFBOztBQUFBLFFBQXZCQyxNQUF1Qix1RUFBZCxZQUFjOztBQUFBOztBQUMvQjtBQUNBLFVBQUtDLE9BQUwsR0FBZSxFQUFmO0FBQ0EsVUFBS0MsR0FBTCxHQUFXLEVBQVg7QUFDQSxVQUFLRixNQUFMLEdBQWNBLE1BQWQ7QUFKK0I7QUFLbEM7Ozs7aUNBRXdCO0FBQUEsVUFBZEMsT0FBYyx1RUFBSixFQUFJO0FBQ3JCLFdBQUtBLE9BQUwsR0FBZUEsT0FBZjtBQUNBLFdBQUtFLElBQUwsQ0FBVSxTQUFWLEVBQXFCRixPQUFyQjtBQUVBLGFBQU8sSUFBUDtBQUNIOzs7Z0NBRWdDO0FBQUEsVUFBdkJELE1BQXVCLHVFQUFkLFlBQWM7QUFDN0IsV0FBS0EsTUFBTCxHQUFjQSxNQUFkO0FBQ0EsV0FBS0csSUFBTCxDQUFVLFFBQVYsRUFBb0JILE1BQXBCO0FBRUEsYUFBTyxJQUFQO0FBQ0g7Ozs7Ozs7Ozs7Ozs7a0JBRTJDO0FBQUE7O0FBQUEsVUFBdENJLFFBQXNDLHVFQUEzQjtBQUFBLGVBQU0sSUFBTjtBQUFBLE9BQTJCO0FBQUEsVUFBZkMsS0FBZSx1RUFBUCxLQUFPO0FBQ3hDLFVBQUlDLElBQUksR0FBRyxJQUFJQyxRQUFKLEVBQVg7QUFDQUQsVUFBSSxDQUFDRSxNQUFMLENBQVksYUFBWixFQUEyQkMsMkRBQTNCOztBQUVBLFVBQUlKLEtBQUosRUFBVztBQUNQQyxZQUFJLENBQUNFLE1BQUwsQ0FBWSxPQUFaLEVBQXFCLElBQXJCO0FBQ0g7O0FBRUQsV0FBS0wsSUFBTCxDQUFVLFVBQVYsRUFBc0IsSUFBdEI7QUFFQU8sV0FBSyxXQUFJRCxpRUFBSiw4QkFBZ0RBLHlEQUFoRCxpQkFBOEU7QUFDL0VFLG1CQUFXLEVBQUUsYUFEa0U7QUFFL0VDLGNBQU0sRUFBRSxNQUZ1RTtBQUcvRUMsWUFBSSxFQUFFUDtBQUh5RSxPQUE5RSxDQUFMLENBSUdRLElBSkgsQ0FJUSxVQUFDQyxRQUFELEVBQWM7QUFBRSxjQUFJLENBQUNiLEdBQUwsR0FBV2EsUUFBWDtBQUFxQixlQUFPQSxRQUFQO0FBQWtCLE9BSi9ELEVBS0tELElBTEwsQ0FLVUUsa0RBTFYsRUFNS0YsSUFOTCxDQU1VRyxnREFOVixFQU9LSCxJQVBMLENBT1UsVUFBQ0MsUUFBRDtBQUFBLGVBQWMsTUFBSSxDQUFDQSxRQUFMLENBQWNBLFFBQWQsQ0FBZDtBQUFBLE9BUFYsRUFRS0QsSUFSTCxDQVFVLFVBQUNDLFFBQUQ7QUFBQSxlQUFjWCxRQUFRLENBQUNXLFFBQUQsRUFBVyxNQUFJLENBQUNiLEdBQWhCLENBQXRCO0FBQUEsT0FSVixFQVNLWSxJQVRMLENBU1UsVUFBQ0MsUUFBRDtBQUFBLGVBQWMsTUFBSSxDQUFDWixJQUFMLENBQVUsU0FBVixFQUFxQixNQUFJLENBQUNGLE9BQTFCLEVBQW1DLE1BQUksQ0FBQ0MsR0FBeEMsRUFBNkMsTUFBN0MsQ0FBZDtBQUFBLE9BVFYsV0FVV2dCLHdEQVZYO0FBV0gsSzs7OzZCQUVRSCxTLEVBQVU7QUFDZixXQUFLZCxPQUFMLEdBQWVjLFNBQWY7QUFFQSxhQUFPQSxTQUFQO0FBQ0g7Ozs7RUFqRDRCSSwrQzs7O0FBb0QxQixJQUFJQyxRQUFRLEdBQUcsSUFBSXJCLEdBQUosRUFBZiIsImZpbGUiOiIuL2FwcC91dGlscy9ncG0uanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBwYXJzZUpTT04sIHBhcnNlU3RhdHVzLCB1c2VyRmVlZGJhY2tFcnJvciB9IGZyb20gJy4vcmVzcG9uc2UnO1xuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnZ3Jhdi1jb25maWcnO1xuaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tICdldmVudHMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBHUE0gZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgIGNvbnN0cnVjdG9yKGFjdGlvbiA9ICdnZXRVcGRhdGVzJykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnBheWxvYWQgPSB7fTtcbiAgICAgICAgdGhpcy5yYXcgPSB7fTtcbiAgICAgICAgdGhpcy5hY3Rpb24gPSBhY3Rpb247XG4gICAgfVxuXG4gICAgc2V0UGF5bG9hZChwYXlsb2FkID0ge30pIHtcbiAgICAgICAgdGhpcy5wYXlsb2FkID0gcGF5bG9hZDtcbiAgICAgICAgdGhpcy5lbWl0KCdwYXlsb2FkJywgcGF5bG9hZCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgc2V0QWN0aW9uKGFjdGlvbiA9ICdnZXRVcGRhdGVzJykge1xuICAgICAgICB0aGlzLmFjdGlvbiA9IGFjdGlvbjtcbiAgICAgICAgdGhpcy5lbWl0KCdhY3Rpb24nLCBhY3Rpb24pO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZldGNoKGNhbGxiYWNrID0gKCkgPT4gdHJ1ZSwgZmx1c2ggPSBmYWxzZSkge1xuICAgICAgICBsZXQgZGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgICBkYXRhLmFwcGVuZCgnYWRtaW4tbm9uY2UnLCBjb25maWcuYWRtaW5fbm9uY2UpO1xuXG4gICAgICAgIGlmIChmbHVzaCkge1xuICAgICAgICAgICAgZGF0YS5hcHBlbmQoJ2ZsdXNoJywgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVtaXQoJ2ZldGNoaW5nJywgdGhpcyk7XG5cbiAgICAgICAgZmV0Y2goYCR7Y29uZmlnLmJhc2VfdXJsX3JlbGF0aXZlfS91cGRhdGUuanNvbi90YXNrJHtjb25maWcucGFyYW1fc2VwfWdldFVwZGF0ZXNgLCB7XG4gICAgICAgICAgICBjcmVkZW50aWFsczogJ3NhbWUtb3JpZ2luJyxcbiAgICAgICAgICAgIG1ldGhvZDogJ3Bvc3QnLFxuICAgICAgICAgICAgYm9keTogZGF0YVxuICAgICAgICB9KS50aGVuKChyZXNwb25zZSkgPT4geyB0aGlzLnJhdyA9IHJlc3BvbnNlOyByZXR1cm4gcmVzcG9uc2U7IH0pXG4gICAgICAgICAgICAudGhlbihwYXJzZVN0YXR1cylcbiAgICAgICAgICAgIC50aGVuKHBhcnNlSlNPTilcbiAgICAgICAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gdGhpcy5yZXNwb25zZShyZXNwb25zZSkpXG4gICAgICAgICAgICAudGhlbigocmVzcG9uc2UpID0+IGNhbGxiYWNrKHJlc3BvbnNlLCB0aGlzLnJhdykpXG4gICAgICAgICAgICAudGhlbigocmVzcG9uc2UpID0+IHRoaXMuZW1pdCgnZmV0Y2hlZCcsIHRoaXMucGF5bG9hZCwgdGhpcy5yYXcsIHRoaXMpKVxuICAgICAgICAgICAgLmNhdGNoKHVzZXJGZWVkYmFja0Vycm9yKTtcbiAgICB9XG5cbiAgICByZXNwb25zZShyZXNwb25zZSkge1xuICAgICAgICB0aGlzLnBheWxvYWQgPSByZXNwb25zZTtcblxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfVxufVxuXG5leHBvcnQgbGV0IEluc3RhbmNlID0gbmV3IEdQTSgpO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./app/utils/gpm.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ GPM),\n/* harmony export */ \"Instance\": () => (/* binding */ Instance)\n/* harmony export */ });\n/* harmony import */ var _response__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./response */ \"./app/utils/response.js\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! grav-config */ \"grav-config\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(grav_config__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! events */ \"./node_modules/events/events.js\");\n/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(events__WEBPACK_IMPORTED_MODULE_2__);\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\nvar GPM = /*#__PURE__*/function (_EventEmitter) {\n _inherits(GPM, _EventEmitter);\n\n var _super = _createSuper(GPM);\n\n function GPM() {\n var _this;\n\n var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'getUpdates';\n\n _classCallCheck(this, GPM);\n\n _this = _super.call(this);\n _this.payload = {};\n _this.raw = {};\n _this.action = action;\n return _this;\n }\n\n _createClass(GPM, [{\n key: \"setPayload\",\n value: function setPayload() {\n var payload = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n this.payload = payload;\n this.emit('payload', payload);\n return this;\n }\n }, {\n key: \"setAction\",\n value: function setAction() {\n var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'getUpdates';\n this.action = action;\n this.emit('action', action);\n return this;\n }\n }, {\n key: \"fetch\",\n value: function (_fetch) {\n function fetch() {\n return _fetch.apply(this, arguments);\n }\n\n fetch.toString = function () {\n return _fetch.toString();\n };\n\n return fetch;\n }(function () {\n var _this2 = this;\n\n var callback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {\n return true;\n };\n var flush = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var data = new FormData();\n data.append('admin-nonce', grav_config__WEBPACK_IMPORTED_MODULE_1__.config.admin_nonce);\n\n if (flush) {\n data.append('flush', true);\n }\n\n this.emit('fetching', this);\n fetch(\"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.base_url_relative, \"/update.json/task\").concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.param_sep, \"getUpdates\"), {\n credentials: 'same-origin',\n method: 'post',\n body: data\n }).then(function (response) {\n _this2.raw = response;\n return response;\n }).then(_response__WEBPACK_IMPORTED_MODULE_0__.parseStatus).then(_response__WEBPACK_IMPORTED_MODULE_0__.parseJSON).then(function (response) {\n return _this2.response(response);\n }).then(function (response) {\n return callback(response, _this2.raw);\n }).then(function (response) {\n return _this2.emit('fetched', _this2.payload, _this2.raw, _this2);\n })[\"catch\"](_response__WEBPACK_IMPORTED_MODULE_0__.userFeedbackError);\n })\n }, {\n key: \"response\",\n value: function response(_response) {\n this.payload = _response;\n return _response;\n }\n }]);\n\n return GPM;\n}((events__WEBPACK_IMPORTED_MODULE_2___default()));\n\n\nvar Instance = new GPM();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL3V0aWxzL2dwbS5qcz83OWI2Il0sIm5hbWVzIjpbIkdQTSIsImFjdGlvbiIsInBheWxvYWQiLCJyYXciLCJlbWl0IiwiY2FsbGJhY2siLCJmbHVzaCIsImRhdGEiLCJGb3JtRGF0YSIsImFwcGVuZCIsImNvbmZpZyIsImZldGNoIiwiY3JlZGVudGlhbHMiLCJtZXRob2QiLCJib2R5IiwidGhlbiIsInJlc3BvbnNlIiwicGFyc2VTdGF0dXMiLCJwYXJzZUpTT04iLCJ1c2VyRmVlZGJhY2tFcnJvciIsIkV2ZW50RW1pdHRlciIsIkluc3RhbmNlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTs7SUFFcUJBLEc7Ozs7O0FBQ2pCLGlCQUFtQztBQUFBOztBQUFBLFFBQXZCQyxNQUF1Qix1RUFBZCxZQUFjOztBQUFBOztBQUMvQjtBQUNBLFVBQUtDLE9BQUwsR0FBZSxFQUFmO0FBQ0EsVUFBS0MsR0FBTCxHQUFXLEVBQVg7QUFDQSxVQUFLRixNQUFMLEdBQWNBLE1BQWQ7QUFKK0I7QUFLbEM7Ozs7V0FFRCxzQkFBeUI7QUFBQSxVQUFkQyxPQUFjLHVFQUFKLEVBQUk7QUFDckIsV0FBS0EsT0FBTCxHQUFlQSxPQUFmO0FBQ0EsV0FBS0UsSUFBTCxDQUFVLFNBQVYsRUFBcUJGLE9BQXJCO0FBRUEsYUFBTyxJQUFQO0FBQ0g7OztXQUVELHFCQUFpQztBQUFBLFVBQXZCRCxNQUF1Qix1RUFBZCxZQUFjO0FBQzdCLFdBQUtBLE1BQUwsR0FBY0EsTUFBZDtBQUNBLFdBQUtHLElBQUwsQ0FBVSxRQUFWLEVBQW9CSCxNQUFwQjtBQUVBLGFBQU8sSUFBUDtBQUNIOzs7Ozs7Ozs7Ozs7O01BRUQsWUFBNEM7QUFBQTs7QUFBQSxVQUF0Q0ksUUFBc0MsdUVBQTNCO0FBQUEsZUFBTSxJQUFOO0FBQUEsT0FBMkI7QUFBQSxVQUFmQyxLQUFlLHVFQUFQLEtBQU87QUFDeEMsVUFBSUMsSUFBSSxHQUFHLElBQUlDLFFBQUosRUFBWDtBQUNBRCxVQUFJLENBQUNFLE1BQUwsQ0FBWSxhQUFaLEVBQTJCQywyREFBM0I7O0FBRUEsVUFBSUosS0FBSixFQUFXO0FBQ1BDLFlBQUksQ0FBQ0UsTUFBTCxDQUFZLE9BQVosRUFBcUIsSUFBckI7QUFDSDs7QUFFRCxXQUFLTCxJQUFMLENBQVUsVUFBVixFQUFzQixJQUF0QjtBQUVBTyxXQUFLLFdBQUlELGlFQUFKLDhCQUFnREEseURBQWhELGlCQUE4RTtBQUMvRUUsbUJBQVcsRUFBRSxhQURrRTtBQUUvRUMsY0FBTSxFQUFFLE1BRnVFO0FBRy9FQyxZQUFJLEVBQUVQO0FBSHlFLE9BQTlFLENBQUwsQ0FJR1EsSUFKSCxDQUlRLFVBQUNDLFFBQUQsRUFBYztBQUFFLGNBQUksQ0FBQ2IsR0FBTCxHQUFXYSxRQUFYO0FBQXFCLGVBQU9BLFFBQVA7QUFBa0IsT0FKL0QsRUFLS0QsSUFMTCxDQUtVRSxrREFMVixFQU1LRixJQU5MLENBTVVHLGdEQU5WLEVBT0tILElBUEwsQ0FPVSxVQUFDQyxRQUFEO0FBQUEsZUFBYyxNQUFJLENBQUNBLFFBQUwsQ0FBY0EsUUFBZCxDQUFkO0FBQUEsT0FQVixFQVFLRCxJQVJMLENBUVUsVUFBQ0MsUUFBRDtBQUFBLGVBQWNYLFFBQVEsQ0FBQ1csUUFBRCxFQUFXLE1BQUksQ0FBQ2IsR0FBaEIsQ0FBdEI7QUFBQSxPQVJWLEVBU0tZLElBVEwsQ0FTVSxVQUFDQyxRQUFEO0FBQUEsZUFBYyxNQUFJLENBQUNaLElBQUwsQ0FBVSxTQUFWLEVBQXFCLE1BQUksQ0FBQ0YsT0FBMUIsRUFBbUMsTUFBSSxDQUFDQyxHQUF4QyxFQUE2QyxNQUE3QyxDQUFkO0FBQUEsT0FUVixXQVVXZ0Isd0RBVlg7QUFXSCxLOzs7V0FFRCxrQkFBU0gsU0FBVCxFQUFtQjtBQUNmLFdBQUtkLE9BQUwsR0FBZWMsU0FBZjtBQUVBLGFBQU9BLFNBQVA7QUFDSDs7OztFQWpENEJJLCtDOzs7QUFvRDFCLElBQUlDLFFBQVEsR0FBRyxJQUFJckIsR0FBSixFQUFmIiwiZmlsZSI6Ii4vYXBwL3V0aWxzL2dwbS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHBhcnNlSlNPTiwgcGFyc2VTdGF0dXMsIHVzZXJGZWVkYmFja0Vycm9yIH0gZnJvbSAnLi9yZXNwb25zZSc7XG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICdncmF2LWNvbmZpZyc7XG5pbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gJ2V2ZW50cyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdQTSBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gICAgY29uc3RydWN0b3IoYWN0aW9uID0gJ2dldFVwZGF0ZXMnKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMucGF5bG9hZCA9IHt9O1xuICAgICAgICB0aGlzLnJhdyA9IHt9O1xuICAgICAgICB0aGlzLmFjdGlvbiA9IGFjdGlvbjtcbiAgICB9XG5cbiAgICBzZXRQYXlsb2FkKHBheWxvYWQgPSB7fSkge1xuICAgICAgICB0aGlzLnBheWxvYWQgPSBwYXlsb2FkO1xuICAgICAgICB0aGlzLmVtaXQoJ3BheWxvYWQnLCBwYXlsb2FkKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBzZXRBY3Rpb24oYWN0aW9uID0gJ2dldFVwZGF0ZXMnKSB7XG4gICAgICAgIHRoaXMuYWN0aW9uID0gYWN0aW9uO1xuICAgICAgICB0aGlzLmVtaXQoJ2FjdGlvbicsIGFjdGlvbik7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZmV0Y2goY2FsbGJhY2sgPSAoKSA9PiB0cnVlLCBmbHVzaCA9IGZhbHNlKSB7XG4gICAgICAgIGxldCBkYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICAgIGRhdGEuYXBwZW5kKCdhZG1pbi1ub25jZScsIGNvbmZpZy5hZG1pbl9ub25jZSk7XG5cbiAgICAgICAgaWYgKGZsdXNoKSB7XG4gICAgICAgICAgICBkYXRhLmFwcGVuZCgnZmx1c2gnLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZW1pdCgnZmV0Y2hpbmcnLCB0aGlzKTtcblxuICAgICAgICBmZXRjaChgJHtjb25maWcuYmFzZV91cmxfcmVsYXRpdmV9L3VwZGF0ZS5qc29uL3Rhc2ske2NvbmZpZy5wYXJhbV9zZXB9Z2V0VXBkYXRlc2AsIHtcbiAgICAgICAgICAgIGNyZWRlbnRpYWxzOiAnc2FtZS1vcmlnaW4nLFxuICAgICAgICAgICAgbWV0aG9kOiAncG9zdCcsXG4gICAgICAgICAgICBib2R5OiBkYXRhXG4gICAgICAgIH0pLnRoZW4oKHJlc3BvbnNlKSA9PiB7IHRoaXMucmF3ID0gcmVzcG9uc2U7IHJldHVybiByZXNwb25zZTsgfSlcbiAgICAgICAgICAgIC50aGVuKHBhcnNlU3RhdHVzKVxuICAgICAgICAgICAgLnRoZW4ocGFyc2VKU09OKVxuICAgICAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB0aGlzLnJlc3BvbnNlKHJlc3BvbnNlKSlcbiAgICAgICAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gY2FsbGJhY2socmVzcG9uc2UsIHRoaXMucmF3KSlcbiAgICAgICAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gdGhpcy5lbWl0KCdmZXRjaGVkJywgdGhpcy5wYXlsb2FkLCB0aGlzLnJhdywgdGhpcykpXG4gICAgICAgICAgICAuY2F0Y2godXNlckZlZWRiYWNrRXJyb3IpO1xuICAgIH1cblxuICAgIHJlc3BvbnNlKHJlc3BvbnNlKSB7XG4gICAgICAgIHRoaXMucGF5bG9hZCA9IHJlc3BvbnNlO1xuXG4gICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9XG59XG5cbmV4cG9ydCBsZXQgSW5zdGFuY2UgPSBuZXcgR1BNKCk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./app/utils/gpm.js\n"); /***/ }), /***/ "./app/utils/jquery-utils.js": -/*!***********************************!* +/*!***********************************!*\ !*** ./app/utils/jquery-utils.js ***! \***********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { @@ -716,40 +727,40 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var jque /***/ }), /***/ "./app/utils/keepalive.js": -/*!********************************!* +/*!********************************!*\ !*** ./app/utils/keepalive.js ***! \********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => __WEBPACK_DEFAULT_EXPORT__\n/* harmony export */ });\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! grav-config */ \"grav-config\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(grav_config__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _response__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./response */ \"./app/utils/response.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\nvar MAX_SAFE_DELAY = 2147483647;\n\nvar KeepAlive = /*#__PURE__*/function () {\n function KeepAlive() {\n _classCallCheck(this, KeepAlive);\n\n this.active = false;\n }\n\n _createClass(KeepAlive, [{\n key: \"start\",\n value: function start() {\n var _this = this;\n\n var timeout = grav_config__WEBPACK_IMPORTED_MODULE_0__.config.admin_timeout / 1.5 * 1000;\n this.timer = setInterval(function () {\n return _this.fetch();\n }, Math.min(timeout, MAX_SAFE_DELAY));\n this.active = true;\n }\n }, {\n key: \"stop\",\n value: function stop() {\n clearInterval(this.timer);\n this.active = false;\n }\n }, {\n key: \"fetch\",\n value: function (_fetch) {\n function fetch() {\n return _fetch.apply(this, arguments);\n }\n\n fetch.toString = function () {\n return _fetch.toString();\n };\n\n return fetch;\n }(function () {\n var data = new FormData();\n data.append('admin-nonce', grav_config__WEBPACK_IMPORTED_MODULE_0__.config.admin_nonce);\n fetch(\"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_0__.config.base_url_relative, \"/task\").concat(grav_config__WEBPACK_IMPORTED_MODULE_0__.config.param_sep, \"keepAlive\"), {\n credentials: 'same-origin',\n method: 'post',\n body: data\n })[\"catch\"](_response__WEBPACK_IMPORTED_MODULE_1__.userFeedbackError);\n })\n }]);\n\n return KeepAlive;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (new KeepAlive());//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL3V0aWxzL2tlZXBhbGl2ZS5qcz9jNWNhIl0sIm5hbWVzIjpbIk1BWF9TQUZFX0RFTEFZIiwiS2VlcEFsaXZlIiwiYWN0aXZlIiwidGltZW91dCIsImNvbmZpZyIsInRpbWVyIiwic2V0SW50ZXJ2YWwiLCJmZXRjaCIsIk1hdGgiLCJtaW4iLCJjbGVhckludGVydmFsIiwiZGF0YSIsIkZvcm1EYXRhIiwiYXBwZW5kIiwiY3JlZGVudGlhbHMiLCJtZXRob2QiLCJib2R5IiwidXNlckZlZWRiYWNrRXJyb3IiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBRUEsSUFBTUEsY0FBYyxHQUFHLFVBQXZCOztJQUVNQyxTO0FBQ0YsdUJBQWM7QUFBQTs7QUFDVixTQUFLQyxNQUFMLEdBQWMsS0FBZDtBQUNIOzs7OzRCQUVPO0FBQUE7O0FBQ0osVUFBSUMsT0FBTyxHQUFHQyw2REFBQSxHQUF1QixHQUF2QixHQUE2QixJQUEzQztBQUNBLFdBQUtDLEtBQUwsR0FBYUMsV0FBVyxDQUFDO0FBQUEsZUFBTSxLQUFJLENBQUNDLEtBQUwsRUFBTjtBQUFBLE9BQUQsRUFBcUJDLElBQUksQ0FBQ0MsR0FBTCxDQUFTTixPQUFULEVBQWtCSCxjQUFsQixDQUFyQixDQUF4QjtBQUNBLFdBQUtFLE1BQUwsR0FBYyxJQUFkO0FBQ0g7OzsyQkFFTTtBQUNIUSxtQkFBYSxDQUFDLEtBQUtMLEtBQU4sQ0FBYjtBQUNBLFdBQUtILE1BQUwsR0FBYyxLQUFkO0FBQ0g7Ozs7Ozs7Ozs7Ozs7a0JBRU87QUFDSixVQUFJUyxJQUFJLEdBQUcsSUFBSUMsUUFBSixFQUFYO0FBQ0FELFVBQUksQ0FBQ0UsTUFBTCxDQUFZLGFBQVosRUFBMkJULDJEQUEzQjtBQUVBRyxXQUFLLFdBQUlILGlFQUFKLGtCQUFvQ0EseURBQXBDLGdCQUFpRTtBQUNsRVUsbUJBQVcsRUFBRSxhQURxRDtBQUVsRUMsY0FBTSxFQUFFLE1BRjBEO0FBR2xFQyxZQUFJLEVBQUVMO0FBSDRELE9BQWpFLENBQUwsVUFJU00sd0RBSlQ7QUFLSCxLOzs7Ozs7QUFHTCxpRUFBZSxJQUFJaEIsU0FBSixFQUFmIiwiZmlsZSI6Ii4vYXBwL3V0aWxzL2tlZXBhbGl2ZS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvbmZpZyB9IGZyb20gJ2dyYXYtY29uZmlnJztcbmltcG9ydCB7IHVzZXJGZWVkYmFja0Vycm9yIH0gZnJvbSAnLi9yZXNwb25zZSc7XG5cbmNvbnN0IE1BWF9TQUZFX0RFTEFZID0gMjE0NzQ4MzY0NztcblxuY2xhc3MgS2VlcEFsaXZlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5hY3RpdmUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBzdGFydCgpIHtcbiAgICAgICAgbGV0IHRpbWVvdXQgPSBjb25maWcuYWRtaW5fdGltZW91dCAvIDEuNSAqIDEwMDA7XG4gICAgICAgIHRoaXMudGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB0aGlzLmZldGNoKCksIE1hdGgubWluKHRpbWVvdXQsIE1BWF9TQUZFX0RFTEFZKSk7XG4gICAgICAgIHRoaXMuYWN0aXZlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBzdG9wKCkge1xuICAgICAgICBjbGVhckludGVydmFsKHRoaXMudGltZXIpO1xuICAgICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIGZldGNoKCkge1xuICAgICAgICBsZXQgZGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgICBkYXRhLmFwcGVuZCgnYWRtaW4tbm9uY2UnLCBjb25maWcuYWRtaW5fbm9uY2UpO1xuXG4gICAgICAgIGZldGNoKGAke2NvbmZpZy5iYXNlX3VybF9yZWxhdGl2ZX0vdGFzayR7Y29uZmlnLnBhcmFtX3NlcH1rZWVwQWxpdmVgLCB7XG4gICAgICAgICAgICBjcmVkZW50aWFsczogJ3NhbWUtb3JpZ2luJyxcbiAgICAgICAgICAgIG1ldGhvZDogJ3Bvc3QnLFxuICAgICAgICAgICAgYm9keTogZGF0YVxuICAgICAgICB9KS5jYXRjaCh1c2VyRmVlZGJhY2tFcnJvcik7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBuZXcgS2VlcEFsaXZlKCk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./app/utils/keepalive.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! grav-config */ \"grav-config\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(grav_config__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _response__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./response */ \"./app/utils/response.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\nvar MAX_SAFE_DELAY = 2147483647;\n\nvar KeepAlive = /*#__PURE__*/function () {\n function KeepAlive() {\n _classCallCheck(this, KeepAlive);\n\n this.active = false;\n }\n\n _createClass(KeepAlive, [{\n key: \"start\",\n value: function start() {\n var _this = this;\n\n var timeout = grav_config__WEBPACK_IMPORTED_MODULE_0__.config.admin_timeout / 1.5 * 1000;\n this.timer = setInterval(function () {\n return _this.fetch();\n }, Math.min(timeout, MAX_SAFE_DELAY));\n this.active = true;\n }\n }, {\n key: \"stop\",\n value: function stop() {\n clearInterval(this.timer);\n this.active = false;\n }\n }, {\n key: \"fetch\",\n value: function (_fetch) {\n function fetch() {\n return _fetch.apply(this, arguments);\n }\n\n fetch.toString = function () {\n return _fetch.toString();\n };\n\n return fetch;\n }(function () {\n var data = new FormData();\n data.append('admin-nonce', grav_config__WEBPACK_IMPORTED_MODULE_0__.config.admin_nonce);\n fetch(\"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_0__.config.base_url_relative, \"/task\").concat(grav_config__WEBPACK_IMPORTED_MODULE_0__.config.param_sep, \"keepAlive\"), {\n credentials: 'same-origin',\n method: 'post',\n body: data\n })[\"catch\"](_response__WEBPACK_IMPORTED_MODULE_1__.userFeedbackError);\n })\n }]);\n\n return KeepAlive;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (new KeepAlive());//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL3V0aWxzL2tlZXBhbGl2ZS5qcz9jNWNhIl0sIm5hbWVzIjpbIk1BWF9TQUZFX0RFTEFZIiwiS2VlcEFsaXZlIiwiYWN0aXZlIiwidGltZW91dCIsImNvbmZpZyIsInRpbWVyIiwic2V0SW50ZXJ2YWwiLCJmZXRjaCIsIk1hdGgiLCJtaW4iLCJjbGVhckludGVydmFsIiwiZGF0YSIsIkZvcm1EYXRhIiwiYXBwZW5kIiwiY3JlZGVudGlhbHMiLCJtZXRob2QiLCJib2R5IiwidXNlckZlZWRiYWNrRXJyb3IiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBRUEsSUFBTUEsY0FBYyxHQUFHLFVBQXZCOztJQUVNQyxTO0FBQ0YsdUJBQWM7QUFBQTs7QUFDVixTQUFLQyxNQUFMLEdBQWMsS0FBZDtBQUNIOzs7O1dBRUQsaUJBQVE7QUFBQTs7QUFDSixVQUFJQyxPQUFPLEdBQUdDLDZEQUFBLEdBQXVCLEdBQXZCLEdBQTZCLElBQTNDO0FBQ0EsV0FBS0MsS0FBTCxHQUFhQyxXQUFXLENBQUM7QUFBQSxlQUFNLEtBQUksQ0FBQ0MsS0FBTCxFQUFOO0FBQUEsT0FBRCxFQUFxQkMsSUFBSSxDQUFDQyxHQUFMLENBQVNOLE9BQVQsRUFBa0JILGNBQWxCLENBQXJCLENBQXhCO0FBQ0EsV0FBS0UsTUFBTCxHQUFjLElBQWQ7QUFDSDs7O1dBRUQsZ0JBQU87QUFDSFEsbUJBQWEsQ0FBQyxLQUFLTCxLQUFOLENBQWI7QUFDQSxXQUFLSCxNQUFMLEdBQWMsS0FBZDtBQUNIOzs7Ozs7Ozs7Ozs7O01BRUQsWUFBUTtBQUNKLFVBQUlTLElBQUksR0FBRyxJQUFJQyxRQUFKLEVBQVg7QUFDQUQsVUFBSSxDQUFDRSxNQUFMLENBQVksYUFBWixFQUEyQlQsMkRBQTNCO0FBRUFHLFdBQUssV0FBSUgsaUVBQUosa0JBQW9DQSx5REFBcEMsZ0JBQWlFO0FBQ2xFVSxtQkFBVyxFQUFFLGFBRHFEO0FBRWxFQyxjQUFNLEVBQUUsTUFGMEQ7QUFHbEVDLFlBQUksRUFBRUw7QUFINEQsT0FBakUsQ0FBTCxVQUlTTSx3REFKVDtBQUtILEs7Ozs7OztBQUdMLGlFQUFlLElBQUloQixTQUFKLEVBQWYiLCJmaWxlIjoiLi9hcHAvdXRpbHMva2VlcGFsaXZlLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnZ3Jhdi1jb25maWcnO1xuaW1wb3J0IHsgdXNlckZlZWRiYWNrRXJyb3IgfSBmcm9tICcuL3Jlc3BvbnNlJztcblxuY29uc3QgTUFYX1NBRkVfREVMQVkgPSAyMTQ3NDgzNjQ3O1xuXG5jbGFzcyBLZWVwQWxpdmUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIHN0YXJ0KCkge1xuICAgICAgICBsZXQgdGltZW91dCA9IGNvbmZpZy5hZG1pbl90aW1lb3V0IC8gMS41ICogMTAwMDtcbiAgICAgICAgdGhpcy50aW1lciA9IHNldEludGVydmFsKCgpID0+IHRoaXMuZmV0Y2goKSwgTWF0aC5taW4odGltZW91dCwgTUFYX1NBRkVfREVMQVkpKTtcbiAgICAgICAgdGhpcy5hY3RpdmUgPSB0cnVlO1xuICAgIH1cblxuICAgIHN0b3AoKSB7XG4gICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy50aW1lcik7XG4gICAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgZmV0Y2goKSB7XG4gICAgICAgIGxldCBkYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICAgIGRhdGEuYXBwZW5kKCdhZG1pbi1ub25jZScsIGNvbmZpZy5hZG1pbl9ub25jZSk7XG5cbiAgICAgICAgZmV0Y2goYCR7Y29uZmlnLmJhc2VfdXJsX3JlbGF0aXZlfS90YXNrJHtjb25maWcucGFyYW1fc2VwfWtlZXBBbGl2ZWAsIHtcbiAgICAgICAgICAgIGNyZWRlbnRpYWxzOiAnc2FtZS1vcmlnaW4nLFxuICAgICAgICAgICAgbWV0aG9kOiAncG9zdCcsXG4gICAgICAgICAgICBib2R5OiBkYXRhXG4gICAgICAgIH0pLmNhdGNoKHVzZXJGZWVkYmFja0Vycm9yKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBLZWVwQWxpdmUoKTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./app/utils/keepalive.js\n"); /***/ }), /***/ "./app/utils/offline.js": -/*!******************************!* +/*!******************************!*\ !*** ./app/utils/offline.js ***! \******************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => __WEBPACK_DEFAULT_EXPORT__\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils_offline__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/offline */ \"./app/utils/offline.js\");\n\n\nvar offlineElement = jquery__WEBPACK_IMPORTED_MODULE_0___default()('#offline-status');\njquery__WEBPACK_IMPORTED_MODULE_0___default()(window).on('offline', function () {\n offlineElement.slideDown();\n});\njquery__WEBPACK_IMPORTED_MODULE_0___default()(window).on('online', function () {\n offlineElement.slideUp();\n});\njquery__WEBPACK_IMPORTED_MODULE_0___default()(document).ready(function () {\n if (!_utils_offline__WEBPACK_IMPORTED_MODULE_1__.default) {\n offlineElement.slideDown();\n }\n}); // assume online if can't check\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (typeof __webpack_require__.g.navigator.onLine !== 'undefined' ? __webpack_require__.g.navigator.onLine : true);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL3V0aWxzL29mZmxpbmUuanM/ODc0ZSJdLCJuYW1lcyI6WyJvZmZsaW5lRWxlbWVudCIsIiQiLCJ3aW5kb3ciLCJvbiIsInNsaWRlRG93biIsInNsaWRlVXAiLCJkb2N1bWVudCIsInJlYWR5IiwiaXNPbmxpbmUiLCJnbG9iYWwiLCJuYXZpZ2F0b3IiLCJvbkxpbmUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBRUEsSUFBTUEsY0FBYyxHQUFHQyw2Q0FBQyxDQUFDLGlCQUFELENBQXhCO0FBRUFBLDZDQUFDLENBQUNDLE1BQUQsQ0FBRCxDQUFVQyxFQUFWLENBQWEsU0FBYixFQUF3QixZQUFNO0FBQzFCSCxnQkFBYyxDQUFDSSxTQUFmO0FBQ0gsQ0FGRDtBQUlBSCw2Q0FBQyxDQUFDQyxNQUFELENBQUQsQ0FBVUMsRUFBVixDQUFhLFFBQWIsRUFBdUIsWUFBTTtBQUN6QkgsZ0JBQWMsQ0FBQ0ssT0FBZjtBQUNILENBRkQ7QUFJQUosNkNBQUMsQ0FBQ0ssUUFBRCxDQUFELENBQVlDLEtBQVosQ0FBa0IsWUFBTTtBQUNwQixNQUFJLENBQUNDLG1EQUFMLEVBQWU7QUFDWFIsa0JBQWMsQ0FBQ0ksU0FBZjtBQUNIO0FBQ0osQ0FKRCxFLENBTUE7O0FBQ0EsaUVBQWUsT0FBT0sscUJBQU0sQ0FBQ0MsU0FBUCxDQUFpQkMsTUFBeEIsS0FBbUMsV0FBbkMsR0FBaURGLHFCQUFNLENBQUNDLFNBQVAsQ0FBaUJDLE1BQWxFLEdBQTJFLElBQTFGIiwiZmlsZSI6Ii4vYXBwL3V0aWxzL29mZmxpbmUuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IGlzT25saW5lIGZyb20gJy4uL3V0aWxzL29mZmxpbmUnO1xuXG5jb25zdCBvZmZsaW5lRWxlbWVudCA9ICQoJyNvZmZsaW5lLXN0YXR1cycpO1xuXG4kKHdpbmRvdykub24oJ29mZmxpbmUnLCAoKSA9PiB7XG4gICAgb2ZmbGluZUVsZW1lbnQuc2xpZGVEb3duKCk7XG59KTtcblxuJCh3aW5kb3cpLm9uKCdvbmxpbmUnLCAoKSA9PiB7XG4gICAgb2ZmbGluZUVsZW1lbnQuc2xpZGVVcCgpO1xufSk7XG5cbiQoZG9jdW1lbnQpLnJlYWR5KCgpID0+IHtcbiAgICBpZiAoIWlzT25saW5lKSB7XG4gICAgICAgIG9mZmxpbmVFbGVtZW50LnNsaWRlRG93bigpO1xuICAgIH1cbn0pO1xuXG4vLyBhc3N1bWUgb25saW5lIGlmIGNhbid0IGNoZWNrXG5leHBvcnQgZGVmYXVsdCB0eXBlb2YgZ2xvYmFsLm5hdmlnYXRvci5vbkxpbmUgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsLm5hdmlnYXRvci5vbkxpbmUgOiB0cnVlO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./app/utils/offline.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils_offline__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/offline */ \"./app/utils/offline.js\");\n\n\nvar offlineElement = jquery__WEBPACK_IMPORTED_MODULE_0___default()('#offline-status');\njquery__WEBPACK_IMPORTED_MODULE_0___default()(window).on('offline', function () {\n offlineElement.slideDown();\n});\njquery__WEBPACK_IMPORTED_MODULE_0___default()(window).on('online', function () {\n offlineElement.slideUp();\n});\njquery__WEBPACK_IMPORTED_MODULE_0___default()(document).ready(function () {\n if (!_utils_offline__WEBPACK_IMPORTED_MODULE_1__.default) {\n offlineElement.slideDown();\n }\n}); // assume online if can't check\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (typeof __webpack_require__.g.navigator.onLine !== 'undefined' ? __webpack_require__.g.navigator.onLine : true);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL3V0aWxzL29mZmxpbmUuanM/ODc0ZSJdLCJuYW1lcyI6WyJvZmZsaW5lRWxlbWVudCIsIiQiLCJ3aW5kb3ciLCJvbiIsInNsaWRlRG93biIsInNsaWRlVXAiLCJkb2N1bWVudCIsInJlYWR5IiwiaXNPbmxpbmUiLCJnbG9iYWwiLCJuYXZpZ2F0b3IiLCJvbkxpbmUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBRUEsSUFBTUEsY0FBYyxHQUFHQyw2Q0FBQyxDQUFDLGlCQUFELENBQXhCO0FBRUFBLDZDQUFDLENBQUNDLE1BQUQsQ0FBRCxDQUFVQyxFQUFWLENBQWEsU0FBYixFQUF3QixZQUFNO0FBQzFCSCxnQkFBYyxDQUFDSSxTQUFmO0FBQ0gsQ0FGRDtBQUlBSCw2Q0FBQyxDQUFDQyxNQUFELENBQUQsQ0FBVUMsRUFBVixDQUFhLFFBQWIsRUFBdUIsWUFBTTtBQUN6QkgsZ0JBQWMsQ0FBQ0ssT0FBZjtBQUNILENBRkQ7QUFJQUosNkNBQUMsQ0FBQ0ssUUFBRCxDQUFELENBQVlDLEtBQVosQ0FBa0IsWUFBTTtBQUNwQixNQUFJLENBQUNDLG1EQUFMLEVBQWU7QUFDWFIsa0JBQWMsQ0FBQ0ksU0FBZjtBQUNIO0FBQ0osQ0FKRCxFLENBTUE7O0FBQ0EsaUVBQWUsT0FBT0sscUJBQU0sQ0FBQ0MsU0FBUCxDQUFpQkMsTUFBeEIsS0FBbUMsV0FBbkMsR0FBaURGLHFCQUFNLENBQUNDLFNBQVAsQ0FBaUJDLE1BQWxFLEdBQTJFLElBQTFGIiwiZmlsZSI6Ii4vYXBwL3V0aWxzL29mZmxpbmUuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IGlzT25saW5lIGZyb20gJy4uL3V0aWxzL29mZmxpbmUnO1xuXG5jb25zdCBvZmZsaW5lRWxlbWVudCA9ICQoJyNvZmZsaW5lLXN0YXR1cycpO1xuXG4kKHdpbmRvdykub24oJ29mZmxpbmUnLCAoKSA9PiB7XG4gICAgb2ZmbGluZUVsZW1lbnQuc2xpZGVEb3duKCk7XG59KTtcblxuJCh3aW5kb3cpLm9uKCdvbmxpbmUnLCAoKSA9PiB7XG4gICAgb2ZmbGluZUVsZW1lbnQuc2xpZGVVcCgpO1xufSk7XG5cbiQoZG9jdW1lbnQpLnJlYWR5KCgpID0+IHtcbiAgICBpZiAoIWlzT25saW5lKSB7XG4gICAgICAgIG9mZmxpbmVFbGVtZW50LnNsaWRlRG93bigpO1xuICAgIH1cbn0pO1xuXG4vLyBhc3N1bWUgb25saW5lIGlmIGNhbid0IGNoZWNrXG5leHBvcnQgZGVmYXVsdCB0eXBlb2YgZ2xvYmFsLm5hdmlnYXRvci5vbkxpbmUgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsLm5hdmlnYXRvci5vbkxpbmUgOiB0cnVlO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./app/utils/offline.js\n"); /***/ }), /***/ "./app/utils/packages.js": -/*!*******************************!* +/*!*******************************!*\ !*** ./app/utils/packages.js ***! \*******************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => __WEBPACK_DEFAULT_EXPORT__\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! grav-config */ \"grav-config\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(grav_config__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _utils_request__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/request */ \"./app/utils/request.js\");\n/* harmony import */ var _utils_gpm__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/gpm */ \"./app/utils/gpm.js\");\n/* harmony import */ var es6_promise__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! es6-promise */ \"./node_modules/es6-promise/dist/es6-promise.js\");\n/* harmony import */ var es6_promise__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(es6_promise__WEBPACK_IMPORTED_MODULE_4__);\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\n\n\n\nvar Sorter = /*#__PURE__*/function () {\n function Sorter() {\n _classCallCheck(this, Sorter);\n }\n\n _createClass(Sorter, [{\n key: \"getElements\",\n value: function getElements(elements, container) {\n this.elements = elements || jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-gpm-plugin], [data-gpm-theme]');\n this.container = container || jquery__WEBPACK_IMPORTED_MODULE_0___default()('.gpm-plugins > table > tbody, .gpm-themes > .themes.card-row');\n return this.elements;\n }\n }, {\n key: \"byCommon\",\n value: function byCommon() {\n var direction = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'asc';\n var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var elements = this.getElements().sort(function (a, b) {\n var A = jquery__WEBPACK_IMPORTED_MODULE_0___default()(a).data(data).toString().toLowerCase();\n var B = jquery__WEBPACK_IMPORTED_MODULE_0___default()(b).data(data).toString().toLowerCase();\n return Sorter.sort(A, B, direction);\n });\n return elements.appendTo(this.container);\n }\n }, {\n key: \"byName\",\n value: function byName() {\n var direction = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'asc';\n var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'gpm-name';\n return this.byCommon(direction, data);\n }\n }, {\n key: \"byAuthor\",\n value: function byAuthor() {\n var direction = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'asc';\n var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'gpm-author';\n return this.byCommon(direction, data);\n }\n }, {\n key: \"byOfficial\",\n value: function byOfficial() {\n var direction = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'asc';\n var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'gpm-official';\n return this.byCommon(direction, data);\n }\n }, {\n key: \"byReleaseDate\",\n value: function byReleaseDate() {\n var direction = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'asc';\n var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'gpm-release-date';\n var elements = this.getElements().sort(function (a, b) {\n var A = new Date(jquery__WEBPACK_IMPORTED_MODULE_0___default()(a).data(data)).getTime();\n var B = new Date(jquery__WEBPACK_IMPORTED_MODULE_0___default()(b).data(data)).getTime();\n return Sorter.sort(A, B, direction === 'asc' ? 'desc' : 'asc');\n });\n elements.appendTo(this.container);\n }\n }, {\n key: \"byUpdatable\",\n value: function byUpdatable() {\n var direction = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'asc';\n var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'gpm-updatable';\n return this.byCommon(direction, data);\n }\n }, {\n key: \"byEnabled\",\n value: function byEnabled() {\n var direction = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'asc';\n var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'gpm-enabled';\n return this.byCommon(direction, data);\n }\n }, {\n key: \"byTesting\",\n value: function byTesting() {\n var direction = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'asc';\n var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'gpm-testing';\n return this.byCommon(direction, data);\n }\n }], [{\n key: \"sort\",\n value: function sort(A, B) {\n var direction = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'asc';\n\n if (A > B) {\n return direction === 'asc' ? 1 : -1;\n }\n\n if (A < B) {\n return direction === 'asc' ? -1 : 1;\n }\n\n return 0;\n }\n }]);\n\n return Sorter;\n}();\n\nvar Packages = /*#__PURE__*/function () {\n function Packages() {\n _classCallCheck(this, Packages);\n\n this.Sort = new Sorter();\n }\n\n _createClass(Packages, [{\n key: \"addDependenciesToList\",\n value: function addDependenciesToList(dependencies) {\n var slug = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n dependencies.forEach(function (dependency) {\n Packages.addDependencyToList('plugin', dependency.name || dependency, slug);\n });\n }\n }, {\n key: \"removePackage\",\n value: function removePackage(type, slug) {\n var _this = this;\n\n var url = Packages.getRemovePackageUrl(type);\n (0,_utils_request__WEBPACK_IMPORTED_MODULE_2__.default)(url, {\n method: 'post',\n body: {\n \"package\": slug\n }\n }, function (response) {\n if (response.status === 'success') {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.remove-package-confirm').addClass('hidden');\n\n if (response.dependencies && response.dependencies.length > 0) {\n _this.addDependenciesToList(response.dependencies);\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.remove-package-dependencies').removeClass('hidden');\n } else {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.remove-package-done').removeClass('hidden');\n } // The package was removed. When the modal closes, move to the packages list\n\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(document).on('closing', '[data-remodal-id=\"remove-package\"]', function () {\n Packages.getBackToList(type);\n });\n } else {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.remove-package-confirm').addClass('hidden');\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.remove-package-error').removeClass('hidden');\n }\n });\n }\n }, {\n key: \"reinstallPackage\",\n value: function reinstallPackage(type, slug, package_name, current_version) {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.button-bar button').addClass('hidden');\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.button-bar .spinning-wheel').removeClass('hidden');\n var url = Packages.getReinstallPackageUrl(type);\n (0,_utils_request__WEBPACK_IMPORTED_MODULE_2__.default)(url, {\n method: 'post',\n body: {\n slug: slug,\n type: type,\n package_name: package_name,\n current_version: current_version\n }\n }, function (response) {\n if (response.status === 'success') {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.reinstall-package-confirm').addClass('hidden');\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.reinstall-package-done').removeClass('hidden');\n } else {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.reinstall-package-confirm').addClass('hidden');\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.reinstall-package-error').removeClass('hidden');\n }\n\n window.location.reload();\n });\n }\n }, {\n key: \"removeDependency\",\n value: function removeDependency(type, slug, button) {\n var _this2 = this;\n\n var url = Packages.getRemovePackageUrl(type);\n (0,_utils_request__WEBPACK_IMPORTED_MODULE_2__.default)(url, {\n method: 'post',\n body: {\n \"package\": slug\n }\n }, function (response) {\n if (response.status === 'success') {\n button.removeClass('button');\n button.replaceWith(jquery__WEBPACK_IMPORTED_MODULE_0___default()('Removed successfully'));\n\n if (response.dependencies && response.dependencies.length > 0) {\n _this2.addDependenciesToList(response.dependencies, slug);\n }\n }\n });\n }\n }, {\n key: \"getPackagesDependencies\",\n value: function getPackagesDependencies(type, slugs, finishedLoadingCallback) {\n var url = Packages.getGetPackagesDependenciesUrl(type);\n (0,_utils_request__WEBPACK_IMPORTED_MODULE_2__.default)(url, {\n method: 'post',\n body: {\n packages: slugs\n }\n }, function (response) {\n finishedLoadingCallback();\n\n if (response.status === 'success') {\n if (response.dependencies) {\n var hasDependencies = false;\n\n for (var dependency in response.dependencies) {\n if (response.dependencies.hasOwnProperty(dependency)) {\n if (dependency === 'grav') {\n continue;\n }\n\n hasDependencies = true;\n var dependencyName = dependency;\n var action = response.dependencies[dependency];\n Packages.addNeededDependencyToList(action, dependencyName);\n }\n }\n\n if (hasDependencies) {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal] .install-dependencies-package-container').removeClass('hidden');\n } else {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal] .install-package-container').removeClass('hidden');\n }\n } else {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal] .install-package-container').removeClass('hidden');\n }\n } else {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal] .install-package-error').removeClass('hidden');\n }\n });\n }\n }, {\n key: \"installDependenciesOfPackages\",\n value: function installDependenciesOfPackages(type, slugs, callbackSuccess, callbackError) {\n var url = Packages.getInstallDependenciesOfPackagesUrl(type);\n (0,_utils_request__WEBPACK_IMPORTED_MODULE_2__.default)(url, {\n method: 'post',\n body: {\n packages: slugs\n }\n }, callbackSuccess);\n }\n }, {\n key: \"installPackages\",\n value: function installPackages(type, slugs, callbackSuccess) {\n var url = Packages.getInstallPackageUrl(type);\n es6_promise__WEBPACK_IMPORTED_MODULE_4__.Promise.all(slugs.map(function (slug) {\n return new es6_promise__WEBPACK_IMPORTED_MODULE_4__.Promise(function (resolve, reject) {\n (0,_utils_request__WEBPACK_IMPORTED_MODULE_2__.default)(url, {\n method: 'post',\n body: {\n \"package\": slug,\n type: type\n }\n }, function (response) {\n resolve(response);\n });\n });\n })).then(callbackSuccess);\n }\n }, {\n key: \"handleGettingPackageDependencies\",\n value: function handleGettingPackageDependencies(type, event) {\n var action = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'update';\n var slugs = Packages.getSlugsFromEvent(event);\n\n if (!slugs) {\n alert('No slug set');\n return;\n } // Cleanup\n\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.packages-names-list').html('');\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.install-dependencies-package-container li').remove();\n slugs.forEach(function (slug) {\n if (action === 'update') {\n var current_version = '';\n var available_version = '';\n var _name = '';\n var resources = _utils_gpm__WEBPACK_IMPORTED_MODULE_3__.Instance.payload.payload.resources;\n\n if (resources.plugins[slug]) {\n available_version = resources.plugins[slug].available;\n current_version = resources.plugins[slug].version;\n _name = resources.plugins[slug].name;\n } else if (resources.themes[slug]) {\n available_version = resources.themes[slug].available;\n current_version = resources.themes[slug].version;\n _name = resources.themes[slug].name;\n }\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.packages-names-list').append(\"
                • \".concat(_name ? _name : slug, \", \").concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.FROM, \" v\").concat(current_version, \" \").concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.TO, \" v\").concat(available_version, \"
                • \"));\n } else {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.packages-names-list').append(\"
                • \".concat(name ? name : slug, \"
                • \"));\n }\n });\n event.preventDefault();\n event.stopPropagation(); // fix mismatching types when sharing install modal between plugins/themes\n\n var query = '[data-packages-modal] [data-theme-action], [data-packages-modal] [data-plugin-action]';\n var data = jquery__WEBPACK_IMPORTED_MODULE_0___default()(query).data('themeAction') || jquery__WEBPACK_IMPORTED_MODULE_0___default()(query).data('pluginAction');\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(query).removeAttr('data-theme-action').removeAttr('data-plugin-action').attr(\"data-\".concat(type, \"-action\"), data); // Restore original state\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal] .loading').removeClass('hidden');\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal] .install-dependencies-package-container').addClass('hidden');\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal] .install-package-container').addClass('hidden');\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal] .installing-dependencies').addClass('hidden');\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal] .installing-package').addClass('hidden');\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal] .installation-complete').addClass('hidden');\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal] .install-package-error').addClass('hidden');\n this.getPackagesDependencies(type, slugs, function () {\n var slugs_string = slugs.join();\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"[data-packages-modal] [data-\".concat(type, \"-action=\\\"install-dependencies-and-package\\\"]\")).attr('data-packages-slugs', slugs_string);\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"[data-packages-modal] [data-\".concat(type, \"-action=\\\"install-package\\\"]\")).attr('data-packages-slugs', slugs_string);\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal] .loading').addClass('hidden');\n });\n }\n }, {\n key: \"handleInstallingDependenciesAndPackage\",\n value: function handleInstallingDependenciesAndPackage(type, event) {\n var _this3 = this;\n\n var slugs = Packages.getSlugsFromEvent(event);\n event.preventDefault();\n event.stopPropagation();\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal] .install-dependencies-package-container').addClass('hidden');\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal] .install-package-container').addClass('hidden');\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal] .installing-dependencies').removeClass('hidden');\n this.installDependenciesOfPackages(type, slugs, function (response) {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal] .installing-dependencies').addClass('hidden');\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal] .installing-package').removeClass('hidden');\n\n _this3.installPackages(type, slugs, function () {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal] .installing-package').addClass('hidden');\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal] .installation-complete').removeClass('hidden');\n\n if (response.status === 'error') {\n var remodal = (jquery__WEBPACK_IMPORTED_MODULE_0___default().remodal.lookup)[jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal]').data('remodal')];\n remodal.close();\n return;\n }\n\n setTimeout(function () {\n if (slugs.length === 1) {\n __webpack_require__.g.location.href = \"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.base_url_relative, \"/\").concat(type, \"s/\").concat(slugs[0]);\n } else {\n __webpack_require__.g.location.href = \"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.base_url_relative, \"/\").concat(type, \"s\");\n }\n }, 1000);\n });\n });\n }\n }, {\n key: \"handleInstallingPackage\",\n value: function handleInstallingPackage(type, event) {\n var slugs = Packages.getSlugsFromEvent(event);\n event.preventDefault();\n event.stopPropagation();\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal] .install-package-container').addClass('hidden');\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal] .installing-package').removeClass('hidden');\n this.installPackages(type, slugs, function (response) {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal] .installing-package').addClass('hidden');\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal] .installation-complete').removeClass('hidden');\n var errors = Array.from(response).filter(function (r) {\n return r.status === 'error';\n });\n\n if (errors && errors.length) {\n var remodal = (jquery__WEBPACK_IMPORTED_MODULE_0___default().remodal.lookup)[jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal].remodal-is-opened').data('remodal')];\n remodal.close();\n return;\n }\n\n if (slugs.length === 1) {\n __webpack_require__.g.location.href = \"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.base_url_relative, \"/\").concat(type, \"s/\").concat(slugs[0]);\n } else {\n __webpack_require__.g.location.href = \"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.base_url_relative, \"/\").concat(type, \"s\");\n }\n });\n }\n }, {\n key: \"handleRemovingPackage\",\n value: function handleRemovingPackage(type, event) {\n var slug = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.target).attr('data-packages-slugs');\n event.preventDefault();\n event.stopPropagation();\n this.removePackage(type, slug);\n }\n }, {\n key: \"handleReinstallPackage\",\n value: function handleReinstallPackage(type, event) {\n var target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.target);\n var slug = target.attr('data-package-slug');\n var package_name = target.attr('data-package-name');\n var current_version = target.attr('data-package-current-version');\n event.preventDefault();\n event.stopPropagation();\n this.reinstallPackage(type, slug, package_name, current_version);\n }\n }, {\n key: \"handleRemovingDependency\",\n value: function handleRemovingDependency(type, event) {\n var slug = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.target).attr('data-dependency-slug');\n var button = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.target);\n event.preventDefault();\n event.stopPropagation();\n this.removeDependency(type, slug, button);\n }\n }], [{\n key: \"getBackToList\",\n value: function getBackToList(type) {\n __webpack_require__.g.location.href = \"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.base_url_relative, \"/\").concat(type, \"s\");\n }\n }, {\n key: \"addDependencyToList\",\n value: function addDependencyToList(type, dependency) {\n var slug = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n\n if (['admin', 'form', 'login', 'email', 'grav'].indexOf(dependency) !== -1) {\n return;\n }\n\n var container = jquery__WEBPACK_IMPORTED_MODULE_0___default()('.package-dependencies-container');\n var text = \"\".concat(dependency, \"
                  Remove\");\n\n if (slug) {\n text += \" (was needed by \".concat(slug, \")\");\n }\n\n container.append(\"
                • \".concat(text, \"
                • \"));\n }\n }, {\n key: \"getTaskUrl\",\n value: function getTaskUrl(type, task) {\n var url = \"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.base_url_relative);\n url += \"/\".concat(type, \"s.json\");\n url += \"/task\".concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.param_sep).concat(task);\n return url;\n }\n }, {\n key: \"getRemovePackageUrl\",\n value: function getRemovePackageUrl(type) {\n return \"\".concat(Packages.getTaskUrl(type, 'removePackage'));\n }\n }, {\n key: \"getReinstallPackageUrl\",\n value: function getReinstallPackageUrl(type) {\n return \"\".concat(Packages.getTaskUrl(type, 'reinstallPackage'));\n }\n }, {\n key: \"getGetPackagesDependenciesUrl\",\n value: function getGetPackagesDependenciesUrl(type) {\n return \"\".concat(Packages.getTaskUrl(type, 'getPackagesDependencies'));\n }\n }, {\n key: \"getInstallDependenciesOfPackagesUrl\",\n value: function getInstallDependenciesOfPackagesUrl(type) {\n return \"\".concat(Packages.getTaskUrl(type, 'installDependenciesOfPackages'));\n }\n }, {\n key: \"getInstallPackageUrl\",\n value: function getInstallPackageUrl(type) {\n return \"\".concat(Packages.getTaskUrl(type, 'installPackage'));\n }\n }, {\n key: \"addNeededDependencyToList\",\n value: function addNeededDependencyToList(action, slug) {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.install-dependencies-package-container .type-' + action).removeClass('hidden');\n var list = jquery__WEBPACK_IMPORTED_MODULE_0___default()('.install-dependencies-package-container .type-' + action + ' ul');\n\n if (action !== 'install') {\n var current_version = '';\n var available_version = '';\n var _name2 = '';\n var resources = _utils_gpm__WEBPACK_IMPORTED_MODULE_3__.Instance.payload.payload.resources;\n\n if (resources.plugins[slug]) {\n available_version = resources.plugins[slug].available;\n current_version = resources.plugins[slug].version;\n _name2 = resources.plugins[slug].name;\n } else if (resources.themes[slug]) {\n available_version = resources.themes[slug].available;\n current_version = resources.themes[slug].version;\n _name2 = resources.themes[slug].name;\n }\n\n list.append(\"
                • \".concat(_name2 ? _name2 : slug, \", \").concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.FROM, \" v\").concat(current_version, \" \").concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.TO, \" v\").concat(available_version, \"
                • \"));\n } else {\n list.append(\"
                • \".concat(name ? name : slug, \"
                • \"));\n }\n }\n }, {\n key: \"getSlugsFromEvent\",\n value: function getSlugsFromEvent(event) {\n var slugs = '';\n\n if (jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.target).is('[data-packages-slugs]')) {\n slugs = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.target).attr('data-packages-slugs');\n } else {\n slugs = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.target).parent('[data-packages-slugs]').attr('data-packages-slugs');\n }\n\n if (typeof slugs === 'undefined') {\n return null;\n }\n\n slugs = slugs.split(',');\n return typeof slugs === 'string' ? [slugs] : slugs;\n }\n }]);\n\n return Packages;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (new Packages());//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL3V0aWxzL3BhY2thZ2VzLmpzP2VhZWEiXSwibmFtZXMiOlsiU29ydGVyIiwiZWxlbWVudHMiLCJjb250YWluZXIiLCIkIiwiZGlyZWN0aW9uIiwiZGF0YSIsImdldEVsZW1lbnRzIiwic29ydCIsImEiLCJiIiwiQSIsInRvU3RyaW5nIiwidG9Mb3dlckNhc2UiLCJCIiwiYXBwZW5kVG8iLCJieUNvbW1vbiIsIkRhdGUiLCJnZXRUaW1lIiwiUGFja2FnZXMiLCJTb3J0IiwiZGVwZW5kZW5jaWVzIiwic2x1ZyIsImZvckVhY2giLCJkZXBlbmRlbmN5IiwiYWRkRGVwZW5kZW5jeVRvTGlzdCIsIm5hbWUiLCJ0eXBlIiwidXJsIiwiZ2V0UmVtb3ZlUGFja2FnZVVybCIsInJlcXVlc3QiLCJtZXRob2QiLCJib2R5IiwicmVzcG9uc2UiLCJzdGF0dXMiLCJhZGRDbGFzcyIsImxlbmd0aCIsImFkZERlcGVuZGVuY2llc1RvTGlzdCIsInJlbW92ZUNsYXNzIiwiZG9jdW1lbnQiLCJvbiIsImdldEJhY2tUb0xpc3QiLCJwYWNrYWdlX25hbWUiLCJjdXJyZW50X3ZlcnNpb24iLCJnZXRSZWluc3RhbGxQYWNrYWdlVXJsIiwid2luZG93IiwibG9jYXRpb24iLCJyZWxvYWQiLCJidXR0b24iLCJyZXBsYWNlV2l0aCIsInNsdWdzIiwiZmluaXNoZWRMb2FkaW5nQ2FsbGJhY2siLCJnZXRHZXRQYWNrYWdlc0RlcGVuZGVuY2llc1VybCIsInBhY2thZ2VzIiwiaGFzRGVwZW5kZW5jaWVzIiwiaGFzT3duUHJvcGVydHkiLCJkZXBlbmRlbmN5TmFtZSIsImFjdGlvbiIsImFkZE5lZWRlZERlcGVuZGVuY3lUb0xpc3QiLCJjYWxsYmFja1N1Y2Nlc3MiLCJjYWxsYmFja0Vycm9yIiwiZ2V0SW5zdGFsbERlcGVuZGVuY2llc09mUGFja2FnZXNVcmwiLCJnZXRJbnN0YWxsUGFja2FnZVVybCIsIlByb21pc2UiLCJtYXAiLCJyZXNvbHZlIiwicmVqZWN0IiwidGhlbiIsImV2ZW50IiwiZ2V0U2x1Z3NGcm9tRXZlbnQiLCJhbGVydCIsImh0bWwiLCJyZW1vdmUiLCJhdmFpbGFibGVfdmVyc2lvbiIsInJlc291cmNlcyIsImdwbSIsInBsdWdpbnMiLCJhdmFpbGFibGUiLCJ2ZXJzaW9uIiwidGhlbWVzIiwiYXBwZW5kIiwidHJhbnNsYXRpb25zIiwicHJldmVudERlZmF1bHQiLCJzdG9wUHJvcGFnYXRpb24iLCJxdWVyeSIsInJlbW92ZUF0dHIiLCJhdHRyIiwiZ2V0UGFja2FnZXNEZXBlbmRlbmNpZXMiLCJzbHVnc19zdHJpbmciLCJqb2luIiwiaW5zdGFsbERlcGVuZGVuY2llc09mUGFja2FnZXMiLCJpbnN0YWxsUGFja2FnZXMiLCJyZW1vZGFsIiwiY2xvc2UiLCJzZXRUaW1lb3V0IiwiZ2xvYmFsIiwiaHJlZiIsImNvbmZpZyIsImVycm9ycyIsIkFycmF5IiwiZnJvbSIsImZpbHRlciIsInIiLCJ0YXJnZXQiLCJyZW1vdmVQYWNrYWdlIiwicmVpbnN0YWxsUGFja2FnZSIsInJlbW92ZURlcGVuZGVuY3kiLCJpbmRleE9mIiwidGV4dCIsInRhc2siLCJnZXRUYXNrVXJsIiwibGlzdCIsImlzIiwicGFyZW50Iiwic3BsaXQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0lBRU1BLE07Ozs7Ozs7Z0NBQ1VDLFEsRUFBVUMsUyxFQUFXO0FBQzdCLFdBQUtELFFBQUwsR0FBZ0JBLFFBQVEsSUFBSUUsNkNBQUMsQ0FBQyxxQ0FBRCxDQUE3QjtBQUNBLFdBQUtELFNBQUwsR0FBaUJBLFNBQVMsSUFBSUMsNkNBQUMsQ0FBQyw4REFBRCxDQUEvQjtBQUNBLGFBQU8sS0FBS0YsUUFBWjtBQUNIOzs7K0JBU3NDO0FBQUEsVUFBOUJHLFNBQThCLHVFQUFsQixLQUFrQjtBQUFBLFVBQVhDLElBQVcsdUVBQUosRUFBSTtBQUNuQyxVQUFJSixRQUFRLEdBQUcsS0FBS0ssV0FBTCxHQUFtQkMsSUFBbkIsQ0FB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QUFuQixDQUFKLEVBQWlEO0FBQzdDOUQsYUFBSyxHQUFHOUMsNkNBQUMsQ0FBQ2dFLEtBQUssQ0FBQ21DLE1BQVAsQ0FBRCxDQUFnQmpCLElBQWhCLENBQXFCLHFCQUFyQixDQUFSO0FBQ0gsT0FGRCxNQUVPO0FBQ0hwQyxhQUFLLEdBQUc5Qyw2Q0FBQyxDQUFDZ0UsS0FBSyxDQUFDbUMsTUFBUCxDQUFELENBQWdCVSxNQUFoQixDQUF1Qix1QkFBdkIsRUFBZ0QzQixJQUFoRCxDQUFxRCxxQkFBckQsQ0FBUjtBQUNIOztBQUVELFVBQUksT0FBT3BDLEtBQVAsS0FBaUIsV0FBckIsRUFBa0M7QUFDOUIsZUFBTyxJQUFQO0FBQ0g7O0FBRURBLFdBQUssR0FBR0EsS0FBSyxDQUFDZ0UsS0FBTixDQUFZLEdBQVosQ0FBUjtBQUNBLGFBQU8sT0FBT2hFLEtBQVAsS0FBaUIsUUFBakIsR0FBNEIsQ0FBQ0EsS0FBRCxDQUE1QixHQUFzQ0EsS0FBN0M7QUFDSDs7Ozs7O0FBOEpMLGlFQUFlLElBQUkvQixRQUFKLEVBQWYiLCJmaWxlIjoiLi9hcHAvdXRpbHMvcGFja2FnZXMuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IHsgY29uZmlnLCB0cmFuc2xhdGlvbnMgfSBmcm9tICdncmF2LWNvbmZpZyc7XG5pbXBvcnQgcmVxdWVzdCBmcm9tICcuLi91dGlscy9yZXF1ZXN0JztcbmltcG9ydCB7IEluc3RhbmNlIGFzIGdwbSB9IGZyb20gJy4uL3V0aWxzL2dwbSc7XG5pbXBvcnQgeyBQcm9taXNlIH0gZnJvbSAnZXM2LXByb21pc2UnO1xuXG5jbGFzcyBTb3J0ZXIge1xuICAgIGdldEVsZW1lbnRzKGVsZW1lbnRzLCBjb250YWluZXIpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50cyA9IGVsZW1lbnRzIHx8ICQoJ1tkYXRhLWdwbS1wbHVnaW5dLCBbZGF0YS1ncG0tdGhlbWVdJyk7XG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyIHx8ICQoJy5ncG0tcGx1Z2lucyA+IHRhYmxlID4gdGJvZHksIC5ncG0tdGhlbWVzID4gLnRoZW1lcy5jYXJkLXJvdycpO1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50cztcbiAgICB9XG5cbiAgICBzdGF0aWMgc29ydChBLCBCLCBkaXJlY3Rpb24gPSAnYXNjJykge1xuICAgICAgICBpZiAoQSA+IEIpIHsgcmV0dXJuIChkaXJlY3Rpb24gPT09ICdhc2MnKSA/IDEgOiAtMTsgfVxuICAgICAgICBpZiAoQSA8IEIpIHsgcmV0dXJuIChkaXJlY3Rpb24gPT09ICdhc2MnKSA/IC0xIDogMTsgfVxuXG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGJ5Q29tbW9uKGRpcmVjdGlvbiA9ICdhc2MnLCBkYXRhID0gJycpIHtcbiAgICAgICAgbGV0IGVsZW1lbnRzID0gdGhpcy5nZXRFbGVtZW50cygpLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgIGxldCBBID0gJChhKS5kYXRhKGRhdGEpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGxldCBCID0gJChiKS5kYXRhKGRhdGEpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgcmV0dXJuIFNvcnRlci5zb3J0KEEsIEIsIGRpcmVjdGlvbik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBlbGVtZW50cy5hcHBlbmRUbyh0aGlzLmNvbnRhaW5lcik7XG4gICAgfVxuXG4gICAgYnlOYW1lKGRpcmVjdGlvbiA9ICdhc2MnLCBkYXRhID0gJ2dwbS1uYW1lJykge1xuICAgICAgICByZXR1cm4gdGhpcy5ieUNvbW1vbihkaXJlY3Rpb24sIGRhdGEpO1xuICAgIH1cblxuICAgIGJ5QXV0aG9yKGRpcmVjdGlvbiA9ICdhc2MnLCBkYXRhID0gJ2dwbS1hdXRob3InKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ5Q29tbW9uKGRpcmVjdGlvbiwgZGF0YSk7XG4gICAgfVxuXG4gICAgYnlPZmZpY2lhbChkaXJlY3Rpb24gPSAnYXNjJywgZGF0YSA9ICdncG0tb2ZmaWNpYWwnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ5Q29tbW9uKGRpcmVjdGlvbiwgZGF0YSk7XG4gICAgfVxuXG4gICAgYnlSZWxlYXNlRGF0ZShkaXJlY3Rpb24gPSAnYXNjJywgZGF0YSA9ICdncG0tcmVsZWFzZS1kYXRlJykge1xuICAgICAgICBsZXQgZWxlbWVudHMgPSB0aGlzLmdldEVsZW1lbnRzKCkuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgbGV0IEEgPSBuZXcgRGF0ZSgkKGEpLmRhdGEoZGF0YSkpLmdldFRpbWUoKTtcbiAgICAgICAgICAgIGxldCBCID0gbmV3IERhdGUoJChiKS5kYXRhKGRhdGEpKS5nZXRUaW1lKCk7XG5cbiAgICAgICAgICAgIHJldHVybiBTb3J0ZXIuc29ydChBLCBCLCBkaXJlY3Rpb24gPT09ICdhc2MnID8gJ2Rlc2MnIDogJ2FzYycpO1xuICAgICAgICB9KTtcblxuICAgICAgICBlbGVtZW50cy5hcHBlbmRUbyh0aGlzLmNvbnRhaW5lcik7XG4gICAgfVxuXG4gICAgYnlVcGRhdGFibGUoZGlyZWN0aW9uID0gJ2FzYycsIGRhdGEgPSAnZ3BtLXVwZGF0YWJsZScpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnlDb21tb24oZGlyZWN0aW9uLCBkYXRhKTtcbiAgICB9XG5cbiAgICBieUVuYWJsZWQoZGlyZWN0aW9uID0gJ2FzYycsIGRhdGEgPSAnZ3BtLWVuYWJsZWQnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ5Q29tbW9uKGRpcmVjdGlvbiwgZGF0YSk7XG4gICAgfVxuXG4gICAgYnlUZXN0aW5nKGRpcmVjdGlvbiA9ICdhc2MnLCBkYXRhID0gJ2dwbS10ZXN0aW5nJykge1xuICAgICAgICByZXR1cm4gdGhpcy5ieUNvbW1vbihkaXJlY3Rpb24sIGRhdGEpO1xuICAgIH1cbn1cblxuY2xhc3MgUGFja2FnZXMge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLlNvcnQgPSBuZXcgU29ydGVyKCk7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldEJhY2tUb0xpc3QodHlwZSkge1xuICAgICAgICBnbG9iYWwubG9jYXRpb24uaHJlZiA9IGAke2NvbmZpZy5iYXNlX3VybF9yZWxhdGl2ZX0vJHt0eXBlfXNgO1xuICAgIH1cblxuICAgIHN0YXRpYyBhZGREZXBlbmRlbmN5VG9MaXN0KHR5cGUsIGRlcGVuZGVuY3ksIHNsdWcgPSAnJykge1xuICAgICAgICBpZiAoWydhZG1pbicsICdmb3JtJywgJ2xvZ2luJywgJ2VtYWlsJywgJ2dyYXYnXS5pbmRleE9mKGRlcGVuZGVuY3kpICE9PSAtMSkgeyByZXR1cm47IH1cbiAgICAgICAgbGV0IGNvbnRhaW5lciA9ICQoJy5wYWNrYWdlLWRlcGVuZGVuY2llcy1jb250YWluZXInKTtcbiAgICAgICAgbGV0IHRleHQgPSBgJHtkZXBlbmRlbmN5fSA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYnV0dG9uXCIgZGF0YS1kZXBlbmRlbmN5LXNsdWc9XCIke2RlcGVuZGVuY3l9XCIgZGF0YS0ke3R5cGV9LWFjdGlvbj1cInJlbW92ZS1kZXBlbmRlbmN5LXBhY2thZ2VcIj5SZW1vdmU8L2E+YDtcblxuICAgICAgICBpZiAoc2x1Zykge1xuICAgICAgICAgICAgdGV4dCArPSBgICh3YXMgbmVlZGVkIGJ5ICR7c2x1Z30pYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRhaW5lci5hcHBlbmQoYDxsaT4ke3RleHR9PC9saT5gKTtcbiAgICB9XG5cbiAgICBhZGREZXBlbmRlbmNpZXNUb0xpc3QoZGVwZW5kZW5jaWVzLCBzbHVnID0gJycpIHtcbiAgICAgICAgZGVwZW5kZW5jaWVzLmZvckVhY2goKGRlcGVuZGVuY3kpID0+IHtcbiAgICAgICAgICAgIFBhY2thZ2VzLmFkZERlcGVuZGVuY3lUb0xpc3QoJ3BsdWdpbicsIGRlcGVuZGVuY3kubmFtZSB8fCBkZXBlbmRlbmN5LCBzbHVnKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldFRhc2tVcmwodHlwZSwgdGFzaykge1xuICAgICAgICBsZXQgdXJsID0gYCR7Y29uZmlnLmJhc2VfdXJsX3JlbGF0aXZlfWA7XG4gICAgICAgIHVybCArPSBgLyR7dHlwZX1zLmpzb25gO1xuICAgICAgICB1cmwgKz0gYC90YXNrJHtjb25maWcucGFyYW1fc2VwfSR7dGFza31gO1xuICAgICAgICByZXR1cm4gdXJsO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXRSZW1vdmVQYWNrYWdlVXJsKHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIGAke1BhY2thZ2VzLmdldFRhc2tVcmwodHlwZSwgJ3JlbW92ZVBhY2thZ2UnKX1gO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXRSZWluc3RhbGxQYWNrYWdlVXJsKHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIGAke1BhY2thZ2VzLmdldFRhc2tVcmwodHlwZSwgJ3JlaW5zdGFsbFBhY2thZ2UnKX1gO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXRHZXRQYWNrYWdlc0RlcGVuZGVuY2llc1VybCh0eXBlKSB7XG4gICAgICAgIHJldHVybiBgJHtQYWNrYWdlcy5nZXRUYXNrVXJsKHR5cGUsICdnZXRQYWNrYWdlc0RlcGVuZGVuY2llcycpfWA7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldEluc3RhbGxEZXBlbmRlbmNpZXNPZlBhY2thZ2VzVXJsKHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIGAke1BhY2thZ2VzLmdldFRhc2tVcmwodHlwZSwgJ2luc3RhbGxEZXBlbmRlbmNpZXNPZlBhY2thZ2VzJyl9YDtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0SW5zdGFsbFBhY2thZ2VVcmwodHlwZSkge1xuICAgICAgICByZXR1cm4gYCR7UGFja2FnZXMuZ2V0VGFza1VybCh0eXBlLCAnaW5zdGFsbFBhY2thZ2UnKX1gO1xuICAgIH1cblxuICAgIHJlbW92ZVBhY2thZ2UodHlwZSwgc2x1Zykge1xuICAgICAgICBsZXQgdXJsID0gUGFja2FnZXMuZ2V0UmVtb3ZlUGFja2FnZVVybCh0eXBlKTtcblxuICAgICAgICByZXF1ZXN0KHVybCwge1xuICAgICAgICAgICAgbWV0aG9kOiAncG9zdCcsXG4gICAgICAgICAgICBib2R5OiB7XG4gICAgICAgICAgICAgICAgcGFja2FnZTogc2x1Z1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09ICdzdWNjZXNzJykge1xuICAgICAgICAgICAgICAgICQoJy5yZW1vdmUtcGFja2FnZS1jb25maXJtJykuYWRkQ2xhc3MoJ2hpZGRlbicpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmRlcGVuZGVuY2llcyAmJiByZXNwb25zZS5kZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZERlcGVuZGVuY2llc1RvTGlzdChyZXNwb25zZS5kZXBlbmRlbmNpZXMpO1xuICAgICAgICAgICAgICAgICAgICAkKCcucmVtb3ZlLXBhY2thZ2UtZGVwZW5kZW5jaWVzJykucmVtb3ZlQ2xhc3MoJ2hpZGRlbicpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICQoJy5yZW1vdmUtcGFja2FnZS1kb25lJykucmVtb3ZlQ2xhc3MoJ2hpZGRlbicpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFRoZSBwYWNrYWdlIHdhcyByZW1vdmVkLiBXaGVuIHRoZSBtb2RhbCBjbG9zZXMsIG1vdmUgdG8gdGhlIHBhY2thZ2VzIGxpc3RcbiAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5vbignY2xvc2luZycsICdbZGF0YS1yZW1vZGFsLWlkPVwicmVtb3ZlLXBhY2thZ2VcIl0nLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIFBhY2thZ2VzLmdldEJhY2tUb0xpc3QodHlwZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICQoJy5yZW1vdmUtcGFja2FnZS1jb25maXJtJykuYWRkQ2xhc3MoJ2hpZGRlbicpO1xuICAgICAgICAgICAgICAgICQoJy5yZW1vdmUtcGFja2FnZS1lcnJvcicpLnJlbW92ZUNsYXNzKCdoaWRkZW4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmVpbnN0YWxsUGFja2FnZSh0eXBlLCBzbHVnLCBwYWNrYWdlX25hbWUsIGN1cnJlbnRfdmVyc2lvbikge1xuICAgICAgICAkKCcuYnV0dG9uLWJhciBidXR0b24nKS5hZGRDbGFzcygnaGlkZGVuJyk7XG4gICAgICAgICQoJy5idXR0b24tYmFyIC5zcGlubmluZy13aGVlbCcpLnJlbW92ZUNsYXNzKCdoaWRkZW4nKTtcblxuICAgICAgICBsZXQgdXJsID0gUGFja2FnZXMuZ2V0UmVpbnN0YWxsUGFja2FnZVVybCh0eXBlKTtcblxuICAgICAgICByZXF1ZXN0KHVybCwge1xuICAgICAgICAgICAgbWV0aG9kOiAncG9zdCcsXG4gICAgICAgICAgICBib2R5OiB7XG4gICAgICAgICAgICAgICAgc2x1Zzogc2x1ZyxcbiAgICAgICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgICAgIHBhY2thZ2VfbmFtZTogcGFja2FnZV9uYW1lLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRfdmVyc2lvbjogY3VycmVudF92ZXJzaW9uXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICAgICAgICAgICAgJCgnLnJlaW5zdGFsbC1wYWNrYWdlLWNvbmZpcm0nKS5hZGRDbGFzcygnaGlkZGVuJyk7XG4gICAgICAgICAgICAgICAgJCgnLnJlaW5zdGFsbC1wYWNrYWdlLWRvbmUnKS5yZW1vdmVDbGFzcygnaGlkZGVuJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICQoJy5yZWluc3RhbGwtcGFja2FnZS1jb25maXJtJykuYWRkQ2xhc3MoJ2hpZGRlbicpO1xuICAgICAgICAgICAgICAgICQoJy5yZWluc3RhbGwtcGFja2FnZS1lcnJvcicpLnJlbW92ZUNsYXNzKCdoaWRkZW4nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZW1vdmVEZXBlbmRlbmN5KHR5cGUsIHNsdWcsIGJ1dHRvbikge1xuICAgICAgICBsZXQgdXJsID0gUGFja2FnZXMuZ2V0UmVtb3ZlUGFja2FnZVVybCh0eXBlKTtcblxuICAgICAgICByZXF1ZXN0KHVybCwge1xuICAgICAgICAgICAgbWV0aG9kOiAncG9zdCcsXG4gICAgICAgICAgICBib2R5OiB7XG4gICAgICAgICAgICAgICAgcGFja2FnZTogc2x1Z1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09ICdzdWNjZXNzJykge1xuICAgICAgICAgICAgICAgIGJ1dHRvbi5yZW1vdmVDbGFzcygnYnV0dG9uJyk7XG4gICAgICAgICAgICAgICAgYnV0dG9uLnJlcGxhY2VXaXRoKCQoJzxzcGFuPlJlbW92ZWQgc3VjY2Vzc2Z1bGx5PC9zcGFuPicpKTtcblxuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5kZXBlbmRlbmNpZXMgJiYgcmVzcG9uc2UuZGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGREZXBlbmRlbmNpZXNUb0xpc3QocmVzcG9uc2UuZGVwZW5kZW5jaWVzLCBzbHVnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0YXRpYyBhZGROZWVkZWREZXBlbmRlbmN5VG9MaXN0KGFjdGlvbiwgc2x1Zykge1xuICAgICAgICAkKCcuaW5zdGFsbC1kZXBlbmRlbmNpZXMtcGFja2FnZS1jb250YWluZXIgLnR5cGUtJyArIGFjdGlvbikucmVtb3ZlQ2xhc3MoJ2hpZGRlbicpO1xuICAgICAgICBsZXQgbGlzdCA9ICQoJy5pbnN0YWxsLWRlcGVuZGVuY2llcy1wYWNrYWdlLWNvbnRhaW5lciAudHlwZS0nICsgYWN0aW9uICsgJyB1bCcpO1xuXG4gICAgICAgIGlmIChhY3Rpb24gIT09ICdpbnN0YWxsJykge1xuICAgICAgICAgICAgbGV0IGN1cnJlbnRfdmVyc2lvbiA9ICcnO1xuICAgICAgICAgICAgbGV0IGF2YWlsYWJsZV92ZXJzaW9uID0gJyc7XG4gICAgICAgICAgICBsZXQgbmFtZSA9ICcnO1xuXG4gICAgICAgICAgICBsZXQgcmVzb3VyY2VzID0gZ3BtLnBheWxvYWQucGF5bG9hZC5yZXNvdXJjZXM7XG5cbiAgICAgICAgICAgIGlmIChyZXNvdXJjZXMucGx1Z2luc1tzbHVnXSkge1xuICAgICAgICAgICAgICAgIGF2YWlsYWJsZV92ZXJzaW9uID0gcmVzb3VyY2VzLnBsdWdpbnNbc2x1Z10uYXZhaWxhYmxlO1xuICAgICAgICAgICAgICAgIGN1cnJlbnRfdmVyc2lvbiA9IHJlc291cmNlcy5wbHVnaW5zW3NsdWddLnZlcnNpb247XG4gICAgICAgICAgICAgICAgbmFtZSA9IHJlc291cmNlcy5wbHVnaW5zW3NsdWddLm5hbWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlc291cmNlcy50aGVtZXNbc2x1Z10pIHtcbiAgICAgICAgICAgICAgICBhdmFpbGFibGVfdmVyc2lvbiA9IHJlc291cmNlcy50aGVtZXNbc2x1Z10uYXZhaWxhYmxlO1xuICAgICAgICAgICAgICAgIGN1cnJlbnRfdmVyc2lvbiA9IHJlc291cmNlcy50aGVtZXNbc2x1Z10udmVyc2lvbjtcbiAgICAgICAgICAgICAgICBuYW1lID0gcmVzb3VyY2VzLnRoZW1lc1tzbHVnXS5uYW1lO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsaXN0LmFwcGVuZChgPGxpPiR7bmFtZSA/IG5hbWUgOiBzbHVnfSwgJHt0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLkZST019IHY8c3Ryb25nPiR7Y3VycmVudF92ZXJzaW9ufTwvc3Ryb25nPiAke3RyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uVE99IHY8c3Ryb25nPiR7YXZhaWxhYmxlX3ZlcnNpb259PC9zdHJvbmc+PC9saT5gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxpc3QuYXBwZW5kKGA8bGk+JHtuYW1lID8gbmFtZSA6IHNsdWd9PC9saT5gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFBhY2thZ2VzRGVwZW5kZW5jaWVzKHR5cGUsIHNsdWdzLCBmaW5pc2hlZExvYWRpbmdDYWxsYmFjaykge1xuICAgICAgICBsZXQgdXJsID0gUGFja2FnZXMuZ2V0R2V0UGFja2FnZXNEZXBlbmRlbmNpZXNVcmwodHlwZSk7XG5cbiAgICAgICAgcmVxdWVzdCh1cmwsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ3Bvc3QnLFxuICAgICAgICAgICAgYm9keToge1xuICAgICAgICAgICAgICAgIHBhY2thZ2VzOiBzbHVnc1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAocmVzcG9uc2UpID0+IHtcblxuICAgICAgICAgICAgZmluaXNoZWRMb2FkaW5nQ2FsbGJhY2soKTtcblxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmRlcGVuZGVuY2llcykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaGFzRGVwZW5kZW5jaWVzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGRlcGVuZGVuY3kgaW4gcmVzcG9uc2UuZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuZGVwZW5kZW5jaWVzLmhhc093blByb3BlcnR5KGRlcGVuZGVuY3kpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlcGVuZGVuY3kgPT09ICdncmF2Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzRGVwZW5kZW5jaWVzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGVwZW5kZW5jeU5hbWUgPSBkZXBlbmRlbmN5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhY3Rpb24gPSByZXNwb25zZS5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWNrYWdlcy5hZGROZWVkZWREZXBlbmRlbmN5VG9MaXN0KGFjdGlvbiwgZGVwZW5kZW5jeU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0RlcGVuZGVuY2llcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgJCgnW2RhdGEtcGFja2FnZXMtbW9kYWxdIC5pbnN0YWxsLWRlcGVuZGVuY2llcy1wYWNrYWdlLWNvbnRhaW5lcicpLnJlbW92ZUNsYXNzKCdoaWRkZW4nKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICQoJ1tkYXRhLXBhY2thZ2VzLW1vZGFsXSAuaW5zdGFsbC1wYWNrYWdlLWNvbnRhaW5lcicpLnJlbW92ZUNsYXNzKCdoaWRkZW4nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICQoJ1tkYXRhLXBhY2thZ2VzLW1vZGFsXSAuaW5zdGFsbC1wYWNrYWdlLWNvbnRhaW5lcicpLnJlbW92ZUNsYXNzKCdoaWRkZW4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICQoJ1tkYXRhLXBhY2thZ2VzLW1vZGFsXSAuaW5zdGFsbC1wYWNrYWdlLWVycm9yJykucmVtb3ZlQ2xhc3MoJ2hpZGRlbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpbnN0YWxsRGVwZW5kZW5jaWVzT2ZQYWNrYWdlcyh0eXBlLCBzbHVncywgY2FsbGJhY2tTdWNjZXNzLCBjYWxsYmFja0Vycm9yKSB7XG4gICAgICAgIGxldCB1cmwgPSBQYWNrYWdlcy5nZXRJbnN0YWxsRGVwZW5kZW5jaWVzT2ZQYWNrYWdlc1VybCh0eXBlKTtcblxuICAgICAgICByZXF1ZXN0KHVybCwge1xuICAgICAgICAgICAgbWV0aG9kOiAncG9zdCcsXG4gICAgICAgICAgICBib2R5OiB7XG4gICAgICAgICAgICAgICAgcGFja2FnZXM6IHNsdWdzXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIGNhbGxiYWNrU3VjY2Vzcyk7XG4gICAgfVxuXG4gICAgaW5zdGFsbFBhY2thZ2VzKHR5cGUsIHNsdWdzLCBjYWxsYmFja1N1Y2Nlc3MpIHtcbiAgICAgICAgbGV0IHVybCA9IFBhY2thZ2VzLmdldEluc3RhbGxQYWNrYWdlVXJsKHR5cGUpO1xuXG4gICAgICAgIFByb21pc2UuYWxsKHNsdWdzLm1hcCgoc2x1ZykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0KHVybCwge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdwb3N0JyxcbiAgICAgICAgICAgICAgICAgICAgYm9keToge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZTogc2x1ZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHR5cGVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KSkudGhlbihjYWxsYmFja1N1Y2Nlc3MpO1xuXG4gICAgfVxuXG4gICAgc3RhdGljIGdldFNsdWdzRnJvbUV2ZW50KGV2ZW50KSB7XG4gICAgICAgIGxldCBzbHVncyA9ICcnO1xuICAgICAgICBpZiAoJChldmVudC50YXJnZXQpLmlzKCdbZGF0YS1wYWNrYWdlcy1zbHVnc10nKSkge1xuICAgICAgICAgICAgc2x1Z3MgPSAkKGV2ZW50LnRhcmdldCkuYXR0cignZGF0YS1wYWNrYWdlcy1zbHVncycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2x1Z3MgPSAkKGV2ZW50LnRhcmdldCkucGFyZW50KCdbZGF0YS1wYWNrYWdlcy1zbHVnc10nKS5hdHRyKCdkYXRhLXBhY2thZ2VzLXNsdWdzJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHNsdWdzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBzbHVncyA9IHNsdWdzLnNwbGl0KCcsJyk7XG4gICAgICAgIHJldHVybiB0eXBlb2Ygc2x1Z3MgPT09ICdzdHJpbmcnID8gW3NsdWdzXSA6IHNsdWdzO1xuICAgIH1cblxuICAgIGhhbmRsZUdldHRpbmdQYWNrYWdlRGVwZW5kZW5jaWVzKHR5cGUsIGV2ZW50LCBhY3Rpb24gPSAndXBkYXRlJykge1xuICAgICAgICBsZXQgc2x1Z3MgPSBQYWNrYWdlcy5nZXRTbHVnc0Zyb21FdmVudChldmVudCk7XG5cbiAgICAgICAgaWYgKCFzbHVncykge1xuICAgICAgICAgICAgYWxlcnQoJ05vIHNsdWcgc2V0Jyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhbnVwXG4gICAgICAgICQoJy5wYWNrYWdlcy1uYW1lcy1saXN0JykuaHRtbCgnJyk7XG4gICAgICAgICQoJy5pbnN0YWxsLWRlcGVuZGVuY2llcy1wYWNrYWdlLWNvbnRhaW5lciBsaScpLnJlbW92ZSgpO1xuXG4gICAgICAgIHNsdWdzLmZvckVhY2goKHNsdWcpID0+IHtcbiAgICAgICAgICAgIGlmIChhY3Rpb24gPT09ICd1cGRhdGUnKSB7XG4gICAgICAgICAgICAgICAgbGV0IGN1cnJlbnRfdmVyc2lvbiA9ICcnO1xuICAgICAgICAgICAgICAgIGxldCBhdmFpbGFibGVfdmVyc2lvbiA9ICcnO1xuICAgICAgICAgICAgICAgIGxldCBuYW1lID0gJyc7XG5cbiAgICAgICAgICAgICAgICBsZXQgcmVzb3VyY2VzID0gZ3BtLnBheWxvYWQucGF5bG9hZC5yZXNvdXJjZXM7XG5cbiAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2VzLnBsdWdpbnNbc2x1Z10pIHtcbiAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlX3ZlcnNpb24gPSByZXNvdXJjZXMucGx1Z2luc1tzbHVnXS5hdmFpbGFibGU7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfdmVyc2lvbiA9IHJlc291cmNlcy5wbHVnaW5zW3NsdWddLnZlcnNpb247XG4gICAgICAgICAgICAgICAgICAgIG5hbWUgPSByZXNvdXJjZXMucGx1Z2luc1tzbHVnXS5uYW1lO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzb3VyY2VzLnRoZW1lc1tzbHVnXSkge1xuICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVfdmVyc2lvbiA9IHJlc291cmNlcy50aGVtZXNbc2x1Z10uYXZhaWxhYmxlO1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3ZlcnNpb24gPSByZXNvdXJjZXMudGhlbWVzW3NsdWddLnZlcnNpb247XG4gICAgICAgICAgICAgICAgICAgIG5hbWUgPSByZXNvdXJjZXMudGhlbWVzW3NsdWddLm5hbWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgJCgnLnBhY2thZ2VzLW5hbWVzLWxpc3QnKS5hcHBlbmQoYDxsaT4ke25hbWUgPyBuYW1lIDogc2x1Z30sICR7dHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5GUk9NfSB2PHN0cm9uZz4ke2N1cnJlbnRfdmVyc2lvbn08L3N0cm9uZz4gJHt0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLlRPfSB2PHN0cm9uZz4ke2F2YWlsYWJsZV92ZXJzaW9ufTwvc3Ryb25nPjwvbGk+YCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICQoJy5wYWNrYWdlcy1uYW1lcy1saXN0JykuYXBwZW5kKGA8bGk+JHtuYW1lID8gbmFtZSA6IHNsdWd9PC9saT5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgLy8gZml4IG1pc21hdGNoaW5nIHR5cGVzIHdoZW4gc2hhcmluZyBpbnN0YWxsIG1vZGFsIGJldHdlZW4gcGx1Z2lucy90aGVtZXNcbiAgICAgICAgY29uc3QgcXVlcnkgPSAnW2RhdGEtcGFja2FnZXMtbW9kYWxdIFtkYXRhLXRoZW1lLWFjdGlvbl0sIFtkYXRhLXBhY2thZ2VzLW1vZGFsXSBbZGF0YS1wbHVnaW4tYWN0aW9uXSc7XG4gICAgICAgIGNvbnN0IGRhdGEgPSAkKHF1ZXJ5KS5kYXRhKCd0aGVtZUFjdGlvbicpIHx8ICQocXVlcnkpLmRhdGEoJ3BsdWdpbkFjdGlvbicpO1xuICAgICAgICAkKHF1ZXJ5KS5yZW1vdmVBdHRyKCdkYXRhLXRoZW1lLWFjdGlvbicpLnJlbW92ZUF0dHIoJ2RhdGEtcGx1Z2luLWFjdGlvbicpLmF0dHIoYGRhdGEtJHt0eXBlfS1hY3Rpb25gLCBkYXRhKTtcblxuICAgICAgICAvLyBSZXN0b3JlIG9yaWdpbmFsIHN0YXRlXG4gICAgICAgICQoJ1tkYXRhLXBhY2thZ2VzLW1vZGFsXSAubG9hZGluZycpLnJlbW92ZUNsYXNzKCdoaWRkZW4nKTtcbiAgICAgICAgJCgnW2RhdGEtcGFja2FnZXMtbW9kYWxdIC5pbnN0YWxsLWRlcGVuZGVuY2llcy1wYWNrYWdlLWNvbnRhaW5lcicpLmFkZENsYXNzKCdoaWRkZW4nKTtcbiAgICAgICAgJCgnW2RhdGEtcGFja2FnZXMtbW9kYWxdIC5pbnN0YWxsLXBhY2thZ2UtY29udGFpbmVyJykuYWRkQ2xhc3MoJ2hpZGRlbicpO1xuICAgICAgICAkKCdbZGF0YS1wYWNrYWdlcy1tb2RhbF0gLmluc3RhbGxpbmctZGVwZW5kZW5jaWVzJykuYWRkQ2xhc3MoJ2hpZGRlbicpO1xuICAgICAgICAkKCdbZGF0YS1wYWNrYWdlcy1tb2RhbF0gLmluc3RhbGxpbmctcGFja2FnZScpLmFkZENsYXNzKCdoaWRkZW4nKTtcbiAgICAgICAgJCgnW2RhdGEtcGFja2FnZXMtbW9kYWxdIC5pbnN0YWxsYXRpb24tY29tcGxldGUnKS5hZGRDbGFzcygnaGlkZGVuJyk7XG4gICAgICAgICQoJ1tkYXRhLXBhY2thZ2VzLW1vZGFsXSAuaW5zdGFsbC1wYWNrYWdlLWVycm9yJykuYWRkQ2xhc3MoJ2hpZGRlbicpO1xuXG4gICAgICAgIHRoaXMuZ2V0UGFja2FnZXNEZXBlbmRlbmNpZXModHlwZSwgc2x1Z3MsICgpID0+IHtcbiAgICAgICAgICAgIGxldCBzbHVnc19zdHJpbmcgPSBzbHVncy5qb2luKCk7XG4gICAgICAgICAgICAkKGBbZGF0YS1wYWNrYWdlcy1tb2RhbF0gW2RhdGEtJHt0eXBlfS1hY3Rpb249XCJpbnN0YWxsLWRlcGVuZGVuY2llcy1hbmQtcGFja2FnZVwiXWApLmF0dHIoJ2RhdGEtcGFja2FnZXMtc2x1Z3MnLCBzbHVnc19zdHJpbmcpO1xuICAgICAgICAgICAgJChgW2RhdGEtcGFja2FnZXMtbW9kYWxdIFtkYXRhLSR7dHlwZX0tYWN0aW9uPVwiaW5zdGFsbC1wYWNrYWdlXCJdYCkuYXR0cignZGF0YS1wYWNrYWdlcy1zbHVncycsIHNsdWdzX3N0cmluZyk7XG4gICAgICAgICAgICAkKCdbZGF0YS1wYWNrYWdlcy1tb2RhbF0gLmxvYWRpbmcnKS5hZGRDbGFzcygnaGlkZGVuJyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGhhbmRsZUluc3RhbGxpbmdEZXBlbmRlbmNpZXNBbmRQYWNrYWdlKHR5cGUsIGV2ZW50KSB7XG4gICAgICAgIGxldCBzbHVncyA9IFBhY2thZ2VzLmdldFNsdWdzRnJvbUV2ZW50KGV2ZW50KTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgJCgnW2RhdGEtcGFja2FnZXMtbW9kYWxdIC5pbnN0YWxsLWRlcGVuZGVuY2llcy1wYWNrYWdlLWNvbnRhaW5lcicpLmFkZENsYXNzKCdoaWRkZW4nKTtcbiAgICAgICAgJCgnW2RhdGEtcGFja2FnZXMtbW9kYWxdIC5pbnN0YWxsLXBhY2thZ2UtY29udGFpbmVyJykuYWRkQ2xhc3MoJ2hpZGRlbicpO1xuICAgICAgICAkKCdbZGF0YS1wYWNrYWdlcy1tb2RhbF0gLmluc3RhbGxpbmctZGVwZW5kZW5jaWVzJykucmVtb3ZlQ2xhc3MoJ2hpZGRlbicpO1xuXG4gICAgICAgIHRoaXMuaW5zdGFsbERlcGVuZGVuY2llc09mUGFja2FnZXModHlwZSwgc2x1Z3MsIChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgJCgnW2RhdGEtcGFja2FnZXMtbW9kYWxdIC5pbnN0YWxsaW5nLWRlcGVuZGVuY2llcycpLmFkZENsYXNzKCdoaWRkZW4nKTtcbiAgICAgICAgICAgICQoJ1tkYXRhLXBhY2thZ2VzLW1vZGFsXSAuaW5zdGFsbGluZy1wYWNrYWdlJykucmVtb3ZlQ2xhc3MoJ2hpZGRlbicpO1xuICAgICAgICAgICAgdGhpcy5pbnN0YWxsUGFja2FnZXModHlwZSwgc2x1Z3MsICgpID0+IHtcbiAgICAgICAgICAgICAgICAkKCdbZGF0YS1wYWNrYWdlcy1tb2RhbF0gLmluc3RhbGxpbmctcGFja2FnZScpLmFkZENsYXNzKCdoaWRkZW4nKTtcbiAgICAgICAgICAgICAgICAkKCdbZGF0YS1wYWNrYWdlcy1tb2RhbF0gLmluc3RhbGxhdGlvbi1jb21wbGV0ZScpLnJlbW92ZUNsYXNzKCdoaWRkZW4nKTtcblxuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09ICdlcnJvcicpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlbW9kYWwgPSAkLnJlbW9kYWwubG9va3VwWyQoJ1tkYXRhLXBhY2thZ2VzLW1vZGFsXScpLmRhdGEoJ3JlbW9kYWwnKV07XG4gICAgICAgICAgICAgICAgICAgIHJlbW9kYWwuY2xvc2UoKTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzbHVncy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbC5sb2NhdGlvbi5ocmVmID0gYCR7Y29uZmlnLmJhc2VfdXJsX3JlbGF0aXZlfS8ke3R5cGV9cy8ke3NsdWdzWzBdfWA7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWwubG9jYXRpb24uaHJlZiA9IGAke2NvbmZpZy5iYXNlX3VybF9yZWxhdGl2ZX0vJHt0eXBlfXNgO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgMTAwMCk7XG5cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBoYW5kbGVJbnN0YWxsaW5nUGFja2FnZSh0eXBlLCBldmVudCkge1xuICAgICAgICBsZXQgc2x1Z3MgPSBQYWNrYWdlcy5nZXRTbHVnc0Zyb21FdmVudChldmVudCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgICQoJ1tkYXRhLXBhY2thZ2VzLW1vZGFsXSAuaW5zdGFsbC1wYWNrYWdlLWNvbnRhaW5lcicpLmFkZENsYXNzKCdoaWRkZW4nKTtcbiAgICAgICAgJCgnW2RhdGEtcGFja2FnZXMtbW9kYWxdIC5pbnN0YWxsaW5nLXBhY2thZ2UnKS5yZW1vdmVDbGFzcygnaGlkZGVuJyk7XG5cbiAgICAgICAgdGhpcy5pbnN0YWxsUGFja2FnZXModHlwZSwgc2x1Z3MsIChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgJCgnW2RhdGEtcGFja2FnZXMtbW9kYWxdIC5pbnN0YWxsaW5nLXBhY2thZ2UnKS5hZGRDbGFzcygnaGlkZGVuJyk7XG4gICAgICAgICAgICAkKCdbZGF0YS1wYWNrYWdlcy1tb2RhbF0gLmluc3RhbGxhdGlvbi1jb21wbGV0ZScpLnJlbW92ZUNsYXNzKCdoaWRkZW4nKTtcblxuICAgICAgICAgICAgY29uc3QgZXJyb3JzID0gQXJyYXkuZnJvbShyZXNwb25zZSkuZmlsdGVyKChyKSA9PiByLnN0YXR1cyA9PT0gJ2Vycm9yJyk7XG5cbiAgICAgICAgICAgIGlmIChlcnJvcnMgJiYgZXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGxldCByZW1vZGFsID0gJC5yZW1vZGFsLmxvb2t1cFskKCdbZGF0YS1wYWNrYWdlcy1tb2RhbF0ucmVtb2RhbC1pcy1vcGVuZWQnKS5kYXRhKCdyZW1vZGFsJyldO1xuICAgICAgICAgICAgICAgIHJlbW9kYWwuY2xvc2UoKTtcblxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHNsdWdzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGdsb2JhbC5sb2NhdGlvbi5ocmVmID0gYCR7Y29uZmlnLmJhc2VfdXJsX3JlbGF0aXZlfS8ke3R5cGV9cy8ke3NsdWdzWzBdfWA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGdsb2JhbC5sb2NhdGlvbi5ocmVmID0gYCR7Y29uZmlnLmJhc2VfdXJsX3JlbGF0aXZlfS8ke3R5cGV9c2A7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGhhbmRsZVJlbW92aW5nUGFja2FnZSh0eXBlLCBldmVudCkge1xuICAgICAgICBsZXQgc2x1ZyA9ICQoZXZlbnQudGFyZ2V0KS5hdHRyKCdkYXRhLXBhY2thZ2VzLXNsdWdzJyk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIHRoaXMucmVtb3ZlUGFja2FnZSh0eXBlLCBzbHVnKTtcbiAgICB9XG5cbiAgICBoYW5kbGVSZWluc3RhbGxQYWNrYWdlKHR5cGUsIGV2ZW50KSB7XG4gICAgICAgIGxldCB0YXJnZXQgPSAkKGV2ZW50LnRhcmdldCk7XG4gICAgICAgIGxldCBzbHVnID0gdGFyZ2V0LmF0dHIoJ2RhdGEtcGFja2FnZS1zbHVnJyk7XG4gICAgICAgIGxldCBwYWNrYWdlX25hbWUgPSB0YXJnZXQuYXR0cignZGF0YS1wYWNrYWdlLW5hbWUnKTtcbiAgICAgICAgbGV0IGN1cnJlbnRfdmVyc2lvbiA9IHRhcmdldC5hdHRyKCdkYXRhLXBhY2thZ2UtY3VycmVudC12ZXJzaW9uJyk7XG5cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgdGhpcy5yZWluc3RhbGxQYWNrYWdlKHR5cGUsIHNsdWcsIHBhY2thZ2VfbmFtZSwgY3VycmVudF92ZXJzaW9uKTtcbiAgICB9XG5cbiAgICBoYW5kbGVSZW1vdmluZ0RlcGVuZGVuY3kodHlwZSwgZXZlbnQpIHtcbiAgICAgICAgbGV0IHNsdWcgPSAkKGV2ZW50LnRhcmdldCkuYXR0cignZGF0YS1kZXBlbmRlbmN5LXNsdWcnKTtcbiAgICAgICAgbGV0IGJ1dHRvbiA9ICQoZXZlbnQudGFyZ2V0KTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgdGhpcy5yZW1vdmVEZXBlbmRlbmN5KHR5cGUsIHNsdWcsIGJ1dHRvbik7XG4gICAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBQYWNrYWdlcygpO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./app/utils/packages.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! grav-config */ \"grav-config\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(grav_config__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _utils_request__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/request */ \"./app/utils/request.js\");\n/* harmony import */ var _utils_gpm__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/gpm */ \"./app/utils/gpm.js\");\n/* harmony import */ var es6_promise__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! es6-promise */ \"./node_modules/es6-promise/dist/es6-promise.js\");\n/* harmony import */ var es6_promise__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(es6_promise__WEBPACK_IMPORTED_MODULE_4__);\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\n\n\n\nvar Sorter = /*#__PURE__*/function () {\n function Sorter() {\n _classCallCheck(this, Sorter);\n }\n\n _createClass(Sorter, [{\n key: \"getElements\",\n value: function getElements(elements, container) {\n this.elements = elements || jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-gpm-plugin], [data-gpm-theme]');\n this.container = container || jquery__WEBPACK_IMPORTED_MODULE_0___default()('.gpm-plugins > table > tbody, .gpm-themes > .themes.card-row');\n return this.elements;\n }\n }, {\n key: \"byCommon\",\n value: function byCommon() {\n var direction = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'asc';\n var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var elements = this.getElements().sort(function (a, b) {\n var A = jquery__WEBPACK_IMPORTED_MODULE_0___default()(a).data(data).toString().toLowerCase();\n var B = jquery__WEBPACK_IMPORTED_MODULE_0___default()(b).data(data).toString().toLowerCase();\n return Sorter.sort(A, B, direction);\n });\n return elements.appendTo(this.container);\n }\n }, {\n key: \"byName\",\n value: function byName() {\n var direction = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'asc';\n var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'gpm-name';\n return this.byCommon(direction, data);\n }\n }, {\n key: \"byAuthor\",\n value: function byAuthor() {\n var direction = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'asc';\n var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'gpm-author';\n return this.byCommon(direction, data);\n }\n }, {\n key: \"byOfficial\",\n value: function byOfficial() {\n var direction = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'asc';\n var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'gpm-official';\n return this.byCommon(direction, data);\n }\n }, {\n key: \"byReleaseDate\",\n value: function byReleaseDate() {\n var direction = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'asc';\n var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'gpm-release-date';\n var elements = this.getElements().sort(function (a, b) {\n var A = new Date(jquery__WEBPACK_IMPORTED_MODULE_0___default()(a).data(data)).getTime();\n var B = new Date(jquery__WEBPACK_IMPORTED_MODULE_0___default()(b).data(data)).getTime();\n return Sorter.sort(A, B, direction === 'asc' ? 'desc' : 'asc');\n });\n elements.appendTo(this.container);\n }\n }, {\n key: \"byUpdatable\",\n value: function byUpdatable() {\n var direction = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'asc';\n var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'gpm-updatable';\n return this.byCommon(direction, data);\n }\n }, {\n key: \"byEnabled\",\n value: function byEnabled() {\n var direction = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'asc';\n var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'gpm-enabled';\n return this.byCommon(direction, data);\n }\n }, {\n key: \"byTesting\",\n value: function byTesting() {\n var direction = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'asc';\n var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'gpm-testing';\n return this.byCommon(direction, data);\n }\n }], [{\n key: \"sort\",\n value: function sort(A, B) {\n var direction = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'asc';\n\n if (A > B) {\n return direction === 'asc' ? 1 : -1;\n }\n\n if (A < B) {\n return direction === 'asc' ? -1 : 1;\n }\n\n return 0;\n }\n }]);\n\n return Sorter;\n}();\n\nvar Packages = /*#__PURE__*/function () {\n function Packages() {\n _classCallCheck(this, Packages);\n\n this.Sort = new Sorter();\n }\n\n _createClass(Packages, [{\n key: \"addDependenciesToList\",\n value: function addDependenciesToList(dependencies) {\n var slug = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n dependencies.forEach(function (dependency) {\n Packages.addDependencyToList('plugin', dependency.name || dependency, slug);\n });\n }\n }, {\n key: \"removePackage\",\n value: function removePackage(type, slug) {\n var _this = this;\n\n var url = Packages.getRemovePackageUrl(type);\n (0,_utils_request__WEBPACK_IMPORTED_MODULE_2__.default)(url, {\n method: 'post',\n body: {\n \"package\": slug\n }\n }, function (response) {\n if (response.status === 'success') {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.remove-package-confirm').addClass('hidden');\n\n if (response.dependencies && response.dependencies.length > 0) {\n _this.addDependenciesToList(response.dependencies);\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.remove-package-dependencies').removeClass('hidden');\n } else {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.remove-package-done').removeClass('hidden');\n } // The package was removed. When the modal closes, move to the packages list\n\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(document).on('closing', '[data-remodal-id=\"remove-package\"]', function () {\n Packages.getBackToList(type);\n });\n } else {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.remove-package-confirm').addClass('hidden');\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.remove-package-error').removeClass('hidden');\n }\n });\n }\n }, {\n key: \"reinstallPackage\",\n value: function reinstallPackage(type, slug, package_name, current_version) {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.button-bar button').addClass('hidden');\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.button-bar .spinning-wheel').removeClass('hidden');\n var url = Packages.getReinstallPackageUrl(type);\n (0,_utils_request__WEBPACK_IMPORTED_MODULE_2__.default)(url, {\n method: 'post',\n body: {\n slug: slug,\n type: type,\n package_name: package_name,\n current_version: current_version\n }\n }, function (response) {\n if (response.status === 'success') {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.reinstall-package-confirm').addClass('hidden');\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.reinstall-package-done').removeClass('hidden');\n } else {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.reinstall-package-confirm').addClass('hidden');\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.reinstall-package-error').removeClass('hidden');\n }\n\n window.location.reload();\n });\n }\n }, {\n key: \"removeDependency\",\n value: function removeDependency(type, slug, button) {\n var _this2 = this;\n\n var url = Packages.getRemovePackageUrl(type);\n (0,_utils_request__WEBPACK_IMPORTED_MODULE_2__.default)(url, {\n method: 'post',\n body: {\n \"package\": slug\n }\n }, function (response) {\n if (response.status === 'success') {\n button.removeClass('button');\n button.replaceWith(jquery__WEBPACK_IMPORTED_MODULE_0___default()('Removed successfully'));\n\n if (response.dependencies && response.dependencies.length > 0) {\n _this2.addDependenciesToList(response.dependencies, slug);\n }\n }\n });\n }\n }, {\n key: \"getPackagesDependencies\",\n value: function getPackagesDependencies(type, slugs, finishedLoadingCallback) {\n var url = Packages.getGetPackagesDependenciesUrl(type);\n (0,_utils_request__WEBPACK_IMPORTED_MODULE_2__.default)(url, {\n method: 'post',\n body: {\n packages: slugs\n }\n }, function (response) {\n finishedLoadingCallback();\n\n if (response.status === 'success') {\n if (response.dependencies) {\n var hasDependencies = false;\n\n for (var dependency in response.dependencies) {\n if (response.dependencies.hasOwnProperty(dependency)) {\n if (dependency === 'grav') {\n continue;\n }\n\n hasDependencies = true;\n var dependencyName = dependency;\n var action = response.dependencies[dependency];\n Packages.addNeededDependencyToList(action, dependencyName);\n }\n }\n\n if (hasDependencies) {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal] .install-dependencies-package-container').removeClass('hidden');\n } else {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal] .install-package-container').removeClass('hidden');\n }\n } else {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal] .install-package-container').removeClass('hidden');\n }\n } else {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal] .install-package-error').removeClass('hidden');\n }\n });\n }\n }, {\n key: \"installDependenciesOfPackages\",\n value: function installDependenciesOfPackages(type, slugs, callbackSuccess, callbackError) {\n var url = Packages.getInstallDependenciesOfPackagesUrl(type);\n (0,_utils_request__WEBPACK_IMPORTED_MODULE_2__.default)(url, {\n method: 'post',\n body: {\n packages: slugs\n }\n }, callbackSuccess);\n }\n }, {\n key: \"installPackages\",\n value: function installPackages(type, slugs, callbackSuccess) {\n var url = Packages.getInstallPackageUrl(type);\n es6_promise__WEBPACK_IMPORTED_MODULE_4__.Promise.all(slugs.map(function (slug) {\n return new es6_promise__WEBPACK_IMPORTED_MODULE_4__.Promise(function (resolve, reject) {\n (0,_utils_request__WEBPACK_IMPORTED_MODULE_2__.default)(url, {\n method: 'post',\n body: {\n \"package\": slug,\n type: type\n }\n }, function (response) {\n resolve(response);\n });\n });\n })).then(callbackSuccess);\n }\n }, {\n key: \"handleGettingPackageDependencies\",\n value: function handleGettingPackageDependencies(type, event) {\n var action = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'update';\n var slugs = Packages.getSlugsFromEvent(event);\n\n if (!slugs) {\n alert('No slug set');\n return;\n } // Cleanup\n\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.packages-names-list').html('');\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.install-dependencies-package-container li').remove();\n slugs.forEach(function (slug) {\n if (action === 'update') {\n var current_version = '';\n var available_version = '';\n var _name = '';\n var resources = _utils_gpm__WEBPACK_IMPORTED_MODULE_3__.Instance.payload.payload.resources;\n\n if (resources.plugins[slug]) {\n available_version = resources.plugins[slug].available;\n current_version = resources.plugins[slug].version;\n _name = resources.plugins[slug].name;\n } else if (resources.themes[slug]) {\n available_version = resources.themes[slug].available;\n current_version = resources.themes[slug].version;\n _name = resources.themes[slug].name;\n }\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.packages-names-list').append(\"
                • \".concat(_name ? _name : slug, \", \").concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.FROM, \" v\").concat(current_version, \" \").concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.TO, \" v\").concat(available_version, \"
                • \"));\n } else {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.packages-names-list').append(\"
                • \".concat(name ? name : slug, \"
                • \"));\n }\n });\n event.preventDefault();\n event.stopPropagation(); // fix mismatching types when sharing install modal between plugins/themes\n\n var query = '[data-packages-modal] [data-theme-action], [data-packages-modal] [data-plugin-action]';\n var data = jquery__WEBPACK_IMPORTED_MODULE_0___default()(query).data('themeAction') || jquery__WEBPACK_IMPORTED_MODULE_0___default()(query).data('pluginAction');\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(query).removeAttr('data-theme-action').removeAttr('data-plugin-action').attr(\"data-\".concat(type, \"-action\"), data); // Restore original state\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal] .loading').removeClass('hidden');\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal] .install-dependencies-package-container').addClass('hidden');\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal] .install-package-container').addClass('hidden');\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal] .installing-dependencies').addClass('hidden');\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal] .installing-package').addClass('hidden');\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal] .installation-complete').addClass('hidden');\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal] .install-package-error').addClass('hidden');\n this.getPackagesDependencies(type, slugs, function () {\n var slugs_string = slugs.join();\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"[data-packages-modal] [data-\".concat(type, \"-action=\\\"install-dependencies-and-package\\\"]\")).attr('data-packages-slugs', slugs_string);\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"[data-packages-modal] [data-\".concat(type, \"-action=\\\"install-package\\\"]\")).attr('data-packages-slugs', slugs_string);\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal] .loading').addClass('hidden');\n });\n }\n }, {\n key: \"handleInstallingDependenciesAndPackage\",\n value: function handleInstallingDependenciesAndPackage(type, event) {\n var _this3 = this;\n\n var slugs = Packages.getSlugsFromEvent(event);\n event.preventDefault();\n event.stopPropagation();\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal] .install-dependencies-package-container').addClass('hidden');\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal] .install-package-container').addClass('hidden');\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal] .installing-dependencies').removeClass('hidden');\n this.installDependenciesOfPackages(type, slugs, function (response) {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal] .installing-dependencies').addClass('hidden');\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal] .installing-package').removeClass('hidden');\n\n _this3.installPackages(type, slugs, function () {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal] .installing-package').addClass('hidden');\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal] .installation-complete').removeClass('hidden');\n\n if (response.status === 'error') {\n var remodal = (jquery__WEBPACK_IMPORTED_MODULE_0___default().remodal.lookup)[jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal]').data('remodal')];\n remodal.close();\n return;\n }\n\n setTimeout(function () {\n if (slugs.length === 1) {\n __webpack_require__.g.location.href = \"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.base_url_relative, \"/\").concat(type, \"s/\").concat(slugs[0]);\n } else {\n __webpack_require__.g.location.href = \"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.base_url_relative, \"/\").concat(type, \"s\");\n }\n }, 1000);\n });\n });\n }\n }, {\n key: \"handleInstallingPackage\",\n value: function handleInstallingPackage(type, event) {\n var slugs = Packages.getSlugsFromEvent(event);\n event.preventDefault();\n event.stopPropagation();\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal] .install-package-container').addClass('hidden');\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal] .installing-package').removeClass('hidden');\n this.installPackages(type, slugs, function (response) {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal] .installing-package').addClass('hidden');\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal] .installation-complete').removeClass('hidden');\n var errors = Array.from(response).filter(function (r) {\n return r.status === 'error';\n });\n\n if (errors && errors.length) {\n var remodal = (jquery__WEBPACK_IMPORTED_MODULE_0___default().remodal.lookup)[jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-packages-modal].remodal-is-opened').data('remodal')];\n remodal.close();\n return;\n }\n\n if (slugs.length === 1) {\n __webpack_require__.g.location.href = \"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.base_url_relative, \"/\").concat(type, \"s/\").concat(slugs[0]);\n } else {\n __webpack_require__.g.location.href = \"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.base_url_relative, \"/\").concat(type, \"s\");\n }\n });\n }\n }, {\n key: \"handleRemovingPackage\",\n value: function handleRemovingPackage(type, event) {\n var slug = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.target).attr('data-packages-slugs');\n event.preventDefault();\n event.stopPropagation();\n this.removePackage(type, slug);\n }\n }, {\n key: \"handleReinstallPackage\",\n value: function handleReinstallPackage(type, event) {\n var target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.target);\n var slug = target.attr('data-package-slug');\n var package_name = target.attr('data-package-name');\n var current_version = target.attr('data-package-current-version');\n event.preventDefault();\n event.stopPropagation();\n this.reinstallPackage(type, slug, package_name, current_version);\n }\n }, {\n key: \"handleRemovingDependency\",\n value: function handleRemovingDependency(type, event) {\n var slug = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.target).attr('data-dependency-slug');\n var button = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.target);\n event.preventDefault();\n event.stopPropagation();\n this.removeDependency(type, slug, button);\n }\n }], [{\n key: \"getBackToList\",\n value: function getBackToList(type) {\n __webpack_require__.g.location.href = \"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.base_url_relative, \"/\").concat(type, \"s\");\n }\n }, {\n key: \"addDependencyToList\",\n value: function addDependencyToList(type, dependency) {\n var slug = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n\n if (['admin', 'form', 'login', 'email', 'grav'].indexOf(dependency) !== -1) {\n return;\n }\n\n var container = jquery__WEBPACK_IMPORTED_MODULE_0___default()('.package-dependencies-container');\n var text = \"\".concat(dependency, \" Remove\");\n\n if (slug) {\n text += \" (was needed by \".concat(slug, \")\");\n }\n\n container.append(\"
                • \".concat(text, \"
                • \"));\n }\n }, {\n key: \"getTaskUrl\",\n value: function getTaskUrl(type, task) {\n var url = \"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.base_url_relative);\n url += \"/\".concat(type, \"s.json\");\n url += \"/task\".concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.config.param_sep).concat(task);\n return url;\n }\n }, {\n key: \"getRemovePackageUrl\",\n value: function getRemovePackageUrl(type) {\n return \"\".concat(Packages.getTaskUrl(type, 'removePackage'));\n }\n }, {\n key: \"getReinstallPackageUrl\",\n value: function getReinstallPackageUrl(type) {\n return \"\".concat(Packages.getTaskUrl(type, 'reinstallPackage'));\n }\n }, {\n key: \"getGetPackagesDependenciesUrl\",\n value: function getGetPackagesDependenciesUrl(type) {\n return \"\".concat(Packages.getTaskUrl(type, 'getPackagesDependencies'));\n }\n }, {\n key: \"getInstallDependenciesOfPackagesUrl\",\n value: function getInstallDependenciesOfPackagesUrl(type) {\n return \"\".concat(Packages.getTaskUrl(type, 'installDependenciesOfPackages'));\n }\n }, {\n key: \"getInstallPackageUrl\",\n value: function getInstallPackageUrl(type) {\n return \"\".concat(Packages.getTaskUrl(type, 'installPackage'));\n }\n }, {\n key: \"addNeededDependencyToList\",\n value: function addNeededDependencyToList(action, slug) {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.install-dependencies-package-container .type-' + action).removeClass('hidden');\n var list = jquery__WEBPACK_IMPORTED_MODULE_0___default()('.install-dependencies-package-container .type-' + action + ' ul');\n\n if (action !== 'install') {\n var current_version = '';\n var available_version = '';\n var _name2 = '';\n var resources = _utils_gpm__WEBPACK_IMPORTED_MODULE_3__.Instance.payload.payload.resources;\n\n if (resources.plugins[slug]) {\n available_version = resources.plugins[slug].available;\n current_version = resources.plugins[slug].version;\n _name2 = resources.plugins[slug].name;\n } else if (resources.themes[slug]) {\n available_version = resources.themes[slug].available;\n current_version = resources.themes[slug].version;\n _name2 = resources.themes[slug].name;\n }\n\n list.append(\"
                • \".concat(_name2 ? _name2 : slug, \", \").concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.FROM, \" v\").concat(current_version, \" \").concat(grav_config__WEBPACK_IMPORTED_MODULE_1__.translations.PLUGIN_ADMIN.TO, \" v\").concat(available_version, \"
                • \"));\n } else {\n list.append(\"
                • \".concat(name ? name : slug, \"
                • \"));\n }\n }\n }, {\n key: \"getSlugsFromEvent\",\n value: function getSlugsFromEvent(event) {\n var slugs = '';\n\n if (jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.target).is('[data-packages-slugs]')) {\n slugs = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.target).attr('data-packages-slugs');\n } else {\n slugs = jquery__WEBPACK_IMPORTED_MODULE_0___default()(event.target).parent('[data-packages-slugs]').attr('data-packages-slugs');\n }\n\n if (typeof slugs === 'undefined') {\n return null;\n }\n\n slugs = slugs.split(',');\n return typeof slugs === 'string' ? [slugs] : slugs;\n }\n }]);\n\n return Packages;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (new Packages());//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL3V0aWxzL3BhY2thZ2VzLmpzP2VhZWEiXSwibmFtZXMiOlsiU29ydGVyIiwiZWxlbWVudHMiLCJjb250YWluZXIiLCIkIiwiZGlyZWN0aW9uIiwiZGF0YSIsImdldEVsZW1lbnRzIiwic29ydCIsImEiLCJiIiwiQSIsInRvU3RyaW5nIiwidG9Mb3dlckNhc2UiLCJCIiwiYXBwZW5kVG8iLCJieUNvbW1vbiIsIkRhdGUiLCJnZXRUaW1lIiwiUGFja2FnZXMiLCJTb3J0IiwiZGVwZW5kZW5jaWVzIiwic2x1ZyIsImZvckVhY2giLCJkZXBlbmRlbmN5IiwiYWRkRGVwZW5kZW5jeVRvTGlzdCIsIm5hbWUiLCJ0eXBlIiwidXJsIiwiZ2V0UmVtb3ZlUGFja2FnZVVybCIsInJlcXVlc3QiLCJtZXRob2QiLCJib2R5IiwicmVzcG9uc2UiLCJzdGF0dXMiLCJhZGRDbGFzcyIsImxlbmd0aCIsImFkZERlcGVuZGVuY2llc1RvTGlzdCIsInJlbW92ZUNsYXNzIiwiZG9jdW1lbnQiLCJvbiIsImdldEJhY2tUb0xpc3QiLCJwYWNrYWdlX25hbWUiLCJjdXJyZW50X3ZlcnNpb24iLCJnZXRSZWluc3RhbGxQYWNrYWdlVXJsIiwid2luZG93IiwibG9jYXRpb24iLCJyZWxvYWQiLCJidXR0b24iLCJyZXBsYWNlV2l0aCIsInNsdWdzIiwiZmluaXNoZWRMb2FkaW5nQ2FsbGJhY2siLCJnZXRHZXRQYWNrYWdlc0RlcGVuZGVuY2llc1VybCIsInBhY2thZ2VzIiwiaGFzRGVwZW5kZW5jaWVzIiwiaGFzT3duUHJvcGVydHkiLCJkZXBlbmRlbmN5TmFtZSIsImFjdGlvbiIsImFkZE5lZWRlZERlcGVuZGVuY3lUb0xpc3QiLCJjYWxsYmFja1N1Y2Nlc3MiLCJjYWxsYmFja0Vycm9yIiwiZ2V0SW5zdGFsbERlcGVuZGVuY2llc09mUGFja2FnZXNVcmwiLCJnZXRJbnN0YWxsUGFja2FnZVVybCIsIlByb21pc2UiLCJtYXAiLCJyZXNvbHZlIiwicmVqZWN0IiwidGhlbiIsImV2ZW50IiwiZ2V0U2x1Z3NGcm9tRXZlbnQiLCJhbGVydCIsImh0bWwiLCJyZW1vdmUiLCJhdmFpbGFibGVfdmVyc2lvbiIsInJlc291cmNlcyIsImdwbSIsInBsdWdpbnMiLCJhdmFpbGFibGUiLCJ2ZXJzaW9uIiwidGhlbWVzIiwiYXBwZW5kIiwidHJhbnNsYXRpb25zIiwicHJldmVudERlZmF1bHQiLCJzdG9wUHJvcGFnYXRpb24iLCJxdWVyeSIsInJlbW92ZUF0dHIiLCJhdHRyIiwiZ2V0UGFja2FnZXNEZXBlbmRlbmNpZXMiLCJzbHVnc19zdHJpbmciLCJqb2luIiwiaW5zdGFsbERlcGVuZGVuY2llc09mUGFja2FnZXMiLCJpbnN0YWxsUGFja2FnZXMiLCJyZW1vZGFsIiwiY2xvc2UiLCJzZXRUaW1lb3V0IiwiZ2xvYmFsIiwiaHJlZiIsImNvbmZpZyIsImVycm9ycyIsIkFycmF5IiwiZnJvbSIsImZpbHRlciIsInIiLCJ0YXJnZXQiLCJyZW1vdmVQYWNrYWdlIiwicmVpbnN0YWxsUGFja2FnZSIsInJlbW92ZURlcGVuZGVuY3kiLCJpbmRleE9mIiwidGV4dCIsInRhc2siLCJnZXRUYXNrVXJsIiwibGlzdCIsImlzIiwicGFyZW50Iiwic3BsaXQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0lBRU1BLE07Ozs7Ozs7V0FDRixxQkFBWUMsUUFBWixFQUFzQkMsU0FBdEIsRUFBaUM7QUFDN0IsV0FBS0QsUUFBTCxHQUFnQkEsUUFBUSxJQUFJRSw2Q0FBQyxDQUFDLHFDQUFELENBQTdCO0FBQ0EsV0FBS0QsU0FBTCxHQUFpQkEsU0FBUyxJQUFJQyw2Q0FBQyxDQUFDLDhEQUFELENBQS9CO0FBQ0EsYUFBTyxLQUFLRixRQUFaO0FBQ0g7OztXQVNELG9CQUF1QztBQUFBLFVBQTlCRyxTQUE4Qix1RUFBbEIsS0FBa0I7QUFBQSxVQUFYQyxJQUFXLHVFQUFKLEVBQUk7QUFDbkMsVUFBSUosUUFBUSxHQUFHLEtBQUtLLFdB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bnRlbnQiOlsiaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCB7IGNvbmZpZywgdHJhbnNsYXRpb25zIH0gZnJvbSAnZ3Jhdi1jb25maWcnO1xuaW1wb3J0IHJlcXVlc3QgZnJvbSAnLi4vdXRpbHMvcmVxdWVzdCc7XG5pbXBvcnQgeyBJbnN0YW5jZSBhcyBncG0gfSBmcm9tICcuLi91dGlscy9ncG0nO1xuaW1wb3J0IHsgUHJvbWlzZSB9IGZyb20gJ2VzNi1wcm9taXNlJztcblxuY2xhc3MgU29ydGVyIHtcbiAgICBnZXRFbGVtZW50cyhlbGVtZW50cywgY29udGFpbmVyKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudHMgPSBlbGVtZW50cyB8fCAkKCdbZGF0YS1ncG0tcGx1Z2luXSwgW2RhdGEtZ3BtLXRoZW1lXScpO1xuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lciB8fCAkKCcuZ3BtLXBsdWdpbnMgPiB0YWJsZSA+IHRib2R5LCAuZ3BtLXRoZW1lcyA+IC50aGVtZXMuY2FyZC1yb3cnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudHM7XG4gICAgfVxuXG4gICAgc3RhdGljIHNvcnQoQSwgQiwgZGlyZWN0aW9uID0gJ2FzYycpIHtcbiAgICAgICAgaWYgKEEgPiBCKSB7IHJldHVybiAoZGlyZWN0aW9uID09PSAnYXNjJykgPyAxIDogLTE7IH1cbiAgICAgICAgaWYgKEEgPCBCKSB7IHJldHVybiAoZGlyZWN0aW9uID09PSAnYXNjJykgPyAtMSA6IDE7IH1cblxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBieUNvbW1vbihkaXJlY3Rpb24gPSAnYXNjJywgZGF0YSA9ICcnKSB7XG4gICAgICAgIGxldCBlbGVtZW50cyA9IHRoaXMuZ2V0RWxlbWVudHMoKS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICBsZXQgQSA9ICQoYSkuZGF0YShkYXRhKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBsZXQgQiA9ICQoYikuZGF0YShkYXRhKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgIHJldHVybiBTb3J0ZXIuc29ydChBLCBCLCBkaXJlY3Rpb24pO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZWxlbWVudHMuYXBwZW5kVG8odGhpcy5jb250YWluZXIpO1xuICAgIH1cblxuICAgIGJ5TmFtZShkaXJlY3Rpb24gPSAnYXNjJywgZGF0YSA9ICdncG0tbmFtZScpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnlDb21tb24oZGlyZWN0aW9uLCBkYXRhKTtcbiAgICB9XG5cbiAgICBieUF1dGhvcihkaXJlY3Rpb24gPSAnYXNjJywgZGF0YSA9ICdncG0tYXV0aG9yJykge1xuICAgICAgICByZXR1cm4gdGhpcy5ieUNvbW1vbihkaXJlY3Rpb24sIGRhdGEpO1xuICAgIH1cblxuICAgIGJ5T2ZmaWNpYWwoZGlyZWN0aW9uID0gJ2FzYycsIGRhdGEgPSAnZ3BtLW9mZmljaWFsJykge1xuICAgICAgICByZXR1cm4gdGhpcy5ieUNvbW1vbihkaXJlY3Rpb24sIGRhdGEpO1xuICAgIH1cblxuICAgIGJ5UmVsZWFzZURhdGUoZGlyZWN0aW9uID0gJ2FzYycsIGRhdGEgPSAnZ3BtLXJlbGVhc2UtZGF0ZScpIHtcbiAgICAgICAgbGV0IGVsZW1lbnRzID0gdGhpcy5nZXRFbGVtZW50cygpLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgIGxldCBBID0gbmV3IERhdGUoJChhKS5kYXRhKGRhdGEpKS5nZXRUaW1lKCk7XG4gICAgICAgICAgICBsZXQgQiA9IG5ldyBEYXRlKCQoYikuZGF0YShkYXRhKSkuZ2V0VGltZSgpO1xuXG4gICAgICAgICAgICByZXR1cm4gU29ydGVyLnNvcnQoQSwgQiwgZGlyZWN0aW9uID09PSAnYXNjJyA/ICdkZXNjJyA6ICdhc2MnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZWxlbWVudHMuYXBwZW5kVG8odGhpcy5jb250YWluZXIpO1xuICAgIH1cblxuICAgIGJ5VXBkYXRhYmxlKGRpcmVjdGlvbiA9ICdhc2MnLCBkYXRhID0gJ2dwbS11cGRhdGFibGUnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ5Q29tbW9uKGRpcmVjdGlvbiwgZGF0YSk7XG4gICAgfVxuXG4gICAgYnlFbmFibGVkKGRpcmVjdGlvbiA9ICdhc2MnLCBkYXRhID0gJ2dwbS1lbmFibGVkJykge1xuICAgICAgICByZXR1cm4gdGhpcy5ieUNvbW1vbihkaXJlY3Rpb24sIGRhdGEpO1xuICAgIH1cblxuICAgIGJ5VGVzdGluZyhkaXJlY3Rpb24gPSAnYXNjJywgZGF0YSA9ICdncG0tdGVzdGluZycpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnlDb21tb24oZGlyZWN0aW9uLCBkYXRhKTtcbiAgICB9XG59XG5cbmNsYXNzIFBhY2thZ2VzIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5Tb3J0ID0gbmV3IFNvcnRlcigpO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXRCYWNrVG9MaXN0KHR5cGUpIHtcbiAgICAgICAgZ2xvYmFsLmxvY2F0aW9uLmhyZWYgPSBgJHtjb25maWcuYmFzZV91cmxfcmVsYXRpdmV9LyR7dHlwZX1zYDtcbiAgICB9XG5cbiAgICBzdGF0aWMgYWRkRGVwZW5kZW5jeVRvTGlzdCh0eXBlLCBkZXBlbmRlbmN5LCBzbHVnID0gJycpIHtcbiAgICAgICAgaWYgKFsnYWRtaW4nLCAnZm9ybScsICdsb2dpbicsICdlbWFpbCcsICdncmF2J10uaW5kZXhPZihkZXBlbmRlbmN5KSAhPT0gLTEpIHsgcmV0dXJuOyB9XG4gICAgICAgIGxldCBjb250YWluZXIgPSAkKCcucGFja2FnZS1kZXBlbmRlbmNpZXMtY29udGFpbmVyJyk7XG4gICAgICAgIGxldCB0ZXh0ID0gYCR7ZGVwZW5kZW5jeX0gPGEgaHJlZj1cIiNcIiBjbGFzcz1cImJ1dHRvblwiIGRhdGEtZGVwZW5kZW5jeS1zbHVnPVwiJHtkZXBlbmRlbmN5fVwiIGRhdGEtJHt0eXBlfS1hY3Rpb249XCJyZW1vdmUtZGVwZW5kZW5jeS1wYWNrYWdlXCI+UmVtb3ZlPC9hPmA7XG5cbiAgICAgICAgaWYgKHNsdWcpIHtcbiAgICAgICAgICAgIHRleHQgKz0gYCAod2FzIG5lZWRlZCBieSAke3NsdWd9KWA7XG4gICAgICAgIH1cblxuICAgICAgICBjb250YWluZXIuYXBwZW5kKGA8bGk+JHt0ZXh0fTwvbGk+YCk7XG4gICAgfVxuXG4gICAgYWRkRGVwZW5kZW5jaWVzVG9MaXN0KGRlcGVuZGVuY2llcywgc2x1ZyA9ICcnKSB7XG4gICAgICAgIGRlcGVuZGVuY2llcy5mb3JFYWNoKChkZXBlbmRlbmN5KSA9PiB7XG4gICAgICAgICAgICBQYWNrYWdlcy5hZGREZXBlbmRlbmN5VG9MaXN0KCdwbHVnaW4nLCBkZXBlbmRlbmN5Lm5hbWUgfHwgZGVwZW5kZW5jeSwgc2x1Zyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXRUYXNrVXJsKHR5cGUsIHRhc2spIHtcbiAgICAgICAgbGV0IHVybCA9IGAke2NvbmZpZy5iYXNlX3VybF9yZWxhdGl2ZX1gO1xuICAgICAgICB1cmwgKz0gYC8ke3R5cGV9cy5qc29uYDtcbiAgICAgICAgdXJsICs9IGAvdGFzayR7Y29uZmlnLnBhcmFtX3NlcH0ke3Rhc2t9YDtcbiAgICAgICAgcmV0dXJuIHVybDtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0UmVtb3ZlUGFja2FnZVVybCh0eXBlKSB7XG4gICAgICAgIHJldHVybiBgJHtQYWNrYWdlcy5nZXRUYXNrVXJsKHR5cGUsICdyZW1vdmVQYWNrYWdlJyl9YDtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0UmVpbnN0YWxsUGFja2FnZVVybCh0eXBlKSB7XG4gICAgICAgIHJldHVybiBgJHtQYWNrYWdlcy5nZXRUYXNrVXJsKHR5cGUsICdyZWluc3RhbGxQYWNrYWdlJyl9YDtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0R2V0UGFja2FnZXNEZXBlbmRlbmNpZXNVcmwodHlwZSkge1xuICAgICAgICByZXR1cm4gYCR7UGFja2FnZXMuZ2V0VGFza1VybCh0eXBlLCAnZ2V0UGFja2FnZXNEZXBlbmRlbmNpZXMnKX1gO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXRJbnN0YWxsRGVwZW5kZW5jaWVzT2ZQYWNrYWdlc1VybCh0eXBlKSB7XG4gICAgICAgIHJldHVybiBgJHtQYWNrYWdlcy5nZXRUYXNrVXJsKHR5cGUsICdpbnN0YWxsRGVwZW5kZW5jaWVzT2ZQYWNrYWdlcycpfWA7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldEluc3RhbGxQYWNrYWdlVXJsKHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIGAke1BhY2thZ2VzLmdldFRhc2tVcmwodHlwZSwgJ2luc3RhbGxQYWNrYWdlJyl9YDtcbiAgICB9XG5cbiAgICByZW1vdmVQYWNrYWdlKHR5cGUsIHNsdWcpIHtcbiAgICAgICAgbGV0IHVybCA9IFBhY2thZ2VzLmdldFJlbW92ZVBhY2thZ2VVcmwodHlwZSk7XG5cbiAgICAgICAgcmVxdWVzdCh1cmwsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ3Bvc3QnLFxuICAgICAgICAgICAgYm9keToge1xuICAgICAgICAgICAgICAgIHBhY2thZ2U6IHNsdWdcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSAnc3VjY2VzcycpIHtcbiAgICAgICAgICAgICAgICAkKCcucmVtb3ZlLXBhY2thZ2UtY29uZmlybScpLmFkZENsYXNzKCdoaWRkZW4nKTtcblxuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5kZXBlbmRlbmNpZXMgJiYgcmVzcG9uc2UuZGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGREZXBlbmRlbmNpZXNUb0xpc3QocmVzcG9uc2UuZGVwZW5kZW5jaWVzKTtcbiAgICAgICAgICAgICAgICAgICAgJCgnLnJlbW92ZS1wYWNrYWdlLWRlcGVuZGVuY2llcycpLnJlbW92ZUNsYXNzKCdoaWRkZW4nKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAkKCcucmVtb3ZlLXBhY2thZ2UtZG9uZScpLnJlbW92ZUNsYXNzKCdoaWRkZW4nKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBUaGUgcGFja2FnZSB3YXMgcmVtb3ZlZC4gV2hlbiB0aGUgbW9kYWwgY2xvc2VzLCBtb3ZlIHRvIHRoZSBwYWNrYWdlcyBsaXN0XG4gICAgICAgICAgICAgICAgJChkb2N1bWVudCkub24oJ2Nsb3NpbmcnLCAnW2RhdGEtcmVtb2RhbC1pZD1cInJlbW92ZS1wYWNrYWdlXCJdJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBQYWNrYWdlcy5nZXRCYWNrVG9MaXN0KHR5cGUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAkKCcucmVtb3ZlLXBhY2thZ2UtY29uZmlybScpLmFkZENsYXNzKCdoaWRkZW4nKTtcbiAgICAgICAgICAgICAgICAkKCcucmVtb3ZlLXBhY2thZ2UtZXJyb3InKS5yZW1vdmVDbGFzcygnaGlkZGVuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlaW5zdGFsbFBhY2thZ2UodHlwZSwgc2x1ZywgcGFja2FnZV9uYW1lLCBjdXJyZW50X3ZlcnNpb24pIHtcbiAgICAgICAgJCgnLmJ1dHRvbi1iYXIgYnV0dG9uJykuYWRkQ2xhc3MoJ2hpZGRlbicpO1xuICAgICAgICAkKCcuYnV0dG9uLWJhciAuc3Bpbm5pbmctd2hlZWwnKS5yZW1vdmVDbGFzcygnaGlkZGVuJyk7XG5cbiAgICAgICAgbGV0IHVybCA9IFBhY2thZ2VzLmdldFJlaW5zdGFsbFBhY2thZ2VVcmwodHlwZSk7XG5cbiAgICAgICAgcmVxdWVzdCh1cmwsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ3Bvc3QnLFxuICAgICAgICAgICAgYm9keToge1xuICAgICAgICAgICAgICAgIHNsdWc6IHNsdWcsXG4gICAgICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgICAgICBwYWNrYWdlX25hbWU6IHBhY2thZ2VfbmFtZSxcbiAgICAgICAgICAgICAgICBjdXJyZW50X3ZlcnNpb246IGN1cnJlbnRfdmVyc2lvblxuICAgICAgICAgICAgfVxuICAgICAgICB9LCAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09ICdzdWNjZXNzJykge1xuICAgICAgICAgICAgICAgICQoJy5yZWluc3RhbGwtcGFja2FnZS1jb25maXJtJykuYWRkQ2xhc3MoJ2hpZGRlbicpO1xuICAgICAgICAgICAgICAgICQoJy5yZWluc3RhbGwtcGFja2FnZS1kb25lJykucmVtb3ZlQ2xhc3MoJ2hpZGRlbicpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAkKCcucmVpbnN0YWxsLXBhY2thZ2UtY29uZmlybScpLmFkZENsYXNzKCdoaWRkZW4nKTtcbiAgICAgICAgICAgICAgICAkKCcucmVpbnN0YWxsLXBhY2thZ2UtZXJyb3InKS5yZW1vdmVDbGFzcygnaGlkZGVuJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmVtb3ZlRGVwZW5kZW5jeSh0eXBlLCBzbHVnLCBidXR0b24pIHtcbiAgICAgICAgbGV0IHVybCA9IFBhY2thZ2VzLmdldFJlbW92ZVBhY2thZ2VVcmwodHlwZSk7XG5cbiAgICAgICAgcmVxdWVzdCh1cmwsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ3Bvc3QnLFxuICAgICAgICAgICAgYm9keToge1xuICAgICAgICAgICAgICAgIHBhY2thZ2U6IHNsdWdcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSAnc3VjY2VzcycpIHtcbiAgICAgICAgICAgICAgICBidXR0b24ucmVtb3ZlQ2xhc3MoJ2J1dHRvbicpO1xuICAgICAgICAgICAgICAgIGJ1dHRvbi5yZXBsYWNlV2l0aCgkKCc8c3Bhbj5SZW1vdmVkIHN1Y2Nlc3NmdWxseTwvc3Bhbj4nKSk7XG5cbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuZGVwZW5kZW5jaWVzICYmIHJlc3BvbnNlLmRlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkRGVwZW5kZW5jaWVzVG9MaXN0KHJlc3BvbnNlLmRlcGVuZGVuY2llcywgc2x1Zyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgYWRkTmVlZGVkRGVwZW5kZW5jeVRvTGlzdChhY3Rpb24sIHNsdWcpIHtcbiAgICAgICAgJCgnLmluc3RhbGwtZGVwZW5kZW5jaWVzLXBhY2thZ2UtY29udGFpbmVyIC50eXBlLScgKyBhY3Rpb24pLnJlbW92ZUNsYXNzKCdoaWRkZW4nKTtcbiAgICAgICAgbGV0IGxpc3QgPSAkKCcuaW5zdGFsbC1kZXBlbmRlbmNpZXMtcGFja2FnZS1jb250YWluZXIgLnR5cGUtJyArIGFjdGlvbiArICcgdWwnKTtcblxuICAgICAgICBpZiAoYWN0aW9uICE9PSAnaW5zdGFsbCcpIHtcbiAgICAgICAgICAgIGxldCBjdXJyZW50X3ZlcnNpb24gPSAnJztcbiAgICAgICAgICAgIGxldCBhdmFpbGFibGVfdmVyc2lvbiA9ICcnO1xuICAgICAgICAgICAgbGV0IG5hbWUgPSAnJztcblxuICAgICAgICAgICAgbGV0IHJlc291cmNlcyA9IGdwbS5wYXlsb2FkLnBheWxvYWQucmVzb3VyY2VzO1xuXG4gICAgICAgICAgICBpZiAocmVzb3VyY2VzLnBsdWdpbnNbc2x1Z10pIHtcbiAgICAgICAgICAgICAgICBhdmFpbGFibGVfdmVyc2lvbiA9IHJlc291cmNlcy5wbHVnaW5zW3NsdWddLmF2YWlsYWJsZTtcbiAgICAgICAgICAgICAgICBjdXJyZW50X3ZlcnNpb24gPSByZXNvdXJjZXMucGx1Z2luc1tzbHVnXS52ZXJzaW9uO1xuICAgICAgICAgICAgICAgIG5hbWUgPSByZXNvdXJjZXMucGx1Z2luc1tzbHVnXS5uYW1lO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNvdXJjZXMudGhlbWVzW3NsdWddKSB7XG4gICAgICAgICAgICAgICAgYXZhaWxhYmxlX3ZlcnNpb24gPSByZXNvdXJjZXMudGhlbWVzW3NsdWddLmF2YWlsYWJsZTtcbiAgICAgICAgICAgICAgICBjdXJyZW50X3ZlcnNpb24gPSByZXNvdXJjZXMudGhlbWVzW3NsdWddLnZlcnNpb247XG4gICAgICAgICAgICAgICAgbmFtZSA9IHJlc291cmNlcy50aGVtZXNbc2x1Z10ubmFtZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGlzdC5hcHBlbmQoYDxsaT4ke25hbWUgPyBuYW1lIDogc2x1Z30sICR7dHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5GUk9NfSB2PHN0cm9uZz4ke2N1cnJlbnRfdmVyc2lvbn08L3N0cm9uZz4gJHt0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLlRPfSB2PHN0cm9uZz4ke2F2YWlsYWJsZV92ZXJzaW9ufTwvc3Ryb25nPjwvbGk+YCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsaXN0LmFwcGVuZChgPGxpPiR7bmFtZSA/IG5hbWUgOiBzbHVnfTwvbGk+YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRQYWNrYWdlc0RlcGVuZGVuY2llcyh0eXBlLCBzbHVncywgZmluaXNoZWRMb2FkaW5nQ2FsbGJhY2spIHtcbiAgICAgICAgbGV0IHVybCA9IFBhY2thZ2VzLmdldEdldFBhY2thZ2VzRGVwZW5kZW5jaWVzVXJsKHR5cGUpO1xuXG4gICAgICAgIHJlcXVlc3QodXJsLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdwb3N0JyxcbiAgICAgICAgICAgIGJvZHk6IHtcbiAgICAgICAgICAgICAgICBwYWNrYWdlczogc2x1Z3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgKHJlc3BvbnNlKSA9PiB7XG5cbiAgICAgICAgICAgIGZpbmlzaGVkTG9hZGluZ0NhbGxiYWNrKCk7XG5cbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09ICdzdWNjZXNzJykge1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGhhc0RlcGVuZGVuY2llcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBkZXBlbmRlbmN5IGluIHJlc3BvbnNlLmRlcGVuZGVuY2llcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmRlcGVuZGVuY2llcy5oYXNPd25Qcm9wZXJ0eShkZXBlbmRlbmN5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXBlbmRlbmN5ID09PSAnZ3JhdicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0RlcGVuZGVuY2llcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRlcGVuZGVuY3lOYW1lID0gZGVwZW5kZW5jeTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWN0aW9uID0gcmVzcG9uc2UuZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFja2FnZXMuYWRkTmVlZGVkRGVwZW5kZW5jeVRvTGlzdChhY3Rpb24sIGRlcGVuZGVuY3lOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChoYXNEZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICQoJ1tkYXRhLXBhY2thZ2VzLW1vZGFsXSAuaW5zdGFsbC1kZXBlbmRlbmNpZXMtcGFja2FnZS1jb250YWluZXInKS5yZW1vdmVDbGFzcygnaGlkZGVuJyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkKCdbZGF0YS1wYWNrYWdlcy1tb2RhbF0gLmluc3RhbGwtcGFja2FnZS1jb250YWluZXInKS5yZW1vdmVDbGFzcygnaGlkZGVuJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAkKCdbZGF0YS1wYWNrYWdlcy1tb2RhbF0gLmluc3RhbGwtcGFja2FnZS1jb250YWluZXInKS5yZW1vdmVDbGFzcygnaGlkZGVuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAkKCdbZGF0YS1wYWNrYWdlcy1tb2RhbF0gLmluc3RhbGwtcGFja2FnZS1lcnJvcicpLnJlbW92ZUNsYXNzKCdoaWRkZW4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaW5zdGFsbERlcGVuZGVuY2llc09mUGFja2FnZXModHlwZSwgc2x1Z3MsIGNhbGxiYWNrU3VjY2VzcywgY2FsbGJhY2tFcnJvcikge1xuICAgICAgICBsZXQgdXJsID0gUGFja2FnZXMuZ2V0SW5zdGFsbERlcGVuZGVuY2llc09mUGFja2FnZXNVcmwodHlwZSk7XG5cbiAgICAgICAgcmVxdWVzdCh1cmwsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ3Bvc3QnLFxuICAgICAgICAgICAgYm9keToge1xuICAgICAgICAgICAgICAgIHBhY2thZ2VzOiBzbHVnc1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCBjYWxsYmFja1N1Y2Nlc3MpO1xuICAgIH1cblxuICAgIGluc3RhbGxQYWNrYWdlcyh0eXBlLCBzbHVncywgY2FsbGJhY2tTdWNjZXNzKSB7XG4gICAgICAgIGxldCB1cmwgPSBQYWNrYWdlcy5nZXRJbnN0YWxsUGFja2FnZVVybCh0eXBlKTtcblxuICAgICAgICBQcm9taXNlLmFsbChzbHVncy5tYXAoKHNsdWcpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgcmVxdWVzdCh1cmwsIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAncG9zdCcsXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2U6IHNsdWcsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB0eXBlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSkpLnRoZW4oY2FsbGJhY2tTdWNjZXNzKTtcblxuICAgIH1cblxuICAgIHN0YXRpYyBnZXRTbHVnc0Zyb21FdmVudChldmVudCkge1xuICAgICAgICBsZXQgc2x1Z3MgPSAnJztcbiAgICAgICAgaWYgKCQoZXZlbnQudGFyZ2V0KS5pcygnW2RhdGEtcGFja2FnZXMtc2x1Z3NdJykpIHtcbiAgICAgICAgICAgIHNsdWdzID0gJChldmVudC50YXJnZXQpLmF0dHIoJ2RhdGEtcGFja2FnZXMtc2x1Z3MnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNsdWdzID0gJChldmVudC50YXJnZXQpLnBhcmVudCgnW2RhdGEtcGFja2FnZXMtc2x1Z3NdJykuYXR0cignZGF0YS1wYWNrYWdlcy1zbHVncycpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBzbHVncyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgc2x1Z3MgPSBzbHVncy5zcGxpdCgnLCcpO1xuICAgICAgICByZXR1cm4gdHlwZW9mIHNsdWdzID09PSAnc3RyaW5nJyA/IFtzbHVnc10gOiBzbHVncztcbiAgICB9XG5cbiAgICBoYW5kbGVHZXR0aW5nUGFja2FnZURlcGVuZGVuY2llcyh0eXBlLCBldmVudCwgYWN0aW9uID0gJ3VwZGF0ZScpIHtcbiAgICAgICAgbGV0IHNsdWdzID0gUGFja2FnZXMuZ2V0U2x1Z3NGcm9tRXZlbnQoZXZlbnQpO1xuXG4gICAgICAgIGlmICghc2x1Z3MpIHtcbiAgICAgICAgICAgIGFsZXJ0KCdObyBzbHVnIHNldCcpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYW51cFxuICAgICAgICAkKCcucGFja2FnZXMtbmFtZXMtbGlzdCcpLmh0bWwoJycpO1xuICAgICAgICAkKCcuaW5zdGFsbC1kZXBlbmRlbmNpZXMtcGFja2FnZS1jb250YWluZXIgbGknKS5yZW1vdmUoKTtcblxuICAgICAgICBzbHVncy5mb3JFYWNoKChzbHVnKSA9PiB7XG4gICAgICAgICAgICBpZiAoYWN0aW9uID09PSAndXBkYXRlJykge1xuICAgICAgICAgICAgICAgIGxldCBjdXJyZW50X3ZlcnNpb24gPSAnJztcbiAgICAgICAgICAgICAgICBsZXQgYXZhaWxhYmxlX3ZlcnNpb24gPSAnJztcbiAgICAgICAgICAgICAgICBsZXQgbmFtZSA9ICcnO1xuXG4gICAgICAgICAgICAgICAgbGV0IHJlc291cmNlcyA9IGdwbS5wYXlsb2FkLnBheWxvYWQucmVzb3VyY2VzO1xuXG4gICAgICAgICAgICAgICAgaWYgKHJlc291cmNlcy5wbHVnaW5zW3NsdWddKSB7XG4gICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZV92ZXJzaW9uID0gcmVzb3VyY2VzLnBsdWdpbnNbc2x1Z10uYXZhaWxhYmxlO1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3ZlcnNpb24gPSByZXNvdXJjZXMucGx1Z2luc1tzbHVnXS52ZXJzaW9uO1xuICAgICAgICAgICAgICAgICAgICBuYW1lID0gcmVzb3VyY2VzLnBsdWdpbnNbc2x1Z10ubmFtZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc291cmNlcy50aGVtZXNbc2x1Z10pIHtcbiAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlX3ZlcnNpb24gPSByZXNvdXJjZXMudGhlbWVzW3NsdWddLmF2YWlsYWJsZTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF92ZXJzaW9uID0gcmVzb3VyY2VzLnRoZW1lc1tzbHVnXS52ZXJzaW9uO1xuICAgICAgICAgICAgICAgICAgICBuYW1lID0gcmVzb3VyY2VzLnRoZW1lc1tzbHVnXS5uYW1lO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICQoJy5wYWNrYWdlcy1uYW1lcy1saXN0JykuYXBwZW5kKGA8bGk+JHtuYW1lID8gbmFtZSA6IHNsdWd9LCAke3RyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uRlJPTX0gdjxzdHJvbmc+JHtjdXJyZW50X3ZlcnNpb259PC9zdHJvbmc+ICR7dHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5UT30gdjxzdHJvbmc+JHthdmFpbGFibGVfdmVyc2lvbn08L3N0cm9uZz48L2xpPmApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAkKCcucGFja2FnZXMtbmFtZXMtbGlzdCcpLmFwcGVuZChgPGxpPiR7bmFtZSA/IG5hbWUgOiBzbHVnfTwvbGk+YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIC8vIGZpeCBtaXNtYXRjaGluZyB0eXBlcyB3aGVuIHNoYXJpbmcgaW5zdGFsbCBtb2RhbCBiZXR3ZWVuIHBsdWdpbnMvdGhlbWVzXG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gJ1tkYXRhLXBhY2thZ2VzLW1vZGFsXSBbZGF0YS10aGVtZS1hY3Rpb25dLCBbZGF0YS1wYWNrYWdlcy1tb2RhbF0gW2RhdGEtcGx1Z2luLWFjdGlvbl0nO1xuICAgICAgICBjb25zdCBkYXRhID0gJChxdWVyeSkuZGF0YSgndGhlbWVBY3Rpb24nKSB8fCAkKHF1ZXJ5KS5kYXRhKCdwbHVnaW5BY3Rpb24nKTtcbiAgICAgICAgJChxdWVyeSkucmVtb3ZlQXR0cignZGF0YS10aGVtZS1hY3Rpb24nKS5yZW1vdmVBdHRyKCdkYXRhLXBsdWdpbi1hY3Rpb24nKS5hdHRyKGBkYXRhLSR7dHlwZX0tYWN0aW9uYCwgZGF0YSk7XG5cbiAgICAgICAgLy8gUmVzdG9yZSBvcmlnaW5hbCBzdGF0ZVxuICAgICAgICAkKCdbZGF0YS1wYWNrYWdlcy1tb2RhbF0gLmxvYWRpbmcnKS5yZW1vdmVDbGFzcygnaGlkZGVuJyk7XG4gICAgICAgICQoJ1tkYXRhLXBhY2thZ2VzLW1vZGFsXSAuaW5zdGFsbC1kZXBlbmRlbmNpZXMtcGFja2FnZS1jb250YWluZXInKS5hZGRDbGFzcygnaGlkZGVuJyk7XG4gICAgICAgICQoJ1tkYXRhLXBhY2thZ2VzLW1vZGFsXSAuaW5zdGFsbC1wYWNrYWdlLWNvbnRhaW5lcicpLmFkZENsYXNzKCdoaWRkZW4nKTtcbiAgICAgICAgJCgnW2RhdGEtcGFja2FnZXMtbW9kYWxdIC5pbnN0YWxsaW5nLWRlcGVuZGVuY2llcycpLmFkZENsYXNzKCdoaWRkZW4nKTtcbiAgICAgICAgJCgnW2RhdGEtcGFja2FnZXMtbW9kYWxdIC5pbnN0YWxsaW5nLXBhY2thZ2UnKS5hZGRDbGFzcygnaGlkZGVuJyk7XG4gICAgICAgICQoJ1tkYXRhLXBhY2thZ2VzLW1vZGFsXSAuaW5zdGFsbGF0aW9uLWNvbXBsZXRlJykuYWRkQ2xhc3MoJ2hpZGRlbicpO1xuICAgICAgICAkKCdbZGF0YS1wYWNrYWdlcy1tb2RhbF0gLmluc3RhbGwtcGFja2FnZS1lcnJvcicpLmFkZENsYXNzKCdoaWRkZW4nKTtcblxuICAgICAgICB0aGlzLmdldFBhY2thZ2VzRGVwZW5kZW5jaWVzKHR5cGUsIHNsdWdzLCAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgc2x1Z3Nfc3RyaW5nID0gc2x1Z3Muam9pbigpO1xuICAgICAgICAgICAgJChgW2RhdGEtcGFja2FnZXMtbW9kYWxdIFtkYXRhLSR7dHlwZX0tYWN0aW9uPVwiaW5zdGFsbC1kZXBlbmRlbmNpZXMtYW5kLXBhY2thZ2VcIl1gKS5hdHRyKCdkYXRhLXBhY2thZ2VzLXNsdWdzJywgc2x1Z3Nfc3RyaW5nKTtcbiAgICAgICAgICAgICQoYFtkYXRhLXBhY2thZ2VzLW1vZGFsXSBbZGF0YS0ke3R5cGV9LWFjdGlvbj1cImluc3RhbGwtcGFja2FnZVwiXWApLmF0dHIoJ2RhdGEtcGFja2FnZXMtc2x1Z3MnLCBzbHVnc19zdHJpbmcpO1xuICAgICAgICAgICAgJCgnW2RhdGEtcGFja2FnZXMtbW9kYWxdIC5sb2FkaW5nJykuYWRkQ2xhc3MoJ2hpZGRlbicpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBoYW5kbGVJbnN0YWxsaW5nRGVwZW5kZW5jaWVzQW5kUGFja2FnZSh0eXBlLCBldmVudCkge1xuICAgICAgICBsZXQgc2x1Z3MgPSBQYWNrYWdlcy5nZXRTbHVnc0Zyb21FdmVudChldmVudCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgICQoJ1tkYXRhLXBhY2thZ2VzLW1vZGFsXSAuaW5zdGFsbC1kZXBlbmRlbmNpZXMtcGFja2FnZS1jb250YWluZXInKS5hZGRDbGFzcygnaGlkZGVuJyk7XG4gICAgICAgICQoJ1tkYXRhLXBhY2thZ2VzLW1vZGFsXSAuaW5zdGFsbC1wYWNrYWdlLWNvbnRhaW5lcicpLmFkZENsYXNzKCdoaWRkZW4nKTtcbiAgICAgICAgJCgnW2RhdGEtcGFja2FnZXMtbW9kYWxdIC5pbnN0YWxsaW5nLWRlcGVuZGVuY2llcycpLnJlbW92ZUNsYXNzKCdoaWRkZW4nKTtcblxuICAgICAgICB0aGlzLmluc3RhbGxEZXBlbmRlbmNpZXNPZlBhY2thZ2VzKHR5cGUsIHNsdWdzLCAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICQoJ1tkYXRhLXBhY2thZ2VzLW1vZGFsXSAuaW5zdGFsbGluZy1kZXBlbmRlbmNpZXMnKS5hZGRDbGFzcygnaGlkZGVuJyk7XG4gICAgICAgICAgICAkKCdbZGF0YS1wYWNrYWdlcy1tb2RhbF0gLmluc3RhbGxpbmctcGFja2FnZScpLnJlbW92ZUNsYXNzKCdoaWRkZW4nKTtcbiAgICAgICAgICAgIHRoaXMuaW5zdGFsbFBhY2thZ2VzKHR5cGUsIHNsdWdzLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgJCgnW2RhdGEtcGFja2FnZXMtbW9kYWxdIC5pbnN0YWxsaW5nLXBhY2thZ2UnKS5hZGRDbGFzcygnaGlkZGVuJyk7XG4gICAgICAgICAgICAgICAgJCgnW2RhdGEtcGFja2FnZXMtbW9kYWxdIC5pbnN0YWxsYXRpb24tY29tcGxldGUnKS5yZW1vdmVDbGFzcygnaGlkZGVuJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZW1vZGFsID0gJC5yZW1vZGFsLmxvb2t1cFskKCdbZGF0YS1wYWNrYWdlcy1tb2RhbF0nKS5kYXRhKCdyZW1vZGFsJyldO1xuICAgICAgICAgICAgICAgICAgICByZW1vZGFsLmNsb3NlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2x1Z3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWwubG9jYXRpb24uaHJlZiA9IGAke2NvbmZpZy5iYXNlX3VybF9yZWxhdGl2ZX0vJHt0eXBlfXMvJHtzbHVnc1swXX1gO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsLmxvY2F0aW9uLmhyZWYgPSBgJHtjb25maWcuYmFzZV91cmxfcmVsYXRpdmV9LyR7dHlwZX1zYDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIDEwMDApO1xuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaGFuZGxlSW5zdGFsbGluZ1BhY2thZ2UodHlwZSwgZXZlbnQpIHtcbiAgICAgICAgbGV0IHNsdWdzID0gUGFja2FnZXMuZ2V0U2x1Z3NGcm9tRXZlbnQoZXZlbnQpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICAkKCdbZGF0YS1wYWNrYWdlcy1tb2RhbF0gLmluc3RhbGwtcGFja2FnZS1jb250YWluZXInKS5hZGRDbGFzcygnaGlkZGVuJyk7XG4gICAgICAgICQoJ1tkYXRhLXBhY2thZ2VzLW1vZGFsXSAuaW5zdGFsbGluZy1wYWNrYWdlJykucmVtb3ZlQ2xhc3MoJ2hpZGRlbicpO1xuXG4gICAgICAgIHRoaXMuaW5zdGFsbFBhY2thZ2VzKHR5cGUsIHNsdWdzLCAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICQoJ1tkYXRhLXBhY2thZ2VzLW1vZGFsXSAuaW5zdGFsbGluZy1wYWNrYWdlJykuYWRkQ2xhc3MoJ2hpZGRlbicpO1xuICAgICAgICAgICAgJCgnW2RhdGEtcGFja2FnZXMtbW9kYWxdIC5pbnN0YWxsYXRpb24tY29tcGxldGUnKS5yZW1vdmVDbGFzcygnaGlkZGVuJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGVycm9ycyA9IEFycmF5LmZyb20ocmVzcG9uc2UpLmZpbHRlcigocikgPT4gci5zdGF0dXMgPT09ICdlcnJvcicpO1xuXG4gICAgICAgICAgICBpZiAoZXJyb3JzICYmIGVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVtb2RhbCA9ICQucmVtb2RhbC5sb29rdXBbJCgnW2RhdGEtcGFja2FnZXMtbW9kYWxdLnJlbW9kYWwtaXMtb3BlbmVkJykuZGF0YSgncmVtb2RhbCcpXTtcbiAgICAgICAgICAgICAgICByZW1vZGFsLmNsb3NlKCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzbHVncy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICBnbG9iYWwubG9jYXRpb24uaHJlZiA9IGAke2NvbmZpZy5iYXNlX3VybF9yZWxhdGl2ZX0vJHt0eXBlfXMvJHtzbHVnc1swXX1gO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBnbG9iYWwubG9jYXRpb24uaHJlZiA9IGAke2NvbmZpZy5iYXNlX3VybF9yZWxhdGl2ZX0vJHt0eXBlfXNgO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBoYW5kbGVSZW1vdmluZ1BhY2thZ2UodHlwZSwgZXZlbnQpIHtcbiAgICAgICAgbGV0IHNsdWcgPSAkKGV2ZW50LnRhcmdldCkuYXR0cignZGF0YS1wYWNrYWdlcy1zbHVncycpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICB0aGlzLnJlbW92ZVBhY2thZ2UodHlwZSwgc2x1Zyk7XG4gICAgfVxuXG4gICAgaGFuZGxlUmVpbnN0YWxsUGFja2FnZSh0eXBlLCBldmVudCkge1xuICAgICAgICBsZXQgdGFyZ2V0ID0gJChldmVudC50YXJnZXQpO1xuICAgICAgICBsZXQgc2x1ZyA9IHRhcmdldC5hdHRyKCdkYXRhLXBhY2thZ2Utc2x1ZycpO1xuICAgICAgICBsZXQgcGFja2FnZV9uYW1lID0gdGFyZ2V0LmF0dHIoJ2RhdGEtcGFja2FnZS1uYW1lJyk7XG4gICAgICAgIGxldCBjdXJyZW50X3ZlcnNpb24gPSB0YXJnZXQuYXR0cignZGF0YS1wYWNrYWdlLWN1cnJlbnQtdmVyc2lvbicpO1xuXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIHRoaXMucmVpbnN0YWxsUGFja2FnZSh0eXBlLCBzbHVnLCBwYWNrYWdlX25hbWUsIGN1cnJlbnRfdmVyc2lvbik7XG4gICAgfVxuXG4gICAgaGFuZGxlUmVtb3ZpbmdEZXBlbmRlbmN5KHR5cGUsIGV2ZW50KSB7XG4gICAgICAgIGxldCBzbHVnID0gJChldmVudC50YXJnZXQpLmF0dHIoJ2RhdGEtZGVwZW5kZW5jeS1zbHVnJyk7XG4gICAgICAgIGxldCBidXR0b24gPSAkKGV2ZW50LnRhcmdldCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIHRoaXMucmVtb3ZlRGVwZW5kZW5jeSh0eXBlLCBzbHVnLCBidXR0b24pO1xuICAgIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBuZXcgUGFja2FnZXMoKTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./app/utils/packages.js\n"); /***/ }), /***/ "./app/utils/remodal.js": -/*!******************************!* +/*!******************************!*\ !*** ./app/utils/remodal.js ***! \******************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { @@ -760,29 +771,29 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var jque /***/ }), /***/ "./app/utils/request.js": -/*!******************************!* +/*!******************************!*\ !*** ./app/utils/request.js ***! \******************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => __WEBPACK_DEFAULT_EXPORT__\n/* harmony export */ });\n/* harmony import */ var _response__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./response */ \"./app/utils/response.js\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! grav-config */ \"grav-config\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(grav_config__WEBPACK_IMPORTED_MODULE_1__);\n\n\nvar raw;\n\nvar request = function request(url) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var callback = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {\n return true;\n };\n\n if (typeof options === 'function') {\n callback = options;\n options = {};\n }\n\n if (options.method && options.method === 'post') {\n var data = new FormData();\n options.body = Object.assign({\n 'admin-nonce': grav_config__WEBPACK_IMPORTED_MODULE_1__.config.admin_nonce\n }, options.body || {});\n Object.keys(options.body).map(function (key) {\n return data.append(key, options.body[key]);\n });\n options.body = data;\n }\n\n options = Object.assign({\n credentials: 'same-origin',\n headers: {\n 'Accept': 'application/json'\n }\n }, options);\n return fetch(url, options).then(function (response) {\n raw = response;\n return response;\n }).then(_response__WEBPACK_IMPORTED_MODULE_0__.parseStatus).then(_response__WEBPACK_IMPORTED_MODULE_0__.parseJSON).then(_response__WEBPACK_IMPORTED_MODULE_0__.userFeedback).then(function (response) {\n return callback(response, raw);\n })[\"catch\"](_response__WEBPACK_IMPORTED_MODULE_0__.userFeedbackError);\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (request);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL3V0aWxzL3JlcXVlc3QuanM/MTc2YSJdLCJuYW1lcyI6WyJyYXciLCJyZXF1ZXN0IiwidXJsIiwib3B0aW9ucyIsImNhbGxiYWNrIiwibWV0aG9kIiwiZGF0YSIsIkZvcm1EYXRhIiwiYm9keSIsIk9iamVjdCIsImFzc2lnbiIsImNvbmZpZyIsImFkbWluX25vbmNlIiwia2V5cyIsIm1hcCIsImtleSIsImFwcGVuZCIsImNyZWRlbnRpYWxzIiwiaGVhZGVycyIsImZldGNoIiwidGhlbiIsInJlc3BvbnNlIiwicGFyc2VTdGF0dXMiLCJwYXJzZUpTT04iLCJ1c2VyRmVlZGJhY2siLCJ1c2VyRmVlZGJhY2tFcnJvciJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0FBQ0E7QUFFQSxJQUFJQSxHQUFKOztBQUNBLElBQUlDLE9BQU8sR0FBRyxTQUFWQSxPQUFVLENBQVNDLEdBQVQsRUFBbUQ7QUFBQSxNQUFyQ0MsT0FBcUMsdUVBQTNCLEVBQTJCO0FBQUEsTUFBdkJDLFFBQXVCLHVFQUFaO0FBQUEsV0FBTSxJQUFOO0FBQUEsR0FBWTs7QUFDN0QsTUFBSSxPQUFPRCxPQUFQLEtBQW1CLFVBQXZCLEVBQW1DO0FBQy9CQyxZQUFRLEdBQUdELE9BQVg7QUFDQUEsV0FBTyxHQUFHLEVBQVY7QUFDSDs7QUFFRCxNQUFJQSxPQUFPLENBQUNFLE1BQVIsSUFBa0JGLE9BQU8sQ0FBQ0UsTUFBUixLQUFtQixNQUF6QyxFQUFpRDtBQUM3QyxRQUFJQyxJQUFJLEdBQUcsSUFBSUMsUUFBSixFQUFYO0FBRUFKLFdBQU8sQ0FBQ0ssSUFBUixHQUFlQyxNQUFNLENBQUNDLE1BQVAsQ0FBYztBQUFFLHFCQUFlQywyREFBa0JDO0FBQW5DLEtBQWQsRUFBcURULE9BQU8sQ0FBQ0ssSUFBUixJQUFnQixFQUFyRSxDQUFmO0FBQ0FDLFVBQU0sQ0FBQ0ksSUFBUCxDQUFZVixPQUFPLENBQUNLLElBQXBCLEVBQTBCTSxHQUExQixDQUE4QixVQUFDQyxHQUFEO0FBQUEsYUFBU1QsSUFBSSxDQUFDVSxNQUFMLENBQVlELEdBQVosRUFBaUJaLE9BQU8sQ0FBQ0ssSUFBUixDQUFhTyxHQUFiLENBQWpCLENBQVQ7QUFBQSxLQUE5QjtBQUNBWixXQUFPLENBQUNLLElBQVIsR0FBZUYsSUFBZjtBQUNIOztBQUVESCxTQUFPLEdBQUdNLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjO0FBQ3BCTyxlQUFXLEVBQUUsYUFETztBQUVwQkMsV0FBTyxFQUFFO0FBQ0wsZ0JBQVU7QUFETDtBQUZXLEdBQWQsRUFLUGYsT0FMTyxDQUFWO0FBT0EsU0FBT2dCLEtBQUssQ0FBQ2pCLEdBQUQsRUFBTUMsT0FBTixDQUFMLENBQ0ZpQixJQURFLENBQ0csVUFBQ0MsUUFBRCxFQUFjO0FBQ2hCckIsT0FBRyxHQUFHcUIsUUFBTjtBQUNBLFdBQU9BLFFBQVA7QUFDSCxHQUpFLEVBS0ZELElBTEUsQ0FLR0Usa0RBTEgsRUFNRkYsSUFORSxDQU1HRyxnREFOSCxFQU9GSCxJQVBFLENBT0dJLG1EQVBILEVBUUZKLElBUkUsQ0FRRyxVQUFDQyxRQUFEO0FBQUEsV0FBY2pCLFFBQVEsQ0FBQ2lCLFFBQUQsRUFBV3JCLEdBQVgsQ0FBdEI7QUFBQSxHQVJILFdBU0l5Qix3REFUSixDQUFQO0FBVUgsQ0EvQkQ7O0FBaUNBLGlFQUFleEIsT0FBZiIsImZpbGUiOiIuL2FwcC91dGlscy9yZXF1ZXN0LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcGFyc2VTdGF0dXMsIHBhcnNlSlNPTiwgdXNlckZlZWRiYWNrLCB1c2VyRmVlZGJhY2tFcnJvciB9IGZyb20gJy4vcmVzcG9uc2UnO1xuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnZ3Jhdi1jb25maWcnO1xuXG5sZXQgcmF3O1xubGV0IHJlcXVlc3QgPSBmdW5jdGlvbih1cmwsIG9wdGlvbnMgPSB7fSwgY2FsbGJhY2sgPSAoKSA9PiB0cnVlKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLm1ldGhvZCAmJiBvcHRpb25zLm1ldGhvZCA9PT0gJ3Bvc3QnKSB7XG4gICAgICAgIGxldCBkYXRhID0gbmV3IEZvcm1EYXRhKCk7XG5cbiAgICAgICAgb3B0aW9ucy5ib2R5ID0gT2JqZWN0LmFzc2lnbih7ICdhZG1pbi1ub25jZSc6IGNvbmZpZy5hZG1pbl9ub25jZSB9LCBvcHRpb25zLmJvZHkgfHwge30pO1xuICAgICAgICBPYmplY3Qua2V5cyhvcHRpb25zLmJvZHkpLm1hcCgoa2V5KSA9PiBkYXRhLmFwcGVuZChrZXksIG9wdGlvbnMuYm9keVtrZXldKSk7XG4gICAgICAgIG9wdGlvbnMuYm9keSA9IGRhdGE7XG4gICAgfVxuXG4gICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICBjcmVkZW50aWFsczogJ3NhbWUtb3JpZ2luJyxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICB9XG4gICAgfSwgb3B0aW9ucyk7XG5cbiAgICByZXR1cm4gZmV0Y2godXJsLCBvcHRpb25zKVxuICAgICAgICAudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIHJhdyA9IHJlc3BvbnNlO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICB9KVxuICAgICAgICAudGhlbihwYXJzZVN0YXR1cylcbiAgICAgICAgLnRoZW4ocGFyc2VKU09OKVxuICAgICAgICAudGhlbih1c2VyRmVlZGJhY2spXG4gICAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gY2FsbGJhY2socmVzcG9uc2UsIHJhdykpXG4gICAgICAgIC5jYXRjaCh1c2VyRmVlZGJhY2tFcnJvcik7XG59O1xuXG5leHBvcnQgZGVmYXVsdCByZXF1ZXN0O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./app/utils/request.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _response__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./response */ \"./app/utils/response.js\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! grav-config */ \"grav-config\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(grav_config__WEBPACK_IMPORTED_MODULE_1__);\n\n\nvar raw;\n\nvar request = function request(url) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var callback = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {\n return true;\n };\n\n if (typeof options === 'function') {\n callback = options;\n options = {};\n }\n\n if (options.method && options.method === 'post') {\n var data = new FormData();\n options.body = Object.assign({\n 'admin-nonce': grav_config__WEBPACK_IMPORTED_MODULE_1__.config.admin_nonce\n }, options.body || {});\n Object.keys(options.body).map(function (key) {\n return data.append(key, options.body[key]);\n });\n options.body = data;\n }\n\n options = Object.assign({\n credentials: 'same-origin',\n headers: {\n 'Accept': 'application/json'\n }\n }, options);\n return fetch(url, options).then(function (response) {\n raw = response;\n return response;\n }).then(_response__WEBPACK_IMPORTED_MODULE_0__.parseStatus).then(_response__WEBPACK_IMPORTED_MODULE_0__.parseJSON).then(_response__WEBPACK_IMPORTED_MODULE_0__.userFeedback).then(function (response) {\n return callback(response, raw);\n })[\"catch\"](_response__WEBPACK_IMPORTED_MODULE_0__.userFeedbackError);\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (request);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL3V0aWxzL3JlcXVlc3QuanM/MTc2YSJdLCJuYW1lcyI6WyJyYXciLCJyZXF1ZXN0IiwidXJsIiwib3B0aW9ucyIsImNhbGxiYWNrIiwibWV0aG9kIiwiZGF0YSIsIkZvcm1EYXRhIiwiYm9keSIsIk9iamVjdCIsImFzc2lnbiIsImNvbmZpZyIsImFkbWluX25vbmNlIiwia2V5cyIsIm1hcCIsImtleSIsImFwcGVuZCIsImNyZWRlbnRpYWxzIiwiaGVhZGVycyIsImZldGNoIiwidGhlbiIsInJlc3BvbnNlIiwicGFyc2VTdGF0dXMiLCJwYXJzZUpTT04iLCJ1c2VyRmVlZGJhY2siLCJ1c2VyRmVlZGJhY2tFcnJvciJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0FBQ0E7QUFFQSxJQUFJQSxHQUFKOztBQUNBLElBQUlDLE9BQU8sR0FBRyxTQUFWQSxPQUFVLENBQVNDLEdBQVQsRUFBbUQ7QUFBQSxNQUFyQ0MsT0FBcUMsdUVBQTNCLEVBQTJCO0FBQUEsTUFBdkJDLFFBQXVCLHVFQUFaO0FBQUEsV0FBTSxJQUFOO0FBQUEsR0FBWTs7QUFDN0QsTUFBSSxPQUFPRCxPQUFQLEtBQW1CLFVBQXZCLEVBQW1DO0FBQy9CQyxZQUFRLEdBQUdELE9BQVg7QUFDQUEsV0FBTyxHQUFHLEVBQVY7QUFDSDs7QUFFRCxNQUFJQSxPQUFPLENBQUNFLE1BQVIsSUFBa0JGLE9BQU8sQ0FBQ0UsTUFBUixLQUFtQixNQUF6QyxFQUFpRDtBQUM3QyxRQUFJQyxJQUFJLEdBQUcsSUFBSUMsUUFBSixFQUFYO0FBRUFKLFdBQU8sQ0FBQ0ssSUFBUixHQUFlQyxNQUFNLENBQUNDLE1BQVAsQ0FBYztBQUFFLHFCQUFlQywyREFBa0JDO0FBQW5DLEtBQWQsRUFBcURULE9BQU8sQ0FBQ0ssSUFBUixJQUFnQixFQUFyRSxDQUFmO0FBQ0FDLFVBQU0sQ0FBQ0ksSUFBUCxDQUFZVixPQUFPLENBQUNLLElBQXBCLEVBQTBCTSxHQUExQixDQUE4QixVQUFDQyxHQUFEO0FBQUEsYUFBU1QsSUFBSSxDQUFDVSxNQUFMLENBQVlELEdBQVosRUFBaUJaLE9BQU8sQ0FBQ0ssSUFBUixDQUFhTyxHQUFiLENBQWpCLENBQVQ7QUFBQSxLQUE5QjtBQUNBWixXQUFPLENBQUNLLElBQVIsR0FBZUYsSUFBZjtBQUNIOztBQUVESCxTQUFPLEdBQUdNLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjO0FBQ3BCTyxlQUFXLEVBQUUsYUFETztBQUVwQkMsV0FBTyxFQUFFO0FBQ0wsZ0JBQVU7QUFETDtBQUZXLEdBQWQsRUFLUGYsT0FMTyxDQUFWO0FBT0EsU0FBT2dCLEtBQUssQ0FBQ2pCLEdBQUQsRUFBTUMsT0FBTixDQUFMLENBQ0ZpQixJQURFLENBQ0csVUFBQ0MsUUFBRCxFQUFjO0FBQ2hCckIsT0FBRyxHQUFHcUIsUUFBTjtBQUNBLFdBQU9BLFFBQVA7QUFDSCxHQUpFLEVBS0ZELElBTEUsQ0FLR0Usa0RBTEgsRUFNRkYsSUFORSxDQU1HRyxnREFOSCxFQU9GSCxJQVBFLENBT0dJLG1EQVBILEVBUUZKLElBUkUsQ0FRRyxVQUFDQyxRQUFEO0FBQUEsV0FBY2pCLFFBQVEsQ0FBQ2lCLFFBQUQsRUFBV3JCLEdBQVgsQ0FBdEI7QUFBQSxHQVJILFdBU0l5Qix3REFUSixDQUFQO0FBVUgsQ0EvQkQ7O0FBaUNBLGlFQUFleEIsT0FBZiIsImZpbGUiOiIuL2FwcC91dGlscy9yZXF1ZXN0LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcGFyc2VTdGF0dXMsIHBhcnNlSlNPTiwgdXNlckZlZWRiYWNrLCB1c2VyRmVlZGJhY2tFcnJvciB9IGZyb20gJy4vcmVzcG9uc2UnO1xuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnZ3Jhdi1jb25maWcnO1xuXG5sZXQgcmF3O1xubGV0IHJlcXVlc3QgPSBmdW5jdGlvbih1cmwsIG9wdGlvbnMgPSB7fSwgY2FsbGJhY2sgPSAoKSA9PiB0cnVlKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLm1ldGhvZCAmJiBvcHRpb25zLm1ldGhvZCA9PT0gJ3Bvc3QnKSB7XG4gICAgICAgIGxldCBkYXRhID0gbmV3IEZvcm1EYXRhKCk7XG5cbiAgICAgICAgb3B0aW9ucy5ib2R5ID0gT2JqZWN0LmFzc2lnbih7ICdhZG1pbi1ub25jZSc6IGNvbmZpZy5hZG1pbl9ub25jZSB9LCBvcHRpb25zLmJvZHkgfHwge30pO1xuICAgICAgICBPYmplY3Qua2V5cyhvcHRpb25zLmJvZHkpLm1hcCgoa2V5KSA9PiBkYXRhLmFwcGVuZChrZXksIG9wdGlvbnMuYm9keVtrZXldKSk7XG4gICAgICAgIG9wdGlvbnMuYm9keSA9IGRhdGE7XG4gICAgfVxuXG4gICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICBjcmVkZW50aWFsczogJ3NhbWUtb3JpZ2luJyxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICB9XG4gICAgfSwgb3B0aW9ucyk7XG5cbiAgICByZXR1cm4gZmV0Y2godXJsLCBvcHRpb25zKVxuICAgICAgICAudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIHJhdyA9IHJlc3BvbnNlO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICB9KVxuICAgICAgICAudGhlbihwYXJzZVN0YXR1cylcbiAgICAgICAgLnRoZW4ocGFyc2VKU09OKVxuICAgICAgICAudGhlbih1c2VyRmVlZGJhY2spXG4gICAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gY2FsbGJhY2socmVzcG9uc2UsIHJhdykpXG4gICAgICAgIC5jYXRjaCh1c2VyRmVlZGJhY2tFcnJvcik7XG59O1xuXG5leHBvcnQgZGVmYXVsdCByZXF1ZXN0O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./app/utils/request.js\n"); /***/ }), /***/ "./app/utils/response.js": -/*!*******************************!* +/*!*******************************!*\ !*** ./app/utils/response.js ***! \*******************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"parseStatus\": () => /* binding */ parseStatus,\n/* harmony export */ \"parseJSON\": () => /* binding */ parseJSON,\n/* harmony export */ \"userFeedback\": () => /* binding */ userFeedback,\n/* harmony export */ \"userFeedbackError\": () => /* binding */ userFeedbackError\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _toastr__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./toastr */ \"./app/utils/toastr.js\");\n/* harmony import */ var _offline__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./offline */ \"./app/utils/offline.js\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! grav-config */ \"grav-config\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(grav_config__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var mout_string_trim__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! mout/string/trim */ \"./node_modules/mout/string/trim.js\");\n/* harmony import */ var mout_string_trim__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(mout_string_trim__WEBPACK_IMPORTED_MODULE_4__);\n\n\n\n\n\nvar UNLOADING = false;\n\nvar error = function error(response) {\n var error = new Error(response.statusText || response || '');\n error.response = response;\n return error;\n};\n\nfunction parseStatus(response) {\n return response;\n /* Whoops can handle JSON responses so we don't need this for now.\n if (response.status >= 200 && response.status < 300) {\n return response;\n } else {\n throw error(response);\n }\n */\n}\nfunction parseJSON(response) {\n return response.text().then(function (text) {\n var parsed = text;\n\n try {\n parsed = JSON.parse(text);\n } catch (error) {\n var content = document.createElement('div');\n content.innerHTML = text;\n var the_error = new Error();\n the_error.stack = mout_string_trim__WEBPACK_IMPORTED_MODULE_4___default()(content.innerText);\n throw the_error;\n }\n\n return parsed;\n });\n}\nfunction userFeedback(response) {\n if (UNLOADING) {\n return true;\n }\n\n var status = response.status || (response.error ? 'error' : '');\n var message = response.message || (response.error ? response.error.message : null);\n var settings = response.toastr || null;\n var backup;\n\n switch (status) {\n case 'unauthenticated':\n document.location.href = grav_config__WEBPACK_IMPORTED_MODULE_3__.config.base_url_relative;\n throw error('Logged out');\n\n case 'unauthorized':\n status = 'error';\n message = message || 'Unauthorized.';\n break;\n\n case 'error':\n status = 'error';\n message = message || 'Unknown error.';\n break;\n\n case 'success':\n status = 'success';\n message = message || '';\n break;\n\n default:\n status = 'error';\n message = message || 'Invalid AJAX response.';\n break;\n }\n\n if (settings) {\n backup = Object.assign({}, _toastr__WEBPACK_IMPORTED_MODULE_1__.default.options);\n Object.keys(settings).forEach(function (key) {\n _toastr__WEBPACK_IMPORTED_MODULE_1__.default.options[key] = settings[key];\n });\n }\n\n if (message && (_offline__WEBPACK_IMPORTED_MODULE_2__.default || !_offline__WEBPACK_IMPORTED_MODULE_2__.default && status !== 'error')) {\n _toastr__WEBPACK_IMPORTED_MODULE_1__.default[status === 'success' ? 'success' : 'error'](message);\n }\n\n if (settings) {\n _toastr__WEBPACK_IMPORTED_MODULE_1__.default.options = backup;\n }\n\n return response;\n}\nfunction userFeedbackError(error) {\n if (UNLOADING) {\n return true;\n }\n\n var stack = error.stack ? \"
                  \".concat(error.stack, \"
                  \") : '';\n _toastr__WEBPACK_IMPORTED_MODULE_1__.default.error(\"Fetch Failed:
                  \".concat(error.message, \" \").concat(stack));\n console.error(\"\".concat(error.message, \" at \").concat(error.stack));\n}\njquery__WEBPACK_IMPORTED_MODULE_0___default()(__webpack_require__.g).on('beforeunload._ajax', function () {\n UNLOADING = true;\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL3V0aWxzL3Jlc3BvbnNlLmpzP2FhYjIiXSwibmFtZXMiOlsiVU5MT0FESU5HIiwiZXJyb3IiLCJyZXNwb25zZSIsIkVycm9yIiwic3RhdHVzVGV4dCIsInBhcnNlU3RhdHVzIiwicGFyc2VKU09OIiwidGV4dCIsInRoZW4iLCJwYXJzZWQiLCJKU09OIiwicGFyc2UiLCJjb250ZW50IiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiaW5uZXJIVE1MIiwidGhlX2Vycm9yIiwic3RhY2siLCJ0cmltIiwiaW5uZXJUZXh0IiwidXNlckZlZWRiYWNrIiwic3RhdHVzIiwibWVzc2FnZSIsInNldHRpbmdzIiwidG9hc3RyIiwiYmFja3VwIiwibG9jYXRpb24iLCJocmVmIiwiY29uZmlnIiwiT2JqZWN0IiwiYXNzaWduIiwia2V5cyIsImZvckVhY2giLCJrZXkiLCJpc09ubGluZSIsInVzZXJGZWVkYmFja0Vycm9yIiwiY29uc29sZSIsIiQiLCJnbG9iYWwiLCJvbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBLElBQUlBLFNBQVMsR0FBRyxLQUFoQjs7QUFDQSxJQUFJQyxLQUFLLEdBQUcsZUFBU0MsUUFBVCxFQUFtQjtBQUMzQixNQUFJRCxLQUFLLEdBQUcsSUFBSUUsS0FBSixDQUFVRCxRQUFRLENBQUNFLFVBQVQsSUFBdUJGLFFBQXZCLElBQW1DLEVBQTdDLENBQVo7QUFDQUQsT0FBSyxDQUFDQyxRQUFOLEdBQWlCQSxRQUFqQjtBQUVBLFNBQU9ELEtBQVA7QUFDSCxDQUxEOztBQU9PLFNBQVNJLFdBQVQsQ0FBcUJILFFBQXJCLEVBQStCO0FBQ2xDLFNBQU9BLFFBQVA7QUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNDO0FBRU0sU0FBU0ksU0FBVCxDQUFtQkosUUFBbkIsRUFBNkI7QUFDaEMsU0FBT0EsUUFBUSxDQUFDSyxJQUFULEdBQWdC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QUFBLGdDQUFxQ3ZCLEtBQUssQ0FBQ3FCLE9BQTNDLGNBQXNETCxLQUF0RDtBQUNBbUIsU0FBTyxDQUFDbkMsS0FBUixXQUFpQkEsS0FBSyxDQUFDcUIsT0FBdkIsaUJBQXFDckIsS0FBSyxDQUFDZ0IsS0FBM0M7QUFDSDtBQUVEb0IsNkNBQUMsQ0FBQ0MscUJBQUQsQ0FBRCxDQUFVQyxFQUFWLENBQWEsb0JBQWIsRUFBbUMsWUFBTTtBQUNyQ3ZDLFdBQVMsR0FBRyxJQUFaO0FBQ0gsQ0FGRCIsImZpbGUiOiIuL2FwcC91dGlscy9yZXNwb25zZS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgdG9hc3RyIGZyb20gJy4vdG9hc3RyJztcbmltcG9ydCBpc09ubGluZSBmcm9tICcuL29mZmxpbmUnO1xuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnZ3Jhdi1jb25maWcnO1xuaW1wb3J0IHRyaW0gZnJvbSAnbW91dC9zdHJpbmcvdHJpbSc7XG5cbmxldCBVTkxPQURJTkcgPSBmYWxzZTtcbmxldCBlcnJvciA9IGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gICAgbGV0IGVycm9yID0gbmV3IEVycm9yKHJlc3BvbnNlLnN0YXR1c1RleHQgfHwgcmVzcG9uc2UgfHwgJycpO1xuICAgIGVycm9yLnJlc3BvbnNlID0gcmVzcG9uc2U7XG5cbiAgICByZXR1cm4gZXJyb3I7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTdGF0dXMocmVzcG9uc2UpIHtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG5cbiAgICAvKiBXaG9vcHMgY2FuIGhhbmRsZSBKU09OIHJlc3BvbnNlcyBzbyB3ZSBkb24ndCBuZWVkIHRoaXMgZm9yIG5vdy5cbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA+PSAyMDAgJiYgcmVzcG9uc2Uuc3RhdHVzIDwgMzAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcihyZXNwb25zZSk7XG4gICAgICAgIH1cbiAgICAqL1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VKU09OKHJlc3BvbnNlKSB7XG4gICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKS50aGVuKCh0ZXh0KSA9PiB7XG4gICAgICAgIGxldCBwYXJzZWQgPSB0ZXh0O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcGFyc2VkID0gSlNPTi5wYXJzZSh0ZXh0KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGxldCBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBjb250ZW50LmlubmVySFRNTCA9IHRleHQ7XG5cbiAgICAgICAgICAgIGxldCB0aGVfZXJyb3IgPSBuZXcgRXJyb3IoKTtcbiAgICAgICAgICAgIHRoZV9lcnJvci5zdGFjayA9IHRyaW0oY29udGVudC5pbm5lclRleHQpO1xuXG4gICAgICAgICAgICB0aHJvdyB0aGVfZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGFyc2VkO1xuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlckZlZWRiYWNrKHJlc3BvbnNlKSB7XG4gICAgaWYgKFVOTE9BRElORykgeyByZXR1cm4gdHJ1ZTsgfVxuXG4gICAgbGV0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cyB8fCAocmVzcG9uc2UuZXJyb3IgPyAnZXJyb3InIDogJycpO1xuICAgIGxldCBtZXNzYWdlID0gcmVzcG9uc2UubWVzc2FnZSB8fCAocmVzcG9uc2UuZXJyb3IgPyByZXNwb25zZS5lcnJvci5tZXNzYWdlIDogbnVsbCk7XG4gICAgbGV0IHNldHRpbmdzID0gcmVzcG9uc2UudG9hc3RyIHx8IG51bGw7XG4gICAgbGV0IGJhY2t1cDtcblxuICAgIHN3aXRjaCAoc3RhdHVzKSB7XG4gICAgICAgIGNhc2UgJ3VuYXV0aGVudGljYXRlZCc6XG4gICAgICAgICAgICBkb2N1bWVudC5sb2NhdGlvbi5ocmVmID0gY29uZmlnLmJhc2VfdXJsX3JlbGF0aXZlO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3IoJ0xvZ2dlZCBvdXQnKTtcbiAgICAgICAgY2FzZSAndW5hdXRob3JpemVkJzpcbiAgICAgICAgICAgIHN0YXR1cyA9ICdlcnJvcic7XG4gICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZSB8fCAnVW5hdXRob3JpemVkLic7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICAgICAgc3RhdHVzID0gJ2Vycm9yJztcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdVbmtub3duIGVycm9yLic7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnc3VjY2Vzcyc6XG4gICAgICAgICAgICBzdGF0dXMgPSAnc3VjY2Vzcyc7XG4gICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZSB8fCAnJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgc3RhdHVzID0gJ2Vycm9yJztcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdJbnZhbGlkIEFKQVggcmVzcG9uc2UuJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChzZXR0aW5ncykge1xuICAgICAgICBiYWNrdXAgPSBPYmplY3QuYXNzaWduKHt9LCB0b2FzdHIub3B0aW9ucyk7XG4gICAgICAgIE9iamVjdC5rZXlzKHNldHRpbmdzKS5mb3JFYWNoKChrZXkpID0+IHsgdG9hc3RyLm9wdGlvbnNba2V5XSA9IHNldHRpbmdzW2tleV07IH0pO1xuICAgIH1cblxuICAgIGlmIChtZXNzYWdlICYmIChpc09ubGluZSB8fCAoIWlzT25saW5lICYmIHN0YXR1cyAhPT0gJ2Vycm9yJykpKSB7XG4gICAgICAgIHRvYXN0cltzdGF0dXMgPT09ICdzdWNjZXNzJyA/ICdzdWNjZXNzJyA6ICdlcnJvciddKG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIGlmIChzZXR0aW5ncykge1xuICAgICAgICB0b2FzdHIub3B0aW9ucyA9IGJhY2t1cDtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzcG9uc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VyRmVlZGJhY2tFcnJvcihlcnJvcikge1xuICAgIGlmIChVTkxPQURJTkcpIHsgcmV0dXJuIHRydWU7IH1cbiAgICBsZXQgc3RhY2sgPSBlcnJvci5zdGFjayA/IGA8cHJlPjxjb2RlPiR7ZXJyb3Iuc3RhY2t9PC9jb2RlPjwvcHJlPmAgOiAnJztcbiAgICB0b2FzdHIuZXJyb3IoYEZldGNoIEZhaWxlZDogPGJyIC8+ICR7ZXJyb3IubWVzc2FnZX0gJHtzdGFja31gKTtcbiAgICBjb25zb2xlLmVycm9yKGAke2Vycm9yLm1lc3NhZ2V9IGF0ICR7ZXJyb3Iuc3RhY2t9YCk7XG59XG5cbiQoZ2xvYmFsKS5vbignYmVmb3JldW5sb2FkLl9hamF4JywgKCkgPT4ge1xuICAgIFVOTE9BRElORyA9IHRydWU7XG59KTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./app/utils/response.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"parseStatus\": () => (/* binding */ parseStatus),\n/* harmony export */ \"parseJSON\": () => (/* binding */ parseJSON),\n/* harmony export */ \"userFeedback\": () => (/* binding */ userFeedback),\n/* harmony export */ \"userFeedbackError\": () => (/* binding */ userFeedbackError)\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _toastr__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./toastr */ \"./app/utils/toastr.js\");\n/* harmony import */ var _offline__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./offline */ \"./app/utils/offline.js\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! grav-config */ \"grav-config\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(grav_config__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var mout_string_trim__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! mout/string/trim */ \"./node_modules/mout/string/trim.js\");\n/* harmony import */ var mout_string_trim__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(mout_string_trim__WEBPACK_IMPORTED_MODULE_4__);\n\n\n\n\n\nvar UNLOADING = false;\n\nvar error = function error(response) {\n var error = new Error(response.statusText || response || '');\n error.response = response;\n return error;\n};\n\nfunction parseStatus(response) {\n return response;\n /* Whoops can handle JSON responses so we don't need this for now.\n if (response.status >= 200 && response.status < 300) {\n return response;\n } else {\n throw error(response);\n }\n */\n}\nfunction parseJSON(response) {\n return response.text().then(function (text) {\n var parsed = text;\n\n try {\n parsed = JSON.parse(text);\n } catch (error) {\n var content = document.createElement('div');\n content.innerHTML = text;\n var the_error = new Error();\n the_error.stack = mout_string_trim__WEBPACK_IMPORTED_MODULE_4___default()(content.innerText);\n throw the_error;\n }\n\n return parsed;\n });\n}\nfunction userFeedback(response) {\n if (UNLOADING) {\n return true;\n }\n\n var status = response.status || (response.error ? 'error' : '');\n var message = response.message || (response.error ? response.error.message : null);\n var settings = response.toastr || null;\n var backup;\n\n switch (status) {\n case 'unauthenticated':\n document.location.href = grav_config__WEBPACK_IMPORTED_MODULE_3__.config.base_url_relative;\n throw error('Logged out');\n\n case 'unauthorized':\n status = 'error';\n message = message || 'Unauthorized.';\n break;\n\n case 'error':\n status = 'error';\n message = message || 'Unknown error.';\n break;\n\n case 'success':\n status = 'success';\n message = message || '';\n break;\n\n default:\n status = 'error';\n message = message || 'Invalid AJAX response.';\n break;\n }\n\n if (settings) {\n backup = Object.assign({}, _toastr__WEBPACK_IMPORTED_MODULE_1__.default.options);\n Object.keys(settings).forEach(function (key) {\n _toastr__WEBPACK_IMPORTED_MODULE_1__.default.options[key] = settings[key];\n });\n }\n\n if (message && (_offline__WEBPACK_IMPORTED_MODULE_2__.default || !_offline__WEBPACK_IMPORTED_MODULE_2__.default && status !== 'error')) {\n _toastr__WEBPACK_IMPORTED_MODULE_1__.default[status === 'success' ? 'success' : 'error'](message);\n }\n\n if (settings) {\n _toastr__WEBPACK_IMPORTED_MODULE_1__.default.options = backup;\n }\n\n return response;\n}\nfunction userFeedbackError(error) {\n if (UNLOADING) {\n return true;\n }\n\n var stack = error.stack ? \"
                  \".concat(error.stack, \"
                  \") : '';\n _toastr__WEBPACK_IMPORTED_MODULE_1__.default.error(\"Fetch Failed:
                  \".concat(error.message, \" \").concat(stack));\n console.error(\"\".concat(error.message, \" at \").concat(error.stack));\n}\njquery__WEBPACK_IMPORTED_MODULE_0___default()(__webpack_require__.g).on('beforeunload._ajax', function () {\n UNLOADING = true;\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL3V0aWxzL3Jlc3BvbnNlLmpzP2FhYjIiXSwibmFtZXMiOlsiVU5MT0FESU5HIiwiZXJyb3IiLCJyZXNwb25zZSIsIkVycm9yIiwic3RhdHVzVGV4dCIsInBhcnNlU3RhdHVzIiwicGFyc2VKU09OIiwidGV4dCIsInRoZW4iLCJwYXJzZWQiLCJKU09OIiwicGFyc2UiLCJjb250ZW50IiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiaW5uZXJIVE1MIiwidGhlX2Vycm9yIiwic3RhY2siLCJ0cmltIiwiaW5uZXJUZXh0IiwidXNlckZlZWRiYWNrIiwic3RhdHVzIiwibWVzc2FnZSIsInNldHRpbmdzIiwidG9hc3RyIiwiYmFja3VwIiwibG9jYXRpb24iLCJocmVmIiwiY29uZmlnIiwiT2JqZWN0IiwiYXNzaWduIiwia2V5cyIsImZvckVhY2giLCJrZXkiLCJpc09ubGluZSIsInVzZXJGZWVkYmFja0Vycm9yIiwiY29uc29sZSIsIiQiLCJnbG9iYWwiLCJvbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBLElBQUlBLFNBQVMsR0FBRyxLQUFoQjs7QUFDQSxJQUFJQyxLQUFLLEdBQUcsZUFBU0MsUUFBVCxFQUFtQjtBQUMzQixNQUFJRCxLQUFLLEdBQUcsSUFBSUUsS0FBSixDQUFVRCxRQUFRLENBQUNFLFVBQVQsSUFBdUJGLFFBQXZCLElBQW1DLEVBQTdDLENBQVo7QUFDQUQsT0FBSyxDQUFDQyxRQUFOLEdBQWlCQSxRQUFqQjtBQUVBLFNBQU9ELEtBQVA7QUFDSCxDQUxEOztBQU9PLFNBQVNJLFdBQVQsQ0FBcUJILFFBQXJCLEVBQStCO0FBQ2xDLFNBQU9BLFFBQVA7QUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNDO0FBRU0sU0FBU0ksU0FBVCxDQUFtQkosUUFBbkIsRUFBNkI7QUFDaEMsU0FBT0EsUUFBUSxDQUFDSyxJQUFULEdBQWdC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QUFBLGdDQUFxQ3ZCLEtBQUssQ0FBQ3FCLE9BQTNDLGNBQXNETCxLQUF0RDtBQUNBbUIsU0FBTyxDQUFDbkMsS0FBUixXQUFpQkEsS0FBSyxDQUFDcUIsT0FBdkIsaUJBQXFDckIsS0FBSyxDQUFDZ0IsS0FBM0M7QUFDSDtBQUVEb0IsNkNBQUMsQ0FBQ0MscUJBQUQsQ0FBRCxDQUFVQyxFQUFWLENBQWEsb0JBQWIsRUFBbUMsWUFBTTtBQUNyQ3ZDLFdBQVMsR0FBRyxJQUFaO0FBQ0gsQ0FGRCIsImZpbGUiOiIuL2FwcC91dGlscy9yZXNwb25zZS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgdG9hc3RyIGZyb20gJy4vdG9hc3RyJztcbmltcG9ydCBpc09ubGluZSBmcm9tICcuL29mZmxpbmUnO1xuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnZ3Jhdi1jb25maWcnO1xuaW1wb3J0IHRyaW0gZnJvbSAnbW91dC9zdHJpbmcvdHJpbSc7XG5cbmxldCBVTkxPQURJTkcgPSBmYWxzZTtcbmxldCBlcnJvciA9IGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gICAgbGV0IGVycm9yID0gbmV3IEVycm9yKHJlc3BvbnNlLnN0YXR1c1RleHQgfHwgcmVzcG9uc2UgfHwgJycpO1xuICAgIGVycm9yLnJlc3BvbnNlID0gcmVzcG9uc2U7XG5cbiAgICByZXR1cm4gZXJyb3I7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTdGF0dXMocmVzcG9uc2UpIHtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG5cbiAgICAvKiBXaG9vcHMgY2FuIGhhbmRsZSBKU09OIHJlc3BvbnNlcyBzbyB3ZSBkb24ndCBuZWVkIHRoaXMgZm9yIG5vdy5cbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA+PSAyMDAgJiYgcmVzcG9uc2Uuc3RhdHVzIDwgMzAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcihyZXNwb25zZSk7XG4gICAgICAgIH1cbiAgICAqL1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VKU09OKHJlc3BvbnNlKSB7XG4gICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKS50aGVuKCh0ZXh0KSA9PiB7XG4gICAgICAgIGxldCBwYXJzZWQgPSB0ZXh0O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcGFyc2VkID0gSlNPTi5wYXJzZSh0ZXh0KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGxldCBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBjb250ZW50LmlubmVySFRNTCA9IHRleHQ7XG5cbiAgICAgICAgICAgIGxldCB0aGVfZXJyb3IgPSBuZXcgRXJyb3IoKTtcbiAgICAgICAgICAgIHRoZV9lcnJvci5zdGFjayA9IHRyaW0oY29udGVudC5pbm5lclRleHQpO1xuXG4gICAgICAgICAgICB0aHJvdyB0aGVfZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGFyc2VkO1xuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlckZlZWRiYWNrKHJlc3BvbnNlKSB7XG4gICAgaWYgKFVOTE9BRElORykgeyByZXR1cm4gdHJ1ZTsgfVxuXG4gICAgbGV0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cyB8fCAocmVzcG9uc2UuZXJyb3IgPyAnZXJyb3InIDogJycpO1xuICAgIGxldCBtZXNzYWdlID0gcmVzcG9uc2UubWVzc2FnZSB8fCAocmVzcG9uc2UuZXJyb3IgPyByZXNwb25zZS5lcnJvci5tZXNzYWdlIDogbnVsbCk7XG4gICAgbGV0IHNldHRpbmdzID0gcmVzcG9uc2UudG9hc3RyIHx8IG51bGw7XG4gICAgbGV0IGJhY2t1cDtcblxuICAgIHN3aXRjaCAoc3RhdHVzKSB7XG4gICAgICAgIGNhc2UgJ3VuYXV0aGVudGljYXRlZCc6XG4gICAgICAgICAgICBkb2N1bWVudC5sb2NhdGlvbi5ocmVmID0gY29uZmlnLmJhc2VfdXJsX3JlbGF0aXZlO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3IoJ0xvZ2dlZCBvdXQnKTtcbiAgICAgICAgY2FzZSAndW5hdXRob3JpemVkJzpcbiAgICAgICAgICAgIHN0YXR1cyA9ICdlcnJvcic7XG4gICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZSB8fCAnVW5hdXRob3JpemVkLic7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICAgICAgc3RhdHVzID0gJ2Vycm9yJztcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdVbmtub3duIGVycm9yLic7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnc3VjY2Vzcyc6XG4gICAgICAgICAgICBzdGF0dXMgPSAnc3VjY2Vzcyc7XG4gICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZSB8fCAnJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgc3RhdHVzID0gJ2Vycm9yJztcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdJbnZhbGlkIEFKQVggcmVzcG9uc2UuJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChzZXR0aW5ncykge1xuICAgICAgICBiYWNrdXAgPSBPYmplY3QuYXNzaWduKHt9LCB0b2FzdHIub3B0aW9ucyk7XG4gICAgICAgIE9iamVjdC5rZXlzKHNldHRpbmdzKS5mb3JFYWNoKChrZXkpID0+IHsgdG9hc3RyLm9wdGlvbnNba2V5XSA9IHNldHRpbmdzW2tleV07IH0pO1xuICAgIH1cblxuICAgIGlmIChtZXNzYWdlICYmIChpc09ubGluZSB8fCAoIWlzT25saW5lICYmIHN0YXR1cyAhPT0gJ2Vycm9yJykpKSB7XG4gICAgICAgIHRvYXN0cltzdGF0dXMgPT09ICdzdWNjZXNzJyA/ICdzdWNjZXNzJyA6ICdlcnJvciddKG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIGlmIChzZXR0aW5ncykge1xuICAgICAgICB0b2FzdHIub3B0aW9ucyA9IGJhY2t1cDtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzcG9uc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VyRmVlZGJhY2tFcnJvcihlcnJvcikge1xuICAgIGlmIChVTkxPQURJTkcpIHsgcmV0dXJuIHRydWU7IH1cbiAgICBsZXQgc3RhY2sgPSBlcnJvci5zdGFjayA/IGA8cHJlPjxjb2RlPiR7ZXJyb3Iuc3RhY2t9PC9jb2RlPjwvcHJlPmAgOiAnJztcbiAgICB0b2FzdHIuZXJyb3IoYEZldGNoIEZhaWxlZDogPGJyIC8+ICR7ZXJyb3IubWVzc2FnZX0gJHtzdGFja31gKTtcbiAgICBjb25zb2xlLmVycm9yKGAke2Vycm9yLm1lc3NhZ2V9IGF0ICR7ZXJyb3Iuc3RhY2t9YCk7XG59XG5cbiQoZ2xvYmFsKS5vbignYmVmb3JldW5sb2FkLl9hamF4JywgKCkgPT4ge1xuICAgIFVOTE9BRElORyA9IHRydWU7XG59KTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./app/utils/response.js\n"); /***/ }), /***/ "./app/utils/selectize-option-click.js": -/*!*********************************************!* +/*!*********************************************!*\ !*** ./app/utils/selectize-option-click.js ***! \*********************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { @@ -793,7 +804,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var jque /***/ }), /***/ "./app/utils/selectize-required-fix.js": -/*!*********************************************!* +/*!*********************************************!*\ !*** ./app/utils/selectize-required-fix.js ***! \*********************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { @@ -804,18 +815,18 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var sele /***/ }), /***/ "./app/utils/sidebar.js": -/*!******************************!* +/*!******************************!*\ !*** ./app/utils/sidebar.js ***! \******************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => /* binding */ Sidebar,\n/* harmony export */ \"Instance\": () => /* binding */ Instance\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var es6_map__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! es6-map */ \"./node_modules/es6-map/index.js\");\n/* harmony import */ var es6_map__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(es6_map__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _utils_cookies__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/cookies */ \"./app/utils/cookies.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\nvar MOBILE_BREAKPOINT = 48 - 0.062;\nvar DESKTOP_BREAKPOINT = 75 + 0.063;\nvar EVENTS = 'touchstart._grav click._grav';\nvar TARGETS = '[data-sidebar-mobile-toggle], #overlay';\nvar MOBILE_QUERY = \"(max-width: \".concat(MOBILE_BREAKPOINT, \"em)\");\nvar DESKTOP_QUERY = \"(min-width: \".concat(DESKTOP_BREAKPOINT, \"em)\");\nvar map = new (es6_map__WEBPACK_IMPORTED_MODULE_1___default())();\n\nvar Sidebar = /*#__PURE__*/function () {\n function Sidebar() {\n _classCallCheck(this, Sidebar);\n\n this.timeout = null;\n this.isOpen = false;\n this.body = jquery__WEBPACK_IMPORTED_MODULE_0___default()('body');\n this.matchMedia = __webpack_require__.g.matchMedia(MOBILE_QUERY);\n this.enable();\n }\n\n _createClass(Sidebar, [{\n key: \"enable\",\n value: function enable() {\n var sidebar = jquery__WEBPACK_IMPORTED_MODULE_0___default()('#admin-sidebar');\n this.matchMedia.addListener(this._getBound('checkMatch'));\n this.checkMatch(this.matchMedia);\n this.body.on(EVENTS, '[data-sidebar-toggle]', this._getBound('toggleSidebarState'));\n\n if (sidebar.data('quickopen')) {\n sidebar.hover(this._getBound('quickOpenIn'), this._getBound('quickOpenOut'));\n }\n }\n }, {\n key: \"disable\",\n value: function disable() {\n var sidebar = jquery__WEBPACK_IMPORTED_MODULE_0___default()('#admin-sidebar');\n this.close();\n this.matchMedia.removeListener(this._getBound('checkMatch'));\n this.body.off(EVENTS, '[data-sidebar-toggle]', this._getBound('toggleSidebarState'));\n\n if (sidebar.data('quickopen')) {\n sidebar.off('mouseenter mouseleave');\n }\n }\n }, {\n key: \"attach\",\n value: function attach() {\n this.body.on(EVENTS, TARGETS, this._getBound('toggle'));\n }\n }, {\n key: \"detach\",\n value: function detach() {\n this.body.off(EVENTS, TARGETS, this._getBound('toggle'));\n }\n }, {\n key: \"quickOpenIn\",\n value: function quickOpenIn()\n /* event */\n {\n var _this = this;\n\n var isDesktop = __webpack_require__.g.matchMedia(DESKTOP_QUERY).matches;\n var delay = jquery__WEBPACK_IMPORTED_MODULE_0___default()('#admin-sidebar').data('quickopen-delay') || 500;\n\n if (this.body.hasClass('sidebar-mobile-open')) {\n return;\n }\n\n var shouldQuickOpen = isDesktop ? this.body.hasClass('sidebar-closed') : !this.body.hasClass('sidebar-open');\n\n if (!shouldQuickOpen && !this.body.hasClass('sidebar-quickopen')) {\n return this.quickOpenOut();\n }\n\n this.timeout = setTimeout(function () {\n _this.body.addClass('sidebar-open sidebar-quickopen');\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(__webpack_require__.g).trigger('sidebar_state._grav', isDesktop);\n }, delay);\n }\n }, {\n key: \"quickOpenOut\",\n value: function quickOpenOut()\n /* event */\n {\n clearTimeout(this.timeout);\n\n if (this.body.hasClass('sidebar-quickopen')) {\n this.body.removeClass('sidebar-open sidebar-quickopen');\n }\n\n return true;\n }\n }, {\n key: \"open\",\n value: function open(event) {\n var _this2 = this;\n\n var quick = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (event) {\n event.preventDefault();\n }\n\n var overlay = jquery__WEBPACK_IMPORTED_MODULE_0___default()('#overlay');\n var sidebar = jquery__WEBPACK_IMPORTED_MODULE_0___default()('#admin-sidebar');\n this.body.addClass('sidebar-mobile-open');\n overlay.css('display', 'block');\n\n if (!quick) {\n sidebar.css('display', 'block').animate({\n opacity: 1\n }, 200, function () {\n _this2.isOpen = true;\n });\n } else {\n sidebar.css({\n display: 'block',\n opacity: 1\n });\n this.isOpen = true;\n }\n }\n }, {\n key: \"close\",\n value: function close(event) {\n var _this3 = this;\n\n var quick = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (event) {\n event.preventDefault();\n }\n\n var overlay = jquery__WEBPACK_IMPORTED_MODULE_0___default()('#overlay');\n var sidebar = jquery__WEBPACK_IMPORTED_MODULE_0___default()('#admin-sidebar');\n this.body.removeClass('sidebar-mobile-open');\n overlay.css('display', 'none');\n\n if (!quick) {\n sidebar.animate({\n opacity: 0\n }, 200, function () {\n sidebar.css('display', 'none');\n _this3.isOpen = false;\n });\n } else {\n sidebar.css({\n opacity: 0,\n display: 'none'\n });\n this.isOpen = false;\n }\n }\n }, {\n key: \"toggle\",\n value: function toggle(event) {\n if (event) {\n event.preventDefault();\n }\n\n return this[this.isOpen ? 'close' : 'open'](event);\n }\n }, {\n key: \"toggleSidebarState\",\n value: function toggleSidebarState(event) {\n if (event) {\n event.preventDefault();\n }\n\n clearTimeout(this.timeout);\n var isDesktop = __webpack_require__.g.matchMedia(DESKTOP_QUERY).matches;\n var cookie = null;\n\n if (isDesktop) {\n this.body.removeClass('sidebar-open');\n }\n\n if (!isDesktop) {\n this.body.removeClass('sidebar-closed');\n this.body.removeClass('sidebar-mobile-open');\n }\n\n this.body.toggleClass(\"sidebar-\".concat(isDesktop ? 'closed' : 'open'));\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(__webpack_require__.g).trigger('sidebar_state._grav', isDesktop);\n\n if (isDesktop) {\n cookie = !this.body.hasClass('sidebar-closed');\n } else {\n cookie = this.body.hasClass('sidebar-open');\n }\n\n _utils_cookies__WEBPACK_IMPORTED_MODULE_2__.default.set('grav-admin-sidebar', cookie, {\n expires: Infinity\n });\n }\n }, {\n key: \"checkMatch\",\n value: function checkMatch(data) {\n var sidebar = jquery__WEBPACK_IMPORTED_MODULE_0___default()('#admin-sidebar');\n var overlay = jquery__WEBPACK_IMPORTED_MODULE_0___default()('#overlay');\n this.isOpen = false;\n overlay.css('display', 'none');\n sidebar.css({\n display: data.matches ? 'none' : 'inherit',\n opacity: data.matches ? 0 : 1\n });\n\n if (data.matches) {\n this.body.removeClass('sidebar-open sidebar-closed');\n }\n\n this[data.matches ? 'attach' : 'detach']();\n }\n }, {\n key: \"_resetMap\",\n value: function _resetMap() {\n return map.clear();\n }\n }, {\n key: \"_getBound\",\n value: function _getBound(fn) {\n if (map.has(fn)) {\n return map.get(fn);\n }\n\n return map.set(fn, this[fn].bind(this)).get(fn);\n }\n }]);\n\n return Sidebar;\n}();\n\n\nvar Instance = new Sidebar();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL3V0aWxzL3NpZGViYXIuanM/MzM1MSJdLCJuYW1lcyI6WyJNT0JJTEVfQlJFQUtQT0lOVCIsIkRFU0tUT1BfQlJFQUtQT0lOVCIsIkVWRU5UUyIsIlRBUkdFVFMiLCJNT0JJTEVfUVVFUlkiLCJERVNLVE9QX1FVRVJZIiwibWFwIiwiTWFwIiwiU2lkZWJhciIsInRpbWVvdXQiLCJpc09wZW4iLCJib2R5IiwiJCIsIm1hdGNoTWVkaWEiLCJnbG9iYWwiLCJlbmFibGUiLCJzaWRlYmFyIiwiYWRkTGlzdGVuZXIiLCJfZ2V0Qm91bmQiLCJjaGVja01hdGNoIiwib24iLCJkYXRhIiwiaG92ZXIiLCJjbG9zZSIsInJlbW92ZUxpc3RlbmVyIiwib2ZmIiwiaXNEZXNrdG9wIiwibWF0Y2hlcyIsImRlbGF5IiwiaGFzQ2xhc3MiLCJzaG91bGRRdWlja09wZW4iLCJxdWlja09wZW5PdXQiLCJzZXRUaW1lb3V0IiwiYWRkQ2xhc3MiLCJ0cmlnZ2VyIiwiY2xlYXJUaW1lb3V0IiwicmVtb3ZlQ2xhc3MiLCJldmVudCIsInF1aWNrIiwicHJldmVudERlZmF1bHQiLCJvdmVybGF5IiwiY3NzIiwiYW5pbWF0ZSIsIm9wYWNpdHkiLCJkaXNwbGF5IiwiY29va2llIiwidG9nZ2xlQ2xhc3MiLCJDb29raWVzIiwiZXhwaXJlcyIsIkluZmluaXR5IiwiY2xlYXIiLCJmbiIsImhhcyIsImdldCIsInNldCIsImJpbmQiLCJJbnN0YW5jZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUVBLElBQU1BLGlCQUFpQixHQUFHLEtBQUssS0FBL0I7QUFDQSxJQUFNQyxrQkFBa0IsR0FBRyxLQUFLLEtBQWhDO0FBQ0EsSUFBTUMsTUFBTSxHQUFHLDhCQUFmO0FBQ0EsSUFBTUMsT0FBTyxHQUFHLHdDQUFoQjtBQUNBLElBQU1DLFlBQVkseUJBQWtCSixpQkFBbEIsUUFBbEI7QUFDQSxJQUFNSyxhQUFhLHlCQUFrQkosa0JBQWxCLFFBQW5CO0FBRUEsSUFBSUssR0FBRyxHQUFHLElBQUlDLGdEQUFKLEVBQVY7O0lBRXFCQyxPO0FBQ2pCLHFCQUFjO0FBQUE7O0FBQ1YsU0FBS0MsT0FBTCxHQUFlLElBQWY7QUFDQSxTQUFLQyxNQUFMLEdBQWMsS0FBZDtBQUNBLFNBQUtDLElBQUwsR0FBWUMsNkNBQUMsQ0FBQyxNQUFELENBQWI7QUFDQSxTQUFLQyxVQUFMLEdBQWtCQyxxQkFBTSxDQUFDRCxVQUFQLENBQWtCVCxZQUFsQixDQUFsQjtBQUNBLFNBQUtXLE1BQUw7QUFDSDs7Ozs2QkFFUTtBQUNMLFVBQU1DLE9BQU8sR0FBR0osNkNBQUMsQ0FBQyxnQkFBRCxDQUFqQjtBQUVBLFdBQUtDLFVBQUwsQ0FBZ0JJLFdBQWhCLENBQTRCLEtBQUtDLFNBQUwsQ0FBZSxZQUFmLENBQTVCO0FBQ0EsV0FBS0MsVUFBTCxDQUFnQixLQUFLTixVQUFyQjtBQUNBLFdBQUtGLElBQUwsQ0FBVVMsRUFBVixDQUFhbEIsTUFBYixFQUFxQix1QkFBckIsRUFBOEMsS0FBS2dCLFNBQUwsQ0FBZSxvQkFBZixDQUE5Qzs7QUFFQSxVQUFJRixPQUFPLENBQUNLLElBQVIsQ0FBYSxXQUFiLENBQUosRUFBK0I7QUFDM0JMLGVBQU8sQ0FBQ00sS0FBUixDQUFjLEtBQUtKLFNBQUwsQ0FBZSxhQUFmLENBQWQsRUFBNkMsS0FBS0EsU0FBTCxDQUFlLGNBQWYsQ0FBN0M7QUFDSDtBQUNKOzs7OEJBRVM7QUFDTixVQUFNRixPQUFPLEdBQUdKLDZDQUFDLENBQUMsZ0JBQUQsQ0FBakI7QUFFQSxXQUFLVyxLQUFMO0FBQ0EsV0FBS1YsVUFBTCxDQUFnQlcsY0FBaEIsQ0FBK0IsS0FBS04sU0FBTCxDQUFlLFlBQWYsQ0FBL0I7QUFDQSxXQUFLUCxJQUFMLENBQVVjLEdBQVYsQ0FBY3ZCLE1BQWQsRUFBc0IsdUJBQXRCLEVBQStDLEtBQUtnQixTQUFMLENBQWUsb0JBQWYsQ0FBL0M7O0FBQ0EsVUFBSUYsT0FBTyxDQUFDSyxJQUFSLENBQWEsV0FBYixDQUFKLEVBQStCO0FBQzNCTCxlQUFPLENBQUNTLEdBQVIsQ0FBWSx1QkFBWjtBQUNIO0FBQ0o7Ozs2QkFFUTtBQUNMLFdBQUtkLElBQUwsQ0FBVVMsRUFBVixDQUFhbEIsTUFBYixFQUFxQkMsT0FBckIsRUFBOEIsS0FBS2UsU0FBTCxDQUFlLFFBQWYsQ0FBOUI7QUFDSDs7OzZCQUVRO0FBQ0wsV0FBS1AsSUFBTCxDQUFVYyxHQUFWLENBQWN2QixNQUFkLEVBQXNCQyxPQUF0QixFQUErQixLQUFLZSxTQUFMLENBQWUsUUFBZixDQUEvQjtBQUNIOzs7O0FBRVc7QUFBYTtBQUFBOztBQUNyQixVQUFJUSxTQUFTLEdBQUdaLHFCQUFNLENBQUNELFVBQVAsQ0FBa0JSLGFBQWxCLEVBQWlDc0IsT0FBakQ7QUFDQSxVQUFJQyxLQUFLLEdBQUdoQiw2Q0FBQyxDQUFDLGdCQUFELENBQUQsQ0FBb0JTLElBQXBCLENBQXlCLGlCQUF6QixLQUErQyxHQUEzRDs7QUFDQSxVQUFJLEtBQUtWLElBQUwsQ0FBVWtCLFFBQVYsQ0FBbUIscUJBQW5CLENBQUosRUFBK0M7QUFBRTtBQUFTOztBQUUxRCxVQUFJQyxlQUFlLEdBQUdKLFNBQVMsR0FBRyxLQUFLZixJQUFMLENBQVVrQixRQUFWLENBQW1CLGdCQUFuQixDQUFILEdBQTBDLENBQUMsS0FBS2xCLElBQUwsQ0FBVWtCLFFBQVYsQ0FBbUIsY0FBbkIsQ0FBMUU7O0FBQ0EsVUFBSSxDQUFDQyxlQUFELElBQW9CLENBQUMsS0FBS25CLElBQUwsQ0FBVWtCLFFBQVYsQ0FBbUIsbUJBQW5CLENBQXpCLEVBQWtFO0FBQUUsZUFBTyxLQUFLRSxZQUFMLEVBQVA7QUFBNkI7O0FBRWpHLFdBQUt0QixPQUFMLEdBQWV1QixVQUFVLENBQUMsWUFBTTtBQUM1QixhQUFJLENBQUNyQixJQUFMLENBQVVzQixRQUFWLENBQW1CLGdDQUFuQjs7QUFDQXJCLHFEQUFDLENBQUNFLHFCQUFELENBQUQsQ0FBVW9CLE9BQVYsQ0FBa0IscUJBQWxCLEVBQXlDUixTQUF6QztBQUNILE9BSHdCLEVBR3RCRSxLQUhzQixDQUF6QjtBQUlIOzs7O0FBRVk7QUFBYTtBQUN0Qk8sa0JBQVksQ0FBQyxLQUFLMUIsT0FBTixDQUFaOztBQUNBLFVBQUksS0FBS0UsSUFBTCxDQUFVa0IsUUFBVixDQUFtQixtQkFBbkIsQ0FBSixFQUE2QztBQUN6QyxhQUFLbEIsSUFBTCxDQUFVeUIsV0FBVixDQUFzQixnQ0FBdEI7QUFDSDs7QUFFRCxhQUFPLElBQVA7QUFDSDs7O3lCQUVJQyxLLEVBQXNCO0FBQUE7O0FBQUEsVUFBZkMsS0FBZSx1RUFBUCxLQUFPOztBQUN2QixVQUFJRCxLQUFKLEVBQVc7QUFBRUEsYUFBSyxDQUFDRSxjQUFOO0FBQXlCOztBQUN0QyxVQUFJQyxPQUFPLEdBQUc1Qiw2Q0FBQyxDQUFDLFVBQUQsQ0FBZjtBQUNBLFVBQUlJLE9BQU8sR0FBR0osNkNBQUMsQ0FBQyxnQkFBRCxDQUFmO0FBRUEsV0FBS0QsSUFBTCxDQUFVc0IsUUFBVixDQUFtQixxQkFBbkI7QUFDQU8sYUFBTyxDQUFDQyxHQUFSLENBQVksU0FBWixFQUF1QixPQUF2Qjs7QUFFQSxVQUFJLENBQUNILEtBQUwsRUFBWTtBQUNSdEIsZUFBTyxDQUFDeUIsR0FBUixDQUFZLFNBQVosRUFBdUIsT0FBdkIsRUFBZ0NDLE9BQWhDLENBQXdDO0FBQ3BDQyxpQkFBTyxFQUFFO0FBRDJCLFNBQXhDLEVBRUcsR0FGSCxFQUVRLFlBQU07QUFDVixnQkFBSSxDQUFDakMsTUFBTCxHQUFjLElBQWQ7QUFDSCxTQUpEO0FBS0gsT0FORCxNQU1PO0FBQ0hNLGVBQU8sQ0FBQ3lCLEdBQVIsQ0FBWTtBQUFFRyxpQkFBTyxFQUFFLE9BQVg7QUFBb0JELGlCQUFPLEVBQUU7QUFBN0IsU0FBWjtBQUNBLGFBQUtqQyxNQUFMLEdBQWMsSUFBZDtBQUNIO0FBQ0o7OzswQkFFSzJCLEssRUFBc0I7QUFBQTs7QUFBQSxVQUFmQyxLQUFlLHVFQUFQLEtBQU87O0FBQ3hCLFVBQUlELEtBQUosRUFBVztBQUFFQSxhQUFLLENBQUNFLGNBQU47QUFBeUI7O0FBQ3RDLFVBQUlDLE9BQU8sR0FBRzVCLDZDQUFDLENBQUMsVUFBRCxDQUFmO0FBQ0EsVUFBSUksT0FBTyxHQUFHSiw2Q0FBQyxDQUFDLGdCQUFELENBQWY7QUFFQSxXQUFLRCxJQUFMLENBQVV5QixXQUFWLENBQXNCLHFCQUF0QjtBQUNBSSxhQUFPLENBQUNDLEdBQVIsQ0FBWSxTQUFaLEVBQXVCLE1BQXZCOztBQUVBLFVBQUksQ0FBQ0gsS0FBTCxFQUFZO0FBQ1J0QixlQUFPLENBQUMwQixPQUFSLENBQWdCO0FBQ1pDLGlCQUFPLEVBQUU7QUFERyxTQUFoQixFQUVHLEdBRkgsRUFFUSxZQUFNO0FBQ1YzQixpQkFBTyxDQUFDeUIsR0FBUixDQUFZLFNBQVosRUFBdUIsTUFBdkI7QUFDQSxnQkFBSSxDQUFDL0IsTUFBTCxHQUFjLEtBQWQ7QUFDSCxTQUxEO0FBTUgsT0FQRCxNQU9PO0FBQ0hNLGVBQU8sQ0FBQ3lCLEdBQVIsQ0FBWTtBQUFFRSxpQkFBTyxFQUFFLENBQVg7QUFBY0MsaUJBQU8sRUFBRTtBQUF2QixTQUFaO0FBQ0EsYUFBS2xDLE1BQUwsR0FBYyxLQUFkO0FBQ0g7QUFDSjs7OzJCQUVNMkIsSyxFQUFPO0FBQ1YsVUFBSUEsS0FBSixFQUFXO0FBQUVBLGFBQUssQ0FBQ0UsY0FBTjtBQUF5Qjs7QUFDdEMsYUFBTyxLQUFLLEtBQUs3QixNQUFMLEdBQWMsT0FBZCxHQUF3QixNQUE3QixFQUFxQzJCLEtBQXJDLENBQVA7QUFDSDs7O3VDQUVrQkEsSyxFQUFPO0FBQ3RCLFVBQUlBLEtBQUosRUFBVztBQUFFQSxhQUFLLENBQUNFLGNBQU47QUFBeUI7O0FBQ3RDSixrQkFBWSxDQUFDLEtBQUsxQixPQUFOLENBQVo7QUFDQSxVQUFJaUIsU0FBUyxHQUFHWixxQkFBTSxDQUFDRCxVQUFQLENBQWtCUixhQUFsQixFQUFpQ3NCLE9BQWpEO0FBQ0EsVUFBSWtCLE1BQU0sR0FBRyxJQUFiOztBQUVBLFVBQUluQixTQUFKLEVBQWU7QUFDWCxhQUFLZixJQUFMLENBQVV5QixXQUFWLENBQXNCLGNBQXRCO0FBQ0g7O0FBRUQsVUFBSSxDQUFDVixTQUFMLEVBQWdCO0FBQ1osYUFBS2YsSUFBTCxDQUFVeUIsV0FBVixDQUFzQixnQkFBdEI7QUFDQSxhQUFLekIsSUFBTCxDQUFVeUIsV0FBVixDQUFzQixxQkFBdEI7QUFDSDs7QUFFRCxXQUFLekIsSUFBTCxDQUFVbUMsV0FBVixtQkFBaUNwQixTQUFTLEdBQUcsUUFBSCxHQUFjLE1BQXhEO0FBQ0FkLG1EQUFDLENBQUNFLHFCQUFELENBQUQsQ0FBVW9CLE9BQVYsQ0FBa0IscUJBQWxCLEVBQXlDUixTQUF6Qzs7QUFFQSxVQUFJQSxTQUFKLEVBQWU7QUFDWG1CLGNBQU0sR0FBRyxDQUFDLEtBQUtsQyxJQUFMLENBQVVrQixRQUFWLENBQW1CLGdCQUFuQixDQUFWO0FBQ0gsT0FGRCxNQUVPO0FBQ0hnQixjQUFNLEdBQUcsS0FBS2xDLElBQUwsQ0FBVWtCLFFBQVYsQ0FBbUIsY0FBbkIsQ0FBVDtBQUNIOztBQUVEa0IsNkRBQUEsQ0FBWSxvQkFBWixFQUFrQ0YsTUFBbEMsRUFBMEM7QUFBRUcsZUFBTyxFQUFFQztBQUFYLE9BQTFDO0FBQ0g7OzsrQkFFVTVCLEksRUFBTTtBQUNiLFVBQUlMLE9BQU8sR0FBR0osNkNBQUMsQ0FBQyxnQkFBRCxDQUFmO0FBQ0EsVUFBSTRCLE9BQU8sR0FBRzVCLDZDQUFDLENBQUMsVUFBRCxDQUFmO0FBQ0EsV0FBS0YsTUFBTCxHQUFjLEtBQWQ7QUFFQThCLGFBQU8sQ0FBQ0MsR0FBUixDQUFZLFNBQVosRUFBdUIsTUFBdkI7QUFDQXpCLGFBQU8sQ0FBQ3lCLEdBQVIsQ0FBWTtBQUNSRyxlQUFPLEVBQUV2QixJQUFJLENBQUNNLE9BQUwsR0FBZSxNQUFmLEdBQXdCLFNBRHpCO0FBRVJnQixlQUFPLEVBQUV0QixJQUFJLENBQUNNLE9BQUwsR0FBZSxDQUFmLEdBQW1CO0FBRnBCLE9BQVo7O0FBS0EsVUFBSU4sSUFBSSxDQUFDTSxPQUFULEVBQWtCO0FBQ2QsYUFBS2hCLElBQUwsQ0FBVXlCLFdBQVYsQ0FBc0IsNkJBQXRCO0FBQ0g7O0FBRUQsV0FBS2YsSUFBSSxDQUFDTSxPQUFMLEdBQWUsUUFBZixHQUEwQixRQUEvQjtBQUNIOzs7Z0NBRVc7QUFDUixhQUFPckIsR0FBRyxDQUFDNEMsS0FBSixFQUFQO0FBQ0g7Ozs4QkFFU0MsRSxFQUFJO0FBQ1YsVUFBSTdDLEdBQUcsQ0FBQzhDLEdBQUosQ0FBUUQsRUFBUixDQUFKLEVBQWlCO0FBQ2IsZUFBTzdDLEdBQUcsQ0FBQytDLEdBQUosQ0FBUUYsRUFBUixDQUFQO0FBQ0g7O0FBRUQsYUFBTzdDLEdBQUcsQ0FBQ2dELEdBQUosQ0FBUUgsRUFBUixFQUFZLEtBQUtBLEVBQUwsRUFBU0ksSUFBVCxDQUFjLElBQWQsQ0FBWixFQUFpQ0YsR0FBakMsQ0FBcUNGLEVBQXJDLENBQVA7QUFDSDs7Ozs7OztBQUdFLElBQUlLLFFBQVEsR0FBRyxJQUFJaEQsT0FBSixFQUFmIiwiZmlsZSI6Ii4vYXBwL3V0aWxzL3NpZGViYXIuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IE1hcCBmcm9tICdlczYtbWFwJztcbmltcG9ydCBDb29raWVzIGZyb20gJy4uL3V0aWxzL2Nvb2tpZXMnO1xuXG5jb25zdCBNT0JJTEVfQlJFQUtQT0lOVCA9IDQ4IC0gMC4wNjI7XG5jb25zdCBERVNLVE9QX0JSRUFLUE9JTlQgPSA3NSArIDAuMDYzO1xuY29uc3QgRVZFTlRTID0gJ3RvdWNoc3RhcnQuX2dyYXYgY2xpY2suX2dyYXYnO1xuY29uc3QgVEFSR0VUUyA9ICdbZGF0YS1zaWRlYmFyLW1vYmlsZS10b2dnbGVdLCAjb3ZlcmxheSc7XG5jb25zdCBNT0JJTEVfUVVFUlkgPSBgKG1heC13aWR0aDogJHtNT0JJTEVfQlJFQUtQT0lOVH1lbSlgO1xuY29uc3QgREVTS1RPUF9RVUVSWSA9IGAobWluLXdpZHRoOiAke0RFU0tUT1BfQlJFQUtQT0lOVH1lbSlgO1xuXG5sZXQgbWFwID0gbmV3IE1hcCgpO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTaWRlYmFyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy50aW1lb3V0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5ib2R5ID0gJCgnYm9keScpO1xuICAgICAgICB0aGlzLm1hdGNoTWVkaWEgPSBnbG9iYWwubWF0Y2hNZWRpYShNT0JJTEVfUVVFUlkpO1xuICAgICAgICB0aGlzLmVuYWJsZSgpO1xuICAgIH1cblxuICAgIGVuYWJsZSgpIHtcbiAgICAgICAgY29uc3Qgc2lkZWJhciA9ICQoJyNhZG1pbi1zaWRlYmFyJyk7XG5cbiAgICAgICAgdGhpcy5tYXRjaE1lZGlhLmFkZExpc3RlbmVyKHRoaXMuX2dldEJvdW5kKCdjaGVja01hdGNoJykpO1xuICAgICAgICB0aGlzLmNoZWNrTWF0Y2godGhpcy5tYXRjaE1lZGlhKTtcbiAgICAgICAgdGhpcy5ib2R5Lm9uKEVWRU5UUywgJ1tkYXRhLXNpZGViYXItdG9nZ2xlXScsIHRoaXMuX2dldEJvdW5kKCd0b2dnbGVTaWRlYmFyU3RhdGUnKSk7XG5cbiAgICAgICAgaWYgKHNpZGViYXIuZGF0YSgncXVpY2tvcGVuJykpIHtcbiAgICAgICAgICAgIHNpZGViYXIuaG92ZXIodGhpcy5fZ2V0Qm91bmQoJ3F1aWNrT3BlbkluJyksIHRoaXMuX2dldEJvdW5kKCdxdWlja09wZW5PdXQnKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkaXNhYmxlKCkge1xuICAgICAgICBjb25zdCBzaWRlYmFyID0gJCgnI2FkbWluLXNpZGViYXInKTtcblxuICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIHRoaXMubWF0Y2hNZWRpYS5yZW1vdmVMaXN0ZW5lcih0aGlzLl9nZXRCb3VuZCgnY2hlY2tNYXRjaCcpKTtcbiAgICAgICAgdGhpcy5ib2R5Lm9mZihFVkVOVFMsICdbZGF0YS1zaWRlYmFyLXRvZ2dsZV0nLCB0aGlzLl9nZXRCb3VuZCgndG9nZ2xlU2lkZWJhclN0YXRlJykpO1xuICAgICAgICBpZiAoc2lkZWJhci5kYXRhKCdxdWlja29wZW4nKSkge1xuICAgICAgICAgICAgc2lkZWJhci5vZmYoJ21vdXNlZW50ZXIgbW91c2VsZWF2ZScpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXR0YWNoKCkge1xuICAgICAgICB0aGlzLmJvZHkub24oRVZFTlRTLCBUQVJHRVRTLCB0aGlzLl9nZXRCb3VuZCgndG9nZ2xlJykpO1xuICAgIH1cblxuICAgIGRldGFjaCgpIHtcbiAgICAgICAgdGhpcy5ib2R5Lm9mZihFVkVOVFMsIFRBUkdFVFMsIHRoaXMuX2dldEJvdW5kKCd0b2dnbGUnKSk7XG4gICAgfVxuXG4gICAgcXVpY2tPcGVuSW4oLyogZXZlbnQgKi8pIHtcbiAgICAgICAgbGV0IGlzRGVza3RvcCA9IGdsb2JhbC5tYXRjaE1lZGlhKERFU0tUT1BfUVVFUlkpLm1hdGNoZXM7XG4gICAgICAgIGxldCBkZWxheSA9ICQoJyNhZG1pbi1zaWRlYmFyJykuZGF0YSgncXVpY2tvcGVuLWRlbGF5JykgfHwgNTAwO1xuICAgICAgICBpZiAodGhpcy5ib2R5Lmhhc0NsYXNzKCdzaWRlYmFyLW1vYmlsZS1vcGVuJykpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgbGV0IHNob3VsZFF1aWNrT3BlbiA9IGlzRGVza3RvcCA/IHRoaXMuYm9keS5oYXNDbGFzcygnc2lkZWJhci1jbG9zZWQnKSA6ICF0aGlzLmJvZHkuaGFzQ2xhc3MoJ3NpZGViYXItb3BlbicpO1xuICAgICAgICBpZiAoIXNob3VsZFF1aWNrT3BlbiAmJiAhdGhpcy5ib2R5Lmhhc0NsYXNzKCdzaWRlYmFyLXF1aWNrb3BlbicpKSB7IHJldHVybiB0aGlzLnF1aWNrT3Blbk91dCgpOyB9XG5cbiAgICAgICAgdGhpcy50aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmJvZHkuYWRkQ2xhc3MoJ3NpZGViYXItb3BlbiBzaWRlYmFyLXF1aWNrb3BlbicpO1xuICAgICAgICAgICAgJChnbG9iYWwpLnRyaWdnZXIoJ3NpZGViYXJfc3RhdGUuX2dyYXYnLCBpc0Rlc2t0b3ApO1xuICAgICAgICB9LCBkZWxheSk7XG4gICAgfVxuXG4gICAgcXVpY2tPcGVuT3V0KC8qIGV2ZW50ICovKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpO1xuICAgICAgICBpZiAodGhpcy5ib2R5Lmhhc0NsYXNzKCdzaWRlYmFyLXF1aWNrb3BlbicpKSB7XG4gICAgICAgICAgICB0aGlzLmJvZHkucmVtb3ZlQ2xhc3MoJ3NpZGViYXItb3BlbiBzaWRlYmFyLXF1aWNrb3BlbicpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgb3BlbihldmVudCwgcXVpY2sgPSBmYWxzZSkge1xuICAgICAgICBpZiAoZXZlbnQpIHsgZXZlbnQucHJldmVudERlZmF1bHQoKTsgfVxuICAgICAgICBsZXQgb3ZlcmxheSA9ICQoJyNvdmVybGF5Jyk7XG4gICAgICAgIGxldCBzaWRlYmFyID0gJCgnI2FkbWluLXNpZGViYXInKTtcblxuICAgICAgICB0aGlzLmJvZHkuYWRkQ2xhc3MoJ3NpZGViYXItbW9iaWxlLW9wZW4nKTtcbiAgICAgICAgb3ZlcmxheS5jc3MoJ2Rpc3BsYXknLCAnYmxvY2snKTtcblxuICAgICAgICBpZiAoIXF1aWNrKSB7XG4gICAgICAgICAgICBzaWRlYmFyLmNzcygnZGlzcGxheScsICdibG9jaycpLmFuaW1hdGUoe1xuICAgICAgICAgICAgICAgIG9wYWNpdHk6IDFcbiAgICAgICAgICAgIH0sIDIwMCwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2lkZWJhci5jc3MoeyBkaXNwbGF5OiAnYmxvY2snLCBvcGFjaXR5OiAxIH0pO1xuICAgICAgICAgICAgdGhpcy5pc09wZW4gPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY2xvc2UoZXZlbnQsIHF1aWNrID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKGV2ZW50KSB7IGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IH1cbiAgICAgICAgbGV0IG92ZXJsYXkgPSAkKCcjb3ZlcmxheScpO1xuICAgICAgICBsZXQgc2lkZWJhciA9ICQoJyNhZG1pbi1zaWRlYmFyJyk7XG5cbiAgICAgICAgdGhpcy5ib2R5LnJlbW92ZUNsYXNzKCdzaWRlYmFyLW1vYmlsZS1vcGVuJyk7XG4gICAgICAgIG92ZXJsYXkuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTtcblxuICAgICAgICBpZiAoIXF1aWNrKSB7XG4gICAgICAgICAgICBzaWRlYmFyLmFuaW1hdGUoe1xuICAgICAgICAgICAgICAgIG9wYWNpdHk6IDBcbiAgICAgICAgICAgIH0sIDIwMCwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHNpZGViYXIuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICAgICAgICAgICAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzaWRlYmFyLmNzcyh7IG9wYWNpdHk6IDAsIGRpc3BsYXk6ICdub25lJyB9KTtcbiAgICAgICAgICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0b2dnbGUoZXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50KSB7IGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IH1cbiAgICAgICAgcmV0dXJuIHRoaXNbdGhpcy5pc09wZW4gPyAnY2xvc2UnIDogJ29wZW4nXShldmVudCk7XG4gICAgfVxuXG4gICAgdG9nZ2xlU2lkZWJhclN0YXRlKGV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudCkgeyBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyB9XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpO1xuICAgICAgICBsZXQgaXNEZXNrdG9wID0gZ2xvYmFsLm1hdGNoTWVkaWEoREVTS1RPUF9RVUVSWSkubWF0Y2hlcztcbiAgICAgICAgbGV0IGNvb2tpZSA9IG51bGw7XG5cbiAgICAgICAgaWYgKGlzRGVza3RvcCkge1xuICAgICAgICAgICAgdGhpcy5ib2R5LnJlbW92ZUNsYXNzKCdzaWRlYmFyLW9wZW4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNEZXNrdG9wKSB7XG4gICAgICAgICAgICB0aGlzLmJvZHkucmVtb3ZlQ2xhc3MoJ3NpZGViYXItY2xvc2VkJyk7XG4gICAgICAgICAgICB0aGlzLmJvZHkucmVtb3ZlQ2xhc3MoJ3NpZGViYXItbW9iaWxlLW9wZW4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYm9keS50b2dnbGVDbGFzcyhgc2lkZWJhci0ke2lzRGVza3RvcCA/ICdjbG9zZWQnIDogJ29wZW4nfWApO1xuICAgICAgICAkKGdsb2JhbCkudHJpZ2dlcignc2lkZWJhcl9zdGF0ZS5fZ3JhdicsIGlzRGVza3RvcCk7XG5cbiAgICAgICAgaWYgKGlzRGVza3RvcCkge1xuICAgICAgICAgICAgY29va2llID0gIXRoaXMuYm9keS5oYXNDbGFzcygnc2lkZWJhci1jbG9zZWQnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvb2tpZSA9IHRoaXMuYm9keS5oYXNDbGFzcygnc2lkZWJhci1vcGVuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBDb29raWVzLnNldCgnZ3Jhdi1hZG1pbi1zaWRlYmFyJywgY29va2llLCB7IGV4cGlyZXM6IEluZmluaXR5IH0pO1xuICAgIH1cblxuICAgIGNoZWNrTWF0Y2goZGF0YSkge1xuICAgICAgICBsZXQgc2lkZWJhciA9ICQoJyNhZG1pbi1zaWRlYmFyJyk7XG4gICAgICAgIGxldCBvdmVybGF5ID0gJCgnI292ZXJsYXknKTtcbiAgICAgICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcblxuICAgICAgICBvdmVybGF5LmNzcygnZGlzcGxheScsICdub25lJyk7XG4gICAgICAgIHNpZGViYXIuY3NzKHtcbiAgICAgICAgICAgIGRpc3BsYXk6IGRhdGEubWF0Y2hlcyA/ICdub25lJyA6ICdpbmhlcml0JyxcbiAgICAgICAgICAgIG9wYWNpdHk6IGRhdGEubWF0Y2hlcyA/IDAgOiAxXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChkYXRhLm1hdGNoZXMpIHtcbiAgICAgICAgICAgIHRoaXMuYm9keS5yZW1vdmVDbGFzcygnc2lkZWJhci1vcGVuIHNpZGViYXItY2xvc2VkJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzW2RhdGEubWF0Y2hlcyA/ICdhdHRhY2gnIDogJ2RldGFjaCddKCk7XG4gICAgfVxuXG4gICAgX3Jlc2V0TWFwKCkge1xuICAgICAgICByZXR1cm4gbWFwLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgX2dldEJvdW5kKGZuKSB7XG4gICAgICAgIGlmIChtYXAuaGFzKGZuKSkge1xuICAgICAgICAgICAgcmV0dXJuIG1hcC5nZXQoZm4pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1hcC5zZXQoZm4sIHRoaXNbZm5dLmJpbmQodGhpcykpLmdldChmbik7XG4gICAgfVxufVxuXG5leHBvcnQgbGV0IEluc3RhbmNlID0gbmV3IFNpZGViYXIoKTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./app/utils/sidebar.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Sidebar),\n/* harmony export */ \"Instance\": () => (/* binding */ Instance)\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var es6_map__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! es6-map */ \"./node_modules/es6-map/index.js\");\n/* harmony import */ var es6_map__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(es6_map__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _utils_cookies__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/cookies */ \"./app/utils/cookies.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\nvar MOBILE_BREAKPOINT = 48 - 0.062;\nvar DESKTOP_BREAKPOINT = 75 + 0.063;\nvar EVENTS = 'touchstart._grav click._grav';\nvar TARGETS = '[data-sidebar-mobile-toggle], #overlay';\nvar MOBILE_QUERY = \"(max-width: \".concat(MOBILE_BREAKPOINT, \"em)\");\nvar DESKTOP_QUERY = \"(min-width: \".concat(DESKTOP_BREAKPOINT, \"em)\");\nvar map = new (es6_map__WEBPACK_IMPORTED_MODULE_1___default())();\n\nvar Sidebar = /*#__PURE__*/function () {\n function Sidebar() {\n _classCallCheck(this, Sidebar);\n\n this.timeout = null;\n this.isOpen = false;\n this.body = jquery__WEBPACK_IMPORTED_MODULE_0___default()('body');\n this.matchMedia = __webpack_require__.g.matchMedia(MOBILE_QUERY);\n this.enable();\n }\n\n _createClass(Sidebar, [{\n key: \"enable\",\n value: function enable() {\n var sidebar = jquery__WEBPACK_IMPORTED_MODULE_0___default()('#admin-sidebar');\n this.matchMedia.addListener(this._getBound('checkMatch'));\n this.checkMatch(this.matchMedia);\n this.body.on(EVENTS, '[data-sidebar-toggle]', this._getBound('toggleSidebarState'));\n\n if (sidebar.data('quickopen')) {\n sidebar.hover(this._getBound('quickOpenIn'), this._getBound('quickOpenOut'));\n }\n }\n }, {\n key: \"disable\",\n value: function disable() {\n var sidebar = jquery__WEBPACK_IMPORTED_MODULE_0___default()('#admin-sidebar');\n this.close();\n this.matchMedia.removeListener(this._getBound('checkMatch'));\n this.body.off(EVENTS, '[data-sidebar-toggle]', this._getBound('toggleSidebarState'));\n\n if (sidebar.data('quickopen')) {\n sidebar.off('mouseenter mouseleave');\n }\n }\n }, {\n key: \"attach\",\n value: function attach() {\n this.body.on(EVENTS, TARGETS, this._getBound('toggle'));\n }\n }, {\n key: \"detach\",\n value: function detach() {\n this.body.off(EVENTS, TARGETS, this._getBound('toggle'));\n }\n }, {\n key: \"quickOpenIn\",\n value: function quickOpenIn()\n /* event */\n {\n var _this = this;\n\n var isDesktop = __webpack_require__.g.matchMedia(DESKTOP_QUERY).matches;\n var delay = jquery__WEBPACK_IMPORTED_MODULE_0___default()('#admin-sidebar').data('quickopen-delay') || 500;\n\n if (this.body.hasClass('sidebar-mobile-open')) {\n return;\n }\n\n var shouldQuickOpen = isDesktop ? this.body.hasClass('sidebar-closed') : !this.body.hasClass('sidebar-open');\n\n if (!shouldQuickOpen && !this.body.hasClass('sidebar-quickopen')) {\n return this.quickOpenOut();\n }\n\n this.timeout = setTimeout(function () {\n _this.body.addClass('sidebar-open sidebar-quickopen');\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(__webpack_require__.g).trigger('sidebar_state._grav', isDesktop);\n }, delay);\n }\n }, {\n key: \"quickOpenOut\",\n value: function quickOpenOut()\n /* event */\n {\n clearTimeout(this.timeout);\n\n if (this.body.hasClass('sidebar-quickopen')) {\n this.body.removeClass('sidebar-open sidebar-quickopen');\n }\n\n return true;\n }\n }, {\n key: \"open\",\n value: function open(event) {\n var _this2 = this;\n\n var quick = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (event) {\n event.preventDefault();\n }\n\n var overlay = jquery__WEBPACK_IMPORTED_MODULE_0___default()('#overlay');\n var sidebar = jquery__WEBPACK_IMPORTED_MODULE_0___default()('#admin-sidebar');\n this.body.addClass('sidebar-mobile-open');\n overlay.css('display', 'block');\n\n if (!quick) {\n sidebar.css('display', 'block').animate({\n opacity: 1\n }, 200, function () {\n _this2.isOpen = true;\n });\n } else {\n sidebar.css({\n display: 'block',\n opacity: 1\n });\n this.isOpen = true;\n }\n }\n }, {\n key: \"close\",\n value: function close(event) {\n var _this3 = this;\n\n var quick = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (event) {\n event.preventDefault();\n }\n\n var overlay = jquery__WEBPACK_IMPORTED_MODULE_0___default()('#overlay');\n var sidebar = jquery__WEBPACK_IMPORTED_MODULE_0___default()('#admin-sidebar');\n this.body.removeClass('sidebar-mobile-open');\n overlay.css('display', 'none');\n\n if (!quick) {\n sidebar.animate({\n opacity: 0\n }, 200, function () {\n sidebar.css('display', 'none');\n _this3.isOpen = false;\n });\n } else {\n sidebar.css({\n opacity: 0,\n display: 'none'\n });\n this.isOpen = false;\n }\n }\n }, {\n key: \"toggle\",\n value: function toggle(event) {\n if (event) {\n event.preventDefault();\n }\n\n return this[this.isOpen ? 'close' : 'open'](event);\n }\n }, {\n key: \"toggleSidebarState\",\n value: function toggleSidebarState(event) {\n if (event) {\n event.preventDefault();\n }\n\n clearTimeout(this.timeout);\n var isDesktop = __webpack_require__.g.matchMedia(DESKTOP_QUERY).matches;\n var cookie = null;\n\n if (isDesktop) {\n this.body.removeClass('sidebar-open');\n }\n\n if (!isDesktop) {\n this.body.removeClass('sidebar-closed');\n this.body.removeClass('sidebar-mobile-open');\n }\n\n this.body.toggleClass(\"sidebar-\".concat(isDesktop ? 'closed' : 'open'));\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(__webpack_require__.g).trigger('sidebar_state._grav', isDesktop);\n\n if (isDesktop) {\n cookie = !this.body.hasClass('sidebar-closed');\n } else {\n cookie = this.body.hasClass('sidebar-open');\n }\n\n _utils_cookies__WEBPACK_IMPORTED_MODULE_2__.default.set('grav-admin-sidebar', cookie, {\n expires: Infinity\n });\n }\n }, {\n key: \"checkMatch\",\n value: function checkMatch(data) {\n var sidebar = jquery__WEBPACK_IMPORTED_MODULE_0___default()('#admin-sidebar');\n var overlay = jquery__WEBPACK_IMPORTED_MODULE_0___default()('#overlay');\n this.isOpen = false;\n overlay.css('display', 'none');\n sidebar.css({\n display: data.matches ? 'none' : 'inherit',\n opacity: data.matches ? 0 : 1\n });\n\n if (data.matches) {\n this.body.removeClass('sidebar-open sidebar-closed');\n }\n\n this[data.matches ? 'attach' : 'detach']();\n }\n }, {\n key: \"_resetMap\",\n value: function _resetMap() {\n return map.clear();\n }\n }, {\n key: \"_getBound\",\n value: function _getBound(fn) {\n if (map.has(fn)) {\n return map.get(fn);\n }\n\n return map.set(fn, this[fn].bind(this)).get(fn);\n }\n }]);\n\n return Sidebar;\n}();\n\n\nvar Instance = new Sidebar();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL3V0aWxzL3NpZGViYXIuanM/MzM1MSJdLCJuYW1lcyI6WyJNT0JJTEVfQlJFQUtQT0lOVCIsIkRFU0tUT1BfQlJFQUtQT0lOVCIsIkVWRU5UUyIsIlRBUkdFVFMiLCJNT0JJTEVfUVVFUlkiLCJERVNLVE9QX1FVRVJZIiwibWFwIiwiTWFwIiwiU2lkZWJhciIsInRpbWVvdXQiLCJpc09wZW4iLCJib2R5IiwiJCIsIm1hdGNoTWVkaWEiLCJnbG9iYWwiLCJlbmFibGUiLCJzaWRlYmFyIiwiYWRkTGlzdGVuZXIiLCJfZ2V0Qm91bmQiLCJjaGVja01hdGNoIiwib24iLCJkYXRhIiwiaG92ZXIiLCJjbG9zZSIsInJlbW92ZUxpc3RlbmVyIiwib2ZmIiwiaXNEZXNrdG9wIiwibWF0Y2hlcyIsImRlbGF5IiwiaGFzQ2xhc3MiLCJzaG91bGRRdWlja09wZW4iLCJxdWlja09wZW5PdXQiLCJzZXRUaW1lb3V0IiwiYWRkQ2xhc3MiLCJ0cmlnZ2VyIiwiY2xlYXJUaW1lb3V0IiwicmVtb3ZlQ2xhc3MiLCJldmVudCIsInF1aWNrIiwicHJldmVudERlZmF1bHQiLCJvdmVybGF5IiwiY3NzIiwiYW5pbWF0ZSIsIm9wYWNpdHkiLCJkaXNwbGF5IiwiY29va2llIiwidG9nZ2xlQ2xhc3MiLCJDb29raWVzIiwiZXhwaXJlcyIsIkluZmluaXR5IiwiY2xlYXIiLCJmbiIsImhhcyIsImdldCIsInNldCIsImJpbmQiLCJJbnN0YW5jZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUVBLElBQU1BLGlCQUFpQixHQUFHLEtBQUssS0FBL0I7QUFDQSxJQUFNQyxrQkFBa0IsR0FBRyxLQUFLLEtBQWhDO0FBQ0EsSUFBTUMsTUFBTSxHQUFHLDhCQUFmO0FBQ0EsSUFBTUMsT0FBTyxHQUFHLHdDQUFoQjtBQUNBLElBQU1DLFlBQVkseUJBQWtCSixpQkFBbEIsUUFBbEI7QUFDQSxJQUFNSyxhQUFhLHlCQUFrQkos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LEVBQWtCO0FBQ2QsYUFBS2hCLElBQUwsQ0FBVXlCLFdBQVYsQ0FBc0IsNkJBQXRCO0FBQ0g7O0FBRUQsV0FBS2YsSUFBSSxDQUFDTSxPQUFMLEdBQWUsUUFBZixHQUEwQixRQUEvQjtBQUNIOzs7V0FFRCxxQkFBWTtBQUNSLGFBQU9yQixHQUFHLENBQUM0QyxLQUFKLEVBQVA7QUFDSDs7O1dBRUQsbUJBQVVDLEVBQVYsRUFBYztBQUNWLFVBQUk3QyxHQUFHLENBQUM4QyxHQUFKLENBQVFELEVBQVIsQ0FBSixFQUFpQjtBQUNiLGVBQU83QyxHQUFHLENBQUMrQyxHQUFKLENBQVFGLEVBQVIsQ0FBUDtBQUNIOztBQUVELGFBQU83QyxHQUFHLENBQUNnRCxHQUFKLENBQVFILEVBQVIsRUFBWSxLQUFLQSxFQUFMLEVBQVNJLElBQVQsQ0FBYyxJQUFkLENBQVosRUFBaUNGLEdBQWpDLENBQXFDRixFQUFyQyxDQUFQO0FBQ0g7Ozs7Ozs7QUFHRSxJQUFJSyxRQUFRLEdBQUcsSUFBSWhELE9BQUosRUFBZiIsImZpbGUiOiIuL2FwcC91dGlscy9zaWRlYmFyLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCBNYXAgZnJvbSAnZXM2LW1hcCc7XG5pbXBvcnQgQ29va2llcyBmcm9tICcuLi91dGlscy9jb29raWVzJztcblxuY29uc3QgTU9CSUxFX0JSRUFLUE9JTlQgPSA0OCAtIDAuMDYyO1xuY29uc3QgREVTS1RPUF9CUkVBS1BPSU5UID0gNzUgKyAwLjA2MztcbmNvbnN0IEVWRU5UUyA9ICd0b3VjaHN0YXJ0Ll9ncmF2IGNsaWNrLl9ncmF2JztcbmNvbnN0IFRBUkdFVFMgPSAnW2RhdGEtc2lkZWJhci1tb2JpbGUtdG9nZ2xlXSwgI292ZXJsYXknO1xuY29uc3QgTU9CSUxFX1FVRVJZID0gYChtYXgtd2lkdGg6ICR7TU9CSUxFX0JSRUFLUE9JTlR9ZW0pYDtcbmNvbnN0IERFU0tUT1BfUVVFUlkgPSBgKG1pbi13aWR0aDogJHtERVNLVE9QX0JSRUFLUE9JTlR9ZW0pYDtcblxubGV0IG1hcCA9IG5ldyBNYXAoKTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2lkZWJhciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMudGltZW91dCA9IG51bGw7XG4gICAgICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYm9keSA9ICQoJ2JvZHknKTtcbiAgICAgICAgdGhpcy5tYXRjaE1lZGlhID0gZ2xvYmFsLm1hdGNoTWVkaWEoTU9CSUxFX1FVRVJZKTtcbiAgICAgICAgdGhpcy5lbmFibGUoKTtcbiAgICB9XG5cbiAgICBlbmFibGUoKSB7XG4gICAgICAgIGNvbnN0IHNpZGViYXIgPSAkKCcjYWRtaW4tc2lkZWJhcicpO1xuXG4gICAgICAgIHRoaXMubWF0Y2hNZWRpYS5hZGRMaXN0ZW5lcih0aGlzLl9nZXRCb3VuZCgnY2hlY2tNYXRjaCcpKTtcbiAgICAgICAgdGhpcy5jaGVja01hdGNoKHRoaXMubWF0Y2hNZWRpYSk7XG4gICAgICAgIHRoaXMuYm9keS5vbihFVkVOVFMsICdbZGF0YS1zaWRlYmFyLXRvZ2dsZV0nLCB0aGlzLl9nZXRCb3VuZCgndG9nZ2xlU2lkZWJhclN0YXRlJykpO1xuXG4gICAgICAgIGlmIChzaWRlYmFyLmRhdGEoJ3F1aWNrb3BlbicpKSB7XG4gICAgICAgICAgICBzaWRlYmFyLmhvdmVyKHRoaXMuX2dldEJvdW5kKCdxdWlja09wZW5JbicpLCB0aGlzLl9nZXRCb3VuZCgncXVpY2tPcGVuT3V0JykpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGlzYWJsZSgpIHtcbiAgICAgICAgY29uc3Qgc2lkZWJhciA9ICQoJyNhZG1pbi1zaWRlYmFyJyk7XG5cbiAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICB0aGlzLm1hdGNoTWVkaWEucmVtb3ZlTGlzdGVuZXIodGhpcy5fZ2V0Qm91bmQoJ2NoZWNrTWF0Y2gnKSk7XG4gICAgICAgIHRoaXMuYm9keS5vZmYoRVZFTlRTLCAnW2RhdGEtc2lkZWJhci10b2dnbGVdJywgdGhpcy5fZ2V0Qm91bmQoJ3RvZ2dsZVNpZGViYXJTdGF0ZScpKTtcbiAgICAgICAgaWYgKHNpZGViYXIuZGF0YSgncXVpY2tvcGVuJykpIHtcbiAgICAgICAgICAgIHNpZGViYXIub2ZmKCdtb3VzZWVudGVyIG1vdXNlbGVhdmUnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGF0dGFjaCgpIHtcbiAgICAgICAgdGhpcy5ib2R5Lm9uKEVWRU5UUywgVEFSR0VUUywgdGhpcy5fZ2V0Qm91bmQoJ3RvZ2dsZScpKTtcbiAgICB9XG5cbiAgICBkZXRhY2goKSB7XG4gICAgICAgIHRoaXMuYm9keS5vZmYoRVZFTlRTLCBUQVJHRVRTLCB0aGlzLl9nZXRCb3VuZCgndG9nZ2xlJykpO1xuICAgIH1cblxuICAgIHF1aWNrT3BlbkluKC8qIGV2ZW50ICovKSB7XG4gICAgICAgIGxldCBpc0Rlc2t0b3AgPSBnbG9iYWwubWF0Y2hNZWRpYShERVNLVE9QX1FVRVJZKS5tYXRjaGVzO1xuICAgICAgICBsZXQgZGVsYXkgPSAkKCcjYWRtaW4tc2lkZWJhcicpLmRhdGEoJ3F1aWNrb3Blbi1kZWxheScpIHx8IDUwMDtcbiAgICAgICAgaWYgKHRoaXMuYm9keS5oYXNDbGFzcygnc2lkZWJhci1tb2JpbGUtb3BlbicpKSB7IHJldHVybjsgfVxuXG4gICAgICAgIGxldCBzaG91bGRRdWlja09wZW4gPSBpc0Rlc2t0b3AgPyB0aGlzLmJvZHkuaGFzQ2xhc3MoJ3NpZGViYXItY2xvc2VkJykgOiAhdGhpcy5ib2R5Lmhhc0NsYXNzKCdzaWRlYmFyLW9wZW4nKTtcbiAgICAgICAgaWYgKCFzaG91bGRRdWlja09wZW4gJiYgIXRoaXMuYm9keS5oYXNDbGFzcygnc2lkZWJhci1xdWlja29wZW4nKSkgeyByZXR1cm4gdGhpcy5xdWlja09wZW5PdXQoKTsgfVxuXG4gICAgICAgIHRoaXMudGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5ib2R5LmFkZENsYXNzKCdzaWRlYmFyLW9wZW4gc2lkZWJhci1xdWlja29wZW4nKTtcbiAgICAgICAgICAgICQoZ2xvYmFsKS50cmlnZ2VyKCdzaWRlYmFyX3N0YXRlLl9ncmF2JywgaXNEZXNrdG9wKTtcbiAgICAgICAgfSwgZGVsYXkpO1xuICAgIH1cblxuICAgIHF1aWNrT3Blbk91dCgvKiBldmVudCAqLykge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KTtcbiAgICAgICAgaWYgKHRoaXMuYm9keS5oYXNDbGFzcygnc2lkZWJhci1xdWlja29wZW4nKSkge1xuICAgICAgICAgICAgdGhpcy5ib2R5LnJlbW92ZUNsYXNzKCdzaWRlYmFyLW9wZW4gc2lkZWJhci1xdWlja29wZW4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIG9wZW4oZXZlbnQsIHF1aWNrID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKGV2ZW50KSB7IGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IH1cbiAgICAgICAgbGV0IG92ZXJsYXkgPSAkKCcjb3ZlcmxheScpO1xuICAgICAgICBsZXQgc2lkZWJhciA9ICQoJyNhZG1pbi1zaWRlYmFyJyk7XG5cbiAgICAgICAgdGhpcy5ib2R5LmFkZENsYXNzKCdzaWRlYmFyLW1vYmlsZS1vcGVuJyk7XG4gICAgICAgIG92ZXJsYXkuY3NzKCdkaXNwbGF5JywgJ2Jsb2NrJyk7XG5cbiAgICAgICAgaWYgKCFxdWljaykge1xuICAgICAgICAgICAgc2lkZWJhci5jc3MoJ2Rpc3BsYXknLCAnYmxvY2snKS5hbmltYXRlKHtcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAxXG4gICAgICAgICAgICB9LCAyMDAsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzT3BlbiA9IHRydWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNpZGViYXIuY3NzKHsgZGlzcGxheTogJ2Jsb2NrJywgb3BhY2l0eTogMSB9KTtcbiAgICAgICAgICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNsb3NlKGV2ZW50LCBxdWljayA9IGZhbHNlKSB7XG4gICAgICAgIGlmIChldmVudCkgeyBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyB9XG4gICAgICAgIGxldCBvdmVybGF5ID0gJCgnI292ZXJsYXknKTtcbiAgICAgICAgbGV0IHNpZGViYXIgPSAkKCcjYWRtaW4tc2lkZWJhcicpO1xuXG4gICAgICAgIHRoaXMuYm9keS5yZW1vdmVDbGFzcygnc2lkZWJhci1tb2JpbGUtb3BlbicpO1xuICAgICAgICBvdmVybGF5LmNzcygnZGlzcGxheScsICdub25lJyk7XG5cbiAgICAgICAgaWYgKCFxdWljaykge1xuICAgICAgICAgICAgc2lkZWJhci5hbmltYXRlKHtcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAwXG4gICAgICAgICAgICB9LCAyMDAsICgpID0+IHtcbiAgICAgICAgICAgICAgICBzaWRlYmFyLmNzcygnZGlzcGxheScsICdub25lJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2lkZWJhci5jc3MoeyBvcGFjaXR5OiAwLCBkaXNwbGF5OiAnbm9uZScgfSk7XG4gICAgICAgICAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdG9nZ2xlKGV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudCkgeyBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyB9XG4gICAgICAgIHJldHVybiB0aGlzW3RoaXMuaXNPcGVuID8gJ2Nsb3NlJyA6ICdvcGVuJ10oZXZlbnQpO1xuICAgIH1cblxuICAgIHRvZ2dsZVNpZGViYXJTdGF0ZShldmVudCkge1xuICAgICAgICBpZiAoZXZlbnQpIHsgZXZlbnQucHJldmVudERlZmF1bHQoKTsgfVxuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KTtcbiAgICAgICAgbGV0IGlzRGVza3RvcCA9IGdsb2JhbC5tYXRjaE1lZGlhKERFU0tUT1BfUVVFUlkpLm1hdGNoZXM7XG4gICAgICAgIGxldCBjb29raWUgPSBudWxsO1xuXG4gICAgICAgIGlmIChpc0Rlc2t0b3ApIHtcbiAgICAgICAgICAgIHRoaXMuYm9keS5yZW1vdmVDbGFzcygnc2lkZWJhci1vcGVuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzRGVza3RvcCkge1xuICAgICAgICAgICAgdGhpcy5ib2R5LnJlbW92ZUNsYXNzKCdzaWRlYmFyLWNsb3NlZCcpO1xuICAgICAgICAgICAgdGhpcy5ib2R5LnJlbW92ZUNsYXNzKCdzaWRlYmFyLW1vYmlsZS1vcGVuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmJvZHkudG9nZ2xlQ2xhc3MoYHNpZGViYXItJHtpc0Rlc2t0b3AgPyAnY2xvc2VkJyA6ICdvcGVuJ31gKTtcbiAgICAgICAgJChnbG9iYWwpLnRyaWdnZXIoJ3NpZGViYXJfc3RhdGUuX2dyYXYnLCBpc0Rlc2t0b3ApO1xuXG4gICAgICAgIGlmIChpc0Rlc2t0b3ApIHtcbiAgICAgICAgICAgIGNvb2tpZSA9ICF0aGlzLmJvZHkuaGFzQ2xhc3MoJ3NpZGViYXItY2xvc2VkJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb29raWUgPSB0aGlzLmJvZHkuaGFzQ2xhc3MoJ3NpZGViYXItb3BlbicpO1xuICAgICAgICB9XG5cbiAgICAgICAgQ29va2llcy5zZXQoJ2dyYXYtYWRtaW4tc2lkZWJhcicsIGNvb2tpZSwgeyBleHBpcmVzOiBJbmZpbml0eSB9KTtcbiAgICB9XG5cbiAgICBjaGVja01hdGNoKGRhdGEpIHtcbiAgICAgICAgbGV0IHNpZGViYXIgPSAkKCcjYWRtaW4tc2lkZWJhcicpO1xuICAgICAgICBsZXQgb3ZlcmxheSA9ICQoJyNvdmVybGF5Jyk7XG4gICAgICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XG5cbiAgICAgICAgb3ZlcmxheS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpO1xuICAgICAgICBzaWRlYmFyLmNzcyh7XG4gICAgICAgICAgICBkaXNwbGF5OiBkYXRhLm1hdGNoZXMgPyAnbm9uZScgOiAnaW5oZXJpdCcsXG4gICAgICAgICAgICBvcGFjaXR5OiBkYXRhLm1hdGNoZXMgPyAwIDogMVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoZGF0YS5tYXRjaGVzKSB7XG4gICAgICAgICAgICB0aGlzLmJvZHkucmVtb3ZlQ2xhc3MoJ3NpZGViYXItb3BlbiBzaWRlYmFyLWNsb3NlZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpc1tkYXRhLm1hdGNoZXMgPyAnYXR0YWNoJyA6ICdkZXRhY2gnXSgpO1xuICAgIH1cblxuICAgIF9yZXNldE1hcCgpIHtcbiAgICAgICAgcmV0dXJuIG1hcC5jbGVhcigpO1xuICAgIH1cblxuICAgIF9nZXRCb3VuZChmbikge1xuICAgICAgICBpZiAobWFwLmhhcyhmbikpIHtcbiAgICAgICAgICAgIHJldHVybiBtYXAuZ2V0KGZuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtYXAuc2V0KGZuLCB0aGlzW2ZuXS5iaW5kKHRoaXMpKS5nZXQoZm4pO1xuICAgIH1cbn1cblxuZXhwb3J0IGxldCBJbnN0YW5jZSA9IG5ldyBTaWRlYmFyKCk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./app/utils/sidebar.js\n"); /***/ }), /***/ "./app/utils/storage.js": -/*!******************************!* +/*!******************************!*\ !*** ./app/utils/storage.js ***! \******************************/ /***/ (() => { @@ -825,7 +836,7 @@ eval("// localStorage\n(function () {\n function isSupported() {\n var item /***/ }), /***/ "./app/utils/tabs-memory.js": -/*!**********************************!* +/*!**********************************!*\ !*** ./app/utils/tabs-memory.js ***! \**********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { @@ -836,29 +847,29 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var jque /***/ }), /***/ "./app/utils/toastr.js": -/*!*****************************!* +/*!*****************************!*\ !*** ./app/utils/toastr.js ***! \*****************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => __WEBPACK_DEFAULT_EXPORT__\n/* harmony export */ });\n/* harmony import */ var toastr__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! toastr */ \"./node_modules/toastr/toastr.js\");\n/* harmony import */ var toastr__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(toastr__WEBPACK_IMPORTED_MODULE_0__);\n\n(toastr__WEBPACK_IMPORTED_MODULE_0___default().options.positionClass) = 'toast-top-right';\n(toastr__WEBPACK_IMPORTED_MODULE_0___default().options.preventDuplicates) = true;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((toastr__WEBPACK_IMPORTED_MODULE_0___default()));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL3V0aWxzL3RvYXN0ci5qcz9jZjdiIl0sIm5hbWVzIjpbInRvYXN0ciJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7QUFFQUEscUVBQUEsR0FBK0IsaUJBQS9CO0FBQ0FBLHlFQUFBLEdBQW1DLElBQW5DO0FBRUEsaUVBQWVBLCtDQUFmIiwiZmlsZSI6Ii4vYXBwL3V0aWxzL3RvYXN0ci5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0b2FzdHIgZnJvbSAndG9hc3RyJztcblxudG9hc3RyLm9wdGlvbnMucG9zaXRpb25DbGFzcyA9ICd0b2FzdC10b3AtcmlnaHQnO1xudG9hc3RyLm9wdGlvbnMucHJldmVudER1cGxpY2F0ZXMgPSB0cnVlO1xuXG5leHBvcnQgZGVmYXVsdCB0b2FzdHI7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./app/utils/toastr.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var toastr__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! toastr */ \"./node_modules/toastr/toastr.js\");\n/* harmony import */ var toastr__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(toastr__WEBPACK_IMPORTED_MODULE_0__);\n\n(toastr__WEBPACK_IMPORTED_MODULE_0___default().options.positionClass) = 'toast-top-right';\n(toastr__WEBPACK_IMPORTED_MODULE_0___default().options.preventDuplicates) = true;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((toastr__WEBPACK_IMPORTED_MODULE_0___default()));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL3V0aWxzL3RvYXN0ci5qcz9jZjdiIl0sIm5hbWVzIjpbInRvYXN0ciJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7QUFFQUEscUVBQUEsR0FBK0IsaUJBQS9CO0FBQ0FBLHlFQUFBLEdBQW1DLElBQW5DO0FBRUEsaUVBQWVBLCtDQUFmIiwiZmlsZSI6Ii4vYXBwL3V0aWxzL3RvYXN0ci5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0b2FzdHIgZnJvbSAndG9hc3RyJztcblxudG9hc3RyLm9wdGlvbnMucG9zaXRpb25DbGFzcyA9ICd0b2FzdC10b3AtcmlnaHQnO1xudG9hc3RyLm9wdGlvbnMucHJldmVudER1cGxpY2F0ZXMgPSB0cnVlO1xuXG5leHBvcnQgZGVmYXVsdCB0b2FzdHI7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./app/utils/toastr.js\n"); /***/ }), /***/ "./app/whitelabel/compile.js": -/*!***********************************!* +/*!***********************************!*\ !*** ./app/whitelabel/compile.js ***! \***********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => __WEBPACK_DEFAULT_EXPORT__,\n/* harmony export */ \"prepareElement\": () => /* binding */ prepareElement,\n/* harmony export */ \"resetElement\": () => /* binding */ resetElement\n/* harmony export */ });\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! grav-config */ \"grav-config\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(grav_config__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils_request__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/request */ \"./app/utils/request.js\");\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (function () {\n var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n _ref$preview = _ref.preview,\n preview = _ref$preview === void 0 ? false : _ref$preview,\n _ref$exportScss = _ref.exportScss,\n exportScss = _ref$exportScss === void 0 ? false : _ref$exportScss,\n _ref$color_scheme = _ref.color_scheme,\n color_scheme = _ref$color_scheme === void 0 ? {} : _ref$color_scheme,\n _ref$fonts = _ref.fonts,\n fonts = _ref$fonts === void 0 ? {} : _ref$fonts,\n _ref$callback = _ref.callback,\n callback = _ref$callback === void 0 ? function () {} : _ref$callback;\n\n var task = exportScss ? 'exportScss' : 'compileScss'; // console.log(config);\n\n var URI = \"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_0__.config.base_url_relative, \".json/task:\").concat(task);\n (0,_utils_request__WEBPACK_IMPORTED_MODULE_1__.default)(URI, {\n method: 'post',\n body: Object.assign({}, preview ? {\n preview: preview\n } : null, color_scheme)\n }, callback);\n});\nvar prepareElement = function prepareElement(element) {\n element.data('busy_right_now', true);\n\n if (!element.data('current_icon')) {\n element.data('current_icon', element.find('.fa').attr('class'));\n }\n\n element.find('.fa').attr('class', 'fa fa-fw fa-spin fa-refresh');\n};\nvar resetElement = function resetElement(element) {\n element.data('busy_right_now', false);\n element.find('.fa').attr('class', element.data('current_icon'));\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL3doaXRlbGFiZWwvY29tcGlsZS5qcz9iZjI3Il0sIm5hbWVzIjpbInByZXZpZXciLCJleHBvcnRTY3NzIiwiY29sb3Jfc2NoZW1lIiwiZm9udHMiLCJjYWxsYmFjayIsInRhc2siLCJVUkkiLCJjb25maWciLCJyZXF1ZXN0IiwibWV0aG9kIiwiYm9keSIsIk9iamVjdCIsImFzc2lnbiIsInByZXBhcmVFbGVtZW50IiwiZWxlbWVudCIsImRhdGEiLCJmaW5kIiwiYXR0ciIsInJlc2V0RWxlbWVudCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUVBLGlFQUFlLFlBQXNHO0FBQUEsaUZBQVAsRUFBTztBQUFBLDBCQUFuR0EsT0FBbUc7QUFBQSxNQUFuR0EsT0FBbUcsNkJBQXpGLEtBQXlGO0FBQUEsNkJBQWxGQyxVQUFrRjtBQUFBLE1BQWxGQSxVQUFrRixnQ0FBckUsS0FBcUU7QUFBQSwrQkFBOURDLFlBQThEO0FBQUEsTUFBOURBLFlBQThELGtDQUEvQyxFQUErQztBQUFBLHdCQUEzQ0MsS0FBMkM7QUFBQSxNQUEzQ0EsS0FBMkMsMkJBQW5DLEVBQW1DO0FBQUEsMkJBQS9CQyxRQUErQjtBQUFBLE1BQS9CQSxRQUErQiw4QkFBcEIsWUFBTSxDQUFFLENBQVk7O0FBQ2pILE1BQUlDLElBQUksR0FBR0osVUFBVSxHQUFHLFlBQUgsR0FBa0IsYUFBdkMsQ0FEaUgsQ0FFakg7O0FBQ0EsTUFBTUssR0FBRyxhQUFNQyxpRUFBTix3QkFBNENGLElBQTVDLENBQVQ7QUFDQUcseURBQU8sQ0FBQ0YsR0FBRCxFQUFNO0FBQ1RHLFVBQU0sRUFBRSxNQURDO0FBRVRDLFFBQUksRUFBRUMsTUFBTSxDQUFDQyxNQUFQLENBQWMsRUFBZCxFQUFrQlosT0FBTyxHQUFHO0FBQUVBLGFBQU8sRUFBUEE7QUFBRixLQUFILEdBQWlCLElBQTFDLEVBQWdERSxZQUFoRDtBQUZHLEdBQU4sRUFHSkUsUUFISSxDQUFQO0FBSUgsQ0FSRDtBQVVPLElBQU1TLGNBQWMsR0FBRyxTQUFqQkEsY0FBaUIsQ0FBQ0MsT0FBRCxFQUFhO0FBQ3ZDQSxTQUFPLENBQUNDLElBQVIsQ0FBYSxnQkFBYixFQUErQixJQUEvQjs7QUFDQSxNQUFJLENBQUNELE9BQU8sQ0FBQ0MsSUFBUixDQUFhLGNBQWIsQ0FBTCxFQUFtQztBQUMvQkQsV0FBTyxDQUFDQyxJQUFSLENBQWEsY0FBYixFQUE2QkQsT0FBTyxDQUFDRSxJQUFSLENBQWEsS0FBYixFQUFvQkMsSUFBcEIsQ0FBeUIsT0FBekIsQ0FBN0I7QUFDSDs7QUFDREgsU0FBTyxDQUFDRSxJQUFSLENBQWEsS0FBYixFQUFvQkMsSUFBcEIsQ0FBeUIsT0FBekIsRUFBa0MsNkJBQWxDO0FBQ0gsQ0FOTTtBQVFBLElBQU1DLFlBQVksR0FBRyxTQUFmQSxZQUFlLENBQUNKLE9BQUQsRUFBYTtBQUNyQ0EsU0FBTyxDQUFDQyxJQUFSLENBQWEsZ0JBQWIsRUFBK0IsS0FBL0I7QUFDQUQsU0FBTyxDQUFDRSxJQUFSLENBQWEsS0FBYixFQUFvQkMsSUFBcEIsQ0FBeUIsT0FBekIsRUFBa0NILE9BQU8sQ0FBQ0MsSUFBUixDQUFhLGNBQWIsQ0FBbEM7QUFDSCxDQUhNIiwiZmlsZSI6Ii4vYXBwL3doaXRlbGFiZWwvY29tcGlsZS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvbmZpZyB9IGZyb20gJ2dyYXYtY29uZmlnJztcbmltcG9ydCByZXF1ZXN0IGZyb20gJy4uL3V0aWxzL3JlcXVlc3QnO1xuXG5leHBvcnQgZGVmYXVsdCAoeyBwcmV2aWV3ID0gZmFsc2UsIGV4cG9ydFNjc3MgPSBmYWxzZSwgY29sb3Jfc2NoZW1lID0ge30sIGZvbnRzID0ge30sIGNhbGxiYWNrID0gKCkgPT4ge30gfSA9IHt9KSA9PiB7XG4gICAgbGV0IHRhc2sgPSBleHBvcnRTY3NzID8gJ2V4cG9ydFNjc3MnIDogJ2NvbXBpbGVTY3NzJztcbiAgICAvLyBjb25zb2xlLmxvZyhjb25maWcpO1xuICAgIGNvbnN0IFVSSSA9IGAke2NvbmZpZy5iYXNlX3VybF9yZWxhdGl2ZX0uanNvbi90YXNrOiR7dGFza31gO1xuICAgIHJlcXVlc3QoVVJJLCB7XG4gICAgICAgIG1ldGhvZDogJ3Bvc3QnLFxuICAgICAgICBib2R5OiBPYmplY3QuYXNzaWduKHt9LCBwcmV2aWV3ID8geyBwcmV2aWV3IH0gOiBudWxsLCBjb2xvcl9zY2hlbWUpXG4gICAgfSwgY2FsbGJhY2spO1xufTtcblxuZXhwb3J0IGNvbnN0IHByZXBhcmVFbGVtZW50ID0gKGVsZW1lbnQpID0+IHtcbiAgICBlbGVtZW50LmRhdGEoJ2J1c3lfcmlnaHRfbm93JywgdHJ1ZSk7XG4gICAgaWYgKCFlbGVtZW50LmRhdGEoJ2N1cnJlbnRfaWNvbicpKSB7XG4gICAgICAgIGVsZW1lbnQuZGF0YSgnY3VycmVudF9pY29uJywgZWxlbWVudC5maW5kKCcuZmEnKS5hdHRyKCdjbGFzcycpKTtcbiAgICB9XG4gICAgZWxlbWVudC5maW5kKCcuZmEnKS5hdHRyKCdjbGFzcycsICdmYSBmYS1mdyBmYS1zcGluIGZhLXJlZnJlc2gnKTtcbn07XG5cbmV4cG9ydCBjb25zdCByZXNldEVsZW1lbnQgPSAoZWxlbWVudCkgPT4ge1xuICAgIGVsZW1lbnQuZGF0YSgnYnVzeV9yaWdodF9ub3cnLCBmYWxzZSk7XG4gICAgZWxlbWVudC5maW5kKCcuZmEnKS5hdHRyKCdjbGFzcycsIGVsZW1lbnQuZGF0YSgnY3VycmVudF9pY29uJykpO1xufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./app/whitelabel/compile.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__),\n/* harmony export */ \"prepareElement\": () => (/* binding */ prepareElement),\n/* harmony export */ \"resetElement\": () => (/* binding */ resetElement)\n/* harmony export */ });\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! grav-config */ \"grav-config\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(grav_config__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils_request__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/request */ \"./app/utils/request.js\");\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (function () {\n var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n _ref$preview = _ref.preview,\n preview = _ref$preview === void 0 ? false : _ref$preview,\n _ref$exportScss = _ref.exportScss,\n exportScss = _ref$exportScss === void 0 ? false : _ref$exportScss,\n _ref$color_scheme = _ref.color_scheme,\n color_scheme = _ref$color_scheme === void 0 ? {} : _ref$color_scheme,\n _ref$fonts = _ref.fonts,\n fonts = _ref$fonts === void 0 ? {} : _ref$fonts,\n _ref$callback = _ref.callback,\n callback = _ref$callback === void 0 ? function () {} : _ref$callback;\n\n var task = exportScss ? 'exportScss' : 'compileScss'; // console.log(config);\n\n var URI = \"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_0__.config.base_url_relative, \".json/task:\").concat(task);\n (0,_utils_request__WEBPACK_IMPORTED_MODULE_1__.default)(URI, {\n method: 'post',\n body: Object.assign({}, preview ? {\n preview: preview\n } : null, color_scheme)\n }, callback);\n});\nvar prepareElement = function prepareElement(element) {\n element.data('busy_right_now', true);\n\n if (!element.data('current_icon')) {\n element.data('current_icon', element.find('.fa').attr('class'));\n }\n\n element.find('.fa').attr('class', 'fa fa-fw fa-spin fa-refresh');\n};\nvar resetElement = function resetElement(element) {\n element.data('busy_right_now', false);\n element.find('.fa').attr('class', element.data('current_icon'));\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vYXBwL3doaXRlbGFiZWwvY29tcGlsZS5qcz9iZjI3Il0sIm5hbWVzIjpbInByZXZpZXciLCJleHBvcnRTY3NzIiwiY29sb3Jfc2NoZW1lIiwiZm9udHMiLCJjYWxsYmFjayIsInRhc2siLCJVUkkiLCJjb25maWciLCJyZXF1ZXN0IiwibWV0aG9kIiwiYm9keSIsIk9iamVjdCIsImFzc2lnbiIsInByZXBhcmVFbGVtZW50IiwiZWxlbWVudCIsImRhdGEiLCJmaW5kIiwiYXR0ciIsInJlc2V0RWxlbWVudCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUVBLGlFQUFlLFlBQXNHO0FBQUEsaUZBQVAsRUFBTztBQUFBLDBCQUFuR0EsT0FBbUc7QUFBQSxNQUFuR0EsT0FBbUcsNkJBQXpGLEtBQXlGO0FBQUEsNkJBQWxGQyxVQUFrRjtBQUFBLE1BQWxGQSxVQUFrRixnQ0FBckUsS0FBcUU7QUFBQSwrQkFBOURDLFlBQThEO0FBQUEsTUFBOURBLFlBQThELGtDQUEvQyxFQUErQztBQUFBLHdCQUEzQ0MsS0FBMkM7QUFBQSxNQUEzQ0EsS0FBMkMsMkJBQW5DLEVBQW1DO0FBQUEsMkJBQS9CQyxRQUErQjtBQUFBLE1BQS9CQSxRQUErQiw4QkFBcEIsWUFBTSxDQUFFLENBQVk7O0FBQ2pILE1BQUlDLElBQUksR0FBR0osVUFBVSxHQUFHLFlBQUgsR0FBa0IsYUFBdkMsQ0FEaUgsQ0FFakg7O0FBQ0EsTUFBTUssR0FBRyxhQUFNQyxpRUFBTix3QkFBNENGLElBQTVDLENBQVQ7QUFDQUcseURBQU8sQ0FBQ0YsR0FBRCxFQUFNO0FBQ1RHLFVBQU0sRUFBRSxNQURDO0FBRVRDLFFBQUksRUFBRUMsTUFBTSxDQUFDQyxNQUFQLENBQWMsRUFBZCxFQUFrQlosT0FBTyxHQUFHO0FBQUVBLGFBQU8sRUFBUEE7QUFBRixLQUFILEdBQWlCLElBQTFDLEVBQWdERSxZQUFoRDtBQUZHLEdBQU4sRUFHSkUsUUFISSxDQUFQO0FBSUgsQ0FSRDtBQVVPLElBQU1TLGNBQWMsR0FBRyxTQUFqQkEsY0FBaUIsQ0FBQ0MsT0FBRCxFQUFhO0FBQ3ZDQSxTQUFPLENBQUNDLElBQVIsQ0FBYSxnQkFBYixFQUErQixJQUEvQjs7QUFDQSxNQUFJLENBQUNELE9BQU8sQ0FBQ0MsSUFBUixDQUFhLGNBQWIsQ0FBTCxFQUFtQztBQUMvQkQsV0FBTyxDQUFDQyxJQUFSLENBQWEsY0FBYixFQUE2QkQsT0FBTyxDQUFDRSxJQUFSLENBQWEsS0FBYixFQUFvQkMsSUFBcEIsQ0FBeUIsT0FBekIsQ0FBN0I7QUFDSDs7QUFDREgsU0FBTyxDQUFDRSxJQUFSLENBQWEsS0FBYixFQUFvQkMsSUFBcEIsQ0FBeUIsT0FBekIsRUFBa0MsNkJBQWxDO0FBQ0gsQ0FOTTtBQVFBLElBQU1DLFlBQVksR0FBRyxTQUFmQSxZQUFlLENBQUNKLE9BQUQsRUFBYTtBQUNyQ0EsU0FBTyxDQUFDQyxJQUFSLENBQWEsZ0JBQWIsRUFBK0IsS0FBL0I7QUFDQUQsU0FBTyxDQUFDRSxJQUFSLENBQWEsS0FBYixFQUFvQkMsSUFBcEIsQ0FBeUIsT0FBekIsRUFBa0NILE9BQU8sQ0FBQ0MsSUFBUixDQUFhLGNBQWIsQ0FBbEM7QUFDSCxDQUhNIiwiZmlsZSI6Ii4vYXBwL3doaXRlbGFiZWwvY29tcGlsZS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvbmZpZyB9IGZyb20gJ2dyYXYtY29uZmlnJztcbmltcG9ydCByZXF1ZXN0IGZyb20gJy4uL3V0aWxzL3JlcXVlc3QnO1xuXG5leHBvcnQgZGVmYXVsdCAoeyBwcmV2aWV3ID0gZmFsc2UsIGV4cG9ydFNjc3MgPSBmYWxzZSwgY29sb3Jfc2NoZW1lID0ge30sIGZvbnRzID0ge30sIGNhbGxiYWNrID0gKCkgPT4ge30gfSA9IHt9KSA9PiB7XG4gICAgbGV0IHRhc2sgPSBleHBvcnRTY3NzID8gJ2V4cG9ydFNjc3MnIDogJ2NvbXBpbGVTY3NzJztcbiAgICAvLyBjb25zb2xlLmxvZyhjb25maWcpO1xuICAgIGNvbnN0IFVSSSA9IGAke2NvbmZpZy5iYXNlX3VybF9yZWxhdGl2ZX0uanNvbi90YXNrOiR7dGFza31gO1xuICAgIHJlcXVlc3QoVVJJLCB7XG4gICAgICAgIG1ldGhvZDogJ3Bvc3QnLFxuICAgICAgICBib2R5OiBPYmplY3QuYXNzaWduKHt9LCBwcmV2aWV3ID8geyBwcmV2aWV3IH0gOiBudWxsLCBjb2xvcl9zY2hlbWUpXG4gICAgfSwgY2FsbGJhY2spO1xufTtcblxuZXhwb3J0IGNvbnN0IHByZXBhcmVFbGVtZW50ID0gKGVsZW1lbnQpID0+IHtcbiAgICBlbGVtZW50LmRhdGEoJ2J1c3lfcmlnaHRfbm93JywgdHJ1ZSk7XG4gICAgaWYgKCFlbGVtZW50LmRhdGEoJ2N1cnJlbnRfaWNvbicpKSB7XG4gICAgICAgIGVsZW1lbnQuZGF0YSgnY3VycmVudF9pY29uJywgZWxlbWVudC5maW5kKCcuZmEnKS5hdHRyKCdjbGFzcycpKTtcbiAgICB9XG4gICAgZWxlbWVudC5maW5kKCcuZmEnKS5hdHRyKCdjbGFzcycsICdmYSBmYS1mdyBmYS1zcGluIGZhLXJlZnJlc2gnKTtcbn07XG5cbmV4cG9ydCBjb25zdCByZXNldEVsZW1lbnQgPSAoZWxlbWVudCkgPT4ge1xuICAgIGVsZW1lbnQuZGF0YSgnYnVzeV9yaWdodF9ub3cnLCBmYWxzZSk7XG4gICAgZWxlbWVudC5maW5kKCcuZmEnKS5hdHRyKCdjbGFzcycsIGVsZW1lbnQuZGF0YSgnY3VycmVudF9pY29uJykpO1xufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./app/whitelabel/compile.js\n"); /***/ }), /***/ "./app/whitelabel/index.js": -/*!*********************************!* +/*!*********************************!*\ !*** ./app/whitelabel/index.js ***! \*********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { @@ -869,7 +880,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var jque /***/ }), /***/ "./app/whitelabel/presets.js": -/*!***********************************!* +/*!***********************************!*\ !*** ./app/whitelabel/presets.js ***! \***********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { @@ -880,7 +891,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var jque /***/ }), /***/ "./node_modules/moment/locale sync recursive ^\\.\\/.*$": -/*!***************************************************!* +/*!***************************************************!*\ !*** ./node_modules/moment/locale/ sync ^\.\/.*$ ***! \***************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1181,7 +1192,7 @@ webpackContext.id = "./node_modules/moment/locale sync recursive ^\\.\\/.*$"; /***/ }), /***/ "grav-config": -/*!****************************!* +/*!****************************!*\ !*** external "GravAdmin" ***! \****************************/ /***/ ((module) => { @@ -1192,7 +1203,7 @@ module.exports = GravAdmin; /***/ }), /***/ "jquery": -/*!*************************!* +/*!*************************!*\ !*** external "jQuery" ***! \*************************/ /***/ ((module) => { @@ -1210,8 +1221,9 @@ module.exports = jQuery; /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ // Check if module is in cache -/******/ if(__webpack_module_cache__[moduleId]) { -/******/ return __webpack_module_cache__[moduleId].exports; +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = __webpack_module_cache__[moduleId] = { @@ -1241,13 +1253,44 @@ module.exports = jQuery; /******/ }; /******/ })(); /******/ +/******/ /* webpack/runtime/chunk loaded */ +/******/ (() => { +/******/ var deferred = []; +/******/ __webpack_require__.O = (result, chunkIds, fn, priority) => { +/******/ if(chunkIds) { +/******/ priority = priority || 0; +/******/ for(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1]; +/******/ deferred[i] = [chunkIds, fn, priority]; +/******/ return; +/******/ } +/******/ var notFulfilled = Infinity; +/******/ for (var i = 0; i < deferred.length; i++) { +/******/ var [chunkIds, fn, priority] = deferred[i]; +/******/ var fulfilled = true; +/******/ for (var j = 0; j < chunkIds.length; j++) { +/******/ if ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) { +/******/ chunkIds.splice(j--, 1); +/******/ } else { +/******/ fulfilled = false; +/******/ if(priority < notFulfilled) notFulfilled = priority; +/******/ } +/******/ } +/******/ if(fulfilled) { +/******/ deferred.splice(i--, 1) +/******/ result = fn(); +/******/ } +/******/ } +/******/ return result; +/******/ }; +/******/ })(); +/******/ /******/ /* webpack/runtime/compat get default export */ /******/ (() => { /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = (module) => { /******/ var getter = module && module.__esModule ? -/******/ () => module['default'] : -/******/ () => module; +/******/ () => (module['default']) : +/******/ () => (module); /******/ __webpack_require__.d(getter, { a: getter }); /******/ return getter; /******/ }; @@ -1279,7 +1322,7 @@ module.exports = jQuery; /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ /******/ (() => { -/******/ __webpack_require__.o = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop) +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) /******/ })(); /******/ /******/ /* webpack/runtime/make namespace object */ @@ -1308,14 +1351,11 @@ module.exports = jQuery; /******/ /******/ // object to store loaded and loading chunks /******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched -/******/ // Promise = chunk loading, 0 = chunk loaded +/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded /******/ var installedChunks = { /******/ "admin": 0 /******/ }; /******/ -/******/ var deferredModules = [ -/******/ ["./app/main.js","vendor"] -/******/ ]; /******/ // no chunk on demand loading /******/ /******/ // no prefetching @@ -1326,80 +1366,44 @@ module.exports = jQuery; /******/ /******/ // no HMR manifest /******/ -/******/ var checkDeferredModules = () => { -/******/ -/******/ }; -/******/ function checkDeferredModulesImpl() { -/******/ var result; -/******/ for(var i = 0; i < deferredModules.length; i++) { -/******/ var deferredModule = deferredModules[i]; -/******/ var fulfilled = true; -/******/ for(var j = 1; j < deferredModule.length; j++) { -/******/ var depId = deferredModule[j]; -/******/ if(installedChunks[depId] !== 0) fulfilled = false; -/******/ } -/******/ if(fulfilled) { -/******/ deferredModules.splice(i--, 1); -/******/ result = __webpack_require__(__webpack_require__.s = deferredModule[0]); -/******/ } -/******/ } -/******/ if(deferredModules.length === 0) { -/******/ __webpack_require__.x(); -/******/ __webpack_require__.x = () => { -/******/ -/******/ } -/******/ } -/******/ return result; -/******/ } -/******/ __webpack_require__.x = () => { -/******/ // reset startup function so it can be called again when more startup code is added -/******/ __webpack_require__.x = () => { -/******/ -/******/ } -/******/ chunkLoadingGlobal = chunkLoadingGlobal.slice(); -/******/ for(var i = 0; i < chunkLoadingGlobal.length; i++) webpackJsonpCallback(chunkLoadingGlobal[i]); -/******/ return (checkDeferredModules = checkDeferredModulesImpl)(); -/******/ }; +/******/ __webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0); /******/ /******/ // install a JSONP callback for chunk loading -/******/ var webpackJsonpCallback = (data) => { -/******/ var [chunkIds, moreModules, runtime, executeModules] = data; +/******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => { +/******/ var [chunkIds, moreModules, runtime] = data; /******/ // add "moreModules" to the modules object, /******/ // then flag all "chunkIds" as loaded and fire callback -/******/ var moduleId, chunkId, i = 0, resolves = []; -/******/ for(;i < chunkIds.length; i++) { -/******/ chunkId = chunkIds[i]; -/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) { -/******/ resolves.push(installedChunks[chunkId][0]); -/******/ } -/******/ installedChunks[chunkId] = 0; -/******/ } +/******/ var moduleId, chunkId, i = 0; /******/ for(moduleId in moreModules) { /******/ if(__webpack_require__.o(moreModules, moduleId)) { /******/ __webpack_require__.m[moduleId] = moreModules[moduleId]; /******/ } /******/ } /******/ if(runtime) runtime(__webpack_require__); -/******/ parentChunkLoadingFunction(data); -/******/ while(resolves.length) { -/******/ resolves.shift()(); +/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data); +/******/ for(;i < chunkIds.length; i++) { +/******/ chunkId = chunkIds[i]; +/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) { +/******/ installedChunks[chunkId][0](); +/******/ } +/******/ installedChunks[chunkIds[i]] = 0; /******/ } -/******/ -/******/ // add entry modules from loaded chunk to deferred list -/******/ if(executeModules) deferredModules.push.apply(deferredModules, executeModules); -/******/ -/******/ // run deferred modules when all chunks ready -/******/ return checkDeferredModules(); +/******/ __webpack_require__.O(); /******/ } /******/ /******/ var chunkLoadingGlobal = self["webpackChunkGrav"] = self["webpackChunkGrav"] || []; -/******/ var parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal); -/******/ chunkLoadingGlobal.push = webpackJsonpCallback; +/******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0)); +/******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal)); /******/ })(); /******/ /************************************************************************/ -/******/ // module exports must be returned from runtime so entry inlining is disabled -/******/ // run startup -/******/ return __webpack_require__.x(); +/******/ +/******/ // startup +/******/ // Load entry module and return exports +/******/ // This entry module depends on other loaded chunks and execution need to be delayed +/******/ var __webpack_exports__ = __webpack_require__.O(undefined, ["vendor"], () => (__webpack_require__("./app/main.js"))) +/******/ __webpack_exports__ = __webpack_require__.O(__webpack_exports__); +/******/ Grav = __webpack_exports__; +/******/ /******/ })() ; \ No newline at end of file diff --git a/themes/grav/js/vendor.min.js b/themes/grav/js/vendor.min.js index 8ff51a37..04c16ed5 100644 --- a/themes/grav/js/vendor.min.js +++ b/themes/grav/js/vendor.min.js @@ -1,6 +1,6 @@ /* * ATTENTION: An "eval-source-map" devtool has been used. - * This devtool is not neither made for production nor for readable output files. + * This devtool is neither made for production nor for readable output files. * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) * or disable the default devtool with "devtool: false". @@ -9,7 +9,7 @@ (self["webpackChunkGrav"] = self["webpackChunkGrav"] || []).push([["vendor"],{ /***/ "./node_modules/@babel/polyfill/lib/index.js": -/*!***************************************************!* +/*!***************************************************!*\ !*** ./node_modules/@babel/polyfill/lib/index.js ***! \***************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -20,7 +20,7 @@ eval("\n\n__webpack_require__(/*! ./noConflict */ \"./node_modules/@babel/polyfi /***/ }), /***/ "./node_modules/@babel/polyfill/lib/noConflict.js": -/*!********************************************************!* +/*!********************************************************!*\ !*** ./node_modules/@babel/polyfill/lib/noConflict.js ***! \********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -30,30 +30,8 @@ eval("\n\n__webpack_require__(/*! core-js/es6 */ \"./node_modules/core-js/es6/in /***/ }), -/***/ "./node_modules/base64-js/index.js": -/*!*****************************************!* - !*** ./node_modules/base64-js/index.js ***! - \*****************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; -eval("\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n var placeHoldersLen = validLen === len\n ? 0\n : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n var tmp\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n var curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0\n ? validLen - 4\n : validLen\n\n var i\n for (i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xFF\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] +\n lookup[num >> 12 & 0x3F] +\n lookup[num >> 6 & 0x3F] +\n lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xFF0000) +\n ((uint8[i + 1] << 8) & 0xFF00) +\n (uint8[i + 2] & 0xFF)\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(\n lookup[tmp >> 2] +\n lookup[(tmp << 4) & 0x3F] +\n '=='\n )\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3F] +\n lookup[(tmp << 2) & 0x3F] +\n '='\n )\n }\n\n return parts.join('')\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vbm9kZV9tb2R1bGVzL2Jhc2U2NC1qcy9pbmRleC5qcz8xZmI1Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFZOztBQUVaLGtCQUFrQjtBQUNsQixtQkFBbUI7QUFDbkIscUJBQXFCOztBQUVyQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQ0FBa0MsU0FBUztBQUMzQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixTQUFTO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMENBQTBDLFVBQVU7QUFDcEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9iYXNlNjQtanMvaW5kZXguanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCdcblxuZXhwb3J0cy5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuZXhwb3J0cy50b0J5dGVBcnJheSA9IHRvQnl0ZUFycmF5XG5leHBvcnRzLmZyb21CeXRlQXJyYXkgPSBmcm9tQnl0ZUFycmF5XG5cbnZhciBsb29rdXAgPSBbXVxudmFyIHJldkxvb2t1cCA9IFtdXG52YXIgQXJyID0gdHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnID8gVWludDhBcnJheSA6IEFycmF5XG5cbnZhciBjb2RlID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nXG5mb3IgKHZhciBpID0gMCwgbGVuID0gY29kZS5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICBsb29rdXBbaV0gPSBjb2RlW2ldXG4gIHJldkxvb2t1cFtjb2RlLmNoYXJDb2RlQXQoaSldID0gaVxufVxuXG4vLyBTdXBwb3J0IGRlY29kaW5nIFVSTC1zYWZlIGJhc2U2NCBzdHJpbmdzLCBhcyBOb2RlLmpzIGRvZXMuXG4vLyBTZWU6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Jhc2U2NCNVUkxfYXBwbGljYXRpb25zXG5yZXZMb29rdXBbJy0nLmNoYXJDb2RlQXQoMCldID0gNjJcbnJldkxvb2t1cFsnXycuY2hhckNvZGVBdCgwKV0gPSA2M1xuXG5mdW5jdGlvbiBnZXRMZW5zIChiNjQpIHtcbiAgdmFyIGxlbiA9IGI2NC5sZW5ndGhcblxuICBpZiAobGVuICUgNCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQnKVxuICB9XG5cbiAgLy8gVHJpbSBvZmYgZXh0cmEgYnl0ZXMgYWZ0ZXIgcGxhY2Vob2xkZXIgYnl0ZXMgYXJlIGZvdW5kXG4gIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2JlYXRnYW1taXQvYmFzZTY0LWpzL2lzc3Vlcy80MlxuICB2YXIgdmFsaWRMZW4gPSBiNjQuaW5kZXhPZignPScpXG4gIGlmICh2YWxpZExlbiA9PT0gLTEpIHZhbGlkTGVuID0gbGVuXG5cbiAgdmFyIHBsYWNlSG9sZGVyc0xlbiA9IHZhbGlkTGVuID09PSBsZW5cbiAgICA/IDBcbiAgICA6IDQgLSAodmFsaWRMZW4gJSA0KVxuXG4gIHJldHVybiBbdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbl1cbn1cblxuLy8gYmFzZTY0IGlzIDQvMyArIHVwIHRvIHR3byBjaGFyYWN0ZXJzIG9mIHRoZSBvcmlnaW5hbCBkYXRhXG5mdW5jdGlvbiBieXRlTGVuZ3RoIChiNjQpIHtcbiAgdmFyIGxlbnMgPSBnZXRMZW5zKGI2NClcbiAgdmFyIHZhbGlkTGVuID0gbGVuc1swXVxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gbGVuc1sxXVxuICByZXR1cm4gKCh2YWxpZExlbiArIHBsYWNlSG9sZGVyc0xlbikgKiAzIC8gNCkgLSBwbGFjZUhvbGRlcnNMZW5cbn1cblxuZnVuY3Rpb24gX2J5dGVMZW5ndGggKGI2NCwgdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbikge1xuICByZXR1cm4gKCh2YWxpZExlbiArIHBsYWNlSG9sZGVyc0xlbikgKiAzIC8gNCkgLSBwbGFjZUhvbGRlcnNMZW5cbn1cblxuZnVuY3Rpb24gdG9CeXRlQXJyYXkgKGI2NCkge1xuICB2YXIgdG1wXG4gIHZhciBsZW5zID0gZ2V0TGVucyhiNjQpXG4gIHZhciB2YWxpZExlbiA9IGxlbnNbMF1cbiAgdmFyIHBsYWNlSG9sZGVyc0xlbiA9IGxlbnNbMV1cblxuICB2YXIgYXJyID0gbmV3IEFycihfYnl0ZUxlbmd0aChiNjQsIHZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW4pKVxuXG4gIHZhciBjdXJCeXRlID0gMFxuXG4gIC8vIGlmIHRoZXJlIGFyZSBwbGFjZWhvbGRlcnMsIG9ubHkgZ2V0IHVwIHRvIHRoZSBsYXN0IGNvbXBsZXRlIDQgY2hhcnNcbiAgdmFyIGxlbiA9IHBsYWNlSG9sZGVyc0xlbiA+IDBcbiAgICA/IHZhbGlkTGVuIC0gNFxuICAgIDogdmFsaWRMZW5cblxuICB2YXIgaVxuICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICB0bXAgPVxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTgpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCAxMikgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildIDw8IDYpIHxcbiAgICAgIHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMyldXG4gICAgYXJyW2N1ckJ5dGUrK10gPSAodG1wID4+IDE2KSAmIDB4RkZcbiAgICBhcnJbY3VyQnl0ZSsrXSA9ICh0bXAgPj4gOCkgJiAweEZGXG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICBpZiAocGxhY2VIb2xkZXJzTGVuID09PSAyKSB7XG4gICAgdG1wID1cbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDIpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA+PiA0KVxuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgaWYgKHBsYWNlSG9sZGVyc0xlbiA9PT0gMSkge1xuICAgIHRtcCA9XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxMCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDQpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDIpXSA+PiAyKVxuICAgIGFycltjdXJCeXRlKytdID0gKHRtcCA+PiA4KSAmIDB4RkZcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBhcnJcbn1cblxuZnVuY3Rpb24gdHJpcGxldFRvQmFzZTY0IChudW0pIHtcbiAgcmV0dXJuIGxvb2t1cFtudW0gPj4gMTggJiAweDNGXSArXG4gICAgbG9va3VwW251bSA+PiAxMiAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtID4+IDYgJiAweDNGXSArXG4gICAgbG9va3VwW251bSAmIDB4M0ZdXG59XG5cbmZ1bmN0aW9uIGVuY29kZUNodW5rICh1aW50OCwgc3RhcnQsIGVuZCkge1xuICB2YXIgdG1wXG4gIHZhciBvdXRwdXQgPSBbXVxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgKz0gMykge1xuICAgIHRtcCA9XG4gICAgICAoKHVpbnQ4W2ldIDw8IDE2KSAmIDB4RkYwMDAwKSArXG4gICAgICAoKHVpbnQ4W2kgKyAxXSA8PCA4KSAmIDB4RkYwMCkgK1xuICAgICAgKHVpbnQ4W2kgKyAyXSAmIDB4RkYpXG4gICAgb3V0cHV0LnB1c2godHJpcGxldFRvQmFzZTY0KHRtcCkpXG4gIH1cbiAgcmV0dXJuIG91dHB1dC5qb2luKCcnKVxufVxuXG5mdW5jdGlvbiBmcm9tQnl0ZUFycmF5ICh1aW50OCkge1xuICB2YXIgdG1wXG4gIHZhciBsZW4gPSB1aW50OC5sZW5ndGhcbiAgdmFyIGV4dHJhQnl0ZXMgPSBsZW4gJSAzIC8vIGlmIHdlIGhhdmUgMSBieXRlIGxlZnQsIHBhZCAyIGJ5dGVzXG4gIHZhciBwYXJ0cyA9IFtdXG4gIHZhciBtYXhDaHVua0xlbmd0aCA9IDE2MzgzIC8vIG11c3QgYmUgbXVsdGlwbGUgb2YgM1xuXG4gIC8vIGdvIHRocm91Z2ggdGhlIGFycmF5IGV2ZXJ5IHRocmVlIGJ5dGVzLCB3ZSdsbCBkZWFsIHdpdGggdHJhaWxpbmcgc3R1ZmYgbGF0ZXJcbiAgZm9yICh2YXIgaSA9IDAsIGxlbjIgPSBsZW4gLSBleHRyYUJ5dGVzOyBpIDwgbGVuMjsgaSArPSBtYXhDaHVua0xlbmd0aCkge1xuICAgIHBhcnRzLnB1c2goZW5jb2RlQ2h1bmsodWludDgsIGksIChpICsgbWF4Q2h1bmtMZW5ndGgpID4gbGVuMiA/IGxlbjIgOiAoaSArIG1heENodW5rTGVuZ3RoKSkpXG4gIH1cblxuICAvLyBwYWQgdGhlIGVuZCB3aXRoIHplcm9zLCBidXQgbWFrZSBzdXJlIHRvIG5vdCBmb3JnZXQgdGhlIGV4dHJhIGJ5dGVzXG4gIGlmIChleHRyYUJ5dGVzID09PSAxKSB7XG4gICAgdG1wID0gdWludDhbbGVuIC0gMV1cbiAgICBwYXJ0cy5wdXNoKFxuICAgICAgbG9va3VwW3RtcCA+PiAyXSArXG4gICAgICBsb29rdXBbKHRtcCA8PCA0KSAmIDB4M0ZdICtcbiAgICAgICc9PSdcbiAgICApXG4gIH0gZWxzZSBpZiAoZXh0cmFCeXRlcyA9PT0gMikge1xuICAgIHRtcCA9ICh1aW50OFtsZW4gLSAyXSA8PCA4KSArIHVpbnQ4W2xlbiAtIDFdXG4gICAgcGFydHMucHVzaChcbiAgICAgIGxvb2t1cFt0bXAgPj4gMTBdICtcbiAgICAgIGxvb2t1cFsodG1wID4+IDQpICYgMHgzRl0gK1xuICAgICAgbG9va3VwWyh0bXAgPDwgMikgJiAweDNGXSArXG4gICAgICAnPSdcbiAgICApXG4gIH1cblxuICByZXR1cm4gcGFydHMuam9pbignJylcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/base64-js/index.js\n"); - -/***/ }), - -/***/ "./node_modules/buffer/index.js": -/*!**************************************!* - !*** ./node_modules/buffer/index.js ***! - \**************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; -eval("/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh \n * @license MIT\n */\n/* eslint-disable no-proto */\n\n\n\nconst base64 = __webpack_require__(/*! base64-js */ \"./node_modules/base64-js/index.js\")\nconst ieee754 = __webpack_require__(/*! ieee754 */ \"./node_modules/ieee754/index.js\")\nconst customInspectSymbol =\n (typeof Symbol === 'function' && typeof Symbol['for'] === 'function') // eslint-disable-line dot-notation\n ? Symbol['for']('nodejs.util.inspect.custom') // eslint-disable-line dot-notation\n : null\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\nconst K_MAX_LENGTH = 0x7fffffff\nexports.kMaxLength = K_MAX_LENGTH\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n * === true Use Uint8Array implementation (fastest)\n * === false Print warning and recommend using `buffer` v4.x which has an Object\n * implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * We report that the browser does not support typed arrays if the are not subclassable\n * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`\n * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support\n * for __proto__ and has a buggy typed array implementation.\n */\nBuffer.TYPED_ARRAY_SUPPORT = typedArraySupport()\n\nif (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&\n typeof console.error === 'function') {\n console.error(\n 'This browser lacks typed array (Uint8Array) support which is required by ' +\n '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'\n )\n}\n\nfunction typedArraySupport () {\n // Can typed array instances can be augmented?\n try {\n const arr = new Uint8Array(1)\n const proto = { foo: function () { return 42 } }\n Object.setPrototypeOf(proto, Uint8Array.prototype)\n Object.setPrototypeOf(arr, proto)\n return arr.foo() === 42\n } catch (e) {\n return false\n }\n}\n\nObject.defineProperty(Buffer.prototype, 'parent', {\n enumerable: true,\n get: function () {\n if (!Buffer.isBuffer(this)) return undefined\n return this.buffer\n }\n})\n\nObject.defineProperty(Buffer.prototype, 'offset', {\n enumerable: true,\n get: function () {\n if (!Buffer.isBuffer(this)) return undefined\n return this.byteOffset\n }\n})\n\nfunction createBuffer (length) {\n if (length > K_MAX_LENGTH) {\n throw new RangeError('The value \"' + length + '\" is invalid for option \"size\"')\n }\n // Return an augmented `Uint8Array` instance\n const buf = new Uint8Array(length)\n Object.setPrototypeOf(buf, Buffer.prototype)\n return buf\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n // Common case.\n if (typeof arg === 'number') {\n if (typeof encodingOrOffset === 'string') {\n throw new TypeError(\n 'The \"string\" argument must be of type string. Received type number'\n )\n }\n return allocUnsafe(arg)\n }\n return from(arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\nfunction from (value, encodingOrOffset, length) {\n if (typeof value === 'string') {\n return fromString(value, encodingOrOffset)\n }\n\n if (ArrayBuffer.isView(value)) {\n return fromArrayView(value)\n }\n\n if (value == null) {\n throw new TypeError(\n 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n 'or Array-like Object. Received type ' + (typeof value)\n )\n }\n\n if (isInstance(value, ArrayBuffer) ||\n (value && isInstance(value.buffer, ArrayBuffer))) {\n return fromArrayBuffer(value, encodingOrOffset, length)\n }\n\n if (typeof SharedArrayBuffer !== 'undefined' &&\n (isInstance(value, SharedArrayBuffer) ||\n (value && isInstance(value.buffer, SharedArrayBuffer)))) {\n return fromArrayBuffer(value, encodingOrOffset, length)\n }\n\n if (typeof value === 'number') {\n throw new TypeError(\n 'The \"value\" argument must not be of type number. Received type number'\n )\n }\n\n const valueOf = value.valueOf && value.valueOf()\n if (valueOf != null && valueOf !== value) {\n return Buffer.from(valueOf, encodingOrOffset, length)\n }\n\n const b = fromObject(value)\n if (b) return b\n\n if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null &&\n typeof value[Symbol.toPrimitive] === 'function') {\n return Buffer.from(value[Symbol.toPrimitive]('string'), encodingOrOffset, length)\n }\n\n throw new TypeError(\n 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n 'or Array-like Object. Received type ' + (typeof value)\n )\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n return from(value, encodingOrOffset, length)\n}\n\n// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:\n// https://github.com/feross/buffer/pull/148\nObject.setPrototypeOf(Buffer.prototype, Uint8Array.prototype)\nObject.setPrototypeOf(Buffer, Uint8Array)\n\nfunction assertSize (size) {\n if (typeof size !== 'number') {\n throw new TypeError('\"size\" argument must be of type number')\n } else if (size < 0) {\n throw new RangeError('The value \"' + size + '\" is invalid for option \"size\"')\n }\n}\n\nfunction alloc (size, fill, encoding) {\n assertSize(size)\n if (size <= 0) {\n return createBuffer(size)\n }\n if (fill !== undefined) {\n // Only pay attention to encoding if it's a string. This\n // prevents accidentally sending in a number that would\n // be interpreted as a start offset.\n return typeof encoding === 'string'\n ? createBuffer(size).fill(fill, encoding)\n : createBuffer(size).fill(fill)\n }\n return createBuffer(size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n return alloc(size, fill, encoding)\n}\n\nfunction allocUnsafe (size) {\n assertSize(size)\n return createBuffer(size < 0 ? 0 : checked(size) | 0)\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n return allocUnsafe(size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n return allocUnsafe(size)\n}\n\nfunction fromString (string, encoding) {\n if (typeof encoding !== 'string' || encoding === '') {\n encoding = 'utf8'\n }\n\n if (!Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n\n const length = byteLength(string, encoding) | 0\n let buf = createBuffer(length)\n\n const actual = buf.write(string, encoding)\n\n if (actual !== length) {\n // Writing a hex string, for example, that contains invalid characters will\n // cause everything after the first invalid character to be ignored. (e.g.\n // 'abxxcd' will be treated as 'ab')\n buf = buf.slice(0, actual)\n }\n\n return buf\n}\n\nfunction fromArrayLike (array) {\n const length = array.length < 0 ? 0 : checked(array.length) | 0\n const buf = createBuffer(length)\n for (let i = 0; i < length; i += 1) {\n buf[i] = array[i] & 255\n }\n return buf\n}\n\nfunction fromArrayView (arrayView) {\n if (isInstance(arrayView, Uint8Array)) {\n const copy = new Uint8Array(arrayView)\n return fromArrayBuffer(copy.buffer, copy.byteOffset, copy.byteLength)\n }\n return fromArrayLike(arrayView)\n}\n\nfunction fromArrayBuffer (array, byteOffset, length) {\n if (byteOffset < 0 || array.byteLength < byteOffset) {\n throw new RangeError('\"offset\" is outside of buffer bounds')\n }\n\n if (array.byteLength < byteOffset + (length || 0)) {\n throw new RangeError('\"length\" is outside of buffer bounds')\n }\n\n let buf\n if (byteOffset === undefined && length === undefined) {\n buf = new Uint8Array(array)\n } else if (length === undefined) {\n buf = new Uint8Array(array, byteOffset)\n } else {\n buf = new Uint8Array(array, byteOffset, length)\n }\n\n // Return an augmented `Uint8Array` instance\n Object.setPrototypeOf(buf, Buffer.prototype)\n\n return buf\n}\n\nfunction fromObject (obj) {\n if (Buffer.isBuffer(obj)) {\n const len = checked(obj.length) | 0\n const buf = createBuffer(len)\n\n if (buf.length === 0) {\n return buf\n }\n\n obj.copy(buf, 0, 0, len)\n return buf\n }\n\n if (obj.length !== undefined) {\n if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {\n return createBuffer(0)\n }\n return fromArrayLike(obj)\n }\n\n if (obj.type === 'Buffer' && Array.isArray(obj.data)) {\n return fromArrayLike(obj.data)\n }\n}\n\nfunction checked (length) {\n // Note: cannot use `length < K_MAX_LENGTH` here because that fails when\n // length is NaN (which is otherwise coerced to zero.)\n if (length >= K_MAX_LENGTH) {\n throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n 'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')\n }\n return length | 0\n}\n\nfunction SlowBuffer (length) {\n if (+length != length) { // eslint-disable-line eqeqeq\n length = 0\n }\n return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n return b != null && b._isBuffer === true &&\n b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false\n}\n\nBuffer.compare = function compare (a, b) {\n if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength)\n if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength)\n if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n throw new TypeError(\n 'The \"buf1\", \"buf2\" arguments must be one of type Buffer or Uint8Array'\n )\n }\n\n if (a === b) return 0\n\n let x = a.length\n let y = b.length\n\n for (let i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i]\n y = b[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n switch (String(encoding).toLowerCase()) {\n case 'hex':\n case 'utf8':\n case 'utf-8':\n case 'ascii':\n case 'latin1':\n case 'binary':\n case 'base64':\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return true\n default:\n return false\n }\n}\n\nBuffer.concat = function concat (list, length) {\n if (!Array.isArray(list)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n\n if (list.length === 0) {\n return Buffer.alloc(0)\n }\n\n let i\n if (length === undefined) {\n length = 0\n for (i = 0; i < list.length; ++i) {\n length += list[i].length\n }\n }\n\n const buffer = Buffer.allocUnsafe(length)\n let pos = 0\n for (i = 0; i < list.length; ++i) {\n let buf = list[i]\n if (isInstance(buf, Uint8Array)) {\n if (pos + buf.length > buffer.length) {\n if (!Buffer.isBuffer(buf)) buf = Buffer.from(buf)\n buf.copy(buffer, pos)\n } else {\n Uint8Array.prototype.set.call(\n buffer,\n buf,\n pos\n )\n }\n } else if (!Buffer.isBuffer(buf)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n } else {\n buf.copy(buffer, pos)\n }\n pos += buf.length\n }\n return buffer\n}\n\nfunction byteLength (string, encoding) {\n if (Buffer.isBuffer(string)) {\n return string.length\n }\n if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) {\n return string.byteLength\n }\n if (typeof string !== 'string') {\n throw new TypeError(\n 'The \"string\" argument must be one of type string, Buffer, or ArrayBuffer. ' +\n 'Received type ' + typeof string\n )\n }\n\n const len = string.length\n const mustMatch = (arguments.length > 2 && arguments[2] === true)\n if (!mustMatch && len === 0) return 0\n\n // Use a for loop to avoid recursion\n let loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'ascii':\n case 'latin1':\n case 'binary':\n return len\n case 'utf8':\n case 'utf-8':\n return utf8ToBytes(string).length\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return len * 2\n case 'hex':\n return len >>> 1\n case 'base64':\n return base64ToBytes(string).length\n default:\n if (loweredCase) {\n return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8\n }\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n let loweredCase = false\n\n // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n // property of a typed array.\n\n // This behaves neither like String nor Uint8Array in that we set start/end\n // to their upper/lower bounds if the value passed is out of range.\n // undefined is handled specially as per ECMA-262 6th Edition,\n // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n if (start === undefined || start < 0) {\n start = 0\n }\n // Return early if start > this.length. Done here to prevent potential uint32\n // coercion fail below.\n if (start > this.length) {\n return ''\n }\n\n if (end === undefined || end > this.length) {\n end = this.length\n }\n\n if (end <= 0) {\n return ''\n }\n\n // Force coercion to uint32. This will also coerce falsey/NaN values to 0.\n end >>>= 0\n start >>>= 0\n\n if (end <= start) {\n return ''\n }\n\n if (!encoding) encoding = 'utf8'\n\n while (true) {\n switch (encoding) {\n case 'hex':\n return hexSlice(this, start, end)\n\n case 'utf8':\n case 'utf-8':\n return utf8Slice(this, start, end)\n\n case 'ascii':\n return asciiSlice(this, start, end)\n\n case 'latin1':\n case 'binary':\n return latin1Slice(this, start, end)\n\n case 'base64':\n return base64Slice(this, start, end)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return utf16leSlice(this, start, end)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = (encoding + '').toLowerCase()\n loweredCase = true\n }\n }\n}\n\n// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)\n// to detect a Buffer instance. It's not possible to use `instanceof Buffer`\n// reliably in a browserify context because there could be multiple different\n// copies of the 'buffer' package in use. This method works even for Buffer\n// instances that were created from another copy of the `buffer` package.\n// See: https://github.com/feross/buffer/issues/154\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n const i = b[n]\n b[n] = b[m]\n b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n const len = this.length\n if (len % 2 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 16-bits')\n }\n for (let i = 0; i < len; i += 2) {\n swap(this, i, i + 1)\n }\n return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n const len = this.length\n if (len % 4 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 32-bits')\n }\n for (let i = 0; i < len; i += 4) {\n swap(this, i, i + 3)\n swap(this, i + 1, i + 2)\n }\n return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n const len = this.length\n if (len % 8 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 64-bits')\n }\n for (let i = 0; i < len; i += 8) {\n swap(this, i, i + 7)\n swap(this, i + 1, i + 6)\n swap(this, i + 2, i + 5)\n swap(this, i + 3, i + 4)\n }\n return this\n}\n\nBuffer.prototype.toString = function toString () {\n const length = this.length\n if (length === 0) return ''\n if (arguments.length === 0) return utf8Slice(this, 0, length)\n return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.toLocaleString = Buffer.prototype.toString\n\nBuffer.prototype.equals = function equals (b) {\n if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n if (this === b) return true\n return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n let str = ''\n const max = exports.INSPECT_MAX_BYTES\n str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim()\n if (this.length > max) str += ' ... '\n return ''\n}\nif (customInspectSymbol) {\n Buffer.prototype[customInspectSymbol] = Buffer.prototype.inspect\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n if (isInstance(target, Uint8Array)) {\n target = Buffer.from(target, target.offset, target.byteLength)\n }\n if (!Buffer.isBuffer(target)) {\n throw new TypeError(\n 'The \"target\" argument must be one of type Buffer or Uint8Array. ' +\n 'Received type ' + (typeof target)\n )\n }\n\n if (start === undefined) {\n start = 0\n }\n if (end === undefined) {\n end = target ? target.length : 0\n }\n if (thisStart === undefined) {\n thisStart = 0\n }\n if (thisEnd === undefined) {\n thisEnd = this.length\n }\n\n if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n throw new RangeError('out of range index')\n }\n\n if (thisStart >= thisEnd && start >= end) {\n return 0\n }\n if (thisStart >= thisEnd) {\n return -1\n }\n if (start >= end) {\n return 1\n }\n\n start >>>= 0\n end >>>= 0\n thisStart >>>= 0\n thisEnd >>>= 0\n\n if (this === target) return 0\n\n let x = thisEnd - thisStart\n let y = end - start\n const len = Math.min(x, y)\n\n const thisCopy = this.slice(thisStart, thisEnd)\n const targetCopy = target.slice(start, end)\n\n for (let i = 0; i < len; ++i) {\n if (thisCopy[i] !== targetCopy[i]) {\n x = thisCopy[i]\n y = targetCopy[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n // Empty buffer means no match\n if (buffer.length === 0) return -1\n\n // Normalize byteOffset\n if (typeof byteOffset === 'string') {\n encoding = byteOffset\n byteOffset = 0\n } else if (byteOffset > 0x7fffffff) {\n byteOffset = 0x7fffffff\n } else if (byteOffset < -0x80000000) {\n byteOffset = -0x80000000\n }\n byteOffset = +byteOffset // Coerce to Number.\n if (numberIsNaN(byteOffset)) {\n // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n byteOffset = dir ? 0 : (buffer.length - 1)\n }\n\n // Normalize byteOffset: negative offsets start from the end of the buffer\n if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n if (byteOffset >= buffer.length) {\n if (dir) return -1\n else byteOffset = buffer.length - 1\n } else if (byteOffset < 0) {\n if (dir) byteOffset = 0\n else return -1\n }\n\n // Normalize val\n if (typeof val === 'string') {\n val = Buffer.from(val, encoding)\n }\n\n // Finally, search either indexOf (if dir is true) or lastIndexOf\n if (Buffer.isBuffer(val)) {\n // Special case: looking for empty string/buffer always fails\n if (val.length === 0) {\n return -1\n }\n return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n } else if (typeof val === 'number') {\n val = val & 0xFF // Search for a byte value [0-255]\n if (typeof Uint8Array.prototype.indexOf === 'function') {\n if (dir) {\n return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n } else {\n return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n }\n }\n return arrayIndexOf(buffer, [val], byteOffset, encoding, dir)\n }\n\n throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n let indexSize = 1\n let arrLength = arr.length\n let valLength = val.length\n\n if (encoding !== undefined) {\n encoding = String(encoding).toLowerCase()\n if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n encoding === 'utf16le' || encoding === 'utf-16le') {\n if (arr.length < 2 || val.length < 2) {\n return -1\n }\n indexSize = 2\n arrLength /= 2\n valLength /= 2\n byteOffset /= 2\n }\n }\n\n function read (buf, i) {\n if (indexSize === 1) {\n return buf[i]\n } else {\n return buf.readUInt16BE(i * indexSize)\n }\n }\n\n let i\n if (dir) {\n let foundIndex = -1\n for (i = byteOffset; i < arrLength; i++) {\n if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n if (foundIndex === -1) foundIndex = i\n if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n } else {\n if (foundIndex !== -1) i -= i - foundIndex\n foundIndex = -1\n }\n }\n } else {\n if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n for (i = byteOffset; i >= 0; i--) {\n let found = true\n for (let j = 0; j < valLength; j++) {\n if (read(arr, i + j) !== read(val, j)) {\n found = false\n break\n }\n }\n if (found) return i\n }\n }\n\n return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n offset = Number(offset) || 0\n const remaining = buf.length - offset\n if (!length) {\n length = remaining\n } else {\n length = Number(length)\n if (length > remaining) {\n length = remaining\n }\n }\n\n const strLen = string.length\n\n if (length > strLen / 2) {\n length = strLen / 2\n }\n let i\n for (i = 0; i < length; ++i) {\n const parsed = parseInt(string.substr(i * 2, 2), 16)\n if (numberIsNaN(parsed)) return i\n buf[offset + i] = parsed\n }\n return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n // Buffer#write(string)\n if (offset === undefined) {\n encoding = 'utf8'\n length = this.length\n offset = 0\n // Buffer#write(string, encoding)\n } else if (length === undefined && typeof offset === 'string') {\n encoding = offset\n length = this.length\n offset = 0\n // Buffer#write(string, offset[, length][, encoding])\n } else if (isFinite(offset)) {\n offset = offset >>> 0\n if (isFinite(length)) {\n length = length >>> 0\n if (encoding === undefined) encoding = 'utf8'\n } else {\n encoding = length\n length = undefined\n }\n } else {\n throw new Error(\n 'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n )\n }\n\n const remaining = this.length - offset\n if (length === undefined || length > remaining) length = remaining\n\n if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n throw new RangeError('Attempt to write outside buffer bounds')\n }\n\n if (!encoding) encoding = 'utf8'\n\n let loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'hex':\n return hexWrite(this, string, offset, length)\n\n case 'utf8':\n case 'utf-8':\n return utf8Write(this, string, offset, length)\n\n case 'ascii':\n case 'latin1':\n case 'binary':\n return asciiWrite(this, string, offset, length)\n\n case 'base64':\n // Warning: maxLength not taken into account in base64Write\n return base64Write(this, string, offset, length)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return ucs2Write(this, string, offset, length)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n return {\n type: 'Buffer',\n data: Array.prototype.slice.call(this._arr || this, 0)\n }\n}\n\nfunction base64Slice (buf, start, end) {\n if (start === 0 && end === buf.length) {\n return base64.fromByteArray(buf)\n } else {\n return base64.fromByteArray(buf.slice(start, end))\n }\n}\n\nfunction utf8Slice (buf, start, end) {\n end = Math.min(buf.length, end)\n const res = []\n\n let i = start\n while (i < end) {\n const firstByte = buf[i]\n let codePoint = null\n let bytesPerSequence = (firstByte > 0xEF)\n ? 4\n : (firstByte > 0xDF)\n ? 3\n : (firstByte > 0xBF)\n ? 2\n : 1\n\n if (i + bytesPerSequence <= end) {\n let secondByte, thirdByte, fourthByte, tempCodePoint\n\n switch (bytesPerSequence) {\n case 1:\n if (firstByte < 0x80) {\n codePoint = firstByte\n }\n break\n case 2:\n secondByte = buf[i + 1]\n if ((secondByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n if (tempCodePoint > 0x7F) {\n codePoint = tempCodePoint\n }\n }\n break\n case 3:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n codePoint = tempCodePoint\n }\n }\n break\n case 4:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n fourthByte = buf[i + 3]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n codePoint = tempCodePoint\n }\n }\n }\n }\n\n if (codePoint === null) {\n // we did not generate a valid codePoint so insert a\n // replacement char (U+FFFD) and advance only 1 byte\n codePoint = 0xFFFD\n bytesPerSequence = 1\n } else if (codePoint > 0xFFFF) {\n // encode to utf16 (surrogate pair dance)\n codePoint -= 0x10000\n res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n codePoint = 0xDC00 | codePoint & 0x3FF\n }\n\n res.push(codePoint)\n i += bytesPerSequence\n }\n\n return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nconst MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n const len = codePoints.length\n if (len <= MAX_ARGUMENTS_LENGTH) {\n return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n }\n\n // Decode in chunks to avoid \"call stack size exceeded\".\n let res = ''\n let i = 0\n while (i < len) {\n res += String.fromCharCode.apply(\n String,\n codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n )\n }\n return res\n}\n\nfunction asciiSlice (buf, start, end) {\n let ret = ''\n end = Math.min(buf.length, end)\n\n for (let i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i] & 0x7F)\n }\n return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n let ret = ''\n end = Math.min(buf.length, end)\n\n for (let i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i])\n }\n return ret\n}\n\nfunction hexSlice (buf, start, end) {\n const len = buf.length\n\n if (!start || start < 0) start = 0\n if (!end || end < 0 || end > len) end = len\n\n let out = ''\n for (let i = start; i < end; ++i) {\n out += hexSliceLookupTable[buf[i]]\n }\n return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n const bytes = buf.slice(start, end)\n let res = ''\n // If bytes.length is odd, the last 8 bits must be ignored (same as node.js)\n for (let i = 0; i < bytes.length - 1; i += 2) {\n res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))\n }\n return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n const len = this.length\n start = ~~start\n end = end === undefined ? len : ~~end\n\n if (start < 0) {\n start += len\n if (start < 0) start = 0\n } else if (start > len) {\n start = len\n }\n\n if (end < 0) {\n end += len\n if (end < 0) end = 0\n } else if (end > len) {\n end = len\n }\n\n if (end < start) end = start\n\n const newBuf = this.subarray(start, end)\n // Return an augmented `Uint8Array` instance\n Object.setPrototypeOf(newBuf, Buffer.prototype)\n\n return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUintLE =\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let val = this[offset]\n let mul = 1\n let i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUintBE =\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n checkOffset(offset, byteLength, this.length)\n }\n\n let val = this[offset + --byteLength]\n let mul = 1\n while (byteLength > 0 && (mul *= 0x100)) {\n val += this[offset + --byteLength] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUint8 =\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n return this[offset]\n}\n\nBuffer.prototype.readUint16LE =\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUint16BE =\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUint32LE =\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return ((this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16)) +\n (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUint32BE =\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] * 0x1000000) +\n ((this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n this[offset + 3])\n}\n\nBuffer.prototype.readBigUInt64LE = defineBigIntMethod(function readBigUInt64LE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const lo = first +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 24\n\n const hi = this[++offset] +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n last * 2 ** 24\n\n return BigInt(lo) + (BigInt(hi) << BigInt(32))\n})\n\nBuffer.prototype.readBigUInt64BE = defineBigIntMethod(function readBigUInt64BE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const hi = first * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n this[++offset]\n\n const lo = this[++offset] * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n last\n\n return (BigInt(hi) << BigInt(32)) + BigInt(lo)\n})\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let val = this[offset]\n let mul = 1\n let i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let i = byteLength\n let mul = 1\n let val = this[offset + --i]\n while (i > 0 && (mul *= 0x100)) {\n val += this[offset + --i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n if (!(this[offset] & 0x80)) return (this[offset])\n return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n const val = this[offset] | (this[offset + 1] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n const val = this[offset + 1] | (this[offset] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16) |\n (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] << 24) |\n (this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n (this[offset + 3])\n}\n\nBuffer.prototype.readBigInt64LE = defineBigIntMethod(function readBigInt64LE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const val = this[offset + 4] +\n this[offset + 5] * 2 ** 8 +\n this[offset + 6] * 2 ** 16 +\n (last << 24) // Overflow\n\n return (BigInt(val) << BigInt(32)) +\n BigInt(first +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 24)\n})\n\nBuffer.prototype.readBigInt64BE = defineBigIntMethod(function readBigInt64BE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const val = (first << 24) + // Overflow\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n this[++offset]\n\n return (BigInt(val) << BigInt(32)) +\n BigInt(this[++offset] * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n last)\n})\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUintLE =\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n const maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n let mul = 1\n let i = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUintBE =\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n const maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n let i = byteLength - 1\n let mul = 1\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUint8 =\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeUint16LE =\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeUint16BE =\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeUint32LE =\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset + 3] = (value >>> 24)\n this[offset + 2] = (value >>> 16)\n this[offset + 1] = (value >>> 8)\n this[offset] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeUint32BE =\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nfunction wrtBigUInt64LE (buf, value, offset, min, max) {\n checkIntBI(value, min, max, buf, offset, 7)\n\n let lo = Number(value & BigInt(0xffffffff))\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n let hi = Number(value >> BigInt(32) & BigInt(0xffffffff))\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n return offset\n}\n\nfunction wrtBigUInt64BE (buf, value, offset, min, max) {\n checkIntBI(value, min, max, buf, offset, 7)\n\n let lo = Number(value & BigInt(0xffffffff))\n buf[offset + 7] = lo\n lo = lo >> 8\n buf[offset + 6] = lo\n lo = lo >> 8\n buf[offset + 5] = lo\n lo = lo >> 8\n buf[offset + 4] = lo\n let hi = Number(value >> BigInt(32) & BigInt(0xffffffff))\n buf[offset + 3] = hi\n hi = hi >> 8\n buf[offset + 2] = hi\n hi = hi >> 8\n buf[offset + 1] = hi\n hi = hi >> 8\n buf[offset] = hi\n return offset + 8\n}\n\nBuffer.prototype.writeBigUInt64LE = defineBigIntMethod(function writeBigUInt64LE (value, offset = 0) {\n return wrtBigUInt64LE(this, value, offset, BigInt(0), BigInt('0xffffffffffffffff'))\n})\n\nBuffer.prototype.writeBigUInt64BE = defineBigIntMethod(function writeBigUInt64BE (value, offset = 0) {\n return wrtBigUInt64BE(this, value, offset, BigInt(0), BigInt('0xffffffffffffffff'))\n})\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n const limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n let i = 0\n let mul = 1\n let sub = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n const limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n let i = byteLength - 1\n let mul = 1\n let sub = 0\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n if (value < 0) value = 0xff + value + 1\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n this[offset + 2] = (value >>> 16)\n this[offset + 3] = (value >>> 24)\n return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (value < 0) value = 0xffffffff + value + 1\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeBigInt64LE = defineBigIntMethod(function writeBigInt64LE (value, offset = 0) {\n return wrtBigUInt64LE(this, value, offset, -BigInt('0x8000000000000000'), BigInt('0x7fffffffffffffff'))\n})\n\nBuffer.prototype.writeBigInt64BE = defineBigIntMethod(function writeBigInt64BE (value, offset = 0) {\n return wrtBigUInt64BE(this, value, offset, -BigInt('0x8000000000000000'), BigInt('0x7fffffffffffffff'))\n})\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n }\n ieee754.write(buf, value, offset, littleEndian, 23, 4)\n return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n }\n ieee754.write(buf, value, offset, littleEndian, 52, 8)\n return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')\n if (!start) start = 0\n if (!end && end !== 0) end = this.length\n if (targetStart >= target.length) targetStart = target.length\n if (!targetStart) targetStart = 0\n if (end > 0 && end < start) end = start\n\n // Copy 0 bytes; we're done\n if (end === start) return 0\n if (target.length === 0 || this.length === 0) return 0\n\n // Fatal error conditions\n if (targetStart < 0) {\n throw new RangeError('targetStart out of bounds')\n }\n if (start < 0 || start >= this.length) throw new RangeError('Index out of range')\n if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n // Are we oob?\n if (end > this.length) end = this.length\n if (target.length - targetStart < end - start) {\n end = target.length - targetStart + start\n }\n\n const len = end - start\n\n if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {\n // Use built-in when available, missing from IE11\n this.copyWithin(targetStart, start, end)\n } else {\n Uint8Array.prototype.set.call(\n target,\n this.subarray(start, end),\n targetStart\n )\n }\n\n return len\n}\n\n// Usage:\n// buffer.fill(number[, offset[, end]])\n// buffer.fill(buffer[, offset[, end]])\n// buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n // Handle string cases:\n if (typeof val === 'string') {\n if (typeof start === 'string') {\n encoding = start\n start = 0\n end = this.length\n } else if (typeof end === 'string') {\n encoding = end\n end = this.length\n }\n if (encoding !== undefined && typeof encoding !== 'string') {\n throw new TypeError('encoding must be a string')\n }\n if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n if (val.length === 1) {\n const code = val.charCodeAt(0)\n if ((encoding === 'utf8' && code < 128) ||\n encoding === 'latin1') {\n // Fast path: If `val` fits into a single byte, use that numeric value.\n val = code\n }\n }\n } else if (typeof val === 'number') {\n val = val & 255\n } else if (typeof val === 'boolean') {\n val = Number(val)\n }\n\n // Invalid ranges are not set to a default, so can range check early.\n if (start < 0 || this.length < start || this.length < end) {\n throw new RangeError('Out of range index')\n }\n\n if (end <= start) {\n return this\n }\n\n start = start >>> 0\n end = end === undefined ? this.length : end >>> 0\n\n if (!val) val = 0\n\n let i\n if (typeof val === 'number') {\n for (i = start; i < end; ++i) {\n this[i] = val\n }\n } else {\n const bytes = Buffer.isBuffer(val)\n ? val\n : Buffer.from(val, encoding)\n const len = bytes.length\n if (len === 0) {\n throw new TypeError('The value \"' + val +\n '\" is invalid for argument \"value\"')\n }\n for (i = 0; i < end - start; ++i) {\n this[i + start] = bytes[i % len]\n }\n }\n\n return this\n}\n\n// CUSTOM ERRORS\n// =============\n\n// Simplified versions from Node, changed for Buffer-only usage\nconst errors = {}\nfunction E (sym, getMessage, Base) {\n errors[sym] = class NodeError extends Base {\n constructor () {\n super()\n\n Object.defineProperty(this, 'message', {\n value: getMessage.apply(this, arguments),\n writable: true,\n configurable: true\n })\n\n // Add the error code to the name to include it in the stack trace.\n this.name = `${this.name} [${sym}]`\n // Access the stack to generate the error message including the error code\n // from the name.\n this.stack // eslint-disable-line no-unused-expressions\n // Reset the name to the actual name.\n delete this.name\n }\n\n get code () {\n return sym\n }\n\n set code (value) {\n Object.defineProperty(this, 'code', {\n configurable: true,\n enumerable: true,\n value,\n writable: true\n })\n }\n\n toString () {\n return `${this.name} [${sym}]: ${this.message}`\n }\n }\n}\n\nE('ERR_BUFFER_OUT_OF_BOUNDS',\n function (name) {\n if (name) {\n return `${name} is outside of buffer bounds`\n }\n\n return 'Attempt to access memory outside buffer bounds'\n }, RangeError)\nE('ERR_INVALID_ARG_TYPE',\n function (name, actual) {\n return `The \"${name}\" argument must be of type number. Received type ${typeof actual}`\n }, TypeError)\nE('ERR_OUT_OF_RANGE',\n function (str, range, input) {\n let msg = `The value of \"${str}\" is out of range.`\n let received = input\n if (Number.isInteger(input) && Math.abs(input) > 2 ** 32) {\n received = addNumericalSeparator(String(input))\n } else if (typeof input === 'bigint') {\n received = String(input)\n if (input > BigInt(2) ** BigInt(32) || input < -(BigInt(2) ** BigInt(32))) {\n received = addNumericalSeparator(received)\n }\n received += 'n'\n }\n msg += ` It must be ${range}. Received ${received}`\n return msg\n }, RangeError)\n\nfunction addNumericalSeparator (val) {\n let res = ''\n let i = val.length\n const start = val[0] === '-' ? 1 : 0\n for (; i >= start + 4; i -= 3) {\n res = `_${val.slice(i - 3, i)}${res}`\n }\n return `${val.slice(0, i)}${res}`\n}\n\n// CHECK FUNCTIONS\n// ===============\n\nfunction checkBounds (buf, offset, byteLength) {\n validateNumber(offset, 'offset')\n if (buf[offset] === undefined || buf[offset + byteLength] === undefined) {\n boundsError(offset, buf.length - (byteLength + 1))\n }\n}\n\nfunction checkIntBI (value, min, max, buf, offset, byteLength) {\n if (value > max || value < min) {\n const n = typeof min === 'bigint' ? 'n' : ''\n let range\n if (byteLength > 3) {\n if (min === 0 || min === BigInt(0)) {\n range = `>= 0${n} and < 2${n} ** ${(byteLength + 1) * 8}${n}`\n } else {\n range = `>= -(2${n} ** ${(byteLength + 1) * 8 - 1}${n}) and < 2 ** ` +\n `${(byteLength + 1) * 8 - 1}${n}`\n }\n } else {\n range = `>= ${min}${n} and <= ${max}${n}`\n }\n throw new errors.ERR_OUT_OF_RANGE('value', range, value)\n }\n checkBounds(buf, offset, byteLength)\n}\n\nfunction validateNumber (value, name) {\n if (typeof value !== 'number') {\n throw new errors.ERR_INVALID_ARG_TYPE(name, 'number', value)\n }\n}\n\nfunction boundsError (value, length, type) {\n if (Math.floor(value) !== value) {\n validateNumber(value, type)\n throw new errors.ERR_OUT_OF_RANGE(type || 'offset', 'an integer', value)\n }\n\n if (length < 0) {\n throw new errors.ERR_BUFFER_OUT_OF_BOUNDS()\n }\n\n throw new errors.ERR_OUT_OF_RANGE(type || 'offset',\n `>= ${type ? 1 : 0} and <= ${length}`,\n value)\n}\n\n// HELPER FUNCTIONS\n// ================\n\nconst INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n // Node takes equal signs as end of the Base64 encoding\n str = str.split('=')[0]\n // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n str = str.trim().replace(INVALID_BASE64_RE, '')\n // Node converts strings with length < 2 to ''\n if (str.length < 2) return ''\n // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n while (str.length % 4 !== 0) {\n str = str + '='\n }\n return str\n}\n\nfunction utf8ToBytes (string, units) {\n units = units || Infinity\n let codePoint\n const length = string.length\n let leadSurrogate = null\n const bytes = []\n\n for (let i = 0; i < length; ++i) {\n codePoint = string.charCodeAt(i)\n\n // is surrogate component\n if (codePoint > 0xD7FF && codePoint < 0xE000) {\n // last char was a lead\n if (!leadSurrogate) {\n // no lead yet\n if (codePoint > 0xDBFF) {\n // unexpected trail\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n } else if (i + 1 === length) {\n // unpaired lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n }\n\n // valid lead\n leadSurrogate = codePoint\n\n continue\n }\n\n // 2 leads in a row\n if (codePoint < 0xDC00) {\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n leadSurrogate = codePoint\n continue\n }\n\n // valid surrogate pair\n codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n } else if (leadSurrogate) {\n // valid bmp char, but last char was a lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n }\n\n leadSurrogate = null\n\n // encode utf8\n if (codePoint < 0x80) {\n if ((units -= 1) < 0) break\n bytes.push(codePoint)\n } else if (codePoint < 0x800) {\n if ((units -= 2) < 0) break\n bytes.push(\n codePoint >> 0x6 | 0xC0,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x10000) {\n if ((units -= 3) < 0) break\n bytes.push(\n codePoint >> 0xC | 0xE0,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x110000) {\n if ((units -= 4) < 0) break\n bytes.push(\n codePoint >> 0x12 | 0xF0,\n codePoint >> 0xC & 0x3F | 0x80,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else {\n throw new Error('Invalid code point')\n }\n }\n\n return bytes\n}\n\nfunction asciiToBytes (str) {\n const byteArray = []\n for (let i = 0; i < str.length; ++i) {\n // Node's code seems to be doing this and not & 0x7F..\n byteArray.push(str.charCodeAt(i) & 0xFF)\n }\n return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n let c, hi, lo\n const byteArray = []\n for (let i = 0; i < str.length; ++i) {\n if ((units -= 2) < 0) break\n\n c = str.charCodeAt(i)\n hi = c >> 8\n lo = c % 256\n byteArray.push(lo)\n byteArray.push(hi)\n }\n\n return byteArray\n}\n\nfunction base64ToBytes (str) {\n return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n let i\n for (i = 0; i < length; ++i) {\n if ((i + offset >= dst.length) || (i >= src.length)) break\n dst[i + offset] = src[i]\n }\n return i\n}\n\n// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass\n// the `instanceof` check but they should be treated as of that type.\n// See: https://github.com/feross/buffer/issues/166\nfunction isInstance (obj, type) {\n return obj instanceof type ||\n (obj != null && obj.constructor != null && obj.constructor.name != null &&\n obj.constructor.name === type.name)\n}\nfunction numberIsNaN (obj) {\n // For IE11 support\n return obj !== obj // eslint-disable-line no-self-compare\n}\n\n// Create lookup table for `toString('hex')`\n// See: https://github.com/feross/buffer/issues/219\nconst hexSliceLookupTable = (function () {\n const alphabet = '0123456789abcdef'\n const table = new Array(256)\n for (let i = 0; i < 16; ++i) {\n const i16 = i * 16\n for (let j = 0; j < 16; ++j) {\n table[i16 + j] = alphabet[i] + alphabet[j]\n }\n }\n return table\n})()\n\n// Return not function with Error if BigInt not supported\nfunction defineBigIntMethod (fn) {\n return typeof BigInt === 'undefined' ? BufferBigIntNotDefined : fn\n}\n\nfunction BufferBigIntNotDefined () {\n throw new Error('BigInt not supported')\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vbm9kZV9tb2R1bGVzL2J1ZmZlci9pbmRleC5qcz9iNjM5Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVZOztBQUVaLGVBQWUsbUJBQU8sQ0FBQyxvREFBVztBQUNsQyxnQkFBZ0IsbUJBQU8sQ0FBQyxnREFBUztBQUNqQztBQUNBO0FBQ0E7QUFDQTs7QUFFQSxjQUFjO0FBQ2Qsa0JBQWtCO0FBQ2xCLHlCQUF5Qjs7QUFFekI7QUFDQSxrQkFBa0I7O0FBRWxCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixtQkFBbUIsWUFBWTtBQUNsRDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLFlBQVk7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBLHVDQUF1QyxTQUFTO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsaUJBQWlCO0FBQ2hDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsYUFBYSxpQkFBaUI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixTQUFTO0FBQzFCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsU0FBUztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsU0FBUztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQsRUFBRTtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsaUJBQWlCLFNBQVM7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QztBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixlQUFlO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLHdCQUF3QixRQUFRO0FBQ2hDO0FBQ0EscUJBQXFCLGVBQWU7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsWUFBWTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEscUJBQXFCLFNBQVM7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHFCQUFxQixTQUFTO0FBQzlCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLHFCQUFxQixTQUFTO0FBQzlCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLHNCQUFzQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FB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QUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaUJBQWlCLGdCQUFnQjtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixnQkFBZ0I7QUFDakM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxhQUFhLFlBQVk7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixRQUFRO0FBQ3pCO0FBQ0EsbUJBQW1CLFFBQVE7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9idWZmZXIvaW5kZXguanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIFRoZSBidWZmZXIgbW9kdWxlIGZyb20gbm9kZS5qcywgZm9yIHRoZSBicm93c2VyLlxuICpcbiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmc+XG4gKiBAbGljZW5zZSAgTUlUXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG5cbid1c2Ugc3RyaWN0J1xuXG5jb25zdCBiYXNlNjQgPSByZXF1aXJlKCdiYXNlNjQtanMnKVxuY29uc3QgaWVlZTc1NCA9IHJlcXVpcmUoJ2llZWU3NTQnKVxuY29uc3QgY3VzdG9tSW5zcGVjdFN5bWJvbCA9XG4gICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBTeW1ib2xbJ2ZvciddID09PSAnZnVuY3Rpb24nKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGRvdC1ub3RhdGlvblxuICAgID8gU3ltYm9sWydmb3InXSgnbm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b20nKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGRvdC1ub3RhdGlvblxuICAgIDogbnVsbFxuXG5leHBvcnRzLkJ1ZmZlciA9IEJ1ZmZlclxuZXhwb3J0cy5TbG93QnVmZmVyID0gU2xvd0J1ZmZlclxuZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFUyA9IDUwXG5cbmNvbnN0IEtfTUFYX0xFTkdUSCA9IDB4N2ZmZmZmZmZcbmV4cG9ydHMua01heExlbmd0aCA9IEtfTUFYX0xFTkdUSFxuXG4vKipcbiAqIElmIGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGA6XG4gKiAgID09PSB0cnVlICAgIFVzZSBVaW50OEFycmF5IGltcGxlbWVudGF0aW9uIChmYXN0ZXN0KVxuICogICA9PT0gZmFsc2UgICBQcmludCB3YXJuaW5nIGFuZCByZWNvbW1lbmQgdXNpbmcgYGJ1ZmZlcmAgdjQueCB3aGljaCBoYXMgYW4gT2JqZWN0XG4gKiAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIChtb3N0IGNvbXBhdGlibGUsIGV2ZW4gSUU2KVxuICpcbiAqIEJyb3dzZXJzIHRoYXQgc3VwcG9ydCB0eXBlZCBhcnJheXMgYXJlIElFIDEwKywgRmlyZWZveCA0KywgQ2hyb21lIDcrLCBTYWZhcmkgNS4xKyxcbiAqIE9wZXJhIDExLjYrLCBpT1MgNC4yKy5cbiAqXG4gKiBXZSByZXBvcnQgdGhhdCB0aGUgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IHR5cGVkIGFycmF5cyBpZiB0aGUgYXJlIG5vdCBzdWJjbGFzc2FibGVcbiAqIHVzaW5nIF9fcHJvdG9fXy4gRmlyZWZveCA0LTI5IGxhY2tzIHN1cHBvcnQgZm9yIGFkZGluZyBuZXcgcHJvcGVydGllcyB0byBgVWludDhBcnJheWBcbiAqIChTZWU6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY5NTQzOCkuIElFIDEwIGxhY2tzIHN1cHBvcnRcbiAqIGZvciBfX3Byb3RvX18gYW5kIGhhcyBhIGJ1Z2d5IHR5cGVkIGFycmF5IGltcGxlbWVudGF0aW9uLlxuICovXG5CdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCA9IHR5cGVkQXJyYXlTdXBwb3J0KClcblxuaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCAmJiB0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICB0eXBlb2YgY29uc29sZS5lcnJvciA9PT0gJ2Z1bmN0aW9uJykge1xuICBjb25zb2xlLmVycm9yKFxuICAgICdUaGlzIGJyb3dzZXIgbGFja3MgdHlwZWQgYXJyYXkgKFVpbnQ4QXJyYXkpIHN1cHBvcnQgd2hpY2ggaXMgcmVxdWlyZWQgYnkgJyArXG4gICAgJ2BidWZmZXJgIHY1LnguIFVzZSBgYnVmZmVyYCB2NC54IGlmIHlvdSByZXF1aXJlIG9sZCBicm93c2VyIHN1cHBvcnQuJ1xuICApXG59XG5cbmZ1bmN0aW9uIHR5cGVkQXJyYXlTdXBwb3J0ICgpIHtcbiAgLy8gQ2FuIHR5cGVkIGFycmF5IGluc3RhbmNlcyBjYW4gYmUgYXVnbWVudGVkP1xuICB0cnkge1xuICAgIGNvbnN0IGFyciA9IG5ldyBVaW50OEFycmF5KDEpXG4gICAgY29uc3QgcHJvdG8gPSB7IGZvbzogZnVuY3Rpb24gKCkgeyByZXR1cm4gNDIgfSB9XG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHByb3RvLCBVaW50OEFycmF5LnByb3RvdHlwZSlcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoYXJyLCBwcm90bylcbiAgICByZXR1cm4gYXJyLmZvbygpID09PSA0MlxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEJ1ZmZlci5wcm90b3R5cGUsICdwYXJlbnQnLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIGlmICghQnVmZmVyLmlzQnVmZmVyKHRoaXMpKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyXG4gIH1cbn0pXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShCdWZmZXIucHJvdG90eXBlLCAnb2Zmc2V0Jywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih0aGlzKSkgcmV0dXJuIHVuZGVmaW5lZFxuICAgIHJldHVybiB0aGlzLmJ5dGVPZmZzZXRcbiAgfVxufSlcblxuZnVuY3Rpb24gY3JlYXRlQnVmZmVyIChsZW5ndGgpIHtcbiAgaWYgKGxlbmd0aCA+IEtfTUFYX0xFTkdUSCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgXCInICsgbGVuZ3RoICsgJ1wiIGlzIGludmFsaWQgZm9yIG9wdGlvbiBcInNpemVcIicpXG4gIH1cbiAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2VcbiAgY29uc3QgYnVmID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKVxuICBPYmplY3Quc2V0UHJvdG90eXBlT2YoYnVmLCBCdWZmZXIucHJvdG90eXBlKVxuICByZXR1cm4gYnVmXG59XG5cbi8qKlxuICogVGhlIEJ1ZmZlciBjb25zdHJ1Y3RvciByZXR1cm5zIGluc3RhbmNlcyBvZiBgVWludDhBcnJheWAgdGhhdCBoYXZlIHRoZWlyXG4gKiBwcm90b3R5cGUgY2hhbmdlZCB0byBgQnVmZmVyLnByb3RvdHlwZWAuIEZ1cnRoZXJtb3JlLCBgQnVmZmVyYCBpcyBhIHN1YmNsYXNzIG9mXG4gKiBgVWludDhBcnJheWAsIHNvIHRoZSByZXR1cm5lZCBpbnN0YW5jZXMgd2lsbCBoYXZlIGFsbCB0aGUgbm9kZSBgQnVmZmVyYCBtZXRob2RzXG4gKiBhbmQgdGhlIGBVaW50OEFycmF5YCBtZXRob2RzLiBTcXVhcmUgYnJhY2tldCBub3RhdGlvbiB3b3JrcyBhcyBleHBlY3RlZCAtLSBpdFxuICogcmV0dXJucyBhIHNpbmdsZSBvY3RldC5cbiAqXG4gKiBUaGUgYFVpbnQ4QXJyYXlgIHByb3RvdHlwZSByZW1haW5zIHVubW9kaWZpZWQuXG4gKi9cblxuZnVuY3Rpb24gQnVmZmVyIChhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICAvLyBDb21tb24gY2FzZS5cbiAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZ09yT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgJ1RoZSBcInN0cmluZ1wiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuIFJlY2VpdmVkIHR5cGUgbnVtYmVyJ1xuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gYWxsb2NVbnNhZmUoYXJnKVxuICB9XG4gIHJldHVybiBmcm9tKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5CdWZmZXIucG9vbFNpemUgPSA4MTkyIC8vIG5vdCB1c2VkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb25cblxuZnVuY3Rpb24gZnJvbSAodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmcm9tU3RyaW5nKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0KVxuICB9XG5cbiAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZnJvbUFycmF5Vmlldyh2YWx1ZSlcbiAgfVxuXG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICdUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCAnICtcbiAgICAgICdvciBBcnJheS1saWtlIE9iamVjdC4gUmVjZWl2ZWQgdHlwZSAnICsgKHR5cGVvZiB2YWx1ZSlcbiAgICApXG4gIH1cblxuICBpZiAoaXNJbnN0YW5jZSh2YWx1ZSwgQXJyYXlCdWZmZXIpIHx8XG4gICAgICAodmFsdWUgJiYgaXNJbnN0YW5jZSh2YWx1ZS5idWZmZXIsIEFycmF5QnVmZmVyKSkpIHtcbiAgICByZXR1cm4gZnJvbUFycmF5QnVmZmVyKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICBpZiAodHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgKGlzSW5zdGFuY2UodmFsdWUsIFNoYXJlZEFycmF5QnVmZmVyKSB8fFxuICAgICAgKHZhbHVlICYmIGlzSW5zdGFuY2UodmFsdWUuYnVmZmVyLCBTaGFyZWRBcnJheUJ1ZmZlcikpKSkge1xuICAgIHJldHVybiBmcm9tQXJyYXlCdWZmZXIodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICdUaGUgXCJ2YWx1ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG9mIHR5cGUgbnVtYmVyLiBSZWNlaXZlZCB0eXBlIG51bWJlcidcbiAgICApXG4gIH1cblxuICBjb25zdCB2YWx1ZU9mID0gdmFsdWUudmFsdWVPZiAmJiB2YWx1ZS52YWx1ZU9mKClcbiAgaWYgKHZhbHVlT2YgIT0gbnVsbCAmJiB2YWx1ZU9mICE9PSB2YWx1ZSkge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbSh2YWx1ZU9mLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICBjb25zdCBiID0gZnJvbU9iamVjdCh2YWx1ZSlcbiAgaWYgKGIpIHJldHVybiBiXG5cbiAgaWYgKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1ByaW1pdGl2ZSAhPSBudWxsICYmXG4gICAgICB0eXBlb2YgdmFsdWVbU3ltYm9sLnRvUHJpbWl0aXZlXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbSh2YWx1ZVtTeW1ib2wudG9QcmltaXRpdmVdKCdzdHJpbmcnKSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAnVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgJyArXG4gICAgJ29yIEFycmF5LWxpa2UgT2JqZWN0LiBSZWNlaXZlZCB0eXBlICcgKyAodHlwZW9mIHZhbHVlKVxuICApXG59XG5cbi8qKlxuICogRnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gQnVmZmVyKGFyZywgZW5jb2RpbmcpIGJ1dCB0aHJvd3MgYSBUeXBlRXJyb3JcbiAqIGlmIHZhbHVlIGlzIGEgbnVtYmVyLlxuICogQnVmZmVyLmZyb20oc3RyWywgZW5jb2RpbmddKVxuICogQnVmZmVyLmZyb20oYXJyYXkpXG4gKiBCdWZmZXIuZnJvbShidWZmZXIpXG4gKiBCdWZmZXIuZnJvbShhcnJheUJ1ZmZlclssIGJ5dGVPZmZzZXRbLCBsZW5ndGhdXSlcbiAqKi9cbkJ1ZmZlci5mcm9tID0gZnVuY3Rpb24gKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGZyb20odmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuLy8gTm90ZTogQ2hhbmdlIHByb3RvdHlwZSAqYWZ0ZXIqIEJ1ZmZlci5mcm9tIGlzIGRlZmluZWQgdG8gd29ya2Fyb3VuZCBDaHJvbWUgYnVnOlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvcHVsbC8xNDhcbk9iamVjdC5zZXRQcm90b3R5cGVPZihCdWZmZXIucHJvdG90eXBlLCBVaW50OEFycmF5LnByb3RvdHlwZSlcbk9iamVjdC5zZXRQcm90b3R5cGVPZihCdWZmZXIsIFVpbnQ4QXJyYXkpXG5cbmZ1bmN0aW9uIGFzc2VydFNpemUgKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wic2l6ZVwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBudW1iZXInKVxuICB9IGVsc2UgaWYgKHNpemUgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBcIicgKyBzaXplICsgJ1wiIGlzIGludmFsaWQgZm9yIG9wdGlvbiBcInNpemVcIicpXG4gIH1cbn1cblxuZnVuY3Rpb24gYWxsb2MgKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGFzc2VydFNpemUoc2l6ZSlcbiAgaWYgKHNpemUgPD0gMCkge1xuICAgIHJldHVybiBjcmVhdGVCdWZmZXIoc2l6ZSlcbiAgfVxuICBpZiAoZmlsbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gT25seSBwYXkgYXR0ZW50aW9uIHRvIGVuY29kaW5nIGlmIGl0J3MgYSBzdHJpbmcuIFRoaXNcbiAgICAvLyBwcmV2ZW50cyBhY2NpZGVudGFsbHkgc2VuZGluZyBpbiBhIG51bWJlciB0aGF0IHdvdWxkXG4gICAgLy8gYmUgaW50ZXJwcmV0ZWQgYXMgYSBzdGFydCBvZmZzZXQuXG4gICAgcmV0dXJuIHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZydcbiAgICAgID8gY3JlYXRlQnVmZmVyKHNpemUpLmZpbGwoZmlsbCwgZW5jb2RpbmcpXG4gICAgICA6IGNyZWF0ZUJ1ZmZlcihzaXplKS5maWxsKGZpbGwpXG4gIH1cbiAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcihzaXplKVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqIGFsbG9jKHNpemVbLCBmaWxsWywgZW5jb2RpbmddXSlcbiAqKi9cbkJ1ZmZlci5hbGxvYyA9IGZ1bmN0aW9uIChzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICByZXR1cm4gYWxsb2Moc2l6ZSwgZmlsbCwgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIGFsbG9jVW5zYWZlIChzaXplKSB7XG4gIGFzc2VydFNpemUoc2l6ZSlcbiAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcihzaXplIDwgMCA/IDAgOiBjaGVja2VkKHNpemUpIHwgMClcbn1cblxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIEJ1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZSA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShzaXplKVxufVxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIFNsb3dCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShzaXplKVxufVxuXG5mdW5jdGlvbiBmcm9tU3RyaW5nIChzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnIHx8IGVuY29kaW5nID09PSAnJykge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gIH1cblxuICBpZiAoIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgfVxuXG4gIGNvbnN0IGxlbmd0aCA9IGJ5dGVMZW5ndGgoc3RyaW5nLCBlbmNvZGluZykgfCAwXG4gIGxldCBidWYgPSBjcmVhdGVCdWZmZXIobGVuZ3RoKVxuXG4gIGNvbnN0IGFjdHVhbCA9IGJ1Zi53cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuXG4gIGlmIChhY3R1YWwgIT09IGxlbmd0aCkge1xuICAgIC8vIFdyaXRpbmcgYSBoZXggc3RyaW5nLCBmb3IgZXhhbXBsZSwgdGhhdCBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMgd2lsbFxuICAgIC8vIGNhdXNlIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGZpcnN0IGludmFsaWQgY2hhcmFjdGVyIHRvIGJlIGlnbm9yZWQuIChlLmcuXG4gICAgLy8gJ2FieHhjZCcgd2lsbCBiZSB0cmVhdGVkIGFzICdhYicpXG4gICAgYnVmID0gYnVmLnNsaWNlKDAsIGFjdHVhbClcbiAgfVxuXG4gIHJldHVybiBidWZcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5TGlrZSAoYXJyYXkpIHtcbiAgY29uc3QgbGVuZ3RoID0gYXJyYXkubGVuZ3RoIDwgMCA/IDAgOiBjaGVja2VkKGFycmF5Lmxlbmd0aCkgfCAwXG4gIGNvbnN0IGJ1ZiA9IGNyZWF0ZUJ1ZmZlcihsZW5ndGgpXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICBidWZbaV0gPSBhcnJheVtpXSAmIDI1NVxuICB9XG4gIHJldHVybiBidWZcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5VmlldyAoYXJyYXlWaWV3KSB7XG4gIGlmIChpc0luc3RhbmNlKGFycmF5VmlldywgVWludDhBcnJheSkpIHtcbiAgICBjb25zdCBjb3B5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlWaWV3KVxuICAgIHJldHVybiBmcm9tQXJyYXlCdWZmZXIoY29weS5idWZmZXIsIGNvcHkuYnl0ZU9mZnNldCwgY29weS5ieXRlTGVuZ3RoKVxuICB9XG4gIHJldHVybiBmcm9tQXJyYXlMaWtlKGFycmF5Vmlldylcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5QnVmZmVyIChhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcIm9mZnNldFwiIGlzIG91dHNpZGUgb2YgYnVmZmVyIGJvdW5kcycpXG4gIH1cblxuICBpZiAoYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQgKyAobGVuZ3RoIHx8IDApKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1wibGVuZ3RoXCIgaXMgb3V0c2lkZSBvZiBidWZmZXIgYm91bmRzJylcbiAgfVxuXG4gIGxldCBidWZcbiAgaWYgKGJ5dGVPZmZzZXQgPT09IHVuZGVmaW5lZCAmJiBsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGFycmF5KVxuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYnVmID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQpXG4gIH0gZWxzZSB7XG4gICAgYnVmID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlXG4gIE9iamVjdC5zZXRQcm90b3R5cGVPZihidWYsIEJ1ZmZlci5wcm90b3R5cGUpXG5cbiAgcmV0dXJuIGJ1ZlxufVxuXG5mdW5jdGlvbiBmcm9tT2JqZWN0IChvYmopIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihvYmopKSB7XG4gICAgY29uc3QgbGVuID0gY2hlY2tlZChvYmoubGVuZ3RoKSB8IDBcbiAgICBjb25zdCBidWYgPSBjcmVhdGVCdWZmZXIobGVuKVxuXG4gICAgaWYgKGJ1Zi5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBidWZcbiAgICB9XG5cbiAgICBvYmouY29weShidWYsIDAsIDAsIGxlbilcbiAgICByZXR1cm4gYnVmXG4gIH1cblxuICBpZiAob2JqLmxlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHR5cGVvZiBvYmoubGVuZ3RoICE9PSAnbnVtYmVyJyB8fCBudW1iZXJJc05hTihvYmoubGVuZ3RoKSkge1xuICAgICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcigwKVxuICAgIH1cbiAgICByZXR1cm4gZnJvbUFycmF5TGlrZShvYmopXG4gIH1cblxuICBpZiAob2JqLnR5cGUgPT09ICdCdWZmZXInICYmIEFycmF5LmlzQXJyYXkob2JqLmRhdGEpKSB7XG4gICAgcmV0dXJuIGZyb21BcnJheUxpa2Uob2JqLmRhdGEpXG4gIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tlZCAobGVuZ3RoKSB7XG4gIC8vIE5vdGU6IGNhbm5vdCB1c2UgYGxlbmd0aCA8IEtfTUFYX0xFTkdUSGAgaGVyZSBiZWNhdXNlIHRoYXQgZmFpbHMgd2hlblxuICAvLyBsZW5ndGggaXMgTmFOICh3aGljaCBpcyBvdGhlcndpc2UgY29lcmNlZCB0byB6ZXJvLilcbiAgaWYgKGxlbmd0aCA+PSBLX01BWF9MRU5HVEgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAnc2l6ZTogMHgnICsgS19NQVhfTEVOR1RILnRvU3RyaW5nKDE2KSArICcgYnl0ZXMnKVxuICB9XG4gIHJldHVybiBsZW5ndGggfCAwXG59XG5cbmZ1bmN0aW9uIFNsb3dCdWZmZXIgKGxlbmd0aCkge1xuICBpZiAoK2xlbmd0aCAhPSBsZW5ndGgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBlcWVxZXFcbiAgICBsZW5ndGggPSAwXG4gIH1cbiAgcmV0dXJuIEJ1ZmZlci5hbGxvYygrbGVuZ3RoKVxufVxuXG5CdWZmZXIuaXNCdWZmZXIgPSBmdW5jdGlvbiBpc0J1ZmZlciAoYikge1xuICByZXR1cm4gYiAhPSBudWxsICYmIGIuX2lzQnVmZmVyID09PSB0cnVlICYmXG4gICAgYiAhPT0gQnVmZmVyLnByb3RvdHlwZSAvLyBzbyBCdWZmZXIuaXNCdWZmZXIoQnVmZmVyLnByb3RvdHlwZSkgd2lsbCBiZSBmYWxzZVxufVxuXG5CdWZmZXIuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUgKGEsIGIpIHtcbiAgaWYgKGlzSW5zdGFuY2UoYSwgVWludDhBcnJheSkpIGEgPSBCdWZmZXIuZnJvbShhLCBhLm9mZnNldCwgYS5ieXRlTGVuZ3RoKVxuICBpZiAoaXNJbnN0YW5jZShiLCBVaW50OEFycmF5KSkgYiA9IEJ1ZmZlci5mcm9tKGIsIGIub2Zmc2V0LCBiLmJ5dGVMZW5ndGgpXG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGEpIHx8ICFCdWZmZXIuaXNCdWZmZXIoYikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgJ1RoZSBcImJ1ZjFcIiwgXCJidWYyXCIgYXJndW1lbnRzIG11c3QgYmUgb25lIG9mIHR5cGUgQnVmZmVyIG9yIFVpbnQ4QXJyYXknXG4gICAgKVxuICB9XG5cbiAgaWYgKGEgPT09IGIpIHJldHVybiAwXG5cbiAgbGV0IHggPSBhLmxlbmd0aFxuICBsZXQgeSA9IGIubGVuZ3RoXG5cbiAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IE1hdGgubWluKHgsIHkpOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAoYVtpXSAhPT0gYltpXSkge1xuICAgICAgeCA9IGFbaV1cbiAgICAgIHkgPSBiW2ldXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmICh4IDwgeSkgcmV0dXJuIC0xXG4gIGlmICh5IDwgeCkgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuQnVmZmVyLmlzRW5jb2RpbmcgPSBmdW5jdGlvbiBpc0VuY29kaW5nIChlbmNvZGluZykge1xuICBzd2l0Y2ggKFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKSkge1xuICAgIGNhc2UgJ2hleCc6XG4gICAgY2FzZSAndXRmOCc6XG4gICAgY2FzZSAndXRmLTgnOlxuICAgIGNhc2UgJ2FzY2lpJzpcbiAgICBjYXNlICdsYXRpbjEnOlxuICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgY2FzZSAnYmFzZTY0JzpcbiAgICBjYXNlICd1Y3MyJzpcbiAgICBjYXNlICd1Y3MtMic6XG4gICAgY2FzZSAndXRmMTZsZSc6XG4gICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgcmV0dXJuIHRydWVcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuQnVmZmVyLmNvbmNhdCA9IGZ1bmN0aW9uIGNvbmNhdCAobGlzdCwgbGVuZ3RoKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShsaXN0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpXG4gIH1cblxuICBpZiAobGlzdC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gQnVmZmVyLmFsbG9jKDApXG4gIH1cblxuICBsZXQgaVxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBsZW5ndGggPSAwXG4gICAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICAgIGxlbmd0aCArPSBsaXN0W2ldLmxlbmd0aFxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShsZW5ndGgpXG4gIGxldCBwb3MgPSAwXG4gIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgbGV0IGJ1ZiA9IGxpc3RbaV1cbiAgICBpZiAoaXNJbnN0YW5jZShidWYsIFVpbnQ4QXJyYXkpKSB7XG4gICAgICBpZiAocG9zICsgYnVmLmxlbmd0aCA+IGJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkgYnVmID0gQnVmZmVyLmZyb20oYnVmKVxuICAgICAgICBidWYuY29weShidWZmZXIsIHBvcylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKFxuICAgICAgICAgIGJ1ZmZlcixcbiAgICAgICAgICBidWYsXG4gICAgICAgICAgcG9zXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgICB9IGVsc2Uge1xuICAgICAgYnVmLmNvcHkoYnVmZmVyLCBwb3MpXG4gICAgfVxuICAgIHBvcyArPSBidWYubGVuZ3RoXG4gIH1cbiAgcmV0dXJuIGJ1ZmZlclxufVxuXG5mdW5jdGlvbiBieXRlTGVuZ3RoIChzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoc3RyaW5nKSkge1xuICAgIHJldHVybiBzdHJpbmcubGVuZ3RoXG4gIH1cbiAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhzdHJpbmcpIHx8IGlzSW5zdGFuY2Uoc3RyaW5nLCBBcnJheUJ1ZmZlcikpIHtcbiAgICByZXR1cm4gc3RyaW5nLmJ5dGVMZW5ndGhcbiAgfVxuICBpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgJ1RoZSBcInN0cmluZ1wiIGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIG9yIEFycmF5QnVmZmVyLiAnICtcbiAgICAgICdSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2Ygc3RyaW5nXG4gICAgKVxuICB9XG5cbiAgY29uc3QgbGVuID0gc3RyaW5nLmxlbmd0aFxuICBjb25zdCBtdXN0TWF0Y2ggPSAoYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdID09PSB0cnVlKVxuICBpZiAoIW11c3RNYXRjaCAmJiBsZW4gPT09IDApIHJldHVybiAwXG5cbiAgLy8gVXNlIGEgZm9yIGxvb3AgdG8gYXZvaWQgcmVjdXJzaW9uXG4gIGxldCBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxlblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIGxlbiAqIDJcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBsZW4gPj4+IDFcbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHtcbiAgICAgICAgICByZXR1cm4gbXVzdE1hdGNoID8gLTEgOiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aCAvLyBhc3N1bWUgdXRmOFxuICAgICAgICB9XG4gICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5CdWZmZXIuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGhcblxuZnVuY3Rpb24gc2xvd1RvU3RyaW5nIChlbmNvZGluZywgc3RhcnQsIGVuZCkge1xuICBsZXQgbG93ZXJlZENhc2UgPSBmYWxzZVxuXG4gIC8vIE5vIG5lZWQgdG8gdmVyaWZ5IHRoYXQgXCJ0aGlzLmxlbmd0aCA8PSBNQVhfVUlOVDMyXCIgc2luY2UgaXQncyBhIHJlYWQtb25seVxuICAvLyBwcm9wZXJ0eSBvZiBhIHR5cGVkIGFycmF5LlxuXG4gIC8vIFRoaXMgYmVoYXZlcyBuZWl0aGVyIGxpa2UgU3RyaW5nIG5vciBVaW50OEFycmF5IGluIHRoYXQgd2Ugc2V0IHN0YXJ0L2VuZFxuICAvLyB0byB0aGVpciB1cHBlci9sb3dlciBib3VuZHMgaWYgdGhlIHZhbHVlIHBhc3NlZCBpcyBvdXQgb2YgcmFuZ2UuXG4gIC8vIHVuZGVmaW5lZCBpcyBoYW5kbGVkIHNwZWNpYWxseSBhcyBwZXIgRUNNQS0yNjIgNnRoIEVkaXRpb24sXG4gIC8vIFNlY3Rpb24gMTMuMy4zLjcgUnVudGltZSBTZW1hbnRpY3M6IEtleWVkQmluZGluZ0luaXRpYWxpemF0aW9uLlxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCB8fCBzdGFydCA8IDApIHtcbiAgICBzdGFydCA9IDBcbiAgfVxuICAvLyBSZXR1cm4gZWFybHkgaWYgc3RhcnQgPiB0aGlzLmxlbmd0aC4gRG9uZSBoZXJlIHRvIHByZXZlbnQgcG90ZW50aWFsIHVpbnQzMlxuICAvLyBjb2VyY2lvbiBmYWlsIGJlbG93LlxuICBpZiAoc3RhcnQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkIHx8IGVuZCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmIChlbmQgPD0gMCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgLy8gRm9yY2UgY29lcmNpb24gdG8gdWludDMyLiBUaGlzIHdpbGwgYWxzbyBjb2VyY2UgZmFsc2V5L05hTiB2YWx1ZXMgdG8gMC5cbiAgZW5kID4+Pj0gMFxuICBzdGFydCA+Pj49IDBcblxuICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgcmV0dXJuIGFzY2lpU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsYXRpbjFTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHV0ZjE2bGVTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoZW5jb2RpbmcgKyAnJykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuLy8gVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIGJ5IGBCdWZmZXIuaXNCdWZmZXJgIChhbmQgdGhlIGBpcy1idWZmZXJgIG5wbSBwYWNrYWdlKVxuLy8gdG8gZGV0ZWN0IGEgQnVmZmVyIGluc3RhbmNlLiBJdCdzIG5vdCBwb3NzaWJsZSB0byB1c2UgYGluc3RhbmNlb2YgQnVmZmVyYFxuLy8gcmVsaWFibHkgaW4gYSBicm93c2VyaWZ5IGNvbnRleHQgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBtdWx0aXBsZSBkaWZmZXJlbnRcbi8vIGNvcGllcyBvZiB0aGUgJ2J1ZmZlcicgcGFja2FnZSBpbiB1c2UuIFRoaXMgbWV0aG9kIHdvcmtzIGV2ZW4gZm9yIEJ1ZmZlclxuLy8gaW5zdGFuY2VzIHRoYXQgd2VyZSBjcmVhdGVkIGZyb20gYW5vdGhlciBjb3B5IG9mIHRoZSBgYnVmZmVyYCBwYWNrYWdlLlxuLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9pc3N1ZXMvMTU0XG5CdWZmZXIucHJvdG90eXBlLl9pc0J1ZmZlciA9IHRydWVcblxuZnVuY3Rpb24gc3dhcCAoYiwgbiwgbSkge1xuICBjb25zdCBpID0gYltuXVxuICBiW25dID0gYlttXVxuICBiW21dID0gaVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXAxNiA9IGZ1bmN0aW9uIHN3YXAxNiAoKSB7XG4gIGNvbnN0IGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSAyICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi1iaXRzJylcbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSArPSAyKSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgMSlcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXAzMiA9IGZ1bmN0aW9uIHN3YXAzMiAoKSB7XG4gIGNvbnN0IGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSA0ICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzJylcbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSArPSA0KSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgMylcbiAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgMilcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXA2NCA9IGZ1bmN0aW9uIHN3YXA2NCAoKSB7XG4gIGNvbnN0IGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSA4ICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzJylcbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSArPSA4KSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgNylcbiAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgNilcbiAgICBzd2FwKHRoaXMsIGkgKyAyLCBpICsgNSlcbiAgICBzd2FwKHRoaXMsIGkgKyAzLCBpICsgNClcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICBjb25zdCBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuZ3RoID09PSAwKSByZXR1cm4gJydcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHJldHVybiB1dGY4U2xpY2UodGhpcywgMCwgbGVuZ3RoKVxuICByZXR1cm4gc2xvd1RvU3RyaW5nLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b0xvY2FsZVN0cmluZyA9IEJ1ZmZlci5wcm90b3R5cGUudG9TdHJpbmdcblxuQnVmZmVyLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMgKGIpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICBpZiAodGhpcyA9PT0gYikgcmV0dXJuIHRydWVcbiAgcmV0dXJuIEJ1ZmZlci5jb21wYXJlKHRoaXMsIGIpID09PSAwXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uIGluc3BlY3QgKCkge1xuICBsZXQgc3RyID0gJydcbiAgY29uc3QgbWF4ID0gZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFU1xuICBzdHIgPSB0aGlzLnRvU3RyaW5nKCdoZXgnLCAwLCBtYXgpLnJlcGxhY2UoLyguezJ9KS9nLCAnJDEgJykudHJpbSgpXG4gIGlmICh0aGlzLmxlbmd0aCA+IG1heCkgc3RyICs9ICcgLi4uICdcbiAgcmV0dXJuICc8QnVmZmVyICcgKyBzdHIgKyAnPidcbn1cbmlmIChjdXN0b21JbnNwZWN0U3ltYm9sKSB7XG4gIEJ1ZmZlci5wcm90b3R5cGVbY3VzdG9tSW5zcGVjdFN5bWJvbF0gPSBCdWZmZXIucHJvdG90eXBlLmluc3BlY3Rcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAodGFyZ2V0LCBzdGFydCwgZW5kLCB0aGlzU3RhcnQsIHRoaXNFbmQpIHtcbiAgaWYgKGlzSW5zdGFuY2UodGFyZ2V0LCBVaW50OEFycmF5KSkge1xuICAgIHRhcmdldCA9IEJ1ZmZlci5mcm9tKHRhcmdldCwgdGFyZ2V0Lm9mZnNldCwgdGFyZ2V0LmJ5dGVMZW5ndGgpXG4gIH1cbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGFyZ2V0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAnVGhlIFwidGFyZ2V0XCIgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBCdWZmZXIgb3IgVWludDhBcnJheS4gJyArXG4gICAgICAnUmVjZWl2ZWQgdHlwZSAnICsgKHR5cGVvZiB0YXJnZXQpXG4gICAgKVxuICB9XG5cbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICBzdGFydCA9IDBcbiAgfVxuICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmQgPSB0YXJnZXQgPyB0YXJnZXQubGVuZ3RoIDogMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRoaXNTdGFydCA9IDBcbiAgfVxuICBpZiAodGhpc0VuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc0VuZCA9IHRoaXMubGVuZ3RoXG4gIH1cblxuICBpZiAoc3RhcnQgPCAwIHx8IGVuZCA+IHRhcmdldC5sZW5ndGggfHwgdGhpc1N0YXJ0IDwgMCB8fCB0aGlzRW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCAmJiBzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCkge1xuICAgIHJldHVybiAtMVxuICB9XG4gIGlmIChzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMVxuICB9XG5cbiAgc3RhcnQgPj4+PSAwXG4gIGVuZCA+Pj49IDBcbiAgdGhpc1N0YXJ0ID4+Pj0gMFxuICB0aGlzRW5kID4+Pj0gMFxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQpIHJldHVybiAwXG5cbiAgbGV0IHggPSB0aGlzRW5kIC0gdGhpc1N0YXJ0XG4gIGxldCB5ID0gZW5kIC0gc3RhcnRcbiAgY29uc3QgbGVuID0gTWF0aC5taW4oeCwgeSlcblxuICBjb25zdCB0aGlzQ29weSA9IHRoaXMuc2xpY2UodGhpc1N0YXJ0LCB0aGlzRW5kKVxuICBjb25zdCB0YXJnZXRDb3B5ID0gdGFyZ2V0LnNsaWNlKHN0YXJ0LCBlbmQpXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgIGlmICh0aGlzQ29weVtpXSAhPT0gdGFyZ2V0Q29weVtpXSkge1xuICAgICAgeCA9IHRoaXNDb3B5W2ldXG4gICAgICB5ID0gdGFyZ2V0Q29weVtpXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbi8vIEZpbmRzIGVpdGhlciB0aGUgZmlyc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0ID49IGBieXRlT2Zmc2V0YCxcbi8vIE9SIHRoZSBsYXN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA8PSBgYnl0ZU9mZnNldGAuXG4vL1xuLy8gQXJndW1lbnRzOlxuLy8gLSBidWZmZXIgLSBhIEJ1ZmZlciB0byBzZWFyY2hcbi8vIC0gdmFsIC0gYSBzdHJpbmcsIEJ1ZmZlciwgb3IgbnVtYmVyXG4vLyAtIGJ5dGVPZmZzZXQgLSBhbiBpbmRleCBpbnRvIGBidWZmZXJgOyB3aWxsIGJlIGNsYW1wZWQgdG8gYW4gaW50MzJcbi8vIC0gZW5jb2RpbmcgLSBhbiBvcHRpb25hbCBlbmNvZGluZywgcmVsZXZhbnQgaXMgdmFsIGlzIGEgc3RyaW5nXG4vLyAtIGRpciAtIHRydWUgZm9yIGluZGV4T2YsIGZhbHNlIGZvciBsYXN0SW5kZXhPZlxuZnVuY3Rpb24gYmlkaXJlY3Rpb25hbEluZGV4T2YgKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIC8vIEVtcHR5IGJ1ZmZlciBtZWFucyBubyBtYXRjaFxuICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCkgcmV0dXJuIC0xXG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXRcbiAgaWYgKHR5cGVvZiBieXRlT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gYnl0ZU9mZnNldFxuICAgIGJ5dGVPZmZzZXQgPSAwXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA+IDB4N2ZmZmZmZmYpIHtcbiAgICBieXRlT2Zmc2V0ID0gMHg3ZmZmZmZmZlxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAtMHg4MDAwMDAwMCkge1xuICAgIGJ5dGVPZmZzZXQgPSAtMHg4MDAwMDAwMFxuICB9XG4gIGJ5dGVPZmZzZXQgPSArYnl0ZU9mZnNldCAvLyBDb2VyY2UgdG8gTnVtYmVyLlxuICBpZiAobnVtYmVySXNOYU4oYnl0ZU9mZnNldCkpIHtcbiAgICAvLyBieXRlT2Zmc2V0OiBpdCBpdCdzIHVuZGVmaW5lZCwgbnVsbCwgTmFOLCBcImZvb1wiLCBldGMsIHNlYXJjaCB3aG9sZSBidWZmZXJcbiAgICBieXRlT2Zmc2V0ID0gZGlyID8gMCA6IChidWZmZXIubGVuZ3RoIC0gMSlcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSBieXRlT2Zmc2V0OiBuZWdhdGl2ZSBvZmZzZXRzIHN0YXJ0IGZyb20gdGhlIGVuZCBvZiB0aGUgYnVmZmVyXG4gIGlmIChieXRlT2Zmc2V0IDwgMCkgYnl0ZU9mZnNldCA9IGJ1ZmZlci5sZW5ndGggKyBieXRlT2Zmc2V0XG4gIGlmIChieXRlT2Zmc2V0ID49IGJ1ZmZlci5sZW5ndGgpIHtcbiAgICBpZiAoZGlyKSByZXR1cm4gLTFcbiAgICBlbHNlIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoIC0gMVxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAwKSB7XG4gICAgaWYgKGRpcikgYnl0ZU9mZnNldCA9IDBcbiAgICBlbHNlIHJldHVybiAtMVxuICB9XG5cbiAgLy8gTm9ybWFsaXplIHZhbFxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICB2YWwgPSBCdWZmZXIuZnJvbSh2YWwsIGVuY29kaW5nKVxuICB9XG5cbiAgLy8gRmluYWxseSwgc2VhcmNoIGVpdGhlciBpbmRleE9mIChpZiBkaXIgaXMgdHJ1ZSkgb3IgbGFzdEluZGV4T2ZcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcih2YWwpKSB7XG4gICAgLy8gU3BlY2lhbCBjYXNlOiBsb29raW5nIGZvciBlbXB0eSBzdHJpbmcvYnVmZmVyIGFsd2F5cyBmYWlsc1xuICAgIGlmICh2YWwubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gLTFcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcilcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIHZhbCA9IHZhbCAmIDB4RkYgLy8gU2VhcmNoIGZvciBhIGJ5dGUgdmFsdWUgWzAtMjU1XVxuICAgIGlmICh0eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKGRpcikge1xuICAgICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCBbdmFsXSwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcilcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlcicpXG59XG5cbmZ1bmN0aW9uIGFycmF5SW5kZXhPZiAoYXJyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgbGV0IGluZGV4U2l6ZSA9IDFcbiAgbGV0IGFyckxlbmd0aCA9IGFyci5sZW5ndGhcbiAgbGV0IHZhbExlbmd0aCA9IHZhbC5sZW5ndGhcblxuICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgaWYgKGVuY29kaW5nID09PSAndWNzMicgfHwgZW5jb2RpbmcgPT09ICd1Y3MtMicgfHxcbiAgICAgICAgZW5jb2RpbmcgPT09ICd1dGYxNmxlJyB8fCBlbmNvZGluZyA9PT0gJ3V0Zi0xNmxlJykge1xuICAgICAgaWYgKGFyci5sZW5ndGggPCAyIHx8IHZhbC5sZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiAtMVxuICAgICAgfVxuICAgICAgaW5kZXhTaXplID0gMlxuICAgICAgYXJyTGVuZ3RoIC89IDJcbiAgICAgIHZhbExlbmd0aCAvPSAyXG4gICAgICBieXRlT2Zmc2V0IC89IDJcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZWFkIChidWYsIGkpIHtcbiAgICBpZiAoaW5kZXhTaXplID09PSAxKSB7XG4gICAgICByZXR1cm4gYnVmW2ldXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBidWYucmVhZFVJbnQxNkJFKGkgKiBpbmRleFNpemUpXG4gICAgfVxuICB9XG5cbiAgbGV0IGlcbiAgaWYgKGRpcikge1xuICAgIGxldCBmb3VuZEluZGV4ID0gLTFcbiAgICBmb3IgKGkgPSBieXRlT2Zmc2V0OyBpIDwgYXJyTGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChyZWFkKGFyciwgaSkgPT09IHJlYWQodmFsLCBmb3VuZEluZGV4ID09PSAtMSA/IDAgOiBpIC0gZm91bmRJbmRleCkpIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggPT09IC0xKSBmb3VuZEluZGV4ID0gaVxuICAgICAgICBpZiAoaSAtIGZvdW5kSW5kZXggKyAxID09PSB2YWxMZW5ndGgpIHJldHVybiBmb3VuZEluZGV4ICogaW5kZXhTaXplXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZm91bmRJbmRleCAhPT0gLTEpIGkgLT0gaSAtIGZvdW5kSW5kZXhcbiAgICAgICAgZm91bmRJbmRleCA9IC0xXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChieXRlT2Zmc2V0ICsgdmFsTGVuZ3RoID4gYXJyTGVuZ3RoKSBieXRlT2Zmc2V0ID0gYXJyTGVuZ3RoIC0gdmFsTGVuZ3RoXG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGxldCBmb3VuZCA9IHRydWVcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdmFsTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKHJlYWQoYXJyLCBpICsgaikgIT09IHJlYWQodmFsLCBqKSkge1xuICAgICAgICAgIGZvdW5kID0gZmFsc2VcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZm91bmQpIHJldHVybiBpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5jbHVkZXMgPSBmdW5jdGlvbiBpbmNsdWRlcyAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gdGhpcy5pbmRleE9mKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpICE9PSAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCB0cnVlKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmxhc3RJbmRleE9mID0gZnVuY3Rpb24gbGFzdEluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGZhbHNlKVxufVxuXG5mdW5jdGlvbiBoZXhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIG9mZnNldCA9IE51bWJlcihvZmZzZXQpIHx8IDBcbiAgY29uc3QgcmVtYWluaW5nID0gYnVmLmxlbmd0aCAtIG9mZnNldFxuICBpZiAoIWxlbmd0aCkge1xuICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICB9IGVsc2Uge1xuICAgIGxlbmd0aCA9IE51bWJlcihsZW5ndGgpXG4gICAgaWYgKGxlbmd0aCA+IHJlbWFpbmluZykge1xuICAgICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc3RyTGVuID0gc3RyaW5nLmxlbmd0aFxuXG4gIGlmIChsZW5ndGggPiBzdHJMZW4gLyAyKSB7XG4gICAgbGVuZ3RoID0gc3RyTGVuIC8gMlxuICB9XG4gIGxldCBpXG4gIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlSW50KHN0cmluZy5zdWJzdHIoaSAqIDIsIDIpLCAxNilcbiAgICBpZiAobnVtYmVySXNOYU4ocGFyc2VkKSkgcmV0dXJuIGlcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSBwYXJzZWRcbiAgfVxuICByZXR1cm4gaVxufVxuXG5mdW5jdGlvbiB1dGY4V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcih1dGY4VG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBhc2NpaVdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIoYXNjaWlUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGJhc2U2NFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIoYmFzZTY0VG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiB1Y3MyV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcih1dGYxNmxlVG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gd3JpdGUgKHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGVuY29kaW5nKSB7XG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcpXG4gIGlmIChvZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBvZmZzZXRcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgb2Zmc2V0WywgbGVuZ3RoXVssIGVuY29kaW5nXSlcbiAgfSBlbHNlIGlmIChpc0Zpbml0ZShvZmZzZXQpKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gICAgaWYgKGlzRmluaXRlKGxlbmd0aCkpIHtcbiAgICAgIGxlbmd0aCA9IGxlbmd0aCA+Pj4gMFxuICAgICAgaWYgKGVuY29kaW5nID09PSB1bmRlZmluZWQpIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgfSBlbHNlIHtcbiAgICAgIGVuY29kaW5nID0gbGVuZ3RoXG4gICAgICBsZW5ndGggPSB1bmRlZmluZWRcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0J1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkJ1xuICAgIClcbiAgfVxuXG4gIGNvbnN0IHJlbWFpbmluZyA9IHRoaXMubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCB8fCBsZW5ndGggPiByZW1haW5pbmcpIGxlbmd0aCA9IHJlbWFpbmluZ1xuXG4gIGlmICgoc3RyaW5nLmxlbmd0aCA+IDAgJiYgKGxlbmd0aCA8IDAgfHwgb2Zmc2V0IDwgMCkpIHx8IG9mZnNldCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzJylcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgbGV0IGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBoZXhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGFzY2lpV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgLy8gV2FybmluZzogbWF4TGVuZ3RoIG5vdCB0YWtlbiBpbnRvIGFjY291bnQgaW4gYmFzZTY0V3JpdGVcbiAgICAgICAgcmV0dXJuIGJhc2U2NFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1Y3MyV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OICgpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnQnVmZmVyJyxcbiAgICBkYXRhOiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnIgfHwgdGhpcywgMClcbiAgfVxufVxuXG5mdW5jdGlvbiBiYXNlNjRTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGlmIChzdGFydCA9PT0gMCAmJiBlbmQgPT09IGJ1Zi5sZW5ndGgpIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYuc2xpY2Uoc3RhcnQsIGVuZCkpXG4gIH1cbn1cblxuZnVuY3Rpb24gdXRmOFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuICBjb25zdCByZXMgPSBbXVxuXG4gIGxldCBpID0gc3RhcnRcbiAgd2hpbGUgKGkgPCBlbmQpIHtcbiAgICBjb25zdCBmaXJzdEJ5dGUgPSBidWZbaV1cbiAgICBsZXQgY29kZVBvaW50ID0gbnVsbFxuICAgIGxldCBieXRlc1BlclNlcXVlbmNlID0gKGZpcnN0Qnl0ZSA+IDB4RUYpXG4gICAgICA/IDRcbiAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4REYpXG4gICAgICAgICAgPyAzXG4gICAgICAgICAgOiAoZmlyc3RCeXRlID4gMHhCRilcbiAgICAgICAgICAgICAgPyAyXG4gICAgICAgICAgICAgIDogMVxuXG4gICAgaWYgKGkgKyBieXRlc1BlclNlcXVlbmNlIDw9IGVuZCkge1xuICAgICAgbGV0IHNlY29uZEJ5dGUsIHRoaXJkQnl0ZSwgZm91cnRoQnl0ZSwgdGVtcENvZGVQb2ludFxuXG4gICAgICBzd2l0Y2ggKGJ5dGVzUGVyU2VxdWVuY2UpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGlmIChmaXJzdEJ5dGUgPCAweDgwKSB7XG4gICAgICAgICAgICBjb2RlUG9pbnQgPSBmaXJzdEJ5dGVcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHgxRikgPDwgMHg2IHwgKHNlY29uZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4QyB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHg2IHwgKHRoaXJkQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0ZGICYmICh0ZW1wQ29kZVBvaW50IDwgMHhEODAwIHx8IHRlbXBDb2RlUG9pbnQgPiAweERGRkYpKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXVxuICAgICAgICAgIGZvdXJ0aEJ5dGUgPSBidWZbaSArIDNdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwICYmIChmb3VydGhCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweDEyIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweEMgfCAodGhpcmRCeXRlICYgMHgzRikgPDwgMHg2IHwgKGZvdXJ0aEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweEZGRkYgJiYgdGVtcENvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvZGVQb2ludCA9PT0gbnVsbCkge1xuICAgICAgLy8gd2UgZGlkIG5vdCBnZW5lcmF0ZSBhIHZhbGlkIGNvZGVQb2ludCBzbyBpbnNlcnQgYVxuICAgICAgLy8gcmVwbGFjZW1lbnQgY2hhciAoVStGRkZEKSBhbmQgYWR2YW5jZSBvbmx5IDEgYnl0ZVxuICAgICAgY29kZVBvaW50ID0gMHhGRkZEXG4gICAgICBieXRlc1BlclNlcXVlbmNlID0gMVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50ID4gMHhGRkZGKSB7XG4gICAgICAvLyBlbmNvZGUgdG8gdXRmMTYgKHN1cnJvZ2F0ZSBwYWlyIGRhbmNlKVxuICAgICAgY29kZVBvaW50IC09IDB4MTAwMDBcbiAgICAgIHJlcy5wdXNoKGNvZGVQb2ludCA+Pj4gMTAgJiAweDNGRiB8IDB4RDgwMClcbiAgICAgIGNvZGVQb2ludCA9IDB4REMwMCB8IGNvZGVQb2ludCAmIDB4M0ZGXG4gICAgfVxuXG4gICAgcmVzLnB1c2goY29kZVBvaW50KVxuICAgIGkgKz0gYnl0ZXNQZXJTZXF1ZW5jZVxuICB9XG5cbiAgcmV0dXJuIGRlY29kZUNvZGVQb2ludHNBcnJheShyZXMpXG59XG5cbi8vIEJhc2VkIG9uIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzIyNzQ3MjcyLzY4MDc0MiwgdGhlIGJyb3dzZXIgd2l0aFxuLy8gdGhlIGxvd2VzdCBsaW1pdCBpcyBDaHJvbWUsIHdpdGggMHgxMDAwMCBhcmdzLlxuLy8gV2UgZ28gMSBtYWduaXR1ZGUgbGVzcywgZm9yIHNhZmV0eVxuY29uc3QgTUFYX0FSR1VNRU5UU19MRU5HVEggPSAweDEwMDBcblxuZnVuY3Rpb24gZGVjb2RlQ29kZVBvaW50c0FycmF5IChjb2RlUG9pbnRzKSB7XG4gIGNvbnN0IGxlbiA9IGNvZGVQb2ludHMubGVuZ3RoXG4gIGlmIChsZW4gPD0gTUFYX0FSR1VNRU5UU19MRU5HVEgpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGNvZGVQb2ludHMpIC8vIGF2b2lkIGV4dHJhIHNsaWNlKClcbiAgfVxuXG4gIC8vIERlY29kZSBpbiBjaHVua3MgdG8gYXZvaWQgXCJjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIi5cbiAgbGV0IHJlcyA9ICcnXG4gIGxldCBpID0gMFxuICB3aGlsZSAoaSA8IGxlbikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFxuICAgICAgU3RyaW5nLFxuICAgICAgY29kZVBvaW50cy5zbGljZShpLCBpICs9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKVxuICAgIClcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBsZXQgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldICYgMHg3RilcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGxhdGluMVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgbGV0IHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGhleFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgY29uc3QgbGVuID0gYnVmLmxlbmd0aFxuXG4gIGlmICghc3RhcnQgfHwgc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgaWYgKCFlbmQgfHwgZW5kIDwgMCB8fCBlbmQgPiBsZW4pIGVuZCA9IGxlblxuXG4gIGxldCBvdXQgPSAnJ1xuICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIG91dCArPSBoZXhTbGljZUxvb2t1cFRhYmxlW2J1ZltpXV1cbiAgfVxuICByZXR1cm4gb3V0XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGNvbnN0IGJ5dGVzID0gYnVmLnNsaWNlKHN0YXJ0LCBlbmQpXG4gIGxldCByZXMgPSAnJ1xuICAvLyBJZiBieXRlcy5sZW5ndGggaXMgb2RkLCB0aGUgbGFzdCA4IGJpdHMgbXVzdCBiZSBpZ25vcmVkIChzYW1lIGFzIG5vZGUuanMpXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoIC0gMTsgaSArPSAyKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0gKyAoYnl0ZXNbaSArIDFdICogMjU2KSlcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbiBzbGljZSAoc3RhcnQsIGVuZCkge1xuICBjb25zdCBsZW4gPSB0aGlzLmxlbmd0aFxuICBzdGFydCA9IH5+c3RhcnRcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW4gOiB+fmVuZFxuXG4gIGlmIChzdGFydCA8IDApIHtcbiAgICBzdGFydCArPSBsZW5cbiAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgfSBlbHNlIGlmIChzdGFydCA+IGxlbikge1xuICAgIHN0YXJ0ID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgMCkge1xuICAgIGVuZCArPSBsZW5cbiAgICBpZiAoZW5kIDwgMCkgZW5kID0gMFxuICB9IGVsc2UgaWYgKGVuZCA+IGxlbikge1xuICAgIGVuZCA9IGxlblxuICB9XG5cbiAgaWYgKGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIGNvbnN0IG5ld0J1ZiA9IHRoaXMuc3ViYXJyYXkoc3RhcnQsIGVuZClcbiAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2VcbiAgT2JqZWN0LnNldFByb3RvdHlwZU9mKG5ld0J1ZiwgQnVmZmVyLnByb3RvdHlwZSlcblxuICByZXR1cm4gbmV3QnVmXG59XG5cbi8qXG4gKiBOZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGJ1ZmZlciBpc24ndCB0cnlpbmcgdG8gd3JpdGUgb3V0IG9mIGJvdW5kcy5cbiAqL1xuZnVuY3Rpb24gY2hlY2tPZmZzZXQgKG9mZnNldCwgZXh0LCBsZW5ndGgpIHtcbiAgaWYgKChvZmZzZXQgJSAxKSAhPT0gMCB8fCBvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb2Zmc2V0IGlzIG5vdCB1aW50JylcbiAgaWYgKG9mZnNldCArIGV4dCA+IGxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RyeWluZyB0byBhY2Nlc3MgYmV5b25kIGJ1ZmZlciBsZW5ndGgnKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVaW50TEUgPVxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludExFID0gZnVuY3Rpb24gcmVhZFVJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICBsZXQgdmFsID0gdGhpc1tvZmZzZXRdXG4gIGxldCBtdWwgPSAxXG4gIGxldCBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVpbnRCRSA9XG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50QkUgPSBmdW5jdGlvbiByZWFkVUludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcbiAgfVxuXG4gIGxldCB2YWwgPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF1cbiAgbGV0IG11bCA9IDFcbiAgd2hpbGUgKGJ5dGVMZW5ndGggPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVaW50OCA9XG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50OCA9IGZ1bmN0aW9uIHJlYWRVSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVaW50MTZMRSA9XG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVpbnQxNkJFID1cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkJFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCA4KSB8IHRoaXNbb2Zmc2V0ICsgMV1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVWludDMyTEUgPVxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyTEUgPSBmdW5jdGlvbiByZWFkVUludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICgodGhpc1tvZmZzZXRdKSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikpICtcbiAgICAgICh0aGlzW29mZnNldCArIDNdICogMHgxMDAwMDAwKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVaW50MzJCRSA9XG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSAqIDB4MTAwMDAwMCkgK1xuICAgICgodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICB0aGlzW29mZnNldCArIDNdKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRCaWdVSW50NjRMRSA9IGRlZmluZUJpZ0ludE1ldGhvZChmdW5jdGlvbiByZWFkQmlnVUludDY0TEUgKG9mZnNldCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgdmFsaWRhdGVOdW1iZXIob2Zmc2V0LCAnb2Zmc2V0JylcbiAgY29uc3QgZmlyc3QgPSB0aGlzW29mZnNldF1cbiAgY29uc3QgbGFzdCA9IHRoaXNbb2Zmc2V0ICsgN11cbiAgaWYgKGZpcnN0ID09PSB1bmRlZmluZWQgfHwgbGFzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYm91bmRzRXJyb3Iob2Zmc2V0LCB0aGlzLmxlbmd0aCAtIDgpXG4gIH1cblxuICBjb25zdCBsbyA9IGZpcnN0ICtcbiAgICB0aGlzWysrb2Zmc2V0XSAqIDIgKiogOCArXG4gICAgdGhpc1srK29mZnNldF0gKiAyICoqIDE2ICtcbiAgICB0aGlzWysrb2Zmc2V0XSAqIDIgKiogMjRcblxuICBjb25zdCBoaSA9IHRoaXNbKytvZmZzZXRdICtcbiAgICB0aGlzWysrb2Zmc2V0XSAqIDIgKiogOCArXG4gICAgdGhpc1srK29mZnNldF0gKiAyICoqIDE2ICtcbiAgICBsYXN0ICogMiAqKiAyNFxuXG4gIHJldHVybiBCaWdJbnQobG8pICsgKEJpZ0ludChoaSkgPDwgQmlnSW50KDMyKSlcbn0pXG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEJpZ1VJbnQ2NEJFID0gZGVmaW5lQmlnSW50TWV0aG9kKGZ1bmN0aW9uIHJlYWRCaWdVSW50NjRCRSAob2Zmc2V0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICB2YWxpZGF0ZU51bWJlcihvZmZzZXQsICdvZmZzZXQnKVxuICBjb25zdCBmaXJzdCA9IHRoaXNbb2Zmc2V0XVxuICBjb25zdCBsYXN0ID0gdGhpc1tvZmZzZXQgKyA3XVxuICBpZiAoZmlyc3QgPT09IHVuZGVmaW5lZCB8fCBsYXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICBib3VuZHNFcnJvcihvZmZzZXQsIHRoaXMubGVuZ3RoIC0gOClcbiAgfVxuXG4gIGNvbnN0IGhpID0gZmlyc3QgKiAyICoqIDI0ICtcbiAgICB0aGlzWysrb2Zmc2V0XSAqIDIgKiogMTYgK1xuICAgIHRoaXNbKytvZmZzZXRdICogMiAqKiA4ICtcbiAgICB0aGlzWysrb2Zmc2V0XVxuXG4gIGNvbnN0IGxvID0gdGhpc1srK29mZnNldF0gKiAyICoqIDI0ICtcbiAgICB0aGlzWysrb2Zmc2V0XSAqIDIgKiogMTYgK1xuICAgIHRoaXNbKytvZmZzZXRdICogMiAqKiA4ICtcbiAgICBsYXN0XG5cbiAgcmV0dXJuIChCaWdJbnQoaGkpIDw8IEJpZ0ludCgzMikpICsgQmlnSW50KGxvKVxufSlcblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50TEUgPSBmdW5jdGlvbiByZWFkSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgbGV0IHZhbCA9IHRoaXNbb2Zmc2V0XVxuICBsZXQgbXVsID0gMVxuICBsZXQgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludEJFID0gZnVuY3Rpb24gcmVhZEludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIGxldCBpID0gYnl0ZUxlbmd0aFxuICBsZXQgbXVsID0gMVxuICBsZXQgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWldXG4gIHdoaWxlIChpID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0taV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQ4ID0gZnVuY3Rpb24gcmVhZEludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpXG4gIGlmICghKHRoaXNbb2Zmc2V0XSAmIDB4ODApKSByZXR1cm4gKHRoaXNbb2Zmc2V0XSlcbiAgcmV0dXJuICgoMHhmZiAtIHRoaXNbb2Zmc2V0XSArIDEpICogLTEpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2TEUgPSBmdW5jdGlvbiByZWFkSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgY29uc3QgdmFsID0gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkJFID0gZnVuY3Rpb24gcmVhZEludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIGNvbnN0IHZhbCA9IHRoaXNbb2Zmc2V0ICsgMV0gfCAodGhpc1tvZmZzZXRdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdKSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10gPDwgMjQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyQkUgPSBmdW5jdGlvbiByZWFkSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCAyNCkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDNdKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRCaWdJbnQ2NExFID0gZGVmaW5lQmlnSW50TWV0aG9kKGZ1bmN0aW9uIHJlYWRCaWdJbnQ2NExFIChvZmZzZXQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIHZhbGlkYXRlTnVtYmVyKG9mZnNldCwgJ29mZnNldCcpXG4gIGNvbnN0IGZpcnN0ID0gdGhpc1tvZmZzZXRdXG4gIGNvbnN0IGxhc3QgPSB0aGlzW29mZnNldCArIDddXG4gIGlmIChmaXJzdCA9PT0gdW5kZWZpbmVkIHx8IGxhc3QgPT09IHVuZGVmaW5lZCkge1xuICAgIGJvdW5kc0Vycm9yKG9mZnNldCwgdGhpcy5sZW5ndGggLSA4KVxuICB9XG5cbiAgY29uc3QgdmFsID0gdGhpc1tvZmZzZXQgKyA0XSArXG4gICAgdGhpc1tvZmZzZXQgKyA1XSAqIDIgKiogOCArXG4gICAgdGhpc1tvZmZzZXQgKyA2XSAqIDIgKiogMTYgK1xuICAgIChsYXN0IDw8IDI0KSAvLyBPdmVyZmxvd1xuXG4gIHJldHVybiAoQmlnSW50KHZhbCkgPDwgQmlnSW50KDMyKSkgK1xuICAgIEJpZ0ludChmaXJzdCArXG4gICAgdGhpc1srK29mZnNldF0gKiAyICoqIDggK1xuICAgIHRoaXNbKytvZmZzZXRdICogMiAqKiAxNiArXG4gICAgdGhpc1srK29mZnNldF0gKiAyICoqIDI0KVxufSlcblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkQmlnSW50NjRCRSA9IGRlZmluZUJpZ0ludE1ldGhvZChmdW5jdGlvbiByZWFkQmlnSW50NjRCRSAob2Zmc2V0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICB2YWxpZGF0ZU51bWJlcihvZmZzZXQsICdvZmZzZXQnKVxuICBjb25zdCBmaXJzdCA9IHRoaXNbb2Zmc2V0XVxuICBjb25zdCBsYXN0ID0gdGhpc1tvZmZzZXQgKyA3XVxuICBpZiAoZmlyc3QgPT09IHVuZGVmaW5lZCB8fCBsYXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICBib3VuZHNFcnJvcihvZmZzZXQsIHRoaXMubGVuZ3RoIC0gOClcbiAgfVxuXG4gIGNvbnN0IHZhbCA9IChmaXJzdCA8PCAyNCkgKyAvLyBPdmVyZmxvd1xuICAgIHRoaXNbKytvZmZzZXRdICogMiAqKiAxNiArXG4gICAgdGhpc1srK29mZnNldF0gKiAyICoqIDggK1xuICAgIHRoaXNbKytvZmZzZXRdXG5cbiAgcmV0dXJuIChCaWdJbnQodmFsKSA8PCBCaWdJbnQoMzIpKSArXG4gICAgQmlnSW50KHRoaXNbKytvZmZzZXRdICogMiAqKiAyNCArXG4gICAgdGhpc1srK29mZnNldF0gKiAyICoqIDE2ICtcbiAgICB0aGlzWysrb2Zmc2V0XSAqIDIgKiogOCArXG4gICAgbGFzdClcbn0pXG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0TEUgPSBmdW5jdGlvbiByZWFkRmxvYXRMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdEJFID0gZnVuY3Rpb24gcmVhZEZsb2F0QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUxFID0gZnVuY3Rpb24gcmVhZERvdWJsZUxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgNTIsIDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUJFID0gZnVuY3Rpb24gcmVhZERvdWJsZUJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDUyLCA4KVxufVxuXG5mdW5jdGlvbiBjaGVja0ludCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiYnVmZmVyXCIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpXG4gIGlmICh2YWx1ZSA+IG1heCB8fCB2YWx1ZSA8IG1pbikgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1widmFsdWVcIiBhcmd1bWVudCBpcyBvdXQgb2YgYm91bmRzJylcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVWludExFID1cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjb25zdCBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMClcbiAgfVxuXG4gIGxldCBtdWwgPSAxXG4gIGxldCBpID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVaW50QkUgPVxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlVUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNvbnN0IG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpIC0gMVxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG1heEJ5dGVzLCAwKVxuICB9XG5cbiAgbGV0IGkgPSBieXRlTGVuZ3RoIC0gMVxuICBsZXQgbXVsID0gMVxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVpbnQ4ID1cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50OCA9IGZ1bmN0aW9uIHdyaXRlVUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweGZmLCAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVWludDE2TEUgPVxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVpbnQxNkJFID1cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVaW50MzJMRSA9XG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMClcbiAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpXG4gIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVWludDMyQkUgPVxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuZnVuY3Rpb24gd3J0QmlnVUludDY0TEUgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbWluLCBtYXgpIHtcbiAgY2hlY2tJbnRCSSh2YWx1ZSwgbWluLCBtYXgsIGJ1Ziwgb2Zmc2V0LCA3KVxuXG4gIGxldCBsbyA9IE51bWJlcih2YWx1ZSAmIEJpZ0ludCgweGZmZmZmZmZmKSlcbiAgYnVmW29mZnNldCsrXSA9IGxvXG4gIGxvID0gbG8gPj4gOFxuICBidWZbb2Zmc2V0KytdID0gbG9cbiAgbG8gPSBsbyA+PiA4XG4gIGJ1ZltvZmZzZXQrK10gPSBsb1xuICBsbyA9IGxvID4+IDhcbiAgYnVmW29mZnNldCsrXSA9IGxvXG4gIGxldCBoaSA9IE51bWJlcih2YWx1ZSA+PiBCaWdJbnQoMzIpICYgQmlnSW50KDB4ZmZmZmZmZmYpKVxuICBidWZbb2Zmc2V0KytdID0gaGlcbiAgaGkgPSBoaSA+PiA4XG4gIGJ1ZltvZmZzZXQrK10gPSBoaVxuICBoaSA9IGhpID4+IDhcbiAgYnVmW29mZnNldCsrXSA9IGhpXG4gIGhpID0gaGkgPj4gOFxuICBidWZbb2Zmc2V0KytdID0gaGlcbiAgcmV0dXJuIG9mZnNldFxufVxuXG5mdW5jdGlvbiB3cnRCaWdVSW50NjRCRSAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBtaW4sIG1heCkge1xuICBjaGVja0ludEJJKHZhbHVlLCBtaW4sIG1heCwgYnVmLCBvZmZzZXQsIDcpXG5cbiAgbGV0IGxvID0gTnVtYmVyKHZhbHVlICYgQmlnSW50KDB4ZmZmZmZmZmYpKVxuICBidWZbb2Zmc2V0ICsgN10gPSBsb1xuICBsbyA9IGxvID4+IDhcbiAgYnVmW29mZnNldCArIDZdID0gbG9cbiAgbG8gPSBsbyA+PiA4XG4gIGJ1ZltvZmZzZXQgKyA1XSA9IGxvXG4gIGxvID0gbG8gPj4gOFxuICBidWZbb2Zmc2V0ICsgNF0gPSBsb1xuICBsZXQgaGkgPSBOdW1iZXIodmFsdWUgPj4gQmlnSW50KDMyKSAmIEJpZ0ludCgweGZmZmZmZmZmKSlcbiAgYnVmW29mZnNldCArIDNdID0gaGlcbiAgaGkgPSBoaSA+PiA4XG4gIGJ1ZltvZmZzZXQgKyAyXSA9IGhpXG4gIGhpID0gaGkgPj4gOFxuICBidWZbb2Zmc2V0ICsgMV0gPSBoaVxuICBoaSA9IGhpID4+IDhcbiAgYnVmW29mZnNldF0gPSBoaVxuICByZXR1cm4gb2Zmc2V0ICsgOFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlQmlnVUludDY0TEUgPSBkZWZpbmVCaWdJbnRNZXRob2QoZnVuY3Rpb24gd3JpdGVCaWdVSW50NjRMRSAodmFsdWUsIG9mZnNldCA9IDApIHtcbiAgcmV0dXJuIHdydEJpZ1VJbnQ2NExFKHRoaXMsIHZhbHVlLCBvZmZzZXQsIEJpZ0ludCgwKSwgQmlnSW50KCcweGZmZmZmZmZmZmZmZmZmZmYnKSlcbn0pXG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVCaWdVSW50NjRCRSA9IGRlZmluZUJpZ0ludE1ldGhvZChmdW5jdGlvbiB3cml0ZUJpZ1VJbnQ2NEJFICh2YWx1ZSwgb2Zmc2V0ID0gMCkge1xuICByZXR1cm4gd3J0QmlnVUludDY0QkUodGhpcywgdmFsdWUsIG9mZnNldCwgQmlnSW50KDApLCBCaWdJbnQoJzB4ZmZmZmZmZmZmZmZmZmZmZicpKVxufSlcblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludExFID0gZnVuY3Rpb24gd3JpdGVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjb25zdCBsaW1pdCA9IE1hdGgucG93KDIsICg4ICogYnl0ZUxlbmd0aCkgLSAxKVxuXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpXG4gIH1cblxuICBsZXQgaSA9IDBcbiAgbGV0IG11bCA9IDFcbiAgbGV0IHN1YiA9IDBcbiAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgaWYgKHZhbHVlIDwgMCAmJiBzdWIgPT09IDAgJiYgdGhpc1tvZmZzZXQgKyBpIC0gMV0gIT09IDApIHtcbiAgICAgIHN1YiA9IDFcbiAgICB9XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICgodmFsdWUgLyBtdWwpID4+IDApIC0gc3ViICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludEJFID0gZnVuY3Rpb24gd3JpdGVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjb25zdCBsaW1pdCA9IE1hdGgucG93KDIsICg4ICogYnl0ZUxlbmd0aCkgLSAxKVxuXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpXG4gIH1cblxuICBsZXQgaSA9IGJ5dGVMZW5ndGggLSAxXG4gIGxldCBtdWwgPSAxXG4gIGxldCBzdWIgPSAwXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgaWYgKHZhbHVlIDwgMCAmJiBzdWIgPT09IDAgJiYgdGhpc1tvZmZzZXQgKyBpICsgMV0gIT09IDApIHtcbiAgICAgIHN1YiA9IDFcbiAgICB9XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICgodmFsdWUgLyBtdWwpID4+IDApIC0gc3ViICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDggPSBmdW5jdGlvbiB3cml0ZUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweDdmLCAtMHg4MClcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmICsgdmFsdWUgKyAxXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZmZmZmYgKyB2YWx1ZSArIDFcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlQmlnSW50NjRMRSA9IGRlZmluZUJpZ0ludE1ldGhvZChmdW5jdGlvbiB3cml0ZUJpZ0ludDY0TEUgKHZhbHVlLCBvZmZzZXQgPSAwKSB7XG4gIHJldHVybiB3cnRCaWdVSW50NjRMRSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAtQmlnSW50KCcweDgwMDAwMDAwMDAwMDAwMDAnKSwgQmlnSW50KCcweDdmZmZmZmZmZmZmZmZmZmYnKSlcbn0pXG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVCaWdJbnQ2NEJFID0gZGVmaW5lQmlnSW50TWV0aG9kKGZ1bmN0aW9uIHdyaXRlQmlnSW50NjRCRSAodmFsdWUsIG9mZnNldCA9IDApIHtcbiAgcmV0dXJuIHdydEJpZ1VJbnQ2NEJFKHRoaXMsIHZhbHVlLCBvZmZzZXQsIC1CaWdJbnQoJzB4ODAwMDAwMDAwMDAwMDAwMCcpLCBCaWdJbnQoJzB4N2ZmZmZmZmZmZmZmZmZmZicpKVxufSlcblxuZnVuY3Rpb24gY2hlY2tJRUVFNzU0IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxuICBpZiAob2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRmxvYXQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDQsIDMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgsIC0zLjQwMjgyMzQ2NjM4NTI4ODZlKzM4KVxuICB9XG4gIGllZWU3NTQud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDIzLCA0KVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRMRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdEJFID0gZnVuY3Rpb24gd3JpdGVGbG9hdEJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRG91YmxlIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA4LCAxLjc5NzY5MzEzNDg2MjMxNTdFKzMwOCwgLTEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4KVxuICB9XG4gIGllZWU3NTQud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDUyLCA4KVxuICByZXR1cm4gb2Zmc2V0ICsgOFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlTEUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVCRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbi8vIGNvcHkodGFyZ2V0QnVmZmVyLCB0YXJnZXRTdGFydD0wLCBzb3VyY2VTdGFydD0wLCBzb3VyY2VFbmQ9YnVmZmVyLmxlbmd0aClcbkJ1ZmZlci5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uIGNvcHkgKHRhcmdldCwgdGFyZ2V0U3RhcnQsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGFyZ2V0KSkgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgc2hvdWxkIGJlIGEgQnVmZmVyJylcbiAgaWYgKCFzdGFydCkgc3RhcnQgPSAwXG4gIGlmICghZW5kICYmIGVuZCAhPT0gMCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKHRhcmdldFN0YXJ0ID49IHRhcmdldC5sZW5ndGgpIHRhcmdldFN0YXJ0ID0gdGFyZ2V0Lmxlbmd0aFxuICBpZiAoIXRhcmdldFN0YXJ0KSB0YXJnZXRTdGFydCA9IDBcbiAgaWYgKGVuZCA+IDAgJiYgZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgLy8gQ29weSAwIGJ5dGVzOyB3ZSdyZSBkb25lXG4gIGlmIChlbmQgPT09IHN0YXJ0KSByZXR1cm4gMFxuICBpZiAodGFyZ2V0Lmxlbmd0aCA9PT0gMCB8fCB0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBGYXRhbCBlcnJvciBjb25kaXRpb25zXG4gIGlmICh0YXJnZXRTdGFydCA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigndGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIH1cbiAgaWYgKHN0YXJ0IDwgMCB8fCBzdGFydCA+PSB0aGlzLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG4gIGlmIChlbmQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc291cmNlRW5kIG91dCBvZiBib3VuZHMnKVxuXG4gIC8vIEFyZSB3ZSBvb2I/XG4gIGlmIChlbmQgPiB0aGlzLmxlbmd0aCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCA8IGVuZCAtIHN0YXJ0KSB7XG4gICAgZW5kID0gdGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0ICsgc3RhcnRcbiAgfVxuXG4gIGNvbnN0IGxlbiA9IGVuZCAtIHN0YXJ0XG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCAmJiB0eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuY29weVdpdGhpbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIFVzZSBidWlsdC1pbiB3aGVuIGF2YWlsYWJsZSwgbWlzc2luZyBmcm9tIElFMTFcbiAgICB0aGlzLmNvcHlXaXRoaW4odGFyZ2V0U3RhcnQsIHN0YXJ0LCBlbmQpXG4gIH0gZWxzZSB7XG4gICAgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwoXG4gICAgICB0YXJnZXQsXG4gICAgICB0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpLFxuICAgICAgdGFyZ2V0U3RhcnRcbiAgICApXG4gIH1cblxuICByZXR1cm4gbGVuXG59XG5cbi8vIFVzYWdlOlxuLy8gICAgYnVmZmVyLmZpbGwobnVtYmVyWywgb2Zmc2V0WywgZW5kXV0pXG4vLyAgICBidWZmZXIuZmlsbChidWZmZXJbLCBvZmZzZXRbLCBlbmRdXSlcbi8vICAgIGJ1ZmZlci5maWxsKHN0cmluZ1ssIG9mZnNldFssIGVuZF1dWywgZW5jb2RpbmddKVxuQnVmZmVyLnByb3RvdHlwZS5maWxsID0gZnVuY3Rpb24gZmlsbCAodmFsLCBzdGFydCwgZW5kLCBlbmNvZGluZykge1xuICAvLyBIYW5kbGUgc3RyaW5nIGNhc2VzOlxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAodHlwZW9mIHN0YXJ0ID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBzdGFydFxuICAgICAgc3RhcnQgPSAwXG4gICAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGVuZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gZW5kXG4gICAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICAgIH1cbiAgICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdlbmNvZGluZyBtdXN0IGJlIGEgc3RyaW5nJylcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycgJiYgIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgIH1cbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgY29kZSA9IHZhbC5jaGFyQ29kZUF0KDApXG4gICAgICBpZiAoKGVuY29kaW5nID09PSAndXRmOCcgJiYgY29kZSA8IDEyOCkgfHxcbiAgICAgICAgICBlbmNvZGluZyA9PT0gJ2xhdGluMScpIHtcbiAgICAgICAgLy8gRmFzdCBwYXRoOiBJZiBgdmFsYCBmaXRzIGludG8gYSBzaW5nbGUgYnl0ZSwgdXNlIHRoYXQgbnVtZXJpYyB2YWx1ZS5cbiAgICAgICAgdmFsID0gY29kZVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIHZhbCA9IHZhbCAmIDI1NVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdib29sZWFuJykge1xuICAgIHZhbCA9IE51bWJlcih2YWwpXG4gIH1cblxuICAvLyBJbnZhbGlkIHJhbmdlcyBhcmUgbm90IHNldCB0byBhIGRlZmF1bHQsIHNvIGNhbiByYW5nZSBjaGVjayBlYXJseS5cbiAgaWYgKHN0YXJ0IDwgMCB8fCB0aGlzLmxlbmd0aCA8IHN0YXJ0IHx8IHRoaXMubGVuZ3RoIDwgZW5kKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ091dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHN0YXJ0ID0gc3RhcnQgPj4+IDBcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyB0aGlzLmxlbmd0aCA6IGVuZCA+Pj4gMFxuXG4gIGlmICghdmFsKSB2YWwgPSAwXG5cbiAgbGV0IGlcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgICAgdGhpc1tpXSA9IHZhbFxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCBieXRlcyA9IEJ1ZmZlci5pc0J1ZmZlcih2YWwpXG4gICAgICA/IHZhbFxuICAgICAgOiBCdWZmZXIuZnJvbSh2YWwsIGVuY29kaW5nKVxuICAgIGNvbnN0IGxlbiA9IGJ5dGVzLmxlbmd0aFxuICAgIGlmIChsZW4gPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSB2YWx1ZSBcIicgKyB2YWwgK1xuICAgICAgICAnXCIgaXMgaW52YWxpZCBmb3IgYXJndW1lbnQgXCJ2YWx1ZVwiJylcbiAgICB9XG4gICAgZm9yIChpID0gMDsgaSA8IGVuZCAtIHN0YXJ0OyArK2kpIHtcbiAgICAgIHRoaXNbaSArIHN0YXJ0XSA9IGJ5dGVzW2kgJSBsZW5dXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXNcbn1cblxuLy8gQ1VTVE9NIEVSUk9SU1xuLy8gPT09PT09PT09PT09PVxuXG4vLyBTaW1wbGlmaWVkIHZlcnNpb25zIGZyb20gTm9kZSwgY2hhbmdlZCBmb3IgQnVmZmVyLW9ubHkgdXNhZ2VcbmNvbnN0IGVycm9ycyA9IHt9XG5mdW5jdGlvbiBFIChzeW0sIGdldE1lc3NhZ2UsIEJhc2UpIHtcbiAgZXJyb3JzW3N5bV0gPSBjbGFzcyBOb2RlRXJyb3IgZXh0ZW5kcyBCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICBzdXBlcigpXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnbWVzc2FnZScsIHtcbiAgICAgICAgdmFsdWU6IGdldE1lc3NhZ2UuYXBwbHkodGhpcywgYXJndW1lbnRzKSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfSlcblxuICAgICAgLy8gQWRkIHRoZSBlcnJvciBjb2RlIHRvIHRoZSBuYW1lIHRvIGluY2x1ZGUgaXQgaW4gdGhlIHN0YWNrIHRyYWNlLlxuICAgICAgdGhpcy5uYW1lID0gYCR7dGhpcy5uYW1lfSBbJHtzeW19XWBcbiAgICAgIC8vIEFjY2VzcyB0aGUgc3RhY2sgdG8gZ2VuZXJhdGUgdGhlIGVycm9yIG1lc3NhZ2UgaW5jbHVkaW5nIHRoZSBlcnJvciBjb2RlXG4gICAgICAvLyBmcm9tIHRoZSBuYW1lLlxuICAgICAgdGhpcy5zdGFjayAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC1leHByZXNzaW9uc1xuICAgICAgLy8gUmVzZXQgdGhlIG5hbWUgdG8gdGhlIGFjdHVhbCBuYW1lLlxuICAgICAgZGVsZXRlIHRoaXMubmFtZVxuICAgIH1cblxuICAgIGdldCBjb2RlICgpIHtcbiAgICAgIHJldHVybiBzeW1cbiAgICB9XG5cbiAgICBzZXQgY29kZSAodmFsdWUpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnY29kZScsIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgdG9TdHJpbmcgKCkge1xuICAgICAgcmV0dXJuIGAke3RoaXMubmFtZX0gWyR7c3ltfV06ICR7dGhpcy5tZXNzYWdlfWBcbiAgICB9XG4gIH1cbn1cblxuRSgnRVJSX0JVRkZFUl9PVVRfT0ZfQk9VTkRTJyxcbiAgZnVuY3Rpb24gKG5hbWUpIHtcbiAgICBpZiAobmFtZSkge1xuICAgICAgcmV0dXJuIGAke25hbWV9IGlzIG91dHNpZGUgb2YgYnVmZmVyIGJvdW5kc2BcbiAgICB9XG5cbiAgICByZXR1cm4gJ0F0dGVtcHQgdG8gYWNjZXNzIG1lbW9yeSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMnXG4gIH0sIFJhbmdlRXJyb3IpXG5FKCdFUlJfSU5WQUxJRF9BUkdfVFlQRScsXG4gIGZ1bmN0aW9uIChuYW1lLCBhY3R1YWwpIHtcbiAgICByZXR1cm4gYFRoZSBcIiR7bmFtZX1cIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyLiBSZWNlaXZlZCB0eXBlICR7dHlwZW9mIGFjdHVhbH1gXG4gIH0sIFR5cGVFcnJvcilcbkUoJ0VSUl9PVVRfT0ZfUkFOR0UnLFxuICBmdW5jdGlvbiAoc3RyLCByYW5nZSwgaW5wdXQpIHtcbiAgICBsZXQgbXNnID0gYFRoZSB2YWx1ZSBvZiBcIiR7c3RyfVwiIGlzIG91dCBvZiByYW5nZS5gXG4gICAgbGV0IHJlY2VpdmVkID0gaW5wdXRcbiAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihpbnB1dCkgJiYgTWF0aC5hYnMoaW5wdXQpID4gMiAqKiAzMikge1xuICAgICAgcmVjZWl2ZWQgPSBhZGROdW1lcmljYWxTZXBhcmF0b3IoU3RyaW5nKGlucHV0KSlcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ2JpZ2ludCcpIHtcbiAgICAgIHJlY2VpdmVkID0gU3RyaW5nKGlucHV0KVxuICAgICAgaWYgKGlucHV0ID4gQmlnSW50KDIpICoqIEJpZ0ludCgzMikgfHwgaW5wdXQgPCAtKEJpZ0ludCgyKSAqKiBCaWdJbnQoMzIpKSkge1xuICAgICAgICByZWNlaXZlZCA9IGFkZE51bWVyaWNhbFNlcGFyYXRvcihyZWNlaXZlZClcbiAgICAgIH1cbiAgICAgIHJlY2VpdmVkICs9ICduJ1xuICAgIH1cbiAgICBtc2cgKz0gYCBJdCBtdXN0IGJlICR7cmFuZ2V9LiBSZWNlaXZlZCAke3JlY2VpdmVkfWBcbiAgICByZXR1cm4gbXNnXG4gIH0sIFJhbmdlRXJyb3IpXG5cbmZ1bmN0aW9uIGFkZE51bWVyaWNhbFNlcGFyYXRvciAodmFsKSB7XG4gIGxldCByZXMgPSAnJ1xuICBsZXQgaSA9IHZhbC5sZW5ndGhcbiAgY29uc3Qgc3RhcnQgPSB2YWxbMF0gPT09ICctJyA/IDEgOiAwXG4gIGZvciAoOyBpID49IHN0YXJ0ICsgNDsgaSAtPSAzKSB7XG4gICAgcmVzID0gYF8ke3ZhbC5zbGljZShpIC0gMywgaSl9JHtyZXN9YFxuICB9XG4gIHJldHVybiBgJHt2YWwuc2xpY2UoMCwgaSl9JHtyZXN9YFxufVxuXG4vLyBDSEVDSyBGVU5DVElPTlNcbi8vID09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBjaGVja0JvdW5kcyAoYnVmLCBvZmZzZXQsIGJ5dGVMZW5ndGgpIHtcbiAgdmFsaWRhdGVOdW1iZXIob2Zmc2V0LCAnb2Zmc2V0JylcbiAgaWYgKGJ1ZltvZmZzZXRdID09PSB1bmRlZmluZWQgfHwgYnVmW29mZnNldCArIGJ5dGVMZW5ndGhdID09PSB1bmRlZmluZWQpIHtcbiAgICBib3VuZHNFcnJvcihvZmZzZXQsIGJ1Zi5sZW5ndGggLSAoYnl0ZUxlbmd0aCArIDEpKVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrSW50QkkgKHZhbHVlLCBtaW4sIG1heCwgYnVmLCBvZmZzZXQsIGJ5dGVMZW5ndGgpIHtcbiAgaWYgKHZhbHVlID4gbWF4IHx8IHZhbHVlIDwgbWluKSB7XG4gICAgY29uc3QgbiA9IHR5cGVvZiBtaW4gPT09ICdiaWdpbnQnID8gJ24nIDogJydcbiAgICBsZXQgcmFuZ2VcbiAgICBpZiAoYnl0ZUxlbmd0aCA+IDMpIHtcbiAgICAgIGlmIChtaW4gPT09IDAgfHwgbWluID09PSBCaWdJbnQoMCkpIHtcbiAgICAgICAgcmFuZ2UgPSBgPj0gMCR7bn0gYW5kIDwgMiR7bn0gKiogJHsoYnl0ZUxlbmd0aCArIDEpICogOH0ke259YFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmFuZ2UgPSBgPj0gLSgyJHtufSAqKiAkeyhieXRlTGVuZ3RoICsgMSkgKiA4IC0gMX0ke259KSBhbmQgPCAyICoqIGAgK1xuICAgICAgICAgICAgICAgIGAkeyhieXRlTGVuZ3RoICsgMSkgKiA4IC0gMX0ke259YFxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByYW5nZSA9IGA+PSAke21pbn0ke259IGFuZCA8PSAke21heH0ke259YFxuICAgIH1cbiAgICB0aHJvdyBuZXcgZXJyb3JzLkVSUl9PVVRfT0ZfUkFOR0UoJ3ZhbHVlJywgcmFuZ2UsIHZhbHVlKVxuICB9XG4gIGNoZWNrQm91bmRzKGJ1Ziwgb2Zmc2V0LCBieXRlTGVuZ3RoKVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZU51bWJlciAodmFsdWUsIG5hbWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkVSUl9JTlZBTElEX0FSR19UWVBFKG5hbWUsICdudW1iZXInLCB2YWx1ZSlcbiAgfVxufVxuXG5mdW5jdGlvbiBib3VuZHNFcnJvciAodmFsdWUsIGxlbmd0aCwgdHlwZSkge1xuICBpZiAoTWF0aC5mbG9vcih2YWx1ZSkgIT09IHZhbHVlKSB7XG4gICAgdmFsaWRhdGVOdW1iZXIodmFsdWUsIHR5cGUpXG4gICAgdGhyb3cgbmV3IGVycm9ycy5FUlJfT1VUX09GX1JBTkdFKHR5cGUgfHwgJ29mZnNldCcsICdhbiBpbnRlZ2VyJywgdmFsdWUpXG4gIH1cblxuICBpZiAobGVuZ3RoIDwgMCkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuRVJSX0JVRkZFUl9PVVRfT0ZfQk9VTkRTKClcbiAgfVxuXG4gIHRocm93IG5ldyBlcnJvcnMuRVJSX09VVF9PRl9SQU5HRSh0eXBlIHx8ICdvZmZzZXQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYD49ICR7dHlwZSA/IDEgOiAwfSBhbmQgPD0gJHtsZW5ndGh9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKVxufVxuXG4vLyBIRUxQRVIgRlVOQ1RJT05TXG4vLyA9PT09PT09PT09PT09PT09XG5cbmNvbnN0IElOVkFMSURfQkFTRTY0X1JFID0gL1teKy8wLTlBLVphLXotX10vZ1xuXG5mdW5jdGlvbiBiYXNlNjRjbGVhbiAoc3RyKSB7XG4gIC8vIE5vZGUgdGFrZXMgZXF1YWwgc2lnbnMgYXMgZW5kIG9mIHRoZSBCYXNlNjQgZW5jb2RpbmdcbiAgc3RyID0gc3RyLnNwbGl0KCc9JylbMF1cbiAgLy8gTm9kZSBzdHJpcHMgb3V0IGludmFsaWQgY2hhcmFjdGVycyBsaWtlIFxcbiBhbmQgXFx0IGZyb20gdGhlIHN0cmluZywgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHN0ciA9IHN0ci50cmltKCkucmVwbGFjZShJTlZBTElEX0JBU0U2NF9SRSwgJycpXG4gIC8vIE5vZGUgY29udmVydHMgc3RyaW5ncyB3aXRoIGxlbmd0aCA8IDIgdG8gJydcbiAgaWYgKHN0ci5sZW5ndGggPCAyKSByZXR1cm4gJydcbiAgLy8gTm9kZSBhbGxvd3MgZm9yIG5vbi1wYWRkZWQgYmFzZTY0IHN0cmluZ3MgKG1pc3NpbmcgdHJhaWxpbmcgPT09KSwgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHdoaWxlIChzdHIubGVuZ3RoICUgNCAhPT0gMCkge1xuICAgIHN0ciA9IHN0ciArICc9J1xuICB9XG4gIHJldHVybiBzdHJcbn1cblxuZnVuY3Rpb24gdXRmOFRvQnl0ZXMgKHN0cmluZywgdW5pdHMpIHtcbiAgdW5pdHMgPSB1bml0cyB8fCBJbmZpbml0eVxuICBsZXQgY29kZVBvaW50XG4gIGNvbnN0IGxlbmd0aCA9IHN0cmluZy5sZW5ndGhcbiAgbGV0IGxlYWRTdXJyb2dhdGUgPSBudWxsXG4gIGNvbnN0IGJ5dGVzID0gW11cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgY29kZVBvaW50ID0gc3RyaW5nLmNoYXJDb2RlQXQoaSlcblxuICAgIC8vIGlzIHN1cnJvZ2F0ZSBjb21wb25lbnRcbiAgICBpZiAoY29kZVBvaW50ID4gMHhEN0ZGICYmIGNvZGVQb2ludCA8IDB4RTAwMCkge1xuICAgICAgLy8gbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICghbGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgICAvLyBubyBsZWFkIHlldFxuICAgICAgICBpZiAoY29kZVBvaW50ID4gMHhEQkZGKSB7XG4gICAgICAgICAgLy8gdW5leHBlY3RlZCB0cmFpbFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH0gZWxzZSBpZiAoaSArIDEgPT09IGxlbmd0aCkge1xuICAgICAgICAgIC8vIHVucGFpcmVkIGxlYWRcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdmFsaWQgbGVhZFxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gMiBsZWFkcyBpbiBhIHJvd1xuICAgICAgaWYgKGNvZGVQb2ludCA8IDB4REMwMCkge1xuICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyB2YWxpZCBzdXJyb2dhdGUgcGFpclxuICAgICAgY29kZVBvaW50ID0gKGxlYWRTdXJyb2dhdGUgLSAweEQ4MDAgPDwgMTAgfCBjb2RlUG9pbnQgLSAweERDMDApICsgMHgxMDAwMFxuICAgIH0gZWxzZSBpZiAobGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgLy8gdmFsaWQgYm1wIGNoYXIsIGJ1dCBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgfVxuXG4gICAgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcblxuICAgIC8vIGVuY29kZSB1dGY4XG4gICAgaWYgKGNvZGVQb2ludCA8IDB4ODApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMSkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChjb2RlUG9pbnQpXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDgwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2IHwgMHhDMCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyB8IDB4RTAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDQpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDEyIHwgMHhGMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb2RlIHBvaW50JylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnl0ZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlUb0J5dGVzIChzdHIpIHtcbiAgY29uc3QgYnl0ZUFycmF5ID0gW11cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICAvLyBOb2RlJ3MgY29kZSBzZWVtcyB0byBiZSBkb2luZyB0aGlzIGFuZCBub3QgJiAweDdGLi5cbiAgICBieXRlQXJyYXkucHVzaChzdHIuY2hhckNvZGVBdChpKSAmIDB4RkYpXG4gIH1cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiB1dGYxNmxlVG9CeXRlcyAoc3RyLCB1bml0cykge1xuICBsZXQgYywgaGksIGxvXG4gIGNvbnN0IGJ5dGVBcnJheSA9IFtdXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG5cbiAgICBjID0gc3RyLmNoYXJDb2RlQXQoaSlcbiAgICBoaSA9IGMgPj4gOFxuICAgIGxvID0gYyAlIDI1NlxuICAgIGJ5dGVBcnJheS5wdXNoKGxvKVxuICAgIGJ5dGVBcnJheS5wdXNoKGhpKVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiBiYXNlNjRUb0J5dGVzIChzdHIpIHtcbiAgcmV0dXJuIGJhc2U2NC50b0J5dGVBcnJheShiYXNlNjRjbGVhbihzdHIpKVxufVxuXG5mdW5jdGlvbiBibGl0QnVmZmVyIChzcmMsIGRzdCwgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgbGV0IGlcbiAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgaWYgKChpICsgb2Zmc2V0ID49IGRzdC5sZW5ndGgpIHx8IChpID49IHNyYy5sZW5ndGgpKSBicmVha1xuICAgIGRzdFtpICsgb2Zmc2V0XSA9IHNyY1tpXVxuICB9XG4gIHJldHVybiBpXG59XG5cbi8vIEFycmF5QnVmZmVyIG9yIFVpbnQ4QXJyYXkgb2JqZWN0cyBmcm9tIG90aGVyIGNvbnRleHRzIChpLmUuIGlmcmFtZXMpIGRvIG5vdCBwYXNzXG4vLyB0aGUgYGluc3RhbmNlb2ZgIGNoZWNrIGJ1dCB0aGV5IHNob3VsZCBiZSB0cmVhdGVkIGFzIG9mIHRoYXQgdHlwZS5cbi8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvaXNzdWVzLzE2NlxuZnVuY3Rpb24gaXNJbnN0YW5jZSAob2JqLCB0eXBlKSB7XG4gIHJldHVybiBvYmogaW5zdGFuY2VvZiB0eXBlIHx8XG4gICAgKG9iaiAhPSBudWxsICYmIG9iai5jb25zdHJ1Y3RvciAhPSBudWxsICYmIG9iai5jb25zdHJ1Y3Rvci5uYW1lICE9IG51bGwgJiZcbiAgICAgIG9iai5jb25zdHJ1Y3Rvci5uYW1lID09PSB0eXBlLm5hbWUpXG59XG5mdW5jdGlvbiBudW1iZXJJc05hTiAob2JqKSB7XG4gIC8vIEZvciBJRTExIHN1cHBvcnRcbiAgcmV0dXJuIG9iaiAhPT0gb2JqIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1jb21wYXJlXG59XG5cbi8vIENyZWF0ZSBsb29rdXAgdGFibGUgZm9yIGB0b1N0cmluZygnaGV4JylgXG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL2lzc3Vlcy8yMTlcbmNvbnN0IGhleFNsaWNlTG9va3VwVGFibGUgPSAoZnVuY3Rpb24gKCkge1xuICBjb25zdCBhbHBoYWJldCA9ICcwMTIzNDU2Nzg5YWJjZGVmJ1xuICBjb25zdCB0YWJsZSA9IG5ldyBBcnJheSgyNTYpXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgMTY7ICsraSkge1xuICAgIGNvbnN0IGkxNiA9IGkgKiAxNlxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgMTY7ICsraikge1xuICAgICAgdGFibGVbaTE2ICsgal0gPSBhbHBoYWJldFtpXSArIGFscGhhYmV0W2pdXG4gICAgfVxuICB9XG4gIHJldHVybiB0YWJsZVxufSkoKVxuXG4vLyBSZXR1cm4gbm90IGZ1bmN0aW9uIHdpdGggRXJyb3IgaWYgQmlnSW50IG5vdCBzdXBwb3J0ZWRcbmZ1bmN0aW9uIGRlZmluZUJpZ0ludE1ldGhvZCAoZm4pIHtcbiAgcmV0dXJuIHR5cGVvZiBCaWdJbnQgPT09ICd1bmRlZmluZWQnID8gQnVmZmVyQmlnSW50Tm90RGVmaW5lZCA6IGZuXG59XG5cbmZ1bmN0aW9uIEJ1ZmZlckJpZ0ludE5vdERlZmluZWQgKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ0JpZ0ludCBub3Qgc3VwcG9ydGVkJylcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/buffer/index.js\n"); - -/***/ }), - /***/ "./node_modules/can-use-dom/index.js": -/*!*******************************************!* +/*!*******************************************!*\ !*** ./node_modules/can-use-dom/index.js ***! \*******************************************/ /***/ ((module) => { @@ -63,7 +41,7 @@ eval("var canUseDOM = !!(\n typeof window !== 'undefined' &&\n window.document /***/ }), /***/ "./node_modules/chartist/dist/chartist.js": -/*!************************************************!* +/*!************************************************!*\ !*** ./node_modules/chartist/dist/chartist.js ***! \************************************************/ /***/ (function(module, exports, __webpack_require__) { @@ -73,17 +51,17 @@ eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function /***/ }), /***/ "./node_modules/codemirror/addon/edit/continuelist.js": -/*!************************************************************!* +/*!************************************************************!*\ !*** ./node_modules/codemirror/addon/edit/continuelist.js ***! \************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { -eval("// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n if (true) // CommonJS\n mod(__webpack_require__(/*! ../../lib/codemirror */ \"./node_modules/codemirror/lib/codemirror.js\"));\n else {}\n})(function(CodeMirror) {\n \"use strict\";\n\n var listRE = /^(\\s*)(>[> ]*|[*+-] \\[[x ]\\]\\s|[*+-]\\s|(\\d+)([.)]))(\\s*)/,\n emptyListRE = /^(\\s*)(>[> ]*|[*+-] \\[[x ]\\]|[*+-]|(\\d+)[.)])(\\s*)$/,\n unorderedListRE = /[*+-]\\s/;\n\n CodeMirror.commands.newlineAndIndentContinueMarkdownList = function(cm) {\n if (cm.getOption(\"disableInput\")) return CodeMirror.Pass;\n var ranges = cm.listSelections(), replacements = [];\n for (var i = 0; i < ranges.length; i++) {\n var pos = ranges[i].head;\n\n // If we're not in Markdown mode, fall back to normal newlineAndIndent\n var eolState = cm.getStateAfter(pos.line);\n var inner = CodeMirror.innerMode(cm.getMode(), eolState);\n if (inner.mode.name !== \"markdown\") {\n cm.execCommand(\"newlineAndIndent\");\n return;\n } else {\n eolState = inner.state;\n }\n\n var inList = eolState.list !== false;\n var inQuote = eolState.quote !== 0;\n\n var line = cm.getLine(pos.line), match = listRE.exec(line);\n var cursorBeforeBullet = /^\\s*$/.test(line.slice(0, pos.ch));\n if (!ranges[i].empty() || (!inList && !inQuote) || !match || cursorBeforeBullet) {\n cm.execCommand(\"newlineAndIndent\");\n return;\n }\n if (emptyListRE.test(line)) {\n var endOfQuote = inQuote && />\\s*$/.test(line)\n var endOfList = !/>\\s*$/.test(line)\n if (endOfQuote || endOfList) cm.replaceRange(\"\", {\n line: pos.line, ch: 0\n }, {\n line: pos.line, ch: pos.ch + 1\n });\n replacements[i] = \"\\n\";\n } else {\n var indent = match[1], after = match[5];\n var numbered = !(unorderedListRE.test(match[2]) || match[2].indexOf(\">\") >= 0);\n var bullet = numbered ? (parseInt(match[3], 10) + 1) + match[4] : match[2].replace(\"x\", \" \");\n replacements[i] = \"\\n\" + indent + bullet + after;\n\n if (numbered) incrementRemainingMarkdownListNumbers(cm, pos);\n }\n }\n\n cm.replaceSelections(replacements);\n };\n\n // Auto-updating Markdown list numbers when a new item is added to the\n // middle of a list\n function incrementRemainingMarkdownListNumbers(cm, pos) {\n var startLine = pos.line, lookAhead = 0, skipCount = 0;\n var startItem = listRE.exec(cm.getLine(startLine)), startIndent = startItem[1];\n\n do {\n lookAhead += 1;\n var nextLineNumber = startLine + lookAhead;\n var nextLine = cm.getLine(nextLineNumber), nextItem = listRE.exec(nextLine);\n\n if (nextItem) {\n var nextIndent = nextItem[1];\n var newNumber = (parseInt(startItem[3], 10) + lookAhead - skipCount);\n var nextNumber = (parseInt(nextItem[3], 10)), itemNumber = nextNumber;\n\n if (startIndent === nextIndent && !isNaN(nextNumber)) {\n if (newNumber === nextNumber) itemNumber = nextNumber + 1;\n if (newNumber > nextNumber) itemNumber = newNumber + 1;\n cm.replaceRange(\n nextLine.replace(listRE, nextIndent + itemNumber + nextItem[4] + nextItem[5]),\n {\n line: nextLineNumber, ch: 0\n }, {\n line: nextLineNumber, ch: nextLine.length\n });\n } else {\n if (startIndent.length > nextIndent.length) return;\n // This doesn't run if the next line immediatley indents, as it is\n // not clear of the users intention (new indented item or same level)\n if ((startIndent.length < nextIndent.length) && (lookAhead === 1)) return;\n skipCount += 1;\n }\n }\n } while (nextItem);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vbm9kZV9tb2R1bGVzL2NvZGVtaXJyb3IvYWRkb24vZWRpdC9jb250aW51ZWxpc3QuanM/MWVmNyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUVBO0FBQ0EsTUFBTSxJQUF1RDtBQUM3RCxRQUFRLG1CQUFPLENBQUMseUVBQXNCO0FBQ3RDLE9BQU8sRUFHYTtBQUNwQixDQUFDO0FBQ0Q7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixtQkFBbUI7QUFDdEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsQ0FBQyIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9jb2RlbWlycm9yL2FkZG9uL2VkaXQvY29udGludWVsaXN0LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnNcbi8vIERpc3RyaWJ1dGVkIHVuZGVyIGFuIE1JVCBsaWNlbnNlOiBodHRwczovL2NvZGVtaXJyb3IubmV0L0xJQ0VOU0VcblxuKGZ1bmN0aW9uKG1vZCkge1xuICBpZiAodHlwZW9mIGV4cG9ydHMgPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgbW9kdWxlID09IFwib2JqZWN0XCIpIC8vIENvbW1vbkpTXG4gICAgbW9kKHJlcXVpcmUoXCIuLi8uLi9saWIvY29kZW1pcnJvclwiKSk7XG4gIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIC8vIEFNRFxuICAgIGRlZmluZShbXCIuLi8uLi9saWIvY29kZW1pcnJvclwiXSwgbW9kKTtcbiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudlxuICAgIG1vZChDb2RlTWlycm9yKTtcbn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgdmFyIGxpc3RSRSA9IC9eKFxccyopKD5bPiBdKnxbKistXSBcXFtbeCBdXFxdXFxzfFsqKy1dXFxzfChcXGQrKShbLildKSkoXFxzKikvLFxuICAgICAgZW1wdHlMaXN0UkUgPSAvXihcXHMqKSg+Wz4gXSp8WyorLV0gXFxbW3ggXVxcXXxbKistXXwoXFxkKylbLildKShcXHMqKSQvLFxuICAgICAgdW5vcmRlcmVkTGlzdFJFID0gL1sqKy1dXFxzLztcblxuICBDb2RlTWlycm9yLmNvbW1hbmRzLm5ld2xpbmVBbmRJbmRlbnRDb250aW51ZU1hcmtkb3duTGlzdCA9IGZ1bmN0aW9uKGNtKSB7XG4gICAgaWYgKGNtLmdldE9wdGlvbihcImRpc2FibGVJbnB1dFwiKSkgcmV0dXJuIENvZGVNaXJyb3IuUGFzcztcbiAgICB2YXIgcmFuZ2VzID0gY20ubGlzdFNlbGVjdGlvbnMoKSwgcmVwbGFjZW1lbnRzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwb3MgPSByYW5nZXNbaV0uaGVhZDtcblxuICAgICAgLy8gSWYgd2UncmUgbm90IGluIE1hcmtkb3duIG1vZGUsIGZhbGwgYmFjayB0byBub3JtYWwgbmV3bGluZUFuZEluZGVudFxuICAgICAgdmFyIGVvbFN0YXRlID0gY20uZ2V0U3RhdGVBZnRlcihwb3MubGluZSk7XG4gICAgICB2YXIgaW5uZXIgPSBDb2RlTWlycm9yLmlubmVyTW9kZShjbS5nZXRNb2RlKCksIGVvbFN0YXRlKTtcbiAgICAgIGlmIChpbm5lci5tb2RlLm5hbWUgIT09IFwibWFya2Rvd25cIikge1xuICAgICAgICBjbS5leGVjQ29tbWFuZChcIm5ld2xpbmVBbmRJbmRlbnRcIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVvbFN0YXRlID0gaW5uZXIuc3RhdGU7XG4gICAgICB9XG5cbiAgICAgIHZhciBpbkxpc3QgPSBlb2xTdGF0ZS5saXN0ICE9PSBmYWxzZTtcbiAgICAgIHZhciBpblF1b3RlID0gZW9sU3RhdGUucXVvdGUgIT09IDA7XG5cbiAgICAgIHZhciBsaW5lID0gY20uZ2V0TGluZShwb3MubGluZSksIG1hdGNoID0gbGlzdFJFLmV4ZWMobGluZSk7XG4gICAgICB2YXIgY3Vyc29yQmVmb3JlQnVsbGV0ID0gL15cXHMqJC8udGVzdChsaW5lLnNsaWNlKDAsIHBvcy5jaCkpO1xuICAgICAgaWYgKCFyYW5nZXNbaV0uZW1wdHkoKSB8fCAoIWluTGlzdCAmJiAhaW5RdW90ZSkgfHwgIW1hdGNoIHx8IGN1cnNvckJlZm9yZUJ1bGxldCkge1xuICAgICAgICBjbS5leGVjQ29tbWFuZChcIm5ld2xpbmVBbmRJbmRlbnRcIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChlbXB0eUxpc3RSRS50ZXN0KGxpbmUpKSB7XG4gICAgICAgIHZhciBlbmRPZlF1b3RlID0gaW5RdW90ZSAmJiAvPlxccyokLy50ZXN0KGxpbmUpXG4gICAgICAgIHZhciBlbmRPZkxpc3QgPSAhLz5cXHMqJC8udGVzdChsaW5lKVxuICAgICAgICBpZiAoZW5kT2ZRdW90ZSB8fCBlbmRPZkxpc3QpIGNtLnJlcGxhY2VSYW5nZShcIlwiLCB7XG4gICAgICAgICAgbGluZTogcG9zLmxpbmUsIGNoOiAwXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBsaW5lOiBwb3MubGluZSwgY2g6IHBvcy5jaCArIDFcbiAgICAgICAgfSk7XG4gICAgICAgIHJlcGxhY2VtZW50c1tpXSA9IFwiXFxuXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgaW5kZW50ID0gbWF0Y2hbMV0sIGFmdGVyID0gbWF0Y2hbNV07XG4gICAgICAgIHZhciBudW1iZXJlZCA9ICEodW5vcmRlcmVkTGlzdFJFLnRlc3QobWF0Y2hbMl0pIHx8IG1hdGNoWzJdLmluZGV4T2YoXCI+XCIpID49IDApO1xuICAgICAgICB2YXIgYnVsbGV0ID0gbnVtYmVyZWQgPyAocGFyc2VJbnQobWF0Y2hbM10sIDEwKSArIDEpICsgbWF0Y2hbNF0gOiBtYXRjaFsyXS5yZXBsYWNlKFwieFwiLCBcIiBcIik7XG4gICAgICAgIHJlcGxhY2VtZW50c1tpXSA9IFwiXFxuXCIgKyBpbmRlbnQgKyBidWxsZXQgKyBhZnRlcjtcblxuICAgICAgICBpZiAobnVtYmVyZWQpIGluY3JlbWVudFJlbWFpbmluZ01hcmtkb3duTGlzdE51bWJlcnMoY20sIHBvcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY20ucmVwbGFjZVNlbGVjdGlvbnMocmVwbGFjZW1lbnRzKTtcbiAgfTtcblxuICAvLyBBdXRvLXVwZGF0aW5nIE1hcmtkb3duIGxpc3QgbnVtYmVycyB3aGVuIGEgbmV3IGl0ZW0gaXMgYWRkZWQgdG8gdGhlXG4gIC8vIG1pZGRsZSBvZiBhIGxpc3RcbiAgZnVuY3Rpb24gaW5jcmVtZW50UmVtYWluaW5nTWFya2Rvd25MaXN0TnVtYmVycyhjbSwgcG9zKSB7XG4gICAgdmFyIHN0YXJ0TGluZSA9IHBvcy5saW5lLCBsb29rQWhlYWQgPSAwLCBza2lwQ291bnQgPSAwO1xuICAgIHZhciBzdGFydEl0ZW0gPSBsaXN0UkUuZXhlYyhjbS5nZXRMaW5lKHN0YXJ0TGluZSkpLCBzdGFydEluZGVudCA9IHN0YXJ0SXRlbVsxXTtcblxuICAgIGRvIHtcbiAgICAgIGxvb2tBaGVhZCArPSAxO1xuICAgICAgdmFyIG5leHRMaW5lTnVtYmVyID0gc3RhcnRMaW5lICsgbG9va0FoZWFkO1xuICAgICAgdmFyIG5leHRMaW5lID0gY20uZ2V0TGluZShuZXh0TGluZU51bWJlciksIG5leHRJdGVtID0gbGlzdFJFLmV4ZWMobmV4dExpbmUpO1xuXG4gICAgICBpZiAobmV4dEl0ZW0pIHtcbiAgICAgICAgdmFyIG5leHRJbmRlbnQgPSBuZXh0SXRlbVsxXTtcbiAgICAgICAgdmFyIG5ld051bWJlciA9IChwYXJzZUludChzdGFydEl0ZW1bM10sIDEwKSArIGxvb2tBaGVhZCAtIHNraXBDb3VudCk7XG4gICAgICAgIHZhciBuZXh0TnVtYmVyID0gKHBhcnNlSW50KG5leHRJdGVtWzNdLCAxMCkpLCBpdGVtTnVtYmVyID0gbmV4dE51bWJlcjtcblxuICAgICAgICBpZiAoc3RhcnRJbmRlbnQgPT09IG5leHRJbmRlbnQgJiYgIWlzTmFOKG5leHROdW1iZXIpKSB7XG4gICAgICAgICAgaWYgKG5ld051bWJlciA9PT0gbmV4dE51bWJlcikgaXRlbU51bWJlciA9IG5leHROdW1iZXIgKyAxO1xuICAgICAgICAgIGlmIChuZXdOdW1iZXIgPiBuZXh0TnVtYmVyKSBpdGVtTnVtYmVyID0gbmV3TnVtYmVyICsgMTtcbiAgICAgICAgICBjbS5yZXBsYWNlUmFuZ2UoXG4gICAgICAgICAgICBuZXh0TGluZS5yZXBsYWNlKGxpc3RSRSwgbmV4dEluZGVudCArIGl0ZW1OdW1iZXIgKyBuZXh0SXRlbVs0XSArIG5leHRJdGVtWzVdKSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBsaW5lOiBuZXh0TGluZU51bWJlciwgY2g6IDBcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICBsaW5lOiBuZXh0TGluZU51bWJlciwgY2g6IG5leHRMaW5lLmxlbmd0aFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChzdGFydEluZGVudC5sZW5ndGggPiBuZXh0SW5kZW50Lmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICAgIC8vIFRoaXMgZG9lc24ndCBydW4gaWYgdGhlIG5leHQgbGluZSBpbW1lZGlhdGxleSBpbmRlbnRzLCBhcyBpdCBpc1xuICAgICAgICAgIC8vIG5vdCBjbGVhciBvZiB0aGUgdXNlcnMgaW50ZW50aW9uIChuZXcgaW5kZW50ZWQgaXRlbSBvciBzYW1lIGxldmVsKVxuICAgICAgICAgIGlmICgoc3RhcnRJbmRlbnQubGVuZ3RoIDwgbmV4dEluZGVudC5sZW5ndGgpICYmIChsb29rQWhlYWQgPT09IDEpKSByZXR1cm47XG4gICAgICAgICAgc2tpcENvdW50ICs9IDE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IHdoaWxlIChuZXh0SXRlbSk7XG4gIH1cbn0pO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/codemirror/addon/edit/continuelist.js\n"); +eval("// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n if (true) // CommonJS\n mod(__webpack_require__(/*! ../../lib/codemirror */ \"./node_modules/codemirror/lib/codemirror.js\"));\n else {}\n})(function(CodeMirror) {\n \"use strict\";\n\n var listRE = /^(\\s*)(>[> ]*|[*+-] \\[[x ]\\]\\s|[*+-]\\s|(\\d+)([.)]))(\\s*)/,\n emptyListRE = /^(\\s*)(>[> ]*|[*+-] \\[[x ]\\]|[*+-]|(\\d+)[.)])(\\s*)$/,\n unorderedListRE = /[*+-]\\s/;\n\n CodeMirror.commands.newlineAndIndentContinueMarkdownList = function(cm) {\n if (cm.getOption(\"disableInput\")) return CodeMirror.Pass;\n var ranges = cm.listSelections(), replacements = [];\n for (var i = 0; i < ranges.length; i++) {\n var pos = ranges[i].head;\n\n // If we're not in Markdown mode, fall back to normal newlineAndIndent\n var eolState = cm.getStateAfter(pos.line);\n var inner = CodeMirror.innerMode(cm.getMode(), eolState);\n if (inner.mode.name !== \"markdown\") {\n cm.execCommand(\"newlineAndIndent\");\n return;\n } else {\n eolState = inner.state;\n }\n\n var inList = eolState.list !== false;\n var inQuote = eolState.quote !== 0;\n\n var line = cm.getLine(pos.line), match = listRE.exec(line);\n var cursorBeforeBullet = /^\\s*$/.test(line.slice(0, pos.ch));\n if (!ranges[i].empty() || (!inList && !inQuote) || !match || cursorBeforeBullet) {\n cm.execCommand(\"newlineAndIndent\");\n return;\n }\n if (emptyListRE.test(line)) {\n var endOfQuote = inQuote && />\\s*$/.test(line)\n var endOfList = !/>\\s*$/.test(line)\n if (endOfQuote || endOfList) cm.replaceRange(\"\", {\n line: pos.line, ch: 0\n }, {\n line: pos.line, ch: pos.ch + 1\n });\n replacements[i] = \"\\n\";\n } else {\n var indent = match[1], after = match[5];\n var numbered = !(unorderedListRE.test(match[2]) || match[2].indexOf(\">\") >= 0);\n var bullet = numbered ? (parseInt(match[3], 10) + 1) + match[4] : match[2].replace(\"x\", \" \");\n replacements[i] = \"\\n\" + indent + bullet + after;\n\n if (numbered) incrementRemainingMarkdownListNumbers(cm, pos);\n }\n }\n\n cm.replaceSelections(replacements);\n };\n\n // Auto-updating Markdown list numbers when a new item is added to the\n // middle of a list\n function incrementRemainingMarkdownListNumbers(cm, pos) {\n var startLine = pos.line, lookAhead = 0, skipCount = 0;\n var startItem = listRE.exec(cm.getLine(startLine)), startIndent = startItem[1];\n\n do {\n lookAhead += 1;\n var nextLineNumber = startLine + lookAhead;\n var nextLine = cm.getLine(nextLineNumber), nextItem = listRE.exec(nextLine);\n\n if (nextItem) {\n var nextIndent = nextItem[1];\n var newNumber = (parseInt(startItem[3], 10) + lookAhead - skipCount);\n var nextNumber = (parseInt(nextItem[3], 10)), itemNumber = nextNumber;\n\n if (startIndent === nextIndent && !isNaN(nextNumber)) {\n if (newNumber === nextNumber) itemNumber = nextNumber + 1;\n if (newNumber > nextNumber) itemNumber = newNumber + 1;\n cm.replaceRange(\n nextLine.replace(listRE, nextIndent + itemNumber + nextItem[4] + nextItem[5]),\n {\n line: nextLineNumber, ch: 0\n }, {\n line: nextLineNumber, ch: nextLine.length\n });\n } else {\n if (startIndent.length > nextIndent.length) return;\n // This doesn't run if the next line immediately indents, as it is\n // not clear of the users intention (new indented item or same level)\n if ((startIndent.length < nextIndent.length) && (lookAhead === 1)) return;\n skipCount += 1;\n }\n }\n } while (nextItem);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vbm9kZV9tb2R1bGVzL2NvZGVtaXJyb3IvYWRkb24vZWRpdC9jb250aW51ZWxpc3QuanM/MWVmNyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUVBO0FBQ0EsTUFBTSxJQUF1RDtBQUM3RCxRQUFRLG1CQUFPLENBQUMseUVBQXNCO0FBQ3RDLE9BQU8sRUFHYTtBQUNwQixDQUFDO0FBQ0Q7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixtQkFBbUI7QUFDdEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsQ0FBQyIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9jb2RlbWlycm9yL2FkZG9uL2VkaXQvY29udGludWVsaXN0LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnNcbi8vIERpc3RyaWJ1dGVkIHVuZGVyIGFuIE1JVCBsaWNlbnNlOiBodHRwczovL2NvZGVtaXJyb3IubmV0L0xJQ0VOU0VcblxuKGZ1bmN0aW9uKG1vZCkge1xuICBpZiAodHlwZW9mIGV4cG9ydHMgPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgbW9kdWxlID09IFwib2JqZWN0XCIpIC8vIENvbW1vbkpTXG4gICAgbW9kKHJlcXVpcmUoXCIuLi8uLi9saWIvY29kZW1pcnJvclwiKSk7XG4gIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIC8vIEFNRFxuICAgIGRlZmluZShbXCIuLi8uLi9saWIvY29kZW1pcnJvclwiXSwgbW9kKTtcbiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudlxuICAgIG1vZChDb2RlTWlycm9yKTtcbn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgdmFyIGxpc3RSRSA9IC9eKFxccyopKD5bPiBdKnxbKistXSBcXFtbeCBdXFxdXFxzfFsqKy1dXFxzfChcXGQrKShbLildKSkoXFxzKikvLFxuICAgICAgZW1wdHlMaXN0UkUgPSAvXihcXHMqKSg+Wz4gXSp8WyorLV0gXFxbW3ggXVxcXXxbKistXXwoXFxkKylbLildKShcXHMqKSQvLFxuICAgICAgdW5vcmRlcmVkTGlzdFJFID0gL1sqKy1dXFxzLztcblxuICBDb2RlTWlycm9yLmNvbW1hbmRzLm5ld2xpbmVBbmRJbmRlbnRDb250aW51ZU1hcmtkb3duTGlzdCA9IGZ1bmN0aW9uKGNtKSB7XG4gICAgaWYgKGNtLmdldE9wdGlvbihcImRpc2FibGVJbnB1dFwiKSkgcmV0dXJuIENvZGVNaXJyb3IuUGFzcztcbiAgICB2YXIgcmFuZ2VzID0gY20ubGlzdFNlbGVjdGlvbnMoKSwgcmVwbGFjZW1lbnRzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwb3MgPSByYW5nZXNbaV0uaGVhZDtcblxuICAgICAgLy8gSWYgd2UncmUgbm90IGluIE1hcmtkb3duIG1vZGUsIGZhbGwgYmFjayB0byBub3JtYWwgbmV3bGluZUFuZEluZGVudFxuICAgICAgdmFyIGVvbFN0YXRlID0gY20uZ2V0U3RhdGVBZnRlcihwb3MubGluZSk7XG4gICAgICB2YXIgaW5uZXIgPSBDb2RlTWlycm9yLmlubmVyTW9kZShjbS5nZXRNb2RlKCksIGVvbFN0YXRlKTtcbiAgICAgIGlmIChpbm5lci5tb2RlLm5hbWUgIT09IFwibWFya2Rvd25cIikge1xuICAgICAgICBjbS5leGVjQ29tbWFuZChcIm5ld2xpbmVBbmRJbmRlbnRcIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVvbFN0YXRlID0gaW5uZXIuc3RhdGU7XG4gICAgICB9XG5cbiAgICAgIHZhciBpbkxpc3QgPSBlb2xTdGF0ZS5saXN0ICE9PSBmYWxzZTtcbiAgICAgIHZhciBpblF1b3RlID0gZW9sU3RhdGUucXVvdGUgIT09IDA7XG5cbiAgICAgIHZhciBsaW5lID0gY20uZ2V0TGluZShwb3MubGluZSksIG1hdGNoID0gbGlzdFJFLmV4ZWMobGluZSk7XG4gICAgICB2YXIgY3Vyc29yQmVmb3JlQnVsbGV0ID0gL15cXHMqJC8udGVzdChsaW5lLnNsaWNlKDAsIHBvcy5jaCkpO1xuICAgICAgaWYgKCFyYW5nZXNbaV0uZW1wdHkoKSB8fCAoIWluTGlzdCAmJiAhaW5RdW90ZSkgfHwgIW1hdGNoIHx8IGN1cnNvckJlZm9yZUJ1bGxldCkge1xuICAgICAgICBjbS5leGVjQ29tbWFuZChcIm5ld2xpbmVBbmRJbmRlbnRcIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChlbXB0eUxpc3RSRS50ZXN0KGxpbmUpKSB7XG4gICAgICAgIHZhciBlbmRPZlF1b3RlID0gaW5RdW90ZSAmJiAvPlxccyokLy50ZXN0KGxpbmUpXG4gICAgICAgIHZhciBlbmRPZkxpc3QgPSAhLz5cXHMqJC8udGVzdChsaW5lKVxuICAgICAgICBpZiAoZW5kT2ZRdW90ZSB8fCBlbmRPZkxpc3QpIGNtLnJlcGxhY2VSYW5nZShcIlwiLCB7XG4gICAgICAgICAgbGluZTogcG9zLmxpbmUsIGNoOiAwXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBsaW5lOiBwb3MubGluZSwgY2g6IHBvcy5jaCArIDFcbiAgICAgICAgfSk7XG4gICAgICAgIHJlcGxhY2VtZW50c1tpXSA9IFwiXFxuXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgaW5kZW50ID0gbWF0Y2hbMV0sIGFmdGVyID0gbWF0Y2hbNV07XG4gICAgICAgIHZhciBudW1iZXJlZCA9ICEodW5vcmRlcmVkTGlzdFJFLnRlc3QobWF0Y2hbMl0pIHx8IG1hdGNoWzJdLmluZGV4T2YoXCI+XCIpID49IDApO1xuICAgICAgICB2YXIgYnVsbGV0ID0gbnVtYmVyZWQgPyAocGFyc2VJbnQobWF0Y2hbM10sIDEwKSArIDEpICsgbWF0Y2hbNF0gOiBtYXRjaFsyXS5yZXBsYWNlKFwieFwiLCBcIiBcIik7XG4gICAgICAgIHJlcGxhY2VtZW50c1tpXSA9IFwiXFxuXCIgKyBpbmRlbnQgKyBidWxsZXQgKyBhZnRlcjtcblxuICAgICAgICBpZiAobnVtYmVyZWQpIGluY3JlbWVudFJlbWFpbmluZ01hcmtkb3duTGlzdE51bWJlcnMoY20sIHBvcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY20ucmVwbGFjZVNlbGVjdGlvbnMocmVwbGFjZW1lbnRzKTtcbiAgfTtcblxuICAvLyBBdXRvLXVwZGF0aW5nIE1hcmtkb3duIGxpc3QgbnVtYmVycyB3aGVuIGEgbmV3IGl0ZW0gaXMgYWRkZWQgdG8gdGhlXG4gIC8vIG1pZGRsZSBvZiBhIGxpc3RcbiAgZnVuY3Rpb24gaW5jcmVtZW50UmVtYWluaW5nTWFya2Rvd25MaXN0TnVtYmVycyhjbSwgcG9zKSB7XG4gICAgdmFyIHN0YXJ0TGluZSA9IHBvcy5saW5lLCBsb29rQWhlYWQgPSAwLCBza2lwQ291bnQgPSAwO1xuICAgIHZhciBzdGFydEl0ZW0gPSBsaXN0UkUuZXhlYyhjbS5nZXRMaW5lKHN0YXJ0TGluZSkpLCBzdGFydEluZGVudCA9IHN0YXJ0SXRlbVsxXTtcblxuICAgIGRvIHtcbiAgICAgIGxvb2tBaGVhZCArPSAxO1xuICAgICAgdmFyIG5leHRMaW5lTnVtYmVyID0gc3RhcnRMaW5lICsgbG9va0FoZWFkO1xuICAgICAgdmFyIG5leHRMaW5lID0gY20uZ2V0TGluZShuZXh0TGluZU51bWJlciksIG5leHRJdGVtID0gbGlzdFJFLmV4ZWMobmV4dExpbmUpO1xuXG4gICAgICBpZiAobmV4dEl0ZW0pIHtcbiAgICAgICAgdmFyIG5leHRJbmRlbnQgPSBuZXh0SXRlbVsxXTtcbiAgICAgICAgdmFyIG5ld051bWJlciA9IChwYXJzZUludChzdGFydEl0ZW1bM10sIDEwKSArIGxvb2tBaGVhZCAtIHNraXBDb3VudCk7XG4gICAgICAgIHZhciBuZXh0TnVtYmVyID0gKHBhcnNlSW50KG5leHRJdGVtWzNdLCAxMCkpLCBpdGVtTnVtYmVyID0gbmV4dE51bWJlcjtcblxuICAgICAgICBpZiAoc3RhcnRJbmRlbnQgPT09IG5leHRJbmRlbnQgJiYgIWlzTmFOKG5leHROdW1iZXIpKSB7XG4gICAgICAgICAgaWYgKG5ld051bWJlciA9PT0gbmV4dE51bWJlcikgaXRlbU51bWJlciA9IG5leHROdW1iZXIgKyAxO1xuICAgICAgICAgIGlmIChuZXdOdW1iZXIgPiBuZXh0TnVtYmVyKSBpdGVtTnVtYmVyID0gbmV3TnVtYmVyICsgMTtcbiAgICAgICAgICBjbS5yZXBsYWNlUmFuZ2UoXG4gICAgICAgICAgICBuZXh0TGluZS5yZXBsYWNlKGxpc3RSRSwgbmV4dEluZGVudCArIGl0ZW1OdW1iZXIgKyBuZXh0SXRlbVs0XSArIG5leHRJdGVtWzVdKSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBsaW5lOiBuZXh0TGluZU51bWJlciwgY2g6IDBcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICBsaW5lOiBuZXh0TGluZU51bWJlciwgY2g6IG5leHRMaW5lLmxlbmd0aFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChzdGFydEluZGVudC5sZW5ndGggPiBuZXh0SW5kZW50Lmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICAgIC8vIFRoaXMgZG9lc24ndCBydW4gaWYgdGhlIG5leHQgbGluZSBpbW1lZGlhdGVseSBpbmRlbnRzLCBhcyBpdCBpc1xuICAgICAgICAgIC8vIG5vdCBjbGVhciBvZiB0aGUgdXNlcnMgaW50ZW50aW9uIChuZXcgaW5kZW50ZWQgaXRlbSBvciBzYW1lIGxldmVsKVxuICAgICAgICAgIGlmICgoc3RhcnRJbmRlbnQubGVuZ3RoIDwgbmV4dEluZGVudC5sZW5ndGgpICYmIChsb29rQWhlYWQgPT09IDEpKSByZXR1cm47XG4gICAgICAgICAgc2tpcENvdW50ICs9IDE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IHdoaWxlIChuZXh0SXRlbSk7XG4gIH1cbn0pO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/codemirror/addon/edit/continuelist.js\n"); /***/ }), /***/ "./node_modules/codemirror/addon/lint/css-lint.js": -/*!********************************************************!* +/*!********************************************************!*\ !*** ./node_modules/codemirror/addon/lint/css-lint.js ***! \********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -93,7 +71,7 @@ eval("// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distribute /***/ }), /***/ "./node_modules/codemirror/addon/lint/javascript-lint.js": -/*!***************************************************************!* +/*!***************************************************************!*\ !*** ./node_modules/codemirror/addon/lint/javascript-lint.js ***! \***************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -103,7 +81,7 @@ eval("// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distribute /***/ }), /***/ "./node_modules/codemirror/addon/lint/json-lint.js": -/*!*********************************************************!* +/*!*********************************************************!*\ !*** ./node_modules/codemirror/addon/lint/json-lint.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -113,17 +91,17 @@ eval("// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distribute /***/ }), /***/ "./node_modules/codemirror/addon/lint/lint.js": -/*!****************************************************!* +/*!****************************************************!*\ !*** ./node_modules/codemirror/addon/lint/lint.js ***! \****************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { -eval("// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n if (true) // CommonJS\n mod(__webpack_require__(/*! ../../lib/codemirror */ \"./node_modules/codemirror/lib/codemirror.js\"));\n else {}\n})(function(CodeMirror) {\n \"use strict\";\n var GUTTER_ID = \"CodeMirror-lint-markers\";\n\n function showTooltip(cm, e, content) {\n var tt = document.createElement(\"div\");\n tt.className = \"CodeMirror-lint-tooltip cm-s-\" + cm.options.theme;\n tt.appendChild(content.cloneNode(true));\n if (cm.state.lint.options.selfContain)\n cm.getWrapperElement().appendChild(tt);\n else\n document.body.appendChild(tt);\n\n function position(e) {\n if (!tt.parentNode) return CodeMirror.off(document, \"mousemove\", position);\n tt.style.top = Math.max(0, e.clientY - tt.offsetHeight - 5) + \"px\";\n tt.style.left = (e.clientX + 5) + \"px\";\n }\n CodeMirror.on(document, \"mousemove\", position);\n position(e);\n if (tt.style.opacity != null) tt.style.opacity = 1;\n return tt;\n }\n function rm(elt) {\n if (elt.parentNode) elt.parentNode.removeChild(elt);\n }\n function hideTooltip(tt) {\n if (!tt.parentNode) return;\n if (tt.style.opacity == null) rm(tt);\n tt.style.opacity = 0;\n setTimeout(function() { rm(tt); }, 600);\n }\n\n function showTooltipFor(cm, e, content, node) {\n var tooltip = showTooltip(cm, e, content);\n function hide() {\n CodeMirror.off(node, \"mouseout\", hide);\n if (tooltip) { hideTooltip(tooltip); tooltip = null; }\n }\n var poll = setInterval(function() {\n if (tooltip) for (var n = node;; n = n.parentNode) {\n if (n && n.nodeType == 11) n = n.host;\n if (n == document.body) return;\n if (!n) { hide(); break; }\n }\n if (!tooltip) return clearInterval(poll);\n }, 400);\n CodeMirror.on(node, \"mouseout\", hide);\n }\n\n function LintState(cm, options, hasGutter) {\n this.marked = [];\n this.options = options;\n this.timeout = null;\n this.hasGutter = hasGutter;\n this.onMouseOver = function(e) { onMouseOver(cm, e); };\n this.waitingFor = 0\n }\n\n function parseOptions(_cm, options) {\n if (options instanceof Function) return {getAnnotations: options};\n if (!options || options === true) options = {};\n return options;\n }\n\n function clearMarks(cm) {\n var state = cm.state.lint;\n if (state.hasGutter) cm.clearGutter(GUTTER_ID);\n for (var i = 0; i < state.marked.length; ++i)\n state.marked[i].clear();\n state.marked.length = 0;\n }\n\n function makeMarker(cm, labels, severity, multiple, tooltips) {\n var marker = document.createElement(\"div\"), inner = marker;\n marker.className = \"CodeMirror-lint-marker CodeMirror-lint-marker-\" + severity;\n if (multiple) {\n inner = marker.appendChild(document.createElement(\"div\"));\n inner.className = \"CodeMirror-lint-marker CodeMirror-lint-marker-multiple\";\n }\n\n if (tooltips != false) CodeMirror.on(inner, \"mouseover\", function(e) {\n showTooltipFor(cm, e, labels, inner);\n });\n\n return marker;\n }\n\n function getMaxSeverity(a, b) {\n if (a == \"error\") return a;\n else return b;\n }\n\n function groupByLine(annotations) {\n var lines = [];\n for (var i = 0; i < annotations.length; ++i) {\n var ann = annotations[i], line = ann.from.line;\n (lines[line] || (lines[line] = [])).push(ann);\n }\n return lines;\n }\n\n function annotationTooltip(ann) {\n var severity = ann.severity;\n if (!severity) severity = \"error\";\n var tip = document.createElement(\"div\");\n tip.className = \"CodeMirror-lint-message CodeMirror-lint-message-\" + severity;\n if (typeof ann.messageHTML != 'undefined') {\n tip.innerHTML = ann.messageHTML;\n } else {\n tip.appendChild(document.createTextNode(ann.message));\n }\n return tip;\n }\n\n function lintAsync(cm, getAnnotations, passOptions) {\n var state = cm.state.lint\n var id = ++state.waitingFor\n function abort() {\n id = -1\n cm.off(\"change\", abort)\n }\n cm.on(\"change\", abort)\n getAnnotations(cm.getValue(), function(annotations, arg2) {\n cm.off(\"change\", abort)\n if (state.waitingFor != id) return\n if (arg2 && annotations instanceof CodeMirror) annotations = arg2\n cm.operation(function() {updateLinting(cm, annotations)})\n }, passOptions, cm);\n }\n\n function startLinting(cm) {\n var state = cm.state.lint, options = state.options;\n /*\n * Passing rules in `options` property prevents JSHint (and other linters) from complaining\n * about unrecognized rules like `onUpdateLinting`, `delay`, `lintOnChange`, etc.\n */\n var passOptions = options.options || options;\n var getAnnotations = options.getAnnotations || cm.getHelper(CodeMirror.Pos(0, 0), \"lint\");\n if (!getAnnotations) return;\n if (options.async || getAnnotations.async) {\n lintAsync(cm, getAnnotations, passOptions)\n } else {\n var annotations = getAnnotations(cm.getValue(), passOptions, cm);\n if (!annotations) return;\n if (annotations.then) annotations.then(function(issues) {\n cm.operation(function() {updateLinting(cm, issues)})\n });\n else cm.operation(function() {updateLinting(cm, annotations)})\n }\n }\n\n function updateLinting(cm, annotationsNotSorted) {\n clearMarks(cm);\n var state = cm.state.lint, options = state.options;\n\n var annotations = groupByLine(annotationsNotSorted);\n\n for (var line = 0; line < annotations.length; ++line) {\n var anns = annotations[line];\n if (!anns) continue;\n\n var maxSeverity = null;\n var tipLabel = state.hasGutter && document.createDocumentFragment();\n\n for (var i = 0; i < anns.length; ++i) {\n var ann = anns[i];\n var severity = ann.severity;\n if (!severity) severity = \"error\";\n maxSeverity = getMaxSeverity(maxSeverity, severity);\n\n if (options.formatAnnotation) ann = options.formatAnnotation(ann);\n if (state.hasGutter) tipLabel.appendChild(annotationTooltip(ann));\n\n if (ann.to) state.marked.push(cm.markText(ann.from, ann.to, {\n className: \"CodeMirror-lint-mark CodeMirror-lint-mark-\" + severity,\n __annotation: ann\n }));\n }\n\n if (state.hasGutter)\n cm.setGutterMarker(line, GUTTER_ID, makeMarker(cm, tipLabel, maxSeverity, anns.length > 1,\n state.options.tooltips));\n }\n if (options.onUpdateLinting) options.onUpdateLinting(annotationsNotSorted, annotations, cm);\n }\n\n function onChange(cm) {\n var state = cm.state.lint;\n if (!state) return;\n clearTimeout(state.timeout);\n state.timeout = setTimeout(function(){startLinting(cm);}, state.options.delay || 500);\n }\n\n function popupTooltips(cm, annotations, e) {\n var target = e.target || e.srcElement;\n var tooltip = document.createDocumentFragment();\n for (var i = 0; i < annotations.length; i++) {\n var ann = annotations[i];\n tooltip.appendChild(annotationTooltip(ann));\n }\n showTooltipFor(cm, e, tooltip, target);\n }\n\n function onMouseOver(cm, e) {\n var target = e.target || e.srcElement;\n if (!/\\bCodeMirror-lint-mark-/.test(target.className)) return;\n var box = target.getBoundingClientRect(), x = (box.left + box.right) / 2, y = (box.top + box.bottom) / 2;\n var spans = cm.findMarksAt(cm.coordsChar({left: x, top: y}, \"client\"));\n\n var annotations = [];\n for (var i = 0; i < spans.length; ++i) {\n var ann = spans[i].__annotation;\n if (ann) annotations.push(ann);\n }\n if (annotations.length) popupTooltips(cm, annotations, e);\n }\n\n CodeMirror.defineOption(\"lint\", false, function(cm, val, old) {\n if (old && old != CodeMirror.Init) {\n clearMarks(cm);\n if (cm.state.lint.options.lintOnChange !== false)\n cm.off(\"change\", onChange);\n CodeMirror.off(cm.getWrapperElement(), \"mouseover\", cm.state.lint.onMouseOver);\n clearTimeout(cm.state.lint.timeout);\n delete cm.state.lint;\n }\n\n if (val) {\n var gutters = cm.getOption(\"gutters\"), hasLintGutter = false;\n for (var i = 0; i < gutters.length; ++i) if (gutters[i] == GUTTER_ID) hasLintGutter = true;\n var state = cm.state.lint = new LintState(cm, parseOptions(cm, val), hasLintGutter);\n if (state.options.lintOnChange !== false)\n cm.on(\"change\", onChange);\n if (state.options.tooltips != false && state.options.tooltips != \"gutter\")\n CodeMirror.on(cm.getWrapperElement(), \"mouseover\", state.onMouseOver);\n\n startLinting(cm);\n }\n });\n\n CodeMirror.defineExtension(\"performLint\", function() {\n if (this.state.lint) startLinting(this);\n });\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vbm9kZV9tb2R1bGVzL2NvZGVtaXJyb3IvYWRkb24vbGludC9saW50LmpzPzg4MjIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7QUFFQTtBQUNBLE1BQU0sSUFBdUQ7QUFDN0QsUUFBUSxtQkFBTyxDQUFDLHlFQUFzQjtBQUN0QyxPQUFPLEVBR2E7QUFDcEIsQ0FBQztBQUNEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLFFBQVEsRUFBRTtBQUNyQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixzQkFBc0IsZ0JBQWdCO0FBQzFEO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBLGlCQUFpQixRQUFRLE9BQU87QUFDaEM7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0Msb0JBQW9CO0FBQ3hEO0FBQ0E7O0FBRUE7QUFDQSw2Q0FBNkM7QUFDN0M7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQix5QkFBeUI7QUFDNUM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1CQUFtQix3QkFBd0I7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsK0JBQStCO0FBQzlELEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQywwQkFBMEI7QUFDM0QsT0FBTztBQUNQLG9DQUFvQywrQkFBK0I7QUFDbkU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsc0JBQXNCLDJCQUEyQjtBQUNqRDtBQUNBOztBQUVBO0FBQ0E7O0FBRUEscUJBQXFCLGlCQUFpQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMsa0JBQWtCO0FBQzVEOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQix3QkFBd0I7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QyxnQkFBZ0I7O0FBRTlEO0FBQ0EsbUJBQW1CLGtCQUFrQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EscUJBQXFCLG9CQUFvQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQyIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9jb2RlbWlycm9yL2FkZG9uL2xpbnQvbGludC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvZGVNaXJyb3IsIGNvcHlyaWdodCAoYykgYnkgTWFyaWpuIEhhdmVyYmVrZSBhbmQgb3RoZXJzXG4vLyBEaXN0cmlidXRlZCB1bmRlciBhbiBNSVQgbGljZW5zZTogaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFXG5cbihmdW5jdGlvbihtb2QpIHtcbiAgaWYgKHR5cGVvZiBleHBvcnRzID09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG1vZHVsZSA9PSBcIm9iamVjdFwiKSAvLyBDb21tb25KU1xuICAgIG1vZChyZXF1aXJlKFwiLi4vLi4vbGliL2NvZGVtaXJyb3JcIikpO1xuICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSAvLyBBTURcbiAgICBkZWZpbmUoW1wiLi4vLi4vbGliL2NvZGVtaXJyb3JcIl0sIG1vZCk7XG4gIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnZcbiAgICBtb2QoQ29kZU1pcnJvcik7XG59KShmdW5jdGlvbihDb2RlTWlycm9yKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuICB2YXIgR1VUVEVSX0lEID0gXCJDb2RlTWlycm9yLWxpbnQtbWFya2Vyc1wiO1xuXG4gIGZ1bmN0aW9uIHNob3dUb29sdGlwKGNtLCBlLCBjb250ZW50KSB7XG4gICAgdmFyIHR0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICB0dC5jbGFzc05hbWUgPSBcIkNvZGVNaXJyb3ItbGludC10b29sdGlwIGNtLXMtXCIgKyBjbS5vcHRpb25zLnRoZW1lO1xuICAgIHR0LmFwcGVuZENoaWxkKGNvbnRlbnQuY2xvbmVOb2RlKHRydWUpKTtcbiAgICBpZiAoY20uc3RhdGUubGludC5vcHRpb25zLnNlbGZDb250YWluKVxuICAgICAgY20uZ2V0V3JhcHBlckVsZW1lbnQoKS5hcHBlbmRDaGlsZCh0dCk7XG4gICAgZWxzZVxuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0dCk7XG5cbiAgICBmdW5jdGlvbiBwb3NpdGlvbihlKSB7XG4gICAgICBpZiAoIXR0LnBhcmVudE5vZGUpIHJldHVybiBDb2RlTWlycm9yLm9mZihkb2N1bWVudCwgXCJtb3VzZW1vdmVcIiwgcG9zaXRpb24pO1xuICAgICAgdHQuc3R5bGUudG9wID0gTWF0aC5tYXgoMCwgZS5jbGllbnRZIC0gdHQub2Zmc2V0SGVpZ2h0IC0gNSkgKyBcInB4XCI7XG4gICAgICB0dC5zdHlsZS5sZWZ0ID0gKGUuY2xpZW50WCArIDUpICsgXCJweFwiO1xuICAgIH1cbiAgICBDb2RlTWlycm9yLm9uKGRvY3VtZW50LCBcIm1vdXNlbW92ZVwiLCBwb3NpdGlvbik7XG4gICAgcG9zaXRpb24oZSk7XG4gICAgaWYgKHR0LnN0eWxlLm9wYWNpdHkgIT0gbnVsbCkgdHQuc3R5bGUub3BhY2l0eSA9IDE7XG4gICAgcmV0dXJuIHR0O1xuICB9XG4gIGZ1bmN0aW9uIHJtKGVsdCkge1xuICAgIGlmIChlbHQucGFyZW50Tm9kZSkgZWx0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWx0KTtcbiAgfVxuICBmdW5jdGlvbiBoaWRlVG9vbHRpcCh0dCkge1xuICAgIGlmICghdHQucGFyZW50Tm9kZSkgcmV0dXJuO1xuICAgIGlmICh0dC5zdHlsZS5vcGFjaXR5ID09IG51bGwpIHJtKHR0KTtcbiAgICB0dC5zdHlsZS5vcGFjaXR5ID0gMDtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBybSh0dCk7IH0sIDYwMCk7XG4gIH1cblxuICBmdW5jdGlvbiBzaG93VG9vbHRpcEZvcihjbSwgZSwgY29udGVudCwgbm9kZSkge1xuICAgIHZhciB0b29sdGlwID0gc2hvd1Rvb2x0aXAoY20sIGUsIGNvbnRlbnQpO1xuICAgIGZ1bmN0aW9uIGhpZGUoKSB7XG4gICAgICBDb2RlTWlycm9yLm9mZihub2RlLCBcIm1vdXNlb3V0XCIsIGhpZGUpO1xuICAgICAgaWYgKHRvb2x0aXApIHsgaGlkZVRvb2x0aXAodG9vbHRpcCk7IHRvb2x0aXAgPSBudWxsOyB9XG4gICAgfVxuICAgIHZhciBwb2xsID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7XG4gICAgICBpZiAodG9vbHRpcCkgZm9yICh2YXIgbiA9IG5vZGU7OyBuID0gbi5wYXJlbnROb2RlKSB7XG4gICAgICAgIGlmIChuICYmIG4ubm9kZVR5cGUgPT0gMTEpIG4gPSBuLmhvc3Q7XG4gICAgICAgIGlmIChuID09IGRvY3VtZW50LmJvZHkpIHJldHVybjtcbiAgICAgICAgaWYgKCFuKSB7IGhpZGUoKTsgYnJlYWs7IH1cbiAgICAgIH1cbiAgICAgIGlmICghdG9vbHRpcCkgcmV0dXJuIGNsZWFySW50ZXJ2YWwocG9sbCk7XG4gICAgfSwgNDAwKTtcbiAgICBDb2RlTWlycm9yLm9uKG5vZGUsIFwibW91c2VvdXRcIiwgaGlkZSk7XG4gIH1cblxuICBmdW5jdGlvbiBMaW50U3RhdGUoY20sIG9wdGlvbnMsIGhhc0d1dHRlcikge1xuICAgIHRoaXMubWFya2VkID0gW107XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLnRpbWVvdXQgPSBudWxsO1xuICAgIHRoaXMuaGFzR3V0dGVyID0gaGFzR3V0dGVyO1xuICAgIHRoaXMub25Nb3VzZU92ZXIgPSBmdW5jdGlvbihlKSB7IG9uTW91c2VPdmVyKGNtLCBlKTsgfTtcbiAgICB0aGlzLndhaXRpbmdGb3IgPSAwXG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZU9wdGlvbnMoX2NtLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgaW5zdGFuY2VvZiBGdW5jdGlvbikgcmV0dXJuIHtnZXRBbm5vdGF0aW9uczogb3B0aW9uc307XG4gICAgaWYgKCFvcHRpb25zIHx8IG9wdGlvbnMgPT09IHRydWUpIG9wdGlvbnMgPSB7fTtcbiAgICByZXR1cm4gb3B0aW9ucztcbiAgfVxuXG4gIGZ1bmN0aW9uIGNsZWFyTWFya3MoY20pIHtcbiAgICB2YXIgc3RhdGUgPSBjbS5zdGF0ZS5saW50O1xuICAgIGlmIChzdGF0ZS5oYXNHdXR0ZXIpIGNtLmNsZWFyR3V0dGVyKEdVVFRFUl9JRCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGF0ZS5tYXJrZWQubGVuZ3RoOyArK2kpXG4gICAgICBzdGF0ZS5tYXJrZWRbaV0uY2xlYXIoKTtcbiAgICBzdGF0ZS5tYXJrZWQubGVuZ3RoID0gMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1ha2VNYXJrZXIoY20sIGxhYmVscywgc2V2ZXJpdHksIG11bHRpcGxlLCB0b29sdGlwcykge1xuICAgIHZhciBtYXJrZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLCBpbm5lciA9IG1hcmtlcjtcbiAgICBtYXJrZXIuY2xhc3NOYW1lID0gXCJDb2RlTWlycm9yLWxpbnQtbWFya2VyIENvZGVNaXJyb3ItbGludC1tYXJrZXItXCIgKyBzZXZlcml0eTtcbiAgICBpZiAobXVsdGlwbGUpIHtcbiAgICAgIGlubmVyID0gbWFya2VyLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xuICAgICAgaW5uZXIuY2xhc3NOYW1lID0gXCJDb2RlTWlycm9yLWxpbnQtbWFya2VyIENvZGVNaXJyb3ItbGludC1tYXJrZXItbXVsdGlwbGVcIjtcbiAgICB9XG5cbiAgICBpZiAodG9vbHRpcHMgIT0gZmFsc2UpIENvZGVNaXJyb3Iub24oaW5uZXIsIFwibW91c2VvdmVyXCIsIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHNob3dUb29sdGlwRm9yKGNtLCBlLCBsYWJlbHMsIGlubmVyKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBtYXJrZXI7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRNYXhTZXZlcml0eShhLCBiKSB7XG4gICAgaWYgKGEgPT0gXCJlcnJvclwiKSByZXR1cm4gYTtcbiAgICBlbHNlIHJldHVybiBiO1xuICB9XG5cbiAgZnVuY3Rpb24gZ3JvdXBCeUxpbmUoYW5ub3RhdGlvbnMpIHtcbiAgICB2YXIgbGluZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFubm90YXRpb25zLmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgYW5uID0gYW5ub3RhdGlvbnNbaV0sIGxpbmUgPSBhbm4uZnJvbS5saW5lO1xuICAgICAgKGxpbmVzW2xpbmVdIHx8IChsaW5lc1tsaW5lXSA9IFtdKSkucHVzaChhbm4pO1xuICAgIH1cbiAgICByZXR1cm4gbGluZXM7XG4gIH1cblxuICBmdW5jdGlvbiBhbm5vdGF0aW9uVG9vbHRpcChhbm4pIHtcbiAgICB2YXIgc2V2ZXJpdHkgPSBhbm4uc2V2ZXJpdHk7XG4gICAgaWYgKCFzZXZlcml0eSkgc2V2ZXJpdHkgPSBcImVycm9yXCI7XG4gICAgdmFyIHRpcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgdGlwLmNsYXNzTmFtZSA9IFwiQ29kZU1pcnJvci1saW50LW1lc3NhZ2UgQ29kZU1pcnJvci1saW50LW1lc3NhZ2UtXCIgKyBzZXZlcml0eTtcbiAgICBpZiAodHlwZW9mIGFubi5tZXNzYWdlSFRNTCAhPSAndW5kZWZpbmVkJykge1xuICAgICAgdGlwLmlubmVySFRNTCA9IGFubi5tZXNzYWdlSFRNTDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGlwLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGFubi5tZXNzYWdlKSk7XG4gICAgfVxuICAgIHJldHVybiB0aXA7XG4gIH1cblxuICBmdW5jdGlvbiBsaW50QXN5bmMoY20sIGdldEFubm90YXRpb25zLCBwYXNzT3B0aW9ucykge1xuICAgIHZhciBzdGF0ZSA9IGNtLnN0YXRlLmxpbnRcbiAgICB2YXIgaWQgPSArK3N0YXRlLndhaXRpbmdGb3JcbiAgICBmdW5jdGlvbiBhYm9ydCgpIHtcbiAgICAgIGlkID0gLTFcbiAgICAgIGNtLm9mZihcImNoYW5nZVwiLCBhYm9ydClcbiAgICB9XG4gICAgY20ub24oXCJjaGFuZ2VcIiwgYWJvcnQpXG4gICAgZ2V0QW5ub3RhdGlvbnMoY20uZ2V0VmFsdWUoKSwgZnVuY3Rpb24oYW5ub3RhdGlvbnMsIGFyZzIpIHtcbiAgICAgIGNtLm9mZihcImNoYW5nZVwiLCBhYm9ydClcbiAgICAgIGlmIChzdGF0ZS53YWl0aW5nRm9yICE9IGlkKSByZXR1cm5cbiAgICAgIGlmIChhcmcyICYmIGFubm90YXRpb25zIGluc3RhbmNlb2YgQ29kZU1pcnJvcikgYW5ub3RhdGlvbnMgPSBhcmcyXG4gICAgICBjbS5vcGVyYXRpb24oZnVuY3Rpb24oKSB7dXBkYXRlTGludGluZyhjbSwgYW5ub3RhdGlvbnMpfSlcbiAgICB9LCBwYXNzT3B0aW9ucywgY20pO1xuICB9XG5cbiAgZnVuY3Rpb24gc3RhcnRMaW50aW5nKGNtKSB7XG4gICAgdmFyIHN0YXRlID0gY20uc3RhdGUubGludCwgb3B0aW9ucyA9IHN0YXRlLm9wdGlvbnM7XG4gICAgLypcbiAgICAgKiBQYXNzaW5nIHJ1bGVzIGluIGBvcHRpb25zYCBwcm9wZXJ0eSBwcmV2ZW50cyBKU0hpbnQgKGFuZCBvdGhlciBsaW50ZXJzKSBmcm9tIGNvbXBsYWluaW5nXG4gICAgICogYWJvdXQgdW5yZWNvZ25pemVkIHJ1bGVzIGxpa2UgYG9uVXBkYXRlTGludGluZ2AsIGBkZWxheWAsIGBsaW50T25DaGFuZ2VgLCBldGMuXG4gICAgICovXG4gICAgdmFyIHBhc3NPcHRpb25zID0gb3B0aW9ucy5vcHRpb25zIHx8IG9wdGlvbnM7XG4gICAgdmFyIGdldEFubm90YXRpb25zID0gb3B0aW9ucy5nZXRBbm5vdGF0aW9ucyB8fCBjbS5nZXRIZWxwZXIoQ29kZU1pcnJvci5Qb3MoMCwgMCksIFwibGludFwiKTtcbiAgICBpZiAoIWdldEFubm90YXRpb25zKSByZXR1cm47XG4gICAgaWYgKG9wdGlvbnMuYXN5bmMgfHwgZ2V0QW5ub3RhdGlvbnMuYXN5bmMpIHtcbiAgICAgIGxpbnRBc3luYyhjbSwgZ2V0QW5ub3RhdGlvbnMsIHBhc3NPcHRpb25zKVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgYW5ub3RhdGlvbnMgPSBnZXRBbm5vdGF0aW9ucyhjbS5nZXRWYWx1ZSgpLCBwYXNzT3B0aW9ucywgY20pO1xuICAgICAgaWYgKCFhbm5vdGF0aW9ucykgcmV0dXJuO1xuICAgICAgaWYgKGFubm90YXRpb25zLnRoZW4pIGFubm90YXRpb25zLnRoZW4oZnVuY3Rpb24oaXNzdWVzKSB7XG4gICAgICAgIGNtLm9wZXJhdGlvbihmdW5jdGlvbigpIHt1cGRhdGVMaW50aW5nKGNtLCBpc3N1ZXMpfSlcbiAgICAgIH0pO1xuICAgICAgZWxzZSBjbS5vcGVyYXRpb24oZnVuY3Rpb24oKSB7dXBkYXRlTGludGluZyhjbSwgYW5ub3RhdGlvbnMpfSlcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVMaW50aW5nKGNtLCBhbm5vdGF0aW9uc05vdFNvcnRlZCkge1xuICAgIGNsZWFyTWFya3MoY20pO1xuICAgIHZhciBzdGF0ZSA9IGNtLnN0YXRlLmxpbnQsIG9wdGlvbnMgPSBzdGF0ZS5vcHRpb25zO1xuXG4gICAgdmFyIGFubm90YXRpb25zID0gZ3JvdXBCeUxpbmUoYW5ub3RhdGlvbnNOb3RTb3J0ZWQpO1xuXG4gICAgZm9yICh2YXIgbGluZSA9IDA7IGxpbmUgPCBhbm5vdGF0aW9ucy5sZW5ndGg7ICsrbGluZSkge1xuICAgICAgdmFyIGFubnMgPSBhbm5vdGF0aW9uc1tsaW5lXTtcbiAgICAgIGlmICghYW5ucykgY29udGludWU7XG5cbiAgICAgIHZhciBtYXhTZXZlcml0eSA9IG51bGw7XG4gICAgICB2YXIgdGlwTGFiZWwgPSBzdGF0ZS5oYXNHdXR0ZXIgJiYgZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFubnMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGFubiA9IGFubnNbaV07XG4gICAgICAgIHZhciBzZXZlcml0eSA9IGFubi5zZXZlcml0eTtcbiAgICAgICAgaWYgKCFzZXZlcml0eSkgc2V2ZXJpdHkgPSBcImVycm9yXCI7XG4gICAgICAgIG1heFNldmVyaXR5ID0gZ2V0TWF4U2V2ZXJpdHkobWF4U2V2ZXJpdHksIHNldmVyaXR5KTtcblxuICAgICAgICBpZiAob3B0aW9ucy5mb3JtYXRBbm5vdGF0aW9uKSBhbm4gPSBvcHRpb25zLmZvcm1hdEFubm90YXRpb24oYW5uKTtcbiAgICAgICAgaWYgKHN0YXRlLmhhc0d1dHRlcikgdGlwTGFiZWwuYXBwZW5kQ2hpbGQoYW5ub3RhdGlvblRvb2x0aXAoYW5uKSk7XG5cbiAgICAgICAgaWYgKGFubi50bykgc3RhdGUubWFya2VkLnB1c2goY20ubWFya1RleHQoYW5uLmZyb20sIGFubi50bywge1xuICAgICAgICAgIGNsYXNzTmFtZTogXCJDb2RlTWlycm9yLWxpbnQtbWFyayBDb2RlTWlycm9yLWxpbnQtbWFyay1cIiArIHNldmVyaXR5LFxuICAgICAgICAgIF9fYW5ub3RhdGlvbjogYW5uXG4gICAgICAgIH0pKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlLmhhc0d1dHRlcilcbiAgICAgICAgY20uc2V0R3V0dGVyTWFya2VyKGxpbmUsIEdVVFRFUl9JRCwgbWFrZU1hcmtlcihjbSwgdGlwTGFiZWwsIG1heFNldmVyaXR5LCBhbm5zLmxlbmd0aCA+IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUub3B0aW9ucy50b29sdGlwcykpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5vblVwZGF0ZUxpbnRpbmcpIG9wdGlvbnMub25VcGRhdGVMaW50aW5nKGFubm90YXRpb25zTm90U29ydGVkLCBhbm5vdGF0aW9ucywgY20pO1xuICB9XG5cbiAgZnVuY3Rpb24gb25DaGFuZ2UoY20pIHtcbiAgICB2YXIgc3RhdGUgPSBjbS5zdGF0ZS5saW50O1xuICAgIGlmICghc3RhdGUpIHJldHVybjtcbiAgICBjbGVhclRpbWVvdXQoc3RhdGUudGltZW91dCk7XG4gICAgc3RhdGUudGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKXtzdGFydExpbnRpbmcoY20pO30sIHN0YXRlLm9wdGlvbnMuZGVsYXkgfHwgNTAwKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBvcHVwVG9vbHRpcHMoY20sIGFubm90YXRpb25zLCBlKSB7XG4gICAgdmFyIHRhcmdldCA9IGUudGFyZ2V0IHx8IGUuc3JjRWxlbWVudDtcbiAgICB2YXIgdG9vbHRpcCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFubm90YXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgYW5uID0gYW5ub3RhdGlvbnNbaV07XG4gICAgICB0b29sdGlwLmFwcGVuZENoaWxkKGFubm90YXRpb25Ub29sdGlwKGFubikpO1xuICAgIH1cbiAgICBzaG93VG9vbHRpcEZvcihjbSwgZSwgdG9vbHRpcCwgdGFyZ2V0KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uTW91c2VPdmVyKGNtLCBlKSB7XG4gICAgdmFyIHRhcmdldCA9IGUudGFyZ2V0IHx8IGUuc3JjRWxlbWVudDtcbiAgICBpZiAoIS9cXGJDb2RlTWlycm9yLWxpbnQtbWFyay0vLnRlc3QodGFyZ2V0LmNsYXNzTmFtZSkpIHJldHVybjtcbiAgICB2YXIgYm94ID0gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCB4ID0gKGJveC5sZWZ0ICsgYm94LnJpZ2h0KSAvIDIsIHkgPSAoYm94LnRvcCArIGJveC5ib3R0b20pIC8gMjtcbiAgICB2YXIgc3BhbnMgPSBjbS5maW5kTWFya3NBdChjbS5jb29yZHNDaGFyKHtsZWZ0OiB4LCB0b3A6IHl9LCBcImNsaWVudFwiKSk7XG5cbiAgICB2YXIgYW5ub3RhdGlvbnMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgYW5uID0gc3BhbnNbaV0uX19hbm5vdGF0aW9uO1xuICAgICAgaWYgKGFubikgYW5ub3RhdGlvbnMucHVzaChhbm4pO1xuICAgIH1cbiAgICBpZiAoYW5ub3RhdGlvbnMubGVuZ3RoKSBwb3B1cFRvb2x0aXBzKGNtLCBhbm5vdGF0aW9ucywgZSk7XG4gIH1cblxuICBDb2RlTWlycm9yLmRlZmluZU9wdGlvbihcImxpbnRcIiwgZmFsc2UsIGZ1bmN0aW9uKGNtLCB2YWwsIG9sZCkge1xuICAgIGlmIChvbGQgJiYgb2xkICE9IENvZGVNaXJyb3IuSW5pdCkge1xuICAgICAgY2xlYXJNYXJrcyhjbSk7XG4gICAgICBpZiAoY20uc3RhdGUubGludC5vcHRpb25zLmxpbnRPbkNoYW5nZSAhPT0gZmFsc2UpXG4gICAgICAgIGNtLm9mZihcImNoYW5nZVwiLCBvbkNoYW5nZSk7XG4gICAgICBDb2RlTWlycm9yLm9mZihjbS5nZXRXcmFwcGVyRWxlbWVudCgpLCBcIm1vdXNlb3ZlclwiLCBjbS5zdGF0ZS5saW50Lm9uTW91c2VPdmVyKTtcbiAgICAgIGNsZWFyVGltZW91dChjbS5zdGF0ZS5saW50LnRpbWVvdXQpO1xuICAgICAgZGVsZXRlIGNtLnN0YXRlLmxpbnQ7XG4gICAgfVxuXG4gICAgaWYgKHZhbCkge1xuICAgICAgdmFyIGd1dHRlcnMgPSBjbS5nZXRPcHRpb24oXCJndXR0ZXJzXCIpLCBoYXNMaW50R3V0dGVyID0gZmFsc2U7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGd1dHRlcnMubGVuZ3RoOyArK2kpIGlmIChndXR0ZXJzW2ldID09IEdVVFRFUl9JRCkgaGFzTGludEd1dHRlciA9IHRydWU7XG4gICAgICB2YXIgc3RhdGUgPSBjbS5zdGF0ZS5saW50ID0gbmV3IExpbnRTdGF0ZShjbSwgcGFyc2VPcHRpb25zKGNtLCB2YWwpLCBoYXNMaW50R3V0dGVyKTtcbiAgICAgIGlmIChzdGF0ZS5vcHRpb25zLmxpbnRPbkNoYW5nZSAhPT0gZmFsc2UpXG4gICAgICAgIGNtLm9uKFwiY2hhbmdlXCIsIG9uQ2hhbmdlKTtcbiAgICAgIGlmIChzdGF0ZS5vcHRpb25zLnRvb2x0aXBzICE9IGZhbHNlICYmIHN0YXRlLm9wdGlvbnMudG9vbHRpcHMgIT0gXCJndXR0ZXJcIilcbiAgICAgICAgQ29kZU1pcnJvci5vbihjbS5nZXRXcmFwcGVyRWxlbWVudCgpLCBcIm1vdXNlb3ZlclwiLCBzdGF0ZS5vbk1vdXNlT3Zlcik7XG5cbiAgICAgIHN0YXJ0TGludGluZyhjbSk7XG4gICAgfVxuICB9KTtcblxuICBDb2RlTWlycm9yLmRlZmluZUV4dGVuc2lvbihcInBlcmZvcm1MaW50XCIsIGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLnN0YXRlLmxpbnQpIHN0YXJ0TGludGluZyh0aGlzKTtcbiAgfSk7XG59KTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/codemirror/addon/lint/lint.js\n"); +eval("// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n if (true) // CommonJS\n mod(__webpack_require__(/*! ../../lib/codemirror */ \"./node_modules/codemirror/lib/codemirror.js\"));\n else {}\n})(function(CodeMirror) {\n \"use strict\";\n var GUTTER_ID = \"CodeMirror-lint-markers\";\n\n function showTooltip(cm, e, content) {\n var tt = document.createElement(\"div\");\n tt.className = \"CodeMirror-lint-tooltip cm-s-\" + cm.options.theme;\n tt.appendChild(content.cloneNode(true));\n if (cm.state.lint.options.selfContain)\n cm.getWrapperElement().appendChild(tt);\n else\n document.body.appendChild(tt);\n\n function position(e) {\n if (!tt.parentNode) return CodeMirror.off(document, \"mousemove\", position);\n tt.style.top = Math.max(0, e.clientY - tt.offsetHeight - 5) + \"px\";\n tt.style.left = (e.clientX + 5) + \"px\";\n }\n CodeMirror.on(document, \"mousemove\", position);\n position(e);\n if (tt.style.opacity != null) tt.style.opacity = 1;\n return tt;\n }\n function rm(elt) {\n if (elt.parentNode) elt.parentNode.removeChild(elt);\n }\n function hideTooltip(tt) {\n if (!tt.parentNode) return;\n if (tt.style.opacity == null) rm(tt);\n tt.style.opacity = 0;\n setTimeout(function() { rm(tt); }, 600);\n }\n\n function showTooltipFor(cm, e, content, node) {\n var tooltip = showTooltip(cm, e, content);\n function hide() {\n CodeMirror.off(node, \"mouseout\", hide);\n if (tooltip) { hideTooltip(tooltip); tooltip = null; }\n }\n var poll = setInterval(function() {\n if (tooltip) for (var n = node;; n = n.parentNode) {\n if (n && n.nodeType == 11) n = n.host;\n if (n == document.body) return;\n if (!n) { hide(); break; }\n }\n if (!tooltip) return clearInterval(poll);\n }, 400);\n CodeMirror.on(node, \"mouseout\", hide);\n }\n\n function LintState(cm, options, hasGutter) {\n this.marked = [];\n this.options = options;\n this.timeout = null;\n this.hasGutter = hasGutter;\n this.onMouseOver = function(e) { onMouseOver(cm, e); };\n this.waitingFor = 0\n }\n\n function parseOptions(_cm, options) {\n if (options instanceof Function) return {getAnnotations: options};\n if (!options || options === true) options = {};\n return options;\n }\n\n function clearMarks(cm) {\n var state = cm.state.lint;\n if (state.hasGutter) cm.clearGutter(GUTTER_ID);\n for (var i = 0; i < state.marked.length; ++i)\n state.marked[i].clear();\n state.marked.length = 0;\n }\n\n function makeMarker(cm, labels, severity, multiple, tooltips) {\n var marker = document.createElement(\"div\"), inner = marker;\n marker.className = \"CodeMirror-lint-marker CodeMirror-lint-marker-\" + severity;\n if (multiple) {\n inner = marker.appendChild(document.createElement(\"div\"));\n inner.className = \"CodeMirror-lint-marker CodeMirror-lint-marker-multiple\";\n }\n\n if (tooltips != false) CodeMirror.on(inner, \"mouseover\", function(e) {\n showTooltipFor(cm, e, labels, inner);\n });\n\n return marker;\n }\n\n function getMaxSeverity(a, b) {\n if (a == \"error\") return a;\n else return b;\n }\n\n function groupByLine(annotations) {\n var lines = [];\n for (var i = 0; i < annotations.length; ++i) {\n var ann = annotations[i], line = ann.from.line;\n (lines[line] || (lines[line] = [])).push(ann);\n }\n return lines;\n }\n\n function annotationTooltip(ann) {\n var severity = ann.severity;\n if (!severity) severity = \"error\";\n var tip = document.createElement(\"div\");\n tip.className = \"CodeMirror-lint-message CodeMirror-lint-message-\" + severity;\n if (typeof ann.messageHTML != 'undefined') {\n tip.innerHTML = ann.messageHTML;\n } else {\n tip.appendChild(document.createTextNode(ann.message));\n }\n return tip;\n }\n\n function lintAsync(cm, getAnnotations, passOptions) {\n var state = cm.state.lint\n var id = ++state.waitingFor\n function abort() {\n id = -1\n cm.off(\"change\", abort)\n }\n cm.on(\"change\", abort)\n getAnnotations(cm.getValue(), function(annotations, arg2) {\n cm.off(\"change\", abort)\n if (state.waitingFor != id) return\n if (arg2 && annotations instanceof CodeMirror) annotations = arg2\n cm.operation(function() {updateLinting(cm, annotations)})\n }, passOptions, cm);\n }\n\n function startLinting(cm) {\n var state = cm.state.lint, options = state.options;\n /*\n * Passing rules in `options` property prevents JSHint (and other linters) from complaining\n * about unrecognized rules like `onUpdateLinting`, `delay`, `lintOnChange`, etc.\n */\n var passOptions = options.options || options;\n var getAnnotations = options.getAnnotations || cm.getHelper(CodeMirror.Pos(0, 0), \"lint\");\n if (!getAnnotations) return;\n if (options.async || getAnnotations.async) {\n lintAsync(cm, getAnnotations, passOptions)\n } else {\n var annotations = getAnnotations(cm.getValue(), passOptions, cm);\n if (!annotations) return;\n if (annotations.then) annotations.then(function(issues) {\n cm.operation(function() {updateLinting(cm, issues)})\n });\n else cm.operation(function() {updateLinting(cm, annotations)})\n }\n }\n\n function updateLinting(cm, annotationsNotSorted) {\n clearMarks(cm);\n var state = cm.state.lint, options = state.options;\n\n var annotations = groupByLine(annotationsNotSorted);\n\n for (var line = 0; line < annotations.length; ++line) {\n var anns = annotations[line];\n if (!anns) continue;\n\n // filter out duplicate messages\n var message = [];\n anns = anns.filter(function(item) { return message.indexOf(item.message) > -1 ? false : message.push(item.message) });\n\n var maxSeverity = null;\n var tipLabel = state.hasGutter && document.createDocumentFragment();\n\n for (var i = 0; i < anns.length; ++i) {\n var ann = anns[i];\n var severity = ann.severity;\n if (!severity) severity = \"error\";\n maxSeverity = getMaxSeverity(maxSeverity, severity);\n\n if (options.formatAnnotation) ann = options.formatAnnotation(ann);\n if (state.hasGutter) tipLabel.appendChild(annotationTooltip(ann));\n\n if (ann.to) state.marked.push(cm.markText(ann.from, ann.to, {\n className: \"CodeMirror-lint-mark CodeMirror-lint-mark-\" + severity,\n __annotation: ann\n }));\n }\n // use original annotations[line] to show multiple messages\n if (state.hasGutter)\n cm.setGutterMarker(line, GUTTER_ID, makeMarker(cm, tipLabel, maxSeverity, annotations[line].length > 1,\n state.options.tooltips));\n }\n if (options.onUpdateLinting) options.onUpdateLinting(annotationsNotSorted, annotations, cm);\n }\n\n function onChange(cm) {\n var state = cm.state.lint;\n if (!state) return;\n clearTimeout(state.timeout);\n state.timeout = setTimeout(function(){startLinting(cm);}, state.options.delay || 500);\n }\n\n function popupTooltips(cm, annotations, e) {\n var target = e.target || e.srcElement;\n var tooltip = document.createDocumentFragment();\n for (var i = 0; i < annotations.length; i++) {\n var ann = annotations[i];\n tooltip.appendChild(annotationTooltip(ann));\n }\n showTooltipFor(cm, e, tooltip, target);\n }\n\n function onMouseOver(cm, e) {\n var target = e.target || e.srcElement;\n if (!/\\bCodeMirror-lint-mark-/.test(target.className)) return;\n var box = target.getBoundingClientRect(), x = (box.left + box.right) / 2, y = (box.top + box.bottom) / 2;\n var spans = cm.findMarksAt(cm.coordsChar({left: x, top: y}, \"client\"));\n\n var annotations = [];\n for (var i = 0; i < spans.length; ++i) {\n var ann = spans[i].__annotation;\n if (ann) annotations.push(ann);\n }\n if (annotations.length) popupTooltips(cm, annotations, e);\n }\n\n CodeMirror.defineOption(\"lint\", false, function(cm, val, old) {\n if (old && old != CodeMirror.Init) {\n clearMarks(cm);\n if (cm.state.lint.options.lintOnChange !== false)\n cm.off(\"change\", onChange);\n CodeMirror.off(cm.getWrapperElement(), \"mouseover\", cm.state.lint.onMouseOver);\n clearTimeout(cm.state.lint.timeout);\n delete cm.state.lint;\n }\n\n if (val) {\n var gutters = cm.getOption(\"gutters\"), hasLintGutter = false;\n for (var i = 0; i < gutters.length; ++i) if (gutters[i] == GUTTER_ID) hasLintGutter = true;\n var state = cm.state.lint = new LintState(cm, parseOptions(cm, val), hasLintGutter);\n if (state.options.lintOnChange !== false)\n cm.on(\"change\", onChange);\n if (state.options.tooltips != false && state.options.tooltips != \"gutter\")\n CodeMirror.on(cm.getWrapperElement(), \"mouseover\", state.onMouseOver);\n\n startLinting(cm);\n }\n });\n\n CodeMirror.defineExtension(\"performLint\", function() {\n if (this.state.lint) startLinting(this);\n });\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vbm9kZV9tb2R1bGVzL2NvZGVtaXJyb3IvYWRkb24vbGludC9saW50LmpzPzg4MjIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7QUFFQTtBQUNBLE1BQU0sSUFBdUQ7QUFDN0QsUUFBUSxtQkFBTyxDQUFDLHlFQUFzQjtBQUN0QyxPQUFPLEVBR2E7QUFDcEIsQ0FBQztBQUNEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLFFBQVEsRUFBRTtBQUNyQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixzQkFBc0IsZ0JBQWdCO0FBQzFEO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBLGlCQUFpQixRQUFRLE9BQU87QUFDaEM7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0Msb0JBQW9CO0FBQ3hEO0FBQ0E7O0FBRUE7QUFDQSw2Q0FBNkM7QUFDN0M7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQix5QkFBeUI7QUFDNUM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1CQUFtQix3QkFBd0I7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsK0JBQStCO0FBQzlELEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQywwQkFBMEI7QUFDM0QsT0FBTztBQUNQLG9DQUFvQywrQkFBK0I7QUFDbkU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsc0JBQXNCLDJCQUEyQjtBQUNqRDtBQUNBOztBQUVBO0FBQ0E7QUFDQSx5Q0FBeUMsaUZBQWlGOztBQUUxSDtBQUNBOztBQUVBLHFCQUFxQixpQkFBaUI7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyxrQkFBa0I7QUFDNUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLHdCQUF3QjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLGdCQUFnQjs7QUFFOUQ7QUFDQSxtQkFBbUIsa0JBQWtCO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxxQkFBcUIsb0JBQW9CO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDIiwiZmlsZSI6Ii4vbm9kZV9tb2R1bGVzL2NvZGVtaXJyb3IvYWRkb24vbGludC9saW50LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnNcbi8vIERpc3RyaWJ1dGVkIHVuZGVyIGFuIE1JVCBsaWNlbnNlOiBodHRwczovL2NvZGVtaXJyb3IubmV0L0xJQ0VOU0VcblxuKGZ1bmN0aW9uKG1vZCkge1xuICBpZiAodHlwZW9mIGV4cG9ydHMgPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgbW9kdWxlID09IFwib2JqZWN0XCIpIC8vIENvbW1vbkpTXG4gICAgbW9kKHJlcXVpcmUoXCIuLi8uLi9saWIvY29kZW1pcnJvclwiKSk7XG4gIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIC8vIEFNRFxuICAgIGRlZmluZShbXCIuLi8uLi9saWIvY29kZW1pcnJvclwiXSwgbW9kKTtcbiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudlxuICAgIG1vZChDb2RlTWlycm9yKTtcbn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG4gIHZhciBHVVRURVJfSUQgPSBcIkNvZGVNaXJyb3ItbGludC1tYXJrZXJzXCI7XG5cbiAgZnVuY3Rpb24gc2hvd1Rvb2x0aXAoY20sIGUsIGNvbnRlbnQpIHtcbiAgICB2YXIgdHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIHR0LmNsYXNzTmFtZSA9IFwiQ29kZU1pcnJvci1saW50LXRvb2x0aXAgY20tcy1cIiArIGNtLm9wdGlvbnMudGhlbWU7XG4gICAgdHQuYXBwZW5kQ2hpbGQoY29udGVudC5jbG9uZU5vZGUodHJ1ZSkpO1xuICAgIGlmIChjbS5zdGF0ZS5saW50Lm9wdGlvbnMuc2VsZkNvbnRhaW4pXG4gICAgICBjbS5nZXRXcmFwcGVyRWxlbWVudCgpLmFwcGVuZENoaWxkKHR0KTtcbiAgICBlbHNlXG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHR0KTtcblxuICAgIGZ1bmN0aW9uIHBvc2l0aW9uKGUpIHtcbiAgICAgIGlmICghdHQucGFyZW50Tm9kZSkgcmV0dXJuIENvZGVNaXJyb3Iub2ZmKGRvY3VtZW50LCBcIm1vdXNlbW92ZVwiLCBwb3NpdGlvbik7XG4gICAgICB0dC5zdHlsZS50b3AgPSBNYXRoLm1heCgwLCBlLmNsaWVudFkgLSB0dC5vZmZzZXRIZWlnaHQgLSA1KSArIFwicHhcIjtcbiAgICAgIHR0LnN0eWxlLmxlZnQgPSAoZS5jbGllbnRYICsgNSkgKyBcInB4XCI7XG4gICAgfVxuICAgIENvZGVNaXJyb3Iub24oZG9jdW1lbnQsIFwibW91c2Vtb3ZlXCIsIHBvc2l0aW9uKTtcbiAgICBwb3NpdGlvbihlKTtcbiAgICBpZiAodHQuc3R5bGUub3BhY2l0eSAhPSBudWxsKSB0dC5zdHlsZS5vcGFjaXR5ID0gMTtcbiAgICByZXR1cm4gdHQ7XG4gIH1cbiAgZnVuY3Rpb24gcm0oZWx0KSB7XG4gICAgaWYgKGVsdC5wYXJlbnROb2RlKSBlbHQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbHQpO1xuICB9XG4gIGZ1bmN0aW9uIGhpZGVUb29sdGlwKHR0KSB7XG4gICAgaWYgKCF0dC5wYXJlbnROb2RlKSByZXR1cm47XG4gICAgaWYgKHR0LnN0eWxlLm9wYWNpdHkgPT0gbnVsbCkgcm0odHQpO1xuICAgIHR0LnN0eWxlLm9wYWNpdHkgPSAwO1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IHJtKHR0KTsgfSwgNjAwKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3dUb29sdGlwRm9yKGNtLCBlLCBjb250ZW50LCBub2RlKSB7XG4gICAgdmFyIHRvb2x0aXAgPSBzaG93VG9vbHRpcChjbSwgZSwgY29udGVudCk7XG4gICAgZnVuY3Rpb24gaGlkZSgpIHtcbiAgICAgIENvZGVNaXJyb3Iub2ZmKG5vZGUsIFwibW91c2VvdXRcIiwgaGlkZSk7XG4gICAgICBpZiAodG9vbHRpcCkgeyBoaWRlVG9vbHRpcCh0b29sdGlwKTsgdG9vbHRpcCA9IG51bGw7IH1cbiAgICB9XG4gICAgdmFyIHBvbGwgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHtcbiAgICAgIGlmICh0b29sdGlwKSBmb3IgKHZhciBuID0gbm9kZTs7IG4gPSBuLnBhcmVudE5vZGUpIHtcbiAgICAgICAgaWYgKG4gJiYgbi5ub2RlVHlwZSA9PSAxMSkgbiA9IG4uaG9zdDtcbiAgICAgICAgaWYgKG4gPT0gZG9jdW1lbnQuYm9keSkgcmV0dXJuO1xuICAgICAgICBpZiAoIW4pIHsgaGlkZSgpOyBicmVhazsgfVxuICAgICAgfVxuICAgICAgaWYgKCF0b29sdGlwKSByZXR1cm4gY2xlYXJJbnRlcnZhbChwb2xsKTtcbiAgICB9LCA0MDApO1xuICAgIENvZGVNaXJyb3Iub24obm9kZSwgXCJtb3VzZW91dFwiLCBoaWRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIExpbnRTdGF0ZShjbSwgb3B0aW9ucywgaGFzR3V0dGVyKSB7XG4gICAgdGhpcy5tYXJrZWQgPSBbXTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMudGltZW91dCA9IG51bGw7XG4gICAgdGhpcy5oYXNHdXR0ZXIgPSBoYXNHdXR0ZXI7XG4gICAgdGhpcy5vbk1vdXNlT3ZlciA9IGZ1bmN0aW9uKGUpIHsgb25Nb3VzZU92ZXIoY20sIGUpOyB9O1xuICAgIHRoaXMud2FpdGluZ0ZvciA9IDBcbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlT3B0aW9ucyhfY20sIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyBpbnN0YW5jZW9mIEZ1bmN0aW9uKSByZXR1cm4ge2dldEFubm90YXRpb25zOiBvcHRpb25zfTtcbiAgICBpZiAoIW9wdGlvbnMgfHwgb3B0aW9ucyA9PT0gdHJ1ZSkgb3B0aW9ucyA9IHt9O1xuICAgIHJldHVybiBvcHRpb25zO1xuICB9XG5cbiAgZnVuY3Rpb24gY2xlYXJNYXJrcyhjbSkge1xuICAgIHZhciBzdGF0ZSA9IGNtLnN0YXRlLmxpbnQ7XG4gICAgaWYgKHN0YXRlLmhhc0d1dHRlcikgY20uY2xlYXJHdXR0ZXIoR1VUVEVSX0lEKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0YXRlLm1hcmtlZC5sZW5ndGg7ICsraSlcbiAgICAgIHN0YXRlLm1hcmtlZFtpXS5jbGVhcigpO1xuICAgIHN0YXRlLm1hcmtlZC5sZW5ndGggPSAwO1xuICB9XG5cbiAgZnVuY3Rpb24gbWFrZU1hcmtlcihjbSwgbGFiZWxzLCBzZXZlcml0eSwgbXVsdGlwbGUsIHRvb2x0aXBzKSB7XG4gICAgdmFyIG1hcmtlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksIGlubmVyID0gbWFya2VyO1xuICAgIG1hcmtlci5jbGFzc05hbWUgPSBcIkNvZGVNaXJyb3ItbGludC1tYXJrZXIgQ29kZU1pcnJvci1saW50LW1hcmtlci1cIiArIHNldmVyaXR5O1xuICAgIGlmIChtdWx0aXBsZSkge1xuICAgICAgaW5uZXIgPSBtYXJrZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7XG4gICAgICBpbm5lci5jbGFzc05hbWUgPSBcIkNvZGVNaXJyb3ItbGludC1tYXJrZXIgQ29kZU1pcnJvci1saW50LW1hcmtlci1tdWx0aXBsZVwiO1xuICAgIH1cblxuICAgIGlmICh0b29sdGlwcyAhPSBmYWxzZSkgQ29kZU1pcnJvci5vbihpbm5lciwgXCJtb3VzZW92ZXJcIiwgZnVuY3Rpb24oZSkge1xuICAgICAgc2hvd1Rvb2x0aXBGb3IoY20sIGUsIGxhYmVscywgaW5uZXIpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG1hcmtlcjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldE1heFNldmVyaXR5KGEsIGIpIHtcbiAgICBpZiAoYSA9PSBcImVycm9yXCIpIHJldHVybiBhO1xuICAgIGVsc2UgcmV0dXJuIGI7XG4gIH1cblxuICBmdW5jdGlvbiBncm91cEJ5TGluZShhbm5vdGF0aW9ucykge1xuICAgIHZhciBsaW5lcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYW5ub3RhdGlvbnMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBhbm4gPSBhbm5vdGF0aW9uc1tpXSwgbGluZSA9IGFubi5mcm9tLmxpbmU7XG4gICAgICAobGluZXNbbGluZV0gfHwgKGxpbmVzW2xpbmVdID0gW10pKS5wdXNoKGFubik7XG4gICAgfVxuICAgIHJldHVybiBsaW5lcztcbiAgfVxuXG4gIGZ1bmN0aW9uIGFubm90YXRpb25Ub29sdGlwKGFubikge1xuICAgIHZhciBzZXZlcml0eSA9IGFubi5zZXZlcml0eTtcbiAgICBpZiAoIXNldmVyaXR5KSBzZXZlcml0eSA9IFwiZXJyb3JcIjtcbiAgICB2YXIgdGlwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICB0aXAuY2xhc3NOYW1lID0gXCJDb2RlTWlycm9yLWxpbnQtbWVzc2FnZSBDb2RlTWlycm9yLWxpbnQtbWVzc2FnZS1cIiArIHNldmVyaXR5O1xuICAgIGlmICh0eXBlb2YgYW5uLm1lc3NhZ2VIVE1MICE9ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aXAuaW5uZXJIVE1MID0gYW5uLm1lc3NhZ2VIVE1MO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aXAuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYW5uLm1lc3NhZ2UpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRpcDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxpbnRBc3luYyhjbSwgZ2V0QW5ub3RhdGlvbnMsIHBhc3NPcHRpb25zKSB7XG4gICAgdmFyIHN0YXRlID0gY20uc3RhdGUubGludFxuICAgIHZhciBpZCA9ICsrc3RhdGUud2FpdGluZ0ZvclxuICAgIGZ1bmN0aW9uIGFib3J0KCkge1xuICAgICAgaWQgPSAtMVxuICAgICAgY20ub2ZmKFwiY2hhbmdlXCIsIGFib3J0KVxuICAgIH1cbiAgICBjbS5vbihcImNoYW5nZVwiLCBhYm9ydClcbiAgICBnZXRBbm5vdGF0aW9ucyhjbS5nZXRWYWx1ZSgpLCBmdW5jdGlvbihhbm5vdGF0aW9ucywgYXJnMikge1xuICAgICAgY20ub2ZmKFwiY2hhbmdlXCIsIGFib3J0KVxuICAgICAgaWYgKHN0YXRlLndhaXRpbmdGb3IgIT0gaWQpIHJldHVyblxuICAgICAgaWYgKGFyZzIgJiYgYW5ub3RhdGlvbnMgaW5zdGFuY2VvZiBDb2RlTWlycm9yKSBhbm5vdGF0aW9ucyA9IGFyZzJcbiAgICAgIGNtLm9wZXJhdGlvbihmdW5jdGlvbigpIHt1cGRhdGVMaW50aW5nKGNtLCBhbm5vdGF0aW9ucyl9KVxuICAgIH0sIHBhc3NPcHRpb25zLCBjbSk7XG4gIH1cblxuICBmdW5jdGlvbiBzdGFydExpbnRpbmcoY20pIHtcbiAgICB2YXIgc3RhdGUgPSBjbS5zdGF0ZS5saW50LCBvcHRpb25zID0gc3RhdGUub3B0aW9ucztcbiAgICAvKlxuICAgICAqIFBhc3NpbmcgcnVsZXMgaW4gYG9wdGlvbnNgIHByb3BlcnR5IHByZXZlbnRzIEpTSGludCAoYW5kIG90aGVyIGxpbnRlcnMpIGZyb20gY29tcGxhaW5pbmdcbiAgICAgKiBhYm91dCB1bnJlY29nbml6ZWQgcnVsZXMgbGlrZSBgb25VcGRhdGVMaW50aW5nYCwgYGRlbGF5YCwgYGxpbnRPbkNoYW5nZWAsIGV0Yy5cbiAgICAgKi9cbiAgICB2YXIgcGFzc09wdGlvbnMgPSBvcHRpb25zLm9wdGlvbnMgfHwgb3B0aW9ucztcbiAgICB2YXIgZ2V0QW5ub3RhdGlvbnMgPSBvcHRpb25zLmdldEFubm90YXRpb25zIHx8IGNtLmdldEhlbHBlcihDb2RlTWlycm9yLlBvcygwLCAwKSwgXCJsaW50XCIpO1xuICAgIGlmICghZ2V0QW5ub3RhdGlvbnMpIHJldHVybjtcbiAgICBpZiAob3B0aW9ucy5hc3luYyB8fCBnZXRBbm5vdGF0aW9ucy5hc3luYykge1xuICAgICAgbGludEFzeW5jKGNtLCBnZXRBbm5vdGF0aW9ucywgcGFzc09wdGlvbnMpXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBhbm5vdGF0aW9ucyA9IGdldEFubm90YXRpb25zKGNtLmdldFZhbHVlKCksIHBhc3NPcHRpb25zLCBjbSk7XG4gICAgICBpZiAoIWFubm90YXRpb25zKSByZXR1cm47XG4gICAgICBpZiAoYW5ub3RhdGlvbnMudGhlbikgYW5ub3RhdGlvbnMudGhlbihmdW5jdGlvbihpc3N1ZXMpIHtcbiAgICAgICAgY20ub3BlcmF0aW9uKGZ1bmN0aW9uKCkge3VwZGF0ZUxpbnRpbmcoY20sIGlzc3Vlcyl9KVxuICAgICAgfSk7XG4gICAgICBlbHNlIGNtLm9wZXJhdGlvbihmdW5jdGlvbigpIHt1cGRhdGVMaW50aW5nKGNtLCBhbm5vdGF0aW9ucyl9KVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUxpbnRpbmcoY20sIGFubm90YXRpb25zTm90U29ydGVkKSB7XG4gICAgY2xlYXJNYXJrcyhjbSk7XG4gICAgdmFyIHN0YXRlID0gY20uc3RhdGUubGludCwgb3B0aW9ucyA9IHN0YXRlLm9wdGlvbnM7XG5cbiAgICB2YXIgYW5ub3RhdGlvbnMgPSBncm91cEJ5TGluZShhbm5vdGF0aW9uc05vdFNvcnRlZCk7XG5cbiAgICBmb3IgKHZhciBsaW5lID0gMDsgbGluZSA8IGFubm90YXRpb25zLmxlbmd0aDsgKytsaW5lKSB7XG4gICAgICB2YXIgYW5ucyA9IGFubm90YXRpb25zW2xpbmVdO1xuICAgICAgaWYgKCFhbm5zKSBjb250aW51ZTtcblxuICAgICAgLy8gZmlsdGVyIG91dCBkdXBsaWNhdGUgbWVzc2FnZXNcbiAgICAgIHZhciBtZXNzYWdlID0gW107XG4gICAgICBhbm5zID0gYW5ucy5maWx0ZXIoZnVuY3Rpb24oaXRlbSkgeyByZXR1cm4gbWVzc2FnZS5pbmRleE9mKGl0ZW0ubWVzc2FnZSkgPiAtMSA/IGZhbHNlIDogbWVzc2FnZS5wdXNoKGl0ZW0ubWVzc2FnZSkgfSk7XG5cbiAgICAgIHZhciBtYXhTZXZlcml0eSA9IG51bGw7XG4gICAgICB2YXIgdGlwTGFiZWwgPSBzdGF0ZS5oYXNHdXR0ZXIgJiYgZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFubnMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGFubiA9IGFubnNbaV07XG4gICAgICAgIHZhciBzZXZlcml0eSA9IGFubi5zZXZlcml0eTtcbiAgICAgICAgaWYgKCFzZXZlcml0eSkgc2V2ZXJpdHkgPSBcImVycm9yXCI7XG4gICAgICAgIG1heFNldmVyaXR5ID0gZ2V0TWF4U2V2ZXJpdHkobWF4U2V2ZXJpdHksIHNldmVyaXR5KTtcblxuICAgICAgICBpZiAob3B0aW9ucy5mb3JtYXRBbm5vdGF0aW9uKSBhbm4gPSBvcHRpb25zLmZvcm1hdEFubm90YXRpb24oYW5uKTtcbiAgICAgICAgaWYgKHN0YXRlLmhhc0d1dHRlcikgdGlwTGFiZWwuYXBwZW5kQ2hpbGQoYW5ub3RhdGlvblRvb2x0aXAoYW5uKSk7XG5cbiAgICAgICAgaWYgKGFubi50bykgc3RhdGUubWFya2VkLnB1c2goY20ubWFya1RleHQoYW5uLmZyb20sIGFubi50bywge1xuICAgICAgICAgIGNsYXNzTmFtZTogXCJDb2RlTWlycm9yLWxpbnQtbWFyayBDb2RlTWlycm9yLWxpbnQtbWFyay1cIiArIHNldmVyaXR5LFxuICAgICAgICAgIF9fYW5ub3RhdGlvbjogYW5uXG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICAgIC8vIHVzZSBvcmlnaW5hbCBhbm5vdGF0aW9uc1tsaW5lXSB0byBzaG93IG11bHRpcGxlIG1lc3NhZ2VzXG4gICAgICBpZiAoc3RhdGUuaGFzR3V0dGVyKVxuICAgICAgICBjbS5zZXRHdXR0ZXJNYXJrZXIobGluZSwgR1VUVEVSX0lELCBtYWtlTWFya2VyKGNtLCB0aXBMYWJlbCwgbWF4U2V2ZXJpdHksIGFubm90YXRpb25zW2xpbmVdLmxlbmd0aCA+IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUub3B0aW9ucy50b29sdGlwcykpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5vblVwZGF0ZUxpbnRpbmcpIG9wdGlvbnMub25VcGRhdGVMaW50aW5nKGFubm90YXRpb25zTm90U29ydGVkLCBhbm5vdGF0aW9ucywgY20pO1xuICB9XG5cbiAgZnVuY3Rpb24gb25DaGFuZ2UoY20pIHtcbiAgICB2YXIgc3RhdGUgPSBjbS5zdGF0ZS5saW50O1xuICAgIGlmICghc3RhdGUpIHJldHVybjtcbiAgICBjbGVhclRpbWVvdXQoc3RhdGUudGltZW91dCk7XG4gICAgc3RhdGUudGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKXtzdGFydExpbnRpbmcoY20pO30sIHN0YXRlLm9wdGlvbnMuZGVsYXkgfHwgNTAwKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBvcHVwVG9vbHRpcHMoY20sIGFubm90YXRpb25zLCBlKSB7XG4gICAgdmFyIHRhcmdldCA9IGUudGFyZ2V0IHx8IGUuc3JjRWxlbWVudDtcbiAgICB2YXIgdG9vbHRpcCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFubm90YXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgYW5uID0gYW5ub3RhdGlvbnNbaV07XG4gICAgICB0b29sdGlwLmFwcGVuZENoaWxkKGFubm90YXRpb25Ub29sdGlwKGFubikpO1xuICAgIH1cbiAgICBzaG93VG9vbHRpcEZvcihjbSwgZSwgdG9vbHRpcCwgdGFyZ2V0KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uTW91c2VPdmVyKGNtLCBlKSB7XG4gICAgdmFyIHRhcmdldCA9IGUudGFyZ2V0IHx8IGUuc3JjRWxlbWVudDtcbiAgICBpZiAoIS9cXGJDb2RlTWlycm9yLWxpbnQtbWFyay0vLnRlc3QodGFyZ2V0LmNsYXNzTmFtZSkpIHJldHVybjtcbiAgICB2YXIgYm94ID0gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCB4ID0gKGJveC5sZWZ0ICsgYm94LnJpZ2h0KSAvIDIsIHkgPSAoYm94LnRvcCArIGJveC5ib3R0b20pIC8gMjtcbiAgICB2YXIgc3BhbnMgPSBjbS5maW5kTWFya3NBdChjbS5jb29yZHNDaGFyKHtsZWZ0OiB4LCB0b3A6IHl9LCBcImNsaWVudFwiKSk7XG5cbiAgICB2YXIgYW5ub3RhdGlvbnMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgYW5uID0gc3BhbnNbaV0uX19hbm5vdGF0aW9uO1xuICAgICAgaWYgKGFubikgYW5ub3RhdGlvbnMucHVzaChhbm4pO1xuICAgIH1cbiAgICBpZiAoYW5ub3RhdGlvbnMubGVuZ3RoKSBwb3B1cFRvb2x0aXBzKGNtLCBhbm5vdGF0aW9ucywgZSk7XG4gIH1cblxuICBDb2RlTWlycm9yLmRlZmluZU9wdGlvbihcImxpbnRcIiwgZmFsc2UsIGZ1bmN0aW9uKGNtLCB2YWwsIG9sZCkge1xuICAgIGlmIChvbGQgJiYgb2xkICE9IENvZGVNaXJyb3IuSW5pdCkge1xuICAgICAgY2xlYXJNYXJrcyhjbSk7XG4gICAgICBpZiAoY20uc3RhdGUubGludC5vcHRpb25zLmxpbnRPbkNoYW5nZSAhPT0gZmFsc2UpXG4gICAgICAgIGNtLm9mZihcImNoYW5nZVwiLCBvbkNoYW5nZSk7XG4gICAgICBDb2RlTWlycm9yLm9mZihjbS5nZXRXcmFwcGVyRWxlbWVudCgpLCBcIm1vdXNlb3ZlclwiLCBjbS5zdGF0ZS5saW50Lm9uTW91c2VPdmVyKTtcbiAgICAgIGNsZWFyVGltZW91dChjbS5zdGF0ZS5saW50LnRpbWVvdXQpO1xuICAgICAgZGVsZXRlIGNtLnN0YXRlLmxpbnQ7XG4gICAgfVxuXG4gICAgaWYgKHZhbCkge1xuICAgICAgdmFyIGd1dHRlcnMgPSBjbS5nZXRPcHRpb24oXCJndXR0ZXJzXCIpLCBoYXNMaW50R3V0dGVyID0gZmFsc2U7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGd1dHRlcnMubGVuZ3RoOyArK2kpIGlmIChndXR0ZXJzW2ldID09IEdVVFRFUl9JRCkgaGFzTGludEd1dHRlciA9IHRydWU7XG4gICAgICB2YXIgc3RhdGUgPSBjbS5zdGF0ZS5saW50ID0gbmV3IExpbnRTdGF0ZShjbSwgcGFyc2VPcHRpb25zKGNtLCB2YWwpLCBoYXNMaW50R3V0dGVyKTtcbiAgICAgIGlmIChzdGF0ZS5vcHRpb25zLmxpbnRPbkNoYW5nZSAhPT0gZmFsc2UpXG4gICAgICAgIGNtLm9uKFwiY2hhbmdlXCIsIG9uQ2hhbmdlKTtcbiAgICAgIGlmIChzdGF0ZS5vcHRpb25zLnRvb2x0aXBzICE9IGZhbHNlICYmIHN0YXRlLm9wdGlvbnMudG9vbHRpcHMgIT0gXCJndXR0ZXJcIilcbiAgICAgICAgQ29kZU1pcnJvci5vbihjbS5nZXRXcmFwcGVyRWxlbWVudCgpLCBcIm1vdXNlb3ZlclwiLCBzdGF0ZS5vbk1vdXNlT3Zlcik7XG5cbiAgICAgIHN0YXJ0TGludGluZyhjbSk7XG4gICAgfVxuICB9KTtcblxuICBDb2RlTWlycm9yLmRlZmluZUV4dGVuc2lvbihcInBlcmZvcm1MaW50XCIsIGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLnN0YXRlLmxpbnQpIHN0YXJ0TGludGluZyh0aGlzKTtcbiAgfSk7XG59KTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/codemirror/addon/lint/lint.js\n"); /***/ }), /***/ "./node_modules/codemirror/addon/lint/yaml-lint.js": -/*!*********************************************************!* +/*!*********************************************************!*\ !*** ./node_modules/codemirror/addon/lint/yaml-lint.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -133,17 +111,17 @@ eval("// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distribute /***/ }), /***/ "./node_modules/codemirror/addon/mode/multiplex.js": -/*!*********************************************************!* +/*!*********************************************************!*\ !*** ./node_modules/codemirror/addon/mode/multiplex.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { -eval("// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n if (true) // CommonJS\n mod(__webpack_require__(/*! ../../lib/codemirror */ \"./node_modules/codemirror/lib/codemirror.js\"));\n else {}\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.multiplexingMode = function(outer /*, others */) {\n // Others should be {open, close, mode [, delimStyle] [, innerStyle]} objects\n var others = Array.prototype.slice.call(arguments, 1);\n\n function indexOf(string, pattern, from, returnEnd) {\n if (typeof pattern == \"string\") {\n var found = string.indexOf(pattern, from);\n return returnEnd && found > -1 ? found + pattern.length : found;\n }\n var m = pattern.exec(from ? string.slice(from) : string);\n return m ? m.index + from + (returnEnd ? m[0].length : 0) : -1;\n }\n\n return {\n startState: function() {\n return {\n outer: CodeMirror.startState(outer),\n innerActive: null,\n inner: null\n };\n },\n\n copyState: function(state) {\n return {\n outer: CodeMirror.copyState(outer, state.outer),\n innerActive: state.innerActive,\n inner: state.innerActive && CodeMirror.copyState(state.innerActive.mode, state.inner)\n };\n },\n\n token: function(stream, state) {\n if (!state.innerActive) {\n var cutOff = Infinity, oldContent = stream.string;\n for (var i = 0; i < others.length; ++i) {\n var other = others[i];\n var found = indexOf(oldContent, other.open, stream.pos);\n if (found == stream.pos) {\n if (!other.parseDelimiters) stream.match(other.open);\n state.innerActive = other;\n\n // Get the outer indent, making sure to handle CodeMirror.Pass\n var outerIndent = 0;\n if (outer.indent) {\n var possibleOuterIndent = outer.indent(state.outer, \"\", \"\");\n if (possibleOuterIndent !== CodeMirror.Pass) outerIndent = possibleOuterIndent;\n }\n\n state.inner = CodeMirror.startState(other.mode, outerIndent);\n return other.delimStyle && (other.delimStyle + \" \" + other.delimStyle + \"-open\");\n } else if (found != -1 && found < cutOff) {\n cutOff = found;\n }\n }\n if (cutOff != Infinity) stream.string = oldContent.slice(0, cutOff);\n var outerToken = outer.token(stream, state.outer);\n if (cutOff != Infinity) stream.string = oldContent;\n return outerToken;\n } else {\n var curInner = state.innerActive, oldContent = stream.string;\n if (!curInner.close && stream.sol()) {\n state.innerActive = state.inner = null;\n return this.token(stream, state);\n }\n var found = curInner.close ? indexOf(oldContent, curInner.close, stream.pos, curInner.parseDelimiters) : -1;\n if (found == stream.pos && !curInner.parseDelimiters) {\n stream.match(curInner.close);\n state.innerActive = state.inner = null;\n return curInner.delimStyle && (curInner.delimStyle + \" \" + curInner.delimStyle + \"-close\");\n }\n if (found > -1) stream.string = oldContent.slice(0, found);\n var innerToken = curInner.mode.token(stream, state.inner);\n if (found > -1) stream.string = oldContent;\n\n if (found == stream.pos && curInner.parseDelimiters)\n state.innerActive = state.inner = null;\n\n if (curInner.innerStyle) {\n if (innerToken) innerToken = innerToken + \" \" + curInner.innerStyle;\n else innerToken = curInner.innerStyle;\n }\n\n return innerToken;\n }\n },\n\n indent: function(state, textAfter, line) {\n var mode = state.innerActive ? state.innerActive.mode : outer;\n if (!mode.indent) return CodeMirror.Pass;\n return mode.indent(state.innerActive ? state.inner : state.outer, textAfter, line);\n },\n\n blankLine: function(state) {\n var mode = state.innerActive ? state.innerActive.mode : outer;\n if (mode.blankLine) {\n mode.blankLine(state.innerActive ? state.inner : state.outer);\n }\n if (!state.innerActive) {\n for (var i = 0; i < others.length; ++i) {\n var other = others[i];\n if (other.open === \"\\n\") {\n state.innerActive = other;\n state.inner = CodeMirror.startState(other.mode, mode.indent ? mode.indent(state.outer, \"\", \"\") : 0);\n }\n }\n } else if (state.innerActive.close === \"\\n\") {\n state.innerActive = state.inner = null;\n }\n },\n\n electricChars: outer.electricChars,\n\n innerMode: function(state) {\n return state.inner ? {state: state.inner, mode: state.innerActive.mode} : {state: state.outer, mode: outer};\n }\n };\n};\n\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vbm9kZV9tb2R1bGVzL2NvZGVtaXJyb3IvYWRkb24vbW9kZS9tdWx0aXBsZXguanM/ZWIwYyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUVBO0FBQ0EsTUFBTSxJQUF1RDtBQUM3RCxRQUFRLG1CQUFPLENBQUMseUVBQXNCO0FBQ3RDLE9BQU8sRUFHYTtBQUNwQixDQUFDO0FBQ0Q7O0FBRUE7QUFDQSx1QkFBdUIsZ0RBQWdEO0FBQ3ZFOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLG1CQUFtQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLG1CQUFtQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7O0FBRUw7O0FBRUE7QUFDQSw0QkFBNEIsaURBQWlELElBQUk7QUFDakY7QUFDQTtBQUNBOztBQUVBLENBQUMiLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29kZW1pcnJvci9hZGRvbi9tb2RlL211bHRpcGxleC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvZGVNaXJyb3IsIGNvcHlyaWdodCAoYykgYnkgTWFyaWpuIEhhdmVyYmVrZSBhbmQgb3RoZXJzXG4vLyBEaXN0cmlidXRlZCB1bmRlciBhbiBNSVQgbGljZW5zZTogaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFXG5cbihmdW5jdGlvbihtb2QpIHtcbiAgaWYgKHR5cGVvZiBleHBvcnRzID09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG1vZHVsZSA9PSBcIm9iamVjdFwiKSAvLyBDb21tb25KU1xuICAgIG1vZChyZXF1aXJlKFwiLi4vLi4vbGliL2NvZGVtaXJyb3JcIikpO1xuICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSAvLyBBTURcbiAgICBkZWZpbmUoW1wiLi4vLi4vbGliL2NvZGVtaXJyb3JcIl0sIG1vZCk7XG4gIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnZcbiAgICBtb2QoQ29kZU1pcnJvcik7XG59KShmdW5jdGlvbihDb2RlTWlycm9yKSB7XG5cInVzZSBzdHJpY3RcIjtcblxuQ29kZU1pcnJvci5tdWx0aXBsZXhpbmdNb2RlID0gZnVuY3Rpb24ob3V0ZXIgLyosIG90aGVycyAqLykge1xuICAvLyBPdGhlcnMgc2hvdWxkIGJlIHtvcGVuLCBjbG9zZSwgbW9kZSBbLCBkZWxpbVN0eWxlXSBbLCBpbm5lclN0eWxlXX0gb2JqZWN0c1xuICB2YXIgb3RoZXJzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcblxuICBmdW5jdGlvbiBpbmRleE9mKHN0cmluZywgcGF0dGVybiwgZnJvbSwgcmV0dXJuRW5kKSB7XG4gICAgaWYgKHR5cGVvZiBwYXR0ZXJuID09IFwic3RyaW5nXCIpIHtcbiAgICAgIHZhciBmb3VuZCA9IHN0cmluZy5pbmRleE9mKHBhdHRlcm4sIGZyb20pO1xuICAgICAgcmV0dXJuIHJldHVybkVuZCAmJiBmb3VuZCA+IC0xID8gZm91bmQgKyBwYXR0ZXJuLmxlbmd0aCA6IGZvdW5kO1xuICAgIH1cbiAgICB2YXIgbSA9IHBhdHRlcm4uZXhlYyhmcm9tID8gc3RyaW5nLnNsaWNlKGZyb20pIDogc3RyaW5nKTtcbiAgICByZXR1cm4gbSA/IG0uaW5kZXggKyBmcm9tICsgKHJldHVybkVuZCA/IG1bMF0ubGVuZ3RoIDogMCkgOiAtMTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvdXRlcjogQ29kZU1pcnJvci5zdGFydFN0YXRlKG91dGVyKSxcbiAgICAgICAgaW5uZXJBY3RpdmU6IG51bGwsXG4gICAgICAgIGlubmVyOiBudWxsXG4gICAgICB9O1xuICAgIH0sXG5cbiAgICBjb3B5U3RhdGU6IGZ1bmN0aW9uKHN0YXRlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvdXRlcjogQ29kZU1pcnJvci5jb3B5U3RhdGUob3V0ZXIsIHN0YXRlLm91dGVyKSxcbiAgICAgICAgaW5uZXJBY3RpdmU6IHN0YXRlLmlubmVyQWN0aXZlLFxuICAgICAgICBpbm5lcjogc3RhdGUuaW5uZXJBY3RpdmUgJiYgQ29kZU1pcnJvci5jb3B5U3RhdGUoc3RhdGUuaW5uZXJBY3RpdmUubW9kZSwgc3RhdGUuaW5uZXIpXG4gICAgICB9O1xuICAgIH0sXG5cbiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkge1xuICAgICAgaWYgKCFzdGF0ZS5pbm5lckFjdGl2ZSkge1xuICAgICAgICB2YXIgY3V0T2ZmID0gSW5maW5pdHksIG9sZENvbnRlbnQgPSBzdHJlYW0uc3RyaW5nO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG90aGVycy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIHZhciBvdGhlciA9IG90aGVyc1tpXTtcbiAgICAgICAgICB2YXIgZm91bmQgPSBpbmRleE9mKG9sZENvbnRlbnQsIG90aGVyLm9wZW4sIHN0cmVhbS5wb3MpO1xuICAgICAgICAgIGlmIChmb3VuZCA9PSBzdHJlYW0ucG9zKSB7XG4gICAgICAgICAgICBpZiAoIW90aGVyLnBhcnNlRGVsaW1pdGVycykgc3RyZWFtLm1hdGNoKG90aGVyLm9wZW4pO1xuICAgICAgICAgICAgc3RhdGUuaW5uZXJBY3RpdmUgPSBvdGhlcjtcblxuICAgICAgICAgICAgLy8gR2V0IHRoZSBvdXRlciBpbmRlbnQsIG1ha2luZyBzdXJlIHRvIGhhbmRsZSBDb2RlTWlycm9yLlBhc3NcbiAgICAgICAgICAgIHZhciBvdXRlckluZGVudCA9IDA7XG4gICAgICAgICAgICBpZiAob3V0ZXIuaW5kZW50KSB7XG4gICAgICAgICAgICAgIHZhciBwb3NzaWJsZU91dGVySW5kZW50ID0gb3V0ZXIuaW5kZW50KHN0YXRlLm91dGVyLCBcIlwiLCBcIlwiKTtcbiAgICAgICAgICAgICAgaWYgKHBvc3NpYmxlT3V0ZXJJbmRlbnQgIT09IENvZGVNaXJyb3IuUGFzcykgb3V0ZXJJbmRlbnQgPSBwb3NzaWJsZU91dGVySW5kZW50O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdGF0ZS5pbm5lciA9IENvZGVNaXJyb3Iuc3RhcnRTdGF0ZShvdGhlci5tb2RlLCBvdXRlckluZGVudCk7XG4gICAgICAgICAgICByZXR1cm4gb3RoZXIuZGVsaW1TdHlsZSAmJiAob3RoZXIuZGVsaW1TdHlsZSArIFwiIFwiICsgb3RoZXIuZGVsaW1TdHlsZSArIFwiLW9wZW5cIik7XG4gICAgICAgICAgfSBlbHNlIGlmIChmb3VuZCAhPSAtMSAmJiBmb3VuZCA8IGN1dE9mZikge1xuICAgICAgICAgICAgY3V0T2ZmID0gZm91bmQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjdXRPZmYgIT0gSW5maW5pdHkpIHN0cmVhbS5zdHJpbmcgPSBvbGRDb250ZW50LnNsaWNlKDAsIGN1dE9mZik7XG4gICAgICAgIHZhciBvdXRlclRva2VuID0gb3V0ZXIudG9rZW4oc3RyZWFtLCBzdGF0ZS5vdXRlcik7XG4gICAgICAgIGlmIChjdXRPZmYgIT0gSW5maW5pdHkpIHN0cmVhbS5zdHJpbmcgPSBvbGRDb250ZW50O1xuICAgICAgICByZXR1cm4gb3V0ZXJUb2tlbjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBjdXJJbm5lciA9IHN0YXRlLmlubmVyQWN0aXZlLCBvbGRDb250ZW50ID0gc3RyZWFtLnN0cmluZztcbiAgICAgICAgaWYgKCFjdXJJbm5lci5jbG9zZSAmJiBzdHJlYW0uc29sKCkpIHtcbiAgICAgICAgICBzdGF0ZS5pbm5lckFjdGl2ZSA9IHN0YXRlLmlubmVyID0gbnVsbDtcbiAgICAgICAgICByZXR1cm4gdGhpcy50b2tlbihzdHJlYW0sIHN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZm91bmQgPSBjdXJJbm5lci5jbG9zZSA/IGluZGV4T2Yob2xkQ29udGVudCwgY3VySW5uZXIuY2xvc2UsIHN0cmVhbS5wb3MsIGN1cklubmVyLnBhcnNlRGVsaW1pdGVycykgOiAtMTtcbiAgICAgICAgaWYgKGZvdW5kID09IHN0cmVhbS5wb3MgJiYgIWN1cklubmVyLnBhcnNlRGVsaW1pdGVycykge1xuICAgICAgICAgIHN0cmVhbS5tYXRjaChjdXJJbm5lci5jbG9zZSk7XG4gICAgICAgICAgc3RhdGUuaW5uZXJBY3RpdmUgPSBzdGF0ZS5pbm5lciA9IG51bGw7XG4gICAgICAgICAgcmV0dXJuIGN1cklubmVyLmRlbGltU3R5bGUgJiYgKGN1cklubmVyLmRlbGltU3R5bGUgKyBcIiBcIiArIGN1cklubmVyLmRlbGltU3R5bGUgKyBcIi1jbG9zZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZm91bmQgPiAtMSkgc3RyZWFtLnN0cmluZyA9IG9sZENvbnRlbnQuc2xpY2UoMCwgZm91bmQpO1xuICAgICAgICB2YXIgaW5uZXJUb2tlbiA9IGN1cklubmVyLm1vZGUudG9rZW4oc3RyZWFtLCBzdGF0ZS5pbm5lcik7XG4gICAgICAgIGlmIChmb3VuZCA+IC0xKSBzdHJlYW0uc3RyaW5nID0gb2xkQ29udGVudDtcblxuICAgICAgICBpZiAoZm91bmQgPT0gc3RyZWFtLnBvcyAmJiBjdXJJbm5lci5wYXJzZURlbGltaXRlcnMpXG4gICAgICAgICAgc3RhdGUuaW5uZXJBY3RpdmUgPSBzdGF0ZS5pbm5lciA9IG51bGw7XG5cbiAgICAgICAgaWYgKGN1cklubmVyLmlubmVyU3R5bGUpIHtcbiAgICAgICAgICBpZiAoaW5uZXJUb2tlbikgaW5uZXJUb2tlbiA9IGlubmVyVG9rZW4gKyBcIiBcIiArIGN1cklubmVyLmlubmVyU3R5bGU7XG4gICAgICAgICAgZWxzZSBpbm5lclRva2VuID0gY3VySW5uZXIuaW5uZXJTdHlsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpbm5lclRva2VuO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBpbmRlbnQ6IGZ1bmN0aW9uKHN0YXRlLCB0ZXh0QWZ0ZXIsIGxpbmUpIHtcbiAgICAgIHZhciBtb2RlID0gc3RhdGUuaW5uZXJBY3RpdmUgPyBzdGF0ZS5pbm5lckFjdGl2ZS5tb2RlIDogb3V0ZXI7XG4gICAgICBpZiAoIW1vZGUuaW5kZW50KSByZXR1cm4gQ29kZU1pcnJvci5QYXNzO1xuICAgICAgcmV0dXJuIG1vZGUuaW5kZW50KHN0YXRlLmlubmVyQWN0aXZlID8gc3RhdGUuaW5uZXIgOiBzdGF0ZS5vdXRlciwgdGV4dEFmdGVyLCBsaW5lKTtcbiAgICB9LFxuXG4gICAgYmxhbmtMaW5lOiBmdW5jdGlvbihzdGF0ZSkge1xuICAgICAgdmFyIG1vZGUgPSBzdGF0ZS5pbm5lckFjdGl2ZSA/IHN0YXRlLmlubmVyQWN0aXZlLm1vZGUgOiBvdXRlcjtcbiAgICAgIGlmIChtb2RlLmJsYW5rTGluZSkge1xuICAgICAgICBtb2RlLmJsYW5rTGluZShzdGF0ZS5pbm5lckFjdGl2ZSA/IHN0YXRlLmlubmVyIDogc3RhdGUub3V0ZXIpO1xuICAgICAgfVxuICAgICAgaWYgKCFzdGF0ZS5pbm5lckFjdGl2ZSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG90aGVycy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIHZhciBvdGhlciA9IG90aGVyc1tpXTtcbiAgICAgICAgICBpZiAob3RoZXIub3BlbiA9PT0gXCJcXG5cIikge1xuICAgICAgICAgICAgc3RhdGUuaW5uZXJBY3RpdmUgPSBvdGhlcjtcbiAgICAgICAgICAgIHN0YXRlLmlubmVyID0gQ29kZU1pcnJvci5zdGFydFN0YXRlKG90aGVyLm1vZGUsIG1vZGUuaW5kZW50ID8gbW9kZS5pbmRlbnQoc3RhdGUub3V0ZXIsIFwiXCIsIFwiXCIpIDogMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlLmlubmVyQWN0aXZlLmNsb3NlID09PSBcIlxcblwiKSB7XG4gICAgICAgIHN0YXRlLmlubmVyQWN0aXZlID0gc3RhdGUuaW5uZXIgPSBudWxsO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBlbGVjdHJpY0NoYXJzOiBvdXRlci5lbGVjdHJpY0NoYXJzLFxuXG4gICAgaW5uZXJNb2RlOiBmdW5jdGlvbihzdGF0ZSkge1xuICAgICAgcmV0dXJuIHN0YXRlLmlubmVyID8ge3N0YXRlOiBzdGF0ZS5pbm5lciwgbW9kZTogc3RhdGUuaW5uZXJBY3RpdmUubW9kZX0gOiB7c3RhdGU6IHN0YXRlLm91dGVyLCBtb2RlOiBvdXRlcn07XG4gICAgfVxuICB9O1xufTtcblxufSk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/codemirror/addon/mode/multiplex.js\n"); +eval("// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n if (true) // CommonJS\n mod(__webpack_require__(/*! ../../lib/codemirror */ \"./node_modules/codemirror/lib/codemirror.js\"));\n else {}\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.multiplexingMode = function(outer /*, others */) {\n // Others should be {open, close, mode [, delimStyle] [, innerStyle] [, parseDelimiters]} objects\n var others = Array.prototype.slice.call(arguments, 1);\n\n function indexOf(string, pattern, from, returnEnd) {\n if (typeof pattern == \"string\") {\n var found = string.indexOf(pattern, from);\n return returnEnd && found > -1 ? found + pattern.length : found;\n }\n var m = pattern.exec(from ? string.slice(from) : string);\n return m ? m.index + from + (returnEnd ? m[0].length : 0) : -1;\n }\n\n return {\n startState: function() {\n return {\n outer: CodeMirror.startState(outer),\n innerActive: null,\n inner: null,\n startingInner: false\n };\n },\n\n copyState: function(state) {\n return {\n outer: CodeMirror.copyState(outer, state.outer),\n innerActive: state.innerActive,\n inner: state.innerActive && CodeMirror.copyState(state.innerActive.mode, state.inner),\n startingInner: state.startingInner\n };\n },\n\n token: function(stream, state) {\n if (!state.innerActive) {\n var cutOff = Infinity, oldContent = stream.string;\n for (var i = 0; i < others.length; ++i) {\n var other = others[i];\n var found = indexOf(oldContent, other.open, stream.pos);\n if (found == stream.pos) {\n if (!other.parseDelimiters) stream.match(other.open);\n state.startingInner = !!other.parseDelimiters\n state.innerActive = other;\n\n // Get the outer indent, making sure to handle CodeMirror.Pass\n var outerIndent = 0;\n if (outer.indent) {\n var possibleOuterIndent = outer.indent(state.outer, \"\", \"\");\n if (possibleOuterIndent !== CodeMirror.Pass) outerIndent = possibleOuterIndent;\n }\n\n state.inner = CodeMirror.startState(other.mode, outerIndent);\n return other.delimStyle && (other.delimStyle + \" \" + other.delimStyle + \"-open\");\n } else if (found != -1 && found < cutOff) {\n cutOff = found;\n }\n }\n if (cutOff != Infinity) stream.string = oldContent.slice(0, cutOff);\n var outerToken = outer.token(stream, state.outer);\n if (cutOff != Infinity) stream.string = oldContent;\n return outerToken;\n } else {\n var curInner = state.innerActive, oldContent = stream.string;\n if (!curInner.close && stream.sol()) {\n state.innerActive = state.inner = null;\n return this.token(stream, state);\n }\n var found = curInner.close && !state.startingInner ?\n indexOf(oldContent, curInner.close, stream.pos, curInner.parseDelimiters) : -1;\n if (found == stream.pos && !curInner.parseDelimiters) {\n stream.match(curInner.close);\n state.innerActive = state.inner = null;\n return curInner.delimStyle && (curInner.delimStyle + \" \" + curInner.delimStyle + \"-close\");\n }\n if (found > -1) stream.string = oldContent.slice(0, found);\n var innerToken = curInner.mode.token(stream, state.inner);\n if (found > -1) stream.string = oldContent;\n else if (stream.pos > stream.start) state.startingInner = false\n\n if (found == stream.pos && curInner.parseDelimiters)\n state.innerActive = state.inner = null;\n\n if (curInner.innerStyle) {\n if (innerToken) innerToken = innerToken + \" \" + curInner.innerStyle;\n else innerToken = curInner.innerStyle;\n }\n\n return innerToken;\n }\n },\n\n indent: function(state, textAfter, line) {\n var mode = state.innerActive ? state.innerActive.mode : outer;\n if (!mode.indent) return CodeMirror.Pass;\n return mode.indent(state.innerActive ? state.inner : state.outer, textAfter, line);\n },\n\n blankLine: function(state) {\n var mode = state.innerActive ? state.innerActive.mode : outer;\n if (mode.blankLine) {\n mode.blankLine(state.innerActive ? state.inner : state.outer);\n }\n if (!state.innerActive) {\n for (var i = 0; i < others.length; ++i) {\n var other = others[i];\n if (other.open === \"\\n\") {\n state.innerActive = other;\n state.inner = CodeMirror.startState(other.mode, mode.indent ? mode.indent(state.outer, \"\", \"\") : 0);\n }\n }\n } else if (state.innerActive.close === \"\\n\") {\n state.innerActive = state.inner = null;\n }\n },\n\n electricChars: outer.electricChars,\n\n innerMode: function(state) {\n return state.inner ? {state: state.inner, mode: state.innerActive.mode} : {state: state.outer, mode: outer};\n }\n };\n};\n\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vbm9kZV9tb2R1bGVzL2NvZGVtaXJyb3IvYWRkb24vbW9kZS9tdWx0aXBsZXguanM/ZWIwYyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUVBO0FBQ0EsTUFBTSxJQUF1RDtBQUM3RCxRQUFRLG1CQUFPLENBQUMseUVBQXNCO0FBQ3RDLE9BQU8sRUFHYTtBQUNwQixDQUFDO0FBQ0Q7O0FBRUE7QUFDQSx1QkFBdUIsb0VBQW9FO0FBQzNGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixtQkFBbUI7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixtQkFBbUI7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLOztBQUVMOztBQUVBO0FBQ0EsNEJBQTRCLGlEQUFpRCxJQUFJO0FBQ2pGO0FBQ0E7QUFDQTs7QUFFQSxDQUFDIiwiZmlsZSI6Ii4vbm9kZV9tb2R1bGVzL2NvZGVtaXJyb3IvYWRkb24vbW9kZS9tdWx0aXBsZXguanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb2RlTWlycm9yLCBjb3B5cmlnaHQgKGMpIGJ5IE1hcmlqbiBIYXZlcmJla2UgYW5kIG90aGVyc1xuLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHBzOi8vY29kZW1pcnJvci5uZXQvTElDRU5TRVxuXG4oZnVuY3Rpb24obW9kKSB7XG4gIGlmICh0eXBlb2YgZXhwb3J0cyA9PSBcIm9iamVjdFwiICYmIHR5cGVvZiBtb2R1bGUgPT0gXCJvYmplY3RcIikgLy8gQ29tbW9uSlNcbiAgICBtb2QocmVxdWlyZShcIi4uLy4uL2xpYi9jb2RlbWlycm9yXCIpKTtcbiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkgLy8gQU1EXG4gICAgZGVmaW5lKFtcIi4uLy4uL2xpYi9jb2RlbWlycm9yXCJdLCBtb2QpO1xuICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52XG4gICAgbW9kKENvZGVNaXJyb3IpO1xufSkoZnVuY3Rpb24oQ29kZU1pcnJvcikge1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbkNvZGVNaXJyb3IubXVsdGlwbGV4aW5nTW9kZSA9IGZ1bmN0aW9uKG91dGVyIC8qLCBvdGhlcnMgKi8pIHtcbiAgLy8gT3RoZXJzIHNob3VsZCBiZSB7b3BlbiwgY2xvc2UsIG1vZGUgWywgZGVsaW1TdHlsZV0gWywgaW5uZXJTdHlsZV0gWywgcGFyc2VEZWxpbWl0ZXJzXX0gb2JqZWN0c1xuICB2YXIgb3RoZXJzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcblxuICBmdW5jdGlvbiBpbmRleE9mKHN0cmluZywgcGF0dGVybiwgZnJvbSwgcmV0dXJuRW5kKSB7XG4gICAgaWYgKHR5cGVvZiBwYXR0ZXJuID09IFwic3RyaW5nXCIpIHtcbiAgICAgIHZhciBmb3VuZCA9IHN0cmluZy5pbmRleE9mKHBhdHRlcm4sIGZyb20pO1xuICAgICAgcmV0dXJuIHJldHVybkVuZCAmJiBmb3VuZCA+IC0xID8gZm91bmQgKyBwYXR0ZXJuLmxlbmd0aCA6IGZvdW5kO1xuICAgIH1cbiAgICB2YXIgbSA9IHBhdHRlcm4uZXhlYyhmcm9tID8gc3RyaW5nLnNsaWNlKGZyb20pIDogc3RyaW5nKTtcbiAgICByZXR1cm4gbSA/IG0uaW5kZXggKyBmcm9tICsgKHJldHVybkVuZCA/IG1bMF0ubGVuZ3RoIDogMCkgOiAtMTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvdXRlcjogQ29kZU1pcnJvci5zdGFydFN0YXRlKG91dGVyKSxcbiAgICAgICAgaW5uZXJBY3RpdmU6IG51bGwsXG4gICAgICAgIGlubmVyOiBudWxsLFxuICAgICAgICBzdGFydGluZ0lubmVyOiBmYWxzZVxuICAgICAgfTtcbiAgICB9LFxuXG4gICAgY29weVN0YXRlOiBmdW5jdGlvbihzdGF0ZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb3V0ZXI6IENvZGVNaXJyb3IuY29weVN0YXRlKG91dGVyLCBzdGF0ZS5vdXRlciksXG4gICAgICAgIGlubmVyQWN0aXZlOiBzdGF0ZS5pbm5lckFjdGl2ZSxcbiAgICAgICAgaW5uZXI6IHN0YXRlLmlubmVyQWN0aXZlICYmIENvZGVNaXJyb3IuY29weVN0YXRlKHN0YXRlLmlubmVyQWN0aXZlLm1vZGUsIHN0YXRlLmlubmVyKSxcbiAgICAgICAgc3RhcnRpbmdJbm5lcjogc3RhdGUuc3RhcnRpbmdJbm5lclxuICAgICAgfTtcbiAgICB9LFxuXG4gICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHtcbiAgICAgIGlmICghc3RhdGUuaW5uZXJBY3RpdmUpIHtcbiAgICAgICAgdmFyIGN1dE9mZiA9IEluZmluaXR5LCBvbGRDb250ZW50ID0gc3RyZWFtLnN0cmluZztcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvdGhlcnMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICB2YXIgb3RoZXIgPSBvdGhlcnNbaV07XG4gICAgICAgICAgdmFyIGZvdW5kID0gaW5kZXhPZihvbGRDb250ZW50LCBvdGhlci5vcGVuLCBzdHJlYW0ucG9zKTtcbiAgICAgICAgICBpZiAoZm91bmQgPT0gc3RyZWFtLnBvcykge1xuICAgICAgICAgICAgaWYgKCFvdGhlci5wYXJzZURlbGltaXRlcnMpIHN0cmVhbS5tYXRjaChvdGhlci5vcGVuKTtcbiAgICAgICAgICAgIHN0YXRlLnN0YXJ0aW5nSW5uZXIgPSAhIW90aGVyLnBhcnNlRGVsaW1pdGVyc1xuICAgICAgICAgICAgc3RhdGUuaW5uZXJBY3RpdmUgPSBvdGhlcjtcblxuICAgICAgICAgICAgLy8gR2V0IHRoZSBvdXRlciBpbmRlbnQsIG1ha2luZyBzdXJlIHRvIGhhbmRsZSBDb2RlTWlycm9yLlBhc3NcbiAgICAgICAgICAgIHZhciBvdXRlckluZGVudCA9IDA7XG4gICAgICAgICAgICBpZiAob3V0ZXIuaW5kZW50KSB7XG4gICAgICAgICAgICAgIHZhciBwb3NzaWJsZU91dGVySW5kZW50ID0gb3V0ZXIuaW5kZW50KHN0YXRlLm91dGVyLCBcIlwiLCBcIlwiKTtcbiAgICAgICAgICAgICAgaWYgKHBvc3NpYmxlT3V0ZXJJbmRlbnQgIT09IENvZGVNaXJyb3IuUGFzcykgb3V0ZXJJbmRlbnQgPSBwb3NzaWJsZU91dGVySW5kZW50O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdGF0ZS5pbm5lciA9IENvZGVNaXJyb3Iuc3RhcnRTdGF0ZShvdGhlci5tb2RlLCBvdXRlckluZGVudCk7XG4gICAgICAgICAgICByZXR1cm4gb3RoZXIuZGVsaW1TdHlsZSAmJiAob3RoZXIuZGVsaW1TdHlsZSArIFwiIFwiICsgb3RoZXIuZGVsaW1TdHlsZSArIFwiLW9wZW5cIik7XG4gICAgICAgICAgfSBlbHNlIGlmIChmb3VuZCAhPSAtMSAmJiBmb3VuZCA8IGN1dE9mZikge1xuICAgICAgICAgICAgY3V0T2ZmID0gZm91bmQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjdXRPZmYgIT0gSW5maW5pdHkpIHN0cmVhbS5zdHJpbmcgPSBvbGRDb250ZW50LnNsaWNlKDAsIGN1dE9mZik7XG4gICAgICAgIHZhciBvdXRlclRva2VuID0gb3V0ZXIudG9rZW4oc3RyZWFtLCBzdGF0ZS5vdXRlcik7XG4gICAgICAgIGlmIChjdXRPZmYgIT0gSW5maW5pdHkpIHN0cmVhbS5zdHJpbmcgPSBvbGRDb250ZW50O1xuICAgICAgICByZXR1cm4gb3V0ZXJUb2tlbjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBjdXJJbm5lciA9IHN0YXRlLmlubmVyQWN0aXZlLCBvbGRDb250ZW50ID0gc3RyZWFtLnN0cmluZztcbiAgICAgICAgaWYgKCFjdXJJbm5lci5jbG9zZSAmJiBzdHJlYW0uc29sKCkpIHtcbiAgICAgICAgICBzdGF0ZS5pbm5lckFjdGl2ZSA9IHN0YXRlLmlubmVyID0gbnVsbDtcbiAgICAgICAgICByZXR1cm4gdGhpcy50b2tlbihzdHJlYW0sIHN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZm91bmQgPSBjdXJJbm5lci5jbG9zZSAmJiAhc3RhdGUuc3RhcnRpbmdJbm5lciA/XG4gICAgICAgICAgICBpbmRleE9mKG9sZENvbnRlbnQsIGN1cklubmVyLmNsb3NlLCBzdHJlYW0ucG9zLCBjdXJJbm5lci5wYXJzZURlbGltaXRlcnMpIDogLTE7XG4gICAgICAgIGlmIChmb3VuZCA9PSBzdHJlYW0ucG9zICYmICFjdXJJbm5lci5wYXJzZURlbGltaXRlcnMpIHtcbiAgICAgICAgICBzdHJlYW0ubWF0Y2goY3VySW5uZXIuY2xvc2UpO1xuICAgICAgICAgIHN0YXRlLmlubmVyQWN0aXZlID0gc3RhdGUuaW5uZXIgPSBudWxsO1xuICAgICAgICAgIHJldHVybiBjdXJJbm5lci5kZWxpbVN0eWxlICYmIChjdXJJbm5lci5kZWxpbVN0eWxlICsgXCIgXCIgKyBjdXJJbm5lci5kZWxpbVN0eWxlICsgXCItY2xvc2VcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvdW5kID4gLTEpIHN0cmVhbS5zdHJpbmcgPSBvbGRDb250ZW50LnNsaWNlKDAsIGZvdW5kKTtcbiAgICAgICAgdmFyIGlubmVyVG9rZW4gPSBjdXJJbm5lci5tb2RlLnRva2VuKHN0cmVhbSwgc3RhdGUuaW5uZXIpO1xuICAgICAgICBpZiAoZm91bmQgPiAtMSkgc3RyZWFtLnN0cmluZyA9IG9sZENvbnRlbnQ7XG4gICAgICAgIGVsc2UgaWYgKHN0cmVhbS5wb3MgPiBzdHJlYW0uc3RhcnQpIHN0YXRlLnN0YXJ0aW5nSW5uZXIgPSBmYWxzZVxuXG4gICAgICAgIGlmIChmb3VuZCA9PSBzdHJlYW0ucG9zICYmIGN1cklubmVyLnBhcnNlRGVsaW1pdGVycylcbiAgICAgICAgICBzdGF0ZS5pbm5lckFjdGl2ZSA9IHN0YXRlLmlubmVyID0gbnVsbDtcblxuICAgICAgICBpZiAoY3VySW5uZXIuaW5uZXJTdHlsZSkge1xuICAgICAgICAgIGlmIChpbm5lclRva2VuKSBpbm5lclRva2VuID0gaW5uZXJUb2tlbiArIFwiIFwiICsgY3VySW5uZXIuaW5uZXJTdHlsZTtcbiAgICAgICAgICBlbHNlIGlubmVyVG9rZW4gPSBjdXJJbm5lci5pbm5lclN0eWxlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGlubmVyVG9rZW47XG4gICAgICB9XG4gICAgfSxcblxuICAgIGluZGVudDogZnVuY3Rpb24oc3RhdGUsIHRleHRBZnRlciwgbGluZSkge1xuICAgICAgdmFyIG1vZGUgPSBzdGF0ZS5pbm5lckFjdGl2ZSA/IHN0YXRlLmlubmVyQWN0aXZlLm1vZGUgOiBvdXRlcjtcbiAgICAgIGlmICghbW9kZS5pbmRlbnQpIHJldHVybiBDb2RlTWlycm9yLlBhc3M7XG4gICAgICByZXR1cm4gbW9kZS5pbmRlbnQoc3RhdGUuaW5uZXJBY3RpdmUgPyBzdGF0ZS5pbm5lciA6IHN0YXRlLm91dGVyLCB0ZXh0QWZ0ZXIsIGxpbmUpO1xuICAgIH0sXG5cbiAgICBibGFua0xpbmU6IGZ1bmN0aW9uKHN0YXRlKSB7XG4gICAgICB2YXIgbW9kZSA9IHN0YXRlLmlubmVyQWN0aXZlID8gc3RhdGUuaW5uZXJBY3RpdmUubW9kZSA6IG91dGVyO1xuICAgICAgaWYgKG1vZGUuYmxhbmtMaW5lKSB7XG4gICAgICAgIG1vZGUuYmxhbmtMaW5lKHN0YXRlLmlubmVyQWN0aXZlID8gc3RhdGUuaW5uZXIgOiBzdGF0ZS5vdXRlcik7XG4gICAgICB9XG4gICAgICBpZiAoIXN0YXRlLmlubmVyQWN0aXZlKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3RoZXJzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgdmFyIG90aGVyID0gb3RoZXJzW2ldO1xuICAgICAgICAgIGlmIChvdGhlci5vcGVuID09PSBcIlxcblwiKSB7XG4gICAgICAgICAgICBzdGF0ZS5pbm5lckFjdGl2ZSA9IG90aGVyO1xuICAgICAgICAgICAgc3RhdGUuaW5uZXIgPSBDb2RlTWlycm9yLnN0YXJ0U3RhdGUob3RoZXIubW9kZSwgbW9kZS5pbmRlbnQgPyBtb2RlLmluZGVudChzdGF0ZS5vdXRlciwgXCJcIiwgXCJcIikgOiAwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUuaW5uZXJBY3RpdmUuY2xvc2UgPT09IFwiXFxuXCIpIHtcbiAgICAgICAgc3RhdGUuaW5uZXJBY3RpdmUgPSBzdGF0ZS5pbm5lciA9IG51bGw7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGVsZWN0cmljQ2hhcnM6IG91dGVyLmVsZWN0cmljQ2hhcnMsXG5cbiAgICBpbm5lck1vZGU6IGZ1bmN0aW9uKHN0YXRlKSB7XG4gICAgICByZXR1cm4gc3RhdGUuaW5uZXIgPyB7c3RhdGU6IHN0YXRlLmlubmVyLCBtb2RlOiBzdGF0ZS5pbm5lckFjdGl2ZS5tb2RlfSA6IHtzdGF0ZTogc3RhdGUub3V0ZXIsIG1vZGU6IG91dGVyfTtcbiAgICB9XG4gIH07XG59O1xuXG59KTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/codemirror/addon/mode/multiplex.js\n"); /***/ }), /***/ "./node_modules/codemirror/addon/mode/overlay.js": -/*!*******************************************************!* +/*!*******************************************************!*\ !*** ./node_modules/codemirror/addon/mode/overlay.js ***! \*******************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -153,7 +131,7 @@ eval("// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distribute /***/ }), /***/ "./node_modules/codemirror/addon/selection/active-line.js": -/*!****************************************************************!* +/*!****************************************************************!*\ !*** ./node_modules/codemirror/addon/selection/active-line.js ***! \****************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -163,37 +141,37 @@ eval("// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distribute /***/ }), /***/ "./node_modules/codemirror/lib/codemirror.js": -/*!***************************************************!* +/*!***************************************************!*\ !*** ./node_modules/codemirror/lib/codemirror.js ***! \***************************************************/ /***/ (function(module) { -eval("// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// This is CodeMirror (https://codemirror.net), a code editor\n// implemented in JavaScript on top of the browser's DOM.\n//\n// You can find some technical background for some of the code below\n// at http://marijnhaverbeke.nl/blog/#cm-internals .\n\n(function (global, factory) {\n true ? module.exports = factory() :\n 0;\n}(this, (function () { 'use strict';\n\n // Kludges for bugs and behavior differences that can't be feature\n // detected are enabled based on userAgent etc sniffing.\n var userAgent = navigator.userAgent;\n var platform = navigator.platform;\n\n var gecko = /gecko\\/\\d/i.test(userAgent);\n var ie_upto10 = /MSIE \\d/.test(userAgent);\n var ie_11up = /Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(userAgent);\n var edge = /Edge\\/(\\d+)/.exec(userAgent);\n var ie = ie_upto10 || ie_11up || edge;\n var ie_version = ie && (ie_upto10 ? document.documentMode || 6 : +(edge || ie_11up)[1]);\n var webkit = !edge && /WebKit\\//.test(userAgent);\n var qtwebkit = webkit && /Qt\\/\\d+\\.\\d+/.test(userAgent);\n var chrome = !edge && /Chrome\\//.test(userAgent);\n var presto = /Opera\\//.test(userAgent);\n var safari = /Apple Computer/.test(navigator.vendor);\n var mac_geMountainLion = /Mac OS X 1\\d\\D([8-9]|\\d\\d)\\D/.test(userAgent);\n var phantom = /PhantomJS/.test(userAgent);\n\n var ios = !edge && /AppleWebKit/.test(userAgent) && /Mobile\\/\\w+/.test(userAgent);\n var android = /Android/.test(userAgent);\n // This is woefully incomplete. Suggestions for alternative methods welcome.\n var mobile = ios || android || /webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(userAgent);\n var mac = ios || /Mac/.test(platform);\n var chromeOS = /\\bCrOS\\b/.test(userAgent);\n var windows = /win/i.test(platform);\n\n var presto_version = presto && userAgent.match(/Version\\/(\\d*\\.\\d*)/);\n if (presto_version) { presto_version = Number(presto_version[1]); }\n if (presto_version && presto_version >= 15) { presto = false; webkit = true; }\n // Some browsers use the wrong event properties to signal cmd/ctrl on OS X\n var flipCtrlCmd = mac && (qtwebkit || presto && (presto_version == null || presto_version < 12.11));\n var captureRightClick = gecko || (ie && ie_version >= 9);\n\n function classTest(cls) { return new RegExp(\"(^|\\\\s)\" + cls + \"(?:$|\\\\s)\\\\s*\") }\n\n var rmClass = function(node, cls) {\n var current = node.className;\n var match = classTest(cls).exec(current);\n if (match) {\n var after = current.slice(match.index + match[0].length);\n node.className = current.slice(0, match.index) + (after ? match[1] + after : \"\");\n }\n };\n\n function removeChildren(e) {\n for (var count = e.childNodes.length; count > 0; --count)\n { e.removeChild(e.firstChild); }\n return e\n }\n\n function removeChildrenAndAdd(parent, e) {\n return removeChildren(parent).appendChild(e)\n }\n\n function elt(tag, content, className, style) {\n var e = document.createElement(tag);\n if (className) { e.className = className; }\n if (style) { e.style.cssText = style; }\n if (typeof content == \"string\") { e.appendChild(document.createTextNode(content)); }\n else if (content) { for (var i = 0; i < content.length; ++i) { e.appendChild(content[i]); } }\n return e\n }\n // wrapper for elt, which removes the elt from the accessibility tree\n function eltP(tag, content, className, style) {\n var e = elt(tag, content, className, style);\n e.setAttribute(\"role\", \"presentation\");\n return e\n }\n\n var range;\n if (document.createRange) { range = function(node, start, end, endNode) {\n var r = document.createRange();\n r.setEnd(endNode || node, end);\n r.setStart(node, start);\n return r\n }; }\n else { range = function(node, start, end) {\n var r = document.body.createTextRange();\n try { r.moveToElementText(node.parentNode); }\n catch(e) { return r }\n r.collapse(true);\n r.moveEnd(\"character\", end);\n r.moveStart(\"character\", start);\n return r\n }; }\n\n function contains(parent, child) {\n if (child.nodeType == 3) // Android browser always returns false when child is a textnode\n { child = child.parentNode; }\n if (parent.contains)\n { return parent.contains(child) }\n do {\n if (child.nodeType == 11) { child = child.host; }\n if (child == parent) { return true }\n } while (child = child.parentNode)\n }\n\n function activeElt() {\n // IE and Edge may throw an \"Unspecified Error\" when accessing document.activeElement.\n // IE < 10 will throw when accessed while the page is loading or in an iframe.\n // IE > 9 and Edge will throw when accessed in an iframe if document.body is unavailable.\n var activeElement;\n try {\n activeElement = document.activeElement;\n } catch(e) {\n activeElement = document.body || null;\n }\n while (activeElement && activeElement.shadowRoot && activeElement.shadowRoot.activeElement)\n { activeElement = activeElement.shadowRoot.activeElement; }\n return activeElement\n }\n\n function addClass(node, cls) {\n var current = node.className;\n if (!classTest(cls).test(current)) { node.className += (current ? \" \" : \"\") + cls; }\n }\n function joinClasses(a, b) {\n var as = a.split(\" \");\n for (var i = 0; i < as.length; i++)\n { if (as[i] && !classTest(as[i]).test(b)) { b += \" \" + as[i]; } }\n return b\n }\n\n var selectInput = function(node) { node.select(); };\n if (ios) // Mobile Safari apparently has a bug where select() is broken.\n { selectInput = function(node) { node.selectionStart = 0; node.selectionEnd = node.value.length; }; }\n else if (ie) // Suppress mysterious IE10 errors\n { selectInput = function(node) { try { node.select(); } catch(_e) {} }; }\n\n function bind(f) {\n var args = Array.prototype.slice.call(arguments, 1);\n return function(){return f.apply(null, args)}\n }\n\n function copyObj(obj, target, overwrite) {\n if (!target) { target = {}; }\n for (var prop in obj)\n { if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop)))\n { target[prop] = obj[prop]; } }\n return target\n }\n\n // Counts the column offset in a string, taking tabs into account.\n // Used mostly to find indentation.\n function countColumn(string, end, tabSize, startIndex, startValue) {\n if (end == null) {\n end = string.search(/[^\\s\\u00a0]/);\n if (end == -1) { end = string.length; }\n }\n for (var i = startIndex || 0, n = startValue || 0;;) {\n var nextTab = string.indexOf(\"\\t\", i);\n if (nextTab < 0 || nextTab >= end)\n { return n + (end - i) }\n n += nextTab - i;\n n += tabSize - (n % tabSize);\n i = nextTab + 1;\n }\n }\n\n var Delayed = function() {\n this.id = null;\n this.f = null;\n this.time = 0;\n this.handler = bind(this.onTimeout, this);\n };\n Delayed.prototype.onTimeout = function (self) {\n self.id = 0;\n if (self.time <= +new Date) {\n self.f();\n } else {\n setTimeout(self.handler, self.time - +new Date);\n }\n };\n Delayed.prototype.set = function (ms, f) {\n this.f = f;\n var time = +new Date + ms;\n if (!this.id || time < this.time) {\n clearTimeout(this.id);\n this.id = setTimeout(this.handler, ms);\n this.time = time;\n }\n };\n\n function indexOf(array, elt) {\n for (var i = 0; i < array.length; ++i)\n { if (array[i] == elt) { return i } }\n return -1\n }\n\n // Number of pixels added to scroller and sizer to hide scrollbar\n var scrollerGap = 50;\n\n // Returned or thrown by various protocols to signal 'I'm not\n // handling this'.\n var Pass = {toString: function(){return \"CodeMirror.Pass\"}};\n\n // Reused option objects for setSelection & friends\n var sel_dontScroll = {scroll: false}, sel_mouse = {origin: \"*mouse\"}, sel_move = {origin: \"+move\"};\n\n // The inverse of countColumn -- find the offset that corresponds to\n // a particular column.\n function findColumn(string, goal, tabSize) {\n for (var pos = 0, col = 0;;) {\n var nextTab = string.indexOf(\"\\t\", pos);\n if (nextTab == -1) { nextTab = string.length; }\n var skipped = nextTab - pos;\n if (nextTab == string.length || col + skipped >= goal)\n { return pos + Math.min(skipped, goal - col) }\n col += nextTab - pos;\n col += tabSize - (col % tabSize);\n pos = nextTab + 1;\n if (col >= goal) { return pos }\n }\n }\n\n var spaceStrs = [\"\"];\n function spaceStr(n) {\n while (spaceStrs.length <= n)\n { spaceStrs.push(lst(spaceStrs) + \" \"); }\n return spaceStrs[n]\n }\n\n function lst(arr) { return arr[arr.length-1] }\n\n function map(array, f) {\n var out = [];\n for (var i = 0; i < array.length; i++) { out[i] = f(array[i], i); }\n return out\n }\n\n function insertSorted(array, value, score) {\n var pos = 0, priority = score(value);\n while (pos < array.length && score(array[pos]) <= priority) { pos++; }\n array.splice(pos, 0, value);\n }\n\n function nothing() {}\n\n function createObj(base, props) {\n var inst;\n if (Object.create) {\n inst = Object.create(base);\n } else {\n nothing.prototype = base;\n inst = new nothing();\n }\n if (props) { copyObj(props, inst); }\n return inst\n }\n\n var nonASCIISingleCaseWordChar = /[\\u00df\\u0587\\u0590-\\u05f4\\u0600-\\u06ff\\u3040-\\u309f\\u30a0-\\u30ff\\u3400-\\u4db5\\u4e00-\\u9fcc\\uac00-\\ud7af]/;\n function isWordCharBasic(ch) {\n return /\\w/.test(ch) || ch > \"\\x80\" &&\n (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch))\n }\n function isWordChar(ch, helper) {\n if (!helper) { return isWordCharBasic(ch) }\n if (helper.source.indexOf(\"\\\\w\") > -1 && isWordCharBasic(ch)) { return true }\n return helper.test(ch)\n }\n\n function isEmpty(obj) {\n for (var n in obj) { if (obj.hasOwnProperty(n) && obj[n]) { return false } }\n return true\n }\n\n // Extending unicode characters. A series of a non-extending char +\n // any number of extending chars is treated as a single unit as far\n // as editing and measuring is concerned. This is not fully correct,\n // since some scripts/fonts/browsers also treat other configurations\n // of code points as a group.\n var extendingChars = /[\\u0300-\\u036f\\u0483-\\u0489\\u0591-\\u05bd\\u05bf\\u05c1\\u05c2\\u05c4\\u05c5\\u05c7\\u0610-\\u061a\\u064b-\\u065e\\u0670\\u06d6-\\u06dc\\u06de-\\u06e4\\u06e7\\u06e8\\u06ea-\\u06ed\\u0711\\u0730-\\u074a\\u07a6-\\u07b0\\u07eb-\\u07f3\\u0816-\\u0819\\u081b-\\u0823\\u0825-\\u0827\\u0829-\\u082d\\u0900-\\u0902\\u093c\\u0941-\\u0948\\u094d\\u0951-\\u0955\\u0962\\u0963\\u0981\\u09bc\\u09be\\u09c1-\\u09c4\\u09cd\\u09d7\\u09e2\\u09e3\\u0a01\\u0a02\\u0a3c\\u0a41\\u0a42\\u0a47\\u0a48\\u0a4b-\\u0a4d\\u0a51\\u0a70\\u0a71\\u0a75\\u0a81\\u0a82\\u0abc\\u0ac1-\\u0ac5\\u0ac7\\u0ac8\\u0acd\\u0ae2\\u0ae3\\u0b01\\u0b3c\\u0b3e\\u0b3f\\u0b41-\\u0b44\\u0b4d\\u0b56\\u0b57\\u0b62\\u0b63\\u0b82\\u0bbe\\u0bc0\\u0bcd\\u0bd7\\u0c3e-\\u0c40\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55\\u0c56\\u0c62\\u0c63\\u0cbc\\u0cbf\\u0cc2\\u0cc6\\u0ccc\\u0ccd\\u0cd5\\u0cd6\\u0ce2\\u0ce3\\u0d3e\\u0d41-\\u0d44\\u0d4d\\u0d57\\u0d62\\u0d63\\u0dca\\u0dcf\\u0dd2-\\u0dd4\\u0dd6\\u0ddf\\u0e31\\u0e34-\\u0e3a\\u0e47-\\u0e4e\\u0eb1\\u0eb4-\\u0eb9\\u0ebb\\u0ebc\\u0ec8-\\u0ecd\\u0f18\\u0f19\\u0f35\\u0f37\\u0f39\\u0f71-\\u0f7e\\u0f80-\\u0f84\\u0f86\\u0f87\\u0f90-\\u0f97\\u0f99-\\u0fbc\\u0fc6\\u102d-\\u1030\\u1032-\\u1037\\u1039\\u103a\\u103d\\u103e\\u1058\\u1059\\u105e-\\u1060\\u1071-\\u1074\\u1082\\u1085\\u1086\\u108d\\u109d\\u135f\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17b7-\\u17bd\\u17c6\\u17c9-\\u17d3\\u17dd\\u180b-\\u180d\\u18a9\\u1920-\\u1922\\u1927\\u1928\\u1932\\u1939-\\u193b\\u1a17\\u1a18\\u1a56\\u1a58-\\u1a5e\\u1a60\\u1a62\\u1a65-\\u1a6c\\u1a73-\\u1a7c\\u1a7f\\u1b00-\\u1b03\\u1b34\\u1b36-\\u1b3a\\u1b3c\\u1b42\\u1b6b-\\u1b73\\u1b80\\u1b81\\u1ba2-\\u1ba5\\u1ba8\\u1ba9\\u1c2c-\\u1c33\\u1c36\\u1c37\\u1cd0-\\u1cd2\\u1cd4-\\u1ce0\\u1ce2-\\u1ce8\\u1ced\\u1dc0-\\u1de6\\u1dfd-\\u1dff\\u200c\\u200d\\u20d0-\\u20f0\\u2cef-\\u2cf1\\u2de0-\\u2dff\\u302a-\\u302f\\u3099\\u309a\\ua66f-\\ua672\\ua67c\\ua67d\\ua6f0\\ua6f1\\ua802\\ua806\\ua80b\\ua825\\ua826\\ua8c4\\ua8e0-\\ua8f1\\ua926-\\ua92d\\ua947-\\ua951\\ua980-\\ua982\\ua9b3\\ua9b6-\\ua9b9\\ua9bc\\uaa29-\\uaa2e\\uaa31\\uaa32\\uaa35\\uaa36\\uaa43\\uaa4c\\uaab0\\uaab2-\\uaab4\\uaab7\\uaab8\\uaabe\\uaabf\\uaac1\\uabe5\\uabe8\\uabed\\udc00-\\udfff\\ufb1e\\ufe00-\\ufe0f\\ufe20-\\ufe26\\uff9e\\uff9f]/;\n function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendingChars.test(ch) }\n\n // Returns a number from the range [`0`; `str.length`] unless `pos` is outside that range.\n function skipExtendingChars(str, pos, dir) {\n while ((dir < 0 ? pos > 0 : pos < str.length) && isExtendingChar(str.charAt(pos))) { pos += dir; }\n return pos\n }\n\n // Returns the value from the range [`from`; `to`] that satisfies\n // `pred` and is closest to `from`. Assumes that at least `to`\n // satisfies `pred`. Supports `from` being greater than `to`.\n function findFirst(pred, from, to) {\n // At any point we are certain `to` satisfies `pred`, don't know\n // whether `from` does.\n var dir = from > to ? -1 : 1;\n for (;;) {\n if (from == to) { return from }\n var midF = (from + to) / 2, mid = dir < 0 ? Math.ceil(midF) : Math.floor(midF);\n if (mid == from) { return pred(mid) ? from : to }\n if (pred(mid)) { to = mid; }\n else { from = mid + dir; }\n }\n }\n\n // BIDI HELPERS\n\n function iterateBidiSections(order, from, to, f) {\n if (!order) { return f(from, to, \"ltr\", 0) }\n var found = false;\n for (var i = 0; i < order.length; ++i) {\n var part = order[i];\n if (part.from < to && part.to > from || from == to && part.to == from) {\n f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? \"rtl\" : \"ltr\", i);\n found = true;\n }\n }\n if (!found) { f(from, to, \"ltr\"); }\n }\n\n var bidiOther = null;\n function getBidiPartAt(order, ch, sticky) {\n var found;\n bidiOther = null;\n for (var i = 0; i < order.length; ++i) {\n var cur = order[i];\n if (cur.from < ch && cur.to > ch) { return i }\n if (cur.to == ch) {\n if (cur.from != cur.to && sticky == \"before\") { found = i; }\n else { bidiOther = i; }\n }\n if (cur.from == ch) {\n if (cur.from != cur.to && sticky != \"before\") { found = i; }\n else { bidiOther = i; }\n }\n }\n return found != null ? found : bidiOther\n }\n\n // Bidirectional ordering algorithm\n // See http://unicode.org/reports/tr9/tr9-13.html for the algorithm\n // that this (partially) implements.\n\n // One-char codes used for character types:\n // L (L): Left-to-Right\n // R (R): Right-to-Left\n // r (AL): Right-to-Left Arabic\n // 1 (EN): European Number\n // + (ES): European Number Separator\n // % (ET): European Number Terminator\n // n (AN): Arabic Number\n // , (CS): Common Number Separator\n // m (NSM): Non-Spacing Mark\n // b (BN): Boundary Neutral\n // s (B): Paragraph Separator\n // t (S): Segment Separator\n // w (WS): Whitespace\n // N (ON): Other Neutrals\n\n // Returns null if characters are ordered as they appear\n // (left-to-right), or an array of sections ({from, to, level}\n // objects) in the order in which they occur visually.\n var bidiOrdering = (function() {\n // Character types for codepoints 0 to 0xff\n var lowTypes = \"bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN\";\n // Character types for codepoints 0x600 to 0x6f9\n var arabicTypes = \"nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111\";\n function charType(code) {\n if (code <= 0xf7) { return lowTypes.charAt(code) }\n else if (0x590 <= code && code <= 0x5f4) { return \"R\" }\n else if (0x600 <= code && code <= 0x6f9) { return arabicTypes.charAt(code - 0x600) }\n else if (0x6ee <= code && code <= 0x8ac) { return \"r\" }\n else if (0x2000 <= code && code <= 0x200b) { return \"w\" }\n else if (code == 0x200c) { return \"b\" }\n else { return \"L\" }\n }\n\n var bidiRE = /[\\u0590-\\u05f4\\u0600-\\u06ff\\u0700-\\u08ac]/;\n var isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/;\n\n function BidiSpan(level, from, to) {\n this.level = level;\n this.from = from; this.to = to;\n }\n\n return function(str, direction) {\n var outerType = direction == \"ltr\" ? \"L\" : \"R\";\n\n if (str.length == 0 || direction == \"ltr\" && !bidiRE.test(str)) { return false }\n var len = str.length, types = [];\n for (var i = 0; i < len; ++i)\n { types.push(charType(str.charCodeAt(i))); }\n\n // W1. Examine each non-spacing mark (NSM) in the level run, and\n // change the type of the NSM to the type of the previous\n // character. If the NSM is at the start of the level run, it will\n // get the type of sor.\n for (var i$1 = 0, prev = outerType; i$1 < len; ++i$1) {\n var type = types[i$1];\n if (type == \"m\") { types[i$1] = prev; }\n else { prev = type; }\n }\n\n // W2. Search backwards from each instance of a European number\n // until the first strong type (R, L, AL, or sor) is found. If an\n // AL is found, change the type of the European number to Arabic\n // number.\n // W3. Change all ALs to R.\n for (var i$2 = 0, cur = outerType; i$2 < len; ++i$2) {\n var type$1 = types[i$2];\n if (type$1 == \"1\" && cur == \"r\") { types[i$2] = \"n\"; }\n else if (isStrong.test(type$1)) { cur = type$1; if (type$1 == \"r\") { types[i$2] = \"R\"; } }\n }\n\n // W4. A single European separator between two European numbers\n // changes to a European number. A single common separator between\n // two numbers of the same type changes to that type.\n for (var i$3 = 1, prev$1 = types[0]; i$3 < len - 1; ++i$3) {\n var type$2 = types[i$3];\n if (type$2 == \"+\" && prev$1 == \"1\" && types[i$3+1] == \"1\") { types[i$3] = \"1\"; }\n else if (type$2 == \",\" && prev$1 == types[i$3+1] &&\n (prev$1 == \"1\" || prev$1 == \"n\")) { types[i$3] = prev$1; }\n prev$1 = type$2;\n }\n\n // W5. A sequence of European terminators adjacent to European\n // numbers changes to all European numbers.\n // W6. Otherwise, separators and terminators change to Other\n // Neutral.\n for (var i$4 = 0; i$4 < len; ++i$4) {\n var type$3 = types[i$4];\n if (type$3 == \",\") { types[i$4] = \"N\"; }\n else if (type$3 == \"%\") {\n var end = (void 0);\n for (end = i$4 + 1; end < len && types[end] == \"%\"; ++end) {}\n var replace = (i$4 && types[i$4-1] == \"!\") || (end < len && types[end] == \"1\") ? \"1\" : \"N\";\n for (var j = i$4; j < end; ++j) { types[j] = replace; }\n i$4 = end - 1;\n }\n }\n\n // W7. Search backwards from each instance of a European number\n // until the first strong type (R, L, or sor) is found. If an L is\n // found, then change the type of the European number to L.\n for (var i$5 = 0, cur$1 = outerType; i$5 < len; ++i$5) {\n var type$4 = types[i$5];\n if (cur$1 == \"L\" && type$4 == \"1\") { types[i$5] = \"L\"; }\n else if (isStrong.test(type$4)) { cur$1 = type$4; }\n }\n\n // N1. A sequence of neutrals takes the direction of the\n // surrounding strong text if the text on both sides has the same\n // direction. European and Arabic numbers act as if they were R in\n // terms of their influence on neutrals. Start-of-level-run (sor)\n // and end-of-level-run (eor) are used at level run boundaries.\n // N2. Any remaining neutrals take the embedding direction.\n for (var i$6 = 0; i$6 < len; ++i$6) {\n if (isNeutral.test(types[i$6])) {\n var end$1 = (void 0);\n for (end$1 = i$6 + 1; end$1 < len && isNeutral.test(types[end$1]); ++end$1) {}\n var before = (i$6 ? types[i$6-1] : outerType) == \"L\";\n var after = (end$1 < len ? types[end$1] : outerType) == \"L\";\n var replace$1 = before == after ? (before ? \"L\" : \"R\") : outerType;\n for (var j$1 = i$6; j$1 < end$1; ++j$1) { types[j$1] = replace$1; }\n i$6 = end$1 - 1;\n }\n }\n\n // Here we depart from the documented algorithm, in order to avoid\n // building up an actual levels array. Since there are only three\n // levels (0, 1, 2) in an implementation that doesn't take\n // explicit embedding into account, we can build up the order on\n // the fly, without following the level-based algorithm.\n var order = [], m;\n for (var i$7 = 0; i$7 < len;) {\n if (countsAsLeft.test(types[i$7])) {\n var start = i$7;\n for (++i$7; i$7 < len && countsAsLeft.test(types[i$7]); ++i$7) {}\n order.push(new BidiSpan(0, start, i$7));\n } else {\n var pos = i$7, at = order.length, isRTL = direction == \"rtl\" ? 1 : 0;\n for (++i$7; i$7 < len && types[i$7] != \"L\"; ++i$7) {}\n for (var j$2 = pos; j$2 < i$7;) {\n if (countsAsNum.test(types[j$2])) {\n if (pos < j$2) { order.splice(at, 0, new BidiSpan(1, pos, j$2)); at += isRTL; }\n var nstart = j$2;\n for (++j$2; j$2 < i$7 && countsAsNum.test(types[j$2]); ++j$2) {}\n order.splice(at, 0, new BidiSpan(2, nstart, j$2));\n at += isRTL;\n pos = j$2;\n } else { ++j$2; }\n }\n if (pos < i$7) { order.splice(at, 0, new BidiSpan(1, pos, i$7)); }\n }\n }\n if (direction == \"ltr\") {\n if (order[0].level == 1 && (m = str.match(/^\\s+/))) {\n order[0].from = m[0].length;\n order.unshift(new BidiSpan(0, 0, m[0].length));\n }\n if (lst(order).level == 1 && (m = str.match(/\\s+$/))) {\n lst(order).to -= m[0].length;\n order.push(new BidiSpan(0, len - m[0].length, len));\n }\n }\n\n return direction == \"rtl\" ? order.reverse() : order\n }\n })();\n\n // Get the bidi ordering for the given line (and cache it). Returns\n // false for lines that are fully left-to-right, and an array of\n // BidiSpan objects otherwise.\n function getOrder(line, direction) {\n var order = line.order;\n if (order == null) { order = line.order = bidiOrdering(line.text, direction); }\n return order\n }\n\n // EVENT HANDLING\n\n // Lightweight event framework. on/off also work on DOM nodes,\n // registering native DOM handlers.\n\n var noHandlers = [];\n\n var on = function(emitter, type, f) {\n if (emitter.addEventListener) {\n emitter.addEventListener(type, f, false);\n } else if (emitter.attachEvent) {\n emitter.attachEvent(\"on\" + type, f);\n } else {\n var map = emitter._handlers || (emitter._handlers = {});\n map[type] = (map[type] || noHandlers).concat(f);\n }\n };\n\n function getHandlers(emitter, type) {\n return emitter._handlers && emitter._handlers[type] || noHandlers\n }\n\n function off(emitter, type, f) {\n if (emitter.removeEventListener) {\n emitter.removeEventListener(type, f, false);\n } else if (emitter.detachEvent) {\n emitter.detachEvent(\"on\" + type, f);\n } else {\n var map = emitter._handlers, arr = map && map[type];\n if (arr) {\n var index = indexOf(arr, f);\n if (index > -1)\n { map[type] = arr.slice(0, index).concat(arr.slice(index + 1)); }\n }\n }\n }\n\n function signal(emitter, type /*, values...*/) {\n var handlers = getHandlers(emitter, type);\n if (!handlers.length) { return }\n var args = Array.prototype.slice.call(arguments, 2);\n for (var i = 0; i < handlers.length; ++i) { handlers[i].apply(null, args); }\n }\n\n // The DOM events that CodeMirror handles can be overridden by\n // registering a (non-DOM) handler on the editor for the event name,\n // and preventDefault-ing the event in that handler.\n function signalDOMEvent(cm, e, override) {\n if (typeof e == \"string\")\n { e = {type: e, preventDefault: function() { this.defaultPrevented = true; }}; }\n signal(cm, override || e.type, cm, e);\n return e_defaultPrevented(e) || e.codemirrorIgnore\n }\n\n function signalCursorActivity(cm) {\n var arr = cm._handlers && cm._handlers.cursorActivity;\n if (!arr) { return }\n var set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = []);\n for (var i = 0; i < arr.length; ++i) { if (indexOf(set, arr[i]) == -1)\n { set.push(arr[i]); } }\n }\n\n function hasHandler(emitter, type) {\n return getHandlers(emitter, type).length > 0\n }\n\n // Add on and off methods to a constructor's prototype, to make\n // registering events on such objects more convenient.\n function eventMixin(ctor) {\n ctor.prototype.on = function(type, f) {on(this, type, f);};\n ctor.prototype.off = function(type, f) {off(this, type, f);};\n }\n\n // Due to the fact that we still support jurassic IE versions, some\n // compatibility wrappers are needed.\n\n function e_preventDefault(e) {\n if (e.preventDefault) { e.preventDefault(); }\n else { e.returnValue = false; }\n }\n function e_stopPropagation(e) {\n if (e.stopPropagation) { e.stopPropagation(); }\n else { e.cancelBubble = true; }\n }\n function e_defaultPrevented(e) {\n return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false\n }\n function e_stop(e) {e_preventDefault(e); e_stopPropagation(e);}\n\n function e_target(e) {return e.target || e.srcElement}\n function e_button(e) {\n var b = e.which;\n if (b == null) {\n if (e.button & 1) { b = 1; }\n else if (e.button & 2) { b = 3; }\n else if (e.button & 4) { b = 2; }\n }\n if (mac && e.ctrlKey && b == 1) { b = 3; }\n return b\n }\n\n // Detect drag-and-drop\n var dragAndDrop = function() {\n // There is *some* kind of drag-and-drop support in IE6-8, but I\n // couldn't get it to work yet.\n if (ie && ie_version < 9) { return false }\n var div = elt('div');\n return \"draggable\" in div || \"dragDrop\" in div\n }();\n\n var zwspSupported;\n function zeroWidthElement(measure) {\n if (zwspSupported == null) {\n var test = elt(\"span\", \"\\u200b\");\n removeChildrenAndAdd(measure, elt(\"span\", [test, document.createTextNode(\"x\")]));\n if (measure.firstChild.offsetHeight != 0)\n { zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !(ie && ie_version < 8); }\n }\n var node = zwspSupported ? elt(\"span\", \"\\u200b\") :\n elt(\"span\", \"\\u00a0\", null, \"display: inline-block; width: 1px; margin-right: -1px\");\n node.setAttribute(\"cm-text\", \"\");\n return node\n }\n\n // Feature-detect IE's crummy client rect reporting for bidi text\n var badBidiRects;\n function hasBadBidiRects(measure) {\n if (badBidiRects != null) { return badBidiRects }\n var txt = removeChildrenAndAdd(measure, document.createTextNode(\"A\\u062eA\"));\n var r0 = range(txt, 0, 1).getBoundingClientRect();\n var r1 = range(txt, 1, 2).getBoundingClientRect();\n removeChildren(measure);\n if (!r0 || r0.left == r0.right) { return false } // Safari returns null in some cases (#2780)\n return badBidiRects = (r1.right - r0.right < 3)\n }\n\n // See if \"\".split is the broken IE version, if so, provide an\n // alternative way to split lines.\n var splitLinesAuto = \"\\n\\nb\".split(/\\n/).length != 3 ? function (string) {\n var pos = 0, result = [], l = string.length;\n while (pos <= l) {\n var nl = string.indexOf(\"\\n\", pos);\n if (nl == -1) { nl = string.length; }\n var line = string.slice(pos, string.charAt(nl - 1) == \"\\r\" ? nl - 1 : nl);\n var rt = line.indexOf(\"\\r\");\n if (rt != -1) {\n result.push(line.slice(0, rt));\n pos += rt + 1;\n } else {\n result.push(line);\n pos = nl + 1;\n }\n }\n return result\n } : function (string) { return string.split(/\\r\\n?|\\n/); };\n\n var hasSelection = window.getSelection ? function (te) {\n try { return te.selectionStart != te.selectionEnd }\n catch(e) { return false }\n } : function (te) {\n var range;\n try {range = te.ownerDocument.selection.createRange();}\n catch(e) {}\n if (!range || range.parentElement() != te) { return false }\n return range.compareEndPoints(\"StartToEnd\", range) != 0\n };\n\n var hasCopyEvent = (function () {\n var e = elt(\"div\");\n if (\"oncopy\" in e) { return true }\n e.setAttribute(\"oncopy\", \"return;\");\n return typeof e.oncopy == \"function\"\n })();\n\n var badZoomedRects = null;\n function hasBadZoomedRects(measure) {\n if (badZoomedRects != null) { return badZoomedRects }\n var node = removeChildrenAndAdd(measure, elt(\"span\", \"x\"));\n var normal = node.getBoundingClientRect();\n var fromRange = range(node, 0, 1).getBoundingClientRect();\n return badZoomedRects = Math.abs(normal.left - fromRange.left) > 1\n }\n\n // Known modes, by name and by MIME\n var modes = {}, mimeModes = {};\n\n // Extra arguments are stored as the mode's dependencies, which is\n // used by (legacy) mechanisms like loadmode.js to automatically\n // load a mode. (Preferred mechanism is the require/define calls.)\n function defineMode(name, mode) {\n if (arguments.length > 2)\n { mode.dependencies = Array.prototype.slice.call(arguments, 2); }\n modes[name] = mode;\n }\n\n function defineMIME(mime, spec) {\n mimeModes[mime] = spec;\n }\n\n // Given a MIME type, a {name, ...options} config object, or a name\n // string, return a mode config object.\n function resolveMode(spec) {\n if (typeof spec == \"string\" && mimeModes.hasOwnProperty(spec)) {\n spec = mimeModes[spec];\n } else if (spec && typeof spec.name == \"string\" && mimeModes.hasOwnProperty(spec.name)) {\n var found = mimeModes[spec.name];\n if (typeof found == \"string\") { found = {name: found}; }\n spec = createObj(found, spec);\n spec.name = found.name;\n } else if (typeof spec == \"string\" && /^[\\w\\-]+\\/[\\w\\-]+\\+xml$/.test(spec)) {\n return resolveMode(\"application/xml\")\n } else if (typeof spec == \"string\" && /^[\\w\\-]+\\/[\\w\\-]+\\+json$/.test(spec)) {\n return resolveMode(\"application/json\")\n }\n if (typeof spec == \"string\") { return {name: spec} }\n else { return spec || {name: \"null\"} }\n }\n\n // Given a mode spec (anything that resolveMode accepts), find and\n // initialize an actual mode object.\n function getMode(options, spec) {\n spec = resolveMode(spec);\n var mfactory = modes[spec.name];\n if (!mfactory) { return getMode(options, \"text/plain\") }\n var modeObj = mfactory(options, spec);\n if (modeExtensions.hasOwnProperty(spec.name)) {\n var exts = modeExtensions[spec.name];\n for (var prop in exts) {\n if (!exts.hasOwnProperty(prop)) { continue }\n if (modeObj.hasOwnProperty(prop)) { modeObj[\"_\" + prop] = modeObj[prop]; }\n modeObj[prop] = exts[prop];\n }\n }\n modeObj.name = spec.name;\n if (spec.helperType) { modeObj.helperType = spec.helperType; }\n if (spec.modeProps) { for (var prop$1 in spec.modeProps)\n { modeObj[prop$1] = spec.modeProps[prop$1]; } }\n\n return modeObj\n }\n\n // This can be used to attach properties to mode objects from\n // outside the actual mode definition.\n var modeExtensions = {};\n function extendMode(mode, properties) {\n var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {});\n copyObj(properties, exts);\n }\n\n function copyState(mode, state) {\n if (state === true) { return state }\n if (mode.copyState) { return mode.copyState(state) }\n var nstate = {};\n for (var n in state) {\n var val = state[n];\n if (val instanceof Array) { val = val.concat([]); }\n nstate[n] = val;\n }\n return nstate\n }\n\n // Given a mode and a state (for that mode), find the inner mode and\n // state at the position that the state refers to.\n function innerMode(mode, state) {\n var info;\n while (mode.innerMode) {\n info = mode.innerMode(state);\n if (!info || info.mode == mode) { break }\n state = info.state;\n mode = info.mode;\n }\n return info || {mode: mode, state: state}\n }\n\n function startState(mode, a1, a2) {\n return mode.startState ? mode.startState(a1, a2) : true\n }\n\n // STRING STREAM\n\n // Fed to the mode parsers, provides helper functions to make\n // parsers more succinct.\n\n var StringStream = function(string, tabSize, lineOracle) {\n this.pos = this.start = 0;\n this.string = string;\n this.tabSize = tabSize || 8;\n this.lastColumnPos = this.lastColumnValue = 0;\n this.lineStart = 0;\n this.lineOracle = lineOracle;\n };\n\n StringStream.prototype.eol = function () {return this.pos >= this.string.length};\n StringStream.prototype.sol = function () {return this.pos == this.lineStart};\n StringStream.prototype.peek = function () {return this.string.charAt(this.pos) || undefined};\n StringStream.prototype.next = function () {\n if (this.pos < this.string.length)\n { return this.string.charAt(this.pos++) }\n };\n StringStream.prototype.eat = function (match) {\n var ch = this.string.charAt(this.pos);\n var ok;\n if (typeof match == \"string\") { ok = ch == match; }\n else { ok = ch && (match.test ? match.test(ch) : match(ch)); }\n if (ok) {++this.pos; return ch}\n };\n StringStream.prototype.eatWhile = function (match) {\n var start = this.pos;\n while (this.eat(match)){}\n return this.pos > start\n };\n StringStream.prototype.eatSpace = function () {\n var start = this.pos;\n while (/[\\s\\u00a0]/.test(this.string.charAt(this.pos))) { ++this.pos; }\n return this.pos > start\n };\n StringStream.prototype.skipToEnd = function () {this.pos = this.string.length;};\n StringStream.prototype.skipTo = function (ch) {\n var found = this.string.indexOf(ch, this.pos);\n if (found > -1) {this.pos = found; return true}\n };\n StringStream.prototype.backUp = function (n) {this.pos -= n;};\n StringStream.prototype.column = function () {\n if (this.lastColumnPos < this.start) {\n this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue);\n this.lastColumnPos = this.start;\n }\n return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0)\n };\n StringStream.prototype.indentation = function () {\n return countColumn(this.string, null, this.tabSize) -\n (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0)\n };\n StringStream.prototype.match = function (pattern, consume, caseInsensitive) {\n if (typeof pattern == \"string\") {\n var cased = function (str) { return caseInsensitive ? str.toLowerCase() : str; };\n var substr = this.string.substr(this.pos, pattern.length);\n if (cased(substr) == cased(pattern)) {\n if (consume !== false) { this.pos += pattern.length; }\n return true\n }\n } else {\n var match = this.string.slice(this.pos).match(pattern);\n if (match && match.index > 0) { return null }\n if (match && consume !== false) { this.pos += match[0].length; }\n return match\n }\n };\n StringStream.prototype.current = function (){return this.string.slice(this.start, this.pos)};\n StringStream.prototype.hideFirstChars = function (n, inner) {\n this.lineStart += n;\n try { return inner() }\n finally { this.lineStart -= n; }\n };\n StringStream.prototype.lookAhead = function (n) {\n var oracle = this.lineOracle;\n return oracle && oracle.lookAhead(n)\n };\n StringStream.prototype.baseToken = function () {\n var oracle = this.lineOracle;\n return oracle && oracle.baseToken(this.pos)\n };\n\n // Find the line object corresponding to the given line number.\n function getLine(doc, n) {\n n -= doc.first;\n if (n < 0 || n >= doc.size) { throw new Error(\"There is no line \" + (n + doc.first) + \" in the document.\") }\n var chunk = doc;\n while (!chunk.lines) {\n for (var i = 0;; ++i) {\n var child = chunk.children[i], sz = child.chunkSize();\n if (n < sz) { chunk = child; break }\n n -= sz;\n }\n }\n return chunk.lines[n]\n }\n\n // Get the part of a document between two positions, as an array of\n // strings.\n function getBetween(doc, start, end) {\n var out = [], n = start.line;\n doc.iter(start.line, end.line + 1, function (line) {\n var text = line.text;\n if (n == end.line) { text = text.slice(0, end.ch); }\n if (n == start.line) { text = text.slice(start.ch); }\n out.push(text);\n ++n;\n });\n return out\n }\n // Get the lines between from and to, as array of strings.\n function getLines(doc, from, to) {\n var out = [];\n doc.iter(from, to, function (line) { out.push(line.text); }); // iter aborts when callback returns truthy value\n return out\n }\n\n // Update the height of a line, propagating the height change\n // upwards to parent nodes.\n function updateLineHeight(line, height) {\n var diff = height - line.height;\n if (diff) { for (var n = line; n; n = n.parent) { n.height += diff; } }\n }\n\n // Given a line object, find its line number by walking up through\n // its parent links.\n function lineNo(line) {\n if (line.parent == null) { return null }\n var cur = line.parent, no = indexOf(cur.lines, line);\n for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) {\n for (var i = 0;; ++i) {\n if (chunk.children[i] == cur) { break }\n no += chunk.children[i].chunkSize();\n }\n }\n return no + cur.first\n }\n\n // Find the line at the given vertical position, using the height\n // information in the document tree.\n function lineAtHeight(chunk, h) {\n var n = chunk.first;\n outer: do {\n for (var i$1 = 0; i$1 < chunk.children.length; ++i$1) {\n var child = chunk.children[i$1], ch = child.height;\n if (h < ch) { chunk = child; continue outer }\n h -= ch;\n n += child.chunkSize();\n }\n return n\n } while (!chunk.lines)\n var i = 0;\n for (; i < chunk.lines.length; ++i) {\n var line = chunk.lines[i], lh = line.height;\n if (h < lh) { break }\n h -= lh;\n }\n return n + i\n }\n\n function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size}\n\n function lineNumberFor(options, i) {\n return String(options.lineNumberFormatter(i + options.firstLineNumber))\n }\n\n // A Pos instance represents a position within the text.\n function Pos(line, ch, sticky) {\n if ( sticky === void 0 ) sticky = null;\n\n if (!(this instanceof Pos)) { return new Pos(line, ch, sticky) }\n this.line = line;\n this.ch = ch;\n this.sticky = sticky;\n }\n\n // Compare two positions, return 0 if they are the same, a negative\n // number when a is less, and a positive number otherwise.\n function cmp(a, b) { return a.line - b.line || a.ch - b.ch }\n\n function equalCursorPos(a, b) { return a.sticky == b.sticky && cmp(a, b) == 0 }\n\n function copyPos(x) {return Pos(x.line, x.ch)}\n function maxPos(a, b) { return cmp(a, b) < 0 ? b : a }\n function minPos(a, b) { return cmp(a, b) < 0 ? a : b }\n\n // Most of the external API clips given positions to make sure they\n // actually exist within the document.\n function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1))}\n function clipPos(doc, pos) {\n if (pos.line < doc.first) { return Pos(doc.first, 0) }\n var last = doc.first + doc.size - 1;\n if (pos.line > last) { return Pos(last, getLine(doc, last).text.length) }\n return clipToLen(pos, getLine(doc, pos.line).text.length)\n }\n function clipToLen(pos, linelen) {\n var ch = pos.ch;\n if (ch == null || ch > linelen) { return Pos(pos.line, linelen) }\n else if (ch < 0) { return Pos(pos.line, 0) }\n else { return pos }\n }\n function clipPosArray(doc, array) {\n var out = [];\n for (var i = 0; i < array.length; i++) { out[i] = clipPos(doc, array[i]); }\n return out\n }\n\n var SavedContext = function(state, lookAhead) {\n this.state = state;\n this.lookAhead = lookAhead;\n };\n\n var Context = function(doc, state, line, lookAhead) {\n this.state = state;\n this.doc = doc;\n this.line = line;\n this.maxLookAhead = lookAhead || 0;\n this.baseTokens = null;\n this.baseTokenPos = 1;\n };\n\n Context.prototype.lookAhead = function (n) {\n var line = this.doc.getLine(this.line + n);\n if (line != null && n > this.maxLookAhead) { this.maxLookAhead = n; }\n return line\n };\n\n Context.prototype.baseToken = function (n) {\n if (!this.baseTokens) { return null }\n while (this.baseTokens[this.baseTokenPos] <= n)\n { this.baseTokenPos += 2; }\n var type = this.baseTokens[this.baseTokenPos + 1];\n return {type: type && type.replace(/( |^)overlay .*/, \"\"),\n size: this.baseTokens[this.baseTokenPos] - n}\n };\n\n Context.prototype.nextLine = function () {\n this.line++;\n if (this.maxLookAhead > 0) { this.maxLookAhead--; }\n };\n\n Context.fromSaved = function (doc, saved, line) {\n if (saved instanceof SavedContext)\n { return new Context(doc, copyState(doc.mode, saved.state), line, saved.lookAhead) }\n else\n { return new Context(doc, copyState(doc.mode, saved), line) }\n };\n\n Context.prototype.save = function (copy) {\n var state = copy !== false ? copyState(this.doc.mode, this.state) : this.state;\n return this.maxLookAhead > 0 ? new SavedContext(state, this.maxLookAhead) : state\n };\n\n\n // Compute a style array (an array starting with a mode generation\n // -- for invalidation -- followed by pairs of end positions and\n // style strings), which is used to highlight the tokens on the\n // line.\n function highlightLine(cm, line, context, forceToEnd) {\n // A styles array always starts with a number identifying the\n // mode/overlays that it is based on (for easy invalidation).\n var st = [cm.state.modeGen], lineClasses = {};\n // Compute the base array of styles\n runMode(cm, line.text, cm.doc.mode, context, function (end, style) { return st.push(end, style); },\n lineClasses, forceToEnd);\n var state = context.state;\n\n // Run overlays, adjust style array.\n var loop = function ( o ) {\n context.baseTokens = st;\n var overlay = cm.state.overlays[o], i = 1, at = 0;\n context.state = true;\n runMode(cm, line.text, overlay.mode, context, function (end, style) {\n var start = i;\n // Ensure there's a token end at the current position, and that i points at it\n while (at < end) {\n var i_end = st[i];\n if (i_end > end)\n { st.splice(i, 1, end, st[i+1], i_end); }\n i += 2;\n at = Math.min(end, i_end);\n }\n if (!style) { return }\n if (overlay.opaque) {\n st.splice(start, i - start, end, \"overlay \" + style);\n i = start + 2;\n } else {\n for (; start < i; start += 2) {\n var cur = st[start+1];\n st[start+1] = (cur ? cur + \" \" : \"\") + \"overlay \" + style;\n }\n }\n }, lineClasses);\n context.state = state;\n context.baseTokens = null;\n context.baseTokenPos = 1;\n };\n\n for (var o = 0; o < cm.state.overlays.length; ++o) loop( o );\n\n return {styles: st, classes: lineClasses.bgClass || lineClasses.textClass ? lineClasses : null}\n }\n\n function getLineStyles(cm, line, updateFrontier) {\n if (!line.styles || line.styles[0] != cm.state.modeGen) {\n var context = getContextBefore(cm, lineNo(line));\n var resetState = line.text.length > cm.options.maxHighlightLength && copyState(cm.doc.mode, context.state);\n var result = highlightLine(cm, line, context);\n if (resetState) { context.state = resetState; }\n line.stateAfter = context.save(!resetState);\n line.styles = result.styles;\n if (result.classes) { line.styleClasses = result.classes; }\n else if (line.styleClasses) { line.styleClasses = null; }\n if (updateFrontier === cm.doc.highlightFrontier)\n { cm.doc.modeFrontier = Math.max(cm.doc.modeFrontier, ++cm.doc.highlightFrontier); }\n }\n return line.styles\n }\n\n function getContextBefore(cm, n, precise) {\n var doc = cm.doc, display = cm.display;\n if (!doc.mode.startState) { return new Context(doc, true, n) }\n var start = findStartLine(cm, n, precise);\n var saved = start > doc.first && getLine(doc, start - 1).stateAfter;\n var context = saved ? Context.fromSaved(doc, saved, start) : new Context(doc, startState(doc.mode), start);\n\n doc.iter(start, n, function (line) {\n processLine(cm, line.text, context);\n var pos = context.line;\n line.stateAfter = pos == n - 1 || pos % 5 == 0 || pos >= display.viewFrom && pos < display.viewTo ? context.save() : null;\n context.nextLine();\n });\n if (precise) { doc.modeFrontier = context.line; }\n return context\n }\n\n // Lightweight form of highlight -- proceed over this line and\n // update state, but don't save a style array. Used for lines that\n // aren't currently visible.\n function processLine(cm, text, context, startAt) {\n var mode = cm.doc.mode;\n var stream = new StringStream(text, cm.options.tabSize, context);\n stream.start = stream.pos = startAt || 0;\n if (text == \"\") { callBlankLine(mode, context.state); }\n while (!stream.eol()) {\n readToken(mode, stream, context.state);\n stream.start = stream.pos;\n }\n }\n\n function callBlankLine(mode, state) {\n if (mode.blankLine) { return mode.blankLine(state) }\n if (!mode.innerMode) { return }\n var inner = innerMode(mode, state);\n if (inner.mode.blankLine) { return inner.mode.blankLine(inner.state) }\n }\n\n function readToken(mode, stream, state, inner) {\n for (var i = 0; i < 10; i++) {\n if (inner) { inner[0] = innerMode(mode, state).mode; }\n var style = mode.token(stream, state);\n if (stream.pos > stream.start) { return style }\n }\n throw new Error(\"Mode \" + mode.name + \" failed to advance stream.\")\n }\n\n var Token = function(stream, type, state) {\n this.start = stream.start; this.end = stream.pos;\n this.string = stream.current();\n this.type = type || null;\n this.state = state;\n };\n\n // Utility for getTokenAt and getLineTokens\n function takeToken(cm, pos, precise, asArray) {\n var doc = cm.doc, mode = doc.mode, style;\n pos = clipPos(doc, pos);\n var line = getLine(doc, pos.line), context = getContextBefore(cm, pos.line, precise);\n var stream = new StringStream(line.text, cm.options.tabSize, context), tokens;\n if (asArray) { tokens = []; }\n while ((asArray || stream.pos < pos.ch) && !stream.eol()) {\n stream.start = stream.pos;\n style = readToken(mode, stream, context.state);\n if (asArray) { tokens.push(new Token(stream, style, copyState(doc.mode, context.state))); }\n }\n return asArray ? tokens : new Token(stream, style, context.state)\n }\n\n function extractLineClasses(type, output) {\n if (type) { for (;;) {\n var lineClass = type.match(/(?:^|\\s+)line-(background-)?(\\S+)/);\n if (!lineClass) { break }\n type = type.slice(0, lineClass.index) + type.slice(lineClass.index + lineClass[0].length);\n var prop = lineClass[1] ? \"bgClass\" : \"textClass\";\n if (output[prop] == null)\n { output[prop] = lineClass[2]; }\n else if (!(new RegExp(\"(?:^|\\\\s)\" + lineClass[2] + \"(?:$|\\\\s)\")).test(output[prop]))\n { output[prop] += \" \" + lineClass[2]; }\n } }\n return type\n }\n\n // Run the given mode's parser over a line, calling f for each token.\n function runMode(cm, text, mode, context, f, lineClasses, forceToEnd) {\n var flattenSpans = mode.flattenSpans;\n if (flattenSpans == null) { flattenSpans = cm.options.flattenSpans; }\n var curStart = 0, curStyle = null;\n var stream = new StringStream(text, cm.options.tabSize, context), style;\n var inner = cm.options.addModeClass && [null];\n if (text == \"\") { extractLineClasses(callBlankLine(mode, context.state), lineClasses); }\n while (!stream.eol()) {\n if (stream.pos > cm.options.maxHighlightLength) {\n flattenSpans = false;\n if (forceToEnd) { processLine(cm, text, context, stream.pos); }\n stream.pos = text.length;\n style = null;\n } else {\n style = extractLineClasses(readToken(mode, stream, context.state, inner), lineClasses);\n }\n if (inner) {\n var mName = inner[0].name;\n if (mName) { style = \"m-\" + (style ? mName + \" \" + style : mName); }\n }\n if (!flattenSpans || curStyle != style) {\n while (curStart < stream.start) {\n curStart = Math.min(stream.start, curStart + 5000);\n f(curStart, curStyle);\n }\n curStyle = style;\n }\n stream.start = stream.pos;\n }\n while (curStart < stream.pos) {\n // Webkit seems to refuse to render text nodes longer than 57444\n // characters, and returns inaccurate measurements in nodes\n // starting around 5000 chars.\n var pos = Math.min(stream.pos, curStart + 5000);\n f(pos, curStyle);\n curStart = pos;\n }\n }\n\n // Finds the line to start with when starting a parse. Tries to\n // find a line with a stateAfter, so that it can start with a\n // valid state. If that fails, it returns the line with the\n // smallest indentation, which tends to need the least context to\n // parse correctly.\n function findStartLine(cm, n, precise) {\n var minindent, minline, doc = cm.doc;\n var lim = precise ? -1 : n - (cm.doc.mode.innerMode ? 1000 : 100);\n for (var search = n; search > lim; --search) {\n if (search <= doc.first) { return doc.first }\n var line = getLine(doc, search - 1), after = line.stateAfter;\n if (after && (!precise || search + (after instanceof SavedContext ? after.lookAhead : 0) <= doc.modeFrontier))\n { return search }\n var indented = countColumn(line.text, null, cm.options.tabSize);\n if (minline == null || minindent > indented) {\n minline = search - 1;\n minindent = indented;\n }\n }\n return minline\n }\n\n function retreatFrontier(doc, n) {\n doc.modeFrontier = Math.min(doc.modeFrontier, n);\n if (doc.highlightFrontier < n - 10) { return }\n var start = doc.first;\n for (var line = n - 1; line > start; line--) {\n var saved = getLine(doc, line).stateAfter;\n // change is on 3\n // state on line 1 looked ahead 2 -- so saw 3\n // test 1 + 2 < 3 should cover this\n if (saved && (!(saved instanceof SavedContext) || line + saved.lookAhead < n)) {\n start = line + 1;\n break\n }\n }\n doc.highlightFrontier = Math.min(doc.highlightFrontier, start);\n }\n\n // Optimize some code when these features are not used.\n var sawReadOnlySpans = false, sawCollapsedSpans = false;\n\n function seeReadOnlySpans() {\n sawReadOnlySpans = true;\n }\n\n function seeCollapsedSpans() {\n sawCollapsedSpans = true;\n }\n\n // TEXTMARKER SPANS\n\n function MarkedSpan(marker, from, to) {\n this.marker = marker;\n this.from = from; this.to = to;\n }\n\n // Search an array of spans for a span matching the given marker.\n function getMarkedSpanFor(spans, marker) {\n if (spans) { for (var i = 0; i < spans.length; ++i) {\n var span = spans[i];\n if (span.marker == marker) { return span }\n } }\n }\n // Remove a span from an array, returning undefined if no spans are\n // left (we don't store arrays for lines without spans).\n function removeMarkedSpan(spans, span) {\n var r;\n for (var i = 0; i < spans.length; ++i)\n { if (spans[i] != span) { (r || (r = [])).push(spans[i]); } }\n return r\n }\n // Add a span to a line.\n function addMarkedSpan(line, span) {\n line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span];\n span.marker.attachLine(line);\n }\n\n // Used for the algorithm that adjusts markers for a change in the\n // document. These functions cut an array of spans at a given\n // character position, returning an array of remaining chunks (or\n // undefined if nothing remains).\n function markedSpansBefore(old, startCh, isInsert) {\n var nw;\n if (old) { for (var i = 0; i < old.length; ++i) {\n var span = old[i], marker = span.marker;\n var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh);\n if (startsBefore || span.from == startCh && marker.type == \"bookmark\" && (!isInsert || !span.marker.insertLeft)) {\n var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh)\n ;(nw || (nw = [])).push(new MarkedSpan(marker, span.from, endsAfter ? null : span.to));\n }\n } }\n return nw\n }\n function markedSpansAfter(old, endCh, isInsert) {\n var nw;\n if (old) { for (var i = 0; i < old.length; ++i) {\n var span = old[i], marker = span.marker;\n var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh);\n if (endsAfter || span.from == endCh && marker.type == \"bookmark\" && (!isInsert || span.marker.insertLeft)) {\n var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh)\n ;(nw || (nw = [])).push(new MarkedSpan(marker, startsBefore ? null : span.from - endCh,\n span.to == null ? null : span.to - endCh));\n }\n } }\n return nw\n }\n\n // Given a change object, compute the new set of marker spans that\n // cover the line in which the change took place. Removes spans\n // entirely within the change, reconnects spans belonging to the\n // same marker that appear on both sides of the change, and cuts off\n // spans partially within the change. Returns an array of span\n // arrays with one element for each line in (after) the change.\n function stretchSpansOverChange(doc, change) {\n if (change.full) { return null }\n var oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans;\n var oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans;\n if (!oldFirst && !oldLast) { return null }\n\n var startCh = change.from.ch, endCh = change.to.ch, isInsert = cmp(change.from, change.to) == 0;\n // Get the spans that 'stick out' on both sides\n var first = markedSpansBefore(oldFirst, startCh, isInsert);\n var last = markedSpansAfter(oldLast, endCh, isInsert);\n\n // Next, merge those two ends\n var sameLine = change.text.length == 1, offset = lst(change.text).length + (sameLine ? startCh : 0);\n if (first) {\n // Fix up .to properties of first\n for (var i = 0; i < first.length; ++i) {\n var span = first[i];\n if (span.to == null) {\n var found = getMarkedSpanFor(last, span.marker);\n if (!found) { span.to = startCh; }\n else if (sameLine) { span.to = found.to == null ? null : found.to + offset; }\n }\n }\n }\n if (last) {\n // Fix up .from in last (or move them into first in case of sameLine)\n for (var i$1 = 0; i$1 < last.length; ++i$1) {\n var span$1 = last[i$1];\n if (span$1.to != null) { span$1.to += offset; }\n if (span$1.from == null) {\n var found$1 = getMarkedSpanFor(first, span$1.marker);\n if (!found$1) {\n span$1.from = offset;\n if (sameLine) { (first || (first = [])).push(span$1); }\n }\n } else {\n span$1.from += offset;\n if (sameLine) { (first || (first = [])).push(span$1); }\n }\n }\n }\n // Make sure we didn't create any zero-length spans\n if (first) { first = clearEmptySpans(first); }\n if (last && last != first) { last = clearEmptySpans(last); }\n\n var newMarkers = [first];\n if (!sameLine) {\n // Fill gap with whole-line-spans\n var gap = change.text.length - 2, gapMarkers;\n if (gap > 0 && first)\n { for (var i$2 = 0; i$2 < first.length; ++i$2)\n { if (first[i$2].to == null)\n { (gapMarkers || (gapMarkers = [])).push(new MarkedSpan(first[i$2].marker, null, null)); } } }\n for (var i$3 = 0; i$3 < gap; ++i$3)\n { newMarkers.push(gapMarkers); }\n newMarkers.push(last);\n }\n return newMarkers\n }\n\n // Remove spans that are empty and don't have a clearWhenEmpty\n // option of false.\n function clearEmptySpans(spans) {\n for (var i = 0; i < spans.length; ++i) {\n var span = spans[i];\n if (span.from != null && span.from == span.to && span.marker.clearWhenEmpty !== false)\n { spans.splice(i--, 1); }\n }\n if (!spans.length) { return null }\n return spans\n }\n\n // Used to 'clip' out readOnly ranges when making a change.\n function removeReadOnlyRanges(doc, from, to) {\n var markers = null;\n doc.iter(from.line, to.line + 1, function (line) {\n if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) {\n var mark = line.markedSpans[i].marker;\n if (mark.readOnly && (!markers || indexOf(markers, mark) == -1))\n { (markers || (markers = [])).push(mark); }\n } }\n });\n if (!markers) { return null }\n var parts = [{from: from, to: to}];\n for (var i = 0; i < markers.length; ++i) {\n var mk = markers[i], m = mk.find(0);\n for (var j = 0; j < parts.length; ++j) {\n var p = parts[j];\n if (cmp(p.to, m.from) < 0 || cmp(p.from, m.to) > 0) { continue }\n var newParts = [j, 1], dfrom = cmp(p.from, m.from), dto = cmp(p.to, m.to);\n if (dfrom < 0 || !mk.inclusiveLeft && !dfrom)\n { newParts.push({from: p.from, to: m.from}); }\n if (dto > 0 || !mk.inclusiveRight && !dto)\n { newParts.push({from: m.to, to: p.to}); }\n parts.splice.apply(parts, newParts);\n j += newParts.length - 3;\n }\n }\n return parts\n }\n\n // Connect or disconnect spans from a line.\n function detachMarkedSpans(line) {\n var spans = line.markedSpans;\n if (!spans) { return }\n for (var i = 0; i < spans.length; ++i)\n { spans[i].marker.detachLine(line); }\n line.markedSpans = null;\n }\n function attachMarkedSpans(line, spans) {\n if (!spans) { return }\n for (var i = 0; i < spans.length; ++i)\n { spans[i].marker.attachLine(line); }\n line.markedSpans = spans;\n }\n\n // Helpers used when computing which overlapping collapsed span\n // counts as the larger one.\n function extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0 }\n function extraRight(marker) { return marker.inclusiveRight ? 1 : 0 }\n\n // Returns a number indicating which of two overlapping collapsed\n // spans is larger (and thus includes the other). Falls back to\n // comparing ids when the spans cover exactly the same range.\n function compareCollapsedMarkers(a, b) {\n var lenDiff = a.lines.length - b.lines.length;\n if (lenDiff != 0) { return lenDiff }\n var aPos = a.find(), bPos = b.find();\n var fromCmp = cmp(aPos.from, bPos.from) || extraLeft(a) - extraLeft(b);\n if (fromCmp) { return -fromCmp }\n var toCmp = cmp(aPos.to, bPos.to) || extraRight(a) - extraRight(b);\n if (toCmp) { return toCmp }\n return b.id - a.id\n }\n\n // Find out whether a line ends or starts in a collapsed span. If\n // so, return the marker for that span.\n function collapsedSpanAtSide(line, start) {\n var sps = sawCollapsedSpans && line.markedSpans, found;\n if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) {\n sp = sps[i];\n if (sp.marker.collapsed && (start ? sp.from : sp.to) == null &&\n (!found || compareCollapsedMarkers(found, sp.marker) < 0))\n { found = sp.marker; }\n } }\n return found\n }\n function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, true) }\n function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, false) }\n\n function collapsedSpanAround(line, ch) {\n var sps = sawCollapsedSpans && line.markedSpans, found;\n if (sps) { for (var i = 0; i < sps.length; ++i) {\n var sp = sps[i];\n if (sp.marker.collapsed && (sp.from == null || sp.from < ch) && (sp.to == null || sp.to > ch) &&\n (!found || compareCollapsedMarkers(found, sp.marker) < 0)) { found = sp.marker; }\n } }\n return found\n }\n\n // Test whether there exists a collapsed span that partially\n // overlaps (covers the start or end, but not both) of a new span.\n // Such overlap is not allowed.\n function conflictingCollapsedRange(doc, lineNo, from, to, marker) {\n var line = getLine(doc, lineNo);\n var sps = sawCollapsedSpans && line.markedSpans;\n if (sps) { for (var i = 0; i < sps.length; ++i) {\n var sp = sps[i];\n if (!sp.marker.collapsed) { continue }\n var found = sp.marker.find(0);\n var fromCmp = cmp(found.from, from) || extraLeft(sp.marker) - extraLeft(marker);\n var toCmp = cmp(found.to, to) || extraRight(sp.marker) - extraRight(marker);\n if (fromCmp >= 0 && toCmp <= 0 || fromCmp <= 0 && toCmp >= 0) { continue }\n if (fromCmp <= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.to, from) >= 0 : cmp(found.to, from) > 0) ||\n fromCmp >= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.from, to) <= 0 : cmp(found.from, to) < 0))\n { return true }\n } }\n }\n\n // A visual line is a line as drawn on the screen. Folding, for\n // example, can cause multiple logical lines to appear on the same\n // visual line. This finds the start of the visual line that the\n // given line is part of (usually that is the line itself).\n function visualLine(line) {\n var merged;\n while (merged = collapsedSpanAtStart(line))\n { line = merged.find(-1, true).line; }\n return line\n }\n\n function visualLineEnd(line) {\n var merged;\n while (merged = collapsedSpanAtEnd(line))\n { line = merged.find(1, true).line; }\n return line\n }\n\n // Returns an array of logical lines that continue the visual line\n // started by the argument, or undefined if there are no such lines.\n function visualLineContinued(line) {\n var merged, lines;\n while (merged = collapsedSpanAtEnd(line)) {\n line = merged.find(1, true).line\n ;(lines || (lines = [])).push(line);\n }\n return lines\n }\n\n // Get the line number of the start of the visual line that the\n // given line number is part of.\n function visualLineNo(doc, lineN) {\n var line = getLine(doc, lineN), vis = visualLine(line);\n if (line == vis) { return lineN }\n return lineNo(vis)\n }\n\n // Get the line number of the start of the next visual line after\n // the given line.\n function visualLineEndNo(doc, lineN) {\n if (lineN > doc.lastLine()) { return lineN }\n var line = getLine(doc, lineN), merged;\n if (!lineIsHidden(doc, line)) { return lineN }\n while (merged = collapsedSpanAtEnd(line))\n { line = merged.find(1, true).line; }\n return lineNo(line) + 1\n }\n\n // Compute whether a line is hidden. Lines count as hidden when they\n // are part of a visual line that starts with another line, or when\n // they are entirely covered by collapsed, non-widget span.\n function lineIsHidden(doc, line) {\n var sps = sawCollapsedSpans && line.markedSpans;\n if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) {\n sp = sps[i];\n if (!sp.marker.collapsed) { continue }\n if (sp.from == null) { return true }\n if (sp.marker.widgetNode) { continue }\n if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp))\n { return true }\n } }\n }\n function lineIsHiddenInner(doc, line, span) {\n if (span.to == null) {\n var end = span.marker.find(1, true);\n return lineIsHiddenInner(doc, end.line, getMarkedSpanFor(end.line.markedSpans, span.marker))\n }\n if (span.marker.inclusiveRight && span.to == line.text.length)\n { return true }\n for (var sp = (void 0), i = 0; i < line.markedSpans.length; ++i) {\n sp = line.markedSpans[i];\n if (sp.marker.collapsed && !sp.marker.widgetNode && sp.from == span.to &&\n (sp.to == null || sp.to != span.from) &&\n (sp.marker.inclusiveLeft || span.marker.inclusiveRight) &&\n lineIsHiddenInner(doc, line, sp)) { return true }\n }\n }\n\n // Find the height above the given line.\n function heightAtLine(lineObj) {\n lineObj = visualLine(lineObj);\n\n var h = 0, chunk = lineObj.parent;\n for (var i = 0; i < chunk.lines.length; ++i) {\n var line = chunk.lines[i];\n if (line == lineObj) { break }\n else { h += line.height; }\n }\n for (var p = chunk.parent; p; chunk = p, p = chunk.parent) {\n for (var i$1 = 0; i$1 < p.children.length; ++i$1) {\n var cur = p.children[i$1];\n if (cur == chunk) { break }\n else { h += cur.height; }\n }\n }\n return h\n }\n\n // Compute the character length of a line, taking into account\n // collapsed ranges (see markText) that might hide parts, and join\n // other lines onto it.\n function lineLength(line) {\n if (line.height == 0) { return 0 }\n var len = line.text.length, merged, cur = line;\n while (merged = collapsedSpanAtStart(cur)) {\n var found = merged.find(0, true);\n cur = found.from.line;\n len += found.from.ch - found.to.ch;\n }\n cur = line;\n while (merged = collapsedSpanAtEnd(cur)) {\n var found$1 = merged.find(0, true);\n len -= cur.text.length - found$1.from.ch;\n cur = found$1.to.line;\n len += cur.text.length - found$1.to.ch;\n }\n return len\n }\n\n // Find the longest line in the document.\n function findMaxLine(cm) {\n var d = cm.display, doc = cm.doc;\n d.maxLine = getLine(doc, doc.first);\n d.maxLineLength = lineLength(d.maxLine);\n d.maxLineChanged = true;\n doc.iter(function (line) {\n var len = lineLength(line);\n if (len > d.maxLineLength) {\n d.maxLineLength = len;\n d.maxLine = line;\n }\n });\n }\n\n // LINE DATA STRUCTURE\n\n // Line objects. These hold state related to a line, including\n // highlighting info (the styles array).\n var Line = function(text, markedSpans, estimateHeight) {\n this.text = text;\n attachMarkedSpans(this, markedSpans);\n this.height = estimateHeight ? estimateHeight(this) : 1;\n };\n\n Line.prototype.lineNo = function () { return lineNo(this) };\n eventMixin(Line);\n\n // Change the content (text, markers) of a line. Automatically\n // invalidates cached information and tries to re-estimate the\n // line's height.\n function updateLine(line, text, markedSpans, estimateHeight) {\n line.text = text;\n if (line.stateAfter) { line.stateAfter = null; }\n if (line.styles) { line.styles = null; }\n if (line.order != null) { line.order = null; }\n detachMarkedSpans(line);\n attachMarkedSpans(line, markedSpans);\n var estHeight = estimateHeight ? estimateHeight(line) : 1;\n if (estHeight != line.height) { updateLineHeight(line, estHeight); }\n }\n\n // Detach a line from the document tree and its markers.\n function cleanUpLine(line) {\n line.parent = null;\n detachMarkedSpans(line);\n }\n\n // Convert a style as returned by a mode (either null, or a string\n // containing one or more styles) to a CSS style. This is cached,\n // and also looks for line-wide styles.\n var styleToClassCache = {}, styleToClassCacheWithMode = {};\n function interpretTokenStyle(style, options) {\n if (!style || /^\\s*$/.test(style)) { return null }\n var cache = options.addModeClass ? styleToClassCacheWithMode : styleToClassCache;\n return cache[style] ||\n (cache[style] = style.replace(/\\S+/g, \"cm-$&\"))\n }\n\n // Render the DOM representation of the text of a line. Also builds\n // up a 'line map', which points at the DOM nodes that represent\n // specific stretches of text, and is used by the measuring code.\n // The returned object contains the DOM node, this map, and\n // information about line-wide styles that were set by the mode.\n function buildLineContent(cm, lineView) {\n // The padding-right forces the element to have a 'border', which\n // is needed on Webkit to be able to get line-level bounding\n // rectangles for it (in measureChar).\n var content = eltP(\"span\", null, null, webkit ? \"padding-right: .1px\" : null);\n var builder = {pre: eltP(\"pre\", [content], \"CodeMirror-line\"), content: content,\n col: 0, pos: 0, cm: cm,\n trailingSpace: false,\n splitSpaces: cm.getOption(\"lineWrapping\")};\n lineView.measure = {};\n\n // Iterate over the logical lines that make up this visual line.\n for (var i = 0; i <= (lineView.rest ? lineView.rest.length : 0); i++) {\n var line = i ? lineView.rest[i - 1] : lineView.line, order = (void 0);\n builder.pos = 0;\n builder.addToken = buildToken;\n // Optionally wire in some hacks into the token-rendering\n // algorithm, to deal with browser quirks.\n if (hasBadBidiRects(cm.display.measure) && (order = getOrder(line, cm.doc.direction)))\n { builder.addToken = buildTokenBadBidi(builder.addToken, order); }\n builder.map = [];\n var allowFrontierUpdate = lineView != cm.display.externalMeasured && lineNo(line);\n insertLineContent(line, builder, getLineStyles(cm, line, allowFrontierUpdate));\n if (line.styleClasses) {\n if (line.styleClasses.bgClass)\n { builder.bgClass = joinClasses(line.styleClasses.bgClass, builder.bgClass || \"\"); }\n if (line.styleClasses.textClass)\n { builder.textClass = joinClasses(line.styleClasses.textClass, builder.textClass || \"\"); }\n }\n\n // Ensure at least a single node is present, for measuring.\n if (builder.map.length == 0)\n { builder.map.push(0, 0, builder.content.appendChild(zeroWidthElement(cm.display.measure))); }\n\n // Store the map and a cache object for the current logical line\n if (i == 0) {\n lineView.measure.map = builder.map;\n lineView.measure.cache = {};\n } else {\n (lineView.measure.maps || (lineView.measure.maps = [])).push(builder.map)\n ;(lineView.measure.caches || (lineView.measure.caches = [])).push({});\n }\n }\n\n // See issue #2901\n if (webkit) {\n var last = builder.content.lastChild;\n if (/\\bcm-tab\\b/.test(last.className) || (last.querySelector && last.querySelector(\".cm-tab\")))\n { builder.content.className = \"cm-tab-wrap-hack\"; }\n }\n\n signal(cm, \"renderLine\", cm, lineView.line, builder.pre);\n if (builder.pre.className)\n { builder.textClass = joinClasses(builder.pre.className, builder.textClass || \"\"); }\n\n return builder\n }\n\n function defaultSpecialCharPlaceholder(ch) {\n var token = elt(\"span\", \"\\u2022\", \"cm-invalidchar\");\n token.title = \"\\\\u\" + ch.charCodeAt(0).toString(16);\n token.setAttribute(\"aria-label\", token.title);\n return token\n }\n\n // Build up the DOM representation for a single token, and add it to\n // the line map. Takes care to render special characters separately.\n function buildToken(builder, text, style, startStyle, endStyle, css, attributes) {\n if (!text) { return }\n var displayText = builder.splitSpaces ? splitSpaces(text, builder.trailingSpace) : text;\n var special = builder.cm.state.specialChars, mustWrap = false;\n var content;\n if (!special.test(text)) {\n builder.col += text.length;\n content = document.createTextNode(displayText);\n builder.map.push(builder.pos, builder.pos + text.length, content);\n if (ie && ie_version < 9) { mustWrap = true; }\n builder.pos += text.length;\n } else {\n content = document.createDocumentFragment();\n var pos = 0;\n while (true) {\n special.lastIndex = pos;\n var m = special.exec(text);\n var skipped = m ? m.index - pos : text.length - pos;\n if (skipped) {\n var txt = document.createTextNode(displayText.slice(pos, pos + skipped));\n if (ie && ie_version < 9) { content.appendChild(elt(\"span\", [txt])); }\n else { content.appendChild(txt); }\n builder.map.push(builder.pos, builder.pos + skipped, txt);\n builder.col += skipped;\n builder.pos += skipped;\n }\n if (!m) { break }\n pos += skipped + 1;\n var txt$1 = (void 0);\n if (m[0] == \"\\t\") {\n var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize;\n txt$1 = content.appendChild(elt(\"span\", spaceStr(tabWidth), \"cm-tab\"));\n txt$1.setAttribute(\"role\", \"presentation\");\n txt$1.setAttribute(\"cm-text\", \"\\t\");\n builder.col += tabWidth;\n } else if (m[0] == \"\\r\" || m[0] == \"\\n\") {\n txt$1 = content.appendChild(elt(\"span\", m[0] == \"\\r\" ? \"\\u240d\" : \"\\u2424\", \"cm-invalidchar\"));\n txt$1.setAttribute(\"cm-text\", m[0]);\n builder.col += 1;\n } else {\n txt$1 = builder.cm.options.specialCharPlaceholder(m[0]);\n txt$1.setAttribute(\"cm-text\", m[0]);\n if (ie && ie_version < 9) { content.appendChild(elt(\"span\", [txt$1])); }\n else { content.appendChild(txt$1); }\n builder.col += 1;\n }\n builder.map.push(builder.pos, builder.pos + 1, txt$1);\n builder.pos++;\n }\n }\n builder.trailingSpace = displayText.charCodeAt(text.length - 1) == 32;\n if (style || startStyle || endStyle || mustWrap || css || attributes) {\n var fullStyle = style || \"\";\n if (startStyle) { fullStyle += startStyle; }\n if (endStyle) { fullStyle += endStyle; }\n var token = elt(\"span\", [content], fullStyle, css);\n if (attributes) {\n for (var attr in attributes) { if (attributes.hasOwnProperty(attr) && attr != \"style\" && attr != \"class\")\n { token.setAttribute(attr, attributes[attr]); } }\n }\n return builder.content.appendChild(token)\n }\n builder.content.appendChild(content);\n }\n\n // Change some spaces to NBSP to prevent the browser from collapsing\n // trailing spaces at the end of a line when rendering text (issue #1362).\n function splitSpaces(text, trailingBefore) {\n if (text.length > 1 && !/ /.test(text)) { return text }\n var spaceBefore = trailingBefore, result = \"\";\n for (var i = 0; i < text.length; i++) {\n var ch = text.charAt(i);\n if (ch == \" \" && spaceBefore && (i == text.length - 1 || text.charCodeAt(i + 1) == 32))\n { ch = \"\\u00a0\"; }\n result += ch;\n spaceBefore = ch == \" \";\n }\n return result\n }\n\n // Work around nonsense dimensions being reported for stretches of\n // right-to-left text.\n function buildTokenBadBidi(inner, order) {\n return function (builder, text, style, startStyle, endStyle, css, attributes) {\n style = style ? style + \" cm-force-border\" : \"cm-force-border\";\n var start = builder.pos, end = start + text.length;\n for (;;) {\n // Find the part that overlaps with the start of this text\n var part = (void 0);\n for (var i = 0; i < order.length; i++) {\n part = order[i];\n if (part.to > start && part.from <= start) { break }\n }\n if (part.to >= end) { return inner(builder, text, style, startStyle, endStyle, css, attributes) }\n inner(builder, text.slice(0, part.to - start), style, startStyle, null, css, attributes);\n startStyle = null;\n text = text.slice(part.to - start);\n start = part.to;\n }\n }\n }\n\n function buildCollapsedSpan(builder, size, marker, ignoreWidget) {\n var widget = !ignoreWidget && marker.widgetNode;\n if (widget) { builder.map.push(builder.pos, builder.pos + size, widget); }\n if (!ignoreWidget && builder.cm.display.input.needsContentAttribute) {\n if (!widget)\n { widget = builder.content.appendChild(document.createElement(\"span\")); }\n widget.setAttribute(\"cm-marker\", marker.id);\n }\n if (widget) {\n builder.cm.display.input.setUneditable(widget);\n builder.content.appendChild(widget);\n }\n builder.pos += size;\n builder.trailingSpace = false;\n }\n\n // Outputs a number of spans to make up a line, taking highlighting\n // and marked text into account.\n function insertLineContent(line, builder, styles) {\n var spans = line.markedSpans, allText = line.text, at = 0;\n if (!spans) {\n for (var i$1 = 1; i$1 < styles.length; i$1+=2)\n { builder.addToken(builder, allText.slice(at, at = styles[i$1]), interpretTokenStyle(styles[i$1+1], builder.cm.options)); }\n return\n }\n\n var len = allText.length, pos = 0, i = 1, text = \"\", style, css;\n var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, collapsed, attributes;\n for (;;) {\n if (nextChange == pos) { // Update current marker set\n spanStyle = spanEndStyle = spanStartStyle = css = \"\";\n attributes = null;\n collapsed = null; nextChange = Infinity;\n var foundBookmarks = [], endStyles = (void 0);\n for (var j = 0; j < spans.length; ++j) {\n var sp = spans[j], m = sp.marker;\n if (m.type == \"bookmark\" && sp.from == pos && m.widgetNode) {\n foundBookmarks.push(m);\n } else if (sp.from <= pos && (sp.to == null || sp.to > pos || m.collapsed && sp.to == pos && sp.from == pos)) {\n if (sp.to != null && sp.to != pos && nextChange > sp.to) {\n nextChange = sp.to;\n spanEndStyle = \"\";\n }\n if (m.className) { spanStyle += \" \" + m.className; }\n if (m.css) { css = (css ? css + \";\" : \"\") + m.css; }\n if (m.startStyle && sp.from == pos) { spanStartStyle += \" \" + m.startStyle; }\n if (m.endStyle && sp.to == nextChange) { (endStyles || (endStyles = [])).push(m.endStyle, sp.to); }\n // support for the old title property\n // https://github.com/codemirror/CodeMirror/pull/5673\n if (m.title) { (attributes || (attributes = {})).title = m.title; }\n if (m.attributes) {\n for (var attr in m.attributes)\n { (attributes || (attributes = {}))[attr] = m.attributes[attr]; }\n }\n if (m.collapsed && (!collapsed || compareCollapsedMarkers(collapsed.marker, m) < 0))\n { collapsed = sp; }\n } else if (sp.from > pos && nextChange > sp.from) {\n nextChange = sp.from;\n }\n }\n if (endStyles) { for (var j$1 = 0; j$1 < endStyles.length; j$1 += 2)\n { if (endStyles[j$1 + 1] == nextChange) { spanEndStyle += \" \" + endStyles[j$1]; } } }\n\n if (!collapsed || collapsed.from == pos) { for (var j$2 = 0; j$2 < foundBookmarks.length; ++j$2)\n { buildCollapsedSpan(builder, 0, foundBookmarks[j$2]); } }\n if (collapsed && (collapsed.from || 0) == pos) {\n buildCollapsedSpan(builder, (collapsed.to == null ? len + 1 : collapsed.to) - pos,\n collapsed.marker, collapsed.from == null);\n if (collapsed.to == null) { return }\n if (collapsed.to == pos) { collapsed = false; }\n }\n }\n if (pos >= len) { break }\n\n var upto = Math.min(len, nextChange);\n while (true) {\n if (text) {\n var end = pos + text.length;\n if (!collapsed) {\n var tokenText = end > upto ? text.slice(0, upto - pos) : text;\n builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle,\n spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : \"\", css, attributes);\n }\n if (end >= upto) {text = text.slice(upto - pos); pos = upto; break}\n pos = end;\n spanStartStyle = \"\";\n }\n text = allText.slice(at, at = styles[i++]);\n style = interpretTokenStyle(styles[i++], builder.cm.options);\n }\n }\n }\n\n\n // These objects are used to represent the visible (currently drawn)\n // part of the document. A LineView may correspond to multiple\n // logical lines, if those are connected by collapsed ranges.\n function LineView(doc, line, lineN) {\n // The starting line\n this.line = line;\n // Continuing lines, if any\n this.rest = visualLineContinued(line);\n // Number of logical lines in this visual line\n this.size = this.rest ? lineNo(lst(this.rest)) - lineN + 1 : 1;\n this.node = this.text = null;\n this.hidden = lineIsHidden(doc, line);\n }\n\n // Create a range of LineView objects for the given lines.\n function buildViewArray(cm, from, to) {\n var array = [], nextPos;\n for (var pos = from; pos < to; pos = nextPos) {\n var view = new LineView(cm.doc, getLine(cm.doc, pos), pos);\n nextPos = pos + view.size;\n array.push(view);\n }\n return array\n }\n\n var operationGroup = null;\n\n function pushOperation(op) {\n if (operationGroup) {\n operationGroup.ops.push(op);\n } else {\n op.ownsGroup = operationGroup = {\n ops: [op],\n delayedCallbacks: []\n };\n }\n }\n\n function fireCallbacksForOps(group) {\n // Calls delayed callbacks and cursorActivity handlers until no\n // new ones appear\n var callbacks = group.delayedCallbacks, i = 0;\n do {\n for (; i < callbacks.length; i++)\n { callbacks[i].call(null); }\n for (var j = 0; j < group.ops.length; j++) {\n var op = group.ops[j];\n if (op.cursorActivityHandlers)\n { while (op.cursorActivityCalled < op.cursorActivityHandlers.length)\n { op.cursorActivityHandlers[op.cursorActivityCalled++].call(null, op.cm); } }\n }\n } while (i < callbacks.length)\n }\n\n function finishOperation(op, endCb) {\n var group = op.ownsGroup;\n if (!group) { return }\n\n try { fireCallbacksForOps(group); }\n finally {\n operationGroup = null;\n endCb(group);\n }\n }\n\n var orphanDelayedCallbacks = null;\n\n // Often, we want to signal events at a point where we are in the\n // middle of some work, but don't want the handler to start calling\n // other methods on the editor, which might be in an inconsistent\n // state or simply not expect any other events to happen.\n // signalLater looks whether there are any handlers, and schedules\n // them to be executed when the last operation ends, or, if no\n // operation is active, when a timeout fires.\n function signalLater(emitter, type /*, values...*/) {\n var arr = getHandlers(emitter, type);\n if (!arr.length) { return }\n var args = Array.prototype.slice.call(arguments, 2), list;\n if (operationGroup) {\n list = operationGroup.delayedCallbacks;\n } else if (orphanDelayedCallbacks) {\n list = orphanDelayedCallbacks;\n } else {\n list = orphanDelayedCallbacks = [];\n setTimeout(fireOrphanDelayed, 0);\n }\n var loop = function ( i ) {\n list.push(function () { return arr[i].apply(null, args); });\n };\n\n for (var i = 0; i < arr.length; ++i)\n loop( i );\n }\n\n function fireOrphanDelayed() {\n var delayed = orphanDelayedCallbacks;\n orphanDelayedCallbacks = null;\n for (var i = 0; i < delayed.length; ++i) { delayed[i](); }\n }\n\n // When an aspect of a line changes, a string is added to\n // lineView.changes. This updates the relevant part of the line's\n // DOM structure.\n function updateLineForChanges(cm, lineView, lineN, dims) {\n for (var j = 0; j < lineView.changes.length; j++) {\n var type = lineView.changes[j];\n if (type == \"text\") { updateLineText(cm, lineView); }\n else if (type == \"gutter\") { updateLineGutter(cm, lineView, lineN, dims); }\n else if (type == \"class\") { updateLineClasses(cm, lineView); }\n else if (type == \"widget\") { updateLineWidgets(cm, lineView, dims); }\n }\n lineView.changes = null;\n }\n\n // Lines with gutter elements, widgets or a background class need to\n // be wrapped, and have the extra elements added to the wrapper div\n function ensureLineWrapped(lineView) {\n if (lineView.node == lineView.text) {\n lineView.node = elt(\"div\", null, null, \"position: relative\");\n if (lineView.text.parentNode)\n { lineView.text.parentNode.replaceChild(lineView.node, lineView.text); }\n lineView.node.appendChild(lineView.text);\n if (ie && ie_version < 8) { lineView.node.style.zIndex = 2; }\n }\n return lineView.node\n }\n\n function updateLineBackground(cm, lineView) {\n var cls = lineView.bgClass ? lineView.bgClass + \" \" + (lineView.line.bgClass || \"\") : lineView.line.bgClass;\n if (cls) { cls += \" CodeMirror-linebackground\"; }\n if (lineView.background) {\n if (cls) { lineView.background.className = cls; }\n else { lineView.background.parentNode.removeChild(lineView.background); lineView.background = null; }\n } else if (cls) {\n var wrap = ensureLineWrapped(lineView);\n lineView.background = wrap.insertBefore(elt(\"div\", null, cls), wrap.firstChild);\n cm.display.input.setUneditable(lineView.background);\n }\n }\n\n // Wrapper around buildLineContent which will reuse the structure\n // in display.externalMeasured when possible.\n function getLineContent(cm, lineView) {\n var ext = cm.display.externalMeasured;\n if (ext && ext.line == lineView.line) {\n cm.display.externalMeasured = null;\n lineView.measure = ext.measure;\n return ext.built\n }\n return buildLineContent(cm, lineView)\n }\n\n // Redraw the line's text. Interacts with the background and text\n // classes because the mode may output tokens that influence these\n // classes.\n function updateLineText(cm, lineView) {\n var cls = lineView.text.className;\n var built = getLineContent(cm, lineView);\n if (lineView.text == lineView.node) { lineView.node = built.pre; }\n lineView.text.parentNode.replaceChild(built.pre, lineView.text);\n lineView.text = built.pre;\n if (built.bgClass != lineView.bgClass || built.textClass != lineView.textClass) {\n lineView.bgClass = built.bgClass;\n lineView.textClass = built.textClass;\n updateLineClasses(cm, lineView);\n } else if (cls) {\n lineView.text.className = cls;\n }\n }\n\n function updateLineClasses(cm, lineView) {\n updateLineBackground(cm, lineView);\n if (lineView.line.wrapClass)\n { ensureLineWrapped(lineView).className = lineView.line.wrapClass; }\n else if (lineView.node != lineView.text)\n { lineView.node.className = \"\"; }\n var textClass = lineView.textClass ? lineView.textClass + \" \" + (lineView.line.textClass || \"\") : lineView.line.textClass;\n lineView.text.className = textClass || \"\";\n }\n\n function updateLineGutter(cm, lineView, lineN, dims) {\n if (lineView.gutter) {\n lineView.node.removeChild(lineView.gutter);\n lineView.gutter = null;\n }\n if (lineView.gutterBackground) {\n lineView.node.removeChild(lineView.gutterBackground);\n lineView.gutterBackground = null;\n }\n if (lineView.line.gutterClass) {\n var wrap = ensureLineWrapped(lineView);\n lineView.gutterBackground = elt(\"div\", null, \"CodeMirror-gutter-background \" + lineView.line.gutterClass,\n (\"left: \" + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + \"px; width: \" + (dims.gutterTotalWidth) + \"px\"));\n cm.display.input.setUneditable(lineView.gutterBackground);\n wrap.insertBefore(lineView.gutterBackground, lineView.text);\n }\n var markers = lineView.line.gutterMarkers;\n if (cm.options.lineNumbers || markers) {\n var wrap$1 = ensureLineWrapped(lineView);\n var gutterWrap = lineView.gutter = elt(\"div\", null, \"CodeMirror-gutter-wrapper\", (\"left: \" + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + \"px\"));\n cm.display.input.setUneditable(gutterWrap);\n wrap$1.insertBefore(gutterWrap, lineView.text);\n if (lineView.line.gutterClass)\n { gutterWrap.className += \" \" + lineView.line.gutterClass; }\n if (cm.options.lineNumbers && (!markers || !markers[\"CodeMirror-linenumbers\"]))\n { lineView.lineNumber = gutterWrap.appendChild(\n elt(\"div\", lineNumberFor(cm.options, lineN),\n \"CodeMirror-linenumber CodeMirror-gutter-elt\",\n (\"left: \" + (dims.gutterLeft[\"CodeMirror-linenumbers\"]) + \"px; width: \" + (cm.display.lineNumInnerWidth) + \"px\"))); }\n if (markers) { for (var k = 0; k < cm.display.gutterSpecs.length; ++k) {\n var id = cm.display.gutterSpecs[k].className, found = markers.hasOwnProperty(id) && markers[id];\n if (found)\n { gutterWrap.appendChild(elt(\"div\", [found], \"CodeMirror-gutter-elt\",\n (\"left: \" + (dims.gutterLeft[id]) + \"px; width: \" + (dims.gutterWidth[id]) + \"px\"))); }\n } }\n }\n }\n\n function updateLineWidgets(cm, lineView, dims) {\n if (lineView.alignable) { lineView.alignable = null; }\n var isWidget = classTest(\"CodeMirror-linewidget\");\n for (var node = lineView.node.firstChild, next = (void 0); node; node = next) {\n next = node.nextSibling;\n if (isWidget.test(node.className)) { lineView.node.removeChild(node); }\n }\n insertLineWidgets(cm, lineView, dims);\n }\n\n // Build a line's DOM representation from scratch\n function buildLineElement(cm, lineView, lineN, dims) {\n var built = getLineContent(cm, lineView);\n lineView.text = lineView.node = built.pre;\n if (built.bgClass) { lineView.bgClass = built.bgClass; }\n if (built.textClass) { lineView.textClass = built.textClass; }\n\n updateLineClasses(cm, lineView);\n updateLineGutter(cm, lineView, lineN, dims);\n insertLineWidgets(cm, lineView, dims);\n return lineView.node\n }\n\n // A lineView may contain multiple logical lines (when merged by\n // collapsed spans). The widgets for all of them need to be drawn.\n function insertLineWidgets(cm, lineView, dims) {\n insertLineWidgetsFor(cm, lineView.line, lineView, dims, true);\n if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++)\n { insertLineWidgetsFor(cm, lineView.rest[i], lineView, dims, false); } }\n }\n\n function insertLineWidgetsFor(cm, line, lineView, dims, allowAbove) {\n if (!line.widgets) { return }\n var wrap = ensureLineWrapped(lineView);\n for (var i = 0, ws = line.widgets; i < ws.length; ++i) {\n var widget = ws[i], node = elt(\"div\", [widget.node], \"CodeMirror-linewidget\" + (widget.className ? \" \" + widget.className : \"\"));\n if (!widget.handleMouseEvents) { node.setAttribute(\"cm-ignore-events\", \"true\"); }\n positionLineWidget(widget, node, lineView, dims);\n cm.display.input.setUneditable(node);\n if (allowAbove && widget.above)\n { wrap.insertBefore(node, lineView.gutter || lineView.text); }\n else\n { wrap.appendChild(node); }\n signalLater(widget, \"redraw\");\n }\n }\n\n function positionLineWidget(widget, node, lineView, dims) {\n if (widget.noHScroll) {\n (lineView.alignable || (lineView.alignable = [])).push(node);\n var width = dims.wrapperWidth;\n node.style.left = dims.fixedPos + \"px\";\n if (!widget.coverGutter) {\n width -= dims.gutterTotalWidth;\n node.style.paddingLeft = dims.gutterTotalWidth + \"px\";\n }\n node.style.width = width + \"px\";\n }\n if (widget.coverGutter) {\n node.style.zIndex = 5;\n node.style.position = \"relative\";\n if (!widget.noHScroll) { node.style.marginLeft = -dims.gutterTotalWidth + \"px\"; }\n }\n }\n\n function widgetHeight(widget) {\n if (widget.height != null) { return widget.height }\n var cm = widget.doc.cm;\n if (!cm) { return 0 }\n if (!contains(document.body, widget.node)) {\n var parentStyle = \"position: relative;\";\n if (widget.coverGutter)\n { parentStyle += \"margin-left: -\" + cm.display.gutters.offsetWidth + \"px;\"; }\n if (widget.noHScroll)\n { parentStyle += \"width: \" + cm.display.wrapper.clientWidth + \"px;\"; }\n removeChildrenAndAdd(cm.display.measure, elt(\"div\", [widget.node], null, parentStyle));\n }\n return widget.height = widget.node.parentNode.offsetHeight\n }\n\n // Return true when the given mouse event happened in a widget\n function eventInWidget(display, e) {\n for (var n = e_target(e); n != display.wrapper; n = n.parentNode) {\n if (!n || (n.nodeType == 1 && n.getAttribute(\"cm-ignore-events\") == \"true\") ||\n (n.parentNode == display.sizer && n != display.mover))\n { return true }\n }\n }\n\n // POSITION MEASUREMENT\n\n function paddingTop(display) {return display.lineSpace.offsetTop}\n function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight}\n function paddingH(display) {\n if (display.cachedPaddingH) { return display.cachedPaddingH }\n var e = removeChildrenAndAdd(display.measure, elt(\"pre\", \"x\", \"CodeMirror-line-like\"));\n var style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle;\n var data = {left: parseInt(style.paddingLeft), right: parseInt(style.paddingRight)};\n if (!isNaN(data.left) && !isNaN(data.right)) { display.cachedPaddingH = data; }\n return data\n }\n\n function scrollGap(cm) { return scrollerGap - cm.display.nativeBarWidth }\n function displayWidth(cm) {\n return cm.display.scroller.clientWidth - scrollGap(cm) - cm.display.barWidth\n }\n function displayHeight(cm) {\n return cm.display.scroller.clientHeight - scrollGap(cm) - cm.display.barHeight\n }\n\n // Ensure the lineView.wrapping.heights array is populated. This is\n // an array of bottom offsets for the lines that make up a drawn\n // line. When lineWrapping is on, there might be more than one\n // height.\n function ensureLineHeights(cm, lineView, rect) {\n var wrapping = cm.options.lineWrapping;\n var curWidth = wrapping && displayWidth(cm);\n if (!lineView.measure.heights || wrapping && lineView.measure.width != curWidth) {\n var heights = lineView.measure.heights = [];\n if (wrapping) {\n lineView.measure.width = curWidth;\n var rects = lineView.text.firstChild.getClientRects();\n for (var i = 0; i < rects.length - 1; i++) {\n var cur = rects[i], next = rects[i + 1];\n if (Math.abs(cur.bottom - next.bottom) > 2)\n { heights.push((cur.bottom + next.top) / 2 - rect.top); }\n }\n }\n heights.push(rect.bottom - rect.top);\n }\n }\n\n // Find a line map (mapping character offsets to text nodes) and a\n // measurement cache for the given line number. (A line view might\n // contain multiple lines when collapsed ranges are present.)\n function mapFromLineView(lineView, line, lineN) {\n if (lineView.line == line)\n { return {map: lineView.measure.map, cache: lineView.measure.cache} }\n for (var i = 0; i < lineView.rest.length; i++)\n { if (lineView.rest[i] == line)\n { return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i]} } }\n for (var i$1 = 0; i$1 < lineView.rest.length; i$1++)\n { if (lineNo(lineView.rest[i$1]) > lineN)\n { return {map: lineView.measure.maps[i$1], cache: lineView.measure.caches[i$1], before: true} } }\n }\n\n // Render a line into the hidden node display.externalMeasured. Used\n // when measurement is needed for a line that's not in the viewport.\n function updateExternalMeasurement(cm, line) {\n line = visualLine(line);\n var lineN = lineNo(line);\n var view = cm.display.externalMeasured = new LineView(cm.doc, line, lineN);\n view.lineN = lineN;\n var built = view.built = buildLineContent(cm, view);\n view.text = built.pre;\n removeChildrenAndAdd(cm.display.lineMeasure, built.pre);\n return view\n }\n\n // Get a {top, bottom, left, right} box (in line-local coordinates)\n // for a given character.\n function measureChar(cm, line, ch, bias) {\n return measureCharPrepared(cm, prepareMeasureForLine(cm, line), ch, bias)\n }\n\n // Find a line view that corresponds to the given line number.\n function findViewForLine(cm, lineN) {\n if (lineN >= cm.display.viewFrom && lineN < cm.display.viewTo)\n { return cm.display.view[findViewIndex(cm, lineN)] }\n var ext = cm.display.externalMeasured;\n if (ext && lineN >= ext.lineN && lineN < ext.lineN + ext.size)\n { return ext }\n }\n\n // Measurement can be split in two steps, the set-up work that\n // applies to the whole line, and the measurement of the actual\n // character. Functions like coordsChar, that need to do a lot of\n // measurements in a row, can thus ensure that the set-up work is\n // only done once.\n function prepareMeasureForLine(cm, line) {\n var lineN = lineNo(line);\n var view = findViewForLine(cm, lineN);\n if (view && !view.text) {\n view = null;\n } else if (view && view.changes) {\n updateLineForChanges(cm, view, lineN, getDimensions(cm));\n cm.curOp.forceUpdate = true;\n }\n if (!view)\n { view = updateExternalMeasurement(cm, line); }\n\n var info = mapFromLineView(view, line, lineN);\n return {\n line: line, view: view, rect: null,\n map: info.map, cache: info.cache, before: info.before,\n hasHeights: false\n }\n }\n\n // Given a prepared measurement object, measures the position of an\n // actual character (or fetches it from the cache).\n function measureCharPrepared(cm, prepared, ch, bias, varHeight) {\n if (prepared.before) { ch = -1; }\n var key = ch + (bias || \"\"), found;\n if (prepared.cache.hasOwnProperty(key)) {\n found = prepared.cache[key];\n } else {\n if (!prepared.rect)\n { prepared.rect = prepared.view.text.getBoundingClientRect(); }\n if (!prepared.hasHeights) {\n ensureLineHeights(cm, prepared.view, prepared.rect);\n prepared.hasHeights = true;\n }\n found = measureCharInner(cm, prepared, ch, bias);\n if (!found.bogus) { prepared.cache[key] = found; }\n }\n return {left: found.left, right: found.right,\n top: varHeight ? found.rtop : found.top,\n bottom: varHeight ? found.rbottom : found.bottom}\n }\n\n var nullRect = {left: 0, right: 0, top: 0, bottom: 0};\n\n function nodeAndOffsetInLineMap(map, ch, bias) {\n var node, start, end, collapse, mStart, mEnd;\n // First, search the line map for the text node corresponding to,\n // or closest to, the target character.\n for (var i = 0; i < map.length; i += 3) {\n mStart = map[i];\n mEnd = map[i + 1];\n if (ch < mStart) {\n start = 0; end = 1;\n collapse = \"left\";\n } else if (ch < mEnd) {\n start = ch - mStart;\n end = start + 1;\n } else if (i == map.length - 3 || ch == mEnd && map[i + 3] > ch) {\n end = mEnd - mStart;\n start = end - 1;\n if (ch >= mEnd) { collapse = \"right\"; }\n }\n if (start != null) {\n node = map[i + 2];\n if (mStart == mEnd && bias == (node.insertLeft ? \"left\" : \"right\"))\n { collapse = bias; }\n if (bias == \"left\" && start == 0)\n { while (i && map[i - 2] == map[i - 3] && map[i - 1].insertLeft) {\n node = map[(i -= 3) + 2];\n collapse = \"left\";\n } }\n if (bias == \"right\" && start == mEnd - mStart)\n { while (i < map.length - 3 && map[i + 3] == map[i + 4] && !map[i + 5].insertLeft) {\n node = map[(i += 3) + 2];\n collapse = \"right\";\n } }\n break\n }\n }\n return {node: node, start: start, end: end, collapse: collapse, coverStart: mStart, coverEnd: mEnd}\n }\n\n function getUsefulRect(rects, bias) {\n var rect = nullRect;\n if (bias == \"left\") { for (var i = 0; i < rects.length; i++) {\n if ((rect = rects[i]).left != rect.right) { break }\n } } else { for (var i$1 = rects.length - 1; i$1 >= 0; i$1--) {\n if ((rect = rects[i$1]).left != rect.right) { break }\n } }\n return rect\n }\n\n function measureCharInner(cm, prepared, ch, bias) {\n var place = nodeAndOffsetInLineMap(prepared.map, ch, bias);\n var node = place.node, start = place.start, end = place.end, collapse = place.collapse;\n\n var rect;\n if (node.nodeType == 3) { // If it is a text node, use a range to retrieve the coordinates.\n for (var i$1 = 0; i$1 < 4; i$1++) { // Retry a maximum of 4 times when nonsense rectangles are returned\n while (start && isExtendingChar(prepared.line.text.charAt(place.coverStart + start))) { --start; }\n while (place.coverStart + end < place.coverEnd && isExtendingChar(prepared.line.text.charAt(place.coverStart + end))) { ++end; }\n if (ie && ie_version < 9 && start == 0 && end == place.coverEnd - place.coverStart)\n { rect = node.parentNode.getBoundingClientRect(); }\n else\n { rect = getUsefulRect(range(node, start, end).getClientRects(), bias); }\n if (rect.left || rect.right || start == 0) { break }\n end = start;\n start = start - 1;\n collapse = \"right\";\n }\n if (ie && ie_version < 11) { rect = maybeUpdateRectForZooming(cm.display.measure, rect); }\n } else { // If it is a widget, simply get the box for the whole widget.\n if (start > 0) { collapse = bias = \"right\"; }\n var rects;\n if (cm.options.lineWrapping && (rects = node.getClientRects()).length > 1)\n { rect = rects[bias == \"right\" ? rects.length - 1 : 0]; }\n else\n { rect = node.getBoundingClientRect(); }\n }\n if (ie && ie_version < 9 && !start && (!rect || !rect.left && !rect.right)) {\n var rSpan = node.parentNode.getClientRects()[0];\n if (rSpan)\n { rect = {left: rSpan.left, right: rSpan.left + charWidth(cm.display), top: rSpan.top, bottom: rSpan.bottom}; }\n else\n { rect = nullRect; }\n }\n\n var rtop = rect.top - prepared.rect.top, rbot = rect.bottom - prepared.rect.top;\n var mid = (rtop + rbot) / 2;\n var heights = prepared.view.measure.heights;\n var i = 0;\n for (; i < heights.length - 1; i++)\n { if (mid < heights[i]) { break } }\n var top = i ? heights[i - 1] : 0, bot = heights[i];\n var result = {left: (collapse == \"right\" ? rect.right : rect.left) - prepared.rect.left,\n right: (collapse == \"left\" ? rect.left : rect.right) - prepared.rect.left,\n top: top, bottom: bot};\n if (!rect.left && !rect.right) { result.bogus = true; }\n if (!cm.options.singleCursorHeightPerLine) { result.rtop = rtop; result.rbottom = rbot; }\n\n return result\n }\n\n // Work around problem with bounding client rects on ranges being\n // returned incorrectly when zoomed on IE10 and below.\n function maybeUpdateRectForZooming(measure, rect) {\n if (!window.screen || screen.logicalXDPI == null ||\n screen.logicalXDPI == screen.deviceXDPI || !hasBadZoomedRects(measure))\n { return rect }\n var scaleX = screen.logicalXDPI / screen.deviceXDPI;\n var scaleY = screen.logicalYDPI / screen.deviceYDPI;\n return {left: rect.left * scaleX, right: rect.right * scaleX,\n top: rect.top * scaleY, bottom: rect.bottom * scaleY}\n }\n\n function clearLineMeasurementCacheFor(lineView) {\n if (lineView.measure) {\n lineView.measure.cache = {};\n lineView.measure.heights = null;\n if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++)\n { lineView.measure.caches[i] = {}; } }\n }\n }\n\n function clearLineMeasurementCache(cm) {\n cm.display.externalMeasure = null;\n removeChildren(cm.display.lineMeasure);\n for (var i = 0; i < cm.display.view.length; i++)\n { clearLineMeasurementCacheFor(cm.display.view[i]); }\n }\n\n function clearCaches(cm) {\n clearLineMeasurementCache(cm);\n cm.display.cachedCharWidth = cm.display.cachedTextHeight = cm.display.cachedPaddingH = null;\n if (!cm.options.lineWrapping) { cm.display.maxLineChanged = true; }\n cm.display.lineNumChars = null;\n }\n\n function pageScrollX() {\n // Work around https://bugs.chromium.org/p/chromium/issues/detail?id=489206\n // which causes page_Offset and bounding client rects to use\n // different reference viewports and invalidate our calculations.\n if (chrome && android) { return -(document.body.getBoundingClientRect().left - parseInt(getComputedStyle(document.body).marginLeft)) }\n return window.pageXOffset || (document.documentElement || document.body).scrollLeft\n }\n function pageScrollY() {\n if (chrome && android) { return -(document.body.getBoundingClientRect().top - parseInt(getComputedStyle(document.body).marginTop)) }\n return window.pageYOffset || (document.documentElement || document.body).scrollTop\n }\n\n function widgetTopHeight(lineObj) {\n var height = 0;\n if (lineObj.widgets) { for (var i = 0; i < lineObj.widgets.length; ++i) { if (lineObj.widgets[i].above)\n { height += widgetHeight(lineObj.widgets[i]); } } }\n return height\n }\n\n // Converts a {top, bottom, left, right} box from line-local\n // coordinates into another coordinate system. Context may be one of\n // \"line\", \"div\" (display.lineDiv), \"local\"./null (editor), \"window\",\n // or \"page\".\n function intoCoordSystem(cm, lineObj, rect, context, includeWidgets) {\n if (!includeWidgets) {\n var height = widgetTopHeight(lineObj);\n rect.top += height; rect.bottom += height;\n }\n if (context == \"line\") { return rect }\n if (!context) { context = \"local\"; }\n var yOff = heightAtLine(lineObj);\n if (context == \"local\") { yOff += paddingTop(cm.display); }\n else { yOff -= cm.display.viewOffset; }\n if (context == \"page\" || context == \"window\") {\n var lOff = cm.display.lineSpace.getBoundingClientRect();\n yOff += lOff.top + (context == \"window\" ? 0 : pageScrollY());\n var xOff = lOff.left + (context == \"window\" ? 0 : pageScrollX());\n rect.left += xOff; rect.right += xOff;\n }\n rect.top += yOff; rect.bottom += yOff;\n return rect\n }\n\n // Coverts a box from \"div\" coords to another coordinate system.\n // Context may be \"window\", \"page\", \"div\", or \"local\"./null.\n function fromCoordSystem(cm, coords, context) {\n if (context == \"div\") { return coords }\n var left = coords.left, top = coords.top;\n // First move into \"page\" coordinate system\n if (context == \"page\") {\n left -= pageScrollX();\n top -= pageScrollY();\n } else if (context == \"local\" || !context) {\n var localBox = cm.display.sizer.getBoundingClientRect();\n left += localBox.left;\n top += localBox.top;\n }\n\n var lineSpaceBox = cm.display.lineSpace.getBoundingClientRect();\n return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top}\n }\n\n function charCoords(cm, pos, context, lineObj, bias) {\n if (!lineObj) { lineObj = getLine(cm.doc, pos.line); }\n return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, bias), context)\n }\n\n // Returns a box for a given cursor position, which may have an\n // 'other' property containing the position of the secondary cursor\n // on a bidi boundary.\n // A cursor Pos(line, char, \"before\") is on the same visual line as `char - 1`\n // and after `char - 1` in writing order of `char - 1`\n // A cursor Pos(line, char, \"after\") is on the same visual line as `char`\n // and before `char` in writing order of `char`\n // Examples (upper-case letters are RTL, lower-case are LTR):\n // Pos(0, 1, ...)\n // before after\n // ab a|b a|b\n // aB a|B aB|\n // Ab |Ab A|b\n // AB B|A B|A\n // Every position after the last character on a line is considered to stick\n // to the last character on the line.\n function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHeight) {\n lineObj = lineObj || getLine(cm.doc, pos.line);\n if (!preparedMeasure) { preparedMeasure = prepareMeasureForLine(cm, lineObj); }\n function get(ch, right) {\n var m = measureCharPrepared(cm, preparedMeasure, ch, right ? \"right\" : \"left\", varHeight);\n if (right) { m.left = m.right; } else { m.right = m.left; }\n return intoCoordSystem(cm, lineObj, m, context)\n }\n var order = getOrder(lineObj, cm.doc.direction), ch = pos.ch, sticky = pos.sticky;\n if (ch >= lineObj.text.length) {\n ch = lineObj.text.length;\n sticky = \"before\";\n } else if (ch <= 0) {\n ch = 0;\n sticky = \"after\";\n }\n if (!order) { return get(sticky == \"before\" ? ch - 1 : ch, sticky == \"before\") }\n\n function getBidi(ch, partPos, invert) {\n var part = order[partPos], right = part.level == 1;\n return get(invert ? ch - 1 : ch, right != invert)\n }\n var partPos = getBidiPartAt(order, ch, sticky);\n var other = bidiOther;\n var val = getBidi(ch, partPos, sticky == \"before\");\n if (other != null) { val.other = getBidi(ch, other, sticky != \"before\"); }\n return val\n }\n\n // Used to cheaply estimate the coordinates for a position. Used for\n // intermediate scroll updates.\n function estimateCoords(cm, pos) {\n var left = 0;\n pos = clipPos(cm.doc, pos);\n if (!cm.options.lineWrapping) { left = charWidth(cm.display) * pos.ch; }\n var lineObj = getLine(cm.doc, pos.line);\n var top = heightAtLine(lineObj) + paddingTop(cm.display);\n return {left: left, right: left, top: top, bottom: top + lineObj.height}\n }\n\n // Positions returned by coordsChar contain some extra information.\n // xRel is the relative x position of the input coordinates compared\n // to the found position (so xRel > 0 means the coordinates are to\n // the right of the character position, for example). When outside\n // is true, that means the coordinates lie outside the line's\n // vertical range.\n function PosWithInfo(line, ch, sticky, outside, xRel) {\n var pos = Pos(line, ch, sticky);\n pos.xRel = xRel;\n if (outside) { pos.outside = outside; }\n return pos\n }\n\n // Compute the character position closest to the given coordinates.\n // Input must be lineSpace-local (\"div\" coordinate system).\n function coordsChar(cm, x, y) {\n var doc = cm.doc;\n y += cm.display.viewOffset;\n if (y < 0) { return PosWithInfo(doc.first, 0, null, -1, -1) }\n var lineN = lineAtHeight(doc, y), last = doc.first + doc.size - 1;\n if (lineN > last)\n { return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, null, 1, 1) }\n if (x < 0) { x = 0; }\n\n var lineObj = getLine(doc, lineN);\n for (;;) {\n var found = coordsCharInner(cm, lineObj, lineN, x, y);\n var collapsed = collapsedSpanAround(lineObj, found.ch + (found.xRel > 0 || found.outside > 0 ? 1 : 0));\n if (!collapsed) { return found }\n var rangeEnd = collapsed.find(1);\n if (rangeEnd.line == lineN) { return rangeEnd }\n lineObj = getLine(doc, lineN = rangeEnd.line);\n }\n }\n\n function wrappedLineExtent(cm, lineObj, preparedMeasure, y) {\n y -= widgetTopHeight(lineObj);\n var end = lineObj.text.length;\n var begin = findFirst(function (ch) { return measureCharPrepared(cm, preparedMeasure, ch - 1).bottom <= y; }, end, 0);\n end = findFirst(function (ch) { return measureCharPrepared(cm, preparedMeasure, ch).top > y; }, begin, end);\n return {begin: begin, end: end}\n }\n\n function wrappedLineExtentChar(cm, lineObj, preparedMeasure, target) {\n if (!preparedMeasure) { preparedMeasure = prepareMeasureForLine(cm, lineObj); }\n var targetTop = intoCoordSystem(cm, lineObj, measureCharPrepared(cm, preparedMeasure, target), \"line\").top;\n return wrappedLineExtent(cm, lineObj, preparedMeasure, targetTop)\n }\n\n // Returns true if the given side of a box is after the given\n // coordinates, in top-to-bottom, left-to-right order.\n function boxIsAfter(box, x, y, left) {\n return box.bottom <= y ? false : box.top > y ? true : (left ? box.left : box.right) > x\n }\n\n function coordsCharInner(cm, lineObj, lineNo, x, y) {\n // Move y into line-local coordinate space\n y -= heightAtLine(lineObj);\n var preparedMeasure = prepareMeasureForLine(cm, lineObj);\n // When directly calling `measureCharPrepared`, we have to adjust\n // for the widgets at this line.\n var widgetHeight = widgetTopHeight(lineObj);\n var begin = 0, end = lineObj.text.length, ltr = true;\n\n var order = getOrder(lineObj, cm.doc.direction);\n // If the line isn't plain left-to-right text, first figure out\n // which bidi section the coordinates fall into.\n if (order) {\n var part = (cm.options.lineWrapping ? coordsBidiPartWrapped : coordsBidiPart)\n (cm, lineObj, lineNo, preparedMeasure, order, x, y);\n ltr = part.level != 1;\n // The awkward -1 offsets are needed because findFirst (called\n // on these below) will treat its first bound as inclusive,\n // second as exclusive, but we want to actually address the\n // characters in the part's range\n begin = ltr ? part.from : part.to - 1;\n end = ltr ? part.to : part.from - 1;\n }\n\n // A binary search to find the first character whose bounding box\n // starts after the coordinates. If we run across any whose box wrap\n // the coordinates, store that.\n var chAround = null, boxAround = null;\n var ch = findFirst(function (ch) {\n var box = measureCharPrepared(cm, preparedMeasure, ch);\n box.top += widgetHeight; box.bottom += widgetHeight;\n if (!boxIsAfter(box, x, y, false)) { return false }\n if (box.top <= y && box.left <= x) {\n chAround = ch;\n boxAround = box;\n }\n return true\n }, begin, end);\n\n var baseX, sticky, outside = false;\n // If a box around the coordinates was found, use that\n if (boxAround) {\n // Distinguish coordinates nearer to the left or right side of the box\n var atLeft = x - boxAround.left < boxAround.right - x, atStart = atLeft == ltr;\n ch = chAround + (atStart ? 0 : 1);\n sticky = atStart ? \"after\" : \"before\";\n baseX = atLeft ? boxAround.left : boxAround.right;\n } else {\n // (Adjust for extended bound, if necessary.)\n if (!ltr && (ch == end || ch == begin)) { ch++; }\n // To determine which side to associate with, get the box to the\n // left of the character and compare it's vertical position to the\n // coordinates\n sticky = ch == 0 ? \"after\" : ch == lineObj.text.length ? \"before\" :\n (measureCharPrepared(cm, preparedMeasure, ch - (ltr ? 1 : 0)).bottom + widgetHeight <= y) == ltr ?\n \"after\" : \"before\";\n // Now get accurate coordinates for this place, in order to get a\n // base X position\n var coords = cursorCoords(cm, Pos(lineNo, ch, sticky), \"line\", lineObj, preparedMeasure);\n baseX = coords.left;\n outside = y < coords.top ? -1 : y >= coords.bottom ? 1 : 0;\n }\n\n ch = skipExtendingChars(lineObj.text, ch, 1);\n return PosWithInfo(lineNo, ch, sticky, outside, x - baseX)\n }\n\n function coordsBidiPart(cm, lineObj, lineNo, preparedMeasure, order, x, y) {\n // Bidi parts are sorted left-to-right, and in a non-line-wrapping\n // situation, we can take this ordering to correspond to the visual\n // ordering. This finds the first part whose end is after the given\n // coordinates.\n var index = findFirst(function (i) {\n var part = order[i], ltr = part.level != 1;\n return boxIsAfter(cursorCoords(cm, Pos(lineNo, ltr ? part.to : part.from, ltr ? \"before\" : \"after\"),\n \"line\", lineObj, preparedMeasure), x, y, true)\n }, 0, order.length - 1);\n var part = order[index];\n // If this isn't the first part, the part's start is also after\n // the coordinates, and the coordinates aren't on the same line as\n // that start, move one part back.\n if (index > 0) {\n var ltr = part.level != 1;\n var start = cursorCoords(cm, Pos(lineNo, ltr ? part.from : part.to, ltr ? \"after\" : \"before\"),\n \"line\", lineObj, preparedMeasure);\n if (boxIsAfter(start, x, y, true) && start.top > y)\n { part = order[index - 1]; }\n }\n return part\n }\n\n function coordsBidiPartWrapped(cm, lineObj, _lineNo, preparedMeasure, order, x, y) {\n // In a wrapped line, rtl text on wrapping boundaries can do things\n // that don't correspond to the ordering in our `order` array at\n // all, so a binary search doesn't work, and we want to return a\n // part that only spans one line so that the binary search in\n // coordsCharInner is safe. As such, we first find the extent of the\n // wrapped line, and then do a flat search in which we discard any\n // spans that aren't on the line.\n var ref = wrappedLineExtent(cm, lineObj, preparedMeasure, y);\n var begin = ref.begin;\n var end = ref.end;\n if (/\\s/.test(lineObj.text.charAt(end - 1))) { end--; }\n var part = null, closestDist = null;\n for (var i = 0; i < order.length; i++) {\n var p = order[i];\n if (p.from >= end || p.to <= begin) { continue }\n var ltr = p.level != 1;\n var endX = measureCharPrepared(cm, preparedMeasure, ltr ? Math.min(end, p.to) - 1 : Math.max(begin, p.from)).right;\n // Weigh against spans ending before this, so that they are only\n // picked if nothing ends after\n var dist = endX < x ? x - endX + 1e9 : endX - x;\n if (!part || closestDist > dist) {\n part = p;\n closestDist = dist;\n }\n }\n if (!part) { part = order[order.length - 1]; }\n // Clip the part to the wrapped line.\n if (part.from < begin) { part = {from: begin, to: part.to, level: part.level}; }\n if (part.to > end) { part = {from: part.from, to: end, level: part.level}; }\n return part\n }\n\n var measureText;\n // Compute the default text height.\n function textHeight(display) {\n if (display.cachedTextHeight != null) { return display.cachedTextHeight }\n if (measureText == null) {\n measureText = elt(\"pre\", null, \"CodeMirror-line-like\");\n // Measure a bunch of lines, for browsers that compute\n // fractional heights.\n for (var i = 0; i < 49; ++i) {\n measureText.appendChild(document.createTextNode(\"x\"));\n measureText.appendChild(elt(\"br\"));\n }\n measureText.appendChild(document.createTextNode(\"x\"));\n }\n removeChildrenAndAdd(display.measure, measureText);\n var height = measureText.offsetHeight / 50;\n if (height > 3) { display.cachedTextHeight = height; }\n removeChildren(display.measure);\n return height || 1\n }\n\n // Compute the default character width.\n function charWidth(display) {\n if (display.cachedCharWidth != null) { return display.cachedCharWidth }\n var anchor = elt(\"span\", \"xxxxxxxxxx\");\n var pre = elt(\"pre\", [anchor], \"CodeMirror-line-like\");\n removeChildrenAndAdd(display.measure, pre);\n var rect = anchor.getBoundingClientRect(), width = (rect.right - rect.left) / 10;\n if (width > 2) { display.cachedCharWidth = width; }\n return width || 10\n }\n\n // Do a bulk-read of the DOM positions and sizes needed to draw the\n // view, so that we don't interleave reading and writing to the DOM.\n function getDimensions(cm) {\n var d = cm.display, left = {}, width = {};\n var gutterLeft = d.gutters.clientLeft;\n for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) {\n var id = cm.display.gutterSpecs[i].className;\n left[id] = n.offsetLeft + n.clientLeft + gutterLeft;\n width[id] = n.clientWidth;\n }\n return {fixedPos: compensateForHScroll(d),\n gutterTotalWidth: d.gutters.offsetWidth,\n gutterLeft: left,\n gutterWidth: width,\n wrapperWidth: d.wrapper.clientWidth}\n }\n\n // Computes display.scroller.scrollLeft + display.gutters.offsetWidth,\n // but using getBoundingClientRect to get a sub-pixel-accurate\n // result.\n function compensateForHScroll(display) {\n return display.scroller.getBoundingClientRect().left - display.sizer.getBoundingClientRect().left\n }\n\n // Returns a function that estimates the height of a line, to use as\n // first approximation until the line becomes visible (and is thus\n // properly measurable).\n function estimateHeight(cm) {\n var th = textHeight(cm.display), wrapping = cm.options.lineWrapping;\n var perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3);\n return function (line) {\n if (lineIsHidden(cm.doc, line)) { return 0 }\n\n var widgetsHeight = 0;\n if (line.widgets) { for (var i = 0; i < line.widgets.length; i++) {\n if (line.widgets[i].height) { widgetsHeight += line.widgets[i].height; }\n } }\n\n if (wrapping)\n { return widgetsHeight + (Math.ceil(line.text.length / perLine) || 1) * th }\n else\n { return widgetsHeight + th }\n }\n }\n\n function estimateLineHeights(cm) {\n var doc = cm.doc, est = estimateHeight(cm);\n doc.iter(function (line) {\n var estHeight = est(line);\n if (estHeight != line.height) { updateLineHeight(line, estHeight); }\n });\n }\n\n // Given a mouse event, find the corresponding position. If liberal\n // is false, it checks whether a gutter or scrollbar was clicked,\n // and returns null if it was. forRect is used by rectangular\n // selections, and tries to estimate a character position even for\n // coordinates beyond the right of the text.\n function posFromMouse(cm, e, liberal, forRect) {\n var display = cm.display;\n if (!liberal && e_target(e).getAttribute(\"cm-not-content\") == \"true\") { return null }\n\n var x, y, space = display.lineSpace.getBoundingClientRect();\n // Fails unpredictably on IE[67] when mouse is dragged around quickly.\n try { x = e.clientX - space.left; y = e.clientY - space.top; }\n catch (e$1) { return null }\n var coords = coordsChar(cm, x, y), line;\n if (forRect && coords.xRel > 0 && (line = getLine(cm.doc, coords.line).text).length == coords.ch) {\n var colDiff = countColumn(line, line.length, cm.options.tabSize) - line.length;\n coords = Pos(coords.line, Math.max(0, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff));\n }\n return coords\n }\n\n // Find the view element corresponding to a given line. Return null\n // when the line isn't visible.\n function findViewIndex(cm, n) {\n if (n >= cm.display.viewTo) { return null }\n n -= cm.display.viewFrom;\n if (n < 0) { return null }\n var view = cm.display.view;\n for (var i = 0; i < view.length; i++) {\n n -= view[i].size;\n if (n < 0) { return i }\n }\n }\n\n // Updates the display.view data structure for a given change to the\n // document. From and to are in pre-change coordinates. Lendiff is\n // the amount of lines added or subtracted by the change. This is\n // used for changes that span multiple lines, or change the way\n // lines are divided into visual lines. regLineChange (below)\n // registers single-line changes.\n function regChange(cm, from, to, lendiff) {\n if (from == null) { from = cm.doc.first; }\n if (to == null) { to = cm.doc.first + cm.doc.size; }\n if (!lendiff) { lendiff = 0; }\n\n var display = cm.display;\n if (lendiff && to < display.viewTo &&\n (display.updateLineNumbers == null || display.updateLineNumbers > from))\n { display.updateLineNumbers = from; }\n\n cm.curOp.viewChanged = true;\n\n if (from >= display.viewTo) { // Change after\n if (sawCollapsedSpans && visualLineNo(cm.doc, from) < display.viewTo)\n { resetView(cm); }\n } else if (to <= display.viewFrom) { // Change before\n if (sawCollapsedSpans && visualLineEndNo(cm.doc, to + lendiff) > display.viewFrom) {\n resetView(cm);\n } else {\n display.viewFrom += lendiff;\n display.viewTo += lendiff;\n }\n } else if (from <= display.viewFrom && to >= display.viewTo) { // Full overlap\n resetView(cm);\n } else if (from <= display.viewFrom) { // Top overlap\n var cut = viewCuttingPoint(cm, to, to + lendiff, 1);\n if (cut) {\n display.view = display.view.slice(cut.index);\n display.viewFrom = cut.lineN;\n display.viewTo += lendiff;\n } else {\n resetView(cm);\n }\n } else if (to >= display.viewTo) { // Bottom overlap\n var cut$1 = viewCuttingPoint(cm, from, from, -1);\n if (cut$1) {\n display.view = display.view.slice(0, cut$1.index);\n display.viewTo = cut$1.lineN;\n } else {\n resetView(cm);\n }\n } else { // Gap in the middle\n var cutTop = viewCuttingPoint(cm, from, from, -1);\n var cutBot = viewCuttingPoint(cm, to, to + lendiff, 1);\n if (cutTop && cutBot) {\n display.view = display.view.slice(0, cutTop.index)\n .concat(buildViewArray(cm, cutTop.lineN, cutBot.lineN))\n .concat(display.view.slice(cutBot.index));\n display.viewTo += lendiff;\n } else {\n resetView(cm);\n }\n }\n\n var ext = display.externalMeasured;\n if (ext) {\n if (to < ext.lineN)\n { ext.lineN += lendiff; }\n else if (from < ext.lineN + ext.size)\n { display.externalMeasured = null; }\n }\n }\n\n // Register a change to a single line. Type must be one of \"text\",\n // \"gutter\", \"class\", \"widget\"\n function regLineChange(cm, line, type) {\n cm.curOp.viewChanged = true;\n var display = cm.display, ext = cm.display.externalMeasured;\n if (ext && line >= ext.lineN && line < ext.lineN + ext.size)\n { display.externalMeasured = null; }\n\n if (line < display.viewFrom || line >= display.viewTo) { return }\n var lineView = display.view[findViewIndex(cm, line)];\n if (lineView.node == null) { return }\n var arr = lineView.changes || (lineView.changes = []);\n if (indexOf(arr, type) == -1) { arr.push(type); }\n }\n\n // Clear the view.\n function resetView(cm) {\n cm.display.viewFrom = cm.display.viewTo = cm.doc.first;\n cm.display.view = [];\n cm.display.viewOffset = 0;\n }\n\n function viewCuttingPoint(cm, oldN, newN, dir) {\n var index = findViewIndex(cm, oldN), diff, view = cm.display.view;\n if (!sawCollapsedSpans || newN == cm.doc.first + cm.doc.size)\n { return {index: index, lineN: newN} }\n var n = cm.display.viewFrom;\n for (var i = 0; i < index; i++)\n { n += view[i].size; }\n if (n != oldN) {\n if (dir > 0) {\n if (index == view.length - 1) { return null }\n diff = (n + view[index].size) - oldN;\n index++;\n } else {\n diff = n - oldN;\n }\n oldN += diff; newN += diff;\n }\n while (visualLineNo(cm.doc, newN) != newN) {\n if (index == (dir < 0 ? 0 : view.length - 1)) { return null }\n newN += dir * view[index - (dir < 0 ? 1 : 0)].size;\n index += dir;\n }\n return {index: index, lineN: newN}\n }\n\n // Force the view to cover a given range, adding empty view element\n // or clipping off existing ones as needed.\n function adjustView(cm, from, to) {\n var display = cm.display, view = display.view;\n if (view.length == 0 || from >= display.viewTo || to <= display.viewFrom) {\n display.view = buildViewArray(cm, from, to);\n display.viewFrom = from;\n } else {\n if (display.viewFrom > from)\n { display.view = buildViewArray(cm, from, display.viewFrom).concat(display.view); }\n else if (display.viewFrom < from)\n { display.view = display.view.slice(findViewIndex(cm, from)); }\n display.viewFrom = from;\n if (display.viewTo < to)\n { display.view = display.view.concat(buildViewArray(cm, display.viewTo, to)); }\n else if (display.viewTo > to)\n { display.view = display.view.slice(0, findViewIndex(cm, to)); }\n }\n display.viewTo = to;\n }\n\n // Count the number of lines in the view whose DOM representation is\n // out of date (or nonexistent).\n function countDirtyView(cm) {\n var view = cm.display.view, dirty = 0;\n for (var i = 0; i < view.length; i++) {\n var lineView = view[i];\n if (!lineView.hidden && (!lineView.node || lineView.changes)) { ++dirty; }\n }\n return dirty\n }\n\n function updateSelection(cm) {\n cm.display.input.showSelection(cm.display.input.prepareSelection());\n }\n\n function prepareSelection(cm, primary) {\n if ( primary === void 0 ) primary = true;\n\n var doc = cm.doc, result = {};\n var curFragment = result.cursors = document.createDocumentFragment();\n var selFragment = result.selection = document.createDocumentFragment();\n\n for (var i = 0; i < doc.sel.ranges.length; i++) {\n if (!primary && i == doc.sel.primIndex) { continue }\n var range = doc.sel.ranges[i];\n if (range.from().line >= cm.display.viewTo || range.to().line < cm.display.viewFrom) { continue }\n var collapsed = range.empty();\n if (collapsed || cm.options.showCursorWhenSelecting)\n { drawSelectionCursor(cm, range.head, curFragment); }\n if (!collapsed)\n { drawSelectionRange(cm, range, selFragment); }\n }\n return result\n }\n\n // Draws a cursor for the given range\n function drawSelectionCursor(cm, head, output) {\n var pos = cursorCoords(cm, head, \"div\", null, null, !cm.options.singleCursorHeightPerLine);\n\n var cursor = output.appendChild(elt(\"div\", \"\\u00a0\", \"CodeMirror-cursor\"));\n cursor.style.left = pos.left + \"px\";\n cursor.style.top = pos.top + \"px\";\n cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + \"px\";\n\n if (pos.other) {\n // Secondary cursor, shown when on a 'jump' in bi-directional text\n var otherCursor = output.appendChild(elt(\"div\", \"\\u00a0\", \"CodeMirror-cursor CodeMirror-secondarycursor\"));\n otherCursor.style.display = \"\";\n otherCursor.style.left = pos.other.left + \"px\";\n otherCursor.style.top = pos.other.top + \"px\";\n otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + \"px\";\n }\n }\n\n function cmpCoords(a, b) { return a.top - b.top || a.left - b.left }\n\n // Draws the given range as a highlighted selection\n function drawSelectionRange(cm, range, output) {\n var display = cm.display, doc = cm.doc;\n var fragment = document.createDocumentFragment();\n var padding = paddingH(cm.display), leftSide = padding.left;\n var rightSide = Math.max(display.sizerWidth, displayWidth(cm) - display.sizer.offsetLeft) - padding.right;\n var docLTR = doc.direction == \"ltr\";\n\n function add(left, top, width, bottom) {\n if (top < 0) { top = 0; }\n top = Math.round(top);\n bottom = Math.round(bottom);\n fragment.appendChild(elt(\"div\", null, \"CodeMirror-selected\", (\"position: absolute; left: \" + left + \"px;\\n top: \" + top + \"px; width: \" + (width == null ? rightSide - left : width) + \"px;\\n height: \" + (bottom - top) + \"px\")));\n }\n\n function drawForLine(line, fromArg, toArg) {\n var lineObj = getLine(doc, line);\n var lineLen = lineObj.text.length;\n var start, end;\n function coords(ch, bias) {\n return charCoords(cm, Pos(line, ch), \"div\", lineObj, bias)\n }\n\n function wrapX(pos, dir, side) {\n var extent = wrappedLineExtentChar(cm, lineObj, null, pos);\n var prop = (dir == \"ltr\") == (side == \"after\") ? \"left\" : \"right\";\n var ch = side == \"after\" ? extent.begin : extent.end - (/\\s/.test(lineObj.text.charAt(extent.end - 1)) ? 2 : 1);\n return coords(ch, prop)[prop]\n }\n\n var order = getOrder(lineObj, doc.direction);\n iterateBidiSections(order, fromArg || 0, toArg == null ? lineLen : toArg, function (from, to, dir, i) {\n var ltr = dir == \"ltr\";\n var fromPos = coords(from, ltr ? \"left\" : \"right\");\n var toPos = coords(to - 1, ltr ? \"right\" : \"left\");\n\n var openStart = fromArg == null && from == 0, openEnd = toArg == null && to == lineLen;\n var first = i == 0, last = !order || i == order.length - 1;\n if (toPos.top - fromPos.top <= 3) { // Single line\n var openLeft = (docLTR ? openStart : openEnd) && first;\n var openRight = (docLTR ? openEnd : openStart) && last;\n var left = openLeft ? leftSide : (ltr ? fromPos : toPos).left;\n var right = openRight ? rightSide : (ltr ? toPos : fromPos).right;\n add(left, fromPos.top, right - left, fromPos.bottom);\n } else { // Multiple lines\n var topLeft, topRight, botLeft, botRight;\n if (ltr) {\n topLeft = docLTR && openStart && first ? leftSide : fromPos.left;\n topRight = docLTR ? rightSide : wrapX(from, dir, \"before\");\n botLeft = docLTR ? leftSide : wrapX(to, dir, \"after\");\n botRight = docLTR && openEnd && last ? rightSide : toPos.right;\n } else {\n topLeft = !docLTR ? leftSide : wrapX(from, dir, \"before\");\n topRight = !docLTR && openStart && first ? rightSide : fromPos.right;\n botLeft = !docLTR && openEnd && last ? leftSide : toPos.left;\n botRight = !docLTR ? rightSide : wrapX(to, dir, \"after\");\n }\n add(topLeft, fromPos.top, topRight - topLeft, fromPos.bottom);\n if (fromPos.bottom < toPos.top) { add(leftSide, fromPos.bottom, null, toPos.top); }\n add(botLeft, toPos.top, botRight - botLeft, toPos.bottom);\n }\n\n if (!start || cmpCoords(fromPos, start) < 0) { start = fromPos; }\n if (cmpCoords(toPos, start) < 0) { start = toPos; }\n if (!end || cmpCoords(fromPos, end) < 0) { end = fromPos; }\n if (cmpCoords(toPos, end) < 0) { end = toPos; }\n });\n return {start: start, end: end}\n }\n\n var sFrom = range.from(), sTo = range.to();\n if (sFrom.line == sTo.line) {\n drawForLine(sFrom.line, sFrom.ch, sTo.ch);\n } else {\n var fromLine = getLine(doc, sFrom.line), toLine = getLine(doc, sTo.line);\n var singleVLine = visualLine(fromLine) == visualLine(toLine);\n var leftEnd = drawForLine(sFrom.line, sFrom.ch, singleVLine ? fromLine.text.length + 1 : null).end;\n var rightStart = drawForLine(sTo.line, singleVLine ? 0 : null, sTo.ch).start;\n if (singleVLine) {\n if (leftEnd.top < rightStart.top - 2) {\n add(leftEnd.right, leftEnd.top, null, leftEnd.bottom);\n add(leftSide, rightStart.top, rightStart.left, rightStart.bottom);\n } else {\n add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom);\n }\n }\n if (leftEnd.bottom < rightStart.top)\n { add(leftSide, leftEnd.bottom, null, rightStart.top); }\n }\n\n output.appendChild(fragment);\n }\n\n // Cursor-blinking\n function restartBlink(cm) {\n if (!cm.state.focused) { return }\n var display = cm.display;\n clearInterval(display.blinker);\n var on = true;\n display.cursorDiv.style.visibility = \"\";\n if (cm.options.cursorBlinkRate > 0)\n { display.blinker = setInterval(function () {\n if (!cm.hasFocus()) { onBlur(cm); }\n display.cursorDiv.style.visibility = (on = !on) ? \"\" : \"hidden\";\n }, cm.options.cursorBlinkRate); }\n else if (cm.options.cursorBlinkRate < 0)\n { display.cursorDiv.style.visibility = \"hidden\"; }\n }\n\n function ensureFocus(cm) {\n if (!cm.hasFocus()) {\n cm.display.input.focus();\n if (!cm.state.focused) { onFocus(cm); }\n }\n }\n\n function delayBlurEvent(cm) {\n cm.state.delayingBlurEvent = true;\n setTimeout(function () { if (cm.state.delayingBlurEvent) {\n cm.state.delayingBlurEvent = false;\n if (cm.state.focused) { onBlur(cm); }\n } }, 100);\n }\n\n function onFocus(cm, e) {\n if (cm.state.delayingBlurEvent && !cm.state.draggingText) { cm.state.delayingBlurEvent = false; }\n\n if (cm.options.readOnly == \"nocursor\") { return }\n if (!cm.state.focused) {\n signal(cm, \"focus\", cm, e);\n cm.state.focused = true;\n addClass(cm.display.wrapper, \"CodeMirror-focused\");\n // This test prevents this from firing when a context\n // menu is closed (since the input reset would kill the\n // select-all detection hack)\n if (!cm.curOp && cm.display.selForContextMenu != cm.doc.sel) {\n cm.display.input.reset();\n if (webkit) { setTimeout(function () { return cm.display.input.reset(true); }, 20); } // Issue #1730\n }\n cm.display.input.receivedFocus();\n }\n restartBlink(cm);\n }\n function onBlur(cm, e) {\n if (cm.state.delayingBlurEvent) { return }\n\n if (cm.state.focused) {\n signal(cm, \"blur\", cm, e);\n cm.state.focused = false;\n rmClass(cm.display.wrapper, \"CodeMirror-focused\");\n }\n clearInterval(cm.display.blinker);\n setTimeout(function () { if (!cm.state.focused) { cm.display.shift = false; } }, 150);\n }\n\n // Read the actual heights of the rendered lines, and update their\n // stored heights to match.\n function updateHeightsInViewport(cm) {\n var display = cm.display;\n var prevBottom = display.lineDiv.offsetTop;\n for (var i = 0; i < display.view.length; i++) {\n var cur = display.view[i], wrapping = cm.options.lineWrapping;\n var height = (void 0), width = 0;\n if (cur.hidden) { continue }\n if (ie && ie_version < 8) {\n var bot = cur.node.offsetTop + cur.node.offsetHeight;\n height = bot - prevBottom;\n prevBottom = bot;\n } else {\n var box = cur.node.getBoundingClientRect();\n height = box.bottom - box.top;\n // Check that lines don't extend past the right of the current\n // editor width\n if (!wrapping && cur.text.firstChild)\n { width = cur.text.firstChild.getBoundingClientRect().right - box.left - 1; }\n }\n var diff = cur.line.height - height;\n if (diff > .005 || diff < -.005) {\n updateLineHeight(cur.line, height);\n updateWidgetHeight(cur.line);\n if (cur.rest) { for (var j = 0; j < cur.rest.length; j++)\n { updateWidgetHeight(cur.rest[j]); } }\n }\n if (width > cm.display.sizerWidth) {\n var chWidth = Math.ceil(width / charWidth(cm.display));\n if (chWidth > cm.display.maxLineLength) {\n cm.display.maxLineLength = chWidth;\n cm.display.maxLine = cur.line;\n cm.display.maxLineChanged = true;\n }\n }\n }\n }\n\n // Read and store the height of line widgets associated with the\n // given line.\n function updateWidgetHeight(line) {\n if (line.widgets) { for (var i = 0; i < line.widgets.length; ++i) {\n var w = line.widgets[i], parent = w.node.parentNode;\n if (parent) { w.height = parent.offsetHeight; }\n } }\n }\n\n // Compute the lines that are visible in a given viewport (defaults\n // the the current scroll position). viewport may contain top,\n // height, and ensure (see op.scrollToPos) properties.\n function visibleLines(display, doc, viewport) {\n var top = viewport && viewport.top != null ? Math.max(0, viewport.top) : display.scroller.scrollTop;\n top = Math.floor(top - paddingTop(display));\n var bottom = viewport && viewport.bottom != null ? viewport.bottom : top + display.wrapper.clientHeight;\n\n var from = lineAtHeight(doc, top), to = lineAtHeight(doc, bottom);\n // Ensure is a {from: {line, ch}, to: {line, ch}} object, and\n // forces those lines into the viewport (if possible).\n if (viewport && viewport.ensure) {\n var ensureFrom = viewport.ensure.from.line, ensureTo = viewport.ensure.to.line;\n if (ensureFrom < from) {\n from = ensureFrom;\n to = lineAtHeight(doc, heightAtLine(getLine(doc, ensureFrom)) + display.wrapper.clientHeight);\n } else if (Math.min(ensureTo, doc.lastLine()) >= to) {\n from = lineAtHeight(doc, heightAtLine(getLine(doc, ensureTo)) - display.wrapper.clientHeight);\n to = ensureTo;\n }\n }\n return {from: from, to: Math.max(to, from + 1)}\n }\n\n // SCROLLING THINGS INTO VIEW\n\n // If an editor sits on the top or bottom of the window, partially\n // scrolled out of view, this ensures that the cursor is visible.\n function maybeScrollWindow(cm, rect) {\n if (signalDOMEvent(cm, \"scrollCursorIntoView\")) { return }\n\n var display = cm.display, box = display.sizer.getBoundingClientRect(), doScroll = null;\n if (rect.top + box.top < 0) { doScroll = true; }\n else if (rect.bottom + box.top > (window.innerHeight || document.documentElement.clientHeight)) { doScroll = false; }\n if (doScroll != null && !phantom) {\n var scrollNode = elt(\"div\", \"\\u200b\", null, (\"position: absolute;\\n top: \" + (rect.top - display.viewOffset - paddingTop(cm.display)) + \"px;\\n height: \" + (rect.bottom - rect.top + scrollGap(cm) + display.barHeight) + \"px;\\n left: \" + (rect.left) + \"px; width: \" + (Math.max(2, rect.right - rect.left)) + \"px;\"));\n cm.display.lineSpace.appendChild(scrollNode);\n scrollNode.scrollIntoView(doScroll);\n cm.display.lineSpace.removeChild(scrollNode);\n }\n }\n\n // Scroll a given position into view (immediately), verifying that\n // it actually became visible (as line heights are accurately\n // measured, the position of something may 'drift' during drawing).\n function scrollPosIntoView(cm, pos, end, margin) {\n if (margin == null) { margin = 0; }\n var rect;\n if (!cm.options.lineWrapping && pos == end) {\n // Set pos and end to the cursor positions around the character pos sticks to\n // If pos.sticky == \"before\", that is around pos.ch - 1, otherwise around pos.ch\n // If pos == Pos(_, 0, \"before\"), pos and end are unchanged\n pos = pos.ch ? Pos(pos.line, pos.sticky == \"before\" ? pos.ch - 1 : pos.ch, \"after\") : pos;\n end = pos.sticky == \"before\" ? Pos(pos.line, pos.ch + 1, \"before\") : pos;\n }\n for (var limit = 0; limit < 5; limit++) {\n var changed = false;\n var coords = cursorCoords(cm, pos);\n var endCoords = !end || end == pos ? coords : cursorCoords(cm, end);\n rect = {left: Math.min(coords.left, endCoords.left),\n top: Math.min(coords.top, endCoords.top) - margin,\n right: Math.max(coords.left, endCoords.left),\n bottom: Math.max(coords.bottom, endCoords.bottom) + margin};\n var scrollPos = calculateScrollPos(cm, rect);\n var startTop = cm.doc.scrollTop, startLeft = cm.doc.scrollLeft;\n if (scrollPos.scrollTop != null) {\n updateScrollTop(cm, scrollPos.scrollTop);\n if (Math.abs(cm.doc.scrollTop - startTop) > 1) { changed = true; }\n }\n if (scrollPos.scrollLeft != null) {\n setScrollLeft(cm, scrollPos.scrollLeft);\n if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) { changed = true; }\n }\n if (!changed) { break }\n }\n return rect\n }\n\n // Scroll a given set of coordinates into view (immediately).\n function scrollIntoView(cm, rect) {\n var scrollPos = calculateScrollPos(cm, rect);\n if (scrollPos.scrollTop != null) { updateScrollTop(cm, scrollPos.scrollTop); }\n if (scrollPos.scrollLeft != null) { setScrollLeft(cm, scrollPos.scrollLeft); }\n }\n\n // Calculate a new scroll position needed to scroll the given\n // rectangle into view. Returns an object with scrollTop and\n // scrollLeft properties. When these are undefined, the\n // vertical/horizontal position does not need to be adjusted.\n function calculateScrollPos(cm, rect) {\n var display = cm.display, snapMargin = textHeight(cm.display);\n if (rect.top < 0) { rect.top = 0; }\n var screentop = cm.curOp && cm.curOp.scrollTop != null ? cm.curOp.scrollTop : display.scroller.scrollTop;\n var screen = displayHeight(cm), result = {};\n if (rect.bottom - rect.top > screen) { rect.bottom = rect.top + screen; }\n var docBottom = cm.doc.height + paddingVert(display);\n var atTop = rect.top < snapMargin, atBottom = rect.bottom > docBottom - snapMargin;\n if (rect.top < screentop) {\n result.scrollTop = atTop ? 0 : rect.top;\n } else if (rect.bottom > screentop + screen) {\n var newTop = Math.min(rect.top, (atBottom ? docBottom : rect.bottom) - screen);\n if (newTop != screentop) { result.scrollTop = newTop; }\n }\n\n var gutterSpace = cm.options.fixedGutter ? 0 : display.gutters.offsetWidth;\n var screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft - gutterSpace;\n var screenw = displayWidth(cm) - display.gutters.offsetWidth;\n var tooWide = rect.right - rect.left > screenw;\n if (tooWide) { rect.right = rect.left + screenw; }\n if (rect.left < 10)\n { result.scrollLeft = 0; }\n else if (rect.left < screenleft)\n { result.scrollLeft = Math.max(0, rect.left + gutterSpace - (tooWide ? 0 : 10)); }\n else if (rect.right > screenw + screenleft - 3)\n { result.scrollLeft = rect.right + (tooWide ? 0 : 10) - screenw; }\n return result\n }\n\n // Store a relative adjustment to the scroll position in the current\n // operation (to be applied when the operation finishes).\n function addToScrollTop(cm, top) {\n if (top == null) { return }\n resolveScrollToPos(cm);\n cm.curOp.scrollTop = (cm.curOp.scrollTop == null ? cm.doc.scrollTop : cm.curOp.scrollTop) + top;\n }\n\n // Make sure that at the end of the operation the current cursor is\n // shown.\n function ensureCursorVisible(cm) {\n resolveScrollToPos(cm);\n var cur = cm.getCursor();\n cm.curOp.scrollToPos = {from: cur, to: cur, margin: cm.options.cursorScrollMargin};\n }\n\n function scrollToCoords(cm, x, y) {\n if (x != null || y != null) { resolveScrollToPos(cm); }\n if (x != null) { cm.curOp.scrollLeft = x; }\n if (y != null) { cm.curOp.scrollTop = y; }\n }\n\n function scrollToRange(cm, range) {\n resolveScrollToPos(cm);\n cm.curOp.scrollToPos = range;\n }\n\n // When an operation has its scrollToPos property set, and another\n // scroll action is applied before the end of the operation, this\n // 'simulates' scrolling that position into view in a cheap way, so\n // that the effect of intermediate scroll commands is not ignored.\n function resolveScrollToPos(cm) {\n var range = cm.curOp.scrollToPos;\n if (range) {\n cm.curOp.scrollToPos = null;\n var from = estimateCoords(cm, range.from), to = estimateCoords(cm, range.to);\n scrollToCoordsRange(cm, from, to, range.margin);\n }\n }\n\n function scrollToCoordsRange(cm, from, to, margin) {\n var sPos = calculateScrollPos(cm, {\n left: Math.min(from.left, to.left),\n top: Math.min(from.top, to.top) - margin,\n right: Math.max(from.right, to.right),\n bottom: Math.max(from.bottom, to.bottom) + margin\n });\n scrollToCoords(cm, sPos.scrollLeft, sPos.scrollTop);\n }\n\n // Sync the scrollable area and scrollbars, ensure the viewport\n // covers the visible area.\n function updateScrollTop(cm, val) {\n if (Math.abs(cm.doc.scrollTop - val) < 2) { return }\n if (!gecko) { updateDisplaySimple(cm, {top: val}); }\n setScrollTop(cm, val, true);\n if (gecko) { updateDisplaySimple(cm); }\n startWorker(cm, 100);\n }\n\n function setScrollTop(cm, val, forceScroll) {\n val = Math.max(0, Math.min(cm.display.scroller.scrollHeight - cm.display.scroller.clientHeight, val));\n if (cm.display.scroller.scrollTop == val && !forceScroll) { return }\n cm.doc.scrollTop = val;\n cm.display.scrollbars.setScrollTop(val);\n if (cm.display.scroller.scrollTop != val) { cm.display.scroller.scrollTop = val; }\n }\n\n // Sync scroller and scrollbar, ensure the gutter elements are\n // aligned.\n function setScrollLeft(cm, val, isScroller, forceScroll) {\n val = Math.max(0, Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth));\n if ((isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) && !forceScroll) { return }\n cm.doc.scrollLeft = val;\n alignHorizontally(cm);\n if (cm.display.scroller.scrollLeft != val) { cm.display.scroller.scrollLeft = val; }\n cm.display.scrollbars.setScrollLeft(val);\n }\n\n // SCROLLBARS\n\n // Prepare DOM reads needed to update the scrollbars. Done in one\n // shot to minimize update/measure roundtrips.\n function measureForScrollbars(cm) {\n var d = cm.display, gutterW = d.gutters.offsetWidth;\n var docH = Math.round(cm.doc.height + paddingVert(cm.display));\n return {\n clientHeight: d.scroller.clientHeight,\n viewHeight: d.wrapper.clientHeight,\n scrollWidth: d.scroller.scrollWidth, clientWidth: d.scroller.clientWidth,\n viewWidth: d.wrapper.clientWidth,\n barLeft: cm.options.fixedGutter ? gutterW : 0,\n docHeight: docH,\n scrollHeight: docH + scrollGap(cm) + d.barHeight,\n nativeBarWidth: d.nativeBarWidth,\n gutterWidth: gutterW\n }\n }\n\n var NativeScrollbars = function(place, scroll, cm) {\n this.cm = cm;\n var vert = this.vert = elt(\"div\", [elt(\"div\", null, null, \"min-width: 1px\")], \"CodeMirror-vscrollbar\");\n var horiz = this.horiz = elt(\"div\", [elt(\"div\", null, null, \"height: 100%; min-height: 1px\")], \"CodeMirror-hscrollbar\");\n vert.tabIndex = horiz.tabIndex = -1;\n place(vert); place(horiz);\n\n on(vert, \"scroll\", function () {\n if (vert.clientHeight) { scroll(vert.scrollTop, \"vertical\"); }\n });\n on(horiz, \"scroll\", function () {\n if (horiz.clientWidth) { scroll(horiz.scrollLeft, \"horizontal\"); }\n });\n\n this.checkedZeroWidth = false;\n // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8).\n if (ie && ie_version < 8) { this.horiz.style.minHeight = this.vert.style.minWidth = \"18px\"; }\n };\n\n NativeScrollbars.prototype.update = function (measure) {\n var needsH = measure.scrollWidth > measure.clientWidth + 1;\n var needsV = measure.scrollHeight > measure.clientHeight + 1;\n var sWidth = measure.nativeBarWidth;\n\n if (needsV) {\n this.vert.style.display = \"block\";\n this.vert.style.bottom = needsH ? sWidth + \"px\" : \"0\";\n var totalHeight = measure.viewHeight - (needsH ? sWidth : 0);\n // A bug in IE8 can cause this value to be negative, so guard it.\n this.vert.firstChild.style.height =\n Math.max(0, measure.scrollHeight - measure.clientHeight + totalHeight) + \"px\";\n } else {\n this.vert.style.display = \"\";\n this.vert.firstChild.style.height = \"0\";\n }\n\n if (needsH) {\n this.horiz.style.display = \"block\";\n this.horiz.style.right = needsV ? sWidth + \"px\" : \"0\";\n this.horiz.style.left = measure.barLeft + \"px\";\n var totalWidth = measure.viewWidth - measure.barLeft - (needsV ? sWidth : 0);\n this.horiz.firstChild.style.width =\n Math.max(0, measure.scrollWidth - measure.clientWidth + totalWidth) + \"px\";\n } else {\n this.horiz.style.display = \"\";\n this.horiz.firstChild.style.width = \"0\";\n }\n\n if (!this.checkedZeroWidth && measure.clientHeight > 0) {\n if (sWidth == 0) { this.zeroWidthHack(); }\n this.checkedZeroWidth = true;\n }\n\n return {right: needsV ? sWidth : 0, bottom: needsH ? sWidth : 0}\n };\n\n NativeScrollbars.prototype.setScrollLeft = function (pos) {\n if (this.horiz.scrollLeft != pos) { this.horiz.scrollLeft = pos; }\n if (this.disableHoriz) { this.enableZeroWidthBar(this.horiz, this.disableHoriz, \"horiz\"); }\n };\n\n NativeScrollbars.prototype.setScrollTop = function (pos) {\n if (this.vert.scrollTop != pos) { this.vert.scrollTop = pos; }\n if (this.disableVert) { this.enableZeroWidthBar(this.vert, this.disableVert, \"vert\"); }\n };\n\n NativeScrollbars.prototype.zeroWidthHack = function () {\n var w = mac && !mac_geMountainLion ? \"12px\" : \"18px\";\n this.horiz.style.height = this.vert.style.width = w;\n this.horiz.style.pointerEvents = this.vert.style.pointerEvents = \"none\";\n this.disableHoriz = new Delayed;\n this.disableVert = new Delayed;\n };\n\n NativeScrollbars.prototype.enableZeroWidthBar = function (bar, delay, type) {\n bar.style.pointerEvents = \"auto\";\n function maybeDisable() {\n // To find out whether the scrollbar is still visible, we\n // check whether the element under the pixel in the bottom\n // right corner of the scrollbar box is the scrollbar box\n // itself (when the bar is still visible) or its filler child\n // (when the bar is hidden). If it is still visible, we keep\n // it enabled, if it's hidden, we disable pointer events.\n var box = bar.getBoundingClientRect();\n var elt = type == \"vert\" ? document.elementFromPoint(box.right - 1, (box.top + box.bottom) / 2)\n : document.elementFromPoint((box.right + box.left) / 2, box.bottom - 1);\n if (elt != bar) { bar.style.pointerEvents = \"none\"; }\n else { delay.set(1000, maybeDisable); }\n }\n delay.set(1000, maybeDisable);\n };\n\n NativeScrollbars.prototype.clear = function () {\n var parent = this.horiz.parentNode;\n parent.removeChild(this.horiz);\n parent.removeChild(this.vert);\n };\n\n var NullScrollbars = function () {};\n\n NullScrollbars.prototype.update = function () { return {bottom: 0, right: 0} };\n NullScrollbars.prototype.setScrollLeft = function () {};\n NullScrollbars.prototype.setScrollTop = function () {};\n NullScrollbars.prototype.clear = function () {};\n\n function updateScrollbars(cm, measure) {\n if (!measure) { measure = measureForScrollbars(cm); }\n var startWidth = cm.display.barWidth, startHeight = cm.display.barHeight;\n updateScrollbarsInner(cm, measure);\n for (var i = 0; i < 4 && startWidth != cm.display.barWidth || startHeight != cm.display.barHeight; i++) {\n if (startWidth != cm.display.barWidth && cm.options.lineWrapping)\n { updateHeightsInViewport(cm); }\n updateScrollbarsInner(cm, measureForScrollbars(cm));\n startWidth = cm.display.barWidth; startHeight = cm.display.barHeight;\n }\n }\n\n // Re-synchronize the fake scrollbars with the actual size of the\n // content.\n function updateScrollbarsInner(cm, measure) {\n var d = cm.display;\n var sizes = d.scrollbars.update(measure);\n\n d.sizer.style.paddingRight = (d.barWidth = sizes.right) + \"px\";\n d.sizer.style.paddingBottom = (d.barHeight = sizes.bottom) + \"px\";\n d.heightForcer.style.borderBottom = sizes.bottom + \"px solid transparent\";\n\n if (sizes.right && sizes.bottom) {\n d.scrollbarFiller.style.display = \"block\";\n d.scrollbarFiller.style.height = sizes.bottom + \"px\";\n d.scrollbarFiller.style.width = sizes.right + \"px\";\n } else { d.scrollbarFiller.style.display = \"\"; }\n if (sizes.bottom && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) {\n d.gutterFiller.style.display = \"block\";\n d.gutterFiller.style.height = sizes.bottom + \"px\";\n d.gutterFiller.style.width = measure.gutterWidth + \"px\";\n } else { d.gutterFiller.style.display = \"\"; }\n }\n\n var scrollbarModel = {\"native\": NativeScrollbars, \"null\": NullScrollbars};\n\n function initScrollbars(cm) {\n if (cm.display.scrollbars) {\n cm.display.scrollbars.clear();\n if (cm.display.scrollbars.addClass)\n { rmClass(cm.display.wrapper, cm.display.scrollbars.addClass); }\n }\n\n cm.display.scrollbars = new scrollbarModel[cm.options.scrollbarStyle](function (node) {\n cm.display.wrapper.insertBefore(node, cm.display.scrollbarFiller);\n // Prevent clicks in the scrollbars from killing focus\n on(node, \"mousedown\", function () {\n if (cm.state.focused) { setTimeout(function () { return cm.display.input.focus(); }, 0); }\n });\n node.setAttribute(\"cm-not-content\", \"true\");\n }, function (pos, axis) {\n if (axis == \"horizontal\") { setScrollLeft(cm, pos); }\n else { updateScrollTop(cm, pos); }\n }, cm);\n if (cm.display.scrollbars.addClass)\n { addClass(cm.display.wrapper, cm.display.scrollbars.addClass); }\n }\n\n // Operations are used to wrap a series of changes to the editor\n // state in such a way that each change won't have to update the\n // cursor and display (which would be awkward, slow, and\n // error-prone). Instead, display updates are batched and then all\n // combined and executed at once.\n\n var nextOpId = 0;\n // Start a new operation.\n function startOperation(cm) {\n cm.curOp = {\n cm: cm,\n viewChanged: false, // Flag that indicates that lines might need to be redrawn\n startHeight: cm.doc.height, // Used to detect need to update scrollbar\n forceUpdate: false, // Used to force a redraw\n updateInput: 0, // Whether to reset the input textarea\n typing: false, // Whether this reset should be careful to leave existing text (for compositing)\n changeObjs: null, // Accumulated changes, for firing change events\n cursorActivityHandlers: null, // Set of handlers to fire cursorActivity on\n cursorActivityCalled: 0, // Tracks which cursorActivity handlers have been called already\n selectionChanged: false, // Whether the selection needs to be redrawn\n updateMaxLine: false, // Set when the widest line needs to be determined anew\n scrollLeft: null, scrollTop: null, // Intermediate scroll position, not pushed to DOM yet\n scrollToPos: null, // Used to scroll to a specific position\n focus: false,\n id: ++nextOpId // Unique ID\n };\n pushOperation(cm.curOp);\n }\n\n // Finish an operation, updating the display and signalling delayed events\n function endOperation(cm) {\n var op = cm.curOp;\n if (op) { finishOperation(op, function (group) {\n for (var i = 0; i < group.ops.length; i++)\n { group.ops[i].cm.curOp = null; }\n endOperations(group);\n }); }\n }\n\n // The DOM updates done when an operation finishes are batched so\n // that the minimum number of relayouts are required.\n function endOperations(group) {\n var ops = group.ops;\n for (var i = 0; i < ops.length; i++) // Read DOM\n { endOperation_R1(ops[i]); }\n for (var i$1 = 0; i$1 < ops.length; i$1++) // Write DOM (maybe)\n { endOperation_W1(ops[i$1]); }\n for (var i$2 = 0; i$2 < ops.length; i$2++) // Read DOM\n { endOperation_R2(ops[i$2]); }\n for (var i$3 = 0; i$3 < ops.length; i$3++) // Write DOM (maybe)\n { endOperation_W2(ops[i$3]); }\n for (var i$4 = 0; i$4 < ops.length; i$4++) // Read DOM\n { endOperation_finish(ops[i$4]); }\n }\n\n function endOperation_R1(op) {\n var cm = op.cm, display = cm.display;\n maybeClipScrollbars(cm);\n if (op.updateMaxLine) { findMaxLine(cm); }\n\n op.mustUpdate = op.viewChanged || op.forceUpdate || op.scrollTop != null ||\n op.scrollToPos && (op.scrollToPos.from.line < display.viewFrom ||\n op.scrollToPos.to.line >= display.viewTo) ||\n display.maxLineChanged && cm.options.lineWrapping;\n op.update = op.mustUpdate &&\n new DisplayUpdate(cm, op.mustUpdate && {top: op.scrollTop, ensure: op.scrollToPos}, op.forceUpdate);\n }\n\n function endOperation_W1(op) {\n op.updatedDisplay = op.mustUpdate && updateDisplayIfNeeded(op.cm, op.update);\n }\n\n function endOperation_R2(op) {\n var cm = op.cm, display = cm.display;\n if (op.updatedDisplay) { updateHeightsInViewport(cm); }\n\n op.barMeasure = measureForScrollbars(cm);\n\n // If the max line changed since it was last measured, measure it,\n // and ensure the document's width matches it.\n // updateDisplay_W2 will use these properties to do the actual resizing\n if (display.maxLineChanged && !cm.options.lineWrapping) {\n op.adjustWidthTo = measureChar(cm, display.maxLine, display.maxLine.text.length).left + 3;\n cm.display.sizerWidth = op.adjustWidthTo;\n op.barMeasure.scrollWidth =\n Math.max(display.scroller.clientWidth, display.sizer.offsetLeft + op.adjustWidthTo + scrollGap(cm) + cm.display.barWidth);\n op.maxScrollLeft = Math.max(0, display.sizer.offsetLeft + op.adjustWidthTo - displayWidth(cm));\n }\n\n if (op.updatedDisplay || op.selectionChanged)\n { op.preparedSelection = display.input.prepareSelection(); }\n }\n\n function endOperation_W2(op) {\n var cm = op.cm;\n\n if (op.adjustWidthTo != null) {\n cm.display.sizer.style.minWidth = op.adjustWidthTo + \"px\";\n if (op.maxScrollLeft < cm.doc.scrollLeft)\n { setScrollLeft(cm, Math.min(cm.display.scroller.scrollLeft, op.maxScrollLeft), true); }\n cm.display.maxLineChanged = false;\n }\n\n var takeFocus = op.focus && op.focus == activeElt();\n if (op.preparedSelection)\n { cm.display.input.showSelection(op.preparedSelection, takeFocus); }\n if (op.updatedDisplay || op.startHeight != cm.doc.height)\n { updateScrollbars(cm, op.barMeasure); }\n if (op.updatedDisplay)\n { setDocumentHeight(cm, op.barMeasure); }\n\n if (op.selectionChanged) { restartBlink(cm); }\n\n if (cm.state.focused && op.updateInput)\n { cm.display.input.reset(op.typing); }\n if (takeFocus) { ensureFocus(op.cm); }\n }\n\n function endOperation_finish(op) {\n var cm = op.cm, display = cm.display, doc = cm.doc;\n\n if (op.updatedDisplay) { postUpdateDisplay(cm, op.update); }\n\n // Abort mouse wheel delta measurement, when scrolling explicitly\n if (display.wheelStartX != null && (op.scrollTop != null || op.scrollLeft != null || op.scrollToPos))\n { display.wheelStartX = display.wheelStartY = null; }\n\n // Propagate the scroll position to the actual DOM scroller\n if (op.scrollTop != null) { setScrollTop(cm, op.scrollTop, op.forceScroll); }\n\n if (op.scrollLeft != null) { setScrollLeft(cm, op.scrollLeft, true, true); }\n // If we need to scroll a specific position into view, do so.\n if (op.scrollToPos) {\n var rect = scrollPosIntoView(cm, clipPos(doc, op.scrollToPos.from),\n clipPos(doc, op.scrollToPos.to), op.scrollToPos.margin);\n maybeScrollWindow(cm, rect);\n }\n\n // Fire events for markers that are hidden/unidden by editing or\n // undoing\n var hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers;\n if (hidden) { for (var i = 0; i < hidden.length; ++i)\n { if (!hidden[i].lines.length) { signal(hidden[i], \"hide\"); } } }\n if (unhidden) { for (var i$1 = 0; i$1 < unhidden.length; ++i$1)\n { if (unhidden[i$1].lines.length) { signal(unhidden[i$1], \"unhide\"); } } }\n\n if (display.wrapper.offsetHeight)\n { doc.scrollTop = cm.display.scroller.scrollTop; }\n\n // Fire change events, and delayed event handlers\n if (op.changeObjs)\n { signal(cm, \"changes\", cm, op.changeObjs); }\n if (op.update)\n { op.update.finish(); }\n }\n\n // Run the given function in an operation\n function runInOp(cm, f) {\n if (cm.curOp) { return f() }\n startOperation(cm);\n try { return f() }\n finally { endOperation(cm); }\n }\n // Wraps a function in an operation. Returns the wrapped function.\n function operation(cm, f) {\n return function() {\n if (cm.curOp) { return f.apply(cm, arguments) }\n startOperation(cm);\n try { return f.apply(cm, arguments) }\n finally { endOperation(cm); }\n }\n }\n // Used to add methods to editor and doc instances, wrapping them in\n // operations.\n function methodOp(f) {\n return function() {\n if (this.curOp) { return f.apply(this, arguments) }\n startOperation(this);\n try { return f.apply(this, arguments) }\n finally { endOperation(this); }\n }\n }\n function docMethodOp(f) {\n return function() {\n var cm = this.cm;\n if (!cm || cm.curOp) { return f.apply(this, arguments) }\n startOperation(cm);\n try { return f.apply(this, arguments) }\n finally { endOperation(cm); }\n }\n }\n\n // HIGHLIGHT WORKER\n\n function startWorker(cm, time) {\n if (cm.doc.highlightFrontier < cm.display.viewTo)\n { cm.state.highlight.set(time, bind(highlightWorker, cm)); }\n }\n\n function highlightWorker(cm) {\n var doc = cm.doc;\n if (doc.highlightFrontier >= cm.display.viewTo) { return }\n var end = +new Date + cm.options.workTime;\n var context = getContextBefore(cm, doc.highlightFrontier);\n var changedLines = [];\n\n doc.iter(context.line, Math.min(doc.first + doc.size, cm.display.viewTo + 500), function (line) {\n if (context.line >= cm.display.viewFrom) { // Visible\n var oldStyles = line.styles;\n var resetState = line.text.length > cm.options.maxHighlightLength ? copyState(doc.mode, context.state) : null;\n var highlighted = highlightLine(cm, line, context, true);\n if (resetState) { context.state = resetState; }\n line.styles = highlighted.styles;\n var oldCls = line.styleClasses, newCls = highlighted.classes;\n if (newCls) { line.styleClasses = newCls; }\n else if (oldCls) { line.styleClasses = null; }\n var ischange = !oldStyles || oldStyles.length != line.styles.length ||\n oldCls != newCls && (!oldCls || !newCls || oldCls.bgClass != newCls.bgClass || oldCls.textClass != newCls.textClass);\n for (var i = 0; !ischange && i < oldStyles.length; ++i) { ischange = oldStyles[i] != line.styles[i]; }\n if (ischange) { changedLines.push(context.line); }\n line.stateAfter = context.save();\n context.nextLine();\n } else {\n if (line.text.length <= cm.options.maxHighlightLength)\n { processLine(cm, line.text, context); }\n line.stateAfter = context.line % 5 == 0 ? context.save() : null;\n context.nextLine();\n }\n if (+new Date > end) {\n startWorker(cm, cm.options.workDelay);\n return true\n }\n });\n doc.highlightFrontier = context.line;\n doc.modeFrontier = Math.max(doc.modeFrontier, context.line);\n if (changedLines.length) { runInOp(cm, function () {\n for (var i = 0; i < changedLines.length; i++)\n { regLineChange(cm, changedLines[i], \"text\"); }\n }); }\n }\n\n // DISPLAY DRAWING\n\n var DisplayUpdate = function(cm, viewport, force) {\n var display = cm.display;\n\n this.viewport = viewport;\n // Store some values that we'll need later (but don't want to force a relayout for)\n this.visible = visibleLines(display, cm.doc, viewport);\n this.editorIsHidden = !display.wrapper.offsetWidth;\n this.wrapperHeight = display.wrapper.clientHeight;\n this.wrapperWidth = display.wrapper.clientWidth;\n this.oldDisplayWidth = displayWidth(cm);\n this.force = force;\n this.dims = getDimensions(cm);\n this.events = [];\n };\n\n DisplayUpdate.prototype.signal = function (emitter, type) {\n if (hasHandler(emitter, type))\n { this.events.push(arguments); }\n };\n DisplayUpdate.prototype.finish = function () {\n for (var i = 0; i < this.events.length; i++)\n { signal.apply(null, this.events[i]); }\n };\n\n function maybeClipScrollbars(cm) {\n var display = cm.display;\n if (!display.scrollbarsClipped && display.scroller.offsetWidth) {\n display.nativeBarWidth = display.scroller.offsetWidth - display.scroller.clientWidth;\n display.heightForcer.style.height = scrollGap(cm) + \"px\";\n display.sizer.style.marginBottom = -display.nativeBarWidth + \"px\";\n display.sizer.style.borderRightWidth = scrollGap(cm) + \"px\";\n display.scrollbarsClipped = true;\n }\n }\n\n function selectionSnapshot(cm) {\n if (cm.hasFocus()) { return null }\n var active = activeElt();\n if (!active || !contains(cm.display.lineDiv, active)) { return null }\n var result = {activeElt: active};\n if (window.getSelection) {\n var sel = window.getSelection();\n if (sel.anchorNode && sel.extend && contains(cm.display.lineDiv, sel.anchorNode)) {\n result.anchorNode = sel.anchorNode;\n result.anchorOffset = sel.anchorOffset;\n result.focusNode = sel.focusNode;\n result.focusOffset = sel.focusOffset;\n }\n }\n return result\n }\n\n function restoreSelection(snapshot) {\n if (!snapshot || !snapshot.activeElt || snapshot.activeElt == activeElt()) { return }\n snapshot.activeElt.focus();\n if (!/^(INPUT|TEXTAREA)$/.test(snapshot.activeElt.nodeName) &&\n snapshot.anchorNode && contains(document.body, snapshot.anchorNode) && contains(document.body, snapshot.focusNode)) {\n var sel = window.getSelection(), range = document.createRange();\n range.setEnd(snapshot.anchorNode, snapshot.anchorOffset);\n range.collapse(false);\n sel.removeAllRanges();\n sel.addRange(range);\n sel.extend(snapshot.focusNode, snapshot.focusOffset);\n }\n }\n\n // Does the actual updating of the line display. Bails out\n // (returning false) when there is nothing to be done and forced is\n // false.\n function updateDisplayIfNeeded(cm, update) {\n var display = cm.display, doc = cm.doc;\n\n if (update.editorIsHidden) {\n resetView(cm);\n return false\n }\n\n // Bail out if the visible area is already rendered and nothing changed.\n if (!update.force &&\n update.visible.from >= display.viewFrom && update.visible.to <= display.viewTo &&\n (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo) &&\n display.renderedView == display.view && countDirtyView(cm) == 0)\n { return false }\n\n if (maybeUpdateLineNumberWidth(cm)) {\n resetView(cm);\n update.dims = getDimensions(cm);\n }\n\n // Compute a suitable new viewport (from & to)\n var end = doc.first + doc.size;\n var from = Math.max(update.visible.from - cm.options.viewportMargin, doc.first);\n var to = Math.min(end, update.visible.to + cm.options.viewportMargin);\n if (display.viewFrom < from && from - display.viewFrom < 20) { from = Math.max(doc.first, display.viewFrom); }\n if (display.viewTo > to && display.viewTo - to < 20) { to = Math.min(end, display.viewTo); }\n if (sawCollapsedSpans) {\n from = visualLineNo(cm.doc, from);\n to = visualLineEndNo(cm.doc, to);\n }\n\n var different = from != display.viewFrom || to != display.viewTo ||\n display.lastWrapHeight != update.wrapperHeight || display.lastWrapWidth != update.wrapperWidth;\n adjustView(cm, from, to);\n\n display.viewOffset = heightAtLine(getLine(cm.doc, display.viewFrom));\n // Position the mover div to align with the current scroll position\n cm.display.mover.style.top = display.viewOffset + \"px\";\n\n var toUpdate = countDirtyView(cm);\n if (!different && toUpdate == 0 && !update.force && display.renderedView == display.view &&\n (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo))\n { return false }\n\n // For big changes, we hide the enclosing element during the\n // update, since that speeds up the operations on most browsers.\n var selSnapshot = selectionSnapshot(cm);\n if (toUpdate > 4) { display.lineDiv.style.display = \"none\"; }\n patchDisplay(cm, display.updateLineNumbers, update.dims);\n if (toUpdate > 4) { display.lineDiv.style.display = \"\"; }\n display.renderedView = display.view;\n // There might have been a widget with a focused element that got\n // hidden or updated, if so re-focus it.\n restoreSelection(selSnapshot);\n\n // Prevent selection and cursors from interfering with the scroll\n // width and height.\n removeChildren(display.cursorDiv);\n removeChildren(display.selectionDiv);\n display.gutters.style.height = display.sizer.style.minHeight = 0;\n\n if (different) {\n display.lastWrapHeight = update.wrapperHeight;\n display.lastWrapWidth = update.wrapperWidth;\n startWorker(cm, 400);\n }\n\n display.updateLineNumbers = null;\n\n return true\n }\n\n function postUpdateDisplay(cm, update) {\n var viewport = update.viewport;\n\n for (var first = true;; first = false) {\n if (!first || !cm.options.lineWrapping || update.oldDisplayWidth == displayWidth(cm)) {\n // Clip forced viewport to actual scrollable area.\n if (viewport && viewport.top != null)\n { viewport = {top: Math.min(cm.doc.height + paddingVert(cm.display) - displayHeight(cm), viewport.top)}; }\n // Updated line heights might result in the drawn area not\n // actually covering the viewport. Keep looping until it does.\n update.visible = visibleLines(cm.display, cm.doc, viewport);\n if (update.visible.from >= cm.display.viewFrom && update.visible.to <= cm.display.viewTo)\n { break }\n } else if (first) {\n update.visible = visibleLines(cm.display, cm.doc, viewport);\n }\n if (!updateDisplayIfNeeded(cm, update)) { break }\n updateHeightsInViewport(cm);\n var barMeasure = measureForScrollbars(cm);\n updateSelection(cm);\n updateScrollbars(cm, barMeasure);\n setDocumentHeight(cm, barMeasure);\n update.force = false;\n }\n\n update.signal(cm, \"update\", cm);\n if (cm.display.viewFrom != cm.display.reportedViewFrom || cm.display.viewTo != cm.display.reportedViewTo) {\n update.signal(cm, \"viewportChange\", cm, cm.display.viewFrom, cm.display.viewTo);\n cm.display.reportedViewFrom = cm.display.viewFrom; cm.display.reportedViewTo = cm.display.viewTo;\n }\n }\n\n function updateDisplaySimple(cm, viewport) {\n var update = new DisplayUpdate(cm, viewport);\n if (updateDisplayIfNeeded(cm, update)) {\n updateHeightsInViewport(cm);\n postUpdateDisplay(cm, update);\n var barMeasure = measureForScrollbars(cm);\n updateSelection(cm);\n updateScrollbars(cm, barMeasure);\n setDocumentHeight(cm, barMeasure);\n update.finish();\n }\n }\n\n // Sync the actual display DOM structure with display.view, removing\n // nodes for lines that are no longer in view, and creating the ones\n // that are not there yet, and updating the ones that are out of\n // date.\n function patchDisplay(cm, updateNumbersFrom, dims) {\n var display = cm.display, lineNumbers = cm.options.lineNumbers;\n var container = display.lineDiv, cur = container.firstChild;\n\n function rm(node) {\n var next = node.nextSibling;\n // Works around a throw-scroll bug in OS X Webkit\n if (webkit && mac && cm.display.currentWheelTarget == node)\n { node.style.display = \"none\"; }\n else\n { node.parentNode.removeChild(node); }\n return next\n }\n\n var view = display.view, lineN = display.viewFrom;\n // Loop over the elements in the view, syncing cur (the DOM nodes\n // in display.lineDiv) with the view as we go.\n for (var i = 0; i < view.length; i++) {\n var lineView = view[i];\n if (lineView.hidden) ; else if (!lineView.node || lineView.node.parentNode != container) { // Not drawn yet\n var node = buildLineElement(cm, lineView, lineN, dims);\n container.insertBefore(node, cur);\n } else { // Already drawn\n while (cur != lineView.node) { cur = rm(cur); }\n var updateNumber = lineNumbers && updateNumbersFrom != null &&\n updateNumbersFrom <= lineN && lineView.lineNumber;\n if (lineView.changes) {\n if (indexOf(lineView.changes, \"gutter\") > -1) { updateNumber = false; }\n updateLineForChanges(cm, lineView, lineN, dims);\n }\n if (updateNumber) {\n removeChildren(lineView.lineNumber);\n lineView.lineNumber.appendChild(document.createTextNode(lineNumberFor(cm.options, lineN)));\n }\n cur = lineView.node.nextSibling;\n }\n lineN += lineView.size;\n }\n while (cur) { cur = rm(cur); }\n }\n\n function updateGutterSpace(display) {\n var width = display.gutters.offsetWidth;\n display.sizer.style.marginLeft = width + \"px\";\n }\n\n function setDocumentHeight(cm, measure) {\n cm.display.sizer.style.minHeight = measure.docHeight + \"px\";\n cm.display.heightForcer.style.top = measure.docHeight + \"px\";\n cm.display.gutters.style.height = (measure.docHeight + cm.display.barHeight + scrollGap(cm)) + \"px\";\n }\n\n // Re-align line numbers and gutter marks to compensate for\n // horizontal scrolling.\n function alignHorizontally(cm) {\n var display = cm.display, view = display.view;\n if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) { return }\n var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft;\n var gutterW = display.gutters.offsetWidth, left = comp + \"px\";\n for (var i = 0; i < view.length; i++) { if (!view[i].hidden) {\n if (cm.options.fixedGutter) {\n if (view[i].gutter)\n { view[i].gutter.style.left = left; }\n if (view[i].gutterBackground)\n { view[i].gutterBackground.style.left = left; }\n }\n var align = view[i].alignable;\n if (align) { for (var j = 0; j < align.length; j++)\n { align[j].style.left = left; } }\n } }\n if (cm.options.fixedGutter)\n { display.gutters.style.left = (comp + gutterW) + \"px\"; }\n }\n\n // Used to ensure that the line number gutter is still the right\n // size for the current document size. Returns true when an update\n // is needed.\n function maybeUpdateLineNumberWidth(cm) {\n if (!cm.options.lineNumbers) { return false }\n var doc = cm.doc, last = lineNumberFor(cm.options, doc.first + doc.size - 1), display = cm.display;\n if (last.length != display.lineNumChars) {\n var test = display.measure.appendChild(elt(\"div\", [elt(\"div\", last)],\n \"CodeMirror-linenumber CodeMirror-gutter-elt\"));\n var innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW;\n display.lineGutter.style.width = \"\";\n display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding) + 1;\n display.lineNumWidth = display.lineNumInnerWidth + padding;\n display.lineNumChars = display.lineNumInnerWidth ? last.length : -1;\n display.lineGutter.style.width = display.lineNumWidth + \"px\";\n updateGutterSpace(cm.display);\n return true\n }\n return false\n }\n\n function getGutters(gutters, lineNumbers) {\n var result = [], sawLineNumbers = false;\n for (var i = 0; i < gutters.length; i++) {\n var name = gutters[i], style = null;\n if (typeof name != \"string\") { style = name.style; name = name.className; }\n if (name == \"CodeMirror-linenumbers\") {\n if (!lineNumbers) { continue }\n else { sawLineNumbers = true; }\n }\n result.push({className: name, style: style});\n }\n if (lineNumbers && !sawLineNumbers) { result.push({className: \"CodeMirror-linenumbers\", style: null}); }\n return result\n }\n\n // Rebuild the gutter elements, ensure the margin to the left of the\n // code matches their width.\n function renderGutters(display) {\n var gutters = display.gutters, specs = display.gutterSpecs;\n removeChildren(gutters);\n display.lineGutter = null;\n for (var i = 0; i < specs.length; ++i) {\n var ref = specs[i];\n var className = ref.className;\n var style = ref.style;\n var gElt = gutters.appendChild(elt(\"div\", null, \"CodeMirror-gutter \" + className));\n if (style) { gElt.style.cssText = style; }\n if (className == \"CodeMirror-linenumbers\") {\n display.lineGutter = gElt;\n gElt.style.width = (display.lineNumWidth || 1) + \"px\";\n }\n }\n gutters.style.display = specs.length ? \"\" : \"none\";\n updateGutterSpace(display);\n }\n\n function updateGutters(cm) {\n renderGutters(cm.display);\n regChange(cm);\n alignHorizontally(cm);\n }\n\n // The display handles the DOM integration, both for input reading\n // and content drawing. It holds references to DOM nodes and\n // display-related state.\n\n function Display(place, doc, input, options) {\n var d = this;\n this.input = input;\n\n // Covers bottom-right square when both scrollbars are present.\n d.scrollbarFiller = elt(\"div\", null, \"CodeMirror-scrollbar-filler\");\n d.scrollbarFiller.setAttribute(\"cm-not-content\", \"true\");\n // Covers bottom of gutter when coverGutterNextToScrollbar is on\n // and h scrollbar is present.\n d.gutterFiller = elt(\"div\", null, \"CodeMirror-gutter-filler\");\n d.gutterFiller.setAttribute(\"cm-not-content\", \"true\");\n // Will contain the actual code, positioned to cover the viewport.\n d.lineDiv = eltP(\"div\", null, \"CodeMirror-code\");\n // Elements are added to these to represent selection and cursors.\n d.selectionDiv = elt(\"div\", null, null, \"position: relative; z-index: 1\");\n d.cursorDiv = elt(\"div\", null, \"CodeMirror-cursors\");\n // A visibility: hidden element used to find the size of things.\n d.measure = elt(\"div\", null, \"CodeMirror-measure\");\n // When lines outside of the viewport are measured, they are drawn in this.\n d.lineMeasure = elt(\"div\", null, \"CodeMirror-measure\");\n // Wraps everything that needs to exist inside the vertically-padded coordinate system\n d.lineSpace = eltP(\"div\", [d.measure, d.lineMeasure, d.selectionDiv, d.cursorDiv, d.lineDiv],\n null, \"position: relative; outline: none\");\n var lines = eltP(\"div\", [d.lineSpace], \"CodeMirror-lines\");\n // Moved around its parent to cover visible view.\n d.mover = elt(\"div\", [lines], null, \"position: relative\");\n // Set to the height of the document, allowing scrolling.\n d.sizer = elt(\"div\", [d.mover], \"CodeMirror-sizer\");\n d.sizerWidth = null;\n // Behavior of elts with overflow: auto and padding is\n // inconsistent across browsers. This is used to ensure the\n // scrollable area is big enough.\n d.heightForcer = elt(\"div\", null, null, \"position: absolute; height: \" + scrollerGap + \"px; width: 1px;\");\n // Will contain the gutters, if any.\n d.gutters = elt(\"div\", null, \"CodeMirror-gutters\");\n d.lineGutter = null;\n // Actual scrollable element.\n d.scroller = elt(\"div\", [d.sizer, d.heightForcer, d.gutters], \"CodeMirror-scroll\");\n d.scroller.setAttribute(\"tabIndex\", \"-1\");\n // The element in which the editor lives.\n d.wrapper = elt(\"div\", [d.scrollbarFiller, d.gutterFiller, d.scroller], \"CodeMirror\");\n\n // Work around IE7 z-index bug (not perfect, hence IE7 not really being supported)\n if (ie && ie_version < 8) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0; }\n if (!webkit && !(gecko && mobile)) { d.scroller.draggable = true; }\n\n if (place) {\n if (place.appendChild) { place.appendChild(d.wrapper); }\n else { place(d.wrapper); }\n }\n\n // Current rendered range (may be bigger than the view window).\n d.viewFrom = d.viewTo = doc.first;\n d.reportedViewFrom = d.reportedViewTo = doc.first;\n // Information about the rendered lines.\n d.view = [];\n d.renderedView = null;\n // Holds info about a single rendered line when it was rendered\n // for measurement, while not in view.\n d.externalMeasured = null;\n // Empty space (in pixels) above the view\n d.viewOffset = 0;\n d.lastWrapHeight = d.lastWrapWidth = 0;\n d.updateLineNumbers = null;\n\n d.nativeBarWidth = d.barHeight = d.barWidth = 0;\n d.scrollbarsClipped = false;\n\n // Used to only resize the line number gutter when necessary (when\n // the amount of lines crosses a boundary that makes its width change)\n d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null;\n // Set to true when a non-horizontal-scrolling line widget is\n // added. As an optimization, line widget aligning is skipped when\n // this is false.\n d.alignWidgets = false;\n\n d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null;\n\n // Tracks the maximum line length so that the horizontal scrollbar\n // can be kept static when scrolling.\n d.maxLine = null;\n d.maxLineLength = 0;\n d.maxLineChanged = false;\n\n // Used for measuring wheel scrolling granularity\n d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null;\n\n // True when shift is held down.\n d.shift = false;\n\n // Used to track whether anything happened since the context menu\n // was opened.\n d.selForContextMenu = null;\n\n d.activeTouch = null;\n\n d.gutterSpecs = getGutters(options.gutters, options.lineNumbers);\n renderGutters(d);\n\n input.init(d);\n }\n\n // Since the delta values reported on mouse wheel events are\n // unstandardized between browsers and even browser versions, and\n // generally horribly unpredictable, this code starts by measuring\n // the scroll effect that the first few mouse wheel events have,\n // and, from that, detects the way it can convert deltas to pixel\n // offsets afterwards.\n //\n // The reason we want to know the amount a wheel event will scroll\n // is that it gives us a chance to update the display before the\n // actual scrolling happens, reducing flickering.\n\n var wheelSamples = 0, wheelPixelsPerUnit = null;\n // Fill in a browser-detected starting value on browsers where we\n // know one. These don't have to be accurate -- the result of them\n // being wrong would just be a slight flicker on the first wheel\n // scroll (if it is large enough).\n if (ie) { wheelPixelsPerUnit = -.53; }\n else if (gecko) { wheelPixelsPerUnit = 15; }\n else if (chrome) { wheelPixelsPerUnit = -.7; }\n else if (safari) { wheelPixelsPerUnit = -1/3; }\n\n function wheelEventDelta(e) {\n var dx = e.wheelDeltaX, dy = e.wheelDeltaY;\n if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) { dx = e.detail; }\n if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) { dy = e.detail; }\n else if (dy == null) { dy = e.wheelDelta; }\n return {x: dx, y: dy}\n }\n function wheelEventPixels(e) {\n var delta = wheelEventDelta(e);\n delta.x *= wheelPixelsPerUnit;\n delta.y *= wheelPixelsPerUnit;\n return delta\n }\n\n function onScrollWheel(cm, e) {\n var delta = wheelEventDelta(e), dx = delta.x, dy = delta.y;\n\n var display = cm.display, scroll = display.scroller;\n // Quit if there's nothing to scroll here\n var canScrollX = scroll.scrollWidth > scroll.clientWidth;\n var canScrollY = scroll.scrollHeight > scroll.clientHeight;\n if (!(dx && canScrollX || dy && canScrollY)) { return }\n\n // Webkit browsers on OS X abort momentum scrolls when the target\n // of the scroll event is removed from the scrollable element.\n // This hack (see related code in patchDisplay) makes sure the\n // element is kept around.\n if (dy && mac && webkit) {\n outer: for (var cur = e.target, view = display.view; cur != scroll; cur = cur.parentNode) {\n for (var i = 0; i < view.length; i++) {\n if (view[i].node == cur) {\n cm.display.currentWheelTarget = cur;\n break outer\n }\n }\n }\n }\n\n // On some browsers, horizontal scrolling will cause redraws to\n // happen before the gutter has been realigned, causing it to\n // wriggle around in a most unseemly way. When we have an\n // estimated pixels/delta value, we just handle horizontal\n // scrolling entirely here. It'll be slightly off from native, but\n // better than glitching out.\n if (dx && !gecko && !presto && wheelPixelsPerUnit != null) {\n if (dy && canScrollY)\n { updateScrollTop(cm, Math.max(0, scroll.scrollTop + dy * wheelPixelsPerUnit)); }\n setScrollLeft(cm, Math.max(0, scroll.scrollLeft + dx * wheelPixelsPerUnit));\n // Only prevent default scrolling if vertical scrolling is\n // actually possible. Otherwise, it causes vertical scroll\n // jitter on OSX trackpads when deltaX is small and deltaY\n // is large (issue #3579)\n if (!dy || (dy && canScrollY))\n { e_preventDefault(e); }\n display.wheelStartX = null; // Abort measurement, if in progress\n return\n }\n\n // 'Project' the visible viewport to cover the area that is being\n // scrolled into view (if we know enough to estimate it).\n if (dy && wheelPixelsPerUnit != null) {\n var pixels = dy * wheelPixelsPerUnit;\n var top = cm.doc.scrollTop, bot = top + display.wrapper.clientHeight;\n if (pixels < 0) { top = Math.max(0, top + pixels - 50); }\n else { bot = Math.min(cm.doc.height, bot + pixels + 50); }\n updateDisplaySimple(cm, {top: top, bottom: bot});\n }\n\n if (wheelSamples < 20) {\n if (display.wheelStartX == null) {\n display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop;\n display.wheelDX = dx; display.wheelDY = dy;\n setTimeout(function () {\n if (display.wheelStartX == null) { return }\n var movedX = scroll.scrollLeft - display.wheelStartX;\n var movedY = scroll.scrollTop - display.wheelStartY;\n var sample = (movedY && display.wheelDY && movedY / display.wheelDY) ||\n (movedX && display.wheelDX && movedX / display.wheelDX);\n display.wheelStartX = display.wheelStartY = null;\n if (!sample) { return }\n wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1);\n ++wheelSamples;\n }, 200);\n } else {\n display.wheelDX += dx; display.wheelDY += dy;\n }\n }\n }\n\n // Selection objects are immutable. A new one is created every time\n // the selection changes. A selection is one or more non-overlapping\n // (and non-touching) ranges, sorted, and an integer that indicates\n // which one is the primary selection (the one that's scrolled into\n // view, that getCursor returns, etc).\n var Selection = function(ranges, primIndex) {\n this.ranges = ranges;\n this.primIndex = primIndex;\n };\n\n Selection.prototype.primary = function () { return this.ranges[this.primIndex] };\n\n Selection.prototype.equals = function (other) {\n if (other == this) { return true }\n if (other.primIndex != this.primIndex || other.ranges.length != this.ranges.length) { return false }\n for (var i = 0; i < this.ranges.length; i++) {\n var here = this.ranges[i], there = other.ranges[i];\n if (!equalCursorPos(here.anchor, there.anchor) || !equalCursorPos(here.head, there.head)) { return false }\n }\n return true\n };\n\n Selection.prototype.deepCopy = function () {\n var out = [];\n for (var i = 0; i < this.ranges.length; i++)\n { out[i] = new Range(copyPos(this.ranges[i].anchor), copyPos(this.ranges[i].head)); }\n return new Selection(out, this.primIndex)\n };\n\n Selection.prototype.somethingSelected = function () {\n for (var i = 0; i < this.ranges.length; i++)\n { if (!this.ranges[i].empty()) { return true } }\n return false\n };\n\n Selection.prototype.contains = function (pos, end) {\n if (!end) { end = pos; }\n for (var i = 0; i < this.ranges.length; i++) {\n var range = this.ranges[i];\n if (cmp(end, range.from()) >= 0 && cmp(pos, range.to()) <= 0)\n { return i }\n }\n return -1\n };\n\n var Range = function(anchor, head) {\n this.anchor = anchor; this.head = head;\n };\n\n Range.prototype.from = function () { return minPos(this.anchor, this.head) };\n Range.prototype.to = function () { return maxPos(this.anchor, this.head) };\n Range.prototype.empty = function () { return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch };\n\n // Take an unsorted, potentially overlapping set of ranges, and\n // build a selection out of it. 'Consumes' ranges array (modifying\n // it).\n function normalizeSelection(cm, ranges, primIndex) {\n var mayTouch = cm && cm.options.selectionsMayTouch;\n var prim = ranges[primIndex];\n ranges.sort(function (a, b) { return cmp(a.from(), b.from()); });\n primIndex = indexOf(ranges, prim);\n for (var i = 1; i < ranges.length; i++) {\n var cur = ranges[i], prev = ranges[i - 1];\n var diff = cmp(prev.to(), cur.from());\n if (mayTouch && !cur.empty() ? diff > 0 : diff >= 0) {\n var from = minPos(prev.from(), cur.from()), to = maxPos(prev.to(), cur.to());\n var inv = prev.empty() ? cur.from() == cur.head : prev.from() == prev.head;\n if (i <= primIndex) { --primIndex; }\n ranges.splice(--i, 2, new Range(inv ? to : from, inv ? from : to));\n }\n }\n return new Selection(ranges, primIndex)\n }\n\n function simpleSelection(anchor, head) {\n return new Selection([new Range(anchor, head || anchor)], 0)\n }\n\n // Compute the position of the end of a change (its 'to' property\n // refers to the pre-change end).\n function changeEnd(change) {\n if (!change.text) { return change.to }\n return Pos(change.from.line + change.text.length - 1,\n lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0))\n }\n\n // Adjust a position to refer to the post-change position of the\n // same text, or the end of the change if the change covers it.\n function adjustForChange(pos, change) {\n if (cmp(pos, change.from) < 0) { return pos }\n if (cmp(pos, change.to) <= 0) { return changeEnd(change) }\n\n var line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, ch = pos.ch;\n if (pos.line == change.to.line) { ch += changeEnd(change).ch - change.to.ch; }\n return Pos(line, ch)\n }\n\n function computeSelAfterChange(doc, change) {\n var out = [];\n for (var i = 0; i < doc.sel.ranges.length; i++) {\n var range = doc.sel.ranges[i];\n out.push(new Range(adjustForChange(range.anchor, change),\n adjustForChange(range.head, change)));\n }\n return normalizeSelection(doc.cm, out, doc.sel.primIndex)\n }\n\n function offsetPos(pos, old, nw) {\n if (pos.line == old.line)\n { return Pos(nw.line, pos.ch - old.ch + nw.ch) }\n else\n { return Pos(nw.line + (pos.line - old.line), pos.ch) }\n }\n\n // Used by replaceSelections to allow moving the selection to the\n // start or around the replaced test. Hint may be \"start\" or \"around\".\n function computeReplacedSel(doc, changes, hint) {\n var out = [];\n var oldPrev = Pos(doc.first, 0), newPrev = oldPrev;\n for (var i = 0; i < changes.length; i++) {\n var change = changes[i];\n var from = offsetPos(change.from, oldPrev, newPrev);\n var to = offsetPos(changeEnd(change), oldPrev, newPrev);\n oldPrev = change.to;\n newPrev = to;\n if (hint == \"around\") {\n var range = doc.sel.ranges[i], inv = cmp(range.head, range.anchor) < 0;\n out[i] = new Range(inv ? to : from, inv ? from : to);\n } else {\n out[i] = new Range(from, from);\n }\n }\n return new Selection(out, doc.sel.primIndex)\n }\n\n // Used to get the editor into a consistent state again when options change.\n\n function loadMode(cm) {\n cm.doc.mode = getMode(cm.options, cm.doc.modeOption);\n resetModeState(cm);\n }\n\n function resetModeState(cm) {\n cm.doc.iter(function (line) {\n if (line.stateAfter) { line.stateAfter = null; }\n if (line.styles) { line.styles = null; }\n });\n cm.doc.modeFrontier = cm.doc.highlightFrontier = cm.doc.first;\n startWorker(cm, 100);\n cm.state.modeGen++;\n if (cm.curOp) { regChange(cm); }\n }\n\n // DOCUMENT DATA STRUCTURE\n\n // By default, updates that start and end at the beginning of a line\n // are treated specially, in order to make the association of line\n // widgets and marker elements with the text behave more intuitive.\n function isWholeLineUpdate(doc, change) {\n return change.from.ch == 0 && change.to.ch == 0 && lst(change.text) == \"\" &&\n (!doc.cm || doc.cm.options.wholeLineUpdateBefore)\n }\n\n // Perform a change on the document data structure.\n function updateDoc(doc, change, markedSpans, estimateHeight) {\n function spansFor(n) {return markedSpans ? markedSpans[n] : null}\n function update(line, text, spans) {\n updateLine(line, text, spans, estimateHeight);\n signalLater(line, \"change\", line, change);\n }\n function linesFor(start, end) {\n var result = [];\n for (var i = start; i < end; ++i)\n { result.push(new Line(text[i], spansFor(i), estimateHeight)); }\n return result\n }\n\n var from = change.from, to = change.to, text = change.text;\n var firstLine = getLine(doc, from.line), lastLine = getLine(doc, to.line);\n var lastText = lst(text), lastSpans = spansFor(text.length - 1), nlines = to.line - from.line;\n\n // Adjust the line structure\n if (change.full) {\n doc.insert(0, linesFor(0, text.length));\n doc.remove(text.length, doc.size - text.length);\n } else if (isWholeLineUpdate(doc, change)) {\n // This is a whole-line replace. Treated specially to make\n // sure line objects move the way they are supposed to.\n var added = linesFor(0, text.length - 1);\n update(lastLine, lastLine.text, lastSpans);\n if (nlines) { doc.remove(from.line, nlines); }\n if (added.length) { doc.insert(from.line, added); }\n } else if (firstLine == lastLine) {\n if (text.length == 1) {\n update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans);\n } else {\n var added$1 = linesFor(1, text.length - 1);\n added$1.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight));\n update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));\n doc.insert(from.line + 1, added$1);\n }\n } else if (text.length == 1) {\n update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0));\n doc.remove(from.line + 1, nlines);\n } else {\n update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));\n update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans);\n var added$2 = linesFor(1, text.length - 1);\n if (nlines > 1) { doc.remove(from.line + 1, nlines - 1); }\n doc.insert(from.line + 1, added$2);\n }\n\n signalLater(doc, \"change\", doc, change);\n }\n\n // Call f for all linked documents.\n function linkedDocs(doc, f, sharedHistOnly) {\n function propagate(doc, skip, sharedHist) {\n if (doc.linked) { for (var i = 0; i < doc.linked.length; ++i) {\n var rel = doc.linked[i];\n if (rel.doc == skip) { continue }\n var shared = sharedHist && rel.sharedHist;\n if (sharedHistOnly && !shared) { continue }\n f(rel.doc, shared);\n propagate(rel.doc, doc, shared);\n } }\n }\n propagate(doc, null, true);\n }\n\n // Attach a document to an editor.\n function attachDoc(cm, doc) {\n if (doc.cm) { throw new Error(\"This document is already in use.\") }\n cm.doc = doc;\n doc.cm = cm;\n estimateLineHeights(cm);\n loadMode(cm);\n setDirectionClass(cm);\n if (!cm.options.lineWrapping) { findMaxLine(cm); }\n cm.options.mode = doc.modeOption;\n regChange(cm);\n }\n\n function setDirectionClass(cm) {\n (cm.doc.direction == \"rtl\" ? addClass : rmClass)(cm.display.lineDiv, \"CodeMirror-rtl\");\n }\n\n function directionChanged(cm) {\n runInOp(cm, function () {\n setDirectionClass(cm);\n regChange(cm);\n });\n }\n\n function History(startGen) {\n // Arrays of change events and selections. Doing something adds an\n // event to done and clears undo. Undoing moves events from done\n // to undone, redoing moves them in the other direction.\n this.done = []; this.undone = [];\n this.undoDepth = Infinity;\n // Used to track when changes can be merged into a single undo\n // event\n this.lastModTime = this.lastSelTime = 0;\n this.lastOp = this.lastSelOp = null;\n this.lastOrigin = this.lastSelOrigin = null;\n // Used by the isClean() method\n this.generation = this.maxGeneration = startGen || 1;\n }\n\n // Create a history change event from an updateDoc-style change\n // object.\n function historyChangeFromChange(doc, change) {\n var histChange = {from: copyPos(change.from), to: changeEnd(change), text: getBetween(doc, change.from, change.to)};\n attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1);\n linkedDocs(doc, function (doc) { return attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1); }, true);\n return histChange\n }\n\n // Pop all selection events off the end of a history array. Stop at\n // a change event.\n function clearSelectionEvents(array) {\n while (array.length) {\n var last = lst(array);\n if (last.ranges) { array.pop(); }\n else { break }\n }\n }\n\n // Find the top change event in the history. Pop off selection\n // events that are in the way.\n function lastChangeEvent(hist, force) {\n if (force) {\n clearSelectionEvents(hist.done);\n return lst(hist.done)\n } else if (hist.done.length && !lst(hist.done).ranges) {\n return lst(hist.done)\n } else if (hist.done.length > 1 && !hist.done[hist.done.length - 2].ranges) {\n hist.done.pop();\n return lst(hist.done)\n }\n }\n\n // Register a change in the history. Merges changes that are within\n // a single operation, or are close together with an origin that\n // allows merging (starting with \"+\") into a single event.\n function addChangeToHistory(doc, change, selAfter, opId) {\n var hist = doc.history;\n hist.undone.length = 0;\n var time = +new Date, cur;\n var last;\n\n if ((hist.lastOp == opId ||\n hist.lastOrigin == change.origin && change.origin &&\n ((change.origin.charAt(0) == \"+\" && hist.lastModTime > time - (doc.cm ? doc.cm.options.historyEventDelay : 500)) ||\n change.origin.charAt(0) == \"*\")) &&\n (cur = lastChangeEvent(hist, hist.lastOp == opId))) {\n // Merge this change into the last event\n last = lst(cur.changes);\n if (cmp(change.from, change.to) == 0 && cmp(change.from, last.to) == 0) {\n // Optimized case for simple insertion -- don't want to add\n // new changesets for every character typed\n last.to = changeEnd(change);\n } else {\n // Add new sub-event\n cur.changes.push(historyChangeFromChange(doc, change));\n }\n } else {\n // Can not be merged, start a new event.\n var before = lst(hist.done);\n if (!before || !before.ranges)\n { pushSelectionToHistory(doc.sel, hist.done); }\n cur = {changes: [historyChangeFromChange(doc, change)],\n generation: hist.generation};\n hist.done.push(cur);\n while (hist.done.length > hist.undoDepth) {\n hist.done.shift();\n if (!hist.done[0].ranges) { hist.done.shift(); }\n }\n }\n hist.done.push(selAfter);\n hist.generation = ++hist.maxGeneration;\n hist.lastModTime = hist.lastSelTime = time;\n hist.lastOp = hist.lastSelOp = opId;\n hist.lastOrigin = hist.lastSelOrigin = change.origin;\n\n if (!last) { signal(doc, \"historyAdded\"); }\n }\n\n function selectionEventCanBeMerged(doc, origin, prev, sel) {\n var ch = origin.charAt(0);\n return ch == \"*\" ||\n ch == \"+\" &&\n prev.ranges.length == sel.ranges.length &&\n prev.somethingSelected() == sel.somethingSelected() &&\n new Date - doc.history.lastSelTime <= (doc.cm ? doc.cm.options.historyEventDelay : 500)\n }\n\n // Called whenever the selection changes, sets the new selection as\n // the pending selection in the history, and pushes the old pending\n // selection into the 'done' array when it was significantly\n // different (in number of selected ranges, emptiness, or time).\n function addSelectionToHistory(doc, sel, opId, options) {\n var hist = doc.history, origin = options && options.origin;\n\n // A new event is started when the previous origin does not match\n // the current, or the origins don't allow matching. Origins\n // starting with * are always merged, those starting with + are\n // merged when similar and close together in time.\n if (opId == hist.lastSelOp ||\n (origin && hist.lastSelOrigin == origin &&\n (hist.lastModTime == hist.lastSelTime && hist.lastOrigin == origin ||\n selectionEventCanBeMerged(doc, origin, lst(hist.done), sel))))\n { hist.done[hist.done.length - 1] = sel; }\n else\n { pushSelectionToHistory(sel, hist.done); }\n\n hist.lastSelTime = +new Date;\n hist.lastSelOrigin = origin;\n hist.lastSelOp = opId;\n if (options && options.clearRedo !== false)\n { clearSelectionEvents(hist.undone); }\n }\n\n function pushSelectionToHistory(sel, dest) {\n var top = lst(dest);\n if (!(top && top.ranges && top.equals(sel)))\n { dest.push(sel); }\n }\n\n // Used to store marked span information in the history.\n function attachLocalSpans(doc, change, from, to) {\n var existing = change[\"spans_\" + doc.id], n = 0;\n doc.iter(Math.max(doc.first, from), Math.min(doc.first + doc.size, to), function (line) {\n if (line.markedSpans)\n { (existing || (existing = change[\"spans_\" + doc.id] = {}))[n] = line.markedSpans; }\n ++n;\n });\n }\n\n // When un/re-doing restores text containing marked spans, those\n // that have been explicitly cleared should not be restored.\n function removeClearedSpans(spans) {\n if (!spans) { return null }\n var out;\n for (var i = 0; i < spans.length; ++i) {\n if (spans[i].marker.explicitlyCleared) { if (!out) { out = spans.slice(0, i); } }\n else if (out) { out.push(spans[i]); }\n }\n return !out ? spans : out.length ? out : null\n }\n\n // Retrieve and filter the old marked spans stored in a change event.\n function getOldSpans(doc, change) {\n var found = change[\"spans_\" + doc.id];\n if (!found) { return null }\n var nw = [];\n for (var i = 0; i < change.text.length; ++i)\n { nw.push(removeClearedSpans(found[i])); }\n return nw\n }\n\n // Used for un/re-doing changes from the history. Combines the\n // result of computing the existing spans with the set of spans that\n // existed in the history (so that deleting around a span and then\n // undoing brings back the span).\n function mergeOldSpans(doc, change) {\n var old = getOldSpans(doc, change);\n var stretched = stretchSpansOverChange(doc, change);\n if (!old) { return stretched }\n if (!stretched) { return old }\n\n for (var i = 0; i < old.length; ++i) {\n var oldCur = old[i], stretchCur = stretched[i];\n if (oldCur && stretchCur) {\n spans: for (var j = 0; j < stretchCur.length; ++j) {\n var span = stretchCur[j];\n for (var k = 0; k < oldCur.length; ++k)\n { if (oldCur[k].marker == span.marker) { continue spans } }\n oldCur.push(span);\n }\n } else if (stretchCur) {\n old[i] = stretchCur;\n }\n }\n return old\n }\n\n // Used both to provide a JSON-safe object in .getHistory, and, when\n // detaching a document, to split the history in two\n function copyHistoryArray(events, newGroup, instantiateSel) {\n var copy = [];\n for (var i = 0; i < events.length; ++i) {\n var event = events[i];\n if (event.ranges) {\n copy.push(instantiateSel ? Selection.prototype.deepCopy.call(event) : event);\n continue\n }\n var changes = event.changes, newChanges = [];\n copy.push({changes: newChanges});\n for (var j = 0; j < changes.length; ++j) {\n var change = changes[j], m = (void 0);\n newChanges.push({from: change.from, to: change.to, text: change.text});\n if (newGroup) { for (var prop in change) { if (m = prop.match(/^spans_(\\d+)$/)) {\n if (indexOf(newGroup, Number(m[1])) > -1) {\n lst(newChanges)[prop] = change[prop];\n delete change[prop];\n }\n } } }\n }\n }\n return copy\n }\n\n // The 'scroll' parameter given to many of these indicated whether\n // the new cursor position should be scrolled into view after\n // modifying the selection.\n\n // If shift is held or the extend flag is set, extends a range to\n // include a given position (and optionally a second position).\n // Otherwise, simply returns the range between the given positions.\n // Used for cursor motion and such.\n function extendRange(range, head, other, extend) {\n if (extend) {\n var anchor = range.anchor;\n if (other) {\n var posBefore = cmp(head, anchor) < 0;\n if (posBefore != (cmp(other, anchor) < 0)) {\n anchor = head;\n head = other;\n } else if (posBefore != (cmp(head, other) < 0)) {\n head = other;\n }\n }\n return new Range(anchor, head)\n } else {\n return new Range(other || head, head)\n }\n }\n\n // Extend the primary selection range, discard the rest.\n function extendSelection(doc, head, other, options, extend) {\n if (extend == null) { extend = doc.cm && (doc.cm.display.shift || doc.extend); }\n setSelection(doc, new Selection([extendRange(doc.sel.primary(), head, other, extend)], 0), options);\n }\n\n // Extend all selections (pos is an array of selections with length\n // equal the number of selections)\n function extendSelections(doc, heads, options) {\n var out = [];\n var extend = doc.cm && (doc.cm.display.shift || doc.extend);\n for (var i = 0; i < doc.sel.ranges.length; i++)\n { out[i] = extendRange(doc.sel.ranges[i], heads[i], null, extend); }\n var newSel = normalizeSelection(doc.cm, out, doc.sel.primIndex);\n setSelection(doc, newSel, options);\n }\n\n // Updates a single range in the selection.\n function replaceOneSelection(doc, i, range, options) {\n var ranges = doc.sel.ranges.slice(0);\n ranges[i] = range;\n setSelection(doc, normalizeSelection(doc.cm, ranges, doc.sel.primIndex), options);\n }\n\n // Reset the selection to a single range.\n function setSimpleSelection(doc, anchor, head, options) {\n setSelection(doc, simpleSelection(anchor, head), options);\n }\n\n // Give beforeSelectionChange handlers a change to influence a\n // selection update.\n function filterSelectionChange(doc, sel, options) {\n var obj = {\n ranges: sel.ranges,\n update: function(ranges) {\n this.ranges = [];\n for (var i = 0; i < ranges.length; i++)\n { this.ranges[i] = new Range(clipPos(doc, ranges[i].anchor),\n clipPos(doc, ranges[i].head)); }\n },\n origin: options && options.origin\n };\n signal(doc, \"beforeSelectionChange\", doc, obj);\n if (doc.cm) { signal(doc.cm, \"beforeSelectionChange\", doc.cm, obj); }\n if (obj.ranges != sel.ranges) { return normalizeSelection(doc.cm, obj.ranges, obj.ranges.length - 1) }\n else { return sel }\n }\n\n function setSelectionReplaceHistory(doc, sel, options) {\n var done = doc.history.done, last = lst(done);\n if (last && last.ranges) {\n done[done.length - 1] = sel;\n setSelectionNoUndo(doc, sel, options);\n } else {\n setSelection(doc, sel, options);\n }\n }\n\n // Set a new selection.\n function setSelection(doc, sel, options) {\n setSelectionNoUndo(doc, sel, options);\n addSelectionToHistory(doc, doc.sel, doc.cm ? doc.cm.curOp.id : NaN, options);\n }\n\n function setSelectionNoUndo(doc, sel, options) {\n if (hasHandler(doc, \"beforeSelectionChange\") || doc.cm && hasHandler(doc.cm, \"beforeSelectionChange\"))\n { sel = filterSelectionChange(doc, sel, options); }\n\n var bias = options && options.bias ||\n (cmp(sel.primary().head, doc.sel.primary().head) < 0 ? -1 : 1);\n setSelectionInner(doc, skipAtomicInSelection(doc, sel, bias, true));\n\n if (!(options && options.scroll === false) && doc.cm)\n { ensureCursorVisible(doc.cm); }\n }\n\n function setSelectionInner(doc, sel) {\n if (sel.equals(doc.sel)) { return }\n\n doc.sel = sel;\n\n if (doc.cm) {\n doc.cm.curOp.updateInput = 1;\n doc.cm.curOp.selectionChanged = true;\n signalCursorActivity(doc.cm);\n }\n signalLater(doc, \"cursorActivity\", doc);\n }\n\n // Verify that the selection does not partially select any atomic\n // marked ranges.\n function reCheckSelection(doc) {\n setSelectionInner(doc, skipAtomicInSelection(doc, doc.sel, null, false));\n }\n\n // Return a selection that does not partially select any atomic\n // ranges.\n function skipAtomicInSelection(doc, sel, bias, mayClear) {\n var out;\n for (var i = 0; i < sel.ranges.length; i++) {\n var range = sel.ranges[i];\n var old = sel.ranges.length == doc.sel.ranges.length && doc.sel.ranges[i];\n var newAnchor = skipAtomic(doc, range.anchor, old && old.anchor, bias, mayClear);\n var newHead = skipAtomic(doc, range.head, old && old.head, bias, mayClear);\n if (out || newAnchor != range.anchor || newHead != range.head) {\n if (!out) { out = sel.ranges.slice(0, i); }\n out[i] = new Range(newAnchor, newHead);\n }\n }\n return out ? normalizeSelection(doc.cm, out, sel.primIndex) : sel\n }\n\n function skipAtomicInner(doc, pos, oldPos, dir, mayClear) {\n var line = getLine(doc, pos.line);\n if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) {\n var sp = line.markedSpans[i], m = sp.marker;\n\n // Determine if we should prevent the cursor being placed to the left/right of an atomic marker\n // Historically this was determined using the inclusiveLeft/Right option, but the new way to control it\n // is with selectLeft/Right\n var preventCursorLeft = (\"selectLeft\" in m) ? !m.selectLeft : m.inclusiveLeft;\n var preventCursorRight = (\"selectRight\" in m) ? !m.selectRight : m.inclusiveRight;\n\n if ((sp.from == null || (preventCursorLeft ? sp.from <= pos.ch : sp.from < pos.ch)) &&\n (sp.to == null || (preventCursorRight ? sp.to >= pos.ch : sp.to > pos.ch))) {\n if (mayClear) {\n signal(m, \"beforeCursorEnter\");\n if (m.explicitlyCleared) {\n if (!line.markedSpans) { break }\n else {--i; continue}\n }\n }\n if (!m.atomic) { continue }\n\n if (oldPos) {\n var near = m.find(dir < 0 ? 1 : -1), diff = (void 0);\n if (dir < 0 ? preventCursorRight : preventCursorLeft)\n { near = movePos(doc, near, -dir, near && near.line == pos.line ? line : null); }\n if (near && near.line == pos.line && (diff = cmp(near, oldPos)) && (dir < 0 ? diff < 0 : diff > 0))\n { return skipAtomicInner(doc, near, pos, dir, mayClear) }\n }\n\n var far = m.find(dir < 0 ? -1 : 1);\n if (dir < 0 ? preventCursorLeft : preventCursorRight)\n { far = movePos(doc, far, dir, far.line == pos.line ? line : null); }\n return far ? skipAtomicInner(doc, far, pos, dir, mayClear) : null\n }\n } }\n return pos\n }\n\n // Ensure a given position is not inside an atomic range.\n function skipAtomic(doc, pos, oldPos, bias, mayClear) {\n var dir = bias || 1;\n var found = skipAtomicInner(doc, pos, oldPos, dir, mayClear) ||\n (!mayClear && skipAtomicInner(doc, pos, oldPos, dir, true)) ||\n skipAtomicInner(doc, pos, oldPos, -dir, mayClear) ||\n (!mayClear && skipAtomicInner(doc, pos, oldPos, -dir, true));\n if (!found) {\n doc.cantEdit = true;\n return Pos(doc.first, 0)\n }\n return found\n }\n\n function movePos(doc, pos, dir, line) {\n if (dir < 0 && pos.ch == 0) {\n if (pos.line > doc.first) { return clipPos(doc, Pos(pos.line - 1)) }\n else { return null }\n } else if (dir > 0 && pos.ch == (line || getLine(doc, pos.line)).text.length) {\n if (pos.line < doc.first + doc.size - 1) { return Pos(pos.line + 1, 0) }\n else { return null }\n } else {\n return new Pos(pos.line, pos.ch + dir)\n }\n }\n\n function selectAll(cm) {\n cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()), sel_dontScroll);\n }\n\n // UPDATING\n\n // Allow \"beforeChange\" event handlers to influence a change\n function filterChange(doc, change, update) {\n var obj = {\n canceled: false,\n from: change.from,\n to: change.to,\n text: change.text,\n origin: change.origin,\n cancel: function () { return obj.canceled = true; }\n };\n if (update) { obj.update = function (from, to, text, origin) {\n if (from) { obj.from = clipPos(doc, from); }\n if (to) { obj.to = clipPos(doc, to); }\n if (text) { obj.text = text; }\n if (origin !== undefined) { obj.origin = origin; }\n }; }\n signal(doc, \"beforeChange\", doc, obj);\n if (doc.cm) { signal(doc.cm, \"beforeChange\", doc.cm, obj); }\n\n if (obj.canceled) {\n if (doc.cm) { doc.cm.curOp.updateInput = 2; }\n return null\n }\n return {from: obj.from, to: obj.to, text: obj.text, origin: obj.origin}\n }\n\n // Apply a change to a document, and add it to the document's\n // history, and propagating it to all linked documents.\n function makeChange(doc, change, ignoreReadOnly) {\n if (doc.cm) {\n if (!doc.cm.curOp) { return operation(doc.cm, makeChange)(doc, change, ignoreReadOnly) }\n if (doc.cm.state.suppressEdits) { return }\n }\n\n if (hasHandler(doc, \"beforeChange\") || doc.cm && hasHandler(doc.cm, \"beforeChange\")) {\n change = filterChange(doc, change, true);\n if (!change) { return }\n }\n\n // Possibly split or suppress the update based on the presence\n // of read-only spans in its range.\n var split = sawReadOnlySpans && !ignoreReadOnly && removeReadOnlyRanges(doc, change.from, change.to);\n if (split) {\n for (var i = split.length - 1; i >= 0; --i)\n { makeChangeInner(doc, {from: split[i].from, to: split[i].to, text: i ? [\"\"] : change.text, origin: change.origin}); }\n } else {\n makeChangeInner(doc, change);\n }\n }\n\n function makeChangeInner(doc, change) {\n if (change.text.length == 1 && change.text[0] == \"\" && cmp(change.from, change.to) == 0) { return }\n var selAfter = computeSelAfterChange(doc, change);\n addChangeToHistory(doc, change, selAfter, doc.cm ? doc.cm.curOp.id : NaN);\n\n makeChangeSingleDoc(doc, change, selAfter, stretchSpansOverChange(doc, change));\n var rebased = [];\n\n linkedDocs(doc, function (doc, sharedHist) {\n if (!sharedHist && indexOf(rebased, doc.history) == -1) {\n rebaseHist(doc.history, change);\n rebased.push(doc.history);\n }\n makeChangeSingleDoc(doc, change, null, stretchSpansOverChange(doc, change));\n });\n }\n\n // Revert a change stored in a document's history.\n function makeChangeFromHistory(doc, type, allowSelectionOnly) {\n var suppress = doc.cm && doc.cm.state.suppressEdits;\n if (suppress && !allowSelectionOnly) { return }\n\n var hist = doc.history, event, selAfter = doc.sel;\n var source = type == \"undo\" ? hist.done : hist.undone, dest = type == \"undo\" ? hist.undone : hist.done;\n\n // Verify that there is a useable event (so that ctrl-z won't\n // needlessly clear selection events)\n var i = 0;\n for (; i < source.length; i++) {\n event = source[i];\n if (allowSelectionOnly ? event.ranges && !event.equals(doc.sel) : !event.ranges)\n { break }\n }\n if (i == source.length) { return }\n hist.lastOrigin = hist.lastSelOrigin = null;\n\n for (;;) {\n event = source.pop();\n if (event.ranges) {\n pushSelectionToHistory(event, dest);\n if (allowSelectionOnly && !event.equals(doc.sel)) {\n setSelection(doc, event, {clearRedo: false});\n return\n }\n selAfter = event;\n } else if (suppress) {\n source.push(event);\n return\n } else { break }\n }\n\n // Build up a reverse change object to add to the opposite history\n // stack (redo when undoing, and vice versa).\n var antiChanges = [];\n pushSelectionToHistory(selAfter, dest);\n dest.push({changes: antiChanges, generation: hist.generation});\n hist.generation = event.generation || ++hist.maxGeneration;\n\n var filter = hasHandler(doc, \"beforeChange\") || doc.cm && hasHandler(doc.cm, \"beforeChange\");\n\n var loop = function ( i ) {\n var change = event.changes[i];\n change.origin = type;\n if (filter && !filterChange(doc, change, false)) {\n source.length = 0;\n return {}\n }\n\n antiChanges.push(historyChangeFromChange(doc, change));\n\n var after = i ? computeSelAfterChange(doc, change) : lst(source);\n makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change));\n if (!i && doc.cm) { doc.cm.scrollIntoView({from: change.from, to: changeEnd(change)}); }\n var rebased = [];\n\n // Propagate to the linked documents\n linkedDocs(doc, function (doc, sharedHist) {\n if (!sharedHist && indexOf(rebased, doc.history) == -1) {\n rebaseHist(doc.history, change);\n rebased.push(doc.history);\n }\n makeChangeSingleDoc(doc, change, null, mergeOldSpans(doc, change));\n });\n };\n\n for (var i$1 = event.changes.length - 1; i$1 >= 0; --i$1) {\n var returned = loop( i$1 );\n\n if ( returned ) return returned.v;\n }\n }\n\n // Sub-views need their line numbers shifted when text is added\n // above or below them in the parent document.\n function shiftDoc(doc, distance) {\n if (distance == 0) { return }\n doc.first += distance;\n doc.sel = new Selection(map(doc.sel.ranges, function (range) { return new Range(\n Pos(range.anchor.line + distance, range.anchor.ch),\n Pos(range.head.line + distance, range.head.ch)\n ); }), doc.sel.primIndex);\n if (doc.cm) {\n regChange(doc.cm, doc.first, doc.first - distance, distance);\n for (var d = doc.cm.display, l = d.viewFrom; l < d.viewTo; l++)\n { regLineChange(doc.cm, l, \"gutter\"); }\n }\n }\n\n // More lower-level change function, handling only a single document\n // (not linked ones).\n function makeChangeSingleDoc(doc, change, selAfter, spans) {\n if (doc.cm && !doc.cm.curOp)\n { return operation(doc.cm, makeChangeSingleDoc)(doc, change, selAfter, spans) }\n\n if (change.to.line < doc.first) {\n shiftDoc(doc, change.text.length - 1 - (change.to.line - change.from.line));\n return\n }\n if (change.from.line > doc.lastLine()) { return }\n\n // Clip the change to the size of this doc\n if (change.from.line < doc.first) {\n var shift = change.text.length - 1 - (doc.first - change.from.line);\n shiftDoc(doc, shift);\n change = {from: Pos(doc.first, 0), to: Pos(change.to.line + shift, change.to.ch),\n text: [lst(change.text)], origin: change.origin};\n }\n var last = doc.lastLine();\n if (change.to.line > last) {\n change = {from: change.from, to: Pos(last, getLine(doc, last).text.length),\n text: [change.text[0]], origin: change.origin};\n }\n\n change.removed = getBetween(doc, change.from, change.to);\n\n if (!selAfter) { selAfter = computeSelAfterChange(doc, change); }\n if (doc.cm) { makeChangeSingleDocInEditor(doc.cm, change, spans); }\n else { updateDoc(doc, change, spans); }\n setSelectionNoUndo(doc, selAfter, sel_dontScroll);\n\n if (doc.cantEdit && skipAtomic(doc, Pos(doc.firstLine(), 0)))\n { doc.cantEdit = false; }\n }\n\n // Handle the interaction of a change to a document with the editor\n // that this document is part of.\n function makeChangeSingleDocInEditor(cm, change, spans) {\n var doc = cm.doc, display = cm.display, from = change.from, to = change.to;\n\n var recomputeMaxLength = false, checkWidthStart = from.line;\n if (!cm.options.lineWrapping) {\n checkWidthStart = lineNo(visualLine(getLine(doc, from.line)));\n doc.iter(checkWidthStart, to.line + 1, function (line) {\n if (line == display.maxLine) {\n recomputeMaxLength = true;\n return true\n }\n });\n }\n\n if (doc.sel.contains(change.from, change.to) > -1)\n { signalCursorActivity(cm); }\n\n updateDoc(doc, change, spans, estimateHeight(cm));\n\n if (!cm.options.lineWrapping) {\n doc.iter(checkWidthStart, from.line + change.text.length, function (line) {\n var len = lineLength(line);\n if (len > display.maxLineLength) {\n display.maxLine = line;\n display.maxLineLength = len;\n display.maxLineChanged = true;\n recomputeMaxLength = false;\n }\n });\n if (recomputeMaxLength) { cm.curOp.updateMaxLine = true; }\n }\n\n retreatFrontier(doc, from.line);\n startWorker(cm, 400);\n\n var lendiff = change.text.length - (to.line - from.line) - 1;\n // Remember that these lines changed, for updating the display\n if (change.full)\n { regChange(cm); }\n else if (from.line == to.line && change.text.length == 1 && !isWholeLineUpdate(cm.doc, change))\n { regLineChange(cm, from.line, \"text\"); }\n else\n { regChange(cm, from.line, to.line + 1, lendiff); }\n\n var changesHandler = hasHandler(cm, \"changes\"), changeHandler = hasHandler(cm, \"change\");\n if (changeHandler || changesHandler) {\n var obj = {\n from: from, to: to,\n text: change.text,\n removed: change.removed,\n origin: change.origin\n };\n if (changeHandler) { signalLater(cm, \"change\", cm, obj); }\n if (changesHandler) { (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push(obj); }\n }\n cm.display.selForContextMenu = null;\n }\n\n function replaceRange(doc, code, from, to, origin) {\n var assign;\n\n if (!to) { to = from; }\n if (cmp(to, from) < 0) { (assign = [to, from], from = assign[0], to = assign[1]); }\n if (typeof code == \"string\") { code = doc.splitLines(code); }\n makeChange(doc, {from: from, to: to, text: code, origin: origin});\n }\n\n // Rebasing/resetting history to deal with externally-sourced changes\n\n function rebaseHistSelSingle(pos, from, to, diff) {\n if (to < pos.line) {\n pos.line += diff;\n } else if (from < pos.line) {\n pos.line = from;\n pos.ch = 0;\n }\n }\n\n // Tries to rebase an array of history events given a change in the\n // document. If the change touches the same lines as the event, the\n // event, and everything 'behind' it, is discarded. If the change is\n // before the event, the event's positions are updated. Uses a\n // copy-on-write scheme for the positions, to avoid having to\n // reallocate them all on every rebase, but also avoid problems with\n // shared position objects being unsafely updated.\n function rebaseHistArray(array, from, to, diff) {\n for (var i = 0; i < array.length; ++i) {\n var sub = array[i], ok = true;\n if (sub.ranges) {\n if (!sub.copied) { sub = array[i] = sub.deepCopy(); sub.copied = true; }\n for (var j = 0; j < sub.ranges.length; j++) {\n rebaseHistSelSingle(sub.ranges[j].anchor, from, to, diff);\n rebaseHistSelSingle(sub.ranges[j].head, from, to, diff);\n }\n continue\n }\n for (var j$1 = 0; j$1 < sub.changes.length; ++j$1) {\n var cur = sub.changes[j$1];\n if (to < cur.from.line) {\n cur.from = Pos(cur.from.line + diff, cur.from.ch);\n cur.to = Pos(cur.to.line + diff, cur.to.ch);\n } else if (from <= cur.to.line) {\n ok = false;\n break\n }\n }\n if (!ok) {\n array.splice(0, i + 1);\n i = 0;\n }\n }\n }\n\n function rebaseHist(hist, change) {\n var from = change.from.line, to = change.to.line, diff = change.text.length - (to - from) - 1;\n rebaseHistArray(hist.done, from, to, diff);\n rebaseHistArray(hist.undone, from, to, diff);\n }\n\n // Utility for applying a change to a line by handle or number,\n // returning the number and optionally registering the line as\n // changed.\n function changeLine(doc, handle, changeType, op) {\n var no = handle, line = handle;\n if (typeof handle == \"number\") { line = getLine(doc, clipLine(doc, handle)); }\n else { no = lineNo(handle); }\n if (no == null) { return null }\n if (op(line, no) && doc.cm) { regLineChange(doc.cm, no, changeType); }\n return line\n }\n\n // The document is represented as a BTree consisting of leaves, with\n // chunk of lines in them, and branches, with up to ten leaves or\n // other branch nodes below them. The top node is always a branch\n // node, and is the document object itself (meaning it has\n // additional methods and properties).\n //\n // All nodes have parent links. The tree is used both to go from\n // line numbers to line objects, and to go from objects to numbers.\n // It also indexes by height, and is used to convert between height\n // and line object, and to find the total height of the document.\n //\n // See also http://marijnhaverbeke.nl/blog/codemirror-line-tree.html\n\n function LeafChunk(lines) {\n this.lines = lines;\n this.parent = null;\n var height = 0;\n for (var i = 0; i < lines.length; ++i) {\n lines[i].parent = this;\n height += lines[i].height;\n }\n this.height = height;\n }\n\n LeafChunk.prototype = {\n chunkSize: function() { return this.lines.length },\n\n // Remove the n lines at offset 'at'.\n removeInner: function(at, n) {\n for (var i = at, e = at + n; i < e; ++i) {\n var line = this.lines[i];\n this.height -= line.height;\n cleanUpLine(line);\n signalLater(line, \"delete\");\n }\n this.lines.splice(at, n);\n },\n\n // Helper used to collapse a small branch into a single leaf.\n collapse: function(lines) {\n lines.push.apply(lines, this.lines);\n },\n\n // Insert the given array of lines at offset 'at', count them as\n // having the given height.\n insertInner: function(at, lines, height) {\n this.height += height;\n this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at));\n for (var i = 0; i < lines.length; ++i) { lines[i].parent = this; }\n },\n\n // Used to iterate over a part of the tree.\n iterN: function(at, n, op) {\n for (var e = at + n; at < e; ++at)\n { if (op(this.lines[at])) { return true } }\n }\n };\n\n function BranchChunk(children) {\n this.children = children;\n var size = 0, height = 0;\n for (var i = 0; i < children.length; ++i) {\n var ch = children[i];\n size += ch.chunkSize(); height += ch.height;\n ch.parent = this;\n }\n this.size = size;\n this.height = height;\n this.parent = null;\n }\n\n BranchChunk.prototype = {\n chunkSize: function() { return this.size },\n\n removeInner: function(at, n) {\n this.size -= n;\n for (var i = 0; i < this.children.length; ++i) {\n var child = this.children[i], sz = child.chunkSize();\n if (at < sz) {\n var rm = Math.min(n, sz - at), oldHeight = child.height;\n child.removeInner(at, rm);\n this.height -= oldHeight - child.height;\n if (sz == rm) { this.children.splice(i--, 1); child.parent = null; }\n if ((n -= rm) == 0) { break }\n at = 0;\n } else { at -= sz; }\n }\n // If the result is smaller than 25 lines, ensure that it is a\n // single leaf node.\n if (this.size - n < 25 &&\n (this.children.length > 1 || !(this.children[0] instanceof LeafChunk))) {\n var lines = [];\n this.collapse(lines);\n this.children = [new LeafChunk(lines)];\n this.children[0].parent = this;\n }\n },\n\n collapse: function(lines) {\n for (var i = 0; i < this.children.length; ++i) { this.children[i].collapse(lines); }\n },\n\n insertInner: function(at, lines, height) {\n this.size += lines.length;\n this.height += height;\n for (var i = 0; i < this.children.length; ++i) {\n var child = this.children[i], sz = child.chunkSize();\n if (at <= sz) {\n child.insertInner(at, lines, height);\n if (child.lines && child.lines.length > 50) {\n // To avoid memory thrashing when child.lines is huge (e.g. first view of a large file), it's never spliced.\n // Instead, small slices are taken. They're taken in order because sequential memory accesses are fastest.\n var remaining = child.lines.length % 25 + 25;\n for (var pos = remaining; pos < child.lines.length;) {\n var leaf = new LeafChunk(child.lines.slice(pos, pos += 25));\n child.height -= leaf.height;\n this.children.splice(++i, 0, leaf);\n leaf.parent = this;\n }\n child.lines = child.lines.slice(0, remaining);\n this.maybeSpill();\n }\n break\n }\n at -= sz;\n }\n },\n\n // When a node has grown, check whether it should be split.\n maybeSpill: function() {\n if (this.children.length <= 10) { return }\n var me = this;\n do {\n var spilled = me.children.splice(me.children.length - 5, 5);\n var sibling = new BranchChunk(spilled);\n if (!me.parent) { // Become the parent node\n var copy = new BranchChunk(me.children);\n copy.parent = me;\n me.children = [copy, sibling];\n me = copy;\n } else {\n me.size -= sibling.size;\n me.height -= sibling.height;\n var myIndex = indexOf(me.parent.children, me);\n me.parent.children.splice(myIndex + 1, 0, sibling);\n }\n sibling.parent = me.parent;\n } while (me.children.length > 10)\n me.parent.maybeSpill();\n },\n\n iterN: function(at, n, op) {\n for (var i = 0; i < this.children.length; ++i) {\n var child = this.children[i], sz = child.chunkSize();\n if (at < sz) {\n var used = Math.min(n, sz - at);\n if (child.iterN(at, used, op)) { return true }\n if ((n -= used) == 0) { break }\n at = 0;\n } else { at -= sz; }\n }\n }\n };\n\n // Line widgets are block elements displayed above or below a line.\n\n var LineWidget = function(doc, node, options) {\n if (options) { for (var opt in options) { if (options.hasOwnProperty(opt))\n { this[opt] = options[opt]; } } }\n this.doc = doc;\n this.node = node;\n };\n\n LineWidget.prototype.clear = function () {\n var cm = this.doc.cm, ws = this.line.widgets, line = this.line, no = lineNo(line);\n if (no == null || !ws) { return }\n for (var i = 0; i < ws.length; ++i) { if (ws[i] == this) { ws.splice(i--, 1); } }\n if (!ws.length) { line.widgets = null; }\n var height = widgetHeight(this);\n updateLineHeight(line, Math.max(0, line.height - height));\n if (cm) {\n runInOp(cm, function () {\n adjustScrollWhenAboveVisible(cm, line, -height);\n regLineChange(cm, no, \"widget\");\n });\n signalLater(cm, \"lineWidgetCleared\", cm, this, no);\n }\n };\n\n LineWidget.prototype.changed = function () {\n var this$1 = this;\n\n var oldH = this.height, cm = this.doc.cm, line = this.line;\n this.height = null;\n var diff = widgetHeight(this) - oldH;\n if (!diff) { return }\n if (!lineIsHidden(this.doc, line)) { updateLineHeight(line, line.height + diff); }\n if (cm) {\n runInOp(cm, function () {\n cm.curOp.forceUpdate = true;\n adjustScrollWhenAboveVisible(cm, line, diff);\n signalLater(cm, \"lineWidgetChanged\", cm, this$1, lineNo(line));\n });\n }\n };\n eventMixin(LineWidget);\n\n function adjustScrollWhenAboveVisible(cm, line, diff) {\n if (heightAtLine(line) < ((cm.curOp && cm.curOp.scrollTop) || cm.doc.scrollTop))\n { addToScrollTop(cm, diff); }\n }\n\n function addLineWidget(doc, handle, node, options) {\n var widget = new LineWidget(doc, node, options);\n var cm = doc.cm;\n if (cm && widget.noHScroll) { cm.display.alignWidgets = true; }\n changeLine(doc, handle, \"widget\", function (line) {\n var widgets = line.widgets || (line.widgets = []);\n if (widget.insertAt == null) { widgets.push(widget); }\n else { widgets.splice(Math.min(widgets.length, Math.max(0, widget.insertAt)), 0, widget); }\n widget.line = line;\n if (cm && !lineIsHidden(doc, line)) {\n var aboveVisible = heightAtLine(line) < doc.scrollTop;\n updateLineHeight(line, line.height + widgetHeight(widget));\n if (aboveVisible) { addToScrollTop(cm, widget.height); }\n cm.curOp.forceUpdate = true;\n }\n return true\n });\n if (cm) { signalLater(cm, \"lineWidgetAdded\", cm, widget, typeof handle == \"number\" ? handle : lineNo(handle)); }\n return widget\n }\n\n // TEXTMARKERS\n\n // Created with markText and setBookmark methods. A TextMarker is a\n // handle that can be used to clear or find a marked position in the\n // document. Line objects hold arrays (markedSpans) containing\n // {from, to, marker} object pointing to such marker objects, and\n // indicating that such a marker is present on that line. Multiple\n // lines may point to the same marker when it spans across lines.\n // The spans will have null for their from/to properties when the\n // marker continues beyond the start/end of the line. Markers have\n // links back to the lines they currently touch.\n\n // Collapsed markers have unique ids, in order to be able to order\n // them, which is needed for uniquely determining an outer marker\n // when they overlap (they may nest, but not partially overlap).\n var nextMarkerId = 0;\n\n var TextMarker = function(doc, type) {\n this.lines = [];\n this.type = type;\n this.doc = doc;\n this.id = ++nextMarkerId;\n };\n\n // Clear the marker.\n TextMarker.prototype.clear = function () {\n if (this.explicitlyCleared) { return }\n var cm = this.doc.cm, withOp = cm && !cm.curOp;\n if (withOp) { startOperation(cm); }\n if (hasHandler(this, \"clear\")) {\n var found = this.find();\n if (found) { signalLater(this, \"clear\", found.from, found.to); }\n }\n var min = null, max = null;\n for (var i = 0; i < this.lines.length; ++i) {\n var line = this.lines[i];\n var span = getMarkedSpanFor(line.markedSpans, this);\n if (cm && !this.collapsed) { regLineChange(cm, lineNo(line), \"text\"); }\n else if (cm) {\n if (span.to != null) { max = lineNo(line); }\n if (span.from != null) { min = lineNo(line); }\n }\n line.markedSpans = removeMarkedSpan(line.markedSpans, span);\n if (span.from == null && this.collapsed && !lineIsHidden(this.doc, line) && cm)\n { updateLineHeight(line, textHeight(cm.display)); }\n }\n if (cm && this.collapsed && !cm.options.lineWrapping) { for (var i$1 = 0; i$1 < this.lines.length; ++i$1) {\n var visual = visualLine(this.lines[i$1]), len = lineLength(visual);\n if (len > cm.display.maxLineLength) {\n cm.display.maxLine = visual;\n cm.display.maxLineLength = len;\n cm.display.maxLineChanged = true;\n }\n } }\n\n if (min != null && cm && this.collapsed) { regChange(cm, min, max + 1); }\n this.lines.length = 0;\n this.explicitlyCleared = true;\n if (this.atomic && this.doc.cantEdit) {\n this.doc.cantEdit = false;\n if (cm) { reCheckSelection(cm.doc); }\n }\n if (cm) { signalLater(cm, \"markerCleared\", cm, this, min, max); }\n if (withOp) { endOperation(cm); }\n if (this.parent) { this.parent.clear(); }\n };\n\n // Find the position of the marker in the document. Returns a {from,\n // to} object by default. Side can be passed to get a specific side\n // -- 0 (both), -1 (left), or 1 (right). When lineObj is true, the\n // Pos objects returned contain a line object, rather than a line\n // number (used to prevent looking up the same line twice).\n TextMarker.prototype.find = function (side, lineObj) {\n if (side == null && this.type == \"bookmark\") { side = 1; }\n var from, to;\n for (var i = 0; i < this.lines.length; ++i) {\n var line = this.lines[i];\n var span = getMarkedSpanFor(line.markedSpans, this);\n if (span.from != null) {\n from = Pos(lineObj ? line : lineNo(line), span.from);\n if (side == -1) { return from }\n }\n if (span.to != null) {\n to = Pos(lineObj ? line : lineNo(line), span.to);\n if (side == 1) { return to }\n }\n }\n return from && {from: from, to: to}\n };\n\n // Signals that the marker's widget changed, and surrounding layout\n // should be recomputed.\n TextMarker.prototype.changed = function () {\n var this$1 = this;\n\n var pos = this.find(-1, true), widget = this, cm = this.doc.cm;\n if (!pos || !cm) { return }\n runInOp(cm, function () {\n var line = pos.line, lineN = lineNo(pos.line);\n var view = findViewForLine(cm, lineN);\n if (view) {\n clearLineMeasurementCacheFor(view);\n cm.curOp.selectionChanged = cm.curOp.forceUpdate = true;\n }\n cm.curOp.updateMaxLine = true;\n if (!lineIsHidden(widget.doc, line) && widget.height != null) {\n var oldHeight = widget.height;\n widget.height = null;\n var dHeight = widgetHeight(widget) - oldHeight;\n if (dHeight)\n { updateLineHeight(line, line.height + dHeight); }\n }\n signalLater(cm, \"markerChanged\", cm, this$1);\n });\n };\n\n TextMarker.prototype.attachLine = function (line) {\n if (!this.lines.length && this.doc.cm) {\n var op = this.doc.cm.curOp;\n if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1)\n { (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this); }\n }\n this.lines.push(line);\n };\n\n TextMarker.prototype.detachLine = function (line) {\n this.lines.splice(indexOf(this.lines, line), 1);\n if (!this.lines.length && this.doc.cm) {\n var op = this.doc.cm.curOp\n ;(op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this);\n }\n };\n eventMixin(TextMarker);\n\n // Create a marker, wire it up to the right lines, and\n function markText(doc, from, to, options, type) {\n // Shared markers (across linked documents) are handled separately\n // (markTextShared will call out to this again, once per\n // document).\n if (options && options.shared) { return markTextShared(doc, from, to, options, type) }\n // Ensure we are in an operation.\n if (doc.cm && !doc.cm.curOp) { return operation(doc.cm, markText)(doc, from, to, options, type) }\n\n var marker = new TextMarker(doc, type), diff = cmp(from, to);\n if (options) { copyObj(options, marker, false); }\n // Don't connect empty markers unless clearWhenEmpty is false\n if (diff > 0 || diff == 0 && marker.clearWhenEmpty !== false)\n { return marker }\n if (marker.replacedWith) {\n // Showing up as a widget implies collapsed (widget replaces text)\n marker.collapsed = true;\n marker.widgetNode = eltP(\"span\", [marker.replacedWith], \"CodeMirror-widget\");\n if (!options.handleMouseEvents) { marker.widgetNode.setAttribute(\"cm-ignore-events\", \"true\"); }\n if (options.insertLeft) { marker.widgetNode.insertLeft = true; }\n }\n if (marker.collapsed) {\n if (conflictingCollapsedRange(doc, from.line, from, to, marker) ||\n from.line != to.line && conflictingCollapsedRange(doc, to.line, from, to, marker))\n { throw new Error(\"Inserting collapsed marker partially overlapping an existing one\") }\n seeCollapsedSpans();\n }\n\n if (marker.addToHistory)\n { addChangeToHistory(doc, {from: from, to: to, origin: \"markText\"}, doc.sel, NaN); }\n\n var curLine = from.line, cm = doc.cm, updateMaxLine;\n doc.iter(curLine, to.line + 1, function (line) {\n if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(line) == cm.display.maxLine)\n { updateMaxLine = true; }\n if (marker.collapsed && curLine != from.line) { updateLineHeight(line, 0); }\n addMarkedSpan(line, new MarkedSpan(marker,\n curLine == from.line ? from.ch : null,\n curLine == to.line ? to.ch : null));\n ++curLine;\n });\n // lineIsHidden depends on the presence of the spans, so needs a second pass\n if (marker.collapsed) { doc.iter(from.line, to.line + 1, function (line) {\n if (lineIsHidden(doc, line)) { updateLineHeight(line, 0); }\n }); }\n\n if (marker.clearOnEnter) { on(marker, \"beforeCursorEnter\", function () { return marker.clear(); }); }\n\n if (marker.readOnly) {\n seeReadOnlySpans();\n if (doc.history.done.length || doc.history.undone.length)\n { doc.clearHistory(); }\n }\n if (marker.collapsed) {\n marker.id = ++nextMarkerId;\n marker.atomic = true;\n }\n if (cm) {\n // Sync editor state\n if (updateMaxLine) { cm.curOp.updateMaxLine = true; }\n if (marker.collapsed)\n { regChange(cm, from.line, to.line + 1); }\n else if (marker.className || marker.startStyle || marker.endStyle || marker.css ||\n marker.attributes || marker.title)\n { for (var i = from.line; i <= to.line; i++) { regLineChange(cm, i, \"text\"); } }\n if (marker.atomic) { reCheckSelection(cm.doc); }\n signalLater(cm, \"markerAdded\", cm, marker);\n }\n return marker\n }\n\n // SHARED TEXTMARKERS\n\n // A shared marker spans multiple linked documents. It is\n // implemented as a meta-marker-object controlling multiple normal\n // markers.\n var SharedTextMarker = function(markers, primary) {\n this.markers = markers;\n this.primary = primary;\n for (var i = 0; i < markers.length; ++i)\n { markers[i].parent = this; }\n };\n\n SharedTextMarker.prototype.clear = function () {\n if (this.explicitlyCleared) { return }\n this.explicitlyCleared = true;\n for (var i = 0; i < this.markers.length; ++i)\n { this.markers[i].clear(); }\n signalLater(this, \"clear\");\n };\n\n SharedTextMarker.prototype.find = function (side, lineObj) {\n return this.primary.find(side, lineObj)\n };\n eventMixin(SharedTextMarker);\n\n function markTextShared(doc, from, to, options, type) {\n options = copyObj(options);\n options.shared = false;\n var markers = [markText(doc, from, to, options, type)], primary = markers[0];\n var widget = options.widgetNode;\n linkedDocs(doc, function (doc) {\n if (widget) { options.widgetNode = widget.cloneNode(true); }\n markers.push(markText(doc, clipPos(doc, from), clipPos(doc, to), options, type));\n for (var i = 0; i < doc.linked.length; ++i)\n { if (doc.linked[i].isParent) { return } }\n primary = lst(markers);\n });\n return new SharedTextMarker(markers, primary)\n }\n\n function findSharedMarkers(doc) {\n return doc.findMarks(Pos(doc.first, 0), doc.clipPos(Pos(doc.lastLine())), function (m) { return m.parent; })\n }\n\n function copySharedMarkers(doc, markers) {\n for (var i = 0; i < markers.length; i++) {\n var marker = markers[i], pos = marker.find();\n var mFrom = doc.clipPos(pos.from), mTo = doc.clipPos(pos.to);\n if (cmp(mFrom, mTo)) {\n var subMark = markText(doc, mFrom, mTo, marker.primary, marker.primary.type);\n marker.markers.push(subMark);\n subMark.parent = marker;\n }\n }\n }\n\n function detachSharedMarkers(markers) {\n var loop = function ( i ) {\n var marker = markers[i], linked = [marker.primary.doc];\n linkedDocs(marker.primary.doc, function (d) { return linked.push(d); });\n for (var j = 0; j < marker.markers.length; j++) {\n var subMarker = marker.markers[j];\n if (indexOf(linked, subMarker.doc) == -1) {\n subMarker.parent = null;\n marker.markers.splice(j--, 1);\n }\n }\n };\n\n for (var i = 0; i < markers.length; i++) loop( i );\n }\n\n var nextDocId = 0;\n var Doc = function(text, mode, firstLine, lineSep, direction) {\n if (!(this instanceof Doc)) { return new Doc(text, mode, firstLine, lineSep, direction) }\n if (firstLine == null) { firstLine = 0; }\n\n BranchChunk.call(this, [new LeafChunk([new Line(\"\", null)])]);\n this.first = firstLine;\n this.scrollTop = this.scrollLeft = 0;\n this.cantEdit = false;\n this.cleanGeneration = 1;\n this.modeFrontier = this.highlightFrontier = firstLine;\n var start = Pos(firstLine, 0);\n this.sel = simpleSelection(start);\n this.history = new History(null);\n this.id = ++nextDocId;\n this.modeOption = mode;\n this.lineSep = lineSep;\n this.direction = (direction == \"rtl\") ? \"rtl\" : \"ltr\";\n this.extend = false;\n\n if (typeof text == \"string\") { text = this.splitLines(text); }\n updateDoc(this, {from: start, to: start, text: text});\n setSelection(this, simpleSelection(start), sel_dontScroll);\n };\n\n Doc.prototype = createObj(BranchChunk.prototype, {\n constructor: Doc,\n // Iterate over the document. Supports two forms -- with only one\n // argument, it calls that for each line in the document. With\n // three, it iterates over the range given by the first two (with\n // the second being non-inclusive).\n iter: function(from, to, op) {\n if (op) { this.iterN(from - this.first, to - from, op); }\n else { this.iterN(this.first, this.first + this.size, from); }\n },\n\n // Non-public interface for adding and removing lines.\n insert: function(at, lines) {\n var height = 0;\n for (var i = 0; i < lines.length; ++i) { height += lines[i].height; }\n this.insertInner(at - this.first, lines, height);\n },\n remove: function(at, n) { this.removeInner(at - this.first, n); },\n\n // From here, the methods are part of the public interface. Most\n // are also available from CodeMirror (editor) instances.\n\n getValue: function(lineSep) {\n var lines = getLines(this, this.first, this.first + this.size);\n if (lineSep === false) { return lines }\n return lines.join(lineSep || this.lineSeparator())\n },\n setValue: docMethodOp(function(code) {\n var top = Pos(this.first, 0), last = this.first + this.size - 1;\n makeChange(this, {from: top, to: Pos(last, getLine(this, last).text.length),\n text: this.splitLines(code), origin: \"setValue\", full: true}, true);\n if (this.cm) { scrollToCoords(this.cm, 0, 0); }\n setSelection(this, simpleSelection(top), sel_dontScroll);\n }),\n replaceRange: function(code, from, to, origin) {\n from = clipPos(this, from);\n to = to ? clipPos(this, to) : from;\n replaceRange(this, code, from, to, origin);\n },\n getRange: function(from, to, lineSep) {\n var lines = getBetween(this, clipPos(this, from), clipPos(this, to));\n if (lineSep === false) { return lines }\n return lines.join(lineSep || this.lineSeparator())\n },\n\n getLine: function(line) {var l = this.getLineHandle(line); return l && l.text},\n\n getLineHandle: function(line) {if (isLine(this, line)) { return getLine(this, line) }},\n getLineNumber: function(line) {return lineNo(line)},\n\n getLineHandleVisualStart: function(line) {\n if (typeof line == \"number\") { line = getLine(this, line); }\n return visualLine(line)\n },\n\n lineCount: function() {return this.size},\n firstLine: function() {return this.first},\n lastLine: function() {return this.first + this.size - 1},\n\n clipPos: function(pos) {return clipPos(this, pos)},\n\n getCursor: function(start) {\n var range = this.sel.primary(), pos;\n if (start == null || start == \"head\") { pos = range.head; }\n else if (start == \"anchor\") { pos = range.anchor; }\n else if (start == \"end\" || start == \"to\" || start === false) { pos = range.to(); }\n else { pos = range.from(); }\n return pos\n },\n listSelections: function() { return this.sel.ranges },\n somethingSelected: function() {return this.sel.somethingSelected()},\n\n setCursor: docMethodOp(function(line, ch, options) {\n setSimpleSelection(this, clipPos(this, typeof line == \"number\" ? Pos(line, ch || 0) : line), null, options);\n }),\n setSelection: docMethodOp(function(anchor, head, options) {\n setSimpleSelection(this, clipPos(this, anchor), clipPos(this, head || anchor), options);\n }),\n extendSelection: docMethodOp(function(head, other, options) {\n extendSelection(this, clipPos(this, head), other && clipPos(this, other), options);\n }),\n extendSelections: docMethodOp(function(heads, options) {\n extendSelections(this, clipPosArray(this, heads), options);\n }),\n extendSelectionsBy: docMethodOp(function(f, options) {\n var heads = map(this.sel.ranges, f);\n extendSelections(this, clipPosArray(this, heads), options);\n }),\n setSelections: docMethodOp(function(ranges, primary, options) {\n if (!ranges.length) { return }\n var out = [];\n for (var i = 0; i < ranges.length; i++)\n { out[i] = new Range(clipPos(this, ranges[i].anchor),\n clipPos(this, ranges[i].head)); }\n if (primary == null) { primary = Math.min(ranges.length - 1, this.sel.primIndex); }\n setSelection(this, normalizeSelection(this.cm, out, primary), options);\n }),\n addSelection: docMethodOp(function(anchor, head, options) {\n var ranges = this.sel.ranges.slice(0);\n ranges.push(new Range(clipPos(this, anchor), clipPos(this, head || anchor)));\n setSelection(this, normalizeSelection(this.cm, ranges, ranges.length - 1), options);\n }),\n\n getSelection: function(lineSep) {\n var ranges = this.sel.ranges, lines;\n for (var i = 0; i < ranges.length; i++) {\n var sel = getBetween(this, ranges[i].from(), ranges[i].to());\n lines = lines ? lines.concat(sel) : sel;\n }\n if (lineSep === false) { return lines }\n else { return lines.join(lineSep || this.lineSeparator()) }\n },\n getSelections: function(lineSep) {\n var parts = [], ranges = this.sel.ranges;\n for (var i = 0; i < ranges.length; i++) {\n var sel = getBetween(this, ranges[i].from(), ranges[i].to());\n if (lineSep !== false) { sel = sel.join(lineSep || this.lineSeparator()); }\n parts[i] = sel;\n }\n return parts\n },\n replaceSelection: function(code, collapse, origin) {\n var dup = [];\n for (var i = 0; i < this.sel.ranges.length; i++)\n { dup[i] = code; }\n this.replaceSelections(dup, collapse, origin || \"+input\");\n },\n replaceSelections: docMethodOp(function(code, collapse, origin) {\n var changes = [], sel = this.sel;\n for (var i = 0; i < sel.ranges.length; i++) {\n var range = sel.ranges[i];\n changes[i] = {from: range.from(), to: range.to(), text: this.splitLines(code[i]), origin: origin};\n }\n var newSel = collapse && collapse != \"end\" && computeReplacedSel(this, changes, collapse);\n for (var i$1 = changes.length - 1; i$1 >= 0; i$1--)\n { makeChange(this, changes[i$1]); }\n if (newSel) { setSelectionReplaceHistory(this, newSel); }\n else if (this.cm) { ensureCursorVisible(this.cm); }\n }),\n undo: docMethodOp(function() {makeChangeFromHistory(this, \"undo\");}),\n redo: docMethodOp(function() {makeChangeFromHistory(this, \"redo\");}),\n undoSelection: docMethodOp(function() {makeChangeFromHistory(this, \"undo\", true);}),\n redoSelection: docMethodOp(function() {makeChangeFromHistory(this, \"redo\", true);}),\n\n setExtending: function(val) {this.extend = val;},\n getExtending: function() {return this.extend},\n\n historySize: function() {\n var hist = this.history, done = 0, undone = 0;\n for (var i = 0; i < hist.done.length; i++) { if (!hist.done[i].ranges) { ++done; } }\n for (var i$1 = 0; i$1 < hist.undone.length; i$1++) { if (!hist.undone[i$1].ranges) { ++undone; } }\n return {undo: done, redo: undone}\n },\n clearHistory: function() {\n var this$1 = this;\n\n this.history = new History(this.history.maxGeneration);\n linkedDocs(this, function (doc) { return doc.history = this$1.history; }, true);\n },\n\n markClean: function() {\n this.cleanGeneration = this.changeGeneration(true);\n },\n changeGeneration: function(forceSplit) {\n if (forceSplit)\n { this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null; }\n return this.history.generation\n },\n isClean: function (gen) {\n return this.history.generation == (gen || this.cleanGeneration)\n },\n\n getHistory: function() {\n return {done: copyHistoryArray(this.history.done),\n undone: copyHistoryArray(this.history.undone)}\n },\n setHistory: function(histData) {\n var hist = this.history = new History(this.history.maxGeneration);\n hist.done = copyHistoryArray(histData.done.slice(0), null, true);\n hist.undone = copyHistoryArray(histData.undone.slice(0), null, true);\n },\n\n setGutterMarker: docMethodOp(function(line, gutterID, value) {\n return changeLine(this, line, \"gutter\", function (line) {\n var markers = line.gutterMarkers || (line.gutterMarkers = {});\n markers[gutterID] = value;\n if (!value && isEmpty(markers)) { line.gutterMarkers = null; }\n return true\n })\n }),\n\n clearGutter: docMethodOp(function(gutterID) {\n var this$1 = this;\n\n this.iter(function (line) {\n if (line.gutterMarkers && line.gutterMarkers[gutterID]) {\n changeLine(this$1, line, \"gutter\", function () {\n line.gutterMarkers[gutterID] = null;\n if (isEmpty(line.gutterMarkers)) { line.gutterMarkers = null; }\n return true\n });\n }\n });\n }),\n\n lineInfo: function(line) {\n var n;\n if (typeof line == \"number\") {\n if (!isLine(this, line)) { return null }\n n = line;\n line = getLine(this, line);\n if (!line) { return null }\n } else {\n n = lineNo(line);\n if (n == null) { return null }\n }\n return {line: n, handle: line, text: line.text, gutterMarkers: line.gutterMarkers,\n textClass: line.textClass, bgClass: line.bgClass, wrapClass: line.wrapClass,\n widgets: line.widgets}\n },\n\n addLineClass: docMethodOp(function(handle, where, cls) {\n return changeLine(this, handle, where == \"gutter\" ? \"gutter\" : \"class\", function (line) {\n var prop = where == \"text\" ? \"textClass\"\n : where == \"background\" ? \"bgClass\"\n : where == \"gutter\" ? \"gutterClass\" : \"wrapClass\";\n if (!line[prop]) { line[prop] = cls; }\n else if (classTest(cls).test(line[prop])) { return false }\n else { line[prop] += \" \" + cls; }\n return true\n })\n }),\n removeLineClass: docMethodOp(function(handle, where, cls) {\n return changeLine(this, handle, where == \"gutter\" ? \"gutter\" : \"class\", function (line) {\n var prop = where == \"text\" ? \"textClass\"\n : where == \"background\" ? \"bgClass\"\n : where == \"gutter\" ? \"gutterClass\" : \"wrapClass\";\n var cur = line[prop];\n if (!cur) { return false }\n else if (cls == null) { line[prop] = null; }\n else {\n var found = cur.match(classTest(cls));\n if (!found) { return false }\n var end = found.index + found[0].length;\n line[prop] = cur.slice(0, found.index) + (!found.index || end == cur.length ? \"\" : \" \") + cur.slice(end) || null;\n }\n return true\n })\n }),\n\n addLineWidget: docMethodOp(function(handle, node, options) {\n return addLineWidget(this, handle, node, options)\n }),\n removeLineWidget: function(widget) { widget.clear(); },\n\n markText: function(from, to, options) {\n return markText(this, clipPos(this, from), clipPos(this, to), options, options && options.type || \"range\")\n },\n setBookmark: function(pos, options) {\n var realOpts = {replacedWith: options && (options.nodeType == null ? options.widget : options),\n insertLeft: options && options.insertLeft,\n clearWhenEmpty: false, shared: options && options.shared,\n handleMouseEvents: options && options.handleMouseEvents};\n pos = clipPos(this, pos);\n return markText(this, pos, pos, realOpts, \"bookmark\")\n },\n findMarksAt: function(pos) {\n pos = clipPos(this, pos);\n var markers = [], spans = getLine(this, pos.line).markedSpans;\n if (spans) { for (var i = 0; i < spans.length; ++i) {\n var span = spans[i];\n if ((span.from == null || span.from <= pos.ch) &&\n (span.to == null || span.to >= pos.ch))\n { markers.push(span.marker.parent || span.marker); }\n } }\n return markers\n },\n findMarks: function(from, to, filter) {\n from = clipPos(this, from); to = clipPos(this, to);\n var found = [], lineNo = from.line;\n this.iter(from.line, to.line + 1, function (line) {\n var spans = line.markedSpans;\n if (spans) { for (var i = 0; i < spans.length; i++) {\n var span = spans[i];\n if (!(span.to != null && lineNo == from.line && from.ch >= span.to ||\n span.from == null && lineNo != from.line ||\n span.from != null && lineNo == to.line && span.from >= to.ch) &&\n (!filter || filter(span.marker)))\n { found.push(span.marker.parent || span.marker); }\n } }\n ++lineNo;\n });\n return found\n },\n getAllMarks: function() {\n var markers = [];\n this.iter(function (line) {\n var sps = line.markedSpans;\n if (sps) { for (var i = 0; i < sps.length; ++i)\n { if (sps[i].from != null) { markers.push(sps[i].marker); } } }\n });\n return markers\n },\n\n posFromIndex: function(off) {\n var ch, lineNo = this.first, sepSize = this.lineSeparator().length;\n this.iter(function (line) {\n var sz = line.text.length + sepSize;\n if (sz > off) { ch = off; return true }\n off -= sz;\n ++lineNo;\n });\n return clipPos(this, Pos(lineNo, ch))\n },\n indexFromPos: function (coords) {\n coords = clipPos(this, coords);\n var index = coords.ch;\n if (coords.line < this.first || coords.ch < 0) { return 0 }\n var sepSize = this.lineSeparator().length;\n this.iter(this.first, coords.line, function (line) { // iter aborts when callback returns a truthy value\n index += line.text.length + sepSize;\n });\n return index\n },\n\n copy: function(copyHistory) {\n var doc = new Doc(getLines(this, this.first, this.first + this.size),\n this.modeOption, this.first, this.lineSep, this.direction);\n doc.scrollTop = this.scrollTop; doc.scrollLeft = this.scrollLeft;\n doc.sel = this.sel;\n doc.extend = false;\n if (copyHistory) {\n doc.history.undoDepth = this.history.undoDepth;\n doc.setHistory(this.getHistory());\n }\n return doc\n },\n\n linkedDoc: function(options) {\n if (!options) { options = {}; }\n var from = this.first, to = this.first + this.size;\n if (options.from != null && options.from > from) { from = options.from; }\n if (options.to != null && options.to < to) { to = options.to; }\n var copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from, this.lineSep, this.direction);\n if (options.sharedHist) { copy.history = this.history\n ; }(this.linked || (this.linked = [])).push({doc: copy, sharedHist: options.sharedHist});\n copy.linked = [{doc: this, isParent: true, sharedHist: options.sharedHist}];\n copySharedMarkers(copy, findSharedMarkers(this));\n return copy\n },\n unlinkDoc: function(other) {\n if (other instanceof CodeMirror) { other = other.doc; }\n if (this.linked) { for (var i = 0; i < this.linked.length; ++i) {\n var link = this.linked[i];\n if (link.doc != other) { continue }\n this.linked.splice(i, 1);\n other.unlinkDoc(this);\n detachSharedMarkers(findSharedMarkers(this));\n break\n } }\n // If the histories were shared, split them again\n if (other.history == this.history) {\n var splitIds = [other.id];\n linkedDocs(other, function (doc) { return splitIds.push(doc.id); }, true);\n other.history = new History(null);\n other.history.done = copyHistoryArray(this.history.done, splitIds);\n other.history.undone = copyHistoryArray(this.history.undone, splitIds);\n }\n },\n iterLinkedDocs: function(f) {linkedDocs(this, f);},\n\n getMode: function() {return this.mode},\n getEditor: function() {return this.cm},\n\n splitLines: function(str) {\n if (this.lineSep) { return str.split(this.lineSep) }\n return splitLinesAuto(str)\n },\n lineSeparator: function() { return this.lineSep || \"\\n\" },\n\n setDirection: docMethodOp(function (dir) {\n if (dir != \"rtl\") { dir = \"ltr\"; }\n if (dir == this.direction) { return }\n this.direction = dir;\n this.iter(function (line) { return line.order = null; });\n if (this.cm) { directionChanged(this.cm); }\n })\n });\n\n // Public alias.\n Doc.prototype.eachLine = Doc.prototype.iter;\n\n // Kludge to work around strange IE behavior where it'll sometimes\n // re-fire a series of drag-related events right after the drop (#1551)\n var lastDrop = 0;\n\n function onDrop(e) {\n var cm = this;\n clearDragCursor(cm);\n if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e))\n { return }\n e_preventDefault(e);\n if (ie) { lastDrop = +new Date; }\n var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files;\n if (!pos || cm.isReadOnly()) { return }\n // Might be a file drop, in which case we simply extract the text\n // and insert it.\n if (files && files.length && window.FileReader && window.File) {\n var n = files.length, text = Array(n), read = 0;\n var markAsReadAndPasteIfAllFilesAreRead = function () {\n if (++read == n) {\n operation(cm, function () {\n pos = clipPos(cm.doc, pos);\n var change = {from: pos, to: pos,\n text: cm.doc.splitLines(\n text.filter(function (t) { return t != null; }).join(cm.doc.lineSeparator())),\n origin: \"paste\"};\n makeChange(cm.doc, change);\n setSelectionReplaceHistory(cm.doc, simpleSelection(clipPos(cm.doc, pos), clipPos(cm.doc, changeEnd(change))));\n })();\n }\n };\n var readTextFromFile = function (file, i) {\n if (cm.options.allowDropFileTypes &&\n indexOf(cm.options.allowDropFileTypes, file.type) == -1) {\n markAsReadAndPasteIfAllFilesAreRead();\n return\n }\n var reader = new FileReader;\n reader.onerror = function () { return markAsReadAndPasteIfAllFilesAreRead(); };\n reader.onload = function () {\n var content = reader.result;\n if (/[\\x00-\\x08\\x0e-\\x1f]{2}/.test(content)) {\n markAsReadAndPasteIfAllFilesAreRead();\n return\n }\n text[i] = content;\n markAsReadAndPasteIfAllFilesAreRead();\n };\n reader.readAsText(file);\n };\n for (var i = 0; i < files.length; i++) { readTextFromFile(files[i], i); }\n } else { // Normal drop\n // Don't do a replace if the drop happened inside of the selected text.\n if (cm.state.draggingText && cm.doc.sel.contains(pos) > -1) {\n cm.state.draggingText(e);\n // Ensure the editor is re-focused\n setTimeout(function () { return cm.display.input.focus(); }, 20);\n return\n }\n try {\n var text$1 = e.dataTransfer.getData(\"Text\");\n if (text$1) {\n var selected;\n if (cm.state.draggingText && !cm.state.draggingText.copy)\n { selected = cm.listSelections(); }\n setSelectionNoUndo(cm.doc, simpleSelection(pos, pos));\n if (selected) { for (var i$1 = 0; i$1 < selected.length; ++i$1)\n { replaceRange(cm.doc, \"\", selected[i$1].anchor, selected[i$1].head, \"drag\"); } }\n cm.replaceSelection(text$1, \"around\", \"paste\");\n cm.display.input.focus();\n }\n }\n catch(e$1){}\n }\n }\n\n function onDragStart(cm, e) {\n if (ie && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return }\n if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) { return }\n\n e.dataTransfer.setData(\"Text\", cm.getSelection());\n e.dataTransfer.effectAllowed = \"copyMove\";\n\n // Use dummy image instead of default browsers image.\n // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there.\n if (e.dataTransfer.setDragImage && !safari) {\n var img = elt(\"img\", null, null, \"position: fixed; left: 0; top: 0;\");\n img.src = \"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\";\n if (presto) {\n img.width = img.height = 1;\n cm.display.wrapper.appendChild(img);\n // Force a relayout, or Opera won't use our image for some obscure reason\n img._top = img.offsetTop;\n }\n e.dataTransfer.setDragImage(img, 0, 0);\n if (presto) { img.parentNode.removeChild(img); }\n }\n }\n\n function onDragOver(cm, e) {\n var pos = posFromMouse(cm, e);\n if (!pos) { return }\n var frag = document.createDocumentFragment();\n drawSelectionCursor(cm, pos, frag);\n if (!cm.display.dragCursor) {\n cm.display.dragCursor = elt(\"div\", null, \"CodeMirror-cursors CodeMirror-dragcursors\");\n cm.display.lineSpace.insertBefore(cm.display.dragCursor, cm.display.cursorDiv);\n }\n removeChildrenAndAdd(cm.display.dragCursor, frag);\n }\n\n function clearDragCursor(cm) {\n if (cm.display.dragCursor) {\n cm.display.lineSpace.removeChild(cm.display.dragCursor);\n cm.display.dragCursor = null;\n }\n }\n\n // These must be handled carefully, because naively registering a\n // handler for each editor will cause the editors to never be\n // garbage collected.\n\n function forEachCodeMirror(f) {\n if (!document.getElementsByClassName) { return }\n var byClass = document.getElementsByClassName(\"CodeMirror\"), editors = [];\n for (var i = 0; i < byClass.length; i++) {\n var cm = byClass[i].CodeMirror;\n if (cm) { editors.push(cm); }\n }\n if (editors.length) { editors[0].operation(function () {\n for (var i = 0; i < editors.length; i++) { f(editors[i]); }\n }); }\n }\n\n var globalsRegistered = false;\n function ensureGlobalHandlers() {\n if (globalsRegistered) { return }\n registerGlobalHandlers();\n globalsRegistered = true;\n }\n function registerGlobalHandlers() {\n // When the window resizes, we need to refresh active editors.\n var resizeTimer;\n on(window, \"resize\", function () {\n if (resizeTimer == null) { resizeTimer = setTimeout(function () {\n resizeTimer = null;\n forEachCodeMirror(onResize);\n }, 100); }\n });\n // When the window loses focus, we want to show the editor as blurred\n on(window, \"blur\", function () { return forEachCodeMirror(onBlur); });\n }\n // Called when the window resizes\n function onResize(cm) {\n var d = cm.display;\n // Might be a text scaling operation, clear size caches.\n d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null;\n d.scrollbarsClipped = false;\n cm.setSize();\n }\n\n var keyNames = {\n 3: \"Pause\", 8: \"Backspace\", 9: \"Tab\", 13: \"Enter\", 16: \"Shift\", 17: \"Ctrl\", 18: \"Alt\",\n 19: \"Pause\", 20: \"CapsLock\", 27: \"Esc\", 32: \"Space\", 33: \"PageUp\", 34: \"PageDown\", 35: \"End\",\n 36: \"Home\", 37: \"Left\", 38: \"Up\", 39: \"Right\", 40: \"Down\", 44: \"PrintScrn\", 45: \"Insert\",\n 46: \"Delete\", 59: \";\", 61: \"=\", 91: \"Mod\", 92: \"Mod\", 93: \"Mod\",\n 106: \"*\", 107: \"=\", 109: \"-\", 110: \".\", 111: \"/\", 145: \"ScrollLock\",\n 173: \"-\", 186: \";\", 187: \"=\", 188: \",\", 189: \"-\", 190: \".\", 191: \"/\", 192: \"`\", 219: \"[\", 220: \"\\\\\",\n 221: \"]\", 222: \"'\", 224: \"Mod\", 63232: \"Up\", 63233: \"Down\", 63234: \"Left\", 63235: \"Right\", 63272: \"Delete\",\n 63273: \"Home\", 63275: \"End\", 63276: \"PageUp\", 63277: \"PageDown\", 63302: \"Insert\"\n };\n\n // Number keys\n for (var i = 0; i < 10; i++) { keyNames[i + 48] = keyNames[i + 96] = String(i); }\n // Alphabetic keys\n for (var i$1 = 65; i$1 <= 90; i$1++) { keyNames[i$1] = String.fromCharCode(i$1); }\n // Function keys\n for (var i$2 = 1; i$2 <= 12; i$2++) { keyNames[i$2 + 111] = keyNames[i$2 + 63235] = \"F\" + i$2; }\n\n var keyMap = {};\n\n keyMap.basic = {\n \"Left\": \"goCharLeft\", \"Right\": \"goCharRight\", \"Up\": \"goLineUp\", \"Down\": \"goLineDown\",\n \"End\": \"goLineEnd\", \"Home\": \"goLineStartSmart\", \"PageUp\": \"goPageUp\", \"PageDown\": \"goPageDown\",\n \"Delete\": \"delCharAfter\", \"Backspace\": \"delCharBefore\", \"Shift-Backspace\": \"delCharBefore\",\n \"Tab\": \"defaultTab\", \"Shift-Tab\": \"indentAuto\",\n \"Enter\": \"newlineAndIndent\", \"Insert\": \"toggleOverwrite\",\n \"Esc\": \"singleSelection\"\n };\n // Note that the save and find-related commands aren't defined by\n // default. User code or addons can define them. Unknown commands\n // are simply ignored.\n keyMap.pcDefault = {\n \"Ctrl-A\": \"selectAll\", \"Ctrl-D\": \"deleteLine\", \"Ctrl-Z\": \"undo\", \"Shift-Ctrl-Z\": \"redo\", \"Ctrl-Y\": \"redo\",\n \"Ctrl-Home\": \"goDocStart\", \"Ctrl-End\": \"goDocEnd\", \"Ctrl-Up\": \"goLineUp\", \"Ctrl-Down\": \"goLineDown\",\n \"Ctrl-Left\": \"goGroupLeft\", \"Ctrl-Right\": \"goGroupRight\", \"Alt-Left\": \"goLineStart\", \"Alt-Right\": \"goLineEnd\",\n \"Ctrl-Backspace\": \"delGroupBefore\", \"Ctrl-Delete\": \"delGroupAfter\", \"Ctrl-S\": \"save\", \"Ctrl-F\": \"find\",\n \"Ctrl-G\": \"findNext\", \"Shift-Ctrl-G\": \"findPrev\", \"Shift-Ctrl-F\": \"replace\", \"Shift-Ctrl-R\": \"replaceAll\",\n \"Ctrl-[\": \"indentLess\", \"Ctrl-]\": \"indentMore\",\n \"Ctrl-U\": \"undoSelection\", \"Shift-Ctrl-U\": \"redoSelection\", \"Alt-U\": \"redoSelection\",\n \"fallthrough\": \"basic\"\n };\n // Very basic readline/emacs-style bindings, which are standard on Mac.\n keyMap.emacsy = {\n \"Ctrl-F\": \"goCharRight\", \"Ctrl-B\": \"goCharLeft\", \"Ctrl-P\": \"goLineUp\", \"Ctrl-N\": \"goLineDown\",\n \"Alt-F\": \"goWordRight\", \"Alt-B\": \"goWordLeft\", \"Ctrl-A\": \"goLineStart\", \"Ctrl-E\": \"goLineEnd\",\n \"Ctrl-V\": \"goPageDown\", \"Shift-Ctrl-V\": \"goPageUp\", \"Ctrl-D\": \"delCharAfter\", \"Ctrl-H\": \"delCharBefore\",\n \"Alt-D\": \"delWordAfter\", \"Alt-Backspace\": \"delWordBefore\", \"Ctrl-K\": \"killLine\", \"Ctrl-T\": \"transposeChars\",\n \"Ctrl-O\": \"openLine\"\n };\n keyMap.macDefault = {\n \"Cmd-A\": \"selectAll\", \"Cmd-D\": \"deleteLine\", \"Cmd-Z\": \"undo\", \"Shift-Cmd-Z\": \"redo\", \"Cmd-Y\": \"redo\",\n \"Cmd-Home\": \"goDocStart\", \"Cmd-Up\": \"goDocStart\", \"Cmd-End\": \"goDocEnd\", \"Cmd-Down\": \"goDocEnd\", \"Alt-Left\": \"goGroupLeft\",\n \"Alt-Right\": \"goGroupRight\", \"Cmd-Left\": \"goLineLeft\", \"Cmd-Right\": \"goLineRight\", \"Alt-Backspace\": \"delGroupBefore\",\n \"Ctrl-Alt-Backspace\": \"delGroupAfter\", \"Alt-Delete\": \"delGroupAfter\", \"Cmd-S\": \"save\", \"Cmd-F\": \"find\",\n \"Cmd-G\": \"findNext\", \"Shift-Cmd-G\": \"findPrev\", \"Cmd-Alt-F\": \"replace\", \"Shift-Cmd-Alt-F\": \"replaceAll\",\n \"Cmd-[\": \"indentLess\", \"Cmd-]\": \"indentMore\", \"Cmd-Backspace\": \"delWrappedLineLeft\", \"Cmd-Delete\": \"delWrappedLineRight\",\n \"Cmd-U\": \"undoSelection\", \"Shift-Cmd-U\": \"redoSelection\", \"Ctrl-Up\": \"goDocStart\", \"Ctrl-Down\": \"goDocEnd\",\n \"fallthrough\": [\"basic\", \"emacsy\"]\n };\n keyMap[\"default\"] = mac ? keyMap.macDefault : keyMap.pcDefault;\n\n // KEYMAP DISPATCH\n\n function normalizeKeyName(name) {\n var parts = name.split(/-(?!$)/);\n name = parts[parts.length - 1];\n var alt, ctrl, shift, cmd;\n for (var i = 0; i < parts.length - 1; i++) {\n var mod = parts[i];\n if (/^(cmd|meta|m)$/i.test(mod)) { cmd = true; }\n else if (/^a(lt)?$/i.test(mod)) { alt = true; }\n else if (/^(c|ctrl|control)$/i.test(mod)) { ctrl = true; }\n else if (/^s(hift)?$/i.test(mod)) { shift = true; }\n else { throw new Error(\"Unrecognized modifier name: \" + mod) }\n }\n if (alt) { name = \"Alt-\" + name; }\n if (ctrl) { name = \"Ctrl-\" + name; }\n if (cmd) { name = \"Cmd-\" + name; }\n if (shift) { name = \"Shift-\" + name; }\n return name\n }\n\n // This is a kludge to keep keymaps mostly working as raw objects\n // (backwards compatibility) while at the same time support features\n // like normalization and multi-stroke key bindings. It compiles a\n // new normalized keymap, and then updates the old object to reflect\n // this.\n function normalizeKeyMap(keymap) {\n var copy = {};\n for (var keyname in keymap) { if (keymap.hasOwnProperty(keyname)) {\n var value = keymap[keyname];\n if (/^(name|fallthrough|(de|at)tach)$/.test(keyname)) { continue }\n if (value == \"...\") { delete keymap[keyname]; continue }\n\n var keys = map(keyname.split(\" \"), normalizeKeyName);\n for (var i = 0; i < keys.length; i++) {\n var val = (void 0), name = (void 0);\n if (i == keys.length - 1) {\n name = keys.join(\" \");\n val = value;\n } else {\n name = keys.slice(0, i + 1).join(\" \");\n val = \"...\";\n }\n var prev = copy[name];\n if (!prev) { copy[name] = val; }\n else if (prev != val) { throw new Error(\"Inconsistent bindings for \" + name) }\n }\n delete keymap[keyname];\n } }\n for (var prop in copy) { keymap[prop] = copy[prop]; }\n return keymap\n }\n\n function lookupKey(key, map, handle, context) {\n map = getKeyMap(map);\n var found = map.call ? map.call(key, context) : map[key];\n if (found === false) { return \"nothing\" }\n if (found === \"...\") { return \"multi\" }\n if (found != null && handle(found)) { return \"handled\" }\n\n if (map.fallthrough) {\n if (Object.prototype.toString.call(map.fallthrough) != \"[object Array]\")\n { return lookupKey(key, map.fallthrough, handle, context) }\n for (var i = 0; i < map.fallthrough.length; i++) {\n var result = lookupKey(key, map.fallthrough[i], handle, context);\n if (result) { return result }\n }\n }\n }\n\n // Modifier key presses don't count as 'real' key presses for the\n // purpose of keymap fallthrough.\n function isModifierKey(value) {\n var name = typeof value == \"string\" ? value : keyNames[value.keyCode];\n return name == \"Ctrl\" || name == \"Alt\" || name == \"Shift\" || name == \"Mod\"\n }\n\n function addModifierNames(name, event, noShift) {\n var base = name;\n if (event.altKey && base != \"Alt\") { name = \"Alt-\" + name; }\n if ((flipCtrlCmd ? event.metaKey : event.ctrlKey) && base != \"Ctrl\") { name = \"Ctrl-\" + name; }\n if ((flipCtrlCmd ? event.ctrlKey : event.metaKey) && base != \"Mod\") { name = \"Cmd-\" + name; }\n if (!noShift && event.shiftKey && base != \"Shift\") { name = \"Shift-\" + name; }\n return name\n }\n\n // Look up the name of a key as indicated by an event object.\n function keyName(event, noShift) {\n if (presto && event.keyCode == 34 && event[\"char\"]) { return false }\n var name = keyNames[event.keyCode];\n if (name == null || event.altGraphKey) { return false }\n // Ctrl-ScrollLock has keyCode 3, same as Ctrl-Pause,\n // so we'll use event.code when available (Chrome 48+, FF 38+, Safari 10.1+)\n if (event.keyCode == 3 && event.code) { name = event.code; }\n return addModifierNames(name, event, noShift)\n }\n\n function getKeyMap(val) {\n return typeof val == \"string\" ? keyMap[val] : val\n }\n\n // Helper for deleting text near the selection(s), used to implement\n // backspace, delete, and similar functionality.\n function deleteNearSelection(cm, compute) {\n var ranges = cm.doc.sel.ranges, kill = [];\n // Build up a set of ranges to kill first, merging overlapping\n // ranges.\n for (var i = 0; i < ranges.length; i++) {\n var toKill = compute(ranges[i]);\n while (kill.length && cmp(toKill.from, lst(kill).to) <= 0) {\n var replaced = kill.pop();\n if (cmp(replaced.from, toKill.from) < 0) {\n toKill.from = replaced.from;\n break\n }\n }\n kill.push(toKill);\n }\n // Next, remove those actual ranges.\n runInOp(cm, function () {\n for (var i = kill.length - 1; i >= 0; i--)\n { replaceRange(cm.doc, \"\", kill[i].from, kill[i].to, \"+delete\"); }\n ensureCursorVisible(cm);\n });\n }\n\n function moveCharLogically(line, ch, dir) {\n var target = skipExtendingChars(line.text, ch + dir, dir);\n return target < 0 || target > line.text.length ? null : target\n }\n\n function moveLogically(line, start, dir) {\n var ch = moveCharLogically(line, start.ch, dir);\n return ch == null ? null : new Pos(start.line, ch, dir < 0 ? \"after\" : \"before\")\n }\n\n function endOfLine(visually, cm, lineObj, lineNo, dir) {\n if (visually) {\n if (cm.doc.direction == \"rtl\") { dir = -dir; }\n var order = getOrder(lineObj, cm.doc.direction);\n if (order) {\n var part = dir < 0 ? lst(order) : order[0];\n var moveInStorageOrder = (dir < 0) == (part.level == 1);\n var sticky = moveInStorageOrder ? \"after\" : \"before\";\n var ch;\n // With a wrapped rtl chunk (possibly spanning multiple bidi parts),\n // it could be that the last bidi part is not on the last visual line,\n // since visual lines contain content order-consecutive chunks.\n // Thus, in rtl, we are looking for the first (content-order) character\n // in the rtl chunk that is on the last line (that is, the same line\n // as the last (content-order) character).\n if (part.level > 0 || cm.doc.direction == \"rtl\") {\n var prep = prepareMeasureForLine(cm, lineObj);\n ch = dir < 0 ? lineObj.text.length - 1 : 0;\n var targetTop = measureCharPrepared(cm, prep, ch).top;\n ch = findFirst(function (ch) { return measureCharPrepared(cm, prep, ch).top == targetTop; }, (dir < 0) == (part.level == 1) ? part.from : part.to - 1, ch);\n if (sticky == \"before\") { ch = moveCharLogically(lineObj, ch, 1); }\n } else { ch = dir < 0 ? part.to : part.from; }\n return new Pos(lineNo, ch, sticky)\n }\n }\n return new Pos(lineNo, dir < 0 ? lineObj.text.length : 0, dir < 0 ? \"before\" : \"after\")\n }\n\n function moveVisually(cm, line, start, dir) {\n var bidi = getOrder(line, cm.doc.direction);\n if (!bidi) { return moveLogically(line, start, dir) }\n if (start.ch >= line.text.length) {\n start.ch = line.text.length;\n start.sticky = \"before\";\n } else if (start.ch <= 0) {\n start.ch = 0;\n start.sticky = \"after\";\n }\n var partPos = getBidiPartAt(bidi, start.ch, start.sticky), part = bidi[partPos];\n if (cm.doc.direction == \"ltr\" && part.level % 2 == 0 && (dir > 0 ? part.to > start.ch : part.from < start.ch)) {\n // Case 1: We move within an ltr part in an ltr editor. Even with wrapped lines,\n // nothing interesting happens.\n return moveLogically(line, start, dir)\n }\n\n var mv = function (pos, dir) { return moveCharLogically(line, pos instanceof Pos ? pos.ch : pos, dir); };\n var prep;\n var getWrappedLineExtent = function (ch) {\n if (!cm.options.lineWrapping) { return {begin: 0, end: line.text.length} }\n prep = prep || prepareMeasureForLine(cm, line);\n return wrappedLineExtentChar(cm, line, prep, ch)\n };\n var wrappedLineExtent = getWrappedLineExtent(start.sticky == \"before\" ? mv(start, -1) : start.ch);\n\n if (cm.doc.direction == \"rtl\" || part.level == 1) {\n var moveInStorageOrder = (part.level == 1) == (dir < 0);\n var ch = mv(start, moveInStorageOrder ? 1 : -1);\n if (ch != null && (!moveInStorageOrder ? ch >= part.from && ch >= wrappedLineExtent.begin : ch <= part.to && ch <= wrappedLineExtent.end)) {\n // Case 2: We move within an rtl part or in an rtl editor on the same visual line\n var sticky = moveInStorageOrder ? \"before\" : \"after\";\n return new Pos(start.line, ch, sticky)\n }\n }\n\n // Case 3: Could not move within this bidi part in this visual line, so leave\n // the current bidi part\n\n var searchInVisualLine = function (partPos, dir, wrappedLineExtent) {\n var getRes = function (ch, moveInStorageOrder) { return moveInStorageOrder\n ? new Pos(start.line, mv(ch, 1), \"before\")\n : new Pos(start.line, ch, \"after\"); };\n\n for (; partPos >= 0 && partPos < bidi.length; partPos += dir) {\n var part = bidi[partPos];\n var moveInStorageOrder = (dir > 0) == (part.level != 1);\n var ch = moveInStorageOrder ? wrappedLineExtent.begin : mv(wrappedLineExtent.end, -1);\n if (part.from <= ch && ch < part.to) { return getRes(ch, moveInStorageOrder) }\n ch = moveInStorageOrder ? part.from : mv(part.to, -1);\n if (wrappedLineExtent.begin <= ch && ch < wrappedLineExtent.end) { return getRes(ch, moveInStorageOrder) }\n }\n };\n\n // Case 3a: Look for other bidi parts on the same visual line\n var res = searchInVisualLine(partPos + dir, dir, wrappedLineExtent);\n if (res) { return res }\n\n // Case 3b: Look for other bidi parts on the next visual line\n var nextCh = dir > 0 ? wrappedLineExtent.end : mv(wrappedLineExtent.begin, -1);\n if (nextCh != null && !(dir > 0 && nextCh == line.text.length)) {\n res = searchInVisualLine(dir > 0 ? 0 : bidi.length - 1, dir, getWrappedLineExtent(nextCh));\n if (res) { return res }\n }\n\n // Case 4: Nowhere to move\n return null\n }\n\n // Commands are parameter-less actions that can be performed on an\n // editor, mostly used for keybindings.\n var commands = {\n selectAll: selectAll,\n singleSelection: function (cm) { return cm.setSelection(cm.getCursor(\"anchor\"), cm.getCursor(\"head\"), sel_dontScroll); },\n killLine: function (cm) { return deleteNearSelection(cm, function (range) {\n if (range.empty()) {\n var len = getLine(cm.doc, range.head.line).text.length;\n if (range.head.ch == len && range.head.line < cm.lastLine())\n { return {from: range.head, to: Pos(range.head.line + 1, 0)} }\n else\n { return {from: range.head, to: Pos(range.head.line, len)} }\n } else {\n return {from: range.from(), to: range.to()}\n }\n }); },\n deleteLine: function (cm) { return deleteNearSelection(cm, function (range) { return ({\n from: Pos(range.from().line, 0),\n to: clipPos(cm.doc, Pos(range.to().line + 1, 0))\n }); }); },\n delLineLeft: function (cm) { return deleteNearSelection(cm, function (range) { return ({\n from: Pos(range.from().line, 0), to: range.from()\n }); }); },\n delWrappedLineLeft: function (cm) { return deleteNearSelection(cm, function (range) {\n var top = cm.charCoords(range.head, \"div\").top + 5;\n var leftPos = cm.coordsChar({left: 0, top: top}, \"div\");\n return {from: leftPos, to: range.from()}\n }); },\n delWrappedLineRight: function (cm) { return deleteNearSelection(cm, function (range) {\n var top = cm.charCoords(range.head, \"div\").top + 5;\n var rightPos = cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, \"div\");\n return {from: range.from(), to: rightPos }\n }); },\n undo: function (cm) { return cm.undo(); },\n redo: function (cm) { return cm.redo(); },\n undoSelection: function (cm) { return cm.undoSelection(); },\n redoSelection: function (cm) { return cm.redoSelection(); },\n goDocStart: function (cm) { return cm.extendSelection(Pos(cm.firstLine(), 0)); },\n goDocEnd: function (cm) { return cm.extendSelection(Pos(cm.lastLine())); },\n goLineStart: function (cm) { return cm.extendSelectionsBy(function (range) { return lineStart(cm, range.head.line); },\n {origin: \"+move\", bias: 1}\n ); },\n goLineStartSmart: function (cm) { return cm.extendSelectionsBy(function (range) { return lineStartSmart(cm, range.head); },\n {origin: \"+move\", bias: 1}\n ); },\n goLineEnd: function (cm) { return cm.extendSelectionsBy(function (range) { return lineEnd(cm, range.head.line); },\n {origin: \"+move\", bias: -1}\n ); },\n goLineRight: function (cm) { return cm.extendSelectionsBy(function (range) {\n var top = cm.cursorCoords(range.head, \"div\").top + 5;\n return cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, \"div\")\n }, sel_move); },\n goLineLeft: function (cm) { return cm.extendSelectionsBy(function (range) {\n var top = cm.cursorCoords(range.head, \"div\").top + 5;\n return cm.coordsChar({left: 0, top: top}, \"div\")\n }, sel_move); },\n goLineLeftSmart: function (cm) { return cm.extendSelectionsBy(function (range) {\n var top = cm.cursorCoords(range.head, \"div\").top + 5;\n var pos = cm.coordsChar({left: 0, top: top}, \"div\");\n if (pos.ch < cm.getLine(pos.line).search(/\\S/)) { return lineStartSmart(cm, range.head) }\n return pos\n }, sel_move); },\n goLineUp: function (cm) { return cm.moveV(-1, \"line\"); },\n goLineDown: function (cm) { return cm.moveV(1, \"line\"); },\n goPageUp: function (cm) { return cm.moveV(-1, \"page\"); },\n goPageDown: function (cm) { return cm.moveV(1, \"page\"); },\n goCharLeft: function (cm) { return cm.moveH(-1, \"char\"); },\n goCharRight: function (cm) { return cm.moveH(1, \"char\"); },\n goColumnLeft: function (cm) { return cm.moveH(-1, \"column\"); },\n goColumnRight: function (cm) { return cm.moveH(1, \"column\"); },\n goWordLeft: function (cm) { return cm.moveH(-1, \"word\"); },\n goGroupRight: function (cm) { return cm.moveH(1, \"group\"); },\n goGroupLeft: function (cm) { return cm.moveH(-1, \"group\"); },\n goWordRight: function (cm) { return cm.moveH(1, \"word\"); },\n delCharBefore: function (cm) { return cm.deleteH(-1, \"codepoint\"); },\n delCharAfter: function (cm) { return cm.deleteH(1, \"char\"); },\n delWordBefore: function (cm) { return cm.deleteH(-1, \"word\"); },\n delWordAfter: function (cm) { return cm.deleteH(1, \"word\"); },\n delGroupBefore: function (cm) { return cm.deleteH(-1, \"group\"); },\n delGroupAfter: function (cm) { return cm.deleteH(1, \"group\"); },\n indentAuto: function (cm) { return cm.indentSelection(\"smart\"); },\n indentMore: function (cm) { return cm.indentSelection(\"add\"); },\n indentLess: function (cm) { return cm.indentSelection(\"subtract\"); },\n insertTab: function (cm) { return cm.replaceSelection(\"\\t\"); },\n insertSoftTab: function (cm) {\n var spaces = [], ranges = cm.listSelections(), tabSize = cm.options.tabSize;\n for (var i = 0; i < ranges.length; i++) {\n var pos = ranges[i].from();\n var col = countColumn(cm.getLine(pos.line), pos.ch, tabSize);\n spaces.push(spaceStr(tabSize - col % tabSize));\n }\n cm.replaceSelections(spaces);\n },\n defaultTab: function (cm) {\n if (cm.somethingSelected()) { cm.indentSelection(\"add\"); }\n else { cm.execCommand(\"insertTab\"); }\n },\n // Swap the two chars left and right of each selection's head.\n // Move cursor behind the two swapped characters afterwards.\n //\n // Doesn't consider line feeds a character.\n // Doesn't scan more than one line above to find a character.\n // Doesn't do anything on an empty line.\n // Doesn't do anything with non-empty selections.\n transposeChars: function (cm) { return runInOp(cm, function () {\n var ranges = cm.listSelections(), newSel = [];\n for (var i = 0; i < ranges.length; i++) {\n if (!ranges[i].empty()) { continue }\n var cur = ranges[i].head, line = getLine(cm.doc, cur.line).text;\n if (line) {\n if (cur.ch == line.length) { cur = new Pos(cur.line, cur.ch - 1); }\n if (cur.ch > 0) {\n cur = new Pos(cur.line, cur.ch + 1);\n cm.replaceRange(line.charAt(cur.ch - 1) + line.charAt(cur.ch - 2),\n Pos(cur.line, cur.ch - 2), cur, \"+transpose\");\n } else if (cur.line > cm.doc.first) {\n var prev = getLine(cm.doc, cur.line - 1).text;\n if (prev) {\n cur = new Pos(cur.line, 1);\n cm.replaceRange(line.charAt(0) + cm.doc.lineSeparator() +\n prev.charAt(prev.length - 1),\n Pos(cur.line - 1, prev.length - 1), cur, \"+transpose\");\n }\n }\n }\n newSel.push(new Range(cur, cur));\n }\n cm.setSelections(newSel);\n }); },\n newlineAndIndent: function (cm) { return runInOp(cm, function () {\n var sels = cm.listSelections();\n for (var i = sels.length - 1; i >= 0; i--)\n { cm.replaceRange(cm.doc.lineSeparator(), sels[i].anchor, sels[i].head, \"+input\"); }\n sels = cm.listSelections();\n for (var i$1 = 0; i$1 < sels.length; i$1++)\n { cm.indentLine(sels[i$1].from().line, null, true); }\n ensureCursorVisible(cm);\n }); },\n openLine: function (cm) { return cm.replaceSelection(\"\\n\", \"start\"); },\n toggleOverwrite: function (cm) { return cm.toggleOverwrite(); }\n };\n\n\n function lineStart(cm, lineN) {\n var line = getLine(cm.doc, lineN);\n var visual = visualLine(line);\n if (visual != line) { lineN = lineNo(visual); }\n return endOfLine(true, cm, visual, lineN, 1)\n }\n function lineEnd(cm, lineN) {\n var line = getLine(cm.doc, lineN);\n var visual = visualLineEnd(line);\n if (visual != line) { lineN = lineNo(visual); }\n return endOfLine(true, cm, line, lineN, -1)\n }\n function lineStartSmart(cm, pos) {\n var start = lineStart(cm, pos.line);\n var line = getLine(cm.doc, start.line);\n var order = getOrder(line, cm.doc.direction);\n if (!order || order[0].level == 0) {\n var firstNonWS = Math.max(start.ch, line.text.search(/\\S/));\n var inWS = pos.line == start.line && pos.ch <= firstNonWS && pos.ch;\n return Pos(start.line, inWS ? 0 : firstNonWS, start.sticky)\n }\n return start\n }\n\n // Run a handler that was bound to a key.\n function doHandleBinding(cm, bound, dropShift) {\n if (typeof bound == \"string\") {\n bound = commands[bound];\n if (!bound) { return false }\n }\n // Ensure previous input has been read, so that the handler sees a\n // consistent view of the document\n cm.display.input.ensurePolled();\n var prevShift = cm.display.shift, done = false;\n try {\n if (cm.isReadOnly()) { cm.state.suppressEdits = true; }\n if (dropShift) { cm.display.shift = false; }\n done = bound(cm) != Pass;\n } finally {\n cm.display.shift = prevShift;\n cm.state.suppressEdits = false;\n }\n return done\n }\n\n function lookupKeyForEditor(cm, name, handle) {\n for (var i = 0; i < cm.state.keyMaps.length; i++) {\n var result = lookupKey(name, cm.state.keyMaps[i], handle, cm);\n if (result) { return result }\n }\n return (cm.options.extraKeys && lookupKey(name, cm.options.extraKeys, handle, cm))\n || lookupKey(name, cm.options.keyMap, handle, cm)\n }\n\n // Note that, despite the name, this function is also used to check\n // for bound mouse clicks.\n\n var stopSeq = new Delayed;\n\n function dispatchKey(cm, name, e, handle) {\n var seq = cm.state.keySeq;\n if (seq) {\n if (isModifierKey(name)) { return \"handled\" }\n if (/\\'$/.test(name))\n { cm.state.keySeq = null; }\n else\n { stopSeq.set(50, function () {\n if (cm.state.keySeq == seq) {\n cm.state.keySeq = null;\n cm.display.input.reset();\n }\n }); }\n if (dispatchKeyInner(cm, seq + \" \" + name, e, handle)) { return true }\n }\n return dispatchKeyInner(cm, name, e, handle)\n }\n\n function dispatchKeyInner(cm, name, e, handle) {\n var result = lookupKeyForEditor(cm, name, handle);\n\n if (result == \"multi\")\n { cm.state.keySeq = name; }\n if (result == \"handled\")\n { signalLater(cm, \"keyHandled\", cm, name, e); }\n\n if (result == \"handled\" || result == \"multi\") {\n e_preventDefault(e);\n restartBlink(cm);\n }\n\n return !!result\n }\n\n // Handle a key from the keydown event.\n function handleKeyBinding(cm, e) {\n var name = keyName(e, true);\n if (!name) { return false }\n\n if (e.shiftKey && !cm.state.keySeq) {\n // First try to resolve full name (including 'Shift-'). Failing\n // that, see if there is a cursor-motion command (starting with\n // 'go') bound to the keyname without 'Shift-'.\n return dispatchKey(cm, \"Shift-\" + name, e, function (b) { return doHandleBinding(cm, b, true); })\n || dispatchKey(cm, name, e, function (b) {\n if (typeof b == \"string\" ? /^go[A-Z]/.test(b) : b.motion)\n { return doHandleBinding(cm, b) }\n })\n } else {\n return dispatchKey(cm, name, e, function (b) { return doHandleBinding(cm, b); })\n }\n }\n\n // Handle a key from the keypress event\n function handleCharBinding(cm, e, ch) {\n return dispatchKey(cm, \"'\" + ch + \"'\", e, function (b) { return doHandleBinding(cm, b, true); })\n }\n\n var lastStoppedKey = null;\n function onKeyDown(e) {\n var cm = this;\n if (e.target && e.target != cm.display.input.getField()) { return }\n cm.curOp.focus = activeElt();\n if (signalDOMEvent(cm, e)) { return }\n // IE does strange things with escape.\n if (ie && ie_version < 11 && e.keyCode == 27) { e.returnValue = false; }\n var code = e.keyCode;\n cm.display.shift = code == 16 || e.shiftKey;\n var handled = handleKeyBinding(cm, e);\n if (presto) {\n lastStoppedKey = handled ? code : null;\n // Opera has no cut event... we try to at least catch the key combo\n if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey))\n { cm.replaceSelection(\"\", null, \"cut\"); }\n }\n if (gecko && !mac && !handled && code == 46 && e.shiftKey && !e.ctrlKey && document.execCommand)\n { document.execCommand(\"cut\"); }\n\n // Turn mouse into crosshair when Alt is held on Mac.\n if (code == 18 && !/\\bCodeMirror-crosshair\\b/.test(cm.display.lineDiv.className))\n { showCrossHair(cm); }\n }\n\n function showCrossHair(cm) {\n var lineDiv = cm.display.lineDiv;\n addClass(lineDiv, \"CodeMirror-crosshair\");\n\n function up(e) {\n if (e.keyCode == 18 || !e.altKey) {\n rmClass(lineDiv, \"CodeMirror-crosshair\");\n off(document, \"keyup\", up);\n off(document, \"mouseover\", up);\n }\n }\n on(document, \"keyup\", up);\n on(document, \"mouseover\", up);\n }\n\n function onKeyUp(e) {\n if (e.keyCode == 16) { this.doc.sel.shift = false; }\n signalDOMEvent(this, e);\n }\n\n function onKeyPress(e) {\n var cm = this;\n if (e.target && e.target != cm.display.input.getField()) { return }\n if (eventInWidget(cm.display, e) || signalDOMEvent(cm, e) || e.ctrlKey && !e.altKey || mac && e.metaKey) { return }\n var keyCode = e.keyCode, charCode = e.charCode;\n if (presto && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return}\n if ((presto && (!e.which || e.which < 10)) && handleKeyBinding(cm, e)) { return }\n var ch = String.fromCharCode(charCode == null ? keyCode : charCode);\n // Some browsers fire keypress events for backspace\n if (ch == \"\\x08\") { return }\n if (handleCharBinding(cm, e, ch)) { return }\n cm.display.input.onKeyPress(e);\n }\n\n var DOUBLECLICK_DELAY = 400;\n\n var PastClick = function(time, pos, button) {\n this.time = time;\n this.pos = pos;\n this.button = button;\n };\n\n PastClick.prototype.compare = function (time, pos, button) {\n return this.time + DOUBLECLICK_DELAY > time &&\n cmp(pos, this.pos) == 0 && button == this.button\n };\n\n var lastClick, lastDoubleClick;\n function clickRepeat(pos, button) {\n var now = +new Date;\n if (lastDoubleClick && lastDoubleClick.compare(now, pos, button)) {\n lastClick = lastDoubleClick = null;\n return \"triple\"\n } else if (lastClick && lastClick.compare(now, pos, button)) {\n lastDoubleClick = new PastClick(now, pos, button);\n lastClick = null;\n return \"double\"\n } else {\n lastClick = new PastClick(now, pos, button);\n lastDoubleClick = null;\n return \"single\"\n }\n }\n\n // A mouse down can be a single click, double click, triple click,\n // start of selection drag, start of text drag, new cursor\n // (ctrl-click), rectangle drag (alt-drag), or xwin\n // middle-click-paste. Or it might be a click on something we should\n // not interfere with, such as a scrollbar or widget.\n function onMouseDown(e) {\n var cm = this, display = cm.display;\n if (signalDOMEvent(cm, e) || display.activeTouch && display.input.supportsTouch()) { return }\n display.input.ensurePolled();\n display.shift = e.shiftKey;\n\n if (eventInWidget(display, e)) {\n if (!webkit) {\n // Briefly turn off draggability, to allow widgets to do\n // normal dragging things.\n display.scroller.draggable = false;\n setTimeout(function () { return display.scroller.draggable = true; }, 100);\n }\n return\n }\n if (clickInGutter(cm, e)) { return }\n var pos = posFromMouse(cm, e), button = e_button(e), repeat = pos ? clickRepeat(pos, button) : \"single\";\n window.focus();\n\n // #3261: make sure, that we're not starting a second selection\n if (button == 1 && cm.state.selectingText)\n { cm.state.selectingText(e); }\n\n if (pos && handleMappedButton(cm, button, pos, repeat, e)) { return }\n\n if (button == 1) {\n if (pos) { leftButtonDown(cm, pos, repeat, e); }\n else if (e_target(e) == display.scroller) { e_preventDefault(e); }\n } else if (button == 2) {\n if (pos) { extendSelection(cm.doc, pos); }\n setTimeout(function () { return display.input.focus(); }, 20);\n } else if (button == 3) {\n if (captureRightClick) { cm.display.input.onContextMenu(e); }\n else { delayBlurEvent(cm); }\n }\n }\n\n function handleMappedButton(cm, button, pos, repeat, event) {\n var name = \"Click\";\n if (repeat == \"double\") { name = \"Double\" + name; }\n else if (repeat == \"triple\") { name = \"Triple\" + name; }\n name = (button == 1 ? \"Left\" : button == 2 ? \"Middle\" : \"Right\") + name;\n\n return dispatchKey(cm, addModifierNames(name, event), event, function (bound) {\n if (typeof bound == \"string\") { bound = commands[bound]; }\n if (!bound) { return false }\n var done = false;\n try {\n if (cm.isReadOnly()) { cm.state.suppressEdits = true; }\n done = bound(cm, pos) != Pass;\n } finally {\n cm.state.suppressEdits = false;\n }\n return done\n })\n }\n\n function configureMouse(cm, repeat, event) {\n var option = cm.getOption(\"configureMouse\");\n var value = option ? option(cm, repeat, event) : {};\n if (value.unit == null) {\n var rect = chromeOS ? event.shiftKey && event.metaKey : event.altKey;\n value.unit = rect ? \"rectangle\" : repeat == \"single\" ? \"char\" : repeat == \"double\" ? \"word\" : \"line\";\n }\n if (value.extend == null || cm.doc.extend) { value.extend = cm.doc.extend || event.shiftKey; }\n if (value.addNew == null) { value.addNew = mac ? event.metaKey : event.ctrlKey; }\n if (value.moveOnDrag == null) { value.moveOnDrag = !(mac ? event.altKey : event.ctrlKey); }\n return value\n }\n\n function leftButtonDown(cm, pos, repeat, event) {\n if (ie) { setTimeout(bind(ensureFocus, cm), 0); }\n else { cm.curOp.focus = activeElt(); }\n\n var behavior = configureMouse(cm, repeat, event);\n\n var sel = cm.doc.sel, contained;\n if (cm.options.dragDrop && dragAndDrop && !cm.isReadOnly() &&\n repeat == \"single\" && (contained = sel.contains(pos)) > -1 &&\n (cmp((contained = sel.ranges[contained]).from(), pos) < 0 || pos.xRel > 0) &&\n (cmp(contained.to(), pos) > 0 || pos.xRel < 0))\n { leftButtonStartDrag(cm, event, pos, behavior); }\n else\n { leftButtonSelect(cm, event, pos, behavior); }\n }\n\n // Start a text drag. When it ends, see if any dragging actually\n // happen, and treat as a click if it didn't.\n function leftButtonStartDrag(cm, event, pos, behavior) {\n var display = cm.display, moved = false;\n var dragEnd = operation(cm, function (e) {\n if (webkit) { display.scroller.draggable = false; }\n cm.state.draggingText = false;\n if (cm.state.delayingBlurEvent) {\n if (cm.hasFocus()) { cm.state.delayingBlurEvent = false; }\n else { delayBlurEvent(cm); }\n }\n off(display.wrapper.ownerDocument, \"mouseup\", dragEnd);\n off(display.wrapper.ownerDocument, \"mousemove\", mouseMove);\n off(display.scroller, \"dragstart\", dragStart);\n off(display.scroller, \"drop\", dragEnd);\n if (!moved) {\n e_preventDefault(e);\n if (!behavior.addNew)\n { extendSelection(cm.doc, pos, null, null, behavior.extend); }\n // Work around unexplainable focus problem in IE9 (#2127) and Chrome (#3081)\n if ((webkit && !safari) || ie && ie_version == 9)\n { setTimeout(function () {display.wrapper.ownerDocument.body.focus({preventScroll: true}); display.input.focus();}, 20); }\n else\n { display.input.focus(); }\n }\n });\n var mouseMove = function(e2) {\n moved = moved || Math.abs(event.clientX - e2.clientX) + Math.abs(event.clientY - e2.clientY) >= 10;\n };\n var dragStart = function () { return moved = true; };\n // Let the drag handler handle this.\n if (webkit) { display.scroller.draggable = true; }\n cm.state.draggingText = dragEnd;\n dragEnd.copy = !behavior.moveOnDrag;\n on(display.wrapper.ownerDocument, \"mouseup\", dragEnd);\n on(display.wrapper.ownerDocument, \"mousemove\", mouseMove);\n on(display.scroller, \"dragstart\", dragStart);\n on(display.scroller, \"drop\", dragEnd);\n\n cm.state.delayingBlurEvent = true;\n setTimeout(function () { return display.input.focus(); }, 20);\n // IE's approach to draggable\n if (display.scroller.dragDrop) { display.scroller.dragDrop(); }\n }\n\n function rangeForUnit(cm, pos, unit) {\n if (unit == \"char\") { return new Range(pos, pos) }\n if (unit == \"word\") { return cm.findWordAt(pos) }\n if (unit == \"line\") { return new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))) }\n var result = unit(cm, pos);\n return new Range(result.from, result.to)\n }\n\n // Normal selection, as opposed to text dragging.\n function leftButtonSelect(cm, event, start, behavior) {\n if (ie) { delayBlurEvent(cm); }\n var display = cm.display, doc = cm.doc;\n e_preventDefault(event);\n\n var ourRange, ourIndex, startSel = doc.sel, ranges = startSel.ranges;\n if (behavior.addNew && !behavior.extend) {\n ourIndex = doc.sel.contains(start);\n if (ourIndex > -1)\n { ourRange = ranges[ourIndex]; }\n else\n { ourRange = new Range(start, start); }\n } else {\n ourRange = doc.sel.primary();\n ourIndex = doc.sel.primIndex;\n }\n\n if (behavior.unit == \"rectangle\") {\n if (!behavior.addNew) { ourRange = new Range(start, start); }\n start = posFromMouse(cm, event, true, true);\n ourIndex = -1;\n } else {\n var range = rangeForUnit(cm, start, behavior.unit);\n if (behavior.extend)\n { ourRange = extendRange(ourRange, range.anchor, range.head, behavior.extend); }\n else\n { ourRange = range; }\n }\n\n if (!behavior.addNew) {\n ourIndex = 0;\n setSelection(doc, new Selection([ourRange], 0), sel_mouse);\n startSel = doc.sel;\n } else if (ourIndex == -1) {\n ourIndex = ranges.length;\n setSelection(doc, normalizeSelection(cm, ranges.concat([ourRange]), ourIndex),\n {scroll: false, origin: \"*mouse\"});\n } else if (ranges.length > 1 && ranges[ourIndex].empty() && behavior.unit == \"char\" && !behavior.extend) {\n setSelection(doc, normalizeSelection(cm, ranges.slice(0, ourIndex).concat(ranges.slice(ourIndex + 1)), 0),\n {scroll: false, origin: \"*mouse\"});\n startSel = doc.sel;\n } else {\n replaceOneSelection(doc, ourIndex, ourRange, sel_mouse);\n }\n\n var lastPos = start;\n function extendTo(pos) {\n if (cmp(lastPos, pos) == 0) { return }\n lastPos = pos;\n\n if (behavior.unit == \"rectangle\") {\n var ranges = [], tabSize = cm.options.tabSize;\n var startCol = countColumn(getLine(doc, start.line).text, start.ch, tabSize);\n var posCol = countColumn(getLine(doc, pos.line).text, pos.ch, tabSize);\n var left = Math.min(startCol, posCol), right = Math.max(startCol, posCol);\n for (var line = Math.min(start.line, pos.line), end = Math.min(cm.lastLine(), Math.max(start.line, pos.line));\n line <= end; line++) {\n var text = getLine(doc, line).text, leftPos = findColumn(text, left, tabSize);\n if (left == right)\n { ranges.push(new Range(Pos(line, leftPos), Pos(line, leftPos))); }\n else if (text.length > leftPos)\n { ranges.push(new Range(Pos(line, leftPos), Pos(line, findColumn(text, right, tabSize)))); }\n }\n if (!ranges.length) { ranges.push(new Range(start, start)); }\n setSelection(doc, normalizeSelection(cm, startSel.ranges.slice(0, ourIndex).concat(ranges), ourIndex),\n {origin: \"*mouse\", scroll: false});\n cm.scrollIntoView(pos);\n } else {\n var oldRange = ourRange;\n var range = rangeForUnit(cm, pos, behavior.unit);\n var anchor = oldRange.anchor, head;\n if (cmp(range.anchor, anchor) > 0) {\n head = range.head;\n anchor = minPos(oldRange.from(), range.anchor);\n } else {\n head = range.anchor;\n anchor = maxPos(oldRange.to(), range.head);\n }\n var ranges$1 = startSel.ranges.slice(0);\n ranges$1[ourIndex] = bidiSimplify(cm, new Range(clipPos(doc, anchor), head));\n setSelection(doc, normalizeSelection(cm, ranges$1, ourIndex), sel_mouse);\n }\n }\n\n var editorSize = display.wrapper.getBoundingClientRect();\n // Used to ensure timeout re-tries don't fire when another extend\n // happened in the meantime (clearTimeout isn't reliable -- at\n // least on Chrome, the timeouts still happen even when cleared,\n // if the clear happens after their scheduled firing time).\n var counter = 0;\n\n function extend(e) {\n var curCount = ++counter;\n var cur = posFromMouse(cm, e, true, behavior.unit == \"rectangle\");\n if (!cur) { return }\n if (cmp(cur, lastPos) != 0) {\n cm.curOp.focus = activeElt();\n extendTo(cur);\n var visible = visibleLines(display, doc);\n if (cur.line >= visible.to || cur.line < visible.from)\n { setTimeout(operation(cm, function () {if (counter == curCount) { extend(e); }}), 150); }\n } else {\n var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0;\n if (outside) { setTimeout(operation(cm, function () {\n if (counter != curCount) { return }\n display.scroller.scrollTop += outside;\n extend(e);\n }), 50); }\n }\n }\n\n function done(e) {\n cm.state.selectingText = false;\n counter = Infinity;\n // If e is null or undefined we interpret this as someone trying\n // to explicitly cancel the selection rather than the user\n // letting go of the mouse button.\n if (e) {\n e_preventDefault(e);\n display.input.focus();\n }\n off(display.wrapper.ownerDocument, \"mousemove\", move);\n off(display.wrapper.ownerDocument, \"mouseup\", up);\n doc.history.lastSelOrigin = null;\n }\n\n var move = operation(cm, function (e) {\n if (e.buttons === 0 || !e_button(e)) { done(e); }\n else { extend(e); }\n });\n var up = operation(cm, done);\n cm.state.selectingText = up;\n on(display.wrapper.ownerDocument, \"mousemove\", move);\n on(display.wrapper.ownerDocument, \"mouseup\", up);\n }\n\n // Used when mouse-selecting to adjust the anchor to the proper side\n // of a bidi jump depending on the visual position of the head.\n function bidiSimplify(cm, range) {\n var anchor = range.anchor;\n var head = range.head;\n var anchorLine = getLine(cm.doc, anchor.line);\n if (cmp(anchor, head) == 0 && anchor.sticky == head.sticky) { return range }\n var order = getOrder(anchorLine);\n if (!order) { return range }\n var index = getBidiPartAt(order, anchor.ch, anchor.sticky), part = order[index];\n if (part.from != anchor.ch && part.to != anchor.ch) { return range }\n var boundary = index + ((part.from == anchor.ch) == (part.level != 1) ? 0 : 1);\n if (boundary == 0 || boundary == order.length) { return range }\n\n // Compute the relative visual position of the head compared to the\n // anchor (<0 is to the left, >0 to the right)\n var leftSide;\n if (head.line != anchor.line) {\n leftSide = (head.line - anchor.line) * (cm.doc.direction == \"ltr\" ? 1 : -1) > 0;\n } else {\n var headIndex = getBidiPartAt(order, head.ch, head.sticky);\n var dir = headIndex - index || (head.ch - anchor.ch) * (part.level == 1 ? -1 : 1);\n if (headIndex == boundary - 1 || headIndex == boundary)\n { leftSide = dir < 0; }\n else\n { leftSide = dir > 0; }\n }\n\n var usePart = order[boundary + (leftSide ? -1 : 0)];\n var from = leftSide == (usePart.level == 1);\n var ch = from ? usePart.from : usePart.to, sticky = from ? \"after\" : \"before\";\n return anchor.ch == ch && anchor.sticky == sticky ? range : new Range(new Pos(anchor.line, ch, sticky), head)\n }\n\n\n // Determines whether an event happened in the gutter, and fires the\n // handlers for the corresponding event.\n function gutterEvent(cm, e, type, prevent) {\n var mX, mY;\n if (e.touches) {\n mX = e.touches[0].clientX;\n mY = e.touches[0].clientY;\n } else {\n try { mX = e.clientX; mY = e.clientY; }\n catch(e$1) { return false }\n }\n if (mX >= Math.floor(cm.display.gutters.getBoundingClientRect().right)) { return false }\n if (prevent) { e_preventDefault(e); }\n\n var display = cm.display;\n var lineBox = display.lineDiv.getBoundingClientRect();\n\n if (mY > lineBox.bottom || !hasHandler(cm, type)) { return e_defaultPrevented(e) }\n mY -= lineBox.top - display.viewOffset;\n\n for (var i = 0; i < cm.display.gutterSpecs.length; ++i) {\n var g = display.gutters.childNodes[i];\n if (g && g.getBoundingClientRect().right >= mX) {\n var line = lineAtHeight(cm.doc, mY);\n var gutter = cm.display.gutterSpecs[i];\n signal(cm, type, cm, line, gutter.className, e);\n return e_defaultPrevented(e)\n }\n }\n }\n\n function clickInGutter(cm, e) {\n return gutterEvent(cm, e, \"gutterClick\", true)\n }\n\n // CONTEXT MENU HANDLING\n\n // To make the context menu work, we need to briefly unhide the\n // textarea (making it as unobtrusive as possible) to let the\n // right-click take effect on it.\n function onContextMenu(cm, e) {\n if (eventInWidget(cm.display, e) || contextMenuInGutter(cm, e)) { return }\n if (signalDOMEvent(cm, e, \"contextmenu\")) { return }\n if (!captureRightClick) { cm.display.input.onContextMenu(e); }\n }\n\n function contextMenuInGutter(cm, e) {\n if (!hasHandler(cm, \"gutterContextMenu\")) { return false }\n return gutterEvent(cm, e, \"gutterContextMenu\", false)\n }\n\n function themeChanged(cm) {\n cm.display.wrapper.className = cm.display.wrapper.className.replace(/\\s*cm-s-\\S+/g, \"\") +\n cm.options.theme.replace(/(^|\\s)\\s*/g, \" cm-s-\");\n clearCaches(cm);\n }\n\n var Init = {toString: function(){return \"CodeMirror.Init\"}};\n\n var defaults = {};\n var optionHandlers = {};\n\n function defineOptions(CodeMirror) {\n var optionHandlers = CodeMirror.optionHandlers;\n\n function option(name, deflt, handle, notOnInit) {\n CodeMirror.defaults[name] = deflt;\n if (handle) { optionHandlers[name] =\n notOnInit ? function (cm, val, old) {if (old != Init) { handle(cm, val, old); }} : handle; }\n }\n\n CodeMirror.defineOption = option;\n\n // Passed to option handlers when there is no old value.\n CodeMirror.Init = Init;\n\n // These two are, on init, called from the constructor because they\n // have to be initialized before the editor can start at all.\n option(\"value\", \"\", function (cm, val) { return cm.setValue(val); }, true);\n option(\"mode\", null, function (cm, val) {\n cm.doc.modeOption = val;\n loadMode(cm);\n }, true);\n\n option(\"indentUnit\", 2, loadMode, true);\n option(\"indentWithTabs\", false);\n option(\"smartIndent\", true);\n option(\"tabSize\", 4, function (cm) {\n resetModeState(cm);\n clearCaches(cm);\n regChange(cm);\n }, true);\n\n option(\"lineSeparator\", null, function (cm, val) {\n cm.doc.lineSep = val;\n if (!val) { return }\n var newBreaks = [], lineNo = cm.doc.first;\n cm.doc.iter(function (line) {\n for (var pos = 0;;) {\n var found = line.text.indexOf(val, pos);\n if (found == -1) { break }\n pos = found + val.length;\n newBreaks.push(Pos(lineNo, found));\n }\n lineNo++;\n });\n for (var i = newBreaks.length - 1; i >= 0; i--)\n { replaceRange(cm.doc, val, newBreaks[i], Pos(newBreaks[i].line, newBreaks[i].ch + val.length)); }\n });\n option(\"specialChars\", /[\\u0000-\\u001f\\u007f-\\u009f\\u00ad\\u061c\\u200b-\\u200c\\u200e\\u200f\\u2028\\u2029\\ufeff\\ufff9-\\ufffc]/g, function (cm, val, old) {\n cm.state.specialChars = new RegExp(val.source + (val.test(\"\\t\") ? \"\" : \"|\\t\"), \"g\");\n if (old != Init) { cm.refresh(); }\n });\n option(\"specialCharPlaceholder\", defaultSpecialCharPlaceholder, function (cm) { return cm.refresh(); }, true);\n option(\"electricChars\", true);\n option(\"inputStyle\", mobile ? \"contenteditable\" : \"textarea\", function () {\n throw new Error(\"inputStyle can not (yet) be changed in a running editor\") // FIXME\n }, true);\n option(\"spellcheck\", false, function (cm, val) { return cm.getInputField().spellcheck = val; }, true);\n option(\"autocorrect\", false, function (cm, val) { return cm.getInputField().autocorrect = val; }, true);\n option(\"autocapitalize\", false, function (cm, val) { return cm.getInputField().autocapitalize = val; }, true);\n option(\"rtlMoveVisually\", !windows);\n option(\"wholeLineUpdateBefore\", true);\n\n option(\"theme\", \"default\", function (cm) {\n themeChanged(cm);\n updateGutters(cm);\n }, true);\n option(\"keyMap\", \"default\", function (cm, val, old) {\n var next = getKeyMap(val);\n var prev = old != Init && getKeyMap(old);\n if (prev && prev.detach) { prev.detach(cm, next); }\n if (next.attach) { next.attach(cm, prev || null); }\n });\n option(\"extraKeys\", null);\n option(\"configureMouse\", null);\n\n option(\"lineWrapping\", false, wrappingChanged, true);\n option(\"gutters\", [], function (cm, val) {\n cm.display.gutterSpecs = getGutters(val, cm.options.lineNumbers);\n updateGutters(cm);\n }, true);\n option(\"fixedGutter\", true, function (cm, val) {\n cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + \"px\" : \"0\";\n cm.refresh();\n }, true);\n option(\"coverGutterNextToScrollbar\", false, function (cm) { return updateScrollbars(cm); }, true);\n option(\"scrollbarStyle\", \"native\", function (cm) {\n initScrollbars(cm);\n updateScrollbars(cm);\n cm.display.scrollbars.setScrollTop(cm.doc.scrollTop);\n cm.display.scrollbars.setScrollLeft(cm.doc.scrollLeft);\n }, true);\n option(\"lineNumbers\", false, function (cm, val) {\n cm.display.gutterSpecs = getGutters(cm.options.gutters, val);\n updateGutters(cm);\n }, true);\n option(\"firstLineNumber\", 1, updateGutters, true);\n option(\"lineNumberFormatter\", function (integer) { return integer; }, updateGutters, true);\n option(\"showCursorWhenSelecting\", false, updateSelection, true);\n\n option(\"resetSelectionOnContextMenu\", true);\n option(\"lineWiseCopyCut\", true);\n option(\"pasteLinesPerSelection\", true);\n option(\"selectionsMayTouch\", false);\n\n option(\"readOnly\", false, function (cm, val) {\n if (val == \"nocursor\") {\n onBlur(cm);\n cm.display.input.blur();\n }\n cm.display.input.readOnlyChanged(val);\n });\n\n option(\"screenReaderLabel\", null, function (cm, val) {\n val = (val === '') ? null : val;\n cm.display.input.screenReaderLabelChanged(val);\n });\n\n option(\"disableInput\", false, function (cm, val) {if (!val) { cm.display.input.reset(); }}, true);\n option(\"dragDrop\", true, dragDropChanged);\n option(\"allowDropFileTypes\", null);\n\n option(\"cursorBlinkRate\", 530);\n option(\"cursorScrollMargin\", 0);\n option(\"cursorHeight\", 1, updateSelection, true);\n option(\"singleCursorHeightPerLine\", true, updateSelection, true);\n option(\"workTime\", 100);\n option(\"workDelay\", 100);\n option(\"flattenSpans\", true, resetModeState, true);\n option(\"addModeClass\", false, resetModeState, true);\n option(\"pollInterval\", 100);\n option(\"undoDepth\", 200, function (cm, val) { return cm.doc.history.undoDepth = val; });\n option(\"historyEventDelay\", 1250);\n option(\"viewportMargin\", 10, function (cm) { return cm.refresh(); }, true);\n option(\"maxHighlightLength\", 10000, resetModeState, true);\n option(\"moveInputWithCursor\", true, function (cm, val) {\n if (!val) { cm.display.input.resetPosition(); }\n });\n\n option(\"tabindex\", null, function (cm, val) { return cm.display.input.getField().tabIndex = val || \"\"; });\n option(\"autofocus\", null);\n option(\"direction\", \"ltr\", function (cm, val) { return cm.doc.setDirection(val); }, true);\n option(\"phrases\", null);\n }\n\n function dragDropChanged(cm, value, old) {\n var wasOn = old && old != Init;\n if (!value != !wasOn) {\n var funcs = cm.display.dragFunctions;\n var toggle = value ? on : off;\n toggle(cm.display.scroller, \"dragstart\", funcs.start);\n toggle(cm.display.scroller, \"dragenter\", funcs.enter);\n toggle(cm.display.scroller, \"dragover\", funcs.over);\n toggle(cm.display.scroller, \"dragleave\", funcs.leave);\n toggle(cm.display.scroller, \"drop\", funcs.drop);\n }\n }\n\n function wrappingChanged(cm) {\n if (cm.options.lineWrapping) {\n addClass(cm.display.wrapper, \"CodeMirror-wrap\");\n cm.display.sizer.style.minWidth = \"\";\n cm.display.sizerWidth = null;\n } else {\n rmClass(cm.display.wrapper, \"CodeMirror-wrap\");\n findMaxLine(cm);\n }\n estimateLineHeights(cm);\n regChange(cm);\n clearCaches(cm);\n setTimeout(function () { return updateScrollbars(cm); }, 100);\n }\n\n // A CodeMirror instance represents an editor. This is the object\n // that user code is usually dealing with.\n\n function CodeMirror(place, options) {\n var this$1 = this;\n\n if (!(this instanceof CodeMirror)) { return new CodeMirror(place, options) }\n\n this.options = options = options ? copyObj(options) : {};\n // Determine effective options based on given values and defaults.\n copyObj(defaults, options, false);\n\n var doc = options.value;\n if (typeof doc == \"string\") { doc = new Doc(doc, options.mode, null, options.lineSeparator, options.direction); }\n else if (options.mode) { doc.modeOption = options.mode; }\n this.doc = doc;\n\n var input = new CodeMirror.inputStyles[options.inputStyle](this);\n var display = this.display = new Display(place, doc, input, options);\n display.wrapper.CodeMirror = this;\n themeChanged(this);\n if (options.lineWrapping)\n { this.display.wrapper.className += \" CodeMirror-wrap\"; }\n initScrollbars(this);\n\n this.state = {\n keyMaps: [], // stores maps added by addKeyMap\n overlays: [], // highlighting overlays, as added by addOverlay\n modeGen: 0, // bumped when mode/overlay changes, used to invalidate highlighting info\n overwrite: false,\n delayingBlurEvent: false,\n focused: false,\n suppressEdits: false, // used to disable editing during key handlers when in readOnly mode\n pasteIncoming: -1, cutIncoming: -1, // help recognize paste/cut edits in input.poll\n selectingText: false,\n draggingText: false,\n highlight: new Delayed(), // stores highlight worker timeout\n keySeq: null, // Unfinished key sequence\n specialChars: null\n };\n\n if (options.autofocus && !mobile) { display.input.focus(); }\n\n // Override magic textarea content restore that IE sometimes does\n // on our hidden textarea on reload\n if (ie && ie_version < 11) { setTimeout(function () { return this$1.display.input.reset(true); }, 20); }\n\n registerEventHandlers(this);\n ensureGlobalHandlers();\n\n startOperation(this);\n this.curOp.forceUpdate = true;\n attachDoc(this, doc);\n\n if ((options.autofocus && !mobile) || this.hasFocus())\n { setTimeout(function () {\n if (this$1.hasFocus() && !this$1.state.focused) { onFocus(this$1); }\n }, 20); }\n else\n { onBlur(this); }\n\n for (var opt in optionHandlers) { if (optionHandlers.hasOwnProperty(opt))\n { optionHandlers[opt](this, options[opt], Init); } }\n maybeUpdateLineNumberWidth(this);\n if (options.finishInit) { options.finishInit(this); }\n for (var i = 0; i < initHooks.length; ++i) { initHooks[i](this); }\n endOperation(this);\n // Suppress optimizelegibility in Webkit, since it breaks text\n // measuring on line wrapping boundaries.\n if (webkit && options.lineWrapping &&\n getComputedStyle(display.lineDiv).textRendering == \"optimizelegibility\")\n { display.lineDiv.style.textRendering = \"auto\"; }\n }\n\n // The default configuration options.\n CodeMirror.defaults = defaults;\n // Functions to run when options are changed.\n CodeMirror.optionHandlers = optionHandlers;\n\n // Attach the necessary event handlers when initializing the editor\n function registerEventHandlers(cm) {\n var d = cm.display;\n on(d.scroller, \"mousedown\", operation(cm, onMouseDown));\n // Older IE's will not fire a second mousedown for a double click\n if (ie && ie_version < 11)\n { on(d.scroller, \"dblclick\", operation(cm, function (e) {\n if (signalDOMEvent(cm, e)) { return }\n var pos = posFromMouse(cm, e);\n if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) { return }\n e_preventDefault(e);\n var word = cm.findWordAt(pos);\n extendSelection(cm.doc, word.anchor, word.head);\n })); }\n else\n { on(d.scroller, \"dblclick\", function (e) { return signalDOMEvent(cm, e) || e_preventDefault(e); }); }\n // Some browsers fire contextmenu *after* opening the menu, at\n // which point we can't mess with it anymore. Context menu is\n // handled in onMouseDown for these browsers.\n on(d.scroller, \"contextmenu\", function (e) { return onContextMenu(cm, e); });\n on(d.input.getField(), \"contextmenu\", function (e) {\n if (!d.scroller.contains(e.target)) { onContextMenu(cm, e); }\n });\n\n // Used to suppress mouse event handling when a touch happens\n var touchFinished, prevTouch = {end: 0};\n function finishTouch() {\n if (d.activeTouch) {\n touchFinished = setTimeout(function () { return d.activeTouch = null; }, 1000);\n prevTouch = d.activeTouch;\n prevTouch.end = +new Date;\n }\n }\n function isMouseLikeTouchEvent(e) {\n if (e.touches.length != 1) { return false }\n var touch = e.touches[0];\n return touch.radiusX <= 1 && touch.radiusY <= 1\n }\n function farAway(touch, other) {\n if (other.left == null) { return true }\n var dx = other.left - touch.left, dy = other.top - touch.top;\n return dx * dx + dy * dy > 20 * 20\n }\n on(d.scroller, \"touchstart\", function (e) {\n if (!signalDOMEvent(cm, e) && !isMouseLikeTouchEvent(e) && !clickInGutter(cm, e)) {\n d.input.ensurePolled();\n clearTimeout(touchFinished);\n var now = +new Date;\n d.activeTouch = {start: now, moved: false,\n prev: now - prevTouch.end <= 300 ? prevTouch : null};\n if (e.touches.length == 1) {\n d.activeTouch.left = e.touches[0].pageX;\n d.activeTouch.top = e.touches[0].pageY;\n }\n }\n });\n on(d.scroller, \"touchmove\", function () {\n if (d.activeTouch) { d.activeTouch.moved = true; }\n });\n on(d.scroller, \"touchend\", function (e) {\n var touch = d.activeTouch;\n if (touch && !eventInWidget(d, e) && touch.left != null &&\n !touch.moved && new Date - touch.start < 300) {\n var pos = cm.coordsChar(d.activeTouch, \"page\"), range;\n if (!touch.prev || farAway(touch, touch.prev)) // Single tap\n { range = new Range(pos, pos); }\n else if (!touch.prev.prev || farAway(touch, touch.prev.prev)) // Double tap\n { range = cm.findWordAt(pos); }\n else // Triple tap\n { range = new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))); }\n cm.setSelection(range.anchor, range.head);\n cm.focus();\n e_preventDefault(e);\n }\n finishTouch();\n });\n on(d.scroller, \"touchcancel\", finishTouch);\n\n // Sync scrolling between fake scrollbars and real scrollable\n // area, ensure viewport is updated when scrolling.\n on(d.scroller, \"scroll\", function () {\n if (d.scroller.clientHeight) {\n updateScrollTop(cm, d.scroller.scrollTop);\n setScrollLeft(cm, d.scroller.scrollLeft, true);\n signal(cm, \"scroll\", cm);\n }\n });\n\n // Listen to wheel events in order to try and update the viewport on time.\n on(d.scroller, \"mousewheel\", function (e) { return onScrollWheel(cm, e); });\n on(d.scroller, \"DOMMouseScroll\", function (e) { return onScrollWheel(cm, e); });\n\n // Prevent wrapper from ever scrolling\n on(d.wrapper, \"scroll\", function () { return d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; });\n\n d.dragFunctions = {\n enter: function (e) {if (!signalDOMEvent(cm, e)) { e_stop(e); }},\n over: function (e) {if (!signalDOMEvent(cm, e)) { onDragOver(cm, e); e_stop(e); }},\n start: function (e) { return onDragStart(cm, e); },\n drop: operation(cm, onDrop),\n leave: function (e) {if (!signalDOMEvent(cm, e)) { clearDragCursor(cm); }}\n };\n\n var inp = d.input.getField();\n on(inp, \"keyup\", function (e) { return onKeyUp.call(cm, e); });\n on(inp, \"keydown\", operation(cm, onKeyDown));\n on(inp, \"keypress\", operation(cm, onKeyPress));\n on(inp, \"focus\", function (e) { return onFocus(cm, e); });\n on(inp, \"blur\", function (e) { return onBlur(cm, e); });\n }\n\n var initHooks = [];\n CodeMirror.defineInitHook = function (f) { return initHooks.push(f); };\n\n // Indent the given line. The how parameter can be \"smart\",\n // \"add\"/null, \"subtract\", or \"prev\". When aggressive is false\n // (typically set to true for forced single-line indents), empty\n // lines are not indented, and places where the mode returns Pass\n // are left alone.\n function indentLine(cm, n, how, aggressive) {\n var doc = cm.doc, state;\n if (how == null) { how = \"add\"; }\n if (how == \"smart\") {\n // Fall back to \"prev\" when the mode doesn't have an indentation\n // method.\n if (!doc.mode.indent) { how = \"prev\"; }\n else { state = getContextBefore(cm, n).state; }\n }\n\n var tabSize = cm.options.tabSize;\n var line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize);\n if (line.stateAfter) { line.stateAfter = null; }\n var curSpaceString = line.text.match(/^\\s*/)[0], indentation;\n if (!aggressive && !/\\S/.test(line.text)) {\n indentation = 0;\n how = \"not\";\n } else if (how == \"smart\") {\n indentation = doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text);\n if (indentation == Pass || indentation > 150) {\n if (!aggressive) { return }\n how = \"prev\";\n }\n }\n if (how == \"prev\") {\n if (n > doc.first) { indentation = countColumn(getLine(doc, n-1).text, null, tabSize); }\n else { indentation = 0; }\n } else if (how == \"add\") {\n indentation = curSpace + cm.options.indentUnit;\n } else if (how == \"subtract\") {\n indentation = curSpace - cm.options.indentUnit;\n } else if (typeof how == \"number\") {\n indentation = curSpace + how;\n }\n indentation = Math.max(0, indentation);\n\n var indentString = \"\", pos = 0;\n if (cm.options.indentWithTabs)\n { for (var i = Math.floor(indentation / tabSize); i; --i) {pos += tabSize; indentString += \"\\t\";} }\n if (pos < indentation) { indentString += spaceStr(indentation - pos); }\n\n if (indentString != curSpaceString) {\n replaceRange(doc, indentString, Pos(n, 0), Pos(n, curSpaceString.length), \"+input\");\n line.stateAfter = null;\n return true\n } else {\n // Ensure that, if the cursor was in the whitespace at the start\n // of the line, it is moved to the end of that space.\n for (var i$1 = 0; i$1 < doc.sel.ranges.length; i$1++) {\n var range = doc.sel.ranges[i$1];\n if (range.head.line == n && range.head.ch < curSpaceString.length) {\n var pos$1 = Pos(n, curSpaceString.length);\n replaceOneSelection(doc, i$1, new Range(pos$1, pos$1));\n break\n }\n }\n }\n }\n\n // This will be set to a {lineWise: bool, text: [string]} object, so\n // that, when pasting, we know what kind of selections the copied\n // text was made out of.\n var lastCopied = null;\n\n function setLastCopied(newLastCopied) {\n lastCopied = newLastCopied;\n }\n\n function applyTextInput(cm, inserted, deleted, sel, origin) {\n var doc = cm.doc;\n cm.display.shift = false;\n if (!sel) { sel = doc.sel; }\n\n var recent = +new Date - 200;\n var paste = origin == \"paste\" || cm.state.pasteIncoming > recent;\n var textLines = splitLinesAuto(inserted), multiPaste = null;\n // When pasting N lines into N selections, insert one line per selection\n if (paste && sel.ranges.length > 1) {\n if (lastCopied && lastCopied.text.join(\"\\n\") == inserted) {\n if (sel.ranges.length % lastCopied.text.length == 0) {\n multiPaste = [];\n for (var i = 0; i < lastCopied.text.length; i++)\n { multiPaste.push(doc.splitLines(lastCopied.text[i])); }\n }\n } else if (textLines.length == sel.ranges.length && cm.options.pasteLinesPerSelection) {\n multiPaste = map(textLines, function (l) { return [l]; });\n }\n }\n\n var updateInput = cm.curOp.updateInput;\n // Normal behavior is to insert the new text into every selection\n for (var i$1 = sel.ranges.length - 1; i$1 >= 0; i$1--) {\n var range = sel.ranges[i$1];\n var from = range.from(), to = range.to();\n if (range.empty()) {\n if (deleted && deleted > 0) // Handle deletion\n { from = Pos(from.line, from.ch - deleted); }\n else if (cm.state.overwrite && !paste) // Handle overwrite\n { to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + lst(textLines).length)); }\n else if (paste && lastCopied && lastCopied.lineWise && lastCopied.text.join(\"\\n\") == textLines.join(\"\\n\"))\n { from = to = Pos(from.line, 0); }\n }\n var changeEvent = {from: from, to: to, text: multiPaste ? multiPaste[i$1 % multiPaste.length] : textLines,\n origin: origin || (paste ? \"paste\" : cm.state.cutIncoming > recent ? \"cut\" : \"+input\")};\n makeChange(cm.doc, changeEvent);\n signalLater(cm, \"inputRead\", cm, changeEvent);\n }\n if (inserted && !paste)\n { triggerElectric(cm, inserted); }\n\n ensureCursorVisible(cm);\n if (cm.curOp.updateInput < 2) { cm.curOp.updateInput = updateInput; }\n cm.curOp.typing = true;\n cm.state.pasteIncoming = cm.state.cutIncoming = -1;\n }\n\n function handlePaste(e, cm) {\n var pasted = e.clipboardData && e.clipboardData.getData(\"Text\");\n if (pasted) {\n e.preventDefault();\n if (!cm.isReadOnly() && !cm.options.disableInput)\n { runInOp(cm, function () { return applyTextInput(cm, pasted, 0, null, \"paste\"); }); }\n return true\n }\n }\n\n function triggerElectric(cm, inserted) {\n // When an 'electric' character is inserted, immediately trigger a reindent\n if (!cm.options.electricChars || !cm.options.smartIndent) { return }\n var sel = cm.doc.sel;\n\n for (var i = sel.ranges.length - 1; i >= 0; i--) {\n var range = sel.ranges[i];\n if (range.head.ch > 100 || (i && sel.ranges[i - 1].head.line == range.head.line)) { continue }\n var mode = cm.getModeAt(range.head);\n var indented = false;\n if (mode.electricChars) {\n for (var j = 0; j < mode.electricChars.length; j++)\n { if (inserted.indexOf(mode.electricChars.charAt(j)) > -1) {\n indented = indentLine(cm, range.head.line, \"smart\");\n break\n } }\n } else if (mode.electricInput) {\n if (mode.electricInput.test(getLine(cm.doc, range.head.line).text.slice(0, range.head.ch)))\n { indented = indentLine(cm, range.head.line, \"smart\"); }\n }\n if (indented) { signalLater(cm, \"electricInput\", cm, range.head.line); }\n }\n }\n\n function copyableRanges(cm) {\n var text = [], ranges = [];\n for (var i = 0; i < cm.doc.sel.ranges.length; i++) {\n var line = cm.doc.sel.ranges[i].head.line;\n var lineRange = {anchor: Pos(line, 0), head: Pos(line + 1, 0)};\n ranges.push(lineRange);\n text.push(cm.getRange(lineRange.anchor, lineRange.head));\n }\n return {text: text, ranges: ranges}\n }\n\n function disableBrowserMagic(field, spellcheck, autocorrect, autocapitalize) {\n field.setAttribute(\"autocorrect\", autocorrect ? \"\" : \"off\");\n field.setAttribute(\"autocapitalize\", autocapitalize ? \"\" : \"off\");\n field.setAttribute(\"spellcheck\", !!spellcheck);\n }\n\n function hiddenTextarea() {\n var te = elt(\"textarea\", null, null, \"position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; outline: none\");\n var div = elt(\"div\", [te], null, \"overflow: hidden; position: relative; width: 3px; height: 0px;\");\n // The textarea is kept positioned near the cursor to prevent the\n // fact that it'll be scrolled into view on input from scrolling\n // our fake cursor out of view. On webkit, when wrap=off, paste is\n // very slow. So make the area wide instead.\n if (webkit) { te.style.width = \"1000px\"; }\n else { te.setAttribute(\"wrap\", \"off\"); }\n // If border: 0; -- iOS fails to open keyboard (issue #1287)\n if (ios) { te.style.border = \"1px solid black\"; }\n disableBrowserMagic(te);\n return div\n }\n\n // The publicly visible API. Note that methodOp(f) means\n // 'wrap f in an operation, performed on its `this` parameter'.\n\n // This is not the complete set of editor methods. Most of the\n // methods defined on the Doc type are also injected into\n // CodeMirror.prototype, for backwards compatibility and\n // convenience.\n\n function addEditorMethods(CodeMirror) {\n var optionHandlers = CodeMirror.optionHandlers;\n\n var helpers = CodeMirror.helpers = {};\n\n CodeMirror.prototype = {\n constructor: CodeMirror,\n focus: function(){window.focus(); this.display.input.focus();},\n\n setOption: function(option, value) {\n var options = this.options, old = options[option];\n if (options[option] == value && option != \"mode\") { return }\n options[option] = value;\n if (optionHandlers.hasOwnProperty(option))\n { operation(this, optionHandlers[option])(this, value, old); }\n signal(this, \"optionChange\", this, option);\n },\n\n getOption: function(option) {return this.options[option]},\n getDoc: function() {return this.doc},\n\n addKeyMap: function(map, bottom) {\n this.state.keyMaps[bottom ? \"push\" : \"unshift\"](getKeyMap(map));\n },\n removeKeyMap: function(map) {\n var maps = this.state.keyMaps;\n for (var i = 0; i < maps.length; ++i)\n { if (maps[i] == map || maps[i].name == map) {\n maps.splice(i, 1);\n return true\n } }\n },\n\n addOverlay: methodOp(function(spec, options) {\n var mode = spec.token ? spec : CodeMirror.getMode(this.options, spec);\n if (mode.startState) { throw new Error(\"Overlays may not be stateful.\") }\n insertSorted(this.state.overlays,\n {mode: mode, modeSpec: spec, opaque: options && options.opaque,\n priority: (options && options.priority) || 0},\n function (overlay) { return overlay.priority; });\n this.state.modeGen++;\n regChange(this);\n }),\n removeOverlay: methodOp(function(spec) {\n var overlays = this.state.overlays;\n for (var i = 0; i < overlays.length; ++i) {\n var cur = overlays[i].modeSpec;\n if (cur == spec || typeof spec == \"string\" && cur.name == spec) {\n overlays.splice(i, 1);\n this.state.modeGen++;\n regChange(this);\n return\n }\n }\n }),\n\n indentLine: methodOp(function(n, dir, aggressive) {\n if (typeof dir != \"string\" && typeof dir != \"number\") {\n if (dir == null) { dir = this.options.smartIndent ? \"smart\" : \"prev\"; }\n else { dir = dir ? \"add\" : \"subtract\"; }\n }\n if (isLine(this.doc, n)) { indentLine(this, n, dir, aggressive); }\n }),\n indentSelection: methodOp(function(how) {\n var ranges = this.doc.sel.ranges, end = -1;\n for (var i = 0; i < ranges.length; i++) {\n var range = ranges[i];\n if (!range.empty()) {\n var from = range.from(), to = range.to();\n var start = Math.max(end, from.line);\n end = Math.min(this.lastLine(), to.line - (to.ch ? 0 : 1)) + 1;\n for (var j = start; j < end; ++j)\n { indentLine(this, j, how); }\n var newRanges = this.doc.sel.ranges;\n if (from.ch == 0 && ranges.length == newRanges.length && newRanges[i].from().ch > 0)\n { replaceOneSelection(this.doc, i, new Range(from, newRanges[i].to()), sel_dontScroll); }\n } else if (range.head.line > end) {\n indentLine(this, range.head.line, how, true);\n end = range.head.line;\n if (i == this.doc.sel.primIndex) { ensureCursorVisible(this); }\n }\n }\n }),\n\n // Fetch the parser token for a given character. Useful for hacks\n // that want to inspect the mode state (say, for completion).\n getTokenAt: function(pos, precise) {\n return takeToken(this, pos, precise)\n },\n\n getLineTokens: function(line, precise) {\n return takeToken(this, Pos(line), precise, true)\n },\n\n getTokenTypeAt: function(pos) {\n pos = clipPos(this.doc, pos);\n var styles = getLineStyles(this, getLine(this.doc, pos.line));\n var before = 0, after = (styles.length - 1) / 2, ch = pos.ch;\n var type;\n if (ch == 0) { type = styles[2]; }\n else { for (;;) {\n var mid = (before + after) >> 1;\n if ((mid ? styles[mid * 2 - 1] : 0) >= ch) { after = mid; }\n else if (styles[mid * 2 + 1] < ch) { before = mid + 1; }\n else { type = styles[mid * 2 + 2]; break }\n } }\n var cut = type ? type.indexOf(\"overlay \") : -1;\n return cut < 0 ? type : cut == 0 ? null : type.slice(0, cut - 1)\n },\n\n getModeAt: function(pos) {\n var mode = this.doc.mode;\n if (!mode.innerMode) { return mode }\n return CodeMirror.innerMode(mode, this.getTokenAt(pos).state).mode\n },\n\n getHelper: function(pos, type) {\n return this.getHelpers(pos, type)[0]\n },\n\n getHelpers: function(pos, type) {\n var found = [];\n if (!helpers.hasOwnProperty(type)) { return found }\n var help = helpers[type], mode = this.getModeAt(pos);\n if (typeof mode[type] == \"string\") {\n if (help[mode[type]]) { found.push(help[mode[type]]); }\n } else if (mode[type]) {\n for (var i = 0; i < mode[type].length; i++) {\n var val = help[mode[type][i]];\n if (val) { found.push(val); }\n }\n } else if (mode.helperType && help[mode.helperType]) {\n found.push(help[mode.helperType]);\n } else if (help[mode.name]) {\n found.push(help[mode.name]);\n }\n for (var i$1 = 0; i$1 < help._global.length; i$1++) {\n var cur = help._global[i$1];\n if (cur.pred(mode, this) && indexOf(found, cur.val) == -1)\n { found.push(cur.val); }\n }\n return found\n },\n\n getStateAfter: function(line, precise) {\n var doc = this.doc;\n line = clipLine(doc, line == null ? doc.first + doc.size - 1: line);\n return getContextBefore(this, line + 1, precise).state\n },\n\n cursorCoords: function(start, mode) {\n var pos, range = this.doc.sel.primary();\n if (start == null) { pos = range.head; }\n else if (typeof start == \"object\") { pos = clipPos(this.doc, start); }\n else { pos = start ? range.from() : range.to(); }\n return cursorCoords(this, pos, mode || \"page\")\n },\n\n charCoords: function(pos, mode) {\n return charCoords(this, clipPos(this.doc, pos), mode || \"page\")\n },\n\n coordsChar: function(coords, mode) {\n coords = fromCoordSystem(this, coords, mode || \"page\");\n return coordsChar(this, coords.left, coords.top)\n },\n\n lineAtHeight: function(height, mode) {\n height = fromCoordSystem(this, {top: height, left: 0}, mode || \"page\").top;\n return lineAtHeight(this.doc, height + this.display.viewOffset)\n },\n heightAtLine: function(line, mode, includeWidgets) {\n var end = false, lineObj;\n if (typeof line == \"number\") {\n var last = this.doc.first + this.doc.size - 1;\n if (line < this.doc.first) { line = this.doc.first; }\n else if (line > last) { line = last; end = true; }\n lineObj = getLine(this.doc, line);\n } else {\n lineObj = line;\n }\n return intoCoordSystem(this, lineObj, {top: 0, left: 0}, mode || \"page\", includeWidgets || end).top +\n (end ? this.doc.height - heightAtLine(lineObj) : 0)\n },\n\n defaultTextHeight: function() { return textHeight(this.display) },\n defaultCharWidth: function() { return charWidth(this.display) },\n\n getViewport: function() { return {from: this.display.viewFrom, to: this.display.viewTo}},\n\n addWidget: function(pos, node, scroll, vert, horiz) {\n var display = this.display;\n pos = cursorCoords(this, clipPos(this.doc, pos));\n var top = pos.bottom, left = pos.left;\n node.style.position = \"absolute\";\n node.setAttribute(\"cm-ignore-events\", \"true\");\n this.display.input.setUneditable(node);\n display.sizer.appendChild(node);\n if (vert == \"over\") {\n top = pos.top;\n } else if (vert == \"above\" || vert == \"near\") {\n var vspace = Math.max(display.wrapper.clientHeight, this.doc.height),\n hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth);\n // Default to positioning above (if specified and possible); otherwise default to positioning below\n if ((vert == 'above' || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight)\n { top = pos.top - node.offsetHeight; }\n else if (pos.bottom + node.offsetHeight <= vspace)\n { top = pos.bottom; }\n if (left + node.offsetWidth > hspace)\n { left = hspace - node.offsetWidth; }\n }\n node.style.top = top + \"px\";\n node.style.left = node.style.right = \"\";\n if (horiz == \"right\") {\n left = display.sizer.clientWidth - node.offsetWidth;\n node.style.right = \"0px\";\n } else {\n if (horiz == \"left\") { left = 0; }\n else if (horiz == \"middle\") { left = (display.sizer.clientWidth - node.offsetWidth) / 2; }\n node.style.left = left + \"px\";\n }\n if (scroll)\n { scrollIntoView(this, {left: left, top: top, right: left + node.offsetWidth, bottom: top + node.offsetHeight}); }\n },\n\n triggerOnKeyDown: methodOp(onKeyDown),\n triggerOnKeyPress: methodOp(onKeyPress),\n triggerOnKeyUp: onKeyUp,\n triggerOnMouseDown: methodOp(onMouseDown),\n\n execCommand: function(cmd) {\n if (commands.hasOwnProperty(cmd))\n { return commands[cmd].call(null, this) }\n },\n\n triggerElectric: methodOp(function(text) { triggerElectric(this, text); }),\n\n findPosH: function(from, amount, unit, visually) {\n var dir = 1;\n if (amount < 0) { dir = -1; amount = -amount; }\n var cur = clipPos(this.doc, from);\n for (var i = 0; i < amount; ++i) {\n cur = findPosH(this.doc, cur, dir, unit, visually);\n if (cur.hitSide) { break }\n }\n return cur\n },\n\n moveH: methodOp(function(dir, unit) {\n var this$1 = this;\n\n this.extendSelectionsBy(function (range) {\n if (this$1.display.shift || this$1.doc.extend || range.empty())\n { return findPosH(this$1.doc, range.head, dir, unit, this$1.options.rtlMoveVisually) }\n else\n { return dir < 0 ? range.from() : range.to() }\n }, sel_move);\n }),\n\n deleteH: methodOp(function(dir, unit) {\n var sel = this.doc.sel, doc = this.doc;\n if (sel.somethingSelected())\n { doc.replaceSelection(\"\", null, \"+delete\"); }\n else\n { deleteNearSelection(this, function (range) {\n var other = findPosH(doc, range.head, dir, unit, false);\n return dir < 0 ? {from: other, to: range.head} : {from: range.head, to: other}\n }); }\n }),\n\n findPosV: function(from, amount, unit, goalColumn) {\n var dir = 1, x = goalColumn;\n if (amount < 0) { dir = -1; amount = -amount; }\n var cur = clipPos(this.doc, from);\n for (var i = 0; i < amount; ++i) {\n var coords = cursorCoords(this, cur, \"div\");\n if (x == null) { x = coords.left; }\n else { coords.left = x; }\n cur = findPosV(this, coords, dir, unit);\n if (cur.hitSide) { break }\n }\n return cur\n },\n\n moveV: methodOp(function(dir, unit) {\n var this$1 = this;\n\n var doc = this.doc, goals = [];\n var collapse = !this.display.shift && !doc.extend && doc.sel.somethingSelected();\n doc.extendSelectionsBy(function (range) {\n if (collapse)\n { return dir < 0 ? range.from() : range.to() }\n var headPos = cursorCoords(this$1, range.head, \"div\");\n if (range.goalColumn != null) { headPos.left = range.goalColumn; }\n goals.push(headPos.left);\n var pos = findPosV(this$1, headPos, dir, unit);\n if (unit == \"page\" && range == doc.sel.primary())\n { addToScrollTop(this$1, charCoords(this$1, pos, \"div\").top - headPos.top); }\n return pos\n }, sel_move);\n if (goals.length) { for (var i = 0; i < doc.sel.ranges.length; i++)\n { doc.sel.ranges[i].goalColumn = goals[i]; } }\n }),\n\n // Find the word at the given position (as returned by coordsChar).\n findWordAt: function(pos) {\n var doc = this.doc, line = getLine(doc, pos.line).text;\n var start = pos.ch, end = pos.ch;\n if (line) {\n var helper = this.getHelper(pos, \"wordChars\");\n if ((pos.sticky == \"before\" || end == line.length) && start) { --start; } else { ++end; }\n var startChar = line.charAt(start);\n var check = isWordChar(startChar, helper)\n ? function (ch) { return isWordChar(ch, helper); }\n : /\\s/.test(startChar) ? function (ch) { return /\\s/.test(ch); }\n : function (ch) { return (!/\\s/.test(ch) && !isWordChar(ch)); };\n while (start > 0 && check(line.charAt(start - 1))) { --start; }\n while (end < line.length && check(line.charAt(end))) { ++end; }\n }\n return new Range(Pos(pos.line, start), Pos(pos.line, end))\n },\n\n toggleOverwrite: function(value) {\n if (value != null && value == this.state.overwrite) { return }\n if (this.state.overwrite = !this.state.overwrite)\n { addClass(this.display.cursorDiv, \"CodeMirror-overwrite\"); }\n else\n { rmClass(this.display.cursorDiv, \"CodeMirror-overwrite\"); }\n\n signal(this, \"overwriteToggle\", this, this.state.overwrite);\n },\n hasFocus: function() { return this.display.input.getField() == activeElt() },\n isReadOnly: function() { return !!(this.options.readOnly || this.doc.cantEdit) },\n\n scrollTo: methodOp(function (x, y) { scrollToCoords(this, x, y); }),\n getScrollInfo: function() {\n var scroller = this.display.scroller;\n return {left: scroller.scrollLeft, top: scroller.scrollTop,\n height: scroller.scrollHeight - scrollGap(this) - this.display.barHeight,\n width: scroller.scrollWidth - scrollGap(this) - this.display.barWidth,\n clientHeight: displayHeight(this), clientWidth: displayWidth(this)}\n },\n\n scrollIntoView: methodOp(function(range, margin) {\n if (range == null) {\n range = {from: this.doc.sel.primary().head, to: null};\n if (margin == null) { margin = this.options.cursorScrollMargin; }\n } else if (typeof range == \"number\") {\n range = {from: Pos(range, 0), to: null};\n } else if (range.from == null) {\n range = {from: range, to: null};\n }\n if (!range.to) { range.to = range.from; }\n range.margin = margin || 0;\n\n if (range.from.line != null) {\n scrollToRange(this, range);\n } else {\n scrollToCoordsRange(this, range.from, range.to, range.margin);\n }\n }),\n\n setSize: methodOp(function(width, height) {\n var this$1 = this;\n\n var interpret = function (val) { return typeof val == \"number\" || /^\\d+$/.test(String(val)) ? val + \"px\" : val; };\n if (width != null) { this.display.wrapper.style.width = interpret(width); }\n if (height != null) { this.display.wrapper.style.height = interpret(height); }\n if (this.options.lineWrapping) { clearLineMeasurementCache(this); }\n var lineNo = this.display.viewFrom;\n this.doc.iter(lineNo, this.display.viewTo, function (line) {\n if (line.widgets) { for (var i = 0; i < line.widgets.length; i++)\n { if (line.widgets[i].noHScroll) { regLineChange(this$1, lineNo, \"widget\"); break } } }\n ++lineNo;\n });\n this.curOp.forceUpdate = true;\n signal(this, \"refresh\", this);\n }),\n\n operation: function(f){return runInOp(this, f)},\n startOperation: function(){return startOperation(this)},\n endOperation: function(){return endOperation(this)},\n\n refresh: methodOp(function() {\n var oldHeight = this.display.cachedTextHeight;\n regChange(this);\n this.curOp.forceUpdate = true;\n clearCaches(this);\n scrollToCoords(this, this.doc.scrollLeft, this.doc.scrollTop);\n updateGutterSpace(this.display);\n if (oldHeight == null || Math.abs(oldHeight - textHeight(this.display)) > .5 || this.options.lineWrapping)\n { estimateLineHeights(this); }\n signal(this, \"refresh\", this);\n }),\n\n swapDoc: methodOp(function(doc) {\n var old = this.doc;\n old.cm = null;\n // Cancel the current text selection if any (#5821)\n if (this.state.selectingText) { this.state.selectingText(); }\n attachDoc(this, doc);\n clearCaches(this);\n this.display.input.reset();\n scrollToCoords(this, doc.scrollLeft, doc.scrollTop);\n this.curOp.forceScroll = true;\n signalLater(this, \"swapDoc\", this, old);\n return old\n }),\n\n phrase: function(phraseText) {\n var phrases = this.options.phrases;\n return phrases && Object.prototype.hasOwnProperty.call(phrases, phraseText) ? phrases[phraseText] : phraseText\n },\n\n getInputField: function(){return this.display.input.getField()},\n getWrapperElement: function(){return this.display.wrapper},\n getScrollerElement: function(){return this.display.scroller},\n getGutterElement: function(){return this.display.gutters}\n };\n eventMixin(CodeMirror);\n\n CodeMirror.registerHelper = function(type, name, value) {\n if (!helpers.hasOwnProperty(type)) { helpers[type] = CodeMirror[type] = {_global: []}; }\n helpers[type][name] = value;\n };\n CodeMirror.registerGlobalHelper = function(type, name, predicate, value) {\n CodeMirror.registerHelper(type, name, value);\n helpers[type]._global.push({pred: predicate, val: value});\n };\n }\n\n // Used for horizontal relative motion. Dir is -1 or 1 (left or\n // right), unit can be \"codepoint\", \"char\", \"column\" (like char, but\n // doesn't cross line boundaries), \"word\" (across next word), or\n // \"group\" (to the start of next group of word or\n // non-word-non-whitespace chars). The visually param controls\n // whether, in right-to-left text, direction 1 means to move towards\n // the next index in the string, or towards the character to the right\n // of the current position. The resulting position will have a\n // hitSide=true property if it reached the end of the document.\n function findPosH(doc, pos, dir, unit, visually) {\n var oldPos = pos;\n var origDir = dir;\n var lineObj = getLine(doc, pos.line);\n var lineDir = visually && doc.direction == \"rtl\" ? -dir : dir;\n function findNextLine() {\n var l = pos.line + lineDir;\n if (l < doc.first || l >= doc.first + doc.size) { return false }\n pos = new Pos(l, pos.ch, pos.sticky);\n return lineObj = getLine(doc, l)\n }\n function moveOnce(boundToLine) {\n var next;\n if (unit == \"codepoint\") {\n var ch = lineObj.text.charCodeAt(pos.ch + (unit > 0 ? 0 : -1));\n if (isNaN(ch)) { next = null; }\n else { next = new Pos(pos.line, Math.max(0, Math.min(lineObj.text.length, pos.ch + dir * (ch >= 0xD800 && ch < 0xDC00 ? 2 : 1))),\n -dir); }\n } else if (visually) {\n next = moveVisually(doc.cm, lineObj, pos, dir);\n } else {\n next = moveLogically(lineObj, pos, dir);\n }\n if (next == null) {\n if (!boundToLine && findNextLine())\n { pos = endOfLine(visually, doc.cm, lineObj, pos.line, lineDir); }\n else\n { return false }\n } else {\n pos = next;\n }\n return true\n }\n\n if (unit == \"char\" || unit == \"codepoint\") {\n moveOnce();\n } else if (unit == \"column\") {\n moveOnce(true);\n } else if (unit == \"word\" || unit == \"group\") {\n var sawType = null, group = unit == \"group\";\n var helper = doc.cm && doc.cm.getHelper(pos, \"wordChars\");\n for (var first = true;; first = false) {\n if (dir < 0 && !moveOnce(!first)) { break }\n var cur = lineObj.text.charAt(pos.ch) || \"\\n\";\n var type = isWordChar(cur, helper) ? \"w\"\n : group && cur == \"\\n\" ? \"n\"\n : !group || /\\s/.test(cur) ? null\n : \"p\";\n if (group && !first && !type) { type = \"s\"; }\n if (sawType && sawType != type) {\n if (dir < 0) {dir = 1; moveOnce(); pos.sticky = \"after\";}\n break\n }\n\n if (type) { sawType = type; }\n if (dir > 0 && !moveOnce(!first)) { break }\n }\n }\n var result = skipAtomic(doc, pos, oldPos, origDir, true);\n if (equalCursorPos(oldPos, result)) { result.hitSide = true; }\n return result\n }\n\n // For relative vertical movement. Dir may be -1 or 1. Unit can be\n // \"page\" or \"line\". The resulting position will have a hitSide=true\n // property if it reached the end of the document.\n function findPosV(cm, pos, dir, unit) {\n var doc = cm.doc, x = pos.left, y;\n if (unit == \"page\") {\n var pageSize = Math.min(cm.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight);\n var moveAmount = Math.max(pageSize - .5 * textHeight(cm.display), 3);\n y = (dir > 0 ? pos.bottom : pos.top) + dir * moveAmount;\n\n } else if (unit == \"line\") {\n y = dir > 0 ? pos.bottom + 3 : pos.top - 3;\n }\n var target;\n for (;;) {\n target = coordsChar(cm, x, y);\n if (!target.outside) { break }\n if (dir < 0 ? y <= 0 : y >= doc.height) { target.hitSide = true; break }\n y += dir * 5;\n }\n return target\n }\n\n // CONTENTEDITABLE INPUT STYLE\n\n var ContentEditableInput = function(cm) {\n this.cm = cm;\n this.lastAnchorNode = this.lastAnchorOffset = this.lastFocusNode = this.lastFocusOffset = null;\n this.polling = new Delayed();\n this.composing = null;\n this.gracePeriod = false;\n this.readDOMTimeout = null;\n };\n\n ContentEditableInput.prototype.init = function (display) {\n var this$1 = this;\n\n var input = this, cm = input.cm;\n var div = input.div = display.lineDiv;\n disableBrowserMagic(div, cm.options.spellcheck, cm.options.autocorrect, cm.options.autocapitalize);\n\n function belongsToInput(e) {\n for (var t = e.target; t; t = t.parentNode) {\n if (t == div) { return true }\n if (/\\bCodeMirror-(?:line)?widget\\b/.test(t.className)) { break }\n }\n return false\n }\n\n on(div, \"paste\", function (e) {\n if (!belongsToInput(e) || signalDOMEvent(cm, e) || handlePaste(e, cm)) { return }\n // IE doesn't fire input events, so we schedule a read for the pasted content in this way\n if (ie_version <= 11) { setTimeout(operation(cm, function () { return this$1.updateFromDOM(); }), 20); }\n });\n\n on(div, \"compositionstart\", function (e) {\n this$1.composing = {data: e.data, done: false};\n });\n on(div, \"compositionupdate\", function (e) {\n if (!this$1.composing) { this$1.composing = {data: e.data, done: false}; }\n });\n on(div, \"compositionend\", function (e) {\n if (this$1.composing) {\n if (e.data != this$1.composing.data) { this$1.readFromDOMSoon(); }\n this$1.composing.done = true;\n }\n });\n\n on(div, \"touchstart\", function () { return input.forceCompositionEnd(); });\n\n on(div, \"input\", function () {\n if (!this$1.composing) { this$1.readFromDOMSoon(); }\n });\n\n function onCopyCut(e) {\n if (!belongsToInput(e) || signalDOMEvent(cm, e)) { return }\n if (cm.somethingSelected()) {\n setLastCopied({lineWise: false, text: cm.getSelections()});\n if (e.type == \"cut\") { cm.replaceSelection(\"\", null, \"cut\"); }\n } else if (!cm.options.lineWiseCopyCut) {\n return\n } else {\n var ranges = copyableRanges(cm);\n setLastCopied({lineWise: true, text: ranges.text});\n if (e.type == \"cut\") {\n cm.operation(function () {\n cm.setSelections(ranges.ranges, 0, sel_dontScroll);\n cm.replaceSelection(\"\", null, \"cut\");\n });\n }\n }\n if (e.clipboardData) {\n e.clipboardData.clearData();\n var content = lastCopied.text.join(\"\\n\");\n // iOS exposes the clipboard API, but seems to discard content inserted into it\n e.clipboardData.setData(\"Text\", content);\n if (e.clipboardData.getData(\"Text\") == content) {\n e.preventDefault();\n return\n }\n }\n // Old-fashioned briefly-focus-a-textarea hack\n var kludge = hiddenTextarea(), te = kludge.firstChild;\n cm.display.lineSpace.insertBefore(kludge, cm.display.lineSpace.firstChild);\n te.value = lastCopied.text.join(\"\\n\");\n var hadFocus = document.activeElement;\n selectInput(te);\n setTimeout(function () {\n cm.display.lineSpace.removeChild(kludge);\n hadFocus.focus();\n if (hadFocus == div) { input.showPrimarySelection(); }\n }, 50);\n }\n on(div, \"copy\", onCopyCut);\n on(div, \"cut\", onCopyCut);\n };\n\n ContentEditableInput.prototype.screenReaderLabelChanged = function (label) {\n // Label for screenreaders, accessibility\n if(label) {\n this.div.setAttribute('aria-label', label);\n } else {\n this.div.removeAttribute('aria-label');\n }\n };\n\n ContentEditableInput.prototype.prepareSelection = function () {\n var result = prepareSelection(this.cm, false);\n result.focus = document.activeElement == this.div;\n return result\n };\n\n ContentEditableInput.prototype.showSelection = function (info, takeFocus) {\n if (!info || !this.cm.display.view.length) { return }\n if (info.focus || takeFocus) { this.showPrimarySelection(); }\n this.showMultipleSelections(info);\n };\n\n ContentEditableInput.prototype.getSelection = function () {\n return this.cm.display.wrapper.ownerDocument.getSelection()\n };\n\n ContentEditableInput.prototype.showPrimarySelection = function () {\n var sel = this.getSelection(), cm = this.cm, prim = cm.doc.sel.primary();\n var from = prim.from(), to = prim.to();\n\n if (cm.display.viewTo == cm.display.viewFrom || from.line >= cm.display.viewTo || to.line < cm.display.viewFrom) {\n sel.removeAllRanges();\n return\n }\n\n var curAnchor = domToPos(cm, sel.anchorNode, sel.anchorOffset);\n var curFocus = domToPos(cm, sel.focusNode, sel.focusOffset);\n if (curAnchor && !curAnchor.bad && curFocus && !curFocus.bad &&\n cmp(minPos(curAnchor, curFocus), from) == 0 &&\n cmp(maxPos(curAnchor, curFocus), to) == 0)\n { return }\n\n var view = cm.display.view;\n var start = (from.line >= cm.display.viewFrom && posToDOM(cm, from)) ||\n {node: view[0].measure.map[2], offset: 0};\n var end = to.line < cm.display.viewTo && posToDOM(cm, to);\n if (!end) {\n var measure = view[view.length - 1].measure;\n var map = measure.maps ? measure.maps[measure.maps.length - 1] : measure.map;\n end = {node: map[map.length - 1], offset: map[map.length - 2] - map[map.length - 3]};\n }\n\n if (!start || !end) {\n sel.removeAllRanges();\n return\n }\n\n var old = sel.rangeCount && sel.getRangeAt(0), rng;\n try { rng = range(start.node, start.offset, end.offset, end.node); }\n catch(e) {} // Our model of the DOM might be outdated, in which case the range we try to set can be impossible\n if (rng) {\n if (!gecko && cm.state.focused) {\n sel.collapse(start.node, start.offset);\n if (!rng.collapsed) {\n sel.removeAllRanges();\n sel.addRange(rng);\n }\n } else {\n sel.removeAllRanges();\n sel.addRange(rng);\n }\n if (old && sel.anchorNode == null) { sel.addRange(old); }\n else if (gecko) { this.startGracePeriod(); }\n }\n this.rememberSelection();\n };\n\n ContentEditableInput.prototype.startGracePeriod = function () {\n var this$1 = this;\n\n clearTimeout(this.gracePeriod);\n this.gracePeriod = setTimeout(function () {\n this$1.gracePeriod = false;\n if (this$1.selectionChanged())\n { this$1.cm.operation(function () { return this$1.cm.curOp.selectionChanged = true; }); }\n }, 20);\n };\n\n ContentEditableInput.prototype.showMultipleSelections = function (info) {\n removeChildrenAndAdd(this.cm.display.cursorDiv, info.cursors);\n removeChildrenAndAdd(this.cm.display.selectionDiv, info.selection);\n };\n\n ContentEditableInput.prototype.rememberSelection = function () {\n var sel = this.getSelection();\n this.lastAnchorNode = sel.anchorNode; this.lastAnchorOffset = sel.anchorOffset;\n this.lastFocusNode = sel.focusNode; this.lastFocusOffset = sel.focusOffset;\n };\n\n ContentEditableInput.prototype.selectionInEditor = function () {\n var sel = this.getSelection();\n if (!sel.rangeCount) { return false }\n var node = sel.getRangeAt(0).commonAncestorContainer;\n return contains(this.div, node)\n };\n\n ContentEditableInput.prototype.focus = function () {\n if (this.cm.options.readOnly != \"nocursor\") {\n if (!this.selectionInEditor() || document.activeElement != this.div)\n { this.showSelection(this.prepareSelection(), true); }\n this.div.focus();\n }\n };\n ContentEditableInput.prototype.blur = function () { this.div.blur(); };\n ContentEditableInput.prototype.getField = function () { return this.div };\n\n ContentEditableInput.prototype.supportsTouch = function () { return true };\n\n ContentEditableInput.prototype.receivedFocus = function () {\n var input = this;\n if (this.selectionInEditor())\n { this.pollSelection(); }\n else\n { runInOp(this.cm, function () { return input.cm.curOp.selectionChanged = true; }); }\n\n function poll() {\n if (input.cm.state.focused) {\n input.pollSelection();\n input.polling.set(input.cm.options.pollInterval, poll);\n }\n }\n this.polling.set(this.cm.options.pollInterval, poll);\n };\n\n ContentEditableInput.prototype.selectionChanged = function () {\n var sel = this.getSelection();\n return sel.anchorNode != this.lastAnchorNode || sel.anchorOffset != this.lastAnchorOffset ||\n sel.focusNode != this.lastFocusNode || sel.focusOffset != this.lastFocusOffset\n };\n\n ContentEditableInput.prototype.pollSelection = function () {\n if (this.readDOMTimeout != null || this.gracePeriod || !this.selectionChanged()) { return }\n var sel = this.getSelection(), cm = this.cm;\n // On Android Chrome (version 56, at least), backspacing into an\n // uneditable block element will put the cursor in that element,\n // and then, because it's not editable, hide the virtual keyboard.\n // Because Android doesn't allow us to actually detect backspace\n // presses in a sane way, this code checks for when that happens\n // and simulates a backspace press in this case.\n if (android && chrome && this.cm.display.gutterSpecs.length && isInGutter(sel.anchorNode)) {\n this.cm.triggerOnKeyDown({type: \"keydown\", keyCode: 8, preventDefault: Math.abs});\n this.blur();\n this.focus();\n return\n }\n if (this.composing) { return }\n this.rememberSelection();\n var anchor = domToPos(cm, sel.anchorNode, sel.anchorOffset);\n var head = domToPos(cm, sel.focusNode, sel.focusOffset);\n if (anchor && head) { runInOp(cm, function () {\n setSelection(cm.doc, simpleSelection(anchor, head), sel_dontScroll);\n if (anchor.bad || head.bad) { cm.curOp.selectionChanged = true; }\n }); }\n };\n\n ContentEditableInput.prototype.pollContent = function () {\n if (this.readDOMTimeout != null) {\n clearTimeout(this.readDOMTimeout);\n this.readDOMTimeout = null;\n }\n\n var cm = this.cm, display = cm.display, sel = cm.doc.sel.primary();\n var from = sel.from(), to = sel.to();\n if (from.ch == 0 && from.line > cm.firstLine())\n { from = Pos(from.line - 1, getLine(cm.doc, from.line - 1).length); }\n if (to.ch == getLine(cm.doc, to.line).text.length && to.line < cm.lastLine())\n { to = Pos(to.line + 1, 0); }\n if (from.line < display.viewFrom || to.line > display.viewTo - 1) { return false }\n\n var fromIndex, fromLine, fromNode;\n if (from.line == display.viewFrom || (fromIndex = findViewIndex(cm, from.line)) == 0) {\n fromLine = lineNo(display.view[0].line);\n fromNode = display.view[0].node;\n } else {\n fromLine = lineNo(display.view[fromIndex].line);\n fromNode = display.view[fromIndex - 1].node.nextSibling;\n }\n var toIndex = findViewIndex(cm, to.line);\n var toLine, toNode;\n if (toIndex == display.view.length - 1) {\n toLine = display.viewTo - 1;\n toNode = display.lineDiv.lastChild;\n } else {\n toLine = lineNo(display.view[toIndex + 1].line) - 1;\n toNode = display.view[toIndex + 1].node.previousSibling;\n }\n\n if (!fromNode) { return false }\n var newText = cm.doc.splitLines(domTextBetween(cm, fromNode, toNode, fromLine, toLine));\n var oldText = getBetween(cm.doc, Pos(fromLine, 0), Pos(toLine, getLine(cm.doc, toLine).text.length));\n while (newText.length > 1 && oldText.length > 1) {\n if (lst(newText) == lst(oldText)) { newText.pop(); oldText.pop(); toLine--; }\n else if (newText[0] == oldText[0]) { newText.shift(); oldText.shift(); fromLine++; }\n else { break }\n }\n\n var cutFront = 0, cutEnd = 0;\n var newTop = newText[0], oldTop = oldText[0], maxCutFront = Math.min(newTop.length, oldTop.length);\n while (cutFront < maxCutFront && newTop.charCodeAt(cutFront) == oldTop.charCodeAt(cutFront))\n { ++cutFront; }\n var newBot = lst(newText), oldBot = lst(oldText);\n var maxCutEnd = Math.min(newBot.length - (newText.length == 1 ? cutFront : 0),\n oldBot.length - (oldText.length == 1 ? cutFront : 0));\n while (cutEnd < maxCutEnd &&\n newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1))\n { ++cutEnd; }\n // Try to move start of change to start of selection if ambiguous\n if (newText.length == 1 && oldText.length == 1 && fromLine == from.line) {\n while (cutFront && cutFront > from.ch &&\n newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1)) {\n cutFront--;\n cutEnd++;\n }\n }\n\n newText[newText.length - 1] = newBot.slice(0, newBot.length - cutEnd).replace(/^\\u200b+/, \"\");\n newText[0] = newText[0].slice(cutFront).replace(/\\u200b+$/, \"\");\n\n var chFrom = Pos(fromLine, cutFront);\n var chTo = Pos(toLine, oldText.length ? lst(oldText).length - cutEnd : 0);\n if (newText.length > 1 || newText[0] || cmp(chFrom, chTo)) {\n replaceRange(cm.doc, newText, chFrom, chTo, \"+input\");\n return true\n }\n };\n\n ContentEditableInput.prototype.ensurePolled = function () {\n this.forceCompositionEnd();\n };\n ContentEditableInput.prototype.reset = function () {\n this.forceCompositionEnd();\n };\n ContentEditableInput.prototype.forceCompositionEnd = function () {\n if (!this.composing) { return }\n clearTimeout(this.readDOMTimeout);\n this.composing = null;\n this.updateFromDOM();\n this.div.blur();\n this.div.focus();\n };\n ContentEditableInput.prototype.readFromDOMSoon = function () {\n var this$1 = this;\n\n if (this.readDOMTimeout != null) { return }\n this.readDOMTimeout = setTimeout(function () {\n this$1.readDOMTimeout = null;\n if (this$1.composing) {\n if (this$1.composing.done) { this$1.composing = null; }\n else { return }\n }\n this$1.updateFromDOM();\n }, 80);\n };\n\n ContentEditableInput.prototype.updateFromDOM = function () {\n var this$1 = this;\n\n if (this.cm.isReadOnly() || !this.pollContent())\n { runInOp(this.cm, function () { return regChange(this$1.cm); }); }\n };\n\n ContentEditableInput.prototype.setUneditable = function (node) {\n node.contentEditable = \"false\";\n };\n\n ContentEditableInput.prototype.onKeyPress = function (e) {\n if (e.charCode == 0 || this.composing) { return }\n e.preventDefault();\n if (!this.cm.isReadOnly())\n { operation(this.cm, applyTextInput)(this.cm, String.fromCharCode(e.charCode == null ? e.keyCode : e.charCode), 0); }\n };\n\n ContentEditableInput.prototype.readOnlyChanged = function (val) {\n this.div.contentEditable = String(val != \"nocursor\");\n };\n\n ContentEditableInput.prototype.onContextMenu = function () {};\n ContentEditableInput.prototype.resetPosition = function () {};\n\n ContentEditableInput.prototype.needsContentAttribute = true;\n\n function posToDOM(cm, pos) {\n var view = findViewForLine(cm, pos.line);\n if (!view || view.hidden) { return null }\n var line = getLine(cm.doc, pos.line);\n var info = mapFromLineView(view, line, pos.line);\n\n var order = getOrder(line, cm.doc.direction), side = \"left\";\n if (order) {\n var partPos = getBidiPartAt(order, pos.ch);\n side = partPos % 2 ? \"right\" : \"left\";\n }\n var result = nodeAndOffsetInLineMap(info.map, pos.ch, side);\n result.offset = result.collapse == \"right\" ? result.end : result.start;\n return result\n }\n\n function isInGutter(node) {\n for (var scan = node; scan; scan = scan.parentNode)\n { if (/CodeMirror-gutter-wrapper/.test(scan.className)) { return true } }\n return false\n }\n\n function badPos(pos, bad) { if (bad) { pos.bad = true; } return pos }\n\n function domTextBetween(cm, from, to, fromLine, toLine) {\n var text = \"\", closing = false, lineSep = cm.doc.lineSeparator(), extraLinebreak = false;\n function recognizeMarker(id) { return function (marker) { return marker.id == id; } }\n function close() {\n if (closing) {\n text += lineSep;\n if (extraLinebreak) { text += lineSep; }\n closing = extraLinebreak = false;\n }\n }\n function addText(str) {\n if (str) {\n close();\n text += str;\n }\n }\n function walk(node) {\n if (node.nodeType == 1) {\n var cmText = node.getAttribute(\"cm-text\");\n if (cmText) {\n addText(cmText);\n return\n }\n var markerID = node.getAttribute(\"cm-marker\"), range;\n if (markerID) {\n var found = cm.findMarks(Pos(fromLine, 0), Pos(toLine + 1, 0), recognizeMarker(+markerID));\n if (found.length && (range = found[0].find(0)))\n { addText(getBetween(cm.doc, range.from, range.to).join(lineSep)); }\n return\n }\n if (node.getAttribute(\"contenteditable\") == \"false\") { return }\n var isBlock = /^(pre|div|p|li|table|br)$/i.test(node.nodeName);\n if (!/^br$/i.test(node.nodeName) && node.textContent.length == 0) { return }\n\n if (isBlock) { close(); }\n for (var i = 0; i < node.childNodes.length; i++)\n { walk(node.childNodes[i]); }\n\n if (/^(pre|p)$/i.test(node.nodeName)) { extraLinebreak = true; }\n if (isBlock) { closing = true; }\n } else if (node.nodeType == 3) {\n addText(node.nodeValue.replace(/\\u200b/g, \"\").replace(/\\u00a0/g, \" \"));\n }\n }\n for (;;) {\n walk(from);\n if (from == to) { break }\n from = from.nextSibling;\n extraLinebreak = false;\n }\n return text\n }\n\n function domToPos(cm, node, offset) {\n var lineNode;\n if (node == cm.display.lineDiv) {\n lineNode = cm.display.lineDiv.childNodes[offset];\n if (!lineNode) { return badPos(cm.clipPos(Pos(cm.display.viewTo - 1)), true) }\n node = null; offset = 0;\n } else {\n for (lineNode = node;; lineNode = lineNode.parentNode) {\n if (!lineNode || lineNode == cm.display.lineDiv) { return null }\n if (lineNode.parentNode && lineNode.parentNode == cm.display.lineDiv) { break }\n }\n }\n for (var i = 0; i < cm.display.view.length; i++) {\n var lineView = cm.display.view[i];\n if (lineView.node == lineNode)\n { return locateNodeInLineView(lineView, node, offset) }\n }\n }\n\n function locateNodeInLineView(lineView, node, offset) {\n var wrapper = lineView.text.firstChild, bad = false;\n if (!node || !contains(wrapper, node)) { return badPos(Pos(lineNo(lineView.line), 0), true) }\n if (node == wrapper) {\n bad = true;\n node = wrapper.childNodes[offset];\n offset = 0;\n if (!node) {\n var line = lineView.rest ? lst(lineView.rest) : lineView.line;\n return badPos(Pos(lineNo(line), line.text.length), bad)\n }\n }\n\n var textNode = node.nodeType == 3 ? node : null, topNode = node;\n if (!textNode && node.childNodes.length == 1 && node.firstChild.nodeType == 3) {\n textNode = node.firstChild;\n if (offset) { offset = textNode.nodeValue.length; }\n }\n while (topNode.parentNode != wrapper) { topNode = topNode.parentNode; }\n var measure = lineView.measure, maps = measure.maps;\n\n function find(textNode, topNode, offset) {\n for (var i = -1; i < (maps ? maps.length : 0); i++) {\n var map = i < 0 ? measure.map : maps[i];\n for (var j = 0; j < map.length; j += 3) {\n var curNode = map[j + 2];\n if (curNode == textNode || curNode == topNode) {\n var line = lineNo(i < 0 ? lineView.line : lineView.rest[i]);\n var ch = map[j] + offset;\n if (offset < 0 || curNode != textNode) { ch = map[j + (offset ? 1 : 0)]; }\n return Pos(line, ch)\n }\n }\n }\n }\n var found = find(textNode, topNode, offset);\n if (found) { return badPos(found, bad) }\n\n // FIXME this is all really shaky. might handle the few cases it needs to handle, but likely to cause problems\n for (var after = topNode.nextSibling, dist = textNode ? textNode.nodeValue.length - offset : 0; after; after = after.nextSibling) {\n found = find(after, after.firstChild, 0);\n if (found)\n { return badPos(Pos(found.line, found.ch - dist), bad) }\n else\n { dist += after.textContent.length; }\n }\n for (var before = topNode.previousSibling, dist$1 = offset; before; before = before.previousSibling) {\n found = find(before, before.firstChild, -1);\n if (found)\n { return badPos(Pos(found.line, found.ch + dist$1), bad) }\n else\n { dist$1 += before.textContent.length; }\n }\n }\n\n // TEXTAREA INPUT STYLE\n\n var TextareaInput = function(cm) {\n this.cm = cm;\n // See input.poll and input.reset\n this.prevInput = \"\";\n\n // Flag that indicates whether we expect input to appear real soon\n // now (after some event like 'keypress' or 'input') and are\n // polling intensively.\n this.pollingFast = false;\n // Self-resetting timeout for the poller\n this.polling = new Delayed();\n // Used to work around IE issue with selection being forgotten when focus moves away from textarea\n this.hasSelection = false;\n this.composing = null;\n };\n\n TextareaInput.prototype.init = function (display) {\n var this$1 = this;\n\n var input = this, cm = this.cm;\n this.createField(display);\n var te = this.textarea;\n\n display.wrapper.insertBefore(this.wrapper, display.wrapper.firstChild);\n\n // Needed to hide big blue blinking cursor on Mobile Safari (doesn't seem to work in iOS 8 anymore)\n if (ios) { te.style.width = \"0px\"; }\n\n on(te, \"input\", function () {\n if (ie && ie_version >= 9 && this$1.hasSelection) { this$1.hasSelection = null; }\n input.poll();\n });\n\n on(te, \"paste\", function (e) {\n if (signalDOMEvent(cm, e) || handlePaste(e, cm)) { return }\n\n cm.state.pasteIncoming = +new Date;\n input.fastPoll();\n });\n\n function prepareCopyCut(e) {\n if (signalDOMEvent(cm, e)) { return }\n if (cm.somethingSelected()) {\n setLastCopied({lineWise: false, text: cm.getSelections()});\n } else if (!cm.options.lineWiseCopyCut) {\n return\n } else {\n var ranges = copyableRanges(cm);\n setLastCopied({lineWise: true, text: ranges.text});\n if (e.type == \"cut\") {\n cm.setSelections(ranges.ranges, null, sel_dontScroll);\n } else {\n input.prevInput = \"\";\n te.value = ranges.text.join(\"\\n\");\n selectInput(te);\n }\n }\n if (e.type == \"cut\") { cm.state.cutIncoming = +new Date; }\n }\n on(te, \"cut\", prepareCopyCut);\n on(te, \"copy\", prepareCopyCut);\n\n on(display.scroller, \"paste\", function (e) {\n if (eventInWidget(display, e) || signalDOMEvent(cm, e)) { return }\n if (!te.dispatchEvent) {\n cm.state.pasteIncoming = +new Date;\n input.focus();\n return\n }\n\n // Pass the `paste` event to the textarea so it's handled by its event listener.\n var event = new Event(\"paste\");\n event.clipboardData = e.clipboardData;\n te.dispatchEvent(event);\n });\n\n // Prevent normal selection in the editor (we handle our own)\n on(display.lineSpace, \"selectstart\", function (e) {\n if (!eventInWidget(display, e)) { e_preventDefault(e); }\n });\n\n on(te, \"compositionstart\", function () {\n var start = cm.getCursor(\"from\");\n if (input.composing) { input.composing.range.clear(); }\n input.composing = {\n start: start,\n range: cm.markText(start, cm.getCursor(\"to\"), {className: \"CodeMirror-composing\"})\n };\n });\n on(te, \"compositionend\", function () {\n if (input.composing) {\n input.poll();\n input.composing.range.clear();\n input.composing = null;\n }\n });\n };\n\n TextareaInput.prototype.createField = function (_display) {\n // Wraps and hides input textarea\n this.wrapper = hiddenTextarea();\n // The semihidden textarea that is focused when the editor is\n // focused, and receives input.\n this.textarea = this.wrapper.firstChild;\n };\n\n TextareaInput.prototype.screenReaderLabelChanged = function (label) {\n // Label for screenreaders, accessibility\n if(label) {\n this.textarea.setAttribute('aria-label', label);\n } else {\n this.textarea.removeAttribute('aria-label');\n }\n };\n\n TextareaInput.prototype.prepareSelection = function () {\n // Redraw the selection and/or cursor\n var cm = this.cm, display = cm.display, doc = cm.doc;\n var result = prepareSelection(cm);\n\n // Move the hidden textarea near the cursor to prevent scrolling artifacts\n if (cm.options.moveInputWithCursor) {\n var headPos = cursorCoords(cm, doc.sel.primary().head, \"div\");\n var wrapOff = display.wrapper.getBoundingClientRect(), lineOff = display.lineDiv.getBoundingClientRect();\n result.teTop = Math.max(0, Math.min(display.wrapper.clientHeight - 10,\n headPos.top + lineOff.top - wrapOff.top));\n result.teLeft = Math.max(0, Math.min(display.wrapper.clientWidth - 10,\n headPos.left + lineOff.left - wrapOff.left));\n }\n\n return result\n };\n\n TextareaInput.prototype.showSelection = function (drawn) {\n var cm = this.cm, display = cm.display;\n removeChildrenAndAdd(display.cursorDiv, drawn.cursors);\n removeChildrenAndAdd(display.selectionDiv, drawn.selection);\n if (drawn.teTop != null) {\n this.wrapper.style.top = drawn.teTop + \"px\";\n this.wrapper.style.left = drawn.teLeft + \"px\";\n }\n };\n\n // Reset the input to correspond to the selection (or to be empty,\n // when not typing and nothing is selected)\n TextareaInput.prototype.reset = function (typing) {\n if (this.contextMenuPending || this.composing) { return }\n var cm = this.cm;\n if (cm.somethingSelected()) {\n this.prevInput = \"\";\n var content = cm.getSelection();\n this.textarea.value = content;\n if (cm.state.focused) { selectInput(this.textarea); }\n if (ie && ie_version >= 9) { this.hasSelection = content; }\n } else if (!typing) {\n this.prevInput = this.textarea.value = \"\";\n if (ie && ie_version >= 9) { this.hasSelection = null; }\n }\n };\n\n TextareaInput.prototype.getField = function () { return this.textarea };\n\n TextareaInput.prototype.supportsTouch = function () { return false };\n\n TextareaInput.prototype.focus = function () {\n if (this.cm.options.readOnly != \"nocursor\" && (!mobile || activeElt() != this.textarea)) {\n try { this.textarea.focus(); }\n catch (e) {} // IE8 will throw if the textarea is display: none or not in DOM\n }\n };\n\n TextareaInput.prototype.blur = function () { this.textarea.blur(); };\n\n TextareaInput.prototype.resetPosition = function () {\n this.wrapper.style.top = this.wrapper.style.left = 0;\n };\n\n TextareaInput.prototype.receivedFocus = function () { this.slowPoll(); };\n\n // Poll for input changes, using the normal rate of polling. This\n // runs as long as the editor is focused.\n TextareaInput.prototype.slowPoll = function () {\n var this$1 = this;\n\n if (this.pollingFast) { return }\n this.polling.set(this.cm.options.pollInterval, function () {\n this$1.poll();\n if (this$1.cm.state.focused) { this$1.slowPoll(); }\n });\n };\n\n // When an event has just come in that is likely to add or change\n // something in the input textarea, we poll faster, to ensure that\n // the change appears on the screen quickly.\n TextareaInput.prototype.fastPoll = function () {\n var missed = false, input = this;\n input.pollingFast = true;\n function p() {\n var changed = input.poll();\n if (!changed && !missed) {missed = true; input.polling.set(60, p);}\n else {input.pollingFast = false; input.slowPoll();}\n }\n input.polling.set(20, p);\n };\n\n // Read input from the textarea, and update the document to match.\n // When something is selected, it is present in the textarea, and\n // selected (unless it is huge, in which case a placeholder is\n // used). When nothing is selected, the cursor sits after previously\n // seen text (can be empty), which is stored in prevInput (we must\n // not reset the textarea when typing, because that breaks IME).\n TextareaInput.prototype.poll = function () {\n var this$1 = this;\n\n var cm = this.cm, input = this.textarea, prevInput = this.prevInput;\n // Since this is called a *lot*, try to bail out as cheaply as\n // possible when it is clear that nothing happened. hasSelection\n // will be the case when there is a lot of text in the textarea,\n // in which case reading its value would be expensive.\n if (this.contextMenuPending || !cm.state.focused ||\n (hasSelection(input) && !prevInput && !this.composing) ||\n cm.isReadOnly() || cm.options.disableInput || cm.state.keySeq)\n { return false }\n\n var text = input.value;\n // If nothing changed, bail.\n if (text == prevInput && !cm.somethingSelected()) { return false }\n // Work around nonsensical selection resetting in IE9/10, and\n // inexplicable appearance of private area unicode characters on\n // some key combos in Mac (#2689).\n if (ie && ie_version >= 9 && this.hasSelection === text ||\n mac && /[\\uf700-\\uf7ff]/.test(text)) {\n cm.display.input.reset();\n return false\n }\n\n if (cm.doc.sel == cm.display.selForContextMenu) {\n var first = text.charCodeAt(0);\n if (first == 0x200b && !prevInput) { prevInput = \"\\u200b\"; }\n if (first == 0x21da) { this.reset(); return this.cm.execCommand(\"undo\") }\n }\n // Find the part of the input that is actually new\n var same = 0, l = Math.min(prevInput.length, text.length);\n while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) { ++same; }\n\n runInOp(cm, function () {\n applyTextInput(cm, text.slice(same), prevInput.length - same,\n null, this$1.composing ? \"*compose\" : null);\n\n // Don't leave long text in the textarea, since it makes further polling slow\n if (text.length > 1000 || text.indexOf(\"\\n\") > -1) { input.value = this$1.prevInput = \"\"; }\n else { this$1.prevInput = text; }\n\n if (this$1.composing) {\n this$1.composing.range.clear();\n this$1.composing.range = cm.markText(this$1.composing.start, cm.getCursor(\"to\"),\n {className: \"CodeMirror-composing\"});\n }\n });\n return true\n };\n\n TextareaInput.prototype.ensurePolled = function () {\n if (this.pollingFast && this.poll()) { this.pollingFast = false; }\n };\n\n TextareaInput.prototype.onKeyPress = function () {\n if (ie && ie_version >= 9) { this.hasSelection = null; }\n this.fastPoll();\n };\n\n TextareaInput.prototype.onContextMenu = function (e) {\n var input = this, cm = input.cm, display = cm.display, te = input.textarea;\n if (input.contextMenuPending) { input.contextMenuPending(); }\n var pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop;\n if (!pos || presto) { return } // Opera is difficult.\n\n // Reset the current text selection only if the click is done outside of the selection\n // and 'resetSelectionOnContextMenu' option is true.\n var reset = cm.options.resetSelectionOnContextMenu;\n if (reset && cm.doc.sel.contains(pos) == -1)\n { operation(cm, setSelection)(cm.doc, simpleSelection(pos), sel_dontScroll); }\n\n var oldCSS = te.style.cssText, oldWrapperCSS = input.wrapper.style.cssText;\n var wrapperBox = input.wrapper.offsetParent.getBoundingClientRect();\n input.wrapper.style.cssText = \"position: static\";\n te.style.cssText = \"position: absolute; width: 30px; height: 30px;\\n top: \" + (e.clientY - wrapperBox.top - 5) + \"px; left: \" + (e.clientX - wrapperBox.left - 5) + \"px;\\n z-index: 1000; background: \" + (ie ? \"rgba(255, 255, 255, .05)\" : \"transparent\") + \";\\n outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);\";\n var oldScrollY;\n if (webkit) { oldScrollY = window.scrollY; } // Work around Chrome issue (#2712)\n display.input.focus();\n if (webkit) { window.scrollTo(null, oldScrollY); }\n display.input.reset();\n // Adds \"Select all\" to context menu in FF\n if (!cm.somethingSelected()) { te.value = input.prevInput = \" \"; }\n input.contextMenuPending = rehide;\n display.selForContextMenu = cm.doc.sel;\n clearTimeout(display.detectingSelectAll);\n\n // Select-all will be greyed out if there's nothing to select, so\n // this adds a zero-width space so that we can later check whether\n // it got selected.\n function prepareSelectAllHack() {\n if (te.selectionStart != null) {\n var selected = cm.somethingSelected();\n var extval = \"\\u200b\" + (selected ? te.value : \"\");\n te.value = \"\\u21da\"; // Used to catch context-menu undo\n te.value = extval;\n input.prevInput = selected ? \"\" : \"\\u200b\";\n te.selectionStart = 1; te.selectionEnd = extval.length;\n // Re-set this, in case some other handler touched the\n // selection in the meantime.\n display.selForContextMenu = cm.doc.sel;\n }\n }\n function rehide() {\n if (input.contextMenuPending != rehide) { return }\n input.contextMenuPending = false;\n input.wrapper.style.cssText = oldWrapperCSS;\n te.style.cssText = oldCSS;\n if (ie && ie_version < 9) { display.scrollbars.setScrollTop(display.scroller.scrollTop = scrollPos); }\n\n // Try to detect the user choosing select-all\n if (te.selectionStart != null) {\n if (!ie || (ie && ie_version < 9)) { prepareSelectAllHack(); }\n var i = 0, poll = function () {\n if (display.selForContextMenu == cm.doc.sel && te.selectionStart == 0 &&\n te.selectionEnd > 0 && input.prevInput == \"\\u200b\") {\n operation(cm, selectAll)(cm);\n } else if (i++ < 10) {\n display.detectingSelectAll = setTimeout(poll, 500);\n } else {\n display.selForContextMenu = null;\n display.input.reset();\n }\n };\n display.detectingSelectAll = setTimeout(poll, 200);\n }\n }\n\n if (ie && ie_version >= 9) { prepareSelectAllHack(); }\n if (captureRightClick) {\n e_stop(e);\n var mouseup = function () {\n off(window, \"mouseup\", mouseup);\n setTimeout(rehide, 20);\n };\n on(window, \"mouseup\", mouseup);\n } else {\n setTimeout(rehide, 50);\n }\n };\n\n TextareaInput.prototype.readOnlyChanged = function (val) {\n if (!val) { this.reset(); }\n this.textarea.disabled = val == \"nocursor\";\n this.textarea.readOnly = !!val;\n };\n\n TextareaInput.prototype.setUneditable = function () {};\n\n TextareaInput.prototype.needsContentAttribute = false;\n\n function fromTextArea(textarea, options) {\n options = options ? copyObj(options) : {};\n options.value = textarea.value;\n if (!options.tabindex && textarea.tabIndex)\n { options.tabindex = textarea.tabIndex; }\n if (!options.placeholder && textarea.placeholder)\n { options.placeholder = textarea.placeholder; }\n // Set autofocus to true if this textarea is focused, or if it has\n // autofocus and no other element is focused.\n if (options.autofocus == null) {\n var hasFocus = activeElt();\n options.autofocus = hasFocus == textarea ||\n textarea.getAttribute(\"autofocus\") != null && hasFocus == document.body;\n }\n\n function save() {textarea.value = cm.getValue();}\n\n var realSubmit;\n if (textarea.form) {\n on(textarea.form, \"submit\", save);\n // Deplorable hack to make the submit method do the right thing.\n if (!options.leaveSubmitMethodAlone) {\n var form = textarea.form;\n realSubmit = form.submit;\n try {\n var wrappedSubmit = form.submit = function () {\n save();\n form.submit = realSubmit;\n form.submit();\n form.submit = wrappedSubmit;\n };\n } catch(e) {}\n }\n }\n\n options.finishInit = function (cm) {\n cm.save = save;\n cm.getTextArea = function () { return textarea; };\n cm.toTextArea = function () {\n cm.toTextArea = isNaN; // Prevent this from being ran twice\n save();\n textarea.parentNode.removeChild(cm.getWrapperElement());\n textarea.style.display = \"\";\n if (textarea.form) {\n off(textarea.form, \"submit\", save);\n if (!options.leaveSubmitMethodAlone && typeof textarea.form.submit == \"function\")\n { textarea.form.submit = realSubmit; }\n }\n };\n };\n\n textarea.style.display = \"none\";\n var cm = CodeMirror(function (node) { return textarea.parentNode.insertBefore(node, textarea.nextSibling); },\n options);\n return cm\n }\n\n function addLegacyProps(CodeMirror) {\n CodeMirror.off = off;\n CodeMirror.on = on;\n CodeMirror.wheelEventPixels = wheelEventPixels;\n CodeMirror.Doc = Doc;\n CodeMirror.splitLines = splitLinesAuto;\n CodeMirror.countColumn = countColumn;\n CodeMirror.findColumn = findColumn;\n CodeMirror.isWordChar = isWordCharBasic;\n CodeMirror.Pass = Pass;\n CodeMirror.signal = signal;\n CodeMirror.Line = Line;\n CodeMirror.changeEnd = changeEnd;\n CodeMirror.scrollbarModel = scrollbarModel;\n CodeMirror.Pos = Pos;\n CodeMirror.cmpPos = cmp;\n CodeMirror.modes = modes;\n CodeMirror.mimeModes = mimeModes;\n CodeMirror.resolveMode = resolveMode;\n CodeMirror.getMode = getMode;\n CodeMirror.modeExtensions = modeExtensions;\n CodeMirror.extendMode = extendMode;\n CodeMirror.copyState = copyState;\n CodeMirror.startState = startState;\n CodeMirror.innerMode = innerMode;\n CodeMirror.commands = commands;\n CodeMirror.keyMap = keyMap;\n CodeMirror.keyName = keyName;\n CodeMirror.isModifierKey = isModifierKey;\n CodeMirror.lookupKey = lookupKey;\n CodeMirror.normalizeKeyMap = normalizeKeyMap;\n CodeMirror.StringStream = StringStream;\n CodeMirror.SharedTextMarker = SharedTextMarker;\n CodeMirror.TextMarker = TextMarker;\n CodeMirror.LineWidget = LineWidget;\n CodeMirror.e_preventDefault = e_preventDefault;\n CodeMirror.e_stopPropagation = e_stopPropagation;\n CodeMirror.e_stop = e_stop;\n CodeMirror.addClass = addClass;\n CodeMirror.contains = contains;\n CodeMirror.rmClass = rmClass;\n CodeMirror.keyNames = keyNames;\n }\n\n // EDITOR CONSTRUCTOR\n\n defineOptions(CodeMirror);\n\n addEditorMethods(CodeMirror);\n\n // Set up methods on CodeMirror's prototype to redirect to the editor's document.\n var dontDelegate = \"iter insert remove copy getEditor constructor\".split(\" \");\n for (var prop in Doc.prototype) { if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0)\n { CodeMirror.prototype[prop] = (function(method) {\n return function() {return method.apply(this.doc, arguments)}\n })(Doc.prototype[prop]); } }\n\n eventMixin(Doc);\n CodeMirror.inputStyles = {\"textarea\": TextareaInput, \"contenteditable\": ContentEditableInput};\n\n // Extra arguments are stored as the mode's dependencies, which is\n // used by (legacy) mechanisms like loadmode.js to automatically\n // load a mode. (Preferred mechanism is the require/define calls.)\n CodeMirror.defineMode = function(name/*, mode, …*/) {\n if (!CodeMirror.defaults.mode && name != \"null\") { CodeMirror.defaults.mode = name; }\n defineMode.apply(this, arguments);\n };\n\n CodeMirror.defineMIME = defineMIME;\n\n // Minimal default mode.\n CodeMirror.defineMode(\"null\", function () { return ({token: function (stream) { return stream.skipToEnd(); }}); });\n CodeMirror.defineMIME(\"text/plain\", \"null\");\n\n // EXTENSIONS\n\n CodeMirror.defineExtension = function (name, func) {\n CodeMirror.prototype[name] = func;\n };\n CodeMirror.defineDocExtension = function (name, func) {\n Doc.prototype[name] = func;\n };\n\n CodeMirror.fromTextArea = fromTextArea;\n\n addLegacyProps(CodeMirror);\n\n CodeMirror.version = \"5.58.3\";\n\n return CodeMirror;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vbm9kZV9tb2R1bGVzL2NvZGVtaXJyb3IvbGliL2NvZGVtaXJyb3IuanM/NTZiMyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFLEtBQTREO0FBQzlELEVBQUUsQ0FDd0Q7QUFDMUQsQ0FBQyxxQkFBcUI7O0FBRXRCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxzQ0FBc0MsR0FBRztBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHVCQUF1Qiw0Q0FBNEM7QUFDbkUsK0NBQStDLGdCQUFnQixlQUFlO0FBQzlFO0FBQ0E7QUFDQTs7QUFFQSwyQkFBMkI7O0FBRTNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx5Q0FBeUMsV0FBVztBQUNwRCxPQUFPLDZCQUE2QjtBQUNwQztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esb0JBQW9CLHlCQUF5QjtBQUM3QyxnQkFBZ0IseUJBQXlCO0FBQ3pDLHFDQUFxQyxpREFBaUQ7QUFDdEYsdUJBQXVCLGdCQUFnQixvQkFBb0IsT0FBTywyQkFBMkIsRUFBRTtBQUMvRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLFFBQVE7QUFDUjtBQUNBLFNBQVMsc0NBQXNDO0FBQy9DLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBLE9BQU8sMEJBQTBCO0FBQ2pDO0FBQ0EsT0FBTztBQUNQO0FBQ0EsaUNBQWlDLG9CQUFvQjtBQUNyRCw0QkFBNEI7QUFDNUIsS0FB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RUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUEsQ0FBQyIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9jb2RlbWlycm9yL2xpYi9jb2RlbWlycm9yLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnNcbi8vIERpc3RyaWJ1dGVkIHVuZGVyIGFuIE1JVCBsaWNlbnNlOiBodHRwczovL2NvZGVtaXJyb3IubmV0L0xJQ0VOU0VcblxuLy8gVGhpcyBpcyBDb2RlTWlycm9yIChodHRwczovL2NvZGVtaXJyb3IubmV0KSwgYSBjb2RlIGVkaXRvclxuLy8gaW1wbGVtZW50ZWQgaW4gSmF2YVNjcmlwdCBvbiB0b3Agb2YgdGhlIGJyb3dzZXIncyBET00uXG4vL1xuLy8gWW91IGNhbiBmaW5kIHNvbWUgdGVjaG5pY2FsIGJhY2tncm91bmQgZm9yIHNvbWUgb2YgdGhlIGNvZGUgYmVsb3dcbi8vIGF0IGh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvYmxvZy8jY20taW50ZXJuYWxzIC5cblxuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOlxuICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOlxuICAoZ2xvYmFsID0gZ2xvYmFsIHx8IHNlbGYsIGdsb2JhbC5Db2RlTWlycm9yID0gZmFjdG9yeSgpKTtcbn0odGhpcywgKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gIC8vIEtsdWRnZXMgZm9yIGJ1Z3MgYW5kIGJlaGF2aW9yIGRpZmZlcmVuY2VzIHRoYXQgY2FuJ3QgYmUgZmVhdHVyZVxuICAvLyBkZXRlY3RlZCBhcmUgZW5hYmxlZCBiYXNlZCBvbiB1c2VyQWdlbnQgZXRjIHNuaWZmaW5nLlxuICB2YXIgdXNlckFnZW50ID0gbmF2aWdhdG9yLnVzZXJBZ2VudDtcbiAgdmFyIHBsYXRmb3JtID0gbmF2aWdhdG9yLnBsYXRmb3JtO1xuXG4gIHZhciBnZWNrbyA9IC9nZWNrb1xcL1xcZC9pLnRlc3QodXNlckFnZW50KTtcbiAgdmFyIGllX3VwdG8xMCA9IC9NU0lFIFxcZC8udGVzdCh1c2VyQWdlbnQpO1xuICB2YXIgaWVfMTF1cCA9IC9UcmlkZW50XFwvKD86WzctOV18XFxkezIsfSlcXC4uKnJ2OihcXGQrKS8uZXhlYyh1c2VyQWdlbnQpO1xuICB2YXIgZWRnZSA9IC9FZGdlXFwvKFxcZCspLy5leGVjKHVzZXJBZ2VudCk7XG4gIHZhciBpZSA9IGllX3VwdG8xMCB8fCBpZV8xMXVwIHx8IGVkZ2U7XG4gIHZhciBpZV92ZXJzaW9uID0gaWUgJiYgKGllX3VwdG8xMCA/IGRvY3VtZW50LmRvY3VtZW50TW9kZSB8fCA2IDogKyhlZGdlIHx8IGllXzExdXApWzFdKTtcbiAgdmFyIHdlYmtpdCA9ICFlZGdlICYmIC9XZWJLaXRcXC8vLnRlc3QodXNlckFnZW50KTtcbiAgdmFyIHF0d2Via2l0ID0gd2Via2l0ICYmIC9RdFxcL1xcZCtcXC5cXGQrLy50ZXN0KHVzZXJBZ2VudCk7XG4gIHZhciBjaHJvbWUgPSAhZWRnZSAmJiAvQ2hyb21lXFwvLy50ZXN0KHVzZXJBZ2VudCk7XG4gIHZhciBwcmVzdG8gPSAvT3BlcmFcXC8vLnRlc3QodXNlckFnZW50KTtcbiAgdmFyIHNhZmFyaSA9IC9BcHBsZSBDb21wdXRlci8udGVzdChuYXZpZ2F0b3IudmVuZG9yKTtcbiAgdmFyIG1hY19nZU1vdW50YWluTGlvbiA9IC9NYWMgT1MgWCAxXFxkXFxEKFs4LTldfFxcZFxcZClcXEQvLnRlc3QodXNlckFnZW50KTtcbiAgdmFyIHBoYW50b20gPSAvUGhhbnRvbUpTLy50ZXN0KHVzZXJBZ2VudCk7XG5cbiAgdmFyIGlvcyA9ICFlZGdlICYmIC9BcHBsZVdlYktpdC8udGVzdCh1c2VyQWdlbnQpICYmIC9Nb2JpbGVcXC9cXHcrLy50ZXN0KHVzZXJBZ2VudCk7XG4gIHZhciBhbmRyb2lkID0gL0FuZHJvaWQvLnRlc3QodXNlckFnZW50KTtcbiAgLy8gVGhpcyBpcyB3b2VmdWxseSBpbmNvbXBsZXRlLiBTdWdnZXN0aW9ucyBmb3IgYWx0ZXJuYXRpdmUgbWV0aG9kcyB3ZWxjb21lLlxuICB2YXIgbW9iaWxlID0gaW9zIHx8IGFuZHJvaWQgfHwgL3dlYk9TfEJsYWNrQmVycnl8T3BlcmEgTWluaXxPcGVyYSBNb2JpfElFTW9iaWxlL2kudGVzdCh1c2VyQWdlbnQpO1xuICB2YXIgbWFjID0gaW9zIHx8IC9NYWMvLnRlc3QocGxhdGZvcm0pO1xuICB2YXIgY2hyb21lT1MgPSAvXFxiQ3JPU1xcYi8udGVzdCh1c2VyQWdlbnQpO1xuICB2YXIgd2luZG93cyA9IC93aW4vaS50ZXN0KHBsYXRmb3JtKTtcblxuICB2YXIgcHJlc3RvX3ZlcnNpb24gPSBwcmVzdG8gJiYgdXNlckFnZW50Lm1hdGNoKC9WZXJzaW9uXFwvKFxcZCpcXC5cXGQqKS8pO1xuICBpZiAocHJlc3RvX3ZlcnNpb24pIHsgcHJlc3RvX3ZlcnNpb24gPSBOdW1iZXIocHJlc3RvX3ZlcnNpb25bMV0pOyB9XG4gIGlmIChwcmVzdG9fdmVyc2lvbiAmJiBwcmVzdG9fdmVyc2lvbiA+PSAxNSkgeyBwcmVzdG8gPSBmYWxzZTsgd2Via2l0ID0gdHJ1ZTsgfVxuICAvLyBTb21lIGJyb3dzZXJzIHVzZSB0aGUgd3JvbmcgZXZlbnQgcHJvcGVydGllcyB0byBzaWduYWwgY21kL2N0cmwgb24gT1MgWFxuICB2YXIgZmxpcEN0cmxDbWQgPSBtYWMgJiYgKHF0d2Via2l0IHx8IHByZXN0byAmJiAocHJlc3RvX3ZlcnNpb24gPT0gbnVsbCB8fCBwcmVzdG9fdmVyc2lvbiA8IDEyLjExKSk7XG4gIHZhciBjYXB0dXJlUmlnaHRDbGljayA9IGdlY2tvIHx8IChpZSAmJiBpZV92ZXJzaW9uID49IDkpO1xuXG4gIGZ1bmN0aW9uIGNsYXNzVGVzdChjbHMpIHsgcmV0dXJuIG5ldyBSZWdFeHAoXCIoXnxcXFxccylcIiArIGNscyArIFwiKD86JHxcXFxccylcXFxccypcIikgfVxuXG4gIHZhciBybUNsYXNzID0gZnVuY3Rpb24obm9kZSwgY2xzKSB7XG4gICAgdmFyIGN1cnJlbnQgPSBub2RlLmNsYXNzTmFtZTtcbiAgICB2YXIgbWF0Y2ggPSBjbGFzc1Rlc3QoY2xzKS5leGVjKGN1cnJlbnQpO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgdmFyIGFmdGVyID0gY3VycmVudC5zbGljZShtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aCk7XG4gICAgICBub2RlLmNsYXNzTmFtZSA9IGN1cnJlbnQuc2xpY2UoMCwgbWF0Y2guaW5kZXgpICsgKGFmdGVyID8gbWF0Y2hbMV0gKyBhZnRlciA6IFwiXCIpO1xuICAgIH1cbiAgfTtcblxuICBmdW5jdGlvbiByZW1vdmVDaGlsZHJlbihlKSB7XG4gICAgZm9yICh2YXIgY291bnQgPSBlLmNoaWxkTm9kZXMubGVuZ3RoOyBjb3VudCA+IDA7IC0tY291bnQpXG4gICAgICB7IGUucmVtb3ZlQ2hpbGQoZS5maXJzdENoaWxkKTsgfVxuICAgIHJldHVybiBlXG4gIH1cblxuICBmdW5jdGlvbiByZW1vdmVDaGlsZHJlbkFuZEFkZChwYXJlbnQsIGUpIHtcbiAgICByZXR1cm4gcmVtb3ZlQ2hpbGRyZW4ocGFyZW50KS5hcHBlbmRDaGlsZChlKVxuICB9XG5cbiAgZnVuY3Rpb24gZWx0KHRhZywgY29udGVudCwgY2xhc3NOYW1lLCBzdHlsZSkge1xuICAgIHZhciBlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpO1xuICAgIGlmIChjbGFzc05hbWUpIHsgZS5jbGFzc05hbWUgPSBjbGFzc05hbWU7IH1cbiAgICBpZiAoc3R5bGUpIHsgZS5zdHlsZS5jc3NUZXh0ID0gc3R5bGU7IH1cbiAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT0gXCJzdHJpbmdcIikgeyBlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNvbnRlbnQpKTsgfVxuICAgIGVsc2UgaWYgKGNvbnRlbnQpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBjb250ZW50Lmxlbmd0aDsgKytpKSB7IGUuYXBwZW5kQ2hpbGQoY29udGVudFtpXSk7IH0gfVxuICAgIHJldHVybiBlXG4gIH1cbiAgLy8gd3JhcHBlciBmb3IgZWx0LCB3aGljaCByZW1vdmVzIHRoZSBlbHQgZnJvbSB0aGUgYWNjZXNzaWJpbGl0eSB0cmVlXG4gIGZ1bmN0aW9uIGVsdFAodGFnLCBjb250ZW50LCBjbGFzc05hbWUsIHN0eWxlKSB7XG4gICAgdmFyIGUgPSBlbHQodGFnLCBjb250ZW50LCBjbGFzc05hbWUsIHN0eWxlKTtcbiAgICBlLnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJwcmVzZW50YXRpb25cIik7XG4gICAgcmV0dXJuIGVcbiAgfVxuXG4gIHZhciByYW5nZTtcbiAgaWYgKGRvY3VtZW50LmNyZWF0ZVJhbmdlKSB7IHJhbmdlID0gZnVuY3Rpb24obm9kZSwgc3RhcnQsIGVuZCwgZW5kTm9kZSkge1xuICAgIHZhciByID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICByLnNldEVuZChlbmROb2RlIHx8IG5vZGUsIGVuZCk7XG4gICAgci5zZXRTdGFydChub2RlLCBzdGFydCk7XG4gICAgcmV0dXJuIHJcbiAgfTsgfVxuICBlbHNlIHsgcmFuZ2UgPSBmdW5jdGlvbihub2RlLCBzdGFydCwgZW5kKSB7XG4gICAgdmFyIHIgPSBkb2N1bWVudC5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpO1xuICAgIHRyeSB7IHIubW92ZVRvRWxlbWVudFRleHQobm9kZS5wYXJlbnROb2RlKTsgfVxuICAgIGNhdGNoKGUpIHsgcmV0dXJuIHIgfVxuICAgIHIuY29sbGFwc2UodHJ1ZSk7XG4gICAgci5tb3ZlRW5kKFwiY2hhcmFjdGVyXCIsIGVuZCk7XG4gICAgci5tb3ZlU3RhcnQoXCJjaGFyYWN0ZXJcIiwgc3RhcnQpO1xuICAgIHJldHVybiByXG4gIH07IH1cblxuICBmdW5jdGlvbiBjb250YWlucyhwYXJlbnQsIGNoaWxkKSB7XG4gICAgaWYgKGNoaWxkLm5vZGVUeXBlID09IDMpIC8vIEFuZHJvaWQgYnJvd3NlciBhbHdheXMgcmV0dXJucyBmYWxzZSB3aGVuIGNoaWxkIGlzIGEgdGV4dG5vZGVcbiAgICAgIHsgY2hpbGQgPSBjaGlsZC5wYXJlbnROb2RlOyB9XG4gICAgaWYgKHBhcmVudC5jb250YWlucylcbiAgICAgIHsgcmV0dXJuIHBhcmVudC5jb250YWlucyhjaGlsZCkgfVxuICAgIGRvIHtcbiAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSA9PSAxMSkgeyBjaGlsZCA9IGNoaWxkLmhvc3Q7IH1cbiAgICAgIGlmIChjaGlsZCA9PSBwYXJlbnQpIHsgcmV0dXJuIHRydWUgfVxuICAgIH0gd2hpbGUgKGNoaWxkID0gY2hpbGQucGFyZW50Tm9kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGFjdGl2ZUVsdCgpIHtcbiAgICAvLyBJRSBhbmQgRWRnZSBtYXkgdGhyb3cgYW4gXCJVbnNwZWNpZmllZCBFcnJvclwiIHdoZW4gYWNjZXNzaW5nIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQuXG4gICAgLy8gSUUgPCAxMCB3aWxsIHRocm93IHdoZW4gYWNjZXNzZWQgd2hpbGUgdGhlIHBhZ2UgaXMgbG9hZGluZyBvciBpbiBhbiBpZnJhbWUuXG4gICAgLy8gSUUgPiA5IGFuZCBFZGdlIHdpbGwgdGhyb3cgd2hlbiBhY2Nlc3NlZCBpbiBhbiBpZnJhbWUgaWYgZG9jdW1lbnQuYm9keSBpcyB1bmF2YWlsYWJsZS5cbiAgICB2YXIgYWN0aXZlRWxlbWVudDtcbiAgICB0cnkge1xuICAgICAgYWN0aXZlRWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgfSBjYXRjaChlKSB7XG4gICAgICBhY3RpdmVFbGVtZW50ID0gZG9jdW1lbnQuYm9keSB8fCBudWxsO1xuICAgIH1cbiAgICB3aGlsZSAoYWN0aXZlRWxlbWVudCAmJiBhY3RpdmVFbGVtZW50LnNoYWRvd1Jvb3QgJiYgYWN0aXZlRWxlbWVudC5zaGFkb3dSb290LmFjdGl2ZUVsZW1lbnQpXG4gICAgICB7IGFjdGl2ZUVsZW1lbnQgPSBhY3RpdmVFbGVtZW50LnNoYWRvd1Jvb3QuYWN0aXZlRWxlbWVudDsgfVxuICAgIHJldHVybiBhY3RpdmVFbGVtZW50XG4gIH1cblxuICBmdW5jdGlvbiBhZGRDbGFzcyhub2RlLCBjbHMpIHtcbiAgICB2YXIgY3VycmVudCA9IG5vZGUuY2xhc3NOYW1lO1xuICAgIGlmICghY2xhc3NUZXN0KGNscykudGVzdChjdXJyZW50KSkgeyBub2RlLmNsYXNzTmFtZSArPSAoY3VycmVudCA/IFwiIFwiIDogXCJcIikgKyBjbHM7IH1cbiAgfVxuICBmdW5jdGlvbiBqb2luQ2xhc3NlcyhhLCBiKSB7XG4gICAgdmFyIGFzID0gYS5zcGxpdChcIiBcIik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcy5sZW5ndGg7IGkrKylcbiAgICAgIHsgaWYgKGFzW2ldICYmICFjbGFzc1Rlc3QoYXNbaV0pLnRlc3QoYikpIHsgYiArPSBcIiBcIiArIGFzW2ldOyB9IH1cbiAgICByZXR1cm4gYlxuICB9XG5cbiAgdmFyIHNlbGVjdElucHV0ID0gZnVuY3Rpb24obm9kZSkgeyBub2RlLnNlbGVjdCgpOyB9O1xuICBpZiAoaW9zKSAvLyBNb2JpbGUgU2FmYXJpIGFwcGFyZW50bHkgaGFzIGEgYnVnIHdoZXJlIHNlbGVjdCgpIGlzIGJyb2tlbi5cbiAgICB7IHNlbGVjdElucHV0ID0gZnVuY3Rpb24obm9kZSkgeyBub2RlLnNlbGVjdGlvblN0YXJ0ID0gMDsgbm9kZS5zZWxlY3Rpb25FbmQgPSBub2RlLnZhbHVlLmxlbmd0aDsgfTsgfVxuICBlbHNlIGlmIChpZSkgLy8gU3VwcHJlc3MgbXlzdGVyaW91cyBJRTEwIGVycm9yc1xuICAgIHsgc2VsZWN0SW5wdXQgPSBmdW5jdGlvbihub2RlKSB7IHRyeSB7IG5vZGUuc2VsZWN0KCk7IH0gY2F0Y2goX2UpIHt9IH07IH1cblxuICBmdW5jdGlvbiBiaW5kKGYpIHtcbiAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGYuYXBwbHkobnVsbCwgYXJncyl9XG4gIH1cblxuICBmdW5jdGlvbiBjb3B5T2JqKG9iaiwgdGFyZ2V0LCBvdmVyd3JpdGUpIHtcbiAgICBpZiAoIXRhcmdldCkgeyB0YXJnZXQgPSB7fTsgfVxuICAgIGZvciAodmFyIHByb3AgaW4gb2JqKVxuICAgICAgeyBpZiAob2JqLmhhc093blByb3BlcnR5KHByb3ApICYmIChvdmVyd3JpdGUgIT09IGZhbHNlIHx8ICF0YXJnZXQuaGFzT3duUHJvcGVydHkocHJvcCkpKVxuICAgICAgICB7IHRhcmdldFtwcm9wXSA9IG9ialtwcm9wXTsgfSB9XG4gICAgcmV0dXJuIHRhcmdldFxuICB9XG5cbiAgLy8gQ291bnRzIHRoZSBjb2x1bW4gb2Zmc2V0IGluIGEgc3RyaW5nLCB0YWtpbmcgdGFicyBpbnRvIGFjY291bnQuXG4gIC8vIFVzZWQgbW9zdGx5IHRvIGZpbmQgaW5kZW50YXRpb24uXG4gIGZ1bmN0aW9uIGNvdW50Q29sdW1uKHN0cmluZywgZW5kLCB0YWJTaXplLCBzdGFydEluZGV4LCBzdGFydFZhbHVlKSB7XG4gICAgaWYgKGVuZCA9PSBudWxsKSB7XG4gICAgICBlbmQgPSBzdHJpbmcuc2VhcmNoKC9bXlxcc1xcdTAwYTBdLyk7XG4gICAgICBpZiAoZW5kID09IC0xKSB7IGVuZCA9IHN0cmluZy5sZW5ndGg7IH1cbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0SW5kZXggfHwgMCwgbiA9IHN0YXJ0VmFsdWUgfHwgMDs7KSB7XG4gICAgICB2YXIgbmV4dFRhYiA9IHN0cmluZy5pbmRleE9mKFwiXFx0XCIsIGkpO1xuICAgICAgaWYgKG5leHRUYWIgPCAwIHx8IG5leHRUYWIgPj0gZW5kKVxuICAgICAgICB7IHJldHVybiBuICsgKGVuZCAtIGkpIH1cbiAgICAgIG4gKz0gbmV4dFRhYiAtIGk7XG4gICAgICBuICs9IHRhYlNpemUgLSAobiAlIHRhYlNpemUpO1xuICAgICAgaSA9IG5leHRUYWIgKyAxO1xuICAgIH1cbiAgfVxuXG4gIHZhciBEZWxheWVkID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5pZCA9IG51bGw7XG4gICAgdGhpcy5mID0gbnVsbDtcbiAgICB0aGlzLnRpbWUgPSAwO1xuICAgIHRoaXMuaGFuZGxlciA9IGJpbmQodGhpcy5vblRpbWVvdXQsIHRoaXMpO1xuICB9O1xuICBEZWxheWVkLnByb3RvdHlwZS5vblRpbWVvdXQgPSBmdW5jdGlvbiAoc2VsZikge1xuICAgIHNlbGYuaWQgPSAwO1xuICAgIGlmIChzZWxmLnRpbWUgPD0gK25ldyBEYXRlKSB7XG4gICAgICBzZWxmLmYoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0VGltZW91dChzZWxmLmhhbmRsZXIsIHNlbGYudGltZSAtICtuZXcgRGF0ZSk7XG4gICAgfVxuICB9O1xuICBEZWxheWVkLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAobXMsIGYpIHtcbiAgICB0aGlzLmYgPSBmO1xuICAgIHZhciB0aW1lID0gK25ldyBEYXRlICsgbXM7XG4gICAgaWYgKCF0aGlzLmlkIHx8IHRpbWUgPCB0aGlzLnRpbWUpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmlkKTtcbiAgICAgIHRoaXMuaWQgPSBzZXRUaW1lb3V0KHRoaXMuaGFuZGxlciwgbXMpO1xuICAgICAgdGhpcy50aW1lID0gdGltZTtcbiAgICB9XG4gIH07XG5cbiAgZnVuY3Rpb24gaW5kZXhPZihhcnJheSwgZWx0KSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7ICsraSlcbiAgICAgIHsgaWYgKGFycmF5W2ldID09IGVsdCkgeyByZXR1cm4gaSB9IH1cbiAgICByZXR1cm4gLTFcbiAgfVxuXG4gIC8vIE51bWJlciBvZiBwaXhlbHMgYWRkZWQgdG8gc2Nyb2xsZXIgYW5kIHNpemVyIHRvIGhpZGUgc2Nyb2xsYmFyXG4gIHZhciBzY3JvbGxlckdhcCA9IDUwO1xuXG4gIC8vIFJldHVybmVkIG9yIHRocm93biBieSB2YXJpb3VzIHByb3RvY29scyB0byBzaWduYWwgJ0knbSBub3RcbiAgLy8gaGFuZGxpbmcgdGhpcycuXG4gIHZhciBQYXNzID0ge3RvU3RyaW5nOiBmdW5jdGlvbigpe3JldHVybiBcIkNvZGVNaXJyb3IuUGFzc1wifX07XG5cbiAgLy8gUmV1c2VkIG9wdGlvbiBvYmplY3RzIGZvciBzZXRTZWxlY3Rpb24gJiBmcmllbmRzXG4gIHZhciBzZWxfZG9udFNjcm9sbCA9IHtzY3JvbGw6IGZhbHNlfSwgc2VsX21vdXNlID0ge29yaWdpbjogXCIqbW91c2VcIn0sIHNlbF9tb3ZlID0ge29yaWdpbjogXCIrbW92ZVwifTtcblxuICAvLyBUaGUgaW52ZXJzZSBvZiBjb3VudENvbHVtbiAtLSBmaW5kIHRoZSBvZmZzZXQgdGhhdCBjb3JyZXNwb25kcyB0b1xuICAvLyBhIHBhcnRpY3VsYXIgY29sdW1uLlxuICBmdW5jdGlvbiBmaW5kQ29sdW1uKHN0cmluZywgZ29hbCwgdGFiU2l6ZSkge1xuICAgIGZvciAodmFyIHBvcyA9IDAsIGNvbCA9IDA7Oykge1xuICAgICAgdmFyIG5leHRUYWIgPSBzdHJpbmcuaW5kZXhPZihcIlxcdFwiLCBwb3MpO1xuICAgICAgaWYgKG5leHRUYWIgPT0gLTEpIHsgbmV4dFRhYiA9IHN0cmluZy5sZW5ndGg7IH1cbiAgICAgIHZhciBza2lwcGVkID0gbmV4dFRhYiAtIHBvcztcbiAgICAgIGlmIChuZXh0VGFiID09IHN0cmluZy5sZW5ndGggfHwgY29sICsgc2tpcHBlZCA+PSBnb2FsKVxuICAgICAgICB7IHJldHVybiBwb3MgKyBNYXRoLm1pbihza2lwcGVkLCBnb2FsIC0gY29sKSB9XG4gICAgICBjb2wgKz0gbmV4dFRhYiAtIHBvcztcbiAgICAgIGNvbCArPSB0YWJTaXplIC0gKGNvbCAlIHRhYlNpemUpO1xuICAgICAgcG9zID0gbmV4dFRhYiArIDE7XG4gICAgICBpZiAoY29sID49IGdvYWwpIHsgcmV0dXJuIHBvcyB9XG4gICAgfVxuICB9XG5cbiAgdmFyIHNwYWNlU3RycyA9IFtcIlwiXTtcbiAgZnVuY3Rpb24gc3BhY2VTdHIobikge1xuICAgIHdoaWxlIChzcGFjZVN0cnMubGVuZ3RoIDw9IG4pXG4gICAgICB7IHNwYWNlU3Rycy5wdXNoKGxzdChzcGFjZVN0cnMpICsgXCIgXCIpOyB9XG4gICAgcmV0dXJuIHNwYWNlU3Ryc1tuXVxuICB9XG5cbiAgZnVuY3Rpb24gbHN0KGFycikgeyByZXR1cm4gYXJyW2Fyci5sZW5ndGgtMV0gfVxuXG4gIGZ1bmN0aW9uIG1hcChhcnJheSwgZikge1xuICAgIHZhciBvdXQgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7IG91dFtpXSA9IGYoYXJyYXlbaV0sIGkpOyB9XG4gICAgcmV0dXJuIG91dFxuICB9XG5cbiAgZnVuY3Rpb24gaW5zZXJ0U29ydGVkKGFycmF5LCB2YWx1ZSwgc2NvcmUpIHtcbiAgICB2YXIgcG9zID0gMCwgcHJpb3JpdHkgPSBzY29yZSh2YWx1ZSk7XG4gICAgd2hpbGUgKHBvcyA8IGFycmF5Lmxlbmd0aCAmJiBzY29yZShhcnJheVtwb3NdKSA8PSBwcmlvcml0eSkgeyBwb3MrKzsgfVxuICAgIGFycmF5LnNwbGljZShwb3MsIDAsIHZhbHVlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG5vdGhpbmcoKSB7fVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZU9iaihiYXNlLCBwcm9wcykge1xuICAgIHZhciBpbnN0O1xuICAgIGlmIChPYmplY3QuY3JlYXRlKSB7XG4gICAgICBpbnN0ID0gT2JqZWN0LmNyZWF0ZShiYXNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbm90aGluZy5wcm90b3R5cGUgPSBiYXNlO1xuICAgICAgaW5zdCA9IG5ldyBub3RoaW5nKCk7XG4gICAgfVxuICAgIGlmIChwcm9wcykgeyBjb3B5T2JqKHByb3BzLCBpbnN0KTsgfVxuICAgIHJldHVybiBpbnN0XG4gIH1cblxuICB2YXIgbm9uQVNDSUlTaW5nbGVDYXNlV29yZENoYXIgPSAvW1xcdTAwZGZcXHUwNTg3XFx1MDU5MC1cXHUwNWY0XFx1MDYwMC1cXHUwNmZmXFx1MzA0MC1cXHUzMDlmXFx1MzBhMC1cXHUzMGZmXFx1MzQwMC1cXHU0ZGI1XFx1NGUwMC1cXHU5ZmNjXFx1YWMwMC1cXHVkN2FmXS87XG4gIGZ1bmN0aW9uIGlzV29yZENoYXJCYXNpYyhjaCkge1xuICAgIHJldHVybiAvXFx3Ly50ZXN0KGNoKSB8fCBjaCA+IFwiXFx4ODBcIiAmJlxuICAgICAgKGNoLnRvVXBwZXJDYXNlKCkgIT0gY2gudG9Mb3dlckNhc2UoKSB8fCBub25BU0NJSVNpbmdsZUNhc2VXb3JkQ2hhci50ZXN0KGNoKSlcbiAgfVxuICBmdW5jdGlvbiBpc1dvcmRDaGFyKGNoLCBoZWxwZXIpIHtcbiAgICBpZiAoIWhlbHBlcikgeyByZXR1cm4gaXNXb3JkQ2hhckJhc2ljKGNoKSB9XG4gICAgaWYgKGhlbHBlci5zb3VyY2UuaW5kZXhPZihcIlxcXFx3XCIpID4gLTEgJiYgaXNXb3JkQ2hhckJhc2ljKGNoKSkgeyByZXR1cm4gdHJ1ZSB9XG4gICAgcmV0dXJuIGhlbHBlci50ZXN0KGNoKVxuICB9XG5cbiAgZnVuY3Rpb24gaXNFbXB0eShvYmopIHtcbiAgICBmb3IgKHZhciBuIGluIG9iaikgeyBpZiAob2JqLmhhc093blByb3BlcnR5KG4pICYmIG9ialtuXSkgeyByZXR1cm4gZmFsc2UgfSB9XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8vIEV4dGVuZGluZyB1bmljb2RlIGNoYXJhY3RlcnMuIEEgc2VyaWVzIG9mIGEgbm9uLWV4dGVuZGluZyBjaGFyICtcbiAgLy8gYW55IG51bWJlciBvZiBleHRlbmRpbmcgY2hhcnMgaXMgdHJlYXRlZCBhcyBhIHNpbmdsZSB1bml0IGFzIGZhclxuICAvLyBhcyBlZGl0aW5nIGFuZCBtZWFzdXJpbmcgaXMgY29uY2VybmVkLiBUaGlzIGlzIG5vdCBmdWxseSBjb3JyZWN0LFxuICAvLyBzaW5jZSBzb21lIHNjcmlwdHMvZm9udHMvYnJvd3NlcnMgYWxzbyB0cmVhdCBvdGhlciBjb25maWd1cmF0aW9uc1xuICAvLyBvZiBjb2RlIHBvaW50cyBhcyBhIGdyb3VwLlxuICB2YXIgZXh0ZW5kaW5nQ2hhcnMgPSAvW1xcdTAzMDAtXFx1MDM2ZlxcdTA0ODMtXFx1MDQ4OVxcdTA1OTEtXFx1MDViZFxcdTA1YmZcXHUwNWMxXFx1MDVjMlxcdTA1YzRcXHUwNWM1XFx1MDVjN1xcdTA2MTAtXFx1MDYxYVxcdTA2NGItXFx1MDY1ZVxcdTA2NzBcXHUwNmQ2LVxcdTA2ZGNcXHUwNmRlLVxcdTA2ZTRcXHUwNmU3XFx1MDZlOFxcdTA2ZWEtXFx1MDZlZFxcdTA3MTFcXHUwNzMwLVxcdTA3NGFcXHUwN2E2LVxcdTA3YjBcXHUwN2ViLVxcdTA3ZjNcXHUwODE2LVxcdTA4MTlcXHUwODFiLVxcdTA4MjNcXHUwODI1LVxcdTA4MjdcXHUwODI5LVxcdTA4MmRcXHUwOTAwLVxcdTA5MDJcXHUwOTNjXFx1MDk0MS1cXHUwOTQ4XFx1MDk0ZFxcdTA5NTEtXFx1MDk1NVxcdTA5NjJcXHUwOTYzXFx1MDk4MVxcdTA5YmNcXHUwOWJlXFx1MDljMS1cXHUwOWM0XFx1MDljZFxcdTA5ZDdcXHUwOWUyXFx1MDllM1xcdTBhMDFcXHUwYTAyXFx1MGEzY1xcdTBhNDFcXHUwYTQyXFx1MGE0N1xcdTBhNDhcXHUwYTRiLVxcdTBhNGRcXHUwYTUxXFx1MGE3MFxcdTBhNzFcXHUwYTc1XFx1MGE4MVxcdTBhODJcXHUwYWJjXFx1MGFjMS1cXHUwYWM1XFx1MGFjN1xcdTBhYzhcXHUwYWNkXFx1MGFlMlxcdTBhZTNcXHUwYjAxXFx1MGIzY1xcdTBiM2VcXHUwYjNmXFx1MGI0MS1cXHUwYjQ0XFx1MGI0ZFxcdTBiNTZcXHUwYjU3XFx1MGI2MlxcdTBiNjNcXHUwYjgyXFx1MGJiZVxcdTBiYzBcXHUwYmNkXFx1MGJkN1xcdTBjM2UtXFx1MGM0MFxcdTBjNDYtXFx1MGM0OFxcdTBjNGEtXFx1MGM0ZFxcdTBjNTVcXHUwYzU2XFx1MGM2MlxcdTBjNjNcXHUwY2JjXFx1MGNiZlxcdTBjYzJcXHUwY2M2XFx1MGNjY1xcdTBjY2RcXHUwY2Q1XFx1MGNkNlxcdTBjZTJcXHUwY2UzXFx1MGQzZVxcdTBkNDEtXFx1MGQ0NFxcdTBkNGRcXHUwZDU3XFx1MGQ2MlxcdTBkNjNcXHUwZGNhXFx1MGRjZlxcdTBkZDItXFx1MGRkNFxcdTBkZDZcXHUwZGRmXFx1MGUzMVxcdTBlMzQtXFx1MGUzYVxcdTBlNDctXFx1MGU0ZVxcdTBlYjFcXHUwZWI0LVxcdTBlYjlcXHUwZWJiXFx1MGViY1xcdTBlYzgtXFx1MGVjZFxcdTBmMThcXHUwZjE5XFx1MGYzNVxcdTBmMzdcXHUwZjM5XFx1MGY3MS1cXHUwZjdlXFx1MGY4MC1cXHUwZjg0XFx1MGY4NlxcdTBmODdcXHUwZjkwLVxcdTBmOTdcXHUwZjk5LVxcdTBmYmNcXHUwZmM2XFx1MTAyZC1cXHUxMDMwXFx1MTAzMi1cXHUxMDM3XFx1MTAzOVxcdTEwM2FcXHUxMDNkXFx1MTAzZVxcdTEwNThcXHUxMDU5XFx1MTA1ZS1cXHUxMDYwXFx1MTA3MS1cXHUxMDc0XFx1MTA4MlxcdTEwODVcXHUxMDg2XFx1MTA4ZFxcdTEwOWRcXHUxMzVmXFx1MTcxMi1cXHUxNzE0XFx1MTczMi1cXHUxNzM0XFx1MTc1MlxcdTE3NTNcXHUxNzcyXFx1MTc3M1xcdTE3YjctXFx1MTdiZFxcdTE3YzZcXHUxN2M5LVxcdTE3ZDNcXHUxN2RkXFx1MTgwYi1cXHUxODBkXFx1MThhOVxcdTE5MjAtXFx1MTkyMlxcdTE5MjdcXHUxOTI4XFx1MTkzMlxcdTE5MzktXFx1MTkzYlxcdTFhMTdcXHUxYTE4XFx1MWE1NlxcdTFhNTgtXFx1MWE1ZVxcdTFhNjBcXHUxYTYyXFx1MWE2NS1cXHUxYTZjXFx1MWE3My1cXHUxYTdjXFx1MWE3ZlxcdTFiMDAtXFx1MWIwM1xcdTFiMzRcXHUxYjM2LVxcdTFiM2FcXHUxYjNjXFx1MWI0MlxcdTFiNmItXFx1MWI3M1xcdTFiODBcXHUxYjgxXFx1MWJhMi1cXHUxYmE1XFx1MWJhOFxcdTFiYTlcXHUxYzJjLVxcdTFjMzNcXHUxYzM2XFx1MWMzN1xcdTFjZDAtXFx1MWNkMlxcdTFjZDQtXFx1MWNlMFxcdTFjZTItXFx1MWNlOFxcdTFjZWRcXHUxZGMwLVxcdTFkZTZcXHUxZGZkLVxcdTFkZmZcXHUyMDBjXFx1MjAwZFxcdTIwZDAtXFx1MjBmMFxcdTJjZWYtXFx1MmNmMVxcdTJkZTAtXFx1MmRmZlxcdTMwMmEtXFx1MzAyZlxcdTMwOTlcXHUzMDlhXFx1YTY2Zi1cXHVhNjcyXFx1YTY3Y1xcdWE2N2RcXHVhNmYwXFx1YTZmMVxcdWE4MDJcXHVhODA2XFx1YTgwYlxcdWE4MjVcXHVhODI2XFx1YThjNFxcdWE4ZTAtXFx1YThmMVxcdWE5MjYtXFx1YTkyZFxcdWE5NDctXFx1YTk1MVxcdWE5ODAtXFx1YTk4MlxcdWE5YjNcXHVhOWI2LVxcdWE5YjlcXHVhOWJjXFx1YWEyOS1cXHVhYTJlXFx1YWEzMVxcdWFhMzJcXHVhYTM1XFx1YWEzNlxcdWFhNDNcXHVhYTRjXFx1YWFiMFxcdWFhYjItXFx1YWFiNFxcdWFhYjdcXHVhYWI4XFx1YWFiZVxcdWFhYmZcXHVhYWMxXFx1YWJlNVxcdWFiZThcXHVhYmVkXFx1ZGMwMC1cXHVkZmZmXFx1ZmIxZVxcdWZlMDAtXFx1ZmUwZlxcdWZlMjAtXFx1ZmUyNlxcdWZmOWVcXHVmZjlmXS87XG4gIGZ1bmN0aW9uIGlzRXh0ZW5kaW5nQ2hhcihjaCkgeyByZXR1cm4gY2guY2hhckNvZGVBdCgwKSA+PSA3NjggJiYgZXh0ZW5kaW5nQ2hhcnMudGVzdChjaCkgfVxuXG4gIC8vIFJldHVybnMgYSBudW1iZXIgZnJvbSB0aGUgcmFuZ2UgW2AwYDsgYHN0ci5sZW5ndGhgXSB1bmxlc3MgYHBvc2AgaXMgb3V0c2lkZSB0aGF0IHJhbmdlLlxuICBmdW5jdGlvbiBza2lwRXh0ZW5kaW5nQ2hhcnMoc3RyLCBwb3MsIGRpcikge1xuICAgIHdoaWxlICgoZGlyIDwgMCA/IHBvcyA+IDAgOiBwb3MgPCBzdHIubGVuZ3RoKSAmJiBpc0V4dGVuZGluZ0NoYXIoc3RyLmNoYXJBdChwb3MpKSkgeyBwb3MgKz0gZGlyOyB9XG4gICAgcmV0dXJuIHBvc1xuICB9XG5cbiAgLy8gUmV0dXJucyB0aGUgdmFsdWUgZnJvbSB0aGUgcmFuZ2UgW2Bmcm9tYDsgYHRvYF0gdGhhdCBzYXRpc2ZpZXNcbiAgLy8gYHByZWRgIGFuZCBpcyBjbG9zZXN0IHRvIGBmcm9tYC4gQXNzdW1lcyB0aGF0IGF0IGxlYXN0IGB0b2BcbiAgLy8gc2F0aXNmaWVzIGBwcmVkYC4gU3VwcG9ydHMgYGZyb21gIGJlaW5nIGdyZWF0ZXIgdGhhbiBgdG9gLlxuICBmdW5jdGlvbiBmaW5kRmlyc3QocHJlZCwgZnJvbSwgdG8pIHtcbiAgICAvLyBBdCBhbnkgcG9pbnQgd2UgYXJlIGNlcnRhaW4gYHRvYCBzYXRpc2ZpZXMgYHByZWRgLCBkb24ndCBrbm93XG4gICAgLy8gd2hldGhlciBgZnJvbWAgZG9lcy5cbiAgICB2YXIgZGlyID0gZnJvbSA+IHRvID8gLTEgOiAxO1xuICAgIGZvciAoOzspIHtcbiAgICAgIGlmIChmcm9tID09IHRvKSB7IHJldHVybiBmcm9tIH1cbiAgICAgIHZhciBtaWRGID0gKGZyb20gKyB0bykgLyAyLCBtaWQgPSBkaXIgPCAwID8gTWF0aC5jZWlsKG1pZEYpIDogTWF0aC5mbG9vcihtaWRGKTtcbiAgICAgIGlmIChtaWQgPT0gZnJvbSkgeyByZXR1cm4gcHJlZChtaWQpID8gZnJvbSA6IHRvIH1cbiAgICAgIGlmIChwcmVkKG1pZCkpIHsgdG8gPSBtaWQ7IH1cbiAgICAgIGVsc2UgeyBmcm9tID0gbWlkICsgZGlyOyB9XG4gICAgfVxuICB9XG5cbiAgLy8gQklESSBIRUxQRVJTXG5cbiAgZnVuY3Rpb24gaXRlcmF0ZUJpZGlTZWN0aW9ucyhvcmRlciwgZnJvbSwgdG8sIGYpIHtcbiAgICBpZiAoIW9yZGVyKSB7IHJldHVybiBmKGZyb20sIHRvLCBcImx0clwiLCAwKSB9XG4gICAgdmFyIGZvdW5kID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcmRlci5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIHBhcnQgPSBvcmRlcltpXTtcbiAgICAgIGlmIChwYXJ0LmZyb20gPCB0byAmJiBwYXJ0LnRvID4gZnJvbSB8fCBmcm9tID09IHRvICYmIHBhcnQudG8gPT0gZnJvbSkge1xuICAgICAgICBmKE1hdGgubWF4KHBhcnQuZnJvbSwgZnJvbSksIE1hdGgubWluKHBhcnQudG8sIHRvKSwgcGFydC5sZXZlbCA9PSAxID8gXCJydGxcIiA6IFwibHRyXCIsIGkpO1xuICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghZm91bmQpIHsgZihmcm9tLCB0bywgXCJsdHJcIik7IH1cbiAgfVxuXG4gIHZhciBiaWRpT3RoZXIgPSBudWxsO1xuICBmdW5jdGlvbiBnZXRCaWRpUGFydEF0KG9yZGVyLCBjaCwgc3RpY2t5KSB7XG4gICAgdmFyIGZvdW5kO1xuICAgIGJpZGlPdGhlciA9IG51bGw7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcmRlci5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIGN1ciA9IG9yZGVyW2ldO1xuICAgICAgaWYgKGN1ci5mcm9tIDwgY2ggJiYgY3VyLnRvID4gY2gpIHsgcmV0dXJuIGkgfVxuICAgICAgaWYgKGN1ci50byA9PSBjaCkge1xuICAgICAgICBpZiAoY3VyLmZyb20gIT0gY3VyLnRvICYmIHN0aWNreSA9PSBcImJlZm9yZVwiKSB7IGZvdW5kID0gaTsgfVxuICAgICAgICBlbHNlIHsgYmlkaU90aGVyID0gaTsgfVxuICAgICAgfVxuICAgICAgaWYgKGN1ci5mcm9tID09IGNoKSB7XG4gICAgICAgIGlmIChjdXIuZnJvbSAhPSBjdXIudG8gJiYgc3RpY2t5ICE9IFwiYmVmb3JlXCIpIHsgZm91bmQgPSBpOyB9XG4gICAgICAgIGVsc2UgeyBiaWRpT3RoZXIgPSBpOyB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3VuZCAhPSBudWxsID8gZm91bmQgOiBiaWRpT3RoZXJcbiAgfVxuXG4gIC8vIEJpZGlyZWN0aW9uYWwgb3JkZXJpbmcgYWxnb3JpdGhtXG4gIC8vIFNlZSBodHRwOi8vdW5pY29kZS5vcmcvcmVwb3J0cy90cjkvdHI5LTEzLmh0bWwgZm9yIHRoZSBhbGdvcml0aG1cbiAgLy8gdGhhdCB0aGlzIChwYXJ0aWFsbHkpIGltcGxlbWVudHMuXG5cbiAgLy8gT25lLWNoYXIgY29kZXMgdXNlZCBmb3IgY2hhcmFjdGVyIHR5cGVzOlxuICAvLyBMIChMKTogICBMZWZ0LXRvLVJpZ2h0XG4gIC8vIFIgKFIpOiAgIFJpZ2h0LXRvLUxlZnRcbiAgLy8gciAoQUwpOiAgUmlnaHQtdG8tTGVmdCBBcmFiaWNcbiAgLy8gMSAoRU4pOiAgRXVyb3BlYW4gTnVtYmVyXG4gIC8vICsgKEVTKTogIEV1cm9wZWFuIE51bWJlciBTZXBhcmF0b3JcbiAgLy8gJSAoRVQpOiAgRXVyb3BlYW4gTnVtYmVyIFRlcm1pbmF0b3JcbiAgLy8gbiAoQU4pOiAgQXJhYmljIE51bWJlclxuICAvLyAsIChDUyk6ICBDb21tb24gTnVtYmVyIFNlcGFyYXRvclxuICAvLyBtIChOU00pOiBOb24tU3BhY2luZyBNYXJrXG4gIC8vIGIgKEJOKTogIEJvdW5kYXJ5IE5ldXRyYWxcbiAgLy8gcyAoQik6ICAgUGFyYWdyYXBoIFNlcGFyYXRvclxuICAvLyB0IChTKTogICBTZWdtZW50IFNlcGFyYXRvclxuICAvLyB3IChXUyk6ICBXaGl0ZXNwYWNlXG4gIC8vIE4gKE9OKTogIE90aGVyIE5ldXRyYWxzXG5cbiAgLy8gUmV0dXJucyBudWxsIGlmIGNoYXJhY3RlcnMgYXJlIG9yZGVyZWQgYXMgdGhleSBhcHBlYXJcbiAgLy8gKGxlZnQtdG8tcmlnaHQpLCBvciBhbiBhcnJheSBvZiBzZWN0aW9ucyAoe2Zyb20sIHRvLCBsZXZlbH1cbiAgLy8gb2JqZWN0cykgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgb2NjdXIgdmlzdWFsbHkuXG4gIHZhciBiaWRpT3JkZXJpbmcgPSAoZnVuY3Rpb24oKSB7XG4gICAgLy8gQ2hhcmFjdGVyIHR5cGVzIGZvciBjb2RlcG9pbnRzIDAgdG8gMHhmZlxuICAgIHZhciBsb3dUeXBlcyA9IFwiYmJiYmJiYmJidHN0d3NiYmJiYmJiYmJiYmJiYnNzc3R3Tk4lJSVOTk5OTk4sTixOMTExMTExMTExMU5OTk5OTk5MTExMTExMTExMTExMTExMTExMTExMTExMTE5OTk5OTkxMTExMTExMTExMTExMTExMTExMTExMTExMTk5OTmJiYmJiYnNiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYixOJSUlJU5OTk5MTk5OTk4lJTExTkxOTk4xTE5OTk5OTExMTExMTExMTExMTExMTExMTExMTExOTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTE5cIjtcbiAgICAvLyBDaGFyYWN0ZXIgdHlwZXMgZm9yIGNvZGVwb2ludHMgMHg2MDAgdG8gMHg2ZjlcbiAgICB2YXIgYXJhYmljVHlwZXMgPSBcIm5ubm5ubk5OciUlcixyTk5tbW1tbW1tbW1tbXJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycm1tbW1tbW1tbW1tbW1tbW1tbW1tbW5ubm5ubm5ubm4lbm5ycnJtcnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJtbW1tbW1tbk5tbW1tbW1ycm1tTm1tbW1ycjExMTExMTExMTFcIjtcbiAgICBmdW5jdGlvbiBjaGFyVHlwZShjb2RlKSB7XG4gICAgICBpZiAoY29kZSA8PSAweGY3KSB7IHJldHVybiBsb3dUeXBlcy5jaGFyQXQoY29kZSkgfVxuICAgICAgZWxzZSBpZiAoMHg1OTAgPD0gY29kZSAmJiBjb2RlIDw9IDB4NWY0KSB7IHJldHVybiBcIlJcIiB9XG4gICAgICBlbHNlIGlmICgweDYwMCA8PSBjb2RlICYmIGNvZGUgPD0gMHg2ZjkpIHsgcmV0dXJuIGFyYWJpY1R5cGVzLmNoYXJBdChjb2RlIC0gMHg2MDApIH1cbiAgICAgIGVsc2UgaWYgKDB4NmVlIDw9IGNvZGUgJiYgY29kZSA8PSAweDhhYykgeyByZXR1cm4gXCJyXCIgfVxuICAgICAgZWxzZSBpZiAoMHgyMDAwIDw9IGNvZGUgJiYgY29kZSA8PSAweDIwMGIpIHsgcmV0dXJuIFwid1wiIH1cbiAgICAgIGVsc2UgaWYgKGNvZGUgPT0gMHgyMDBjKSB7IHJldHVybiBcImJcIiB9XG4gICAgICBlbHNlIHsgcmV0dXJuIFwiTFwiIH1cbiAgICB9XG5cbiAgICB2YXIgYmlkaVJFID0gL1tcXHUwNTkwLVxcdTA1ZjRcXHUwNjAwLVxcdTA2ZmZcXHUwNzAwLVxcdTA4YWNdLztcbiAgICB2YXIgaXNOZXV0cmFsID0gL1tzdHdOXS8sIGlzU3Ryb25nID0gL1tMUnJdLywgY291bnRzQXNMZWZ0ID0gL1tMYjFuXS8sIGNvdW50c0FzTnVtID0gL1sxbl0vO1xuXG4gICAgZnVuY3Rpb24gQmlkaVNwYW4obGV2ZWwsIGZyb20sIHRvKSB7XG4gICAgICB0aGlzLmxldmVsID0gbGV2ZWw7XG4gICAgICB0aGlzLmZyb20gPSBmcm9tOyB0aGlzLnRvID0gdG87XG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uKHN0ciwgZGlyZWN0aW9uKSB7XG4gICAgICB2YXIgb3V0ZXJUeXBlID0gZGlyZWN0aW9uID09IFwibHRyXCIgPyBcIkxcIiA6IFwiUlwiO1xuXG4gICAgICBpZiAoc3RyLmxlbmd0aCA9PSAwIHx8IGRpcmVjdGlvbiA9PSBcImx0clwiICYmICFiaWRpUkUudGVzdChzdHIpKSB7IHJldHVybiBmYWxzZSB9XG4gICAgICB2YXIgbGVuID0gc3RyLmxlbmd0aCwgdHlwZXMgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpXG4gICAgICAgIHsgdHlwZXMucHVzaChjaGFyVHlwZShzdHIuY2hhckNvZGVBdChpKSkpOyB9XG5cbiAgICAgIC8vIFcxLiBFeGFtaW5lIGVhY2ggbm9uLXNwYWNpbmcgbWFyayAoTlNNKSBpbiB0aGUgbGV2ZWwgcnVuLCBhbmRcbiAgICAgIC8vIGNoYW5nZSB0aGUgdHlwZSBvZiB0aGUgTlNNIHRvIHRoZSB0eXBlIG9mIHRoZSBwcmV2aW91c1xuICAgICAgLy8gY2hhcmFjdGVyLiBJZiB0aGUgTlNNIGlzIGF0IHRoZSBzdGFydCBvZiB0aGUgbGV2ZWwgcnVuLCBpdCB3aWxsXG4gICAgICAvLyBnZXQgdGhlIHR5cGUgb2Ygc29yLlxuICAgICAgZm9yICh2YXIgaSQxID0gMCwgcHJldiA9IG91dGVyVHlwZTsgaSQxIDwgbGVuOyArK2kkMSkge1xuICAgICAgICB2YXIgdHlwZSA9IHR5cGVzW2kkMV07XG4gICAgICAgIGlmICh0eXBlID09IFwibVwiKSB7IHR5cGVzW2kkMV0gPSBwcmV2OyB9XG4gICAgICAgIGVsc2UgeyBwcmV2ID0gdHlwZTsgfVxuICAgICAgfVxuXG4gICAgICAvLyBXMi4gU2VhcmNoIGJhY2t3YXJkcyBmcm9tIGVhY2ggaW5zdGFuY2Ugb2YgYSBFdXJvcGVhbiBudW1iZXJcbiAgICAgIC8vIHVudGlsIHRoZSBmaXJzdCBzdHJvbmcgdHlwZSAoUiwgTCwgQUwsIG9yIHNvcikgaXMgZm91bmQuIElmIGFuXG4gICAgICAvLyBBTCBpcyBmb3VuZCwgY2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBFdXJvcGVhbiBudW1iZXIgdG8gQXJhYmljXG4gICAgICAvLyBudW1iZXIuXG4gICAgICAvLyBXMy4gQ2hhbmdlIGFsbCBBTHMgdG8gUi5cbiAgICAgIGZvciAodmFyIGkkMiA9IDAsIGN1ciA9IG91dGVyVHlwZTsgaSQyIDwgbGVuOyArK2kkMikge1xuICAgICAgICB2YXIgdHlwZSQxID0gdHlwZXNbaSQyXTtcbiAgICAgICAgaWYgKHR5cGUkMSA9PSBcIjFcIiAmJiBjdXIgPT0gXCJyXCIpIHsgdHlwZXNbaSQyXSA9IFwiblwiOyB9XG4gICAgICAgIGVsc2UgaWYgKGlzU3Ryb25nLnRlc3QodHlwZSQxKSkgeyBjdXIgPSB0eXBlJDE7IGlmICh0eXBlJDEgPT0gXCJyXCIpIHsgdHlwZXNbaSQyXSA9IFwiUlwiOyB9IH1cbiAgICAgIH1cblxuICAgICAgLy8gVzQuIEEgc2luZ2xlIEV1cm9wZWFuIHNlcGFyYXRvciBiZXR3ZWVuIHR3byBFdXJvcGVhbiBudW1iZXJzXG4gICAgICAvLyBjaGFuZ2VzIHRvIGEgRXVyb3BlYW4gbnVtYmVyLiBBIHNpbmdsZSBjb21tb24gc2VwYXJhdG9yIGJldHdlZW5cbiAgICAgIC8vIHR3byBudW1iZXJzIG9mIHRoZSBzYW1lIHR5cGUgY2hhbmdlcyB0byB0aGF0IHR5cGUuXG4gICAgICBmb3IgKHZhciBpJDMgPSAxLCBwcmV2JDEgPSB0eXBlc1swXTsgaSQzIDwgbGVuIC0gMTsgKytpJDMpIHtcbiAgICAgICAgdmFyIHR5cGUkMiA9IHR5cGVzW2kkM107XG4gICAgICAgIGlmICh0eXBlJDIgPT0gXCIrXCIgJiYgcHJldiQxID09IFwiMVwiICYmIHR5cGVzW2kkMysxXSA9PSBcIjFcIikgeyB0eXBlc1tpJDNdID0gXCIxXCI7IH1cbiAgICAgICAgZWxzZSBpZiAodHlwZSQyID09IFwiLFwiICYmIHByZXYkMSA9PSB0eXBlc1tpJDMrMV0gJiZcbiAgICAgICAgICAgICAgICAgKHByZXYkMSA9PSBcIjFcIiB8fCBwcmV2JDEgPT0gXCJuXCIpKSB7IHR5cGVzW2kkM10gPSBwcmV2JDE7IH1cbiAgICAgICAgcHJldiQxID0gdHlwZSQyO1xuICAgICAgfVxuXG4gICAgICAvLyBXNS4gQSBzZXF1ZW5jZSBvZiBFdXJvcGVhbiB0ZXJtaW5hdG9ycyBhZGphY2VudCB0byBFdXJvcGVhblxuICAgICAgLy8gbnVtYmVycyBjaGFuZ2VzIHRvIGFsbCBFdXJvcGVhbiBudW1iZXJzLlxuICAgICAgLy8gVzYuIE90aGVyd2lzZSwgc2VwYXJhdG9ycyBhbmQgdGVybWluYXRvcnMgY2hhbmdlIHRvIE90aGVyXG4gICAgICAvLyBOZXV0cmFsLlxuICAgICAgZm9yICh2YXIgaSQ0ID0gMDsgaSQ0IDwgbGVuOyArK2kkNCkge1xuICAgICAgICB2YXIgdHlwZSQzID0gdHlwZXNbaSQ0XTtcbiAgICAgICAgaWYgKHR5cGUkMyA9PSBcIixcIikgeyB0eXBlc1tpJDRdID0gXCJOXCI7IH1cbiAgICAgICAgZWxzZSBpZiAodHlwZSQzID09IFwiJVwiKSB7XG4gICAgICAgICAgdmFyIGVuZCA9ICh2b2lkIDApO1xuICAgICAgICAgIGZvciAoZW5kID0gaSQ0ICsgMTsgZW5kIDwgbGVuICYmIHR5cGVzW2VuZF0gPT0gXCIlXCI7ICsrZW5kKSB7fVxuICAgICAgICAgIHZhciByZXBsYWNlID0gKGkkNCAmJiB0eXBlc1tpJDQtMV0gPT0gXCIhXCIpIHx8IChlbmQgPCBsZW4gJiYgdHlwZXNbZW5kXSA9PSBcIjFcIikgPyBcIjFcIiA6IFwiTlwiO1xuICAgICAgICAgIGZvciAodmFyIGogPSBpJDQ7IGogPCBlbmQ7ICsraikgeyB0eXBlc1tqXSA9IHJlcGxhY2U7IH1cbiAgICAgICAgICBpJDQgPSBlbmQgLSAxO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFc3LiBTZWFyY2ggYmFja3dhcmRzIGZyb20gZWFjaCBpbnN0YW5jZSBvZiBhIEV1cm9wZWFuIG51bWJlclxuICAgICAgLy8gdW50aWwgdGhlIGZpcnN0IHN0cm9uZyB0eXBlIChSLCBMLCBvciBzb3IpIGlzIGZvdW5kLiBJZiBhbiBMIGlzXG4gICAgICAvLyBmb3VuZCwgdGhlbiBjaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIEV1cm9wZWFuIG51bWJlciB0byBMLlxuICAgICAgZm9yICh2YXIgaSQ1ID0gMCwgY3VyJDEgPSBvdXRlclR5cGU7IGkkNSA8IGxlbjsgKytpJDUpIHtcbiAgICAgICAgdmFyIHR5cGUkNCA9IHR5cGVzW2kkNV07XG4gICAgICAgIGlmIChjdXIkMSA9PSBcIkxcIiAmJiB0eXBlJDQgPT0gXCIxXCIpIHsgdHlwZXNbaSQ1XSA9IFwiTFwiOyB9XG4gICAgICAgIGVsc2UgaWYgKGlzU3Ryb25nLnRlc3QodHlwZSQ0KSkgeyBjdXIkMSA9IHR5cGUkNDsgfVxuICAgICAgfVxuXG4gICAgICAvLyBOMS4gQSBzZXF1ZW5jZSBvZiBuZXV0cmFscyB0YWtlcyB0aGUgZGlyZWN0aW9uIG9mIHRoZVxuICAgICAgLy8gc3Vycm91bmRpbmcgc3Ryb25nIHRleHQgaWYgdGhlIHRleHQgb24gYm90aCBzaWRlcyBoYXMgdGhlIHNhbWVcbiAgICAgIC8vIGRpcmVjdGlvbi4gRXVyb3BlYW4gYW5kIEFyYWJpYyBudW1iZXJzIGFjdCBhcyBpZiB0aGV5IHdlcmUgUiBpblxuICAgICAgLy8gdGVybXMgb2YgdGhlaXIgaW5mbHVlbmNlIG9uIG5ldXRyYWxzLiBTdGFydC1vZi1sZXZlbC1ydW4gKHNvcilcbiAgICAgIC8vIGFuZCBlbmQtb2YtbGV2ZWwtcnVuIChlb3IpIGFyZSB1c2VkIGF0IGxldmVsIHJ1biBib3VuZGFyaWVzLlxuICAgICAgLy8gTjIuIEFueSByZW1haW5pbmcgbmV1dHJhbHMgdGFrZSB0aGUgZW1iZWRkaW5nIGRpcmVjdGlvbi5cbiAgICAgIGZvciAodmFyIGkkNiA9IDA7IGkkNiA8IGxlbjsgKytpJDYpIHtcbiAgICAgICAgaWYgKGlzTmV1dHJhbC50ZXN0KHR5cGVzW2kkNl0pKSB7XG4gICAgICAgICAgdmFyIGVuZCQxID0gKHZvaWQgMCk7XG4gICAgICAgICAgZm9yIChlbmQkMSA9IGkkNiArIDE7IGVuZCQxIDwgbGVuICYmIGlzTmV1dHJhbC50ZXN0KHR5cGVzW2VuZCQxXSk7ICsrZW5kJDEpIHt9XG4gICAgICAgICAgdmFyIGJlZm9yZSA9IChpJDYgPyB0eXBlc1tpJDYtMV0gOiBvdXRlclR5cGUpID09IFwiTFwiO1xuICAgICAgICAgIHZhciBhZnRlciA9IChlbmQkMSA8IGxlbiA/IHR5cGVzW2VuZCQxXSA6IG91dGVyVHlwZSkgPT0gXCJMXCI7XG4gICAgICAgICAgdmFyIHJlcGxhY2UkMSA9IGJlZm9yZSA9PSBhZnRlciA/IChiZWZvcmUgPyBcIkxcIiA6IFwiUlwiKSA6IG91dGVyVHlwZTtcbiAgICAgICAgICBmb3IgKHZhciBqJDEgPSBpJDY7IGokMSA8IGVuZCQxOyArK2okMSkgeyB0eXBlc1tqJDFdID0gcmVwbGFjZSQxOyB9XG4gICAgICAgICAgaSQ2ID0gZW5kJDEgLSAxO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEhlcmUgd2UgZGVwYXJ0IGZyb20gdGhlIGRvY3VtZW50ZWQgYWxnb3JpdGhtLCBpbiBvcmRlciB0byBhdm9pZFxuICAgICAgLy8gYnVpbGRpbmcgdXAgYW4gYWN0dWFsIGxldmVscyBhcnJheS4gU2luY2UgdGhlcmUgYXJlIG9ubHkgdGhyZWVcbiAgICAgIC8vIGxldmVscyAoMCwgMSwgMikgaW4gYW4gaW1wbGVtZW50YXRpb24gdGhhdCBkb2Vzbid0IHRha2VcbiAgICAgIC8vIGV4cGxpY2l0IGVtYmVkZGluZyBpbnRvIGFjY291bnQsIHdlIGNhbiBidWlsZCB1cCB0aGUgb3JkZXIgb25cbiAgICAgIC8vIHRoZSBmbHksIHdpdGhvdXQgZm9sbG93aW5nIHRoZSBsZXZlbC1iYXNlZCBhbGdvcml0aG0uXG4gICAgICB2YXIgb3JkZXIgPSBbXSwgbTtcbiAgICAgIGZvciAodmFyIGkkNyA9IDA7IGkkNyA8IGxlbjspIHtcbiAgICAgICAgaWYgKGNvdW50c0FzTGVmdC50ZXN0KHR5cGVzW2kkN10pKSB7XG4gICAgICAgICAgdmFyIHN0YXJ0ID0gaSQ3O1xuICAgICAgICAgIGZvciAoKytpJDc7IGkkNyA8IGxlbiAmJiBjb3VudHNBc0xlZnQudGVzdCh0eXBlc1tpJDddKTsgKytpJDcpIHt9XG4gICAgICAgICAgb3JkZXIucHVzaChuZXcgQmlkaVNwYW4oMCwgc3RhcnQsIGkkNykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBwb3MgPSBpJDcsIGF0ID0gb3JkZXIubGVuZ3RoLCBpc1JUTCA9IGRpcmVjdGlvbiA9PSBcInJ0bFwiID8gMSA6IDA7XG4gICAgICAgICAgZm9yICgrK2kkNzsgaSQ3IDwgbGVuICYmIHR5cGVzW2kkN10gIT0gXCJMXCI7ICsraSQ3KSB7fVxuICAgICAgICAgIGZvciAodmFyIGokMiA9IHBvczsgaiQyIDwgaSQ3Oykge1xuICAgICAgICAgICAgaWYgKGNvdW50c0FzTnVtLnRlc3QodHlwZXNbaiQyXSkpIHtcbiAgICAgICAgICAgICAgaWYgKHBvcyA8IGokMikgeyBvcmRlci5zcGxpY2UoYXQsIDAsIG5ldyBCaWRpU3BhbigxLCBwb3MsIGokMikpOyBhdCArPSBpc1JUTDsgfVxuICAgICAgICAgICAgICB2YXIgbnN0YXJ0ID0gaiQyO1xuICAgICAgICAgICAgICBmb3IgKCsraiQyOyBqJDIgPCBpJDcgJiYgY291bnRzQXNOdW0udGVzdCh0eXBlc1tqJDJdKTsgKytqJDIpIHt9XG4gICAgICAgICAgICAgIG9yZGVyLnNwbGljZShhdCwgMCwgbmV3IEJpZGlTcGFuKDIsIG5zdGFydCwgaiQyKSk7XG4gICAgICAgICAgICAgIGF0ICs9IGlzUlRMO1xuICAgICAgICAgICAgICBwb3MgPSBqJDI7XG4gICAgICAgICAgICB9IGVsc2UgeyArK2okMjsgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocG9zIDwgaSQ3KSB7IG9yZGVyLnNwbGljZShhdCwgMCwgbmV3IEJpZGlTcGFuKDEsIHBvcywgaSQ3KSk7IH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRpcmVjdGlvbiA9PSBcImx0clwiKSB7XG4gICAgICAgIGlmIChvcmRlclswXS5sZXZlbCA9PSAxICYmIChtID0gc3RyLm1hdGNoKC9eXFxzKy8pKSkge1xuICAgICAgICAgIG9yZGVyWzBdLmZyb20gPSBtWzBdLmxlbmd0aDtcbiAgICAgICAgICBvcmRlci51bnNoaWZ0KG5ldyBCaWRpU3BhbigwLCAwLCBtWzBdLmxlbmd0aCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsc3Qob3JkZXIpLmxldmVsID09IDEgJiYgKG0gPSBzdHIubWF0Y2goL1xccyskLykpKSB7XG4gICAgICAgICAgbHN0KG9yZGVyKS50byAtPSBtWzBdLmxlbmd0aDtcbiAgICAgICAgICBvcmRlci5wdXNoKG5ldyBCaWRpU3BhbigwLCBsZW4gLSBtWzBdLmxlbmd0aCwgbGVuKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRpcmVjdGlvbiA9PSBcInJ0bFwiID8gb3JkZXIucmV2ZXJzZSgpIDogb3JkZXJcbiAgICB9XG4gIH0pKCk7XG5cbiAgLy8gR2V0IHRoZSBiaWRpIG9yZGVyaW5nIGZvciB0aGUgZ2l2ZW4gbGluZSAoYW5kIGNhY2hlIGl0KS4gUmV0dXJuc1xuICAvLyBmYWxzZSBmb3IgbGluZXMgdGhhdCBhcmUgZnVsbHkgbGVmdC10by1yaWdodCwgYW5kIGFuIGFycmF5IG9mXG4gIC8vIEJpZGlTcGFuIG9iamVjdHMgb3RoZXJ3aXNlLlxuICBmdW5jdGlvbiBnZXRPcmRlcihsaW5lLCBkaXJlY3Rpb24pIHtcbiAgICB2YXIgb3JkZXIgPSBsaW5lLm9yZGVyO1xuICAgIGlmIChvcmRlciA9PSBudWxsKSB7IG9yZGVyID0gbGluZS5vcmRlciA9IGJpZGlPcmRlcmluZyhsaW5lLnRleHQsIGRpcmVjdGlvbik7IH1cbiAgICByZXR1cm4gb3JkZXJcbiAgfVxuXG4gIC8vIEVWRU5UIEhBTkRMSU5HXG5cbiAgLy8gTGlnaHR3ZWlnaHQgZXZlbnQgZnJhbWV3b3JrLiBvbi9vZmYgYWxzbyB3b3JrIG9uIERPTSBub2RlcyxcbiAgLy8gcmVnaXN0ZXJpbmcgbmF0aXZlIERPTSBoYW5kbGVycy5cblxuICB2YXIgbm9IYW5kbGVycyA9IFtdO1xuXG4gIHZhciBvbiA9IGZ1bmN0aW9uKGVtaXR0ZXIsIHR5cGUsIGYpIHtcbiAgICBpZiAoZW1pdHRlci5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICBlbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgZiwgZmFsc2UpO1xuICAgIH0gZWxzZSBpZiAoZW1pdHRlci5hdHRhY2hFdmVudCkge1xuICAgICAgZW1pdHRlci5hdHRhY2hFdmVudChcIm9uXCIgKyB0eXBlLCBmKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIG1hcCA9IGVtaXR0ZXIuX2hhbmRsZXJzIHx8IChlbWl0dGVyLl9oYW5kbGVycyA9IHt9KTtcbiAgICAgIG1hcFt0eXBlXSA9IChtYXBbdHlwZV0gfHwgbm9IYW5kbGVycykuY29uY2F0KGYpO1xuICAgIH1cbiAgfTtcblxuICBmdW5jdGlvbiBnZXRIYW5kbGVycyhlbWl0dGVyLCB0eXBlKSB7XG4gICAgcmV0dXJuIGVtaXR0ZXIuX2hhbmRsZXJzICYmIGVtaXR0ZXIuX2hhbmRsZXJzW3R5cGVdIHx8IG5vSGFuZGxlcnNcbiAgfVxuXG4gIGZ1bmN0aW9uIG9mZihlbWl0dGVyLCB0eXBlLCBmKSB7XG4gICAgaWYgKGVtaXR0ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcikge1xuICAgICAgZW1pdHRlci5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGYsIGZhbHNlKTtcbiAgICB9IGVsc2UgaWYgKGVtaXR0ZXIuZGV0YWNoRXZlbnQpIHtcbiAgICAgIGVtaXR0ZXIuZGV0YWNoRXZlbnQoXCJvblwiICsgdHlwZSwgZik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBtYXAgPSBlbWl0dGVyLl9oYW5kbGVycywgYXJyID0gbWFwICYmIG1hcFt0eXBlXTtcbiAgICAgIGlmIChhcnIpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gaW5kZXhPZihhcnIsIGYpO1xuICAgICAgICBpZiAoaW5kZXggPiAtMSlcbiAgICAgICAgICB7IG1hcFt0eXBlXSA9IGFyci5zbGljZSgwLCBpbmRleCkuY29uY2F0KGFyci5zbGljZShpbmRleCArIDEpKTsgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNpZ25hbChlbWl0dGVyLCB0eXBlIC8qLCB2YWx1ZXMuLi4qLykge1xuICAgIHZhciBoYW5kbGVycyA9IGdldEhhbmRsZXJzKGVtaXR0ZXIsIHR5cGUpO1xuICAgIGlmICghaGFuZGxlcnMubGVuZ3RoKSB7IHJldHVybiB9XG4gICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGFuZGxlcnMubGVuZ3RoOyArK2kpIHsgaGFuZGxlcnNbaV0uYXBwbHkobnVsbCwgYXJncyk7IH1cbiAgfVxuXG4gIC8vIFRoZSBET00gZXZlbnRzIHRoYXQgQ29kZU1pcnJvciBoYW5kbGVzIGNhbiBiZSBvdmVycmlkZGVuIGJ5XG4gIC8vIHJlZ2lzdGVyaW5nIGEgKG5vbi1ET00pIGhhbmRsZXIgb24gdGhlIGVkaXRvciBmb3IgdGhlIGV2ZW50IG5hbWUsXG4gIC8vIGFuZCBwcmV2ZW50RGVmYXVsdC1pbmcgdGhlIGV2ZW50IGluIHRoYXQgaGFuZGxlci5cbiAgZnVuY3Rpb24gc2lnbmFsRE9NRXZlbnQoY20sIGUsIG92ZXJyaWRlKSB7XG4gICAgaWYgKHR5cGVvZiBlID09IFwic3RyaW5nXCIpXG4gICAgICB7IGUgPSB7dHlwZTogZSwgcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCkgeyB0aGlzLmRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlOyB9fTsgfVxuICAgIHNpZ25hbChjbSwgb3ZlcnJpZGUgfHwgZS50eXBlLCBjbSwgZSk7XG4gICAgcmV0dXJuIGVfZGVmYXVsdFByZXZlbnRlZChlKSB8fCBlLmNvZGVtaXJyb3JJZ25vcmVcbiAgfVxuXG4gIGZ1bmN0aW9uIHNpZ25hbEN1cnNvckFjdGl2aXR5KGNtKSB7XG4gICAgdmFyIGFyciA9IGNtLl9oYW5kbGVycyAmJiBjbS5faGFuZGxlcnMuY3Vyc29yQWN0aXZpdHk7XG4gICAgaWYgKCFhcnIpIHsgcmV0dXJuIH1cbiAgICB2YXIgc2V0ID0gY20uY3VyT3AuY3Vyc29yQWN0aXZpdHlIYW5kbGVycyB8fCAoY20uY3VyT3AuY3Vyc29yQWN0aXZpdHlIYW5kbGVycyA9IFtdKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7ICsraSkgeyBpZiAoaW5kZXhPZihzZXQsIGFycltpXSkgPT0gLTEpXG4gICAgICB7IHNldC5wdXNoKGFycltpXSk7IH0gfVxuICB9XG5cbiAgZnVuY3Rpb24gaGFzSGFuZGxlcihlbWl0dGVyLCB0eXBlKSB7XG4gICAgcmV0dXJuIGdldEhhbmRsZXJzKGVtaXR0ZXIsIHR5cGUpLmxlbmd0aCA+IDBcbiAgfVxuXG4gIC8vIEFkZCBvbiBhbmQgb2ZmIG1ldGhvZHMgdG8gYSBjb25zdHJ1Y3RvcidzIHByb3RvdHlwZSwgdG8gbWFrZVxuICAvLyByZWdpc3RlcmluZyBldmVudHMgb24gc3VjaCBvYmplY3RzIG1vcmUgY29udmVuaWVudC5cbiAgZnVuY3Rpb24gZXZlbnRNaXhpbihjdG9yKSB7XG4gICAgY3Rvci5wcm90b3R5cGUub24gPSBmdW5jdGlvbih0eXBlLCBmKSB7b24odGhpcywgdHlwZSwgZik7fTtcbiAgICBjdG9yLnByb3RvdHlwZS5vZmYgPSBmdW5jdGlvbih0eXBlLCBmKSB7b2ZmKHRoaXMsIHR5cGUsIGYpO307XG4gIH1cblxuICAvLyBEdWUgdG8gdGhlIGZhY3QgdGhhdCB3ZSBzdGlsbCBzdXBwb3J0IGp1cmFzc2ljIElFIHZlcnNpb25zLCBzb21lXG4gIC8vIGNvbXBhdGliaWxpdHkgd3JhcHBlcnMgYXJlIG5lZWRlZC5cblxuICBmdW5jdGlvbiBlX3ByZXZlbnREZWZhdWx0KGUpIHtcbiAgICBpZiAoZS5wcmV2ZW50RGVmYXVsdCkgeyBlLnByZXZlbnREZWZhdWx0KCk7IH1cbiAgICBlbHNlIHsgZS5yZXR1cm5WYWx1ZSA9IGZhbHNlOyB9XG4gIH1cbiAgZnVuY3Rpb24gZV9zdG9wUHJvcGFnYXRpb24oZSkge1xuICAgIGlmIChlLnN0b3BQcm9wYWdhdGlvbikgeyBlLnN0b3BQcm9wYWdhdGlvbigpOyB9XG4gICAgZWxzZSB7IGUuY2FuY2VsQnViYmxlID0gdHJ1ZTsgfVxuICB9XG4gIGZ1bmN0aW9uIGVfZGVmYXVsdFByZXZlbnRlZChlKSB7XG4gICAgcmV0dXJuIGUuZGVmYXVsdFByZXZlbnRlZCAhPSBudWxsID8gZS5kZWZhdWx0UHJldmVudGVkIDogZS5yZXR1cm5WYWx1ZSA9PSBmYWxzZVxuICB9XG4gIGZ1bmN0aW9uIGVfc3RvcChlKSB7ZV9wcmV2ZW50RGVmYXVsdChlKTsgZV9zdG9wUHJvcGFnYXRpb24oZSk7fVxuXG4gIGZ1bmN0aW9uIGVfdGFyZ2V0KGUpIHtyZXR1cm4gZS50YXJnZXQgfHwgZS5zcmNFbGVtZW50fVxuICBmdW5jdGlvbiBlX2J1dHRvbihlKSB7XG4gICAgdmFyIGIgPSBlLndoaWNoO1xuICAgIGlmIChiID09IG51bGwpIHtcbiAgICAgIGlmIChlLmJ1dHRvbiAmIDEpIHsgYiA9IDE7IH1cbiAgICAgIGVsc2UgaWYgKGUuYnV0dG9uICYgMikgeyBiID0gMzsgfVxuICAgICAgZWxzZSBpZiAoZS5idXR0b24gJiA0KSB7IGIgPSAyOyB9XG4gICAgfVxuICAgIGlmIChtYWMgJiYgZS5jdHJsS2V5ICYmIGIgPT0gMSkgeyBiID0gMzsgfVxuICAgIHJldHVybiBiXG4gIH1cblxuICAvLyBEZXRlY3QgZHJhZy1hbmQtZHJvcFxuICB2YXIgZHJhZ0FuZERyb3AgPSBmdW5jdGlvbigpIHtcbiAgICAvLyBUaGVyZSBpcyAqc29tZSoga2luZCBvZiBkcmFnLWFuZC1kcm9wIHN1cHBvcnQgaW4gSUU2LTgsIGJ1dCBJXG4gICAgLy8gY291bGRuJ3QgZ2V0IGl0IHRvIHdvcmsgeWV0LlxuICAgIGlmIChpZSAmJiBpZV92ZXJzaW9uIDwgOSkgeyByZXR1cm4gZmFsc2UgfVxuICAgIHZhciBkaXYgPSBlbHQoJ2RpdicpO1xuICAgIHJldHVybiBcImRyYWdnYWJsZVwiIGluIGRpdiB8fCBcImRyYWdEcm9wXCIgaW4gZGl2XG4gIH0oKTtcblxuICB2YXIgendzcFN1cHBvcnRlZDtcbiAgZnVuY3Rpb24gemVyb1dpZHRoRWxlbWVudChtZWFzdXJlKSB7XG4gICAgaWYgKHp3c3BTdXBwb3J0ZWQgPT0gbnVsbCkge1xuICAgICAgdmFyIHRlc3QgPSBlbHQoXCJzcGFuXCIsIFwiXFx1MjAwYlwiKTtcbiAgICAgIHJlbW92ZUNoaWxkcmVuQW5kQWRkKG1lYXN1cmUsIGVsdChcInNwYW5cIiwgW3Rlc3QsIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwieFwiKV0pKTtcbiAgICAgIGlmIChtZWFzdXJlLmZpcnN0Q2hpbGQub2Zmc2V0SGVpZ2h0ICE9IDApXG4gICAgICAgIHsgendzcFN1cHBvcnRlZCA9IHRlc3Qub2Zmc2V0V2lkdGggPD0gMSAmJiB0ZXN0Lm9mZnNldEhlaWdodCA+IDIgJiYgIShpZSAmJiBpZV92ZXJzaW9uIDwgOCk7IH1cbiAgICB9XG4gICAgdmFyIG5vZGUgPSB6d3NwU3VwcG9ydGVkID8gZWx0KFwic3BhblwiLCBcIlxcdTIwMGJcIikgOlxuICAgICAgZWx0KFwic3BhblwiLCBcIlxcdTAwYTBcIiwgbnVsbCwgXCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdpZHRoOiAxcHg7IG1hcmdpbi1yaWdodDogLTFweFwiKTtcbiAgICBub2RlLnNldEF0dHJpYnV0ZShcImNtLXRleHRcIiwgXCJcIik7XG4gICAgcmV0dXJuIG5vZGVcbiAgfVxuXG4gIC8vIEZlYXR1cmUtZGV0ZWN0IElFJ3MgY3J1bW15IGNsaWVudCByZWN0IHJlcG9ydGluZyBmb3IgYmlkaSB0ZXh0XG4gIHZhciBiYWRCaWRpUmVjdHM7XG4gIGZ1bmN0aW9uIGhhc0JhZEJpZGlSZWN0cyhtZWFzdXJlKSB7XG4gICAgaWYgKGJhZEJpZGlSZWN0cyAhPSBudWxsKSB7IHJldHVybiBiYWRCaWRpUmVjdHMgfVxuICAgIHZhciB0eHQgPSByZW1vdmVDaGlsZHJlbkFuZEFkZChtZWFzdXJlLCBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIkFcXHUwNjJlQVwiKSk7XG4gICAgdmFyIHIwID0gcmFuZ2UodHh0LCAwLCAxKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB2YXIgcjEgPSByYW5nZSh0eHQsIDEsIDIpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHJlbW92ZUNoaWxkcmVuKG1lYXN1cmUpO1xuICAgIGlmICghcjAgfHwgcjAubGVmdCA9PSByMC5yaWdodCkgeyByZXR1cm4gZmFsc2UgfSAvLyBTYWZhcmkgcmV0dXJucyBudWxsIGluIHNvbWUgY2FzZXMgKCMyNzgwKVxuICAgIHJldHVybiBiYWRCaWRpUmVjdHMgPSAocjEucmlnaHQgLSByMC5yaWdodCA8IDMpXG4gIH1cblxuICAvLyBTZWUgaWYgXCJcIi5zcGxpdCBpcyB0aGUgYnJva2VuIElFIHZlcnNpb24sIGlmIHNvLCBwcm92aWRlIGFuXG4gIC8vIGFsdGVybmF0aXZlIHdheSB0byBzcGxpdCBsaW5lcy5cbiAgdmFyIHNwbGl0TGluZXNBdXRvID0gXCJcXG5cXG5iXCIuc3BsaXQoL1xcbi8pLmxlbmd0aCAhPSAzID8gZnVuY3Rpb24gKHN0cmluZykge1xuICAgIHZhciBwb3MgPSAwLCByZXN1bHQgPSBbXSwgbCA9IHN0cmluZy5sZW5ndGg7XG4gICAgd2hpbGUgKHBvcyA8PSBsKSB7XG4gICAgICB2YXIgbmwgPSBzdHJpbmcuaW5kZXhPZihcIlxcblwiLCBwb3MpO1xuICAgICAgaWYgKG5sID09IC0xKSB7IG5sID0gc3RyaW5nLmxlbmd0aDsgfVxuICAgICAgdmFyIGxpbmUgPSBzdHJpbmcuc2xpY2UocG9zLCBzdHJpbmcuY2hhckF0KG5sIC0gMSkgPT0gXCJcXHJcIiA/IG5sIC0gMSA6IG5sKTtcbiAgICAgIHZhciBydCA9IGxpbmUuaW5kZXhPZihcIlxcclwiKTtcbiAgICAgIGlmIChydCAhPSAtMSkge1xuICAgICAgICByZXN1bHQucHVzaChsaW5lLnNsaWNlKDAsIHJ0KSk7XG4gICAgICAgIHBvcyArPSBydCArIDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQucHVzaChsaW5lKTtcbiAgICAgICAgcG9zID0gbmwgKyAxO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH0gOiBmdW5jdGlvbiAoc3RyaW5nKSB7IHJldHVybiBzdHJpbmcuc3BsaXQoL1xcclxcbj98XFxuLyk7IH07XG5cbiAgdmFyIGhhc1NlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24gPyBmdW5jdGlvbiAodGUpIHtcbiAgICB0cnkgeyByZXR1cm4gdGUuc2VsZWN0aW9uU3RhcnQgIT0gdGUuc2VsZWN0aW9uRW5kIH1cbiAgICBjYXRjaChlKSB7IHJldHVybiBmYWxzZSB9XG4gIH0gOiBmdW5jdGlvbiAodGUpIHtcbiAgICB2YXIgcmFuZ2U7XG4gICAgdHJ5IHtyYW5nZSA9IHRlLm93bmVyRG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7fVxuICAgIGNhdGNoKGUpIHt9XG4gICAgaWYgKCFyYW5nZSB8fCByYW5nZS5wYXJlbnRFbGVtZW50KCkgIT0gdGUpIHsgcmV0dXJuIGZhbHNlIH1cbiAgICByZXR1cm4gcmFuZ2UuY29tcGFyZUVuZFBvaW50cyhcIlN0YXJ0VG9FbmRcIiwgcmFuZ2UpICE9IDBcbiAgfTtcblxuICB2YXIgaGFzQ29weUV2ZW50ID0gKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZSA9IGVsdChcImRpdlwiKTtcbiAgICBpZiAoXCJvbmNvcHlcIiBpbiBlKSB7IHJldHVybiB0cnVlIH1cbiAgICBlLnNldEF0dHJpYnV0ZShcIm9uY29weVwiLCBcInJldHVybjtcIik7XG4gICAgcmV0dXJuIHR5cGVvZiBlLm9uY29weSA9PSBcImZ1bmN0aW9uXCJcbiAgfSkoKTtcblxuICB2YXIgYmFkWm9vbWVkUmVjdHMgPSBudWxsO1xuICBmdW5jdGlvbiBoYXNCYWRab29tZWRSZWN0cyhtZWFzdXJlKSB7XG4gICAgaWYgKGJhZFpvb21lZFJlY3RzICE9IG51bGwpIHsgcmV0dXJuIGJhZFpvb21lZFJlY3RzIH1cbiAgICB2YXIgbm9kZSA9IHJlbW92ZUNoaWxkcmVuQW5kQWRkKG1lYXN1cmUsIGVsdChcInNwYW5cIiwgXCJ4XCIpKTtcbiAgICB2YXIgbm9ybWFsID0gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB2YXIgZnJvbVJhbmdlID0gcmFuZ2Uobm9kZSwgMCwgMSkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgcmV0dXJuIGJhZFpvb21lZFJlY3RzID0gTWF0aC5hYnMobm9ybWFsLmxlZnQgLSBmcm9tUmFuZ2UubGVmdCkgPiAxXG4gIH1cblxuICAvLyBLbm93biBtb2RlcywgYnkgbmFtZSBhbmQgYnkgTUlNRVxuICB2YXIgbW9kZXMgPSB7fSwgbWltZU1vZGVzID0ge307XG5cbiAgLy8gRXh0cmEgYXJndW1lbnRzIGFyZSBzdG9yZWQgYXMgdGhlIG1vZGUncyBkZXBlbmRlbmNpZXMsIHdoaWNoIGlzXG4gIC8vIHVzZWQgYnkgKGxlZ2FjeSkgbWVjaGFuaXNtcyBsaWtlIGxvYWRtb2RlLmpzIHRvIGF1dG9tYXRpY2FsbHlcbiAgLy8gbG9hZCBhIG1vZGUuIChQcmVmZXJyZWQgbWVjaGFuaXNtIGlzIHRoZSByZXF1aXJlL2RlZmluZSBjYWxscy4pXG4gIGZ1bmN0aW9uIGRlZmluZU1vZGUobmFtZSwgbW9kZSkge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMilcbiAgICAgIHsgbW9kZS5kZXBlbmRlbmNpZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpOyB9XG4gICAgbW9kZXNbbmFtZV0gPSBtb2RlO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVmaW5lTUlNRShtaW1lLCBzcGVjKSB7XG4gICAgbWltZU1vZGVzW21pbWVdID0gc3BlYztcbiAgfVxuXG4gIC8vIEdpdmVuIGEgTUlNRSB0eXBlLCBhIHtuYW1lLCAuLi5vcHRpb25zfSBjb25maWcgb2JqZWN0LCBvciBhIG5hbWVcbiAgLy8gc3RyaW5nLCByZXR1cm4gYSBtb2RlIGNvbmZpZyBvYmplY3QuXG4gIGZ1bmN0aW9uIHJlc29sdmVNb2RlKHNwZWMpIHtcbiAgICBpZiAodHlwZW9mIHNwZWMgPT0gXCJzdHJpbmdcIiAmJiBtaW1lTW9kZXMuaGFzT3duUHJvcGVydHkoc3BlYykpIHtcbiAgICAgIHNwZWMgPSBtaW1lTW9kZXNbc3BlY107XG4gICAgfSBlbHNlIGlmIChzcGVjICYmIHR5cGVvZiBzcGVjLm5hbWUgPT0gXCJzdHJpbmdcIiAmJiBtaW1lTW9kZXMuaGFzT3duUHJvcGVydHkoc3BlYy5uYW1lKSkge1xuICAgICAgdmFyIGZvdW5kID0gbWltZU1vZGVzW3NwZWMubmFtZV07XG4gICAgICBpZiAodHlwZW9mIGZvdW5kID09IFwic3RyaW5nXCIpIHsgZm91bmQgPSB7bmFtZTogZm91bmR9OyB9XG4gICAgICBzcGVjID0gY3JlYXRlT2JqKGZvdW5kLCBzcGVjKTtcbiAgICAgIHNwZWMubmFtZSA9IGZvdW5kLm5hbWU7XG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygc3BlYyA9PSBcInN0cmluZ1wiICYmIC9eW1xcd1xcLV0rXFwvW1xcd1xcLV0rXFwreG1sJC8udGVzdChzcGVjKSkge1xuICAgICAgcmV0dXJuIHJlc29sdmVNb2RlKFwiYXBwbGljYXRpb24veG1sXCIpXG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygc3BlYyA9PSBcInN0cmluZ1wiICYmIC9eW1xcd1xcLV0rXFwvW1xcd1xcLV0rXFwranNvbiQvLnRlc3Qoc3BlYykpIHtcbiAgICAgIHJldHVybiByZXNvbHZlTW9kZShcImFwcGxpY2F0aW9uL2pzb25cIilcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzcGVjID09IFwic3RyaW5nXCIpIHsgcmV0dXJuIHtuYW1lOiBzcGVjfSB9XG4gICAgZWxzZSB7IHJldHVybiBzcGVjIHx8IHtuYW1lOiBcIm51bGxcIn0gfVxuICB9XG5cbiAgLy8gR2l2ZW4gYSBtb2RlIHNwZWMgKGFueXRoaW5nIHRoYXQgcmVzb2x2ZU1vZGUgYWNjZXB0cyksIGZpbmQgYW5kXG4gIC8vIGluaXRpYWxpemUgYW4gYWN0dWFsIG1vZGUgb2JqZWN0LlxuICBmdW5jdGlvbiBnZXRNb2RlKG9wdGlvbnMsIHNwZWMpIHtcbiAgICBzcGVjID0gcmVzb2x2ZU1vZGUoc3BlYyk7XG4gICAgdmFyIG1mYWN0b3J5ID0gbW9kZXNbc3BlYy5uYW1lXTtcbiAgICBpZiAoIW1mYWN0b3J5KSB7IHJldHVybiBnZXRNb2RlKG9wdGlvbnMsIFwidGV4dC9wbGFpblwiKSB9XG4gICAgdmFyIG1vZGVPYmogPSBtZmFjdG9yeShvcHRpb25zLCBzcGVjKTtcbiAgICBpZiAobW9kZUV4dGVuc2lvbnMuaGFzT3duUHJvcGVydHkoc3BlYy5uYW1lKSkge1xuICAgICAgdmFyIGV4dHMgPSBtb2RlRXh0ZW5zaW9uc1tzcGVjLm5hbWVdO1xuICAgICAgZm9yICh2YXIgcHJvcCBpbiBleHRzKSB7XG4gICAgICAgIGlmICghZXh0cy5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgeyBjb250aW51ZSB9XG4gICAgICAgIGlmIChtb2RlT2JqLmhhc093blByb3BlcnR5KHByb3ApKSB7IG1vZGVPYmpbXCJfXCIgKyBwcm9wXSA9IG1vZGVPYmpbcHJvcF07IH1cbiAgICAgICAgbW9kZU9ialtwcm9wXSA9IGV4dHNbcHJvcF07XG4gICAgICB9XG4gICAgfVxuICAgIG1vZGVPYmoubmFtZSA9IHNwZWMubmFtZTtcbiAgICBpZiAoc3BlYy5oZWxwZXJUeXBlKSB7IG1vZGVPYmouaGVscGVyVHlwZSA9IHNwZWMuaGVscGVyVHlwZTsgfVxuICAgIGlmIChzcGVjLm1vZGVQcm9wcykgeyBmb3IgKHZhciBwcm9wJDEgaW4gc3BlYy5tb2RlUHJvcHMpXG4gICAgICB7IG1vZGVPYmpbcHJvcCQxXSA9IHNwZWMubW9kZVByb3BzW3Byb3AkMV07IH0gfVxuXG4gICAgcmV0dXJuIG1vZGVPYmpcbiAgfVxuXG4gIC8vIFRoaXMgY2FuIGJlIHVzZWQgdG8gYXR0YWNoIHByb3BlcnRpZXMgdG8gbW9kZSBvYmplY3RzIGZyb21cbiAgLy8gb3V0c2lkZSB0aGUgYWN0dWFsIG1vZGUgZGVmaW5pdGlvbi5cbiAgdmFyIG1vZGVFeHRlbnNpb25zID0ge307XG4gIGZ1bmN0aW9uIGV4dGVuZE1vZGUobW9kZSwgcHJvcGVydGllcykge1xuICAgIHZhciBleHRzID0gbW9kZUV4dGVuc2lvbnMuaGFzT3duUHJvcGVydHkobW9kZSkgPyBtb2RlRXh0ZW5zaW9uc1ttb2RlXSA6IChtb2RlRXh0ZW5zaW9uc1ttb2RlXSA9IHt9KTtcbiAgICBjb3B5T2JqKHByb3BlcnRpZXMsIGV4dHMpO1xuICB9XG5cbiAgZnVuY3Rpb24gY29weVN0YXRlKG1vZGUsIHN0YXRlKSB7XG4gICAgaWYgKHN0YXRlID09PSB0cnVlKSB7IHJldHVybiBzdGF0ZSB9XG4gICAgaWYgKG1vZGUuY29weVN0YXRlKSB7IHJldHVybiBtb2RlLmNvcHlTdGF0ZShzdGF0ZSkgfVxuICAgIHZhciBuc3RhdGUgPSB7fTtcbiAgICBmb3IgKHZhciBuIGluIHN0YXRlKSB7XG4gICAgICB2YXIgdmFsID0gc3RhdGVbbl07XG4gICAgICBpZiAodmFsIGluc3RhbmNlb2YgQXJyYXkpIHsgdmFsID0gdmFsLmNvbmNhdChbXSk7IH1cbiAgICAgIG5zdGF0ZVtuXSA9IHZhbDtcbiAgICB9XG4gICAgcmV0dXJuIG5zdGF0ZVxuICB9XG5cbiAgLy8gR2l2ZW4gYSBtb2RlIGFuZCBhIHN0YXRlIChmb3IgdGhhdCBtb2RlKSwgZmluZCB0aGUgaW5uZXIgbW9kZSBhbmRcbiAgLy8gc3RhdGUgYXQgdGhlIHBvc2l0aW9uIHRoYXQgdGhlIHN0YXRlIHJlZmVycyB0by5cbiAgZnVuY3Rpb24gaW5uZXJNb2RlKG1vZGUsIHN0YXRlKSB7XG4gICAgdmFyIGluZm87XG4gICAgd2hpbGUgKG1vZGUuaW5uZXJNb2RlKSB7XG4gICAgICBpbmZvID0gbW9kZS5pbm5lck1vZGUoc3RhdGUpO1xuICAgICAgaWYgKCFpbmZvIHx8IGluZm8ubW9kZSA9PSBtb2RlKSB7IGJyZWFrIH1cbiAgICAgIHN0YXRlID0gaW5mby5zdGF0ZTtcbiAgICAgIG1vZGUgPSBpbmZvLm1vZGU7XG4gICAgfVxuICAgIHJldHVybiBpbmZvIHx8IHttb2RlOiBtb2RlLCBzdGF0ZTogc3RhdGV9XG4gIH1cblxuICBmdW5jdGlvbiBzdGFydFN0YXRlKG1vZGUsIGExLCBhMikge1xuICAgIHJldHVybiBtb2RlLnN0YXJ0U3RhdGUgPyBtb2RlLnN0YXJ0U3RhdGUoYTEsIGEyKSA6IHRydWVcbiAgfVxuXG4gIC8vIFNUUklORyBTVFJFQU1cblxuICAvLyBGZWQgdG8gdGhlIG1vZGUgcGFyc2VycywgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byBtYWtlXG4gIC8vIHBhcnNlcnMgbW9yZSBzdWNjaW5jdC5cblxuICB2YXIgU3RyaW5nU3RyZWFtID0gZnVuY3Rpb24oc3RyaW5nLCB0YWJTaXplLCBsaW5lT3JhY2xlKSB7XG4gICAgdGhpcy5wb3MgPSB0aGlzLnN0YXJ0ID0gMDtcbiAgICB0aGlzLnN0cmluZyA9IHN0cmluZztcbiAgICB0aGlzLnRhYlNpemUgPSB0YWJTaXplIHx8IDg7XG4gICAgdGhpcy5sYXN0Q29sdW1uUG9zID0gdGhpcy5sYXN0Q29sdW1uVmFsdWUgPSAwO1xuICAgIHRoaXMubGluZVN0YXJ0ID0gMDtcbiAgICB0aGlzLmxpbmVPcmFjbGUgPSBsaW5lT3JhY2xlO1xuICB9O1xuXG4gIFN0cmluZ1N0cmVhbS5wcm90b3R5cGUuZW9sID0gZnVuY3Rpb24gKCkge3JldHVybiB0aGlzLnBvcyA+PSB0aGlzLnN0cmluZy5sZW5ndGh9O1xuICBTdHJpbmdTdHJlYW0ucHJvdG90eXBlLnNvbCA9IGZ1bmN0aW9uICgpIHtyZXR1cm4gdGhpcy5wb3MgPT0gdGhpcy5saW5lU3RhcnR9O1xuICBTdHJpbmdTdHJlYW0ucHJvdG90eXBlLnBlZWsgPSBmdW5jdGlvbiAoKSB7cmV0dXJuIHRoaXMuc3RyaW5nLmNoYXJBdCh0aGlzLnBvcykgfHwgdW5kZWZpbmVkfTtcbiAgU3RyaW5nU3RyZWFtLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLnBvcyA8IHRoaXMuc3RyaW5nLmxlbmd0aClcbiAgICAgIHsgcmV0dXJuIHRoaXMuc3RyaW5nLmNoYXJBdCh0aGlzLnBvcysrKSB9XG4gIH07XG4gIFN0cmluZ1N0cmVhbS5wcm90b3R5cGUuZWF0ID0gZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgdmFyIGNoID0gdGhpcy5zdHJpbmcuY2hhckF0KHRoaXMucG9zKTtcbiAgICB2YXIgb2s7XG4gICAgaWYgKHR5cGVvZiBtYXRjaCA9PSBcInN0cmluZ1wiKSB7IG9rID0gY2ggPT0gbWF0Y2g7IH1cbiAgICBlbHNlIHsgb2sgPSBjaCAmJiAobWF0Y2gudGVzdCA/IG1hdGNoLnRlc3QoY2gpIDogbWF0Y2goY2gpKTsgfVxuICAgIGlmIChvaykgeysrdGhpcy5wb3M7IHJldHVybiBjaH1cbiAgfTtcbiAgU3RyaW5nU3RyZWFtLnByb3RvdHlwZS5lYXRXaGlsZSA9IGZ1bmN0aW9uIChtYXRjaCkge1xuICAgIHZhciBzdGFydCA9IHRoaXMucG9zO1xuICAgIHdoaWxlICh0aGlzLmVhdChtYXRjaCkpe31cbiAgICByZXR1cm4gdGhpcy5wb3MgPiBzdGFydFxuICB9O1xuICBTdHJpbmdTdHJlYW0ucHJvdG90eXBlLmVhdFNwYWNlID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzdGFydCA9IHRoaXMucG9zO1xuICAgIHdoaWxlICgvW1xcc1xcdTAwYTBdLy50ZXN0KHRoaXMuc3RyaW5nLmNoYXJBdCh0aGlzLnBvcykpKSB7ICsrdGhpcy5wb3M7IH1cbiAgICByZXR1cm4gdGhpcy5wb3MgPiBzdGFydFxuICB9O1xuICBTdHJpbmdTdHJlYW0ucHJvdG90eXBlLnNraXBUb0VuZCA9IGZ1bmN0aW9uICgpIHt0aGlzLnBvcyA9IHRoaXMuc3RyaW5nLmxlbmd0aDt9O1xuICBTdHJpbmdTdHJlYW0ucHJvdG90eXBlLnNraXBUbyA9IGZ1bmN0aW9uIChjaCkge1xuICAgIHZhciBmb3VuZCA9IHRoaXMuc3RyaW5nLmluZGV4T2YoY2gsIHRoaXMucG9zKTtcbiAgICBpZiAoZm91bmQgPiAtMSkge3RoaXMucG9zID0gZm91bmQ7IHJldHVybiB0cnVlfVxuICB9O1xuICBTdHJpbmdTdHJlYW0ucHJvdG90eXBlLmJhY2tVcCA9IGZ1bmN0aW9uIChuKSB7dGhpcy5wb3MgLT0gbjt9O1xuICBTdHJpbmdTdHJlYW0ucHJvdG90eXBlLmNvbHVtbiA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5sYXN0Q29sdW1uUG9zIDwgdGhpcy5zdGFydCkge1xuICAgICAgdGhpcy5sYXN0Q29sdW1uVmFsdWUgPSBjb3VudENvbHVtbih0aGlzLnN0cmluZywgdGhpcy5zdGFydCwgdGhpcy50YWJTaXplLCB0aGlzLmxhc3RDb2x1bW5Qb3MsIHRoaXMubGFzdENvbHVtblZhbHVlKTtcbiAgICAgIHRoaXMubGFzdENvbHVtblBvcyA9IHRoaXMuc3RhcnQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmxhc3RDb2x1bW5WYWx1ZSAtICh0aGlzLmxpbmVTdGFydCA/IGNvdW50Q29sdW1uKHRoaXMuc3RyaW5nLCB0aGlzLmxpbmVTdGFydCwgdGhpcy50YWJTaXplKSA6IDApXG4gIH07XG4gIFN0cmluZ1N0cmVhbS5wcm90b3R5cGUuaW5kZW50YXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGNvdW50Q29sdW1uKHRoaXMuc3RyaW5nLCBudWxsLCB0aGlzLnRhYlNpemUpIC1cbiAgICAgICh0aGlzLmxpbmVTdGFydCA/IGNvdW50Q29sdW1uKHRoaXMuc3RyaW5nLCB0aGlzLmxpbmVTdGFydCwgdGhpcy50YWJTaXplKSA6IDApXG4gIH07XG4gIFN0cmluZ1N0cmVhbS5wcm90b3R5cGUubWF0Y2ggPSBmdW5jdGlvbiAocGF0dGVybiwgY29uc3VtZSwgY2FzZUluc2Vuc2l0aXZlKSB7XG4gICAgaWYgKHR5cGVvZiBwYXR0ZXJuID09IFwic3RyaW5nXCIpIHtcbiAgICAgIHZhciBjYXNlZCA9IGZ1bmN0aW9uIChzdHIpIHsgcmV0dXJuIGNhc2VJbnNlbnNpdGl2ZSA/IHN0ci50b0xvd2VyQ2FzZSgpIDogc3RyOyB9O1xuICAgICAgdmFyIHN1YnN0ciA9IHRoaXMuc3RyaW5nLnN1YnN0cih0aGlzLnBvcywgcGF0dGVybi5sZW5ndGgpO1xuICAgICAgaWYgKGNhc2VkKHN1YnN0cikgPT0gY2FzZWQocGF0dGVybikpIHtcbiAgICAgICAgaWYgKGNvbnN1bWUgIT09IGZhbHNlKSB7IHRoaXMucG9zICs9IHBhdHRlcm4ubGVuZ3RoOyB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBtYXRjaCA9IHRoaXMuc3RyaW5nLnNsaWNlKHRoaXMucG9zKS5tYXRjaChwYXR0ZXJuKTtcbiAgICAgIGlmIChtYXRjaCAmJiBtYXRjaC5pbmRleCA+IDApIHsgcmV0dXJuIG51bGwgfVxuICAgICAgaWYgKG1hdGNoICYmIGNvbnN1bWUgIT09IGZhbHNlKSB7IHRoaXMucG9zICs9IG1hdGNoWzBdLmxlbmd0aDsgfVxuICAgICAgcmV0dXJuIG1hdGNoXG4gICAgfVxuICB9O1xuICBTdHJpbmdTdHJlYW0ucHJvdG90eXBlLmN1cnJlbnQgPSBmdW5jdGlvbiAoKXtyZXR1cm4gdGhpcy5zdHJpbmcuc2xpY2UodGhpcy5zdGFydCwgdGhpcy5wb3MpfTtcbiAgU3RyaW5nU3RyZWFtLnByb3RvdHlwZS5oaWRlRmlyc3RDaGFycyA9IGZ1bmN0aW9uIChuLCBpbm5lcikge1xuICAgIHRoaXMubGluZVN0YXJ0ICs9IG47XG4gICAgdHJ5IHsgcmV0dXJuIGlubmVyKCkgfVxuICAgIGZpbmFsbHkgeyB0aGlzLmxpbmVTdGFydCAtPSBuOyB9XG4gIH07XG4gIFN0cmluZ1N0cmVhbS5wcm90b3R5cGUubG9va0FoZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgICB2YXIgb3JhY2xlID0gdGhpcy5saW5lT3JhY2xlO1xuICAgIHJldHVybiBvcmFjbGUgJiYgb3JhY2xlLmxvb2tBaGVhZChuKVxuICB9O1xuICBTdHJpbmdTdHJlYW0ucHJvdG90eXBlLmJhc2VUb2tlbiA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgb3JhY2xlID0gdGhpcy5saW5lT3JhY2xlO1xuICAgIHJldHVybiBvcmFjbGUgJiYgb3JhY2xlLmJhc2VUb2tlbih0aGlzLnBvcylcbiAgfTtcblxuICAvLyBGaW5kIHRoZSBsaW5lIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBsaW5lIG51bWJlci5cbiAgZnVuY3Rpb24gZ2V0TGluZShkb2MsIG4pIHtcbiAgICBuIC09IGRvYy5maXJzdDtcbiAgICBpZiAobiA8IDAgfHwgbiA+PSBkb2Muc2l6ZSkgeyB0aHJvdyBuZXcgRXJyb3IoXCJUaGVyZSBpcyBubyBsaW5lIFwiICsgKG4gKyBkb2MuZmlyc3QpICsgXCIgaW4gdGhlIGRvY3VtZW50LlwiKSB9XG4gICAgdmFyIGNodW5rID0gZG9jO1xuICAgIHdoaWxlICghY2h1bmsubGluZXMpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOzsgKytpKSB7XG4gICAgICAgIHZhciBjaGlsZCA9IGNodW5rLmNoaWxkcmVuW2ldLCBzeiA9IGNoaWxkLmNodW5rU2l6ZSgpO1xuICAgICAgICBpZiAobiA8IHN6KSB7IGNodW5rID0gY2hpbGQ7IGJyZWFrIH1cbiAgICAgICAgbiAtPSBzejtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNodW5rLmxpbmVzW25dXG4gIH1cblxuICAvLyBHZXQgdGhlIHBhcnQgb2YgYSBkb2N1bWVudCBiZXR3ZWVuIHR3byBwb3NpdGlvbnMsIGFzIGFuIGFycmF5IG9mXG4gIC8vIHN0cmluZ3MuXG4gIGZ1bmN0aW9uIGdldEJldHdlZW4oZG9jLCBzdGFydCwgZW5kKSB7XG4gICAgdmFyIG91dCA9IFtdLCBuID0gc3RhcnQubGluZTtcbiAgICBkb2MuaXRlcihzdGFydC5saW5lLCBlbmQubGluZSArIDEsIGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgICB2YXIgdGV4dCA9IGxpbmUudGV4dDtcbiAgICAgIGlmIChuID09IGVuZC5saW5lKSB7IHRleHQgPSB0ZXh0LnNsaWNlKDAsIGVuZC5jaCk7IH1cbiAgICAgIGlmIChuID09IHN0YXJ0LmxpbmUpIHsgdGV4dCA9IHRleHQuc2xpY2Uoc3RhcnQuY2gpOyB9XG4gICAgICBvdXQucHVzaCh0ZXh0KTtcbiAgICAgICsrbjtcbiAgICB9KTtcbiAgICByZXR1cm4gb3V0XG4gIH1cbiAgLy8gR2V0IHRoZSBsaW5lcyBiZXR3ZWVuIGZyb20gYW5kIHRvLCBhcyBhcnJheSBvZiBzdHJpbmdzLlxuICBmdW5jdGlvbiBnZXRMaW5lcyhkb2MsIGZyb20sIHRvKSB7XG4gICAgdmFyIG91dCA9IFtdO1xuICAgIGRvYy5pdGVyKGZyb20sIHRvLCBmdW5jdGlvbiAobGluZSkgeyBvdXQucHVzaChsaW5lLnRleHQpOyB9KTsgLy8gaXRlciBhYm9ydHMgd2hlbiBjYWxsYmFjayByZXR1cm5zIHRydXRoeSB2YWx1ZVxuICAgIHJldHVybiBvdXRcbiAgfVxuXG4gIC8vIFVwZGF0ZSB0aGUgaGVpZ2h0IG9mIGEgbGluZSwgcHJvcGFnYXRpbmcgdGhlIGhlaWdodCBjaGFuZ2VcbiAgLy8gdXB3YXJkcyB0byBwYXJlbnQgbm9kZXMuXG4gIGZ1bmN0aW9uIHVwZGF0ZUxpbmVIZWlnaHQobGluZSwgaGVpZ2h0KSB7XG4gICAgdmFyIGRpZmYgPSBoZWlnaHQgLSBsaW5lLmhlaWdodDtcbiAgICBpZiAoZGlmZikgeyBmb3IgKHZhciBuID0gbGluZTsgbjsgbiA9IG4ucGFyZW50KSB7IG4uaGVpZ2h0ICs9IGRpZmY7IH0gfVxuICB9XG5cbiAgLy8gR2l2ZW4gYSBsaW5lIG9iamVjdCwgZmluZCBpdHMgbGluZSBudW1iZXIgYnkgd2Fsa2luZyB1cCB0aHJvdWdoXG4gIC8vIGl0cyBwYXJlbnQgbGlua3MuXG4gIGZ1bmN0aW9uIGxpbmVObyhsaW5lKSB7XG4gICAgaWYgKGxpbmUucGFyZW50ID09IG51bGwpIHsgcmV0dXJuIG51bGwgfVxuICAgIHZhciBjdXIgPSBsaW5lLnBhcmVudCwgbm8gPSBpbmRleE9mKGN1ci5saW5lcywgbGluZSk7XG4gICAgZm9yICh2YXIgY2h1bmsgPSBjdXIucGFyZW50OyBjaHVuazsgY3VyID0gY2h1bmssIGNodW5rID0gY2h1bmsucGFyZW50KSB7XG4gICAgICBmb3IgKHZhciBpID0gMDs7ICsraSkge1xuICAgICAgICBpZiAoY2h1bmsuY2hpbGRyZW5baV0gPT0gY3VyKSB7IGJyZWFrIH1cbiAgICAgICAgbm8gKz0gY2h1bmsuY2hpbGRyZW5baV0uY2h1bmtTaXplKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBubyArIGN1ci5maXJzdFxuICB9XG5cbiAgLy8gRmluZCB0aGUgbGluZSBhdCB0aGUgZ2l2ZW4gdmVydGljYWwgcG9zaXRpb24sIHVzaW5nIHRoZSBoZWlnaHRcbiAgLy8gaW5mb3JtYXRpb24gaW4gdGhlIGRvY3VtZW50IHRyZWUuXG4gIGZ1bmN0aW9uIGxpbmVBdEhlaWdodChjaHVuaywgaCkge1xuICAgIHZhciBuID0gY2h1bmsuZmlyc3Q7XG4gICAgb3V0ZXI6IGRvIHtcbiAgICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IGNodW5rLmNoaWxkcmVuLmxlbmd0aDsgKytpJDEpIHtcbiAgICAgICAgdmFyIGNoaWxkID0gY2h1bmsuY2hpbGRyZW5baSQxXSwgY2ggPSBjaGlsZC5oZWlnaHQ7XG4gICAgICAgIGlmIChoIDwgY2gpIHsgY2h1bmsgPSBjaGlsZDsgY29udGludWUgb3V0ZXIgfVxuICAgICAgICBoIC09IGNoO1xuICAgICAgICBuICs9IGNoaWxkLmNodW5rU2l6ZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5cbiAgICB9IHdoaWxlICghY2h1bmsubGluZXMpXG4gICAgdmFyIGkgPSAwO1xuICAgIGZvciAoOyBpIDwgY2h1bmsubGluZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBsaW5lID0gY2h1bmsubGluZXNbaV0sIGxoID0gbGluZS5oZWlnaHQ7XG4gICAgICBpZiAoaCA8IGxoKSB7IGJyZWFrIH1cbiAgICAgIGggLT0gbGg7XG4gICAgfVxuICAgIHJldHVybiBuICsgaVxuICB9XG5cbiAgZnVuY3Rpb24gaXNMaW5lKGRvYywgbCkge3JldHVybiBsID49IGRvYy5maXJzdCAmJiBsIDwgZG9jLmZpcnN0ICsgZG9jLnNpemV9XG5cbiAgZnVuY3Rpb24gbGluZU51bWJlckZvcihvcHRpb25zLCBpKSB7XG4gICAgcmV0dXJuIFN0cmluZyhvcHRpb25zLmxpbmVOdW1iZXJGb3JtYXR0ZXIoaSArIG9wdGlvbnMuZmlyc3RMaW5lTnVtYmVyKSlcbiAgfVxuXG4gIC8vIEEgUG9zIGluc3RhbmNlIHJlcHJlc2VudHMgYSBwb3NpdGlvbiB3aXRoaW4gdGhlIHRleHQuXG4gIGZ1bmN0aW9uIFBvcyhsaW5lLCBjaCwgc3RpY2t5KSB7XG4gICAgaWYgKCBzdGlja3kgPT09IHZvaWQgMCApIHN0aWNreSA9IG51bGw7XG5cbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUG9zKSkgeyByZXR1cm4gbmV3IFBvcyhsaW5lLCBjaCwgc3RpY2t5KSB9XG4gICAgdGhpcy5saW5lID0gbGluZTtcbiAgICB0aGlzLmNoID0gY2g7XG4gICAgdGhpcy5zdGlja3kgPSBzdGlja3k7XG4gIH1cblxuICAvLyBDb21wYXJlIHR3byBwb3NpdGlvbnMsIHJldHVybiAwIGlmIHRoZXkgYXJlIHRoZSBzYW1lLCBhIG5lZ2F0aXZlXG4gIC8vIG51bWJlciB3aGVuIGEgaXMgbGVzcywgYW5kIGEgcG9zaXRpdmUgbnVtYmVyIG90aGVyd2lzZS5cbiAgZnVuY3Rpb24gY21wKGEsIGIpIHsgcmV0dXJuIGEubGluZSAtIGIubGluZSB8fCBhLmNoIC0gYi5jaCB9XG5cbiAgZnVuY3Rpb24gZXF1YWxDdXJzb3JQb3MoYSwgYikgeyByZXR1cm4gYS5zdGlja3kgPT0gYi5zdGlja3kgJiYgY21wKGEsIGIpID09IDAgfVxuXG4gIGZ1bmN0aW9uIGNvcHlQb3MoeCkge3JldHVybiBQb3MoeC5saW5lLCB4LmNoKX1cbiAgZnVuY3Rpb24gbWF4UG9zKGEsIGIpIHsgcmV0dXJuIGNtcChhLCBiKSA8IDAgPyBiIDogYSB9XG4gIGZ1bmN0aW9uIG1pblBvcyhhLCBiKSB7IHJldHVybiBjbXAoYSwgYikgPCAwID8gYSA6IGIgfVxuXG4gIC8vIE1vc3Qgb2YgdGhlIGV4dGVybmFsIEFQSSBjbGlwcyBnaXZlbiBwb3NpdGlvbnMgdG8gbWFrZSBzdXJlIHRoZXlcbiAgLy8gYWN0dWFsbHkgZXhpc3Qgd2l0aGluIHRoZSBkb2N1bWVudC5cbiAgZnVuY3Rpb24gY2xpcExpbmUoZG9jLCBuKSB7cmV0dXJuIE1hdGgubWF4KGRvYy5maXJzdCwgTWF0aC5taW4obiwgZG9jLmZpcnN0ICsgZG9jLnNpemUgLSAxKSl9XG4gIGZ1bmN0aW9uIGNsaXBQb3MoZG9jLCBwb3MpIHtcbiAgICBpZiAocG9zLmxpbmUgPCBkb2MuZmlyc3QpIHsgcmV0dXJuIFBvcyhkb2MuZmlyc3QsIDApIH1cbiAgICB2YXIgbGFzdCA9IGRvYy5maXJzdCArIGRvYy5zaXplIC0gMTtcbiAgICBpZiAocG9zLmxpbmUgPiBsYXN0KSB7IHJldHVybiBQb3MobGFzdCwgZ2V0TGluZShkb2MsIGxhc3QpLnRleHQubGVuZ3RoKSB9XG4gICAgcmV0dXJuIGNsaXBUb0xlbihwb3MsIGdldExpbmUoZG9jLCBwb3MubGluZSkudGV4dC5sZW5ndGgpXG4gIH1cbiAgZnVuY3Rpb24gY2xpcFRvTGVuKHBvcywgbGluZWxlbikge1xuICAgIHZhciBjaCA9IHBvcy5jaDtcbiAgICBpZiAoY2ggPT0gbnVsbCB8fCBjaCA+IGxpbmVsZW4pIHsgcmV0dXJuIFBvcyhwb3MubGluZSwgbGluZWxlbikgfVxuICAgIGVsc2UgaWYgKGNoIDwgMCkgeyByZXR1cm4gUG9zKHBvcy5saW5lLCAwKSB9XG4gICAgZWxzZSB7IHJldHVybiBwb3MgfVxuICB9XG4gIGZ1bmN0aW9uIGNsaXBQb3NBcnJheShkb2MsIGFycmF5KSB7XG4gICAgdmFyIG91dCA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsgb3V0W2ldID0gY2xpcFBvcyhkb2MsIGFycmF5W2ldKTsgfVxuICAgIHJldHVybiBvdXRcbiAgfVxuXG4gIHZhciBTYXZlZENvbnRleHQgPSBmdW5jdGlvbihzdGF0ZSwgbG9va0FoZWFkKSB7XG4gICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgIHRoaXMubG9va0FoZWFkID0gbG9va0FoZWFkO1xuICB9O1xuXG4gIHZhciBDb250ZXh0ID0gZnVuY3Rpb24oZG9jLCBzdGF0ZSwgbGluZSwgbG9va0FoZWFkKSB7XG4gICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgIHRoaXMuZG9jID0gZG9jO1xuICAgIHRoaXMubGluZSA9IGxpbmU7XG4gICAgdGhpcy5tYXhMb29rQWhlYWQgPSBsb29rQWhlYWQgfHwgMDtcbiAgICB0aGlzLmJhc2VUb2tlbnMgPSBudWxsO1xuICAgIHRoaXMuYmFzZVRva2VuUG9zID0gMTtcbiAgfTtcblxuICBDb250ZXh0LnByb3RvdHlwZS5sb29rQWhlYWQgPSBmdW5jdGlvbiAobikge1xuICAgIHZhciBsaW5lID0gdGhpcy5kb2MuZ2V0TGluZSh0aGlzLmxpbmUgKyBuKTtcbiAgICBpZiAobGluZSAhPSBudWxsICYmIG4gPiB0aGlzLm1heExvb2tBaGVhZCkgeyB0aGlzLm1heExvb2tBaGVhZCA9IG47IH1cbiAgICByZXR1cm4gbGluZVxuICB9O1xuXG4gIENvbnRleHQucHJvdG90eXBlLmJhc2VUb2tlbiA9IGZ1bmN0aW9uIChuKSB7XG4gICAgaWYgKCF0aGlzLmJhc2VUb2tlbnMpIHsgcmV0dXJuIG51bGwgfVxuICAgIHdoaWxlICh0aGlzLmJhc2VUb2tlbnNbdGhpcy5iYXNlVG9rZW5Qb3NdIDw9IG4pXG4gICAgICB7IHRoaXMuYmFzZVRva2VuUG9zICs9IDI7IH1cbiAgICB2YXIgdHlwZSA9IHRoaXMuYmFzZVRva2Vuc1t0aGlzLmJhc2VUb2tlblBvcyArIDFdO1xuICAgIHJldHVybiB7dHlwZTogdHlwZSAmJiB0eXBlLnJlcGxhY2UoLyggfF4pb3ZlcmxheSAuKi8sIFwiXCIpLFxuICAgICAgICAgICAgc2l6ZTogdGhpcy5iYXNlVG9rZW5zW3RoaXMuYmFzZVRva2VuUG9zXSAtIG59XG4gIH07XG5cbiAgQ29udGV4dC5wcm90b3R5cGUubmV4dExpbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5saW5lKys7XG4gICAgaWYgKHRoaXMubWF4TG9va0FoZWFkID4gMCkgeyB0aGlzLm1heExvb2tBaGVhZC0tOyB9XG4gIH07XG5cbiAgQ29udGV4dC5mcm9tU2F2ZWQgPSBmdW5jdGlvbiAoZG9jLCBzYXZlZCwgbGluZSkge1xuICAgIGlmIChzYXZlZCBpbnN0YW5jZW9mIFNhdmVkQ29udGV4dClcbiAgICAgIHsgcmV0dXJuIG5ldyBDb250ZXh0KGRvYywgY29weVN0YXRlKGRvYy5tb2RlLCBzYXZlZC5zdGF0ZSksIGxpbmUsIHNhdmVkLmxvb2tBaGVhZCkgfVxuICAgIGVsc2VcbiAgICAgIHsgcmV0dXJuIG5ldyBDb250ZXh0KGRvYywgY29weVN0YXRlKGRvYy5tb2RlLCBzYXZlZCksIGxpbmUpIH1cbiAgfTtcblxuICBDb250ZXh0LnByb3RvdHlwZS5zYXZlID0gZnVuY3Rpb24gKGNvcHkpIHtcbiAgICB2YXIgc3RhdGUgPSBjb3B5ICE9PSBmYWxzZSA/IGNvcHlTdGF0ZSh0aGlzLmRvYy5tb2RlLCB0aGlzLnN0YXRlKSA6IHRoaXMuc3RhdGU7XG4gICAgcmV0dXJuIHRoaXMubWF4TG9va0FoZWFkID4gMCA/IG5ldyBTYXZlZENvbnRleHQoc3RhdGUsIHRoaXMubWF4TG9va0FoZWFkKSA6IHN0YXRlXG4gIH07XG5cblxuICAvLyBDb21wdXRlIGEgc3R5bGUgYXJyYXkgKGFuIGFycmF5IHN0YXJ0aW5nIHdpdGggYSBtb2RlIGdlbmVyYXRpb25cbiAgLy8gLS0gZm9yIGludmFsaWRhdGlvbiAtLSBmb2xsb3dlZCBieSBwYWlycyBvZiBlbmQgcG9zaXRpb25zIGFuZFxuICAvLyBzdHlsZSBzdHJpbmdzKSwgd2hpY2ggaXMgdXNlZCB0byBoaWdobGlnaHQgdGhlIHRva2VucyBvbiB0aGVcbiAgLy8gbGluZS5cbiAgZnVuY3Rpb24gaGlnaGxpZ2h0TGluZShjbSwgbGluZSwgY29udGV4dCwgZm9yY2VUb0VuZCkge1xuICAgIC8vIEEgc3R5bGVzIGFycmF5IGFsd2F5cyBzdGFydHMgd2l0aCBhIG51bWJlciBpZGVudGlmeWluZyB0aGVcbiAgICAvLyBtb2RlL292ZXJsYXlzIHRoYXQgaXQgaXMgYmFzZWQgb24gKGZvciBlYXN5IGludmFsaWRhdGlvbikuXG4gICAgdmFyIHN0ID0gW2NtLnN0YXRlLm1vZGVHZW5dLCBsaW5lQ2xhc3NlcyA9IHt9O1xuICAgIC8vIENvbXB1dGUgdGhlIGJhc2UgYXJyYXkgb2Ygc3R5bGVzXG4gICAgcnVuTW9kZShjbSwgbGluZS50ZXh0LCBjbS5kb2MubW9kZSwgY29udGV4dCwgZnVuY3Rpb24gKGVuZCwgc3R5bGUpIHsgcmV0dXJuIHN0LnB1c2goZW5kLCBzdHlsZSk7IH0sXG4gICAgICAgICAgICBsaW5lQ2xhc3NlcywgZm9yY2VUb0VuZCk7XG4gICAgdmFyIHN0YXRlID0gY29udGV4dC5zdGF0ZTtcblxuICAgIC8vIFJ1biBvdmVybGF5cywgYWRqdXN0IHN0eWxlIGFycmF5LlxuICAgIHZhciBsb29wID0gZnVuY3Rpb24gKCBvICkge1xuICAgICAgY29udGV4dC5iYXNlVG9rZW5zID0gc3Q7XG4gICAgICB2YXIgb3ZlcmxheSA9IGNtLnN0YXRlLm92ZXJsYXlzW29dLCBpID0gMSwgYXQgPSAwO1xuICAgICAgY29udGV4dC5zdGF0ZSA9IHRydWU7XG4gICAgICBydW5Nb2RlKGNtLCBsaW5lLnRleHQsIG92ZXJsYXkubW9kZSwgY29udGV4dCwgZnVuY3Rpb24gKGVuZCwgc3R5bGUpIHtcbiAgICAgICAgdmFyIHN0YXJ0ID0gaTtcbiAgICAgICAgLy8gRW5zdXJlIHRoZXJlJ3MgYSB0b2tlbiBlbmQgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24sIGFuZCB0aGF0IGkgcG9pbnRzIGF0IGl0XG4gICAgICAgIHdoaWxlIChhdCA8IGVuZCkge1xuICAgICAgICAgIHZhciBpX2VuZCA9IHN0W2ldO1xuICAgICAgICAgIGlmIChpX2VuZCA+IGVuZClcbiAgICAgICAgICAgIHsgc3Quc3BsaWNlKGksIDEsIGVuZCwgc3RbaSsxXSwgaV9lbmQpOyB9XG4gICAgICAgICAgaSArPSAyO1xuICAgICAgICAgIGF0ID0gTWF0aC5taW4oZW5kLCBpX2VuZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzdHlsZSkgeyByZXR1cm4gfVxuICAgICAgICBpZiAob3ZlcmxheS5vcGFxdWUpIHtcbiAgICAgICAgICBzdC5zcGxpY2Uoc3RhcnQsIGkgLSBzdGFydCwgZW5kLCBcIm92ZXJsYXkgXCIgKyBzdHlsZSk7XG4gICAgICAgICAgaSA9IHN0YXJ0ICsgMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3IgKDsgc3RhcnQgPCBpOyBzdGFydCArPSAyKSB7XG4gICAgICAgICAgICB2YXIgY3VyID0gc3Rbc3RhcnQrMV07XG4gICAgICAgICAgICBzdFtzdGFydCsxXSA9IChjdXIgPyBjdXIgKyBcIiBcIiA6IFwiXCIpICsgXCJvdmVybGF5IFwiICsgc3R5bGU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCBsaW5lQ2xhc3Nlcyk7XG4gICAgICBjb250ZXh0LnN0YXRlID0gc3RhdGU7XG4gICAgICBjb250ZXh0LmJhc2VUb2tlbnMgPSBudWxsO1xuICAgICAgY29udGV4dC5iYXNlVG9rZW5Qb3MgPSAxO1xuICAgIH07XG5cbiAgICBmb3IgKHZhciBvID0gMDsgbyA8IGNtLnN0YXRlLm92ZXJsYXlzLmxlbmd0aDsgKytvKSBsb29wKCBvICk7XG5cbiAgICByZXR1cm4ge3N0eWxlczogc3QsIGNsYXNzZXM6IGxpbmVDbGFzc2VzLmJnQ2xhc3MgfHwgbGluZUNsYXNzZXMudGV4dENsYXNzID8gbGluZUNsYXNzZXMgOiBudWxsfVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0TGluZVN0eWxlcyhjbSwgbGluZSwgdXBkYXRlRnJvbnRpZXIpIHtcbiAgICBpZiAoIWxpbmUuc3R5bGVzIHx8IGxpbmUuc3R5bGVzWzBdICE9IGNtLnN0YXRlLm1vZGVHZW4pIHtcbiAgICAgIHZhciBjb250ZXh0ID0gZ2V0Q29udGV4dEJlZm9yZShjbSwgbGluZU5vKGxpbmUpKTtcbiAgICAgIHZhciByZXNldFN0YXRlID0gbGluZS50ZXh0Lmxlbmd0aCA+IGNtLm9wdGlvbnMubWF4SGlnaGxpZ2h0TGVuZ3RoICYmIGNvcHlTdGF0ZShjbS5kb2MubW9kZSwgY29udGV4dC5zdGF0ZSk7XG4gICAgICB2YXIgcmVzdWx0ID0gaGlnaGxpZ2h0TGluZShjbSwgbGluZSwgY29udGV4dCk7XG4gICAgICBpZiAocmVzZXRTdGF0ZSkgeyBjb250ZXh0LnN0YXRlID0gcmVzZXRTdGF0ZTsgfVxuICAgICAgbGluZS5zdGF0ZUFmdGVyID0gY29udGV4dC5zYXZlKCFyZXNldFN0YXRlKTtcbiAgICAgIGxpbmUuc3R5bGVzID0gcmVzdWx0LnN0eWxlcztcbiAgICAgIGlmIChyZXN1bHQuY2xhc3NlcykgeyBsaW5lLnN0eWxlQ2xhc3NlcyA9IHJlc3VsdC5jbGFzc2VzOyB9XG4gICAgICBlbHNlIGlmIChsaW5lLnN0eWxlQ2xhc3NlcykgeyBsaW5lLnN0eWxlQ2xhc3NlcyA9IG51bGw7IH1cbiAgICAgIGlmICh1cGRhdGVGcm9udGllciA9PT0gY20uZG9jLmhpZ2hsaWdodEZyb250aWVyKVxuICAgICAgICB7IGNtLmRvYy5tb2RlRnJvbnRpZXIgPSBNYXRoLm1heChjbS5kb2MubW9kZUZyb250aWVyLCArK2NtLmRvYy5oaWdobGlnaHRGcm9udGllcik7IH1cbiAgICB9XG4gICAgcmV0dXJuIGxpbmUuc3R5bGVzXG4gIH1cblxuICBmdW5jdGlvbiBnZXRDb250ZXh0QmVmb3JlKGNtLCBuLCBwcmVjaXNlKSB7XG4gICAgdmFyIGRvYyA9IGNtLmRvYywgZGlzcGxheSA9IGNtLmRpc3BsYXk7XG4gICAgaWYgKCFkb2MubW9kZS5zdGFydFN0YXRlKSB7IHJldHVybiBuZXcgQ29udGV4dChkb2MsIHRydWUsIG4pIH1cbiAgICB2YXIgc3RhcnQgPSBmaW5kU3RhcnRMaW5lKGNtLCBuLCBwcmVjaXNlKTtcbiAgICB2YXIgc2F2ZWQgPSBzdGFydCA+IGRvYy5maXJzdCAmJiBnZXRMaW5lKGRvYywgc3RhcnQgLSAxKS5zdGF0ZUFmdGVyO1xuICAgIHZhciBjb250ZXh0ID0gc2F2ZWQgPyBDb250ZXh0LmZyb21TYXZlZChkb2MsIHNhdmVkLCBzdGFydCkgOiBuZXcgQ29udGV4dChkb2MsIHN0YXJ0U3RhdGUoZG9jLm1vZGUpLCBzdGFydCk7XG5cbiAgICBkb2MuaXRlcihzdGFydCwgbiwgZnVuY3Rpb24gKGxpbmUpIHtcbiAgICAgIHByb2Nlc3NMaW5lKGNtLCBsaW5lLnRleHQsIGNvbnRleHQpO1xuICAgICAgdmFyIHBvcyA9IGNvbnRleHQubGluZTtcbiAgICAgIGxpbmUuc3RhdGVBZnRlciA9IHBvcyA9PSBuIC0gMSB8fCBwb3MgJSA1ID09IDAgfHwgcG9zID49IGRpc3BsYXkudmlld0Zyb20gJiYgcG9zIDwgZGlzcGxheS52aWV3VG8gPyBjb250ZXh0LnNhdmUoKSA6IG51bGw7XG4gICAgICBjb250ZXh0Lm5leHRMaW5lKCk7XG4gICAgfSk7XG4gICAgaWYgKHByZWNpc2UpIHsgZG9jLm1vZGVGcm9udGllciA9IGNvbnRleHQubGluZTsgfVxuICAgIHJldHVybiBjb250ZXh0XG4gIH1cblxuICAvLyBMaWdodHdlaWdodCBmb3JtIG9mIGhpZ2hsaWdodCAtLSBwcm9jZWVkIG92ZXIgdGhpcyBsaW5lIGFuZFxuICAvLyB1cGRhdGUgc3RhdGUsIGJ1dCBkb24ndCBzYXZlIGEgc3R5bGUgYXJyYXkuIFVzZWQgZm9yIGxpbmVzIHRoYXRcbiAgLy8gYXJlbid0IGN1cnJlbnRseSB2aXNpYmxlLlxuICBmdW5jdGlvbiBwcm9jZXNzTGluZShjbSwgdGV4dCwgY29udGV4dCwgc3RhcnRBdCkge1xuICAgIHZhciBtb2RlID0gY20uZG9jLm1vZGU7XG4gICAgdmFyIHN0cmVhbSA9IG5ldyBTdHJpbmdTdHJlYW0odGV4dCwgY20ub3B0aW9ucy50YWJTaXplLCBjb250ZXh0KTtcbiAgICBzdHJlYW0uc3RhcnQgPSBzdHJlYW0ucG9zID0gc3RhcnRBdCB8fCAwO1xuICAgIGlmICh0ZXh0ID09IFwiXCIpIHsgY2FsbEJsYW5rTGluZShtb2RlLCBjb250ZXh0LnN0YXRlKTsgfVxuICAgIHdoaWxlICghc3RyZWFtLmVvbCgpKSB7XG4gICAgICByZWFkVG9rZW4obW9kZSwgc3RyZWFtLCBjb250ZXh0LnN0YXRlKTtcbiAgICAgIHN0cmVhbS5zdGFydCA9IHN0cmVhbS5wb3M7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2FsbEJsYW5rTGluZShtb2RlLCBzdGF0ZSkge1xuICAgIGlmIChtb2RlLmJsYW5rTGluZSkgeyByZXR1cm4gbW9kZS5ibGFua0xpbmUoc3RhdGUpIH1cbiAgICBpZiAoIW1vZGUuaW5uZXJNb2RlKSB7IHJldHVybiB9XG4gICAgdmFyIGlubmVyID0gaW5uZXJNb2RlKG1vZGUsIHN0YXRlKTtcbiAgICBpZiAoaW5uZXIubW9kZS5ibGFua0xpbmUpIHsgcmV0dXJuIGlubmVyLm1vZGUuYmxhbmtMaW5lKGlubmVyLnN0YXRlKSB9XG4gIH1cblxuICBmdW5jdGlvbiByZWFkVG9rZW4obW9kZSwgc3RyZWFtLCBzdGF0ZSwgaW5uZXIpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDEwOyBpKyspIHtcbiAgICAgIGlmIChpbm5lcikgeyBpbm5lclswXSA9IGlubmVyTW9kZShtb2RlLCBzdGF0ZSkubW9kZTsgfVxuICAgICAgdmFyIHN0eWxlID0gbW9kZS50b2tlbihzdHJlYW0sIHN0YXRlKTtcbiAgICAgIGlmIChzdHJlYW0ucG9zID4gc3RyZWFtLnN0YXJ0KSB7IHJldHVybiBzdHlsZSB9XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcIk1vZGUgXCIgKyBtb2RlLm5hbWUgKyBcIiBmYWlsZWQgdG8gYWR2YW5jZSBzdHJlYW0uXCIpXG4gIH1cblxuICB2YXIgVG9rZW4gPSBmdW5jdGlvbihzdHJlYW0sIHR5cGUsIHN0YXRlKSB7XG4gICAgdGhpcy5zdGFydCA9IHN0cmVhbS5zdGFydDsgdGhpcy5lbmQgPSBzdHJlYW0ucG9zO1xuICAgIHRoaXMuc3RyaW5nID0gc3RyZWFtLmN1cnJlbnQoKTtcbiAgICB0aGlzLnR5cGUgPSB0eXBlIHx8IG51bGw7XG4gICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICB9O1xuXG4gIC8vIFV0aWxpdHkgZm9yIGdldFRva2VuQXQgYW5kIGdldExpbmVUb2tlbnNcbiAgZnVuY3Rpb24gdGFrZVRva2VuKGNtLCBwb3MsIHByZWNpc2UsIGFzQXJyYXkpIHtcbiAgICB2YXIgZG9jID0gY20uZG9jLCBtb2RlID0gZG9jLm1vZGUsIHN0eWxlO1xuICAgIHBvcyA9IGNsaXBQb3MoZG9jLCBwb3MpO1xuICAgIHZhciBsaW5lID0gZ2V0TGluZShkb2MsIHBvcy5saW5lKSwgY29udGV4dCA9IGdldENvbnRleHRCZWZvcmUoY20sIHBvcy5saW5lLCBwcmVjaXNlKTtcbiAgICB2YXIgc3RyZWFtID0gbmV3IFN0cmluZ1N0cmVhbShsaW5lLnRleHQsIGNtLm9wdGlvbnMudGFiU2l6ZSwgY29udGV4dCksIHRva2VucztcbiAgICBpZiAoYXNBcnJheSkgeyB0b2tlbnMgPSBbXTsgfVxuICAgIHdoaWxlICgoYXNBcnJheSB8fCBzdHJlYW0ucG9zIDwgcG9zLmNoKSAmJiAhc3RyZWFtLmVvbCgpKSB7XG4gICAgICBzdHJlYW0uc3RhcnQgPSBzdHJlYW0ucG9zO1xuICAgICAgc3R5bGUgPSByZWFkVG9rZW4obW9kZSwgc3RyZWFtLCBjb250ZXh0LnN0YXRlKTtcbiAgICAgIGlmIChhc0FycmF5KSB7IHRva2Vucy5wdXNoKG5ldyBUb2tlbihzdHJlYW0sIHN0eWxlLCBjb3B5U3RhdGUoZG9jLm1vZGUsIGNvbnRleHQuc3RhdGUpKSk7IH1cbiAgICB9XG4gICAgcmV0dXJuIGFzQXJyYXkgPyB0b2tlbnMgOiBuZXcgVG9rZW4oc3RyZWFtLCBzdHlsZSwgY29udGV4dC5zdGF0ZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGV4dHJhY3RMaW5lQ2xhc3Nlcyh0eXBlLCBvdXRwdXQpIHtcbiAgICBpZiAodHlwZSkgeyBmb3IgKDs7KSB7XG4gICAgICB2YXIgbGluZUNsYXNzID0gdHlwZS5tYXRjaCgvKD86XnxcXHMrKWxpbmUtKGJhY2tncm91bmQtKT8oXFxTKykvKTtcbiAgICAgIGlmICghbGluZUNsYXNzKSB7IGJyZWFrIH1cbiAgICAgIHR5cGUgPSB0eXBlLnNsaWNlKDAsIGxpbmVDbGFzcy5pbmRleCkgKyB0eXBlLnNsaWNlKGxpbmVDbGFzcy5pbmRleCArIGxpbmVDbGFzc1swXS5sZW5ndGgpO1xuICAgICAgdmFyIHByb3AgPSBsaW5lQ2xhc3NbMV0gPyBcImJnQ2xhc3NcIiA6IFwidGV4dENsYXNzXCI7XG4gICAgICBpZiAob3V0cHV0W3Byb3BdID09IG51bGwpXG4gICAgICAgIHsgb3V0cHV0W3Byb3BdID0gbGluZUNsYXNzWzJdOyB9XG4gICAgICBlbHNlIGlmICghKG5ldyBSZWdFeHAoXCIoPzpefFxcXFxzKVwiICsgbGluZUNsYXNzWzJdICsgXCIoPzokfFxcXFxzKVwiKSkudGVzdChvdXRwdXRbcHJvcF0pKVxuICAgICAgICB7IG91dHB1dFtwcm9wXSArPSBcIiBcIiArIGxpbmVDbGFzc1syXTsgfVxuICAgIH0gfVxuICAgIHJldHVybiB0eXBlXG4gIH1cblxuICAvLyBSdW4gdGhlIGdpdmVuIG1vZGUncyBwYXJzZXIgb3ZlciBhIGxpbmUsIGNhbGxpbmcgZiBmb3IgZWFjaCB0b2tlbi5cbiAgZnVuY3Rpb24gcnVuTW9kZShjbSwgdGV4dCwgbW9kZSwgY29udGV4dCwgZiwgbGluZUNsYXNzZXMsIGZvcmNlVG9FbmQpIHtcbiAgICB2YXIgZmxhdHRlblNwYW5zID0gbW9kZS5mbGF0dGVuU3BhbnM7XG4gICAgaWYgKGZsYXR0ZW5TcGFucyA9PSBudWxsKSB7IGZsYXR0ZW5TcGFucyA9IGNtLm9wdGlvbnMuZmxhdHRlblNwYW5zOyB9XG4gICAgdmFyIGN1clN0YXJ0ID0gMCwgY3VyU3R5bGUgPSBudWxsO1xuICAgIHZhciBzdHJlYW0gPSBuZXcgU3RyaW5nU3RyZWFtKHRleHQsIGNtLm9wdGlvbnMudGFiU2l6ZSwgY29udGV4dCksIHN0eWxlO1xuICAgIHZhciBpbm5lciA9IGNtLm9wdGlvbnMuYWRkTW9kZUNsYXNzICYmIFtudWxsXTtcbiAgICBpZiAodGV4dCA9PSBcIlwiKSB7IGV4dHJhY3RMaW5lQ2xhc3NlcyhjYWxsQmxhbmtMaW5lKG1vZGUsIGNvbnRleHQuc3RhdGUpLCBsaW5lQ2xhc3Nlcyk7IH1cbiAgICB3aGlsZSAoIXN0cmVhbS5lb2woKSkge1xuICAgICAgaWYgKHN0cmVhbS5wb3MgPiBjbS5vcHRpb25zLm1heEhpZ2hsaWdodExlbmd0aCkge1xuICAgICAgICBmbGF0dGVuU3BhbnMgPSBmYWxzZTtcbiAgICAgICAgaWYgKGZvcmNlVG9FbmQpIHsgcHJvY2Vzc0xpbmUoY20sIHRleHQsIGNvbnRleHQsIHN0cmVhbS5wb3MpOyB9XG4gICAgICAgIHN0cmVhbS5wb3MgPSB0ZXh0Lmxlbmd0aDtcbiAgICAgICAgc3R5bGUgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3R5bGUgPSBleHRyYWN0TGluZUNsYXNzZXMocmVhZFRva2VuKG1vZGUsIHN0cmVhbSwgY29udGV4dC5zdGF0ZSwgaW5uZXIpLCBsaW5lQ2xhc3Nlcyk7XG4gICAgICB9XG4gICAgICBpZiAoaW5uZXIpIHtcbiAgICAgICAgdmFyIG1OYW1lID0gaW5uZXJbMF0ubmFtZTtcbiAgICAgICAgaWYgKG1OYW1lKSB7IHN0eWxlID0gXCJtLVwiICsgKHN0eWxlID8gbU5hbWUgKyBcIiBcIiArIHN0eWxlIDogbU5hbWUpOyB9XG4gICAgICB9XG4gICAgICBpZiAoIWZsYXR0ZW5TcGFucyB8fCBjdXJTdHlsZSAhPSBzdHlsZSkge1xuICAgICAgICB3aGlsZSAoY3VyU3RhcnQgPCBzdHJlYW0uc3RhcnQpIHtcbiAgICAgICAgICBjdXJTdGFydCA9IE1hdGgubWluKHN0cmVhbS5zdGFydCwgY3VyU3RhcnQgKyA1MDAwKTtcbiAgICAgICAgICBmKGN1clN0YXJ0LCBjdXJTdHlsZSk7XG4gICAgICAgIH1cbiAgICAgICAgY3VyU3R5bGUgPSBzdHlsZTtcbiAgICAgIH1cbiAgICAgIHN0cmVhbS5zdGFydCA9IHN0cmVhbS5wb3M7XG4gICAgfVxuICAgIHdoaWxlIChjdXJTdGFydCA8IHN0cmVhbS5wb3MpIHtcbiAgICAgIC8vIFdlYmtpdCBzZWVtcyB0byByZWZ1c2UgdG8gcmVuZGVyIHRleHQgbm9kZXMgbG9uZ2VyIHRoYW4gNTc0NDRcbiAgICAgIC8vIGNoYXJhY3RlcnMsIGFuZCByZXR1cm5zIGluYWNjdXJhdGUgbWVhc3VyZW1lbnRzIGluIG5vZGVzXG4gICAgICAvLyBzdGFydGluZyBhcm91bmQgNTAwMCBjaGFycy5cbiAgICAgIHZhciBwb3MgPSBNYXRoLm1pbihzdHJlYW0ucG9zLCBjdXJTdGFydCArIDUwMDApO1xuICAgICAgZihwb3MsIGN1clN0eWxlKTtcbiAgICAgIGN1clN0YXJ0ID0gcG9zO1xuICAgIH1cbiAgfVxuXG4gIC8vIEZpbmRzIHRoZSBsaW5lIHRvIHN0YXJ0IHdpdGggd2hlbiBzdGFydGluZyBhIHBhcnNlLiBUcmllcyB0b1xuICAvLyBmaW5kIGEgbGluZSB3aXRoIGEgc3RhdGVBZnRlciwgc28gdGhhdCBpdCBjYW4gc3RhcnQgd2l0aCBhXG4gIC8vIHZhbGlkIHN0YXRlLiBJZiB0aGF0IGZhaWxzLCBpdCByZXR1cm5zIHRoZSBsaW5lIHdpdGggdGhlXG4gIC8vIHNtYWxsZXN0IGluZGVudGF0aW9uLCB3aGljaCB0ZW5kcyB0byBuZWVkIHRoZSBsZWFzdCBjb250ZXh0IHRvXG4gIC8vIHBhcnNlIGNvcnJlY3RseS5cbiAgZnVuY3Rpb24gZmluZFN0YXJ0TGluZShjbSwgbiwgcHJlY2lzZSkge1xuICAgIHZhciBtaW5pbmRlbnQsIG1pbmxpbmUsIGRvYyA9IGNtLmRvYztcbiAgICB2YXIgbGltID0gcHJlY2lzZSA/IC0xIDogbiAtIChjbS5kb2MubW9kZS5pbm5lck1vZGUgPyAxMDAwIDogMTAwKTtcbiAgICBmb3IgKHZhciBzZWFyY2ggPSBuOyBzZWFyY2ggPiBsaW07IC0tc2VhcmNoKSB7XG4gICAgICBpZiAoc2VhcmNoIDw9IGRvYy5maXJzdCkgeyByZXR1cm4gZG9jLmZpcnN0IH1cbiAgICAgIHZhciBsaW5lID0gZ2V0TGluZShkb2MsIHNlYXJjaCAtIDEpLCBhZnRlciA9IGxpbmUuc3RhdGVBZnRlcjtcbiAgICAgIGlmIChhZnRlciAmJiAoIXByZWNpc2UgfHwgc2VhcmNoICsgKGFmdGVyIGluc3RhbmNlb2YgU2F2ZWRDb250ZXh0ID8gYWZ0ZXIubG9va0FoZWFkIDogMCkgPD0gZG9jLm1vZGVGcm9udGllcikpXG4gICAgICAgIHsgcmV0dXJuIHNlYXJjaCB9XG4gICAgICB2YXIgaW5kZW50ZWQgPSBjb3VudENvbHVtbihsaW5lLnRleHQsIG51bGwsIGNtLm9wdGlvbnMudGFiU2l6ZSk7XG4gICAgICBpZiAobWlubGluZSA9PSBudWxsIHx8IG1pbmluZGVudCA+IGluZGVudGVkKSB7XG4gICAgICAgIG1pbmxpbmUgPSBzZWFyY2ggLSAxO1xuICAgICAgICBtaW5pbmRlbnQgPSBpbmRlbnRlZDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1pbmxpbmVcbiAgfVxuXG4gIGZ1bmN0aW9uIHJldHJlYXRGcm9udGllcihkb2MsIG4pIHtcbiAgICBkb2MubW9kZUZyb250aWVyID0gTWF0aC5taW4oZG9jLm1vZGVGcm9udGllciwgbik7XG4gICAgaWYgKGRvYy5oaWdobGlnaHRGcm9udGllciA8IG4gLSAxMCkgeyByZXR1cm4gfVxuICAgIHZhciBzdGFydCA9IGRvYy5maXJzdDtcbiAgICBmb3IgKHZhciBsaW5lID0gbiAtIDE7IGxpbmUgPiBzdGFydDsgbGluZS0tKSB7XG4gICAgICB2YXIgc2F2ZWQgPSBnZXRMaW5lKGRvYywgbGluZSkuc3RhdGVBZnRlcjtcbiAgICAgIC8vIGNoYW5nZSBpcyBvbiAzXG4gICAgICAvLyBzdGF0ZSBvbiBsaW5lIDEgbG9va2VkIGFoZWFkIDIgLS0gc28gc2F3IDNcbiAgICAgIC8vIHRlc3QgMSArIDIgPCAzIHNob3VsZCBjb3ZlciB0aGlzXG4gICAgICBpZiAoc2F2ZWQgJiYgKCEoc2F2ZWQgaW5zdGFuY2VvZiBTYXZlZENvbnRleHQpIHx8IGxpbmUgKyBzYXZlZC5sb29rQWhlYWQgPCBuKSkge1xuICAgICAgICBzdGFydCA9IGxpbmUgKyAxO1xuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgICBkb2MuaGlnaGxpZ2h0RnJvbnRpZXIgPSBNYXRoLm1pbihkb2MuaGlnaGxpZ2h0RnJvbnRpZXIsIHN0YXJ0KTtcbiAgfVxuXG4gIC8vIE9wdGltaXplIHNvbWUgY29kZSB3aGVuIHRoZXNlIGZlYXR1cmVzIGFyZSBub3QgdXNlZC5cbiAgdmFyIHNhd1JlYWRPbmx5U3BhbnMgPSBmYWxzZSwgc2F3Q29sbGFwc2VkU3BhbnMgPSBmYWxzZTtcblxuICBmdW5jdGlvbiBzZWVSZWFkT25seVNwYW5zKCkge1xuICAgIHNhd1JlYWRPbmx5U3BhbnMgPSB0cnVlO1xuICB9XG5cbiAgZnVuY3Rpb24gc2VlQ29sbGFwc2VkU3BhbnMoKSB7XG4gICAgc2F3Q29sbGFwc2VkU3BhbnMgPSB0cnVlO1xuICB9XG5cbiAgLy8gVEVYVE1BUktFUiBTUEFOU1xuXG4gIGZ1bmN0aW9uIE1hcmtlZFNwYW4obWFya2VyLCBmcm9tLCB0bykge1xuICAgIHRoaXMubWFya2VyID0gbWFya2VyO1xuICAgIHRoaXMuZnJvbSA9IGZyb207IHRoaXMudG8gPSB0bztcbiAgfVxuXG4gIC8vIFNlYXJjaCBhbiBhcnJheSBvZiBzcGFucyBmb3IgYSBzcGFuIG1hdGNoaW5nIHRoZSBnaXZlbiBtYXJrZXIuXG4gIGZ1bmN0aW9uIGdldE1hcmtlZFNwYW5Gb3Ioc3BhbnMsIG1hcmtlcikge1xuICAgIGlmIChzcGFucykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgc3BhbiA9IHNwYW5zW2ldO1xuICAgICAgaWYgKHNwYW4ubWFya2VyID09IG1hcmtlcikgeyByZXR1cm4gc3BhbiB9XG4gICAgfSB9XG4gIH1cbiAgLy8gUmVtb3ZlIGEgc3BhbiBmcm9tIGFuIGFycmF5LCByZXR1cm5pbmcgdW5kZWZpbmVkIGlmIG5vIHNwYW5zIGFyZVxuICAvLyBsZWZ0ICh3ZSBkb24ndCBzdG9yZSBhcnJheXMgZm9yIGxpbmVzIHdpdGhvdXQgc3BhbnMpLlxuICBmdW5jdGlvbiByZW1vdmVNYXJrZWRTcGFuKHNwYW5zLCBzcGFuKSB7XG4gICAgdmFyIHI7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzcGFucy5sZW5ndGg7ICsraSlcbiAgICAgIHsgaWYgKHNwYW5zW2ldICE9IHNwYW4pIHsgKHIgfHwgKHIgPSBbXSkpLnB1c2goc3BhbnNbaV0pOyB9IH1cbiAgICByZXR1cm4gclxuICB9XG4gIC8vIEFkZCBhIHNwYW4gdG8gYSBsaW5lLlxuICBmdW5jdGlvbiBhZGRNYXJrZWRTcGFuKGxpbmUsIHNwYW4pIHtcbiAgICBsaW5lLm1hcmtlZFNwYW5zID0gbGluZS5tYXJrZWRTcGFucyA/IGxpbmUubWFya2VkU3BhbnMuY29uY2F0KFtzcGFuXSkgOiBbc3Bhbl07XG4gICAgc3Bhbi5tYXJrZXIuYXR0YWNoTGluZShsaW5lKTtcbiAgfVxuXG4gIC8vIFVzZWQgZm9yIHRoZSBhbGdvcml0aG0gdGhhdCBhZGp1c3RzIG1hcmtlcnMgZm9yIGEgY2hhbmdlIGluIHRoZVxuICAvLyBkb2N1bWVudC4gVGhlc2UgZnVuY3Rpb25zIGN1dCBhbiBhcnJheSBvZiBzcGFucyBhdCBhIGdpdmVuXG4gIC8vIGNoYXJhY3RlciBwb3NpdGlvbiwgcmV0dXJuaW5nIGFuIGFycmF5IG9mIHJlbWFpbmluZyBjaHVua3MgKG9yXG4gIC8vIHVuZGVmaW5lZCBpZiBub3RoaW5nIHJlbWFpbnMpLlxuICBmdW5jdGlvbiBtYXJrZWRTcGFuc0JlZm9yZShvbGQsIHN0YXJ0Q2gsIGlzSW5zZXJ0KSB7XG4gICAgdmFyIG53O1xuICAgIGlmIChvbGQpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBvbGQubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBzcGFuID0gb2xkW2ldLCBtYXJrZXIgPSBzcGFuLm1hcmtlcjtcbiAgICAgIHZhciBzdGFydHNCZWZvcmUgPSBzcGFuLmZyb20gPT0gbnVsbCB8fCAobWFya2VyLmluY2x1c2l2ZUxlZnQgPyBzcGFuLmZyb20gPD0gc3RhcnRDaCA6IHNwYW4uZnJvbSA8IHN0YXJ0Q2gpO1xuICAgICAgaWYgKHN0YXJ0c0JlZm9yZSB8fCBzcGFuLmZyb20gPT0gc3RhcnRDaCAmJiBtYXJrZXIudHlwZSA9PSBcImJvb2ttYXJrXCIgJiYgKCFpc0luc2VydCB8fCAhc3Bhbi5tYXJrZXIuaW5zZXJ0TGVmdCkpIHtcbiAgICAgICAgdmFyIGVuZHNBZnRlciA9IHNwYW4udG8gPT0gbnVsbCB8fCAobWFya2VyLmluY2x1c2l2ZVJpZ2h0ID8gc3Bhbi50byA+PSBzdGFydENoIDogc3Bhbi50byA+IHN0YXJ0Q2gpXG4gICAgICAgIDsobncgfHwgKG53ID0gW10pKS5wdXNoKG5ldyBNYXJrZWRTcGFuKG1hcmtlciwgc3Bhbi5mcm9tLCBlbmRzQWZ0ZXIgPyBudWxsIDogc3Bhbi50bykpO1xuICAgICAgfVxuICAgIH0gfVxuICAgIHJldHVybiBud1xuICB9XG4gIGZ1bmN0aW9uIG1hcmtlZFNwYW5zQWZ0ZXIob2xkLCBlbmRDaCwgaXNJbnNlcnQpIHtcbiAgICB2YXIgbnc7XG4gICAgaWYgKG9sZCkgeyBmb3IgKHZhciBpID0gMDsgaSA8IG9sZC5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIHNwYW4gPSBvbGRbaV0sIG1hcmtlciA9IHNwYW4ubWFya2VyO1xuICAgICAgdmFyIGVuZHNBZnRlciA9IHNwYW4udG8gPT0gbnVsbCB8fCAobWFya2VyLmluY2x1c2l2ZVJpZ2h0ID8gc3Bhbi50byA+PSBlbmRDaCA6IHNwYW4udG8gPiBlbmRDaCk7XG4gICAgICBpZiAoZW5kc0FmdGVyIHx8IHNwYW4uZnJvbSA9PSBlbmRDaCAmJiBtYXJrZXIudHlwZSA9PSBcImJvb2ttYXJrXCIgJiYgKCFpc0luc2VydCB8fCBzcGFuLm1hcmtlci5pbnNlcnRMZWZ0KSkge1xuICAgICAgICB2YXIgc3RhcnRzQmVmb3JlID0gc3Bhbi5mcm9tID09IG51bGwgfHwgKG1hcmtlci5pbmNsdXNpdmVMZWZ0ID8gc3Bhbi5mcm9tIDw9IGVuZENoIDogc3Bhbi5mcm9tIDwgZW5kQ2gpXG4gICAgICAgIDsobncgfHwgKG53ID0gW10pKS5wdXNoKG5ldyBNYXJrZWRTcGFuKG1hcmtlciwgc3RhcnRzQmVmb3JlID8gbnVsbCA6IHNwYW4uZnJvbSAtIGVuZENoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4udG8gPT0gbnVsbCA/IG51bGwgOiBzcGFuLnRvIC0gZW5kQ2gpKTtcbiAgICAgIH1cbiAgICB9IH1cbiAgICByZXR1cm4gbndcbiAgfVxuXG4gIC8vIEdpdmVuIGEgY2hhbmdlIG9iamVjdCwgY29tcHV0ZSB0aGUgbmV3IHNldCBvZiBtYXJrZXIgc3BhbnMgdGhhdFxuICAvLyBjb3ZlciB0aGUgbGluZSBpbiB3aGljaCB0aGUgY2hhbmdlIHRvb2sgcGxhY2UuIFJlbW92ZXMgc3BhbnNcbiAgLy8gZW50aXJlbHkgd2l0aGluIHRoZSBjaGFuZ2UsIHJlY29ubmVjdHMgc3BhbnMgYmVsb25naW5nIHRvIHRoZVxuICAvLyBzYW1lIG1hcmtlciB0aGF0IGFwcGVhciBvbiBib3RoIHNpZGVzIG9mIHRoZSBjaGFuZ2UsIGFuZCBjdXRzIG9mZlxuICAvLyBzcGFucyBwYXJ0aWFsbHkgd2l0aGluIHRoZSBjaGFuZ2UuIFJldHVybnMgYW4gYXJyYXkgb2Ygc3BhblxuICAvLyBhcnJheXMgd2l0aCBvbmUgZWxlbWVudCBmb3IgZWFjaCBsaW5lIGluIChhZnRlcikgdGhlIGNoYW5nZS5cbiAgZnVuY3Rpb24gc3RyZXRjaFNwYW5zT3ZlckNoYW5nZShkb2MsIGNoYW5nZSkge1xuICAgIGlmIChjaGFuZ2UuZnVsbCkgeyByZXR1cm4gbnVsbCB9XG4gICAgdmFyIG9sZEZpcnN0ID0gaXNMaW5lKGRvYywgY2hhbmdlLmZyb20ubGluZSkgJiYgZ2V0TGluZShkb2MsIGNoYW5nZS5mcm9tLmxpbmUpLm1hcmtlZFNwYW5zO1xuICAgIHZhciBvbGRMYXN0ID0gaXNMaW5lKGRvYywgY2hhbmdlLnRvLmxpbmUpICYmIGdldExpbmUoZG9jLCBjaGFuZ2UudG8ubGluZSkubWFya2VkU3BhbnM7XG4gICAgaWYgKCFvbGRGaXJzdCAmJiAhb2xkTGFzdCkgeyByZXR1cm4gbnVsbCB9XG5cbiAgICB2YXIgc3RhcnRDaCA9IGNoYW5nZS5mcm9tLmNoLCBlbmRDaCA9IGNoYW5nZS50by5jaCwgaXNJbnNlcnQgPSBjbXAoY2hhbmdlLmZyb20sIGNoYW5nZS50bykgPT0gMDtcbiAgICAvLyBHZXQgdGhlIHNwYW5zIHRoYXQgJ3N0aWNrIG91dCcgb24gYm90aCBzaWRlc1xuICAgIHZhciBmaXJzdCA9IG1hcmtlZFNwYW5zQmVmb3JlKG9sZEZpcnN0LCBzdGFydENoLCBpc0luc2VydCk7XG4gICAgdmFyIGxhc3QgPSBtYXJrZWRTcGFuc0FmdGVyKG9sZExhc3QsIGVuZENoLCBpc0luc2VydCk7XG5cbiAgICAvLyBOZXh0LCBtZXJnZSB0aG9zZSB0d28gZW5kc1xuICAgIHZhciBzYW1lTGluZSA9IGNoYW5nZS50ZXh0Lmxlbmd0aCA9PSAxLCBvZmZzZXQgPSBsc3QoY2hhbmdlLnRleHQpLmxlbmd0aCArIChzYW1lTGluZSA/IHN0YXJ0Q2ggOiAwKTtcbiAgICBpZiAoZmlyc3QpIHtcbiAgICAgIC8vIEZpeCB1cCAudG8gcHJvcGVydGllcyBvZiBmaXJzdFxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaXJzdC5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgc3BhbiA9IGZpcnN0W2ldO1xuICAgICAgICBpZiAoc3Bhbi50byA9PSBudWxsKSB7XG4gICAgICAgICAgdmFyIGZvdW5kID0gZ2V0TWFya2VkU3BhbkZvcihsYXN0LCBzcGFuLm1hcmtlcik7XG4gICAgICAgICAgaWYgKCFmb3VuZCkgeyBzcGFuLnRvID0gc3RhcnRDaDsgfVxuICAgICAgICAgIGVsc2UgaWYgKHNhbWVMaW5lKSB7IHNwYW4udG8gPSBmb3VuZC50byA9PSBudWxsID8gbnVsbCA6IGZvdW5kLnRvICsgb2Zmc2V0OyB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGxhc3QpIHtcbiAgICAgIC8vIEZpeCB1cCAuZnJvbSBpbiBsYXN0IChvciBtb3ZlIHRoZW0gaW50byBmaXJzdCBpbiBjYXNlIG9mIHNhbWVMaW5lKVxuICAgICAgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgbGFzdC5sZW5ndGg7ICsraSQxKSB7XG4gICAgICAgIHZhciBzcGFuJDEgPSBsYXN0W2kkMV07XG4gICAgICAgIGlmIChzcGFuJDEudG8gIT0gbnVsbCkgeyBzcGFuJDEudG8gKz0gb2Zmc2V0OyB9XG4gICAgICAgIGlmIChzcGFuJDEuZnJvbSA9PSBudWxsKSB7XG4gICAgICAgICAgdmFyIGZvdW5kJDEgPSBnZXRNYXJrZWRTcGFuRm9yKGZpcnN0LCBzcGFuJDEubWFya2VyKTtcbiAgICAgICAgICBpZiAoIWZvdW5kJDEpIHtcbiAgICAgICAgICAgIHNwYW4kMS5mcm9tID0gb2Zmc2V0O1xuICAgICAgICAgICAgaWYgKHNhbWVMaW5lKSB7IChmaXJzdCB8fCAoZmlyc3QgPSBbXSkpLnB1c2goc3BhbiQxKTsgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzcGFuJDEuZnJvbSArPSBvZmZzZXQ7XG4gICAgICAgICAgaWYgKHNhbWVMaW5lKSB7IChmaXJzdCB8fCAoZmlyc3QgPSBbXSkpLnB1c2goc3BhbiQxKTsgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIE1ha2Ugc3VyZSB3ZSBkaWRuJ3QgY3JlYXRlIGFueSB6ZXJvLWxlbmd0aCBzcGFuc1xuICAgIGlmIChmaXJzdCkgeyBmaXJzdCA9IGNsZWFyRW1wdHlTcGFucyhmaXJzdCk7IH1cbiAgICBpZiAobGFzdCAmJiBsYXN0ICE9IGZpcnN0KSB7IGxhc3QgPSBjbGVhckVtcHR5U3BhbnMobGFzdCk7IH1cblxuICAgIHZhciBuZXdNYXJrZXJzID0gW2ZpcnN0XTtcbiAgICBpZiAoIXNhbWVMaW5lKSB7XG4gICAgICAvLyBGaWxsIGdhcCB3aXRoIHdob2xlLWxpbmUtc3BhbnNcbiAgICAgIHZhciBnYXAgPSBjaGFuZ2UudGV4dC5sZW5ndGggLSAyLCBnYXBNYXJrZXJzO1xuICAgICAgaWYgKGdhcCA+IDAgJiYgZmlyc3QpXG4gICAgICAgIHsgZm9yICh2YXIgaSQyID0gMDsgaSQyIDwgZmlyc3QubGVuZ3RoOyArK2kkMilcbiAgICAgICAgICB7IGlmIChmaXJzdFtpJDJdLnRvID09IG51bGwpXG4gICAgICAgICAgICB7IChnYXBNYXJrZXJzIHx8IChnYXBNYXJrZXJzID0gW10pKS5wdXNoKG5ldyBNYXJrZWRTcGFuKGZpcnN0W2kkMl0ubWFya2VyLCBudWxsLCBudWxsKSk7IH0gfSB9XG4gICAgICBmb3IgKHZhciBpJDMgPSAwOyBpJDMgPCBnYXA7ICsraSQzKVxuICAgICAgICB7IG5ld01hcmtlcnMucHVzaChnYXBNYXJrZXJzKTsgfVxuICAgICAgbmV3TWFya2Vycy5wdXNoKGxhc3QpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3TWFya2Vyc1xuICB9XG5cbiAgLy8gUmVtb3ZlIHNwYW5zIHRoYXQgYXJlIGVtcHR5IGFuZCBkb24ndCBoYXZlIGEgY2xlYXJXaGVuRW1wdHlcbiAgLy8gb3B0aW9uIG9mIGZhbHNlLlxuICBmdW5jdGlvbiBjbGVhckVtcHR5U3BhbnMoc3BhbnMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgc3BhbiA9IHNwYW5zW2ldO1xuICAgICAgaWYgKHNwYW4uZnJvbSAhPSBudWxsICYmIHNwYW4uZnJvbSA9PSBzcGFuLnRvICYmIHNwYW4ubWFya2VyLmNsZWFyV2hlbkVtcHR5ICE9PSBmYWxzZSlcbiAgICAgICAgeyBzcGFucy5zcGxpY2UoaS0tLCAxKTsgfVxuICAgIH1cbiAgICBpZiAoIXNwYW5zLmxlbmd0aCkgeyByZXR1cm4gbnVsbCB9XG4gICAgcmV0dXJuIHNwYW5zXG4gIH1cblxuICAvLyBVc2VkIHRvICdjbGlwJyBvdXQgcmVhZE9ubHkgcmFuZ2VzIHdoZW4gbWFraW5nIGEgY2hhbmdlLlxuICBmdW5jdGlvbiByZW1vdmVSZWFkT25seVJhbmdlcyhkb2MsIGZyb20sIHRvKSB7XG4gICAgdmFyIG1hcmtlcnMgPSBudWxsO1xuICAgIGRvYy5pdGVyKGZyb20ubGluZSwgdG8ubGluZSArIDEsIGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgICBpZiAobGluZS5tYXJrZWRTcGFucykgeyBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmUubWFya2VkU3BhbnMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIG1hcmsgPSBsaW5lLm1hcmtlZFNwYW5zW2ldLm1hcmtlcjtcbiAgICAgICAgaWYgKG1hcmsucmVhZE9ubHkgJiYgKCFtYXJrZXJzIHx8IGluZGV4T2YobWFya2VycywgbWFyaykgPT0gLTEpKVxuICAgICAgICAgIHsgKG1hcmtlcnMgfHwgKG1hcmtlcnMgPSBbXSkpLnB1c2gobWFyayk7IH1cbiAgICAgIH0gfVxuICAgIH0pO1xuICAgIGlmICghbWFya2VycykgeyByZXR1cm4gbnVsbCB9XG4gICAgdmFyIHBhcnRzID0gW3tmcm9tOiBmcm9tLCB0bzogdG99XTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBtayA9IG1hcmtlcnNbaV0sIG0gPSBtay5maW5kKDApO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBwYXJ0cy5sZW5ndGg7ICsraikge1xuICAgICAgICB2YXIgcCA9IHBhcnRzW2pdO1xuICAgICAgICBpZiAoY21wKHAudG8sIG0uZnJvbSkgPCAwIHx8IGNtcChwLmZyb20sIG0udG8pID4gMCkgeyBjb250aW51ZSB9XG4gICAgICAgIHZhciBuZXdQYXJ0cyA9IFtqLCAxXSwgZGZyb20gPSBjbXAocC5mcm9tLCBtLmZyb20pLCBkdG8gPSBjbXAocC50bywgbS50byk7XG4gICAgICAgIGlmIChkZnJvbSA8IDAgfHwgIW1rLmluY2x1c2l2ZUxlZnQgJiYgIWRmcm9tKVxuICAgICAgICAgIHsgbmV3UGFydHMucHVzaCh7ZnJvbTogcC5mcm9tLCB0bzogbS5mcm9tfSk7IH1cbiAgICAgICAgaWYgKGR0byA+IDAgfHwgIW1rLmluY2x1c2l2ZVJpZ2h0ICYmICFkdG8pXG4gICAgICAgICAgeyBuZXdQYXJ0cy5wdXNoKHtmcm9tOiBtLnRvLCB0bzogcC50b30pOyB9XG4gICAgICAgIHBhcnRzLnNwbGljZS5hcHBseShwYXJ0cywgbmV3UGFydHMpO1xuICAgICAgICBqICs9IG5ld1BhcnRzLmxlbmd0aCAtIDM7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwYXJ0c1xuICB9XG5cbiAgLy8gQ29ubmVjdCBvciBkaXNjb25uZWN0IHNwYW5zIGZyb20gYSBsaW5lLlxuICBmdW5jdGlvbiBkZXRhY2hNYXJrZWRTcGFucyhsaW5lKSB7XG4gICAgdmFyIHNwYW5zID0gbGluZS5tYXJrZWRTcGFucztcbiAgICBpZiAoIXNwYW5zKSB7IHJldHVybiB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzcGFucy5sZW5ndGg7ICsraSlcbiAgICAgIHsgc3BhbnNbaV0ubWFya2VyLmRldGFjaExpbmUobGluZSk7IH1cbiAgICBsaW5lLm1hcmtlZFNwYW5zID0gbnVsbDtcbiAgfVxuICBmdW5jdGlvbiBhdHRhY2hNYXJrZWRTcGFucyhsaW5lLCBzcGFucykge1xuICAgIGlmICghc3BhbnMpIHsgcmV0dXJuIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgKytpKVxuICAgICAgeyBzcGFuc1tpXS5tYXJrZXIuYXR0YWNoTGluZShsaW5lKTsgfVxuICAgIGxpbmUubWFya2VkU3BhbnMgPSBzcGFucztcbiAgfVxuXG4gIC8vIEhlbHBlcnMgdXNlZCB3aGVuIGNvbXB1dGluZyB3aGljaCBvdmVybGFwcGluZyBjb2xsYXBzZWQgc3BhblxuICAvLyBjb3VudHMgYXMgdGhlIGxhcmdlciBvbmUuXG4gIGZ1bmN0aW9uIGV4dHJhTGVmdChtYXJrZXIpIHsgcmV0dXJuIG1hcmtlci5pbmNsdXNpdmVMZWZ0ID8gLTEgOiAwIH1cbiAgZnVuY3Rpb24gZXh0cmFSaWdodChtYXJrZXIpIHsgcmV0dXJuIG1hcmtlci5pbmNsdXNpdmVSaWdodCA/IDEgOiAwIH1cblxuICAvLyBSZXR1cm5zIGEgbnVtYmVyIGluZGljYXRpbmcgd2hpY2ggb2YgdHdvIG92ZXJsYXBwaW5nIGNvbGxhcHNlZFxuICAvLyBzcGFucyBpcyBsYXJnZXIgKGFuZCB0aHVzIGluY2x1ZGVzIHRoZSBvdGhlcikuIEZhbGxzIGJhY2sgdG9cbiAgLy8gY29tcGFyaW5nIGlkcyB3aGVuIHRoZSBzcGFucyBjb3ZlciBleGFjdGx5IHRoZSBzYW1lIHJhbmdlLlxuICBmdW5jdGlvbiBjb21wYXJlQ29sbGFwc2VkTWFya2VycyhhLCBiKSB7XG4gICAgdmFyIGxlbkRpZmYgPSBhLmxpbmVzLmxlbmd0aCAtIGIubGluZXMubGVuZ3RoO1xuICAgIGlmIChsZW5EaWZmICE9IDApIHsgcmV0dXJuIGxlbkRpZmYgfVxuICAgIHZhciBhUG9zID0gYS5maW5kKCksIGJQb3MgPSBiLmZpbmQoKTtcbiAgICB2YXIgZnJvbUNtcCA9IGNtcChhUG9zLmZyb20sIGJQb3MuZnJvbSkgfHwgZXh0cmFMZWZ0KGEpIC0gZXh0cmFMZWZ0KGIpO1xuICAgIGlmIChmcm9tQ21wKSB7IHJldHVybiAtZnJvbUNtcCB9XG4gICAgdmFyIHRvQ21wID0gY21wKGFQb3MudG8sIGJQb3MudG8pIHx8IGV4dHJhUmlnaHQoYSkgLSBleHRyYVJpZ2h0KGIpO1xuICAgIGlmICh0b0NtcCkgeyByZXR1cm4gdG9DbXAgfVxuICAgIHJldHVybiBiLmlkIC0gYS5pZFxuICB9XG5cbiAgLy8gRmluZCBvdXQgd2hldGhlciBhIGxpbmUgZW5kcyBvciBzdGFydHMgaW4gYSBjb2xsYXBzZWQgc3Bhbi4gSWZcbiAgLy8gc28sIHJldHVybiB0aGUgbWFya2VyIGZvciB0aGF0IHNwYW4uXG4gIGZ1bmN0aW9uIGNvbGxhcHNlZFNwYW5BdFNpZGUobGluZSwgc3RhcnQpIHtcbiAgICB2YXIgc3BzID0gc2F3Q29sbGFwc2VkU3BhbnMgJiYgbGluZS5tYXJrZWRTcGFucywgZm91bmQ7XG4gICAgaWYgKHNwcykgeyBmb3IgKHZhciBzcCA9ICh2b2lkIDApLCBpID0gMDsgaSA8IHNwcy5sZW5ndGg7ICsraSkge1xuICAgICAgc3AgPSBzcHNbaV07XG4gICAgICBpZiAoc3AubWFya2VyLmNvbGxhcHNlZCAmJiAoc3RhcnQgPyBzcC5mcm9tIDogc3AudG8pID09IG51bGwgJiZcbiAgICAgICAgICAoIWZvdW5kIHx8IGNvbXBhcmVDb2xsYXBzZWRNYXJrZXJzKGZvdW5kLCBzcC5tYXJrZXIpIDwgMCkpXG4gICAgICAgIHsgZm91bmQgPSBzcC5tYXJrZXI7IH1cbiAgICB9IH1cbiAgICByZXR1cm4gZm91bmRcbiAgfVxuICBmdW5jdGlvbiBjb2xsYXBzZWRTcGFuQXRTdGFydChsaW5lKSB7IHJldHVybiBjb2xsYXBzZWRTcGFuQXRTaWRlKGxpbmUsIHRydWUpIH1cbiAgZnVuY3Rpb24gY29sbGFwc2VkU3BhbkF0RW5kKGxpbmUpIHsgcmV0dXJuIGNvbGxhcHNlZFNwYW5BdFNpZGUobGluZSwgZmFsc2UpIH1cblxuICBmdW5jdGlvbiBjb2xsYXBzZWRTcGFuQXJvdW5kKGxpbmUsIGNoKSB7XG4gICAgdmFyIHNwcyA9IHNhd0NvbGxhcHNlZFNwYW5zICYmIGxpbmUubWFya2VkU3BhbnMsIGZvdW5kO1xuICAgIGlmIChzcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBzcHMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBzcCA9IHNwc1tpXTtcbiAgICAgIGlmIChzcC5tYXJrZXIuY29sbGFwc2VkICYmIChzcC5mcm9tID09IG51bGwgfHwgc3AuZnJvbSA8IGNoKSAmJiAoc3AudG8gPT0gbnVsbCB8fCBzcC50byA+IGNoKSAmJlxuICAgICAgICAgICghZm91bmQgfHwgY29tcGFyZUNvbGxhcHNlZE1hcmtlcnMoZm91bmQsIHNwLm1hcmtlcikgPCAwKSkgeyBmb3VuZCA9IHNwLm1hcmtlcjsgfVxuICAgIH0gfVxuICAgIHJldHVybiBmb3VuZFxuICB9XG5cbiAgLy8gVGVzdCB3aGV0aGVyIHRoZXJlIGV4aXN0cyBhIGNvbGxhcHNlZCBzcGFuIHRoYXQgcGFydGlhbGx5XG4gIC8vIG92ZXJsYXBzIChjb3ZlcnMgdGhlIHN0YXJ0IG9yIGVuZCwgYnV0IG5vdCBib3RoKSBvZiBhIG5ldyBzcGFuLlxuICAvLyBTdWNoIG92ZXJsYXAgaXMgbm90IGFsbG93ZWQuXG4gIGZ1bmN0aW9uIGNvbmZsaWN0aW5nQ29sbGFwc2VkUmFuZ2UoZG9jLCBsaW5lTm8sIGZyb20sIHRvLCBtYXJrZXIpIHtcbiAgICB2YXIgbGluZSA9IGdldExpbmUoZG9jLCBsaW5lTm8pO1xuICAgIHZhciBzcHMgPSBzYXdDb2xsYXBzZWRTcGFucyAmJiBsaW5lLm1hcmtlZFNwYW5zO1xuICAgIGlmIChzcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBzcHMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBzcCA9IHNwc1tpXTtcbiAgICAgIGlmICghc3AubWFya2VyLmNvbGxhcHNlZCkgeyBjb250aW51ZSB9XG4gICAgICB2YXIgZm91bmQgPSBzcC5tYXJrZXIuZmluZCgwKTtcbiAgICAgIHZhciBmcm9tQ21wID0gY21wKGZvdW5kLmZyb20sIGZyb20pIHx8IGV4dHJhTGVmdChzcC5tYXJrZXIpIC0gZXh0cmFMZWZ0KG1hcmtlcik7XG4gICAgICB2YXIgdG9DbXAgPSBjbXAoZm91bmQudG8sIHRvKSB8fCBleHRyYVJpZ2h0KHNwLm1hcmtlcikgLSBleHRyYVJpZ2h0KG1hcmtlcik7XG4gICAgICBpZiAoZnJvbUNtcCA+PSAwICYmIHRvQ21wIDw9IDAgfHwgZnJvbUNtcCA8PSAwICYmIHRvQ21wID49IDApIHsgY29udGludWUgfVxuICAgICAgaWYgKGZyb21DbXAgPD0gMCAmJiAoc3AubWFya2VyLmluY2x1c2l2ZVJpZ2h0ICYmIG1hcmtlci5pbmNsdXNpdmVMZWZ0ID8gY21wKGZvdW5kLnRvLCBmcm9tKSA+PSAwIDogY21wKGZvdW5kLnRvLCBmcm9tKSA+IDApIHx8XG4gICAgICAgICAgZnJvbUNtcCA+PSAwICYmIChzcC5tYXJrZXIuaW5jbHVzaXZlUmlnaHQgJiYgbWFya2VyLmluY2x1c2l2ZUxlZnQgPyBjbXAoZm91bmQuZnJvbSwgdG8pIDw9IDAgOiBjbXAoZm91bmQuZnJvbSwgdG8pIDwgMCkpXG4gICAgICAgIHsgcmV0dXJuIHRydWUgfVxuICAgIH0gfVxuICB9XG5cbiAgLy8gQSB2aXN1YWwgbGluZSBpcyBhIGxpbmUgYXMgZHJhd24gb24gdGhlIHNjcmVlbi4gRm9sZGluZywgZm9yXG4gIC8vIGV4YW1wbGUsIGNhbiBjYXVzZSBtdWx0aXBsZSBsb2dpY2FsIGxpbmVzIHRvIGFwcGVhciBvbiB0aGUgc2FtZVxuICAvLyB2aXN1YWwgbGluZS4gVGhpcyBmaW5kcyB0aGUgc3RhcnQgb2YgdGhlIHZpc3VhbCBsaW5lIHRoYXQgdGhlXG4gIC8vIGdpdmVuIGxpbmUgaXMgcGFydCBvZiAodXN1YWxseSB0aGF0IGlzIHRoZSBsaW5lIGl0c2VsZikuXG4gIGZ1bmN0aW9uIHZpc3VhbExpbmUobGluZSkge1xuICAgIHZhciBtZXJnZWQ7XG4gICAgd2hpbGUgKG1lcmdlZCA9IGNvbGxhcHNlZFNwYW5BdFN0YXJ0KGxpbmUpKVxuICAgICAgeyBsaW5lID0gbWVyZ2VkLmZpbmQoLTEsIHRydWUpLmxpbmU7IH1cbiAgICByZXR1cm4gbGluZVxuICB9XG5cbiAgZnVuY3Rpb24gdmlzdWFsTGluZUVuZChsaW5lKSB7XG4gICAgdmFyIG1lcmdlZDtcbiAgICB3aGlsZSAobWVyZ2VkID0gY29sbGFwc2VkU3BhbkF0RW5kKGxpbmUpKVxuICAgICAgeyBsaW5lID0gbWVyZ2VkLmZpbmQoMSwgdHJ1ZSkubGluZTsgfVxuICAgIHJldHVybiBsaW5lXG4gIH1cblxuICAvLyBSZXR1cm5zIGFuIGFycmF5IG9mIGxvZ2ljYWwgbGluZXMgdGhhdCBjb250aW51ZSB0aGUgdmlzdWFsIGxpbmVcbiAgLy8gc3RhcnRlZCBieSB0aGUgYXJndW1lbnQsIG9yIHVuZGVmaW5lZCBpZiB0aGVyZSBhcmUgbm8gc3VjaCBsaW5lcy5cbiAgZnVuY3Rpb24gdmlzdWFsTGluZUNvbnRpbnVlZChsaW5lKSB7XG4gICAgdmFyIG1lcmdlZCwgbGluZXM7XG4gICAgd2hpbGUgKG1lcmdlZCA9IGNvbGxhcHNlZFNwYW5BdEVuZChsaW5lKSkge1xuICAgICAgbGluZSA9IG1lcmdlZC5maW5kKDEsIHRydWUpLmxpbmVcbiAgICAgIDsobGluZXMgfHwgKGxpbmVzID0gW10pKS5wdXNoKGxpbmUpO1xuICAgIH1cbiAgICByZXR1cm4gbGluZXNcbiAgfVxuXG4gIC8vIEdldCB0aGUgbGluZSBudW1iZXIgb2YgdGhlIHN0YXJ0IG9mIHRoZSB2aXN1YWwgbGluZSB0aGF0IHRoZVxuICAvLyBnaXZlbiBsaW5lIG51bWJlciBpcyBwYXJ0IG9mLlxuICBmdW5jdGlvbiB2aXN1YWxMaW5lTm8oZG9jLCBsaW5lTikge1xuICAgIHZhciBsaW5lID0gZ2V0TGluZShkb2MsIGxpbmVOKSwgdmlzID0gdmlzdWFsTGluZShsaW5lKTtcbiAgICBpZiAobGluZSA9PSB2aXMpIHsgcmV0dXJuIGxpbmVOIH1cbiAgICByZXR1cm4gbGluZU5vKHZpcylcbiAgfVxuXG4gIC8vIEdldCB0aGUgbGluZSBudW1iZXIgb2YgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IHZpc3VhbCBsaW5lIGFmdGVyXG4gIC8vIHRoZSBnaXZlbiBsaW5lLlxuICBmdW5jdGlvbiB2aXN1YWxMaW5lRW5kTm8oZG9jLCBsaW5lTikge1xuICAgIGlmIChsaW5lTiA+IGRvYy5sYXN0TGluZSgpKSB7IHJldHVybiBsaW5lTiB9XG4gICAgdmFyIGxpbmUgPSBnZXRMaW5lKGRvYywgbGluZU4pLCBtZXJnZWQ7XG4gICAgaWYgKCFsaW5lSXNIaWRkZW4oZG9jLCBsaW5lKSkgeyByZXR1cm4gbGluZU4gfVxuICAgIHdoaWxlIChtZXJnZWQgPSBjb2xsYXBzZWRTcGFuQXRFbmQobGluZSkpXG4gICAgICB7IGxpbmUgPSBtZXJnZWQuZmluZCgxLCB0cnVlKS5saW5lOyB9XG4gICAgcmV0dXJuIGxpbmVObyhsaW5lKSArIDFcbiAgfVxuXG4gIC8vIENvbXB1dGUgd2hldGhlciBhIGxpbmUgaXMgaGlkZGVuLiBMaW5lcyBjb3VudCBhcyBoaWRkZW4gd2hlbiB0aGV5XG4gIC8vIGFyZSBwYXJ0IG9mIGEgdmlzdWFsIGxpbmUgdGhhdCBzdGFydHMgd2l0aCBhbm90aGVyIGxpbmUsIG9yIHdoZW5cbiAgLy8gdGhleSBhcmUgZW50aXJlbHkgY292ZXJlZCBieSBjb2xsYXBzZWQsIG5vbi13aWRnZXQgc3Bhbi5cbiAgZnVuY3Rpb24gbGluZUlzSGlkZGVuKGRvYywgbGluZSkge1xuICAgIHZhciBzcHMgPSBzYXdDb2xsYXBzZWRTcGFucyAmJiBsaW5lLm1hcmtlZFNwYW5zO1xuICAgIGlmIChzcHMpIHsgZm9yICh2YXIgc3AgPSAodm9pZCAwKSwgaSA9IDA7IGkgPCBzcHMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHNwID0gc3BzW2ldO1xuICAgICAgaWYgKCFzcC5tYXJrZXIuY29sbGFwc2VkKSB7IGNvbnRpbnVlIH1cbiAgICAgIGlmIChzcC5mcm9tID09IG51bGwpIHsgcmV0dXJuIHRydWUgfVxuICAgICAgaWYgKHNwLm1hcmtlci53aWRnZXROb2RlKSB7IGNvbnRpbnVlIH1cbiAgICAgIGlmIChzcC5mcm9tID09IDAgJiYgc3AubWFya2VyLmluY2x1c2l2ZUxlZnQgJiYgbGluZUlzSGlkZGVuSW5uZXIoZG9jLCBsaW5lLCBzcCkpXG4gICAgICAgIHsgcmV0dXJuIHRydWUgfVxuICAgIH0gfVxuICB9XG4gIGZ1bmN0aW9uIGxpbmVJc0hpZGRlbklubmVyKGRvYywgbGluZSwgc3Bhbikge1xuICAgIGlmIChzcGFuLnRvID09IG51bGwpIHtcbiAgICAgIHZhciBlbmQgPSBzcGFuLm1hcmtlci5maW5kKDEsIHRydWUpO1xuICAgICAgcmV0dXJuIGxpbmVJc0hpZGRlbklubmVyKGRvYywgZW5kLmxpbmUsIGdldE1hcmtlZFNwYW5Gb3IoZW5kLmxpbmUubWFya2VkU3BhbnMsIHNwYW4ubWFya2VyKSlcbiAgICB9XG4gICAgaWYgKHNwYW4ubWFya2VyLmluY2x1c2l2ZVJpZ2h0ICYmIHNwYW4udG8gPT0gbGluZS50ZXh0Lmxlbmd0aClcbiAgICAgIHsgcmV0dXJuIHRydWUgfVxuICAgIGZvciAodmFyIHNwID0gKHZvaWQgMCksIGkgPSAwOyBpIDwgbGluZS5tYXJrZWRTcGFucy5sZW5ndGg7ICsraSkge1xuICAgICAgc3AgPSBsaW5lLm1hcmtlZFNwYW5zW2ldO1xuICAgICAgaWYgKHNwLm1hcmtlci5jb2xsYXBzZWQgJiYgIXNwLm1hcmtlci53aWRnZXROb2RlICYmIHNwLmZyb20gPT0gc3Bhbi50byAmJlxuICAgICAgICAgIChzcC50byA9PSBudWxsIHx8IHNwLnRvICE9IHNwYW4uZnJvbSkgJiZcbiAgICAgICAgICAoc3AubWFya2VyLmluY2x1c2l2ZUxlZnQgfHwgc3Bhbi5tYXJrZXIuaW5jbHVzaXZlUmlnaHQpICYmXG4gICAgICAgICAgbGluZUlzSGlkZGVuSW5uZXIoZG9jLCBsaW5lLCBzcCkpIHsgcmV0dXJuIHRydWUgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEZpbmQgdGhlIGhlaWdodCBhYm92ZSB0aGUgZ2l2ZW4gbGluZS5cbiAgZnVuY3Rpb24gaGVpZ2h0QXRMaW5lKGxpbmVPYmopIHtcbiAgICBsaW5lT2JqID0gdmlzdWFsTGluZShsaW5lT2JqKTtcblxuICAgIHZhciBoID0gMCwgY2h1bmsgPSBsaW5lT2JqLnBhcmVudDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNodW5rLmxpbmVzLmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgbGluZSA9IGNodW5rLmxpbmVzW2ldO1xuICAgICAgaWYgKGxpbmUgPT0gbGluZU9iaikgeyBicmVhayB9XG4gICAgICBlbHNlIHsgaCArPSBsaW5lLmhlaWdodDsgfVxuICAgIH1cbiAgICBmb3IgKHZhciBwID0gY2h1bmsucGFyZW50OyBwOyBjaHVuayA9IHAsIHAgPSBjaHVuay5wYXJlbnQpIHtcbiAgICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IHAuY2hpbGRyZW4ubGVuZ3RoOyArK2kkMSkge1xuICAgICAgICB2YXIgY3VyID0gcC5jaGlsZHJlbltpJDFdO1xuICAgICAgICBpZiAoY3VyID09IGNodW5rKSB7IGJyZWFrIH1cbiAgICAgICAgZWxzZSB7IGggKz0gY3VyLmhlaWdodDsgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaFxuICB9XG5cbiAgLy8gQ29tcHV0ZSB0aGUgY2hhcmFjdGVyIGxlbmd0aCBvZiBhIGxpbmUsIHRha2luZyBpbnRvIGFjY291bnRcbiAgLy8gY29sbGFwc2VkIHJhbmdlcyAoc2VlIG1hcmtUZXh0KSB0aGF0IG1pZ2h0IGhpZGUgcGFydHMsIGFuZCBqb2luXG4gIC8vIG90aGVyIGxpbmVzIG9udG8gaXQuXG4gIGZ1bmN0aW9uIGxpbmVMZW5ndGgobGluZSkge1xuICAgIGlmIChsaW5lLmhlaWdodCA9PSAwKSB7IHJldHVybiAwIH1cbiAgICB2YXIgbGVuID0gbGluZS50ZXh0Lmxlbmd0aCwgbWVyZ2VkLCBjdXIgPSBsaW5lO1xuICAgIHdoaWxlIChtZXJnZWQgPSBjb2xsYXBzZWRTcGFuQXRTdGFydChjdXIpKSB7XG4gICAgICB2YXIgZm91bmQgPSBtZXJnZWQuZmluZCgwLCB0cnVlKTtcbiAgICAgIGN1ciA9IGZvdW5kLmZyb20ubGluZTtcbiAgICAgIGxlbiArPSBmb3VuZC5mcm9tLmNoIC0gZm91bmQudG8uY2g7XG4gICAgfVxuICAgIGN1ciA9IGxpbmU7XG4gICAgd2hpbGUgKG1lcmdlZCA9IGNvbGxhcHNlZFNwYW5BdEVuZChjdXIpKSB7XG4gICAgICB2YXIgZm91bmQkMSA9IG1lcmdlZC5maW5kKDAsIHRydWUpO1xuICAgICAgbGVuIC09IGN1ci50ZXh0Lmxlbmd0aCAtIGZvdW5kJDEuZnJvbS5jaDtcbiAgICAgIGN1ciA9IGZvdW5kJDEudG8ubGluZTtcbiAgICAgIGxlbiArPSBjdXIudGV4dC5sZW5ndGggLSBmb3VuZCQxLnRvLmNoO1xuICAgIH1cbiAgICByZXR1cm4gbGVuXG4gIH1cblxuICAvLyBGaW5kIHRoZSBsb25nZXN0IGxpbmUgaW4gdGhlIGRvY3VtZW50LlxuICBmdW5jdGlvbiBmaW5kTWF4TGluZShjbSkge1xuICAgIHZhciBkID0gY20uZGlzcGxheSwgZG9jID0gY20uZG9jO1xuICAgIGQubWF4TGluZSA9IGdldExpbmUoZG9jLCBkb2MuZmlyc3QpO1xuICAgIGQubWF4TGluZUxlbmd0aCA9IGxpbmVMZW5ndGgoZC5tYXhMaW5lKTtcbiAgICBkLm1heExpbmVDaGFuZ2VkID0gdHJ1ZTtcbiAgICBkb2MuaXRlcihmdW5jdGlvbiAobGluZSkge1xuICAgICAgdmFyIGxlbiA9IGxpbmVMZW5ndGgobGluZSk7XG4gICAgICBpZiAobGVuID4gZC5tYXhMaW5lTGVuZ3RoKSB7XG4gICAgICAgIGQubWF4TGluZUxlbmd0aCA9IGxlbjtcbiAgICAgICAgZC5tYXhMaW5lID0gbGluZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIExJTkUgREFUQSBTVFJVQ1RVUkVcblxuICAvLyBMaW5lIG9iamVjdHMuIFRoZXNlIGhvbGQgc3RhdGUgcmVsYXRlZCB0byBhIGxpbmUsIGluY2x1ZGluZ1xuICAvLyBoaWdobGlnaHRpbmcgaW5mbyAodGhlIHN0eWxlcyBhcnJheSkuXG4gIHZhciBMaW5lID0gZnVuY3Rpb24odGV4dCwgbWFya2VkU3BhbnMsIGVzdGltYXRlSGVpZ2h0KSB7XG4gICAgdGhpcy50ZXh0ID0gdGV4dDtcbiAgICBhdHRhY2hNYXJrZWRTcGFucyh0aGlzLCBtYXJrZWRTcGFucyk7XG4gICAgdGhpcy5oZWlnaHQgPSBlc3RpbWF0ZUhlaWdodCA/IGVzdGltYXRlSGVpZ2h0KHRoaXMpIDogMTtcbiAgfTtcblxuICBMaW5lLnByb3RvdHlwZS5saW5lTm8gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBsaW5lTm8odGhpcykgfTtcbiAgZXZlbnRNaXhpbihMaW5lKTtcblxuICAvLyBDaGFuZ2UgdGhlIGNvbnRlbnQgKHRleHQsIG1hcmtlcnMpIG9mIGEgbGluZS4gQXV0b21hdGljYWxseVxuICAvLyBpbnZhbGlkYXRlcyBjYWNoZWQgaW5mb3JtYXRpb24gYW5kIHRyaWVzIHRvIHJlLWVzdGltYXRlIHRoZVxuICAvLyBsaW5lJ3MgaGVpZ2h0LlxuICBmdW5jdGlvbiB1cGRhdGVMaW5lKGxpbmUsIHRleHQsIG1hcmtlZFNwYW5zLCBlc3RpbWF0ZUhlaWdodCkge1xuICAgIGxpbmUudGV4dCA9IHRleHQ7XG4gICAgaWYgKGxpbmUuc3RhdGVBZnRlcikgeyBsaW5lLnN0YXRlQWZ0ZXIgPSBudWxsOyB9XG4gICAgaWYgKGxpbmUuc3R5bGVzKSB7IGxpbmUuc3R5bGVzID0gbnVsbDsgfVxuICAgIGlmIChsaW5lLm9yZGVyICE9IG51bGwpIHsgbGluZS5vcmRlciA9IG51bGw7IH1cbiAgICBkZXRhY2hNYXJrZWRTcGFucyhsaW5lKTtcbiAgICBhdHRhY2hNYXJrZWRTcGFucyhsaW5lLCBtYXJrZWRTcGFucyk7XG4gICAgdmFyIGVzdEhlaWdodCA9IGVzdGltYXRlSGVpZ2h0ID8gZXN0aW1hdGVIZWlnaHQobGluZSkgOiAxO1xuICAgIGlmIChlc3RIZWlnaHQgIT0gbGluZS5oZWlnaHQpIHsgdXBkYXRlTGluZUhlaWdodChsaW5lLCBlc3RIZWlnaHQpOyB9XG4gIH1cblxuICAvLyBEZXRhY2ggYSBsaW5lIGZyb20gdGhlIGRvY3VtZW50IHRyZWUgYW5kIGl0cyBtYXJrZXJzLlxuICBmdW5jdGlvbiBjbGVhblVwTGluZShsaW5lKSB7XG4gICAgbGluZS5wYXJlbnQgPSBudWxsO1xuICAgIGRldGFjaE1hcmtlZFNwYW5zKGxpbmUpO1xuICB9XG5cbiAgLy8gQ29udmVydCBhIHN0eWxlIGFzIHJldHVybmVkIGJ5IGEgbW9kZSAoZWl0aGVyIG51bGwsIG9yIGEgc3RyaW5nXG4gIC8vIGNvbnRhaW5pbmcgb25lIG9yIG1vcmUgc3R5bGVzKSB0byBhIENTUyBzdHlsZS4gVGhpcyBpcyBjYWNoZWQsXG4gIC8vIGFuZCBhbHNvIGxvb2tzIGZvciBsaW5lLXdpZGUgc3R5bGVzLlxuICB2YXIgc3R5bGVUb0NsYXNzQ2FjaGUgPSB7fSwgc3R5bGVUb0NsYXNzQ2FjaGVXaXRoTW9kZSA9IHt9O1xuICBmdW5jdGlvbiBpbnRlcnByZXRUb2tlblN0eWxlKHN0eWxlLCBvcHRpb25zKSB7XG4gICAgaWYgKCFzdHlsZSB8fCAvXlxccyokLy50ZXN0KHN0eWxlKSkgeyByZXR1cm4gbnVsbCB9XG4gICAgdmFyIGNhY2hlID0gb3B0aW9ucy5hZGRNb2RlQ2xhc3MgPyBzdHlsZVRvQ2xhc3NDYWNoZVdpdGhNb2RlIDogc3R5bGVUb0NsYXNzQ2FjaGU7XG4gICAgcmV0dXJuIGNhY2hlW3N0eWxlXSB8fFxuICAgICAgKGNhY2hlW3N0eWxlXSA9IHN0eWxlLnJlcGxhY2UoL1xcUysvZywgXCJjbS0kJlwiKSlcbiAgfVxuXG4gIC8vIFJlbmRlciB0aGUgRE9NIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0ZXh0IG9mIGEgbGluZS4gQWxzbyBidWlsZHNcbiAgLy8gdXAgYSAnbGluZSBtYXAnLCB3aGljaCBwb2ludHMgYXQgdGhlIERPTSBub2RlcyB0aGF0IHJlcHJlc2VudFxuICAvLyBzcGVjaWZpYyBzdHJldGNoZXMgb2YgdGV4dCwgYW5kIGlzIHVzZWQgYnkgdGhlIG1lYXN1cmluZyBjb2RlLlxuICAvLyBUaGUgcmV0dXJuZWQgb2JqZWN0IGNvbnRhaW5zIHRoZSBET00gbm9kZSwgdGhpcyBtYXAsIGFuZFxuICAvLyBpbmZvcm1hdGlvbiBhYm91dCBsaW5lLXdpZGUgc3R5bGVzIHRoYXQgd2VyZSBzZXQgYnkgdGhlIG1vZGUuXG4gIGZ1bmN0aW9uIGJ1aWxkTGluZUNvbnRlbnQoY20sIGxpbmVWaWV3KSB7XG4gICAgLy8gVGhlIHBhZGRpbmctcmlnaHQgZm9yY2VzIHRoZSBlbGVtZW50IHRvIGhhdmUgYSAnYm9yZGVyJywgd2hpY2hcbiAgICAvLyBpcyBuZWVkZWQgb24gV2Via2l0IHRvIGJlIGFibGUgdG8gZ2V0IGxpbmUtbGV2ZWwgYm91bmRpbmdcbiAgICAvLyByZWN0YW5nbGVzIGZvciBpdCAoaW4gbWVhc3VyZUNoYXIpLlxuICAgIHZhciBjb250ZW50ID0gZWx0UChcInNwYW5cIiwgbnVsbCwgbnVsbCwgd2Via2l0ID8gXCJwYWRkaW5nLXJpZ2h0OiAuMXB4XCIgOiBudWxsKTtcbiAgICB2YXIgYnVpbGRlciA9IHtwcmU6IGVsdFAoXCJwcmVcIiwgW2NvbnRlbnRdLCBcIkNvZGVNaXJyb3ItbGluZVwiKSwgY29udGVudDogY29udGVudCxcbiAgICAgICAgICAgICAgICAgICBjb2w6IDAsIHBvczogMCwgY206IGNtLFxuICAgICAgICAgICAgICAgICAgIHRyYWlsaW5nU3BhY2U6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgIHNwbGl0U3BhY2VzOiBjbS5nZXRPcHRpb24oXCJsaW5lV3JhcHBpbmdcIil9O1xuICAgIGxpbmVWaWV3Lm1lYXN1cmUgPSB7fTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgbG9naWNhbCBsaW5lcyB0aGF0IG1ha2UgdXAgdGhpcyB2aXN1YWwgbGluZS5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8PSAobGluZVZpZXcucmVzdCA/IGxpbmVWaWV3LnJlc3QubGVuZ3RoIDogMCk7IGkrKykge1xuICAgICAgdmFyIGxpbmUgPSBpID8gbGluZVZpZXcucmVzdFtpIC0gMV0gOiBsaW5lVmlldy5saW5lLCBvcmRlciA9ICh2b2lkIDApO1xuICAgICAgYnVpbGRlci5wb3MgPSAwO1xuICAgICAgYnVpbGRlci5hZGRUb2tlbiA9IGJ1aWxkVG9rZW47XG4gICAgICAvLyBPcHRpb25hbGx5IHdpcmUgaW4gc29tZSBoYWNrcyBpbnRvIHRoZSB0b2tlbi1yZW5kZXJpbmdcbiAgICAgIC8vIGFsZ29yaXRobSwgdG8gZGVhbCB3aXRoIGJyb3dzZXIgcXVpcmtzLlxuICAgICAgaWYgKGhhc0JhZEJpZGlSZWN0cyhjbS5kaXNwbGF5Lm1lYXN1cmUpICYmIChvcmRlciA9IGdldE9yZGVyKGxpbmUsIGNtLmRvYy5kaXJlY3Rpb24pKSlcbiAgICAgICAgeyBidWlsZGVyLmFkZFRva2VuID0gYnVpbGRUb2tlbkJhZEJpZGkoYnVpbGRlci5hZGRUb2tlbiwgb3JkZXIpOyB9XG4gICAgICBidWlsZGVyLm1hcCA9IFtdO1xuICAgICAgdmFyIGFsbG93RnJvbnRpZXJVcGRhdGUgPSBsaW5lVmlldyAhPSBjbS5kaXNwbGF5LmV4dGVybmFsTWVhc3VyZWQgJiYgbGluZU5vKGxpbmUpO1xuICAgICAgaW5zZXJ0TGluZUNvbnRlbnQobGluZSwgYnVpbGRlciwgZ2V0TGluZVN0eWxlcyhjbSwgbGluZSwgYWxsb3dGcm9udGllclVwZGF0ZSkpO1xuICAgICAgaWYgKGxpbmUuc3R5bGVDbGFzc2VzKSB7XG4gICAgICAgIGlmIChsaW5lLnN0eWxlQ2xhc3Nlcy5iZ0NsYXNzKVxuICAgICAgICAgIHsgYnVpbGRlci5iZ0NsYXNzID0gam9pbkNsYXNzZXMobGluZS5zdHlsZUNsYXNzZXMuYmdDbGFzcywgYnVpbGRlci5iZ0NsYXNzIHx8IFwiXCIpOyB9XG4gICAgICAgIGlmIChsaW5lLnN0eWxlQ2xhc3Nlcy50ZXh0Q2xhc3MpXG4gICAgICAgICAgeyBidWlsZGVyLnRleHRDbGFzcyA9IGpvaW5DbGFzc2VzKGxpbmUuc3R5bGVDbGFzc2VzLnRleHRDbGFzcywgYnVpbGRlci50ZXh0Q2xhc3MgfHwgXCJcIik7IH1cbiAgICAgIH1cblxuICAgICAgLy8gRW5zdXJlIGF0IGxlYXN0IGEgc2luZ2xlIG5vZGUgaXMgcHJlc2VudCwgZm9yIG1lYXN1cmluZy5cbiAgICAgIGlmIChidWlsZGVyLm1hcC5sZW5ndGggPT0gMClcbiAgICAgICAgeyBidWlsZGVyLm1hcC5wdXNoKDAsIDAsIGJ1aWxkZXIuY29udGVudC5hcHBlbmRDaGlsZCh6ZXJvV2lkdGhFbGVtZW50KGNtLmRpc3BsYXkubWVhc3VyZSkpKTsgfVxuXG4gICAgICAvLyBTdG9yZSB0aGUgbWFwIGFuZCBhIGNhY2hlIG9iamVjdCBmb3IgdGhlIGN1cnJlbnQgbG9naWNhbCBsaW5lXG4gICAgICBpZiAoaSA9PSAwKSB7XG4gICAgICAgIGxpbmVWaWV3Lm1lYXN1cmUubWFwID0gYnVpbGRlci5tYXA7XG4gICAgICAgIGxpbmVWaWV3Lm1lYXN1cmUuY2FjaGUgPSB7fTtcbiAgICAgIH0gZWxzZSB7XG4gIChsaW5lVmlldy5tZWFzdXJlLm1hcHMgfHwgKGxpbmVWaWV3Lm1lYXN1cmUubWFwcyA9IFtdKSkucHVzaChidWlsZGVyLm1hcClcbiAgICAgICAgOyhsaW5lVmlldy5tZWFzdXJlLmNhY2hlcyB8fCAobGluZVZpZXcubWVhc3VyZS5jYWNoZXMgPSBbXSkpLnB1c2goe30pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNlZSBpc3N1ZSAjMjkwMVxuICAgIGlmICh3ZWJraXQpIHtcbiAgICAgIHZhciBsYXN0ID0gYnVpbGRlci5jb250ZW50Lmxhc3RDaGlsZDtcbiAgICAgIGlmICgvXFxiY20tdGFiXFxiLy50ZXN0KGxhc3QuY2xhc3NOYW1lKSB8fCAobGFzdC5xdWVyeVNlbGVjdG9yICYmIGxhc3QucXVlcnlTZWxlY3RvcihcIi5jbS10YWJcIikpKVxuICAgICAgICB7IGJ1aWxkZXIuY29udGVudC5jbGFzc05hbWUgPSBcImNtLXRhYi13cmFwLWhhY2tcIjsgfVxuICAgIH1cblxuICAgIHNpZ25hbChjbSwgXCJyZW5kZXJMaW5lXCIsIGNtLCBsaW5lVmlldy5saW5lLCBidWlsZGVyLnByZSk7XG4gICAgaWYgKGJ1aWxkZXIucHJlLmNsYXNzTmFtZSlcbiAgICAgIHsgYnVpbGRlci50ZXh0Q2xhc3MgPSBqb2luQ2xhc3NlcyhidWlsZGVyLnByZS5jbGFzc05hbWUsIGJ1aWxkZXIudGV4dENsYXNzIHx8IFwiXCIpOyB9XG5cbiAgICByZXR1cm4gYnVpbGRlclxuICB9XG5cbiAgZnVuY3Rpb24gZGVmYXVsdFNwZWNpYWxDaGFyUGxhY2Vob2xkZXIoY2gpIHtcbiAgICB2YXIgdG9rZW4gPSBlbHQoXCJzcGFuXCIsIFwiXFx1MjAyMlwiLCBcImNtLWludmFsaWRjaGFyXCIpO1xuICAgIHRva2VuLnRpdGxlID0gXCJcXFxcdVwiICsgY2guY2hhckNvZGVBdCgwKS50b1N0cmluZygxNik7XG4gICAgdG9rZW4uc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCB0b2tlbi50aXRsZSk7XG4gICAgcmV0dXJuIHRva2VuXG4gIH1cblxuICAvLyBCdWlsZCB1cCB0aGUgRE9NIHJlcHJlc2VudGF0aW9uIGZvciBhIHNpbmdsZSB0b2tlbiwgYW5kIGFkZCBpdCB0b1xuICAvLyB0aGUgbGluZSBtYXAuIFRha2VzIGNhcmUgdG8gcmVuZGVyIHNwZWNpYWwgY2hhcmFjdGVycyBzZXBhcmF0ZWx5LlxuICBmdW5jdGlvbiBidWlsZFRva2VuKGJ1aWxkZXIsIHRleHQsIHN0eWxlLCBzdGFydFN0eWxlLCBlbmRTdHlsZSwgY3NzLCBhdHRyaWJ1dGVzKSB7XG4gICAgaWYgKCF0ZXh0KSB7IHJldHVybiB9XG4gICAgdmFyIGRpc3BsYXlUZXh0ID0gYnVpbGRlci5zcGxpdFNwYWNlcyA/IHNwbGl0U3BhY2VzKHRleHQsIGJ1aWxkZXIudHJhaWxpbmdTcGFjZSkgOiB0ZXh0O1xuICAgIHZhciBzcGVjaWFsID0gYnVpbGRlci5jbS5zdGF0ZS5zcGVjaWFsQ2hhcnMsIG11c3RXcmFwID0gZmFsc2U7XG4gICAgdmFyIGNvbnRlbnQ7XG4gICAgaWYgKCFzcGVjaWFsLnRlc3QodGV4dCkpIHtcbiAgICAgIGJ1aWxkZXIuY29sICs9IHRleHQubGVuZ3RoO1xuICAgICAgY29udGVudCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGRpc3BsYXlUZXh0KTtcbiAgICAgIGJ1aWxkZXIubWFwLnB1c2goYnVpbGRlci5wb3MsIGJ1aWxkZXIucG9zICsgdGV4dC5sZW5ndGgsIGNvbnRlbnQpO1xuICAgICAgaWYgKGllICYmIGllX3ZlcnNpb24gPCA5KSB7IG11c3RXcmFwID0gdHJ1ZTsgfVxuICAgICAgYnVpbGRlci5wb3MgKz0gdGV4dC5sZW5ndGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgICB2YXIgcG9zID0gMDtcbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHNwZWNpYWwubGFzdEluZGV4ID0gcG9zO1xuICAgICAgICB2YXIgbSA9IHNwZWNpYWwuZXhlYyh0ZXh0KTtcbiAgICAgICAgdmFyIHNraXBwZWQgPSBtID8gbS5pbmRleCAtIHBvcyA6IHRleHQubGVuZ3RoIC0gcG9zO1xuICAgICAgICBpZiAoc2tpcHBlZCkge1xuICAgICAgICAgIHZhciB0eHQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShkaXNwbGF5VGV4dC5zbGljZShwb3MsIHBvcyArIHNraXBwZWQpKTtcbiAgICAgICAgICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8IDkpIHsgY29udGVudC5hcHBlbmRDaGlsZChlbHQoXCJzcGFuXCIsIFt0eHRdKSk7IH1cbiAgICAgICAgICBlbHNlIHsgY29udGVudC5hcHBlbmRDaGlsZCh0eHQpOyB9XG4gICAgICAgICAgYnVpbGRlci5tYXAucHVzaChidWlsZGVyLnBvcywgYnVpbGRlci5wb3MgKyBza2lwcGVkLCB0eHQpO1xuICAgICAgICAgIGJ1aWxkZXIuY29sICs9IHNraXBwZWQ7XG4gICAgICAgICAgYnVpbGRlci5wb3MgKz0gc2tpcHBlZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW0pIHsgYnJlYWsgfVxuICAgICAgICBwb3MgKz0gc2tpcHBlZCArIDE7XG4gICAgICAgIHZhciB0eHQkMSA9ICh2b2lkIDApO1xuICAgICAgICBpZiAobVswXSA9PSBcIlxcdFwiKSB7XG4gICAgICAgICAgdmFyIHRhYlNpemUgPSBidWlsZGVyLmNtLm9wdGlvbnMudGFiU2l6ZSwgdGFiV2lkdGggPSB0YWJTaXplIC0gYnVpbGRlci5jb2wgJSB0YWJTaXplO1xuICAgICAgICAgIHR4dCQxID0gY29udGVudC5hcHBlbmRDaGlsZChlbHQoXCJzcGFuXCIsIHNwYWNlU3RyKHRhYldpZHRoKSwgXCJjbS10YWJcIikpO1xuICAgICAgICAgIHR4dCQxLnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJwcmVzZW50YXRpb25cIik7XG4gICAgICAgICAgdHh0JDEuc2V0QXR0cmlidXRlKFwiY20tdGV4dFwiLCBcIlxcdFwiKTtcbiAgICAgICAgICBidWlsZGVyLmNvbCArPSB0YWJXaWR0aDtcbiAgICAgICAgfSBlbHNlIGlmIChtWzBdID09IFwiXFxyXCIgfHwgbVswXSA9PSBcIlxcblwiKSB7XG4gICAgICAgICAgdHh0JDEgPSBjb250ZW50LmFwcGVuZENoaWxkKGVsdChcInNwYW5cIiwgbVswXSA9PSBcIlxcclwiID8gXCJcXHUyNDBkXCIgOiBcIlxcdTI0MjRcIiwgXCJjbS1pbnZhbGlkY2hhclwiKSk7XG4gICAgICAgICAgdHh0JDEuc2V0QXR0cmlidXRlKFwiY20tdGV4dFwiLCBtWzBdKTtcbiAgICAgICAgICBidWlsZGVyLmNvbCArPSAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHR4dCQxID0gYnVpbGRlci5jbS5vcHRpb25zLnNwZWNpYWxDaGFyUGxhY2Vob2xkZXIobVswXSk7XG4gICAgICAgICAgdHh0JDEuc2V0QXR0cmlidXRlKFwiY20tdGV4dFwiLCBtWzBdKTtcbiAgICAgICAgICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8IDkpIHsgY29udGVudC5hcHBlbmRDaGlsZChlbHQoXCJzcGFuXCIsIFt0eHQkMV0pKTsgfVxuICAgICAgICAgIGVsc2UgeyBjb250ZW50LmFwcGVuZENoaWxkKHR4dCQxKTsgfVxuICAgICAgICAgIGJ1aWxkZXIuY29sICs9IDE7XG4gICAgICAgIH1cbiAgICAgICAgYnVpbGRlci5tYXAucHVzaChidWlsZGVyLnBvcywgYnVpbGRlci5wb3MgKyAxLCB0eHQkMSk7XG4gICAgICAgIGJ1aWxkZXIucG9zKys7XG4gICAgICB9XG4gICAgfVxuICAgIGJ1aWxkZXIudHJhaWxpbmdTcGFjZSA9IGRpc3BsYXlUZXh0LmNoYXJDb2RlQXQodGV4dC5sZW5ndGggLSAxKSA9PSAzMjtcbiAgICBpZiAoc3R5bGUgfHwgc3RhcnRTdHlsZSB8fCBlbmRTdHlsZSB8fCBtdXN0V3JhcCB8fCBjc3MgfHwgYXR0cmlidXRlcykge1xuICAgICAgdmFyIGZ1bGxTdHlsZSA9IHN0eWxlIHx8IFwiXCI7XG4gICAgICBpZiAoc3RhcnRTdHlsZSkgeyBmdWxsU3R5bGUgKz0gc3RhcnRTdHlsZTsgfVxuICAgICAgaWYgKGVuZFN0eWxlKSB7IGZ1bGxTdHlsZSArPSBlbmRTdHlsZTsgfVxuICAgICAgdmFyIHRva2VuID0gZWx0KFwic3BhblwiLCBbY29udGVudF0sIGZ1bGxTdHlsZSwgY3NzKTtcbiAgICAgIGlmIChhdHRyaWJ1dGVzKSB7XG4gICAgICAgIGZvciAodmFyIGF0dHIgaW4gYXR0cmlidXRlcykgeyBpZiAoYXR0cmlidXRlcy5oYXNPd25Qcm9wZXJ0eShhdHRyKSAmJiBhdHRyICE9IFwic3R5bGVcIiAmJiBhdHRyICE9IFwiY2xhc3NcIilcbiAgICAgICAgICB7IHRva2VuLnNldEF0dHJpYnV0ZShhdHRyLCBhdHRyaWJ1dGVzW2F0dHJdKTsgfSB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYnVpbGRlci5jb250ZW50LmFwcGVuZENoaWxkKHRva2VuKVxuICAgIH1cbiAgICBidWlsZGVyLmNvbnRlbnQuYXBwZW5kQ2hpbGQoY29udGVudCk7XG4gIH1cblxuICAvLyBDaGFuZ2Ugc29tZSBzcGFjZXMgdG8gTkJTUCB0byBwcmV2ZW50IHRoZSBicm93c2VyIGZyb20gY29sbGFwc2luZ1xuICAvLyB0cmFpbGluZyBzcGFjZXMgYXQgdGhlIGVuZCBvZiBhIGxpbmUgd2hlbiByZW5kZXJpbmcgdGV4dCAoaXNzdWUgIzEzNjIpLlxuICBmdW5jdGlvbiBzcGxpdFNwYWNlcyh0ZXh0LCB0cmFpbGluZ0JlZm9yZSkge1xuICAgIGlmICh0ZXh0Lmxlbmd0aCA+IDEgJiYgIS8gIC8udGVzdCh0ZXh0KSkgeyByZXR1cm4gdGV4dCB9XG4gICAgdmFyIHNwYWNlQmVmb3JlID0gdHJhaWxpbmdCZWZvcmUsIHJlc3VsdCA9IFwiXCI7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2ggPSB0ZXh0LmNoYXJBdChpKTtcbiAgICAgIGlmIChjaCA9PSBcIiBcIiAmJiBzcGFjZUJlZm9yZSAmJiAoaSA9PSB0ZXh0Lmxlbmd0aCAtIDEgfHwgdGV4dC5jaGFyQ29kZUF0KGkgKyAxKSA9PSAzMikpXG4gICAgICAgIHsgY2ggPSBcIlxcdTAwYTBcIjsgfVxuICAgICAgcmVzdWx0ICs9IGNoO1xuICAgICAgc3BhY2VCZWZvcmUgPSBjaCA9PSBcIiBcIjtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLy8gV29yayBhcm91bmQgbm9uc2Vuc2UgZGltZW5zaW9ucyBiZWluZyByZXBvcnRlZCBmb3Igc3RyZXRjaGVzIG9mXG4gIC8vIHJpZ2h0LXRvLWxlZnQgdGV4dC5cbiAgZnVuY3Rpb24gYnVpbGRUb2tlbkJhZEJpZGkoaW5uZXIsIG9yZGVyKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChidWlsZGVyLCB0ZXh0LCBzdHlsZSwgc3RhcnRTdHlsZSwgZW5kU3R5bGUsIGNzcywgYXR0cmlidXRlcykge1xuICAgICAgc3R5bGUgPSBzdHlsZSA/IHN0eWxlICsgXCIgY20tZm9yY2UtYm9yZGVyXCIgOiBcImNtLWZvcmNlLWJvcmRlclwiO1xuICAgICAgdmFyIHN0YXJ0ID0gYnVpbGRlci5wb3MsIGVuZCA9IHN0YXJ0ICsgdGV4dC5sZW5ndGg7XG4gICAgICBmb3IgKDs7KSB7XG4gICAgICAgIC8vIEZpbmQgdGhlIHBhcnQgdGhhdCBvdmVybGFwcyB3aXRoIHRoZSBzdGFydCBvZiB0aGlzIHRleHRcbiAgICAgICAgdmFyIHBhcnQgPSAodm9pZCAwKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcmRlci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHBhcnQgPSBvcmRlcltpXTtcbiAgICAgICAgICBpZiAocGFydC50byA+IHN0YXJ0ICYmIHBhcnQuZnJvbSA8PSBzdGFydCkgeyBicmVhayB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnQudG8gPj0gZW5kKSB7IHJldHVybiBpbm5lcihidWlsZGVyLCB0ZXh0LCBzdHlsZSwgc3RhcnRTdHlsZSwgZW5kU3R5bGUsIGNzcywgYXR0cmlidXRlcykgfVxuICAgICAgICBpbm5lcihidWlsZGVyLCB0ZXh0LnNsaWNlKDAsIHBhcnQudG8gLSBzdGFydCksIHN0eWxlLCBzdGFydFN0eWxlLCBudWxsLCBjc3MsIGF0dHJpYnV0ZXMpO1xuICAgICAgICBzdGFydFN0eWxlID0gbnVsbDtcbiAgICAgICAgdGV4dCA9IHRleHQuc2xpY2UocGFydC50byAtIHN0YXJ0KTtcbiAgICAgICAgc3RhcnQgPSBwYXJ0LnRvO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGJ1aWxkQ29sbGFwc2VkU3BhbihidWlsZGVyLCBzaXplLCBtYXJrZXIsIGlnbm9yZVdpZGdldCkge1xuICAgIHZhciB3aWRnZXQgPSAhaWdub3JlV2lkZ2V0ICYmIG1hcmtlci53aWRnZXROb2RlO1xuICAgIGlmICh3aWRnZXQpIHsgYnVpbGRlci5tYXAucHVzaChidWlsZGVyLnBvcywgYnVpbGRlci5wb3MgKyBzaXplLCB3aWRnZXQpOyB9XG4gICAgaWYgKCFpZ25vcmVXaWRnZXQgJiYgYnVpbGRlci5jbS5kaXNwbGF5LmlucHV0Lm5lZWRzQ29udGVudEF0dHJpYnV0ZSkge1xuICAgICAgaWYgKCF3aWRnZXQpXG4gICAgICAgIHsgd2lkZ2V0ID0gYnVpbGRlci5jb250ZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpKTsgfVxuICAgICAgd2lkZ2V0LnNldEF0dHJpYnV0ZShcImNtLW1hcmtlclwiLCBtYXJrZXIuaWQpO1xuICAgIH1cbiAgICBpZiAod2lkZ2V0KSB7XG4gICAgICBidWlsZGVyLmNtLmRpc3BsYXkuaW5wdXQuc2V0VW5lZGl0YWJsZSh3aWRnZXQpO1xuICAgICAgYnVpbGRlci5jb250ZW50LmFwcGVuZENoaWxkKHdpZGdldCk7XG4gICAgfVxuICAgIGJ1aWxkZXIucG9zICs9IHNpemU7XG4gICAgYnVpbGRlci50cmFpbGluZ1NwYWNlID0gZmFsc2U7XG4gIH1cblxuICAvLyBPdXRwdXRzIGEgbnVtYmVyIG9mIHNwYW5zIHRvIG1ha2UgdXAgYSBsaW5lLCB0YWtpbmcgaGlnaGxpZ2h0aW5nXG4gIC8vIGFuZCBtYXJrZWQgdGV4dCBpbnRvIGFjY291bnQuXG4gIGZ1bmN0aW9uIGluc2VydExpbmVDb250ZW50KGxpbmUsIGJ1aWxkZXIsIHN0eWxlcykge1xuICAgIHZhciBzcGFucyA9IGxpbmUubWFya2VkU3BhbnMsIGFsbFRleHQgPSBsaW5lLnRleHQsIGF0ID0gMDtcbiAgICBpZiAoIXNwYW5zKSB7XG4gICAgICBmb3IgKHZhciBpJDEgPSAxOyBpJDEgPCBzdHlsZXMubGVuZ3RoOyBpJDErPTIpXG4gICAgICAgIHsgYnVpbGRlci5hZGRUb2tlbihidWlsZGVyLCBhbGxUZXh0LnNsaWNlKGF0LCBhdCA9IHN0eWxlc1tpJDFdKSwgaW50ZXJwcmV0VG9rZW5TdHlsZShzdHlsZXNbaSQxKzFdLCBidWlsZGVyLmNtLm9wdGlvbnMpKTsgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdmFyIGxlbiA9IGFsbFRleHQubGVuZ3RoLCBwb3MgPSAwLCBpID0gMSwgdGV4dCA9IFwiXCIsIHN0eWxlLCBjc3M7XG4gICAgdmFyIG5leHRDaGFuZ2UgPSAwLCBzcGFuU3R5bGUsIHNwYW5FbmRTdHlsZSwgc3BhblN0YXJ0U3R5bGUsIGNvbGxhcHNlZCwgYXR0cmlidXRlcztcbiAgICBmb3IgKDs7KSB7XG4gICAgICBpZiAobmV4dENoYW5nZSA9PSBwb3MpIHsgLy8gVXBkYXRlIGN1cnJlbnQgbWFya2VyIHNldFxuICAgICAgICBzcGFuU3R5bGUgPSBzcGFuRW5kU3R5bGUgPSBzcGFuU3RhcnRTdHlsZSA9IGNzcyA9IFwiXCI7XG4gICAgICAgIGF0dHJpYnV0ZXMgPSBudWxsO1xuICAgICAgICBjb2xsYXBzZWQgPSBudWxsOyBuZXh0Q2hhbmdlID0gSW5maW5pdHk7XG4gICAgICAgIHZhciBmb3VuZEJvb2ttYXJrcyA9IFtdLCBlbmRTdHlsZXMgPSAodm9pZCAwKTtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzcGFucy5sZW5ndGg7ICsraikge1xuICAgICAgICAgIHZhciBzcCA9IHNwYW5zW2pdLCBtID0gc3AubWFya2VyO1xuICAgICAgICAgIGlmIChtLnR5cGUgPT0gXCJib29rbWFya1wiICYmIHNwLmZyb20gPT0gcG9zICYmIG0ud2lkZ2V0Tm9kZSkge1xuICAgICAgICAgICAgZm91bmRCb29rbWFya3MucHVzaChtKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHNwLmZyb20gPD0gcG9zICYmIChzcC50byA9PSBudWxsIHx8IHNwLnRvID4gcG9zIHx8IG0uY29sbGFwc2VkICYmIHNwLnRvID09IHBvcyAmJiBzcC5mcm9tID09IHBvcykpIHtcbiAgICAgICAgICAgIGlmIChzcC50byAhPSBudWxsICYmIHNwLnRvICE9IHBvcyAmJiBuZXh0Q2hhbmdlID4gc3AudG8pIHtcbiAgICAgICAgICAgICAgbmV4dENoYW5nZSA9IHNwLnRvO1xuICAgICAgICAgICAgICBzcGFuRW5kU3R5bGUgPSBcIlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG0uY2xhc3NOYW1lKSB7IHNwYW5TdHlsZSArPSBcIiBcIiArIG0uY2xhc3NOYW1lOyB9XG4gICAgICAgICAgICBpZiAobS5jc3MpIHsgY3NzID0gKGNzcyA/IGNzcyArIFwiO1wiIDogXCJcIikgKyBtLmNzczsgfVxuICAgICAgICAgICAgaWYgKG0uc3RhcnRTdHlsZSAmJiBzcC5mcm9tID09IHBvcykgeyBzcGFuU3RhcnRTdHlsZSArPSBcIiBcIiArIG0uc3RhcnRTdHlsZTsgfVxuICAgICAgICAgICAgaWYgKG0uZW5kU3R5bGUgJiYgc3AudG8gPT0gbmV4dENoYW5nZSkgeyAoZW5kU3R5bGVzIHx8IChlbmRTdHlsZXMgPSBbXSkpLnB1c2gobS5lbmRTdHlsZSwgc3AudG8pOyB9XG4gICAgICAgICAgICAvLyBzdXBwb3J0IGZvciB0aGUgb2xkIHRpdGxlIHByb3BlcnR5XG4gICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9Db2RlTWlycm9yL3B1bGwvNTY3M1xuICAgICAgICAgICAgaWYgKG0udGl0bGUpIHsgKGF0dHJpYnV0ZXMgfHwgKGF0dHJpYnV0ZXMgPSB7fSkpLnRpdGxlID0gbS50aXRsZTsgfVxuICAgICAgICAgICAgaWYgKG0uYXR0cmlidXRlcykge1xuICAgICAgICAgICAgICBmb3IgKHZhciBhdHRyIGluIG0uYXR0cmlidXRlcylcbiAgICAgICAgICAgICAgICB7IChhdHRyaWJ1dGVzIHx8IChhdHRyaWJ1dGVzID0ge30pKVthdHRyXSA9IG0uYXR0cmlidXRlc1thdHRyXTsgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG0uY29sbGFwc2VkICYmICghY29sbGFwc2VkIHx8IGNvbXBhcmVDb2xsYXBzZWRNYXJrZXJzKGNvbGxhcHNlZC5tYXJrZXIsIG0pIDwgMCkpXG4gICAgICAgICAgICAgIHsgY29sbGFwc2VkID0gc3A7IH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHNwLmZyb20gPiBwb3MgJiYgbmV4dENoYW5nZSA+IHNwLmZyb20pIHtcbiAgICAgICAgICAgIG5leHRDaGFuZ2UgPSBzcC5mcm9tO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZW5kU3R5bGVzKSB7IGZvciAodmFyIGokMSA9IDA7IGokMSA8IGVuZFN0eWxlcy5sZW5ndGg7IGokMSArPSAyKVxuICAgICAgICAgIHsgaWYgKGVuZFN0eWxlc1tqJDEgKyAxXSA9PSBuZXh0Q2hhbmdlKSB7IHNwYW5FbmRTdHlsZSArPSBcIiBcIiArIGVuZFN0eWxlc1tqJDFdOyB9IH0gfVxuXG4gICAgICAgIGlmICghY29sbGFwc2VkIHx8IGNvbGxhcHNlZC5mcm9tID09IHBvcykgeyBmb3IgKHZhciBqJDIgPSAwOyBqJDIgPCBmb3VuZEJvb2ttYXJrcy5sZW5ndGg7ICsraiQyKVxuICAgICAgICAgIHsgYnVpbGRDb2xsYXBzZWRTcGFuKGJ1aWxkZXIsIDAsIGZvdW5kQm9va21hcmtzW2okMl0pOyB9IH1cbiAgICAgICAgaWYgKGNvbGxhcHNlZCAmJiAoY29sbGFwc2VkLmZyb20gfHwgMCkgPT0gcG9zKSB7XG4gICAgICAgICAgYnVpbGRDb2xsYXBzZWRTcGFuKGJ1aWxkZXIsIChjb2xsYXBzZWQudG8gPT0gbnVsbCA/IGxlbiArIDEgOiBjb2xsYXBzZWQudG8pIC0gcG9zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZWQubWFya2VyLCBjb2xsYXBzZWQuZnJvbSA9PSBudWxsKTtcbiAgICAgICAgICBpZiAoY29sbGFwc2VkLnRvID09IG51bGwpIHsgcmV0dXJuIH1cbiAgICAgICAgICBpZiAoY29sbGFwc2VkLnRvID09IHBvcykgeyBjb2xsYXBzZWQgPSBmYWxzZTsgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocG9zID49IGxlbikgeyBicmVhayB9XG5cbiAgICAgIHZhciB1cHRvID0gTWF0aC5taW4obGVuLCBuZXh0Q2hhbmdlKTtcbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGlmICh0ZXh0KSB7XG4gICAgICAgICAgdmFyIGVuZCA9IHBvcyArIHRleHQubGVuZ3RoO1xuICAgICAgICAgIGlmICghY29sbGFwc2VkKSB7XG4gICAgICAgICAgICB2YXIgdG9rZW5UZXh0ID0gZW5kID4gdXB0byA/IHRleHQuc2xpY2UoMCwgdXB0byAtIHBvcykgOiB0ZXh0O1xuICAgICAgICAgICAgYnVpbGRlci5hZGRUb2tlbihidWlsZGVyLCB0b2tlblRleHQsIHN0eWxlID8gc3R5bGUgKyBzcGFuU3R5bGUgOiBzcGFuU3R5bGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW5TdGFydFN0eWxlLCBwb3MgKyB0b2tlblRleHQubGVuZ3RoID09IG5leHRDaGFuZ2UgPyBzcGFuRW5kU3R5bGUgOiBcIlwiLCBjc3MsIGF0dHJpYnV0ZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZW5kID49IHVwdG8pIHt0ZXh0ID0gdGV4dC5zbGljZSh1cHRvIC0gcG9zKTsgcG9zID0gdXB0bzsgYnJlYWt9XG4gICAgICAgICAgcG9zID0gZW5kO1xuICAgICAgICAgIHNwYW5TdGFydFN0eWxlID0gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICB0ZXh0ID0gYWxsVGV4dC5zbGljZShhdCwgYXQgPSBzdHlsZXNbaSsrXSk7XG4gICAgICAgIHN0eWxlID0gaW50ZXJwcmV0VG9rZW5TdHlsZShzdHlsZXNbaSsrXSwgYnVpbGRlci5jbS5vcHRpb25zKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuXG4gIC8vIFRoZXNlIG9iamVjdHMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IHRoZSB2aXNpYmxlIChjdXJyZW50bHkgZHJhd24pXG4gIC8vIHBhcnQgb2YgdGhlIGRvY3VtZW50LiBBIExpbmVWaWV3IG1heSBjb3JyZXNwb25kIHRvIG11bHRpcGxlXG4gIC8vIGxvZ2ljYWwgbGluZXMsIGlmIHRob3NlIGFyZSBjb25uZWN0ZWQgYnkgY29sbGFwc2VkIHJhbmdlcy5cbiAgZnVuY3Rpb24gTGluZVZpZXcoZG9jLCBsaW5lLCBsaW5lTikge1xuICAgIC8vIFRoZSBzdGFydGluZyBsaW5lXG4gICAgdGhpcy5saW5lID0gbGluZTtcbiAgICAvLyBDb250aW51aW5nIGxpbmVzLCBpZiBhbnlcbiAgICB0aGlzLnJlc3QgPSB2aXN1YWxMaW5lQ29udGludWVkKGxpbmUpO1xuICAgIC8vIE51bWJlciBvZiBsb2dpY2FsIGxpbmVzIGluIHRoaXMgdmlzdWFsIGxpbmVcbiAgICB0aGlzLnNpemUgPSB0aGlzLnJlc3QgPyBsaW5lTm8obHN0KHRoaXMucmVzdCkpIC0gbGluZU4gKyAxIDogMTtcbiAgICB0aGlzLm5vZGUgPSB0aGlzLnRleHQgPSBudWxsO1xuICAgIHRoaXMuaGlkZGVuID0gbGluZUlzSGlkZGVuKGRvYywgbGluZSk7XG4gIH1cblxuICAvLyBDcmVhdGUgYSByYW5nZSBvZiBMaW5lVmlldyBvYmplY3RzIGZvciB0aGUgZ2l2ZW4gbGluZXMuXG4gIGZ1bmN0aW9uIGJ1aWxkVmlld0FycmF5KGNtLCBmcm9tLCB0bykge1xuICAgIHZhciBhcnJheSA9IFtdLCBuZXh0UG9zO1xuICAgIGZvciAodmFyIHBvcyA9IGZyb207IHBvcyA8IHRvOyBwb3MgPSBuZXh0UG9zKSB7XG4gICAgICB2YXIgdmlldyA9IG5ldyBMaW5lVmlldyhjbS5kb2MsIGdldExpbmUoY20uZG9jLCBwb3MpLCBwb3MpO1xuICAgICAgbmV4dFBvcyA9IHBvcyArIHZpZXcuc2l6ZTtcbiAgICAgIGFycmF5LnB1c2godmlldyk7XG4gICAgfVxuICAgIHJldHVybiBhcnJheVxuICB9XG5cbiAgdmFyIG9wZXJhdGlvbkdyb3VwID0gbnVsbDtcblxuICBmdW5jdGlvbiBwdXNoT3BlcmF0aW9uKG9wKSB7XG4gICAgaWYgKG9wZXJhdGlvbkdyb3VwKSB7XG4gICAgICBvcGVyYXRpb25Hcm91cC5vcHMucHVzaChvcCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wLm93bnNHcm91cCA9IG9wZXJhdGlvbkdyb3VwID0ge1xuICAgICAgICBvcHM6IFtvcF0sXG4gICAgICAgIGRlbGF5ZWRDYWxsYmFja3M6IFtdXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGZpcmVDYWxsYmFja3NGb3JPcHMoZ3JvdXApIHtcbiAgICAvLyBDYWxscyBkZWxheWVkIGNhbGxiYWNrcyBhbmQgY3Vyc29yQWN0aXZpdHkgaGFuZGxlcnMgdW50aWwgbm9cbiAgICAvLyBuZXcgb25lcyBhcHBlYXJcbiAgICB2YXIgY2FsbGJhY2tzID0gZ3JvdXAuZGVsYXllZENhbGxiYWNrcywgaSA9IDA7XG4gICAgZG8ge1xuICAgICAgZm9yICg7IGkgPCBjYWxsYmFja3MubGVuZ3RoOyBpKyspXG4gICAgICAgIHsgY2FsbGJhY2tzW2ldLmNhbGwobnVsbCk7IH1cbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZ3JvdXAub3BzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBvcCA9IGdyb3VwLm9wc1tqXTtcbiAgICAgICAgaWYgKG9wLmN1cnNvckFjdGl2aXR5SGFuZGxlcnMpXG4gICAgICAgICAgeyB3aGlsZSAob3AuY3Vyc29yQWN0aXZpdHlDYWxsZWQgPCBvcC5jdXJzb3JBY3Rpdml0eUhhbmRsZXJzLmxlbmd0aClcbiAgICAgICAgICAgIHsgb3AuY3Vyc29yQWN0aXZpdHlIYW5kbGVyc1tvcC5jdXJzb3JBY3Rpdml0eUNhbGxlZCsrXS5jYWxsKG51bGwsIG9wLmNtKTsgfSB9XG4gICAgICB9XG4gICAgfSB3aGlsZSAoaSA8IGNhbGxiYWNrcy5sZW5ndGgpXG4gIH1cblxuICBmdW5jdGlvbiBmaW5pc2hPcGVyYXRpb24ob3AsIGVuZENiKSB7XG4gICAgdmFyIGdyb3VwID0gb3Aub3duc0dyb3VwO1xuICAgIGlmICghZ3JvdXApIHsgcmV0dXJuIH1cblxuICAgIHRyeSB7IGZpcmVDYWxsYmFja3NGb3JPcHMoZ3JvdXApOyB9XG4gICAgZmluYWxseSB7XG4gICAgICBvcGVyYXRpb25Hcm91cCA9IG51bGw7XG4gICAgICBlbmRDYihncm91cCk7XG4gICAgfVxuICB9XG5cbiAgdmFyIG9ycGhhbkRlbGF5ZWRDYWxsYmFja3MgPSBudWxsO1xuXG4gIC8vIE9mdGVuLCB3ZSB3YW50IHRvIHNpZ25hbCBldmVudHMgYXQgYSBwb2ludCB3aGVyZSB3ZSBhcmUgaW4gdGhlXG4gIC8vIG1pZGRsZSBvZiBzb21lIHdvcmssIGJ1dCBkb24ndCB3YW50IHRoZSBoYW5kbGVyIHRvIHN0YXJ0IGNhbGxpbmdcbiAgLy8gb3RoZXIgbWV0aG9kcyBvbiB0aGUgZWRpdG9yLCB3aGljaCBtaWdodCBiZSBpbiBhbiBpbmNvbnNpc3RlbnRcbiAgLy8gc3RhdGUgb3Igc2ltcGx5IG5vdCBleHBlY3QgYW55IG90aGVyIGV2ZW50cyB0byBoYXBwZW4uXG4gIC8vIHNpZ25hbExhdGVyIGxvb2tzIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBoYW5kbGVycywgYW5kIHNjaGVkdWxlc1xuICAvLyB0aGVtIHRvIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIGxhc3Qgb3BlcmF0aW9uIGVuZHMsIG9yLCBpZiBub1xuICAvLyBvcGVyYXRpb24gaXMgYWN0aXZlLCB3aGVuIGEgdGltZW91dCBmaXJlcy5cbiAgZnVuY3Rpb24gc2lnbmFsTGF0ZXIoZW1pdHRlciwgdHlwZSAvKiwgdmFsdWVzLi4uKi8pIHtcbiAgICB2YXIgYXJyID0gZ2V0SGFuZGxlcnMoZW1pdHRlciwgdHlwZSk7XG4gICAgaWYgKCFhcnIubGVuZ3RoKSB7IHJldHVybiB9XG4gICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpLCBsaXN0O1xuICAgIGlmIChvcGVyYXRpb25Hcm91cCkge1xuICAgICAgbGlzdCA9IG9wZXJhdGlvbkdyb3VwLmRlbGF5ZWRDYWxsYmFja3M7XG4gICAgfSBlbHNlIGlmIChvcnBoYW5EZWxheWVkQ2FsbGJhY2tzKSB7XG4gICAgICBsaXN0ID0gb3JwaGFuRGVsYXllZENhbGxiYWNrcztcbiAgICB9IGVsc2Uge1xuICAgICAgbGlzdCA9IG9ycGhhbkRlbGF5ZWRDYWxsYmFja3MgPSBbXTtcbiAgICAgIHNldFRpbWVvdXQoZmlyZU9ycGhhbkRlbGF5ZWQsIDApO1xuICAgIH1cbiAgICB2YXIgbG9vcCA9IGZ1bmN0aW9uICggaSApIHtcbiAgICAgIGxpc3QucHVzaChmdW5jdGlvbiAoKSB7IHJldHVybiBhcnJbaV0uYXBwbHkobnVsbCwgYXJncyk7IH0pO1xuICAgIH07XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7ICsraSlcbiAgICAgIGxvb3AoIGkgKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpcmVPcnBoYW5EZWxheWVkKCkge1xuICAgIHZhciBkZWxheWVkID0gb3JwaGFuRGVsYXllZENhbGxiYWNrcztcbiAgICBvcnBoYW5EZWxheWVkQ2FsbGJhY2tzID0gbnVsbDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlbGF5ZWQubGVuZ3RoOyArK2kpIHsgZGVsYXllZFtpXSgpOyB9XG4gIH1cblxuICAvLyBXaGVuIGFuIGFzcGVjdCBvZiBhIGxpbmUgY2hhbmdlcywgYSBzdHJpbmcgaXMgYWRkZWQgdG9cbiAgLy8gbGluZVZpZXcuY2hhbmdlcy4gVGhpcyB1cGRhdGVzIHRoZSByZWxldmFudCBwYXJ0IG9mIHRoZSBsaW5lJ3NcbiAgLy8gRE9NIHN0cnVjdHVyZS5cbiAgZnVuY3Rpb24gdXBkYXRlTGluZUZvckNoYW5nZXMoY20sIGxpbmVWaWV3LCBsaW5lTiwgZGltcykge1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgbGluZVZpZXcuY2hhbmdlcy5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIHR5cGUgPSBsaW5lVmlldy5jaGFuZ2VzW2pdO1xuICAgICAgaWYgKHR5cGUgPT0gXCJ0ZXh0XCIpIHsgdXBkYXRlTGluZVRleHQoY20sIGxpbmVWaWV3KTsgfVxuICAgICAgZWxzZSBpZiAodHlwZSA9PSBcImd1dHRlclwiKSB7IHVwZGF0ZUxpbmVHdXR0ZXIoY20sIGxpbmVWaWV3LCBsaW5lTiwgZGltcyk7IH1cbiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gXCJjbGFzc1wiKSB7IHVwZGF0ZUxpbmVDbGFzc2VzKGNtLCBsaW5lVmlldyk7IH1cbiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gXCJ3aWRnZXRcIikgeyB1cGRhdGVMaW5lV2lkZ2V0cyhjbSwgbGluZVZpZXcsIGRpbXMpOyB9XG4gICAgfVxuICAgIGxpbmVWaWV3LmNoYW5nZXMgPSBudWxsO1xuICB9XG5cbiAgLy8gTGluZXMgd2l0aCBndXR0ZXIgZWxlbWVudHMsIHdpZGdldHMgb3IgYSBiYWNrZ3JvdW5kIGNsYXNzIG5lZWQgdG9cbiAgLy8gYmUgd3JhcHBlZCwgYW5kIGhhdmUgdGhlIGV4dHJhIGVsZW1lbnRzIGFkZGVkIHRvIHRoZSB3cmFwcGVyIGRpdlxuICBmdW5jdGlvbiBlbnN1cmVMaW5lV3JhcHBlZChsaW5lVmlldykge1xuICAgIGlmIChsaW5lVmlldy5ub2RlID09IGxpbmVWaWV3LnRleHQpIHtcbiAgICAgIGxpbmVWaWV3Lm5vZGUgPSBlbHQoXCJkaXZcIiwgbnVsbCwgbnVsbCwgXCJwb3NpdGlvbjogcmVsYXRpdmVcIik7XG4gICAgICBpZiAobGluZVZpZXcudGV4dC5wYXJlbnROb2RlKVxuICAgICAgICB7IGxpbmVWaWV3LnRleHQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobGluZVZpZXcubm9kZSwgbGluZVZpZXcudGV4dCk7IH1cbiAgICAgIGxpbmVWaWV3Lm5vZGUuYXBwZW5kQ2hpbGQobGluZVZpZXcudGV4dCk7XG4gICAgICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8IDgpIHsgbGluZVZpZXcubm9kZS5zdHlsZS56SW5kZXggPSAyOyB9XG4gICAgfVxuICAgIHJldHVybiBsaW5lVmlldy5ub2RlXG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVMaW5lQmFja2dyb3VuZChjbSwgbGluZVZpZXcpIHtcbiAgICB2YXIgY2xzID0gbGluZVZpZXcuYmdDbGFzcyA/IGxpbmVWaWV3LmJnQ2xhc3MgKyBcIiBcIiArIChsaW5lVmlldy5saW5lLmJnQ2xhc3MgfHwgXCJcIikgOiBsaW5lVmlldy5saW5lLmJnQ2xhc3M7XG4gICAgaWYgKGNscykgeyBjbHMgKz0gXCIgQ29kZU1pcnJvci1saW5lYmFja2dyb3VuZFwiOyB9XG4gICAgaWYgKGxpbmVWaWV3LmJhY2tncm91bmQpIHtcbiAgICAgIGlmIChjbHMpIHsgbGluZVZpZXcuYmFja2dyb3VuZC5jbGFzc05hbWUgPSBjbHM7IH1cbiAgICAgIGVsc2UgeyBsaW5lVmlldy5iYWNrZ3JvdW5kLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobGluZVZpZXcuYmFja2dyb3VuZCk7IGxpbmVWaWV3LmJhY2tncm91bmQgPSBudWxsOyB9XG4gICAgfSBlbHNlIGlmIChjbHMpIHtcbiAgICAgIHZhciB3cmFwID0gZW5zdXJlTGluZVdyYXBwZWQobGluZVZpZXcpO1xuICAgICAgbGluZVZpZXcuYmFja2dyb3VuZCA9IHdyYXAuaW5zZXJ0QmVmb3JlKGVsdChcImRpdlwiLCBudWxsLCBjbHMpLCB3cmFwLmZpcnN0Q2hpbGQpO1xuICAgICAgY20uZGlzcGxheS5pbnB1dC5zZXRVbmVkaXRhYmxlKGxpbmVWaWV3LmJhY2tncm91bmQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFdyYXBwZXIgYXJvdW5kIGJ1aWxkTGluZUNvbnRlbnQgd2hpY2ggd2lsbCByZXVzZSB0aGUgc3RydWN0dXJlXG4gIC8vIGluIGRpc3BsYXkuZXh0ZXJuYWxNZWFzdXJlZCB3aGVuIHBvc3NpYmxlLlxuICBmdW5jdGlvbiBnZXRMaW5lQ29udGVudChjbSwgbGluZVZpZXcpIHtcbiAgICB2YXIgZXh0ID0gY20uZGlzcGxheS5leHRlcm5hbE1lYXN1cmVkO1xuICAgIGlmIChleHQgJiYgZXh0LmxpbmUgPT0gbGluZVZpZXcubGluZSkge1xuICAgICAgY20uZGlzcGxheS5leHRlcm5hbE1lYXN1cmVkID0gbnVsbDtcbiAgICAgIGxpbmVWaWV3Lm1lYXN1cmUgPSBleHQubWVhc3VyZTtcbiAgICAgIHJldHVybiBleHQuYnVpbHRcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkTGluZUNvbnRlbnQoY20sIGxpbmVWaWV3KVxuICB9XG5cbiAgLy8gUmVkcmF3IHRoZSBsaW5lJ3MgdGV4dC4gSW50ZXJhY3RzIHdpdGggdGhlIGJhY2tncm91bmQgYW5kIHRleHRcbiAgLy8gY2xhc3NlcyBiZWNhdXNlIHRoZSBtb2RlIG1heSBvdXRwdXQgdG9rZW5zIHRoYXQgaW5mbHVlbmNlIHRoZXNlXG4gIC8vIGNsYXNzZXMuXG4gIGZ1bmN0aW9uIHVwZGF0ZUxpbmVUZXh0KGNtLCBsaW5lVmlldykge1xuICAgIHZhciBjbHMgPSBsaW5lVmlldy50ZXh0LmNsYXNzTmFtZTtcbiAgICB2YXIgYnVpbHQgPSBnZXRMaW5lQ29udGVudChjbSwgbGluZVZpZXcpO1xuICAgIGlmIChsaW5lVmlldy50ZXh0ID09IGxpbmVWaWV3Lm5vZGUpIHsgbGluZVZpZXcubm9kZSA9IGJ1aWx0LnByZTsgfVxuICAgIGxpbmVWaWV3LnRleHQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoYnVpbHQucHJlLCBsaW5lVmlldy50ZXh0KTtcbiAgICBsaW5lVmlldy50ZXh0ID0gYnVpbHQucHJlO1xuICAgIGlmIChidWlsdC5iZ0NsYXNzICE9IGxpbmVWaWV3LmJnQ2xhc3MgfHwgYnVpbHQudGV4dENsYXNzICE9IGxpbmVWaWV3LnRleHRDbGFzcykge1xuICAgICAgbGluZVZpZXcuYmdDbGFzcyA9IGJ1aWx0LmJnQ2xhc3M7XG4gICAgICBsaW5lVmlldy50ZXh0Q2xhc3MgPSBidWlsdC50ZXh0Q2xhc3M7XG4gICAgICB1cGRhdGVMaW5lQ2xhc3NlcyhjbSwgbGluZVZpZXcpO1xuICAgIH0gZWxzZSBpZiAoY2xzKSB7XG4gICAgICBsaW5lVmlldy50ZXh0LmNsYXNzTmFtZSA9IGNscztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVMaW5lQ2xhc3NlcyhjbSwgbGluZVZpZXcpIHtcbiAgICB1cGRhdGVMaW5lQmFja2dyb3VuZChjbSwgbGluZVZpZXcpO1xuICAgIGlmIChsaW5lVmlldy5saW5lLndyYXBDbGFzcylcbiAgICAgIHsgZW5zdXJlTGluZVdyYXBwZWQobGluZVZpZXcpLmNsYXNzTmFtZSA9IGxpbmVWaWV3LmxpbmUud3JhcENsYXNzOyB9XG4gICAgZWxzZSBpZiAobGluZVZpZXcubm9kZSAhPSBsaW5lVmlldy50ZXh0KVxuICAgICAgeyBsaW5lVmlldy5ub2RlLmNsYXNzTmFtZSA9IFwiXCI7IH1cbiAgICB2YXIgdGV4dENsYXNzID0gbGluZVZpZXcudGV4dENsYXNzID8gbGluZVZpZXcudGV4dENsYXNzICsgXCIgXCIgKyAobGluZVZpZXcubGluZS50ZXh0Q2xhc3MgfHwgXCJcIikgOiBsaW5lVmlldy5saW5lLnRleHRDbGFzcztcbiAgICBsaW5lVmlldy50ZXh0LmNsYXNzTmFtZSA9IHRleHRDbGFzcyB8fCBcIlwiO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlTGluZUd1dHRlcihjbSwgbGluZVZpZXcsIGxpbmVOLCBkaW1zKSB7XG4gICAgaWYgKGxpbmVWaWV3Lmd1dHRlcikge1xuICAgICAgbGluZVZpZXcubm9kZS5yZW1vdmVDaGlsZChsaW5lVmlldy5ndXR0ZXIpO1xuICAgICAgbGluZVZpZXcuZ3V0dGVyID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKGxpbmVWaWV3Lmd1dHRlckJhY2tncm91bmQpIHtcbiAgICAgIGxpbmVWaWV3Lm5vZGUucmVtb3ZlQ2hpbGQobGluZVZpZXcuZ3V0dGVyQmFja2dyb3VuZCk7XG4gICAgICBsaW5lVmlldy5ndXR0ZXJCYWNrZ3JvdW5kID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKGxpbmVWaWV3LmxpbmUuZ3V0dGVyQ2xhc3MpIHtcbiAgICAgIHZhciB3cmFwID0gZW5zdXJlTGluZVdyYXBwZWQobGluZVZpZXcpO1xuICAgICAgbGluZVZpZXcuZ3V0dGVyQmFja2dyb3VuZCA9IGVsdChcImRpdlwiLCBudWxsLCBcIkNvZGVNaXJyb3ItZ3V0dGVyLWJhY2tncm91bmQgXCIgKyBsaW5lVmlldy5saW5lLmd1dHRlckNsYXNzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoXCJsZWZ0OiBcIiArIChjbS5vcHRpb25zLmZpeGVkR3V0dGVyID8gZGltcy5maXhlZFBvcyA6IC1kaW1zLmd1dHRlclRvdGFsV2lkdGgpICsgXCJweDsgd2lkdGg6IFwiICsgKGRpbXMuZ3V0dGVyVG90YWxXaWR0aCkgKyBcInB4XCIpKTtcbiAgICAgIGNtLmRpc3BsYXkuaW5wdXQuc2V0VW5lZGl0YWJsZShsaW5lVmlldy5ndXR0ZXJCYWNrZ3JvdW5kKTtcbiAgICAgIHdyYXAuaW5zZXJ0QmVmb3JlKGxpbmVWaWV3Lmd1dHRlckJhY2tncm91bmQsIGxpbmVWaWV3LnRleHQpO1xuICAgIH1cbiAgICB2YXIgbWFya2VycyA9IGxpbmVWaWV3LmxpbmUuZ3V0dGVyTWFya2VycztcbiAgICBpZiAoY20ub3B0aW9ucy5saW5lTnVtYmVycyB8fCBtYXJrZXJzKSB7XG4gICAgICB2YXIgd3JhcCQxID0gZW5zdXJlTGluZVdyYXBwZWQobGluZVZpZXcpO1xuICAgICAgdmFyIGd1dHRlcldyYXAgPSBsaW5lVmlldy5ndXR0ZXIgPSBlbHQoXCJkaXZcIiwgbnVsbCwgXCJDb2RlTWlycm9yLWd1dHRlci13cmFwcGVyXCIsIChcImxlZnQ6IFwiICsgKGNtLm9wdGlvbnMuZml4ZWRHdXR0ZXIgPyBkaW1zLmZpeGVkUG9zIDogLWRpbXMuZ3V0dGVyVG90YWxXaWR0aCkgKyBcInB4XCIpKTtcbiAgICAgIGNtLmRpc3BsYXkuaW5wdXQuc2V0VW5lZGl0YWJsZShndXR0ZXJXcmFwKTtcbiAgICAgIHdyYXAkMS5pbnNlcnRCZWZvcmUoZ3V0dGVyV3JhcCwgbGluZVZpZXcudGV4dCk7XG4gICAgICBpZiAobGluZVZpZXcubGluZS5ndXR0ZXJDbGFzcylcbiAgICAgICAgeyBndXR0ZXJXcmFwLmNsYXNzTmFtZSArPSBcIiBcIiArIGxpbmVWaWV3LmxpbmUuZ3V0dGVyQ2xhc3M7IH1cbiAgICAgIGlmIChjbS5vcHRpb25zLmxpbmVOdW1iZXJzICYmICghbWFya2VycyB8fCAhbWFya2Vyc1tcIkNvZGVNaXJyb3ItbGluZW51bWJlcnNcIl0pKVxuICAgICAgICB7IGxpbmVWaWV3LmxpbmVOdW1iZXIgPSBndXR0ZXJXcmFwLmFwcGVuZENoaWxkKFxuICAgICAgICAgIGVsdChcImRpdlwiLCBsaW5lTnVtYmVyRm9yKGNtLm9wdGlvbnMsIGxpbmVOKSxcbiAgICAgICAgICAgICAgXCJDb2RlTWlycm9yLWxpbmVudW1iZXIgQ29kZU1pcnJvci1ndXR0ZXItZWx0XCIsXG4gICAgICAgICAgICAgIChcImxlZnQ6IFwiICsgKGRpbXMuZ3V0dGVyTGVmdFtcIkNvZGVNaXJyb3ItbGluZW51bWJlcnNcIl0pICsgXCJweDsgd2lkdGg6IFwiICsgKGNtLmRpc3BsYXkubGluZU51bUlubmVyV2lkdGgpICsgXCJweFwiKSkpOyB9XG4gICAgICBpZiAobWFya2VycykgeyBmb3IgKHZhciBrID0gMDsgayA8IGNtLmRpc3BsYXkuZ3V0dGVyU3BlY3MubGVuZ3RoOyArK2spIHtcbiAgICAgICAgdmFyIGlkID0gY20uZGlzcGxheS5ndXR0ZXJTcGVjc1trXS5jbGFzc05hbWUsIGZvdW5kID0gbWFya2Vycy5oYXNPd25Qcm9wZXJ0eShpZCkgJiYgbWFya2Vyc1tpZF07XG4gICAgICAgIGlmIChmb3VuZClcbiAgICAgICAgICB7IGd1dHRlcldyYXAuYXBwZW5kQ2hpbGQoZWx0KFwiZGl2XCIsIFtmb3VuZF0sIFwiQ29kZU1pcnJvci1ndXR0ZXItZWx0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFwibGVmdDogXCIgKyAoZGltcy5ndXR0ZXJMZWZ0W2lkXSkgKyBcInB4OyB3aWR0aDogXCIgKyAoZGltcy5ndXR0ZXJXaWR0aFtpZF0pICsgXCJweFwiKSkpOyB9XG4gICAgICB9IH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVMaW5lV2lkZ2V0cyhjbSwgbGluZVZpZXcsIGRpbXMpIHtcbiAgICBpZiAobGluZVZpZXcuYWxpZ25hYmxlKSB7IGxpbmVWaWV3LmFsaWduYWJsZSA9IG51bGw7IH1cbiAgICB2YXIgaXNXaWRnZXQgPSBjbGFzc1Rlc3QoXCJDb2RlTWlycm9yLWxpbmV3aWRnZXRcIik7XG4gICAgZm9yICh2YXIgbm9kZSA9IGxpbmVWaWV3Lm5vZGUuZmlyc3RDaGlsZCwgbmV4dCA9ICh2b2lkIDApOyBub2RlOyBub2RlID0gbmV4dCkge1xuICAgICAgbmV4dCA9IG5vZGUubmV4dFNpYmxpbmc7XG4gICAgICBpZiAoaXNXaWRnZXQudGVzdChub2RlLmNsYXNzTmFtZSkpIHsgbGluZVZpZXcubm9kZS5yZW1vdmVDaGlsZChub2RlKTsgfVxuICAgIH1cbiAgICBpbnNlcnRMaW5lV2lkZ2V0cyhjbSwgbGluZVZpZXcsIGRpbXMpO1xuICB9XG5cbiAgLy8gQnVpbGQgYSBsaW5lJ3MgRE9NIHJlcHJlc2VudGF0aW9uIGZyb20gc2NyYXRjaFxuICBmdW5jdGlvbiBidWlsZExpbmVFbGVtZW50KGNtLCBsaW5lVmlldywgbGluZU4sIGRpbXMpIHtcbiAgICB2YXIgYnVpbHQgPSBnZXRMaW5lQ29udGVudChjbSwgbGluZVZpZXcpO1xuICAgIGxpbmVWaWV3LnRleHQgPSBsaW5lVmlldy5ub2RlID0gYnVpbHQucHJlO1xuICAgIGlmIChidWlsdC5iZ0NsYXNzKSB7IGxpbmVWaWV3LmJnQ2xhc3MgPSBidWlsdC5iZ0NsYXNzOyB9XG4gICAgaWYgKGJ1aWx0LnRleHRDbGFzcykgeyBsaW5lVmlldy50ZXh0Q2xhc3MgPSBidWlsdC50ZXh0Q2xhc3M7IH1cblxuICAgIHVwZGF0ZUxpbmVDbGFzc2VzKGNtLCBsaW5lVmlldyk7XG4gICAgdXBkYXRlTGluZUd1dHRlcihjbSwgbGluZVZpZXcsIGxpbmVOLCBkaW1zKTtcbiAgICBpbnNlcnRMaW5lV2lkZ2V0cyhjbSwgbGluZVZpZXcsIGRpbXMpO1xuICAgIHJldHVybiBsaW5lVmlldy5ub2RlXG4gIH1cblxuICAvLyBBIGxpbmVWaWV3IG1heSBjb250YWluIG11bHRpcGxlIGxvZ2ljYWwgbGluZXMgKHdoZW4gbWVyZ2VkIGJ5XG4gIC8vIGNvbGxhcHNlZCBzcGFucykuIFRoZSB3aWRnZXRzIGZvciBhbGwgb2YgdGhlbSBuZWVkIHRvIGJlIGRyYXduLlxuICBmdW5jdGlvbiBpbnNlcnRMaW5lV2lkZ2V0cyhjbSwgbGluZVZpZXcsIGRpbXMpIHtcbiAgICBpbnNlcnRMaW5lV2lkZ2V0c0ZvcihjbSwgbGluZVZpZXcubGluZSwgbGluZVZpZXcsIGRpbXMsIHRydWUpO1xuICAgIGlmIChsaW5lVmlldy5yZXN0KSB7IGZvciAodmFyIGkgPSAwOyBpIDwgbGluZVZpZXcucmVzdC5sZW5ndGg7IGkrKylcbiAgICAgIHsgaW5zZXJ0TGluZVdpZGdldHNGb3IoY20sIGxpbmVWaWV3LnJlc3RbaV0sIGxpbmVWaWV3LCBkaW1zLCBmYWxzZSk7IH0gfVxuICB9XG5cbiAgZnVuY3Rpb24gaW5zZXJ0TGluZVdpZGdldHNGb3IoY20sIGxpbmUsIGxpbmVWaWV3LCBkaW1zLCBhbGxvd0Fib3ZlKSB7XG4gICAgaWYgKCFsaW5lLndpZGdldHMpIHsgcmV0dXJuIH1cbiAgICB2YXIgd3JhcCA9IGVuc3VyZUxpbmVXcmFwcGVkKGxpbmVWaWV3KTtcbiAgICBmb3IgKHZhciBpID0gMCwgd3MgPSBsaW5lLndpZGdldHM7IGkgPCB3cy5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIHdpZGdldCA9IHdzW2ldLCBub2RlID0gZWx0KFwiZGl2XCIsIFt3aWRnZXQubm9kZV0sIFwiQ29kZU1pcnJvci1saW5ld2lkZ2V0XCIgKyAod2lkZ2V0LmNsYXNzTmFtZSA/IFwiIFwiICsgd2lkZ2V0LmNsYXNzTmFtZSA6IFwiXCIpKTtcbiAgICAgIGlmICghd2lkZ2V0LmhhbmRsZU1vdXNlRXZlbnRzKSB7IG5vZGUuc2V0QXR0cmlidXRlKFwiY20taWdub3JlLWV2ZW50c1wiLCBcInRydWVcIik7IH1cbiAgICAgIHBvc2l0aW9uTGluZVdpZGdldCh3aWRnZXQsIG5vZGUsIGxpbmVWaWV3LCBkaW1zKTtcbiAgICAgIGNtLmRpc3BsYXkuaW5wdXQuc2V0VW5lZGl0YWJsZShub2RlKTtcbiAgICAgIGlmIChhbGxvd0Fib3ZlICYmIHdpZGdldC5hYm92ZSlcbiAgICAgICAgeyB3cmFwLmluc2VydEJlZm9yZShub2RlLCBsaW5lVmlldy5ndXR0ZXIgfHwgbGluZVZpZXcudGV4dCk7IH1cbiAgICAgIGVsc2VcbiAgICAgICAgeyB3cmFwLmFwcGVuZENoaWxkKG5vZGUpOyB9XG4gICAgICBzaWduYWxMYXRlcih3aWRnZXQsIFwicmVkcmF3XCIpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHBvc2l0aW9uTGluZVdpZGdldCh3aWRnZXQsIG5vZGUsIGxpbmVWaWV3LCBkaW1zKSB7XG4gICAgaWYgKHdpZGdldC5ub0hTY3JvbGwpIHtcbiAgKGxpbmVWaWV3LmFsaWduYWJsZSB8fCAobGluZVZpZXcuYWxpZ25hYmxlID0gW10pKS5wdXNoKG5vZGUpO1xuICAgICAgdmFyIHdpZHRoID0gZGltcy53cmFwcGVyV2lkdGg7XG4gICAgICBub2RlLnN0eWxlLmxlZnQgPSBkaW1zLmZpeGVkUG9zICsgXCJweFwiO1xuICAgICAgaWYgKCF3aWRnZXQuY292ZXJHdXR0ZXIpIHtcbiAgICAgICAgd2lkdGggLT0gZGltcy5ndXR0ZXJUb3RhbFdpZHRoO1xuICAgICAgICBub2RlLnN0eWxlLnBhZGRpbmdMZWZ0ID0gZGltcy5ndXR0ZXJUb3RhbFdpZHRoICsgXCJweFwiO1xuICAgICAgfVxuICAgICAgbm9kZS5zdHlsZS53aWR0aCA9IHdpZHRoICsgXCJweFwiO1xuICAgIH1cbiAgICBpZiAod2lkZ2V0LmNvdmVyR3V0dGVyKSB7XG4gICAgICBub2RlLnN0eWxlLnpJbmRleCA9IDU7XG4gICAgICBub2RlLnN0eWxlLnBvc2l0aW9uID0gXCJyZWxhdGl2ZVwiO1xuICAgICAgaWYgKCF3aWRnZXQubm9IU2Nyb2xsKSB7IG5vZGUuc3R5bGUubWFyZ2luTGVmdCA9IC1kaW1zLmd1dHRlclRvdGFsV2lkdGggKyBcInB4XCI7IH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB3aWRnZXRIZWlnaHQod2lkZ2V0KSB7XG4gICAgaWYgKHdpZGdldC5oZWlnaHQgIT0gbnVsbCkgeyByZXR1cm4gd2lkZ2V0LmhlaWdodCB9XG4gICAgdmFyIGNtID0gd2lkZ2V0LmRvYy5jbTtcbiAgICBpZiAoIWNtKSB7IHJldHVybiAwIH1cbiAgICBpZiAoIWNvbnRhaW5zKGRvY3VtZW50LmJvZHksIHdpZGdldC5ub2RlKSkge1xuICAgICAgdmFyIHBhcmVudFN0eWxlID0gXCJwb3NpdGlvbjogcmVsYXRpdmU7XCI7XG4gICAgICBpZiAod2lkZ2V0LmNvdmVyR3V0dGVyKVxuICAgICAgICB7IHBhcmVudFN0eWxlICs9IFwibWFyZ2luLWxlZnQ6IC1cIiArIGNtLmRpc3BsYXkuZ3V0dGVycy5vZmZzZXRXaWR0aCArIFwicHg7XCI7IH1cbiAgICAgIGlmICh3aWRnZXQubm9IU2Nyb2xsKVxuICAgICAgICB7IHBhcmVudFN0eWxlICs9IFwid2lkdGg6IFwiICsgY20uZGlzcGxheS53cmFwcGVyLmNsaWVudFdpZHRoICsgXCJweDtcIjsgfVxuICAgICAgcmVtb3ZlQ2hpbGRyZW5BbmRBZGQoY20uZGlzcGxheS5tZWFzdXJlLCBlbHQoXCJkaXZcIiwgW3dpZGdldC5ub2RlXSwgbnVsbCwgcGFyZW50U3R5bGUpKTtcbiAgICB9XG4gICAgcmV0dXJuIHdpZGdldC5oZWlnaHQgPSB3aWRnZXQubm9kZS5wYXJlbnROb2RlLm9mZnNldEhlaWdodFxuICB9XG5cbiAgLy8gUmV0dXJuIHRydWUgd2hlbiB0aGUgZ2l2ZW4gbW91c2UgZXZlbnQgaGFwcGVuZWQgaW4gYSB3aWRnZXRcbiAgZnVuY3Rpb24gZXZlbnRJbldpZGdldChkaXNwbGF5LCBlKSB7XG4gICAgZm9yICh2YXIgbiA9IGVfdGFyZ2V0KGUpOyBuICE9IGRpc3BsYXkud3JhcHBlcjsgbiA9IG4ucGFyZW50Tm9kZSkge1xuICAgICAgaWYgKCFuIHx8IChuLm5vZGVUeXBlID09IDEgJiYgbi5nZXRBdHRyaWJ1dGUoXCJjbS1pZ25vcmUtZXZlbnRzXCIpID09IFwidHJ1ZVwiKSB8fFxuICAgICAgICAgIChuLnBhcmVudE5vZGUgPT0gZGlzcGxheS5zaXplciAmJiBuICE9IGRpc3BsYXkubW92ZXIpKVxuICAgICAgICB7IHJldHVybiB0cnVlIH1cbiAgICB9XG4gIH1cblxuICAvLyBQT1NJVElPTiBNRUFTVVJFTUVOVFxuXG4gIGZ1bmN0aW9uIHBhZGRpbmdUb3AoZGlzcGxheSkge3JldHVybiBkaXNwbGF5LmxpbmVTcGFjZS5vZmZzZXRUb3B9XG4gIGZ1bmN0aW9uIHBhZGRpbmdWZXJ0KGRpc3BsYXkpIHtyZXR1cm4gZGlzcGxheS5tb3Zlci5vZmZzZXRIZWlnaHQgLSBkaXNwbGF5LmxpbmVTcGFjZS5vZmZzZXRIZWlnaHR9XG4gIGZ1bmN0aW9uIHBhZGRpbmdIKGRpc3BsYXkpIHtcbiAgICBpZiAoZGlzcGxheS5jYWNoZWRQYWRkaW5nSCkgeyByZXR1cm4gZGlzcGxheS5jYWNoZWRQYWRkaW5nSCB9XG4gICAgdmFyIGUgPSByZW1vdmVDaGlsZHJlbkFuZEFkZChkaXNwbGF5Lm1lYXN1cmUsIGVsdChcInByZVwiLCBcInhcIiwgXCJDb2RlTWlycm9yLWxpbmUtbGlrZVwiKSk7XG4gICAgdmFyIHN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUgPyB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKSA6IGUuY3VycmVudFN0eWxlO1xuICAgIHZhciBkYXRhID0ge2xlZnQ6IHBhcnNlSW50KHN0eWxlLnBhZGRpbmdMZWZ0KSwgcmlnaHQ6IHBhcnNlSW50KHN0eWxlLnBhZGRpbmdSaWdodCl9O1xuICAgIGlmICghaXNOYU4oZGF0YS5sZWZ0KSAmJiAhaXNOYU4oZGF0YS5yaWdodCkpIHsgZGlzcGxheS5jYWNoZWRQYWRkaW5nSCA9IGRhdGE7IH1cbiAgICByZXR1cm4gZGF0YVxuICB9XG5cbiAgZnVuY3Rpb24gc2Nyb2xsR2FwKGNtKSB7IHJldHVybiBzY3JvbGxlckdhcCAtIGNtLmRpc3BsYXkubmF0aXZlQmFyV2lkdGggfVxuICBmdW5jdGlvbiBkaXNwbGF5V2lkdGgoY20pIHtcbiAgICByZXR1cm4gY20uZGlzcGxheS5zY3JvbGxlci5jbGllbnRXaWR0aCAtIHNjcm9sbEdhcChjbSkgLSBjbS5kaXNwbGF5LmJhcldpZHRoXG4gIH1cbiAgZnVuY3Rpb24gZGlzcGxheUhlaWdodChjbSkge1xuICAgIHJldHVybiBjbS5kaXNwbGF5LnNjcm9sbGVyLmNsaWVudEhlaWdodCAtIHNjcm9sbEdhcChjbSkgLSBjbS5kaXNwbGF5LmJhckhlaWdodFxuICB9XG5cbiAgLy8gRW5zdXJlIHRoZSBsaW5lVmlldy53cmFwcGluZy5oZWlnaHRzIGFycmF5IGlzIHBvcHVsYXRlZC4gVGhpcyBpc1xuICAvLyBhbiBhcnJheSBvZiBib3R0b20gb2Zmc2V0cyBmb3IgdGhlIGxpbmVzIHRoYXQgbWFrZSB1cCBhIGRyYXduXG4gIC8vIGxpbmUuIFdoZW4gbGluZVdyYXBwaW5nIGlzIG9uLCB0aGVyZSBtaWdodCBiZSBtb3JlIHRoYW4gb25lXG4gIC8vIGhlaWdodC5cbiAgZnVuY3Rpb24gZW5zdXJlTGluZUhlaWdodHMoY20sIGxpbmVWaWV3LCByZWN0KSB7XG4gICAgdmFyIHdyYXBwaW5nID0gY20ub3B0aW9ucy5saW5lV3JhcHBpbmc7XG4gICAgdmFyIGN1cldpZHRoID0gd3JhcHBpbmcgJiYgZGlzcGxheVdpZHRoKGNtKTtcbiAgICBpZiAoIWxpbmVWaWV3Lm1lYXN1cmUuaGVpZ2h0cyB8fCB3cmFwcGluZyAmJiBsaW5lVmlldy5tZWFzdXJlLndpZHRoICE9IGN1cldpZHRoKSB7XG4gICAgICB2YXIgaGVpZ2h0cyA9IGxpbmVWaWV3Lm1lYXN1cmUuaGVpZ2h0cyA9IFtdO1xuICAgICAgaWYgKHdyYXBwaW5nKSB7XG4gICAgICAgIGxpbmVWaWV3Lm1lYXN1cmUud2lkdGggPSBjdXJXaWR0aDtcbiAgICAgICAgdmFyIHJlY3RzID0gbGluZVZpZXcudGV4dC5maXJzdENoaWxkLmdldENsaWVudFJlY3RzKCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVjdHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgdmFyIGN1ciA9IHJlY3RzW2ldLCBuZXh0ID0gcmVjdHNbaSArIDFdO1xuICAgICAgICAgIGlmIChNYXRoLmFicyhjdXIuYm90dG9tIC0gbmV4dC5ib3R0b20pID4gMilcbiAgICAgICAgICAgIHsgaGVpZ2h0cy5wdXNoKChjdXIuYm90dG9tICsgbmV4dC50b3ApIC8gMiAtIHJlY3QudG9wKTsgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBoZWlnaHRzLnB1c2gocmVjdC5ib3R0b20gLSByZWN0LnRvcCk7XG4gICAgfVxuICB9XG5cbiAgLy8gRmluZCBhIGxpbmUgbWFwIChtYXBwaW5nIGNoYXJhY3RlciBvZmZzZXRzIHRvIHRleHQgbm9kZXMpIGFuZCBhXG4gIC8vIG1lYXN1cmVtZW50IGNhY2hlIGZvciB0aGUgZ2l2ZW4gbGluZSBudW1iZXIuIChBIGxpbmUgdmlldyBtaWdodFxuICAvLyBjb250YWluIG11bHRpcGxlIGxpbmVzIHdoZW4gY29sbGFwc2VkIHJhbmdlcyBhcmUgcHJlc2VudC4pXG4gIGZ1bmN0aW9uIG1hcEZyb21MaW5lVmlldyhsaW5lVmlldywgbGluZSwgbGluZU4pIHtcbiAgICBpZiAobGluZVZpZXcubGluZSA9PSBsaW5lKVxuICAgICAgeyByZXR1cm4ge21hcDogbGluZVZpZXcubWVhc3VyZS5tYXAsIGNhY2hlOiBsaW5lVmlldy5tZWFzdXJlLmNhY2hlfSB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lVmlldy5yZXN0Lmxlbmd0aDsgaSsrKVxuICAgICAgeyBpZiAobGluZVZpZXcucmVzdFtpXSA9PSBsaW5lKVxuICAgICAgICB7IHJldHVybiB7bWFwOiBsaW5lVmlldy5tZWFzdXJlLm1hcHNbaV0sIGNhY2hlOiBsaW5lVmlldy5tZWFzdXJlLmNhY2hlc1tpXX0gfSB9XG4gICAgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgbGluZVZpZXcucmVzdC5sZW5ndGg7IGkkMSsrKVxuICAgICAgeyBpZiAobGluZU5vKGxpbmVWaWV3LnJlc3RbaSQxXSkgPiBsaW5lTilcbiAgICAgICAgeyByZXR1cm4ge21hcDogbGluZVZpZXcubWVhc3VyZS5tYXBzW2kkMV0sIGNhY2hlOiBsaW5lVmlldy5tZWFzdXJlLmNhY2hlc1tpJDFdLCBiZWZvcmU6IHRydWV9IH0gfVxuICB9XG5cbiAgLy8gUmVuZGVyIGEgbGluZSBpbnRvIHRoZSBoaWRkZW4gbm9kZSBkaXNwbGF5LmV4dGVybmFsTWVhc3VyZWQuIFVzZWRcbiAgLy8gd2hlbiBtZWFzdXJlbWVudCBpcyBuZWVkZWQgZm9yIGEgbGluZSB0aGF0J3Mgbm90IGluIHRoZSB2aWV3cG9ydC5cbiAgZnVuY3Rpb24gdXBkYXRlRXh0ZXJuYWxNZWFzdXJlbWVudChjbSwgbGluZSkge1xuICAgIGxpbmUgPSB2aXN1YWxMaW5lKGxpbmUpO1xuICAgIHZhciBsaW5lTiA9IGxpbmVObyhsaW5lKTtcbiAgICB2YXIgdmlldyA9IGNtLmRpc3BsYXkuZXh0ZXJuYWxNZWFzdXJlZCA9IG5ldyBMaW5lVmlldyhjbS5kb2MsIGxpbmUsIGxpbmVOKTtcbiAgICB2aWV3LmxpbmVOID0gbGluZU47XG4gICAgdmFyIGJ1aWx0ID0gdmlldy5idWlsdCA9IGJ1aWxkTGluZUNvbnRlbnQoY20sIHZpZXcpO1xuICAgIHZpZXcudGV4dCA9IGJ1aWx0LnByZTtcbiAgICByZW1vdmVDaGlsZHJlbkFuZEFkZChjbS5kaXNwbGF5LmxpbmVNZWFzdXJlLCBidWlsdC5wcmUpO1xuICAgIHJldHVybiB2aWV3XG4gIH1cblxuICAvLyBHZXQgYSB7dG9wLCBib3R0b20sIGxlZnQsIHJpZ2h0fSBib3ggKGluIGxpbmUtbG9jYWwgY29vcmRpbmF0ZXMpXG4gIC8vIGZvciBhIGdpdmVuIGNoYXJhY3Rlci5cbiAgZnVuY3Rpb24gbWVhc3VyZUNoYXIoY20sIGxpbmUsIGNoLCBiaWFzKSB7XG4gICAgcmV0dXJuIG1lYXN1cmVDaGFyUHJlcGFyZWQoY20sIHByZXBhcmVNZWFzdXJlRm9yTGluZShjbSwgbGluZSksIGNoLCBiaWFzKVxuICB9XG5cbiAgLy8gRmluZCBhIGxpbmUgdmlldyB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiBsaW5lIG51bWJlci5cbiAgZnVuY3Rpb24gZmluZFZpZXdGb3JMaW5lKGNtLCBsaW5lTikge1xuICAgIGlmIChsaW5lTiA+PSBjbS5kaXNwbGF5LnZpZXdGcm9tICYmIGxpbmVOIDwgY20uZGlzcGxheS52aWV3VG8pXG4gICAgICB7IHJldHVybiBjbS5kaXNwbGF5LnZpZXdbZmluZFZpZXdJbmRleChjbSwgbGluZU4pXSB9XG4gICAgdmFyIGV4dCA9IGNtLmRpc3BsYXkuZXh0ZXJuYWxNZWFzdXJlZDtcbiAgICBpZiAoZXh0ICYmIGxpbmVOID49IGV4dC5saW5lTiAmJiBsaW5lTiA8IGV4dC5saW5lTiArIGV4dC5zaXplKVxuICAgICAgeyByZXR1cm4gZXh0IH1cbiAgfVxuXG4gIC8vIE1lYXN1cmVtZW50IGNhbiBiZSBzcGxpdCBpbiB0d28gc3RlcHMsIHRoZSBzZXQtdXAgd29yayB0aGF0XG4gIC8vIGFwcGxpZXMgdG8gdGhlIHdob2xlIGxpbmUsIGFuZCB0aGUgbWVhc3VyZW1lbnQgb2YgdGhlIGFjdHVhbFxuICAvLyBjaGFyYWN0ZXIuIEZ1bmN0aW9ucyBsaWtlIGNvb3Jkc0NoYXIsIHRoYXQgbmVlZCB0byBkbyBhIGxvdCBvZlxuICAvLyBtZWFzdXJlbWVudHMgaW4gYSByb3csIGNhbiB0aHVzIGVuc3VyZSB0aGF0IHRoZSBzZXQtdXAgd29yayBpc1xuICAvLyBvbmx5IGRvbmUgb25jZS5cbiAgZnVuY3Rpb24gcHJlcGFyZU1lYXN1cmVGb3JMaW5lKGNtLCBsaW5lKSB7XG4gICAgdmFyIGxpbmVOID0gbGluZU5vKGxpbmUpO1xuICAgIHZhciB2aWV3ID0gZmluZFZpZXdGb3JMaW5lKGNtLCBsaW5lTik7XG4gICAgaWYgKHZpZXcgJiYgIXZpZXcudGV4dCkge1xuICAgICAgdmlldyA9IG51bGw7XG4gICAgfSBlbHNlIGlmICh2aWV3ICYmIHZpZXcuY2hhbmdlcykge1xuICAgICAgdXBkYXRlTGluZUZvckNoYW5nZXMoY20sIHZpZXcsIGxpbmVOLCBnZXREaW1lbnNpb25zKGNtKSk7XG4gICAgICBjbS5jdXJPcC5mb3JjZVVwZGF0ZSA9IHRydWU7XG4gICAgfVxuICAgIGlmICghdmlldylcbiAgICAgIHsgdmlldyA9IHVwZGF0ZUV4dGVybmFsTWVhc3VyZW1lbnQoY20sIGxpbmUpOyB9XG5cbiAgICB2YXIgaW5mbyA9IG1hcEZyb21MaW5lVmlldyh2aWV3LCBsaW5lLCBsaW5lTik7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxpbmU6IGxpbmUsIHZpZXc6IHZpZXcsIHJlY3Q6IG51bGwsXG4gICAgICBtYXA6IGluZm8ubWFwLCBjYWNoZTogaW5mby5jYWNoZSwgYmVmb3JlOiBpbmZvLmJlZm9yZSxcbiAgICAgIGhhc0hlaWdodHM6IGZhbHNlXG4gICAgfVxuICB9XG5cbiAgLy8gR2l2ZW4gYSBwcmVwYXJlZCBtZWFzdXJlbWVudCBvYmplY3QsIG1lYXN1cmVzIHRoZSBwb3NpdGlvbiBvZiBhblxuICAvLyBhY3R1YWwgY2hhcmFjdGVyIChvciBmZXRjaGVzIGl0IGZyb20gdGhlIGNhY2hlKS5cbiAgZnVuY3Rpb24gbWVhc3VyZUNoYXJQcmVwYXJlZChjbSwgcHJlcGFyZWQsIGNoLCBiaWFzLCB2YXJIZWlnaHQpIHtcbiAgICBpZiAocHJlcGFyZWQuYmVmb3JlKSB7IGNoID0gLTE7IH1cbiAgICB2YXIga2V5ID0gY2ggKyAoYmlhcyB8fCBcIlwiKSwgZm91bmQ7XG4gICAgaWYgKHByZXBhcmVkLmNhY2hlLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgIGZvdW5kID0gcHJlcGFyZWQuY2FjaGVba2V5XTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFwcmVwYXJlZC5yZWN0KVxuICAgICAgICB7IHByZXBhcmVkLnJlY3QgPSBwcmVwYXJlZC52aWV3LnRleHQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7IH1cbiAgICAgIGlmICghcHJlcGFyZWQuaGFzSGVpZ2h0cykge1xuICAgICAgICBlbnN1cmVMaW5lSGVpZ2h0cyhjbSwgcHJlcGFyZWQudmlldywgcHJlcGFyZWQucmVjdCk7XG4gICAgICAgIHByZXBhcmVkLmhhc0hlaWdodHMgPSB0cnVlO1xuICAgICAgfVxuICAgICAgZm91bmQgPSBtZWFzdXJlQ2hhcklubmVyKGNtLCBwcmVwYXJlZCwgY2gsIGJpYXMpO1xuICAgICAgaWYgKCFmb3VuZC5ib2d1cykgeyBwcmVwYXJlZC5jYWNoZVtrZXldID0gZm91bmQ7IH1cbiAgICB9XG4gICAgcmV0dXJuIHtsZWZ0OiBmb3VuZC5sZWZ0LCByaWdodDogZm91bmQucmlnaHQsXG4gICAgICAgICAgICB0b3A6IHZhckhlaWdodCA/IGZvdW5kLnJ0b3AgOiBmb3VuZC50b3AsXG4gICAgICAgICAgICBib3R0b206IHZhckhlaWdodCA/IGZvdW5kLnJib3R0b20gOiBmb3VuZC5ib3R0b219XG4gIH1cblxuICB2YXIgbnVsbFJlY3QgPSB7bGVmdDogMCwgcmlnaHQ6IDAsIHRvcDogMCwgYm90dG9tOiAwfTtcblxuICBmdW5jdGlvbiBub2RlQW5kT2Zmc2V0SW5MaW5lTWFwKG1hcCwgY2gsIGJpYXMpIHtcbiAgICB2YXIgbm9kZSwgc3RhcnQsIGVuZCwgY29sbGFwc2UsIG1TdGFydCwgbUVuZDtcbiAgICAvLyBGaXJzdCwgc2VhcmNoIHRoZSBsaW5lIG1hcCBmb3IgdGhlIHRleHQgbm9kZSBjb3JyZXNwb25kaW5nIHRvLFxuICAgIC8vIG9yIGNsb3Nlc3QgdG8sIHRoZSB0YXJnZXQgY2hhcmFjdGVyLlxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFwLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICBtU3RhcnQgPSBtYXBbaV07XG4gICAgICBtRW5kID0gbWFwW2kgKyAxXTtcbiAgICAgIGlmIChjaCA8IG1TdGFydCkge1xuICAgICAgICBzdGFydCA9IDA7IGVuZCA9IDE7XG4gICAgICAgIGNvbGxhcHNlID0gXCJsZWZ0XCI7XG4gICAgICB9IGVsc2UgaWYgKGNoIDwgbUVuZCkge1xuICAgICAgICBzdGFydCA9IGNoIC0gbVN0YXJ0O1xuICAgICAgICBlbmQgPSBzdGFydCArIDE7XG4gICAgICB9IGVsc2UgaWYgKGkgPT0gbWFwLmxlbmd0aCAtIDMgfHwgY2ggPT0gbUVuZCAmJiBtYXBbaSArIDNdID4gY2gpIHtcbiAgICAgICAgZW5kID0gbUVuZCAtIG1TdGFydDtcbiAgICAgICAgc3RhcnQgPSBlbmQgLSAxO1xuICAgICAgICBpZiAoY2ggPj0gbUVuZCkgeyBjb2xsYXBzZSA9IFwicmlnaHRcIjsgfVxuICAgICAgfVxuICAgICAgaWYgKHN0YXJ0ICE9IG51bGwpIHtcbiAgICAgICAgbm9kZSA9IG1hcFtpICsgMl07XG4gICAgICAgIGlmIChtU3RhcnQgPT0gbUVuZCAmJiBiaWFzID09IChub2RlLmluc2VydExlZnQgPyBcImxlZnRcIiA6IFwicmlnaHRcIikpXG4gICAgICAgICAgeyBjb2xsYXBzZSA9IGJpYXM7IH1cbiAgICAgICAgaWYgKGJpYXMgPT0gXCJsZWZ0XCIgJiYgc3RhcnQgPT0gMClcbiAgICAgICAgICB7IHdoaWxlIChpICYmIG1hcFtpIC0gMl0gPT0gbWFwW2kgLSAzXSAmJiBtYXBbaSAtIDFdLmluc2VydExlZnQpIHtcbiAgICAgICAgICAgIG5vZGUgPSBtYXBbKGkgLT0gMykgKyAyXTtcbiAgICAgICAgICAgIGNvbGxhcHNlID0gXCJsZWZ0XCI7XG4gICAgICAgICAgfSB9XG4gICAgICAgIGlmIChiaWFzID09IFwicmlnaHRcIiAmJiBzdGFydCA9PSBtRW5kIC0gbVN0YXJ0KVxuICAgICAgICAgIHsgd2hpbGUgKGkgPCBtYXAubGVuZ3RoIC0gMyAmJiBtYXBbaSArIDNdID09IG1hcFtpICsgNF0gJiYgIW1hcFtpICsgNV0uaW5zZXJ0TGVmdCkge1xuICAgICAgICAgICAgbm9kZSA9IG1hcFsoaSArPSAzKSArIDJdO1xuICAgICAgICAgICAgY29sbGFwc2UgPSBcInJpZ2h0XCI7XG4gICAgICAgICAgfSB9XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7bm9kZTogbm9kZSwgc3RhcnQ6IHN0YXJ0LCBlbmQ6IGVuZCwgY29sbGFwc2U6IGNvbGxhcHNlLCBjb3ZlclN0YXJ0OiBtU3RhcnQsIGNvdmVyRW5kOiBtRW5kfVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0VXNlZnVsUmVjdChyZWN0cywgYmlhcykge1xuICAgIHZhciByZWN0ID0gbnVsbFJlY3Q7XG4gICAgaWYgKGJpYXMgPT0gXCJsZWZ0XCIpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCByZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKChyZWN0ID0gcmVjdHNbaV0pLmxlZnQgIT0gcmVjdC5yaWdodCkgeyBicmVhayB9XG4gICAgfSB9IGVsc2UgeyBmb3IgKHZhciBpJDEgPSByZWN0cy5sZW5ndGggLSAxOyBpJDEgPj0gMDsgaSQxLS0pIHtcbiAgICAgIGlmICgocmVjdCA9IHJlY3RzW2kkMV0pLmxlZnQgIT0gcmVjdC5yaWdodCkgeyBicmVhayB9XG4gICAgfSB9XG4gICAgcmV0dXJuIHJlY3RcbiAgfVxuXG4gIGZ1bmN0aW9uIG1lYXN1cmVDaGFySW5uZXIoY20sIHByZXBhcmVkLCBjaCwgYmlhcykge1xuICAgIHZhciBwbGFjZSA9IG5vZGVBbmRPZmZzZXRJbkxpbmVNYXAocHJlcGFyZWQubWFwLCBjaCwgYmlhcyk7XG4gICAgdmFyIG5vZGUgPSBwbGFjZS5ub2RlLCBzdGFydCA9IHBsYWNlLnN0YXJ0LCBlbmQgPSBwbGFjZS5lbmQsIGNvbGxhcHNlID0gcGxhY2UuY29sbGFwc2U7XG5cbiAgICB2YXIgcmVjdDtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAzKSB7IC8vIElmIGl0IGlzIGEgdGV4dCBub2RlLCB1c2UgYSByYW5nZSB0byByZXRyaWV2ZSB0aGUgY29vcmRpbmF0ZXMuXG4gICAgICBmb3IgKHZhciBpJDEgPSAwOyBpJDEgPCA0OyBpJDErKykgeyAvLyBSZXRyeSBhIG1heGltdW0gb2YgNCB0aW1lcyB3aGVuIG5vbnNlbnNlIHJlY3RhbmdsZXMgYXJlIHJldHVybmVkXG4gICAgICAgIHdoaWxlIChzdGFydCAmJiBpc0V4dGVuZGluZ0NoYXIocHJlcGFyZWQubGluZS50ZXh0LmNoYXJBdChwbGFjZS5jb3ZlclN0YXJ0ICsgc3RhcnQpKSkgeyAtLXN0YXJ0OyB9XG4gICAgICAgIHdoaWxlIChwbGFjZS5jb3ZlclN0YXJ0ICsgZW5kIDwgcGxhY2UuY292ZXJFbmQgJiYgaXNFeHRlbmRpbmdDaGFyKHByZXBhcmVkLmxpbmUudGV4dC5jaGFyQXQocGxhY2UuY292ZXJTdGFydCArIGVuZCkpKSB7ICsrZW5kOyB9XG4gICAgICAgIGlmIChpZSAmJiBpZV92ZXJzaW9uIDwgOSAmJiBzdGFydCA9PSAwICYmIGVuZCA9PSBwbGFjZS5jb3ZlckVuZCAtIHBsYWNlLmNvdmVyU3RhcnQpXG4gICAgICAgICAgeyByZWN0ID0gbm9kZS5wYXJlbnROb2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOyB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICB7IHJlY3QgPSBnZXRVc2VmdWxSZWN0KHJhbmdlKG5vZGUsIHN0YXJ0LCBlbmQpLmdldENsaWVudFJlY3RzKCksIGJpYXMpOyB9XG4gICAgICAgIGlmIChyZWN0LmxlZnQgfHwgcmVjdC5yaWdodCB8fCBzdGFydCA9PSAwKSB7IGJyZWFrIH1cbiAgICAgICAgZW5kID0gc3RhcnQ7XG4gICAgICAgIHN0YXJ0ID0gc3RhcnQgLSAxO1xuICAgICAgICBjb2xsYXBzZSA9IFwicmlnaHRcIjtcbiAgICAgIH1cbiAgICAgIGlmIChpZSAmJiBpZV92ZXJzaW9uIDwgMTEpIHsgcmVjdCA9IG1heWJlVXBkYXRlUmVjdEZvclpvb21pbmcoY20uZGlzcGxheS5tZWFzdXJlLCByZWN0KTsgfVxuICAgIH0gZWxzZSB7IC8vIElmIGl0IGlzIGEgd2lkZ2V0LCBzaW1wbHkgZ2V0IHRoZSBib3ggZm9yIHRoZSB3aG9sZSB3aWRnZXQuXG4gICAgICBpZiAoc3RhcnQgPiAwKSB7IGNvbGxhcHNlID0gYmlhcyA9IFwicmlnaHRcIjsgfVxuICAgICAgdmFyIHJlY3RzO1xuICAgICAgaWYgKGNtLm9wdGlvbnMubGluZVdyYXBwaW5nICYmIChyZWN0cyA9IG5vZGUuZ2V0Q2xpZW50UmVjdHMoKSkubGVuZ3RoID4gMSlcbiAgICAgICAgeyByZWN0ID0gcmVjdHNbYmlhcyA9PSBcInJpZ2h0XCIgPyByZWN0cy5sZW5ndGggLSAxIDogMF07IH1cbiAgICAgIGVsc2VcbiAgICAgICAgeyByZWN0ID0gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsgfVxuICAgIH1cbiAgICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8IDkgJiYgIXN0YXJ0ICYmICghcmVjdCB8fCAhcmVjdC5sZWZ0ICYmICFyZWN0LnJpZ2h0KSkge1xuICAgICAgdmFyIHJTcGFuID0gbm9kZS5wYXJlbnROb2RlLmdldENsaWVudFJlY3RzKClbMF07XG4gICAgICBpZiAoclNwYW4pXG4gICAgICAgIHsgcmVjdCA9IHtsZWZ0OiByU3Bhbi5sZWZ0LCByaWdodDogclNwYW4ubGVmdCArIGNoYXJXaWR0aChjbS5kaXNwbGF5KSwgdG9wOiByU3Bhbi50b3AsIGJvdHRvbTogclNwYW4uYm90dG9tfTsgfVxuICAgICAgZWxzZVxuICAgICAgICB7IHJlY3QgPSBudWxsUmVjdDsgfVxuICAgIH1cblxuICAgIHZhciBydG9wID0gcmVjdC50b3AgLSBwcmVwYXJlZC5yZWN0LnRvcCwgcmJvdCA9IHJlY3QuYm90dG9tIC0gcHJlcGFyZWQucmVjdC50b3A7XG4gICAgdmFyIG1pZCA9IChydG9wICsgcmJvdCkgLyAyO1xuICAgIHZhciBoZWlnaHRzID0gcHJlcGFyZWQudmlldy5tZWFzdXJlLmhlaWdodHM7XG4gICAgdmFyIGkgPSAwO1xuICAgIGZvciAoOyBpIDwgaGVpZ2h0cy5sZW5ndGggLSAxOyBpKyspXG4gICAgICB7IGlmIChtaWQgPCBoZWlnaHRzW2ldKSB7IGJyZWFrIH0gfVxuICAgIHZhciB0b3AgPSBpID8gaGVpZ2h0c1tpIC0gMV0gOiAwLCBib3QgPSBoZWlnaHRzW2ldO1xuICAgIHZhciByZXN1bHQgPSB7bGVmdDogKGNvbGxhcHNlID09IFwicmlnaHRcIiA/IHJlY3QucmlnaHQgOiByZWN0LmxlZnQpIC0gcHJlcGFyZWQucmVjdC5sZWZ0LFxuICAgICAgICAgICAgICAgICAgcmlnaHQ6IChjb2xsYXBzZSA9PSBcImxlZnRcIiA/IHJlY3QubGVmdCA6IHJlY3QucmlnaHQpIC0gcHJlcGFyZWQucmVjdC5sZWZ0LFxuICAgICAgICAgICAgICAgICAgdG9wOiB0b3AsIGJvdHRvbTogYm90fTtcbiAgICBpZiAoIXJlY3QubGVmdCAmJiAhcmVjdC5yaWdodCkgeyByZXN1bHQuYm9ndXMgPSB0cnVlOyB9XG4gICAgaWYgKCFjbS5vcHRpb25zLnNpbmdsZUN1cnNvckhlaWdodFBlckxpbmUpIHsgcmVzdWx0LnJ0b3AgPSBydG9wOyByZXN1bHQucmJvdHRvbSA9IHJib3Q7IH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8vIFdvcmsgYXJvdW5kIHByb2JsZW0gd2l0aCBib3VuZGluZyBjbGllbnQgcmVjdHMgb24gcmFuZ2VzIGJlaW5nXG4gIC8vIHJldHVybmVkIGluY29ycmVjdGx5IHdoZW4gem9vbWVkIG9uIElFMTAgYW5kIGJlbG93LlxuICBmdW5jdGlvbiBtYXliZVVwZGF0ZVJlY3RGb3Jab29taW5nKG1lYXN1cmUsIHJlY3QpIHtcbiAgICBpZiAoIXdpbmRvdy5zY3JlZW4gfHwgc2NyZWVuLmxvZ2ljYWxYRFBJID09IG51bGwgfHxcbiAgICAgICAgc2NyZWVuLmxvZ2ljYWxYRFBJID09IHNjcmVlbi5kZXZpY2VYRFBJIHx8ICFoYXNCYWRab29tZWRSZWN0cyhtZWFzdXJlKSlcbiAgICAgIHsgcmV0dXJuIHJlY3QgfVxuICAgIHZhciBzY2FsZVggPSBzY3JlZW4ubG9naWNhbFhEUEkgLyBzY3JlZW4uZGV2aWNlWERQSTtcbiAgICB2YXIgc2NhbGVZID0gc2NyZWVuLmxvZ2ljYWxZRFBJIC8gc2NyZWVuLmRldmljZVlEUEk7XG4gICAgcmV0dXJuIHtsZWZ0OiByZWN0LmxlZnQgKiBzY2FsZVgsIHJpZ2h0OiByZWN0LnJpZ2h0ICogc2NhbGVYLFxuICAgICAgICAgICAgdG9wOiByZWN0LnRvcCAqIHNjYWxlWSwgYm90dG9tOiByZWN0LmJvdHRvbSAqIHNjYWxlWX1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNsZWFyTGluZU1lYXN1cmVtZW50Q2FjaGVGb3IobGluZVZpZXcpIHtcbiAgICBpZiAobGluZVZpZXcubWVhc3VyZSkge1xuICAgICAgbGluZVZpZXcubWVhc3VyZS5jYWNoZSA9IHt9O1xuICAgICAgbGluZVZpZXcubWVhc3VyZS5oZWlnaHRzID0gbnVsbDtcbiAgICAgIGlmIChsaW5lVmlldy5yZXN0KSB7IGZvciAodmFyIGkgPSAwOyBpIDwgbGluZVZpZXcucmVzdC5sZW5ndGg7IGkrKylcbiAgICAgICAgeyBsaW5lVmlldy5tZWFzdXJlLmNhY2hlc1tpXSA9IHt9OyB9IH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjbGVhckxpbmVNZWFzdXJlbWVudENhY2hlKGNtKSB7XG4gICAgY20uZGlzcGxheS5leHRlcm5hbE1lYXN1cmUgPSBudWxsO1xuICAgIHJlbW92ZUNoaWxkcmVuKGNtLmRpc3BsYXkubGluZU1lYXN1cmUpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY20uZGlzcGxheS52aWV3Lmxlbmd0aDsgaSsrKVxuICAgICAgeyBjbGVhckxpbmVNZWFzdXJlbWVudENhY2hlRm9yKGNtLmRpc3BsYXkudmlld1tpXSk7IH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNsZWFyQ2FjaGVzKGNtKSB7XG4gICAgY2xlYXJMaW5lTWVhc3VyZW1lbnRDYWNoZShjbSk7XG4gICAgY20uZGlzcGxheS5jYWNoZWRDaGFyV2lkdGggPSBjbS5kaXNwbGF5LmNhY2hlZFRleHRIZWlnaHQgPSBjbS5kaXNwbGF5LmNhY2hlZFBhZGRpbmdIID0gbnVsbDtcbiAgICBpZiAoIWNtLm9wdGlvbnMubGluZVdyYXBwaW5nKSB7IGNtLmRpc3BsYXkubWF4TGluZUNoYW5nZWQgPSB0cnVlOyB9XG4gICAgY20uZGlzcGxheS5saW5lTnVtQ2hhcnMgPSBudWxsO1xuICB9XG5cbiAgZnVuY3Rpb24gcGFnZVNjcm9sbFgoKSB7XG4gICAgLy8gV29yayBhcm91bmQgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NDg5MjA2XG4gICAgLy8gd2hpY2ggY2F1c2VzIHBhZ2VfT2Zmc2V0IGFuZCBib3VuZGluZyBjbGllbnQgcmVjdHMgdG8gdXNlXG4gICAgLy8gZGlmZmVyZW50IHJlZmVyZW5jZSB2aWV3cG9ydHMgYW5kIGludmFsaWRhdGUgb3VyIGNhbGN1bGF0aW9ucy5cbiAgICBpZiAoY2hyb21lICYmIGFuZHJvaWQpIHsgcmV0dXJuIC0oZG9jdW1lbnQuYm9keS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0gcGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5tYXJnaW5MZWZ0KSkgfVxuICAgIHJldHVybiB3aW5kb3cucGFnZVhPZmZzZXQgfHwgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCB8fCBkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0XG4gIH1cbiAgZnVuY3Rpb24gcGFnZVNjcm9sbFkoKSB7XG4gICAgaWYgKGNocm9tZSAmJiBhbmRyb2lkKSB7IHJldHVybiAtKGRvY3VtZW50LmJvZHkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wIC0gcGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5tYXJnaW5Ub3ApKSB9XG4gICAgcmV0dXJuIHdpbmRvdy5wYWdlWU9mZnNldCB8fCAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IHx8IGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcFxuICB9XG5cbiAgZnVuY3Rpb24gd2lkZ2V0VG9wSGVpZ2h0KGxpbmVPYmopIHtcbiAgICB2YXIgaGVpZ2h0ID0gMDtcbiAgICBpZiAobGluZU9iai53aWRnZXRzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgbGluZU9iai53aWRnZXRzLmxlbmd0aDsgKytpKSB7IGlmIChsaW5lT2JqLndpZGdldHNbaV0uYWJvdmUpXG4gICAgICB7IGhlaWdodCArPSB3aWRnZXRIZWlnaHQobGluZU9iai53aWRnZXRzW2ldKTsgfSB9IH1cbiAgICByZXR1cm4gaGVpZ2h0XG4gIH1cblxuICAvLyBDb252ZXJ0cyBhIHt0b3AsIGJvdHRvbSwgbGVmdCwgcmlnaHR9IGJveCBmcm9tIGxpbmUtbG9jYWxcbiAgLy8gY29vcmRpbmF0ZXMgaW50byBhbm90aGVyIGNvb3JkaW5hdGUgc3lzdGVtLiBDb250ZXh0IG1heSBiZSBvbmUgb2ZcbiAgLy8gXCJsaW5lXCIsIFwiZGl2XCIgKGRpc3BsYXkubGluZURpdiksIFwibG9jYWxcIi4vbnVsbCAoZWRpdG9yKSwgXCJ3aW5kb3dcIixcbiAgLy8gb3IgXCJwYWdlXCIuXG4gIGZ1bmN0aW9uIGludG9Db29yZFN5c3RlbShjbSwgbGluZU9iaiwgcmVjdCwgY29udGV4dCwgaW5jbHVkZVdpZGdldHMpIHtcbiAgICBpZiAoIWluY2x1ZGVXaWRnZXRzKSB7XG4gICAgICB2YXIgaGVpZ2h0ID0gd2lkZ2V0VG9wSGVpZ2h0KGxpbmVPYmopO1xuICAgICAgcmVjdC50b3AgKz0gaGVpZ2h0OyByZWN0LmJvdHRvbSArPSBoZWlnaHQ7XG4gICAgfVxuICAgIGlmIChjb250ZXh0ID09IFwibGluZVwiKSB7IHJldHVybiByZWN0IH1cbiAgICBpZiAoIWNvbnRleHQpIHsgY29udGV4dCA9IFwibG9jYWxcIjsgfVxuICAgIHZhciB5T2ZmID0gaGVpZ2h0QXRMaW5lKGxpbmVPYmopO1xuICAgIGlmIChjb250ZXh0ID09IFwibG9jYWxcIikgeyB5T2ZmICs9IHBhZGRpbmdUb3AoY20uZGlzcGxheSk7IH1cbiAgICBlbHNlIHsgeU9mZiAtPSBjbS5kaXNwbGF5LnZpZXdPZmZzZXQ7IH1cbiAgICBpZiAoY29udGV4dCA9PSBcInBhZ2VcIiB8fCBjb250ZXh0ID09IFwid2luZG93XCIpIHtcbiAgICAgIHZhciBsT2ZmID0gY20uZGlzcGxheS5saW5lU3BhY2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICB5T2ZmICs9IGxPZmYudG9wICsgKGNvbnRleHQgPT0gXCJ3aW5kb3dcIiA/IDAgOiBwYWdlU2Nyb2xsWSgpKTtcbiAgICAgIHZhciB4T2ZmID0gbE9mZi5sZWZ0ICsgKGNvbnRleHQgPT0gXCJ3aW5kb3dcIiA/IDAgOiBwYWdlU2Nyb2xsWCgpKTtcbiAgICAgIHJlY3QubGVmdCArPSB4T2ZmOyByZWN0LnJpZ2h0ICs9IHhPZmY7XG4gICAgfVxuICAgIHJlY3QudG9wICs9IHlPZmY7IHJlY3QuYm90dG9tICs9IHlPZmY7XG4gICAgcmV0dXJuIHJlY3RcbiAgfVxuXG4gIC8vIENvdmVydHMgYSBib3ggZnJvbSBcImRpdlwiIGNvb3JkcyB0byBhbm90aGVyIGNvb3JkaW5hdGUgc3lzdGVtLlxuICAvLyBDb250ZXh0IG1heSBiZSBcIndpbmRvd1wiLCBcInBhZ2VcIiwgXCJkaXZcIiwgb3IgXCJsb2NhbFwiLi9udWxsLlxuICBmdW5jdGlvbiBmcm9tQ29vcmRTeXN0ZW0oY20sIGNvb3JkcywgY29udGV4dCkge1xuICAgIGlmIChjb250ZXh0ID09IFwiZGl2XCIpIHsgcmV0dXJuIGNvb3JkcyB9XG4gICAgdmFyIGxlZnQgPSBjb29yZHMubGVmdCwgdG9wID0gY29vcmRzLnRvcDtcbiAgICAvLyBGaXJzdCBtb3ZlIGludG8gXCJwYWdlXCIgY29vcmRpbmF0ZSBzeXN0ZW1cbiAgICBpZiAoY29udGV4dCA9PSBcInBhZ2VcIikge1xuICAgICAgbGVmdCAtPSBwYWdlU2Nyb2xsWCgpO1xuICAgICAgdG9wIC09IHBhZ2VTY3JvbGxZKCk7XG4gICAgfSBlbHNlIGlmIChjb250ZXh0ID09IFwibG9jYWxcIiB8fCAhY29udGV4dCkge1xuICAgICAgdmFyIGxvY2FsQm94ID0gY20uZGlzcGxheS5zaXplci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGxlZnQgKz0gbG9jYWxCb3gubGVmdDtcbiAgICAgIHRvcCArPSBsb2NhbEJveC50b3A7XG4gICAgfVxuXG4gICAgdmFyIGxpbmVTcGFjZUJveCA9IGNtLmRpc3BsYXkubGluZVNwYWNlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHJldHVybiB7bGVmdDogbGVmdCAtIGxpbmVTcGFjZUJveC5sZWZ0LCB0b3A6IHRvcCAtIGxpbmVTcGFjZUJveC50b3B9XG4gIH1cblxuICBmdW5jdGlvbiBjaGFyQ29vcmRzKGNtLCBwb3MsIGNvbnRleHQsIGxpbmVPYmosIGJpYXMpIHtcbiAgICBpZiAoIWxpbmVPYmopIHsgbGluZU9iaiA9IGdldExpbmUoY20uZG9jLCBwb3MubGluZSk7IH1cbiAgICByZXR1cm4gaW50b0Nvb3JkU3lzdGVtKGNtLCBsaW5lT2JqLCBtZWFzdXJlQ2hhcihjbSwgbGluZU9iaiwgcG9zLmNoLCBiaWFzKSwgY29udGV4dClcbiAgfVxuXG4gIC8vIFJldHVybnMgYSBib3ggZm9yIGEgZ2l2ZW4gY3Vyc29yIHBvc2l0aW9uLCB3aGljaCBtYXkgaGF2ZSBhblxuICAvLyAnb3RoZXInIHByb3BlcnR5IGNvbnRhaW5pbmcgdGhlIHBvc2l0aW9uIG9mIHRoZSBzZWNvbmRhcnkgY3Vyc29yXG4gIC8vIG9uIGEgYmlkaSBib3VuZGFyeS5cbiAgLy8gQSBjdXJzb3IgUG9zKGxpbmUsIGNoYXIsIFwiYmVmb3JlXCIpIGlzIG9uIHRoZSBzYW1lIHZpc3VhbCBsaW5lIGFzIGBjaGFyIC0gMWBcbiAgLy8gYW5kIGFmdGVyIGBjaGFyIC0gMWAgaW4gd3JpdGluZyBvcmRlciBvZiBgY2hhciAtIDFgXG4gIC8vIEEgY3Vyc29yIFBvcyhsaW5lLCBjaGFyLCBcImFmdGVyXCIpIGlzIG9uIHRoZSBzYW1lIHZpc3VhbCBsaW5lIGFzIGBjaGFyYFxuICAvLyBhbmQgYmVmb3JlIGBjaGFyYCBpbiB3cml0aW5nIG9yZGVyIG9mIGBjaGFyYFxuICAvLyBFeGFtcGxlcyAodXBwZXItY2FzZSBsZXR0ZXJzIGFyZSBSVEwsIGxvd2VyLWNhc2UgYXJlIExUUik6XG4gIC8vICAgICBQb3MoMCwgMSwgLi4uKVxuICAvLyAgICAgYmVmb3JlICAgYWZ0ZXJcbiAgLy8gYWIgICAgIGF8YiAgICAgYXxiXG4gIC8vIGFCICAgICBhfEIgICAgIGFCfFxuICAvLyBBYiAgICAgfEFiICAgICBBfGJcbiAgLy8gQUIgICAgIEJ8QSAgICAgQnxBXG4gIC8vIEV2ZXJ5IHBvc2l0aW9uIGFmdGVyIHRoZSBsYXN0IGNoYXJhY3RlciBvbiBhIGxpbmUgaXMgY29uc2lkZXJlZCB0byBzdGlja1xuICAvLyB0byB0aGUgbGFzdCBjaGFyYWN0ZXIgb24gdGhlIGxpbmUuXG4gIGZ1bmN0aW9uIGN1cnNvckNvb3JkcyhjbSwgcG9zLCBjb250ZXh0LCBsaW5lT2JqLCBwcmVwYXJlZE1lYXN1cmUsIHZhckhlaWdodCkge1xuICAgIGxpbmVPYmogPSBsaW5lT2JqIHx8IGdldExpbmUoY20uZG9jLCBwb3MubGluZSk7XG4gICAgaWYgKCFwcmVwYXJlZE1lYXN1cmUpIHsgcHJlcGFyZWRNZWFzdXJlID0gcHJlcGFyZU1lYXN1cmVGb3JMaW5lKGNtLCBsaW5lT2JqKTsgfVxuICAgIGZ1bmN0aW9uIGdldChjaCwgcmlnaHQpIHtcbiAgICAgIHZhciBtID0gbWVhc3VyZUNoYXJQcmVwYXJlZChjbSwgcHJlcGFyZWRNZWFzdXJlLCBjaCwgcmlnaHQgPyBcInJpZ2h0XCIgOiBcImxlZnRcIiwgdmFySGVpZ2h0KTtcbiAgICAgIGlmIChyaWdodCkgeyBtLmxlZnQgPSBtLnJpZ2h0OyB9IGVsc2UgeyBtLnJpZ2h0ID0gbS5sZWZ0OyB9XG4gICAgICByZXR1cm4gaW50b0Nvb3JkU3lzdGVtKGNtLCBsaW5lT2JqLCBtLCBjb250ZXh0KVxuICAgIH1cbiAgICB2YXIgb3JkZXIgPSBnZXRPcmRlcihsaW5lT2JqLCBjbS5kb2MuZGlyZWN0aW9uKSwgY2ggPSBwb3MuY2gsIHN0aWNreSA9IHBvcy5zdGlja3k7XG4gICAgaWYgKGNoID49IGxpbmVPYmoudGV4dC5sZW5ndGgpIHtcbiAgICAgIGNoID0gbGluZU9iai50ZXh0Lmxlbmd0aDtcbiAgICAgIHN0aWNreSA9IFwiYmVmb3JlXCI7XG4gICAgfSBlbHNlIGlmIChjaCA8PSAwKSB7XG4gICAgICBjaCA9IDA7XG4gICAgICBzdGlja3kgPSBcImFmdGVyXCI7XG4gICAgfVxuICAgIGlmICghb3JkZXIpIHsgcmV0dXJuIGdldChzdGlja3kgPT0gXCJiZWZvcmVcIiA/IGNoIC0gMSA6IGNoLCBzdGlja3kgPT0gXCJiZWZvcmVcIikgfVxuXG4gICAgZnVuY3Rpb24gZ2V0QmlkaShjaCwgcGFydFBvcywgaW52ZXJ0KSB7XG4gICAgICB2YXIgcGFydCA9IG9yZGVyW3BhcnRQb3NdLCByaWdodCA9IHBhcnQubGV2ZWwgPT0gMTtcbiAgICAgIHJldHVybiBnZXQoaW52ZXJ0ID8gY2ggLSAxIDogY2gsIHJpZ2h0ICE9IGludmVydClcbiAgICB9XG4gICAgdmFyIHBhcnRQb3MgPSBnZXRCaWRpUGFydEF0KG9yZGVyLCBjaCwgc3RpY2t5KTtcbiAgICB2YXIgb3RoZXIgPSBiaWRpT3RoZXI7XG4gICAgdmFyIHZhbCA9IGdldEJpZGkoY2gsIHBhcnRQb3MsIHN0aWNreSA9PSBcImJlZm9yZVwiKTtcbiAgICBpZiAob3RoZXIgIT0gbnVsbCkgeyB2YWwub3RoZXIgPSBnZXRCaWRpKGNoLCBvdGhlciwgc3RpY2t5ICE9IFwiYmVmb3JlXCIpOyB9XG4gICAgcmV0dXJuIHZhbFxuICB9XG5cbiAgLy8gVXNlZCB0byBjaGVhcGx5IGVzdGltYXRlIHRoZSBjb29yZGluYXRlcyBmb3IgYSBwb3NpdGlvbi4gVXNlZCBmb3JcbiAgLy8gaW50ZXJtZWRpYXRlIHNjcm9sbCB1cGRhdGVzLlxuICBmdW5jdGlvbiBlc3RpbWF0ZUNvb3JkcyhjbSwgcG9zKSB7XG4gICAgdmFyIGxlZnQgPSAwO1xuICAgIHBvcyA9IGNsaXBQb3MoY20uZG9jLCBwb3MpO1xuICAgIGlmICghY20ub3B0aW9ucy5saW5lV3JhcHBpbmcpIHsgbGVmdCA9IGNoYXJXaWR0aChjbS5kaXNwbGF5KSAqIHBvcy5jaDsgfVxuICAgIHZhciBsaW5lT2JqID0gZ2V0TGluZShjbS5kb2MsIHBvcy5saW5lKTtcbiAgICB2YXIgdG9wID0gaGVpZ2h0QXRMaW5lKGxpbmVPYmopICsgcGFkZGluZ1RvcChjbS5kaXNwbGF5KTtcbiAgICByZXR1cm4ge2xlZnQ6IGxlZnQsIHJpZ2h0OiBsZWZ0LCB0b3A6IHRvcCwgYm90dG9tOiB0b3AgKyBsaW5lT2JqLmhlaWdodH1cbiAgfVxuXG4gIC8vIFBvc2l0aW9ucyByZXR1cm5lZCBieSBjb29yZHNDaGFyIGNvbnRhaW4gc29tZSBleHRyYSBpbmZvcm1hdGlvbi5cbiAgLy8geFJlbCBpcyB0aGUgcmVsYXRpdmUgeCBwb3NpdGlvbiBvZiB0aGUgaW5wdXQgY29vcmRpbmF0ZXMgY29tcGFyZWRcbiAgLy8gdG8gdGhlIGZvdW5kIHBvc2l0aW9uIChzbyB4UmVsID4gMCBtZWFucyB0aGUgY29vcmRpbmF0ZXMgYXJlIHRvXG4gIC8vIHRoZSByaWdodCBvZiB0aGUgY2hhcmFjdGVyIHBvc2l0aW9uLCBmb3IgZXhhbXBsZSkuIFdoZW4gb3V0c2lkZVxuICAvLyBpcyB0cnVlLCB0aGF0IG1lYW5zIHRoZSBjb29yZGluYXRlcyBsaWUgb3V0c2lkZSB0aGUgbGluZSdzXG4gIC8vIHZlcnRpY2FsIHJhbmdlLlxuICBmdW5jdGlvbiBQb3NXaXRoSW5mbyhsaW5lLCBjaCwgc3RpY2t5LCBvdXRzaWRlLCB4UmVsKSB7XG4gICAgdmFyIHBvcyA9IFBvcyhsaW5lLCBjaCwgc3RpY2t5KTtcbiAgICBwb3MueFJlbCA9IHhSZWw7XG4gICAgaWYgKG91dHNpZGUpIHsgcG9zLm91dHNpZGUgPSBvdXRzaWRlOyB9XG4gICAgcmV0dXJuIHBvc1xuICB9XG5cbiAgLy8gQ29tcHV0ZSB0aGUgY2hhcmFjdGVyIHBvc2l0aW9uIGNsb3Nlc3QgdG8gdGhlIGdpdmVuIGNvb3JkaW5hdGVzLlxuICAvLyBJbnB1dCBtdXN0IGJlIGxpbmVTcGFjZS1sb2NhbCAoXCJkaXZcIiBjb29yZGluYXRlIHN5c3RlbSkuXG4gIGZ1bmN0aW9uIGNvb3Jkc0NoYXIoY20sIHgsIHkpIHtcbiAgICB2YXIgZG9jID0gY20uZG9jO1xuICAgIHkgKz0gY20uZGlzcGxheS52aWV3T2Zmc2V0O1xuICAgIGlmICh5IDwgMCkgeyByZXR1cm4gUG9zV2l0aEluZm8oZG9jLmZpcnN0LCAwLCBudWxsLCAtMSwgLTEpIH1cbiAgICB2YXIgbGluZU4gPSBsaW5lQXRIZWlnaHQoZG9jLCB5KSwgbGFzdCA9IGRvYy5maXJzdCArIGRvYy5zaXplIC0gMTtcbiAgICBpZiAobGluZU4gPiBsYXN0KVxuICAgICAgeyByZXR1cm4gUG9zV2l0aEluZm8oZG9jLmZpcnN0ICsgZG9jLnNpemUgLSAxLCBnZXRMaW5lKGRvYywgbGFzdCkudGV4dC5sZW5ndGgsIG51bGwsIDEsIDEpIH1cbiAgICBpZiAoeCA8IDApIHsgeCA9IDA7IH1cblxuICAgIHZhciBsaW5lT2JqID0gZ2V0TGluZShkb2MsIGxpbmVOKTtcbiAgICBmb3IgKDs7KSB7XG4gICAgICB2YXIgZm91bmQgPSBjb29yZHNDaGFySW5uZXIoY20sIGxpbmVPYmosIGxpbmVOLCB4LCB5KTtcbiAgICAgIHZhciBjb2xsYXBzZWQgPSBjb2xsYXBzZWRTcGFuQXJvdW5kKGxpbmVPYmosIGZvdW5kLmNoICsgKGZvdW5kLnhSZWwgPiAwIHx8IGZvdW5kLm91dHNpZGUgPiAwID8gMSA6IDApKTtcbiAgICAgIGlmICghY29sbGFwc2VkKSB7IHJldHVybiBmb3VuZCB9XG4gICAgICB2YXIgcmFuZ2VFbmQgPSBjb2xsYXBzZWQuZmluZCgxKTtcbiAgICAgIGlmIChyYW5nZUVuZC5saW5lID09IGxpbmVOKSB7IHJldHVybiByYW5nZUVuZCB9XG4gICAgICBsaW5lT2JqID0gZ2V0TGluZShkb2MsIGxpbmVOID0gcmFuZ2VFbmQubGluZSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gd3JhcHBlZExpbmVFeHRlbnQoY20sIGxpbmVPYmosIHByZXBhcmVkTWVhc3VyZSwgeSkge1xuICAgIHkgLT0gd2lkZ2V0VG9wSGVpZ2h0KGxpbmVPYmopO1xuICAgIHZhciBlbmQgPSBsaW5lT2JqLnRleHQubGVuZ3RoO1xuICAgIHZhciBiZWdpbiA9IGZpbmRGaXJzdChmdW5jdGlvbiAoY2gpIHsgcmV0dXJuIG1lYXN1cmVDaGFyUHJlcGFyZWQoY20sIHByZXBhcmVkTWVhc3VyZSwgY2ggLSAxKS5ib3R0b20gPD0geTsgfSwgZW5kLCAwKTtcbiAgICBlbmQgPSBmaW5kRmlyc3QoZnVuY3Rpb24gKGNoKSB7IHJldHVybiBtZWFzdXJlQ2hhclByZXBhcmVkKGNtLCBwcmVwYXJlZE1lYXN1cmUsIGNoKS50b3AgPiB5OyB9LCBiZWdpbiwgZW5kKTtcbiAgICByZXR1cm4ge2JlZ2luOiBiZWdpbiwgZW5kOiBlbmR9XG4gIH1cblxuICBmdW5jdGlvbiB3cmFwcGVkTGluZUV4dGVudENoYXIoY20sIGxpbmVPYmosIHByZXBhcmVkTWVhc3VyZSwgdGFyZ2V0KSB7XG4gICAgaWYgKCFwcmVwYXJlZE1lYXN1cmUpIHsgcHJlcGFyZWRNZWFzdXJlID0gcHJlcGFyZU1lYXN1cmVGb3JMaW5lKGNtLCBsaW5lT2JqKTsgfVxuICAgIHZhciB0YXJnZXRUb3AgPSBpbnRvQ29vcmRTeXN0ZW0oY20sIGxpbmVPYmosIG1lYXN1cmVDaGFyUHJlcGFyZWQoY20sIHByZXBhcmVkTWVhc3VyZSwgdGFyZ2V0KSwgXCJsaW5lXCIpLnRvcDtcbiAgICByZXR1cm4gd3JhcHBlZExpbmVFeHRlbnQoY20sIGxpbmVPYmosIHByZXBhcmVkTWVhc3VyZSwgdGFyZ2V0VG9wKVxuICB9XG5cbiAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBzaWRlIG9mIGEgYm94IGlzIGFmdGVyIHRoZSBnaXZlblxuICAvLyBjb29yZGluYXRlcywgaW4gdG9wLXRvLWJvdHRvbSwgbGVmdC10by1yaWdodCBvcmRlci5cbiAgZnVuY3Rpb24gYm94SXNBZnRlcihib3gsIHgsIHksIGxlZnQpIHtcbiAgICByZXR1cm4gYm94LmJvdHRvbSA8PSB5ID8gZmFsc2UgOiBib3gudG9wID4geSA/IHRydWUgOiAobGVmdCA/IGJveC5sZWZ0IDogYm94LnJpZ2h0KSA+IHhcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvb3Jkc0NoYXJJbm5lcihjbSwgbGluZU9iaiwgbGluZU5vLCB4LCB5KSB7XG4gICAgLy8gTW92ZSB5IGludG8gbGluZS1sb2NhbCBjb29yZGluYXRlIHNwYWNlXG4gICAgeSAtPSBoZWlnaHRBdExpbmUobGluZU9iaik7XG4gICAgdmFyIHByZXBhcmVkTWVhc3VyZSA9IHByZXBhcmVNZWFzdXJlRm9yTGluZShjbSwgbGluZU9iaik7XG4gICAgLy8gV2hlbiBkaXJlY3RseSBjYWxsaW5nIGBtZWFzdXJlQ2hhclByZXBhcmVkYCwgd2UgaGF2ZSB0byBhZGp1c3RcbiAgICAvLyBmb3IgdGhlIHdpZGdldHMgYXQgdGhpcyBsaW5lLlxuICAgIHZhciB3aWRnZXRIZWlnaHQgPSB3aWRnZXRUb3BIZWlnaHQobGluZU9iaik7XG4gICAgdmFyIGJlZ2luID0gMCwgZW5kID0gbGluZU9iai50ZXh0Lmxlbmd0aCwgbHRyID0gdHJ1ZTtcblxuICAgIHZhciBvcmRlciA9IGdldE9yZGVyKGxpbmVPYmosIGNtLmRvYy5kaXJlY3Rpb24pO1xuICAgIC8vIElmIHRoZSBsaW5lIGlzbid0IHBsYWluIGxlZnQtdG8tcmlnaHQgdGV4dCwgZmlyc3QgZmlndXJlIG91dFxuICAgIC8vIHdoaWNoIGJpZGkgc2VjdGlvbiB0aGUgY29vcmRpbmF0ZXMgZmFsbCBpbnRvLlxuICAgIGlmIChvcmRlcikge1xuICAgICAgdmFyIHBhcnQgPSAoY20ub3B0aW9ucy5saW5lV3JhcHBpbmcgPyBjb29yZHNCaWRpUGFydFdyYXBwZWQgOiBjb29yZHNCaWRpUGFydClcbiAgICAgICAgICAgICAgICAgICAoY20sIGxpbmVPYmosIGxpbmVObywgcHJlcGFyZWRNZWFzdXJlLCBvcmRlciwgeCwgeSk7XG4gICAgICBsdHIgPSBwYXJ0LmxldmVsICE9IDE7XG4gICAgICAvLyBUaGUgYXdrd2FyZCAtMSBvZmZzZXRzIGFyZSBuZWVkZWQgYmVjYXVzZSBmaW5kRmlyc3QgKGNhbGxlZFxuICAgICAgLy8gb24gdGhlc2UgYmVsb3cpIHdpbGwgdHJlYXQgaXRzIGZpcnN0IGJvdW5kIGFzIGluY2x1c2l2ZSxcbiAgICAgIC8vIHNlY29uZCBhcyBleGNsdXNpdmUsIGJ1dCB3ZSB3YW50IHRvIGFjdHVhbGx5IGFkZHJlc3MgdGhlXG4gICAgICAvLyBjaGFyYWN0ZXJzIGluIHRoZSBwYXJ0J3MgcmFuZ2VcbiAgICAgIGJlZ2luID0gbHRyID8gcGFydC5mcm9tIDogcGFydC50byAtIDE7XG4gICAgICBlbmQgPSBsdHIgPyBwYXJ0LnRvIDogcGFydC5mcm9tIC0gMTtcbiAgICB9XG5cbiAgICAvLyBBIGJpbmFyeSBzZWFyY2ggdG8gZmluZCB0aGUgZmlyc3QgY2hhcmFjdGVyIHdob3NlIGJvdW5kaW5nIGJveFxuICAgIC8vIHN0YXJ0cyBhZnRlciB0aGUgY29vcmRpbmF0ZXMuIElmIHdlIHJ1biBhY3Jvc3MgYW55IHdob3NlIGJveCB3cmFwXG4gICAgLy8gdGhlIGNvb3JkaW5hdGVzLCBzdG9yZSB0aGF0LlxuICAgIHZhciBjaEFyb3VuZCA9IG51bGwsIGJveEFyb3VuZCA9IG51bGw7XG4gICAgdmFyIGNoID0gZmluZEZpcnN0KGZ1bmN0aW9uIChjaCkge1xuICAgICAgdmFyIGJveCA9IG1lYXN1cmVDaGFyUHJlcGFyZWQoY20sIHByZXBhcmVkTWVhc3VyZSwgY2gpO1xuICAgICAgYm94LnRvcCArPSB3aWRnZXRIZWlnaHQ7IGJveC5ib3R0b20gKz0gd2lkZ2V0SGVpZ2h0O1xuICAgICAgaWYgKCFib3hJc0FmdGVyKGJveCwgeCwgeSwgZmFsc2UpKSB7IHJldHVybiBmYWxzZSB9XG4gICAgICBpZiAoYm94LnRvcCA8PSB5ICYmIGJveC5sZWZ0IDw9IHgpIHtcbiAgICAgICAgY2hBcm91bmQgPSBjaDtcbiAgICAgICAgYm94QXJvdW5kID0gYm94O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9LCBiZWdpbiwgZW5kKTtcblxuICAgIHZhciBiYXNlWCwgc3RpY2t5LCBvdXRzaWRlID0gZmFsc2U7XG4gICAgLy8gSWYgYSBib3ggYXJvdW5kIHRoZSBjb29yZGluYXRlcyB3YXMgZm91bmQsIHVzZSB0aGF0XG4gICAgaWYgKGJveEFyb3VuZCkge1xuICAgICAgLy8gRGlzdGluZ3Vpc2ggY29vcmRpbmF0ZXMgbmVhcmVyIHRvIHRoZSBsZWZ0IG9yIHJpZ2h0IHNpZGUgb2YgdGhlIGJveFxuICAgICAgdmFyIGF0TGVmdCA9IHggLSBib3hBcm91bmQubGVmdCA8IGJveEFyb3VuZC5yaWdodCAtIHgsIGF0U3RhcnQgPSBhdExlZnQgPT0gbHRyO1xuICAgICAgY2ggPSBjaEFyb3VuZCArIChhdFN0YXJ0ID8gMCA6IDEpO1xuICAgICAgc3RpY2t5ID0gYXRTdGFydCA/IFwiYWZ0ZXJcIiA6IFwiYmVmb3JlXCI7XG4gICAgICBiYXNlWCA9IGF0TGVmdCA/IGJveEFyb3VuZC5sZWZ0IDogYm94QXJvdW5kLnJpZ2h0O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyAoQWRqdXN0IGZvciBleHRlbmRlZCBib3VuZCwgaWYgbmVjZXNzYXJ5LilcbiAgICAgIGlmICghbHRyICYmIChjaCA9PSBlbmQgfHwgY2ggPT0gYmVnaW4pKSB7IGNoKys7IH1cbiAgICAgIC8vIFRvIGRldGVybWluZSB3aGljaCBzaWRlIHRvIGFzc29jaWF0ZSB3aXRoLCBnZXQgdGhlIGJveCB0byB0aGVcbiAgICAgIC8vIGxlZnQgb2YgdGhlIGNoYXJhY3RlciBhbmQgY29tcGFyZSBpdCdzIHZlcnRpY2FsIHBvc2l0aW9uIHRvIHRoZVxuICAgICAgLy8gY29vcmRpbmF0ZXNcbiAgICAgIHN0aWNreSA9IGNoID09IDAgPyBcImFmdGVyXCIgOiBjaCA9PSBsaW5lT2JqLnRleHQubGVuZ3RoID8gXCJiZWZvcmVcIiA6XG4gICAgICAgIChtZWFzdXJlQ2hhclByZXBhcmVkKGNtLCBwcmVwYXJlZE1lYXN1cmUsIGNoIC0gKGx0ciA/IDEgOiAwKSkuYm90dG9tICsgd2lkZ2V0SGVpZ2h0IDw9IHkpID09IGx0ciA/XG4gICAgICAgIFwiYWZ0ZXJcIiA6IFwiYmVmb3JlXCI7XG4gICAgICAvLyBOb3cgZ2V0IGFjY3VyYXRlIGNvb3JkaW5hdGVzIGZvciB0aGlzIHBsYWNlLCBpbiBvcmRlciB0byBnZXQgYVxuICAgICAgLy8gYmFzZSBYIHBvc2l0aW9uXG4gICAgICB2YXIgY29vcmRzID0gY3Vyc29yQ29vcmRzKGNtLCBQb3MobGluZU5vLCBjaCwgc3RpY2t5KSwgXCJsaW5lXCIsIGxpbmVPYmosIHByZXBhcmVkTWVhc3VyZSk7XG4gICAgICBiYXNlWCA9IGNvb3Jkcy5sZWZ0O1xuICAgICAgb3V0c2lkZSA9IHkgPCBjb29yZHMudG9wID8gLTEgOiB5ID49IGNvb3Jkcy5ib3R0b20gPyAxIDogMDtcbiAgICB9XG5cbiAgICBjaCA9IHNraXBFeHRlbmRpbmdDaGFycyhsaW5lT2JqLnRleHQsIGNoLCAxKTtcbiAgICByZXR1cm4gUG9zV2l0aEluZm8obGluZU5vLCBjaCwgc3RpY2t5LCBvdXRzaWRlLCB4IC0gYmFzZVgpXG4gIH1cblxuICBmdW5jdGlvbiBjb29yZHNCaWRpUGFydChjbSwgbGluZU9iaiwgbGluZU5vLCBwcmVwYXJlZE1lYXN1cmUsIG9yZGVyLCB4LCB5KSB7XG4gICAgLy8gQmlkaSBwYXJ0cyBhcmUgc29ydGVkIGxlZnQtdG8tcmlnaHQsIGFuZCBpbiBhIG5vbi1saW5lLXdyYXBwaW5nXG4gICAgLy8gc2l0dWF0aW9uLCB3ZSBjYW4gdGFrZSB0aGlzIG9yZGVyaW5nIHRvIGNvcnJlc3BvbmQgdG8gdGhlIHZpc3VhbFxuICAgIC8vIG9yZGVyaW5nLiBUaGlzIGZpbmRzIHRoZSBmaXJzdCBwYXJ0IHdob3NlIGVuZCBpcyBhZnRlciB0aGUgZ2l2ZW5cbiAgICAvLyBjb29yZGluYXRlcy5cbiAgICB2YXIgaW5kZXggPSBmaW5kRmlyc3QoZnVuY3Rpb24gKGkpIHtcbiAgICAgIHZhciBwYXJ0ID0gb3JkZXJbaV0sIGx0ciA9IHBhcnQubGV2ZWwgIT0gMTtcbiAgICAgIHJldHVybiBib3hJc0FmdGVyKGN1cnNvckNvb3JkcyhjbSwgUG9zKGxpbmVObywgbHRyID8gcGFydC50byA6IHBhcnQuZnJvbSwgbHRyID8gXCJiZWZvcmVcIiA6IFwiYWZ0ZXJcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJsaW5lXCIsIGxpbmVPYmosIHByZXBhcmVkTWVhc3VyZSksIHgsIHksIHRydWUpXG4gICAgfSwgMCwgb3JkZXIubGVuZ3RoIC0gMSk7XG4gICAgdmFyIHBhcnQgPSBvcmRlcltpbmRleF07XG4gICAgLy8gSWYgdGhpcyBpc24ndCB0aGUgZmlyc3QgcGFydCwgdGhlIHBhcnQncyBzdGFydCBpcyBhbHNvIGFmdGVyXG4gICAgLy8gdGhlIGNvb3JkaW5hdGVzLCBhbmQgdGhlIGNvb3JkaW5hdGVzIGFyZW4ndCBvbiB0aGUgc2FtZSBsaW5lIGFzXG4gICAgLy8gdGhhdCBzdGFydCwgbW92ZSBvbmUgcGFydCBiYWNrLlxuICAgIGlmIChpbmRleCA+IDApIHtcbiAgICAgIHZhciBsdHIgPSBwYXJ0LmxldmVsICE9IDE7XG4gICAgICB2YXIgc3RhcnQgPSBjdXJzb3JDb29yZHMoY20sIFBvcyhsaW5lTm8sIGx0ciA/IHBhcnQuZnJvbSA6IHBhcnQudG8sIGx0ciA/IFwiYWZ0ZXJcIiA6IFwiYmVmb3JlXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibGluZVwiLCBsaW5lT2JqLCBwcmVwYXJlZE1lYXN1cmUpO1xuICAgICAgaWYgKGJveElzQWZ0ZXIoc3RhcnQsIHgsIHksIHRydWUpICYmIHN0YXJ0LnRvcCA+IHkpXG4gICAgICAgIHsgcGFydCA9IG9yZGVyW2luZGV4IC0gMV07IH1cbiAgICB9XG4gICAgcmV0dXJuIHBhcnRcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvb3Jkc0JpZGlQYXJ0V3JhcHBlZChjbSwgbGluZU9iaiwgX2xpbmVObywgcHJlcGFyZWRNZWFzdXJlLCBvcmRlciwgeCwgeSkge1xuICAgIC8vIEluIGEgd3JhcHBlZCBsaW5lLCBydGwgdGV4dCBvbiB3cmFwcGluZyBib3VuZGFyaWVzIGNhbiBkbyB0aGluZ3NcbiAgICAvLyB0aGF0IGRvbid0IGNvcnJlc3BvbmQgdG8gdGhlIG9yZGVyaW5nIGluIG91ciBgb3JkZXJgIGFycmF5IGF0XG4gICAgLy8gYWxsLCBzbyBhIGJpbmFyeSBzZWFyY2ggZG9lc24ndCB3b3JrLCBhbmQgd2Ugd2FudCB0byByZXR1cm4gYVxuICAgIC8vIHBhcnQgdGhhdCBvbmx5IHNwYW5zIG9uZSBsaW5lIHNvIHRoYXQgdGhlIGJpbmFyeSBzZWFyY2ggaW5cbiAgICAvLyBjb29yZHNDaGFySW5uZXIgaXMgc2FmZS4gQXMgc3VjaCwgd2UgZmlyc3QgZmluZCB0aGUgZXh0ZW50IG9mIHRoZVxuICAgIC8vIHdyYXBwZWQgbGluZSwgYW5kIHRoZW4gZG8gYSBmbGF0IHNlYXJjaCBpbiB3aGljaCB3ZSBkaXNjYXJkIGFueVxuICAgIC8vIHNwYW5zIHRoYXQgYXJlbid0IG9uIHRoZSBsaW5lLlxuICAgIHZhciByZWYgPSB3cmFwcGVkTGluZUV4dGVudChjbSwgbGluZU9iaiwgcHJlcGFyZWRNZWFzdXJlLCB5KTtcbiAgICB2YXIgYmVnaW4gPSByZWYuYmVnaW47XG4gICAgdmFyIGVuZCA9IHJlZi5lbmQ7XG4gICAgaWYgKC9cXHMvLnRlc3QobGluZU9iai50ZXh0LmNoYXJBdChlbmQgLSAxKSkpIHsgZW5kLS07IH1cbiAgICB2YXIgcGFydCA9IG51bGwsIGNsb3Nlc3REaXN0ID0gbnVsbDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9yZGVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcCA9IG9yZGVyW2ldO1xuICAgICAgaWYgKHAuZnJvbSA+PSBlbmQgfHwgcC50byA8PSBiZWdpbikgeyBjb250aW51ZSB9XG4gICAgICB2YXIgbHRyID0gcC5sZXZlbCAhPSAxO1xuICAgICAgdmFyIGVuZFggPSBtZWFzdXJlQ2hhclByZXBhcmVkKGNtLCBwcmVwYXJlZE1lYXN1cmUsIGx0ciA/IE1hdGgubWluKGVuZCwgcC50bykgLSAxIDogTWF0aC5tYXgoYmVnaW4sIHAuZnJvbSkpLnJpZ2h0O1xuICAgICAgLy8gV2VpZ2ggYWdhaW5zdCBzcGFucyBlbmRpbmcgYmVmb3JlIHRoaXMsIHNvIHRoYXQgdGhleSBhcmUgb25seVxuICAgICAgLy8gcGlja2VkIGlmIG5vdGhpbmcgZW5kcyBhZnRlclxuICAgICAgdmFyIGRpc3QgPSBlbmRYIDwgeCA/IHggLSBlbmRYICsgMWU5IDogZW5kWCAtIHg7XG4gICAgICBpZiAoIXBhcnQgfHwgY2xvc2VzdERpc3QgPiBkaXN0KSB7XG4gICAgICAgIHBhcnQgPSBwO1xuICAgICAgICBjbG9zZXN0RGlzdCA9IGRpc3Q7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghcGFydCkgeyBwYXJ0ID0gb3JkZXJbb3JkZXIubGVuZ3RoIC0gMV07IH1cbiAgICAvLyBDbGlwIHRoZSBwYXJ0IHRvIHRoZSB3cmFwcGVkIGxpbmUuXG4gICAgaWYgKHBhcnQuZnJvbSA8IGJlZ2luKSB7IHBhcnQgPSB7ZnJvbTogYmVnaW4sIHRvOiBwYXJ0LnRvLCBsZXZlbDogcGFydC5sZXZlbH07IH1cbiAgICBpZiAocGFydC50byA+IGVuZCkgeyBwYXJ0ID0ge2Zyb206IHBhcnQuZnJvbSwgdG86IGVuZCwgbGV2ZWw6IHBhcnQubGV2ZWx9OyB9XG4gICAgcmV0dXJuIHBhcnRcbiAgfVxuXG4gIHZhciBtZWFzdXJlVGV4dDtcbiAgLy8gQ29tcHV0ZSB0aGUgZGVmYXVsdCB0ZXh0IGhlaWdodC5cbiAgZnVuY3Rpb24gdGV4dEhlaWdodChkaXNwbGF5KSB7XG4gICAgaWYgKGRpc3BsYXkuY2FjaGVkVGV4dEhlaWdodCAhPSBudWxsKSB7IHJldHVybiBkaXNwbGF5LmNhY2hlZFRleHRIZWlnaHQgfVxuICAgIGlmIChtZWFzdXJlVGV4dCA9PSBudWxsKSB7XG4gICAgICBtZWFzdXJlVGV4dCA9IGVsdChcInByZVwiLCBudWxsLCBcIkNvZGVNaXJyb3ItbGluZS1saWtlXCIpO1xuICAgICAgLy8gTWVhc3VyZSBhIGJ1bmNoIG9mIGxpbmVzLCBmb3IgYnJvd3NlcnMgdGhhdCBjb21wdXRlXG4gICAgICAvLyBmcmFjdGlvbmFsIGhlaWdodHMuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDQ5OyArK2kpIHtcbiAgICAgICAgbWVhc3VyZVRleHQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCJ4XCIpKTtcbiAgICAgICAgbWVhc3VyZVRleHQuYXBwZW5kQ2hpbGQoZWx0KFwiYnJcIikpO1xuICAgICAgfVxuICAgICAgbWVhc3VyZVRleHQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCJ4XCIpKTtcbiAgICB9XG4gICAgcmVtb3ZlQ2hpbGRyZW5BbmRBZGQoZGlzcGxheS5tZWFzdXJlLCBtZWFzdXJlVGV4dCk7XG4gICAgdmFyIGhlaWdodCA9IG1lYXN1cmVUZXh0Lm9mZnNldEhlaWdodCAvIDUwO1xuICAgIGlmIChoZWlnaHQgPiAzKSB7IGRpc3BsYXkuY2FjaGVkVGV4dEhlaWdodCA9IGhlaWdodDsgfVxuICAgIHJlbW92ZUNoaWxkcmVuKGRpc3BsYXkubWVhc3VyZSk7XG4gICAgcmV0dXJuIGhlaWdodCB8fCAxXG4gIH1cblxuICAvLyBDb21wdXRlIHRoZSBkZWZhdWx0IGNoYXJhY3RlciB3aWR0aC5cbiAgZnVuY3Rpb24gY2hhcldpZHRoKGRpc3BsYXkpIHtcbiAgICBpZiAoZGlzcGxheS5jYWNoZWRDaGFyV2lkdGggIT0gbnVsbCkgeyByZXR1cm4gZGlzcGxheS5jYWNoZWRDaGFyV2lkdGggfVxuICAgIHZhciBhbmNob3IgPSBlbHQoXCJzcGFuXCIsIFwieHh4eHh4eHh4eFwiKTtcbiAgICB2YXIgcHJlID0gZWx0KFwicHJlXCIsIFthbmNob3JdLCBcIkNvZGVNaXJyb3ItbGluZS1saWtlXCIpO1xuICAgIHJlbW92ZUNoaWxkcmVuQW5kQWRkKGRpc3BsYXkubWVhc3VyZSwgcHJlKTtcbiAgICB2YXIgcmVjdCA9IGFuY2hvci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgd2lkdGggPSAocmVjdC5yaWdodCAtIHJlY3QubGVmdCkgLyAxMDtcbiAgICBpZiAod2lkdGggPiAyKSB7IGRpc3BsYXkuY2FjaGVkQ2hhcldpZHRoID0gd2lkdGg7IH1cbiAgICByZXR1cm4gd2lkdGggfHwgMTBcbiAgfVxuXG4gIC8vIERvIGEgYnVsay1yZWFkIG9mIHRoZSBET00gcG9zaXRpb25zIGFuZCBzaXplcyBuZWVkZWQgdG8gZHJhdyB0aGVcbiAgLy8gdmlldywgc28gdGhhdCB3ZSBkb24ndCBpbnRlcmxlYXZlIHJlYWRpbmcgYW5kIHdyaXRpbmcgdG8gdGhlIERPTS5cbiAgZnVuY3Rpb24gZ2V0RGltZW5zaW9ucyhjbSkge1xuICAgIHZhciBkID0gY20uZGlzcGxheSwgbGVmdCA9IHt9LCB3aWR0aCA9IHt9O1xuICAgIHZhciBndXR0ZXJMZWZ0ID0gZC5ndXR0ZXJzLmNsaWVudExlZnQ7XG4gICAgZm9yICh2YXIgbiA9IGQuZ3V0dGVycy5maXJzdENoaWxkLCBpID0gMDsgbjsgbiA9IG4ubmV4dFNpYmxpbmcsICsraSkge1xuICAgICAgdmFyIGlkID0gY20uZGlzcGxheS5ndXR0ZXJTcGVjc1tpXS5jbGFzc05hbWU7XG4gICAgICBsZWZ0W2lkXSA9IG4ub2Zmc2V0TGVmdCArIG4uY2xpZW50TGVmdCArIGd1dHRlckxlZnQ7XG4gICAgICB3aWR0aFtpZF0gPSBuLmNsaWVudFdpZHRoO1xuICAgIH1cbiAgICByZXR1cm4ge2ZpeGVkUG9zOiBjb21wZW5zYXRlRm9ySFNjcm9sbChkKSxcbiAgICAgICAgICAgIGd1dHRlclRvdGFsV2lkdGg6IGQuZ3V0dGVycy5vZmZzZXRXaWR0aCxcbiAgICAgICAgICAgIGd1dHRlckxlZnQ6IGxlZnQsXG4gICAgICAgICAgICBndXR0ZXJXaWR0aDogd2lkdGgsXG4gICAgICAgICAgICB3cmFwcGVyV2lkdGg6IGQud3JhcHBlci5jbGllbnRXaWR0aH1cbiAgfVxuXG4gIC8vIENvbXB1dGVzIGRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsTGVmdCArIGRpc3BsYXkuZ3V0dGVycy5vZmZzZXRXaWR0aCxcbiAgLy8gYnV0IHVzaW5nIGdldEJvdW5kaW5nQ2xpZW50UmVjdCB0byBnZXQgYSBzdWItcGl4ZWwtYWNjdXJhdGVcbiAgLy8gcmVzdWx0LlxuICBmdW5jdGlvbiBjb21wZW5zYXRlRm9ySFNjcm9sbChkaXNwbGF5KSB7XG4gICAgcmV0dXJuIGRpc3BsYXkuc2Nyb2xsZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtIGRpc3BsYXkuc2l6ZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdFxuICB9XG5cbiAgLy8gUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgZXN0aW1hdGVzIHRoZSBoZWlnaHQgb2YgYSBsaW5lLCB0byB1c2UgYXNcbiAgLy8gZmlyc3QgYXBwcm94aW1hdGlvbiB1bnRpbCB0aGUgbGluZSBiZWNvbWVzIHZpc2libGUgKGFuZCBpcyB0aHVzXG4gIC8vIHByb3Blcmx5IG1lYXN1cmFibGUpLlxuICBmdW5jdGlvbiBlc3RpbWF0ZUhlaWdodChjbSkge1xuICAgIHZhciB0aCA9IHRleHRIZWlnaHQoY20uZGlzcGxheSksIHdyYXBwaW5nID0gY20ub3B0aW9ucy5saW5lV3JhcHBpbmc7XG4gICAgdmFyIHBlckxpbmUgPSB3cmFwcGluZyAmJiBNYXRoLm1heCg1LCBjbS5kaXNwbGF5LnNjcm9sbGVyLmNsaWVudFdpZHRoIC8gY2hhcldpZHRoKGNtLmRpc3BsYXkpIC0gMyk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgICBpZiAobGluZUlzSGlkZGVuKGNtLmRvYywgbGluZSkpIHsgcmV0dXJuIDAgfVxuXG4gICAgICB2YXIgd2lkZ2V0c0hlaWdodCA9IDA7XG4gICAgICBpZiAobGluZS53aWRnZXRzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgbGluZS53aWRnZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChsaW5lLndpZGdldHNbaV0uaGVpZ2h0KSB7IHdpZGdldHNIZWlnaHQgKz0gbGluZS53aWRnZXRzW2ldLmhlaWdodDsgfVxuICAgICAgfSB9XG5cbiAgICAgIGlmICh3cmFwcGluZylcbiAgICAgICAgeyByZXR1cm4gd2lkZ2V0c0hlaWdodCArIChNYXRoLmNlaWwobGluZS50ZXh0Lmxlbmd0aCAvIHBlckxpbmUpIHx8IDEpICogdGggfVxuICAgICAgZWxzZVxuICAgICAgICB7IHJldHVybiB3aWRnZXRzSGVpZ2h0ICsgdGggfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGVzdGltYXRlTGluZUhlaWdodHMoY20pIHtcbiAgICB2YXIgZG9jID0gY20uZG9jLCBlc3QgPSBlc3RpbWF0ZUhlaWdodChjbSk7XG4gICAgZG9jLml0ZXIoZnVuY3Rpb24gKGxpbmUpIHtcbiAgICAgIHZhciBlc3RIZWlnaHQgPSBlc3QobGluZSk7XG4gICAgICBpZiAoZXN0SGVpZ2h0ICE9IGxpbmUuaGVpZ2h0KSB7IHVwZGF0ZUxpbmVIZWlnaHQobGluZSwgZXN0SGVpZ2h0KTsgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gR2l2ZW4gYSBtb3VzZSBldmVudCwgZmluZCB0aGUgY29ycmVzcG9uZGluZyBwb3NpdGlvbi4gSWYgbGliZXJhbFxuICAvLyBpcyBmYWxzZSwgaXQgY2hlY2tzIHdoZXRoZXIgYSBndXR0ZXIgb3Igc2Nyb2xsYmFyIHdhcyBjbGlja2VkLFxuICAvLyBhbmQgcmV0dXJucyBudWxsIGlmIGl0IHdhcy4gZm9yUmVjdCBpcyB1c2VkIGJ5IHJlY3Rhbmd1bGFyXG4gIC8vIHNlbGVjdGlvbnMsIGFuZCB0cmllcyB0byBlc3RpbWF0ZSBhIGNoYXJhY3RlciBwb3NpdGlvbiBldmVuIGZvclxuICAvLyBjb29yZGluYXRlcyBiZXlvbmQgdGhlIHJpZ2h0IG9mIHRoZSB0ZXh0LlxuICBmdW5jdGlvbiBwb3NGcm9tTW91c2UoY20sIGUsIGxpYmVyYWwsIGZvclJlY3QpIHtcbiAgICB2YXIgZGlzcGxheSA9IGNtLmRpc3BsYXk7XG4gICAgaWYgKCFsaWJlcmFsICYmIGVfdGFyZ2V0KGUpLmdldEF0dHJpYnV0ZShcImNtLW5vdC1jb250ZW50XCIpID09IFwidHJ1ZVwiKSB7IHJldHVybiBudWxsIH1cblxuICAgIHZhciB4LCB5LCBzcGFjZSA9IGRpc3BsYXkubGluZVNwYWNlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIC8vIEZhaWxzIHVucHJlZGljdGFibHkgb24gSUVbNjddIHdoZW4gbW91c2UgaXMgZHJhZ2dlZCBhcm91bmQgcXVpY2tseS5cbiAgICB0cnkgeyB4ID0gZS5jbGllbnRYIC0gc3BhY2UubGVmdDsgeSA9IGUuY2xpZW50WSAtIHNwYWNlLnRvcDsgfVxuICAgIGNhdGNoIChlJDEpIHsgcmV0dXJuIG51bGwgfVxuICAgIHZhciBjb29yZHMgPSBjb29yZHNDaGFyKGNtLCB4LCB5KSwgbGluZTtcbiAgICBpZiAoZm9yUmVjdCAmJiBjb29yZHMueFJlbCA+IDAgJiYgKGxpbmUgPSBnZXRMaW5lKGNtLmRvYywgY29vcmRzLmxpbmUpLnRleHQpLmxlbmd0aCA9PSBjb29yZHMuY2gpIHtcbiAgICAgIHZhciBjb2xEaWZmID0gY291bnRDb2x1bW4obGluZSwgbGluZS5sZW5ndGgsIGNtLm9wdGlvbnMudGFiU2l6ZSkgLSBsaW5lLmxlbmd0aDtcbiAgICAgIGNvb3JkcyA9IFBvcyhjb29yZHMubGluZSwgTWF0aC5tYXgoMCwgTWF0aC5yb3VuZCgoeCAtIHBhZGRpbmdIKGNtLmRpc3BsYXkpLmxlZnQpIC8gY2hhcldpZHRoKGNtLmRpc3BsYXkpKSAtIGNvbERpZmYpKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvb3Jkc1xuICB9XG5cbiAgLy8gRmluZCB0aGUgdmlldyBlbGVtZW50IGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiBsaW5lLiBSZXR1cm4gbnVsbFxuICAvLyB3aGVuIHRoZSBsaW5lIGlzbid0IHZpc2libGUuXG4gIGZ1bmN0aW9uIGZpbmRWaWV3SW5kZXgoY20sIG4pIHtcbiAgICBpZiAobiA+PSBjbS5kaXNwbGF5LnZpZXdUbykgeyByZXR1cm4gbnVsbCB9XG4gICAgbiAtPSBjbS5kaXNwbGF5LnZpZXdGcm9tO1xuICAgIGlmIChuIDwgMCkgeyByZXR1cm4gbnVsbCB9XG4gICAgdmFyIHZpZXcgPSBjbS5kaXNwbGF5LnZpZXc7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2aWV3Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBuIC09IHZpZXdbaV0uc2l6ZTtcbiAgICAgIGlmIChuIDwgMCkgeyByZXR1cm4gaSB9XG4gICAgfVxuICB9XG5cbiAgLy8gVXBkYXRlcyB0aGUgZGlzcGxheS52aWV3IGRhdGEgc3RydWN0dXJlIGZvciBhIGdpdmVuIGNoYW5nZSB0byB0aGVcbiAgLy8gZG9jdW1lbnQuIEZyb20gYW5kIHRvIGFyZSBpbiBwcmUtY2hhbmdlIGNvb3JkaW5hdGVzLiBMZW5kaWZmIGlzXG4gIC8vIHRoZSBhbW91bnQgb2YgbGluZXMgYWRkZWQgb3Igc3VidHJhY3RlZCBieSB0aGUgY2hhbmdlLiBUaGlzIGlzXG4gIC8vIHVzZWQgZm9yIGNoYW5nZXMgdGhhdCBzcGFuIG11bHRpcGxlIGxpbmVzLCBvciBjaGFuZ2UgdGhlIHdheVxuICAvLyBsaW5lcyBhcmUgZGl2aWRlZCBpbnRvIHZpc3VhbCBsaW5lcy4gcmVnTGluZUNoYW5nZSAoYmVsb3cpXG4gIC8vIHJlZ2lzdGVycyBzaW5nbGUtbGluZSBjaGFuZ2VzLlxuICBmdW5jdGlvbiByZWdDaGFuZ2UoY20sIGZyb20sIHRvLCBsZW5kaWZmKSB7XG4gICAgaWYgKGZyb20gPT0gbnVsbCkgeyBmcm9tID0gY20uZG9jLmZpcnN0OyB9XG4gICAgaWYgKHRvID09IG51bGwpIHsgdG8gPSBjbS5kb2MuZmlyc3QgKyBjbS5kb2Muc2l6ZTsgfVxuICAgIGlmICghbGVuZGlmZikgeyBsZW5kaWZmID0gMDsgfVxuXG4gICAgdmFyIGRpc3BsYXkgPSBjbS5kaXNwbGF5O1xuICAgIGlmIChsZW5kaWZmICYmIHRvIDwgZGlzcGxheS52aWV3VG8gJiZcbiAgICAgICAgKGRpc3BsYXkudXBkYXRlTGluZU51bWJlcnMgPT0gbnVsbCB8fCBkaXNwbGF5LnVwZGF0ZUxpbmVOdW1iZXJzID4gZnJvbSkpXG4gICAgICB7IGRpc3BsYXkudXBkYXRlTGluZU51bWJlcnMgPSBmcm9tOyB9XG5cbiAgICBjbS5jdXJPcC52aWV3Q2hhbmdlZCA9IHRydWU7XG5cbiAgICBpZiAoZnJvbSA+PSBkaXNwbGF5LnZpZXdUbykgeyAvLyBDaGFuZ2UgYWZ0ZXJcbiAgICAgIGlmIChzYXdDb2xsYXBzZWRTcGFucyAmJiB2aXN1YWxMaW5lTm8oY20uZG9jLCBmcm9tKSA8IGRpc3BsYXkudmlld1RvKVxuICAgICAgICB7IHJlc2V0VmlldyhjbSk7IH1cbiAgICB9IGVsc2UgaWYgKHRvIDw9IGRpc3BsYXkudmlld0Zyb20pIHsgLy8gQ2hhbmdlIGJlZm9yZVxuICAgICAgaWYgKHNhd0NvbGxhcHNlZFNwYW5zICYmIHZpc3VhbExpbmVFbmRObyhjbS5kb2MsIHRvICsgbGVuZGlmZikgPiBkaXNwbGF5LnZpZXdGcm9tKSB7XG4gICAgICAgIHJlc2V0VmlldyhjbSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkaXNwbGF5LnZpZXdGcm9tICs9IGxlbmRpZmY7XG4gICAgICAgIGRpc3BsYXkudmlld1RvICs9IGxlbmRpZmY7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChmcm9tIDw9IGRpc3BsYXkudmlld0Zyb20gJiYgdG8gPj0gZGlzcGxheS52aWV3VG8pIHsgLy8gRnVsbCBvdmVybGFwXG4gICAgICByZXNldFZpZXcoY20pO1xuICAgIH0gZWxzZSBpZiAoZnJvbSA8PSBkaXNwbGF5LnZpZXdGcm9tKSB7IC8vIFRvcCBvdmVybGFwXG4gICAgICB2YXIgY3V0ID0gdmlld0N1dHRpbmdQb2ludChjbSwgdG8sIHRvICsgbGVuZGlmZiwgMSk7XG4gICAgICBpZiAoY3V0KSB7XG4gICAgICAgIGRpc3BsYXkudmlldyA9IGRpc3BsYXkudmlldy5zbGljZShjdXQuaW5kZXgpO1xuICAgICAgICBkaXNwbGF5LnZpZXdGcm9tID0gY3V0LmxpbmVOO1xuICAgICAgICBkaXNwbGF5LnZpZXdUbyArPSBsZW5kaWZmO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzZXRWaWV3KGNtKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRvID49IGRpc3BsYXkudmlld1RvKSB7IC8vIEJvdHRvbSBvdmVybGFwXG4gICAgICB2YXIgY3V0JDEgPSB2aWV3Q3V0dGluZ1BvaW50KGNtLCBmcm9tLCBmcm9tLCAtMSk7XG4gICAgICBpZiAoY3V0JDEpIHtcbiAgICAgICAgZGlzcGxheS52aWV3ID0gZGlzcGxheS52aWV3LnNsaWNlKDAsIGN1dCQxLmluZGV4KTtcbiAgICAgICAgZGlzcGxheS52aWV3VG8gPSBjdXQkMS5saW5lTjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc2V0VmlldyhjbSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHsgLy8gR2FwIGluIHRoZSBtaWRkbGVcbiAgICAgIHZhciBjdXRUb3AgPSB2aWV3Q3V0dGluZ1BvaW50KGNtLCBmcm9tLCBmcm9tLCAtMSk7XG4gICAgICB2YXIgY3V0Qm90ID0gdmlld0N1dHRpbmdQb2ludChjbSwgdG8sIHRvICsgbGVuZGlmZiwgMSk7XG4gICAgICBpZiAoY3V0VG9wICYmIGN1dEJvdCkge1xuICAgICAgICBkaXNwbGF5LnZpZXcgPSBkaXNwbGF5LnZpZXcuc2xpY2UoMCwgY3V0VG9wLmluZGV4KVxuICAgICAgICAgIC5jb25jYXQoYnVpbGRWaWV3QXJyYXkoY20sIGN1dFRvcC5saW5lTiwgY3V0Qm90LmxpbmVOKSlcbiAgICAgICAgICAuY29uY2F0KGRpc3BsYXkudmlldy5zbGljZShjdXRCb3QuaW5kZXgpKTtcbiAgICAgICAgZGlzcGxheS52aWV3VG8gKz0gbGVuZGlmZjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc2V0VmlldyhjbSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGV4dCA9IGRpc3BsYXkuZXh0ZXJuYWxNZWFzdXJlZDtcbiAgICBpZiAoZXh0KSB7XG4gICAgICBpZiAodG8gPCBleHQubGluZU4pXG4gICAgICAgIHsgZXh0LmxpbmVOICs9IGxlbmRpZmY7IH1cbiAgICAgIGVsc2UgaWYgKGZyb20gPCBleHQubGluZU4gKyBleHQuc2l6ZSlcbiAgICAgICAgeyBkaXNwbGF5LmV4dGVybmFsTWVhc3VyZWQgPSBudWxsOyB9XG4gICAgfVxuICB9XG5cbiAgLy8gUmVnaXN0ZXIgYSBjaGFuZ2UgdG8gYSBzaW5nbGUgbGluZS4gVHlwZSBtdXN0IGJlIG9uZSBvZiBcInRleHRcIixcbiAgLy8gXCJndXR0ZXJcIiwgXCJjbGFzc1wiLCBcIndpZGdldFwiXG4gIGZ1bmN0aW9uIHJlZ0xpbmVDaGFuZ2UoY20sIGxpbmUsIHR5cGUpIHtcbiAgICBjbS5jdXJPcC52aWV3Q2hhbmdlZCA9IHRydWU7XG4gICAgdmFyIGRpc3BsYXkgPSBjbS5kaXNwbGF5LCBleHQgPSBjbS5kaXNwbGF5LmV4dGVybmFsTWVhc3VyZWQ7XG4gICAgaWYgKGV4dCAmJiBsaW5lID49IGV4dC5saW5lTiAmJiBsaW5lIDwgZXh0LmxpbmVOICsgZXh0LnNpemUpXG4gICAgICB7IGRpc3BsYXkuZXh0ZXJuYWxNZWFzdXJlZCA9IG51bGw7IH1cblxuICAgIGlmIChsaW5lIDwgZGlzcGxheS52aWV3RnJvbSB8fCBsaW5lID49IGRpc3BsYXkudmlld1RvKSB7IHJldHVybiB9XG4gICAgdmFyIGxpbmVWaWV3ID0gZGlzcGxheS52aWV3W2ZpbmRWaWV3SW5kZXgoY20sIGxpbmUpXTtcbiAgICBpZiAobGluZVZpZXcubm9kZSA9PSBudWxsKSB7IHJldHVybiB9XG4gICAgdmFyIGFyciA9IGxpbmVWaWV3LmNoYW5nZXMgfHwgKGxpbmVWaWV3LmNoYW5nZXMgPSBbXSk7XG4gICAgaWYgKGluZGV4T2YoYXJyLCB0eXBlKSA9PSAtMSkgeyBhcnIucHVzaCh0eXBlKTsgfVxuICB9XG5cbiAgLy8gQ2xlYXIgdGhlIHZpZXcuXG4gIGZ1bmN0aW9uIHJlc2V0VmlldyhjbSkge1xuICAgIGNtLmRpc3BsYXkudmlld0Zyb20gPSBjbS5kaXNwbGF5LnZpZXdUbyA9IGNtLmRvYy5maXJzdDtcbiAgICBjbS5kaXNwbGF5LnZpZXcgPSBbXTtcbiAgICBjbS5kaXNwbGF5LnZpZXdPZmZzZXQgPSAwO1xuICB9XG5cbiAgZnVuY3Rpb24gdmlld0N1dHRpbmdQb2ludChjbSwgb2xkTiwgbmV3TiwgZGlyKSB7XG4gICAgdmFyIGluZGV4ID0gZmluZFZpZXdJbmRleChjbSwgb2xkTiksIGRpZmYsIHZpZXcgPSBjbS5kaXNwbGF5LnZpZXc7XG4gICAgaWYgKCFzYXdDb2xsYXBzZWRTcGFucyB8fCBuZXdOID09IGNtLmRvYy5maXJzdCArIGNtLmRvYy5zaXplKVxuICAgICAgeyByZXR1cm4ge2luZGV4OiBpbmRleCwgbGluZU46IG5ld059IH1cbiAgICB2YXIgbiA9IGNtLmRpc3BsYXkudmlld0Zyb207XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbmRleDsgaSsrKVxuICAgICAgeyBuICs9IHZpZXdbaV0uc2l6ZTsgfVxuICAgIGlmIChuICE9IG9sZE4pIHtcbiAgICAgIGlmIChkaXIgPiAwKSB7XG4gICAgICAgIGlmIChpbmRleCA9PSB2aWV3Lmxlbmd0aCAtIDEpIHsgcmV0dXJuIG51bGwgfVxuICAgICAgICBkaWZmID0gKG4gKyB2aWV3W2luZGV4XS5zaXplKSAtIG9sZE47XG4gICAgICAgIGluZGV4Kys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkaWZmID0gbiAtIG9sZE47XG4gICAgICB9XG4gICAgICBvbGROICs9IGRpZmY7IG5ld04gKz0gZGlmZjtcbiAgICB9XG4gICAgd2hpbGUgKHZpc3VhbExpbmVObyhjbS5kb2MsIG5ld04pICE9IG5ld04pIHtcbiAgICAgIGlmIChpbmRleCA9PSAoZGlyIDwgMCA/IDAgOiB2aWV3Lmxlbmd0aCAtIDEpKSB7IHJldHVybiBudWxsIH1cbiAgICAgIG5ld04gKz0gZGlyICogdmlld1tpbmRleCAtIChkaXIgPCAwID8gMSA6IDApXS5zaXplO1xuICAgICAgaW5kZXggKz0gZGlyO1xuICAgIH1cbiAgICByZXR1cm4ge2luZGV4OiBpbmRleCwgbGluZU46IG5ld059XG4gIH1cblxuICAvLyBGb3JjZSB0aGUgdmlldyB0byBjb3ZlciBhIGdpdmVuIHJhbmdlLCBhZGRpbmcgZW1wdHkgdmlldyBlbGVtZW50XG4gIC8vIG9yIGNsaXBwaW5nIG9mZiBleGlzdGluZyBvbmVzIGFzIG5lZWRlZC5cbiAgZnVuY3Rpb24gYWRqdXN0VmlldyhjbSwgZnJvbSwgdG8pIHtcbiAgICB2YXIgZGlzcGxheSA9IGNtLmRpc3BsYXksIHZpZXcgPSBkaXNwbGF5LnZpZXc7XG4gICAgaWYgKHZpZXcubGVuZ3RoID09IDAgfHwgZnJvbSA+PSBkaXNwbGF5LnZpZXdUbyB8fCB0byA8PSBkaXNwbGF5LnZpZXdGcm9tKSB7XG4gICAgICBkaXNwbGF5LnZpZXcgPSBidWlsZFZpZXdBcnJheShjbSwgZnJvbSwgdG8pO1xuICAgICAgZGlzcGxheS52aWV3RnJvbSA9IGZyb207XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChkaXNwbGF5LnZpZXdGcm9tID4gZnJvbSlcbiAgICAgICAgeyBkaXNwbGF5LnZpZXcgPSBidWlsZFZpZXdBcnJheShjbSwgZnJvbSwgZGlzcGxheS52aWV3RnJvbSkuY29uY2F0KGRpc3BsYXkudmlldyk7IH1cbiAgICAgIGVsc2UgaWYgKGRpc3BsYXkudmlld0Zyb20gPCBmcm9tKVxuICAgICAgICB7IGRpc3BsYXkudmlldyA9IGRpc3BsYXkudmlldy5zbGljZShmaW5kVmlld0luZGV4KGNtLCBmcm9tKSk7IH1cbiAgICAgIGRpc3BsYXkudmlld0Zyb20gPSBmcm9tO1xuICAgICAgaWYgKGRpc3BsYXkudmlld1RvIDwgdG8pXG4gICAgICAgIHsgZGlzcGxheS52aWV3ID0gZGlzcGxheS52aWV3LmNvbmNhdChidWlsZFZpZXdBcnJheShjbSwgZGlzcGxheS52aWV3VG8sIHRvKSk7IH1cbiAgICAgIGVsc2UgaWYgKGRpc3BsYXkudmlld1RvID4gdG8pXG4gICAgICAgIHsgZGlzcGxheS52aWV3ID0gZGlzcGxheS52aWV3LnNsaWNlKDAsIGZpbmRWaWV3SW5kZXgoY20sIHRvKSk7IH1cbiAgICB9XG4gICAgZGlzcGxheS52aWV3VG8gPSB0bztcbiAgfVxuXG4gIC8vIENvdW50IHRoZSBudW1iZXIgb2YgbGluZXMgaW4gdGhlIHZpZXcgd2hvc2UgRE9NIHJlcHJlc2VudGF0aW9uIGlzXG4gIC8vIG91dCBvZiBkYXRlIChvciBub25leGlzdGVudCkuXG4gIGZ1bmN0aW9uIGNvdW50RGlydHlWaWV3KGNtKSB7XG4gICAgdmFyIHZpZXcgPSBjbS5kaXNwbGF5LnZpZXcsIGRpcnR5ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZpZXcubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBsaW5lVmlldyA9IHZpZXdbaV07XG4gICAgICBpZiAoIWxpbmVWaWV3LmhpZGRlbiAmJiAoIWxpbmVWaWV3Lm5vZGUgfHwgbGluZVZpZXcuY2hhbmdlcykpIHsgKytkaXJ0eTsgfVxuICAgIH1cbiAgICByZXR1cm4gZGlydHlcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVNlbGVjdGlvbihjbSkge1xuICAgIGNtLmRpc3BsYXkuaW5wdXQuc2hvd1NlbGVjdGlvbihjbS5kaXNwbGF5LmlucHV0LnByZXBhcmVTZWxlY3Rpb24oKSk7XG4gIH1cblxuICBmdW5jdGlvbiBwcmVwYXJlU2VsZWN0aW9uKGNtLCBwcmltYXJ5KSB7XG4gICAgaWYgKCBwcmltYXJ5ID09PSB2b2lkIDAgKSBwcmltYXJ5ID0gdHJ1ZTtcblxuICAgIHZhciBkb2MgPSBjbS5kb2MsIHJlc3VsdCA9IHt9O1xuICAgIHZhciBjdXJGcmFnbWVudCA9IHJlc3VsdC5jdXJzb3JzID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuICAgIHZhciBzZWxGcmFnbWVudCA9IHJlc3VsdC5zZWxlY3Rpb24gPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRvYy5zZWwucmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIXByaW1hcnkgJiYgaSA9PSBkb2Muc2VsLnByaW1JbmRleCkgeyBjb250aW51ZSB9XG4gICAgICB2YXIgcmFuZ2UgPSBkb2Muc2VsLnJhbmdlc1tpXTtcbiAgICAgIGlmIChyYW5nZS5mcm9tKCkubGluZSA+PSBjbS5kaXNwbGF5LnZpZXdUbyB8fCByYW5nZS50bygpLmxpbmUgPCBjbS5kaXNwbGF5LnZpZXdGcm9tKSB7IGNvbnRpbnVlIH1cbiAgICAgIHZhciBjb2xsYXBzZWQgPSByYW5nZS5lbXB0eSgpO1xuICAgICAgaWYgKGNvbGxhcHNlZCB8fCBjbS5vcHRpb25zLnNob3dDdXJzb3JXaGVuU2VsZWN0aW5nKVxuICAgICAgICB7IGRyYXdTZWxlY3Rpb25DdXJzb3IoY20sIHJhbmdlLmhlYWQsIGN1ckZyYWdtZW50KTsgfVxuICAgICAgaWYgKCFjb2xsYXBzZWQpXG4gICAgICAgIHsgZHJhd1NlbGVjdGlvblJhbmdlKGNtLCByYW5nZSwgc2VsRnJhZ21lbnQpOyB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8vIERyYXdzIGEgY3Vyc29yIGZvciB0aGUgZ2l2ZW4gcmFuZ2VcbiAgZnVuY3Rpb24gZHJhd1NlbGVjdGlvbkN1cnNvcihjbSwgaGVhZCwgb3V0cHV0KSB7XG4gICAgdmFyIHBvcyA9IGN1cnNvckNvb3JkcyhjbSwgaGVhZCwgXCJkaXZcIiwgbnVsbCwgbnVsbCwgIWNtLm9wdGlvbnMuc2luZ2xlQ3Vyc29ySGVpZ2h0UGVyTGluZSk7XG5cbiAgICB2YXIgY3Vyc29yID0gb3V0cHV0LmFwcGVuZENoaWxkKGVsdChcImRpdlwiLCBcIlxcdTAwYTBcIiwgXCJDb2RlTWlycm9yLWN1cnNvclwiKSk7XG4gICAgY3Vyc29yLnN0eWxlLmxlZnQgPSBwb3MubGVmdCArIFwicHhcIjtcbiAgICBjdXJzb3Iuc3R5bGUudG9wID0gcG9zLnRvcCArIFwicHhcIjtcbiAgICBjdXJzb3Iuc3R5bGUuaGVpZ2h0ID0gTWF0aC5tYXgoMCwgcG9zLmJvdHRvbSAtIHBvcy50b3ApICogY20ub3B0aW9ucy5jdXJzb3JIZWlnaHQgKyBcInB4XCI7XG5cbiAgICBpZiAocG9zLm90aGVyKSB7XG4gICAgICAvLyBTZWNvbmRhcnkgY3Vyc29yLCBzaG93biB3aGVuIG9uIGEgJ2p1bXAnIGluIGJpLWRpcmVjdGlvbmFsIHRleHRcbiAgICAgIHZhciBvdGhlckN1cnNvciA9IG91dHB1dC5hcHBlbmRDaGlsZChlbHQoXCJkaXZcIiwgXCJcXHUwMGEwXCIsIFwiQ29kZU1pcnJvci1jdXJzb3IgQ29kZU1pcnJvci1zZWNvbmRhcnljdXJzb3JcIikpO1xuICAgICAgb3RoZXJDdXJzb3Iuc3R5bGUuZGlzcGxheSA9IFwiXCI7XG4gICAgICBvdGhlckN1cnNvci5zdHlsZS5sZWZ0ID0gcG9zLm90aGVyLmxlZnQgKyBcInB4XCI7XG4gICAgICBvdGhlckN1cnNvci5zdHlsZS50b3AgPSBwb3Mub3RoZXIudG9wICsgXCJweFwiO1xuICAgICAgb3RoZXJDdXJzb3Iuc3R5bGUuaGVpZ2h0ID0gKHBvcy5vdGhlci5ib3R0b20gLSBwb3Mub3RoZXIudG9wKSAqIC44NSArIFwicHhcIjtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjbXBDb29yZHMoYSwgYikgeyByZXR1cm4gYS50b3AgLSBiLnRvcCB8fCBhLmxlZnQgLSBiLmxlZnQgfVxuXG4gIC8vIERyYXdzIHRoZSBnaXZlbiByYW5nZSBhcyBhIGhpZ2hsaWdodGVkIHNlbGVjdGlvblxuICBmdW5jdGlvbiBkcmF3U2VsZWN0aW9uUmFuZ2UoY20sIHJhbmdlLCBvdXRwdXQpIHtcbiAgICB2YXIgZGlzcGxheSA9IGNtLmRpc3BsYXksIGRvYyA9IGNtLmRvYztcbiAgICB2YXIgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgdmFyIHBhZGRpbmcgPSBwYWRkaW5nSChjbS5kaXNwbGF5KSwgbGVmdFNpZGUgPSBwYWRkaW5nLmxlZnQ7XG4gICAgdmFyIHJpZ2h0U2lkZSA9IE1hdGgubWF4KGRpc3BsYXkuc2l6ZXJXaWR0aCwgZGlzcGxheVdpZHRoKGNtKSAtIGRpc3BsYXkuc2l6ZXIub2Zmc2V0TGVmdCkgLSBwYWRkaW5nLnJpZ2h0O1xuICAgIHZhciBkb2NMVFIgPSBkb2MuZGlyZWN0aW9uID09IFwibHRyXCI7XG5cbiAgICBmdW5jdGlvbiBhZGQobGVmdCwgdG9wLCB3aWR0aCwgYm90dG9tKSB7XG4gICAgICBpZiAodG9wIDwgMCkgeyB0b3AgPSAwOyB9XG4gICAgICB0b3AgPSBNYXRoLnJvdW5kKHRvcCk7XG4gICAgICBib3R0b20gPSBNYXRoLnJvdW5kKGJvdHRvbSk7XG4gICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChlbHQoXCJkaXZcIiwgbnVsbCwgXCJDb2RlTWlycm9yLXNlbGVjdGVkXCIsIChcInBvc2l0aW9uOiBhYnNvbHV0ZTsgbGVmdDogXCIgKyBsZWZ0ICsgXCJweDtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogXCIgKyB0b3AgKyBcInB4OyB3aWR0aDogXCIgKyAod2lkdGggPT0gbnVsbCA/IHJpZ2h0U2lkZSAtIGxlZnQgOiB3aWR0aCkgKyBcInB4O1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBcIiArIChib3R0b20gLSB0b3ApICsgXCJweFwiKSkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRyYXdGb3JMaW5lKGxpbmUsIGZyb21BcmcsIHRvQXJnKSB7XG4gICAgICB2YXIgbGluZU9iaiA9IGdldExpbmUoZG9jLCBsaW5lKTtcbiAgICAgIHZhciBsaW5lTGVuID0gbGluZU9iai50ZXh0Lmxlbmd0aDtcbiAgICAgIHZhciBzdGFydCwgZW5kO1xuICAgICAgZnVuY3Rpb24gY29vcmRzKGNoLCBiaWFzKSB7XG4gICAgICAgIHJldHVybiBjaGFyQ29vcmRzKGNtLCBQb3MobGluZSwgY2gpLCBcImRpdlwiLCBsaW5lT2JqLCBiaWFzKVxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiB3cmFwWChwb3MsIGRpciwgc2lkZSkge1xuICAgICAgICB2YXIgZXh0ZW50ID0gd3JhcHBlZExpbmVFeHRlbnRDaGFyKGNtLCBsaW5lT2JqLCBudWxsLCBwb3MpO1xuICAgICAgICB2YXIgcHJvcCA9IChkaXIgPT0gXCJsdHJcIikgPT0gKHNpZGUgPT0gXCJhZnRlclwiKSA/IFwibGVmdFwiIDogXCJyaWdodFwiO1xuICAgICAgICB2YXIgY2ggPSBzaWRlID09IFwiYWZ0ZXJcIiA/IGV4dGVudC5iZWdpbiA6IGV4dGVudC5lbmQgLSAoL1xccy8udGVzdChsaW5lT2JqLnRleHQuY2hhckF0KGV4dGVudC5lbmQgLSAxKSkgPyAyIDogMSk7XG4gICAgICAgIHJldHVybiBjb29yZHMoY2gsIHByb3ApW3Byb3BdXG4gICAgICB9XG5cbiAgICAgIHZhciBvcmRlciA9IGdldE9yZGVyKGxpbmVPYmosIGRvYy5kaXJlY3Rpb24pO1xuICAgICAgaXRlcmF0ZUJpZGlTZWN0aW9ucyhvcmRlciwgZnJvbUFyZyB8fCAwLCB0b0FyZyA9PSBudWxsID8gbGluZUxlbiA6IHRvQXJnLCBmdW5jdGlvbiAoZnJvbSwgdG8sIGRpciwgaSkge1xuICAgICAgICB2YXIgbHRyID0gZGlyID09IFwibHRyXCI7XG4gICAgICAgIHZhciBmcm9tUG9zID0gY29vcmRzKGZyb20sIGx0ciA/IFwibGVmdFwiIDogXCJyaWdodFwiKTtcbiAgICAgICAgdmFyIHRvUG9zID0gY29vcmRzKHRvIC0gMSwgbHRyID8gXCJyaWdodFwiIDogXCJsZWZ0XCIpO1xuXG4gICAgICAgIHZhciBvcGVuU3RhcnQgPSBmcm9tQXJnID09IG51bGwgJiYgZnJvbSA9PSAwLCBvcGVuRW5kID0gdG9BcmcgPT0gbnVsbCAmJiB0byA9PSBsaW5lTGVuO1xuICAgICAgICB2YXIgZmlyc3QgPSBpID09IDAsIGxhc3QgPSAhb3JkZXIgfHwgaSA9PSBvcmRlci5sZW5ndGggLSAxO1xuICAgICAgICBpZiAodG9Qb3MudG9wIC0gZnJvbVBvcy50b3AgPD0gMykgeyAvLyBTaW5nbGUgbGluZVxuICAgICAgICAgIHZhciBvcGVuTGVmdCA9IChkb2NMVFIgPyBvcGVuU3RhcnQgOiBvcGVuRW5kKSAmJiBmaXJzdDtcbiAgICAgICAgICB2YXIgb3BlblJpZ2h0ID0gKGRvY0xUUiA/IG9wZW5FbmQgOiBvcGVuU3RhcnQpICYmIGxhc3Q7XG4gICAgICAgICAgdmFyIGxlZnQgPSBvcGVuTGVmdCA/IGxlZnRTaWRlIDogKGx0ciA/IGZyb21Qb3MgOiB0b1BvcykubGVmdDtcbiAgICAgICAgICB2YXIgcmlnaHQgPSBvcGVuUmlnaHQgPyByaWdodFNpZGUgOiAobHRyID8gdG9Qb3MgOiBmcm9tUG9zKS5yaWdodDtcbiAgICAgICAgICBhZGQobGVmdCwgZnJvbVBvcy50b3AsIHJpZ2h0IC0gbGVmdCwgZnJvbVBvcy5ib3R0b20pO1xuICAgICAgICB9IGVsc2UgeyAvLyBNdWx0aXBsZSBsaW5lc1xuICAgICAgICAgIHZhciB0b3BMZWZ0LCB0b3BSaWdodCwgYm90TGVmdCwgYm90UmlnaHQ7XG4gICAgICAgICAgaWYgKGx0cikge1xuICAgICAgICAgICAgdG9wTGVmdCA9IGRvY0xUUiAmJiBvcGVuU3RhcnQgJiYgZmlyc3QgPyBsZWZ0U2lkZSA6IGZyb21Qb3MubGVmdDtcbiAgICAgICAgICAgIHRvcFJpZ2h0ID0gZG9jTFRSID8gcmlnaHRTaWRlIDogd3JhcFgoZnJvbSwgZGlyLCBcImJlZm9yZVwiKTtcbiAgICAgICAgICAgIGJvdExlZnQgPSBkb2NMVFIgPyBsZWZ0U2lkZSA6IHdyYXBYKHRvLCBkaXIsIFwiYWZ0ZXJcIik7XG4gICAgICAgICAgICBib3RSaWdodCA9IGRvY0xUUiAmJiBvcGVuRW5kICYmIGxhc3QgPyByaWdodFNpZGUgOiB0b1Bvcy5yaWdodDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdG9wTGVmdCA9ICFkb2NMVFIgPyBsZWZ0U2lkZSA6IHdyYXBYKGZyb20sIGRpciwgXCJiZWZvcmVcIik7XG4gICAgICAgICAgICB0b3BSaWdodCA9ICFkb2NMVFIgJiYgb3BlblN0YXJ0ICYmIGZpcnN0ID8gcmlnaHRTaWRlIDogZnJvbVBvcy5yaWdodDtcbiAgICAgICAgICAgIGJvdExlZnQgPSAhZG9jTFRSICYmIG9wZW5FbmQgJiYgbGFzdCA/IGxlZnRTaWRlIDogdG9Qb3MubGVmdDtcbiAgICAgICAgICAgIGJvdFJpZ2h0ID0gIWRvY0xUUiA/IHJpZ2h0U2lkZSA6IHdyYXBYKHRvLCBkaXIsIFwiYWZ0ZXJcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFkZCh0b3BMZWZ0LCBmcm9tUG9zLnRvcCwgdG9wUmlnaHQgLSB0b3BMZWZ0LCBmcm9tUG9zLmJvdHRvbSk7XG4gICAgICAgICAgaWYgKGZyb21Qb3MuYm90dG9tIDwgdG9Qb3MudG9wKSB7IGFkZChsZWZ0U2lkZSwgZnJvbVBvcy5ib3R0b20sIG51bGwsIHRvUG9zLnRvcCk7IH1cbiAgICAgICAgICBhZGQoYm90TGVmdCwgdG9Qb3MudG9wLCBib3RSaWdodCAtIGJvdExlZnQsIHRvUG9zLmJvdHRvbSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXN0YXJ0IHx8IGNtcENvb3Jkcyhmcm9tUG9zLCBzdGFydCkgPCAwKSB7IHN0YXJ0ID0gZnJvbVBvczsgfVxuICAgICAgICBpZiAoY21wQ29vcmRzKHRvUG9zLCBzdGFydCkgPCAwKSB7IHN0YXJ0ID0gdG9Qb3M7IH1cbiAgICAgICAgaWYgKCFlbmQgfHwgY21wQ29vcmRzKGZyb21Qb3MsIGVuZCkgPCAwKSB7IGVuZCA9IGZyb21Qb3M7IH1cbiAgICAgICAgaWYgKGNtcENvb3Jkcyh0b1BvcywgZW5kKSA8IDApIHsgZW5kID0gdG9Qb3M7IH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtzdGFydDogc3RhcnQsIGVuZDogZW5kfVxuICAgIH1cblxuICAgIHZhciBzRnJvbSA9IHJhbmdlLmZyb20oKSwgc1RvID0gcmFuZ2UudG8oKTtcbiAgICBpZiAoc0Zyb20ubGluZSA9PSBzVG8ubGluZSkge1xuICAgICAgZHJhd0ZvckxpbmUoc0Zyb20ubGluZSwgc0Zyb20uY2gsIHNUby5jaCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBmcm9tTGluZSA9IGdldExpbmUoZG9jLCBzRnJvbS5saW5lKSwgdG9MaW5lID0gZ2V0TGluZShkb2MsIHNUby5saW5lKTtcbiAgICAgIHZhciBzaW5nbGVWTGluZSA9IHZpc3VhbExpbmUoZnJvbUxpbmUpID09IHZpc3VhbExpbmUodG9MaW5lKTtcbiAgICAgIHZhciBsZWZ0RW5kID0gZHJhd0ZvckxpbmUoc0Zyb20ubGluZSwgc0Zyb20uY2gsIHNpbmdsZVZMaW5lID8gZnJvbUxpbmUudGV4dC5sZW5ndGggKyAxIDogbnVsbCkuZW5kO1xuICAgICAgdmFyIHJpZ2h0U3RhcnQgPSBkcmF3Rm9yTGluZShzVG8ubGluZSwgc2luZ2xlVkxpbmUgPyAwIDogbnVsbCwgc1RvLmNoKS5zdGFydDtcbiAgICAgIGlmIChzaW5nbGVWTGluZSkge1xuICAgICAgICBpZiAobGVmdEVuZC50b3AgPCByaWdodFN0YXJ0LnRvcCAtIDIpIHtcbiAgICAgICAgICBhZGQobGVmdEVuZC5yaWdodCwgbGVmdEVuZC50b3AsIG51bGwsIGxlZnRFbmQuYm90dG9tKTtcbiAgICAgICAgICBhZGQobGVmdFNpZGUsIHJpZ2h0U3RhcnQudG9wLCByaWdodFN0YXJ0LmxlZnQsIHJpZ2h0U3RhcnQuYm90dG9tKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhZGQobGVmdEVuZC5yaWdodCwgbGVmdEVuZC50b3AsIHJpZ2h0U3RhcnQubGVmdCAtIGxlZnRFbmQucmlnaHQsIGxlZnRFbmQuYm90dG9tKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGxlZnRFbmQuYm90dG9tIDwgcmlnaHRTdGFydC50b3ApXG4gICAgICAgIHsgYWRkKGxlZnRTaWRlLCBsZWZ0RW5kLmJvdHRvbSwgbnVsbCwgcmlnaHRTdGFydC50b3ApOyB9XG4gICAgfVxuXG4gICAgb3V0cHV0LmFwcGVuZENoaWxkKGZyYWdtZW50KTtcbiAgfVxuXG4gIC8vIEN1cnNvci1ibGlua2luZ1xuICBmdW5jdGlvbiByZXN0YXJ0QmxpbmsoY20pIHtcbiAgICBpZiAoIWNtLnN0YXRlLmZvY3VzZWQpIHsgcmV0dXJuIH1cbiAgICB2YXIgZGlzcGxheSA9IGNtLmRpc3BsYXk7XG4gICAgY2xlYXJJbnRlcnZhbChkaXNwbGF5LmJsaW5rZXIpO1xuICAgIHZhciBvbiA9IHRydWU7XG4gICAgZGlzcGxheS5jdXJzb3JEaXYuc3R5bGUudmlzaWJpbGl0eSA9IFwiXCI7XG4gICAgaWYgKGNtLm9wdGlvbnMuY3Vyc29yQmxpbmtSYXRlID4gMClcbiAgICAgIHsgZGlzcGxheS5ibGlua2VyID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIWNtLmhhc0ZvY3VzKCkpIHsgb25CbHVyKGNtKTsgfVxuICAgICAgICBkaXNwbGF5LmN1cnNvckRpdi5zdHlsZS52aXNpYmlsaXR5ID0gKG9uID0gIW9uKSA/IFwiXCIgOiBcImhpZGRlblwiO1xuICAgICAgfSwgY20ub3B0aW9ucy5jdXJzb3JCbGlua1JhdGUpOyB9XG4gICAgZWxzZSBpZiAoY20ub3B0aW9ucy5jdXJzb3JCbGlua1JhdGUgPCAwKVxuICAgICAgeyBkaXNwbGF5LmN1cnNvckRpdi5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjsgfVxuICB9XG5cbiAgZnVuY3Rpb24gZW5zdXJlRm9jdXMoY20pIHtcbiAgICBpZiAoIWNtLmhhc0ZvY3VzKCkpIHtcbiAgICAgIGNtLmRpc3BsYXkuaW5wdXQuZm9jdXMoKTtcbiAgICAgIGlmICghY20uc3RhdGUuZm9jdXNlZCkgeyBvbkZvY3VzKGNtKTsgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGRlbGF5Qmx1ckV2ZW50KGNtKSB7XG4gICAgY20uc3RhdGUuZGVsYXlpbmdCbHVyRXZlbnQgPSB0cnVlO1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBpZiAoY20uc3RhdGUuZGVsYXlpbmdCbHVyRXZlbnQpIHtcbiAgICAgIGNtLnN0YXRlLmRlbGF5aW5nQmx1ckV2ZW50ID0gZmFsc2U7XG4gICAgICBpZiAoY20uc3RhdGUuZm9jdXNlZCkgeyBvbkJsdXIoY20pOyB9XG4gICAgfSB9LCAxMDApO1xuICB9XG5cbiAgZnVuY3Rpb24gb25Gb2N1cyhjbSwgZSkge1xuICAgIGlmIChjbS5zdGF0ZS5kZWxheWluZ0JsdXJFdmVudCAmJiAhY20uc3RhdGUuZHJhZ2dpbmdUZXh0KSB7IGNtLnN0YXRlLmRlbGF5aW5nQmx1ckV2ZW50ID0gZmFsc2U7IH1cblxuICAgIGlmIChjbS5vcHRpb25zLnJlYWRPbmx5ID09IFwibm9jdXJzb3JcIikgeyByZXR1cm4gfVxuICAgIGlmICghY20uc3RhdGUuZm9jdXNlZCkge1xuICAgICAgc2lnbmFsKGNtLCBcImZvY3VzXCIsIGNtLCBlKTtcbiAgICAgIGNtLnN0YXRlLmZvY3VzZWQgPSB0cnVlO1xuICAgICAgYWRkQ2xhc3MoY20uZGlzcGxheS53cmFwcGVyLCBcIkNvZGVNaXJyb3ItZm9jdXNlZFwiKTtcbiAgICAgIC8vIFRoaXMgdGVzdCBwcmV2ZW50cyB0aGlzIGZyb20gZmlyaW5nIHdoZW4gYSBjb250ZXh0XG4gICAgICAvLyBtZW51IGlzIGNsb3NlZCAoc2luY2UgdGhlIGlucHV0IHJlc2V0IHdvdWxkIGtpbGwgdGhlXG4gICAgICAvLyBzZWxlY3QtYWxsIGRldGVjdGlvbiBoYWNrKVxuICAgICAgaWYgKCFjbS5jdXJPcCAmJiBjbS5kaXNwbGF5LnNlbEZvckNvbnRleHRNZW51ICE9IGNtLmRvYy5zZWwpIHtcbiAgICAgICAgY20uZGlzcGxheS5pbnB1dC5yZXNldCgpO1xuICAgICAgICBpZiAod2Via2l0KSB7IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyByZXR1cm4gY20uZGlzcGxheS5pbnB1dC5yZXNldCh0cnVlKTsgfSwgMjApOyB9IC8vIElzc3VlICMxNzMwXG4gICAgICB9XG4gICAgICBjbS5kaXNwbGF5LmlucHV0LnJlY2VpdmVkRm9jdXMoKTtcbiAgICB9XG4gICAgcmVzdGFydEJsaW5rKGNtKTtcbiAgfVxuICBmdW5jdGlvbiBvbkJsdXIoY20sIGUpIHtcbiAgICBpZiAoY20uc3RhdGUuZGVsYXlpbmdCbHVyRXZlbnQpIHsgcmV0dXJuIH1cblxuICAgIGlmIChjbS5zdGF0ZS5mb2N1c2VkKSB7XG4gICAgICBzaWduYWwoY20sIFwiYmx1clwiLCBjbSwgZSk7XG4gICAgICBjbS5zdGF0ZS5mb2N1c2VkID0gZmFsc2U7XG4gICAgICBybUNsYXNzKGNtLmRpc3BsYXkud3JhcHBlciwgXCJDb2RlTWlycm9yLWZvY3VzZWRcIik7XG4gICAgfVxuICAgIGNsZWFySW50ZXJ2YWwoY20uZGlzcGxheS5ibGlua2VyKTtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgaWYgKCFjbS5zdGF0ZS5mb2N1c2VkKSB7IGNtLmRpc3BsYXkuc2hpZnQgPSBmYWxzZTsgfSB9LCAxNTApO1xuICB9XG5cbiAgLy8gUmVhZCB0aGUgYWN0dWFsIGhlaWdodHMgb2YgdGhlIHJlbmRlcmVkIGxpbmVzLCBhbmQgdXBkYXRlIHRoZWlyXG4gIC8vIHN0b3JlZCBoZWlnaHRzIHRvIG1hdGNoLlxuICBmdW5jdGlvbiB1cGRhdGVIZWlnaHRzSW5WaWV3cG9ydChjbSkge1xuICAgIHZhciBkaXNwbGF5ID0gY20uZGlzcGxheTtcbiAgICB2YXIgcHJldkJvdHRvbSA9IGRpc3BsYXkubGluZURpdi5vZmZzZXRUb3A7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaXNwbGF5LnZpZXcubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjdXIgPSBkaXNwbGF5LnZpZXdbaV0sIHdyYXBwaW5nID0gY20ub3B0aW9ucy5saW5lV3JhcHBpbmc7XG4gICAgICB2YXIgaGVpZ2h0ID0gKHZvaWQgMCksIHdpZHRoID0gMDtcbiAgICAgIGlmIChjdXIuaGlkZGVuKSB7IGNvbnRpbnVlIH1cbiAgICAgIGlmIChpZSAmJiBpZV92ZXJzaW9uIDwgOCkge1xuICAgICAgICB2YXIgYm90ID0gY3VyLm5vZGUub2Zmc2V0VG9wICsgY3VyLm5vZGUub2Zmc2V0SGVpZ2h0O1xuICAgICAgICBoZWlnaHQgPSBib3QgLSBwcmV2Qm90dG9tO1xuICAgICAgICBwcmV2Qm90dG9tID0gYm90O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGJveCA9IGN1ci5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBoZWlnaHQgPSBib3guYm90dG9tIC0gYm94LnRvcDtcbiAgICAgICAgLy8gQ2hlY2sgdGhhdCBsaW5lcyBkb24ndCBleHRlbmQgcGFzdCB0aGUgcmlnaHQgb2YgdGhlIGN1cnJlbnRcbiAgICAgICAgLy8gZWRpdG9yIHdpZHRoXG4gICAgICAgIGlmICghd3JhcHBpbmcgJiYgY3VyLnRleHQuZmlyc3RDaGlsZClcbiAgICAgICAgICB7IHdpZHRoID0gY3VyLnRleHQuZmlyc3RDaGlsZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodCAtIGJveC5sZWZ0IC0gMTsgfVxuICAgICAgfVxuICAgICAgdmFyIGRpZmYgPSBjdXIubGluZS5oZWlnaHQgLSBoZWlnaHQ7XG4gICAgICBpZiAoZGlmZiA+IC4wMDUgfHwgZGlmZiA8IC0uMDA1KSB7XG4gICAgICAgIHVwZGF0ZUxpbmVIZWlnaHQoY3VyLmxpbmUsIGhlaWdodCk7XG4gICAgICAgIHVwZGF0ZVdpZGdldEhlaWdodChjdXIubGluZSk7XG4gICAgICAgIGlmIChjdXIucmVzdCkgeyBmb3IgKHZhciBqID0gMDsgaiA8IGN1ci5yZXN0Lmxlbmd0aDsgaisrKVxuICAgICAgICAgIHsgdXBkYXRlV2lkZ2V0SGVpZ2h0KGN1ci5yZXN0W2pdKTsgfSB9XG4gICAgICB9XG4gICAgICBpZiAod2lkdGggPiBjbS5kaXNwbGF5LnNpemVyV2lkdGgpIHtcbiAgICAgICAgdmFyIGNoV2lkdGggPSBNYXRoLmNlaWwod2lkdGggLyBjaGFyV2lkdGgoY20uZGlzcGxheSkpO1xuICAgICAgICBpZiAoY2hXaWR0aCA+IGNtLmRpc3BsYXkubWF4TGluZUxlbmd0aCkge1xuICAgICAgICAgIGNtLmRpc3BsYXkubWF4TGluZUxlbmd0aCA9IGNoV2lkdGg7XG4gICAgICAgICAgY20uZGlzcGxheS5tYXhMaW5lID0gY3VyLmxpbmU7XG4gICAgICAgICAgY20uZGlzcGxheS5tYXhMaW5lQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBSZWFkIGFuZCBzdG9yZSB0aGUgaGVpZ2h0IG9mIGxpbmUgd2lkZ2V0cyBhc3NvY2lhdGVkIHdpdGggdGhlXG4gIC8vIGdpdmVuIGxpbmUuXG4gIGZ1bmN0aW9uIHVwZGF0ZVdpZGdldEhlaWdodChsaW5lKSB7XG4gICAgaWYgKGxpbmUud2lkZ2V0cykgeyBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmUud2lkZ2V0cy5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIHcgPSBsaW5lLndpZGdldHNbaV0sIHBhcmVudCA9IHcubm9kZS5wYXJlbnROb2RlO1xuICAgICAgaWYgKHBhcmVudCkgeyB3LmhlaWdodCA9IHBhcmVudC5vZmZzZXRIZWlnaHQ7IH1cbiAgICB9IH1cbiAgfVxuXG4gIC8vIENvbXB1dGUgdGhlIGxpbmVzIHRoYXQgYXJlIHZpc2libGUgaW4gYSBnaXZlbiB2aWV3cG9ydCAoZGVmYXVsdHNcbiAgLy8gdGhlIHRoZSBjdXJyZW50IHNjcm9sbCBwb3NpdGlvbikuIHZpZXdwb3J0IG1heSBjb250YWluIHRvcCxcbiAgLy8gaGVpZ2h0LCBhbmQgZW5zdXJlIChzZWUgb3Auc2Nyb2xsVG9Qb3MpIHByb3BlcnRpZXMuXG4gIGZ1bmN0aW9uIHZpc2libGVMaW5lcyhkaXNwbGF5LCBkb2MsIHZpZXdwb3J0KSB7XG4gICAgdmFyIHRvcCA9IHZpZXdwb3J0ICYmIHZpZXdwb3J0LnRvcCAhPSBudWxsID8gTWF0aC5tYXgoMCwgdmlld3BvcnQudG9wKSA6IGRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsVG9wO1xuICAgIHRvcCA9IE1hdGguZmxvb3IodG9wIC0gcGFkZGluZ1RvcChkaXNwbGF5KSk7XG4gICAgdmFyIGJvdHRvbSA9IHZpZXdwb3J0ICYmIHZpZXdwb3J0LmJvdHRvbSAhPSBudWxsID8gdmlld3BvcnQuYm90dG9tIDogdG9wICsgZGlzcGxheS53cmFwcGVyLmNsaWVudEhlaWdodDtcblxuICAgIHZhciBmcm9tID0gbGluZUF0SGVpZ2h0KGRvYywgdG9wKSwgdG8gPSBsaW5lQXRIZWlnaHQoZG9jLCBib3R0b20pO1xuICAgIC8vIEVuc3VyZSBpcyBhIHtmcm9tOiB7bGluZSwgY2h9LCB0bzoge2xpbmUsIGNofX0gb2JqZWN0LCBhbmRcbiAgICAvLyBmb3JjZXMgdGhvc2UgbGluZXMgaW50byB0aGUgdmlld3BvcnQgKGlmIHBvc3NpYmxlKS5cbiAgICBpZiAodmlld3BvcnQgJiYgdmlld3BvcnQuZW5zdXJlKSB7XG4gICAgICB2YXIgZW5zdXJlRnJvbSA9IHZpZXdwb3J0LmVuc3VyZS5mcm9tLmxpbmUsIGVuc3VyZVRvID0gdmlld3BvcnQuZW5zdXJlLnRvLmxpbmU7XG4gICAgICBpZiAoZW5zdXJlRnJvbSA8IGZyb20pIHtcbiAgICAgICAgZnJvbSA9IGVuc3VyZUZyb207XG4gICAgICAgIHRvID0gbGluZUF0SGVpZ2h0KGRvYywgaGVpZ2h0QXRMaW5lKGdldExpbmUoZG9jLCBlbnN1cmVGcm9tKSkgKyBkaXNwbGF5LndyYXBwZXIuY2xpZW50SGVpZ2h0KTtcbiAgICAgIH0gZWxzZSBpZiAoTWF0aC5taW4oZW5zdXJlVG8sIGRvYy5sYXN0TGluZSgpKSA+PSB0bykge1xuICAgICAgICBmcm9tID0gbGluZUF0SGVpZ2h0KGRvYywgaGVpZ2h0QXRMaW5lKGdldExpbmUoZG9jLCBlbnN1cmVUbykpIC0gZGlzcGxheS53cmFwcGVyLmNsaWVudEhlaWdodCk7XG4gICAgICAgIHRvID0gZW5zdXJlVG87XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7ZnJvbTogZnJvbSwgdG86IE1hdGgubWF4KHRvLCBmcm9tICsgMSl9XG4gIH1cblxuICAvLyBTQ1JPTExJTkcgVEhJTkdTIElOVE8gVklFV1xuXG4gIC8vIElmIGFuIGVkaXRvciBzaXRzIG9uIHRoZSB0b3Agb3IgYm90dG9tIG9mIHRoZSB3aW5kb3csIHBhcnRpYWxseVxuICAvLyBzY3JvbGxlZCBvdXQgb2YgdmlldywgdGhpcyBlbnN1cmVzIHRoYXQgdGhlIGN1cnNvciBpcyB2aXNpYmxlLlxuICBmdW5jdGlvbiBtYXliZVNjcm9sbFdpbmRvdyhjbSwgcmVjdCkge1xuICAgIGlmIChzaWduYWxET01FdmVudChjbSwgXCJzY3JvbGxDdXJzb3JJbnRvVmlld1wiKSkgeyByZXR1cm4gfVxuXG4gICAgdmFyIGRpc3BsYXkgPSBjbS5kaXNwbGF5LCBib3ggPSBkaXNwbGF5LnNpemVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBkb1Njcm9sbCA9IG51bGw7XG4gICAgaWYgKHJlY3QudG9wICsgYm94LnRvcCA8IDApIHsgZG9TY3JvbGwgPSB0cnVlOyB9XG4gICAgZWxzZSBpZiAocmVjdC5ib3R0b20gKyBib3gudG9wID4gKHdpbmRvdy5pbm5lckhlaWdodCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSkgeyBkb1Njcm9sbCA9IGZhbHNlOyB9XG4gICAgaWYgKGRvU2Nyb2xsICE9IG51bGwgJiYgIXBoYW50b20pIHtcbiAgICAgIHZhciBzY3JvbGxOb2RlID0gZWx0KFwiZGl2XCIsIFwiXFx1MjAwYlwiLCBudWxsLCAoXCJwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogXCIgKyAocmVjdC50b3AgLSBkaXNwbGF5LnZpZXdPZmZzZXQgLSBwYWRkaW5nVG9wKGNtLmRpc3BsYXkpKSArIFwicHg7XFxuICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogXCIgKyAocmVjdC5ib3R0b20gLSByZWN0LnRvcCArIHNjcm9sbEdhcChjbSkgKyBkaXNwbGF5LmJhckhlaWdodCkgKyBcInB4O1xcbiAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiBcIiArIChyZWN0LmxlZnQpICsgXCJweDsgd2lkdGg6IFwiICsgKE1hdGgubWF4KDIsIHJlY3QucmlnaHQgLSByZWN0LmxlZnQpKSArIFwicHg7XCIpKTtcbiAgICAgIGNtLmRpc3BsYXkubGluZVNwYWNlLmFwcGVuZENoaWxkKHNjcm9sbE5vZGUpO1xuICAgICAgc2Nyb2xsTm9kZS5zY3JvbGxJbnRvVmlldyhkb1Njcm9sbCk7XG4gICAgICBjbS5kaXNwbGF5LmxpbmVTcGFjZS5yZW1vdmVDaGlsZChzY3JvbGxOb2RlKTtcbiAgICB9XG4gIH1cblxuICAvLyBTY3JvbGwgYSBnaXZlbiBwb3NpdGlvbiBpbnRvIHZpZXcgKGltbWVkaWF0ZWx5KSwgdmVyaWZ5aW5nIHRoYXRcbiAgLy8gaXQgYWN0dWFsbHkgYmVjYW1lIHZpc2libGUgKGFzIGxpbmUgaGVpZ2h0cyBhcmUgYWNjdXJhdGVseVxuICAvLyBtZWFzdXJlZCwgdGhlIHBvc2l0aW9uIG9mIHNvbWV0aGluZyBtYXkgJ2RyaWZ0JyBkdXJpbmcgZHJhd2luZykuXG4gIGZ1bmN0aW9uIHNjcm9sbFBvc0ludG9WaWV3KGNtLCBwb3MsIGVuZCwgbWFyZ2luKSB7XG4gICAgaWYgKG1hcmdpbiA9PSBudWxsKSB7IG1hcmdpbiA9IDA7IH1cbiAgICB2YXIgcmVjdDtcbiAgICBpZiAoIWNtLm9wdGlvbnMubGluZVdyYXBwaW5nICYmIHBvcyA9PSBlbmQpIHtcbiAgICAgIC8vIFNldCBwb3MgYW5kIGVuZCB0byB0aGUgY3Vyc29yIHBvc2l0aW9ucyBhcm91bmQgdGhlIGNoYXJhY3RlciBwb3Mgc3RpY2tzIHRvXG4gICAgICAvLyBJZiBwb3Muc3RpY2t5ID09IFwiYmVmb3JlXCIsIHRoYXQgaXMgYXJvdW5kIHBvcy5jaCAtIDEsIG90aGVyd2lzZSBhcm91bmQgcG9zLmNoXG4gICAgICAvLyBJZiBwb3MgPT0gUG9zKF8sIDAsIFwiYmVmb3JlXCIpLCBwb3MgYW5kIGVuZCBhcmUgdW5jaGFuZ2VkXG4gICAgICBwb3MgPSBwb3MuY2ggPyBQb3MocG9zLmxpbmUsIHBvcy5zdGlja3kgPT0gXCJiZWZvcmVcIiA/IHBvcy5jaCAtIDEgOiBwb3MuY2gsIFwiYWZ0ZXJcIikgOiBwb3M7XG4gICAgICBlbmQgPSBwb3Muc3RpY2t5ID09IFwiYmVmb3JlXCIgPyBQb3MocG9zLmxpbmUsIHBvcy5jaCArIDEsIFwiYmVmb3JlXCIpIDogcG9zO1xuICAgIH1cbiAgICBmb3IgKHZhciBsaW1pdCA9IDA7IGxpbWl0IDwgNTsgbGltaXQrKykge1xuICAgICAgdmFyIGNoYW5nZWQgPSBmYWxzZTtcbiAgICAgIHZhciBjb29yZHMgPSBjdXJzb3JDb29yZHMoY20sIHBvcyk7XG4gICAgICB2YXIgZW5kQ29vcmRzID0gIWVuZCB8fCBlbmQgPT0gcG9zID8gY29vcmRzIDogY3Vyc29yQ29vcmRzKGNtLCBlbmQpO1xuICAgICAgcmVjdCA9IHtsZWZ0OiBNYXRoLm1pbihjb29yZHMubGVmdCwgZW5kQ29vcmRzLmxlZnQpLFxuICAgICAgICAgICAgICB0b3A6IE1hdGgubWluKGNvb3Jkcy50b3AsIGVuZENvb3Jkcy50b3ApIC0gbWFyZ2luLFxuICAgICAgICAgICAgICByaWdodDogTWF0aC5tYXgoY29vcmRzLmxlZnQsIGVuZENvb3Jkcy5sZWZ0KSxcbiAgICAgICAgICAgICAgYm90dG9tOiBNYXRoLm1heChjb29yZHMuYm90dG9tLCBlbmRDb29yZHMuYm90dG9tKSArIG1hcmdpbn07XG4gICAgICB2YXIgc2Nyb2xsUG9zID0gY2FsY3VsYXRlU2Nyb2xsUG9zKGNtLCByZWN0KTtcbiAgICAgIHZhciBzdGFydFRvcCA9IGNtLmRvYy5zY3JvbGxUb3AsIHN0YXJ0TGVmdCA9IGNtLmRvYy5zY3JvbGxMZWZ0O1xuICAgICAgaWYgKHNjcm9sbFBvcy5zY3JvbGxUb3AgIT0gbnVsbCkge1xuICAgICAgICB1cGRhdGVTY3JvbGxUb3AoY20sIHNjcm9sbFBvcy5zY3JvbGxUb3ApO1xuICAgICAgICBpZiAoTWF0aC5hYnMoY20uZG9jLnNjcm9sbFRvcCAtIHN0YXJ0VG9wKSA+IDEpIHsgY2hhbmdlZCA9IHRydWU7IH1cbiAgICAgIH1cbiAgICAgIGlmIChzY3JvbGxQb3Muc2Nyb2xsTGVmdCAhPSBudWxsKSB7XG4gICAgICAgIHNldFNjcm9sbExlZnQoY20sIHNjcm9sbFBvcy5zY3JvbGxMZWZ0KTtcbiAgICAgICAgaWYgKE1hdGguYWJzKGNtLmRvYy5zY3JvbGxMZWZ0IC0gc3RhcnRMZWZ0KSA+IDEpIHsgY2hhbmdlZCA9IHRydWU7IH1cbiAgICAgIH1cbiAgICAgIGlmICghY2hhbmdlZCkgeyBicmVhayB9XG4gICAgfVxuICAgIHJldHVybiByZWN0XG4gIH1cblxuICAvLyBTY3JvbGwgYSBnaXZlbiBzZXQgb2YgY29vcmRpbmF0ZXMgaW50byB2aWV3IChpbW1lZGlhdGVseSkuXG4gIGZ1bmN0aW9uIHNjcm9sbEludG9WaWV3KGNtLCByZWN0KSB7XG4gICAgdmFyIHNjcm9sbFBvcyA9IGNhbGN1bGF0ZVNjcm9sbFBvcyhjbSwgcmVjdCk7XG4gICAgaWYgKHNjcm9sbFBvcy5zY3JvbGxUb3AgIT0gbnVsbCkgeyB1cGRhdGVTY3JvbGxUb3AoY20sIHNjcm9sbFBvcy5zY3JvbGxUb3ApOyB9XG4gICAgaWYgKHNjcm9sbFBvcy5zY3JvbGxMZWZ0ICE9IG51bGwpIHsgc2V0U2Nyb2xsTGVmdChjbSwgc2Nyb2xsUG9zLnNjcm9sbExlZnQpOyB9XG4gIH1cblxuICAvLyBDYWxjdWxhdGUgYSBuZXcgc2Nyb2xsIHBvc2l0aW9uIG5lZWRlZCB0byBzY3JvbGwgdGhlIGdpdmVuXG4gIC8vIHJlY3RhbmdsZSBpbnRvIHZpZXcuIFJldHVybnMgYW4gb2JqZWN0IHdpdGggc2Nyb2xsVG9wIGFuZFxuICAvLyBzY3JvbGxMZWZ0IHByb3BlcnRpZXMuIFdoZW4gdGhlc2UgYXJlIHVuZGVmaW5lZCwgdGhlXG4gIC8vIHZlcnRpY2FsL2hvcml6b250YWwgcG9zaXRpb24gZG9lcyBub3QgbmVlZCB0byBiZSBhZGp1c3RlZC5cbiAgZnVuY3Rpb24gY2FsY3VsYXRlU2Nyb2xsUG9zKGNtLCByZWN0KSB7XG4gICAgdmFyIGRpc3BsYXkgPSBjbS5kaXNwbGF5LCBzbmFwTWFyZ2luID0gdGV4dEhlaWdodChjbS5kaXNwbGF5KTtcbiAgICBpZiAocmVjdC50b3AgPCAwKSB7IHJlY3QudG9wID0gMDsgfVxuICAgIHZhciBzY3JlZW50b3AgPSBjbS5jdXJPcCAmJiBjbS5jdXJPcC5zY3JvbGxUb3AgIT0gbnVsbCA/IGNtLmN1ck9wLnNjcm9sbFRvcCA6IGRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsVG9wO1xuICAgIHZhciBzY3JlZW4gPSBkaXNwbGF5SGVpZ2h0KGNtKSwgcmVzdWx0ID0ge307XG4gICAgaWYgKHJlY3QuYm90dG9tIC0gcmVjdC50b3AgPiBzY3JlZW4pIHsgcmVjdC5ib3R0b20gPSByZWN0LnRvcCArIHNjcmVlbjsgfVxuICAgIHZhciBkb2NCb3R0b20gPSBjbS5kb2MuaGVpZ2h0ICsgcGFkZGluZ1ZlcnQoZGlzcGxheSk7XG4gICAgdmFyIGF0VG9wID0gcmVjdC50b3AgPCBzbmFwTWFyZ2luLCBhdEJvdHRvbSA9IHJlY3QuYm90dG9tID4gZG9jQm90dG9tIC0gc25hcE1hcmdpbjtcbiAgICBpZiAocmVjdC50b3AgPCBzY3JlZW50b3ApIHtcbiAgICAgIHJlc3VsdC5zY3JvbGxUb3AgPSBhdFRvcCA/IDAgOiByZWN0LnRvcDtcbiAgICB9IGVsc2UgaWYgKHJlY3QuYm90dG9tID4gc2NyZWVudG9wICsgc2NyZWVuKSB7XG4gICAgICB2YXIgbmV3VG9wID0gTWF0aC5taW4ocmVjdC50b3AsIChhdEJvdHRvbSA/IGRvY0JvdHRvbSA6IHJlY3QuYm90dG9tKSAtIHNjcmVlbik7XG4gICAgICBpZiAobmV3VG9wICE9IHNjcmVlbnRvcCkgeyByZXN1bHQuc2Nyb2xsVG9wID0gbmV3VG9wOyB9XG4gICAgfVxuXG4gICAgdmFyIGd1dHRlclNwYWNlID0gY20ub3B0aW9ucy5maXhlZEd1dHRlciA/IDAgOiBkaXNwbGF5Lmd1dHRlcnMub2Zmc2V0V2lkdGg7XG4gICAgdmFyIHNjcmVlbmxlZnQgPSBjbS5jdXJPcCAmJiBjbS5jdXJPcC5zY3JvbGxMZWZ0ICE9IG51bGwgPyBjbS5jdXJPcC5zY3JvbGxMZWZ0IDogZGlzcGxheS5zY3JvbGxlci5zY3JvbGxMZWZ0IC0gZ3V0dGVyU3BhY2U7XG4gICAgdmFyIHNjcmVlbncgPSBkaXNwbGF5V2lkdGgoY20pIC0gZGlzcGxheS5ndXR0ZXJzLm9mZnNldFdpZHRoO1xuICAgIHZhciB0b29XaWRlID0gcmVjdC5yaWdodCAtIHJlY3QubGVmdCA+IHNjcmVlbnc7XG4gICAgaWYgKHRvb1dpZGUpIHsgcmVjdC5yaWdodCA9IHJlY3QubGVmdCArIHNjcmVlbnc7IH1cbiAgICBpZiAocmVjdC5sZWZ0IDwgMTApXG4gICAgICB7IHJlc3VsdC5zY3JvbGxMZWZ0ID0gMDsgfVxuICAgIGVsc2UgaWYgKHJlY3QubGVmdCA8IHNjcmVlbmxlZnQpXG4gICAgICB7IHJlc3VsdC5zY3JvbGxMZWZ0ID0gTWF0aC5tYXgoMCwgcmVjdC5sZWZ0ICsgZ3V0dGVyU3BhY2UgLSAodG9vV2lkZSA/IDAgOiAxMCkpOyB9XG4gICAgZWxzZSBpZiAocmVjdC5yaWdodCA+IHNjcmVlbncgKyBzY3JlZW5sZWZ0IC0gMylcbiAgICAgIHsgcmVzdWx0LnNjcm9sbExlZnQgPSByZWN0LnJpZ2h0ICsgKHRvb1dpZGUgPyAwIDogMTApIC0gc2NyZWVudzsgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8vIFN0b3JlIGEgcmVsYXRpdmUgYWRqdXN0bWVudCB0byB0aGUgc2Nyb2xsIHBvc2l0aW9uIGluIHRoZSBjdXJyZW50XG4gIC8vIG9wZXJhdGlvbiAodG8gYmUgYXBwbGllZCB3aGVuIHRoZSBvcGVyYXRpb24gZmluaXNoZXMpLlxuICBmdW5jdGlvbiBhZGRUb1Njcm9sbFRvcChjbSwgdG9wKSB7XG4gICAgaWYgKHRvcCA9PSBudWxsKSB7IHJldHVybiB9XG4gICAgcmVzb2x2ZVNjcm9sbFRvUG9zKGNtKTtcbiAgICBjbS5jdXJPcC5zY3JvbGxUb3AgPSAoY20uY3VyT3Auc2Nyb2xsVG9wID09IG51bGwgPyBjbS5kb2Muc2Nyb2xsVG9wIDogY20uY3VyT3Auc2Nyb2xsVG9wKSArIHRvcDtcbiAgfVxuXG4gIC8vIE1ha2Ugc3VyZSB0aGF0IGF0IHRoZSBlbmQgb2YgdGhlIG9wZXJhdGlvbiB0aGUgY3VycmVudCBjdXJzb3IgaXNcbiAgLy8gc2hvd24uXG4gIGZ1bmN0aW9uIGVuc3VyZUN1cnNvclZpc2libGUoY20pIHtcbiAgICByZXNvbHZlU2Nyb2xsVG9Qb3MoY20pO1xuICAgIHZhciBjdXIgPSBjbS5nZXRDdXJzb3IoKTtcbiAgICBjbS5jdXJPcC5zY3JvbGxUb1BvcyA9IHtmcm9tOiBjdXIsIHRvOiBjdXIsIG1hcmdpbjogY20ub3B0aW9ucy5jdXJzb3JTY3JvbGxNYXJnaW59O1xuICB9XG5cbiAgZnVuY3Rpb24gc2Nyb2xsVG9Db29yZHMoY20sIHgsIHkpIHtcbiAgICBpZiAoeCAhPSBudWxsIHx8IHkgIT0gbnVsbCkgeyByZXNvbHZlU2Nyb2xsVG9Qb3MoY20pOyB9XG4gICAgaWYgKHggIT0gbnVsbCkgeyBjbS5jdXJPcC5zY3JvbGxMZWZ0ID0geDsgfVxuICAgIGlmICh5ICE9IG51bGwpIHsgY20uY3VyT3Auc2Nyb2xsVG9wID0geTsgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2Nyb2xsVG9SYW5nZShjbSwgcmFuZ2UpIHtcbiAgICByZXNvbHZlU2Nyb2xsVG9Qb3MoY20pO1xuICAgIGNtLmN1ck9wLnNjcm9sbFRvUG9zID0gcmFuZ2U7XG4gIH1cblxuICAvLyBXaGVuIGFuIG9wZXJhdGlvbiBoYXMgaXRzIHNjcm9sbFRvUG9zIHByb3BlcnR5IHNldCwgYW5kIGFub3RoZXJcbiAgLy8gc2Nyb2xsIGFjdGlvbiBpcyBhcHBsaWVkIGJlZm9yZSB0aGUgZW5kIG9mIHRoZSBvcGVyYXRpb24sIHRoaXNcbiAgLy8gJ3NpbXVsYXRlcycgc2Nyb2xsaW5nIHRoYXQgcG9zaXRpb24gaW50byB2aWV3IGluIGEgY2hlYXAgd2F5LCBzb1xuICAvLyB0aGF0IHRoZSBlZmZlY3Qgb2YgaW50ZXJtZWRpYXRlIHNjcm9sbCBjb21tYW5kcyBpcyBub3QgaWdub3JlZC5cbiAgZnVuY3Rpb24gcmVzb2x2ZVNjcm9sbFRvUG9zKGNtKSB7XG4gICAgdmFyIHJhbmdlID0gY20uY3VyT3Auc2Nyb2xsVG9Qb3M7XG4gICAgaWYgKHJhbmdlKSB7XG4gICAgICBjbS5jdXJPcC5zY3JvbGxUb1BvcyA9IG51bGw7XG4gICAgICB2YXIgZnJvbSA9IGVzdGltYXRlQ29vcmRzKGNtLCByYW5nZS5mcm9tKSwgdG8gPSBlc3RpbWF0ZUNvb3JkcyhjbSwgcmFuZ2UudG8pO1xuICAgICAgc2Nyb2xsVG9Db29yZHNSYW5nZShjbSwgZnJvbSwgdG8sIHJhbmdlLm1hcmdpbik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2Nyb2xsVG9Db29yZHNSYW5nZShjbSwgZnJvbSwgdG8sIG1hcmdpbikge1xuICAgIHZhciBzUG9zID0gY2FsY3VsYXRlU2Nyb2xsUG9zKGNtLCB7XG4gICAgICBsZWZ0OiBNYXRoLm1pbihmcm9tLmxlZnQsIHRvLmxlZnQpLFxuICAgICAgdG9wOiBNYXRoLm1pbihmcm9tLnRvcCwgdG8udG9wKSAtIG1hcmdpbixcbiAgICAgIHJpZ2h0OiBNYXRoLm1heChmcm9tLnJpZ2h0LCB0by5yaWdodCksXG4gICAgICBib3R0b206IE1hdGgubWF4KGZyb20uYm90dG9tLCB0by5ib3R0b20pICsgbWFyZ2luXG4gICAgfSk7XG4gICAgc2Nyb2xsVG9Db29yZHMoY20sIHNQb3Muc2Nyb2xsTGVmdCwgc1Bvcy5zY3JvbGxUb3ApO1xuICB9XG5cbiAgLy8gU3luYyB0aGUgc2Nyb2xsYWJsZSBhcmVhIGFuZCBzY3JvbGxiYXJzLCBlbnN1cmUgdGhlIHZpZXdwb3J0XG4gIC8vIGNvdmVycyB0aGUgdmlzaWJsZSBhcmVhLlxuICBmdW5jdGlvbiB1cGRhdGVTY3JvbGxUb3AoY20sIHZhbCkge1xuICAgIGlmIChNYXRoLmFicyhjbS5kb2Muc2Nyb2xsVG9wIC0gdmFsKSA8IDIpIHsgcmV0dXJuIH1cbiAgICBpZiAoIWdlY2tvKSB7IHVwZGF0ZURpc3BsYXlTaW1wbGUoY20sIHt0b3A6IHZhbH0pOyB9XG4gICAgc2V0U2Nyb2xsVG9wKGNtLCB2YWwsIHRydWUpO1xuICAgIGlmIChnZWNrbykgeyB1cGRhdGVEaXNwbGF5U2ltcGxlKGNtKTsgfVxuICAgIHN0YXJ0V29ya2VyKGNtLCAxMDApO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0U2Nyb2xsVG9wKGNtLCB2YWwsIGZvcmNlU2Nyb2xsKSB7XG4gICAgdmFsID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oY20uZGlzcGxheS5zY3JvbGxlci5zY3JvbGxIZWlnaHQgLSBjbS5kaXNwbGF5LnNjcm9sbGVyLmNsaWVudEhlaWdodCwgdmFsKSk7XG4gICAgaWYgKGNtLmRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsVG9wID09IHZhbCAmJiAhZm9yY2VTY3JvbGwpIHsgcmV0dXJuIH1cbiAgICBjbS5kb2Muc2Nyb2xsVG9wID0gdmFsO1xuICAgIGNtLmRpc3BsYXkuc2Nyb2xsYmFycy5zZXRTY3JvbGxUb3AodmFsKTtcbiAgICBpZiAoY20uZGlzcGxheS5zY3JvbGxlci5zY3JvbGxUb3AgIT0gdmFsKSB7IGNtLmRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsVG9wID0gdmFsOyB9XG4gIH1cblxuICAvLyBTeW5jIHNjcm9sbGVyIGFuZCBzY3JvbGxiYXIsIGVuc3VyZSB0aGUgZ3V0dGVyIGVsZW1lbnRzIGFyZVxuICAvLyBhbGlnbmVkLlxuICBmdW5jdGlvbiBzZXRTY3JvbGxMZWZ0KGNtLCB2YWwsIGlzU2Nyb2xsZXIsIGZvcmNlU2Nyb2xsKSB7XG4gICAgdmFsID0gTWF0aC5tYXgoMCwgTWF0aC5taW4odmFsLCBjbS5kaXNwbGF5LnNjcm9sbGVyLnNjcm9sbFdpZHRoIC0gY20uZGlzcGxheS5zY3JvbGxlci5jbGllbnRXaWR0aCkpO1xuICAgIGlmICgoaXNTY3JvbGxlciA/IHZhbCA9PSBjbS5kb2Muc2Nyb2xsTGVmdCA6IE1hdGguYWJzKGNtLmRvYy5zY3JvbGxMZWZ0IC0gdmFsKSA8IDIpICYmICFmb3JjZVNjcm9sbCkgeyByZXR1cm4gfVxuICAgIGNtLmRvYy5zY3JvbGxMZWZ0ID0gdmFsO1xuICAgIGFsaWduSG9yaXpvbnRhbGx5KGNtKTtcbiAgICBpZiAoY20uZGlzcGxheS5zY3JvbGxlci5zY3JvbGxMZWZ0ICE9IHZhbCkgeyBjbS5kaXNwbGF5LnNjcm9sbGVyLnNjcm9sbExlZnQgPSB2YWw7IH1cbiAgICBjbS5kaXNwbGF5LnNjcm9sbGJhcnMuc2V0U2Nyb2xsTGVmdCh2YWwpO1xuICB9XG5cbiAgLy8gU0NST0xMQkFSU1xuXG4gIC8vIFByZXBhcmUgRE9NIHJlYWRzIG5lZWRlZCB0byB1cGRhdGUgdGhlIHNjcm9sbGJhcnMuIERvbmUgaW4gb25lXG4gIC8vIHNob3QgdG8gbWluaW1pemUgdXBkYXRlL21lYXN1cmUgcm91bmR0cmlwcy5cbiAgZnVuY3Rpb24gbWVhc3VyZUZvclNjcm9sbGJhcnMoY20pIHtcbiAgICB2YXIgZCA9IGNtLmRpc3BsYXksIGd1dHRlclcgPSBkLmd1dHRlcnMub2Zmc2V0V2lkdGg7XG4gICAgdmFyIGRvY0ggPSBNYXRoLnJvdW5kKGNtLmRvYy5oZWlnaHQgKyBwYWRkaW5nVmVydChjbS5kaXNwbGF5KSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNsaWVudEhlaWdodDogZC5zY3JvbGxlci5jbGllbnRIZWlnaHQsXG4gICAgICB2aWV3SGVpZ2h0OiBkLndyYXBwZXIuY2xpZW50SGVpZ2h0LFxuICAgICAgc2Nyb2xsV2lkdGg6IGQuc2Nyb2xsZXIuc2Nyb2xsV2lkdGgsIGNsaWVudFdpZHRoOiBkLnNjcm9sbGVyLmNsaWVudFdpZHRoLFxuICAgICAgdmlld1dpZHRoOiBkLndyYXBwZXIuY2xpZW50V2lkdGgsXG4gICAgICBiYXJMZWZ0OiBjbS5vcHRpb25zLmZpeGVkR3V0dGVyID8gZ3V0dGVyVyA6IDAsXG4gICAgICBkb2NIZWlnaHQ6IGRvY0gsXG4gICAgICBzY3JvbGxIZWlnaHQ6IGRvY0ggKyBzY3JvbGxHYXAoY20pICsgZC5iYXJIZWlnaHQsXG4gICAgICBuYXRpdmVCYXJXaWR0aDogZC5uYXRpdmVCYXJXaWR0aCxcbiAgICAgIGd1dHRlcldpZHRoOiBndXR0ZXJXXG4gICAgfVxuICB9XG5cbiAgdmFyIE5hdGl2ZVNjcm9sbGJhcnMgPSBmdW5jdGlvbihwbGFjZSwgc2Nyb2xsLCBjbSkge1xuICAgIHRoaXMuY20gPSBjbTtcbiAgICB2YXIgdmVydCA9IHRoaXMudmVydCA9IGVsdChcImRpdlwiLCBbZWx0KFwiZGl2XCIsIG51bGwsIG51bGwsIFwibWluLXdpZHRoOiAxcHhcIildLCBcIkNvZGVNaXJyb3ItdnNjcm9sbGJhclwiKTtcbiAgICB2YXIgaG9yaXogPSB0aGlzLmhvcml6ID0gZWx0KFwiZGl2XCIsIFtlbHQoXCJkaXZcIiwgbnVsbCwgbnVsbCwgXCJoZWlnaHQ6IDEwMCU7IG1pbi1oZWlnaHQ6IDFweFwiKV0sIFwiQ29kZU1pcnJvci1oc2Nyb2xsYmFyXCIpO1xuICAgIHZlcnQudGFiSW5kZXggPSBob3Jpei50YWJJbmRleCA9IC0xO1xuICAgIHBsYWNlKHZlcnQpOyBwbGFjZShob3Jpeik7XG5cbiAgICBvbih2ZXJ0LCBcInNjcm9sbFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAodmVydC5jbGllbnRIZWlnaHQpIHsgc2Nyb2xsKHZlcnQuc2Nyb2xsVG9wLCBcInZlcnRpY2FsXCIpOyB9XG4gICAgfSk7XG4gICAgb24oaG9yaXosIFwic2Nyb2xsXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChob3Jpei5jbGllbnRXaWR0aCkgeyBzY3JvbGwoaG9yaXouc2Nyb2xsTGVmdCwgXCJob3Jpem9udGFsXCIpOyB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmNoZWNrZWRaZXJvV2lkdGggPSBmYWxzZTtcbiAgICAvLyBOZWVkIHRvIHNldCBhIG1pbmltdW0gd2lkdGggdG8gc2VlIHRoZSBzY3JvbGxiYXIgb24gSUU3IChidXQgbXVzdCBub3Qgc2V0IGl0IG9uIElFOCkuXG4gICAgaWYgKGllICYmIGllX3ZlcnNpb24gPCA4KSB7IHRoaXMuaG9yaXouc3R5bGUubWluSGVpZ2h0ID0gdGhpcy52ZXJ0LnN0eWxlLm1pbldpZHRoID0gXCIxOHB4XCI7IH1cbiAgfTtcblxuICBOYXRpdmVTY3JvbGxiYXJzLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAobWVhc3VyZSkge1xuICAgIHZhciBuZWVkc0ggPSBtZWFzdXJlLnNjcm9sbFdpZHRoID4gbWVhc3VyZS5jbGllbnRXaWR0aCArIDE7XG4gICAgdmFyIG5lZWRzViA9IG1lYXN1cmUuc2Nyb2xsSGVpZ2h0ID4gbWVhc3VyZS5jbGllbnRIZWlnaHQgKyAxO1xuICAgIHZhciBzV2lkdGggPSBtZWFzdXJlLm5hdGl2ZUJhcldpZHRoO1xuXG4gICAgaWYgKG5lZWRzVikge1xuICAgICAgdGhpcy52ZXJ0LnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG4gICAgICB0aGlzLnZlcnQuc3R5bGUuYm90dG9tID0gbmVlZHNIID8gc1dpZHRoICsgXCJweFwiIDogXCIwXCI7XG4gICAgICB2YXIgdG90YWxIZWlnaHQgPSBtZWFzdXJlLnZpZXdIZWlnaHQgLSAobmVlZHNIID8gc1dpZHRoIDogMCk7XG4gICAgICAvLyBBIGJ1ZyBpbiBJRTggY2FuIGNhdXNlIHRoaXMgdmFsdWUgdG8gYmUgbmVnYXRpdmUsIHNvIGd1YXJkIGl0LlxuICAgICAgdGhpcy52ZXJ0LmZpcnN0Q2hpbGQuc3R5bGUuaGVpZ2h0ID1cbiAgICAgICAgTWF0aC5tYXgoMCwgbWVhc3VyZS5zY3JvbGxIZWlnaHQgLSBtZWFzdXJlLmNsaWVudEhlaWdodCArIHRvdGFsSGVpZ2h0KSArIFwicHhcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52ZXJ0LnN0eWxlLmRpc3BsYXkgPSBcIlwiO1xuICAgICAgdGhpcy52ZXJ0LmZpcnN0Q2hpbGQuc3R5bGUuaGVpZ2h0ID0gXCIwXCI7XG4gICAgfVxuXG4gICAgaWYgKG5lZWRzSCkge1xuICAgICAgdGhpcy5ob3Jpei5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuICAgICAgdGhpcy5ob3Jpei5zdHlsZS5yaWdodCA9IG5lZWRzViA/IHNXaWR0aCArIFwicHhcIiA6IFwiMFwiO1xuICAgICAgdGhpcy5ob3Jpei5zdHlsZS5sZWZ0ID0gbWVhc3VyZS5iYXJMZWZ0ICsgXCJweFwiO1xuICAgICAgdmFyIHRvdGFsV2lkdGggPSBtZWFzdXJlLnZpZXdXaWR0aCAtIG1lYXN1cmUuYmFyTGVmdCAtIChuZWVkc1YgPyBzV2lkdGggOiAwKTtcbiAgICAgIHRoaXMuaG9yaXouZmlyc3RDaGlsZC5zdHlsZS53aWR0aCA9XG4gICAgICAgIE1hdGgubWF4KDAsIG1lYXN1cmUuc2Nyb2xsV2lkdGggLSBtZWFzdXJlLmNsaWVudFdpZHRoICsgdG90YWxXaWR0aCkgKyBcInB4XCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaG9yaXouc3R5bGUuZGlzcGxheSA9IFwiXCI7XG4gICAgICB0aGlzLmhvcml6LmZpcnN0Q2hpbGQuc3R5bGUud2lkdGggPSBcIjBcIjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuY2hlY2tlZFplcm9XaWR0aCAmJiBtZWFzdXJlLmNsaWVudEhlaWdodCA+IDApIHtcbiAgICAgIGlmIChzV2lkdGggPT0gMCkgeyB0aGlzLnplcm9XaWR0aEhhY2soKTsgfVxuICAgICAgdGhpcy5jaGVja2VkWmVyb1dpZHRoID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4ge3JpZ2h0OiBuZWVkc1YgPyBzV2lkdGggOiAwLCBib3R0b206IG5lZWRzSCA/IHNXaWR0aCA6IDB9XG4gIH07XG5cbiAgTmF0aXZlU2Nyb2xsYmFycy5wcm90b3R5cGUuc2V0U2Nyb2xsTGVmdCA9IGZ1bmN0aW9uIChwb3MpIHtcbiAgICBpZiAodGhpcy5ob3Jpei5zY3JvbGxMZWZ0ICE9IHBvcykgeyB0aGlzLmhvcml6LnNjcm9sbExlZnQgPSBwb3M7IH1cbiAgICBpZiAodGhpcy5kaXNhYmxlSG9yaXopIHsgdGhpcy5lbmFibGVaZXJvV2lkdGhCYXIodGhpcy5ob3JpeiwgdGhpcy5kaXNhYmxlSG9yaXosIFwiaG9yaXpcIik7IH1cbiAgfTtcblxuICBOYXRpdmVTY3JvbGxiYXJzLnByb3RvdHlwZS5zZXRTY3JvbGxUb3AgPSBmdW5jdGlvbiAocG9zKSB7XG4gICAgaWYgKHRoaXMudmVydC5zY3JvbGxUb3AgIT0gcG9zKSB7IHRoaXMudmVydC5zY3JvbGxUb3AgPSBwb3M7IH1cbiAgICBpZiAodGhpcy5kaXNhYmxlVmVydCkgeyB0aGlzLmVuYWJsZVplcm9XaWR0aEJhcih0aGlzLnZlcnQsIHRoaXMuZGlzYWJsZVZlcnQsIFwidmVydFwiKTsgfVxuICB9O1xuXG4gIE5hdGl2ZVNjcm9sbGJhcnMucHJvdG90eXBlLnplcm9XaWR0aEhhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHcgPSBtYWMgJiYgIW1hY19nZU1vdW50YWluTGlvbiA/IFwiMTJweFwiIDogXCIxOHB4XCI7XG4gICAgdGhpcy5ob3Jpei5zdHlsZS5oZWlnaHQgPSB0aGlzLnZlcnQuc3R5bGUud2lkdGggPSB3O1xuICAgIHRoaXMuaG9yaXouc3R5bGUucG9pbnRlckV2ZW50cyA9IHRoaXMudmVydC5zdHlsZS5wb2ludGVyRXZlbnRzID0gXCJub25lXCI7XG4gICAgdGhpcy5kaXNhYmxlSG9yaXogPSBuZXcgRGVsYXllZDtcbiAgICB0aGlzLmRpc2FibGVWZXJ0ID0gbmV3IERlbGF5ZWQ7XG4gIH07XG5cbiAgTmF0aXZlU2Nyb2xsYmFycy5wcm90b3R5cGUuZW5hYmxlWmVyb1dpZHRoQmFyID0gZnVuY3Rpb24gKGJhciwgZGVsYXksIHR5cGUpIHtcbiAgICBiYXIuc3R5bGUucG9pbnRlckV2ZW50cyA9IFwiYXV0b1wiO1xuICAgIGZ1bmN0aW9uIG1heWJlRGlzYWJsZSgpIHtcbiAgICAgIC8vIFRvIGZpbmQgb3V0IHdoZXRoZXIgdGhlIHNjcm9sbGJhciBpcyBzdGlsbCB2aXNpYmxlLCB3ZVxuICAgICAgLy8gY2hlY2sgd2hldGhlciB0aGUgZWxlbWVudCB1bmRlciB0aGUgcGl4ZWwgaW4gdGhlIGJvdHRvbVxuICAgICAgLy8gcmlnaHQgY29ybmVyIG9mIHRoZSBzY3JvbGxiYXIgYm94IGlzIHRoZSBzY3JvbGxiYXIgYm94XG4gICAgICAvLyBpdHNlbGYgKHdoZW4gdGhlIGJhciBpcyBzdGlsbCB2aXNpYmxlKSBvciBpdHMgZmlsbGVyIGNoaWxkXG4gICAgICAvLyAod2hlbiB0aGUgYmFyIGlzIGhpZGRlbikuIElmIGl0IGlzIHN0aWxsIHZpc2libGUsIHdlIGtlZXBcbiAgICAgIC8vIGl0IGVuYWJsZWQsIGlmIGl0J3MgaGlkZGVuLCB3ZSBkaXNhYmxlIHBvaW50ZXIgZXZlbnRzLlxuICAgICAgdmFyIGJveCA9IGJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHZhciBlbHQgPSB0eXBlID09IFwidmVydFwiID8gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChib3gucmlnaHQgLSAxLCAoYm94LnRvcCArIGJveC5ib3R0b20pIC8gMilcbiAgICAgICAgICA6IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoKGJveC5yaWdodCArIGJveC5sZWZ0KSAvIDIsIGJveC5ib3R0b20gLSAxKTtcbiAgICAgIGlmIChlbHQgIT0gYmFyKSB7IGJhci5zdHlsZS5wb2ludGVyRXZlbnRzID0gXCJub25lXCI7IH1cbiAgICAgIGVsc2UgeyBkZWxheS5zZXQoMTAwMCwgbWF5YmVEaXNhYmxlKTsgfVxuICAgIH1cbiAgICBkZWxheS5zZXQoMTAwMCwgbWF5YmVEaXNhYmxlKTtcbiAgfTtcblxuICBOYXRpdmVTY3JvbGxiYXJzLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcGFyZW50ID0gdGhpcy5ob3Jpei5wYXJlbnROb2RlO1xuICAgIHBhcmVudC5yZW1vdmVDaGlsZCh0aGlzLmhvcml6KTtcbiAgICBwYXJlbnQucmVtb3ZlQ2hpbGQodGhpcy52ZXJ0KTtcbiAgfTtcblxuICB2YXIgTnVsbFNjcm9sbGJhcnMgPSBmdW5jdGlvbiAoKSB7fTtcblxuICBOdWxsU2Nyb2xsYmFycy5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4ge2JvdHRvbTogMCwgcmlnaHQ6IDB9IH07XG4gIE51bGxTY3JvbGxiYXJzLnByb3RvdHlwZS5zZXRTY3JvbGxMZWZ0ID0gZnVuY3Rpb24gKCkge307XG4gIE51bGxTY3JvbGxiYXJzLnByb3RvdHlwZS5zZXRTY3JvbGxUb3AgPSBmdW5jdGlvbiAoKSB7fTtcbiAgTnVsbFNjcm9sbGJhcnMucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge307XG5cbiAgZnVuY3Rpb24gdXBkYXRlU2Nyb2xsYmFycyhjbSwgbWVhc3VyZSkge1xuICAgIGlmICghbWVhc3VyZSkgeyBtZWFzdXJlID0gbWVhc3VyZUZvclNjcm9sbGJhcnMoY20pOyB9XG4gICAgdmFyIHN0YXJ0V2lkdGggPSBjbS5kaXNwbGF5LmJhcldpZHRoLCBzdGFydEhlaWdodCA9IGNtLmRpc3BsYXkuYmFySGVpZ2h0O1xuICAgIHVwZGF0ZVNjcm9sbGJhcnNJbm5lcihjbSwgbWVhc3VyZSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCA0ICYmIHN0YXJ0V2lkdGggIT0gY20uZGlzcGxheS5iYXJXaWR0aCB8fCBzdGFydEhlaWdodCAhPSBjbS5kaXNwbGF5LmJhckhlaWdodDsgaSsrKSB7XG4gICAgICBpZiAoc3RhcnRXaWR0aCAhPSBjbS5kaXNwbGF5LmJhcldpZHRoICYmIGNtLm9wdGlvbnMubGluZVdyYXBwaW5nKVxuICAgICAgICB7IHVwZGF0ZUhlaWdodHNJblZpZXdwb3J0KGNtKTsgfVxuICAgICAgdXBkYXRlU2Nyb2xsYmFyc0lubmVyKGNtLCBtZWFzdXJlRm9yU2Nyb2xsYmFycyhjbSkpO1xuICAgICAgc3RhcnRXaWR0aCA9IGNtLmRpc3BsYXkuYmFyV2lkdGg7IHN0YXJ0SGVpZ2h0ID0gY20uZGlzcGxheS5iYXJIZWlnaHQ7XG4gICAgfVxuICB9XG5cbiAgLy8gUmUtc3luY2hyb25pemUgdGhlIGZha2Ugc2Nyb2xsYmFycyB3aXRoIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGVcbiAgLy8gY29udGVudC5cbiAgZnVuY3Rpb24gdXBkYXRlU2Nyb2xsYmFyc0lubmVyKGNtLCBtZWFzdXJlKSB7XG4gICAgdmFyIGQgPSBjbS5kaXNwbGF5O1xuICAgIHZhciBzaXplcyA9IGQuc2Nyb2xsYmFycy51cGRhdGUobWVhc3VyZSk7XG5cbiAgICBkLnNpemVyLnN0eWxlLnBhZGRpbmdSaWdodCA9IChkLmJhcldpZHRoID0gc2l6ZXMucmlnaHQpICsgXCJweFwiO1xuICAgIGQuc2l6ZXIuc3R5bGUucGFkZGluZ0JvdHRvbSA9IChkLmJhckhlaWdodCA9IHNpemVzLmJvdHRvbSkgKyBcInB4XCI7XG4gICAgZC5oZWlnaHRGb3JjZXIuc3R5bGUuYm9yZGVyQm90dG9tID0gc2l6ZXMuYm90dG9tICsgXCJweCBzb2xpZCB0cmFuc3BhcmVudFwiO1xuXG4gICAgaWYgKHNpemVzLnJpZ2h0ICYmIHNpemVzLmJvdHRvbSkge1xuICAgICAgZC5zY3JvbGxiYXJGaWxsZXIuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcbiAgICAgIGQuc2Nyb2xsYmFyRmlsbGVyLnN0eWxlLmhlaWdodCA9IHNpemVzLmJvdHRvbSArIFwicHhcIjtcbiAgICAgIGQuc2Nyb2xsYmFyRmlsbGVyLnN0eWxlLndpZHRoID0gc2l6ZXMucmlnaHQgKyBcInB4XCI7XG4gICAgfSBlbHNlIHsgZC5zY3JvbGxiYXJGaWxsZXIuc3R5bGUuZGlzcGxheSA9IFwiXCI7IH1cbiAgICBpZiAoc2l6ZXMuYm90dG9tICYmIGNtLm9wdGlvbnMuY292ZXJHdXR0ZXJOZXh0VG9TY3JvbGxiYXIgJiYgY20ub3B0aW9ucy5maXhlZEd1dHRlcikge1xuICAgICAgZC5ndXR0ZXJGaWxsZXIuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcbiAgICAgIGQuZ3V0dGVyRmlsbGVyLnN0eWxlLmhlaWdodCA9IHNpemVzLmJvdHRvbSArIFwicHhcIjtcbiAgICAgIGQuZ3V0dGVyRmlsbGVyLnN0eWxlLndpZHRoID0gbWVhc3VyZS5ndXR0ZXJXaWR0aCArIFwicHhcIjtcbiAgICB9IGVsc2UgeyBkLmd1dHRlckZpbGxlci5zdHlsZS5kaXNwbGF5ID0gXCJcIjsgfVxuICB9XG5cbiAgdmFyIHNjcm9sbGJhck1vZGVsID0ge1wibmF0aXZlXCI6IE5hdGl2ZVNjcm9sbGJhcnMsIFwibnVsbFwiOiBOdWxsU2Nyb2xsYmFyc307XG5cbiAgZnVuY3Rpb24gaW5pdFNjcm9sbGJhcnMoY20pIHtcbiAgICBpZiAoY20uZGlzcGxheS5zY3JvbGxiYXJzKSB7XG4gICAgICBjbS5kaXNwbGF5LnNjcm9sbGJhcnMuY2xlYXIoKTtcbiAgICAgIGlmIChjbS5kaXNwbGF5LnNjcm9sbGJhcnMuYWRkQ2xhc3MpXG4gICAgICAgIHsgcm1DbGFzcyhjbS5kaXNwbGF5LndyYXBwZXIsIGNtLmRpc3BsYXkuc2Nyb2xsYmFycy5hZGRDbGFzcyk7IH1cbiAgICB9XG5cbiAgICBjbS5kaXNwbGF5LnNjcm9sbGJhcnMgPSBuZXcgc2Nyb2xsYmFyTW9kZWxbY20ub3B0aW9ucy5zY3JvbGxiYXJTdHlsZV0oZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIGNtLmRpc3BsYXkud3JhcHBlci5pbnNlcnRCZWZvcmUobm9kZSwgY20uZGlzcGxheS5zY3JvbGxiYXJGaWxsZXIpO1xuICAgICAgLy8gUHJldmVudCBjbGlja3MgaW4gdGhlIHNjcm9sbGJhcnMgZnJvbSBraWxsaW5nIGZvY3VzXG4gICAgICBvbihub2RlLCBcIm1vdXNlZG93blwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChjbS5zdGF0ZS5mb2N1c2VkKSB7IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyByZXR1cm4gY20uZGlzcGxheS5pbnB1dC5mb2N1cygpOyB9LCAwKTsgfVxuICAgICAgfSk7XG4gICAgICBub2RlLnNldEF0dHJpYnV0ZShcImNtLW5vdC1jb250ZW50XCIsIFwidHJ1ZVwiKTtcbiAgICB9LCBmdW5jdGlvbiAocG9zLCBheGlzKSB7XG4gICAgICBpZiAoYXhpcyA9PSBcImhvcml6b250YWxcIikgeyBzZXRTY3JvbGxMZWZ0KGNtLCBwb3MpOyB9XG4gICAgICBlbHNlIHsgdXBkYXRlU2Nyb2xsVG9wKGNtLCBwb3MpOyB9XG4gICAgfSwgY20pO1xuICAgIGlmIChjbS5kaXNwbGF5LnNjcm9sbGJhcnMuYWRkQ2xhc3MpXG4gICAgICB7IGFkZENsYXNzKGNtLmRpc3BsYXkud3JhcHBlciwgY20uZGlzcGxheS5zY3JvbGxiYXJzLmFkZENsYXNzKTsgfVxuICB9XG5cbiAgLy8gT3BlcmF0aW9ucyBhcmUgdXNlZCB0byB3cmFwIGEgc2VyaWVzIG9mIGNoYW5nZXMgdG8gdGhlIGVkaXRvclxuICAvLyBzdGF0ZSBpbiBzdWNoIGEgd2F5IHRoYXQgZWFjaCBjaGFuZ2Ugd29uJ3QgaGF2ZSB0byB1cGRhdGUgdGhlXG4gIC8vIGN1cnNvciBhbmQgZGlzcGxheSAod2hpY2ggd291bGQgYmUgYXdrd2FyZCwgc2xvdywgYW5kXG4gIC8vIGVycm9yLXByb25lKS4gSW5zdGVhZCwgZGlzcGxheSB1cGRhdGVzIGFyZSBiYXRjaGVkIGFuZCB0aGVuIGFsbFxuICAvLyBjb21iaW5lZCBhbmQgZXhlY3V0ZWQgYXQgb25jZS5cblxuICB2YXIgbmV4dE9wSWQgPSAwO1xuICAvLyBTdGFydCBhIG5ldyBvcGVyYXRpb24uXG4gIGZ1bmN0aW9uIHN0YXJ0T3BlcmF0aW9uKGNtKSB7XG4gICAgY20uY3VyT3AgPSB7XG4gICAgICBjbTogY20sXG4gICAgICB2aWV3Q2hhbmdlZDogZmFsc2UsICAgICAgLy8gRmxhZyB0aGF0IGluZGljYXRlcyB0aGF0IGxpbmVzIG1pZ2h0IG5lZWQgdG8gYmUgcmVkcmF3blxuICAgICAgc3RhcnRIZWlnaHQ6IGNtLmRvYy5oZWlnaHQsIC8vIFVzZWQgdG8gZGV0ZWN0IG5lZWQgdG8gdXBkYXRlIHNjcm9sbGJhclxuICAgICAgZm9yY2VVcGRhdGU6IGZhbHNlLCAgICAgIC8vIFVzZWQgdG8gZm9yY2UgYSByZWRyYXdcbiAgICAgIHVwZGF0ZUlucHV0OiAwLCAgICAgICAvLyBXaGV0aGVyIHRvIHJlc2V0IHRoZSBpbnB1dCB0ZXh0YXJlYVxuICAgICAgdHlwaW5nOiBmYWxzZSwgICAgICAgICAgIC8vIFdoZXRoZXIgdGhpcyByZXNldCBzaG91bGQgYmUgY2FyZWZ1bCB0byBsZWF2ZSBleGlzdGluZyB0ZXh0IChmb3IgY29tcG9zaXRpbmcpXG4gICAgICBjaGFuZ2VPYmpzOiBudWxsLCAgICAgICAgLy8gQWNjdW11bGF0ZWQgY2hhbmdlcywgZm9yIGZpcmluZyBjaGFuZ2UgZXZlbnRzXG4gICAgICBjdXJzb3JBY3Rpdml0eUhhbmRsZXJzOiBudWxsLCAvLyBTZXQgb2YgaGFuZGxlcnMgdG8gZmlyZSBjdXJzb3JBY3Rpdml0eSBvblxuICAgICAgY3Vyc29yQWN0aXZpdHlDYWxsZWQ6IDAsIC8vIFRyYWNrcyB3aGljaCBjdXJzb3JBY3Rpdml0eSBoYW5kbGVycyBoYXZlIGJlZW4gY2FsbGVkIGFscmVhZHlcbiAgICAgIHNlbGVjdGlvbkNoYW5nZWQ6IGZhbHNlLCAvLyBXaGV0aGVyIHRoZSBzZWxlY3Rpb24gbmVlZHMgdG8gYmUgcmVkcmF3blxuICAgICAgdXBkYXRlTWF4TGluZTogZmFsc2UsICAgIC8vIFNldCB3aGVuIHRoZSB3aWRlc3QgbGluZSBuZWVkcyB0byBiZSBkZXRlcm1pbmVkIGFuZXdcbiAgICAgIHNjcm9sbExlZnQ6IG51bGwsIHNjcm9sbFRvcDogbnVsbCwgLy8gSW50ZXJtZWRpYXRlIHNjcm9sbCBwb3NpdGlvbiwgbm90IHB1c2hlZCB0byBET00geWV0XG4gICAgICBzY3JvbGxUb1BvczogbnVsbCwgICAgICAgLy8gVXNlZCB0byBzY3JvbGwgdG8gYSBzcGVjaWZpYyBwb3NpdGlvblxuICAgICAgZm9jdXM6IGZhbHNlLFxuICAgICAgaWQ6ICsrbmV4dE9wSWQgICAgICAgICAgIC8vIFVuaXF1ZSBJRFxuICAgIH07XG4gICAgcHVzaE9wZXJhdGlvbihjbS5jdXJPcCk7XG4gIH1cblxuICAvLyBGaW5pc2ggYW4gb3BlcmF0aW9uLCB1cGRhdGluZyB0aGUgZGlzcGxheSBhbmQgc2lnbmFsbGluZyBkZWxheWVkIGV2ZW50c1xuICBmdW5jdGlvbiBlbmRPcGVyYXRpb24oY20pIHtcbiAgICB2YXIgb3AgPSBjbS5jdXJPcDtcbiAgICBpZiAob3ApIHsgZmluaXNoT3BlcmF0aW9uKG9wLCBmdW5jdGlvbiAoZ3JvdXApIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ3JvdXAub3BzLmxlbmd0aDsgaSsrKVxuICAgICAgICB7IGdyb3VwLm9wc1tpXS5jbS5jdXJPcCA9IG51bGw7IH1cbiAgICAgIGVuZE9wZXJhdGlvbnMoZ3JvdXApO1xuICAgIH0pOyB9XG4gIH1cblxuICAvLyBUaGUgRE9NIHVwZGF0ZXMgZG9uZSB3aGVuIGFuIG9wZXJhdGlvbiBmaW5pc2hlcyBhcmUgYmF0Y2hlZCBzb1xuICAvLyB0aGF0IHRoZSBtaW5pbXVtIG51bWJlciBvZiByZWxheW91dHMgYXJlIHJlcXVpcmVkLlxuICBmdW5jdGlvbiBlbmRPcGVyYXRpb25zKGdyb3VwKSB7XG4gICAgdmFyIG9wcyA9IGdyb3VwLm9wcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9wcy5sZW5ndGg7IGkrKykgLy8gUmVhZCBET01cbiAgICAgIHsgZW5kT3BlcmF0aW9uX1IxKG9wc1tpXSk7IH1cbiAgICBmb3IgKHZhciBpJDEgPSAwOyBpJDEgPCBvcHMubGVuZ3RoOyBpJDErKykgLy8gV3JpdGUgRE9NIChtYXliZSlcbiAgICAgIHsgZW5kT3BlcmF0aW9uX1cxKG9wc1tpJDFdKTsgfVxuICAgIGZvciAodmFyIGkkMiA9IDA7IGkkMiA8IG9wcy5sZW5ndGg7IGkkMisrKSAvLyBSZWFkIERPTVxuICAgICAgeyBlbmRPcGVyYXRpb25fUjIob3BzW2kkMl0pOyB9XG4gICAgZm9yICh2YXIgaSQzID0gMDsgaSQzIDwgb3BzLmxlbmd0aDsgaSQzKyspIC8vIFdyaXRlIERPTSAobWF5YmUpXG4gICAgICB7IGVuZE9wZXJhdGlvbl9XMihvcHNbaSQzXSk7IH1cbiAgICBmb3IgKHZhciBpJDQgPSAwOyBpJDQgPCBvcHMubGVuZ3RoOyBpJDQrKykgLy8gUmVhZCBET01cbiAgICAgIHsgZW5kT3BlcmF0aW9uX2ZpbmlzaChvcHNbaSQ0XSk7IH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGVuZE9wZXJhdGlvbl9SMShvcCkge1xuICAgIHZhciBjbSA9IG9wLmNtLCBkaXNwbGF5ID0gY20uZGlzcGxheTtcbiAgICBtYXliZUNsaXBTY3JvbGxiYXJzKGNtKTtcbiAgICBpZiAob3AudXBkYXRlTWF4TGluZSkgeyBmaW5kTWF4TGluZShjbSk7IH1cblxuICAgIG9wLm11c3RVcGRhdGUgPSBvcC52aWV3Q2hhbmdlZCB8fCBvcC5mb3JjZVVwZGF0ZSB8fCBvcC5zY3JvbGxUb3AgIT0gbnVsbCB8fFxuICAgICAgb3Auc2Nyb2xsVG9Qb3MgJiYgKG9wLnNjcm9sbFRvUG9zLmZyb20ubGluZSA8IGRpc3BsYXkudmlld0Zyb20gfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICBvcC5zY3JvbGxUb1Bvcy50by5saW5lID49IGRpc3BsYXkudmlld1RvKSB8fFxuICAgICAgZGlzcGxheS5tYXhMaW5lQ2hhbmdlZCAmJiBjbS5vcHRpb25zLmxpbmVXcmFwcGluZztcbiAgICBvcC51cGRhdGUgPSBvcC5tdXN0VXBkYXRlICYmXG4gICAgICBuZXcgRGlzcGxheVVwZGF0ZShjbSwgb3AubXVzdFVwZGF0ZSAmJiB7dG9wOiBvcC5zY3JvbGxUb3AsIGVuc3VyZTogb3Auc2Nyb2xsVG9Qb3N9LCBvcC5mb3JjZVVwZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBlbmRPcGVyYXRpb25fVzEob3ApIHtcbiAgICBvcC51cGRhdGVkRGlzcGxheSA9IG9wLm11c3RVcGRhdGUgJiYgdXBkYXRlRGlzcGxheUlmTmVlZGVkKG9wLmNtLCBvcC51cGRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gZW5kT3BlcmF0aW9uX1IyKG9wKSB7XG4gICAgdmFyIGNtID0gb3AuY20sIGRpc3BsYXkgPSBjbS5kaXNwbGF5O1xuICAgIGlmIChvcC51cGRhdGVkRGlzcGxheSkgeyB1cGRhdGVIZWlnaHRzSW5WaWV3cG9ydChjbSk7IH1cblxuICAgIG9wLmJhck1lYXN1cmUgPSBtZWFzdXJlRm9yU2Nyb2xsYmFycyhjbSk7XG5cbiAgICAvLyBJZiB0aGUgbWF4IGxpbmUgY2hhbmdlZCBzaW5jZSBpdCB3YXMgbGFzdCBtZWFzdXJlZCwgbWVhc3VyZSBpdCxcbiAgICAvLyBhbmQgZW5zdXJlIHRoZSBkb2N1bWVudCdzIHdpZHRoIG1hdGNoZXMgaXQuXG4gICAgLy8gdXBkYXRlRGlzcGxheV9XMiB3aWxsIHVzZSB0aGVzZSBwcm9wZXJ0aWVzIHRvIGRvIHRoZSBhY3R1YWwgcmVzaXppbmdcbiAgICBpZiAoZGlzcGxheS5tYXhMaW5lQ2hhbmdlZCAmJiAhY20ub3B0aW9ucy5saW5lV3JhcHBpbmcpIHtcbiAgICAgIG9wLmFkanVzdFdpZHRoVG8gPSBtZWFzdXJlQ2hhcihjbSwgZGlzcGxheS5tYXhMaW5lLCBkaXNwbGF5Lm1heExpbmUudGV4dC5sZW5ndGgpLmxlZnQgKyAzO1xuICAgICAgY20uZGlzcGxheS5zaXplcldpZHRoID0gb3AuYWRqdXN0V2lkdGhUbztcbiAgICAgIG9wLmJhck1lYXN1cmUuc2Nyb2xsV2lkdGggPVxuICAgICAgICBNYXRoLm1heChkaXNwbGF5LnNjcm9sbGVyLmNsaWVudFdpZHRoLCBkaXNwbGF5LnNpemVyLm9mZnNldExlZnQgKyBvcC5hZGp1c3RXaWR0aFRvICsgc2Nyb2xsR2FwKGNtKSArIGNtLmRpc3BsYXkuYmFyV2lkdGgpO1xuICAgICAgb3AubWF4U2Nyb2xsTGVmdCA9IE1hdGgubWF4KDAsIGRpc3BsYXkuc2l6ZXIub2Zmc2V0TGVmdCArIG9wLmFkanVzdFdpZHRoVG8gLSBkaXNwbGF5V2lkdGgoY20pKTtcbiAgICB9XG5cbiAgICBpZiAob3AudXBkYXRlZERpc3BsYXkgfHwgb3Auc2VsZWN0aW9uQ2hhbmdlZClcbiAgICAgIHsgb3AucHJlcGFyZWRTZWxlY3Rpb24gPSBkaXNwbGF5LmlucHV0LnByZXBhcmVTZWxlY3Rpb24oKTsgfVxuICB9XG5cbiAgZnVuY3Rpb24gZW5kT3BlcmF0aW9uX1cyKG9wKSB7XG4gICAgdmFyIGNtID0gb3AuY207XG5cbiAgICBpZiAob3AuYWRqdXN0V2lkdGhUbyAhPSBudWxsKSB7XG4gICAgICBjbS5kaXNwbGF5LnNpemVyLnN0eWxlLm1pbldpZHRoID0gb3AuYWRqdXN0V2lkdGhUbyArIFwicHhcIjtcbiAgICAgIGlmIChvcC5tYXhTY3JvbGxMZWZ0IDwgY20uZG9jLnNjcm9sbExlZnQpXG4gICAgICAgIHsgc2V0U2Nyb2xsTGVmdChjbSwgTWF0aC5taW4oY20uZGlzcGxheS5zY3JvbGxlci5zY3JvbGxMZWZ0LCBvcC5tYXhTY3JvbGxMZWZ0KSwgdHJ1ZSk7IH1cbiAgICAgIGNtLmRpc3BsYXkubWF4TGluZUNoYW5nZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgdGFrZUZvY3VzID0gb3AuZm9jdXMgJiYgb3AuZm9jdXMgPT0gYWN0aXZlRWx0KCk7XG4gICAgaWYgKG9wLnByZXBhcmVkU2VsZWN0aW9uKVxuICAgICAgeyBjbS5kaXNwbGF5LmlucHV0LnNob3dTZWxlY3Rpb24ob3AucHJlcGFyZWRTZWxlY3Rpb24sIHRha2VGb2N1cyk7IH1cbiAgICBpZiAob3AudXBkYXRlZERpc3BsYXkgfHwgb3Auc3RhcnRIZWlnaHQgIT0gY20uZG9jLmhlaWdodClcbiAgICAgIHsgdXBkYXRlU2Nyb2xsYmFycyhjbSwgb3AuYmFyTWVhc3VyZSk7IH1cbiAgICBpZiAob3AudXBkYXRlZERpc3BsYXkpXG4gICAgICB7IHNldERvY3VtZW50SGVpZ2h0KGNtLCBvcC5iYXJNZWFzdXJlKTsgfVxuXG4gICAgaWYgKG9wLnNlbGVjdGlvbkNoYW5nZWQpIHsgcmVzdGFydEJsaW5rKGNtKTsgfVxuXG4gICAgaWYgKGNtLnN0YXRlLmZvY3VzZWQgJiYgb3AudXBkYXRlSW5wdXQpXG4gICAgICB7IGNtLmRpc3BsYXkuaW5wdXQucmVzZXQob3AudHlwaW5nKTsgfVxuICAgIGlmICh0YWtlRm9jdXMpIHsgZW5zdXJlRm9jdXMob3AuY20pOyB9XG4gIH1cblxuICBmdW5jdGlvbiBlbmRPcGVyYXRpb25fZmluaXNoKG9wKSB7XG4gICAgdmFyIGNtID0gb3AuY20sIGRpc3BsYXkgPSBjbS5kaXNwbGF5LCBkb2MgPSBjbS5kb2M7XG5cbiAgICBpZiAob3AudXBkYXRlZERpc3BsYXkpIHsgcG9zdFVwZGF0ZURpc3BsYXkoY20sIG9wLnVwZGF0ZSk7IH1cblxuICAgIC8vIEFib3J0IG1vdXNlIHdoZWVsIGRlbHRhIG1lYXN1cmVtZW50LCB3aGVuIHNjcm9sbGluZyBleHBsaWNpdGx5XG4gICAgaWYgKGRpc3BsYXkud2hlZWxTdGFydFggIT0gbnVsbCAmJiAob3Auc2Nyb2xsVG9wICE9IG51bGwgfHwgb3Auc2Nyb2xsTGVmdCAhPSBudWxsIHx8IG9wLnNjcm9sbFRvUG9zKSlcbiAgICAgIHsgZGlzcGxheS53aGVlbFN0YXJ0WCA9IGRpc3BsYXkud2hlZWxTdGFydFkgPSBudWxsOyB9XG5cbiAgICAvLyBQcm9wYWdhdGUgdGhlIHNjcm9sbCBwb3NpdGlvbiB0byB0aGUgYWN0dWFsIERPTSBzY3JvbGxlclxuICAgIGlmIChvcC5zY3JvbGxUb3AgIT0gbnVsbCkgeyBzZXRTY3JvbGxUb3AoY20sIG9wLnNjcm9sbFRvcCwgb3AuZm9yY2VTY3JvbGwpOyB9XG5cbiAgICBpZiAob3Auc2Nyb2xsTGVmdCAhPSBudWxsKSB7IHNldFNjcm9sbExlZnQoY20sIG9wLnNjcm9sbExlZnQsIHRydWUsIHRydWUpOyB9XG4gICAgLy8gSWYgd2UgbmVlZCB0byBzY3JvbGwgYSBzcGVjaWZpYyBwb3NpdGlvbiBpbnRvIHZpZXcsIGRvIHNvLlxuICAgIGlmIChvcC5zY3JvbGxUb1Bvcykge1xuICAgICAgdmFyIHJlY3QgPSBzY3JvbGxQb3NJbnRvVmlldyhjbSwgY2xpcFBvcyhkb2MsIG9wLnNjcm9sbFRvUG9zLmZyb20pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwUG9zKGRvYywgb3Auc2Nyb2xsVG9Qb3MudG8pLCBvcC5zY3JvbGxUb1Bvcy5tYXJnaW4pO1xuICAgICAgbWF5YmVTY3JvbGxXaW5kb3coY20sIHJlY3QpO1xuICAgIH1cblxuICAgIC8vIEZpcmUgZXZlbnRzIGZvciBtYXJrZXJzIHRoYXQgYXJlIGhpZGRlbi91bmlkZGVuIGJ5IGVkaXRpbmcgb3JcbiAgICAvLyB1bmRvaW5nXG4gICAgdmFyIGhpZGRlbiA9IG9wLm1heWJlSGlkZGVuTWFya2VycywgdW5oaWRkZW4gPSBvcC5tYXliZVVuaGlkZGVuTWFya2VycztcbiAgICBpZiAoaGlkZGVuKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgaGlkZGVuLmxlbmd0aDsgKytpKVxuICAgICAgeyBpZiAoIWhpZGRlbltpXS5saW5lcy5sZW5ndGgpIHsgc2lnbmFsKGhpZGRlbltpXSwgXCJoaWRlXCIpOyB9IH0gfVxuICAgIGlmICh1bmhpZGRlbikgeyBmb3IgKHZhciBpJDEgPSAwOyBpJDEgPCB1bmhpZGRlbi5sZW5ndGg7ICsraSQxKVxuICAgICAgeyBpZiAodW5oaWRkZW5baSQxXS5saW5lcy5sZW5ndGgpIHsgc2lnbmFsKHVuaGlkZGVuW2kkMV0sIFwidW5oaWRlXCIpOyB9IH0gfVxuXG4gICAgaWYgKGRpc3BsYXkud3JhcHBlci5vZmZzZXRIZWlnaHQpXG4gICAgICB7IGRvYy5zY3JvbGxUb3AgPSBjbS5kaXNwbGF5LnNjcm9sbGVyLnNjcm9sbFRvcDsgfVxuXG4gICAgLy8gRmlyZSBjaGFuZ2UgZXZlbnRzLCBhbmQgZGVsYXllZCBldmVudCBoYW5kbGVyc1xuICAgIGlmIChvcC5jaGFuZ2VPYmpzKVxuICAgICAgeyBzaWduYWwoY20sIFwiY2hhbmdlc1wiLCBjbSwgb3AuY2hhbmdlT2Jqcyk7IH1cbiAgICBpZiAob3AudXBkYXRlKVxuICAgICAgeyBvcC51cGRhdGUuZmluaXNoKCk7IH1cbiAgfVxuXG4gIC8vIFJ1biB0aGUgZ2l2ZW4gZnVuY3Rpb24gaW4gYW4gb3BlcmF0aW9uXG4gIGZ1bmN0aW9uIHJ1bkluT3AoY20sIGYpIHtcbiAgICBpZiAoY20uY3VyT3ApIHsgcmV0dXJuIGYoKSB9XG4gICAgc3RhcnRPcGVyYXRpb24oY20pO1xuICAgIHRyeSB7IHJldHVybiBmKCkgfVxuICAgIGZpbmFsbHkgeyBlbmRPcGVyYXRpb24oY20pOyB9XG4gIH1cbiAgLy8gV3JhcHMgYSBmdW5jdGlvbiBpbiBhbiBvcGVyYXRpb24uIFJldHVybnMgdGhlIHdyYXBwZWQgZnVuY3Rpb24uXG4gIGZ1bmN0aW9uIG9wZXJhdGlvbihjbSwgZikge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIGlmIChjbS5jdXJPcCkgeyByZXR1cm4gZi5hcHBseShjbSwgYXJndW1lbnRzKSB9XG4gICAgICBzdGFydE9wZXJhdGlvbihjbSk7XG4gICAgICB0cnkgeyByZXR1cm4gZi5hcHBseShjbSwgYXJndW1lbnRzKSB9XG4gICAgICBmaW5hbGx5IHsgZW5kT3BlcmF0aW9uKGNtKTsgfVxuICAgIH1cbiAgfVxuICAvLyBVc2VkIHRvIGFkZCBtZXRob2RzIHRvIGVkaXRvciBhbmQgZG9jIGluc3RhbmNlcywgd3JhcHBpbmcgdGhlbSBpblxuICAvLyBvcGVyYXRpb25zLlxuICBmdW5jdGlvbiBtZXRob2RPcChmKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHRoaXMuY3VyT3ApIHsgcmV0dXJuIGYuYXBwbHkodGhpcywgYXJndW1lbnRzKSB9XG4gICAgICBzdGFydE9wZXJhdGlvbih0aGlzKTtcbiAgICAgIHRyeSB7IHJldHVybiBmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfVxuICAgICAgZmluYWxseSB7IGVuZE9wZXJhdGlvbih0aGlzKTsgfVxuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBkb2NNZXRob2RPcChmKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGNtID0gdGhpcy5jbTtcbiAgICAgIGlmICghY20gfHwgY20uY3VyT3ApIHsgcmV0dXJuIGYuYXBwbHkodGhpcywgYXJndW1lbnRzKSB9XG4gICAgICBzdGFydE9wZXJhdGlvbihjbSk7XG4gICAgICB0cnkgeyByZXR1cm4gZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpIH1cbiAgICAgIGZpbmFsbHkgeyBlbmRPcGVyYXRpb24oY20pOyB9XG4gICAgfVxuICB9XG5cbiAgLy8gSElHSExJR0hUIFdPUktFUlxuXG4gIGZ1bmN0aW9uIHN0YXJ0V29ya2VyKGNtLCB0aW1lKSB7XG4gICAgaWYgKGNtLmRvYy5oaWdobGlnaHRGcm9udGllciA8IGNtLmRpc3BsYXkudmlld1RvKVxuICAgICAgeyBjbS5zdGF0ZS5oaWdobGlnaHQuc2V0KHRpbWUsIGJpbmQoaGlnaGxpZ2h0V29ya2VyLCBjbSkpOyB9XG4gIH1cblxuICBmdW5jdGlvbiBoaWdobGlnaHRXb3JrZXIoY20pIHtcbiAgICB2YXIgZG9jID0gY20uZG9jO1xuICAgIGlmIChkb2MuaGlnaGxpZ2h0RnJvbnRpZXIgPj0gY20uZGlzcGxheS52aWV3VG8pIHsgcmV0dXJuIH1cbiAgICB2YXIgZW5kID0gK25ldyBEYXRlICsgY20ub3B0aW9ucy53b3JrVGltZTtcbiAgICB2YXIgY29udGV4dCA9IGdldENvbnRleHRCZWZvcmUoY20sIGRvYy5oaWdobGlnaHRGcm9udGllcik7XG4gICAgdmFyIGNoYW5nZWRMaW5lcyA9IFtdO1xuXG4gICAgZG9jLml0ZXIoY29udGV4dC5saW5lLCBNYXRoLm1pbihkb2MuZmlyc3QgKyBkb2Muc2l6ZSwgY20uZGlzcGxheS52aWV3VG8gKyA1MDApLCBmdW5jdGlvbiAobGluZSkge1xuICAgICAgaWYgKGNvbnRleHQubGluZSA+PSBjbS5kaXNwbGF5LnZpZXdGcm9tKSB7IC8vIFZpc2libGVcbiAgICAgICAgdmFyIG9sZFN0eWxlcyA9IGxpbmUuc3R5bGVzO1xuICAgICAgICB2YXIgcmVzZXRTdGF0ZSA9IGxpbmUudGV4dC5sZW5ndGggPiBjbS5vcHRpb25zLm1heEhpZ2hsaWdodExlbmd0aCA/IGNvcHlTdGF0ZShkb2MubW9kZSwgY29udGV4dC5zdGF0ZSkgOiBudWxsO1xuICAgICAgICB2YXIgaGlnaGxpZ2h0ZWQgPSBoaWdobGlnaHRMaW5lKGNtLCBsaW5lLCBjb250ZXh0LCB0cnVlKTtcbiAgICAgICAgaWYgKHJlc2V0U3RhdGUpIHsgY29udGV4dC5zdGF0ZSA9IHJlc2V0U3RhdGU7IH1cbiAgICAgICAgbGluZS5zdHlsZXMgPSBoaWdobGlnaHRlZC5zdHlsZXM7XG4gICAgICAgIHZhciBvbGRDbHMgPSBsaW5lLnN0eWxlQ2xhc3NlcywgbmV3Q2xzID0gaGlnaGxpZ2h0ZWQuY2xhc3NlcztcbiAgICAgICAgaWYgKG5ld0NscykgeyBsaW5lLnN0eWxlQ2xhc3NlcyA9IG5ld0NsczsgfVxuICAgICAgICBlbHNlIGlmIChvbGRDbHMpIHsgbGluZS5zdHlsZUNsYXNzZXMgPSBudWxsOyB9XG4gICAgICAgIHZhciBpc2NoYW5nZSA9ICFvbGRTdHlsZXMgfHwgb2xkU3R5bGVzLmxlbmd0aCAhPSBsaW5lLnN0eWxlcy5sZW5ndGggfHxcbiAgICAgICAgICBvbGRDbHMgIT0gbmV3Q2xzICYmICghb2xkQ2xzIHx8ICFuZXdDbHMgfHwgb2xkQ2xzLmJnQ2xhc3MgIT0gbmV3Q2xzLmJnQ2xhc3MgfHwgb2xkQ2xzLnRleHRDbGFzcyAhPSBuZXdDbHMudGV4dENsYXNzKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7ICFpc2NoYW5nZSAmJiBpIDwgb2xkU3R5bGVzLmxlbmd0aDsgKytpKSB7IGlzY2hhbmdlID0gb2xkU3R5bGVzW2ldICE9IGxpbmUuc3R5bGVzW2ldOyB9XG4gICAgICAgIGlmIChpc2NoYW5nZSkgeyBjaGFuZ2VkTGluZXMucHVzaChjb250ZXh0LmxpbmUpOyB9XG4gICAgICAgIGxpbmUuc3RhdGVBZnRlciA9IGNvbnRleHQuc2F2ZSgpO1xuICAgICAgICBjb250ZXh0Lm5leHRMaW5lKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobGluZS50ZXh0Lmxlbmd0aCA8PSBjbS5vcHRpb25zLm1heEhpZ2hsaWdodExlbmd0aClcbiAgICAgICAgICB7IHByb2Nlc3NMaW5lKGNtLCBsaW5lLnRleHQsIGNvbnRleHQpOyB9XG4gICAgICAgIGxpbmUuc3RhdGVBZnRlciA9IGNvbnRleHQubGluZSAlIDUgPT0gMCA/IGNvbnRleHQuc2F2ZSgpIDogbnVsbDtcbiAgICAgICAgY29udGV4dC5uZXh0TGluZSgpO1xuICAgICAgfVxuICAgICAgaWYgKCtuZXcgRGF0ZSA+IGVuZCkge1xuICAgICAgICBzdGFydFdvcmtlcihjbSwgY20ub3B0aW9ucy53b3JrRGVsYXkpO1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH0pO1xuICAgIGRvYy5oaWdobGlnaHRGcm9udGllciA9IGNvbnRleHQubGluZTtcbiAgICBkb2MubW9kZUZyb250aWVyID0gTWF0aC5tYXgoZG9jLm1vZGVGcm9udGllciwgY29udGV4dC5saW5lKTtcbiAgICBpZiAoY2hhbmdlZExpbmVzLmxlbmd0aCkgeyBydW5Jbk9wKGNtLCBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYW5nZWRMaW5lcy5sZW5ndGg7IGkrKylcbiAgICAgICAgeyByZWdMaW5lQ2hhbmdlKGNtLCBjaGFuZ2VkTGluZXNbaV0sIFwidGV4dFwiKTsgfVxuICAgIH0pOyB9XG4gIH1cblxuICAvLyBESVNQTEFZIERSQVdJTkdcblxuICB2YXIgRGlzcGxheVVwZGF0ZSA9IGZ1bmN0aW9uKGNtLCB2aWV3cG9ydCwgZm9yY2UpIHtcbiAgICB2YXIgZGlzcGxheSA9IGNtLmRpc3BsYXk7XG5cbiAgICB0aGlzLnZpZXdwb3J0ID0gdmlld3BvcnQ7XG4gICAgLy8gU3RvcmUgc29tZSB2YWx1ZXMgdGhhdCB3ZSdsbCBuZWVkIGxhdGVyIChidXQgZG9uJ3Qgd2FudCB0byBmb3JjZSBhIHJlbGF5b3V0IGZvcilcbiAgICB0aGlzLnZpc2libGUgPSB2aXNpYmxlTGluZXMoZGlzcGxheSwgY20uZG9jLCB2aWV3cG9ydCk7XG4gICAgdGhpcy5lZGl0b3JJc0hpZGRlbiA9ICFkaXNwbGF5LndyYXBwZXIub2Zmc2V0V2lkdGg7XG4gICAgdGhpcy53cmFwcGVySGVpZ2h0ID0gZGlzcGxheS53cmFwcGVyLmNsaWVudEhlaWdodDtcbiAgICB0aGlzLndyYXBwZXJXaWR0aCA9IGRpc3BsYXkud3JhcHBlci5jbGllbnRXaWR0aDtcbiAgICB0aGlzLm9sZERpc3BsYXlXaWR0aCA9IGRpc3BsYXlXaWR0aChjbSk7XG4gICAgdGhpcy5mb3JjZSA9IGZvcmNlO1xuICAgIHRoaXMuZGltcyA9IGdldERpbWVuc2lvbnMoY20pO1xuICAgIHRoaXMuZXZlbnRzID0gW107XG4gIH07XG5cbiAgRGlzcGxheVVwZGF0ZS5wcm90b3R5cGUuc2lnbmFsID0gZnVuY3Rpb24gKGVtaXR0ZXIsIHR5cGUpIHtcbiAgICBpZiAoaGFzSGFuZGxlcihlbWl0dGVyLCB0eXBlKSlcbiAgICAgIHsgdGhpcy5ldmVudHMucHVzaChhcmd1bWVudHMpOyB9XG4gIH07XG4gIERpc3BsYXlVcGRhdGUucHJvdG90eXBlLmZpbmlzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZXZlbnRzLmxlbmd0aDsgaSsrKVxuICAgICAgeyBzaWduYWwuYXBwbHkobnVsbCwgdGhpcy5ldmVudHNbaV0pOyB9XG4gIH07XG5cbiAgZnVuY3Rpb24gbWF5YmVDbGlwU2Nyb2xsYmFycyhjbSkge1xuICAgIHZhciBkaXNwbGF5ID0gY20uZGlzcGxheTtcbiAgICBpZiAoIWRpc3BsYXkuc2Nyb2xsYmFyc0NsaXBwZWQgJiYgZGlzcGxheS5zY3JvbGxlci5vZmZzZXRXaWR0aCkge1xuICAgICAgZGlzcGxheS5uYXRpdmVCYXJXaWR0aCA9IGRpc3BsYXkuc2Nyb2xsZXIub2Zmc2V0V2lkdGggLSBkaXNwbGF5LnNjcm9sbGVyLmNsaWVudFdpZHRoO1xuICAgICAgZGlzcGxheS5oZWlnaHRGb3JjZXIuc3R5bGUuaGVpZ2h0ID0gc2Nyb2xsR2FwKGNtKSArIFwicHhcIjtcbiAgICAgIGRpc3BsYXkuc2l6ZXIuc3R5bGUubWFyZ2luQm90dG9tID0gLWRpc3BsYXkubmF0aXZlQmFyV2lkdGggKyBcInB4XCI7XG4gICAgICBkaXNwbGF5LnNpemVyLnN0eWxlLmJvcmRlclJpZ2h0V2lkdGggPSBzY3JvbGxHYXAoY20pICsgXCJweFwiO1xuICAgICAgZGlzcGxheS5zY3JvbGxiYXJzQ2xpcHBlZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2VsZWN0aW9uU25hcHNob3QoY20pIHtcbiAgICBpZiAoY20uaGFzRm9jdXMoKSkgeyByZXR1cm4gbnVsbCB9XG4gICAgdmFyIGFjdGl2ZSA9IGFjdGl2ZUVsdCgpO1xuICAgIGlmICghYWN0aXZlIHx8ICFjb250YWlucyhjbS5kaXNwbGF5LmxpbmVEaXYsIGFjdGl2ZSkpIHsgcmV0dXJuIG51bGwgfVxuICAgIHZhciByZXN1bHQgPSB7YWN0aXZlRWx0OiBhY3RpdmV9O1xuICAgIGlmICh3aW5kb3cuZ2V0U2VsZWN0aW9uKSB7XG4gICAgICB2YXIgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgICAgaWYgKHNlbC5hbmNob3JOb2RlICYmIHNlbC5leHRlbmQgJiYgY29udGFpbnMoY20uZGlzcGxheS5saW5lRGl2LCBzZWwuYW5jaG9yTm9kZSkpIHtcbiAgICAgICAgcmVzdWx0LmFuY2hvck5vZGUgPSBzZWwuYW5jaG9yTm9kZTtcbiAgICAgICAgcmVzdWx0LmFuY2hvck9mZnNldCA9IHNlbC5hbmNob3JPZmZzZXQ7XG4gICAgICAgIHJlc3VsdC5mb2N1c05vZGUgPSBzZWwuZm9jdXNOb2RlO1xuICAgICAgICByZXN1bHQuZm9jdXNPZmZzZXQgPSBzZWwuZm9jdXNPZmZzZXQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc3RvcmVTZWxlY3Rpb24oc25hcHNob3QpIHtcbiAgICBpZiAoIXNuYXBzaG90IHx8ICFzbmFwc2hvdC5hY3RpdmVFbHQgfHwgc25hcHNob3QuYWN0aXZlRWx0ID09IGFjdGl2ZUVsdCgpKSB7IHJldHVybiB9XG4gICAgc25hcHNob3QuYWN0aXZlRWx0LmZvY3VzKCk7XG4gICAgaWYgKCEvXihJTlBVVHxURVhUQVJFQSkkLy50ZXN0KHNuYXBzaG90LmFjdGl2ZUVsdC5ub2RlTmFtZSkgJiZcbiAgICAgICAgc25hcHNob3QuYW5jaG9yTm9kZSAmJiBjb250YWlucyhkb2N1bWVudC5ib2R5LCBzbmFwc2hvdC5hbmNob3JOb2RlKSAmJiBjb250YWlucyhkb2N1bWVudC5ib2R5LCBzbmFwc2hvdC5mb2N1c05vZGUpKSB7XG4gICAgICB2YXIgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigpLCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgICByYW5nZS5zZXRFbmQoc25hcHNob3QuYW5jaG9yTm9kZSwgc25hcHNob3QuYW5jaG9yT2Zmc2V0KTtcbiAgICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKTtcbiAgICAgIHNlbC5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgIHNlbC5hZGRSYW5nZShyYW5nZSk7XG4gICAgICBzZWwuZXh0ZW5kKHNuYXBzaG90LmZvY3VzTm9kZSwgc25hcHNob3QuZm9jdXNPZmZzZXQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIERvZXMgdGhlIGFjdHVhbCB1cGRhdGluZyBvZiB0aGUgbGluZSBkaXNwbGF5LiBCYWlscyBvdXRcbiAgLy8gKHJldHVybmluZyBmYWxzZSkgd2hlbiB0aGVyZSBpcyBub3RoaW5nIHRvIGJlIGRvbmUgYW5kIGZvcmNlZCBpc1xuICAvLyBmYWxzZS5cbiAgZnVuY3Rpb24gdXBkYXRlRGlzcGxheUlmTmVlZGVkKGNtLCB1cGRhdGUpIHtcbiAgICB2YXIgZGlzcGxheSA9IGNtLmRpc3BsYXksIGRvYyA9IGNtLmRvYztcblxuICAgIGlmICh1cGRhdGUuZWRpdG9ySXNIaWRkZW4pIHtcbiAgICAgIHJlc2V0VmlldyhjbSk7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICAvLyBCYWlsIG91dCBpZiB0aGUgdmlzaWJsZSBhcmVhIGlzIGFscmVhZHkgcmVuZGVyZWQgYW5kIG5vdGhpbmcgY2hhbmdlZC5cbiAgICBpZiAoIXVwZGF0ZS5mb3JjZSAmJlxuICAgICAgICB1cGRhdGUudmlzaWJsZS5mcm9tID49IGRpc3BsYXkudmlld0Zyb20gJiYgdXBkYXRlLnZpc2libGUudG8gPD0gZGlzcGxheS52aWV3VG8gJiZcbiAgICAgICAgKGRpc3BsYXkudXBkYXRlTGluZU51bWJlcnMgPT0gbnVsbCB8fCBkaXNwbGF5LnVwZGF0ZUxpbmVOdW1iZXJzID49IGRpc3BsYXkudmlld1RvKSAmJlxuICAgICAgICBkaXNwbGF5LnJlbmRlcmVkVmlldyA9PSBkaXNwbGF5LnZpZXcgJiYgY291bnREaXJ0eVZpZXcoY20pID09IDApXG4gICAgICB7IHJldHVybiBmYWxzZSB9XG5cbiAgICBpZiAobWF5YmVVcGRhdGVMaW5lTnVtYmVyV2lkdGgoY20pKSB7XG4gICAgICByZXNldFZpZXcoY20pO1xuICAgICAgdXBkYXRlLmRpbXMgPSBnZXREaW1lbnNpb25zKGNtKTtcbiAgICB9XG5cbiAgICAvLyBDb21wdXRlIGEgc3VpdGFibGUgbmV3IHZpZXdwb3J0IChmcm9tICYgdG8pXG4gICAgdmFyIGVuZCA9IGRvYy5maXJzdCArIGRvYy5zaXplO1xuICAgIHZhciBmcm9tID0gTWF0aC5tYXgodXBkYXRlLnZpc2libGUuZnJvbSAtIGNtLm9wdGlvbnMudmlld3BvcnRNYXJnaW4sIGRvYy5maXJzdCk7XG4gICAgdmFyIHRvID0gTWF0aC5taW4oZW5kLCB1cGRhdGUudmlzaWJsZS50byArIGNtLm9wdGlvbnMudmlld3BvcnRNYXJnaW4pO1xuICAgIGlmIChkaXNwbGF5LnZpZXdGcm9tIDwgZnJvbSAmJiBmcm9tIC0gZGlzcGxheS52aWV3RnJvbSA8IDIwKSB7IGZyb20gPSBNYXRoLm1heChkb2MuZmlyc3QsIGRpc3BsYXkudmlld0Zyb20pOyB9XG4gICAgaWYgKGRpc3BsYXkudmlld1RvID4gdG8gJiYgZGlzcGxheS52aWV3VG8gLSB0byA8IDIwKSB7IHRvID0gTWF0aC5taW4oZW5kLCBkaXNwbGF5LnZpZXdUbyk7IH1cbiAgICBpZiAoc2F3Q29sbGFwc2VkU3BhbnMpIHtcbiAgICAgIGZyb20gPSB2aXN1YWxMaW5lTm8oY20uZG9jLCBmcm9tKTtcbiAgICAgIHRvID0gdmlzdWFsTGluZUVuZE5vKGNtLmRvYywgdG8pO1xuICAgIH1cblxuICAgIHZhciBkaWZmZXJlbnQgPSBmcm9tICE9IGRpc3BsYXkudmlld0Zyb20gfHwgdG8gIT0gZGlzcGxheS52aWV3VG8gfHxcbiAgICAgIGRpc3BsYXkubGFzdFdyYXBIZWlnaHQgIT0gdXBkYXRlLndyYXBwZXJIZWlnaHQgfHwgZGlzcGxheS5sYXN0V3JhcFdpZHRoICE9IHVwZGF0ZS53cmFwcGVyV2lkdGg7XG4gICAgYWRqdXN0VmlldyhjbSwgZnJvbSwgdG8pO1xuXG4gICAgZGlzcGxheS52aWV3T2Zmc2V0ID0gaGVpZ2h0QXRMaW5lKGdldExpbmUoY20uZG9jLCBkaXNwbGF5LnZpZXdGcm9tKSk7XG4gICAgLy8gUG9zaXRpb24gdGhlIG1vdmVyIGRpdiB0byBhbGlnbiB3aXRoIHRoZSBjdXJyZW50IHNjcm9sbCBwb3NpdGlvblxuICAgIGNtLmRpc3BsYXkubW92ZXIuc3R5bGUudG9wID0gZGlzcGxheS52aWV3T2Zmc2V0ICsgXCJweFwiO1xuXG4gICAgdmFyIHRvVXBkYXRlID0gY291bnREaXJ0eVZpZXcoY20pO1xuICAgIGlmICghZGlmZmVyZW50ICYmIHRvVXBkYXRlID09IDAgJiYgIXVwZGF0ZS5mb3JjZSAmJiBkaXNwbGF5LnJlbmRlcmVkVmlldyA9PSBkaXNwbGF5LnZpZXcgJiZcbiAgICAgICAgKGRpc3BsYXkudXBkYXRlTGluZU51bWJlcnMgPT0gbnVsbCB8fCBkaXNwbGF5LnVwZGF0ZUxpbmVOdW1iZXJzID49IGRpc3BsYXkudmlld1RvKSlcbiAgICAgIHsgcmV0dXJuIGZhbHNlIH1cblxuICAgIC8vIEZvciBiaWcgY2hhbmdlcywgd2UgaGlkZSB0aGUgZW5jbG9zaW5nIGVsZW1lbnQgZHVyaW5nIHRoZVxuICAgIC8vIHVwZGF0ZSwgc2luY2UgdGhhdCBzcGVlZHMgdXAgdGhlIG9wZXJhdGlvbnMgb24gbW9zdCBicm93c2Vycy5cbiAgICB2YXIgc2VsU25hcHNob3QgPSBzZWxlY3Rpb25TbmFwc2hvdChjbSk7XG4gICAgaWYgKHRvVXBkYXRlID4gNCkgeyBkaXNwbGF5LmxpbmVEaXYuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiOyB9XG4gICAgcGF0Y2hEaXNwbGF5KGNtLCBkaXNwbGF5LnVwZGF0ZUxpbmVOdW1iZXJzLCB1cGRhdGUuZGltcyk7XG4gICAgaWYgKHRvVXBkYXRlID4gNCkgeyBkaXNwbGF5LmxpbmVEaXYuc3R5bGUuZGlzcGxheSA9IFwiXCI7IH1cbiAgICBkaXNwbGF5LnJlbmRlcmVkVmlldyA9IGRpc3BsYXkudmlldztcbiAgICAvLyBUaGVyZSBtaWdodCBoYXZlIGJlZW4gYSB3aWRnZXQgd2l0aCBhIGZvY3VzZWQgZWxlbWVudCB0aGF0IGdvdFxuICAgIC8vIGhpZGRlbiBvciB1cGRhdGVkLCBpZiBzbyByZS1mb2N1cyBpdC5cbiAgICByZXN0b3JlU2VsZWN0aW9uKHNlbFNuYXBzaG90KTtcblxuICAgIC8vIFByZXZlbnQgc2VsZWN0aW9uIGFuZCBjdXJzb3JzIGZyb20gaW50ZXJmZXJpbmcgd2l0aCB0aGUgc2Nyb2xsXG4gICAgLy8gd2lkdGggYW5kIGhlaWdodC5cbiAgICByZW1vdmVDaGlsZHJlbihkaXNwbGF5LmN1cnNvckRpdik7XG4gICAgcmVtb3ZlQ2hpbGRyZW4oZGlzcGxheS5zZWxlY3Rpb25EaXYpO1xuICAgIGRpc3BsYXkuZ3V0dGVycy5zdHlsZS5oZWlnaHQgPSBkaXNwbGF5LnNpemVyLnN0eWxlLm1pbkhlaWdodCA9IDA7XG5cbiAgICBpZiAoZGlmZmVyZW50KSB7XG4gICAgICBkaXNwbGF5Lmxhc3RXcmFwSGVpZ2h0ID0gdXBkYXRlLndyYXBwZXJIZWlnaHQ7XG4gICAgICBkaXNwbGF5Lmxhc3RXcmFwV2lkdGggPSB1cGRhdGUud3JhcHBlcldpZHRoO1xuICAgICAgc3RhcnRXb3JrZXIoY20sIDQwMCk7XG4gICAgfVxuXG4gICAgZGlzcGxheS51cGRhdGVMaW5lTnVtYmVycyA9IG51bGw7XG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgZnVuY3Rpb24gcG9zdFVwZGF0ZURpc3BsYXkoY20sIHVwZGF0ZSkge1xuICAgIHZhciB2aWV3cG9ydCA9IHVwZGF0ZS52aWV3cG9ydDtcblxuICAgIGZvciAodmFyIGZpcnN0ID0gdHJ1ZTs7IGZpcnN0ID0gZmFsc2UpIHtcbiAgICAgIGlmICghZmlyc3QgfHwgIWNtLm9wdGlvbnMubGluZVdyYXBwaW5nIHx8IHVwZGF0ZS5vbGREaXNwbGF5V2lkdGggPT0gZGlzcGxheVdpZHRoKGNtKSkge1xuICAgICAgICAvLyBDbGlwIGZvcmNlZCB2aWV3cG9ydCB0byBhY3R1YWwgc2Nyb2xsYWJsZSBhcmVhLlxuICAgICAgICBpZiAodmlld3BvcnQgJiYgdmlld3BvcnQudG9wICE9IG51bGwpXG4gICAgICAgICAgeyB2aWV3cG9ydCA9IHt0b3A6IE1hdGgubWluKGNtLmRvYy5oZWlnaHQgKyBwYWRkaW5nVmVydChjbS5kaXNwbGF5KSAtIGRpc3BsYXlIZWlnaHQoY20pLCB2aWV3cG9ydC50b3ApfTsgfVxuICAgICAgICAvLyBVcGRhdGVkIGxpbmUgaGVpZ2h0cyBtaWdodCByZXN1bHQgaW4gdGhlIGRyYXduIGFyZWEgbm90XG4gICAgICAgIC8vIGFjdHVhbGx5IGNvdmVyaW5nIHRoZSB2aWV3cG9ydC4gS2VlcCBsb29waW5nIHVudGlsIGl0IGRvZXMuXG4gICAgICAgIHVwZGF0ZS52aXNpYmxlID0gdmlzaWJsZUxpbmVzKGNtLmRpc3BsYXksIGNtLmRvYywgdmlld3BvcnQpO1xuICAgICAgICBpZiAodXBkYXRlLnZpc2libGUuZnJvbSA+PSBjbS5kaXNwbGF5LnZpZXdGcm9tICYmIHVwZGF0ZS52aXNpYmxlLnRvIDw9IGNtLmRpc3BsYXkudmlld1RvKVxuICAgICAgICAgIHsgYnJlYWsgfVxuICAgICAgfSBlbHNlIGlmIChmaXJzdCkge1xuICAgICAgICB1cGRhdGUudmlzaWJsZSA9IHZpc2libGVMaW5lcyhjbS5kaXNwbGF5LCBjbS5kb2MsIHZpZXdwb3J0KTtcbiAgICAgIH1cbiAgICAgIGlmICghdXBkYXRlRGlzcGxheUlmTmVlZGVkKGNtLCB1cGRhdGUpKSB7IGJyZWFrIH1cbiAgICAgIHVwZGF0ZUhlaWdodHNJblZpZXdwb3J0KGNtKTtcbiAgICAgIHZhciBiYXJNZWFzdXJlID0gbWVhc3VyZUZvclNjcm9sbGJhcnMoY20pO1xuICAgICAgdXBkYXRlU2VsZWN0aW9uKGNtKTtcbiAgICAgIHVwZGF0ZVNjcm9sbGJhcnMoY20sIGJhck1lYXN1cmUpO1xuICAgICAgc2V0RG9jdW1lbnRIZWlnaHQoY20sIGJhck1lYXN1cmUpO1xuICAgICAgdXBkYXRlLmZvcmNlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgdXBkYXRlLnNpZ25hbChjbSwgXCJ1cGRhdGVcIiwgY20pO1xuICAgIGlmIChjbS5kaXNwbGF5LnZpZXdGcm9tICE9IGNtLmRpc3BsYXkucmVwb3J0ZWRWaWV3RnJvbSB8fCBjbS5kaXNwbGF5LnZpZXdUbyAhPSBjbS5kaXNwbGF5LnJlcG9ydGVkVmlld1RvKSB7XG4gICAgICB1cGRhdGUuc2lnbmFsKGNtLCBcInZpZXdwb3J0Q2hhbmdlXCIsIGNtLCBjbS5kaXNwbGF5LnZpZXdGcm9tLCBjbS5kaXNwbGF5LnZpZXdUbyk7XG4gICAgICBjbS5kaXNwbGF5LnJlcG9ydGVkVmlld0Zyb20gPSBjbS5kaXNwbGF5LnZpZXdGcm9tOyBjbS5kaXNwbGF5LnJlcG9ydGVkVmlld1RvID0gY20uZGlzcGxheS52aWV3VG87XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlRGlzcGxheVNpbXBsZShjbSwgdmlld3BvcnQpIHtcbiAgICB2YXIgdXBkYXRlID0gbmV3IERpc3BsYXlVcGRhdGUoY20sIHZpZXdwb3J0KTtcbiAgICBpZiAodXBkYXRlRGlzcGxheUlmTmVlZGVkKGNtLCB1cGRhdGUpKSB7XG4gICAgICB1cGRhdGVIZWlnaHRzSW5WaWV3cG9ydChjbSk7XG4gICAgICBwb3N0VXBkYXRlRGlzcGxheShjbSwgdXBkYXRlKTtcbiAgICAgIHZhciBiYXJNZWFzdXJlID0gbWVhc3VyZUZvclNjcm9sbGJhcnMoY20pO1xuICAgICAgdXBkYXRlU2VsZWN0aW9uKGNtKTtcbiAgICAgIHVwZGF0ZVNjcm9sbGJhcnMoY20sIGJhck1lYXN1cmUpO1xuICAgICAgc2V0RG9jdW1lbnRIZWlnaHQoY20sIGJhck1lYXN1cmUpO1xuICAgICAgdXBkYXRlLmZpbmlzaCgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFN5bmMgdGhlIGFjdHVhbCBkaXNwbGF5IERPTSBzdHJ1Y3R1cmUgd2l0aCBkaXNwbGF5LnZpZXcsIHJlbW92aW5nXG4gIC8vIG5vZGVzIGZvciBsaW5lcyB0aGF0IGFyZSBubyBsb25nZXIgaW4gdmlldywgYW5kIGNyZWF0aW5nIHRoZSBvbmVzXG4gIC8vIHRoYXQgYXJlIG5vdCB0aGVyZSB5ZXQsIGFuZCB1cGRhdGluZyB0aGUgb25lcyB0aGF0IGFyZSBvdXQgb2ZcbiAgLy8gZGF0ZS5cbiAgZnVuY3Rpb24gcGF0Y2hEaXNwbGF5KGNtLCB1cGRhdGVOdW1iZXJzRnJvbSwgZGltcykge1xuICAgIHZhciBkaXNwbGF5ID0gY20uZGlzcGxheSwgbGluZU51bWJlcnMgPSBjbS5vcHRpb25zLmxpbmVOdW1iZXJzO1xuICAgIHZhciBjb250YWluZXIgPSBkaXNwbGF5LmxpbmVEaXYsIGN1ciA9IGNvbnRhaW5lci5maXJzdENoaWxkO1xuXG4gICAgZnVuY3Rpb24gcm0obm9kZSkge1xuICAgICAgdmFyIG5leHQgPSBub2RlLm5leHRTaWJsaW5nO1xuICAgICAgLy8gV29ya3MgYXJvdW5kIGEgdGhyb3ctc2Nyb2xsIGJ1ZyBpbiBPUyBYIFdlYmtpdFxuICAgICAgaWYgKHdlYmtpdCAmJiBtYWMgJiYgY20uZGlzcGxheS5jdXJyZW50V2hlZWxUYXJnZXQgPT0gbm9kZSlcbiAgICAgICAgeyBub2RlLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjsgfVxuICAgICAgZWxzZVxuICAgICAgICB7IG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTsgfVxuICAgICAgcmV0dXJuIG5leHRcbiAgICB9XG5cbiAgICB2YXIgdmlldyA9IGRpc3BsYXkudmlldywgbGluZU4gPSBkaXNwbGF5LnZpZXdGcm9tO1xuICAgIC8vIExvb3Agb3ZlciB0aGUgZWxlbWVudHMgaW4gdGhlIHZpZXcsIHN5bmNpbmcgY3VyICh0aGUgRE9NIG5vZGVzXG4gICAgLy8gaW4gZGlzcGxheS5saW5lRGl2KSB3aXRoIHRoZSB2aWV3IGFzIHdlIGdvLlxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmlldy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGxpbmVWaWV3ID0gdmlld1tpXTtcbiAgICAgIGlmIChsaW5lVmlldy5oaWRkZW4pIDsgZWxzZSBpZiAoIWxpbmVWaWV3Lm5vZGUgfHwgbGluZVZpZXcubm9kZS5wYXJlbnROb2RlICE9IGNvbnRhaW5lcikgeyAvLyBOb3QgZHJhd24geWV0XG4gICAgICAgIHZhciBub2RlID0gYnVpbGRMaW5lRWxlbWVudChjbSwgbGluZVZpZXcsIGxpbmVOLCBkaW1zKTtcbiAgICAgICAgY29udGFpbmVyLmluc2VydEJlZm9yZShub2RlLCBjdXIpO1xuICAgICAgfSBlbHNlIHsgLy8gQWxyZWFkeSBkcmF3blxuICAgICAgICB3aGlsZSAoY3VyICE9IGxpbmVWaWV3Lm5vZGUpIHsgY3VyID0gcm0oY3VyKTsgfVxuICAgICAgICB2YXIgdXBkYXRlTnVtYmVyID0gbGluZU51bWJlcnMgJiYgdXBkYXRlTnVtYmVyc0Zyb20gIT0gbnVsbCAmJlxuICAgICAgICAgIHVwZGF0ZU51bWJlcnNGcm9tIDw9IGxpbmVOICYmIGxpbmVWaWV3LmxpbmVOdW1iZXI7XG4gICAgICAgIGlmIChsaW5lVmlldy5jaGFuZ2VzKSB7XG4gICAgICAgICAgaWYgKGluZGV4T2YobGluZVZpZXcuY2hhbmdlcywgXCJndXR0ZXJcIikgPiAtMSkgeyB1cGRhdGVOdW1iZXIgPSBmYWxzZTsgfVxuICAgICAgICAgIHVwZGF0ZUxpbmVGb3JDaGFuZ2VzKGNtLCBsaW5lVmlldywgbGluZU4sIGRpbXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVOdW1iZXIpIHtcbiAgICAgICAgICByZW1vdmVDaGlsZHJlbihsaW5lVmlldy5saW5lTnVtYmVyKTtcbiAgICAgICAgICBsaW5lVmlldy5saW5lTnVtYmVyLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGxpbmVOdW1iZXJGb3IoY20ub3B0aW9ucywgbGluZU4pKSk7XG4gICAgICAgIH1cbiAgICAgICAgY3VyID0gbGluZVZpZXcubm9kZS5uZXh0U2libGluZztcbiAgICAgIH1cbiAgICAgIGxpbmVOICs9IGxpbmVWaWV3LnNpemU7XG4gICAgfVxuICAgIHdoaWxlIChjdXIpIHsgY3VyID0gcm0oY3VyKTsgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlR3V0dGVyU3BhY2UoZGlzcGxheSkge1xuICAgIHZhciB3aWR0aCA9IGRpc3BsYXkuZ3V0dGVycy5vZmZzZXRXaWR0aDtcbiAgICBkaXNwbGF5LnNpemVyLnN0eWxlLm1hcmdpbkxlZnQgPSB3aWR0aCArIFwicHhcIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldERvY3VtZW50SGVpZ2h0KGNtLCBtZWFzdXJlKSB7XG4gICAgY20uZGlzcGxheS5zaXplci5zdHlsZS5taW5IZWlnaHQgPSBtZWFzdXJlLmRvY0hlaWdodCArIFwicHhcIjtcbiAgICBjbS5kaXNwbGF5LmhlaWdodEZvcmNlci5zdHlsZS50b3AgPSBtZWFzdXJlLmRvY0hlaWdodCArIFwicHhcIjtcbiAgICBjbS5kaXNwbGF5Lmd1dHRlcnMuc3R5bGUuaGVpZ2h0ID0gKG1lYXN1cmUuZG9jSGVpZ2h0ICsgY20uZGlzcGxheS5iYXJIZWlnaHQgKyBzY3JvbGxHYXAoY20pKSArIFwicHhcIjtcbiAgfVxuXG4gIC8vIFJlLWFsaWduIGxpbmUgbnVtYmVycyBhbmQgZ3V0dGVyIG1hcmtzIHRvIGNvbXBlbnNhdGUgZm9yXG4gIC8vIGhvcml6b250YWwgc2Nyb2xsaW5nLlxuICBmdW5jdGlvbiBhbGlnbkhvcml6b250YWxseShjbSkge1xuICAgIHZhciBkaXNwbGF5ID0gY20uZGlzcGxheSwgdmlldyA9IGRpc3BsYXkudmlldztcbiAgICBpZiAoIWRpc3BsYXkuYWxpZ25XaWRnZXRzICYmICghZGlzcGxheS5ndXR0ZXJzLmZpcnN0Q2hpbGQgfHwgIWNtLm9wdGlvbnMuZml4ZWRHdXR0ZXIpKSB7IHJldHVybiB9XG4gICAgdmFyIGNvbXAgPSBjb21wZW5zYXRlRm9ySFNjcm9sbChkaXNwbGF5KSAtIGRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsTGVmdCArIGNtLmRvYy5zY3JvbGxMZWZ0O1xuICAgIHZhciBndXR0ZXJXID0gZGlzcGxheS5ndXR0ZXJzLm9mZnNldFdpZHRoLCBsZWZ0ID0gY29tcCArIFwicHhcIjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZpZXcubGVuZ3RoOyBpKyspIHsgaWYgKCF2aWV3W2ldLmhpZGRlbikge1xuICAgICAgaWYgKGNtLm9wdGlvbnMuZml4ZWRHdXR0ZXIpIHtcbiAgICAgICAgaWYgKHZpZXdbaV0uZ3V0dGVyKVxuICAgICAgICAgIHsgdmlld1tpXS5ndXR0ZXIuc3R5bGUubGVmdCA9IGxlZnQ7IH1cbiAgICAgICAgaWYgKHZpZXdbaV0uZ3V0dGVyQmFja2dyb3VuZClcbiAgICAgICAgICB7IHZpZXdbaV0uZ3V0dGVyQmFja2dyb3VuZC5zdHlsZS5sZWZ0ID0gbGVmdDsgfVxuICAgICAgfVxuICAgICAgdmFyIGFsaWduID0gdmlld1tpXS5hbGlnbmFibGU7XG4gICAgICBpZiAoYWxpZ24pIHsgZm9yICh2YXIgaiA9IDA7IGogPCBhbGlnbi5sZW5ndGg7IGorKylcbiAgICAgICAgeyBhbGlnbltqXS5zdHlsZS5sZWZ0ID0gbGVmdDsgfSB9XG4gICAgfSB9XG4gICAgaWYgKGNtLm9wdGlvbnMuZml4ZWRHdXR0ZXIpXG4gICAgICB7IGRpc3BsYXkuZ3V0dGVycy5zdHlsZS5sZWZ0ID0gKGNvbXAgKyBndXR0ZXJXKSArIFwicHhcIjsgfVxuICB9XG5cbiAgLy8gVXNlZCB0byBlbnN1cmUgdGhhdCB0aGUgbGluZSBudW1iZXIgZ3V0dGVyIGlzIHN0aWxsIHRoZSByaWdodFxuICAvLyBzaXplIGZvciB0aGUgY3VycmVudCBkb2N1bWVudCBzaXplLiBSZXR1cm5zIHRydWUgd2hlbiBhbiB1cGRhdGVcbiAgLy8gaXMgbmVlZGVkLlxuICBmdW5jdGlvbiBtYXliZVVwZGF0ZUxpbmVOdW1iZXJXaWR0aChjbSkge1xuICAgIGlmICghY20ub3B0aW9ucy5saW5lTnVtYmVycykgeyByZXR1cm4gZmFsc2UgfVxuICAgIHZhciBkb2MgPSBjbS5kb2MsIGxhc3QgPSBsaW5lTnVtYmVyRm9yKGNtLm9wdGlvbnMsIGRvYy5maXJzdCArIGRvYy5zaXplIC0gMSksIGRpc3BsYXkgPSBjbS5kaXNwbGF5O1xuICAgIGlmIChsYXN0Lmxlbmd0aCAhPSBkaXNwbGF5LmxpbmVOdW1DaGFycykge1xuICAgICAgdmFyIHRlc3QgPSBkaXNwbGF5Lm1lYXN1cmUuYXBwZW5kQ2hpbGQoZWx0KFwiZGl2XCIsIFtlbHQoXCJkaXZcIiwgbGFzdCldLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiQ29kZU1pcnJvci1saW5lbnVtYmVyIENvZGVNaXJyb3ItZ3V0dGVyLWVsdFwiKSk7XG4gICAgICB2YXIgaW5uZXJXID0gdGVzdC5maXJzdENoaWxkLm9mZnNldFdpZHRoLCBwYWRkaW5nID0gdGVzdC5vZmZzZXRXaWR0aCAtIGlubmVyVztcbiAgICAgIGRpc3BsYXkubGluZUd1dHRlci5zdHlsZS53aWR0aCA9IFwiXCI7XG4gICAgICBkaXNwbGF5LmxpbmVOdW1Jbm5lcldpZHRoID0gTWF0aC5tYXgoaW5uZXJXLCBkaXNwbGF5LmxpbmVHdXR0ZXIub2Zmc2V0V2lkdGggLSBwYWRkaW5nKSArIDE7XG4gICAgICBkaXNwbGF5LmxpbmVOdW1XaWR0aCA9IGRpc3BsYXkubGluZU51bUlubmVyV2lkdGggKyBwYWRkaW5nO1xuICAgICAgZGlzcGxheS5saW5lTnVtQ2hhcnMgPSBkaXNwbGF5LmxpbmVOdW1Jbm5lcldpZHRoID8gbGFzdC5sZW5ndGggOiAtMTtcbiAgICAgIGRpc3BsYXkubGluZUd1dHRlci5zdHlsZS53aWR0aCA9IGRpc3BsYXkubGluZU51bVdpZHRoICsgXCJweFwiO1xuICAgICAgdXBkYXRlR3V0dGVyU3BhY2UoY20uZGlzcGxheSk7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEd1dHRlcnMoZ3V0dGVycywgbGluZU51bWJlcnMpIHtcbiAgICB2YXIgcmVzdWx0ID0gW10sIHNhd0xpbmVOdW1iZXJzID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBndXR0ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbmFtZSA9IGd1dHRlcnNbaV0sIHN0eWxlID0gbnVsbDtcbiAgICAgIGlmICh0eXBlb2YgbmFtZSAhPSBcInN0cmluZ1wiKSB7IHN0eWxlID0gbmFtZS5zdHlsZTsgbmFtZSA9IG5hbWUuY2xhc3NOYW1lOyB9XG4gICAgICBpZiAobmFtZSA9PSBcIkNvZGVNaXJyb3ItbGluZW51bWJlcnNcIikge1xuICAgICAgICBpZiAoIWxpbmVOdW1iZXJzKSB7IGNvbnRpbnVlIH1cbiAgICAgICAgZWxzZSB7IHNhd0xpbmVOdW1iZXJzID0gdHJ1ZTsgfVxuICAgICAgfVxuICAgICAgcmVzdWx0LnB1c2goe2NsYXNzTmFtZTogbmFtZSwgc3R5bGU6IHN0eWxlfSk7XG4gICAgfVxuICAgIGlmIChsaW5lTnVtYmVycyAmJiAhc2F3TGluZU51bWJlcnMpIHsgcmVzdWx0LnB1c2goe2NsYXNzTmFtZTogXCJDb2RlTWlycm9yLWxpbmVudW1iZXJzXCIsIHN0eWxlOiBudWxsfSk7IH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvLyBSZWJ1aWxkIHRoZSBndXR0ZXIgZWxlbWVudHMsIGVuc3VyZSB0aGUgbWFyZ2luIHRvIHRoZSBsZWZ0IG9mIHRoZVxuICAvLyBjb2RlIG1hdGNoZXMgdGhlaXIgd2lkdGguXG4gIGZ1bmN0aW9uIHJlbmRlckd1dHRlcnMoZGlzcGxheSkge1xuICAgIHZhciBndXR0ZXJzID0gZGlzcGxheS5ndXR0ZXJzLCBzcGVjcyA9IGRpc3BsYXkuZ3V0dGVyU3BlY3M7XG4gICAgcmVtb3ZlQ2hpbGRyZW4oZ3V0dGVycyk7XG4gICAgZGlzcGxheS5saW5lR3V0dGVyID0gbnVsbDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNwZWNzLmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgcmVmID0gc3BlY3NbaV07XG4gICAgICB2YXIgY2xhc3NOYW1lID0gcmVmLmNsYXNzTmFtZTtcbiAgICAgIHZhciBzdHlsZSA9IHJlZi5zdHlsZTtcbiAgICAgIHZhciBnRWx0ID0gZ3V0dGVycy5hcHBlbmRDaGlsZChlbHQoXCJkaXZcIiwgbnVsbCwgXCJDb2RlTWlycm9yLWd1dHRlciBcIiArIGNsYXNzTmFtZSkpO1xuICAgICAgaWYgKHN0eWxlKSB7IGdFbHQuc3R5bGUuY3NzVGV4dCA9IHN0eWxlOyB9XG4gICAgICBpZiAoY2xhc3NOYW1lID09IFwiQ29kZU1pcnJvci1saW5lbnVtYmVyc1wiKSB7XG4gICAgICAgIGRpc3BsYXkubGluZUd1dHRlciA9IGdFbHQ7XG4gICAgICAgIGdFbHQuc3R5bGUud2lkdGggPSAoZGlzcGxheS5saW5lTnVtV2lkdGggfHwgMSkgKyBcInB4XCI7XG4gICAgICB9XG4gICAgfVxuICAgIGd1dHRlcnMuc3R5bGUuZGlzcGxheSA9IHNwZWNzLmxlbmd0aCA/IFwiXCIgOiBcIm5vbmVcIjtcbiAgICB1cGRhdGVHdXR0ZXJTcGFjZShkaXNwbGF5KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUd1dHRlcnMoY20pIHtcbiAgICByZW5kZXJHdXR0ZXJzKGNtLmRpc3BsYXkpO1xuICAgIHJlZ0NoYW5nZShjbSk7XG4gICAgYWxpZ25Ib3Jpem9udGFsbHkoY20pO1xuICB9XG5cbiAgLy8gVGhlIGRpc3BsYXkgaGFuZGxlcyB0aGUgRE9NIGludGVncmF0aW9uLCBib3RoIGZvciBpbnB1dCByZWFkaW5nXG4gIC8vIGFuZCBjb250ZW50IGRyYXdpbmcuIEl0IGhvbGRzIHJlZmVyZW5jZXMgdG8gRE9NIG5vZGVzIGFuZFxuICAvLyBkaXNwbGF5LXJlbGF0ZWQgc3RhdGUuXG5cbiAgZnVuY3Rpb24gRGlzcGxheShwbGFjZSwgZG9jLCBpbnB1dCwgb3B0aW9ucykge1xuICAgIHZhciBkID0gdGhpcztcbiAgICB0aGlzLmlucHV0ID0gaW5wdXQ7XG5cbiAgICAvLyBDb3ZlcnMgYm90dG9tLXJpZ2h0IHNxdWFyZSB3aGVuIGJvdGggc2Nyb2xsYmFycyBhcmUgcHJlc2VudC5cbiAgICBkLnNjcm9sbGJhckZpbGxlciA9IGVsdChcImRpdlwiLCBudWxsLCBcIkNvZGVNaXJyb3Itc2Nyb2xsYmFyLWZpbGxlclwiKTtcbiAgICBkLnNjcm9sbGJhckZpbGxlci5zZXRBdHRyaWJ1dGUoXCJjbS1ub3QtY29udGVudFwiLCBcInRydWVcIik7XG4gICAgLy8gQ292ZXJzIGJvdHRvbSBvZiBndXR0ZXIgd2hlbiBjb3Zlckd1dHRlck5leHRUb1Njcm9sbGJhciBpcyBvblxuICAgIC8vIGFuZCBoIHNjcm9sbGJhciBpcyBwcmVzZW50LlxuICAgIGQuZ3V0dGVyRmlsbGVyID0gZWx0KFwiZGl2XCIsIG51bGwsIFwiQ29kZU1pcnJvci1ndXR0ZXItZmlsbGVyXCIpO1xuICAgIGQuZ3V0dGVyRmlsbGVyLnNldEF0dHJpYnV0ZShcImNtLW5vdC1jb250ZW50XCIsIFwidHJ1ZVwiKTtcbiAgICAvLyBXaWxsIGNvbnRhaW4gdGhlIGFjdHVhbCBjb2RlLCBwb3NpdGlvbmVkIHRvIGNvdmVyIHRoZSB2aWV3cG9ydC5cbiAgICBkLmxpbmVEaXYgPSBlbHRQKFwiZGl2XCIsIG51bGwsIFwiQ29kZU1pcnJvci1jb2RlXCIpO1xuICAgIC8vIEVsZW1lbnRzIGFyZSBhZGRlZCB0byB0aGVzZSB0byByZXByZXNlbnQgc2VsZWN0aW9uIGFuZCBjdXJzb3JzLlxuICAgIGQuc2VsZWN0aW9uRGl2ID0gZWx0KFwiZGl2XCIsIG51bGwsIG51bGwsIFwicG9zaXRpb246IHJlbGF0aXZlOyB6LWluZGV4OiAxXCIpO1xuICAgIGQuY3Vyc29yRGl2ID0gZWx0KFwiZGl2XCIsIG51bGwsIFwiQ29kZU1pcnJvci1jdXJzb3JzXCIpO1xuICAgIC8vIEEgdmlzaWJpbGl0eTogaGlkZGVuIGVsZW1lbnQgdXNlZCB0byBmaW5kIHRoZSBzaXplIG9mIHRoaW5ncy5cbiAgICBkLm1lYXN1cmUgPSBlbHQoXCJkaXZcIiwgbnVsbCwgXCJDb2RlTWlycm9yLW1lYXN1cmVcIik7XG4gICAgLy8gV2hlbiBsaW5lcyBvdXRzaWRlIG9mIHRoZSB2aWV3cG9ydCBhcmUgbWVhc3VyZWQsIHRoZXkgYXJlIGRyYXduIGluIHRoaXMuXG4gICAgZC5saW5lTWVhc3VyZSA9IGVsdChcImRpdlwiLCBudWxsLCBcIkNvZGVNaXJyb3ItbWVhc3VyZVwiKTtcbiAgICAvLyBXcmFwcyBldmVyeXRoaW5nIHRoYXQgbmVlZHMgdG8gZXhpc3QgaW5zaWRlIHRoZSB2ZXJ0aWNhbGx5LXBhZGRlZCBjb29yZGluYXRlIHN5c3RlbVxuICAgIGQubGluZVNwYWNlID0gZWx0UChcImRpdlwiLCBbZC5tZWFzdXJlLCBkLmxpbmVNZWFzdXJlLCBkLnNlbGVjdGlvbkRpdiwgZC5jdXJzb3JEaXYsIGQubGluZURpdl0sXG4gICAgICAgICAgICAgICAgICAgICAgbnVsbCwgXCJwb3NpdGlvbjogcmVsYXRpdmU7IG91dGxpbmU6IG5vbmVcIik7XG4gICAgdmFyIGxpbmVzID0gZWx0UChcImRpdlwiLCBbZC5saW5lU3BhY2VdLCBcIkNvZGVNaXJyb3ItbGluZXNcIik7XG4gICAgLy8gTW92ZWQgYXJvdW5kIGl0cyBwYXJlbnQgdG8gY292ZXIgdmlzaWJsZSB2aWV3LlxuICAgIGQubW92ZXIgPSBlbHQoXCJkaXZcIiwgW2xpbmVzXSwgbnVsbCwgXCJwb3NpdGlvbjogcmVsYXRpdmVcIik7XG4gICAgLy8gU2V0IHRvIHRoZSBoZWlnaHQgb2YgdGhlIGRvY3VtZW50LCBhbGxvd2luZyBzY3JvbGxpbmcuXG4gICAgZC5zaXplciA9IGVsdChcImRpdlwiLCBbZC5tb3Zlcl0sIFwiQ29kZU1pcnJvci1zaXplclwiKTtcbiAgICBkLnNpemVyV2lkdGggPSBudWxsO1xuICAgIC8vIEJlaGF2aW9yIG9mIGVsdHMgd2l0aCBvdmVyZmxvdzogYXV0byBhbmQgcGFkZGluZyBpc1xuICAgIC8vIGluY29uc2lzdGVudCBhY3Jvc3MgYnJvd3NlcnMuIFRoaXMgaXMgdXNlZCB0byBlbnN1cmUgdGhlXG4gICAgLy8gc2Nyb2xsYWJsZSBhcmVhIGlzIGJpZyBlbm91Z2guXG4gICAgZC5oZWlnaHRGb3JjZXIgPSBlbHQoXCJkaXZcIiwgbnVsbCwgbnVsbCwgXCJwb3NpdGlvbjogYWJzb2x1dGU7IGhlaWdodDogXCIgKyBzY3JvbGxlckdhcCArIFwicHg7IHdpZHRoOiAxcHg7XCIpO1xuICAgIC8vIFdpbGwgY29udGFpbiB0aGUgZ3V0dGVycywgaWYgYW55LlxuICAgIGQuZ3V0dGVycyA9IGVsdChcImRpdlwiLCBudWxsLCBcIkNvZGVNaXJyb3ItZ3V0dGVyc1wiKTtcbiAgICBkLmxpbmVHdXR0ZXIgPSBudWxsO1xuICAgIC8vIEFjdHVhbCBzY3JvbGxhYmxlIGVsZW1lbnQuXG4gICAgZC5zY3JvbGxlciA9IGVsdChcImRpdlwiLCBbZC5zaXplciwgZC5oZWlnaHRGb3JjZXIsIGQuZ3V0dGVyc10sIFwiQ29kZU1pcnJvci1zY3JvbGxcIik7XG4gICAgZC5zY3JvbGxlci5zZXRBdHRyaWJ1dGUoXCJ0YWJJbmRleFwiLCBcIi0xXCIpO1xuICAgIC8vIFRoZSBlbGVtZW50IGluIHdoaWNoIHRoZSBlZGl0b3IgbGl2ZXMuXG4gICAgZC53cmFwcGVyID0gZWx0KFwiZGl2XCIsIFtkLnNjcm9sbGJhckZpbGxlciwgZC5ndXR0ZXJGaWxsZXIsIGQuc2Nyb2xsZXJdLCBcIkNvZGVNaXJyb3JcIik7XG5cbiAgICAvLyBXb3JrIGFyb3VuZCBJRTcgei1pbmRleCBidWcgKG5vdCBwZXJmZWN0LCBoZW5jZSBJRTcgbm90IHJlYWxseSBiZWluZyBzdXBwb3J0ZWQpXG4gICAgaWYgKGllICYmIGllX3ZlcnNpb24gPCA4KSB7IGQuZ3V0dGVycy5zdHlsZS56SW5kZXggPSAtMTsgZC5zY3JvbGxlci5zdHlsZS5wYWRkaW5nUmlnaHQgPSAwOyB9XG4gICAgaWYgKCF3ZWJraXQgJiYgIShnZWNrbyAmJiBtb2JpbGUpKSB7IGQuc2Nyb2xsZXIuZHJhZ2dhYmxlID0gdHJ1ZTsgfVxuXG4gICAgaWYgKHBsYWNlKSB7XG4gICAgICBpZiAocGxhY2UuYXBwZW5kQ2hpbGQpIHsgcGxhY2UuYXBwZW5kQ2hpbGQoZC53cmFwcGVyKTsgfVxuICAgICAgZWxzZSB7IHBsYWNlKGQud3JhcHBlcik7IH1cbiAgICB9XG5cbiAgICAvLyBDdXJyZW50IHJlbmRlcmVkIHJhbmdlIChtYXkgYmUgYmlnZ2VyIHRoYW4gdGhlIHZpZXcgd2luZG93KS5cbiAgICBkLnZpZXdGcm9tID0gZC52aWV3VG8gPSBkb2MuZmlyc3Q7XG4gICAgZC5yZXBvcnRlZFZpZXdGcm9tID0gZC5yZXBvcnRlZFZpZXdUbyA9IGRvYy5maXJzdDtcbiAgICAvLyBJbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVuZGVyZWQgbGluZXMuXG4gICAgZC52aWV3ID0gW107XG4gICAgZC5yZW5kZXJlZFZpZXcgPSBudWxsO1xuICAgIC8vIEhvbGRzIGluZm8gYWJvdXQgYSBzaW5nbGUgcmVuZGVyZWQgbGluZSB3aGVuIGl0IHdhcyByZW5kZXJlZFxuICAgIC8vIGZvciBtZWFzdXJlbWVudCwgd2hpbGUgbm90IGluIHZpZXcuXG4gICAgZC5leHRlcm5hbE1lYXN1cmVkID0gbnVsbDtcbiAgICAvLyBFbXB0eSBzcGFjZSAoaW4gcGl4ZWxzKSBhYm92ZSB0aGUgdmlld1xuICAgIGQudmlld09mZnNldCA9IDA7XG4gICAgZC5sYXN0V3JhcEhlaWdodCA9IGQubGFzdFdyYXBXaWR0aCA9IDA7XG4gICAgZC51cGRhdGVMaW5lTnVtYmVycyA9IG51bGw7XG5cbiAgICBkLm5hdGl2ZUJhcldpZHRoID0gZC5iYXJIZWlnaHQgPSBkLmJhcldpZHRoID0gMDtcbiAgICBkLnNjcm9sbGJhcnNDbGlwcGVkID0gZmFsc2U7XG5cbiAgICAvLyBVc2VkIHRvIG9ubHkgcmVzaXplIHRoZSBsaW5lIG51bWJlciBndXR0ZXIgd2hlbiBuZWNlc3NhcnkgKHdoZW5cbiAgICAvLyB0aGUgYW1vdW50IG9mIGxpbmVzIGNyb3NzZXMgYSBib3VuZGFyeSB0aGF0IG1ha2VzIGl0cyB3aWR0aCBjaGFuZ2UpXG4gICAgZC5saW5lTnVtV2lkdGggPSBkLmxpbmVOdW1Jbm5lcldpZHRoID0gZC5saW5lTnVtQ2hhcnMgPSBudWxsO1xuICAgIC8vIFNldCB0byB0cnVlIHdoZW4gYSBub24taG9yaXpvbnRhbC1zY3JvbGxpbmcgbGluZSB3aWRnZXQgaXNcbiAgICAvLyBhZGRlZC4gQXMgYW4gb3B0aW1pemF0aW9uLCBsaW5lIHdpZGdldCBhbGlnbmluZyBpcyBza2lwcGVkIHdoZW5cbiAgICAvLyB0aGlzIGlzIGZhbHNlLlxuICAgIGQuYWxpZ25XaWRnZXRzID0gZmFsc2U7XG5cbiAgICBkLmNhY2hlZENoYXJXaWR0aCA9IGQuY2FjaGVkVGV4dEhlaWdodCA9IGQuY2FjaGVkUGFkZGluZ0ggPSBudWxsO1xuXG4gICAgLy8gVHJhY2tzIHRoZSBtYXhpbXVtIGxpbmUgbGVuZ3RoIHNvIHRoYXQgdGhlIGhvcml6b250YWwgc2Nyb2xsYmFyXG4gICAgLy8gY2FuIGJlIGtlcHQgc3RhdGljIHdoZW4gc2Nyb2xsaW5nLlxuICAgIGQubWF4TGluZSA9IG51bGw7XG4gICAgZC5tYXhMaW5lTGVuZ3RoID0gMDtcbiAgICBkLm1heExpbmVDaGFuZ2VkID0gZmFsc2U7XG5cbiAgICAvLyBVc2VkIGZvciBtZWFzdXJpbmcgd2hlZWwgc2Nyb2xsaW5nIGdyYW51bGFyaXR5XG4gICAgZC53aGVlbERYID0gZC53aGVlbERZID0gZC53aGVlbFN0YXJ0WCA9IGQud2hlZWxTdGFydFkgPSBudWxsO1xuXG4gICAgLy8gVHJ1ZSB3aGVuIHNoaWZ0IGlzIGhlbGQgZG93bi5cbiAgICBkLnNoaWZ0ID0gZmFsc2U7XG5cbiAgICAvLyBVc2VkIHRvIHRyYWNrIHdoZXRoZXIgYW55dGhpbmcgaGFwcGVuZWQgc2luY2UgdGhlIGNvbnRleHQgbWVudVxuICAgIC8vIHdhcyBvcGVuZWQuXG4gICAgZC5zZWxGb3JDb250ZXh0TWVudSA9IG51bGw7XG5cbiAgICBkLmFjdGl2ZVRvdWNoID0gbnVsbDtcblxuICAgIGQuZ3V0dGVyU3BlY3MgPSBnZXRHdXR0ZXJzKG9wdGlvbnMuZ3V0dGVycywgb3B0aW9ucy5saW5lTnVtYmVycyk7XG4gICAgcmVuZGVyR3V0dGVycyhkKTtcblxuICAgIGlucHV0LmluaXQoZCk7XG4gIH1cblxuICAvLyBTaW5jZSB0aGUgZGVsdGEgdmFsdWVzIHJlcG9ydGVkIG9uIG1vdXNlIHdoZWVsIGV2ZW50cyBhcmVcbiAgLy8gdW5zdGFuZGFyZGl6ZWQgYmV0d2VlbiBicm93c2VycyBhbmQgZXZlbiBicm93c2VyIHZlcnNpb25zLCBhbmRcbiAgLy8gZ2VuZXJhbGx5IGhvcnJpYmx5IHVucHJlZGljdGFibGUsIHRoaXMgY29kZSBzdGFydHMgYnkgbWVhc3VyaW5nXG4gIC8vIHRoZSBzY3JvbGwgZWZmZWN0IHRoYXQgdGhlIGZpcnN0IGZldyBtb3VzZSB3aGVlbCBldmVudHMgaGF2ZSxcbiAgLy8gYW5kLCBmcm9tIHRoYXQsIGRldGVjdHMgdGhlIHdheSBpdCBjYW4gY29udmVydCBkZWx0YXMgdG8gcGl4ZWxcbiAgLy8gb2Zmc2V0cyBhZnRlcndhcmRzLlxuICAvL1xuICAvLyBUaGUgcmVhc29uIHdlIHdhbnQgdG8ga25vdyB0aGUgYW1vdW50IGEgd2hlZWwgZXZlbnQgd2lsbCBzY3JvbGxcbiAgLy8gaXMgdGhhdCBpdCBnaXZlcyB1cyBhIGNoYW5jZSB0byB1cGRhdGUgdGhlIGRpc3BsYXkgYmVmb3JlIHRoZVxuICAvLyBhY3R1YWwgc2Nyb2xsaW5nIGhhcHBlbnMsIHJlZHVjaW5nIGZsaWNrZXJpbmcuXG5cbiAgdmFyIHdoZWVsU2FtcGxlcyA9IDAsIHdoZWVsUGl4ZWxzUGVyVW5pdCA9IG51bGw7XG4gIC8vIEZpbGwgaW4gYSBicm93c2VyLWRldGVjdGVkIHN0YXJ0aW5nIHZhbHVlIG9uIGJyb3dzZXJzIHdoZXJlIHdlXG4gIC8vIGtub3cgb25lLiBUaGVzZSBkb24ndCBoYXZlIHRvIGJlIGFjY3VyYXRlIC0tIHRoZSByZXN1bHQgb2YgdGhlbVxuICAvLyBiZWluZyB3cm9uZyB3b3VsZCBqdXN0IGJlIGEgc2xpZ2h0IGZsaWNrZXIgb24gdGhlIGZpcnN0IHdoZWVsXG4gIC8vIHNjcm9sbCAoaWYgaXQgaXMgbGFyZ2UgZW5vdWdoKS5cbiAgaWYgKGllKSB7IHdoZWVsUGl4ZWxzUGVyVW5pdCA9IC0uNTM7IH1cbiAgZWxzZSBpZiAoZ2Vja28pIHsgd2hlZWxQaXhlbHNQZXJVbml0ID0gMTU7IH1cbiAgZWxzZSBpZiAoY2hyb21lKSB7IHdoZWVsUGl4ZWxzUGVyVW5pdCA9IC0uNzsgfVxuICBlbHNlIGlmIChzYWZhcmkpIHsgd2hlZWxQaXhlbHNQZXJVbml0ID0gLTEvMzsgfVxuXG4gIGZ1bmN0aW9uIHdoZWVsRXZlbnREZWx0YShlKSB7XG4gICAgdmFyIGR4ID0gZS53aGVlbERlbHRhWCwgZHkgPSBlLndoZWVsRGVsdGFZO1xuICAgIGlmIChkeCA9PSBudWxsICYmIGUuZGV0YWlsICYmIGUuYXhpcyA9PSBlLkhPUklaT05UQUxfQVhJUykgeyBkeCA9IGUuZGV0YWlsOyB9XG4gICAgaWYgKGR5ID09IG51bGwgJiYgZS5kZXRhaWwgJiYgZS5heGlzID09IGUuVkVSVElDQUxfQVhJUykgeyBkeSA9IGUuZGV0YWlsOyB9XG4gICAgZWxzZSBpZiAoZHkgPT0gbnVsbCkgeyBkeSA9IGUud2hlZWxEZWx0YTsgfVxuICAgIHJldHVybiB7eDogZHgsIHk6IGR5fVxuICB9XG4gIGZ1bmN0aW9uIHdoZWVsRXZlbnRQaXhlbHMoZSkge1xuICAgIHZhciBkZWx0YSA9IHdoZWVsRXZlbnREZWx0YShlKTtcbiAgICBkZWx0YS54ICo9IHdoZWVsUGl4ZWxzUGVyVW5pdDtcbiAgICBkZWx0YS55ICo9IHdoZWVsUGl4ZWxzUGVyVW5pdDtcbiAgICByZXR1cm4gZGVsdGFcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uU2Nyb2xsV2hlZWwoY20sIGUpIHtcbiAgICB2YXIgZGVsdGEgPSB3aGVlbEV2ZW50RGVsdGEoZSksIGR4ID0gZGVsdGEueCwgZHkgPSBkZWx0YS55O1xuXG4gICAgdmFyIGRpc3BsYXkgPSBjbS5kaXNwbGF5LCBzY3JvbGwgPSBkaXNwbGF5LnNjcm9sbGVyO1xuICAgIC8vIFF1aXQgaWYgdGhlcmUncyBub3RoaW5nIHRvIHNjcm9sbCBoZXJlXG4gICAgdmFyIGNhblNjcm9sbFggPSBzY3JvbGwuc2Nyb2xsV2lkdGggPiBzY3JvbGwuY2xpZW50V2lkdGg7XG4gICAgdmFyIGNhblNjcm9sbFkgPSBzY3JvbGwuc2Nyb2xsSGVpZ2h0ID4gc2Nyb2xsLmNsaWVudEhlaWdodDtcbiAgICBpZiAoIShkeCAmJiBjYW5TY3JvbGxYIHx8IGR5ICYmIGNhblNjcm9sbFkpKSB7IHJldHVybiB9XG5cbiAgICAvLyBXZWJraXQgYnJvd3NlcnMgb24gT1MgWCBhYm9ydCBtb21lbnR1bSBzY3JvbGxzIHdoZW4gdGhlIHRhcmdldFxuICAgIC8vIG9mIHRoZSBzY3JvbGwgZXZlbnQgaXMgcmVtb3ZlZCBmcm9tIHRoZSBzY3JvbGxhYmxlIGVsZW1lbnQuXG4gICAgLy8gVGhpcyBoYWNrIChzZWUgcmVsYXRlZCBjb2RlIGluIHBhdGNoRGlzcGxheSkgbWFrZXMgc3VyZSB0aGVcbiAgICAvLyBlbGVtZW50IGlzIGtlcHQgYXJvdW5kLlxuICAgIGlmIChkeSAmJiBtYWMgJiYgd2Via2l0KSB7XG4gICAgICBvdXRlcjogZm9yICh2YXIgY3VyID0gZS50YXJnZXQsIHZpZXcgPSBkaXNwbGF5LnZpZXc7IGN1ciAhPSBzY3JvbGw7IGN1ciA9IGN1ci5wYXJlbnROb2RlKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmlldy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmICh2aWV3W2ldLm5vZGUgPT0gY3VyKSB7XG4gICAgICAgICAgICBjbS5kaXNwbGF5LmN1cnJlbnRXaGVlbFRhcmdldCA9IGN1cjtcbiAgICAgICAgICAgIGJyZWFrIG91dGVyXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gT24gc29tZSBicm93c2VycywgaG9yaXpvbnRhbCBzY3JvbGxpbmcgd2lsbCBjYXVzZSByZWRyYXdzIHRvXG4gICAgLy8gaGFwcGVuIGJlZm9yZSB0aGUgZ3V0dGVyIGhhcyBiZWVuIHJlYWxpZ25lZCwgY2F1c2luZyBpdCB0b1xuICAgIC8vIHdyaWdnbGUgYXJvdW5kIGluIGEgbW9zdCB1bnNlZW1seSB3YXkuIFdoZW4gd2UgaGF2ZSBhblxuICAgIC8vIGVzdGltYXRlZCBwaXhlbHMvZGVsdGEgdmFsdWUsIHdlIGp1c3QgaGFuZGxlIGhvcml6b250YWxcbiAgICAvLyBzY3JvbGxpbmcgZW50aXJlbHkgaGVyZS4gSXQnbGwgYmUgc2xpZ2h0bHkgb2ZmIGZyb20gbmF0aXZlLCBidXRcbiAgICAvLyBiZXR0ZXIgdGhhbiBnbGl0Y2hpbmcgb3V0LlxuICAgIGlmIChkeCAmJiAhZ2Vja28gJiYgIXByZXN0byAmJiB3aGVlbFBpeGVsc1BlclVuaXQgIT0gbnVsbCkge1xuICAgICAgaWYgKGR5ICYmIGNhblNjcm9sbFkpXG4gICAgICAgIHsgdXBkYXRlU2Nyb2xsVG9wKGNtLCBNYXRoLm1heCgwLCBzY3JvbGwuc2Nyb2xsVG9wICsgZHkgKiB3aGVlbFBpeGVsc1BlclVuaXQpKTsgfVxuICAgICAgc2V0U2Nyb2xsTGVmdChjbSwgTWF0aC5tYXgoMCwgc2Nyb2xsLnNjcm9sbExlZnQgKyBkeCAqIHdoZWVsUGl4ZWxzUGVyVW5pdCkpO1xuICAgICAgLy8gT25seSBwcmV2ZW50IGRlZmF1bHQgc2Nyb2xsaW5nIGlmIHZlcnRpY2FsIHNjcm9sbGluZyBpc1xuICAgICAgLy8gYWN0dWFsbHkgcG9zc2libGUuIE90aGVyd2lzZSwgaXQgY2F1c2VzIHZlcnRpY2FsIHNjcm9sbFxuICAgICAgLy8gaml0dGVyIG9uIE9TWCB0cmFja3BhZHMgd2hlbiBkZWx0YVggaXMgc21hbGwgYW5kIGRlbHRhWVxuICAgICAgLy8gaXMgbGFyZ2UgKGlzc3VlICMzNTc5KVxuICAgICAgaWYgKCFkeSB8fCAoZHkgJiYgY2FuU2Nyb2xsWSkpXG4gICAgICAgIHsgZV9wcmV2ZW50RGVmYXVsdChlKTsgfVxuICAgICAgZGlzcGxheS53aGVlbFN0YXJ0WCA9IG51bGw7IC8vIEFib3J0IG1lYXN1cmVtZW50LCBpZiBpbiBwcm9ncmVzc1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gJ1Byb2plY3QnIHRoZSB2aXNpYmxlIHZpZXdwb3J0IHRvIGNvdmVyIHRoZSBhcmVhIHRoYXQgaXMgYmVpbmdcbiAgICAvLyBzY3JvbGxlZCBpbnRvIHZpZXcgKGlmIHdlIGtub3cgZW5vdWdoIHRvIGVzdGltYXRlIGl0KS5cbiAgICBpZiAoZHkgJiYgd2hlZWxQaXhlbHNQZXJVbml0ICE9IG51bGwpIHtcbiAgICAgIHZhciBwaXhlbHMgPSBkeSAqIHdoZWVsUGl4ZWxzUGVyVW5pdDtcbiAgICAgIHZhciB0b3AgPSBjbS5kb2Muc2Nyb2xsVG9wLCBib3QgPSB0b3AgKyBkaXNwbGF5LndyYXBwZXIuY2xpZW50SGVpZ2h0O1xuICAgICAgaWYgKHBpeGVscyA8IDApIHsgdG9wID0gTWF0aC5tYXgoMCwgdG9wICsgcGl4ZWxzIC0gNTApOyB9XG4gICAgICBlbHNlIHsgYm90ID0gTWF0aC5taW4oY20uZG9jLmhlaWdodCwgYm90ICsgcGl4ZWxzICsgNTApOyB9XG4gICAgICB1cGRhdGVEaXNwbGF5U2ltcGxlKGNtLCB7dG9wOiB0b3AsIGJvdHRvbTogYm90fSk7XG4gICAgfVxuXG4gICAgaWYgKHdoZWVsU2FtcGxlcyA8IDIwKSB7XG4gICAgICBpZiAoZGlzcGxheS53aGVlbFN0YXJ0WCA9PSBudWxsKSB7XG4gICAgICAgIGRpc3BsYXkud2hlZWxTdGFydFggPSBzY3JvbGwuc2Nyb2xsTGVmdDsgZGlzcGxheS53aGVlbFN0YXJ0WSA9IHNjcm9sbC5zY3JvbGxUb3A7XG4gICAgICAgIGRpc3BsYXkud2hlZWxEWCA9IGR4OyBkaXNwbGF5LndoZWVsRFkgPSBkeTtcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKGRpc3BsYXkud2hlZWxTdGFydFggPT0gbnVsbCkgeyByZXR1cm4gfVxuICAgICAgICAgIHZhciBtb3ZlZFggPSBzY3JvbGwuc2Nyb2xsTGVmdCAtIGRpc3BsYXkud2hlZWxTdGFydFg7XG4gICAgICAgICAgdmFyIG1vdmVkWSA9IHNjcm9sbC5zY3JvbGxUb3AgLSBkaXNwbGF5LndoZWVsU3RhcnRZO1xuICAgICAgICAgIHZhciBzYW1wbGUgPSAobW92ZWRZICYmIGRpc3BsYXkud2hlZWxEWSAmJiBtb3ZlZFkgLyBkaXNwbGF5LndoZWVsRFkpIHx8XG4gICAgICAgICAgICAobW92ZWRYICYmIGRpc3BsYXkud2hlZWxEWCAmJiBtb3ZlZFggLyBkaXNwbGF5LndoZWVsRFgpO1xuICAgICAgICAgIGRpc3BsYXkud2hlZWxTdGFydFggPSBkaXNwbGF5LndoZWVsU3RhcnRZID0gbnVsbDtcbiAgICAgICAgICBpZiAoIXNhbXBsZSkgeyByZXR1cm4gfVxuICAgICAgICAgIHdoZWVsUGl4ZWxzUGVyVW5pdCA9ICh3aGVlbFBpeGVsc1BlclVuaXQgKiB3aGVlbFNhbXBsZXMgKyBzYW1wbGUpIC8gKHdoZWVsU2FtcGxlcyArIDEpO1xuICAgICAgICAgICsrd2hlZWxTYW1wbGVzO1xuICAgICAgICB9LCAyMDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGlzcGxheS53aGVlbERYICs9IGR4OyBkaXNwbGF5LndoZWVsRFkgKz0gZHk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gU2VsZWN0aW9uIG9iamVjdHMgYXJlIGltbXV0YWJsZS4gQSBuZXcgb25lIGlzIGNyZWF0ZWQgZXZlcnkgdGltZVxuICAvLyB0aGUgc2VsZWN0aW9uIGNoYW5nZXMuIEEgc2VsZWN0aW9uIGlzIG9uZSBvciBtb3JlIG5vbi1vdmVybGFwcGluZ1xuICAvLyAoYW5kIG5vbi10b3VjaGluZykgcmFuZ2VzLCBzb3J0ZWQsIGFuZCBhbiBpbnRlZ2VyIHRoYXQgaW5kaWNhdGVzXG4gIC8vIHdoaWNoIG9uZSBpcyB0aGUgcHJpbWFyeSBzZWxlY3Rpb24gKHRoZSBvbmUgdGhhdCdzIHNjcm9sbGVkIGludG9cbiAgLy8gdmlldywgdGhhdCBnZXRDdXJzb3IgcmV0dXJucywgZXRjKS5cbiAgdmFyIFNlbGVjdGlvbiA9IGZ1bmN0aW9uKHJhbmdlcywgcHJpbUluZGV4KSB7XG4gICAgdGhpcy5yYW5nZXMgPSByYW5nZXM7XG4gICAgdGhpcy5wcmltSW5kZXggPSBwcmltSW5kZXg7XG4gIH07XG5cbiAgU2VsZWN0aW9uLnByb3RvdHlwZS5wcmltYXJ5ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5yYW5nZXNbdGhpcy5wcmltSW5kZXhdIH07XG5cbiAgU2VsZWN0aW9uLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiAob3RoZXIpIHtcbiAgICBpZiAob3RoZXIgPT0gdGhpcykgeyByZXR1cm4gdHJ1ZSB9XG4gICAgaWYgKG90aGVyLnByaW1JbmRleCAhPSB0aGlzLnByaW1JbmRleCB8fCBvdGhlci5yYW5nZXMubGVuZ3RoICE9IHRoaXMucmFuZ2VzLmxlbmd0aCkgeyByZXR1cm4gZmFsc2UgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBoZXJlID0gdGhpcy5yYW5nZXNbaV0sIHRoZXJlID0gb3RoZXIucmFuZ2VzW2ldO1xuICAgICAgaWYgKCFlcXVhbEN1cnNvclBvcyhoZXJlLmFuY2hvciwgdGhlcmUuYW5jaG9yKSB8fCAhZXF1YWxDdXJzb3JQb3MoaGVyZS5oZWFkLCB0aGVyZS5oZWFkKSkgeyByZXR1cm4gZmFsc2UgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxuICB9O1xuXG4gIFNlbGVjdGlvbi5wcm90b3R5cGUuZGVlcENvcHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG91dCA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yYW5nZXMubGVuZ3RoOyBpKyspXG4gICAgICB7IG91dFtpXSA9IG5ldyBSYW5nZShjb3B5UG9zKHRoaXMucmFuZ2VzW2ldLmFuY2hvciksIGNvcHlQb3ModGhpcy5yYW5nZXNbaV0uaGVhZCkpOyB9XG4gICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24ob3V0LCB0aGlzLnByaW1JbmRleClcbiAgfTtcblxuICBTZWxlY3Rpb24ucHJvdG90eXBlLnNvbWV0aGluZ1NlbGVjdGVkID0gZnVuY3Rpb24gKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yYW5nZXMubGVuZ3RoOyBpKyspXG4gICAgICB7IGlmICghdGhpcy5yYW5nZXNbaV0uZW1wdHkoKSkgeyByZXR1cm4gdHJ1ZSB9IH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfTtcblxuICBTZWxlY3Rpb24ucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24gKHBvcywgZW5kKSB7XG4gICAgaWYgKCFlbmQpIHsgZW5kID0gcG9zOyB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHJhbmdlID0gdGhpcy5yYW5nZXNbaV07XG4gICAgICBpZiAoY21wKGVuZCwgcmFuZ2UuZnJvbSgpKSA+PSAwICYmIGNtcChwb3MsIHJhbmdlLnRvKCkpIDw9IDApXG4gICAgICAgIHsgcmV0dXJuIGkgfVxuICAgIH1cbiAgICByZXR1cm4gLTFcbiAgfTtcblxuICB2YXIgUmFuZ2UgPSBmdW5jdGlvbihhbmNob3IsIGhlYWQpIHtcbiAgICB0aGlzLmFuY2hvciA9IGFuY2hvcjsgdGhpcy5oZWFkID0gaGVhZDtcbiAgfTtcblxuICBSYW5nZS5wcm90b3R5cGUuZnJvbSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1pblBvcyh0aGlzLmFuY2hvciwgdGhpcy5oZWFkKSB9O1xuICBSYW5nZS5wcm90b3R5cGUudG8gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBtYXhQb3ModGhpcy5hbmNob3IsIHRoaXMuaGVhZCkgfTtcbiAgUmFuZ2UucHJvdG90eXBlLmVtcHR5ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5oZWFkLmxpbmUgPT0gdGhpcy5hbmNob3IubGluZSAmJiB0aGlzLmhlYWQuY2ggPT0gdGhpcy5hbmNob3IuY2ggfTtcblxuICAvLyBUYWtlIGFuIHVuc29ydGVkLCBwb3RlbnRpYWxseSBvdmVybGFwcGluZyBzZXQgb2YgcmFuZ2VzLCBhbmRcbiAgLy8gYnVpbGQgYSBzZWxlY3Rpb24gb3V0IG9mIGl0LiAnQ29uc3VtZXMnIHJhbmdlcyBhcnJheSAobW9kaWZ5aW5nXG4gIC8vIGl0KS5cbiAgZnVuY3Rpb24gbm9ybWFsaXplU2VsZWN0aW9uKGNtLCByYW5nZXMsIHByaW1JbmRleCkge1xuICAgIHZhciBtYXlUb3VjaCA9IGNtICYmIGNtLm9wdGlvbnMuc2VsZWN0aW9uc01heVRvdWNoO1xuICAgIHZhciBwcmltID0gcmFuZ2VzW3ByaW1JbmRleF07XG4gICAgcmFuZ2VzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGNtcChhLmZyb20oKSwgYi5mcm9tKCkpOyB9KTtcbiAgICBwcmltSW5kZXggPSBpbmRleE9mKHJhbmdlcywgcHJpbSk7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjdXIgPSByYW5nZXNbaV0sIHByZXYgPSByYW5nZXNbaSAtIDFdO1xuICAgICAgdmFyIGRpZmYgPSBjbXAocHJldi50bygpLCBjdXIuZnJvbSgpKTtcbiAgICAgIGlmIChtYXlUb3VjaCAmJiAhY3VyLmVtcHR5KCkgPyBkaWZmID4gMCA6IGRpZmYgPj0gMCkge1xuICAgICAgICB2YXIgZnJvbSA9IG1pblBvcyhwcmV2LmZyb20oKSwgY3VyLmZyb20oKSksIHRvID0gbWF4UG9zKHByZXYudG8oKSwgY3VyLnRvKCkpO1xuICAgICAgICB2YXIgaW52ID0gcHJldi5lbXB0eSgpID8gY3VyLmZyb20oKSA9PSBjdXIuaGVhZCA6IHByZXYuZnJvbSgpID09IHByZXYuaGVhZDtcbiAgICAgICAgaWYgKGkgPD0gcHJpbUluZGV4KSB7IC0tcHJpbUluZGV4OyB9XG4gICAgICAgIHJhbmdlcy5zcGxpY2UoLS1pLCAyLCBuZXcgUmFuZ2UoaW52ID8gdG8gOiBmcm9tLCBpbnYgPyBmcm9tIDogdG8pKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24ocmFuZ2VzLCBwcmltSW5kZXgpXG4gIH1cblxuICBmdW5jdGlvbiBzaW1wbGVTZWxlY3Rpb24oYW5jaG9yLCBoZWFkKSB7XG4gICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oW25ldyBSYW5nZShhbmNob3IsIGhlYWQgfHwgYW5jaG9yKV0sIDApXG4gIH1cblxuICAvLyBDb21wdXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgZW5kIG9mIGEgY2hhbmdlIChpdHMgJ3RvJyBwcm9wZXJ0eVxuICAvLyByZWZlcnMgdG8gdGhlIHByZS1jaGFuZ2UgZW5kKS5cbiAgZnVuY3Rpb24gY2hhbmdlRW5kKGNoYW5nZSkge1xuICAgIGlmICghY2hhbmdlLnRleHQpIHsgcmV0dXJuIGNoYW5nZS50byB9XG4gICAgcmV0dXJuIFBvcyhjaGFuZ2UuZnJvbS5saW5lICsgY2hhbmdlLnRleHQubGVuZ3RoIC0gMSxcbiAgICAgICAgICAgICAgIGxzdChjaGFuZ2UudGV4dCkubGVuZ3RoICsgKGNoYW5nZS50ZXh0Lmxlbmd0aCA9PSAxID8gY2hhbmdlLmZyb20uY2ggOiAwKSlcbiAgfVxuXG4gIC8vIEFkanVzdCBhIHBvc2l0aW9uIHRvIHJlZmVyIHRvIHRoZSBwb3N0LWNoYW5nZSBwb3NpdGlvbiBvZiB0aGVcbiAgLy8gc2FtZSB0ZXh0LCBvciB0aGUgZW5kIG9mIHRoZSBjaGFuZ2UgaWYgdGhlIGNoYW5nZSBjb3ZlcnMgaXQuXG4gIGZ1bmN0aW9uIGFkanVzdEZvckNoYW5nZShwb3MsIGNoYW5nZSkge1xuICAgIGlmIChjbXAocG9zLCBjaGFuZ2UuZnJvbSkgPCAwKSB7IHJldHVybiBwb3MgfVxuICAgIGlmIChjbXAocG9zLCBjaGFuZ2UudG8pIDw9IDApIHsgcmV0dXJuIGNoYW5nZUVuZChjaGFuZ2UpIH1cblxuICAgIHZhciBsaW5lID0gcG9zLmxpbmUgKyBjaGFuZ2UudGV4dC5sZW5ndGggLSAoY2hhbmdlLnRvLmxpbmUgLSBjaGFuZ2UuZnJvbS5saW5lKSAtIDEsIGNoID0gcG9zLmNoO1xuICAgIGlmIChwb3MubGluZSA9PSBjaGFuZ2UudG8ubGluZSkgeyBjaCArPSBjaGFuZ2VFbmQoY2hhbmdlKS5jaCAtIGNoYW5nZS50by5jaDsgfVxuICAgIHJldHVybiBQb3MobGluZSwgY2gpXG4gIH1cblxuICBmdW5jdGlvbiBjb21wdXRlU2VsQWZ0ZXJDaGFuZ2UoZG9jLCBjaGFuZ2UpIHtcbiAgICB2YXIgb3V0ID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkb2Muc2VsLnJhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHJhbmdlID0gZG9jLnNlbC5yYW5nZXNbaV07XG4gICAgICBvdXQucHVzaChuZXcgUmFuZ2UoYWRqdXN0Rm9yQ2hhbmdlKHJhbmdlLmFuY2hvciwgY2hhbmdlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICBhZGp1c3RGb3JDaGFuZ2UocmFuZ2UuaGVhZCwgY2hhbmdlKSkpO1xuICAgIH1cbiAgICByZXR1cm4gbm9ybWFsaXplU2VsZWN0aW9uKGRvYy5jbSwgb3V0LCBkb2Muc2VsLnByaW1JbmRleClcbiAgfVxuXG4gIGZ1bmN0aW9uIG9mZnNldFBvcyhwb3MsIG9sZCwgbncpIHtcbiAgICBpZiAocG9zLmxpbmUgPT0gb2xkLmxpbmUpXG4gICAgICB7IHJldHVybiBQb3MobncubGluZSwgcG9zLmNoIC0gb2xkLmNoICsgbncuY2gpIH1cbiAgICBlbHNlXG4gICAgICB7IHJldHVybiBQb3MobncubGluZSArIChwb3MubGluZSAtIG9sZC5saW5lKSwgcG9zLmNoKSB9XG4gIH1cblxuICAvLyBVc2VkIGJ5IHJlcGxhY2VTZWxlY3Rpb25zIHRvIGFsbG93IG1vdmluZyB0aGUgc2VsZWN0aW9uIHRvIHRoZVxuICAvLyBzdGFydCBvciBhcm91bmQgdGhlIHJlcGxhY2VkIHRlc3QuIEhpbnQgbWF5IGJlIFwic3RhcnRcIiBvciBcImFyb3VuZFwiLlxuICBmdW5jdGlvbiBjb21wdXRlUmVwbGFjZWRTZWwoZG9jLCBjaGFuZ2VzLCBoaW50KSB7XG4gICAgdmFyIG91dCA9IFtdO1xuICAgIHZhciBvbGRQcmV2ID0gUG9zKGRvYy5maXJzdCwgMCksIG5ld1ByZXYgPSBvbGRQcmV2O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNoYW5nZSA9IGNoYW5nZXNbaV07XG4gICAgICB2YXIgZnJvbSA9IG9mZnNldFBvcyhjaGFuZ2UuZnJvbSwgb2xkUHJldiwgbmV3UHJldik7XG4gICAgICB2YXIgdG8gPSBvZmZzZXRQb3MoY2hhbmdlRW5kKGNoYW5nZSksIG9sZFByZXYsIG5ld1ByZXYpO1xuICAgICAgb2xkUHJldiA9IGNoYW5nZS50bztcbiAgICAgIG5ld1ByZXYgPSB0bztcbiAgICAgIGlmIChoaW50ID09IFwiYXJvdW5kXCIpIHtcbiAgICAgICAgdmFyIHJhbmdlID0gZG9jLnNlbC5yYW5nZXNbaV0sIGludiA9IGNtcChyYW5nZS5oZWFkLCByYW5nZS5hbmNob3IpIDwgMDtcbiAgICAgICAgb3V0W2ldID0gbmV3IFJhbmdlKGludiA/IHRvIDogZnJvbSwgaW52ID8gZnJvbSA6IHRvKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dFtpXSA9IG5ldyBSYW5nZShmcm9tLCBmcm9tKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24ob3V0LCBkb2Muc2VsLnByaW1JbmRleClcbiAgfVxuXG4gIC8vIFVzZWQgdG8gZ2V0IHRoZSBlZGl0b3IgaW50byBhIGNvbnNpc3RlbnQgc3RhdGUgYWdhaW4gd2hlbiBvcHRpb25zIGNoYW5nZS5cblxuICBmdW5jdGlvbiBsb2FkTW9kZShjbSkge1xuICAgIGNtLmRvYy5tb2RlID0gZ2V0TW9kZShjbS5vcHRpb25zLCBjbS5kb2MubW9kZU9wdGlvbik7XG4gICAgcmVzZXRNb2RlU3RhdGUoY20pO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzZXRNb2RlU3RhdGUoY20pIHtcbiAgICBjbS5kb2MuaXRlcihmdW5jdGlvbiAobGluZSkge1xuICAgICAgaWYgKGxpbmUuc3RhdGVBZnRlcikgeyBsaW5lLnN0YXRlQWZ0ZXIgPSBudWxsOyB9XG4gICAgICBpZiAobGluZS5zdHlsZXMpIHsgbGluZS5zdHlsZXMgPSBudWxsOyB9XG4gICAgfSk7XG4gICAgY20uZG9jLm1vZGVGcm9udGllciA9IGNtLmRvYy5oaWdobGlnaHRGcm9udGllciA9IGNtLmRvYy5maXJzdDtcbiAgICBzdGFydFdvcmtlcihjbSwgMTAwKTtcbiAgICBjbS5zdGF0ZS5tb2RlR2VuKys7XG4gICAgaWYgKGNtLmN1ck9wKSB7IHJlZ0NoYW5nZShjbSk7IH1cbiAgfVxuXG4gIC8vIERPQ1VNRU5UIERBVEEgU1RSVUNUVVJFXG5cbiAgLy8gQnkgZGVmYXVsdCwgdXBkYXRlcyB0aGF0IHN0YXJ0IGFuZCBlbmQgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmVcbiAgLy8gYXJlIHRyZWF0ZWQgc3BlY2lhbGx5LCBpbiBvcmRlciB0byBtYWtlIHRoZSBhc3NvY2lhdGlvbiBvZiBsaW5lXG4gIC8vIHdpZGdldHMgYW5kIG1hcmtlciBlbGVtZW50cyB3aXRoIHRoZSB0ZXh0IGJlaGF2ZSBtb3JlIGludHVpdGl2ZS5cbiAgZnVuY3Rpb24gaXNXaG9sZUxpbmVVcGRhdGUoZG9jLCBjaGFuZ2UpIHtcbiAgICByZXR1cm4gY2hhbmdlLmZyb20uY2ggPT0gMCAmJiBjaGFuZ2UudG8uY2ggPT0gMCAmJiBsc3QoY2hhbmdlLnRleHQpID09IFwiXCIgJiZcbiAgICAgICghZG9jLmNtIHx8IGRvYy5jbS5vcHRpb25zLndob2xlTGluZVVwZGF0ZUJlZm9yZSlcbiAgfVxuXG4gIC8vIFBlcmZvcm0gYSBjaGFuZ2Ugb24gdGhlIGRvY3VtZW50IGRhdGEgc3RydWN0dXJlLlxuICBmdW5jdGlvbiB1cGRhdGVEb2MoZG9jLCBjaGFuZ2UsIG1hcmtlZFNwYW5zLCBlc3RpbWF0ZUhlaWdodCkge1xuICAgIGZ1bmN0aW9uIHNwYW5zRm9yKG4pIHtyZXR1cm4gbWFya2VkU3BhbnMgPyBtYXJrZWRTcGFuc1tuXSA6IG51bGx9XG4gICAgZnVuY3Rpb24gdXBkYXRlKGxpbmUsIHRleHQsIHNwYW5zKSB7XG4gICAgICB1cGRhdGVMaW5lKGxpbmUsIHRleHQsIHNwYW5zLCBlc3RpbWF0ZUhlaWdodCk7XG4gICAgICBzaWduYWxMYXRlcihsaW5lLCBcImNoYW5nZVwiLCBsaW5lLCBjaGFuZ2UpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBsaW5lc0ZvcihzdGFydCwgZW5kKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSlcbiAgICAgICAgeyByZXN1bHQucHVzaChuZXcgTGluZSh0ZXh0W2ldLCBzcGFuc0ZvcihpKSwgZXN0aW1hdGVIZWlnaHQpKTsgfVxuICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cblxuICAgIHZhciBmcm9tID0gY2hhbmdlLmZyb20sIHRvID0gY2hhbmdlLnRvLCB0ZXh0ID0gY2hhbmdlLnRleHQ7XG4gICAgdmFyIGZpcnN0TGluZSA9IGdldExpbmUoZG9jLCBmcm9tLmxpbmUpLCBsYXN0TGluZSA9IGdldExpbmUoZG9jLCB0by5saW5lKTtcbiAgICB2YXIgbGFzdFRleHQgPSBsc3QodGV4dCksIGxhc3RTcGFucyA9IHNwYW5zRm9yKHRleHQubGVuZ3RoIC0gMSksIG5saW5lcyA9IHRvLmxpbmUgLSBmcm9tLmxpbmU7XG5cbiAgICAvLyBBZGp1c3QgdGhlIGxpbmUgc3RydWN0dXJlXG4gICAgaWYgKGNoYW5nZS5mdWxsKSB7XG4gICAgICBkb2MuaW5zZXJ0KDAsIGxpbmVzRm9yKDAsIHRleHQubGVuZ3RoKSk7XG4gICAgICBkb2MucmVtb3ZlKHRleHQubGVuZ3RoLCBkb2Muc2l6ZSAtIHRleHQubGVuZ3RoKTtcbiAgICB9IGVsc2UgaWYgKGlzV2hvbGVMaW5lVXBkYXRlKGRvYywgY2hhbmdlKSkge1xuICAgICAgLy8gVGhpcyBpcyBhIHdob2xlLWxpbmUgcmVwbGFjZS4gVHJlYXRlZCBzcGVjaWFsbHkgdG8gbWFrZVxuICAgICAgLy8gc3VyZSBsaW5lIG9iamVjdHMgbW92ZSB0aGUgd2F5IHRoZXkgYXJlIHN1cHBvc2VkIHRvLlxuICAgICAgdmFyIGFkZGVkID0gbGluZXNGb3IoMCwgdGV4dC5sZW5ndGggLSAxKTtcbiAgICAgIHVwZGF0ZShsYXN0TGluZSwgbGFzdExpbmUudGV4dCwgbGFzdFNwYW5zKTtcbiAgICAgIGlmIChubGluZXMpIHsgZG9jLnJlbW92ZShmcm9tLmxpbmUsIG5saW5lcyk7IH1cbiAgICAgIGlmIChhZGRlZC5sZW5ndGgpIHsgZG9jLmluc2VydChmcm9tLmxpbmUsIGFkZGVkKTsgfVxuICAgIH0gZWxzZSBpZiAoZmlyc3RMaW5lID09IGxhc3RMaW5lKSB7XG4gICAgICBpZiAodGV4dC5sZW5ndGggPT0gMSkge1xuICAgICAgICB1cGRhdGUoZmlyc3RMaW5lLCBmaXJzdExpbmUudGV4dC5zbGljZSgwLCBmcm9tLmNoKSArIGxhc3RUZXh0ICsgZmlyc3RMaW5lLnRleHQuc2xpY2UodG8uY2gpLCBsYXN0U3BhbnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGFkZGVkJDEgPSBsaW5lc0ZvcigxLCB0ZXh0Lmxlbmd0aCAtIDEpO1xuICAgICAgICBhZGRlZCQxLnB1c2gobmV3IExpbmUobGFzdFRleHQgKyBmaXJzdExpbmUudGV4dC5zbGljZSh0by5jaCksIGxhc3RTcGFucywgZXN0aW1hdGVIZWlnaHQpKTtcbiAgICAgICAgdXBkYXRlKGZpcnN0TGluZSwgZmlyc3RMaW5lLnRleHQuc2xpY2UoMCwgZnJvbS5jaCkgKyB0ZXh0WzBdLCBzcGFuc0ZvcigwKSk7XG4gICAgICAgIGRvYy5pbnNlcnQoZnJvbS5saW5lICsgMSwgYWRkZWQkMSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0ZXh0Lmxlbmd0aCA9PSAxKSB7XG4gICAgICB1cGRhdGUoZmlyc3RMaW5lLCBmaXJzdExpbmUudGV4dC5zbGljZSgwLCBmcm9tLmNoKSArIHRleHRbMF0gKyBsYXN0TGluZS50ZXh0LnNsaWNlKHRvLmNoKSwgc3BhbnNGb3IoMCkpO1xuICAgICAgZG9jLnJlbW92ZShmcm9tLmxpbmUgKyAxLCBubGluZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB1cGRhdGUoZmlyc3RMaW5lLCBmaXJzdExpbmUudGV4dC5zbGljZSgwLCBmcm9tLmNoKSArIHRleHRbMF0sIHNwYW5zRm9yKDApKTtcbiAgICAgIHVwZGF0ZShsYXN0TGluZSwgbGFzdFRleHQgKyBsYXN0TGluZS50ZXh0LnNsaWNlKHRvLmNoKSwgbGFzdFNwYW5zKTtcbiAgICAgIHZhciBhZGRlZCQyID0gbGluZXNGb3IoMSwgdGV4dC5sZW5ndGggLSAxKTtcbiAgICAgIGlmIChubGluZXMgPiAxKSB7IGRvYy5yZW1vdmUoZnJvbS5saW5lICsgMSwgbmxpbmVzIC0gMSk7IH1cbiAgICAgIGRvYy5pbnNlcnQoZnJvbS5saW5lICsgMSwgYWRkZWQkMik7XG4gICAgfVxuXG4gICAgc2lnbmFsTGF0ZXIoZG9jLCBcImNoYW5nZVwiLCBkb2MsIGNoYW5nZSk7XG4gIH1cblxuICAvLyBDYWxsIGYgZm9yIGFsbCBsaW5rZWQgZG9jdW1lbnRzLlxuICBmdW5jdGlvbiBsaW5rZWREb2NzKGRvYywgZiwgc2hhcmVkSGlzdE9ubHkpIHtcbiAgICBmdW5jdGlvbiBwcm9wYWdhdGUoZG9jLCBza2lwLCBzaGFyZWRIaXN0KSB7XG4gICAgICBpZiAoZG9jLmxpbmtlZCkgeyBmb3IgKHZhciBpID0gMDsgaSA8IGRvYy5saW5rZWQubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIHJlbCA9IGRvYy5saW5rZWRbaV07XG4gICAgICAgIGlmIChyZWwuZG9jID09IHNraXApIHsgY29udGludWUgfVxuICAgICAgICB2YXIgc2hhcmVkID0gc2hhcmVkSGlzdCAmJiByZWwuc2hhcmVkSGlzdDtcbiAgICAgICAgaWYgKHNoYXJlZEhpc3RPbmx5ICYmICFzaGFyZWQpIHsgY29udGludWUgfVxuICAgICAgICBmKHJlbC5kb2MsIHNoYXJlZCk7XG4gICAgICAgIHByb3BhZ2F0ZShyZWwuZG9jLCBkb2MsIHNoYXJlZCk7XG4gICAgICB9IH1cbiAgICB9XG4gICAgcHJvcGFnYXRlKGRvYywgbnVsbCwgdHJ1ZSk7XG4gIH1cblxuICAvLyBBdHRhY2ggYSBkb2N1bWVudCB0byBhbiBlZGl0b3IuXG4gIGZ1bmN0aW9uIGF0dGFjaERvYyhjbSwgZG9jKSB7XG4gICAgaWYgKGRvYy5jbSkgeyB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIGRvY3VtZW50IGlzIGFscmVhZHkgaW4gdXNlLlwiKSB9XG4gICAgY20uZG9jID0gZG9jO1xuICAgIGRvYy5jbSA9IGNtO1xuICAgIGVzdGltYXRlTGluZUhlaWdodHMoY20pO1xuICAgIGxvYWRNb2RlKGNtKTtcbiAgICBzZXREaXJlY3Rpb25DbGFzcyhjbSk7XG4gICAgaWYgKCFjbS5vcHRpb25zLmxpbmVXcmFwcGluZykgeyBmaW5kTWF4TGluZShjbSk7IH1cbiAgICBjbS5vcHRpb25zLm1vZGUgPSBkb2MubW9kZU9wdGlvbjtcbiAgICByZWdDaGFuZ2UoY20pO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0RGlyZWN0aW9uQ2xhc3MoY20pIHtcbiAgKGNtLmRvYy5kaXJlY3Rpb24gPT0gXCJydGxcIiA/IGFkZENsYXNzIDogcm1DbGFzcykoY20uZGlzcGxheS5saW5lRGl2LCBcIkNvZGVNaXJyb3ItcnRsXCIpO1xuICB9XG5cbiAgZnVuY3Rpb24gZGlyZWN0aW9uQ2hhbmdlZChjbSkge1xuICAgIHJ1bkluT3AoY20sIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNldERpcmVjdGlvbkNsYXNzKGNtKTtcbiAgICAgIHJlZ0NoYW5nZShjbSk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBIaXN0b3J5KHN0YXJ0R2VuKSB7XG4gICAgLy8gQXJyYXlzIG9mIGNoYW5nZSBldmVudHMgYW5kIHNlbGVjdGlvbnMuIERvaW5nIHNvbWV0aGluZyBhZGRzIGFuXG4gICAgLy8gZXZlbnQgdG8gZG9uZSBhbmQgY2xlYXJzIHVuZG8uIFVuZG9pbmcgbW92ZXMgZXZlbnRzIGZyb20gZG9uZVxuICAgIC8vIHRvIHVuZG9uZSwgcmVkb2luZyBtb3ZlcyB0aGVtIGluIHRoZSBvdGhlciBkaXJlY3Rpb24uXG4gICAgdGhpcy5kb25lID0gW107IHRoaXMudW5kb25lID0gW107XG4gICAgdGhpcy51bmRvRGVwdGggPSBJbmZpbml0eTtcbiAgICAvLyBVc2VkIHRvIHRyYWNrIHdoZW4gY2hhbmdlcyBjYW4gYmUgbWVyZ2VkIGludG8gYSBzaW5nbGUgdW5kb1xuICAgIC8vIGV2ZW50XG4gICAgdGhpcy5sYXN0TW9kVGltZSA9IHRoaXMubGFzdFNlbFRpbWUgPSAwO1xuICAgIHRoaXMubGFzdE9wID0gdGhpcy5sYXN0U2VsT3AgPSBudWxsO1xuICAgIHRoaXMubGFzdE9yaWdpbiA9IHRoaXMubGFzdFNlbE9yaWdpbiA9IG51bGw7XG4gICAgLy8gVXNlZCBieSB0aGUgaXNDbGVhbigpIG1ldGhvZFxuICAgIHRoaXMuZ2VuZXJhdGlvbiA9IHRoaXMubWF4R2VuZXJhdGlvbiA9IHN0YXJ0R2VuIHx8IDE7XG4gIH1cblxuICAvLyBDcmVhdGUgYSBoaXN0b3J5IGNoYW5nZSBldmVudCBmcm9tIGFuIHVwZGF0ZURvYy1zdHlsZSBjaGFuZ2VcbiAgLy8gb2JqZWN0LlxuICBmdW5jdGlvbiBoaXN0b3J5Q2hhbmdlRnJvbUNoYW5nZShkb2MsIGNoYW5nZSkge1xuICAgIHZhciBoaXN0Q2hhbmdlID0ge2Zyb206IGNvcHlQb3MoY2hhbmdlLmZyb20pLCB0bzogY2hhbmdlRW5kKGNoYW5nZSksIHRleHQ6IGdldEJldHdlZW4oZG9jLCBjaGFuZ2UuZnJvbSwgY2hhbmdlLnRvKX07XG4gICAgYXR0YWNoTG9jYWxTcGFucyhkb2MsIGhpc3RDaGFuZ2UsIGNoYW5nZS5mcm9tLmxpbmUsIGNoYW5nZS50by5saW5lICsgMSk7XG4gICAgbGlua2VkRG9jcyhkb2MsIGZ1bmN0aW9uIChkb2MpIHsgcmV0dXJuIGF0dGFjaExvY2FsU3BhbnMoZG9jLCBoaXN0Q2hhbmdlLCBjaGFuZ2UuZnJvbS5saW5lLCBjaGFuZ2UudG8ubGluZSArIDEpOyB9LCB0cnVlKTtcbiAgICByZXR1cm4gaGlzdENoYW5nZVxuICB9XG5cbiAgLy8gUG9wIGFsbCBzZWxlY3Rpb24gZXZlbnRzIG9mZiB0aGUgZW5kIG9mIGEgaGlzdG9yeSBhcnJheS4gU3RvcCBhdFxuICAvLyBhIGNoYW5nZSBldmVudC5cbiAgZnVuY3Rpb24gY2xlYXJTZWxlY3Rpb25FdmVudHMoYXJyYXkpIHtcbiAgICB3aGlsZSAoYXJyYXkubGVuZ3RoKSB7XG4gICAgICB2YXIgbGFzdCA9IGxzdChhcnJheSk7XG4gICAgICBpZiAobGFzdC5yYW5nZXMpIHsgYXJyYXkucG9wKCk7IH1cbiAgICAgIGVsc2UgeyBicmVhayB9XG4gICAgfVxuICB9XG5cbiAgLy8gRmluZCB0aGUgdG9wIGNoYW5nZSBldmVudCBpbiB0aGUgaGlzdG9yeS4gUG9wIG9mZiBzZWxlY3Rpb25cbiAgLy8gZXZlbnRzIHRoYXQgYXJlIGluIHRoZSB3YXkuXG4gIGZ1bmN0aW9uIGxhc3RDaGFuZ2VFdmVudChoaXN0LCBmb3JjZSkge1xuICAgIGlmIChmb3JjZSkge1xuICAgICAgY2xlYXJTZWxlY3Rpb25FdmVudHMoaGlzdC5kb25lKTtcbiAgICAgIHJldHVybiBsc3QoaGlzdC5kb25lKVxuICAgIH0gZWxzZSBpZiAoaGlzdC5kb25lLmxlbmd0aCAmJiAhbHN0KGhpc3QuZG9uZSkucmFuZ2VzKSB7XG4gICAgICByZXR1cm4gbHN0KGhpc3QuZG9uZSlcbiAgICB9IGVsc2UgaWYgKGhpc3QuZG9uZS5sZW5ndGggPiAxICYmICFoaXN0LmRvbmVbaGlzdC5kb25lLmxlbmd0aCAtIDJdLnJhbmdlcykge1xuICAgICAgaGlzdC5kb25lLnBvcCgpO1xuICAgICAgcmV0dXJuIGxzdChoaXN0LmRvbmUpXG4gICAgfVxuICB9XG5cbiAgLy8gUmVnaXN0ZXIgYSBjaGFuZ2UgaW4gdGhlIGhpc3RvcnkuIE1lcmdlcyBjaGFuZ2VzIHRoYXQgYXJlIHdpdGhpblxuICAvLyBhIHNpbmdsZSBvcGVyYXRpb24sIG9yIGFyZSBjbG9zZSB0b2dldGhlciB3aXRoIGFuIG9yaWdpbiB0aGF0XG4gIC8vIGFsbG93cyBtZXJnaW5nIChzdGFydGluZyB3aXRoIFwiK1wiKSBpbnRvIGEgc2luZ2xlIGV2ZW50LlxuICBmdW5jdGlvbiBhZGRDaGFuZ2VUb0hpc3RvcnkoZG9jLCBjaGFuZ2UsIHNlbEFmdGVyLCBvcElkKSB7XG4gICAgdmFyIGhpc3QgPSBkb2MuaGlzdG9yeTtcbiAgICBoaXN0LnVuZG9uZS5sZW5ndGggPSAwO1xuICAgIHZhciB0aW1lID0gK25ldyBEYXRlLCBjdXI7XG4gICAgdmFyIGxhc3Q7XG5cbiAgICBpZiAoKGhpc3QubGFzdE9wID09IG9wSWQgfHxcbiAgICAgICAgIGhpc3QubGFzdE9yaWdpbiA9PSBjaGFuZ2Uub3JpZ2luICYmIGNoYW5nZS5vcmlnaW4gJiZcbiAgICAgICAgICgoY2hhbmdlLm9yaWdpbi5jaGFyQXQoMCkgPT0gXCIrXCIgJiYgaGlzdC5sYXN0TW9kVGltZSA+IHRpbWUgLSAoZG9jLmNtID8gZG9jLmNtLm9wdGlvbnMuaGlzdG9yeUV2ZW50RGVsYXkgOiA1MDApKSB8fFxuICAgICAgICAgIGNoYW5nZS5vcmlnaW4uY2hhckF0KDApID09IFwiKlwiKSkgJiZcbiAgICAgICAgKGN1ciA9IGxhc3RDaGFuZ2VFdmVudChoaXN0LCBoaXN0Lmxhc3RPcCA9PSBvcElkKSkpIHtcbiAgICAgIC8vIE1lcmdlIHRoaXMgY2hhbmdlIGludG8gdGhlIGxhc3QgZXZlbnRcbiAgICAgIGxhc3QgPSBsc3QoY3VyLmNoYW5nZXMpO1xuICAgICAgaWYgKGNtcChjaGFuZ2UuZnJvbSwgY2hhbmdlLnRvKSA9PSAwICYmIGNtcChjaGFuZ2UuZnJvbSwgbGFzdC50bykgPT0gMCkge1xuICAgICAgICAvLyBPcHRpbWl6ZWQgY2FzZSBmb3Igc2ltcGxlIGluc2VydGlvbiAtLSBkb24ndCB3YW50IHRvIGFkZFxuICAgICAgICAvLyBuZXcgY2hhbmdlc2V0cyBmb3IgZXZlcnkgY2hhcmFjdGVyIHR5cGVkXG4gICAgICAgIGxhc3QudG8gPSBjaGFuZ2VFbmQoY2hhbmdlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEFkZCBuZXcgc3ViLWV2ZW50XG4gICAgICAgIGN1ci5jaGFuZ2VzLnB1c2goaGlzdG9yeUNoYW5nZUZyb21DaGFuZ2UoZG9jLCBjaGFuZ2UpKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ2FuIG5vdCBiZSBtZXJnZWQsIHN0YXJ0IGEgbmV3IGV2ZW50LlxuICAgICAgdmFyIGJlZm9yZSA9IGxzdChoaXN0LmRvbmUpO1xuICAgICAgaWYgKCFiZWZvcmUgfHwgIWJlZm9yZS5yYW5nZXMpXG4gICAgICAgIHsgcHVzaFNlbGVjdGlvblRvSGlzdG9yeShkb2Muc2VsLCBoaXN0LmRvbmUpOyB9XG4gICAgICBjdXIgPSB7Y2hhbmdlczogW2hpc3RvcnlDaGFuZ2VGcm9tQ2hhbmdlKGRvYywgY2hhbmdlKV0sXG4gICAgICAgICAgICAgZ2VuZXJhdGlvbjogaGlzdC5nZW5lcmF0aW9ufTtcbiAgICAgIGhpc3QuZG9uZS5wdXNoKGN1cik7XG4gICAgICB3aGlsZSAoaGlzdC5kb25lLmxlbmd0aCA+IGhpc3QudW5kb0RlcHRoKSB7XG4gICAgICAgIGhpc3QuZG9uZS5zaGlmdCgpO1xuICAgICAgICBpZiAoIWhpc3QuZG9uZVswXS5yYW5nZXMpIHsgaGlzdC5kb25lLnNoaWZ0KCk7IH1cbiAgICAgIH1cbiAgICB9XG4gICAgaGlzdC5kb25lLnB1c2goc2VsQWZ0ZXIpO1xuICAgIGhpc3QuZ2VuZXJhdGlvbiA9ICsraGlzdC5tYXhHZW5lcmF0aW9uO1xuICAgIGhpc3QubGFzdE1vZFRpbWUgPSBoaXN0Lmxhc3RTZWxUaW1lID0gdGltZTtcbiAgICBoaXN0Lmxhc3RPcCA9IGhpc3QubGFzdFNlbE9wID0gb3BJZDtcbiAgICBoaXN0Lmxhc3RPcmlnaW4gPSBoaXN0Lmxhc3RTZWxPcmlnaW4gPSBjaGFuZ2Uub3JpZ2luO1xuXG4gICAgaWYgKCFsYXN0KSB7IHNpZ25hbChkb2MsIFwiaGlzdG9yeUFkZGVkXCIpOyB9XG4gIH1cblxuICBmdW5jdGlvbiBzZWxlY3Rpb25FdmVudENhbkJlTWVyZ2VkKGRvYywgb3JpZ2luLCBwcmV2LCBzZWwpIHtcbiAgICB2YXIgY2ggPSBvcmlnaW4uY2hhckF0KDApO1xuICAgIHJldHVybiBjaCA9PSBcIipcIiB8fFxuICAgICAgY2ggPT0gXCIrXCIgJiZcbiAgICAgIHByZXYucmFuZ2VzLmxlbmd0aCA9PSBzZWwucmFuZ2VzLmxlbmd0aCAmJlxuICAgICAgcHJldi5zb21ldGhpbmdTZWxlY3RlZCgpID09IHNlbC5zb21ldGhpbmdTZWxlY3RlZCgpICYmXG4gICAgICBuZXcgRGF0ZSAtIGRvYy5oaXN0b3J5Lmxhc3RTZWxUaW1lIDw9IChkb2MuY20gPyBkb2MuY20ub3B0aW9ucy5oaXN0b3J5RXZlbnREZWxheSA6IDUwMClcbiAgfVxuXG4gIC8vIENhbGxlZCB3aGVuZXZlciB0aGUgc2VsZWN0aW9uIGNoYW5nZXMsIHNldHMgdGhlIG5ldyBzZWxlY3Rpb24gYXNcbiAgLy8gdGhlIHBlbmRpbmcgc2VsZWN0aW9uIGluIHRoZSBoaXN0b3J5LCBhbmQgcHVzaGVzIHRoZSBvbGQgcGVuZGluZ1xuICAvLyBzZWxlY3Rpb24gaW50byB0aGUgJ2RvbmUnIGFycmF5IHdoZW4gaXQgd2FzIHNpZ25pZmljYW50bHlcbiAgLy8gZGlmZmVyZW50IChpbiBudW1iZXIgb2Ygc2VsZWN0ZWQgcmFuZ2VzLCBlbXB0aW5lc3MsIG9yIHRpbWUpLlxuICBmdW5jdGlvbiBhZGRTZWxlY3Rpb25Ub0hpc3RvcnkoZG9jLCBzZWwsIG9wSWQsIG9wdGlvbnMpIHtcbiAgICB2YXIgaGlzdCA9IGRvYy5oaXN0b3J5LCBvcmlnaW4gPSBvcHRpb25zICYmIG9wdGlvbnMub3JpZ2luO1xuXG4gICAgLy8gQSBuZXcgZXZlbnQgaXMgc3RhcnRlZCB3aGVuIHRoZSBwcmV2aW91cyBvcmlnaW4gZG9lcyBub3QgbWF0Y2hcbiAgICAvLyB0aGUgY3VycmVudCwgb3IgdGhlIG9yaWdpbnMgZG9uJ3QgYWxsb3cgbWF0Y2hpbmcuIE9yaWdpbnNcbiAgICAvLyBzdGFydGluZyB3aXRoICogYXJlIGFsd2F5cyBtZXJnZWQsIHRob3NlIHN0YXJ0aW5nIHdpdGggKyBhcmVcbiAgICAvLyBtZXJnZWQgd2hlbiBzaW1pbGFyIGFuZCBjbG9zZSB0b2dldGhlciBpbiB0aW1lLlxuICAgIGlmIChvcElkID09IGhpc3QubGFzdFNlbE9wIHx8XG4gICAgICAgIChvcmlnaW4gJiYgaGlzdC5sYXN0U2VsT3JpZ2luID09IG9yaWdpbiAmJlxuICAgICAgICAgKGhpc3QubGFzdE1vZFRpbWUgPT0gaGlzdC5sYXN0U2VsVGltZSAmJiBoaXN0Lmxhc3RPcmlnaW4gPT0gb3JpZ2luIHx8XG4gICAgICAgICAgc2VsZWN0aW9uRXZlbnRDYW5CZU1lcmdlZChkb2MsIG9yaWdpbiwgbHN0KGhpc3QuZG9uZSksIHNlbCkpKSlcbiAgICAgIHsgaGlzdC5kb25lW2hpc3QuZG9uZS5sZW5ndGggLSAxXSA9IHNlbDsgfVxuICAgIGVsc2VcbiAgICAgIHsgcHVzaFNlbGVjdGlvblRvSGlzdG9yeShzZWwsIGhpc3QuZG9uZSk7IH1cblxuICAgIGhpc3QubGFzdFNlbFRpbWUgPSArbmV3IERhdGU7XG4gICAgaGlzdC5sYXN0U2VsT3JpZ2luID0gb3JpZ2luO1xuICAgIGhpc3QubGFzdFNlbE9wID0gb3BJZDtcbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmNsZWFyUmVkbyAhPT0gZmFsc2UpXG4gICAgICB7IGNsZWFyU2VsZWN0aW9uRXZlbnRzKGhpc3QudW5kb25lKTsgfVxuICB9XG5cbiAgZnVuY3Rpb24gcHVzaFNlbGVjdGlvblRvSGlzdG9yeShzZWwsIGRlc3QpIHtcbiAgICB2YXIgdG9wID0gbHN0KGRlc3QpO1xuICAgIGlmICghKHRvcCAmJiB0b3AucmFuZ2VzICYmIHRvcC5lcXVhbHMoc2VsKSkpXG4gICAgICB7IGRlc3QucHVzaChzZWwpOyB9XG4gIH1cblxuICAvLyBVc2VkIHRvIHN0b3JlIG1hcmtlZCBzcGFuIGluZm9ybWF0aW9uIGluIHRoZSBoaXN0b3J5LlxuICBmdW5jdGlvbiBhdHRhY2hMb2NhbFNwYW5zKGRvYywgY2hhbmdlLCBmcm9tLCB0bykge1xuICAgIHZhciBleGlzdGluZyA9IGNoYW5nZVtcInNwYW5zX1wiICsgZG9jLmlkXSwgbiA9IDA7XG4gICAgZG9jLml0ZXIoTWF0aC5tYXgoZG9jLmZpcnN0LCBmcm9tKSwgTWF0aC5taW4oZG9jLmZpcnN0ICsgZG9jLnNpemUsIHRvKSwgZnVuY3Rpb24gKGxpbmUpIHtcbiAgICAgIGlmIChsaW5lLm1hcmtlZFNwYW5zKVxuICAgICAgICB7IChleGlzdGluZyB8fCAoZXhpc3RpbmcgPSBjaGFuZ2VbXCJzcGFuc19cIiArIGRvYy5pZF0gPSB7fSkpW25dID0gbGluZS5tYXJrZWRTcGFuczsgfVxuICAgICAgKytuO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gV2hlbiB1bi9yZS1kb2luZyByZXN0b3JlcyB0ZXh0IGNvbnRhaW5pbmcgbWFya2VkIHNwYW5zLCB0aG9zZVxuICAvLyB0aGF0IGhhdmUgYmVlbiBleHBsaWNpdGx5IGNsZWFyZWQgc2hvdWxkIG5vdCBiZSByZXN0b3JlZC5cbiAgZnVuY3Rpb24gcmVtb3ZlQ2xlYXJlZFNwYW5zKHNwYW5zKSB7XG4gICAgaWYgKCFzcGFucykgeyByZXR1cm4gbnVsbCB9XG4gICAgdmFyIG91dDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgKytpKSB7XG4gICAgICBpZiAoc3BhbnNbaV0ubWFya2VyLmV4cGxpY2l0bHlDbGVhcmVkKSB7IGlmICghb3V0KSB7IG91dCA9IHNwYW5zLnNsaWNlKDAsIGkpOyB9IH1cbiAgICAgIGVsc2UgaWYgKG91dCkgeyBvdXQucHVzaChzcGFuc1tpXSk7IH1cbiAgICB9XG4gICAgcmV0dXJuICFvdXQgPyBzcGFucyA6IG91dC5sZW5ndGggPyBvdXQgOiBudWxsXG4gIH1cblxuICAvLyBSZXRyaWV2ZSBhbmQgZmlsdGVyIHRoZSBvbGQgbWFya2VkIHNwYW5zIHN0b3JlZCBpbiBhIGNoYW5nZSBldmVudC5cbiAgZnVuY3Rpb24gZ2V0T2xkU3BhbnMoZG9jLCBjaGFuZ2UpIHtcbiAgICB2YXIgZm91bmQgPSBjaGFuZ2VbXCJzcGFuc19cIiArIGRvYy5pZF07XG4gICAgaWYgKCFmb3VuZCkgeyByZXR1cm4gbnVsbCB9XG4gICAgdmFyIG53ID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFuZ2UudGV4dC5sZW5ndGg7ICsraSlcbiAgICAgIHsgbncucHVzaChyZW1vdmVDbGVhcmVkU3BhbnMoZm91bmRbaV0pKTsgfVxuICAgIHJldHVybiBud1xuICB9XG5cbiAgLy8gVXNlZCBmb3IgdW4vcmUtZG9pbmcgY2hhbmdlcyBmcm9tIHRoZSBoaXN0b3J5LiBDb21iaW5lcyB0aGVcbiAgLy8gcmVzdWx0IG9mIGNvbXB1dGluZyB0aGUgZXhpc3Rpbmcgc3BhbnMgd2l0aCB0aGUgc2V0IG9mIHNwYW5zIHRoYXRcbiAgLy8gZXhpc3RlZCBpbiB0aGUgaGlzdG9yeSAoc28gdGhhdCBkZWxldGluZyBhcm91bmQgYSBzcGFuIGFuZCB0aGVuXG4gIC8vIHVuZG9pbmcgYnJpbmdzIGJhY2sgdGhlIHNwYW4pLlxuICBmdW5jdGlvbiBtZXJnZU9sZFNwYW5zKGRvYywgY2hhbmdlKSB7XG4gICAgdmFyIG9sZCA9IGdldE9sZFNwYW5zKGRvYywgY2hhbmdlKTtcbiAgICB2YXIgc3RyZXRjaGVkID0gc3RyZXRjaFNwYW5zT3ZlckNoYW5nZShkb2MsIGNoYW5nZSk7XG4gICAgaWYgKCFvbGQpIHsgcmV0dXJuIHN0cmV0Y2hlZCB9XG4gICAgaWYgKCFzdHJldGNoZWQpIHsgcmV0dXJuIG9sZCB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9sZC5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIG9sZEN1ciA9IG9sZFtpXSwgc3RyZXRjaEN1ciA9IHN0cmV0Y2hlZFtpXTtcbiAgICAgIGlmIChvbGRDdXIgJiYgc3RyZXRjaEN1cikge1xuICAgICAgICBzcGFuczogZm9yICh2YXIgaiA9IDA7IGogPCBzdHJldGNoQ3VyLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgdmFyIHNwYW4gPSBzdHJldGNoQ3VyW2pdO1xuICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgb2xkQ3VyLmxlbmd0aDsgKytrKVxuICAgICAgICAgICAgeyBpZiAob2xkQ3VyW2tdLm1hcmtlciA9PSBzcGFuLm1hcmtlcikgeyBjb250aW51ZSBzcGFucyB9IH1cbiAgICAgICAgICBvbGRDdXIucHVzaChzcGFuKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzdHJldGNoQ3VyKSB7XG4gICAgICAgIG9sZFtpXSA9IHN0cmV0Y2hDdXI7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvbGRcbiAgfVxuXG4gIC8vIFVzZWQgYm90aCB0byBwcm92aWRlIGEgSlNPTi1zYWZlIG9iamVjdCBpbiAuZ2V0SGlzdG9yeSwgYW5kLCB3aGVuXG4gIC8vIGRldGFjaGluZyBhIGRvY3VtZW50LCB0byBzcGxpdCB0aGUgaGlzdG9yeSBpbiB0d29cbiAgZnVuY3Rpb24gY29weUhpc3RvcnlBcnJheShldmVudHMsIG5ld0dyb3VwLCBpbnN0YW50aWF0ZVNlbCkge1xuICAgIHZhciBjb3B5ID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBldmVudHMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBldmVudCA9IGV2ZW50c1tpXTtcbiAgICAgIGlmIChldmVudC5yYW5nZXMpIHtcbiAgICAgICAgY29weS5wdXNoKGluc3RhbnRpYXRlU2VsID8gU2VsZWN0aW9uLnByb3RvdHlwZS5kZWVwQ29weS5jYWxsKGV2ZW50KSA6IGV2ZW50KTtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIHZhciBjaGFuZ2VzID0gZXZlbnQuY2hhbmdlcywgbmV3Q2hhbmdlcyA9IFtdO1xuICAgICAgY29weS5wdXNoKHtjaGFuZ2VzOiBuZXdDaGFuZ2VzfSk7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNoYW5nZXMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgdmFyIGNoYW5nZSA9IGNoYW5nZXNbal0sIG0gPSAodm9pZCAwKTtcbiAgICAgICAgbmV3Q2hhbmdlcy5wdXNoKHtmcm9tOiBjaGFuZ2UuZnJvbSwgdG86IGNoYW5nZS50bywgdGV4dDogY2hhbmdlLnRleHR9KTtcbiAgICAgICAgaWYgKG5ld0dyb3VwKSB7IGZvciAodmFyIHByb3AgaW4gY2hhbmdlKSB7IGlmIChtID0gcHJvcC5tYXRjaCgvXnNwYW5zXyhcXGQrKSQvKSkge1xuICAgICAgICAgIGlmIChpbmRleE9mKG5ld0dyb3VwLCBOdW1iZXIobVsxXSkpID4gLTEpIHtcbiAgICAgICAgICAgIGxzdChuZXdDaGFuZ2VzKVtwcm9wXSA9IGNoYW5nZVtwcm9wXTtcbiAgICAgICAgICAgIGRlbGV0ZSBjaGFuZ2VbcHJvcF07XG4gICAgICAgICAgfVxuICAgICAgICB9IH0gfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29weVxuICB9XG5cbiAgLy8gVGhlICdzY3JvbGwnIHBhcmFtZXRlciBnaXZlbiB0byBtYW55IG9mIHRoZXNlIGluZGljYXRlZCB3aGV0aGVyXG4gIC8vIHRoZSBuZXcgY3Vyc29yIHBvc2l0aW9uIHNob3VsZCBiZSBzY3JvbGxlZCBpbnRvIHZpZXcgYWZ0ZXJcbiAgLy8gbW9kaWZ5aW5nIHRoZSBzZWxlY3Rpb24uXG5cbiAgLy8gSWYgc2hpZnQgaXMgaGVsZCBvciB0aGUgZXh0ZW5kIGZsYWcgaXMgc2V0LCBleHRlbmRzIGEgcmFuZ2UgdG9cbiAgLy8gaW5jbHVkZSBhIGdpdmVuIHBvc2l0aW9uIChhbmQgb3B0aW9uYWxseSBhIHNlY29uZCBwb3NpdGlvbikuXG4gIC8vIE90aGVyd2lzZSwgc2ltcGx5IHJldHVybnMgdGhlIHJhbmdlIGJldHdlZW4gdGhlIGdpdmVuIHBvc2l0aW9ucy5cbiAgLy8gVXNlZCBmb3IgY3Vyc29yIG1vdGlvbiBhbmQgc3VjaC5cbiAgZnVuY3Rpb24gZXh0ZW5kUmFuZ2UocmFuZ2UsIGhlYWQsIG90aGVyLCBleHRlbmQpIHtcbiAgICBpZiAoZXh0ZW5kKSB7XG4gICAgICB2YXIgYW5jaG9yID0gcmFuZ2UuYW5jaG9yO1xuICAgICAgaWYgKG90aGVyKSB7XG4gICAgICAgIHZhciBwb3NCZWZvcmUgPSBjbXAoaGVhZCwgYW5jaG9yKSA8IDA7XG4gICAgICAgIGlmIChwb3NCZWZvcmUgIT0gKGNtcChvdGhlciwgYW5jaG9yKSA8IDApKSB7XG4gICAgICAgICAgYW5jaG9yID0gaGVhZDtcbiAgICAgICAgICBoZWFkID0gb3RoZXI7XG4gICAgICAgIH0gZWxzZSBpZiAocG9zQmVmb3JlICE9IChjbXAoaGVhZCwgb3RoZXIpIDwgMCkpIHtcbiAgICAgICAgICBoZWFkID0gb3RoZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgUmFuZ2UoYW5jaG9yLCBoZWFkKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IFJhbmdlKG90aGVyIHx8IGhlYWQsIGhlYWQpXG4gICAgfVxuICB9XG5cbiAgLy8gRXh0ZW5kIHRoZSBwcmltYXJ5IHNlbGVjdGlvbiByYW5nZSwgZGlzY2FyZCB0aGUgcmVzdC5cbiAgZnVuY3Rpb24gZXh0ZW5kU2VsZWN0aW9uKGRvYywgaGVhZCwgb3RoZXIsIG9wdGlvbnMsIGV4dGVuZCkge1xuICAgIGlmIChleHRlbmQgPT0gbnVsbCkgeyBleHRlbmQgPSBkb2MuY20gJiYgKGRvYy5jbS5kaXNwbGF5LnNoaWZ0IHx8IGRvYy5leHRlbmQpOyB9XG4gICAgc2V0U2VsZWN0aW9uKGRvYywgbmV3IFNlbGVjdGlvbihbZXh0ZW5kUmFuZ2UoZG9jLnNlbC5wcmltYXJ5KCksIGhlYWQsIG90aGVyLCBleHRlbmQpXSwgMCksIG9wdGlvbnMpO1xuICB9XG5cbiAgLy8gRXh0ZW5kIGFsbCBzZWxlY3Rpb25zIChwb3MgaXMgYW4gYXJyYXkgb2Ygc2VsZWN0aW9ucyB3aXRoIGxlbmd0aFxuICAvLyBlcXVhbCB0aGUgbnVtYmVyIG9mIHNlbGVjdGlvbnMpXG4gIGZ1bmN0aW9uIGV4dGVuZFNlbGVjdGlvbnMoZG9jLCBoZWFkcywgb3B0aW9ucykge1xuICAgIHZhciBvdXQgPSBbXTtcbiAgICB2YXIgZXh0ZW5kID0gZG9jLmNtICYmIChkb2MuY20uZGlzcGxheS5zaGlmdCB8fCBkb2MuZXh0ZW5kKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRvYy5zZWwucmFuZ2VzLmxlbmd0aDsgaSsrKVxuICAgICAgeyBvdXRbaV0gPSBleHRlbmRSYW5nZShkb2Muc2VsLnJhbmdlc1tpXSwgaGVhZHNbaV0sIG51bGwsIGV4dGVuZCk7IH1cbiAgICB2YXIgbmV3U2VsID0gbm9ybWFsaXplU2VsZWN0aW9uKGRvYy5jbSwgb3V0LCBkb2Muc2VsLnByaW1JbmRleCk7XG4gICAgc2V0U2VsZWN0aW9uKGRvYywgbmV3U2VsLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8vIFVwZGF0ZXMgYSBzaW5nbGUgcmFuZ2UgaW4gdGhlIHNlbGVjdGlvbi5cbiAgZnVuY3Rpb24gcmVwbGFjZU9uZVNlbGVjdGlvbihkb2MsIGksIHJhbmdlLCBvcHRpb25zKSB7XG4gICAgdmFyIHJhbmdlcyA9IGRvYy5zZWwucmFuZ2VzLnNsaWNlKDApO1xuICAgIHJhbmdlc1tpXSA9IHJhbmdlO1xuICAgIHNldFNlbGVjdGlvbihkb2MsIG5vcm1hbGl6ZVNlbGVjdGlvbihkb2MuY20sIHJhbmdlcywgZG9jLnNlbC5wcmltSW5kZXgpLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8vIFJlc2V0IHRoZSBzZWxlY3Rpb24gdG8gYSBzaW5nbGUgcmFuZ2UuXG4gIGZ1bmN0aW9uIHNldFNpbXBsZVNlbGVjdGlvbihkb2MsIGFuY2hvciwgaGVhZCwgb3B0aW9ucykge1xuICAgIHNldFNlbGVjdGlvbihkb2MsIHNpbXBsZVNlbGVjdGlvbihhbmNob3IsIGhlYWQpLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8vIEdpdmUgYmVmb3JlU2VsZWN0aW9uQ2hhbmdlIGhhbmRsZXJzIGEgY2hhbmdlIHRvIGluZmx1ZW5jZSBhXG4gIC8vIHNlbGVjdGlvbiB1cGRhdGUuXG4gIGZ1bmN0aW9uIGZpbHRlclNlbGVjdGlvbkNoYW5nZShkb2MsIHNlbCwgb3B0aW9ucykge1xuICAgIHZhciBvYmogPSB7XG4gICAgICByYW5nZXM6IHNlbC5yYW5nZXMsXG4gICAgICB1cGRhdGU6IGZ1bmN0aW9uKHJhbmdlcykge1xuICAgICAgICB0aGlzLnJhbmdlcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICB7IHRoaXMucmFuZ2VzW2ldID0gbmV3IFJhbmdlKGNsaXBQb3MoZG9jLCByYW5nZXNbaV0uYW5jaG9yKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwUG9zKGRvYywgcmFuZ2VzW2ldLmhlYWQpKTsgfVxuICAgICAgfSxcbiAgICAgIG9yaWdpbjogb3B0aW9ucyAmJiBvcHRpb25zLm9yaWdpblxuICAgIH07XG4gICAgc2lnbmFsKGRvYywgXCJiZWZvcmVTZWxlY3Rpb25DaGFuZ2VcIiwgZG9jLCBvYmopO1xuICAgIGlmIChkb2MuY20pIHsgc2lnbmFsKGRvYy5jbSwgXCJiZWZvcmVTZWxlY3Rpb25DaGFuZ2VcIiwgZG9jLmNtLCBvYmopOyB9XG4gICAgaWYgKG9iai5yYW5nZXMgIT0gc2VsLnJhbmdlcykgeyByZXR1cm4gbm9ybWFsaXplU2VsZWN0aW9uKGRvYy5jbSwgb2JqLnJhbmdlcywgb2JqLnJhbmdlcy5sZW5ndGggLSAxKSB9XG4gICAgZWxzZSB7IHJldHVybiBzZWwgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2V0U2VsZWN0aW9uUmVwbGFjZUhpc3RvcnkoZG9jLCBzZWwsIG9wdGlvbnMpIHtcbiAgICB2YXIgZG9uZSA9IGRvYy5oaXN0b3J5LmRvbmUsIGxhc3QgPSBsc3QoZG9uZSk7XG4gICAgaWYgKGxhc3QgJiYgbGFzdC5yYW5nZXMpIHtcbiAgICAgIGRvbmVbZG9uZS5sZW5ndGggLSAxXSA9IHNlbDtcbiAgICAgIHNldFNlbGVjdGlvbk5vVW5kbyhkb2MsIHNlbCwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFNlbGVjdGlvbihkb2MsIHNlbCwgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgLy8gU2V0IGEgbmV3IHNlbGVjdGlvbi5cbiAgZnVuY3Rpb24gc2V0U2VsZWN0aW9uKGRvYywgc2VsLCBvcHRpb25zKSB7XG4gICAgc2V0U2VsZWN0aW9uTm9VbmRvKGRvYywgc2VsLCBvcHRpb25zKTtcbiAgICBhZGRTZWxlY3Rpb25Ub0hpc3RvcnkoZG9jLCBkb2Muc2VsLCBkb2MuY20gPyBkb2MuY20uY3VyT3AuaWQgOiBOYU4sIG9wdGlvbnMpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0U2VsZWN0aW9uTm9VbmRvKGRvYywgc2VsLCBvcHRpb25zKSB7XG4gICAgaWYgKGhhc0hhbmRsZXIoZG9jLCBcImJlZm9yZVNlbGVjdGlvbkNoYW5nZVwiKSB8fCBkb2MuY20gJiYgaGFzSGFuZGxlcihkb2MuY20sIFwiYmVmb3JlU2VsZWN0aW9uQ2hhbmdlXCIpKVxuICAgICAgeyBzZWwgPSBmaWx0ZXJTZWxlY3Rpb25DaGFuZ2UoZG9jLCBzZWwsIG9wdGlvbnMpOyB9XG5cbiAgICB2YXIgYmlhcyA9IG9wdGlvbnMgJiYgb3B0aW9ucy5iaWFzIHx8XG4gICAgICAoY21wKHNlbC5wcmltYXJ5KCkuaGVhZCwgZG9jLnNlbC5wcmltYXJ5KCkuaGVhZCkgPCAwID8gLTEgOiAxKTtcbiAgICBzZXRTZWxlY3Rpb25Jbm5lcihkb2MsIHNraXBBdG9taWNJblNlbGVjdGlvbihkb2MsIHNlbCwgYmlhcywgdHJ1ZSkpO1xuXG4gICAgaWYgKCEob3B0aW9ucyAmJiBvcHRpb25zLnNjcm9sbCA9PT0gZmFsc2UpICYmIGRvYy5jbSlcbiAgICAgIHsgZW5zdXJlQ3Vyc29yVmlzaWJsZShkb2MuY20pOyB9XG4gIH1cblxuICBmdW5jdGlvbiBzZXRTZWxlY3Rpb25Jbm5lcihkb2MsIHNlbCkge1xuICAgIGlmIChzZWwuZXF1YWxzKGRvYy5zZWwpKSB7IHJldHVybiB9XG5cbiAgICBkb2Muc2VsID0gc2VsO1xuXG4gICAgaWYgKGRvYy5jbSkge1xuICAgICAgZG9jLmNtLmN1ck9wLnVwZGF0ZUlucHV0ID0gMTtcbiAgICAgIGRvYy5jbS5jdXJPcC5zZWxlY3Rpb25DaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIHNpZ25hbEN1cnNvckFjdGl2aXR5KGRvYy5jbSk7XG4gICAgfVxuICAgIHNpZ25hbExhdGVyKGRvYywgXCJjdXJzb3JBY3Rpdml0eVwiLCBkb2MpO1xuICB9XG5cbiAgLy8gVmVyaWZ5IHRoYXQgdGhlIHNlbGVjdGlvbiBkb2VzIG5vdCBwYXJ0aWFsbHkgc2VsZWN0IGFueSBhdG9taWNcbiAgLy8gbWFya2VkIHJhbmdlcy5cbiAgZnVuY3Rpb24gcmVDaGVja1NlbGVjdGlvbihkb2MpIHtcbiAgICBzZXRTZWxlY3Rpb25Jbm5lcihkb2MsIHNraXBBdG9taWNJblNlbGVjdGlvbihkb2MsIGRvYy5zZWwsIG51bGwsIGZhbHNlKSk7XG4gIH1cblxuICAvLyBSZXR1cm4gYSBzZWxlY3Rpb24gdGhhdCBkb2VzIG5vdCBwYXJ0aWFsbHkgc2VsZWN0IGFueSBhdG9taWNcbiAgLy8gcmFuZ2VzLlxuICBmdW5jdGlvbiBza2lwQXRvbWljSW5TZWxlY3Rpb24oZG9jLCBzZWwsIGJpYXMsIG1heUNsZWFyKSB7XG4gICAgdmFyIG91dDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbC5yYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciByYW5nZSA9IHNlbC5yYW5nZXNbaV07XG4gICAgICB2YXIgb2xkID0gc2VsLnJhbmdlcy5sZW5ndGggPT0gZG9jLnNlbC5yYW5nZXMubGVuZ3RoICYmIGRvYy5zZWwucmFuZ2VzW2ldO1xuICAgICAgdmFyIG5ld0FuY2hvciA9IHNraXBBdG9taWMoZG9jLCByYW5nZS5hbmNob3IsIG9sZCAmJiBvbGQuYW5jaG9yLCBiaWFzLCBtYXlDbGVhcik7XG4gICAgICB2YXIgbmV3SGVhZCA9IHNraXBBdG9taWMoZG9jLCByYW5nZS5oZWFkLCBvbGQgJiYgb2xkLmhlYWQsIGJpYXMsIG1heUNsZWFyKTtcbiAgICAgIGlmIChvdXQgfHwgbmV3QW5jaG9yICE9IHJhbmdlLmFuY2hvciB8fCBuZXdIZWFkICE9IHJhbmdlLmhlYWQpIHtcbiAgICAgICAgaWYgKCFvdXQpIHsgb3V0ID0gc2VsLnJhbmdlcy5zbGljZSgwLCBpKTsgfVxuICAgICAgICBvdXRbaV0gPSBuZXcgUmFuZ2UobmV3QW5jaG9yLCBuZXdIZWFkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dCA/IG5vcm1hbGl6ZVNlbGVjdGlvbihkb2MuY20sIG91dCwgc2VsLnByaW1JbmRleCkgOiBzZWxcbiAgfVxuXG4gIGZ1bmN0aW9uIHNraXBBdG9taWNJbm5lcihkb2MsIHBvcywgb2xkUG9zLCBkaXIsIG1heUNsZWFyKSB7XG4gICAgdmFyIGxpbmUgPSBnZXRMaW5lKGRvYywgcG9zLmxpbmUpO1xuICAgIGlmIChsaW5lLm1hcmtlZFNwYW5zKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgbGluZS5tYXJrZWRTcGFucy5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIHNwID0gbGluZS5tYXJrZWRTcGFuc1tpXSwgbSA9IHNwLm1hcmtlcjtcblxuICAgICAgLy8gRGV0ZXJtaW5lIGlmIHdlIHNob3VsZCBwcmV2ZW50IHRoZSBjdXJzb3IgYmVpbmcgcGxhY2VkIHRvIHRoZSBsZWZ0L3JpZ2h0IG9mIGFuIGF0b21pYyBtYXJrZXJcbiAgICAgIC8vIEhpc3RvcmljYWxseSB0aGlzIHdhcyBkZXRlcm1pbmVkIHVzaW5nIHRoZSBpbmNsdXNpdmVMZWZ0L1JpZ2h0IG9wdGlvbiwgYnV0IHRoZSBuZXcgd2F5IHRvIGNvbnRyb2wgaXRcbiAgICAgIC8vIGlzIHdpdGggc2VsZWN0TGVmdC9SaWdodFxuICAgICAgdmFyIHByZXZlbnRDdXJzb3JMZWZ0ID0gKFwic2VsZWN0TGVmdFwiIGluIG0pID8gIW0uc2VsZWN0TGVmdCA6IG0uaW5jbHVzaXZlTGVmdDtcbiAgICAgIHZhciBwcmV2ZW50Q3Vyc29yUmlnaHQgPSAoXCJzZWxlY3RSaWdodFwiIGluIG0pID8gIW0uc2VsZWN0UmlnaHQgOiBtLmluY2x1c2l2ZVJpZ2h0O1xuXG4gICAgICBpZiAoKHNwLmZyb20gPT0gbnVsbCB8fCAocHJldmVudEN1cnNvckxlZnQgPyBzcC5mcm9tIDw9IHBvcy5jaCA6IHNwLmZyb20gPCBwb3MuY2gpKSAmJlxuICAgICAgICAgIChzcC50byA9PSBudWxsIHx8IChwcmV2ZW50Q3Vyc29yUmlnaHQgPyBzcC50byA+PSBwb3MuY2ggOiBzcC50byA+IHBvcy5jaCkpKSB7XG4gICAgICAgIGlmIChtYXlDbGVhcikge1xuICAgICAgICAgIHNpZ25hbChtLCBcImJlZm9yZUN1cnNvckVudGVyXCIpO1xuICAgICAgICAgIGlmIChtLmV4cGxpY2l0bHlDbGVhcmVkKSB7XG4gICAgICAgICAgICBpZiAoIWxpbmUubWFya2VkU3BhbnMpIHsgYnJlYWsgfVxuICAgICAgICAgICAgZWxzZSB7LS1pOyBjb250aW51ZX1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtLmF0b21pYykgeyBjb250aW51ZSB9XG5cbiAgICAgICAgaWYgKG9sZFBvcykge1xuICAgICAgICAgIHZhciBuZWFyID0gbS5maW5kKGRpciA8IDAgPyAxIDogLTEpLCBkaWZmID0gKHZvaWQgMCk7XG4gICAgICAgICAgaWYgKGRpciA8IDAgPyBwcmV2ZW50Q3Vyc29yUmlnaHQgOiBwcmV2ZW50Q3Vyc29yTGVmdClcbiAgICAgICAgICAgIHsgbmVhciA9IG1vdmVQb3MoZG9jLCBuZWFyLCAtZGlyLCBuZWFyICYmIG5lYXIubGluZSA9PSBwb3MubGluZSA/IGxpbmUgOiBudWxsKTsgfVxuICAgICAgICAgIGlmIChuZWFyICYmIG5lYXIubGluZSA9PSBwb3MubGluZSAmJiAoZGlmZiA9IGNtcChuZWFyLCBvbGRQb3MpKSAmJiAoZGlyIDwgMCA/IGRpZmYgPCAwIDogZGlmZiA+IDApKVxuICAgICAgICAgICAgeyByZXR1cm4gc2tpcEF0b21pY0lubmVyKGRvYywgbmVhciwgcG9zLCBkaXIsIG1heUNsZWFyKSB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZmFyID0gbS5maW5kKGRpciA8IDAgPyAtMSA6IDEpO1xuICAgICAgICBpZiAoZGlyIDwgMCA/IHByZXZlbnRDdXJzb3JMZWZ0IDogcHJldmVudEN1cnNvclJpZ2h0KVxuICAgICAgICAgIHsgZmFyID0gbW92ZVBvcyhkb2MsIGZhciwgZGlyLCBmYXIubGluZSA9PSBwb3MubGluZSA/IGxpbmUgOiBudWxsKTsgfVxuICAgICAgICByZXR1cm4gZmFyID8gc2tpcEF0b21pY0lubmVyKGRvYywgZmFyLCBwb3MsIGRpciwgbWF5Q2xlYXIpIDogbnVsbFxuICAgICAgfVxuICAgIH0gfVxuICAgIHJldHVybiBwb3NcbiAgfVxuXG4gIC8vIEVuc3VyZSBhIGdpdmVuIHBvc2l0aW9uIGlzIG5vdCBpbnNpZGUgYW4gYXRvbWljIHJhbmdlLlxuICBmdW5jdGlvbiBza2lwQXRvbWljKGRvYywgcG9zLCBvbGRQb3MsIGJpYXMsIG1heUNsZWFyKSB7XG4gICAgdmFyIGRpciA9IGJpYXMgfHwgMTtcbiAgICB2YXIgZm91bmQgPSBza2lwQXRvbWljSW5uZXIoZG9jLCBwb3MsIG9sZFBvcywgZGlyLCBtYXlDbGVhcikgfHxcbiAgICAgICAgKCFtYXlDbGVhciAmJiBza2lwQXRvbWljSW5uZXIoZG9jLCBwb3MsIG9sZFBvcywgZGlyLCB0cnVlKSkgfHxcbiAgICAgICAgc2tpcEF0b21pY0lubmVyKGRvYywgcG9zLCBvbGRQb3MsIC1kaXIsIG1heUNsZWFyKSB8fFxuICAgICAgICAoIW1heUNsZWFyICYmIHNraXBBdG9taWNJbm5lcihkb2MsIHBvcywgb2xkUG9zLCAtZGlyLCB0cnVlKSk7XG4gICAgaWYgKCFmb3VuZCkge1xuICAgICAgZG9jLmNhbnRFZGl0ID0gdHJ1ZTtcbiAgICAgIHJldHVybiBQb3MoZG9jLmZpcnN0LCAwKVxuICAgIH1cbiAgICByZXR1cm4gZm91bmRcbiAgfVxuXG4gIGZ1bmN0aW9uIG1vdmVQb3MoZG9jLCBwb3MsIGRpciwgbGluZSkge1xuICAgIGlmIChkaXIgPCAwICYmIHBvcy5jaCA9PSAwKSB7XG4gICAgICBpZiAocG9zLmxpbmUgPiBkb2MuZmlyc3QpIHsgcmV0dXJuIGNsaXBQb3MoZG9jLCBQb3MocG9zLmxpbmUgLSAxKSkgfVxuICAgICAgZWxzZSB7IHJldHVybiBudWxsIH1cbiAgICB9IGVsc2UgaWYgKGRpciA+IDAgJiYgcG9zLmNoID09IChsaW5lIHx8IGdldExpbmUoZG9jLCBwb3MubGluZSkpLnRleHQubGVuZ3RoKSB7XG4gICAgICBpZiAocG9zLmxpbmUgPCBkb2MuZmlyc3QgKyBkb2Muc2l6ZSAtIDEpIHsgcmV0dXJuIFBvcyhwb3MubGluZSArIDEsIDApIH1cbiAgICAgIGVsc2UgeyByZXR1cm4gbnVsbCB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgUG9zKHBvcy5saW5lLCBwb3MuY2ggKyBkaXIpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2VsZWN0QWxsKGNtKSB7XG4gICAgY20uc2V0U2VsZWN0aW9uKFBvcyhjbS5maXJzdExpbmUoKSwgMCksIFBvcyhjbS5sYXN0TGluZSgpKSwgc2VsX2RvbnRTY3JvbGwpO1xuICB9XG5cbiAgLy8gVVBEQVRJTkdcblxuICAvLyBBbGxvdyBcImJlZm9yZUNoYW5nZVwiIGV2ZW50IGhhbmRsZXJzIHRvIGluZmx1ZW5jZSBhIGNoYW5nZVxuICBmdW5jdGlvbiBmaWx0ZXJDaGFuZ2UoZG9jLCBjaGFuZ2UsIHVwZGF0ZSkge1xuICAgIHZhciBvYmogPSB7XG4gICAgICBjYW5jZWxlZDogZmFsc2UsXG4gICAgICBmcm9tOiBjaGFuZ2UuZnJvbSxcbiAgICAgIHRvOiBjaGFuZ2UudG8sXG4gICAgICB0ZXh0OiBjaGFuZ2UudGV4dCxcbiAgICAgIG9yaWdpbjogY2hhbmdlLm9yaWdpbixcbiAgICAgIGNhbmNlbDogZnVuY3Rpb24gKCkgeyByZXR1cm4gb2JqLmNhbmNlbGVkID0gdHJ1ZTsgfVxuICAgIH07XG4gICAgaWYgKHVwZGF0ZSkgeyBvYmoudXBkYXRlID0gZnVuY3Rpb24gKGZyb20sIHRvLCB0ZXh0LCBvcmlnaW4pIHtcbiAgICAgIGlmIChmcm9tKSB7IG9iai5mcm9tID0gY2xpcFBvcyhkb2MsIGZyb20pOyB9XG4gICAgICBpZiAodG8pIHsgb2JqLnRvID0gY2xpcFBvcyhkb2MsIHRvKTsgfVxuICAgICAgaWYgKHRleHQpIHsgb2JqLnRleHQgPSB0ZXh0OyB9XG4gICAgICBpZiAob3JpZ2luICE9PSB1bmRlZmluZWQpIHsgb2JqLm9yaWdpbiA9IG9yaWdpbjsgfVxuICAgIH07IH1cbiAgICBzaWduYWwoZG9jLCBcImJlZm9yZUNoYW5nZVwiLCBkb2MsIG9iaik7XG4gICAgaWYgKGRvYy5jbSkgeyBzaWduYWwoZG9jLmNtLCBcImJlZm9yZUNoYW5nZVwiLCBkb2MuY20sIG9iaik7IH1cblxuICAgIGlmIChvYmouY2FuY2VsZWQpIHtcbiAgICAgIGlmIChkb2MuY20pIHsgZG9jLmNtLmN1ck9wLnVwZGF0ZUlucHV0ID0gMjsgfVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gICAgcmV0dXJuIHtmcm9tOiBvYmouZnJvbSwgdG86IG9iai50bywgdGV4dDogb2JqLnRleHQsIG9yaWdpbjogb2JqLm9yaWdpbn1cbiAgfVxuXG4gIC8vIEFwcGx5IGEgY2hhbmdlIHRvIGEgZG9jdW1lbnQsIGFuZCBhZGQgaXQgdG8gdGhlIGRvY3VtZW50J3NcbiAgLy8gaGlzdG9yeSwgYW5kIHByb3BhZ2F0aW5nIGl0IHRvIGFsbCBsaW5rZWQgZG9jdW1lbnRzLlxuICBmdW5jdGlvbiBtYWtlQ2hhbmdlKGRvYywgY2hhbmdlLCBpZ25vcmVSZWFkT25seSkge1xuICAgIGlmIChkb2MuY20pIHtcbiAgICAgIGlmICghZG9jLmNtLmN1ck9wKSB7IHJldHVybiBvcGVyYXRpb24oZG9jLmNtLCBtYWtlQ2hhbmdlKShkb2MsIGNoYW5nZSwgaWdub3JlUmVhZE9ubHkpIH1cbiAgICAgIGlmIChkb2MuY20uc3RhdGUuc3VwcHJlc3NFZGl0cykgeyByZXR1cm4gfVxuICAgIH1cblxuICAgIGlmIChoYXNIYW5kbGVyKGRvYywgXCJiZWZvcmVDaGFuZ2VcIikgfHwgZG9jLmNtICYmIGhhc0hhbmRsZXIoZG9jLmNtLCBcImJlZm9yZUNoYW5nZVwiKSkge1xuICAgICAgY2hhbmdlID0gZmlsdGVyQ2hhbmdlKGRvYywgY2hhbmdlLCB0cnVlKTtcbiAgICAgIGlmICghY2hhbmdlKSB7IHJldHVybiB9XG4gICAgfVxuXG4gICAgLy8gUG9zc2libHkgc3BsaXQgb3Igc3VwcHJlc3MgdGhlIHVwZGF0ZSBiYXNlZCBvbiB0aGUgcHJlc2VuY2VcbiAgICAvLyBvZiByZWFkLW9ubHkgc3BhbnMgaW4gaXRzIHJhbmdlLlxuICAgIHZhciBzcGxpdCA9IHNhd1JlYWRPbmx5U3BhbnMgJiYgIWlnbm9yZVJlYWRPbmx5ICYmIHJlbW92ZVJlYWRPbmx5UmFuZ2VzKGRvYywgY2hhbmdlLmZyb20sIGNoYW5nZS50byk7XG4gICAgaWYgKHNwbGl0KSB7XG4gICAgICBmb3IgKHZhciBpID0gc3BsaXQubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpXG4gICAgICAgIHsgbWFrZUNoYW5nZUlubmVyKGRvYywge2Zyb206IHNwbGl0W2ldLmZyb20sIHRvOiBzcGxpdFtpXS50bywgdGV4dDogaSA/IFtcIlwiXSA6IGNoYW5nZS50ZXh0LCBvcmlnaW46IGNoYW5nZS5vcmlnaW59KTsgfVxuICAgIH0gZWxzZSB7XG4gICAgICBtYWtlQ2hhbmdlSW5uZXIoZG9jLCBjaGFuZ2UpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG1ha2VDaGFuZ2VJbm5lcihkb2MsIGNoYW5nZSkge1xuICAgIGlmIChjaGFuZ2UudGV4dC5sZW5ndGggPT0gMSAmJiBjaGFuZ2UudGV4dFswXSA9PSBcIlwiICYmIGNtcChjaGFuZ2UuZnJvbSwgY2hhbmdlLnRvKSA9PSAwKSB7IHJldHVybiB9XG4gICAgdmFyIHNlbEFmdGVyID0gY29tcHV0ZVNlbEFmdGVyQ2hhbmdlKGRvYywgY2hhbmdlKTtcbiAgICBhZGRDaGFuZ2VUb0hpc3RvcnkoZG9jLCBjaGFuZ2UsIHNlbEFmdGVyLCBkb2MuY20gPyBkb2MuY20uY3VyT3AuaWQgOiBOYU4pO1xuXG4gICAgbWFrZUNoYW5nZVNpbmdsZURvYyhkb2MsIGNoYW5nZSwgc2VsQWZ0ZXIsIHN0cmV0Y2hTcGFuc092ZXJDaGFuZ2UoZG9jLCBjaGFuZ2UpKTtcbiAgICB2YXIgcmViYXNlZCA9IFtdO1xuXG4gICAgbGlua2VkRG9jcyhkb2MsIGZ1bmN0aW9uIChkb2MsIHNoYXJlZEhpc3QpIHtcbiAgICAgIGlmICghc2hhcmVkSGlzdCAmJiBpbmRleE9mKHJlYmFzZWQsIGRvYy5oaXN0b3J5KSA9PSAtMSkge1xuICAgICAgICByZWJhc2VIaXN0KGRvYy5oaXN0b3J5LCBjaGFuZ2UpO1xuICAgICAgICByZWJhc2VkLnB1c2goZG9jLmhpc3RvcnkpO1xuICAgICAgfVxuICAgICAgbWFrZUNoYW5nZVNpbmdsZURvYyhkb2MsIGNoYW5nZSwgbnVsbCwgc3RyZXRjaFNwYW5zT3ZlckNoYW5nZShkb2MsIGNoYW5nZSkpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gUmV2ZXJ0IGEgY2hhbmdlIHN0b3JlZCBpbiBhIGRvY3VtZW50J3MgaGlzdG9yeS5cbiAgZnVuY3Rpb24gbWFrZUNoYW5nZUZyb21IaXN0b3J5KGRvYywgdHlwZSwgYWxsb3dTZWxlY3Rpb25Pbmx5KSB7XG4gICAgdmFyIHN1cHByZXNzID0gZG9jLmNtICYmIGRvYy5jbS5zdGF0ZS5zdXBwcmVzc0VkaXRzO1xuICAgIGlmIChzdXBwcmVzcyAmJiAhYWxsb3dTZWxlY3Rpb25Pbmx5KSB7IHJldHVybiB9XG5cbiAgICB2YXIgaGlzdCA9IGRvYy5oaXN0b3J5LCBldmVudCwgc2VsQWZ0ZXIgPSBkb2Muc2VsO1xuICAgIHZhciBzb3VyY2UgPSB0eXBlID09IFwidW5kb1wiID8gaGlzdC5kb25lIDogaGlzdC51bmRvbmUsIGRlc3QgPSB0eXBlID09IFwidW5kb1wiID8gaGlzdC51bmRvbmUgOiBoaXN0LmRvbmU7XG5cbiAgICAvLyBWZXJpZnkgdGhhdCB0aGVyZSBpcyBhIHVzZWFibGUgZXZlbnQgKHNvIHRoYXQgY3RybC16IHdvbid0XG4gICAgLy8gbmVlZGxlc3NseSBjbGVhciBzZWxlY3Rpb24gZXZlbnRzKVxuICAgIHZhciBpID0gMDtcbiAgICBmb3IgKDsgaSA8IHNvdXJjZS5sZW5ndGg7IGkrKykge1xuICAgICAgZXZlbnQgPSBzb3VyY2VbaV07XG4gICAgICBpZiAoYWxsb3dTZWxlY3Rpb25Pbmx5ID8gZXZlbnQucmFuZ2VzICYmICFldmVudC5lcXVhbHMoZG9jLnNlbCkgOiAhZXZlbnQucmFuZ2VzKVxuICAgICAgICB7IGJyZWFrIH1cbiAgICB9XG4gICAgaWYgKGkgPT0gc291cmNlLmxlbmd0aCkgeyByZXR1cm4gfVxuICAgIGhpc3QubGFzdE9yaWdpbiA9IGhpc3QubGFzdFNlbE9yaWdpbiA9IG51bGw7XG5cbiAgICBmb3IgKDs7KSB7XG4gICAgICBldmVudCA9IHNvdXJjZS5wb3AoKTtcbiAgICAgIGlmIChldmVudC5yYW5nZXMpIHtcbiAgICAgICAgcHVzaFNlbGVjdGlvblRvSGlzdG9yeShldmVudCwgZGVzdCk7XG4gICAgICAgIGlmIChhbGxvd1NlbGVjdGlvbk9ubHkgJiYgIWV2ZW50LmVxdWFscyhkb2Muc2VsKSkge1xuICAgICAgICAgIHNldFNlbGVjdGlvbihkb2MsIGV2ZW50LCB7Y2xlYXJSZWRvOiBmYWxzZX0pO1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIHNlbEFmdGVyID0gZXZlbnQ7XG4gICAgICB9IGVsc2UgaWYgKHN1cHByZXNzKSB7XG4gICAgICAgIHNvdXJjZS5wdXNoKGV2ZW50KTtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9IGVsc2UgeyBicmVhayB9XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgdXAgYSByZXZlcnNlIGNoYW5nZSBvYmplY3QgdG8gYWRkIHRvIHRoZSBvcHBvc2l0ZSBoaXN0b3J5XG4gICAgLy8gc3RhY2sgKHJlZG8gd2hlbiB1bmRvaW5nLCBhbmQgdmljZSB2ZXJzYSkuXG4gICAgdmFyIGFudGlDaGFuZ2VzID0gW107XG4gICAgcHVzaFNlbGVjdGlvblRvSGlzdG9yeShzZWxBZnRlciwgZGVzdCk7XG4gICAgZGVzdC5wdXNoKHtjaGFuZ2VzOiBhbnRpQ2hhbmdlcywgZ2VuZXJhdGlvbjogaGlzdC5nZW5lcmF0aW9ufSk7XG4gICAgaGlzdC5nZW5lcmF0aW9uID0gZXZlbnQuZ2VuZXJhdGlvbiB8fCArK2hpc3QubWF4R2VuZXJhdGlvbjtcblxuICAgIHZhciBmaWx0ZXIgPSBoYXNIYW5kbGVyKGRvYywgXCJiZWZvcmVDaGFuZ2VcIikgfHwgZG9jLmNtICYmIGhhc0hhbmRsZXIoZG9jLmNtLCBcImJlZm9yZUNoYW5nZVwiKTtcblxuICAgIHZhciBsb29wID0gZnVuY3Rpb24gKCBpICkge1xuICAgICAgdmFyIGNoYW5nZSA9IGV2ZW50LmNoYW5nZXNbaV07XG4gICAgICBjaGFuZ2Uub3JpZ2luID0gdHlwZTtcbiAgICAgIGlmIChmaWx0ZXIgJiYgIWZpbHRlckNoYW5nZShkb2MsIGNoYW5nZSwgZmFsc2UpKSB7XG4gICAgICAgIHNvdXJjZS5sZW5ndGggPSAwO1xuICAgICAgICByZXR1cm4ge31cbiAgICAgIH1cblxuICAgICAgYW50aUNoYW5nZXMucHVzaChoaXN0b3J5Q2hhbmdlRnJvbUNoYW5nZShkb2MsIGNoYW5nZSkpO1xuXG4gICAgICB2YXIgYWZ0ZXIgPSBpID8gY29tcHV0ZVNlbEFmdGVyQ2hhbmdlKGRvYywgY2hhbmdlKSA6IGxzdChzb3VyY2UpO1xuICAgICAgbWFrZUNoYW5nZVNpbmdsZURvYyhkb2MsIGNoYW5nZSwgYWZ0ZXIsIG1lcmdlT2xkU3BhbnMoZG9jLCBjaGFuZ2UpKTtcbiAgICAgIGlmICghaSAmJiBkb2MuY20pIHsgZG9jLmNtLnNjcm9sbEludG9WaWV3KHtmcm9tOiBjaGFuZ2UuZnJvbSwgdG86IGNoYW5nZUVuZChjaGFuZ2UpfSk7IH1cbiAgICAgIHZhciByZWJhc2VkID0gW107XG5cbiAgICAgIC8vIFByb3BhZ2F0ZSB0byB0aGUgbGlua2VkIGRvY3VtZW50c1xuICAgICAgbGlua2VkRG9jcyhkb2MsIGZ1bmN0aW9uIChkb2MsIHNoYXJlZEhpc3QpIHtcbiAgICAgICAgaWYgKCFzaGFyZWRIaXN0ICYmIGluZGV4T2YocmViYXNlZCwgZG9jLmhpc3RvcnkpID09IC0xKSB7XG4gICAgICAgICAgcmViYXNlSGlzdChkb2MuaGlzdG9yeSwgY2hhbmdlKTtcbiAgICAgICAgICByZWJhc2VkLnB1c2goZG9jLmhpc3RvcnkpO1xuICAgICAgICB9XG4gICAgICAgIG1ha2VDaGFuZ2VTaW5nbGVEb2MoZG9jLCBjaGFuZ2UsIG51bGwsIG1lcmdlT2xkU3BhbnMoZG9jLCBjaGFuZ2UpKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBmb3IgKHZhciBpJDEgPSBldmVudC5jaGFuZ2VzLmxlbmd0aCAtIDE7IGkkMSA+PSAwOyAtLWkkMSkge1xuICAgICAgdmFyIHJldHVybmVkID0gbG9vcCggaSQxICk7XG5cbiAgICAgIGlmICggcmV0dXJuZWQgKSByZXR1cm4gcmV0dXJuZWQudjtcbiAgICB9XG4gIH1cblxuICAvLyBTdWItdmlld3MgbmVlZCB0aGVpciBsaW5lIG51bWJlcnMgc2hpZnRlZCB3aGVuIHRleHQgaXMgYWRkZWRcbiAgLy8gYWJvdmUgb3IgYmVsb3cgdGhlbSBpbiB0aGUgcGFyZW50IGRvY3VtZW50LlxuICBmdW5jdGlvbiBzaGlmdERvYyhkb2MsIGRpc3RhbmNlKSB7XG4gICAgaWYgKGRpc3RhbmNlID09IDApIHsgcmV0dXJuIH1cbiAgICBkb2MuZmlyc3QgKz0gZGlzdGFuY2U7XG4gICAgZG9jLnNlbCA9IG5ldyBTZWxlY3Rpb24obWFwKGRvYy5zZWwucmFuZ2VzLCBmdW5jdGlvbiAocmFuZ2UpIHsgcmV0dXJuIG5ldyBSYW5nZShcbiAgICAgIFBvcyhyYW5nZS5hbmNob3IubGluZSArIGRpc3RhbmNlLCByYW5nZS5hbmNob3IuY2gpLFxuICAgICAgUG9zKHJhbmdlLmhlYWQubGluZSArIGRpc3RhbmNlLCByYW5nZS5oZWFkLmNoKVxuICAgICk7IH0pLCBkb2Muc2VsLnByaW1JbmRleCk7XG4gICAgaWYgKGRvYy5jbSkge1xuICAgICAgcmVnQ2hhbmdlKGRvYy5jbSwgZG9jLmZpcnN0LCBkb2MuZmlyc3QgLSBkaXN0YW5jZSwgZGlzdGFuY2UpO1xuICAgICAgZm9yICh2YXIgZCA9IGRvYy5jbS5kaXNwbGF5LCBsID0gZC52aWV3RnJvbTsgbCA8IGQudmlld1RvOyBsKyspXG4gICAgICAgIHsgcmVnTGluZUNoYW5nZShkb2MuY20sIGwsIFwiZ3V0dGVyXCIpOyB9XG4gICAgfVxuICB9XG5cbiAgLy8gTW9yZSBsb3dlci1sZXZlbCBjaGFuZ2UgZnVuY3Rpb24sIGhhbmRsaW5nIG9ubHkgYSBzaW5nbGUgZG9jdW1lbnRcbiAgLy8gKG5vdCBsaW5rZWQgb25lcykuXG4gIGZ1bmN0aW9uIG1ha2VDaGFuZ2VTaW5nbGVEb2MoZG9jLCBjaGFuZ2UsIHNlbEFmdGVyLCBzcGFucykge1xuICAgIGlmIChkb2MuY20gJiYgIWRvYy5jbS5jdXJPcClcbiAgICAgIHsgcmV0dXJuIG9wZXJhdGlvbihkb2MuY20sIG1ha2VDaGFuZ2VTaW5nbGVEb2MpKGRvYywgY2hhbmdlLCBzZWxBZnRlciwgc3BhbnMpIH1cblxuICAgIGlmIChjaGFuZ2UudG8ubGluZSA8IGRvYy5maXJzdCkge1xuICAgICAgc2hpZnREb2MoZG9jLCBjaGFuZ2UudGV4dC5sZW5ndGggLSAxIC0gKGNoYW5nZS50by5saW5lIC0gY2hhbmdlLmZyb20ubGluZSkpO1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChjaGFuZ2UuZnJvbS5saW5lID4gZG9jLmxhc3RMaW5lKCkpIHsgcmV0dXJuIH1cblxuICAgIC8vIENsaXAgdGhlIGNoYW5nZSB0byB0aGUgc2l6ZSBvZiB0aGlzIGRvY1xuICAgIGlmIChjaGFuZ2UuZnJvbS5saW5lIDwgZG9jLmZpcnN0KSB7XG4gICAgICB2YXIgc2hpZnQgPSBjaGFuZ2UudGV4dC5sZW5ndGggLSAxIC0gKGRvYy5maXJzdCAtIGNoYW5nZS5mcm9tLmxpbmUpO1xuICAgICAgc2hpZnREb2MoZG9jLCBzaGlmdCk7XG4gICAgICBjaGFuZ2UgPSB7ZnJvbTogUG9zKGRvYy5maXJzdCwgMCksIHRvOiBQb3MoY2hhbmdlLnRvLmxpbmUgKyBzaGlmdCwgY2hhbmdlLnRvLmNoKSxcbiAgICAgICAgICAgICAgICB0ZXh0OiBbbHN0KGNoYW5nZS50ZXh0KV0sIG9yaWdpbjogY2hhbmdlLm9yaWdpbn07XG4gICAgfVxuICAgIHZhciBsYXN0ID0gZG9jLmxhc3RMaW5lKCk7XG4gICAgaWYgKGNoYW5nZS50by5saW5lID4gbGFzdCkge1xuICAgICAgY2hhbmdlID0ge2Zyb206IGNoYW5nZS5mcm9tLCB0bzogUG9zKGxhc3QsIGdldExpbmUoZG9jLCBsYXN0KS50ZXh0Lmxlbmd0aCksXG4gICAgICAgICAgICAgICAgdGV4dDogW2NoYW5nZS50ZXh0WzBdXSwgb3JpZ2luOiBjaGFuZ2Uub3JpZ2lufTtcbiAgICB9XG5cbiAgICBjaGFuZ2UucmVtb3ZlZCA9IGdldEJldHdlZW4oZG9jLCBjaGFuZ2UuZnJvbSwgY2hhbmdlLnRvKTtcblxuICAgIGlmICghc2VsQWZ0ZXIpIHsgc2VsQWZ0ZXIgPSBjb21wdXRlU2VsQWZ0ZXJDaGFuZ2UoZG9jLCBjaGFuZ2UpOyB9XG4gICAgaWYgKGRvYy5jbSkgeyBtYWtlQ2hhbmdlU2luZ2xlRG9jSW5FZGl0b3IoZG9jLmNtLCBjaGFuZ2UsIHNwYW5zKTsgfVxuICAgIGVsc2UgeyB1cGRhdGVEb2MoZG9jLCBjaGFuZ2UsIHNwYW5zKTsgfVxuICAgIHNldFNlbGVjdGlvbk5vVW5kbyhkb2MsIHNlbEFmdGVyLCBzZWxfZG9udFNjcm9sbCk7XG5cbiAgICBpZiAoZG9jLmNhbnRFZGl0ICYmIHNraXBBdG9taWMoZG9jLCBQb3MoZG9jLmZpcnN0TGluZSgpLCAwKSkpXG4gICAgICB7IGRvYy5jYW50RWRpdCA9IGZhbHNlOyB9XG4gIH1cblxuICAvLyBIYW5kbGUgdGhlIGludGVyYWN0aW9uIG9mIGEgY2hhbmdlIHRvIGEgZG9jdW1lbnQgd2l0aCB0aGUgZWRpdG9yXG4gIC8vIHRoYXQgdGhpcyBkb2N1bWVudCBpcyBwYXJ0IG9mLlxuICBmdW5jdGlvbiBtYWtlQ2hhbmdlU2luZ2xlRG9jSW5FZGl0b3IoY20sIGNoYW5nZSwgc3BhbnMpIHtcbiAgICB2YXIgZG9jID0gY20uZG9jLCBkaXNwbGF5ID0gY20uZGlzcGxheSwgZnJvbSA9IGNoYW5nZS5mcm9tLCB0byA9IGNoYW5nZS50bztcblxuICAgIHZhciByZWNvbXB1dGVNYXhMZW5ndGggPSBmYWxzZSwgY2hlY2tXaWR0aFN0YXJ0ID0gZnJvbS5saW5lO1xuICAgIGlmICghY20ub3B0aW9ucy5saW5lV3JhcHBpbmcpIHtcbiAgICAgIGNoZWNrV2lkdGhTdGFydCA9IGxpbmVObyh2aXN1YWxMaW5lKGdldExpbmUoZG9jLCBmcm9tLmxpbmUpKSk7XG4gICAgICBkb2MuaXRlcihjaGVja1dpZHRoU3RhcnQsIHRvLmxpbmUgKyAxLCBmdW5jdGlvbiAobGluZSkge1xuICAgICAgICBpZiAobGluZSA9PSBkaXNwbGF5Lm1heExpbmUpIHtcbiAgICAgICAgICByZWNvbXB1dGVNYXhMZW5ndGggPSB0cnVlO1xuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChkb2Muc2VsLmNvbnRhaW5zKGNoYW5nZS5mcm9tLCBjaGFuZ2UudG8pID4gLTEpXG4gICAgICB7IHNpZ25hbEN1cnNvckFjdGl2aXR5KGNtKTsgfVxuXG4gICAgdXBkYXRlRG9jKGRvYywgY2hhbmdlLCBzcGFucywgZXN0aW1hdGVIZWlnaHQoY20pKTtcblxuICAgIGlmICghY20ub3B0aW9ucy5saW5lV3JhcHBpbmcpIHtcbiAgICAgIGRvYy5pdGVyKGNoZWNrV2lkdGhTdGFydCwgZnJvbS5saW5lICsgY2hhbmdlLnRleHQubGVuZ3RoLCBmdW5jdGlvbiAobGluZSkge1xuICAgICAgICB2YXIgbGVuID0gbGluZUxlbmd0aChsaW5lKTtcbiAgICAgICAgaWYgKGxlbiA+IGRpc3BsYXkubWF4TGluZUxlbmd0aCkge1xuICAgICAgICAgIGRpc3BsYXkubWF4TGluZSA9IGxpbmU7XG4gICAgICAgICAgZGlzcGxheS5tYXhMaW5lTGVuZ3RoID0gbGVuO1xuICAgICAgICAgIGRpc3BsYXkubWF4TGluZUNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgIHJlY29tcHV0ZU1heExlbmd0aCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmIChyZWNvbXB1dGVNYXhMZW5ndGgpIHsgY20uY3VyT3AudXBkYXRlTWF4TGluZSA9IHRydWU7IH1cbiAgICB9XG5cbiAgICByZXRyZWF0RnJvbnRpZXIoZG9jLCBmcm9tLmxpbmUpO1xuICAgIHN0YXJ0V29ya2VyKGNtLCA0MDApO1xuXG4gICAgdmFyIGxlbmRpZmYgPSBjaGFuZ2UudGV4dC5sZW5ndGggLSAodG8ubGluZSAtIGZyb20ubGluZSkgLSAxO1xuICAgIC8vIFJlbWVtYmVyIHRoYXQgdGhlc2UgbGluZXMgY2hhbmdlZCwgZm9yIHVwZGF0aW5nIHRoZSBkaXNwbGF5XG4gICAgaWYgKGNoYW5nZS5mdWxsKVxuICAgICAgeyByZWdDaGFuZ2UoY20pOyB9XG4gICAgZWxzZSBpZiAoZnJvbS5saW5lID09IHRvLmxpbmUgJiYgY2hhbmdlLnRleHQubGVuZ3RoID09IDEgJiYgIWlzV2hvbGVMaW5lVXBkYXRlKGNtLmRvYywgY2hhbmdlKSlcbiAgICAgIHsgcmVnTGluZUNoYW5nZShjbSwgZnJvbS5saW5lLCBcInRleHRcIik7IH1cbiAgICBlbHNlXG4gICAgICB7IHJlZ0NoYW5nZShjbSwgZnJvbS5saW5lLCB0by5saW5lICsgMSwgbGVuZGlmZik7IH1cblxuICAgIHZhciBjaGFuZ2VzSGFuZGxlciA9IGhhc0hhbmRsZXIoY20sIFwiY2hhbmdlc1wiKSwgY2hhbmdlSGFuZGxlciA9IGhhc0hhbmRsZXIoY20sIFwiY2hhbmdlXCIpO1xuICAgIGlmIChjaGFuZ2VIYW5kbGVyIHx8IGNoYW5nZXNIYW5kbGVyKSB7XG4gICAgICB2YXIgb2JqID0ge1xuICAgICAgICBmcm9tOiBmcm9tLCB0bzogdG8sXG4gICAgICAgIHRleHQ6IGNoYW5nZS50ZXh0LFxuICAgICAgICByZW1vdmVkOiBjaGFuZ2UucmVtb3ZlZCxcbiAgICAgICAgb3JpZ2luOiBjaGFuZ2Uub3JpZ2luXG4gICAgICB9O1xuICAgICAgaWYgKGNoYW5nZUhhbmRsZXIpIHsgc2lnbmFsTGF0ZXIoY20sIFwiY2hhbmdlXCIsIGNtLCBvYmopOyB9XG4gICAgICBpZiAoY2hhbmdlc0hhbmRsZXIpIHsgKGNtLmN1ck9wLmNoYW5nZU9ianMgfHwgKGNtLmN1ck9wLmNoYW5nZU9ianMgPSBbXSkpLnB1c2gob2JqKTsgfVxuICAgIH1cbiAgICBjbS5kaXNwbGF5LnNlbEZvckNvbnRleHRNZW51ID0gbnVsbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlcGxhY2VSYW5nZShkb2MsIGNvZGUsIGZyb20sIHRvLCBvcmlnaW4pIHtcbiAgICB2YXIgYXNzaWduO1xuXG4gICAgaWYgKCF0bykgeyB0byA9IGZyb207IH1cbiAgICBpZiAoY21wKHRvLCBmcm9tKSA8IDApIHsgKGFzc2lnbiA9IFt0bywgZnJvbV0sIGZyb20gPSBhc3NpZ25bMF0sIHRvID0gYXNzaWduWzFdKTsgfVxuICAgIGlmICh0eXBlb2YgY29kZSA9PSBcInN0cmluZ1wiKSB7IGNvZGUgPSBkb2Muc3BsaXRMaW5lcyhjb2RlKTsgfVxuICAgIG1ha2VDaGFuZ2UoZG9jLCB7ZnJvbTogZnJvbSwgdG86IHRvLCB0ZXh0OiBjb2RlLCBvcmlnaW46IG9yaWdpbn0pO1xuICB9XG5cbiAgLy8gUmViYXNpbmcvcmVzZXR0aW5nIGhpc3RvcnkgdG8gZGVhbCB3aXRoIGV4dGVybmFsbHktc291cmNlZCBjaGFuZ2VzXG5cbiAgZnVuY3Rpb24gcmViYXNlSGlzdFNlbFNpbmdsZShwb3MsIGZyb20sIHRvLCBkaWZmKSB7XG4gICAgaWYgKHRvIDwgcG9zLmxpbmUpIHtcbiAgICAgIHBvcy5saW5lICs9IGRpZmY7XG4gICAgfSBlbHNlIGlmIChmcm9tIDwgcG9zLmxpbmUpIHtcbiAgICAgIHBvcy5saW5lID0gZnJvbTtcbiAgICAgIHBvcy5jaCA9IDA7XG4gICAgfVxuICB9XG5cbiAgLy8gVHJpZXMgdG8gcmViYXNlIGFuIGFycmF5IG9mIGhpc3RvcnkgZXZlbnRzIGdpdmVuIGEgY2hhbmdlIGluIHRoZVxuICAvLyBkb2N1bWVudC4gSWYgdGhlIGNoYW5nZSB0b3VjaGVzIHRoZSBzYW1lIGxpbmVzIGFzIHRoZSBldmVudCwgdGhlXG4gIC8vIGV2ZW50LCBhbmQgZXZlcnl0aGluZyAnYmVoaW5kJyBpdCwgaXMgZGlzY2FyZGVkLiBJZiB0aGUgY2hhbmdlIGlzXG4gIC8vIGJlZm9yZSB0aGUgZXZlbnQsIHRoZSBldmVudCdzIHBvc2l0aW9ucyBhcmUgdXBkYXRlZC4gVXNlcyBhXG4gIC8vIGNvcHktb24td3JpdGUgc2NoZW1lIGZvciB0aGUgcG9zaXRpb25zLCB0byBhdm9pZCBoYXZpbmcgdG9cbiAgLy8gcmVhbGxvY2F0ZSB0aGVtIGFsbCBvbiBldmVyeSByZWJhc2UsIGJ1dCBhbHNvIGF2b2lkIHByb2JsZW1zIHdpdGhcbiAgLy8gc2hhcmVkIHBvc2l0aW9uIG9iamVjdHMgYmVpbmcgdW5zYWZlbHkgdXBkYXRlZC5cbiAgZnVuY3Rpb24gcmViYXNlSGlzdEFycmF5KGFycmF5LCBmcm9tLCB0bywgZGlmZikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBzdWIgPSBhcnJheVtpXSwgb2sgPSB0cnVlO1xuICAgICAgaWYgKHN1Yi5yYW5nZXMpIHtcbiAgICAgICAgaWYgKCFzdWIuY29waWVkKSB7IHN1YiA9IGFycmF5W2ldID0gc3ViLmRlZXBDb3B5KCk7IHN1Yi5jb3BpZWQgPSB0cnVlOyB9XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc3ViLnJhbmdlcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgIHJlYmFzZUhpc3RTZWxTaW5nbGUoc3ViLnJhbmdlc1tqXS5hbmNob3IsIGZyb20sIHRvLCBkaWZmKTtcbiAgICAgICAgICByZWJhc2VIaXN0U2VsU2luZ2xlKHN1Yi5yYW5nZXNbal0uaGVhZCwgZnJvbSwgdG8sIGRpZmYpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBmb3IgKHZhciBqJDEgPSAwOyBqJDEgPCBzdWIuY2hhbmdlcy5sZW5ndGg7ICsraiQxKSB7XG4gICAgICAgIHZhciBjdXIgPSBzdWIuY2hhbmdlc1tqJDFdO1xuICAgICAgICBpZiAodG8gPCBjdXIuZnJvbS5saW5lKSB7XG4gICAgICAgICAgY3VyLmZyb20gPSBQb3MoY3VyLmZyb20ubGluZSArIGRpZmYsIGN1ci5mcm9tLmNoKTtcbiAgICAgICAgICBjdXIudG8gPSBQb3MoY3VyLnRvLmxpbmUgKyBkaWZmLCBjdXIudG8uY2gpO1xuICAgICAgICB9IGVsc2UgaWYgKGZyb20gPD0gY3VyLnRvLmxpbmUpIHtcbiAgICAgICAgICBvayA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghb2spIHtcbiAgICAgICAgYXJyYXkuc3BsaWNlKDAsIGkgKyAxKTtcbiAgICAgICAgaSA9IDA7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmViYXNlSGlzdChoaXN0LCBjaGFuZ2UpIHtcbiAgICB2YXIgZnJvbSA9IGNoYW5nZS5mcm9tLmxpbmUsIHRvID0gY2hhbmdlLnRvLmxpbmUsIGRpZmYgPSBjaGFuZ2UudGV4dC5sZW5ndGggLSAodG8gLSBmcm9tKSAtIDE7XG4gICAgcmViYXNlSGlzdEFycmF5KGhpc3QuZG9uZSwgZnJvbSwgdG8sIGRpZmYpO1xuICAgIHJlYmFzZUhpc3RBcnJheShoaXN0LnVuZG9uZSwgZnJvbSwgdG8sIGRpZmYpO1xuICB9XG5cbiAgLy8gVXRpbGl0eSBmb3IgYXBwbHlpbmcgYSBjaGFuZ2UgdG8gYSBsaW5lIGJ5IGhhbmRsZSBvciBudW1iZXIsXG4gIC8vIHJldHVybmluZyB0aGUgbnVtYmVyIGFuZCBvcHRpb25hbGx5IHJlZ2lzdGVyaW5nIHRoZSBsaW5lIGFzXG4gIC8vIGNoYW5nZWQuXG4gIGZ1bmN0aW9uIGNoYW5nZUxpbmUoZG9jLCBoYW5kbGUsIGNoYW5nZVR5cGUsIG9wKSB7XG4gICAgdmFyIG5vID0gaGFuZGxlLCBsaW5lID0gaGFuZGxlO1xuICAgIGlmICh0eXBlb2YgaGFuZGxlID09IFwibnVtYmVyXCIpIHsgbGluZSA9IGdldExpbmUoZG9jLCBjbGlwTGluZShkb2MsIGhhbmRsZSkpOyB9XG4gICAgZWxzZSB7IG5vID0gbGluZU5vKGhhbmRsZSk7IH1cbiAgICBpZiAobm8gPT0gbnVsbCkgeyByZXR1cm4gbnVsbCB9XG4gICAgaWYgKG9wKGxpbmUsIG5vKSAmJiBkb2MuY20pIHsgcmVnTGluZUNoYW5nZShkb2MuY20sIG5vLCBjaGFuZ2VUeXBlKTsgfVxuICAgIHJldHVybiBsaW5lXG4gIH1cblxuICAvLyBUaGUgZG9jdW1lbnQgaXMgcmVwcmVzZW50ZWQgYXMgYSBCVHJlZSBjb25zaXN0aW5nIG9mIGxlYXZlcywgd2l0aFxuICAvLyBjaHVuayBvZiBsaW5lcyBpbiB0aGVtLCBhbmQgYnJhbmNoZXMsIHdpdGggdXAgdG8gdGVuIGxlYXZlcyBvclxuICAvLyBvdGhlciBicmFuY2ggbm9kZXMgYmVsb3cgdGhlbS4gVGhlIHRvcCBub2RlIGlzIGFsd2F5cyBhIGJyYW5jaFxuICAvLyBub2RlLCBhbmQgaXMgdGhlIGRvY3VtZW50IG9iamVjdCBpdHNlbGYgKG1lYW5pbmcgaXQgaGFzXG4gIC8vIGFkZGl0aW9uYWwgbWV0aG9kcyBhbmQgcHJvcGVydGllcykuXG4gIC8vXG4gIC8vIEFsbCBub2RlcyBoYXZlIHBhcmVudCBsaW5rcy4gVGhlIHRyZWUgaXMgdXNlZCBib3RoIHRvIGdvIGZyb21cbiAgLy8gbGluZSBudW1iZXJzIHRvIGxpbmUgb2JqZWN0cywgYW5kIHRvIGdvIGZyb20gb2JqZWN0cyB0byBudW1iZXJzLlxuICAvLyBJdCBhbHNvIGluZGV4ZXMgYnkgaGVpZ2h0LCBhbmQgaXMgdXNlZCB0byBjb252ZXJ0IGJldHdlZW4gaGVpZ2h0XG4gIC8vIGFuZCBsaW5lIG9iamVjdCwgYW5kIHRvIGZpbmQgdGhlIHRvdGFsIGhlaWdodCBvZiB0aGUgZG9jdW1lbnQuXG4gIC8vXG4gIC8vIFNlZSBhbHNvIGh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvYmxvZy9jb2RlbWlycm9yLWxpbmUtdHJlZS5odG1sXG5cbiAgZnVuY3Rpb24gTGVhZkNodW5rKGxpbmVzKSB7XG4gICAgdGhpcy5saW5lcyA9IGxpbmVzO1xuICAgIHRoaXMucGFyZW50ID0gbnVsbDtcbiAgICB2YXIgaGVpZ2h0ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgKytpKSB7XG4gICAgICBsaW5lc1tpXS5wYXJlbnQgPSB0aGlzO1xuICAgICAgaGVpZ2h0ICs9IGxpbmVzW2ldLmhlaWdodDtcbiAgICB9XG4gICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gIH1cblxuICBMZWFmQ2h1bmsucHJvdG90eXBlID0ge1xuICAgIGNodW5rU2l6ZTogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLmxpbmVzLmxlbmd0aCB9LFxuXG4gICAgLy8gUmVtb3ZlIHRoZSBuIGxpbmVzIGF0IG9mZnNldCAnYXQnLlxuICAgIHJlbW92ZUlubmVyOiBmdW5jdGlvbihhdCwgbikge1xuICAgICAgZm9yICh2YXIgaSA9IGF0LCBlID0gYXQgKyBuOyBpIDwgZTsgKytpKSB7XG4gICAgICAgIHZhciBsaW5lID0gdGhpcy5saW5lc1tpXTtcbiAgICAgICAgdGhpcy5oZWlnaHQgLT0gbGluZS5oZWlnaHQ7XG4gICAgICAgIGNsZWFuVXBMaW5lKGxpbmUpO1xuICAgICAgICBzaWduYWxMYXRlcihsaW5lLCBcImRlbGV0ZVwiKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubGluZXMuc3BsaWNlKGF0LCBuKTtcbiAgICB9LFxuXG4gICAgLy8gSGVscGVyIHVzZWQgdG8gY29sbGFwc2UgYSBzbWFsbCBicmFuY2ggaW50byBhIHNpbmdsZSBsZWFmLlxuICAgIGNvbGxhcHNlOiBmdW5jdGlvbihsaW5lcykge1xuICAgICAgbGluZXMucHVzaC5hcHBseShsaW5lcywgdGhpcy5saW5lcyk7XG4gICAgfSxcblxuICAgIC8vIEluc2VydCB0aGUgZ2l2ZW4gYXJyYXkgb2YgbGluZXMgYXQgb2Zmc2V0ICdhdCcsIGNvdW50IHRoZW0gYXNcbiAgICAvLyBoYXZpbmcgdGhlIGdpdmVuIGhlaWdodC5cbiAgICBpbnNlcnRJbm5lcjogZnVuY3Rpb24oYXQsIGxpbmVzLCBoZWlnaHQpIHtcbiAgICAgIHRoaXMuaGVpZ2h0ICs9IGhlaWdodDtcbiAgICAgIHRoaXMubGluZXMgPSB0aGlzLmxpbmVzLnNsaWNlKDAsIGF0KS5jb25jYXQobGluZXMpLmNvbmNhdCh0aGlzLmxpbmVzLnNsaWNlKGF0KSk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgKytpKSB7IGxpbmVzW2ldLnBhcmVudCA9IHRoaXM7IH1cbiAgICB9LFxuXG4gICAgLy8gVXNlZCB0byBpdGVyYXRlIG92ZXIgYSBwYXJ0IG9mIHRoZSB0cmVlLlxuICAgIGl0ZXJOOiBmdW5jdGlvbihhdCwgbiwgb3ApIHtcbiAgICAgIGZvciAodmFyIGUgPSBhdCArIG47IGF0IDwgZTsgKythdClcbiAgICAgICAgeyBpZiAob3AodGhpcy5saW5lc1thdF0pKSB7IHJldHVybiB0cnVlIH0gfVxuICAgIH1cbiAgfTtcblxuICBmdW5jdGlvbiBCcmFuY2hDaHVuayhjaGlsZHJlbikge1xuICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICB2YXIgc2l6ZSA9IDAsIGhlaWdodCA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIGNoID0gY2hpbGRyZW5baV07XG4gICAgICBzaXplICs9IGNoLmNodW5rU2l6ZSgpOyBoZWlnaHQgKz0gY2guaGVpZ2h0O1xuICAgICAgY2gucGFyZW50ID0gdGhpcztcbiAgICB9XG4gICAgdGhpcy5zaXplID0gc2l6ZTtcbiAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICB0aGlzLnBhcmVudCA9IG51bGw7XG4gIH1cblxuICBCcmFuY2hDaHVuay5wcm90b3R5cGUgPSB7XG4gICAgY2h1bmtTaXplOiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuc2l6ZSB9LFxuXG4gICAgcmVtb3ZlSW5uZXI6IGZ1bmN0aW9uKGF0LCBuKSB7XG4gICAgICB0aGlzLnNpemUgLT0gbjtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldLCBzeiA9IGNoaWxkLmNodW5rU2l6ZSgpO1xuICAgICAgICBpZiAoYXQgPCBzeikge1xuICAgICAgICAgIHZhciBybSA9IE1hdGgubWluKG4sIHN6IC0gYXQpLCBvbGRIZWlnaHQgPSBjaGlsZC5oZWlnaHQ7XG4gICAgICAgICAgY2hpbGQucmVtb3ZlSW5uZXIoYXQsIHJtKTtcbiAgICAgICAgICB0aGlzLmhlaWdodCAtPSBvbGRIZWlnaHQgLSBjaGlsZC5oZWlnaHQ7XG4gICAgICAgICAgaWYgKHN6ID09IHJtKSB7IHRoaXMuY2hpbGRyZW4uc3BsaWNlKGktLSwgMSk7IGNoaWxkLnBhcmVudCA9IG51bGw7IH1cbiAgICAgICAgICBpZiAoKG4gLT0gcm0pID09IDApIHsgYnJlYWsgfVxuICAgICAgICAgIGF0ID0gMDtcbiAgICAgICAgfSBlbHNlIHsgYXQgLT0gc3o7IH1cbiAgICAgIH1cbiAgICAgIC8vIElmIHRoZSByZXN1bHQgaXMgc21hbGxlciB0aGFuIDI1IGxpbmVzLCBlbnN1cmUgdGhhdCBpdCBpcyBhXG4gICAgICAvLyBzaW5nbGUgbGVhZiBub2RlLlxuICAgICAgaWYgKHRoaXMuc2l6ZSAtIG4gPCAyNSAmJlxuICAgICAgICAgICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA+IDEgfHwgISh0aGlzLmNoaWxkcmVuWzBdIGluc3RhbmNlb2YgTGVhZkNodW5rKSkpIHtcbiAgICAgICAgdmFyIGxpbmVzID0gW107XG4gICAgICAgIHRoaXMuY29sbGFwc2UobGluZXMpO1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gW25ldyBMZWFmQ2h1bmsobGluZXMpXTtcbiAgICAgICAgdGhpcy5jaGlsZHJlblswXS5wYXJlbnQgPSB0aGlzO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBjb2xsYXBzZTogZnVuY3Rpb24obGluZXMpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7ICsraSkgeyB0aGlzLmNoaWxkcmVuW2ldLmNvbGxhcHNlKGxpbmVzKTsgfVxuICAgIH0sXG5cbiAgICBpbnNlcnRJbm5lcjogZnVuY3Rpb24oYXQsIGxpbmVzLCBoZWlnaHQpIHtcbiAgICAgIHRoaXMuc2l6ZSArPSBsaW5lcy5sZW5ndGg7XG4gICAgICB0aGlzLmhlaWdodCArPSBoZWlnaHQ7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXSwgc3ogPSBjaGlsZC5jaHVua1NpemUoKTtcbiAgICAgICAgaWYgKGF0IDw9IHN6KSB7XG4gICAgICAgICAgY2hpbGQuaW5zZXJ0SW5uZXIoYXQsIGxpbmVzLCBoZWlnaHQpO1xuICAgICAgICAgIGlmIChjaGlsZC5saW5lcyAmJiBjaGlsZC5saW5lcy5sZW5ndGggPiA1MCkge1xuICAgICAgICAgICAgLy8gVG8gYXZvaWQgbWVtb3J5IHRocmFzaGluZyB3aGVuIGNoaWxkLmxpbmVzIGlzIGh1Z2UgKGUuZy4gZmlyc3QgdmlldyBvZiBhIGxhcmdlIGZpbGUpLCBpdCdzIG5ldmVyIHNwbGljZWQuXG4gICAgICAgICAgICAvLyBJbnN0ZWFkLCBzbWFsbCBzbGljZXMgYXJlIHRha2VuLiBUaGV5J3JlIHRha2VuIGluIG9yZGVyIGJlY2F1c2Ugc2VxdWVudGlhbCBtZW1vcnkgYWNjZXNzZXMgYXJlIGZhc3Rlc3QuXG4gICAgICAgICAgICB2YXIgcmVtYWluaW5nID0gY2hpbGQubGluZXMubGVuZ3RoICUgMjUgKyAyNTtcbiAgICAgICAgICAgIGZvciAodmFyIHBvcyA9IHJlbWFpbmluZzsgcG9zIDwgY2hpbGQubGluZXMubGVuZ3RoOykge1xuICAgICAgICAgICAgICB2YXIgbGVhZiA9IG5ldyBMZWFmQ2h1bmsoY2hpbGQubGluZXMuc2xpY2UocG9zLCBwb3MgKz0gMjUpKTtcbiAgICAgICAgICAgICAgY2hpbGQuaGVpZ2h0IC09IGxlYWYuaGVpZ2h0O1xuICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuLnNwbGljZSgrK2ksIDAsIGxlYWYpO1xuICAgICAgICAgICAgICBsZWFmLnBhcmVudCA9IHRoaXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaGlsZC5saW5lcyA9IGNoaWxkLmxpbmVzLnNsaWNlKDAsIHJlbWFpbmluZyk7XG4gICAgICAgICAgICB0aGlzLm1heWJlU3BpbGwoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBhdCAtPSBzejtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gV2hlbiBhIG5vZGUgaGFzIGdyb3duLCBjaGVjayB3aGV0aGVyIGl0IHNob3VsZCBiZSBzcGxpdC5cbiAgICBtYXliZVNwaWxsOiBmdW5jdGlvbigpIHtcbiAgICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA8PSAxMCkgeyByZXR1cm4gfVxuICAgICAgdmFyIG1lID0gdGhpcztcbiAgICAgIGRvIHtcbiAgICAgICAgdmFyIHNwaWxsZWQgPSBtZS5jaGlsZHJlbi5zcGxpY2UobWUuY2hpbGRyZW4ubGVuZ3RoIC0gNSwgNSk7XG4gICAgICAgIHZhciBzaWJsaW5nID0gbmV3IEJyYW5jaENodW5rKHNwaWxsZWQpO1xuICAgICAgICBpZiAoIW1lLnBhcmVudCkgeyAvLyBCZWNvbWUgdGhlIHBhcmVudCBub2RlXG4gICAgICAgICAgdmFyIGNvcHkgPSBuZXcgQnJhbmNoQ2h1bmsobWUuY2hpbGRyZW4pO1xuICAgICAgICAgIGNvcHkucGFyZW50ID0gbWU7XG4gICAgICAgICAgbWUuY2hpbGRyZW4gPSBbY29weSwgc2libGluZ107XG4gICAgICAgICAgbWUgPSBjb3B5O1xuICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWUuc2l6ZSAtPSBzaWJsaW5nLnNpemU7XG4gICAgICAgICAgbWUuaGVpZ2h0IC09IHNpYmxpbmcuaGVpZ2h0O1xuICAgICAgICAgIHZhciBteUluZGV4ID0gaW5kZXhPZihtZS5wYXJlbnQuY2hpbGRyZW4sIG1lKTtcbiAgICAgICAgICBtZS5wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKG15SW5kZXggKyAxLCAwLCBzaWJsaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBzaWJsaW5nLnBhcmVudCA9IG1lLnBhcmVudDtcbiAgICAgIH0gd2hpbGUgKG1lLmNoaWxkcmVuLmxlbmd0aCA+IDEwKVxuICAgICAgbWUucGFyZW50Lm1heWJlU3BpbGwoKTtcbiAgICB9LFxuXG4gICAgaXRlck46IGZ1bmN0aW9uKGF0LCBuLCBvcCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV0sIHN6ID0gY2hpbGQuY2h1bmtTaXplKCk7XG4gICAgICAgIGlmIChhdCA8IHN6KSB7XG4gICAgICAgICAgdmFyIHVzZWQgPSBNYXRoLm1pbihuLCBzeiAtIGF0KTtcbiAgICAgICAgICBpZiAoY2hpbGQuaXRlck4oYXQsIHVzZWQsIG9wKSkgeyByZXR1cm4gdHJ1ZSB9XG4gICAgICAgICAgaWYgKChuIC09IHVzZWQpID09IDApIHsgYnJlYWsgfVxuICAgICAgICAgIGF0ID0gMDtcbiAgICAgICAgfSBlbHNlIHsgYXQgLT0gc3o7IH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLy8gTGluZSB3aWRnZXRzIGFyZSBibG9jayBlbGVtZW50cyBkaXNwbGF5ZWQgYWJvdmUgb3IgYmVsb3cgYSBsaW5lLlxuXG4gIHZhciBMaW5lV2lkZ2V0ID0gZnVuY3Rpb24oZG9jLCBub2RlLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMpIHsgZm9yICh2YXIgb3B0IGluIG9wdGlvbnMpIHsgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkob3B0KSlcbiAgICAgIHsgdGhpc1tvcHRdID0gb3B0aW9uc1tvcHRdOyB9IH0gfVxuICAgIHRoaXMuZG9jID0gZG9jO1xuICAgIHRoaXMubm9kZSA9IG5vZGU7XG4gIH07XG5cbiAgTGluZVdpZGdldC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGNtID0gdGhpcy5kb2MuY20sIHdzID0gdGhpcy5saW5lLndpZGdldHMsIGxpbmUgPSB0aGlzLmxpbmUsIG5vID0gbGluZU5vKGxpbmUpO1xuICAgIGlmIChubyA9PSBudWxsIHx8ICF3cykgeyByZXR1cm4gfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd3MubGVuZ3RoOyArK2kpIHsgaWYgKHdzW2ldID09IHRoaXMpIHsgd3Muc3BsaWNlKGktLSwgMSk7IH0gfVxuICAgIGlmICghd3MubGVuZ3RoKSB7IGxpbmUud2lkZ2V0cyA9IG51bGw7IH1cbiAgICB2YXIgaGVpZ2h0ID0gd2lkZ2V0SGVpZ2h0KHRoaXMpO1xuICAgIHVwZGF0ZUxpbmVIZWlnaHQobGluZSwgTWF0aC5tYXgoMCwgbGluZS5oZWlnaHQgLSBoZWlnaHQpKTtcbiAgICBpZiAoY20pIHtcbiAgICAgIHJ1bkluT3AoY20sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYWRqdXN0U2Nyb2xsV2hlbkFib3ZlVmlzaWJsZShjbSwgbGluZSwgLWhlaWdodCk7XG4gICAgICAgIHJlZ0xpbmVDaGFuZ2UoY20sIG5vLCBcIndpZGdldFwiKTtcbiAgICAgIH0pO1xuICAgICAgc2lnbmFsTGF0ZXIoY20sIFwibGluZVdpZGdldENsZWFyZWRcIiwgY20sIHRoaXMsIG5vKTtcbiAgICB9XG4gIH07XG5cbiAgTGluZVdpZGdldC5wcm90b3R5cGUuY2hhbmdlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgdmFyIG9sZEggPSB0aGlzLmhlaWdodCwgY20gPSB0aGlzLmRvYy5jbSwgbGluZSA9IHRoaXMubGluZTtcbiAgICB0aGlzLmhlaWdodCA9IG51bGw7XG4gICAgdmFyIGRpZmYgPSB3aWRnZXRIZWlnaHQodGhpcykgLSBvbGRIO1xuICAgIGlmICghZGlmZikgeyByZXR1cm4gfVxuICAgIGlmICghbGluZUlzSGlkZGVuKHRoaXMuZG9jLCBsaW5lKSkgeyB1cGRhdGVMaW5lSGVpZ2h0KGxpbmUsIGxpbmUuaGVpZ2h0ICsgZGlmZik7IH1cbiAgICBpZiAoY20pIHtcbiAgICAgIHJ1bkluT3AoY20sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY20uY3VyT3AuZm9yY2VVcGRhdGUgPSB0cnVlO1xuICAgICAgICBhZGp1c3RTY3JvbGxXaGVuQWJvdmVWaXNpYmxlKGNtLCBsaW5lLCBkaWZmKTtcbiAgICAgICAgc2lnbmFsTGF0ZXIoY20sIFwibGluZVdpZGdldENoYW5nZWRcIiwgY20sIHRoaXMkMSwgbGluZU5vKGxpbmUpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgZXZlbnRNaXhpbihMaW5lV2lkZ2V0KTtcblxuICBmdW5jdGlvbiBhZGp1c3RTY3JvbGxXaGVuQWJvdmVWaXNpYmxlKGNtLCBsaW5lLCBkaWZmKSB7XG4gICAgaWYgKGhlaWdodEF0TGluZShsaW5lKSA8ICgoY20uY3VyT3AgJiYgY20uY3VyT3Auc2Nyb2xsVG9wKSB8fCBjbS5kb2Muc2Nyb2xsVG9wKSlcbiAgICAgIHsgYWRkVG9TY3JvbGxUb3AoY20sIGRpZmYpOyB9XG4gIH1cblxuICBmdW5jdGlvbiBhZGRMaW5lV2lkZ2V0KGRvYywgaGFuZGxlLCBub2RlLCBvcHRpb25zKSB7XG4gICAgdmFyIHdpZGdldCA9IG5ldyBMaW5lV2lkZ2V0KGRvYywgbm9kZSwgb3B0aW9ucyk7XG4gICAgdmFyIGNtID0gZG9jLmNtO1xuICAgIGlmIChjbSAmJiB3aWRnZXQubm9IU2Nyb2xsKSB7IGNtLmRpc3BsYXkuYWxpZ25XaWRnZXRzID0gdHJ1ZTsgfVxuICAgIGNoYW5nZUxpbmUoZG9jLCBoYW5kbGUsIFwid2lkZ2V0XCIsIGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgICB2YXIgd2lkZ2V0cyA9IGxpbmUud2lkZ2V0cyB8fCAobGluZS53aWRnZXRzID0gW10pO1xuICAgICAgaWYgKHdpZGdldC5pbnNlcnRBdCA9PSBudWxsKSB7IHdpZGdldHMucHVzaCh3aWRnZXQpOyB9XG4gICAgICBlbHNlIHsgd2lkZ2V0cy5zcGxpY2UoTWF0aC5taW4od2lkZ2V0cy5sZW5ndGgsIE1hdGgubWF4KDAsIHdpZGdldC5pbnNlcnRBdCkpLCAwLCB3aWRnZXQpOyB9XG4gICAgICB3aWRnZXQubGluZSA9IGxpbmU7XG4gICAgICBpZiAoY20gJiYgIWxpbmVJc0hpZGRlbihkb2MsIGxpbmUpKSB7XG4gICAgICAgIHZhciBhYm92ZVZpc2libGUgPSBoZWlnaHRBdExpbmUobGluZSkgPCBkb2Muc2Nyb2xsVG9wO1xuICAgICAgICB1cGRhdGVMaW5lSGVpZ2h0KGxpbmUsIGxpbmUuaGVpZ2h0ICsgd2lkZ2V0SGVpZ2h0KHdpZGdldCkpO1xuICAgICAgICBpZiAoYWJvdmVWaXNpYmxlKSB7IGFkZFRvU2Nyb2xsVG9wKGNtLCB3aWRnZXQuaGVpZ2h0KTsgfVxuICAgICAgICBjbS5jdXJPcC5mb3JjZVVwZGF0ZSA9IHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0pO1xuICAgIGlmIChjbSkgeyBzaWduYWxMYXRlcihjbSwgXCJsaW5lV2lkZ2V0QWRkZWRcIiwgY20sIHdpZGdldCwgdHlwZW9mIGhhbmRsZSA9PSBcIm51bWJlclwiID8gaGFuZGxlIDogbGluZU5vKGhhbmRsZSkpOyB9XG4gICAgcmV0dXJuIHdpZGdldFxuICB9XG5cbiAgLy8gVEVYVE1BUktFUlNcblxuICAvLyBDcmVhdGVkIHdpdGggbWFya1RleHQgYW5kIHNldEJvb2ttYXJrIG1ldGhvZHMuIEEgVGV4dE1hcmtlciBpcyBhXG4gIC8vIGhhbmRsZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGNsZWFyIG9yIGZpbmQgYSBtYXJrZWQgcG9zaXRpb24gaW4gdGhlXG4gIC8vIGRvY3VtZW50LiBMaW5lIG9iamVjdHMgaG9sZCBhcnJheXMgKG1hcmtlZFNwYW5zKSBjb250YWluaW5nXG4gIC8vIHtmcm9tLCB0bywgbWFya2VyfSBvYmplY3QgcG9pbnRpbmcgdG8gc3VjaCBtYXJrZXIgb2JqZWN0cywgYW5kXG4gIC8vIGluZGljYXRpbmcgdGhhdCBzdWNoIGEgbWFya2VyIGlzIHByZXNlbnQgb24gdGhhdCBsaW5lLiBNdWx0aXBsZVxuICAvLyBsaW5lcyBtYXkgcG9pbnQgdG8gdGhlIHNhbWUgbWFya2VyIHdoZW4gaXQgc3BhbnMgYWNyb3NzIGxpbmVzLlxuICAvLyBUaGUgc3BhbnMgd2lsbCBoYXZlIG51bGwgZm9yIHRoZWlyIGZyb20vdG8gcHJvcGVydGllcyB3aGVuIHRoZVxuICAvLyBtYXJrZXIgY29udGludWVzIGJleW9uZCB0aGUgc3RhcnQvZW5kIG9mIHRoZSBsaW5lLiBNYXJrZXJzIGhhdmVcbiAgLy8gbGlua3MgYmFjayB0byB0aGUgbGluZXMgdGhleSBjdXJyZW50bHkgdG91Y2guXG5cbiAgLy8gQ29sbGFwc2VkIG1hcmtlcnMgaGF2ZSB1bmlxdWUgaWRzLCBpbiBvcmRlciB0byBiZSBhYmxlIHRvIG9yZGVyXG4gIC8vIHRoZW0sIHdoaWNoIGlzIG5lZWRlZCBmb3IgdW5pcXVlbHkgZGV0ZXJtaW5pbmcgYW4gb3V0ZXIgbWFya2VyXG4gIC8vIHdoZW4gdGhleSBvdmVybGFwICh0aGV5IG1heSBuZXN0LCBidXQgbm90IHBhcnRpYWxseSBvdmVybGFwKS5cbiAgdmFyIG5leHRNYXJrZXJJZCA9IDA7XG5cbiAgdmFyIFRleHRNYXJrZXIgPSBmdW5jdGlvbihkb2MsIHR5cGUpIHtcbiAgICB0aGlzLmxpbmVzID0gW107XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB0aGlzLmRvYyA9IGRvYztcbiAgICB0aGlzLmlkID0gKytuZXh0TWFya2VySWQ7XG4gIH07XG5cbiAgLy8gQ2xlYXIgdGhlIG1hcmtlci5cbiAgVGV4dE1hcmtlci5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuZXhwbGljaXRseUNsZWFyZWQpIHsgcmV0dXJuIH1cbiAgICB2YXIgY20gPSB0aGlzLmRvYy5jbSwgd2l0aE9wID0gY20gJiYgIWNtLmN1ck9wO1xuICAgIGlmICh3aXRoT3ApIHsgc3RhcnRPcGVyYXRpb24oY20pOyB9XG4gICAgaWYgKGhhc0hhbmRsZXIodGhpcywgXCJjbGVhclwiKSkge1xuICAgICAgdmFyIGZvdW5kID0gdGhpcy5maW5kKCk7XG4gICAgICBpZiAoZm91bmQpIHsgc2lnbmFsTGF0ZXIodGhpcywgXCJjbGVhclwiLCBmb3VuZC5mcm9tLCBmb3VuZC50byk7IH1cbiAgICB9XG4gICAgdmFyIG1pbiA9IG51bGwsIG1heCA9IG51bGw7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxpbmVzLmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgbGluZSA9IHRoaXMubGluZXNbaV07XG4gICAgICB2YXIgc3BhbiA9IGdldE1hcmtlZFNwYW5Gb3IobGluZS5tYXJrZWRTcGFucywgdGhpcyk7XG4gICAgICBpZiAoY20gJiYgIXRoaXMuY29sbGFwc2VkKSB7IHJlZ0xpbmVDaGFuZ2UoY20sIGxpbmVObyhsaW5lKSwgXCJ0ZXh0XCIpOyB9XG4gICAgICBlbHNlIGlmIChjbSkge1xuICAgICAgICBpZiAoc3Bhbi50byAhPSBudWxsKSB7IG1heCA9IGxpbmVObyhsaW5lKTsgfVxuICAgICAgICBpZiAoc3Bhbi5mcm9tICE9IG51bGwpIHsgbWluID0gbGluZU5vKGxpbmUpOyB9XG4gICAgICB9XG4gICAgICBsaW5lLm1hcmtlZFNwYW5zID0gcmVtb3ZlTWFya2VkU3BhbihsaW5lLm1hcmtlZFNwYW5zLCBzcGFuKTtcbiAgICAgIGlmIChzcGFuLmZyb20gPT0gbnVsbCAmJiB0aGlzLmNvbGxhcHNlZCAmJiAhbGluZUlzSGlkZGVuKHRoaXMuZG9jLCBsaW5lKSAmJiBjbSlcbiAgICAgICAgeyB1cGRhdGVMaW5lSGVpZ2h0KGxpbmUsIHRleHRIZWlnaHQoY20uZGlzcGxheSkpOyB9XG4gICAgfVxuICAgIGlmIChjbSAmJiB0aGlzLmNvbGxhcHNlZCAmJiAhY20ub3B0aW9ucy5saW5lV3JhcHBpbmcpIHsgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgdGhpcy5saW5lcy5sZW5ndGg7ICsraSQxKSB7XG4gICAgICB2YXIgdmlzdWFsID0gdmlzdWFsTGluZSh0aGlzLmxpbmVzW2kkMV0pLCBsZW4gPSBsaW5lTGVuZ3RoKHZpc3VhbCk7XG4gICAgICBpZiAobGVuID4gY20uZGlzcGxheS5tYXhMaW5lTGVuZ3RoKSB7XG4gICAgICAgIGNtLmRpc3BsYXkubWF4TGluZSA9IHZpc3VhbDtcbiAgICAgICAgY20uZGlzcGxheS5tYXhMaW5lTGVuZ3RoID0gbGVuO1xuICAgICAgICBjbS5kaXNwbGF5Lm1heExpbmVDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IH1cblxuICAgIGlmIChtaW4gIT0gbnVsbCAmJiBjbSAmJiB0aGlzLmNvbGxhcHNlZCkgeyByZWdDaGFuZ2UoY20sIG1pbiwgbWF4ICsgMSk7IH1cbiAgICB0aGlzLmxpbmVzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5leHBsaWNpdGx5Q2xlYXJlZCA9IHRydWU7XG4gICAgaWYgKHRoaXMuYXRvbWljICYmIHRoaXMuZG9jLmNhbnRFZGl0KSB7XG4gICAgICB0aGlzLmRvYy5jYW50RWRpdCA9IGZhbHNlO1xuICAgICAgaWYgKGNtKSB7IHJlQ2hlY2tTZWxlY3Rpb24oY20uZG9jKTsgfVxuICAgIH1cbiAgICBpZiAoY20pIHsgc2lnbmFsTGF0ZXIoY20sIFwibWFya2VyQ2xlYXJlZFwiLCBjbSwgdGhpcywgbWluLCBtYXgpOyB9XG4gICAgaWYgKHdpdGhPcCkgeyBlbmRPcGVyYXRpb24oY20pOyB9XG4gICAgaWYgKHRoaXMucGFyZW50KSB7IHRoaXMucGFyZW50LmNsZWFyKCk7IH1cbiAgfTtcblxuICAvLyBGaW5kIHRoZSBwb3NpdGlvbiBvZiB0aGUgbWFya2VyIGluIHRoZSBkb2N1bWVudC4gUmV0dXJucyBhIHtmcm9tLFxuICAvLyB0b30gb2JqZWN0IGJ5IGRlZmF1bHQuIFNpZGUgY2FuIGJlIHBhc3NlZCB0byBnZXQgYSBzcGVjaWZpYyBzaWRlXG4gIC8vIC0tIDAgKGJvdGgpLCAtMSAobGVmdCksIG9yIDEgKHJpZ2h0KS4gV2hlbiBsaW5lT2JqIGlzIHRydWUsIHRoZVxuICAvLyBQb3Mgb2JqZWN0cyByZXR1cm5lZCBjb250YWluIGEgbGluZSBvYmplY3QsIHJhdGhlciB0aGFuIGEgbGluZVxuICAvLyBudW1iZXIgKHVzZWQgdG8gcHJldmVudCBsb29raW5nIHVwIHRoZSBzYW1lIGxpbmUgdHdpY2UpLlxuICBUZXh0TWFya2VyLnByb3RvdHlwZS5maW5kID0gZnVuY3Rpb24gKHNpZGUsIGxpbmVPYmopIHtcbiAgICBpZiAoc2lkZSA9PSBudWxsICYmIHRoaXMudHlwZSA9PSBcImJvb2ttYXJrXCIpIHsgc2lkZSA9IDE7IH1cbiAgICB2YXIgZnJvbSwgdG87XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxpbmVzLmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgbGluZSA9IHRoaXMubGluZXNbaV07XG4gICAgICB2YXIgc3BhbiA9IGdldE1hcmtlZFNwYW5Gb3IobGluZS5tYXJrZWRTcGFucywgdGhpcyk7XG4gICAgICBpZiAoc3Bhbi5mcm9tICE9IG51bGwpIHtcbiAgICAgICAgZnJvbSA9IFBvcyhsaW5lT2JqID8gbGluZSA6IGxpbmVObyhsaW5lKSwgc3Bhbi5mcm9tKTtcbiAgICAgICAgaWYgKHNpZGUgPT0gLTEpIHsgcmV0dXJuIGZyb20gfVxuICAgICAgfVxuICAgICAgaWYgKHNwYW4udG8gIT0gbnVsbCkge1xuICAgICAgICB0byA9IFBvcyhsaW5lT2JqID8gbGluZSA6IGxpbmVObyhsaW5lKSwgc3Bhbi50byk7XG4gICAgICAgIGlmIChzaWRlID09IDEpIHsgcmV0dXJuIHRvIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZyb20gJiYge2Zyb206IGZyb20sIHRvOiB0b31cbiAgfTtcblxuICAvLyBTaWduYWxzIHRoYXQgdGhlIG1hcmtlcidzIHdpZGdldCBjaGFuZ2VkLCBhbmQgc3Vycm91bmRpbmcgbGF5b3V0XG4gIC8vIHNob3VsZCBiZSByZWNvbXB1dGVkLlxuICBUZXh0TWFya2VyLnByb3RvdHlwZS5jaGFuZ2VkID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICB2YXIgcG9zID0gdGhpcy5maW5kKC0xLCB0cnVlKSwgd2lkZ2V0ID0gdGhpcywgY20gPSB0aGlzLmRvYy5jbTtcbiAgICBpZiAoIXBvcyB8fCAhY20pIHsgcmV0dXJuIH1cbiAgICBydW5Jbk9wKGNtLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgbGluZSA9IHBvcy5saW5lLCBsaW5lTiA9IGxpbmVObyhwb3MubGluZSk7XG4gICAgICB2YXIgdmlldyA9IGZpbmRWaWV3Rm9yTGluZShjbSwgbGluZU4pO1xuICAgICAgaWYgKHZpZXcpIHtcbiAgICAgICAgY2xlYXJMaW5lTWVhc3VyZW1lbnRDYWNoZUZvcih2aWV3KTtcbiAgICAgICAgY20uY3VyT3Auc2VsZWN0aW9uQ2hhbmdlZCA9IGNtLmN1ck9wLmZvcmNlVXBkYXRlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNtLmN1ck9wLnVwZGF0ZU1heExpbmUgPSB0cnVlO1xuICAgICAgaWYgKCFsaW5lSXNIaWRkZW4od2lkZ2V0LmRvYywgbGluZSkgJiYgd2lkZ2V0LmhlaWdodCAhPSBudWxsKSB7XG4gICAgICAgIHZhciBvbGRIZWlnaHQgPSB3aWRnZXQuaGVpZ2h0O1xuICAgICAgICB3aWRnZXQuaGVpZ2h0ID0gbnVsbDtcbiAgICAgICAgdmFyIGRIZWlnaHQgPSB3aWRnZXRIZWlnaHQod2lkZ2V0KSAtIG9sZEhlaWdodDtcbiAgICAgICAgaWYgKGRIZWlnaHQpXG4gICAgICAgICAgeyB1cGRhdGVMaW5lSGVpZ2h0KGxpbmUsIGxpbmUuaGVpZ2h0ICsgZEhlaWdodCk7IH1cbiAgICAgIH1cbiAgICAgIHNpZ25hbExhdGVyKGNtLCBcIm1hcmtlckNoYW5nZWRcIiwgY20sIHRoaXMkMSk7XG4gICAgfSk7XG4gIH07XG5cbiAgVGV4dE1hcmtlci5wcm90b3R5cGUuYXR0YWNoTGluZSA9IGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgaWYgKCF0aGlzLmxpbmVzLmxlbmd0aCAmJiB0aGlzLmRvYy5jbSkge1xuICAgICAgdmFyIG9wID0gdGhpcy5kb2MuY20uY3VyT3A7XG4gICAgICBpZiAoIW9wLm1heWJlSGlkZGVuTWFya2VycyB8fCBpbmRleE9mKG9wLm1heWJlSGlkZGVuTWFya2VycywgdGhpcykgPT0gLTEpXG4gICAgICAgIHsgKG9wLm1heWJlVW5oaWRkZW5NYXJrZXJzIHx8IChvcC5tYXliZVVuaGlkZGVuTWFya2VycyA9IFtdKSkucHVzaCh0aGlzKTsgfVxuICAgIH1cbiAgICB0aGlzLmxpbmVzLnB1c2gobGluZSk7XG4gIH07XG5cbiAgVGV4dE1hcmtlci5wcm90b3R5cGUuZGV0YWNoTGluZSA9IGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgdGhpcy5saW5lcy5zcGxpY2UoaW5kZXhPZih0aGlzLmxpbmVzLCBsaW5lKSwgMSk7XG4gICAgaWYgKCF0aGlzLmxpbmVzLmxlbmd0aCAmJiB0aGlzLmRvYy5jbSkge1xuICAgICAgdmFyIG9wID0gdGhpcy5kb2MuY20uY3VyT3BcbiAgICAgIDsob3AubWF5YmVIaWRkZW5NYXJrZXJzIHx8IChvcC5tYXliZUhpZGRlbk1hcmtlcnMgPSBbXSkpLnB1c2godGhpcyk7XG4gICAgfVxuICB9O1xuICBldmVudE1peGluKFRleHRNYXJrZXIpO1xuXG4gIC8vIENyZWF0ZSBhIG1hcmtlciwgd2lyZSBpdCB1cCB0byB0aGUgcmlnaHQgbGluZXMsIGFuZFxuICBmdW5jdGlvbiBtYXJrVGV4dChkb2MsIGZyb20sIHRvLCBvcHRpb25zLCB0eXBlKSB7XG4gICAgLy8gU2hhcmVkIG1hcmtlcnMgKGFjcm9zcyBsaW5rZWQgZG9jdW1lbnRzKSBhcmUgaGFuZGxlZCBzZXBhcmF0ZWx5XG4gICAgLy8gKG1hcmtUZXh0U2hhcmVkIHdpbGwgY2FsbCBvdXQgdG8gdGhpcyBhZ2Fpbiwgb25jZSBwZXJcbiAgICAvLyBkb2N1bWVudCkuXG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5zaGFyZWQpIHsgcmV0dXJuIG1hcmtUZXh0U2hhcmVkKGRvYywgZnJvbSwgdG8sIG9wdGlvbnMsIHR5cGUpIH1cbiAgICAvLyBFbnN1cmUgd2UgYXJlIGluIGFuIG9wZXJhdGlvbi5cbiAgICBpZiAoZG9jLmNtICYmICFkb2MuY20uY3VyT3ApIHsgcmV0dXJuIG9wZXJhdGlvbihkb2MuY20sIG1hcmtUZXh0KShkb2MsIGZyb20sIHRvLCBvcHRpb25zLCB0eXBlKSB9XG5cbiAgICB2YXIgbWFya2VyID0gbmV3IFRleHRNYXJrZXIoZG9jLCB0eXBlKSwgZGlmZiA9IGNtcChmcm9tLCB0byk7XG4gICAgaWYgKG9wdGlvbnMpIHsgY29weU9iaihvcHRpb25zLCBtYXJrZXIsIGZhbHNlKTsgfVxuICAgIC8vIERvbid0IGNvbm5lY3QgZW1wdHkgbWFya2VycyB1bmxlc3MgY2xlYXJXaGVuRW1wdHkgaXMgZmFsc2VcbiAgICBpZiAoZGlmZiA+IDAgfHwgZGlmZiA9PSAwICYmIG1hcmtlci5jbGVhcldoZW5FbXB0eSAhPT0gZmFsc2UpXG4gICAgICB7IHJldHVybiBtYXJrZXIgfVxuICAgIGlmIChtYXJrZXIucmVwbGFjZWRXaXRoKSB7XG4gICAgICAvLyBTaG93aW5nIHVwIGFzIGEgd2lkZ2V0IGltcGxpZXMgY29sbGFwc2VkICh3aWRnZXQgcmVwbGFjZXMgdGV4dClcbiAgICAgIG1hcmtlci5jb2xsYXBzZWQgPSB0cnVlO1xuICAgICAgbWFya2VyLndpZGdldE5vZGUgPSBlbHRQKFwic3BhblwiLCBbbWFya2VyLnJlcGxhY2VkV2l0aF0sIFwiQ29kZU1pcnJvci13aWRnZXRcIik7XG4gICAgICBpZiAoIW9wdGlvbnMuaGFuZGxlTW91c2VFdmVudHMpIHsgbWFya2VyLndpZGdldE5vZGUuc2V0QXR0cmlidXRlKFwiY20taWdub3JlLWV2ZW50c1wiLCBcInRydWVcIik7IH1cbiAgICAgIGlmIChvcHRpb25zLmluc2VydExlZnQpIHsgbWFya2VyLndpZGdldE5vZGUuaW5zZXJ0TGVmdCA9IHRydWU7IH1cbiAgICB9XG4gICAgaWYgKG1hcmtlci5jb2xsYXBzZWQpIHtcbiAgICAgIGlmIChjb25mbGljdGluZ0NvbGxhcHNlZFJhbmdlKGRvYywgZnJvbS5saW5lLCBmcm9tLCB0bywgbWFya2VyKSB8fFxuICAgICAgICAgIGZyb20ubGluZSAhPSB0by5saW5lICYmIGNvbmZsaWN0aW5nQ29sbGFwc2VkUmFuZ2UoZG9jLCB0by5saW5lLCBmcm9tLCB0bywgbWFya2VyKSlcbiAgICAgICAgeyB0aHJvdyBuZXcgRXJyb3IoXCJJbnNlcnRpbmcgY29sbGFwc2VkIG1hcmtlciBwYXJ0aWFsbHkgb3ZlcmxhcHBpbmcgYW4gZXhpc3Rpbmcgb25lXCIpIH1cbiAgICAgIHNlZUNvbGxhcHNlZFNwYW5zKCk7XG4gICAgfVxuXG4gICAgaWYgKG1hcmtlci5hZGRUb0hpc3RvcnkpXG4gICAgICB7IGFkZENoYW5nZVRvSGlzdG9yeShkb2MsIHtmcm9tOiBmcm9tLCB0bzogdG8sIG9yaWdpbjogXCJtYXJrVGV4dFwifSwgZG9jLnNlbCwgTmFOKTsgfVxuXG4gICAgdmFyIGN1ckxpbmUgPSBmcm9tLmxpbmUsIGNtID0gZG9jLmNtLCB1cGRhdGVNYXhMaW5lO1xuICAgIGRvYy5pdGVyKGN1ckxpbmUsIHRvLmxpbmUgKyAxLCBmdW5jdGlvbiAobGluZSkge1xuICAgICAgaWYgKGNtICYmIG1hcmtlci5jb2xsYXBzZWQgJiYgIWNtLm9wdGlvbnMubGluZVdyYXBwaW5nICYmIHZpc3VhbExpbmUobGluZSkgPT0gY20uZGlzcGxheS5tYXhMaW5lKVxuICAgICAgICB7IHVwZGF0ZU1heExpbmUgPSB0cnVlOyB9XG4gICAgICBpZiAobWFya2VyLmNvbGxhcHNlZCAmJiBjdXJMaW5lICE9IGZyb20ubGluZSkgeyB1cGRhdGVMaW5lSGVpZ2h0KGxpbmUsIDApOyB9XG4gICAgICBhZGRNYXJrZWRTcGFuKGxpbmUsIG5ldyBNYXJrZWRTcGFuKG1hcmtlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyTGluZSA9PSBmcm9tLmxpbmUgPyBmcm9tLmNoIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyTGluZSA9PSB0by5saW5lID8gdG8uY2ggOiBudWxsKSk7XG4gICAgICArK2N1ckxpbmU7XG4gICAgfSk7XG4gICAgLy8gbGluZUlzSGlkZGVuIGRlcGVuZHMgb24gdGhlIHByZXNlbmNlIG9mIHRoZSBzcGFucywgc28gbmVlZHMgYSBzZWNvbmQgcGFzc1xuICAgIGlmIChtYXJrZXIuY29sbGFwc2VkKSB7IGRvYy5pdGVyKGZyb20ubGluZSwgdG8ubGluZSArIDEsIGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgICBpZiAobGluZUlzSGlkZGVuKGRvYywgbGluZSkpIHsgdXBkYXRlTGluZUhlaWdodChsaW5lLCAwKTsgfVxuICAgIH0pOyB9XG5cbiAgICBpZiAobWFya2VyLmNsZWFyT25FbnRlcikgeyBvbihtYXJrZXIsIFwiYmVmb3JlQ3Vyc29yRW50ZXJcIiwgZnVuY3Rpb24gKCkgeyByZXR1cm4gbWFya2VyLmNsZWFyKCk7IH0pOyB9XG5cbiAgICBpZiAobWFya2VyLnJlYWRPbmx5KSB7XG4gICAgICBzZWVSZWFkT25seVNwYW5zKCk7XG4gICAgICBpZiAoZG9jLmhpc3RvcnkuZG9uZS5sZW5ndGggfHwgZG9jLmhpc3RvcnkudW5kb25lLmxlbmd0aClcbiAgICAgICAgeyBkb2MuY2xlYXJIaXN0b3J5KCk7IH1cbiAgICB9XG4gICAgaWYgKG1hcmtlci5jb2xsYXBzZWQpIHtcbiAgICAgIG1hcmtlci5pZCA9ICsrbmV4dE1hcmtlcklkO1xuICAgICAgbWFya2VyLmF0b21pYyA9IHRydWU7XG4gICAgfVxuICAgIGlmIChjbSkge1xuICAgICAgLy8gU3luYyBlZGl0b3Igc3RhdGVcbiAgICAgIGlmICh1cGRhdGVNYXhMaW5lKSB7IGNtLmN1ck9wLnVwZGF0ZU1heExpbmUgPSB0cnVlOyB9XG4gICAgICBpZiAobWFya2VyLmNvbGxhcHNlZClcbiAgICAgICAgeyByZWdDaGFuZ2UoY20sIGZyb20ubGluZSwgdG8ubGluZSArIDEpOyB9XG4gICAgICBlbHNlIGlmIChtYXJrZXIuY2xhc3NOYW1lIHx8IG1hcmtlci5zdGFydFN0eWxlIHx8IG1hcmtlci5lbmRTdHlsZSB8fCBtYXJrZXIuY3NzIHx8XG4gICAgICAgICAgICAgICBtYXJrZXIuYXR0cmlidXRlcyB8fCBtYXJrZXIudGl0bGUpXG4gICAgICAgIHsgZm9yICh2YXIgaSA9IGZyb20ubGluZTsgaSA8PSB0by5saW5lOyBpKyspIHsgcmVnTGluZUNoYW5nZShjbSwgaSwgXCJ0ZXh0XCIpOyB9IH1cbiAgICAgIGlmIChtYXJrZXIuYXRvbWljKSB7IHJlQ2hlY2tTZWxlY3Rpb24oY20uZG9jKTsgfVxuICAgICAgc2lnbmFsTGF0ZXIoY20sIFwibWFya2VyQWRkZWRcIiwgY20sIG1hcmtlcik7XG4gICAgfVxuICAgIHJldHVybiBtYXJrZXJcbiAgfVxuXG4gIC8vIFNIQVJFRCBURVhUTUFSS0VSU1xuXG4gIC8vIEEgc2hhcmVkIG1hcmtlciBzcGFucyBtdWx0aXBsZSBsaW5rZWQgZG9jdW1lbnRzLiBJdCBpc1xuICAvLyBpbXBsZW1lbnRlZCBhcyBhIG1ldGEtbWFya2VyLW9iamVjdCBjb250cm9sbGluZyBtdWx0aXBsZSBub3JtYWxcbiAgLy8gbWFya2Vycy5cbiAgdmFyIFNoYXJlZFRleHRNYXJrZXIgPSBmdW5jdGlvbihtYXJrZXJzLCBwcmltYXJ5KSB7XG4gICAgdGhpcy5tYXJrZXJzID0gbWFya2VycztcbiAgICB0aGlzLnByaW1hcnkgPSBwcmltYXJ5O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7ICsraSlcbiAgICAgIHsgbWFya2Vyc1tpXS5wYXJlbnQgPSB0aGlzOyB9XG4gIH07XG5cbiAgU2hhcmVkVGV4dE1hcmtlci5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuZXhwbGljaXRseUNsZWFyZWQpIHsgcmV0dXJuIH1cbiAgICB0aGlzLmV4cGxpY2l0bHlDbGVhcmVkID0gdHJ1ZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubWFya2Vycy5sZW5ndGg7ICsraSlcbiAgICAgIHsgdGhpcy5tYXJrZXJzW2ldLmNsZWFyKCk7IH1cbiAgICBzaWduYWxMYXRlcih0aGlzLCBcImNsZWFyXCIpO1xuICB9O1xuXG4gIFNoYXJlZFRleHRNYXJrZXIucHJvdG90eXBlLmZpbmQgPSBmdW5jdGlvbiAoc2lkZSwgbGluZU9iaikge1xuICAgIHJldHVybiB0aGlzLnByaW1hcnkuZmluZChzaWRlLCBsaW5lT2JqKVxuICB9O1xuICBldmVudE1peGluKFNoYXJlZFRleHRNYXJrZXIpO1xuXG4gIGZ1bmN0aW9uIG1hcmtUZXh0U2hhcmVkKGRvYywgZnJvbSwgdG8sIG9wdGlvbnMsIHR5cGUpIHtcbiAgICBvcHRpb25zID0gY29weU9iaihvcHRpb25zKTtcbiAgICBvcHRpb25zLnNoYXJlZCA9IGZhbHNlO1xuICAgIHZhciBtYXJrZXJzID0gW21hcmtUZXh0KGRvYywgZnJvbSwgdG8sIG9wdGlvbnMsIHR5cGUpXSwgcHJpbWFyeSA9IG1hcmtlcnNbMF07XG4gICAgdmFyIHdpZGdldCA9IG9wdGlvbnMud2lkZ2V0Tm9kZTtcbiAgICBsaW5rZWREb2NzKGRvYywgZnVuY3Rpb24gKGRvYykge1xuICAgICAgaWYgKHdpZGdldCkgeyBvcHRpb25zLndpZGdldE5vZGUgPSB3aWRnZXQuY2xvbmVOb2RlKHRydWUpOyB9XG4gICAgICBtYXJrZXJzLnB1c2gobWFya1RleHQoZG9jLCBjbGlwUG9zKGRvYywgZnJvbSksIGNsaXBQb3MoZG9jLCB0byksIG9wdGlvbnMsIHR5cGUpKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZG9jLmxpbmtlZC5sZW5ndGg7ICsraSlcbiAgICAgICAgeyBpZiAoZG9jLmxpbmtlZFtpXS5pc1BhcmVudCkgeyByZXR1cm4gfSB9XG4gICAgICBwcmltYXJ5ID0gbHN0KG1hcmtlcnMpO1xuICAgIH0pO1xuICAgIHJldHVybiBuZXcgU2hhcmVkVGV4dE1hcmtlcihtYXJrZXJzLCBwcmltYXJ5KVxuICB9XG5cbiAgZnVuY3Rpb24gZmluZFNoYXJlZE1hcmtlcnMoZG9jKSB7XG4gICAgcmV0dXJuIGRvYy5maW5kTWFya3MoUG9zKGRvYy5maXJzdCwgMCksIGRvYy5jbGlwUG9zKFBvcyhkb2MubGFzdExpbmUoKSkpLCBmdW5jdGlvbiAobSkgeyByZXR1cm4gbS5wYXJlbnQ7IH0pXG4gIH1cblxuICBmdW5jdGlvbiBjb3B5U2hhcmVkTWFya2Vycyhkb2MsIG1hcmtlcnMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBtYXJrZXIgPSBtYXJrZXJzW2ldLCBwb3MgPSBtYXJrZXIuZmluZCgpO1xuICAgICAgdmFyIG1Gcm9tID0gZG9jLmNsaXBQb3MocG9zLmZyb20pLCBtVG8gPSBkb2MuY2xpcFBvcyhwb3MudG8pO1xuICAgICAgaWYgKGNtcChtRnJvbSwgbVRvKSkge1xuICAgICAgICB2YXIgc3ViTWFyayA9IG1hcmtUZXh0KGRvYywgbUZyb20sIG1UbywgbWFya2VyLnByaW1hcnksIG1hcmtlci5wcmltYXJ5LnR5cGUpO1xuICAgICAgICBtYXJrZXIubWFya2Vycy5wdXNoKHN1Yk1hcmspO1xuICAgICAgICBzdWJNYXJrLnBhcmVudCA9IG1hcmtlcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBkZXRhY2hTaGFyZWRNYXJrZXJzKG1hcmtlcnMpIHtcbiAgICB2YXIgbG9vcCA9IGZ1bmN0aW9uICggaSApIHtcbiAgICAgIHZhciBtYXJrZXIgPSBtYXJrZXJzW2ldLCBsaW5rZWQgPSBbbWFya2VyLnByaW1hcnkuZG9jXTtcbiAgICAgIGxpbmtlZERvY3MobWFya2VyLnByaW1hcnkuZG9jLCBmdW5jdGlvbiAoZCkgeyByZXR1cm4gbGlua2VkLnB1c2goZCk7IH0pO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBtYXJrZXIubWFya2Vycy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgc3ViTWFya2VyID0gbWFya2VyLm1hcmtlcnNbal07XG4gICAgICAgIGlmIChpbmRleE9mKGxpbmtlZCwgc3ViTWFya2VyLmRvYykgPT0gLTEpIHtcbiAgICAgICAgICBzdWJNYXJrZXIucGFyZW50ID0gbnVsbDtcbiAgICAgICAgICBtYXJrZXIubWFya2Vycy5zcGxpY2Uoai0tLCAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIGxvb3AoIGkgKTtcbiAgfVxuXG4gIHZhciBuZXh0RG9jSWQgPSAwO1xuICB2YXIgRG9jID0gZnVuY3Rpb24odGV4dCwgbW9kZSwgZmlyc3RMaW5lLCBsaW5lU2VwLCBkaXJlY3Rpb24pIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRG9jKSkgeyByZXR1cm4gbmV3IERvYyh0ZXh0LCBtb2RlLCBmaXJzdExpbmUsIGxpbmVTZXAsIGRpcmVjdGlvbikgfVxuICAgIGlmIChmaXJzdExpbmUgPT0gbnVsbCkgeyBmaXJzdExpbmUgPSAwOyB9XG5cbiAgICBCcmFuY2hDaHVuay5jYWxsKHRoaXMsIFtuZXcgTGVhZkNodW5rKFtuZXcgTGluZShcIlwiLCBudWxsKV0pXSk7XG4gICAgdGhpcy5maXJzdCA9IGZpcnN0TGluZTtcbiAgICB0aGlzLnNjcm9sbFRvcCA9IHRoaXMuc2Nyb2xsTGVmdCA9IDA7XG4gICAgdGhpcy5jYW50RWRpdCA9IGZhbHNlO1xuICAgIHRoaXMuY2xlYW5HZW5lcmF0aW9uID0gMTtcbiAgICB0aGlzLm1vZGVGcm9udGllciA9IHRoaXMuaGlnaGxpZ2h0RnJvbnRpZXIgPSBmaXJzdExpbmU7XG4gICAgdmFyIHN0YXJ0ID0gUG9zKGZpcnN0TGluZSwgMCk7XG4gICAgdGhpcy5zZWwgPSBzaW1wbGVTZWxlY3Rpb24oc3RhcnQpO1xuICAgIHRoaXMuaGlzdG9yeSA9IG5ldyBIaXN0b3J5KG51bGwpO1xuICAgIHRoaXMuaWQgPSArK25leHREb2NJZDtcbiAgICB0aGlzLm1vZGVPcHRpb24gPSBtb2RlO1xuICAgIHRoaXMubGluZVNlcCA9IGxpbmVTZXA7XG4gICAgdGhpcy5kaXJlY3Rpb24gPSAoZGlyZWN0aW9uID09IFwicnRsXCIpID8gXCJydGxcIiA6IFwibHRyXCI7XG4gICAgdGhpcy5leHRlbmQgPSBmYWxzZTtcblxuICAgIGlmICh0eXBlb2YgdGV4dCA9PSBcInN0cmluZ1wiKSB7IHRleHQgPSB0aGlzLnNwbGl0TGluZXModGV4dCk7IH1cbiAgICB1cGRhdGVEb2ModGhpcywge2Zyb206IHN0YXJ0LCB0bzogc3RhcnQsIHRleHQ6IHRleHR9KTtcbiAgICBzZXRTZWxlY3Rpb24odGhpcywgc2ltcGxlU2VsZWN0aW9uKHN0YXJ0KSwgc2VsX2RvbnRTY3JvbGwpO1xuICB9O1xuXG4gIERvYy5wcm90b3R5cGUgPSBjcmVhdGVPYmooQnJhbmNoQ2h1bmsucHJvdG90eXBlLCB7XG4gICAgY29uc3RydWN0b3I6IERvYyxcbiAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIGRvY3VtZW50LiBTdXBwb3J0cyB0d28gZm9ybXMgLS0gd2l0aCBvbmx5IG9uZVxuICAgIC8vIGFyZ3VtZW50LCBpdCBjYWxscyB0aGF0IGZvciBlYWNoIGxpbmUgaW4gdGhlIGRvY3VtZW50LiBXaXRoXG4gICAgLy8gdGhyZWUsIGl0IGl0ZXJhdGVzIG92ZXIgdGhlIHJhbmdlIGdpdmVuIGJ5IHRoZSBmaXJzdCB0d28gKHdpdGhcbiAgICAvLyB0aGUgc2Vjb25kIGJlaW5nIG5vbi1pbmNsdXNpdmUpLlxuICAgIGl0ZXI6IGZ1bmN0aW9uKGZyb20sIHRvLCBvcCkge1xuICAgICAgaWYgKG9wKSB7IHRoaXMuaXRlck4oZnJvbSAtIHRoaXMuZmlyc3QsIHRvIC0gZnJvbSwgb3ApOyB9XG4gICAgICBlbHNlIHsgdGhpcy5pdGVyTih0aGlzLmZpcnN0LCB0aGlzLmZpcnN0ICsgdGhpcy5zaXplLCBmcm9tKTsgfVxuICAgIH0sXG5cbiAgICAvLyBOb24tcHVibGljIGludGVyZmFjZSBmb3IgYWRkaW5nIGFuZCByZW1vdmluZyBsaW5lcy5cbiAgICBpbnNlcnQ6IGZ1bmN0aW9uKGF0LCBsaW5lcykge1xuICAgICAgdmFyIGhlaWdodCA9IDA7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgKytpKSB7IGhlaWdodCArPSBsaW5lc1tpXS5oZWlnaHQ7IH1cbiAgICAgIHRoaXMuaW5zZXJ0SW5uZXIoYXQgLSB0aGlzLmZpcnN0LCBsaW5lcywgaGVpZ2h0KTtcbiAgICB9LFxuICAgIHJlbW92ZTogZnVuY3Rpb24oYXQsIG4pIHsgdGhpcy5yZW1vdmVJbm5lcihhdCAtIHRoaXMuZmlyc3QsIG4pOyB9LFxuXG4gICAgLy8gRnJvbSBoZXJlLCB0aGUgbWV0aG9kcyBhcmUgcGFydCBvZiB0aGUgcHVibGljIGludGVyZmFjZS4gTW9zdFxuICAgIC8vIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIENvZGVNaXJyb3IgKGVkaXRvcikgaW5zdGFuY2VzLlxuXG4gICAgZ2V0VmFsdWU6IGZ1bmN0aW9uKGxpbmVTZXApIHtcbiAgICAgIHZhciBsaW5lcyA9IGdldExpbmVzKHRoaXMsIHRoaXMuZmlyc3QsIHRoaXMuZmlyc3QgKyB0aGlzLnNpemUpO1xuICAgICAgaWYgKGxpbmVTZXAgPT09IGZhbHNlKSB7IHJldHVybiBsaW5lcyB9XG4gICAgICByZXR1cm4gbGluZXMuam9pbihsaW5lU2VwIHx8IHRoaXMubGluZVNlcGFyYXRvcigpKVxuICAgIH0sXG4gICAgc2V0VmFsdWU6IGRvY01ldGhvZE9wKGZ1bmN0aW9uKGNvZGUpIHtcbiAgICAgIHZhciB0b3AgPSBQb3ModGhpcy5maXJzdCwgMCksIGxhc3QgPSB0aGlzLmZpcnN0ICsgdGhpcy5zaXplIC0gMTtcbiAgICAgIG1ha2VDaGFuZ2UodGhpcywge2Zyb206IHRvcCwgdG86IFBvcyhsYXN0LCBnZXRMaW5lKHRoaXMsIGxhc3QpLnRleHQubGVuZ3RoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IHRoaXMuc3BsaXRMaW5lcyhjb2RlKSwgb3JpZ2luOiBcInNldFZhbHVlXCIsIGZ1bGw6IHRydWV9LCB0cnVlKTtcbiAgICAgIGlmICh0aGlzLmNtKSB7IHNjcm9sbFRvQ29vcmRzKHRoaXMuY20sIDAsIDApOyB9XG4gICAgICBzZXRTZWxlY3Rpb24odGhpcywgc2ltcGxlU2VsZWN0aW9uKHRvcCksIHNlbF9kb250U2Nyb2xsKTtcbiAgICB9KSxcbiAgICByZXBsYWNlUmFuZ2U6IGZ1bmN0aW9uKGNvZGUsIGZyb20sIHRvLCBvcmlnaW4pIHtcbiAgICAgIGZyb20gPSBjbGlwUG9zKHRoaXMsIGZyb20pO1xuICAgICAgdG8gPSB0byA/IGNsaXBQb3ModGhpcywgdG8pIDogZnJvbTtcbiAgICAgIHJlcGxhY2VSYW5nZSh0aGlzLCBjb2RlLCBmcm9tLCB0bywgb3JpZ2luKTtcbiAgICB9LFxuICAgIGdldFJhbmdlOiBmdW5jdGlvbihmcm9tLCB0bywgbGluZVNlcCkge1xuICAgICAgdmFyIGxpbmVzID0gZ2V0QmV0d2Vlbih0aGlzLCBjbGlwUG9zKHRoaXMsIGZyb20pLCBjbGlwUG9zKHRoaXMsIHRvKSk7XG4gICAgICBpZiAobGluZVNlcCA9PT0gZmFsc2UpIHsgcmV0dXJuIGxpbmVzIH1cbiAgICAgIHJldHVybiBsaW5lcy5qb2luKGxpbmVTZXAgfHwgdGhpcy5saW5lU2VwYXJhdG9yKCkpXG4gICAgfSxcblxuICAgIGdldExpbmU6IGZ1bmN0aW9uKGxpbmUpIHt2YXIgbCA9IHRoaXMuZ2V0TGluZUhhbmRsZShsaW5lKTsgcmV0dXJuIGwgJiYgbC50ZXh0fSxcblxuICAgIGdldExpbmVIYW5kbGU6IGZ1bmN0aW9uKGxpbmUpIHtpZiAoaXNMaW5lKHRoaXMsIGxpbmUpKSB7IHJldHVybiBnZXRMaW5lKHRoaXMsIGxpbmUpIH19LFxuICAgIGdldExpbmVOdW1iZXI6IGZ1bmN0aW9uKGxpbmUpIHtyZXR1cm4gbGluZU5vKGxpbmUpfSxcblxuICAgIGdldExpbmVIYW5kbGVWaXN1YWxTdGFydDogZnVuY3Rpb24obGluZSkge1xuICAgICAgaWYgKHR5cGVvZiBsaW5lID09IFwibnVtYmVyXCIpIHsgbGluZSA9IGdldExpbmUodGhpcywgbGluZSk7IH1cbiAgICAgIHJldHVybiB2aXN1YWxMaW5lKGxpbmUpXG4gICAgfSxcblxuICAgIGxpbmVDb3VudDogZnVuY3Rpb24oKSB7cmV0dXJuIHRoaXMuc2l6ZX0sXG4gICAgZmlyc3RMaW5lOiBmdW5jdGlvbigpIHtyZXR1cm4gdGhpcy5maXJzdH0sXG4gICAgbGFzdExpbmU6IGZ1bmN0aW9uKCkge3JldHVybiB0aGlzLmZpcnN0ICsgdGhpcy5zaXplIC0gMX0sXG5cbiAgICBjbGlwUG9zOiBmdW5jdGlvbihwb3MpIHtyZXR1cm4gY2xpcFBvcyh0aGlzLCBwb3MpfSxcblxuICAgIGdldEN1cnNvcjogZnVuY3Rpb24oc3RhcnQpIHtcbiAgICAgIHZhciByYW5nZSA9IHRoaXMuc2VsLnByaW1hcnkoKSwgcG9zO1xuICAgICAgaWYgKHN0YXJ0ID09IG51bGwgfHwgc3RhcnQgPT0gXCJoZWFkXCIpIHsgcG9zID0gcmFuZ2UuaGVhZDsgfVxuICAgICAgZWxzZSBpZiAoc3RhcnQgPT0gXCJhbmNob3JcIikgeyBwb3MgPSByYW5nZS5hbmNob3I7IH1cbiAgICAgIGVsc2UgaWYgKHN0YXJ0ID09IFwiZW5kXCIgfHwgc3RhcnQgPT0gXCJ0b1wiIHx8IHN0YXJ0ID09PSBmYWxzZSkgeyBwb3MgPSByYW5nZS50bygpOyB9XG4gICAgICBlbHNlIHsgcG9zID0gcmFuZ2UuZnJvbSgpOyB9XG4gICAgICByZXR1cm4gcG9zXG4gICAgfSxcbiAgICBsaXN0U2VsZWN0aW9uczogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLnNlbC5yYW5nZXMgfSxcbiAgICBzb21ldGhpbmdTZWxlY3RlZDogZnVuY3Rpb24oKSB7cmV0dXJuIHRoaXMuc2VsLnNvbWV0aGluZ1NlbGVjdGVkKCl9LFxuXG4gICAgc2V0Q3Vyc29yOiBkb2NNZXRob2RPcChmdW5jdGlvbihsaW5lLCBjaCwgb3B0aW9ucykge1xuICAgICAgc2V0U2ltcGxlU2VsZWN0aW9uKHRoaXMsIGNsaXBQb3ModGhpcywgdHlwZW9mIGxpbmUgPT0gXCJudW1iZXJcIiA/IFBvcyhsaW5lLCBjaCB8fCAwKSA6IGxpbmUpLCBudWxsLCBvcHRpb25zKTtcbiAgICB9KSxcbiAgICBzZXRTZWxlY3Rpb246IGRvY01ldGhvZE9wKGZ1bmN0aW9uKGFuY2hvciwgaGVhZCwgb3B0aW9ucykge1xuICAgICAgc2V0U2ltcGxlU2VsZWN0aW9uKHRoaXMsIGNsaXBQb3ModGhpcywgYW5jaG9yKSwgY2xpcFBvcyh0aGlzLCBoZWFkIHx8IGFuY2hvciksIG9wdGlvbnMpO1xuICAgIH0pLFxuICAgIGV4dGVuZFNlbGVjdGlvbjogZG9jTWV0aG9kT3AoZnVuY3Rpb24oaGVhZCwgb3RoZXIsIG9wdGlvbnMpIHtcbiAgICAgIGV4dGVuZFNlbGVjdGlvbih0aGlzLCBjbGlwUG9zKHRoaXMsIGhlYWQpLCBvdGhlciAmJiBjbGlwUG9zKHRoaXMsIG90aGVyKSwgb3B0aW9ucyk7XG4gICAgfSksXG4gICAgZXh0ZW5kU2VsZWN0aW9uczogZG9jTWV0aG9kT3AoZnVuY3Rpb24oaGVhZHMsIG9wdGlvbnMpIHtcbiAgICAgIGV4dGVuZFNlbGVjdGlvbnModGhpcywgY2xpcFBvc0FycmF5KHRoaXMsIGhlYWRzKSwgb3B0aW9ucyk7XG4gICAgfSksXG4gICAgZXh0ZW5kU2VsZWN0aW9uc0J5OiBkb2NNZXRob2RPcChmdW5jdGlvbihmLCBvcHRpb25zKSB7XG4gICAgICB2YXIgaGVhZHMgPSBtYXAodGhpcy5zZWwucmFuZ2VzLCBmKTtcbiAgICAgIGV4dGVuZFNlbGVjdGlvbnModGhpcywgY2xpcFBvc0FycmF5KHRoaXMsIGhlYWRzKSwgb3B0aW9ucyk7XG4gICAgfSksXG4gICAgc2V0U2VsZWN0aW9uczogZG9jTWV0aG9kT3AoZnVuY3Rpb24ocmFuZ2VzLCBwcmltYXJ5LCBvcHRpb25zKSB7XG4gICAgICBpZiAoIXJhbmdlcy5sZW5ndGgpIHsgcmV0dXJuIH1cbiAgICAgIHZhciBvdXQgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKVxuICAgICAgICB7IG91dFtpXSA9IG5ldyBSYW5nZShjbGlwUG9zKHRoaXMsIHJhbmdlc1tpXS5hbmNob3IpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcFBvcyh0aGlzLCByYW5nZXNbaV0uaGVhZCkpOyB9XG4gICAgICBpZiAocHJpbWFyeSA9PSBudWxsKSB7IHByaW1hcnkgPSBNYXRoLm1pbihyYW5nZXMubGVuZ3RoIC0gMSwgdGhpcy5zZWwucHJpbUluZGV4KTsgfVxuICAgICAgc2V0U2VsZWN0aW9uKHRoaXMsIG5vcm1hbGl6ZVNlbGVjdGlvbih0aGlzLmNtLCBvdXQsIHByaW1hcnkpLCBvcHRpb25zKTtcbiAgICB9KSxcbiAgICBhZGRTZWxlY3Rpb246IGRvY01ldGhvZE9wKGZ1bmN0aW9uKGFuY2hvciwgaGVhZCwgb3B0aW9ucykge1xuICAgICAgdmFyIHJhbmdlcyA9IHRoaXMuc2VsLnJhbmdlcy5zbGljZSgwKTtcbiAgICAgIHJhbmdlcy5wdXNoKG5ldyBSYW5nZShjbGlwUG9zKHRoaXMsIGFuY2hvciksIGNsaXBQb3ModGhpcywgaGVhZCB8fCBhbmNob3IpKSk7XG4gICAgICBzZXRTZWxlY3Rpb24odGhpcywgbm9ybWFsaXplU2VsZWN0aW9uKHRoaXMuY20sIHJhbmdlcywgcmFuZ2VzLmxlbmd0aCAtIDEpLCBvcHRpb25zKTtcbiAgICB9KSxcblxuICAgIGdldFNlbGVjdGlvbjogZnVuY3Rpb24obGluZVNlcCkge1xuICAgICAgdmFyIHJhbmdlcyA9IHRoaXMuc2VsLnJhbmdlcywgbGluZXM7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc2VsID0gZ2V0QmV0d2Vlbih0aGlzLCByYW5nZXNbaV0uZnJvbSgpLCByYW5nZXNbaV0udG8oKSk7XG4gICAgICAgIGxpbmVzID0gbGluZXMgPyBsaW5lcy5jb25jYXQoc2VsKSA6IHNlbDtcbiAgICAgIH1cbiAgICAgIGlmIChsaW5lU2VwID09PSBmYWxzZSkgeyByZXR1cm4gbGluZXMgfVxuICAgICAgZWxzZSB7IHJldHVybiBsaW5lcy5qb2luKGxpbmVTZXAgfHwgdGhpcy5saW5lU2VwYXJhdG9yKCkpIH1cbiAgICB9LFxuICAgIGdldFNlbGVjdGlvbnM6IGZ1bmN0aW9uKGxpbmVTZXApIHtcbiAgICAgIHZhciBwYXJ0cyA9IFtdLCByYW5nZXMgPSB0aGlzLnNlbC5yYW5nZXM7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc2VsID0gZ2V0QmV0d2Vlbih0aGlzLCByYW5nZXNbaV0uZnJvbSgpLCByYW5nZXNbaV0udG8oKSk7XG4gICAgICAgIGlmIChsaW5lU2VwICE9PSBmYWxzZSkgeyBzZWwgPSBzZWwuam9pbihsaW5lU2VwIHx8IHRoaXMubGluZVNlcGFyYXRvcigpKTsgfVxuICAgICAgICBwYXJ0c1tpXSA9IHNlbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXJ0c1xuICAgIH0sXG4gICAgcmVwbGFjZVNlbGVjdGlvbjogZnVuY3Rpb24oY29kZSwgY29sbGFwc2UsIG9yaWdpbikge1xuICAgICAgdmFyIGR1cCA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnNlbC5yYW5nZXMubGVuZ3RoOyBpKyspXG4gICAgICAgIHsgZHVwW2ldID0gY29kZTsgfVxuICAgICAgdGhpcy5yZXBsYWNlU2VsZWN0aW9ucyhkdXAsIGNvbGxhcHNlLCBvcmlnaW4gfHwgXCIraW5wdXRcIik7XG4gICAgfSxcbiAgICByZXBsYWNlU2VsZWN0aW9uczogZG9jTWV0aG9kT3AoZnVuY3Rpb24oY29kZSwgY29sbGFwc2UsIG9yaWdpbikge1xuICAgICAgdmFyIGNoYW5nZXMgPSBbXSwgc2VsID0gdGhpcy5zZWw7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbC5yYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHJhbmdlID0gc2VsLnJhbmdlc1tpXTtcbiAgICAgICAgY2hhbmdlc1tpXSA9IHtmcm9tOiByYW5nZS5mcm9tKCksIHRvOiByYW5nZS50bygpLCB0ZXh0OiB0aGlzLnNwbGl0TGluZXMoY29kZVtpXSksIG9yaWdpbjogb3JpZ2lufTtcbiAgICAgIH1cbiAgICAgIHZhciBuZXdTZWwgPSBjb2xsYXBzZSAmJiBjb2xsYXBzZSAhPSBcImVuZFwiICYmIGNvbXB1dGVSZXBsYWNlZFNlbCh0aGlzLCBjaGFuZ2VzLCBjb2xsYXBzZSk7XG4gICAgICBmb3IgKHZhciBpJDEgPSBjaGFuZ2VzLmxlbmd0aCAtIDE7IGkkMSA+PSAwOyBpJDEtLSlcbiAgICAgICAgeyBtYWtlQ2hhbmdlKHRoaXMsIGNoYW5nZXNbaSQxXSk7IH1cbiAgICAgIGlmIChuZXdTZWwpIHsgc2V0U2VsZWN0aW9uUmVwbGFjZUhpc3RvcnkodGhpcywgbmV3U2VsKTsgfVxuICAgICAgZWxzZSBpZiAodGhpcy5jbSkgeyBlbnN1cmVDdXJzb3JWaXNpYmxlKHRoaXMuY20pOyB9XG4gICAgfSksXG4gICAgdW5kbzogZG9jTWV0aG9kT3AoZnVuY3Rpb24oKSB7bWFrZUNoYW5nZUZyb21IaXN0b3J5KHRoaXMsIFwidW5kb1wiKTt9KSxcbiAgICByZWRvOiBkb2NNZXRob2RPcChmdW5jdGlvbigpIHttYWtlQ2hhbmdlRnJvbUhpc3RvcnkodGhpcywgXCJyZWRvXCIpO30pLFxuICAgIHVuZG9TZWxlY3Rpb246IGRvY01ldGhvZE9wKGZ1bmN0aW9uKCkge21ha2VDaGFuZ2VGcm9tSGlzdG9yeSh0aGlzLCBcInVuZG9cIiwgdHJ1ZSk7fSksXG4gICAgcmVkb1NlbGVjdGlvbjogZG9jTWV0aG9kT3AoZnVuY3Rpb24oKSB7bWFrZUNoYW5nZUZyb21IaXN0b3J5KHRoaXMsIFwicmVkb1wiLCB0cnVlKTt9KSxcblxuICAgIHNldEV4dGVuZGluZzogZnVuY3Rpb24odmFsKSB7dGhpcy5leHRlbmQgPSB2YWw7fSxcbiAgICBnZXRFeHRlbmRpbmc6IGZ1bmN0aW9uKCkge3JldHVybiB0aGlzLmV4dGVuZH0sXG5cbiAgICBoaXN0b3J5U2l6ZTogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgaGlzdCA9IHRoaXMuaGlzdG9yeSwgZG9uZSA9IDAsIHVuZG9uZSA9IDA7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhpc3QuZG9uZS5sZW5ndGg7IGkrKykgeyBpZiAoIWhpc3QuZG9uZVtpXS5yYW5nZXMpIHsgKytkb25lOyB9IH1cbiAgICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IGhpc3QudW5kb25lLmxlbmd0aDsgaSQxKyspIHsgaWYgKCFoaXN0LnVuZG9uZVtpJDFdLnJhbmdlcykgeyArK3VuZG9uZTsgfSB9XG4gICAgICByZXR1cm4ge3VuZG86IGRvbmUsIHJlZG86IHVuZG9uZX1cbiAgICB9LFxuICAgIGNsZWFySGlzdG9yeTogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgICAgdGhpcy5oaXN0b3J5ID0gbmV3IEhpc3RvcnkodGhpcy5oaXN0b3J5Lm1heEdlbmVyYXRpb24pO1xuICAgICAgbGlua2VkRG9jcyh0aGlzLCBmdW5jdGlvbiAoZG9jKSB7IHJldHVybiBkb2MuaGlzdG9yeSA9IHRoaXMkMS5oaXN0b3J5OyB9LCB0cnVlKTtcbiAgICB9LFxuXG4gICAgbWFya0NsZWFuOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuY2xlYW5HZW5lcmF0aW9uID0gdGhpcy5jaGFuZ2VHZW5lcmF0aW9uKHRydWUpO1xuICAgIH0sXG4gICAgY2hhbmdlR2VuZXJhdGlvbjogZnVuY3Rpb24oZm9yY2VTcGxpdCkge1xuICAgICAgaWYgKGZvcmNlU3BsaXQpXG4gICAgICAgIHsgdGhpcy5oaXN0b3J5Lmxhc3RPcCA9IHRoaXMuaGlzdG9yeS5sYXN0U2VsT3AgPSB0aGlzLmhpc3RvcnkubGFzdE9yaWdpbiA9IG51bGw7IH1cbiAgICAgIHJldHVybiB0aGlzLmhpc3RvcnkuZ2VuZXJhdGlvblxuICAgIH0sXG4gICAgaXNDbGVhbjogZnVuY3Rpb24gKGdlbikge1xuICAgICAgcmV0dXJuIHRoaXMuaGlzdG9yeS5nZW5lcmF0aW9uID09IChnZW4gfHwgdGhpcy5jbGVhbkdlbmVyYXRpb24pXG4gICAgfSxcblxuICAgIGdldEhpc3Rvcnk6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHtkb25lOiBjb3B5SGlzdG9yeUFycmF5KHRoaXMuaGlzdG9yeS5kb25lKSxcbiAgICAgICAgICAgICAgdW5kb25lOiBjb3B5SGlzdG9yeUFycmF5KHRoaXMuaGlzdG9yeS51bmRvbmUpfVxuICAgIH0sXG4gICAgc2V0SGlzdG9yeTogZnVuY3Rpb24oaGlzdERhdGEpIHtcbiAgICAgIHZhciBoaXN0ID0gdGhpcy5oaXN0b3J5ID0gbmV3IEhpc3RvcnkodGhpcy5oaXN0b3J5Lm1heEdlbmVyYXRpb24pO1xuICAgICAgaGlzdC5kb25lID0gY29weUhpc3RvcnlBcnJheShoaXN0RGF0YS5kb25lLnNsaWNlKDApLCBudWxsLCB0cnVlKTtcbiAgICAgIGhpc3QudW5kb25lID0gY29weUhpc3RvcnlBcnJheShoaXN0RGF0YS51bmRvbmUuc2xpY2UoMCksIG51bGwsIHRydWUpO1xuICAgIH0sXG5cbiAgICBzZXRHdXR0ZXJNYXJrZXI6IGRvY01ldGhvZE9wKGZ1bmN0aW9uKGxpbmUsIGd1dHRlcklELCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGNoYW5nZUxpbmUodGhpcywgbGluZSwgXCJndXR0ZXJcIiwgZnVuY3Rpb24gKGxpbmUpIHtcbiAgICAgICAgdmFyIG1hcmtlcnMgPSBsaW5lLmd1dHRlck1hcmtlcnMgfHwgKGxpbmUuZ3V0dGVyTWFya2VycyA9IHt9KTtcbiAgICAgICAgbWFya2Vyc1tndXR0ZXJJRF0gPSB2YWx1ZTtcbiAgICAgICAgaWYgKCF2YWx1ZSAmJiBpc0VtcHR5KG1hcmtlcnMpKSB7IGxpbmUuZ3V0dGVyTWFya2VycyA9IG51bGw7IH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0pXG4gICAgfSksXG5cbiAgICBjbGVhckd1dHRlcjogZG9jTWV0aG9kT3AoZnVuY3Rpb24oZ3V0dGVySUQpIHtcbiAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgICB0aGlzLml0ZXIoZnVuY3Rpb24gKGxpbmUpIHtcbiAgICAgICAgaWYgKGxpbmUuZ3V0dGVyTWFya2VycyAmJiBsaW5lLmd1dHRlck1hcmtlcnNbZ3V0dGVySURdKSB7XG4gICAgICAgICAgY2hhbmdlTGluZSh0aGlzJDEsIGxpbmUsIFwiZ3V0dGVyXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxpbmUuZ3V0dGVyTWFya2Vyc1tndXR0ZXJJRF0gPSBudWxsO1xuICAgICAgICAgICAgaWYgKGlzRW1wdHkobGluZS5ndXR0ZXJNYXJrZXJzKSkgeyBsaW5lLmd1dHRlck1hcmtlcnMgPSBudWxsOyB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KSxcblxuICAgIGxpbmVJbmZvOiBmdW5jdGlvbihsaW5lKSB7XG4gICAgICB2YXIgbjtcbiAgICAgIGlmICh0eXBlb2YgbGluZSA9PSBcIm51bWJlclwiKSB7XG4gICAgICAgIGlmICghaXNMaW5lKHRoaXMsIGxpbmUpKSB7IHJldHVybiBudWxsIH1cbiAgICAgICAgbiA9IGxpbmU7XG4gICAgICAgIGxpbmUgPSBnZXRMaW5lKHRoaXMsIGxpbmUpO1xuICAgICAgICBpZiAoIWxpbmUpIHsgcmV0dXJuIG51bGwgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbiA9IGxpbmVObyhsaW5lKTtcbiAgICAgICAgaWYgKG4gPT0gbnVsbCkgeyByZXR1cm4gbnVsbCB9XG4gICAgICB9XG4gICAgICByZXR1cm4ge2xpbmU6IG4sIGhhbmRsZTogbGluZSwgdGV4dDogbGluZS50ZXh0LCBndXR0ZXJNYXJrZXJzOiBsaW5lLmd1dHRlck1hcmtlcnMsXG4gICAgICAgICAgICAgIHRleHRDbGFzczogbGluZS50ZXh0Q2xhc3MsIGJnQ2xhc3M6IGxpbmUuYmdDbGFzcywgd3JhcENsYXNzOiBsaW5lLndyYXBDbGFzcyxcbiAgICAgICAgICAgICAgd2lkZ2V0czogbGluZS53aWRnZXRzfVxuICAgIH0sXG5cbiAgICBhZGRMaW5lQ2xhc3M6IGRvY01ldGhvZE9wKGZ1bmN0aW9uKGhhbmRsZSwgd2hlcmUsIGNscykge1xuICAgICAgcmV0dXJuIGNoYW5nZUxpbmUodGhpcywgaGFuZGxlLCB3aGVyZSA9PSBcImd1dHRlclwiID8gXCJndXR0ZXJcIiA6IFwiY2xhc3NcIiwgZnVuY3Rpb24gKGxpbmUpIHtcbiAgICAgICAgdmFyIHByb3AgPSB3aGVyZSA9PSBcInRleHRcIiA/IFwidGV4dENsYXNzXCJcbiAgICAgICAgICAgICAgICAgOiB3aGVyZSA9PSBcImJhY2tncm91bmRcIiA/IFwiYmdDbGFzc1wiXG4gICAgICAgICAgICAgICAgIDogd2hlcmUgPT0gXCJndXR0ZXJcIiA/IFwiZ3V0dGVyQ2xhc3NcIiA6IFwid3JhcENsYXNzXCI7XG4gICAgICAgIGlmICghbGluZVtwcm9wXSkgeyBsaW5lW3Byb3BdID0gY2xzOyB9XG4gICAgICAgIGVsc2UgaWYgKGNsYXNzVGVzdChjbHMpLnRlc3QobGluZVtwcm9wXSkpIHsgcmV0dXJuIGZhbHNlIH1cbiAgICAgICAgZWxzZSB7IGxpbmVbcHJvcF0gKz0gXCIgXCIgKyBjbHM7IH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0pXG4gICAgfSksXG4gICAgcmVtb3ZlTGluZUNsYXNzOiBkb2NNZXRob2RPcChmdW5jdGlvbihoYW5kbGUsIHdoZXJlLCBjbHMpIHtcbiAgICAgIHJldHVybiBjaGFuZ2VMaW5lKHRoaXMsIGhhbmRsZSwgd2hlcmUgPT0gXCJndXR0ZXJcIiA/IFwiZ3V0dGVyXCIgOiBcImNsYXNzXCIsIGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgICAgIHZhciBwcm9wID0gd2hlcmUgPT0gXCJ0ZXh0XCIgPyBcInRleHRDbGFzc1wiXG4gICAgICAgICAgICAgICAgIDogd2hlcmUgPT0gXCJiYWNrZ3JvdW5kXCIgPyBcImJnQ2xhc3NcIlxuICAgICAgICAgICAgICAgICA6IHdoZXJlID09IFwiZ3V0dGVyXCIgPyBcImd1dHRlckNsYXNzXCIgOiBcIndyYXBDbGFzc1wiO1xuICAgICAgICB2YXIgY3VyID0gbGluZVtwcm9wXTtcbiAgICAgICAgaWYgKCFjdXIpIHsgcmV0dXJuIGZhbHNlIH1cbiAgICAgICAgZWxzZSBpZiAoY2xzID09IG51bGwpIHsgbGluZVtwcm9wXSA9IG51bGw7IH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdmFyIGZvdW5kID0gY3VyLm1hdGNoKGNsYXNzVGVzdChjbHMpKTtcbiAgICAgICAgICBpZiAoIWZvdW5kKSB7IHJldHVybiBmYWxzZSB9XG4gICAgICAgICAgdmFyIGVuZCA9IGZvdW5kLmluZGV4ICsgZm91bmRbMF0ubGVuZ3RoO1xuICAgICAgICAgIGxpbmVbcHJvcF0gPSBjdXIuc2xpY2UoMCwgZm91bmQuaW5kZXgpICsgKCFmb3VuZC5pbmRleCB8fCBlbmQgPT0gY3VyLmxlbmd0aCA/IFwiXCIgOiBcIiBcIikgKyBjdXIuc2xpY2UoZW5kKSB8fCBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9KVxuICAgIH0pLFxuXG4gICAgYWRkTGluZVdpZGdldDogZG9jTWV0aG9kT3AoZnVuY3Rpb24oaGFuZGxlLCBub2RlLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYWRkTGluZVdpZGdldCh0aGlzLCBoYW5kbGUsIG5vZGUsIG9wdGlvbnMpXG4gICAgfSksXG4gICAgcmVtb3ZlTGluZVdpZGdldDogZnVuY3Rpb24od2lkZ2V0KSB7IHdpZGdldC5jbGVhcigpOyB9LFxuXG4gICAgbWFya1RleHQ6IGZ1bmN0aW9uKGZyb20sIHRvLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gbWFya1RleHQodGhpcywgY2xpcFBvcyh0aGlzLCBmcm9tKSwgY2xpcFBvcyh0aGlzLCB0byksIG9wdGlvbnMsIG9wdGlvbnMgJiYgb3B0aW9ucy50eXBlIHx8IFwicmFuZ2VcIilcbiAgICB9LFxuICAgIHNldEJvb2ttYXJrOiBmdW5jdGlvbihwb3MsIG9wdGlvbnMpIHtcbiAgICAgIHZhciByZWFsT3B0cyA9IHtyZXBsYWNlZFdpdGg6IG9wdGlvbnMgJiYgKG9wdGlvbnMubm9kZVR5cGUgPT0gbnVsbCA/IG9wdGlvbnMud2lkZ2V0IDogb3B0aW9ucyksXG4gICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0TGVmdDogb3B0aW9ucyAmJiBvcHRpb25zLmluc2VydExlZnQsXG4gICAgICAgICAgICAgICAgICAgICAgY2xlYXJXaGVuRW1wdHk6IGZhbHNlLCBzaGFyZWQ6IG9wdGlvbnMgJiYgb3B0aW9ucy5zaGFyZWQsXG4gICAgICAgICAgICAgICAgICAgICAgaGFuZGxlTW91c2VFdmVudHM6IG9wdGlvbnMgJiYgb3B0aW9ucy5oYW5kbGVNb3VzZUV2ZW50c307XG4gICAgICBwb3MgPSBjbGlwUG9zKHRoaXMsIHBvcyk7XG4gICAgICByZXR1cm4gbWFya1RleHQodGhpcywgcG9zLCBwb3MsIHJlYWxPcHRzLCBcImJvb2ttYXJrXCIpXG4gICAgfSxcbiAgICBmaW5kTWFya3NBdDogZnVuY3Rpb24ocG9zKSB7XG4gICAgICBwb3MgPSBjbGlwUG9zKHRoaXMsIHBvcyk7XG4gICAgICB2YXIgbWFya2VycyA9IFtdLCBzcGFucyA9IGdldExpbmUodGhpcywgcG9zLmxpbmUpLm1hcmtlZFNwYW5zO1xuICAgICAgaWYgKHNwYW5zKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIHNwYW4gPSBzcGFuc1tpXTtcbiAgICAgICAgaWYgKChzcGFuLmZyb20gPT0gbnVsbCB8fCBzcGFuLmZyb20gPD0gcG9zLmNoKSAmJlxuICAgICAgICAgICAgKHNwYW4udG8gPT0gbnVsbCB8fCBzcGFuLnRvID49IHBvcy5jaCkpXG4gICAgICAgICAgeyBtYXJrZXJzLnB1c2goc3Bhbi5tYXJrZXIucGFyZW50IHx8IHNwYW4ubWFya2VyKTsgfVxuICAgICAgfSB9XG4gICAgICByZXR1cm4gbWFya2Vyc1xuICAgIH0sXG4gICAgZmluZE1hcmtzOiBmdW5jdGlvbihmcm9tLCB0bywgZmlsdGVyKSB7XG4gICAgICBmcm9tID0gY2xpcFBvcyh0aGlzLCBmcm9tKTsgdG8gPSBjbGlwUG9zKHRoaXMsIHRvKTtcbiAgICAgIHZhciBmb3VuZCA9IFtdLCBsaW5lTm8gPSBmcm9tLmxpbmU7XG4gICAgICB0aGlzLml0ZXIoZnJvbS5saW5lLCB0by5saW5lICsgMSwgZnVuY3Rpb24gKGxpbmUpIHtcbiAgICAgICAgdmFyIHNwYW5zID0gbGluZS5tYXJrZWRTcGFucztcbiAgICAgICAgaWYgKHNwYW5zKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgc3BhbiA9IHNwYW5zW2ldO1xuICAgICAgICAgIGlmICghKHNwYW4udG8gIT0gbnVsbCAmJiBsaW5lTm8gPT0gZnJvbS5saW5lICYmIGZyb20uY2ggPj0gc3Bhbi50byB8fFxuICAgICAgICAgICAgICAgIHNwYW4uZnJvbSA9PSBudWxsICYmIGxpbmVObyAhPSBmcm9tLmxpbmUgfHxcbiAgICAgICAgICAgICAgICBzcGFuLmZyb20gIT0gbnVsbCAmJiBsaW5lTm8gPT0gdG8ubGluZSAmJiBzcGFuLmZyb20gPj0gdG8uY2gpICYmXG4gICAgICAgICAgICAgICghZmlsdGVyIHx8IGZpbHRlcihzcGFuLm1hcmtlcikpKVxuICAgICAgICAgICAgeyBmb3VuZC5wdXNoKHNwYW4ubWFya2VyLnBhcmVudCB8fCBzcGFuLm1hcmtlcik7IH1cbiAgICAgICAgfSB9XG4gICAgICAgICsrbGluZU5vO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gZm91bmRcbiAgICB9LFxuICAgIGdldEFsbE1hcmtzOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBtYXJrZXJzID0gW107XG4gICAgICB0aGlzLml0ZXIoZnVuY3Rpb24gKGxpbmUpIHtcbiAgICAgICAgdmFyIHNwcyA9IGxpbmUubWFya2VkU3BhbnM7XG4gICAgICAgIGlmIChzcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBzcHMubGVuZ3RoOyArK2kpXG4gICAgICAgICAgeyBpZiAoc3BzW2ldLmZyb20gIT0gbnVsbCkgeyBtYXJrZXJzLnB1c2goc3BzW2ldLm1hcmtlcik7IH0gfSB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBtYXJrZXJzXG4gICAgfSxcblxuICAgIHBvc0Zyb21JbmRleDogZnVuY3Rpb24ob2ZmKSB7XG4gICAgICB2YXIgY2gsIGxpbmVObyA9IHRoaXMuZmlyc3QsIHNlcFNpemUgPSB0aGlzLmxpbmVTZXBhcmF0b3IoKS5sZW5ndGg7XG4gICAgICB0aGlzLml0ZXIoZnVuY3Rpb24gKGxpbmUpIHtcbiAgICAgICAgdmFyIHN6ID0gbGluZS50ZXh0Lmxlbmd0aCArIHNlcFNpemU7XG4gICAgICAgIGlmIChzeiA+IG9mZikgeyBjaCA9IG9mZjsgcmV0dXJuIHRydWUgfVxuICAgICAgICBvZmYgLT0gc3o7XG4gICAgICAgICsrbGluZU5vO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gY2xpcFBvcyh0aGlzLCBQb3MobGluZU5vLCBjaCkpXG4gICAgfSxcbiAgICBpbmRleEZyb21Qb3M6IGZ1bmN0aW9uIChjb29yZHMpIHtcbiAgICAgIGNvb3JkcyA9IGNsaXBQb3ModGhpcywgY29vcmRzKTtcbiAgICAgIHZhciBpbmRleCA9IGNvb3Jkcy5jaDtcbiAgICAgIGlmIChjb29yZHMubGluZSA8IHRoaXMuZmlyc3QgfHwgY29vcmRzLmNoIDwgMCkgeyByZXR1cm4gMCB9XG4gICAgICB2YXIgc2VwU2l6ZSA9IHRoaXMubGluZVNlcGFyYXRvcigpLmxlbmd0aDtcbiAgICAgIHRoaXMuaXRlcih0aGlzLmZpcnN0LCBjb29yZHMubGluZSwgZnVuY3Rpb24gKGxpbmUpIHsgLy8gaXRlciBhYm9ydHMgd2hlbiBjYWxsYmFjayByZXR1cm5zIGEgdHJ1dGh5IHZhbHVlXG4gICAgICAgIGluZGV4ICs9IGxpbmUudGV4dC5sZW5ndGggKyBzZXBTaXplO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gaW5kZXhcbiAgICB9LFxuXG4gICAgY29weTogZnVuY3Rpb24oY29weUhpc3RvcnkpIHtcbiAgICAgIHZhciBkb2MgPSBuZXcgRG9jKGdldExpbmVzKHRoaXMsIHRoaXMuZmlyc3QsIHRoaXMuZmlyc3QgKyB0aGlzLnNpemUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlT3B0aW9uLCB0aGlzLmZpcnN0LCB0aGlzLmxpbmVTZXAsIHRoaXMuZGlyZWN0aW9uKTtcbiAgICAgIGRvYy5zY3JvbGxUb3AgPSB0aGlzLnNjcm9sbFRvcDsgZG9jLnNjcm9sbExlZnQgPSB0aGlzLnNjcm9sbExlZnQ7XG4gICAgICBkb2Muc2VsID0gdGhpcy5zZWw7XG4gICAgICBkb2MuZXh0ZW5kID0gZmFsc2U7XG4gICAgICBpZiAoY29weUhpc3RvcnkpIHtcbiAgICAgICAgZG9jLmhpc3RvcnkudW5kb0RlcHRoID0gdGhpcy5oaXN0b3J5LnVuZG9EZXB0aDtcbiAgICAgICAgZG9jLnNldEhpc3RvcnkodGhpcy5nZXRIaXN0b3J5KCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRvY1xuICAgIH0sXG5cbiAgICBsaW5rZWREb2M6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgIGlmICghb3B0aW9ucykgeyBvcHRpb25zID0ge307IH1cbiAgICAgIHZhciBmcm9tID0gdGhpcy5maXJzdCwgdG8gPSB0aGlzLmZpcnN0ICsgdGhpcy5zaXplO1xuICAgICAgaWYgKG9wdGlvbnMuZnJvbSAhPSBudWxsICYmIG9wdGlvbnMuZnJvbSA+IGZyb20pIHsgZnJvbSA9IG9wdGlvbnMuZnJvbTsgfVxuICAgICAgaWYgKG9wdGlvbnMudG8gIT0gbnVsbCAmJiBvcHRpb25zLnRvIDwgdG8pIHsgdG8gPSBvcHRpb25zLnRvOyB9XG4gICAgICB2YXIgY29weSA9IG5ldyBEb2MoZ2V0TGluZXModGhpcywgZnJvbSwgdG8pLCBvcHRpb25zLm1vZGUgfHwgdGhpcy5tb2RlT3B0aW9uLCBmcm9tLCB0aGlzLmxpbmVTZXAsIHRoaXMuZGlyZWN0aW9uKTtcbiAgICAgIGlmIChvcHRpb25zLnNoYXJlZEhpc3QpIHsgY29weS5oaXN0b3J5ID0gdGhpcy5oaXN0b3J5XG4gICAgICA7IH0odGhpcy5saW5rZWQgfHwgKHRoaXMubGlua2VkID0gW10pKS5wdXNoKHtkb2M6IGNvcHksIHNoYXJlZEhpc3Q6IG9wdGlvbnMuc2hhcmVkSGlzdH0pO1xuICAgICAgY29weS5saW5rZWQgPSBbe2RvYzogdGhpcywgaXNQYXJlbnQ6IHRydWUsIHNoYXJlZEhpc3Q6IG9wdGlvbnMuc2hhcmVkSGlzdH1dO1xuICAgICAgY29weVNoYXJlZE1hcmtlcnMoY29weSwgZmluZFNoYXJlZE1hcmtlcnModGhpcykpO1xuICAgICAgcmV0dXJuIGNvcHlcbiAgICB9LFxuICAgIHVubGlua0RvYzogZnVuY3Rpb24ob3RoZXIpIHtcbiAgICAgIGlmIChvdGhlciBpbnN0YW5jZW9mIENvZGVNaXJyb3IpIHsgb3RoZXIgPSBvdGhlci5kb2M7IH1cbiAgICAgIGlmICh0aGlzLmxpbmtlZCkgeyBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGlua2VkLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBsaW5rID0gdGhpcy5saW5rZWRbaV07XG4gICAgICAgIGlmIChsaW5rLmRvYyAhPSBvdGhlcikgeyBjb250aW51ZSB9XG4gICAgICAgIHRoaXMubGlua2VkLnNwbGljZShpLCAxKTtcbiAgICAgICAgb3RoZXIudW5saW5rRG9jKHRoaXMpO1xuICAgICAgICBkZXRhY2hTaGFyZWRNYXJrZXJzKGZpbmRTaGFyZWRNYXJrZXJzKHRoaXMpKTtcbiAgICAgICAgYnJlYWtcbiAgICAgIH0gfVxuICAgICAgLy8gSWYgdGhlIGhpc3RvcmllcyB3ZXJlIHNoYXJlZCwgc3BsaXQgdGhlbSBhZ2FpblxuICAgICAgaWYgKG90aGVyLmhpc3RvcnkgPT0gdGhpcy5oaXN0b3J5KSB7XG4gICAgICAgIHZhciBzcGxpdElkcyA9IFtvdGhlci5pZF07XG4gICAgICAgIGxpbmtlZERvY3Mob3RoZXIsIGZ1bmN0aW9uIChkb2MpIHsgcmV0dXJuIHNwbGl0SWRzLnB1c2goZG9jLmlkKTsgfSwgdHJ1ZSk7XG4gICAgICAgIG90aGVyLmhpc3RvcnkgPSBuZXcgSGlzdG9yeShudWxsKTtcbiAgICAgICAgb3RoZXIuaGlzdG9yeS5kb25lID0gY29weUhpc3RvcnlBcnJheSh0aGlzLmhpc3RvcnkuZG9uZSwgc3BsaXRJZHMpO1xuICAgICAgICBvdGhlci5oaXN0b3J5LnVuZG9uZSA9IGNvcHlIaXN0b3J5QXJyYXkodGhpcy5oaXN0b3J5LnVuZG9uZSwgc3BsaXRJZHMpO1xuICAgICAgfVxuICAgIH0sXG4gICAgaXRlckxpbmtlZERvY3M6IGZ1bmN0aW9uKGYpIHtsaW5rZWREb2NzKHRoaXMsIGYpO30sXG5cbiAgICBnZXRNb2RlOiBmdW5jdGlvbigpIHtyZXR1cm4gdGhpcy5tb2RlfSxcbiAgICBnZXRFZGl0b3I6IGZ1bmN0aW9uKCkge3JldHVybiB0aGlzLmNtfSxcblxuICAgIHNwbGl0TGluZXM6IGZ1bmN0aW9uKHN0cikge1xuICAgICAgaWYgKHRoaXMubGluZVNlcCkgeyByZXR1cm4gc3RyLnNwbGl0KHRoaXMubGluZVNlcCkgfVxuICAgICAgcmV0dXJuIHNwbGl0TGluZXNBdXRvKHN0cilcbiAgICB9LFxuICAgIGxpbmVTZXBhcmF0b3I6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5saW5lU2VwIHx8IFwiXFxuXCIgfSxcblxuICAgIHNldERpcmVjdGlvbjogZG9jTWV0aG9kT3AoZnVuY3Rpb24gKGRpcikge1xuICAgICAgaWYgKGRpciAhPSBcInJ0bFwiKSB7IGRpciA9IFwibHRyXCI7IH1cbiAgICAgIGlmIChkaXIgPT0gdGhpcy5kaXJlY3Rpb24pIHsgcmV0dXJuIH1cbiAgICAgIHRoaXMuZGlyZWN0aW9uID0gZGlyO1xuICAgICAgdGhpcy5pdGVyKGZ1bmN0aW9uIChsaW5lKSB7IHJldHVybiBsaW5lLm9yZGVyID0gbnVsbDsgfSk7XG4gICAgICBpZiAodGhpcy5jbSkgeyBkaXJlY3Rpb25DaGFuZ2VkKHRoaXMuY20pOyB9XG4gICAgfSlcbiAgfSk7XG5cbiAgLy8gUHVibGljIGFsaWFzLlxuICBEb2MucHJvdG90eXBlLmVhY2hMaW5lID0gRG9jLnByb3RvdHlwZS5pdGVyO1xuXG4gIC8vIEtsdWRnZSB0byB3b3JrIGFyb3VuZCBzdHJhbmdlIElFIGJlaGF2aW9yIHdoZXJlIGl0J2xsIHNvbWV0aW1lc1xuICAvLyByZS1maXJlIGEgc2VyaWVzIG9mIGRyYWctcmVsYXRlZCBldmVudHMgcmlnaHQgYWZ0ZXIgdGhlIGRyb3AgKCMxNTUxKVxuICB2YXIgbGFzdERyb3AgPSAwO1xuXG4gIGZ1bmN0aW9uIG9uRHJvcChlKSB7XG4gICAgdmFyIGNtID0gdGhpcztcbiAgICBjbGVhckRyYWdDdXJzb3IoY20pO1xuICAgIGlmIChzaWduYWxET01FdmVudChjbSwgZSkgfHwgZXZlbnRJbldpZGdldChjbS5kaXNwbGF5LCBlKSlcbiAgICAgIHsgcmV0dXJuIH1cbiAgICBlX3ByZXZlbnREZWZhdWx0KGUpO1xuICAgIGlmIChpZSkgeyBsYXN0RHJvcCA9ICtuZXcgRGF0ZTsgfVxuICAgIHZhciBwb3MgPSBwb3NGcm9tTW91c2UoY20sIGUsIHRydWUpLCBmaWxlcyA9IGUuZGF0YVRyYW5zZmVyLmZpbGVzO1xuICAgIGlmICghcG9zIHx8IGNtLmlzUmVhZE9ubHkoKSkgeyByZXR1cm4gfVxuICAgIC8vIE1pZ2h0IGJlIGEgZmlsZSBkcm9wLCBpbiB3aGljaCBjYXNlIHdlIHNpbXBseSBleHRyYWN0IHRoZSB0ZXh0XG4gICAgLy8gYW5kIGluc2VydCBpdC5cbiAgICBpZiAoZmlsZXMgJiYgZmlsZXMubGVuZ3RoICYmIHdpbmRvdy5GaWxlUmVhZGVyICYmIHdpbmRvdy5GaWxlKSB7XG4gICAgICB2YXIgbiA9IGZpbGVzLmxlbmd0aCwgdGV4dCA9IEFycmF5KG4pLCByZWFkID0gMDtcbiAgICAgIHZhciBtYXJrQXNSZWFkQW5kUGFzdGVJZkFsbEZpbGVzQXJlUmVhZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCsrcmVhZCA9PSBuKSB7XG4gICAgICAgICAgb3BlcmF0aW9uKGNtLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBwb3MgPSBjbGlwUG9zKGNtLmRvYywgcG9zKTtcbiAgICAgICAgICAgIHZhciBjaGFuZ2UgPSB7ZnJvbTogcG9zLCB0bzogcG9zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBjbS5kb2Muc3BsaXRMaW5lcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQuZmlsdGVyKGZ1bmN0aW9uICh0KSB7IHJldHVybiB0ICE9IG51bGw7IH0pLmpvaW4oY20uZG9jLmxpbmVTZXBhcmF0b3IoKSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW46IFwicGFzdGVcIn07XG4gICAgICAgICAgICBtYWtlQ2hhbmdlKGNtLmRvYywgY2hhbmdlKTtcbiAgICAgICAgICAgIHNldFNlbGVjdGlvblJlcGxhY2VIaXN0b3J5KGNtLmRvYywgc2ltcGxlU2VsZWN0aW9uKGNsaXBQb3MoY20uZG9jLCBwb3MpLCBjbGlwUG9zKGNtLmRvYywgY2hhbmdlRW5kKGNoYW5nZSkpKSk7XG4gICAgICAgICAgfSkoKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHZhciByZWFkVGV4dEZyb21GaWxlID0gZnVuY3Rpb24gKGZpbGUsIGkpIHtcbiAgICAgICAgaWYgKGNtLm9wdGlvbnMuYWxsb3dEcm9wRmlsZVR5cGVzICYmXG4gICAgICAgICAgICBpbmRleE9mKGNtLm9wdGlvbnMuYWxsb3dEcm9wRmlsZVR5cGVzLCBmaWxlLnR5cGUpID09IC0xKSB7XG4gICAgICAgICAgbWFya0FzUmVhZEFuZFBhc3RlSWZBbGxGaWxlc0FyZVJlYWQoKTtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXI7XG4gICAgICAgIHJlYWRlci5vbmVycm9yID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbWFya0FzUmVhZEFuZFBhc3RlSWZBbGxGaWxlc0FyZVJlYWQoKTsgfTtcbiAgICAgICAgcmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgY29udGVudCA9IHJlYWRlci5yZXN1bHQ7XG4gICAgICAgICAgaWYgKC9bXFx4MDAtXFx4MDhcXHgwZS1cXHgxZl17Mn0vLnRlc3QoY29udGVudCkpIHtcbiAgICAgICAgICAgIG1hcmtBc1JlYWRBbmRQYXN0ZUlmQWxsRmlsZXNBcmVSZWFkKCk7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgICAgdGV4dFtpXSA9IGNvbnRlbnQ7XG4gICAgICAgICAgbWFya0FzUmVhZEFuZFBhc3RlSWZBbGxGaWxlc0FyZVJlYWQoKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmVhZGVyLnJlYWRBc1RleHQoZmlsZSk7XG4gICAgICB9O1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgeyByZWFkVGV4dEZyb21GaWxlKGZpbGVzW2ldLCBpKTsgfVxuICAgIH0gZWxzZSB7IC8vIE5vcm1hbCBkcm9wXG4gICAgICAvLyBEb24ndCBkbyBhIHJlcGxhY2UgaWYgdGhlIGRyb3AgaGFwcGVuZWQgaW5zaWRlIG9mIHRoZSBzZWxlY3RlZCB0ZXh0LlxuICAgICAgaWYgKGNtLnN0YXRlLmRyYWdnaW5nVGV4dCAmJiBjbS5kb2Muc2VsLmNvbnRhaW5zKHBvcykgPiAtMSkge1xuICAgICAgICBjbS5zdGF0ZS5kcmFnZ2luZ1RleHQoZSk7XG4gICAgICAgIC8vIEVuc3VyZSB0aGUgZWRpdG9yIGlzIHJlLWZvY3VzZWRcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHJldHVybiBjbS5kaXNwbGF5LmlucHV0LmZvY3VzKCk7IH0sIDIwKTtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgdGV4dCQxID0gZS5kYXRhVHJhbnNmZXIuZ2V0RGF0YShcIlRleHRcIik7XG4gICAgICAgIGlmICh0ZXh0JDEpIHtcbiAgICAgICAgICB2YXIgc2VsZWN0ZWQ7XG4gICAgICAgICAgaWYgKGNtLnN0YXRlLmRyYWdnaW5nVGV4dCAmJiAhY20uc3RhdGUuZHJhZ2dpbmdUZXh0LmNvcHkpXG4gICAgICAgICAgICB7IHNlbGVjdGVkID0gY20ubGlzdFNlbGVjdGlvbnMoKTsgfVxuICAgICAgICAgIHNldFNlbGVjdGlvbk5vVW5kbyhjbS5kb2MsIHNpbXBsZVNlbGVjdGlvbihwb3MsIHBvcykpO1xuICAgICAgICAgIGlmIChzZWxlY3RlZCkgeyBmb3IgKHZhciBpJDEgPSAwOyBpJDEgPCBzZWxlY3RlZC5sZW5ndGg7ICsraSQxKVxuICAgICAgICAgICAgeyByZXBsYWNlUmFuZ2UoY20uZG9jLCBcIlwiLCBzZWxlY3RlZFtpJDFdLmFuY2hvciwgc2VsZWN0ZWRbaSQxXS5oZWFkLCBcImRyYWdcIik7IH0gfVxuICAgICAgICAgIGNtLnJlcGxhY2VTZWxlY3Rpb24odGV4dCQxLCBcImFyb3VuZFwiLCBcInBhc3RlXCIpO1xuICAgICAgICAgIGNtLmRpc3BsYXkuaW5wdXQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2F0Y2goZSQxKXt9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb25EcmFnU3RhcnQoY20sIGUpIHtcbiAgICBpZiAoaWUgJiYgKCFjbS5zdGF0ZS5kcmFnZ2luZ1RleHQgfHwgK25ldyBEYXRlIC0gbGFzdERyb3AgPCAxMDApKSB7IGVfc3RvcChlKTsgcmV0dXJuIH1cbiAgICBpZiAoc2lnbmFsRE9NRXZlbnQoY20sIGUpIHx8IGV2ZW50SW5XaWRnZXQoY20uZGlzcGxheSwgZSkpIHsgcmV0dXJuIH1cblxuICAgIGUuZGF0YVRyYW5zZmVyLnNldERhdGEoXCJUZXh0XCIsIGNtLmdldFNlbGVjdGlvbigpKTtcbiAgICBlLmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkID0gXCJjb3B5TW92ZVwiO1xuXG4gICAgLy8gVXNlIGR1bW15IGltYWdlIGluc3RlYWQgb2YgZGVmYXVsdCBicm93c2VycyBpbWFnZS5cbiAgICAvLyBSZWNlbnQgU2FmYXJpICh+Ni4wLjIpIGhhdmUgYSB0ZW5kZW5jeSB0byBzZWdmYXVsdCB3aGVuIHRoaXMgaGFwcGVucywgc28gd2UgZG9uJ3QgZG8gaXQgdGhlcmUuXG4gICAgaWYgKGUuZGF0YVRyYW5zZmVyLnNldERyYWdJbWFnZSAmJiAhc2FmYXJpKSB7XG4gICAgICB2YXIgaW1nID0gZWx0KFwiaW1nXCIsIG51bGwsIG51bGwsIFwicG9zaXRpb246IGZpeGVkOyBsZWZ0OiAwOyB0b3A6IDA7XCIpO1xuICAgICAgaW1nLnNyYyA9IFwiZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBQkFBQUFBQ0g1QkFFS0FBRUFMQUFBQUFBQkFBRUFBQUlDVEFFQU93PT1cIjtcbiAgICAgIGlmIChwcmVzdG8pIHtcbiAgICAgICAgaW1nLndpZHRoID0gaW1nLmhlaWdodCA9IDE7XG4gICAgICAgIGNtLmRpc3BsYXkud3JhcHBlci5hcHBlbmRDaGlsZChpbWcpO1xuICAgICAgICAvLyBGb3JjZSBhIHJlbGF5b3V0LCBvciBPcGVyYSB3b24ndCB1c2Ugb3VyIGltYWdlIGZvciBzb21lIG9ic2N1cmUgcmVhc29uXG4gICAgICAgIGltZy5fdG9wID0gaW1nLm9mZnNldFRvcDtcbiAgICAgIH1cbiAgICAgIGUuZGF0YVRyYW5zZmVyLnNldERyYWdJbWFnZShpbWcsIDAsIDApO1xuICAgICAgaWYgKHByZXN0bykgeyBpbWcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChpbWcpOyB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb25EcmFnT3ZlcihjbSwgZSkge1xuICAgIHZhciBwb3MgPSBwb3NGcm9tTW91c2UoY20sIGUpO1xuICAgIGlmICghcG9zKSB7IHJldHVybiB9XG4gICAgdmFyIGZyYWcgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgZHJhd1NlbGVjdGlvbkN1cnNvcihjbSwgcG9zLCBmcmFnKTtcbiAgICBpZiAoIWNtLmRpc3BsYXkuZHJhZ0N1cnNvcikge1xuICAgICAgY20uZGlzcGxheS5kcmFnQ3Vyc29yID0gZWx0KFwiZGl2XCIsIG51bGwsIFwiQ29kZU1pcnJvci1jdXJzb3JzIENvZGVNaXJyb3ItZHJhZ2N1cnNvcnNcIik7XG4gICAgICBjbS5kaXNwbGF5LmxpbmVTcGFjZS5pbnNlcnRCZWZvcmUoY20uZGlzcGxheS5kcmFnQ3Vyc29yLCBjbS5kaXNwbGF5LmN1cnNvckRpdik7XG4gICAgfVxuICAgIHJlbW92ZUNoaWxkcmVuQW5kQWRkKGNtLmRpc3BsYXkuZHJhZ0N1cnNvciwgZnJhZyk7XG4gIH1cblxuICBmdW5jdGlvbiBjbGVhckRyYWdDdXJzb3IoY20pIHtcbiAgICBpZiAoY20uZGlzcGxheS5kcmFnQ3Vyc29yKSB7XG4gICAgICBjbS5kaXNwbGF5LmxpbmVTcGFjZS5yZW1vdmVDaGlsZChjbS5kaXNwbGF5LmRyYWdDdXJzb3IpO1xuICAgICAgY20uZGlzcGxheS5kcmFnQ3Vyc29yID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvLyBUaGVzZSBtdXN0IGJlIGhhbmRsZWQgY2FyZWZ1bGx5LCBiZWNhdXNlIG5haXZlbHkgcmVnaXN0ZXJpbmcgYVxuICAvLyBoYW5kbGVyIGZvciBlYWNoIGVkaXRvciB3aWxsIGNhdXNlIHRoZSBlZGl0b3JzIHRvIG5ldmVyIGJlXG4gIC8vIGdhcmJhZ2UgY29sbGVjdGVkLlxuXG4gIGZ1bmN0aW9uIGZvckVhY2hDb2RlTWlycm9yKGYpIHtcbiAgICBpZiAoIWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUpIHsgcmV0dXJuIH1cbiAgICB2YXIgYnlDbGFzcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJDb2RlTWlycm9yXCIpLCBlZGl0b3JzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBieUNsYXNzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY20gPSBieUNsYXNzW2ldLkNvZGVNaXJyb3I7XG4gICAgICBpZiAoY20pIHsgZWRpdG9ycy5wdXNoKGNtKTsgfVxuICAgIH1cbiAgICBpZiAoZWRpdG9ycy5sZW5ndGgpIHsgZWRpdG9yc1swXS5vcGVyYXRpb24oZnVuY3Rpb24gKCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlZGl0b3JzLmxlbmd0aDsgaSsrKSB7IGYoZWRpdG9yc1tpXSk7IH1cbiAgICB9KTsgfVxuICB9XG5cbiAgdmFyIGdsb2JhbHNSZWdpc3RlcmVkID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGVuc3VyZUdsb2JhbEhhbmRsZXJzKCkge1xuICAgIGlmIChnbG9iYWxzUmVnaXN0ZXJlZCkgeyByZXR1cm4gfVxuICAgIHJlZ2lzdGVyR2xvYmFsSGFuZGxlcnMoKTtcbiAgICBnbG9iYWxzUmVnaXN0ZXJlZCA9IHRydWU7XG4gIH1cbiAgZnVuY3Rpb24gcmVnaXN0ZXJHbG9iYWxIYW5kbGVycygpIHtcbiAgICAvLyBXaGVuIHRoZSB3aW5kb3cgcmVzaXplcywgd2UgbmVlZCB0byByZWZyZXNoIGFjdGl2ZSBlZGl0b3JzLlxuICAgIHZhciByZXNpemVUaW1lcjtcbiAgICBvbih3aW5kb3csIFwicmVzaXplXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChyZXNpemVUaW1lciA9PSBudWxsKSB7IHJlc2l6ZVRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJlc2l6ZVRpbWVyID0gbnVsbDtcbiAgICAgICAgZm9yRWFjaENvZGVNaXJyb3Iob25SZXNpemUpO1xuICAgICAgfSwgMTAwKTsgfVxuICAgIH0pO1xuICAgIC8vIFdoZW4gdGhlIHdpbmRvdyBsb3NlcyBmb2N1cywgd2Ugd2FudCB0byBzaG93IHRoZSBlZGl0b3IgYXMgYmx1cnJlZFxuICAgIG9uKHdpbmRvdywgXCJibHVyXCIsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGZvckVhY2hDb2RlTWlycm9yKG9uQmx1cik7IH0pO1xuICB9XG4gIC8vIENhbGxlZCB3aGVuIHRoZSB3aW5kb3cgcmVzaXplc1xuICBmdW5jdGlvbiBvblJlc2l6ZShjbSkge1xuICAgIHZhciBkID0gY20uZGlzcGxheTtcbiAgICAvLyBNaWdodCBiZSBhIHRleHQgc2NhbGluZyBvcGVyYXRpb24sIGNsZWFyIHNpemUgY2FjaGVzLlxuICAgIGQuY2FjaGVkQ2hhcldpZHRoID0gZC5jYWNoZWRUZXh0SGVpZ2h0ID0gZC5jYWNoZWRQYWRkaW5nSCA9IG51bGw7XG4gICAgZC5zY3JvbGxiYXJzQ2xpcHBlZCA9IGZhbHNlO1xuICAgIGNtLnNldFNpemUoKTtcbiAgfVxuXG4gIHZhciBrZXlOYW1lcyA9IHtcbiAgICAzOiBcIlBhdXNlXCIsIDg6IFwiQmFja3NwYWNlXCIsIDk6IFwiVGFiXCIsIDEzOiBcIkVudGVyXCIsIDE2OiBcIlNoaWZ0XCIsIDE3OiBcIkN0cmxcIiwgMTg6IFwiQWx0XCIsXG4gICAgMTk6IFwiUGF1c2VcIiwgMjA6IFwiQ2Fwc0xvY2tcIiwgMjc6IFwiRXNjXCIsIDMyOiBcIlNwYWNlXCIsIDMzOiBcIlBhZ2VVcFwiLCAzNDogXCJQYWdlRG93blwiLCAzNTogXCJFbmRcIixcbiAgICAzNjogXCJIb21lXCIsIDM3OiBcIkxlZnRcIiwgMzg6IFwiVXBcIiwgMzk6IFwiUmlnaHRcIiwgNDA6IFwiRG93blwiLCA0NDogXCJQcmludFNjcm5cIiwgNDU6IFwiSW5zZXJ0XCIsXG4gICAgNDY6IFwiRGVsZXRlXCIsIDU5OiBcIjtcIiwgNjE6IFwiPVwiLCA5MTogXCJNb2RcIiwgOTI6IFwiTW9kXCIsIDkzOiBcIk1vZFwiLFxuICAgIDEwNjogXCIqXCIsIDEwNzogXCI9XCIsIDEwOTogXCItXCIsIDExMDogXCIuXCIsIDExMTogXCIvXCIsIDE0NTogXCJTY3JvbGxMb2NrXCIsXG4gICAgMTczOiBcIi1cIiwgMTg2OiBcIjtcIiwgMTg3OiBcIj1cIiwgMTg4OiBcIixcIiwgMTg5OiBcIi1cIiwgMTkwOiBcIi5cIiwgMTkxOiBcIi9cIiwgMTkyOiBcImBcIiwgMjE5OiBcIltcIiwgMjIwOiBcIlxcXFxcIixcbiAgICAyMjE6IFwiXVwiLCAyMjI6IFwiJ1wiLCAyMjQ6IFwiTW9kXCIsIDYzMjMyOiBcIlVwXCIsIDYzMjMzOiBcIkRvd25cIiwgNjMyMzQ6IFwiTGVmdFwiLCA2MzIzNTogXCJSaWdodFwiLCA2MzI3MjogXCJEZWxldGVcIixcbiAgICA2MzI3MzogXCJIb21lXCIsIDYzMjc1OiBcIkVuZFwiLCA2MzI3NjogXCJQYWdlVXBcIiwgNjMyNzc6IFwiUGFnZURvd25cIiwgNjMzMDI6IFwiSW5zZXJ0XCJcbiAgfTtcblxuICAvLyBOdW1iZXIga2V5c1xuICBmb3IgKHZhciBpID0gMDsgaSA8IDEwOyBpKyspIHsga2V5TmFtZXNbaSArIDQ4XSA9IGtleU5hbWVzW2kgKyA5Nl0gPSBTdHJpbmcoaSk7IH1cbiAgLy8gQWxwaGFiZXRpYyBrZXlzXG4gIGZvciAodmFyIGkkMSA9IDY1OyBpJDEgPD0gOTA7IGkkMSsrKSB7IGtleU5hbWVzW2kkMV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGkkMSk7IH1cbiAgLy8gRnVuY3Rpb24ga2V5c1xuICBmb3IgKHZhciBpJDIgPSAxOyBpJDIgPD0gMTI7IGkkMisrKSB7IGtleU5hbWVzW2kkMiArIDExMV0gPSBrZXlOYW1lc1tpJDIgKyA2MzIzNV0gPSBcIkZcIiArIGkkMjsgfVxuXG4gIHZhciBrZXlNYXAgPSB7fTtcblxuICBrZXlNYXAuYmFzaWMgPSB7XG4gICAgXCJMZWZ0XCI6IFwiZ29DaGFyTGVmdFwiLCBcIlJpZ2h0XCI6IFwiZ29DaGFyUmlnaHRcIiwgXCJVcFwiOiBcImdvTGluZVVwXCIsIFwiRG93blwiOiBcImdvTGluZURvd25cIixcbiAgICBcIkVuZFwiOiBcImdvTGluZUVuZFwiLCBcIkhvbWVcIjogXCJnb0xpbmVTdGFydFNtYXJ0XCIsIFwiUGFnZVVwXCI6IFwiZ29QYWdlVXBcIiwgXCJQYWdlRG93blwiOiBcImdvUGFnZURvd25cIixcbiAgICBcIkRlbGV0ZVwiOiBcImRlbENoYXJBZnRlclwiLCBcIkJhY2tzcGFjZVwiOiBcImRlbENoYXJCZWZvcmVcIiwgXCJTaGlmdC1CYWNrc3BhY2VcIjogXCJkZWxDaGFyQmVmb3JlXCIsXG4gICAgXCJUYWJcIjogXCJkZWZhdWx0VGFiXCIsIFwiU2hpZnQtVGFiXCI6IFwiaW5kZW50QXV0b1wiLFxuICAgIFwiRW50ZXJcIjogXCJuZXdsaW5lQW5kSW5kZW50XCIsIFwiSW5zZXJ0XCI6IFwidG9nZ2xlT3ZlcndyaXRlXCIsXG4gICAgXCJFc2NcIjogXCJzaW5nbGVTZWxlY3Rpb25cIlxuICB9O1xuICAvLyBOb3RlIHRoYXQgdGhlIHNhdmUgYW5kIGZpbmQtcmVsYXRlZCBjb21tYW5kcyBhcmVuJ3QgZGVmaW5lZCBieVxuICAvLyBkZWZhdWx0LiBVc2VyIGNvZGUgb3IgYWRkb25zIGNhbiBkZWZpbmUgdGhlbS4gVW5rbm93biBjb21tYW5kc1xuICAvLyBhcmUgc2ltcGx5IGlnbm9yZWQuXG4gIGtleU1hcC5wY0RlZmF1bHQgPSB7XG4gICAgXCJDdHJsLUFcIjogXCJzZWxlY3RBbGxcIiwgXCJDdHJsLURcIjogXCJkZWxldGVMaW5lXCIsIFwiQ3RybC1aXCI6IFwidW5kb1wiLCBcIlNoaWZ0LUN0cmwtWlwiOiBcInJlZG9cIiwgXCJDdHJsLVlcIjogXCJyZWRvXCIsXG4gICAgXCJDdHJsLUhvbWVcIjogXCJnb0RvY1N0YXJ0XCIsIFwiQ3RybC1FbmRcIjogXCJnb0RvY0VuZFwiLCBcIkN0cmwtVXBcIjogXCJnb0xpbmVVcFwiLCBcIkN0cmwtRG93blwiOiBcImdvTGluZURvd25cIixcbiAgICBcIkN0cmwtTGVmdFwiOiBcImdvR3JvdXBMZWZ0XCIsIFwiQ3RybC1SaWdodFwiOiBcImdvR3JvdXBSaWdodFwiLCBcIkFsdC1MZWZ0XCI6IFwiZ29MaW5lU3RhcnRcIiwgXCJBbHQtUmlnaHRcIjogXCJnb0xpbmVFbmRcIixcbiAgICBcIkN0cmwtQmFja3NwYWNlXCI6IFwiZGVsR3JvdXBCZWZvcmVcIiwgXCJDdHJsLURlbGV0ZVwiOiBcImRlbEdyb3VwQWZ0ZXJcIiwgXCJDdHJsLVNcIjogXCJzYXZlXCIsIFwiQ3RybC1GXCI6IFwiZmluZFwiLFxuICAgIFwiQ3RybC1HXCI6IFwiZmluZE5leHRcIiwgXCJTaGlmdC1DdHJsLUdcIjogXCJmaW5kUHJldlwiLCBcIlNoaWZ0LUN0cmwtRlwiOiBcInJlcGxhY2VcIiwgXCJTaGlmdC1DdHJsLVJcIjogXCJyZXBsYWNlQWxsXCIsXG4gICAgXCJDdHJsLVtcIjogXCJpbmRlbnRMZXNzXCIsIFwiQ3RybC1dXCI6IFwiaW5kZW50TW9yZVwiLFxuICAgIFwiQ3RybC1VXCI6IFwidW5kb1NlbGVjdGlvblwiLCBcIlNoaWZ0LUN0cmwtVVwiOiBcInJlZG9TZWxlY3Rpb25cIiwgXCJBbHQtVVwiOiBcInJlZG9TZWxlY3Rpb25cIixcbiAgICBcImZhbGx0aHJvdWdoXCI6IFwiYmFzaWNcIlxuICB9O1xuICAvLyBWZXJ5IGJhc2ljIHJlYWRsaW5lL2VtYWNzLXN0eWxlIGJpbmRpbmdzLCB3aGljaCBhcmUgc3RhbmRhcmQgb24gTWFjLlxuICBrZXlNYXAuZW1hY3N5ID0ge1xuICAgIFwiQ3RybC1GXCI6IFwiZ29DaGFyUmlnaHRcIiwgXCJDdHJsLUJcIjogXCJnb0NoYXJMZWZ0XCIsIFwiQ3RybC1QXCI6IFwiZ29MaW5lVXBcIiwgXCJDdHJsLU5cIjogXCJnb0xpbmVEb3duXCIsXG4gICAgXCJBbHQtRlwiOiBcImdvV29yZFJpZ2h0XCIsIFwiQWx0LUJcIjogXCJnb1dvcmRMZWZ0XCIsIFwiQ3RybC1BXCI6IFwiZ29MaW5lU3RhcnRcIiwgXCJDdHJsLUVcIjogXCJnb0xpbmVFbmRcIixcbiAgICBcIkN0cmwtVlwiOiBcImdvUGFnZURvd25cIiwgXCJTaGlmdC1DdHJsLVZcIjogXCJnb1BhZ2VVcFwiLCBcIkN0cmwtRFwiOiBcImRlbENoYXJBZnRlclwiLCBcIkN0cmwtSFwiOiBcImRlbENoYXJCZWZvcmVcIixcbiAgICBcIkFsdC1EXCI6IFwiZGVsV29yZEFmdGVyXCIsIFwiQWx0LUJhY2tzcGFjZVwiOiBcImRlbFdvcmRCZWZvcmVcIiwgXCJDdHJsLUtcIjogXCJraWxsTGluZVwiLCBcIkN0cmwtVFwiOiBcInRyYW5zcG9zZUNoYXJzXCIsXG4gICAgXCJDdHJsLU9cIjogXCJvcGVuTGluZVwiXG4gIH07XG4gIGtleU1hcC5tYWNEZWZhdWx0ID0ge1xuICAgIFwiQ21kLUFcIjogXCJzZWxlY3RBbGxcIiwgXCJDbWQtRFwiOiBcImRlbGV0ZUxpbmVcIiwgXCJDbWQtWlwiOiBcInVuZG9cIiwgXCJTaGlmdC1DbWQtWlwiOiBcInJlZG9cIiwgXCJDbWQtWVwiOiBcInJlZG9cIixcbiAgICBcIkNtZC1Ib21lXCI6IFwiZ29Eb2NTdGFydFwiLCBcIkNtZC1VcFwiOiBcImdvRG9jU3RhcnRcIiwgXCJDbWQtRW5kXCI6IFwiZ29Eb2NFbmRcIiwgXCJDbWQtRG93blwiOiBcImdvRG9jRW5kXCIsIFwiQWx0LUxlZnRcIjogXCJnb0dyb3VwTGVmdFwiLFxuICAgIFwiQWx0LVJpZ2h0XCI6IFwiZ29Hcm91cFJpZ2h0XCIsIFwiQ21kLUxlZnRcIjogXCJnb0xpbmVMZWZ0XCIsIFwiQ21kLVJpZ2h0XCI6IFwiZ29MaW5lUmlnaHRcIiwgXCJBbHQtQmFja3NwYWNlXCI6IFwiZGVsR3JvdXBCZWZvcmVcIixcbiAgICBcIkN0cmwtQWx0LUJhY2tzcGFjZVwiOiBcImRlbEdyb3VwQWZ0ZXJcIiwgXCJBbHQtRGVsZXRlXCI6IFwiZGVsR3JvdXBBZnRlclwiLCBcIkNtZC1TXCI6IFwic2F2ZVwiLCBcIkNtZC1GXCI6IFwiZmluZFwiLFxuICAgIFwiQ21kLUdcIjogXCJmaW5kTmV4dFwiLCBcIlNoaWZ0LUNtZC1HXCI6IFwiZmluZFByZXZcIiwgXCJDbWQtQWx0LUZcIjogXCJyZXBsYWNlXCIsIFwiU2hpZnQtQ21kLUFsdC1GXCI6IFwicmVwbGFjZUFsbFwiLFxuICAgIFwiQ21kLVtcIjogXCJpbmRlbnRMZXNzXCIsIFwiQ21kLV1cIjogXCJpbmRlbnRNb3JlXCIsIFwiQ21kLUJhY2tzcGFjZVwiOiBcImRlbFdyYXBwZWRMaW5lTGVmdFwiLCBcIkNtZC1EZWxldGVcIjogXCJkZWxXcmFwcGVkTGluZVJpZ2h0XCIsXG4gICAgXCJDbWQtVVwiOiBcInVuZG9TZWxlY3Rpb25cIiwgXCJTaGlmdC1DbWQtVVwiOiBcInJlZG9TZWxlY3Rpb25cIiwgXCJDdHJsLVVwXCI6IFwiZ29Eb2NTdGFydFwiLCBcIkN0cmwtRG93blwiOiBcImdvRG9jRW5kXCIsXG4gICAgXCJmYWxsdGhyb3VnaFwiOiBbXCJiYXNpY1wiLCBcImVtYWNzeVwiXVxuICB9O1xuICBrZXlNYXBbXCJkZWZhdWx0XCJdID0gbWFjID8ga2V5TWFwLm1hY0RlZmF1bHQgOiBrZXlNYXAucGNEZWZhdWx0O1xuXG4gIC8vIEtFWU1BUCBESVNQQVRDSFxuXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZUtleU5hbWUobmFtZSkge1xuICAgIHZhciBwYXJ0cyA9IG5hbWUuc3BsaXQoLy0oPyEkKS8pO1xuICAgIG5hbWUgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXTtcbiAgICB2YXIgYWx0LCBjdHJsLCBzaGlmdCwgY21kO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICB2YXIgbW9kID0gcGFydHNbaV07XG4gICAgICBpZiAoL14oY21kfG1ldGF8bSkkL2kudGVzdChtb2QpKSB7IGNtZCA9IHRydWU7IH1cbiAgICAgIGVsc2UgaWYgKC9eYShsdCk/JC9pLnRlc3QobW9kKSkgeyBhbHQgPSB0cnVlOyB9XG4gICAgICBlbHNlIGlmICgvXihjfGN0cmx8Y29udHJvbCkkL2kudGVzdChtb2QpKSB7IGN0cmwgPSB0cnVlOyB9XG4gICAgICBlbHNlIGlmICgvXnMoaGlmdCk/JC9pLnRlc3QobW9kKSkgeyBzaGlmdCA9IHRydWU7IH1cbiAgICAgIGVsc2UgeyB0aHJvdyBuZXcgRXJyb3IoXCJVbnJlY29nbml6ZWQgbW9kaWZpZXIgbmFtZTogXCIgKyBtb2QpIH1cbiAgICB9XG4gICAgaWYgKGFsdCkgeyBuYW1lID0gXCJBbHQtXCIgKyBuYW1lOyB9XG4gICAgaWYgKGN0cmwpIHsgbmFtZSA9IFwiQ3RybC1cIiArIG5hbWU7IH1cbiAgICBpZiAoY21kKSB7IG5hbWUgPSBcIkNtZC1cIiArIG5hbWU7IH1cbiAgICBpZiAoc2hpZnQpIHsgbmFtZSA9IFwiU2hpZnQtXCIgKyBuYW1lOyB9XG4gICAgcmV0dXJuIG5hbWVcbiAgfVxuXG4gIC8vIFRoaXMgaXMgYSBrbHVkZ2UgdG8ga2VlcCBrZXltYXBzIG1vc3RseSB3b3JraW5nIGFzIHJhdyBvYmplY3RzXG4gIC8vIChiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSkgd2hpbGUgYXQgdGhlIHNhbWUgdGltZSBzdXBwb3J0IGZlYXR1cmVzXG4gIC8vIGxpa2Ugbm9ybWFsaXphdGlvbiBhbmQgbXVsdGktc3Ryb2tlIGtleSBiaW5kaW5ncy4gSXQgY29tcGlsZXMgYVxuICAvLyBuZXcgbm9ybWFsaXplZCBrZXltYXAsIGFuZCB0aGVuIHVwZGF0ZXMgdGhlIG9sZCBvYmplY3QgdG8gcmVmbGVjdFxuICAvLyB0aGlzLlxuICBmdW5jdGlvbiBub3JtYWxpemVLZXlNYXAoa2V5bWFwKSB7XG4gICAgdmFyIGNvcHkgPSB7fTtcbiAgICBmb3IgKHZhciBrZXluYW1lIGluIGtleW1hcCkgeyBpZiAoa2V5bWFwLmhhc093blByb3BlcnR5KGtleW5hbWUpKSB7XG4gICAgICB2YXIgdmFsdWUgPSBrZXltYXBba2V5bmFtZV07XG4gICAgICBpZiAoL14obmFtZXxmYWxsdGhyb3VnaHwoZGV8YXQpdGFjaCkkLy50ZXN0KGtleW5hbWUpKSB7IGNvbnRpbnVlIH1cbiAgICAgIGlmICh2YWx1ZSA9PSBcIi4uLlwiKSB7IGRlbGV0ZSBrZXltYXBba2V5bmFtZV07IGNvbnRpbnVlIH1cblxuICAgICAgdmFyIGtleXMgPSBtYXAoa2V5bmFtZS5zcGxpdChcIiBcIiksIG5vcm1hbGl6ZUtleU5hbWUpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciB2YWwgPSAodm9pZCAwKSwgbmFtZSA9ICh2b2lkIDApO1xuICAgICAgICBpZiAoaSA9PSBrZXlzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBuYW1lID0ga2V5cy5qb2luKFwiIFwiKTtcbiAgICAgICAgICB2YWwgPSB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuYW1lID0ga2V5cy5zbGljZSgwLCBpICsgMSkuam9pbihcIiBcIik7XG4gICAgICAgICAgdmFsID0gXCIuLi5cIjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHJldiA9IGNvcHlbbmFtZV07XG4gICAgICAgIGlmICghcHJldikgeyBjb3B5W25hbWVdID0gdmFsOyB9XG4gICAgICAgIGVsc2UgaWYgKHByZXYgIT0gdmFsKSB7IHRocm93IG5ldyBFcnJvcihcIkluY29uc2lzdGVudCBiaW5kaW5ncyBmb3IgXCIgKyBuYW1lKSB9XG4gICAgICB9XG4gICAgICBkZWxldGUga2V5bWFwW2tleW5hbWVdO1xuICAgIH0gfVxuICAgIGZvciAodmFyIHByb3AgaW4gY29weSkgeyBrZXltYXBbcHJvcF0gPSBjb3B5W3Byb3BdOyB9XG4gICAgcmV0dXJuIGtleW1hcFxuICB9XG5cbiAgZnVuY3Rpb24gbG9va3VwS2V5KGtleSwgbWFwLCBoYW5kbGUsIGNvbnRleHQpIHtcbiAgICBtYXAgPSBnZXRLZXlNYXAobWFwKTtcbiAgICB2YXIgZm91bmQgPSBtYXAuY2FsbCA/IG1hcC5jYWxsKGtleSwgY29udGV4dCkgOiBtYXBba2V5XTtcbiAgICBpZiAoZm91bmQgPT09IGZhbHNlKSB7IHJldHVybiBcIm5vdGhpbmdcIiB9XG4gICAgaWYgKGZvdW5kID09PSBcIi4uLlwiKSB7IHJldHVybiBcIm11bHRpXCIgfVxuICAgIGlmIChmb3VuZCAhPSBudWxsICYmIGhhbmRsZShmb3VuZCkpIHsgcmV0dXJuIFwiaGFuZGxlZFwiIH1cblxuICAgIGlmIChtYXAuZmFsbHRocm91Z2gpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobWFwLmZhbGx0aHJvdWdoKSAhPSBcIltvYmplY3QgQXJyYXldXCIpXG4gICAgICAgIHsgcmV0dXJuIGxvb2t1cEtleShrZXksIG1hcC5mYWxsdGhyb3VnaCwgaGFuZGxlLCBjb250ZXh0KSB9XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hcC5mYWxsdGhyb3VnaC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcmVzdWx0ID0gbG9va3VwS2V5KGtleSwgbWFwLmZhbGx0aHJvdWdoW2ldLCBoYW5kbGUsIGNvbnRleHQpO1xuICAgICAgICBpZiAocmVzdWx0KSB7IHJldHVybiByZXN1bHQgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIE1vZGlmaWVyIGtleSBwcmVzc2VzIGRvbid0IGNvdW50IGFzICdyZWFsJyBrZXkgcHJlc3NlcyBmb3IgdGhlXG4gIC8vIHB1cnBvc2Ugb2Yga2V5bWFwIGZhbGx0aHJvdWdoLlxuICBmdW5jdGlvbiBpc01vZGlmaWVyS2V5KHZhbHVlKSB7XG4gICAgdmFyIG5hbWUgPSB0eXBlb2YgdmFsdWUgPT0gXCJzdHJpbmdcIiA/IHZhbHVlIDoga2V5TmFtZXNbdmFsdWUua2V5Q29kZV07XG4gICAgcmV0dXJuIG5hbWUgPT0gXCJDdHJsXCIgfHwgbmFtZSA9PSBcIkFsdFwiIHx8IG5hbWUgPT0gXCJTaGlmdFwiIHx8IG5hbWUgPT0gXCJNb2RcIlxuICB9XG5cbiAgZnVuY3Rpb24gYWRkTW9kaWZpZXJOYW1lcyhuYW1lLCBldmVudCwgbm9TaGlmdCkge1xuICAgIHZhciBiYXNlID0gbmFtZTtcbiAgICBpZiAoZXZlbnQuYWx0S2V5ICYmIGJhc2UgIT0gXCJBbHRcIikgeyBuYW1lID0gXCJBbHQtXCIgKyBuYW1lOyB9XG4gICAgaWYgKChmbGlwQ3RybENtZCA/IGV2ZW50Lm1ldGFLZXkgOiBldmVudC5jdHJsS2V5KSAmJiBiYXNlICE9IFwiQ3RybFwiKSB7IG5hbWUgPSBcIkN0cmwtXCIgKyBuYW1lOyB9XG4gICAgaWYgKChmbGlwQ3RybENtZCA/IGV2ZW50LmN0cmxLZXkgOiBldmVudC5tZXRhS2V5KSAmJiBiYXNlICE9IFwiTW9kXCIpIHsgbmFtZSA9IFwiQ21kLVwiICsgbmFtZTsgfVxuICAgIGlmICghbm9TaGlmdCAmJiBldmVudC5zaGlmdEtleSAmJiBiYXNlICE9IFwiU2hpZnRcIikgeyBuYW1lID0gXCJTaGlmdC1cIiArIG5hbWU7IH1cbiAgICByZXR1cm4gbmFtZVxuICB9XG5cbiAgLy8gTG9vayB1cCB0aGUgbmFtZSBvZiBhIGtleSBhcyBpbmRpY2F0ZWQgYnkgYW4gZXZlbnQgb2JqZWN0LlxuICBmdW5jdGlvbiBrZXlOYW1lKGV2ZW50LCBub1NoaWZ0KSB7XG4gICAgaWYgKHByZXN0byAmJiBldmVudC5rZXlDb2RlID09IDM0ICYmIGV2ZW50W1wiY2hhclwiXSkgeyByZXR1cm4gZmFsc2UgfVxuICAgIHZhciBuYW1lID0ga2V5TmFtZXNbZXZlbnQua2V5Q29kZV07XG4gICAgaWYgKG5hbWUgPT0gbnVsbCB8fCBldmVudC5hbHRHcmFwaEtleSkgeyByZXR1cm4gZmFsc2UgfVxuICAgIC8vIEN0cmwtU2Nyb2xsTG9jayBoYXMga2V5Q29kZSAzLCBzYW1lIGFzIEN0cmwtUGF1c2UsXG4gICAgLy8gc28gd2UnbGwgdXNlIGV2ZW50LmNvZGUgd2hlbiBhdmFpbGFibGUgKENocm9tZSA0OCssIEZGIDM4KywgU2FmYXJpIDEwLjErKVxuICAgIGlmIChldmVudC5rZXlDb2RlID09IDMgJiYgZXZlbnQuY29kZSkgeyBuYW1lID0gZXZlbnQuY29kZTsgfVxuICAgIHJldHVybiBhZGRNb2RpZmllck5hbWVzKG5hbWUsIGV2ZW50LCBub1NoaWZ0KVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0S2V5TWFwKHZhbCkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsID09IFwic3RyaW5nXCIgPyBrZXlNYXBbdmFsXSA6IHZhbFxuICB9XG5cbiAgLy8gSGVscGVyIGZvciBkZWxldGluZyB0ZXh0IG5lYXIgdGhlIHNlbGVjdGlvbihzKSwgdXNlZCB0byBpbXBsZW1lbnRcbiAgLy8gYmFja3NwYWNlLCBkZWxldGUsIGFuZCBzaW1pbGFyIGZ1bmN0aW9uYWxpdHkuXG4gIGZ1bmN0aW9uIGRlbGV0ZU5lYXJTZWxlY3Rpb24oY20sIGNvbXB1dGUpIHtcbiAgICB2YXIgcmFuZ2VzID0gY20uZG9jLnNlbC5yYW5nZXMsIGtpbGwgPSBbXTtcbiAgICAvLyBCdWlsZCB1cCBhIHNldCBvZiByYW5nZXMgdG8ga2lsbCBmaXJzdCwgbWVyZ2luZyBvdmVybGFwcGluZ1xuICAgIC8vIHJhbmdlcy5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHRvS2lsbCA9IGNvbXB1dGUocmFuZ2VzW2ldKTtcbiAgICAgIHdoaWxlIChraWxsLmxlbmd0aCAmJiBjbXAodG9LaWxsLmZyb20sIGxzdChraWxsKS50bykgPD0gMCkge1xuICAgICAgICB2YXIgcmVwbGFjZWQgPSBraWxsLnBvcCgpO1xuICAgICAgICBpZiAoY21wKHJlcGxhY2VkLmZyb20sIHRvS2lsbC5mcm9tKSA8IDApIHtcbiAgICAgICAgICB0b0tpbGwuZnJvbSA9IHJlcGxhY2VkLmZyb207XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAga2lsbC5wdXNoKHRvS2lsbCk7XG4gICAgfVxuICAgIC8vIE5leHQsIHJlbW92ZSB0aG9zZSBhY3R1YWwgcmFuZ2VzLlxuICAgIHJ1bkluT3AoY20sIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAodmFyIGkgPSBraWxsLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKVxuICAgICAgICB7IHJlcGxhY2VSYW5nZShjbS5kb2MsIFwiXCIsIGtpbGxbaV0uZnJvbSwga2lsbFtpXS50bywgXCIrZGVsZXRlXCIpOyB9XG4gICAgICBlbnN1cmVDdXJzb3JWaXNpYmxlKGNtKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1vdmVDaGFyTG9naWNhbGx5KGxpbmUsIGNoLCBkaXIpIHtcbiAgICB2YXIgdGFyZ2V0ID0gc2tpcEV4dGVuZGluZ0NoYXJzKGxpbmUudGV4dCwgY2ggKyBkaXIsIGRpcik7XG4gICAgcmV0dXJuIHRhcmdldCA8IDAgfHwgdGFyZ2V0ID4gbGluZS50ZXh0Lmxlbmd0aCA/IG51bGwgOiB0YXJnZXRcbiAgfVxuXG4gIGZ1bmN0aW9uIG1vdmVMb2dpY2FsbHkobGluZSwgc3RhcnQsIGRpcikge1xuICAgIHZhciBjaCA9IG1vdmVDaGFyTG9naWNhbGx5KGxpbmUsIHN0YXJ0LmNoLCBkaXIpO1xuICAgIHJldHVybiBjaCA9PSBudWxsID8gbnVsbCA6IG5ldyBQb3Moc3RhcnQubGluZSwgY2gsIGRpciA8IDAgPyBcImFmdGVyXCIgOiBcImJlZm9yZVwiKVxuICB9XG5cbiAgZnVuY3Rpb24gZW5kT2ZMaW5lKHZpc3VhbGx5LCBjbSwgbGluZU9iaiwgbGluZU5vLCBkaXIpIHtcbiAgICBpZiAodmlzdWFsbHkpIHtcbiAgICAgIGlmIChjbS5kb2MuZGlyZWN0aW9uID09IFwicnRsXCIpIHsgZGlyID0gLWRpcjsgfVxuICAgICAgdmFyIG9yZGVyID0gZ2V0T3JkZXIobGluZU9iaiwgY20uZG9jLmRpcmVjdGlvbik7XG4gICAgICBpZiAob3JkZXIpIHtcbiAgICAgICAgdmFyIHBhcnQgPSBkaXIgPCAwID8gbHN0KG9yZGVyKSA6IG9yZGVyWzBdO1xuICAgICAgICB2YXIgbW92ZUluU3RvcmFnZU9yZGVyID0gKGRpciA8IDApID09IChwYXJ0LmxldmVsID09IDEpO1xuICAgICAgICB2YXIgc3RpY2t5ID0gbW92ZUluU3RvcmFnZU9yZGVyID8gXCJhZnRlclwiIDogXCJiZWZvcmVcIjtcbiAgICAgICAgdmFyIGNoO1xuICAgICAgICAvLyBXaXRoIGEgd3JhcHBlZCBydGwgY2h1bmsgKHBvc3NpYmx5IHNwYW5uaW5nIG11bHRpcGxlIGJpZGkgcGFydHMpLFxuICAgICAgICAvLyBpdCBjb3VsZCBiZSB0aGF0IHRoZSBsYXN0IGJpZGkgcGFydCBpcyBub3Qgb24gdGhlIGxhc3QgdmlzdWFsIGxpbmUsXG4gICAgICAgIC8vIHNpbmNlIHZpc3VhbCBsaW5lcyBjb250YWluIGNvbnRlbnQgb3JkZXItY29uc2VjdXRpdmUgY2h1bmtzLlxuICAgICAgICAvLyBUaHVzLCBpbiBydGwsIHdlIGFyZSBsb29raW5nIGZvciB0aGUgZmlyc3QgKGNvbnRlbnQtb3JkZXIpIGNoYXJhY3RlclxuICAgICAgICAvLyBpbiB0aGUgcnRsIGNodW5rIHRoYXQgaXMgb24gdGhlIGxhc3QgbGluZSAodGhhdCBpcywgdGhlIHNhbWUgbGluZVxuICAgICAgICAvLyBhcyB0aGUgbGFzdCAoY29udGVudC1vcmRlcikgY2hhcmFjdGVyKS5cbiAgICAgICAgaWYgKHBhcnQubGV2ZWwgPiAwIHx8IGNtLmRvYy5kaXJlY3Rpb24gPT0gXCJydGxcIikge1xuICAgICAgICAgIHZhciBwcmVwID0gcHJlcGFyZU1lYXN1cmVGb3JMaW5lKGNtLCBsaW5lT2JqKTtcbiAgICAgICAgICBjaCA9IGRpciA8IDAgPyBsaW5lT2JqLnRleHQubGVuZ3RoIC0gMSA6IDA7XG4gICAgICAgICAgdmFyIHRhcmdldFRvcCA9IG1lYXN1cmVDaGFyUHJlcGFyZWQoY20sIHByZXAsIGNoKS50b3A7XG4gICAgICAgICAgY2ggPSBmaW5kRmlyc3QoZnVuY3Rpb24gKGNoKSB7IHJldHVybiBtZWFzdXJlQ2hhclByZXBhcmVkKGNtLCBwcmVwLCBjaCkudG9wID09IHRhcmdldFRvcDsgfSwgKGRpciA8IDApID09IChwYXJ0LmxldmVsID09IDEpID8gcGFydC5mcm9tIDogcGFydC50byAtIDEsIGNoKTtcbiAgICAgICAgICBpZiAoc3RpY2t5ID09IFwiYmVmb3JlXCIpIHsgY2ggPSBtb3ZlQ2hhckxvZ2ljYWxseShsaW5lT2JqLCBjaCwgMSk7IH1cbiAgICAgICAgfSBlbHNlIHsgY2ggPSBkaXIgPCAwID8gcGFydC50byA6IHBhcnQuZnJvbTsgfVxuICAgICAgICByZXR1cm4gbmV3IFBvcyhsaW5lTm8sIGNoLCBzdGlja3kpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgUG9zKGxpbmVObywgZGlyIDwgMCA/IGxpbmVPYmoudGV4dC5sZW5ndGggOiAwLCBkaXIgPCAwID8gXCJiZWZvcmVcIiA6IFwiYWZ0ZXJcIilcbiAgfVxuXG4gIGZ1bmN0aW9uIG1vdmVWaXN1YWxseShjbSwgbGluZSwgc3RhcnQsIGRpcikge1xuICAgIHZhciBiaWRpID0gZ2V0T3JkZXIobGluZSwgY20uZG9jLmRpcmVjdGlvbik7XG4gICAgaWYgKCFiaWRpKSB7IHJldHVybiBtb3ZlTG9naWNhbGx5KGxpbmUsIHN0YXJ0LCBkaXIpIH1cbiAgICBpZiAoc3RhcnQuY2ggPj0gbGluZS50ZXh0Lmxlbmd0aCkge1xuICAgICAgc3RhcnQuY2ggPSBsaW5lLnRleHQubGVuZ3RoO1xuICAgICAgc3RhcnQuc3RpY2t5ID0gXCJiZWZvcmVcIjtcbiAgICB9IGVsc2UgaWYgKHN0YXJ0LmNoIDw9IDApIHtcbiAgICAgIHN0YXJ0LmNoID0gMDtcbiAgICAgIHN0YXJ0LnN0aWNreSA9IFwiYWZ0ZXJcIjtcbiAgICB9XG4gICAgdmFyIHBhcnRQb3MgPSBnZXRCaWRpUGFydEF0KGJpZGksIHN0YXJ0LmNoLCBzdGFydC5zdGlja3kpLCBwYXJ0ID0gYmlkaVtwYXJ0UG9zXTtcbiAgICBpZiAoY20uZG9jLmRpcmVjdGlvbiA9PSBcImx0clwiICYmIHBhcnQubGV2ZWwgJSAyID09IDAgJiYgKGRpciA+IDAgPyBwYXJ0LnRvID4gc3RhcnQuY2ggOiBwYXJ0LmZyb20gPCBzdGFydC5jaCkpIHtcbiAgICAgIC8vIENhc2UgMTogV2UgbW92ZSB3aXRoaW4gYW4gbHRyIHBhcnQgaW4gYW4gbHRyIGVkaXRvci4gRXZlbiB3aXRoIHdyYXBwZWQgbGluZXMsXG4gICAgICAvLyBub3RoaW5nIGludGVyZXN0aW5nIGhhcHBlbnMuXG4gICAgICByZXR1cm4gbW92ZUxvZ2ljYWxseShsaW5lLCBzdGFydCwgZGlyKVxuICAgIH1cblxuICAgIHZhciBtdiA9IGZ1bmN0aW9uIChwb3MsIGRpcikgeyByZXR1cm4gbW92ZUNoYXJMb2dpY2FsbHkobGluZSwgcG9zIGluc3RhbmNlb2YgUG9zID8gcG9zLmNoIDogcG9zLCBkaXIpOyB9O1xuICAgIHZhciBwcmVwO1xuICAgIHZhciBnZXRXcmFwcGVkTGluZUV4dGVudCA9IGZ1bmN0aW9uIChjaCkge1xuICAgICAgaWYgKCFjbS5vcHRpb25zLmxpbmVXcmFwcGluZykgeyByZXR1cm4ge2JlZ2luOiAwLCBlbmQ6IGxpbmUudGV4dC5sZW5ndGh9IH1cbiAgICAgIHByZXAgPSBwcmVwIHx8IHByZXBhcmVNZWFzdXJlRm9yTGluZShjbSwgbGluZSk7XG4gICAgICByZXR1cm4gd3JhcHBlZExpbmVFeHRlbnRDaGFyKGNtLCBsaW5lLCBwcmVwLCBjaClcbiAgICB9O1xuICAgIHZhciB3cmFwcGVkTGluZUV4dGVudCA9IGdldFdyYXBwZWRMaW5lRXh0ZW50KHN0YXJ0LnN0aWNreSA9PSBcImJlZm9yZVwiID8gbXYoc3RhcnQsIC0xKSA6IHN0YXJ0LmNoKTtcblxuICAgIGlmIChjbS5kb2MuZGlyZWN0aW9uID09IFwicnRsXCIgfHwgcGFydC5sZXZlbCA9PSAxKSB7XG4gICAgICB2YXIgbW92ZUluU3RvcmFnZU9yZGVyID0gKHBhcnQubGV2ZWwgPT0gMSkgPT0gKGRpciA8IDApO1xuICAgICAgdmFyIGNoID0gbXYoc3RhcnQsIG1vdmVJblN0b3JhZ2VPcmRlciA/IDEgOiAtMSk7XG4gICAgICBpZiAoY2ggIT0gbnVsbCAmJiAoIW1vdmVJblN0b3JhZ2VPcmRlciA/IGNoID49IHBhcnQuZnJvbSAmJiBjaCA+PSB3cmFwcGVkTGluZUV4dGVudC5iZWdpbiA6IGNoIDw9IHBhcnQudG8gJiYgY2ggPD0gd3JhcHBlZExpbmVFeHRlbnQuZW5kKSkge1xuICAgICAgICAvLyBDYXNlIDI6IFdlIG1vdmUgd2l0aGluIGFuIHJ0bCBwYXJ0IG9yIGluIGFuIHJ0bCBlZGl0b3Igb24gdGhlIHNhbWUgdmlzdWFsIGxpbmVcbiAgICAgICAgdmFyIHN0aWNreSA9IG1vdmVJblN0b3JhZ2VPcmRlciA/IFwiYmVmb3JlXCIgOiBcImFmdGVyXCI7XG4gICAgICAgIHJldHVybiBuZXcgUG9zKHN0YXJ0LmxpbmUsIGNoLCBzdGlja3kpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2FzZSAzOiBDb3VsZCBub3QgbW92ZSB3aXRoaW4gdGhpcyBiaWRpIHBhcnQgaW4gdGhpcyB2aXN1YWwgbGluZSwgc28gbGVhdmVcbiAgICAvLyB0aGUgY3VycmVudCBiaWRpIHBhcnRcblxuICAgIHZhciBzZWFyY2hJblZpc3VhbExpbmUgPSBmdW5jdGlvbiAocGFydFBvcywgZGlyLCB3cmFwcGVkTGluZUV4dGVudCkge1xuICAgICAgdmFyIGdldFJlcyA9IGZ1bmN0aW9uIChjaCwgbW92ZUluU3RvcmFnZU9yZGVyKSB7IHJldHVybiBtb3ZlSW5TdG9yYWdlT3JkZXJcbiAgICAgICAgPyBuZXcgUG9zKHN0YXJ0LmxpbmUsIG12KGNoLCAxKSwgXCJiZWZvcmVcIilcbiAgICAgICAgOiBuZXcgUG9zKHN0YXJ0LmxpbmUsIGNoLCBcImFmdGVyXCIpOyB9O1xuXG4gICAgICBmb3IgKDsgcGFydFBvcyA+PSAwICYmIHBhcnRQb3MgPCBiaWRpLmxlbmd0aDsgcGFydFBvcyArPSBkaXIpIHtcbiAgICAgICAgdmFyIHBhcnQgPSBiaWRpW3BhcnRQb3NdO1xuICAgICAgICB2YXIgbW92ZUluU3RvcmFnZU9yZGVyID0gKGRpciA+IDApID09IChwYXJ0LmxldmVsICE9IDEpO1xuICAgICAgICB2YXIgY2ggPSBtb3ZlSW5TdG9yYWdlT3JkZXIgPyB3cmFwcGVkTGluZUV4dGVudC5iZWdpbiA6IG12KHdyYXBwZWRMaW5lRXh0ZW50LmVuZCwgLTEpO1xuICAgICAgICBpZiAocGFydC5mcm9tIDw9IGNoICYmIGNoIDwgcGFydC50bykgeyByZXR1cm4gZ2V0UmVzKGNoLCBtb3ZlSW5TdG9yYWdlT3JkZXIpIH1cbiAgICAgICAgY2ggPSBtb3ZlSW5TdG9yYWdlT3JkZXIgPyBwYXJ0LmZyb20gOiBtdihwYXJ0LnRvLCAtMSk7XG4gICAgICAgIGlmICh3cmFwcGVkTGluZUV4dGVudC5iZWdpbiA8PSBjaCAmJiBjaCA8IHdyYXBwZWRMaW5lRXh0ZW50LmVuZCkgeyByZXR1cm4gZ2V0UmVzKGNoLCBtb3ZlSW5TdG9yYWdlT3JkZXIpIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gQ2FzZSAzYTogTG9vayBmb3Igb3RoZXIgYmlkaSBwYXJ0cyBvbiB0aGUgc2FtZSB2aXN1YWwgbGluZVxuICAgIHZhciByZXMgPSBzZWFyY2hJblZpc3VhbExpbmUocGFydFBvcyArIGRpciwgZGlyLCB3cmFwcGVkTGluZUV4dGVudCk7XG4gICAgaWYgKHJlcykgeyByZXR1cm4gcmVzIH1cblxuICAgIC8vIENhc2UgM2I6IExvb2sgZm9yIG90aGVyIGJpZGkgcGFydHMgb24gdGhlIG5leHQgdmlzdWFsIGxpbmVcbiAgICB2YXIgbmV4dENoID0gZGlyID4gMCA/IHdyYXBwZWRMaW5lRXh0ZW50LmVuZCA6IG12KHdyYXBwZWRMaW5lRXh0ZW50LmJlZ2luLCAtMSk7XG4gICAgaWYgKG5leHRDaCAhPSBudWxsICYmICEoZGlyID4gMCAmJiBuZXh0Q2ggPT0gbGluZS50ZXh0Lmxlbmd0aCkpIHtcbiAgICAgIHJlcyA9IHNlYXJjaEluVmlzdWFsTGluZShkaXIgPiAwID8gMCA6IGJpZGkubGVuZ3RoIC0gMSwgZGlyLCBnZXRXcmFwcGVkTGluZUV4dGVudChuZXh0Q2gpKTtcbiAgICAgIGlmIChyZXMpIHsgcmV0dXJuIHJlcyB9XG4gICAgfVxuXG4gICAgLy8gQ2FzZSA0OiBOb3doZXJlIHRvIG1vdmVcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLy8gQ29tbWFuZHMgYXJlIHBhcmFtZXRlci1sZXNzIGFjdGlvbnMgdGhhdCBjYW4gYmUgcGVyZm9ybWVkIG9uIGFuXG4gIC8vIGVkaXRvciwgbW9zdGx5IHVzZWQgZm9yIGtleWJpbmRpbmdzLlxuICB2YXIgY29tbWFuZHMgPSB7XG4gICAgc2VsZWN0QWxsOiBzZWxlY3RBbGwsXG4gICAgc2luZ2xlU2VsZWN0aW9uOiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLnNldFNlbGVjdGlvbihjbS5nZXRDdXJzb3IoXCJhbmNob3JcIiksIGNtLmdldEN1cnNvcihcImhlYWRcIiksIHNlbF9kb250U2Nyb2xsKTsgfSxcbiAgICBraWxsTGluZTogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBkZWxldGVOZWFyU2VsZWN0aW9uKGNtLCBmdW5jdGlvbiAocmFuZ2UpIHtcbiAgICAgIGlmIChyYW5nZS5lbXB0eSgpKSB7XG4gICAgICAgIHZhciBsZW4gPSBnZXRMaW5lKGNtLmRvYywgcmFuZ2UuaGVhZC5saW5lKS50ZXh0Lmxlbmd0aDtcbiAgICAgICAgaWYgKHJhbmdlLmhlYWQuY2ggPT0gbGVuICYmIHJhbmdlLmhlYWQubGluZSA8IGNtLmxhc3RMaW5lKCkpXG4gICAgICAgICAgeyByZXR1cm4ge2Zyb206IHJhbmdlLmhlYWQsIHRvOiBQb3MocmFuZ2UuaGVhZC5saW5lICsgMSwgMCl9IH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgIHsgcmV0dXJuIHtmcm9tOiByYW5nZS5oZWFkLCB0bzogUG9zKHJhbmdlLmhlYWQubGluZSwgbGVuKX0gfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtmcm9tOiByYW5nZS5mcm9tKCksIHRvOiByYW5nZS50bygpfVxuICAgICAgfVxuICAgIH0pOyB9LFxuICAgIGRlbGV0ZUxpbmU6IGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gZGVsZXRlTmVhclNlbGVjdGlvbihjbSwgZnVuY3Rpb24gKHJhbmdlKSB7IHJldHVybiAoe1xuICAgICAgZnJvbTogUG9zKHJhbmdlLmZyb20oKS5saW5lLCAwKSxcbiAgICAgIHRvOiBjbGlwUG9zKGNtLmRvYywgUG9zKHJhbmdlLnRvKCkubGluZSArIDEsIDApKVxuICAgIH0pOyB9KTsgfSxcbiAgICBkZWxMaW5lTGVmdDogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBkZWxldGVOZWFyU2VsZWN0aW9uKGNtLCBmdW5jdGlvbiAocmFuZ2UpIHsgcmV0dXJuICh7XG4gICAgICBmcm9tOiBQb3MocmFuZ2UuZnJvbSgpLmxpbmUsIDApLCB0bzogcmFuZ2UuZnJvbSgpXG4gICAgfSk7IH0pOyB9LFxuICAgIGRlbFdyYXBwZWRMaW5lTGVmdDogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBkZWxldGVOZWFyU2VsZWN0aW9uKGNtLCBmdW5jdGlvbiAocmFuZ2UpIHtcbiAgICAgIHZhciB0b3AgPSBjbS5jaGFyQ29vcmRzKHJhbmdlLmhlYWQsIFwiZGl2XCIpLnRvcCArIDU7XG4gICAgICB2YXIgbGVmdFBvcyA9IGNtLmNvb3Jkc0NoYXIoe2xlZnQ6IDAsIHRvcDogdG9wfSwgXCJkaXZcIik7XG4gICAgICByZXR1cm4ge2Zyb206IGxlZnRQb3MsIHRvOiByYW5nZS5mcm9tKCl9XG4gICAgfSk7IH0sXG4gICAgZGVsV3JhcHBlZExpbmVSaWdodDogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBkZWxldGVOZWFyU2VsZWN0aW9uKGNtLCBmdW5jdGlvbiAocmFuZ2UpIHtcbiAgICAgIHZhciB0b3AgPSBjbS5jaGFyQ29vcmRzKHJhbmdlLmhlYWQsIFwiZGl2XCIpLnRvcCArIDU7XG4gICAgICB2YXIgcmlnaHRQb3MgPSBjbS5jb29yZHNDaGFyKHtsZWZ0OiBjbS5kaXNwbGF5LmxpbmVEaXYub2Zmc2V0V2lkdGggKyAxMDAsIHRvcDogdG9wfSwgXCJkaXZcIik7XG4gICAgICByZXR1cm4ge2Zyb206IHJhbmdlLmZyb20oKSwgdG86IHJpZ2h0UG9zIH1cbiAgICB9KTsgfSxcbiAgICB1bmRvOiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLnVuZG8oKTsgfSxcbiAgICByZWRvOiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLnJlZG8oKTsgfSxcbiAgICB1bmRvU2VsZWN0aW9uOiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLnVuZG9TZWxlY3Rpb24oKTsgfSxcbiAgICByZWRvU2VsZWN0aW9uOiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLnJlZG9TZWxlY3Rpb24oKTsgfSxcbiAgICBnb0RvY1N0YXJ0OiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLmV4dGVuZFNlbGVjdGlvbihQb3MoY20uZmlyc3RMaW5lKCksIDApKTsgfSxcbiAgICBnb0RvY0VuZDogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5leHRlbmRTZWxlY3Rpb24oUG9zKGNtLmxhc3RMaW5lKCkpKTsgfSxcbiAgICBnb0xpbmVTdGFydDogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5leHRlbmRTZWxlY3Rpb25zQnkoZnVuY3Rpb24gKHJhbmdlKSB7IHJldHVybiBsaW5lU3RhcnQoY20sIHJhbmdlLmhlYWQubGluZSk7IH0sXG4gICAgICB7b3JpZ2luOiBcIittb3ZlXCIsIGJpYXM6IDF9XG4gICAgKTsgfSxcbiAgICBnb0xpbmVTdGFydFNtYXJ0OiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLmV4dGVuZFNlbGVjdGlvbnNCeShmdW5jdGlvbiAocmFuZ2UpIHsgcmV0dXJuIGxpbmVTdGFydFNtYXJ0KGNtLCByYW5nZS5oZWFkKTsgfSxcbiAgICAgIHtvcmlnaW46IFwiK21vdmVcIiwgYmlhczogMX1cbiAgICApOyB9LFxuICAgIGdvTGluZUVuZDogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5leHRlbmRTZWxlY3Rpb25zQnkoZnVuY3Rpb24gKHJhbmdlKSB7IHJldHVybiBsaW5lRW5kKGNtLCByYW5nZS5oZWFkLmxpbmUpOyB9LFxuICAgICAge29yaWdpbjogXCIrbW92ZVwiLCBiaWFzOiAtMX1cbiAgICApOyB9LFxuICAgIGdvTGluZVJpZ2h0OiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLmV4dGVuZFNlbGVjdGlvbnNCeShmdW5jdGlvbiAocmFuZ2UpIHtcbiAgICAgIHZhciB0b3AgPSBjbS5jdXJzb3JDb29yZHMocmFuZ2UuaGVhZCwgXCJkaXZcIikudG9wICsgNTtcbiAgICAgIHJldHVybiBjbS5jb29yZHNDaGFyKHtsZWZ0OiBjbS5kaXNwbGF5LmxpbmVEaXYub2Zmc2V0V2lkdGggKyAxMDAsIHRvcDogdG9wfSwgXCJkaXZcIilcbiAgICB9LCBzZWxfbW92ZSk7IH0sXG4gICAgZ29MaW5lTGVmdDogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5leHRlbmRTZWxlY3Rpb25zQnkoZnVuY3Rpb24gKHJhbmdlKSB7XG4gICAgICB2YXIgdG9wID0gY20uY3Vyc29yQ29vcmRzKHJhbmdlLmhlYWQsIFwiZGl2XCIpLnRvcCArIDU7XG4gICAgICByZXR1cm4gY20uY29vcmRzQ2hhcih7bGVmdDogMCwgdG9wOiB0b3B9LCBcImRpdlwiKVxuICAgIH0sIHNlbF9tb3ZlKTsgfSxcbiAgICBnb0xpbmVMZWZ0U21hcnQ6IGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gY20uZXh0ZW5kU2VsZWN0aW9uc0J5KGZ1bmN0aW9uIChyYW5nZSkge1xuICAgICAgdmFyIHRvcCA9IGNtLmN1cnNvckNvb3JkcyhyYW5nZS5oZWFkLCBcImRpdlwiKS50b3AgKyA1O1xuICAgICAgdmFyIHBvcyA9IGNtLmNvb3Jkc0NoYXIoe2xlZnQ6IDAsIHRvcDogdG9wfSwgXCJkaXZcIik7XG4gICAgICBpZiAocG9zLmNoIDwgY20uZ2V0TGluZShwb3MubGluZSkuc2VhcmNoKC9cXFMvKSkgeyByZXR1cm4gbGluZVN0YXJ0U21hcnQoY20sIHJhbmdlLmhlYWQpIH1cbiAgICAgIHJldHVybiBwb3NcbiAgICB9LCBzZWxfbW92ZSk7IH0sXG4gICAgZ29MaW5lVXA6IGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gY20ubW92ZVYoLTEsIFwibGluZVwiKTsgfSxcbiAgICBnb0xpbmVEb3duOiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLm1vdmVWKDEsIFwibGluZVwiKTsgfSxcbiAgICBnb1BhZ2VVcDogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5tb3ZlVigtMSwgXCJwYWdlXCIpOyB9LFxuICAgIGdvUGFnZURvd246IGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gY20ubW92ZVYoMSwgXCJwYWdlXCIpOyB9LFxuICAgIGdvQ2hhckxlZnQ6IGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gY20ubW92ZUgoLTEsIFwiY2hhclwiKTsgfSxcbiAgICBnb0NoYXJSaWdodDogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5tb3ZlSCgxLCBcImNoYXJcIik7IH0sXG4gICAgZ29Db2x1bW5MZWZ0OiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLm1vdmVIKC0xLCBcImNvbHVtblwiKTsgfSxcbiAgICBnb0NvbHVtblJpZ2h0OiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLm1vdmVIKDEsIFwiY29sdW1uXCIpOyB9LFxuICAgIGdvV29yZExlZnQ6IGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gY20ubW92ZUgoLTEsIFwid29yZFwiKTsgfSxcbiAgICBnb0dyb3VwUmlnaHQ6IGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gY20ubW92ZUgoMSwgXCJncm91cFwiKTsgfSxcbiAgICBnb0dyb3VwTGVmdDogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5tb3ZlSCgtMSwgXCJncm91cFwiKTsgfSxcbiAgICBnb1dvcmRSaWdodDogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5tb3ZlSCgxLCBcIndvcmRcIik7IH0sXG4gICAgZGVsQ2hhckJlZm9yZTogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5kZWxldGVIKC0xLCBcImNvZGVwb2ludFwiKTsgfSxcbiAgICBkZWxDaGFyQWZ0ZXI6IGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gY20uZGVsZXRlSCgxLCBcImNoYXJcIik7IH0sXG4gICAgZGVsV29yZEJlZm9yZTogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5kZWxldGVIKC0xLCBcIndvcmRcIik7IH0sXG4gICAgZGVsV29yZEFmdGVyOiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLmRlbGV0ZUgoMSwgXCJ3b3JkXCIpOyB9LFxuICAgIGRlbEdyb3VwQmVmb3JlOiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLmRlbGV0ZUgoLTEsIFwiZ3JvdXBcIik7IH0sXG4gICAgZGVsR3JvdXBBZnRlcjogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5kZWxldGVIKDEsIFwiZ3JvdXBcIik7IH0sXG4gICAgaW5kZW50QXV0bzogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5pbmRlbnRTZWxlY3Rpb24oXCJzbWFydFwiKTsgfSxcbiAgICBpbmRlbnRNb3JlOiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLmluZGVudFNlbGVjdGlvbihcImFkZFwiKTsgfSxcbiAgICBpbmRlbnRMZXNzOiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLmluZGVudFNlbGVjdGlvbihcInN1YnRyYWN0XCIpOyB9LFxuICAgIGluc2VydFRhYjogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5yZXBsYWNlU2VsZWN0aW9uKFwiXFx0XCIpOyB9LFxuICAgIGluc2VydFNvZnRUYWI6IGZ1bmN0aW9uIChjbSkge1xuICAgICAgdmFyIHNwYWNlcyA9IFtdLCByYW5nZXMgPSBjbS5saXN0U2VsZWN0aW9ucygpLCB0YWJTaXplID0gY20ub3B0aW9ucy50YWJTaXplO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHBvcyA9IHJhbmdlc1tpXS5mcm9tKCk7XG4gICAgICAgIHZhciBjb2wgPSBjb3VudENvbHVtbihjbS5nZXRMaW5lKHBvcy5saW5lKSwgcG9zLmNoLCB0YWJTaXplKTtcbiAgICAgICAgc3BhY2VzLnB1c2goc3BhY2VTdHIodGFiU2l6ZSAtIGNvbCAlIHRhYlNpemUpKTtcbiAgICAgIH1cbiAgICAgIGNtLnJlcGxhY2VTZWxlY3Rpb25zKHNwYWNlcyk7XG4gICAgfSxcbiAgICBkZWZhdWx0VGFiOiBmdW5jdGlvbiAoY20pIHtcbiAgICAgIGlmIChjbS5zb21ldGhpbmdTZWxlY3RlZCgpKSB7IGNtLmluZGVudFNlbGVjdGlvbihcImFkZFwiKTsgfVxuICAgICAgZWxzZSB7IGNtLmV4ZWNDb21tYW5kKFwiaW5zZXJ0VGFiXCIpOyB9XG4gICAgfSxcbiAgICAvLyBTd2FwIHRoZSB0d28gY2hhcnMgbGVmdCBhbmQgcmlnaHQgb2YgZWFjaCBzZWxlY3Rpb24ncyBoZWFkLlxuICAgIC8vIE1vdmUgY3Vyc29yIGJlaGluZCB0aGUgdHdvIHN3YXBwZWQgY2hhcmFjdGVycyBhZnRlcndhcmRzLlxuICAgIC8vXG4gICAgLy8gRG9lc24ndCBjb25zaWRlciBsaW5lIGZlZWRzIGEgY2hhcmFjdGVyLlxuICAgIC8vIERvZXNuJ3Qgc2NhbiBtb3JlIHRoYW4gb25lIGxpbmUgYWJvdmUgdG8gZmluZCBhIGNoYXJhY3Rlci5cbiAgICAvLyBEb2Vzbid0IGRvIGFueXRoaW5nIG9uIGFuIGVtcHR5IGxpbmUuXG4gICAgLy8gRG9lc24ndCBkbyBhbnl0aGluZyB3aXRoIG5vbi1lbXB0eSBzZWxlY3Rpb25zLlxuICAgIHRyYW5zcG9zZUNoYXJzOiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIHJ1bkluT3AoY20sIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciByYW5nZXMgPSBjbS5saXN0U2VsZWN0aW9ucygpLCBuZXdTZWwgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICghcmFuZ2VzW2ldLmVtcHR5KCkpIHsgY29udGludWUgfVxuICAgICAgICB2YXIgY3VyID0gcmFuZ2VzW2ldLmhlYWQsIGxpbmUgPSBnZXRMaW5lKGNtLmRvYywgY3VyLmxpbmUpLnRleHQ7XG4gICAgICAgIGlmIChsaW5lKSB7XG4gICAgICAgICAgaWYgKGN1ci5jaCA9PSBsaW5lLmxlbmd0aCkgeyBjdXIgPSBuZXcgUG9zKGN1ci5saW5lLCBjdXIuY2ggLSAxKTsgfVxuICAgICAgICAgIGlmIChjdXIuY2ggPiAwKSB7XG4gICAgICAgICAgICBjdXIgPSBuZXcgUG9zKGN1ci5saW5lLCBjdXIuY2ggKyAxKTtcbiAgICAgICAgICAgIGNtLnJlcGxhY2VSYW5nZShsaW5lLmNoYXJBdChjdXIuY2ggLSAxKSArIGxpbmUuY2hhckF0KGN1ci5jaCAtIDIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvcyhjdXIubGluZSwgY3VyLmNoIC0gMiksIGN1ciwgXCIrdHJhbnNwb3NlXCIpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY3VyLmxpbmUgPiBjbS5kb2MuZmlyc3QpIHtcbiAgICAgICAgICAgIHZhciBwcmV2ID0gZ2V0TGluZShjbS5kb2MsIGN1ci5saW5lIC0gMSkudGV4dDtcbiAgICAgICAgICAgIGlmIChwcmV2KSB7XG4gICAgICAgICAgICAgIGN1ciA9IG5ldyBQb3MoY3VyLmxpbmUsIDEpO1xuICAgICAgICAgICAgICBjbS5yZXBsYWNlUmFuZ2UobGluZS5jaGFyQXQoMCkgKyBjbS5kb2MubGluZVNlcGFyYXRvcigpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYuY2hhckF0KHByZXYubGVuZ3RoIC0gMSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3MoY3VyLmxpbmUgLSAxLCBwcmV2Lmxlbmd0aCAtIDEpLCBjdXIsIFwiK3RyYW5zcG9zZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbmV3U2VsLnB1c2gobmV3IFJhbmdlKGN1ciwgY3VyKSk7XG4gICAgICB9XG4gICAgICBjbS5zZXRTZWxlY3Rpb25zKG5ld1NlbCk7XG4gICAgfSk7IH0sXG4gICAgbmV3bGluZUFuZEluZGVudDogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBydW5Jbk9wKGNtLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgc2VscyA9IGNtLmxpc3RTZWxlY3Rpb25zKCk7XG4gICAgICBmb3IgKHZhciBpID0gc2Vscy5sZW5ndGggLSAxOyBpID49IDA7IGktLSlcbiAgICAgICAgeyBjbS5yZXBsYWNlUmFuZ2UoY20uZG9jLmxpbmVTZXBhcmF0b3IoKSwgc2Vsc1tpXS5hbmNob3IsIHNlbHNbaV0uaGVhZCwgXCIraW5wdXRcIik7IH1cbiAgICAgIHNlbHMgPSBjbS5saXN0U2VsZWN0aW9ucygpO1xuICAgICAgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgc2Vscy5sZW5ndGg7IGkkMSsrKVxuICAgICAgICB7IGNtLmluZGVudExpbmUoc2Vsc1tpJDFdLmZyb20oKS5saW5lLCBudWxsLCB0cnVlKTsgfVxuICAgICAgZW5zdXJlQ3Vyc29yVmlzaWJsZShjbSk7XG4gICAgfSk7IH0sXG4gICAgb3BlbkxpbmU6IGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gY20ucmVwbGFjZVNlbGVjdGlvbihcIlxcblwiLCBcInN0YXJ0XCIpOyB9LFxuICAgIHRvZ2dsZU92ZXJ3cml0ZTogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS50b2dnbGVPdmVyd3JpdGUoKTsgfVxuICB9O1xuXG5cbiAgZnVuY3Rpb24gbGluZVN0YXJ0KGNtLCBsaW5lTikge1xuICAgIHZhciBsaW5lID0gZ2V0TGluZShjbS5kb2MsIGxpbmVOKTtcbiAgICB2YXIgdmlzdWFsID0gdmlzdWFsTGluZShsaW5lKTtcbiAgICBpZiAodmlzdWFsICE9IGxpbmUpIHsgbGluZU4gPSBsaW5lTm8odmlzdWFsKTsgfVxuICAgIHJldHVybiBlbmRPZkxpbmUodHJ1ZSwgY20sIHZpc3VhbCwgbGluZU4sIDEpXG4gIH1cbiAgZnVuY3Rpb24gbGluZUVuZChjbSwgbGluZU4pIHtcbiAgICB2YXIgbGluZSA9IGdldExpbmUoY20uZG9jLCBsaW5lTik7XG4gICAgdmFyIHZpc3VhbCA9IHZpc3VhbExpbmVFbmQobGluZSk7XG4gICAgaWYgKHZpc3VhbCAhPSBsaW5lKSB7IGxpbmVOID0gbGluZU5vKHZpc3VhbCk7IH1cbiAgICByZXR1cm4gZW5kT2ZMaW5lKHRydWUsIGNtLCBsaW5lLCBsaW5lTiwgLTEpXG4gIH1cbiAgZnVuY3Rpb24gbGluZVN0YXJ0U21hcnQoY20sIHBvcykge1xuICAgIHZhciBzdGFydCA9IGxpbmVTdGFydChjbSwgcG9zLmxpbmUpO1xuICAgIHZhciBsaW5lID0gZ2V0TGluZShjbS5kb2MsIHN0YXJ0LmxpbmUpO1xuICAgIHZhciBvcmRlciA9IGdldE9yZGVyKGxpbmUsIGNtLmRvYy5kaXJlY3Rpb24pO1xuICAgIGlmICghb3JkZXIgfHwgb3JkZXJbMF0ubGV2ZWwgPT0gMCkge1xuICAgICAgdmFyIGZpcnN0Tm9uV1MgPSBNYXRoLm1heChzdGFydC5jaCwgbGluZS50ZXh0LnNlYXJjaCgvXFxTLykpO1xuICAgICAgdmFyIGluV1MgPSBwb3MubGluZSA9PSBzdGFydC5saW5lICYmIHBvcy5jaCA8PSBmaXJzdE5vbldTICYmIHBvcy5jaDtcbiAgICAgIHJldHVybiBQb3Moc3RhcnQubGluZSwgaW5XUyA/IDAgOiBmaXJzdE5vbldTLCBzdGFydC5zdGlja3kpXG4gICAgfVxuICAgIHJldHVybiBzdGFydFxuICB9XG5cbiAgLy8gUnVuIGEgaGFuZGxlciB0aGF0IHdhcyBib3VuZCB0byBhIGtleS5cbiAgZnVuY3Rpb24gZG9IYW5kbGVCaW5kaW5nKGNtLCBib3VuZCwgZHJvcFNoaWZ0KSB7XG4gICAgaWYgKHR5cGVvZiBib3VuZCA9PSBcInN0cmluZ1wiKSB7XG4gICAgICBib3VuZCA9IGNvbW1hbmRzW2JvdW5kXTtcbiAgICAgIGlmICghYm91bmQpIHsgcmV0dXJuIGZhbHNlIH1cbiAgICB9XG4gICAgLy8gRW5zdXJlIHByZXZpb3VzIGlucHV0IGhhcyBiZWVuIHJlYWQsIHNvIHRoYXQgdGhlIGhhbmRsZXIgc2VlcyBhXG4gICAgLy8gY29uc2lzdGVudCB2aWV3IG9mIHRoZSBkb2N1bWVudFxuICAgIGNtLmRpc3BsYXkuaW5wdXQuZW5zdXJlUG9sbGVkKCk7XG4gICAgdmFyIHByZXZTaGlmdCA9IGNtLmRpc3BsYXkuc2hpZnQsIGRvbmUgPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgaWYgKGNtLmlzUmVhZE9ubHkoKSkgeyBjbS5zdGF0ZS5zdXBwcmVzc0VkaXRzID0gdHJ1ZTsgfVxuICAgICAgaWYgKGRyb3BTaGlmdCkgeyBjbS5kaXNwbGF5LnNoaWZ0ID0gZmFsc2U7IH1cbiAgICAgIGRvbmUgPSBib3VuZChjbSkgIT0gUGFzcztcbiAgICB9IGZpbmFsbHkge1xuICAgICAgY20uZGlzcGxheS5zaGlmdCA9IHByZXZTaGlmdDtcbiAgICAgIGNtLnN0YXRlLnN1cHByZXNzRWRpdHMgPSBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGRvbmVcbiAgfVxuXG4gIGZ1bmN0aW9uIGxvb2t1cEtleUZvckVkaXRvcihjbSwgbmFtZSwgaGFuZGxlKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbS5zdGF0ZS5rZXlNYXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gbG9va3VwS2V5KG5hbWUsIGNtLnN0YXRlLmtleU1hcHNbaV0sIGhhbmRsZSwgY20pO1xuICAgICAgaWYgKHJlc3VsdCkgeyByZXR1cm4gcmVzdWx0IH1cbiAgICB9XG4gICAgcmV0dXJuIChjbS5vcHRpb25zLmV4dHJhS2V5cyAmJiBsb29rdXBLZXkobmFtZSwgY20ub3B0aW9ucy5leHRyYUtleXMsIGhhbmRsZSwgY20pKVxuICAgICAgfHwgbG9va3VwS2V5KG5hbWUsIGNtLm9wdGlvbnMua2V5TWFwLCBoYW5kbGUsIGNtKVxuICB9XG5cbiAgLy8gTm90ZSB0aGF0LCBkZXNwaXRlIHRoZSBuYW1lLCB0aGlzIGZ1bmN0aW9uIGlzIGFsc28gdXNlZCB0byBjaGVja1xuICAvLyBmb3IgYm91bmQgbW91c2UgY2xpY2tzLlxuXG4gIHZhciBzdG9wU2VxID0gbmV3IERlbGF5ZWQ7XG5cbiAgZnVuY3Rpb24gZGlzcGF0Y2hLZXkoY20sIG5hbWUsIGUsIGhhbmRsZSkge1xuICAgIHZhciBzZXEgPSBjbS5zdGF0ZS5rZXlTZXE7XG4gICAgaWYgKHNlcSkge1xuICAgICAgaWYgKGlzTW9kaWZpZXJLZXkobmFtZSkpIHsgcmV0dXJuIFwiaGFuZGxlZFwiIH1cbiAgICAgIGlmICgvXFwnJC8udGVzdChuYW1lKSlcbiAgICAgICAgeyBjbS5zdGF0ZS5rZXlTZXEgPSBudWxsOyB9XG4gICAgICBlbHNlXG4gICAgICAgIHsgc3RvcFNlcS5zZXQoNTAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoY20uc3RhdGUua2V5U2VxID09IHNlcSkge1xuICAgICAgICAgICAgY20uc3RhdGUua2V5U2VxID0gbnVsbDtcbiAgICAgICAgICAgIGNtLmRpc3BsYXkuaW5wdXQucmVzZXQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pOyB9XG4gICAgICBpZiAoZGlzcGF0Y2hLZXlJbm5lcihjbSwgc2VxICsgXCIgXCIgKyBuYW1lLCBlLCBoYW5kbGUpKSB7IHJldHVybiB0cnVlIH1cbiAgICB9XG4gICAgcmV0dXJuIGRpc3BhdGNoS2V5SW5uZXIoY20sIG5hbWUsIGUsIGhhbmRsZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGRpc3BhdGNoS2V5SW5uZXIoY20sIG5hbWUsIGUsIGhhbmRsZSkge1xuICAgIHZhciByZXN1bHQgPSBsb29rdXBLZXlGb3JFZGl0b3IoY20sIG5hbWUsIGhhbmRsZSk7XG5cbiAgICBpZiAocmVzdWx0ID09IFwibXVsdGlcIilcbiAgICAgIHsgY20uc3RhdGUua2V5U2VxID0gbmFtZTsgfVxuICAgIGlmIChyZXN1bHQgPT0gXCJoYW5kbGVkXCIpXG4gICAgICB7IHNpZ25hbExhdGVyKGNtLCBcImtleUhhbmRsZWRcIiwgY20sIG5hbWUsIGUpOyB9XG5cbiAgICBpZiAocmVzdWx0ID09IFwiaGFuZGxlZFwiIHx8IHJlc3VsdCA9PSBcIm11bHRpXCIpIHtcbiAgICAgIGVfcHJldmVudERlZmF1bHQoZSk7XG4gICAgICByZXN0YXJ0QmxpbmsoY20pO1xuICAgIH1cblxuICAgIHJldHVybiAhIXJlc3VsdFxuICB9XG5cbiAgLy8gSGFuZGxlIGEga2V5IGZyb20gdGhlIGtleWRvd24gZXZlbnQuXG4gIGZ1bmN0aW9uIGhhbmRsZUtleUJpbmRpbmcoY20sIGUpIHtcbiAgICB2YXIgbmFtZSA9IGtleU5hbWUoZSwgdHJ1ZSk7XG4gICAgaWYgKCFuYW1lKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgICBpZiAoZS5zaGlmdEtleSAmJiAhY20uc3RhdGUua2V5U2VxKSB7XG4gICAgICAvLyBGaXJzdCB0cnkgdG8gcmVzb2x2ZSBmdWxsIG5hbWUgKGluY2x1ZGluZyAnU2hpZnQtJykuIEZhaWxpbmdcbiAgICAgIC8vIHRoYXQsIHNlZSBpZiB0aGVyZSBpcyBhIGN1cnNvci1tb3Rpb24gY29tbWFuZCAoc3RhcnRpbmcgd2l0aFxuICAgICAgLy8gJ2dvJykgYm91bmQgdG8gdGhlIGtleW5hbWUgd2l0aG91dCAnU2hpZnQtJy5cbiAgICAgIHJldHVybiBkaXNwYXRjaEtleShjbSwgXCJTaGlmdC1cIiArIG5hbWUsIGUsIGZ1bmN0aW9uIChiKSB7IHJldHVybiBkb0hhbmRsZUJpbmRpbmcoY20sIGIsIHRydWUpOyB9KVxuICAgICAgICAgIHx8IGRpc3BhdGNoS2V5KGNtLCBuYW1lLCBlLCBmdW5jdGlvbiAoYikge1xuICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBiID09IFwic3RyaW5nXCIgPyAvXmdvW0EtWl0vLnRlc3QoYikgOiBiLm1vdGlvbilcbiAgICAgICAgICAgICAgICAgeyByZXR1cm4gZG9IYW5kbGVCaW5kaW5nKGNtLCBiKSB9XG4gICAgICAgICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGRpc3BhdGNoS2V5KGNtLCBuYW1lLCBlLCBmdW5jdGlvbiAoYikgeyByZXR1cm4gZG9IYW5kbGVCaW5kaW5nKGNtLCBiKTsgfSlcbiAgICB9XG4gIH1cblxuICAvLyBIYW5kbGUgYSBrZXkgZnJvbSB0aGUga2V5cHJlc3MgZXZlbnRcbiAgZnVuY3Rpb24gaGFuZGxlQ2hhckJpbmRpbmcoY20sIGUsIGNoKSB7XG4gICAgcmV0dXJuIGRpc3BhdGNoS2V5KGNtLCBcIidcIiArIGNoICsgXCInXCIsIGUsIGZ1bmN0aW9uIChiKSB7IHJldHVybiBkb0hhbmRsZUJpbmRpbmcoY20sIGIsIHRydWUpOyB9KVxuICB9XG5cbiAgdmFyIGxhc3RTdG9wcGVkS2V5ID0gbnVsbDtcbiAgZnVuY3Rpb24gb25LZXlEb3duKGUpIHtcbiAgICB2YXIgY20gPSB0aGlzO1xuICAgIGlmIChlLnRhcmdldCAmJiBlLnRhcmdldCAhPSBjbS5kaXNwbGF5LmlucHV0LmdldEZpZWxkKCkpIHsgcmV0dXJuIH1cbiAgICBjbS5jdXJPcC5mb2N1cyA9IGFjdGl2ZUVsdCgpO1xuICAgIGlmIChzaWduYWxET01FdmVudChjbSwgZSkpIHsgcmV0dXJuIH1cbiAgICAvLyBJRSBkb2VzIHN0cmFuZ2UgdGhpbmdzIHdpdGggZXNjYXBlLlxuICAgIGlmIChpZSAmJiBpZV92ZXJzaW9uIDwgMTEgJiYgZS5rZXlDb2RlID09IDI3KSB7IGUucmV0dXJuVmFsdWUgPSBmYWxzZTsgfVxuICAgIHZhciBjb2RlID0gZS5rZXlDb2RlO1xuICAgIGNtLmRpc3BsYXkuc2hpZnQgPSBjb2RlID09IDE2IHx8IGUuc2hpZnRLZXk7XG4gICAgdmFyIGhhbmRsZWQgPSBoYW5kbGVLZXlCaW5kaW5nKGNtLCBlKTtcbiAgICBpZiAocHJlc3RvKSB7XG4gICAgICBsYXN0U3RvcHBlZEtleSA9IGhhbmRsZWQgPyBjb2RlIDogbnVsbDtcbiAgICAgIC8vIE9wZXJhIGhhcyBubyBjdXQgZXZlbnQuLi4gd2UgdHJ5IHRvIGF0IGxlYXN0IGNhdGNoIHRoZSBrZXkgY29tYm9cbiAgICAgIGlmICghaGFuZGxlZCAmJiBjb2RlID09IDg4ICYmICFoYXNDb3B5RXZlbnQgJiYgKG1hYyA/IGUubWV0YUtleSA6IGUuY3RybEtleSkpXG4gICAgICAgIHsgY20ucmVwbGFjZVNlbGVjdGlvbihcIlwiLCBudWxsLCBcImN1dFwiKTsgfVxuICAgIH1cbiAgICBpZiAoZ2Vja28gJiYgIW1hYyAmJiAhaGFuZGxlZCAmJiBjb2RlID09IDQ2ICYmIGUuc2hpZnRLZXkgJiYgIWUuY3RybEtleSAmJiBkb2N1bWVudC5leGVjQ29tbWFuZClcbiAgICAgIHsgZG9jdW1lbnQuZXhlY0NvbW1hbmQoXCJjdXRcIik7IH1cblxuICAgIC8vIFR1cm4gbW91c2UgaW50byBjcm9zc2hhaXIgd2hlbiBBbHQgaXMgaGVsZCBvbiBNYWMuXG4gICAgaWYgKGNvZGUgPT0gMTggJiYgIS9cXGJDb2RlTWlycm9yLWNyb3NzaGFpclxcYi8udGVzdChjbS5kaXNwbGF5LmxpbmVEaXYuY2xhc3NOYW1lKSlcbiAgICAgIHsgc2hvd0Nyb3NzSGFpcihjbSk7IH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3dDcm9zc0hhaXIoY20pIHtcbiAgICB2YXIgbGluZURpdiA9IGNtLmRpc3BsYXkubGluZURpdjtcbiAgICBhZGRDbGFzcyhsaW5lRGl2LCBcIkNvZGVNaXJyb3ItY3Jvc3NoYWlyXCIpO1xuXG4gICAgZnVuY3Rpb24gdXAoZSkge1xuICAgICAgaWYgKGUua2V5Q29kZSA9PSAxOCB8fCAhZS5hbHRLZXkpIHtcbiAgICAgICAgcm1DbGFzcyhsaW5lRGl2LCBcIkNvZGVNaXJyb3ItY3Jvc3NoYWlyXCIpO1xuICAgICAgICBvZmYoZG9jdW1lbnQsIFwia2V5dXBcIiwgdXApO1xuICAgICAgICBvZmYoZG9jdW1lbnQsIFwibW91c2VvdmVyXCIsIHVwKTtcbiAgICAgIH1cbiAgICB9XG4gICAgb24oZG9jdW1lbnQsIFwia2V5dXBcIiwgdXApO1xuICAgIG9uKGRvY3VtZW50LCBcIm1vdXNlb3ZlclwiLCB1cCk7XG4gIH1cblxuICBmdW5jdGlvbiBvbktleVVwKGUpIHtcbiAgICBpZiAoZS5rZXlDb2RlID09IDE2KSB7IHRoaXMuZG9jLnNlbC5zaGlmdCA9IGZhbHNlOyB9XG4gICAgc2lnbmFsRE9NRXZlbnQodGhpcywgZSk7XG4gIH1cblxuICBmdW5jdGlvbiBvbktleVByZXNzKGUpIHtcbiAgICB2YXIgY20gPSB0aGlzO1xuICAgIGlmIChlLnRhcmdldCAmJiBlLnRhcmdldCAhPSBjbS5kaXNwbGF5LmlucHV0LmdldEZpZWxkKCkpIHsgcmV0dXJuIH1cbiAgICBpZiAoZXZlbnRJbldpZGdldChjbS5kaXNwbGF5LCBlKSB8fCBzaWduYWxET01FdmVudChjbSwgZSkgfHwgZS5jdHJsS2V5ICYmICFlLmFsdEtleSB8fCBtYWMgJiYgZS5tZXRhS2V5KSB7IHJldHVybiB9XG4gICAgdmFyIGtleUNvZGUgPSBlLmtleUNvZGUsIGNoYXJDb2RlID0gZS5jaGFyQ29kZTtcbiAgICBpZiAocHJlc3RvICYmIGtleUNvZGUgPT0gbGFzdFN0b3BwZWRLZXkpIHtsYXN0U3RvcHBlZEtleSA9IG51bGw7IGVfcHJldmVudERlZmF1bHQoZSk7IHJldHVybn1cbiAgICBpZiAoKHByZXN0byAmJiAoIWUud2hpY2ggfHwgZS53aGljaCA8IDEwKSkgJiYgaGFuZGxlS2V5QmluZGluZyhjbSwgZSkpIHsgcmV0dXJuIH1cbiAgICB2YXIgY2ggPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXJDb2RlID09IG51bGwgPyBrZXlDb2RlIDogY2hhckNvZGUpO1xuICAgIC8vIFNvbWUgYnJvd3NlcnMgZmlyZSBrZXlwcmVzcyBldmVudHMgZm9yIGJhY2tzcGFjZVxuICAgIGlmIChjaCA9PSBcIlxceDA4XCIpIHsgcmV0dXJuIH1cbiAgICBpZiAoaGFuZGxlQ2hhckJpbmRpbmcoY20sIGUsIGNoKSkgeyByZXR1cm4gfVxuICAgIGNtLmRpc3BsYXkuaW5wdXQub25LZXlQcmVzcyhlKTtcbiAgfVxuXG4gIHZhciBET1VCTEVDTElDS19ERUxBWSA9IDQwMDtcblxuICB2YXIgUGFzdENsaWNrID0gZnVuY3Rpb24odGltZSwgcG9zLCBidXR0b24pIHtcbiAgICB0aGlzLnRpbWUgPSB0aW1lO1xuICAgIHRoaXMucG9zID0gcG9zO1xuICAgIHRoaXMuYnV0dG9uID0gYnV0dG9uO1xuICB9O1xuXG4gIFBhc3RDbGljay5wcm90b3R5cGUuY29tcGFyZSA9IGZ1bmN0aW9uICh0aW1lLCBwb3MsIGJ1dHRvbikge1xuICAgIHJldHVybiB0aGlzLnRpbWUgKyBET1VCTEVDTElDS19ERUxBWSA+IHRpbWUgJiZcbiAgICAgIGNtcChwb3MsIHRoaXMucG9zKSA9PSAwICYmIGJ1dHRvbiA9PSB0aGlzLmJ1dHRvblxuICB9O1xuXG4gIHZhciBsYXN0Q2xpY2ssIGxhc3REb3VibGVDbGljaztcbiAgZnVuY3Rpb24gY2xpY2tSZXBlYXQocG9zLCBidXR0b24pIHtcbiAgICB2YXIgbm93ID0gK25ldyBEYXRlO1xuICAgIGlmIChsYXN0RG91YmxlQ2xpY2sgJiYgbGFzdERvdWJsZUNsaWNrLmNvbXBhcmUobm93LCBwb3MsIGJ1dHRvbikpIHtcbiAgICAgIGxhc3RDbGljayA9IGxhc3REb3VibGVDbGljayA9IG51bGw7XG4gICAgICByZXR1cm4gXCJ0cmlwbGVcIlxuICAgIH0gZWxzZSBpZiAobGFzdENsaWNrICYmIGxhc3RDbGljay5jb21wYXJlKG5vdywgcG9zLCBidXR0b24pKSB7XG4gICAgICBsYXN0RG91YmxlQ2xpY2sgPSBuZXcgUGFzdENsaWNrKG5vdywgcG9zLCBidXR0b24pO1xuICAgICAgbGFzdENsaWNrID0gbnVsbDtcbiAgICAgIHJldHVybiBcImRvdWJsZVwiXG4gICAgfSBlbHNlIHtcbiAgICAgIGxhc3RDbGljayA9IG5ldyBQYXN0Q2xpY2sobm93LCBwb3MsIGJ1dHRvbik7XG4gICAgICBsYXN0RG91YmxlQ2xpY2sgPSBudWxsO1xuICAgICAgcmV0dXJuIFwic2luZ2xlXCJcbiAgICB9XG4gIH1cblxuICAvLyBBIG1vdXNlIGRvd24gY2FuIGJlIGEgc2luZ2xlIGNsaWNrLCBkb3VibGUgY2xpY2ssIHRyaXBsZSBjbGljayxcbiAgLy8gc3RhcnQgb2Ygc2VsZWN0aW9uIGRyYWcsIHN0YXJ0IG9mIHRleHQgZHJhZywgbmV3IGN1cnNvclxuICAvLyAoY3RybC1jbGljayksIHJlY3RhbmdsZSBkcmFnIChhbHQtZHJhZyksIG9yIHh3aW5cbiAgLy8gbWlkZGxlLWNsaWNrLXBhc3RlLiBPciBpdCBtaWdodCBiZSBhIGNsaWNrIG9uIHNvbWV0aGluZyB3ZSBzaG91bGRcbiAgLy8gbm90IGludGVyZmVyZSB3aXRoLCBzdWNoIGFzIGEgc2Nyb2xsYmFyIG9yIHdpZGdldC5cbiAgZnVuY3Rpb24gb25Nb3VzZURvd24oZSkge1xuICAgIHZhciBjbSA9IHRoaXMsIGRpc3BsYXkgPSBjbS5kaXNwbGF5O1xuICAgIGlmIChzaWduYWxET01FdmVudChjbSwgZSkgfHwgZGlzcGxheS5hY3RpdmVUb3VjaCAmJiBkaXNwbGF5LmlucHV0LnN1cHBvcnRzVG91Y2goKSkgeyByZXR1cm4gfVxuICAgIGRpc3BsYXkuaW5wdXQuZW5zdXJlUG9sbGVkKCk7XG4gICAgZGlzcGxheS5zaGlmdCA9IGUuc2hpZnRLZXk7XG5cbiAgICBpZiAoZXZlbnRJbldpZGdldChkaXNwbGF5LCBlKSkge1xuICAgICAgaWYgKCF3ZWJraXQpIHtcbiAgICAgICAgLy8gQnJpZWZseSB0dXJuIG9mZiBkcmFnZ2FiaWxpdHksIHRvIGFsbG93IHdpZGdldHMgdG8gZG9cbiAgICAgICAgLy8gbm9ybWFsIGRyYWdnaW5nIHRoaW5ncy5cbiAgICAgICAgZGlzcGxheS5zY3JvbGxlci5kcmFnZ2FibGUgPSBmYWxzZTtcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHJldHVybiBkaXNwbGF5LnNjcm9sbGVyLmRyYWdnYWJsZSA9IHRydWU7IH0sIDEwMCk7XG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKGNsaWNrSW5HdXR0ZXIoY20sIGUpKSB7IHJldHVybiB9XG4gICAgdmFyIHBvcyA9IHBvc0Zyb21Nb3VzZShjbSwgZSksIGJ1dHRvbiA9IGVfYnV0dG9uKGUpLCByZXBlYXQgPSBwb3MgPyBjbGlja1JlcGVhdChwb3MsIGJ1dHRvbikgOiBcInNpbmdsZVwiO1xuICAgIHdpbmRvdy5mb2N1cygpO1xuXG4gICAgLy8gIzMyNjE6IG1ha2Ugc3VyZSwgdGhhdCB3ZSdyZSBub3Qgc3RhcnRpbmcgYSBzZWNvbmQgc2VsZWN0aW9uXG4gICAgaWYgKGJ1dHRvbiA9PSAxICYmIGNtLnN0YXRlLnNlbGVjdGluZ1RleHQpXG4gICAgICB7IGNtLnN0YXRlLnNlbGVjdGluZ1RleHQoZSk7IH1cblxuICAgIGlmIChwb3MgJiYgaGFuZGxlTWFwcGVkQnV0dG9uKGNtLCBidXR0b24sIHBvcywgcmVwZWF0LCBlKSkgeyByZXR1cm4gfVxuXG4gICAgaWYgKGJ1dHRvbiA9PSAxKSB7XG4gICAgICBpZiAocG9zKSB7IGxlZnRCdXR0b25Eb3duKGNtLCBwb3MsIHJlcGVhdCwgZSk7IH1cbiAgICAgIGVsc2UgaWYgKGVfdGFyZ2V0KGUpID09IGRpc3BsYXkuc2Nyb2xsZXIpIHsgZV9wcmV2ZW50RGVmYXVsdChlKTsgfVxuICAgIH0gZWxzZSBpZiAoYnV0dG9uID09IDIpIHtcbiAgICAgIGlmIChwb3MpIHsgZXh0ZW5kU2VsZWN0aW9uKGNtLmRvYywgcG9zKTsgfVxuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHJldHVybiBkaXNwbGF5LmlucHV0LmZvY3VzKCk7IH0sIDIwKTtcbiAgICB9IGVsc2UgaWYgKGJ1dHRvbiA9PSAzKSB7XG4gICAgICBpZiAoY2FwdHVyZVJpZ2h0Q2xpY2spIHsgY20uZGlzcGxheS5pbnB1dC5vbkNvbnRleHRNZW51KGUpOyB9XG4gICAgICBlbHNlIHsgZGVsYXlCbHVyRXZlbnQoY20pOyB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlTWFwcGVkQnV0dG9uKGNtLCBidXR0b24sIHBvcywgcmVwZWF0LCBldmVudCkge1xuICAgIHZhciBuYW1lID0gXCJDbGlja1wiO1xuICAgIGlmIChyZXBlYXQgPT0gXCJkb3VibGVcIikgeyBuYW1lID0gXCJEb3VibGVcIiArIG5hbWU7IH1cbiAgICBlbHNlIGlmIChyZXBlYXQgPT0gXCJ0cmlwbGVcIikgeyBuYW1lID0gXCJUcmlwbGVcIiArIG5hbWU7IH1cbiAgICBuYW1lID0gKGJ1dHRvbiA9PSAxID8gXCJMZWZ0XCIgOiBidXR0b24gPT0gMiA/IFwiTWlkZGxlXCIgOiBcIlJpZ2h0XCIpICsgbmFtZTtcblxuICAgIHJldHVybiBkaXNwYXRjaEtleShjbSwgIGFkZE1vZGlmaWVyTmFtZXMobmFtZSwgZXZlbnQpLCBldmVudCwgZnVuY3Rpb24gKGJvdW5kKSB7XG4gICAgICBpZiAodHlwZW9mIGJvdW5kID09IFwic3RyaW5nXCIpIHsgYm91bmQgPSBjb21tYW5kc1tib3VuZF07IH1cbiAgICAgIGlmICghYm91bmQpIHsgcmV0dXJuIGZhbHNlIH1cbiAgICAgIHZhciBkb25lID0gZmFsc2U7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoY20uaXNSZWFkT25seSgpKSB7IGNtLnN0YXRlLnN1cHByZXNzRWRpdHMgPSB0cnVlOyB9XG4gICAgICAgIGRvbmUgPSBib3VuZChjbSwgcG9zKSAhPSBQYXNzO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgY20uc3RhdGUuc3VwcHJlc3NFZGl0cyA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRvbmVcbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gY29uZmlndXJlTW91c2UoY20sIHJlcGVhdCwgZXZlbnQpIHtcbiAgICB2YXIgb3B0aW9uID0gY20uZ2V0T3B0aW9uKFwiY29uZmlndXJlTW91c2VcIik7XG4gICAgdmFyIHZhbHVlID0gb3B0aW9uID8gb3B0aW9uKGNtLCByZXBlYXQsIGV2ZW50KSA6IHt9O1xuICAgIGlmICh2YWx1ZS51bml0ID09IG51bGwpIHtcbiAgICAgIHZhciByZWN0ID0gY2hyb21lT1MgPyBldmVudC5zaGlmdEtleSAmJiBldmVudC5tZXRhS2V5IDogZXZlbnQuYWx0S2V5O1xuICAgICAgdmFsdWUudW5pdCA9IHJlY3QgPyBcInJlY3RhbmdsZVwiIDogcmVwZWF0ID09IFwic2luZ2xlXCIgPyBcImNoYXJcIiA6IHJlcGVhdCA9PSBcImRvdWJsZVwiID8gXCJ3b3JkXCIgOiBcImxpbmVcIjtcbiAgICB9XG4gICAgaWYgKHZhbHVlLmV4dGVuZCA9PSBudWxsIHx8IGNtLmRvYy5leHRlbmQpIHsgdmFsdWUuZXh0ZW5kID0gY20uZG9jLmV4dGVuZCB8fCBldmVudC5zaGlmdEtleTsgfVxuICAgIGlmICh2YWx1ZS5hZGROZXcgPT0gbnVsbCkgeyB2YWx1ZS5hZGROZXcgPSBtYWMgPyBldmVudC5tZXRhS2V5IDogZXZlbnQuY3RybEtleTsgfVxuICAgIGlmICh2YWx1ZS5tb3ZlT25EcmFnID09IG51bGwpIHsgdmFsdWUubW92ZU9uRHJhZyA9ICEobWFjID8gZXZlbnQuYWx0S2V5IDogZXZlbnQuY3RybEtleSk7IH1cbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIGZ1bmN0aW9uIGxlZnRCdXR0b25Eb3duKGNtLCBwb3MsIHJlcGVhdCwgZXZlbnQpIHtcbiAgICBpZiAoaWUpIHsgc2V0VGltZW91dChiaW5kKGVuc3VyZUZvY3VzLCBjbSksIDApOyB9XG4gICAgZWxzZSB7IGNtLmN1ck9wLmZvY3VzID0gYWN0aXZlRWx0KCk7IH1cblxuICAgIHZhciBiZWhhdmlvciA9IGNvbmZpZ3VyZU1vdXNlKGNtLCByZXBlYXQsIGV2ZW50KTtcblxuICAgIHZhciBzZWwgPSBjbS5kb2Muc2VsLCBjb250YWluZWQ7XG4gICAgaWYgKGNtLm9wdGlvbnMuZHJhZ0Ryb3AgJiYgZHJhZ0FuZERyb3AgJiYgIWNtLmlzUmVhZE9ubHkoKSAmJlxuICAgICAgICByZXBlYXQgPT0gXCJzaW5nbGVcIiAmJiAoY29udGFpbmVkID0gc2VsLmNvbnRhaW5zKHBvcykpID4gLTEgJiZcbiAgICAgICAgKGNtcCgoY29udGFpbmVkID0gc2VsLnJhbmdlc1tjb250YWluZWRdKS5mcm9tKCksIHBvcykgPCAwIHx8IHBvcy54UmVsID4gMCkgJiZcbiAgICAgICAgKGNtcChjb250YWluZWQudG8oKSwgcG9zKSA+IDAgfHwgcG9zLnhSZWwgPCAwKSlcbiAgICAgIHsgbGVmdEJ1dHRvblN0YXJ0RHJhZyhjbSwgZXZlbnQsIHBvcywgYmVoYXZpb3IpOyB9XG4gICAgZWxzZVxuICAgICAgeyBsZWZ0QnV0dG9uU2VsZWN0KGNtLCBldmVudCwgcG9zLCBiZWhhdmlvcik7IH1cbiAgfVxuXG4gIC8vIFN0YXJ0IGEgdGV4dCBkcmFnLiBXaGVuIGl0IGVuZHMsIHNlZSBpZiBhbnkgZHJhZ2dpbmcgYWN0dWFsbHlcbiAgLy8gaGFwcGVuLCBhbmQgdHJlYXQgYXMgYSBjbGljayBpZiBpdCBkaWRuJ3QuXG4gIGZ1bmN0aW9uIGxlZnRCdXR0b25TdGFydERyYWcoY20sIGV2ZW50LCBwb3MsIGJlaGF2aW9yKSB7XG4gICAgdmFyIGRpc3BsYXkgPSBjbS5kaXNwbGF5LCBtb3ZlZCA9IGZhbHNlO1xuICAgIHZhciBkcmFnRW5kID0gb3BlcmF0aW9uKGNtLCBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKHdlYmtpdCkgeyBkaXNwbGF5LnNjcm9sbGVyLmRyYWdnYWJsZSA9IGZhbHNlOyB9XG4gICAgICBjbS5zdGF0ZS5kcmFnZ2luZ1RleHQgPSBmYWxzZTtcbiAgICAgIGlmIChjbS5zdGF0ZS5kZWxheWluZ0JsdXJFdmVudCkge1xuICAgICAgICBpZiAoY20uaGFzRm9jdXMoKSkgeyBjbS5zdGF0ZS5kZWxheWluZ0JsdXJFdmVudCA9IGZhbHNlOyB9XG4gICAgICAgIGVsc2UgeyBkZWxheUJsdXJFdmVudChjbSk7IH1cbiAgICAgIH1cbiAgICAgIG9mZihkaXNwbGF5LndyYXBwZXIub3duZXJEb2N1bWVudCwgXCJtb3VzZXVwXCIsIGRyYWdFbmQpO1xuICAgICAgb2ZmKGRpc3BsYXkud3JhcHBlci5vd25lckRvY3VtZW50LCBcIm1vdXNlbW92ZVwiLCBtb3VzZU1vdmUpO1xuICAgICAgb2ZmKGRpc3BsYXkuc2Nyb2xsZXIsIFwiZHJhZ3N0YXJ0XCIsIGRyYWdTdGFydCk7XG4gICAgICBvZmYoZGlzcGxheS5zY3JvbGxlciwgXCJkcm9wXCIsIGRyYWdFbmQpO1xuICAgICAgaWYgKCFtb3ZlZCkge1xuICAgICAgICBlX3ByZXZlbnREZWZhdWx0KGUpO1xuICAgICAgICBpZiAoIWJlaGF2aW9yLmFkZE5ldylcbiAgICAgICAgICB7IGV4dGVuZFNlbGVjdGlvbihjbS5kb2MsIHBvcywgbnVsbCwgbnVsbCwgYmVoYXZpb3IuZXh0ZW5kKTsgfVxuICAgICAgICAvLyBXb3JrIGFyb3VuZCB1bmV4cGxhaW5hYmxlIGZvY3VzIHByb2JsZW0gaW4gSUU5ICgjMjEyNykgYW5kIENocm9tZSAoIzMwODEpXG4gICAgICAgIGlmICgod2Via2l0ICYmICFzYWZhcmkpIHx8IGllICYmIGllX3ZlcnNpb24gPT0gOSlcbiAgICAgICAgICB7IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge2Rpc3BsYXkud3JhcHBlci5vd25lckRvY3VtZW50LmJvZHkuZm9jdXMoe3ByZXZlbnRTY3JvbGw6IHRydWV9KTsgZGlzcGxheS5pbnB1dC5mb2N1cygpO30sIDIwKTsgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgeyBkaXNwbGF5LmlucHV0LmZvY3VzKCk7IH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICB2YXIgbW91c2VNb3ZlID0gZnVuY3Rpb24oZTIpIHtcbiAgICAgIG1vdmVkID0gbW92ZWQgfHwgTWF0aC5hYnMoZXZlbnQuY2xpZW50WCAtIGUyLmNsaWVudFgpICsgTWF0aC5hYnMoZXZlbnQuY2xpZW50WSAtIGUyLmNsaWVudFkpID49IDEwO1xuICAgIH07XG4gICAgdmFyIGRyYWdTdGFydCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1vdmVkID0gdHJ1ZTsgfTtcbiAgICAvLyBMZXQgdGhlIGRyYWcgaGFuZGxlciBoYW5kbGUgdGhpcy5cbiAgICBpZiAod2Via2l0KSB7IGRpc3BsYXkuc2Nyb2xsZXIuZHJhZ2dhYmxlID0gdHJ1ZTsgfVxuICAgIGNtLnN0YXRlLmRyYWdnaW5nVGV4dCA9IGRyYWdFbmQ7XG4gICAgZHJhZ0VuZC5jb3B5ID0gIWJlaGF2aW9yLm1vdmVPbkRyYWc7XG4gICAgb24oZGlzcGxheS53cmFwcGVyLm93bmVyRG9jdW1lbnQsIFwibW91c2V1cFwiLCBkcmFnRW5kKTtcbiAgICBvbihkaXNwbGF5LndyYXBwZXIub3duZXJEb2N1bWVudCwgXCJtb3VzZW1vdmVcIiwgbW91c2VNb3ZlKTtcbiAgICBvbihkaXNwbGF5LnNjcm9sbGVyLCBcImRyYWdzdGFydFwiLCBkcmFnU3RhcnQpO1xuICAgIG9uKGRpc3BsYXkuc2Nyb2xsZXIsIFwiZHJvcFwiLCBkcmFnRW5kKTtcblxuICAgIGNtLnN0YXRlLmRlbGF5aW5nQmx1ckV2ZW50ID0gdHJ1ZTtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgcmV0dXJuIGRpc3BsYXkuaW5wdXQuZm9jdXMoKTsgfSwgMjApO1xuICAgIC8vIElFJ3MgYXBwcm9hY2ggdG8gZHJhZ2dhYmxlXG4gICAgaWYgKGRpc3BsYXkuc2Nyb2xsZXIuZHJhZ0Ryb3ApIHsgZGlzcGxheS5zY3JvbGxlci5kcmFnRHJvcCgpOyB9XG4gIH1cblxuICBmdW5jdGlvbiByYW5nZUZvclVuaXQoY20sIHBvcywgdW5pdCkge1xuICAgIGlmICh1bml0ID09IFwiY2hhclwiKSB7IHJldHVybiBuZXcgUmFuZ2UocG9zLCBwb3MpIH1cbiAgICBpZiAodW5pdCA9PSBcIndvcmRcIikgeyByZXR1cm4gY20uZmluZFdvcmRBdChwb3MpIH1cbiAgICBpZiAodW5pdCA9PSBcImxpbmVcIikgeyByZXR1cm4gbmV3IFJhbmdlKFBvcyhwb3MubGluZSwgMCksIGNsaXBQb3MoY20uZG9jLCBQb3MocG9zLmxpbmUgKyAxLCAwKSkpIH1cbiAgICB2YXIgcmVzdWx0ID0gdW5pdChjbSwgcG9zKTtcbiAgICByZXR1cm4gbmV3IFJhbmdlKHJlc3VsdC5mcm9tLCByZXN1bHQudG8pXG4gIH1cblxuICAvLyBOb3JtYWwgc2VsZWN0aW9uLCBhcyBvcHBvc2VkIHRvIHRleHQgZHJhZ2dpbmcuXG4gIGZ1bmN0aW9uIGxlZnRCdXR0b25TZWxlY3QoY20sIGV2ZW50LCBzdGFydCwgYmVoYXZpb3IpIHtcbiAgICBpZiAoaWUpIHsgZGVsYXlCbHVyRXZlbnQoY20pOyB9XG4gICAgdmFyIGRpc3BsYXkgPSBjbS5kaXNwbGF5LCBkb2MgPSBjbS5kb2M7XG4gICAgZV9wcmV2ZW50RGVmYXVsdChldmVudCk7XG5cbiAgICB2YXIgb3VyUmFuZ2UsIG91ckluZGV4LCBzdGFydFNlbCA9IGRvYy5zZWwsIHJhbmdlcyA9IHN0YXJ0U2VsLnJhbmdlcztcbiAgICBpZiAoYmVoYXZpb3IuYWRkTmV3ICYmICFiZWhhdmlvci5leHRlbmQpIHtcbiAgICAgIG91ckluZGV4ID0gZG9jLnNlbC5jb250YWlucyhzdGFydCk7XG4gICAgICBpZiAob3VySW5kZXggPiAtMSlcbiAgICAgICAgeyBvdXJSYW5nZSA9IHJhbmdlc1tvdXJJbmRleF07IH1cbiAgICAgIGVsc2VcbiAgICAgICAgeyBvdXJSYW5nZSA9IG5ldyBSYW5nZShzdGFydCwgc3RhcnQpOyB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG91clJhbmdlID0gZG9jLnNlbC5wcmltYXJ5KCk7XG4gICAgICBvdXJJbmRleCA9IGRvYy5zZWwucHJpbUluZGV4O1xuICAgIH1cblxuICAgIGlmIChiZWhhdmlvci51bml0ID09IFwicmVjdGFuZ2xlXCIpIHtcbiAgICAgIGlmICghYmVoYXZpb3IuYWRkTmV3KSB7IG91clJhbmdlID0gbmV3IFJhbmdlKHN0YXJ0LCBzdGFydCk7IH1cbiAgICAgIHN0YXJ0ID0gcG9zRnJvbU1vdXNlKGNtLCBldmVudCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICBvdXJJbmRleCA9IC0xO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgcmFuZ2UgPSByYW5nZUZvclVuaXQoY20sIHN0YXJ0LCBiZWhhdmlvci51bml0KTtcbiAgICAgIGlmIChiZWhhdmlvci5leHRlbmQpXG4gICAgICAgIHsgb3VyUmFuZ2UgPSBleHRlbmRSYW5nZShvdXJSYW5nZSwgcmFuZ2UuYW5jaG9yLCByYW5nZS5oZWFkLCBiZWhhdmlvci5leHRlbmQpOyB9XG4gICAgICBlbHNlXG4gICAgICAgIHsgb3VyUmFuZ2UgPSByYW5nZTsgfVxuICAgIH1cblxuICAgIGlmICghYmVoYXZpb3IuYWRkTmV3KSB7XG4gICAgICBvdXJJbmRleCA9IDA7XG4gICAgICBzZXRTZWxlY3Rpb24oZG9jLCBuZXcgU2VsZWN0aW9uKFtvdXJSYW5nZV0sIDApLCBzZWxfbW91c2UpO1xuICAgICAgc3RhcnRTZWwgPSBkb2Muc2VsO1xuICAgIH0gZWxzZSBpZiAob3VySW5kZXggPT0gLTEpIHtcbiAgICAgIG91ckluZGV4ID0gcmFuZ2VzLmxlbmd0aDtcbiAgICAgIHNldFNlbGVjdGlvbihkb2MsIG5vcm1hbGl6ZVNlbGVjdGlvbihjbSwgcmFuZ2VzLmNvbmNhdChbb3VyUmFuZ2VdKSwgb3VySW5kZXgpLFxuICAgICAgICAgICAgICAgICAgIHtzY3JvbGw6IGZhbHNlLCBvcmlnaW46IFwiKm1vdXNlXCJ9KTtcbiAgICB9IGVsc2UgaWYgKHJhbmdlcy5sZW5ndGggPiAxICYmIHJhbmdlc1tvdXJJbmRleF0uZW1wdHkoKSAmJiBiZWhhdmlvci51bml0ID09IFwiY2hhclwiICYmICFiZWhhdmlvci5leHRlbmQpIHtcbiAgICAgIHNldFNlbGVjdGlvbihkb2MsIG5vcm1hbGl6ZVNlbGVjdGlvbihjbSwgcmFuZ2VzLnNsaWNlKDAsIG91ckluZGV4KS5jb25jYXQocmFuZ2VzLnNsaWNlKG91ckluZGV4ICsgMSkpLCAwKSxcbiAgICAgICAgICAgICAgICAgICB7c2Nyb2xsOiBmYWxzZSwgb3JpZ2luOiBcIiptb3VzZVwifSk7XG4gICAgICBzdGFydFNlbCA9IGRvYy5zZWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcGxhY2VPbmVTZWxlY3Rpb24oZG9jLCBvdXJJbmRleCwgb3VyUmFuZ2UsIHNlbF9tb3VzZSk7XG4gICAgfVxuXG4gICAgdmFyIGxhc3RQb3MgPSBzdGFydDtcbiAgICBmdW5jdGlvbiBleHRlbmRUbyhwb3MpIHtcbiAgICAgIGlmIChjbXAobGFzdFBvcywgcG9zKSA9PSAwKSB7IHJldHVybiB9XG4gICAgICBsYXN0UG9zID0gcG9zO1xuXG4gICAgICBpZiAoYmVoYXZpb3IudW5pdCA9PSBcInJlY3RhbmdsZVwiKSB7XG4gICAgICAgIHZhciByYW5nZXMgPSBbXSwgdGFiU2l6ZSA9IGNtLm9wdGlvbnMudGFiU2l6ZTtcbiAgICAgICAgdmFyIHN0YXJ0Q29sID0gY291bnRDb2x1bW4oZ2V0TGluZShkb2MsIHN0YXJ0LmxpbmUpLnRleHQsIHN0YXJ0LmNoLCB0YWJTaXplKTtcbiAgICAgICAgdmFyIHBvc0NvbCA9IGNvdW50Q29sdW1uKGdldExpbmUoZG9jLCBwb3MubGluZSkudGV4dCwgcG9zLmNoLCB0YWJTaXplKTtcbiAgICAgICAgdmFyIGxlZnQgPSBNYXRoLm1pbihzdGFydENvbCwgcG9zQ29sKSwgcmlnaHQgPSBNYXRoLm1heChzdGFydENvbCwgcG9zQ29sKTtcbiAgICAgICAgZm9yICh2YXIgbGluZSA9IE1hdGgubWluKHN0YXJ0LmxpbmUsIHBvcy5saW5lKSwgZW5kID0gTWF0aC5taW4oY20ubGFzdExpbmUoKSwgTWF0aC5tYXgoc3RhcnQubGluZSwgcG9zLmxpbmUpKTtcbiAgICAgICAgICAgICBsaW5lIDw9IGVuZDsgbGluZSsrKSB7XG4gICAgICAgICAgdmFyIHRleHQgPSBnZXRMaW5lKGRvYywgbGluZSkudGV4dCwgbGVmdFBvcyA9IGZpbmRDb2x1bW4odGV4dCwgbGVmdCwgdGFiU2l6ZSk7XG4gICAgICAgICAgaWYgKGxlZnQgPT0gcmlnaHQpXG4gICAgICAgICAgICB7IHJhbmdlcy5wdXNoKG5ldyBSYW5nZShQb3MobGluZSwgbGVmdFBvcyksIFBvcyhsaW5lLCBsZWZ0UG9zKSkpOyB9XG4gICAgICAgICAgZWxzZSBpZiAodGV4dC5sZW5ndGggPiBsZWZ0UG9zKVxuICAgICAgICAgICAgeyByYW5nZXMucHVzaChuZXcgUmFuZ2UoUG9zKGxpbmUsIGxlZnRQb3MpLCBQb3MobGluZSwgZmluZENvbHVtbih0ZXh0LCByaWdodCwgdGFiU2l6ZSkpKSk7IH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJhbmdlcy5sZW5ndGgpIHsgcmFuZ2VzLnB1c2gobmV3IFJhbmdlKHN0YXJ0LCBzdGFydCkpOyB9XG4gICAgICAgIHNldFNlbGVjdGlvbihkb2MsIG5vcm1hbGl6ZVNlbGVjdGlvbihjbSwgc3RhcnRTZWwucmFuZ2VzLnNsaWNlKDAsIG91ckluZGV4KS5jb25jYXQocmFuZ2VzKSwgb3VySW5kZXgpLFxuICAgICAgICAgICAgICAgICAgICAge29yaWdpbjogXCIqbW91c2VcIiwgc2Nyb2xsOiBmYWxzZX0pO1xuICAgICAgICBjbS5zY3JvbGxJbnRvVmlldyhwb3MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG9sZFJhbmdlID0gb3VyUmFuZ2U7XG4gICAgICAgIHZhciByYW5nZSA9IHJhbmdlRm9yVW5pdChjbSwgcG9zLCBiZWhhdmlvci51bml0KTtcbiAgICAgICAgdmFyIGFuY2hvciA9IG9sZFJhbmdlLmFuY2hvciwgaGVhZDtcbiAgICAgICAgaWYgKGNtcChyYW5nZS5hbmNob3IsIGFuY2hvcikgPiAwKSB7XG4gICAgICAgICAgaGVhZCA9IHJhbmdlLmhlYWQ7XG4gICAgICAgICAgYW5jaG9yID0gbWluUG9zKG9sZFJhbmdlLmZyb20oKSwgcmFuZ2UuYW5jaG9yKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBoZWFkID0gcmFuZ2UuYW5jaG9yO1xuICAgICAgICAgIGFuY2hvciA9IG1heFBvcyhvbGRSYW5nZS50bygpLCByYW5nZS5oZWFkKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmFuZ2VzJDEgPSBzdGFydFNlbC5yYW5nZXMuc2xpY2UoMCk7XG4gICAgICAgIHJhbmdlcyQxW291ckluZGV4XSA9IGJpZGlTaW1wbGlmeShjbSwgbmV3IFJhbmdlKGNsaXBQb3MoZG9jLCBhbmNob3IpLCBoZWFkKSk7XG4gICAgICAgIHNldFNlbGVjdGlvbihkb2MsIG5vcm1hbGl6ZVNlbGVjdGlvbihjbSwgcmFuZ2VzJDEsIG91ckluZGV4KSwgc2VsX21vdXNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZWRpdG9yU2l6ZSA9IGRpc3BsYXkud3JhcHBlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAvLyBVc2VkIHRvIGVuc3VyZSB0aW1lb3V0IHJlLXRyaWVzIGRvbid0IGZpcmUgd2hlbiBhbm90aGVyIGV4dGVuZFxuICAgIC8vIGhhcHBlbmVkIGluIHRoZSBtZWFudGltZSAoY2xlYXJUaW1lb3V0IGlzbid0IHJlbGlhYmxlIC0tIGF0XG4gICAgLy8gbGVhc3Qgb24gQ2hyb21lLCB0aGUgdGltZW91dHMgc3RpbGwgaGFwcGVuIGV2ZW4gd2hlbiBjbGVhcmVkLFxuICAgIC8vIGlmIHRoZSBjbGVhciBoYXBwZW5zIGFmdGVyIHRoZWlyIHNjaGVkdWxlZCBmaXJpbmcgdGltZSkuXG4gICAgdmFyIGNvdW50ZXIgPSAwO1xuXG4gICAgZnVuY3Rpb24gZXh0ZW5kKGUpIHtcbiAgICAgIHZhciBjdXJDb3VudCA9ICsrY291bnRlcjtcbiAgICAgIHZhciBjdXIgPSBwb3NGcm9tTW91c2UoY20sIGUsIHRydWUsIGJlaGF2aW9yLnVuaXQgPT0gXCJyZWN0YW5nbGVcIik7XG4gICAgICBpZiAoIWN1cikgeyByZXR1cm4gfVxuICAgICAgaWYgKGNtcChjdXIsIGxhc3RQb3MpICE9IDApIHtcbiAgICAgICAgY20uY3VyT3AuZm9jdXMgPSBhY3RpdmVFbHQoKTtcbiAgICAgICAgZXh0ZW5kVG8oY3VyKTtcbiAgICAgICAgdmFyIHZpc2libGUgPSB2aXNpYmxlTGluZXMoZGlzcGxheSwgZG9jKTtcbiAgICAgICAgaWYgKGN1ci5saW5lID49IHZpc2libGUudG8gfHwgY3VyLmxpbmUgPCB2aXNpYmxlLmZyb20pXG4gICAgICAgICAgeyBzZXRUaW1lb3V0KG9wZXJhdGlvbihjbSwgZnVuY3Rpb24gKCkge2lmIChjb3VudGVyID09IGN1ckNvdW50KSB7IGV4dGVuZChlKTsgfX0pLCAxNTApOyB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgb3V0c2lkZSA9IGUuY2xpZW50WSA8IGVkaXRvclNpemUudG9wID8gLTIwIDogZS5jbGllbnRZID4gZWRpdG9yU2l6ZS5ib3R0b20gPyAyMCA6IDA7XG4gICAgICAgIGlmIChvdXRzaWRlKSB7IHNldFRpbWVvdXQob3BlcmF0aW9uKGNtLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKGNvdW50ZXIgIT0gY3VyQ291bnQpIHsgcmV0dXJuIH1cbiAgICAgICAgICBkaXNwbGF5LnNjcm9sbGVyLnNjcm9sbFRvcCArPSBvdXRzaWRlO1xuICAgICAgICAgIGV4dGVuZChlKTtcbiAgICAgICAgfSksIDUwKTsgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRvbmUoZSkge1xuICAgICAgY20uc3RhdGUuc2VsZWN0aW5nVGV4dCA9IGZhbHNlO1xuICAgICAgY291bnRlciA9IEluZmluaXR5O1xuICAgICAgLy8gSWYgZSBpcyBudWxsIG9yIHVuZGVmaW5lZCB3ZSBpbnRlcnByZXQgdGhpcyBhcyBzb21lb25lIHRyeWluZ1xuICAgICAgLy8gdG8gZXhwbGljaXRseSBjYW5jZWwgdGhlIHNlbGVjdGlvbiByYXRoZXIgdGhhbiB0aGUgdXNlclxuICAgICAgLy8gbGV0dGluZyBnbyBvZiB0aGUgbW91c2UgYnV0dG9uLlxuICAgICAgaWYgKGUpIHtcbiAgICAgICAgZV9wcmV2ZW50RGVmYXVsdChlKTtcbiAgICAgICAgZGlzcGxheS5pbnB1dC5mb2N1cygpO1xuICAgICAgfVxuICAgICAgb2ZmKGRpc3BsYXkud3JhcHBlci5vd25lckRvY3VtZW50LCBcIm1vdXNlbW92ZVwiLCBtb3ZlKTtcbiAgICAgIG9mZihkaXNwbGF5LndyYXBwZXIub3duZXJEb2N1bWVudCwgXCJtb3VzZXVwXCIsIHVwKTtcbiAgICAgIGRvYy5oaXN0b3J5Lmxhc3RTZWxPcmlnaW4gPSBudWxsO1xuICAgIH1cblxuICAgIHZhciBtb3ZlID0gb3BlcmF0aW9uKGNtLCBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKGUuYnV0dG9ucyA9PT0gMCB8fCAhZV9idXR0b24oZSkpIHsgZG9uZShlKTsgfVxuICAgICAgZWxzZSB7IGV4dGVuZChlKTsgfVxuICAgIH0pO1xuICAgIHZhciB1cCA9IG9wZXJhdGlvbihjbSwgZG9uZSk7XG4gICAgY20uc3RhdGUuc2VsZWN0aW5nVGV4dCA9IHVwO1xuICAgIG9uKGRpc3BsYXkud3JhcHBlci5vd25lckRvY3VtZW50LCBcIm1vdXNlbW92ZVwiLCBtb3ZlKTtcbiAgICBvbihkaXNwbGF5LndyYXBwZXIub3duZXJEb2N1bWVudCwgXCJtb3VzZXVwXCIsIHVwKTtcbiAgfVxuXG4gIC8vIFVzZWQgd2hlbiBtb3VzZS1zZWxlY3RpbmcgdG8gYWRqdXN0IHRoZSBhbmNob3IgdG8gdGhlIHByb3BlciBzaWRlXG4gIC8vIG9mIGEgYmlkaSBqdW1wIGRlcGVuZGluZyBvbiB0aGUgdmlzdWFsIHBvc2l0aW9uIG9mIHRoZSBoZWFkLlxuICBmdW5jdGlvbiBiaWRpU2ltcGxpZnkoY20sIHJhbmdlKSB7XG4gICAgdmFyIGFuY2hvciA9IHJhbmdlLmFuY2hvcjtcbiAgICB2YXIgaGVhZCA9IHJhbmdlLmhlYWQ7XG4gICAgdmFyIGFuY2hvckxpbmUgPSBnZXRMaW5lKGNtLmRvYywgYW5jaG9yLmxpbmUpO1xuICAgIGlmIChjbXAoYW5jaG9yLCBoZWFkKSA9PSAwICYmIGFuY2hvci5zdGlja3kgPT0gaGVhZC5zdGlja3kpIHsgcmV0dXJuIHJhbmdlIH1cbiAgICB2YXIgb3JkZXIgPSBnZXRPcmRlcihhbmNob3JMaW5lKTtcbiAgICBpZiAoIW9yZGVyKSB7IHJldHVybiByYW5nZSB9XG4gICAgdmFyIGluZGV4ID0gZ2V0QmlkaVBhcnRBdChvcmRlciwgYW5jaG9yLmNoLCBhbmNob3Iuc3RpY2t5KSwgcGFydCA9IG9yZGVyW2luZGV4XTtcbiAgICBpZiAocGFydC5mcm9tICE9IGFuY2hvci5jaCAmJiBwYXJ0LnRvICE9IGFuY2hvci5jaCkgeyByZXR1cm4gcmFuZ2UgfVxuICAgIHZhciBib3VuZGFyeSA9IGluZGV4ICsgKChwYXJ0LmZyb20gPT0gYW5jaG9yLmNoKSA9PSAocGFydC5sZXZlbCAhPSAxKSA/IDAgOiAxKTtcbiAgICBpZiAoYm91bmRhcnkgPT0gMCB8fCBib3VuZGFyeSA9PSBvcmRlci5sZW5ndGgpIHsgcmV0dXJuIHJhbmdlIH1cblxuICAgIC8vIENvbXB1dGUgdGhlIHJlbGF0aXZlIHZpc3VhbCBwb3NpdGlvbiBvZiB0aGUgaGVhZCBjb21wYXJlZCB0byB0aGVcbiAgICAvLyBhbmNob3IgKDwwIGlzIHRvIHRoZSBsZWZ0LCA+MCB0byB0aGUgcmlnaHQpXG4gICAgdmFyIGxlZnRTaWRlO1xuICAgIGlmIChoZWFkLmxpbmUgIT0gYW5jaG9yLmxpbmUpIHtcbiAgICAgIGxlZnRTaWRlID0gKGhlYWQubGluZSAtIGFuY2hvci5saW5lKSAqIChjbS5kb2MuZGlyZWN0aW9uID09IFwibHRyXCIgPyAxIDogLTEpID4gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGhlYWRJbmRleCA9IGdldEJpZGlQYXJ0QXQob3JkZXIsIGhlYWQuY2gsIGhlYWQuc3RpY2t5KTtcbiAgICAgIHZhciBkaXIgPSBoZWFkSW5kZXggLSBpbmRleCB8fCAoaGVhZC5jaCAtIGFuY2hvci5jaCkgKiAocGFydC5sZXZlbCA9PSAxID8gLTEgOiAxKTtcbiAgICAgIGlmIChoZWFkSW5kZXggPT0gYm91bmRhcnkgLSAxIHx8IGhlYWRJbmRleCA9PSBib3VuZGFyeSlcbiAgICAgICAgeyBsZWZ0U2lkZSA9IGRpciA8IDA7IH1cbiAgICAgIGVsc2VcbiAgICAgICAgeyBsZWZ0U2lkZSA9IGRpciA+IDA7IH1cbiAgICB9XG5cbiAgICB2YXIgdXNlUGFydCA9IG9yZGVyW2JvdW5kYXJ5ICsgKGxlZnRTaWRlID8gLTEgOiAwKV07XG4gICAgdmFyIGZyb20gPSBsZWZ0U2lkZSA9PSAodXNlUGFydC5sZXZlbCA9PSAxKTtcbiAgICB2YXIgY2ggPSBmcm9tID8gdXNlUGFydC5mcm9tIDogdXNlUGFydC50bywgc3RpY2t5ID0gZnJvbSA/IFwiYWZ0ZXJcIiA6IFwiYmVmb3JlXCI7XG4gICAgcmV0dXJuIGFuY2hvci5jaCA9PSBjaCAmJiBhbmNob3Iuc3RpY2t5ID09IHN0aWNreSA/IHJhbmdlIDogbmV3IFJhbmdlKG5ldyBQb3MoYW5jaG9yLmxpbmUsIGNoLCBzdGlja3kpLCBoZWFkKVxuICB9XG5cblxuICAvLyBEZXRlcm1pbmVzIHdoZXRoZXIgYW4gZXZlbnQgaGFwcGVuZWQgaW4gdGhlIGd1dHRlciwgYW5kIGZpcmVzIHRoZVxuICAvLyBoYW5kbGVycyBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgZXZlbnQuXG4gIGZ1bmN0aW9uIGd1dHRlckV2ZW50KGNtLCBlLCB0eXBlLCBwcmV2ZW50KSB7XG4gICAgdmFyIG1YLCBtWTtcbiAgICBpZiAoZS50b3VjaGVzKSB7XG4gICAgICBtWCA9IGUudG91Y2hlc1swXS5jbGllbnRYO1xuICAgICAgbVkgPSBlLnRvdWNoZXNbMF0uY2xpZW50WTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHsgbVggPSBlLmNsaWVudFg7IG1ZID0gZS5jbGllbnRZOyB9XG4gICAgICBjYXRjaChlJDEpIHsgcmV0dXJuIGZhbHNlIH1cbiAgICB9XG4gICAgaWYgKG1YID49IE1hdGguZmxvb3IoY20uZGlzcGxheS5ndXR0ZXJzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0KSkgeyByZXR1cm4gZmFsc2UgfVxuICAgIGlmIChwcmV2ZW50KSB7IGVfcHJldmVudERlZmF1bHQoZSk7IH1cblxuICAgIHZhciBkaXNwbGF5ID0gY20uZGlzcGxheTtcbiAgICB2YXIgbGluZUJveCA9IGRpc3BsYXkubGluZURpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIGlmIChtWSA+IGxpbmVCb3guYm90dG9tIHx8ICFoYXNIYW5kbGVyKGNtLCB0eXBlKSkgeyByZXR1cm4gZV9kZWZhdWx0UHJldmVudGVkKGUpIH1cbiAgICBtWSAtPSBsaW5lQm94LnRvcCAtIGRpc3BsYXkudmlld09mZnNldDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY20uZGlzcGxheS5ndXR0ZXJTcGVjcy5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIGcgPSBkaXNwbGF5Lmd1dHRlcnMuY2hpbGROb2Rlc1tpXTtcbiAgICAgIGlmIChnICYmIGcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQgPj0gbVgpIHtcbiAgICAgICAgdmFyIGxpbmUgPSBsaW5lQXRIZWlnaHQoY20uZG9jLCBtWSk7XG4gICAgICAgIHZhciBndXR0ZXIgPSBjbS5kaXNwbGF5Lmd1dHRlclNwZWNzW2ldO1xuICAgICAgICBzaWduYWwoY20sIHR5cGUsIGNtLCBsaW5lLCBndXR0ZXIuY2xhc3NOYW1lLCBlKTtcbiAgICAgICAgcmV0dXJuIGVfZGVmYXVsdFByZXZlbnRlZChlKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNsaWNrSW5HdXR0ZXIoY20sIGUpIHtcbiAgICByZXR1cm4gZ3V0dGVyRXZlbnQoY20sIGUsIFwiZ3V0dGVyQ2xpY2tcIiwgdHJ1ZSlcbiAgfVxuXG4gIC8vIENPTlRFWFQgTUVOVSBIQU5ETElOR1xuXG4gIC8vIFRvIG1ha2UgdGhlIGNvbnRleHQgbWVudSB3b3JrLCB3ZSBuZWVkIHRvIGJyaWVmbHkgdW5oaWRlIHRoZVxuICAvLyB0ZXh0YXJlYSAobWFraW5nIGl0IGFzIHVub2J0cnVzaXZlIGFzIHBvc3NpYmxlKSB0byBsZXQgdGhlXG4gIC8vIHJpZ2h0LWNsaWNrIHRha2UgZWZmZWN0IG9uIGl0LlxuICBmdW5jdGlvbiBvbkNvbnRleHRNZW51KGNtLCBlKSB7XG4gICAgaWYgKGV2ZW50SW5XaWRnZXQoY20uZGlzcGxheSwgZSkgfHwgY29udGV4dE1lbnVJbkd1dHRlcihjbSwgZSkpIHsgcmV0dXJuIH1cbiAgICBpZiAoc2lnbmFsRE9NRXZlbnQoY20sIGUsIFwiY29udGV4dG1lbnVcIikpIHsgcmV0dXJuIH1cbiAgICBpZiAoIWNhcHR1cmVSaWdodENsaWNrKSB7IGNtLmRpc3BsYXkuaW5wdXQub25Db250ZXh0TWVudShlKTsgfVxuICB9XG5cbiAgZnVuY3Rpb24gY29udGV4dE1lbnVJbkd1dHRlcihjbSwgZSkge1xuICAgIGlmICghaGFzSGFuZGxlcihjbSwgXCJndXR0ZXJDb250ZXh0TWVudVwiKSkgeyByZXR1cm4gZmFsc2UgfVxuICAgIHJldHVybiBndXR0ZXJFdmVudChjbSwgZSwgXCJndXR0ZXJDb250ZXh0TWVudVwiLCBmYWxzZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHRoZW1lQ2hhbmdlZChjbSkge1xuICAgIGNtLmRpc3BsYXkud3JhcHBlci5jbGFzc05hbWUgPSBjbS5kaXNwbGF5LndyYXBwZXIuY2xhc3NOYW1lLnJlcGxhY2UoL1xccypjbS1zLVxcUysvZywgXCJcIikgK1xuICAgICAgY20ub3B0aW9ucy50aGVtZS5yZXBsYWNlKC8oXnxcXHMpXFxzKi9nLCBcIiBjbS1zLVwiKTtcbiAgICBjbGVhckNhY2hlcyhjbSk7XG4gIH1cblxuICB2YXIgSW5pdCA9IHt0b1N0cmluZzogZnVuY3Rpb24oKXtyZXR1cm4gXCJDb2RlTWlycm9yLkluaXRcIn19O1xuXG4gIHZhciBkZWZhdWx0cyA9IHt9O1xuICB2YXIgb3B0aW9uSGFuZGxlcnMgPSB7fTtcblxuICBmdW5jdGlvbiBkZWZpbmVPcHRpb25zKENvZGVNaXJyb3IpIHtcbiAgICB2YXIgb3B0aW9uSGFuZGxlcnMgPSBDb2RlTWlycm9yLm9wdGlvbkhhbmRsZXJzO1xuXG4gICAgZnVuY3Rpb24gb3B0aW9uKG5hbWUsIGRlZmx0LCBoYW5kbGUsIG5vdE9uSW5pdCkge1xuICAgICAgQ29kZU1pcnJvci5kZWZhdWx0c1tuYW1lXSA9IGRlZmx0O1xuICAgICAgaWYgKGhhbmRsZSkgeyBvcHRpb25IYW5kbGVyc1tuYW1lXSA9XG4gICAgICAgIG5vdE9uSW5pdCA/IGZ1bmN0aW9uIChjbSwgdmFsLCBvbGQpIHtpZiAob2xkICE9IEluaXQpIHsgaGFuZGxlKGNtLCB2YWwsIG9sZCk7IH19IDogaGFuZGxlOyB9XG4gICAgfVxuXG4gICAgQ29kZU1pcnJvci5kZWZpbmVPcHRpb24gPSBvcHRpb247XG5cbiAgICAvLyBQYXNzZWQgdG8gb3B0aW9uIGhhbmRsZXJzIHdoZW4gdGhlcmUgaXMgbm8gb2xkIHZhbHVlLlxuICAgIENvZGVNaXJyb3IuSW5pdCA9IEluaXQ7XG5cbiAgICAvLyBUaGVzZSB0d28gYXJlLCBvbiBpbml0LCBjYWxsZWQgZnJvbSB0aGUgY29uc3RydWN0b3IgYmVjYXVzZSB0aGV5XG4gICAgLy8gaGF2ZSB0byBiZSBpbml0aWFsaXplZCBiZWZvcmUgdGhlIGVkaXRvciBjYW4gc3RhcnQgYXQgYWxsLlxuICAgIG9wdGlvbihcInZhbHVlXCIsIFwiXCIsIGZ1bmN0aW9uIChjbSwgdmFsKSB7IHJldHVybiBjbS5zZXRWYWx1ZSh2YWwpOyB9LCB0cnVlKTtcbiAgICBvcHRpb24oXCJtb2RlXCIsIG51bGwsIGZ1bmN0aW9uIChjbSwgdmFsKSB7XG4gICAgICBjbS5kb2MubW9kZU9wdGlvbiA9IHZhbDtcbiAgICAgIGxvYWRNb2RlKGNtKTtcbiAgICB9LCB0cnVlKTtcblxuICAgIG9wdGlvbihcImluZGVudFVuaXRcIiwgMiwgbG9hZE1vZGUsIHRydWUpO1xuICAgIG9wdGlvbihcImluZGVudFdpdGhUYWJzXCIsIGZhbHNlKTtcbiAgICBvcHRpb24oXCJzbWFydEluZGVudFwiLCB0cnVlKTtcbiAgICBvcHRpb24oXCJ0YWJTaXplXCIsIDQsIGZ1bmN0aW9uIChjbSkge1xuICAgICAgcmVzZXRNb2RlU3RhdGUoY20pO1xuICAgICAgY2xlYXJDYWNoZXMoY20pO1xuICAgICAgcmVnQ2hhbmdlKGNtKTtcbiAgICB9LCB0cnVlKTtcblxuICAgIG9wdGlvbihcImxpbmVTZXBhcmF0b3JcIiwgbnVsbCwgZnVuY3Rpb24gKGNtLCB2YWwpIHtcbiAgICAgIGNtLmRvYy5saW5lU2VwID0gdmFsO1xuICAgICAgaWYgKCF2YWwpIHsgcmV0dXJuIH1cbiAgICAgIHZhciBuZXdCcmVha3MgPSBbXSwgbGluZU5vID0gY20uZG9jLmZpcnN0O1xuICAgICAgY20uZG9jLml0ZXIoZnVuY3Rpb24gKGxpbmUpIHtcbiAgICAgICAgZm9yICh2YXIgcG9zID0gMDs7KSB7XG4gICAgICAgICAgdmFyIGZvdW5kID0gbGluZS50ZXh0LmluZGV4T2YodmFsLCBwb3MpO1xuICAgICAgICAgIGlmIChmb3VuZCA9PSAtMSkgeyBicmVhayB9XG4gICAgICAgICAgcG9zID0gZm91bmQgKyB2YWwubGVuZ3RoO1xuICAgICAgICAgIG5ld0JyZWFrcy5wdXNoKFBvcyhsaW5lTm8sIGZvdW5kKSk7XG4gICAgICAgIH1cbiAgICAgICAgbGluZU5vKys7XG4gICAgICB9KTtcbiAgICAgIGZvciAodmFyIGkgPSBuZXdCcmVha3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pXG4gICAgICAgIHsgcmVwbGFjZVJhbmdlKGNtLmRvYywgdmFsLCBuZXdCcmVha3NbaV0sIFBvcyhuZXdCcmVha3NbaV0ubGluZSwgbmV3QnJlYWtzW2ldLmNoICsgdmFsLmxlbmd0aCkpOyB9XG4gICAgfSk7XG4gICAgb3B0aW9uKFwic3BlY2lhbENoYXJzXCIsIC9bXFx1MDAwMC1cXHUwMDFmXFx1MDA3Zi1cXHUwMDlmXFx1MDBhZFxcdTA2MWNcXHUyMDBiLVxcdTIwMGNcXHUyMDBlXFx1MjAwZlxcdTIwMjhcXHUyMDI5XFx1ZmVmZlxcdWZmZjktXFx1ZmZmY10vZywgZnVuY3Rpb24gKGNtLCB2YWwsIG9sZCkge1xuICAgICAgY20uc3RhdGUuc3BlY2lhbENoYXJzID0gbmV3IFJlZ0V4cCh2YWwuc291cmNlICsgKHZhbC50ZXN0KFwiXFx0XCIpID8gXCJcIiA6IFwifFxcdFwiKSwgXCJnXCIpO1xuICAgICAgaWYgKG9sZCAhPSBJbml0KSB7IGNtLnJlZnJlc2goKTsgfVxuICAgIH0pO1xuICAgIG9wdGlvbihcInNwZWNpYWxDaGFyUGxhY2Vob2xkZXJcIiwgZGVmYXVsdFNwZWNpYWxDaGFyUGxhY2Vob2xkZXIsIGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gY20ucmVmcmVzaCgpOyB9LCB0cnVlKTtcbiAgICBvcHRpb24oXCJlbGVjdHJpY0NoYXJzXCIsIHRydWUpO1xuICAgIG9wdGlvbihcImlucHV0U3R5bGVcIiwgbW9iaWxlID8gXCJjb250ZW50ZWRpdGFibGVcIiA6IFwidGV4dGFyZWFcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW5wdXRTdHlsZSBjYW4gbm90ICh5ZXQpIGJlIGNoYW5nZWQgaW4gYSBydW5uaW5nIGVkaXRvclwiKSAvLyBGSVhNRVxuICAgIH0sIHRydWUpO1xuICAgIG9wdGlvbihcInNwZWxsY2hlY2tcIiwgZmFsc2UsIGZ1bmN0aW9uIChjbSwgdmFsKSB7IHJldHVybiBjbS5nZXRJbnB1dEZpZWxkKCkuc3BlbGxjaGVjayA9IHZhbDsgfSwgdHJ1ZSk7XG4gICAgb3B0aW9uKFwiYXV0b2NvcnJlY3RcIiwgZmFsc2UsIGZ1bmN0aW9uIChjbSwgdmFsKSB7IHJldHVybiBjbS5nZXRJbnB1dEZpZWxkKCkuYXV0b2NvcnJlY3QgPSB2YWw7IH0sIHRydWUpO1xuICAgIG9wdGlvbihcImF1dG9jYXBpdGFsaXplXCIsIGZhbHNlLCBmdW5jdGlvbiAoY20sIHZhbCkgeyByZXR1cm4gY20uZ2V0SW5wdXRGaWVsZCgpLmF1dG9jYXBpdGFsaXplID0gdmFsOyB9LCB0cnVlKTtcbiAgICBvcHRpb24oXCJydGxNb3ZlVmlzdWFsbHlcIiwgIXdpbmRvd3MpO1xuICAgIG9wdGlvbihcIndob2xlTGluZVVwZGF0ZUJlZm9yZVwiLCB0cnVlKTtcblxuICAgIG9wdGlvbihcInRoZW1lXCIsIFwiZGVmYXVsdFwiLCBmdW5jdGlvbiAoY20pIHtcbiAgICAgIHRoZW1lQ2hhbmdlZChjbSk7XG4gICAgICB1cGRhdGVHdXR0ZXJzKGNtKTtcbiAgICB9LCB0cnVlKTtcbiAgICBvcHRpb24oXCJrZXlNYXBcIiwgXCJkZWZhdWx0XCIsIGZ1bmN0aW9uIChjbSwgdmFsLCBvbGQpIHtcbiAgICAgIHZhciBuZXh0ID0gZ2V0S2V5TWFwKHZhbCk7XG4gICAgICB2YXIgcHJldiA9IG9sZCAhPSBJbml0ICYmIGdldEtleU1hcChvbGQpO1xuICAgICAgaWYgKHByZXYgJiYgcHJldi5kZXRhY2gpIHsgcHJldi5kZXRhY2goY20sIG5leHQpOyB9XG4gICAgICBpZiAobmV4dC5hdHRhY2gpIHsgbmV4dC5hdHRhY2goY20sIHByZXYgfHwgbnVsbCk7IH1cbiAgICB9KTtcbiAgICBvcHRpb24oXCJleHRyYUtleXNcIiwgbnVsbCk7XG4gICAgb3B0aW9uKFwiY29uZmlndXJlTW91c2VcIiwgbnVsbCk7XG5cbiAgICBvcHRpb24oXCJsaW5lV3JhcHBpbmdcIiwgZmFsc2UsIHdyYXBwaW5nQ2hhbmdlZCwgdHJ1ZSk7XG4gICAgb3B0aW9uKFwiZ3V0dGVyc1wiLCBbXSwgZnVuY3Rpb24gKGNtLCB2YWwpIHtcbiAgICAgIGNtLmRpc3BsYXkuZ3V0dGVyU3BlY3MgPSBnZXRHdXR0ZXJzKHZhbCwgY20ub3B0aW9ucy5saW5lTnVtYmVycyk7XG4gICAgICB1cGRhdGVHdXR0ZXJzKGNtKTtcbiAgICB9LCB0cnVlKTtcbiAgICBvcHRpb24oXCJmaXhlZEd1dHRlclwiLCB0cnVlLCBmdW5jdGlvbiAoY20sIHZhbCkge1xuICAgICAgY20uZGlzcGxheS5ndXR0ZXJzLnN0eWxlLmxlZnQgPSB2YWwgPyBjb21wZW5zYXRlRm9ySFNjcm9sbChjbS5kaXNwbGF5KSArIFwicHhcIiA6IFwiMFwiO1xuICAgICAgY20ucmVmcmVzaCgpO1xuICAgIH0sIHRydWUpO1xuICAgIG9wdGlvbihcImNvdmVyR3V0dGVyTmV4dFRvU2Nyb2xsYmFyXCIsIGZhbHNlLCBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIHVwZGF0ZVNjcm9sbGJhcnMoY20pOyB9LCB0cnVlKTtcbiAgICBvcHRpb24oXCJzY3JvbGxiYXJTdHlsZVwiLCBcIm5hdGl2ZVwiLCBmdW5jdGlvbiAoY20pIHtcbiAgICAgIGluaXRTY3JvbGxiYXJzKGNtKTtcbiAgICAgIHVwZGF0ZVNjcm9sbGJhcnMoY20pO1xuICAgICAgY20uZGlzcGxheS5zY3JvbGxiYXJzLnNldFNjcm9sbFRvcChjbS5kb2Muc2Nyb2xsVG9wKTtcbiAgICAgIGNtLmRpc3BsYXkuc2Nyb2xsYmFycy5zZXRTY3JvbGxMZWZ0KGNtLmRvYy5zY3JvbGxMZWZ0KTtcbiAgICB9LCB0cnVlKTtcbiAgICBvcHRpb24oXCJsaW5lTnVtYmVyc1wiLCBmYWxzZSwgZnVuY3Rpb24gKGNtLCB2YWwpIHtcbiAgICAgIGNtLmRpc3BsYXkuZ3V0dGVyU3BlY3MgPSBnZXRHdXR0ZXJzKGNtLm9wdGlvbnMuZ3V0dGVycywgdmFsKTtcbiAgICAgIHVwZGF0ZUd1dHRlcnMoY20pO1xuICAgIH0sIHRydWUpO1xuICAgIG9wdGlvbihcImZpcnN0TGluZU51bWJlclwiLCAxLCB1cGRhdGVHdXR0ZXJzLCB0cnVlKTtcbiAgICBvcHRpb24oXCJsaW5lTnVtYmVyRm9ybWF0dGVyXCIsIGZ1bmN0aW9uIChpbnRlZ2VyKSB7IHJldHVybiBpbnRlZ2VyOyB9LCB1cGRhdGVHdXR0ZXJzLCB0cnVlKTtcbiAgICBvcHRpb24oXCJzaG93Q3Vyc29yV2hlblNlbGVjdGluZ1wiLCBmYWxzZSwgdXBkYXRlU2VsZWN0aW9uLCB0cnVlKTtcblxuICAgIG9wdGlvbihcInJlc2V0U2VsZWN0aW9uT25Db250ZXh0TWVudVwiLCB0cnVlKTtcbiAgICBvcHRpb24oXCJsaW5lV2lzZUNvcHlDdXRcIiwgdHJ1ZSk7XG4gICAgb3B0aW9uKFwicGFzdGVMaW5lc1BlclNlbGVjdGlvblwiLCB0cnVlKTtcbiAgICBvcHRpb24oXCJzZWxlY3Rpb25zTWF5VG91Y2hcIiwgZmFsc2UpO1xuXG4gICAgb3B0aW9uKFwicmVhZE9ubHlcIiwgZmFsc2UsIGZ1bmN0aW9uIChjbSwgdmFsKSB7XG4gICAgICBpZiAodmFsID09IFwibm9jdXJzb3JcIikge1xuICAgICAgICBvbkJsdXIoY20pO1xuICAgICAgICBjbS5kaXNwbGF5LmlucHV0LmJsdXIoKTtcbiAgICAgIH1cbiAgICAgIGNtLmRpc3BsYXkuaW5wdXQucmVhZE9ubHlDaGFuZ2VkKHZhbCk7XG4gICAgfSk7XG5cbiAgICBvcHRpb24oXCJzY3JlZW5SZWFkZXJMYWJlbFwiLCBudWxsLCBmdW5jdGlvbiAoY20sIHZhbCkge1xuICAgICAgdmFsID0gKHZhbCA9PT0gJycpID8gbnVsbCA6IHZhbDtcbiAgICAgIGNtLmRpc3BsYXkuaW5wdXQuc2NyZWVuUmVhZGVyTGFiZWxDaGFuZ2VkKHZhbCk7XG4gICAgfSk7XG5cbiAgICBvcHRpb24oXCJkaXNhYmxlSW5wdXRcIiwgZmFsc2UsIGZ1bmN0aW9uIChjbSwgdmFsKSB7aWYgKCF2YWwpIHsgY20uZGlzcGxheS5pbnB1dC5yZXNldCgpOyB9fSwgdHJ1ZSk7XG4gICAgb3B0aW9uKFwiZHJhZ0Ryb3BcIiwgdHJ1ZSwgZHJhZ0Ryb3BDaGFuZ2VkKTtcbiAgICBvcHRpb24oXCJhbGxvd0Ryb3BGaWxlVHlwZXNcIiwgbnVsbCk7XG5cbiAgICBvcHRpb24oXCJjdXJzb3JCbGlua1JhdGVcIiwgNTMwKTtcbiAgICBvcHRpb24oXCJjdXJzb3JTY3JvbGxNYXJnaW5cIiwgMCk7XG4gICAgb3B0aW9uKFwiY3Vyc29ySGVpZ2h0XCIsIDEsIHVwZGF0ZVNlbGVjdGlvbiwgdHJ1ZSk7XG4gICAgb3B0aW9uKFwic2luZ2xlQ3Vyc29ySGVpZ2h0UGVyTGluZVwiLCB0cnVlLCB1cGRhdGVTZWxlY3Rpb24sIHRydWUpO1xuICAgIG9wdGlvbihcIndvcmtUaW1lXCIsIDEwMCk7XG4gICAgb3B0aW9uKFwid29ya0RlbGF5XCIsIDEwMCk7XG4gICAgb3B0aW9uKFwiZmxhdHRlblNwYW5zXCIsIHRydWUsIHJlc2V0TW9kZVN0YXRlLCB0cnVlKTtcbiAgICBvcHRpb24oXCJhZGRNb2RlQ2xhc3NcIiwgZmFsc2UsIHJlc2V0TW9kZVN0YXRlLCB0cnVlKTtcbiAgICBvcHRpb24oXCJwb2xsSW50ZXJ2YWxcIiwgMTAwKTtcbiAgICBvcHRpb24oXCJ1bmRvRGVwdGhcIiwgMjAwLCBmdW5jdGlvbiAoY20sIHZhbCkgeyByZXR1cm4gY20uZG9jLmhpc3RvcnkudW5kb0RlcHRoID0gdmFsOyB9KTtcbiAgICBvcHRpb24oXCJoaXN0b3J5RXZlbnREZWxheVwiLCAxMjUwKTtcbiAgICBvcHRpb24oXCJ2aWV3cG9ydE1hcmdpblwiLCAxMCwgZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5yZWZyZXNoKCk7IH0sIHRydWUpO1xuICAgIG9wdGlvbihcIm1heEhpZ2hsaWdodExlbmd0aFwiLCAxMDAwMCwgcmVzZXRNb2RlU3RhdGUsIHRydWUpO1xuICAgIG9wdGlvbihcIm1vdmVJbnB1dFdpdGhDdXJzb3JcIiwgdHJ1ZSwgZnVuY3Rpb24gKGNtLCB2YWwpIHtcbiAgICAgIGlmICghdmFsKSB7IGNtLmRpc3BsYXkuaW5wdXQucmVzZXRQb3NpdGlvbigpOyB9XG4gICAgfSk7XG5cbiAgICBvcHRpb24oXCJ0YWJpbmRleFwiLCBudWxsLCBmdW5jdGlvbiAoY20sIHZhbCkgeyByZXR1cm4gY20uZGlzcGxheS5pbnB1dC5nZXRGaWVsZCgpLnRhYkluZGV4ID0gdmFsIHx8IFwiXCI7IH0pO1xuICAgIG9wdGlvbihcImF1dG9mb2N1c1wiLCBudWxsKTtcbiAgICBvcHRpb24oXCJkaXJlY3Rpb25cIiwgXCJsdHJcIiwgZnVuY3Rpb24gKGNtLCB2YWwpIHsgcmV0dXJuIGNtLmRvYy5zZXREaXJlY3Rpb24odmFsKTsgfSwgdHJ1ZSk7XG4gICAgb3B0aW9uKFwicGhyYXNlc1wiLCBudWxsKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRyYWdEcm9wQ2hhbmdlZChjbSwgdmFsdWUsIG9sZCkge1xuICAgIHZhciB3YXNPbiA9IG9sZCAmJiBvbGQgIT0gSW5pdDtcbiAgICBpZiAoIXZhbHVlICE9ICF3YXNPbikge1xuICAgICAgdmFyIGZ1bmNzID0gY20uZGlzcGxheS5kcmFnRnVuY3Rpb25zO1xuICAgICAgdmFyIHRvZ2dsZSA9IHZhbHVlID8gb24gOiBvZmY7XG4gICAgICB0b2dnbGUoY20uZGlzcGxheS5zY3JvbGxlciwgXCJkcmFnc3RhcnRcIiwgZnVuY3Muc3RhcnQpO1xuICAgICAgdG9nZ2xlKGNtLmRpc3BsYXkuc2Nyb2xsZXIsIFwiZHJhZ2VudGVyXCIsIGZ1bmNzLmVudGVyKTtcbiAgICAgIHRvZ2dsZShjbS5kaXNwbGF5LnNjcm9sbGVyLCBcImRyYWdvdmVyXCIsIGZ1bmNzLm92ZXIpO1xuICAgICAgdG9nZ2xlKGNtLmRpc3BsYXkuc2Nyb2xsZXIsIFwiZHJhZ2xlYXZlXCIsIGZ1bmNzLmxlYXZlKTtcbiAgICAgIHRvZ2dsZShjbS5kaXNwbGF5LnNjcm9sbGVyLCBcImRyb3BcIiwgZnVuY3MuZHJvcCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gd3JhcHBpbmdDaGFuZ2VkKGNtKSB7XG4gICAgaWYgKGNtLm9wdGlvbnMubGluZVdyYXBwaW5nKSB7XG4gICAgICBhZGRDbGFzcyhjbS5kaXNwbGF5LndyYXBwZXIsIFwiQ29kZU1pcnJvci13cmFwXCIpO1xuICAgICAgY20uZGlzcGxheS5zaXplci5zdHlsZS5taW5XaWR0aCA9IFwiXCI7XG4gICAgICBjbS5kaXNwbGF5LnNpemVyV2lkdGggPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBybUNsYXNzKGNtLmRpc3BsYXkud3JhcHBlciwgXCJDb2RlTWlycm9yLXdyYXBcIik7XG4gICAgICBmaW5kTWF4TGluZShjbSk7XG4gICAgfVxuICAgIGVzdGltYXRlTGluZUhlaWdodHMoY20pO1xuICAgIHJlZ0NoYW5nZShjbSk7XG4gICAgY2xlYXJDYWNoZXMoY20pO1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyByZXR1cm4gdXBkYXRlU2Nyb2xsYmFycyhjbSk7IH0sIDEwMCk7XG4gIH1cblxuICAvLyBBIENvZGVNaXJyb3IgaW5zdGFuY2UgcmVwcmVzZW50cyBhbiBlZGl0b3IuIFRoaXMgaXMgdGhlIG9iamVjdFxuICAvLyB0aGF0IHVzZXIgY29kZSBpcyB1c3VhbGx5IGRlYWxpbmcgd2l0aC5cblxuICBmdW5jdGlvbiBDb2RlTWlycm9yKHBsYWNlLCBvcHRpb25zKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgQ29kZU1pcnJvcikpIHsgcmV0dXJuIG5ldyBDb2RlTWlycm9yKHBsYWNlLCBvcHRpb25zKSB9XG5cbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zID0gb3B0aW9ucyA/IGNvcHlPYmoob3B0aW9ucykgOiB7fTtcbiAgICAvLyBEZXRlcm1pbmUgZWZmZWN0aXZlIG9wdGlvbnMgYmFzZWQgb24gZ2l2ZW4gdmFsdWVzIGFuZCBkZWZhdWx0cy5cbiAgICBjb3B5T2JqKGRlZmF1bHRzLCBvcHRpb25zLCBmYWxzZSk7XG5cbiAgICB2YXIgZG9jID0gb3B0aW9ucy52YWx1ZTtcbiAgICBpZiAodHlwZW9mIGRvYyA9PSBcInN0cmluZ1wiKSB7IGRvYyA9IG5ldyBEb2MoZG9jLCBvcHRpb25zLm1vZGUsIG51bGwsIG9wdGlvbnMubGluZVNlcGFyYXRvciwgb3B0aW9ucy5kaXJlY3Rpb24pOyB9XG4gICAgZWxzZSBpZiAob3B0aW9ucy5tb2RlKSB7IGRvYy5tb2RlT3B0aW9uID0gb3B0aW9ucy5tb2RlOyB9XG4gICAgdGhpcy5kb2MgPSBkb2M7XG5cbiAgICB2YXIgaW5wdXQgPSBuZXcgQ29kZU1pcnJvci5pbnB1dFN0eWxlc1tvcHRpb25zLmlucHV0U3R5bGVdKHRoaXMpO1xuICAgIHZhciBkaXNwbGF5ID0gdGhpcy5kaXNwbGF5ID0gbmV3IERpc3BsYXkocGxhY2UsIGRvYywgaW5wdXQsIG9wdGlvbnMpO1xuICAgIGRpc3BsYXkud3JhcHBlci5Db2RlTWlycm9yID0gdGhpcztcbiAgICB0aGVtZUNoYW5nZWQodGhpcyk7XG4gICAgaWYgKG9wdGlvbnMubGluZVdyYXBwaW5nKVxuICAgICAgeyB0aGlzLmRpc3BsYXkud3JhcHBlci5jbGFzc05hbWUgKz0gXCIgQ29kZU1pcnJvci13cmFwXCI7IH1cbiAgICBpbml0U2Nyb2xsYmFycyh0aGlzKTtcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBrZXlNYXBzOiBbXSwgIC8vIHN0b3JlcyBtYXBzIGFkZGVkIGJ5IGFkZEtleU1hcFxuICAgICAgb3ZlcmxheXM6IFtdLCAvLyBoaWdobGlnaHRpbmcgb3ZlcmxheXMsIGFzIGFkZGVkIGJ5IGFkZE92ZXJsYXlcbiAgICAgIG1vZGVHZW46IDAsICAgLy8gYnVtcGVkIHdoZW4gbW9kZS9vdmVybGF5IGNoYW5nZXMsIHVzZWQgdG8gaW52YWxpZGF0ZSBoaWdobGlnaHRpbmcgaW5mb1xuICAgICAgb3ZlcndyaXRlOiBmYWxzZSxcbiAgICAgIGRlbGF5aW5nQmx1ckV2ZW50OiBmYWxzZSxcbiAgICAgIGZvY3VzZWQ6IGZhbHNlLFxuICAgICAgc3VwcHJlc3NFZGl0czogZmFsc2UsIC8vIHVzZWQgdG8gZGlzYWJsZSBlZGl0aW5nIGR1cmluZyBrZXkgaGFuZGxlcnMgd2hlbiBpbiByZWFkT25seSBtb2RlXG4gICAgICBwYXN0ZUluY29taW5nOiAtMSwgY3V0SW5jb21pbmc6IC0xLCAvLyBoZWxwIHJlY29nbml6ZSBwYXN0ZS9jdXQgZWRpdHMgaW4gaW5wdXQucG9sbFxuICAgICAgc2VsZWN0aW5nVGV4dDogZmFsc2UsXG4gICAgICBkcmFnZ2luZ1RleHQ6IGZhbHNlLFxuICAgICAgaGlnaGxpZ2h0OiBuZXcgRGVsYXllZCgpLCAvLyBzdG9yZXMgaGlnaGxpZ2h0IHdvcmtlciB0aW1lb3V0XG4gICAgICBrZXlTZXE6IG51bGwsICAvLyBVbmZpbmlzaGVkIGtleSBzZXF1ZW5jZVxuICAgICAgc3BlY2lhbENoYXJzOiBudWxsXG4gICAgfTtcblxuICAgIGlmIChvcHRpb25zLmF1dG9mb2N1cyAmJiAhbW9iaWxlKSB7IGRpc3BsYXkuaW5wdXQuZm9jdXMoKTsgfVxuXG4gICAgLy8gT3ZlcnJpZGUgbWFnaWMgdGV4dGFyZWEgY29udGVudCByZXN0b3JlIHRoYXQgSUUgc29tZXRpbWVzIGRvZXNcbiAgICAvLyBvbiBvdXIgaGlkZGVuIHRleHRhcmVhIG9uIHJlbG9hZFxuICAgIGlmIChpZSAmJiBpZV92ZXJzaW9uIDwgMTEpIHsgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzJDEuZGlzcGxheS5pbnB1dC5yZXNldCh0cnVlKTsgfSwgMjApOyB9XG5cbiAgICByZWdpc3RlckV2ZW50SGFuZGxlcnModGhpcyk7XG4gICAgZW5zdXJlR2xvYmFsSGFuZGxlcnMoKTtcblxuICAgIHN0YXJ0T3BlcmF0aW9uKHRoaXMpO1xuICAgIHRoaXMuY3VyT3AuZm9yY2VVcGRhdGUgPSB0cnVlO1xuICAgIGF0dGFjaERvYyh0aGlzLCBkb2MpO1xuXG4gICAgaWYgKChvcHRpb25zLmF1dG9mb2N1cyAmJiAhbW9iaWxlKSB8fCB0aGlzLmhhc0ZvY3VzKCkpXG4gICAgICB7IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcyQxLmhhc0ZvY3VzKCkgJiYgIXRoaXMkMS5zdGF0ZS5mb2N1c2VkKSB7IG9uRm9jdXModGhpcyQxKTsgfVxuICAgICAgfSwgMjApOyB9XG4gICAgZWxzZVxuICAgICAgeyBvbkJsdXIodGhpcyk7IH1cblxuICAgIGZvciAodmFyIG9wdCBpbiBvcHRpb25IYW5kbGVycykgeyBpZiAob3B0aW9uSGFuZGxlcnMuaGFzT3duUHJvcGVydHkob3B0KSlcbiAgICAgIHsgb3B0aW9uSGFuZGxlcnNbb3B0XSh0aGlzLCBvcHRpb25zW29wdF0sIEluaXQpOyB9IH1cbiAgICBtYXliZVVwZGF0ZUxpbmVOdW1iZXJXaWR0aCh0aGlzKTtcbiAgICBpZiAob3B0aW9ucy5maW5pc2hJbml0KSB7IG9wdGlvbnMuZmluaXNoSW5pdCh0aGlzKTsgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdEhvb2tzLmxlbmd0aDsgKytpKSB7IGluaXRIb29rc1tpXSh0aGlzKTsgfVxuICAgIGVuZE9wZXJhdGlvbih0aGlzKTtcbiAgICAvLyBTdXBwcmVzcyBvcHRpbWl6ZWxlZ2liaWxpdHkgaW4gV2Via2l0LCBzaW5jZSBpdCBicmVha3MgdGV4dFxuICAgIC8vIG1lYXN1cmluZyBvbiBsaW5lIHdyYXBwaW5nIGJvdW5kYXJpZXMuXG4gICAgaWYgKHdlYmtpdCAmJiBvcHRpb25zLmxpbmVXcmFwcGluZyAmJlxuICAgICAgICBnZXRDb21wdXRlZFN0eWxlKGRpc3BsYXkubGluZURpdikudGV4dFJlbmRlcmluZyA9PSBcIm9wdGltaXplbGVnaWJpbGl0eVwiKVxuICAgICAgeyBkaXNwbGF5LmxpbmVEaXYuc3R5bGUudGV4dFJlbmRlcmluZyA9IFwiYXV0b1wiOyB9XG4gIH1cblxuICAvLyBUaGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gIENvZGVNaXJyb3IuZGVmYXVsdHMgPSBkZWZhdWx0cztcbiAgLy8gRnVuY3Rpb25zIHRvIHJ1biB3aGVuIG9wdGlvbnMgYXJlIGNoYW5nZWQuXG4gIENvZGVNaXJyb3Iub3B0aW9uSGFuZGxlcnMgPSBvcHRpb25IYW5kbGVycztcblxuICAvLyBBdHRhY2ggdGhlIG5lY2Vzc2FyeSBldmVudCBoYW5kbGVycyB3aGVuIGluaXRpYWxpemluZyB0aGUgZWRpdG9yXG4gIGZ1bmN0aW9uIHJlZ2lzdGVyRXZlbnRIYW5kbGVycyhjbSkge1xuICAgIHZhciBkID0gY20uZGlzcGxheTtcbiAgICBvbihkLnNjcm9sbGVyLCBcIm1vdXNlZG93blwiLCBvcGVyYXRpb24oY20sIG9uTW91c2VEb3duKSk7XG4gICAgLy8gT2xkZXIgSUUncyB3aWxsIG5vdCBmaXJlIGEgc2Vjb25kIG1vdXNlZG93biBmb3IgYSBkb3VibGUgY2xpY2tcbiAgICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8IDExKVxuICAgICAgeyBvbihkLnNjcm9sbGVyLCBcImRibGNsaWNrXCIsIG9wZXJhdGlvbihjbSwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYgKHNpZ25hbERPTUV2ZW50KGNtLCBlKSkgeyByZXR1cm4gfVxuICAgICAgICB2YXIgcG9zID0gcG9zRnJvbU1vdXNlKGNtLCBlKTtcbiAgICAgICAgaWYgKCFwb3MgfHwgY2xpY2tJbkd1dHRlcihjbSwgZSkgfHwgZXZlbnRJbldpZGdldChjbS5kaXNwbGF5LCBlKSkgeyByZXR1cm4gfVxuICAgICAgICBlX3ByZXZlbnREZWZhdWx0KGUpO1xuICAgICAgICB2YXIgd29yZCA9IGNtLmZpbmRXb3JkQXQocG9zKTtcbiAgICAgICAgZXh0ZW5kU2VsZWN0aW9uKGNtLmRvYywgd29yZC5hbmNob3IsIHdvcmQuaGVhZCk7XG4gICAgICB9KSk7IH1cbiAgICBlbHNlXG4gICAgICB7IG9uKGQuc2Nyb2xsZXIsIFwiZGJsY2xpY2tcIiwgZnVuY3Rpb24gKGUpIHsgcmV0dXJuIHNpZ25hbERPTUV2ZW50KGNtLCBlKSB8fCBlX3ByZXZlbnREZWZhdWx0KGUpOyB9KTsgfVxuICAgIC8vIFNvbWUgYnJvd3NlcnMgZmlyZSBjb250ZXh0bWVudSAqYWZ0ZXIqIG9wZW5pbmcgdGhlIG1lbnUsIGF0XG4gICAgLy8gd2hpY2ggcG9pbnQgd2UgY2FuJ3QgbWVzcyB3aXRoIGl0IGFueW1vcmUuIENvbnRleHQgbWVudSBpc1xuICAgIC8vIGhhbmRsZWQgaW4gb25Nb3VzZURvd24gZm9yIHRoZXNlIGJyb3dzZXJzLlxuICAgIG9uKGQuc2Nyb2xsZXIsIFwiY29udGV4dG1lbnVcIiwgZnVuY3Rpb24gKGUpIHsgcmV0dXJuIG9uQ29udGV4dE1lbnUoY20sIGUpOyB9KTtcbiAgICBvbihkLmlucHV0LmdldEZpZWxkKCksIFwiY29udGV4dG1lbnVcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmICghZC5zY3JvbGxlci5jb250YWlucyhlLnRhcmdldCkpIHsgb25Db250ZXh0TWVudShjbSwgZSk7IH1cbiAgICB9KTtcblxuICAgIC8vIFVzZWQgdG8gc3VwcHJlc3MgbW91c2UgZXZlbnQgaGFuZGxpbmcgd2hlbiBhIHRvdWNoIGhhcHBlbnNcbiAgICB2YXIgdG91Y2hGaW5pc2hlZCwgcHJldlRvdWNoID0ge2VuZDogMH07XG4gICAgZnVuY3Rpb24gZmluaXNoVG91Y2goKSB7XG4gICAgICBpZiAoZC5hY3RpdmVUb3VjaCkge1xuICAgICAgICB0b3VjaEZpbmlzaGVkID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHJldHVybiBkLmFjdGl2ZVRvdWNoID0gbnVsbDsgfSwgMTAwMCk7XG4gICAgICAgIHByZXZUb3VjaCA9IGQuYWN0aXZlVG91Y2g7XG4gICAgICAgIHByZXZUb3VjaC5lbmQgPSArbmV3IERhdGU7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGlzTW91c2VMaWtlVG91Y2hFdmVudChlKSB7XG4gICAgICBpZiAoZS50b3VjaGVzLmxlbmd0aCAhPSAxKSB7IHJldHVybiBmYWxzZSB9XG4gICAgICB2YXIgdG91Y2ggPSBlLnRvdWNoZXNbMF07XG4gICAgICByZXR1cm4gdG91Y2gucmFkaXVzWCA8PSAxICYmIHRvdWNoLnJhZGl1c1kgPD0gMVxuICAgIH1cbiAgICBmdW5jdGlvbiBmYXJBd2F5KHRvdWNoLCBvdGhlcikge1xuICAgICAgaWYgKG90aGVyLmxlZnQgPT0gbnVsbCkgeyByZXR1cm4gdHJ1ZSB9XG4gICAgICB2YXIgZHggPSBvdGhlci5sZWZ0IC0gdG91Y2gubGVmdCwgZHkgPSBvdGhlci50b3AgLSB0b3VjaC50b3A7XG4gICAgICByZXR1cm4gZHggKiBkeCArIGR5ICogZHkgPiAyMCAqIDIwXG4gICAgfVxuICAgIG9uKGQuc2Nyb2xsZXIsIFwidG91Y2hzdGFydFwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKCFzaWduYWxET01FdmVudChjbSwgZSkgJiYgIWlzTW91c2VMaWtlVG91Y2hFdmVudChlKSAmJiAhY2xpY2tJbkd1dHRlcihjbSwgZSkpIHtcbiAgICAgICAgZC5pbnB1dC5lbnN1cmVQb2xsZWQoKTtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRvdWNoRmluaXNoZWQpO1xuICAgICAgICB2YXIgbm93ID0gK25ldyBEYXRlO1xuICAgICAgICBkLmFjdGl2ZVRvdWNoID0ge3N0YXJ0OiBub3csIG1vdmVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2OiBub3cgLSBwcmV2VG91Y2guZW5kIDw9IDMwMCA/IHByZXZUb3VjaCA6IG51bGx9O1xuICAgICAgICBpZiAoZS50b3VjaGVzLmxlbmd0aCA9PSAxKSB7XG4gICAgICAgICAgZC5hY3RpdmVUb3VjaC5sZWZ0ID0gZS50b3VjaGVzWzBdLnBhZ2VYO1xuICAgICAgICAgIGQuYWN0aXZlVG91Y2gudG9wID0gZS50b3VjaGVzWzBdLnBhZ2VZO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgb24oZC5zY3JvbGxlciwgXCJ0b3VjaG1vdmVcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGQuYWN0aXZlVG91Y2gpIHsgZC5hY3RpdmVUb3VjaC5tb3ZlZCA9IHRydWU7IH1cbiAgICB9KTtcbiAgICBvbihkLnNjcm9sbGVyLCBcInRvdWNoZW5kXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdG91Y2ggPSBkLmFjdGl2ZVRvdWNoO1xuICAgICAgaWYgKHRvdWNoICYmICFldmVudEluV2lkZ2V0KGQsIGUpICYmIHRvdWNoLmxlZnQgIT0gbnVsbCAmJlxuICAgICAgICAgICF0b3VjaC5tb3ZlZCAmJiBuZXcgRGF0ZSAtIHRvdWNoLnN0YXJ0IDwgMzAwKSB7XG4gICAgICAgIHZhciBwb3MgPSBjbS5jb29yZHNDaGFyKGQuYWN0aXZlVG91Y2gsIFwicGFnZVwiKSwgcmFuZ2U7XG4gICAgICAgIGlmICghdG91Y2gucHJldiB8fCBmYXJBd2F5KHRvdWNoLCB0b3VjaC5wcmV2KSkgLy8gU2luZ2xlIHRhcFxuICAgICAgICAgIHsgcmFuZ2UgPSBuZXcgUmFuZ2UocG9zLCBwb3MpOyB9XG4gICAgICAgIGVsc2UgaWYgKCF0b3VjaC5wcmV2LnByZXYgfHwgZmFyQXdheSh0b3VjaCwgdG91Y2gucHJldi5wcmV2KSkgLy8gRG91YmxlIHRhcFxuICAgICAgICAgIHsgcmFuZ2UgPSBjbS5maW5kV29yZEF0KHBvcyk7IH1cbiAgICAgICAgZWxzZSAvLyBUcmlwbGUgdGFwXG4gICAgICAgICAgeyByYW5nZSA9IG5ldyBSYW5nZShQb3MocG9zLmxpbmUsIDApLCBjbGlwUG9zKGNtLmRvYywgUG9zKHBvcy5saW5lICsgMSwgMCkpKTsgfVxuICAgICAgICBjbS5zZXRTZWxlY3Rpb24ocmFuZ2UuYW5jaG9yLCByYW5nZS5oZWFkKTtcbiAgICAgICAgY20uZm9jdXMoKTtcbiAgICAgICAgZV9wcmV2ZW50RGVmYXVsdChlKTtcbiAgICAgIH1cbiAgICAgIGZpbmlzaFRvdWNoKCk7XG4gICAgfSk7XG4gICAgb24oZC5zY3JvbGxlciwgXCJ0b3VjaGNhbmNlbFwiLCBmaW5pc2hUb3VjaCk7XG5cbiAgICAvLyBTeW5jIHNjcm9sbGluZyBiZXR3ZWVuIGZha2Ugc2Nyb2xsYmFycyBhbmQgcmVhbCBzY3JvbGxhYmxlXG4gICAgLy8gYXJlYSwgZW5zdXJlIHZpZXdwb3J0IGlzIHVwZGF0ZWQgd2hlbiBzY3JvbGxpbmcuXG4gICAgb24oZC5zY3JvbGxlciwgXCJzY3JvbGxcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGQuc2Nyb2xsZXIuY2xpZW50SGVpZ2h0KSB7XG4gICAgICAgIHVwZGF0ZVNjcm9sbFRvcChjbSwgZC5zY3JvbGxlci5zY3JvbGxUb3ApO1xuICAgICAgICBzZXRTY3JvbGxMZWZ0KGNtLCBkLnNjcm9sbGVyLnNjcm9sbExlZnQsIHRydWUpO1xuICAgICAgICBzaWduYWwoY20sIFwic2Nyb2xsXCIsIGNtKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIExpc3RlbiB0byB3aGVlbCBldmVudHMgaW4gb3JkZXIgdG8gdHJ5IGFuZCB1cGRhdGUgdGhlIHZpZXdwb3J0IG9uIHRpbWUuXG4gICAgb24oZC5zY3JvbGxlciwgXCJtb3VzZXdoZWVsXCIsIGZ1bmN0aW9uIChlKSB7IHJldHVybiBvblNjcm9sbFdoZWVsKGNtLCBlKTsgfSk7XG4gICAgb24oZC5zY3JvbGxlciwgXCJET01Nb3VzZVNjcm9sbFwiLCBmdW5jdGlvbiAoZSkgeyByZXR1cm4gb25TY3JvbGxXaGVlbChjbSwgZSk7IH0pO1xuXG4gICAgLy8gUHJldmVudCB3cmFwcGVyIGZyb20gZXZlciBzY3JvbGxpbmdcbiAgICBvbihkLndyYXBwZXIsIFwic2Nyb2xsXCIsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGQud3JhcHBlci5zY3JvbGxUb3AgPSBkLndyYXBwZXIuc2Nyb2xsTGVmdCA9IDA7IH0pO1xuXG4gICAgZC5kcmFnRnVuY3Rpb25zID0ge1xuICAgICAgZW50ZXI6IGZ1bmN0aW9uIChlKSB7aWYgKCFzaWduYWxET01FdmVudChjbSwgZSkpIHsgZV9zdG9wKGUpOyB9fSxcbiAgICAgIG92ZXI6IGZ1bmN0aW9uIChlKSB7aWYgKCFzaWduYWxET01FdmVudChjbSwgZSkpIHsgb25EcmFnT3ZlcihjbSwgZSk7IGVfc3RvcChlKTsgfX0sXG4gICAgICBzdGFydDogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIG9uRHJhZ1N0YXJ0KGNtLCBlKTsgfSxcbiAgICAgIGRyb3A6IG9wZXJhdGlvbihjbSwgb25Ecm9wKSxcbiAgICAgIGxlYXZlOiBmdW5jdGlvbiAoZSkge2lmICghc2lnbmFsRE9NRXZlbnQoY20sIGUpKSB7IGNsZWFyRHJhZ0N1cnNvcihjbSk7IH19XG4gICAgfTtcblxuICAgIHZhciBpbnAgPSBkLmlucHV0LmdldEZpZWxkKCk7XG4gICAgb24oaW5wLCBcImtleXVwXCIsIGZ1bmN0aW9uIChlKSB7IHJldHVybiBvbktleVVwLmNhbGwoY20sIGUpOyB9KTtcbiAgICBvbihpbnAsIFwia2V5ZG93blwiLCBvcGVyYXRpb24oY20sIG9uS2V5RG93bikpO1xuICAgIG9uKGlucCwgXCJrZXlwcmVzc1wiLCBvcGVyYXRpb24oY20sIG9uS2V5UHJlc3MpKTtcbiAgICBvbihpbnAsIFwiZm9jdXNcIiwgZnVuY3Rpb24gKGUpIHsgcmV0dXJuIG9uRm9jdXMoY20sIGUpOyB9KTtcbiAgICBvbihpbnAsIFwiYmx1clwiLCBmdW5jdGlvbiAoZSkgeyByZXR1cm4gb25CbHVyKGNtLCBlKTsgfSk7XG4gIH1cblxuICB2YXIgaW5pdEhvb2tzID0gW107XG4gIENvZGVNaXJyb3IuZGVmaW5lSW5pdEhvb2sgPSBmdW5jdGlvbiAoZikgeyByZXR1cm4gaW5pdEhvb2tzLnB1c2goZik7IH07XG5cbiAgLy8gSW5kZW50IHRoZSBnaXZlbiBsaW5lLiBUaGUgaG93IHBhcmFtZXRlciBjYW4gYmUgXCJzbWFydFwiLFxuICAvLyBcImFkZFwiL251bGwsIFwic3VidHJhY3RcIiwgb3IgXCJwcmV2XCIuIFdoZW4gYWdncmVzc2l2ZSBpcyBmYWxzZVxuICAvLyAodHlwaWNhbGx5IHNldCB0byB0cnVlIGZvciBmb3JjZWQgc2luZ2xlLWxpbmUgaW5kZW50cyksIGVtcHR5XG4gIC8vIGxpbmVzIGFyZSBub3QgaW5kZW50ZWQsIGFuZCBwbGFjZXMgd2hlcmUgdGhlIG1vZGUgcmV0dXJucyBQYXNzXG4gIC8vIGFyZSBsZWZ0IGFsb25lLlxuICBmdW5jdGlvbiBpbmRlbnRMaW5lKGNtLCBuLCBob3csIGFnZ3Jlc3NpdmUpIHtcbiAgICB2YXIgZG9jID0gY20uZG9jLCBzdGF0ZTtcbiAgICBpZiAoaG93ID09IG51bGwpIHsgaG93ID0gXCJhZGRcIjsgfVxuICAgIGlmIChob3cgPT0gXCJzbWFydFwiKSB7XG4gICAgICAvLyBGYWxsIGJhY2sgdG8gXCJwcmV2XCIgd2hlbiB0aGUgbW9kZSBkb2Vzbid0IGhhdmUgYW4gaW5kZW50YXRpb25cbiAgICAgIC8vIG1ldGhvZC5cbiAgICAgIGlmICghZG9jLm1vZGUuaW5kZW50KSB7IGhvdyA9IFwicHJldlwiOyB9XG4gICAgICBlbHNlIHsgc3RhdGUgPSBnZXRDb250ZXh0QmVmb3JlKGNtLCBuKS5zdGF0ZTsgfVxuICAgIH1cblxuICAgIHZhciB0YWJTaXplID0gY20ub3B0aW9ucy50YWJTaXplO1xuICAgIHZhciBsaW5lID0gZ2V0TGluZShkb2MsIG4pLCBjdXJTcGFjZSA9IGNvdW50Q29sdW1uKGxpbmUudGV4dCwgbnVsbCwgdGFiU2l6ZSk7XG4gICAgaWYgKGxpbmUuc3RhdGVBZnRlcikgeyBsaW5lLnN0YXRlQWZ0ZXIgPSBudWxsOyB9XG4gICAgdmFyIGN1clNwYWNlU3RyaW5nID0gbGluZS50ZXh0Lm1hdGNoKC9eXFxzKi8pWzBdLCBpbmRlbnRhdGlvbjtcbiAgICBpZiAoIWFnZ3Jlc3NpdmUgJiYgIS9cXFMvLnRlc3QobGluZS50ZXh0KSkge1xuICAgICAgaW5kZW50YXRpb24gPSAwO1xuICAgICAgaG93ID0gXCJub3RcIjtcbiAgICB9IGVsc2UgaWYgKGhvdyA9PSBcInNtYXJ0XCIpIHtcbiAgICAgIGluZGVudGF0aW9uID0gZG9jLm1vZGUuaW5kZW50KHN0YXRlLCBsaW5lLnRleHQuc2xpY2UoY3VyU3BhY2VTdHJpbmcubGVuZ3RoKSwgbGluZS50ZXh0KTtcbiAgICAgIGlmIChpbmRlbnRhdGlvbiA9PSBQYXNzIHx8IGluZGVudGF0aW9uID4gMTUwKSB7XG4gICAgICAgIGlmICghYWdncmVzc2l2ZSkgeyByZXR1cm4gfVxuICAgICAgICBob3cgPSBcInByZXZcIjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGhvdyA9PSBcInByZXZcIikge1xuICAgICAgaWYgKG4gPiBkb2MuZmlyc3QpIHsgaW5kZW50YXRpb24gPSBjb3VudENvbHVtbihnZXRMaW5lKGRvYywgbi0xKS50ZXh0LCBudWxsLCB0YWJTaXplKTsgfVxuICAgICAgZWxzZSB7IGluZGVudGF0aW9uID0gMDsgfVxuICAgIH0gZWxzZSBpZiAoaG93ID09IFwiYWRkXCIpIHtcbiAgICAgIGluZGVudGF0aW9uID0gY3VyU3BhY2UgKyBjbS5vcHRpb25zLmluZGVudFVuaXQ7XG4gICAgfSBlbHNlIGlmIChob3cgPT0gXCJzdWJ0cmFjdFwiKSB7XG4gICAgICBpbmRlbnRhdGlvbiA9IGN1clNwYWNlIC0gY20ub3B0aW9ucy5pbmRlbnRVbml0O1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGhvdyA9PSBcIm51bWJlclwiKSB7XG4gICAgICBpbmRlbnRhdGlvbiA9IGN1clNwYWNlICsgaG93O1xuICAgIH1cbiAgICBpbmRlbnRhdGlvbiA9IE1hdGgubWF4KDAsIGluZGVudGF0aW9uKTtcblxuICAgIHZhciBpbmRlbnRTdHJpbmcgPSBcIlwiLCBwb3MgPSAwO1xuICAgIGlmIChjbS5vcHRpb25zLmluZGVudFdpdGhUYWJzKVxuICAgICAgeyBmb3IgKHZhciBpID0gTWF0aC5mbG9vcihpbmRlbnRhdGlvbiAvIHRhYlNpemUpOyBpOyAtLWkpIHtwb3MgKz0gdGFiU2l6ZTsgaW5kZW50U3RyaW5nICs9IFwiXFx0XCI7fSB9XG4gICAgaWYgKHBvcyA8IGluZGVudGF0aW9uKSB7IGluZGVudFN0cmluZyArPSBzcGFjZVN0cihpbmRlbnRhdGlvbiAtIHBvcyk7IH1cblxuICAgIGlmIChpbmRlbnRTdHJpbmcgIT0gY3VyU3BhY2VTdHJpbmcpIHtcbiAgICAgIHJlcGxhY2VSYW5nZShkb2MsIGluZGVudFN0cmluZywgUG9zKG4sIDApLCBQb3MobiwgY3VyU3BhY2VTdHJpbmcubGVuZ3RoKSwgXCIraW5wdXRcIik7XG4gICAgICBsaW5lLnN0YXRlQWZ0ZXIgPSBudWxsO1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRW5zdXJlIHRoYXQsIGlmIHRoZSBjdXJzb3Igd2FzIGluIHRoZSB3aGl0ZXNwYWNlIGF0IHRoZSBzdGFydFxuICAgICAgLy8gb2YgdGhlIGxpbmUsIGl0IGlzIG1vdmVkIHRvIHRoZSBlbmQgb2YgdGhhdCBzcGFjZS5cbiAgICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IGRvYy5zZWwucmFuZ2VzLmxlbmd0aDsgaSQxKyspIHtcbiAgICAgICAgdmFyIHJhbmdlID0gZG9jLnNlbC5yYW5nZXNbaSQxXTtcbiAgICAgICAgaWYgKHJhbmdlLmhlYWQubGluZSA9PSBuICYmIHJhbmdlLmhlYWQuY2ggPCBjdXJTcGFjZVN0cmluZy5sZW5ndGgpIHtcbiAgICAgICAgICB2YXIgcG9zJDEgPSBQb3MobiwgY3VyU3BhY2VTdHJpbmcubGVuZ3RoKTtcbiAgICAgICAgICByZXBsYWNlT25lU2VsZWN0aW9uKGRvYywgaSQxLCBuZXcgUmFuZ2UocG9zJDEsIHBvcyQxKSk7XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFRoaXMgd2lsbCBiZSBzZXQgdG8gYSB7bGluZVdpc2U6IGJvb2wsIHRleHQ6IFtzdHJpbmddfSBvYmplY3QsIHNvXG4gIC8vIHRoYXQsIHdoZW4gcGFzdGluZywgd2Uga25vdyB3aGF0IGtpbmQgb2Ygc2VsZWN0aW9ucyB0aGUgY29waWVkXG4gIC8vIHRleHQgd2FzIG1hZGUgb3V0IG9mLlxuICB2YXIgbGFzdENvcGllZCA9IG51bGw7XG5cbiAgZnVuY3Rpb24gc2V0TGFzdENvcGllZChuZXdMYXN0Q29waWVkKSB7XG4gICAgbGFzdENvcGllZCA9IG5ld0xhc3RDb3BpZWQ7XG4gIH1cblxuICBmdW5jdGlvbiBhcHBseVRleHRJbnB1dChjbSwgaW5zZXJ0ZWQsIGRlbGV0ZWQsIHNlbCwgb3JpZ2luKSB7XG4gICAgdmFyIGRvYyA9IGNtLmRvYztcbiAgICBjbS5kaXNwbGF5LnNoaWZ0ID0gZmFsc2U7XG4gICAgaWYgKCFzZWwpIHsgc2VsID0gZG9jLnNlbDsgfVxuXG4gICAgdmFyIHJlY2VudCA9ICtuZXcgRGF0ZSAtIDIwMDtcbiAgICB2YXIgcGFzdGUgPSBvcmlnaW4gPT0gXCJwYXN0ZVwiIHx8IGNtLnN0YXRlLnBhc3RlSW5jb21pbmcgPiByZWNlbnQ7XG4gICAgdmFyIHRleHRMaW5lcyA9IHNwbGl0TGluZXNBdXRvKGluc2VydGVkKSwgbXVsdGlQYXN0ZSA9IG51bGw7XG4gICAgLy8gV2hlbiBwYXN0aW5nIE4gbGluZXMgaW50byBOIHNlbGVjdGlvbnMsIGluc2VydCBvbmUgbGluZSBwZXIgc2VsZWN0aW9uXG4gICAgaWYgKHBhc3RlICYmIHNlbC5yYW5nZXMubGVuZ3RoID4gMSkge1xuICAgICAgaWYgKGxhc3RDb3BpZWQgJiYgbGFzdENvcGllZC50ZXh0LmpvaW4oXCJcXG5cIikgPT0gaW5zZXJ0ZWQpIHtcbiAgICAgICAgaWYgKHNlbC5yYW5nZXMubGVuZ3RoICUgbGFzdENvcGllZC50ZXh0Lmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgbXVsdGlQYXN0ZSA9IFtdO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGFzdENvcGllZC50ZXh0Lmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgeyBtdWx0aVBhc3RlLnB1c2goZG9jLnNwbGl0TGluZXMobGFzdENvcGllZC50ZXh0W2ldKSk7IH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0ZXh0TGluZXMubGVuZ3RoID09IHNlbC5yYW5nZXMubGVuZ3RoICYmIGNtLm9wdGlvbnMucGFzdGVMaW5lc1BlclNlbGVjdGlvbikge1xuICAgICAgICBtdWx0aVBhc3RlID0gbWFwKHRleHRMaW5lcywgZnVuY3Rpb24gKGwpIHsgcmV0dXJuIFtsXTsgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHVwZGF0ZUlucHV0ID0gY20uY3VyT3AudXBkYXRlSW5wdXQ7XG4gICAgLy8gTm9ybWFsIGJlaGF2aW9yIGlzIHRvIGluc2VydCB0aGUgbmV3IHRleHQgaW50byBldmVyeSBzZWxlY3Rpb25cbiAgICBmb3IgKHZhciBpJDEgPSBzZWwucmFuZ2VzLmxlbmd0aCAtIDE7IGkkMSA+PSAwOyBpJDEtLSkge1xuICAgICAgdmFyIHJhbmdlID0gc2VsLnJhbmdlc1tpJDFdO1xuICAgICAgdmFyIGZyb20gPSByYW5nZS5mcm9tKCksIHRvID0gcmFuZ2UudG8oKTtcbiAgICAgIGlmIChyYW5nZS5lbXB0eSgpKSB7XG4gICAgICAgIGlmIChkZWxldGVkICYmIGRlbGV0ZWQgPiAwKSAvLyBIYW5kbGUgZGVsZXRpb25cbiAgICAgICAgICB7IGZyb20gPSBQb3MoZnJvbS5saW5lLCBmcm9tLmNoIC0gZGVsZXRlZCk7IH1cbiAgICAgICAgZWxzZSBpZiAoY20uc3RhdGUub3ZlcndyaXRlICYmICFwYXN0ZSkgLy8gSGFuZGxlIG92ZXJ3cml0ZVxuICAgICAgICAgIHsgdG8gPSBQb3ModG8ubGluZSwgTWF0aC5taW4oZ2V0TGluZShkb2MsIHRvLmxpbmUpLnRleHQubGVuZ3RoLCB0by5jaCArIGxzdCh0ZXh0TGluZXMpLmxlbmd0aCkpOyB9XG4gICAgICAgIGVsc2UgaWYgKHBhc3RlICYmIGxhc3RDb3BpZWQgJiYgbGFzdENvcGllZC5saW5lV2lzZSAmJiBsYXN0Q29waWVkLnRleHQuam9pbihcIlxcblwiKSA9PSB0ZXh0TGluZXMuam9pbihcIlxcblwiKSlcbiAgICAgICAgICB7IGZyb20gPSB0byA9IFBvcyhmcm9tLmxpbmUsIDApOyB9XG4gICAgICB9XG4gICAgICB2YXIgY2hhbmdlRXZlbnQgPSB7ZnJvbTogZnJvbSwgdG86IHRvLCB0ZXh0OiBtdWx0aVBhc3RlID8gbXVsdGlQYXN0ZVtpJDEgJSBtdWx0aVBhc3RlLmxlbmd0aF0gOiB0ZXh0TGluZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luOiBvcmlnaW4gfHwgKHBhc3RlID8gXCJwYXN0ZVwiIDogY20uc3RhdGUuY3V0SW5jb21pbmcgPiByZWNlbnQgPyBcImN1dFwiIDogXCIraW5wdXRcIil9O1xuICAgICAgbWFrZUNoYW5nZShjbS5kb2MsIGNoYW5nZUV2ZW50KTtcbiAgICAgIHNpZ25hbExhdGVyKGNtLCBcImlucHV0UmVhZFwiLCBjbSwgY2hhbmdlRXZlbnQpO1xuICAgIH1cbiAgICBpZiAoaW5zZXJ0ZWQgJiYgIXBhc3RlKVxuICAgICAgeyB0cmlnZ2VyRWxlY3RyaWMoY20sIGluc2VydGVkKTsgfVxuXG4gICAgZW5zdXJlQ3Vyc29yVmlzaWJsZShjbSk7XG4gICAgaWYgKGNtLmN1ck9wLnVwZGF0ZUlucHV0IDwgMikgeyBjbS5jdXJPcC51cGRhdGVJbnB1dCA9IHVwZGF0ZUlucHV0OyB9XG4gICAgY20uY3VyT3AudHlwaW5nID0gdHJ1ZTtcbiAgICBjbS5zdGF0ZS5wYXN0ZUluY29taW5nID0gY20uc3RhdGUuY3V0SW5jb21pbmcgPSAtMTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZVBhc3RlKGUsIGNtKSB7XG4gICAgdmFyIHBhc3RlZCA9IGUuY2xpcGJvYXJkRGF0YSAmJiBlLmNsaXBib2FyZERhdGEuZ2V0RGF0YShcIlRleHRcIik7XG4gICAgaWYgKHBhc3RlZCkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgaWYgKCFjbS5pc1JlYWRPbmx5KCkgJiYgIWNtLm9wdGlvbnMuZGlzYWJsZUlucHV0KVxuICAgICAgICB7IHJ1bkluT3AoY20sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFwcGx5VGV4dElucHV0KGNtLCBwYXN0ZWQsIDAsIG51bGwsIFwicGFzdGVcIik7IH0pOyB9XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHRyaWdnZXJFbGVjdHJpYyhjbSwgaW5zZXJ0ZWQpIHtcbiAgICAvLyBXaGVuIGFuICdlbGVjdHJpYycgY2hhcmFjdGVyIGlzIGluc2VydGVkLCBpbW1lZGlhdGVseSB0cmlnZ2VyIGEgcmVpbmRlbnRcbiAgICBpZiAoIWNtLm9wdGlvbnMuZWxlY3RyaWNDaGFycyB8fCAhY20ub3B0aW9ucy5zbWFydEluZGVudCkgeyByZXR1cm4gfVxuICAgIHZhciBzZWwgPSBjbS5kb2Muc2VsO1xuXG4gICAgZm9yICh2YXIgaSA9IHNlbC5yYW5nZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciByYW5nZSA9IHNlbC5yYW5nZXNbaV07XG4gICAgICBpZiAocmFuZ2UuaGVhZC5jaCA+IDEwMCB8fCAoaSAmJiBzZWwucmFuZ2VzW2kgLSAxXS5oZWFkLmxpbmUgPT0gcmFuZ2UuaGVhZC5saW5lKSkgeyBjb250aW51ZSB9XG4gICAgICB2YXIgbW9kZSA9IGNtLmdldE1vZGVBdChyYW5nZS5oZWFkKTtcbiAgICAgIHZhciBpbmRlbnRlZCA9IGZhbHNlO1xuICAgICAgaWYgKG1vZGUuZWxlY3RyaWNDaGFycykge1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG1vZGUuZWxlY3RyaWNDaGFycy5sZW5ndGg7IGorKylcbiAgICAgICAgICB7IGlmIChpbnNlcnRlZC5pbmRleE9mKG1vZGUuZWxlY3RyaWNDaGFycy5jaGFyQXQoaikpID4gLTEpIHtcbiAgICAgICAgICAgIGluZGVudGVkID0gaW5kZW50TGluZShjbSwgcmFuZ2UuaGVhZC5saW5lLCBcInNtYXJ0XCIpO1xuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9IH1cbiAgICAgIH0gZWxzZSBpZiAobW9kZS5lbGVjdHJpY0lucHV0KSB7XG4gICAgICAgIGlmIChtb2RlLmVsZWN0cmljSW5wdXQudGVzdChnZXRMaW5lKGNtLmRvYywgcmFuZ2UuaGVhZC5saW5lKS50ZXh0LnNsaWNlKDAsIHJhbmdlLmhlYWQuY2gpKSlcbiAgICAgICAgICB7IGluZGVudGVkID0gaW5kZW50TGluZShjbSwgcmFuZ2UuaGVhZC5saW5lLCBcInNtYXJ0XCIpOyB9XG4gICAgICB9XG4gICAgICBpZiAoaW5kZW50ZWQpIHsgc2lnbmFsTGF0ZXIoY20sIFwiZWxlY3RyaWNJbnB1dFwiLCBjbSwgcmFuZ2UuaGVhZC5saW5lKTsgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNvcHlhYmxlUmFuZ2VzKGNtKSB7XG4gICAgdmFyIHRleHQgPSBbXSwgcmFuZ2VzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbS5kb2Muc2VsLnJhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGxpbmUgPSBjbS5kb2Muc2VsLnJhbmdlc1tpXS5oZWFkLmxpbmU7XG4gICAgICB2YXIgbGluZVJhbmdlID0ge2FuY2hvcjogUG9zKGxpbmUsIDApLCBoZWFkOiBQb3MobGluZSArIDEsIDApfTtcbiAgICAgIHJhbmdlcy5wdXNoKGxpbmVSYW5nZSk7XG4gICAgICB0ZXh0LnB1c2goY20uZ2V0UmFuZ2UobGluZVJhbmdlLmFuY2hvciwgbGluZVJhbmdlLmhlYWQpKTtcbiAgICB9XG4gICAgcmV0dXJuIHt0ZXh0OiB0ZXh0LCByYW5nZXM6IHJhbmdlc31cbiAgfVxuXG4gIGZ1bmN0aW9uIGRpc2FibGVCcm93c2VyTWFnaWMoZmllbGQsIHNwZWxsY2hlY2ssIGF1dG9jb3JyZWN0LCBhdXRvY2FwaXRhbGl6ZSkge1xuICAgIGZpZWxkLnNldEF0dHJpYnV0ZShcImF1dG9jb3JyZWN0XCIsIGF1dG9jb3JyZWN0ID8gXCJcIiA6IFwib2ZmXCIpO1xuICAgIGZpZWxkLnNldEF0dHJpYnV0ZShcImF1dG9jYXBpdGFsaXplXCIsIGF1dG9jYXBpdGFsaXplID8gXCJcIiA6IFwib2ZmXCIpO1xuICAgIGZpZWxkLnNldEF0dHJpYnV0ZShcInNwZWxsY2hlY2tcIiwgISFzcGVsbGNoZWNrKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhpZGRlblRleHRhcmVhKCkge1xuICAgIHZhciB0ZSA9IGVsdChcInRleHRhcmVhXCIsIG51bGwsIG51bGwsIFwicG9zaXRpb246IGFic29sdXRlOyBib3R0b206IC0xZW07IHBhZGRpbmc6IDA7IHdpZHRoOiAxcHg7IGhlaWdodDogMWVtOyBvdXRsaW5lOiBub25lXCIpO1xuICAgIHZhciBkaXYgPSBlbHQoXCJkaXZcIiwgW3RlXSwgbnVsbCwgXCJvdmVyZmxvdzogaGlkZGVuOyBwb3NpdGlvbjogcmVsYXRpdmU7IHdpZHRoOiAzcHg7IGhlaWdodDogMHB4O1wiKTtcbiAgICAvLyBUaGUgdGV4dGFyZWEgaXMga2VwdCBwb3NpdGlvbmVkIG5lYXIgdGhlIGN1cnNvciB0byBwcmV2ZW50IHRoZVxuICAgIC8vIGZhY3QgdGhhdCBpdCdsbCBiZSBzY3JvbGxlZCBpbnRvIHZpZXcgb24gaW5wdXQgZnJvbSBzY3JvbGxpbmdcbiAgICAvLyBvdXIgZmFrZSBjdXJzb3Igb3V0IG9mIHZpZXcuIE9uIHdlYmtpdCwgd2hlbiB3cmFwPW9mZiwgcGFzdGUgaXNcbiAgICAvLyB2ZXJ5IHNsb3cuIFNvIG1ha2UgdGhlIGFyZWEgd2lkZSBpbnN0ZWFkLlxuICAgIGlmICh3ZWJraXQpIHsgdGUuc3R5bGUud2lkdGggPSBcIjEwMDBweFwiOyB9XG4gICAgZWxzZSB7IHRlLnNldEF0dHJpYnV0ZShcIndyYXBcIiwgXCJvZmZcIik7IH1cbiAgICAvLyBJZiBib3JkZXI6IDA7IC0tIGlPUyBmYWlscyB0byBvcGVuIGtleWJvYXJkIChpc3N1ZSAjMTI4NylcbiAgICBpZiAoaW9zKSB7IHRlLnN0eWxlLmJvcmRlciA9IFwiMXB4IHNvbGlkIGJsYWNrXCI7IH1cbiAgICBkaXNhYmxlQnJvd3Nlck1hZ2ljKHRlKTtcbiAgICByZXR1cm4gZGl2XG4gIH1cblxuICAvLyBUaGUgcHVibGljbHkgdmlzaWJsZSBBUEkuIE5vdGUgdGhhdCBtZXRob2RPcChmKSBtZWFuc1xuICAvLyAnd3JhcCBmIGluIGFuIG9wZXJhdGlvbiwgcGVyZm9ybWVkIG9uIGl0cyBgdGhpc2AgcGFyYW1ldGVyJy5cblxuICAvLyBUaGlzIGlzIG5vdCB0aGUgY29tcGxldGUgc2V0IG9mIGVkaXRvciBtZXRob2RzLiBNb3N0IG9mIHRoZVxuICAvLyBtZXRob2RzIGRlZmluZWQgb24gdGhlIERvYyB0eXBlIGFyZSBhbHNvIGluamVjdGVkIGludG9cbiAgLy8gQ29kZU1pcnJvci5wcm90b3R5cGUsIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBhbmRcbiAgLy8gY29udmVuaWVuY2UuXG5cbiAgZnVuY3Rpb24gYWRkRWRpdG9yTWV0aG9kcyhDb2RlTWlycm9yKSB7XG4gICAgdmFyIG9wdGlvbkhhbmRsZXJzID0gQ29kZU1pcnJvci5vcHRpb25IYW5kbGVycztcblxuICAgIHZhciBoZWxwZXJzID0gQ29kZU1pcnJvci5oZWxwZXJzID0ge307XG5cbiAgICBDb2RlTWlycm9yLnByb3RvdHlwZSA9IHtcbiAgICAgIGNvbnN0cnVjdG9yOiBDb2RlTWlycm9yLFxuICAgICAgZm9jdXM6IGZ1bmN0aW9uKCl7d2luZG93LmZvY3VzKCk7IHRoaXMuZGlzcGxheS5pbnB1dC5mb2N1cygpO30sXG5cbiAgICAgIHNldE9wdGlvbjogZnVuY3Rpb24ob3B0aW9uLCB2YWx1ZSkge1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucywgb2xkID0gb3B0aW9uc1tvcHRpb25dO1xuICAgICAgICBpZiAob3B0aW9uc1tvcHRpb25dID09IHZhbHVlICYmIG9wdGlvbiAhPSBcIm1vZGVcIikgeyByZXR1cm4gfVxuICAgICAgICBvcHRpb25zW29wdGlvbl0gPSB2YWx1ZTtcbiAgICAgICAgaWYgKG9wdGlvbkhhbmRsZXJzLmhhc093blByb3BlcnR5KG9wdGlvbikpXG4gICAgICAgICAgeyBvcGVyYXRpb24odGhpcywgb3B0aW9uSGFuZGxlcnNbb3B0aW9uXSkodGhpcywgdmFsdWUsIG9sZCk7IH1cbiAgICAgICAgc2lnbmFsKHRoaXMsIFwib3B0aW9uQ2hhbmdlXCIsIHRoaXMsIG9wdGlvbik7XG4gICAgICB9LFxuXG4gICAgICBnZXRPcHRpb246IGZ1bmN0aW9uKG9wdGlvbikge3JldHVybiB0aGlzLm9wdGlvbnNbb3B0aW9uXX0sXG4gICAgICBnZXREb2M6IGZ1bmN0aW9uKCkge3JldHVybiB0aGlzLmRvY30sXG5cbiAgICAgIGFkZEtleU1hcDogZnVuY3Rpb24obWFwLCBib3R0b20pIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5rZXlNYXBzW2JvdHRvbSA/IFwicHVzaFwiIDogXCJ1bnNoaWZ0XCJdKGdldEtleU1hcChtYXApKTtcbiAgICAgIH0sXG4gICAgICByZW1vdmVLZXlNYXA6IGZ1bmN0aW9uKG1hcCkge1xuICAgICAgICB2YXIgbWFwcyA9IHRoaXMuc3RhdGUua2V5TWFwcztcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXBzLmxlbmd0aDsgKytpKVxuICAgICAgICAgIHsgaWYgKG1hcHNbaV0gPT0gbWFwIHx8IG1hcHNbaV0ubmFtZSA9PSBtYXApIHtcbiAgICAgICAgICAgIG1hcHMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICB9IH1cbiAgICAgIH0sXG5cbiAgICAgIGFkZE92ZXJsYXk6IG1ldGhvZE9wKGZ1bmN0aW9uKHNwZWMsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIG1vZGUgPSBzcGVjLnRva2VuID8gc3BlYyA6IENvZGVNaXJyb3IuZ2V0TW9kZSh0aGlzLm9wdGlvbnMsIHNwZWMpO1xuICAgICAgICBpZiAobW9kZS5zdGFydFN0YXRlKSB7IHRocm93IG5ldyBFcnJvcihcIk92ZXJsYXlzIG1heSBub3QgYmUgc3RhdGVmdWwuXCIpIH1cbiAgICAgICAgaW5zZXJ0U29ydGVkKHRoaXMuc3RhdGUub3ZlcmxheXMsXG4gICAgICAgICAgICAgICAgICAgICB7bW9kZTogbW9kZSwgbW9kZVNwZWM6IHNwZWMsIG9wYXF1ZTogb3B0aW9ucyAmJiBvcHRpb25zLm9wYXF1ZSxcbiAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eTogKG9wdGlvbnMgJiYgb3B0aW9ucy5wcmlvcml0eSkgfHwgMH0sXG4gICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAob3ZlcmxheSkgeyByZXR1cm4gb3ZlcmxheS5wcmlvcml0eTsgfSk7XG4gICAgICAgIHRoaXMuc3RhdGUubW9kZUdlbisrO1xuICAgICAgICByZWdDaGFuZ2UodGhpcyk7XG4gICAgICB9KSxcbiAgICAgIHJlbW92ZU92ZXJsYXk6IG1ldGhvZE9wKGZ1bmN0aW9uKHNwZWMpIHtcbiAgICAgICAgdmFyIG92ZXJsYXlzID0gdGhpcy5zdGF0ZS5vdmVybGF5cztcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvdmVybGF5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIHZhciBjdXIgPSBvdmVybGF5c1tpXS5tb2RlU3BlYztcbiAgICAgICAgICBpZiAoY3VyID09IHNwZWMgfHwgdHlwZW9mIHNwZWMgPT0gXCJzdHJpbmdcIiAmJiBjdXIubmFtZSA9PSBzcGVjKSB7XG4gICAgICAgICAgICBvdmVybGF5cy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlLm1vZGVHZW4rKztcbiAgICAgICAgICAgIHJlZ0NoYW5nZSh0aGlzKTtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSksXG5cbiAgICAgIGluZGVudExpbmU6IG1ldGhvZE9wKGZ1bmN0aW9uKG4sIGRpciwgYWdncmVzc2l2ZSkge1xuICAgICAgICBpZiAodHlwZW9mIGRpciAhPSBcInN0cmluZ1wiICYmIHR5cGVvZiBkaXIgIT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIGlmIChkaXIgPT0gbnVsbCkgeyBkaXIgPSB0aGlzLm9wdGlvbnMuc21hcnRJbmRlbnQgPyBcInNtYXJ0XCIgOiBcInByZXZcIjsgfVxuICAgICAgICAgIGVsc2UgeyBkaXIgPSBkaXIgPyBcImFkZFwiIDogXCJzdWJ0cmFjdFwiOyB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzTGluZSh0aGlzLmRvYywgbikpIHsgaW5kZW50TGluZSh0aGlzLCBuLCBkaXIsIGFnZ3Jlc3NpdmUpOyB9XG4gICAgICB9KSxcbiAgICAgIGluZGVudFNlbGVjdGlvbjogbWV0aG9kT3AoZnVuY3Rpb24oaG93KSB7XG4gICAgICAgIHZhciByYW5nZXMgPSB0aGlzLmRvYy5zZWwucmFuZ2VzLCBlbmQgPSAtMTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgcmFuZ2UgPSByYW5nZXNbaV07XG4gICAgICAgICAgaWYgKCFyYW5nZS5lbXB0eSgpKSB7XG4gICAgICAgICAgICB2YXIgZnJvbSA9IHJhbmdlLmZyb20oKSwgdG8gPSByYW5nZS50bygpO1xuICAgICAgICAgICAgdmFyIHN0YXJ0ID0gTWF0aC5tYXgoZW5kLCBmcm9tLmxpbmUpO1xuICAgICAgICAgICAgZW5kID0gTWF0aC5taW4odGhpcy5sYXN0TGluZSgpLCB0by5saW5lIC0gKHRvLmNoID8gMCA6IDEpKSArIDE7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gc3RhcnQ7IGogPCBlbmQ7ICsrailcbiAgICAgICAgICAgICAgeyBpbmRlbnRMaW5lKHRoaXMsIGosIGhvdyk7IH1cbiAgICAgICAgICAgIHZhciBuZXdSYW5nZXMgPSB0aGlzLmRvYy5zZWwucmFuZ2VzO1xuICAgICAgICAgICAgaWYgKGZyb20uY2ggPT0gMCAmJiByYW5nZXMubGVuZ3RoID09IG5ld1Jhbmdlcy5sZW5ndGggJiYgbmV3UmFuZ2VzW2ldLmZyb20oKS5jaCA+IDApXG4gICAgICAgICAgICAgIHsgcmVwbGFjZU9uZVNlbGVjdGlvbih0aGlzLmRvYywgaSwgbmV3IFJhbmdlKGZyb20sIG5ld1Jhbmdlc1tpXS50bygpKSwgc2VsX2RvbnRTY3JvbGwpOyB9XG4gICAgICAgICAgfSBlbHNlIGlmIChyYW5nZS5oZWFkLmxpbmUgPiBlbmQpIHtcbiAgICAgICAgICAgIGluZGVudExpbmUodGhpcywgcmFuZ2UuaGVhZC5saW5lLCBob3csIHRydWUpO1xuICAgICAgICAgICAgZW5kID0gcmFuZ2UuaGVhZC5saW5lO1xuICAgICAgICAgICAgaWYgKGkgPT0gdGhpcy5kb2Muc2VsLnByaW1JbmRleCkgeyBlbnN1cmVDdXJzb3JWaXNpYmxlKHRoaXMpOyB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSxcblxuICAgICAgLy8gRmV0Y2ggdGhlIHBhcnNlciB0b2tlbiBmb3IgYSBnaXZlbiBjaGFyYWN0ZXIuIFVzZWZ1bCBmb3IgaGFja3NcbiAgICAgIC8vIHRoYXQgd2FudCB0byBpbnNwZWN0IHRoZSBtb2RlIHN0YXRlIChzYXksIGZvciBjb21wbGV0aW9uKS5cbiAgICAgIGdldFRva2VuQXQ6IGZ1bmN0aW9uKHBvcywgcHJlY2lzZSkge1xuICAgICAgICByZXR1cm4gdGFrZVRva2VuKHRoaXMsIHBvcywgcHJlY2lzZSlcbiAgICAgIH0sXG5cbiAgICAgIGdldExpbmVUb2tlbnM6IGZ1bmN0aW9uKGxpbmUsIHByZWNpc2UpIHtcbiAgICAgICAgcmV0dXJuIHRha2VUb2tlbih0aGlzLCBQb3MobGluZSksIHByZWNpc2UsIHRydWUpXG4gICAgICB9LFxuXG4gICAgICBnZXRUb2tlblR5cGVBdDogZnVuY3Rpb24ocG9zKSB7XG4gICAgICAgIHBvcyA9IGNsaXBQb3ModGhpcy5kb2MsIHBvcyk7XG4gICAgICAgIHZhciBzdHlsZXMgPSBnZXRMaW5lU3R5bGVzKHRoaXMsIGdldExpbmUodGhpcy5kb2MsIHBvcy5saW5lKSk7XG4gICAgICAgIHZhciBiZWZvcmUgPSAwLCBhZnRlciA9IChzdHlsZXMubGVuZ3RoIC0gMSkgLyAyLCBjaCA9IHBvcy5jaDtcbiAgICAgICAgdmFyIHR5cGU7XG4gICAgICAgIGlmIChjaCA9PSAwKSB7IHR5cGUgPSBzdHlsZXNbMl07IH1cbiAgICAgICAgZWxzZSB7IGZvciAoOzspIHtcbiAgICAgICAgICB2YXIgbWlkID0gKGJlZm9yZSArIGFmdGVyKSA+PiAxO1xuICAgICAgICAgIGlmICgobWlkID8gc3R5bGVzW21pZCAqIDIgLSAxXSA6IDApID49IGNoKSB7IGFmdGVyID0gbWlkOyB9XG4gICAgICAgICAgZWxzZSBpZiAoc3R5bGVzW21pZCAqIDIgKyAxXSA8IGNoKSB7IGJlZm9yZSA9IG1pZCArIDE7IH1cbiAgICAgICAgICBlbHNlIHsgdHlwZSA9IHN0eWxlc1ttaWQgKiAyICsgMl07IGJyZWFrIH1cbiAgICAgICAgfSB9XG4gICAgICAgIHZhciBjdXQgPSB0eXBlID8gdHlwZS5pbmRleE9mKFwib3ZlcmxheSBcIikgOiAtMTtcbiAgICAgICAgcmV0dXJuIGN1dCA8IDAgPyB0eXBlIDogY3V0ID09IDAgPyBudWxsIDogdHlwZS5zbGljZSgwLCBjdXQgLSAxKVxuICAgICAgfSxcblxuICAgICAgZ2V0TW9kZUF0OiBmdW5jdGlvbihwb3MpIHtcbiAgICAgICAgdmFyIG1vZGUgPSB0aGlzLmRvYy5tb2RlO1xuICAgICAgICBpZiAoIW1vZGUuaW5uZXJNb2RlKSB7IHJldHVybiBtb2RlIH1cbiAgICAgICAgcmV0dXJuIENvZGVNaXJyb3IuaW5uZXJNb2RlKG1vZGUsIHRoaXMuZ2V0VG9rZW5BdChwb3MpLnN0YXRlKS5tb2RlXG4gICAgICB9LFxuXG4gICAgICBnZXRIZWxwZXI6IGZ1bmN0aW9uKHBvcywgdHlwZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRIZWxwZXJzKHBvcywgdHlwZSlbMF1cbiAgICAgIH0sXG5cbiAgICAgIGdldEhlbHBlcnM6IGZ1bmN0aW9uKHBvcywgdHlwZSkge1xuICAgICAgICB2YXIgZm91bmQgPSBbXTtcbiAgICAgICAgaWYgKCFoZWxwZXJzLmhhc093blByb3BlcnR5KHR5cGUpKSB7IHJldHVybiBmb3VuZCB9XG4gICAgICAgIHZhciBoZWxwID0gaGVscGVyc1t0eXBlXSwgbW9kZSA9IHRoaXMuZ2V0TW9kZUF0KHBvcyk7XG4gICAgICAgIGlmICh0eXBlb2YgbW9kZVt0eXBlXSA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgaWYgKGhlbHBbbW9kZVt0eXBlXV0pIHsgZm91bmQucHVzaChoZWxwW21vZGVbdHlwZV1dKTsgfVxuICAgICAgICB9IGVsc2UgaWYgKG1vZGVbdHlwZV0pIHtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1vZGVbdHlwZV0ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciB2YWwgPSBoZWxwW21vZGVbdHlwZV1baV1dO1xuICAgICAgICAgICAgaWYgKHZhbCkgeyBmb3VuZC5wdXNoKHZhbCk7IH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAobW9kZS5oZWxwZXJUeXBlICYmIGhlbHBbbW9kZS5oZWxwZXJUeXBlXSkge1xuICAgICAgICAgIGZvdW5kLnB1c2goaGVscFttb2RlLmhlbHBlclR5cGVdKTtcbiAgICAgICAgfSBlbHNlIGlmIChoZWxwW21vZGUubmFtZV0pIHtcbiAgICAgICAgICBmb3VuZC5wdXNoKGhlbHBbbW9kZS5uYW1lXSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgaGVscC5fZ2xvYmFsLmxlbmd0aDsgaSQxKyspIHtcbiAgICAgICAgICB2YXIgY3VyID0gaGVscC5fZ2xvYmFsW2kkMV07XG4gICAgICAgICAgaWYgKGN1ci5wcmVkKG1vZGUsIHRoaXMpICYmIGluZGV4T2YoZm91bmQsIGN1ci52YWwpID09IC0xKVxuICAgICAgICAgICAgeyBmb3VuZC5wdXNoKGN1ci52YWwpOyB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZvdW5kXG4gICAgICB9LFxuXG4gICAgICBnZXRTdGF0ZUFmdGVyOiBmdW5jdGlvbihsaW5lLCBwcmVjaXNlKSB7XG4gICAgICAgIHZhciBkb2MgPSB0aGlzLmRvYztcbiAgICAgICAgbGluZSA9IGNsaXBMaW5lKGRvYywgbGluZSA9PSBudWxsID8gZG9jLmZpcnN0ICsgZG9jLnNpemUgLSAxOiBsaW5lKTtcbiAgICAgICAgcmV0dXJuIGdldENvbnRleHRCZWZvcmUodGhpcywgbGluZSArIDEsIHByZWNpc2UpLnN0YXRlXG4gICAgICB9LFxuXG4gICAgICBjdXJzb3JDb29yZHM6IGZ1bmN0aW9uKHN0YXJ0LCBtb2RlKSB7XG4gICAgICAgIHZhciBwb3MsIHJhbmdlID0gdGhpcy5kb2Muc2VsLnByaW1hcnkoKTtcbiAgICAgICAgaWYgKHN0YXJ0ID09IG51bGwpIHsgcG9zID0gcmFuZ2UuaGVhZDsgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2Ygc3RhcnQgPT0gXCJvYmplY3RcIikgeyBwb3MgPSBjbGlwUG9zKHRoaXMuZG9jLCBzdGFydCk7IH1cbiAgICAgICAgZWxzZSB7IHBvcyA9IHN0YXJ0ID8gcmFuZ2UuZnJvbSgpIDogcmFuZ2UudG8oKTsgfVxuICAgICAgICByZXR1cm4gY3Vyc29yQ29vcmRzKHRoaXMsIHBvcywgbW9kZSB8fCBcInBhZ2VcIilcbiAgICAgIH0sXG5cbiAgICAgIGNoYXJDb29yZHM6IGZ1bmN0aW9uKHBvcywgbW9kZSkge1xuICAgICAgICByZXR1cm4gY2hhckNvb3Jkcyh0aGlzLCBjbGlwUG9zKHRoaXMuZG9jLCBwb3MpLCBtb2RlIHx8IFwicGFnZVwiKVxuICAgICAgfSxcblxuICAgICAgY29vcmRzQ2hhcjogZnVuY3Rpb24oY29vcmRzLCBtb2RlKSB7XG4gICAgICAgIGNvb3JkcyA9IGZyb21Db29yZFN5c3RlbSh0aGlzLCBjb29yZHMsIG1vZGUgfHwgXCJwYWdlXCIpO1xuICAgICAgICByZXR1cm4gY29vcmRzQ2hhcih0aGlzLCBjb29yZHMubGVmdCwgY29vcmRzLnRvcClcbiAgICAgIH0sXG5cbiAgICAgIGxpbmVBdEhlaWdodDogZnVuY3Rpb24oaGVpZ2h0LCBtb2RlKSB7XG4gICAgICAgIGhlaWdodCA9IGZyb21Db29yZFN5c3RlbSh0aGlzLCB7dG9wOiBoZWlnaHQsIGxlZnQ6IDB9LCBtb2RlIHx8IFwicGFnZVwiKS50b3A7XG4gICAgICAgIHJldHVybiBsaW5lQXRIZWlnaHQodGhpcy5kb2MsIGhlaWdodCArIHRoaXMuZGlzcGxheS52aWV3T2Zmc2V0KVxuICAgICAgfSxcbiAgICAgIGhlaWdodEF0TGluZTogZnVuY3Rpb24obGluZSwgbW9kZSwgaW5jbHVkZVdpZGdldHMpIHtcbiAgICAgICAgdmFyIGVuZCA9IGZhbHNlLCBsaW5lT2JqO1xuICAgICAgICBpZiAodHlwZW9mIGxpbmUgPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIHZhciBsYXN0ID0gdGhpcy5kb2MuZmlyc3QgKyB0aGlzLmRvYy5zaXplIC0gMTtcbiAgICAgICAgICBpZiAobGluZSA8IHRoaXMuZG9jLmZpcnN0KSB7IGxpbmUgPSB0aGlzLmRvYy5maXJzdDsgfVxuICAgICAgICAgIGVsc2UgaWYgKGxpbmUgPiBsYXN0KSB7IGxpbmUgPSBsYXN0OyBlbmQgPSB0cnVlOyB9XG4gICAgICAgICAgbGluZU9iaiA9IGdldExpbmUodGhpcy5kb2MsIGxpbmUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxpbmVPYmogPSBsaW5lO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbnRvQ29vcmRTeXN0ZW0odGhpcywgbGluZU9iaiwge3RvcDogMCwgbGVmdDogMH0sIG1vZGUgfHwgXCJwYWdlXCIsIGluY2x1ZGVXaWRnZXRzIHx8IGVuZCkudG9wICtcbiAgICAgICAgICAoZW5kID8gdGhpcy5kb2MuaGVpZ2h0IC0gaGVpZ2h0QXRMaW5lKGxpbmVPYmopIDogMClcbiAgICAgIH0sXG5cbiAgICAgIGRlZmF1bHRUZXh0SGVpZ2h0OiBmdW5jdGlvbigpIHsgcmV0dXJuIHRleHRIZWlnaHQodGhpcy5kaXNwbGF5KSB9LFxuICAgICAgZGVmYXVsdENoYXJXaWR0aDogZnVuY3Rpb24oKSB7IHJldHVybiBjaGFyV2lkdGgodGhpcy5kaXNwbGF5KSB9LFxuXG4gICAgICBnZXRWaWV3cG9ydDogZnVuY3Rpb24oKSB7IHJldHVybiB7ZnJvbTogdGhpcy5kaXNwbGF5LnZpZXdGcm9tLCB0bzogdGhpcy5kaXNwbGF5LnZpZXdUb319LFxuXG4gICAgICBhZGRXaWRnZXQ6IGZ1bmN0aW9uKHBvcywgbm9kZSwgc2Nyb2xsLCB2ZXJ0LCBob3Jpeikge1xuICAgICAgICB2YXIgZGlzcGxheSA9IHRoaXMuZGlzcGxheTtcbiAgICAgICAgcG9zID0gY3Vyc29yQ29vcmRzKHRoaXMsIGNsaXBQb3ModGhpcy5kb2MsIHBvcykpO1xuICAgICAgICB2YXIgdG9wID0gcG9zLmJvdHRvbSwgbGVmdCA9IHBvcy5sZWZ0O1xuICAgICAgICBub2RlLnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShcImNtLWlnbm9yZS1ldmVudHNcIiwgXCJ0cnVlXCIpO1xuICAgICAgICB0aGlzLmRpc3BsYXkuaW5wdXQuc2V0VW5lZGl0YWJsZShub2RlKTtcbiAgICAgICAgZGlzcGxheS5zaXplci5hcHBlbmRDaGlsZChub2RlKTtcbiAgICAgICAgaWYgKHZlcnQgPT0gXCJvdmVyXCIpIHtcbiAgICAgICAgICB0b3AgPSBwb3MudG9wO1xuICAgICAgICB9IGVsc2UgaWYgKHZlcnQgPT0gXCJhYm92ZVwiIHx8IHZlcnQgPT0gXCJuZWFyXCIpIHtcbiAgICAgICAgICB2YXIgdnNwYWNlID0gTWF0aC5tYXgoZGlzcGxheS53cmFwcGVyLmNsaWVudEhlaWdodCwgdGhpcy5kb2MuaGVpZ2h0KSxcbiAgICAgICAgICBoc3BhY2UgPSBNYXRoLm1heChkaXNwbGF5LnNpemVyLmNsaWVudFdpZHRoLCBkaXNwbGF5LmxpbmVTcGFjZS5jbGllbnRXaWR0aCk7XG4gICAgICAgICAgLy8gRGVmYXVsdCB0byBwb3NpdGlvbmluZyBhYm92ZSAoaWYgc3BlY2lmaWVkIGFuZCBwb3NzaWJsZSk7IG90aGVyd2lzZSBkZWZhdWx0IHRvIHBvc2l0aW9uaW5nIGJlbG93XG4gICAgICAgICAgaWYgKCh2ZXJ0ID09ICdhYm92ZScgfHwgcG9zLmJvdHRvbSArIG5vZGUub2Zmc2V0SGVpZ2h0ID4gdnNwYWNlKSAmJiBwb3MudG9wID4gbm9kZS5vZmZzZXRIZWlnaHQpXG4gICAgICAgICAgICB7IHRvcCA9IHBvcy50b3AgLSBub2RlLm9mZnNldEhlaWdodDsgfVxuICAgICAgICAgIGVsc2UgaWYgKHBvcy5ib3R0b20gKyBub2RlLm9mZnNldEhlaWdodCA8PSB2c3BhY2UpXG4gICAgICAgICAgICB7IHRvcCA9IHBvcy5ib3R0b207IH1cbiAgICAgICAgICBpZiAobGVmdCArIG5vZGUub2Zmc2V0V2lkdGggPiBoc3BhY2UpXG4gICAgICAgICAgICB7IGxlZnQgPSBoc3BhY2UgLSBub2RlLm9mZnNldFdpZHRoOyB9XG4gICAgICAgIH1cbiAgICAgICAgbm9kZS5zdHlsZS50b3AgPSB0b3AgKyBcInB4XCI7XG4gICAgICAgIG5vZGUuc3R5bGUubGVmdCA9IG5vZGUuc3R5bGUucmlnaHQgPSBcIlwiO1xuICAgICAgICBpZiAoaG9yaXogPT0gXCJyaWdodFwiKSB7XG4gICAgICAgICAgbGVmdCA9IGRpc3BsYXkuc2l6ZXIuY2xpZW50V2lkdGggLSBub2RlLm9mZnNldFdpZHRoO1xuICAgICAgICAgIG5vZGUuc3R5bGUucmlnaHQgPSBcIjBweFwiO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChob3JpeiA9PSBcImxlZnRcIikgeyBsZWZ0ID0gMDsgfVxuICAgICAgICAgIGVsc2UgaWYgKGhvcml6ID09IFwibWlkZGxlXCIpIHsgbGVmdCA9IChkaXNwbGF5LnNpemVyLmNsaWVudFdpZHRoIC0gbm9kZS5vZmZzZXRXaWR0aCkgLyAyOyB9XG4gICAgICAgICAgbm9kZS5zdHlsZS5sZWZ0ID0gbGVmdCArIFwicHhcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2Nyb2xsKVxuICAgICAgICAgIHsgc2Nyb2xsSW50b1ZpZXcodGhpcywge2xlZnQ6IGxlZnQsIHRvcDogdG9wLCByaWdodDogbGVmdCArIG5vZGUub2Zmc2V0V2lkdGgsIGJvdHRvbTogdG9wICsgbm9kZS5vZmZzZXRIZWlnaHR9KTsgfVxuICAgICAgfSxcblxuICAgICAgdHJpZ2dlck9uS2V5RG93bjogbWV0aG9kT3Aob25LZXlEb3duKSxcbiAgICAgIHRyaWdnZXJPbktleVByZXNzOiBtZXRob2RPcChvbktleVByZXNzKSxcbiAgICAgIHRyaWdnZXJPbktleVVwOiBvbktleVVwLFxuICAgICAgdHJpZ2dlck9uTW91c2VEb3duOiBtZXRob2RPcChvbk1vdXNlRG93biksXG5cbiAgICAgIGV4ZWNDb21tYW5kOiBmdW5jdGlvbihjbWQpIHtcbiAgICAgICAgaWYgKGNvbW1hbmRzLmhhc093blByb3BlcnR5KGNtZCkpXG4gICAgICAgICAgeyByZXR1cm4gY29tbWFuZHNbY21kXS5jYWxsKG51bGwsIHRoaXMpIH1cbiAgICAgIH0sXG5cbiAgICAgIHRyaWdnZXJFbGVjdHJpYzogbWV0aG9kT3AoZnVuY3Rpb24odGV4dCkgeyB0cmlnZ2VyRWxlY3RyaWModGhpcywgdGV4dCk7IH0pLFxuXG4gICAgICBmaW5kUG9zSDogZnVuY3Rpb24oZnJvbSwgYW1vdW50LCB1bml0LCB2aXN1YWxseSkge1xuICAgICAgICB2YXIgZGlyID0gMTtcbiAgICAgICAgaWYgKGFtb3VudCA8IDApIHsgZGlyID0gLTE7IGFtb3VudCA9IC1hbW91bnQ7IH1cbiAgICAgICAgdmFyIGN1ciA9IGNsaXBQb3ModGhpcy5kb2MsIGZyb20pO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFtb3VudDsgKytpKSB7XG4gICAgICAgICAgY3VyID0gZmluZFBvc0godGhpcy5kb2MsIGN1ciwgZGlyLCB1bml0LCB2aXN1YWxseSk7XG4gICAgICAgICAgaWYgKGN1ci5oaXRTaWRlKSB7IGJyZWFrIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY3VyXG4gICAgICB9LFxuXG4gICAgICBtb3ZlSDogbWV0aG9kT3AoZnVuY3Rpb24oZGlyLCB1bml0KSB7XG4gICAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgICAgIHRoaXMuZXh0ZW5kU2VsZWN0aW9uc0J5KGZ1bmN0aW9uIChyYW5nZSkge1xuICAgICAgICAgIGlmICh0aGlzJDEuZGlzcGxheS5zaGlmdCB8fCB0aGlzJDEuZG9jLmV4dGVuZCB8fCByYW5nZS5lbXB0eSgpKVxuICAgICAgICAgICAgeyByZXR1cm4gZmluZFBvc0godGhpcyQxLmRvYywgcmFuZ2UuaGVhZCwgZGlyLCB1bml0LCB0aGlzJDEub3B0aW9ucy5ydGxNb3ZlVmlzdWFsbHkpIH1cbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7IHJldHVybiBkaXIgPCAwID8gcmFuZ2UuZnJvbSgpIDogcmFuZ2UudG8oKSB9XG4gICAgICAgIH0sIHNlbF9tb3ZlKTtcbiAgICAgIH0pLFxuXG4gICAgICBkZWxldGVIOiBtZXRob2RPcChmdW5jdGlvbihkaXIsIHVuaXQpIHtcbiAgICAgICAgdmFyIHNlbCA9IHRoaXMuZG9jLnNlbCwgZG9jID0gdGhpcy5kb2M7XG4gICAgICAgIGlmIChzZWwuc29tZXRoaW5nU2VsZWN0ZWQoKSlcbiAgICAgICAgICB7IGRvYy5yZXBsYWNlU2VsZWN0aW9uKFwiXCIsIG51bGwsIFwiK2RlbGV0ZVwiKTsgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgeyBkZWxldGVOZWFyU2VsZWN0aW9uKHRoaXMsIGZ1bmN0aW9uIChyYW5nZSkge1xuICAgICAgICAgICAgdmFyIG90aGVyID0gZmluZFBvc0goZG9jLCByYW5nZS5oZWFkLCBkaXIsIHVuaXQsIGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybiBkaXIgPCAwID8ge2Zyb206IG90aGVyLCB0bzogcmFuZ2UuaGVhZH0gOiB7ZnJvbTogcmFuZ2UuaGVhZCwgdG86IG90aGVyfVxuICAgICAgICAgIH0pOyB9XG4gICAgICB9KSxcblxuICAgICAgZmluZFBvc1Y6IGZ1bmN0aW9uKGZyb20sIGFtb3VudCwgdW5pdCwgZ29hbENvbHVtbikge1xuICAgICAgICB2YXIgZGlyID0gMSwgeCA9IGdvYWxDb2x1bW47XG4gICAgICAgIGlmIChhbW91bnQgPCAwKSB7IGRpciA9IC0xOyBhbW91bnQgPSAtYW1vdW50OyB9XG4gICAgICAgIHZhciBjdXIgPSBjbGlwUG9zKHRoaXMuZG9jLCBmcm9tKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbW91bnQ7ICsraSkge1xuICAgICAgICAgIHZhciBjb29yZHMgPSBjdXJzb3JDb29yZHModGhpcywgY3VyLCBcImRpdlwiKTtcbiAgICAgICAgICBpZiAoeCA9PSBudWxsKSB7IHggPSBjb29yZHMubGVmdDsgfVxuICAgICAgICAgIGVsc2UgeyBjb29yZHMubGVmdCA9IHg7IH1cbiAgICAgICAgICBjdXIgPSBmaW5kUG9zVih0aGlzLCBjb29yZHMsIGRpciwgdW5pdCk7XG4gICAgICAgICAgaWYgKGN1ci5oaXRTaWRlKSB7IGJyZWFrIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY3VyXG4gICAgICB9LFxuXG4gICAgICBtb3ZlVjogbWV0aG9kT3AoZnVuY3Rpb24oZGlyLCB1bml0KSB7XG4gICAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgICAgIHZhciBkb2MgPSB0aGlzLmRvYywgZ29hbHMgPSBbXTtcbiAgICAgICAgdmFyIGNvbGxhcHNlID0gIXRoaXMuZGlzcGxheS5zaGlmdCAmJiAhZG9jLmV4dGVuZCAmJiBkb2Muc2VsLnNvbWV0aGluZ1NlbGVjdGVkKCk7XG4gICAgICAgIGRvYy5leHRlbmRTZWxlY3Rpb25zQnkoZnVuY3Rpb24gKHJhbmdlKSB7XG4gICAgICAgICAgaWYgKGNvbGxhcHNlKVxuICAgICAgICAgICAgeyByZXR1cm4gZGlyIDwgMCA/IHJhbmdlLmZyb20oKSA6IHJhbmdlLnRvKCkgfVxuICAgICAgICAgIHZhciBoZWFkUG9zID0gY3Vyc29yQ29vcmRzKHRoaXMkMSwgcmFuZ2UuaGVhZCwgXCJkaXZcIik7XG4gICAgICAgICAgaWYgKHJhbmdlLmdvYWxDb2x1bW4gIT0gbnVsbCkgeyBoZWFkUG9zLmxlZnQgPSByYW5nZS5nb2FsQ29sdW1uOyB9XG4gICAgICAgICAgZ29hbHMucHVzaChoZWFkUG9zLmxlZnQpO1xuICAgICAgICAgIHZhciBwb3MgPSBmaW5kUG9zVih0aGlzJDEsIGhlYWRQb3MsIGRpciwgdW5pdCk7XG4gICAgICAgICAgaWYgKHVuaXQgPT0gXCJwYWdlXCIgJiYgcmFuZ2UgPT0gZG9jLnNlbC5wcmltYXJ5KCkpXG4gICAgICAgICAgICB7IGFkZFRvU2Nyb2xsVG9wKHRoaXMkMSwgY2hhckNvb3Jkcyh0aGlzJDEsIHBvcywgXCJkaXZcIikudG9wIC0gaGVhZFBvcy50b3ApOyB9XG4gICAgICAgICAgcmV0dXJuIHBvc1xuICAgICAgICB9LCBzZWxfbW92ZSk7XG4gICAgICAgIGlmIChnb2Fscy5sZW5ndGgpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBkb2Muc2VsLnJhbmdlcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICB7IGRvYy5zZWwucmFuZ2VzW2ldLmdvYWxDb2x1bW4gPSBnb2Fsc1tpXTsgfSB9XG4gICAgICB9KSxcblxuICAgICAgLy8gRmluZCB0aGUgd29yZCBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24gKGFzIHJldHVybmVkIGJ5IGNvb3Jkc0NoYXIpLlxuICAgICAgZmluZFdvcmRBdDogZnVuY3Rpb24ocG9zKSB7XG4gICAgICAgIHZhciBkb2MgPSB0aGlzLmRvYywgbGluZSA9IGdldExpbmUoZG9jLCBwb3MubGluZSkudGV4dDtcbiAgICAgICAgdmFyIHN0YXJ0ID0gcG9zLmNoLCBlbmQgPSBwb3MuY2g7XG4gICAgICAgIGlmIChsaW5lKSB7XG4gICAgICAgICAgdmFyIGhlbHBlciA9IHRoaXMuZ2V0SGVscGVyKHBvcywgXCJ3b3JkQ2hhcnNcIik7XG4gICAgICAgICAgaWYgKChwb3Muc3RpY2t5ID09IFwiYmVmb3JlXCIgfHwgZW5kID09IGxpbmUubGVuZ3RoKSAmJiBzdGFydCkgeyAtLXN0YXJ0OyB9IGVsc2UgeyArK2VuZDsgfVxuICAgICAgICAgIHZhciBzdGFydENoYXIgPSBsaW5lLmNoYXJBdChzdGFydCk7XG4gICAgICAgICAgdmFyIGNoZWNrID0gaXNXb3JkQ2hhcihzdGFydENoYXIsIGhlbHBlcilcbiAgICAgICAgICAgID8gZnVuY3Rpb24gKGNoKSB7IHJldHVybiBpc1dvcmRDaGFyKGNoLCBoZWxwZXIpOyB9XG4gICAgICAgICAgICA6IC9cXHMvLnRlc3Qoc3RhcnRDaGFyKSA/IGZ1bmN0aW9uIChjaCkgeyByZXR1cm4gL1xccy8udGVzdChjaCk7IH1cbiAgICAgICAgICAgIDogZnVuY3Rpb24gKGNoKSB7IHJldHVybiAoIS9cXHMvLnRlc3QoY2gpICYmICFpc1dvcmRDaGFyKGNoKSk7IH07XG4gICAgICAgICAgd2hpbGUgKHN0YXJ0ID4gMCAmJiBjaGVjayhsaW5lLmNoYXJBdChzdGFydCAtIDEpKSkgeyAtLXN0YXJ0OyB9XG4gICAgICAgICAgd2hpbGUgKGVuZCA8IGxpbmUubGVuZ3RoICYmIGNoZWNrKGxpbmUuY2hhckF0KGVuZCkpKSB7ICsrZW5kOyB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBSYW5nZShQb3MocG9zLmxpbmUsIHN0YXJ0KSwgUG9zKHBvcy5saW5lLCBlbmQpKVxuICAgICAgfSxcblxuICAgICAgdG9nZ2xlT3ZlcndyaXRlOiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSA9PSB0aGlzLnN0YXRlLm92ZXJ3cml0ZSkgeyByZXR1cm4gfVxuICAgICAgICBpZiAodGhpcy5zdGF0ZS5vdmVyd3JpdGUgPSAhdGhpcy5zdGF0ZS5vdmVyd3JpdGUpXG4gICAgICAgICAgeyBhZGRDbGFzcyh0aGlzLmRpc3BsYXkuY3Vyc29yRGl2LCBcIkNvZGVNaXJyb3Itb3ZlcndyaXRlXCIpOyB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICB7IHJtQ2xhc3ModGhpcy5kaXNwbGF5LmN1cnNvckRpdiwgXCJDb2RlTWlycm9yLW92ZXJ3cml0ZVwiKTsgfVxuXG4gICAgICAgIHNpZ25hbCh0aGlzLCBcIm92ZXJ3cml0ZVRvZ2dsZVwiLCB0aGlzLCB0aGlzLnN0YXRlLm92ZXJ3cml0ZSk7XG4gICAgICB9LFxuICAgICAgaGFzRm9jdXM6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5kaXNwbGF5LmlucHV0LmdldEZpZWxkKCkgPT0gYWN0aXZlRWx0KCkgfSxcbiAgICAgIGlzUmVhZE9ubHk6IGZ1bmN0aW9uKCkgeyByZXR1cm4gISEodGhpcy5vcHRpb25zLnJlYWRPbmx5IHx8IHRoaXMuZG9jLmNhbnRFZGl0KSB9LFxuXG4gICAgICBzY3JvbGxUbzogbWV0aG9kT3AoZnVuY3Rpb24gKHgsIHkpIHsgc2Nyb2xsVG9Db29yZHModGhpcywgeCwgeSk7IH0pLFxuICAgICAgZ2V0U2Nyb2xsSW5mbzogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBzY3JvbGxlciA9IHRoaXMuZGlzcGxheS5zY3JvbGxlcjtcbiAgICAgICAgcmV0dXJuIHtsZWZ0OiBzY3JvbGxlci5zY3JvbGxMZWZ0LCB0b3A6IHNjcm9sbGVyLnNjcm9sbFRvcCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IHNjcm9sbGVyLnNjcm9sbEhlaWdodCAtIHNjcm9sbEdhcCh0aGlzKSAtIHRoaXMuZGlzcGxheS5iYXJIZWlnaHQsXG4gICAgICAgICAgICAgICAgd2lkdGg6IHNjcm9sbGVyLnNjcm9sbFdpZHRoIC0gc2Nyb2xsR2FwKHRoaXMpIC0gdGhpcy5kaXNwbGF5LmJhcldpZHRoLFxuICAgICAgICAgICAgICAgIGNsaWVudEhlaWdodDogZGlzcGxheUhlaWdodCh0aGlzKSwgY2xpZW50V2lkdGg6IGRpc3BsYXlXaWR0aCh0aGlzKX1cbiAgICAgIH0sXG5cbiAgICAgIHNjcm9sbEludG9WaWV3OiBtZXRob2RPcChmdW5jdGlvbihyYW5nZSwgbWFyZ2luKSB7XG4gICAgICAgIGlmIChyYW5nZSA9PSBudWxsKSB7XG4gICAgICAgICAgcmFuZ2UgPSB7ZnJvbTogdGhpcy5kb2Muc2VsLnByaW1hcnkoKS5oZWFkLCB0bzogbnVsbH07XG4gICAgICAgICAgaWYgKG1hcmdpbiA9PSBudWxsKSB7IG1hcmdpbiA9IHRoaXMub3B0aW9ucy5jdXJzb3JTY3JvbGxNYXJnaW47IH1cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcmFuZ2UgPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIHJhbmdlID0ge2Zyb206IFBvcyhyYW5nZSwgMCksIHRvOiBudWxsfTtcbiAgICAgICAgfSBlbHNlIGlmIChyYW5nZS5mcm9tID09IG51bGwpIHtcbiAgICAgICAgICByYW5nZSA9IHtmcm9tOiByYW5nZSwgdG86IG51bGx9O1xuICAgICAgICB9XG4gICAgICAgIGlmICghcmFuZ2UudG8pIHsgcmFuZ2UudG8gPSByYW5nZS5mcm9tOyB9XG4gICAgICAgIHJhbmdlLm1hcmdpbiA9IG1hcmdpbiB8fCAwO1xuXG4gICAgICAgIGlmIChyYW5nZS5mcm9tLmxpbmUgIT0gbnVsbCkge1xuICAgICAgICAgIHNjcm9sbFRvUmFuZ2UodGhpcywgcmFuZ2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNjcm9sbFRvQ29vcmRzUmFuZ2UodGhpcywgcmFuZ2UuZnJvbSwgcmFuZ2UudG8sIHJhbmdlLm1hcmdpbik7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuXG4gICAgICBzZXRTaXplOiBtZXRob2RPcChmdW5jdGlvbih3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgICAgIHZhciBpbnRlcnByZXQgPSBmdW5jdGlvbiAodmFsKSB7IHJldHVybiB0eXBlb2YgdmFsID09IFwibnVtYmVyXCIgfHwgL15cXGQrJC8udGVzdChTdHJpbmcodmFsKSkgPyB2YWwgKyBcInB4XCIgOiB2YWw7IH07XG4gICAgICAgIGlmICh3aWR0aCAhPSBudWxsKSB7IHRoaXMuZGlzcGxheS53cmFwcGVyLnN0eWxlLndpZHRoID0gaW50ZXJwcmV0KHdpZHRoKTsgfVxuICAgICAgICBpZiAoaGVpZ2h0ICE9IG51bGwpIHsgdGhpcy5kaXNwbGF5LndyYXBwZXIuc3R5bGUuaGVpZ2h0ID0gaW50ZXJwcmV0KGhlaWdodCk7IH1cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5saW5lV3JhcHBpbmcpIHsgY2xlYXJMaW5lTWVhc3VyZW1lbnRDYWNoZSh0aGlzKTsgfVxuICAgICAgICB2YXIgbGluZU5vID0gdGhpcy5kaXNwbGF5LnZpZXdGcm9tO1xuICAgICAgICB0aGlzLmRvYy5pdGVyKGxpbmVObywgdGhpcy5kaXNwbGF5LnZpZXdUbywgZnVuY3Rpb24gKGxpbmUpIHtcbiAgICAgICAgICBpZiAobGluZS53aWRnZXRzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgbGluZS53aWRnZXRzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgeyBpZiAobGluZS53aWRnZXRzW2ldLm5vSFNjcm9sbCkgeyByZWdMaW5lQ2hhbmdlKHRoaXMkMSwgbGluZU5vLCBcIndpZGdldFwiKTsgYnJlYWsgfSB9IH1cbiAgICAgICAgICArK2xpbmVObztcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY3VyT3AuZm9yY2VVcGRhdGUgPSB0cnVlO1xuICAgICAgICBzaWduYWwodGhpcywgXCJyZWZyZXNoXCIsIHRoaXMpO1xuICAgICAgfSksXG5cbiAgICAgIG9wZXJhdGlvbjogZnVuY3Rpb24oZil7cmV0dXJuIHJ1bkluT3AodGhpcywgZil9LFxuICAgICAgc3RhcnRPcGVyYXRpb246IGZ1bmN0aW9uKCl7cmV0dXJuIHN0YXJ0T3BlcmF0aW9uKHRoaXMpfSxcbiAgICAgIGVuZE9wZXJhdGlvbjogZnVuY3Rpb24oKXtyZXR1cm4gZW5kT3BlcmF0aW9uKHRoaXMpfSxcblxuICAgICAgcmVmcmVzaDogbWV0aG9kT3AoZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBvbGRIZWlnaHQgPSB0aGlzLmRpc3BsYXkuY2FjaGVkVGV4dEhlaWdodDtcbiAgICAgICAgcmVnQ2hhbmdlKHRoaXMpO1xuICAgICAgICB0aGlzLmN1ck9wLmZvcmNlVXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgY2xlYXJDYWNoZXModGhpcyk7XG4gICAgICAgIHNjcm9sbFRvQ29vcmRzKHRoaXMsIHRoaXMuZG9jLnNjcm9sbExlZnQsIHRoaXMuZG9jLnNjcm9sbFRvcCk7XG4gICAgICAgIHVwZGF0ZUd1dHRlclNwYWNlKHRoaXMuZGlzcGxheSk7XG4gICAgICAgIGlmIChvbGRIZWlnaHQgPT0gbnVsbCB8fCBNYXRoLmFicyhvbGRIZWlnaHQgLSB0ZXh0SGVpZ2h0KHRoaXMuZGlzcGxheSkpID4gLjUgfHwgdGhpcy5vcHRpb25zLmxpbmVXcmFwcGluZylcbiAgICAgICAgICB7IGVzdGltYXRlTGluZUhlaWdodHModGhpcyk7IH1cbiAgICAgICAgc2lnbmFsKHRoaXMsIFwicmVmcmVzaFwiLCB0aGlzKTtcbiAgICAgIH0pLFxuXG4gICAgICBzd2FwRG9jOiBtZXRob2RPcChmdW5jdGlvbihkb2MpIHtcbiAgICAgICAgdmFyIG9sZCA9IHRoaXMuZG9jO1xuICAgICAgICBvbGQuY20gPSBudWxsO1xuICAgICAgICAvLyBDYW5jZWwgdGhlIGN1cnJlbnQgdGV4dCBzZWxlY3Rpb24gaWYgYW55ICgjNTgyMSlcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuc2VsZWN0aW5nVGV4dCkgeyB0aGlzLnN0YXRlLnNlbGVjdGluZ1RleHQoKTsgfVxuICAgICAgICBhdHRhY2hEb2ModGhpcywgZG9jKTtcbiAgICAgICAgY2xlYXJDYWNoZXModGhpcyk7XG4gICAgICAgIHRoaXMuZGlzcGxheS5pbnB1dC5yZXNldCgpO1xuICAgICAgICBzY3JvbGxUb0Nvb3Jkcyh0aGlzLCBkb2Muc2Nyb2xsTGVmdCwgZG9jLnNjcm9sbFRvcCk7XG4gICAgICAgIHRoaXMuY3VyT3AuZm9yY2VTY3JvbGwgPSB0cnVlO1xuICAgICAgICBzaWduYWxMYXRlcih0aGlzLCBcInN3YXBEb2NcIiwgdGhpcywgb2xkKTtcbiAgICAgICAgcmV0dXJuIG9sZFxuICAgICAgfSksXG5cbiAgICAgIHBocmFzZTogZnVuY3Rpb24ocGhyYXNlVGV4dCkge1xuICAgICAgICB2YXIgcGhyYXNlcyA9IHRoaXMub3B0aW9ucy5waHJhc2VzO1xuICAgICAgICByZXR1cm4gcGhyYXNlcyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocGhyYXNlcywgcGhyYXNlVGV4dCkgPyBwaHJhc2VzW3BocmFzZVRleHRdIDogcGhyYXNlVGV4dFxuICAgICAgfSxcblxuICAgICAgZ2V0SW5wdXRGaWVsZDogZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kaXNwbGF5LmlucHV0LmdldEZpZWxkKCl9LFxuICAgICAgZ2V0V3JhcHBlckVsZW1lbnQ6IGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGlzcGxheS53cmFwcGVyfSxcbiAgICAgIGdldFNjcm9sbGVyRWxlbWVudDogZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kaXNwbGF5LnNjcm9sbGVyfSxcbiAgICAgIGdldEd1dHRlckVsZW1lbnQ6IGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGlzcGxheS5ndXR0ZXJzfVxuICAgIH07XG4gICAgZXZlbnRNaXhpbihDb2RlTWlycm9yKTtcblxuICAgIENvZGVNaXJyb3IucmVnaXN0ZXJIZWxwZXIgPSBmdW5jdGlvbih0eXBlLCBuYW1lLCB2YWx1ZSkge1xuICAgICAgaWYgKCFoZWxwZXJzLmhhc093blByb3BlcnR5KHR5cGUpKSB7IGhlbHBlcnNbdHlwZV0gPSBDb2RlTWlycm9yW3R5cGVdID0ge19nbG9iYWw6IFtdfTsgfVxuICAgICAgaGVscGVyc1t0eXBlXVtuYW1lXSA9IHZhbHVlO1xuICAgIH07XG4gICAgQ29kZU1pcnJvci5yZWdpc3Rlckdsb2JhbEhlbHBlciA9IGZ1bmN0aW9uKHR5cGUsIG5hbWUsIHByZWRpY2F0ZSwgdmFsdWUpIHtcbiAgICAgIENvZGVNaXJyb3IucmVnaXN0ZXJIZWxwZXIodHlwZSwgbmFtZSwgdmFsdWUpO1xuICAgICAgaGVscGVyc1t0eXBlXS5fZ2xvYmFsLnB1c2goe3ByZWQ6IHByZWRpY2F0ZSwgdmFsOiB2YWx1ZX0pO1xuICAgIH07XG4gIH1cblxuICAvLyBVc2VkIGZvciBob3Jpem9udGFsIHJlbGF0aXZlIG1vdGlvbi4gRGlyIGlzIC0xIG9yIDEgKGxlZnQgb3JcbiAgLy8gcmlnaHQpLCB1bml0IGNhbiBiZSBcImNvZGVwb2ludFwiLCBcImNoYXJcIiwgXCJjb2x1bW5cIiAobGlrZSBjaGFyLCBidXRcbiAgLy8gZG9lc24ndCBjcm9zcyBsaW5lIGJvdW5kYXJpZXMpLCBcIndvcmRcIiAoYWNyb3NzIG5leHQgd29yZCksIG9yXG4gIC8vIFwiZ3JvdXBcIiAodG8gdGhlIHN0YXJ0IG9mIG5leHQgZ3JvdXAgb2Ygd29yZCBvclxuICAvLyBub24td29yZC1ub24td2hpdGVzcGFjZSBjaGFycykuIFRoZSB2aXN1YWxseSBwYXJhbSBjb250cm9sc1xuICAvLyB3aGV0aGVyLCBpbiByaWdodC10by1sZWZ0IHRleHQsIGRpcmVjdGlvbiAxIG1lYW5zIHRvIG1vdmUgdG93YXJkc1xuICAvLyB0aGUgbmV4dCBpbmRleCBpbiB0aGUgc3RyaW5nLCBvciB0b3dhcmRzIHRoZSBjaGFyYWN0ZXIgdG8gdGhlIHJpZ2h0XG4gIC8vIG9mIHRoZSBjdXJyZW50IHBvc2l0aW9uLiBUaGUgcmVzdWx0aW5nIHBvc2l0aW9uIHdpbGwgaGF2ZSBhXG4gIC8vIGhpdFNpZGU9dHJ1ZSBwcm9wZXJ0eSBpZiBpdCByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50LlxuICBmdW5jdGlvbiBmaW5kUG9zSChkb2MsIHBvcywgZGlyLCB1bml0LCB2aXN1YWxseSkge1xuICAgIHZhciBvbGRQb3MgPSBwb3M7XG4gICAgdmFyIG9yaWdEaXIgPSBkaXI7XG4gICAgdmFyIGxpbmVPYmogPSBnZXRMaW5lKGRvYywgcG9zLmxpbmUpO1xuICAgIHZhciBsaW5lRGlyID0gdmlzdWFsbHkgJiYgZG9jLmRpcmVjdGlvbiA9PSBcInJ0bFwiID8gLWRpciA6IGRpcjtcbiAgICBmdW5jdGlvbiBmaW5kTmV4dExpbmUoKSB7XG4gICAgICB2YXIgbCA9IHBvcy5saW5lICsgbGluZURpcjtcbiAgICAgIGlmIChsIDwgZG9jLmZpcnN0IHx8IGwgPj0gZG9jLmZpcnN0ICsgZG9jLnNpemUpIHsgcmV0dXJuIGZhbHNlIH1cbiAgICAgIHBvcyA9IG5ldyBQb3MobCwgcG9zLmNoLCBwb3Muc3RpY2t5KTtcbiAgICAgIHJldHVybiBsaW5lT2JqID0gZ2V0TGluZShkb2MsIGwpXG4gICAgfVxuICAgIGZ1bmN0aW9uIG1vdmVPbmNlKGJvdW5kVG9MaW5lKSB7XG4gICAgICB2YXIgbmV4dDtcbiAgICAgIGlmICh1bml0ID09IFwiY29kZXBvaW50XCIpIHtcbiAgICAgICAgdmFyIGNoID0gbGluZU9iai50ZXh0LmNoYXJDb2RlQXQocG9zLmNoICsgKHVuaXQgPiAwID8gMCA6IC0xKSk7XG4gICAgICAgIGlmIChpc05hTihjaCkpIHsgbmV4dCA9IG51bGw7IH1cbiAgICAgICAgZWxzZSB7IG5leHQgPSBuZXcgUG9zKHBvcy5saW5lLCBNYXRoLm1heCgwLCBNYXRoLm1pbihsaW5lT2JqLnRleHQubGVuZ3RoLCBwb3MuY2ggKyBkaXIgKiAoY2ggPj0gMHhEODAwICYmIGNoIDwgMHhEQzAwID8gMiA6IDEpKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLWRpcik7IH1cbiAgICAgIH0gZWxzZSBpZiAodmlzdWFsbHkpIHtcbiAgICAgICAgbmV4dCA9IG1vdmVWaXN1YWxseShkb2MuY20sIGxpbmVPYmosIHBvcywgZGlyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5leHQgPSBtb3ZlTG9naWNhbGx5KGxpbmVPYmosIHBvcywgZGlyKTtcbiAgICAgIH1cbiAgICAgIGlmIChuZXh0ID09IG51bGwpIHtcbiAgICAgICAgaWYgKCFib3VuZFRvTGluZSAmJiBmaW5kTmV4dExpbmUoKSlcbiAgICAgICAgICB7IHBvcyA9IGVuZE9mTGluZSh2aXN1YWxseSwgZG9jLmNtLCBsaW5lT2JqLCBwb3MubGluZSwgbGluZURpcik7IH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgIHsgcmV0dXJuIGZhbHNlIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBvcyA9IG5leHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGlmICh1bml0ID09IFwiY2hhclwiIHx8IHVuaXQgPT0gXCJjb2RlcG9pbnRcIikge1xuICAgICAgbW92ZU9uY2UoKTtcbiAgICB9IGVsc2UgaWYgKHVuaXQgPT0gXCJjb2x1bW5cIikge1xuICAgICAgbW92ZU9uY2UodHJ1ZSk7XG4gICAgfSBlbHNlIGlmICh1bml0ID09IFwid29yZFwiIHx8IHVuaXQgPT0gXCJncm91cFwiKSB7XG4gICAgICB2YXIgc2F3VHlwZSA9IG51bGwsIGdyb3VwID0gdW5pdCA9PSBcImdyb3VwXCI7XG4gICAgICB2YXIgaGVscGVyID0gZG9jLmNtICYmIGRvYy5jbS5nZXRIZWxwZXIocG9zLCBcIndvcmRDaGFyc1wiKTtcbiAgICAgIGZvciAodmFyIGZpcnN0ID0gdHJ1ZTs7IGZpcnN0ID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKGRpciA8IDAgJiYgIW1vdmVPbmNlKCFmaXJzdCkpIHsgYnJlYWsgfVxuICAgICAgICB2YXIgY3VyID0gbGluZU9iai50ZXh0LmNoYXJBdChwb3MuY2gpIHx8IFwiXFxuXCI7XG4gICAgICAgIHZhciB0eXBlID0gaXNXb3JkQ2hhcihjdXIsIGhlbHBlcikgPyBcIndcIlxuICAgICAgICAgIDogZ3JvdXAgJiYgY3VyID09IFwiXFxuXCIgPyBcIm5cIlxuICAgICAgICAgIDogIWdyb3VwIHx8IC9cXHMvLnRlc3QoY3VyKSA/IG51bGxcbiAgICAgICAgICA6IFwicFwiO1xuICAgICAgICBpZiAoZ3JvdXAgJiYgIWZpcnN0ICYmICF0eXBlKSB7IHR5cGUgPSBcInNcIjsgfVxuICAgICAgICBpZiAoc2F3VHlwZSAmJiBzYXdUeXBlICE9IHR5cGUpIHtcbiAgICAgICAgICBpZiAoZGlyIDwgMCkge2RpciA9IDE7IG1vdmVPbmNlKCk7IHBvcy5zdGlja3kgPSBcImFmdGVyXCI7fVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZSkgeyBzYXdUeXBlID0gdHlwZTsgfVxuICAgICAgICBpZiAoZGlyID4gMCAmJiAhbW92ZU9uY2UoIWZpcnN0KSkgeyBicmVhayB9XG4gICAgICB9XG4gICAgfVxuICAgIHZhciByZXN1bHQgPSBza2lwQXRvbWljKGRvYywgcG9zLCBvbGRQb3MsIG9yaWdEaXIsIHRydWUpO1xuICAgIGlmIChlcXVhbEN1cnNvclBvcyhvbGRQb3MsIHJlc3VsdCkpIHsgcmVzdWx0LmhpdFNpZGUgPSB0cnVlOyB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLy8gRm9yIHJlbGF0aXZlIHZlcnRpY2FsIG1vdmVtZW50LiBEaXIgbWF5IGJlIC0xIG9yIDEuIFVuaXQgY2FuIGJlXG4gIC8vIFwicGFnZVwiIG9yIFwibGluZVwiLiBUaGUgcmVzdWx0aW5nIHBvc2l0aW9uIHdpbGwgaGF2ZSBhIGhpdFNpZGU9dHJ1ZVxuICAvLyBwcm9wZXJ0eSBpZiBpdCByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50LlxuICBmdW5jdGlvbiBmaW5kUG9zVihjbSwgcG9zLCBkaXIsIHVuaXQpIHtcbiAgICB2YXIgZG9jID0gY20uZG9jLCB4ID0gcG9zLmxlZnQsIHk7XG4gICAgaWYgKHVuaXQgPT0gXCJwYWdlXCIpIHtcbiAgICAgIHZhciBwYWdlU2l6ZSA9IE1hdGgubWluKGNtLmRpc3BsYXkud3JhcHBlci5jbGllbnRIZWlnaHQsIHdpbmRvdy5pbm5lckhlaWdodCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KTtcbiAgICAgIHZhciBtb3ZlQW1vdW50ID0gTWF0aC5tYXgocGFnZVNpemUgLSAuNSAqIHRleHRIZWlnaHQoY20uZGlzcGxheSksIDMpO1xuICAgICAgeSA9IChkaXIgPiAwID8gcG9zLmJvdHRvbSA6IHBvcy50b3ApICsgZGlyICogbW92ZUFtb3VudDtcblxuICAgIH0gZWxzZSBpZiAodW5pdCA9PSBcImxpbmVcIikge1xuICAgICAgeSA9IGRpciA+IDAgPyBwb3MuYm90dG9tICsgMyA6IHBvcy50b3AgLSAzO1xuICAgIH1cbiAgICB2YXIgdGFyZ2V0O1xuICAgIGZvciAoOzspIHtcbiAgICAgIHRhcmdldCA9IGNvb3Jkc0NoYXIoY20sIHgsIHkpO1xuICAgICAgaWYgKCF0YXJnZXQub3V0c2lkZSkgeyBicmVhayB9XG4gICAgICBpZiAoZGlyIDwgMCA/IHkgPD0gMCA6IHkgPj0gZG9jLmhlaWdodCkgeyB0YXJnZXQuaGl0U2lkZSA9IHRydWU7IGJyZWFrIH1cbiAgICAgIHkgKz0gZGlyICogNTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldFxuICB9XG5cbiAgLy8gQ09OVEVOVEVESVRBQkxFIElOUFVUIFNUWUxFXG5cbiAgdmFyIENvbnRlbnRFZGl0YWJsZUlucHV0ID0gZnVuY3Rpb24oY20pIHtcbiAgICB0aGlzLmNtID0gY207XG4gICAgdGhpcy5sYXN0QW5jaG9yTm9kZSA9IHRoaXMubGFzdEFuY2hvck9mZnNldCA9IHRoaXMubGFzdEZvY3VzTm9kZSA9IHRoaXMubGFzdEZvY3VzT2Zmc2V0ID0gbnVsbDtcbiAgICB0aGlzLnBvbGxpbmcgPSBuZXcgRGVsYXllZCgpO1xuICAgIHRoaXMuY29tcG9zaW5nID0gbnVsbDtcbiAgICB0aGlzLmdyYWNlUGVyaW9kID0gZmFsc2U7XG4gICAgdGhpcy5yZWFkRE9NVGltZW91dCA9IG51bGw7XG4gIH07XG5cbiAgQ29udGVudEVkaXRhYmxlSW5wdXQucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbiAoZGlzcGxheSkge1xuICAgICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICB2YXIgaW5wdXQgPSB0aGlzLCBjbSA9IGlucHV0LmNtO1xuICAgIHZhciBkaXYgPSBpbnB1dC5kaXYgPSBkaXNwbGF5LmxpbmVEaXY7XG4gICAgZGlzYWJsZUJyb3dzZXJNYWdpYyhkaXYsIGNtLm9wdGlvbnMuc3BlbGxjaGVjaywgY20ub3B0aW9ucy5hdXRvY29ycmVjdCwgY20ub3B0aW9ucy5hdXRvY2FwaXRhbGl6ZSk7XG5cbiAgICBmdW5jdGlvbiBiZWxvbmdzVG9JbnB1dChlKSB7XG4gICAgICBmb3IgKHZhciB0ID0gZS50YXJnZXQ7IHQ7IHQgPSB0LnBhcmVudE5vZGUpIHtcbiAgICAgICAgaWYgKHQgPT0gZGl2KSB7IHJldHVybiB0cnVlIH1cbiAgICAgICAgaWYgKC9cXGJDb2RlTWlycm9yLSg/OmxpbmUpP3dpZGdldFxcYi8udGVzdCh0LmNsYXNzTmFtZSkpIHsgYnJlYWsgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgb24oZGl2LCBcInBhc3RlXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoIWJlbG9uZ3NUb0lucHV0KGUpIHx8IHNpZ25hbERPTUV2ZW50KGNtLCBlKSB8fCBoYW5kbGVQYXN0ZShlLCBjbSkpIHsgcmV0dXJuIH1cbiAgICAgIC8vIElFIGRvZXNuJ3QgZmlyZSBpbnB1dCBldmVudHMsIHNvIHdlIHNjaGVkdWxlIGEgcmVhZCBmb3IgdGhlIHBhc3RlZCBjb250ZW50IGluIHRoaXMgd2F5XG4gICAgICBpZiAoaWVfdmVyc2lvbiA8PSAxMSkgeyBzZXRUaW1lb3V0KG9wZXJhdGlvbihjbSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcyQxLnVwZGF0ZUZyb21ET00oKTsgfSksIDIwKTsgfVxuICAgIH0pO1xuXG4gICAgb24oZGl2LCBcImNvbXBvc2l0aW9uc3RhcnRcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgIHRoaXMkMS5jb21wb3NpbmcgPSB7ZGF0YTogZS5kYXRhLCBkb25lOiBmYWxzZX07XG4gICAgfSk7XG4gICAgb24oZGl2LCBcImNvbXBvc2l0aW9udXBkYXRlXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoIXRoaXMkMS5jb21wb3NpbmcpIHsgdGhpcyQxLmNvbXBvc2luZyA9IHtkYXRhOiBlLmRhdGEsIGRvbmU6IGZhbHNlfTsgfVxuICAgIH0pO1xuICAgIG9uKGRpdiwgXCJjb21wb3NpdGlvbmVuZFwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKHRoaXMkMS5jb21wb3NpbmcpIHtcbiAgICAgICAgaWYgKGUuZGF0YSAhPSB0aGlzJDEuY29tcG9zaW5nLmRhdGEpIHsgdGhpcyQxLnJlYWRGcm9tRE9NU29vbigpOyB9XG4gICAgICAgIHRoaXMkMS5jb21wb3NpbmcuZG9uZSA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBvbihkaXYsIFwidG91Y2hzdGFydFwiLCBmdW5jdGlvbiAoKSB7IHJldHVybiBpbnB1dC5mb3JjZUNvbXBvc2l0aW9uRW5kKCk7IH0pO1xuXG4gICAgb24oZGl2LCBcImlucHV0XCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghdGhpcyQxLmNvbXBvc2luZykgeyB0aGlzJDEucmVhZEZyb21ET01Tb29uKCk7IH1cbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIG9uQ29weUN1dChlKSB7XG4gICAgICBpZiAoIWJlbG9uZ3NUb0lucHV0KGUpIHx8IHNpZ25hbERPTUV2ZW50KGNtLCBlKSkgeyByZXR1cm4gfVxuICAgICAgaWYgKGNtLnNvbWV0aGluZ1NlbGVjdGVkKCkpIHtcbiAgICAgICAgc2V0TGFzdENvcGllZCh7bGluZVdpc2U6IGZhbHNlLCB0ZXh0OiBjbS5nZXRTZWxlY3Rpb25zKCl9KTtcbiAgICAgICAgaWYgKGUudHlwZSA9PSBcImN1dFwiKSB7IGNtLnJlcGxhY2VTZWxlY3Rpb24oXCJcIiwgbnVsbCwgXCJjdXRcIik7IH1cbiAgICAgIH0gZWxzZSBpZiAoIWNtLm9wdGlvbnMubGluZVdpc2VDb3B5Q3V0KSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHJhbmdlcyA9IGNvcHlhYmxlUmFuZ2VzKGNtKTtcbiAgICAgICAgc2V0TGFzdENvcGllZCh7bGluZVdpc2U6IHRydWUsIHRleHQ6IHJhbmdlcy50ZXh0fSk7XG4gICAgICAgIGlmIChlLnR5cGUgPT0gXCJjdXRcIikge1xuICAgICAgICAgIGNtLm9wZXJhdGlvbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjbS5zZXRTZWxlY3Rpb25zKHJhbmdlcy5yYW5nZXMsIDAsIHNlbF9kb250U2Nyb2xsKTtcbiAgICAgICAgICAgIGNtLnJlcGxhY2VTZWxlY3Rpb24oXCJcIiwgbnVsbCwgXCJjdXRcIik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChlLmNsaXBib2FyZERhdGEpIHtcbiAgICAgICAgZS5jbGlwYm9hcmREYXRhLmNsZWFyRGF0YSgpO1xuICAgICAgICB2YXIgY29udGVudCA9IGxhc3RDb3BpZWQudGV4dC5qb2luKFwiXFxuXCIpO1xuICAgICAgICAvLyBpT1MgZXhwb3NlcyB0aGUgY2xpcGJvYXJkIEFQSSwgYnV0IHNlZW1zIHRvIGRpc2NhcmQgY29udGVudCBpbnNlcnRlZCBpbnRvIGl0XG4gICAgICAgIGUuY2xpcGJvYXJkRGF0YS5zZXREYXRhKFwiVGV4dFwiLCBjb250ZW50KTtcbiAgICAgICAgaWYgKGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKFwiVGV4dFwiKSA9PSBjb250ZW50KSB7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBPbGQtZmFzaGlvbmVkIGJyaWVmbHktZm9jdXMtYS10ZXh0YXJlYSBoYWNrXG4gICAgICB2YXIga2x1ZGdlID0gaGlkZGVuVGV4dGFyZWEoKSwgdGUgPSBrbHVkZ2UuZmlyc3RDaGlsZDtcbiAgICAgIGNtLmRpc3BsYXkubGluZVNwYWNlLmluc2VydEJlZm9yZShrbHVkZ2UsIGNtLmRpc3BsYXkubGluZVNwYWNlLmZpcnN0Q2hpbGQpO1xuICAgICAgdGUudmFsdWUgPSBsYXN0Q29waWVkLnRleHQuam9pbihcIlxcblwiKTtcbiAgICAgIHZhciBoYWRGb2N1cyA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgICBzZWxlY3RJbnB1dCh0ZSk7XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY20uZGlzcGxheS5saW5lU3BhY2UucmVtb3ZlQ2hpbGQoa2x1ZGdlKTtcbiAgICAgICAgaGFkRm9jdXMuZm9jdXMoKTtcbiAgICAgICAgaWYgKGhhZEZvY3VzID09IGRpdikgeyBpbnB1dC5zaG93UHJpbWFyeVNlbGVjdGlvbigpOyB9XG4gICAgICB9LCA1MCk7XG4gICAgfVxuICAgIG9uKGRpdiwgXCJjb3B5XCIsIG9uQ29weUN1dCk7XG4gICAgb24oZGl2LCBcImN1dFwiLCBvbkNvcHlDdXQpO1xuICB9O1xuXG4gIENvbnRlbnRFZGl0YWJsZUlucHV0LnByb3RvdHlwZS5zY3JlZW5SZWFkZXJMYWJlbENoYW5nZWQgPSBmdW5jdGlvbiAobGFiZWwpIHtcbiAgICAvLyBMYWJlbCBmb3Igc2NyZWVucmVhZGVycywgYWNjZXNzaWJpbGl0eVxuICAgIGlmKGxhYmVsKSB7XG4gICAgICB0aGlzLmRpdi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCBsYWJlbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGl2LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcpO1xuICAgIH1cbiAgfTtcblxuICBDb250ZW50RWRpdGFibGVJbnB1dC5wcm90b3R5cGUucHJlcGFyZVNlbGVjdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcmVzdWx0ID0gcHJlcGFyZVNlbGVjdGlvbih0aGlzLmNtLCBmYWxzZSk7XG4gICAgcmVzdWx0LmZvY3VzID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PSB0aGlzLmRpdjtcbiAgICByZXR1cm4gcmVzdWx0XG4gIH07XG5cbiAgQ29udGVudEVkaXRhYmxlSW5wdXQucHJvdG90eXBlLnNob3dTZWxlY3Rpb24gPSBmdW5jdGlvbiAoaW5mbywgdGFrZUZvY3VzKSB7XG4gICAgaWYgKCFpbmZvIHx8ICF0aGlzLmNtLmRpc3BsYXkudmlldy5sZW5ndGgpIHsgcmV0dXJuIH1cbiAgICBpZiAoaW5mby5mb2N1cyB8fCB0YWtlRm9jdXMpIHsgdGhpcy5zaG93UHJpbWFyeVNlbGVjdGlvbigpOyB9XG4gICAgdGhpcy5zaG93TXVsdGlwbGVTZWxlY3Rpb25zKGluZm8pO1xuICB9O1xuXG4gIENvbnRlbnRFZGl0YWJsZUlucHV0LnByb3RvdHlwZS5nZXRTZWxlY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuY20uZGlzcGxheS53cmFwcGVyLm93bmVyRG9jdW1lbnQuZ2V0U2VsZWN0aW9uKClcbiAgfTtcblxuICBDb250ZW50RWRpdGFibGVJbnB1dC5wcm90b3R5cGUuc2hvd1ByaW1hcnlTZWxlY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbCA9IHRoaXMuZ2V0U2VsZWN0aW9uKCksIGNtID0gdGhpcy5jbSwgcHJpbSA9IGNtLmRvYy5zZWwucHJpbWFyeSgpO1xuICAgIHZhciBmcm9tID0gcHJpbS5mcm9tKCksIHRvID0gcHJpbS50bygpO1xuXG4gICAgaWYgKGNtLmRpc3BsYXkudmlld1RvID09IGNtLmRpc3BsYXkudmlld0Zyb20gfHwgZnJvbS5saW5lID49IGNtLmRpc3BsYXkudmlld1RvIHx8IHRvLmxpbmUgPCBjbS5kaXNwbGF5LnZpZXdGcm9tKSB7XG4gICAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB2YXIgY3VyQW5jaG9yID0gZG9tVG9Qb3MoY20sIHNlbC5hbmNob3JOb2RlLCBzZWwuYW5jaG9yT2Zmc2V0KTtcbiAgICB2YXIgY3VyRm9jdXMgPSBkb21Ub1BvcyhjbSwgc2VsLmZvY3VzTm9kZSwgc2VsLmZvY3VzT2Zmc2V0KTtcbiAgICBpZiAoY3VyQW5jaG9yICYmICFjdXJBbmNob3IuYmFkICYmIGN1ckZvY3VzICYmICFjdXJGb2N1cy5iYWQgJiZcbiAgICAgICAgY21wKG1pblBvcyhjdXJBbmNob3IsIGN1ckZvY3VzKSwgZnJvbSkgPT0gMCAmJlxuICAgICAgICBjbXAobWF4UG9zKGN1ckFuY2hvciwgY3VyRm9jdXMpLCB0bykgPT0gMClcbiAgICAgIHsgcmV0dXJuIH1cblxuICAgIHZhciB2aWV3ID0gY20uZGlzcGxheS52aWV3O1xuICAgIHZhciBzdGFydCA9IChmcm9tLmxpbmUgPj0gY20uZGlzcGxheS52aWV3RnJvbSAmJiBwb3NUb0RPTShjbSwgZnJvbSkpIHx8XG4gICAgICAgIHtub2RlOiB2aWV3WzBdLm1lYXN1cmUubWFwWzJdLCBvZmZzZXQ6IDB9O1xuICAgIHZhciBlbmQgPSB0by5saW5lIDwgY20uZGlzcGxheS52aWV3VG8gJiYgcG9zVG9ET00oY20sIHRvKTtcbiAgICBpZiAoIWVuZCkge1xuICAgICAgdmFyIG1lYXN1cmUgPSB2aWV3W3ZpZXcubGVuZ3RoIC0gMV0ubWVhc3VyZTtcbiAgICAgIHZhciBtYXAgPSBtZWFzdXJlLm1hcHMgPyBtZWFzdXJlLm1hcHNbbWVhc3VyZS5tYXBzLmxlbmd0aCAtIDFdIDogbWVhc3VyZS5tYXA7XG4gICAgICBlbmQgPSB7bm9kZTogbWFwW21hcC5sZW5ndGggLSAxXSwgb2Zmc2V0OiBtYXBbbWFwLmxlbmd0aCAtIDJdIC0gbWFwW21hcC5sZW5ndGggLSAzXX07XG4gICAgfVxuXG4gICAgaWYgKCFzdGFydCB8fCAhZW5kKSB7XG4gICAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB2YXIgb2xkID0gc2VsLnJhbmdlQ291bnQgJiYgc2VsLmdldFJhbmdlQXQoMCksIHJuZztcbiAgICB0cnkgeyBybmcgPSByYW5nZShzdGFydC5ub2RlLCBzdGFydC5vZmZzZXQsIGVuZC5vZmZzZXQsIGVuZC5ub2RlKTsgfVxuICAgIGNhdGNoKGUpIHt9IC8vIE91ciBtb2RlbCBvZiB0aGUgRE9NIG1pZ2h0IGJlIG91dGRhdGVkLCBpbiB3aGljaCBjYXNlIHRoZSByYW5nZSB3ZSB0cnkgdG8gc2V0IGNhbiBiZSBpbXBvc3NpYmxlXG4gICAgaWYgKHJuZykge1xuICAgICAgaWYgKCFnZWNrbyAmJiBjbS5zdGF0ZS5mb2N1c2VkKSB7XG4gICAgICAgIHNlbC5jb2xsYXBzZShzdGFydC5ub2RlLCBzdGFydC5vZmZzZXQpO1xuICAgICAgICBpZiAoIXJuZy5jb2xsYXBzZWQpIHtcbiAgICAgICAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICAgICAgc2VsLmFkZFJhbmdlKHJuZyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbC5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgc2VsLmFkZFJhbmdlKHJuZyk7XG4gICAgICB9XG4gICAgICBpZiAob2xkICYmIHNlbC5hbmNob3JOb2RlID09IG51bGwpIHsgc2VsLmFkZFJhbmdlKG9sZCk7IH1cbiAgICAgIGVsc2UgaWYgKGdlY2tvKSB7IHRoaXMuc3RhcnRHcmFjZVBlcmlvZCgpOyB9XG4gICAgfVxuICAgIHRoaXMucmVtZW1iZXJTZWxlY3Rpb24oKTtcbiAgfTtcblxuICBDb250ZW50RWRpdGFibGVJbnB1dC5wcm90b3R5cGUuc3RhcnRHcmFjZVBlcmlvZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuZ3JhY2VQZXJpb2QpO1xuICAgIHRoaXMuZ3JhY2VQZXJpb2QgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMkMS5ncmFjZVBlcmlvZCA9IGZhbHNlO1xuICAgICAgaWYgKHRoaXMkMS5zZWxlY3Rpb25DaGFuZ2VkKCkpXG4gICAgICAgIHsgdGhpcyQxLmNtLm9wZXJhdGlvbihmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzJDEuY20uY3VyT3Auc2VsZWN0aW9uQ2hhbmdlZCA9IHRydWU7IH0pOyB9XG4gICAgfSwgMjApO1xuICB9O1xuXG4gIENvbnRlbnRFZGl0YWJsZUlucHV0LnByb3RvdHlwZS5zaG93TXVsdGlwbGVTZWxlY3Rpb25zID0gZnVuY3Rpb24gKGluZm8pIHtcbiAgICByZW1vdmVDaGlsZHJlbkFuZEFkZCh0aGlzLmNtLmRpc3BsYXkuY3Vyc29yRGl2LCBpbmZvLmN1cnNvcnMpO1xuICAgIHJlbW92ZUNoaWxkcmVuQW5kQWRkKHRoaXMuY20uZGlzcGxheS5zZWxlY3Rpb25EaXYsIGluZm8uc2VsZWN0aW9uKTtcbiAgfTtcblxuICBDb250ZW50RWRpdGFibGVJbnB1dC5wcm90b3R5cGUucmVtZW1iZXJTZWxlY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbCA9IHRoaXMuZ2V0U2VsZWN0aW9uKCk7XG4gICAgdGhpcy5sYXN0QW5jaG9yTm9kZSA9IHNlbC5hbmNob3JOb2RlOyB0aGlzLmxhc3RBbmNob3JPZmZzZXQgPSBzZWwuYW5jaG9yT2Zmc2V0O1xuICAgIHRoaXMubGFzdEZvY3VzTm9kZSA9IHNlbC5mb2N1c05vZGU7IHRoaXMubGFzdEZvY3VzT2Zmc2V0ID0gc2VsLmZvY3VzT2Zmc2V0O1xuICB9O1xuXG4gIENvbnRlbnRFZGl0YWJsZUlucHV0LnByb3RvdHlwZS5zZWxlY3Rpb25JbkVkaXRvciA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsID0gdGhpcy5nZXRTZWxlY3Rpb24oKTtcbiAgICBpZiAoIXNlbC5yYW5nZUNvdW50KSB7IHJldHVybiBmYWxzZSB9XG4gICAgdmFyIG5vZGUgPSBzZWwuZ2V0UmFuZ2VBdCgwKS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcbiAgICByZXR1cm4gY29udGFpbnModGhpcy5kaXYsIG5vZGUpXG4gIH07XG5cbiAgQ29udGVudEVkaXRhYmxlSW5wdXQucHJvdG90eXBlLmZvY3VzID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLmNtLm9wdGlvbnMucmVhZE9ubHkgIT0gXCJub2N1cnNvclwiKSB7XG4gICAgICBpZiAoIXRoaXMuc2VsZWN0aW9uSW5FZGl0b3IoKSB8fCBkb2N1bWVudC5hY3RpdmVFbGVtZW50ICE9IHRoaXMuZGl2KVxuICAgICAgICB7IHRoaXMuc2hvd1NlbGVjdGlvbih0aGlzLnByZXBhcmVTZWxlY3Rpb24oKSwgdHJ1ZSk7IH1cbiAgICAgIHRoaXMuZGl2LmZvY3VzKCk7XG4gICAgfVxuICB9O1xuICBDb250ZW50RWRpdGFibGVJbnB1dC5wcm90b3R5cGUuYmx1ciA9IGZ1bmN0aW9uICgpIHsgdGhpcy5kaXYuYmx1cigpOyB9O1xuICBDb250ZW50RWRpdGFibGVJbnB1dC5wcm90b3R5cGUuZ2V0RmllbGQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLmRpdiB9O1xuXG4gIENvbnRlbnRFZGl0YWJsZUlucHV0LnByb3RvdHlwZS5zdXBwb3J0c1RvdWNoID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdHJ1ZSB9O1xuXG4gIENvbnRlbnRFZGl0YWJsZUlucHV0LnByb3RvdHlwZS5yZWNlaXZlZEZvY3VzID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBpbnB1dCA9IHRoaXM7XG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uSW5FZGl0b3IoKSlcbiAgICAgIHsgdGhpcy5wb2xsU2VsZWN0aW9uKCk7IH1cbiAgICBlbHNlXG4gICAgICB7IHJ1bkluT3AodGhpcy5jbSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gaW5wdXQuY20uY3VyT3Auc2VsZWN0aW9uQ2hhbmdlZCA9IHRydWU7IH0pOyB9XG5cbiAgICBmdW5jdGlvbiBwb2xsKCkge1xuICAgICAgaWYgKGlucHV0LmNtLnN0YXRlLmZvY3VzZWQpIHtcbiAgICAgICAgaW5wdXQucG9sbFNlbGVjdGlvbigpO1xuICAgICAgICBpbnB1dC5wb2xsaW5nLnNldChpbnB1dC5jbS5vcHRpb25zLnBvbGxJbnRlcnZhbCwgcG9sbCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMucG9sbGluZy5zZXQodGhpcy5jbS5vcHRpb25zLnBvbGxJbnRlcnZhbCwgcG9sbCk7XG4gIH07XG5cbiAgQ29udGVudEVkaXRhYmxlSW5wdXQucHJvdG90eXBlLnNlbGVjdGlvbkNoYW5nZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbCA9IHRoaXMuZ2V0U2VsZWN0aW9uKCk7XG4gICAgcmV0dXJuIHNlbC5hbmNob3JOb2RlICE9IHRoaXMubGFzdEFuY2hvck5vZGUgfHwgc2VsLmFuY2hvck9mZnNldCAhPSB0aGlzLmxhc3RBbmNob3JPZmZzZXQgfHxcbiAgICAgIHNlbC5mb2N1c05vZGUgIT0gdGhpcy5sYXN0Rm9jdXNOb2RlIHx8IHNlbC5mb2N1c09mZnNldCAhPSB0aGlzLmxhc3RGb2N1c09mZnNldFxuICB9O1xuXG4gIENvbnRlbnRFZGl0YWJsZUlucHV0LnByb3RvdHlwZS5wb2xsU2VsZWN0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLnJlYWRET01UaW1lb3V0ICE9IG51bGwgfHwgdGhpcy5ncmFjZVBlcmlvZCB8fCAhdGhpcy5zZWxlY3Rpb25DaGFuZ2VkKCkpIHsgcmV0dXJuIH1cbiAgICB2YXIgc2VsID0gdGhpcy5nZXRTZWxlY3Rpb24oKSwgY20gPSB0aGlzLmNtO1xuICAgIC8vIE9uIEFuZHJvaWQgQ2hyb21lICh2ZXJzaW9uIDU2LCBhdCBsZWFzdCksIGJhY2tzcGFjaW5nIGludG8gYW5cbiAgICAvLyB1bmVkaXRhYmxlIGJsb2NrIGVsZW1lbnQgd2lsbCBwdXQgdGhlIGN1cnNvciBpbiB0aGF0IGVsZW1lbnQsXG4gICAgLy8gYW5kIHRoZW4sIGJlY2F1c2UgaXQncyBub3QgZWRpdGFibGUsIGhpZGUgdGhlIHZpcnR1YWwga2V5Ym9hcmQuXG4gICAgLy8gQmVjYXVzZSBBbmRyb2lkIGRvZXNuJ3QgYWxsb3cgdXMgdG8gYWN0dWFsbHkgZGV0ZWN0IGJhY2tzcGFjZVxuICAgIC8vIHByZXNzZXMgaW4gYSBzYW5lIHdheSwgdGhpcyBjb2RlIGNoZWNrcyBmb3Igd2hlbiB0aGF0IGhhcHBlbnNcbiAgICAvLyBhbmQgc2ltdWxhdGVzIGEgYmFja3NwYWNlIHByZXNzIGluIHRoaXMgY2FzZS5cbiAgICBpZiAoYW5kcm9pZCAmJiBjaHJvbWUgJiYgdGhpcy5jbS5kaXNwbGF5Lmd1dHRlclNwZWNzLmxlbmd0aCAmJiBpc0luR3V0dGVyKHNlbC5hbmNob3JOb2RlKSkge1xuICAgICAgdGhpcy5jbS50cmlnZ2VyT25LZXlEb3duKHt0eXBlOiBcImtleWRvd25cIiwga2V5Q29kZTogOCwgcHJldmVudERlZmF1bHQ6IE1hdGguYWJzfSk7XG4gICAgICB0aGlzLmJsdXIoKTtcbiAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAodGhpcy5jb21wb3NpbmcpIHsgcmV0dXJuIH1cbiAgICB0aGlzLnJlbWVtYmVyU2VsZWN0aW9uKCk7XG4gICAgdmFyIGFuY2hvciA9IGRvbVRvUG9zKGNtLCBzZWwuYW5jaG9yTm9kZSwgc2VsLmFuY2hvck9mZnNldCk7XG4gICAgdmFyIGhlYWQgPSBkb21Ub1BvcyhjbSwgc2VsLmZvY3VzTm9kZSwgc2VsLmZvY3VzT2Zmc2V0KTtcbiAgICBpZiAoYW5jaG9yICYmIGhlYWQpIHsgcnVuSW5PcChjbSwgZnVuY3Rpb24gKCkge1xuICAgICAgc2V0U2VsZWN0aW9uKGNtLmRvYywgc2ltcGxlU2VsZWN0aW9uKGFuY2hvciwgaGVhZCksIHNlbF9kb250U2Nyb2xsKTtcbiAgICAgIGlmIChhbmNob3IuYmFkIHx8IGhlYWQuYmFkKSB7IGNtLmN1ck9wLnNlbGVjdGlvbkNoYW5nZWQgPSB0cnVlOyB9XG4gICAgfSk7IH1cbiAgfTtcblxuICBDb250ZW50RWRpdGFibGVJbnB1dC5wcm90b3R5cGUucG9sbENvbnRlbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMucmVhZERPTVRpbWVvdXQgIT0gbnVsbCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVhZERPTVRpbWVvdXQpO1xuICAgICAgdGhpcy5yZWFkRE9NVGltZW91dCA9IG51bGw7XG4gICAgfVxuXG4gICAgdmFyIGNtID0gdGhpcy5jbSwgZGlzcGxheSA9IGNtLmRpc3BsYXksIHNlbCA9IGNtLmRvYy5zZWwucHJpbWFyeSgpO1xuICAgIHZhciBmcm9tID0gc2VsLmZyb20oKSwgdG8gPSBzZWwudG8oKTtcbiAgICBpZiAoZnJvbS5jaCA9PSAwICYmIGZyb20ubGluZSA+IGNtLmZpcnN0TGluZSgpKVxuICAgICAgeyBmcm9tID0gUG9zKGZyb20ubGluZSAtIDEsIGdldExpbmUoY20uZG9jLCBmcm9tLmxpbmUgLSAxKS5sZW5ndGgpOyB9XG4gICAgaWYgKHRvLmNoID09IGdldExpbmUoY20uZG9jLCB0by5saW5lKS50ZXh0Lmxlbmd0aCAmJiB0by5saW5lIDwgY20ubGFzdExpbmUoKSlcbiAgICAgIHsgdG8gPSBQb3ModG8ubGluZSArIDEsIDApOyB9XG4gICAgaWYgKGZyb20ubGluZSA8IGRpc3BsYXkudmlld0Zyb20gfHwgdG8ubGluZSA+IGRpc3BsYXkudmlld1RvIC0gMSkgeyByZXR1cm4gZmFsc2UgfVxuXG4gICAgdmFyIGZyb21JbmRleCwgZnJvbUxpbmUsIGZyb21Ob2RlO1xuICAgIGlmIChmcm9tLmxpbmUgPT0gZGlzcGxheS52aWV3RnJvbSB8fCAoZnJvbUluZGV4ID0gZmluZFZpZXdJbmRleChjbSwgZnJvbS5saW5lKSkgPT0gMCkge1xuICAgICAgZnJvbUxpbmUgPSBsaW5lTm8oZGlzcGxheS52aWV3WzBdLmxpbmUpO1xuICAgICAgZnJvbU5vZGUgPSBkaXNwbGF5LnZpZXdbMF0ubm9kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZnJvbUxpbmUgPSBsaW5lTm8oZGlzcGxheS52aWV3W2Zyb21JbmRleF0ubGluZSk7XG4gICAgICBmcm9tTm9kZSA9IGRpc3BsYXkudmlld1tmcm9tSW5kZXggLSAxXS5ub2RlLm5leHRTaWJsaW5nO1xuICAgIH1cbiAgICB2YXIgdG9JbmRleCA9IGZpbmRWaWV3SW5kZXgoY20sIHRvLmxpbmUpO1xuICAgIHZhciB0b0xpbmUsIHRvTm9kZTtcbiAgICBpZiAodG9JbmRleCA9PSBkaXNwbGF5LnZpZXcubGVuZ3RoIC0gMSkge1xuICAgICAgdG9MaW5lID0gZGlzcGxheS52aWV3VG8gLSAxO1xuICAgICAgdG9Ob2RlID0gZGlzcGxheS5saW5lRGl2Lmxhc3RDaGlsZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdG9MaW5lID0gbGluZU5vKGRpc3BsYXkudmlld1t0b0luZGV4ICsgMV0ubGluZSkgLSAxO1xuICAgICAgdG9Ob2RlID0gZGlzcGxheS52aWV3W3RvSW5kZXggKyAxXS5ub2RlLnByZXZpb3VzU2libGluZztcbiAgICB9XG5cbiAgICBpZiAoIWZyb21Ob2RlKSB7IHJldHVybiBmYWxzZSB9XG4gICAgdmFyIG5ld1RleHQgPSBjbS5kb2Muc3BsaXRMaW5lcyhkb21UZXh0QmV0d2VlbihjbSwgZnJvbU5vZGUsIHRvTm9kZSwgZnJvbUxpbmUsIHRvTGluZSkpO1xuICAgIHZhciBvbGRUZXh0ID0gZ2V0QmV0d2VlbihjbS5kb2MsIFBvcyhmcm9tTGluZSwgMCksIFBvcyh0b0xpbmUsIGdldExpbmUoY20uZG9jLCB0b0xpbmUpLnRleHQubGVuZ3RoKSk7XG4gICAgd2hpbGUgKG5ld1RleHQubGVuZ3RoID4gMSAmJiBvbGRUZXh0Lmxlbmd0aCA+IDEpIHtcbiAgICAgIGlmIChsc3QobmV3VGV4dCkgPT0gbHN0KG9sZFRleHQpKSB7IG5ld1RleHQucG9wKCk7IG9sZFRleHQucG9wKCk7IHRvTGluZS0tOyB9XG4gICAgICBlbHNlIGlmIChuZXdUZXh0WzBdID09IG9sZFRleHRbMF0pIHsgbmV3VGV4dC5zaGlmdCgpOyBvbGRUZXh0LnNoaWZ0KCk7IGZyb21MaW5lKys7IH1cbiAgICAgIGVsc2UgeyBicmVhayB9XG4gICAgfVxuXG4gICAgdmFyIGN1dEZyb250ID0gMCwgY3V0RW5kID0gMDtcbiAgICB2YXIgbmV3VG9wID0gbmV3VGV4dFswXSwgb2xkVG9wID0gb2xkVGV4dFswXSwgbWF4Q3V0RnJvbnQgPSBNYXRoLm1pbihuZXdUb3AubGVuZ3RoLCBvbGRUb3AubGVuZ3RoKTtcbiAgICB3aGlsZSAoY3V0RnJvbnQgPCBtYXhDdXRGcm9udCAmJiBuZXdUb3AuY2hhckNvZGVBdChjdXRGcm9udCkgPT0gb2xkVG9wLmNoYXJDb2RlQXQoY3V0RnJvbnQpKVxuICAgICAgeyArK2N1dEZyb250OyB9XG4gICAgdmFyIG5ld0JvdCA9IGxzdChuZXdUZXh0KSwgb2xkQm90ID0gbHN0KG9sZFRleHQpO1xuICAgIHZhciBtYXhDdXRFbmQgPSBNYXRoLm1pbihuZXdCb3QubGVuZ3RoIC0gKG5ld1RleHQubGVuZ3RoID09IDEgPyBjdXRGcm9udCA6IDApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRCb3QubGVuZ3RoIC0gKG9sZFRleHQubGVuZ3RoID09IDEgPyBjdXRGcm9udCA6IDApKTtcbiAgICB3aGlsZSAoY3V0RW5kIDwgbWF4Q3V0RW5kICYmXG4gICAgICAgICAgIG5ld0JvdC5jaGFyQ29kZUF0KG5ld0JvdC5sZW5ndGggLSBjdXRFbmQgLSAxKSA9PSBvbGRCb3QuY2hhckNvZGVBdChvbGRCb3QubGVuZ3RoIC0gY3V0RW5kIC0gMSkpXG4gICAgICB7ICsrY3V0RW5kOyB9XG4gICAgLy8gVHJ5IHRvIG1vdmUgc3RhcnQgb2YgY2hhbmdlIHRvIHN0YXJ0IG9mIHNlbGVjdGlvbiBpZiBhbWJpZ3VvdXNcbiAgICBpZiAobmV3VGV4dC5sZW5ndGggPT0gMSAmJiBvbGRUZXh0Lmxlbmd0aCA9PSAxICYmIGZyb21MaW5lID09IGZyb20ubGluZSkge1xuICAgICAgd2hpbGUgKGN1dEZyb250ICYmIGN1dEZyb250ID4gZnJvbS5jaCAmJlxuICAgICAgICAgICAgIG5ld0JvdC5jaGFyQ29kZUF0KG5ld0JvdC5sZW5ndGggLSBjdXRFbmQgLSAxKSA9PSBvbGRCb3QuY2hhckNvZGVBdChvbGRCb3QubGVuZ3RoIC0gY3V0RW5kIC0gMSkpIHtcbiAgICAgICAgY3V0RnJvbnQtLTtcbiAgICAgICAgY3V0RW5kKys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbmV3VGV4dFtuZXdUZXh0Lmxlbmd0aCAtIDFdID0gbmV3Qm90LnNsaWNlKDAsIG5ld0JvdC5sZW5ndGggLSBjdXRFbmQpLnJlcGxhY2UoL15cXHUyMDBiKy8sIFwiXCIpO1xuICAgIG5ld1RleHRbMF0gPSBuZXdUZXh0WzBdLnNsaWNlKGN1dEZyb250KS5yZXBsYWNlKC9cXHUyMDBiKyQvLCBcIlwiKTtcblxuICAgIHZhciBjaEZyb20gPSBQb3MoZnJvbUxpbmUsIGN1dEZyb250KTtcbiAgICB2YXIgY2hUbyA9IFBvcyh0b0xpbmUsIG9sZFRleHQubGVuZ3RoID8gbHN0KG9sZFRleHQpLmxlbmd0aCAtIGN1dEVuZCA6IDApO1xuICAgIGlmIChuZXdUZXh0Lmxlbmd0aCA+IDEgfHwgbmV3VGV4dFswXSB8fCBjbXAoY2hGcm9tLCBjaFRvKSkge1xuICAgICAgcmVwbGFjZVJhbmdlKGNtLmRvYywgbmV3VGV4dCwgY2hGcm9tLCBjaFRvLCBcIitpbnB1dFwiKTtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9O1xuXG4gIENvbnRlbnRFZGl0YWJsZUlucHV0LnByb3RvdHlwZS5lbnN1cmVQb2xsZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5mb3JjZUNvbXBvc2l0aW9uRW5kKCk7XG4gIH07XG4gIENvbnRlbnRFZGl0YWJsZUlucHV0LnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZvcmNlQ29tcG9zaXRpb25FbmQoKTtcbiAgfTtcbiAgQ29udGVudEVkaXRhYmxlSW5wdXQucHJvdG90eXBlLmZvcmNlQ29tcG9zaXRpb25FbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0aGlzLmNvbXBvc2luZykgeyByZXR1cm4gfVxuICAgIGNsZWFyVGltZW91dCh0aGlzLnJlYWRET01UaW1lb3V0KTtcbiAgICB0aGlzLmNvbXBvc2luZyA9IG51bGw7XG4gICAgdGhpcy51cGRhdGVGcm9tRE9NKCk7XG4gICAgdGhpcy5kaXYuYmx1cigpO1xuICAgIHRoaXMuZGl2LmZvY3VzKCk7XG4gIH07XG4gIENvbnRlbnRFZGl0YWJsZUlucHV0LnByb3RvdHlwZS5yZWFkRnJvbURPTVNvb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIGlmICh0aGlzLnJlYWRET01UaW1lb3V0ICE9IG51bGwpIHsgcmV0dXJuIH1cbiAgICB0aGlzLnJlYWRET01UaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzJDEucmVhZERPTVRpbWVvdXQgPSBudWxsO1xuICAgICAgaWYgKHRoaXMkMS5jb21wb3NpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMkMS5jb21wb3NpbmcuZG9uZSkgeyB0aGlzJDEuY29tcG9zaW5nID0gbnVsbDsgfVxuICAgICAgICBlbHNlIHsgcmV0dXJuIH1cbiAgICAgIH1cbiAgICAgIHRoaXMkMS51cGRhdGVGcm9tRE9NKCk7XG4gICAgfSwgODApO1xuICB9O1xuXG4gIENvbnRlbnRFZGl0YWJsZUlucHV0LnByb3RvdHlwZS51cGRhdGVGcm9tRE9NID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICBpZiAodGhpcy5jbS5pc1JlYWRPbmx5KCkgfHwgIXRoaXMucG9sbENvbnRlbnQoKSlcbiAgICAgIHsgcnVuSW5PcCh0aGlzLmNtLCBmdW5jdGlvbiAoKSB7IHJldHVybiByZWdDaGFuZ2UodGhpcyQxLmNtKTsgfSk7IH1cbiAgfTtcblxuICBDb250ZW50RWRpdGFibGVJbnB1dC5wcm90b3R5cGUuc2V0VW5lZGl0YWJsZSA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgbm9kZS5jb250ZW50RWRpdGFibGUgPSBcImZhbHNlXCI7XG4gIH07XG5cbiAgQ29udGVudEVkaXRhYmxlSW5wdXQucHJvdG90eXBlLm9uS2V5UHJlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgIGlmIChlLmNoYXJDb2RlID09IDAgfHwgdGhpcy5jb21wb3NpbmcpIHsgcmV0dXJuIH1cbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgaWYgKCF0aGlzLmNtLmlzUmVhZE9ubHkoKSlcbiAgICAgIHsgb3BlcmF0aW9uKHRoaXMuY20sIGFwcGx5VGV4dElucHV0KSh0aGlzLmNtLCBTdHJpbmcuZnJvbUNoYXJDb2RlKGUuY2hhckNvZGUgPT0gbnVsbCA/IGUua2V5Q29kZSA6IGUuY2hhckNvZGUpLCAwKTsgfVxuICB9O1xuXG4gIENvbnRlbnRFZGl0YWJsZUlucHV0LnByb3RvdHlwZS5yZWFkT25seUNoYW5nZWQgPSBmdW5jdGlvbiAodmFsKSB7XG4gICAgdGhpcy5kaXYuY29udGVudEVkaXRhYmxlID0gU3RyaW5nKHZhbCAhPSBcIm5vY3Vyc29yXCIpO1xuICB9O1xuXG4gIENvbnRlbnRFZGl0YWJsZUlucHV0LnByb3RvdHlwZS5vbkNvbnRleHRNZW51ID0gZnVuY3Rpb24gKCkge307XG4gIENvbnRlbnRFZGl0YWJsZUlucHV0LnByb3RvdHlwZS5yZXNldFBvc2l0aW9uID0gZnVuY3Rpb24gKCkge307XG5cbiAgQ29udGVudEVkaXRhYmxlSW5wdXQucHJvdG90eXBlLm5lZWRzQ29udGVudEF0dHJpYnV0ZSA9IHRydWU7XG5cbiAgZnVuY3Rpb24gcG9zVG9ET00oY20sIHBvcykge1xuICAgIHZhciB2aWV3ID0gZmluZFZpZXdGb3JMaW5lKGNtLCBwb3MubGluZSk7XG4gICAgaWYgKCF2aWV3IHx8IHZpZXcuaGlkZGVuKSB7IHJldHVybiBudWxsIH1cbiAgICB2YXIgbGluZSA9IGdldExpbmUoY20uZG9jLCBwb3MubGluZSk7XG4gICAgdmFyIGluZm8gPSBtYXBGcm9tTGluZVZpZXcodmlldywgbGluZSwgcG9zLmxpbmUpO1xuXG4gICAgdmFyIG9yZGVyID0gZ2V0T3JkZXIobGluZSwgY20uZG9jLmRpcmVjdGlvbiksIHNpZGUgPSBcImxlZnRcIjtcbiAgICBpZiAob3JkZXIpIHtcbiAgICAgIHZhciBwYXJ0UG9zID0gZ2V0QmlkaVBhcnRBdChvcmRlciwgcG9zLmNoKTtcbiAgICAgIHNpZGUgPSBwYXJ0UG9zICUgMiA/IFwicmlnaHRcIiA6IFwibGVmdFwiO1xuICAgIH1cbiAgICB2YXIgcmVzdWx0ID0gbm9kZUFuZE9mZnNldEluTGluZU1hcChpbmZvLm1hcCwgcG9zLmNoLCBzaWRlKTtcbiAgICByZXN1bHQub2Zmc2V0ID0gcmVzdWx0LmNvbGxhcHNlID09IFwicmlnaHRcIiA/IHJlc3VsdC5lbmQgOiByZXN1bHQuc3RhcnQ7XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgZnVuY3Rpb24gaXNJbkd1dHRlcihub2RlKSB7XG4gICAgZm9yICh2YXIgc2NhbiA9IG5vZGU7IHNjYW47IHNjYW4gPSBzY2FuLnBhcmVudE5vZGUpXG4gICAgICB7IGlmICgvQ29kZU1pcnJvci1ndXR0ZXItd3JhcHBlci8udGVzdChzY2FuLmNsYXNzTmFtZSkpIHsgcmV0dXJuIHRydWUgfSB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBmdW5jdGlvbiBiYWRQb3MocG9zLCBiYWQpIHsgaWYgKGJhZCkgeyBwb3MuYmFkID0gdHJ1ZTsgfSByZXR1cm4gcG9zIH1cblxuICBmdW5jdGlvbiBkb21UZXh0QmV0d2VlbihjbSwgZnJvbSwgdG8sIGZyb21MaW5lLCB0b0xpbmUpIHtcbiAgICB2YXIgdGV4dCA9IFwiXCIsIGNsb3NpbmcgPSBmYWxzZSwgbGluZVNlcCA9IGNtLmRvYy5saW5lU2VwYXJhdG9yKCksIGV4dHJhTGluZWJyZWFrID0gZmFsc2U7XG4gICAgZnVuY3Rpb24gcmVjb2duaXplTWFya2VyKGlkKSB7IHJldHVybiBmdW5jdGlvbiAobWFya2VyKSB7IHJldHVybiBtYXJrZXIuaWQgPT0gaWQ7IH0gfVxuICAgIGZ1bmN0aW9uIGNsb3NlKCkge1xuICAgICAgaWYgKGNsb3NpbmcpIHtcbiAgICAgICAgdGV4dCArPSBsaW5lU2VwO1xuICAgICAgICBpZiAoZXh0cmFMaW5lYnJlYWspIHsgdGV4dCArPSBsaW5lU2VwOyB9XG4gICAgICAgIGNsb3NpbmcgPSBleHRyYUxpbmVicmVhayA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBhZGRUZXh0KHN0cikge1xuICAgICAgaWYgKHN0cikge1xuICAgICAgICBjbG9zZSgpO1xuICAgICAgICB0ZXh0ICs9IHN0cjtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gd2Fsayhub2RlKSB7XG4gICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAxKSB7XG4gICAgICAgIHZhciBjbVRleHQgPSBub2RlLmdldEF0dHJpYnV0ZShcImNtLXRleHRcIik7XG4gICAgICAgIGlmIChjbVRleHQpIHtcbiAgICAgICAgICBhZGRUZXh0KGNtVGV4dCk7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgdmFyIG1hcmtlcklEID0gbm9kZS5nZXRBdHRyaWJ1dGUoXCJjbS1tYXJrZXJcIiksIHJhbmdlO1xuICAgICAgICBpZiAobWFya2VySUQpIHtcbiAgICAgICAgICB2YXIgZm91bmQgPSBjbS5maW5kTWFya3MoUG9zKGZyb21MaW5lLCAwKSwgUG9zKHRvTGluZSArIDEsIDApLCByZWNvZ25pemVNYXJrZXIoK21hcmtlcklEKSk7XG4gICAgICAgICAgaWYgKGZvdW5kLmxlbmd0aCAmJiAocmFuZ2UgPSBmb3VuZFswXS5maW5kKDApKSlcbiAgICAgICAgICAgIHsgYWRkVGV4dChnZXRCZXR3ZWVuKGNtLmRvYywgcmFuZ2UuZnJvbSwgcmFuZ2UudG8pLmpvaW4obGluZVNlcCkpOyB9XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuZ2V0QXR0cmlidXRlKFwiY29udGVudGVkaXRhYmxlXCIpID09IFwiZmFsc2VcIikgeyByZXR1cm4gfVxuICAgICAgICB2YXIgaXNCbG9jayA9IC9eKHByZXxkaXZ8cHxsaXx0YWJsZXxicikkL2kudGVzdChub2RlLm5vZGVOYW1lKTtcbiAgICAgICAgaWYgKCEvXmJyJC9pLnRlc3Qobm9kZS5ub2RlTmFtZSkgJiYgbm9kZS50ZXh0Q29udGVudC5sZW5ndGggPT0gMCkgeyByZXR1cm4gfVxuXG4gICAgICAgIGlmIChpc0Jsb2NrKSB7IGNsb3NlKCk7IH1cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgeyB3YWxrKG5vZGUuY2hpbGROb2Rlc1tpXSk7IH1cblxuICAgICAgICBpZiAoL14ocHJlfHApJC9pLnRlc3Qobm9kZS5ub2RlTmFtZSkpIHsgZXh0cmFMaW5lYnJlYWsgPSB0cnVlOyB9XG4gICAgICAgIGlmIChpc0Jsb2NrKSB7IGNsb3NpbmcgPSB0cnVlOyB9XG4gICAgICB9IGVsc2UgaWYgKG5vZGUubm9kZVR5cGUgPT0gMykge1xuICAgICAgICBhZGRUZXh0KG5vZGUubm9kZVZhbHVlLnJlcGxhY2UoL1xcdTIwMGIvZywgXCJcIikucmVwbGFjZSgvXFx1MDBhMC9nLCBcIiBcIikpO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKDs7KSB7XG4gICAgICB3YWxrKGZyb20pO1xuICAgICAgaWYgKGZyb20gPT0gdG8pIHsgYnJlYWsgfVxuICAgICAgZnJvbSA9IGZyb20ubmV4dFNpYmxpbmc7XG4gICAgICBleHRyYUxpbmVicmVhayA9IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGV4dFxuICB9XG5cbiAgZnVuY3Rpb24gZG9tVG9Qb3MoY20sIG5vZGUsIG9mZnNldCkge1xuICAgIHZhciBsaW5lTm9kZTtcbiAgICBpZiAobm9kZSA9PSBjbS5kaXNwbGF5LmxpbmVEaXYpIHtcbiAgICAgIGxpbmVOb2RlID0gY20uZGlzcGxheS5saW5lRGl2LmNoaWxkTm9kZXNbb2Zmc2V0XTtcbiAgICAgIGlmICghbGluZU5vZGUpIHsgcmV0dXJuIGJhZFBvcyhjbS5jbGlwUG9zKFBvcyhjbS5kaXNwbGF5LnZpZXdUbyAtIDEpKSwgdHJ1ZSkgfVxuICAgICAgbm9kZSA9IG51bGw7IG9mZnNldCA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGluZU5vZGUgPSBub2RlOzsgbGluZU5vZGUgPSBsaW5lTm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgIGlmICghbGluZU5vZGUgfHwgbGluZU5vZGUgPT0gY20uZGlzcGxheS5saW5lRGl2KSB7IHJldHVybiBudWxsIH1cbiAgICAgICAgaWYgKGxpbmVOb2RlLnBhcmVudE5vZGUgJiYgbGluZU5vZGUucGFyZW50Tm9kZSA9PSBjbS5kaXNwbGF5LmxpbmVEaXYpIHsgYnJlYWsgfVxuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNtLmRpc3BsYXkudmlldy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGxpbmVWaWV3ID0gY20uZGlzcGxheS52aWV3W2ldO1xuICAgICAgaWYgKGxpbmVWaWV3Lm5vZGUgPT0gbGluZU5vZGUpXG4gICAgICAgIHsgcmV0dXJuIGxvY2F0ZU5vZGVJbkxpbmVWaWV3KGxpbmVWaWV3LCBub2RlLCBvZmZzZXQpIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBsb2NhdGVOb2RlSW5MaW5lVmlldyhsaW5lVmlldywgbm9kZSwgb2Zmc2V0KSB7XG4gICAgdmFyIHdyYXBwZXIgPSBsaW5lVmlldy50ZXh0LmZpcnN0Q2hpbGQsIGJhZCA9IGZhbHNlO1xuICAgIGlmICghbm9kZSB8fCAhY29udGFpbnMod3JhcHBlciwgbm9kZSkpIHsgcmV0dXJuIGJhZFBvcyhQb3MobGluZU5vKGxpbmVWaWV3LmxpbmUpLCAwKSwgdHJ1ZSkgfVxuICAgIGlmIChub2RlID09IHdyYXBwZXIpIHtcbiAgICAgIGJhZCA9IHRydWU7XG4gICAgICBub2RlID0gd3JhcHBlci5jaGlsZE5vZGVzW29mZnNldF07XG4gICAgICBvZmZzZXQgPSAwO1xuICAgICAgaWYgKCFub2RlKSB7XG4gICAgICAgIHZhciBsaW5lID0gbGluZVZpZXcucmVzdCA/IGxzdChsaW5lVmlldy5yZXN0KSA6IGxpbmVWaWV3LmxpbmU7XG4gICAgICAgIHJldHVybiBiYWRQb3MoUG9zKGxpbmVObyhsaW5lKSwgbGluZS50ZXh0Lmxlbmd0aCksIGJhZClcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgdGV4dE5vZGUgPSBub2RlLm5vZGVUeXBlID09IDMgPyBub2RlIDogbnVsbCwgdG9wTm9kZSA9IG5vZGU7XG4gICAgaWYgKCF0ZXh0Tm9kZSAmJiBub2RlLmNoaWxkTm9kZXMubGVuZ3RoID09IDEgJiYgbm9kZS5maXJzdENoaWxkLm5vZGVUeXBlID09IDMpIHtcbiAgICAgIHRleHROb2RlID0gbm9kZS5maXJzdENoaWxkO1xuICAgICAgaWYgKG9mZnNldCkgeyBvZmZzZXQgPSB0ZXh0Tm9kZS5ub2RlVmFsdWUubGVuZ3RoOyB9XG4gICAgfVxuICAgIHdoaWxlICh0b3BOb2RlLnBhcmVudE5vZGUgIT0gd3JhcHBlcikgeyB0b3BOb2RlID0gdG9wTm9kZS5wYXJlbnROb2RlOyB9XG4gICAgdmFyIG1lYXN1cmUgPSBsaW5lVmlldy5tZWFzdXJlLCBtYXBzID0gbWVhc3VyZS5tYXBzO1xuXG4gICAgZnVuY3Rpb24gZmluZCh0ZXh0Tm9kZSwgdG9wTm9kZSwgb2Zmc2V0KSB7XG4gICAgICBmb3IgKHZhciBpID0gLTE7IGkgPCAobWFwcyA/IG1hcHMubGVuZ3RoIDogMCk7IGkrKykge1xuICAgICAgICB2YXIgbWFwID0gaSA8IDAgPyBtZWFzdXJlLm1hcCA6IG1hcHNbaV07XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbWFwLmxlbmd0aDsgaiArPSAzKSB7XG4gICAgICAgICAgdmFyIGN1ck5vZGUgPSBtYXBbaiArIDJdO1xuICAgICAgICAgIGlmIChjdXJOb2RlID09IHRleHROb2RlIHx8IGN1ck5vZGUgPT0gdG9wTm9kZSkge1xuICAgICAgICAgICAgdmFyIGxpbmUgPSBsaW5lTm8oaSA8IDAgPyBsaW5lVmlldy5saW5lIDogbGluZVZpZXcucmVzdFtpXSk7XG4gICAgICAgICAgICB2YXIgY2ggPSBtYXBbal0gKyBvZmZzZXQ7XG4gICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBjdXJOb2RlICE9IHRleHROb2RlKSB7IGNoID0gbWFwW2ogKyAob2Zmc2V0ID8gMSA6IDApXTsgfVxuICAgICAgICAgICAgcmV0dXJuIFBvcyhsaW5lLCBjaClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIGZvdW5kID0gZmluZCh0ZXh0Tm9kZSwgdG9wTm9kZSwgb2Zmc2V0KTtcbiAgICBpZiAoZm91bmQpIHsgcmV0dXJuIGJhZFBvcyhmb3VuZCwgYmFkKSB9XG5cbiAgICAvLyBGSVhNRSB0aGlzIGlzIGFsbCByZWFsbHkgc2hha3kuIG1pZ2h0IGhhbmRsZSB0aGUgZmV3IGNhc2VzIGl0IG5lZWRzIHRvIGhhbmRsZSwgYnV0IGxpa2VseSB0byBjYXVzZSBwcm9ibGVtc1xuICAgIGZvciAodmFyIGFmdGVyID0gdG9wTm9kZS5uZXh0U2libGluZywgZGlzdCA9IHRleHROb2RlID8gdGV4dE5vZGUubm9kZVZhbHVlLmxlbmd0aCAtIG9mZnNldCA6IDA7IGFmdGVyOyBhZnRlciA9IGFmdGVyLm5leHRTaWJsaW5nKSB7XG4gICAgICBmb3VuZCA9IGZpbmQoYWZ0ZXIsIGFmdGVyLmZpcnN0Q2hpbGQsIDApO1xuICAgICAgaWYgKGZvdW5kKVxuICAgICAgICB7IHJldHVybiBiYWRQb3MoUG9zKGZvdW5kLmxpbmUsIGZvdW5kLmNoIC0gZGlzdCksIGJhZCkgfVxuICAgICAgZWxzZVxuICAgICAgICB7IGRpc3QgKz0gYWZ0ZXIudGV4dENvbnRlbnQubGVuZ3RoOyB9XG4gICAgfVxuICAgIGZvciAodmFyIGJlZm9yZSA9IHRvcE5vZGUucHJldmlvdXNTaWJsaW5nLCBkaXN0JDEgPSBvZmZzZXQ7IGJlZm9yZTsgYmVmb3JlID0gYmVmb3JlLnByZXZpb3VzU2libGluZykge1xuICAgICAgZm91bmQgPSBmaW5kKGJlZm9yZSwgYmVmb3JlLmZpcnN0Q2hpbGQsIC0xKTtcbiAgICAgIGlmIChmb3VuZClcbiAgICAgICAgeyByZXR1cm4gYmFkUG9zKFBvcyhmb3VuZC5saW5lLCBmb3VuZC5jaCArIGRpc3QkMSksIGJhZCkgfVxuICAgICAgZWxzZVxuICAgICAgICB7IGRpc3QkMSArPSBiZWZvcmUudGV4dENvbnRlbnQubGVuZ3RoOyB9XG4gICAgfVxuICB9XG5cbiAgLy8gVEVYVEFSRUEgSU5QVVQgU1RZTEVcblxuICB2YXIgVGV4dGFyZWFJbnB1dCA9IGZ1bmN0aW9uKGNtKSB7XG4gICAgdGhpcy5jbSA9IGNtO1xuICAgIC8vIFNlZSBpbnB1dC5wb2xsIGFuZCBpbnB1dC5yZXNldFxuICAgIHRoaXMucHJldklucHV0ID0gXCJcIjtcblxuICAgIC8vIEZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB3ZSBleHBlY3QgaW5wdXQgdG8gYXBwZWFyIHJlYWwgc29vblxuICAgIC8vIG5vdyAoYWZ0ZXIgc29tZSBldmVudCBsaWtlICdrZXlwcmVzcycgb3IgJ2lucHV0JykgYW5kIGFyZVxuICAgIC8vIHBvbGxpbmcgaW50ZW5zaXZlbHkuXG4gICAgdGhpcy5wb2xsaW5nRmFzdCA9IGZhbHNlO1xuICAgIC8vIFNlbGYtcmVzZXR0aW5nIHRpbWVvdXQgZm9yIHRoZSBwb2xsZXJcbiAgICB0aGlzLnBvbGxpbmcgPSBuZXcgRGVsYXllZCgpO1xuICAgIC8vIFVzZWQgdG8gd29yayBhcm91bmQgSUUgaXNzdWUgd2l0aCBzZWxlY3Rpb24gYmVpbmcgZm9yZ290dGVuIHdoZW4gZm9jdXMgbW92ZXMgYXdheSBmcm9tIHRleHRhcmVhXG4gICAgdGhpcy5oYXNTZWxlY3Rpb24gPSBmYWxzZTtcbiAgICB0aGlzLmNvbXBvc2luZyA9IG51bGw7XG4gIH07XG5cbiAgVGV4dGFyZWFJbnB1dC5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uIChkaXNwbGF5KSB7XG4gICAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIHZhciBpbnB1dCA9IHRoaXMsIGNtID0gdGhpcy5jbTtcbiAgICB0aGlzLmNyZWF0ZUZpZWxkKGRpc3BsYXkpO1xuICAgIHZhciB0ZSA9IHRoaXMudGV4dGFyZWE7XG5cbiAgICBkaXNwbGF5LndyYXBwZXIuaW5zZXJ0QmVmb3JlKHRoaXMud3JhcHBlciwgZGlzcGxheS53cmFwcGVyLmZpcnN0Q2hpbGQpO1xuXG4gICAgLy8gTmVlZGVkIHRvIGhpZGUgYmlnIGJsdWUgYmxpbmtpbmcgY3Vyc29yIG9uIE1vYmlsZSBTYWZhcmkgKGRvZXNuJ3Qgc2VlbSB0byB3b3JrIGluIGlPUyA4IGFueW1vcmUpXG4gICAgaWYgKGlvcykgeyB0ZS5zdHlsZS53aWR0aCA9IFwiMHB4XCI7IH1cblxuICAgIG9uKHRlLCBcImlucHV0XCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChpZSAmJiBpZV92ZXJzaW9uID49IDkgJiYgdGhpcyQxLmhhc1NlbGVjdGlvbikgeyB0aGlzJDEuaGFzU2VsZWN0aW9uID0gbnVsbDsgfVxuICAgICAgaW5wdXQucG9sbCgpO1xuICAgIH0pO1xuXG4gICAgb24odGUsIFwicGFzdGVcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmIChzaWduYWxET01FdmVudChjbSwgZSkgfHwgaGFuZGxlUGFzdGUoZSwgY20pKSB7IHJldHVybiB9XG5cbiAgICAgIGNtLnN0YXRlLnBhc3RlSW5jb21pbmcgPSArbmV3IERhdGU7XG4gICAgICBpbnB1dC5mYXN0UG9sbCgpO1xuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gcHJlcGFyZUNvcHlDdXQoZSkge1xuICAgICAgaWYgKHNpZ25hbERPTUV2ZW50KGNtLCBlKSkgeyByZXR1cm4gfVxuICAgICAgaWYgKGNtLnNvbWV0aGluZ1NlbGVjdGVkKCkpIHtcbiAgICAgICAgc2V0TGFzdENvcGllZCh7bGluZVdpc2U6IGZhbHNlLCB0ZXh0OiBjbS5nZXRTZWxlY3Rpb25zKCl9KTtcbiAgICAgIH0gZWxzZSBpZiAoIWNtLm9wdGlvbnMubGluZVdpc2VDb3B5Q3V0KSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHJhbmdlcyA9IGNvcHlhYmxlUmFuZ2VzKGNtKTtcbiAgICAgICAgc2V0TGFzdENvcGllZCh7bGluZVdpc2U6IHRydWUsIHRleHQ6IHJhbmdlcy50ZXh0fSk7XG4gICAgICAgIGlmIChlLnR5cGUgPT0gXCJjdXRcIikge1xuICAgICAgICAgIGNtLnNldFNlbGVjdGlvbnMocmFuZ2VzLnJhbmdlcywgbnVsbCwgc2VsX2RvbnRTY3JvbGwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlucHV0LnByZXZJbnB1dCA9IFwiXCI7XG4gICAgICAgICAgdGUudmFsdWUgPSByYW5nZXMudGV4dC5qb2luKFwiXFxuXCIpO1xuICAgICAgICAgIHNlbGVjdElucHV0KHRlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGUudHlwZSA9PSBcImN1dFwiKSB7IGNtLnN0YXRlLmN1dEluY29taW5nID0gK25ldyBEYXRlOyB9XG4gICAgfVxuICAgIG9uKHRlLCBcImN1dFwiLCBwcmVwYXJlQ29weUN1dCk7XG4gICAgb24odGUsIFwiY29weVwiLCBwcmVwYXJlQ29weUN1dCk7XG5cbiAgICBvbihkaXNwbGF5LnNjcm9sbGVyLCBcInBhc3RlXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoZXZlbnRJbldpZGdldChkaXNwbGF5LCBlKSB8fCBzaWduYWxET01FdmVudChjbSwgZSkpIHsgcmV0dXJuIH1cbiAgICAgIGlmICghdGUuZGlzcGF0Y2hFdmVudCkge1xuICAgICAgICBjbS5zdGF0ZS5wYXN0ZUluY29taW5nID0gK25ldyBEYXRlO1xuICAgICAgICBpbnB1dC5mb2N1cygpO1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gUGFzcyB0aGUgYHBhc3RlYCBldmVudCB0byB0aGUgdGV4dGFyZWEgc28gaXQncyBoYW5kbGVkIGJ5IGl0cyBldmVudCBsaXN0ZW5lci5cbiAgICAgIHZhciBldmVudCA9IG5ldyBFdmVudChcInBhc3RlXCIpO1xuICAgICAgZXZlbnQuY2xpcGJvYXJkRGF0YSA9IGUuY2xpcGJvYXJkRGF0YTtcbiAgICAgIHRlLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgIH0pO1xuXG4gICAgLy8gUHJldmVudCBub3JtYWwgc2VsZWN0aW9uIGluIHRoZSBlZGl0b3IgKHdlIGhhbmRsZSBvdXIgb3duKVxuICAgIG9uKGRpc3BsYXkubGluZVNwYWNlLCBcInNlbGVjdHN0YXJ0XCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoIWV2ZW50SW5XaWRnZXQoZGlzcGxheSwgZSkpIHsgZV9wcmV2ZW50RGVmYXVsdChlKTsgfVxuICAgIH0pO1xuXG4gICAgb24odGUsIFwiY29tcG9zaXRpb25zdGFydFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgc3RhcnQgPSBjbS5nZXRDdXJzb3IoXCJmcm9tXCIpO1xuICAgICAgaWYgKGlucHV0LmNvbXBvc2luZykgeyBpbnB1dC5jb21wb3NpbmcucmFuZ2UuY2xlYXIoKTsgfVxuICAgICAgaW5wdXQuY29tcG9zaW5nID0ge1xuICAgICAgICBzdGFydDogc3RhcnQsXG4gICAgICAgIHJhbmdlOiBjbS5tYXJrVGV4dChzdGFydCwgY20uZ2V0Q3Vyc29yKFwidG9cIiksIHtjbGFzc05hbWU6IFwiQ29kZU1pcnJvci1jb21wb3NpbmdcIn0pXG4gICAgICB9O1xuICAgIH0pO1xuICAgIG9uKHRlLCBcImNvbXBvc2l0aW9uZW5kXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChpbnB1dC5jb21wb3NpbmcpIHtcbiAgICAgICAgaW5wdXQucG9sbCgpO1xuICAgICAgICBpbnB1dC5jb21wb3NpbmcucmFuZ2UuY2xlYXIoKTtcbiAgICAgICAgaW5wdXQuY29tcG9zaW5nID0gbnVsbDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBUZXh0YXJlYUlucHV0LnByb3RvdHlwZS5jcmVhdGVGaWVsZCA9IGZ1bmN0aW9uIChfZGlzcGxheSkge1xuICAgIC8vIFdyYXBzIGFuZCBoaWRlcyBpbnB1dCB0ZXh0YXJlYVxuICAgIHRoaXMud3JhcHBlciA9IGhpZGRlblRleHRhcmVhKCk7XG4gICAgLy8gVGhlIHNlbWloaWRkZW4gdGV4dGFyZWEgdGhhdCBpcyBmb2N1c2VkIHdoZW4gdGhlIGVkaXRvciBpc1xuICAgIC8vIGZvY3VzZWQsIGFuZCByZWNlaXZlcyBpbnB1dC5cbiAgICB0aGlzLnRleHRhcmVhID0gdGhpcy53cmFwcGVyLmZpcnN0Q2hpbGQ7XG4gIH07XG5cbiAgVGV4dGFyZWFJbnB1dC5wcm90b3R5cGUuc2NyZWVuUmVhZGVyTGFiZWxDaGFuZ2VkID0gZnVuY3Rpb24gKGxhYmVsKSB7XG4gICAgLy8gTGFiZWwgZm9yIHNjcmVlbnJlYWRlcnMsIGFjY2Vzc2liaWxpdHlcbiAgICBpZihsYWJlbCkge1xuICAgICAgdGhpcy50ZXh0YXJlYS5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCBsYWJlbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudGV4dGFyZWEucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWxhYmVsJyk7XG4gICAgfVxuICB9O1xuXG4gIFRleHRhcmVhSW5wdXQucHJvdG90eXBlLnByZXBhcmVTZWxlY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8gUmVkcmF3IHRoZSBzZWxlY3Rpb24gYW5kL29yIGN1cnNvclxuICAgIHZhciBjbSA9IHRoaXMuY20sIGRpc3BsYXkgPSBjbS5kaXNwbGF5LCBkb2MgPSBjbS5kb2M7XG4gICAgdmFyIHJlc3VsdCA9IHByZXBhcmVTZWxlY3Rpb24oY20pO1xuXG4gICAgLy8gTW92ZSB0aGUgaGlkZGVuIHRleHRhcmVhIG5lYXIgdGhlIGN1cnNvciB0byBwcmV2ZW50IHNjcm9sbGluZyBhcnRpZmFjdHNcbiAgICBpZiAoY20ub3B0aW9ucy5tb3ZlSW5wdXRXaXRoQ3Vyc29yKSB7XG4gICAgICB2YXIgaGVhZFBvcyA9IGN1cnNvckNvb3JkcyhjbSwgZG9jLnNlbC5wcmltYXJ5KCkuaGVhZCwgXCJkaXZcIik7XG4gICAgICB2YXIgd3JhcE9mZiA9IGRpc3BsYXkud3JhcHBlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgbGluZU9mZiA9IGRpc3BsYXkubGluZURpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHJlc3VsdC50ZVRvcCA9IE1hdGgubWF4KDAsIE1hdGgubWluKGRpc3BsYXkud3JhcHBlci5jbGllbnRIZWlnaHQgLSAxMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRQb3MudG9wICsgbGluZU9mZi50b3AgLSB3cmFwT2ZmLnRvcCkpO1xuICAgICAgcmVzdWx0LnRlTGVmdCA9IE1hdGgubWF4KDAsIE1hdGgubWluKGRpc3BsYXkud3JhcHBlci5jbGllbnRXaWR0aCAtIDEwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRQb3MubGVmdCArIGxpbmVPZmYubGVmdCAtIHdyYXBPZmYubGVmdCkpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfTtcblxuICBUZXh0YXJlYUlucHV0LnByb3RvdHlwZS5zaG93U2VsZWN0aW9uID0gZnVuY3Rpb24gKGRyYXduKSB7XG4gICAgdmFyIGNtID0gdGhpcy5jbSwgZGlzcGxheSA9IGNtLmRpc3BsYXk7XG4gICAgcmVtb3ZlQ2hpbGRyZW5BbmRBZGQoZGlzcGxheS5jdXJzb3JEaXYsIGRyYXduLmN1cnNvcnMpO1xuICAgIHJlbW92ZUNoaWxkcmVuQW5kQWRkKGRpc3BsYXkuc2VsZWN0aW9uRGl2LCBkcmF3bi5zZWxlY3Rpb24pO1xuICAgIGlmIChkcmF3bi50ZVRvcCAhPSBudWxsKSB7XG4gICAgICB0aGlzLndyYXBwZXIuc3R5bGUudG9wID0gZHJhd24udGVUb3AgKyBcInB4XCI7XG4gICAgICB0aGlzLndyYXBwZXIuc3R5bGUubGVmdCA9IGRyYXduLnRlTGVmdCArIFwicHhcIjtcbiAgICB9XG4gIH07XG5cbiAgLy8gUmVzZXQgdGhlIGlucHV0IHRvIGNvcnJlc3BvbmQgdG8gdGhlIHNlbGVjdGlvbiAob3IgdG8gYmUgZW1wdHksXG4gIC8vIHdoZW4gbm90IHR5cGluZyBhbmQgbm90aGluZyBpcyBzZWxlY3RlZClcbiAgVGV4dGFyZWFJbnB1dC5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAodHlwaW5nKSB7XG4gICAgaWYgKHRoaXMuY29udGV4dE1lbnVQZW5kaW5nIHx8IHRoaXMuY29tcG9zaW5nKSB7IHJldHVybiB9XG4gICAgdmFyIGNtID0gdGhpcy5jbTtcbiAgICBpZiAoY20uc29tZXRoaW5nU2VsZWN0ZWQoKSkge1xuICAgICAgdGhpcy5wcmV2SW5wdXQgPSBcIlwiO1xuICAgICAgdmFyIGNvbnRlbnQgPSBjbS5nZXRTZWxlY3Rpb24oKTtcbiAgICAgIHRoaXMudGV4dGFyZWEudmFsdWUgPSBjb250ZW50O1xuICAgICAgaWYgKGNtLnN0YXRlLmZvY3VzZWQpIHsgc2VsZWN0SW5wdXQodGhpcy50ZXh0YXJlYSk7IH1cbiAgICAgIGlmIChpZSAmJiBpZV92ZXJzaW9uID49IDkpIHsgdGhpcy5oYXNTZWxlY3Rpb24gPSBjb250ZW50OyB9XG4gICAgfSBlbHNlIGlmICghdHlwaW5nKSB7XG4gICAgICB0aGlzLnByZXZJbnB1dCA9IHRoaXMudGV4dGFyZWEudmFsdWUgPSBcIlwiO1xuICAgICAgaWYgKGllICYmIGllX3ZlcnNpb24gPj0gOSkgeyB0aGlzLmhhc1NlbGVjdGlvbiA9IG51bGw7IH1cbiAgICB9XG4gIH07XG5cbiAgVGV4dGFyZWFJbnB1dC5wcm90b3R5cGUuZ2V0RmllbGQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnRleHRhcmVhIH07XG5cbiAgVGV4dGFyZWFJbnB1dC5wcm90b3R5cGUuc3VwcG9ydHNUb3VjaCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGZhbHNlIH07XG5cbiAgVGV4dGFyZWFJbnB1dC5wcm90b3R5cGUuZm9jdXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuY20ub3B0aW9ucy5yZWFkT25seSAhPSBcIm5vY3Vyc29yXCIgJiYgKCFtb2JpbGUgfHwgYWN0aXZlRWx0KCkgIT0gdGhpcy50ZXh0YXJlYSkpIHtcbiAgICAgIHRyeSB7IHRoaXMudGV4dGFyZWEuZm9jdXMoKTsgfVxuICAgICAgY2F0Y2ggKGUpIHt9IC8vIElFOCB3aWxsIHRocm93IGlmIHRoZSB0ZXh0YXJlYSBpcyBkaXNwbGF5OiBub25lIG9yIG5vdCBpbiBET01cbiAgICB9XG4gIH07XG5cbiAgVGV4dGFyZWFJbnB1dC5wcm90b3R5cGUuYmx1ciA9IGZ1bmN0aW9uICgpIHsgdGhpcy50ZXh0YXJlYS5ibHVyKCk7IH07XG5cbiAgVGV4dGFyZWFJbnB1dC5wcm90b3R5cGUucmVzZXRQb3NpdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLndyYXBwZXIuc3R5bGUudG9wID0gdGhpcy53cmFwcGVyLnN0eWxlLmxlZnQgPSAwO1xuICB9O1xuXG4gIFRleHRhcmVhSW5wdXQucHJvdG90eXBlLnJlY2VpdmVkRm9jdXMgPSBmdW5jdGlvbiAoKSB7IHRoaXMuc2xvd1BvbGwoKTsgfTtcblxuICAvLyBQb2xsIGZvciBpbnB1dCBjaGFuZ2VzLCB1c2luZyB0aGUgbm9ybWFsIHJhdGUgb2YgcG9sbGluZy4gVGhpc1xuICAvLyBydW5zIGFzIGxvbmcgYXMgdGhlIGVkaXRvciBpcyBmb2N1c2VkLlxuICBUZXh0YXJlYUlucHV0LnByb3RvdHlwZS5zbG93UG9sbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgaWYgKHRoaXMucG9sbGluZ0Zhc3QpIHsgcmV0dXJuIH1cbiAgICB0aGlzLnBvbGxpbmcuc2V0KHRoaXMuY20ub3B0aW9ucy5wb2xsSW50ZXJ2YWwsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMkMS5wb2xsKCk7XG4gICAgICBpZiAodGhpcyQxLmNtLnN0YXRlLmZvY3VzZWQpIHsgdGhpcyQxLnNsb3dQb2xsKCk7IH1cbiAgICB9KTtcbiAgfTtcblxuICAvLyBXaGVuIGFuIGV2ZW50IGhhcyBqdXN0IGNvbWUgaW4gdGhhdCBpcyBsaWtlbHkgdG8gYWRkIG9yIGNoYW5nZVxuICAvLyBzb21ldGhpbmcgaW4gdGhlIGlucHV0IHRleHRhcmVhLCB3ZSBwb2xsIGZhc3RlciwgdG8gZW5zdXJlIHRoYXRcbiAgLy8gdGhlIGNoYW5nZSBhcHBlYXJzIG9uIHRoZSBzY3JlZW4gcXVpY2tseS5cbiAgVGV4dGFyZWFJbnB1dC5wcm90b3R5cGUuZmFzdFBvbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG1pc3NlZCA9IGZhbHNlLCBpbnB1dCA9IHRoaXM7XG4gICAgaW5wdXQucG9sbGluZ0Zhc3QgPSB0cnVlO1xuICAgIGZ1bmN0aW9uIHAoKSB7XG4gICAgICB2YXIgY2hhbmdlZCA9IGlucHV0LnBvbGwoKTtcbiAgICAgIGlmICghY2hhbmdlZCAmJiAhbWlzc2VkKSB7bWlzc2VkID0gdHJ1ZTsgaW5wdXQucG9sbGluZy5zZXQoNjAsIHApO31cbiAgICAgIGVsc2Uge2lucHV0LnBvbGxpbmdGYXN0ID0gZmFsc2U7IGlucHV0LnNsb3dQb2xsKCk7fVxuICAgIH1cbiAgICBpbnB1dC5wb2xsaW5nLnNldCgyMCwgcCk7XG4gIH07XG5cbiAgLy8gUmVhZCBpbnB1dCBmcm9tIHRoZSB0ZXh0YXJlYSwgYW5kIHVwZGF0ZSB0aGUgZG9jdW1lbnQgdG8gbWF0Y2guXG4gIC8vIFdoZW4gc29tZXRoaW5nIGlzIHNlbGVjdGVkLCBpdCBpcyBwcmVzZW50IGluIHRoZSB0ZXh0YXJlYSwgYW5kXG4gIC8vIHNlbGVjdGVkICh1bmxlc3MgaXQgaXMgaHVnZSwgaW4gd2hpY2ggY2FzZSBhIHBsYWNlaG9sZGVyIGlzXG4gIC8vIHVzZWQpLiBXaGVuIG5vdGhpbmcgaXMgc2VsZWN0ZWQsIHRoZSBjdXJzb3Igc2l0cyBhZnRlciBwcmV2aW91c2x5XG4gIC8vIHNlZW4gdGV4dCAoY2FuIGJlIGVtcHR5KSwgd2hpY2ggaXMgc3RvcmVkIGluIHByZXZJbnB1dCAod2UgbXVzdFxuICAvLyBub3QgcmVzZXQgdGhlIHRleHRhcmVhIHdoZW4gdHlwaW5nLCBiZWNhdXNlIHRoYXQgYnJlYWtzIElNRSkuXG4gIFRleHRhcmVhSW5wdXQucHJvdG90eXBlLnBvbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIHZhciBjbSA9IHRoaXMuY20sIGlucHV0ID0gdGhpcy50ZXh0YXJlYSwgcHJldklucHV0ID0gdGhpcy5wcmV2SW5wdXQ7XG4gICAgLy8gU2luY2UgdGhpcyBpcyBjYWxsZWQgYSAqbG90KiwgdHJ5IHRvIGJhaWwgb3V0IGFzIGNoZWFwbHkgYXNcbiAgICAvLyBwb3NzaWJsZSB3aGVuIGl0IGlzIGNsZWFyIHRoYXQgbm90aGluZyBoYXBwZW5lZC4gaGFzU2VsZWN0aW9uXG4gICAgLy8gd2lsbCBiZSB0aGUgY2FzZSB3aGVuIHRoZXJlIGlzIGEgbG90IG9mIHRleHQgaW4gdGhlIHRleHRhcmVhLFxuICAgIC8vIGluIHdoaWNoIGNhc2UgcmVhZGluZyBpdHMgdmFsdWUgd291bGQgYmUgZXhwZW5zaXZlLlxuICAgIGlmICh0aGlzLmNvbnRleHRNZW51UGVuZGluZyB8fCAhY20uc3RhdGUuZm9jdXNlZCB8fFxuICAgICAgICAoaGFzU2VsZWN0aW9uKGlucHV0KSAmJiAhcHJldklucHV0ICYmICF0aGlzLmNvbXBvc2luZykgfHxcbiAgICAgICAgY20uaXNSZWFkT25seSgpIHx8IGNtLm9wdGlvbnMuZGlzYWJsZUlucHV0IHx8IGNtLnN0YXRlLmtleVNlcSlcbiAgICAgIHsgcmV0dXJuIGZhbHNlIH1cblxuICAgIHZhciB0ZXh0ID0gaW5wdXQudmFsdWU7XG4gICAgLy8gSWYgbm90aGluZyBjaGFuZ2VkLCBiYWlsLlxuICAgIGlmICh0ZXh0ID09IHByZXZJbnB1dCAmJiAhY20uc29tZXRoaW5nU2VsZWN0ZWQoKSkgeyByZXR1cm4gZmFsc2UgfVxuICAgIC8vIFdvcmsgYXJvdW5kIG5vbnNlbnNpY2FsIHNlbGVjdGlvbiByZXNldHRpbmcgaW4gSUU5LzEwLCBhbmRcbiAgICAvLyBpbmV4cGxpY2FibGUgYXBwZWFyYW5jZSBvZiBwcml2YXRlIGFyZWEgdW5pY29kZSBjaGFyYWN0ZXJzIG9uXG4gICAgLy8gc29tZSBrZXkgY29tYm9zIGluIE1hYyAoIzI2ODkpLlxuICAgIGlmIChpZSAmJiBpZV92ZXJzaW9uID49IDkgJiYgdGhpcy5oYXNTZWxlY3Rpb24gPT09IHRleHQgfHxcbiAgICAgICAgbWFjICYmIC9bXFx1ZjcwMC1cXHVmN2ZmXS8udGVzdCh0ZXh0KSkge1xuICAgICAgY20uZGlzcGxheS5pbnB1dC5yZXNldCgpO1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKGNtLmRvYy5zZWwgPT0gY20uZGlzcGxheS5zZWxGb3JDb250ZXh0TWVudSkge1xuICAgICAgdmFyIGZpcnN0ID0gdGV4dC5jaGFyQ29kZUF0KDApO1xuICAgICAgaWYgKGZpcnN0ID09IDB4MjAwYiAmJiAhcHJldklucHV0KSB7IHByZXZJbnB1dCA9IFwiXFx1MjAwYlwiOyB9XG4gICAgICBpZiAoZmlyc3QgPT0gMHgyMWRhKSB7IHRoaXMucmVzZXQoKTsgcmV0dXJuIHRoaXMuY20uZXhlY0NvbW1hbmQoXCJ1bmRvXCIpIH1cbiAgICB9XG4gICAgLy8gRmluZCB0aGUgcGFydCBvZiB0aGUgaW5wdXQgdGhhdCBpcyBhY3R1YWxseSBuZXdcbiAgICB2YXIgc2FtZSA9IDAsIGwgPSBNYXRoLm1pbihwcmV2SW5wdXQubGVuZ3RoLCB0ZXh0Lmxlbmd0aCk7XG4gICAgd2hpbGUgKHNhbWUgPCBsICYmIHByZXZJbnB1dC5jaGFyQ29kZUF0KHNhbWUpID09IHRleHQuY2hhckNvZGVBdChzYW1lKSkgeyArK3NhbWU7IH1cblxuICAgIHJ1bkluT3AoY20sIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFwcGx5VGV4dElucHV0KGNtLCB0ZXh0LnNsaWNlKHNhbWUpLCBwcmV2SW5wdXQubGVuZ3RoIC0gc2FtZSxcbiAgICAgICAgICAgICAgICAgICAgIG51bGwsIHRoaXMkMS5jb21wb3NpbmcgPyBcIipjb21wb3NlXCIgOiBudWxsKTtcblxuICAgICAgLy8gRG9uJ3QgbGVhdmUgbG9uZyB0ZXh0IGluIHRoZSB0ZXh0YXJlYSwgc2luY2UgaXQgbWFrZXMgZnVydGhlciBwb2xsaW5nIHNsb3dcbiAgICAgIGlmICh0ZXh0Lmxlbmd0aCA+IDEwMDAgfHwgdGV4dC5pbmRleE9mKFwiXFxuXCIpID4gLTEpIHsgaW5wdXQudmFsdWUgPSB0aGlzJDEucHJldklucHV0ID0gXCJcIjsgfVxuICAgICAgZWxzZSB7IHRoaXMkMS5wcmV2SW5wdXQgPSB0ZXh0OyB9XG5cbiAgICAgIGlmICh0aGlzJDEuY29tcG9zaW5nKSB7XG4gICAgICAgIHRoaXMkMS5jb21wb3NpbmcucmFuZ2UuY2xlYXIoKTtcbiAgICAgICAgdGhpcyQxLmNvbXBvc2luZy5yYW5nZSA9IGNtLm1hcmtUZXh0KHRoaXMkMS5jb21wb3Npbmcuc3RhcnQsIGNtLmdldEN1cnNvcihcInRvXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiQ29kZU1pcnJvci1jb21wb3NpbmdcIn0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB0cnVlXG4gIH07XG5cbiAgVGV4dGFyZWFJbnB1dC5wcm90b3R5cGUuZW5zdXJlUG9sbGVkID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLnBvbGxpbmdGYXN0ICYmIHRoaXMucG9sbCgpKSB7IHRoaXMucG9sbGluZ0Zhc3QgPSBmYWxzZTsgfVxuICB9O1xuXG4gIFRleHRhcmVhSW5wdXQucHJvdG90eXBlLm9uS2V5UHJlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGllICYmIGllX3ZlcnNpb24gPj0gOSkgeyB0aGlzLmhhc1NlbGVjdGlvbiA9IG51bGw7IH1cbiAgICB0aGlzLmZhc3RQb2xsKCk7XG4gIH07XG5cbiAgVGV4dGFyZWFJbnB1dC5wcm90b3R5cGUub25Db250ZXh0TWVudSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgdmFyIGlucHV0ID0gdGhpcywgY20gPSBpbnB1dC5jbSwgZGlzcGxheSA9IGNtLmRpc3BsYXksIHRlID0gaW5wdXQudGV4dGFyZWE7XG4gICAgaWYgKGlucHV0LmNvbnRleHRNZW51UGVuZGluZykgeyBpbnB1dC5jb250ZXh0TWVudVBlbmRpbmcoKTsgfVxuICAgIHZhciBwb3MgPSBwb3NGcm9tTW91c2UoY20sIGUpLCBzY3JvbGxQb3MgPSBkaXNwbGF5LnNjcm9sbGVyLnNjcm9sbFRvcDtcbiAgICBpZiAoIXBvcyB8fCBwcmVzdG8pIHsgcmV0dXJuIH0gLy8gT3BlcmEgaXMgZGlmZmljdWx0LlxuXG4gICAgLy8gUmVzZXQgdGhlIGN1cnJlbnQgdGV4dCBzZWxlY3Rpb24gb25seSBpZiB0aGUgY2xpY2sgaXMgZG9uZSBvdXRzaWRlIG9mIHRoZSBzZWxlY3Rpb25cbiAgICAvLyBhbmQgJ3Jlc2V0U2VsZWN0aW9uT25Db250ZXh0TWVudScgb3B0aW9uIGlzIHRydWUuXG4gICAgdmFyIHJlc2V0ID0gY20ub3B0aW9ucy5yZXNldFNlbGVjdGlvbk9uQ29udGV4dE1lbnU7XG4gICAgaWYgKHJlc2V0ICYmIGNtLmRvYy5zZWwuY29udGFpbnMocG9zKSA9PSAtMSlcbiAgICAgIHsgb3BlcmF0aW9uKGNtLCBzZXRTZWxlY3Rpb24pKGNtLmRvYywgc2ltcGxlU2VsZWN0aW9uKHBvcyksIHNlbF9kb250U2Nyb2xsKTsgfVxuXG4gICAgdmFyIG9sZENTUyA9IHRlLnN0eWxlLmNzc1RleHQsIG9sZFdyYXBwZXJDU1MgPSBpbnB1dC53cmFwcGVyLnN0eWxlLmNzc1RleHQ7XG4gICAgdmFyIHdyYXBwZXJCb3ggPSBpbnB1dC53cmFwcGVyLm9mZnNldFBhcmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBpbnB1dC53cmFwcGVyLnN0eWxlLmNzc1RleHQgPSBcInBvc2l0aW9uOiBzdGF0aWNcIjtcbiAgICB0ZS5zdHlsZS5jc3NUZXh0ID0gXCJwb3NpdGlvbjogYWJzb2x1dGU7IHdpZHRoOiAzMHB4OyBoZWlnaHQ6IDMwcHg7XFxuICAgICAgdG9wOiBcIiArIChlLmNsaWVudFkgLSB3cmFwcGVyQm94LnRvcCAtIDUpICsgXCJweDsgbGVmdDogXCIgKyAoZS5jbGllbnRYIC0gd3JhcHBlckJveC5sZWZ0IC0gNSkgKyBcInB4O1xcbiAgICAgIHotaW5kZXg6IDEwMDA7IGJhY2tncm91bmQ6IFwiICsgKGllID8gXCJyZ2JhKDI1NSwgMjU1LCAyNTUsIC4wNSlcIiA6IFwidHJhbnNwYXJlbnRcIikgKyBcIjtcXG4gICAgICBvdXRsaW5lOiBub25lOyBib3JkZXItd2lkdGg6IDA7IG91dGxpbmU6IG5vbmU7IG92ZXJmbG93OiBoaWRkZW47IG9wYWNpdHk6IC4wNTsgZmlsdGVyOiBhbHBoYShvcGFjaXR5PTUpO1wiO1xuICAgIHZhciBvbGRTY3JvbGxZO1xuICAgIGlmICh3ZWJraXQpIHsgb2xkU2Nyb2xsWSA9IHdpbmRvdy5zY3JvbGxZOyB9IC8vIFdvcmsgYXJvdW5kIENocm9tZSBpc3N1ZSAoIzI3MTIpXG4gICAgZGlzcGxheS5pbnB1dC5mb2N1cygpO1xuICAgIGlmICh3ZWJraXQpIHsgd2luZG93LnNjcm9sbFRvKG51bGwsIG9sZFNjcm9sbFkpOyB9XG4gICAgZGlzcGxheS5pbnB1dC5yZXNldCgpO1xuICAgIC8vIEFkZHMgXCJTZWxlY3QgYWxsXCIgdG8gY29udGV4dCBtZW51IGluIEZGXG4gICAgaWYgKCFjbS5zb21ldGhpbmdTZWxlY3RlZCgpKSB7IHRlLnZhbHVlID0gaW5wdXQucHJldklucHV0ID0gXCIgXCI7IH1cbiAgICBpbnB1dC5jb250ZXh0TWVudVBlbmRpbmcgPSByZWhpZGU7XG4gICAgZGlzcGxheS5zZWxGb3JDb250ZXh0TWVudSA9IGNtLmRvYy5zZWw7XG4gICAgY2xlYXJUaW1lb3V0KGRpc3BsYXkuZGV0ZWN0aW5nU2VsZWN0QWxsKTtcblxuICAgIC8vIFNlbGVjdC1hbGwgd2lsbCBiZSBncmV5ZWQgb3V0IGlmIHRoZXJlJ3Mgbm90aGluZyB0byBzZWxlY3QsIHNvXG4gICAgLy8gdGhpcyBhZGRzIGEgemVyby13aWR0aCBzcGFjZSBzbyB0aGF0IHdlIGNhbiBsYXRlciBjaGVjayB3aGV0aGVyXG4gICAgLy8gaXQgZ290IHNlbGVjdGVkLlxuICAgIGZ1bmN0aW9uIHByZXBhcmVTZWxlY3RBbGxIYWNrKCkge1xuICAgICAgaWYgKHRlLnNlbGVjdGlvblN0YXJ0ICE9IG51bGwpIHtcbiAgICAgICAgdmFyIHNlbGVjdGVkID0gY20uc29tZXRoaW5nU2VsZWN0ZWQoKTtcbiAgICAgICAgdmFyIGV4dHZhbCA9IFwiXFx1MjAwYlwiICsgKHNlbGVjdGVkID8gdGUudmFsdWUgOiBcIlwiKTtcbiAgICAgICAgdGUudmFsdWUgPSBcIlxcdTIxZGFcIjsgLy8gVXNlZCB0byBjYXRjaCBjb250ZXh0LW1lbnUgdW5kb1xuICAgICAgICB0ZS52YWx1ZSA9IGV4dHZhbDtcbiAgICAgICAgaW5wdXQucHJldklucHV0ID0gc2VsZWN0ZWQgPyBcIlwiIDogXCJcXHUyMDBiXCI7XG4gICAgICAgIHRlLnNlbGVjdGlvblN0YXJ0ID0gMTsgdGUuc2VsZWN0aW9uRW5kID0gZXh0dmFsLmxlbmd0aDtcbiAgICAgICAgLy8gUmUtc2V0IHRoaXMsIGluIGNhc2Ugc29tZSBvdGhlciBoYW5kbGVyIHRvdWNoZWQgdGhlXG4gICAgICAgIC8vIHNlbGVjdGlvbiBpbiB0aGUgbWVhbnRpbWUuXG4gICAgICAgIGRpc3BsYXkuc2VsRm9yQ29udGV4dE1lbnUgPSBjbS5kb2Muc2VsO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiByZWhpZGUoKSB7XG4gICAgICBpZiAoaW5wdXQuY29udGV4dE1lbnVQZW5kaW5nICE9IHJlaGlkZSkgeyByZXR1cm4gfVxuICAgICAgaW5wdXQuY29udGV4dE1lbnVQZW5kaW5nID0gZmFsc2U7XG4gICAgICBpbnB1dC53cmFwcGVyLnN0eWxlLmNzc1RleHQgPSBvbGRXcmFwcGVyQ1NTO1xuICAgICAgdGUuc3R5bGUuY3NzVGV4dCA9IG9sZENTUztcbiAgICAgIGlmIChpZSAmJiBpZV92ZXJzaW9uIDwgOSkgeyBkaXNwbGF5LnNjcm9sbGJhcnMuc2V0U2Nyb2xsVG9wKGRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsVG9wID0gc2Nyb2xsUG9zKTsgfVxuXG4gICAgICAvLyBUcnkgdG8gZGV0ZWN0IHRoZSB1c2VyIGNob29zaW5nIHNlbGVjdC1hbGxcbiAgICAgIGlmICh0ZS5zZWxlY3Rpb25TdGFydCAhPSBudWxsKSB7XG4gICAgICAgIGlmICghaWUgfHwgKGllICYmIGllX3ZlcnNpb24gPCA5KSkgeyBwcmVwYXJlU2VsZWN0QWxsSGFjaygpOyB9XG4gICAgICAgIHZhciBpID0gMCwgcG9sbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoZGlzcGxheS5zZWxGb3JDb250ZXh0TWVudSA9PSBjbS5kb2Muc2VsICYmIHRlLnNlbGVjdGlvblN0YXJ0ID09IDAgJiZcbiAgICAgICAgICAgICAgdGUuc2VsZWN0aW9uRW5kID4gMCAmJiBpbnB1dC5wcmV2SW5wdXQgPT0gXCJcXHUyMDBiXCIpIHtcbiAgICAgICAgICAgIG9wZXJhdGlvbihjbSwgc2VsZWN0QWxsKShjbSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChpKysgPCAxMCkge1xuICAgICAgICAgICAgZGlzcGxheS5kZXRlY3RpbmdTZWxlY3RBbGwgPSBzZXRUaW1lb3V0KHBvbGwsIDUwMCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRpc3BsYXkuc2VsRm9yQ29udGV4dE1lbnUgPSBudWxsO1xuICAgICAgICAgICAgZGlzcGxheS5pbnB1dC5yZXNldCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgZGlzcGxheS5kZXRlY3RpbmdTZWxlY3RBbGwgPSBzZXRUaW1lb3V0KHBvbGwsIDIwMCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGllICYmIGllX3ZlcnNpb24gPj0gOSkgeyBwcmVwYXJlU2VsZWN0QWxsSGFjaygpOyB9XG4gICAgaWYgKGNhcHR1cmVSaWdodENsaWNrKSB7XG4gICAgICBlX3N0b3AoZSk7XG4gICAgICB2YXIgbW91c2V1cCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgb2ZmKHdpbmRvdywgXCJtb3VzZXVwXCIsIG1vdXNldXApO1xuICAgICAgICBzZXRUaW1lb3V0KHJlaGlkZSwgMjApO1xuICAgICAgfTtcbiAgICAgIG9uKHdpbmRvdywgXCJtb3VzZXVwXCIsIG1vdXNldXApO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRUaW1lb3V0KHJlaGlkZSwgNTApO1xuICAgIH1cbiAgfTtcblxuICBUZXh0YXJlYUlucHV0LnByb3RvdHlwZS5yZWFkT25seUNoYW5nZWQgPSBmdW5jdGlvbiAodmFsKSB7XG4gICAgaWYgKCF2YWwpIHsgdGhpcy5yZXNldCgpOyB9XG4gICAgdGhpcy50ZXh0YXJlYS5kaXNhYmxlZCA9IHZhbCA9PSBcIm5vY3Vyc29yXCI7XG4gICAgdGhpcy50ZXh0YXJlYS5yZWFkT25seSA9ICEhdmFsO1xuICB9O1xuXG4gIFRleHRhcmVhSW5wdXQucHJvdG90eXBlLnNldFVuZWRpdGFibGUgPSBmdW5jdGlvbiAoKSB7fTtcblxuICBUZXh0YXJlYUlucHV0LnByb3RvdHlwZS5uZWVkc0NvbnRlbnRBdHRyaWJ1dGUgPSBmYWxzZTtcblxuICBmdW5jdGlvbiBmcm9tVGV4dEFyZWEodGV4dGFyZWEsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyA/IGNvcHlPYmoob3B0aW9ucykgOiB7fTtcbiAgICBvcHRpb25zLnZhbHVlID0gdGV4dGFyZWEudmFsdWU7XG4gICAgaWYgKCFvcHRpb25zLnRhYmluZGV4ICYmIHRleHRhcmVhLnRhYkluZGV4KVxuICAgICAgeyBvcHRpb25zLnRhYmluZGV4ID0gdGV4dGFyZWEudGFiSW5kZXg7IH1cbiAgICBpZiAoIW9wdGlvbnMucGxhY2Vob2xkZXIgJiYgdGV4dGFyZWEucGxhY2Vob2xkZXIpXG4gICAgICB7IG9wdGlvbnMucGxhY2Vob2xkZXIgPSB0ZXh0YXJlYS5wbGFjZWhvbGRlcjsgfVxuICAgIC8vIFNldCBhdXRvZm9jdXMgdG8gdHJ1ZSBpZiB0aGlzIHRleHRhcmVhIGlzIGZvY3VzZWQsIG9yIGlmIGl0IGhhc1xuICAgIC8vIGF1dG9mb2N1cyBhbmQgbm8gb3RoZXIgZWxlbWVudCBpcyBmb2N1c2VkLlxuICAgIGlmIChvcHRpb25zLmF1dG9mb2N1cyA9PSBudWxsKSB7XG4gICAgICB2YXIgaGFzRm9jdXMgPSBhY3RpdmVFbHQoKTtcbiAgICAgIG9wdGlvbnMuYXV0b2ZvY3VzID0gaGFzRm9jdXMgPT0gdGV4dGFyZWEgfHxcbiAgICAgICAgdGV4dGFyZWEuZ2V0QXR0cmlidXRlKFwiYXV0b2ZvY3VzXCIpICE9IG51bGwgJiYgaGFzRm9jdXMgPT0gZG9jdW1lbnQuYm9keTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzYXZlKCkge3RleHRhcmVhLnZhbHVlID0gY20uZ2V0VmFsdWUoKTt9XG5cbiAgICB2YXIgcmVhbFN1Ym1pdDtcbiAgICBpZiAodGV4dGFyZWEuZm9ybSkge1xuICAgICAgb24odGV4dGFyZWEuZm9ybSwgXCJzdWJtaXRcIiwgc2F2ZSk7XG4gICAgICAvLyBEZXBsb3JhYmxlIGhhY2sgdG8gbWFrZSB0aGUgc3VibWl0IG1ldGhvZCBkbyB0aGUgcmlnaHQgdGhpbmcuXG4gICAgICBpZiAoIW9wdGlvbnMubGVhdmVTdWJtaXRNZXRob2RBbG9uZSkge1xuICAgICAgICB2YXIgZm9ybSA9IHRleHRhcmVhLmZvcm07XG4gICAgICAgIHJlYWxTdWJtaXQgPSBmb3JtLnN1Ym1pdDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YXIgd3JhcHBlZFN1Ym1pdCA9IGZvcm0uc3VibWl0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2F2ZSgpO1xuICAgICAgICAgICAgZm9ybS5zdWJtaXQgPSByZWFsU3VibWl0O1xuICAgICAgICAgICAgZm9ybS5zdWJtaXQoKTtcbiAgICAgICAgICAgIGZvcm0uc3VibWl0ID0gd3JhcHBlZFN1Ym1pdDtcbiAgICAgICAgICB9O1xuICAgICAgICB9IGNhdGNoKGUpIHt9XG4gICAgICB9XG4gICAgfVxuXG4gICAgb3B0aW9ucy5maW5pc2hJbml0ID0gZnVuY3Rpb24gKGNtKSB7XG4gICAgICBjbS5zYXZlID0gc2F2ZTtcbiAgICAgIGNtLmdldFRleHRBcmVhID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGV4dGFyZWE7IH07XG4gICAgICBjbS50b1RleHRBcmVhID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBjbS50b1RleHRBcmVhID0gaXNOYU47IC8vIFByZXZlbnQgdGhpcyBmcm9tIGJlaW5nIHJhbiB0d2ljZVxuICAgICAgICBzYXZlKCk7XG4gICAgICAgIHRleHRhcmVhLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY20uZ2V0V3JhcHBlckVsZW1lbnQoKSk7XG4gICAgICAgIHRleHRhcmVhLnN0eWxlLmRpc3BsYXkgPSBcIlwiO1xuICAgICAgICBpZiAodGV4dGFyZWEuZm9ybSkge1xuICAgICAgICAgIG9mZih0ZXh0YXJlYS5mb3JtLCBcInN1Ym1pdFwiLCBzYXZlKTtcbiAgICAgICAgICBpZiAoIW9wdGlvbnMubGVhdmVTdWJtaXRNZXRob2RBbG9uZSAmJiB0eXBlb2YgdGV4dGFyZWEuZm9ybS5zdWJtaXQgPT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgeyB0ZXh0YXJlYS5mb3JtLnN1Ym1pdCA9IHJlYWxTdWJtaXQ7IH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgdGV4dGFyZWEuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgIHZhciBjbSA9IENvZGVNaXJyb3IoZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIHRleHRhcmVhLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5vZGUsIHRleHRhcmVhLm5leHRTaWJsaW5nKTsgfSxcbiAgICAgIG9wdGlvbnMpO1xuICAgIHJldHVybiBjbVxuICB9XG5cbiAgZnVuY3Rpb24gYWRkTGVnYWN5UHJvcHMoQ29kZU1pcnJvcikge1xuICAgIENvZGVNaXJyb3Iub2ZmID0gb2ZmO1xuICAgIENvZGVNaXJyb3Iub24gPSBvbjtcbiAgICBDb2RlTWlycm9yLndoZWVsRXZlbnRQaXhlbHMgPSB3aGVlbEV2ZW50UGl4ZWxzO1xuICAgIENvZGVNaXJyb3IuRG9jID0gRG9jO1xuICAgIENvZGVNaXJyb3Iuc3BsaXRMaW5lcyA9IHNwbGl0TGluZXNBdXRvO1xuICAgIENvZGVNaXJyb3IuY291bnRDb2x1bW4gPSBjb3VudENvbHVtbjtcbiAgICBDb2RlTWlycm9yLmZpbmRDb2x1bW4gPSBmaW5kQ29sdW1uO1xuICAgIENvZGVNaXJyb3IuaXNXb3JkQ2hhciA9IGlzV29yZENoYXJCYXNpYztcbiAgICBDb2RlTWlycm9yLlBhc3MgPSBQYXNzO1xuICAgIENvZGVNaXJyb3Iuc2lnbmFsID0gc2lnbmFsO1xuICAgIENvZGVNaXJyb3IuTGluZSA9IExpbmU7XG4gICAgQ29kZU1pcnJvci5jaGFuZ2VFbmQgPSBjaGFuZ2VFbmQ7XG4gICAgQ29kZU1pcnJvci5zY3JvbGxiYXJNb2RlbCA9IHNjcm9sbGJhck1vZGVsO1xuICAgIENvZGVNaXJyb3IuUG9zID0gUG9zO1xuICAgIENvZGVNaXJyb3IuY21wUG9zID0gY21wO1xuICAgIENvZGVNaXJyb3IubW9kZXMgPSBtb2RlcztcbiAgICBDb2RlTWlycm9yLm1pbWVNb2RlcyA9IG1pbWVNb2RlcztcbiAgICBDb2RlTWlycm9yLnJlc29sdmVNb2RlID0gcmVzb2x2ZU1vZGU7XG4gICAgQ29kZU1pcnJvci5nZXRNb2RlID0gZ2V0TW9kZTtcbiAgICBDb2RlTWlycm9yLm1vZGVFeHRlbnNpb25zID0gbW9kZUV4dGVuc2lvbnM7XG4gICAgQ29kZU1pcnJvci5leHRlbmRNb2RlID0gZXh0ZW5kTW9kZTtcbiAgICBDb2RlTWlycm9yLmNvcHlTdGF0ZSA9IGNvcHlTdGF0ZTtcbiAgICBDb2RlTWlycm9yLnN0YXJ0U3RhdGUgPSBzdGFydFN0YXRlO1xuICAgIENvZGVNaXJyb3IuaW5uZXJNb2RlID0gaW5uZXJNb2RlO1xuICAgIENvZGVNaXJyb3IuY29tbWFuZHMgPSBjb21tYW5kcztcbiAgICBDb2RlTWlycm9yLmtleU1hcCA9IGtleU1hcDtcbiAgICBDb2RlTWlycm9yLmtleU5hbWUgPSBrZXlOYW1lO1xuICAgIENvZGVNaXJyb3IuaXNNb2RpZmllcktleSA9IGlzTW9kaWZpZXJLZXk7XG4gICAgQ29kZU1pcnJvci5sb29rdXBLZXkgPSBsb29rdXBLZXk7XG4gICAgQ29kZU1pcnJvci5ub3JtYWxpemVLZXlNYXAgPSBub3JtYWxpemVLZXlNYXA7XG4gICAgQ29kZU1pcnJvci5TdHJpbmdTdHJlYW0gPSBTdHJpbmdTdHJlYW07XG4gICAgQ29kZU1pcnJvci5TaGFyZWRUZXh0TWFya2VyID0gU2hhcmVkVGV4dE1hcmtlcjtcbiAgICBDb2RlTWlycm9yLlRleHRNYXJrZXIgPSBUZXh0TWFya2VyO1xuICAgIENvZGVNaXJyb3IuTGluZVdpZGdldCA9IExpbmVXaWRnZXQ7XG4gICAgQ29kZU1pcnJvci5lX3ByZXZlbnREZWZhdWx0ID0gZV9wcmV2ZW50RGVmYXVsdDtcbiAgICBDb2RlTWlycm9yLmVfc3RvcFByb3BhZ2F0aW9uID0gZV9zdG9wUHJvcGFnYXRpb247XG4gICAgQ29kZU1pcnJvci5lX3N0b3AgPSBlX3N0b3A7XG4gICAgQ29kZU1pcnJvci5hZGRDbGFzcyA9IGFkZENsYXNzO1xuICAgIENvZGVNaXJyb3IuY29udGFpbnMgPSBjb250YWlucztcbiAgICBDb2RlTWlycm9yLnJtQ2xhc3MgPSBybUNsYXNzO1xuICAgIENvZGVNaXJyb3Iua2V5TmFtZXMgPSBrZXlOYW1lcztcbiAgfVxuXG4gIC8vIEVESVRPUiBDT05TVFJVQ1RPUlxuXG4gIGRlZmluZU9wdGlvbnMoQ29kZU1pcnJvcik7XG5cbiAgYWRkRWRpdG9yTWV0aG9kcyhDb2RlTWlycm9yKTtcblxuICAvLyBTZXQgdXAgbWV0aG9kcyBvbiBDb2RlTWlycm9yJ3MgcHJvdG90eXBlIHRvIHJlZGlyZWN0IHRvIHRoZSBlZGl0b3IncyBkb2N1bWVudC5cbiAgdmFyIGRvbnREZWxlZ2F0ZSA9IFwiaXRlciBpbnNlcnQgcmVtb3ZlIGNvcHkgZ2V0RWRpdG9yIGNvbnN0cnVjdG9yXCIuc3BsaXQoXCIgXCIpO1xuICBmb3IgKHZhciBwcm9wIGluIERvYy5wcm90b3R5cGUpIHsgaWYgKERvYy5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkocHJvcCkgJiYgaW5kZXhPZihkb250RGVsZWdhdGUsIHByb3ApIDwgMClcbiAgICB7IENvZGVNaXJyb3IucHJvdG90eXBlW3Byb3BdID0gKGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge3JldHVybiBtZXRob2QuYXBwbHkodGhpcy5kb2MsIGFyZ3VtZW50cyl9XG4gICAgfSkoRG9jLnByb3RvdHlwZVtwcm9wXSk7IH0gfVxuXG4gIGV2ZW50TWl4aW4oRG9jKTtcbiAgQ29kZU1pcnJvci5pbnB1dFN0eWxlcyA9IHtcInRleHRhcmVhXCI6IFRleHRhcmVhSW5wdXQsIFwiY29udGVudGVkaXRhYmxlXCI6IENvbnRlbnRFZGl0YWJsZUlucHV0fTtcblxuICAvLyBFeHRyYSBhcmd1bWVudHMgYXJlIHN0b3JlZCBhcyB0aGUgbW9kZSdzIGRlcGVuZGVuY2llcywgd2hpY2ggaXNcbiAgLy8gdXNlZCBieSAobGVnYWN5KSBtZWNoYW5pc21zIGxpa2UgbG9hZG1vZGUuanMgdG8gYXV0b21hdGljYWxseVxuICAvLyBsb2FkIGEgbW9kZS4gKFByZWZlcnJlZCBtZWNoYW5pc20gaXMgdGhlIHJlcXVpcmUvZGVmaW5lIGNhbGxzLilcbiAgQ29kZU1pcnJvci5kZWZpbmVNb2RlID0gZnVuY3Rpb24obmFtZS8qLCBtb2RlLCDigKYqLykge1xuICAgIGlmICghQ29kZU1pcnJvci5kZWZhdWx0cy5tb2RlICYmIG5hbWUgIT0gXCJudWxsXCIpIHsgQ29kZU1pcnJvci5kZWZhdWx0cy5tb2RlID0gbmFtZTsgfVxuICAgIGRlZmluZU1vZGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcblxuICBDb2RlTWlycm9yLmRlZmluZU1JTUUgPSBkZWZpbmVNSU1FO1xuXG4gIC8vIE1pbmltYWwgZGVmYXVsdCBtb2RlLlxuICBDb2RlTWlycm9yLmRlZmluZU1vZGUoXCJudWxsXCIsIGZ1bmN0aW9uICgpIHsgcmV0dXJuICh7dG9rZW46IGZ1bmN0aW9uIChzdHJlYW0pIHsgcmV0dXJuIHN0cmVhbS5za2lwVG9FbmQoKTsgfX0pOyB9KTtcbiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKFwidGV4dC9wbGFpblwiLCBcIm51bGxcIik7XG5cbiAgLy8gRVhURU5TSU9OU1xuXG4gIENvZGVNaXJyb3IuZGVmaW5lRXh0ZW5zaW9uID0gZnVuY3Rpb24gKG5hbWUsIGZ1bmMpIHtcbiAgICBDb2RlTWlycm9yLnByb3RvdHlwZVtuYW1lXSA9IGZ1bmM7XG4gIH07XG4gIENvZGVNaXJyb3IuZGVmaW5lRG9jRXh0ZW5zaW9uID0gZnVuY3Rpb24gKG5hbWUsIGZ1bmMpIHtcbiAgICBEb2MucHJvdG90eXBlW25hbWVdID0gZnVuYztcbiAgfTtcblxuICBDb2RlTWlycm9yLmZyb21UZXh0QXJlYSA9IGZyb21UZXh0QXJlYTtcblxuICBhZGRMZWdhY3lQcm9wcyhDb2RlTWlycm9yKTtcblxuICBDb2RlTWlycm9yLnZlcnNpb24gPSBcIjUuNTguM1wiO1xuXG4gIHJldHVybiBDb2RlTWlycm9yO1xuXG59KSkpO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/codemirror/lib/codemirror.js\n"); +eval("// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// This is CodeMirror (https://codemirror.net), a code editor\n// implemented in JavaScript on top of the browser's DOM.\n//\n// You can find some technical background for some of the code below\n// at http://marijnhaverbeke.nl/blog/#cm-internals .\n\n(function (global, factory) {\n true ? module.exports = factory() :\n 0;\n}(this, (function () { 'use strict';\n\n // Kludges for bugs and behavior differences that can't be feature\n // detected are enabled based on userAgent etc sniffing.\n var userAgent = navigator.userAgent;\n var platform = navigator.platform;\n\n var gecko = /gecko\\/\\d/i.test(userAgent);\n var ie_upto10 = /MSIE \\d/.test(userAgent);\n var ie_11up = /Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(userAgent);\n var edge = /Edge\\/(\\d+)/.exec(userAgent);\n var ie = ie_upto10 || ie_11up || edge;\n var ie_version = ie && (ie_upto10 ? document.documentMode || 6 : +(edge || ie_11up)[1]);\n var webkit = !edge && /WebKit\\//.test(userAgent);\n var qtwebkit = webkit && /Qt\\/\\d+\\.\\d+/.test(userAgent);\n var chrome = !edge && /Chrome\\//.test(userAgent);\n var presto = /Opera\\//.test(userAgent);\n var safari = /Apple Computer/.test(navigator.vendor);\n var mac_geMountainLion = /Mac OS X 1\\d\\D([8-9]|\\d\\d)\\D/.test(userAgent);\n var phantom = /PhantomJS/.test(userAgent);\n\n var ios = safari && (/Mobile\\/\\w+/.test(userAgent) || navigator.maxTouchPoints > 2);\n var android = /Android/.test(userAgent);\n // This is woefully incomplete. Suggestions for alternative methods welcome.\n var mobile = ios || android || /webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(userAgent);\n var mac = ios || /Mac/.test(platform);\n var chromeOS = /\\bCrOS\\b/.test(userAgent);\n var windows = /win/i.test(platform);\n\n var presto_version = presto && userAgent.match(/Version\\/(\\d*\\.\\d*)/);\n if (presto_version) { presto_version = Number(presto_version[1]); }\n if (presto_version && presto_version >= 15) { presto = false; webkit = true; }\n // Some browsers use the wrong event properties to signal cmd/ctrl on OS X\n var flipCtrlCmd = mac && (qtwebkit || presto && (presto_version == null || presto_version < 12.11));\n var captureRightClick = gecko || (ie && ie_version >= 9);\n\n function classTest(cls) { return new RegExp(\"(^|\\\\s)\" + cls + \"(?:$|\\\\s)\\\\s*\") }\n\n var rmClass = function(node, cls) {\n var current = node.className;\n var match = classTest(cls).exec(current);\n if (match) {\n var after = current.slice(match.index + match[0].length);\n node.className = current.slice(0, match.index) + (after ? match[1] + after : \"\");\n }\n };\n\n function removeChildren(e) {\n for (var count = e.childNodes.length; count > 0; --count)\n { e.removeChild(e.firstChild); }\n return e\n }\n\n function removeChildrenAndAdd(parent, e) {\n return removeChildren(parent).appendChild(e)\n }\n\n function elt(tag, content, className, style) {\n var e = document.createElement(tag);\n if (className) { e.className = className; }\n if (style) { e.style.cssText = style; }\n if (typeof content == \"string\") { e.appendChild(document.createTextNode(content)); }\n else if (content) { for (var i = 0; i < content.length; ++i) { e.appendChild(content[i]); } }\n return e\n }\n // wrapper for elt, which removes the elt from the accessibility tree\n function eltP(tag, content, className, style) {\n var e = elt(tag, content, className, style);\n e.setAttribute(\"role\", \"presentation\");\n return e\n }\n\n var range;\n if (document.createRange) { range = function(node, start, end, endNode) {\n var r = document.createRange();\n r.setEnd(endNode || node, end);\n r.setStart(node, start);\n return r\n }; }\n else { range = function(node, start, end) {\n var r = document.body.createTextRange();\n try { r.moveToElementText(node.parentNode); }\n catch(e) { return r }\n r.collapse(true);\n r.moveEnd(\"character\", end);\n r.moveStart(\"character\", start);\n return r\n }; }\n\n function contains(parent, child) {\n if (child.nodeType == 3) // Android browser always returns false when child is a textnode\n { child = child.parentNode; }\n if (parent.contains)\n { return parent.contains(child) }\n do {\n if (child.nodeType == 11) { child = child.host; }\n if (child == parent) { return true }\n } while (child = child.parentNode)\n }\n\n function activeElt() {\n // IE and Edge may throw an \"Unspecified Error\" when accessing document.activeElement.\n // IE < 10 will throw when accessed while the page is loading or in an iframe.\n // IE > 9 and Edge will throw when accessed in an iframe if document.body is unavailable.\n var activeElement;\n try {\n activeElement = document.activeElement;\n } catch(e) {\n activeElement = document.body || null;\n }\n while (activeElement && activeElement.shadowRoot && activeElement.shadowRoot.activeElement)\n { activeElement = activeElement.shadowRoot.activeElement; }\n return activeElement\n }\n\n function addClass(node, cls) {\n var current = node.className;\n if (!classTest(cls).test(current)) { node.className += (current ? \" \" : \"\") + cls; }\n }\n function joinClasses(a, b) {\n var as = a.split(\" \");\n for (var i = 0; i < as.length; i++)\n { if (as[i] && !classTest(as[i]).test(b)) { b += \" \" + as[i]; } }\n return b\n }\n\n var selectInput = function(node) { node.select(); };\n if (ios) // Mobile Safari apparently has a bug where select() is broken.\n { selectInput = function(node) { node.selectionStart = 0; node.selectionEnd = node.value.length; }; }\n else if (ie) // Suppress mysterious IE10 errors\n { selectInput = function(node) { try { node.select(); } catch(_e) {} }; }\n\n function bind(f) {\n var args = Array.prototype.slice.call(arguments, 1);\n return function(){return f.apply(null, args)}\n }\n\n function copyObj(obj, target, overwrite) {\n if (!target) { target = {}; }\n for (var prop in obj)\n { if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop)))\n { target[prop] = obj[prop]; } }\n return target\n }\n\n // Counts the column offset in a string, taking tabs into account.\n // Used mostly to find indentation.\n function countColumn(string, end, tabSize, startIndex, startValue) {\n if (end == null) {\n end = string.search(/[^\\s\\u00a0]/);\n if (end == -1) { end = string.length; }\n }\n for (var i = startIndex || 0, n = startValue || 0;;) {\n var nextTab = string.indexOf(\"\\t\", i);\n if (nextTab < 0 || nextTab >= end)\n { return n + (end - i) }\n n += nextTab - i;\n n += tabSize - (n % tabSize);\n i = nextTab + 1;\n }\n }\n\n var Delayed = function() {\n this.id = null;\n this.f = null;\n this.time = 0;\n this.handler = bind(this.onTimeout, this);\n };\n Delayed.prototype.onTimeout = function (self) {\n self.id = 0;\n if (self.time <= +new Date) {\n self.f();\n } else {\n setTimeout(self.handler, self.time - +new Date);\n }\n };\n Delayed.prototype.set = function (ms, f) {\n this.f = f;\n var time = +new Date + ms;\n if (!this.id || time < this.time) {\n clearTimeout(this.id);\n this.id = setTimeout(this.handler, ms);\n this.time = time;\n }\n };\n\n function indexOf(array, elt) {\n for (var i = 0; i < array.length; ++i)\n { if (array[i] == elt) { return i } }\n return -1\n }\n\n // Number of pixels added to scroller and sizer to hide scrollbar\n var scrollerGap = 50;\n\n // Returned or thrown by various protocols to signal 'I'm not\n // handling this'.\n var Pass = {toString: function(){return \"CodeMirror.Pass\"}};\n\n // Reused option objects for setSelection & friends\n var sel_dontScroll = {scroll: false}, sel_mouse = {origin: \"*mouse\"}, sel_move = {origin: \"+move\"};\n\n // The inverse of countColumn -- find the offset that corresponds to\n // a particular column.\n function findColumn(string, goal, tabSize) {\n for (var pos = 0, col = 0;;) {\n var nextTab = string.indexOf(\"\\t\", pos);\n if (nextTab == -1) { nextTab = string.length; }\n var skipped = nextTab - pos;\n if (nextTab == string.length || col + skipped >= goal)\n { return pos + Math.min(skipped, goal - col) }\n col += nextTab - pos;\n col += tabSize - (col % tabSize);\n pos = nextTab + 1;\n if (col >= goal) { return pos }\n }\n }\n\n var spaceStrs = [\"\"];\n function spaceStr(n) {\n while (spaceStrs.length <= n)\n { spaceStrs.push(lst(spaceStrs) + \" \"); }\n return spaceStrs[n]\n }\n\n function lst(arr) { return arr[arr.length-1] }\n\n function map(array, f) {\n var out = [];\n for (var i = 0; i < array.length; i++) { out[i] = f(array[i], i); }\n return out\n }\n\n function insertSorted(array, value, score) {\n var pos = 0, priority = score(value);\n while (pos < array.length && score(array[pos]) <= priority) { pos++; }\n array.splice(pos, 0, value);\n }\n\n function nothing() {}\n\n function createObj(base, props) {\n var inst;\n if (Object.create) {\n inst = Object.create(base);\n } else {\n nothing.prototype = base;\n inst = new nothing();\n }\n if (props) { copyObj(props, inst); }\n return inst\n }\n\n var nonASCIISingleCaseWordChar = /[\\u00df\\u0587\\u0590-\\u05f4\\u0600-\\u06ff\\u3040-\\u309f\\u30a0-\\u30ff\\u3400-\\u4db5\\u4e00-\\u9fcc\\uac00-\\ud7af]/;\n function isWordCharBasic(ch) {\n return /\\w/.test(ch) || ch > \"\\x80\" &&\n (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch))\n }\n function isWordChar(ch, helper) {\n if (!helper) { return isWordCharBasic(ch) }\n if (helper.source.indexOf(\"\\\\w\") > -1 && isWordCharBasic(ch)) { return true }\n return helper.test(ch)\n }\n\n function isEmpty(obj) {\n for (var n in obj) { if (obj.hasOwnProperty(n) && obj[n]) { return false } }\n return true\n }\n\n // Extending unicode characters. A series of a non-extending char +\n // any number of extending chars is treated as a single unit as far\n // as editing and measuring is concerned. This is not fully correct,\n // since some scripts/fonts/browsers also treat other configurations\n // of code points as a group.\n var extendingChars = /[\\u0300-\\u036f\\u0483-\\u0489\\u0591-\\u05bd\\u05bf\\u05c1\\u05c2\\u05c4\\u05c5\\u05c7\\u0610-\\u061a\\u064b-\\u065e\\u0670\\u06d6-\\u06dc\\u06de-\\u06e4\\u06e7\\u06e8\\u06ea-\\u06ed\\u0711\\u0730-\\u074a\\u07a6-\\u07b0\\u07eb-\\u07f3\\u0816-\\u0819\\u081b-\\u0823\\u0825-\\u0827\\u0829-\\u082d\\u0900-\\u0902\\u093c\\u0941-\\u0948\\u094d\\u0951-\\u0955\\u0962\\u0963\\u0981\\u09bc\\u09be\\u09c1-\\u09c4\\u09cd\\u09d7\\u09e2\\u09e3\\u0a01\\u0a02\\u0a3c\\u0a41\\u0a42\\u0a47\\u0a48\\u0a4b-\\u0a4d\\u0a51\\u0a70\\u0a71\\u0a75\\u0a81\\u0a82\\u0abc\\u0ac1-\\u0ac5\\u0ac7\\u0ac8\\u0acd\\u0ae2\\u0ae3\\u0b01\\u0b3c\\u0b3e\\u0b3f\\u0b41-\\u0b44\\u0b4d\\u0b56\\u0b57\\u0b62\\u0b63\\u0b82\\u0bbe\\u0bc0\\u0bcd\\u0bd7\\u0c3e-\\u0c40\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55\\u0c56\\u0c62\\u0c63\\u0cbc\\u0cbf\\u0cc2\\u0cc6\\u0ccc\\u0ccd\\u0cd5\\u0cd6\\u0ce2\\u0ce3\\u0d3e\\u0d41-\\u0d44\\u0d4d\\u0d57\\u0d62\\u0d63\\u0dca\\u0dcf\\u0dd2-\\u0dd4\\u0dd6\\u0ddf\\u0e31\\u0e34-\\u0e3a\\u0e47-\\u0e4e\\u0eb1\\u0eb4-\\u0eb9\\u0ebb\\u0ebc\\u0ec8-\\u0ecd\\u0f18\\u0f19\\u0f35\\u0f37\\u0f39\\u0f71-\\u0f7e\\u0f80-\\u0f84\\u0f86\\u0f87\\u0f90-\\u0f97\\u0f99-\\u0fbc\\u0fc6\\u102d-\\u1030\\u1032-\\u1037\\u1039\\u103a\\u103d\\u103e\\u1058\\u1059\\u105e-\\u1060\\u1071-\\u1074\\u1082\\u1085\\u1086\\u108d\\u109d\\u135f\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17b7-\\u17bd\\u17c6\\u17c9-\\u17d3\\u17dd\\u180b-\\u180d\\u18a9\\u1920-\\u1922\\u1927\\u1928\\u1932\\u1939-\\u193b\\u1a17\\u1a18\\u1a56\\u1a58-\\u1a5e\\u1a60\\u1a62\\u1a65-\\u1a6c\\u1a73-\\u1a7c\\u1a7f\\u1b00-\\u1b03\\u1b34\\u1b36-\\u1b3a\\u1b3c\\u1b42\\u1b6b-\\u1b73\\u1b80\\u1b81\\u1ba2-\\u1ba5\\u1ba8\\u1ba9\\u1c2c-\\u1c33\\u1c36\\u1c37\\u1cd0-\\u1cd2\\u1cd4-\\u1ce0\\u1ce2-\\u1ce8\\u1ced\\u1dc0-\\u1de6\\u1dfd-\\u1dff\\u200c\\u200d\\u20d0-\\u20f0\\u2cef-\\u2cf1\\u2de0-\\u2dff\\u302a-\\u302f\\u3099\\u309a\\ua66f-\\ua672\\ua67c\\ua67d\\ua6f0\\ua6f1\\ua802\\ua806\\ua80b\\ua825\\ua826\\ua8c4\\ua8e0-\\ua8f1\\ua926-\\ua92d\\ua947-\\ua951\\ua980-\\ua982\\ua9b3\\ua9b6-\\ua9b9\\ua9bc\\uaa29-\\uaa2e\\uaa31\\uaa32\\uaa35\\uaa36\\uaa43\\uaa4c\\uaab0\\uaab2-\\uaab4\\uaab7\\uaab8\\uaabe\\uaabf\\uaac1\\uabe5\\uabe8\\uabed\\udc00-\\udfff\\ufb1e\\ufe00-\\ufe0f\\ufe20-\\ufe26\\uff9e\\uff9f]/;\n function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendingChars.test(ch) }\n\n // Returns a number from the range [`0`; `str.length`] unless `pos` is outside that range.\n function skipExtendingChars(str, pos, dir) {\n while ((dir < 0 ? pos > 0 : pos < str.length) && isExtendingChar(str.charAt(pos))) { pos += dir; }\n return pos\n }\n\n // Returns the value from the range [`from`; `to`] that satisfies\n // `pred` and is closest to `from`. Assumes that at least `to`\n // satisfies `pred`. Supports `from` being greater than `to`.\n function findFirst(pred, from, to) {\n // At any point we are certain `to` satisfies `pred`, don't know\n // whether `from` does.\n var dir = from > to ? -1 : 1;\n for (;;) {\n if (from == to) { return from }\n var midF = (from + to) / 2, mid = dir < 0 ? Math.ceil(midF) : Math.floor(midF);\n if (mid == from) { return pred(mid) ? from : to }\n if (pred(mid)) { to = mid; }\n else { from = mid + dir; }\n }\n }\n\n // BIDI HELPERS\n\n function iterateBidiSections(order, from, to, f) {\n if (!order) { return f(from, to, \"ltr\", 0) }\n var found = false;\n for (var i = 0; i < order.length; ++i) {\n var part = order[i];\n if (part.from < to && part.to > from || from == to && part.to == from) {\n f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? \"rtl\" : \"ltr\", i);\n found = true;\n }\n }\n if (!found) { f(from, to, \"ltr\"); }\n }\n\n var bidiOther = null;\n function getBidiPartAt(order, ch, sticky) {\n var found;\n bidiOther = null;\n for (var i = 0; i < order.length; ++i) {\n var cur = order[i];\n if (cur.from < ch && cur.to > ch) { return i }\n if (cur.to == ch) {\n if (cur.from != cur.to && sticky == \"before\") { found = i; }\n else { bidiOther = i; }\n }\n if (cur.from == ch) {\n if (cur.from != cur.to && sticky != \"before\") { found = i; }\n else { bidiOther = i; }\n }\n }\n return found != null ? found : bidiOther\n }\n\n // Bidirectional ordering algorithm\n // See http://unicode.org/reports/tr9/tr9-13.html for the algorithm\n // that this (partially) implements.\n\n // One-char codes used for character types:\n // L (L): Left-to-Right\n // R (R): Right-to-Left\n // r (AL): Right-to-Left Arabic\n // 1 (EN): European Number\n // + (ES): European Number Separator\n // % (ET): European Number Terminator\n // n (AN): Arabic Number\n // , (CS): Common Number Separator\n // m (NSM): Non-Spacing Mark\n // b (BN): Boundary Neutral\n // s (B): Paragraph Separator\n // t (S): Segment Separator\n // w (WS): Whitespace\n // N (ON): Other Neutrals\n\n // Returns null if characters are ordered as they appear\n // (left-to-right), or an array of sections ({from, to, level}\n // objects) in the order in which they occur visually.\n var bidiOrdering = (function() {\n // Character types for codepoints 0 to 0xff\n var lowTypes = \"bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN\";\n // Character types for codepoints 0x600 to 0x6f9\n var arabicTypes = \"nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111\";\n function charType(code) {\n if (code <= 0xf7) { return lowTypes.charAt(code) }\n else if (0x590 <= code && code <= 0x5f4) { return \"R\" }\n else if (0x600 <= code && code <= 0x6f9) { return arabicTypes.charAt(code - 0x600) }\n else if (0x6ee <= code && code <= 0x8ac) { return \"r\" }\n else if (0x2000 <= code && code <= 0x200b) { return \"w\" }\n else if (code == 0x200c) { return \"b\" }\n else { return \"L\" }\n }\n\n var bidiRE = /[\\u0590-\\u05f4\\u0600-\\u06ff\\u0700-\\u08ac]/;\n var isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/;\n\n function BidiSpan(level, from, to) {\n this.level = level;\n this.from = from; this.to = to;\n }\n\n return function(str, direction) {\n var outerType = direction == \"ltr\" ? \"L\" : \"R\";\n\n if (str.length == 0 || direction == \"ltr\" && !bidiRE.test(str)) { return false }\n var len = str.length, types = [];\n for (var i = 0; i < len; ++i)\n { types.push(charType(str.charCodeAt(i))); }\n\n // W1. Examine each non-spacing mark (NSM) in the level run, and\n // change the type of the NSM to the type of the previous\n // character. If the NSM is at the start of the level run, it will\n // get the type of sor.\n for (var i$1 = 0, prev = outerType; i$1 < len; ++i$1) {\n var type = types[i$1];\n if (type == \"m\") { types[i$1] = prev; }\n else { prev = type; }\n }\n\n // W2. Search backwards from each instance of a European number\n // until the first strong type (R, L, AL, or sor) is found. If an\n // AL is found, change the type of the European number to Arabic\n // number.\n // W3. Change all ALs to R.\n for (var i$2 = 0, cur = outerType; i$2 < len; ++i$2) {\n var type$1 = types[i$2];\n if (type$1 == \"1\" && cur == \"r\") { types[i$2] = \"n\"; }\n else if (isStrong.test(type$1)) { cur = type$1; if (type$1 == \"r\") { types[i$2] = \"R\"; } }\n }\n\n // W4. A single European separator between two European numbers\n // changes to a European number. A single common separator between\n // two numbers of the same type changes to that type.\n for (var i$3 = 1, prev$1 = types[0]; i$3 < len - 1; ++i$3) {\n var type$2 = types[i$3];\n if (type$2 == \"+\" && prev$1 == \"1\" && types[i$3+1] == \"1\") { types[i$3] = \"1\"; }\n else if (type$2 == \",\" && prev$1 == types[i$3+1] &&\n (prev$1 == \"1\" || prev$1 == \"n\")) { types[i$3] = prev$1; }\n prev$1 = type$2;\n }\n\n // W5. A sequence of European terminators adjacent to European\n // numbers changes to all European numbers.\n // W6. Otherwise, separators and terminators change to Other\n // Neutral.\n for (var i$4 = 0; i$4 < len; ++i$4) {\n var type$3 = types[i$4];\n if (type$3 == \",\") { types[i$4] = \"N\"; }\n else if (type$3 == \"%\") {\n var end = (void 0);\n for (end = i$4 + 1; end < len && types[end] == \"%\"; ++end) {}\n var replace = (i$4 && types[i$4-1] == \"!\") || (end < len && types[end] == \"1\") ? \"1\" : \"N\";\n for (var j = i$4; j < end; ++j) { types[j] = replace; }\n i$4 = end - 1;\n }\n }\n\n // W7. Search backwards from each instance of a European number\n // until the first strong type (R, L, or sor) is found. If an L is\n // found, then change the type of the European number to L.\n for (var i$5 = 0, cur$1 = outerType; i$5 < len; ++i$5) {\n var type$4 = types[i$5];\n if (cur$1 == \"L\" && type$4 == \"1\") { types[i$5] = \"L\"; }\n else if (isStrong.test(type$4)) { cur$1 = type$4; }\n }\n\n // N1. A sequence of neutrals takes the direction of the\n // surrounding strong text if the text on both sides has the same\n // direction. European and Arabic numbers act as if they were R in\n // terms of their influence on neutrals. Start-of-level-run (sor)\n // and end-of-level-run (eor) are used at level run boundaries.\n // N2. Any remaining neutrals take the embedding direction.\n for (var i$6 = 0; i$6 < len; ++i$6) {\n if (isNeutral.test(types[i$6])) {\n var end$1 = (void 0);\n for (end$1 = i$6 + 1; end$1 < len && isNeutral.test(types[end$1]); ++end$1) {}\n var before = (i$6 ? types[i$6-1] : outerType) == \"L\";\n var after = (end$1 < len ? types[end$1] : outerType) == \"L\";\n var replace$1 = before == after ? (before ? \"L\" : \"R\") : outerType;\n for (var j$1 = i$6; j$1 < end$1; ++j$1) { types[j$1] = replace$1; }\n i$6 = end$1 - 1;\n }\n }\n\n // Here we depart from the documented algorithm, in order to avoid\n // building up an actual levels array. Since there are only three\n // levels (0, 1, 2) in an implementation that doesn't take\n // explicit embedding into account, we can build up the order on\n // the fly, without following the level-based algorithm.\n var order = [], m;\n for (var i$7 = 0; i$7 < len;) {\n if (countsAsLeft.test(types[i$7])) {\n var start = i$7;\n for (++i$7; i$7 < len && countsAsLeft.test(types[i$7]); ++i$7) {}\n order.push(new BidiSpan(0, start, i$7));\n } else {\n var pos = i$7, at = order.length, isRTL = direction == \"rtl\" ? 1 : 0;\n for (++i$7; i$7 < len && types[i$7] != \"L\"; ++i$7) {}\n for (var j$2 = pos; j$2 < i$7;) {\n if (countsAsNum.test(types[j$2])) {\n if (pos < j$2) { order.splice(at, 0, new BidiSpan(1, pos, j$2)); at += isRTL; }\n var nstart = j$2;\n for (++j$2; j$2 < i$7 && countsAsNum.test(types[j$2]); ++j$2) {}\n order.splice(at, 0, new BidiSpan(2, nstart, j$2));\n at += isRTL;\n pos = j$2;\n } else { ++j$2; }\n }\n if (pos < i$7) { order.splice(at, 0, new BidiSpan(1, pos, i$7)); }\n }\n }\n if (direction == \"ltr\") {\n if (order[0].level == 1 && (m = str.match(/^\\s+/))) {\n order[0].from = m[0].length;\n order.unshift(new BidiSpan(0, 0, m[0].length));\n }\n if (lst(order).level == 1 && (m = str.match(/\\s+$/))) {\n lst(order).to -= m[0].length;\n order.push(new BidiSpan(0, len - m[0].length, len));\n }\n }\n\n return direction == \"rtl\" ? order.reverse() : order\n }\n })();\n\n // Get the bidi ordering for the given line (and cache it). Returns\n // false for lines that are fully left-to-right, and an array of\n // BidiSpan objects otherwise.\n function getOrder(line, direction) {\n var order = line.order;\n if (order == null) { order = line.order = bidiOrdering(line.text, direction); }\n return order\n }\n\n // EVENT HANDLING\n\n // Lightweight event framework. on/off also work on DOM nodes,\n // registering native DOM handlers.\n\n var noHandlers = [];\n\n var on = function(emitter, type, f) {\n if (emitter.addEventListener) {\n emitter.addEventListener(type, f, false);\n } else if (emitter.attachEvent) {\n emitter.attachEvent(\"on\" + type, f);\n } else {\n var map = emitter._handlers || (emitter._handlers = {});\n map[type] = (map[type] || noHandlers).concat(f);\n }\n };\n\n function getHandlers(emitter, type) {\n return emitter._handlers && emitter._handlers[type] || noHandlers\n }\n\n function off(emitter, type, f) {\n if (emitter.removeEventListener) {\n emitter.removeEventListener(type, f, false);\n } else if (emitter.detachEvent) {\n emitter.detachEvent(\"on\" + type, f);\n } else {\n var map = emitter._handlers, arr = map && map[type];\n if (arr) {\n var index = indexOf(arr, f);\n if (index > -1)\n { map[type] = arr.slice(0, index).concat(arr.slice(index + 1)); }\n }\n }\n }\n\n function signal(emitter, type /*, values...*/) {\n var handlers = getHandlers(emitter, type);\n if (!handlers.length) { return }\n var args = Array.prototype.slice.call(arguments, 2);\n for (var i = 0; i < handlers.length; ++i) { handlers[i].apply(null, args); }\n }\n\n // The DOM events that CodeMirror handles can be overridden by\n // registering a (non-DOM) handler on the editor for the event name,\n // and preventDefault-ing the event in that handler.\n function signalDOMEvent(cm, e, override) {\n if (typeof e == \"string\")\n { e = {type: e, preventDefault: function() { this.defaultPrevented = true; }}; }\n signal(cm, override || e.type, cm, e);\n return e_defaultPrevented(e) || e.codemirrorIgnore\n }\n\n function signalCursorActivity(cm) {\n var arr = cm._handlers && cm._handlers.cursorActivity;\n if (!arr) { return }\n var set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = []);\n for (var i = 0; i < arr.length; ++i) { if (indexOf(set, arr[i]) == -1)\n { set.push(arr[i]); } }\n }\n\n function hasHandler(emitter, type) {\n return getHandlers(emitter, type).length > 0\n }\n\n // Add on and off methods to a constructor's prototype, to make\n // registering events on such objects more convenient.\n function eventMixin(ctor) {\n ctor.prototype.on = function(type, f) {on(this, type, f);};\n ctor.prototype.off = function(type, f) {off(this, type, f);};\n }\n\n // Due to the fact that we still support jurassic IE versions, some\n // compatibility wrappers are needed.\n\n function e_preventDefault(e) {\n if (e.preventDefault) { e.preventDefault(); }\n else { e.returnValue = false; }\n }\n function e_stopPropagation(e) {\n if (e.stopPropagation) { e.stopPropagation(); }\n else { e.cancelBubble = true; }\n }\n function e_defaultPrevented(e) {\n return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false\n }\n function e_stop(e) {e_preventDefault(e); e_stopPropagation(e);}\n\n function e_target(e) {return e.target || e.srcElement}\n function e_button(e) {\n var b = e.which;\n if (b == null) {\n if (e.button & 1) { b = 1; }\n else if (e.button & 2) { b = 3; }\n else if (e.button & 4) { b = 2; }\n }\n if (mac && e.ctrlKey && b == 1) { b = 3; }\n return b\n }\n\n // Detect drag-and-drop\n var dragAndDrop = function() {\n // There is *some* kind of drag-and-drop support in IE6-8, but I\n // couldn't get it to work yet.\n if (ie && ie_version < 9) { return false }\n var div = elt('div');\n return \"draggable\" in div || \"dragDrop\" in div\n }();\n\n var zwspSupported;\n function zeroWidthElement(measure) {\n if (zwspSupported == null) {\n var test = elt(\"span\", \"\\u200b\");\n removeChildrenAndAdd(measure, elt(\"span\", [test, document.createTextNode(\"x\")]));\n if (measure.firstChild.offsetHeight != 0)\n { zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !(ie && ie_version < 8); }\n }\n var node = zwspSupported ? elt(\"span\", \"\\u200b\") :\n elt(\"span\", \"\\u00a0\", null, \"display: inline-block; width: 1px; margin-right: -1px\");\n node.setAttribute(\"cm-text\", \"\");\n return node\n }\n\n // Feature-detect IE's crummy client rect reporting for bidi text\n var badBidiRects;\n function hasBadBidiRects(measure) {\n if (badBidiRects != null) { return badBidiRects }\n var txt = removeChildrenAndAdd(measure, document.createTextNode(\"A\\u062eA\"));\n var r0 = range(txt, 0, 1).getBoundingClientRect();\n var r1 = range(txt, 1, 2).getBoundingClientRect();\n removeChildren(measure);\n if (!r0 || r0.left == r0.right) { return false } // Safari returns null in some cases (#2780)\n return badBidiRects = (r1.right - r0.right < 3)\n }\n\n // See if \"\".split is the broken IE version, if so, provide an\n // alternative way to split lines.\n var splitLinesAuto = \"\\n\\nb\".split(/\\n/).length != 3 ? function (string) {\n var pos = 0, result = [], l = string.length;\n while (pos <= l) {\n var nl = string.indexOf(\"\\n\", pos);\n if (nl == -1) { nl = string.length; }\n var line = string.slice(pos, string.charAt(nl - 1) == \"\\r\" ? nl - 1 : nl);\n var rt = line.indexOf(\"\\r\");\n if (rt != -1) {\n result.push(line.slice(0, rt));\n pos += rt + 1;\n } else {\n result.push(line);\n pos = nl + 1;\n }\n }\n return result\n } : function (string) { return string.split(/\\r\\n?|\\n/); };\n\n var hasSelection = window.getSelection ? function (te) {\n try { return te.selectionStart != te.selectionEnd }\n catch(e) { return false }\n } : function (te) {\n var range;\n try {range = te.ownerDocument.selection.createRange();}\n catch(e) {}\n if (!range || range.parentElement() != te) { return false }\n return range.compareEndPoints(\"StartToEnd\", range) != 0\n };\n\n var hasCopyEvent = (function () {\n var e = elt(\"div\");\n if (\"oncopy\" in e) { return true }\n e.setAttribute(\"oncopy\", \"return;\");\n return typeof e.oncopy == \"function\"\n })();\n\n var badZoomedRects = null;\n function hasBadZoomedRects(measure) {\n if (badZoomedRects != null) { return badZoomedRects }\n var node = removeChildrenAndAdd(measure, elt(\"span\", \"x\"));\n var normal = node.getBoundingClientRect();\n var fromRange = range(node, 0, 1).getBoundingClientRect();\n return badZoomedRects = Math.abs(normal.left - fromRange.left) > 1\n }\n\n // Known modes, by name and by MIME\n var modes = {}, mimeModes = {};\n\n // Extra arguments are stored as the mode's dependencies, which is\n // used by (legacy) mechanisms like loadmode.js to automatically\n // load a mode. (Preferred mechanism is the require/define calls.)\n function defineMode(name, mode) {\n if (arguments.length > 2)\n { mode.dependencies = Array.prototype.slice.call(arguments, 2); }\n modes[name] = mode;\n }\n\n function defineMIME(mime, spec) {\n mimeModes[mime] = spec;\n }\n\n // Given a MIME type, a {name, ...options} config object, or a name\n // string, return a mode config object.\n function resolveMode(spec) {\n if (typeof spec == \"string\" && mimeModes.hasOwnProperty(spec)) {\n spec = mimeModes[spec];\n } else if (spec && typeof spec.name == \"string\" && mimeModes.hasOwnProperty(spec.name)) {\n var found = mimeModes[spec.name];\n if (typeof found == \"string\") { found = {name: found}; }\n spec = createObj(found, spec);\n spec.name = found.name;\n } else if (typeof spec == \"string\" && /^[\\w\\-]+\\/[\\w\\-]+\\+xml$/.test(spec)) {\n return resolveMode(\"application/xml\")\n } else if (typeof spec == \"string\" && /^[\\w\\-]+\\/[\\w\\-]+\\+json$/.test(spec)) {\n return resolveMode(\"application/json\")\n }\n if (typeof spec == \"string\") { return {name: spec} }\n else { return spec || {name: \"null\"} }\n }\n\n // Given a mode spec (anything that resolveMode accepts), find and\n // initialize an actual mode object.\n function getMode(options, spec) {\n spec = resolveMode(spec);\n var mfactory = modes[spec.name];\n if (!mfactory) { return getMode(options, \"text/plain\") }\n var modeObj = mfactory(options, spec);\n if (modeExtensions.hasOwnProperty(spec.name)) {\n var exts = modeExtensions[spec.name];\n for (var prop in exts) {\n if (!exts.hasOwnProperty(prop)) { continue }\n if (modeObj.hasOwnProperty(prop)) { modeObj[\"_\" + prop] = modeObj[prop]; }\n modeObj[prop] = exts[prop];\n }\n }\n modeObj.name = spec.name;\n if (spec.helperType) { modeObj.helperType = spec.helperType; }\n if (spec.modeProps) { for (var prop$1 in spec.modeProps)\n { modeObj[prop$1] = spec.modeProps[prop$1]; } }\n\n return modeObj\n }\n\n // This can be used to attach properties to mode objects from\n // outside the actual mode definition.\n var modeExtensions = {};\n function extendMode(mode, properties) {\n var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {});\n copyObj(properties, exts);\n }\n\n function copyState(mode, state) {\n if (state === true) { return state }\n if (mode.copyState) { return mode.copyState(state) }\n var nstate = {};\n for (var n in state) {\n var val = state[n];\n if (val instanceof Array) { val = val.concat([]); }\n nstate[n] = val;\n }\n return nstate\n }\n\n // Given a mode and a state (for that mode), find the inner mode and\n // state at the position that the state refers to.\n function innerMode(mode, state) {\n var info;\n while (mode.innerMode) {\n info = mode.innerMode(state);\n if (!info || info.mode == mode) { break }\n state = info.state;\n mode = info.mode;\n }\n return info || {mode: mode, state: state}\n }\n\n function startState(mode, a1, a2) {\n return mode.startState ? mode.startState(a1, a2) : true\n }\n\n // STRING STREAM\n\n // Fed to the mode parsers, provides helper functions to make\n // parsers more succinct.\n\n var StringStream = function(string, tabSize, lineOracle) {\n this.pos = this.start = 0;\n this.string = string;\n this.tabSize = tabSize || 8;\n this.lastColumnPos = this.lastColumnValue = 0;\n this.lineStart = 0;\n this.lineOracle = lineOracle;\n };\n\n StringStream.prototype.eol = function () {return this.pos >= this.string.length};\n StringStream.prototype.sol = function () {return this.pos == this.lineStart};\n StringStream.prototype.peek = function () {return this.string.charAt(this.pos) || undefined};\n StringStream.prototype.next = function () {\n if (this.pos < this.string.length)\n { return this.string.charAt(this.pos++) }\n };\n StringStream.prototype.eat = function (match) {\n var ch = this.string.charAt(this.pos);\n var ok;\n if (typeof match == \"string\") { ok = ch == match; }\n else { ok = ch && (match.test ? match.test(ch) : match(ch)); }\n if (ok) {++this.pos; return ch}\n };\n StringStream.prototype.eatWhile = function (match) {\n var start = this.pos;\n while (this.eat(match)){}\n return this.pos > start\n };\n StringStream.prototype.eatSpace = function () {\n var start = this.pos;\n while (/[\\s\\u00a0]/.test(this.string.charAt(this.pos))) { ++this.pos; }\n return this.pos > start\n };\n StringStream.prototype.skipToEnd = function () {this.pos = this.string.length;};\n StringStream.prototype.skipTo = function (ch) {\n var found = this.string.indexOf(ch, this.pos);\n if (found > -1) {this.pos = found; return true}\n };\n StringStream.prototype.backUp = function (n) {this.pos -= n;};\n StringStream.prototype.column = function () {\n if (this.lastColumnPos < this.start) {\n this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue);\n this.lastColumnPos = this.start;\n }\n return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0)\n };\n StringStream.prototype.indentation = function () {\n return countColumn(this.string, null, this.tabSize) -\n (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0)\n };\n StringStream.prototype.match = function (pattern, consume, caseInsensitive) {\n if (typeof pattern == \"string\") {\n var cased = function (str) { return caseInsensitive ? str.toLowerCase() : str; };\n var substr = this.string.substr(this.pos, pattern.length);\n if (cased(substr) == cased(pattern)) {\n if (consume !== false) { this.pos += pattern.length; }\n return true\n }\n } else {\n var match = this.string.slice(this.pos).match(pattern);\n if (match && match.index > 0) { return null }\n if (match && consume !== false) { this.pos += match[0].length; }\n return match\n }\n };\n StringStream.prototype.current = function (){return this.string.slice(this.start, this.pos)};\n StringStream.prototype.hideFirstChars = function (n, inner) {\n this.lineStart += n;\n try { return inner() }\n finally { this.lineStart -= n; }\n };\n StringStream.prototype.lookAhead = function (n) {\n var oracle = this.lineOracle;\n return oracle && oracle.lookAhead(n)\n };\n StringStream.prototype.baseToken = function () {\n var oracle = this.lineOracle;\n return oracle && oracle.baseToken(this.pos)\n };\n\n // Find the line object corresponding to the given line number.\n function getLine(doc, n) {\n n -= doc.first;\n if (n < 0 || n >= doc.size) { throw new Error(\"There is no line \" + (n + doc.first) + \" in the document.\") }\n var chunk = doc;\n while (!chunk.lines) {\n for (var i = 0;; ++i) {\n var child = chunk.children[i], sz = child.chunkSize();\n if (n < sz) { chunk = child; break }\n n -= sz;\n }\n }\n return chunk.lines[n]\n }\n\n // Get the part of a document between two positions, as an array of\n // strings.\n function getBetween(doc, start, end) {\n var out = [], n = start.line;\n doc.iter(start.line, end.line + 1, function (line) {\n var text = line.text;\n if (n == end.line) { text = text.slice(0, end.ch); }\n if (n == start.line) { text = text.slice(start.ch); }\n out.push(text);\n ++n;\n });\n return out\n }\n // Get the lines between from and to, as array of strings.\n function getLines(doc, from, to) {\n var out = [];\n doc.iter(from, to, function (line) { out.push(line.text); }); // iter aborts when callback returns truthy value\n return out\n }\n\n // Update the height of a line, propagating the height change\n // upwards to parent nodes.\n function updateLineHeight(line, height) {\n var diff = height - line.height;\n if (diff) { for (var n = line; n; n = n.parent) { n.height += diff; } }\n }\n\n // Given a line object, find its line number by walking up through\n // its parent links.\n function lineNo(line) {\n if (line.parent == null) { return null }\n var cur = line.parent, no = indexOf(cur.lines, line);\n for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) {\n for (var i = 0;; ++i) {\n if (chunk.children[i] == cur) { break }\n no += chunk.children[i].chunkSize();\n }\n }\n return no + cur.first\n }\n\n // Find the line at the given vertical position, using the height\n // information in the document tree.\n function lineAtHeight(chunk, h) {\n var n = chunk.first;\n outer: do {\n for (var i$1 = 0; i$1 < chunk.children.length; ++i$1) {\n var child = chunk.children[i$1], ch = child.height;\n if (h < ch) { chunk = child; continue outer }\n h -= ch;\n n += child.chunkSize();\n }\n return n\n } while (!chunk.lines)\n var i = 0;\n for (; i < chunk.lines.length; ++i) {\n var line = chunk.lines[i], lh = line.height;\n if (h < lh) { break }\n h -= lh;\n }\n return n + i\n }\n\n function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size}\n\n function lineNumberFor(options, i) {\n return String(options.lineNumberFormatter(i + options.firstLineNumber))\n }\n\n // A Pos instance represents a position within the text.\n function Pos(line, ch, sticky) {\n if ( sticky === void 0 ) sticky = null;\n\n if (!(this instanceof Pos)) { return new Pos(line, ch, sticky) }\n this.line = line;\n this.ch = ch;\n this.sticky = sticky;\n }\n\n // Compare two positions, return 0 if they are the same, a negative\n // number when a is less, and a positive number otherwise.\n function cmp(a, b) { return a.line - b.line || a.ch - b.ch }\n\n function equalCursorPos(a, b) { return a.sticky == b.sticky && cmp(a, b) == 0 }\n\n function copyPos(x) {return Pos(x.line, x.ch)}\n function maxPos(a, b) { return cmp(a, b) < 0 ? b : a }\n function minPos(a, b) { return cmp(a, b) < 0 ? a : b }\n\n // Most of the external API clips given positions to make sure they\n // actually exist within the document.\n function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1))}\n function clipPos(doc, pos) {\n if (pos.line < doc.first) { return Pos(doc.first, 0) }\n var last = doc.first + doc.size - 1;\n if (pos.line > last) { return Pos(last, getLine(doc, last).text.length) }\n return clipToLen(pos, getLine(doc, pos.line).text.length)\n }\n function clipToLen(pos, linelen) {\n var ch = pos.ch;\n if (ch == null || ch > linelen) { return Pos(pos.line, linelen) }\n else if (ch < 0) { return Pos(pos.line, 0) }\n else { return pos }\n }\n function clipPosArray(doc, array) {\n var out = [];\n for (var i = 0; i < array.length; i++) { out[i] = clipPos(doc, array[i]); }\n return out\n }\n\n var SavedContext = function(state, lookAhead) {\n this.state = state;\n this.lookAhead = lookAhead;\n };\n\n var Context = function(doc, state, line, lookAhead) {\n this.state = state;\n this.doc = doc;\n this.line = line;\n this.maxLookAhead = lookAhead || 0;\n this.baseTokens = null;\n this.baseTokenPos = 1;\n };\n\n Context.prototype.lookAhead = function (n) {\n var line = this.doc.getLine(this.line + n);\n if (line != null && n > this.maxLookAhead) { this.maxLookAhead = n; }\n return line\n };\n\n Context.prototype.baseToken = function (n) {\n if (!this.baseTokens) { return null }\n while (this.baseTokens[this.baseTokenPos] <= n)\n { this.baseTokenPos += 2; }\n var type = this.baseTokens[this.baseTokenPos + 1];\n return {type: type && type.replace(/( |^)overlay .*/, \"\"),\n size: this.baseTokens[this.baseTokenPos] - n}\n };\n\n Context.prototype.nextLine = function () {\n this.line++;\n if (this.maxLookAhead > 0) { this.maxLookAhead--; }\n };\n\n Context.fromSaved = function (doc, saved, line) {\n if (saved instanceof SavedContext)\n { return new Context(doc, copyState(doc.mode, saved.state), line, saved.lookAhead) }\n else\n { return new Context(doc, copyState(doc.mode, saved), line) }\n };\n\n Context.prototype.save = function (copy) {\n var state = copy !== false ? copyState(this.doc.mode, this.state) : this.state;\n return this.maxLookAhead > 0 ? new SavedContext(state, this.maxLookAhead) : state\n };\n\n\n // Compute a style array (an array starting with a mode generation\n // -- for invalidation -- followed by pairs of end positions and\n // style strings), which is used to highlight the tokens on the\n // line.\n function highlightLine(cm, line, context, forceToEnd) {\n // A styles array always starts with a number identifying the\n // mode/overlays that it is based on (for easy invalidation).\n var st = [cm.state.modeGen], lineClasses = {};\n // Compute the base array of styles\n runMode(cm, line.text, cm.doc.mode, context, function (end, style) { return st.push(end, style); },\n lineClasses, forceToEnd);\n var state = context.state;\n\n // Run overlays, adjust style array.\n var loop = function ( o ) {\n context.baseTokens = st;\n var overlay = cm.state.overlays[o], i = 1, at = 0;\n context.state = true;\n runMode(cm, line.text, overlay.mode, context, function (end, style) {\n var start = i;\n // Ensure there's a token end at the current position, and that i points at it\n while (at < end) {\n var i_end = st[i];\n if (i_end > end)\n { st.splice(i, 1, end, st[i+1], i_end); }\n i += 2;\n at = Math.min(end, i_end);\n }\n if (!style) { return }\n if (overlay.opaque) {\n st.splice(start, i - start, end, \"overlay \" + style);\n i = start + 2;\n } else {\n for (; start < i; start += 2) {\n var cur = st[start+1];\n st[start+1] = (cur ? cur + \" \" : \"\") + \"overlay \" + style;\n }\n }\n }, lineClasses);\n context.state = state;\n context.baseTokens = null;\n context.baseTokenPos = 1;\n };\n\n for (var o = 0; o < cm.state.overlays.length; ++o) loop( o );\n\n return {styles: st, classes: lineClasses.bgClass || lineClasses.textClass ? lineClasses : null}\n }\n\n function getLineStyles(cm, line, updateFrontier) {\n if (!line.styles || line.styles[0] != cm.state.modeGen) {\n var context = getContextBefore(cm, lineNo(line));\n var resetState = line.text.length > cm.options.maxHighlightLength && copyState(cm.doc.mode, context.state);\n var result = highlightLine(cm, line, context);\n if (resetState) { context.state = resetState; }\n line.stateAfter = context.save(!resetState);\n line.styles = result.styles;\n if (result.classes) { line.styleClasses = result.classes; }\n else if (line.styleClasses) { line.styleClasses = null; }\n if (updateFrontier === cm.doc.highlightFrontier)\n { cm.doc.modeFrontier = Math.max(cm.doc.modeFrontier, ++cm.doc.highlightFrontier); }\n }\n return line.styles\n }\n\n function getContextBefore(cm, n, precise) {\n var doc = cm.doc, display = cm.display;\n if (!doc.mode.startState) { return new Context(doc, true, n) }\n var start = findStartLine(cm, n, precise);\n var saved = start > doc.first && getLine(doc, start - 1).stateAfter;\n var context = saved ? Context.fromSaved(doc, saved, start) : new Context(doc, startState(doc.mode), start);\n\n doc.iter(start, n, function (line) {\n processLine(cm, line.text, context);\n var pos = context.line;\n line.stateAfter = pos == n - 1 || pos % 5 == 0 || pos >= display.viewFrom && pos < display.viewTo ? context.save() : null;\n context.nextLine();\n });\n if (precise) { doc.modeFrontier = context.line; }\n return context\n }\n\n // Lightweight form of highlight -- proceed over this line and\n // update state, but don't save a style array. Used for lines that\n // aren't currently visible.\n function processLine(cm, text, context, startAt) {\n var mode = cm.doc.mode;\n var stream = new StringStream(text, cm.options.tabSize, context);\n stream.start = stream.pos = startAt || 0;\n if (text == \"\") { callBlankLine(mode, context.state); }\n while (!stream.eol()) {\n readToken(mode, stream, context.state);\n stream.start = stream.pos;\n }\n }\n\n function callBlankLine(mode, state) {\n if (mode.blankLine) { return mode.blankLine(state) }\n if (!mode.innerMode) { return }\n var inner = innerMode(mode, state);\n if (inner.mode.blankLine) { return inner.mode.blankLine(inner.state) }\n }\n\n function readToken(mode, stream, state, inner) {\n for (var i = 0; i < 10; i++) {\n if (inner) { inner[0] = innerMode(mode, state).mode; }\n var style = mode.token(stream, state);\n if (stream.pos > stream.start) { return style }\n }\n throw new Error(\"Mode \" + mode.name + \" failed to advance stream.\")\n }\n\n var Token = function(stream, type, state) {\n this.start = stream.start; this.end = stream.pos;\n this.string = stream.current();\n this.type = type || null;\n this.state = state;\n };\n\n // Utility for getTokenAt and getLineTokens\n function takeToken(cm, pos, precise, asArray) {\n var doc = cm.doc, mode = doc.mode, style;\n pos = clipPos(doc, pos);\n var line = getLine(doc, pos.line), context = getContextBefore(cm, pos.line, precise);\n var stream = new StringStream(line.text, cm.options.tabSize, context), tokens;\n if (asArray) { tokens = []; }\n while ((asArray || stream.pos < pos.ch) && !stream.eol()) {\n stream.start = stream.pos;\n style = readToken(mode, stream, context.state);\n if (asArray) { tokens.push(new Token(stream, style, copyState(doc.mode, context.state))); }\n }\n return asArray ? tokens : new Token(stream, style, context.state)\n }\n\n function extractLineClasses(type, output) {\n if (type) { for (;;) {\n var lineClass = type.match(/(?:^|\\s+)line-(background-)?(\\S+)/);\n if (!lineClass) { break }\n type = type.slice(0, lineClass.index) + type.slice(lineClass.index + lineClass[0].length);\n var prop = lineClass[1] ? \"bgClass\" : \"textClass\";\n if (output[prop] == null)\n { output[prop] = lineClass[2]; }\n else if (!(new RegExp(\"(?:^|\\\\s)\" + lineClass[2] + \"(?:$|\\\\s)\")).test(output[prop]))\n { output[prop] += \" \" + lineClass[2]; }\n } }\n return type\n }\n\n // Run the given mode's parser over a line, calling f for each token.\n function runMode(cm, text, mode, context, f, lineClasses, forceToEnd) {\n var flattenSpans = mode.flattenSpans;\n if (flattenSpans == null) { flattenSpans = cm.options.flattenSpans; }\n var curStart = 0, curStyle = null;\n var stream = new StringStream(text, cm.options.tabSize, context), style;\n var inner = cm.options.addModeClass && [null];\n if (text == \"\") { extractLineClasses(callBlankLine(mode, context.state), lineClasses); }\n while (!stream.eol()) {\n if (stream.pos > cm.options.maxHighlightLength) {\n flattenSpans = false;\n if (forceToEnd) { processLine(cm, text, context, stream.pos); }\n stream.pos = text.length;\n style = null;\n } else {\n style = extractLineClasses(readToken(mode, stream, context.state, inner), lineClasses);\n }\n if (inner) {\n var mName = inner[0].name;\n if (mName) { style = \"m-\" + (style ? mName + \" \" + style : mName); }\n }\n if (!flattenSpans || curStyle != style) {\n while (curStart < stream.start) {\n curStart = Math.min(stream.start, curStart + 5000);\n f(curStart, curStyle);\n }\n curStyle = style;\n }\n stream.start = stream.pos;\n }\n while (curStart < stream.pos) {\n // Webkit seems to refuse to render text nodes longer than 57444\n // characters, and returns inaccurate measurements in nodes\n // starting around 5000 chars.\n var pos = Math.min(stream.pos, curStart + 5000);\n f(pos, curStyle);\n curStart = pos;\n }\n }\n\n // Finds the line to start with when starting a parse. Tries to\n // find a line with a stateAfter, so that it can start with a\n // valid state. If that fails, it returns the line with the\n // smallest indentation, which tends to need the least context to\n // parse correctly.\n function findStartLine(cm, n, precise) {\n var minindent, minline, doc = cm.doc;\n var lim = precise ? -1 : n - (cm.doc.mode.innerMode ? 1000 : 100);\n for (var search = n; search > lim; --search) {\n if (search <= doc.first) { return doc.first }\n var line = getLine(doc, search - 1), after = line.stateAfter;\n if (after && (!precise || search + (after instanceof SavedContext ? after.lookAhead : 0) <= doc.modeFrontier))\n { return search }\n var indented = countColumn(line.text, null, cm.options.tabSize);\n if (minline == null || minindent > indented) {\n minline = search - 1;\n minindent = indented;\n }\n }\n return minline\n }\n\n function retreatFrontier(doc, n) {\n doc.modeFrontier = Math.min(doc.modeFrontier, n);\n if (doc.highlightFrontier < n - 10) { return }\n var start = doc.first;\n for (var line = n - 1; line > start; line--) {\n var saved = getLine(doc, line).stateAfter;\n // change is on 3\n // state on line 1 looked ahead 2 -- so saw 3\n // test 1 + 2 < 3 should cover this\n if (saved && (!(saved instanceof SavedContext) || line + saved.lookAhead < n)) {\n start = line + 1;\n break\n }\n }\n doc.highlightFrontier = Math.min(doc.highlightFrontier, start);\n }\n\n // Optimize some code when these features are not used.\n var sawReadOnlySpans = false, sawCollapsedSpans = false;\n\n function seeReadOnlySpans() {\n sawReadOnlySpans = true;\n }\n\n function seeCollapsedSpans() {\n sawCollapsedSpans = true;\n }\n\n // TEXTMARKER SPANS\n\n function MarkedSpan(marker, from, to) {\n this.marker = marker;\n this.from = from; this.to = to;\n }\n\n // Search an array of spans for a span matching the given marker.\n function getMarkedSpanFor(spans, marker) {\n if (spans) { for (var i = 0; i < spans.length; ++i) {\n var span = spans[i];\n if (span.marker == marker) { return span }\n } }\n }\n // Remove a span from an array, returning undefined if no spans are\n // left (we don't store arrays for lines without spans).\n function removeMarkedSpan(spans, span) {\n var r;\n for (var i = 0; i < spans.length; ++i)\n { if (spans[i] != span) { (r || (r = [])).push(spans[i]); } }\n return r\n }\n // Add a span to a line.\n function addMarkedSpan(line, span) {\n line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span];\n span.marker.attachLine(line);\n }\n\n // Used for the algorithm that adjusts markers for a change in the\n // document. These functions cut an array of spans at a given\n // character position, returning an array of remaining chunks (or\n // undefined if nothing remains).\n function markedSpansBefore(old, startCh, isInsert) {\n var nw;\n if (old) { for (var i = 0; i < old.length; ++i) {\n var span = old[i], marker = span.marker;\n var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh);\n if (startsBefore || span.from == startCh && marker.type == \"bookmark\" && (!isInsert || !span.marker.insertLeft)) {\n var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh)\n ;(nw || (nw = [])).push(new MarkedSpan(marker, span.from, endsAfter ? null : span.to));\n }\n } }\n return nw\n }\n function markedSpansAfter(old, endCh, isInsert) {\n var nw;\n if (old) { for (var i = 0; i < old.length; ++i) {\n var span = old[i], marker = span.marker;\n var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh);\n if (endsAfter || span.from == endCh && marker.type == \"bookmark\" && (!isInsert || span.marker.insertLeft)) {\n var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh)\n ;(nw || (nw = [])).push(new MarkedSpan(marker, startsBefore ? null : span.from - endCh,\n span.to == null ? null : span.to - endCh));\n }\n } }\n return nw\n }\n\n // Given a change object, compute the new set of marker spans that\n // cover the line in which the change took place. Removes spans\n // entirely within the change, reconnects spans belonging to the\n // same marker that appear on both sides of the change, and cuts off\n // spans partially within the change. Returns an array of span\n // arrays with one element for each line in (after) the change.\n function stretchSpansOverChange(doc, change) {\n if (change.full) { return null }\n var oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans;\n var oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans;\n if (!oldFirst && !oldLast) { return null }\n\n var startCh = change.from.ch, endCh = change.to.ch, isInsert = cmp(change.from, change.to) == 0;\n // Get the spans that 'stick out' on both sides\n var first = markedSpansBefore(oldFirst, startCh, isInsert);\n var last = markedSpansAfter(oldLast, endCh, isInsert);\n\n // Next, merge those two ends\n var sameLine = change.text.length == 1, offset = lst(change.text).length + (sameLine ? startCh : 0);\n if (first) {\n // Fix up .to properties of first\n for (var i = 0; i < first.length; ++i) {\n var span = first[i];\n if (span.to == null) {\n var found = getMarkedSpanFor(last, span.marker);\n if (!found) { span.to = startCh; }\n else if (sameLine) { span.to = found.to == null ? null : found.to + offset; }\n }\n }\n }\n if (last) {\n // Fix up .from in last (or move them into first in case of sameLine)\n for (var i$1 = 0; i$1 < last.length; ++i$1) {\n var span$1 = last[i$1];\n if (span$1.to != null) { span$1.to += offset; }\n if (span$1.from == null) {\n var found$1 = getMarkedSpanFor(first, span$1.marker);\n if (!found$1) {\n span$1.from = offset;\n if (sameLine) { (first || (first = [])).push(span$1); }\n }\n } else {\n span$1.from += offset;\n if (sameLine) { (first || (first = [])).push(span$1); }\n }\n }\n }\n // Make sure we didn't create any zero-length spans\n if (first) { first = clearEmptySpans(first); }\n if (last && last != first) { last = clearEmptySpans(last); }\n\n var newMarkers = [first];\n if (!sameLine) {\n // Fill gap with whole-line-spans\n var gap = change.text.length - 2, gapMarkers;\n if (gap > 0 && first)\n { for (var i$2 = 0; i$2 < first.length; ++i$2)\n { if (first[i$2].to == null)\n { (gapMarkers || (gapMarkers = [])).push(new MarkedSpan(first[i$2].marker, null, null)); } } }\n for (var i$3 = 0; i$3 < gap; ++i$3)\n { newMarkers.push(gapMarkers); }\n newMarkers.push(last);\n }\n return newMarkers\n }\n\n // Remove spans that are empty and don't have a clearWhenEmpty\n // option of false.\n function clearEmptySpans(spans) {\n for (var i = 0; i < spans.length; ++i) {\n var span = spans[i];\n if (span.from != null && span.from == span.to && span.marker.clearWhenEmpty !== false)\n { spans.splice(i--, 1); }\n }\n if (!spans.length) { return null }\n return spans\n }\n\n // Used to 'clip' out readOnly ranges when making a change.\n function removeReadOnlyRanges(doc, from, to) {\n var markers = null;\n doc.iter(from.line, to.line + 1, function (line) {\n if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) {\n var mark = line.markedSpans[i].marker;\n if (mark.readOnly && (!markers || indexOf(markers, mark) == -1))\n { (markers || (markers = [])).push(mark); }\n } }\n });\n if (!markers) { return null }\n var parts = [{from: from, to: to}];\n for (var i = 0; i < markers.length; ++i) {\n var mk = markers[i], m = mk.find(0);\n for (var j = 0; j < parts.length; ++j) {\n var p = parts[j];\n if (cmp(p.to, m.from) < 0 || cmp(p.from, m.to) > 0) { continue }\n var newParts = [j, 1], dfrom = cmp(p.from, m.from), dto = cmp(p.to, m.to);\n if (dfrom < 0 || !mk.inclusiveLeft && !dfrom)\n { newParts.push({from: p.from, to: m.from}); }\n if (dto > 0 || !mk.inclusiveRight && !dto)\n { newParts.push({from: m.to, to: p.to}); }\n parts.splice.apply(parts, newParts);\n j += newParts.length - 3;\n }\n }\n return parts\n }\n\n // Connect or disconnect spans from a line.\n function detachMarkedSpans(line) {\n var spans = line.markedSpans;\n if (!spans) { return }\n for (var i = 0; i < spans.length; ++i)\n { spans[i].marker.detachLine(line); }\n line.markedSpans = null;\n }\n function attachMarkedSpans(line, spans) {\n if (!spans) { return }\n for (var i = 0; i < spans.length; ++i)\n { spans[i].marker.attachLine(line); }\n line.markedSpans = spans;\n }\n\n // Helpers used when computing which overlapping collapsed span\n // counts as the larger one.\n function extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0 }\n function extraRight(marker) { return marker.inclusiveRight ? 1 : 0 }\n\n // Returns a number indicating which of two overlapping collapsed\n // spans is larger (and thus includes the other). Falls back to\n // comparing ids when the spans cover exactly the same range.\n function compareCollapsedMarkers(a, b) {\n var lenDiff = a.lines.length - b.lines.length;\n if (lenDiff != 0) { return lenDiff }\n var aPos = a.find(), bPos = b.find();\n var fromCmp = cmp(aPos.from, bPos.from) || extraLeft(a) - extraLeft(b);\n if (fromCmp) { return -fromCmp }\n var toCmp = cmp(aPos.to, bPos.to) || extraRight(a) - extraRight(b);\n if (toCmp) { return toCmp }\n return b.id - a.id\n }\n\n // Find out whether a line ends or starts in a collapsed span. If\n // so, return the marker for that span.\n function collapsedSpanAtSide(line, start) {\n var sps = sawCollapsedSpans && line.markedSpans, found;\n if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) {\n sp = sps[i];\n if (sp.marker.collapsed && (start ? sp.from : sp.to) == null &&\n (!found || compareCollapsedMarkers(found, sp.marker) < 0))\n { found = sp.marker; }\n } }\n return found\n }\n function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, true) }\n function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, false) }\n\n function collapsedSpanAround(line, ch) {\n var sps = sawCollapsedSpans && line.markedSpans, found;\n if (sps) { for (var i = 0; i < sps.length; ++i) {\n var sp = sps[i];\n if (sp.marker.collapsed && (sp.from == null || sp.from < ch) && (sp.to == null || sp.to > ch) &&\n (!found || compareCollapsedMarkers(found, sp.marker) < 0)) { found = sp.marker; }\n } }\n return found\n }\n\n // Test whether there exists a collapsed span that partially\n // overlaps (covers the start or end, but not both) of a new span.\n // Such overlap is not allowed.\n function conflictingCollapsedRange(doc, lineNo, from, to, marker) {\n var line = getLine(doc, lineNo);\n var sps = sawCollapsedSpans && line.markedSpans;\n if (sps) { for (var i = 0; i < sps.length; ++i) {\n var sp = sps[i];\n if (!sp.marker.collapsed) { continue }\n var found = sp.marker.find(0);\n var fromCmp = cmp(found.from, from) || extraLeft(sp.marker) - extraLeft(marker);\n var toCmp = cmp(found.to, to) || extraRight(sp.marker) - extraRight(marker);\n if (fromCmp >= 0 && toCmp <= 0 || fromCmp <= 0 && toCmp >= 0) { continue }\n if (fromCmp <= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.to, from) >= 0 : cmp(found.to, from) > 0) ||\n fromCmp >= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.from, to) <= 0 : cmp(found.from, to) < 0))\n { return true }\n } }\n }\n\n // A visual line is a line as drawn on the screen. Folding, for\n // example, can cause multiple logical lines to appear on the same\n // visual line. This finds the start of the visual line that the\n // given line is part of (usually that is the line itself).\n function visualLine(line) {\n var merged;\n while (merged = collapsedSpanAtStart(line))\n { line = merged.find(-1, true).line; }\n return line\n }\n\n function visualLineEnd(line) {\n var merged;\n while (merged = collapsedSpanAtEnd(line))\n { line = merged.find(1, true).line; }\n return line\n }\n\n // Returns an array of logical lines that continue the visual line\n // started by the argument, or undefined if there are no such lines.\n function visualLineContinued(line) {\n var merged, lines;\n while (merged = collapsedSpanAtEnd(line)) {\n line = merged.find(1, true).line\n ;(lines || (lines = [])).push(line);\n }\n return lines\n }\n\n // Get the line number of the start of the visual line that the\n // given line number is part of.\n function visualLineNo(doc, lineN) {\n var line = getLine(doc, lineN), vis = visualLine(line);\n if (line == vis) { return lineN }\n return lineNo(vis)\n }\n\n // Get the line number of the start of the next visual line after\n // the given line.\n function visualLineEndNo(doc, lineN) {\n if (lineN > doc.lastLine()) { return lineN }\n var line = getLine(doc, lineN), merged;\n if (!lineIsHidden(doc, line)) { return lineN }\n while (merged = collapsedSpanAtEnd(line))\n { line = merged.find(1, true).line; }\n return lineNo(line) + 1\n }\n\n // Compute whether a line is hidden. Lines count as hidden when they\n // are part of a visual line that starts with another line, or when\n // they are entirely covered by collapsed, non-widget span.\n function lineIsHidden(doc, line) {\n var sps = sawCollapsedSpans && line.markedSpans;\n if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) {\n sp = sps[i];\n if (!sp.marker.collapsed) { continue }\n if (sp.from == null) { return true }\n if (sp.marker.widgetNode) { continue }\n if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp))\n { return true }\n } }\n }\n function lineIsHiddenInner(doc, line, span) {\n if (span.to == null) {\n var end = span.marker.find(1, true);\n return lineIsHiddenInner(doc, end.line, getMarkedSpanFor(end.line.markedSpans, span.marker))\n }\n if (span.marker.inclusiveRight && span.to == line.text.length)\n { return true }\n for (var sp = (void 0), i = 0; i < line.markedSpans.length; ++i) {\n sp = line.markedSpans[i];\n if (sp.marker.collapsed && !sp.marker.widgetNode && sp.from == span.to &&\n (sp.to == null || sp.to != span.from) &&\n (sp.marker.inclusiveLeft || span.marker.inclusiveRight) &&\n lineIsHiddenInner(doc, line, sp)) { return true }\n }\n }\n\n // Find the height above the given line.\n function heightAtLine(lineObj) {\n lineObj = visualLine(lineObj);\n\n var h = 0, chunk = lineObj.parent;\n for (var i = 0; i < chunk.lines.length; ++i) {\n var line = chunk.lines[i];\n if (line == lineObj) { break }\n else { h += line.height; }\n }\n for (var p = chunk.parent; p; chunk = p, p = chunk.parent) {\n for (var i$1 = 0; i$1 < p.children.length; ++i$1) {\n var cur = p.children[i$1];\n if (cur == chunk) { break }\n else { h += cur.height; }\n }\n }\n return h\n }\n\n // Compute the character length of a line, taking into account\n // collapsed ranges (see markText) that might hide parts, and join\n // other lines onto it.\n function lineLength(line) {\n if (line.height == 0) { return 0 }\n var len = line.text.length, merged, cur = line;\n while (merged = collapsedSpanAtStart(cur)) {\n var found = merged.find(0, true);\n cur = found.from.line;\n len += found.from.ch - found.to.ch;\n }\n cur = line;\n while (merged = collapsedSpanAtEnd(cur)) {\n var found$1 = merged.find(0, true);\n len -= cur.text.length - found$1.from.ch;\n cur = found$1.to.line;\n len += cur.text.length - found$1.to.ch;\n }\n return len\n }\n\n // Find the longest line in the document.\n function findMaxLine(cm) {\n var d = cm.display, doc = cm.doc;\n d.maxLine = getLine(doc, doc.first);\n d.maxLineLength = lineLength(d.maxLine);\n d.maxLineChanged = true;\n doc.iter(function (line) {\n var len = lineLength(line);\n if (len > d.maxLineLength) {\n d.maxLineLength = len;\n d.maxLine = line;\n }\n });\n }\n\n // LINE DATA STRUCTURE\n\n // Line objects. These hold state related to a line, including\n // highlighting info (the styles array).\n var Line = function(text, markedSpans, estimateHeight) {\n this.text = text;\n attachMarkedSpans(this, markedSpans);\n this.height = estimateHeight ? estimateHeight(this) : 1;\n };\n\n Line.prototype.lineNo = function () { return lineNo(this) };\n eventMixin(Line);\n\n // Change the content (text, markers) of a line. Automatically\n // invalidates cached information and tries to re-estimate the\n // line's height.\n function updateLine(line, text, markedSpans, estimateHeight) {\n line.text = text;\n if (line.stateAfter) { line.stateAfter = null; }\n if (line.styles) { line.styles = null; }\n if (line.order != null) { line.order = null; }\n detachMarkedSpans(line);\n attachMarkedSpans(line, markedSpans);\n var estHeight = estimateHeight ? estimateHeight(line) : 1;\n if (estHeight != line.height) { updateLineHeight(line, estHeight); }\n }\n\n // Detach a line from the document tree and its markers.\n function cleanUpLine(line) {\n line.parent = null;\n detachMarkedSpans(line);\n }\n\n // Convert a style as returned by a mode (either null, or a string\n // containing one or more styles) to a CSS style. This is cached,\n // and also looks for line-wide styles.\n var styleToClassCache = {}, styleToClassCacheWithMode = {};\n function interpretTokenStyle(style, options) {\n if (!style || /^\\s*$/.test(style)) { return null }\n var cache = options.addModeClass ? styleToClassCacheWithMode : styleToClassCache;\n return cache[style] ||\n (cache[style] = style.replace(/\\S+/g, \"cm-$&\"))\n }\n\n // Render the DOM representation of the text of a line. Also builds\n // up a 'line map', which points at the DOM nodes that represent\n // specific stretches of text, and is used by the measuring code.\n // The returned object contains the DOM node, this map, and\n // information about line-wide styles that were set by the mode.\n function buildLineContent(cm, lineView) {\n // The padding-right forces the element to have a 'border', which\n // is needed on Webkit to be able to get line-level bounding\n // rectangles for it (in measureChar).\n var content = eltP(\"span\", null, null, webkit ? \"padding-right: .1px\" : null);\n var builder = {pre: eltP(\"pre\", [content], \"CodeMirror-line\"), content: content,\n col: 0, pos: 0, cm: cm,\n trailingSpace: false,\n splitSpaces: cm.getOption(\"lineWrapping\")};\n lineView.measure = {};\n\n // Iterate over the logical lines that make up this visual line.\n for (var i = 0; i <= (lineView.rest ? lineView.rest.length : 0); i++) {\n var line = i ? lineView.rest[i - 1] : lineView.line, order = (void 0);\n builder.pos = 0;\n builder.addToken = buildToken;\n // Optionally wire in some hacks into the token-rendering\n // algorithm, to deal with browser quirks.\n if (hasBadBidiRects(cm.display.measure) && (order = getOrder(line, cm.doc.direction)))\n { builder.addToken = buildTokenBadBidi(builder.addToken, order); }\n builder.map = [];\n var allowFrontierUpdate = lineView != cm.display.externalMeasured && lineNo(line);\n insertLineContent(line, builder, getLineStyles(cm, line, allowFrontierUpdate));\n if (line.styleClasses) {\n if (line.styleClasses.bgClass)\n { builder.bgClass = joinClasses(line.styleClasses.bgClass, builder.bgClass || \"\"); }\n if (line.styleClasses.textClass)\n { builder.textClass = joinClasses(line.styleClasses.textClass, builder.textClass || \"\"); }\n }\n\n // Ensure at least a single node is present, for measuring.\n if (builder.map.length == 0)\n { builder.map.push(0, 0, builder.content.appendChild(zeroWidthElement(cm.display.measure))); }\n\n // Store the map and a cache object for the current logical line\n if (i == 0) {\n lineView.measure.map = builder.map;\n lineView.measure.cache = {};\n } else {\n (lineView.measure.maps || (lineView.measure.maps = [])).push(builder.map)\n ;(lineView.measure.caches || (lineView.measure.caches = [])).push({});\n }\n }\n\n // See issue #2901\n if (webkit) {\n var last = builder.content.lastChild;\n if (/\\bcm-tab\\b/.test(last.className) || (last.querySelector && last.querySelector(\".cm-tab\")))\n { builder.content.className = \"cm-tab-wrap-hack\"; }\n }\n\n signal(cm, \"renderLine\", cm, lineView.line, builder.pre);\n if (builder.pre.className)\n { builder.textClass = joinClasses(builder.pre.className, builder.textClass || \"\"); }\n\n return builder\n }\n\n function defaultSpecialCharPlaceholder(ch) {\n var token = elt(\"span\", \"\\u2022\", \"cm-invalidchar\");\n token.title = \"\\\\u\" + ch.charCodeAt(0).toString(16);\n token.setAttribute(\"aria-label\", token.title);\n return token\n }\n\n // Build up the DOM representation for a single token, and add it to\n // the line map. Takes care to render special characters separately.\n function buildToken(builder, text, style, startStyle, endStyle, css, attributes) {\n if (!text) { return }\n var displayText = builder.splitSpaces ? splitSpaces(text, builder.trailingSpace) : text;\n var special = builder.cm.state.specialChars, mustWrap = false;\n var content;\n if (!special.test(text)) {\n builder.col += text.length;\n content = document.createTextNode(displayText);\n builder.map.push(builder.pos, builder.pos + text.length, content);\n if (ie && ie_version < 9) { mustWrap = true; }\n builder.pos += text.length;\n } else {\n content = document.createDocumentFragment();\n var pos = 0;\n while (true) {\n special.lastIndex = pos;\n var m = special.exec(text);\n var skipped = m ? m.index - pos : text.length - pos;\n if (skipped) {\n var txt = document.createTextNode(displayText.slice(pos, pos + skipped));\n if (ie && ie_version < 9) { content.appendChild(elt(\"span\", [txt])); }\n else { content.appendChild(txt); }\n builder.map.push(builder.pos, builder.pos + skipped, txt);\n builder.col += skipped;\n builder.pos += skipped;\n }\n if (!m) { break }\n pos += skipped + 1;\n var txt$1 = (void 0);\n if (m[0] == \"\\t\") {\n var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize;\n txt$1 = content.appendChild(elt(\"span\", spaceStr(tabWidth), \"cm-tab\"));\n txt$1.setAttribute(\"role\", \"presentation\");\n txt$1.setAttribute(\"cm-text\", \"\\t\");\n builder.col += tabWidth;\n } else if (m[0] == \"\\r\" || m[0] == \"\\n\") {\n txt$1 = content.appendChild(elt(\"span\", m[0] == \"\\r\" ? \"\\u240d\" : \"\\u2424\", \"cm-invalidchar\"));\n txt$1.setAttribute(\"cm-text\", m[0]);\n builder.col += 1;\n } else {\n txt$1 = builder.cm.options.specialCharPlaceholder(m[0]);\n txt$1.setAttribute(\"cm-text\", m[0]);\n if (ie && ie_version < 9) { content.appendChild(elt(\"span\", [txt$1])); }\n else { content.appendChild(txt$1); }\n builder.col += 1;\n }\n builder.map.push(builder.pos, builder.pos + 1, txt$1);\n builder.pos++;\n }\n }\n builder.trailingSpace = displayText.charCodeAt(text.length - 1) == 32;\n if (style || startStyle || endStyle || mustWrap || css || attributes) {\n var fullStyle = style || \"\";\n if (startStyle) { fullStyle += startStyle; }\n if (endStyle) { fullStyle += endStyle; }\n var token = elt(\"span\", [content], fullStyle, css);\n if (attributes) {\n for (var attr in attributes) { if (attributes.hasOwnProperty(attr) && attr != \"style\" && attr != \"class\")\n { token.setAttribute(attr, attributes[attr]); } }\n }\n return builder.content.appendChild(token)\n }\n builder.content.appendChild(content);\n }\n\n // Change some spaces to NBSP to prevent the browser from collapsing\n // trailing spaces at the end of a line when rendering text (issue #1362).\n function splitSpaces(text, trailingBefore) {\n if (text.length > 1 && !/ /.test(text)) { return text }\n var spaceBefore = trailingBefore, result = \"\";\n for (var i = 0; i < text.length; i++) {\n var ch = text.charAt(i);\n if (ch == \" \" && spaceBefore && (i == text.length - 1 || text.charCodeAt(i + 1) == 32))\n { ch = \"\\u00a0\"; }\n result += ch;\n spaceBefore = ch == \" \";\n }\n return result\n }\n\n // Work around nonsense dimensions being reported for stretches of\n // right-to-left text.\n function buildTokenBadBidi(inner, order) {\n return function (builder, text, style, startStyle, endStyle, css, attributes) {\n style = style ? style + \" cm-force-border\" : \"cm-force-border\";\n var start = builder.pos, end = start + text.length;\n for (;;) {\n // Find the part that overlaps with the start of this text\n var part = (void 0);\n for (var i = 0; i < order.length; i++) {\n part = order[i];\n if (part.to > start && part.from <= start) { break }\n }\n if (part.to >= end) { return inner(builder, text, style, startStyle, endStyle, css, attributes) }\n inner(builder, text.slice(0, part.to - start), style, startStyle, null, css, attributes);\n startStyle = null;\n text = text.slice(part.to - start);\n start = part.to;\n }\n }\n }\n\n function buildCollapsedSpan(builder, size, marker, ignoreWidget) {\n var widget = !ignoreWidget && marker.widgetNode;\n if (widget) { builder.map.push(builder.pos, builder.pos + size, widget); }\n if (!ignoreWidget && builder.cm.display.input.needsContentAttribute) {\n if (!widget)\n { widget = builder.content.appendChild(document.createElement(\"span\")); }\n widget.setAttribute(\"cm-marker\", marker.id);\n }\n if (widget) {\n builder.cm.display.input.setUneditable(widget);\n builder.content.appendChild(widget);\n }\n builder.pos += size;\n builder.trailingSpace = false;\n }\n\n // Outputs a number of spans to make up a line, taking highlighting\n // and marked text into account.\n function insertLineContent(line, builder, styles) {\n var spans = line.markedSpans, allText = line.text, at = 0;\n if (!spans) {\n for (var i$1 = 1; i$1 < styles.length; i$1+=2)\n { builder.addToken(builder, allText.slice(at, at = styles[i$1]), interpretTokenStyle(styles[i$1+1], builder.cm.options)); }\n return\n }\n\n var len = allText.length, pos = 0, i = 1, text = \"\", style, css;\n var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, collapsed, attributes;\n for (;;) {\n if (nextChange == pos) { // Update current marker set\n spanStyle = spanEndStyle = spanStartStyle = css = \"\";\n attributes = null;\n collapsed = null; nextChange = Infinity;\n var foundBookmarks = [], endStyles = (void 0);\n for (var j = 0; j < spans.length; ++j) {\n var sp = spans[j], m = sp.marker;\n if (m.type == \"bookmark\" && sp.from == pos && m.widgetNode) {\n foundBookmarks.push(m);\n } else if (sp.from <= pos && (sp.to == null || sp.to > pos || m.collapsed && sp.to == pos && sp.from == pos)) {\n if (sp.to != null && sp.to != pos && nextChange > sp.to) {\n nextChange = sp.to;\n spanEndStyle = \"\";\n }\n if (m.className) { spanStyle += \" \" + m.className; }\n if (m.css) { css = (css ? css + \";\" : \"\") + m.css; }\n if (m.startStyle && sp.from == pos) { spanStartStyle += \" \" + m.startStyle; }\n if (m.endStyle && sp.to == nextChange) { (endStyles || (endStyles = [])).push(m.endStyle, sp.to); }\n // support for the old title property\n // https://github.com/codemirror/CodeMirror/pull/5673\n if (m.title) { (attributes || (attributes = {})).title = m.title; }\n if (m.attributes) {\n for (var attr in m.attributes)\n { (attributes || (attributes = {}))[attr] = m.attributes[attr]; }\n }\n if (m.collapsed && (!collapsed || compareCollapsedMarkers(collapsed.marker, m) < 0))\n { collapsed = sp; }\n } else if (sp.from > pos && nextChange > sp.from) {\n nextChange = sp.from;\n }\n }\n if (endStyles) { for (var j$1 = 0; j$1 < endStyles.length; j$1 += 2)\n { if (endStyles[j$1 + 1] == nextChange) { spanEndStyle += \" \" + endStyles[j$1]; } } }\n\n if (!collapsed || collapsed.from == pos) { for (var j$2 = 0; j$2 < foundBookmarks.length; ++j$2)\n { buildCollapsedSpan(builder, 0, foundBookmarks[j$2]); } }\n if (collapsed && (collapsed.from || 0) == pos) {\n buildCollapsedSpan(builder, (collapsed.to == null ? len + 1 : collapsed.to) - pos,\n collapsed.marker, collapsed.from == null);\n if (collapsed.to == null) { return }\n if (collapsed.to == pos) { collapsed = false; }\n }\n }\n if (pos >= len) { break }\n\n var upto = Math.min(len, nextChange);\n while (true) {\n if (text) {\n var end = pos + text.length;\n if (!collapsed) {\n var tokenText = end > upto ? text.slice(0, upto - pos) : text;\n builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle,\n spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : \"\", css, attributes);\n }\n if (end >= upto) {text = text.slice(upto - pos); pos = upto; break}\n pos = end;\n spanStartStyle = \"\";\n }\n text = allText.slice(at, at = styles[i++]);\n style = interpretTokenStyle(styles[i++], builder.cm.options);\n }\n }\n }\n\n\n // These objects are used to represent the visible (currently drawn)\n // part of the document. A LineView may correspond to multiple\n // logical lines, if those are connected by collapsed ranges.\n function LineView(doc, line, lineN) {\n // The starting line\n this.line = line;\n // Continuing lines, if any\n this.rest = visualLineContinued(line);\n // Number of logical lines in this visual line\n this.size = this.rest ? lineNo(lst(this.rest)) - lineN + 1 : 1;\n this.node = this.text = null;\n this.hidden = lineIsHidden(doc, line);\n }\n\n // Create a range of LineView objects for the given lines.\n function buildViewArray(cm, from, to) {\n var array = [], nextPos;\n for (var pos = from; pos < to; pos = nextPos) {\n var view = new LineView(cm.doc, getLine(cm.doc, pos), pos);\n nextPos = pos + view.size;\n array.push(view);\n }\n return array\n }\n\n var operationGroup = null;\n\n function pushOperation(op) {\n if (operationGroup) {\n operationGroup.ops.push(op);\n } else {\n op.ownsGroup = operationGroup = {\n ops: [op],\n delayedCallbacks: []\n };\n }\n }\n\n function fireCallbacksForOps(group) {\n // Calls delayed callbacks and cursorActivity handlers until no\n // new ones appear\n var callbacks = group.delayedCallbacks, i = 0;\n do {\n for (; i < callbacks.length; i++)\n { callbacks[i].call(null); }\n for (var j = 0; j < group.ops.length; j++) {\n var op = group.ops[j];\n if (op.cursorActivityHandlers)\n { while (op.cursorActivityCalled < op.cursorActivityHandlers.length)\n { op.cursorActivityHandlers[op.cursorActivityCalled++].call(null, op.cm); } }\n }\n } while (i < callbacks.length)\n }\n\n function finishOperation(op, endCb) {\n var group = op.ownsGroup;\n if (!group) { return }\n\n try { fireCallbacksForOps(group); }\n finally {\n operationGroup = null;\n endCb(group);\n }\n }\n\n var orphanDelayedCallbacks = null;\n\n // Often, we want to signal events at a point where we are in the\n // middle of some work, but don't want the handler to start calling\n // other methods on the editor, which might be in an inconsistent\n // state or simply not expect any other events to happen.\n // signalLater looks whether there are any handlers, and schedules\n // them to be executed when the last operation ends, or, if no\n // operation is active, when a timeout fires.\n function signalLater(emitter, type /*, values...*/) {\n var arr = getHandlers(emitter, type);\n if (!arr.length) { return }\n var args = Array.prototype.slice.call(arguments, 2), list;\n if (operationGroup) {\n list = operationGroup.delayedCallbacks;\n } else if (orphanDelayedCallbacks) {\n list = orphanDelayedCallbacks;\n } else {\n list = orphanDelayedCallbacks = [];\n setTimeout(fireOrphanDelayed, 0);\n }\n var loop = function ( i ) {\n list.push(function () { return arr[i].apply(null, args); });\n };\n\n for (var i = 0; i < arr.length; ++i)\n loop( i );\n }\n\n function fireOrphanDelayed() {\n var delayed = orphanDelayedCallbacks;\n orphanDelayedCallbacks = null;\n for (var i = 0; i < delayed.length; ++i) { delayed[i](); }\n }\n\n // When an aspect of a line changes, a string is added to\n // lineView.changes. This updates the relevant part of the line's\n // DOM structure.\n function updateLineForChanges(cm, lineView, lineN, dims) {\n for (var j = 0; j < lineView.changes.length; j++) {\n var type = lineView.changes[j];\n if (type == \"text\") { updateLineText(cm, lineView); }\n else if (type == \"gutter\") { updateLineGutter(cm, lineView, lineN, dims); }\n else if (type == \"class\") { updateLineClasses(cm, lineView); }\n else if (type == \"widget\") { updateLineWidgets(cm, lineView, dims); }\n }\n lineView.changes = null;\n }\n\n // Lines with gutter elements, widgets or a background class need to\n // be wrapped, and have the extra elements added to the wrapper div\n function ensureLineWrapped(lineView) {\n if (lineView.node == lineView.text) {\n lineView.node = elt(\"div\", null, null, \"position: relative\");\n if (lineView.text.parentNode)\n { lineView.text.parentNode.replaceChild(lineView.node, lineView.text); }\n lineView.node.appendChild(lineView.text);\n if (ie && ie_version < 8) { lineView.node.style.zIndex = 2; }\n }\n return lineView.node\n }\n\n function updateLineBackground(cm, lineView) {\n var cls = lineView.bgClass ? lineView.bgClass + \" \" + (lineView.line.bgClass || \"\") : lineView.line.bgClass;\n if (cls) { cls += \" CodeMirror-linebackground\"; }\n if (lineView.background) {\n if (cls) { lineView.background.className = cls; }\n else { lineView.background.parentNode.removeChild(lineView.background); lineView.background = null; }\n } else if (cls) {\n var wrap = ensureLineWrapped(lineView);\n lineView.background = wrap.insertBefore(elt(\"div\", null, cls), wrap.firstChild);\n cm.display.input.setUneditable(lineView.background);\n }\n }\n\n // Wrapper around buildLineContent which will reuse the structure\n // in display.externalMeasured when possible.\n function getLineContent(cm, lineView) {\n var ext = cm.display.externalMeasured;\n if (ext && ext.line == lineView.line) {\n cm.display.externalMeasured = null;\n lineView.measure = ext.measure;\n return ext.built\n }\n return buildLineContent(cm, lineView)\n }\n\n // Redraw the line's text. Interacts with the background and text\n // classes because the mode may output tokens that influence these\n // classes.\n function updateLineText(cm, lineView) {\n var cls = lineView.text.className;\n var built = getLineContent(cm, lineView);\n if (lineView.text == lineView.node) { lineView.node = built.pre; }\n lineView.text.parentNode.replaceChild(built.pre, lineView.text);\n lineView.text = built.pre;\n if (built.bgClass != lineView.bgClass || built.textClass != lineView.textClass) {\n lineView.bgClass = built.bgClass;\n lineView.textClass = built.textClass;\n updateLineClasses(cm, lineView);\n } else if (cls) {\n lineView.text.className = cls;\n }\n }\n\n function updateLineClasses(cm, lineView) {\n updateLineBackground(cm, lineView);\n if (lineView.line.wrapClass)\n { ensureLineWrapped(lineView).className = lineView.line.wrapClass; }\n else if (lineView.node != lineView.text)\n { lineView.node.className = \"\"; }\n var textClass = lineView.textClass ? lineView.textClass + \" \" + (lineView.line.textClass || \"\") : lineView.line.textClass;\n lineView.text.className = textClass || \"\";\n }\n\n function updateLineGutter(cm, lineView, lineN, dims) {\n if (lineView.gutter) {\n lineView.node.removeChild(lineView.gutter);\n lineView.gutter = null;\n }\n if (lineView.gutterBackground) {\n lineView.node.removeChild(lineView.gutterBackground);\n lineView.gutterBackground = null;\n }\n if (lineView.line.gutterClass) {\n var wrap = ensureLineWrapped(lineView);\n lineView.gutterBackground = elt(\"div\", null, \"CodeMirror-gutter-background \" + lineView.line.gutterClass,\n (\"left: \" + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + \"px; width: \" + (dims.gutterTotalWidth) + \"px\"));\n cm.display.input.setUneditable(lineView.gutterBackground);\n wrap.insertBefore(lineView.gutterBackground, lineView.text);\n }\n var markers = lineView.line.gutterMarkers;\n if (cm.options.lineNumbers || markers) {\n var wrap$1 = ensureLineWrapped(lineView);\n var gutterWrap = lineView.gutter = elt(\"div\", null, \"CodeMirror-gutter-wrapper\", (\"left: \" + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + \"px\"));\n gutterWrap.setAttribute(\"aria-hidden\", \"true\");\n cm.display.input.setUneditable(gutterWrap);\n wrap$1.insertBefore(gutterWrap, lineView.text);\n if (lineView.line.gutterClass)\n { gutterWrap.className += \" \" + lineView.line.gutterClass; }\n if (cm.options.lineNumbers && (!markers || !markers[\"CodeMirror-linenumbers\"]))\n { lineView.lineNumber = gutterWrap.appendChild(\n elt(\"div\", lineNumberFor(cm.options, lineN),\n \"CodeMirror-linenumber CodeMirror-gutter-elt\",\n (\"left: \" + (dims.gutterLeft[\"CodeMirror-linenumbers\"]) + \"px; width: \" + (cm.display.lineNumInnerWidth) + \"px\"))); }\n if (markers) { for (var k = 0; k < cm.display.gutterSpecs.length; ++k) {\n var id = cm.display.gutterSpecs[k].className, found = markers.hasOwnProperty(id) && markers[id];\n if (found)\n { gutterWrap.appendChild(elt(\"div\", [found], \"CodeMirror-gutter-elt\",\n (\"left: \" + (dims.gutterLeft[id]) + \"px; width: \" + (dims.gutterWidth[id]) + \"px\"))); }\n } }\n }\n }\n\n function updateLineWidgets(cm, lineView, dims) {\n if (lineView.alignable) { lineView.alignable = null; }\n var isWidget = classTest(\"CodeMirror-linewidget\");\n for (var node = lineView.node.firstChild, next = (void 0); node; node = next) {\n next = node.nextSibling;\n if (isWidget.test(node.className)) { lineView.node.removeChild(node); }\n }\n insertLineWidgets(cm, lineView, dims);\n }\n\n // Build a line's DOM representation from scratch\n function buildLineElement(cm, lineView, lineN, dims) {\n var built = getLineContent(cm, lineView);\n lineView.text = lineView.node = built.pre;\n if (built.bgClass) { lineView.bgClass = built.bgClass; }\n if (built.textClass) { lineView.textClass = built.textClass; }\n\n updateLineClasses(cm, lineView);\n updateLineGutter(cm, lineView, lineN, dims);\n insertLineWidgets(cm, lineView, dims);\n return lineView.node\n }\n\n // A lineView may contain multiple logical lines (when merged by\n // collapsed spans). The widgets for all of them need to be drawn.\n function insertLineWidgets(cm, lineView, dims) {\n insertLineWidgetsFor(cm, lineView.line, lineView, dims, true);\n if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++)\n { insertLineWidgetsFor(cm, lineView.rest[i], lineView, dims, false); } }\n }\n\n function insertLineWidgetsFor(cm, line, lineView, dims, allowAbove) {\n if (!line.widgets) { return }\n var wrap = ensureLineWrapped(lineView);\n for (var i = 0, ws = line.widgets; i < ws.length; ++i) {\n var widget = ws[i], node = elt(\"div\", [widget.node], \"CodeMirror-linewidget\" + (widget.className ? \" \" + widget.className : \"\"));\n if (!widget.handleMouseEvents) { node.setAttribute(\"cm-ignore-events\", \"true\"); }\n positionLineWidget(widget, node, lineView, dims);\n cm.display.input.setUneditable(node);\n if (allowAbove && widget.above)\n { wrap.insertBefore(node, lineView.gutter || lineView.text); }\n else\n { wrap.appendChild(node); }\n signalLater(widget, \"redraw\");\n }\n }\n\n function positionLineWidget(widget, node, lineView, dims) {\n if (widget.noHScroll) {\n (lineView.alignable || (lineView.alignable = [])).push(node);\n var width = dims.wrapperWidth;\n node.style.left = dims.fixedPos + \"px\";\n if (!widget.coverGutter) {\n width -= dims.gutterTotalWidth;\n node.style.paddingLeft = dims.gutterTotalWidth + \"px\";\n }\n node.style.width = width + \"px\";\n }\n if (widget.coverGutter) {\n node.style.zIndex = 5;\n node.style.position = \"relative\";\n if (!widget.noHScroll) { node.style.marginLeft = -dims.gutterTotalWidth + \"px\"; }\n }\n }\n\n function widgetHeight(widget) {\n if (widget.height != null) { return widget.height }\n var cm = widget.doc.cm;\n if (!cm) { return 0 }\n if (!contains(document.body, widget.node)) {\n var parentStyle = \"position: relative;\";\n if (widget.coverGutter)\n { parentStyle += \"margin-left: -\" + cm.display.gutters.offsetWidth + \"px;\"; }\n if (widget.noHScroll)\n { parentStyle += \"width: \" + cm.display.wrapper.clientWidth + \"px;\"; }\n removeChildrenAndAdd(cm.display.measure, elt(\"div\", [widget.node], null, parentStyle));\n }\n return widget.height = widget.node.parentNode.offsetHeight\n }\n\n // Return true when the given mouse event happened in a widget\n function eventInWidget(display, e) {\n for (var n = e_target(e); n != display.wrapper; n = n.parentNode) {\n if (!n || (n.nodeType == 1 && n.getAttribute(\"cm-ignore-events\") == \"true\") ||\n (n.parentNode == display.sizer && n != display.mover))\n { return true }\n }\n }\n\n // POSITION MEASUREMENT\n\n function paddingTop(display) {return display.lineSpace.offsetTop}\n function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight}\n function paddingH(display) {\n if (display.cachedPaddingH) { return display.cachedPaddingH }\n var e = removeChildrenAndAdd(display.measure, elt(\"pre\", \"x\", \"CodeMirror-line-like\"));\n var style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle;\n var data = {left: parseInt(style.paddingLeft), right: parseInt(style.paddingRight)};\n if (!isNaN(data.left) && !isNaN(data.right)) { display.cachedPaddingH = data; }\n return data\n }\n\n function scrollGap(cm) { return scrollerGap - cm.display.nativeBarWidth }\n function displayWidth(cm) {\n return cm.display.scroller.clientWidth - scrollGap(cm) - cm.display.barWidth\n }\n function displayHeight(cm) {\n return cm.display.scroller.clientHeight - scrollGap(cm) - cm.display.barHeight\n }\n\n // Ensure the lineView.wrapping.heights array is populated. This is\n // an array of bottom offsets for the lines that make up a drawn\n // line. When lineWrapping is on, there might be more than one\n // height.\n function ensureLineHeights(cm, lineView, rect) {\n var wrapping = cm.options.lineWrapping;\n var curWidth = wrapping && displayWidth(cm);\n if (!lineView.measure.heights || wrapping && lineView.measure.width != curWidth) {\n var heights = lineView.measure.heights = [];\n if (wrapping) {\n lineView.measure.width = curWidth;\n var rects = lineView.text.firstChild.getClientRects();\n for (var i = 0; i < rects.length - 1; i++) {\n var cur = rects[i], next = rects[i + 1];\n if (Math.abs(cur.bottom - next.bottom) > 2)\n { heights.push((cur.bottom + next.top) / 2 - rect.top); }\n }\n }\n heights.push(rect.bottom - rect.top);\n }\n }\n\n // Find a line map (mapping character offsets to text nodes) and a\n // measurement cache for the given line number. (A line view might\n // contain multiple lines when collapsed ranges are present.)\n function mapFromLineView(lineView, line, lineN) {\n if (lineView.line == line)\n { return {map: lineView.measure.map, cache: lineView.measure.cache} }\n for (var i = 0; i < lineView.rest.length; i++)\n { if (lineView.rest[i] == line)\n { return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i]} } }\n for (var i$1 = 0; i$1 < lineView.rest.length; i$1++)\n { if (lineNo(lineView.rest[i$1]) > lineN)\n { return {map: lineView.measure.maps[i$1], cache: lineView.measure.caches[i$1], before: true} } }\n }\n\n // Render a line into the hidden node display.externalMeasured. Used\n // when measurement is needed for a line that's not in the viewport.\n function updateExternalMeasurement(cm, line) {\n line = visualLine(line);\n var lineN = lineNo(line);\n var view = cm.display.externalMeasured = new LineView(cm.doc, line, lineN);\n view.lineN = lineN;\n var built = view.built = buildLineContent(cm, view);\n view.text = built.pre;\n removeChildrenAndAdd(cm.display.lineMeasure, built.pre);\n return view\n }\n\n // Get a {top, bottom, left, right} box (in line-local coordinates)\n // for a given character.\n function measureChar(cm, line, ch, bias) {\n return measureCharPrepared(cm, prepareMeasureForLine(cm, line), ch, bias)\n }\n\n // Find a line view that corresponds to the given line number.\n function findViewForLine(cm, lineN) {\n if (lineN >= cm.display.viewFrom && lineN < cm.display.viewTo)\n { return cm.display.view[findViewIndex(cm, lineN)] }\n var ext = cm.display.externalMeasured;\n if (ext && lineN >= ext.lineN && lineN < ext.lineN + ext.size)\n { return ext }\n }\n\n // Measurement can be split in two steps, the set-up work that\n // applies to the whole line, and the measurement of the actual\n // character. Functions like coordsChar, that need to do a lot of\n // measurements in a row, can thus ensure that the set-up work is\n // only done once.\n function prepareMeasureForLine(cm, line) {\n var lineN = lineNo(line);\n var view = findViewForLine(cm, lineN);\n if (view && !view.text) {\n view = null;\n } else if (view && view.changes) {\n updateLineForChanges(cm, view, lineN, getDimensions(cm));\n cm.curOp.forceUpdate = true;\n }\n if (!view)\n { view = updateExternalMeasurement(cm, line); }\n\n var info = mapFromLineView(view, line, lineN);\n return {\n line: line, view: view, rect: null,\n map: info.map, cache: info.cache, before: info.before,\n hasHeights: false\n }\n }\n\n // Given a prepared measurement object, measures the position of an\n // actual character (or fetches it from the cache).\n function measureCharPrepared(cm, prepared, ch, bias, varHeight) {\n if (prepared.before) { ch = -1; }\n var key = ch + (bias || \"\"), found;\n if (prepared.cache.hasOwnProperty(key)) {\n found = prepared.cache[key];\n } else {\n if (!prepared.rect)\n { prepared.rect = prepared.view.text.getBoundingClientRect(); }\n if (!prepared.hasHeights) {\n ensureLineHeights(cm, prepared.view, prepared.rect);\n prepared.hasHeights = true;\n }\n found = measureCharInner(cm, prepared, ch, bias);\n if (!found.bogus) { prepared.cache[key] = found; }\n }\n return {left: found.left, right: found.right,\n top: varHeight ? found.rtop : found.top,\n bottom: varHeight ? found.rbottom : found.bottom}\n }\n\n var nullRect = {left: 0, right: 0, top: 0, bottom: 0};\n\n function nodeAndOffsetInLineMap(map, ch, bias) {\n var node, start, end, collapse, mStart, mEnd;\n // First, search the line map for the text node corresponding to,\n // or closest to, the target character.\n for (var i = 0; i < map.length; i += 3) {\n mStart = map[i];\n mEnd = map[i + 1];\n if (ch < mStart) {\n start = 0; end = 1;\n collapse = \"left\";\n } else if (ch < mEnd) {\n start = ch - mStart;\n end = start + 1;\n } else if (i == map.length - 3 || ch == mEnd && map[i + 3] > ch) {\n end = mEnd - mStart;\n start = end - 1;\n if (ch >= mEnd) { collapse = \"right\"; }\n }\n if (start != null) {\n node = map[i + 2];\n if (mStart == mEnd && bias == (node.insertLeft ? \"left\" : \"right\"))\n { collapse = bias; }\n if (bias == \"left\" && start == 0)\n { while (i && map[i - 2] == map[i - 3] && map[i - 1].insertLeft) {\n node = map[(i -= 3) + 2];\n collapse = \"left\";\n } }\n if (bias == \"right\" && start == mEnd - mStart)\n { while (i < map.length - 3 && map[i + 3] == map[i + 4] && !map[i + 5].insertLeft) {\n node = map[(i += 3) + 2];\n collapse = \"right\";\n } }\n break\n }\n }\n return {node: node, start: start, end: end, collapse: collapse, coverStart: mStart, coverEnd: mEnd}\n }\n\n function getUsefulRect(rects, bias) {\n var rect = nullRect;\n if (bias == \"left\") { for (var i = 0; i < rects.length; i++) {\n if ((rect = rects[i]).left != rect.right) { break }\n } } else { for (var i$1 = rects.length - 1; i$1 >= 0; i$1--) {\n if ((rect = rects[i$1]).left != rect.right) { break }\n } }\n return rect\n }\n\n function measureCharInner(cm, prepared, ch, bias) {\n var place = nodeAndOffsetInLineMap(prepared.map, ch, bias);\n var node = place.node, start = place.start, end = place.end, collapse = place.collapse;\n\n var rect;\n if (node.nodeType == 3) { // If it is a text node, use a range to retrieve the coordinates.\n for (var i$1 = 0; i$1 < 4; i$1++) { // Retry a maximum of 4 times when nonsense rectangles are returned\n while (start && isExtendingChar(prepared.line.text.charAt(place.coverStart + start))) { --start; }\n while (place.coverStart + end < place.coverEnd && isExtendingChar(prepared.line.text.charAt(place.coverStart + end))) { ++end; }\n if (ie && ie_version < 9 && start == 0 && end == place.coverEnd - place.coverStart)\n { rect = node.parentNode.getBoundingClientRect(); }\n else\n { rect = getUsefulRect(range(node, start, end).getClientRects(), bias); }\n if (rect.left || rect.right || start == 0) { break }\n end = start;\n start = start - 1;\n collapse = \"right\";\n }\n if (ie && ie_version < 11) { rect = maybeUpdateRectForZooming(cm.display.measure, rect); }\n } else { // If it is a widget, simply get the box for the whole widget.\n if (start > 0) { collapse = bias = \"right\"; }\n var rects;\n if (cm.options.lineWrapping && (rects = node.getClientRects()).length > 1)\n { rect = rects[bias == \"right\" ? rects.length - 1 : 0]; }\n else\n { rect = node.getBoundingClientRect(); }\n }\n if (ie && ie_version < 9 && !start && (!rect || !rect.left && !rect.right)) {\n var rSpan = node.parentNode.getClientRects()[0];\n if (rSpan)\n { rect = {left: rSpan.left, right: rSpan.left + charWidth(cm.display), top: rSpan.top, bottom: rSpan.bottom}; }\n else\n { rect = nullRect; }\n }\n\n var rtop = rect.top - prepared.rect.top, rbot = rect.bottom - prepared.rect.top;\n var mid = (rtop + rbot) / 2;\n var heights = prepared.view.measure.heights;\n var i = 0;\n for (; i < heights.length - 1; i++)\n { if (mid < heights[i]) { break } }\n var top = i ? heights[i - 1] : 0, bot = heights[i];\n var result = {left: (collapse == \"right\" ? rect.right : rect.left) - prepared.rect.left,\n right: (collapse == \"left\" ? rect.left : rect.right) - prepared.rect.left,\n top: top, bottom: bot};\n if (!rect.left && !rect.right) { result.bogus = true; }\n if (!cm.options.singleCursorHeightPerLine) { result.rtop = rtop; result.rbottom = rbot; }\n\n return result\n }\n\n // Work around problem with bounding client rects on ranges being\n // returned incorrectly when zoomed on IE10 and below.\n function maybeUpdateRectForZooming(measure, rect) {\n if (!window.screen || screen.logicalXDPI == null ||\n screen.logicalXDPI == screen.deviceXDPI || !hasBadZoomedRects(measure))\n { return rect }\n var scaleX = screen.logicalXDPI / screen.deviceXDPI;\n var scaleY = screen.logicalYDPI / screen.deviceYDPI;\n return {left: rect.left * scaleX, right: rect.right * scaleX,\n top: rect.top * scaleY, bottom: rect.bottom * scaleY}\n }\n\n function clearLineMeasurementCacheFor(lineView) {\n if (lineView.measure) {\n lineView.measure.cache = {};\n lineView.measure.heights = null;\n if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++)\n { lineView.measure.caches[i] = {}; } }\n }\n }\n\n function clearLineMeasurementCache(cm) {\n cm.display.externalMeasure = null;\n removeChildren(cm.display.lineMeasure);\n for (var i = 0; i < cm.display.view.length; i++)\n { clearLineMeasurementCacheFor(cm.display.view[i]); }\n }\n\n function clearCaches(cm) {\n clearLineMeasurementCache(cm);\n cm.display.cachedCharWidth = cm.display.cachedTextHeight = cm.display.cachedPaddingH = null;\n if (!cm.options.lineWrapping) { cm.display.maxLineChanged = true; }\n cm.display.lineNumChars = null;\n }\n\n function pageScrollX() {\n // Work around https://bugs.chromium.org/p/chromium/issues/detail?id=489206\n // which causes page_Offset and bounding client rects to use\n // different reference viewports and invalidate our calculations.\n if (chrome && android) { return -(document.body.getBoundingClientRect().left - parseInt(getComputedStyle(document.body).marginLeft)) }\n return window.pageXOffset || (document.documentElement || document.body).scrollLeft\n }\n function pageScrollY() {\n if (chrome && android) { return -(document.body.getBoundingClientRect().top - parseInt(getComputedStyle(document.body).marginTop)) }\n return window.pageYOffset || (document.documentElement || document.body).scrollTop\n }\n\n function widgetTopHeight(lineObj) {\n var height = 0;\n if (lineObj.widgets) { for (var i = 0; i < lineObj.widgets.length; ++i) { if (lineObj.widgets[i].above)\n { height += widgetHeight(lineObj.widgets[i]); } } }\n return height\n }\n\n // Converts a {top, bottom, left, right} box from line-local\n // coordinates into another coordinate system. Context may be one of\n // \"line\", \"div\" (display.lineDiv), \"local\"./null (editor), \"window\",\n // or \"page\".\n function intoCoordSystem(cm, lineObj, rect, context, includeWidgets) {\n if (!includeWidgets) {\n var height = widgetTopHeight(lineObj);\n rect.top += height; rect.bottom += height;\n }\n if (context == \"line\") { return rect }\n if (!context) { context = \"local\"; }\n var yOff = heightAtLine(lineObj);\n if (context == \"local\") { yOff += paddingTop(cm.display); }\n else { yOff -= cm.display.viewOffset; }\n if (context == \"page\" || context == \"window\") {\n var lOff = cm.display.lineSpace.getBoundingClientRect();\n yOff += lOff.top + (context == \"window\" ? 0 : pageScrollY());\n var xOff = lOff.left + (context == \"window\" ? 0 : pageScrollX());\n rect.left += xOff; rect.right += xOff;\n }\n rect.top += yOff; rect.bottom += yOff;\n return rect\n }\n\n // Coverts a box from \"div\" coords to another coordinate system.\n // Context may be \"window\", \"page\", \"div\", or \"local\"./null.\n function fromCoordSystem(cm, coords, context) {\n if (context == \"div\") { return coords }\n var left = coords.left, top = coords.top;\n // First move into \"page\" coordinate system\n if (context == \"page\") {\n left -= pageScrollX();\n top -= pageScrollY();\n } else if (context == \"local\" || !context) {\n var localBox = cm.display.sizer.getBoundingClientRect();\n left += localBox.left;\n top += localBox.top;\n }\n\n var lineSpaceBox = cm.display.lineSpace.getBoundingClientRect();\n return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top}\n }\n\n function charCoords(cm, pos, context, lineObj, bias) {\n if (!lineObj) { lineObj = getLine(cm.doc, pos.line); }\n return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, bias), context)\n }\n\n // Returns a box for a given cursor position, which may have an\n // 'other' property containing the position of the secondary cursor\n // on a bidi boundary.\n // A cursor Pos(line, char, \"before\") is on the same visual line as `char - 1`\n // and after `char - 1` in writing order of `char - 1`\n // A cursor Pos(line, char, \"after\") is on the same visual line as `char`\n // and before `char` in writing order of `char`\n // Examples (upper-case letters are RTL, lower-case are LTR):\n // Pos(0, 1, ...)\n // before after\n // ab a|b a|b\n // aB a|B aB|\n // Ab |Ab A|b\n // AB B|A B|A\n // Every position after the last character on a line is considered to stick\n // to the last character on the line.\n function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHeight) {\n lineObj = lineObj || getLine(cm.doc, pos.line);\n if (!preparedMeasure) { preparedMeasure = prepareMeasureForLine(cm, lineObj); }\n function get(ch, right) {\n var m = measureCharPrepared(cm, preparedMeasure, ch, right ? \"right\" : \"left\", varHeight);\n if (right) { m.left = m.right; } else { m.right = m.left; }\n return intoCoordSystem(cm, lineObj, m, context)\n }\n var order = getOrder(lineObj, cm.doc.direction), ch = pos.ch, sticky = pos.sticky;\n if (ch >= lineObj.text.length) {\n ch = lineObj.text.length;\n sticky = \"before\";\n } else if (ch <= 0) {\n ch = 0;\n sticky = \"after\";\n }\n if (!order) { return get(sticky == \"before\" ? ch - 1 : ch, sticky == \"before\") }\n\n function getBidi(ch, partPos, invert) {\n var part = order[partPos], right = part.level == 1;\n return get(invert ? ch - 1 : ch, right != invert)\n }\n var partPos = getBidiPartAt(order, ch, sticky);\n var other = bidiOther;\n var val = getBidi(ch, partPos, sticky == \"before\");\n if (other != null) { val.other = getBidi(ch, other, sticky != \"before\"); }\n return val\n }\n\n // Used to cheaply estimate the coordinates for a position. Used for\n // intermediate scroll updates.\n function estimateCoords(cm, pos) {\n var left = 0;\n pos = clipPos(cm.doc, pos);\n if (!cm.options.lineWrapping) { left = charWidth(cm.display) * pos.ch; }\n var lineObj = getLine(cm.doc, pos.line);\n var top = heightAtLine(lineObj) + paddingTop(cm.display);\n return {left: left, right: left, top: top, bottom: top + lineObj.height}\n }\n\n // Positions returned by coordsChar contain some extra information.\n // xRel is the relative x position of the input coordinates compared\n // to the found position (so xRel > 0 means the coordinates are to\n // the right of the character position, for example). When outside\n // is true, that means the coordinates lie outside the line's\n // vertical range.\n function PosWithInfo(line, ch, sticky, outside, xRel) {\n var pos = Pos(line, ch, sticky);\n pos.xRel = xRel;\n if (outside) { pos.outside = outside; }\n return pos\n }\n\n // Compute the character position closest to the given coordinates.\n // Input must be lineSpace-local (\"div\" coordinate system).\n function coordsChar(cm, x, y) {\n var doc = cm.doc;\n y += cm.display.viewOffset;\n if (y < 0) { return PosWithInfo(doc.first, 0, null, -1, -1) }\n var lineN = lineAtHeight(doc, y), last = doc.first + doc.size - 1;\n if (lineN > last)\n { return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, null, 1, 1) }\n if (x < 0) { x = 0; }\n\n var lineObj = getLine(doc, lineN);\n for (;;) {\n var found = coordsCharInner(cm, lineObj, lineN, x, y);\n var collapsed = collapsedSpanAround(lineObj, found.ch + (found.xRel > 0 || found.outside > 0 ? 1 : 0));\n if (!collapsed) { return found }\n var rangeEnd = collapsed.find(1);\n if (rangeEnd.line == lineN) { return rangeEnd }\n lineObj = getLine(doc, lineN = rangeEnd.line);\n }\n }\n\n function wrappedLineExtent(cm, lineObj, preparedMeasure, y) {\n y -= widgetTopHeight(lineObj);\n var end = lineObj.text.length;\n var begin = findFirst(function (ch) { return measureCharPrepared(cm, preparedMeasure, ch - 1).bottom <= y; }, end, 0);\n end = findFirst(function (ch) { return measureCharPrepared(cm, preparedMeasure, ch).top > y; }, begin, end);\n return {begin: begin, end: end}\n }\n\n function wrappedLineExtentChar(cm, lineObj, preparedMeasure, target) {\n if (!preparedMeasure) { preparedMeasure = prepareMeasureForLine(cm, lineObj); }\n var targetTop = intoCoordSystem(cm, lineObj, measureCharPrepared(cm, preparedMeasure, target), \"line\").top;\n return wrappedLineExtent(cm, lineObj, preparedMeasure, targetTop)\n }\n\n // Returns true if the given side of a box is after the given\n // coordinates, in top-to-bottom, left-to-right order.\n function boxIsAfter(box, x, y, left) {\n return box.bottom <= y ? false : box.top > y ? true : (left ? box.left : box.right) > x\n }\n\n function coordsCharInner(cm, lineObj, lineNo, x, y) {\n // Move y into line-local coordinate space\n y -= heightAtLine(lineObj);\n var preparedMeasure = prepareMeasureForLine(cm, lineObj);\n // When directly calling `measureCharPrepared`, we have to adjust\n // for the widgets at this line.\n var widgetHeight = widgetTopHeight(lineObj);\n var begin = 0, end = lineObj.text.length, ltr = true;\n\n var order = getOrder(lineObj, cm.doc.direction);\n // If the line isn't plain left-to-right text, first figure out\n // which bidi section the coordinates fall into.\n if (order) {\n var part = (cm.options.lineWrapping ? coordsBidiPartWrapped : coordsBidiPart)\n (cm, lineObj, lineNo, preparedMeasure, order, x, y);\n ltr = part.level != 1;\n // The awkward -1 offsets are needed because findFirst (called\n // on these below) will treat its first bound as inclusive,\n // second as exclusive, but we want to actually address the\n // characters in the part's range\n begin = ltr ? part.from : part.to - 1;\n end = ltr ? part.to : part.from - 1;\n }\n\n // A binary search to find the first character whose bounding box\n // starts after the coordinates. If we run across any whose box wrap\n // the coordinates, store that.\n var chAround = null, boxAround = null;\n var ch = findFirst(function (ch) {\n var box = measureCharPrepared(cm, preparedMeasure, ch);\n box.top += widgetHeight; box.bottom += widgetHeight;\n if (!boxIsAfter(box, x, y, false)) { return false }\n if (box.top <= y && box.left <= x) {\n chAround = ch;\n boxAround = box;\n }\n return true\n }, begin, end);\n\n var baseX, sticky, outside = false;\n // If a box around the coordinates was found, use that\n if (boxAround) {\n // Distinguish coordinates nearer to the left or right side of the box\n var atLeft = x - boxAround.left < boxAround.right - x, atStart = atLeft == ltr;\n ch = chAround + (atStart ? 0 : 1);\n sticky = atStart ? \"after\" : \"before\";\n baseX = atLeft ? boxAround.left : boxAround.right;\n } else {\n // (Adjust for extended bound, if necessary.)\n if (!ltr && (ch == end || ch == begin)) { ch++; }\n // To determine which side to associate with, get the box to the\n // left of the character and compare it's vertical position to the\n // coordinates\n sticky = ch == 0 ? \"after\" : ch == lineObj.text.length ? \"before\" :\n (measureCharPrepared(cm, preparedMeasure, ch - (ltr ? 1 : 0)).bottom + widgetHeight <= y) == ltr ?\n \"after\" : \"before\";\n // Now get accurate coordinates for this place, in order to get a\n // base X position\n var coords = cursorCoords(cm, Pos(lineNo, ch, sticky), \"line\", lineObj, preparedMeasure);\n baseX = coords.left;\n outside = y < coords.top ? -1 : y >= coords.bottom ? 1 : 0;\n }\n\n ch = skipExtendingChars(lineObj.text, ch, 1);\n return PosWithInfo(lineNo, ch, sticky, outside, x - baseX)\n }\n\n function coordsBidiPart(cm, lineObj, lineNo, preparedMeasure, order, x, y) {\n // Bidi parts are sorted left-to-right, and in a non-line-wrapping\n // situation, we can take this ordering to correspond to the visual\n // ordering. This finds the first part whose end is after the given\n // coordinates.\n var index = findFirst(function (i) {\n var part = order[i], ltr = part.level != 1;\n return boxIsAfter(cursorCoords(cm, Pos(lineNo, ltr ? part.to : part.from, ltr ? \"before\" : \"after\"),\n \"line\", lineObj, preparedMeasure), x, y, true)\n }, 0, order.length - 1);\n var part = order[index];\n // If this isn't the first part, the part's start is also after\n // the coordinates, and the coordinates aren't on the same line as\n // that start, move one part back.\n if (index > 0) {\n var ltr = part.level != 1;\n var start = cursorCoords(cm, Pos(lineNo, ltr ? part.from : part.to, ltr ? \"after\" : \"before\"),\n \"line\", lineObj, preparedMeasure);\n if (boxIsAfter(start, x, y, true) && start.top > y)\n { part = order[index - 1]; }\n }\n return part\n }\n\n function coordsBidiPartWrapped(cm, lineObj, _lineNo, preparedMeasure, order, x, y) {\n // In a wrapped line, rtl text on wrapping boundaries can do things\n // that don't correspond to the ordering in our `order` array at\n // all, so a binary search doesn't work, and we want to return a\n // part that only spans one line so that the binary search in\n // coordsCharInner is safe. As such, we first find the extent of the\n // wrapped line, and then do a flat search in which we discard any\n // spans that aren't on the line.\n var ref = wrappedLineExtent(cm, lineObj, preparedMeasure, y);\n var begin = ref.begin;\n var end = ref.end;\n if (/\\s/.test(lineObj.text.charAt(end - 1))) { end--; }\n var part = null, closestDist = null;\n for (var i = 0; i < order.length; i++) {\n var p = order[i];\n if (p.from >= end || p.to <= begin) { continue }\n var ltr = p.level != 1;\n var endX = measureCharPrepared(cm, preparedMeasure, ltr ? Math.min(end, p.to) - 1 : Math.max(begin, p.from)).right;\n // Weigh against spans ending before this, so that they are only\n // picked if nothing ends after\n var dist = endX < x ? x - endX + 1e9 : endX - x;\n if (!part || closestDist > dist) {\n part = p;\n closestDist = dist;\n }\n }\n if (!part) { part = order[order.length - 1]; }\n // Clip the part to the wrapped line.\n if (part.from < begin) { part = {from: begin, to: part.to, level: part.level}; }\n if (part.to > end) { part = {from: part.from, to: end, level: part.level}; }\n return part\n }\n\n var measureText;\n // Compute the default text height.\n function textHeight(display) {\n if (display.cachedTextHeight != null) { return display.cachedTextHeight }\n if (measureText == null) {\n measureText = elt(\"pre\", null, \"CodeMirror-line-like\");\n // Measure a bunch of lines, for browsers that compute\n // fractional heights.\n for (var i = 0; i < 49; ++i) {\n measureText.appendChild(document.createTextNode(\"x\"));\n measureText.appendChild(elt(\"br\"));\n }\n measureText.appendChild(document.createTextNode(\"x\"));\n }\n removeChildrenAndAdd(display.measure, measureText);\n var height = measureText.offsetHeight / 50;\n if (height > 3) { display.cachedTextHeight = height; }\n removeChildren(display.measure);\n return height || 1\n }\n\n // Compute the default character width.\n function charWidth(display) {\n if (display.cachedCharWidth != null) { return display.cachedCharWidth }\n var anchor = elt(\"span\", \"xxxxxxxxxx\");\n var pre = elt(\"pre\", [anchor], \"CodeMirror-line-like\");\n removeChildrenAndAdd(display.measure, pre);\n var rect = anchor.getBoundingClientRect(), width = (rect.right - rect.left) / 10;\n if (width > 2) { display.cachedCharWidth = width; }\n return width || 10\n }\n\n // Do a bulk-read of the DOM positions and sizes needed to draw the\n // view, so that we don't interleave reading and writing to the DOM.\n function getDimensions(cm) {\n var d = cm.display, left = {}, width = {};\n var gutterLeft = d.gutters.clientLeft;\n for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) {\n var id = cm.display.gutterSpecs[i].className;\n left[id] = n.offsetLeft + n.clientLeft + gutterLeft;\n width[id] = n.clientWidth;\n }\n return {fixedPos: compensateForHScroll(d),\n gutterTotalWidth: d.gutters.offsetWidth,\n gutterLeft: left,\n gutterWidth: width,\n wrapperWidth: d.wrapper.clientWidth}\n }\n\n // Computes display.scroller.scrollLeft + display.gutters.offsetWidth,\n // but using getBoundingClientRect to get a sub-pixel-accurate\n // result.\n function compensateForHScroll(display) {\n return display.scroller.getBoundingClientRect().left - display.sizer.getBoundingClientRect().left\n }\n\n // Returns a function that estimates the height of a line, to use as\n // first approximation until the line becomes visible (and is thus\n // properly measurable).\n function estimateHeight(cm) {\n var th = textHeight(cm.display), wrapping = cm.options.lineWrapping;\n var perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3);\n return function (line) {\n if (lineIsHidden(cm.doc, line)) { return 0 }\n\n var widgetsHeight = 0;\n if (line.widgets) { for (var i = 0; i < line.widgets.length; i++) {\n if (line.widgets[i].height) { widgetsHeight += line.widgets[i].height; }\n } }\n\n if (wrapping)\n { return widgetsHeight + (Math.ceil(line.text.length / perLine) || 1) * th }\n else\n { return widgetsHeight + th }\n }\n }\n\n function estimateLineHeights(cm) {\n var doc = cm.doc, est = estimateHeight(cm);\n doc.iter(function (line) {\n var estHeight = est(line);\n if (estHeight != line.height) { updateLineHeight(line, estHeight); }\n });\n }\n\n // Given a mouse event, find the corresponding position. If liberal\n // is false, it checks whether a gutter or scrollbar was clicked,\n // and returns null if it was. forRect is used by rectangular\n // selections, and tries to estimate a character position even for\n // coordinates beyond the right of the text.\n function posFromMouse(cm, e, liberal, forRect) {\n var display = cm.display;\n if (!liberal && e_target(e).getAttribute(\"cm-not-content\") == \"true\") { return null }\n\n var x, y, space = display.lineSpace.getBoundingClientRect();\n // Fails unpredictably on IE[67] when mouse is dragged around quickly.\n try { x = e.clientX - space.left; y = e.clientY - space.top; }\n catch (e$1) { return null }\n var coords = coordsChar(cm, x, y), line;\n if (forRect && coords.xRel > 0 && (line = getLine(cm.doc, coords.line).text).length == coords.ch) {\n var colDiff = countColumn(line, line.length, cm.options.tabSize) - line.length;\n coords = Pos(coords.line, Math.max(0, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff));\n }\n return coords\n }\n\n // Find the view element corresponding to a given line. Return null\n // when the line isn't visible.\n function findViewIndex(cm, n) {\n if (n >= cm.display.viewTo) { return null }\n n -= cm.display.viewFrom;\n if (n < 0) { return null }\n var view = cm.display.view;\n for (var i = 0; i < view.length; i++) {\n n -= view[i].size;\n if (n < 0) { return i }\n }\n }\n\n // Updates the display.view data structure for a given change to the\n // document. From and to are in pre-change coordinates. Lendiff is\n // the amount of lines added or subtracted by the change. This is\n // used for changes that span multiple lines, or change the way\n // lines are divided into visual lines. regLineChange (below)\n // registers single-line changes.\n function regChange(cm, from, to, lendiff) {\n if (from == null) { from = cm.doc.first; }\n if (to == null) { to = cm.doc.first + cm.doc.size; }\n if (!lendiff) { lendiff = 0; }\n\n var display = cm.display;\n if (lendiff && to < display.viewTo &&\n (display.updateLineNumbers == null || display.updateLineNumbers > from))\n { display.updateLineNumbers = from; }\n\n cm.curOp.viewChanged = true;\n\n if (from >= display.viewTo) { // Change after\n if (sawCollapsedSpans && visualLineNo(cm.doc, from) < display.viewTo)\n { resetView(cm); }\n } else if (to <= display.viewFrom) { // Change before\n if (sawCollapsedSpans && visualLineEndNo(cm.doc, to + lendiff) > display.viewFrom) {\n resetView(cm);\n } else {\n display.viewFrom += lendiff;\n display.viewTo += lendiff;\n }\n } else if (from <= display.viewFrom && to >= display.viewTo) { // Full overlap\n resetView(cm);\n } else if (from <= display.viewFrom) { // Top overlap\n var cut = viewCuttingPoint(cm, to, to + lendiff, 1);\n if (cut) {\n display.view = display.view.slice(cut.index);\n display.viewFrom = cut.lineN;\n display.viewTo += lendiff;\n } else {\n resetView(cm);\n }\n } else if (to >= display.viewTo) { // Bottom overlap\n var cut$1 = viewCuttingPoint(cm, from, from, -1);\n if (cut$1) {\n display.view = display.view.slice(0, cut$1.index);\n display.viewTo = cut$1.lineN;\n } else {\n resetView(cm);\n }\n } else { // Gap in the middle\n var cutTop = viewCuttingPoint(cm, from, from, -1);\n var cutBot = viewCuttingPoint(cm, to, to + lendiff, 1);\n if (cutTop && cutBot) {\n display.view = display.view.slice(0, cutTop.index)\n .concat(buildViewArray(cm, cutTop.lineN, cutBot.lineN))\n .concat(display.view.slice(cutBot.index));\n display.viewTo += lendiff;\n } else {\n resetView(cm);\n }\n }\n\n var ext = display.externalMeasured;\n if (ext) {\n if (to < ext.lineN)\n { ext.lineN += lendiff; }\n else if (from < ext.lineN + ext.size)\n { display.externalMeasured = null; }\n }\n }\n\n // Register a change to a single line. Type must be one of \"text\",\n // \"gutter\", \"class\", \"widget\"\n function regLineChange(cm, line, type) {\n cm.curOp.viewChanged = true;\n var display = cm.display, ext = cm.display.externalMeasured;\n if (ext && line >= ext.lineN && line < ext.lineN + ext.size)\n { display.externalMeasured = null; }\n\n if (line < display.viewFrom || line >= display.viewTo) { return }\n var lineView = display.view[findViewIndex(cm, line)];\n if (lineView.node == null) { return }\n var arr = lineView.changes || (lineView.changes = []);\n if (indexOf(arr, type) == -1) { arr.push(type); }\n }\n\n // Clear the view.\n function resetView(cm) {\n cm.display.viewFrom = cm.display.viewTo = cm.doc.first;\n cm.display.view = [];\n cm.display.viewOffset = 0;\n }\n\n function viewCuttingPoint(cm, oldN, newN, dir) {\n var index = findViewIndex(cm, oldN), diff, view = cm.display.view;\n if (!sawCollapsedSpans || newN == cm.doc.first + cm.doc.size)\n { return {index: index, lineN: newN} }\n var n = cm.display.viewFrom;\n for (var i = 0; i < index; i++)\n { n += view[i].size; }\n if (n != oldN) {\n if (dir > 0) {\n if (index == view.length - 1) { return null }\n diff = (n + view[index].size) - oldN;\n index++;\n } else {\n diff = n - oldN;\n }\n oldN += diff; newN += diff;\n }\n while (visualLineNo(cm.doc, newN) != newN) {\n if (index == (dir < 0 ? 0 : view.length - 1)) { return null }\n newN += dir * view[index - (dir < 0 ? 1 : 0)].size;\n index += dir;\n }\n return {index: index, lineN: newN}\n }\n\n // Force the view to cover a given range, adding empty view element\n // or clipping off existing ones as needed.\n function adjustView(cm, from, to) {\n var display = cm.display, view = display.view;\n if (view.length == 0 || from >= display.viewTo || to <= display.viewFrom) {\n display.view = buildViewArray(cm, from, to);\n display.viewFrom = from;\n } else {\n if (display.viewFrom > from)\n { display.view = buildViewArray(cm, from, display.viewFrom).concat(display.view); }\n else if (display.viewFrom < from)\n { display.view = display.view.slice(findViewIndex(cm, from)); }\n display.viewFrom = from;\n if (display.viewTo < to)\n { display.view = display.view.concat(buildViewArray(cm, display.viewTo, to)); }\n else if (display.viewTo > to)\n { display.view = display.view.slice(0, findViewIndex(cm, to)); }\n }\n display.viewTo = to;\n }\n\n // Count the number of lines in the view whose DOM representation is\n // out of date (or nonexistent).\n function countDirtyView(cm) {\n var view = cm.display.view, dirty = 0;\n for (var i = 0; i < view.length; i++) {\n var lineView = view[i];\n if (!lineView.hidden && (!lineView.node || lineView.changes)) { ++dirty; }\n }\n return dirty\n }\n\n function updateSelection(cm) {\n cm.display.input.showSelection(cm.display.input.prepareSelection());\n }\n\n function prepareSelection(cm, primary) {\n if ( primary === void 0 ) primary = true;\n\n var doc = cm.doc, result = {};\n var curFragment = result.cursors = document.createDocumentFragment();\n var selFragment = result.selection = document.createDocumentFragment();\n\n for (var i = 0; i < doc.sel.ranges.length; i++) {\n if (!primary && i == doc.sel.primIndex) { continue }\n var range = doc.sel.ranges[i];\n if (range.from().line >= cm.display.viewTo || range.to().line < cm.display.viewFrom) { continue }\n var collapsed = range.empty();\n if (collapsed || cm.options.showCursorWhenSelecting)\n { drawSelectionCursor(cm, range.head, curFragment); }\n if (!collapsed)\n { drawSelectionRange(cm, range, selFragment); }\n }\n return result\n }\n\n // Draws a cursor for the given range\n function drawSelectionCursor(cm, head, output) {\n var pos = cursorCoords(cm, head, \"div\", null, null, !cm.options.singleCursorHeightPerLine);\n\n var cursor = output.appendChild(elt(\"div\", \"\\u00a0\", \"CodeMirror-cursor\"));\n cursor.style.left = pos.left + \"px\";\n cursor.style.top = pos.top + \"px\";\n cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + \"px\";\n\n if (pos.other) {\n // Secondary cursor, shown when on a 'jump' in bi-directional text\n var otherCursor = output.appendChild(elt(\"div\", \"\\u00a0\", \"CodeMirror-cursor CodeMirror-secondarycursor\"));\n otherCursor.style.display = \"\";\n otherCursor.style.left = pos.other.left + \"px\";\n otherCursor.style.top = pos.other.top + \"px\";\n otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + \"px\";\n }\n }\n\n function cmpCoords(a, b) { return a.top - b.top || a.left - b.left }\n\n // Draws the given range as a highlighted selection\n function drawSelectionRange(cm, range, output) {\n var display = cm.display, doc = cm.doc;\n var fragment = document.createDocumentFragment();\n var padding = paddingH(cm.display), leftSide = padding.left;\n var rightSide = Math.max(display.sizerWidth, displayWidth(cm) - display.sizer.offsetLeft) - padding.right;\n var docLTR = doc.direction == \"ltr\";\n\n function add(left, top, width, bottom) {\n if (top < 0) { top = 0; }\n top = Math.round(top);\n bottom = Math.round(bottom);\n fragment.appendChild(elt(\"div\", null, \"CodeMirror-selected\", (\"position: absolute; left: \" + left + \"px;\\n top: \" + top + \"px; width: \" + (width == null ? rightSide - left : width) + \"px;\\n height: \" + (bottom - top) + \"px\")));\n }\n\n function drawForLine(line, fromArg, toArg) {\n var lineObj = getLine(doc, line);\n var lineLen = lineObj.text.length;\n var start, end;\n function coords(ch, bias) {\n return charCoords(cm, Pos(line, ch), \"div\", lineObj, bias)\n }\n\n function wrapX(pos, dir, side) {\n var extent = wrappedLineExtentChar(cm, lineObj, null, pos);\n var prop = (dir == \"ltr\") == (side == \"after\") ? \"left\" : \"right\";\n var ch = side == \"after\" ? extent.begin : extent.end - (/\\s/.test(lineObj.text.charAt(extent.end - 1)) ? 2 : 1);\n return coords(ch, prop)[prop]\n }\n\n var order = getOrder(lineObj, doc.direction);\n iterateBidiSections(order, fromArg || 0, toArg == null ? lineLen : toArg, function (from, to, dir, i) {\n var ltr = dir == \"ltr\";\n var fromPos = coords(from, ltr ? \"left\" : \"right\");\n var toPos = coords(to - 1, ltr ? \"right\" : \"left\");\n\n var openStart = fromArg == null && from == 0, openEnd = toArg == null && to == lineLen;\n var first = i == 0, last = !order || i == order.length - 1;\n if (toPos.top - fromPos.top <= 3) { // Single line\n var openLeft = (docLTR ? openStart : openEnd) && first;\n var openRight = (docLTR ? openEnd : openStart) && last;\n var left = openLeft ? leftSide : (ltr ? fromPos : toPos).left;\n var right = openRight ? rightSide : (ltr ? toPos : fromPos).right;\n add(left, fromPos.top, right - left, fromPos.bottom);\n } else { // Multiple lines\n var topLeft, topRight, botLeft, botRight;\n if (ltr) {\n topLeft = docLTR && openStart && first ? leftSide : fromPos.left;\n topRight = docLTR ? rightSide : wrapX(from, dir, \"before\");\n botLeft = docLTR ? leftSide : wrapX(to, dir, \"after\");\n botRight = docLTR && openEnd && last ? rightSide : toPos.right;\n } else {\n topLeft = !docLTR ? leftSide : wrapX(from, dir, \"before\");\n topRight = !docLTR && openStart && first ? rightSide : fromPos.right;\n botLeft = !docLTR && openEnd && last ? leftSide : toPos.left;\n botRight = !docLTR ? rightSide : wrapX(to, dir, \"after\");\n }\n add(topLeft, fromPos.top, topRight - topLeft, fromPos.bottom);\n if (fromPos.bottom < toPos.top) { add(leftSide, fromPos.bottom, null, toPos.top); }\n add(botLeft, toPos.top, botRight - botLeft, toPos.bottom);\n }\n\n if (!start || cmpCoords(fromPos, start) < 0) { start = fromPos; }\n if (cmpCoords(toPos, start) < 0) { start = toPos; }\n if (!end || cmpCoords(fromPos, end) < 0) { end = fromPos; }\n if (cmpCoords(toPos, end) < 0) { end = toPos; }\n });\n return {start: start, end: end}\n }\n\n var sFrom = range.from(), sTo = range.to();\n if (sFrom.line == sTo.line) {\n drawForLine(sFrom.line, sFrom.ch, sTo.ch);\n } else {\n var fromLine = getLine(doc, sFrom.line), toLine = getLine(doc, sTo.line);\n var singleVLine = visualLine(fromLine) == visualLine(toLine);\n var leftEnd = drawForLine(sFrom.line, sFrom.ch, singleVLine ? fromLine.text.length + 1 : null).end;\n var rightStart = drawForLine(sTo.line, singleVLine ? 0 : null, sTo.ch).start;\n if (singleVLine) {\n if (leftEnd.top < rightStart.top - 2) {\n add(leftEnd.right, leftEnd.top, null, leftEnd.bottom);\n add(leftSide, rightStart.top, rightStart.left, rightStart.bottom);\n } else {\n add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom);\n }\n }\n if (leftEnd.bottom < rightStart.top)\n { add(leftSide, leftEnd.bottom, null, rightStart.top); }\n }\n\n output.appendChild(fragment);\n }\n\n // Cursor-blinking\n function restartBlink(cm) {\n if (!cm.state.focused) { return }\n var display = cm.display;\n clearInterval(display.blinker);\n var on = true;\n display.cursorDiv.style.visibility = \"\";\n if (cm.options.cursorBlinkRate > 0)\n { display.blinker = setInterval(function () {\n if (!cm.hasFocus()) { onBlur(cm); }\n display.cursorDiv.style.visibility = (on = !on) ? \"\" : \"hidden\";\n }, cm.options.cursorBlinkRate); }\n else if (cm.options.cursorBlinkRate < 0)\n { display.cursorDiv.style.visibility = \"hidden\"; }\n }\n\n function ensureFocus(cm) {\n if (!cm.hasFocus()) {\n cm.display.input.focus();\n if (!cm.state.focused) { onFocus(cm); }\n }\n }\n\n function delayBlurEvent(cm) {\n cm.state.delayingBlurEvent = true;\n setTimeout(function () { if (cm.state.delayingBlurEvent) {\n cm.state.delayingBlurEvent = false;\n if (cm.state.focused) { onBlur(cm); }\n } }, 100);\n }\n\n function onFocus(cm, e) {\n if (cm.state.delayingBlurEvent && !cm.state.draggingText) { cm.state.delayingBlurEvent = false; }\n\n if (cm.options.readOnly == \"nocursor\") { return }\n if (!cm.state.focused) {\n signal(cm, \"focus\", cm, e);\n cm.state.focused = true;\n addClass(cm.display.wrapper, \"CodeMirror-focused\");\n // This test prevents this from firing when a context\n // menu is closed (since the input reset would kill the\n // select-all detection hack)\n if (!cm.curOp && cm.display.selForContextMenu != cm.doc.sel) {\n cm.display.input.reset();\n if (webkit) { setTimeout(function () { return cm.display.input.reset(true); }, 20); } // Issue #1730\n }\n cm.display.input.receivedFocus();\n }\n restartBlink(cm);\n }\n function onBlur(cm, e) {\n if (cm.state.delayingBlurEvent) { return }\n\n if (cm.state.focused) {\n signal(cm, \"blur\", cm, e);\n cm.state.focused = false;\n rmClass(cm.display.wrapper, \"CodeMirror-focused\");\n }\n clearInterval(cm.display.blinker);\n setTimeout(function () { if (!cm.state.focused) { cm.display.shift = false; } }, 150);\n }\n\n // Read the actual heights of the rendered lines, and update their\n // stored heights to match.\n function updateHeightsInViewport(cm) {\n var display = cm.display;\n var prevBottom = display.lineDiv.offsetTop;\n for (var i = 0; i < display.view.length; i++) {\n var cur = display.view[i], wrapping = cm.options.lineWrapping;\n var height = (void 0), width = 0;\n if (cur.hidden) { continue }\n if (ie && ie_version < 8) {\n var bot = cur.node.offsetTop + cur.node.offsetHeight;\n height = bot - prevBottom;\n prevBottom = bot;\n } else {\n var box = cur.node.getBoundingClientRect();\n height = box.bottom - box.top;\n // Check that lines don't extend past the right of the current\n // editor width\n if (!wrapping && cur.text.firstChild)\n { width = cur.text.firstChild.getBoundingClientRect().right - box.left - 1; }\n }\n var diff = cur.line.height - height;\n if (diff > .005 || diff < -.005) {\n updateLineHeight(cur.line, height);\n updateWidgetHeight(cur.line);\n if (cur.rest) { for (var j = 0; j < cur.rest.length; j++)\n { updateWidgetHeight(cur.rest[j]); } }\n }\n if (width > cm.display.sizerWidth) {\n var chWidth = Math.ceil(width / charWidth(cm.display));\n if (chWidth > cm.display.maxLineLength) {\n cm.display.maxLineLength = chWidth;\n cm.display.maxLine = cur.line;\n cm.display.maxLineChanged = true;\n }\n }\n }\n }\n\n // Read and store the height of line widgets associated with the\n // given line.\n function updateWidgetHeight(line) {\n if (line.widgets) { for (var i = 0; i < line.widgets.length; ++i) {\n var w = line.widgets[i], parent = w.node.parentNode;\n if (parent) { w.height = parent.offsetHeight; }\n } }\n }\n\n // Compute the lines that are visible in a given viewport (defaults\n // the the current scroll position). viewport may contain top,\n // height, and ensure (see op.scrollToPos) properties.\n function visibleLines(display, doc, viewport) {\n var top = viewport && viewport.top != null ? Math.max(0, viewport.top) : display.scroller.scrollTop;\n top = Math.floor(top - paddingTop(display));\n var bottom = viewport && viewport.bottom != null ? viewport.bottom : top + display.wrapper.clientHeight;\n\n var from = lineAtHeight(doc, top), to = lineAtHeight(doc, bottom);\n // Ensure is a {from: {line, ch}, to: {line, ch}} object, and\n // forces those lines into the viewport (if possible).\n if (viewport && viewport.ensure) {\n var ensureFrom = viewport.ensure.from.line, ensureTo = viewport.ensure.to.line;\n if (ensureFrom < from) {\n from = ensureFrom;\n to = lineAtHeight(doc, heightAtLine(getLine(doc, ensureFrom)) + display.wrapper.clientHeight);\n } else if (Math.min(ensureTo, doc.lastLine()) >= to) {\n from = lineAtHeight(doc, heightAtLine(getLine(doc, ensureTo)) - display.wrapper.clientHeight);\n to = ensureTo;\n }\n }\n return {from: from, to: Math.max(to, from + 1)}\n }\n\n // SCROLLING THINGS INTO VIEW\n\n // If an editor sits on the top or bottom of the window, partially\n // scrolled out of view, this ensures that the cursor is visible.\n function maybeScrollWindow(cm, rect) {\n if (signalDOMEvent(cm, \"scrollCursorIntoView\")) { return }\n\n var display = cm.display, box = display.sizer.getBoundingClientRect(), doScroll = null;\n if (rect.top + box.top < 0) { doScroll = true; }\n else if (rect.bottom + box.top > (window.innerHeight || document.documentElement.clientHeight)) { doScroll = false; }\n if (doScroll != null && !phantom) {\n var scrollNode = elt(\"div\", \"\\u200b\", null, (\"position: absolute;\\n top: \" + (rect.top - display.viewOffset - paddingTop(cm.display)) + \"px;\\n height: \" + (rect.bottom - rect.top + scrollGap(cm) + display.barHeight) + \"px;\\n left: \" + (rect.left) + \"px; width: \" + (Math.max(2, rect.right - rect.left)) + \"px;\"));\n cm.display.lineSpace.appendChild(scrollNode);\n scrollNode.scrollIntoView(doScroll);\n cm.display.lineSpace.removeChild(scrollNode);\n }\n }\n\n // Scroll a given position into view (immediately), verifying that\n // it actually became visible (as line heights are accurately\n // measured, the position of something may 'drift' during drawing).\n function scrollPosIntoView(cm, pos, end, margin) {\n if (margin == null) { margin = 0; }\n var rect;\n if (!cm.options.lineWrapping && pos == end) {\n // Set pos and end to the cursor positions around the character pos sticks to\n // If pos.sticky == \"before\", that is around pos.ch - 1, otherwise around pos.ch\n // If pos == Pos(_, 0, \"before\"), pos and end are unchanged\n pos = pos.ch ? Pos(pos.line, pos.sticky == \"before\" ? pos.ch - 1 : pos.ch, \"after\") : pos;\n end = pos.sticky == \"before\" ? Pos(pos.line, pos.ch + 1, \"before\") : pos;\n }\n for (var limit = 0; limit < 5; limit++) {\n var changed = false;\n var coords = cursorCoords(cm, pos);\n var endCoords = !end || end == pos ? coords : cursorCoords(cm, end);\n rect = {left: Math.min(coords.left, endCoords.left),\n top: Math.min(coords.top, endCoords.top) - margin,\n right: Math.max(coords.left, endCoords.left),\n bottom: Math.max(coords.bottom, endCoords.bottom) + margin};\n var scrollPos = calculateScrollPos(cm, rect);\n var startTop = cm.doc.scrollTop, startLeft = cm.doc.scrollLeft;\n if (scrollPos.scrollTop != null) {\n updateScrollTop(cm, scrollPos.scrollTop);\n if (Math.abs(cm.doc.scrollTop - startTop) > 1) { changed = true; }\n }\n if (scrollPos.scrollLeft != null) {\n setScrollLeft(cm, scrollPos.scrollLeft);\n if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) { changed = true; }\n }\n if (!changed) { break }\n }\n return rect\n }\n\n // Scroll a given set of coordinates into view (immediately).\n function scrollIntoView(cm, rect) {\n var scrollPos = calculateScrollPos(cm, rect);\n if (scrollPos.scrollTop != null) { updateScrollTop(cm, scrollPos.scrollTop); }\n if (scrollPos.scrollLeft != null) { setScrollLeft(cm, scrollPos.scrollLeft); }\n }\n\n // Calculate a new scroll position needed to scroll the given\n // rectangle into view. Returns an object with scrollTop and\n // scrollLeft properties. When these are undefined, the\n // vertical/horizontal position does not need to be adjusted.\n function calculateScrollPos(cm, rect) {\n var display = cm.display, snapMargin = textHeight(cm.display);\n if (rect.top < 0) { rect.top = 0; }\n var screentop = cm.curOp && cm.curOp.scrollTop != null ? cm.curOp.scrollTop : display.scroller.scrollTop;\n var screen = displayHeight(cm), result = {};\n if (rect.bottom - rect.top > screen) { rect.bottom = rect.top + screen; }\n var docBottom = cm.doc.height + paddingVert(display);\n var atTop = rect.top < snapMargin, atBottom = rect.bottom > docBottom - snapMargin;\n if (rect.top < screentop) {\n result.scrollTop = atTop ? 0 : rect.top;\n } else if (rect.bottom > screentop + screen) {\n var newTop = Math.min(rect.top, (atBottom ? docBottom : rect.bottom) - screen);\n if (newTop != screentop) { result.scrollTop = newTop; }\n }\n\n var gutterSpace = cm.options.fixedGutter ? 0 : display.gutters.offsetWidth;\n var screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft - gutterSpace;\n var screenw = displayWidth(cm) - display.gutters.offsetWidth;\n var tooWide = rect.right - rect.left > screenw;\n if (tooWide) { rect.right = rect.left + screenw; }\n if (rect.left < 10)\n { result.scrollLeft = 0; }\n else if (rect.left < screenleft)\n { result.scrollLeft = Math.max(0, rect.left + gutterSpace - (tooWide ? 0 : 10)); }\n else if (rect.right > screenw + screenleft - 3)\n { result.scrollLeft = rect.right + (tooWide ? 0 : 10) - screenw; }\n return result\n }\n\n // Store a relative adjustment to the scroll position in the current\n // operation (to be applied when the operation finishes).\n function addToScrollTop(cm, top) {\n if (top == null) { return }\n resolveScrollToPos(cm);\n cm.curOp.scrollTop = (cm.curOp.scrollTop == null ? cm.doc.scrollTop : cm.curOp.scrollTop) + top;\n }\n\n // Make sure that at the end of the operation the current cursor is\n // shown.\n function ensureCursorVisible(cm) {\n resolveScrollToPos(cm);\n var cur = cm.getCursor();\n cm.curOp.scrollToPos = {from: cur, to: cur, margin: cm.options.cursorScrollMargin};\n }\n\n function scrollToCoords(cm, x, y) {\n if (x != null || y != null) { resolveScrollToPos(cm); }\n if (x != null) { cm.curOp.scrollLeft = x; }\n if (y != null) { cm.curOp.scrollTop = y; }\n }\n\n function scrollToRange(cm, range) {\n resolveScrollToPos(cm);\n cm.curOp.scrollToPos = range;\n }\n\n // When an operation has its scrollToPos property set, and another\n // scroll action is applied before the end of the operation, this\n // 'simulates' scrolling that position into view in a cheap way, so\n // that the effect of intermediate scroll commands is not ignored.\n function resolveScrollToPos(cm) {\n var range = cm.curOp.scrollToPos;\n if (range) {\n cm.curOp.scrollToPos = null;\n var from = estimateCoords(cm, range.from), to = estimateCoords(cm, range.to);\n scrollToCoordsRange(cm, from, to, range.margin);\n }\n }\n\n function scrollToCoordsRange(cm, from, to, margin) {\n var sPos = calculateScrollPos(cm, {\n left: Math.min(from.left, to.left),\n top: Math.min(from.top, to.top) - margin,\n right: Math.max(from.right, to.right),\n bottom: Math.max(from.bottom, to.bottom) + margin\n });\n scrollToCoords(cm, sPos.scrollLeft, sPos.scrollTop);\n }\n\n // Sync the scrollable area and scrollbars, ensure the viewport\n // covers the visible area.\n function updateScrollTop(cm, val) {\n if (Math.abs(cm.doc.scrollTop - val) < 2) { return }\n if (!gecko) { updateDisplaySimple(cm, {top: val}); }\n setScrollTop(cm, val, true);\n if (gecko) { updateDisplaySimple(cm); }\n startWorker(cm, 100);\n }\n\n function setScrollTop(cm, val, forceScroll) {\n val = Math.max(0, Math.min(cm.display.scroller.scrollHeight - cm.display.scroller.clientHeight, val));\n if (cm.display.scroller.scrollTop == val && !forceScroll) { return }\n cm.doc.scrollTop = val;\n cm.display.scrollbars.setScrollTop(val);\n if (cm.display.scroller.scrollTop != val) { cm.display.scroller.scrollTop = val; }\n }\n\n // Sync scroller and scrollbar, ensure the gutter elements are\n // aligned.\n function setScrollLeft(cm, val, isScroller, forceScroll) {\n val = Math.max(0, Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth));\n if ((isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) && !forceScroll) { return }\n cm.doc.scrollLeft = val;\n alignHorizontally(cm);\n if (cm.display.scroller.scrollLeft != val) { cm.display.scroller.scrollLeft = val; }\n cm.display.scrollbars.setScrollLeft(val);\n }\n\n // SCROLLBARS\n\n // Prepare DOM reads needed to update the scrollbars. Done in one\n // shot to minimize update/measure roundtrips.\n function measureForScrollbars(cm) {\n var d = cm.display, gutterW = d.gutters.offsetWidth;\n var docH = Math.round(cm.doc.height + paddingVert(cm.display));\n return {\n clientHeight: d.scroller.clientHeight,\n viewHeight: d.wrapper.clientHeight,\n scrollWidth: d.scroller.scrollWidth, clientWidth: d.scroller.clientWidth,\n viewWidth: d.wrapper.clientWidth,\n barLeft: cm.options.fixedGutter ? gutterW : 0,\n docHeight: docH,\n scrollHeight: docH + scrollGap(cm) + d.barHeight,\n nativeBarWidth: d.nativeBarWidth,\n gutterWidth: gutterW\n }\n }\n\n var NativeScrollbars = function(place, scroll, cm) {\n this.cm = cm;\n var vert = this.vert = elt(\"div\", [elt(\"div\", null, null, \"min-width: 1px\")], \"CodeMirror-vscrollbar\");\n var horiz = this.horiz = elt(\"div\", [elt(\"div\", null, null, \"height: 100%; min-height: 1px\")], \"CodeMirror-hscrollbar\");\n vert.tabIndex = horiz.tabIndex = -1;\n place(vert); place(horiz);\n\n on(vert, \"scroll\", function () {\n if (vert.clientHeight) { scroll(vert.scrollTop, \"vertical\"); }\n });\n on(horiz, \"scroll\", function () {\n if (horiz.clientWidth) { scroll(horiz.scrollLeft, \"horizontal\"); }\n });\n\n this.checkedZeroWidth = false;\n // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8).\n if (ie && ie_version < 8) { this.horiz.style.minHeight = this.vert.style.minWidth = \"18px\"; }\n };\n\n NativeScrollbars.prototype.update = function (measure) {\n var needsH = measure.scrollWidth > measure.clientWidth + 1;\n var needsV = measure.scrollHeight > measure.clientHeight + 1;\n var sWidth = measure.nativeBarWidth;\n\n if (needsV) {\n this.vert.style.display = \"block\";\n this.vert.style.bottom = needsH ? sWidth + \"px\" : \"0\";\n var totalHeight = measure.viewHeight - (needsH ? sWidth : 0);\n // A bug in IE8 can cause this value to be negative, so guard it.\n this.vert.firstChild.style.height =\n Math.max(0, measure.scrollHeight - measure.clientHeight + totalHeight) + \"px\";\n } else {\n this.vert.style.display = \"\";\n this.vert.firstChild.style.height = \"0\";\n }\n\n if (needsH) {\n this.horiz.style.display = \"block\";\n this.horiz.style.right = needsV ? sWidth + \"px\" : \"0\";\n this.horiz.style.left = measure.barLeft + \"px\";\n var totalWidth = measure.viewWidth - measure.barLeft - (needsV ? sWidth : 0);\n this.horiz.firstChild.style.width =\n Math.max(0, measure.scrollWidth - measure.clientWidth + totalWidth) + \"px\";\n } else {\n this.horiz.style.display = \"\";\n this.horiz.firstChild.style.width = \"0\";\n }\n\n if (!this.checkedZeroWidth && measure.clientHeight > 0) {\n if (sWidth == 0) { this.zeroWidthHack(); }\n this.checkedZeroWidth = true;\n }\n\n return {right: needsV ? sWidth : 0, bottom: needsH ? sWidth : 0}\n };\n\n NativeScrollbars.prototype.setScrollLeft = function (pos) {\n if (this.horiz.scrollLeft != pos) { this.horiz.scrollLeft = pos; }\n if (this.disableHoriz) { this.enableZeroWidthBar(this.horiz, this.disableHoriz, \"horiz\"); }\n };\n\n NativeScrollbars.prototype.setScrollTop = function (pos) {\n if (this.vert.scrollTop != pos) { this.vert.scrollTop = pos; }\n if (this.disableVert) { this.enableZeroWidthBar(this.vert, this.disableVert, \"vert\"); }\n };\n\n NativeScrollbars.prototype.zeroWidthHack = function () {\n var w = mac && !mac_geMountainLion ? \"12px\" : \"18px\";\n this.horiz.style.height = this.vert.style.width = w;\n this.horiz.style.pointerEvents = this.vert.style.pointerEvents = \"none\";\n this.disableHoriz = new Delayed;\n this.disableVert = new Delayed;\n };\n\n NativeScrollbars.prototype.enableZeroWidthBar = function (bar, delay, type) {\n bar.style.pointerEvents = \"auto\";\n function maybeDisable() {\n // To find out whether the scrollbar is still visible, we\n // check whether the element under the pixel in the bottom\n // right corner of the scrollbar box is the scrollbar box\n // itself (when the bar is still visible) or its filler child\n // (when the bar is hidden). If it is still visible, we keep\n // it enabled, if it's hidden, we disable pointer events.\n var box = bar.getBoundingClientRect();\n var elt = type == \"vert\" ? document.elementFromPoint(box.right - 1, (box.top + box.bottom) / 2)\n : document.elementFromPoint((box.right + box.left) / 2, box.bottom - 1);\n if (elt != bar) { bar.style.pointerEvents = \"none\"; }\n else { delay.set(1000, maybeDisable); }\n }\n delay.set(1000, maybeDisable);\n };\n\n NativeScrollbars.prototype.clear = function () {\n var parent = this.horiz.parentNode;\n parent.removeChild(this.horiz);\n parent.removeChild(this.vert);\n };\n\n var NullScrollbars = function () {};\n\n NullScrollbars.prototype.update = function () { return {bottom: 0, right: 0} };\n NullScrollbars.prototype.setScrollLeft = function () {};\n NullScrollbars.prototype.setScrollTop = function () {};\n NullScrollbars.prototype.clear = function () {};\n\n function updateScrollbars(cm, measure) {\n if (!measure) { measure = measureForScrollbars(cm); }\n var startWidth = cm.display.barWidth, startHeight = cm.display.barHeight;\n updateScrollbarsInner(cm, measure);\n for (var i = 0; i < 4 && startWidth != cm.display.barWidth || startHeight != cm.display.barHeight; i++) {\n if (startWidth != cm.display.barWidth && cm.options.lineWrapping)\n { updateHeightsInViewport(cm); }\n updateScrollbarsInner(cm, measureForScrollbars(cm));\n startWidth = cm.display.barWidth; startHeight = cm.display.barHeight;\n }\n }\n\n // Re-synchronize the fake scrollbars with the actual size of the\n // content.\n function updateScrollbarsInner(cm, measure) {\n var d = cm.display;\n var sizes = d.scrollbars.update(measure);\n\n d.sizer.style.paddingRight = (d.barWidth = sizes.right) + \"px\";\n d.sizer.style.paddingBottom = (d.barHeight = sizes.bottom) + \"px\";\n d.heightForcer.style.borderBottom = sizes.bottom + \"px solid transparent\";\n\n if (sizes.right && sizes.bottom) {\n d.scrollbarFiller.style.display = \"block\";\n d.scrollbarFiller.style.height = sizes.bottom + \"px\";\n d.scrollbarFiller.style.width = sizes.right + \"px\";\n } else { d.scrollbarFiller.style.display = \"\"; }\n if (sizes.bottom && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) {\n d.gutterFiller.style.display = \"block\";\n d.gutterFiller.style.height = sizes.bottom + \"px\";\n d.gutterFiller.style.width = measure.gutterWidth + \"px\";\n } else { d.gutterFiller.style.display = \"\"; }\n }\n\n var scrollbarModel = {\"native\": NativeScrollbars, \"null\": NullScrollbars};\n\n function initScrollbars(cm) {\n if (cm.display.scrollbars) {\n cm.display.scrollbars.clear();\n if (cm.display.scrollbars.addClass)\n { rmClass(cm.display.wrapper, cm.display.scrollbars.addClass); }\n }\n\n cm.display.scrollbars = new scrollbarModel[cm.options.scrollbarStyle](function (node) {\n cm.display.wrapper.insertBefore(node, cm.display.scrollbarFiller);\n // Prevent clicks in the scrollbars from killing focus\n on(node, \"mousedown\", function () {\n if (cm.state.focused) { setTimeout(function () { return cm.display.input.focus(); }, 0); }\n });\n node.setAttribute(\"cm-not-content\", \"true\");\n }, function (pos, axis) {\n if (axis == \"horizontal\") { setScrollLeft(cm, pos); }\n else { updateScrollTop(cm, pos); }\n }, cm);\n if (cm.display.scrollbars.addClass)\n { addClass(cm.display.wrapper, cm.display.scrollbars.addClass); }\n }\n\n // Operations are used to wrap a series of changes to the editor\n // state in such a way that each change won't have to update the\n // cursor and display (which would be awkward, slow, and\n // error-prone). Instead, display updates are batched and then all\n // combined and executed at once.\n\n var nextOpId = 0;\n // Start a new operation.\n function startOperation(cm) {\n cm.curOp = {\n cm: cm,\n viewChanged: false, // Flag that indicates that lines might need to be redrawn\n startHeight: cm.doc.height, // Used to detect need to update scrollbar\n forceUpdate: false, // Used to force a redraw\n updateInput: 0, // Whether to reset the input textarea\n typing: false, // Whether this reset should be careful to leave existing text (for compositing)\n changeObjs: null, // Accumulated changes, for firing change events\n cursorActivityHandlers: null, // Set of handlers to fire cursorActivity on\n cursorActivityCalled: 0, // Tracks which cursorActivity handlers have been called already\n selectionChanged: false, // Whether the selection needs to be redrawn\n updateMaxLine: false, // Set when the widest line needs to be determined anew\n scrollLeft: null, scrollTop: null, // Intermediate scroll position, not pushed to DOM yet\n scrollToPos: null, // Used to scroll to a specific position\n focus: false,\n id: ++nextOpId // Unique ID\n };\n pushOperation(cm.curOp);\n }\n\n // Finish an operation, updating the display and signalling delayed events\n function endOperation(cm) {\n var op = cm.curOp;\n if (op) { finishOperation(op, function (group) {\n for (var i = 0; i < group.ops.length; i++)\n { group.ops[i].cm.curOp = null; }\n endOperations(group);\n }); }\n }\n\n // The DOM updates done when an operation finishes are batched so\n // that the minimum number of relayouts are required.\n function endOperations(group) {\n var ops = group.ops;\n for (var i = 0; i < ops.length; i++) // Read DOM\n { endOperation_R1(ops[i]); }\n for (var i$1 = 0; i$1 < ops.length; i$1++) // Write DOM (maybe)\n { endOperation_W1(ops[i$1]); }\n for (var i$2 = 0; i$2 < ops.length; i$2++) // Read DOM\n { endOperation_R2(ops[i$2]); }\n for (var i$3 = 0; i$3 < ops.length; i$3++) // Write DOM (maybe)\n { endOperation_W2(ops[i$3]); }\n for (var i$4 = 0; i$4 < ops.length; i$4++) // Read DOM\n { endOperation_finish(ops[i$4]); }\n }\n\n function endOperation_R1(op) {\n var cm = op.cm, display = cm.display;\n maybeClipScrollbars(cm);\n if (op.updateMaxLine) { findMaxLine(cm); }\n\n op.mustUpdate = op.viewChanged || op.forceUpdate || op.scrollTop != null ||\n op.scrollToPos && (op.scrollToPos.from.line < display.viewFrom ||\n op.scrollToPos.to.line >= display.viewTo) ||\n display.maxLineChanged && cm.options.lineWrapping;\n op.update = op.mustUpdate &&\n new DisplayUpdate(cm, op.mustUpdate && {top: op.scrollTop, ensure: op.scrollToPos}, op.forceUpdate);\n }\n\n function endOperation_W1(op) {\n op.updatedDisplay = op.mustUpdate && updateDisplayIfNeeded(op.cm, op.update);\n }\n\n function endOperation_R2(op) {\n var cm = op.cm, display = cm.display;\n if (op.updatedDisplay) { updateHeightsInViewport(cm); }\n\n op.barMeasure = measureForScrollbars(cm);\n\n // If the max line changed since it was last measured, measure it,\n // and ensure the document's width matches it.\n // updateDisplay_W2 will use these properties to do the actual resizing\n if (display.maxLineChanged && !cm.options.lineWrapping) {\n op.adjustWidthTo = measureChar(cm, display.maxLine, display.maxLine.text.length).left + 3;\n cm.display.sizerWidth = op.adjustWidthTo;\n op.barMeasure.scrollWidth =\n Math.max(display.scroller.clientWidth, display.sizer.offsetLeft + op.adjustWidthTo + scrollGap(cm) + cm.display.barWidth);\n op.maxScrollLeft = Math.max(0, display.sizer.offsetLeft + op.adjustWidthTo - displayWidth(cm));\n }\n\n if (op.updatedDisplay || op.selectionChanged)\n { op.preparedSelection = display.input.prepareSelection(); }\n }\n\n function endOperation_W2(op) {\n var cm = op.cm;\n\n if (op.adjustWidthTo != null) {\n cm.display.sizer.style.minWidth = op.adjustWidthTo + \"px\";\n if (op.maxScrollLeft < cm.doc.scrollLeft)\n { setScrollLeft(cm, Math.min(cm.display.scroller.scrollLeft, op.maxScrollLeft), true); }\n cm.display.maxLineChanged = false;\n }\n\n var takeFocus = op.focus && op.focus == activeElt();\n if (op.preparedSelection)\n { cm.display.input.showSelection(op.preparedSelection, takeFocus); }\n if (op.updatedDisplay || op.startHeight != cm.doc.height)\n { updateScrollbars(cm, op.barMeasure); }\n if (op.updatedDisplay)\n { setDocumentHeight(cm, op.barMeasure); }\n\n if (op.selectionChanged) { restartBlink(cm); }\n\n if (cm.state.focused && op.updateInput)\n { cm.display.input.reset(op.typing); }\n if (takeFocus) { ensureFocus(op.cm); }\n }\n\n function endOperation_finish(op) {\n var cm = op.cm, display = cm.display, doc = cm.doc;\n\n if (op.updatedDisplay) { postUpdateDisplay(cm, op.update); }\n\n // Abort mouse wheel delta measurement, when scrolling explicitly\n if (display.wheelStartX != null && (op.scrollTop != null || op.scrollLeft != null || op.scrollToPos))\n { display.wheelStartX = display.wheelStartY = null; }\n\n // Propagate the scroll position to the actual DOM scroller\n if (op.scrollTop != null) { setScrollTop(cm, op.scrollTop, op.forceScroll); }\n\n if (op.scrollLeft != null) { setScrollLeft(cm, op.scrollLeft, true, true); }\n // If we need to scroll a specific position into view, do so.\n if (op.scrollToPos) {\n var rect = scrollPosIntoView(cm, clipPos(doc, op.scrollToPos.from),\n clipPos(doc, op.scrollToPos.to), op.scrollToPos.margin);\n maybeScrollWindow(cm, rect);\n }\n\n // Fire events for markers that are hidden/unidden by editing or\n // undoing\n var hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers;\n if (hidden) { for (var i = 0; i < hidden.length; ++i)\n { if (!hidden[i].lines.length) { signal(hidden[i], \"hide\"); } } }\n if (unhidden) { for (var i$1 = 0; i$1 < unhidden.length; ++i$1)\n { if (unhidden[i$1].lines.length) { signal(unhidden[i$1], \"unhide\"); } } }\n\n if (display.wrapper.offsetHeight)\n { doc.scrollTop = cm.display.scroller.scrollTop; }\n\n // Fire change events, and delayed event handlers\n if (op.changeObjs)\n { signal(cm, \"changes\", cm, op.changeObjs); }\n if (op.update)\n { op.update.finish(); }\n }\n\n // Run the given function in an operation\n function runInOp(cm, f) {\n if (cm.curOp) { return f() }\n startOperation(cm);\n try { return f() }\n finally { endOperation(cm); }\n }\n // Wraps a function in an operation. Returns the wrapped function.\n function operation(cm, f) {\n return function() {\n if (cm.curOp) { return f.apply(cm, arguments) }\n startOperation(cm);\n try { return f.apply(cm, arguments) }\n finally { endOperation(cm); }\n }\n }\n // Used to add methods to editor and doc instances, wrapping them in\n // operations.\n function methodOp(f) {\n return function() {\n if (this.curOp) { return f.apply(this, arguments) }\n startOperation(this);\n try { return f.apply(this, arguments) }\n finally { endOperation(this); }\n }\n }\n function docMethodOp(f) {\n return function() {\n var cm = this.cm;\n if (!cm || cm.curOp) { return f.apply(this, arguments) }\n startOperation(cm);\n try { return f.apply(this, arguments) }\n finally { endOperation(cm); }\n }\n }\n\n // HIGHLIGHT WORKER\n\n function startWorker(cm, time) {\n if (cm.doc.highlightFrontier < cm.display.viewTo)\n { cm.state.highlight.set(time, bind(highlightWorker, cm)); }\n }\n\n function highlightWorker(cm) {\n var doc = cm.doc;\n if (doc.highlightFrontier >= cm.display.viewTo) { return }\n var end = +new Date + cm.options.workTime;\n var context = getContextBefore(cm, doc.highlightFrontier);\n var changedLines = [];\n\n doc.iter(context.line, Math.min(doc.first + doc.size, cm.display.viewTo + 500), function (line) {\n if (context.line >= cm.display.viewFrom) { // Visible\n var oldStyles = line.styles;\n var resetState = line.text.length > cm.options.maxHighlightLength ? copyState(doc.mode, context.state) : null;\n var highlighted = highlightLine(cm, line, context, true);\n if (resetState) { context.state = resetState; }\n line.styles = highlighted.styles;\n var oldCls = line.styleClasses, newCls = highlighted.classes;\n if (newCls) { line.styleClasses = newCls; }\n else if (oldCls) { line.styleClasses = null; }\n var ischange = !oldStyles || oldStyles.length != line.styles.length ||\n oldCls != newCls && (!oldCls || !newCls || oldCls.bgClass != newCls.bgClass || oldCls.textClass != newCls.textClass);\n for (var i = 0; !ischange && i < oldStyles.length; ++i) { ischange = oldStyles[i] != line.styles[i]; }\n if (ischange) { changedLines.push(context.line); }\n line.stateAfter = context.save();\n context.nextLine();\n } else {\n if (line.text.length <= cm.options.maxHighlightLength)\n { processLine(cm, line.text, context); }\n line.stateAfter = context.line % 5 == 0 ? context.save() : null;\n context.nextLine();\n }\n if (+new Date > end) {\n startWorker(cm, cm.options.workDelay);\n return true\n }\n });\n doc.highlightFrontier = context.line;\n doc.modeFrontier = Math.max(doc.modeFrontier, context.line);\n if (changedLines.length) { runInOp(cm, function () {\n for (var i = 0; i < changedLines.length; i++)\n { regLineChange(cm, changedLines[i], \"text\"); }\n }); }\n }\n\n // DISPLAY DRAWING\n\n var DisplayUpdate = function(cm, viewport, force) {\n var display = cm.display;\n\n this.viewport = viewport;\n // Store some values that we'll need later (but don't want to force a relayout for)\n this.visible = visibleLines(display, cm.doc, viewport);\n this.editorIsHidden = !display.wrapper.offsetWidth;\n this.wrapperHeight = display.wrapper.clientHeight;\n this.wrapperWidth = display.wrapper.clientWidth;\n this.oldDisplayWidth = displayWidth(cm);\n this.force = force;\n this.dims = getDimensions(cm);\n this.events = [];\n };\n\n DisplayUpdate.prototype.signal = function (emitter, type) {\n if (hasHandler(emitter, type))\n { this.events.push(arguments); }\n };\n DisplayUpdate.prototype.finish = function () {\n for (var i = 0; i < this.events.length; i++)\n { signal.apply(null, this.events[i]); }\n };\n\n function maybeClipScrollbars(cm) {\n var display = cm.display;\n if (!display.scrollbarsClipped && display.scroller.offsetWidth) {\n display.nativeBarWidth = display.scroller.offsetWidth - display.scroller.clientWidth;\n display.heightForcer.style.height = scrollGap(cm) + \"px\";\n display.sizer.style.marginBottom = -display.nativeBarWidth + \"px\";\n display.sizer.style.borderRightWidth = scrollGap(cm) + \"px\";\n display.scrollbarsClipped = true;\n }\n }\n\n function selectionSnapshot(cm) {\n if (cm.hasFocus()) { return null }\n var active = activeElt();\n if (!active || !contains(cm.display.lineDiv, active)) { return null }\n var result = {activeElt: active};\n if (window.getSelection) {\n var sel = window.getSelection();\n if (sel.anchorNode && sel.extend && contains(cm.display.lineDiv, sel.anchorNode)) {\n result.anchorNode = sel.anchorNode;\n result.anchorOffset = sel.anchorOffset;\n result.focusNode = sel.focusNode;\n result.focusOffset = sel.focusOffset;\n }\n }\n return result\n }\n\n function restoreSelection(snapshot) {\n if (!snapshot || !snapshot.activeElt || snapshot.activeElt == activeElt()) { return }\n snapshot.activeElt.focus();\n if (!/^(INPUT|TEXTAREA)$/.test(snapshot.activeElt.nodeName) &&\n snapshot.anchorNode && contains(document.body, snapshot.anchorNode) && contains(document.body, snapshot.focusNode)) {\n var sel = window.getSelection(), range = document.createRange();\n range.setEnd(snapshot.anchorNode, snapshot.anchorOffset);\n range.collapse(false);\n sel.removeAllRanges();\n sel.addRange(range);\n sel.extend(snapshot.focusNode, snapshot.focusOffset);\n }\n }\n\n // Does the actual updating of the line display. Bails out\n // (returning false) when there is nothing to be done and forced is\n // false.\n function updateDisplayIfNeeded(cm, update) {\n var display = cm.display, doc = cm.doc;\n\n if (update.editorIsHidden) {\n resetView(cm);\n return false\n }\n\n // Bail out if the visible area is already rendered and nothing changed.\n if (!update.force &&\n update.visible.from >= display.viewFrom && update.visible.to <= display.viewTo &&\n (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo) &&\n display.renderedView == display.view && countDirtyView(cm) == 0)\n { return false }\n\n if (maybeUpdateLineNumberWidth(cm)) {\n resetView(cm);\n update.dims = getDimensions(cm);\n }\n\n // Compute a suitable new viewport (from & to)\n var end = doc.first + doc.size;\n var from = Math.max(update.visible.from - cm.options.viewportMargin, doc.first);\n var to = Math.min(end, update.visible.to + cm.options.viewportMargin);\n if (display.viewFrom < from && from - display.viewFrom < 20) { from = Math.max(doc.first, display.viewFrom); }\n if (display.viewTo > to && display.viewTo - to < 20) { to = Math.min(end, display.viewTo); }\n if (sawCollapsedSpans) {\n from = visualLineNo(cm.doc, from);\n to = visualLineEndNo(cm.doc, to);\n }\n\n var different = from != display.viewFrom || to != display.viewTo ||\n display.lastWrapHeight != update.wrapperHeight || display.lastWrapWidth != update.wrapperWidth;\n adjustView(cm, from, to);\n\n display.viewOffset = heightAtLine(getLine(cm.doc, display.viewFrom));\n // Position the mover div to align with the current scroll position\n cm.display.mover.style.top = display.viewOffset + \"px\";\n\n var toUpdate = countDirtyView(cm);\n if (!different && toUpdate == 0 && !update.force && display.renderedView == display.view &&\n (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo))\n { return false }\n\n // For big changes, we hide the enclosing element during the\n // update, since that speeds up the operations on most browsers.\n var selSnapshot = selectionSnapshot(cm);\n if (toUpdate > 4) { display.lineDiv.style.display = \"none\"; }\n patchDisplay(cm, display.updateLineNumbers, update.dims);\n if (toUpdate > 4) { display.lineDiv.style.display = \"\"; }\n display.renderedView = display.view;\n // There might have been a widget with a focused element that got\n // hidden or updated, if so re-focus it.\n restoreSelection(selSnapshot);\n\n // Prevent selection and cursors from interfering with the scroll\n // width and height.\n removeChildren(display.cursorDiv);\n removeChildren(display.selectionDiv);\n display.gutters.style.height = display.sizer.style.minHeight = 0;\n\n if (different) {\n display.lastWrapHeight = update.wrapperHeight;\n display.lastWrapWidth = update.wrapperWidth;\n startWorker(cm, 400);\n }\n\n display.updateLineNumbers = null;\n\n return true\n }\n\n function postUpdateDisplay(cm, update) {\n var viewport = update.viewport;\n\n for (var first = true;; first = false) {\n if (!first || !cm.options.lineWrapping || update.oldDisplayWidth == displayWidth(cm)) {\n // Clip forced viewport to actual scrollable area.\n if (viewport && viewport.top != null)\n { viewport = {top: Math.min(cm.doc.height + paddingVert(cm.display) - displayHeight(cm), viewport.top)}; }\n // Updated line heights might result in the drawn area not\n // actually covering the viewport. Keep looping until it does.\n update.visible = visibleLines(cm.display, cm.doc, viewport);\n if (update.visible.from >= cm.display.viewFrom && update.visible.to <= cm.display.viewTo)\n { break }\n } else if (first) {\n update.visible = visibleLines(cm.display, cm.doc, viewport);\n }\n if (!updateDisplayIfNeeded(cm, update)) { break }\n updateHeightsInViewport(cm);\n var barMeasure = measureForScrollbars(cm);\n updateSelection(cm);\n updateScrollbars(cm, barMeasure);\n setDocumentHeight(cm, barMeasure);\n update.force = false;\n }\n\n update.signal(cm, \"update\", cm);\n if (cm.display.viewFrom != cm.display.reportedViewFrom || cm.display.viewTo != cm.display.reportedViewTo) {\n update.signal(cm, \"viewportChange\", cm, cm.display.viewFrom, cm.display.viewTo);\n cm.display.reportedViewFrom = cm.display.viewFrom; cm.display.reportedViewTo = cm.display.viewTo;\n }\n }\n\n function updateDisplaySimple(cm, viewport) {\n var update = new DisplayUpdate(cm, viewport);\n if (updateDisplayIfNeeded(cm, update)) {\n updateHeightsInViewport(cm);\n postUpdateDisplay(cm, update);\n var barMeasure = measureForScrollbars(cm);\n updateSelection(cm);\n updateScrollbars(cm, barMeasure);\n setDocumentHeight(cm, barMeasure);\n update.finish();\n }\n }\n\n // Sync the actual display DOM structure with display.view, removing\n // nodes for lines that are no longer in view, and creating the ones\n // that are not there yet, and updating the ones that are out of\n // date.\n function patchDisplay(cm, updateNumbersFrom, dims) {\n var display = cm.display, lineNumbers = cm.options.lineNumbers;\n var container = display.lineDiv, cur = container.firstChild;\n\n function rm(node) {\n var next = node.nextSibling;\n // Works around a throw-scroll bug in OS X Webkit\n if (webkit && mac && cm.display.currentWheelTarget == node)\n { node.style.display = \"none\"; }\n else\n { node.parentNode.removeChild(node); }\n return next\n }\n\n var view = display.view, lineN = display.viewFrom;\n // Loop over the elements in the view, syncing cur (the DOM nodes\n // in display.lineDiv) with the view as we go.\n for (var i = 0; i < view.length; i++) {\n var lineView = view[i];\n if (lineView.hidden) ; else if (!lineView.node || lineView.node.parentNode != container) { // Not drawn yet\n var node = buildLineElement(cm, lineView, lineN, dims);\n container.insertBefore(node, cur);\n } else { // Already drawn\n while (cur != lineView.node) { cur = rm(cur); }\n var updateNumber = lineNumbers && updateNumbersFrom != null &&\n updateNumbersFrom <= lineN && lineView.lineNumber;\n if (lineView.changes) {\n if (indexOf(lineView.changes, \"gutter\") > -1) { updateNumber = false; }\n updateLineForChanges(cm, lineView, lineN, dims);\n }\n if (updateNumber) {\n removeChildren(lineView.lineNumber);\n lineView.lineNumber.appendChild(document.createTextNode(lineNumberFor(cm.options, lineN)));\n }\n cur = lineView.node.nextSibling;\n }\n lineN += lineView.size;\n }\n while (cur) { cur = rm(cur); }\n }\n\n function updateGutterSpace(display) {\n var width = display.gutters.offsetWidth;\n display.sizer.style.marginLeft = width + \"px\";\n // Send an event to consumers responding to changes in gutter width.\n signalLater(display, \"gutterChanged\", display);\n }\n\n function setDocumentHeight(cm, measure) {\n cm.display.sizer.style.minHeight = measure.docHeight + \"px\";\n cm.display.heightForcer.style.top = measure.docHeight + \"px\";\n cm.display.gutters.style.height = (measure.docHeight + cm.display.barHeight + scrollGap(cm)) + \"px\";\n }\n\n // Re-align line numbers and gutter marks to compensate for\n // horizontal scrolling.\n function alignHorizontally(cm) {\n var display = cm.display, view = display.view;\n if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) { return }\n var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft;\n var gutterW = display.gutters.offsetWidth, left = comp + \"px\";\n for (var i = 0; i < view.length; i++) { if (!view[i].hidden) {\n if (cm.options.fixedGutter) {\n if (view[i].gutter)\n { view[i].gutter.style.left = left; }\n if (view[i].gutterBackground)\n { view[i].gutterBackground.style.left = left; }\n }\n var align = view[i].alignable;\n if (align) { for (var j = 0; j < align.length; j++)\n { align[j].style.left = left; } }\n } }\n if (cm.options.fixedGutter)\n { display.gutters.style.left = (comp + gutterW) + \"px\"; }\n }\n\n // Used to ensure that the line number gutter is still the right\n // size for the current document size. Returns true when an update\n // is needed.\n function maybeUpdateLineNumberWidth(cm) {\n if (!cm.options.lineNumbers) { return false }\n var doc = cm.doc, last = lineNumberFor(cm.options, doc.first + doc.size - 1), display = cm.display;\n if (last.length != display.lineNumChars) {\n var test = display.measure.appendChild(elt(\"div\", [elt(\"div\", last)],\n \"CodeMirror-linenumber CodeMirror-gutter-elt\"));\n var innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW;\n display.lineGutter.style.width = \"\";\n display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding) + 1;\n display.lineNumWidth = display.lineNumInnerWidth + padding;\n display.lineNumChars = display.lineNumInnerWidth ? last.length : -1;\n display.lineGutter.style.width = display.lineNumWidth + \"px\";\n updateGutterSpace(cm.display);\n return true\n }\n return false\n }\n\n function getGutters(gutters, lineNumbers) {\n var result = [], sawLineNumbers = false;\n for (var i = 0; i < gutters.length; i++) {\n var name = gutters[i], style = null;\n if (typeof name != \"string\") { style = name.style; name = name.className; }\n if (name == \"CodeMirror-linenumbers\") {\n if (!lineNumbers) { continue }\n else { sawLineNumbers = true; }\n }\n result.push({className: name, style: style});\n }\n if (lineNumbers && !sawLineNumbers) { result.push({className: \"CodeMirror-linenumbers\", style: null}); }\n return result\n }\n\n // Rebuild the gutter elements, ensure the margin to the left of the\n // code matches their width.\n function renderGutters(display) {\n var gutters = display.gutters, specs = display.gutterSpecs;\n removeChildren(gutters);\n display.lineGutter = null;\n for (var i = 0; i < specs.length; ++i) {\n var ref = specs[i];\n var className = ref.className;\n var style = ref.style;\n var gElt = gutters.appendChild(elt(\"div\", null, \"CodeMirror-gutter \" + className));\n if (style) { gElt.style.cssText = style; }\n if (className == \"CodeMirror-linenumbers\") {\n display.lineGutter = gElt;\n gElt.style.width = (display.lineNumWidth || 1) + \"px\";\n }\n }\n gutters.style.display = specs.length ? \"\" : \"none\";\n updateGutterSpace(display);\n }\n\n function updateGutters(cm) {\n renderGutters(cm.display);\n regChange(cm);\n alignHorizontally(cm);\n }\n\n // The display handles the DOM integration, both for input reading\n // and content drawing. It holds references to DOM nodes and\n // display-related state.\n\n function Display(place, doc, input, options) {\n var d = this;\n this.input = input;\n\n // Covers bottom-right square when both scrollbars are present.\n d.scrollbarFiller = elt(\"div\", null, \"CodeMirror-scrollbar-filler\");\n d.scrollbarFiller.setAttribute(\"cm-not-content\", \"true\");\n // Covers bottom of gutter when coverGutterNextToScrollbar is on\n // and h scrollbar is present.\n d.gutterFiller = elt(\"div\", null, \"CodeMirror-gutter-filler\");\n d.gutterFiller.setAttribute(\"cm-not-content\", \"true\");\n // Will contain the actual code, positioned to cover the viewport.\n d.lineDiv = eltP(\"div\", null, \"CodeMirror-code\");\n // Elements are added to these to represent selection and cursors.\n d.selectionDiv = elt(\"div\", null, null, \"position: relative; z-index: 1\");\n d.cursorDiv = elt(\"div\", null, \"CodeMirror-cursors\");\n // A visibility: hidden element used to find the size of things.\n d.measure = elt(\"div\", null, \"CodeMirror-measure\");\n // When lines outside of the viewport are measured, they are drawn in this.\n d.lineMeasure = elt(\"div\", null, \"CodeMirror-measure\");\n // Wraps everything that needs to exist inside the vertically-padded coordinate system\n d.lineSpace = eltP(\"div\", [d.measure, d.lineMeasure, d.selectionDiv, d.cursorDiv, d.lineDiv],\n null, \"position: relative; outline: none\");\n var lines = eltP(\"div\", [d.lineSpace], \"CodeMirror-lines\");\n // Moved around its parent to cover visible view.\n d.mover = elt(\"div\", [lines], null, \"position: relative\");\n // Set to the height of the document, allowing scrolling.\n d.sizer = elt(\"div\", [d.mover], \"CodeMirror-sizer\");\n d.sizerWidth = null;\n // Behavior of elts with overflow: auto and padding is\n // inconsistent across browsers. This is used to ensure the\n // scrollable area is big enough.\n d.heightForcer = elt(\"div\", null, null, \"position: absolute; height: \" + scrollerGap + \"px; width: 1px;\");\n // Will contain the gutters, if any.\n d.gutters = elt(\"div\", null, \"CodeMirror-gutters\");\n d.lineGutter = null;\n // Actual scrollable element.\n d.scroller = elt(\"div\", [d.sizer, d.heightForcer, d.gutters], \"CodeMirror-scroll\");\n d.scroller.setAttribute(\"tabIndex\", \"-1\");\n // The element in which the editor lives.\n d.wrapper = elt(\"div\", [d.scrollbarFiller, d.gutterFiller, d.scroller], \"CodeMirror\");\n\n // Work around IE7 z-index bug (not perfect, hence IE7 not really being supported)\n if (ie && ie_version < 8) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0; }\n if (!webkit && !(gecko && mobile)) { d.scroller.draggable = true; }\n\n if (place) {\n if (place.appendChild) { place.appendChild(d.wrapper); }\n else { place(d.wrapper); }\n }\n\n // Current rendered range (may be bigger than the view window).\n d.viewFrom = d.viewTo = doc.first;\n d.reportedViewFrom = d.reportedViewTo = doc.first;\n // Information about the rendered lines.\n d.view = [];\n d.renderedView = null;\n // Holds info about a single rendered line when it was rendered\n // for measurement, while not in view.\n d.externalMeasured = null;\n // Empty space (in pixels) above the view\n d.viewOffset = 0;\n d.lastWrapHeight = d.lastWrapWidth = 0;\n d.updateLineNumbers = null;\n\n d.nativeBarWidth = d.barHeight = d.barWidth = 0;\n d.scrollbarsClipped = false;\n\n // Used to only resize the line number gutter when necessary (when\n // the amount of lines crosses a boundary that makes its width change)\n d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null;\n // Set to true when a non-horizontal-scrolling line widget is\n // added. As an optimization, line widget aligning is skipped when\n // this is false.\n d.alignWidgets = false;\n\n d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null;\n\n // Tracks the maximum line length so that the horizontal scrollbar\n // can be kept static when scrolling.\n d.maxLine = null;\n d.maxLineLength = 0;\n d.maxLineChanged = false;\n\n // Used for measuring wheel scrolling granularity\n d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null;\n\n // True when shift is held down.\n d.shift = false;\n\n // Used to track whether anything happened since the context menu\n // was opened.\n d.selForContextMenu = null;\n\n d.activeTouch = null;\n\n d.gutterSpecs = getGutters(options.gutters, options.lineNumbers);\n renderGutters(d);\n\n input.init(d);\n }\n\n // Since the delta values reported on mouse wheel events are\n // unstandardized between browsers and even browser versions, and\n // generally horribly unpredictable, this code starts by measuring\n // the scroll effect that the first few mouse wheel events have,\n // and, from that, detects the way it can convert deltas to pixel\n // offsets afterwards.\n //\n // The reason we want to know the amount a wheel event will scroll\n // is that it gives us a chance to update the display before the\n // actual scrolling happens, reducing flickering.\n\n var wheelSamples = 0, wheelPixelsPerUnit = null;\n // Fill in a browser-detected starting value on browsers where we\n // know one. These don't have to be accurate -- the result of them\n // being wrong would just be a slight flicker on the first wheel\n // scroll (if it is large enough).\n if (ie) { wheelPixelsPerUnit = -.53; }\n else if (gecko) { wheelPixelsPerUnit = 15; }\n else if (chrome) { wheelPixelsPerUnit = -.7; }\n else if (safari) { wheelPixelsPerUnit = -1/3; }\n\n function wheelEventDelta(e) {\n var dx = e.wheelDeltaX, dy = e.wheelDeltaY;\n if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) { dx = e.detail; }\n if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) { dy = e.detail; }\n else if (dy == null) { dy = e.wheelDelta; }\n return {x: dx, y: dy}\n }\n function wheelEventPixels(e) {\n var delta = wheelEventDelta(e);\n delta.x *= wheelPixelsPerUnit;\n delta.y *= wheelPixelsPerUnit;\n return delta\n }\n\n function onScrollWheel(cm, e) {\n var delta = wheelEventDelta(e), dx = delta.x, dy = delta.y;\n\n var display = cm.display, scroll = display.scroller;\n // Quit if there's nothing to scroll here\n var canScrollX = scroll.scrollWidth > scroll.clientWidth;\n var canScrollY = scroll.scrollHeight > scroll.clientHeight;\n if (!(dx && canScrollX || dy && canScrollY)) { return }\n\n // Webkit browsers on OS X abort momentum scrolls when the target\n // of the scroll event is removed from the scrollable element.\n // This hack (see related code in patchDisplay) makes sure the\n // element is kept around.\n if (dy && mac && webkit) {\n outer: for (var cur = e.target, view = display.view; cur != scroll; cur = cur.parentNode) {\n for (var i = 0; i < view.length; i++) {\n if (view[i].node == cur) {\n cm.display.currentWheelTarget = cur;\n break outer\n }\n }\n }\n }\n\n // On some browsers, horizontal scrolling will cause redraws to\n // happen before the gutter has been realigned, causing it to\n // wriggle around in a most unseemly way. When we have an\n // estimated pixels/delta value, we just handle horizontal\n // scrolling entirely here. It'll be slightly off from native, but\n // better than glitching out.\n if (dx && !gecko && !presto && wheelPixelsPerUnit != null) {\n if (dy && canScrollY)\n { updateScrollTop(cm, Math.max(0, scroll.scrollTop + dy * wheelPixelsPerUnit)); }\n setScrollLeft(cm, Math.max(0, scroll.scrollLeft + dx * wheelPixelsPerUnit));\n // Only prevent default scrolling if vertical scrolling is\n // actually possible. Otherwise, it causes vertical scroll\n // jitter on OSX trackpads when deltaX is small and deltaY\n // is large (issue #3579)\n if (!dy || (dy && canScrollY))\n { e_preventDefault(e); }\n display.wheelStartX = null; // Abort measurement, if in progress\n return\n }\n\n // 'Project' the visible viewport to cover the area that is being\n // scrolled into view (if we know enough to estimate it).\n if (dy && wheelPixelsPerUnit != null) {\n var pixels = dy * wheelPixelsPerUnit;\n var top = cm.doc.scrollTop, bot = top + display.wrapper.clientHeight;\n if (pixels < 0) { top = Math.max(0, top + pixels - 50); }\n else { bot = Math.min(cm.doc.height, bot + pixels + 50); }\n updateDisplaySimple(cm, {top: top, bottom: bot});\n }\n\n if (wheelSamples < 20) {\n if (display.wheelStartX == null) {\n display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop;\n display.wheelDX = dx; display.wheelDY = dy;\n setTimeout(function () {\n if (display.wheelStartX == null) { return }\n var movedX = scroll.scrollLeft - display.wheelStartX;\n var movedY = scroll.scrollTop - display.wheelStartY;\n var sample = (movedY && display.wheelDY && movedY / display.wheelDY) ||\n (movedX && display.wheelDX && movedX / display.wheelDX);\n display.wheelStartX = display.wheelStartY = null;\n if (!sample) { return }\n wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1);\n ++wheelSamples;\n }, 200);\n } else {\n display.wheelDX += dx; display.wheelDY += dy;\n }\n }\n }\n\n // Selection objects are immutable. A new one is created every time\n // the selection changes. A selection is one or more non-overlapping\n // (and non-touching) ranges, sorted, and an integer that indicates\n // which one is the primary selection (the one that's scrolled into\n // view, that getCursor returns, etc).\n var Selection = function(ranges, primIndex) {\n this.ranges = ranges;\n this.primIndex = primIndex;\n };\n\n Selection.prototype.primary = function () { return this.ranges[this.primIndex] };\n\n Selection.prototype.equals = function (other) {\n if (other == this) { return true }\n if (other.primIndex != this.primIndex || other.ranges.length != this.ranges.length) { return false }\n for (var i = 0; i < this.ranges.length; i++) {\n var here = this.ranges[i], there = other.ranges[i];\n if (!equalCursorPos(here.anchor, there.anchor) || !equalCursorPos(here.head, there.head)) { return false }\n }\n return true\n };\n\n Selection.prototype.deepCopy = function () {\n var out = [];\n for (var i = 0; i < this.ranges.length; i++)\n { out[i] = new Range(copyPos(this.ranges[i].anchor), copyPos(this.ranges[i].head)); }\n return new Selection(out, this.primIndex)\n };\n\n Selection.prototype.somethingSelected = function () {\n for (var i = 0; i < this.ranges.length; i++)\n { if (!this.ranges[i].empty()) { return true } }\n return false\n };\n\n Selection.prototype.contains = function (pos, end) {\n if (!end) { end = pos; }\n for (var i = 0; i < this.ranges.length; i++) {\n var range = this.ranges[i];\n if (cmp(end, range.from()) >= 0 && cmp(pos, range.to()) <= 0)\n { return i }\n }\n return -1\n };\n\n var Range = function(anchor, head) {\n this.anchor = anchor; this.head = head;\n };\n\n Range.prototype.from = function () { return minPos(this.anchor, this.head) };\n Range.prototype.to = function () { return maxPos(this.anchor, this.head) };\n Range.prototype.empty = function () { return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch };\n\n // Take an unsorted, potentially overlapping set of ranges, and\n // build a selection out of it. 'Consumes' ranges array (modifying\n // it).\n function normalizeSelection(cm, ranges, primIndex) {\n var mayTouch = cm && cm.options.selectionsMayTouch;\n var prim = ranges[primIndex];\n ranges.sort(function (a, b) { return cmp(a.from(), b.from()); });\n primIndex = indexOf(ranges, prim);\n for (var i = 1; i < ranges.length; i++) {\n var cur = ranges[i], prev = ranges[i - 1];\n var diff = cmp(prev.to(), cur.from());\n if (mayTouch && !cur.empty() ? diff > 0 : diff >= 0) {\n var from = minPos(prev.from(), cur.from()), to = maxPos(prev.to(), cur.to());\n var inv = prev.empty() ? cur.from() == cur.head : prev.from() == prev.head;\n if (i <= primIndex) { --primIndex; }\n ranges.splice(--i, 2, new Range(inv ? to : from, inv ? from : to));\n }\n }\n return new Selection(ranges, primIndex)\n }\n\n function simpleSelection(anchor, head) {\n return new Selection([new Range(anchor, head || anchor)], 0)\n }\n\n // Compute the position of the end of a change (its 'to' property\n // refers to the pre-change end).\n function changeEnd(change) {\n if (!change.text) { return change.to }\n return Pos(change.from.line + change.text.length - 1,\n lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0))\n }\n\n // Adjust a position to refer to the post-change position of the\n // same text, or the end of the change if the change covers it.\n function adjustForChange(pos, change) {\n if (cmp(pos, change.from) < 0) { return pos }\n if (cmp(pos, change.to) <= 0) { return changeEnd(change) }\n\n var line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, ch = pos.ch;\n if (pos.line == change.to.line) { ch += changeEnd(change).ch - change.to.ch; }\n return Pos(line, ch)\n }\n\n function computeSelAfterChange(doc, change) {\n var out = [];\n for (var i = 0; i < doc.sel.ranges.length; i++) {\n var range = doc.sel.ranges[i];\n out.push(new Range(adjustForChange(range.anchor, change),\n adjustForChange(range.head, change)));\n }\n return normalizeSelection(doc.cm, out, doc.sel.primIndex)\n }\n\n function offsetPos(pos, old, nw) {\n if (pos.line == old.line)\n { return Pos(nw.line, pos.ch - old.ch + nw.ch) }\n else\n { return Pos(nw.line + (pos.line - old.line), pos.ch) }\n }\n\n // Used by replaceSelections to allow moving the selection to the\n // start or around the replaced test. Hint may be \"start\" or \"around\".\n function computeReplacedSel(doc, changes, hint) {\n var out = [];\n var oldPrev = Pos(doc.first, 0), newPrev = oldPrev;\n for (var i = 0; i < changes.length; i++) {\n var change = changes[i];\n var from = offsetPos(change.from, oldPrev, newPrev);\n var to = offsetPos(changeEnd(change), oldPrev, newPrev);\n oldPrev = change.to;\n newPrev = to;\n if (hint == \"around\") {\n var range = doc.sel.ranges[i], inv = cmp(range.head, range.anchor) < 0;\n out[i] = new Range(inv ? to : from, inv ? from : to);\n } else {\n out[i] = new Range(from, from);\n }\n }\n return new Selection(out, doc.sel.primIndex)\n }\n\n // Used to get the editor into a consistent state again when options change.\n\n function loadMode(cm) {\n cm.doc.mode = getMode(cm.options, cm.doc.modeOption);\n resetModeState(cm);\n }\n\n function resetModeState(cm) {\n cm.doc.iter(function (line) {\n if (line.stateAfter) { line.stateAfter = null; }\n if (line.styles) { line.styles = null; }\n });\n cm.doc.modeFrontier = cm.doc.highlightFrontier = cm.doc.first;\n startWorker(cm, 100);\n cm.state.modeGen++;\n if (cm.curOp) { regChange(cm); }\n }\n\n // DOCUMENT DATA STRUCTURE\n\n // By default, updates that start and end at the beginning of a line\n // are treated specially, in order to make the association of line\n // widgets and marker elements with the text behave more intuitive.\n function isWholeLineUpdate(doc, change) {\n return change.from.ch == 0 && change.to.ch == 0 && lst(change.text) == \"\" &&\n (!doc.cm || doc.cm.options.wholeLineUpdateBefore)\n }\n\n // Perform a change on the document data structure.\n function updateDoc(doc, change, markedSpans, estimateHeight) {\n function spansFor(n) {return markedSpans ? markedSpans[n] : null}\n function update(line, text, spans) {\n updateLine(line, text, spans, estimateHeight);\n signalLater(line, \"change\", line, change);\n }\n function linesFor(start, end) {\n var result = [];\n for (var i = start; i < end; ++i)\n { result.push(new Line(text[i], spansFor(i), estimateHeight)); }\n return result\n }\n\n var from = change.from, to = change.to, text = change.text;\n var firstLine = getLine(doc, from.line), lastLine = getLine(doc, to.line);\n var lastText = lst(text), lastSpans = spansFor(text.length - 1), nlines = to.line - from.line;\n\n // Adjust the line structure\n if (change.full) {\n doc.insert(0, linesFor(0, text.length));\n doc.remove(text.length, doc.size - text.length);\n } else if (isWholeLineUpdate(doc, change)) {\n // This is a whole-line replace. Treated specially to make\n // sure line objects move the way they are supposed to.\n var added = linesFor(0, text.length - 1);\n update(lastLine, lastLine.text, lastSpans);\n if (nlines) { doc.remove(from.line, nlines); }\n if (added.length) { doc.insert(from.line, added); }\n } else if (firstLine == lastLine) {\n if (text.length == 1) {\n update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans);\n } else {\n var added$1 = linesFor(1, text.length - 1);\n added$1.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight));\n update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));\n doc.insert(from.line + 1, added$1);\n }\n } else if (text.length == 1) {\n update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0));\n doc.remove(from.line + 1, nlines);\n } else {\n update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));\n update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans);\n var added$2 = linesFor(1, text.length - 1);\n if (nlines > 1) { doc.remove(from.line + 1, nlines - 1); }\n doc.insert(from.line + 1, added$2);\n }\n\n signalLater(doc, \"change\", doc, change);\n }\n\n // Call f for all linked documents.\n function linkedDocs(doc, f, sharedHistOnly) {\n function propagate(doc, skip, sharedHist) {\n if (doc.linked) { for (var i = 0; i < doc.linked.length; ++i) {\n var rel = doc.linked[i];\n if (rel.doc == skip) { continue }\n var shared = sharedHist && rel.sharedHist;\n if (sharedHistOnly && !shared) { continue }\n f(rel.doc, shared);\n propagate(rel.doc, doc, shared);\n } }\n }\n propagate(doc, null, true);\n }\n\n // Attach a document to an editor.\n function attachDoc(cm, doc) {\n if (doc.cm) { throw new Error(\"This document is already in use.\") }\n cm.doc = doc;\n doc.cm = cm;\n estimateLineHeights(cm);\n loadMode(cm);\n setDirectionClass(cm);\n if (!cm.options.lineWrapping) { findMaxLine(cm); }\n cm.options.mode = doc.modeOption;\n regChange(cm);\n }\n\n function setDirectionClass(cm) {\n (cm.doc.direction == \"rtl\" ? addClass : rmClass)(cm.display.lineDiv, \"CodeMirror-rtl\");\n }\n\n function directionChanged(cm) {\n runInOp(cm, function () {\n setDirectionClass(cm);\n regChange(cm);\n });\n }\n\n function History(prev) {\n // Arrays of change events and selections. Doing something adds an\n // event to done and clears undo. Undoing moves events from done\n // to undone, redoing moves them in the other direction.\n this.done = []; this.undone = [];\n this.undoDepth = prev ? prev.undoDepth : Infinity;\n // Used to track when changes can be merged into a single undo\n // event\n this.lastModTime = this.lastSelTime = 0;\n this.lastOp = this.lastSelOp = null;\n this.lastOrigin = this.lastSelOrigin = null;\n // Used by the isClean() method\n this.generation = this.maxGeneration = prev ? prev.maxGeneration : 1;\n }\n\n // Create a history change event from an updateDoc-style change\n // object.\n function historyChangeFromChange(doc, change) {\n var histChange = {from: copyPos(change.from), to: changeEnd(change), text: getBetween(doc, change.from, change.to)};\n attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1);\n linkedDocs(doc, function (doc) { return attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1); }, true);\n return histChange\n }\n\n // Pop all selection events off the end of a history array. Stop at\n // a change event.\n function clearSelectionEvents(array) {\n while (array.length) {\n var last = lst(array);\n if (last.ranges) { array.pop(); }\n else { break }\n }\n }\n\n // Find the top change event in the history. Pop off selection\n // events that are in the way.\n function lastChangeEvent(hist, force) {\n if (force) {\n clearSelectionEvents(hist.done);\n return lst(hist.done)\n } else if (hist.done.length && !lst(hist.done).ranges) {\n return lst(hist.done)\n } else if (hist.done.length > 1 && !hist.done[hist.done.length - 2].ranges) {\n hist.done.pop();\n return lst(hist.done)\n }\n }\n\n // Register a change in the history. Merges changes that are within\n // a single operation, or are close together with an origin that\n // allows merging (starting with \"+\") into a single event.\n function addChangeToHistory(doc, change, selAfter, opId) {\n var hist = doc.history;\n hist.undone.length = 0;\n var time = +new Date, cur;\n var last;\n\n if ((hist.lastOp == opId ||\n hist.lastOrigin == change.origin && change.origin &&\n ((change.origin.charAt(0) == \"+\" && hist.lastModTime > time - (doc.cm ? doc.cm.options.historyEventDelay : 500)) ||\n change.origin.charAt(0) == \"*\")) &&\n (cur = lastChangeEvent(hist, hist.lastOp == opId))) {\n // Merge this change into the last event\n last = lst(cur.changes);\n if (cmp(change.from, change.to) == 0 && cmp(change.from, last.to) == 0) {\n // Optimized case for simple insertion -- don't want to add\n // new changesets for every character typed\n last.to = changeEnd(change);\n } else {\n // Add new sub-event\n cur.changes.push(historyChangeFromChange(doc, change));\n }\n } else {\n // Can not be merged, start a new event.\n var before = lst(hist.done);\n if (!before || !before.ranges)\n { pushSelectionToHistory(doc.sel, hist.done); }\n cur = {changes: [historyChangeFromChange(doc, change)],\n generation: hist.generation};\n hist.done.push(cur);\n while (hist.done.length > hist.undoDepth) {\n hist.done.shift();\n if (!hist.done[0].ranges) { hist.done.shift(); }\n }\n }\n hist.done.push(selAfter);\n hist.generation = ++hist.maxGeneration;\n hist.lastModTime = hist.lastSelTime = time;\n hist.lastOp = hist.lastSelOp = opId;\n hist.lastOrigin = hist.lastSelOrigin = change.origin;\n\n if (!last) { signal(doc, \"historyAdded\"); }\n }\n\n function selectionEventCanBeMerged(doc, origin, prev, sel) {\n var ch = origin.charAt(0);\n return ch == \"*\" ||\n ch == \"+\" &&\n prev.ranges.length == sel.ranges.length &&\n prev.somethingSelected() == sel.somethingSelected() &&\n new Date - doc.history.lastSelTime <= (doc.cm ? doc.cm.options.historyEventDelay : 500)\n }\n\n // Called whenever the selection changes, sets the new selection as\n // the pending selection in the history, and pushes the old pending\n // selection into the 'done' array when it was significantly\n // different (in number of selected ranges, emptiness, or time).\n function addSelectionToHistory(doc, sel, opId, options) {\n var hist = doc.history, origin = options && options.origin;\n\n // A new event is started when the previous origin does not match\n // the current, or the origins don't allow matching. Origins\n // starting with * are always merged, those starting with + are\n // merged when similar and close together in time.\n if (opId == hist.lastSelOp ||\n (origin && hist.lastSelOrigin == origin &&\n (hist.lastModTime == hist.lastSelTime && hist.lastOrigin == origin ||\n selectionEventCanBeMerged(doc, origin, lst(hist.done), sel))))\n { hist.done[hist.done.length - 1] = sel; }\n else\n { pushSelectionToHistory(sel, hist.done); }\n\n hist.lastSelTime = +new Date;\n hist.lastSelOrigin = origin;\n hist.lastSelOp = opId;\n if (options && options.clearRedo !== false)\n { clearSelectionEvents(hist.undone); }\n }\n\n function pushSelectionToHistory(sel, dest) {\n var top = lst(dest);\n if (!(top && top.ranges && top.equals(sel)))\n { dest.push(sel); }\n }\n\n // Used to store marked span information in the history.\n function attachLocalSpans(doc, change, from, to) {\n var existing = change[\"spans_\" + doc.id], n = 0;\n doc.iter(Math.max(doc.first, from), Math.min(doc.first + doc.size, to), function (line) {\n if (line.markedSpans)\n { (existing || (existing = change[\"spans_\" + doc.id] = {}))[n] = line.markedSpans; }\n ++n;\n });\n }\n\n // When un/re-doing restores text containing marked spans, those\n // that have been explicitly cleared should not be restored.\n function removeClearedSpans(spans) {\n if (!spans) { return null }\n var out;\n for (var i = 0; i < spans.length; ++i) {\n if (spans[i].marker.explicitlyCleared) { if (!out) { out = spans.slice(0, i); } }\n else if (out) { out.push(spans[i]); }\n }\n return !out ? spans : out.length ? out : null\n }\n\n // Retrieve and filter the old marked spans stored in a change event.\n function getOldSpans(doc, change) {\n var found = change[\"spans_\" + doc.id];\n if (!found) { return null }\n var nw = [];\n for (var i = 0; i < change.text.length; ++i)\n { nw.push(removeClearedSpans(found[i])); }\n return nw\n }\n\n // Used for un/re-doing changes from the history. Combines the\n // result of computing the existing spans with the set of spans that\n // existed in the history (so that deleting around a span and then\n // undoing brings back the span).\n function mergeOldSpans(doc, change) {\n var old = getOldSpans(doc, change);\n var stretched = stretchSpansOverChange(doc, change);\n if (!old) { return stretched }\n if (!stretched) { return old }\n\n for (var i = 0; i < old.length; ++i) {\n var oldCur = old[i], stretchCur = stretched[i];\n if (oldCur && stretchCur) {\n spans: for (var j = 0; j < stretchCur.length; ++j) {\n var span = stretchCur[j];\n for (var k = 0; k < oldCur.length; ++k)\n { if (oldCur[k].marker == span.marker) { continue spans } }\n oldCur.push(span);\n }\n } else if (stretchCur) {\n old[i] = stretchCur;\n }\n }\n return old\n }\n\n // Used both to provide a JSON-safe object in .getHistory, and, when\n // detaching a document, to split the history in two\n function copyHistoryArray(events, newGroup, instantiateSel) {\n var copy = [];\n for (var i = 0; i < events.length; ++i) {\n var event = events[i];\n if (event.ranges) {\n copy.push(instantiateSel ? Selection.prototype.deepCopy.call(event) : event);\n continue\n }\n var changes = event.changes, newChanges = [];\n copy.push({changes: newChanges});\n for (var j = 0; j < changes.length; ++j) {\n var change = changes[j], m = (void 0);\n newChanges.push({from: change.from, to: change.to, text: change.text});\n if (newGroup) { for (var prop in change) { if (m = prop.match(/^spans_(\\d+)$/)) {\n if (indexOf(newGroup, Number(m[1])) > -1) {\n lst(newChanges)[prop] = change[prop];\n delete change[prop];\n }\n } } }\n }\n }\n return copy\n }\n\n // The 'scroll' parameter given to many of these indicated whether\n // the new cursor position should be scrolled into view after\n // modifying the selection.\n\n // If shift is held or the extend flag is set, extends a range to\n // include a given position (and optionally a second position).\n // Otherwise, simply returns the range between the given positions.\n // Used for cursor motion and such.\n function extendRange(range, head, other, extend) {\n if (extend) {\n var anchor = range.anchor;\n if (other) {\n var posBefore = cmp(head, anchor) < 0;\n if (posBefore != (cmp(other, anchor) < 0)) {\n anchor = head;\n head = other;\n } else if (posBefore != (cmp(head, other) < 0)) {\n head = other;\n }\n }\n return new Range(anchor, head)\n } else {\n return new Range(other || head, head)\n }\n }\n\n // Extend the primary selection range, discard the rest.\n function extendSelection(doc, head, other, options, extend) {\n if (extend == null) { extend = doc.cm && (doc.cm.display.shift || doc.extend); }\n setSelection(doc, new Selection([extendRange(doc.sel.primary(), head, other, extend)], 0), options);\n }\n\n // Extend all selections (pos is an array of selections with length\n // equal the number of selections)\n function extendSelections(doc, heads, options) {\n var out = [];\n var extend = doc.cm && (doc.cm.display.shift || doc.extend);\n for (var i = 0; i < doc.sel.ranges.length; i++)\n { out[i] = extendRange(doc.sel.ranges[i], heads[i], null, extend); }\n var newSel = normalizeSelection(doc.cm, out, doc.sel.primIndex);\n setSelection(doc, newSel, options);\n }\n\n // Updates a single range in the selection.\n function replaceOneSelection(doc, i, range, options) {\n var ranges = doc.sel.ranges.slice(0);\n ranges[i] = range;\n setSelection(doc, normalizeSelection(doc.cm, ranges, doc.sel.primIndex), options);\n }\n\n // Reset the selection to a single range.\n function setSimpleSelection(doc, anchor, head, options) {\n setSelection(doc, simpleSelection(anchor, head), options);\n }\n\n // Give beforeSelectionChange handlers a change to influence a\n // selection update.\n function filterSelectionChange(doc, sel, options) {\n var obj = {\n ranges: sel.ranges,\n update: function(ranges) {\n this.ranges = [];\n for (var i = 0; i < ranges.length; i++)\n { this.ranges[i] = new Range(clipPos(doc, ranges[i].anchor),\n clipPos(doc, ranges[i].head)); }\n },\n origin: options && options.origin\n };\n signal(doc, \"beforeSelectionChange\", doc, obj);\n if (doc.cm) { signal(doc.cm, \"beforeSelectionChange\", doc.cm, obj); }\n if (obj.ranges != sel.ranges) { return normalizeSelection(doc.cm, obj.ranges, obj.ranges.length - 1) }\n else { return sel }\n }\n\n function setSelectionReplaceHistory(doc, sel, options) {\n var done = doc.history.done, last = lst(done);\n if (last && last.ranges) {\n done[done.length - 1] = sel;\n setSelectionNoUndo(doc, sel, options);\n } else {\n setSelection(doc, sel, options);\n }\n }\n\n // Set a new selection.\n function setSelection(doc, sel, options) {\n setSelectionNoUndo(doc, sel, options);\n addSelectionToHistory(doc, doc.sel, doc.cm ? doc.cm.curOp.id : NaN, options);\n }\n\n function setSelectionNoUndo(doc, sel, options) {\n if (hasHandler(doc, \"beforeSelectionChange\") || doc.cm && hasHandler(doc.cm, \"beforeSelectionChange\"))\n { sel = filterSelectionChange(doc, sel, options); }\n\n var bias = options && options.bias ||\n (cmp(sel.primary().head, doc.sel.primary().head) < 0 ? -1 : 1);\n setSelectionInner(doc, skipAtomicInSelection(doc, sel, bias, true));\n\n if (!(options && options.scroll === false) && doc.cm && doc.cm.getOption(\"readOnly\") != \"nocursor\")\n { ensureCursorVisible(doc.cm); }\n }\n\n function setSelectionInner(doc, sel) {\n if (sel.equals(doc.sel)) { return }\n\n doc.sel = sel;\n\n if (doc.cm) {\n doc.cm.curOp.updateInput = 1;\n doc.cm.curOp.selectionChanged = true;\n signalCursorActivity(doc.cm);\n }\n signalLater(doc, \"cursorActivity\", doc);\n }\n\n // Verify that the selection does not partially select any atomic\n // marked ranges.\n function reCheckSelection(doc) {\n setSelectionInner(doc, skipAtomicInSelection(doc, doc.sel, null, false));\n }\n\n // Return a selection that does not partially select any atomic\n // ranges.\n function skipAtomicInSelection(doc, sel, bias, mayClear) {\n var out;\n for (var i = 0; i < sel.ranges.length; i++) {\n var range = sel.ranges[i];\n var old = sel.ranges.length == doc.sel.ranges.length && doc.sel.ranges[i];\n var newAnchor = skipAtomic(doc, range.anchor, old && old.anchor, bias, mayClear);\n var newHead = skipAtomic(doc, range.head, old && old.head, bias, mayClear);\n if (out || newAnchor != range.anchor || newHead != range.head) {\n if (!out) { out = sel.ranges.slice(0, i); }\n out[i] = new Range(newAnchor, newHead);\n }\n }\n return out ? normalizeSelection(doc.cm, out, sel.primIndex) : sel\n }\n\n function skipAtomicInner(doc, pos, oldPos, dir, mayClear) {\n var line = getLine(doc, pos.line);\n if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) {\n var sp = line.markedSpans[i], m = sp.marker;\n\n // Determine if we should prevent the cursor being placed to the left/right of an atomic marker\n // Historically this was determined using the inclusiveLeft/Right option, but the new way to control it\n // is with selectLeft/Right\n var preventCursorLeft = (\"selectLeft\" in m) ? !m.selectLeft : m.inclusiveLeft;\n var preventCursorRight = (\"selectRight\" in m) ? !m.selectRight : m.inclusiveRight;\n\n if ((sp.from == null || (preventCursorLeft ? sp.from <= pos.ch : sp.from < pos.ch)) &&\n (sp.to == null || (preventCursorRight ? sp.to >= pos.ch : sp.to > pos.ch))) {\n if (mayClear) {\n signal(m, \"beforeCursorEnter\");\n if (m.explicitlyCleared) {\n if (!line.markedSpans) { break }\n else {--i; continue}\n }\n }\n if (!m.atomic) { continue }\n\n if (oldPos) {\n var near = m.find(dir < 0 ? 1 : -1), diff = (void 0);\n if (dir < 0 ? preventCursorRight : preventCursorLeft)\n { near = movePos(doc, near, -dir, near && near.line == pos.line ? line : null); }\n if (near && near.line == pos.line && (diff = cmp(near, oldPos)) && (dir < 0 ? diff < 0 : diff > 0))\n { return skipAtomicInner(doc, near, pos, dir, mayClear) }\n }\n\n var far = m.find(dir < 0 ? -1 : 1);\n if (dir < 0 ? preventCursorLeft : preventCursorRight)\n { far = movePos(doc, far, dir, far.line == pos.line ? line : null); }\n return far ? skipAtomicInner(doc, far, pos, dir, mayClear) : null\n }\n } }\n return pos\n }\n\n // Ensure a given position is not inside an atomic range.\n function skipAtomic(doc, pos, oldPos, bias, mayClear) {\n var dir = bias || 1;\n var found = skipAtomicInner(doc, pos, oldPos, dir, mayClear) ||\n (!mayClear && skipAtomicInner(doc, pos, oldPos, dir, true)) ||\n skipAtomicInner(doc, pos, oldPos, -dir, mayClear) ||\n (!mayClear && skipAtomicInner(doc, pos, oldPos, -dir, true));\n if (!found) {\n doc.cantEdit = true;\n return Pos(doc.first, 0)\n }\n return found\n }\n\n function movePos(doc, pos, dir, line) {\n if (dir < 0 && pos.ch == 0) {\n if (pos.line > doc.first) { return clipPos(doc, Pos(pos.line - 1)) }\n else { return null }\n } else if (dir > 0 && pos.ch == (line || getLine(doc, pos.line)).text.length) {\n if (pos.line < doc.first + doc.size - 1) { return Pos(pos.line + 1, 0) }\n else { return null }\n } else {\n return new Pos(pos.line, pos.ch + dir)\n }\n }\n\n function selectAll(cm) {\n cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()), sel_dontScroll);\n }\n\n // UPDATING\n\n // Allow \"beforeChange\" event handlers to influence a change\n function filterChange(doc, change, update) {\n var obj = {\n canceled: false,\n from: change.from,\n to: change.to,\n text: change.text,\n origin: change.origin,\n cancel: function () { return obj.canceled = true; }\n };\n if (update) { obj.update = function (from, to, text, origin) {\n if (from) { obj.from = clipPos(doc, from); }\n if (to) { obj.to = clipPos(doc, to); }\n if (text) { obj.text = text; }\n if (origin !== undefined) { obj.origin = origin; }\n }; }\n signal(doc, \"beforeChange\", doc, obj);\n if (doc.cm) { signal(doc.cm, \"beforeChange\", doc.cm, obj); }\n\n if (obj.canceled) {\n if (doc.cm) { doc.cm.curOp.updateInput = 2; }\n return null\n }\n return {from: obj.from, to: obj.to, text: obj.text, origin: obj.origin}\n }\n\n // Apply a change to a document, and add it to the document's\n // history, and propagating it to all linked documents.\n function makeChange(doc, change, ignoreReadOnly) {\n if (doc.cm) {\n if (!doc.cm.curOp) { return operation(doc.cm, makeChange)(doc, change, ignoreReadOnly) }\n if (doc.cm.state.suppressEdits) { return }\n }\n\n if (hasHandler(doc, \"beforeChange\") || doc.cm && hasHandler(doc.cm, \"beforeChange\")) {\n change = filterChange(doc, change, true);\n if (!change) { return }\n }\n\n // Possibly split or suppress the update based on the presence\n // of read-only spans in its range.\n var split = sawReadOnlySpans && !ignoreReadOnly && removeReadOnlyRanges(doc, change.from, change.to);\n if (split) {\n for (var i = split.length - 1; i >= 0; --i)\n { makeChangeInner(doc, {from: split[i].from, to: split[i].to, text: i ? [\"\"] : change.text, origin: change.origin}); }\n } else {\n makeChangeInner(doc, change);\n }\n }\n\n function makeChangeInner(doc, change) {\n if (change.text.length == 1 && change.text[0] == \"\" && cmp(change.from, change.to) == 0) { return }\n var selAfter = computeSelAfterChange(doc, change);\n addChangeToHistory(doc, change, selAfter, doc.cm ? doc.cm.curOp.id : NaN);\n\n makeChangeSingleDoc(doc, change, selAfter, stretchSpansOverChange(doc, change));\n var rebased = [];\n\n linkedDocs(doc, function (doc, sharedHist) {\n if (!sharedHist && indexOf(rebased, doc.history) == -1) {\n rebaseHist(doc.history, change);\n rebased.push(doc.history);\n }\n makeChangeSingleDoc(doc, change, null, stretchSpansOverChange(doc, change));\n });\n }\n\n // Revert a change stored in a document's history.\n function makeChangeFromHistory(doc, type, allowSelectionOnly) {\n var suppress = doc.cm && doc.cm.state.suppressEdits;\n if (suppress && !allowSelectionOnly) { return }\n\n var hist = doc.history, event, selAfter = doc.sel;\n var source = type == \"undo\" ? hist.done : hist.undone, dest = type == \"undo\" ? hist.undone : hist.done;\n\n // Verify that there is a useable event (so that ctrl-z won't\n // needlessly clear selection events)\n var i = 0;\n for (; i < source.length; i++) {\n event = source[i];\n if (allowSelectionOnly ? event.ranges && !event.equals(doc.sel) : !event.ranges)\n { break }\n }\n if (i == source.length) { return }\n hist.lastOrigin = hist.lastSelOrigin = null;\n\n for (;;) {\n event = source.pop();\n if (event.ranges) {\n pushSelectionToHistory(event, dest);\n if (allowSelectionOnly && !event.equals(doc.sel)) {\n setSelection(doc, event, {clearRedo: false});\n return\n }\n selAfter = event;\n } else if (suppress) {\n source.push(event);\n return\n } else { break }\n }\n\n // Build up a reverse change object to add to the opposite history\n // stack (redo when undoing, and vice versa).\n var antiChanges = [];\n pushSelectionToHistory(selAfter, dest);\n dest.push({changes: antiChanges, generation: hist.generation});\n hist.generation = event.generation || ++hist.maxGeneration;\n\n var filter = hasHandler(doc, \"beforeChange\") || doc.cm && hasHandler(doc.cm, \"beforeChange\");\n\n var loop = function ( i ) {\n var change = event.changes[i];\n change.origin = type;\n if (filter && !filterChange(doc, change, false)) {\n source.length = 0;\n return {}\n }\n\n antiChanges.push(historyChangeFromChange(doc, change));\n\n var after = i ? computeSelAfterChange(doc, change) : lst(source);\n makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change));\n if (!i && doc.cm) { doc.cm.scrollIntoView({from: change.from, to: changeEnd(change)}); }\n var rebased = [];\n\n // Propagate to the linked documents\n linkedDocs(doc, function (doc, sharedHist) {\n if (!sharedHist && indexOf(rebased, doc.history) == -1) {\n rebaseHist(doc.history, change);\n rebased.push(doc.history);\n }\n makeChangeSingleDoc(doc, change, null, mergeOldSpans(doc, change));\n });\n };\n\n for (var i$1 = event.changes.length - 1; i$1 >= 0; --i$1) {\n var returned = loop( i$1 );\n\n if ( returned ) return returned.v;\n }\n }\n\n // Sub-views need their line numbers shifted when text is added\n // above or below them in the parent document.\n function shiftDoc(doc, distance) {\n if (distance == 0) { return }\n doc.first += distance;\n doc.sel = new Selection(map(doc.sel.ranges, function (range) { return new Range(\n Pos(range.anchor.line + distance, range.anchor.ch),\n Pos(range.head.line + distance, range.head.ch)\n ); }), doc.sel.primIndex);\n if (doc.cm) {\n regChange(doc.cm, doc.first, doc.first - distance, distance);\n for (var d = doc.cm.display, l = d.viewFrom; l < d.viewTo; l++)\n { regLineChange(doc.cm, l, \"gutter\"); }\n }\n }\n\n // More lower-level change function, handling only a single document\n // (not linked ones).\n function makeChangeSingleDoc(doc, change, selAfter, spans) {\n if (doc.cm && !doc.cm.curOp)\n { return operation(doc.cm, makeChangeSingleDoc)(doc, change, selAfter, spans) }\n\n if (change.to.line < doc.first) {\n shiftDoc(doc, change.text.length - 1 - (change.to.line - change.from.line));\n return\n }\n if (change.from.line > doc.lastLine()) { return }\n\n // Clip the change to the size of this doc\n if (change.from.line < doc.first) {\n var shift = change.text.length - 1 - (doc.first - change.from.line);\n shiftDoc(doc, shift);\n change = {from: Pos(doc.first, 0), to: Pos(change.to.line + shift, change.to.ch),\n text: [lst(change.text)], origin: change.origin};\n }\n var last = doc.lastLine();\n if (change.to.line > last) {\n change = {from: change.from, to: Pos(last, getLine(doc, last).text.length),\n text: [change.text[0]], origin: change.origin};\n }\n\n change.removed = getBetween(doc, change.from, change.to);\n\n if (!selAfter) { selAfter = computeSelAfterChange(doc, change); }\n if (doc.cm) { makeChangeSingleDocInEditor(doc.cm, change, spans); }\n else { updateDoc(doc, change, spans); }\n setSelectionNoUndo(doc, selAfter, sel_dontScroll);\n\n if (doc.cantEdit && skipAtomic(doc, Pos(doc.firstLine(), 0)))\n { doc.cantEdit = false; }\n }\n\n // Handle the interaction of a change to a document with the editor\n // that this document is part of.\n function makeChangeSingleDocInEditor(cm, change, spans) {\n var doc = cm.doc, display = cm.display, from = change.from, to = change.to;\n\n var recomputeMaxLength = false, checkWidthStart = from.line;\n if (!cm.options.lineWrapping) {\n checkWidthStart = lineNo(visualLine(getLine(doc, from.line)));\n doc.iter(checkWidthStart, to.line + 1, function (line) {\n if (line == display.maxLine) {\n recomputeMaxLength = true;\n return true\n }\n });\n }\n\n if (doc.sel.contains(change.from, change.to) > -1)\n { signalCursorActivity(cm); }\n\n updateDoc(doc, change, spans, estimateHeight(cm));\n\n if (!cm.options.lineWrapping) {\n doc.iter(checkWidthStart, from.line + change.text.length, function (line) {\n var len = lineLength(line);\n if (len > display.maxLineLength) {\n display.maxLine = line;\n display.maxLineLength = len;\n display.maxLineChanged = true;\n recomputeMaxLength = false;\n }\n });\n if (recomputeMaxLength) { cm.curOp.updateMaxLine = true; }\n }\n\n retreatFrontier(doc, from.line);\n startWorker(cm, 400);\n\n var lendiff = change.text.length - (to.line - from.line) - 1;\n // Remember that these lines changed, for updating the display\n if (change.full)\n { regChange(cm); }\n else if (from.line == to.line && change.text.length == 1 && !isWholeLineUpdate(cm.doc, change))\n { regLineChange(cm, from.line, \"text\"); }\n else\n { regChange(cm, from.line, to.line + 1, lendiff); }\n\n var changesHandler = hasHandler(cm, \"changes\"), changeHandler = hasHandler(cm, \"change\");\n if (changeHandler || changesHandler) {\n var obj = {\n from: from, to: to,\n text: change.text,\n removed: change.removed,\n origin: change.origin\n };\n if (changeHandler) { signalLater(cm, \"change\", cm, obj); }\n if (changesHandler) { (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push(obj); }\n }\n cm.display.selForContextMenu = null;\n }\n\n function replaceRange(doc, code, from, to, origin) {\n var assign;\n\n if (!to) { to = from; }\n if (cmp(to, from) < 0) { (assign = [to, from], from = assign[0], to = assign[1]); }\n if (typeof code == \"string\") { code = doc.splitLines(code); }\n makeChange(doc, {from: from, to: to, text: code, origin: origin});\n }\n\n // Rebasing/resetting history to deal with externally-sourced changes\n\n function rebaseHistSelSingle(pos, from, to, diff) {\n if (to < pos.line) {\n pos.line += diff;\n } else if (from < pos.line) {\n pos.line = from;\n pos.ch = 0;\n }\n }\n\n // Tries to rebase an array of history events given a change in the\n // document. If the change touches the same lines as the event, the\n // event, and everything 'behind' it, is discarded. If the change is\n // before the event, the event's positions are updated. Uses a\n // copy-on-write scheme for the positions, to avoid having to\n // reallocate them all on every rebase, but also avoid problems with\n // shared position objects being unsafely updated.\n function rebaseHistArray(array, from, to, diff) {\n for (var i = 0; i < array.length; ++i) {\n var sub = array[i], ok = true;\n if (sub.ranges) {\n if (!sub.copied) { sub = array[i] = sub.deepCopy(); sub.copied = true; }\n for (var j = 0; j < sub.ranges.length; j++) {\n rebaseHistSelSingle(sub.ranges[j].anchor, from, to, diff);\n rebaseHistSelSingle(sub.ranges[j].head, from, to, diff);\n }\n continue\n }\n for (var j$1 = 0; j$1 < sub.changes.length; ++j$1) {\n var cur = sub.changes[j$1];\n if (to < cur.from.line) {\n cur.from = Pos(cur.from.line + diff, cur.from.ch);\n cur.to = Pos(cur.to.line + diff, cur.to.ch);\n } else if (from <= cur.to.line) {\n ok = false;\n break\n }\n }\n if (!ok) {\n array.splice(0, i + 1);\n i = 0;\n }\n }\n }\n\n function rebaseHist(hist, change) {\n var from = change.from.line, to = change.to.line, diff = change.text.length - (to - from) - 1;\n rebaseHistArray(hist.done, from, to, diff);\n rebaseHistArray(hist.undone, from, to, diff);\n }\n\n // Utility for applying a change to a line by handle or number,\n // returning the number and optionally registering the line as\n // changed.\n function changeLine(doc, handle, changeType, op) {\n var no = handle, line = handle;\n if (typeof handle == \"number\") { line = getLine(doc, clipLine(doc, handle)); }\n else { no = lineNo(handle); }\n if (no == null) { return null }\n if (op(line, no) && doc.cm) { regLineChange(doc.cm, no, changeType); }\n return line\n }\n\n // The document is represented as a BTree consisting of leaves, with\n // chunk of lines in them, and branches, with up to ten leaves or\n // other branch nodes below them. The top node is always a branch\n // node, and is the document object itself (meaning it has\n // additional methods and properties).\n //\n // All nodes have parent links. The tree is used both to go from\n // line numbers to line objects, and to go from objects to numbers.\n // It also indexes by height, and is used to convert between height\n // and line object, and to find the total height of the document.\n //\n // See also http://marijnhaverbeke.nl/blog/codemirror-line-tree.html\n\n function LeafChunk(lines) {\n this.lines = lines;\n this.parent = null;\n var height = 0;\n for (var i = 0; i < lines.length; ++i) {\n lines[i].parent = this;\n height += lines[i].height;\n }\n this.height = height;\n }\n\n LeafChunk.prototype = {\n chunkSize: function() { return this.lines.length },\n\n // Remove the n lines at offset 'at'.\n removeInner: function(at, n) {\n for (var i = at, e = at + n; i < e; ++i) {\n var line = this.lines[i];\n this.height -= line.height;\n cleanUpLine(line);\n signalLater(line, \"delete\");\n }\n this.lines.splice(at, n);\n },\n\n // Helper used to collapse a small branch into a single leaf.\n collapse: function(lines) {\n lines.push.apply(lines, this.lines);\n },\n\n // Insert the given array of lines at offset 'at', count them as\n // having the given height.\n insertInner: function(at, lines, height) {\n this.height += height;\n this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at));\n for (var i = 0; i < lines.length; ++i) { lines[i].parent = this; }\n },\n\n // Used to iterate over a part of the tree.\n iterN: function(at, n, op) {\n for (var e = at + n; at < e; ++at)\n { if (op(this.lines[at])) { return true } }\n }\n };\n\n function BranchChunk(children) {\n this.children = children;\n var size = 0, height = 0;\n for (var i = 0; i < children.length; ++i) {\n var ch = children[i];\n size += ch.chunkSize(); height += ch.height;\n ch.parent = this;\n }\n this.size = size;\n this.height = height;\n this.parent = null;\n }\n\n BranchChunk.prototype = {\n chunkSize: function() { return this.size },\n\n removeInner: function(at, n) {\n this.size -= n;\n for (var i = 0; i < this.children.length; ++i) {\n var child = this.children[i], sz = child.chunkSize();\n if (at < sz) {\n var rm = Math.min(n, sz - at), oldHeight = child.height;\n child.removeInner(at, rm);\n this.height -= oldHeight - child.height;\n if (sz == rm) { this.children.splice(i--, 1); child.parent = null; }\n if ((n -= rm) == 0) { break }\n at = 0;\n } else { at -= sz; }\n }\n // If the result is smaller than 25 lines, ensure that it is a\n // single leaf node.\n if (this.size - n < 25 &&\n (this.children.length > 1 || !(this.children[0] instanceof LeafChunk))) {\n var lines = [];\n this.collapse(lines);\n this.children = [new LeafChunk(lines)];\n this.children[0].parent = this;\n }\n },\n\n collapse: function(lines) {\n for (var i = 0; i < this.children.length; ++i) { this.children[i].collapse(lines); }\n },\n\n insertInner: function(at, lines, height) {\n this.size += lines.length;\n this.height += height;\n for (var i = 0; i < this.children.length; ++i) {\n var child = this.children[i], sz = child.chunkSize();\n if (at <= sz) {\n child.insertInner(at, lines, height);\n if (child.lines && child.lines.length > 50) {\n // To avoid memory thrashing when child.lines is huge (e.g. first view of a large file), it's never spliced.\n // Instead, small slices are taken. They're taken in order because sequential memory accesses are fastest.\n var remaining = child.lines.length % 25 + 25;\n for (var pos = remaining; pos < child.lines.length;) {\n var leaf = new LeafChunk(child.lines.slice(pos, pos += 25));\n child.height -= leaf.height;\n this.children.splice(++i, 0, leaf);\n leaf.parent = this;\n }\n child.lines = child.lines.slice(0, remaining);\n this.maybeSpill();\n }\n break\n }\n at -= sz;\n }\n },\n\n // When a node has grown, check whether it should be split.\n maybeSpill: function() {\n if (this.children.length <= 10) { return }\n var me = this;\n do {\n var spilled = me.children.splice(me.children.length - 5, 5);\n var sibling = new BranchChunk(spilled);\n if (!me.parent) { // Become the parent node\n var copy = new BranchChunk(me.children);\n copy.parent = me;\n me.children = [copy, sibling];\n me = copy;\n } else {\n me.size -= sibling.size;\n me.height -= sibling.height;\n var myIndex = indexOf(me.parent.children, me);\n me.parent.children.splice(myIndex + 1, 0, sibling);\n }\n sibling.parent = me.parent;\n } while (me.children.length > 10)\n me.parent.maybeSpill();\n },\n\n iterN: function(at, n, op) {\n for (var i = 0; i < this.children.length; ++i) {\n var child = this.children[i], sz = child.chunkSize();\n if (at < sz) {\n var used = Math.min(n, sz - at);\n if (child.iterN(at, used, op)) { return true }\n if ((n -= used) == 0) { break }\n at = 0;\n } else { at -= sz; }\n }\n }\n };\n\n // Line widgets are block elements displayed above or below a line.\n\n var LineWidget = function(doc, node, options) {\n if (options) { for (var opt in options) { if (options.hasOwnProperty(opt))\n { this[opt] = options[opt]; } } }\n this.doc = doc;\n this.node = node;\n };\n\n LineWidget.prototype.clear = function () {\n var cm = this.doc.cm, ws = this.line.widgets, line = this.line, no = lineNo(line);\n if (no == null || !ws) { return }\n for (var i = 0; i < ws.length; ++i) { if (ws[i] == this) { ws.splice(i--, 1); } }\n if (!ws.length) { line.widgets = null; }\n var height = widgetHeight(this);\n updateLineHeight(line, Math.max(0, line.height - height));\n if (cm) {\n runInOp(cm, function () {\n adjustScrollWhenAboveVisible(cm, line, -height);\n regLineChange(cm, no, \"widget\");\n });\n signalLater(cm, \"lineWidgetCleared\", cm, this, no);\n }\n };\n\n LineWidget.prototype.changed = function () {\n var this$1 = this;\n\n var oldH = this.height, cm = this.doc.cm, line = this.line;\n this.height = null;\n var diff = widgetHeight(this) - oldH;\n if (!diff) { return }\n if (!lineIsHidden(this.doc, line)) { updateLineHeight(line, line.height + diff); }\n if (cm) {\n runInOp(cm, function () {\n cm.curOp.forceUpdate = true;\n adjustScrollWhenAboveVisible(cm, line, diff);\n signalLater(cm, \"lineWidgetChanged\", cm, this$1, lineNo(line));\n });\n }\n };\n eventMixin(LineWidget);\n\n function adjustScrollWhenAboveVisible(cm, line, diff) {\n if (heightAtLine(line) < ((cm.curOp && cm.curOp.scrollTop) || cm.doc.scrollTop))\n { addToScrollTop(cm, diff); }\n }\n\n function addLineWidget(doc, handle, node, options) {\n var widget = new LineWidget(doc, node, options);\n var cm = doc.cm;\n if (cm && widget.noHScroll) { cm.display.alignWidgets = true; }\n changeLine(doc, handle, \"widget\", function (line) {\n var widgets = line.widgets || (line.widgets = []);\n if (widget.insertAt == null) { widgets.push(widget); }\n else { widgets.splice(Math.min(widgets.length, Math.max(0, widget.insertAt)), 0, widget); }\n widget.line = line;\n if (cm && !lineIsHidden(doc, line)) {\n var aboveVisible = heightAtLine(line) < doc.scrollTop;\n updateLineHeight(line, line.height + widgetHeight(widget));\n if (aboveVisible) { addToScrollTop(cm, widget.height); }\n cm.curOp.forceUpdate = true;\n }\n return true\n });\n if (cm) { signalLater(cm, \"lineWidgetAdded\", cm, widget, typeof handle == \"number\" ? handle : lineNo(handle)); }\n return widget\n }\n\n // TEXTMARKERS\n\n // Created with markText and setBookmark methods. A TextMarker is a\n // handle that can be used to clear or find a marked position in the\n // document. Line objects hold arrays (markedSpans) containing\n // {from, to, marker} object pointing to such marker objects, and\n // indicating that such a marker is present on that line. Multiple\n // lines may point to the same marker when it spans across lines.\n // The spans will have null for their from/to properties when the\n // marker continues beyond the start/end of the line. Markers have\n // links back to the lines they currently touch.\n\n // Collapsed markers have unique ids, in order to be able to order\n // them, which is needed for uniquely determining an outer marker\n // when they overlap (they may nest, but not partially overlap).\n var nextMarkerId = 0;\n\n var TextMarker = function(doc, type) {\n this.lines = [];\n this.type = type;\n this.doc = doc;\n this.id = ++nextMarkerId;\n };\n\n // Clear the marker.\n TextMarker.prototype.clear = function () {\n if (this.explicitlyCleared) { return }\n var cm = this.doc.cm, withOp = cm && !cm.curOp;\n if (withOp) { startOperation(cm); }\n if (hasHandler(this, \"clear\")) {\n var found = this.find();\n if (found) { signalLater(this, \"clear\", found.from, found.to); }\n }\n var min = null, max = null;\n for (var i = 0; i < this.lines.length; ++i) {\n var line = this.lines[i];\n var span = getMarkedSpanFor(line.markedSpans, this);\n if (cm && !this.collapsed) { regLineChange(cm, lineNo(line), \"text\"); }\n else if (cm) {\n if (span.to != null) { max = lineNo(line); }\n if (span.from != null) { min = lineNo(line); }\n }\n line.markedSpans = removeMarkedSpan(line.markedSpans, span);\n if (span.from == null && this.collapsed && !lineIsHidden(this.doc, line) && cm)\n { updateLineHeight(line, textHeight(cm.display)); }\n }\n if (cm && this.collapsed && !cm.options.lineWrapping) { for (var i$1 = 0; i$1 < this.lines.length; ++i$1) {\n var visual = visualLine(this.lines[i$1]), len = lineLength(visual);\n if (len > cm.display.maxLineLength) {\n cm.display.maxLine = visual;\n cm.display.maxLineLength = len;\n cm.display.maxLineChanged = true;\n }\n } }\n\n if (min != null && cm && this.collapsed) { regChange(cm, min, max + 1); }\n this.lines.length = 0;\n this.explicitlyCleared = true;\n if (this.atomic && this.doc.cantEdit) {\n this.doc.cantEdit = false;\n if (cm) { reCheckSelection(cm.doc); }\n }\n if (cm) { signalLater(cm, \"markerCleared\", cm, this, min, max); }\n if (withOp) { endOperation(cm); }\n if (this.parent) { this.parent.clear(); }\n };\n\n // Find the position of the marker in the document. Returns a {from,\n // to} object by default. Side can be passed to get a specific side\n // -- 0 (both), -1 (left), or 1 (right). When lineObj is true, the\n // Pos objects returned contain a line object, rather than a line\n // number (used to prevent looking up the same line twice).\n TextMarker.prototype.find = function (side, lineObj) {\n if (side == null && this.type == \"bookmark\") { side = 1; }\n var from, to;\n for (var i = 0; i < this.lines.length; ++i) {\n var line = this.lines[i];\n var span = getMarkedSpanFor(line.markedSpans, this);\n if (span.from != null) {\n from = Pos(lineObj ? line : lineNo(line), span.from);\n if (side == -1) { return from }\n }\n if (span.to != null) {\n to = Pos(lineObj ? line : lineNo(line), span.to);\n if (side == 1) { return to }\n }\n }\n return from && {from: from, to: to}\n };\n\n // Signals that the marker's widget changed, and surrounding layout\n // should be recomputed.\n TextMarker.prototype.changed = function () {\n var this$1 = this;\n\n var pos = this.find(-1, true), widget = this, cm = this.doc.cm;\n if (!pos || !cm) { return }\n runInOp(cm, function () {\n var line = pos.line, lineN = lineNo(pos.line);\n var view = findViewForLine(cm, lineN);\n if (view) {\n clearLineMeasurementCacheFor(view);\n cm.curOp.selectionChanged = cm.curOp.forceUpdate = true;\n }\n cm.curOp.updateMaxLine = true;\n if (!lineIsHidden(widget.doc, line) && widget.height != null) {\n var oldHeight = widget.height;\n widget.height = null;\n var dHeight = widgetHeight(widget) - oldHeight;\n if (dHeight)\n { updateLineHeight(line, line.height + dHeight); }\n }\n signalLater(cm, \"markerChanged\", cm, this$1);\n });\n };\n\n TextMarker.prototype.attachLine = function (line) {\n if (!this.lines.length && this.doc.cm) {\n var op = this.doc.cm.curOp;\n if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1)\n { (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this); }\n }\n this.lines.push(line);\n };\n\n TextMarker.prototype.detachLine = function (line) {\n this.lines.splice(indexOf(this.lines, line), 1);\n if (!this.lines.length && this.doc.cm) {\n var op = this.doc.cm.curOp\n ;(op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this);\n }\n };\n eventMixin(TextMarker);\n\n // Create a marker, wire it up to the right lines, and\n function markText(doc, from, to, options, type) {\n // Shared markers (across linked documents) are handled separately\n // (markTextShared will call out to this again, once per\n // document).\n if (options && options.shared) { return markTextShared(doc, from, to, options, type) }\n // Ensure we are in an operation.\n if (doc.cm && !doc.cm.curOp) { return operation(doc.cm, markText)(doc, from, to, options, type) }\n\n var marker = new TextMarker(doc, type), diff = cmp(from, to);\n if (options) { copyObj(options, marker, false); }\n // Don't connect empty markers unless clearWhenEmpty is false\n if (diff > 0 || diff == 0 && marker.clearWhenEmpty !== false)\n { return marker }\n if (marker.replacedWith) {\n // Showing up as a widget implies collapsed (widget replaces text)\n marker.collapsed = true;\n marker.widgetNode = eltP(\"span\", [marker.replacedWith], \"CodeMirror-widget\");\n if (!options.handleMouseEvents) { marker.widgetNode.setAttribute(\"cm-ignore-events\", \"true\"); }\n if (options.insertLeft) { marker.widgetNode.insertLeft = true; }\n }\n if (marker.collapsed) {\n if (conflictingCollapsedRange(doc, from.line, from, to, marker) ||\n from.line != to.line && conflictingCollapsedRange(doc, to.line, from, to, marker))\n { throw new Error(\"Inserting collapsed marker partially overlapping an existing one\") }\n seeCollapsedSpans();\n }\n\n if (marker.addToHistory)\n { addChangeToHistory(doc, {from: from, to: to, origin: \"markText\"}, doc.sel, NaN); }\n\n var curLine = from.line, cm = doc.cm, updateMaxLine;\n doc.iter(curLine, to.line + 1, function (line) {\n if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(line) == cm.display.maxLine)\n { updateMaxLine = true; }\n if (marker.collapsed && curLine != from.line) { updateLineHeight(line, 0); }\n addMarkedSpan(line, new MarkedSpan(marker,\n curLine == from.line ? from.ch : null,\n curLine == to.line ? to.ch : null));\n ++curLine;\n });\n // lineIsHidden depends on the presence of the spans, so needs a second pass\n if (marker.collapsed) { doc.iter(from.line, to.line + 1, function (line) {\n if (lineIsHidden(doc, line)) { updateLineHeight(line, 0); }\n }); }\n\n if (marker.clearOnEnter) { on(marker, \"beforeCursorEnter\", function () { return marker.clear(); }); }\n\n if (marker.readOnly) {\n seeReadOnlySpans();\n if (doc.history.done.length || doc.history.undone.length)\n { doc.clearHistory(); }\n }\n if (marker.collapsed) {\n marker.id = ++nextMarkerId;\n marker.atomic = true;\n }\n if (cm) {\n // Sync editor state\n if (updateMaxLine) { cm.curOp.updateMaxLine = true; }\n if (marker.collapsed)\n { regChange(cm, from.line, to.line + 1); }\n else if (marker.className || marker.startStyle || marker.endStyle || marker.css ||\n marker.attributes || marker.title)\n { for (var i = from.line; i <= to.line; i++) { regLineChange(cm, i, \"text\"); } }\n if (marker.atomic) { reCheckSelection(cm.doc); }\n signalLater(cm, \"markerAdded\", cm, marker);\n }\n return marker\n }\n\n // SHARED TEXTMARKERS\n\n // A shared marker spans multiple linked documents. It is\n // implemented as a meta-marker-object controlling multiple normal\n // markers.\n var SharedTextMarker = function(markers, primary) {\n this.markers = markers;\n this.primary = primary;\n for (var i = 0; i < markers.length; ++i)\n { markers[i].parent = this; }\n };\n\n SharedTextMarker.prototype.clear = function () {\n if (this.explicitlyCleared) { return }\n this.explicitlyCleared = true;\n for (var i = 0; i < this.markers.length; ++i)\n { this.markers[i].clear(); }\n signalLater(this, \"clear\");\n };\n\n SharedTextMarker.prototype.find = function (side, lineObj) {\n return this.primary.find(side, lineObj)\n };\n eventMixin(SharedTextMarker);\n\n function markTextShared(doc, from, to, options, type) {\n options = copyObj(options);\n options.shared = false;\n var markers = [markText(doc, from, to, options, type)], primary = markers[0];\n var widget = options.widgetNode;\n linkedDocs(doc, function (doc) {\n if (widget) { options.widgetNode = widget.cloneNode(true); }\n markers.push(markText(doc, clipPos(doc, from), clipPos(doc, to), options, type));\n for (var i = 0; i < doc.linked.length; ++i)\n { if (doc.linked[i].isParent) { return } }\n primary = lst(markers);\n });\n return new SharedTextMarker(markers, primary)\n }\n\n function findSharedMarkers(doc) {\n return doc.findMarks(Pos(doc.first, 0), doc.clipPos(Pos(doc.lastLine())), function (m) { return m.parent; })\n }\n\n function copySharedMarkers(doc, markers) {\n for (var i = 0; i < markers.length; i++) {\n var marker = markers[i], pos = marker.find();\n var mFrom = doc.clipPos(pos.from), mTo = doc.clipPos(pos.to);\n if (cmp(mFrom, mTo)) {\n var subMark = markText(doc, mFrom, mTo, marker.primary, marker.primary.type);\n marker.markers.push(subMark);\n subMark.parent = marker;\n }\n }\n }\n\n function detachSharedMarkers(markers) {\n var loop = function ( i ) {\n var marker = markers[i], linked = [marker.primary.doc];\n linkedDocs(marker.primary.doc, function (d) { return linked.push(d); });\n for (var j = 0; j < marker.markers.length; j++) {\n var subMarker = marker.markers[j];\n if (indexOf(linked, subMarker.doc) == -1) {\n subMarker.parent = null;\n marker.markers.splice(j--, 1);\n }\n }\n };\n\n for (var i = 0; i < markers.length; i++) loop( i );\n }\n\n var nextDocId = 0;\n var Doc = function(text, mode, firstLine, lineSep, direction) {\n if (!(this instanceof Doc)) { return new Doc(text, mode, firstLine, lineSep, direction) }\n if (firstLine == null) { firstLine = 0; }\n\n BranchChunk.call(this, [new LeafChunk([new Line(\"\", null)])]);\n this.first = firstLine;\n this.scrollTop = this.scrollLeft = 0;\n this.cantEdit = false;\n this.cleanGeneration = 1;\n this.modeFrontier = this.highlightFrontier = firstLine;\n var start = Pos(firstLine, 0);\n this.sel = simpleSelection(start);\n this.history = new History(null);\n this.id = ++nextDocId;\n this.modeOption = mode;\n this.lineSep = lineSep;\n this.direction = (direction == \"rtl\") ? \"rtl\" : \"ltr\";\n this.extend = false;\n\n if (typeof text == \"string\") { text = this.splitLines(text); }\n updateDoc(this, {from: start, to: start, text: text});\n setSelection(this, simpleSelection(start), sel_dontScroll);\n };\n\n Doc.prototype = createObj(BranchChunk.prototype, {\n constructor: Doc,\n // Iterate over the document. Supports two forms -- with only one\n // argument, it calls that for each line in the document. With\n // three, it iterates over the range given by the first two (with\n // the second being non-inclusive).\n iter: function(from, to, op) {\n if (op) { this.iterN(from - this.first, to - from, op); }\n else { this.iterN(this.first, this.first + this.size, from); }\n },\n\n // Non-public interface for adding and removing lines.\n insert: function(at, lines) {\n var height = 0;\n for (var i = 0; i < lines.length; ++i) { height += lines[i].height; }\n this.insertInner(at - this.first, lines, height);\n },\n remove: function(at, n) { this.removeInner(at - this.first, n); },\n\n // From here, the methods are part of the public interface. Most\n // are also available from CodeMirror (editor) instances.\n\n getValue: function(lineSep) {\n var lines = getLines(this, this.first, this.first + this.size);\n if (lineSep === false) { return lines }\n return lines.join(lineSep || this.lineSeparator())\n },\n setValue: docMethodOp(function(code) {\n var top = Pos(this.first, 0), last = this.first + this.size - 1;\n makeChange(this, {from: top, to: Pos(last, getLine(this, last).text.length),\n text: this.splitLines(code), origin: \"setValue\", full: true}, true);\n if (this.cm) { scrollToCoords(this.cm, 0, 0); }\n setSelection(this, simpleSelection(top), sel_dontScroll);\n }),\n replaceRange: function(code, from, to, origin) {\n from = clipPos(this, from);\n to = to ? clipPos(this, to) : from;\n replaceRange(this, code, from, to, origin);\n },\n getRange: function(from, to, lineSep) {\n var lines = getBetween(this, clipPos(this, from), clipPos(this, to));\n if (lineSep === false) { return lines }\n return lines.join(lineSep || this.lineSeparator())\n },\n\n getLine: function(line) {var l = this.getLineHandle(line); return l && l.text},\n\n getLineHandle: function(line) {if (isLine(this, line)) { return getLine(this, line) }},\n getLineNumber: function(line) {return lineNo(line)},\n\n getLineHandleVisualStart: function(line) {\n if (typeof line == \"number\") { line = getLine(this, line); }\n return visualLine(line)\n },\n\n lineCount: function() {return this.size},\n firstLine: function() {return this.first},\n lastLine: function() {return this.first + this.size - 1},\n\n clipPos: function(pos) {return clipPos(this, pos)},\n\n getCursor: function(start) {\n var range = this.sel.primary(), pos;\n if (start == null || start == \"head\") { pos = range.head; }\n else if (start == \"anchor\") { pos = range.anchor; }\n else if (start == \"end\" || start == \"to\" || start === false) { pos = range.to(); }\n else { pos = range.from(); }\n return pos\n },\n listSelections: function() { return this.sel.ranges },\n somethingSelected: function() {return this.sel.somethingSelected()},\n\n setCursor: docMethodOp(function(line, ch, options) {\n setSimpleSelection(this, clipPos(this, typeof line == \"number\" ? Pos(line, ch || 0) : line), null, options);\n }),\n setSelection: docMethodOp(function(anchor, head, options) {\n setSimpleSelection(this, clipPos(this, anchor), clipPos(this, head || anchor), options);\n }),\n extendSelection: docMethodOp(function(head, other, options) {\n extendSelection(this, clipPos(this, head), other && clipPos(this, other), options);\n }),\n extendSelections: docMethodOp(function(heads, options) {\n extendSelections(this, clipPosArray(this, heads), options);\n }),\n extendSelectionsBy: docMethodOp(function(f, options) {\n var heads = map(this.sel.ranges, f);\n extendSelections(this, clipPosArray(this, heads), options);\n }),\n setSelections: docMethodOp(function(ranges, primary, options) {\n if (!ranges.length) { return }\n var out = [];\n for (var i = 0; i < ranges.length; i++)\n { out[i] = new Range(clipPos(this, ranges[i].anchor),\n clipPos(this, ranges[i].head || ranges[i].anchor)); }\n if (primary == null) { primary = Math.min(ranges.length - 1, this.sel.primIndex); }\n setSelection(this, normalizeSelection(this.cm, out, primary), options);\n }),\n addSelection: docMethodOp(function(anchor, head, options) {\n var ranges = this.sel.ranges.slice(0);\n ranges.push(new Range(clipPos(this, anchor), clipPos(this, head || anchor)));\n setSelection(this, normalizeSelection(this.cm, ranges, ranges.length - 1), options);\n }),\n\n getSelection: function(lineSep) {\n var ranges = this.sel.ranges, lines;\n for (var i = 0; i < ranges.length; i++) {\n var sel = getBetween(this, ranges[i].from(), ranges[i].to());\n lines = lines ? lines.concat(sel) : sel;\n }\n if (lineSep === false) { return lines }\n else { return lines.join(lineSep || this.lineSeparator()) }\n },\n getSelections: function(lineSep) {\n var parts = [], ranges = this.sel.ranges;\n for (var i = 0; i < ranges.length; i++) {\n var sel = getBetween(this, ranges[i].from(), ranges[i].to());\n if (lineSep !== false) { sel = sel.join(lineSep || this.lineSeparator()); }\n parts[i] = sel;\n }\n return parts\n },\n replaceSelection: function(code, collapse, origin) {\n var dup = [];\n for (var i = 0; i < this.sel.ranges.length; i++)\n { dup[i] = code; }\n this.replaceSelections(dup, collapse, origin || \"+input\");\n },\n replaceSelections: docMethodOp(function(code, collapse, origin) {\n var changes = [], sel = this.sel;\n for (var i = 0; i < sel.ranges.length; i++) {\n var range = sel.ranges[i];\n changes[i] = {from: range.from(), to: range.to(), text: this.splitLines(code[i]), origin: origin};\n }\n var newSel = collapse && collapse != \"end\" && computeReplacedSel(this, changes, collapse);\n for (var i$1 = changes.length - 1; i$1 >= 0; i$1--)\n { makeChange(this, changes[i$1]); }\n if (newSel) { setSelectionReplaceHistory(this, newSel); }\n else if (this.cm) { ensureCursorVisible(this.cm); }\n }),\n undo: docMethodOp(function() {makeChangeFromHistory(this, \"undo\");}),\n redo: docMethodOp(function() {makeChangeFromHistory(this, \"redo\");}),\n undoSelection: docMethodOp(function() {makeChangeFromHistory(this, \"undo\", true);}),\n redoSelection: docMethodOp(function() {makeChangeFromHistory(this, \"redo\", true);}),\n\n setExtending: function(val) {this.extend = val;},\n getExtending: function() {return this.extend},\n\n historySize: function() {\n var hist = this.history, done = 0, undone = 0;\n for (var i = 0; i < hist.done.length; i++) { if (!hist.done[i].ranges) { ++done; } }\n for (var i$1 = 0; i$1 < hist.undone.length; i$1++) { if (!hist.undone[i$1].ranges) { ++undone; } }\n return {undo: done, redo: undone}\n },\n clearHistory: function() {\n var this$1 = this;\n\n this.history = new History(this.history);\n linkedDocs(this, function (doc) { return doc.history = this$1.history; }, true);\n },\n\n markClean: function() {\n this.cleanGeneration = this.changeGeneration(true);\n },\n changeGeneration: function(forceSplit) {\n if (forceSplit)\n { this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null; }\n return this.history.generation\n },\n isClean: function (gen) {\n return this.history.generation == (gen || this.cleanGeneration)\n },\n\n getHistory: function() {\n return {done: copyHistoryArray(this.history.done),\n undone: copyHistoryArray(this.history.undone)}\n },\n setHistory: function(histData) {\n var hist = this.history = new History(this.history);\n hist.done = copyHistoryArray(histData.done.slice(0), null, true);\n hist.undone = copyHistoryArray(histData.undone.slice(0), null, true);\n },\n\n setGutterMarker: docMethodOp(function(line, gutterID, value) {\n return changeLine(this, line, \"gutter\", function (line) {\n var markers = line.gutterMarkers || (line.gutterMarkers = {});\n markers[gutterID] = value;\n if (!value && isEmpty(markers)) { line.gutterMarkers = null; }\n return true\n })\n }),\n\n clearGutter: docMethodOp(function(gutterID) {\n var this$1 = this;\n\n this.iter(function (line) {\n if (line.gutterMarkers && line.gutterMarkers[gutterID]) {\n changeLine(this$1, line, \"gutter\", function () {\n line.gutterMarkers[gutterID] = null;\n if (isEmpty(line.gutterMarkers)) { line.gutterMarkers = null; }\n return true\n });\n }\n });\n }),\n\n lineInfo: function(line) {\n var n;\n if (typeof line == \"number\") {\n if (!isLine(this, line)) { return null }\n n = line;\n line = getLine(this, line);\n if (!line) { return null }\n } else {\n n = lineNo(line);\n if (n == null) { return null }\n }\n return {line: n, handle: line, text: line.text, gutterMarkers: line.gutterMarkers,\n textClass: line.textClass, bgClass: line.bgClass, wrapClass: line.wrapClass,\n widgets: line.widgets}\n },\n\n addLineClass: docMethodOp(function(handle, where, cls) {\n return changeLine(this, handle, where == \"gutter\" ? \"gutter\" : \"class\", function (line) {\n var prop = where == \"text\" ? \"textClass\"\n : where == \"background\" ? \"bgClass\"\n : where == \"gutter\" ? \"gutterClass\" : \"wrapClass\";\n if (!line[prop]) { line[prop] = cls; }\n else if (classTest(cls).test(line[prop])) { return false }\n else { line[prop] += \" \" + cls; }\n return true\n })\n }),\n removeLineClass: docMethodOp(function(handle, where, cls) {\n return changeLine(this, handle, where == \"gutter\" ? \"gutter\" : \"class\", function (line) {\n var prop = where == \"text\" ? \"textClass\"\n : where == \"background\" ? \"bgClass\"\n : where == \"gutter\" ? \"gutterClass\" : \"wrapClass\";\n var cur = line[prop];\n if (!cur) { return false }\n else if (cls == null) { line[prop] = null; }\n else {\n var found = cur.match(classTest(cls));\n if (!found) { return false }\n var end = found.index + found[0].length;\n line[prop] = cur.slice(0, found.index) + (!found.index || end == cur.length ? \"\" : \" \") + cur.slice(end) || null;\n }\n return true\n })\n }),\n\n addLineWidget: docMethodOp(function(handle, node, options) {\n return addLineWidget(this, handle, node, options)\n }),\n removeLineWidget: function(widget) { widget.clear(); },\n\n markText: function(from, to, options) {\n return markText(this, clipPos(this, from), clipPos(this, to), options, options && options.type || \"range\")\n },\n setBookmark: function(pos, options) {\n var realOpts = {replacedWith: options && (options.nodeType == null ? options.widget : options),\n insertLeft: options && options.insertLeft,\n clearWhenEmpty: false, shared: options && options.shared,\n handleMouseEvents: options && options.handleMouseEvents};\n pos = clipPos(this, pos);\n return markText(this, pos, pos, realOpts, \"bookmark\")\n },\n findMarksAt: function(pos) {\n pos = clipPos(this, pos);\n var markers = [], spans = getLine(this, pos.line).markedSpans;\n if (spans) { for (var i = 0; i < spans.length; ++i) {\n var span = spans[i];\n if ((span.from == null || span.from <= pos.ch) &&\n (span.to == null || span.to >= pos.ch))\n { markers.push(span.marker.parent || span.marker); }\n } }\n return markers\n },\n findMarks: function(from, to, filter) {\n from = clipPos(this, from); to = clipPos(this, to);\n var found = [], lineNo = from.line;\n this.iter(from.line, to.line + 1, function (line) {\n var spans = line.markedSpans;\n if (spans) { for (var i = 0; i < spans.length; i++) {\n var span = spans[i];\n if (!(span.to != null && lineNo == from.line && from.ch >= span.to ||\n span.from == null && lineNo != from.line ||\n span.from != null && lineNo == to.line && span.from >= to.ch) &&\n (!filter || filter(span.marker)))\n { found.push(span.marker.parent || span.marker); }\n } }\n ++lineNo;\n });\n return found\n },\n getAllMarks: function() {\n var markers = [];\n this.iter(function (line) {\n var sps = line.markedSpans;\n if (sps) { for (var i = 0; i < sps.length; ++i)\n { if (sps[i].from != null) { markers.push(sps[i].marker); } } }\n });\n return markers\n },\n\n posFromIndex: function(off) {\n var ch, lineNo = this.first, sepSize = this.lineSeparator().length;\n this.iter(function (line) {\n var sz = line.text.length + sepSize;\n if (sz > off) { ch = off; return true }\n off -= sz;\n ++lineNo;\n });\n return clipPos(this, Pos(lineNo, ch))\n },\n indexFromPos: function (coords) {\n coords = clipPos(this, coords);\n var index = coords.ch;\n if (coords.line < this.first || coords.ch < 0) { return 0 }\n var sepSize = this.lineSeparator().length;\n this.iter(this.first, coords.line, function (line) { // iter aborts when callback returns a truthy value\n index += line.text.length + sepSize;\n });\n return index\n },\n\n copy: function(copyHistory) {\n var doc = new Doc(getLines(this, this.first, this.first + this.size),\n this.modeOption, this.first, this.lineSep, this.direction);\n doc.scrollTop = this.scrollTop; doc.scrollLeft = this.scrollLeft;\n doc.sel = this.sel;\n doc.extend = false;\n if (copyHistory) {\n doc.history.undoDepth = this.history.undoDepth;\n doc.setHistory(this.getHistory());\n }\n return doc\n },\n\n linkedDoc: function(options) {\n if (!options) { options = {}; }\n var from = this.first, to = this.first + this.size;\n if (options.from != null && options.from > from) { from = options.from; }\n if (options.to != null && options.to < to) { to = options.to; }\n var copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from, this.lineSep, this.direction);\n if (options.sharedHist) { copy.history = this.history\n ; }(this.linked || (this.linked = [])).push({doc: copy, sharedHist: options.sharedHist});\n copy.linked = [{doc: this, isParent: true, sharedHist: options.sharedHist}];\n copySharedMarkers(copy, findSharedMarkers(this));\n return copy\n },\n unlinkDoc: function(other) {\n if (other instanceof CodeMirror) { other = other.doc; }\n if (this.linked) { for (var i = 0; i < this.linked.length; ++i) {\n var link = this.linked[i];\n if (link.doc != other) { continue }\n this.linked.splice(i, 1);\n other.unlinkDoc(this);\n detachSharedMarkers(findSharedMarkers(this));\n break\n } }\n // If the histories were shared, split them again\n if (other.history == this.history) {\n var splitIds = [other.id];\n linkedDocs(other, function (doc) { return splitIds.push(doc.id); }, true);\n other.history = new History(null);\n other.history.done = copyHistoryArray(this.history.done, splitIds);\n other.history.undone = copyHistoryArray(this.history.undone, splitIds);\n }\n },\n iterLinkedDocs: function(f) {linkedDocs(this, f);},\n\n getMode: function() {return this.mode},\n getEditor: function() {return this.cm},\n\n splitLines: function(str) {\n if (this.lineSep) { return str.split(this.lineSep) }\n return splitLinesAuto(str)\n },\n lineSeparator: function() { return this.lineSep || \"\\n\" },\n\n setDirection: docMethodOp(function (dir) {\n if (dir != \"rtl\") { dir = \"ltr\"; }\n if (dir == this.direction) { return }\n this.direction = dir;\n this.iter(function (line) { return line.order = null; });\n if (this.cm) { directionChanged(this.cm); }\n })\n });\n\n // Public alias.\n Doc.prototype.eachLine = Doc.prototype.iter;\n\n // Kludge to work around strange IE behavior where it'll sometimes\n // re-fire a series of drag-related events right after the drop (#1551)\n var lastDrop = 0;\n\n function onDrop(e) {\n var cm = this;\n clearDragCursor(cm);\n if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e))\n { return }\n e_preventDefault(e);\n if (ie) { lastDrop = +new Date; }\n var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files;\n if (!pos || cm.isReadOnly()) { return }\n // Might be a file drop, in which case we simply extract the text\n // and insert it.\n if (files && files.length && window.FileReader && window.File) {\n var n = files.length, text = Array(n), read = 0;\n var markAsReadAndPasteIfAllFilesAreRead = function () {\n if (++read == n) {\n operation(cm, function () {\n pos = clipPos(cm.doc, pos);\n var change = {from: pos, to: pos,\n text: cm.doc.splitLines(\n text.filter(function (t) { return t != null; }).join(cm.doc.lineSeparator())),\n origin: \"paste\"};\n makeChange(cm.doc, change);\n setSelectionReplaceHistory(cm.doc, simpleSelection(clipPos(cm.doc, pos), clipPos(cm.doc, changeEnd(change))));\n })();\n }\n };\n var readTextFromFile = function (file, i) {\n if (cm.options.allowDropFileTypes &&\n indexOf(cm.options.allowDropFileTypes, file.type) == -1) {\n markAsReadAndPasteIfAllFilesAreRead();\n return\n }\n var reader = new FileReader;\n reader.onerror = function () { return markAsReadAndPasteIfAllFilesAreRead(); };\n reader.onload = function () {\n var content = reader.result;\n if (/[\\x00-\\x08\\x0e-\\x1f]{2}/.test(content)) {\n markAsReadAndPasteIfAllFilesAreRead();\n return\n }\n text[i] = content;\n markAsReadAndPasteIfAllFilesAreRead();\n };\n reader.readAsText(file);\n };\n for (var i = 0; i < files.length; i++) { readTextFromFile(files[i], i); }\n } else { // Normal drop\n // Don't do a replace if the drop happened inside of the selected text.\n if (cm.state.draggingText && cm.doc.sel.contains(pos) > -1) {\n cm.state.draggingText(e);\n // Ensure the editor is re-focused\n setTimeout(function () { return cm.display.input.focus(); }, 20);\n return\n }\n try {\n var text$1 = e.dataTransfer.getData(\"Text\");\n if (text$1) {\n var selected;\n if (cm.state.draggingText && !cm.state.draggingText.copy)\n { selected = cm.listSelections(); }\n setSelectionNoUndo(cm.doc, simpleSelection(pos, pos));\n if (selected) { for (var i$1 = 0; i$1 < selected.length; ++i$1)\n { replaceRange(cm.doc, \"\", selected[i$1].anchor, selected[i$1].head, \"drag\"); } }\n cm.replaceSelection(text$1, \"around\", \"paste\");\n cm.display.input.focus();\n }\n }\n catch(e$1){}\n }\n }\n\n function onDragStart(cm, e) {\n if (ie && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return }\n if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) { return }\n\n e.dataTransfer.setData(\"Text\", cm.getSelection());\n e.dataTransfer.effectAllowed = \"copyMove\";\n\n // Use dummy image instead of default browsers image.\n // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there.\n if (e.dataTransfer.setDragImage && !safari) {\n var img = elt(\"img\", null, null, \"position: fixed; left: 0; top: 0;\");\n img.src = \"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\";\n if (presto) {\n img.width = img.height = 1;\n cm.display.wrapper.appendChild(img);\n // Force a relayout, or Opera won't use our image for some obscure reason\n img._top = img.offsetTop;\n }\n e.dataTransfer.setDragImage(img, 0, 0);\n if (presto) { img.parentNode.removeChild(img); }\n }\n }\n\n function onDragOver(cm, e) {\n var pos = posFromMouse(cm, e);\n if (!pos) { return }\n var frag = document.createDocumentFragment();\n drawSelectionCursor(cm, pos, frag);\n if (!cm.display.dragCursor) {\n cm.display.dragCursor = elt(\"div\", null, \"CodeMirror-cursors CodeMirror-dragcursors\");\n cm.display.lineSpace.insertBefore(cm.display.dragCursor, cm.display.cursorDiv);\n }\n removeChildrenAndAdd(cm.display.dragCursor, frag);\n }\n\n function clearDragCursor(cm) {\n if (cm.display.dragCursor) {\n cm.display.lineSpace.removeChild(cm.display.dragCursor);\n cm.display.dragCursor = null;\n }\n }\n\n // These must be handled carefully, because naively registering a\n // handler for each editor will cause the editors to never be\n // garbage collected.\n\n function forEachCodeMirror(f) {\n if (!document.getElementsByClassName) { return }\n var byClass = document.getElementsByClassName(\"CodeMirror\"), editors = [];\n for (var i = 0; i < byClass.length; i++) {\n var cm = byClass[i].CodeMirror;\n if (cm) { editors.push(cm); }\n }\n if (editors.length) { editors[0].operation(function () {\n for (var i = 0; i < editors.length; i++) { f(editors[i]); }\n }); }\n }\n\n var globalsRegistered = false;\n function ensureGlobalHandlers() {\n if (globalsRegistered) { return }\n registerGlobalHandlers();\n globalsRegistered = true;\n }\n function registerGlobalHandlers() {\n // When the window resizes, we need to refresh active editors.\n var resizeTimer;\n on(window, \"resize\", function () {\n if (resizeTimer == null) { resizeTimer = setTimeout(function () {\n resizeTimer = null;\n forEachCodeMirror(onResize);\n }, 100); }\n });\n // When the window loses focus, we want to show the editor as blurred\n on(window, \"blur\", function () { return forEachCodeMirror(onBlur); });\n }\n // Called when the window resizes\n function onResize(cm) {\n var d = cm.display;\n // Might be a text scaling operation, clear size caches.\n d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null;\n d.scrollbarsClipped = false;\n cm.setSize();\n }\n\n var keyNames = {\n 3: \"Pause\", 8: \"Backspace\", 9: \"Tab\", 13: \"Enter\", 16: \"Shift\", 17: \"Ctrl\", 18: \"Alt\",\n 19: \"Pause\", 20: \"CapsLock\", 27: \"Esc\", 32: \"Space\", 33: \"PageUp\", 34: \"PageDown\", 35: \"End\",\n 36: \"Home\", 37: \"Left\", 38: \"Up\", 39: \"Right\", 40: \"Down\", 44: \"PrintScrn\", 45: \"Insert\",\n 46: \"Delete\", 59: \";\", 61: \"=\", 91: \"Mod\", 92: \"Mod\", 93: \"Mod\",\n 106: \"*\", 107: \"=\", 109: \"-\", 110: \".\", 111: \"/\", 145: \"ScrollLock\",\n 173: \"-\", 186: \";\", 187: \"=\", 188: \",\", 189: \"-\", 190: \".\", 191: \"/\", 192: \"`\", 219: \"[\", 220: \"\\\\\",\n 221: \"]\", 222: \"'\", 224: \"Mod\", 63232: \"Up\", 63233: \"Down\", 63234: \"Left\", 63235: \"Right\", 63272: \"Delete\",\n 63273: \"Home\", 63275: \"End\", 63276: \"PageUp\", 63277: \"PageDown\", 63302: \"Insert\"\n };\n\n // Number keys\n for (var i = 0; i < 10; i++) { keyNames[i + 48] = keyNames[i + 96] = String(i); }\n // Alphabetic keys\n for (var i$1 = 65; i$1 <= 90; i$1++) { keyNames[i$1] = String.fromCharCode(i$1); }\n // Function keys\n for (var i$2 = 1; i$2 <= 12; i$2++) { keyNames[i$2 + 111] = keyNames[i$2 + 63235] = \"F\" + i$2; }\n\n var keyMap = {};\n\n keyMap.basic = {\n \"Left\": \"goCharLeft\", \"Right\": \"goCharRight\", \"Up\": \"goLineUp\", \"Down\": \"goLineDown\",\n \"End\": \"goLineEnd\", \"Home\": \"goLineStartSmart\", \"PageUp\": \"goPageUp\", \"PageDown\": \"goPageDown\",\n \"Delete\": \"delCharAfter\", \"Backspace\": \"delCharBefore\", \"Shift-Backspace\": \"delCharBefore\",\n \"Tab\": \"defaultTab\", \"Shift-Tab\": \"indentAuto\",\n \"Enter\": \"newlineAndIndent\", \"Insert\": \"toggleOverwrite\",\n \"Esc\": \"singleSelection\"\n };\n // Note that the save and find-related commands aren't defined by\n // default. User code or addons can define them. Unknown commands\n // are simply ignored.\n keyMap.pcDefault = {\n \"Ctrl-A\": \"selectAll\", \"Ctrl-D\": \"deleteLine\", \"Ctrl-Z\": \"undo\", \"Shift-Ctrl-Z\": \"redo\", \"Ctrl-Y\": \"redo\",\n \"Ctrl-Home\": \"goDocStart\", \"Ctrl-End\": \"goDocEnd\", \"Ctrl-Up\": \"goLineUp\", \"Ctrl-Down\": \"goLineDown\",\n \"Ctrl-Left\": \"goGroupLeft\", \"Ctrl-Right\": \"goGroupRight\", \"Alt-Left\": \"goLineStart\", \"Alt-Right\": \"goLineEnd\",\n \"Ctrl-Backspace\": \"delGroupBefore\", \"Ctrl-Delete\": \"delGroupAfter\", \"Ctrl-S\": \"save\", \"Ctrl-F\": \"find\",\n \"Ctrl-G\": \"findNext\", \"Shift-Ctrl-G\": \"findPrev\", \"Shift-Ctrl-F\": \"replace\", \"Shift-Ctrl-R\": \"replaceAll\",\n \"Ctrl-[\": \"indentLess\", \"Ctrl-]\": \"indentMore\",\n \"Ctrl-U\": \"undoSelection\", \"Shift-Ctrl-U\": \"redoSelection\", \"Alt-U\": \"redoSelection\",\n \"fallthrough\": \"basic\"\n };\n // Very basic readline/emacs-style bindings, which are standard on Mac.\n keyMap.emacsy = {\n \"Ctrl-F\": \"goCharRight\", \"Ctrl-B\": \"goCharLeft\", \"Ctrl-P\": \"goLineUp\", \"Ctrl-N\": \"goLineDown\",\n \"Ctrl-A\": \"goLineStart\", \"Ctrl-E\": \"goLineEnd\", \"Ctrl-V\": \"goPageDown\", \"Shift-Ctrl-V\": \"goPageUp\",\n \"Ctrl-D\": \"delCharAfter\", \"Ctrl-H\": \"delCharBefore\", \"Alt-Backspace\": \"delWordBefore\", \"Ctrl-K\": \"killLine\",\n \"Ctrl-T\": \"transposeChars\", \"Ctrl-O\": \"openLine\"\n };\n keyMap.macDefault = {\n \"Cmd-A\": \"selectAll\", \"Cmd-D\": \"deleteLine\", \"Cmd-Z\": \"undo\", \"Shift-Cmd-Z\": \"redo\", \"Cmd-Y\": \"redo\",\n \"Cmd-Home\": \"goDocStart\", \"Cmd-Up\": \"goDocStart\", \"Cmd-End\": \"goDocEnd\", \"Cmd-Down\": \"goDocEnd\", \"Alt-Left\": \"goGroupLeft\",\n \"Alt-Right\": \"goGroupRight\", \"Cmd-Left\": \"goLineLeft\", \"Cmd-Right\": \"goLineRight\", \"Alt-Backspace\": \"delGroupBefore\",\n \"Ctrl-Alt-Backspace\": \"delGroupAfter\", \"Alt-Delete\": \"delGroupAfter\", \"Cmd-S\": \"save\", \"Cmd-F\": \"find\",\n \"Cmd-G\": \"findNext\", \"Shift-Cmd-G\": \"findPrev\", \"Cmd-Alt-F\": \"replace\", \"Shift-Cmd-Alt-F\": \"replaceAll\",\n \"Cmd-[\": \"indentLess\", \"Cmd-]\": \"indentMore\", \"Cmd-Backspace\": \"delWrappedLineLeft\", \"Cmd-Delete\": \"delWrappedLineRight\",\n \"Cmd-U\": \"undoSelection\", \"Shift-Cmd-U\": \"redoSelection\", \"Ctrl-Up\": \"goDocStart\", \"Ctrl-Down\": \"goDocEnd\",\n \"fallthrough\": [\"basic\", \"emacsy\"]\n };\n keyMap[\"default\"] = mac ? keyMap.macDefault : keyMap.pcDefault;\n\n // KEYMAP DISPATCH\n\n function normalizeKeyName(name) {\n var parts = name.split(/-(?!$)/);\n name = parts[parts.length - 1];\n var alt, ctrl, shift, cmd;\n for (var i = 0; i < parts.length - 1; i++) {\n var mod = parts[i];\n if (/^(cmd|meta|m)$/i.test(mod)) { cmd = true; }\n else if (/^a(lt)?$/i.test(mod)) { alt = true; }\n else if (/^(c|ctrl|control)$/i.test(mod)) { ctrl = true; }\n else if (/^s(hift)?$/i.test(mod)) { shift = true; }\n else { throw new Error(\"Unrecognized modifier name: \" + mod) }\n }\n if (alt) { name = \"Alt-\" + name; }\n if (ctrl) { name = \"Ctrl-\" + name; }\n if (cmd) { name = \"Cmd-\" + name; }\n if (shift) { name = \"Shift-\" + name; }\n return name\n }\n\n // This is a kludge to keep keymaps mostly working as raw objects\n // (backwards compatibility) while at the same time support features\n // like normalization and multi-stroke key bindings. It compiles a\n // new normalized keymap, and then updates the old object to reflect\n // this.\n function normalizeKeyMap(keymap) {\n var copy = {};\n for (var keyname in keymap) { if (keymap.hasOwnProperty(keyname)) {\n var value = keymap[keyname];\n if (/^(name|fallthrough|(de|at)tach)$/.test(keyname)) { continue }\n if (value == \"...\") { delete keymap[keyname]; continue }\n\n var keys = map(keyname.split(\" \"), normalizeKeyName);\n for (var i = 0; i < keys.length; i++) {\n var val = (void 0), name = (void 0);\n if (i == keys.length - 1) {\n name = keys.join(\" \");\n val = value;\n } else {\n name = keys.slice(0, i + 1).join(\" \");\n val = \"...\";\n }\n var prev = copy[name];\n if (!prev) { copy[name] = val; }\n else if (prev != val) { throw new Error(\"Inconsistent bindings for \" + name) }\n }\n delete keymap[keyname];\n } }\n for (var prop in copy) { keymap[prop] = copy[prop]; }\n return keymap\n }\n\n function lookupKey(key, map, handle, context) {\n map = getKeyMap(map);\n var found = map.call ? map.call(key, context) : map[key];\n if (found === false) { return \"nothing\" }\n if (found === \"...\") { return \"multi\" }\n if (found != null && handle(found)) { return \"handled\" }\n\n if (map.fallthrough) {\n if (Object.prototype.toString.call(map.fallthrough) != \"[object Array]\")\n { return lookupKey(key, map.fallthrough, handle, context) }\n for (var i = 0; i < map.fallthrough.length; i++) {\n var result = lookupKey(key, map.fallthrough[i], handle, context);\n if (result) { return result }\n }\n }\n }\n\n // Modifier key presses don't count as 'real' key presses for the\n // purpose of keymap fallthrough.\n function isModifierKey(value) {\n var name = typeof value == \"string\" ? value : keyNames[value.keyCode];\n return name == \"Ctrl\" || name == \"Alt\" || name == \"Shift\" || name == \"Mod\"\n }\n\n function addModifierNames(name, event, noShift) {\n var base = name;\n if (event.altKey && base != \"Alt\") { name = \"Alt-\" + name; }\n if ((flipCtrlCmd ? event.metaKey : event.ctrlKey) && base != \"Ctrl\") { name = \"Ctrl-\" + name; }\n if ((flipCtrlCmd ? event.ctrlKey : event.metaKey) && base != \"Mod\") { name = \"Cmd-\" + name; }\n if (!noShift && event.shiftKey && base != \"Shift\") { name = \"Shift-\" + name; }\n return name\n }\n\n // Look up the name of a key as indicated by an event object.\n function keyName(event, noShift) {\n if (presto && event.keyCode == 34 && event[\"char\"]) { return false }\n var name = keyNames[event.keyCode];\n if (name == null || event.altGraphKey) { return false }\n // Ctrl-ScrollLock has keyCode 3, same as Ctrl-Pause,\n // so we'll use event.code when available (Chrome 48+, FF 38+, Safari 10.1+)\n if (event.keyCode == 3 && event.code) { name = event.code; }\n return addModifierNames(name, event, noShift)\n }\n\n function getKeyMap(val) {\n return typeof val == \"string\" ? keyMap[val] : val\n }\n\n // Helper for deleting text near the selection(s), used to implement\n // backspace, delete, and similar functionality.\n function deleteNearSelection(cm, compute) {\n var ranges = cm.doc.sel.ranges, kill = [];\n // Build up a set of ranges to kill first, merging overlapping\n // ranges.\n for (var i = 0; i < ranges.length; i++) {\n var toKill = compute(ranges[i]);\n while (kill.length && cmp(toKill.from, lst(kill).to) <= 0) {\n var replaced = kill.pop();\n if (cmp(replaced.from, toKill.from) < 0) {\n toKill.from = replaced.from;\n break\n }\n }\n kill.push(toKill);\n }\n // Next, remove those actual ranges.\n runInOp(cm, function () {\n for (var i = kill.length - 1; i >= 0; i--)\n { replaceRange(cm.doc, \"\", kill[i].from, kill[i].to, \"+delete\"); }\n ensureCursorVisible(cm);\n });\n }\n\n function moveCharLogically(line, ch, dir) {\n var target = skipExtendingChars(line.text, ch + dir, dir);\n return target < 0 || target > line.text.length ? null : target\n }\n\n function moveLogically(line, start, dir) {\n var ch = moveCharLogically(line, start.ch, dir);\n return ch == null ? null : new Pos(start.line, ch, dir < 0 ? \"after\" : \"before\")\n }\n\n function endOfLine(visually, cm, lineObj, lineNo, dir) {\n if (visually) {\n if (cm.doc.direction == \"rtl\") { dir = -dir; }\n var order = getOrder(lineObj, cm.doc.direction);\n if (order) {\n var part = dir < 0 ? lst(order) : order[0];\n var moveInStorageOrder = (dir < 0) == (part.level == 1);\n var sticky = moveInStorageOrder ? \"after\" : \"before\";\n var ch;\n // With a wrapped rtl chunk (possibly spanning multiple bidi parts),\n // it could be that the last bidi part is not on the last visual line,\n // since visual lines contain content order-consecutive chunks.\n // Thus, in rtl, we are looking for the first (content-order) character\n // in the rtl chunk that is on the last line (that is, the same line\n // as the last (content-order) character).\n if (part.level > 0 || cm.doc.direction == \"rtl\") {\n var prep = prepareMeasureForLine(cm, lineObj);\n ch = dir < 0 ? lineObj.text.length - 1 : 0;\n var targetTop = measureCharPrepared(cm, prep, ch).top;\n ch = findFirst(function (ch) { return measureCharPrepared(cm, prep, ch).top == targetTop; }, (dir < 0) == (part.level == 1) ? part.from : part.to - 1, ch);\n if (sticky == \"before\") { ch = moveCharLogically(lineObj, ch, 1); }\n } else { ch = dir < 0 ? part.to : part.from; }\n return new Pos(lineNo, ch, sticky)\n }\n }\n return new Pos(lineNo, dir < 0 ? lineObj.text.length : 0, dir < 0 ? \"before\" : \"after\")\n }\n\n function moveVisually(cm, line, start, dir) {\n var bidi = getOrder(line, cm.doc.direction);\n if (!bidi) { return moveLogically(line, start, dir) }\n if (start.ch >= line.text.length) {\n start.ch = line.text.length;\n start.sticky = \"before\";\n } else if (start.ch <= 0) {\n start.ch = 0;\n start.sticky = \"after\";\n }\n var partPos = getBidiPartAt(bidi, start.ch, start.sticky), part = bidi[partPos];\n if (cm.doc.direction == \"ltr\" && part.level % 2 == 0 && (dir > 0 ? part.to > start.ch : part.from < start.ch)) {\n // Case 1: We move within an ltr part in an ltr editor. Even with wrapped lines,\n // nothing interesting happens.\n return moveLogically(line, start, dir)\n }\n\n var mv = function (pos, dir) { return moveCharLogically(line, pos instanceof Pos ? pos.ch : pos, dir); };\n var prep;\n var getWrappedLineExtent = function (ch) {\n if (!cm.options.lineWrapping) { return {begin: 0, end: line.text.length} }\n prep = prep || prepareMeasureForLine(cm, line);\n return wrappedLineExtentChar(cm, line, prep, ch)\n };\n var wrappedLineExtent = getWrappedLineExtent(start.sticky == \"before\" ? mv(start, -1) : start.ch);\n\n if (cm.doc.direction == \"rtl\" || part.level == 1) {\n var moveInStorageOrder = (part.level == 1) == (dir < 0);\n var ch = mv(start, moveInStorageOrder ? 1 : -1);\n if (ch != null && (!moveInStorageOrder ? ch >= part.from && ch >= wrappedLineExtent.begin : ch <= part.to && ch <= wrappedLineExtent.end)) {\n // Case 2: We move within an rtl part or in an rtl editor on the same visual line\n var sticky = moveInStorageOrder ? \"before\" : \"after\";\n return new Pos(start.line, ch, sticky)\n }\n }\n\n // Case 3: Could not move within this bidi part in this visual line, so leave\n // the current bidi part\n\n var searchInVisualLine = function (partPos, dir, wrappedLineExtent) {\n var getRes = function (ch, moveInStorageOrder) { return moveInStorageOrder\n ? new Pos(start.line, mv(ch, 1), \"before\")\n : new Pos(start.line, ch, \"after\"); };\n\n for (; partPos >= 0 && partPos < bidi.length; partPos += dir) {\n var part = bidi[partPos];\n var moveInStorageOrder = (dir > 0) == (part.level != 1);\n var ch = moveInStorageOrder ? wrappedLineExtent.begin : mv(wrappedLineExtent.end, -1);\n if (part.from <= ch && ch < part.to) { return getRes(ch, moveInStorageOrder) }\n ch = moveInStorageOrder ? part.from : mv(part.to, -1);\n if (wrappedLineExtent.begin <= ch && ch < wrappedLineExtent.end) { return getRes(ch, moveInStorageOrder) }\n }\n };\n\n // Case 3a: Look for other bidi parts on the same visual line\n var res = searchInVisualLine(partPos + dir, dir, wrappedLineExtent);\n if (res) { return res }\n\n // Case 3b: Look for other bidi parts on the next visual line\n var nextCh = dir > 0 ? wrappedLineExtent.end : mv(wrappedLineExtent.begin, -1);\n if (nextCh != null && !(dir > 0 && nextCh == line.text.length)) {\n res = searchInVisualLine(dir > 0 ? 0 : bidi.length - 1, dir, getWrappedLineExtent(nextCh));\n if (res) { return res }\n }\n\n // Case 4: Nowhere to move\n return null\n }\n\n // Commands are parameter-less actions that can be performed on an\n // editor, mostly used for keybindings.\n var commands = {\n selectAll: selectAll,\n singleSelection: function (cm) { return cm.setSelection(cm.getCursor(\"anchor\"), cm.getCursor(\"head\"), sel_dontScroll); },\n killLine: function (cm) { return deleteNearSelection(cm, function (range) {\n if (range.empty()) {\n var len = getLine(cm.doc, range.head.line).text.length;\n if (range.head.ch == len && range.head.line < cm.lastLine())\n { return {from: range.head, to: Pos(range.head.line + 1, 0)} }\n else\n { return {from: range.head, to: Pos(range.head.line, len)} }\n } else {\n return {from: range.from(), to: range.to()}\n }\n }); },\n deleteLine: function (cm) { return deleteNearSelection(cm, function (range) { return ({\n from: Pos(range.from().line, 0),\n to: clipPos(cm.doc, Pos(range.to().line + 1, 0))\n }); }); },\n delLineLeft: function (cm) { return deleteNearSelection(cm, function (range) { return ({\n from: Pos(range.from().line, 0), to: range.from()\n }); }); },\n delWrappedLineLeft: function (cm) { return deleteNearSelection(cm, function (range) {\n var top = cm.charCoords(range.head, \"div\").top + 5;\n var leftPos = cm.coordsChar({left: 0, top: top}, \"div\");\n return {from: leftPos, to: range.from()}\n }); },\n delWrappedLineRight: function (cm) { return deleteNearSelection(cm, function (range) {\n var top = cm.charCoords(range.head, \"div\").top + 5;\n var rightPos = cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, \"div\");\n return {from: range.from(), to: rightPos }\n }); },\n undo: function (cm) { return cm.undo(); },\n redo: function (cm) { return cm.redo(); },\n undoSelection: function (cm) { return cm.undoSelection(); },\n redoSelection: function (cm) { return cm.redoSelection(); },\n goDocStart: function (cm) { return cm.extendSelection(Pos(cm.firstLine(), 0)); },\n goDocEnd: function (cm) { return cm.extendSelection(Pos(cm.lastLine())); },\n goLineStart: function (cm) { return cm.extendSelectionsBy(function (range) { return lineStart(cm, range.head.line); },\n {origin: \"+move\", bias: 1}\n ); },\n goLineStartSmart: function (cm) { return cm.extendSelectionsBy(function (range) { return lineStartSmart(cm, range.head); },\n {origin: \"+move\", bias: 1}\n ); },\n goLineEnd: function (cm) { return cm.extendSelectionsBy(function (range) { return lineEnd(cm, range.head.line); },\n {origin: \"+move\", bias: -1}\n ); },\n goLineRight: function (cm) { return cm.extendSelectionsBy(function (range) {\n var top = cm.cursorCoords(range.head, \"div\").top + 5;\n return cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, \"div\")\n }, sel_move); },\n goLineLeft: function (cm) { return cm.extendSelectionsBy(function (range) {\n var top = cm.cursorCoords(range.head, \"div\").top + 5;\n return cm.coordsChar({left: 0, top: top}, \"div\")\n }, sel_move); },\n goLineLeftSmart: function (cm) { return cm.extendSelectionsBy(function (range) {\n var top = cm.cursorCoords(range.head, \"div\").top + 5;\n var pos = cm.coordsChar({left: 0, top: top}, \"div\");\n if (pos.ch < cm.getLine(pos.line).search(/\\S/)) { return lineStartSmart(cm, range.head) }\n return pos\n }, sel_move); },\n goLineUp: function (cm) { return cm.moveV(-1, \"line\"); },\n goLineDown: function (cm) { return cm.moveV(1, \"line\"); },\n goPageUp: function (cm) { return cm.moveV(-1, \"page\"); },\n goPageDown: function (cm) { return cm.moveV(1, \"page\"); },\n goCharLeft: function (cm) { return cm.moveH(-1, \"char\"); },\n goCharRight: function (cm) { return cm.moveH(1, \"char\"); },\n goColumnLeft: function (cm) { return cm.moveH(-1, \"column\"); },\n goColumnRight: function (cm) { return cm.moveH(1, \"column\"); },\n goWordLeft: function (cm) { return cm.moveH(-1, \"word\"); },\n goGroupRight: function (cm) { return cm.moveH(1, \"group\"); },\n goGroupLeft: function (cm) { return cm.moveH(-1, \"group\"); },\n goWordRight: function (cm) { return cm.moveH(1, \"word\"); },\n delCharBefore: function (cm) { return cm.deleteH(-1, \"codepoint\"); },\n delCharAfter: function (cm) { return cm.deleteH(1, \"char\"); },\n delWordBefore: function (cm) { return cm.deleteH(-1, \"word\"); },\n delWordAfter: function (cm) { return cm.deleteH(1, \"word\"); },\n delGroupBefore: function (cm) { return cm.deleteH(-1, \"group\"); },\n delGroupAfter: function (cm) { return cm.deleteH(1, \"group\"); },\n indentAuto: function (cm) { return cm.indentSelection(\"smart\"); },\n indentMore: function (cm) { return cm.indentSelection(\"add\"); },\n indentLess: function (cm) { return cm.indentSelection(\"subtract\"); },\n insertTab: function (cm) { return cm.replaceSelection(\"\\t\"); },\n insertSoftTab: function (cm) {\n var spaces = [], ranges = cm.listSelections(), tabSize = cm.options.tabSize;\n for (var i = 0; i < ranges.length; i++) {\n var pos = ranges[i].from();\n var col = countColumn(cm.getLine(pos.line), pos.ch, tabSize);\n spaces.push(spaceStr(tabSize - col % tabSize));\n }\n cm.replaceSelections(spaces);\n },\n defaultTab: function (cm) {\n if (cm.somethingSelected()) { cm.indentSelection(\"add\"); }\n else { cm.execCommand(\"insertTab\"); }\n },\n // Swap the two chars left and right of each selection's head.\n // Move cursor behind the two swapped characters afterwards.\n //\n // Doesn't consider line feeds a character.\n // Doesn't scan more than one line above to find a character.\n // Doesn't do anything on an empty line.\n // Doesn't do anything with non-empty selections.\n transposeChars: function (cm) { return runInOp(cm, function () {\n var ranges = cm.listSelections(), newSel = [];\n for (var i = 0; i < ranges.length; i++) {\n if (!ranges[i].empty()) { continue }\n var cur = ranges[i].head, line = getLine(cm.doc, cur.line).text;\n if (line) {\n if (cur.ch == line.length) { cur = new Pos(cur.line, cur.ch - 1); }\n if (cur.ch > 0) {\n cur = new Pos(cur.line, cur.ch + 1);\n cm.replaceRange(line.charAt(cur.ch - 1) + line.charAt(cur.ch - 2),\n Pos(cur.line, cur.ch - 2), cur, \"+transpose\");\n } else if (cur.line > cm.doc.first) {\n var prev = getLine(cm.doc, cur.line - 1).text;\n if (prev) {\n cur = new Pos(cur.line, 1);\n cm.replaceRange(line.charAt(0) + cm.doc.lineSeparator() +\n prev.charAt(prev.length - 1),\n Pos(cur.line - 1, prev.length - 1), cur, \"+transpose\");\n }\n }\n }\n newSel.push(new Range(cur, cur));\n }\n cm.setSelections(newSel);\n }); },\n newlineAndIndent: function (cm) { return runInOp(cm, function () {\n var sels = cm.listSelections();\n for (var i = sels.length - 1; i >= 0; i--)\n { cm.replaceRange(cm.doc.lineSeparator(), sels[i].anchor, sels[i].head, \"+input\"); }\n sels = cm.listSelections();\n for (var i$1 = 0; i$1 < sels.length; i$1++)\n { cm.indentLine(sels[i$1].from().line, null, true); }\n ensureCursorVisible(cm);\n }); },\n openLine: function (cm) { return cm.replaceSelection(\"\\n\", \"start\"); },\n toggleOverwrite: function (cm) { return cm.toggleOverwrite(); }\n };\n\n\n function lineStart(cm, lineN) {\n var line = getLine(cm.doc, lineN);\n var visual = visualLine(line);\n if (visual != line) { lineN = lineNo(visual); }\n return endOfLine(true, cm, visual, lineN, 1)\n }\n function lineEnd(cm, lineN) {\n var line = getLine(cm.doc, lineN);\n var visual = visualLineEnd(line);\n if (visual != line) { lineN = lineNo(visual); }\n return endOfLine(true, cm, line, lineN, -1)\n }\n function lineStartSmart(cm, pos) {\n var start = lineStart(cm, pos.line);\n var line = getLine(cm.doc, start.line);\n var order = getOrder(line, cm.doc.direction);\n if (!order || order[0].level == 0) {\n var firstNonWS = Math.max(start.ch, line.text.search(/\\S/));\n var inWS = pos.line == start.line && pos.ch <= firstNonWS && pos.ch;\n return Pos(start.line, inWS ? 0 : firstNonWS, start.sticky)\n }\n return start\n }\n\n // Run a handler that was bound to a key.\n function doHandleBinding(cm, bound, dropShift) {\n if (typeof bound == \"string\") {\n bound = commands[bound];\n if (!bound) { return false }\n }\n // Ensure previous input has been read, so that the handler sees a\n // consistent view of the document\n cm.display.input.ensurePolled();\n var prevShift = cm.display.shift, done = false;\n try {\n if (cm.isReadOnly()) { cm.state.suppressEdits = true; }\n if (dropShift) { cm.display.shift = false; }\n done = bound(cm) != Pass;\n } finally {\n cm.display.shift = prevShift;\n cm.state.suppressEdits = false;\n }\n return done\n }\n\n function lookupKeyForEditor(cm, name, handle) {\n for (var i = 0; i < cm.state.keyMaps.length; i++) {\n var result = lookupKey(name, cm.state.keyMaps[i], handle, cm);\n if (result) { return result }\n }\n return (cm.options.extraKeys && lookupKey(name, cm.options.extraKeys, handle, cm))\n || lookupKey(name, cm.options.keyMap, handle, cm)\n }\n\n // Note that, despite the name, this function is also used to check\n // for bound mouse clicks.\n\n var stopSeq = new Delayed;\n\n function dispatchKey(cm, name, e, handle) {\n var seq = cm.state.keySeq;\n if (seq) {\n if (isModifierKey(name)) { return \"handled\" }\n if (/\\'$/.test(name))\n { cm.state.keySeq = null; }\n else\n { stopSeq.set(50, function () {\n if (cm.state.keySeq == seq) {\n cm.state.keySeq = null;\n cm.display.input.reset();\n }\n }); }\n if (dispatchKeyInner(cm, seq + \" \" + name, e, handle)) { return true }\n }\n return dispatchKeyInner(cm, name, e, handle)\n }\n\n function dispatchKeyInner(cm, name, e, handle) {\n var result = lookupKeyForEditor(cm, name, handle);\n\n if (result == \"multi\")\n { cm.state.keySeq = name; }\n if (result == \"handled\")\n { signalLater(cm, \"keyHandled\", cm, name, e); }\n\n if (result == \"handled\" || result == \"multi\") {\n e_preventDefault(e);\n restartBlink(cm);\n }\n\n return !!result\n }\n\n // Handle a key from the keydown event.\n function handleKeyBinding(cm, e) {\n var name = keyName(e, true);\n if (!name) { return false }\n\n if (e.shiftKey && !cm.state.keySeq) {\n // First try to resolve full name (including 'Shift-'). Failing\n // that, see if there is a cursor-motion command (starting with\n // 'go') bound to the keyname without 'Shift-'.\n return dispatchKey(cm, \"Shift-\" + name, e, function (b) { return doHandleBinding(cm, b, true); })\n || dispatchKey(cm, name, e, function (b) {\n if (typeof b == \"string\" ? /^go[A-Z]/.test(b) : b.motion)\n { return doHandleBinding(cm, b) }\n })\n } else {\n return dispatchKey(cm, name, e, function (b) { return doHandleBinding(cm, b); })\n }\n }\n\n // Handle a key from the keypress event\n function handleCharBinding(cm, e, ch) {\n return dispatchKey(cm, \"'\" + ch + \"'\", e, function (b) { return doHandleBinding(cm, b, true); })\n }\n\n var lastStoppedKey = null;\n function onKeyDown(e) {\n var cm = this;\n if (e.target && e.target != cm.display.input.getField()) { return }\n cm.curOp.focus = activeElt();\n if (signalDOMEvent(cm, e)) { return }\n // IE does strange things with escape.\n if (ie && ie_version < 11 && e.keyCode == 27) { e.returnValue = false; }\n var code = e.keyCode;\n cm.display.shift = code == 16 || e.shiftKey;\n var handled = handleKeyBinding(cm, e);\n if (presto) {\n lastStoppedKey = handled ? code : null;\n // Opera has no cut event... we try to at least catch the key combo\n if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey))\n { cm.replaceSelection(\"\", null, \"cut\"); }\n }\n if (gecko && !mac && !handled && code == 46 && e.shiftKey && !e.ctrlKey && document.execCommand)\n { document.execCommand(\"cut\"); }\n\n // Turn mouse into crosshair when Alt is held on Mac.\n if (code == 18 && !/\\bCodeMirror-crosshair\\b/.test(cm.display.lineDiv.className))\n { showCrossHair(cm); }\n }\n\n function showCrossHair(cm) {\n var lineDiv = cm.display.lineDiv;\n addClass(lineDiv, \"CodeMirror-crosshair\");\n\n function up(e) {\n if (e.keyCode == 18 || !e.altKey) {\n rmClass(lineDiv, \"CodeMirror-crosshair\");\n off(document, \"keyup\", up);\n off(document, \"mouseover\", up);\n }\n }\n on(document, \"keyup\", up);\n on(document, \"mouseover\", up);\n }\n\n function onKeyUp(e) {\n if (e.keyCode == 16) { this.doc.sel.shift = false; }\n signalDOMEvent(this, e);\n }\n\n function onKeyPress(e) {\n var cm = this;\n if (e.target && e.target != cm.display.input.getField()) { return }\n if (eventInWidget(cm.display, e) || signalDOMEvent(cm, e) || e.ctrlKey && !e.altKey || mac && e.metaKey) { return }\n var keyCode = e.keyCode, charCode = e.charCode;\n if (presto && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return}\n if ((presto && (!e.which || e.which < 10)) && handleKeyBinding(cm, e)) { return }\n var ch = String.fromCharCode(charCode == null ? keyCode : charCode);\n // Some browsers fire keypress events for backspace\n if (ch == \"\\x08\") { return }\n if (handleCharBinding(cm, e, ch)) { return }\n cm.display.input.onKeyPress(e);\n }\n\n var DOUBLECLICK_DELAY = 400;\n\n var PastClick = function(time, pos, button) {\n this.time = time;\n this.pos = pos;\n this.button = button;\n };\n\n PastClick.prototype.compare = function (time, pos, button) {\n return this.time + DOUBLECLICK_DELAY > time &&\n cmp(pos, this.pos) == 0 && button == this.button\n };\n\n var lastClick, lastDoubleClick;\n function clickRepeat(pos, button) {\n var now = +new Date;\n if (lastDoubleClick && lastDoubleClick.compare(now, pos, button)) {\n lastClick = lastDoubleClick = null;\n return \"triple\"\n } else if (lastClick && lastClick.compare(now, pos, button)) {\n lastDoubleClick = new PastClick(now, pos, button);\n lastClick = null;\n return \"double\"\n } else {\n lastClick = new PastClick(now, pos, button);\n lastDoubleClick = null;\n return \"single\"\n }\n }\n\n // A mouse down can be a single click, double click, triple click,\n // start of selection drag, start of text drag, new cursor\n // (ctrl-click), rectangle drag (alt-drag), or xwin\n // middle-click-paste. Or it might be a click on something we should\n // not interfere with, such as a scrollbar or widget.\n function onMouseDown(e) {\n var cm = this, display = cm.display;\n if (signalDOMEvent(cm, e) || display.activeTouch && display.input.supportsTouch()) { return }\n display.input.ensurePolled();\n display.shift = e.shiftKey;\n\n if (eventInWidget(display, e)) {\n if (!webkit) {\n // Briefly turn off draggability, to allow widgets to do\n // normal dragging things.\n display.scroller.draggable = false;\n setTimeout(function () { return display.scroller.draggable = true; }, 100);\n }\n return\n }\n if (clickInGutter(cm, e)) { return }\n var pos = posFromMouse(cm, e), button = e_button(e), repeat = pos ? clickRepeat(pos, button) : \"single\";\n window.focus();\n\n // #3261: make sure, that we're not starting a second selection\n if (button == 1 && cm.state.selectingText)\n { cm.state.selectingText(e); }\n\n if (pos && handleMappedButton(cm, button, pos, repeat, e)) { return }\n\n if (button == 1) {\n if (pos) { leftButtonDown(cm, pos, repeat, e); }\n else if (e_target(e) == display.scroller) { e_preventDefault(e); }\n } else if (button == 2) {\n if (pos) { extendSelection(cm.doc, pos); }\n setTimeout(function () { return display.input.focus(); }, 20);\n } else if (button == 3) {\n if (captureRightClick) { cm.display.input.onContextMenu(e); }\n else { delayBlurEvent(cm); }\n }\n }\n\n function handleMappedButton(cm, button, pos, repeat, event) {\n var name = \"Click\";\n if (repeat == \"double\") { name = \"Double\" + name; }\n else if (repeat == \"triple\") { name = \"Triple\" + name; }\n name = (button == 1 ? \"Left\" : button == 2 ? \"Middle\" : \"Right\") + name;\n\n return dispatchKey(cm, addModifierNames(name, event), event, function (bound) {\n if (typeof bound == \"string\") { bound = commands[bound]; }\n if (!bound) { return false }\n var done = false;\n try {\n if (cm.isReadOnly()) { cm.state.suppressEdits = true; }\n done = bound(cm, pos) != Pass;\n } finally {\n cm.state.suppressEdits = false;\n }\n return done\n })\n }\n\n function configureMouse(cm, repeat, event) {\n var option = cm.getOption(\"configureMouse\");\n var value = option ? option(cm, repeat, event) : {};\n if (value.unit == null) {\n var rect = chromeOS ? event.shiftKey && event.metaKey : event.altKey;\n value.unit = rect ? \"rectangle\" : repeat == \"single\" ? \"char\" : repeat == \"double\" ? \"word\" : \"line\";\n }\n if (value.extend == null || cm.doc.extend) { value.extend = cm.doc.extend || event.shiftKey; }\n if (value.addNew == null) { value.addNew = mac ? event.metaKey : event.ctrlKey; }\n if (value.moveOnDrag == null) { value.moveOnDrag = !(mac ? event.altKey : event.ctrlKey); }\n return value\n }\n\n function leftButtonDown(cm, pos, repeat, event) {\n if (ie) { setTimeout(bind(ensureFocus, cm), 0); }\n else { cm.curOp.focus = activeElt(); }\n\n var behavior = configureMouse(cm, repeat, event);\n\n var sel = cm.doc.sel, contained;\n if (cm.options.dragDrop && dragAndDrop && !cm.isReadOnly() &&\n repeat == \"single\" && (contained = sel.contains(pos)) > -1 &&\n (cmp((contained = sel.ranges[contained]).from(), pos) < 0 || pos.xRel > 0) &&\n (cmp(contained.to(), pos) > 0 || pos.xRel < 0))\n { leftButtonStartDrag(cm, event, pos, behavior); }\n else\n { leftButtonSelect(cm, event, pos, behavior); }\n }\n\n // Start a text drag. When it ends, see if any dragging actually\n // happen, and treat as a click if it didn't.\n function leftButtonStartDrag(cm, event, pos, behavior) {\n var display = cm.display, moved = false;\n var dragEnd = operation(cm, function (e) {\n if (webkit) { display.scroller.draggable = false; }\n cm.state.draggingText = false;\n if (cm.state.delayingBlurEvent) {\n if (cm.hasFocus()) { cm.state.delayingBlurEvent = false; }\n else { delayBlurEvent(cm); }\n }\n off(display.wrapper.ownerDocument, \"mouseup\", dragEnd);\n off(display.wrapper.ownerDocument, \"mousemove\", mouseMove);\n off(display.scroller, \"dragstart\", dragStart);\n off(display.scroller, \"drop\", dragEnd);\n if (!moved) {\n e_preventDefault(e);\n if (!behavior.addNew)\n { extendSelection(cm.doc, pos, null, null, behavior.extend); }\n // Work around unexplainable focus problem in IE9 (#2127) and Chrome (#3081)\n if ((webkit && !safari) || ie && ie_version == 9)\n { setTimeout(function () {display.wrapper.ownerDocument.body.focus({preventScroll: true}); display.input.focus();}, 20); }\n else\n { display.input.focus(); }\n }\n });\n var mouseMove = function(e2) {\n moved = moved || Math.abs(event.clientX - e2.clientX) + Math.abs(event.clientY - e2.clientY) >= 10;\n };\n var dragStart = function () { return moved = true; };\n // Let the drag handler handle this.\n if (webkit) { display.scroller.draggable = true; }\n cm.state.draggingText = dragEnd;\n dragEnd.copy = !behavior.moveOnDrag;\n on(display.wrapper.ownerDocument, \"mouseup\", dragEnd);\n on(display.wrapper.ownerDocument, \"mousemove\", mouseMove);\n on(display.scroller, \"dragstart\", dragStart);\n on(display.scroller, \"drop\", dragEnd);\n\n cm.state.delayingBlurEvent = true;\n setTimeout(function () { return display.input.focus(); }, 20);\n // IE's approach to draggable\n if (display.scroller.dragDrop) { display.scroller.dragDrop(); }\n }\n\n function rangeForUnit(cm, pos, unit) {\n if (unit == \"char\") { return new Range(pos, pos) }\n if (unit == \"word\") { return cm.findWordAt(pos) }\n if (unit == \"line\") { return new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))) }\n var result = unit(cm, pos);\n return new Range(result.from, result.to)\n }\n\n // Normal selection, as opposed to text dragging.\n function leftButtonSelect(cm, event, start, behavior) {\n if (ie) { delayBlurEvent(cm); }\n var display = cm.display, doc = cm.doc;\n e_preventDefault(event);\n\n var ourRange, ourIndex, startSel = doc.sel, ranges = startSel.ranges;\n if (behavior.addNew && !behavior.extend) {\n ourIndex = doc.sel.contains(start);\n if (ourIndex > -1)\n { ourRange = ranges[ourIndex]; }\n else\n { ourRange = new Range(start, start); }\n } else {\n ourRange = doc.sel.primary();\n ourIndex = doc.sel.primIndex;\n }\n\n if (behavior.unit == \"rectangle\") {\n if (!behavior.addNew) { ourRange = new Range(start, start); }\n start = posFromMouse(cm, event, true, true);\n ourIndex = -1;\n } else {\n var range = rangeForUnit(cm, start, behavior.unit);\n if (behavior.extend)\n { ourRange = extendRange(ourRange, range.anchor, range.head, behavior.extend); }\n else\n { ourRange = range; }\n }\n\n if (!behavior.addNew) {\n ourIndex = 0;\n setSelection(doc, new Selection([ourRange], 0), sel_mouse);\n startSel = doc.sel;\n } else if (ourIndex == -1) {\n ourIndex = ranges.length;\n setSelection(doc, normalizeSelection(cm, ranges.concat([ourRange]), ourIndex),\n {scroll: false, origin: \"*mouse\"});\n } else if (ranges.length > 1 && ranges[ourIndex].empty() && behavior.unit == \"char\" && !behavior.extend) {\n setSelection(doc, normalizeSelection(cm, ranges.slice(0, ourIndex).concat(ranges.slice(ourIndex + 1)), 0),\n {scroll: false, origin: \"*mouse\"});\n startSel = doc.sel;\n } else {\n replaceOneSelection(doc, ourIndex, ourRange, sel_mouse);\n }\n\n var lastPos = start;\n function extendTo(pos) {\n if (cmp(lastPos, pos) == 0) { return }\n lastPos = pos;\n\n if (behavior.unit == \"rectangle\") {\n var ranges = [], tabSize = cm.options.tabSize;\n var startCol = countColumn(getLine(doc, start.line).text, start.ch, tabSize);\n var posCol = countColumn(getLine(doc, pos.line).text, pos.ch, tabSize);\n var left = Math.min(startCol, posCol), right = Math.max(startCol, posCol);\n for (var line = Math.min(start.line, pos.line), end = Math.min(cm.lastLine(), Math.max(start.line, pos.line));\n line <= end; line++) {\n var text = getLine(doc, line).text, leftPos = findColumn(text, left, tabSize);\n if (left == right)\n { ranges.push(new Range(Pos(line, leftPos), Pos(line, leftPos))); }\n else if (text.length > leftPos)\n { ranges.push(new Range(Pos(line, leftPos), Pos(line, findColumn(text, right, tabSize)))); }\n }\n if (!ranges.length) { ranges.push(new Range(start, start)); }\n setSelection(doc, normalizeSelection(cm, startSel.ranges.slice(0, ourIndex).concat(ranges), ourIndex),\n {origin: \"*mouse\", scroll: false});\n cm.scrollIntoView(pos);\n } else {\n var oldRange = ourRange;\n var range = rangeForUnit(cm, pos, behavior.unit);\n var anchor = oldRange.anchor, head;\n if (cmp(range.anchor, anchor) > 0) {\n head = range.head;\n anchor = minPos(oldRange.from(), range.anchor);\n } else {\n head = range.anchor;\n anchor = maxPos(oldRange.to(), range.head);\n }\n var ranges$1 = startSel.ranges.slice(0);\n ranges$1[ourIndex] = bidiSimplify(cm, new Range(clipPos(doc, anchor), head));\n setSelection(doc, normalizeSelection(cm, ranges$1, ourIndex), sel_mouse);\n }\n }\n\n var editorSize = display.wrapper.getBoundingClientRect();\n // Used to ensure timeout re-tries don't fire when another extend\n // happened in the meantime (clearTimeout isn't reliable -- at\n // least on Chrome, the timeouts still happen even when cleared,\n // if the clear happens after their scheduled firing time).\n var counter = 0;\n\n function extend(e) {\n var curCount = ++counter;\n var cur = posFromMouse(cm, e, true, behavior.unit == \"rectangle\");\n if (!cur) { return }\n if (cmp(cur, lastPos) != 0) {\n cm.curOp.focus = activeElt();\n extendTo(cur);\n var visible = visibleLines(display, doc);\n if (cur.line >= visible.to || cur.line < visible.from)\n { setTimeout(operation(cm, function () {if (counter == curCount) { extend(e); }}), 150); }\n } else {\n var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0;\n if (outside) { setTimeout(operation(cm, function () {\n if (counter != curCount) { return }\n display.scroller.scrollTop += outside;\n extend(e);\n }), 50); }\n }\n }\n\n function done(e) {\n cm.state.selectingText = false;\n counter = Infinity;\n // If e is null or undefined we interpret this as someone trying\n // to explicitly cancel the selection rather than the user\n // letting go of the mouse button.\n if (e) {\n e_preventDefault(e);\n display.input.focus();\n }\n off(display.wrapper.ownerDocument, \"mousemove\", move);\n off(display.wrapper.ownerDocument, \"mouseup\", up);\n doc.history.lastSelOrigin = null;\n }\n\n var move = operation(cm, function (e) {\n if (e.buttons === 0 || !e_button(e)) { done(e); }\n else { extend(e); }\n });\n var up = operation(cm, done);\n cm.state.selectingText = up;\n on(display.wrapper.ownerDocument, \"mousemove\", move);\n on(display.wrapper.ownerDocument, \"mouseup\", up);\n }\n\n // Used when mouse-selecting to adjust the anchor to the proper side\n // of a bidi jump depending on the visual position of the head.\n function bidiSimplify(cm, range) {\n var anchor = range.anchor;\n var head = range.head;\n var anchorLine = getLine(cm.doc, anchor.line);\n if (cmp(anchor, head) == 0 && anchor.sticky == head.sticky) { return range }\n var order = getOrder(anchorLine);\n if (!order) { return range }\n var index = getBidiPartAt(order, anchor.ch, anchor.sticky), part = order[index];\n if (part.from != anchor.ch && part.to != anchor.ch) { return range }\n var boundary = index + ((part.from == anchor.ch) == (part.level != 1) ? 0 : 1);\n if (boundary == 0 || boundary == order.length) { return range }\n\n // Compute the relative visual position of the head compared to the\n // anchor (<0 is to the left, >0 to the right)\n var leftSide;\n if (head.line != anchor.line) {\n leftSide = (head.line - anchor.line) * (cm.doc.direction == \"ltr\" ? 1 : -1) > 0;\n } else {\n var headIndex = getBidiPartAt(order, head.ch, head.sticky);\n var dir = headIndex - index || (head.ch - anchor.ch) * (part.level == 1 ? -1 : 1);\n if (headIndex == boundary - 1 || headIndex == boundary)\n { leftSide = dir < 0; }\n else\n { leftSide = dir > 0; }\n }\n\n var usePart = order[boundary + (leftSide ? -1 : 0)];\n var from = leftSide == (usePart.level == 1);\n var ch = from ? usePart.from : usePart.to, sticky = from ? \"after\" : \"before\";\n return anchor.ch == ch && anchor.sticky == sticky ? range : new Range(new Pos(anchor.line, ch, sticky), head)\n }\n\n\n // Determines whether an event happened in the gutter, and fires the\n // handlers for the corresponding event.\n function gutterEvent(cm, e, type, prevent) {\n var mX, mY;\n if (e.touches) {\n mX = e.touches[0].clientX;\n mY = e.touches[0].clientY;\n } else {\n try { mX = e.clientX; mY = e.clientY; }\n catch(e$1) { return false }\n }\n if (mX >= Math.floor(cm.display.gutters.getBoundingClientRect().right)) { return false }\n if (prevent) { e_preventDefault(e); }\n\n var display = cm.display;\n var lineBox = display.lineDiv.getBoundingClientRect();\n\n if (mY > lineBox.bottom || !hasHandler(cm, type)) { return e_defaultPrevented(e) }\n mY -= lineBox.top - display.viewOffset;\n\n for (var i = 0; i < cm.display.gutterSpecs.length; ++i) {\n var g = display.gutters.childNodes[i];\n if (g && g.getBoundingClientRect().right >= mX) {\n var line = lineAtHeight(cm.doc, mY);\n var gutter = cm.display.gutterSpecs[i];\n signal(cm, type, cm, line, gutter.className, e);\n return e_defaultPrevented(e)\n }\n }\n }\n\n function clickInGutter(cm, e) {\n return gutterEvent(cm, e, \"gutterClick\", true)\n }\n\n // CONTEXT MENU HANDLING\n\n // To make the context menu work, we need to briefly unhide the\n // textarea (making it as unobtrusive as possible) to let the\n // right-click take effect on it.\n function onContextMenu(cm, e) {\n if (eventInWidget(cm.display, e) || contextMenuInGutter(cm, e)) { return }\n if (signalDOMEvent(cm, e, \"contextmenu\")) { return }\n if (!captureRightClick) { cm.display.input.onContextMenu(e); }\n }\n\n function contextMenuInGutter(cm, e) {\n if (!hasHandler(cm, \"gutterContextMenu\")) { return false }\n return gutterEvent(cm, e, \"gutterContextMenu\", false)\n }\n\n function themeChanged(cm) {\n cm.display.wrapper.className = cm.display.wrapper.className.replace(/\\s*cm-s-\\S+/g, \"\") +\n cm.options.theme.replace(/(^|\\s)\\s*/g, \" cm-s-\");\n clearCaches(cm);\n }\n\n var Init = {toString: function(){return \"CodeMirror.Init\"}};\n\n var defaults = {};\n var optionHandlers = {};\n\n function defineOptions(CodeMirror) {\n var optionHandlers = CodeMirror.optionHandlers;\n\n function option(name, deflt, handle, notOnInit) {\n CodeMirror.defaults[name] = deflt;\n if (handle) { optionHandlers[name] =\n notOnInit ? function (cm, val, old) {if (old != Init) { handle(cm, val, old); }} : handle; }\n }\n\n CodeMirror.defineOption = option;\n\n // Passed to option handlers when there is no old value.\n CodeMirror.Init = Init;\n\n // These two are, on init, called from the constructor because they\n // have to be initialized before the editor can start at all.\n option(\"value\", \"\", function (cm, val) { return cm.setValue(val); }, true);\n option(\"mode\", null, function (cm, val) {\n cm.doc.modeOption = val;\n loadMode(cm);\n }, true);\n\n option(\"indentUnit\", 2, loadMode, true);\n option(\"indentWithTabs\", false);\n option(\"smartIndent\", true);\n option(\"tabSize\", 4, function (cm) {\n resetModeState(cm);\n clearCaches(cm);\n regChange(cm);\n }, true);\n\n option(\"lineSeparator\", null, function (cm, val) {\n cm.doc.lineSep = val;\n if (!val) { return }\n var newBreaks = [], lineNo = cm.doc.first;\n cm.doc.iter(function (line) {\n for (var pos = 0;;) {\n var found = line.text.indexOf(val, pos);\n if (found == -1) { break }\n pos = found + val.length;\n newBreaks.push(Pos(lineNo, found));\n }\n lineNo++;\n });\n for (var i = newBreaks.length - 1; i >= 0; i--)\n { replaceRange(cm.doc, val, newBreaks[i], Pos(newBreaks[i].line, newBreaks[i].ch + val.length)); }\n });\n option(\"specialChars\", /[\\u0000-\\u001f\\u007f-\\u009f\\u00ad\\u061c\\u200b\\u200e\\u200f\\u2028\\u2029\\ufeff\\ufff9-\\ufffc]/g, function (cm, val, old) {\n cm.state.specialChars = new RegExp(val.source + (val.test(\"\\t\") ? \"\" : \"|\\t\"), \"g\");\n if (old != Init) { cm.refresh(); }\n });\n option(\"specialCharPlaceholder\", defaultSpecialCharPlaceholder, function (cm) { return cm.refresh(); }, true);\n option(\"electricChars\", true);\n option(\"inputStyle\", mobile ? \"contenteditable\" : \"textarea\", function () {\n throw new Error(\"inputStyle can not (yet) be changed in a running editor\") // FIXME\n }, true);\n option(\"spellcheck\", false, function (cm, val) { return cm.getInputField().spellcheck = val; }, true);\n option(\"autocorrect\", false, function (cm, val) { return cm.getInputField().autocorrect = val; }, true);\n option(\"autocapitalize\", false, function (cm, val) { return cm.getInputField().autocapitalize = val; }, true);\n option(\"rtlMoveVisually\", !windows);\n option(\"wholeLineUpdateBefore\", true);\n\n option(\"theme\", \"default\", function (cm) {\n themeChanged(cm);\n updateGutters(cm);\n }, true);\n option(\"keyMap\", \"default\", function (cm, val, old) {\n var next = getKeyMap(val);\n var prev = old != Init && getKeyMap(old);\n if (prev && prev.detach) { prev.detach(cm, next); }\n if (next.attach) { next.attach(cm, prev || null); }\n });\n option(\"extraKeys\", null);\n option(\"configureMouse\", null);\n\n option(\"lineWrapping\", false, wrappingChanged, true);\n option(\"gutters\", [], function (cm, val) {\n cm.display.gutterSpecs = getGutters(val, cm.options.lineNumbers);\n updateGutters(cm);\n }, true);\n option(\"fixedGutter\", true, function (cm, val) {\n cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + \"px\" : \"0\";\n cm.refresh();\n }, true);\n option(\"coverGutterNextToScrollbar\", false, function (cm) { return updateScrollbars(cm); }, true);\n option(\"scrollbarStyle\", \"native\", function (cm) {\n initScrollbars(cm);\n updateScrollbars(cm);\n cm.display.scrollbars.setScrollTop(cm.doc.scrollTop);\n cm.display.scrollbars.setScrollLeft(cm.doc.scrollLeft);\n }, true);\n option(\"lineNumbers\", false, function (cm, val) {\n cm.display.gutterSpecs = getGutters(cm.options.gutters, val);\n updateGutters(cm);\n }, true);\n option(\"firstLineNumber\", 1, updateGutters, true);\n option(\"lineNumberFormatter\", function (integer) { return integer; }, updateGutters, true);\n option(\"showCursorWhenSelecting\", false, updateSelection, true);\n\n option(\"resetSelectionOnContextMenu\", true);\n option(\"lineWiseCopyCut\", true);\n option(\"pasteLinesPerSelection\", true);\n option(\"selectionsMayTouch\", false);\n\n option(\"readOnly\", false, function (cm, val) {\n if (val == \"nocursor\") {\n onBlur(cm);\n cm.display.input.blur();\n }\n cm.display.input.readOnlyChanged(val);\n });\n\n option(\"screenReaderLabel\", null, function (cm, val) {\n val = (val === '') ? null : val;\n cm.display.input.screenReaderLabelChanged(val);\n });\n\n option(\"disableInput\", false, function (cm, val) {if (!val) { cm.display.input.reset(); }}, true);\n option(\"dragDrop\", true, dragDropChanged);\n option(\"allowDropFileTypes\", null);\n\n option(\"cursorBlinkRate\", 530);\n option(\"cursorScrollMargin\", 0);\n option(\"cursorHeight\", 1, updateSelection, true);\n option(\"singleCursorHeightPerLine\", true, updateSelection, true);\n option(\"workTime\", 100);\n option(\"workDelay\", 100);\n option(\"flattenSpans\", true, resetModeState, true);\n option(\"addModeClass\", false, resetModeState, true);\n option(\"pollInterval\", 100);\n option(\"undoDepth\", 200, function (cm, val) { return cm.doc.history.undoDepth = val; });\n option(\"historyEventDelay\", 1250);\n option(\"viewportMargin\", 10, function (cm) { return cm.refresh(); }, true);\n option(\"maxHighlightLength\", 10000, resetModeState, true);\n option(\"moveInputWithCursor\", true, function (cm, val) {\n if (!val) { cm.display.input.resetPosition(); }\n });\n\n option(\"tabindex\", null, function (cm, val) { return cm.display.input.getField().tabIndex = val || \"\"; });\n option(\"autofocus\", null);\n option(\"direction\", \"ltr\", function (cm, val) { return cm.doc.setDirection(val); }, true);\n option(\"phrases\", null);\n }\n\n function dragDropChanged(cm, value, old) {\n var wasOn = old && old != Init;\n if (!value != !wasOn) {\n var funcs = cm.display.dragFunctions;\n var toggle = value ? on : off;\n toggle(cm.display.scroller, \"dragstart\", funcs.start);\n toggle(cm.display.scroller, \"dragenter\", funcs.enter);\n toggle(cm.display.scroller, \"dragover\", funcs.over);\n toggle(cm.display.scroller, \"dragleave\", funcs.leave);\n toggle(cm.display.scroller, \"drop\", funcs.drop);\n }\n }\n\n function wrappingChanged(cm) {\n if (cm.options.lineWrapping) {\n addClass(cm.display.wrapper, \"CodeMirror-wrap\");\n cm.display.sizer.style.minWidth = \"\";\n cm.display.sizerWidth = null;\n } else {\n rmClass(cm.display.wrapper, \"CodeMirror-wrap\");\n findMaxLine(cm);\n }\n estimateLineHeights(cm);\n regChange(cm);\n clearCaches(cm);\n setTimeout(function () { return updateScrollbars(cm); }, 100);\n }\n\n // A CodeMirror instance represents an editor. This is the object\n // that user code is usually dealing with.\n\n function CodeMirror(place, options) {\n var this$1 = this;\n\n if (!(this instanceof CodeMirror)) { return new CodeMirror(place, options) }\n\n this.options = options = options ? copyObj(options) : {};\n // Determine effective options based on given values and defaults.\n copyObj(defaults, options, false);\n\n var doc = options.value;\n if (typeof doc == \"string\") { doc = new Doc(doc, options.mode, null, options.lineSeparator, options.direction); }\n else if (options.mode) { doc.modeOption = options.mode; }\n this.doc = doc;\n\n var input = new CodeMirror.inputStyles[options.inputStyle](this);\n var display = this.display = new Display(place, doc, input, options);\n display.wrapper.CodeMirror = this;\n themeChanged(this);\n if (options.lineWrapping)\n { this.display.wrapper.className += \" CodeMirror-wrap\"; }\n initScrollbars(this);\n\n this.state = {\n keyMaps: [], // stores maps added by addKeyMap\n overlays: [], // highlighting overlays, as added by addOverlay\n modeGen: 0, // bumped when mode/overlay changes, used to invalidate highlighting info\n overwrite: false,\n delayingBlurEvent: false,\n focused: false,\n suppressEdits: false, // used to disable editing during key handlers when in readOnly mode\n pasteIncoming: -1, cutIncoming: -1, // help recognize paste/cut edits in input.poll\n selectingText: false,\n draggingText: false,\n highlight: new Delayed(), // stores highlight worker timeout\n keySeq: null, // Unfinished key sequence\n specialChars: null\n };\n\n if (options.autofocus && !mobile) { display.input.focus(); }\n\n // Override magic textarea content restore that IE sometimes does\n // on our hidden textarea on reload\n if (ie && ie_version < 11) { setTimeout(function () { return this$1.display.input.reset(true); }, 20); }\n\n registerEventHandlers(this);\n ensureGlobalHandlers();\n\n startOperation(this);\n this.curOp.forceUpdate = true;\n attachDoc(this, doc);\n\n if ((options.autofocus && !mobile) || this.hasFocus())\n { setTimeout(function () {\n if (this$1.hasFocus() && !this$1.state.focused) { onFocus(this$1); }\n }, 20); }\n else\n { onBlur(this); }\n\n for (var opt in optionHandlers) { if (optionHandlers.hasOwnProperty(opt))\n { optionHandlers[opt](this, options[opt], Init); } }\n maybeUpdateLineNumberWidth(this);\n if (options.finishInit) { options.finishInit(this); }\n for (var i = 0; i < initHooks.length; ++i) { initHooks[i](this); }\n endOperation(this);\n // Suppress optimizelegibility in Webkit, since it breaks text\n // measuring on line wrapping boundaries.\n if (webkit && options.lineWrapping &&\n getComputedStyle(display.lineDiv).textRendering == \"optimizelegibility\")\n { display.lineDiv.style.textRendering = \"auto\"; }\n }\n\n // The default configuration options.\n CodeMirror.defaults = defaults;\n // Functions to run when options are changed.\n CodeMirror.optionHandlers = optionHandlers;\n\n // Attach the necessary event handlers when initializing the editor\n function registerEventHandlers(cm) {\n var d = cm.display;\n on(d.scroller, \"mousedown\", operation(cm, onMouseDown));\n // Older IE's will not fire a second mousedown for a double click\n if (ie && ie_version < 11)\n { on(d.scroller, \"dblclick\", operation(cm, function (e) {\n if (signalDOMEvent(cm, e)) { return }\n var pos = posFromMouse(cm, e);\n if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) { return }\n e_preventDefault(e);\n var word = cm.findWordAt(pos);\n extendSelection(cm.doc, word.anchor, word.head);\n })); }\n else\n { on(d.scroller, \"dblclick\", function (e) { return signalDOMEvent(cm, e) || e_preventDefault(e); }); }\n // Some browsers fire contextmenu *after* opening the menu, at\n // which point we can't mess with it anymore. Context menu is\n // handled in onMouseDown for these browsers.\n on(d.scroller, \"contextmenu\", function (e) { return onContextMenu(cm, e); });\n on(d.input.getField(), \"contextmenu\", function (e) {\n if (!d.scroller.contains(e.target)) { onContextMenu(cm, e); }\n });\n\n // Used to suppress mouse event handling when a touch happens\n var touchFinished, prevTouch = {end: 0};\n function finishTouch() {\n if (d.activeTouch) {\n touchFinished = setTimeout(function () { return d.activeTouch = null; }, 1000);\n prevTouch = d.activeTouch;\n prevTouch.end = +new Date;\n }\n }\n function isMouseLikeTouchEvent(e) {\n if (e.touches.length != 1) { return false }\n var touch = e.touches[0];\n return touch.radiusX <= 1 && touch.radiusY <= 1\n }\n function farAway(touch, other) {\n if (other.left == null) { return true }\n var dx = other.left - touch.left, dy = other.top - touch.top;\n return dx * dx + dy * dy > 20 * 20\n }\n on(d.scroller, \"touchstart\", function (e) {\n if (!signalDOMEvent(cm, e) && !isMouseLikeTouchEvent(e) && !clickInGutter(cm, e)) {\n d.input.ensurePolled();\n clearTimeout(touchFinished);\n var now = +new Date;\n d.activeTouch = {start: now, moved: false,\n prev: now - prevTouch.end <= 300 ? prevTouch : null};\n if (e.touches.length == 1) {\n d.activeTouch.left = e.touches[0].pageX;\n d.activeTouch.top = e.touches[0].pageY;\n }\n }\n });\n on(d.scroller, \"touchmove\", function () {\n if (d.activeTouch) { d.activeTouch.moved = true; }\n });\n on(d.scroller, \"touchend\", function (e) {\n var touch = d.activeTouch;\n if (touch && !eventInWidget(d, e) && touch.left != null &&\n !touch.moved && new Date - touch.start < 300) {\n var pos = cm.coordsChar(d.activeTouch, \"page\"), range;\n if (!touch.prev || farAway(touch, touch.prev)) // Single tap\n { range = new Range(pos, pos); }\n else if (!touch.prev.prev || farAway(touch, touch.prev.prev)) // Double tap\n { range = cm.findWordAt(pos); }\n else // Triple tap\n { range = new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))); }\n cm.setSelection(range.anchor, range.head);\n cm.focus();\n e_preventDefault(e);\n }\n finishTouch();\n });\n on(d.scroller, \"touchcancel\", finishTouch);\n\n // Sync scrolling between fake scrollbars and real scrollable\n // area, ensure viewport is updated when scrolling.\n on(d.scroller, \"scroll\", function () {\n if (d.scroller.clientHeight) {\n updateScrollTop(cm, d.scroller.scrollTop);\n setScrollLeft(cm, d.scroller.scrollLeft, true);\n signal(cm, \"scroll\", cm);\n }\n });\n\n // Listen to wheel events in order to try and update the viewport on time.\n on(d.scroller, \"mousewheel\", function (e) { return onScrollWheel(cm, e); });\n on(d.scroller, \"DOMMouseScroll\", function (e) { return onScrollWheel(cm, e); });\n\n // Prevent wrapper from ever scrolling\n on(d.wrapper, \"scroll\", function () { return d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; });\n\n d.dragFunctions = {\n enter: function (e) {if (!signalDOMEvent(cm, e)) { e_stop(e); }},\n over: function (e) {if (!signalDOMEvent(cm, e)) { onDragOver(cm, e); e_stop(e); }},\n start: function (e) { return onDragStart(cm, e); },\n drop: operation(cm, onDrop),\n leave: function (e) {if (!signalDOMEvent(cm, e)) { clearDragCursor(cm); }}\n };\n\n var inp = d.input.getField();\n on(inp, \"keyup\", function (e) { return onKeyUp.call(cm, e); });\n on(inp, \"keydown\", operation(cm, onKeyDown));\n on(inp, \"keypress\", operation(cm, onKeyPress));\n on(inp, \"focus\", function (e) { return onFocus(cm, e); });\n on(inp, \"blur\", function (e) { return onBlur(cm, e); });\n }\n\n var initHooks = [];\n CodeMirror.defineInitHook = function (f) { return initHooks.push(f); };\n\n // Indent the given line. The how parameter can be \"smart\",\n // \"add\"/null, \"subtract\", or \"prev\". When aggressive is false\n // (typically set to true for forced single-line indents), empty\n // lines are not indented, and places where the mode returns Pass\n // are left alone.\n function indentLine(cm, n, how, aggressive) {\n var doc = cm.doc, state;\n if (how == null) { how = \"add\"; }\n if (how == \"smart\") {\n // Fall back to \"prev\" when the mode doesn't have an indentation\n // method.\n if (!doc.mode.indent) { how = \"prev\"; }\n else { state = getContextBefore(cm, n).state; }\n }\n\n var tabSize = cm.options.tabSize;\n var line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize);\n if (line.stateAfter) { line.stateAfter = null; }\n var curSpaceString = line.text.match(/^\\s*/)[0], indentation;\n if (!aggressive && !/\\S/.test(line.text)) {\n indentation = 0;\n how = \"not\";\n } else if (how == \"smart\") {\n indentation = doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text);\n if (indentation == Pass || indentation > 150) {\n if (!aggressive) { return }\n how = \"prev\";\n }\n }\n if (how == \"prev\") {\n if (n > doc.first) { indentation = countColumn(getLine(doc, n-1).text, null, tabSize); }\n else { indentation = 0; }\n } else if (how == \"add\") {\n indentation = curSpace + cm.options.indentUnit;\n } else if (how == \"subtract\") {\n indentation = curSpace - cm.options.indentUnit;\n } else if (typeof how == \"number\") {\n indentation = curSpace + how;\n }\n indentation = Math.max(0, indentation);\n\n var indentString = \"\", pos = 0;\n if (cm.options.indentWithTabs)\n { for (var i = Math.floor(indentation / tabSize); i; --i) {pos += tabSize; indentString += \"\\t\";} }\n if (pos < indentation) { indentString += spaceStr(indentation - pos); }\n\n if (indentString != curSpaceString) {\n replaceRange(doc, indentString, Pos(n, 0), Pos(n, curSpaceString.length), \"+input\");\n line.stateAfter = null;\n return true\n } else {\n // Ensure that, if the cursor was in the whitespace at the start\n // of the line, it is moved to the end of that space.\n for (var i$1 = 0; i$1 < doc.sel.ranges.length; i$1++) {\n var range = doc.sel.ranges[i$1];\n if (range.head.line == n && range.head.ch < curSpaceString.length) {\n var pos$1 = Pos(n, curSpaceString.length);\n replaceOneSelection(doc, i$1, new Range(pos$1, pos$1));\n break\n }\n }\n }\n }\n\n // This will be set to a {lineWise: bool, text: [string]} object, so\n // that, when pasting, we know what kind of selections the copied\n // text was made out of.\n var lastCopied = null;\n\n function setLastCopied(newLastCopied) {\n lastCopied = newLastCopied;\n }\n\n function applyTextInput(cm, inserted, deleted, sel, origin) {\n var doc = cm.doc;\n cm.display.shift = false;\n if (!sel) { sel = doc.sel; }\n\n var recent = +new Date - 200;\n var paste = origin == \"paste\" || cm.state.pasteIncoming > recent;\n var textLines = splitLinesAuto(inserted), multiPaste = null;\n // When pasting N lines into N selections, insert one line per selection\n if (paste && sel.ranges.length > 1) {\n if (lastCopied && lastCopied.text.join(\"\\n\") == inserted) {\n if (sel.ranges.length % lastCopied.text.length == 0) {\n multiPaste = [];\n for (var i = 0; i < lastCopied.text.length; i++)\n { multiPaste.push(doc.splitLines(lastCopied.text[i])); }\n }\n } else if (textLines.length == sel.ranges.length && cm.options.pasteLinesPerSelection) {\n multiPaste = map(textLines, function (l) { return [l]; });\n }\n }\n\n var updateInput = cm.curOp.updateInput;\n // Normal behavior is to insert the new text into every selection\n for (var i$1 = sel.ranges.length - 1; i$1 >= 0; i$1--) {\n var range = sel.ranges[i$1];\n var from = range.from(), to = range.to();\n if (range.empty()) {\n if (deleted && deleted > 0) // Handle deletion\n { from = Pos(from.line, from.ch - deleted); }\n else if (cm.state.overwrite && !paste) // Handle overwrite\n { to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + lst(textLines).length)); }\n else if (paste && lastCopied && lastCopied.lineWise && lastCopied.text.join(\"\\n\") == textLines.join(\"\\n\"))\n { from = to = Pos(from.line, 0); }\n }\n var changeEvent = {from: from, to: to, text: multiPaste ? multiPaste[i$1 % multiPaste.length] : textLines,\n origin: origin || (paste ? \"paste\" : cm.state.cutIncoming > recent ? \"cut\" : \"+input\")};\n makeChange(cm.doc, changeEvent);\n signalLater(cm, \"inputRead\", cm, changeEvent);\n }\n if (inserted && !paste)\n { triggerElectric(cm, inserted); }\n\n ensureCursorVisible(cm);\n if (cm.curOp.updateInput < 2) { cm.curOp.updateInput = updateInput; }\n cm.curOp.typing = true;\n cm.state.pasteIncoming = cm.state.cutIncoming = -1;\n }\n\n function handlePaste(e, cm) {\n var pasted = e.clipboardData && e.clipboardData.getData(\"Text\");\n if (pasted) {\n e.preventDefault();\n if (!cm.isReadOnly() && !cm.options.disableInput)\n { runInOp(cm, function () { return applyTextInput(cm, pasted, 0, null, \"paste\"); }); }\n return true\n }\n }\n\n function triggerElectric(cm, inserted) {\n // When an 'electric' character is inserted, immediately trigger a reindent\n if (!cm.options.electricChars || !cm.options.smartIndent) { return }\n var sel = cm.doc.sel;\n\n for (var i = sel.ranges.length - 1; i >= 0; i--) {\n var range = sel.ranges[i];\n if (range.head.ch > 100 || (i && sel.ranges[i - 1].head.line == range.head.line)) { continue }\n var mode = cm.getModeAt(range.head);\n var indented = false;\n if (mode.electricChars) {\n for (var j = 0; j < mode.electricChars.length; j++)\n { if (inserted.indexOf(mode.electricChars.charAt(j)) > -1) {\n indented = indentLine(cm, range.head.line, \"smart\");\n break\n } }\n } else if (mode.electricInput) {\n if (mode.electricInput.test(getLine(cm.doc, range.head.line).text.slice(0, range.head.ch)))\n { indented = indentLine(cm, range.head.line, \"smart\"); }\n }\n if (indented) { signalLater(cm, \"electricInput\", cm, range.head.line); }\n }\n }\n\n function copyableRanges(cm) {\n var text = [], ranges = [];\n for (var i = 0; i < cm.doc.sel.ranges.length; i++) {\n var line = cm.doc.sel.ranges[i].head.line;\n var lineRange = {anchor: Pos(line, 0), head: Pos(line + 1, 0)};\n ranges.push(lineRange);\n text.push(cm.getRange(lineRange.anchor, lineRange.head));\n }\n return {text: text, ranges: ranges}\n }\n\n function disableBrowserMagic(field, spellcheck, autocorrect, autocapitalize) {\n field.setAttribute(\"autocorrect\", autocorrect ? \"\" : \"off\");\n field.setAttribute(\"autocapitalize\", autocapitalize ? \"\" : \"off\");\n field.setAttribute(\"spellcheck\", !!spellcheck);\n }\n\n function hiddenTextarea() {\n var te = elt(\"textarea\", null, null, \"position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; outline: none\");\n var div = elt(\"div\", [te], null, \"overflow: hidden; position: relative; width: 3px; height: 0px;\");\n // The textarea is kept positioned near the cursor to prevent the\n // fact that it'll be scrolled into view on input from scrolling\n // our fake cursor out of view. On webkit, when wrap=off, paste is\n // very slow. So make the area wide instead.\n if (webkit) { te.style.width = \"1000px\"; }\n else { te.setAttribute(\"wrap\", \"off\"); }\n // If border: 0; -- iOS fails to open keyboard (issue #1287)\n if (ios) { te.style.border = \"1px solid black\"; }\n disableBrowserMagic(te);\n return div\n }\n\n // The publicly visible API. Note that methodOp(f) means\n // 'wrap f in an operation, performed on its `this` parameter'.\n\n // This is not the complete set of editor methods. Most of the\n // methods defined on the Doc type are also injected into\n // CodeMirror.prototype, for backwards compatibility and\n // convenience.\n\n function addEditorMethods(CodeMirror) {\n var optionHandlers = CodeMirror.optionHandlers;\n\n var helpers = CodeMirror.helpers = {};\n\n CodeMirror.prototype = {\n constructor: CodeMirror,\n focus: function(){window.focus(); this.display.input.focus();},\n\n setOption: function(option, value) {\n var options = this.options, old = options[option];\n if (options[option] == value && option != \"mode\") { return }\n options[option] = value;\n if (optionHandlers.hasOwnProperty(option))\n { operation(this, optionHandlers[option])(this, value, old); }\n signal(this, \"optionChange\", this, option);\n },\n\n getOption: function(option) {return this.options[option]},\n getDoc: function() {return this.doc},\n\n addKeyMap: function(map, bottom) {\n this.state.keyMaps[bottom ? \"push\" : \"unshift\"](getKeyMap(map));\n },\n removeKeyMap: function(map) {\n var maps = this.state.keyMaps;\n for (var i = 0; i < maps.length; ++i)\n { if (maps[i] == map || maps[i].name == map) {\n maps.splice(i, 1);\n return true\n } }\n },\n\n addOverlay: methodOp(function(spec, options) {\n var mode = spec.token ? spec : CodeMirror.getMode(this.options, spec);\n if (mode.startState) { throw new Error(\"Overlays may not be stateful.\") }\n insertSorted(this.state.overlays,\n {mode: mode, modeSpec: spec, opaque: options && options.opaque,\n priority: (options && options.priority) || 0},\n function (overlay) { return overlay.priority; });\n this.state.modeGen++;\n regChange(this);\n }),\n removeOverlay: methodOp(function(spec) {\n var overlays = this.state.overlays;\n for (var i = 0; i < overlays.length; ++i) {\n var cur = overlays[i].modeSpec;\n if (cur == spec || typeof spec == \"string\" && cur.name == spec) {\n overlays.splice(i, 1);\n this.state.modeGen++;\n regChange(this);\n return\n }\n }\n }),\n\n indentLine: methodOp(function(n, dir, aggressive) {\n if (typeof dir != \"string\" && typeof dir != \"number\") {\n if (dir == null) { dir = this.options.smartIndent ? \"smart\" : \"prev\"; }\n else { dir = dir ? \"add\" : \"subtract\"; }\n }\n if (isLine(this.doc, n)) { indentLine(this, n, dir, aggressive); }\n }),\n indentSelection: methodOp(function(how) {\n var ranges = this.doc.sel.ranges, end = -1;\n for (var i = 0; i < ranges.length; i++) {\n var range = ranges[i];\n if (!range.empty()) {\n var from = range.from(), to = range.to();\n var start = Math.max(end, from.line);\n end = Math.min(this.lastLine(), to.line - (to.ch ? 0 : 1)) + 1;\n for (var j = start; j < end; ++j)\n { indentLine(this, j, how); }\n var newRanges = this.doc.sel.ranges;\n if (from.ch == 0 && ranges.length == newRanges.length && newRanges[i].from().ch > 0)\n { replaceOneSelection(this.doc, i, new Range(from, newRanges[i].to()), sel_dontScroll); }\n } else if (range.head.line > end) {\n indentLine(this, range.head.line, how, true);\n end = range.head.line;\n if (i == this.doc.sel.primIndex) { ensureCursorVisible(this); }\n }\n }\n }),\n\n // Fetch the parser token for a given character. Useful for hacks\n // that want to inspect the mode state (say, for completion).\n getTokenAt: function(pos, precise) {\n return takeToken(this, pos, precise)\n },\n\n getLineTokens: function(line, precise) {\n return takeToken(this, Pos(line), precise, true)\n },\n\n getTokenTypeAt: function(pos) {\n pos = clipPos(this.doc, pos);\n var styles = getLineStyles(this, getLine(this.doc, pos.line));\n var before = 0, after = (styles.length - 1) / 2, ch = pos.ch;\n var type;\n if (ch == 0) { type = styles[2]; }\n else { for (;;) {\n var mid = (before + after) >> 1;\n if ((mid ? styles[mid * 2 - 1] : 0) >= ch) { after = mid; }\n else if (styles[mid * 2 + 1] < ch) { before = mid + 1; }\n else { type = styles[mid * 2 + 2]; break }\n } }\n var cut = type ? type.indexOf(\"overlay \") : -1;\n return cut < 0 ? type : cut == 0 ? null : type.slice(0, cut - 1)\n },\n\n getModeAt: function(pos) {\n var mode = this.doc.mode;\n if (!mode.innerMode) { return mode }\n return CodeMirror.innerMode(mode, this.getTokenAt(pos).state).mode\n },\n\n getHelper: function(pos, type) {\n return this.getHelpers(pos, type)[0]\n },\n\n getHelpers: function(pos, type) {\n var found = [];\n if (!helpers.hasOwnProperty(type)) { return found }\n var help = helpers[type], mode = this.getModeAt(pos);\n if (typeof mode[type] == \"string\") {\n if (help[mode[type]]) { found.push(help[mode[type]]); }\n } else if (mode[type]) {\n for (var i = 0; i < mode[type].length; i++) {\n var val = help[mode[type][i]];\n if (val) { found.push(val); }\n }\n } else if (mode.helperType && help[mode.helperType]) {\n found.push(help[mode.helperType]);\n } else if (help[mode.name]) {\n found.push(help[mode.name]);\n }\n for (var i$1 = 0; i$1 < help._global.length; i$1++) {\n var cur = help._global[i$1];\n if (cur.pred(mode, this) && indexOf(found, cur.val) == -1)\n { found.push(cur.val); }\n }\n return found\n },\n\n getStateAfter: function(line, precise) {\n var doc = this.doc;\n line = clipLine(doc, line == null ? doc.first + doc.size - 1: line);\n return getContextBefore(this, line + 1, precise).state\n },\n\n cursorCoords: function(start, mode) {\n var pos, range = this.doc.sel.primary();\n if (start == null) { pos = range.head; }\n else if (typeof start == \"object\") { pos = clipPos(this.doc, start); }\n else { pos = start ? range.from() : range.to(); }\n return cursorCoords(this, pos, mode || \"page\")\n },\n\n charCoords: function(pos, mode) {\n return charCoords(this, clipPos(this.doc, pos), mode || \"page\")\n },\n\n coordsChar: function(coords, mode) {\n coords = fromCoordSystem(this, coords, mode || \"page\");\n return coordsChar(this, coords.left, coords.top)\n },\n\n lineAtHeight: function(height, mode) {\n height = fromCoordSystem(this, {top: height, left: 0}, mode || \"page\").top;\n return lineAtHeight(this.doc, height + this.display.viewOffset)\n },\n heightAtLine: function(line, mode, includeWidgets) {\n var end = false, lineObj;\n if (typeof line == \"number\") {\n var last = this.doc.first + this.doc.size - 1;\n if (line < this.doc.first) { line = this.doc.first; }\n else if (line > last) { line = last; end = true; }\n lineObj = getLine(this.doc, line);\n } else {\n lineObj = line;\n }\n return intoCoordSystem(this, lineObj, {top: 0, left: 0}, mode || \"page\", includeWidgets || end).top +\n (end ? this.doc.height - heightAtLine(lineObj) : 0)\n },\n\n defaultTextHeight: function() { return textHeight(this.display) },\n defaultCharWidth: function() { return charWidth(this.display) },\n\n getViewport: function() { return {from: this.display.viewFrom, to: this.display.viewTo}},\n\n addWidget: function(pos, node, scroll, vert, horiz) {\n var display = this.display;\n pos = cursorCoords(this, clipPos(this.doc, pos));\n var top = pos.bottom, left = pos.left;\n node.style.position = \"absolute\";\n node.setAttribute(\"cm-ignore-events\", \"true\");\n this.display.input.setUneditable(node);\n display.sizer.appendChild(node);\n if (vert == \"over\") {\n top = pos.top;\n } else if (vert == \"above\" || vert == \"near\") {\n var vspace = Math.max(display.wrapper.clientHeight, this.doc.height),\n hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth);\n // Default to positioning above (if specified and possible); otherwise default to positioning below\n if ((vert == 'above' || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight)\n { top = pos.top - node.offsetHeight; }\n else if (pos.bottom + node.offsetHeight <= vspace)\n { top = pos.bottom; }\n if (left + node.offsetWidth > hspace)\n { left = hspace - node.offsetWidth; }\n }\n node.style.top = top + \"px\";\n node.style.left = node.style.right = \"\";\n if (horiz == \"right\") {\n left = display.sizer.clientWidth - node.offsetWidth;\n node.style.right = \"0px\";\n } else {\n if (horiz == \"left\") { left = 0; }\n else if (horiz == \"middle\") { left = (display.sizer.clientWidth - node.offsetWidth) / 2; }\n node.style.left = left + \"px\";\n }\n if (scroll)\n { scrollIntoView(this, {left: left, top: top, right: left + node.offsetWidth, bottom: top + node.offsetHeight}); }\n },\n\n triggerOnKeyDown: methodOp(onKeyDown),\n triggerOnKeyPress: methodOp(onKeyPress),\n triggerOnKeyUp: onKeyUp,\n triggerOnMouseDown: methodOp(onMouseDown),\n\n execCommand: function(cmd) {\n if (commands.hasOwnProperty(cmd))\n { return commands[cmd].call(null, this) }\n },\n\n triggerElectric: methodOp(function(text) { triggerElectric(this, text); }),\n\n findPosH: function(from, amount, unit, visually) {\n var dir = 1;\n if (amount < 0) { dir = -1; amount = -amount; }\n var cur = clipPos(this.doc, from);\n for (var i = 0; i < amount; ++i) {\n cur = findPosH(this.doc, cur, dir, unit, visually);\n if (cur.hitSide) { break }\n }\n return cur\n },\n\n moveH: methodOp(function(dir, unit) {\n var this$1 = this;\n\n this.extendSelectionsBy(function (range) {\n if (this$1.display.shift || this$1.doc.extend || range.empty())\n { return findPosH(this$1.doc, range.head, dir, unit, this$1.options.rtlMoveVisually) }\n else\n { return dir < 0 ? range.from() : range.to() }\n }, sel_move);\n }),\n\n deleteH: methodOp(function(dir, unit) {\n var sel = this.doc.sel, doc = this.doc;\n if (sel.somethingSelected())\n { doc.replaceSelection(\"\", null, \"+delete\"); }\n else\n { deleteNearSelection(this, function (range) {\n var other = findPosH(doc, range.head, dir, unit, false);\n return dir < 0 ? {from: other, to: range.head} : {from: range.head, to: other}\n }); }\n }),\n\n findPosV: function(from, amount, unit, goalColumn) {\n var dir = 1, x = goalColumn;\n if (amount < 0) { dir = -1; amount = -amount; }\n var cur = clipPos(this.doc, from);\n for (var i = 0; i < amount; ++i) {\n var coords = cursorCoords(this, cur, \"div\");\n if (x == null) { x = coords.left; }\n else { coords.left = x; }\n cur = findPosV(this, coords, dir, unit);\n if (cur.hitSide) { break }\n }\n return cur\n },\n\n moveV: methodOp(function(dir, unit) {\n var this$1 = this;\n\n var doc = this.doc, goals = [];\n var collapse = !this.display.shift && !doc.extend && doc.sel.somethingSelected();\n doc.extendSelectionsBy(function (range) {\n if (collapse)\n { return dir < 0 ? range.from() : range.to() }\n var headPos = cursorCoords(this$1, range.head, \"div\");\n if (range.goalColumn != null) { headPos.left = range.goalColumn; }\n goals.push(headPos.left);\n var pos = findPosV(this$1, headPos, dir, unit);\n if (unit == \"page\" && range == doc.sel.primary())\n { addToScrollTop(this$1, charCoords(this$1, pos, \"div\").top - headPos.top); }\n return pos\n }, sel_move);\n if (goals.length) { for (var i = 0; i < doc.sel.ranges.length; i++)\n { doc.sel.ranges[i].goalColumn = goals[i]; } }\n }),\n\n // Find the word at the given position (as returned by coordsChar).\n findWordAt: function(pos) {\n var doc = this.doc, line = getLine(doc, pos.line).text;\n var start = pos.ch, end = pos.ch;\n if (line) {\n var helper = this.getHelper(pos, \"wordChars\");\n if ((pos.sticky == \"before\" || end == line.length) && start) { --start; } else { ++end; }\n var startChar = line.charAt(start);\n var check = isWordChar(startChar, helper)\n ? function (ch) { return isWordChar(ch, helper); }\n : /\\s/.test(startChar) ? function (ch) { return /\\s/.test(ch); }\n : function (ch) { return (!/\\s/.test(ch) && !isWordChar(ch)); };\n while (start > 0 && check(line.charAt(start - 1))) { --start; }\n while (end < line.length && check(line.charAt(end))) { ++end; }\n }\n return new Range(Pos(pos.line, start), Pos(pos.line, end))\n },\n\n toggleOverwrite: function(value) {\n if (value != null && value == this.state.overwrite) { return }\n if (this.state.overwrite = !this.state.overwrite)\n { addClass(this.display.cursorDiv, \"CodeMirror-overwrite\"); }\n else\n { rmClass(this.display.cursorDiv, \"CodeMirror-overwrite\"); }\n\n signal(this, \"overwriteToggle\", this, this.state.overwrite);\n },\n hasFocus: function() { return this.display.input.getField() == activeElt() },\n isReadOnly: function() { return !!(this.options.readOnly || this.doc.cantEdit) },\n\n scrollTo: methodOp(function (x, y) { scrollToCoords(this, x, y); }),\n getScrollInfo: function() {\n var scroller = this.display.scroller;\n return {left: scroller.scrollLeft, top: scroller.scrollTop,\n height: scroller.scrollHeight - scrollGap(this) - this.display.barHeight,\n width: scroller.scrollWidth - scrollGap(this) - this.display.barWidth,\n clientHeight: displayHeight(this), clientWidth: displayWidth(this)}\n },\n\n scrollIntoView: methodOp(function(range, margin) {\n if (range == null) {\n range = {from: this.doc.sel.primary().head, to: null};\n if (margin == null) { margin = this.options.cursorScrollMargin; }\n } else if (typeof range == \"number\") {\n range = {from: Pos(range, 0), to: null};\n } else if (range.from == null) {\n range = {from: range, to: null};\n }\n if (!range.to) { range.to = range.from; }\n range.margin = margin || 0;\n\n if (range.from.line != null) {\n scrollToRange(this, range);\n } else {\n scrollToCoordsRange(this, range.from, range.to, range.margin);\n }\n }),\n\n setSize: methodOp(function(width, height) {\n var this$1 = this;\n\n var interpret = function (val) { return typeof val == \"number\" || /^\\d+$/.test(String(val)) ? val + \"px\" : val; };\n if (width != null) { this.display.wrapper.style.width = interpret(width); }\n if (height != null) { this.display.wrapper.style.height = interpret(height); }\n if (this.options.lineWrapping) { clearLineMeasurementCache(this); }\n var lineNo = this.display.viewFrom;\n this.doc.iter(lineNo, this.display.viewTo, function (line) {\n if (line.widgets) { for (var i = 0; i < line.widgets.length; i++)\n { if (line.widgets[i].noHScroll) { regLineChange(this$1, lineNo, \"widget\"); break } } }\n ++lineNo;\n });\n this.curOp.forceUpdate = true;\n signal(this, \"refresh\", this);\n }),\n\n operation: function(f){return runInOp(this, f)},\n startOperation: function(){return startOperation(this)},\n endOperation: function(){return endOperation(this)},\n\n refresh: methodOp(function() {\n var oldHeight = this.display.cachedTextHeight;\n regChange(this);\n this.curOp.forceUpdate = true;\n clearCaches(this);\n scrollToCoords(this, this.doc.scrollLeft, this.doc.scrollTop);\n updateGutterSpace(this.display);\n if (oldHeight == null || Math.abs(oldHeight - textHeight(this.display)) > .5 || this.options.lineWrapping)\n { estimateLineHeights(this); }\n signal(this, \"refresh\", this);\n }),\n\n swapDoc: methodOp(function(doc) {\n var old = this.doc;\n old.cm = null;\n // Cancel the current text selection if any (#5821)\n if (this.state.selectingText) { this.state.selectingText(); }\n attachDoc(this, doc);\n clearCaches(this);\n this.display.input.reset();\n scrollToCoords(this, doc.scrollLeft, doc.scrollTop);\n this.curOp.forceScroll = true;\n signalLater(this, \"swapDoc\", this, old);\n return old\n }),\n\n phrase: function(phraseText) {\n var phrases = this.options.phrases;\n return phrases && Object.prototype.hasOwnProperty.call(phrases, phraseText) ? phrases[phraseText] : phraseText\n },\n\n getInputField: function(){return this.display.input.getField()},\n getWrapperElement: function(){return this.display.wrapper},\n getScrollerElement: function(){return this.display.scroller},\n getGutterElement: function(){return this.display.gutters}\n };\n eventMixin(CodeMirror);\n\n CodeMirror.registerHelper = function(type, name, value) {\n if (!helpers.hasOwnProperty(type)) { helpers[type] = CodeMirror[type] = {_global: []}; }\n helpers[type][name] = value;\n };\n CodeMirror.registerGlobalHelper = function(type, name, predicate, value) {\n CodeMirror.registerHelper(type, name, value);\n helpers[type]._global.push({pred: predicate, val: value});\n };\n }\n\n // Used for horizontal relative motion. Dir is -1 or 1 (left or\n // right), unit can be \"codepoint\", \"char\", \"column\" (like char, but\n // doesn't cross line boundaries), \"word\" (across next word), or\n // \"group\" (to the start of next group of word or\n // non-word-non-whitespace chars). The visually param controls\n // whether, in right-to-left text, direction 1 means to move towards\n // the next index in the string, or towards the character to the right\n // of the current position. The resulting position will have a\n // hitSide=true property if it reached the end of the document.\n function findPosH(doc, pos, dir, unit, visually) {\n var oldPos = pos;\n var origDir = dir;\n var lineObj = getLine(doc, pos.line);\n var lineDir = visually && doc.direction == \"rtl\" ? -dir : dir;\n function findNextLine() {\n var l = pos.line + lineDir;\n if (l < doc.first || l >= doc.first + doc.size) { return false }\n pos = new Pos(l, pos.ch, pos.sticky);\n return lineObj = getLine(doc, l)\n }\n function moveOnce(boundToLine) {\n var next;\n if (unit == \"codepoint\") {\n var ch = lineObj.text.charCodeAt(pos.ch + (dir > 0 ? 0 : -1));\n if (isNaN(ch)) {\n next = null;\n } else {\n var astral = dir > 0 ? ch >= 0xD800 && ch < 0xDC00 : ch >= 0xDC00 && ch < 0xDFFF;\n next = new Pos(pos.line, Math.max(0, Math.min(lineObj.text.length, pos.ch + dir * (astral ? 2 : 1))), -dir);\n }\n } else if (visually) {\n next = moveVisually(doc.cm, lineObj, pos, dir);\n } else {\n next = moveLogically(lineObj, pos, dir);\n }\n if (next == null) {\n if (!boundToLine && findNextLine())\n { pos = endOfLine(visually, doc.cm, lineObj, pos.line, lineDir); }\n else\n { return false }\n } else {\n pos = next;\n }\n return true\n }\n\n if (unit == \"char\" || unit == \"codepoint\") {\n moveOnce();\n } else if (unit == \"column\") {\n moveOnce(true);\n } else if (unit == \"word\" || unit == \"group\") {\n var sawType = null, group = unit == \"group\";\n var helper = doc.cm && doc.cm.getHelper(pos, \"wordChars\");\n for (var first = true;; first = false) {\n if (dir < 0 && !moveOnce(!first)) { break }\n var cur = lineObj.text.charAt(pos.ch) || \"\\n\";\n var type = isWordChar(cur, helper) ? \"w\"\n : group && cur == \"\\n\" ? \"n\"\n : !group || /\\s/.test(cur) ? null\n : \"p\";\n if (group && !first && !type) { type = \"s\"; }\n if (sawType && sawType != type) {\n if (dir < 0) {dir = 1; moveOnce(); pos.sticky = \"after\";}\n break\n }\n\n if (type) { sawType = type; }\n if (dir > 0 && !moveOnce(!first)) { break }\n }\n }\n var result = skipAtomic(doc, pos, oldPos, origDir, true);\n if (equalCursorPos(oldPos, result)) { result.hitSide = true; }\n return result\n }\n\n // For relative vertical movement. Dir may be -1 or 1. Unit can be\n // \"page\" or \"line\". The resulting position will have a hitSide=true\n // property if it reached the end of the document.\n function findPosV(cm, pos, dir, unit) {\n var doc = cm.doc, x = pos.left, y;\n if (unit == \"page\") {\n var pageSize = Math.min(cm.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight);\n var moveAmount = Math.max(pageSize - .5 * textHeight(cm.display), 3);\n y = (dir > 0 ? pos.bottom : pos.top) + dir * moveAmount;\n\n } else if (unit == \"line\") {\n y = dir > 0 ? pos.bottom + 3 : pos.top - 3;\n }\n var target;\n for (;;) {\n target = coordsChar(cm, x, y);\n if (!target.outside) { break }\n if (dir < 0 ? y <= 0 : y >= doc.height) { target.hitSide = true; break }\n y += dir * 5;\n }\n return target\n }\n\n // CONTENTEDITABLE INPUT STYLE\n\n var ContentEditableInput = function(cm) {\n this.cm = cm;\n this.lastAnchorNode = this.lastAnchorOffset = this.lastFocusNode = this.lastFocusOffset = null;\n this.polling = new Delayed();\n this.composing = null;\n this.gracePeriod = false;\n this.readDOMTimeout = null;\n };\n\n ContentEditableInput.prototype.init = function (display) {\n var this$1 = this;\n\n var input = this, cm = input.cm;\n var div = input.div = display.lineDiv;\n div.contentEditable = true;\n disableBrowserMagic(div, cm.options.spellcheck, cm.options.autocorrect, cm.options.autocapitalize);\n\n function belongsToInput(e) {\n for (var t = e.target; t; t = t.parentNode) {\n if (t == div) { return true }\n if (/\\bCodeMirror-(?:line)?widget\\b/.test(t.className)) { break }\n }\n return false\n }\n\n on(div, \"paste\", function (e) {\n if (!belongsToInput(e) || signalDOMEvent(cm, e) || handlePaste(e, cm)) { return }\n // IE doesn't fire input events, so we schedule a read for the pasted content in this way\n if (ie_version <= 11) { setTimeout(operation(cm, function () { return this$1.updateFromDOM(); }), 20); }\n });\n\n on(div, \"compositionstart\", function (e) {\n this$1.composing = {data: e.data, done: false};\n });\n on(div, \"compositionupdate\", function (e) {\n if (!this$1.composing) { this$1.composing = {data: e.data, done: false}; }\n });\n on(div, \"compositionend\", function (e) {\n if (this$1.composing) {\n if (e.data != this$1.composing.data) { this$1.readFromDOMSoon(); }\n this$1.composing.done = true;\n }\n });\n\n on(div, \"touchstart\", function () { return input.forceCompositionEnd(); });\n\n on(div, \"input\", function () {\n if (!this$1.composing) { this$1.readFromDOMSoon(); }\n });\n\n function onCopyCut(e) {\n if (!belongsToInput(e) || signalDOMEvent(cm, e)) { return }\n if (cm.somethingSelected()) {\n setLastCopied({lineWise: false, text: cm.getSelections()});\n if (e.type == \"cut\") { cm.replaceSelection(\"\", null, \"cut\"); }\n } else if (!cm.options.lineWiseCopyCut) {\n return\n } else {\n var ranges = copyableRanges(cm);\n setLastCopied({lineWise: true, text: ranges.text});\n if (e.type == \"cut\") {\n cm.operation(function () {\n cm.setSelections(ranges.ranges, 0, sel_dontScroll);\n cm.replaceSelection(\"\", null, \"cut\");\n });\n }\n }\n if (e.clipboardData) {\n e.clipboardData.clearData();\n var content = lastCopied.text.join(\"\\n\");\n // iOS exposes the clipboard API, but seems to discard content inserted into it\n e.clipboardData.setData(\"Text\", content);\n if (e.clipboardData.getData(\"Text\") == content) {\n e.preventDefault();\n return\n }\n }\n // Old-fashioned briefly-focus-a-textarea hack\n var kludge = hiddenTextarea(), te = kludge.firstChild;\n cm.display.lineSpace.insertBefore(kludge, cm.display.lineSpace.firstChild);\n te.value = lastCopied.text.join(\"\\n\");\n var hadFocus = activeElt();\n selectInput(te);\n setTimeout(function () {\n cm.display.lineSpace.removeChild(kludge);\n hadFocus.focus();\n if (hadFocus == div) { input.showPrimarySelection(); }\n }, 50);\n }\n on(div, \"copy\", onCopyCut);\n on(div, \"cut\", onCopyCut);\n };\n\n ContentEditableInput.prototype.screenReaderLabelChanged = function (label) {\n // Label for screenreaders, accessibility\n if(label) {\n this.div.setAttribute('aria-label', label);\n } else {\n this.div.removeAttribute('aria-label');\n }\n };\n\n ContentEditableInput.prototype.prepareSelection = function () {\n var result = prepareSelection(this.cm, false);\n result.focus = activeElt() == this.div;\n return result\n };\n\n ContentEditableInput.prototype.showSelection = function (info, takeFocus) {\n if (!info || !this.cm.display.view.length) { return }\n if (info.focus || takeFocus) { this.showPrimarySelection(); }\n this.showMultipleSelections(info);\n };\n\n ContentEditableInput.prototype.getSelection = function () {\n return this.cm.display.wrapper.ownerDocument.getSelection()\n };\n\n ContentEditableInput.prototype.showPrimarySelection = function () {\n var sel = this.getSelection(), cm = this.cm, prim = cm.doc.sel.primary();\n var from = prim.from(), to = prim.to();\n\n if (cm.display.viewTo == cm.display.viewFrom || from.line >= cm.display.viewTo || to.line < cm.display.viewFrom) {\n sel.removeAllRanges();\n return\n }\n\n var curAnchor = domToPos(cm, sel.anchorNode, sel.anchorOffset);\n var curFocus = domToPos(cm, sel.focusNode, sel.focusOffset);\n if (curAnchor && !curAnchor.bad && curFocus && !curFocus.bad &&\n cmp(minPos(curAnchor, curFocus), from) == 0 &&\n cmp(maxPos(curAnchor, curFocus), to) == 0)\n { return }\n\n var view = cm.display.view;\n var start = (from.line >= cm.display.viewFrom && posToDOM(cm, from)) ||\n {node: view[0].measure.map[2], offset: 0};\n var end = to.line < cm.display.viewTo && posToDOM(cm, to);\n if (!end) {\n var measure = view[view.length - 1].measure;\n var map = measure.maps ? measure.maps[measure.maps.length - 1] : measure.map;\n end = {node: map[map.length - 1], offset: map[map.length - 2] - map[map.length - 3]};\n }\n\n if (!start || !end) {\n sel.removeAllRanges();\n return\n }\n\n var old = sel.rangeCount && sel.getRangeAt(0), rng;\n try { rng = range(start.node, start.offset, end.offset, end.node); }\n catch(e) {} // Our model of the DOM might be outdated, in which case the range we try to set can be impossible\n if (rng) {\n if (!gecko && cm.state.focused) {\n sel.collapse(start.node, start.offset);\n if (!rng.collapsed) {\n sel.removeAllRanges();\n sel.addRange(rng);\n }\n } else {\n sel.removeAllRanges();\n sel.addRange(rng);\n }\n if (old && sel.anchorNode == null) { sel.addRange(old); }\n else if (gecko) { this.startGracePeriod(); }\n }\n this.rememberSelection();\n };\n\n ContentEditableInput.prototype.startGracePeriod = function () {\n var this$1 = this;\n\n clearTimeout(this.gracePeriod);\n this.gracePeriod = setTimeout(function () {\n this$1.gracePeriod = false;\n if (this$1.selectionChanged())\n { this$1.cm.operation(function () { return this$1.cm.curOp.selectionChanged = true; }); }\n }, 20);\n };\n\n ContentEditableInput.prototype.showMultipleSelections = function (info) {\n removeChildrenAndAdd(this.cm.display.cursorDiv, info.cursors);\n removeChildrenAndAdd(this.cm.display.selectionDiv, info.selection);\n };\n\n ContentEditableInput.prototype.rememberSelection = function () {\n var sel = this.getSelection();\n this.lastAnchorNode = sel.anchorNode; this.lastAnchorOffset = sel.anchorOffset;\n this.lastFocusNode = sel.focusNode; this.lastFocusOffset = sel.focusOffset;\n };\n\n ContentEditableInput.prototype.selectionInEditor = function () {\n var sel = this.getSelection();\n if (!sel.rangeCount) { return false }\n var node = sel.getRangeAt(0).commonAncestorContainer;\n return contains(this.div, node)\n };\n\n ContentEditableInput.prototype.focus = function () {\n if (this.cm.options.readOnly != \"nocursor\") {\n if (!this.selectionInEditor() || activeElt() != this.div)\n { this.showSelection(this.prepareSelection(), true); }\n this.div.focus();\n }\n };\n ContentEditableInput.prototype.blur = function () { this.div.blur(); };\n ContentEditableInput.prototype.getField = function () { return this.div };\n\n ContentEditableInput.prototype.supportsTouch = function () { return true };\n\n ContentEditableInput.prototype.receivedFocus = function () {\n var input = this;\n if (this.selectionInEditor())\n { this.pollSelection(); }\n else\n { runInOp(this.cm, function () { return input.cm.curOp.selectionChanged = true; }); }\n\n function poll() {\n if (input.cm.state.focused) {\n input.pollSelection();\n input.polling.set(input.cm.options.pollInterval, poll);\n }\n }\n this.polling.set(this.cm.options.pollInterval, poll);\n };\n\n ContentEditableInput.prototype.selectionChanged = function () {\n var sel = this.getSelection();\n return sel.anchorNode != this.lastAnchorNode || sel.anchorOffset != this.lastAnchorOffset ||\n sel.focusNode != this.lastFocusNode || sel.focusOffset != this.lastFocusOffset\n };\n\n ContentEditableInput.prototype.pollSelection = function () {\n if (this.readDOMTimeout != null || this.gracePeriod || !this.selectionChanged()) { return }\n var sel = this.getSelection(), cm = this.cm;\n // On Android Chrome (version 56, at least), backspacing into an\n // uneditable block element will put the cursor in that element,\n // and then, because it's not editable, hide the virtual keyboard.\n // Because Android doesn't allow us to actually detect backspace\n // presses in a sane way, this code checks for when that happens\n // and simulates a backspace press in this case.\n if (android && chrome && this.cm.display.gutterSpecs.length && isInGutter(sel.anchorNode)) {\n this.cm.triggerOnKeyDown({type: \"keydown\", keyCode: 8, preventDefault: Math.abs});\n this.blur();\n this.focus();\n return\n }\n if (this.composing) { return }\n this.rememberSelection();\n var anchor = domToPos(cm, sel.anchorNode, sel.anchorOffset);\n var head = domToPos(cm, sel.focusNode, sel.focusOffset);\n if (anchor && head) { runInOp(cm, function () {\n setSelection(cm.doc, simpleSelection(anchor, head), sel_dontScroll);\n if (anchor.bad || head.bad) { cm.curOp.selectionChanged = true; }\n }); }\n };\n\n ContentEditableInput.prototype.pollContent = function () {\n if (this.readDOMTimeout != null) {\n clearTimeout(this.readDOMTimeout);\n this.readDOMTimeout = null;\n }\n\n var cm = this.cm, display = cm.display, sel = cm.doc.sel.primary();\n var from = sel.from(), to = sel.to();\n if (from.ch == 0 && from.line > cm.firstLine())\n { from = Pos(from.line - 1, getLine(cm.doc, from.line - 1).length); }\n if (to.ch == getLine(cm.doc, to.line).text.length && to.line < cm.lastLine())\n { to = Pos(to.line + 1, 0); }\n if (from.line < display.viewFrom || to.line > display.viewTo - 1) { return false }\n\n var fromIndex, fromLine, fromNode;\n if (from.line == display.viewFrom || (fromIndex = findViewIndex(cm, from.line)) == 0) {\n fromLine = lineNo(display.view[0].line);\n fromNode = display.view[0].node;\n } else {\n fromLine = lineNo(display.view[fromIndex].line);\n fromNode = display.view[fromIndex - 1].node.nextSibling;\n }\n var toIndex = findViewIndex(cm, to.line);\n var toLine, toNode;\n if (toIndex == display.view.length - 1) {\n toLine = display.viewTo - 1;\n toNode = display.lineDiv.lastChild;\n } else {\n toLine = lineNo(display.view[toIndex + 1].line) - 1;\n toNode = display.view[toIndex + 1].node.previousSibling;\n }\n\n if (!fromNode) { return false }\n var newText = cm.doc.splitLines(domTextBetween(cm, fromNode, toNode, fromLine, toLine));\n var oldText = getBetween(cm.doc, Pos(fromLine, 0), Pos(toLine, getLine(cm.doc, toLine).text.length));\n while (newText.length > 1 && oldText.length > 1) {\n if (lst(newText) == lst(oldText)) { newText.pop(); oldText.pop(); toLine--; }\n else if (newText[0] == oldText[0]) { newText.shift(); oldText.shift(); fromLine++; }\n else { break }\n }\n\n var cutFront = 0, cutEnd = 0;\n var newTop = newText[0], oldTop = oldText[0], maxCutFront = Math.min(newTop.length, oldTop.length);\n while (cutFront < maxCutFront && newTop.charCodeAt(cutFront) == oldTop.charCodeAt(cutFront))\n { ++cutFront; }\n var newBot = lst(newText), oldBot = lst(oldText);\n var maxCutEnd = Math.min(newBot.length - (newText.length == 1 ? cutFront : 0),\n oldBot.length - (oldText.length == 1 ? cutFront : 0));\n while (cutEnd < maxCutEnd &&\n newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1))\n { ++cutEnd; }\n // Try to move start of change to start of selection if ambiguous\n if (newText.length == 1 && oldText.length == 1 && fromLine == from.line) {\n while (cutFront && cutFront > from.ch &&\n newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1)) {\n cutFront--;\n cutEnd++;\n }\n }\n\n newText[newText.length - 1] = newBot.slice(0, newBot.length - cutEnd).replace(/^\\u200b+/, \"\");\n newText[0] = newText[0].slice(cutFront).replace(/\\u200b+$/, \"\");\n\n var chFrom = Pos(fromLine, cutFront);\n var chTo = Pos(toLine, oldText.length ? lst(oldText).length - cutEnd : 0);\n if (newText.length > 1 || newText[0] || cmp(chFrom, chTo)) {\n replaceRange(cm.doc, newText, chFrom, chTo, \"+input\");\n return true\n }\n };\n\n ContentEditableInput.prototype.ensurePolled = function () {\n this.forceCompositionEnd();\n };\n ContentEditableInput.prototype.reset = function () {\n this.forceCompositionEnd();\n };\n ContentEditableInput.prototype.forceCompositionEnd = function () {\n if (!this.composing) { return }\n clearTimeout(this.readDOMTimeout);\n this.composing = null;\n this.updateFromDOM();\n this.div.blur();\n this.div.focus();\n };\n ContentEditableInput.prototype.readFromDOMSoon = function () {\n var this$1 = this;\n\n if (this.readDOMTimeout != null) { return }\n this.readDOMTimeout = setTimeout(function () {\n this$1.readDOMTimeout = null;\n if (this$1.composing) {\n if (this$1.composing.done) { this$1.composing = null; }\n else { return }\n }\n this$1.updateFromDOM();\n }, 80);\n };\n\n ContentEditableInput.prototype.updateFromDOM = function () {\n var this$1 = this;\n\n if (this.cm.isReadOnly() || !this.pollContent())\n { runInOp(this.cm, function () { return regChange(this$1.cm); }); }\n };\n\n ContentEditableInput.prototype.setUneditable = function (node) {\n node.contentEditable = \"false\";\n };\n\n ContentEditableInput.prototype.onKeyPress = function (e) {\n if (e.charCode == 0 || this.composing) { return }\n e.preventDefault();\n if (!this.cm.isReadOnly())\n { operation(this.cm, applyTextInput)(this.cm, String.fromCharCode(e.charCode == null ? e.keyCode : e.charCode), 0); }\n };\n\n ContentEditableInput.prototype.readOnlyChanged = function (val) {\n this.div.contentEditable = String(val != \"nocursor\");\n };\n\n ContentEditableInput.prototype.onContextMenu = function () {};\n ContentEditableInput.prototype.resetPosition = function () {};\n\n ContentEditableInput.prototype.needsContentAttribute = true;\n\n function posToDOM(cm, pos) {\n var view = findViewForLine(cm, pos.line);\n if (!view || view.hidden) { return null }\n var line = getLine(cm.doc, pos.line);\n var info = mapFromLineView(view, line, pos.line);\n\n var order = getOrder(line, cm.doc.direction), side = \"left\";\n if (order) {\n var partPos = getBidiPartAt(order, pos.ch);\n side = partPos % 2 ? \"right\" : \"left\";\n }\n var result = nodeAndOffsetInLineMap(info.map, pos.ch, side);\n result.offset = result.collapse == \"right\" ? result.end : result.start;\n return result\n }\n\n function isInGutter(node) {\n for (var scan = node; scan; scan = scan.parentNode)\n { if (/CodeMirror-gutter-wrapper/.test(scan.className)) { return true } }\n return false\n }\n\n function badPos(pos, bad) { if (bad) { pos.bad = true; } return pos }\n\n function domTextBetween(cm, from, to, fromLine, toLine) {\n var text = \"\", closing = false, lineSep = cm.doc.lineSeparator(), extraLinebreak = false;\n function recognizeMarker(id) { return function (marker) { return marker.id == id; } }\n function close() {\n if (closing) {\n text += lineSep;\n if (extraLinebreak) { text += lineSep; }\n closing = extraLinebreak = false;\n }\n }\n function addText(str) {\n if (str) {\n close();\n text += str;\n }\n }\n function walk(node) {\n if (node.nodeType == 1) {\n var cmText = node.getAttribute(\"cm-text\");\n if (cmText) {\n addText(cmText);\n return\n }\n var markerID = node.getAttribute(\"cm-marker\"), range;\n if (markerID) {\n var found = cm.findMarks(Pos(fromLine, 0), Pos(toLine + 1, 0), recognizeMarker(+markerID));\n if (found.length && (range = found[0].find(0)))\n { addText(getBetween(cm.doc, range.from, range.to).join(lineSep)); }\n return\n }\n if (node.getAttribute(\"contenteditable\") == \"false\") { return }\n var isBlock = /^(pre|div|p|li|table|br)$/i.test(node.nodeName);\n if (!/^br$/i.test(node.nodeName) && node.textContent.length == 0) { return }\n\n if (isBlock) { close(); }\n for (var i = 0; i < node.childNodes.length; i++)\n { walk(node.childNodes[i]); }\n\n if (/^(pre|p)$/i.test(node.nodeName)) { extraLinebreak = true; }\n if (isBlock) { closing = true; }\n } else if (node.nodeType == 3) {\n addText(node.nodeValue.replace(/\\u200b/g, \"\").replace(/\\u00a0/g, \" \"));\n }\n }\n for (;;) {\n walk(from);\n if (from == to) { break }\n from = from.nextSibling;\n extraLinebreak = false;\n }\n return text\n }\n\n function domToPos(cm, node, offset) {\n var lineNode;\n if (node == cm.display.lineDiv) {\n lineNode = cm.display.lineDiv.childNodes[offset];\n if (!lineNode) { return badPos(cm.clipPos(Pos(cm.display.viewTo - 1)), true) }\n node = null; offset = 0;\n } else {\n for (lineNode = node;; lineNode = lineNode.parentNode) {\n if (!lineNode || lineNode == cm.display.lineDiv) { return null }\n if (lineNode.parentNode && lineNode.parentNode == cm.display.lineDiv) { break }\n }\n }\n for (var i = 0; i < cm.display.view.length; i++) {\n var lineView = cm.display.view[i];\n if (lineView.node == lineNode)\n { return locateNodeInLineView(lineView, node, offset) }\n }\n }\n\n function locateNodeInLineView(lineView, node, offset) {\n var wrapper = lineView.text.firstChild, bad = false;\n if (!node || !contains(wrapper, node)) { return badPos(Pos(lineNo(lineView.line), 0), true) }\n if (node == wrapper) {\n bad = true;\n node = wrapper.childNodes[offset];\n offset = 0;\n if (!node) {\n var line = lineView.rest ? lst(lineView.rest) : lineView.line;\n return badPos(Pos(lineNo(line), line.text.length), bad)\n }\n }\n\n var textNode = node.nodeType == 3 ? node : null, topNode = node;\n if (!textNode && node.childNodes.length == 1 && node.firstChild.nodeType == 3) {\n textNode = node.firstChild;\n if (offset) { offset = textNode.nodeValue.length; }\n }\n while (topNode.parentNode != wrapper) { topNode = topNode.parentNode; }\n var measure = lineView.measure, maps = measure.maps;\n\n function find(textNode, topNode, offset) {\n for (var i = -1; i < (maps ? maps.length : 0); i++) {\n var map = i < 0 ? measure.map : maps[i];\n for (var j = 0; j < map.length; j += 3) {\n var curNode = map[j + 2];\n if (curNode == textNode || curNode == topNode) {\n var line = lineNo(i < 0 ? lineView.line : lineView.rest[i]);\n var ch = map[j] + offset;\n if (offset < 0 || curNode != textNode) { ch = map[j + (offset ? 1 : 0)]; }\n return Pos(line, ch)\n }\n }\n }\n }\n var found = find(textNode, topNode, offset);\n if (found) { return badPos(found, bad) }\n\n // FIXME this is all really shaky. might handle the few cases it needs to handle, but likely to cause problems\n for (var after = topNode.nextSibling, dist = textNode ? textNode.nodeValue.length - offset : 0; after; after = after.nextSibling) {\n found = find(after, after.firstChild, 0);\n if (found)\n { return badPos(Pos(found.line, found.ch - dist), bad) }\n else\n { dist += after.textContent.length; }\n }\n for (var before = topNode.previousSibling, dist$1 = offset; before; before = before.previousSibling) {\n found = find(before, before.firstChild, -1);\n if (found)\n { return badPos(Pos(found.line, found.ch + dist$1), bad) }\n else\n { dist$1 += before.textContent.length; }\n }\n }\n\n // TEXTAREA INPUT STYLE\n\n var TextareaInput = function(cm) {\n this.cm = cm;\n // See input.poll and input.reset\n this.prevInput = \"\";\n\n // Flag that indicates whether we expect input to appear real soon\n // now (after some event like 'keypress' or 'input') and are\n // polling intensively.\n this.pollingFast = false;\n // Self-resetting timeout for the poller\n this.polling = new Delayed();\n // Used to work around IE issue with selection being forgotten when focus moves away from textarea\n this.hasSelection = false;\n this.composing = null;\n };\n\n TextareaInput.prototype.init = function (display) {\n var this$1 = this;\n\n var input = this, cm = this.cm;\n this.createField(display);\n var te = this.textarea;\n\n display.wrapper.insertBefore(this.wrapper, display.wrapper.firstChild);\n\n // Needed to hide big blue blinking cursor on Mobile Safari (doesn't seem to work in iOS 8 anymore)\n if (ios) { te.style.width = \"0px\"; }\n\n on(te, \"input\", function () {\n if (ie && ie_version >= 9 && this$1.hasSelection) { this$1.hasSelection = null; }\n input.poll();\n });\n\n on(te, \"paste\", function (e) {\n if (signalDOMEvent(cm, e) || handlePaste(e, cm)) { return }\n\n cm.state.pasteIncoming = +new Date;\n input.fastPoll();\n });\n\n function prepareCopyCut(e) {\n if (signalDOMEvent(cm, e)) { return }\n if (cm.somethingSelected()) {\n setLastCopied({lineWise: false, text: cm.getSelections()});\n } else if (!cm.options.lineWiseCopyCut) {\n return\n } else {\n var ranges = copyableRanges(cm);\n setLastCopied({lineWise: true, text: ranges.text});\n if (e.type == \"cut\") {\n cm.setSelections(ranges.ranges, null, sel_dontScroll);\n } else {\n input.prevInput = \"\";\n te.value = ranges.text.join(\"\\n\");\n selectInput(te);\n }\n }\n if (e.type == \"cut\") { cm.state.cutIncoming = +new Date; }\n }\n on(te, \"cut\", prepareCopyCut);\n on(te, \"copy\", prepareCopyCut);\n\n on(display.scroller, \"paste\", function (e) {\n if (eventInWidget(display, e) || signalDOMEvent(cm, e)) { return }\n if (!te.dispatchEvent) {\n cm.state.pasteIncoming = +new Date;\n input.focus();\n return\n }\n\n // Pass the `paste` event to the textarea so it's handled by its event listener.\n var event = new Event(\"paste\");\n event.clipboardData = e.clipboardData;\n te.dispatchEvent(event);\n });\n\n // Prevent normal selection in the editor (we handle our own)\n on(display.lineSpace, \"selectstart\", function (e) {\n if (!eventInWidget(display, e)) { e_preventDefault(e); }\n });\n\n on(te, \"compositionstart\", function () {\n var start = cm.getCursor(\"from\");\n if (input.composing) { input.composing.range.clear(); }\n input.composing = {\n start: start,\n range: cm.markText(start, cm.getCursor(\"to\"), {className: \"CodeMirror-composing\"})\n };\n });\n on(te, \"compositionend\", function () {\n if (input.composing) {\n input.poll();\n input.composing.range.clear();\n input.composing = null;\n }\n });\n };\n\n TextareaInput.prototype.createField = function (_display) {\n // Wraps and hides input textarea\n this.wrapper = hiddenTextarea();\n // The semihidden textarea that is focused when the editor is\n // focused, and receives input.\n this.textarea = this.wrapper.firstChild;\n };\n\n TextareaInput.prototype.screenReaderLabelChanged = function (label) {\n // Label for screenreaders, accessibility\n if(label) {\n this.textarea.setAttribute('aria-label', label);\n } else {\n this.textarea.removeAttribute('aria-label');\n }\n };\n\n TextareaInput.prototype.prepareSelection = function () {\n // Redraw the selection and/or cursor\n var cm = this.cm, display = cm.display, doc = cm.doc;\n var result = prepareSelection(cm);\n\n // Move the hidden textarea near the cursor to prevent scrolling artifacts\n if (cm.options.moveInputWithCursor) {\n var headPos = cursorCoords(cm, doc.sel.primary().head, \"div\");\n var wrapOff = display.wrapper.getBoundingClientRect(), lineOff = display.lineDiv.getBoundingClientRect();\n result.teTop = Math.max(0, Math.min(display.wrapper.clientHeight - 10,\n headPos.top + lineOff.top - wrapOff.top));\n result.teLeft = Math.max(0, Math.min(display.wrapper.clientWidth - 10,\n headPos.left + lineOff.left - wrapOff.left));\n }\n\n return result\n };\n\n TextareaInput.prototype.showSelection = function (drawn) {\n var cm = this.cm, display = cm.display;\n removeChildrenAndAdd(display.cursorDiv, drawn.cursors);\n removeChildrenAndAdd(display.selectionDiv, drawn.selection);\n if (drawn.teTop != null) {\n this.wrapper.style.top = drawn.teTop + \"px\";\n this.wrapper.style.left = drawn.teLeft + \"px\";\n }\n };\n\n // Reset the input to correspond to the selection (or to be empty,\n // when not typing and nothing is selected)\n TextareaInput.prototype.reset = function (typing) {\n if (this.contextMenuPending || this.composing) { return }\n var cm = this.cm;\n if (cm.somethingSelected()) {\n this.prevInput = \"\";\n var content = cm.getSelection();\n this.textarea.value = content;\n if (cm.state.focused) { selectInput(this.textarea); }\n if (ie && ie_version >= 9) { this.hasSelection = content; }\n } else if (!typing) {\n this.prevInput = this.textarea.value = \"\";\n if (ie && ie_version >= 9) { this.hasSelection = null; }\n }\n };\n\n TextareaInput.prototype.getField = function () { return this.textarea };\n\n TextareaInput.prototype.supportsTouch = function () { return false };\n\n TextareaInput.prototype.focus = function () {\n if (this.cm.options.readOnly != \"nocursor\" && (!mobile || activeElt() != this.textarea)) {\n try { this.textarea.focus(); }\n catch (e) {} // IE8 will throw if the textarea is display: none or not in DOM\n }\n };\n\n TextareaInput.prototype.blur = function () { this.textarea.blur(); };\n\n TextareaInput.prototype.resetPosition = function () {\n this.wrapper.style.top = this.wrapper.style.left = 0;\n };\n\n TextareaInput.prototype.receivedFocus = function () { this.slowPoll(); };\n\n // Poll for input changes, using the normal rate of polling. This\n // runs as long as the editor is focused.\n TextareaInput.prototype.slowPoll = function () {\n var this$1 = this;\n\n if (this.pollingFast) { return }\n this.polling.set(this.cm.options.pollInterval, function () {\n this$1.poll();\n if (this$1.cm.state.focused) { this$1.slowPoll(); }\n });\n };\n\n // When an event has just come in that is likely to add or change\n // something in the input textarea, we poll faster, to ensure that\n // the change appears on the screen quickly.\n TextareaInput.prototype.fastPoll = function () {\n var missed = false, input = this;\n input.pollingFast = true;\n function p() {\n var changed = input.poll();\n if (!changed && !missed) {missed = true; input.polling.set(60, p);}\n else {input.pollingFast = false; input.slowPoll();}\n }\n input.polling.set(20, p);\n };\n\n // Read input from the textarea, and update the document to match.\n // When something is selected, it is present in the textarea, and\n // selected (unless it is huge, in which case a placeholder is\n // used). When nothing is selected, the cursor sits after previously\n // seen text (can be empty), which is stored in prevInput (we must\n // not reset the textarea when typing, because that breaks IME).\n TextareaInput.prototype.poll = function () {\n var this$1 = this;\n\n var cm = this.cm, input = this.textarea, prevInput = this.prevInput;\n // Since this is called a *lot*, try to bail out as cheaply as\n // possible when it is clear that nothing happened. hasSelection\n // will be the case when there is a lot of text in the textarea,\n // in which case reading its value would be expensive.\n if (this.contextMenuPending || !cm.state.focused ||\n (hasSelection(input) && !prevInput && !this.composing) ||\n cm.isReadOnly() || cm.options.disableInput || cm.state.keySeq)\n { return false }\n\n var text = input.value;\n // If nothing changed, bail.\n if (text == prevInput && !cm.somethingSelected()) { return false }\n // Work around nonsensical selection resetting in IE9/10, and\n // inexplicable appearance of private area unicode characters on\n // some key combos in Mac (#2689).\n if (ie && ie_version >= 9 && this.hasSelection === text ||\n mac && /[\\uf700-\\uf7ff]/.test(text)) {\n cm.display.input.reset();\n return false\n }\n\n if (cm.doc.sel == cm.display.selForContextMenu) {\n var first = text.charCodeAt(0);\n if (first == 0x200b && !prevInput) { prevInput = \"\\u200b\"; }\n if (first == 0x21da) { this.reset(); return this.cm.execCommand(\"undo\") }\n }\n // Find the part of the input that is actually new\n var same = 0, l = Math.min(prevInput.length, text.length);\n while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) { ++same; }\n\n runInOp(cm, function () {\n applyTextInput(cm, text.slice(same), prevInput.length - same,\n null, this$1.composing ? \"*compose\" : null);\n\n // Don't leave long text in the textarea, since it makes further polling slow\n if (text.length > 1000 || text.indexOf(\"\\n\") > -1) { input.value = this$1.prevInput = \"\"; }\n else { this$1.prevInput = text; }\n\n if (this$1.composing) {\n this$1.composing.range.clear();\n this$1.composing.range = cm.markText(this$1.composing.start, cm.getCursor(\"to\"),\n {className: \"CodeMirror-composing\"});\n }\n });\n return true\n };\n\n TextareaInput.prototype.ensurePolled = function () {\n if (this.pollingFast && this.poll()) { this.pollingFast = false; }\n };\n\n TextareaInput.prototype.onKeyPress = function () {\n if (ie && ie_version >= 9) { this.hasSelection = null; }\n this.fastPoll();\n };\n\n TextareaInput.prototype.onContextMenu = function (e) {\n var input = this, cm = input.cm, display = cm.display, te = input.textarea;\n if (input.contextMenuPending) { input.contextMenuPending(); }\n var pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop;\n if (!pos || presto) { return } // Opera is difficult.\n\n // Reset the current text selection only if the click is done outside of the selection\n // and 'resetSelectionOnContextMenu' option is true.\n var reset = cm.options.resetSelectionOnContextMenu;\n if (reset && cm.doc.sel.contains(pos) == -1)\n { operation(cm, setSelection)(cm.doc, simpleSelection(pos), sel_dontScroll); }\n\n var oldCSS = te.style.cssText, oldWrapperCSS = input.wrapper.style.cssText;\n var wrapperBox = input.wrapper.offsetParent.getBoundingClientRect();\n input.wrapper.style.cssText = \"position: static\";\n te.style.cssText = \"position: absolute; width: 30px; height: 30px;\\n top: \" + (e.clientY - wrapperBox.top - 5) + \"px; left: \" + (e.clientX - wrapperBox.left - 5) + \"px;\\n z-index: 1000; background: \" + (ie ? \"rgba(255, 255, 255, .05)\" : \"transparent\") + \";\\n outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);\";\n var oldScrollY;\n if (webkit) { oldScrollY = window.scrollY; } // Work around Chrome issue (#2712)\n display.input.focus();\n if (webkit) { window.scrollTo(null, oldScrollY); }\n display.input.reset();\n // Adds \"Select all\" to context menu in FF\n if (!cm.somethingSelected()) { te.value = input.prevInput = \" \"; }\n input.contextMenuPending = rehide;\n display.selForContextMenu = cm.doc.sel;\n clearTimeout(display.detectingSelectAll);\n\n // Select-all will be greyed out if there's nothing to select, so\n // this adds a zero-width space so that we can later check whether\n // it got selected.\n function prepareSelectAllHack() {\n if (te.selectionStart != null) {\n var selected = cm.somethingSelected();\n var extval = \"\\u200b\" + (selected ? te.value : \"\");\n te.value = \"\\u21da\"; // Used to catch context-menu undo\n te.value = extval;\n input.prevInput = selected ? \"\" : \"\\u200b\";\n te.selectionStart = 1; te.selectionEnd = extval.length;\n // Re-set this, in case some other handler touched the\n // selection in the meantime.\n display.selForContextMenu = cm.doc.sel;\n }\n }\n function rehide() {\n if (input.contextMenuPending != rehide) { return }\n input.contextMenuPending = false;\n input.wrapper.style.cssText = oldWrapperCSS;\n te.style.cssText = oldCSS;\n if (ie && ie_version < 9) { display.scrollbars.setScrollTop(display.scroller.scrollTop = scrollPos); }\n\n // Try to detect the user choosing select-all\n if (te.selectionStart != null) {\n if (!ie || (ie && ie_version < 9)) { prepareSelectAllHack(); }\n var i = 0, poll = function () {\n if (display.selForContextMenu == cm.doc.sel && te.selectionStart == 0 &&\n te.selectionEnd > 0 && input.prevInput == \"\\u200b\") {\n operation(cm, selectAll)(cm);\n } else if (i++ < 10) {\n display.detectingSelectAll = setTimeout(poll, 500);\n } else {\n display.selForContextMenu = null;\n display.input.reset();\n }\n };\n display.detectingSelectAll = setTimeout(poll, 200);\n }\n }\n\n if (ie && ie_version >= 9) { prepareSelectAllHack(); }\n if (captureRightClick) {\n e_stop(e);\n var mouseup = function () {\n off(window, \"mouseup\", mouseup);\n setTimeout(rehide, 20);\n };\n on(window, \"mouseup\", mouseup);\n } else {\n setTimeout(rehide, 50);\n }\n };\n\n TextareaInput.prototype.readOnlyChanged = function (val) {\n if (!val) { this.reset(); }\n this.textarea.disabled = val == \"nocursor\";\n this.textarea.readOnly = !!val;\n };\n\n TextareaInput.prototype.setUneditable = function () {};\n\n TextareaInput.prototype.needsContentAttribute = false;\n\n function fromTextArea(textarea, options) {\n options = options ? copyObj(options) : {};\n options.value = textarea.value;\n if (!options.tabindex && textarea.tabIndex)\n { options.tabindex = textarea.tabIndex; }\n if (!options.placeholder && textarea.placeholder)\n { options.placeholder = textarea.placeholder; }\n // Set autofocus to true if this textarea is focused, or if it has\n // autofocus and no other element is focused.\n if (options.autofocus == null) {\n var hasFocus = activeElt();\n options.autofocus = hasFocus == textarea ||\n textarea.getAttribute(\"autofocus\") != null && hasFocus == document.body;\n }\n\n function save() {textarea.value = cm.getValue();}\n\n var realSubmit;\n if (textarea.form) {\n on(textarea.form, \"submit\", save);\n // Deplorable hack to make the submit method do the right thing.\n if (!options.leaveSubmitMethodAlone) {\n var form = textarea.form;\n realSubmit = form.submit;\n try {\n var wrappedSubmit = form.submit = function () {\n save();\n form.submit = realSubmit;\n form.submit();\n form.submit = wrappedSubmit;\n };\n } catch(e) {}\n }\n }\n\n options.finishInit = function (cm) {\n cm.save = save;\n cm.getTextArea = function () { return textarea; };\n cm.toTextArea = function () {\n cm.toTextArea = isNaN; // Prevent this from being ran twice\n save();\n textarea.parentNode.removeChild(cm.getWrapperElement());\n textarea.style.display = \"\";\n if (textarea.form) {\n off(textarea.form, \"submit\", save);\n if (!options.leaveSubmitMethodAlone && typeof textarea.form.submit == \"function\")\n { textarea.form.submit = realSubmit; }\n }\n };\n };\n\n textarea.style.display = \"none\";\n var cm = CodeMirror(function (node) { return textarea.parentNode.insertBefore(node, textarea.nextSibling); },\n options);\n return cm\n }\n\n function addLegacyProps(CodeMirror) {\n CodeMirror.off = off;\n CodeMirror.on = on;\n CodeMirror.wheelEventPixels = wheelEventPixels;\n CodeMirror.Doc = Doc;\n CodeMirror.splitLines = splitLinesAuto;\n CodeMirror.countColumn = countColumn;\n CodeMirror.findColumn = findColumn;\n CodeMirror.isWordChar = isWordCharBasic;\n CodeMirror.Pass = Pass;\n CodeMirror.signal = signal;\n CodeMirror.Line = Line;\n CodeMirror.changeEnd = changeEnd;\n CodeMirror.scrollbarModel = scrollbarModel;\n CodeMirror.Pos = Pos;\n CodeMirror.cmpPos = cmp;\n CodeMirror.modes = modes;\n CodeMirror.mimeModes = mimeModes;\n CodeMirror.resolveMode = resolveMode;\n CodeMirror.getMode = getMode;\n CodeMirror.modeExtensions = modeExtensions;\n CodeMirror.extendMode = extendMode;\n CodeMirror.copyState = copyState;\n CodeMirror.startState = startState;\n CodeMirror.innerMode = innerMode;\n CodeMirror.commands = commands;\n CodeMirror.keyMap = keyMap;\n CodeMirror.keyName = keyName;\n CodeMirror.isModifierKey = isModifierKey;\n CodeMirror.lookupKey = lookupKey;\n CodeMirror.normalizeKeyMap = normalizeKeyMap;\n CodeMirror.StringStream = StringStream;\n CodeMirror.SharedTextMarker = SharedTextMarker;\n CodeMirror.TextMarker = TextMarker;\n CodeMirror.LineWidget = LineWidget;\n CodeMirror.e_preventDefault = e_preventDefault;\n CodeMirror.e_stopPropagation = e_stopPropagation;\n CodeMirror.e_stop = e_stop;\n CodeMirror.addClass = addClass;\n CodeMirror.contains = contains;\n CodeMirror.rmClass = rmClass;\n CodeMirror.keyNames = keyNames;\n }\n\n // EDITOR CONSTRUCTOR\n\n defineOptions(CodeMirror);\n\n addEditorMethods(CodeMirror);\n\n // Set up methods on CodeMirror's prototype to redirect to the editor's document.\n var dontDelegate = \"iter insert remove copy getEditor constructor\".split(\" \");\n for (var prop in Doc.prototype) { if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0)\n { CodeMirror.prototype[prop] = (function(method) {\n return function() {return method.apply(this.doc, arguments)}\n })(Doc.prototype[prop]); } }\n\n eventMixin(Doc);\n CodeMirror.inputStyles = {\"textarea\": TextareaInput, \"contenteditable\": ContentEditableInput};\n\n // Extra arguments are stored as the mode's dependencies, which is\n // used by (legacy) mechanisms like loadmode.js to automatically\n // load a mode. (Preferred mechanism is the require/define calls.)\n CodeMirror.defineMode = function(name/*, mode, …*/) {\n if (!CodeMirror.defaults.mode && name != \"null\") { CodeMirror.defaults.mode = name; }\n defineMode.apply(this, arguments);\n };\n\n CodeMirror.defineMIME = defineMIME;\n\n // Minimal default mode.\n CodeMirror.defineMode(\"null\", function () { return ({token: function (stream) { return stream.skipToEnd(); }}); });\n CodeMirror.defineMIME(\"text/plain\", \"null\");\n\n // EXTENSIONS\n\n CodeMirror.defineExtension = function (name, func) {\n CodeMirror.prototype[name] = func;\n };\n CodeMirror.defineDocExtension = function (name, func) {\n Doc.prototype[name] = func;\n };\n\n CodeMirror.fromTextArea = fromTextArea;\n\n addLegacyProps(CodeMirror);\n\n CodeMirror.version = \"5.61.0\";\n\n return CodeMirror;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vbm9kZV9tb2R1bGVzL2NvZGVtaXJyb3IvbGliL2NvZGVtaXJyb3IuanM/NTZiMyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFLEtBQTREO0FBQzlELEVBQUUsQ0FDd0Q7QUFDMUQsQ0FBQyxxQkFBcUI7O0FBRXRCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxzQ0FBc0MsR0FBRztBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHVCQUF1Qiw0Q0FBNEM7QUFDbkUsK0NBQStDLGdCQUFnQixlQUFlO0FBQzlFO0FBQ0E7QUFDQTs7QUFFQSwyQkFBMkI7O0FBRTNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx5Q0FBeUMsV0FBVztBQUNwRCxPQUFPLDZCQUE2QjtBQUNwQztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esb0JBQW9CLHlCQUF5QjtBQUM3QyxnQkFBZ0IseUJBQXlCO0FBQ3pDLHFDQUFxQyxpREFBaUQ7QUFDdEYsdUJBQXVCLGdCQUFnQixvQkFBb0IsT0FBTywyQkFBMkIsRUFBRTtBQUMvRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLFFBQVE7QUFDUjtBQUNBLFNBQVMsc0NBQXNDO0FBQy9DLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBLE9BQU8sMEJBQTBCO0FBQ2pDO0FBQ0EsT0FBTztBQUNQO0FBQ0EsaUNBQWlDLG9CQUFvQjtBQUNyRCw0QkFBNEI7QUFDNUIsS0FB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O0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUEsQ0FBQyIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9jb2RlbWlycm9yL2xpYi9jb2RlbWlycm9yLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnNcbi8vIERpc3RyaWJ1dGVkIHVuZGVyIGFuIE1JVCBsaWNlbnNlOiBodHRwczovL2NvZGVtaXJyb3IubmV0L0xJQ0VOU0VcblxuLy8gVGhpcyBpcyBDb2RlTWlycm9yIChodHRwczovL2NvZGVtaXJyb3IubmV0KSwgYSBjb2RlIGVkaXRvclxuLy8gaW1wbGVtZW50ZWQgaW4gSmF2YVNjcmlwdCBvbiB0b3Agb2YgdGhlIGJyb3dzZXIncyBET00uXG4vL1xuLy8gWW91IGNhbiBmaW5kIHNvbWUgdGVjaG5pY2FsIGJhY2tncm91bmQgZm9yIHNvbWUgb2YgdGhlIGNvZGUgYmVsb3dcbi8vIGF0IGh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvYmxvZy8jY20taW50ZXJuYWxzIC5cblxuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOlxuICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOlxuICAoZ2xvYmFsID0gZ2xvYmFsIHx8IHNlbGYsIGdsb2JhbC5Db2RlTWlycm9yID0gZmFjdG9yeSgpKTtcbn0odGhpcywgKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gIC8vIEtsdWRnZXMgZm9yIGJ1Z3MgYW5kIGJlaGF2aW9yIGRpZmZlcmVuY2VzIHRoYXQgY2FuJ3QgYmUgZmVhdHVyZVxuICAvLyBkZXRlY3RlZCBhcmUgZW5hYmxlZCBiYXNlZCBvbiB1c2VyQWdlbnQgZXRjIHNuaWZmaW5nLlxuICB2YXIgdXNlckFnZW50ID0gbmF2aWdhdG9yLnVzZXJBZ2VudDtcbiAgdmFyIHBsYXRmb3JtID0gbmF2aWdhdG9yLnBsYXRmb3JtO1xuXG4gIHZhciBnZWNrbyA9IC9nZWNrb1xcL1xcZC9pLnRlc3QodXNlckFnZW50KTtcbiAgdmFyIGllX3VwdG8xMCA9IC9NU0lFIFxcZC8udGVzdCh1c2VyQWdlbnQpO1xuICB2YXIgaWVfMTF1cCA9IC9UcmlkZW50XFwvKD86WzctOV18XFxkezIsfSlcXC4uKnJ2OihcXGQrKS8uZXhlYyh1c2VyQWdlbnQpO1xuICB2YXIgZWRnZSA9IC9FZGdlXFwvKFxcZCspLy5leGVjKHVzZXJBZ2VudCk7XG4gIHZhciBpZSA9IGllX3VwdG8xMCB8fCBpZV8xMXVwIHx8IGVkZ2U7XG4gIHZhciBpZV92ZXJzaW9uID0gaWUgJiYgKGllX3VwdG8xMCA/IGRvY3VtZW50LmRvY3VtZW50TW9kZSB8fCA2IDogKyhlZGdlIHx8IGllXzExdXApWzFdKTtcbiAgdmFyIHdlYmtpdCA9ICFlZGdlICYmIC9XZWJLaXRcXC8vLnRlc3QodXNlckFnZW50KTtcbiAgdmFyIHF0d2Via2l0ID0gd2Via2l0ICYmIC9RdFxcL1xcZCtcXC5cXGQrLy50ZXN0KHVzZXJBZ2VudCk7XG4gIHZhciBjaHJvbWUgPSAhZWRnZSAmJiAvQ2hyb21lXFwvLy50ZXN0KHVzZXJBZ2VudCk7XG4gIHZhciBwcmVzdG8gPSAvT3BlcmFcXC8vLnRlc3QodXNlckFnZW50KTtcbiAgdmFyIHNhZmFyaSA9IC9BcHBsZSBDb21wdXRlci8udGVzdChuYXZpZ2F0b3IudmVuZG9yKTtcbiAgdmFyIG1hY19nZU1vdW50YWluTGlvbiA9IC9NYWMgT1MgWCAxXFxkXFxEKFs4LTldfFxcZFxcZClcXEQvLnRlc3QodXNlckFnZW50KTtcbiAgdmFyIHBoYW50b20gPSAvUGhhbnRvbUpTLy50ZXN0KHVzZXJBZ2VudCk7XG5cbiAgdmFyIGlvcyA9IHNhZmFyaSAmJiAoL01vYmlsZVxcL1xcdysvLnRlc3QodXNlckFnZW50KSB8fCBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgPiAyKTtcbiAgdmFyIGFuZHJvaWQgPSAvQW5kcm9pZC8udGVzdCh1c2VyQWdlbnQpO1xuICAvLyBUaGlzIGlzIHdvZWZ1bGx5IGluY29tcGxldGUuIFN1Z2dlc3Rpb25zIGZvciBhbHRlcm5hdGl2ZSBtZXRob2RzIHdlbGNvbWUuXG4gIHZhciBtb2JpbGUgPSBpb3MgfHwgYW5kcm9pZCB8fCAvd2ViT1N8QmxhY2tCZXJyeXxPcGVyYSBNaW5pfE9wZXJhIE1vYml8SUVNb2JpbGUvaS50ZXN0KHVzZXJBZ2VudCk7XG4gIHZhciBtYWMgPSBpb3MgfHwgL01hYy8udGVzdChwbGF0Zm9ybSk7XG4gIHZhciBjaHJvbWVPUyA9IC9cXGJDck9TXFxiLy50ZXN0KHVzZXJBZ2VudCk7XG4gIHZhciB3aW5kb3dzID0gL3dpbi9pLnRlc3QocGxhdGZvcm0pO1xuXG4gIHZhciBwcmVzdG9fdmVyc2lvbiA9IHByZXN0byAmJiB1c2VyQWdlbnQubWF0Y2goL1ZlcnNpb25cXC8oXFxkKlxcLlxcZCopLyk7XG4gIGlmIChwcmVzdG9fdmVyc2lvbikgeyBwcmVzdG9fdmVyc2lvbiA9IE51bWJlcihwcmVzdG9fdmVyc2lvblsxXSk7IH1cbiAgaWYgKHByZXN0b192ZXJzaW9uICYmIHByZXN0b192ZXJzaW9uID49IDE1KSB7IHByZXN0byA9IGZhbHNlOyB3ZWJraXQgPSB0cnVlOyB9XG4gIC8vIFNvbWUgYnJvd3NlcnMgdXNlIHRoZSB3cm9uZyBldmVudCBwcm9wZXJ0aWVzIHRvIHNpZ25hbCBjbWQvY3RybCBvbiBPUyBYXG4gIHZhciBmbGlwQ3RybENtZCA9IG1hYyAmJiAocXR3ZWJraXQgfHwgcHJlc3RvICYmIChwcmVzdG9fdmVyc2lvbiA9PSBudWxsIHx8IHByZXN0b192ZXJzaW9uIDwgMTIuMTEpKTtcbiAgdmFyIGNhcHR1cmVSaWdodENsaWNrID0gZ2Vja28gfHwgKGllICYmIGllX3ZlcnNpb24gPj0gOSk7XG5cbiAgZnVuY3Rpb24gY2xhc3NUZXN0KGNscykgeyByZXR1cm4gbmV3IFJlZ0V4cChcIihefFxcXFxzKVwiICsgY2xzICsgXCIoPzokfFxcXFxzKVxcXFxzKlwiKSB9XG5cbiAgdmFyIHJtQ2xhc3MgPSBmdW5jdGlvbihub2RlLCBjbHMpIHtcbiAgICB2YXIgY3VycmVudCA9IG5vZGUuY2xhc3NOYW1lO1xuICAgIHZhciBtYXRjaCA9IGNsYXNzVGVzdChjbHMpLmV4ZWMoY3VycmVudCk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICB2YXIgYWZ0ZXIgPSBjdXJyZW50LnNsaWNlKG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoKTtcbiAgICAgIG5vZGUuY2xhc3NOYW1lID0gY3VycmVudC5zbGljZSgwLCBtYXRjaC5pbmRleCkgKyAoYWZ0ZXIgPyBtYXRjaFsxXSArIGFmdGVyIDogXCJcIik7XG4gICAgfVxuICB9O1xuXG4gIGZ1bmN0aW9uIHJlbW92ZUNoaWxkcmVuKGUpIHtcbiAgICBmb3IgKHZhciBjb3VudCA9IGUuY2hpbGROb2Rlcy5sZW5ndGg7IGNvdW50ID4gMDsgLS1jb3VudClcbiAgICAgIHsgZS5yZW1vdmVDaGlsZChlLmZpcnN0Q2hpbGQpOyB9XG4gICAgcmV0dXJuIGVcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbW92ZUNoaWxkcmVuQW5kQWRkKHBhcmVudCwgZSkge1xuICAgIHJldHVybiByZW1vdmVDaGlsZHJlbihwYXJlbnQpLmFwcGVuZENoaWxkKGUpXG4gIH1cblxuICBmdW5jdGlvbiBlbHQodGFnLCBjb250ZW50LCBjbGFzc05hbWUsIHN0eWxlKSB7XG4gICAgdmFyIGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7XG4gICAgaWYgKGNsYXNzTmFtZSkgeyBlLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsgfVxuICAgIGlmIChzdHlsZSkgeyBlLnN0eWxlLmNzc1RleHQgPSBzdHlsZTsgfVxuICAgIGlmICh0eXBlb2YgY29udGVudCA9PSBcInN0cmluZ1wiKSB7IGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY29udGVudCkpOyB9XG4gICAgZWxzZSBpZiAoY29udGVudCkgeyBmb3IgKHZhciBpID0gMDsgaSA8IGNvbnRlbnQubGVuZ3RoOyArK2kpIHsgZS5hcHBlbmRDaGlsZChjb250ZW50W2ldKTsgfSB9XG4gICAgcmV0dXJuIGVcbiAgfVxuICAvLyB3cmFwcGVyIGZvciBlbHQsIHdoaWNoIHJlbW92ZXMgdGhlIGVsdCBmcm9tIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWVcbiAgZnVuY3Rpb24gZWx0UCh0YWcsIGNvbnRlbnQsIGNsYXNzTmFtZSwgc3R5bGUpIHtcbiAgICB2YXIgZSA9IGVsdCh0YWcsIGNvbnRlbnQsIGNsYXNzTmFtZSwgc3R5bGUpO1xuICAgIGUuc2V0QXR0cmlidXRlKFwicm9sZVwiLCBcInByZXNlbnRhdGlvblwiKTtcbiAgICByZXR1cm4gZVxuICB9XG5cbiAgdmFyIHJhbmdlO1xuICBpZiAoZG9jdW1lbnQuY3JlYXRlUmFuZ2UpIHsgcmFuZ2UgPSBmdW5jdGlvbihub2RlLCBzdGFydCwgZW5kLCBlbmROb2RlKSB7XG4gICAgdmFyIHIgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgIHIuc2V0RW5kKGVuZE5vZGUgfHwgbm9kZSwgZW5kKTtcbiAgICByLnNldFN0YXJ0KG5vZGUsIHN0YXJ0KTtcbiAgICByZXR1cm4gclxuICB9OyB9XG4gIGVsc2UgeyByYW5nZSA9IGZ1bmN0aW9uKG5vZGUsIHN0YXJ0LCBlbmQpIHtcbiAgICB2YXIgciA9IGRvY3VtZW50LmJvZHkuY3JlYXRlVGV4dFJhbmdlKCk7XG4gICAgdHJ5IHsgci5tb3ZlVG9FbGVtZW50VGV4dChub2RlLnBhcmVudE5vZGUpOyB9XG4gICAgY2F0Y2goZSkgeyByZXR1cm4gciB9XG4gICAgci5jb2xsYXBzZSh0cnVlKTtcbiAgICByLm1vdmVFbmQoXCJjaGFyYWN0ZXJcIiwgZW5kKTtcbiAgICByLm1vdmVTdGFydChcImNoYXJhY3RlclwiLCBzdGFydCk7XG4gICAgcmV0dXJuIHJcbiAgfTsgfVxuXG4gIGZ1bmN0aW9uIGNvbnRhaW5zKHBhcmVudCwgY2hpbGQpIHtcbiAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT0gMykgLy8gQW5kcm9pZCBicm93c2VyIGFsd2F5cyByZXR1cm5zIGZhbHNlIHdoZW4gY2hpbGQgaXMgYSB0ZXh0bm9kZVxuICAgICAgeyBjaGlsZCA9IGNoaWxkLnBhcmVudE5vZGU7IH1cbiAgICBpZiAocGFyZW50LmNvbnRhaW5zKVxuICAgICAgeyByZXR1cm4gcGFyZW50LmNvbnRhaW5zKGNoaWxkKSB9XG4gICAgZG8ge1xuICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09IDExKSB7IGNoaWxkID0gY2hpbGQuaG9zdDsgfVxuICAgICAgaWYgKGNoaWxkID09IHBhcmVudCkgeyByZXR1cm4gdHJ1ZSB9XG4gICAgfSB3aGlsZSAoY2hpbGQgPSBjaGlsZC5wYXJlbnROb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gYWN0aXZlRWx0KCkge1xuICAgIC8vIElFIGFuZCBFZGdlIG1heSB0aHJvdyBhbiBcIlVuc3BlY2lmaWVkIEVycm9yXCIgd2hlbiBhY2Nlc3NpbmcgZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5cbiAgICAvLyBJRSA8IDEwIHdpbGwgdGhyb3cgd2hlbiBhY2Nlc3NlZCB3aGlsZSB0aGUgcGFnZSBpcyBsb2FkaW5nIG9yIGluIGFuIGlmcmFtZS5cbiAgICAvLyBJRSA+IDkgYW5kIEVkZ2Ugd2lsbCB0aHJvdyB3aGVuIGFjY2Vzc2VkIGluIGFuIGlmcmFtZSBpZiBkb2N1bWVudC5ib2R5IGlzIHVuYXZhaWxhYmxlLlxuICAgIHZhciBhY3RpdmVFbGVtZW50O1xuICAgIHRyeSB7XG4gICAgICBhY3RpdmVFbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICB9IGNhdGNoKGUpIHtcbiAgICAgIGFjdGl2ZUVsZW1lbnQgPSBkb2N1bWVudC5ib2R5IHx8IG51bGw7XG4gICAgfVxuICAgIHdoaWxlIChhY3RpdmVFbGVtZW50ICYmIGFjdGl2ZUVsZW1lbnQuc2hhZG93Um9vdCAmJiBhY3RpdmVFbGVtZW50LnNoYWRvd1Jvb3QuYWN0aXZlRWxlbWVudClcbiAgICAgIHsgYWN0aXZlRWxlbWVudCA9IGFjdGl2ZUVsZW1lbnQuc2hhZG93Um9vdC5hY3RpdmVFbGVtZW50OyB9XG4gICAgcmV0dXJuIGFjdGl2ZUVsZW1lbnRcbiAgfVxuXG4gIGZ1bmN0aW9uIGFkZENsYXNzKG5vZGUsIGNscykge1xuICAgIHZhciBjdXJyZW50ID0gbm9kZS5jbGFzc05hbWU7XG4gICAgaWYgKCFjbGFzc1Rlc3QoY2xzKS50ZXN0KGN1cnJlbnQpKSB7IG5vZGUuY2xhc3NOYW1lICs9IChjdXJyZW50ID8gXCIgXCIgOiBcIlwiKSArIGNsczsgfVxuICB9XG4gIGZ1bmN0aW9uIGpvaW5DbGFzc2VzKGEsIGIpIHtcbiAgICB2YXIgYXMgPSBhLnNwbGl0KFwiIFwiKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFzLmxlbmd0aDsgaSsrKVxuICAgICAgeyBpZiAoYXNbaV0gJiYgIWNsYXNzVGVzdChhc1tpXSkudGVzdChiKSkgeyBiICs9IFwiIFwiICsgYXNbaV07IH0gfVxuICAgIHJldHVybiBiXG4gIH1cblxuICB2YXIgc2VsZWN0SW5wdXQgPSBmdW5jdGlvbihub2RlKSB7IG5vZGUuc2VsZWN0KCk7IH07XG4gIGlmIChpb3MpIC8vIE1vYmlsZSBTYWZhcmkgYXBwYXJlbnRseSBoYXMgYSBidWcgd2hlcmUgc2VsZWN0KCkgaXMgYnJva2VuLlxuICAgIHsgc2VsZWN0SW5wdXQgPSBmdW5jdGlvbihub2RlKSB7IG5vZGUuc2VsZWN0aW9uU3RhcnQgPSAwOyBub2RlLnNlbGVjdGlvbkVuZCA9IG5vZGUudmFsdWUubGVuZ3RoOyB9OyB9XG4gIGVsc2UgaWYgKGllKSAvLyBTdXBwcmVzcyBteXN0ZXJpb3VzIElFMTAgZXJyb3JzXG4gICAgeyBzZWxlY3RJbnB1dCA9IGZ1bmN0aW9uKG5vZGUpIHsgdHJ5IHsgbm9kZS5zZWxlY3QoKTsgfSBjYXRjaChfZSkge30gfTsgfVxuXG4gIGZ1bmN0aW9uIGJpbmQoZikge1xuICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICByZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZi5hcHBseShudWxsLCBhcmdzKX1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNvcHlPYmoob2JqLCB0YXJnZXQsIG92ZXJ3cml0ZSkge1xuICAgIGlmICghdGFyZ2V0KSB7IHRhcmdldCA9IHt9OyB9XG4gICAgZm9yICh2YXIgcHJvcCBpbiBvYmopXG4gICAgICB7IGlmIChvYmouaGFzT3duUHJvcGVydHkocHJvcCkgJiYgKG92ZXJ3cml0ZSAhPT0gZmFsc2UgfHwgIXRhcmdldC5oYXNPd25Qcm9wZXJ0eShwcm9wKSkpXG4gICAgICAgIHsgdGFyZ2V0W3Byb3BdID0gb2JqW3Byb3BdOyB9IH1cbiAgICByZXR1cm4gdGFyZ2V0XG4gIH1cblxuICAvLyBDb3VudHMgdGhlIGNvbHVtbiBvZmZzZXQgaW4gYSBzdHJpbmcsIHRha2luZyB0YWJzIGludG8gYWNjb3VudC5cbiAgLy8gVXNlZCBtb3N0bHkgdG8gZmluZCBpbmRlbnRhdGlvbi5cbiAgZnVuY3Rpb24gY291bnRDb2x1bW4oc3RyaW5nLCBlbmQsIHRhYlNpemUsIHN0YXJ0SW5kZXgsIHN0YXJ0VmFsdWUpIHtcbiAgICBpZiAoZW5kID09IG51bGwpIHtcbiAgICAgIGVuZCA9IHN0cmluZy5zZWFyY2goL1teXFxzXFx1MDBhMF0vKTtcbiAgICAgIGlmIChlbmQgPT0gLTEpIHsgZW5kID0gc3RyaW5nLmxlbmd0aDsgfVxuICAgIH1cbiAgICBmb3IgKHZhciBpID0gc3RhcnRJbmRleCB8fCAwLCBuID0gc3RhcnRWYWx1ZSB8fCAwOzspIHtcbiAgICAgIHZhciBuZXh0VGFiID0gc3RyaW5nLmluZGV4T2YoXCJcXHRcIiwgaSk7XG4gICAgICBpZiAobmV4dFRhYiA8IDAgfHwgbmV4dFRhYiA+PSBlbmQpXG4gICAgICAgIHsgcmV0dXJuIG4gKyAoZW5kIC0gaSkgfVxuICAgICAgbiArPSBuZXh0VGFiIC0gaTtcbiAgICAgIG4gKz0gdGFiU2l6ZSAtIChuICUgdGFiU2l6ZSk7XG4gICAgICBpID0gbmV4dFRhYiArIDE7XG4gICAgfVxuICB9XG5cbiAgdmFyIERlbGF5ZWQgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmlkID0gbnVsbDtcbiAgICB0aGlzLmYgPSBudWxsO1xuICAgIHRoaXMudGltZSA9IDA7XG4gICAgdGhpcy5oYW5kbGVyID0gYmluZCh0aGlzLm9uVGltZW91dCwgdGhpcyk7XG4gIH07XG4gIERlbGF5ZWQucHJvdG90eXBlLm9uVGltZW91dCA9IGZ1bmN0aW9uIChzZWxmKSB7XG4gICAgc2VsZi5pZCA9IDA7XG4gICAgaWYgKHNlbGYudGltZSA8PSArbmV3IERhdGUpIHtcbiAgICAgIHNlbGYuZigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRUaW1lb3V0KHNlbGYuaGFuZGxlciwgc2VsZi50aW1lIC0gK25ldyBEYXRlKTtcbiAgICB9XG4gIH07XG4gIERlbGF5ZWQucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChtcywgZikge1xuICAgIHRoaXMuZiA9IGY7XG4gICAgdmFyIHRpbWUgPSArbmV3IERhdGUgKyBtcztcbiAgICBpZiAoIXRoaXMuaWQgfHwgdGltZSA8IHRoaXMudGltZSkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuaWQpO1xuICAgICAgdGhpcy5pZCA9IHNldFRpbWVvdXQodGhpcy5oYW5kbGVyLCBtcyk7XG4gICAgICB0aGlzLnRpbWUgPSB0aW1lO1xuICAgIH1cbiAgfTtcblxuICBmdW5jdGlvbiBpbmRleE9mKGFycmF5LCBlbHQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgKytpKVxuICAgICAgeyBpZiAoYXJyYXlbaV0gPT0gZWx0KSB7IHJldHVybiBpIH0gfVxuICAgIHJldHVybiAtMVxuICB9XG5cbiAgLy8gTnVtYmVyIG9mIHBpeGVscyBhZGRlZCB0byBzY3JvbGxlciBhbmQgc2l6ZXIgdG8gaGlkZSBzY3JvbGxiYXJcbiAgdmFyIHNjcm9sbGVyR2FwID0gNTA7XG5cbiAgLy8gUmV0dXJuZWQgb3IgdGhyb3duIGJ5IHZhcmlvdXMgcHJvdG9jb2xzIHRvIHNpZ25hbCAnSSdtIG5vdFxuICAvLyBoYW5kbGluZyB0aGlzJy5cbiAgdmFyIFBhc3MgPSB7dG9TdHJpbmc6IGZ1bmN0aW9uKCl7cmV0dXJuIFwiQ29kZU1pcnJvci5QYXNzXCJ9fTtcblxuICAvLyBSZXVzZWQgb3B0aW9uIG9iamVjdHMgZm9yIHNldFNlbGVjdGlvbiAmIGZyaWVuZHNcbiAgdmFyIHNlbF9kb250U2Nyb2xsID0ge3Njcm9sbDogZmFsc2V9LCBzZWxfbW91c2UgPSB7b3JpZ2luOiBcIiptb3VzZVwifSwgc2VsX21vdmUgPSB7b3JpZ2luOiBcIittb3ZlXCJ9O1xuXG4gIC8vIFRoZSBpbnZlcnNlIG9mIGNvdW50Q29sdW1uIC0tIGZpbmQgdGhlIG9mZnNldCB0aGF0IGNvcnJlc3BvbmRzIHRvXG4gIC8vIGEgcGFydGljdWxhciBjb2x1bW4uXG4gIGZ1bmN0aW9uIGZpbmRDb2x1bW4oc3RyaW5nLCBnb2FsLCB0YWJTaXplKSB7XG4gICAgZm9yICh2YXIgcG9zID0gMCwgY29sID0gMDs7KSB7XG4gICAgICB2YXIgbmV4dFRhYiA9IHN0cmluZy5pbmRleE9mKFwiXFx0XCIsIHBvcyk7XG4gICAgICBpZiAobmV4dFRhYiA9PSAtMSkgeyBuZXh0VGFiID0gc3RyaW5nLmxlbmd0aDsgfVxuICAgICAgdmFyIHNraXBwZWQgPSBuZXh0VGFiIC0gcG9zO1xuICAgICAgaWYgKG5leHRUYWIgPT0gc3RyaW5nLmxlbmd0aCB8fCBjb2wgKyBza2lwcGVkID49IGdvYWwpXG4gICAgICAgIHsgcmV0dXJuIHBvcyArIE1hdGgubWluKHNraXBwZWQsIGdvYWwgLSBjb2wpIH1cbiAgICAgIGNvbCArPSBuZXh0VGFiIC0gcG9zO1xuICAgICAgY29sICs9IHRhYlNpemUgLSAoY29sICUgdGFiU2l6ZSk7XG4gICAgICBwb3MgPSBuZXh0VGFiICsgMTtcbiAgICAgIGlmIChjb2wgPj0gZ29hbCkgeyByZXR1cm4gcG9zIH1cbiAgICB9XG4gIH1cblxuICB2YXIgc3BhY2VTdHJzID0gW1wiXCJdO1xuICBmdW5jdGlvbiBzcGFjZVN0cihuKSB7XG4gICAgd2hpbGUgKHNwYWNlU3Rycy5sZW5ndGggPD0gbilcbiAgICAgIHsgc3BhY2VTdHJzLnB1c2gobHN0KHNwYWNlU3RycykgKyBcIiBcIik7IH1cbiAgICByZXR1cm4gc3BhY2VTdHJzW25dXG4gIH1cblxuICBmdW5jdGlvbiBsc3QoYXJyKSB7IHJldHVybiBhcnJbYXJyLmxlbmd0aC0xXSB9XG5cbiAgZnVuY3Rpb24gbWFwKGFycmF5LCBmKSB7XG4gICAgdmFyIG91dCA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsgb3V0W2ldID0gZihhcnJheVtpXSwgaSk7IH1cbiAgICByZXR1cm4gb3V0XG4gIH1cblxuICBmdW5jdGlvbiBpbnNlcnRTb3J0ZWQoYXJyYXksIHZhbHVlLCBzY29yZSkge1xuICAgIHZhciBwb3MgPSAwLCBwcmlvcml0eSA9IHNjb3JlKHZhbHVlKTtcbiAgICB3aGlsZSAocG9zIDwgYXJyYXkubGVuZ3RoICYmIHNjb3JlKGFycmF5W3Bvc10pIDw9IHByaW9yaXR5KSB7IHBvcysrOyB9XG4gICAgYXJyYXkuc3BsaWNlKHBvcywgMCwgdmFsdWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gbm90aGluZygpIHt9XG5cbiAgZnVuY3Rpb24gY3JlYXRlT2JqKGJhc2UsIHByb3BzKSB7XG4gICAgdmFyIGluc3Q7XG4gICAgaWYgKE9iamVjdC5jcmVhdGUpIHtcbiAgICAgIGluc3QgPSBPYmplY3QuY3JlYXRlKGJhc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBub3RoaW5nLnByb3RvdHlwZSA9IGJhc2U7XG4gICAgICBpbnN0ID0gbmV3IG5vdGhpbmcoKTtcbiAgICB9XG4gICAgaWYgKHByb3BzKSB7IGNvcHlPYmoocHJvcHMsIGluc3QpOyB9XG4gICAgcmV0dXJuIGluc3RcbiAgfVxuXG4gIHZhciBub25BU0NJSVNpbmdsZUNhc2VXb3JkQ2hhciA9IC9bXFx1MDBkZlxcdTA1ODdcXHUwNTkwLVxcdTA1ZjRcXHUwNjAwLVxcdTA2ZmZcXHUzMDQwLVxcdTMwOWZcXHUzMGEwLVxcdTMwZmZcXHUzNDAwLVxcdTRkYjVcXHU0ZTAwLVxcdTlmY2NcXHVhYzAwLVxcdWQ3YWZdLztcbiAgZnVuY3Rpb24gaXNXb3JkQ2hhckJhc2ljKGNoKSB7XG4gICAgcmV0dXJuIC9cXHcvLnRlc3QoY2gpIHx8IGNoID4gXCJcXHg4MFwiICYmXG4gICAgICAoY2gudG9VcHBlckNhc2UoKSAhPSBjaC50b0xvd2VyQ2FzZSgpIHx8IG5vbkFTQ0lJU2luZ2xlQ2FzZVdvcmRDaGFyLnRlc3QoY2gpKVxuICB9XG4gIGZ1bmN0aW9uIGlzV29yZENoYXIoY2gsIGhlbHBlcikge1xuICAgIGlmICghaGVscGVyKSB7IHJldHVybiBpc1dvcmRDaGFyQmFzaWMoY2gpIH1cbiAgICBpZiAoaGVscGVyLnNvdXJjZS5pbmRleE9mKFwiXFxcXHdcIikgPiAtMSAmJiBpc1dvcmRDaGFyQmFzaWMoY2gpKSB7IHJldHVybiB0cnVlIH1cbiAgICByZXR1cm4gaGVscGVyLnRlc3QoY2gpXG4gIH1cblxuICBmdW5jdGlvbiBpc0VtcHR5KG9iaikge1xuICAgIGZvciAodmFyIG4gaW4gb2JqKSB7IGlmIChvYmouaGFzT3duUHJvcGVydHkobikgJiYgb2JqW25dKSB7IHJldHVybiBmYWxzZSB9IH1cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLy8gRXh0ZW5kaW5nIHVuaWNvZGUgY2hhcmFjdGVycy4gQSBzZXJpZXMgb2YgYSBub24tZXh0ZW5kaW5nIGNoYXIgK1xuICAvLyBhbnkgbnVtYmVyIG9mIGV4dGVuZGluZyBjaGFycyBpcyB0cmVhdGVkIGFzIGEgc2luZ2xlIHVuaXQgYXMgZmFyXG4gIC8vIGFzIGVkaXRpbmcgYW5kIG1lYXN1cmluZyBpcyBjb25jZXJuZWQuIFRoaXMgaXMgbm90IGZ1bGx5IGNvcnJlY3QsXG4gIC8vIHNpbmNlIHNvbWUgc2NyaXB0cy9mb250cy9icm93c2VycyBhbHNvIHRyZWF0IG90aGVyIGNvbmZpZ3VyYXRpb25zXG4gIC8vIG9mIGNvZGUgcG9pbnRzIGFzIGEgZ3JvdXAuXG4gIHZhciBleHRlbmRpbmdDaGFycyA9IC9bXFx1MDMwMC1cXHUwMzZmXFx1MDQ4My1cXHUwNDg5XFx1MDU5MS1cXHUwNWJkXFx1MDViZlxcdTA1YzFcXHUwNWMyXFx1MDVjNFxcdTA1YzVcXHUwNWM3XFx1MDYxMC1cXHUwNjFhXFx1MDY0Yi1cXHUwNjVlXFx1MDY3MFxcdTA2ZDYtXFx1MDZkY1xcdTA2ZGUtXFx1MDZlNFxcdTA2ZTdcXHUwNmU4XFx1MDZlYS1cXHUwNmVkXFx1MDcxMVxcdTA3MzAtXFx1MDc0YVxcdTA3YTYtXFx1MDdiMFxcdTA3ZWItXFx1MDdmM1xcdTA4MTYtXFx1MDgxOVxcdTA4MWItXFx1MDgyM1xcdTA4MjUtXFx1MDgyN1xcdTA4MjktXFx1MDgyZFxcdTA5MDAtXFx1MDkwMlxcdTA5M2NcXHUwOTQxLVxcdTA5NDhcXHUwOTRkXFx1MDk1MS1cXHUwOTU1XFx1MDk2MlxcdTA5NjNcXHUwOTgxXFx1MDliY1xcdTA5YmVcXHUwOWMxLVxcdTA5YzRcXHUwOWNkXFx1MDlkN1xcdTA5ZTJcXHUwOWUzXFx1MGEwMVxcdTBhMDJcXHUwYTNjXFx1MGE0MVxcdTBhNDJcXHUwYTQ3XFx1MGE0OFxcdTBhNGItXFx1MGE0ZFxcdTBhNTFcXHUwYTcwXFx1MGE3MVxcdTBhNzVcXHUwYTgxXFx1MGE4MlxcdTBhYmNcXHUwYWMxLVxcdTBhYzVcXHUwYWM3XFx1MGFjOFxcdTBhY2RcXHUwYWUyXFx1MGFlM1xcdTBiMDFcXHUwYjNjXFx1MGIzZVxcdTBiM2ZcXHUwYjQxLVxcdTBiNDRcXHUwYjRkXFx1MGI1NlxcdTBiNTdcXHUwYjYyXFx1MGI2M1xcdTBiODJcXHUwYmJlXFx1MGJjMFxcdTBiY2RcXHUwYmQ3XFx1MGMzZS1cXHUwYzQwXFx1MGM0Ni1cXHUwYzQ4XFx1MGM0YS1cXHUwYzRkXFx1MGM1NVxcdTBjNTZcXHUwYzYyXFx1MGM2M1xcdTBjYmNcXHUwY2JmXFx1MGNjMlxcdTBjYzZcXHUwY2NjXFx1MGNjZFxcdTBjZDVcXHUwY2Q2XFx1MGNlMlxcdTBjZTNcXHUwZDNlXFx1MGQ0MS1cXHUwZDQ0XFx1MGQ0ZFxcdTBkNTdcXHUwZDYyXFx1MGQ2M1xcdTBkY2FcXHUwZGNmXFx1MGRkMi1cXHUwZGQ0XFx1MGRkNlxcdTBkZGZcXHUwZTMxXFx1MGUzNC1cXHUwZTNhXFx1MGU0Ny1cXHUwZTRlXFx1MGViMVxcdTBlYjQtXFx1MGViOVxcdTBlYmJcXHUwZWJjXFx1MGVjOC1cXHUwZWNkXFx1MGYxOFxcdTBmMTlcXHUwZjM1XFx1MGYzN1xcdTBmMzlcXHUwZjcxLVxcdTBmN2VcXHUwZjgwLVxcdTBmODRcXHUwZjg2XFx1MGY4N1xcdTBmOTAtXFx1MGY5N1xcdTBmOTktXFx1MGZiY1xcdTBmYzZcXHUxMDJkLVxcdTEwMzBcXHUxMDMyLVxcdTEwMzdcXHUxMDM5XFx1MTAzYVxcdTEwM2RcXHUxMDNlXFx1MTA1OFxcdTEwNTlcXHUxMDVlLVxcdTEwNjBcXHUxMDcxLVxcdTEwNzRcXHUxMDgyXFx1MTA4NVxcdTEwODZcXHUxMDhkXFx1MTA5ZFxcdTEzNWZcXHUxNzEyLVxcdTE3MTRcXHUxNzMyLVxcdTE3MzRcXHUxNzUyXFx1MTc1M1xcdTE3NzJcXHUxNzczXFx1MTdiNy1cXHUxN2JkXFx1MTdjNlxcdTE3YzktXFx1MTdkM1xcdTE3ZGRcXHUxODBiLVxcdTE4MGRcXHUxOGE5XFx1MTkyMC1cXHUxOTIyXFx1MTkyN1xcdTE5MjhcXHUxOTMyXFx1MTkzOS1cXHUxOTNiXFx1MWExN1xcdTFhMThcXHUxYTU2XFx1MWE1OC1cXHUxYTVlXFx1MWE2MFxcdTFhNjJcXHUxYTY1LVxcdTFhNmNcXHUxYTczLVxcdTFhN2NcXHUxYTdmXFx1MWIwMC1cXHUxYjAzXFx1MWIzNFxcdTFiMzYtXFx1MWIzYVxcdTFiM2NcXHUxYjQyXFx1MWI2Yi1cXHUxYjczXFx1MWI4MFxcdTFiODFcXHUxYmEyLVxcdTFiYTVcXHUxYmE4XFx1MWJhOVxcdTFjMmMtXFx1MWMzM1xcdTFjMzZcXHUxYzM3XFx1MWNkMC1cXHUxY2QyXFx1MWNkNC1cXHUxY2UwXFx1MWNlMi1cXHUxY2U4XFx1MWNlZFxcdTFkYzAtXFx1MWRlNlxcdTFkZmQtXFx1MWRmZlxcdTIwMGNcXHUyMDBkXFx1MjBkMC1cXHUyMGYwXFx1MmNlZi1cXHUyY2YxXFx1MmRlMC1cXHUyZGZmXFx1MzAyYS1cXHUzMDJmXFx1MzA5OVxcdTMwOWFcXHVhNjZmLVxcdWE2NzJcXHVhNjdjXFx1YTY3ZFxcdWE2ZjBcXHVhNmYxXFx1YTgwMlxcdWE4MDZcXHVhODBiXFx1YTgyNVxcdWE4MjZcXHVhOGM0XFx1YThlMC1cXHVhOGYxXFx1YTkyNi1cXHVhOTJkXFx1YTk0Ny1cXHVhOTUxXFx1YTk4MC1cXHVhOTgyXFx1YTliM1xcdWE5YjYtXFx1YTliOVxcdWE5YmNcXHVhYTI5LVxcdWFhMmVcXHVhYTMxXFx1YWEzMlxcdWFhMzVcXHVhYTM2XFx1YWE0M1xcdWFhNGNcXHVhYWIwXFx1YWFiMi1cXHVhYWI0XFx1YWFiN1xcdWFhYjhcXHVhYWJlXFx1YWFiZlxcdWFhYzFcXHVhYmU1XFx1YWJlOFxcdWFiZWRcXHVkYzAwLVxcdWRmZmZcXHVmYjFlXFx1ZmUwMC1cXHVmZTBmXFx1ZmUyMC1cXHVmZTI2XFx1ZmY5ZVxcdWZmOWZdLztcbiAgZnVuY3Rpb24gaXNFeHRlbmRpbmdDaGFyKGNoKSB7IHJldHVybiBjaC5jaGFyQ29kZUF0KDApID49IDc2OCAmJiBleHRlbmRpbmdDaGFycy50ZXN0KGNoKSB9XG5cbiAgLy8gUmV0dXJucyBhIG51bWJlciBmcm9tIHRoZSByYW5nZSBbYDBgOyBgc3RyLmxlbmd0aGBdIHVubGVzcyBgcG9zYCBpcyBvdXRzaWRlIHRoYXQgcmFuZ2UuXG4gIGZ1bmN0aW9uIHNraXBFeHRlbmRpbmdDaGFycyhzdHIsIHBvcywgZGlyKSB7XG4gICAgd2hpbGUgKChkaXIgPCAwID8gcG9zID4gMCA6IHBvcyA8IHN0ci5sZW5ndGgpICYmIGlzRXh0ZW5kaW5nQ2hhcihzdHIuY2hhckF0KHBvcykpKSB7IHBvcyArPSBkaXI7IH1cbiAgICByZXR1cm4gcG9zXG4gIH1cblxuICAvLyBSZXR1cm5zIHRoZSB2YWx1ZSBmcm9tIHRoZSByYW5nZSBbYGZyb21gOyBgdG9gXSB0aGF0IHNhdGlzZmllc1xuICAvLyBgcHJlZGAgYW5kIGlzIGNsb3Nlc3QgdG8gYGZyb21gLiBBc3N1bWVzIHRoYXQgYXQgbGVhc3QgYHRvYFxuICAvLyBzYXRpc2ZpZXMgYHByZWRgLiBTdXBwb3J0cyBgZnJvbWAgYmVpbmcgZ3JlYXRlciB0aGFuIGB0b2AuXG4gIGZ1bmN0aW9uIGZpbmRGaXJzdChwcmVkLCBmcm9tLCB0bykge1xuICAgIC8vIEF0IGFueSBwb2ludCB3ZSBhcmUgY2VydGFpbiBgdG9gIHNhdGlzZmllcyBgcHJlZGAsIGRvbid0IGtub3dcbiAgICAvLyB3aGV0aGVyIGBmcm9tYCBkb2VzLlxuICAgIHZhciBkaXIgPSBmcm9tID4gdG8gPyAtMSA6IDE7XG4gICAgZm9yICg7Oykge1xuICAgICAgaWYgKGZyb20gPT0gdG8pIHsgcmV0dXJuIGZyb20gfVxuICAgICAgdmFyIG1pZEYgPSAoZnJvbSArIHRvKSAvIDIsIG1pZCA9IGRpciA8IDAgPyBNYXRoLmNlaWwobWlkRikgOiBNYXRoLmZsb29yKG1pZEYpO1xuICAgICAgaWYgKG1pZCA9PSBmcm9tKSB7IHJldHVybiBwcmVkKG1pZCkgPyBmcm9tIDogdG8gfVxuICAgICAgaWYgKHByZWQobWlkKSkgeyB0byA9IG1pZDsgfVxuICAgICAgZWxzZSB7IGZyb20gPSBtaWQgKyBkaXI7IH1cbiAgICB9XG4gIH1cblxuICAvLyBCSURJIEhFTFBFUlNcblxuICBmdW5jdGlvbiBpdGVyYXRlQmlkaVNlY3Rpb25zKG9yZGVyLCBmcm9tLCB0bywgZikge1xuICAgIGlmICghb3JkZXIpIHsgcmV0dXJuIGYoZnJvbSwgdG8sIFwibHRyXCIsIDApIH1cbiAgICB2YXIgZm91bmQgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9yZGVyLmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgcGFydCA9IG9yZGVyW2ldO1xuICAgICAgaWYgKHBhcnQuZnJvbSA8IHRvICYmIHBhcnQudG8gPiBmcm9tIHx8IGZyb20gPT0gdG8gJiYgcGFydC50byA9PSBmcm9tKSB7XG4gICAgICAgIGYoTWF0aC5tYXgocGFydC5mcm9tLCBmcm9tKSwgTWF0aC5taW4ocGFydC50bywgdG8pLCBwYXJ0LmxldmVsID09IDEgPyBcInJ0bFwiIDogXCJsdHJcIiwgaSk7XG4gICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFmb3VuZCkgeyBmKGZyb20sIHRvLCBcImx0clwiKTsgfVxuICB9XG5cbiAgdmFyIGJpZGlPdGhlciA9IG51bGw7XG4gIGZ1bmN0aW9uIGdldEJpZGlQYXJ0QXQob3JkZXIsIGNoLCBzdGlja3kpIHtcbiAgICB2YXIgZm91bmQ7XG4gICAgYmlkaU90aGVyID0gbnVsbDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9yZGVyLmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgY3VyID0gb3JkZXJbaV07XG4gICAgICBpZiAoY3VyLmZyb20gPCBjaCAmJiBjdXIudG8gPiBjaCkgeyByZXR1cm4gaSB9XG4gICAgICBpZiAoY3VyLnRvID09IGNoKSB7XG4gICAgICAgIGlmIChjdXIuZnJvbSAhPSBjdXIudG8gJiYgc3RpY2t5ID09IFwiYmVmb3JlXCIpIHsgZm91bmQgPSBpOyB9XG4gICAgICAgIGVsc2UgeyBiaWRpT3RoZXIgPSBpOyB9XG4gICAgICB9XG4gICAgICBpZiAoY3VyLmZyb20gPT0gY2gpIHtcbiAgICAgICAgaWYgKGN1ci5mcm9tICE9IGN1ci50byAmJiBzdGlja3kgIT0gXCJiZWZvcmVcIikgeyBmb3VuZCA9IGk7IH1cbiAgICAgICAgZWxzZSB7IGJpZGlPdGhlciA9IGk7IH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZvdW5kICE9IG51bGwgPyBmb3VuZCA6IGJpZGlPdGhlclxuICB9XG5cbiAgLy8gQmlkaXJlY3Rpb25hbCBvcmRlcmluZyBhbGdvcml0aG1cbiAgLy8gU2VlIGh0dHA6Ly91bmljb2RlLm9yZy9yZXBvcnRzL3RyOS90cjktMTMuaHRtbCBmb3IgdGhlIGFsZ29yaXRobVxuICAvLyB0aGF0IHRoaXMgKHBhcnRpYWxseSkgaW1wbGVtZW50cy5cblxuICAvLyBPbmUtY2hhciBjb2RlcyB1c2VkIGZvciBjaGFyYWN0ZXIgdHlwZXM6XG4gIC8vIEwgKEwpOiAgIExlZnQtdG8tUmlnaHRcbiAgLy8gUiAoUik6ICAgUmlnaHQtdG8tTGVmdFxuICAvLyByIChBTCk6ICBSaWdodC10by1MZWZ0IEFyYWJpY1xuICAvLyAxIChFTik6ICBFdXJvcGVhbiBOdW1iZXJcbiAgLy8gKyAoRVMpOiAgRXVyb3BlYW4gTnVtYmVyIFNlcGFyYXRvclxuICAvLyAlIChFVCk6ICBFdXJvcGVhbiBOdW1iZXIgVGVybWluYXRvclxuICAvLyBuIChBTik6ICBBcmFiaWMgTnVtYmVyXG4gIC8vICwgKENTKTogIENvbW1vbiBOdW1iZXIgU2VwYXJhdG9yXG4gIC8vIG0gKE5TTSk6IE5vbi1TcGFjaW5nIE1hcmtcbiAgLy8gYiAoQk4pOiAgQm91bmRhcnkgTmV1dHJhbFxuICAvLyBzIChCKTogICBQYXJhZ3JhcGggU2VwYXJhdG9yXG4gIC8vIHQgKFMpOiAgIFNlZ21lbnQgU2VwYXJhdG9yXG4gIC8vIHcgKFdTKTogIFdoaXRlc3BhY2VcbiAgLy8gTiAoT04pOiAgT3RoZXIgTmV1dHJhbHNcblxuICAvLyBSZXR1cm5zIG51bGwgaWYgY2hhcmFjdGVycyBhcmUgb3JkZXJlZCBhcyB0aGV5IGFwcGVhclxuICAvLyAobGVmdC10by1yaWdodCksIG9yIGFuIGFycmF5IG9mIHNlY3Rpb25zICh7ZnJvbSwgdG8sIGxldmVsfVxuICAvLyBvYmplY3RzKSBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBvY2N1ciB2aXN1YWxseS5cbiAgdmFyIGJpZGlPcmRlcmluZyA9IChmdW5jdGlvbigpIHtcbiAgICAvLyBDaGFyYWN0ZXIgdHlwZXMgZm9yIGNvZGVwb2ludHMgMCB0byAweGZmXG4gICAgdmFyIGxvd1R5cGVzID0gXCJiYmJiYmJiYmJ0c3R3c2JiYmJiYmJiYmJiYmJic3NzdHdOTiUlJU5OTk5OTixOLE4xMTExMTExMTExTk5OTk5OTkxMTExMTExMTExMTExMTExMTExMTExMTExMTk5OTk5OTExMTExMTExMTExMTExMTExMTExMTExMTExOTk5OYmJiYmJic2JiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiLE4lJSUlTk5OTkxOTk5OTiUlMTFOTE5OTjFMTk5OTk5MTExMTExMTExMTExMTExMTExMTExMTE5MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTlwiO1xuICAgIC8vIENoYXJhY3RlciB0eXBlcyBmb3IgY29kZXBvaW50cyAweDYwMCB0byAweDZmOVxuICAgIHZhciBhcmFiaWNUeXBlcyA9IFwibm5ubm5uTk5yJSVyLHJOTm1tbW1tbW1tbW1tcnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJybW1tbW1tbW1tbW1tbW1tbW1tbW1tbm5ubm5ubm5ubiVubnJycm1ycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycm1tbW1tbW1uTm1tbW1tbXJybW1ObW1tbXJyMTExMTExMTExMVwiO1xuICAgIGZ1bmN0aW9uIGNoYXJUeXBlKGNvZGUpIHtcbiAgICAgIGlmIChjb2RlIDw9IDB4ZjcpIHsgcmV0dXJuIGxvd1R5cGVzLmNoYXJBdChjb2RlKSB9XG4gICAgICBlbHNlIGlmICgweDU5MCA8PSBjb2RlICYmIGNvZGUgPD0gMHg1ZjQpIHsgcmV0dXJuIFwiUlwiIH1cbiAgICAgIGVsc2UgaWYgKDB4NjAwIDw9IGNvZGUgJiYgY29kZSA8PSAweDZmOSkgeyByZXR1cm4gYXJhYmljVHlwZXMuY2hhckF0KGNvZGUgLSAweDYwMCkgfVxuICAgICAgZWxzZSBpZiAoMHg2ZWUgPD0gY29kZSAmJiBjb2RlIDw9IDB4OGFjKSB7IHJldHVybiBcInJcIiB9XG4gICAgICBlbHNlIGlmICgweDIwMDAgPD0gY29kZSAmJiBjb2RlIDw9IDB4MjAwYikgeyByZXR1cm4gXCJ3XCIgfVxuICAgICAgZWxzZSBpZiAoY29kZSA9PSAweDIwMGMpIHsgcmV0dXJuIFwiYlwiIH1cbiAgICAgIGVsc2UgeyByZXR1cm4gXCJMXCIgfVxuICAgIH1cblxuICAgIHZhciBiaWRpUkUgPSAvW1xcdTA1OTAtXFx1MDVmNFxcdTA2MDAtXFx1MDZmZlxcdTA3MDAtXFx1MDhhY10vO1xuICAgIHZhciBpc05ldXRyYWwgPSAvW3N0d05dLywgaXNTdHJvbmcgPSAvW0xScl0vLCBjb3VudHNBc0xlZnQgPSAvW0xiMW5dLywgY291bnRzQXNOdW0gPSAvWzFuXS87XG5cbiAgICBmdW5jdGlvbiBCaWRpU3BhbihsZXZlbCwgZnJvbSwgdG8pIHtcbiAgICAgIHRoaXMubGV2ZWwgPSBsZXZlbDtcbiAgICAgIHRoaXMuZnJvbSA9IGZyb207IHRoaXMudG8gPSB0bztcbiAgICB9XG5cbiAgICByZXR1cm4gZnVuY3Rpb24oc3RyLCBkaXJlY3Rpb24pIHtcbiAgICAgIHZhciBvdXRlclR5cGUgPSBkaXJlY3Rpb24gPT0gXCJsdHJcIiA/IFwiTFwiIDogXCJSXCI7XG5cbiAgICAgIGlmIChzdHIubGVuZ3RoID09IDAgfHwgZGlyZWN0aW9uID09IFwibHRyXCIgJiYgIWJpZGlSRS50ZXN0KHN0cikpIHsgcmV0dXJuIGZhbHNlIH1cbiAgICAgIHZhciBsZW4gPSBzdHIubGVuZ3RoLCB0eXBlcyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSlcbiAgICAgICAgeyB0eXBlcy5wdXNoKGNoYXJUeXBlKHN0ci5jaGFyQ29kZUF0KGkpKSk7IH1cblxuICAgICAgLy8gVzEuIEV4YW1pbmUgZWFjaCBub24tc3BhY2luZyBtYXJrIChOU00pIGluIHRoZSBsZXZlbCBydW4sIGFuZFxuICAgICAgLy8gY2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBOU00gdG8gdGhlIHR5cGUgb2YgdGhlIHByZXZpb3VzXG4gICAgICAvLyBjaGFyYWN0ZXIuIElmIHRoZSBOU00gaXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsZXZlbCBydW4sIGl0IHdpbGxcbiAgICAgIC8vIGdldCB0aGUgdHlwZSBvZiBzb3IuXG4gICAgICBmb3IgKHZhciBpJDEgPSAwLCBwcmV2ID0gb3V0ZXJUeXBlOyBpJDEgPCBsZW47ICsraSQxKSB7XG4gICAgICAgIHZhciB0eXBlID0gdHlwZXNbaSQxXTtcbiAgICAgICAgaWYgKHR5cGUgPT0gXCJtXCIpIHsgdHlwZXNbaSQxXSA9IHByZXY7IH1cbiAgICAgICAgZWxzZSB7IHByZXYgPSB0eXBlOyB9XG4gICAgICB9XG5cbiAgICAgIC8vIFcyLiBTZWFyY2ggYmFja3dhcmRzIGZyb20gZWFjaCBpbnN0YW5jZSBvZiBhIEV1cm9wZWFuIG51bWJlclxuICAgICAgLy8gdW50aWwgdGhlIGZpcnN0IHN0cm9uZyB0eXBlIChSLCBMLCBBTCwgb3Igc29yKSBpcyBmb3VuZC4gSWYgYW5cbiAgICAgIC8vIEFMIGlzIGZvdW5kLCBjaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIEV1cm9wZWFuIG51bWJlciB0byBBcmFiaWNcbiAgICAgIC8vIG51bWJlci5cbiAgICAgIC8vIFczLiBDaGFuZ2UgYWxsIEFMcyB0byBSLlxuICAgICAgZm9yICh2YXIgaSQyID0gMCwgY3VyID0gb3V0ZXJUeXBlOyBpJDIgPCBsZW47ICsraSQyKSB7XG4gICAgICAgIHZhciB0eXBlJDEgPSB0eXBlc1tpJDJdO1xuICAgICAgICBpZiAodHlwZSQxID09IFwiMVwiICYmIGN1ciA9PSBcInJcIikgeyB0eXBlc1tpJDJdID0gXCJuXCI7IH1cbiAgICAgICAgZWxzZSBpZiAoaXNTdHJvbmcudGVzdCh0eXBlJDEpKSB7IGN1ciA9IHR5cGUkMTsgaWYgKHR5cGUkMSA9PSBcInJcIikgeyB0eXBlc1tpJDJdID0gXCJSXCI7IH0gfVxuICAgICAgfVxuXG4gICAgICAvLyBXNC4gQSBzaW5nbGUgRXVyb3BlYW4gc2VwYXJhdG9yIGJldHdlZW4gdHdvIEV1cm9wZWFuIG51bWJlcnNcbiAgICAgIC8vIGNoYW5nZXMgdG8gYSBFdXJvcGVhbiBudW1iZXIuIEEgc2luZ2xlIGNvbW1vbiBzZXBhcmF0b3IgYmV0d2VlblxuICAgICAgLy8gdHdvIG51bWJlcnMgb2YgdGhlIHNhbWUgdHlwZSBjaGFuZ2VzIHRvIHRoYXQgdHlwZS5cbiAgICAgIGZvciAodmFyIGkkMyA9IDEsIHByZXYkMSA9IHR5cGVzWzBdOyBpJDMgPCBsZW4gLSAxOyArK2kkMykge1xuICAgICAgICB2YXIgdHlwZSQyID0gdHlwZXNbaSQzXTtcbiAgICAgICAgaWYgKHR5cGUkMiA9PSBcIitcIiAmJiBwcmV2JDEgPT0gXCIxXCIgJiYgdHlwZXNbaSQzKzFdID09IFwiMVwiKSB7IHR5cGVzW2kkM10gPSBcIjFcIjsgfVxuICAgICAgICBlbHNlIGlmICh0eXBlJDIgPT0gXCIsXCIgJiYgcHJldiQxID09IHR5cGVzW2kkMysxXSAmJlxuICAgICAgICAgICAgICAgICAocHJldiQxID09IFwiMVwiIHx8IHByZXYkMSA9PSBcIm5cIikpIHsgdHlwZXNbaSQzXSA9IHByZXYkMTsgfVxuICAgICAgICBwcmV2JDEgPSB0eXBlJDI7XG4gICAgICB9XG5cbiAgICAgIC8vIFc1LiBBIHNlcXVlbmNlIG9mIEV1cm9wZWFuIHRlcm1pbmF0b3JzIGFkamFjZW50IHRvIEV1cm9wZWFuXG4gICAgICAvLyBudW1iZXJzIGNoYW5nZXMgdG8gYWxsIEV1cm9wZWFuIG51bWJlcnMuXG4gICAgICAvLyBXNi4gT3RoZXJ3aXNlLCBzZXBhcmF0b3JzIGFuZCB0ZXJtaW5hdG9ycyBjaGFuZ2UgdG8gT3RoZXJcbiAgICAgIC8vIE5ldXRyYWwuXG4gICAgICBmb3IgKHZhciBpJDQgPSAwOyBpJDQgPCBsZW47ICsraSQ0KSB7XG4gICAgICAgIHZhciB0eXBlJDMgPSB0eXBlc1tpJDRdO1xuICAgICAgICBpZiAodHlwZSQzID09IFwiLFwiKSB7IHR5cGVzW2kkNF0gPSBcIk5cIjsgfVxuICAgICAgICBlbHNlIGlmICh0eXBlJDMgPT0gXCIlXCIpIHtcbiAgICAgICAgICB2YXIgZW5kID0gKHZvaWQgMCk7XG4gICAgICAgICAgZm9yIChlbmQgPSBpJDQgKyAxOyBlbmQgPCBsZW4gJiYgdHlwZXNbZW5kXSA9PSBcIiVcIjsgKytlbmQpIHt9XG4gICAgICAgICAgdmFyIHJlcGxhY2UgPSAoaSQ0ICYmIHR5cGVzW2kkNC0xXSA9PSBcIiFcIikgfHwgKGVuZCA8IGxlbiAmJiB0eXBlc1tlbmRdID09IFwiMVwiKSA/IFwiMVwiIDogXCJOXCI7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IGkkNDsgaiA8IGVuZDsgKytqKSB7IHR5cGVzW2pdID0gcmVwbGFjZTsgfVxuICAgICAgICAgIGkkNCA9IGVuZCAtIDE7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVzcuIFNlYXJjaCBiYWNrd2FyZHMgZnJvbSBlYWNoIGluc3RhbmNlIG9mIGEgRXVyb3BlYW4gbnVtYmVyXG4gICAgICAvLyB1bnRpbCB0aGUgZmlyc3Qgc3Ryb25nIHR5cGUgKFIsIEwsIG9yIHNvcikgaXMgZm91bmQuIElmIGFuIEwgaXNcbiAgICAgIC8vIGZvdW5kLCB0aGVuIGNoYW5nZSB0aGUgdHlwZSBvZiB0aGUgRXVyb3BlYW4gbnVtYmVyIHRvIEwuXG4gICAgICBmb3IgKHZhciBpJDUgPSAwLCBjdXIkMSA9IG91dGVyVHlwZTsgaSQ1IDwgbGVuOyArK2kkNSkge1xuICAgICAgICB2YXIgdHlwZSQ0ID0gdHlwZXNbaSQ1XTtcbiAgICAgICAgaWYgKGN1ciQxID09IFwiTFwiICYmIHR5cGUkNCA9PSBcIjFcIikgeyB0eXBlc1tpJDVdID0gXCJMXCI7IH1cbiAgICAgICAgZWxzZSBpZiAoaXNTdHJvbmcudGVzdCh0eXBlJDQpKSB7IGN1ciQxID0gdHlwZSQ0OyB9XG4gICAgICB9XG5cbiAgICAgIC8vIE4xLiBBIHNlcXVlbmNlIG9mIG5ldXRyYWxzIHRha2VzIHRoZSBkaXJlY3Rpb24gb2YgdGhlXG4gICAgICAvLyBzdXJyb3VuZGluZyBzdHJvbmcgdGV4dCBpZiB0aGUgdGV4dCBvbiBib3RoIHNpZGVzIGhhcyB0aGUgc2FtZVxuICAgICAgLy8gZGlyZWN0aW9uLiBFdXJvcGVhbiBhbmQgQXJhYmljIG51bWJlcnMgYWN0IGFzIGlmIHRoZXkgd2VyZSBSIGluXG4gICAgICAvLyB0ZXJtcyBvZiB0aGVpciBpbmZsdWVuY2Ugb24gbmV1dHJhbHMuIFN0YXJ0LW9mLWxldmVsLXJ1biAoc29yKVxuICAgICAgLy8gYW5kIGVuZC1vZi1sZXZlbC1ydW4gKGVvcikgYXJlIHVzZWQgYXQgbGV2ZWwgcnVuIGJvdW5kYXJpZXMuXG4gICAgICAvLyBOMi4gQW55IHJlbWFpbmluZyBuZXV0cmFscyB0YWtlIHRoZSBlbWJlZGRpbmcgZGlyZWN0aW9uLlxuICAgICAgZm9yICh2YXIgaSQ2ID0gMDsgaSQ2IDwgbGVuOyArK2kkNikge1xuICAgICAgICBpZiAoaXNOZXV0cmFsLnRlc3QodHlwZXNbaSQ2XSkpIHtcbiAgICAgICAgICB2YXIgZW5kJDEgPSAodm9pZCAwKTtcbiAgICAgICAgICBmb3IgKGVuZCQxID0gaSQ2ICsgMTsgZW5kJDEgPCBsZW4gJiYgaXNOZXV0cmFsLnRlc3QodHlwZXNbZW5kJDFdKTsgKytlbmQkMSkge31cbiAgICAgICAgICB2YXIgYmVmb3JlID0gKGkkNiA/IHR5cGVzW2kkNi0xXSA6IG91dGVyVHlwZSkgPT0gXCJMXCI7XG4gICAgICAgICAgdmFyIGFmdGVyID0gKGVuZCQxIDwgbGVuID8gdHlwZXNbZW5kJDFdIDogb3V0ZXJUeXBlKSA9PSBcIkxcIjtcbiAgICAgICAgICB2YXIgcmVwbGFjZSQxID0gYmVmb3JlID09IGFmdGVyID8gKGJlZm9yZSA/IFwiTFwiIDogXCJSXCIpIDogb3V0ZXJUeXBlO1xuICAgICAgICAgIGZvciAodmFyIGokMSA9IGkkNjsgaiQxIDwgZW5kJDE7ICsraiQxKSB7IHR5cGVzW2okMV0gPSByZXBsYWNlJDE7IH1cbiAgICAgICAgICBpJDYgPSBlbmQkMSAtIDE7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSGVyZSB3ZSBkZXBhcnQgZnJvbSB0aGUgZG9jdW1lbnRlZCBhbGdvcml0aG0sIGluIG9yZGVyIHRvIGF2b2lkXG4gICAgICAvLyBidWlsZGluZyB1cCBhbiBhY3R1YWwgbGV2ZWxzIGFycmF5LiBTaW5jZSB0aGVyZSBhcmUgb25seSB0aHJlZVxuICAgICAgLy8gbGV2ZWxzICgwLCAxLCAyKSBpbiBhbiBpbXBsZW1lbnRhdGlvbiB0aGF0IGRvZXNuJ3QgdGFrZVxuICAgICAgLy8gZXhwbGljaXQgZW1iZWRkaW5nIGludG8gYWNjb3VudCwgd2UgY2FuIGJ1aWxkIHVwIHRoZSBvcmRlciBvblxuICAgICAgLy8gdGhlIGZseSwgd2l0aG91dCBmb2xsb3dpbmcgdGhlIGxldmVsLWJhc2VkIGFsZ29yaXRobS5cbiAgICAgIHZhciBvcmRlciA9IFtdLCBtO1xuICAgICAgZm9yICh2YXIgaSQ3ID0gMDsgaSQ3IDwgbGVuOykge1xuICAgICAgICBpZiAoY291bnRzQXNMZWZ0LnRlc3QodHlwZXNbaSQ3XSkpIHtcbiAgICAgICAgICB2YXIgc3RhcnQgPSBpJDc7XG4gICAgICAgICAgZm9yICgrK2kkNzsgaSQ3IDwgbGVuICYmIGNvdW50c0FzTGVmdC50ZXN0KHR5cGVzW2kkN10pOyArK2kkNykge31cbiAgICAgICAgICBvcmRlci5wdXNoKG5ldyBCaWRpU3BhbigwLCBzdGFydCwgaSQ3KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHBvcyA9IGkkNywgYXQgPSBvcmRlci5sZW5ndGgsIGlzUlRMID0gZGlyZWN0aW9uID09IFwicnRsXCIgPyAxIDogMDtcbiAgICAgICAgICBmb3IgKCsraSQ3OyBpJDcgPCBsZW4gJiYgdHlwZXNbaSQ3XSAhPSBcIkxcIjsgKytpJDcpIHt9XG4gICAgICAgICAgZm9yICh2YXIgaiQyID0gcG9zOyBqJDIgPCBpJDc7KSB7XG4gICAgICAgICAgICBpZiAoY291bnRzQXNOdW0udGVzdCh0eXBlc1tqJDJdKSkge1xuICAgICAgICAgICAgICBpZiAocG9zIDwgaiQyKSB7IG9yZGVyLnNwbGljZShhdCwgMCwgbmV3IEJpZGlTcGFuKDEsIHBvcywgaiQyKSk7IGF0ICs9IGlzUlRMOyB9XG4gICAgICAgICAgICAgIHZhciBuc3RhcnQgPSBqJDI7XG4gICAgICAgICAgICAgIGZvciAoKytqJDI7IGokMiA8IGkkNyAmJiBjb3VudHNBc051bS50ZXN0KHR5cGVzW2okMl0pOyArK2okMikge31cbiAgICAgICAgICAgICAgb3JkZXIuc3BsaWNlKGF0LCAwLCBuZXcgQmlkaVNwYW4oMiwgbnN0YXJ0LCBqJDIpKTtcbiAgICAgICAgICAgICAgYXQgKz0gaXNSVEw7XG4gICAgICAgICAgICAgIHBvcyA9IGokMjtcbiAgICAgICAgICAgIH0gZWxzZSB7ICsraiQyOyB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwb3MgPCBpJDcpIHsgb3JkZXIuc3BsaWNlKGF0LCAwLCBuZXcgQmlkaVNwYW4oMSwgcG9zLCBpJDcpKTsgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZGlyZWN0aW9uID09IFwibHRyXCIpIHtcbiAgICAgICAgaWYgKG9yZGVyWzBdLmxldmVsID09IDEgJiYgKG0gPSBzdHIubWF0Y2goL15cXHMrLykpKSB7XG4gICAgICAgICAgb3JkZXJbMF0uZnJvbSA9IG1bMF0ubGVuZ3RoO1xuICAgICAgICAgIG9yZGVyLnVuc2hpZnQobmV3IEJpZGlTcGFuKDAsIDAsIG1bMF0ubGVuZ3RoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxzdChvcmRlcikubGV2ZWwgPT0gMSAmJiAobSA9IHN0ci5tYXRjaCgvXFxzKyQvKSkpIHtcbiAgICAgICAgICBsc3Qob3JkZXIpLnRvIC09IG1bMF0ubGVuZ3RoO1xuICAgICAgICAgIG9yZGVyLnB1c2gobmV3IEJpZGlTcGFuKDAsIGxlbiAtIG1bMF0ubGVuZ3RoLCBsZW4pKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGlyZWN0aW9uID09IFwicnRsXCIgPyBvcmRlci5yZXZlcnNlKCkgOiBvcmRlclxuICAgIH1cbiAgfSkoKTtcblxuICAvLyBHZXQgdGhlIGJpZGkgb3JkZXJpbmcgZm9yIHRoZSBnaXZlbiBsaW5lIChhbmQgY2FjaGUgaXQpLiBSZXR1cm5zXG4gIC8vIGZhbHNlIGZvciBsaW5lcyB0aGF0IGFyZSBmdWxseSBsZWZ0LXRvLXJpZ2h0LCBhbmQgYW4gYXJyYXkgb2ZcbiAgLy8gQmlkaVNwYW4gb2JqZWN0cyBvdGhlcndpc2UuXG4gIGZ1bmN0aW9uIGdldE9yZGVyKGxpbmUsIGRpcmVjdGlvbikge1xuICAgIHZhciBvcmRlciA9IGxpbmUub3JkZXI7XG4gICAgaWYgKG9yZGVyID09IG51bGwpIHsgb3JkZXIgPSBsaW5lLm9yZGVyID0gYmlkaU9yZGVyaW5nKGxpbmUudGV4dCwgZGlyZWN0aW9uKTsgfVxuICAgIHJldHVybiBvcmRlclxuICB9XG5cbiAgLy8gRVZFTlQgSEFORExJTkdcblxuICAvLyBMaWdodHdlaWdodCBldmVudCBmcmFtZXdvcmsuIG9uL29mZiBhbHNvIHdvcmsgb24gRE9NIG5vZGVzLFxuICAvLyByZWdpc3RlcmluZyBuYXRpdmUgRE9NIGhhbmRsZXJzLlxuXG4gIHZhciBub0hhbmRsZXJzID0gW107XG5cbiAgdmFyIG9uID0gZnVuY3Rpb24oZW1pdHRlciwgdHlwZSwgZikge1xuICAgIGlmIChlbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgIGVtaXR0ZXIuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBmLCBmYWxzZSk7XG4gICAgfSBlbHNlIGlmIChlbWl0dGVyLmF0dGFjaEV2ZW50KSB7XG4gICAgICBlbWl0dGVyLmF0dGFjaEV2ZW50KFwib25cIiArIHR5cGUsIGYpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbWFwID0gZW1pdHRlci5faGFuZGxlcnMgfHwgKGVtaXR0ZXIuX2hhbmRsZXJzID0ge30pO1xuICAgICAgbWFwW3R5cGVdID0gKG1hcFt0eXBlXSB8fCBub0hhbmRsZXJzKS5jb25jYXQoZik7XG4gICAgfVxuICB9O1xuXG4gIGZ1bmN0aW9uIGdldEhhbmRsZXJzKGVtaXR0ZXIsIHR5cGUpIHtcbiAgICByZXR1cm4gZW1pdHRlci5faGFuZGxlcnMgJiYgZW1pdHRlci5faGFuZGxlcnNbdHlwZV0gfHwgbm9IYW5kbGVyc1xuICB9XG5cbiAgZnVuY3Rpb24gb2ZmKGVtaXR0ZXIsIHR5cGUsIGYpIHtcbiAgICBpZiAoZW1pdHRlci5yZW1vdmVFdmVudExpc3RlbmVyKSB7XG4gICAgICBlbWl0dGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgZiwgZmFsc2UpO1xuICAgIH0gZWxzZSBpZiAoZW1pdHRlci5kZXRhY2hFdmVudCkge1xuICAgICAgZW1pdHRlci5kZXRhY2hFdmVudChcIm9uXCIgKyB0eXBlLCBmKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIG1hcCA9IGVtaXR0ZXIuX2hhbmRsZXJzLCBhcnIgPSBtYXAgJiYgbWFwW3R5cGVdO1xuICAgICAgaWYgKGFycikge1xuICAgICAgICB2YXIgaW5kZXggPSBpbmRleE9mKGFyciwgZik7XG4gICAgICAgIGlmIChpbmRleCA+IC0xKVxuICAgICAgICAgIHsgbWFwW3R5cGVdID0gYXJyLnNsaWNlKDAsIGluZGV4KS5jb25jYXQoYXJyLnNsaWNlKGluZGV4ICsgMSkpOyB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2lnbmFsKGVtaXR0ZXIsIHR5cGUgLyosIHZhbHVlcy4uLiovKSB7XG4gICAgdmFyIGhhbmRsZXJzID0gZ2V0SGFuZGxlcnMoZW1pdHRlciwgdHlwZSk7XG4gICAgaWYgKCFoYW5kbGVycy5sZW5ndGgpIHsgcmV0dXJuIH1cbiAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBoYW5kbGVycy5sZW5ndGg7ICsraSkgeyBoYW5kbGVyc1tpXS5hcHBseShudWxsLCBhcmdzKTsgfVxuICB9XG5cbiAgLy8gVGhlIERPTSBldmVudHMgdGhhdCBDb2RlTWlycm9yIGhhbmRsZXMgY2FuIGJlIG92ZXJyaWRkZW4gYnlcbiAgLy8gcmVnaXN0ZXJpbmcgYSAobm9uLURPTSkgaGFuZGxlciBvbiB0aGUgZWRpdG9yIGZvciB0aGUgZXZlbnQgbmFtZSxcbiAgLy8gYW5kIHByZXZlbnREZWZhdWx0LWluZyB0aGUgZXZlbnQgaW4gdGhhdCBoYW5kbGVyLlxuICBmdW5jdGlvbiBzaWduYWxET01FdmVudChjbSwgZSwgb3ZlcnJpZGUpIHtcbiAgICBpZiAodHlwZW9mIGUgPT0gXCJzdHJpbmdcIilcbiAgICAgIHsgZSA9IHt0eXBlOiBlLCBwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24oKSB7IHRoaXMuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7IH19OyB9XG4gICAgc2lnbmFsKGNtLCBvdmVycmlkZSB8fCBlLnR5cGUsIGNtLCBlKTtcbiAgICByZXR1cm4gZV9kZWZhdWx0UHJldmVudGVkKGUpIHx8IGUuY29kZW1pcnJvcklnbm9yZVxuICB9XG5cbiAgZnVuY3Rpb24gc2lnbmFsQ3Vyc29yQWN0aXZpdHkoY20pIHtcbiAgICB2YXIgYXJyID0gY20uX2hhbmRsZXJzICYmIGNtLl9oYW5kbGVycy5jdXJzb3JBY3Rpdml0eTtcbiAgICBpZiAoIWFycikgeyByZXR1cm4gfVxuICAgIHZhciBzZXQgPSBjbS5jdXJPcC5jdXJzb3JBY3Rpdml0eUhhbmRsZXJzIHx8IChjbS5jdXJPcC5jdXJzb3JBY3Rpdml0eUhhbmRsZXJzID0gW10pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgKytpKSB7IGlmIChpbmRleE9mKHNldCwgYXJyW2ldKSA9PSAtMSlcbiAgICAgIHsgc2V0LnB1c2goYXJyW2ldKTsgfSB9XG4gIH1cblxuICBmdW5jdGlvbiBoYXNIYW5kbGVyKGVtaXR0ZXIsIHR5cGUpIHtcbiAgICByZXR1cm4gZ2V0SGFuZGxlcnMoZW1pdHRlciwgdHlwZSkubGVuZ3RoID4gMFxuICB9XG5cbiAgLy8gQWRkIG9uIGFuZCBvZmYgbWV0aG9kcyB0byBhIGNvbnN0cnVjdG9yJ3MgcHJvdG90eXBlLCB0byBtYWtlXG4gIC8vIHJlZ2lzdGVyaW5nIGV2ZW50cyBvbiBzdWNoIG9iamVjdHMgbW9yZSBjb252ZW5pZW50LlxuICBmdW5jdGlvbiBldmVudE1peGluKGN0b3IpIHtcbiAgICBjdG9yLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uKHR5cGUsIGYpIHtvbih0aGlzLCB0eXBlLCBmKTt9O1xuICAgIGN0b3IucHJvdG90eXBlLm9mZiA9IGZ1bmN0aW9uKHR5cGUsIGYpIHtvZmYodGhpcywgdHlwZSwgZik7fTtcbiAgfVxuXG4gIC8vIER1ZSB0byB0aGUgZmFjdCB0aGF0IHdlIHN0aWxsIHN1cHBvcnQganVyYXNzaWMgSUUgdmVyc2lvbnMsIHNvbWVcbiAgLy8gY29tcGF0aWJpbGl0eSB3cmFwcGVycyBhcmUgbmVlZGVkLlxuXG4gIGZ1bmN0aW9uIGVfcHJldmVudERlZmF1bHQoZSkge1xuICAgIGlmIChlLnByZXZlbnREZWZhdWx0KSB7IGUucHJldmVudERlZmF1bHQoKTsgfVxuICAgIGVsc2UgeyBlLnJldHVyblZhbHVlID0gZmFsc2U7IH1cbiAgfVxuICBmdW5jdGlvbiBlX3N0b3BQcm9wYWdhdGlvbihlKSB7XG4gICAgaWYgKGUuc3RvcFByb3BhZ2F0aW9uKSB7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IH1cbiAgICBlbHNlIHsgZS5jYW5jZWxCdWJibGUgPSB0cnVlOyB9XG4gIH1cbiAgZnVuY3Rpb24gZV9kZWZhdWx0UHJldmVudGVkKGUpIHtcbiAgICByZXR1cm4gZS5kZWZhdWx0UHJldmVudGVkICE9IG51bGwgPyBlLmRlZmF1bHRQcmV2ZW50ZWQgOiBlLnJldHVyblZhbHVlID09IGZhbHNlXG4gIH1cbiAgZnVuY3Rpb24gZV9zdG9wKGUpIHtlX3ByZXZlbnREZWZhdWx0KGUpOyBlX3N0b3BQcm9wYWdhdGlvbihlKTt9XG5cbiAgZnVuY3Rpb24gZV90YXJnZXQoZSkge3JldHVybiBlLnRhcmdldCB8fCBlLnNyY0VsZW1lbnR9XG4gIGZ1bmN0aW9uIGVfYnV0dG9uKGUpIHtcbiAgICB2YXIgYiA9IGUud2hpY2g7XG4gICAgaWYgKGIgPT0gbnVsbCkge1xuICAgICAgaWYgKGUuYnV0dG9uICYgMSkgeyBiID0gMTsgfVxuICAgICAgZWxzZSBpZiAoZS5idXR0b24gJiAyKSB7IGIgPSAzOyB9XG4gICAgICBlbHNlIGlmIChlLmJ1dHRvbiAmIDQpIHsgYiA9IDI7IH1cbiAgICB9XG4gICAgaWYgKG1hYyAmJiBlLmN0cmxLZXkgJiYgYiA9PSAxKSB7IGIgPSAzOyB9XG4gICAgcmV0dXJuIGJcbiAgfVxuXG4gIC8vIERldGVjdCBkcmFnLWFuZC1kcm9wXG4gIHZhciBkcmFnQW5kRHJvcCA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIFRoZXJlIGlzICpzb21lKiBraW5kIG9mIGRyYWctYW5kLWRyb3Agc3VwcG9ydCBpbiBJRTYtOCwgYnV0IElcbiAgICAvLyBjb3VsZG4ndCBnZXQgaXQgdG8gd29yayB5ZXQuXG4gICAgaWYgKGllICYmIGllX3ZlcnNpb24gPCA5KSB7IHJldHVybiBmYWxzZSB9XG4gICAgdmFyIGRpdiA9IGVsdCgnZGl2Jyk7XG4gICAgcmV0dXJuIFwiZHJhZ2dhYmxlXCIgaW4gZGl2IHx8IFwiZHJhZ0Ryb3BcIiBpbiBkaXZcbiAgfSgpO1xuXG4gIHZhciB6d3NwU3VwcG9ydGVkO1xuICBmdW5jdGlvbiB6ZXJvV2lkdGhFbGVtZW50KG1lYXN1cmUpIHtcbiAgICBpZiAoendzcFN1cHBvcnRlZCA9PSBudWxsKSB7XG4gICAgICB2YXIgdGVzdCA9IGVsdChcInNwYW5cIiwgXCJcXHUyMDBiXCIpO1xuICAgICAgcmVtb3ZlQ2hpbGRyZW5BbmRBZGQobWVhc3VyZSwgZWx0KFwic3BhblwiLCBbdGVzdCwgZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCJ4XCIpXSkpO1xuICAgICAgaWYgKG1lYXN1cmUuZmlyc3RDaGlsZC5vZmZzZXRIZWlnaHQgIT0gMClcbiAgICAgICAgeyB6d3NwU3VwcG9ydGVkID0gdGVzdC5vZmZzZXRXaWR0aCA8PSAxICYmIHRlc3Qub2Zmc2V0SGVpZ2h0ID4gMiAmJiAhKGllICYmIGllX3ZlcnNpb24gPCA4KTsgfVxuICAgIH1cbiAgICB2YXIgbm9kZSA9IHp3c3BTdXBwb3J0ZWQgPyBlbHQoXCJzcGFuXCIsIFwiXFx1MjAwYlwiKSA6XG4gICAgICBlbHQoXCJzcGFuXCIsIFwiXFx1MDBhMFwiLCBudWxsLCBcImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2lkdGg6IDFweDsgbWFyZ2luLXJpZ2h0OiAtMXB4XCIpO1xuICAgIG5vZGUuc2V0QXR0cmlidXRlKFwiY20tdGV4dFwiLCBcIlwiKTtcbiAgICByZXR1cm4gbm9kZVxuICB9XG5cbiAgLy8gRmVhdHVyZS1kZXRlY3QgSUUncyBjcnVtbXkgY2xpZW50IHJlY3QgcmVwb3J0aW5nIGZvciBiaWRpIHRleHRcbiAgdmFyIGJhZEJpZGlSZWN0cztcbiAgZnVuY3Rpb24gaGFzQmFkQmlkaVJlY3RzKG1lYXN1cmUpIHtcbiAgICBpZiAoYmFkQmlkaVJlY3RzICE9IG51bGwpIHsgcmV0dXJuIGJhZEJpZGlSZWN0cyB9XG4gICAgdmFyIHR4dCA9IHJlbW92ZUNoaWxkcmVuQW5kQWRkKG1lYXN1cmUsIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiQVxcdTA2MmVBXCIpKTtcbiAgICB2YXIgcjAgPSByYW5nZSh0eHQsIDAsIDEpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHZhciByMSA9IHJhbmdlKHR4dCwgMSwgMikuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgcmVtb3ZlQ2hpbGRyZW4obWVhc3VyZSk7XG4gICAgaWYgKCFyMCB8fCByMC5sZWZ0ID09IHIwLnJpZ2h0KSB7IHJldHVybiBmYWxzZSB9IC8vIFNhZmFyaSByZXR1cm5zIG51bGwgaW4gc29tZSBjYXNlcyAoIzI3ODApXG4gICAgcmV0dXJuIGJhZEJpZGlSZWN0cyA9IChyMS5yaWdodCAtIHIwLnJpZ2h0IDwgMylcbiAgfVxuXG4gIC8vIFNlZSBpZiBcIlwiLnNwbGl0IGlzIHRoZSBicm9rZW4gSUUgdmVyc2lvbiwgaWYgc28sIHByb3ZpZGUgYW5cbiAgLy8gYWx0ZXJuYXRpdmUgd2F5IHRvIHNwbGl0IGxpbmVzLlxuICB2YXIgc3BsaXRMaW5lc0F1dG8gPSBcIlxcblxcbmJcIi5zcGxpdCgvXFxuLykubGVuZ3RoICE9IDMgPyBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgdmFyIHBvcyA9IDAsIHJlc3VsdCA9IFtdLCBsID0gc3RyaW5nLmxlbmd0aDtcbiAgICB3aGlsZSAocG9zIDw9IGwpIHtcbiAgICAgIHZhciBubCA9IHN0cmluZy5pbmRleE9mKFwiXFxuXCIsIHBvcyk7XG4gICAgICBpZiAobmwgPT0gLTEpIHsgbmwgPSBzdHJpbmcubGVuZ3RoOyB9XG4gICAgICB2YXIgbGluZSA9IHN0cmluZy5zbGljZShwb3MsIHN0cmluZy5jaGFyQXQobmwgLSAxKSA9PSBcIlxcclwiID8gbmwgLSAxIDogbmwpO1xuICAgICAgdmFyIHJ0ID0gbGluZS5pbmRleE9mKFwiXFxyXCIpO1xuICAgICAgaWYgKHJ0ICE9IC0xKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGxpbmUuc2xpY2UoMCwgcnQpKTtcbiAgICAgICAgcG9zICs9IHJ0ICsgMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGxpbmUpO1xuICAgICAgICBwb3MgPSBubCArIDE7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfSA6IGZ1bmN0aW9uIChzdHJpbmcpIHsgcmV0dXJuIHN0cmluZy5zcGxpdCgvXFxyXFxuP3xcXG4vKTsgfTtcblxuICB2YXIgaGFzU2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbiA/IGZ1bmN0aW9uICh0ZSkge1xuICAgIHRyeSB7IHJldHVybiB0ZS5zZWxlY3Rpb25TdGFydCAhPSB0ZS5zZWxlY3Rpb25FbmQgfVxuICAgIGNhdGNoKGUpIHsgcmV0dXJuIGZhbHNlIH1cbiAgfSA6IGZ1bmN0aW9uICh0ZSkge1xuICAgIHZhciByYW5nZTtcbiAgICB0cnkge3JhbmdlID0gdGUub3duZXJEb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKTt9XG4gICAgY2F0Y2goZSkge31cbiAgICBpZiAoIXJhbmdlIHx8IHJhbmdlLnBhcmVudEVsZW1lbnQoKSAhPSB0ZSkgeyByZXR1cm4gZmFsc2UgfVxuICAgIHJldHVybiByYW5nZS5jb21wYXJlRW5kUG9pbnRzKFwiU3RhcnRUb0VuZFwiLCByYW5nZSkgIT0gMFxuICB9O1xuXG4gIHZhciBoYXNDb3B5RXZlbnQgPSAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBlID0gZWx0KFwiZGl2XCIpO1xuICAgIGlmIChcIm9uY29weVwiIGluIGUpIHsgcmV0dXJuIHRydWUgfVxuICAgIGUuc2V0QXR0cmlidXRlKFwib25jb3B5XCIsIFwicmV0dXJuO1wiKTtcbiAgICByZXR1cm4gdHlwZW9mIGUub25jb3B5ID09IFwiZnVuY3Rpb25cIlxuICB9KSgpO1xuXG4gIHZhciBiYWRab29tZWRSZWN0cyA9IG51bGw7XG4gIGZ1bmN0aW9uIGhhc0JhZFpvb21lZFJlY3RzKG1lYXN1cmUpIHtcbiAgICBpZiAoYmFkWm9vbWVkUmVjdHMgIT0gbnVsbCkgeyByZXR1cm4gYmFkWm9vbWVkUmVjdHMgfVxuICAgIHZhciBub2RlID0gcmVtb3ZlQ2hpbGRyZW5BbmRBZGQobWVhc3VyZSwgZWx0KFwic3BhblwiLCBcInhcIikpO1xuICAgIHZhciBub3JtYWwgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHZhciBmcm9tUmFuZ2UgPSByYW5nZShub2RlLCAwLCAxKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICByZXR1cm4gYmFkWm9vbWVkUmVjdHMgPSBNYXRoLmFicyhub3JtYWwubGVmdCAtIGZyb21SYW5nZS5sZWZ0KSA+IDFcbiAgfVxuXG4gIC8vIEtub3duIG1vZGVzLCBieSBuYW1lIGFuZCBieSBNSU1FXG4gIHZhciBtb2RlcyA9IHt9LCBtaW1lTW9kZXMgPSB7fTtcblxuICAvLyBFeHRyYSBhcmd1bWVudHMgYXJlIHN0b3JlZCBhcyB0aGUgbW9kZSdzIGRlcGVuZGVuY2llcywgd2hpY2ggaXNcbiAgLy8gdXNlZCBieSAobGVnYWN5KSBtZWNoYW5pc21zIGxpa2UgbG9hZG1vZGUuanMgdG8gYXV0b21hdGljYWxseVxuICAvLyBsb2FkIGEgbW9kZS4gKFByZWZlcnJlZCBtZWNoYW5pc20gaXMgdGhlIHJlcXVpcmUvZGVmaW5lIGNhbGxzLilcbiAgZnVuY3Rpb24gZGVmaW5lTW9kZShuYW1lLCBtb2RlKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKVxuICAgICAgeyBtb2RlLmRlcGVuZGVuY2llcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMik7IH1cbiAgICBtb2Rlc1tuYW1lXSA9IG1vZGU7XG4gIH1cblxuICBmdW5jdGlvbiBkZWZpbmVNSU1FKG1pbWUsIHNwZWMpIHtcbiAgICBtaW1lTW9kZXNbbWltZV0gPSBzcGVjO1xuICB9XG5cbiAgLy8gR2l2ZW4gYSBNSU1FIHR5cGUsIGEge25hbWUsIC4uLm9wdGlvbnN9IGNvbmZpZyBvYmplY3QsIG9yIGEgbmFtZVxuICAvLyBzdHJpbmcsIHJldHVybiBhIG1vZGUgY29uZmlnIG9iamVjdC5cbiAgZnVuY3Rpb24gcmVzb2x2ZU1vZGUoc3BlYykge1xuICAgIGlmICh0eXBlb2Ygc3BlYyA9PSBcInN0cmluZ1wiICYmIG1pbWVNb2Rlcy5oYXNPd25Qcm9wZXJ0eShzcGVjKSkge1xuICAgICAgc3BlYyA9IG1pbWVNb2Rlc1tzcGVjXTtcbiAgICB9IGVsc2UgaWYgKHNwZWMgJiYgdHlwZW9mIHNwZWMubmFtZSA9PSBcInN0cmluZ1wiICYmIG1pbWVNb2Rlcy5oYXNPd25Qcm9wZXJ0eShzcGVjLm5hbWUpKSB7XG4gICAgICB2YXIgZm91bmQgPSBtaW1lTW9kZXNbc3BlYy5uYW1lXTtcbiAgICAgIGlmICh0eXBlb2YgZm91bmQgPT0gXCJzdHJpbmdcIikgeyBmb3VuZCA9IHtuYW1lOiBmb3VuZH07IH1cbiAgICAgIHNwZWMgPSBjcmVhdGVPYmooZm91bmQsIHNwZWMpO1xuICAgICAgc3BlYy5uYW1lID0gZm91bmQubmFtZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBzcGVjID09IFwic3RyaW5nXCIgJiYgL15bXFx3XFwtXStcXC9bXFx3XFwtXStcXCt4bWwkLy50ZXN0KHNwZWMpKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZU1vZGUoXCJhcHBsaWNhdGlvbi94bWxcIilcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBzcGVjID09IFwic3RyaW5nXCIgJiYgL15bXFx3XFwtXStcXC9bXFx3XFwtXStcXCtqc29uJC8udGVzdChzcGVjKSkge1xuICAgICAgcmV0dXJuIHJlc29sdmVNb2RlKFwiYXBwbGljYXRpb24vanNvblwiKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHNwZWMgPT0gXCJzdHJpbmdcIikgeyByZXR1cm4ge25hbWU6IHNwZWN9IH1cbiAgICBlbHNlIHsgcmV0dXJuIHNwZWMgfHwge25hbWU6IFwibnVsbFwifSB9XG4gIH1cblxuICAvLyBHaXZlbiBhIG1vZGUgc3BlYyAoYW55dGhpbmcgdGhhdCByZXNvbHZlTW9kZSBhY2NlcHRzKSwgZmluZCBhbmRcbiAgLy8gaW5pdGlhbGl6ZSBhbiBhY3R1YWwgbW9kZSBvYmplY3QuXG4gIGZ1bmN0aW9uIGdldE1vZGUob3B0aW9ucywgc3BlYykge1xuICAgIHNwZWMgPSByZXNvbHZlTW9kZShzcGVjKTtcbiAgICB2YXIgbWZhY3RvcnkgPSBtb2Rlc1tzcGVjLm5hbWVdO1xuICAgIGlmICghbWZhY3RvcnkpIHsgcmV0dXJuIGdldE1vZGUob3B0aW9ucywgXCJ0ZXh0L3BsYWluXCIpIH1cbiAgICB2YXIgbW9kZU9iaiA9IG1mYWN0b3J5KG9wdGlvbnMsIHNwZWMpO1xuICAgIGlmIChtb2RlRXh0ZW5zaW9ucy5oYXNPd25Qcm9wZXJ0eShzcGVjLm5hbWUpKSB7XG4gICAgICB2YXIgZXh0cyA9IG1vZGVFeHRlbnNpb25zW3NwZWMubmFtZV07XG4gICAgICBmb3IgKHZhciBwcm9wIGluIGV4dHMpIHtcbiAgICAgICAgaWYgKCFleHRzLmhhc093blByb3BlcnR5KHByb3ApKSB7IGNvbnRpbnVlIH1cbiAgICAgICAgaWYgKG1vZGVPYmouaGFzT3duUHJvcGVydHkocHJvcCkpIHsgbW9kZU9ialtcIl9cIiArIHByb3BdID0gbW9kZU9ialtwcm9wXTsgfVxuICAgICAgICBtb2RlT2JqW3Byb3BdID0gZXh0c1twcm9wXTtcbiAgICAgIH1cbiAgICB9XG4gICAgbW9kZU9iai5uYW1lID0gc3BlYy5uYW1lO1xuICAgIGlmIChzcGVjLmhlbHBlclR5cGUpIHsgbW9kZU9iai5oZWxwZXJUeXBlID0gc3BlYy5oZWxwZXJUeXBlOyB9XG4gICAgaWYgKHNwZWMubW9kZVByb3BzKSB7IGZvciAodmFyIHByb3AkMSBpbiBzcGVjLm1vZGVQcm9wcylcbiAgICAgIHsgbW9kZU9ialtwcm9wJDFdID0gc3BlYy5tb2RlUHJvcHNbcHJvcCQxXTsgfSB9XG5cbiAgICByZXR1cm4gbW9kZU9ialxuICB9XG5cbiAgLy8gVGhpcyBjYW4gYmUgdXNlZCB0byBhdHRhY2ggcHJvcGVydGllcyB0byBtb2RlIG9iamVjdHMgZnJvbVxuICAvLyBvdXRzaWRlIHRoZSBhY3R1YWwgbW9kZSBkZWZpbml0aW9uLlxuICB2YXIgbW9kZUV4dGVuc2lvbnMgPSB7fTtcbiAgZnVuY3Rpb24gZXh0ZW5kTW9kZShtb2RlLCBwcm9wZXJ0aWVzKSB7XG4gICAgdmFyIGV4dHMgPSBtb2RlRXh0ZW5zaW9ucy5oYXNPd25Qcm9wZXJ0eShtb2RlKSA/IG1vZGVFeHRlbnNpb25zW21vZGVdIDogKG1vZGVFeHRlbnNpb25zW21vZGVdID0ge30pO1xuICAgIGNvcHlPYmoocHJvcGVydGllcywgZXh0cyk7XG4gIH1cblxuICBmdW5jdGlvbiBjb3B5U3RhdGUobW9kZSwgc3RhdGUpIHtcbiAgICBpZiAoc3RhdGUgPT09IHRydWUpIHsgcmV0dXJuIHN0YXRlIH1cbiAgICBpZiAobW9kZS5jb3B5U3RhdGUpIHsgcmV0dXJuIG1vZGUuY29weVN0YXRlKHN0YXRlKSB9XG4gICAgdmFyIG5zdGF0ZSA9IHt9O1xuICAgIGZvciAodmFyIG4gaW4gc3RhdGUpIHtcbiAgICAgIHZhciB2YWwgPSBzdGF0ZVtuXTtcbiAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBBcnJheSkgeyB2YWwgPSB2YWwuY29uY2F0KFtdKTsgfVxuICAgICAgbnN0YXRlW25dID0gdmFsO1xuICAgIH1cbiAgICByZXR1cm4gbnN0YXRlXG4gIH1cblxuICAvLyBHaXZlbiBhIG1vZGUgYW5kIGEgc3RhdGUgKGZvciB0aGF0IG1vZGUpLCBmaW5kIHRoZSBpbm5lciBtb2RlIGFuZFxuICAvLyBzdGF0ZSBhdCB0aGUgcG9zaXRpb24gdGhhdCB0aGUgc3RhdGUgcmVmZXJzIHRvLlxuICBmdW5jdGlvbiBpbm5lck1vZGUobW9kZSwgc3RhdGUpIHtcbiAgICB2YXIgaW5mbztcbiAgICB3aGlsZSAobW9kZS5pbm5lck1vZGUpIHtcbiAgICAgIGluZm8gPSBtb2RlLmlubmVyTW9kZShzdGF0ZSk7XG4gICAgICBpZiAoIWluZm8gfHwgaW5mby5tb2RlID09IG1vZGUpIHsgYnJlYWsgfVxuICAgICAgc3RhdGUgPSBpbmZvLnN0YXRlO1xuICAgICAgbW9kZSA9IGluZm8ubW9kZTtcbiAgICB9XG4gICAgcmV0dXJuIGluZm8gfHwge21vZGU6IG1vZGUsIHN0YXRlOiBzdGF0ZX1cbiAgfVxuXG4gIGZ1bmN0aW9uIHN0YXJ0U3RhdGUobW9kZSwgYTEsIGEyKSB7XG4gICAgcmV0dXJuIG1vZGUuc3RhcnRTdGF0ZSA/IG1vZGUuc3RhcnRTdGF0ZShhMSwgYTIpIDogdHJ1ZVxuICB9XG5cbiAgLy8gU1RSSU5HIFNUUkVBTVxuXG4gIC8vIEZlZCB0byB0aGUgbW9kZSBwYXJzZXJzLCBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIG1ha2VcbiAgLy8gcGFyc2VycyBtb3JlIHN1Y2NpbmN0LlxuXG4gIHZhciBTdHJpbmdTdHJlYW0gPSBmdW5jdGlvbihzdHJpbmcsIHRhYlNpemUsIGxpbmVPcmFjbGUpIHtcbiAgICB0aGlzLnBvcyA9IHRoaXMuc3RhcnQgPSAwO1xuICAgIHRoaXMuc3RyaW5nID0gc3RyaW5nO1xuICAgIHRoaXMudGFiU2l6ZSA9IHRhYlNpemUgfHwgODtcbiAgICB0aGlzLmxhc3RDb2x1bW5Qb3MgPSB0aGlzLmxhc3RDb2x1bW5WYWx1ZSA9IDA7XG4gICAgdGhpcy5saW5lU3RhcnQgPSAwO1xuICAgIHRoaXMubGluZU9yYWNsZSA9IGxpbmVPcmFjbGU7XG4gIH07XG5cbiAgU3RyaW5nU3RyZWFtLnByb3RvdHlwZS5lb2wgPSBmdW5jdGlvbiAoKSB7cmV0dXJuIHRoaXMucG9zID49IHRoaXMuc3RyaW5nLmxlbmd0aH07XG4gIFN0cmluZ1N0cmVhbS5wcm90b3R5cGUuc29sID0gZnVuY3Rpb24gKCkge3JldHVybiB0aGlzLnBvcyA9PSB0aGlzLmxpbmVTdGFydH07XG4gIFN0cmluZ1N0cmVhbS5wcm90b3R5cGUucGVlayA9IGZ1bmN0aW9uICgpIHtyZXR1cm4gdGhpcy5zdHJpbmcuY2hhckF0KHRoaXMucG9zKSB8fCB1bmRlZmluZWR9O1xuICBTdHJpbmdTdHJlYW0ucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMucG9zIDwgdGhpcy5zdHJpbmcubGVuZ3RoKVxuICAgICAgeyByZXR1cm4gdGhpcy5zdHJpbmcuY2hhckF0KHRoaXMucG9zKyspIH1cbiAgfTtcbiAgU3RyaW5nU3RyZWFtLnByb3RvdHlwZS5lYXQgPSBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICB2YXIgY2ggPSB0aGlzLnN0cmluZy5jaGFyQXQodGhpcy5wb3MpO1xuICAgIHZhciBvaztcbiAgICBpZiAodHlwZW9mIG1hdGNoID09IFwic3RyaW5nXCIpIHsgb2sgPSBjaCA9PSBtYXRjaDsgfVxuICAgIGVsc2UgeyBvayA9IGNoICYmIChtYXRjaC50ZXN0ID8gbWF0Y2gudGVzdChjaCkgOiBtYXRjaChjaCkpOyB9XG4gICAgaWYgKG9rKSB7Kyt0aGlzLnBvczsgcmV0dXJuIGNofVxuICB9O1xuICBTdHJpbmdTdHJlYW0ucHJvdG90eXBlLmVhdFdoaWxlID0gZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgdmFyIHN0YXJ0ID0gdGhpcy5wb3M7XG4gICAgd2hpbGUgKHRoaXMuZWF0KG1hdGNoKSl7fVxuICAgIHJldHVybiB0aGlzLnBvcyA+IHN0YXJ0XG4gIH07XG4gIFN0cmluZ1N0cmVhbS5wcm90b3R5cGUuZWF0U3BhY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHN0YXJ0ID0gdGhpcy5wb3M7XG4gICAgd2hpbGUgKC9bXFxzXFx1MDBhMF0vLnRlc3QodGhpcy5zdHJpbmcuY2hhckF0KHRoaXMucG9zKSkpIHsgKyt0aGlzLnBvczsgfVxuICAgIHJldHVybiB0aGlzLnBvcyA+IHN0YXJ0XG4gIH07XG4gIFN0cmluZ1N0cmVhbS5wcm90b3R5cGUuc2tpcFRvRW5kID0gZnVuY3Rpb24gKCkge3RoaXMucG9zID0gdGhpcy5zdHJpbmcubGVuZ3RoO307XG4gIFN0cmluZ1N0cmVhbS5wcm90b3R5cGUuc2tpcFRvID0gZnVuY3Rpb24gKGNoKSB7XG4gICAgdmFyIGZvdW5kID0gdGhpcy5zdHJpbmcuaW5kZXhPZihjaCwgdGhpcy5wb3MpO1xuICAgIGlmIChmb3VuZCA+IC0xKSB7dGhpcy5wb3MgPSBmb3VuZDsgcmV0dXJuIHRydWV9XG4gIH07XG4gIFN0cmluZ1N0cmVhbS5wcm90b3R5cGUuYmFja1VwID0gZnVuY3Rpb24gKG4pIHt0aGlzLnBvcyAtPSBuO307XG4gIFN0cmluZ1N0cmVhbS5wcm90b3R5cGUuY29sdW1uID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLmxhc3RDb2x1bW5Qb3MgPCB0aGlzLnN0YXJ0KSB7XG4gICAgICB0aGlzLmxhc3RDb2x1bW5WYWx1ZSA9IGNvdW50Q29sdW1uKHRoaXMuc3RyaW5nLCB0aGlzLnN0YXJ0LCB0aGlzLnRhYlNpemUsIHRoaXMubGFzdENvbHVtblBvcywgdGhpcy5sYXN0Q29sdW1uVmFsdWUpO1xuICAgICAgdGhpcy5sYXN0Q29sdW1uUG9zID0gdGhpcy5zdGFydDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubGFzdENvbHVtblZhbHVlIC0gKHRoaXMubGluZVN0YXJ0ID8gY291bnRDb2x1bW4odGhpcy5zdHJpbmcsIHRoaXMubGluZVN0YXJ0LCB0aGlzLnRhYlNpemUpIDogMClcbiAgfTtcbiAgU3RyaW5nU3RyZWFtLnByb3RvdHlwZS5pbmRlbnRhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gY291bnRDb2x1bW4odGhpcy5zdHJpbmcsIG51bGwsIHRoaXMudGFiU2l6ZSkgLVxuICAgICAgKHRoaXMubGluZVN0YXJ0ID8gY291bnRDb2x1bW4odGhpcy5zdHJpbmcsIHRoaXMubGluZVN0YXJ0LCB0aGlzLnRhYlNpemUpIDogMClcbiAgfTtcbiAgU3RyaW5nU3RyZWFtLnByb3RvdHlwZS5tYXRjaCA9IGZ1bmN0aW9uIChwYXR0ZXJuLCBjb25zdW1lLCBjYXNlSW5zZW5zaXRpdmUpIHtcbiAgICBpZiAodHlwZW9mIHBhdHRlcm4gPT0gXCJzdHJpbmdcIikge1xuICAgICAgdmFyIGNhc2VkID0gZnVuY3Rpb24gKHN0cikgeyByZXR1cm4gY2FzZUluc2Vuc2l0aXZlID8gc3RyLnRvTG93ZXJDYXNlKCkgOiBzdHI7IH07XG4gICAgICB2YXIgc3Vic3RyID0gdGhpcy5zdHJpbmcuc3Vic3RyKHRoaXMucG9zLCBwYXR0ZXJuLmxlbmd0aCk7XG4gICAgICBpZiAoY2FzZWQoc3Vic3RyKSA9PSBjYXNlZChwYXR0ZXJuKSkge1xuICAgICAgICBpZiAoY29uc3VtZSAhPT0gZmFsc2UpIHsgdGhpcy5wb3MgKz0gcGF0dGVybi5sZW5ndGg7IH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIG1hdGNoID0gdGhpcy5zdHJpbmcuc2xpY2UodGhpcy5wb3MpLm1hdGNoKHBhdHRlcm4pO1xuICAgICAgaWYgKG1hdGNoICYmIG1hdGNoLmluZGV4ID4gMCkgeyByZXR1cm4gbnVsbCB9XG4gICAgICBpZiAobWF0Y2ggJiYgY29uc3VtZSAhPT0gZmFsc2UpIHsgdGhpcy5wb3MgKz0gbWF0Y2hbMF0ubGVuZ3RoOyB9XG4gICAgICByZXR1cm4gbWF0Y2hcbiAgICB9XG4gIH07XG4gIFN0cmluZ1N0cmVhbS5wcm90b3R5cGUuY3VycmVudCA9IGZ1bmN0aW9uICgpe3JldHVybiB0aGlzLnN0cmluZy5zbGljZSh0aGlzLnN0YXJ0LCB0aGlzLnBvcyl9O1xuICBTdHJpbmdTdHJlYW0ucHJvdG90eXBlLmhpZGVGaXJzdENoYXJzID0gZnVuY3Rpb24gKG4sIGlubmVyKSB7XG4gICAgdGhpcy5saW5lU3RhcnQgKz0gbjtcbiAgICB0cnkgeyByZXR1cm4gaW5uZXIoKSB9XG4gICAgZmluYWxseSB7IHRoaXMubGluZVN0YXJ0IC09IG47IH1cbiAgfTtcbiAgU3RyaW5nU3RyZWFtLnByb3RvdHlwZS5sb29rQWhlYWQgPSBmdW5jdGlvbiAobikge1xuICAgIHZhciBvcmFjbGUgPSB0aGlzLmxpbmVPcmFjbGU7XG4gICAgcmV0dXJuIG9yYWNsZSAmJiBvcmFjbGUubG9va0FoZWFkKG4pXG4gIH07XG4gIFN0cmluZ1N0cmVhbS5wcm90b3R5cGUuYmFzZVRva2VuID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBvcmFjbGUgPSB0aGlzLmxpbmVPcmFjbGU7XG4gICAgcmV0dXJuIG9yYWNsZSAmJiBvcmFjbGUuYmFzZVRva2VuKHRoaXMucG9zKVxuICB9O1xuXG4gIC8vIEZpbmQgdGhlIGxpbmUgb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGxpbmUgbnVtYmVyLlxuICBmdW5jdGlvbiBnZXRMaW5lKGRvYywgbikge1xuICAgIG4gLT0gZG9jLmZpcnN0O1xuICAgIGlmIChuIDwgMCB8fCBuID49IGRvYy5zaXplKSB7IHRocm93IG5ldyBFcnJvcihcIlRoZXJlIGlzIG5vIGxpbmUgXCIgKyAobiArIGRvYy5maXJzdCkgKyBcIiBpbiB0aGUgZG9jdW1lbnQuXCIpIH1cbiAgICB2YXIgY2h1bmsgPSBkb2M7XG4gICAgd2hpbGUgKCFjaHVuay5saW5lcykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7OyArK2kpIHtcbiAgICAgICAgdmFyIGNoaWxkID0gY2h1bmsuY2hpbGRyZW5baV0sIHN6ID0gY2hpbGQuY2h1bmtTaXplKCk7XG4gICAgICAgIGlmIChuIDwgc3opIHsgY2h1bmsgPSBjaGlsZDsgYnJlYWsgfVxuICAgICAgICBuIC09IHN6O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2h1bmsubGluZXNbbl1cbiAgfVxuXG4gIC8vIEdldCB0aGUgcGFydCBvZiBhIGRvY3VtZW50IGJldHdlZW4gdHdvIHBvc2l0aW9ucywgYXMgYW4gYXJyYXkgb2ZcbiAgLy8gc3RyaW5ncy5cbiAgZnVuY3Rpb24gZ2V0QmV0d2Vlbihkb2MsIHN0YXJ0LCBlbmQpIHtcbiAgICB2YXIgb3V0ID0gW10sIG4gPSBzdGFydC5saW5lO1xuICAgIGRvYy5pdGVyKHN0YXJ0LmxpbmUsIGVuZC5saW5lICsgMSwgZnVuY3Rpb24gKGxpbmUpIHtcbiAgICAgIHZhciB0ZXh0ID0gbGluZS50ZXh0O1xuICAgICAgaWYgKG4gPT0gZW5kLmxpbmUpIHsgdGV4dCA9IHRleHQuc2xpY2UoMCwgZW5kLmNoKTsgfVxuICAgICAgaWYgKG4gPT0gc3RhcnQubGluZSkgeyB0ZXh0ID0gdGV4dC5zbGljZShzdGFydC5jaCk7IH1cbiAgICAgIG91dC5wdXNoKHRleHQpO1xuICAgICAgKytuO1xuICAgIH0pO1xuICAgIHJldHVybiBvdXRcbiAgfVxuICAvLyBHZXQgdGhlIGxpbmVzIGJldHdlZW4gZnJvbSBhbmQgdG8sIGFzIGFycmF5IG9mIHN0cmluZ3MuXG4gIGZ1bmN0aW9uIGdldExpbmVzKGRvYywgZnJvbSwgdG8pIHtcbiAgICB2YXIgb3V0ID0gW107XG4gICAgZG9jLml0ZXIoZnJvbSwgdG8sIGZ1bmN0aW9uIChsaW5lKSB7IG91dC5wdXNoKGxpbmUudGV4dCk7IH0pOyAvLyBpdGVyIGFib3J0cyB3aGVuIGNhbGxiYWNrIHJldHVybnMgdHJ1dGh5IHZhbHVlXG4gICAgcmV0dXJuIG91dFxuICB9XG5cbiAgLy8gVXBkYXRlIHRoZSBoZWlnaHQgb2YgYSBsaW5lLCBwcm9wYWdhdGluZyB0aGUgaGVpZ2h0IGNoYW5nZVxuICAvLyB1cHdhcmRzIHRvIHBhcmVudCBub2Rlcy5cbiAgZnVuY3Rpb24gdXBkYXRlTGluZUhlaWdodChsaW5lLCBoZWlnaHQpIHtcbiAgICB2YXIgZGlmZiA9IGhlaWdodCAtIGxpbmUuaGVpZ2h0O1xuICAgIGlmIChkaWZmKSB7IGZvciAodmFyIG4gPSBsaW5lOyBuOyBuID0gbi5wYXJlbnQpIHsgbi5oZWlnaHQgKz0gZGlmZjsgfSB9XG4gIH1cblxuICAvLyBHaXZlbiBhIGxpbmUgb2JqZWN0LCBmaW5kIGl0cyBsaW5lIG51bWJlciBieSB3YWxraW5nIHVwIHRocm91Z2hcbiAgLy8gaXRzIHBhcmVudCBsaW5rcy5cbiAgZnVuY3Rpb24gbGluZU5vKGxpbmUpIHtcbiAgICBpZiAobGluZS5wYXJlbnQgPT0gbnVsbCkgeyByZXR1cm4gbnVsbCB9XG4gICAgdmFyIGN1ciA9IGxpbmUucGFyZW50LCBubyA9IGluZGV4T2YoY3VyLmxpbmVzLCBsaW5lKTtcbiAgICBmb3IgKHZhciBjaHVuayA9IGN1ci5wYXJlbnQ7IGNodW5rOyBjdXIgPSBjaHVuaywgY2h1bmsgPSBjaHVuay5wYXJlbnQpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOzsgKytpKSB7XG4gICAgICAgIGlmIChjaHVuay5jaGlsZHJlbltpXSA9PSBjdXIpIHsgYnJlYWsgfVxuICAgICAgICBubyArPSBjaHVuay5jaGlsZHJlbltpXS5jaHVua1NpemUoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5vICsgY3VyLmZpcnN0XG4gIH1cblxuICAvLyBGaW5kIHRoZSBsaW5lIGF0IHRoZSBnaXZlbiB2ZXJ0aWNhbCBwb3NpdGlvbiwgdXNpbmcgdGhlIGhlaWdodFxuICAvLyBpbmZvcm1hdGlvbiBpbiB0aGUgZG9jdW1lbnQgdHJlZS5cbiAgZnVuY3Rpb24gbGluZUF0SGVpZ2h0KGNodW5rLCBoKSB7XG4gICAgdmFyIG4gPSBjaHVuay5maXJzdDtcbiAgICBvdXRlcjogZG8ge1xuICAgICAgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgY2h1bmsuY2hpbGRyZW4ubGVuZ3RoOyArK2kkMSkge1xuICAgICAgICB2YXIgY2hpbGQgPSBjaHVuay5jaGlsZHJlbltpJDFdLCBjaCA9IGNoaWxkLmhlaWdodDtcbiAgICAgICAgaWYgKGggPCBjaCkgeyBjaHVuayA9IGNoaWxkOyBjb250aW51ZSBvdXRlciB9XG4gICAgICAgIGggLT0gY2g7XG4gICAgICAgIG4gKz0gY2hpbGQuY2h1bmtTaXplKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gblxuICAgIH0gd2hpbGUgKCFjaHVuay5saW5lcylcbiAgICB2YXIgaSA9IDA7XG4gICAgZm9yICg7IGkgPCBjaHVuay5saW5lcy5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIGxpbmUgPSBjaHVuay5saW5lc1tpXSwgbGggPSBsaW5lLmhlaWdodDtcbiAgICAgIGlmIChoIDwgbGgpIHsgYnJlYWsgfVxuICAgICAgaCAtPSBsaDtcbiAgICB9XG4gICAgcmV0dXJuIG4gKyBpXG4gIH1cblxuICBmdW5jdGlvbiBpc0xpbmUoZG9jLCBsKSB7cmV0dXJuIGwgPj0gZG9jLmZpcnN0ICYmIGwgPCBkb2MuZmlyc3QgKyBkb2Muc2l6ZX1cblxuICBmdW5jdGlvbiBsaW5lTnVtYmVyRm9yKG9wdGlvbnMsIGkpIHtcbiAgICByZXR1cm4gU3RyaW5nKG9wdGlvbnMubGluZU51bWJlckZvcm1hdHRlcihpICsgb3B0aW9ucy5maXJzdExpbmVOdW1iZXIpKVxuICB9XG5cbiAgLy8gQSBQb3MgaW5zdGFuY2UgcmVwcmVzZW50cyBhIHBvc2l0aW9uIHdpdGhpbiB0aGUgdGV4dC5cbiAgZnVuY3Rpb24gUG9zKGxpbmUsIGNoLCBzdGlja3kpIHtcbiAgICBpZiAoIHN0aWNreSA9PT0gdm9pZCAwICkgc3RpY2t5ID0gbnVsbDtcblxuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBQb3MpKSB7IHJldHVybiBuZXcgUG9zKGxpbmUsIGNoLCBzdGlja3kpIH1cbiAgICB0aGlzLmxpbmUgPSBsaW5lO1xuICAgIHRoaXMuY2ggPSBjaDtcbiAgICB0aGlzLnN0aWNreSA9IHN0aWNreTtcbiAgfVxuXG4gIC8vIENvbXBhcmUgdHdvIHBvc2l0aW9ucywgcmV0dXJuIDAgaWYgdGhleSBhcmUgdGhlIHNhbWUsIGEgbmVnYXRpdmVcbiAgLy8gbnVtYmVyIHdoZW4gYSBpcyBsZXNzLCBhbmQgYSBwb3NpdGl2ZSBudW1iZXIgb3RoZXJ3aXNlLlxuICBmdW5jdGlvbiBjbXAoYSwgYikgeyByZXR1cm4gYS5saW5lIC0gYi5saW5lIHx8IGEuY2ggLSBiLmNoIH1cblxuICBmdW5jdGlvbiBlcXVhbEN1cnNvclBvcyhhLCBiKSB7IHJldHVybiBhLnN0aWNreSA9PSBiLnN0aWNreSAmJiBjbXAoYSwgYikgPT0gMCB9XG5cbiAgZnVuY3Rpb24gY29weVBvcyh4KSB7cmV0dXJuIFBvcyh4LmxpbmUsIHguY2gpfVxuICBmdW5jdGlvbiBtYXhQb3MoYSwgYikgeyByZXR1cm4gY21wKGEsIGIpIDwgMCA/IGIgOiBhIH1cbiAgZnVuY3Rpb24gbWluUG9zKGEsIGIpIHsgcmV0dXJuIGNtcChhLCBiKSA8IDAgPyBhIDogYiB9XG5cbiAgLy8gTW9zdCBvZiB0aGUgZXh0ZXJuYWwgQVBJIGNsaXBzIGdpdmVuIHBvc2l0aW9ucyB0byBtYWtlIHN1cmUgdGhleVxuICAvLyBhY3R1YWxseSBleGlzdCB3aXRoaW4gdGhlIGRvY3VtZW50LlxuICBmdW5jdGlvbiBjbGlwTGluZShkb2MsIG4pIHtyZXR1cm4gTWF0aC5tYXgoZG9jLmZpcnN0LCBNYXRoLm1pbihuLCBkb2MuZmlyc3QgKyBkb2Muc2l6ZSAtIDEpKX1cbiAgZnVuY3Rpb24gY2xpcFBvcyhkb2MsIHBvcykge1xuICAgIGlmIChwb3MubGluZSA8IGRvYy5maXJzdCkgeyByZXR1cm4gUG9zKGRvYy5maXJzdCwgMCkgfVxuICAgIHZhciBsYXN0ID0gZG9jLmZpcnN0ICsgZG9jLnNpemUgLSAxO1xuICAgIGlmIChwb3MubGluZSA+IGxhc3QpIHsgcmV0dXJuIFBvcyhsYXN0LCBnZXRMaW5lKGRvYywgbGFzdCkudGV4dC5sZW5ndGgpIH1cbiAgICByZXR1cm4gY2xpcFRvTGVuKHBvcywgZ2V0TGluZShkb2MsIHBvcy5saW5lKS50ZXh0Lmxlbmd0aClcbiAgfVxuICBmdW5jdGlvbiBjbGlwVG9MZW4ocG9zLCBsaW5lbGVuKSB7XG4gICAgdmFyIGNoID0gcG9zLmNoO1xuICAgIGlmIChjaCA9PSBudWxsIHx8IGNoID4gbGluZWxlbikgeyByZXR1cm4gUG9zKHBvcy5saW5lLCBsaW5lbGVuKSB9XG4gICAgZWxzZSBpZiAoY2ggPCAwKSB7IHJldHVybiBQb3MocG9zLmxpbmUsIDApIH1cbiAgICBlbHNlIHsgcmV0dXJuIHBvcyB9XG4gIH1cbiAgZnVuY3Rpb24gY2xpcFBvc0FycmF5KGRvYywgYXJyYXkpIHtcbiAgICB2YXIgb3V0ID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgeyBvdXRbaV0gPSBjbGlwUG9zKGRvYywgYXJyYXlbaV0pOyB9XG4gICAgcmV0dXJuIG91dFxuICB9XG5cbiAgdmFyIFNhdmVkQ29udGV4dCA9IGZ1bmN0aW9uKHN0YXRlLCBsb29rQWhlYWQpIHtcbiAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgdGhpcy5sb29rQWhlYWQgPSBsb29rQWhlYWQ7XG4gIH07XG5cbiAgdmFyIENvbnRleHQgPSBmdW5jdGlvbihkb2MsIHN0YXRlLCBsaW5lLCBsb29rQWhlYWQpIHtcbiAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgdGhpcy5kb2MgPSBkb2M7XG4gICAgdGhpcy5saW5lID0gbGluZTtcbiAgICB0aGlzLm1heExvb2tBaGVhZCA9IGxvb2tBaGVhZCB8fCAwO1xuICAgIHRoaXMuYmFzZVRva2VucyA9IG51bGw7XG4gICAgdGhpcy5iYXNlVG9rZW5Qb3MgPSAxO1xuICB9O1xuXG4gIENvbnRleHQucHJvdG90eXBlLmxvb2tBaGVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gICAgdmFyIGxpbmUgPSB0aGlzLmRvYy5nZXRMaW5lKHRoaXMubGluZSArIG4pO1xuICAgIGlmIChsaW5lICE9IG51bGwgJiYgbiA+IHRoaXMubWF4TG9va0FoZWFkKSB7IHRoaXMubWF4TG9va0FoZWFkID0gbjsgfVxuICAgIHJldHVybiBsaW5lXG4gIH07XG5cbiAgQ29udGV4dC5wcm90b3R5cGUuYmFzZVRva2VuID0gZnVuY3Rpb24gKG4pIHtcbiAgICBpZiAoIXRoaXMuYmFzZVRva2VucykgeyByZXR1cm4gbnVsbCB9XG4gICAgd2hpbGUgKHRoaXMuYmFzZVRva2Vuc1t0aGlzLmJhc2VUb2tlblBvc10gPD0gbilcbiAgICAgIHsgdGhpcy5iYXNlVG9rZW5Qb3MgKz0gMjsgfVxuICAgIHZhciB0eXBlID0gdGhpcy5iYXNlVG9rZW5zW3RoaXMuYmFzZVRva2VuUG9zICsgMV07XG4gICAgcmV0dXJuIHt0eXBlOiB0eXBlICYmIHR5cGUucmVwbGFjZSgvKCB8XilvdmVybGF5IC4qLywgXCJcIiksXG4gICAgICAgICAgICBzaXplOiB0aGlzLmJhc2VUb2tlbnNbdGhpcy5iYXNlVG9rZW5Qb3NdIC0gbn1cbiAgfTtcblxuICBDb250ZXh0LnByb3RvdHlwZS5uZXh0TGluZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmxpbmUrKztcbiAgICBpZiAodGhpcy5tYXhMb29rQWhlYWQgPiAwKSB7IHRoaXMubWF4TG9va0FoZWFkLS07IH1cbiAgfTtcblxuICBDb250ZXh0LmZyb21TYXZlZCA9IGZ1bmN0aW9uIChkb2MsIHNhdmVkLCBsaW5lKSB7XG4gICAgaWYgKHNhdmVkIGluc3RhbmNlb2YgU2F2ZWRDb250ZXh0KVxuICAgICAgeyByZXR1cm4gbmV3IENvbnRleHQoZG9jLCBjb3B5U3RhdGUoZG9jLm1vZGUsIHNhdmVkLnN0YXRlKSwgbGluZSwgc2F2ZWQubG9va0FoZWFkKSB9XG4gICAgZWxzZVxuICAgICAgeyByZXR1cm4gbmV3IENvbnRleHQoZG9jLCBjb3B5U3RhdGUoZG9jLm1vZGUsIHNhdmVkKSwgbGluZSkgfVxuICB9O1xuXG4gIENvbnRleHQucHJvdG90eXBlLnNhdmUgPSBmdW5jdGlvbiAoY29weSkge1xuICAgIHZhciBzdGF0ZSA9IGNvcHkgIT09IGZhbHNlID8gY29weVN0YXRlKHRoaXMuZG9jLm1vZGUsIHRoaXMuc3RhdGUpIDogdGhpcy5zdGF0ZTtcbiAgICByZXR1cm4gdGhpcy5tYXhMb29rQWhlYWQgPiAwID8gbmV3IFNhdmVkQ29udGV4dChzdGF0ZSwgdGhpcy5tYXhMb29rQWhlYWQpIDogc3RhdGVcbiAgfTtcblxuXG4gIC8vIENvbXB1dGUgYSBzdHlsZSBhcnJheSAoYW4gYXJyYXkgc3RhcnRpbmcgd2l0aCBhIG1vZGUgZ2VuZXJhdGlvblxuICAvLyAtLSBmb3IgaW52YWxpZGF0aW9uIC0tIGZvbGxvd2VkIGJ5IHBhaXJzIG9mIGVuZCBwb3NpdGlvbnMgYW5kXG4gIC8vIHN0eWxlIHN0cmluZ3MpLCB3aGljaCBpcyB1c2VkIHRvIGhpZ2hsaWdodCB0aGUgdG9rZW5zIG9uIHRoZVxuICAvLyBsaW5lLlxuICBmdW5jdGlvbiBoaWdobGlnaHRMaW5lKGNtLCBsaW5lLCBjb250ZXh0LCBmb3JjZVRvRW5kKSB7XG4gICAgLy8gQSBzdHlsZXMgYXJyYXkgYWx3YXlzIHN0YXJ0cyB3aXRoIGEgbnVtYmVyIGlkZW50aWZ5aW5nIHRoZVxuICAgIC8vIG1vZGUvb3ZlcmxheXMgdGhhdCBpdCBpcyBiYXNlZCBvbiAoZm9yIGVhc3kgaW52YWxpZGF0aW9uKS5cbiAgICB2YXIgc3QgPSBbY20uc3RhdGUubW9kZUdlbl0sIGxpbmVDbGFzc2VzID0ge307XG4gICAgLy8gQ29tcHV0ZSB0aGUgYmFzZSBhcnJheSBvZiBzdHlsZXNcbiAgICBydW5Nb2RlKGNtLCBsaW5lLnRleHQsIGNtLmRvYy5tb2RlLCBjb250ZXh0LCBmdW5jdGlvbiAoZW5kLCBzdHlsZSkgeyByZXR1cm4gc3QucHVzaChlbmQsIHN0eWxlKTsgfSxcbiAgICAgICAgICAgIGxpbmVDbGFzc2VzLCBmb3JjZVRvRW5kKTtcbiAgICB2YXIgc3RhdGUgPSBjb250ZXh0LnN0YXRlO1xuXG4gICAgLy8gUnVuIG92ZXJsYXlzLCBhZGp1c3Qgc3R5bGUgYXJyYXkuXG4gICAgdmFyIGxvb3AgPSBmdW5jdGlvbiAoIG8gKSB7XG4gICAgICBjb250ZXh0LmJhc2VUb2tlbnMgPSBzdDtcbiAgICAgIHZhciBvdmVybGF5ID0gY20uc3RhdGUub3ZlcmxheXNbb10sIGkgPSAxLCBhdCA9IDA7XG4gICAgICBjb250ZXh0LnN0YXRlID0gdHJ1ZTtcbiAgICAgIHJ1bk1vZGUoY20sIGxpbmUudGV4dCwgb3ZlcmxheS5tb2RlLCBjb250ZXh0LCBmdW5jdGlvbiAoZW5kLCBzdHlsZSkge1xuICAgICAgICB2YXIgc3RhcnQgPSBpO1xuICAgICAgICAvLyBFbnN1cmUgdGhlcmUncyBhIHRva2VuIGVuZCBhdCB0aGUgY3VycmVudCBwb3NpdGlvbiwgYW5kIHRoYXQgaSBwb2ludHMgYXQgaXRcbiAgICAgICAgd2hpbGUgKGF0IDwgZW5kKSB7XG4gICAgICAgICAgdmFyIGlfZW5kID0gc3RbaV07XG4gICAgICAgICAgaWYgKGlfZW5kID4gZW5kKVxuICAgICAgICAgICAgeyBzdC5zcGxpY2UoaSwgMSwgZW5kLCBzdFtpKzFdLCBpX2VuZCk7IH1cbiAgICAgICAgICBpICs9IDI7XG4gICAgICAgICAgYXQgPSBNYXRoLm1pbihlbmQsIGlfZW5kKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXN0eWxlKSB7IHJldHVybiB9XG4gICAgICAgIGlmIChvdmVybGF5Lm9wYXF1ZSkge1xuICAgICAgICAgIHN0LnNwbGljZShzdGFydCwgaSAtIHN0YXJ0LCBlbmQsIFwib3ZlcmxheSBcIiArIHN0eWxlKTtcbiAgICAgICAgICBpID0gc3RhcnQgKyAyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvciAoOyBzdGFydCA8IGk7IHN0YXJ0ICs9IDIpIHtcbiAgICAgICAgICAgIHZhciBjdXIgPSBzdFtzdGFydCsxXTtcbiAgICAgICAgICAgIHN0W3N0YXJ0KzFdID0gKGN1ciA/IGN1ciArIFwiIFwiIDogXCJcIikgKyBcIm92ZXJsYXkgXCIgKyBzdHlsZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIGxpbmVDbGFzc2VzKTtcbiAgICAgIGNvbnRleHQuc3RhdGUgPSBzdGF0ZTtcbiAgICAgIGNvbnRleHQuYmFzZVRva2VucyA9IG51bGw7XG4gICAgICBjb250ZXh0LmJhc2VUb2tlblBvcyA9IDE7XG4gICAgfTtcblxuICAgIGZvciAodmFyIG8gPSAwOyBvIDwgY20uc3RhdGUub3ZlcmxheXMubGVuZ3RoOyArK28pIGxvb3AoIG8gKTtcblxuICAgIHJldHVybiB7c3R5bGVzOiBzdCwgY2xhc3NlczogbGluZUNsYXNzZXMuYmdDbGFzcyB8fCBsaW5lQ2xhc3Nlcy50ZXh0Q2xhc3MgPyBsaW5lQ2xhc3NlcyA6IG51bGx9XG4gIH1cblxuICBmdW5jdGlvbiBnZXRMaW5lU3R5bGVzKGNtLCBsaW5lLCB1cGRhdGVGcm9udGllcikge1xuICAgIGlmICghbGluZS5zdHlsZXMgfHwgbGluZS5zdHlsZXNbMF0gIT0gY20uc3RhdGUubW9kZUdlbikge1xuICAgICAgdmFyIGNvbnRleHQgPSBnZXRDb250ZXh0QmVmb3JlKGNtLCBsaW5lTm8obGluZSkpO1xuICAgICAgdmFyIHJlc2V0U3RhdGUgPSBsaW5lLnRleHQubGVuZ3RoID4gY20ub3B0aW9ucy5tYXhIaWdobGlnaHRMZW5ndGggJiYgY29weVN0YXRlKGNtLmRvYy5tb2RlLCBjb250ZXh0LnN0YXRlKTtcbiAgICAgIHZhciByZXN1bHQgPSBoaWdobGlnaHRMaW5lKGNtLCBsaW5lLCBjb250ZXh0KTtcbiAgICAgIGlmIChyZXNldFN0YXRlKSB7IGNvbnRleHQuc3RhdGUgPSByZXNldFN0YXRlOyB9XG4gICAgICBsaW5lLnN0YXRlQWZ0ZXIgPSBjb250ZXh0LnNhdmUoIXJlc2V0U3RhdGUpO1xuICAgICAgbGluZS5zdHlsZXMgPSByZXN1bHQuc3R5bGVzO1xuICAgICAgaWYgKHJlc3VsdC5jbGFzc2VzKSB7IGxpbmUuc3R5bGVDbGFzc2VzID0gcmVzdWx0LmNsYXNzZXM7IH1cbiAgICAgIGVsc2UgaWYgKGxpbmUuc3R5bGVDbGFzc2VzKSB7IGxpbmUuc3R5bGVDbGFzc2VzID0gbnVsbDsgfVxuICAgICAgaWYgKHVwZGF0ZUZyb250aWVyID09PSBjbS5kb2MuaGlnaGxpZ2h0RnJvbnRpZXIpXG4gICAgICAgIHsgY20uZG9jLm1vZGVGcm9udGllciA9IE1hdGgubWF4KGNtLmRvYy5tb2RlRnJvbnRpZXIsICsrY20uZG9jLmhpZ2hsaWdodEZyb250aWVyKTsgfVxuICAgIH1cbiAgICByZXR1cm4gbGluZS5zdHlsZXNcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldENvbnRleHRCZWZvcmUoY20sIG4sIHByZWNpc2UpIHtcbiAgICB2YXIgZG9jID0gY20uZG9jLCBkaXNwbGF5ID0gY20uZGlzcGxheTtcbiAgICBpZiAoIWRvYy5tb2RlLnN0YXJ0U3RhdGUpIHsgcmV0dXJuIG5ldyBDb250ZXh0KGRvYywgdHJ1ZSwgbikgfVxuICAgIHZhciBzdGFydCA9IGZpbmRTdGFydExpbmUoY20sIG4sIHByZWNpc2UpO1xuICAgIHZhciBzYXZlZCA9IHN0YXJ0ID4gZG9jLmZpcnN0ICYmIGdldExpbmUoZG9jLCBzdGFydCAtIDEpLnN0YXRlQWZ0ZXI7XG4gICAgdmFyIGNvbnRleHQgPSBzYXZlZCA/IENvbnRleHQuZnJvbVNhdmVkKGRvYywgc2F2ZWQsIHN0YXJ0KSA6IG5ldyBDb250ZXh0KGRvYywgc3RhcnRTdGF0ZShkb2MubW9kZSksIHN0YXJ0KTtcblxuICAgIGRvYy5pdGVyKHN0YXJ0LCBuLCBmdW5jdGlvbiAobGluZSkge1xuICAgICAgcHJvY2Vzc0xpbmUoY20sIGxpbmUudGV4dCwgY29udGV4dCk7XG4gICAgICB2YXIgcG9zID0gY29udGV4dC5saW5lO1xuICAgICAgbGluZS5zdGF0ZUFmdGVyID0gcG9zID09IG4gLSAxIHx8IHBvcyAlIDUgPT0gMCB8fCBwb3MgPj0gZGlzcGxheS52aWV3RnJvbSAmJiBwb3MgPCBkaXNwbGF5LnZpZXdUbyA/IGNvbnRleHQuc2F2ZSgpIDogbnVsbDtcbiAgICAgIGNvbnRleHQubmV4dExpbmUoKTtcbiAgICB9KTtcbiAgICBpZiAocHJlY2lzZSkgeyBkb2MubW9kZUZyb250aWVyID0gY29udGV4dC5saW5lOyB9XG4gICAgcmV0dXJuIGNvbnRleHRcbiAgfVxuXG4gIC8vIExpZ2h0d2VpZ2h0IGZvcm0gb2YgaGlnaGxpZ2h0IC0tIHByb2NlZWQgb3ZlciB0aGlzIGxpbmUgYW5kXG4gIC8vIHVwZGF0ZSBzdGF0ZSwgYnV0IGRvbid0IHNhdmUgYSBzdHlsZSBhcnJheS4gVXNlZCBmb3IgbGluZXMgdGhhdFxuICAvLyBhcmVuJ3QgY3VycmVudGx5IHZpc2libGUuXG4gIGZ1bmN0aW9uIHByb2Nlc3NMaW5lKGNtLCB0ZXh0LCBjb250ZXh0LCBzdGFydEF0KSB7XG4gICAgdmFyIG1vZGUgPSBjbS5kb2MubW9kZTtcbiAgICB2YXIgc3RyZWFtID0gbmV3IFN0cmluZ1N0cmVhbSh0ZXh0LCBjbS5vcHRpb25zLnRhYlNpemUsIGNvbnRleHQpO1xuICAgIHN0cmVhbS5zdGFydCA9IHN0cmVhbS5wb3MgPSBzdGFydEF0IHx8IDA7XG4gICAgaWYgKHRleHQgPT0gXCJcIikgeyBjYWxsQmxhbmtMaW5lKG1vZGUsIGNvbnRleHQuc3RhdGUpOyB9XG4gICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkpIHtcbiAgICAgIHJlYWRUb2tlbihtb2RlLCBzdHJlYW0sIGNvbnRleHQuc3RhdGUpO1xuICAgICAgc3RyZWFtLnN0YXJ0ID0gc3RyZWFtLnBvcztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjYWxsQmxhbmtMaW5lKG1vZGUsIHN0YXRlKSB7XG4gICAgaWYgKG1vZGUuYmxhbmtMaW5lKSB7IHJldHVybiBtb2RlLmJsYW5rTGluZShzdGF0ZSkgfVxuICAgIGlmICghbW9kZS5pbm5lck1vZGUpIHsgcmV0dXJuIH1cbiAgICB2YXIgaW5uZXIgPSBpbm5lck1vZGUobW9kZSwgc3RhdGUpO1xuICAgIGlmIChpbm5lci5tb2RlLmJsYW5rTGluZSkgeyByZXR1cm4gaW5uZXIubW9kZS5ibGFua0xpbmUoaW5uZXIuc3RhdGUpIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlYWRUb2tlbihtb2RlLCBzdHJlYW0sIHN0YXRlLCBpbm5lcikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTA7IGkrKykge1xuICAgICAgaWYgKGlubmVyKSB7IGlubmVyWzBdID0gaW5uZXJNb2RlKG1vZGUsIHN0YXRlKS5tb2RlOyB9XG4gICAgICB2YXIgc3R5bGUgPSBtb2RlLnRva2VuKHN0cmVhbSwgc3RhdGUpO1xuICAgICAgaWYgKHN0cmVhbS5wb3MgPiBzdHJlYW0uc3RhcnQpIHsgcmV0dXJuIHN0eWxlIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTW9kZSBcIiArIG1vZGUubmFtZSArIFwiIGZhaWxlZCB0byBhZHZhbmNlIHN0cmVhbS5cIilcbiAgfVxuXG4gIHZhciBUb2tlbiA9IGZ1bmN0aW9uKHN0cmVhbSwgdHlwZSwgc3RhdGUpIHtcbiAgICB0aGlzLnN0YXJ0ID0gc3RyZWFtLnN0YXJ0OyB0aGlzLmVuZCA9IHN0cmVhbS5wb3M7XG4gICAgdGhpcy5zdHJpbmcgPSBzdHJlYW0uY3VycmVudCgpO1xuICAgIHRoaXMudHlwZSA9IHR5cGUgfHwgbnVsbDtcbiAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gIH07XG5cbiAgLy8gVXRpbGl0eSBmb3IgZ2V0VG9rZW5BdCBhbmQgZ2V0TGluZVRva2Vuc1xuICBmdW5jdGlvbiB0YWtlVG9rZW4oY20sIHBvcywgcHJlY2lzZSwgYXNBcnJheSkge1xuICAgIHZhciBkb2MgPSBjbS5kb2MsIG1vZGUgPSBkb2MubW9kZSwgc3R5bGU7XG4gICAgcG9zID0gY2xpcFBvcyhkb2MsIHBvcyk7XG4gICAgdmFyIGxpbmUgPSBnZXRMaW5lKGRvYywgcG9zLmxpbmUpLCBjb250ZXh0ID0gZ2V0Q29udGV4dEJlZm9yZShjbSwgcG9zLmxpbmUsIHByZWNpc2UpO1xuICAgIHZhciBzdHJlYW0gPSBuZXcgU3RyaW5nU3RyZWFtKGxpbmUudGV4dCwgY20ub3B0aW9ucy50YWJTaXplLCBjb250ZXh0KSwgdG9rZW5zO1xuICAgIGlmIChhc0FycmF5KSB7IHRva2VucyA9IFtdOyB9XG4gICAgd2hpbGUgKChhc0FycmF5IHx8IHN0cmVhbS5wb3MgPCBwb3MuY2gpICYmICFzdHJlYW0uZW9sKCkpIHtcbiAgICAgIHN0cmVhbS5zdGFydCA9IHN0cmVhbS5wb3M7XG4gICAgICBzdHlsZSA9IHJlYWRUb2tlbihtb2RlLCBzdHJlYW0sIGNvbnRleHQuc3RhdGUpO1xuICAgICAgaWYgKGFzQXJyYXkpIHsgdG9rZW5zLnB1c2gobmV3IFRva2VuKHN0cmVhbSwgc3R5bGUsIGNvcHlTdGF0ZShkb2MubW9kZSwgY29udGV4dC5zdGF0ZSkpKTsgfVxuICAgIH1cbiAgICByZXR1cm4gYXNBcnJheSA/IHRva2VucyA6IG5ldyBUb2tlbihzdHJlYW0sIHN0eWxlLCBjb250ZXh0LnN0YXRlKVxuICB9XG5cbiAgZnVuY3Rpb24gZXh0cmFjdExpbmVDbGFzc2VzKHR5cGUsIG91dHB1dCkge1xuICAgIGlmICh0eXBlKSB7IGZvciAoOzspIHtcbiAgICAgIHZhciBsaW5lQ2xhc3MgPSB0eXBlLm1hdGNoKC8oPzpefFxccyspbGluZS0oYmFja2dyb3VuZC0pPyhcXFMrKS8pO1xuICAgICAgaWYgKCFsaW5lQ2xhc3MpIHsgYnJlYWsgfVxuICAgICAgdHlwZSA9IHR5cGUuc2xpY2UoMCwgbGluZUNsYXNzLmluZGV4KSArIHR5cGUuc2xpY2UobGluZUNsYXNzLmluZGV4ICsgbGluZUNsYXNzWzBdLmxlbmd0aCk7XG4gICAgICB2YXIgcHJvcCA9IGxpbmVDbGFzc1sxXSA/IFwiYmdDbGFzc1wiIDogXCJ0ZXh0Q2xhc3NcIjtcbiAgICAgIGlmIChvdXRwdXRbcHJvcF0gPT0gbnVsbClcbiAgICAgICAgeyBvdXRwdXRbcHJvcF0gPSBsaW5lQ2xhc3NbMl07IH1cbiAgICAgIGVsc2UgaWYgKCEobmV3IFJlZ0V4cChcIig/Ol58XFxcXHMpXCIgKyBsaW5lQ2xhc3NbMl0gKyBcIig/OiR8XFxcXHMpXCIpKS50ZXN0KG91dHB1dFtwcm9wXSkpXG4gICAgICAgIHsgb3V0cHV0W3Byb3BdICs9IFwiIFwiICsgbGluZUNsYXNzWzJdOyB9XG4gICAgfSB9XG4gICAgcmV0dXJuIHR5cGVcbiAgfVxuXG4gIC8vIFJ1biB0aGUgZ2l2ZW4gbW9kZSdzIHBhcnNlciBvdmVyIGEgbGluZSwgY2FsbGluZyBmIGZvciBlYWNoIHRva2VuLlxuICBmdW5jdGlvbiBydW5Nb2RlKGNtLCB0ZXh0LCBtb2RlLCBjb250ZXh0LCBmLCBsaW5lQ2xhc3NlcywgZm9yY2VUb0VuZCkge1xuICAgIHZhciBmbGF0dGVuU3BhbnMgPSBtb2RlLmZsYXR0ZW5TcGFucztcbiAgICBpZiAoZmxhdHRlblNwYW5zID09IG51bGwpIHsgZmxhdHRlblNwYW5zID0gY20ub3B0aW9ucy5mbGF0dGVuU3BhbnM7IH1cbiAgICB2YXIgY3VyU3RhcnQgPSAwLCBjdXJTdHlsZSA9IG51bGw7XG4gICAgdmFyIHN0cmVhbSA9IG5ldyBTdHJpbmdTdHJlYW0odGV4dCwgY20ub3B0aW9ucy50YWJTaXplLCBjb250ZXh0KSwgc3R5bGU7XG4gICAgdmFyIGlubmVyID0gY20ub3B0aW9ucy5hZGRNb2RlQ2xhc3MgJiYgW251bGxdO1xuICAgIGlmICh0ZXh0ID09IFwiXCIpIHsgZXh0cmFjdExpbmVDbGFzc2VzKGNhbGxCbGFua0xpbmUobW9kZSwgY29udGV4dC5zdGF0ZSksIGxpbmVDbGFzc2VzKTsgfVxuICAgIHdoaWxlICghc3RyZWFtLmVvbCgpKSB7XG4gICAgICBpZiAoc3RyZWFtLnBvcyA+IGNtLm9wdGlvbnMubWF4SGlnaGxpZ2h0TGVuZ3RoKSB7XG4gICAgICAgIGZsYXR0ZW5TcGFucyA9IGZhbHNlO1xuICAgICAgICBpZiAoZm9yY2VUb0VuZCkgeyBwcm9jZXNzTGluZShjbSwgdGV4dCwgY29udGV4dCwgc3RyZWFtLnBvcyk7IH1cbiAgICAgICAgc3RyZWFtLnBvcyA9IHRleHQubGVuZ3RoO1xuICAgICAgICBzdHlsZSA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdHlsZSA9IGV4dHJhY3RMaW5lQ2xhc3NlcyhyZWFkVG9rZW4obW9kZSwgc3RyZWFtLCBjb250ZXh0LnN0YXRlLCBpbm5lciksIGxpbmVDbGFzc2VzKTtcbiAgICAgIH1cbiAgICAgIGlmIChpbm5lcikge1xuICAgICAgICB2YXIgbU5hbWUgPSBpbm5lclswXS5uYW1lO1xuICAgICAgICBpZiAobU5hbWUpIHsgc3R5bGUgPSBcIm0tXCIgKyAoc3R5bGUgPyBtTmFtZSArIFwiIFwiICsgc3R5bGUgOiBtTmFtZSk7IH1cbiAgICAgIH1cbiAgICAgIGlmICghZmxhdHRlblNwYW5zIHx8IGN1clN0eWxlICE9IHN0eWxlKSB7XG4gICAgICAgIHdoaWxlIChjdXJTdGFydCA8IHN0cmVhbS5zdGFydCkge1xuICAgICAgICAgIGN1clN0YXJ0ID0gTWF0aC5taW4oc3RyZWFtLnN0YXJ0LCBjdXJTdGFydCArIDUwMDApO1xuICAgICAgICAgIGYoY3VyU3RhcnQsIGN1clN0eWxlKTtcbiAgICAgICAgfVxuICAgICAgICBjdXJTdHlsZSA9IHN0eWxlO1xuICAgICAgfVxuICAgICAgc3RyZWFtLnN0YXJ0ID0gc3RyZWFtLnBvcztcbiAgICB9XG4gICAgd2hpbGUgKGN1clN0YXJ0IDwgc3RyZWFtLnBvcykge1xuICAgICAgLy8gV2Via2l0IHNlZW1zIHRvIHJlZnVzZSB0byByZW5kZXIgdGV4dCBub2RlcyBsb25nZXIgdGhhbiA1NzQ0NFxuICAgICAgLy8gY2hhcmFjdGVycywgYW5kIHJldHVybnMgaW5hY2N1cmF0ZSBtZWFzdXJlbWVudHMgaW4gbm9kZXNcbiAgICAgIC8vIHN0YXJ0aW5nIGFyb3VuZCA1MDAwIGNoYXJzLlxuICAgICAgdmFyIHBvcyA9IE1hdGgubWluKHN0cmVhbS5wb3MsIGN1clN0YXJ0ICsgNTAwMCk7XG4gICAgICBmKHBvcywgY3VyU3R5bGUpO1xuICAgICAgY3VyU3RhcnQgPSBwb3M7XG4gICAgfVxuICB9XG5cbiAgLy8gRmluZHMgdGhlIGxpbmUgdG8gc3RhcnQgd2l0aCB3aGVuIHN0YXJ0aW5nIGEgcGFyc2UuIFRyaWVzIHRvXG4gIC8vIGZpbmQgYSBsaW5lIHdpdGggYSBzdGF0ZUFmdGVyLCBzbyB0aGF0IGl0IGNhbiBzdGFydCB3aXRoIGFcbiAgLy8gdmFsaWQgc3RhdGUuIElmIHRoYXQgZmFpbHMsIGl0IHJldHVybnMgdGhlIGxpbmUgd2l0aCB0aGVcbiAgLy8gc21hbGxlc3QgaW5kZW50YXRpb24sIHdoaWNoIHRlbmRzIHRvIG5lZWQgdGhlIGxlYXN0IGNvbnRleHQgdG9cbiAgLy8gcGFyc2UgY29ycmVjdGx5LlxuICBmdW5jdGlvbiBmaW5kU3RhcnRMaW5lKGNtLCBuLCBwcmVjaXNlKSB7XG4gICAgdmFyIG1pbmluZGVudCwgbWlubGluZSwgZG9jID0gY20uZG9jO1xuICAgIHZhciBsaW0gPSBwcmVjaXNlID8gLTEgOiBuIC0gKGNtLmRvYy5tb2RlLmlubmVyTW9kZSA/IDEwMDAgOiAxMDApO1xuICAgIGZvciAodmFyIHNlYXJjaCA9IG47IHNlYXJjaCA+IGxpbTsgLS1zZWFyY2gpIHtcbiAgICAgIGlmIChzZWFyY2ggPD0gZG9jLmZpcnN0KSB7IHJldHVybiBkb2MuZmlyc3QgfVxuICAgICAgdmFyIGxpbmUgPSBnZXRMaW5lKGRvYywgc2VhcmNoIC0gMSksIGFmdGVyID0gbGluZS5zdGF0ZUFmdGVyO1xuICAgICAgaWYgKGFmdGVyICYmICghcHJlY2lzZSB8fCBzZWFyY2ggKyAoYWZ0ZXIgaW5zdGFuY2VvZiBTYXZlZENvbnRleHQgPyBhZnRlci5sb29rQWhlYWQgOiAwKSA8PSBkb2MubW9kZUZyb250aWVyKSlcbiAgICAgICAgeyByZXR1cm4gc2VhcmNoIH1cbiAgICAgIHZhciBpbmRlbnRlZCA9IGNvdW50Q29sdW1uKGxpbmUudGV4dCwgbnVsbCwgY20ub3B0aW9ucy50YWJTaXplKTtcbiAgICAgIGlmIChtaW5saW5lID09IG51bGwgfHwgbWluaW5kZW50ID4gaW5kZW50ZWQpIHtcbiAgICAgICAgbWlubGluZSA9IHNlYXJjaCAtIDE7XG4gICAgICAgIG1pbmluZGVudCA9IGluZGVudGVkO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWlubGluZVxuICB9XG5cbiAgZnVuY3Rpb24gcmV0cmVhdEZyb250aWVyKGRvYywgbikge1xuICAgIGRvYy5tb2RlRnJvbnRpZXIgPSBNYXRoLm1pbihkb2MubW9kZUZyb250aWVyLCBuKTtcbiAgICBpZiAoZG9jLmhpZ2hsaWdodEZyb250aWVyIDwgbiAtIDEwKSB7IHJldHVybiB9XG4gICAgdmFyIHN0YXJ0ID0gZG9jLmZpcnN0O1xuICAgIGZvciAodmFyIGxpbmUgPSBuIC0gMTsgbGluZSA+IHN0YXJ0OyBsaW5lLS0pIHtcbiAgICAgIHZhciBzYXZlZCA9IGdldExpbmUoZG9jLCBsaW5lKS5zdGF0ZUFmdGVyO1xuICAgICAgLy8gY2hhbmdlIGlzIG9uIDNcbiAgICAgIC8vIHN0YXRlIG9uIGxpbmUgMSBsb29rZWQgYWhlYWQgMiAtLSBzbyBzYXcgM1xuICAgICAgLy8gdGVzdCAxICsgMiA8IDMgc2hvdWxkIGNvdmVyIHRoaXNcbiAgICAgIGlmIChzYXZlZCAmJiAoIShzYXZlZCBpbnN0YW5jZW9mIFNhdmVkQ29udGV4dCkgfHwgbGluZSArIHNhdmVkLmxvb2tBaGVhZCA8IG4pKSB7XG4gICAgICAgIHN0YXJ0ID0gbGluZSArIDE7XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICAgIGRvYy5oaWdobGlnaHRGcm9udGllciA9IE1hdGgubWluKGRvYy5oaWdobGlnaHRGcm9udGllciwgc3RhcnQpO1xuICB9XG5cbiAgLy8gT3B0aW1pemUgc29tZSBjb2RlIHdoZW4gdGhlc2UgZmVhdHVyZXMgYXJlIG5vdCB1c2VkLlxuICB2YXIgc2F3UmVhZE9ubHlTcGFucyA9IGZhbHNlLCBzYXdDb2xsYXBzZWRTcGFucyA9IGZhbHNlO1xuXG4gIGZ1bmN0aW9uIHNlZVJlYWRPbmx5U3BhbnMoKSB7XG4gICAgc2F3UmVhZE9ubHlTcGFucyA9IHRydWU7XG4gIH1cblxuICBmdW5jdGlvbiBzZWVDb2xsYXBzZWRTcGFucygpIHtcbiAgICBzYXdDb2xsYXBzZWRTcGFucyA9IHRydWU7XG4gIH1cblxuICAvLyBURVhUTUFSS0VSIFNQQU5TXG5cbiAgZnVuY3Rpb24gTWFya2VkU3BhbihtYXJrZXIsIGZyb20sIHRvKSB7XG4gICAgdGhpcy5tYXJrZXIgPSBtYXJrZXI7XG4gICAgdGhpcy5mcm9tID0gZnJvbTsgdGhpcy50byA9IHRvO1xuICB9XG5cbiAgLy8gU2VhcmNoIGFuIGFycmF5IG9mIHNwYW5zIGZvciBhIHNwYW4gbWF0Y2hpbmcgdGhlIGdpdmVuIG1hcmtlci5cbiAgZnVuY3Rpb24gZ2V0TWFya2VkU3BhbkZvcihzcGFucywgbWFya2VyKSB7XG4gICAgaWYgKHNwYW5zKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBzcGFuID0gc3BhbnNbaV07XG4gICAgICBpZiAoc3Bhbi5tYXJrZXIgPT0gbWFya2VyKSB7IHJldHVybiBzcGFuIH1cbiAgICB9IH1cbiAgfVxuICAvLyBSZW1vdmUgYSBzcGFuIGZyb20gYW4gYXJyYXksIHJldHVybmluZyB1bmRlZmluZWQgaWYgbm8gc3BhbnMgYXJlXG4gIC8vIGxlZnQgKHdlIGRvbid0IHN0b3JlIGFycmF5cyBmb3IgbGluZXMgd2l0aG91dCBzcGFucykuXG4gIGZ1bmN0aW9uIHJlbW92ZU1hcmtlZFNwYW4oc3BhbnMsIHNwYW4pIHtcbiAgICB2YXIgcjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgKytpKVxuICAgICAgeyBpZiAoc3BhbnNbaV0gIT0gc3BhbikgeyAociB8fCAociA9IFtdKSkucHVzaChzcGFuc1tpXSk7IH0gfVxuICAgIHJldHVybiByXG4gIH1cbiAgLy8gQWRkIGEgc3BhbiB0byBhIGxpbmUuXG4gIGZ1bmN0aW9uIGFkZE1hcmtlZFNwYW4obGluZSwgc3Bhbikge1xuICAgIGxpbmUubWFya2VkU3BhbnMgPSBsaW5lLm1hcmtlZFNwYW5zID8gbGluZS5tYXJrZWRTcGFucy5jb25jYXQoW3NwYW5dKSA6IFtzcGFuXTtcbiAgICBzcGFuLm1hcmtlci5hdHRhY2hMaW5lKGxpbmUpO1xuICB9XG5cbiAgLy8gVXNlZCBmb3IgdGhlIGFsZ29yaXRobSB0aGF0IGFkanVzdHMgbWFya2VycyBmb3IgYSBjaGFuZ2UgaW4gdGhlXG4gIC8vIGRvY3VtZW50LiBUaGVzZSBmdW5jdGlvbnMgY3V0IGFuIGFycmF5IG9mIHNwYW5zIGF0IGEgZ2l2ZW5cbiAgLy8gY2hhcmFjdGVyIHBvc2l0aW9uLCByZXR1cm5pbmcgYW4gYXJyYXkgb2YgcmVtYWluaW5nIGNodW5rcyAob3JcbiAgLy8gdW5kZWZpbmVkIGlmIG5vdGhpbmcgcmVtYWlucykuXG4gIGZ1bmN0aW9uIG1hcmtlZFNwYW5zQmVmb3JlKG9sZCwgc3RhcnRDaCwgaXNJbnNlcnQpIHtcbiAgICB2YXIgbnc7XG4gICAgaWYgKG9sZCkgeyBmb3IgKHZhciBpID0gMDsgaSA8IG9sZC5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIHNwYW4gPSBvbGRbaV0sIG1hcmtlciA9IHNwYW4ubWFya2VyO1xuICAgICAgdmFyIHN0YXJ0c0JlZm9yZSA9IHNwYW4uZnJvbSA9PSBudWxsIHx8IChtYXJrZXIuaW5jbHVzaXZlTGVmdCA/IHNwYW4uZnJvbSA8PSBzdGFydENoIDogc3Bhbi5mcm9tIDwgc3RhcnRDaCk7XG4gICAgICBpZiAoc3RhcnRzQmVmb3JlIHx8IHNwYW4uZnJvbSA9PSBzdGFydENoICYmIG1hcmtlci50eXBlID09IFwiYm9va21hcmtcIiAmJiAoIWlzSW5zZXJ0IHx8ICFzcGFuLm1hcmtlci5pbnNlcnRMZWZ0KSkge1xuICAgICAgICB2YXIgZW5kc0FmdGVyID0gc3Bhbi50byA9PSBudWxsIHx8IChtYXJrZXIuaW5jbHVzaXZlUmlnaHQgPyBzcGFuLnRvID49IHN0YXJ0Q2ggOiBzcGFuLnRvID4gc3RhcnRDaClcbiAgICAgICAgOyhudyB8fCAobncgPSBbXSkpLnB1c2gobmV3IE1hcmtlZFNwYW4obWFya2VyLCBzcGFuLmZyb20sIGVuZHNBZnRlciA/IG51bGwgOiBzcGFuLnRvKSk7XG4gICAgICB9XG4gICAgfSB9XG4gICAgcmV0dXJuIG53XG4gIH1cbiAgZnVuY3Rpb24gbWFya2VkU3BhbnNBZnRlcihvbGQsIGVuZENoLCBpc0luc2VydCkge1xuICAgIHZhciBudztcbiAgICBpZiAob2xkKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgb2xkLmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgc3BhbiA9IG9sZFtpXSwgbWFya2VyID0gc3Bhbi5tYXJrZXI7XG4gICAgICB2YXIgZW5kc0FmdGVyID0gc3Bhbi50byA9PSBudWxsIHx8IChtYXJrZXIuaW5jbHVzaXZlUmlnaHQgPyBzcGFuLnRvID49IGVuZENoIDogc3Bhbi50byA+IGVuZENoKTtcbiAgICAgIGlmIChlbmRzQWZ0ZXIgfHwgc3Bhbi5mcm9tID09IGVuZENoICYmIG1hcmtlci50eXBlID09IFwiYm9va21hcmtcIiAmJiAoIWlzSW5zZXJ0IHx8IHNwYW4ubWFya2VyLmluc2VydExlZnQpKSB7XG4gICAgICAgIHZhciBzdGFydHNCZWZvcmUgPSBzcGFuLmZyb20gPT0gbnVsbCB8fCAobWFya2VyLmluY2x1c2l2ZUxlZnQgPyBzcGFuLmZyb20gPD0gZW5kQ2ggOiBzcGFuLmZyb20gPCBlbmRDaClcbiAgICAgICAgOyhudyB8fCAobncgPSBbXSkpLnB1c2gobmV3IE1hcmtlZFNwYW4obWFya2VyLCBzdGFydHNCZWZvcmUgPyBudWxsIDogc3Bhbi5mcm9tIC0gZW5kQ2gsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbi50byA9PSBudWxsID8gbnVsbCA6IHNwYW4udG8gLSBlbmRDaCkpO1xuICAgICAgfVxuICAgIH0gfVxuICAgIHJldHVybiBud1xuICB9XG5cbiAgLy8gR2l2ZW4gYSBjaGFuZ2Ugb2JqZWN0LCBjb21wdXRlIHRoZSBuZXcgc2V0IG9mIG1hcmtlciBzcGFucyB0aGF0XG4gIC8vIGNvdmVyIHRoZSBsaW5lIGluIHdoaWNoIHRoZSBjaGFuZ2UgdG9vayBwbGFjZS4gUmVtb3ZlcyBzcGFuc1xuICAvLyBlbnRpcmVseSB3aXRoaW4gdGhlIGNoYW5nZSwgcmVjb25uZWN0cyBzcGFucyBiZWxvbmdpbmcgdG8gdGhlXG4gIC8vIHNhbWUgbWFya2VyIHRoYXQgYXBwZWFyIG9uIGJvdGggc2lkZXMgb2YgdGhlIGNoYW5nZSwgYW5kIGN1dHMgb2ZmXG4gIC8vIHNwYW5zIHBhcnRpYWxseSB3aXRoaW4gdGhlIGNoYW5nZS4gUmV0dXJucyBhbiBhcnJheSBvZiBzcGFuXG4gIC8vIGFycmF5cyB3aXRoIG9uZSBlbGVtZW50IGZvciBlYWNoIGxpbmUgaW4gKGFmdGVyKSB0aGUgY2hhbmdlLlxuICBmdW5jdGlvbiBzdHJldGNoU3BhbnNPdmVyQ2hhbmdlKGRvYywgY2hhbmdlKSB7XG4gICAgaWYgKGNoYW5nZS5mdWxsKSB7IHJldHVybiBudWxsIH1cbiAgICB2YXIgb2xkRmlyc3QgPSBpc0xpbmUoZG9jLCBjaGFuZ2UuZnJvbS5saW5lKSAmJiBnZXRMaW5lKGRvYywgY2hhbmdlLmZyb20ubGluZSkubWFya2VkU3BhbnM7XG4gICAgdmFyIG9sZExhc3QgPSBpc0xpbmUoZG9jLCBjaGFuZ2UudG8ubGluZSkgJiYgZ2V0TGluZShkb2MsIGNoYW5nZS50by5saW5lKS5tYXJrZWRTcGFucztcbiAgICBpZiAoIW9sZEZpcnN0ICYmICFvbGRMYXN0KSB7IHJldHVybiBudWxsIH1cblxuICAgIHZhciBzdGFydENoID0gY2hhbmdlLmZyb20uY2gsIGVuZENoID0gY2hhbmdlLnRvLmNoLCBpc0luc2VydCA9IGNtcChjaGFuZ2UuZnJvbSwgY2hhbmdlLnRvKSA9PSAwO1xuICAgIC8vIEdldCB0aGUgc3BhbnMgdGhhdCAnc3RpY2sgb3V0JyBvbiBib3RoIHNpZGVzXG4gICAgdmFyIGZpcnN0ID0gbWFya2VkU3BhbnNCZWZvcmUob2xkRmlyc3QsIHN0YXJ0Q2gsIGlzSW5zZXJ0KTtcbiAgICB2YXIgbGFzdCA9IG1hcmtlZFNwYW5zQWZ0ZXIob2xkTGFzdCwgZW5kQ2gsIGlzSW5zZXJ0KTtcblxuICAgIC8vIE5leHQsIG1lcmdlIHRob3NlIHR3byBlbmRzXG4gICAgdmFyIHNhbWVMaW5lID0gY2hhbmdlLnRleHQubGVuZ3RoID09IDEsIG9mZnNldCA9IGxzdChjaGFuZ2UudGV4dCkubGVuZ3RoICsgKHNhbWVMaW5lID8gc3RhcnRDaCA6IDApO1xuICAgIGlmIChmaXJzdCkge1xuICAgICAgLy8gRml4IHVwIC50byBwcm9wZXJ0aWVzIG9mIGZpcnN0XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpcnN0Lmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBzcGFuID0gZmlyc3RbaV07XG4gICAgICAgIGlmIChzcGFuLnRvID09IG51bGwpIHtcbiAgICAgICAgICB2YXIgZm91bmQgPSBnZXRNYXJrZWRTcGFuRm9yKGxhc3QsIHNwYW4ubWFya2VyKTtcbiAgICAgICAgICBpZiAoIWZvdW5kKSB7IHNwYW4udG8gPSBzdGFydENoOyB9XG4gICAgICAgICAgZWxzZSBpZiAoc2FtZUxpbmUpIHsgc3Bhbi50byA9IGZvdW5kLnRvID09IG51bGwgPyBudWxsIDogZm91bmQudG8gKyBvZmZzZXQ7IH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAobGFzdCkge1xuICAgICAgLy8gRml4IHVwIC5mcm9tIGluIGxhc3QgKG9yIG1vdmUgdGhlbSBpbnRvIGZpcnN0IGluIGNhc2Ugb2Ygc2FtZUxpbmUpXG4gICAgICBmb3IgKHZhciBpJDEgPSAwOyBpJDEgPCBsYXN0Lmxlbmd0aDsgKytpJDEpIHtcbiAgICAgICAgdmFyIHNwYW4kMSA9IGxhc3RbaSQxXTtcbiAgICAgICAgaWYgKHNwYW4kMS50byAhPSBudWxsKSB7IHNwYW4kMS50byArPSBvZmZzZXQ7IH1cbiAgICAgICAgaWYgKHNwYW4kMS5mcm9tID09IG51bGwpIHtcbiAgICAgICAgICB2YXIgZm91bmQkMSA9IGdldE1hcmtlZFNwYW5Gb3IoZmlyc3QsIHNwYW4kMS5tYXJrZXIpO1xuICAgICAgICAgIGlmICghZm91bmQkMSkge1xuICAgICAgICAgICAgc3BhbiQxLmZyb20gPSBvZmZzZXQ7XG4gICAgICAgICAgICBpZiAoc2FtZUxpbmUpIHsgKGZpcnN0IHx8IChmaXJzdCA9IFtdKSkucHVzaChzcGFuJDEpOyB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNwYW4kMS5mcm9tICs9IG9mZnNldDtcbiAgICAgICAgICBpZiAoc2FtZUxpbmUpIHsgKGZpcnN0IHx8IChmaXJzdCA9IFtdKSkucHVzaChzcGFuJDEpOyB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gTWFrZSBzdXJlIHdlIGRpZG4ndCBjcmVhdGUgYW55IHplcm8tbGVuZ3RoIHNwYW5zXG4gICAgaWYgKGZpcnN0KSB7IGZpcnN0ID0gY2xlYXJFbXB0eVNwYW5zKGZpcnN0KTsgfVxuICAgIGlmIChsYXN0ICYmIGxhc3QgIT0gZmlyc3QpIHsgbGFzdCA9IGNsZWFyRW1wdHlTcGFucyhsYXN0KTsgfVxuXG4gICAgdmFyIG5ld01hcmtlcnMgPSBbZmlyc3RdO1xuICAgIGlmICghc2FtZUxpbmUpIHtcbiAgICAgIC8vIEZpbGwgZ2FwIHdpdGggd2hvbGUtbGluZS1zcGFuc1xuICAgICAgdmFyIGdhcCA9IGNoYW5nZS50ZXh0Lmxlbmd0aCAtIDIsIGdhcE1hcmtlcnM7XG4gICAgICBpZiAoZ2FwID4gMCAmJiBmaXJzdClcbiAgICAgICAgeyBmb3IgKHZhciBpJDIgPSAwOyBpJDIgPCBmaXJzdC5sZW5ndGg7ICsraSQyKVxuICAgICAgICAgIHsgaWYgKGZpcnN0W2kkMl0udG8gPT0gbnVsbClcbiAgICAgICAgICAgIHsgKGdhcE1hcmtlcnMgfHwgKGdhcE1hcmtlcnMgPSBbXSkpLnB1c2gobmV3IE1hcmtlZFNwYW4oZmlyc3RbaSQyXS5tYXJrZXIsIG51bGwsIG51bGwpKTsgfSB9IH1cbiAgICAgIGZvciAodmFyIGkkMyA9IDA7IGkkMyA8IGdhcDsgKytpJDMpXG4gICAgICAgIHsgbmV3TWFya2Vycy5wdXNoKGdhcE1hcmtlcnMpOyB9XG4gICAgICBuZXdNYXJrZXJzLnB1c2gobGFzdCk7XG4gICAgfVxuICAgIHJldHVybiBuZXdNYXJrZXJzXG4gIH1cblxuICAvLyBSZW1vdmUgc3BhbnMgdGhhdCBhcmUgZW1wdHkgYW5kIGRvbid0IGhhdmUgYSBjbGVhcldoZW5FbXB0eVxuICAvLyBvcHRpb24gb2YgZmFsc2UuXG4gIGZ1bmN0aW9uIGNsZWFyRW1wdHlTcGFucyhzcGFucykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBzcGFuID0gc3BhbnNbaV07XG4gICAgICBpZiAoc3Bhbi5mcm9tICE9IG51bGwgJiYgc3Bhbi5mcm9tID09IHNwYW4udG8gJiYgc3Bhbi5tYXJrZXIuY2xlYXJXaGVuRW1wdHkgIT09IGZhbHNlKVxuICAgICAgICB7IHNwYW5zLnNwbGljZShpLS0sIDEpOyB9XG4gICAgfVxuICAgIGlmICghc3BhbnMubGVuZ3RoKSB7IHJldHVybiBudWxsIH1cbiAgICByZXR1cm4gc3BhbnNcbiAgfVxuXG4gIC8vIFVzZWQgdG8gJ2NsaXAnIG91dCByZWFkT25seSByYW5nZXMgd2hlbiBtYWtpbmcgYSBjaGFuZ2UuXG4gIGZ1bmN0aW9uIHJlbW92ZVJlYWRPbmx5UmFuZ2VzKGRvYywgZnJvbSwgdG8pIHtcbiAgICB2YXIgbWFya2VycyA9IG51bGw7XG4gICAgZG9jLml0ZXIoZnJvbS5saW5lLCB0by5saW5lICsgMSwgZnVuY3Rpb24gKGxpbmUpIHtcbiAgICAgIGlmIChsaW5lLm1hcmtlZFNwYW5zKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgbGluZS5tYXJrZWRTcGFucy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgbWFyayA9IGxpbmUubWFya2VkU3BhbnNbaV0ubWFya2VyO1xuICAgICAgICBpZiAobWFyay5yZWFkT25seSAmJiAoIW1hcmtlcnMgfHwgaW5kZXhPZihtYXJrZXJzLCBtYXJrKSA9PSAtMSkpXG4gICAgICAgICAgeyAobWFya2VycyB8fCAobWFya2VycyA9IFtdKSkucHVzaChtYXJrKTsgfVxuICAgICAgfSB9XG4gICAgfSk7XG4gICAgaWYgKCFtYXJrZXJzKSB7IHJldHVybiBudWxsIH1cbiAgICB2YXIgcGFydHMgPSBbe2Zyb206IGZyb20sIHRvOiB0b31dO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIG1rID0gbWFya2Vyc1tpXSwgbSA9IG1rLmZpbmQoMCk7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHBhcnRzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgIHZhciBwID0gcGFydHNbal07XG4gICAgICAgIGlmIChjbXAocC50bywgbS5mcm9tKSA8IDAgfHwgY21wKHAuZnJvbSwgbS50bykgPiAwKSB7IGNvbnRpbnVlIH1cbiAgICAgICAgdmFyIG5ld1BhcnRzID0gW2osIDFdLCBkZnJvbSA9IGNtcChwLmZyb20sIG0uZnJvbSksIGR0byA9IGNtcChwLnRvLCBtLnRvKTtcbiAgICAgICAgaWYgKGRmcm9tIDwgMCB8fCAhbWsuaW5jbHVzaXZlTGVmdCAmJiAhZGZyb20pXG4gICAgICAgICAgeyBuZXdQYXJ0cy5wdXNoKHtmcm9tOiBwLmZyb20sIHRvOiBtLmZyb219KTsgfVxuICAgICAgICBpZiAoZHRvID4gMCB8fCAhbWsuaW5jbHVzaXZlUmlnaHQgJiYgIWR0bylcbiAgICAgICAgICB7IG5ld1BhcnRzLnB1c2goe2Zyb206IG0udG8sIHRvOiBwLnRvfSk7IH1cbiAgICAgICAgcGFydHMuc3BsaWNlLmFwcGx5KHBhcnRzLCBuZXdQYXJ0cyk7XG4gICAgICAgIGogKz0gbmV3UGFydHMubGVuZ3RoIC0gMztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBhcnRzXG4gIH1cblxuICAvLyBDb25uZWN0IG9yIGRpc2Nvbm5lY3Qgc3BhbnMgZnJvbSBhIGxpbmUuXG4gIGZ1bmN0aW9uIGRldGFjaE1hcmtlZFNwYW5zKGxpbmUpIHtcbiAgICB2YXIgc3BhbnMgPSBsaW5lLm1hcmtlZFNwYW5zO1xuICAgIGlmICghc3BhbnMpIHsgcmV0dXJuIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgKytpKVxuICAgICAgeyBzcGFuc1tpXS5tYXJrZXIuZGV0YWNoTGluZShsaW5lKTsgfVxuICAgIGxpbmUubWFya2VkU3BhbnMgPSBudWxsO1xuICB9XG4gIGZ1bmN0aW9uIGF0dGFjaE1hcmtlZFNwYW5zKGxpbmUsIHNwYW5zKSB7XG4gICAgaWYgKCFzcGFucykgeyByZXR1cm4gfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyArK2kpXG4gICAgICB7IHNwYW5zW2ldLm1hcmtlci5hdHRhY2hMaW5lKGxpbmUpOyB9XG4gICAgbGluZS5tYXJrZWRTcGFucyA9IHNwYW5zO1xuICB9XG5cbiAgLy8gSGVscGVycyB1c2VkIHdoZW4gY29tcHV0aW5nIHdoaWNoIG92ZXJsYXBwaW5nIGNvbGxhcHNlZCBzcGFuXG4gIC8vIGNvdW50cyBhcyB0aGUgbGFyZ2VyIG9uZS5cbiAgZnVuY3Rpb24gZXh0cmFMZWZ0KG1hcmtlcikgeyByZXR1cm4gbWFya2VyLmluY2x1c2l2ZUxlZnQgPyAtMSA6IDAgfVxuICBmdW5jdGlvbiBleHRyYVJpZ2h0KG1hcmtlcikgeyByZXR1cm4gbWFya2VyLmluY2x1c2l2ZVJpZ2h0ID8gMSA6IDAgfVxuXG4gIC8vIFJldHVybnMgYSBudW1iZXIgaW5kaWNhdGluZyB3aGljaCBvZiB0d28gb3ZlcmxhcHBpbmcgY29sbGFwc2VkXG4gIC8vIHNwYW5zIGlzIGxhcmdlciAoYW5kIHRodXMgaW5jbHVkZXMgdGhlIG90aGVyKS4gRmFsbHMgYmFjayB0b1xuICAvLyBjb21wYXJpbmcgaWRzIHdoZW4gdGhlIHNwYW5zIGNvdmVyIGV4YWN0bHkgdGhlIHNhbWUgcmFuZ2UuXG4gIGZ1bmN0aW9uIGNvbXBhcmVDb2xsYXBzZWRNYXJrZXJzKGEsIGIpIHtcbiAgICB2YXIgbGVuRGlmZiA9IGEubGluZXMubGVuZ3RoIC0gYi5saW5lcy5sZW5ndGg7XG4gICAgaWYgKGxlbkRpZmYgIT0gMCkgeyByZXR1cm4gbGVuRGlmZiB9XG4gICAgdmFyIGFQb3MgPSBhLmZpbmQoKSwgYlBvcyA9IGIuZmluZCgpO1xuICAgIHZhciBmcm9tQ21wID0gY21wKGFQb3MuZnJvbSwgYlBvcy5mcm9tKSB8fCBleHRyYUxlZnQoYSkgLSBleHRyYUxlZnQoYik7XG4gICAgaWYgKGZyb21DbXApIHsgcmV0dXJuIC1mcm9tQ21wIH1cbiAgICB2YXIgdG9DbXAgPSBjbXAoYVBvcy50bywgYlBvcy50bykgfHwgZXh0cmFSaWdodChhKSAtIGV4dHJhUmlnaHQoYik7XG4gICAgaWYgKHRvQ21wKSB7IHJldHVybiB0b0NtcCB9XG4gICAgcmV0dXJuIGIuaWQgLSBhLmlkXG4gIH1cblxuICAvLyBGaW5kIG91dCB3aGV0aGVyIGEgbGluZSBlbmRzIG9yIHN0YXJ0cyBpbiBhIGNvbGxhcHNlZCBzcGFuLiBJZlxuICAvLyBzbywgcmV0dXJuIHRoZSBtYXJrZXIgZm9yIHRoYXQgc3Bhbi5cbiAgZnVuY3Rpb24gY29sbGFwc2VkU3BhbkF0U2lkZShsaW5lLCBzdGFydCkge1xuICAgIHZhciBzcHMgPSBzYXdDb2xsYXBzZWRTcGFucyAmJiBsaW5lLm1hcmtlZFNwYW5zLCBmb3VuZDtcbiAgICBpZiAoc3BzKSB7IGZvciAodmFyIHNwID0gKHZvaWQgMCksIGkgPSAwOyBpIDwgc3BzLmxlbmd0aDsgKytpKSB7XG4gICAgICBzcCA9IHNwc1tpXTtcbiAgICAgIGlmIChzcC5tYXJrZXIuY29sbGFwc2VkICYmIChzdGFydCA/IHNwLmZyb20gOiBzcC50bykgPT0gbnVsbCAmJlxuICAgICAgICAgICghZm91bmQgfHwgY29tcGFyZUNvbGxhcHNlZE1hcmtlcnMoZm91bmQsIHNwLm1hcmtlcikgPCAwKSlcbiAgICAgICAgeyBmb3VuZCA9IHNwLm1hcmtlcjsgfVxuICAgIH0gfVxuICAgIHJldHVybiBmb3VuZFxuICB9XG4gIGZ1bmN0aW9uIGNvbGxhcHNlZFNwYW5BdFN0YXJ0KGxpbmUpIHsgcmV0dXJuIGNvbGxhcHNlZFNwYW5BdFNpZGUobGluZSwgdHJ1ZSkgfVxuICBmdW5jdGlvbiBjb2xsYXBzZWRTcGFuQXRFbmQobGluZSkgeyByZXR1cm4gY29sbGFwc2VkU3BhbkF0U2lkZShsaW5lLCBmYWxzZSkgfVxuXG4gIGZ1bmN0aW9uIGNvbGxhcHNlZFNwYW5Bcm91bmQobGluZSwgY2gpIHtcbiAgICB2YXIgc3BzID0gc2F3Q29sbGFwc2VkU3BhbnMgJiYgbGluZS5tYXJrZWRTcGFucywgZm91bmQ7XG4gICAgaWYgKHNwcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHNwcy5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIHNwID0gc3BzW2ldO1xuICAgICAgaWYgKHNwLm1hcmtlci5jb2xsYXBzZWQgJiYgKHNwLmZyb20gPT0gbnVsbCB8fCBzcC5mcm9tIDwgY2gpICYmIChzcC50byA9PSBudWxsIHx8IHNwLnRvID4gY2gpICYmXG4gICAgICAgICAgKCFmb3VuZCB8fCBjb21wYXJlQ29sbGFwc2VkTWFya2Vycyhmb3VuZCwgc3AubWFya2VyKSA8IDApKSB7IGZvdW5kID0gc3AubWFya2VyOyB9XG4gICAgfSB9XG4gICAgcmV0dXJuIGZvdW5kXG4gIH1cblxuICAvLyBUZXN0IHdoZXRoZXIgdGhlcmUgZXhpc3RzIGEgY29sbGFwc2VkIHNwYW4gdGhhdCBwYXJ0aWFsbHlcbiAgLy8gb3ZlcmxhcHMgKGNvdmVycyB0aGUgc3RhcnQgb3IgZW5kLCBidXQgbm90IGJvdGgpIG9mIGEgbmV3IHNwYW4uXG4gIC8vIFN1Y2ggb3ZlcmxhcCBpcyBub3QgYWxsb3dlZC5cbiAgZnVuY3Rpb24gY29uZmxpY3RpbmdDb2xsYXBzZWRSYW5nZShkb2MsIGxpbmVObywgZnJvbSwgdG8sIG1hcmtlcikge1xuICAgIHZhciBsaW5lID0gZ2V0TGluZShkb2MsIGxpbmVObyk7XG4gICAgdmFyIHNwcyA9IHNhd0NvbGxhcHNlZFNwYW5zICYmIGxpbmUubWFya2VkU3BhbnM7XG4gICAgaWYgKHNwcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHNwcy5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIHNwID0gc3BzW2ldO1xuICAgICAgaWYgKCFzcC5tYXJrZXIuY29sbGFwc2VkKSB7IGNvbnRpbnVlIH1cbiAgICAgIHZhciBmb3VuZCA9IHNwLm1hcmtlci5maW5kKDApO1xuICAgICAgdmFyIGZyb21DbXAgPSBjbXAoZm91bmQuZnJvbSwgZnJvbSkgfHwgZXh0cmFMZWZ0KHNwLm1hcmtlcikgLSBleHRyYUxlZnQobWFya2VyKTtcbiAgICAgIHZhciB0b0NtcCA9IGNtcChmb3VuZC50bywgdG8pIHx8IGV4dHJhUmlnaHQoc3AubWFya2VyKSAtIGV4dHJhUmlnaHQobWFya2VyKTtcbiAgICAgIGlmIChmcm9tQ21wID49IDAgJiYgdG9DbXAgPD0gMCB8fCBmcm9tQ21wIDw9IDAgJiYgdG9DbXAgPj0gMCkgeyBjb250aW51ZSB9XG4gICAgICBpZiAoZnJvbUNtcCA8PSAwICYmIChzcC5tYXJrZXIuaW5jbHVzaXZlUmlnaHQgJiYgbWFya2VyLmluY2x1c2l2ZUxlZnQgPyBjbXAoZm91bmQudG8sIGZyb20pID49IDAgOiBjbXAoZm91bmQudG8sIGZyb20pID4gMCkgfHxcbiAgICAgICAgICBmcm9tQ21wID49IDAgJiYgKHNwLm1hcmtlci5pbmNsdXNpdmVSaWdodCAmJiBtYXJrZXIuaW5jbHVzaXZlTGVmdCA/IGNtcChmb3VuZC5mcm9tLCB0bykgPD0gMCA6IGNtcChmb3VuZC5mcm9tLCB0bykgPCAwKSlcbiAgICAgICAgeyByZXR1cm4gdHJ1ZSB9XG4gICAgfSB9XG4gIH1cblxuICAvLyBBIHZpc3VhbCBsaW5lIGlzIGEgbGluZSBhcyBkcmF3biBvbiB0aGUgc2NyZWVuLiBGb2xkaW5nLCBmb3JcbiAgLy8gZXhhbXBsZSwgY2FuIGNhdXNlIG11bHRpcGxlIGxvZ2ljYWwgbGluZXMgdG8gYXBwZWFyIG9uIHRoZSBzYW1lXG4gIC8vIHZpc3VhbCBsaW5lLiBUaGlzIGZpbmRzIHRoZSBzdGFydCBvZiB0aGUgdmlzdWFsIGxpbmUgdGhhdCB0aGVcbiAgLy8gZ2l2ZW4gbGluZSBpcyBwYXJ0IG9mICh1c3VhbGx5IHRoYXQgaXMgdGhlIGxpbmUgaXRzZWxmKS5cbiAgZnVuY3Rpb24gdmlzdWFsTGluZShsaW5lKSB7XG4gICAgdmFyIG1lcmdlZDtcbiAgICB3aGlsZSAobWVyZ2VkID0gY29sbGFwc2VkU3BhbkF0U3RhcnQobGluZSkpXG4gICAgICB7IGxpbmUgPSBtZXJnZWQuZmluZCgtMSwgdHJ1ZSkubGluZTsgfVxuICAgIHJldHVybiBsaW5lXG4gIH1cblxuICBmdW5jdGlvbiB2aXN1YWxMaW5lRW5kKGxpbmUpIHtcbiAgICB2YXIgbWVyZ2VkO1xuICAgIHdoaWxlIChtZXJnZWQgPSBjb2xsYXBzZWRTcGFuQXRFbmQobGluZSkpXG4gICAgICB7IGxpbmUgPSBtZXJnZWQuZmluZCgxLCB0cnVlKS5saW5lOyB9XG4gICAgcmV0dXJuIGxpbmVcbiAgfVxuXG4gIC8vIFJldHVybnMgYW4gYXJyYXkgb2YgbG9naWNhbCBsaW5lcyB0aGF0IGNvbnRpbnVlIHRoZSB2aXN1YWwgbGluZVxuICAvLyBzdGFydGVkIGJ5IHRoZSBhcmd1bWVudCwgb3IgdW5kZWZpbmVkIGlmIHRoZXJlIGFyZSBubyBzdWNoIGxpbmVzLlxuICBmdW5jdGlvbiB2aXN1YWxMaW5lQ29udGludWVkKGxpbmUpIHtcbiAgICB2YXIgbWVyZ2VkLCBsaW5lcztcbiAgICB3aGlsZSAobWVyZ2VkID0gY29sbGFwc2VkU3BhbkF0RW5kKGxpbmUpKSB7XG4gICAgICBsaW5lID0gbWVyZ2VkLmZpbmQoMSwgdHJ1ZSkubGluZVxuICAgICAgOyhsaW5lcyB8fCAobGluZXMgPSBbXSkpLnB1c2gobGluZSk7XG4gICAgfVxuICAgIHJldHVybiBsaW5lc1xuICB9XG5cbiAgLy8gR2V0IHRoZSBsaW5lIG51bWJlciBvZiB0aGUgc3RhcnQgb2YgdGhlIHZpc3VhbCBsaW5lIHRoYXQgdGhlXG4gIC8vIGdpdmVuIGxpbmUgbnVtYmVyIGlzIHBhcnQgb2YuXG4gIGZ1bmN0aW9uIHZpc3VhbExpbmVObyhkb2MsIGxpbmVOKSB7XG4gICAgdmFyIGxpbmUgPSBnZXRMaW5lKGRvYywgbGluZU4pLCB2aXMgPSB2aXN1YWxMaW5lKGxpbmUpO1xuICAgIGlmIChsaW5lID09IHZpcykgeyByZXR1cm4gbGluZU4gfVxuICAgIHJldHVybiBsaW5lTm8odmlzKVxuICB9XG5cbiAgLy8gR2V0IHRoZSBsaW5lIG51bWJlciBvZiB0aGUgc3RhcnQgb2YgdGhlIG5leHQgdmlzdWFsIGxpbmUgYWZ0ZXJcbiAgLy8gdGhlIGdpdmVuIGxpbmUuXG4gIGZ1bmN0aW9uIHZpc3VhbExpbmVFbmRObyhkb2MsIGxpbmVOKSB7XG4gICAgaWYgKGxpbmVOID4gZG9jLmxhc3RMaW5lKCkpIHsgcmV0dXJuIGxpbmVOIH1cbiAgICB2YXIgbGluZSA9IGdldExpbmUoZG9jLCBsaW5lTiksIG1lcmdlZDtcbiAgICBpZiAoIWxpbmVJc0hpZGRlbihkb2MsIGxpbmUpKSB7IHJldHVybiBsaW5lTiB9XG4gICAgd2hpbGUgKG1lcmdlZCA9IGNvbGxhcHNlZFNwYW5BdEVuZChsaW5lKSlcbiAgICAgIHsgbGluZSA9IG1lcmdlZC5maW5kKDEsIHRydWUpLmxpbmU7IH1cbiAgICByZXR1cm4gbGluZU5vKGxpbmUpICsgMVxuICB9XG5cbiAgLy8gQ29tcHV0ZSB3aGV0aGVyIGEgbGluZSBpcyBoaWRkZW4uIExpbmVzIGNvdW50IGFzIGhpZGRlbiB3aGVuIHRoZXlcbiAgLy8gYXJlIHBhcnQgb2YgYSB2aXN1YWwgbGluZSB0aGF0IHN0YXJ0cyB3aXRoIGFub3RoZXIgbGluZSwgb3Igd2hlblxuICAvLyB0aGV5IGFyZSBlbnRpcmVseSBjb3ZlcmVkIGJ5IGNvbGxhcHNlZCwgbm9uLXdpZGdldCBzcGFuLlxuICBmdW5jdGlvbiBsaW5lSXNIaWRkZW4oZG9jLCBsaW5lKSB7XG4gICAgdmFyIHNwcyA9IHNhd0NvbGxhcHNlZFNwYW5zICYmIGxpbmUubWFya2VkU3BhbnM7XG4gICAgaWYgKHNwcykgeyBmb3IgKHZhciBzcCA9ICh2b2lkIDApLCBpID0gMDsgaSA8IHNwcy5sZW5ndGg7ICsraSkge1xuICAgICAgc3AgPSBzcHNbaV07XG4gICAgICBpZiAoIXNwLm1hcmtlci5jb2xsYXBzZWQpIHsgY29udGludWUgfVxuICAgICAgaWYgKHNwLmZyb20gPT0gbnVsbCkgeyByZXR1cm4gdHJ1ZSB9XG4gICAgICBpZiAoc3AubWFya2VyLndpZGdldE5vZGUpIHsgY29udGludWUgfVxuICAgICAgaWYgKHNwLmZyb20gPT0gMCAmJiBzcC5tYXJrZXIuaW5jbHVzaXZlTGVmdCAmJiBsaW5lSXNIaWRkZW5Jbm5lcihkb2MsIGxpbmUsIHNwKSlcbiAgICAgICAgeyByZXR1cm4gdHJ1ZSB9XG4gICAgfSB9XG4gIH1cbiAgZnVuY3Rpb24gbGluZUlzSGlkZGVuSW5uZXIoZG9jLCBsaW5lLCBzcGFuKSB7XG4gICAgaWYgKHNwYW4udG8gPT0gbnVsbCkge1xuICAgICAgdmFyIGVuZCA9IHNwYW4ubWFya2VyLmZpbmQoMSwgdHJ1ZSk7XG4gICAgICByZXR1cm4gbGluZUlzSGlkZGVuSW5uZXIoZG9jLCBlbmQubGluZSwgZ2V0TWFya2VkU3BhbkZvcihlbmQubGluZS5tYXJrZWRTcGFucywgc3Bhbi5tYXJrZXIpKVxuICAgIH1cbiAgICBpZiAoc3Bhbi5tYXJrZXIuaW5jbHVzaXZlUmlnaHQgJiYgc3Bhbi50byA9PSBsaW5lLnRleHQubGVuZ3RoKVxuICAgICAgeyByZXR1cm4gdHJ1ZSB9XG4gICAgZm9yICh2YXIgc3AgPSAodm9pZCAwKSwgaSA9IDA7IGkgPCBsaW5lLm1hcmtlZFNwYW5zLmxlbmd0aDsgKytpKSB7XG4gICAgICBzcCA9IGxpbmUubWFya2VkU3BhbnNbaV07XG4gICAgICBpZiAoc3AubWFya2VyLmNvbGxhcHNlZCAmJiAhc3AubWFya2VyLndpZGdldE5vZGUgJiYgc3AuZnJvbSA9PSBzcGFuLnRvICYmXG4gICAgICAgICAgKHNwLnRvID09IG51bGwgfHwgc3AudG8gIT0gc3Bhbi5mcm9tKSAmJlxuICAgICAgICAgIChzcC5tYXJrZXIuaW5jbHVzaXZlTGVmdCB8fCBzcGFuLm1hcmtlci5pbmNsdXNpdmVSaWdodCkgJiZcbiAgICAgICAgICBsaW5lSXNIaWRkZW5Jbm5lcihkb2MsIGxpbmUsIHNwKSkgeyByZXR1cm4gdHJ1ZSB9XG4gICAgfVxuICB9XG5cbiAgLy8gRmluZCB0aGUgaGVpZ2h0IGFib3ZlIHRoZSBnaXZlbiBsaW5lLlxuICBmdW5jdGlvbiBoZWlnaHRBdExpbmUobGluZU9iaikge1xuICAgIGxpbmVPYmogPSB2aXN1YWxMaW5lKGxpbmVPYmopO1xuXG4gICAgdmFyIGggPSAwLCBjaHVuayA9IGxpbmVPYmoucGFyZW50O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2h1bmsubGluZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBsaW5lID0gY2h1bmsubGluZXNbaV07XG4gICAgICBpZiAobGluZSA9PSBsaW5lT2JqKSB7IGJyZWFrIH1cbiAgICAgIGVsc2UgeyBoICs9IGxpbmUuaGVpZ2h0OyB9XG4gICAgfVxuICAgIGZvciAodmFyIHAgPSBjaHVuay5wYXJlbnQ7IHA7IGNodW5rID0gcCwgcCA9IGNodW5rLnBhcmVudCkge1xuICAgICAgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgcC5jaGlsZHJlbi5sZW5ndGg7ICsraSQxKSB7XG4gICAgICAgIHZhciBjdXIgPSBwLmNoaWxkcmVuW2kkMV07XG4gICAgICAgIGlmIChjdXIgPT0gY2h1bmspIHsgYnJlYWsgfVxuICAgICAgICBlbHNlIHsgaCArPSBjdXIuaGVpZ2h0OyB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBoXG4gIH1cblxuICAvLyBDb21wdXRlIHRoZSBjaGFyYWN0ZXIgbGVuZ3RoIG9mIGEgbGluZSwgdGFraW5nIGludG8gYWNjb3VudFxuICAvLyBjb2xsYXBzZWQgcmFuZ2VzIChzZWUgbWFya1RleHQpIHRoYXQgbWlnaHQgaGlkZSBwYXJ0cywgYW5kIGpvaW5cbiAgLy8gb3RoZXIgbGluZXMgb250byBpdC5cbiAgZnVuY3Rpb24gbGluZUxlbmd0aChsaW5lKSB7XG4gICAgaWYgKGxpbmUuaGVpZ2h0ID09IDApIHsgcmV0dXJuIDAgfVxuICAgIHZhciBsZW4gPSBsaW5lLnRleHQubGVuZ3RoLCBtZXJnZWQsIGN1ciA9IGxpbmU7XG4gICAgd2hpbGUgKG1lcmdlZCA9IGNvbGxhcHNlZFNwYW5BdFN0YXJ0KGN1cikpIHtcbiAgICAgIHZhciBmb3VuZCA9IG1lcmdlZC5maW5kKDAsIHRydWUpO1xuICAgICAgY3VyID0gZm91bmQuZnJvbS5saW5lO1xuICAgICAgbGVuICs9IGZvdW5kLmZyb20uY2ggLSBmb3VuZC50by5jaDtcbiAgICB9XG4gICAgY3VyID0gbGluZTtcbiAgICB3aGlsZSAobWVyZ2VkID0gY29sbGFwc2VkU3BhbkF0RW5kKGN1cikpIHtcbiAgICAgIHZhciBmb3VuZCQxID0gbWVyZ2VkLmZpbmQoMCwgdHJ1ZSk7XG4gICAgICBsZW4gLT0gY3VyLnRleHQubGVuZ3RoIC0gZm91bmQkMS5mcm9tLmNoO1xuICAgICAgY3VyID0gZm91bmQkMS50by5saW5lO1xuICAgICAgbGVuICs9IGN1ci50ZXh0Lmxlbmd0aCAtIGZvdW5kJDEudG8uY2g7XG4gICAgfVxuICAgIHJldHVybiBsZW5cbiAgfVxuXG4gIC8vIEZpbmQgdGhlIGxvbmdlc3QgbGluZSBpbiB0aGUgZG9jdW1lbnQuXG4gIGZ1bmN0aW9uIGZpbmRNYXhMaW5lKGNtKSB7XG4gICAgdmFyIGQgPSBjbS5kaXNwbGF5LCBkb2MgPSBjbS5kb2M7XG4gICAgZC5tYXhMaW5lID0gZ2V0TGluZShkb2MsIGRvYy5maXJzdCk7XG4gICAgZC5tYXhMaW5lTGVuZ3RoID0gbGluZUxlbmd0aChkLm1heExpbmUpO1xuICAgIGQubWF4TGluZUNoYW5nZWQgPSB0cnVlO1xuICAgIGRvYy5pdGVyKGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgICB2YXIgbGVuID0gbGluZUxlbmd0aChsaW5lKTtcbiAgICAgIGlmIChsZW4gPiBkLm1heExpbmVMZW5ndGgpIHtcbiAgICAgICAgZC5tYXhMaW5lTGVuZ3RoID0gbGVuO1xuICAgICAgICBkLm1heExpbmUgPSBsaW5lO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gTElORSBEQVRBIFNUUlVDVFVSRVxuXG4gIC8vIExpbmUgb2JqZWN0cy4gVGhlc2UgaG9sZCBzdGF0ZSByZWxhdGVkIHRvIGEgbGluZSwgaW5jbHVkaW5nXG4gIC8vIGhpZ2hsaWdodGluZyBpbmZvICh0aGUgc3R5bGVzIGFycmF5KS5cbiAgdmFyIExpbmUgPSBmdW5jdGlvbih0ZXh0LCBtYXJrZWRTcGFucywgZXN0aW1hdGVIZWlnaHQpIHtcbiAgICB0aGlzLnRleHQgPSB0ZXh0O1xuICAgIGF0dGFjaE1hcmtlZFNwYW5zKHRoaXMsIG1hcmtlZFNwYW5zKTtcbiAgICB0aGlzLmhlaWdodCA9IGVzdGltYXRlSGVpZ2h0ID8gZXN0aW1hdGVIZWlnaHQodGhpcykgOiAxO1xuICB9O1xuXG4gIExpbmUucHJvdG90eXBlLmxpbmVObyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGxpbmVObyh0aGlzKSB9O1xuICBldmVudE1peGluKExpbmUpO1xuXG4gIC8vIENoYW5nZSB0aGUgY29udGVudCAodGV4dCwgbWFya2Vycykgb2YgYSBsaW5lLiBBdXRvbWF0aWNhbGx5XG4gIC8vIGludmFsaWRhdGVzIGNhY2hlZCBpbmZvcm1hdGlvbiBhbmQgdHJpZXMgdG8gcmUtZXN0aW1hdGUgdGhlXG4gIC8vIGxpbmUncyBoZWlnaHQuXG4gIGZ1bmN0aW9uIHVwZGF0ZUxpbmUobGluZSwgdGV4dCwgbWFya2VkU3BhbnMsIGVzdGltYXRlSGVpZ2h0KSB7XG4gICAgbGluZS50ZXh0ID0gdGV4dDtcbiAgICBpZiAobGluZS5zdGF0ZUFmdGVyKSB7IGxpbmUuc3RhdGVBZnRlciA9IG51bGw7IH1cbiAgICBpZiAobGluZS5zdHlsZXMpIHsgbGluZS5zdHlsZXMgPSBudWxsOyB9XG4gICAgaWYgKGxpbmUub3JkZXIgIT0gbnVsbCkgeyBsaW5lLm9yZGVyID0gbnVsbDsgfVxuICAgIGRldGFjaE1hcmtlZFNwYW5zKGxpbmUpO1xuICAgIGF0dGFjaE1hcmtlZFNwYW5zKGxpbmUsIG1hcmtlZFNwYW5zKTtcbiAgICB2YXIgZXN0SGVpZ2h0ID0gZXN0aW1hdGVIZWlnaHQgPyBlc3RpbWF0ZUhlaWdodChsaW5lKSA6IDE7XG4gICAgaWYgKGVzdEhlaWdodCAhPSBsaW5lLmhlaWdodCkgeyB1cGRhdGVMaW5lSGVpZ2h0KGxpbmUsIGVzdEhlaWdodCk7IH1cbiAgfVxuXG4gIC8vIERldGFjaCBhIGxpbmUgZnJvbSB0aGUgZG9jdW1lbnQgdHJlZSBhbmQgaXRzIG1hcmtlcnMuXG4gIGZ1bmN0aW9uIGNsZWFuVXBMaW5lKGxpbmUpIHtcbiAgICBsaW5lLnBhcmVudCA9IG51bGw7XG4gICAgZGV0YWNoTWFya2VkU3BhbnMobGluZSk7XG4gIH1cblxuICAvLyBDb252ZXJ0IGEgc3R5bGUgYXMgcmV0dXJuZWQgYnkgYSBtb2RlIChlaXRoZXIgbnVsbCwgb3IgYSBzdHJpbmdcbiAgLy8gY29udGFpbmluZyBvbmUgb3IgbW9yZSBzdHlsZXMpIHRvIGEgQ1NTIHN0eWxlLiBUaGlzIGlzIGNhY2hlZCxcbiAgLy8gYW5kIGFsc28gbG9va3MgZm9yIGxpbmUtd2lkZSBzdHlsZXMuXG4gIHZhciBzdHlsZVRvQ2xhc3NDYWNoZSA9IHt9LCBzdHlsZVRvQ2xhc3NDYWNoZVdpdGhNb2RlID0ge307XG4gIGZ1bmN0aW9uIGludGVycHJldFRva2VuU3R5bGUoc3R5bGUsIG9wdGlvbnMpIHtcbiAgICBpZiAoIXN0eWxlIHx8IC9eXFxzKiQvLnRlc3Qoc3R5bGUpKSB7IHJldHVybiBudWxsIH1cbiAgICB2YXIgY2FjaGUgPSBvcHRpb25zLmFkZE1vZGVDbGFzcyA/IHN0eWxlVG9DbGFzc0NhY2hlV2l0aE1vZGUgOiBzdHlsZVRvQ2xhc3NDYWNoZTtcbiAgICByZXR1cm4gY2FjaGVbc3R5bGVdIHx8XG4gICAgICAoY2FjaGVbc3R5bGVdID0gc3R5bGUucmVwbGFjZSgvXFxTKy9nLCBcImNtLSQmXCIpKVxuICB9XG5cbiAgLy8gUmVuZGVyIHRoZSBET00gcmVwcmVzZW50YXRpb24gb2YgdGhlIHRleHQgb2YgYSBsaW5lLiBBbHNvIGJ1aWxkc1xuICAvLyB1cCBhICdsaW5lIG1hcCcsIHdoaWNoIHBvaW50cyBhdCB0aGUgRE9NIG5vZGVzIHRoYXQgcmVwcmVzZW50XG4gIC8vIHNwZWNpZmljIHN0cmV0Y2hlcyBvZiB0ZXh0LCBhbmQgaXMgdXNlZCBieSB0aGUgbWVhc3VyaW5nIGNvZGUuXG4gIC8vIFRoZSByZXR1cm5lZCBvYmplY3QgY29udGFpbnMgdGhlIERPTSBub2RlLCB0aGlzIG1hcCwgYW5kXG4gIC8vIGluZm9ybWF0aW9uIGFib3V0IGxpbmUtd2lkZSBzdHlsZXMgdGhhdCB3ZXJlIHNldCBieSB0aGUgbW9kZS5cbiAgZnVuY3Rpb24gYnVpbGRMaW5lQ29udGVudChjbSwgbGluZVZpZXcpIHtcbiAgICAvLyBUaGUgcGFkZGluZy1yaWdodCBmb3JjZXMgdGhlIGVsZW1lbnQgdG8gaGF2ZSBhICdib3JkZXInLCB3aGljaFxuICAgIC8vIGlzIG5lZWRlZCBvbiBXZWJraXQgdG8gYmUgYWJsZSB0byBnZXQgbGluZS1sZXZlbCBib3VuZGluZ1xuICAgIC8vIHJlY3RhbmdsZXMgZm9yIGl0IChpbiBtZWFzdXJlQ2hhcikuXG4gICAgdmFyIGNvbnRlbnQgPSBlbHRQKFwic3BhblwiLCBudWxsLCBudWxsLCB3ZWJraXQgPyBcInBhZGRpbmctcmlnaHQ6IC4xcHhcIiA6IG51bGwpO1xuICAgIHZhciBidWlsZGVyID0ge3ByZTogZWx0UChcInByZVwiLCBbY29udGVudF0sIFwiQ29kZU1pcnJvci1saW5lXCIpLCBjb250ZW50OiBjb250ZW50LFxuICAgICAgICAgICAgICAgICAgIGNvbDogMCwgcG9zOiAwLCBjbTogY20sXG4gICAgICAgICAgICAgICAgICAgdHJhaWxpbmdTcGFjZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgc3BsaXRTcGFjZXM6IGNtLmdldE9wdGlvbihcImxpbmVXcmFwcGluZ1wiKX07XG4gICAgbGluZVZpZXcubWVhc3VyZSA9IHt9O1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBsb2dpY2FsIGxpbmVzIHRoYXQgbWFrZSB1cCB0aGlzIHZpc3VhbCBsaW5lLlxuICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IChsaW5lVmlldy5yZXN0ID8gbGluZVZpZXcucmVzdC5sZW5ndGggOiAwKTsgaSsrKSB7XG4gICAgICB2YXIgbGluZSA9IGkgPyBsaW5lVmlldy5yZXN0W2kgLSAxXSA6IGxpbmVWaWV3LmxpbmUsIG9yZGVyID0gKHZvaWQgMCk7XG4gICAgICBidWlsZGVyLnBvcyA9IDA7XG4gICAgICBidWlsZGVyLmFkZFRva2VuID0gYnVpbGRUb2tlbjtcbiAgICAgIC8vIE9wdGlvbmFsbHkgd2lyZSBpbiBzb21lIGhhY2tzIGludG8gdGhlIHRva2VuLXJlbmRlcmluZ1xuICAgICAgLy8gYWxnb3JpdGhtLCB0byBkZWFsIHdpdGggYnJvd3NlciBxdWlya3MuXG4gICAgICBpZiAoaGFzQmFkQmlkaVJlY3RzKGNtLmRpc3BsYXkubWVhc3VyZSkgJiYgKG9yZGVyID0gZ2V0T3JkZXIobGluZSwgY20uZG9jLmRpcmVjdGlvbikpKVxuICAgICAgICB7IGJ1aWxkZXIuYWRkVG9rZW4gPSBidWlsZFRva2VuQmFkQmlkaShidWlsZGVyLmFkZFRva2VuLCBvcmRlcik7IH1cbiAgICAgIGJ1aWxkZXIubWFwID0gW107XG4gICAgICB2YXIgYWxsb3dGcm9udGllclVwZGF0ZSA9IGxpbmVWaWV3ICE9IGNtLmRpc3BsYXkuZXh0ZXJuYWxNZWFzdXJlZCAmJiBsaW5lTm8obGluZSk7XG4gICAgICBpbnNlcnRMaW5lQ29udGVudChsaW5lLCBidWlsZGVyLCBnZXRMaW5lU3R5bGVzKGNtLCBsaW5lLCBhbGxvd0Zyb250aWVyVXBkYXRlKSk7XG4gICAgICBpZiAobGluZS5zdHlsZUNsYXNzZXMpIHtcbiAgICAgICAgaWYgKGxpbmUuc3R5bGVDbGFzc2VzLmJnQ2xhc3MpXG4gICAgICAgICAgeyBidWlsZGVyLmJnQ2xhc3MgPSBqb2luQ2xhc3NlcyhsaW5lLnN0eWxlQ2xhc3Nlcy5iZ0NsYXNzLCBidWlsZGVyLmJnQ2xhc3MgfHwgXCJcIik7IH1cbiAgICAgICAgaWYgKGxpbmUuc3R5bGVDbGFzc2VzLnRleHRDbGFzcylcbiAgICAgICAgICB7IGJ1aWxkZXIudGV4dENsYXNzID0gam9pbkNsYXNzZXMobGluZS5zdHlsZUNsYXNzZXMudGV4dENsYXNzLCBidWlsZGVyLnRleHRDbGFzcyB8fCBcIlwiKTsgfVxuICAgICAgfVxuXG4gICAgICAvLyBFbnN1cmUgYXQgbGVhc3QgYSBzaW5nbGUgbm9kZSBpcyBwcmVzZW50LCBmb3IgbWVhc3VyaW5nLlxuICAgICAgaWYgKGJ1aWxkZXIubWFwLmxlbmd0aCA9PSAwKVxuICAgICAgICB7IGJ1aWxkZXIubWFwLnB1c2goMCwgMCwgYnVpbGRlci5jb250ZW50LmFwcGVuZENoaWxkKHplcm9XaWR0aEVsZW1lbnQoY20uZGlzcGxheS5tZWFzdXJlKSkpOyB9XG5cbiAgICAgIC8vIFN0b3JlIHRoZSBtYXAgYW5kIGEgY2FjaGUgb2JqZWN0IGZvciB0aGUgY3VycmVudCBsb2dpY2FsIGxpbmVcbiAgICAgIGlmIChpID09IDApIHtcbiAgICAgICAgbGluZVZpZXcubWVhc3VyZS5tYXAgPSBidWlsZGVyLm1hcDtcbiAgICAgICAgbGluZVZpZXcubWVhc3VyZS5jYWNoZSA9IHt9O1xuICAgICAgfSBlbHNlIHtcbiAgKGxpbmVWaWV3Lm1lYXN1cmUubWFwcyB8fCAobGluZVZpZXcubWVhc3VyZS5tYXBzID0gW10pKS5wdXNoKGJ1aWxkZXIubWFwKVxuICAgICAgICA7KGxpbmVWaWV3Lm1lYXN1cmUuY2FjaGVzIHx8IChsaW5lVmlldy5tZWFzdXJlLmNhY2hlcyA9IFtdKSkucHVzaCh7fSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2VlIGlzc3VlICMyOTAxXG4gICAgaWYgKHdlYmtpdCkge1xuICAgICAgdmFyIGxhc3QgPSBidWlsZGVyLmNvbnRlbnQubGFzdENoaWxkO1xuICAgICAgaWYgKC9cXGJjbS10YWJcXGIvLnRlc3QobGFzdC5jbGFzc05hbWUpIHx8IChsYXN0LnF1ZXJ5U2VsZWN0b3IgJiYgbGFzdC5xdWVyeVNlbGVjdG9yKFwiLmNtLXRhYlwiKSkpXG4gICAgICAgIHsgYnVpbGRlci5jb250ZW50LmNsYXNzTmFtZSA9IFwiY20tdGFiLXdyYXAtaGFja1wiOyB9XG4gICAgfVxuXG4gICAgc2lnbmFsKGNtLCBcInJlbmRlckxpbmVcIiwgY20sIGxpbmVWaWV3LmxpbmUsIGJ1aWxkZXIucHJlKTtcbiAgICBpZiAoYnVpbGRlci5wcmUuY2xhc3NOYW1lKVxuICAgICAgeyBidWlsZGVyLnRleHRDbGFzcyA9IGpvaW5DbGFzc2VzKGJ1aWxkZXIucHJlLmNsYXNzTmFtZSwgYnVpbGRlci50ZXh0Q2xhc3MgfHwgXCJcIik7IH1cblxuICAgIHJldHVybiBidWlsZGVyXG4gIH1cblxuICBmdW5jdGlvbiBkZWZhdWx0U3BlY2lhbENoYXJQbGFjZWhvbGRlcihjaCkge1xuICAgIHZhciB0b2tlbiA9IGVsdChcInNwYW5cIiwgXCJcXHUyMDIyXCIsIFwiY20taW52YWxpZGNoYXJcIik7XG4gICAgdG9rZW4udGl0bGUgPSBcIlxcXFx1XCIgKyBjaC5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KTtcbiAgICB0b2tlbi5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIHRva2VuLnRpdGxlKTtcbiAgICByZXR1cm4gdG9rZW5cbiAgfVxuXG4gIC8vIEJ1aWxkIHVwIHRoZSBET00gcmVwcmVzZW50YXRpb24gZm9yIGEgc2luZ2xlIHRva2VuLCBhbmQgYWRkIGl0IHRvXG4gIC8vIHRoZSBsaW5lIG1hcC4gVGFrZXMgY2FyZSB0byByZW5kZXIgc3BlY2lhbCBjaGFyYWN0ZXJzIHNlcGFyYXRlbHkuXG4gIGZ1bmN0aW9uIGJ1aWxkVG9rZW4oYnVpbGRlciwgdGV4dCwgc3R5bGUsIHN0YXJ0U3R5bGUsIGVuZFN0eWxlLCBjc3MsIGF0dHJpYnV0ZXMpIHtcbiAgICBpZiAoIXRleHQpIHsgcmV0dXJuIH1cbiAgICB2YXIgZGlzcGxheVRleHQgPSBidWlsZGVyLnNwbGl0U3BhY2VzID8gc3BsaXRTcGFjZXModGV4dCwgYnVpbGRlci50cmFpbGluZ1NwYWNlKSA6IHRleHQ7XG4gICAgdmFyIHNwZWNpYWwgPSBidWlsZGVyLmNtLnN0YXRlLnNwZWNpYWxDaGFycywgbXVzdFdyYXAgPSBmYWxzZTtcbiAgICB2YXIgY29udGVudDtcbiAgICBpZiAoIXNwZWNpYWwudGVzdCh0ZXh0KSkge1xuICAgICAgYnVpbGRlci5jb2wgKz0gdGV4dC5sZW5ndGg7XG4gICAgICBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZGlzcGxheVRleHQpO1xuICAgICAgYnVpbGRlci5tYXAucHVzaChidWlsZGVyLnBvcywgYnVpbGRlci5wb3MgKyB0ZXh0Lmxlbmd0aCwgY29udGVudCk7XG4gICAgICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8IDkpIHsgbXVzdFdyYXAgPSB0cnVlOyB9XG4gICAgICBidWlsZGVyLnBvcyArPSB0ZXh0Lmxlbmd0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgICAgIHZhciBwb3MgPSAwO1xuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgc3BlY2lhbC5sYXN0SW5kZXggPSBwb3M7XG4gICAgICAgIHZhciBtID0gc3BlY2lhbC5leGVjKHRleHQpO1xuICAgICAgICB2YXIgc2tpcHBlZCA9IG0gPyBtLmluZGV4IC0gcG9zIDogdGV4dC5sZW5ndGggLSBwb3M7XG4gICAgICAgIGlmIChza2lwcGVkKSB7XG4gICAgICAgICAgdmFyIHR4dCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGRpc3BsYXlUZXh0LnNsaWNlKHBvcywgcG9zICsgc2tpcHBlZCkpO1xuICAgICAgICAgIGlmIChpZSAmJiBpZV92ZXJzaW9uIDwgOSkgeyBjb250ZW50LmFwcGVuZENoaWxkKGVsdChcInNwYW5cIiwgW3R4dF0pKTsgfVxuICAgICAgICAgIGVsc2UgeyBjb250ZW50LmFwcGVuZENoaWxkKHR4dCk7IH1cbiAgICAgICAgICBidWlsZGVyLm1hcC5wdXNoKGJ1aWxkZXIucG9zLCBidWlsZGVyLnBvcyArIHNraXBwZWQsIHR4dCk7XG4gICAgICAgICAgYnVpbGRlci5jb2wgKz0gc2tpcHBlZDtcbiAgICAgICAgICBidWlsZGVyLnBvcyArPSBza2lwcGVkO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbSkgeyBicmVhayB9XG4gICAgICAgIHBvcyArPSBza2lwcGVkICsgMTtcbiAgICAgICAgdmFyIHR4dCQxID0gKHZvaWQgMCk7XG4gICAgICAgIGlmIChtWzBdID09IFwiXFx0XCIpIHtcbiAgICAgICAgICB2YXIgdGFiU2l6ZSA9IGJ1aWxkZXIuY20ub3B0aW9ucy50YWJTaXplLCB0YWJXaWR0aCA9IHRhYlNpemUgLSBidWlsZGVyLmNvbCAlIHRhYlNpemU7XG4gICAgICAgICAgdHh0JDEgPSBjb250ZW50LmFwcGVuZENoaWxkKGVsdChcInNwYW5cIiwgc3BhY2VTdHIodGFiV2lkdGgpLCBcImNtLXRhYlwiKSk7XG4gICAgICAgICAgdHh0JDEuc2V0QXR0cmlidXRlKFwicm9sZVwiLCBcInByZXNlbnRhdGlvblwiKTtcbiAgICAgICAgICB0eHQkMS5zZXRBdHRyaWJ1dGUoXCJjbS10ZXh0XCIsIFwiXFx0XCIpO1xuICAgICAgICAgIGJ1aWxkZXIuY29sICs9IHRhYldpZHRoO1xuICAgICAgICB9IGVsc2UgaWYgKG1bMF0gPT0gXCJcXHJcIiB8fCBtWzBdID09IFwiXFxuXCIpIHtcbiAgICAgICAgICB0eHQkMSA9IGNvbnRlbnQuYXBwZW5kQ2hpbGQoZWx0KFwic3BhblwiLCBtWzBdID09IFwiXFxyXCIgPyBcIlxcdTI0MGRcIiA6IFwiXFx1MjQyNFwiLCBcImNtLWludmFsaWRjaGFyXCIpKTtcbiAgICAgICAgICB0eHQkMS5zZXRBdHRyaWJ1dGUoXCJjbS10ZXh0XCIsIG1bMF0pO1xuICAgICAgICAgIGJ1aWxkZXIuY29sICs9IDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHh0JDEgPSBidWlsZGVyLmNtLm9wdGlvbnMuc3BlY2lhbENoYXJQbGFjZWhvbGRlcihtWzBdKTtcbiAgICAgICAgICB0eHQkMS5zZXRBdHRyaWJ1dGUoXCJjbS10ZXh0XCIsIG1bMF0pO1xuICAgICAgICAgIGlmIChpZSAmJiBpZV92ZXJzaW9uIDwgOSkgeyBjb250ZW50LmFwcGVuZENoaWxkKGVsdChcInNwYW5cIiwgW3R4dCQxXSkpOyB9XG4gICAgICAgICAgZWxzZSB7IGNvbnRlbnQuYXBwZW5kQ2hpbGQodHh0JDEpOyB9XG4gICAgICAgICAgYnVpbGRlci5jb2wgKz0gMTtcbiAgICAgICAgfVxuICAgICAgICBidWlsZGVyLm1hcC5wdXNoKGJ1aWxkZXIucG9zLCBidWlsZGVyLnBvcyArIDEsIHR4dCQxKTtcbiAgICAgICAgYnVpbGRlci5wb3MrKztcbiAgICAgIH1cbiAgICB9XG4gICAgYnVpbGRlci50cmFpbGluZ1NwYWNlID0gZGlzcGxheVRleHQuY2hhckNvZGVBdCh0ZXh0Lmxlbmd0aCAtIDEpID09IDMyO1xuICAgIGlmIChzdHlsZSB8fCBzdGFydFN0eWxlIHx8IGVuZFN0eWxlIHx8IG11c3RXcmFwIHx8IGNzcyB8fCBhdHRyaWJ1dGVzKSB7XG4gICAgICB2YXIgZnVsbFN0eWxlID0gc3R5bGUgfHwgXCJcIjtcbiAgICAgIGlmIChzdGFydFN0eWxlKSB7IGZ1bGxTdHlsZSArPSBzdGFydFN0eWxlOyB9XG4gICAgICBpZiAoZW5kU3R5bGUpIHsgZnVsbFN0eWxlICs9IGVuZFN0eWxlOyB9XG4gICAgICB2YXIgdG9rZW4gPSBlbHQoXCJzcGFuXCIsIFtjb250ZW50XSwgZnVsbFN0eWxlLCBjc3MpO1xuICAgICAgaWYgKGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgZm9yICh2YXIgYXR0ciBpbiBhdHRyaWJ1dGVzKSB7IGlmIChhdHRyaWJ1dGVzLmhhc093blByb3BlcnR5KGF0dHIpICYmIGF0dHIgIT0gXCJzdHlsZVwiICYmIGF0dHIgIT0gXCJjbGFzc1wiKVxuICAgICAgICAgIHsgdG9rZW4uc2V0QXR0cmlidXRlKGF0dHIsIGF0dHJpYnV0ZXNbYXR0cl0pOyB9IH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBidWlsZGVyLmNvbnRlbnQuYXBwZW5kQ2hpbGQodG9rZW4pXG4gICAgfVxuICAgIGJ1aWxkZXIuY29udGVudC5hcHBlbmRDaGlsZChjb250ZW50KTtcbiAgfVxuXG4gIC8vIENoYW5nZSBzb21lIHNwYWNlcyB0byBOQlNQIHRvIHByZXZlbnQgdGhlIGJyb3dzZXIgZnJvbSBjb2xsYXBzaW5nXG4gIC8vIHRyYWlsaW5nIHNwYWNlcyBhdCB0aGUgZW5kIG9mIGEgbGluZSB3aGVuIHJlbmRlcmluZyB0ZXh0IChpc3N1ZSAjMTM2MikuXG4gIGZ1bmN0aW9uIHNwbGl0U3BhY2VzKHRleHQsIHRyYWlsaW5nQmVmb3JlKSB7XG4gICAgaWYgKHRleHQubGVuZ3RoID4gMSAmJiAhLyAgLy50ZXN0KHRleHQpKSB7IHJldHVybiB0ZXh0IH1cbiAgICB2YXIgc3BhY2VCZWZvcmUgPSB0cmFpbGluZ0JlZm9yZSwgcmVzdWx0ID0gXCJcIjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjaCA9IHRleHQuY2hhckF0KGkpO1xuICAgICAgaWYgKGNoID09IFwiIFwiICYmIHNwYWNlQmVmb3JlICYmIChpID09IHRleHQubGVuZ3RoIC0gMSB8fCB0ZXh0LmNoYXJDb2RlQXQoaSArIDEpID09IDMyKSlcbiAgICAgICAgeyBjaCA9IFwiXFx1MDBhMFwiOyB9XG4gICAgICByZXN1bHQgKz0gY2g7XG4gICAgICBzcGFjZUJlZm9yZSA9IGNoID09IFwiIFwiO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvLyBXb3JrIGFyb3VuZCBub25zZW5zZSBkaW1lbnNpb25zIGJlaW5nIHJlcG9ydGVkIGZvciBzdHJldGNoZXMgb2ZcbiAgLy8gcmlnaHQtdG8tbGVmdCB0ZXh0LlxuICBmdW5jdGlvbiBidWlsZFRva2VuQmFkQmlkaShpbm5lciwgb3JkZXIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGJ1aWxkZXIsIHRleHQsIHN0eWxlLCBzdGFydFN0eWxlLCBlbmRTdHlsZSwgY3NzLCBhdHRyaWJ1dGVzKSB7XG4gICAgICBzdHlsZSA9IHN0eWxlID8gc3R5bGUgKyBcIiBjbS1mb3JjZS1ib3JkZXJcIiA6IFwiY20tZm9yY2UtYm9yZGVyXCI7XG4gICAgICB2YXIgc3RhcnQgPSBidWlsZGVyLnBvcywgZW5kID0gc3RhcnQgKyB0ZXh0Lmxlbmd0aDtcbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgLy8gRmluZCB0aGUgcGFydCB0aGF0IG92ZXJsYXBzIHdpdGggdGhlIHN0YXJ0IG9mIHRoaXMgdGV4dFxuICAgICAgICB2YXIgcGFydCA9ICh2b2lkIDApO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9yZGVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgcGFydCA9IG9yZGVyW2ldO1xuICAgICAgICAgIGlmIChwYXJ0LnRvID4gc3RhcnQgJiYgcGFydC5mcm9tIDw9IHN0YXJ0KSB7IGJyZWFrIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFydC50byA+PSBlbmQpIHsgcmV0dXJuIGlubmVyKGJ1aWxkZXIsIHRleHQsIHN0eWxlLCBzdGFydFN0eWxlLCBlbmRTdHlsZSwgY3NzLCBhdHRyaWJ1dGVzKSB9XG4gICAgICAgIGlubmVyKGJ1aWxkZXIsIHRleHQuc2xpY2UoMCwgcGFydC50byAtIHN0YXJ0KSwgc3R5bGUsIHN0YXJ0U3R5bGUsIG51bGwsIGNzcywgYXR0cmlidXRlcyk7XG4gICAgICAgIHN0YXJ0U3R5bGUgPSBudWxsO1xuICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZShwYXJ0LnRvIC0gc3RhcnQpO1xuICAgICAgICBzdGFydCA9IHBhcnQudG87XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gYnVpbGRDb2xsYXBzZWRTcGFuKGJ1aWxkZXIsIHNpemUsIG1hcmtlciwgaWdub3JlV2lkZ2V0KSB7XG4gICAgdmFyIHdpZGdldCA9ICFpZ25vcmVXaWRnZXQgJiYgbWFya2VyLndpZGdldE5vZGU7XG4gICAgaWYgKHdpZGdldCkgeyBidWlsZGVyLm1hcC5wdXNoKGJ1aWxkZXIucG9zLCBidWlsZGVyLnBvcyArIHNpemUsIHdpZGdldCk7IH1cbiAgICBpZiAoIWlnbm9yZVdpZGdldCAmJiBidWlsZGVyLmNtLmRpc3BsYXkuaW5wdXQubmVlZHNDb250ZW50QXR0cmlidXRlKSB7XG4gICAgICBpZiAoIXdpZGdldClcbiAgICAgICAgeyB3aWRnZXQgPSBidWlsZGVyLmNvbnRlbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpOyB9XG4gICAgICB3aWRnZXQuc2V0QXR0cmlidXRlKFwiY20tbWFya2VyXCIsIG1hcmtlci5pZCk7XG4gICAgfVxuICAgIGlmICh3aWRnZXQpIHtcbiAgICAgIGJ1aWxkZXIuY20uZGlzcGxheS5pbnB1dC5zZXRVbmVkaXRhYmxlKHdpZGdldCk7XG4gICAgICBidWlsZGVyLmNvbnRlbnQuYXBwZW5kQ2hpbGQod2lkZ2V0KTtcbiAgICB9XG4gICAgYnVpbGRlci5wb3MgKz0gc2l6ZTtcbiAgICBidWlsZGVyLnRyYWlsaW5nU3BhY2UgPSBmYWxzZTtcbiAgfVxuXG4gIC8vIE91dHB1dHMgYSBudW1iZXIgb2Ygc3BhbnMgdG8gbWFrZSB1cCBhIGxpbmUsIHRha2luZyBoaWdobGlnaHRpbmdcbiAgLy8gYW5kIG1hcmtlZCB0ZXh0IGludG8gYWNjb3VudC5cbiAgZnVuY3Rpb24gaW5zZXJ0TGluZUNvbnRlbnQobGluZSwgYnVpbGRlciwgc3R5bGVzKSB7XG4gICAgdmFyIHNwYW5zID0gbGluZS5tYXJrZWRTcGFucywgYWxsVGV4dCA9IGxpbmUudGV4dCwgYXQgPSAwO1xuICAgIGlmICghc3BhbnMpIHtcbiAgICAgIGZvciAodmFyIGkkMSA9IDE7IGkkMSA8IHN0eWxlcy5sZW5ndGg7IGkkMSs9MilcbiAgICAgICAgeyBidWlsZGVyLmFkZFRva2VuKGJ1aWxkZXIsIGFsbFRleHQuc2xpY2UoYXQsIGF0ID0gc3R5bGVzW2kkMV0pLCBpbnRlcnByZXRUb2tlblN0eWxlKHN0eWxlc1tpJDErMV0sIGJ1aWxkZXIuY20ub3B0aW9ucykpOyB9XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB2YXIgbGVuID0gYWxsVGV4dC5sZW5ndGgsIHBvcyA9IDAsIGkgPSAxLCB0ZXh0ID0gXCJcIiwgc3R5bGUsIGNzcztcbiAgICB2YXIgbmV4dENoYW5nZSA9IDAsIHNwYW5TdHlsZSwgc3BhbkVuZFN0eWxlLCBzcGFuU3RhcnRTdHlsZSwgY29sbGFwc2VkLCBhdHRyaWJ1dGVzO1xuICAgIGZvciAoOzspIHtcbiAgICAgIGlmIChuZXh0Q2hhbmdlID09IHBvcykgeyAvLyBVcGRhdGUgY3VycmVudCBtYXJrZXIgc2V0XG4gICAgICAgIHNwYW5TdHlsZSA9IHNwYW5FbmRTdHlsZSA9IHNwYW5TdGFydFN0eWxlID0gY3NzID0gXCJcIjtcbiAgICAgICAgYXR0cmlidXRlcyA9IG51bGw7XG4gICAgICAgIGNvbGxhcHNlZCA9IG51bGw7IG5leHRDaGFuZ2UgPSBJbmZpbml0eTtcbiAgICAgICAgdmFyIGZvdW5kQm9va21hcmtzID0gW10sIGVuZFN0eWxlcyA9ICh2b2lkIDApO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHNwYW5zLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgdmFyIHNwID0gc3BhbnNbal0sIG0gPSBzcC5tYXJrZXI7XG4gICAgICAgICAgaWYgKG0udHlwZSA9PSBcImJvb2ttYXJrXCIgJiYgc3AuZnJvbSA9PSBwb3MgJiYgbS53aWRnZXROb2RlKSB7XG4gICAgICAgICAgICBmb3VuZEJvb2ttYXJrcy5wdXNoKG0pO1xuICAgICAgICAgIH0gZWxzZSBpZiAoc3AuZnJvbSA8PSBwb3MgJiYgKHNwLnRvID09IG51bGwgfHwgc3AudG8gPiBwb3MgfHwgbS5jb2xsYXBzZWQgJiYgc3AudG8gPT0gcG9zICYmIHNwLmZyb20gPT0gcG9zKSkge1xuICAgICAgICAgICAgaWYgKHNwLnRvICE9IG51bGwgJiYgc3AudG8gIT0gcG9zICYmIG5leHRDaGFuZ2UgPiBzcC50bykge1xuICAgICAgICAgICAgICBuZXh0Q2hhbmdlID0gc3AudG87XG4gICAgICAgICAgICAgIHNwYW5FbmRTdHlsZSA9IFwiXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobS5jbGFzc05hbWUpIHsgc3BhblN0eWxlICs9IFwiIFwiICsgbS5jbGFzc05hbWU7IH1cbiAgICAgICAgICAgIGlmIChtLmNzcykgeyBjc3MgPSAoY3NzID8gY3NzICsgXCI7XCIgOiBcIlwiKSArIG0uY3NzOyB9XG4gICAgICAgICAgICBpZiAobS5zdGFydFN0eWxlICYmIHNwLmZyb20gPT0gcG9zKSB7IHNwYW5TdGFydFN0eWxlICs9IFwiIFwiICsgbS5zdGFydFN0eWxlOyB9XG4gICAgICAgICAgICBpZiAobS5lbmRTdHlsZSAmJiBzcC50byA9PSBuZXh0Q2hhbmdlKSB7IChlbmRTdHlsZXMgfHwgKGVuZFN0eWxlcyA9IFtdKSkucHVzaChtLmVuZFN0eWxlLCBzcC50byk7IH1cbiAgICAgICAgICAgIC8vIHN1cHBvcnQgZm9yIHRoZSBvbGQgdGl0bGUgcHJvcGVydHlcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL0NvZGVNaXJyb3IvcHVsbC81NjczXG4gICAgICAgICAgICBpZiAobS50aXRsZSkgeyAoYXR0cmlidXRlcyB8fCAoYXR0cmlidXRlcyA9IHt9KSkudGl0bGUgPSBtLnRpdGxlOyB9XG4gICAgICAgICAgICBpZiAobS5hdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICAgIGZvciAodmFyIGF0dHIgaW4gbS5hdHRyaWJ1dGVzKVxuICAgICAgICAgICAgICAgIHsgKGF0dHJpYnV0ZXMgfHwgKGF0dHJpYnV0ZXMgPSB7fSkpW2F0dHJdID0gbS5hdHRyaWJ1dGVzW2F0dHJdOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobS5jb2xsYXBzZWQgJiYgKCFjb2xsYXBzZWQgfHwgY29tcGFyZUNvbGxhcHNlZE1hcmtlcnMoY29sbGFwc2VkLm1hcmtlciwgbSkgPCAwKSlcbiAgICAgICAgICAgICAgeyBjb2xsYXBzZWQgPSBzcDsgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoc3AuZnJvbSA+IHBvcyAmJiBuZXh0Q2hhbmdlID4gc3AuZnJvbSkge1xuICAgICAgICAgICAgbmV4dENoYW5nZSA9IHNwLmZyb207XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChlbmRTdHlsZXMpIHsgZm9yICh2YXIgaiQxID0gMDsgaiQxIDwgZW5kU3R5bGVzLmxlbmd0aDsgaiQxICs9IDIpXG4gICAgICAgICAgeyBpZiAoZW5kU3R5bGVzW2okMSArIDFdID09IG5leHRDaGFuZ2UpIHsgc3BhbkVuZFN0eWxlICs9IFwiIFwiICsgZW5kU3R5bGVzW2okMV07IH0gfSB9XG5cbiAgICAgICAgaWYgKCFjb2xsYXBzZWQgfHwgY29sbGFwc2VkLmZyb20gPT0gcG9zKSB7IGZvciAodmFyIGokMiA9IDA7IGokMiA8IGZvdW5kQm9va21hcmtzLmxlbmd0aDsgKytqJDIpXG4gICAgICAgICAgeyBidWlsZENvbGxhcHNlZFNwYW4oYnVpbGRlciwgMCwgZm91bmRCb29rbWFya3NbaiQyXSk7IH0gfVxuICAgICAgICBpZiAoY29sbGFwc2VkICYmIChjb2xsYXBzZWQuZnJvbSB8fCAwKSA9PSBwb3MpIHtcbiAgICAgICAgICBidWlsZENvbGxhcHNlZFNwYW4oYnVpbGRlciwgKGNvbGxhcHNlZC50byA9PSBudWxsID8gbGVuICsgMSA6IGNvbGxhcHNlZC50bykgLSBwb3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlZC5tYXJrZXIsIGNvbGxhcHNlZC5mcm9tID09IG51bGwpO1xuICAgICAgICAgIGlmIChjb2xsYXBzZWQudG8gPT0gbnVsbCkgeyByZXR1cm4gfVxuICAgICAgICAgIGlmIChjb2xsYXBzZWQudG8gPT0gcG9zKSB7IGNvbGxhcHNlZCA9IGZhbHNlOyB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChwb3MgPj0gbGVuKSB7IGJyZWFrIH1cblxuICAgICAgdmFyIHVwdG8gPSBNYXRoLm1pbihsZW4sIG5leHRDaGFuZ2UpO1xuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgaWYgKHRleHQpIHtcbiAgICAgICAgICB2YXIgZW5kID0gcG9zICsgdGV4dC5sZW5ndGg7XG4gICAgICAgICAgaWYgKCFjb2xsYXBzZWQpIHtcbiAgICAgICAgICAgIHZhciB0b2tlblRleHQgPSBlbmQgPiB1cHRvID8gdGV4dC5zbGljZSgwLCB1cHRvIC0gcG9zKSA6IHRleHQ7XG4gICAgICAgICAgICBidWlsZGVyLmFkZFRva2VuKGJ1aWxkZXIsIHRva2VuVGV4dCwgc3R5bGUgPyBzdHlsZSArIHNwYW5TdHlsZSA6IHNwYW5TdHlsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhblN0YXJ0U3R5bGUsIHBvcyArIHRva2VuVGV4dC5sZW5ndGggPT0gbmV4dENoYW5nZSA/IHNwYW5FbmRTdHlsZSA6IFwiXCIsIGNzcywgYXR0cmlidXRlcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChlbmQgPj0gdXB0bykge3RleHQgPSB0ZXh0LnNsaWNlKHVwdG8gLSBwb3MpOyBwb3MgPSB1cHRvOyBicmVha31cbiAgICAgICAgICBwb3MgPSBlbmQ7XG4gICAgICAgICAgc3BhblN0YXJ0U3R5bGUgPSBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIHRleHQgPSBhbGxUZXh0LnNsaWNlKGF0LCBhdCA9IHN0eWxlc1tpKytdKTtcbiAgICAgICAgc3R5bGUgPSBpbnRlcnByZXRUb2tlblN0eWxlKHN0eWxlc1tpKytdLCBidWlsZGVyLmNtLm9wdGlvbnMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG5cbiAgLy8gVGhlc2Ugb2JqZWN0cyBhcmUgdXNlZCB0byByZXByZXNlbnQgdGhlIHZpc2libGUgKGN1cnJlbnRseSBkcmF3bilcbiAgLy8gcGFydCBvZiB0aGUgZG9jdW1lbnQuIEEgTGluZVZpZXcgbWF5IGNvcnJlc3BvbmQgdG8gbXVsdGlwbGVcbiAgLy8gbG9naWNhbCBsaW5lcywgaWYgdGhvc2UgYXJlIGNvbm5lY3RlZCBieSBjb2xsYXBzZWQgcmFuZ2VzLlxuICBmdW5jdGlvbiBMaW5lVmlldyhkb2MsIGxpbmUsIGxpbmVOKSB7XG4gICAgLy8gVGhlIHN0YXJ0aW5nIGxpbmVcbiAgICB0aGlzLmxpbmUgPSBsaW5lO1xuICAgIC8vIENvbnRpbnVpbmcgbGluZXMsIGlmIGFueVxuICAgIHRoaXMucmVzdCA9IHZpc3VhbExpbmVDb250aW51ZWQobGluZSk7XG4gICAgLy8gTnVtYmVyIG9mIGxvZ2ljYWwgbGluZXMgaW4gdGhpcyB2aXN1YWwgbGluZVxuICAgIHRoaXMuc2l6ZSA9IHRoaXMucmVzdCA/IGxpbmVObyhsc3QodGhpcy5yZXN0KSkgLSBsaW5lTiArIDEgOiAxO1xuICAgIHRoaXMubm9kZSA9IHRoaXMudGV4dCA9IG51bGw7XG4gICAgdGhpcy5oaWRkZW4gPSBsaW5lSXNIaWRkZW4oZG9jLCBsaW5lKTtcbiAgfVxuXG4gIC8vIENyZWF0ZSBhIHJhbmdlIG9mIExpbmVWaWV3IG9iamVjdHMgZm9yIHRoZSBnaXZlbiBsaW5lcy5cbiAgZnVuY3Rpb24gYnVpbGRWaWV3QXJyYXkoY20sIGZyb20sIHRvKSB7XG4gICAgdmFyIGFycmF5ID0gW10sIG5leHRQb3M7XG4gICAgZm9yICh2YXIgcG9zID0gZnJvbTsgcG9zIDwgdG87IHBvcyA9IG5leHRQb3MpIHtcbiAgICAgIHZhciB2aWV3ID0gbmV3IExpbmVWaWV3KGNtLmRvYywgZ2V0TGluZShjbS5kb2MsIHBvcyksIHBvcyk7XG4gICAgICBuZXh0UG9zID0gcG9zICsgdmlldy5zaXplO1xuICAgICAgYXJyYXkucHVzaCh2aWV3KTtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5XG4gIH1cblxuICB2YXIgb3BlcmF0aW9uR3JvdXAgPSBudWxsO1xuXG4gIGZ1bmN0aW9uIHB1c2hPcGVyYXRpb24ob3ApIHtcbiAgICBpZiAob3BlcmF0aW9uR3JvdXApIHtcbiAgICAgIG9wZXJhdGlvbkdyb3VwLm9wcy5wdXNoKG9wKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3Aub3duc0dyb3VwID0gb3BlcmF0aW9uR3JvdXAgPSB7XG4gICAgICAgIG9wczogW29wXSxcbiAgICAgICAgZGVsYXllZENhbGxiYWNrczogW11cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZmlyZUNhbGxiYWNrc0Zvck9wcyhncm91cCkge1xuICAgIC8vIENhbGxzIGRlbGF5ZWQgY2FsbGJhY2tzIGFuZCBjdXJzb3JBY3Rpdml0eSBoYW5kbGVycyB1bnRpbCBub1xuICAgIC8vIG5ldyBvbmVzIGFwcGVhclxuICAgIHZhciBjYWxsYmFja3MgPSBncm91cC5kZWxheWVkQ2FsbGJhY2tzLCBpID0gMDtcbiAgICBkbyB7XG4gICAgICBmb3IgKDsgaSA8IGNhbGxiYWNrcy5sZW5ndGg7IGkrKylcbiAgICAgICAgeyBjYWxsYmFja3NbaV0uY2FsbChudWxsKTsgfVxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBncm91cC5vcHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIG9wID0gZ3JvdXAub3BzW2pdO1xuICAgICAgICBpZiAob3AuY3Vyc29yQWN0aXZpdHlIYW5kbGVycylcbiAgICAgICAgICB7IHdoaWxlIChvcC5jdXJzb3JBY3Rpdml0eUNhbGxlZCA8IG9wLmN1cnNvckFjdGl2aXR5SGFuZGxlcnMubGVuZ3RoKVxuICAgICAgICAgICAgeyBvcC5jdXJzb3JBY3Rpdml0eUhhbmRsZXJzW29wLmN1cnNvckFjdGl2aXR5Q2FsbGVkKytdLmNhbGwobnVsbCwgb3AuY20pOyB9IH1cbiAgICAgIH1cbiAgICB9IHdoaWxlIChpIDwgY2FsbGJhY2tzLmxlbmd0aClcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmlzaE9wZXJhdGlvbihvcCwgZW5kQ2IpIHtcbiAgICB2YXIgZ3JvdXAgPSBvcC5vd25zR3JvdXA7XG4gICAgaWYgKCFncm91cCkgeyByZXR1cm4gfVxuXG4gICAgdHJ5IHsgZmlyZUNhbGxiYWNrc0Zvck9wcyhncm91cCk7IH1cbiAgICBmaW5hbGx5IHtcbiAgICAgIG9wZXJhdGlvbkdyb3VwID0gbnVsbDtcbiAgICAgIGVuZENiKGdyb3VwKTtcbiAgICB9XG4gIH1cblxuICB2YXIgb3JwaGFuRGVsYXllZENhbGxiYWNrcyA9IG51bGw7XG5cbiAgLy8gT2Z0ZW4sIHdlIHdhbnQgdG8gc2lnbmFsIGV2ZW50cyBhdCBhIHBvaW50IHdoZXJlIHdlIGFyZSBpbiB0aGVcbiAgLy8gbWlkZGxlIG9mIHNvbWUgd29yaywgYnV0IGRvbid0IHdhbnQgdGhlIGhhbmRsZXIgdG8gc3RhcnQgY2FsbGluZ1xuICAvLyBvdGhlciBtZXRob2RzIG9uIHRoZSBlZGl0b3IsIHdoaWNoIG1pZ2h0IGJlIGluIGFuIGluY29uc2lzdGVudFxuICAvLyBzdGF0ZSBvciBzaW1wbHkgbm90IGV4cGVjdCBhbnkgb3RoZXIgZXZlbnRzIHRvIGhhcHBlbi5cbiAgLy8gc2lnbmFsTGF0ZXIgbG9va3Mgd2hldGhlciB0aGVyZSBhcmUgYW55IGhhbmRsZXJzLCBhbmQgc2NoZWR1bGVzXG4gIC8vIHRoZW0gdG8gYmUgZXhlY3V0ZWQgd2hlbiB0aGUgbGFzdCBvcGVyYXRpb24gZW5kcywgb3IsIGlmIG5vXG4gIC8vIG9wZXJhdGlvbiBpcyBhY3RpdmUsIHdoZW4gYSB0aW1lb3V0IGZpcmVzLlxuICBmdW5jdGlvbiBzaWduYWxMYXRlcihlbWl0dGVyLCB0eXBlIC8qLCB2YWx1ZXMuLi4qLykge1xuICAgIHZhciBhcnIgPSBnZXRIYW5kbGVycyhlbWl0dGVyLCB0eXBlKTtcbiAgICBpZiAoIWFyci5sZW5ndGgpIHsgcmV0dXJuIH1cbiAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMiksIGxpc3Q7XG4gICAgaWYgKG9wZXJhdGlvbkdyb3VwKSB7XG4gICAgICBsaXN0ID0gb3BlcmF0aW9uR3JvdXAuZGVsYXllZENhbGxiYWNrcztcbiAgICB9IGVsc2UgaWYgKG9ycGhhbkRlbGF5ZWRDYWxsYmFja3MpIHtcbiAgICAgIGxpc3QgPSBvcnBoYW5EZWxheWVkQ2FsbGJhY2tzO1xuICAgIH0gZWxzZSB7XG4gICAgICBsaXN0ID0gb3JwaGFuRGVsYXllZENhbGxiYWNrcyA9IFtdO1xuICAgICAgc2V0VGltZW91dChmaXJlT3JwaGFuRGVsYXllZCwgMCk7XG4gICAgfVxuICAgIHZhciBsb29wID0gZnVuY3Rpb24gKCBpICkge1xuICAgICAgbGlzdC5wdXNoKGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFycltpXS5hcHBseShudWxsLCBhcmdzKTsgfSk7XG4gICAgfTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgKytpKVxuICAgICAgbG9vcCggaSApO1xuICB9XG5cbiAgZnVuY3Rpb24gZmlyZU9ycGhhbkRlbGF5ZWQoKSB7XG4gICAgdmFyIGRlbGF5ZWQgPSBvcnBoYW5EZWxheWVkQ2FsbGJhY2tzO1xuICAgIG9ycGhhbkRlbGF5ZWRDYWxsYmFja3MgPSBudWxsO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVsYXllZC5sZW5ndGg7ICsraSkgeyBkZWxheWVkW2ldKCk7IH1cbiAgfVxuXG4gIC8vIFdoZW4gYW4gYXNwZWN0IG9mIGEgbGluZSBjaGFuZ2VzLCBhIHN0cmluZyBpcyBhZGRlZCB0b1xuICAvLyBsaW5lVmlldy5jaGFuZ2VzLiBUaGlzIHVwZGF0ZXMgdGhlIHJlbGV2YW50IHBhcnQgb2YgdGhlIGxpbmUnc1xuICAvLyBET00gc3RydWN0dXJlLlxuICBmdW5jdGlvbiB1cGRhdGVMaW5lRm9yQ2hhbmdlcyhjbSwgbGluZVZpZXcsIGxpbmVOLCBkaW1zKSB7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBsaW5lVmlldy5jaGFuZ2VzLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgdHlwZSA9IGxpbmVWaWV3LmNoYW5nZXNbal07XG4gICAgICBpZiAodHlwZSA9PSBcInRleHRcIikgeyB1cGRhdGVMaW5lVGV4dChjbSwgbGluZVZpZXcpOyB9XG4gICAgICBlbHNlIGlmICh0eXBlID09IFwiZ3V0dGVyXCIpIHsgdXBkYXRlTGluZUd1dHRlcihjbSwgbGluZVZpZXcsIGxpbmVOLCBkaW1zKTsgfVxuICAgICAgZWxzZSBpZiAodHlwZSA9PSBcImNsYXNzXCIpIHsgdXBkYXRlTGluZUNsYXNzZXMoY20sIGxpbmVWaWV3KTsgfVxuICAgICAgZWxzZSBpZiAodHlwZSA9PSBcIndpZGdldFwiKSB7IHVwZGF0ZUxpbmVXaWRnZXRzKGNtLCBsaW5lVmlldywgZGltcyk7IH1cbiAgICB9XG4gICAgbGluZVZpZXcuY2hhbmdlcyA9IG51bGw7XG4gIH1cblxuICAvLyBMaW5lcyB3aXRoIGd1dHRlciBlbGVtZW50cywgd2lkZ2V0cyBvciBhIGJhY2tncm91bmQgY2xhc3MgbmVlZCB0b1xuICAvLyBiZSB3cmFwcGVkLCBhbmQgaGF2ZSB0aGUgZXh0cmEgZWxlbWVudHMgYWRkZWQgdG8gdGhlIHdyYXBwZXIgZGl2XG4gIGZ1bmN0aW9uIGVuc3VyZUxpbmVXcmFwcGVkKGxpbmVWaWV3KSB7XG4gICAgaWYgKGxpbmVWaWV3Lm5vZGUgPT0gbGluZVZpZXcudGV4dCkge1xuICAgICAgbGluZVZpZXcubm9kZSA9IGVsdChcImRpdlwiLCBudWxsLCBudWxsLCBcInBvc2l0aW9uOiByZWxhdGl2ZVwiKTtcbiAgICAgIGlmIChsaW5lVmlldy50ZXh0LnBhcmVudE5vZGUpXG4gICAgICAgIHsgbGluZVZpZXcudGV4dC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChsaW5lVmlldy5ub2RlLCBsaW5lVmlldy50ZXh0KTsgfVxuICAgICAgbGluZVZpZXcubm9kZS5hcHBlbmRDaGlsZChsaW5lVmlldy50ZXh0KTtcbiAgICAgIGlmIChpZSAmJiBpZV92ZXJzaW9uIDwgOCkgeyBsaW5lVmlldy5ub2RlLnN0eWxlLnpJbmRleCA9IDI7IH1cbiAgICB9XG4gICAgcmV0dXJuIGxpbmVWaWV3Lm5vZGVcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUxpbmVCYWNrZ3JvdW5kKGNtLCBsaW5lVmlldykge1xuICAgIHZhciBjbHMgPSBsaW5lVmlldy5iZ0NsYXNzID8gbGluZVZpZXcuYmdDbGFzcyArIFwiIFwiICsgKGxpbmVWaWV3LmxpbmUuYmdDbGFzcyB8fCBcIlwiKSA6IGxpbmVWaWV3LmxpbmUuYmdDbGFzcztcbiAgICBpZiAoY2xzKSB7IGNscyArPSBcIiBDb2RlTWlycm9yLWxpbmViYWNrZ3JvdW5kXCI7IH1cbiAgICBpZiAobGluZVZpZXcuYmFja2dyb3VuZCkge1xuICAgICAgaWYgKGNscykgeyBsaW5lVmlldy5iYWNrZ3JvdW5kLmNsYXNzTmFtZSA9IGNsczsgfVxuICAgICAgZWxzZSB7IGxpbmVWaWV3LmJhY2tncm91bmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChsaW5lVmlldy5iYWNrZ3JvdW5kKTsgbGluZVZpZXcuYmFja2dyb3VuZCA9IG51bGw7IH1cbiAgICB9IGVsc2UgaWYgKGNscykge1xuICAgICAgdmFyIHdyYXAgPSBlbnN1cmVMaW5lV3JhcHBlZChsaW5lVmlldyk7XG4gICAgICBsaW5lVmlldy5iYWNrZ3JvdW5kID0gd3JhcC5pbnNlcnRCZWZvcmUoZWx0KFwiZGl2XCIsIG51bGwsIGNscyksIHdyYXAuZmlyc3RDaGlsZCk7XG4gICAgICBjbS5kaXNwbGF5LmlucHV0LnNldFVuZWRpdGFibGUobGluZVZpZXcuYmFja2dyb3VuZCk7XG4gICAgfVxuICB9XG5cbiAgLy8gV3JhcHBlciBhcm91bmQgYnVpbGRMaW5lQ29udGVudCB3aGljaCB3aWxsIHJldXNlIHRoZSBzdHJ1Y3R1cmVcbiAgLy8gaW4gZGlzcGxheS5leHRlcm5hbE1lYXN1cmVkIHdoZW4gcG9zc2libGUuXG4gIGZ1bmN0aW9uIGdldExpbmVDb250ZW50KGNtLCBsaW5lVmlldykge1xuICAgIHZhciBleHQgPSBjbS5kaXNwbGF5LmV4dGVybmFsTWVhc3VyZWQ7XG4gICAgaWYgKGV4dCAmJiBleHQubGluZSA9PSBsaW5lVmlldy5saW5lKSB7XG4gICAgICBjbS5kaXNwbGF5LmV4dGVybmFsTWVhc3VyZWQgPSBudWxsO1xuICAgICAgbGluZVZpZXcubWVhc3VyZSA9IGV4dC5tZWFzdXJlO1xuICAgICAgcmV0dXJuIGV4dC5idWlsdFxuICAgIH1cbiAgICByZXR1cm4gYnVpbGRMaW5lQ29udGVudChjbSwgbGluZVZpZXcpXG4gIH1cblxuICAvLyBSZWRyYXcgdGhlIGxpbmUncyB0ZXh0LiBJbnRlcmFjdHMgd2l0aCB0aGUgYmFja2dyb3VuZCBhbmQgdGV4dFxuICAvLyBjbGFzc2VzIGJlY2F1c2UgdGhlIG1vZGUgbWF5IG91dHB1dCB0b2tlbnMgdGhhdCBpbmZsdWVuY2UgdGhlc2VcbiAgLy8gY2xhc3Nlcy5cbiAgZnVuY3Rpb24gdXBkYXRlTGluZVRleHQoY20sIGxpbmVWaWV3KSB7XG4gICAgdmFyIGNscyA9IGxpbmVWaWV3LnRleHQuY2xhc3NOYW1lO1xuICAgIHZhciBidWlsdCA9IGdldExpbmVDb250ZW50KGNtLCBsaW5lVmlldyk7XG4gICAgaWYgKGxpbmVWaWV3LnRleHQgPT0gbGluZVZpZXcubm9kZSkgeyBsaW5lVmlldy5ub2RlID0gYnVpbHQucHJlOyB9XG4gICAgbGluZVZpZXcudGV4dC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChidWlsdC5wcmUsIGxpbmVWaWV3LnRleHQpO1xuICAgIGxpbmVWaWV3LnRleHQgPSBidWlsdC5wcmU7XG4gICAgaWYgKGJ1aWx0LmJnQ2xhc3MgIT0gbGluZVZpZXcuYmdDbGFzcyB8fCBidWlsdC50ZXh0Q2xhc3MgIT0gbGluZVZpZXcudGV4dENsYXNzKSB7XG4gICAgICBsaW5lVmlldy5iZ0NsYXNzID0gYnVpbHQuYmdDbGFzcztcbiAgICAgIGxpbmVWaWV3LnRleHRDbGFzcyA9IGJ1aWx0LnRleHRDbGFzcztcbiAgICAgIHVwZGF0ZUxpbmVDbGFzc2VzKGNtLCBsaW5lVmlldyk7XG4gICAgfSBlbHNlIGlmIChjbHMpIHtcbiAgICAgIGxpbmVWaWV3LnRleHQuY2xhc3NOYW1lID0gY2xzO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUxpbmVDbGFzc2VzKGNtLCBsaW5lVmlldykge1xuICAgIHVwZGF0ZUxpbmVCYWNrZ3JvdW5kKGNtLCBsaW5lVmlldyk7XG4gICAgaWYgKGxpbmVWaWV3LmxpbmUud3JhcENsYXNzKVxuICAgICAgeyBlbnN1cmVMaW5lV3JhcHBlZChsaW5lVmlldykuY2xhc3NOYW1lID0gbGluZVZpZXcubGluZS53cmFwQ2xhc3M7IH1cbiAgICBlbHNlIGlmIChsaW5lVmlldy5ub2RlICE9IGxpbmVWaWV3LnRleHQpXG4gICAgICB7IGxpbmVWaWV3Lm5vZGUuY2xhc3NOYW1lID0gXCJcIjsgfVxuICAgIHZhciB0ZXh0Q2xhc3MgPSBsaW5lVmlldy50ZXh0Q2xhc3MgPyBsaW5lVmlldy50ZXh0Q2xhc3MgKyBcIiBcIiArIChsaW5lVmlldy5saW5lLnRleHRDbGFzcyB8fCBcIlwiKSA6IGxpbmVWaWV3LmxpbmUudGV4dENsYXNzO1xuICAgIGxpbmVWaWV3LnRleHQuY2xhc3NOYW1lID0gdGV4dENsYXNzIHx8IFwiXCI7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVMaW5lR3V0dGVyKGNtLCBsaW5lVmlldywgbGluZU4sIGRpbXMpIHtcbiAgICBpZiAobGluZVZpZXcuZ3V0dGVyKSB7XG4gICAgICBsaW5lVmlldy5ub2RlLnJlbW92ZUNoaWxkKGxpbmVWaWV3Lmd1dHRlcik7XG4gICAgICBsaW5lVmlldy5ndXR0ZXIgPSBudWxsO1xuICAgIH1cbiAgICBpZiAobGluZVZpZXcuZ3V0dGVyQmFja2dyb3VuZCkge1xuICAgICAgbGluZVZpZXcubm9kZS5yZW1vdmVDaGlsZChsaW5lVmlldy5ndXR0ZXJCYWNrZ3JvdW5kKTtcbiAgICAgIGxpbmVWaWV3Lmd1dHRlckJhY2tncm91bmQgPSBudWxsO1xuICAgIH1cbiAgICBpZiAobGluZVZpZXcubGluZS5ndXR0ZXJDbGFzcykge1xuICAgICAgdmFyIHdyYXAgPSBlbnN1cmVMaW5lV3JhcHBlZChsaW5lVmlldyk7XG4gICAgICBsaW5lVmlldy5ndXR0ZXJCYWNrZ3JvdW5kID0gZWx0KFwiZGl2XCIsIG51bGwsIFwiQ29kZU1pcnJvci1ndXR0ZXItYmFja2dyb3VuZCBcIiArIGxpbmVWaWV3LmxpbmUuZ3V0dGVyQ2xhc3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChcImxlZnQ6IFwiICsgKGNtLm9wdGlvbnMuZml4ZWRHdXR0ZXIgPyBkaW1zLmZpeGVkUG9zIDogLWRpbXMuZ3V0dGVyVG90YWxXaWR0aCkgKyBcInB4OyB3aWR0aDogXCIgKyAoZGltcy5ndXR0ZXJUb3RhbFdpZHRoKSArIFwicHhcIikpO1xuICAgICAgY20uZGlzcGxheS5pbnB1dC5zZXRVbmVkaXRhYmxlKGxpbmVWaWV3Lmd1dHRlckJhY2tncm91bmQpO1xuICAgICAgd3JhcC5pbnNlcnRCZWZvcmUobGluZVZpZXcuZ3V0dGVyQmFja2dyb3VuZCwgbGluZVZpZXcudGV4dCk7XG4gICAgfVxuICAgIHZhciBtYXJrZXJzID0gbGluZVZpZXcubGluZS5ndXR0ZXJNYXJrZXJzO1xuICAgIGlmIChjbS5vcHRpb25zLmxpbmVOdW1iZXJzIHx8IG1hcmtlcnMpIHtcbiAgICAgIHZhciB3cmFwJDEgPSBlbnN1cmVMaW5lV3JhcHBlZChsaW5lVmlldyk7XG4gICAgICB2YXIgZ3V0dGVyV3JhcCA9IGxpbmVWaWV3Lmd1dHRlciA9IGVsdChcImRpdlwiLCBudWxsLCBcIkNvZGVNaXJyb3ItZ3V0dGVyLXdyYXBwZXJcIiwgKFwibGVmdDogXCIgKyAoY20ub3B0aW9ucy5maXhlZEd1dHRlciA/IGRpbXMuZml4ZWRQb3MgOiAtZGltcy5ndXR0ZXJUb3RhbFdpZHRoKSArIFwicHhcIikpO1xuICAgICAgZ3V0dGVyV3JhcC5zZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiLCBcInRydWVcIik7XG4gICAgICBjbS5kaXNwbGF5LmlucHV0LnNldFVuZWRpdGFibGUoZ3V0dGVyV3JhcCk7XG4gICAgICB3cmFwJDEuaW5zZXJ0QmVmb3JlKGd1dHRlcldyYXAsIGxpbmVWaWV3LnRleHQpO1xuICAgICAgaWYgKGxpbmVWaWV3LmxpbmUuZ3V0dGVyQ2xhc3MpXG4gICAgICAgIHsgZ3V0dGVyV3JhcC5jbGFzc05hbWUgKz0gXCIgXCIgKyBsaW5lVmlldy5saW5lLmd1dHRlckNsYXNzOyB9XG4gICAgICBpZiAoY20ub3B0aW9ucy5saW5lTnVtYmVycyAmJiAoIW1hcmtlcnMgfHwgIW1hcmtlcnNbXCJDb2RlTWlycm9yLWxpbmVudW1iZXJzXCJdKSlcbiAgICAgICAgeyBsaW5lVmlldy5saW5lTnVtYmVyID0gZ3V0dGVyV3JhcC5hcHBlbmRDaGlsZChcbiAgICAgICAgICBlbHQoXCJkaXZcIiwgbGluZU51bWJlckZvcihjbS5vcHRpb25zLCBsaW5lTiksXG4gICAgICAgICAgICAgIFwiQ29kZU1pcnJvci1saW5lbnVtYmVyIENvZGVNaXJyb3ItZ3V0dGVyLWVsdFwiLFxuICAgICAgICAgICAgICAoXCJsZWZ0OiBcIiArIChkaW1zLmd1dHRlckxlZnRbXCJDb2RlTWlycm9yLWxpbmVudW1iZXJzXCJdKSArIFwicHg7IHdpZHRoOiBcIiArIChjbS5kaXNwbGF5LmxpbmVOdW1Jbm5lcldpZHRoKSArIFwicHhcIikpKTsgfVxuICAgICAgaWYgKG1hcmtlcnMpIHsgZm9yICh2YXIgayA9IDA7IGsgPCBjbS5kaXNwbGF5Lmd1dHRlclNwZWNzLmxlbmd0aDsgKytrKSB7XG4gICAgICAgIHZhciBpZCA9IGNtLmRpc3BsYXkuZ3V0dGVyU3BlY3Nba10uY2xhc3NOYW1lLCBmb3VuZCA9IG1hcmtlcnMuaGFzT3duUHJvcGVydHkoaWQpICYmIG1hcmtlcnNbaWRdO1xuICAgICAgICBpZiAoZm91bmQpXG4gICAgICAgICAgeyBndXR0ZXJXcmFwLmFwcGVuZENoaWxkKGVsdChcImRpdlwiLCBbZm91bmRdLCBcIkNvZGVNaXJyb3ItZ3V0dGVyLWVsdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChcImxlZnQ6IFwiICsgKGRpbXMuZ3V0dGVyTGVmdFtpZF0pICsgXCJweDsgd2lkdGg6IFwiICsgKGRpbXMuZ3V0dGVyV2lkdGhbaWRdKSArIFwicHhcIikpKTsgfVxuICAgICAgfSB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlTGluZVdpZGdldHMoY20sIGxpbmVWaWV3LCBkaW1zKSB7XG4gICAgaWYgKGxpbmVWaWV3LmFsaWduYWJsZSkgeyBsaW5lVmlldy5hbGlnbmFibGUgPSBudWxsOyB9XG4gICAgdmFyIGlzV2lkZ2V0ID0gY2xhc3NUZXN0KFwiQ29kZU1pcnJvci1saW5ld2lkZ2V0XCIpO1xuICAgIGZvciAodmFyIG5vZGUgPSBsaW5lVmlldy5ub2RlLmZpcnN0Q2hpbGQsIG5leHQgPSAodm9pZCAwKTsgbm9kZTsgbm9kZSA9IG5leHQpIHtcbiAgICAgIG5leHQgPSBub2RlLm5leHRTaWJsaW5nO1xuICAgICAgaWYgKGlzV2lkZ2V0LnRlc3Qobm9kZS5jbGFzc05hbWUpKSB7IGxpbmVWaWV3Lm5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7IH1cbiAgICB9XG4gICAgaW5zZXJ0TGluZVdpZGdldHMoY20sIGxpbmVWaWV3LCBkaW1zKTtcbiAgfVxuXG4gIC8vIEJ1aWxkIGEgbGluZSdzIERPTSByZXByZXNlbnRhdGlvbiBmcm9tIHNjcmF0Y2hcbiAgZnVuY3Rpb24gYnVpbGRMaW5lRWxlbWVudChjbSwgbGluZVZpZXcsIGxpbmVOLCBkaW1zKSB7XG4gICAgdmFyIGJ1aWx0ID0gZ2V0TGluZUNvbnRlbnQoY20sIGxpbmVWaWV3KTtcbiAgICBsaW5lVmlldy50ZXh0ID0gbGluZVZpZXcubm9kZSA9IGJ1aWx0LnByZTtcbiAgICBpZiAoYnVpbHQuYmdDbGFzcykgeyBsaW5lVmlldy5iZ0NsYXNzID0gYnVpbHQuYmdDbGFzczsgfVxuICAgIGlmIChidWlsdC50ZXh0Q2xhc3MpIHsgbGluZVZpZXcudGV4dENsYXNzID0gYnVpbHQudGV4dENsYXNzOyB9XG5cbiAgICB1cGRhdGVMaW5lQ2xhc3NlcyhjbSwgbGluZVZpZXcpO1xuICAgIHVwZGF0ZUxpbmVHdXR0ZXIoY20sIGxpbmVWaWV3LCBsaW5lTiwgZGltcyk7XG4gICAgaW5zZXJ0TGluZVdpZGdldHMoY20sIGxpbmVWaWV3LCBkaW1zKTtcbiAgICByZXR1cm4gbGluZVZpZXcubm9kZVxuICB9XG5cbiAgLy8gQSBsaW5lVmlldyBtYXkgY29udGFpbiBtdWx0aXBsZSBsb2dpY2FsIGxpbmVzICh3aGVuIG1lcmdlZCBieVxuICAvLyBjb2xsYXBzZWQgc3BhbnMpLiBUaGUgd2lkZ2V0cyBmb3IgYWxsIG9mIHRoZW0gbmVlZCB0byBiZSBkcmF3bi5cbiAgZnVuY3Rpb24gaW5zZXJ0TGluZVdpZGdldHMoY20sIGxpbmVWaWV3LCBkaW1zKSB7XG4gICAgaW5zZXJ0TGluZVdpZGdldHNGb3IoY20sIGxpbmVWaWV3LmxpbmUsIGxpbmVWaWV3LCBkaW1zLCB0cnVlKTtcbiAgICBpZiAobGluZVZpZXcucmVzdCkgeyBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVWaWV3LnJlc3QubGVuZ3RoOyBpKyspXG4gICAgICB7IGluc2VydExpbmVXaWRnZXRzRm9yKGNtLCBsaW5lVmlldy5yZXN0W2ldLCBsaW5lVmlldywgZGltcywgZmFsc2UpOyB9IH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGluc2VydExpbmVXaWRnZXRzRm9yKGNtLCBsaW5lLCBsaW5lVmlldywgZGltcywgYWxsb3dBYm92ZSkge1xuICAgIGlmICghbGluZS53aWRnZXRzKSB7IHJldHVybiB9XG4gICAgdmFyIHdyYXAgPSBlbnN1cmVMaW5lV3JhcHBlZChsaW5lVmlldyk7XG4gICAgZm9yICh2YXIgaSA9IDAsIHdzID0gbGluZS53aWRnZXRzOyBpIDwgd3MubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciB3aWRnZXQgPSB3c1tpXSwgbm9kZSA9IGVsdChcImRpdlwiLCBbd2lkZ2V0Lm5vZGVdLCBcIkNvZGVNaXJyb3ItbGluZXdpZGdldFwiICsgKHdpZGdldC5jbGFzc05hbWUgPyBcIiBcIiArIHdpZGdldC5jbGFzc05hbWUgOiBcIlwiKSk7XG4gICAgICBpZiAoIXdpZGdldC5oYW5kbGVNb3VzZUV2ZW50cykgeyBub2RlLnNldEF0dHJpYnV0ZShcImNtLWlnbm9yZS1ldmVudHNcIiwgXCJ0cnVlXCIpOyB9XG4gICAgICBwb3NpdGlvbkxpbmVXaWRnZXQod2lkZ2V0LCBub2RlLCBsaW5lVmlldywgZGltcyk7XG4gICAgICBjbS5kaXNwbGF5LmlucHV0LnNldFVuZWRpdGFibGUobm9kZSk7XG4gICAgICBpZiAoYWxsb3dBYm92ZSAmJiB3aWRnZXQuYWJvdmUpXG4gICAgICAgIHsgd3JhcC5pbnNlcnRCZWZvcmUobm9kZSwgbGluZVZpZXcuZ3V0dGVyIHx8IGxpbmVWaWV3LnRleHQpOyB9XG4gICAgICBlbHNlXG4gICAgICAgIHsgd3JhcC5hcHBlbmRDaGlsZChub2RlKTsgfVxuICAgICAgc2lnbmFsTGF0ZXIod2lkZ2V0LCBcInJlZHJhd1wiKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwb3NpdGlvbkxpbmVXaWRnZXQod2lkZ2V0LCBub2RlLCBsaW5lVmlldywgZGltcykge1xuICAgIGlmICh3aWRnZXQubm9IU2Nyb2xsKSB7XG4gIChsaW5lVmlldy5hbGlnbmFibGUgfHwgKGxpbmVWaWV3LmFsaWduYWJsZSA9IFtdKSkucHVzaChub2RlKTtcbiAgICAgIHZhciB3aWR0aCA9IGRpbXMud3JhcHBlcldpZHRoO1xuICAgICAgbm9kZS5zdHlsZS5sZWZ0ID0gZGltcy5maXhlZFBvcyArIFwicHhcIjtcbiAgICAgIGlmICghd2lkZ2V0LmNvdmVyR3V0dGVyKSB7XG4gICAgICAgIHdpZHRoIC09IGRpbXMuZ3V0dGVyVG90YWxXaWR0aDtcbiAgICAgICAgbm9kZS5zdHlsZS5wYWRkaW5nTGVmdCA9IGRpbXMuZ3V0dGVyVG90YWxXaWR0aCArIFwicHhcIjtcbiAgICAgIH1cbiAgICAgIG5vZGUuc3R5bGUud2lkdGggPSB3aWR0aCArIFwicHhcIjtcbiAgICB9XG4gICAgaWYgKHdpZGdldC5jb3Zlckd1dHRlcikge1xuICAgICAgbm9kZS5zdHlsZS56SW5kZXggPSA1O1xuICAgICAgbm9kZS5zdHlsZS5wb3NpdGlvbiA9IFwicmVsYXRpdmVcIjtcbiAgICAgIGlmICghd2lkZ2V0Lm5vSFNjcm9sbCkgeyBub2RlLnN0eWxlLm1hcmdpbkxlZnQgPSAtZGltcy5ndXR0ZXJUb3RhbFdpZHRoICsgXCJweFwiOyB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gd2lkZ2V0SGVpZ2h0KHdpZGdldCkge1xuICAgIGlmICh3aWRnZXQuaGVpZ2h0ICE9IG51bGwpIHsgcmV0dXJuIHdpZGdldC5oZWlnaHQgfVxuICAgIHZhciBjbSA9IHdpZGdldC5kb2MuY207XG4gICAgaWYgKCFjbSkgeyByZXR1cm4gMCB9XG4gICAgaWYgKCFjb250YWlucyhkb2N1bWVudC5ib2R5LCB3aWRnZXQubm9kZSkpIHtcbiAgICAgIHZhciBwYXJlbnRTdHlsZSA9IFwicG9zaXRpb246IHJlbGF0aXZlO1wiO1xuICAgICAgaWYgKHdpZGdldC5jb3Zlckd1dHRlcilcbiAgICAgICAgeyBwYXJlbnRTdHlsZSArPSBcIm1hcmdpbi1sZWZ0OiAtXCIgKyBjbS5kaXNwbGF5Lmd1dHRlcnMub2Zmc2V0V2lkdGggKyBcInB4O1wiOyB9XG4gICAgICBpZiAod2lkZ2V0Lm5vSFNjcm9sbClcbiAgICAgICAgeyBwYXJlbnRTdHlsZSArPSBcIndpZHRoOiBcIiArIGNtLmRpc3BsYXkud3JhcHBlci5jbGllbnRXaWR0aCArIFwicHg7XCI7IH1cbiAgICAgIHJlbW92ZUNoaWxkcmVuQW5kQWRkKGNtLmRpc3BsYXkubWVhc3VyZSwgZWx0KFwiZGl2XCIsIFt3aWRnZXQubm9kZV0sIG51bGwsIHBhcmVudFN0eWxlKSk7XG4gICAgfVxuICAgIHJldHVybiB3aWRnZXQuaGVpZ2h0ID0gd2lkZ2V0Lm5vZGUucGFyZW50Tm9kZS5vZmZzZXRIZWlnaHRcbiAgfVxuXG4gIC8vIFJldHVybiB0cnVlIHdoZW4gdGhlIGdpdmVuIG1vdXNlIGV2ZW50IGhhcHBlbmVkIGluIGEgd2lkZ2V0XG4gIGZ1bmN0aW9uIGV2ZW50SW5XaWRnZXQoZGlzcGxheSwgZSkge1xuICAgIGZvciAodmFyIG4gPSBlX3RhcmdldChlKTsgbiAhPSBkaXNwbGF5LndyYXBwZXI7IG4gPSBuLnBhcmVudE5vZGUpIHtcbiAgICAgIGlmICghbiB8fCAobi5ub2RlVHlwZSA9PSAxICYmIG4uZ2V0QXR0cmlidXRlKFwiY20taWdub3JlLWV2ZW50c1wiKSA9PSBcInRydWVcIikgfHxcbiAgICAgICAgICAobi5wYXJlbnROb2RlID09IGRpc3BsYXkuc2l6ZXIgJiYgbiAhPSBkaXNwbGF5Lm1vdmVyKSlcbiAgICAgICAgeyByZXR1cm4gdHJ1ZSB9XG4gICAgfVxuICB9XG5cbiAgLy8gUE9TSVRJT04gTUVBU1VSRU1FTlRcblxuICBmdW5jdGlvbiBwYWRkaW5nVG9wKGRpc3BsYXkpIHtyZXR1cm4gZGlzcGxheS5saW5lU3BhY2Uub2Zmc2V0VG9wfVxuICBmdW5jdGlvbiBwYWRkaW5nVmVydChkaXNwbGF5KSB7cmV0dXJuIGRpc3BsYXkubW92ZXIub2Zmc2V0SGVpZ2h0IC0gZGlzcGxheS5saW5lU3BhY2Uub2Zmc2V0SGVpZ2h0fVxuICBmdW5jdGlvbiBwYWRkaW5nSChkaXNwbGF5KSB7XG4gICAgaWYgKGRpc3BsYXkuY2FjaGVkUGFkZGluZ0gpIHsgcmV0dXJuIGRpc3BsYXkuY2FjaGVkUGFkZGluZ0ggfVxuICAgIHZhciBlID0gcmVtb3ZlQ2hpbGRyZW5BbmRBZGQoZGlzcGxheS5tZWFzdXJlLCBlbHQoXCJwcmVcIiwgXCJ4XCIsIFwiQ29kZU1pcnJvci1saW5lLWxpa2VcIikpO1xuICAgIHZhciBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlID8gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZSkgOiBlLmN1cnJlbnRTdHlsZTtcbiAgICB2YXIgZGF0YSA9IHtsZWZ0OiBwYXJzZUludChzdHlsZS5wYWRkaW5nTGVmdCksIHJpZ2h0OiBwYXJzZUludChzdHlsZS5wYWRkaW5nUmlnaHQpfTtcbiAgICBpZiAoIWlzTmFOKGRhdGEubGVmdCkgJiYgIWlzTmFOKGRhdGEucmlnaHQpKSB7IGRpc3BsYXkuY2FjaGVkUGFkZGluZ0ggPSBkYXRhOyB9XG4gICAgcmV0dXJuIGRhdGFcbiAgfVxuXG4gIGZ1bmN0aW9uIHNjcm9sbEdhcChjbSkgeyByZXR1cm4gc2Nyb2xsZXJHYXAgLSBjbS5kaXNwbGF5Lm5hdGl2ZUJhcldpZHRoIH1cbiAgZnVuY3Rpb24gZGlzcGxheVdpZHRoKGNtKSB7XG4gICAgcmV0dXJuIGNtLmRpc3BsYXkuc2Nyb2xsZXIuY2xpZW50V2lkdGggLSBzY3JvbGxHYXAoY20pIC0gY20uZGlzcGxheS5iYXJXaWR0aFxuICB9XG4gIGZ1bmN0aW9uIGRpc3BsYXlIZWlnaHQoY20pIHtcbiAgICByZXR1cm4gY20uZGlzcGxheS5zY3JvbGxlci5jbGllbnRIZWlnaHQgLSBzY3JvbGxHYXAoY20pIC0gY20uZGlzcGxheS5iYXJIZWlnaHRcbiAgfVxuXG4gIC8vIEVuc3VyZSB0aGUgbGluZVZpZXcud3JhcHBpbmcuaGVpZ2h0cyBhcnJheSBpcyBwb3B1bGF0ZWQuIFRoaXMgaXNcbiAgLy8gYW4gYXJyYXkgb2YgYm90dG9tIG9mZnNldHMgZm9yIHRoZSBsaW5lcyB0aGF0IG1ha2UgdXAgYSBkcmF3blxuICAvLyBsaW5lLiBXaGVuIGxpbmVXcmFwcGluZyBpcyBvbiwgdGhlcmUgbWlnaHQgYmUgbW9yZSB0aGFuIG9uZVxuICAvLyBoZWlnaHQuXG4gIGZ1bmN0aW9uIGVuc3VyZUxpbmVIZWlnaHRzKGNtLCBsaW5lVmlldywgcmVjdCkge1xuICAgIHZhciB3cmFwcGluZyA9IGNtLm9wdGlvbnMubGluZVdyYXBwaW5nO1xuICAgIHZhciBjdXJXaWR0aCA9IHdyYXBwaW5nICYmIGRpc3BsYXlXaWR0aChjbSk7XG4gICAgaWYgKCFsaW5lVmlldy5tZWFzdXJlLmhlaWdodHMgfHwgd3JhcHBpbmcgJiYgbGluZVZpZXcubWVhc3VyZS53aWR0aCAhPSBjdXJXaWR0aCkge1xuICAgICAgdmFyIGhlaWdodHMgPSBsaW5lVmlldy5tZWFzdXJlLmhlaWdodHMgPSBbXTtcbiAgICAgIGlmICh3cmFwcGluZykge1xuICAgICAgICBsaW5lVmlldy5tZWFzdXJlLndpZHRoID0gY3VyV2lkdGg7XG4gICAgICAgIHZhciByZWN0cyA9IGxpbmVWaWV3LnRleHQuZmlyc3RDaGlsZC5nZXRDbGllbnRSZWN0cygpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlY3RzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgIHZhciBjdXIgPSByZWN0c1tpXSwgbmV4dCA9IHJlY3RzW2kgKyAxXTtcbiAgICAgICAgICBpZiAoTWF0aC5hYnMoY3VyLmJvdHRvbSAtIG5leHQuYm90dG9tKSA+IDIpXG4gICAgICAgICAgICB7IGhlaWdodHMucHVzaCgoY3VyLmJvdHRvbSArIG5leHQudG9wKSAvIDIgLSByZWN0LnRvcCk7IH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaGVpZ2h0cy5wdXNoKHJlY3QuYm90dG9tIC0gcmVjdC50b3ApO1xuICAgIH1cbiAgfVxuXG4gIC8vIEZpbmQgYSBsaW5lIG1hcCAobWFwcGluZyBjaGFyYWN0ZXIgb2Zmc2V0cyB0byB0ZXh0IG5vZGVzKSBhbmQgYVxuICAvLyBtZWFzdXJlbWVudCBjYWNoZSBmb3IgdGhlIGdpdmVuIGxpbmUgbnVtYmVyLiAoQSBsaW5lIHZpZXcgbWlnaHRcbiAgLy8gY29udGFpbiBtdWx0aXBsZSBsaW5lcyB3aGVuIGNvbGxhcHNlZCByYW5nZXMgYXJlIHByZXNlbnQuKVxuICBmdW5jdGlvbiBtYXBGcm9tTGluZVZpZXcobGluZVZpZXcsIGxpbmUsIGxpbmVOKSB7XG4gICAgaWYgKGxpbmVWaWV3LmxpbmUgPT0gbGluZSlcbiAgICAgIHsgcmV0dXJuIHttYXA6IGxpbmVWaWV3Lm1lYXN1cmUubWFwLCBjYWNoZTogbGluZVZpZXcubWVhc3VyZS5jYWNoZX0gfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZVZpZXcucmVzdC5sZW5ndGg7IGkrKylcbiAgICAgIHsgaWYgKGxpbmVWaWV3LnJlc3RbaV0gPT0gbGluZSlcbiAgICAgICAgeyByZXR1cm4ge21hcDogbGluZVZpZXcubWVhc3VyZS5tYXBzW2ldLCBjYWNoZTogbGluZVZpZXcubWVhc3VyZS5jYWNoZXNbaV19IH0gfVxuICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IGxpbmVWaWV3LnJlc3QubGVuZ3RoOyBpJDErKylcbiAgICAgIHsgaWYgKGxpbmVObyhsaW5lVmlldy5yZXN0W2kkMV0pID4gbGluZU4pXG4gICAgICAgIHsgcmV0dXJuIHttYXA6IGxpbmVWaWV3Lm1lYXN1cmUubWFwc1tpJDFdLCBjYWNoZTogbGluZVZpZXcubWVhc3VyZS5jYWNoZXNbaSQxXSwgYmVmb3JlOiB0cnVlfSB9IH1cbiAgfVxuXG4gIC8vIFJlbmRlciBhIGxpbmUgaW50byB0aGUgaGlkZGVuIG5vZGUgZGlzcGxheS5leHRlcm5hbE1lYXN1cmVkLiBVc2VkXG4gIC8vIHdoZW4gbWVhc3VyZW1lbnQgaXMgbmVlZGVkIGZvciBhIGxpbmUgdGhhdCdzIG5vdCBpbiB0aGUgdmlld3BvcnQuXG4gIGZ1bmN0aW9uIHVwZGF0ZUV4dGVybmFsTWVhc3VyZW1lbnQoY20sIGxpbmUpIHtcbiAgICBsaW5lID0gdmlzdWFsTGluZShsaW5lKTtcbiAgICB2YXIgbGluZU4gPSBsaW5lTm8obGluZSk7XG4gICAgdmFyIHZpZXcgPSBjbS5kaXNwbGF5LmV4dGVybmFsTWVhc3VyZWQgPSBuZXcgTGluZVZpZXcoY20uZG9jLCBsaW5lLCBsaW5lTik7XG4gICAgdmlldy5saW5lTiA9IGxpbmVOO1xuICAgIHZhciBidWlsdCA9IHZpZXcuYnVpbHQgPSBidWlsZExpbmVDb250ZW50KGNtLCB2aWV3KTtcbiAgICB2aWV3LnRleHQgPSBidWlsdC5wcmU7XG4gICAgcmVtb3ZlQ2hpbGRyZW5BbmRBZGQoY20uZGlzcGxheS5saW5lTWVhc3VyZSwgYnVpbHQucHJlKTtcbiAgICByZXR1cm4gdmlld1xuICB9XG5cbiAgLy8gR2V0IGEge3RvcCwgYm90dG9tLCBsZWZ0LCByaWdodH0gYm94IChpbiBsaW5lLWxvY2FsIGNvb3JkaW5hdGVzKVxuICAvLyBmb3IgYSBnaXZlbiBjaGFyYWN0ZXIuXG4gIGZ1bmN0aW9uIG1lYXN1cmVDaGFyKGNtLCBsaW5lLCBjaCwgYmlhcykge1xuICAgIHJldHVybiBtZWFzdXJlQ2hhclByZXBhcmVkKGNtLCBwcmVwYXJlTWVhc3VyZUZvckxpbmUoY20sIGxpbmUpLCBjaCwgYmlhcylcbiAgfVxuXG4gIC8vIEZpbmQgYSBsaW5lIHZpZXcgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZ2l2ZW4gbGluZSBudW1iZXIuXG4gIGZ1bmN0aW9uIGZpbmRWaWV3Rm9yTGluZShjbSwgbGluZU4pIHtcbiAgICBpZiAobGluZU4gPj0gY20uZGlzcGxheS52aWV3RnJvbSAmJiBsaW5lTiA8IGNtLmRpc3BsYXkudmlld1RvKVxuICAgICAgeyByZXR1cm4gY20uZGlzcGxheS52aWV3W2ZpbmRWaWV3SW5kZXgoY20sIGxpbmVOKV0gfVxuICAgIHZhciBleHQgPSBjbS5kaXNwbGF5LmV4dGVybmFsTWVhc3VyZWQ7XG4gICAgaWYgKGV4dCAmJiBsaW5lTiA+PSBleHQubGluZU4gJiYgbGluZU4gPCBleHQubGluZU4gKyBleHQuc2l6ZSlcbiAgICAgIHsgcmV0dXJuIGV4dCB9XG4gIH1cblxuICAvLyBNZWFzdXJlbWVudCBjYW4gYmUgc3BsaXQgaW4gdHdvIHN0ZXBzLCB0aGUgc2V0LXVwIHdvcmsgdGhhdFxuICAvLyBhcHBsaWVzIHRvIHRoZSB3aG9sZSBsaW5lLCBhbmQgdGhlIG1lYXN1cmVtZW50IG9mIHRoZSBhY3R1YWxcbiAgLy8gY2hhcmFjdGVyLiBGdW5jdGlvbnMgbGlrZSBjb29yZHNDaGFyLCB0aGF0IG5lZWQgdG8gZG8gYSBsb3Qgb2ZcbiAgLy8gbWVhc3VyZW1lbnRzIGluIGEgcm93LCBjYW4gdGh1cyBlbnN1cmUgdGhhdCB0aGUgc2V0LXVwIHdvcmsgaXNcbiAgLy8gb25seSBkb25lIG9uY2UuXG4gIGZ1bmN0aW9uIHByZXBhcmVNZWFzdXJlRm9yTGluZShjbSwgbGluZSkge1xuICAgIHZhciBsaW5lTiA9IGxpbmVObyhsaW5lKTtcbiAgICB2YXIgdmlldyA9IGZpbmRWaWV3Rm9yTGluZShjbSwgbGluZU4pO1xuICAgIGlmICh2aWV3ICYmICF2aWV3LnRleHQpIHtcbiAgICAgIHZpZXcgPSBudWxsO1xuICAgIH0gZWxzZSBpZiAodmlldyAmJiB2aWV3LmNoYW5nZXMpIHtcbiAgICAgIHVwZGF0ZUxpbmVGb3JDaGFuZ2VzKGNtLCB2aWV3LCBsaW5lTiwgZ2V0RGltZW5zaW9ucyhjbSkpO1xuICAgICAgY20uY3VyT3AuZm9yY2VVcGRhdGUgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoIXZpZXcpXG4gICAgICB7IHZpZXcgPSB1cGRhdGVFeHRlcm5hbE1lYXN1cmVtZW50KGNtLCBsaW5lKTsgfVxuXG4gICAgdmFyIGluZm8gPSBtYXBGcm9tTGluZVZpZXcodmlldywgbGluZSwgbGluZU4pO1xuICAgIHJldHVybiB7XG4gICAgICBsaW5lOiBsaW5lLCB2aWV3OiB2aWV3LCByZWN0OiBudWxsLFxuICAgICAgbWFwOiBpbmZvLm1hcCwgY2FjaGU6IGluZm8uY2FjaGUsIGJlZm9yZTogaW5mby5iZWZvcmUsXG4gICAgICBoYXNIZWlnaHRzOiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIC8vIEdpdmVuIGEgcHJlcGFyZWQgbWVhc3VyZW1lbnQgb2JqZWN0LCBtZWFzdXJlcyB0aGUgcG9zaXRpb24gb2YgYW5cbiAgLy8gYWN0dWFsIGNoYXJhY3RlciAob3IgZmV0Y2hlcyBpdCBmcm9tIHRoZSBjYWNoZSkuXG4gIGZ1bmN0aW9uIG1lYXN1cmVDaGFyUHJlcGFyZWQoY20sIHByZXBhcmVkLCBjaCwgYmlhcywgdmFySGVpZ2h0KSB7XG4gICAgaWYgKHByZXBhcmVkLmJlZm9yZSkgeyBjaCA9IC0xOyB9XG4gICAgdmFyIGtleSA9IGNoICsgKGJpYXMgfHwgXCJcIiksIGZvdW5kO1xuICAgIGlmIChwcmVwYXJlZC5jYWNoZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICBmb3VuZCA9IHByZXBhcmVkLmNhY2hlW2tleV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghcHJlcGFyZWQucmVjdClcbiAgICAgICAgeyBwcmVwYXJlZC5yZWN0ID0gcHJlcGFyZWQudmlldy50ZXh0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOyB9XG4gICAgICBpZiAoIXByZXBhcmVkLmhhc0hlaWdodHMpIHtcbiAgICAgICAgZW5zdXJlTGluZUhlaWdodHMoY20sIHByZXBhcmVkLnZpZXcsIHByZXBhcmVkLnJlY3QpO1xuICAgICAgICBwcmVwYXJlZC5oYXNIZWlnaHRzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGZvdW5kID0gbWVhc3VyZUNoYXJJbm5lcihjbSwgcHJlcGFyZWQsIGNoLCBiaWFzKTtcbiAgICAgIGlmICghZm91bmQuYm9ndXMpIHsgcHJlcGFyZWQuY2FjaGVba2V5XSA9IGZvdW5kOyB9XG4gICAgfVxuICAgIHJldHVybiB7bGVmdDogZm91bmQubGVmdCwgcmlnaHQ6IGZvdW5kLnJpZ2h0LFxuICAgICAgICAgICAgdG9wOiB2YXJIZWlnaHQgPyBmb3VuZC5ydG9wIDogZm91bmQudG9wLFxuICAgICAgICAgICAgYm90dG9tOiB2YXJIZWlnaHQgPyBmb3VuZC5yYm90dG9tIDogZm91bmQuYm90dG9tfVxuICB9XG5cbiAgdmFyIG51bGxSZWN0ID0ge2xlZnQ6IDAsIHJpZ2h0OiAwLCB0b3A6IDAsIGJvdHRvbTogMH07XG5cbiAgZnVuY3Rpb24gbm9kZUFuZE9mZnNldEluTGluZU1hcChtYXAsIGNoLCBiaWFzKSB7XG4gICAgdmFyIG5vZGUsIHN0YXJ0LCBlbmQsIGNvbGxhcHNlLCBtU3RhcnQsIG1FbmQ7XG4gICAgLy8gRmlyc3QsIHNlYXJjaCB0aGUgbGluZSBtYXAgZm9yIHRoZSB0ZXh0IG5vZGUgY29ycmVzcG9uZGluZyB0byxcbiAgICAvLyBvciBjbG9zZXN0IHRvLCB0aGUgdGFyZ2V0IGNoYXJhY3Rlci5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hcC5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgbVN0YXJ0ID0gbWFwW2ldO1xuICAgICAgbUVuZCA9IG1hcFtpICsgMV07XG4gICAgICBpZiAoY2ggPCBtU3RhcnQpIHtcbiAgICAgICAgc3RhcnQgPSAwOyBlbmQgPSAxO1xuICAgICAgICBjb2xsYXBzZSA9IFwibGVmdFwiO1xuICAgICAgfSBlbHNlIGlmIChjaCA8IG1FbmQpIHtcbiAgICAgICAgc3RhcnQgPSBjaCAtIG1TdGFydDtcbiAgICAgICAgZW5kID0gc3RhcnQgKyAxO1xuICAgICAgfSBlbHNlIGlmIChpID09IG1hcC5sZW5ndGggLSAzIHx8IGNoID09IG1FbmQgJiYgbWFwW2kgKyAzXSA+IGNoKSB7XG4gICAgICAgIGVuZCA9IG1FbmQgLSBtU3RhcnQ7XG4gICAgICAgIHN0YXJ0ID0gZW5kIC0gMTtcbiAgICAgICAgaWYgKGNoID49IG1FbmQpIHsgY29sbGFwc2UgPSBcInJpZ2h0XCI7IH1cbiAgICAgIH1cbiAgICAgIGlmIChzdGFydCAhPSBudWxsKSB7XG4gICAgICAgIG5vZGUgPSBtYXBbaSArIDJdO1xuICAgICAgICBpZiAobVN0YXJ0ID09IG1FbmQgJiYgYmlhcyA9PSAobm9kZS5pbnNlcnRMZWZ0ID8gXCJsZWZ0XCIgOiBcInJpZ2h0XCIpKVxuICAgICAgICAgIHsgY29sbGFwc2UgPSBiaWFzOyB9XG4gICAgICAgIGlmIChiaWFzID09IFwibGVmdFwiICYmIHN0YXJ0ID09IDApXG4gICAgICAgICAgeyB3aGlsZSAoaSAmJiBtYXBbaSAtIDJdID09IG1hcFtpIC0gM10gJiYgbWFwW2kgLSAxXS5pbnNlcnRMZWZ0KSB7XG4gICAgICAgICAgICBub2RlID0gbWFwWyhpIC09IDMpICsgMl07XG4gICAgICAgICAgICBjb2xsYXBzZSA9IFwibGVmdFwiO1xuICAgICAgICAgIH0gfVxuICAgICAgICBpZiAoYmlhcyA9PSBcInJpZ2h0XCIgJiYgc3RhcnQgPT0gbUVuZCAtIG1TdGFydClcbiAgICAgICAgICB7IHdoaWxlIChpIDwgbWFwLmxlbmd0aCAtIDMgJiYgbWFwW2kgKyAzXSA9PSBtYXBbaSArIDRdICYmICFtYXBbaSArIDVdLmluc2VydExlZnQpIHtcbiAgICAgICAgICAgIG5vZGUgPSBtYXBbKGkgKz0gMykgKyAyXTtcbiAgICAgICAgICAgIGNvbGxhcHNlID0gXCJyaWdodFwiO1xuICAgICAgICAgIH0gfVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge25vZGU6IG5vZGUsIHN0YXJ0OiBzdGFydCwgZW5kOiBlbmQsIGNvbGxhcHNlOiBjb2xsYXBzZSwgY292ZXJTdGFydDogbVN0YXJ0LCBjb3ZlckVuZDogbUVuZH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFVzZWZ1bFJlY3QocmVjdHMsIGJpYXMpIHtcbiAgICB2YXIgcmVjdCA9IG51bGxSZWN0O1xuICAgIGlmIChiaWFzID09IFwibGVmdFwiKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcmVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICgocmVjdCA9IHJlY3RzW2ldKS5sZWZ0ICE9IHJlY3QucmlnaHQpIHsgYnJlYWsgfVxuICAgIH0gfSBlbHNlIHsgZm9yICh2YXIgaSQxID0gcmVjdHMubGVuZ3RoIC0gMTsgaSQxID49IDA7IGkkMS0tKSB7XG4gICAgICBpZiAoKHJlY3QgPSByZWN0c1tpJDFdKS5sZWZ0ICE9IHJlY3QucmlnaHQpIHsgYnJlYWsgfVxuICAgIH0gfVxuICAgIHJldHVybiByZWN0XG4gIH1cblxuICBmdW5jdGlvbiBtZWFzdXJlQ2hhcklubmVyKGNtLCBwcmVwYXJlZCwgY2gsIGJpYXMpIHtcbiAgICB2YXIgcGxhY2UgPSBub2RlQW5kT2Zmc2V0SW5MaW5lTWFwKHByZXBhcmVkLm1hcCwgY2gsIGJpYXMpO1xuICAgIHZhciBub2RlID0gcGxhY2Uubm9kZSwgc3RhcnQgPSBwbGFjZS5zdGFydCwgZW5kID0gcGxhY2UuZW5kLCBjb2xsYXBzZSA9IHBsYWNlLmNvbGxhcHNlO1xuXG4gICAgdmFyIHJlY3Q7XG4gICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMykgeyAvLyBJZiBpdCBpcyBhIHRleHQgbm9kZSwgdXNlIGEgcmFuZ2UgdG8gcmV0cmlldmUgdGhlIGNvb3JkaW5hdGVzLlxuICAgICAgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgNDsgaSQxKyspIHsgLy8gUmV0cnkgYSBtYXhpbXVtIG9mIDQgdGltZXMgd2hlbiBub25zZW5zZSByZWN0YW5nbGVzIGFyZSByZXR1cm5lZFxuICAgICAgICB3aGlsZSAoc3RhcnQgJiYgaXNFeHRlbmRpbmdDaGFyKHByZXBhcmVkLmxpbmUudGV4dC5jaGFyQXQocGxhY2UuY292ZXJTdGFydCArIHN0YXJ0KSkpIHsgLS1zdGFydDsgfVxuICAgICAgICB3aGlsZSAocGxhY2UuY292ZXJTdGFydCArIGVuZCA8IHBsYWNlLmNvdmVyRW5kICYmIGlzRXh0ZW5kaW5nQ2hhcihwcmVwYXJlZC5saW5lLnRleHQuY2hhckF0KHBsYWNlLmNvdmVyU3RhcnQgKyBlbmQpKSkgeyArK2VuZDsgfVxuICAgICAgICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8IDkgJiYgc3RhcnQgPT0gMCAmJiBlbmQgPT0gcGxhY2UuY292ZXJFbmQgLSBwbGFjZS5jb3ZlclN0YXJ0KVxuICAgICAgICAgIHsgcmVjdCA9IG5vZGUucGFyZW50Tm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgeyByZWN0ID0gZ2V0VXNlZnVsUmVjdChyYW5nZShub2RlLCBzdGFydCwgZW5kKS5nZXRDbGllbnRSZWN0cygpLCBiaWFzKTsgfVxuICAgICAgICBpZiAocmVjdC5sZWZ0IHx8IHJlY3QucmlnaHQgfHwgc3RhcnQgPT0gMCkgeyBicmVhayB9XG4gICAgICAgIGVuZCA9IHN0YXJ0O1xuICAgICAgICBzdGFydCA9IHN0YXJ0IC0gMTtcbiAgICAgICAgY29sbGFwc2UgPSBcInJpZ2h0XCI7XG4gICAgICB9XG4gICAgICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8IDExKSB7IHJlY3QgPSBtYXliZVVwZGF0ZVJlY3RGb3Jab29taW5nKGNtLmRpc3BsYXkubWVhc3VyZSwgcmVjdCk7IH1cbiAgICB9IGVsc2UgeyAvLyBJZiBpdCBpcyBhIHdpZGdldCwgc2ltcGx5IGdldCB0aGUgYm94IGZvciB0aGUgd2hvbGUgd2lkZ2V0LlxuICAgICAgaWYgKHN0YXJ0ID4gMCkgeyBjb2xsYXBzZSA9IGJpYXMgPSBcInJpZ2h0XCI7IH1cbiAgICAgIHZhciByZWN0cztcbiAgICAgIGlmIChjbS5vcHRpb25zLmxpbmVXcmFwcGluZyAmJiAocmVjdHMgPSBub2RlLmdldENsaWVudFJlY3RzKCkpLmxlbmd0aCA+IDEpXG4gICAgICAgIHsgcmVjdCA9IHJlY3RzW2JpYXMgPT0gXCJyaWdodFwiID8gcmVjdHMubGVuZ3RoIC0gMSA6IDBdOyB9XG4gICAgICBlbHNlXG4gICAgICAgIHsgcmVjdCA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7IH1cbiAgICB9XG4gICAgaWYgKGllICYmIGllX3ZlcnNpb24gPCA5ICYmICFzdGFydCAmJiAoIXJlY3QgfHwgIXJlY3QubGVmdCAmJiAhcmVjdC5yaWdodCkpIHtcbiAgICAgIHZhciByU3BhbiA9IG5vZGUucGFyZW50Tm9kZS5nZXRDbGllbnRSZWN0cygpWzBdO1xuICAgICAgaWYgKHJTcGFuKVxuICAgICAgICB7IHJlY3QgPSB7bGVmdDogclNwYW4ubGVmdCwgcmlnaHQ6IHJTcGFuLmxlZnQgKyBjaGFyV2lkdGgoY20uZGlzcGxheSksIHRvcDogclNwYW4udG9wLCBib3R0b206IHJTcGFuLmJvdHRvbX07IH1cbiAgICAgIGVsc2VcbiAgICAgICAgeyByZWN0ID0gbnVsbFJlY3Q7IH1cbiAgICB9XG5cbiAgICB2YXIgcnRvcCA9IHJlY3QudG9wIC0gcHJlcGFyZWQucmVjdC50b3AsIHJib3QgPSByZWN0LmJvdHRvbSAtIHByZXBhcmVkLnJlY3QudG9wO1xuICAgIHZhciBtaWQgPSAocnRvcCArIHJib3QpIC8gMjtcbiAgICB2YXIgaGVpZ2h0cyA9IHByZXBhcmVkLnZpZXcubWVhc3VyZS5oZWlnaHRzO1xuICAgIHZhciBpID0gMDtcbiAgICBmb3IgKDsgaSA8IGhlaWdodHMubGVuZ3RoIC0gMTsgaSsrKVxuICAgICAgeyBpZiAobWlkIDwgaGVpZ2h0c1tpXSkgeyBicmVhayB9IH1cbiAgICB2YXIgdG9wID0gaSA/IGhlaWdodHNbaSAtIDFdIDogMCwgYm90ID0gaGVpZ2h0c1tpXTtcbiAgICB2YXIgcmVzdWx0ID0ge2xlZnQ6IChjb2xsYXBzZSA9PSBcInJpZ2h0XCIgPyByZWN0LnJpZ2h0IDogcmVjdC5sZWZ0KSAtIHByZXBhcmVkLnJlY3QubGVmdCxcbiAgICAgICAgICAgICAgICAgIHJpZ2h0OiAoY29sbGFwc2UgPT0gXCJsZWZ0XCIgPyByZWN0LmxlZnQgOiByZWN0LnJpZ2h0KSAtIHByZXBhcmVkLnJlY3QubGVmdCxcbiAgICAgICAgICAgICAgICAgIHRvcDogdG9wLCBib3R0b206IGJvdH07XG4gICAgaWYgKCFyZWN0LmxlZnQgJiYgIXJlY3QucmlnaHQpIHsgcmVzdWx0LmJvZ3VzID0gdHJ1ZTsgfVxuICAgIGlmICghY20ub3B0aW9ucy5zaW5nbGVDdXJzb3JIZWlnaHRQZXJMaW5lKSB7IHJlc3VsdC5ydG9wID0gcnRvcDsgcmVzdWx0LnJib3R0b20gPSByYm90OyB9XG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvLyBXb3JrIGFyb3VuZCBwcm9ibGVtIHdpdGggYm91bmRpbmcgY2xpZW50IHJlY3RzIG9uIHJhbmdlcyBiZWluZ1xuICAvLyByZXR1cm5lZCBpbmNvcnJlY3RseSB3aGVuIHpvb21lZCBvbiBJRTEwIGFuZCBiZWxvdy5cbiAgZnVuY3Rpb24gbWF5YmVVcGRhdGVSZWN0Rm9yWm9vbWluZyhtZWFzdXJlLCByZWN0KSB7XG4gICAgaWYgKCF3aW5kb3cuc2NyZWVuIHx8IHNjcmVlbi5sb2dpY2FsWERQSSA9PSBudWxsIHx8XG4gICAgICAgIHNjcmVlbi5sb2dpY2FsWERQSSA9PSBzY3JlZW4uZGV2aWNlWERQSSB8fCAhaGFzQmFkWm9vbWVkUmVjdHMobWVhc3VyZSkpXG4gICAgICB7IHJldHVybiByZWN0IH1cbiAgICB2YXIgc2NhbGVYID0gc2NyZWVuLmxvZ2ljYWxYRFBJIC8gc2NyZWVuLmRldmljZVhEUEk7XG4gICAgdmFyIHNjYWxlWSA9IHNjcmVlbi5sb2dpY2FsWURQSSAvIHNjcmVlbi5kZXZpY2VZRFBJO1xuICAgIHJldHVybiB7bGVmdDogcmVjdC5sZWZ0ICogc2NhbGVYLCByaWdodDogcmVjdC5yaWdodCAqIHNjYWxlWCxcbiAgICAgICAgICAgIHRvcDogcmVjdC50b3AgKiBzY2FsZVksIGJvdHRvbTogcmVjdC5ib3R0b20gKiBzY2FsZVl9XG4gIH1cblxuICBmdW5jdGlvbiBjbGVhckxpbmVNZWFzdXJlbWVudENhY2hlRm9yKGxpbmVWaWV3KSB7XG4gICAgaWYgKGxpbmVWaWV3Lm1lYXN1cmUpIHtcbiAgICAgIGxpbmVWaWV3Lm1lYXN1cmUuY2FjaGUgPSB7fTtcbiAgICAgIGxpbmVWaWV3Lm1lYXN1cmUuaGVpZ2h0cyA9IG51bGw7XG4gICAgICBpZiAobGluZVZpZXcucmVzdCkgeyBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVWaWV3LnJlc3QubGVuZ3RoOyBpKyspXG4gICAgICAgIHsgbGluZVZpZXcubWVhc3VyZS5jYWNoZXNbaV0gPSB7fTsgfSB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2xlYXJMaW5lTWVhc3VyZW1lbnRDYWNoZShjbSkge1xuICAgIGNtLmRpc3BsYXkuZXh0ZXJuYWxNZWFzdXJlID0gbnVsbDtcbiAgICByZW1vdmVDaGlsZHJlbihjbS5kaXNwbGF5LmxpbmVNZWFzdXJlKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNtLmRpc3BsYXkudmlldy5sZW5ndGg7IGkrKylcbiAgICAgIHsgY2xlYXJMaW5lTWVhc3VyZW1lbnRDYWNoZUZvcihjbS5kaXNwbGF5LnZpZXdbaV0pOyB9XG4gIH1cblxuICBmdW5jdGlvbiBjbGVhckNhY2hlcyhjbSkge1xuICAgIGNsZWFyTGluZU1lYXN1cmVtZW50Q2FjaGUoY20pO1xuICAgIGNtLmRpc3BsYXkuY2FjaGVkQ2hhcldpZHRoID0gY20uZGlzcGxheS5jYWNoZWRUZXh0SGVpZ2h0ID0gY20uZGlzcGxheS5jYWNoZWRQYWRkaW5nSCA9IG51bGw7XG4gICAgaWYgKCFjbS5vcHRpb25zLmxpbmVXcmFwcGluZykgeyBjbS5kaXNwbGF5Lm1heExpbmVDaGFuZ2VkID0gdHJ1ZTsgfVxuICAgIGNtLmRpc3BsYXkubGluZU51bUNoYXJzID0gbnVsbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBhZ2VTY3JvbGxYKCkge1xuICAgIC8vIFdvcmsgYXJvdW5kIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTQ4OTIwNlxuICAgIC8vIHdoaWNoIGNhdXNlcyBwYWdlX09mZnNldCBhbmQgYm91bmRpbmcgY2xpZW50IHJlY3RzIHRvIHVzZVxuICAgIC8vIGRpZmZlcmVudCByZWZlcmVuY2Ugdmlld3BvcnRzIGFuZCBpbnZhbGlkYXRlIG91ciBjYWxjdWxhdGlvbnMuXG4gICAgaWYgKGNocm9tZSAmJiBhbmRyb2lkKSB7IHJldHVybiAtKGRvY3VtZW50LmJvZHkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtIHBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSkubWFyZ2luTGVmdCkpIH1cbiAgICByZXR1cm4gd2luZG93LnBhZ2VYT2Zmc2V0IHx8IChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgfHwgZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdFxuICB9XG4gIGZ1bmN0aW9uIHBhZ2VTY3JvbGxZKCkge1xuICAgIGlmIChjaHJvbWUgJiYgYW5kcm9pZCkgeyByZXR1cm4gLShkb2N1bWVudC5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCAtIHBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSkubWFyZ2luVG9wKSkgfVxuICAgIHJldHVybiB3aW5kb3cucGFnZVlPZmZzZXQgfHwgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCB8fCBkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3BcbiAgfVxuXG4gIGZ1bmN0aW9uIHdpZGdldFRvcEhlaWdodChsaW5lT2JqKSB7XG4gICAgdmFyIGhlaWdodCA9IDA7XG4gICAgaWYgKGxpbmVPYmoud2lkZ2V0cykgeyBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVPYmoud2lkZ2V0cy5sZW5ndGg7ICsraSkgeyBpZiAobGluZU9iai53aWRnZXRzW2ldLmFib3ZlKVxuICAgICAgeyBoZWlnaHQgKz0gd2lkZ2V0SGVpZ2h0KGxpbmVPYmoud2lkZ2V0c1tpXSk7IH0gfSB9XG4gICAgcmV0dXJuIGhlaWdodFxuICB9XG5cbiAgLy8gQ29udmVydHMgYSB7dG9wLCBib3R0b20sIGxlZnQsIHJpZ2h0fSBib3ggZnJvbSBsaW5lLWxvY2FsXG4gIC8vIGNvb3JkaW5hdGVzIGludG8gYW5vdGhlciBjb29yZGluYXRlIHN5c3RlbS4gQ29udGV4dCBtYXkgYmUgb25lIG9mXG4gIC8vIFwibGluZVwiLCBcImRpdlwiIChkaXNwbGF5LmxpbmVEaXYpLCBcImxvY2FsXCIuL251bGwgKGVkaXRvciksIFwid2luZG93XCIsXG4gIC8vIG9yIFwicGFnZVwiLlxuICBmdW5jdGlvbiBpbnRvQ29vcmRTeXN0ZW0oY20sIGxpbmVPYmosIHJlY3QsIGNvbnRleHQsIGluY2x1ZGVXaWRnZXRzKSB7XG4gICAgaWYgKCFpbmNsdWRlV2lkZ2V0cykge1xuICAgICAgdmFyIGhlaWdodCA9IHdpZGdldFRvcEhlaWdodChsaW5lT2JqKTtcbiAgICAgIHJlY3QudG9wICs9IGhlaWdodDsgcmVjdC5ib3R0b20gKz0gaGVpZ2h0O1xuICAgIH1cbiAgICBpZiAoY29udGV4dCA9PSBcImxpbmVcIikgeyByZXR1cm4gcmVjdCB9XG4gICAgaWYgKCFjb250ZXh0KSB7IGNvbnRleHQgPSBcImxvY2FsXCI7IH1cbiAgICB2YXIgeU9mZiA9IGhlaWdodEF0TGluZShsaW5lT2JqKTtcbiAgICBpZiAoY29udGV4dCA9PSBcImxvY2FsXCIpIHsgeU9mZiArPSBwYWRkaW5nVG9wKGNtLmRpc3BsYXkpOyB9XG4gICAgZWxzZSB7IHlPZmYgLT0gY20uZGlzcGxheS52aWV3T2Zmc2V0OyB9XG4gICAgaWYgKGNvbnRleHQgPT0gXCJwYWdlXCIgfHwgY29udGV4dCA9PSBcIndpbmRvd1wiKSB7XG4gICAgICB2YXIgbE9mZiA9IGNtLmRpc3BsYXkubGluZVNwYWNlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgeU9mZiArPSBsT2ZmLnRvcCArIChjb250ZXh0ID09IFwid2luZG93XCIgPyAwIDogcGFnZVNjcm9sbFkoKSk7XG4gICAgICB2YXIgeE9mZiA9IGxPZmYubGVmdCArIChjb250ZXh0ID09IFwid2luZG93XCIgPyAwIDogcGFnZVNjcm9sbFgoKSk7XG4gICAgICByZWN0LmxlZnQgKz0geE9mZjsgcmVjdC5yaWdodCArPSB4T2ZmO1xuICAgIH1cbiAgICByZWN0LnRvcCArPSB5T2ZmOyByZWN0LmJvdHRvbSArPSB5T2ZmO1xuICAgIHJldHVybiByZWN0XG4gIH1cblxuICAvLyBDb3ZlcnRzIGEgYm94IGZyb20gXCJkaXZcIiBjb29yZHMgdG8gYW5vdGhlciBjb29yZGluYXRlIHN5c3RlbS5cbiAgLy8gQ29udGV4dCBtYXkgYmUgXCJ3aW5kb3dcIiwgXCJwYWdlXCIsIFwiZGl2XCIsIG9yIFwibG9jYWxcIi4vbnVsbC5cbiAgZnVuY3Rpb24gZnJvbUNvb3JkU3lzdGVtKGNtLCBjb29yZHMsIGNvbnRleHQpIHtcbiAgICBpZiAoY29udGV4dCA9PSBcImRpdlwiKSB7IHJldHVybiBjb29yZHMgfVxuICAgIHZhciBsZWZ0ID0gY29vcmRzLmxlZnQsIHRvcCA9IGNvb3Jkcy50b3A7XG4gICAgLy8gRmlyc3QgbW92ZSBpbnRvIFwicGFnZVwiIGNvb3JkaW5hdGUgc3lzdGVtXG4gICAgaWYgKGNvbnRleHQgPT0gXCJwYWdlXCIpIHtcbiAgICAgIGxlZnQgLT0gcGFnZVNjcm9sbFgoKTtcbiAgICAgIHRvcCAtPSBwYWdlU2Nyb2xsWSgpO1xuICAgIH0gZWxzZSBpZiAoY29udGV4dCA9PSBcImxvY2FsXCIgfHwgIWNvbnRleHQpIHtcbiAgICAgIHZhciBsb2NhbEJveCA9IGNtLmRpc3BsYXkuc2l6ZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBsZWZ0ICs9IGxvY2FsQm94LmxlZnQ7XG4gICAgICB0b3AgKz0gbG9jYWxCb3gudG9wO1xuICAgIH1cblxuICAgIHZhciBsaW5lU3BhY2VCb3ggPSBjbS5kaXNwbGF5LmxpbmVTcGFjZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICByZXR1cm4ge2xlZnQ6IGxlZnQgLSBsaW5lU3BhY2VCb3gubGVmdCwgdG9wOiB0b3AgLSBsaW5lU3BhY2VCb3gudG9wfVxuICB9XG5cbiAgZnVuY3Rpb24gY2hhckNvb3JkcyhjbSwgcG9zLCBjb250ZXh0LCBsaW5lT2JqLCBiaWFzKSB7XG4gICAgaWYgKCFsaW5lT2JqKSB7IGxpbmVPYmogPSBnZXRMaW5lKGNtLmRvYywgcG9zLmxpbmUpOyB9XG4gICAgcmV0dXJuIGludG9Db29yZFN5c3RlbShjbSwgbGluZU9iaiwgbWVhc3VyZUNoYXIoY20sIGxpbmVPYmosIHBvcy5jaCwgYmlhcyksIGNvbnRleHQpXG4gIH1cblxuICAvLyBSZXR1cm5zIGEgYm94IGZvciBhIGdpdmVuIGN1cnNvciBwb3NpdGlvbiwgd2hpY2ggbWF5IGhhdmUgYW5cbiAgLy8gJ290aGVyJyBwcm9wZXJ0eSBjb250YWluaW5nIHRoZSBwb3NpdGlvbiBvZiB0aGUgc2Vjb25kYXJ5IGN1cnNvclxuICAvLyBvbiBhIGJpZGkgYm91bmRhcnkuXG4gIC8vIEEgY3Vyc29yIFBvcyhsaW5lLCBjaGFyLCBcImJlZm9yZVwiKSBpcyBvbiB0aGUgc2FtZSB2aXN1YWwgbGluZSBhcyBgY2hhciAtIDFgXG4gIC8vIGFuZCBhZnRlciBgY2hhciAtIDFgIGluIHdyaXRpbmcgb3JkZXIgb2YgYGNoYXIgLSAxYFxuICAvLyBBIGN1cnNvciBQb3MobGluZSwgY2hhciwgXCJhZnRlclwiKSBpcyBvbiB0aGUgc2FtZSB2aXN1YWwgbGluZSBhcyBgY2hhcmBcbiAgLy8gYW5kIGJlZm9yZSBgY2hhcmAgaW4gd3JpdGluZyBvcmRlciBvZiBgY2hhcmBcbiAgLy8gRXhhbXBsZXMgKHVwcGVyLWNhc2UgbGV0dGVycyBhcmUgUlRMLCBsb3dlci1jYXNlIGFyZSBMVFIpOlxuICAvLyAgICAgUG9zKDAsIDEsIC4uLilcbiAgLy8gICAgIGJlZm9yZSAgIGFmdGVyXG4gIC8vIGFiICAgICBhfGIgICAgIGF8YlxuICAvLyBhQiAgICAgYXxCICAgICBhQnxcbiAgLy8gQWIgICAgIHxBYiAgICAgQXxiXG4gIC8vIEFCICAgICBCfEEgICAgIEJ8QVxuICAvLyBFdmVyeSBwb3NpdGlvbiBhZnRlciB0aGUgbGFzdCBjaGFyYWN0ZXIgb24gYSBsaW5lIGlzIGNvbnNpZGVyZWQgdG8gc3RpY2tcbiAgLy8gdG8gdGhlIGxhc3QgY2hhcmFjdGVyIG9uIHRoZSBsaW5lLlxuICBmdW5jdGlvbiBjdXJzb3JDb29yZHMoY20sIHBvcywgY29udGV4dCwgbGluZU9iaiwgcHJlcGFyZWRNZWFzdXJlLCB2YXJIZWlnaHQpIHtcbiAgICBsaW5lT2JqID0gbGluZU9iaiB8fCBnZXRMaW5lKGNtLmRvYywgcG9zLmxpbmUpO1xuICAgIGlmICghcHJlcGFyZWRNZWFzdXJlKSB7IHByZXBhcmVkTWVhc3VyZSA9IHByZXBhcmVNZWFzdXJlRm9yTGluZShjbSwgbGluZU9iaik7IH1cbiAgICBmdW5jdGlvbiBnZXQoY2gsIHJpZ2h0KSB7XG4gICAgICB2YXIgbSA9IG1lYXN1cmVDaGFyUHJlcGFyZWQoY20sIHByZXBhcmVkTWVhc3VyZSwgY2gsIHJpZ2h0ID8gXCJyaWdodFwiIDogXCJsZWZ0XCIsIHZhckhlaWdodCk7XG4gICAgICBpZiAocmlnaHQpIHsgbS5sZWZ0ID0gbS5yaWdodDsgfSBlbHNlIHsgbS5yaWdodCA9IG0ubGVmdDsgfVxuICAgICAgcmV0dXJuIGludG9Db29yZFN5c3RlbShjbSwgbGluZU9iaiwgbSwgY29udGV4dClcbiAgICB9XG4gICAgdmFyIG9yZGVyID0gZ2V0T3JkZXIobGluZU9iaiwgY20uZG9jLmRpcmVjdGlvbiksIGNoID0gcG9zLmNoLCBzdGlja3kgPSBwb3Muc3RpY2t5O1xuICAgIGlmIChjaCA+PSBsaW5lT2JqLnRleHQubGVuZ3RoKSB7XG4gICAgICBjaCA9IGxpbmVPYmoudGV4dC5sZW5ndGg7XG4gICAgICBzdGlja3kgPSBcImJlZm9yZVwiO1xuICAgIH0gZWxzZSBpZiAoY2ggPD0gMCkge1xuICAgICAgY2ggPSAwO1xuICAgICAgc3RpY2t5ID0gXCJhZnRlclwiO1xuICAgIH1cbiAgICBpZiAoIW9yZGVyKSB7IHJldHVybiBnZXQoc3RpY2t5ID09IFwiYmVmb3JlXCIgPyBjaCAtIDEgOiBjaCwgc3RpY2t5ID09IFwiYmVmb3JlXCIpIH1cblxuICAgIGZ1bmN0aW9uIGdldEJpZGkoY2gsIHBhcnRQb3MsIGludmVydCkge1xuICAgICAgdmFyIHBhcnQgPSBvcmRlcltwYXJ0UG9zXSwgcmlnaHQgPSBwYXJ0LmxldmVsID09IDE7XG4gICAgICByZXR1cm4gZ2V0KGludmVydCA/IGNoIC0gMSA6IGNoLCByaWdodCAhPSBpbnZlcnQpXG4gICAgfVxuICAgIHZhciBwYXJ0UG9zID0gZ2V0QmlkaVBhcnRBdChvcmRlciwgY2gsIHN0aWNreSk7XG4gICAgdmFyIG90aGVyID0gYmlkaU90aGVyO1xuICAgIHZhciB2YWwgPSBnZXRCaWRpKGNoLCBwYXJ0UG9zLCBzdGlja3kgPT0gXCJiZWZvcmVcIik7XG4gICAgaWYgKG90aGVyICE9IG51bGwpIHsgdmFsLm90aGVyID0gZ2V0QmlkaShjaCwgb3RoZXIsIHN0aWNreSAhPSBcImJlZm9yZVwiKTsgfVxuICAgIHJldHVybiB2YWxcbiAgfVxuXG4gIC8vIFVzZWQgdG8gY2hlYXBseSBlc3RpbWF0ZSB0aGUgY29vcmRpbmF0ZXMgZm9yIGEgcG9zaXRpb24uIFVzZWQgZm9yXG4gIC8vIGludGVybWVkaWF0ZSBzY3JvbGwgdXBkYXRlcy5cbiAgZnVuY3Rpb24gZXN0aW1hdGVDb29yZHMoY20sIHBvcykge1xuICAgIHZhciBsZWZ0ID0gMDtcbiAgICBwb3MgPSBjbGlwUG9zKGNtLmRvYywgcG9zKTtcbiAgICBpZiAoIWNtLm9wdGlvbnMubGluZVdyYXBwaW5nKSB7IGxlZnQgPSBjaGFyV2lkdGgoY20uZGlzcGxheSkgKiBwb3MuY2g7IH1cbiAgICB2YXIgbGluZU9iaiA9IGdldExpbmUoY20uZG9jLCBwb3MubGluZSk7XG4gICAgdmFyIHRvcCA9IGhlaWdodEF0TGluZShsaW5lT2JqKSArIHBhZGRpbmdUb3AoY20uZGlzcGxheSk7XG4gICAgcmV0dXJuIHtsZWZ0OiBsZWZ0LCByaWdodDogbGVmdCwgdG9wOiB0b3AsIGJvdHRvbTogdG9wICsgbGluZU9iai5oZWlnaHR9XG4gIH1cblxuICAvLyBQb3NpdGlvbnMgcmV0dXJuZWQgYnkgY29vcmRzQ2hhciBjb250YWluIHNvbWUgZXh0cmEgaW5mb3JtYXRpb24uXG4gIC8vIHhSZWwgaXMgdGhlIHJlbGF0aXZlIHggcG9zaXRpb24gb2YgdGhlIGlucHV0IGNvb3JkaW5hdGVzIGNvbXBhcmVkXG4gIC8vIHRvIHRoZSBmb3VuZCBwb3NpdGlvbiAoc28geFJlbCA+IDAgbWVhbnMgdGhlIGNvb3JkaW5hdGVzIGFyZSB0b1xuICAvLyB0aGUgcmlnaHQgb2YgdGhlIGNoYXJhY3RlciBwb3NpdGlvbiwgZm9yIGV4YW1wbGUpLiBXaGVuIG91dHNpZGVcbiAgLy8gaXMgdHJ1ZSwgdGhhdCBtZWFucyB0aGUgY29vcmRpbmF0ZXMgbGllIG91dHNpZGUgdGhlIGxpbmUnc1xuICAvLyB2ZXJ0aWNhbCByYW5nZS5cbiAgZnVuY3Rpb24gUG9zV2l0aEluZm8obGluZSwgY2gsIHN0aWNreSwgb3V0c2lkZSwgeFJlbCkge1xuICAgIHZhciBwb3MgPSBQb3MobGluZSwgY2gsIHN0aWNreSk7XG4gICAgcG9zLnhSZWwgPSB4UmVsO1xuICAgIGlmIChvdXRzaWRlKSB7IHBvcy5vdXRzaWRlID0gb3V0c2lkZTsgfVxuICAgIHJldHVybiBwb3NcbiAgfVxuXG4gIC8vIENvbXB1dGUgdGhlIGNoYXJhY3RlciBwb3NpdGlvbiBjbG9zZXN0IHRvIHRoZSBnaXZlbiBjb29yZGluYXRlcy5cbiAgLy8gSW5wdXQgbXVzdCBiZSBsaW5lU3BhY2UtbG9jYWwgKFwiZGl2XCIgY29vcmRpbmF0ZSBzeXN0ZW0pLlxuICBmdW5jdGlvbiBjb29yZHNDaGFyKGNtLCB4LCB5KSB7XG4gICAgdmFyIGRvYyA9IGNtLmRvYztcbiAgICB5ICs9IGNtLmRpc3BsYXkudmlld09mZnNldDtcbiAgICBpZiAoeSA8IDApIHsgcmV0dXJuIFBvc1dpdGhJbmZvKGRvYy5maXJzdCwgMCwgbnVsbCwgLTEsIC0xKSB9XG4gICAgdmFyIGxpbmVOID0gbGluZUF0SGVpZ2h0KGRvYywgeSksIGxhc3QgPSBkb2MuZmlyc3QgKyBkb2Muc2l6ZSAtIDE7XG4gICAgaWYgKGxpbmVOID4gbGFzdClcbiAgICAgIHsgcmV0dXJuIFBvc1dpdGhJbmZvKGRvYy5maXJzdCArIGRvYy5zaXplIC0gMSwgZ2V0TGluZShkb2MsIGxhc3QpLnRleHQubGVuZ3RoLCBudWxsLCAxLCAxKSB9XG4gICAgaWYgKHggPCAwKSB7IHggPSAwOyB9XG5cbiAgICB2YXIgbGluZU9iaiA9IGdldExpbmUoZG9jLCBsaW5lTik7XG4gICAgZm9yICg7Oykge1xuICAgICAgdmFyIGZvdW5kID0gY29vcmRzQ2hhcklubmVyKGNtLCBsaW5lT2JqLCBsaW5lTiwgeCwgeSk7XG4gICAgICB2YXIgY29sbGFwc2VkID0gY29sbGFwc2VkU3BhbkFyb3VuZChsaW5lT2JqLCBmb3VuZC5jaCArIChmb3VuZC54UmVsID4gMCB8fCBmb3VuZC5vdXRzaWRlID4gMCA/IDEgOiAwKSk7XG4gICAgICBpZiAoIWNvbGxhcHNlZCkgeyByZXR1cm4gZm91bmQgfVxuICAgICAgdmFyIHJhbmdlRW5kID0gY29sbGFwc2VkLmZpbmQoMSk7XG4gICAgICBpZiAocmFuZ2VFbmQubGluZSA9PSBsaW5lTikgeyByZXR1cm4gcmFuZ2VFbmQgfVxuICAgICAgbGluZU9iaiA9IGdldExpbmUoZG9jLCBsaW5lTiA9IHJhbmdlRW5kLmxpbmUpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHdyYXBwZWRMaW5lRXh0ZW50KGNtLCBsaW5lT2JqLCBwcmVwYXJlZE1lYXN1cmUsIHkpIHtcbiAgICB5IC09IHdpZGdldFRvcEhlaWdodChsaW5lT2JqKTtcbiAgICB2YXIgZW5kID0gbGluZU9iai50ZXh0Lmxlbmd0aDtcbiAgICB2YXIgYmVnaW4gPSBmaW5kRmlyc3QoZnVuY3Rpb24gKGNoKSB7IHJldHVybiBtZWFzdXJlQ2hhclByZXBhcmVkKGNtLCBwcmVwYXJlZE1lYXN1cmUsIGNoIC0gMSkuYm90dG9tIDw9IHk7IH0sIGVuZCwgMCk7XG4gICAgZW5kID0gZmluZEZpcnN0KGZ1bmN0aW9uIChjaCkgeyByZXR1cm4gbWVhc3VyZUNoYXJQcmVwYXJlZChjbSwgcHJlcGFyZWRNZWFzdXJlLCBjaCkudG9wID4geTsgfSwgYmVnaW4sIGVuZCk7XG4gICAgcmV0dXJuIHtiZWdpbjogYmVnaW4sIGVuZDogZW5kfVxuICB9XG5cbiAgZnVuY3Rpb24gd3JhcHBlZExpbmVFeHRlbnRDaGFyKGNtLCBsaW5lT2JqLCBwcmVwYXJlZE1lYXN1cmUsIHRhcmdldCkge1xuICAgIGlmICghcHJlcGFyZWRNZWFzdXJlKSB7IHByZXBhcmVkTWVhc3VyZSA9IHByZXBhcmVNZWFzdXJlRm9yTGluZShjbSwgbGluZU9iaik7IH1cbiAgICB2YXIgdGFyZ2V0VG9wID0gaW50b0Nvb3JkU3lzdGVtKGNtLCBsaW5lT2JqLCBtZWFzdXJlQ2hhclByZXBhcmVkKGNtLCBwcmVwYXJlZE1lYXN1cmUsIHRhcmdldCksIFwibGluZVwiKS50b3A7XG4gICAgcmV0dXJuIHdyYXBwZWRMaW5lRXh0ZW50KGNtLCBsaW5lT2JqLCBwcmVwYXJlZE1lYXN1cmUsIHRhcmdldFRvcClcbiAgfVxuXG4gIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gc2lkZSBvZiBhIGJveCBpcyBhZnRlciB0aGUgZ2l2ZW5cbiAgLy8gY29vcmRpbmF0ZXMsIGluIHRvcC10by1ib3R0b20sIGxlZnQtdG8tcmlnaHQgb3JkZXIuXG4gIGZ1bmN0aW9uIGJveElzQWZ0ZXIoYm94LCB4LCB5LCBsZWZ0KSB7XG4gICAgcmV0dXJuIGJveC5ib3R0b20gPD0geSA/IGZhbHNlIDogYm94LnRvcCA+IHkgPyB0cnVlIDogKGxlZnQgPyBib3gubGVmdCA6IGJveC5yaWdodCkgPiB4XG4gIH1cblxuICBmdW5jdGlvbiBjb29yZHNDaGFySW5uZXIoY20sIGxpbmVPYmosIGxpbmVObywgeCwgeSkge1xuICAgIC8vIE1vdmUgeSBpbnRvIGxpbmUtbG9jYWwgY29vcmRpbmF0ZSBzcGFjZVxuICAgIHkgLT0gaGVpZ2h0QXRMaW5lKGxpbmVPYmopO1xuICAgIHZhciBwcmVwYXJlZE1lYXN1cmUgPSBwcmVwYXJlTWVhc3VyZUZvckxpbmUoY20sIGxpbmVPYmopO1xuICAgIC8vIFdoZW4gZGlyZWN0bHkgY2FsbGluZyBgbWVhc3VyZUNoYXJQcmVwYXJlZGAsIHdlIGhhdmUgdG8gYWRqdXN0XG4gICAgLy8gZm9yIHRoZSB3aWRnZXRzIGF0IHRoaXMgbGluZS5cbiAgICB2YXIgd2lkZ2V0SGVpZ2h0ID0gd2lkZ2V0VG9wSGVpZ2h0KGxpbmVPYmopO1xuICAgIHZhciBiZWdpbiA9IDAsIGVuZCA9IGxpbmVPYmoudGV4dC5sZW5ndGgsIGx0ciA9IHRydWU7XG5cbiAgICB2YXIgb3JkZXIgPSBnZXRPcmRlcihsaW5lT2JqLCBjbS5kb2MuZGlyZWN0aW9uKTtcbiAgICAvLyBJZiB0aGUgbGluZSBpc24ndCBwbGFpbiBsZWZ0LXRvLXJpZ2h0IHRleHQsIGZpcnN0IGZpZ3VyZSBvdXRcbiAgICAvLyB3aGljaCBiaWRpIHNlY3Rpb24gdGhlIGNvb3JkaW5hdGVzIGZhbGwgaW50by5cbiAgICBpZiAob3JkZXIpIHtcbiAgICAgIHZhciBwYXJ0ID0gKGNtLm9wdGlvbnMubGluZVdyYXBwaW5nID8gY29vcmRzQmlkaVBhcnRXcmFwcGVkIDogY29vcmRzQmlkaVBhcnQpXG4gICAgICAgICAgICAgICAgICAgKGNtLCBsaW5lT2JqLCBsaW5lTm8sIHByZXBhcmVkTWVhc3VyZSwgb3JkZXIsIHgsIHkpO1xuICAgICAgbHRyID0gcGFydC5sZXZlbCAhPSAxO1xuICAgICAgLy8gVGhlIGF3a3dhcmQgLTEgb2Zmc2V0cyBhcmUgbmVlZGVkIGJlY2F1c2UgZmluZEZpcnN0IChjYWxsZWRcbiAgICAgIC8vIG9uIHRoZXNlIGJlbG93KSB3aWxsIHRyZWF0IGl0cyBmaXJzdCBib3VuZCBhcyBpbmNsdXNpdmUsXG4gICAgICAvLyBzZWNvbmQgYXMgZXhjbHVzaXZlLCBidXQgd2Ugd2FudCB0byBhY3R1YWxseSBhZGRyZXNzIHRoZVxuICAgICAgLy8gY2hhcmFjdGVycyBpbiB0aGUgcGFydCdzIHJhbmdlXG4gICAgICBiZWdpbiA9IGx0ciA/IHBhcnQuZnJvbSA6IHBhcnQudG8gLSAxO1xuICAgICAgZW5kID0gbHRyID8gcGFydC50byA6IHBhcnQuZnJvbSAtIDE7XG4gICAgfVxuXG4gICAgLy8gQSBiaW5hcnkgc2VhcmNoIHRvIGZpbmQgdGhlIGZpcnN0IGNoYXJhY3RlciB3aG9zZSBib3VuZGluZyBib3hcbiAgICAvLyBzdGFydHMgYWZ0ZXIgdGhlIGNvb3JkaW5hdGVzLiBJZiB3ZSBydW4gYWNyb3NzIGFueSB3aG9zZSBib3ggd3JhcFxuICAgIC8vIHRoZSBjb29yZGluYXRlcywgc3RvcmUgdGhhdC5cbiAgICB2YXIgY2hBcm91bmQgPSBudWxsLCBib3hBcm91bmQgPSBudWxsO1xuICAgIHZhciBjaCA9IGZpbmRGaXJzdChmdW5jdGlvbiAoY2gpIHtcbiAgICAgIHZhciBib3ggPSBtZWFzdXJlQ2hhclByZXBhcmVkKGNtLCBwcmVwYXJlZE1lYXN1cmUsIGNoKTtcbiAgICAgIGJveC50b3AgKz0gd2lkZ2V0SGVpZ2h0OyBib3guYm90dG9tICs9IHdpZGdldEhlaWdodDtcbiAgICAgIGlmICghYm94SXNBZnRlcihib3gsIHgsIHksIGZhbHNlKSkgeyByZXR1cm4gZmFsc2UgfVxuICAgICAgaWYgKGJveC50b3AgPD0geSAmJiBib3gubGVmdCA8PSB4KSB7XG4gICAgICAgIGNoQXJvdW5kID0gY2g7XG4gICAgICAgIGJveEFyb3VuZCA9IGJveDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSwgYmVnaW4sIGVuZCk7XG5cbiAgICB2YXIgYmFzZVgsIHN0aWNreSwgb3V0c2lkZSA9IGZhbHNlO1xuICAgIC8vIElmIGEgYm94IGFyb3VuZCB0aGUgY29vcmRpbmF0ZXMgd2FzIGZvdW5kLCB1c2UgdGhhdFxuICAgIGlmIChib3hBcm91bmQpIHtcbiAgICAgIC8vIERpc3Rpbmd1aXNoIGNvb3JkaW5hdGVzIG5lYXJlciB0byB0aGUgbGVmdCBvciByaWdodCBzaWRlIG9mIHRoZSBib3hcbiAgICAgIHZhciBhdExlZnQgPSB4IC0gYm94QXJvdW5kLmxlZnQgPCBib3hBcm91bmQucmlnaHQgLSB4LCBhdFN0YXJ0ID0gYXRMZWZ0ID09IGx0cjtcbiAgICAgIGNoID0gY2hBcm91bmQgKyAoYXRTdGFydCA/IDAgOiAxKTtcbiAgICAgIHN0aWNreSA9IGF0U3RhcnQgPyBcImFmdGVyXCIgOiBcImJlZm9yZVwiO1xuICAgICAgYmFzZVggPSBhdExlZnQgPyBib3hBcm91bmQubGVmdCA6IGJveEFyb3VuZC5yaWdodDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gKEFkanVzdCBmb3IgZXh0ZW5kZWQgYm91bmQsIGlmIG5lY2Vzc2FyeS4pXG4gICAgICBpZiAoIWx0ciAmJiAoY2ggPT0gZW5kIHx8IGNoID09IGJlZ2luKSkgeyBjaCsrOyB9XG4gICAgICAvLyBUbyBkZXRlcm1pbmUgd2hpY2ggc2lkZSB0byBhc3NvY2lhdGUgd2l0aCwgZ2V0IHRoZSBib3ggdG8gdGhlXG4gICAgICAvLyBsZWZ0IG9mIHRoZSBjaGFyYWN0ZXIgYW5kIGNvbXBhcmUgaXQncyB2ZXJ0aWNhbCBwb3NpdGlvbiB0byB0aGVcbiAgICAgIC8vIGNvb3JkaW5hdGVzXG4gICAgICBzdGlja3kgPSBjaCA9PSAwID8gXCJhZnRlclwiIDogY2ggPT0gbGluZU9iai50ZXh0Lmxlbmd0aCA/IFwiYmVmb3JlXCIgOlxuICAgICAgICAobWVhc3VyZUNoYXJQcmVwYXJlZChjbSwgcHJlcGFyZWRNZWFzdXJlLCBjaCAtIChsdHIgPyAxIDogMCkpLmJvdHRvbSArIHdpZGdldEhlaWdodCA8PSB5KSA9PSBsdHIgP1xuICAgICAgICBcImFmdGVyXCIgOiBcImJlZm9yZVwiO1xuICAgICAgLy8gTm93IGdldCBhY2N1cmF0ZSBjb29yZGluYXRlcyBmb3IgdGhpcyBwbGFjZSwgaW4gb3JkZXIgdG8gZ2V0IGFcbiAgICAgIC8vIGJhc2UgWCBwb3NpdGlvblxuICAgICAgdmFyIGNvb3JkcyA9IGN1cnNvckNvb3JkcyhjbSwgUG9zKGxpbmVObywgY2gsIHN0aWNreSksIFwibGluZVwiLCBsaW5lT2JqLCBwcmVwYXJlZE1lYXN1cmUpO1xuICAgICAgYmFzZVggPSBjb29yZHMubGVmdDtcbiAgICAgIG91dHNpZGUgPSB5IDwgY29vcmRzLnRvcCA/IC0xIDogeSA+PSBjb29yZHMuYm90dG9tID8gMSA6IDA7XG4gICAgfVxuXG4gICAgY2ggPSBza2lwRXh0ZW5kaW5nQ2hhcnMobGluZU9iai50ZXh0LCBjaCwgMSk7XG4gICAgcmV0dXJuIFBvc1dpdGhJbmZvKGxpbmVObywgY2gsIHN0aWNreSwgb3V0c2lkZSwgeCAtIGJhc2VYKVxuICB9XG5cbiAgZnVuY3Rpb24gY29vcmRzQmlkaVBhcnQoY20sIGxpbmVPYmosIGxpbmVObywgcHJlcGFyZWRNZWFzdXJlLCBvcmRlciwgeCwgeSkge1xuICAgIC8vIEJpZGkgcGFydHMgYXJlIHNvcnRlZCBsZWZ0LXRvLXJpZ2h0LCBhbmQgaW4gYSBub24tbGluZS13cmFwcGluZ1xuICAgIC8vIHNpdHVhdGlvbiwgd2UgY2FuIHRha2UgdGhpcyBvcmRlcmluZyB0byBjb3JyZXNwb25kIHRvIHRoZSB2aXN1YWxcbiAgICAvLyBvcmRlcmluZy4gVGhpcyBmaW5kcyB0aGUgZmlyc3QgcGFydCB3aG9zZSBlbmQgaXMgYWZ0ZXIgdGhlIGdpdmVuXG4gICAgLy8gY29vcmRpbmF0ZXMuXG4gICAgdmFyIGluZGV4ID0gZmluZEZpcnN0KGZ1bmN0aW9uIChpKSB7XG4gICAgICB2YXIgcGFydCA9IG9yZGVyW2ldLCBsdHIgPSBwYXJ0LmxldmVsICE9IDE7XG4gICAgICByZXR1cm4gYm94SXNBZnRlcihjdXJzb3JDb29yZHMoY20sIFBvcyhsaW5lTm8sIGx0ciA/IHBhcnQudG8gOiBwYXJ0LmZyb20sIGx0ciA/IFwiYmVmb3JlXCIgOiBcImFmdGVyXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibGluZVwiLCBsaW5lT2JqLCBwcmVwYXJlZE1lYXN1cmUpLCB4LCB5LCB0cnVlKVxuICAgIH0sIDAsIG9yZGVyLmxlbmd0aCAtIDEpO1xuICAgIHZhciBwYXJ0ID0gb3JkZXJbaW5kZXhdO1xuICAgIC8vIElmIHRoaXMgaXNuJ3QgdGhlIGZpcnN0IHBhcnQsIHRoZSBwYXJ0J3Mgc3RhcnQgaXMgYWxzbyBhZnRlclxuICAgIC8vIHRoZSBjb29yZGluYXRlcywgYW5kIHRoZSBjb29yZGluYXRlcyBhcmVuJ3Qgb24gdGhlIHNhbWUgbGluZSBhc1xuICAgIC8vIHRoYXQgc3RhcnQsIG1vdmUgb25lIHBhcnQgYmFjay5cbiAgICBpZiAoaW5kZXggPiAwKSB7XG4gICAgICB2YXIgbHRyID0gcGFydC5sZXZlbCAhPSAxO1xuICAgICAgdmFyIHN0YXJ0ID0gY3Vyc29yQ29vcmRzKGNtLCBQb3MobGluZU5vLCBsdHIgPyBwYXJ0LmZyb20gOiBwYXJ0LnRvLCBsdHIgPyBcImFmdGVyXCIgOiBcImJlZm9yZVwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImxpbmVcIiwgbGluZU9iaiwgcHJlcGFyZWRNZWFzdXJlKTtcbiAgICAgIGlmIChib3hJc0FmdGVyKHN0YXJ0LCB4LCB5LCB0cnVlKSAmJiBzdGFydC50b3AgPiB5KVxuICAgICAgICB7IHBhcnQgPSBvcmRlcltpbmRleCAtIDFdOyB9XG4gICAgfVxuICAgIHJldHVybiBwYXJ0XG4gIH1cblxuICBmdW5jdGlvbiBjb29yZHNCaWRpUGFydFdyYXBwZWQoY20sIGxpbmVPYmosIF9saW5lTm8sIHByZXBhcmVkTWVhc3VyZSwgb3JkZXIsIHgsIHkpIHtcbiAgICAvLyBJbiBhIHdyYXBwZWQgbGluZSwgcnRsIHRleHQgb24gd3JhcHBpbmcgYm91bmRhcmllcyBjYW4gZG8gdGhpbmdzXG4gICAgLy8gdGhhdCBkb24ndCBjb3JyZXNwb25kIHRvIHRoZSBvcmRlcmluZyBpbiBvdXIgYG9yZGVyYCBhcnJheSBhdFxuICAgIC8vIGFsbCwgc28gYSBiaW5hcnkgc2VhcmNoIGRvZXNuJ3Qgd29yaywgYW5kIHdlIHdhbnQgdG8gcmV0dXJuIGFcbiAgICAvLyBwYXJ0IHRoYXQgb25seSBzcGFucyBvbmUgbGluZSBzbyB0aGF0IHRoZSBiaW5hcnkgc2VhcmNoIGluXG4gICAgLy8gY29vcmRzQ2hhcklubmVyIGlzIHNhZmUuIEFzIHN1Y2gsIHdlIGZpcnN0IGZpbmQgdGhlIGV4dGVudCBvZiB0aGVcbiAgICAvLyB3cmFwcGVkIGxpbmUsIGFuZCB0aGVuIGRvIGEgZmxhdCBzZWFyY2ggaW4gd2hpY2ggd2UgZGlzY2FyZCBhbnlcbiAgICAvLyBzcGFucyB0aGF0IGFyZW4ndCBvbiB0aGUgbGluZS5cbiAgICB2YXIgcmVmID0gd3JhcHBlZExpbmVFeHRlbnQoY20sIGxpbmVPYmosIHByZXBhcmVkTWVhc3VyZSwgeSk7XG4gICAgdmFyIGJlZ2luID0gcmVmLmJlZ2luO1xuICAgIHZhciBlbmQgPSByZWYuZW5kO1xuICAgIGlmICgvXFxzLy50ZXN0KGxpbmVPYmoudGV4dC5jaGFyQXQoZW5kIC0gMSkpKSB7IGVuZC0tOyB9XG4gICAgdmFyIHBhcnQgPSBudWxsLCBjbG9zZXN0RGlzdCA9IG51bGw7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcmRlci5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHAgPSBvcmRlcltpXTtcbiAgICAgIGlmIChwLmZyb20gPj0gZW5kIHx8IHAudG8gPD0gYmVnaW4pIHsgY29udGludWUgfVxuICAgICAgdmFyIGx0ciA9IHAubGV2ZWwgIT0gMTtcbiAgICAgIHZhciBlbmRYID0gbWVhc3VyZUNoYXJQcmVwYXJlZChjbSwgcHJlcGFyZWRNZWFzdXJlLCBsdHIgPyBNYXRoLm1pbihlbmQsIHAudG8pIC0gMSA6IE1hdGgubWF4KGJlZ2luLCBwLmZyb20pKS5yaWdodDtcbiAgICAgIC8vIFdlaWdoIGFnYWluc3Qgc3BhbnMgZW5kaW5nIGJlZm9yZSB0aGlzLCBzbyB0aGF0IHRoZXkgYXJlIG9ubHlcbiAgICAgIC8vIHBpY2tlZCBpZiBub3RoaW5nIGVuZHMgYWZ0ZXJcbiAgICAgIHZhciBkaXN0ID0gZW5kWCA8IHggPyB4IC0gZW5kWCArIDFlOSA6IGVuZFggLSB4O1xuICAgICAgaWYgKCFwYXJ0IHx8IGNsb3Nlc3REaXN0ID4gZGlzdCkge1xuICAgICAgICBwYXJ0ID0gcDtcbiAgICAgICAgY2xvc2VzdERpc3QgPSBkaXN0O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXBhcnQpIHsgcGFydCA9IG9yZGVyW29yZGVyLmxlbmd0aCAtIDFdOyB9XG4gICAgLy8gQ2xpcCB0aGUgcGFydCB0byB0aGUgd3JhcHBlZCBsaW5lLlxuICAgIGlmIChwYXJ0LmZyb20gPCBiZWdpbikgeyBwYXJ0ID0ge2Zyb206IGJlZ2luLCB0bzogcGFydC50bywgbGV2ZWw6IHBhcnQubGV2ZWx9OyB9XG4gICAgaWYgKHBhcnQudG8gPiBlbmQpIHsgcGFydCA9IHtmcm9tOiBwYXJ0LmZyb20sIHRvOiBlbmQsIGxldmVsOiBwYXJ0LmxldmVsfTsgfVxuICAgIHJldHVybiBwYXJ0XG4gIH1cblxuICB2YXIgbWVhc3VyZVRleHQ7XG4gIC8vIENvbXB1dGUgdGhlIGRlZmF1bHQgdGV4dCBoZWlnaHQuXG4gIGZ1bmN0aW9uIHRleHRIZWlnaHQoZGlzcGxheSkge1xuICAgIGlmIChkaXNwbGF5LmNhY2hlZFRleHRIZWlnaHQgIT0gbnVsbCkgeyByZXR1cm4gZGlzcGxheS5jYWNoZWRUZXh0SGVpZ2h0IH1cbiAgICBpZiAobWVhc3VyZVRleHQgPT0gbnVsbCkge1xuICAgICAgbWVhc3VyZVRleHQgPSBlbHQoXCJwcmVcIiwgbnVsbCwgXCJDb2RlTWlycm9yLWxpbmUtbGlrZVwiKTtcbiAgICAgIC8vIE1lYXN1cmUgYSBidW5jaCBvZiBsaW5lcywgZm9yIGJyb3dzZXJzIHRoYXQgY29tcHV0ZVxuICAgICAgLy8gZnJhY3Rpb25hbCBoZWlnaHRzLlxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OTsgKytpKSB7XG4gICAgICAgIG1lYXN1cmVUZXh0LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwieFwiKSk7XG4gICAgICAgIG1lYXN1cmVUZXh0LmFwcGVuZENoaWxkKGVsdChcImJyXCIpKTtcbiAgICAgIH1cbiAgICAgIG1lYXN1cmVUZXh0LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwieFwiKSk7XG4gICAgfVxuICAgIHJlbW92ZUNoaWxkcmVuQW5kQWRkKGRpc3BsYXkubWVhc3VyZSwgbWVhc3VyZVRleHQpO1xuICAgIHZhciBoZWlnaHQgPSBtZWFzdXJlVGV4dC5vZmZzZXRIZWlnaHQgLyA1MDtcbiAgICBpZiAoaGVpZ2h0ID4gMykgeyBkaXNwbGF5LmNhY2hlZFRleHRIZWlnaHQgPSBoZWlnaHQ7IH1cbiAgICByZW1vdmVDaGlsZHJlbihkaXNwbGF5Lm1lYXN1cmUpO1xuICAgIHJldHVybiBoZWlnaHQgfHwgMVxuICB9XG5cbiAgLy8gQ29tcHV0ZSB0aGUgZGVmYXVsdCBjaGFyYWN0ZXIgd2lkdGguXG4gIGZ1bmN0aW9uIGNoYXJXaWR0aChkaXNwbGF5KSB7XG4gICAgaWYgKGRpc3BsYXkuY2FjaGVkQ2hhcldpZHRoICE9IG51bGwpIHsgcmV0dXJuIGRpc3BsYXkuY2FjaGVkQ2hhcldpZHRoIH1cbiAgICB2YXIgYW5jaG9yID0gZWx0KFwic3BhblwiLCBcInh4eHh4eHh4eHhcIik7XG4gICAgdmFyIHByZSA9IGVsdChcInByZVwiLCBbYW5jaG9yXSwgXCJDb2RlTWlycm9yLWxpbmUtbGlrZVwiKTtcbiAgICByZW1vdmVDaGlsZHJlbkFuZEFkZChkaXNwbGF5Lm1lYXN1cmUsIHByZSk7XG4gICAgdmFyIHJlY3QgPSBhbmNob3IuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIHdpZHRoID0gKHJlY3QucmlnaHQgLSByZWN0LmxlZnQpIC8gMTA7XG4gICAgaWYgKHdpZHRoID4gMikgeyBkaXNwbGF5LmNhY2hlZENoYXJXaWR0aCA9IHdpZHRoOyB9XG4gICAgcmV0dXJuIHdpZHRoIHx8IDEwXG4gIH1cblxuICAvLyBEbyBhIGJ1bGstcmVhZCBvZiB0aGUgRE9NIHBvc2l0aW9ucyBhbmQgc2l6ZXMgbmVlZGVkIHRvIGRyYXcgdGhlXG4gIC8vIHZpZXcsIHNvIHRoYXQgd2UgZG9uJ3QgaW50ZXJsZWF2ZSByZWFkaW5nIGFuZCB3cml0aW5nIHRvIHRoZSBET00uXG4gIGZ1bmN0aW9uIGdldERpbWVuc2lvbnMoY20pIHtcbiAgICB2YXIgZCA9IGNtLmRpc3BsYXksIGxlZnQgPSB7fSwgd2lkdGggPSB7fTtcbiAgICB2YXIgZ3V0dGVyTGVmdCA9IGQuZ3V0dGVycy5jbGllbnRMZWZ0O1xuICAgIGZvciAodmFyIG4gPSBkLmd1dHRlcnMuZmlyc3RDaGlsZCwgaSA9IDA7IG47IG4gPSBuLm5leHRTaWJsaW5nLCArK2kpIHtcbiAgICAgIHZhciBpZCA9IGNtLmRpc3BsYXkuZ3V0dGVyU3BlY3NbaV0uY2xhc3NOYW1lO1xuICAgICAgbGVmdFtpZF0gPSBuLm9mZnNldExlZnQgKyBuLmNsaWVudExlZnQgKyBndXR0ZXJMZWZ0O1xuICAgICAgd2lkdGhbaWRdID0gbi5jbGllbnRXaWR0aDtcbiAgICB9XG4gICAgcmV0dXJuIHtmaXhlZFBvczogY29tcGVuc2F0ZUZvckhTY3JvbGwoZCksXG4gICAgICAgICAgICBndXR0ZXJUb3RhbFdpZHRoOiBkLmd1dHRlcnMub2Zmc2V0V2lkdGgsXG4gICAgICAgICAgICBndXR0ZXJMZWZ0OiBsZWZ0LFxuICAgICAgICAgICAgZ3V0dGVyV2lkdGg6IHdpZHRoLFxuICAgICAgICAgICAgd3JhcHBlcldpZHRoOiBkLndyYXBwZXIuY2xpZW50V2lkdGh9XG4gIH1cblxuICAvLyBDb21wdXRlcyBkaXNwbGF5LnNjcm9sbGVyLnNjcm9sbExlZnQgKyBkaXNwbGF5Lmd1dHRlcnMub2Zmc2V0V2lkdGgsXG4gIC8vIGJ1dCB1c2luZyBnZXRCb3VuZGluZ0NsaWVudFJlY3QgdG8gZ2V0IGEgc3ViLXBpeGVsLWFjY3VyYXRlXG4gIC8vIHJlc3VsdC5cbiAgZnVuY3Rpb24gY29tcGVuc2F0ZUZvckhTY3JvbGwoZGlzcGxheSkge1xuICAgIHJldHVybiBkaXNwbGF5LnNjcm9sbGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLSBkaXNwbGF5LnNpemVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnRcbiAgfVxuXG4gIC8vIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGVzdGltYXRlcyB0aGUgaGVpZ2h0IG9mIGEgbGluZSwgdG8gdXNlIGFzXG4gIC8vIGZpcnN0IGFwcHJveGltYXRpb24gdW50aWwgdGhlIGxpbmUgYmVjb21lcyB2aXNpYmxlIChhbmQgaXMgdGh1c1xuICAvLyBwcm9wZXJseSBtZWFzdXJhYmxlKS5cbiAgZnVuY3Rpb24gZXN0aW1hdGVIZWlnaHQoY20pIHtcbiAgICB2YXIgdGggPSB0ZXh0SGVpZ2h0KGNtLmRpc3BsYXkpLCB3cmFwcGluZyA9IGNtLm9wdGlvbnMubGluZVdyYXBwaW5nO1xuICAgIHZhciBwZXJMaW5lID0gd3JhcHBpbmcgJiYgTWF0aC5tYXgoNSwgY20uZGlzcGxheS5zY3JvbGxlci5jbGllbnRXaWR0aCAvIGNoYXJXaWR0aChjbS5kaXNwbGF5KSAtIDMpO1xuICAgIHJldHVybiBmdW5jdGlvbiAobGluZSkge1xuICAgICAgaWYgKGxpbmVJc0hpZGRlbihjbS5kb2MsIGxpbmUpKSB7IHJldHVybiAwIH1cblxuICAgICAgdmFyIHdpZGdldHNIZWlnaHQgPSAwO1xuICAgICAgaWYgKGxpbmUud2lkZ2V0cykgeyBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmUud2lkZ2V0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAobGluZS53aWRnZXRzW2ldLmhlaWdodCkgeyB3aWRnZXRzSGVpZ2h0ICs9IGxpbmUud2lkZ2V0c1tpXS5oZWlnaHQ7IH1cbiAgICAgIH0gfVxuXG4gICAgICBpZiAod3JhcHBpbmcpXG4gICAgICAgIHsgcmV0dXJuIHdpZGdldHNIZWlnaHQgKyAoTWF0aC5jZWlsKGxpbmUudGV4dC5sZW5ndGggLyBwZXJMaW5lKSB8fCAxKSAqIHRoIH1cbiAgICAgIGVsc2VcbiAgICAgICAgeyByZXR1cm4gd2lkZ2V0c0hlaWdodCArIHRoIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBlc3RpbWF0ZUxpbmVIZWlnaHRzKGNtKSB7XG4gICAgdmFyIGRvYyA9IGNtLmRvYywgZXN0ID0gZXN0aW1hdGVIZWlnaHQoY20pO1xuICAgIGRvYy5pdGVyKGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgICB2YXIgZXN0SGVpZ2h0ID0gZXN0KGxpbmUpO1xuICAgICAgaWYgKGVzdEhlaWdodCAhPSBsaW5lLmhlaWdodCkgeyB1cGRhdGVMaW5lSGVpZ2h0KGxpbmUsIGVzdEhlaWdodCk7IH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIEdpdmVuIGEgbW91c2UgZXZlbnQsIGZpbmQgdGhlIGNvcnJlc3BvbmRpbmcgcG9zaXRpb24uIElmIGxpYmVyYWxcbiAgLy8gaXMgZmFsc2UsIGl0IGNoZWNrcyB3aGV0aGVyIGEgZ3V0dGVyIG9yIHNjcm9sbGJhciB3YXMgY2xpY2tlZCxcbiAgLy8gYW5kIHJldHVybnMgbnVsbCBpZiBpdCB3YXMuIGZvclJlY3QgaXMgdXNlZCBieSByZWN0YW5ndWxhclxuICAvLyBzZWxlY3Rpb25zLCBhbmQgdHJpZXMgdG8gZXN0aW1hdGUgYSBjaGFyYWN0ZXIgcG9zaXRpb24gZXZlbiBmb3JcbiAgLy8gY29vcmRpbmF0ZXMgYmV5b25kIHRoZSByaWdodCBvZiB0aGUgdGV4dC5cbiAgZnVuY3Rpb24gcG9zRnJvbU1vdXNlKGNtLCBlLCBsaWJlcmFsLCBmb3JSZWN0KSB7XG4gICAgdmFyIGRpc3BsYXkgPSBjbS5kaXNwbGF5O1xuICAgIGlmICghbGliZXJhbCAmJiBlX3RhcmdldChlKS5nZXRBdHRyaWJ1dGUoXCJjbS1ub3QtY29udGVudFwiKSA9PSBcInRydWVcIikgeyByZXR1cm4gbnVsbCB9XG5cbiAgICB2YXIgeCwgeSwgc3BhY2UgPSBkaXNwbGF5LmxpbmVTcGFjZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAvLyBGYWlscyB1bnByZWRpY3RhYmx5IG9uIElFWzY3XSB3aGVuIG1vdXNlIGlzIGRyYWdnZWQgYXJvdW5kIHF1aWNrbHkuXG4gICAgdHJ5IHsgeCA9IGUuY2xpZW50WCAtIHNwYWNlLmxlZnQ7IHkgPSBlLmNsaWVudFkgLSBzcGFjZS50b3A7IH1cbiAgICBjYXRjaCAoZSQxKSB7IHJldHVybiBudWxsIH1cbiAgICB2YXIgY29vcmRzID0gY29vcmRzQ2hhcihjbSwgeCwgeSksIGxpbmU7XG4gICAgaWYgKGZvclJlY3QgJiYgY29vcmRzLnhSZWwgPiAwICYmIChsaW5lID0gZ2V0TGluZShjbS5kb2MsIGNvb3Jkcy5saW5lKS50ZXh0KS5sZW5ndGggPT0gY29vcmRzLmNoKSB7XG4gICAgICB2YXIgY29sRGlmZiA9IGNvdW50Q29sdW1uKGxpbmUsIGxpbmUubGVuZ3RoLCBjbS5vcHRpb25zLnRhYlNpemUpIC0gbGluZS5sZW5ndGg7XG4gICAgICBjb29yZHMgPSBQb3MoY29vcmRzLmxpbmUsIE1hdGgubWF4KDAsIE1hdGgucm91bmQoKHggLSBwYWRkaW5nSChjbS5kaXNwbGF5KS5sZWZ0KSAvIGNoYXJXaWR0aChjbS5kaXNwbGF5KSkgLSBjb2xEaWZmKSk7XG4gICAgfVxuICAgIHJldHVybiBjb29yZHNcbiAgfVxuXG4gIC8vIEZpbmQgdGhlIHZpZXcgZWxlbWVudCBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4gbGluZS4gUmV0dXJuIG51bGxcbiAgLy8gd2hlbiB0aGUgbGluZSBpc24ndCB2aXNpYmxlLlxuICBmdW5jdGlvbiBmaW5kVmlld0luZGV4KGNtLCBuKSB7XG4gICAgaWYgKG4gPj0gY20uZGlzcGxheS52aWV3VG8pIHsgcmV0dXJuIG51bGwgfVxuICAgIG4gLT0gY20uZGlzcGxheS52aWV3RnJvbTtcbiAgICBpZiAobiA8IDApIHsgcmV0dXJuIG51bGwgfVxuICAgIHZhciB2aWV3ID0gY20uZGlzcGxheS52aWV3O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmlldy5sZW5ndGg7IGkrKykge1xuICAgICAgbiAtPSB2aWV3W2ldLnNpemU7XG4gICAgICBpZiAobiA8IDApIHsgcmV0dXJuIGkgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFVwZGF0ZXMgdGhlIGRpc3BsYXkudmlldyBkYXRhIHN0cnVjdHVyZSBmb3IgYSBnaXZlbiBjaGFuZ2UgdG8gdGhlXG4gIC8vIGRvY3VtZW50LiBGcm9tIGFuZCB0byBhcmUgaW4gcHJlLWNoYW5nZSBjb29yZGluYXRlcy4gTGVuZGlmZiBpc1xuICAvLyB0aGUgYW1vdW50IG9mIGxpbmVzIGFkZGVkIG9yIHN1YnRyYWN0ZWQgYnkgdGhlIGNoYW5nZS4gVGhpcyBpc1xuICAvLyB1c2VkIGZvciBjaGFuZ2VzIHRoYXQgc3BhbiBtdWx0aXBsZSBsaW5lcywgb3IgY2hhbmdlIHRoZSB3YXlcbiAgLy8gbGluZXMgYXJlIGRpdmlkZWQgaW50byB2aXN1YWwgbGluZXMuIHJlZ0xpbmVDaGFuZ2UgKGJlbG93KVxuICAvLyByZWdpc3RlcnMgc2luZ2xlLWxpbmUgY2hhbmdlcy5cbiAgZnVuY3Rpb24gcmVnQ2hhbmdlKGNtLCBmcm9tLCB0bywgbGVuZGlmZikge1xuICAgIGlmIChmcm9tID09IG51bGwpIHsgZnJvbSA9IGNtLmRvYy5maXJzdDsgfVxuICAgIGlmICh0byA9PSBudWxsKSB7IHRvID0gY20uZG9jLmZpcnN0ICsgY20uZG9jLnNpemU7IH1cbiAgICBpZiAoIWxlbmRpZmYpIHsgbGVuZGlmZiA9IDA7IH1cblxuICAgIHZhciBkaXNwbGF5ID0gY20uZGlzcGxheTtcbiAgICBpZiAobGVuZGlmZiAmJiB0byA8IGRpc3BsYXkudmlld1RvICYmXG4gICAgICAgIChkaXNwbGF5LnVwZGF0ZUxpbmVOdW1iZXJzID09IG51bGwgfHwgZGlzcGxheS51cGRhdGVMaW5lTnVtYmVycyA+IGZyb20pKVxuICAgICAgeyBkaXNwbGF5LnVwZGF0ZUxpbmVOdW1iZXJzID0gZnJvbTsgfVxuXG4gICAgY20uY3VyT3Audmlld0NoYW5nZWQgPSB0cnVlO1xuXG4gICAgaWYgKGZyb20gPj0gZGlzcGxheS52aWV3VG8pIHsgLy8gQ2hhbmdlIGFmdGVyXG4gICAgICBpZiAoc2F3Q29sbGFwc2VkU3BhbnMgJiYgdmlzdWFsTGluZU5vKGNtLmRvYywgZnJvbSkgPCBkaXNwbGF5LnZpZXdUbylcbiAgICAgICAgeyByZXNldFZpZXcoY20pOyB9XG4gICAgfSBlbHNlIGlmICh0byA8PSBkaXNwbGF5LnZpZXdGcm9tKSB7IC8vIENoYW5nZSBiZWZvcmVcbiAgICAgIGlmIChzYXdDb2xsYXBzZWRTcGFucyAmJiB2aXN1YWxMaW5lRW5kTm8oY20uZG9jLCB0byArIGxlbmRpZmYpID4gZGlzcGxheS52aWV3RnJvbSkge1xuICAgICAgICByZXNldFZpZXcoY20pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGlzcGxheS52aWV3RnJvbSArPSBsZW5kaWZmO1xuICAgICAgICBkaXNwbGF5LnZpZXdUbyArPSBsZW5kaWZmO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZnJvbSA8PSBkaXNwbGF5LnZpZXdGcm9tICYmIHRvID49IGRpc3BsYXkudmlld1RvKSB7IC8vIEZ1bGwgb3ZlcmxhcFxuICAgICAgcmVzZXRWaWV3KGNtKTtcbiAgICB9IGVsc2UgaWYgKGZyb20gPD0gZGlzcGxheS52aWV3RnJvbSkgeyAvLyBUb3Agb3ZlcmxhcFxuICAgICAgdmFyIGN1dCA9IHZpZXdDdXR0aW5nUG9pbnQoY20sIHRvLCB0byArIGxlbmRpZmYsIDEpO1xuICAgICAgaWYgKGN1dCkge1xuICAgICAgICBkaXNwbGF5LnZpZXcgPSBkaXNwbGF5LnZpZXcuc2xpY2UoY3V0LmluZGV4KTtcbiAgICAgICAgZGlzcGxheS52aWV3RnJvbSA9IGN1dC5saW5lTjtcbiAgICAgICAgZGlzcGxheS52aWV3VG8gKz0gbGVuZGlmZjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc2V0VmlldyhjbSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0byA+PSBkaXNwbGF5LnZpZXdUbykgeyAvLyBCb3R0b20gb3ZlcmxhcFxuICAgICAgdmFyIGN1dCQxID0gdmlld0N1dHRpbmdQb2ludChjbSwgZnJvbSwgZnJvbSwgLTEpO1xuICAgICAgaWYgKGN1dCQxKSB7XG4gICAgICAgIGRpc3BsYXkudmlldyA9IGRpc3BsYXkudmlldy5zbGljZSgwLCBjdXQkMS5pbmRleCk7XG4gICAgICAgIGRpc3BsYXkudmlld1RvID0gY3V0JDEubGluZU47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNldFZpZXcoY20pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7IC8vIEdhcCBpbiB0aGUgbWlkZGxlXG4gICAgICB2YXIgY3V0VG9wID0gdmlld0N1dHRpbmdQb2ludChjbSwgZnJvbSwgZnJvbSwgLTEpO1xuICAgICAgdmFyIGN1dEJvdCA9IHZpZXdDdXR0aW5nUG9pbnQoY20sIHRvLCB0byArIGxlbmRpZmYsIDEpO1xuICAgICAgaWYgKGN1dFRvcCAmJiBjdXRCb3QpIHtcbiAgICAgICAgZGlzcGxheS52aWV3ID0gZGlzcGxheS52aWV3LnNsaWNlKDAsIGN1dFRvcC5pbmRleClcbiAgICAgICAgICAuY29uY2F0KGJ1aWxkVmlld0FycmF5KGNtLCBjdXRUb3AubGluZU4sIGN1dEJvdC5saW5lTikpXG4gICAgICAgICAgLmNvbmNhdChkaXNwbGF5LnZpZXcuc2xpY2UoY3V0Qm90LmluZGV4KSk7XG4gICAgICAgIGRpc3BsYXkudmlld1RvICs9IGxlbmRpZmY7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNldFZpZXcoY20pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBleHQgPSBkaXNwbGF5LmV4dGVybmFsTWVhc3VyZWQ7XG4gICAgaWYgKGV4dCkge1xuICAgICAgaWYgKHRvIDwgZXh0LmxpbmVOKVxuICAgICAgICB7IGV4dC5saW5lTiArPSBsZW5kaWZmOyB9XG4gICAgICBlbHNlIGlmIChmcm9tIDwgZXh0LmxpbmVOICsgZXh0LnNpemUpXG4gICAgICAgIHsgZGlzcGxheS5leHRlcm5hbE1lYXN1cmVkID0gbnVsbDsgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFJlZ2lzdGVyIGEgY2hhbmdlIHRvIGEgc2luZ2xlIGxpbmUuIFR5cGUgbXVzdCBiZSBvbmUgb2YgXCJ0ZXh0XCIsXG4gIC8vIFwiZ3V0dGVyXCIsIFwiY2xhc3NcIiwgXCJ3aWRnZXRcIlxuICBmdW5jdGlvbiByZWdMaW5lQ2hhbmdlKGNtLCBsaW5lLCB0eXBlKSB7XG4gICAgY20uY3VyT3Audmlld0NoYW5nZWQgPSB0cnVlO1xuICAgIHZhciBkaXNwbGF5ID0gY20uZGlzcGxheSwgZXh0ID0gY20uZGlzcGxheS5leHRlcm5hbE1lYXN1cmVkO1xuICAgIGlmIChleHQgJiYgbGluZSA+PSBleHQubGluZU4gJiYgbGluZSA8IGV4dC5saW5lTiArIGV4dC5zaXplKVxuICAgICAgeyBkaXNwbGF5LmV4dGVybmFsTWVhc3VyZWQgPSBudWxsOyB9XG5cbiAgICBpZiAobGluZSA8IGRpc3BsYXkudmlld0Zyb20gfHwgbGluZSA+PSBkaXNwbGF5LnZpZXdUbykgeyByZXR1cm4gfVxuICAgIHZhciBsaW5lVmlldyA9IGRpc3BsYXkudmlld1tmaW5kVmlld0luZGV4KGNtLCBsaW5lKV07XG4gICAgaWYgKGxpbmVWaWV3Lm5vZGUgPT0gbnVsbCkgeyByZXR1cm4gfVxuICAgIHZhciBhcnIgPSBsaW5lVmlldy5jaGFuZ2VzIHx8IChsaW5lVmlldy5jaGFuZ2VzID0gW10pO1xuICAgIGlmIChpbmRleE9mKGFyciwgdHlwZSkgPT0gLTEpIHsgYXJyLnB1c2godHlwZSk7IH1cbiAgfVxuXG4gIC8vIENsZWFyIHRoZSB2aWV3LlxuICBmdW5jdGlvbiByZXNldFZpZXcoY20pIHtcbiAgICBjbS5kaXNwbGF5LnZpZXdGcm9tID0gY20uZGlzcGxheS52aWV3VG8gPSBjbS5kb2MuZmlyc3Q7XG4gICAgY20uZGlzcGxheS52aWV3ID0gW107XG4gICAgY20uZGlzcGxheS52aWV3T2Zmc2V0ID0gMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHZpZXdDdXR0aW5nUG9pbnQoY20sIG9sZE4sIG5ld04sIGRpcikge1xuICAgIHZhciBpbmRleCA9IGZpbmRWaWV3SW5kZXgoY20sIG9sZE4pLCBkaWZmLCB2aWV3ID0gY20uZGlzcGxheS52aWV3O1xuICAgIGlmICghc2F3Q29sbGFwc2VkU3BhbnMgfHwgbmV3TiA9PSBjbS5kb2MuZmlyc3QgKyBjbS5kb2Muc2l6ZSlcbiAgICAgIHsgcmV0dXJuIHtpbmRleDogaW5kZXgsIGxpbmVOOiBuZXdOfSB9XG4gICAgdmFyIG4gPSBjbS5kaXNwbGF5LnZpZXdGcm9tO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5kZXg7IGkrKylcbiAgICAgIHsgbiArPSB2aWV3W2ldLnNpemU7IH1cbiAgICBpZiAobiAhPSBvbGROKSB7XG4gICAgICBpZiAoZGlyID4gMCkge1xuICAgICAgICBpZiAoaW5kZXggPT0gdmlldy5sZW5ndGggLSAxKSB7IHJldHVybiBudWxsIH1cbiAgICAgICAgZGlmZiA9IChuICsgdmlld1tpbmRleF0uc2l6ZSkgLSBvbGROO1xuICAgICAgICBpbmRleCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGlmZiA9IG4gLSBvbGROO1xuICAgICAgfVxuICAgICAgb2xkTiArPSBkaWZmOyBuZXdOICs9IGRpZmY7XG4gICAgfVxuICAgIHdoaWxlICh2aXN1YWxMaW5lTm8oY20uZG9jLCBuZXdOKSAhPSBuZXdOKSB7XG4gICAgICBpZiAoaW5kZXggPT0gKGRpciA8IDAgPyAwIDogdmlldy5sZW5ndGggLSAxKSkgeyByZXR1cm4gbnVsbCB9XG4gICAgICBuZXdOICs9IGRpciAqIHZpZXdbaW5kZXggLSAoZGlyIDwgMCA/IDEgOiAwKV0uc2l6ZTtcbiAgICAgIGluZGV4ICs9IGRpcjtcbiAgICB9XG4gICAgcmV0dXJuIHtpbmRleDogaW5kZXgsIGxpbmVOOiBuZXdOfVxuICB9XG5cbiAgLy8gRm9yY2UgdGhlIHZpZXcgdG8gY292ZXIgYSBnaXZlbiByYW5nZSwgYWRkaW5nIGVtcHR5IHZpZXcgZWxlbWVudFxuICAvLyBvciBjbGlwcGluZyBvZmYgZXhpc3Rpbmcgb25lcyBhcyBuZWVkZWQuXG4gIGZ1bmN0aW9uIGFkanVzdFZpZXcoY20sIGZyb20sIHRvKSB7XG4gICAgdmFyIGRpc3BsYXkgPSBjbS5kaXNwbGF5LCB2aWV3ID0gZGlzcGxheS52aWV3O1xuICAgIGlmICh2aWV3Lmxlbmd0aCA9PSAwIHx8IGZyb20gPj0gZGlzcGxheS52aWV3VG8gfHwgdG8gPD0gZGlzcGxheS52aWV3RnJvbSkge1xuICAgICAgZGlzcGxheS52aWV3ID0gYnVpbGRWaWV3QXJyYXkoY20sIGZyb20sIHRvKTtcbiAgICAgIGRpc3BsYXkudmlld0Zyb20gPSBmcm9tO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZGlzcGxheS52aWV3RnJvbSA+IGZyb20pXG4gICAgICAgIHsgZGlzcGxheS52aWV3ID0gYnVpbGRWaWV3QXJyYXkoY20sIGZyb20sIGRpc3BsYXkudmlld0Zyb20pLmNvbmNhdChkaXNwbGF5LnZpZXcpOyB9XG4gICAgICBlbHNlIGlmIChkaXNwbGF5LnZpZXdGcm9tIDwgZnJvbSlcbiAgICAgICAgeyBkaXNwbGF5LnZpZXcgPSBkaXNwbGF5LnZpZXcuc2xpY2UoZmluZFZpZXdJbmRleChjbSwgZnJvbSkpOyB9XG4gICAgICBkaXNwbGF5LnZpZXdGcm9tID0gZnJvbTtcbiAgICAgIGlmIChkaXNwbGF5LnZpZXdUbyA8IHRvKVxuICAgICAgICB7IGRpc3BsYXkudmlldyA9IGRpc3BsYXkudmlldy5jb25jYXQoYnVpbGRWaWV3QXJyYXkoY20sIGRpc3BsYXkudmlld1RvLCB0bykpOyB9XG4gICAgICBlbHNlIGlmIChkaXNwbGF5LnZpZXdUbyA+IHRvKVxuICAgICAgICB7IGRpc3BsYXkudmlldyA9IGRpc3BsYXkudmlldy5zbGljZSgwLCBmaW5kVmlld0luZGV4KGNtLCB0bykpOyB9XG4gICAgfVxuICAgIGRpc3BsYXkudmlld1RvID0gdG87XG4gIH1cblxuICAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIGxpbmVzIGluIHRoZSB2aWV3IHdob3NlIERPTSByZXByZXNlbnRhdGlvbiBpc1xuICAvLyBvdXQgb2YgZGF0ZSAob3Igbm9uZXhpc3RlbnQpLlxuICBmdW5jdGlvbiBjb3VudERpcnR5VmlldyhjbSkge1xuICAgIHZhciB2aWV3ID0gY20uZGlzcGxheS52aWV3LCBkaXJ0eSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2aWV3Lmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbGluZVZpZXcgPSB2aWV3W2ldO1xuICAgICAgaWYgKCFsaW5lVmlldy5oaWRkZW4gJiYgKCFsaW5lVmlldy5ub2RlIHx8IGxpbmVWaWV3LmNoYW5nZXMpKSB7ICsrZGlydHk7IH1cbiAgICB9XG4gICAgcmV0dXJuIGRpcnR5XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVTZWxlY3Rpb24oY20pIHtcbiAgICBjbS5kaXNwbGF5LmlucHV0LnNob3dTZWxlY3Rpb24oY20uZGlzcGxheS5pbnB1dC5wcmVwYXJlU2VsZWN0aW9uKCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJlcGFyZVNlbGVjdGlvbihjbSwgcHJpbWFyeSkge1xuICAgIGlmICggcHJpbWFyeSA9PT0gdm9pZCAwICkgcHJpbWFyeSA9IHRydWU7XG5cbiAgICB2YXIgZG9jID0gY20uZG9jLCByZXN1bHQgPSB7fTtcbiAgICB2YXIgY3VyRnJhZ21lbnQgPSByZXN1bHQuY3Vyc29ycyA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgICB2YXIgc2VsRnJhZ21lbnQgPSByZXN1bHQuc2VsZWN0aW9uID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkb2Muc2VsLnJhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFwcmltYXJ5ICYmIGkgPT0gZG9jLnNlbC5wcmltSW5kZXgpIHsgY29udGludWUgfVxuICAgICAgdmFyIHJhbmdlID0gZG9jLnNlbC5yYW5nZXNbaV07XG4gICAgICBpZiAocmFuZ2UuZnJvbSgpLmxpbmUgPj0gY20uZGlzcGxheS52aWV3VG8gfHwgcmFuZ2UudG8oKS5saW5lIDwgY20uZGlzcGxheS52aWV3RnJvbSkgeyBjb250aW51ZSB9XG4gICAgICB2YXIgY29sbGFwc2VkID0gcmFuZ2UuZW1wdHkoKTtcbiAgICAgIGlmIChjb2xsYXBzZWQgfHwgY20ub3B0aW9ucy5zaG93Q3Vyc29yV2hlblNlbGVjdGluZylcbiAgICAgICAgeyBkcmF3U2VsZWN0aW9uQ3Vyc29yKGNtLCByYW5nZS5oZWFkLCBjdXJGcmFnbWVudCk7IH1cbiAgICAgIGlmICghY29sbGFwc2VkKVxuICAgICAgICB7IGRyYXdTZWxlY3Rpb25SYW5nZShjbSwgcmFuZ2UsIHNlbEZyYWdtZW50KTsgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvLyBEcmF3cyBhIGN1cnNvciBmb3IgdGhlIGdpdmVuIHJhbmdlXG4gIGZ1bmN0aW9uIGRyYXdTZWxlY3Rpb25DdXJzb3IoY20sIGhlYWQsIG91dHB1dCkge1xuICAgIHZhciBwb3MgPSBjdXJzb3JDb29yZHMoY20sIGhlYWQsIFwiZGl2XCIsIG51bGwsIG51bGwsICFjbS5vcHRpb25zLnNpbmdsZUN1cnNvckhlaWdodFBlckxpbmUpO1xuXG4gICAgdmFyIGN1cnNvciA9IG91dHB1dC5hcHBlbmRDaGlsZChlbHQoXCJkaXZcIiwgXCJcXHUwMGEwXCIsIFwiQ29kZU1pcnJvci1jdXJzb3JcIikpO1xuICAgIGN1cnNvci5zdHlsZS5sZWZ0ID0gcG9zLmxlZnQgKyBcInB4XCI7XG4gICAgY3Vyc29yLnN0eWxlLnRvcCA9IHBvcy50b3AgKyBcInB4XCI7XG4gICAgY3Vyc29yLnN0eWxlLmhlaWdodCA9IE1hdGgubWF4KDAsIHBvcy5ib3R0b20gLSBwb3MudG9wKSAqIGNtLm9wdGlvbnMuY3Vyc29ySGVpZ2h0ICsgXCJweFwiO1xuXG4gICAgaWYgKHBvcy5vdGhlcikge1xuICAgICAgLy8gU2Vjb25kYXJ5IGN1cnNvciwgc2hvd24gd2hlbiBvbiBhICdqdW1wJyBpbiBiaS1kaXJlY3Rpb25hbCB0ZXh0XG4gICAgICB2YXIgb3RoZXJDdXJzb3IgPSBvdXRwdXQuYXBwZW5kQ2hpbGQoZWx0KFwiZGl2XCIsIFwiXFx1MDBhMFwiLCBcIkNvZGVNaXJyb3ItY3Vyc29yIENvZGVNaXJyb3Itc2Vjb25kYXJ5Y3Vyc29yXCIpKTtcbiAgICAgIG90aGVyQ3Vyc29yLnN0eWxlLmRpc3BsYXkgPSBcIlwiO1xuICAgICAgb3RoZXJDdXJzb3Iuc3R5bGUubGVmdCA9IHBvcy5vdGhlci5sZWZ0ICsgXCJweFwiO1xuICAgICAgb3RoZXJDdXJzb3Iuc3R5bGUudG9wID0gcG9zLm90aGVyLnRvcCArIFwicHhcIjtcbiAgICAgIG90aGVyQ3Vyc29yLnN0eWxlLmhlaWdodCA9IChwb3Mub3RoZXIuYm90dG9tIC0gcG9zLm90aGVyLnRvcCkgKiAuODUgKyBcInB4XCI7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY21wQ29vcmRzKGEsIGIpIHsgcmV0dXJuIGEudG9wIC0gYi50b3AgfHwgYS5sZWZ0IC0gYi5sZWZ0IH1cblxuICAvLyBEcmF3cyB0aGUgZ2l2ZW4gcmFuZ2UgYXMgYSBoaWdobGlnaHRlZCBzZWxlY3Rpb25cbiAgZnVuY3Rpb24gZHJhd1NlbGVjdGlvblJhbmdlKGNtLCByYW5nZSwgb3V0cHV0KSB7XG4gICAgdmFyIGRpc3BsYXkgPSBjbS5kaXNwbGF5LCBkb2MgPSBjbS5kb2M7XG4gICAgdmFyIGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuICAgIHZhciBwYWRkaW5nID0gcGFkZGluZ0goY20uZGlzcGxheSksIGxlZnRTaWRlID0gcGFkZGluZy5sZWZ0O1xuICAgIHZhciByaWdodFNpZGUgPSBNYXRoLm1heChkaXNwbGF5LnNpemVyV2lkdGgsIGRpc3BsYXlXaWR0aChjbSkgLSBkaXNwbGF5LnNpemVyLm9mZnNldExlZnQpIC0gcGFkZGluZy5yaWdodDtcbiAgICB2YXIgZG9jTFRSID0gZG9jLmRpcmVjdGlvbiA9PSBcImx0clwiO1xuXG4gICAgZnVuY3Rpb24gYWRkKGxlZnQsIHRvcCwgd2lkdGgsIGJvdHRvbSkge1xuICAgICAgaWYgKHRvcCA8IDApIHsgdG9wID0gMDsgfVxuICAgICAgdG9wID0gTWF0aC5yb3VuZCh0b3ApO1xuICAgICAgYm90dG9tID0gTWF0aC5yb3VuZChib3R0b20pO1xuICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoZWx0KFwiZGl2XCIsIG51bGwsIFwiQ29kZU1pcnJvci1zZWxlY3RlZFwiLCAoXCJwb3NpdGlvbjogYWJzb2x1dGU7IGxlZnQ6IFwiICsgbGVmdCArIFwicHg7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6IFwiICsgdG9wICsgXCJweDsgd2lkdGg6IFwiICsgKHdpZHRoID09IG51bGwgPyByaWdodFNpZGUgLSBsZWZ0IDogd2lkdGgpICsgXCJweDtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogXCIgKyAoYm90dG9tIC0gdG9wKSArIFwicHhcIikpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkcmF3Rm9yTGluZShsaW5lLCBmcm9tQXJnLCB0b0FyZykge1xuICAgICAgdmFyIGxpbmVPYmogPSBnZXRMaW5lKGRvYywgbGluZSk7XG4gICAgICB2YXIgbGluZUxlbiA9IGxpbmVPYmoudGV4dC5sZW5ndGg7XG4gICAgICB2YXIgc3RhcnQsIGVuZDtcbiAgICAgIGZ1bmN0aW9uIGNvb3JkcyhjaCwgYmlhcykge1xuICAgICAgICByZXR1cm4gY2hhckNvb3JkcyhjbSwgUG9zKGxpbmUsIGNoKSwgXCJkaXZcIiwgbGluZU9iaiwgYmlhcylcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gd3JhcFgocG9zLCBkaXIsIHNpZGUpIHtcbiAgICAgICAgdmFyIGV4dGVudCA9IHdyYXBwZWRMaW5lRXh0ZW50Q2hhcihjbSwgbGluZU9iaiwgbnVsbCwgcG9zKTtcbiAgICAgICAgdmFyIHByb3AgPSAoZGlyID09IFwibHRyXCIpID09IChzaWRlID09IFwiYWZ0ZXJcIikgPyBcImxlZnRcIiA6IFwicmlnaHRcIjtcbiAgICAgICAgdmFyIGNoID0gc2lkZSA9PSBcImFmdGVyXCIgPyBleHRlbnQuYmVnaW4gOiBleHRlbnQuZW5kIC0gKC9cXHMvLnRlc3QobGluZU9iai50ZXh0LmNoYXJBdChleHRlbnQuZW5kIC0gMSkpID8gMiA6IDEpO1xuICAgICAgICByZXR1cm4gY29vcmRzKGNoLCBwcm9wKVtwcm9wXVxuICAgICAgfVxuXG4gICAgICB2YXIgb3JkZXIgPSBnZXRPcmRlcihsaW5lT2JqLCBkb2MuZGlyZWN0aW9uKTtcbiAgICAgIGl0ZXJhdGVCaWRpU2VjdGlvbnMob3JkZXIsIGZyb21BcmcgfHwgMCwgdG9BcmcgPT0gbnVsbCA/IGxpbmVMZW4gOiB0b0FyZywgZnVuY3Rpb24gKGZyb20sIHRvLCBkaXIsIGkpIHtcbiAgICAgICAgdmFyIGx0ciA9IGRpciA9PSBcImx0clwiO1xuICAgICAgICB2YXIgZnJvbVBvcyA9IGNvb3Jkcyhmcm9tLCBsdHIgPyBcImxlZnRcIiA6IFwicmlnaHRcIik7XG4gICAgICAgIHZhciB0b1BvcyA9IGNvb3Jkcyh0byAtIDEsIGx0ciA/IFwicmlnaHRcIiA6IFwibGVmdFwiKTtcblxuICAgICAgICB2YXIgb3BlblN0YXJ0ID0gZnJvbUFyZyA9PSBudWxsICYmIGZyb20gPT0gMCwgb3BlbkVuZCA9IHRvQXJnID09IG51bGwgJiYgdG8gPT0gbGluZUxlbjtcbiAgICAgICAgdmFyIGZpcnN0ID0gaSA9PSAwLCBsYXN0ID0gIW9yZGVyIHx8IGkgPT0gb3JkZXIubGVuZ3RoIC0gMTtcbiAgICAgICAgaWYgKHRvUG9zLnRvcCAtIGZyb21Qb3MudG9wIDw9IDMpIHsgLy8gU2luZ2xlIGxpbmVcbiAgICAgICAgICB2YXIgb3BlbkxlZnQgPSAoZG9jTFRSID8gb3BlblN0YXJ0IDogb3BlbkVuZCkgJiYgZmlyc3Q7XG4gICAgICAgICAgdmFyIG9wZW5SaWdodCA9IChkb2NMVFIgPyBvcGVuRW5kIDogb3BlblN0YXJ0KSAmJiBsYXN0O1xuICAgICAgICAgIHZhciBsZWZ0ID0gb3BlbkxlZnQgPyBsZWZ0U2lkZSA6IChsdHIgPyBmcm9tUG9zIDogdG9Qb3MpLmxlZnQ7XG4gICAgICAgICAgdmFyIHJpZ2h0ID0gb3BlblJpZ2h0ID8gcmlnaHRTaWRlIDogKGx0ciA/IHRvUG9zIDogZnJvbVBvcykucmlnaHQ7XG4gICAgICAgICAgYWRkKGxlZnQsIGZyb21Qb3MudG9wLCByaWdodCAtIGxlZnQsIGZyb21Qb3MuYm90dG9tKTtcbiAgICAgICAgfSBlbHNlIHsgLy8gTXVsdGlwbGUgbGluZXNcbiAgICAgICAgICB2YXIgdG9wTGVmdCwgdG9wUmlnaHQsIGJvdExlZnQsIGJvdFJpZ2h0O1xuICAgICAgICAgIGlmIChsdHIpIHtcbiAgICAgICAgICAgIHRvcExlZnQgPSBkb2NMVFIgJiYgb3BlblN0YXJ0ICYmIGZpcnN0ID8gbGVmdFNpZGUgOiBmcm9tUG9zLmxlZnQ7XG4gICAgICAgICAgICB0b3BSaWdodCA9IGRvY0xUUiA/IHJpZ2h0U2lkZSA6IHdyYXBYKGZyb20sIGRpciwgXCJiZWZvcmVcIik7XG4gICAgICAgICAgICBib3RMZWZ0ID0gZG9jTFRSID8gbGVmdFNpZGUgOiB3cmFwWCh0bywgZGlyLCBcImFmdGVyXCIpO1xuICAgICAgICAgICAgYm90UmlnaHQgPSBkb2NMVFIgJiYgb3BlbkVuZCAmJiBsYXN0ID8gcmlnaHRTaWRlIDogdG9Qb3MucmlnaHQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRvcExlZnQgPSAhZG9jTFRSID8gbGVmdFNpZGUgOiB3cmFwWChmcm9tLCBkaXIsIFwiYmVmb3JlXCIpO1xuICAgICAgICAgICAgdG9wUmlnaHQgPSAhZG9jTFRSICYmIG9wZW5TdGFydCAmJiBmaXJzdCA/IHJpZ2h0U2lkZSA6IGZyb21Qb3MucmlnaHQ7XG4gICAgICAgICAgICBib3RMZWZ0ID0gIWRvY0xUUiAmJiBvcGVuRW5kICYmIGxhc3QgPyBsZWZ0U2lkZSA6IHRvUG9zLmxlZnQ7XG4gICAgICAgICAgICBib3RSaWdodCA9ICFkb2NMVFIgPyByaWdodFNpZGUgOiB3cmFwWCh0bywgZGlyLCBcImFmdGVyXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhZGQodG9wTGVmdCwgZnJvbVBvcy50b3AsIHRvcFJpZ2h0IC0gdG9wTGVmdCwgZnJvbVBvcy5ib3R0b20pO1xuICAgICAgICAgIGlmIChmcm9tUG9zLmJvdHRvbSA8IHRvUG9zLnRvcCkgeyBhZGQobGVmdFNpZGUsIGZyb21Qb3MuYm90dG9tLCBudWxsLCB0b1Bvcy50b3ApOyB9XG4gICAgICAgICAgYWRkKGJvdExlZnQsIHRvUG9zLnRvcCwgYm90UmlnaHQgLSBib3RMZWZ0LCB0b1Bvcy5ib3R0b20pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzdGFydCB8fCBjbXBDb29yZHMoZnJvbVBvcywgc3RhcnQpIDwgMCkgeyBzdGFydCA9IGZyb21Qb3M7IH1cbiAgICAgICAgaWYgKGNtcENvb3Jkcyh0b1Bvcywgc3RhcnQpIDwgMCkgeyBzdGFydCA9IHRvUG9zOyB9XG4gICAgICAgIGlmICghZW5kIHx8IGNtcENvb3Jkcyhmcm9tUG9zLCBlbmQpIDwgMCkgeyBlbmQgPSBmcm9tUG9zOyB9XG4gICAgICAgIGlmIChjbXBDb29yZHModG9Qb3MsIGVuZCkgPCAwKSB7IGVuZCA9IHRvUG9zOyB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7c3RhcnQ6IHN0YXJ0LCBlbmQ6IGVuZH1cbiAgICB9XG5cbiAgICB2YXIgc0Zyb20gPSByYW5nZS5mcm9tKCksIHNUbyA9IHJhbmdlLnRvKCk7XG4gICAgaWYgKHNGcm9tLmxpbmUgPT0gc1RvLmxpbmUpIHtcbiAgICAgIGRyYXdGb3JMaW5lKHNGcm9tLmxpbmUsIHNGcm9tLmNoLCBzVG8uY2gpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgZnJvbUxpbmUgPSBnZXRMaW5lKGRvYywgc0Zyb20ubGluZSksIHRvTGluZSA9IGdldExpbmUoZG9jLCBzVG8ubGluZSk7XG4gICAgICB2YXIgc2luZ2xlVkxpbmUgPSB2aXN1YWxMaW5lKGZyb21MaW5lKSA9PSB2aXN1YWxMaW5lKHRvTGluZSk7XG4gICAgICB2YXIgbGVmdEVuZCA9IGRyYXdGb3JMaW5lKHNGcm9tLmxpbmUsIHNGcm9tLmNoLCBzaW5nbGVWTGluZSA/IGZyb21MaW5lLnRleHQubGVuZ3RoICsgMSA6IG51bGwpLmVuZDtcbiAgICAgIHZhciByaWdodFN0YXJ0ID0gZHJhd0ZvckxpbmUoc1RvLmxpbmUsIHNpbmdsZVZMaW5lID8gMCA6IG51bGwsIHNUby5jaCkuc3RhcnQ7XG4gICAgICBpZiAoc2luZ2xlVkxpbmUpIHtcbiAgICAgICAgaWYgKGxlZnRFbmQudG9wIDwgcmlnaHRTdGFydC50b3AgLSAyKSB7XG4gICAgICAgICAgYWRkKGxlZnRFbmQucmlnaHQsIGxlZnRFbmQudG9wLCBudWxsLCBsZWZ0RW5kLmJvdHRvbSk7XG4gICAgICAgICAgYWRkKGxlZnRTaWRlLCByaWdodFN0YXJ0LnRvcCwgcmlnaHRTdGFydC5sZWZ0LCByaWdodFN0YXJ0LmJvdHRvbSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWRkKGxlZnRFbmQucmlnaHQsIGxlZnRFbmQudG9wLCByaWdodFN0YXJ0LmxlZnQgLSBsZWZ0RW5kLnJpZ2h0LCBsZWZ0RW5kLmJvdHRvbSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChsZWZ0RW5kLmJvdHRvbSA8IHJpZ2h0U3RhcnQudG9wKVxuICAgICAgICB7IGFkZChsZWZ0U2lkZSwgbGVmdEVuZC5ib3R0b20sIG51bGwsIHJpZ2h0U3RhcnQudG9wKTsgfVxuICAgIH1cblxuICAgIG91dHB1dC5hcHBlbmRDaGlsZChmcmFnbWVudCk7XG4gIH1cblxuICAvLyBDdXJzb3ItYmxpbmtpbmdcbiAgZnVuY3Rpb24gcmVzdGFydEJsaW5rKGNtKSB7XG4gICAgaWYgKCFjbS5zdGF0ZS5mb2N1c2VkKSB7IHJldHVybiB9XG4gICAgdmFyIGRpc3BsYXkgPSBjbS5kaXNwbGF5O1xuICAgIGNsZWFySW50ZXJ2YWwoZGlzcGxheS5ibGlua2VyKTtcbiAgICB2YXIgb24gPSB0cnVlO1xuICAgIGRpc3BsYXkuY3Vyc29yRGl2LnN0eWxlLnZpc2liaWxpdHkgPSBcIlwiO1xuICAgIGlmIChjbS5vcHRpb25zLmN1cnNvckJsaW5rUmF0ZSA+IDApXG4gICAgICB7IGRpc3BsYXkuYmxpbmtlciA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFjbS5oYXNGb2N1cygpKSB7IG9uQmx1cihjbSk7IH1cbiAgICAgICAgZGlzcGxheS5jdXJzb3JEaXYuc3R5bGUudmlzaWJpbGl0eSA9IChvbiA9ICFvbikgPyBcIlwiIDogXCJoaWRkZW5cIjtcbiAgICAgIH0sIGNtLm9wdGlvbnMuY3Vyc29yQmxpbmtSYXRlKTsgfVxuICAgIGVsc2UgaWYgKGNtLm9wdGlvbnMuY3Vyc29yQmxpbmtSYXRlIDwgMClcbiAgICAgIHsgZGlzcGxheS5jdXJzb3JEaXYuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7IH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGVuc3VyZUZvY3VzKGNtKSB7XG4gICAgaWYgKCFjbS5oYXNGb2N1cygpKSB7XG4gICAgICBjbS5kaXNwbGF5LmlucHV0LmZvY3VzKCk7XG4gICAgICBpZiAoIWNtLnN0YXRlLmZvY3VzZWQpIHsgb25Gb2N1cyhjbSk7IH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBkZWxheUJsdXJFdmVudChjbSkge1xuICAgIGNtLnN0YXRlLmRlbGF5aW5nQmx1ckV2ZW50ID0gdHJ1ZTtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgaWYgKGNtLnN0YXRlLmRlbGF5aW5nQmx1ckV2ZW50KSB7XG4gICAgICBjbS5zdGF0ZS5kZWxheWluZ0JsdXJFdmVudCA9IGZhbHNlO1xuICAgICAgaWYgKGNtLnN0YXRlLmZvY3VzZWQpIHsgb25CbHVyKGNtKTsgfVxuICAgIH0gfSwgMTAwKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uRm9jdXMoY20sIGUpIHtcbiAgICBpZiAoY20uc3RhdGUuZGVsYXlpbmdCbHVyRXZlbnQgJiYgIWNtLnN0YXRlLmRyYWdnaW5nVGV4dCkgeyBjbS5zdGF0ZS5kZWxheWluZ0JsdXJFdmVudCA9IGZhbHNlOyB9XG5cbiAgICBpZiAoY20ub3B0aW9ucy5yZWFkT25seSA9PSBcIm5vY3Vyc29yXCIpIHsgcmV0dXJuIH1cbiAgICBpZiAoIWNtLnN0YXRlLmZvY3VzZWQpIHtcbiAgICAgIHNpZ25hbChjbSwgXCJmb2N1c1wiLCBjbSwgZSk7XG4gICAgICBjbS5zdGF0ZS5mb2N1c2VkID0gdHJ1ZTtcbiAgICAgIGFkZENsYXNzKGNtLmRpc3BsYXkud3JhcHBlciwgXCJDb2RlTWlycm9yLWZvY3VzZWRcIik7XG4gICAgICAvLyBUaGlzIHRlc3QgcHJldmVudHMgdGhpcyBmcm9tIGZpcmluZyB3aGVuIGEgY29udGV4dFxuICAgICAgLy8gbWVudSBpcyBjbG9zZWQgKHNpbmNlIHRoZSBpbnB1dCByZXNldCB3b3VsZCBraWxsIHRoZVxuICAgICAgLy8gc2VsZWN0LWFsbCBkZXRlY3Rpb24gaGFjaylcbiAgICAgIGlmICghY20uY3VyT3AgJiYgY20uZGlzcGxheS5zZWxGb3JDb250ZXh0TWVudSAhPSBjbS5kb2Muc2VsKSB7XG4gICAgICAgIGNtLmRpc3BsYXkuaW5wdXQucmVzZXQoKTtcbiAgICAgICAgaWYgKHdlYmtpdCkgeyBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNtLmRpc3BsYXkuaW5wdXQucmVzZXQodHJ1ZSk7IH0sIDIwKTsgfSAvLyBJc3N1ZSAjMTczMFxuICAgICAgfVxuICAgICAgY20uZGlzcGxheS5pbnB1dC5yZWNlaXZlZEZvY3VzKCk7XG4gICAgfVxuICAgIHJlc3RhcnRCbGluayhjbSk7XG4gIH1cbiAgZnVuY3Rpb24gb25CbHVyKGNtLCBlKSB7XG4gICAgaWYgKGNtLnN0YXRlLmRlbGF5aW5nQmx1ckV2ZW50KSB7IHJldHVybiB9XG5cbiAgICBpZiAoY20uc3RhdGUuZm9jdXNlZCkge1xuICAgICAgc2lnbmFsKGNtLCBcImJsdXJcIiwgY20sIGUpO1xuICAgICAgY20uc3RhdGUuZm9jdXNlZCA9IGZhbHNlO1xuICAgICAgcm1DbGFzcyhjbS5kaXNwbGF5LndyYXBwZXIsIFwiQ29kZU1pcnJvci1mb2N1c2VkXCIpO1xuICAgIH1cbiAgICBjbGVhckludGVydmFsKGNtLmRpc3BsYXkuYmxpbmtlcik7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGlmICghY20uc3RhdGUuZm9jdXNlZCkgeyBjbS5kaXNwbGF5LnNoaWZ0ID0gZmFsc2U7IH0gfSwgMTUwKTtcbiAgfVxuXG4gIC8vIFJlYWQgdGhlIGFjdHVhbCBoZWlnaHRzIG9mIHRoZSByZW5kZXJlZCBsaW5lcywgYW5kIHVwZGF0ZSB0aGVpclxuICAvLyBzdG9yZWQgaGVpZ2h0cyB0byBtYXRjaC5cbiAgZnVuY3Rpb24gdXBkYXRlSGVpZ2h0c0luVmlld3BvcnQoY20pIHtcbiAgICB2YXIgZGlzcGxheSA9IGNtLmRpc3BsYXk7XG4gICAgdmFyIHByZXZCb3R0b20gPSBkaXNwbGF5LmxpbmVEaXYub2Zmc2V0VG9wO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGlzcGxheS52aWV3Lmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY3VyID0gZGlzcGxheS52aWV3W2ldLCB3cmFwcGluZyA9IGNtLm9wdGlvbnMubGluZVdyYXBwaW5nO1xuICAgICAgdmFyIGhlaWdodCA9ICh2b2lkIDApLCB3aWR0aCA9IDA7XG4gICAgICBpZiAoY3VyLmhpZGRlbikgeyBjb250aW51ZSB9XG4gICAgICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8IDgpIHtcbiAgICAgICAgdmFyIGJvdCA9IGN1ci5ub2RlLm9mZnNldFRvcCArIGN1ci5ub2RlLm9mZnNldEhlaWdodDtcbiAgICAgICAgaGVpZ2h0ID0gYm90IC0gcHJldkJvdHRvbTtcbiAgICAgICAgcHJldkJvdHRvbSA9IGJvdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBib3ggPSBjdXIubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgaGVpZ2h0ID0gYm94LmJvdHRvbSAtIGJveC50b3A7XG4gICAgICAgIC8vIENoZWNrIHRoYXQgbGluZXMgZG9uJ3QgZXh0ZW5kIHBhc3QgdGhlIHJpZ2h0IG9mIHRoZSBjdXJyZW50XG4gICAgICAgIC8vIGVkaXRvciB3aWR0aFxuICAgICAgICBpZiAoIXdyYXBwaW5nICYmIGN1ci50ZXh0LmZpcnN0Q2hpbGQpXG4gICAgICAgICAgeyB3aWR0aCA9IGN1ci50ZXh0LmZpcnN0Q2hpbGQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQgLSBib3gubGVmdCAtIDE7IH1cbiAgICAgIH1cbiAgICAgIHZhciBkaWZmID0gY3VyLmxpbmUuaGVpZ2h0IC0gaGVpZ2h0O1xuICAgICAgaWYgKGRpZmYgPiAuMDA1IHx8IGRpZmYgPCAtLjAwNSkge1xuICAgICAgICB1cGRhdGVMaW5lSGVpZ2h0KGN1ci5saW5lLCBoZWlnaHQpO1xuICAgICAgICB1cGRhdGVXaWRnZXRIZWlnaHQoY3VyLmxpbmUpO1xuICAgICAgICBpZiAoY3VyLnJlc3QpIHsgZm9yICh2YXIgaiA9IDA7IGogPCBjdXIucmVzdC5sZW5ndGg7IGorKylcbiAgICAgICAgICB7IHVwZGF0ZVdpZGdldEhlaWdodChjdXIucmVzdFtqXSk7IH0gfVxuICAgICAgfVxuICAgICAgaWYgKHdpZHRoID4gY20uZGlzcGxheS5zaXplcldpZHRoKSB7XG4gICAgICAgIHZhciBjaFdpZHRoID0gTWF0aC5jZWlsKHdpZHRoIC8gY2hhcldpZHRoKGNtLmRpc3BsYXkpKTtcbiAgICAgICAgaWYgKGNoV2lkdGggPiBjbS5kaXNwbGF5Lm1heExpbmVMZW5ndGgpIHtcbiAgICAgICAgICBjbS5kaXNwbGF5Lm1heExpbmVMZW5ndGggPSBjaFdpZHRoO1xuICAgICAgICAgIGNtLmRpc3BsYXkubWF4TGluZSA9IGN1ci5saW5lO1xuICAgICAgICAgIGNtLmRpc3BsYXkubWF4TGluZUNoYW5nZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gUmVhZCBhbmQgc3RvcmUgdGhlIGhlaWdodCBvZiBsaW5lIHdpZGdldHMgYXNzb2NpYXRlZCB3aXRoIHRoZVxuICAvLyBnaXZlbiBsaW5lLlxuICBmdW5jdGlvbiB1cGRhdGVXaWRnZXRIZWlnaHQobGluZSkge1xuICAgIGlmIChsaW5lLndpZGdldHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lLndpZGdldHMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciB3ID0gbGluZS53aWRnZXRzW2ldLCBwYXJlbnQgPSB3Lm5vZGUucGFyZW50Tm9kZTtcbiAgICAgIGlmIChwYXJlbnQpIHsgdy5oZWlnaHQgPSBwYXJlbnQub2Zmc2V0SGVpZ2h0OyB9XG4gICAgfSB9XG4gIH1cblxuICAvLyBDb21wdXRlIHRoZSBsaW5lcyB0aGF0IGFyZSB2aXNpYmxlIGluIGEgZ2l2ZW4gdmlld3BvcnQgKGRlZmF1bHRzXG4gIC8vIHRoZSB0aGUgY3VycmVudCBzY3JvbGwgcG9zaXRpb24pLiB2aWV3cG9ydCBtYXkgY29udGFpbiB0b3AsXG4gIC8vIGhlaWdodCwgYW5kIGVuc3VyZSAoc2VlIG9wLnNjcm9sbFRvUG9zKSBwcm9wZXJ0aWVzLlxuICBmdW5jdGlvbiB2aXNpYmxlTGluZXMoZGlzcGxheSwgZG9jLCB2aWV3cG9ydCkge1xuICAgIHZhciB0b3AgPSB2aWV3cG9ydCAmJiB2aWV3cG9ydC50b3AgIT0gbnVsbCA/IE1hdGgubWF4KDAsIHZpZXdwb3J0LnRvcCkgOiBkaXNwbGF5LnNjcm9sbGVyLnNjcm9sbFRvcDtcbiAgICB0b3AgPSBNYXRoLmZsb29yKHRvcCAtIHBhZGRpbmdUb3AoZGlzcGxheSkpO1xuICAgIHZhciBib3R0b20gPSB2aWV3cG9ydCAmJiB2aWV3cG9ydC5ib3R0b20gIT0gbnVsbCA/IHZpZXdwb3J0LmJvdHRvbSA6IHRvcCArIGRpc3BsYXkud3JhcHBlci5jbGllbnRIZWlnaHQ7XG5cbiAgICB2YXIgZnJvbSA9IGxpbmVBdEhlaWdodChkb2MsIHRvcCksIHRvID0gbGluZUF0SGVpZ2h0KGRvYywgYm90dG9tKTtcbiAgICAvLyBFbnN1cmUgaXMgYSB7ZnJvbToge2xpbmUsIGNofSwgdG86IHtsaW5lLCBjaH19IG9iamVjdCwgYW5kXG4gICAgLy8gZm9yY2VzIHRob3NlIGxpbmVzIGludG8gdGhlIHZpZXdwb3J0IChpZiBwb3NzaWJsZSkuXG4gICAgaWYgKHZpZXdwb3J0ICYmIHZpZXdwb3J0LmVuc3VyZSkge1xuICAgICAgdmFyIGVuc3VyZUZyb20gPSB2aWV3cG9ydC5lbnN1cmUuZnJvbS5saW5lLCBlbnN1cmVUbyA9IHZpZXdwb3J0LmVuc3VyZS50by5saW5lO1xuICAgICAgaWYgKGVuc3VyZUZyb20gPCBmcm9tKSB7XG4gICAgICAgIGZyb20gPSBlbnN1cmVGcm9tO1xuICAgICAgICB0byA9IGxpbmVBdEhlaWdodChkb2MsIGhlaWdodEF0TGluZShnZXRMaW5lKGRvYywgZW5zdXJlRnJvbSkpICsgZGlzcGxheS53cmFwcGVyLmNsaWVudEhlaWdodCk7XG4gICAgICB9IGVsc2UgaWYgKE1hdGgubWluKGVuc3VyZVRvLCBkb2MubGFzdExpbmUoKSkgPj0gdG8pIHtcbiAgICAgICAgZnJvbSA9IGxpbmVBdEhlaWdodChkb2MsIGhlaWdodEF0TGluZShnZXRMaW5lKGRvYywgZW5zdXJlVG8pKSAtIGRpc3BsYXkud3JhcHBlci5jbGllbnRIZWlnaHQpO1xuICAgICAgICB0byA9IGVuc3VyZVRvO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge2Zyb206IGZyb20sIHRvOiBNYXRoLm1heCh0bywgZnJvbSArIDEpfVxuICB9XG5cbiAgLy8gU0NST0xMSU5HIFRISU5HUyBJTlRPIFZJRVdcblxuICAvLyBJZiBhbiBlZGl0b3Igc2l0cyBvbiB0aGUgdG9wIG9yIGJvdHRvbSBvZiB0aGUgd2luZG93LCBwYXJ0aWFsbHlcbiAgLy8gc2Nyb2xsZWQgb3V0IG9mIHZpZXcsIHRoaXMgZW5zdXJlcyB0aGF0IHRoZSBjdXJzb3IgaXMgdmlzaWJsZS5cbiAgZnVuY3Rpb24gbWF5YmVTY3JvbGxXaW5kb3coY20sIHJlY3QpIHtcbiAgICBpZiAoc2lnbmFsRE9NRXZlbnQoY20sIFwic2Nyb2xsQ3Vyc29ySW50b1ZpZXdcIikpIHsgcmV0dXJuIH1cblxuICAgIHZhciBkaXNwbGF5ID0gY20uZGlzcGxheSwgYm94ID0gZGlzcGxheS5zaXplci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgZG9TY3JvbGwgPSBudWxsO1xuICAgIGlmIChyZWN0LnRvcCArIGJveC50b3AgPCAwKSB7IGRvU2Nyb2xsID0gdHJ1ZTsgfVxuICAgIGVsc2UgaWYgKHJlY3QuYm90dG9tICsgYm94LnRvcCA+ICh3aW5kb3cuaW5uZXJIZWlnaHQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpIHsgZG9TY3JvbGwgPSBmYWxzZTsgfVxuICAgIGlmIChkb1Njcm9sbCAhPSBudWxsICYmICFwaGFudG9tKSB7XG4gICAgICB2YXIgc2Nyb2xsTm9kZSA9IGVsdChcImRpdlwiLCBcIlxcdTIwMGJcIiwgbnVsbCwgKFwicG9zaXRpb246IGFic29sdXRlO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6IFwiICsgKHJlY3QudG9wIC0gZGlzcGxheS52aWV3T2Zmc2V0IC0gcGFkZGluZ1RvcChjbS5kaXNwbGF5KSkgKyBcInB4O1xcbiAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IFwiICsgKHJlY3QuYm90dG9tIC0gcmVjdC50b3AgKyBzY3JvbGxHYXAoY20pICsgZGlzcGxheS5iYXJIZWlnaHQpICsgXCJweDtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogXCIgKyAocmVjdC5sZWZ0KSArIFwicHg7IHdpZHRoOiBcIiArIChNYXRoLm1heCgyLCByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0KSkgKyBcInB4O1wiKSk7XG4gICAgICBjbS5kaXNwbGF5LmxpbmVTcGFjZS5hcHBlbmRDaGlsZChzY3JvbGxOb2RlKTtcbiAgICAgIHNjcm9sbE5vZGUuc2Nyb2xsSW50b1ZpZXcoZG9TY3JvbGwpO1xuICAgICAgY20uZGlzcGxheS5saW5lU3BhY2UucmVtb3ZlQ2hpbGQoc2Nyb2xsTm9kZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gU2Nyb2xsIGEgZ2l2ZW4gcG9zaXRpb24gaW50byB2aWV3IChpbW1lZGlhdGVseSksIHZlcmlmeWluZyB0aGF0XG4gIC8vIGl0IGFjdHVhbGx5IGJlY2FtZSB2aXNpYmxlIChhcyBsaW5lIGhlaWdodHMgYXJlIGFjY3VyYXRlbHlcbiAgLy8gbWVhc3VyZWQsIHRoZSBwb3NpdGlvbiBvZiBzb21ldGhpbmcgbWF5ICdkcmlmdCcgZHVyaW5nIGRyYXdpbmcpLlxuICBmdW5jdGlvbiBzY3JvbGxQb3NJbnRvVmlldyhjbSwgcG9zLCBlbmQsIG1hcmdpbikge1xuICAgIGlmIChtYXJnaW4gPT0gbnVsbCkgeyBtYXJnaW4gPSAwOyB9XG4gICAgdmFyIHJlY3Q7XG4gICAgaWYgKCFjbS5vcHRpb25zLmxpbmVXcmFwcGluZyAmJiBwb3MgPT0gZW5kKSB7XG4gICAgICAvLyBTZXQgcG9zIGFuZCBlbmQgdG8gdGhlIGN1cnNvciBwb3NpdGlvbnMgYXJvdW5kIHRoZSBjaGFyYWN0ZXIgcG9zIHN0aWNrcyB0b1xuICAgICAgLy8gSWYgcG9zLnN0aWNreSA9PSBcImJlZm9yZVwiLCB0aGF0IGlzIGFyb3VuZCBwb3MuY2ggLSAxLCBvdGhlcndpc2UgYXJvdW5kIHBvcy5jaFxuICAgICAgLy8gSWYgcG9zID09IFBvcyhfLCAwLCBcImJlZm9yZVwiKSwgcG9zIGFuZCBlbmQgYXJlIHVuY2hhbmdlZFxuICAgICAgcG9zID0gcG9zLmNoID8gUG9zKHBvcy5saW5lLCBwb3Muc3RpY2t5ID09IFwiYmVmb3JlXCIgPyBwb3MuY2ggLSAxIDogcG9zLmNoLCBcImFmdGVyXCIpIDogcG9zO1xuICAgICAgZW5kID0gcG9zLnN0aWNreSA9PSBcImJlZm9yZVwiID8gUG9zKHBvcy5saW5lLCBwb3MuY2ggKyAxLCBcImJlZm9yZVwiKSA6IHBvcztcbiAgICB9XG4gICAgZm9yICh2YXIgbGltaXQgPSAwOyBsaW1pdCA8IDU7IGxpbWl0KyspIHtcbiAgICAgIHZhciBjaGFuZ2VkID0gZmFsc2U7XG4gICAgICB2YXIgY29vcmRzID0gY3Vyc29yQ29vcmRzKGNtLCBwb3MpO1xuICAgICAgdmFyIGVuZENvb3JkcyA9ICFlbmQgfHwgZW5kID09IHBvcyA/IGNvb3JkcyA6IGN1cnNvckNvb3JkcyhjbSwgZW5kKTtcbiAgICAgIHJlY3QgPSB7bGVmdDogTWF0aC5taW4oY29vcmRzLmxlZnQsIGVuZENvb3Jkcy5sZWZ0KSxcbiAgICAgICAgICAgICAgdG9wOiBNYXRoLm1pbihjb29yZHMudG9wLCBlbmRDb29yZHMudG9wKSAtIG1hcmdpbixcbiAgICAgICAgICAgICAgcmlnaHQ6IE1hdGgubWF4KGNvb3Jkcy5sZWZ0LCBlbmRDb29yZHMubGVmdCksXG4gICAgICAgICAgICAgIGJvdHRvbTogTWF0aC5tYXgoY29vcmRzLmJvdHRvbSwgZW5kQ29vcmRzLmJvdHRvbSkgKyBtYXJnaW59O1xuICAgICAgdmFyIHNjcm9sbFBvcyA9IGNhbGN1bGF0ZVNjcm9sbFBvcyhjbSwgcmVjdCk7XG4gICAgICB2YXIgc3RhcnRUb3AgPSBjbS5kb2Muc2Nyb2xsVG9wLCBzdGFydExlZnQgPSBjbS5kb2Muc2Nyb2xsTGVmdDtcbiAgICAgIGlmIChzY3JvbGxQb3Muc2Nyb2xsVG9wICE9IG51bGwpIHtcbiAgICAgICAgdXBkYXRlU2Nyb2xsVG9wKGNtLCBzY3JvbGxQb3Muc2Nyb2xsVG9wKTtcbiAgICAgICAgaWYgKE1hdGguYWJzKGNtLmRvYy5zY3JvbGxUb3AgLSBzdGFydFRvcCkgPiAxKSB7IGNoYW5nZWQgPSB0cnVlOyB9XG4gICAgICB9XG4gICAgICBpZiAoc2Nyb2xsUG9zLnNjcm9sbExlZnQgIT0gbnVsbCkge1xuICAgICAgICBzZXRTY3JvbGxMZWZ0KGNtLCBzY3JvbGxQb3Muc2Nyb2xsTGVmdCk7XG4gICAgICAgIGlmIChNYXRoLmFicyhjbS5kb2Muc2Nyb2xsTGVmdCAtIHN0YXJ0TGVmdCkgPiAxKSB7IGNoYW5nZWQgPSB0cnVlOyB9XG4gICAgICB9XG4gICAgICBpZiAoIWNoYW5nZWQpIHsgYnJlYWsgfVxuICAgIH1cbiAgICByZXR1cm4gcmVjdFxuICB9XG5cbiAgLy8gU2Nyb2xsIGEgZ2l2ZW4gc2V0IG9mIGNvb3JkaW5hdGVzIGludG8gdmlldyAoaW1tZWRpYXRlbHkpLlxuICBmdW5jdGlvbiBzY3JvbGxJbnRvVmlldyhjbSwgcmVjdCkge1xuICAgIHZhciBzY3JvbGxQb3MgPSBjYWxjdWxhdGVTY3JvbGxQb3MoY20sIHJlY3QpO1xuICAgIGlmIChzY3JvbGxQb3Muc2Nyb2xsVG9wICE9IG51bGwpIHsgdXBkYXRlU2Nyb2xsVG9wKGNtLCBzY3JvbGxQb3Muc2Nyb2xsVG9wKTsgfVxuICAgIGlmIChzY3JvbGxQb3Muc2Nyb2xsTGVmdCAhPSBudWxsKSB7IHNldFNjcm9sbExlZnQoY20sIHNjcm9sbFBvcy5zY3JvbGxMZWZ0KTsgfVxuICB9XG5cbiAgLy8gQ2FsY3VsYXRlIGEgbmV3IHNjcm9sbCBwb3NpdGlvbiBuZWVkZWQgdG8gc2Nyb2xsIHRoZSBnaXZlblxuICAvLyByZWN0YW5nbGUgaW50byB2aWV3LiBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIHNjcm9sbFRvcCBhbmRcbiAgLy8gc2Nyb2xsTGVmdCBwcm9wZXJ0aWVzLiBXaGVuIHRoZXNlIGFyZSB1bmRlZmluZWQsIHRoZVxuICAvLyB2ZXJ0aWNhbC9ob3Jpem9udGFsIHBvc2l0aW9uIGRvZXMgbm90IG5lZWQgdG8gYmUgYWRqdXN0ZWQuXG4gIGZ1bmN0aW9uIGNhbGN1bGF0ZVNjcm9sbFBvcyhjbSwgcmVjdCkge1xuICAgIHZhciBkaXNwbGF5ID0gY20uZGlzcGxheSwgc25hcE1hcmdpbiA9IHRleHRIZWlnaHQoY20uZGlzcGxheSk7XG4gICAgaWYgKHJlY3QudG9wIDwgMCkgeyByZWN0LnRvcCA9IDA7IH1cbiAgICB2YXIgc2NyZWVudG9wID0gY20uY3VyT3AgJiYgY20uY3VyT3Auc2Nyb2xsVG9wICE9IG51bGwgPyBjbS5jdXJPcC5zY3JvbGxUb3AgOiBkaXNwbGF5LnNjcm9sbGVyLnNjcm9sbFRvcDtcbiAgICB2YXIgc2NyZWVuID0gZGlzcGxheUhlaWdodChjbSksIHJlc3VsdCA9IHt9O1xuICAgIGlmIChyZWN0LmJvdHRvbSAtIHJlY3QudG9wID4gc2NyZWVuKSB7IHJlY3QuYm90dG9tID0gcmVjdC50b3AgKyBzY3JlZW47IH1cbiAgICB2YXIgZG9jQm90dG9tID0gY20uZG9jLmhlaWdodCArIHBhZGRpbmdWZXJ0KGRpc3BsYXkpO1xuICAgIHZhciBhdFRvcCA9IHJlY3QudG9wIDwgc25hcE1hcmdpbiwgYXRCb3R0b20gPSByZWN0LmJvdHRvbSA+IGRvY0JvdHRvbSAtIHNuYXBNYXJnaW47XG4gICAgaWYgKHJlY3QudG9wIDwgc2NyZWVudG9wKSB7XG4gICAgICByZXN1bHQuc2Nyb2xsVG9wID0gYXRUb3AgPyAwIDogcmVjdC50b3A7XG4gICAgfSBlbHNlIGlmIChyZWN0LmJvdHRvbSA+IHNjcmVlbnRvcCArIHNjcmVlbikge1xuICAgICAgdmFyIG5ld1RvcCA9IE1hdGgubWluKHJlY3QudG9wLCAoYXRCb3R0b20gPyBkb2NCb3R0b20gOiByZWN0LmJvdHRvbSkgLSBzY3JlZW4pO1xuICAgICAgaWYgKG5ld1RvcCAhPSBzY3JlZW50b3ApIHsgcmVzdWx0LnNjcm9sbFRvcCA9IG5ld1RvcDsgfVxuICAgIH1cblxuICAgIHZhciBndXR0ZXJTcGFjZSA9IGNtLm9wdGlvbnMuZml4ZWRHdXR0ZXIgPyAwIDogZGlzcGxheS5ndXR0ZXJzLm9mZnNldFdpZHRoO1xuICAgIHZhciBzY3JlZW5sZWZ0ID0gY20uY3VyT3AgJiYgY20uY3VyT3Auc2Nyb2xsTGVmdCAhPSBudWxsID8gY20uY3VyT3Auc2Nyb2xsTGVmdCA6IGRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsTGVmdCAtIGd1dHRlclNwYWNlO1xuICAgIHZhciBzY3JlZW53ID0gZGlzcGxheVdpZHRoKGNtKSAtIGRpc3BsYXkuZ3V0dGVycy5vZmZzZXRXaWR0aDtcbiAgICB2YXIgdG9vV2lkZSA9IHJlY3QucmlnaHQgLSByZWN0LmxlZnQgPiBzY3JlZW53O1xuICAgIGlmICh0b29XaWRlKSB7IHJlY3QucmlnaHQgPSByZWN0LmxlZnQgKyBzY3JlZW53OyB9XG4gICAgaWYgKHJlY3QubGVmdCA8IDEwKVxuICAgICAgeyByZXN1bHQuc2Nyb2xsTGVmdCA9IDA7IH1cbiAgICBlbHNlIGlmIChyZWN0LmxlZnQgPCBzY3JlZW5sZWZ0KVxuICAgICAgeyByZXN1bHQuc2Nyb2xsTGVmdCA9IE1hdGgubWF4KDAsIHJlY3QubGVmdCArIGd1dHRlclNwYWNlIC0gKHRvb1dpZGUgPyAwIDogMTApKTsgfVxuICAgIGVsc2UgaWYgKHJlY3QucmlnaHQgPiBzY3JlZW53ICsgc2NyZWVubGVmdCAtIDMpXG4gICAgICB7IHJlc3VsdC5zY3JvbGxMZWZ0ID0gcmVjdC5yaWdodCArICh0b29XaWRlID8gMCA6IDEwKSAtIHNjcmVlbnc7IH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvLyBTdG9yZSBhIHJlbGF0aXZlIGFkanVzdG1lbnQgdG8gdGhlIHNjcm9sbCBwb3NpdGlvbiBpbiB0aGUgY3VycmVudFxuICAvLyBvcGVyYXRpb24gKHRvIGJlIGFwcGxpZWQgd2hlbiB0aGUgb3BlcmF0aW9uIGZpbmlzaGVzKS5cbiAgZnVuY3Rpb24gYWRkVG9TY3JvbGxUb3AoY20sIHRvcCkge1xuICAgIGlmICh0b3AgPT0gbnVsbCkgeyByZXR1cm4gfVxuICAgIHJlc29sdmVTY3JvbGxUb1BvcyhjbSk7XG4gICAgY20uY3VyT3Auc2Nyb2xsVG9wID0gKGNtLmN1ck9wLnNjcm9sbFRvcCA9PSBudWxsID8gY20uZG9jLnNjcm9sbFRvcCA6IGNtLmN1ck9wLnNjcm9sbFRvcCkgKyB0b3A7XG4gIH1cblxuICAvLyBNYWtlIHN1cmUgdGhhdCBhdCB0aGUgZW5kIG9mIHRoZSBvcGVyYXRpb24gdGhlIGN1cnJlbnQgY3Vyc29yIGlzXG4gIC8vIHNob3duLlxuICBmdW5jdGlvbiBlbnN1cmVDdXJzb3JWaXNpYmxlKGNtKSB7XG4gICAgcmVzb2x2ZVNjcm9sbFRvUG9zKGNtKTtcbiAgICB2YXIgY3VyID0gY20uZ2V0Q3Vyc29yKCk7XG4gICAgY20uY3VyT3Auc2Nyb2xsVG9Qb3MgPSB7ZnJvbTogY3VyLCB0bzogY3VyLCBtYXJnaW46IGNtLm9wdGlvbnMuY3Vyc29yU2Nyb2xsTWFyZ2lufTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNjcm9sbFRvQ29vcmRzKGNtLCB4LCB5KSB7XG4gICAgaWYgKHggIT0gbnVsbCB8fCB5ICE9IG51bGwpIHsgcmVzb2x2ZVNjcm9sbFRvUG9zKGNtKTsgfVxuICAgIGlmICh4ICE9IG51bGwpIHsgY20uY3VyT3Auc2Nyb2xsTGVmdCA9IHg7IH1cbiAgICBpZiAoeSAhPSBudWxsKSB7IGNtLmN1ck9wLnNjcm9sbFRvcCA9IHk7IH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNjcm9sbFRvUmFuZ2UoY20sIHJhbmdlKSB7XG4gICAgcmVzb2x2ZVNjcm9sbFRvUG9zKGNtKTtcbiAgICBjbS5jdXJPcC5zY3JvbGxUb1BvcyA9IHJhbmdlO1xuICB9XG5cbiAgLy8gV2hlbiBhbiBvcGVyYXRpb24gaGFzIGl0cyBzY3JvbGxUb1BvcyBwcm9wZXJ0eSBzZXQsIGFuZCBhbm90aGVyXG4gIC8vIHNjcm9sbCBhY3Rpb24gaXMgYXBwbGllZCBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgb3BlcmF0aW9uLCB0aGlzXG4gIC8vICdzaW11bGF0ZXMnIHNjcm9sbGluZyB0aGF0IHBvc2l0aW9uIGludG8gdmlldyBpbiBhIGNoZWFwIHdheSwgc29cbiAgLy8gdGhhdCB0aGUgZWZmZWN0IG9mIGludGVybWVkaWF0ZSBzY3JvbGwgY29tbWFuZHMgaXMgbm90IGlnbm9yZWQuXG4gIGZ1bmN0aW9uIHJlc29sdmVTY3JvbGxUb1BvcyhjbSkge1xuICAgIHZhciByYW5nZSA9IGNtLmN1ck9wLnNjcm9sbFRvUG9zO1xuICAgIGlmIChyYW5nZSkge1xuICAgICAgY20uY3VyT3Auc2Nyb2xsVG9Qb3MgPSBudWxsO1xuICAgICAgdmFyIGZyb20gPSBlc3RpbWF0ZUNvb3JkcyhjbSwgcmFuZ2UuZnJvbSksIHRvID0gZXN0aW1hdGVDb29yZHMoY20sIHJhbmdlLnRvKTtcbiAgICAgIHNjcm9sbFRvQ29vcmRzUmFuZ2UoY20sIGZyb20sIHRvLCByYW5nZS5tYXJnaW4pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNjcm9sbFRvQ29vcmRzUmFuZ2UoY20sIGZyb20sIHRvLCBtYXJnaW4pIHtcbiAgICB2YXIgc1BvcyA9IGNhbGN1bGF0ZVNjcm9sbFBvcyhjbSwge1xuICAgICAgbGVmdDogTWF0aC5taW4oZnJvbS5sZWZ0LCB0by5sZWZ0KSxcbiAgICAgIHRvcDogTWF0aC5taW4oZnJvbS50b3AsIHRvLnRvcCkgLSBtYXJnaW4sXG4gICAgICByaWdodDogTWF0aC5tYXgoZnJvbS5yaWdodCwgdG8ucmlnaHQpLFxuICAgICAgYm90dG9tOiBNYXRoLm1heChmcm9tLmJvdHRvbSwgdG8uYm90dG9tKSArIG1hcmdpblxuICAgIH0pO1xuICAgIHNjcm9sbFRvQ29vcmRzKGNtLCBzUG9zLnNjcm9sbExlZnQsIHNQb3Muc2Nyb2xsVG9wKTtcbiAgfVxuXG4gIC8vIFN5bmMgdGhlIHNjcm9sbGFibGUgYXJlYSBhbmQgc2Nyb2xsYmFycywgZW5zdXJlIHRoZSB2aWV3cG9ydFxuICAvLyBjb3ZlcnMgdGhlIHZpc2libGUgYXJlYS5cbiAgZnVuY3Rpb24gdXBkYXRlU2Nyb2xsVG9wKGNtLCB2YWwpIHtcbiAgICBpZiAoTWF0aC5hYnMoY20uZG9jLnNjcm9sbFRvcCAtIHZhbCkgPCAyKSB7IHJldHVybiB9XG4gICAgaWYgKCFnZWNrbykgeyB1cGRhdGVEaXNwbGF5U2ltcGxlKGNtLCB7dG9wOiB2YWx9KTsgfVxuICAgIHNldFNjcm9sbFRvcChjbSwgdmFsLCB0cnVlKTtcbiAgICBpZiAoZ2Vja28pIHsgdXBkYXRlRGlzcGxheVNpbXBsZShjbSk7IH1cbiAgICBzdGFydFdvcmtlcihjbSwgMTAwKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldFNjcm9sbFRvcChjbSwgdmFsLCBmb3JjZVNjcm9sbCkge1xuICAgIHZhbCA9IE1hdGgubWF4KDAsIE1hdGgubWluKGNtLmRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsSGVpZ2h0IC0gY20uZGlzcGxheS5zY3JvbGxlci5jbGllbnRIZWlnaHQsIHZhbCkpO1xuICAgIGlmIChjbS5kaXNwbGF5LnNjcm9sbGVyLnNjcm9sbFRvcCA9PSB2YWwgJiYgIWZvcmNlU2Nyb2xsKSB7IHJldHVybiB9XG4gICAgY20uZG9jLnNjcm9sbFRvcCA9IHZhbDtcbiAgICBjbS5kaXNwbGF5LnNjcm9sbGJhcnMuc2V0U2Nyb2xsVG9wKHZhbCk7XG4gICAgaWYgKGNtLmRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsVG9wICE9IHZhbCkgeyBjbS5kaXNwbGF5LnNjcm9sbGVyLnNjcm9sbFRvcCA9IHZhbDsgfVxuICB9XG5cbiAgLy8gU3luYyBzY3JvbGxlciBhbmQgc2Nyb2xsYmFyLCBlbnN1cmUgdGhlIGd1dHRlciBlbGVtZW50cyBhcmVcbiAgLy8gYWxpZ25lZC5cbiAgZnVuY3Rpb24gc2V0U2Nyb2xsTGVmdChjbSwgdmFsLCBpc1Njcm9sbGVyLCBmb3JjZVNjcm9sbCkge1xuICAgIHZhbCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHZhbCwgY20uZGlzcGxheS5zY3JvbGxlci5zY3JvbGxXaWR0aCAtIGNtLmRpc3BsYXkuc2Nyb2xsZXIuY2xpZW50V2lkdGgpKTtcbiAgICBpZiAoKGlzU2Nyb2xsZXIgPyB2YWwgPT0gY20uZG9jLnNjcm9sbExlZnQgOiBNYXRoLmFicyhjbS5kb2Muc2Nyb2xsTGVmdCAtIHZhbCkgPCAyKSAmJiAhZm9yY2VTY3JvbGwpIHsgcmV0dXJuIH1cbiAgICBjbS5kb2Muc2Nyb2xsTGVmdCA9IHZhbDtcbiAgICBhbGlnbkhvcml6b250YWxseShjbSk7XG4gICAgaWYgKGNtLmRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsTGVmdCAhPSB2YWwpIHsgY20uZGlzcGxheS5zY3JvbGxlci5zY3JvbGxMZWZ0ID0gdmFsOyB9XG4gICAgY20uZGlzcGxheS5zY3JvbGxiYXJzLnNldFNjcm9sbExlZnQodmFsKTtcbiAgfVxuXG4gIC8vIFNDUk9MTEJBUlNcblxuICAvLyBQcmVwYXJlIERPTSByZWFkcyBuZWVkZWQgdG8gdXBkYXRlIHRoZSBzY3JvbGxiYXJzLiBEb25lIGluIG9uZVxuICAvLyBzaG90IHRvIG1pbmltaXplIHVwZGF0ZS9tZWFzdXJlIHJvdW5kdHJpcHMuXG4gIGZ1bmN0aW9uIG1lYXN1cmVGb3JTY3JvbGxiYXJzKGNtKSB7XG4gICAgdmFyIGQgPSBjbS5kaXNwbGF5LCBndXR0ZXJXID0gZC5ndXR0ZXJzLm9mZnNldFdpZHRoO1xuICAgIHZhciBkb2NIID0gTWF0aC5yb3VuZChjbS5kb2MuaGVpZ2h0ICsgcGFkZGluZ1ZlcnQoY20uZGlzcGxheSkpO1xuICAgIHJldHVybiB7XG4gICAgICBjbGllbnRIZWlnaHQ6IGQuc2Nyb2xsZXIuY2xpZW50SGVpZ2h0LFxuICAgICAgdmlld0hlaWdodDogZC53cmFwcGVyLmNsaWVudEhlaWdodCxcbiAgICAgIHNjcm9sbFdpZHRoOiBkLnNjcm9sbGVyLnNjcm9sbFdpZHRoLCBjbGllbnRXaWR0aDogZC5zY3JvbGxlci5jbGllbnRXaWR0aCxcbiAgICAgIHZpZXdXaWR0aDogZC53cmFwcGVyLmNsaWVudFdpZHRoLFxuICAgICAgYmFyTGVmdDogY20ub3B0aW9ucy5maXhlZEd1dHRlciA/IGd1dHRlclcgOiAwLFxuICAgICAgZG9jSGVpZ2h0OiBkb2NILFxuICAgICAgc2Nyb2xsSGVpZ2h0OiBkb2NIICsgc2Nyb2xsR2FwKGNtKSArIGQuYmFySGVpZ2h0LFxuICAgICAgbmF0aXZlQmFyV2lkdGg6IGQubmF0aXZlQmFyV2lkdGgsXG4gICAgICBndXR0ZXJXaWR0aDogZ3V0dGVyV1xuICAgIH1cbiAgfVxuXG4gIHZhciBOYXRpdmVTY3JvbGxiYXJzID0gZnVuY3Rpb24ocGxhY2UsIHNjcm9sbCwgY20pIHtcbiAgICB0aGlzLmNtID0gY207XG4gICAgdmFyIHZlcnQgPSB0aGlzLnZlcnQgPSBlbHQoXCJkaXZcIiwgW2VsdChcImRpdlwiLCBudWxsLCBudWxsLCBcIm1pbi13aWR0aDogMXB4XCIpXSwgXCJDb2RlTWlycm9yLXZzY3JvbGxiYXJcIik7XG4gICAgdmFyIGhvcml6ID0gdGhpcy5ob3JpeiA9IGVsdChcImRpdlwiLCBbZWx0KFwiZGl2XCIsIG51bGwsIG51bGwsIFwiaGVpZ2h0OiAxMDAlOyBtaW4taGVpZ2h0OiAxcHhcIildLCBcIkNvZGVNaXJyb3ItaHNjcm9sbGJhclwiKTtcbiAgICB2ZXJ0LnRhYkluZGV4ID0gaG9yaXoudGFiSW5kZXggPSAtMTtcbiAgICBwbGFjZSh2ZXJ0KTsgcGxhY2UoaG9yaXopO1xuXG4gICAgb24odmVydCwgXCJzY3JvbGxcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHZlcnQuY2xpZW50SGVpZ2h0KSB7IHNjcm9sbCh2ZXJ0LnNjcm9sbFRvcCwgXCJ2ZXJ0aWNhbFwiKTsgfVxuICAgIH0pO1xuICAgIG9uKGhvcml6LCBcInNjcm9sbFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoaG9yaXouY2xpZW50V2lkdGgpIHsgc2Nyb2xsKGhvcml6LnNjcm9sbExlZnQsIFwiaG9yaXpvbnRhbFwiKTsgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5jaGVja2VkWmVyb1dpZHRoID0gZmFsc2U7XG4gICAgLy8gTmVlZCB0byBzZXQgYSBtaW5pbXVtIHdpZHRoIHRvIHNlZSB0aGUgc2Nyb2xsYmFyIG9uIElFNyAoYnV0IG11c3Qgbm90IHNldCBpdCBvbiBJRTgpLlxuICAgIGlmIChpZSAmJiBpZV92ZXJzaW9uIDwgOCkgeyB0aGlzLmhvcml6LnN0eWxlLm1pbkhlaWdodCA9IHRoaXMudmVydC5zdHlsZS5taW5XaWR0aCA9IFwiMThweFwiOyB9XG4gIH07XG5cbiAgTmF0aXZlU2Nyb2xsYmFycy5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKG1lYXN1cmUpIHtcbiAgICB2YXIgbmVlZHNIID0gbWVhc3VyZS5zY3JvbGxXaWR0aCA+IG1lYXN1cmUuY2xpZW50V2lkdGggKyAxO1xuICAgIHZhciBuZWVkc1YgPSBtZWFzdXJlLnNjcm9sbEhlaWdodCA+IG1lYXN1cmUuY2xpZW50SGVpZ2h0ICsgMTtcbiAgICB2YXIgc1dpZHRoID0gbWVhc3VyZS5uYXRpdmVCYXJXaWR0aDtcblxuICAgIGlmIChuZWVkc1YpIHtcbiAgICAgIHRoaXMudmVydC5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuICAgICAgdGhpcy52ZXJ0LnN0eWxlLmJvdHRvbSA9IG5lZWRzSCA/IHNXaWR0aCArIFwicHhcIiA6IFwiMFwiO1xuICAgICAgdmFyIHRvdGFsSGVpZ2h0ID0gbWVhc3VyZS52aWV3SGVpZ2h0IC0gKG5lZWRzSCA/IHNXaWR0aCA6IDApO1xuICAgICAgLy8gQSBidWcgaW4gSUU4IGNhbiBjYXVzZSB0aGlzIHZhbHVlIHRvIGJlIG5lZ2F0aXZlLCBzbyBndWFyZCBpdC5cbiAgICAgIHRoaXMudmVydC5maXJzdENoaWxkLnN0eWxlLmhlaWdodCA9XG4gICAgICAgIE1hdGgubWF4KDAsIG1lYXN1cmUuc2Nyb2xsSGVpZ2h0IC0gbWVhc3VyZS5jbGllbnRIZWlnaHQgKyB0b3RhbEhlaWdodCkgKyBcInB4XCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmVydC5zdHlsZS5kaXNwbGF5ID0gXCJcIjtcbiAgICAgIHRoaXMudmVydC5maXJzdENoaWxkLnN0eWxlLmhlaWdodCA9IFwiMFwiO1xuICAgIH1cblxuICAgIGlmIChuZWVkc0gpIHtcbiAgICAgIHRoaXMuaG9yaXouc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcbiAgICAgIHRoaXMuaG9yaXouc3R5bGUucmlnaHQgPSBuZWVkc1YgPyBzV2lkdGggKyBcInB4XCIgOiBcIjBcIjtcbiAgICAgIHRoaXMuaG9yaXouc3R5bGUubGVmdCA9IG1lYXN1cmUuYmFyTGVmdCArIFwicHhcIjtcbiAgICAgIHZhciB0b3RhbFdpZHRoID0gbWVhc3VyZS52aWV3V2lkdGggLSBtZWFzdXJlLmJhckxlZnQgLSAobmVlZHNWID8gc1dpZHRoIDogMCk7XG4gICAgICB0aGlzLmhvcml6LmZpcnN0Q2hpbGQuc3R5bGUud2lkdGggPVxuICAgICAgICBNYXRoLm1heCgwLCBtZWFzdXJlLnNjcm9sbFdpZHRoIC0gbWVhc3VyZS5jbGllbnRXaWR0aCArIHRvdGFsV2lkdGgpICsgXCJweFwiO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhvcml6LnN0eWxlLmRpc3BsYXkgPSBcIlwiO1xuICAgICAgdGhpcy5ob3Jpei5maXJzdENoaWxkLnN0eWxlLndpZHRoID0gXCIwXCI7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmNoZWNrZWRaZXJvV2lkdGggJiYgbWVhc3VyZS5jbGllbnRIZWlnaHQgPiAwKSB7XG4gICAgICBpZiAoc1dpZHRoID09IDApIHsgdGhpcy56ZXJvV2lkdGhIYWNrKCk7IH1cbiAgICAgIHRoaXMuY2hlY2tlZFplcm9XaWR0aCA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtyaWdodDogbmVlZHNWID8gc1dpZHRoIDogMCwgYm90dG9tOiBuZWVkc0ggPyBzV2lkdGggOiAwfVxuICB9O1xuXG4gIE5hdGl2ZVNjcm9sbGJhcnMucHJvdG90eXBlLnNldFNjcm9sbExlZnQgPSBmdW5jdGlvbiAocG9zKSB7XG4gICAgaWYgKHRoaXMuaG9yaXouc2Nyb2xsTGVmdCAhPSBwb3MpIHsgdGhpcy5ob3Jpei5zY3JvbGxMZWZ0ID0gcG9zOyB9XG4gICAgaWYgKHRoaXMuZGlzYWJsZUhvcml6KSB7IHRoaXMuZW5hYmxlWmVyb1dpZHRoQmFyKHRoaXMuaG9yaXosIHRoaXMuZGlzYWJsZUhvcml6LCBcImhvcml6XCIpOyB9XG4gIH07XG5cbiAgTmF0aXZlU2Nyb2xsYmFycy5wcm90b3R5cGUuc2V0U2Nyb2xsVG9wID0gZnVuY3Rpb24gKHBvcykge1xuICAgIGlmICh0aGlzLnZlcnQuc2Nyb2xsVG9wICE9IHBvcykgeyB0aGlzLnZlcnQuc2Nyb2xsVG9wID0gcG9zOyB9XG4gICAgaWYgKHRoaXMuZGlzYWJsZVZlcnQpIHsgdGhpcy5lbmFibGVaZXJvV2lkdGhCYXIodGhpcy52ZXJ0LCB0aGlzLmRpc2FibGVWZXJ0LCBcInZlcnRcIik7IH1cbiAgfTtcblxuICBOYXRpdmVTY3JvbGxiYXJzLnByb3RvdHlwZS56ZXJvV2lkdGhIYWNrID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciB3ID0gbWFjICYmICFtYWNfZ2VNb3VudGFpbkxpb24gPyBcIjEycHhcIiA6IFwiMThweFwiO1xuICAgIHRoaXMuaG9yaXouc3R5bGUuaGVpZ2h0ID0gdGhpcy52ZXJ0LnN0eWxlLndpZHRoID0gdztcbiAgICB0aGlzLmhvcml6LnN0eWxlLnBvaW50ZXJFdmVudHMgPSB0aGlzLnZlcnQuc3R5bGUucG9pbnRlckV2ZW50cyA9IFwibm9uZVwiO1xuICAgIHRoaXMuZGlzYWJsZUhvcml6ID0gbmV3IERlbGF5ZWQ7XG4gICAgdGhpcy5kaXNhYmxlVmVydCA9IG5ldyBEZWxheWVkO1xuICB9O1xuXG4gIE5hdGl2ZVNjcm9sbGJhcnMucHJvdG90eXBlLmVuYWJsZVplcm9XaWR0aEJhciA9IGZ1bmN0aW9uIChiYXIsIGRlbGF5LCB0eXBlKSB7XG4gICAgYmFyLnN0eWxlLnBvaW50ZXJFdmVudHMgPSBcImF1dG9cIjtcbiAgICBmdW5jdGlvbiBtYXliZURpc2FibGUoKSB7XG4gICAgICAvLyBUbyBmaW5kIG91dCB3aGV0aGVyIHRoZSBzY3JvbGxiYXIgaXMgc3RpbGwgdmlzaWJsZSwgd2VcbiAgICAgIC8vIGNoZWNrIHdoZXRoZXIgdGhlIGVsZW1lbnQgdW5kZXIgdGhlIHBpeGVsIGluIHRoZSBib3R0b21cbiAgICAgIC8vIHJpZ2h0IGNvcm5lciBvZiB0aGUgc2Nyb2xsYmFyIGJveCBpcyB0aGUgc2Nyb2xsYmFyIGJveFxuICAgICAgLy8gaXRzZWxmICh3aGVuIHRoZSBiYXIgaXMgc3RpbGwgdmlzaWJsZSkgb3IgaXRzIGZpbGxlciBjaGlsZFxuICAgICAgLy8gKHdoZW4gdGhlIGJhciBpcyBoaWRkZW4pLiBJZiBpdCBpcyBzdGlsbCB2aXNpYmxlLCB3ZSBrZWVwXG4gICAgICAvLyBpdCBlbmFibGVkLCBpZiBpdCdzIGhpZGRlbiwgd2UgZGlzYWJsZSBwb2ludGVyIGV2ZW50cy5cbiAgICAgIHZhciBib3ggPSBiYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICB2YXIgZWx0ID0gdHlwZSA9PSBcInZlcnRcIiA/IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoYm94LnJpZ2h0IC0gMSwgKGJveC50b3AgKyBib3guYm90dG9tKSAvIDIpXG4gICAgICAgICAgOiBkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KChib3gucmlnaHQgKyBib3gubGVmdCkgLyAyLCBib3guYm90dG9tIC0gMSk7XG4gICAgICBpZiAoZWx0ICE9IGJhcikgeyBiYXIuc3R5bGUucG9pbnRlckV2ZW50cyA9IFwibm9uZVwiOyB9XG4gICAgICBlbHNlIHsgZGVsYXkuc2V0KDEwMDAsIG1heWJlRGlzYWJsZSk7IH1cbiAgICB9XG4gICAgZGVsYXkuc2V0KDEwMDAsIG1heWJlRGlzYWJsZSk7XG4gIH07XG5cbiAgTmF0aXZlU2Nyb2xsYmFycy5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHBhcmVudCA9IHRoaXMuaG9yaXoucGFyZW50Tm9kZTtcbiAgICBwYXJlbnQucmVtb3ZlQ2hpbGQodGhpcy5ob3Jpeik7XG4gICAgcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMudmVydCk7XG4gIH07XG5cbiAgdmFyIE51bGxTY3JvbGxiYXJzID0gZnVuY3Rpb24gKCkge307XG5cbiAgTnVsbFNjcm9sbGJhcnMucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHtib3R0b206IDAsIHJpZ2h0OiAwfSB9O1xuICBOdWxsU2Nyb2xsYmFycy5wcm90b3R5cGUuc2V0U2Nyb2xsTGVmdCA9IGZ1bmN0aW9uICgpIHt9O1xuICBOdWxsU2Nyb2xsYmFycy5wcm90b3R5cGUuc2V0U2Nyb2xsVG9wID0gZnVuY3Rpb24gKCkge307XG4gIE51bGxTY3JvbGxiYXJzLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHt9O1xuXG4gIGZ1bmN0aW9uIHVwZGF0ZVNjcm9sbGJhcnMoY20sIG1lYXN1cmUpIHtcbiAgICBpZiAoIW1lYXN1cmUpIHsgbWVhc3VyZSA9IG1lYXN1cmVGb3JTY3JvbGxiYXJzKGNtKTsgfVxuICAgIHZhciBzdGFydFdpZHRoID0gY20uZGlzcGxheS5iYXJXaWR0aCwgc3RhcnRIZWlnaHQgPSBjbS5kaXNwbGF5LmJhckhlaWdodDtcbiAgICB1cGRhdGVTY3JvbGxiYXJzSW5uZXIoY20sIG1lYXN1cmUpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNCAmJiBzdGFydFdpZHRoICE9IGNtLmRpc3BsYXkuYmFyV2lkdGggfHwgc3RhcnRIZWlnaHQgIT0gY20uZGlzcGxheS5iYXJIZWlnaHQ7IGkrKykge1xuICAgICAgaWYgKHN0YXJ0V2lkdGggIT0gY20uZGlzcGxheS5iYXJXaWR0aCAmJiBjbS5vcHRpb25zLmxpbmVXcmFwcGluZylcbiAgICAgICAgeyB1cGRhdGVIZWlnaHRzSW5WaWV3cG9ydChjbSk7IH1cbiAgICAgIHVwZGF0ZVNjcm9sbGJhcnNJbm5lcihjbSwgbWVhc3VyZUZvclNjcm9sbGJhcnMoY20pKTtcbiAgICAgIHN0YXJ0V2lkdGggPSBjbS5kaXNwbGF5LmJhcldpZHRoOyBzdGFydEhlaWdodCA9IGNtLmRpc3BsYXkuYmFySGVpZ2h0O1xuICAgIH1cbiAgfVxuXG4gIC8vIFJlLXN5bmNocm9uaXplIHRoZSBmYWtlIHNjcm9sbGJhcnMgd2l0aCB0aGUgYWN0dWFsIHNpemUgb2YgdGhlXG4gIC8vIGNvbnRlbnQuXG4gIGZ1bmN0aW9uIHVwZGF0ZVNjcm9sbGJhcnNJbm5lcihjbSwgbWVhc3VyZSkge1xuICAgIHZhciBkID0gY20uZGlzcGxheTtcbiAgICB2YXIgc2l6ZXMgPSBkLnNjcm9sbGJhcnMudXBkYXRlKG1lYXN1cmUpO1xuXG4gICAgZC5zaXplci5zdHlsZS5wYWRkaW5nUmlnaHQgPSAoZC5iYXJXaWR0aCA9IHNpemVzLnJpZ2h0KSArIFwicHhcIjtcbiAgICBkLnNpemVyLnN0eWxlLnBhZGRpbmdCb3R0b20gPSAoZC5iYXJIZWlnaHQgPSBzaXplcy5ib3R0b20pICsgXCJweFwiO1xuICAgIGQuaGVpZ2h0Rm9yY2VyLnN0eWxlLmJvcmRlckJvdHRvbSA9IHNpemVzLmJvdHRvbSArIFwicHggc29saWQgdHJhbnNwYXJlbnRcIjtcblxuICAgIGlmIChzaXplcy5yaWdodCAmJiBzaXplcy5ib3R0b20pIHtcbiAgICAgIGQuc2Nyb2xsYmFyRmlsbGVyLnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG4gICAgICBkLnNjcm9sbGJhckZpbGxlci5zdHlsZS5oZWlnaHQgPSBzaXplcy5ib3R0b20gKyBcInB4XCI7XG4gICAgICBkLnNjcm9sbGJhckZpbGxlci5zdHlsZS53aWR0aCA9IHNpemVzLnJpZ2h0ICsgXCJweFwiO1xuICAgIH0gZWxzZSB7IGQuc2Nyb2xsYmFyRmlsbGVyLnN0eWxlLmRpc3BsYXkgPSBcIlwiOyB9XG4gICAgaWYgKHNpemVzLmJvdHRvbSAmJiBjbS5vcHRpb25zLmNvdmVyR3V0dGVyTmV4dFRvU2Nyb2xsYmFyICYmIGNtLm9wdGlvbnMuZml4ZWRHdXR0ZXIpIHtcbiAgICAgIGQuZ3V0dGVyRmlsbGVyLnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG4gICAgICBkLmd1dHRlckZpbGxlci5zdHlsZS5oZWlnaHQgPSBzaXplcy5ib3R0b20gKyBcInB4XCI7XG4gICAgICBkLmd1dHRlckZpbGxlci5zdHlsZS53aWR0aCA9IG1lYXN1cmUuZ3V0dGVyV2lkdGggKyBcInB4XCI7XG4gICAgfSBlbHNlIHsgZC5ndXR0ZXJGaWxsZXIuc3R5bGUuZGlzcGxheSA9IFwiXCI7IH1cbiAgfVxuXG4gIHZhciBzY3JvbGxiYXJNb2RlbCA9IHtcIm5hdGl2ZVwiOiBOYXRpdmVTY3JvbGxiYXJzLCBcIm51bGxcIjogTnVsbFNjcm9sbGJhcnN9O1xuXG4gIGZ1bmN0aW9uIGluaXRTY3JvbGxiYXJzKGNtKSB7XG4gICAgaWYgKGNtLmRpc3BsYXkuc2Nyb2xsYmFycykge1xuICAgICAgY20uZGlzcGxheS5zY3JvbGxiYXJzLmNsZWFyKCk7XG4gICAgICBpZiAoY20uZGlzcGxheS5zY3JvbGxiYXJzLmFkZENsYXNzKVxuICAgICAgICB7IHJtQ2xhc3MoY20uZGlzcGxheS53cmFwcGVyLCBjbS5kaXNwbGF5LnNjcm9sbGJhcnMuYWRkQ2xhc3MpOyB9XG4gICAgfVxuXG4gICAgY20uZGlzcGxheS5zY3JvbGxiYXJzID0gbmV3IHNjcm9sbGJhck1vZGVsW2NtLm9wdGlvbnMuc2Nyb2xsYmFyU3R5bGVdKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICBjbS5kaXNwbGF5LndyYXBwZXIuaW5zZXJ0QmVmb3JlKG5vZGUsIGNtLmRpc3BsYXkuc2Nyb2xsYmFyRmlsbGVyKTtcbiAgICAgIC8vIFByZXZlbnQgY2xpY2tzIGluIHRoZSBzY3JvbGxiYXJzIGZyb20ga2lsbGluZyBmb2N1c1xuICAgICAgb24obm9kZSwgXCJtb3VzZWRvd25cIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoY20uc3RhdGUuZm9jdXNlZCkgeyBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNtLmRpc3BsYXkuaW5wdXQuZm9jdXMoKTsgfSwgMCk7IH1cbiAgICAgIH0pO1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJjbS1ub3QtY29udGVudFwiLCBcInRydWVcIik7XG4gICAgfSwgZnVuY3Rpb24gKHBvcywgYXhpcykge1xuICAgICAgaWYgKGF4aXMgPT0gXCJob3Jpem9udGFsXCIpIHsgc2V0U2Nyb2xsTGVmdChjbSwgcG9zKTsgfVxuICAgICAgZWxzZSB7IHVwZGF0ZVNjcm9sbFRvcChjbSwgcG9zKTsgfVxuICAgIH0sIGNtKTtcbiAgICBpZiAoY20uZGlzcGxheS5zY3JvbGxiYXJzLmFkZENsYXNzKVxuICAgICAgeyBhZGRDbGFzcyhjbS5kaXNwbGF5LndyYXBwZXIsIGNtLmRpc3BsYXkuc2Nyb2xsYmFycy5hZGRDbGFzcyk7IH1cbiAgfVxuXG4gIC8vIE9wZXJhdGlvbnMgYXJlIHVzZWQgdG8gd3JhcCBhIHNlcmllcyBvZiBjaGFuZ2VzIHRvIHRoZSBlZGl0b3JcbiAgLy8gc3RhdGUgaW4gc3VjaCBhIHdheSB0aGF0IGVhY2ggY2hhbmdlIHdvbid0IGhhdmUgdG8gdXBkYXRlIHRoZVxuICAvLyBjdXJzb3IgYW5kIGRpc3BsYXkgKHdoaWNoIHdvdWxkIGJlIGF3a3dhcmQsIHNsb3csIGFuZFxuICAvLyBlcnJvci1wcm9uZSkuIEluc3RlYWQsIGRpc3BsYXkgdXBkYXRlcyBhcmUgYmF0Y2hlZCBhbmQgdGhlbiBhbGxcbiAgLy8gY29tYmluZWQgYW5kIGV4ZWN1dGVkIGF0IG9uY2UuXG5cbiAgdmFyIG5leHRPcElkID0gMDtcbiAgLy8gU3RhcnQgYSBuZXcgb3BlcmF0aW9uLlxuICBmdW5jdGlvbiBzdGFydE9wZXJhdGlvbihjbSkge1xuICAgIGNtLmN1ck9wID0ge1xuICAgICAgY206IGNtLFxuICAgICAgdmlld0NoYW5nZWQ6IGZhbHNlLCAgICAgIC8vIEZsYWcgdGhhdCBpbmRpY2F0ZXMgdGhhdCBsaW5lcyBtaWdodCBuZWVkIHRvIGJlIHJlZHJhd25cbiAgICAgIHN0YXJ0SGVpZ2h0OiBjbS5kb2MuaGVpZ2h0LCAvLyBVc2VkIHRvIGRldGVjdCBuZWVkIHRvIHVwZGF0ZSBzY3JvbGxiYXJcbiAgICAgIGZvcmNlVXBkYXRlOiBmYWxzZSwgICAgICAvLyBVc2VkIHRvIGZvcmNlIGEgcmVkcmF3XG4gICAgICB1cGRhdGVJbnB1dDogMCwgICAgICAgLy8gV2hldGhlciB0byByZXNldCB0aGUgaW5wdXQgdGV4dGFyZWFcbiAgICAgIHR5cGluZzogZmFsc2UsICAgICAgICAgICAvLyBXaGV0aGVyIHRoaXMgcmVzZXQgc2hvdWxkIGJlIGNhcmVmdWwgdG8gbGVhdmUgZXhpc3RpbmcgdGV4dCAoZm9yIGNvbXBvc2l0aW5nKVxuICAgICAgY2hhbmdlT2JqczogbnVsbCwgICAgICAgIC8vIEFjY3VtdWxhdGVkIGNoYW5nZXMsIGZvciBmaXJpbmcgY2hhbmdlIGV2ZW50c1xuICAgICAgY3Vyc29yQWN0aXZpdHlIYW5kbGVyczogbnVsbCwgLy8gU2V0IG9mIGhhbmRsZXJzIHRvIGZpcmUgY3Vyc29yQWN0aXZpdHkgb25cbiAgICAgIGN1cnNvckFjdGl2aXR5Q2FsbGVkOiAwLCAvLyBUcmFja3Mgd2hpY2ggY3Vyc29yQWN0aXZpdHkgaGFuZGxlcnMgaGF2ZSBiZWVuIGNhbGxlZCBhbHJlYWR5XG4gICAgICBzZWxlY3Rpb25DaGFuZ2VkOiBmYWxzZSwgLy8gV2hldGhlciB0aGUgc2VsZWN0aW9uIG5lZWRzIHRvIGJlIHJlZHJhd25cbiAgICAgIHVwZGF0ZU1heExpbmU6IGZhbHNlLCAgICAvLyBTZXQgd2hlbiB0aGUgd2lkZXN0IGxpbmUgbmVlZHMgdG8gYmUgZGV0ZXJtaW5lZCBhbmV3XG4gICAgICBzY3JvbGxMZWZ0OiBudWxsLCBzY3JvbGxUb3A6IG51bGwsIC8vIEludGVybWVkaWF0ZSBzY3JvbGwgcG9zaXRpb24sIG5vdCBwdXNoZWQgdG8gRE9NIHlldFxuICAgICAgc2Nyb2xsVG9Qb3M6IG51bGwsICAgICAgIC8vIFVzZWQgdG8gc2Nyb2xsIHRvIGEgc3BlY2lmaWMgcG9zaXRpb25cbiAgICAgIGZvY3VzOiBmYWxzZSxcbiAgICAgIGlkOiArK25leHRPcElkICAgICAgICAgICAvLyBVbmlxdWUgSURcbiAgICB9O1xuICAgIHB1c2hPcGVyYXRpb24oY20uY3VyT3ApO1xuICB9XG5cbiAgLy8gRmluaXNoIGFuIG9wZXJhdGlvbiwgdXBkYXRpbmcgdGhlIGRpc3BsYXkgYW5kIHNpZ25hbGxpbmcgZGVsYXllZCBldmVudHNcbiAgZnVuY3Rpb24gZW5kT3BlcmF0aW9uKGNtKSB7XG4gICAgdmFyIG9wID0gY20uY3VyT3A7XG4gICAgaWYgKG9wKSB7IGZpbmlzaE9wZXJhdGlvbihvcCwgZnVuY3Rpb24gKGdyb3VwKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdyb3VwLm9wcy5sZW5ndGg7IGkrKylcbiAgICAgICAgeyBncm91cC5vcHNbaV0uY20uY3VyT3AgPSBudWxsOyB9XG4gICAgICBlbmRPcGVyYXRpb25zKGdyb3VwKTtcbiAgICB9KTsgfVxuICB9XG5cbiAgLy8gVGhlIERPTSB1cGRhdGVzIGRvbmUgd2hlbiBhbiBvcGVyYXRpb24gZmluaXNoZXMgYXJlIGJhdGNoZWQgc29cbiAgLy8gdGhhdCB0aGUgbWluaW11bSBudW1iZXIgb2YgcmVsYXlvdXRzIGFyZSByZXF1aXJlZC5cbiAgZnVuY3Rpb24gZW5kT3BlcmF0aW9ucyhncm91cCkge1xuICAgIHZhciBvcHMgPSBncm91cC5vcHM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcHMubGVuZ3RoOyBpKyspIC8vIFJlYWQgRE9NXG4gICAgICB7IGVuZE9wZXJhdGlvbl9SMShvcHNbaV0pOyB9XG4gICAgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgb3BzLmxlbmd0aDsgaSQxKyspIC8vIFdyaXRlIERPTSAobWF5YmUpXG4gICAgICB7IGVuZE9wZXJhdGlvbl9XMShvcHNbaSQxXSk7IH1cbiAgICBmb3IgKHZhciBpJDIgPSAwOyBpJDIgPCBvcHMubGVuZ3RoOyBpJDIrKykgLy8gUmVhZCBET01cbiAgICAgIHsgZW5kT3BlcmF0aW9uX1IyKG9wc1tpJDJdKTsgfVxuICAgIGZvciAodmFyIGkkMyA9IDA7IGkkMyA8IG9wcy5sZW5ndGg7IGkkMysrKSAvLyBXcml0ZSBET00gKG1heWJlKVxuICAgICAgeyBlbmRPcGVyYXRpb25fVzIob3BzW2kkM10pOyB9XG4gICAgZm9yICh2YXIgaSQ0ID0gMDsgaSQ0IDwgb3BzLmxlbmd0aDsgaSQ0KyspIC8vIFJlYWQgRE9NXG4gICAgICB7IGVuZE9wZXJhdGlvbl9maW5pc2gob3BzW2kkNF0pOyB9XG4gIH1cblxuICBmdW5jdGlvbiBlbmRPcGVyYXRpb25fUjEob3ApIHtcbiAgICB2YXIgY20gPSBvcC5jbSwgZGlzcGxheSA9IGNtLmRpc3BsYXk7XG4gICAgbWF5YmVDbGlwU2Nyb2xsYmFycyhjbSk7XG4gICAgaWYgKG9wLnVwZGF0ZU1heExpbmUpIHsgZmluZE1heExpbmUoY20pOyB9XG5cbiAgICBvcC5tdXN0VXBkYXRlID0gb3Audmlld0NoYW5nZWQgfHwgb3AuZm9yY2VVcGRhdGUgfHwgb3Auc2Nyb2xsVG9wICE9IG51bGwgfHxcbiAgICAgIG9wLnNjcm9sbFRvUG9zICYmIChvcC5zY3JvbGxUb1Bvcy5mcm9tLmxpbmUgPCBkaXNwbGF5LnZpZXdGcm9tIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgb3Auc2Nyb2xsVG9Qb3MudG8ubGluZSA+PSBkaXNwbGF5LnZpZXdUbykgfHxcbiAgICAgIGRpc3BsYXkubWF4TGluZUNoYW5nZWQgJiYgY20ub3B0aW9ucy5saW5lV3JhcHBpbmc7XG4gICAgb3AudXBkYXRlID0gb3AubXVzdFVwZGF0ZSAmJlxuICAgICAgbmV3IERpc3BsYXlVcGRhdGUoY20sIG9wLm11c3RVcGRhdGUgJiYge3RvcDogb3Auc2Nyb2xsVG9wLCBlbnN1cmU6IG9wLnNjcm9sbFRvUG9zfSwgb3AuZm9yY2VVcGRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gZW5kT3BlcmF0aW9uX1cxKG9wKSB7XG4gICAgb3AudXBkYXRlZERpc3BsYXkgPSBvcC5tdXN0VXBkYXRlICYmIHVwZGF0ZURpc3BsYXlJZk5lZWRlZChvcC5jbSwgb3AudXBkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGVuZE9wZXJhdGlvbl9SMihvcCkge1xuICAgIHZhciBjbSA9IG9wLmNtLCBkaXNwbGF5ID0gY20uZGlzcGxheTtcbiAgICBpZiAob3AudXBkYXRlZERpc3BsYXkpIHsgdXBkYXRlSGVpZ2h0c0luVmlld3BvcnQoY20pOyB9XG5cbiAgICBvcC5iYXJNZWFzdXJlID0gbWVhc3VyZUZvclNjcm9sbGJhcnMoY20pO1xuXG4gICAgLy8gSWYgdGhlIG1heCBsaW5lIGNoYW5nZWQgc2luY2UgaXQgd2FzIGxhc3QgbWVhc3VyZWQsIG1lYXN1cmUgaXQsXG4gICAgLy8gYW5kIGVuc3VyZSB0aGUgZG9jdW1lbnQncyB3aWR0aCBtYXRjaGVzIGl0LlxuICAgIC8vIHVwZGF0ZURpc3BsYXlfVzIgd2lsbCB1c2UgdGhlc2UgcHJvcGVydGllcyB0byBkbyB0aGUgYWN0dWFsIHJlc2l6aW5nXG4gICAgaWYgKGRpc3BsYXkubWF4TGluZUNoYW5nZWQgJiYgIWNtLm9wdGlvbnMubGluZVdyYXBwaW5nKSB7XG4gICAgICBvcC5hZGp1c3RXaWR0aFRvID0gbWVhc3VyZUNoYXIoY20sIGRpc3BsYXkubWF4TGluZSwgZGlzcGxheS5tYXhMaW5lLnRleHQubGVuZ3RoKS5sZWZ0ICsgMztcbiAgICAgIGNtLmRpc3BsYXkuc2l6ZXJXaWR0aCA9IG9wLmFkanVzdFdpZHRoVG87XG4gICAgICBvcC5iYXJNZWFzdXJlLnNjcm9sbFdpZHRoID1cbiAgICAgICAgTWF0aC5tYXgoZGlzcGxheS5zY3JvbGxlci5jbGllbnRXaWR0aCwgZGlzcGxheS5zaXplci5vZmZzZXRMZWZ0ICsgb3AuYWRqdXN0V2lkdGhUbyArIHNjcm9sbEdhcChjbSkgKyBjbS5kaXNwbGF5LmJhcldpZHRoKTtcbiAgICAgIG9wLm1heFNjcm9sbExlZnQgPSBNYXRoLm1heCgwLCBkaXNwbGF5LnNpemVyLm9mZnNldExlZnQgKyBvcC5hZGp1c3RXaWR0aFRvIC0gZGlzcGxheVdpZHRoKGNtKSk7XG4gICAgfVxuXG4gICAgaWYgKG9wLnVwZGF0ZWREaXNwbGF5IHx8IG9wLnNlbGVjdGlvbkNoYW5nZWQpXG4gICAgICB7IG9wLnByZXBhcmVkU2VsZWN0aW9uID0gZGlzcGxheS5pbnB1dC5wcmVwYXJlU2VsZWN0aW9uKCk7IH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGVuZE9wZXJhdGlvbl9XMihvcCkge1xuICAgIHZhciBjbSA9IG9wLmNtO1xuXG4gICAgaWYgKG9wLmFkanVzdFdpZHRoVG8gIT0gbnVsbCkge1xuICAgICAgY20uZGlzcGxheS5zaXplci5zdHlsZS5taW5XaWR0aCA9IG9wLmFkanVzdFdpZHRoVG8gKyBcInB4XCI7XG4gICAgICBpZiAob3AubWF4U2Nyb2xsTGVmdCA8IGNtLmRvYy5zY3JvbGxMZWZ0KVxuICAgICAgICB7IHNldFNjcm9sbExlZnQoY20sIE1hdGgubWluKGNtLmRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsTGVmdCwgb3AubWF4U2Nyb2xsTGVmdCksIHRydWUpOyB9XG4gICAgICBjbS5kaXNwbGF5Lm1heExpbmVDaGFuZ2VkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIHRha2VGb2N1cyA9IG9wLmZvY3VzICYmIG9wLmZvY3VzID09IGFjdGl2ZUVsdCgpO1xuICAgIGlmIChvcC5wcmVwYXJlZFNlbGVjdGlvbilcbiAgICAgIHsgY20uZGlzcGxheS5pbnB1dC5zaG93U2VsZWN0aW9uKG9wLnByZXBhcmVkU2VsZWN0aW9uLCB0YWtlRm9jdXMpOyB9XG4gICAgaWYgKG9wLnVwZGF0ZWREaXNwbGF5IHx8IG9wLnN0YXJ0SGVpZ2h0ICE9IGNtLmRvYy5oZWlnaHQpXG4gICAgICB7IHVwZGF0ZVNjcm9sbGJhcnMoY20sIG9wLmJhck1lYXN1cmUpOyB9XG4gICAgaWYgKG9wLnVwZGF0ZWREaXNwbGF5KVxuICAgICAgeyBzZXREb2N1bWVudEhlaWdodChjbSwgb3AuYmFyTWVhc3VyZSk7IH1cblxuICAgIGlmIChvcC5zZWxlY3Rpb25DaGFuZ2VkKSB7IHJlc3RhcnRCbGluayhjbSk7IH1cblxuICAgIGlmIChjbS5zdGF0ZS5mb2N1c2VkICYmIG9wLnVwZGF0ZUlucHV0KVxuICAgICAgeyBjbS5kaXNwbGF5LmlucHV0LnJlc2V0KG9wLnR5cGluZyk7IH1cbiAgICBpZiAodGFrZUZvY3VzKSB7IGVuc3VyZUZvY3VzKG9wLmNtKTsgfVxuICB9XG5cbiAgZnVuY3Rpb24gZW5kT3BlcmF0aW9uX2ZpbmlzaChvcCkge1xuICAgIHZhciBjbSA9IG9wLmNtLCBkaXNwbGF5ID0gY20uZGlzcGxheSwgZG9jID0gY20uZG9jO1xuXG4gICAgaWYgKG9wLnVwZGF0ZWREaXNwbGF5KSB7IHBvc3RVcGRhdGVEaXNwbGF5KGNtLCBvcC51cGRhdGUpOyB9XG5cbiAgICAvLyBBYm9ydCBtb3VzZSB3aGVlbCBkZWx0YSBtZWFzdXJlbWVudCwgd2hlbiBzY3JvbGxpbmcgZXhwbGljaXRseVxuICAgIGlmIChkaXNwbGF5LndoZWVsU3RhcnRYICE9IG51bGwgJiYgKG9wLnNjcm9sbFRvcCAhPSBudWxsIHx8IG9wLnNjcm9sbExlZnQgIT0gbnVsbCB8fCBvcC5zY3JvbGxUb1BvcykpXG4gICAgICB7IGRpc3BsYXkud2hlZWxTdGFydFggPSBkaXNwbGF5LndoZWVsU3RhcnRZID0gbnVsbDsgfVxuXG4gICAgLy8gUHJvcGFnYXRlIHRoZSBzY3JvbGwgcG9zaXRpb24gdG8gdGhlIGFjdHVhbCBET00gc2Nyb2xsZXJcbiAgICBpZiAob3Auc2Nyb2xsVG9wICE9IG51bGwpIHsgc2V0U2Nyb2xsVG9wKGNtLCBvcC5zY3JvbGxUb3AsIG9wLmZvcmNlU2Nyb2xsKTsgfVxuXG4gICAgaWYgKG9wLnNjcm9sbExlZnQgIT0gbnVsbCkgeyBzZXRTY3JvbGxMZWZ0KGNtLCBvcC5zY3JvbGxMZWZ0LCB0cnVlLCB0cnVlKTsgfVxuICAgIC8vIElmIHdlIG5lZWQgdG8gc2Nyb2xsIGEgc3BlY2lmaWMgcG9zaXRpb24gaW50byB2aWV3LCBkbyBzby5cbiAgICBpZiAob3Auc2Nyb2xsVG9Qb3MpIHtcbiAgICAgIHZhciByZWN0ID0gc2Nyb2xsUG9zSW50b1ZpZXcoY20sIGNsaXBQb3MoZG9jLCBvcC5zY3JvbGxUb1Bvcy5mcm9tKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcFBvcyhkb2MsIG9wLnNjcm9sbFRvUG9zLnRvKSwgb3Auc2Nyb2xsVG9Qb3MubWFyZ2luKTtcbiAgICAgIG1heWJlU2Nyb2xsV2luZG93KGNtLCByZWN0KTtcbiAgICB9XG5cbiAgICAvLyBGaXJlIGV2ZW50cyBmb3IgbWFya2VycyB0aGF0IGFyZSBoaWRkZW4vdW5pZGRlbiBieSBlZGl0aW5nIG9yXG4gICAgLy8gdW5kb2luZ1xuICAgIHZhciBoaWRkZW4gPSBvcC5tYXliZUhpZGRlbk1hcmtlcnMsIHVuaGlkZGVuID0gb3AubWF5YmVVbmhpZGRlbk1hcmtlcnM7XG4gICAgaWYgKGhpZGRlbikgeyBmb3IgKHZhciBpID0gMDsgaSA8IGhpZGRlbi5sZW5ndGg7ICsraSlcbiAgICAgIHsgaWYgKCFoaWRkZW5baV0ubGluZXMubGVuZ3RoKSB7IHNpZ25hbChoaWRkZW5baV0sIFwiaGlkZVwiKTsgfSB9IH1cbiAgICBpZiAodW5oaWRkZW4pIHsgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgdW5oaWRkZW4ubGVuZ3RoOyArK2kkMSlcbiAgICAgIHsgaWYgKHVuaGlkZGVuW2kkMV0ubGluZXMubGVuZ3RoKSB7IHNpZ25hbCh1bmhpZGRlbltpJDFdLCBcInVuaGlkZVwiKTsgfSB9IH1cblxuICAgIGlmIChkaXNwbGF5LndyYXBwZXIub2Zmc2V0SGVpZ2h0KVxuICAgICAgeyBkb2Muc2Nyb2xsVG9wID0gY20uZGlzcGxheS5zY3JvbGxlci5zY3JvbGxUb3A7IH1cblxuICAgIC8vIEZpcmUgY2hhbmdlIGV2ZW50cywgYW5kIGRlbGF5ZWQgZXZlbnQgaGFuZGxlcnNcbiAgICBpZiAob3AuY2hhbmdlT2JqcylcbiAgICAgIHsgc2lnbmFsKGNtLCBcImNoYW5nZXNcIiwgY20sIG9wLmNoYW5nZU9ianMpOyB9XG4gICAgaWYgKG9wLnVwZGF0ZSlcbiAgICAgIHsgb3AudXBkYXRlLmZpbmlzaCgpOyB9XG4gIH1cblxuICAvLyBSdW4gdGhlIGdpdmVuIGZ1bmN0aW9uIGluIGFuIG9wZXJhdGlvblxuICBmdW5jdGlvbiBydW5Jbk9wKGNtLCBmKSB7XG4gICAgaWYgKGNtLmN1ck9wKSB7IHJldHVybiBmKCkgfVxuICAgIHN0YXJ0T3BlcmF0aW9uKGNtKTtcbiAgICB0cnkgeyByZXR1cm4gZigpIH1cbiAgICBmaW5hbGx5IHsgZW5kT3BlcmF0aW9uKGNtKTsgfVxuICB9XG4gIC8vIFdyYXBzIGEgZnVuY3Rpb24gaW4gYW4gb3BlcmF0aW9uLiBSZXR1cm5zIHRoZSB3cmFwcGVkIGZ1bmN0aW9uLlxuICBmdW5jdGlvbiBvcGVyYXRpb24oY20sIGYpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoY20uY3VyT3ApIHsgcmV0dXJuIGYuYXBwbHkoY20sIGFyZ3VtZW50cykgfVxuICAgICAgc3RhcnRPcGVyYXRpb24oY20pO1xuICAgICAgdHJ5IHsgcmV0dXJuIGYuYXBwbHkoY20sIGFyZ3VtZW50cykgfVxuICAgICAgZmluYWxseSB7IGVuZE9wZXJhdGlvbihjbSk7IH1cbiAgICB9XG4gIH1cbiAgLy8gVXNlZCB0byBhZGQgbWV0aG9kcyB0byBlZGl0b3IgYW5kIGRvYyBpbnN0YW5jZXMsIHdyYXBwaW5nIHRoZW0gaW5cbiAgLy8gb3BlcmF0aW9ucy5cbiAgZnVuY3Rpb24gbWV0aG9kT3AoZikge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIGlmICh0aGlzLmN1ck9wKSB7IHJldHVybiBmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfVxuICAgICAgc3RhcnRPcGVyYXRpb24odGhpcyk7XG4gICAgICB0cnkgeyByZXR1cm4gZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpIH1cbiAgICAgIGZpbmFsbHkgeyBlbmRPcGVyYXRpb24odGhpcyk7IH1cbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZG9jTWV0aG9kT3AoZikge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBjbSA9IHRoaXMuY207XG4gICAgICBpZiAoIWNtIHx8IGNtLmN1ck9wKSB7IHJldHVybiBmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfVxuICAgICAgc3RhcnRPcGVyYXRpb24oY20pO1xuICAgICAgdHJ5IHsgcmV0dXJuIGYuYXBwbHkodGhpcywgYXJndW1lbnRzKSB9XG4gICAgICBmaW5hbGx5IHsgZW5kT3BlcmF0aW9uKGNtKTsgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEhJR0hMSUdIVCBXT1JLRVJcblxuICBmdW5jdGlvbiBzdGFydFdvcmtlcihjbSwgdGltZSkge1xuICAgIGlmIChjbS5kb2MuaGlnaGxpZ2h0RnJvbnRpZXIgPCBjbS5kaXNwbGF5LnZpZXdUbylcbiAgICAgIHsgY20uc3RhdGUuaGlnaGxpZ2h0LnNldCh0aW1lLCBiaW5kKGhpZ2hsaWdodFdvcmtlciwgY20pKTsgfVxuICB9XG5cbiAgZnVuY3Rpb24gaGlnaGxpZ2h0V29ya2VyKGNtKSB7XG4gICAgdmFyIGRvYyA9IGNtLmRvYztcbiAgICBpZiAoZG9jLmhpZ2hsaWdodEZyb250aWVyID49IGNtLmRpc3BsYXkudmlld1RvKSB7IHJldHVybiB9XG4gICAgdmFyIGVuZCA9ICtuZXcgRGF0ZSArIGNtLm9wdGlvbnMud29ya1RpbWU7XG4gICAgdmFyIGNvbnRleHQgPSBnZXRDb250ZXh0QmVmb3JlKGNtLCBkb2MuaGlnaGxpZ2h0RnJvbnRpZXIpO1xuICAgIHZhciBjaGFuZ2VkTGluZXMgPSBbXTtcblxuICAgIGRvYy5pdGVyKGNvbnRleHQubGluZSwgTWF0aC5taW4oZG9jLmZpcnN0ICsgZG9jLnNpemUsIGNtLmRpc3BsYXkudmlld1RvICsgNTAwKSwgZnVuY3Rpb24gKGxpbmUpIHtcbiAgICAgIGlmIChjb250ZXh0LmxpbmUgPj0gY20uZGlzcGxheS52aWV3RnJvbSkgeyAvLyBWaXNpYmxlXG4gICAgICAgIHZhciBvbGRTdHlsZXMgPSBsaW5lLnN0eWxlcztcbiAgICAgICAgdmFyIHJlc2V0U3RhdGUgPSBsaW5lLnRleHQubGVuZ3RoID4gY20ub3B0aW9ucy5tYXhIaWdobGlnaHRMZW5ndGggPyBjb3B5U3RhdGUoZG9jLm1vZGUsIGNvbnRleHQuc3RhdGUpIDogbnVsbDtcbiAgICAgICAgdmFyIGhpZ2hsaWdodGVkID0gaGlnaGxpZ2h0TGluZShjbSwgbGluZSwgY29udGV4dCwgdHJ1ZSk7XG4gICAgICAgIGlmIChyZXNldFN0YXRlKSB7IGNvbnRleHQuc3RhdGUgPSByZXNldFN0YXRlOyB9XG4gICAgICAgIGxpbmUuc3R5bGVzID0gaGlnaGxpZ2h0ZWQuc3R5bGVzO1xuICAgICAgICB2YXIgb2xkQ2xzID0gbGluZS5zdHlsZUNsYXNzZXMsIG5ld0NscyA9IGhpZ2hsaWdodGVkLmNsYXNzZXM7XG4gICAgICAgIGlmIChuZXdDbHMpIHsgbGluZS5zdHlsZUNsYXNzZXMgPSBuZXdDbHM7IH1cbiAgICAgICAgZWxzZSBpZiAob2xkQ2xzKSB7IGxpbmUuc3R5bGVDbGFzc2VzID0gbnVsbDsgfVxuICAgICAgICB2YXIgaXNjaGFuZ2UgPSAhb2xkU3R5bGVzIHx8IG9sZFN0eWxlcy5sZW5ndGggIT0gbGluZS5zdHlsZXMubGVuZ3RoIHx8XG4gICAgICAgICAgb2xkQ2xzICE9IG5ld0NscyAmJiAoIW9sZENscyB8fCAhbmV3Q2xzIHx8IG9sZENscy5iZ0NsYXNzICE9IG5ld0Nscy5iZ0NsYXNzIHx8IG9sZENscy50ZXh0Q2xhc3MgIT0gbmV3Q2xzLnRleHRDbGFzcyk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyAhaXNjaGFuZ2UgJiYgaSA8IG9sZFN0eWxlcy5sZW5ndGg7ICsraSkgeyBpc2NoYW5nZSA9IG9sZFN0eWxlc1tpXSAhPSBsaW5lLnN0eWxlc1tpXTsgfVxuICAgICAgICBpZiAoaXNjaGFuZ2UpIHsgY2hhbmdlZExpbmVzLnB1c2goY29udGV4dC5saW5lKTsgfVxuICAgICAgICBsaW5lLnN0YXRlQWZ0ZXIgPSBjb250ZXh0LnNhdmUoKTtcbiAgICAgICAgY29udGV4dC5uZXh0TGluZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGxpbmUudGV4dC5sZW5ndGggPD0gY20ub3B0aW9ucy5tYXhIaWdobGlnaHRMZW5ndGgpXG4gICAgICAgICAgeyBwcm9jZXNzTGluZShjbSwgbGluZS50ZXh0LCBjb250ZXh0KTsgfVxuICAgICAgICBsaW5lLnN0YXRlQWZ0ZXIgPSBjb250ZXh0LmxpbmUgJSA1ID09IDAgPyBjb250ZXh0LnNhdmUoKSA6IG51bGw7XG4gICAgICAgIGNvbnRleHQubmV4dExpbmUoKTtcbiAgICAgIH1cbiAgICAgIGlmICgrbmV3IERhdGUgPiBlbmQpIHtcbiAgICAgICAgc3RhcnRXb3JrZXIoY20sIGNtLm9wdGlvbnMud29ya0RlbGF5KTtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9KTtcbiAgICBkb2MuaGlnaGxpZ2h0RnJvbnRpZXIgPSBjb250ZXh0LmxpbmU7XG4gICAgZG9jLm1vZGVGcm9udGllciA9IE1hdGgubWF4KGRvYy5tb2RlRnJvbnRpZXIsIGNvbnRleHQubGluZSk7XG4gICAgaWYgKGNoYW5nZWRMaW5lcy5sZW5ndGgpIHsgcnVuSW5PcChjbSwgZnVuY3Rpb24gKCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFuZ2VkTGluZXMubGVuZ3RoOyBpKyspXG4gICAgICAgIHsgcmVnTGluZUNoYW5nZShjbSwgY2hhbmdlZExpbmVzW2ldLCBcInRleHRcIik7IH1cbiAgICB9KTsgfVxuICB9XG5cbiAgLy8gRElTUExBWSBEUkFXSU5HXG5cbiAgdmFyIERpc3BsYXlVcGRhdGUgPSBmdW5jdGlvbihjbSwgdmlld3BvcnQsIGZvcmNlKSB7XG4gICAgdmFyIGRpc3BsYXkgPSBjbS5kaXNwbGF5O1xuXG4gICAgdGhpcy52aWV3cG9ydCA9IHZpZXdwb3J0O1xuICAgIC8vIFN0b3JlIHNvbWUgdmFsdWVzIHRoYXQgd2UnbGwgbmVlZCBsYXRlciAoYnV0IGRvbid0IHdhbnQgdG8gZm9yY2UgYSByZWxheW91dCBmb3IpXG4gICAgdGhpcy52aXNpYmxlID0gdmlzaWJsZUxpbmVzKGRpc3BsYXksIGNtLmRvYywgdmlld3BvcnQpO1xuICAgIHRoaXMuZWRpdG9ySXNIaWRkZW4gPSAhZGlzcGxheS53cmFwcGVyLm9mZnNldFdpZHRoO1xuICAgIHRoaXMud3JhcHBlckhlaWdodCA9IGRpc3BsYXkud3JhcHBlci5jbGllbnRIZWlnaHQ7XG4gICAgdGhpcy53cmFwcGVyV2lkdGggPSBkaXNwbGF5LndyYXBwZXIuY2xpZW50V2lkdGg7XG4gICAgdGhpcy5vbGREaXNwbGF5V2lkdGggPSBkaXNwbGF5V2lkdGgoY20pO1xuICAgIHRoaXMuZm9yY2UgPSBmb3JjZTtcbiAgICB0aGlzLmRpbXMgPSBnZXREaW1lbnNpb25zKGNtKTtcbiAgICB0aGlzLmV2ZW50cyA9IFtdO1xuICB9O1xuXG4gIERpc3BsYXlVcGRhdGUucHJvdG90eXBlLnNpZ25hbCA9IGZ1bmN0aW9uIChlbWl0dGVyLCB0eXBlKSB7XG4gICAgaWYgKGhhc0hhbmRsZXIoZW1pdHRlciwgdHlwZSkpXG4gICAgICB7IHRoaXMuZXZlbnRzLnB1c2goYXJndW1lbnRzKTsgfVxuICB9O1xuICBEaXNwbGF5VXBkYXRlLnByb3RvdHlwZS5maW5pc2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmV2ZW50cy5sZW5ndGg7IGkrKylcbiAgICAgIHsgc2lnbmFsLmFwcGx5KG51bGwsIHRoaXMuZXZlbnRzW2ldKTsgfVxuICB9O1xuXG4gIGZ1bmN0aW9uIG1heWJlQ2xpcFNjcm9sbGJhcnMoY20pIHtcbiAgICB2YXIgZGlzcGxheSA9IGNtLmRpc3BsYXk7XG4gICAgaWYgKCFkaXNwbGF5LnNjcm9sbGJhcnNDbGlwcGVkICYmIGRpc3BsYXkuc2Nyb2xsZXIub2Zmc2V0V2lkdGgpIHtcbiAgICAgIGRpc3BsYXkubmF0aXZlQmFyV2lkdGggPSBkaXNwbGF5LnNjcm9sbGVyLm9mZnNldFdpZHRoIC0gZGlzcGxheS5zY3JvbGxlci5jbGllbnRXaWR0aDtcbiAgICAgIGRpc3BsYXkuaGVpZ2h0Rm9yY2VyLnN0eWxlLmhlaWdodCA9IHNjcm9sbEdhcChjbSkgKyBcInB4XCI7XG4gICAgICBkaXNwbGF5LnNpemVyLnN0eWxlLm1hcmdpbkJvdHRvbSA9IC1kaXNwbGF5Lm5hdGl2ZUJhcldpZHRoICsgXCJweFwiO1xuICAgICAgZGlzcGxheS5zaXplci5zdHlsZS5ib3JkZXJSaWdodFdpZHRoID0gc2Nyb2xsR2FwKGNtKSArIFwicHhcIjtcbiAgICAgIGRpc3BsYXkuc2Nyb2xsYmFyc0NsaXBwZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNlbGVjdGlvblNuYXBzaG90KGNtKSB7XG4gICAgaWYgKGNtLmhhc0ZvY3VzKCkpIHsgcmV0dXJuIG51bGwgfVxuICAgIHZhciBhY3RpdmUgPSBhY3RpdmVFbHQoKTtcbiAgICBpZiAoIWFjdGl2ZSB8fCAhY29udGFpbnMoY20uZGlzcGxheS5saW5lRGl2LCBhY3RpdmUpKSB7IHJldHVybiBudWxsIH1cbiAgICB2YXIgcmVzdWx0ID0ge2FjdGl2ZUVsdDogYWN0aXZlfTtcbiAgICBpZiAod2luZG93LmdldFNlbGVjdGlvbikge1xuICAgICAgdmFyIHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgIGlmIChzZWwuYW5jaG9yTm9kZSAmJiBzZWwuZXh0ZW5kICYmIGNvbnRhaW5zKGNtLmRpc3BsYXkubGluZURpdiwgc2VsLmFuY2hvck5vZGUpKSB7XG4gICAgICAgIHJlc3VsdC5hbmNob3JOb2RlID0gc2VsLmFuY2hvck5vZGU7XG4gICAgICAgIHJlc3VsdC5hbmNob3JPZmZzZXQgPSBzZWwuYW5jaG9yT2Zmc2V0O1xuICAgICAgICByZXN1bHQuZm9jdXNOb2RlID0gc2VsLmZvY3VzTm9kZTtcbiAgICAgICAgcmVzdWx0LmZvY3VzT2Zmc2V0ID0gc2VsLmZvY3VzT2Zmc2V0O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICBmdW5jdGlvbiByZXN0b3JlU2VsZWN0aW9uKHNuYXBzaG90KSB7XG4gICAgaWYgKCFzbmFwc2hvdCB8fCAhc25hcHNob3QuYWN0aXZlRWx0IHx8IHNuYXBzaG90LmFjdGl2ZUVsdCA9PSBhY3RpdmVFbHQoKSkgeyByZXR1cm4gfVxuICAgIHNuYXBzaG90LmFjdGl2ZUVsdC5mb2N1cygpO1xuICAgIGlmICghL14oSU5QVVR8VEVYVEFSRUEpJC8udGVzdChzbmFwc2hvdC5hY3RpdmVFbHQubm9kZU5hbWUpICYmXG4gICAgICAgIHNuYXBzaG90LmFuY2hvck5vZGUgJiYgY29udGFpbnMoZG9jdW1lbnQuYm9keSwgc25hcHNob3QuYW5jaG9yTm9kZSkgJiYgY29udGFpbnMoZG9jdW1lbnQuYm9keSwgc25hcHNob3QuZm9jdXNOb2RlKSkge1xuICAgICAgdmFyIHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKSwgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgICAgcmFuZ2Uuc2V0RW5kKHNuYXBzaG90LmFuY2hvck5vZGUsIHNuYXBzaG90LmFuY2hvck9mZnNldCk7XG4gICAgICByYW5nZS5jb2xsYXBzZShmYWxzZSk7XG4gICAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICBzZWwuYWRkUmFuZ2UocmFuZ2UpO1xuICAgICAgc2VsLmV4dGVuZChzbmFwc2hvdC5mb2N1c05vZGUsIHNuYXBzaG90LmZvY3VzT2Zmc2V0KTtcbiAgICB9XG4gIH1cblxuICAvLyBEb2VzIHRoZSBhY3R1YWwgdXBkYXRpbmcgb2YgdGhlIGxpbmUgZGlzcGxheS4gQmFpbHMgb3V0XG4gIC8vIChyZXR1cm5pbmcgZmFsc2UpIHdoZW4gdGhlcmUgaXMgbm90aGluZyB0byBiZSBkb25lIGFuZCBmb3JjZWQgaXNcbiAgLy8gZmFsc2UuXG4gIGZ1bmN0aW9uIHVwZGF0ZURpc3BsYXlJZk5lZWRlZChjbSwgdXBkYXRlKSB7XG4gICAgdmFyIGRpc3BsYXkgPSBjbS5kaXNwbGF5LCBkb2MgPSBjbS5kb2M7XG5cbiAgICBpZiAodXBkYXRlLmVkaXRvcklzSGlkZGVuKSB7XG4gICAgICByZXNldFZpZXcoY20pO1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgLy8gQmFpbCBvdXQgaWYgdGhlIHZpc2libGUgYXJlYSBpcyBhbHJlYWR5IHJlbmRlcmVkIGFuZCBub3RoaW5nIGNoYW5nZWQuXG4gICAgaWYgKCF1cGRhdGUuZm9yY2UgJiZcbiAgICAgICAgdXBkYXRlLnZpc2libGUuZnJvbSA+PSBkaXNwbGF5LnZpZXdGcm9tICYmIHVwZGF0ZS52aXNpYmxlLnRvIDw9IGRpc3BsYXkudmlld1RvICYmXG4gICAgICAgIChkaXNwbGF5LnVwZGF0ZUxpbmVOdW1iZXJzID09IG51bGwgfHwgZGlzcGxheS51cGRhdGVMaW5lTnVtYmVycyA+PSBkaXNwbGF5LnZpZXdUbykgJiZcbiAgICAgICAgZGlzcGxheS5yZW5kZXJlZFZpZXcgPT0gZGlzcGxheS52aWV3ICYmIGNvdW50RGlydHlWaWV3KGNtKSA9PSAwKVxuICAgICAgeyByZXR1cm4gZmFsc2UgfVxuXG4gICAgaWYgKG1heWJlVXBkYXRlTGluZU51bWJlcldpZHRoKGNtKSkge1xuICAgICAgcmVzZXRWaWV3KGNtKTtcbiAgICAgIHVwZGF0ZS5kaW1zID0gZ2V0RGltZW5zaW9ucyhjbSk7XG4gICAgfVxuXG4gICAgLy8gQ29tcHV0ZSBhIHN1aXRhYmxlIG5ldyB2aWV3cG9ydCAoZnJvbSAmIHRvKVxuICAgIHZhciBlbmQgPSBkb2MuZmlyc3QgKyBkb2Muc2l6ZTtcbiAgICB2YXIgZnJvbSA9IE1hdGgubWF4KHVwZGF0ZS52aXNpYmxlLmZyb20gLSBjbS5vcHRpb25zLnZpZXdwb3J0TWFyZ2luLCBkb2MuZmlyc3QpO1xuICAgIHZhciB0byA9IE1hdGgubWluKGVuZCwgdXBkYXRlLnZpc2libGUudG8gKyBjbS5vcHRpb25zLnZpZXdwb3J0TWFyZ2luKTtcbiAgICBpZiAoZGlzcGxheS52aWV3RnJvbSA8IGZyb20gJiYgZnJvbSAtIGRpc3BsYXkudmlld0Zyb20gPCAyMCkgeyBmcm9tID0gTWF0aC5tYXgoZG9jLmZpcnN0LCBkaXNwbGF5LnZpZXdGcm9tKTsgfVxuICAgIGlmIChkaXNwbGF5LnZpZXdUbyA+IHRvICYmIGRpc3BsYXkudmlld1RvIC0gdG8gPCAyMCkgeyB0byA9IE1hdGgubWluKGVuZCwgZGlzcGxheS52aWV3VG8pOyB9XG4gICAgaWYgKHNhd0NvbGxhcHNlZFNwYW5zKSB7XG4gICAgICBmcm9tID0gdmlzdWFsTGluZU5vKGNtLmRvYywgZnJvbSk7XG4gICAgICB0byA9IHZpc3VhbExpbmVFbmRObyhjbS5kb2MsIHRvKTtcbiAgICB9XG5cbiAgICB2YXIgZGlmZmVyZW50ID0gZnJvbSAhPSBkaXNwbGF5LnZpZXdGcm9tIHx8IHRvICE9IGRpc3BsYXkudmlld1RvIHx8XG4gICAgICBkaXNwbGF5Lmxhc3RXcmFwSGVpZ2h0ICE9IHVwZGF0ZS53cmFwcGVySGVpZ2h0IHx8IGRpc3BsYXkubGFzdFdyYXBXaWR0aCAhPSB1cGRhdGUud3JhcHBlcldpZHRoO1xuICAgIGFkanVzdFZpZXcoY20sIGZyb20sIHRvKTtcblxuICAgIGRpc3BsYXkudmlld09mZnNldCA9IGhlaWdodEF0TGluZShnZXRMaW5lKGNtLmRvYywgZGlzcGxheS52aWV3RnJvbSkpO1xuICAgIC8vIFBvc2l0aW9uIHRoZSBtb3ZlciBkaXYgdG8gYWxpZ24gd2l0aCB0aGUgY3VycmVudCBzY3JvbGwgcG9zaXRpb25cbiAgICBjbS5kaXNwbGF5Lm1vdmVyLnN0eWxlLnRvcCA9IGRpc3BsYXkudmlld09mZnNldCArIFwicHhcIjtcblxuICAgIHZhciB0b1VwZGF0ZSA9IGNvdW50RGlydHlWaWV3KGNtKTtcbiAgICBpZiAoIWRpZmZlcmVudCAmJiB0b1VwZGF0ZSA9PSAwICYmICF1cGRhdGUuZm9yY2UgJiYgZGlzcGxheS5yZW5kZXJlZFZpZXcgPT0gZGlzcGxheS52aWV3ICYmXG4gICAgICAgIChkaXNwbGF5LnVwZGF0ZUxpbmVOdW1iZXJzID09IG51bGwgfHwgZGlzcGxheS51cGRhdGVMaW5lTnVtYmVycyA+PSBkaXNwbGF5LnZpZXdUbykpXG4gICAgICB7IHJldHVybiBmYWxzZSB9XG5cbiAgICAvLyBGb3IgYmlnIGNoYW5nZXMsIHdlIGhpZGUgdGhlIGVuY2xvc2luZyBlbGVtZW50IGR1cmluZyB0aGVcbiAgICAvLyB1cGRhdGUsIHNpbmNlIHRoYXQgc3BlZWRzIHVwIHRoZSBvcGVyYXRpb25zIG9uIG1vc3QgYnJvd3NlcnMuXG4gICAgdmFyIHNlbFNuYXBzaG90ID0gc2VsZWN0aW9uU25hcHNob3QoY20pO1xuICAgIGlmICh0b1VwZGF0ZSA+IDQpIHsgZGlzcGxheS5saW5lRGl2LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjsgfVxuICAgIHBhdGNoRGlzcGxheShjbSwgZGlzcGxheS51cGRhdGVMaW5lTnVtYmVycywgdXBkYXRlLmRpbXMpO1xuICAgIGlmICh0b1VwZGF0ZSA+IDQpIHsgZGlzcGxheS5saW5lRGl2LnN0eWxlLmRpc3BsYXkgPSBcIlwiOyB9XG4gICAgZGlzcGxheS5yZW5kZXJlZFZpZXcgPSBkaXNwbGF5LnZpZXc7XG4gICAgLy8gVGhlcmUgbWlnaHQgaGF2ZSBiZWVuIGEgd2lkZ2V0IHdpdGggYSBmb2N1c2VkIGVsZW1lbnQgdGhhdCBnb3RcbiAgICAvLyBoaWRkZW4gb3IgdXBkYXRlZCwgaWYgc28gcmUtZm9jdXMgaXQuXG4gICAgcmVzdG9yZVNlbGVjdGlvbihzZWxTbmFwc2hvdCk7XG5cbiAgICAvLyBQcmV2ZW50IHNlbGVjdGlvbiBhbmQgY3Vyc29ycyBmcm9tIGludGVyZmVyaW5nIHdpdGggdGhlIHNjcm9sbFxuICAgIC8vIHdpZHRoIGFuZCBoZWlnaHQuXG4gICAgcmVtb3ZlQ2hpbGRyZW4oZGlzcGxheS5jdXJzb3JEaXYpO1xuICAgIHJlbW92ZUNoaWxkcmVuKGRpc3BsYXkuc2VsZWN0aW9uRGl2KTtcbiAgICBkaXNwbGF5Lmd1dHRlcnMuc3R5bGUuaGVpZ2h0ID0gZGlzcGxheS5zaXplci5zdHlsZS5taW5IZWlnaHQgPSAwO1xuXG4gICAgaWYgKGRpZmZlcmVudCkge1xuICAgICAgZGlzcGxheS5sYXN0V3JhcEhlaWdodCA9IHVwZGF0ZS53cmFwcGVySGVpZ2h0O1xuICAgICAgZGlzcGxheS5sYXN0V3JhcFdpZHRoID0gdXBkYXRlLndyYXBwZXJXaWR0aDtcbiAgICAgIHN0YXJ0V29ya2VyKGNtLCA0MDApO1xuICAgIH1cblxuICAgIGRpc3BsYXkudXBkYXRlTGluZU51bWJlcnMgPSBudWxsO1xuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGZ1bmN0aW9uIHBvc3RVcGRhdGVEaXNwbGF5KGNtLCB1cGRhdGUpIHtcbiAgICB2YXIgdmlld3BvcnQgPSB1cGRhdGUudmlld3BvcnQ7XG5cbiAgICBmb3IgKHZhciBmaXJzdCA9IHRydWU7OyBmaXJzdCA9IGZhbHNlKSB7XG4gICAgICBpZiAoIWZpcnN0IHx8ICFjbS5vcHRpb25zLmxpbmVXcmFwcGluZyB8fCB1cGRhdGUub2xkRGlzcGxheVdpZHRoID09IGRpc3BsYXlXaWR0aChjbSkpIHtcbiAgICAgICAgLy8gQ2xpcCBmb3JjZWQgdmlld3BvcnQgdG8gYWN0dWFsIHNjcm9sbGFibGUgYXJlYS5cbiAgICAgICAgaWYgKHZpZXdwb3J0ICYmIHZpZXdwb3J0LnRvcCAhPSBudWxsKVxuICAgICAgICAgIHsgdmlld3BvcnQgPSB7dG9wOiBNYXRoLm1pbihjbS5kb2MuaGVpZ2h0ICsgcGFkZGluZ1ZlcnQoY20uZGlzcGxheSkgLSBkaXNwbGF5SGVpZ2h0KGNtKSwgdmlld3BvcnQudG9wKX07IH1cbiAgICAgICAgLy8gVXBkYXRlZCBsaW5lIGhlaWdodHMgbWlnaHQgcmVzdWx0IGluIHRoZSBkcmF3biBhcmVhIG5vdFxuICAgICAgICAvLyBhY3R1YWxseSBjb3ZlcmluZyB0aGUgdmlld3BvcnQuIEtlZXAgbG9vcGluZyB1bnRpbCBpdCBkb2VzLlxuICAgICAgICB1cGRhdGUudmlzaWJsZSA9IHZpc2libGVMaW5lcyhjbS5kaXNwbGF5LCBjbS5kb2MsIHZpZXdwb3J0KTtcbiAgICAgICAgaWYgKHVwZGF0ZS52aXNpYmxlLmZyb20gPj0gY20uZGlzcGxheS52aWV3RnJvbSAmJiB1cGRhdGUudmlzaWJsZS50byA8PSBjbS5kaXNwbGF5LnZpZXdUbylcbiAgICAgICAgICB7IGJyZWFrIH1cbiAgICAgIH0gZWxzZSBpZiAoZmlyc3QpIHtcbiAgICAgICAgdXBkYXRlLnZpc2libGUgPSB2aXNpYmxlTGluZXMoY20uZGlzcGxheSwgY20uZG9jLCB2aWV3cG9ydCk7XG4gICAgICB9XG4gICAgICBpZiAoIXVwZGF0ZURpc3BsYXlJZk5lZWRlZChjbSwgdXBkYXRlKSkgeyBicmVhayB9XG4gICAgICB1cGRhdGVIZWlnaHRzSW5WaWV3cG9ydChjbSk7XG4gICAgICB2YXIgYmFyTWVhc3VyZSA9IG1lYXN1cmVGb3JTY3JvbGxiYXJzKGNtKTtcbiAgICAgIHVwZGF0ZVNlbGVjdGlvbihjbSk7XG4gICAgICB1cGRhdGVTY3JvbGxiYXJzKGNtLCBiYXJNZWFzdXJlKTtcbiAgICAgIHNldERvY3VtZW50SGVpZ2h0KGNtLCBiYXJNZWFzdXJlKTtcbiAgICAgIHVwZGF0ZS5mb3JjZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIHVwZGF0ZS5zaWduYWwoY20sIFwidXBkYXRlXCIsIGNtKTtcbiAgICBpZiAoY20uZGlzcGxheS52aWV3RnJvbSAhPSBjbS5kaXNwbGF5LnJlcG9ydGVkVmlld0Zyb20gfHwgY20uZGlzcGxheS52aWV3VG8gIT0gY20uZGlzcGxheS5yZXBvcnRlZFZpZXdUbykge1xuICAgICAgdXBkYXRlLnNpZ25hbChjbSwgXCJ2aWV3cG9ydENoYW5nZVwiLCBjbSwgY20uZGlzcGxheS52aWV3RnJvbSwgY20uZGlzcGxheS52aWV3VG8pO1xuICAgICAgY20uZGlzcGxheS5yZXBvcnRlZFZpZXdGcm9tID0gY20uZGlzcGxheS52aWV3RnJvbTsgY20uZGlzcGxheS5yZXBvcnRlZFZpZXdUbyA9IGNtLmRpc3BsYXkudmlld1RvO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZURpc3BsYXlTaW1wbGUoY20sIHZpZXdwb3J0KSB7XG4gICAgdmFyIHVwZGF0ZSA9IG5ldyBEaXNwbGF5VXBkYXRlKGNtLCB2aWV3cG9ydCk7XG4gICAgaWYgKHVwZGF0ZURpc3BsYXlJZk5lZWRlZChjbSwgdXBkYXRlKSkge1xuICAgICAgdXBkYXRlSGVpZ2h0c0luVmlld3BvcnQoY20pO1xuICAgICAgcG9zdFVwZGF0ZURpc3BsYXkoY20sIHVwZGF0ZSk7XG4gICAgICB2YXIgYmFyTWVhc3VyZSA9IG1lYXN1cmVGb3JTY3JvbGxiYXJzKGNtKTtcbiAgICAgIHVwZGF0ZVNlbGVjdGlvbihjbSk7XG4gICAgICB1cGRhdGVTY3JvbGxiYXJzKGNtLCBiYXJNZWFzdXJlKTtcbiAgICAgIHNldERvY3VtZW50SGVpZ2h0KGNtLCBiYXJNZWFzdXJlKTtcbiAgICAgIHVwZGF0ZS5maW5pc2goKTtcbiAgICB9XG4gIH1cblxuICAvLyBTeW5jIHRoZSBhY3R1YWwgZGlzcGxheSBET00gc3RydWN0dXJlIHdpdGggZGlzcGxheS52aWV3LCByZW1vdmluZ1xuICAvLyBub2RlcyBmb3IgbGluZXMgdGhhdCBhcmUgbm8gbG9uZ2VyIGluIHZpZXcsIGFuZCBjcmVhdGluZyB0aGUgb25lc1xuICAvLyB0aGF0IGFyZSBub3QgdGhlcmUgeWV0LCBhbmQgdXBkYXRpbmcgdGhlIG9uZXMgdGhhdCBhcmUgb3V0IG9mXG4gIC8vIGRhdGUuXG4gIGZ1bmN0aW9uIHBhdGNoRGlzcGxheShjbSwgdXBkYXRlTnVtYmVyc0Zyb20sIGRpbXMpIHtcbiAgICB2YXIgZGlzcGxheSA9IGNtLmRpc3BsYXksIGxpbmVOdW1iZXJzID0gY20ub3B0aW9ucy5saW5lTnVtYmVycztcbiAgICB2YXIgY29udGFpbmVyID0gZGlzcGxheS5saW5lRGl2LCBjdXIgPSBjb250YWluZXIuZmlyc3RDaGlsZDtcblxuICAgIGZ1bmN0aW9uIHJtKG5vZGUpIHtcbiAgICAgIHZhciBuZXh0ID0gbm9kZS5uZXh0U2libGluZztcbiAgICAgIC8vIFdvcmtzIGFyb3VuZCBhIHRocm93LXNjcm9sbCBidWcgaW4gT1MgWCBXZWJraXRcbiAgICAgIGlmICh3ZWJraXQgJiYgbWFjICYmIGNtLmRpc3BsYXkuY3VycmVudFdoZWVsVGFyZ2V0ID09IG5vZGUpXG4gICAgICAgIHsgbm9kZS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7IH1cbiAgICAgIGVsc2VcbiAgICAgICAgeyBub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7IH1cbiAgICAgIHJldHVybiBuZXh0XG4gICAgfVxuXG4gICAgdmFyIHZpZXcgPSBkaXNwbGF5LnZpZXcsIGxpbmVOID0gZGlzcGxheS52aWV3RnJvbTtcbiAgICAvLyBMb29wIG92ZXIgdGhlIGVsZW1lbnRzIGluIHRoZSB2aWV3LCBzeW5jaW5nIGN1ciAodGhlIERPTSBub2Rlc1xuICAgIC8vIGluIGRpc3BsYXkubGluZURpdikgd2l0aCB0aGUgdmlldyBhcyB3ZSBnby5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZpZXcubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBsaW5lVmlldyA9IHZpZXdbaV07XG4gICAgICBpZiAobGluZVZpZXcuaGlkZGVuKSA7IGVsc2UgaWYgKCFsaW5lVmlldy5ub2RlIHx8IGxpbmVWaWV3Lm5vZGUucGFyZW50Tm9kZSAhPSBjb250YWluZXIpIHsgLy8gTm90IGRyYXduIHlldFxuICAgICAgICB2YXIgbm9kZSA9IGJ1aWxkTGluZUVsZW1lbnQoY20sIGxpbmVWaWV3LCBsaW5lTiwgZGltcyk7XG4gICAgICAgIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUobm9kZSwgY3VyKTtcbiAgICAgIH0gZWxzZSB7IC8vIEFscmVhZHkgZHJhd25cbiAgICAgICAgd2hpbGUgKGN1ciAhPSBsaW5lVmlldy5ub2RlKSB7IGN1ciA9IHJtKGN1cik7IH1cbiAgICAgICAgdmFyIHVwZGF0ZU51bWJlciA9IGxpbmVOdW1iZXJzICYmIHVwZGF0ZU51bWJlcnNGcm9tICE9IG51bGwgJiZcbiAgICAgICAgICB1cGRhdGVOdW1iZXJzRnJvbSA8PSBsaW5lTiAmJiBsaW5lVmlldy5saW5lTnVtYmVyO1xuICAgICAgICBpZiAobGluZVZpZXcuY2hhbmdlcykge1xuICAgICAgICAgIGlmIChpbmRleE9mKGxpbmVWaWV3LmNoYW5nZXMsIFwiZ3V0dGVyXCIpID4gLTEpIHsgdXBkYXRlTnVtYmVyID0gZmFsc2U7IH1cbiAgICAgICAgICB1cGRhdGVMaW5lRm9yQ2hhbmdlcyhjbSwgbGluZVZpZXcsIGxpbmVOLCBkaW1zKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXBkYXRlTnVtYmVyKSB7XG4gICAgICAgICAgcmVtb3ZlQ2hpbGRyZW4obGluZVZpZXcubGluZU51bWJlcik7XG4gICAgICAgICAgbGluZVZpZXcubGluZU51bWJlci5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShsaW5lTnVtYmVyRm9yKGNtLm9wdGlvbnMsIGxpbmVOKSkpO1xuICAgICAgICB9XG4gICAgICAgIGN1ciA9IGxpbmVWaWV3Lm5vZGUubmV4dFNpYmxpbmc7XG4gICAgICB9XG4gICAgICBsaW5lTiArPSBsaW5lVmlldy5zaXplO1xuICAgIH1cbiAgICB3aGlsZSAoY3VyKSB7IGN1ciA9IHJtKGN1cik7IH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUd1dHRlclNwYWNlKGRpc3BsYXkpIHtcbiAgICB2YXIgd2lkdGggPSBkaXNwbGF5Lmd1dHRlcnMub2Zmc2V0V2lkdGg7XG4gICAgZGlzcGxheS5zaXplci5zdHlsZS5tYXJnaW5MZWZ0ID0gd2lkdGggKyBcInB4XCI7XG4gICAgLy8gU2VuZCBhbiBldmVudCB0byBjb25zdW1lcnMgcmVzcG9uZGluZyB0byBjaGFuZ2VzIGluIGd1dHRlciB3aWR0aC5cbiAgICBzaWduYWxMYXRlcihkaXNwbGF5LCBcImd1dHRlckNoYW5nZWRcIiwgZGlzcGxheSk7XG4gIH1cblxuICBmdW5jdGlvbiBzZXREb2N1bWVudEhlaWdodChjbSwgbWVhc3VyZSkge1xuICAgIGNtLmRpc3BsYXkuc2l6ZXIuc3R5bGUubWluSGVpZ2h0ID0gbWVhc3VyZS5kb2NIZWlnaHQgKyBcInB4XCI7XG4gICAgY20uZGlzcGxheS5oZWlnaHRGb3JjZXIuc3R5bGUudG9wID0gbWVhc3VyZS5kb2NIZWlnaHQgKyBcInB4XCI7XG4gICAgY20uZGlzcGxheS5ndXR0ZXJzLnN0eWxlLmhlaWdodCA9IChtZWFzdXJlLmRvY0hlaWdodCArIGNtLmRpc3BsYXkuYmFySGVpZ2h0ICsgc2Nyb2xsR2FwKGNtKSkgKyBcInB4XCI7XG4gIH1cblxuICAvLyBSZS1hbGlnbiBsaW5lIG51bWJlcnMgYW5kIGd1dHRlciBtYXJrcyB0byBjb21wZW5zYXRlIGZvclxuICAvLyBob3Jpem9udGFsIHNjcm9sbGluZy5cbiAgZnVuY3Rpb24gYWxpZ25Ib3Jpem9udGFsbHkoY20pIHtcbiAgICB2YXIgZGlzcGxheSA9IGNtLmRpc3BsYXksIHZpZXcgPSBkaXNwbGF5LnZpZXc7XG4gICAgaWYgKCFkaXNwbGF5LmFsaWduV2lkZ2V0cyAmJiAoIWRpc3BsYXkuZ3V0dGVycy5maXJzdENoaWxkIHx8ICFjbS5vcHRpb25zLmZpeGVkR3V0dGVyKSkgeyByZXR1cm4gfVxuICAgIHZhciBjb21wID0gY29tcGVuc2F0ZUZvckhTY3JvbGwoZGlzcGxheSkgLSBkaXNwbGF5LnNjcm9sbGVyLnNjcm9sbExlZnQgKyBjbS5kb2Muc2Nyb2xsTGVmdDtcbiAgICB2YXIgZ3V0dGVyVyA9IGRpc3BsYXkuZ3V0dGVycy5vZmZzZXRXaWR0aCwgbGVmdCA9IGNvbXAgKyBcInB4XCI7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2aWV3Lmxlbmd0aDsgaSsrKSB7IGlmICghdmlld1tpXS5oaWRkZW4pIHtcbiAgICAgIGlmIChjbS5vcHRpb25zLmZpeGVkR3V0dGVyKSB7XG4gICAgICAgIGlmICh2aWV3W2ldLmd1dHRlcilcbiAgICAgICAgICB7IHZpZXdbaV0uZ3V0dGVyLnN0eWxlLmxlZnQgPSBsZWZ0OyB9XG4gICAgICAgIGlmICh2aWV3W2ldLmd1dHRlckJhY2tncm91bmQpXG4gICAgICAgICAgeyB2aWV3W2ldLmd1dHRlckJhY2tncm91bmQuc3R5bGUubGVmdCA9IGxlZnQ7IH1cbiAgICAgIH1cbiAgICAgIHZhciBhbGlnbiA9IHZpZXdbaV0uYWxpZ25hYmxlO1xuICAgICAgaWYgKGFsaWduKSB7IGZvciAodmFyIGogPSAwOyBqIDwgYWxpZ24ubGVuZ3RoOyBqKyspXG4gICAgICAgIHsgYWxpZ25bal0uc3R5bGUubGVmdCA9IGxlZnQ7IH0gfVxuICAgIH0gfVxuICAgIGlmIChjbS5vcHRpb25zLmZpeGVkR3V0dGVyKVxuICAgICAgeyBkaXNwbGF5Lmd1dHRlcnMuc3R5bGUubGVmdCA9IChjb21wICsgZ3V0dGVyVykgKyBcInB4XCI7IH1cbiAgfVxuXG4gIC8vIFVzZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGxpbmUgbnVtYmVyIGd1dHRlciBpcyBzdGlsbCB0aGUgcmlnaHRcbiAgLy8gc2l6ZSBmb3IgdGhlIGN1cnJlbnQgZG9jdW1lbnQgc2l6ZS4gUmV0dXJucyB0cnVlIHdoZW4gYW4gdXBkYXRlXG4gIC8vIGlzIG5lZWRlZC5cbiAgZnVuY3Rpb24gbWF5YmVVcGRhdGVMaW5lTnVtYmVyV2lkdGgoY20pIHtcbiAgICBpZiAoIWNtLm9wdGlvbnMubGluZU51bWJlcnMpIHsgcmV0dXJuIGZhbHNlIH1cbiAgICB2YXIgZG9jID0gY20uZG9jLCBsYXN0ID0gbGluZU51bWJlckZvcihjbS5vcHRpb25zLCBkb2MuZmlyc3QgKyBkb2Muc2l6ZSAtIDEpLCBkaXNwbGF5ID0gY20uZGlzcGxheTtcbiAgICBpZiAobGFzdC5sZW5ndGggIT0gZGlzcGxheS5saW5lTnVtQ2hhcnMpIHtcbiAgICAgIHZhciB0ZXN0ID0gZGlzcGxheS5tZWFzdXJlLmFwcGVuZENoaWxkKGVsdChcImRpdlwiLCBbZWx0KFwiZGl2XCIsIGxhc3QpXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkNvZGVNaXJyb3ItbGluZW51bWJlciBDb2RlTWlycm9yLWd1dHRlci1lbHRcIikpO1xuICAgICAgdmFyIGlubmVyVyA9IHRlc3QuZmlyc3RDaGlsZC5vZmZzZXRXaWR0aCwgcGFkZGluZyA9IHRlc3Qub2Zmc2V0V2lkdGggLSBpbm5lclc7XG4gICAgICBkaXNwbGF5LmxpbmVHdXR0ZXIuc3R5bGUud2lkdGggPSBcIlwiO1xuICAgICAgZGlzcGxheS5saW5lTnVtSW5uZXJXaWR0aCA9IE1hdGgubWF4KGlubmVyVywgZGlzcGxheS5saW5lR3V0dGVyLm9mZnNldFdpZHRoIC0gcGFkZGluZykgKyAxO1xuICAgICAgZGlzcGxheS5saW5lTnVtV2lkdGggPSBkaXNwbGF5LmxpbmVOdW1Jbm5lcldpZHRoICsgcGFkZGluZztcbiAgICAgIGRpc3BsYXkubGluZU51bUNoYXJzID0gZGlzcGxheS5saW5lTnVtSW5uZXJXaWR0aCA/IGxhc3QubGVuZ3RoIDogLTE7XG4gICAgICBkaXNwbGF5LmxpbmVHdXR0ZXIuc3R5bGUud2lkdGggPSBkaXNwbGF5LmxpbmVOdW1XaWR0aCArIFwicHhcIjtcbiAgICAgIHVwZGF0ZUd1dHRlclNwYWNlKGNtLmRpc3BsYXkpO1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBmdW5jdGlvbiBnZXRHdXR0ZXJzKGd1dHRlcnMsIGxpbmVOdW1iZXJzKSB7XG4gICAgdmFyIHJlc3VsdCA9IFtdLCBzYXdMaW5lTnVtYmVycyA9IGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ3V0dGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG5hbWUgPSBndXR0ZXJzW2ldLCBzdHlsZSA9IG51bGw7XG4gICAgICBpZiAodHlwZW9mIG5hbWUgIT0gXCJzdHJpbmdcIikgeyBzdHlsZSA9IG5hbWUuc3R5bGU7IG5hbWUgPSBuYW1lLmNsYXNzTmFtZTsgfVxuICAgICAgaWYgKG5hbWUgPT0gXCJDb2RlTWlycm9yLWxpbmVudW1iZXJzXCIpIHtcbiAgICAgICAgaWYgKCFsaW5lTnVtYmVycykgeyBjb250aW51ZSB9XG4gICAgICAgIGVsc2UgeyBzYXdMaW5lTnVtYmVycyA9IHRydWU7IH1cbiAgICAgIH1cbiAgICAgIHJlc3VsdC5wdXNoKHtjbGFzc05hbWU6IG5hbWUsIHN0eWxlOiBzdHlsZX0pO1xuICAgIH1cbiAgICBpZiAobGluZU51bWJlcnMgJiYgIXNhd0xpbmVOdW1iZXJzKSB7IHJlc3VsdC5wdXNoKHtjbGFzc05hbWU6IFwiQ29kZU1pcnJvci1saW5lbnVtYmVyc1wiLCBzdHlsZTogbnVsbH0pOyB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLy8gUmVidWlsZCB0aGUgZ3V0dGVyIGVsZW1lbnRzLCBlbnN1cmUgdGhlIG1hcmdpbiB0byB0aGUgbGVmdCBvZiB0aGVcbiAgLy8gY29kZSBtYXRjaGVzIHRoZWlyIHdpZHRoLlxuICBmdW5jdGlvbiByZW5kZXJHdXR0ZXJzKGRpc3BsYXkpIHtcbiAgICB2YXIgZ3V0dGVycyA9IGRpc3BsYXkuZ3V0dGVycywgc3BlY3MgPSBkaXNwbGF5Lmd1dHRlclNwZWNzO1xuICAgIHJlbW92ZUNoaWxkcmVuKGd1dHRlcnMpO1xuICAgIGRpc3BsYXkubGluZUd1dHRlciA9IG51bGw7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzcGVjcy5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIHJlZiA9IHNwZWNzW2ldO1xuICAgICAgdmFyIGNsYXNzTmFtZSA9IHJlZi5jbGFzc05hbWU7XG4gICAgICB2YXIgc3R5bGUgPSByZWYuc3R5bGU7XG4gICAgICB2YXIgZ0VsdCA9IGd1dHRlcnMuYXBwZW5kQ2hpbGQoZWx0KFwiZGl2XCIsIG51bGwsIFwiQ29kZU1pcnJvci1ndXR0ZXIgXCIgKyBjbGFzc05hbWUpKTtcbiAgICAgIGlmIChzdHlsZSkgeyBnRWx0LnN0eWxlLmNzc1RleHQgPSBzdHlsZTsgfVxuICAgICAgaWYgKGNsYXNzTmFtZSA9PSBcIkNvZGVNaXJyb3ItbGluZW51bWJlcnNcIikge1xuICAgICAgICBkaXNwbGF5LmxpbmVHdXR0ZXIgPSBnRWx0O1xuICAgICAgICBnRWx0LnN0eWxlLndpZHRoID0gKGRpc3BsYXkubGluZU51bVdpZHRoIHx8IDEpICsgXCJweFwiO1xuICAgICAgfVxuICAgIH1cbiAgICBndXR0ZXJzLnN0eWxlLmRpc3BsYXkgPSBzcGVjcy5sZW5ndGggPyBcIlwiIDogXCJub25lXCI7XG4gICAgdXBkYXRlR3V0dGVyU3BhY2UoZGlzcGxheSk7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVHdXR0ZXJzKGNtKSB7XG4gICAgcmVuZGVyR3V0dGVycyhjbS5kaXNwbGF5KTtcbiAgICByZWdDaGFuZ2UoY20pO1xuICAgIGFsaWduSG9yaXpvbnRhbGx5KGNtKTtcbiAgfVxuXG4gIC8vIFRoZSBkaXNwbGF5IGhhbmRsZXMgdGhlIERPTSBpbnRlZ3JhdGlvbiwgYm90aCBmb3IgaW5wdXQgcmVhZGluZ1xuICAvLyBhbmQgY29udGVudCBkcmF3aW5nLiBJdCBob2xkcyByZWZlcmVuY2VzIHRvIERPTSBub2RlcyBhbmRcbiAgLy8gZGlzcGxheS1yZWxhdGVkIHN0YXRlLlxuXG4gIGZ1bmN0aW9uIERpc3BsYXkocGxhY2UsIGRvYywgaW5wdXQsIG9wdGlvbnMpIHtcbiAgICB2YXIgZCA9IHRoaXM7XG4gICAgdGhpcy5pbnB1dCA9IGlucHV0O1xuXG4gICAgLy8gQ292ZXJzIGJvdHRvbS1yaWdodCBzcXVhcmUgd2hlbiBib3RoIHNjcm9sbGJhcnMgYXJlIHByZXNlbnQuXG4gICAgZC5zY3JvbGxiYXJGaWxsZXIgPSBlbHQoXCJkaXZcIiwgbnVsbCwgXCJDb2RlTWlycm9yLXNjcm9sbGJhci1maWxsZXJcIik7XG4gICAgZC5zY3JvbGxiYXJGaWxsZXIuc2V0QXR0cmlidXRlKFwiY20tbm90LWNvbnRlbnRcIiwgXCJ0cnVlXCIpO1xuICAgIC8vIENvdmVycyBib3R0b20gb2YgZ3V0dGVyIHdoZW4gY292ZXJHdXR0ZXJOZXh0VG9TY3JvbGxiYXIgaXMgb25cbiAgICAvLyBhbmQgaCBzY3JvbGxiYXIgaXMgcHJlc2VudC5cbiAgICBkLmd1dHRlckZpbGxlciA9IGVsdChcImRpdlwiLCBudWxsLCBcIkNvZGVNaXJyb3ItZ3V0dGVyLWZpbGxlclwiKTtcbiAgICBkLmd1dHRlckZpbGxlci5zZXRBdHRyaWJ1dGUoXCJjbS1ub3QtY29udGVudFwiLCBcInRydWVcIik7XG4gICAgLy8gV2lsbCBjb250YWluIHRoZSBhY3R1YWwgY29kZSwgcG9zaXRpb25lZCB0byBjb3ZlciB0aGUgdmlld3BvcnQuXG4gICAgZC5saW5lRGl2ID0gZWx0UChcImRpdlwiLCBudWxsLCBcIkNvZGVNaXJyb3ItY29kZVwiKTtcbiAgICAvLyBFbGVtZW50cyBhcmUgYWRkZWQgdG8gdGhlc2UgdG8gcmVwcmVzZW50IHNlbGVjdGlvbiBhbmQgY3Vyc29ycy5cbiAgICBkLnNlbGVjdGlvbkRpdiA9IGVsdChcImRpdlwiLCBudWxsLCBudWxsLCBcInBvc2l0aW9uOiByZWxhdGl2ZTsgei1pbmRleDogMVwiKTtcbiAgICBkLmN1cnNvckRpdiA9IGVsdChcImRpdlwiLCBudWxsLCBcIkNvZGVNaXJyb3ItY3Vyc29yc1wiKTtcbiAgICAvLyBBIHZpc2liaWxpdHk6IGhpZGRlbiBlbGVtZW50IHVzZWQgdG8gZmluZCB0aGUgc2l6ZSBvZiB0aGluZ3MuXG4gICAgZC5tZWFzdXJlID0gZWx0KFwiZGl2XCIsIG51bGwsIFwiQ29kZU1pcnJvci1tZWFzdXJlXCIpO1xuICAgIC8vIFdoZW4gbGluZXMgb3V0c2lkZSBvZiB0aGUgdmlld3BvcnQgYXJlIG1lYXN1cmVkLCB0aGV5IGFyZSBkcmF3biBpbiB0aGlzLlxuICAgIGQubGluZU1lYXN1cmUgPSBlbHQoXCJkaXZcIiwgbnVsbCwgXCJDb2RlTWlycm9yLW1lYXN1cmVcIik7XG4gICAgLy8gV3JhcHMgZXZlcnl0aGluZyB0aGF0IG5lZWRzIHRvIGV4aXN0IGluc2lkZSB0aGUgdmVydGljYWxseS1wYWRkZWQgY29vcmRpbmF0ZSBzeXN0ZW1cbiAgICBkLmxpbmVTcGFjZSA9IGVsdFAoXCJkaXZcIiwgW2QubWVhc3VyZSwgZC5saW5lTWVhc3VyZSwgZC5zZWxlY3Rpb25EaXYsIGQuY3Vyc29yRGl2LCBkLmxpbmVEaXZdLFxuICAgICAgICAgICAgICAgICAgICAgIG51bGwsIFwicG9zaXRpb246IHJlbGF0aXZlOyBvdXRsaW5lOiBub25lXCIpO1xuICAgIHZhciBsaW5lcyA9IGVsdFAoXCJkaXZcIiwgW2QubGluZVNwYWNlXSwgXCJDb2RlTWlycm9yLWxpbmVzXCIpO1xuICAgIC8vIE1vdmVkIGFyb3VuZCBpdHMgcGFyZW50IHRvIGNvdmVyIHZpc2libGUgdmlldy5cbiAgICBkLm1vdmVyID0gZWx0KFwiZGl2XCIsIFtsaW5lc10sIG51bGwsIFwicG9zaXRpb246IHJlbGF0aXZlXCIpO1xuICAgIC8vIFNldCB0byB0aGUgaGVpZ2h0IG9mIHRoZSBkb2N1bWVudCwgYWxsb3dpbmcgc2Nyb2xsaW5nLlxuICAgIGQuc2l6ZXIgPSBlbHQoXCJkaXZcIiwgW2QubW92ZXJdLCBcIkNvZGVNaXJyb3Itc2l6ZXJcIik7XG4gICAgZC5zaXplcldpZHRoID0gbnVsbDtcbiAgICAvLyBCZWhhdmlvciBvZiBlbHRzIHdpdGggb3ZlcmZsb3c6IGF1dG8gYW5kIHBhZGRpbmcgaXNcbiAgICAvLyBpbmNvbnNpc3RlbnQgYWNyb3NzIGJyb3dzZXJzLiBUaGlzIGlzIHVzZWQgdG8gZW5zdXJlIHRoZVxuICAgIC8vIHNjcm9sbGFibGUgYXJlYSBpcyBiaWcgZW5vdWdoLlxuICAgIGQuaGVpZ2h0Rm9yY2VyID0gZWx0KFwiZGl2XCIsIG51bGwsIG51bGwsIFwicG9zaXRpb246IGFic29sdXRlOyBoZWlnaHQ6IFwiICsgc2Nyb2xsZXJHYXAgKyBcInB4OyB3aWR0aDogMXB4O1wiKTtcbiAgICAvLyBXaWxsIGNvbnRhaW4gdGhlIGd1dHRlcnMsIGlmIGFueS5cbiAgICBkLmd1dHRlcnMgPSBlbHQoXCJkaXZcIiwgbnVsbCwgXCJDb2RlTWlycm9yLWd1dHRlcnNcIik7XG4gICAgZC5saW5lR3V0dGVyID0gbnVsbDtcbiAgICAvLyBBY3R1YWwgc2Nyb2xsYWJsZSBlbGVtZW50LlxuICAgIGQuc2Nyb2xsZXIgPSBlbHQoXCJkaXZcIiwgW2Quc2l6ZXIsIGQuaGVpZ2h0Rm9yY2VyLCBkLmd1dHRlcnNdLCBcIkNvZGVNaXJyb3Itc2Nyb2xsXCIpO1xuICAgIGQuc2Nyb2xsZXIuc2V0QXR0cmlidXRlKFwidGFiSW5kZXhcIiwgXCItMVwiKTtcbiAgICAvLyBUaGUgZWxlbWVudCBpbiB3aGljaCB0aGUgZWRpdG9yIGxpdmVzLlxuICAgIGQud3JhcHBlciA9IGVsdChcImRpdlwiLCBbZC5zY3JvbGxiYXJGaWxsZXIsIGQuZ3V0dGVyRmlsbGVyLCBkLnNjcm9sbGVyXSwgXCJDb2RlTWlycm9yXCIpO1xuXG4gICAgLy8gV29yayBhcm91bmQgSUU3IHotaW5kZXggYnVnIChub3QgcGVyZmVjdCwgaGVuY2UgSUU3IG5vdCByZWFsbHkgYmVpbmcgc3VwcG9ydGVkKVxuICAgIGlmIChpZSAmJiBpZV92ZXJzaW9uIDwgOCkgeyBkLmd1dHRlcnMuc3R5bGUuekluZGV4ID0gLTE7IGQuc2Nyb2xsZXIuc3R5bGUucGFkZGluZ1JpZ2h0ID0gMDsgfVxuICAgIGlmICghd2Via2l0ICYmICEoZ2Vja28gJiYgbW9iaWxlKSkgeyBkLnNjcm9sbGVyLmRyYWdnYWJsZSA9IHRydWU7IH1cblxuICAgIGlmIChwbGFjZSkge1xuICAgICAgaWYgKHBsYWNlLmFwcGVuZENoaWxkKSB7IHBsYWNlLmFwcGVuZENoaWxkKGQud3JhcHBlcik7IH1cbiAgICAgIGVsc2UgeyBwbGFjZShkLndyYXBwZXIpOyB9XG4gICAgfVxuXG4gICAgLy8gQ3VycmVudCByZW5kZXJlZCByYW5nZSAobWF5IGJlIGJpZ2dlciB0aGFuIHRoZSB2aWV3IHdpbmRvdykuXG4gICAgZC52aWV3RnJvbSA9IGQudmlld1RvID0gZG9jLmZpcnN0O1xuICAgIGQucmVwb3J0ZWRWaWV3RnJvbSA9IGQucmVwb3J0ZWRWaWV3VG8gPSBkb2MuZmlyc3Q7XG4gICAgLy8gSW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlbmRlcmVkIGxpbmVzLlxuICAgIGQudmlldyA9IFtdO1xuICAgIGQucmVuZGVyZWRWaWV3ID0gbnVsbDtcbiAgICAvLyBIb2xkcyBpbmZvIGFib3V0IGEgc2luZ2xlIHJlbmRlcmVkIGxpbmUgd2hlbiBpdCB3YXMgcmVuZGVyZWRcbiAgICAvLyBmb3IgbWVhc3VyZW1lbnQsIHdoaWxlIG5vdCBpbiB2aWV3LlxuICAgIGQuZXh0ZXJuYWxNZWFzdXJlZCA9IG51bGw7XG4gICAgLy8gRW1wdHkgc3BhY2UgKGluIHBpeGVscykgYWJvdmUgdGhlIHZpZXdcbiAgICBkLnZpZXdPZmZzZXQgPSAwO1xuICAgIGQubGFzdFdyYXBIZWlnaHQgPSBkLmxhc3RXcmFwV2lkdGggPSAwO1xuICAgIGQudXBkYXRlTGluZU51bWJlcnMgPSBudWxsO1xuXG4gICAgZC5uYXRpdmVCYXJXaWR0aCA9IGQuYmFySGVpZ2h0ID0gZC5iYXJXaWR0aCA9IDA7XG4gICAgZC5zY3JvbGxiYXJzQ2xpcHBlZCA9IGZhbHNlO1xuXG4gICAgLy8gVXNlZCB0byBvbmx5IHJlc2l6ZSB0aGUgbGluZSBudW1iZXIgZ3V0dGVyIHdoZW4gbmVjZXNzYXJ5ICh3aGVuXG4gICAgLy8gdGhlIGFtb3VudCBvZiBsaW5lcyBjcm9zc2VzIGEgYm91bmRhcnkgdGhhdCBtYWtlcyBpdHMgd2lkdGggY2hhbmdlKVxuICAgIGQubGluZU51bVdpZHRoID0gZC5saW5lTnVtSW5uZXJXaWR0aCA9IGQubGluZU51bUNoYXJzID0gbnVsbDtcbiAgICAvLyBTZXQgdG8gdHJ1ZSB3aGVuIGEgbm9uLWhvcml6b250YWwtc2Nyb2xsaW5nIGxpbmUgd2lkZ2V0IGlzXG4gICAgLy8gYWRkZWQuIEFzIGFuIG9wdGltaXphdGlvbiwgbGluZSB3aWRnZXQgYWxpZ25pbmcgaXMgc2tpcHBlZCB3aGVuXG4gICAgLy8gdGhpcyBpcyBmYWxzZS5cbiAgICBkLmFsaWduV2lkZ2V0cyA9IGZhbHNlO1xuXG4gICAgZC5jYWNoZWRDaGFyV2lkdGggPSBkLmNhY2hlZFRleHRIZWlnaHQgPSBkLmNhY2hlZFBhZGRpbmdIID0gbnVsbDtcblxuICAgIC8vIFRyYWNrcyB0aGUgbWF4aW11bSBsaW5lIGxlbmd0aCBzbyB0aGF0IHRoZSBob3Jpem9udGFsIHNjcm9sbGJhclxuICAgIC8vIGNhbiBiZSBrZXB0IHN0YXRpYyB3aGVuIHNjcm9sbGluZy5cbiAgICBkLm1heExpbmUgPSBudWxsO1xuICAgIGQubWF4TGluZUxlbmd0aCA9IDA7XG4gICAgZC5tYXhMaW5lQ2hhbmdlZCA9IGZhbHNlO1xuXG4gICAgLy8gVXNlZCBmb3IgbWVhc3VyaW5nIHdoZWVsIHNjcm9sbGluZyBncmFudWxhcml0eVxuICAgIGQud2hlZWxEWCA9IGQud2hlZWxEWSA9IGQud2hlZWxTdGFydFggPSBkLndoZWVsU3RhcnRZID0gbnVsbDtcblxuICAgIC8vIFRydWUgd2hlbiBzaGlmdCBpcyBoZWxkIGRvd24uXG4gICAgZC5zaGlmdCA9IGZhbHNlO1xuXG4gICAgLy8gVXNlZCB0byB0cmFjayB3aGV0aGVyIGFueXRoaW5nIGhhcHBlbmVkIHNpbmNlIHRoZSBjb250ZXh0IG1lbnVcbiAgICAvLyB3YXMgb3BlbmVkLlxuICAgIGQuc2VsRm9yQ29udGV4dE1lbnUgPSBudWxsO1xuXG4gICAgZC5hY3RpdmVUb3VjaCA9IG51bGw7XG5cbiAgICBkLmd1dHRlclNwZWNzID0gZ2V0R3V0dGVycyhvcHRpb25zLmd1dHRlcnMsIG9wdGlvbnMubGluZU51bWJlcnMpO1xuICAgIHJlbmRlckd1dHRlcnMoZCk7XG5cbiAgICBpbnB1dC5pbml0KGQpO1xuICB9XG5cbiAgLy8gU2luY2UgdGhlIGRlbHRhIHZhbHVlcyByZXBvcnRlZCBvbiBtb3VzZSB3aGVlbCBldmVudHMgYXJlXG4gIC8vIHVuc3RhbmRhcmRpemVkIGJldHdlZW4gYnJvd3NlcnMgYW5kIGV2ZW4gYnJvd3NlciB2ZXJzaW9ucywgYW5kXG4gIC8vIGdlbmVyYWxseSBob3JyaWJseSB1bnByZWRpY3RhYmxlLCB0aGlzIGNvZGUgc3RhcnRzIGJ5IG1lYXN1cmluZ1xuICAvLyB0aGUgc2Nyb2xsIGVmZmVjdCB0aGF0IHRoZSBmaXJzdCBmZXcgbW91c2Ugd2hlZWwgZXZlbnRzIGhhdmUsXG4gIC8vIGFuZCwgZnJvbSB0aGF0LCBkZXRlY3RzIHRoZSB3YXkgaXQgY2FuIGNvbnZlcnQgZGVsdGFzIHRvIHBpeGVsXG4gIC8vIG9mZnNldHMgYWZ0ZXJ3YXJkcy5cbiAgLy9cbiAgLy8gVGhlIHJlYXNvbiB3ZSB3YW50IHRvIGtub3cgdGhlIGFtb3VudCBhIHdoZWVsIGV2ZW50IHdpbGwgc2Nyb2xsXG4gIC8vIGlzIHRoYXQgaXQgZ2l2ZXMgdXMgYSBjaGFuY2UgdG8gdXBkYXRlIHRoZSBkaXNwbGF5IGJlZm9yZSB0aGVcbiAgLy8gYWN0dWFsIHNjcm9sbGluZyBoYXBwZW5zLCByZWR1Y2luZyBmbGlja2VyaW5nLlxuXG4gIHZhciB3aGVlbFNhbXBsZXMgPSAwLCB3aGVlbFBpeGVsc1BlclVuaXQgPSBudWxsO1xuICAvLyBGaWxsIGluIGEgYnJvd3Nlci1kZXRlY3RlZCBzdGFydGluZyB2YWx1ZSBvbiBicm93c2VycyB3aGVyZSB3ZVxuICAvLyBrbm93IG9uZS4gVGhlc2UgZG9uJ3QgaGF2ZSB0byBiZSBhY2N1cmF0ZSAtLSB0aGUgcmVzdWx0IG9mIHRoZW1cbiAgLy8gYmVpbmcgd3Jvbmcgd291bGQganVzdCBiZSBhIHNsaWdodCBmbGlja2VyIG9uIHRoZSBmaXJzdCB3aGVlbFxuICAvLyBzY3JvbGwgKGlmIGl0IGlzIGxhcmdlIGVub3VnaCkuXG4gIGlmIChpZSkgeyB3aGVlbFBpeGVsc1BlclVuaXQgPSAtLjUzOyB9XG4gIGVsc2UgaWYgKGdlY2tvKSB7IHdoZWVsUGl4ZWxzUGVyVW5pdCA9IDE1OyB9XG4gIGVsc2UgaWYgKGNocm9tZSkgeyB3aGVlbFBpeGVsc1BlclVuaXQgPSAtLjc7IH1cbiAgZWxzZSBpZiAoc2FmYXJpKSB7IHdoZWVsUGl4ZWxzUGVyVW5pdCA9IC0xLzM7IH1cblxuICBmdW5jdGlvbiB3aGVlbEV2ZW50RGVsdGEoZSkge1xuICAgIHZhciBkeCA9IGUud2hlZWxEZWx0YVgsIGR5ID0gZS53aGVlbERlbHRhWTtcbiAgICBpZiAoZHggPT0gbnVsbCAmJiBlLmRldGFpbCAmJiBlLmF4aXMgPT0gZS5IT1JJWk9OVEFMX0FYSVMpIHsgZHggPSBlLmRldGFpbDsgfVxuICAgIGlmIChkeSA9PSBudWxsICYmIGUuZGV0YWlsICYmIGUuYXhpcyA9PSBlLlZFUlRJQ0FMX0FYSVMpIHsgZHkgPSBlLmRldGFpbDsgfVxuICAgIGVsc2UgaWYgKGR5ID09IG51bGwpIHsgZHkgPSBlLndoZWVsRGVsdGE7IH1cbiAgICByZXR1cm4ge3g6IGR4LCB5OiBkeX1cbiAgfVxuICBmdW5jdGlvbiB3aGVlbEV2ZW50UGl4ZWxzKGUpIHtcbiAgICB2YXIgZGVsdGEgPSB3aGVlbEV2ZW50RGVsdGEoZSk7XG4gICAgZGVsdGEueCAqPSB3aGVlbFBpeGVsc1BlclVuaXQ7XG4gICAgZGVsdGEueSAqPSB3aGVlbFBpeGVsc1BlclVuaXQ7XG4gICAgcmV0dXJuIGRlbHRhXG4gIH1cblxuICBmdW5jdGlvbiBvblNjcm9sbFdoZWVsKGNtLCBlKSB7XG4gICAgdmFyIGRlbHRhID0gd2hlZWxFdmVudERlbHRhKGUpLCBkeCA9IGRlbHRhLngsIGR5ID0gZGVsdGEueTtcblxuICAgIHZhciBkaXNwbGF5ID0gY20uZGlzcGxheSwgc2Nyb2xsID0gZGlzcGxheS5zY3JvbGxlcjtcbiAgICAvLyBRdWl0IGlmIHRoZXJlJ3Mgbm90aGluZyB0byBzY3JvbGwgaGVyZVxuICAgIHZhciBjYW5TY3JvbGxYID0gc2Nyb2xsLnNjcm9sbFdpZHRoID4gc2Nyb2xsLmNsaWVudFdpZHRoO1xuICAgIHZhciBjYW5TY3JvbGxZID0gc2Nyb2xsLnNjcm9sbEhlaWdodCA+IHNjcm9sbC5jbGllbnRIZWlnaHQ7XG4gICAgaWYgKCEoZHggJiYgY2FuU2Nyb2xsWCB8fCBkeSAmJiBjYW5TY3JvbGxZKSkgeyByZXR1cm4gfVxuXG4gICAgLy8gV2Via2l0IGJyb3dzZXJzIG9uIE9TIFggYWJvcnQgbW9tZW50dW0gc2Nyb2xscyB3aGVuIHRoZSB0YXJnZXRcbiAgICAvLyBvZiB0aGUgc2Nyb2xsIGV2ZW50IGlzIHJlbW92ZWQgZnJvbSB0aGUgc2Nyb2xsYWJsZSBlbGVtZW50LlxuICAgIC8vIFRoaXMgaGFjayAoc2VlIHJlbGF0ZWQgY29kZSBpbiBwYXRjaERpc3BsYXkpIG1ha2VzIHN1cmUgdGhlXG4gICAgLy8gZWxlbWVudCBpcyBrZXB0IGFyb3VuZC5cbiAgICBpZiAoZHkgJiYgbWFjICYmIHdlYmtpdCkge1xuICAgICAgb3V0ZXI6IGZvciAodmFyIGN1ciA9IGUudGFyZ2V0LCB2aWV3ID0gZGlzcGxheS52aWV3OyBjdXIgIT0gc2Nyb2xsOyBjdXIgPSBjdXIucGFyZW50Tm9kZSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZpZXcubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAodmlld1tpXS5ub2RlID09IGN1cikge1xuICAgICAgICAgICAgY20uZGlzcGxheS5jdXJyZW50V2hlZWxUYXJnZXQgPSBjdXI7XG4gICAgICAgICAgICBicmVhayBvdXRlclxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE9uIHNvbWUgYnJvd3NlcnMsIGhvcml6b250YWwgc2Nyb2xsaW5nIHdpbGwgY2F1c2UgcmVkcmF3cyB0b1xuICAgIC8vIGhhcHBlbiBiZWZvcmUgdGhlIGd1dHRlciBoYXMgYmVlbiByZWFsaWduZWQsIGNhdXNpbmcgaXQgdG9cbiAgICAvLyB3cmlnZ2xlIGFyb3VuZCBpbiBhIG1vc3QgdW5zZWVtbHkgd2F5LiBXaGVuIHdlIGhhdmUgYW5cbiAgICAvLyBlc3RpbWF0ZWQgcGl4ZWxzL2RlbHRhIHZhbHVlLCB3ZSBqdXN0IGhhbmRsZSBob3Jpem9udGFsXG4gICAgLy8gc2Nyb2xsaW5nIGVudGlyZWx5IGhlcmUuIEl0J2xsIGJlIHNsaWdodGx5IG9mZiBmcm9tIG5hdGl2ZSwgYnV0XG4gICAgLy8gYmV0dGVyIHRoYW4gZ2xpdGNoaW5nIG91dC5cbiAgICBpZiAoZHggJiYgIWdlY2tvICYmICFwcmVzdG8gJiYgd2hlZWxQaXhlbHNQZXJVbml0ICE9IG51bGwpIHtcbiAgICAgIGlmIChkeSAmJiBjYW5TY3JvbGxZKVxuICAgICAgICB7IHVwZGF0ZVNjcm9sbFRvcChjbSwgTWF0aC5tYXgoMCwgc2Nyb2xsLnNjcm9sbFRvcCArIGR5ICogd2hlZWxQaXhlbHNQZXJVbml0KSk7IH1cbiAgICAgIHNldFNjcm9sbExlZnQoY20sIE1hdGgubWF4KDAsIHNjcm9sbC5zY3JvbGxMZWZ0ICsgZHggKiB3aGVlbFBpeGVsc1BlclVuaXQpKTtcbiAgICAgIC8vIE9ubHkgcHJldmVudCBkZWZhdWx0IHNjcm9sbGluZyBpZiB2ZXJ0aWNhbCBzY3JvbGxpbmcgaXNcbiAgICAgIC8vIGFjdHVhbGx5IHBvc3NpYmxlLiBPdGhlcndpc2UsIGl0IGNhdXNlcyB2ZXJ0aWNhbCBzY3JvbGxcbiAgICAgIC8vIGppdHRlciBvbiBPU1ggdHJhY2twYWRzIHdoZW4gZGVsdGFYIGlzIHNtYWxsIGFuZCBkZWx0YVlcbiAgICAgIC8vIGlzIGxhcmdlIChpc3N1ZSAjMzU3OSlcbiAgICAgIGlmICghZHkgfHwgKGR5ICYmIGNhblNjcm9sbFkpKVxuICAgICAgICB7IGVfcHJldmVudERlZmF1bHQoZSk7IH1cbiAgICAgIGRpc3BsYXkud2hlZWxTdGFydFggPSBudWxsOyAvLyBBYm9ydCBtZWFzdXJlbWVudCwgaWYgaW4gcHJvZ3Jlc3NcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vICdQcm9qZWN0JyB0aGUgdmlzaWJsZSB2aWV3cG9ydCB0byBjb3ZlciB0aGUgYXJlYSB0aGF0IGlzIGJlaW5nXG4gICAgLy8gc2Nyb2xsZWQgaW50byB2aWV3IChpZiB3ZSBrbm93IGVub3VnaCB0byBlc3RpbWF0ZSBpdCkuXG4gICAgaWYgKGR5ICYmIHdoZWVsUGl4ZWxzUGVyVW5pdCAhPSBudWxsKSB7XG4gICAgICB2YXIgcGl4ZWxzID0gZHkgKiB3aGVlbFBpeGVsc1BlclVuaXQ7XG4gICAgICB2YXIgdG9wID0gY20uZG9jLnNjcm9sbFRvcCwgYm90ID0gdG9wICsgZGlzcGxheS53cmFwcGVyLmNsaWVudEhlaWdodDtcbiAgICAgIGlmIChwaXhlbHMgPCAwKSB7IHRvcCA9IE1hdGgubWF4KDAsIHRvcCArIHBpeGVscyAtIDUwKTsgfVxuICAgICAgZWxzZSB7IGJvdCA9IE1hdGgubWluKGNtLmRvYy5oZWlnaHQsIGJvdCArIHBpeGVscyArIDUwKTsgfVxuICAgICAgdXBkYXRlRGlzcGxheVNpbXBsZShjbSwge3RvcDogdG9wLCBib3R0b206IGJvdH0pO1xuICAgIH1cblxuICAgIGlmICh3aGVlbFNhbXBsZXMgPCAyMCkge1xuICAgICAgaWYgKGRpc3BsYXkud2hlZWxTdGFydFggPT0gbnVsbCkge1xuICAgICAgICBkaXNwbGF5LndoZWVsU3RhcnRYID0gc2Nyb2xsLnNjcm9sbExlZnQ7IGRpc3BsYXkud2hlZWxTdGFydFkgPSBzY3JvbGwuc2Nyb2xsVG9wO1xuICAgICAgICBkaXNwbGF5LndoZWVsRFggPSBkeDsgZGlzcGxheS53aGVlbERZID0gZHk7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChkaXNwbGF5LndoZWVsU3RhcnRYID09IG51bGwpIHsgcmV0dXJuIH1cbiAgICAgICAgICB2YXIgbW92ZWRYID0gc2Nyb2xsLnNjcm9sbExlZnQgLSBkaXNwbGF5LndoZWVsU3RhcnRYO1xuICAgICAgICAgIHZhciBtb3ZlZFkgPSBzY3JvbGwuc2Nyb2xsVG9wIC0gZGlzcGxheS53aGVlbFN0YXJ0WTtcbiAgICAgICAgICB2YXIgc2FtcGxlID0gKG1vdmVkWSAmJiBkaXNwbGF5LndoZWVsRFkgJiYgbW92ZWRZIC8gZGlzcGxheS53aGVlbERZKSB8fFxuICAgICAgICAgICAgKG1vdmVkWCAmJiBkaXNwbGF5LndoZWVsRFggJiYgbW92ZWRYIC8gZGlzcGxheS53aGVlbERYKTtcbiAgICAgICAgICBkaXNwbGF5LndoZWVsU3RhcnRYID0gZGlzcGxheS53aGVlbFN0YXJ0WSA9IG51bGw7XG4gICAgICAgICAgaWYgKCFzYW1wbGUpIHsgcmV0dXJuIH1cbiAgICAgICAgICB3aGVlbFBpeGVsc1BlclVuaXQgPSAod2hlZWxQaXhlbHNQZXJVbml0ICogd2hlZWxTYW1wbGVzICsgc2FtcGxlKSAvICh3aGVlbFNhbXBsZXMgKyAxKTtcbiAgICAgICAgICArK3doZWVsU2FtcGxlcztcbiAgICAgICAgfSwgMjAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRpc3BsYXkud2hlZWxEWCArPSBkeDsgZGlzcGxheS53aGVlbERZICs9IGR5O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFNlbGVjdGlvbiBvYmplY3RzIGFyZSBpbW11dGFibGUuIEEgbmV3IG9uZSBpcyBjcmVhdGVkIGV2ZXJ5IHRpbWVcbiAgLy8gdGhlIHNlbGVjdGlvbiBjaGFuZ2VzLiBBIHNlbGVjdGlvbiBpcyBvbmUgb3IgbW9yZSBub24tb3ZlcmxhcHBpbmdcbiAgLy8gKGFuZCBub24tdG91Y2hpbmcpIHJhbmdlcywgc29ydGVkLCBhbmQgYW4gaW50ZWdlciB0aGF0IGluZGljYXRlc1xuICAvLyB3aGljaCBvbmUgaXMgdGhlIHByaW1hcnkgc2VsZWN0aW9uICh0aGUgb25lIHRoYXQncyBzY3JvbGxlZCBpbnRvXG4gIC8vIHZpZXcsIHRoYXQgZ2V0Q3Vyc29yIHJldHVybnMsIGV0YykuXG4gIHZhciBTZWxlY3Rpb24gPSBmdW5jdGlvbihyYW5nZXMsIHByaW1JbmRleCkge1xuICAgIHRoaXMucmFuZ2VzID0gcmFuZ2VzO1xuICAgIHRoaXMucHJpbUluZGV4ID0gcHJpbUluZGV4O1xuICB9O1xuXG4gIFNlbGVjdGlvbi5wcm90b3R5cGUucHJpbWFyeSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMucmFuZ2VzW3RoaXMucHJpbUluZGV4XSB9O1xuXG4gIFNlbGVjdGlvbi5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gKG90aGVyKSB7XG4gICAgaWYgKG90aGVyID09IHRoaXMpIHsgcmV0dXJuIHRydWUgfVxuICAgIGlmIChvdGhlci5wcmltSW5kZXggIT0gdGhpcy5wcmltSW5kZXggfHwgb3RoZXIucmFuZ2VzLmxlbmd0aCAhPSB0aGlzLnJhbmdlcy5sZW5ndGgpIHsgcmV0dXJuIGZhbHNlIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaGVyZSA9IHRoaXMucmFuZ2VzW2ldLCB0aGVyZSA9IG90aGVyLnJhbmdlc1tpXTtcbiAgICAgIGlmICghZXF1YWxDdXJzb3JQb3MoaGVyZS5hbmNob3IsIHRoZXJlLmFuY2hvcikgfHwgIWVxdWFsQ3Vyc29yUG9zKGhlcmUuaGVhZCwgdGhlcmUuaGVhZCkpIHsgcmV0dXJuIGZhbHNlIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbiAgfTtcblxuICBTZWxlY3Rpb24ucHJvdG90eXBlLmRlZXBDb3B5ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBvdXQgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucmFuZ2VzLmxlbmd0aDsgaSsrKVxuICAgICAgeyBvdXRbaV0gPSBuZXcgUmFuZ2UoY29weVBvcyh0aGlzLnJhbmdlc1tpXS5hbmNob3IpLCBjb3B5UG9zKHRoaXMucmFuZ2VzW2ldLmhlYWQpKTsgfVxuICAgIHJldHVybiBuZXcgU2VsZWN0aW9uKG91dCwgdGhpcy5wcmltSW5kZXgpXG4gIH07XG5cbiAgU2VsZWN0aW9uLnByb3RvdHlwZS5zb21ldGhpbmdTZWxlY3RlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucmFuZ2VzLmxlbmd0aDsgaSsrKVxuICAgICAgeyBpZiAoIXRoaXMucmFuZ2VzW2ldLmVtcHR5KCkpIHsgcmV0dXJuIHRydWUgfSB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH07XG5cbiAgU2VsZWN0aW9uLnByb3RvdHlwZS5jb250YWlucyA9IGZ1bmN0aW9uIChwb3MsIGVuZCkge1xuICAgIGlmICghZW5kKSB7IGVuZCA9IHBvczsgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciByYW5nZSA9IHRoaXMucmFuZ2VzW2ldO1xuICAgICAgaWYgKGNtcChlbmQsIHJhbmdlLmZyb20oKSkgPj0gMCAmJiBjbXAocG9zLCByYW5nZS50bygpKSA8PSAwKVxuICAgICAgICB7IHJldHVybiBpIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xXG4gIH07XG5cbiAgdmFyIFJhbmdlID0gZnVuY3Rpb24oYW5jaG9yLCBoZWFkKSB7XG4gICAgdGhpcy5hbmNob3IgPSBhbmNob3I7IHRoaXMuaGVhZCA9IGhlYWQ7XG4gIH07XG5cbiAgUmFuZ2UucHJvdG90eXBlLmZyb20gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBtaW5Qb3ModGhpcy5hbmNob3IsIHRoaXMuaGVhZCkgfTtcbiAgUmFuZ2UucHJvdG90eXBlLnRvID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbWF4UG9zKHRoaXMuYW5jaG9yLCB0aGlzLmhlYWQpIH07XG4gIFJhbmdlLnByb3RvdHlwZS5lbXB0eSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuaGVhZC5saW5lID09IHRoaXMuYW5jaG9yLmxpbmUgJiYgdGhpcy5oZWFkLmNoID09IHRoaXMuYW5jaG9yLmNoIH07XG5cbiAgLy8gVGFrZSBhbiB1bnNvcnRlZCwgcG90ZW50aWFsbHkgb3ZlcmxhcHBpbmcgc2V0IG9mIHJhbmdlcywgYW5kXG4gIC8vIGJ1aWxkIGEgc2VsZWN0aW9uIG91dCBvZiBpdC4gJ0NvbnN1bWVzJyByYW5nZXMgYXJyYXkgKG1vZGlmeWluZ1xuICAvLyBpdCkuXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVNlbGVjdGlvbihjbSwgcmFuZ2VzLCBwcmltSW5kZXgpIHtcbiAgICB2YXIgbWF5VG91Y2ggPSBjbSAmJiBjbS5vcHRpb25zLnNlbGVjdGlvbnNNYXlUb3VjaDtcbiAgICB2YXIgcHJpbSA9IHJhbmdlc1twcmltSW5kZXhdO1xuICAgIHJhbmdlcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBjbXAoYS5mcm9tKCksIGIuZnJvbSgpKTsgfSk7XG4gICAgcHJpbUluZGV4ID0gaW5kZXhPZihyYW5nZXMsIHByaW0pO1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY3VyID0gcmFuZ2VzW2ldLCBwcmV2ID0gcmFuZ2VzW2kgLSAxXTtcbiAgICAgIHZhciBkaWZmID0gY21wKHByZXYudG8oKSwgY3VyLmZyb20oKSk7XG4gICAgICBpZiAobWF5VG91Y2ggJiYgIWN1ci5lbXB0eSgpID8gZGlmZiA+IDAgOiBkaWZmID49IDApIHtcbiAgICAgICAgdmFyIGZyb20gPSBtaW5Qb3MocHJldi5mcm9tKCksIGN1ci5mcm9tKCkpLCB0byA9IG1heFBvcyhwcmV2LnRvKCksIGN1ci50bygpKTtcbiAgICAgICAgdmFyIGludiA9IHByZXYuZW1wdHkoKSA/IGN1ci5mcm9tKCkgPT0gY3VyLmhlYWQgOiBwcmV2LmZyb20oKSA9PSBwcmV2LmhlYWQ7XG4gICAgICAgIGlmIChpIDw9IHByaW1JbmRleCkgeyAtLXByaW1JbmRleDsgfVxuICAgICAgICByYW5nZXMuc3BsaWNlKC0taSwgMiwgbmV3IFJhbmdlKGludiA/IHRvIDogZnJvbSwgaW52ID8gZnJvbSA6IHRvKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgU2VsZWN0aW9uKHJhbmdlcywgcHJpbUluZGV4KVxuICB9XG5cbiAgZnVuY3Rpb24gc2ltcGxlU2VsZWN0aW9uKGFuY2hvciwgaGVhZCkge1xuICAgIHJldHVybiBuZXcgU2VsZWN0aW9uKFtuZXcgUmFuZ2UoYW5jaG9yLCBoZWFkIHx8IGFuY2hvcildLCAwKVxuICB9XG5cbiAgLy8gQ29tcHV0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIGVuZCBvZiBhIGNoYW5nZSAoaXRzICd0bycgcHJvcGVydHlcbiAgLy8gcmVmZXJzIHRvIHRoZSBwcmUtY2hhbmdlIGVuZCkuXG4gIGZ1bmN0aW9uIGNoYW5nZUVuZChjaGFuZ2UpIHtcbiAgICBpZiAoIWNoYW5nZS50ZXh0KSB7IHJldHVybiBjaGFuZ2UudG8gfVxuICAgIHJldHVybiBQb3MoY2hhbmdlLmZyb20ubGluZSArIGNoYW5nZS50ZXh0Lmxlbmd0aCAtIDEsXG4gICAgICAgICAgICAgICBsc3QoY2hhbmdlLnRleHQpLmxlbmd0aCArIChjaGFuZ2UudGV4dC5sZW5ndGggPT0gMSA/IGNoYW5nZS5mcm9tLmNoIDogMCkpXG4gIH1cblxuICAvLyBBZGp1c3QgYSBwb3NpdGlvbiB0byByZWZlciB0byB0aGUgcG9zdC1jaGFuZ2UgcG9zaXRpb24gb2YgdGhlXG4gIC8vIHNhbWUgdGV4dCwgb3IgdGhlIGVuZCBvZiB0aGUgY2hhbmdlIGlmIHRoZSBjaGFuZ2UgY292ZXJzIGl0LlxuICBmdW5jdGlvbiBhZGp1c3RGb3JDaGFuZ2UocG9zLCBjaGFuZ2UpIHtcbiAgICBpZiAoY21wKHBvcywgY2hhbmdlLmZyb20pIDwgMCkgeyByZXR1cm4gcG9zIH1cbiAgICBpZiAoY21wKHBvcywgY2hhbmdlLnRvKSA8PSAwKSB7IHJldHVybiBjaGFuZ2VFbmQoY2hhbmdlKSB9XG5cbiAgICB2YXIgbGluZSA9IHBvcy5saW5lICsgY2hhbmdlLnRleHQubGVuZ3RoIC0gKGNoYW5nZS50by5saW5lIC0gY2hhbmdlLmZyb20ubGluZSkgLSAxLCBjaCA9IHBvcy5jaDtcbiAgICBpZiAocG9zLmxpbmUgPT0gY2hhbmdlLnRvLmxpbmUpIHsgY2ggKz0gY2hhbmdlRW5kKGNoYW5nZSkuY2ggLSBjaGFuZ2UudG8uY2g7IH1cbiAgICByZXR1cm4gUG9zKGxpbmUsIGNoKVxuICB9XG5cbiAgZnVuY3Rpb24gY29tcHV0ZVNlbEFmdGVyQ2hhbmdlKGRvYywgY2hhbmdlKSB7XG4gICAgdmFyIG91dCA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZG9jLnNlbC5yYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciByYW5nZSA9IGRvYy5zZWwucmFuZ2VzW2ldO1xuICAgICAgb3V0LnB1c2gobmV3IFJhbmdlKGFkanVzdEZvckNoYW5nZShyYW5nZS5hbmNob3IsIGNoYW5nZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgYWRqdXN0Rm9yQ2hhbmdlKHJhbmdlLmhlYWQsIGNoYW5nZSkpKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vcm1hbGl6ZVNlbGVjdGlvbihkb2MuY20sIG91dCwgZG9jLnNlbC5wcmltSW5kZXgpXG4gIH1cblxuICBmdW5jdGlvbiBvZmZzZXRQb3MocG9zLCBvbGQsIG53KSB7XG4gICAgaWYgKHBvcy5saW5lID09IG9sZC5saW5lKVxuICAgICAgeyByZXR1cm4gUG9zKG53LmxpbmUsIHBvcy5jaCAtIG9sZC5jaCArIG53LmNoKSB9XG4gICAgZWxzZVxuICAgICAgeyByZXR1cm4gUG9zKG53LmxpbmUgKyAocG9zLmxpbmUgLSBvbGQubGluZSksIHBvcy5jaCkgfVxuICB9XG5cbiAgLy8gVXNlZCBieSByZXBsYWNlU2VsZWN0aW9ucyB0byBhbGxvdyBtb3ZpbmcgdGhlIHNlbGVjdGlvbiB0byB0aGVcbiAgLy8gc3RhcnQgb3IgYXJvdW5kIHRoZSByZXBsYWNlZCB0ZXN0LiBIaW50IG1heSBiZSBcInN0YXJ0XCIgb3IgXCJhcm91bmRcIi5cbiAgZnVuY3Rpb24gY29tcHV0ZVJlcGxhY2VkU2VsKGRvYywgY2hhbmdlcywgaGludCkge1xuICAgIHZhciBvdXQgPSBbXTtcbiAgICB2YXIgb2xkUHJldiA9IFBvcyhkb2MuZmlyc3QsIDApLCBuZXdQcmV2ID0gb2xkUHJldjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjaGFuZ2UgPSBjaGFuZ2VzW2ldO1xuICAgICAgdmFyIGZyb20gPSBvZmZzZXRQb3MoY2hhbmdlLmZyb20sIG9sZFByZXYsIG5ld1ByZXYpO1xuICAgICAgdmFyIHRvID0gb2Zmc2V0UG9zKGNoYW5nZUVuZChjaGFuZ2UpLCBvbGRQcmV2LCBuZXdQcmV2KTtcbiAgICAgIG9sZFByZXYgPSBjaGFuZ2UudG87XG4gICAgICBuZXdQcmV2ID0gdG87XG4gICAgICBpZiAoaGludCA9PSBcImFyb3VuZFwiKSB7XG4gICAgICAgIHZhciByYW5nZSA9IGRvYy5zZWwucmFuZ2VzW2ldLCBpbnYgPSBjbXAocmFuZ2UuaGVhZCwgcmFuZ2UuYW5jaG9yKSA8IDA7XG4gICAgICAgIG91dFtpXSA9IG5ldyBSYW5nZShpbnYgPyB0byA6IGZyb20sIGludiA/IGZyb20gOiB0byk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXRbaV0gPSBuZXcgUmFuZ2UoZnJvbSwgZnJvbSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgU2VsZWN0aW9uKG91dCwgZG9jLnNlbC5wcmltSW5kZXgpXG4gIH1cblxuICAvLyBVc2VkIHRvIGdldCB0aGUgZWRpdG9yIGludG8gYSBjb25zaXN0ZW50IHN0YXRlIGFnYWluIHdoZW4gb3B0aW9ucyBjaGFuZ2UuXG5cbiAgZnVuY3Rpb24gbG9hZE1vZGUoY20pIHtcbiAgICBjbS5kb2MubW9kZSA9IGdldE1vZGUoY20ub3B0aW9ucywgY20uZG9jLm1vZGVPcHRpb24pO1xuICAgIHJlc2V0TW9kZVN0YXRlKGNtKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc2V0TW9kZVN0YXRlKGNtKSB7XG4gICAgY20uZG9jLml0ZXIoZnVuY3Rpb24gKGxpbmUpIHtcbiAgICAgIGlmIChsaW5lLnN0YXRlQWZ0ZXIpIHsgbGluZS5zdGF0ZUFmdGVyID0gbnVsbDsgfVxuICAgICAgaWYgKGxpbmUuc3R5bGVzKSB7IGxpbmUuc3R5bGVzID0gbnVsbDsgfVxuICAgIH0pO1xuICAgIGNtLmRvYy5tb2RlRnJvbnRpZXIgPSBjbS5kb2MuaGlnaGxpZ2h0RnJvbnRpZXIgPSBjbS5kb2MuZmlyc3Q7XG4gICAgc3RhcnRXb3JrZXIoY20sIDEwMCk7XG4gICAgY20uc3RhdGUubW9kZUdlbisrO1xuICAgIGlmIChjbS5jdXJPcCkgeyByZWdDaGFuZ2UoY20pOyB9XG4gIH1cblxuICAvLyBET0NVTUVOVCBEQVRBIFNUUlVDVFVSRVxuXG4gIC8vIEJ5IGRlZmF1bHQsIHVwZGF0ZXMgdGhhdCBzdGFydCBhbmQgZW5kIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lXG4gIC8vIGFyZSB0cmVhdGVkIHNwZWNpYWxseSwgaW4gb3JkZXIgdG8gbWFrZSB0aGUgYXNzb2NpYXRpb24gb2YgbGluZVxuICAvLyB3aWRnZXRzIGFuZCBtYXJrZXIgZWxlbWVudHMgd2l0aCB0aGUgdGV4dCBiZWhhdmUgbW9yZSBpbnR1aXRpdmUuXG4gIGZ1bmN0aW9uIGlzV2hvbGVMaW5lVXBkYXRlKGRvYywgY2hhbmdlKSB7XG4gICAgcmV0dXJuIGNoYW5nZS5mcm9tLmNoID09IDAgJiYgY2hhbmdlLnRvLmNoID09IDAgJiYgbHN0KGNoYW5nZS50ZXh0KSA9PSBcIlwiICYmXG4gICAgICAoIWRvYy5jbSB8fCBkb2MuY20ub3B0aW9ucy53aG9sZUxpbmVVcGRhdGVCZWZvcmUpXG4gIH1cblxuICAvLyBQZXJmb3JtIGEgY2hhbmdlIG9uIHRoZSBkb2N1bWVudCBkYXRhIHN0cnVjdHVyZS5cbiAgZnVuY3Rpb24gdXBkYXRlRG9jKGRvYywgY2hhbmdlLCBtYXJrZWRTcGFucywgZXN0aW1hdGVIZWlnaHQpIHtcbiAgICBmdW5jdGlvbiBzcGFuc0ZvcihuKSB7cmV0dXJuIG1hcmtlZFNwYW5zID8gbWFya2VkU3BhbnNbbl0gOiBudWxsfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZShsaW5lLCB0ZXh0LCBzcGFucykge1xuICAgICAgdXBkYXRlTGluZShsaW5lLCB0ZXh0LCBzcGFucywgZXN0aW1hdGVIZWlnaHQpO1xuICAgICAgc2lnbmFsTGF0ZXIobGluZSwgXCJjaGFuZ2VcIiwgbGluZSwgY2hhbmdlKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gbGluZXNGb3Ioc3RhcnQsIGVuZCkge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpXG4gICAgICAgIHsgcmVzdWx0LnB1c2gobmV3IExpbmUodGV4dFtpXSwgc3BhbnNGb3IoaSksIGVzdGltYXRlSGVpZ2h0KSk7IH1cbiAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG5cbiAgICB2YXIgZnJvbSA9IGNoYW5nZS5mcm9tLCB0byA9IGNoYW5nZS50bywgdGV4dCA9IGNoYW5nZS50ZXh0O1xuICAgIHZhciBmaXJzdExpbmUgPSBnZXRMaW5lKGRvYywgZnJvbS5saW5lKSwgbGFzdExpbmUgPSBnZXRMaW5lKGRvYywgdG8ubGluZSk7XG4gICAgdmFyIGxhc3RUZXh0ID0gbHN0KHRleHQpLCBsYXN0U3BhbnMgPSBzcGFuc0Zvcih0ZXh0Lmxlbmd0aCAtIDEpLCBubGluZXMgPSB0by5saW5lIC0gZnJvbS5saW5lO1xuXG4gICAgLy8gQWRqdXN0IHRoZSBsaW5lIHN0cnVjdHVyZVxuICAgIGlmIChjaGFuZ2UuZnVsbCkge1xuICAgICAgZG9jLmluc2VydCgwLCBsaW5lc0ZvcigwLCB0ZXh0Lmxlbmd0aCkpO1xuICAgICAgZG9jLnJlbW92ZSh0ZXh0Lmxlbmd0aCwgZG9jLnNpemUgLSB0ZXh0Lmxlbmd0aCk7XG4gICAgfSBlbHNlIGlmIChpc1dob2xlTGluZVVwZGF0ZShkb2MsIGNoYW5nZSkpIHtcbiAgICAgIC8vIFRoaXMgaXMgYSB3aG9sZS1saW5lIHJlcGxhY2UuIFRyZWF0ZWQgc3BlY2lhbGx5IHRvIG1ha2VcbiAgICAgIC8vIHN1cmUgbGluZSBvYmplY3RzIG1vdmUgdGhlIHdheSB0aGV5IGFyZSBzdXBwb3NlZCB0by5cbiAgICAgIHZhciBhZGRlZCA9IGxpbmVzRm9yKDAsIHRleHQubGVuZ3RoIC0gMSk7XG4gICAgICB1cGRhdGUobGFzdExpbmUsIGxhc3RMaW5lLnRleHQsIGxhc3RTcGFucyk7XG4gICAgICBpZiAobmxpbmVzKSB7IGRvYy5yZW1vdmUoZnJvbS5saW5lLCBubGluZXMpOyB9XG4gICAgICBpZiAoYWRkZWQubGVuZ3RoKSB7IGRvYy5pbnNlcnQoZnJvbS5saW5lLCBhZGRlZCk7IH1cbiAgICB9IGVsc2UgaWYgKGZpcnN0TGluZSA9PSBsYXN0TGluZSkge1xuICAgICAgaWYgKHRleHQubGVuZ3RoID09IDEpIHtcbiAgICAgICAgdXBkYXRlKGZpcnN0TGluZSwgZmlyc3RMaW5lLnRleHQuc2xpY2UoMCwgZnJvbS5jaCkgKyBsYXN0VGV4dCArIGZpcnN0TGluZS50ZXh0LnNsaWNlKHRvLmNoKSwgbGFzdFNwYW5zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBhZGRlZCQxID0gbGluZXNGb3IoMSwgdGV4dC5sZW5ndGggLSAxKTtcbiAgICAgICAgYWRkZWQkMS5wdXNoKG5ldyBMaW5lKGxhc3RUZXh0ICsgZmlyc3RMaW5lLnRleHQuc2xpY2UodG8uY2gpLCBsYXN0U3BhbnMsIGVzdGltYXRlSGVpZ2h0KSk7XG4gICAgICAgIHVwZGF0ZShmaXJzdExpbmUsIGZpcnN0TGluZS50ZXh0LnNsaWNlKDAsIGZyb20uY2gpICsgdGV4dFswXSwgc3BhbnNGb3IoMCkpO1xuICAgICAgICBkb2MuaW5zZXJ0KGZyb20ubGluZSArIDEsIGFkZGVkJDEpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGV4dC5sZW5ndGggPT0gMSkge1xuICAgICAgdXBkYXRlKGZpcnN0TGluZSwgZmlyc3RMaW5lLnRleHQuc2xpY2UoMCwgZnJvbS5jaCkgKyB0ZXh0WzBdICsgbGFzdExpbmUudGV4dC5zbGljZSh0by5jaCksIHNwYW5zRm9yKDApKTtcbiAgICAgIGRvYy5yZW1vdmUoZnJvbS5saW5lICsgMSwgbmxpbmVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdXBkYXRlKGZpcnN0TGluZSwgZmlyc3RMaW5lLnRleHQuc2xpY2UoMCwgZnJvbS5jaCkgKyB0ZXh0WzBdLCBzcGFuc0ZvcigwKSk7XG4gICAgICB1cGRhdGUobGFzdExpbmUsIGxhc3RUZXh0ICsgbGFzdExpbmUudGV4dC5zbGljZSh0by5jaCksIGxhc3RTcGFucyk7XG4gICAgICB2YXIgYWRkZWQkMiA9IGxpbmVzRm9yKDEsIHRleHQubGVuZ3RoIC0gMSk7XG4gICAgICBpZiAobmxpbmVzID4gMSkgeyBkb2MucmVtb3ZlKGZyb20ubGluZSArIDEsIG5saW5lcyAtIDEpOyB9XG4gICAgICBkb2MuaW5zZXJ0KGZyb20ubGluZSArIDEsIGFkZGVkJDIpO1xuICAgIH1cblxuICAgIHNpZ25hbExhdGVyKGRvYywgXCJjaGFuZ2VcIiwgZG9jLCBjaGFuZ2UpO1xuICB9XG5cbiAgLy8gQ2FsbCBmIGZvciBhbGwgbGlua2VkIGRvY3VtZW50cy5cbiAgZnVuY3Rpb24gbGlua2VkRG9jcyhkb2MsIGYsIHNoYXJlZEhpc3RPbmx5KSB7XG4gICAgZnVuY3Rpb24gcHJvcGFnYXRlKGRvYywgc2tpcCwgc2hhcmVkSGlzdCkge1xuICAgICAgaWYgKGRvYy5saW5rZWQpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBkb2MubGlua2VkLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciByZWwgPSBkb2MubGlua2VkW2ldO1xuICAgICAgICBpZiAocmVsLmRvYyA9PSBza2lwKSB7IGNvbnRpbnVlIH1cbiAgICAgICAgdmFyIHNoYXJlZCA9IHNoYXJlZEhpc3QgJiYgcmVsLnNoYXJlZEhpc3Q7XG4gICAgICAgIGlmIChzaGFyZWRIaXN0T25seSAmJiAhc2hhcmVkKSB7IGNvbnRpbnVlIH1cbiAgICAgICAgZihyZWwuZG9jLCBzaGFyZWQpO1xuICAgICAgICBwcm9wYWdhdGUocmVsLmRvYywgZG9jLCBzaGFyZWQpO1xuICAgICAgfSB9XG4gICAgfVxuICAgIHByb3BhZ2F0ZShkb2MsIG51bGwsIHRydWUpO1xuICB9XG5cbiAgLy8gQXR0YWNoIGEgZG9jdW1lbnQgdG8gYW4gZWRpdG9yLlxuICBmdW5jdGlvbiBhdHRhY2hEb2MoY20sIGRvYykge1xuICAgIGlmIChkb2MuY20pIHsgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBkb2N1bWVudCBpcyBhbHJlYWR5IGluIHVzZS5cIikgfVxuICAgIGNtLmRvYyA9IGRvYztcbiAgICBkb2MuY20gPSBjbTtcbiAgICBlc3RpbWF0ZUxpbmVIZWlnaHRzKGNtKTtcbiAgICBsb2FkTW9kZShjbSk7XG4gICAgc2V0RGlyZWN0aW9uQ2xhc3MoY20pO1xuICAgIGlmICghY20ub3B0aW9ucy5saW5lV3JhcHBpbmcpIHsgZmluZE1heExpbmUoY20pOyB9XG4gICAgY20ub3B0aW9ucy5tb2RlID0gZG9jLm1vZGVPcHRpb247XG4gICAgcmVnQ2hhbmdlKGNtKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldERpcmVjdGlvbkNsYXNzKGNtKSB7XG4gIChjbS5kb2MuZGlyZWN0aW9uID09IFwicnRsXCIgPyBhZGRDbGFzcyA6IHJtQ2xhc3MpKGNtLmRpc3BsYXkubGluZURpdiwgXCJDb2RlTWlycm9yLXJ0bFwiKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRpcmVjdGlvbkNoYW5nZWQoY20pIHtcbiAgICBydW5Jbk9wKGNtLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzZXREaXJlY3Rpb25DbGFzcyhjbSk7XG4gICAgICByZWdDaGFuZ2UoY20pO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gSGlzdG9yeShwcmV2KSB7XG4gICAgLy8gQXJyYXlzIG9mIGNoYW5nZSBldmVudHMgYW5kIHNlbGVjdGlvbnMuIERvaW5nIHNvbWV0aGluZyBhZGRzIGFuXG4gICAgLy8gZXZlbnQgdG8gZG9uZSBhbmQgY2xlYXJzIHVuZG8uIFVuZG9pbmcgbW92ZXMgZXZlbnRzIGZyb20gZG9uZVxuICAgIC8vIHRvIHVuZG9uZSwgcmVkb2luZyBtb3ZlcyB0aGVtIGluIHRoZSBvdGhlciBkaXJlY3Rpb24uXG4gICAgdGhpcy5kb25lID0gW107IHRoaXMudW5kb25lID0gW107XG4gICAgdGhpcy51bmRvRGVwdGggPSBwcmV2ID8gcHJldi51bmRvRGVwdGggOiBJbmZpbml0eTtcbiAgICAvLyBVc2VkIHRvIHRyYWNrIHdoZW4gY2hhbmdlcyBjYW4gYmUgbWVyZ2VkIGludG8gYSBzaW5nbGUgdW5kb1xuICAgIC8vIGV2ZW50XG4gICAgdGhpcy5sYXN0TW9kVGltZSA9IHRoaXMubGFzdFNlbFRpbWUgPSAwO1xuICAgIHRoaXMubGFzdE9wID0gdGhpcy5sYXN0U2VsT3AgPSBudWxsO1xuICAgIHRoaXMubGFzdE9yaWdpbiA9IHRoaXMubGFzdFNlbE9yaWdpbiA9IG51bGw7XG4gICAgLy8gVXNlZCBieSB0aGUgaXNDbGVhbigpIG1ldGhvZFxuICAgIHRoaXMuZ2VuZXJhdGlvbiA9IHRoaXMubWF4R2VuZXJhdGlvbiA9IHByZXYgPyBwcmV2Lm1heEdlbmVyYXRpb24gOiAxO1xuICB9XG5cbiAgLy8gQ3JlYXRlIGEgaGlzdG9yeSBjaGFuZ2UgZXZlbnQgZnJvbSBhbiB1cGRhdGVEb2Mtc3R5bGUgY2hhbmdlXG4gIC8vIG9iamVjdC5cbiAgZnVuY3Rpb24gaGlzdG9yeUNoYW5nZUZyb21DaGFuZ2UoZG9jLCBjaGFuZ2UpIHtcbiAgICB2YXIgaGlzdENoYW5nZSA9IHtmcm9tOiBjb3B5UG9zKGNoYW5nZS5mcm9tKSwgdG86IGNoYW5nZUVuZChjaGFuZ2UpLCB0ZXh0OiBnZXRCZXR3ZWVuKGRvYywgY2hhbmdlLmZyb20sIGNoYW5nZS50byl9O1xuICAgIGF0dGFjaExvY2FsU3BhbnMoZG9jLCBoaXN0Q2hhbmdlLCBjaGFuZ2UuZnJvbS5saW5lLCBjaGFuZ2UudG8ubGluZSArIDEpO1xuICAgIGxpbmtlZERvY3MoZG9jLCBmdW5jdGlvbiAoZG9jKSB7IHJldHVybiBhdHRhY2hMb2NhbFNwYW5zKGRvYywgaGlzdENoYW5nZSwgY2hhbmdlLmZyb20ubGluZSwgY2hhbmdlLnRvLmxpbmUgKyAxKTsgfSwgdHJ1ZSk7XG4gICAgcmV0dXJuIGhpc3RDaGFuZ2VcbiAgfVxuXG4gIC8vIFBvcCBhbGwgc2VsZWN0aW9uIGV2ZW50cyBvZmYgdGhlIGVuZCBvZiBhIGhpc3RvcnkgYXJyYXkuIFN0b3AgYXRcbiAgLy8gYSBjaGFuZ2UgZXZlbnQuXG4gIGZ1bmN0aW9uIGNsZWFyU2VsZWN0aW9uRXZlbnRzKGFycmF5KSB7XG4gICAgd2hpbGUgKGFycmF5Lmxlbmd0aCkge1xuICAgICAgdmFyIGxhc3QgPSBsc3QoYXJyYXkpO1xuICAgICAgaWYgKGxhc3QucmFuZ2VzKSB7IGFycmF5LnBvcCgpOyB9XG4gICAgICBlbHNlIHsgYnJlYWsgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEZpbmQgdGhlIHRvcCBjaGFuZ2UgZXZlbnQgaW4gdGhlIGhpc3RvcnkuIFBvcCBvZmYgc2VsZWN0aW9uXG4gIC8vIGV2ZW50cyB0aGF0IGFyZSBpbiB0aGUgd2F5LlxuICBmdW5jdGlvbiBsYXN0Q2hhbmdlRXZlbnQoaGlzdCwgZm9yY2UpIHtcbiAgICBpZiAoZm9yY2UpIHtcbiAgICAgIGNsZWFyU2VsZWN0aW9uRXZlbnRzKGhpc3QuZG9uZSk7XG4gICAgICByZXR1cm4gbHN0KGhpc3QuZG9uZSlcbiAgICB9IGVsc2UgaWYgKGhpc3QuZG9uZS5sZW5ndGggJiYgIWxzdChoaXN0LmRvbmUpLnJhbmdlcykge1xuICAgICAgcmV0dXJuIGxzdChoaXN0LmRvbmUpXG4gICAgfSBlbHNlIGlmIChoaXN0LmRvbmUubGVuZ3RoID4gMSAmJiAhaGlzdC5kb25lW2hpc3QuZG9uZS5sZW5ndGggLSAyXS5yYW5nZXMpIHtcbiAgICAgIGhpc3QuZG9uZS5wb3AoKTtcbiAgICAgIHJldHVybiBsc3QoaGlzdC5kb25lKVxuICAgIH1cbiAgfVxuXG4gIC8vIFJlZ2lzdGVyIGEgY2hhbmdlIGluIHRoZSBoaXN0b3J5LiBNZXJnZXMgY2hhbmdlcyB0aGF0IGFyZSB3aXRoaW5cbiAgLy8gYSBzaW5nbGUgb3BlcmF0aW9uLCBvciBhcmUgY2xvc2UgdG9nZXRoZXIgd2l0aCBhbiBvcmlnaW4gdGhhdFxuICAvLyBhbGxvd3MgbWVyZ2luZyAoc3RhcnRpbmcgd2l0aCBcIitcIikgaW50byBhIHNpbmdsZSBldmVudC5cbiAgZnVuY3Rpb24gYWRkQ2hhbmdlVG9IaXN0b3J5KGRvYywgY2hhbmdlLCBzZWxBZnRlciwgb3BJZCkge1xuICAgIHZhciBoaXN0ID0gZG9jLmhpc3Rvcnk7XG4gICAgaGlzdC51bmRvbmUubGVuZ3RoID0gMDtcbiAgICB2YXIgdGltZSA9ICtuZXcgRGF0ZSwgY3VyO1xuICAgIHZhciBsYXN0O1xuXG4gICAgaWYgKChoaXN0Lmxhc3RPcCA9PSBvcElkIHx8XG4gICAgICAgICBoaXN0Lmxhc3RPcmlnaW4gPT0gY2hhbmdlLm9yaWdpbiAmJiBjaGFuZ2Uub3JpZ2luICYmXG4gICAgICAgICAoKGNoYW5nZS5vcmlnaW4uY2hhckF0KDApID09IFwiK1wiICYmIGhpc3QubGFzdE1vZFRpbWUgPiB0aW1lIC0gKGRvYy5jbSA/IGRvYy5jbS5vcHRpb25zLmhpc3RvcnlFdmVudERlbGF5IDogNTAwKSkgfHxcbiAgICAgICAgICBjaGFuZ2Uub3JpZ2luLmNoYXJBdCgwKSA9PSBcIipcIikpICYmXG4gICAgICAgIChjdXIgPSBsYXN0Q2hhbmdlRXZlbnQoaGlzdCwgaGlzdC5sYXN0T3AgPT0gb3BJZCkpKSB7XG4gICAgICAvLyBNZXJnZSB0aGlzIGNoYW5nZSBpbnRvIHRoZSBsYXN0IGV2ZW50XG4gICAgICBsYXN0ID0gbHN0KGN1ci5jaGFuZ2VzKTtcbiAgICAgIGlmIChjbXAoY2hhbmdlLmZyb20sIGNoYW5nZS50bykgPT0gMCAmJiBjbXAoY2hhbmdlLmZyb20sIGxhc3QudG8pID09IDApIHtcbiAgICAgICAgLy8gT3B0aW1pemVkIGNhc2UgZm9yIHNpbXBsZSBpbnNlcnRpb24gLS0gZG9uJ3Qgd2FudCB0byBhZGRcbiAgICAgICAgLy8gbmV3IGNoYW5nZXNldHMgZm9yIGV2ZXJ5IGNoYXJhY3RlciB0eXBlZFxuICAgICAgICBsYXN0LnRvID0gY2hhbmdlRW5kKGNoYW5nZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBZGQgbmV3IHN1Yi1ldmVudFxuICAgICAgICBjdXIuY2hhbmdlcy5wdXNoKGhpc3RvcnlDaGFuZ2VGcm9tQ2hhbmdlKGRvYywgY2hhbmdlKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENhbiBub3QgYmUgbWVyZ2VkLCBzdGFydCBhIG5ldyBldmVudC5cbiAgICAgIHZhciBiZWZvcmUgPSBsc3QoaGlzdC5kb25lKTtcbiAgICAgIGlmICghYmVmb3JlIHx8ICFiZWZvcmUucmFuZ2VzKVxuICAgICAgICB7IHB1c2hTZWxlY3Rpb25Ub0hpc3RvcnkoZG9jLnNlbCwgaGlzdC5kb25lKTsgfVxuICAgICAgY3VyID0ge2NoYW5nZXM6IFtoaXN0b3J5Q2hhbmdlRnJvbUNoYW5nZShkb2MsIGNoYW5nZSldLFxuICAgICAgICAgICAgIGdlbmVyYXRpb246IGhpc3QuZ2VuZXJhdGlvbn07XG4gICAgICBoaXN0LmRvbmUucHVzaChjdXIpO1xuICAgICAgd2hpbGUgKGhpc3QuZG9uZS5sZW5ndGggPiBoaXN0LnVuZG9EZXB0aCkge1xuICAgICAgICBoaXN0LmRvbmUuc2hpZnQoKTtcbiAgICAgICAgaWYgKCFoaXN0LmRvbmVbMF0ucmFuZ2VzKSB7IGhpc3QuZG9uZS5zaGlmdCgpOyB9XG4gICAgICB9XG4gICAgfVxuICAgIGhpc3QuZG9uZS5wdXNoKHNlbEFmdGVyKTtcbiAgICBoaXN0LmdlbmVyYXRpb24gPSArK2hpc3QubWF4R2VuZXJhdGlvbjtcbiAgICBoaXN0Lmxhc3RNb2RUaW1lID0gaGlzdC5sYXN0U2VsVGltZSA9IHRpbWU7XG4gICAgaGlzdC5sYXN0T3AgPSBoaXN0Lmxhc3RTZWxPcCA9IG9wSWQ7XG4gICAgaGlzdC5sYXN0T3JpZ2luID0gaGlzdC5sYXN0U2VsT3JpZ2luID0gY2hhbmdlLm9yaWdpbjtcblxuICAgIGlmICghbGFzdCkgeyBzaWduYWwoZG9jLCBcImhpc3RvcnlBZGRlZFwiKTsgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2VsZWN0aW9uRXZlbnRDYW5CZU1lcmdlZChkb2MsIG9yaWdpbiwgcHJldiwgc2VsKSB7XG4gICAgdmFyIGNoID0gb3JpZ2luLmNoYXJBdCgwKTtcbiAgICByZXR1cm4gY2ggPT0gXCIqXCIgfHxcbiAgICAgIGNoID09IFwiK1wiICYmXG4gICAgICBwcmV2LnJhbmdlcy5sZW5ndGggPT0gc2VsLnJhbmdlcy5sZW5ndGggJiZcbiAgICAgIHByZXYuc29tZXRoaW5nU2VsZWN0ZWQoKSA9PSBzZWwuc29tZXRoaW5nU2VsZWN0ZWQoKSAmJlxuICAgICAgbmV3IERhdGUgLSBkb2MuaGlzdG9yeS5sYXN0U2VsVGltZSA8PSAoZG9jLmNtID8gZG9jLmNtLm9wdGlvbnMuaGlzdG9yeUV2ZW50RGVsYXkgOiA1MDApXG4gIH1cblxuICAvLyBDYWxsZWQgd2hlbmV2ZXIgdGhlIHNlbGVjdGlvbiBjaGFuZ2VzLCBzZXRzIHRoZSBuZXcgc2VsZWN0aW9uIGFzXG4gIC8vIHRoZSBwZW5kaW5nIHNlbGVjdGlvbiBpbiB0aGUgaGlzdG9yeSwgYW5kIHB1c2hlcyB0aGUgb2xkIHBlbmRpbmdcbiAgLy8gc2VsZWN0aW9uIGludG8gdGhlICdkb25lJyBhcnJheSB3aGVuIGl0IHdhcyBzaWduaWZpY2FudGx5XG4gIC8vIGRpZmZlcmVudCAoaW4gbnVtYmVyIG9mIHNlbGVjdGVkIHJhbmdlcywgZW1wdGluZXNzLCBvciB0aW1lKS5cbiAgZnVuY3Rpb24gYWRkU2VsZWN0aW9uVG9IaXN0b3J5KGRvYywgc2VsLCBvcElkLCBvcHRpb25zKSB7XG4gICAgdmFyIGhpc3QgPSBkb2MuaGlzdG9yeSwgb3JpZ2luID0gb3B0aW9ucyAmJiBvcHRpb25zLm9yaWdpbjtcblxuICAgIC8vIEEgbmV3IGV2ZW50IGlzIHN0YXJ0ZWQgd2hlbiB0aGUgcHJldmlvdXMgb3JpZ2luIGRvZXMgbm90IG1hdGNoXG4gICAgLy8gdGhlIGN1cnJlbnQsIG9yIHRoZSBvcmlnaW5zIGRvbid0IGFsbG93IG1hdGNoaW5nLiBPcmlnaW5zXG4gICAgLy8gc3RhcnRpbmcgd2l0aCAqIGFyZSBhbHdheXMgbWVyZ2VkLCB0aG9zZSBzdGFydGluZyB3aXRoICsgYXJlXG4gICAgLy8gbWVyZ2VkIHdoZW4gc2ltaWxhciBhbmQgY2xvc2UgdG9nZXRoZXIgaW4gdGltZS5cbiAgICBpZiAob3BJZCA9PSBoaXN0Lmxhc3RTZWxPcCB8fFxuICAgICAgICAob3JpZ2luICYmIGhpc3QubGFzdFNlbE9yaWdpbiA9PSBvcmlnaW4gJiZcbiAgICAgICAgIChoaXN0Lmxhc3RNb2RUaW1lID09IGhpc3QubGFzdFNlbFRpbWUgJiYgaGlzdC5sYXN0T3JpZ2luID09IG9yaWdpbiB8fFxuICAgICAgICAgIHNlbGVjdGlvbkV2ZW50Q2FuQmVNZXJnZWQoZG9jLCBvcmlnaW4sIGxzdChoaXN0LmRvbmUpLCBzZWwpKSkpXG4gICAgICB7IGhpc3QuZG9uZVtoaXN0LmRvbmUubGVuZ3RoIC0gMV0gPSBzZWw7IH1cbiAgICBlbHNlXG4gICAgICB7IHB1c2hTZWxlY3Rpb25Ub0hpc3Rvcnkoc2VsLCBoaXN0LmRvbmUpOyB9XG5cbiAgICBoaXN0Lmxhc3RTZWxUaW1lID0gK25ldyBEYXRlO1xuICAgIGhpc3QubGFzdFNlbE9yaWdpbiA9IG9yaWdpbjtcbiAgICBoaXN0Lmxhc3RTZWxPcCA9IG9wSWQ7XG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5jbGVhclJlZG8gIT09IGZhbHNlKVxuICAgICAgeyBjbGVhclNlbGVjdGlvbkV2ZW50cyhoaXN0LnVuZG9uZSk7IH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHB1c2hTZWxlY3Rpb25Ub0hpc3Rvcnkoc2VsLCBkZXN0KSB7XG4gICAgdmFyIHRvcCA9IGxzdChkZXN0KTtcbiAgICBpZiAoISh0b3AgJiYgdG9wLnJhbmdlcyAmJiB0b3AuZXF1YWxzKHNlbCkpKVxuICAgICAgeyBkZXN0LnB1c2goc2VsKTsgfVxuICB9XG5cbiAgLy8gVXNlZCB0byBzdG9yZSBtYXJrZWQgc3BhbiBpbmZvcm1hdGlvbiBpbiB0aGUgaGlzdG9yeS5cbiAgZnVuY3Rpb24gYXR0YWNoTG9jYWxTcGFucyhkb2MsIGNoYW5nZSwgZnJvbSwgdG8pIHtcbiAgICB2YXIgZXhpc3RpbmcgPSBjaGFuZ2VbXCJzcGFuc19cIiArIGRvYy5pZF0sIG4gPSAwO1xuICAgIGRvYy5pdGVyKE1hdGgubWF4KGRvYy5maXJzdCwgZnJvbSksIE1hdGgubWluKGRvYy5maXJzdCArIGRvYy5zaXplLCB0byksIGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgICBpZiAobGluZS5tYXJrZWRTcGFucylcbiAgICAgICAgeyAoZXhpc3RpbmcgfHwgKGV4aXN0aW5nID0gY2hhbmdlW1wic3BhbnNfXCIgKyBkb2MuaWRdID0ge30pKVtuXSA9IGxpbmUubWFya2VkU3BhbnM7IH1cbiAgICAgICsrbjtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFdoZW4gdW4vcmUtZG9pbmcgcmVzdG9yZXMgdGV4dCBjb250YWluaW5nIG1hcmtlZCBzcGFucywgdGhvc2VcbiAgLy8gdGhhdCBoYXZlIGJlZW4gZXhwbGljaXRseSBjbGVhcmVkIHNob3VsZCBub3QgYmUgcmVzdG9yZWQuXG4gIGZ1bmN0aW9uIHJlbW92ZUNsZWFyZWRTcGFucyhzcGFucykge1xuICAgIGlmICghc3BhbnMpIHsgcmV0dXJuIG51bGwgfVxuICAgIHZhciBvdXQ7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzcGFucy5sZW5ndGg7ICsraSkge1xuICAgICAgaWYgKHNwYW5zW2ldLm1hcmtlci5leHBsaWNpdGx5Q2xlYXJlZCkgeyBpZiAoIW91dCkgeyBvdXQgPSBzcGFucy5zbGljZSgwLCBpKTsgfSB9XG4gICAgICBlbHNlIGlmIChvdXQpIHsgb3V0LnB1c2goc3BhbnNbaV0pOyB9XG4gICAgfVxuICAgIHJldHVybiAhb3V0ID8gc3BhbnMgOiBvdXQubGVuZ3RoID8gb3V0IDogbnVsbFxuICB9XG5cbiAgLy8gUmV0cmlldmUgYW5kIGZpbHRlciB0aGUgb2xkIG1hcmtlZCBzcGFucyBzdG9yZWQgaW4gYSBjaGFuZ2UgZXZlbnQuXG4gIGZ1bmN0aW9uIGdldE9sZFNwYW5zKGRvYywgY2hhbmdlKSB7XG4gICAgdmFyIGZvdW5kID0gY2hhbmdlW1wic3BhbnNfXCIgKyBkb2MuaWRdO1xuICAgIGlmICghZm91bmQpIHsgcmV0dXJuIG51bGwgfVxuICAgIHZhciBudyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hhbmdlLnRleHQubGVuZ3RoOyArK2kpXG4gICAgICB7IG53LnB1c2gocmVtb3ZlQ2xlYXJlZFNwYW5zKGZvdW5kW2ldKSk7IH1cbiAgICByZXR1cm4gbndcbiAgfVxuXG4gIC8vIFVzZWQgZm9yIHVuL3JlLWRvaW5nIGNoYW5nZXMgZnJvbSB0aGUgaGlzdG9yeS4gQ29tYmluZXMgdGhlXG4gIC8vIHJlc3VsdCBvZiBjb21wdXRpbmcgdGhlIGV4aXN0aW5nIHNwYW5zIHdpdGggdGhlIHNldCBvZiBzcGFucyB0aGF0XG4gIC8vIGV4aXN0ZWQgaW4gdGhlIGhpc3RvcnkgKHNvIHRoYXQgZGVsZXRpbmcgYXJvdW5kIGEgc3BhbiBhbmQgdGhlblxuICAvLyB1bmRvaW5nIGJyaW5ncyBiYWNrIHRoZSBzcGFuKS5cbiAgZnVuY3Rpb24gbWVyZ2VPbGRTcGFucyhkb2MsIGNoYW5nZSkge1xuICAgIHZhciBvbGQgPSBnZXRPbGRTcGFucyhkb2MsIGNoYW5nZSk7XG4gICAgdmFyIHN0cmV0Y2hlZCA9IHN0cmV0Y2hTcGFuc092ZXJDaGFuZ2UoZG9jLCBjaGFuZ2UpO1xuICAgIGlmICghb2xkKSB7IHJldHVybiBzdHJldGNoZWQgfVxuICAgIGlmICghc3RyZXRjaGVkKSB7IHJldHVybiBvbGQgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvbGQubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBvbGRDdXIgPSBvbGRbaV0sIHN0cmV0Y2hDdXIgPSBzdHJldGNoZWRbaV07XG4gICAgICBpZiAob2xkQ3VyICYmIHN0cmV0Y2hDdXIpIHtcbiAgICAgICAgc3BhbnM6IGZvciAodmFyIGogPSAwOyBqIDwgc3RyZXRjaEN1ci5sZW5ndGg7ICsraikge1xuICAgICAgICAgIHZhciBzcGFuID0gc3RyZXRjaEN1cltqXTtcbiAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IG9sZEN1ci5sZW5ndGg7ICsraylcbiAgICAgICAgICAgIHsgaWYgKG9sZEN1cltrXS5tYXJrZXIgPT0gc3Bhbi5tYXJrZXIpIHsgY29udGludWUgc3BhbnMgfSB9XG4gICAgICAgICAgb2xkQ3VyLnB1c2goc3Bhbik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc3RyZXRjaEN1cikge1xuICAgICAgICBvbGRbaV0gPSBzdHJldGNoQ3VyO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2xkXG4gIH1cblxuICAvLyBVc2VkIGJvdGggdG8gcHJvdmlkZSBhIEpTT04tc2FmZSBvYmplY3QgaW4gLmdldEhpc3RvcnksIGFuZCwgd2hlblxuICAvLyBkZXRhY2hpbmcgYSBkb2N1bWVudCwgdG8gc3BsaXQgdGhlIGhpc3RvcnkgaW4gdHdvXG4gIGZ1bmN0aW9uIGNvcHlIaXN0b3J5QXJyYXkoZXZlbnRzLCBuZXdHcm91cCwgaW5zdGFudGlhdGVTZWwpIHtcbiAgICB2YXIgY29weSA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXZlbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgZXZlbnQgPSBldmVudHNbaV07XG4gICAgICBpZiAoZXZlbnQucmFuZ2VzKSB7XG4gICAgICAgIGNvcHkucHVzaChpbnN0YW50aWF0ZVNlbCA/IFNlbGVjdGlvbi5wcm90b3R5cGUuZGVlcENvcHkuY2FsbChldmVudCkgOiBldmVudCk7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICB2YXIgY2hhbmdlcyA9IGV2ZW50LmNoYW5nZXMsIG5ld0NoYW5nZXMgPSBbXTtcbiAgICAgIGNvcHkucHVzaCh7Y2hhbmdlczogbmV3Q2hhbmdlc30pO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjaGFuZ2VzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgIHZhciBjaGFuZ2UgPSBjaGFuZ2VzW2pdLCBtID0gKHZvaWQgMCk7XG4gICAgICAgIG5ld0NoYW5nZXMucHVzaCh7ZnJvbTogY2hhbmdlLmZyb20sIHRvOiBjaGFuZ2UudG8sIHRleHQ6IGNoYW5nZS50ZXh0fSk7XG4gICAgICAgIGlmIChuZXdHcm91cCkgeyBmb3IgKHZhciBwcm9wIGluIGNoYW5nZSkgeyBpZiAobSA9IHByb3AubWF0Y2goL15zcGFuc18oXFxkKykkLykpIHtcbiAgICAgICAgICBpZiAoaW5kZXhPZihuZXdHcm91cCwgTnVtYmVyKG1bMV0pKSA+IC0xKSB7XG4gICAgICAgICAgICBsc3QobmV3Q2hhbmdlcylbcHJvcF0gPSBjaGFuZ2VbcHJvcF07XG4gICAgICAgICAgICBkZWxldGUgY2hhbmdlW3Byb3BdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSB9IH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvcHlcbiAgfVxuXG4gIC8vIFRoZSAnc2Nyb2xsJyBwYXJhbWV0ZXIgZ2l2ZW4gdG8gbWFueSBvZiB0aGVzZSBpbmRpY2F0ZWQgd2hldGhlclxuICAvLyB0aGUgbmV3IGN1cnNvciBwb3NpdGlvbiBzaG91bGQgYmUgc2Nyb2xsZWQgaW50byB2aWV3IGFmdGVyXG4gIC8vIG1vZGlmeWluZyB0aGUgc2VsZWN0aW9uLlxuXG4gIC8vIElmIHNoaWZ0IGlzIGhlbGQgb3IgdGhlIGV4dGVuZCBmbGFnIGlzIHNldCwgZXh0ZW5kcyBhIHJhbmdlIHRvXG4gIC8vIGluY2x1ZGUgYSBnaXZlbiBwb3NpdGlvbiAoYW5kIG9wdGlvbmFsbHkgYSBzZWNvbmQgcG9zaXRpb24pLlxuICAvLyBPdGhlcndpc2UsIHNpbXBseSByZXR1cm5zIHRoZSByYW5nZSBiZXR3ZWVuIHRoZSBnaXZlbiBwb3NpdGlvbnMuXG4gIC8vIFVzZWQgZm9yIGN1cnNvciBtb3Rpb24gYW5kIHN1Y2guXG4gIGZ1bmN0aW9uIGV4dGVuZFJhbmdlKHJhbmdlLCBoZWFkLCBvdGhlciwgZXh0ZW5kKSB7XG4gICAgaWYgKGV4dGVuZCkge1xuICAgICAgdmFyIGFuY2hvciA9IHJhbmdlLmFuY2hvcjtcbiAgICAgIGlmIChvdGhlcikge1xuICAgICAgICB2YXIgcG9zQmVmb3JlID0gY21wKGhlYWQsIGFuY2hvcikgPCAwO1xuICAgICAgICBpZiAocG9zQmVmb3JlICE9IChjbXAob3RoZXIsIGFuY2hvcikgPCAwKSkge1xuICAgICAgICAgIGFuY2hvciA9IGhlYWQ7XG4gICAgICAgICAgaGVhZCA9IG90aGVyO1xuICAgICAgICB9IGVsc2UgaWYgKHBvc0JlZm9yZSAhPSAoY21wKGhlYWQsIG90aGVyKSA8IDApKSB7XG4gICAgICAgICAgaGVhZCA9IG90aGVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFJhbmdlKGFuY2hvciwgaGVhZClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBSYW5nZShvdGhlciB8fCBoZWFkLCBoZWFkKVxuICAgIH1cbiAgfVxuXG4gIC8vIEV4dGVuZCB0aGUgcHJpbWFyeSBzZWxlY3Rpb24gcmFuZ2UsIGRpc2NhcmQgdGhlIHJlc3QuXG4gIGZ1bmN0aW9uIGV4dGVuZFNlbGVjdGlvbihkb2MsIGhlYWQsIG90aGVyLCBvcHRpb25zLCBleHRlbmQpIHtcbiAgICBpZiAoZXh0ZW5kID09IG51bGwpIHsgZXh0ZW5kID0gZG9jLmNtICYmIChkb2MuY20uZGlzcGxheS5zaGlmdCB8fCBkb2MuZXh0ZW5kKTsgfVxuICAgIHNldFNlbGVjdGlvbihkb2MsIG5ldyBTZWxlY3Rpb24oW2V4dGVuZFJhbmdlKGRvYy5zZWwucHJpbWFyeSgpLCBoZWFkLCBvdGhlciwgZXh0ZW5kKV0sIDApLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8vIEV4dGVuZCBhbGwgc2VsZWN0aW9ucyAocG9zIGlzIGFuIGFycmF5IG9mIHNlbGVjdGlvbnMgd2l0aCBsZW5ndGhcbiAgLy8gZXF1YWwgdGhlIG51bWJlciBvZiBzZWxlY3Rpb25zKVxuICBmdW5jdGlvbiBleHRlbmRTZWxlY3Rpb25zKGRvYywgaGVhZHMsIG9wdGlvbnMpIHtcbiAgICB2YXIgb3V0ID0gW107XG4gICAgdmFyIGV4dGVuZCA9IGRvYy5jbSAmJiAoZG9jLmNtLmRpc3BsYXkuc2hpZnQgfHwgZG9jLmV4dGVuZCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkb2Muc2VsLnJhbmdlcy5sZW5ndGg7IGkrKylcbiAgICAgIHsgb3V0W2ldID0gZXh0ZW5kUmFuZ2UoZG9jLnNlbC5yYW5nZXNbaV0sIGhlYWRzW2ldLCBudWxsLCBleHRlbmQpOyB9XG4gICAgdmFyIG5ld1NlbCA9IG5vcm1hbGl6ZVNlbGVjdGlvbihkb2MuY20sIG91dCwgZG9jLnNlbC5wcmltSW5kZXgpO1xuICAgIHNldFNlbGVjdGlvbihkb2MsIG5ld1NlbCwgb3B0aW9ucyk7XG4gIH1cblxuICAvLyBVcGRhdGVzIGEgc2luZ2xlIHJhbmdlIGluIHRoZSBzZWxlY3Rpb24uXG4gIGZ1bmN0aW9uIHJlcGxhY2VPbmVTZWxlY3Rpb24oZG9jLCBpLCByYW5nZSwgb3B0aW9ucykge1xuICAgIHZhciByYW5nZXMgPSBkb2Muc2VsLnJhbmdlcy5zbGljZSgwKTtcbiAgICByYW5nZXNbaV0gPSByYW5nZTtcbiAgICBzZXRTZWxlY3Rpb24oZG9jLCBub3JtYWxpemVTZWxlY3Rpb24oZG9jLmNtLCByYW5nZXMsIGRvYy5zZWwucHJpbUluZGV4KSwgb3B0aW9ucyk7XG4gIH1cblxuICAvLyBSZXNldCB0aGUgc2VsZWN0aW9uIHRvIGEgc2luZ2xlIHJhbmdlLlxuICBmdW5jdGlvbiBzZXRTaW1wbGVTZWxlY3Rpb24oZG9jLCBhbmNob3IsIGhlYWQsIG9wdGlvbnMpIHtcbiAgICBzZXRTZWxlY3Rpb24oZG9jLCBzaW1wbGVTZWxlY3Rpb24oYW5jaG9yLCBoZWFkKSwgb3B0aW9ucyk7XG4gIH1cblxuICAvLyBHaXZlIGJlZm9yZVNlbGVjdGlvbkNoYW5nZSBoYW5kbGVycyBhIGNoYW5nZSB0byBpbmZsdWVuY2UgYVxuICAvLyBzZWxlY3Rpb24gdXBkYXRlLlxuICBmdW5jdGlvbiBmaWx0ZXJTZWxlY3Rpb25DaGFuZ2UoZG9jLCBzZWwsIG9wdGlvbnMpIHtcbiAgICB2YXIgb2JqID0ge1xuICAgICAgcmFuZ2VzOiBzZWwucmFuZ2VzLFxuICAgICAgdXBkYXRlOiBmdW5jdGlvbihyYW5nZXMpIHtcbiAgICAgICAgdGhpcy5yYW5nZXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgeyB0aGlzLnJhbmdlc1tpXSA9IG5ldyBSYW5nZShjbGlwUG9zKGRvYywgcmFuZ2VzW2ldLmFuY2hvciksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcFBvcyhkb2MsIHJhbmdlc1tpXS5oZWFkKSk7IH1cbiAgICAgIH0sXG4gICAgICBvcmlnaW46IG9wdGlvbnMgJiYgb3B0aW9ucy5vcmlnaW5cbiAgICB9O1xuICAgIHNpZ25hbChkb2MsIFwiYmVmb3JlU2VsZWN0aW9uQ2hhbmdlXCIsIGRvYywgb2JqKTtcbiAgICBpZiAoZG9jLmNtKSB7IHNpZ25hbChkb2MuY20sIFwiYmVmb3JlU2VsZWN0aW9uQ2hhbmdlXCIsIGRvYy5jbSwgb2JqKTsgfVxuICAgIGlmIChvYmoucmFuZ2VzICE9IHNlbC5yYW5nZXMpIHsgcmV0dXJuIG5vcm1hbGl6ZVNlbGVjdGlvbihkb2MuY20sIG9iai5yYW5nZXMsIG9iai5yYW5nZXMubGVuZ3RoIC0gMSkgfVxuICAgIGVsc2UgeyByZXR1cm4gc2VsIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNldFNlbGVjdGlvblJlcGxhY2VIaXN0b3J5KGRvYywgc2VsLCBvcHRpb25zKSB7XG4gICAgdmFyIGRvbmUgPSBkb2MuaGlzdG9yeS5kb25lLCBsYXN0ID0gbHN0KGRvbmUpO1xuICAgIGlmIChsYXN0ICYmIGxhc3QucmFuZ2VzKSB7XG4gICAgICBkb25lW2RvbmUubGVuZ3RoIC0gMV0gPSBzZWw7XG4gICAgICBzZXRTZWxlY3Rpb25Ob1VuZG8oZG9jLCBzZWwsIG9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRTZWxlY3Rpb24oZG9jLCBzZWwsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNldCBhIG5ldyBzZWxlY3Rpb24uXG4gIGZ1bmN0aW9uIHNldFNlbGVjdGlvbihkb2MsIHNlbCwgb3B0aW9ucykge1xuICAgIHNldFNlbGVjdGlvbk5vVW5kbyhkb2MsIHNlbCwgb3B0aW9ucyk7XG4gICAgYWRkU2VsZWN0aW9uVG9IaXN0b3J5KGRvYywgZG9jLnNlbCwgZG9jLmNtID8gZG9jLmNtLmN1ck9wLmlkIDogTmFOLCBvcHRpb25zKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldFNlbGVjdGlvbk5vVW5kbyhkb2MsIHNlbCwgb3B0aW9ucykge1xuICAgIGlmIChoYXNIYW5kbGVyKGRvYywgXCJiZWZvcmVTZWxlY3Rpb25DaGFuZ2VcIikgfHwgZG9jLmNtICYmIGhhc0hhbmRsZXIoZG9jLmNtLCBcImJlZm9yZVNlbGVjdGlvbkNoYW5nZVwiKSlcbiAgICAgIHsgc2VsID0gZmlsdGVyU2VsZWN0aW9uQ2hhbmdlKGRvYywgc2VsLCBvcHRpb25zKTsgfVxuXG4gICAgdmFyIGJpYXMgPSBvcHRpb25zICYmIG9wdGlvbnMuYmlhcyB8fFxuICAgICAgKGNtcChzZWwucHJpbWFyeSgpLmhlYWQsIGRvYy5zZWwucHJpbWFyeSgpLmhlYWQpIDwgMCA/IC0xIDogMSk7XG4gICAgc2V0U2VsZWN0aW9uSW5uZXIoZG9jLCBza2lwQXRvbWljSW5TZWxlY3Rpb24oZG9jLCBzZWwsIGJpYXMsIHRydWUpKTtcblxuICAgIGlmICghKG9wdGlvbnMgJiYgb3B0aW9ucy5zY3JvbGwgPT09IGZhbHNlKSAmJiBkb2MuY20gJiYgZG9jLmNtLmdldE9wdGlvbihcInJlYWRPbmx5XCIpICE9IFwibm9jdXJzb3JcIilcbiAgICAgIHsgZW5zdXJlQ3Vyc29yVmlzaWJsZShkb2MuY20pOyB9XG4gIH1cblxuICBmdW5jdGlvbiBzZXRTZWxlY3Rpb25Jbm5lcihkb2MsIHNlbCkge1xuICAgIGlmIChzZWwuZXF1YWxzKGRvYy5zZWwpKSB7IHJldHVybiB9XG5cbiAgICBkb2Muc2VsID0gc2VsO1xuXG4gICAgaWYgKGRvYy5jbSkge1xuICAgICAgZG9jLmNtLmN1ck9wLnVwZGF0ZUlucHV0ID0gMTtcbiAgICAgIGRvYy5jbS5jdXJPcC5zZWxlY3Rpb25DaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIHNpZ25hbEN1cnNvckFjdGl2aXR5KGRvYy5jbSk7XG4gICAgfVxuICAgIHNpZ25hbExhdGVyKGRvYywgXCJjdXJzb3JBY3Rpdml0eVwiLCBkb2MpO1xuICB9XG5cbiAgLy8gVmVyaWZ5IHRoYXQgdGhlIHNlbGVjdGlvbiBkb2VzIG5vdCBwYXJ0aWFsbHkgc2VsZWN0IGFueSBhdG9taWNcbiAgLy8gbWFya2VkIHJhbmdlcy5cbiAgZnVuY3Rpb24gcmVDaGVja1NlbGVjdGlvbihkb2MpIHtcbiAgICBzZXRTZWxlY3Rpb25Jbm5lcihkb2MsIHNraXBBdG9taWNJblNlbGVjdGlvbihkb2MsIGRvYy5zZWwsIG51bGwsIGZhbHNlKSk7XG4gIH1cblxuICAvLyBSZXR1cm4gYSBzZWxlY3Rpb24gdGhhdCBkb2VzIG5vdCBwYXJ0aWFsbHkgc2VsZWN0IGFueSBhdG9taWNcbiAgLy8gcmFuZ2VzLlxuICBmdW5jdGlvbiBza2lwQXRvbWljSW5TZWxlY3Rpb24oZG9jLCBzZWwsIGJpYXMsIG1heUNsZWFyKSB7XG4gICAgdmFyIG91dDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbC5yYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciByYW5nZSA9IHNlbC5yYW5nZXNbaV07XG4gICAgICB2YXIgb2xkID0gc2VsLnJhbmdlcy5sZW5ndGggPT0gZG9jLnNlbC5yYW5nZXMubGVuZ3RoICYmIGRvYy5zZWwucmFuZ2VzW2ldO1xuICAgICAgdmFyIG5ld0FuY2hvciA9IHNraXBBdG9taWMoZG9jLCByYW5nZS5hbmNob3IsIG9sZCAmJiBvbGQuYW5jaG9yLCBiaWFzLCBtYXlDbGVhcik7XG4gICAgICB2YXIgbmV3SGVhZCA9IHNraXBBdG9taWMoZG9jLCByYW5nZS5oZWFkLCBvbGQgJiYgb2xkLmhlYWQsIGJpYXMsIG1heUNsZWFyKTtcbiAgICAgIGlmIChvdXQgfHwgbmV3QW5jaG9yICE9IHJhbmdlLmFuY2hvciB8fCBuZXdIZWFkICE9IHJhbmdlLmhlYWQpIHtcbiAgICAgICAgaWYgKCFvdXQpIHsgb3V0ID0gc2VsLnJhbmdlcy5zbGljZSgwLCBpKTsgfVxuICAgICAgICBvdXRbaV0gPSBuZXcgUmFuZ2UobmV3QW5jaG9yLCBuZXdIZWFkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dCA/IG5vcm1hbGl6ZVNlbGVjdGlvbihkb2MuY20sIG91dCwgc2VsLnByaW1JbmRleCkgOiBzZWxcbiAgfVxuXG4gIGZ1bmN0aW9uIHNraXBBdG9taWNJbm5lcihkb2MsIHBvcywgb2xkUG9zLCBkaXIsIG1heUNsZWFyKSB7XG4gICAgdmFyIGxpbmUgPSBnZXRMaW5lKGRvYywgcG9zLmxpbmUpO1xuICAgIGlmIChsaW5lLm1hcmtlZFNwYW5zKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgbGluZS5tYXJrZWRTcGFucy5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIHNwID0gbGluZS5tYXJrZWRTcGFuc1tpXSwgbSA9IHNwLm1hcmtlcjtcblxuICAgICAgLy8gRGV0ZXJtaW5lIGlmIHdlIHNob3VsZCBwcmV2ZW50IHRoZSBjdXJzb3IgYmVpbmcgcGxhY2VkIHRvIHRoZSBsZWZ0L3JpZ2h0IG9mIGFuIGF0b21pYyBtYXJrZXJcbiAgICAgIC8vIEhpc3RvcmljYWxseSB0aGlzIHdhcyBkZXRlcm1pbmVkIHVzaW5nIHRoZSBpbmNsdXNpdmVMZWZ0L1JpZ2h0IG9wdGlvbiwgYnV0IHRoZSBuZXcgd2F5IHRvIGNvbnRyb2wgaXRcbiAgICAgIC8vIGlzIHdpdGggc2VsZWN0TGVmdC9SaWdodFxuICAgICAgdmFyIHByZXZlbnRDdXJzb3JMZWZ0ID0gKFwic2VsZWN0TGVmdFwiIGluIG0pID8gIW0uc2VsZWN0TGVmdCA6IG0uaW5jbHVzaXZlTGVmdDtcbiAgICAgIHZhciBwcmV2ZW50Q3Vyc29yUmlnaHQgPSAoXCJzZWxlY3RSaWdodFwiIGluIG0pID8gIW0uc2VsZWN0UmlnaHQgOiBtLmluY2x1c2l2ZVJpZ2h0O1xuXG4gICAgICBpZiAoKHNwLmZyb20gPT0gbnVsbCB8fCAocHJldmVudEN1cnNvckxlZnQgPyBzcC5mcm9tIDw9IHBvcy5jaCA6IHNwLmZyb20gPCBwb3MuY2gpKSAmJlxuICAgICAgICAgIChzcC50byA9PSBudWxsIHx8IChwcmV2ZW50Q3Vyc29yUmlnaHQgPyBzcC50byA+PSBwb3MuY2ggOiBzcC50byA+IHBvcy5jaCkpKSB7XG4gICAgICAgIGlmIChtYXlDbGVhcikge1xuICAgICAgICAgIHNpZ25hbChtLCBcImJlZm9yZUN1cnNvckVudGVyXCIpO1xuICAgICAgICAgIGlmIChtLmV4cGxpY2l0bHlDbGVhcmVkKSB7XG4gICAgICAgICAgICBpZiAoIWxpbmUubWFya2VkU3BhbnMpIHsgYnJlYWsgfVxuICAgICAgICAgICAgZWxzZSB7LS1pOyBjb250aW51ZX1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtLmF0b21pYykgeyBjb250aW51ZSB9XG5cbiAgICAgICAgaWYgKG9sZFBvcykge1xuICAgICAgICAgIHZhciBuZWFyID0gbS5maW5kKGRpciA8IDAgPyAxIDogLTEpLCBkaWZmID0gKHZvaWQgMCk7XG4gICAgICAgICAgaWYgKGRpciA8IDAgPyBwcmV2ZW50Q3Vyc29yUmlnaHQgOiBwcmV2ZW50Q3Vyc29yTGVmdClcbiAgICAgICAgICAgIHsgbmVhciA9IG1vdmVQb3MoZG9jLCBuZWFyLCAtZGlyLCBuZWFyICYmIG5lYXIubGluZSA9PSBwb3MubGluZSA/IGxpbmUgOiBudWxsKTsgfVxuICAgICAgICAgIGlmIChuZWFyICYmIG5lYXIubGluZSA9PSBwb3MubGluZSAmJiAoZGlmZiA9IGNtcChuZWFyLCBvbGRQb3MpKSAmJiAoZGlyIDwgMCA/IGRpZmYgPCAwIDogZGlmZiA+IDApKVxuICAgICAgICAgICAgeyByZXR1cm4gc2tpcEF0b21pY0lubmVyKGRvYywgbmVhciwgcG9zLCBkaXIsIG1heUNsZWFyKSB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZmFyID0gbS5maW5kKGRpciA8IDAgPyAtMSA6IDEpO1xuICAgICAgICBpZiAoZGlyIDwgMCA/IHByZXZlbnRDdXJzb3JMZWZ0IDogcHJldmVudEN1cnNvclJpZ2h0KVxuICAgICAgICAgIHsgZmFyID0gbW92ZVBvcyhkb2MsIGZhciwgZGlyLCBmYXIubGluZSA9PSBwb3MubGluZSA/IGxpbmUgOiBudWxsKTsgfVxuICAgICAgICByZXR1cm4gZmFyID8gc2tpcEF0b21pY0lubmVyKGRvYywgZmFyLCBwb3MsIGRpciwgbWF5Q2xlYXIpIDogbnVsbFxuICAgICAgfVxuICAgIH0gfVxuICAgIHJldHVybiBwb3NcbiAgfVxuXG4gIC8vIEVuc3VyZSBhIGdpdmVuIHBvc2l0aW9uIGlzIG5vdCBpbnNpZGUgYW4gYXRvbWljIHJhbmdlLlxuICBmdW5jdGlvbiBza2lwQXRvbWljKGRvYywgcG9zLCBvbGRQb3MsIGJpYXMsIG1heUNsZWFyKSB7XG4gICAgdmFyIGRpciA9IGJpYXMgfHwgMTtcbiAgICB2YXIgZm91bmQgPSBza2lwQXRvbWljSW5uZXIoZG9jLCBwb3MsIG9sZFBvcywgZGlyLCBtYXlDbGVhcikgfHxcbiAgICAgICAgKCFtYXlDbGVhciAmJiBza2lwQXRvbWljSW5uZXIoZG9jLCBwb3MsIG9sZFBvcywgZGlyLCB0cnVlKSkgfHxcbiAgICAgICAgc2tpcEF0b21pY0lubmVyKGRvYywgcG9zLCBvbGRQb3MsIC1kaXIsIG1heUNsZWFyKSB8fFxuICAgICAgICAoIW1heUNsZWFyICYmIHNraXBBdG9taWNJbm5lcihkb2MsIHBvcywgb2xkUG9zLCAtZGlyLCB0cnVlKSk7XG4gICAgaWYgKCFmb3VuZCkge1xuICAgICAgZG9jLmNhbnRFZGl0ID0gdHJ1ZTtcbiAgICAgIHJldHVybiBQb3MoZG9jLmZpcnN0LCAwKVxuICAgIH1cbiAgICByZXR1cm4gZm91bmRcbiAgfVxuXG4gIGZ1bmN0aW9uIG1vdmVQb3MoZG9jLCBwb3MsIGRpciwgbGluZSkge1xuICAgIGlmIChkaXIgPCAwICYmIHBvcy5jaCA9PSAwKSB7XG4gICAgICBpZiAocG9zLmxpbmUgPiBkb2MuZmlyc3QpIHsgcmV0dXJuIGNsaXBQb3MoZG9jLCBQb3MocG9zLmxpbmUgLSAxKSkgfVxuICAgICAgZWxzZSB7IHJldHVybiBudWxsIH1cbiAgICB9IGVsc2UgaWYgKGRpciA+IDAgJiYgcG9zLmNoID09IChsaW5lIHx8IGdldExpbmUoZG9jLCBwb3MubGluZSkpLnRleHQubGVuZ3RoKSB7XG4gICAgICBpZiAocG9zLmxpbmUgPCBkb2MuZmlyc3QgKyBkb2Muc2l6ZSAtIDEpIHsgcmV0dXJuIFBvcyhwb3MubGluZSArIDEsIDApIH1cbiAgICAgIGVsc2UgeyByZXR1cm4gbnVsbCB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgUG9zKHBvcy5saW5lLCBwb3MuY2ggKyBkaXIpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2VsZWN0QWxsKGNtKSB7XG4gICAgY20uc2V0U2VsZWN0aW9uKFBvcyhjbS5maXJzdExpbmUoKSwgMCksIFBvcyhjbS5sYXN0TGluZSgpKSwgc2VsX2RvbnRTY3JvbGwpO1xuICB9XG5cbiAgLy8gVVBEQVRJTkdcblxuICAvLyBBbGxvdyBcImJlZm9yZUNoYW5nZVwiIGV2ZW50IGhhbmRsZXJzIHRvIGluZmx1ZW5jZSBhIGNoYW5nZVxuICBmdW5jdGlvbiBmaWx0ZXJDaGFuZ2UoZG9jLCBjaGFuZ2UsIHVwZGF0ZSkge1xuICAgIHZhciBvYmogPSB7XG4gICAgICBjYW5jZWxlZDogZmFsc2UsXG4gICAgICBmcm9tOiBjaGFuZ2UuZnJvbSxcbiAgICAgIHRvOiBjaGFuZ2UudG8sXG4gICAgICB0ZXh0OiBjaGFuZ2UudGV4dCxcbiAgICAgIG9yaWdpbjogY2hhbmdlLm9yaWdpbixcbiAgICAgIGNhbmNlbDogZnVuY3Rpb24gKCkgeyByZXR1cm4gb2JqLmNhbmNlbGVkID0gdHJ1ZTsgfVxuICAgIH07XG4gICAgaWYgKHVwZGF0ZSkgeyBvYmoudXBkYXRlID0gZnVuY3Rpb24gKGZyb20sIHRvLCB0ZXh0LCBvcmlnaW4pIHtcbiAgICAgIGlmIChmcm9tKSB7IG9iai5mcm9tID0gY2xpcFBvcyhkb2MsIGZyb20pOyB9XG4gICAgICBpZiAodG8pIHsgb2JqLnRvID0gY2xpcFBvcyhkb2MsIHRvKTsgfVxuICAgICAgaWYgKHRleHQpIHsgb2JqLnRleHQgPSB0ZXh0OyB9XG4gICAgICBpZiAob3JpZ2luICE9PSB1bmRlZmluZWQpIHsgb2JqLm9yaWdpbiA9IG9yaWdpbjsgfVxuICAgIH07IH1cbiAgICBzaWduYWwoZG9jLCBcImJlZm9yZUNoYW5nZVwiLCBkb2MsIG9iaik7XG4gICAgaWYgKGRvYy5jbSkgeyBzaWduYWwoZG9jLmNtLCBcImJlZm9yZUNoYW5nZVwiLCBkb2MuY20sIG9iaik7IH1cblxuICAgIGlmIChvYmouY2FuY2VsZWQpIHtcbiAgICAgIGlmIChkb2MuY20pIHsgZG9jLmNtLmN1ck9wLnVwZGF0ZUlucHV0ID0gMjsgfVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gICAgcmV0dXJuIHtmcm9tOiBvYmouZnJvbSwgdG86IG9iai50bywgdGV4dDogb2JqLnRleHQsIG9yaWdpbjogb2JqLm9yaWdpbn1cbiAgfVxuXG4gIC8vIEFwcGx5IGEgY2hhbmdlIHRvIGEgZG9jdW1lbnQsIGFuZCBhZGQgaXQgdG8gdGhlIGRvY3VtZW50J3NcbiAgLy8gaGlzdG9yeSwgYW5kIHByb3BhZ2F0aW5nIGl0IHRvIGFsbCBsaW5rZWQgZG9jdW1lbnRzLlxuICBmdW5jdGlvbiBtYWtlQ2hhbmdlKGRvYywgY2hhbmdlLCBpZ25vcmVSZWFkT25seSkge1xuICAgIGlmIChkb2MuY20pIHtcbiAgICAgIGlmICghZG9jLmNtLmN1ck9wKSB7IHJldHVybiBvcGVyYXRpb24oZG9jLmNtLCBtYWtlQ2hhbmdlKShkb2MsIGNoYW5nZSwgaWdub3JlUmVhZE9ubHkpIH1cbiAgICAgIGlmIChkb2MuY20uc3RhdGUuc3VwcHJlc3NFZGl0cykgeyByZXR1cm4gfVxuICAgIH1cblxuICAgIGlmIChoYXNIYW5kbGVyKGRvYywgXCJiZWZvcmVDaGFuZ2VcIikgfHwgZG9jLmNtICYmIGhhc0hhbmRsZXIoZG9jLmNtLCBcImJlZm9yZUNoYW5nZVwiKSkge1xuICAgICAgY2hhbmdlID0gZmlsdGVyQ2hhbmdlKGRvYywgY2hhbmdlLCB0cnVlKTtcbiAgICAgIGlmICghY2hhbmdlKSB7IHJldHVybiB9XG4gICAgfVxuXG4gICAgLy8gUG9zc2libHkgc3BsaXQgb3Igc3VwcHJlc3MgdGhlIHVwZGF0ZSBiYXNlZCBvbiB0aGUgcHJlc2VuY2VcbiAgICAvLyBvZiByZWFkLW9ubHkgc3BhbnMgaW4gaXRzIHJhbmdlLlxuICAgIHZhciBzcGxpdCA9IHNhd1JlYWRPbmx5U3BhbnMgJiYgIWlnbm9yZVJlYWRPbmx5ICYmIHJlbW92ZVJlYWRPbmx5UmFuZ2VzKGRvYywgY2hhbmdlLmZyb20sIGNoYW5nZS50byk7XG4gICAgaWYgKHNwbGl0KSB7XG4gICAgICBmb3IgKHZhciBpID0gc3BsaXQubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpXG4gICAgICAgIHsgbWFrZUNoYW5nZUlubmVyKGRvYywge2Zyb206IHNwbGl0W2ldLmZyb20sIHRvOiBzcGxpdFtpXS50bywgdGV4dDogaSA/IFtcIlwiXSA6IGNoYW5nZS50ZXh0LCBvcmlnaW46IGNoYW5nZS5vcmlnaW59KTsgfVxuICAgIH0gZWxzZSB7XG4gICAgICBtYWtlQ2hhbmdlSW5uZXIoZG9jLCBjaGFuZ2UpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG1ha2VDaGFuZ2VJbm5lcihkb2MsIGNoYW5nZSkge1xuICAgIGlmIChjaGFuZ2UudGV4dC5sZW5ndGggPT0gMSAmJiBjaGFuZ2UudGV4dFswXSA9PSBcIlwiICYmIGNtcChjaGFuZ2UuZnJvbSwgY2hhbmdlLnRvKSA9PSAwKSB7IHJldHVybiB9XG4gICAgdmFyIHNlbEFmdGVyID0gY29tcHV0ZVNlbEFmdGVyQ2hhbmdlKGRvYywgY2hhbmdlKTtcbiAgICBhZGRDaGFuZ2VUb0hpc3RvcnkoZG9jLCBjaGFuZ2UsIHNlbEFmdGVyLCBkb2MuY20gPyBkb2MuY20uY3VyT3AuaWQgOiBOYU4pO1xuXG4gICAgbWFrZUNoYW5nZVNpbmdsZURvYyhkb2MsIGNoYW5nZSwgc2VsQWZ0ZXIsIHN0cmV0Y2hTcGFuc092ZXJDaGFuZ2UoZG9jLCBjaGFuZ2UpKTtcbiAgICB2YXIgcmViYXNlZCA9IFtdO1xuXG4gICAgbGlua2VkRG9jcyhkb2MsIGZ1bmN0aW9uIChkb2MsIHNoYXJlZEhpc3QpIHtcbiAgICAgIGlmICghc2hhcmVkSGlzdCAmJiBpbmRleE9mKHJlYmFzZWQsIGRvYy5oaXN0b3J5KSA9PSAtMSkge1xuICAgICAgICByZWJhc2VIaXN0KGRvYy5oaXN0b3J5LCBjaGFuZ2UpO1xuICAgICAgICByZWJhc2VkLnB1c2goZG9jLmhpc3RvcnkpO1xuICAgICAgfVxuICAgICAgbWFrZUNoYW5nZVNpbmdsZURvYyhkb2MsIGNoYW5nZSwgbnVsbCwgc3RyZXRjaFNwYW5zT3ZlckNoYW5nZShkb2MsIGNoYW5nZSkpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gUmV2ZXJ0IGEgY2hhbmdlIHN0b3JlZCBpbiBhIGRvY3VtZW50J3MgaGlzdG9yeS5cbiAgZnVuY3Rpb24gbWFrZUNoYW5nZUZyb21IaXN0b3J5KGRvYywgdHlwZSwgYWxsb3dTZWxlY3Rpb25Pbmx5KSB7XG4gICAgdmFyIHN1cHByZXNzID0gZG9jLmNtICYmIGRvYy5jbS5zdGF0ZS5zdXBwcmVzc0VkaXRzO1xuICAgIGlmIChzdXBwcmVzcyAmJiAhYWxsb3dTZWxlY3Rpb25Pbmx5KSB7IHJldHVybiB9XG5cbiAgICB2YXIgaGlzdCA9IGRvYy5oaXN0b3J5LCBldmVudCwgc2VsQWZ0ZXIgPSBkb2Muc2VsO1xuICAgIHZhciBzb3VyY2UgPSB0eXBlID09IFwidW5kb1wiID8gaGlzdC5kb25lIDogaGlzdC51bmRvbmUsIGRlc3QgPSB0eXBlID09IFwidW5kb1wiID8gaGlzdC51bmRvbmUgOiBoaXN0LmRvbmU7XG5cbiAgICAvLyBWZXJpZnkgdGhhdCB0aGVyZSBpcyBhIHVzZWFibGUgZXZlbnQgKHNvIHRoYXQgY3RybC16IHdvbid0XG4gICAgLy8gbmVlZGxlc3NseSBjbGVhciBzZWxlY3Rpb24gZXZlbnRzKVxuICAgIHZhciBpID0gMDtcbiAgICBmb3IgKDsgaSA8IHNvdXJjZS5sZW5ndGg7IGkrKykge1xuICAgICAgZXZlbnQgPSBzb3VyY2VbaV07XG4gICAgICBpZiAoYWxsb3dTZWxlY3Rpb25Pbmx5ID8gZXZlbnQucmFuZ2VzICYmICFldmVudC5lcXVhbHMoZG9jLnNlbCkgOiAhZXZlbnQucmFuZ2VzKVxuICAgICAgICB7IGJyZWFrIH1cbiAgICB9XG4gICAgaWYgKGkgPT0gc291cmNlLmxlbmd0aCkgeyByZXR1cm4gfVxuICAgIGhpc3QubGFzdE9yaWdpbiA9IGhpc3QubGFzdFNlbE9yaWdpbiA9IG51bGw7XG5cbiAgICBmb3IgKDs7KSB7XG4gICAgICBldmVudCA9IHNvdXJjZS5wb3AoKTtcbiAgICAgIGlmIChldmVudC5yYW5nZXMpIHtcbiAgICAgICAgcHVzaFNlbGVjdGlvblRvSGlzdG9yeShldmVudCwgZGVzdCk7XG4gICAgICAgIGlmIChhbGxvd1NlbGVjdGlvbk9ubHkgJiYgIWV2ZW50LmVxdWFscyhkb2Muc2VsKSkge1xuICAgICAgICAgIHNldFNlbGVjdGlvbihkb2MsIGV2ZW50LCB7Y2xlYXJSZWRvOiBmYWxzZX0pO1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIHNlbEFmdGVyID0gZXZlbnQ7XG4gICAgICB9IGVsc2UgaWYgKHN1cHByZXNzKSB7XG4gICAgICAgIHNvdXJjZS5wdXNoKGV2ZW50KTtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9IGVsc2UgeyBicmVhayB9XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgdXAgYSByZXZlcnNlIGNoYW5nZSBvYmplY3QgdG8gYWRkIHRvIHRoZSBvcHBvc2l0ZSBoaXN0b3J5XG4gICAgLy8gc3RhY2sgKHJlZG8gd2hlbiB1bmRvaW5nLCBhbmQgdmljZSB2ZXJzYSkuXG4gICAgdmFyIGFudGlDaGFuZ2VzID0gW107XG4gICAgcHVzaFNlbGVjdGlvblRvSGlzdG9yeShzZWxBZnRlciwgZGVzdCk7XG4gICAgZGVzdC5wdXNoKHtjaGFuZ2VzOiBhbnRpQ2hhbmdlcywgZ2VuZXJhdGlvbjogaGlzdC5nZW5lcmF0aW9ufSk7XG4gICAgaGlzdC5nZW5lcmF0aW9uID0gZXZlbnQuZ2VuZXJhdGlvbiB8fCArK2hpc3QubWF4R2VuZXJhdGlvbjtcblxuICAgIHZhciBmaWx0ZXIgPSBoYXNIYW5kbGVyKGRvYywgXCJiZWZvcmVDaGFuZ2VcIikgfHwgZG9jLmNtICYmIGhhc0hhbmRsZXIoZG9jLmNtLCBcImJlZm9yZUNoYW5nZVwiKTtcblxuICAgIHZhciBsb29wID0gZnVuY3Rpb24gKCBpICkge1xuICAgICAgdmFyIGNoYW5nZSA9IGV2ZW50LmNoYW5nZXNbaV07XG4gICAgICBjaGFuZ2Uub3JpZ2luID0gdHlwZTtcbiAgICAgIGlmIChmaWx0ZXIgJiYgIWZpbHRlckNoYW5nZShkb2MsIGNoYW5nZSwgZmFsc2UpKSB7XG4gICAgICAgIHNvdXJjZS5sZW5ndGggPSAwO1xuICAgICAgICByZXR1cm4ge31cbiAgICAgIH1cblxuICAgICAgYW50aUNoYW5nZXMucHVzaChoaXN0b3J5Q2hhbmdlRnJvbUNoYW5nZShkb2MsIGNoYW5nZSkpO1xuXG4gICAgICB2YXIgYWZ0ZXIgPSBpID8gY29tcHV0ZVNlbEFmdGVyQ2hhbmdlKGRvYywgY2hhbmdlKSA6IGxzdChzb3VyY2UpO1xuICAgICAgbWFrZUNoYW5nZVNpbmdsZURvYyhkb2MsIGNoYW5nZSwgYWZ0ZXIsIG1lcmdlT2xkU3BhbnMoZG9jLCBjaGFuZ2UpKTtcbiAgICAgIGlmICghaSAmJiBkb2MuY20pIHsgZG9jLmNtLnNjcm9sbEludG9WaWV3KHtmcm9tOiBjaGFuZ2UuZnJvbSwgdG86IGNoYW5nZUVuZChjaGFuZ2UpfSk7IH1cbiAgICAgIHZhciByZWJhc2VkID0gW107XG5cbiAgICAgIC8vIFByb3BhZ2F0ZSB0byB0aGUgbGlua2VkIGRvY3VtZW50c1xuICAgICAgbGlua2VkRG9jcyhkb2MsIGZ1bmN0aW9uIChkb2MsIHNoYXJlZEhpc3QpIHtcbiAgICAgICAgaWYgKCFzaGFyZWRIaXN0ICYmIGluZGV4T2YocmViYXNlZCwgZG9jLmhpc3RvcnkpID09IC0xKSB7XG4gICAgICAgICAgcmViYXNlSGlzdChkb2MuaGlzdG9yeSwgY2hhbmdlKTtcbiAgICAgICAgICByZWJhc2VkLnB1c2goZG9jLmhpc3RvcnkpO1xuICAgICAgICB9XG4gICAgICAgIG1ha2VDaGFuZ2VTaW5nbGVEb2MoZG9jLCBjaGFuZ2UsIG51bGwsIG1lcmdlT2xkU3BhbnMoZG9jLCBjaGFuZ2UpKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBmb3IgKHZhciBpJDEgPSBldmVudC5jaGFuZ2VzLmxlbmd0aCAtIDE7IGkkMSA+PSAwOyAtLWkkMSkge1xuICAgICAgdmFyIHJldHVybmVkID0gbG9vcCggaSQxICk7XG5cbiAgICAgIGlmICggcmV0dXJuZWQgKSByZXR1cm4gcmV0dXJuZWQudjtcbiAgICB9XG4gIH1cblxuICAvLyBTdWItdmlld3MgbmVlZCB0aGVpciBsaW5lIG51bWJlcnMgc2hpZnRlZCB3aGVuIHRleHQgaXMgYWRkZWRcbiAgLy8gYWJvdmUgb3IgYmVsb3cgdGhlbSBpbiB0aGUgcGFyZW50IGRvY3VtZW50LlxuICBmdW5jdGlvbiBzaGlmdERvYyhkb2MsIGRpc3RhbmNlKSB7XG4gICAgaWYgKGRpc3RhbmNlID09IDApIHsgcmV0dXJuIH1cbiAgICBkb2MuZmlyc3QgKz0gZGlzdGFuY2U7XG4gICAgZG9jLnNlbCA9IG5ldyBTZWxlY3Rpb24obWFwKGRvYy5zZWwucmFuZ2VzLCBmdW5jdGlvbiAocmFuZ2UpIHsgcmV0dXJuIG5ldyBSYW5nZShcbiAgICAgIFBvcyhyYW5nZS5hbmNob3IubGluZSArIGRpc3RhbmNlLCByYW5nZS5hbmNob3IuY2gpLFxuICAgICAgUG9zKHJhbmdlLmhlYWQubGluZSArIGRpc3RhbmNlLCByYW5nZS5oZWFkLmNoKVxuICAgICk7IH0pLCBkb2Muc2VsLnByaW1JbmRleCk7XG4gICAgaWYgKGRvYy5jbSkge1xuICAgICAgcmVnQ2hhbmdlKGRvYy5jbSwgZG9jLmZpcnN0LCBkb2MuZmlyc3QgLSBkaXN0YW5jZSwgZGlzdGFuY2UpO1xuICAgICAgZm9yICh2YXIgZCA9IGRvYy5jbS5kaXNwbGF5LCBsID0gZC52aWV3RnJvbTsgbCA8IGQudmlld1RvOyBsKyspXG4gICAgICAgIHsgcmVnTGluZUNoYW5nZShkb2MuY20sIGwsIFwiZ3V0dGVyXCIpOyB9XG4gICAgfVxuICB9XG5cbiAgLy8gTW9yZSBsb3dlci1sZXZlbCBjaGFuZ2UgZnVuY3Rpb24sIGhhbmRsaW5nIG9ubHkgYSBzaW5nbGUgZG9jdW1lbnRcbiAgLy8gKG5vdCBsaW5rZWQgb25lcykuXG4gIGZ1bmN0aW9uIG1ha2VDaGFuZ2VTaW5nbGVEb2MoZG9jLCBjaGFuZ2UsIHNlbEFmdGVyLCBzcGFucykge1xuICAgIGlmIChkb2MuY20gJiYgIWRvYy5jbS5jdXJPcClcbiAgICAgIHsgcmV0dXJuIG9wZXJhdGlvbihkb2MuY20sIG1ha2VDaGFuZ2VTaW5nbGVEb2MpKGRvYywgY2hhbmdlLCBzZWxBZnRlciwgc3BhbnMpIH1cblxuICAgIGlmIChjaGFuZ2UudG8ubGluZSA8IGRvYy5maXJzdCkge1xuICAgICAgc2hpZnREb2MoZG9jLCBjaGFuZ2UudGV4dC5sZW5ndGggLSAxIC0gKGNoYW5nZS50by5saW5lIC0gY2hhbmdlLmZyb20ubGluZSkpO1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChjaGFuZ2UuZnJvbS5saW5lID4gZG9jLmxhc3RMaW5lKCkpIHsgcmV0dXJuIH1cblxuICAgIC8vIENsaXAgdGhlIGNoYW5nZSB0byB0aGUgc2l6ZSBvZiB0aGlzIGRvY1xuICAgIGlmIChjaGFuZ2UuZnJvbS5saW5lIDwgZG9jLmZpcnN0KSB7XG4gICAgICB2YXIgc2hpZnQgPSBjaGFuZ2UudGV4dC5sZW5ndGggLSAxIC0gKGRvYy5maXJzdCAtIGNoYW5nZS5mcm9tLmxpbmUpO1xuICAgICAgc2hpZnREb2MoZG9jLCBzaGlmdCk7XG4gICAgICBjaGFuZ2UgPSB7ZnJvbTogUG9zKGRvYy5maXJzdCwgMCksIHRvOiBQb3MoY2hhbmdlLnRvLmxpbmUgKyBzaGlmdCwgY2hhbmdlLnRvLmNoKSxcbiAgICAgICAgICAgICAgICB0ZXh0OiBbbHN0KGNoYW5nZS50ZXh0KV0sIG9yaWdpbjogY2hhbmdlLm9yaWdpbn07XG4gICAgfVxuICAgIHZhciBsYXN0ID0gZG9jLmxhc3RMaW5lKCk7XG4gICAgaWYgKGNoYW5nZS50by5saW5lID4gbGFzdCkge1xuICAgICAgY2hhbmdlID0ge2Zyb206IGNoYW5nZS5mcm9tLCB0bzogUG9zKGxhc3QsIGdldExpbmUoZG9jLCBsYXN0KS50ZXh0Lmxlbmd0aCksXG4gICAgICAgICAgICAgICAgdGV4dDogW2NoYW5nZS50ZXh0WzBdXSwgb3JpZ2luOiBjaGFuZ2Uub3JpZ2lufTtcbiAgICB9XG5cbiAgICBjaGFuZ2UucmVtb3ZlZCA9IGdldEJldHdlZW4oZG9jLCBjaGFuZ2UuZnJvbSwgY2hhbmdlLnRvKTtcblxuICAgIGlmICghc2VsQWZ0ZXIpIHsgc2VsQWZ0ZXIgPSBjb21wdXRlU2VsQWZ0ZXJDaGFuZ2UoZG9jLCBjaGFuZ2UpOyB9XG4gICAgaWYgKGRvYy5jbSkgeyBtYWtlQ2hhbmdlU2luZ2xlRG9jSW5FZGl0b3IoZG9jLmNtLCBjaGFuZ2UsIHNwYW5zKTsgfVxuICAgIGVsc2UgeyB1cGRhdGVEb2MoZG9jLCBjaGFuZ2UsIHNwYW5zKTsgfVxuICAgIHNldFNlbGVjdGlvbk5vVW5kbyhkb2MsIHNlbEFmdGVyLCBzZWxfZG9udFNjcm9sbCk7XG5cbiAgICBpZiAoZG9jLmNhbnRFZGl0ICYmIHNraXBBdG9taWMoZG9jLCBQb3MoZG9jLmZpcnN0TGluZSgpLCAwKSkpXG4gICAgICB7IGRvYy5jYW50RWRpdCA9IGZhbHNlOyB9XG4gIH1cblxuICAvLyBIYW5kbGUgdGhlIGludGVyYWN0aW9uIG9mIGEgY2hhbmdlIHRvIGEgZG9jdW1lbnQgd2l0aCB0aGUgZWRpdG9yXG4gIC8vIHRoYXQgdGhpcyBkb2N1bWVudCBpcyBwYXJ0IG9mLlxuICBmdW5jdGlvbiBtYWtlQ2hhbmdlU2luZ2xlRG9jSW5FZGl0b3IoY20sIGNoYW5nZSwgc3BhbnMpIHtcbiAgICB2YXIgZG9jID0gY20uZG9jLCBkaXNwbGF5ID0gY20uZGlzcGxheSwgZnJvbSA9IGNoYW5nZS5mcm9tLCB0byA9IGNoYW5nZS50bztcblxuICAgIHZhciByZWNvbXB1dGVNYXhMZW5ndGggPSBmYWxzZSwgY2hlY2tXaWR0aFN0YXJ0ID0gZnJvbS5saW5lO1xuICAgIGlmICghY20ub3B0aW9ucy5saW5lV3JhcHBpbmcpIHtcbiAgICAgIGNoZWNrV2lkdGhTdGFydCA9IGxpbmVObyh2aXN1YWxMaW5lKGdldExpbmUoZG9jLCBmcm9tLmxpbmUpKSk7XG4gICAgICBkb2MuaXRlcihjaGVja1dpZHRoU3RhcnQsIHRvLmxpbmUgKyAxLCBmdW5jdGlvbiAobGluZSkge1xuICAgICAgICBpZiAobGluZSA9PSBkaXNwbGF5Lm1heExpbmUpIHtcbiAgICAgICAgICByZWNvbXB1dGVNYXhMZW5ndGggPSB0cnVlO1xuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChkb2Muc2VsLmNvbnRhaW5zKGNoYW5nZS5mcm9tLCBjaGFuZ2UudG8pID4gLTEpXG4gICAgICB7IHNpZ25hbEN1cnNvckFjdGl2aXR5KGNtKTsgfVxuXG4gICAgdXBkYXRlRG9jKGRvYywgY2hhbmdlLCBzcGFucywgZXN0aW1hdGVIZWlnaHQoY20pKTtcblxuICAgIGlmICghY20ub3B0aW9ucy5saW5lV3JhcHBpbmcpIHtcbiAgICAgIGRvYy5pdGVyKGNoZWNrV2lkdGhTdGFydCwgZnJvbS5saW5lICsgY2hhbmdlLnRleHQubGVuZ3RoLCBmdW5jdGlvbiAobGluZSkge1xuICAgICAgICB2YXIgbGVuID0gbGluZUxlbmd0aChsaW5lKTtcbiAgICAgICAgaWYgKGxlbiA+IGRpc3BsYXkubWF4TGluZUxlbmd0aCkge1xuICAgICAgICAgIGRpc3BsYXkubWF4TGluZSA9IGxpbmU7XG4gICAgICAgICAgZGlzcGxheS5tYXhMaW5lTGVuZ3RoID0gbGVuO1xuICAgICAgICAgIGRpc3BsYXkubWF4TGluZUNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgIHJlY29tcHV0ZU1heExlbmd0aCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmIChyZWNvbXB1dGVNYXhMZW5ndGgpIHsgY20uY3VyT3AudXBkYXRlTWF4TGluZSA9IHRydWU7IH1cbiAgICB9XG5cbiAgICByZXRyZWF0RnJvbnRpZXIoZG9jLCBmcm9tLmxpbmUpO1xuICAgIHN0YXJ0V29ya2VyKGNtLCA0MDApO1xuXG4gICAgdmFyIGxlbmRpZmYgPSBjaGFuZ2UudGV4dC5sZW5ndGggLSAodG8ubGluZSAtIGZyb20ubGluZSkgLSAxO1xuICAgIC8vIFJlbWVtYmVyIHRoYXQgdGhlc2UgbGluZXMgY2hhbmdlZCwgZm9yIHVwZGF0aW5nIHRoZSBkaXNwbGF5XG4gICAgaWYgKGNoYW5nZS5mdWxsKVxuICAgICAgeyByZWdDaGFuZ2UoY20pOyB9XG4gICAgZWxzZSBpZiAoZnJvbS5saW5lID09IHRvLmxpbmUgJiYgY2hhbmdlLnRleHQubGVuZ3RoID09IDEgJiYgIWlzV2hvbGVMaW5lVXBkYXRlKGNtLmRvYywgY2hhbmdlKSlcbiAgICAgIHsgcmVnTGluZUNoYW5nZShjbSwgZnJvbS5saW5lLCBcInRleHRcIik7IH1cbiAgICBlbHNlXG4gICAgICB7IHJlZ0NoYW5nZShjbSwgZnJvbS5saW5lLCB0by5saW5lICsgMSwgbGVuZGlmZik7IH1cblxuICAgIHZhciBjaGFuZ2VzSGFuZGxlciA9IGhhc0hhbmRsZXIoY20sIFwiY2hhbmdlc1wiKSwgY2hhbmdlSGFuZGxlciA9IGhhc0hhbmRsZXIoY20sIFwiY2hhbmdlXCIpO1xuICAgIGlmIChjaGFuZ2VIYW5kbGVyIHx8IGNoYW5nZXNIYW5kbGVyKSB7XG4gICAgICB2YXIgb2JqID0ge1xuICAgICAgICBmcm9tOiBmcm9tLCB0bzogdG8sXG4gICAgICAgIHRleHQ6IGNoYW5nZS50ZXh0LFxuICAgICAgICByZW1vdmVkOiBjaGFuZ2UucmVtb3ZlZCxcbiAgICAgICAgb3JpZ2luOiBjaGFuZ2Uub3JpZ2luXG4gICAgICB9O1xuICAgICAgaWYgKGNoYW5nZUhhbmRsZXIpIHsgc2lnbmFsTGF0ZXIoY20sIFwiY2hhbmdlXCIsIGNtLCBvYmopOyB9XG4gICAgICBpZiAoY2hhbmdlc0hhbmRsZXIpIHsgKGNtLmN1ck9wLmNoYW5nZU9ianMgfHwgKGNtLmN1ck9wLmNoYW5nZU9ianMgPSBbXSkpLnB1c2gob2JqKTsgfVxuICAgIH1cbiAgICBjbS5kaXNwbGF5LnNlbEZvckNvbnRleHRNZW51ID0gbnVsbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlcGxhY2VSYW5nZShkb2MsIGNvZGUsIGZyb20sIHRvLCBvcmlnaW4pIHtcbiAgICB2YXIgYXNzaWduO1xuXG4gICAgaWYgKCF0bykgeyB0byA9IGZyb207IH1cbiAgICBpZiAoY21wKHRvLCBmcm9tKSA8IDApIHsgKGFzc2lnbiA9IFt0bywgZnJvbV0sIGZyb20gPSBhc3NpZ25bMF0sIHRvID0gYXNzaWduWzFdKTsgfVxuICAgIGlmICh0eXBlb2YgY29kZSA9PSBcInN0cmluZ1wiKSB7IGNvZGUgPSBkb2Muc3BsaXRMaW5lcyhjb2RlKTsgfVxuICAgIG1ha2VDaGFuZ2UoZG9jLCB7ZnJvbTogZnJvbSwgdG86IHRvLCB0ZXh0OiBjb2RlLCBvcmlnaW46IG9yaWdpbn0pO1xuICB9XG5cbiAgLy8gUmViYXNpbmcvcmVzZXR0aW5nIGhpc3RvcnkgdG8gZGVhbCB3aXRoIGV4dGVybmFsbHktc291cmNlZCBjaGFuZ2VzXG5cbiAgZnVuY3Rpb24gcmViYXNlSGlzdFNlbFNpbmdsZShwb3MsIGZyb20sIHRvLCBkaWZmKSB7XG4gICAgaWYgKHRvIDwgcG9zLmxpbmUpIHtcbiAgICAgIHBvcy5saW5lICs9IGRpZmY7XG4gICAgfSBlbHNlIGlmIChmcm9tIDwgcG9zLmxpbmUpIHtcbiAgICAgIHBvcy5saW5lID0gZnJvbTtcbiAgICAgIHBvcy5jaCA9IDA7XG4gICAgfVxuICB9XG5cbiAgLy8gVHJpZXMgdG8gcmViYXNlIGFuIGFycmF5IG9mIGhpc3RvcnkgZXZlbnRzIGdpdmVuIGEgY2hhbmdlIGluIHRoZVxuICAvLyBkb2N1bWVudC4gSWYgdGhlIGNoYW5nZSB0b3VjaGVzIHRoZSBzYW1lIGxpbmVzIGFzIHRoZSBldmVudCwgdGhlXG4gIC8vIGV2ZW50LCBhbmQgZXZlcnl0aGluZyAnYmVoaW5kJyBpdCwgaXMgZGlzY2FyZGVkLiBJZiB0aGUgY2hhbmdlIGlzXG4gIC8vIGJlZm9yZSB0aGUgZXZlbnQsIHRoZSBldmVudCdzIHBvc2l0aW9ucyBhcmUgdXBkYXRlZC4gVXNlcyBhXG4gIC8vIGNvcHktb24td3JpdGUgc2NoZW1lIGZvciB0aGUgcG9zaXRpb25zLCB0byBhdm9pZCBoYXZpbmcgdG9cbiAgLy8gcmVhbGxvY2F0ZSB0aGVtIGFsbCBvbiBldmVyeSByZWJhc2UsIGJ1dCBhbHNvIGF2b2lkIHByb2JsZW1zIHdpdGhcbiAgLy8gc2hhcmVkIHBvc2l0aW9uIG9iamVjdHMgYmVpbmcgdW5zYWZlbHkgdXBkYXRlZC5cbiAgZnVuY3Rpb24gcmViYXNlSGlzdEFycmF5KGFycmF5LCBmcm9tLCB0bywgZGlmZikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBzdWIgPSBhcnJheVtpXSwgb2sgPSB0cnVlO1xuICAgICAgaWYgKHN1Yi5yYW5nZXMpIHtcbiAgICAgICAgaWYgKCFzdWIuY29waWVkKSB7IHN1YiA9IGFycmF5W2ldID0gc3ViLmRlZXBDb3B5KCk7IHN1Yi5jb3BpZWQgPSB0cnVlOyB9XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc3ViLnJhbmdlcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgIHJlYmFzZUhpc3RTZWxTaW5nbGUoc3ViLnJhbmdlc1tqXS5hbmNob3IsIGZyb20sIHRvLCBkaWZmKTtcbiAgICAgICAgICByZWJhc2VIaXN0U2VsU2luZ2xlKHN1Yi5yYW5nZXNbal0uaGVhZCwgZnJvbSwgdG8sIGRpZmYpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBmb3IgKHZhciBqJDEgPSAwOyBqJDEgPCBzdWIuY2hhbmdlcy5sZW5ndGg7ICsraiQxKSB7XG4gICAgICAgIHZhciBjdXIgPSBzdWIuY2hhbmdlc1tqJDFdO1xuICAgICAgICBpZiAodG8gPCBjdXIuZnJvbS5saW5lKSB7XG4gICAgICAgICAgY3VyLmZyb20gPSBQb3MoY3VyLmZyb20ubGluZSArIGRpZmYsIGN1ci5mcm9tLmNoKTtcbiAgICAgICAgICBjdXIudG8gPSBQb3MoY3VyLnRvLmxpbmUgKyBkaWZmLCBjdXIudG8uY2gpO1xuICAgICAgICB9IGVsc2UgaWYgKGZyb20gPD0gY3VyLnRvLmxpbmUpIHtcbiAgICAgICAgICBvayA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghb2spIHtcbiAgICAgICAgYXJyYXkuc3BsaWNlKDAsIGkgKyAxKTtcbiAgICAgICAgaSA9IDA7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmViYXNlSGlzdChoaXN0LCBjaGFuZ2UpIHtcbiAgICB2YXIgZnJvbSA9IGNoYW5nZS5mcm9tLmxpbmUsIHRvID0gY2hhbmdlLnRvLmxpbmUsIGRpZmYgPSBjaGFuZ2UudGV4dC5sZW5ndGggLSAodG8gLSBmcm9tKSAtIDE7XG4gICAgcmViYXNlSGlzdEFycmF5KGhpc3QuZG9uZSwgZnJvbSwgdG8sIGRpZmYpO1xuICAgIHJlYmFzZUhpc3RBcnJheShoaXN0LnVuZG9uZSwgZnJvbSwgdG8sIGRpZmYpO1xuICB9XG5cbiAgLy8gVXRpbGl0eSBmb3IgYXBwbHlpbmcgYSBjaGFuZ2UgdG8gYSBsaW5lIGJ5IGhhbmRsZSBvciBudW1iZXIsXG4gIC8vIHJldHVybmluZyB0aGUgbnVtYmVyIGFuZCBvcHRpb25hbGx5IHJlZ2lzdGVyaW5nIHRoZSBsaW5lIGFzXG4gIC8vIGNoYW5nZWQuXG4gIGZ1bmN0aW9uIGNoYW5nZUxpbmUoZG9jLCBoYW5kbGUsIGNoYW5nZVR5cGUsIG9wKSB7XG4gICAgdmFyIG5vID0gaGFuZGxlLCBsaW5lID0gaGFuZGxlO1xuICAgIGlmICh0eXBlb2YgaGFuZGxlID09IFwibnVtYmVyXCIpIHsgbGluZSA9IGdldExpbmUoZG9jLCBjbGlwTGluZShkb2MsIGhhbmRsZSkpOyB9XG4gICAgZWxzZSB7IG5vID0gbGluZU5vKGhhbmRsZSk7IH1cbiAgICBpZiAobm8gPT0gbnVsbCkgeyByZXR1cm4gbnVsbCB9XG4gICAgaWYgKG9wKGxpbmUsIG5vKSAmJiBkb2MuY20pIHsgcmVnTGluZUNoYW5nZShkb2MuY20sIG5vLCBjaGFuZ2VUeXBlKTsgfVxuICAgIHJldHVybiBsaW5lXG4gIH1cblxuICAvLyBUaGUgZG9jdW1lbnQgaXMgcmVwcmVzZW50ZWQgYXMgYSBCVHJlZSBjb25zaXN0aW5nIG9mIGxlYXZlcywgd2l0aFxuICAvLyBjaHVuayBvZiBsaW5lcyBpbiB0aGVtLCBhbmQgYnJhbmNoZXMsIHdpdGggdXAgdG8gdGVuIGxlYXZlcyBvclxuICAvLyBvdGhlciBicmFuY2ggbm9kZXMgYmVsb3cgdGhlbS4gVGhlIHRvcCBub2RlIGlzIGFsd2F5cyBhIGJyYW5jaFxuICAvLyBub2RlLCBhbmQgaXMgdGhlIGRvY3VtZW50IG9iamVjdCBpdHNlbGYgKG1lYW5pbmcgaXQgaGFzXG4gIC8vIGFkZGl0aW9uYWwgbWV0aG9kcyBhbmQgcHJvcGVydGllcykuXG4gIC8vXG4gIC8vIEFsbCBub2RlcyBoYXZlIHBhcmVudCBsaW5rcy4gVGhlIHRyZWUgaXMgdXNlZCBib3RoIHRvIGdvIGZyb21cbiAgLy8gbGluZSBudW1iZXJzIHRvIGxpbmUgb2JqZWN0cywgYW5kIHRvIGdvIGZyb20gb2JqZWN0cyB0byBudW1iZXJzLlxuICAvLyBJdCBhbHNvIGluZGV4ZXMgYnkgaGVpZ2h0LCBhbmQgaXMgdXNlZCB0byBjb252ZXJ0IGJldHdlZW4gaGVpZ2h0XG4gIC8vIGFuZCBsaW5lIG9iamVjdCwgYW5kIHRvIGZpbmQgdGhlIHRvdGFsIGhlaWdodCBvZiB0aGUgZG9jdW1lbnQuXG4gIC8vXG4gIC8vIFNlZSBhbHNvIGh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvYmxvZy9jb2RlbWlycm9yLWxpbmUtdHJlZS5odG1sXG5cbiAgZnVuY3Rpb24gTGVhZkNodW5rKGxpbmVzKSB7XG4gICAgdGhpcy5saW5lcyA9IGxpbmVzO1xuICAgIHRoaXMucGFyZW50ID0gbnVsbDtcbiAgICB2YXIgaGVpZ2h0ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgKytpKSB7XG4gICAgICBsaW5lc1tpXS5wYXJlbnQgPSB0aGlzO1xuICAgICAgaGVpZ2h0ICs9IGxpbmVzW2ldLmhlaWdodDtcbiAgICB9XG4gICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gIH1cblxuICBMZWFmQ2h1bmsucHJvdG90eXBlID0ge1xuICAgIGNodW5rU2l6ZTogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLmxpbmVzLmxlbmd0aCB9LFxuXG4gICAgLy8gUmVtb3ZlIHRoZSBuIGxpbmVzIGF0IG9mZnNldCAnYXQnLlxuICAgIHJlbW92ZUlubmVyOiBmdW5jdGlvbihhdCwgbikge1xuICAgICAgZm9yICh2YXIgaSA9IGF0LCBlID0gYXQgKyBuOyBpIDwgZTsgKytpKSB7XG4gICAgICAgIHZhciBsaW5lID0gdGhpcy5saW5lc1tpXTtcbiAgICAgICAgdGhpcy5oZWlnaHQgLT0gbGluZS5oZWlnaHQ7XG4gICAgICAgIGNsZWFuVXBMaW5lKGxpbmUpO1xuICAgICAgICBzaWduYWxMYXRlcihsaW5lLCBcImRlbGV0ZVwiKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubGluZXMuc3BsaWNlKGF0LCBuKTtcbiAgICB9LFxuXG4gICAgLy8gSGVscGVyIHVzZWQgdG8gY29sbGFwc2UgYSBzbWFsbCBicmFuY2ggaW50byBhIHNpbmdsZSBsZWFmLlxuICAgIGNvbGxhcHNlOiBmdW5jdGlvbihsaW5lcykge1xuICAgICAgbGluZXMucHVzaC5hcHBseShsaW5lcywgdGhpcy5saW5lcyk7XG4gICAgfSxcblxuICAgIC8vIEluc2VydCB0aGUgZ2l2ZW4gYXJyYXkgb2YgbGluZXMgYXQgb2Zmc2V0ICdhdCcsIGNvdW50IHRoZW0gYXNcbiAgICAvLyBoYXZpbmcgdGhlIGdpdmVuIGhlaWdodC5cbiAgICBpbnNlcnRJbm5lcjogZnVuY3Rpb24oYXQsIGxpbmVzLCBoZWlnaHQpIHtcbiAgICAgIHRoaXMuaGVpZ2h0ICs9IGhlaWdodDtcbiAgICAgIHRoaXMubGluZXMgPSB0aGlzLmxpbmVzLnNsaWNlKDAsIGF0KS5jb25jYXQobGluZXMpLmNvbmNhdCh0aGlzLmxpbmVzLnNsaWNlKGF0KSk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgKytpKSB7IGxpbmVzW2ldLnBhcmVudCA9IHRoaXM7IH1cbiAgICB9LFxuXG4gICAgLy8gVXNlZCB0byBpdGVyYXRlIG92ZXIgYSBwYXJ0IG9mIHRoZSB0cmVlLlxuICAgIGl0ZXJOOiBmdW5jdGlvbihhdCwgbiwgb3ApIHtcbiAgICAgIGZvciAodmFyIGUgPSBhdCArIG47IGF0IDwgZTsgKythdClcbiAgICAgICAgeyBpZiAob3AodGhpcy5saW5lc1thdF0pKSB7IHJldHVybiB0cnVlIH0gfVxuICAgIH1cbiAgfTtcblxuICBmdW5jdGlvbiBCcmFuY2hDaHVuayhjaGlsZHJlbikge1xuICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICB2YXIgc2l6ZSA9IDAsIGhlaWdodCA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIGNoID0gY2hpbGRyZW5baV07XG4gICAgICBzaXplICs9IGNoLmNodW5rU2l6ZSgpOyBoZWlnaHQgKz0gY2guaGVpZ2h0O1xuICAgICAgY2gucGFyZW50ID0gdGhpcztcbiAgICB9XG4gICAgdGhpcy5zaXplID0gc2l6ZTtcbiAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICB0aGlzLnBhcmVudCA9IG51bGw7XG4gIH1cblxuICBCcmFuY2hDaHVuay5wcm90b3R5cGUgPSB7XG4gICAgY2h1bmtTaXplOiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuc2l6ZSB9LFxuXG4gICAgcmVtb3ZlSW5uZXI6IGZ1bmN0aW9uKGF0LCBuKSB7XG4gICAgICB0aGlzLnNpemUgLT0gbjtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldLCBzeiA9IGNoaWxkLmNodW5rU2l6ZSgpO1xuICAgICAgICBpZiAoYXQgPCBzeikge1xuICAgICAgICAgIHZhciBybSA9IE1hdGgubWluKG4sIHN6IC0gYXQpLCBvbGRIZWlnaHQgPSBjaGlsZC5oZWlnaHQ7XG4gICAgICAgICAgY2hpbGQucmVtb3ZlSW5uZXIoYXQsIHJtKTtcbiAgICAgICAgICB0aGlzLmhlaWdodCAtPSBvbGRIZWlnaHQgLSBjaGlsZC5oZWlnaHQ7XG4gICAgICAgICAgaWYgKHN6ID09IHJtKSB7IHRoaXMuY2hpbGRyZW4uc3BsaWNlKGktLSwgMSk7IGNoaWxkLnBhcmVudCA9IG51bGw7IH1cbiAgICAgICAgICBpZiAoKG4gLT0gcm0pID09IDApIHsgYnJlYWsgfVxuICAgICAgICAgIGF0ID0gMDtcbiAgICAgICAgfSBlbHNlIHsgYXQgLT0gc3o7IH1cbiAgICAgIH1cbiAgICAgIC8vIElmIHRoZSByZXN1bHQgaXMgc21hbGxlciB0aGFuIDI1IGxpbmVzLCBlbnN1cmUgdGhhdCBpdCBpcyBhXG4gICAgICAvLyBzaW5nbGUgbGVhZiBub2RlLlxuICAgICAgaWYgKHRoaXMuc2l6ZSAtIG4gPCAyNSAmJlxuICAgICAgICAgICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA+IDEgfHwgISh0aGlzLmNoaWxkcmVuWzBdIGluc3RhbmNlb2YgTGVhZkNodW5rKSkpIHtcbiAgICAgICAgdmFyIGxpbmVzID0gW107XG4gICAgICAgIHRoaXMuY29sbGFwc2UobGluZXMpO1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gW25ldyBMZWFmQ2h1bmsobGluZXMpXTtcbiAgICAgICAgdGhpcy5jaGlsZHJlblswXS5wYXJlbnQgPSB0aGlzO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBjb2xsYXBzZTogZnVuY3Rpb24obGluZXMpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7ICsraSkgeyB0aGlzLmNoaWxkcmVuW2ldLmNvbGxhcHNlKGxpbmVzKTsgfVxuICAgIH0sXG5cbiAgICBpbnNlcnRJbm5lcjogZnVuY3Rpb24oYXQsIGxpbmVzLCBoZWlnaHQpIHtcbiAgICAgIHRoaXMuc2l6ZSArPSBsaW5lcy5sZW5ndGg7XG4gICAgICB0aGlzLmhlaWdodCArPSBoZWlnaHQ7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXSwgc3ogPSBjaGlsZC5jaHVua1NpemUoKTtcbiAgICAgICAgaWYgKGF0IDw9IHN6KSB7XG4gICAgICAgICAgY2hpbGQuaW5zZXJ0SW5uZXIoYXQsIGxpbmVzLCBoZWlnaHQpO1xuICAgICAgICAgIGlmIChjaGlsZC5saW5lcyAmJiBjaGlsZC5saW5lcy5sZW5ndGggPiA1MCkge1xuICAgICAgICAgICAgLy8gVG8gYXZvaWQgbWVtb3J5IHRocmFzaGluZyB3aGVuIGNoaWxkLmxpbmVzIGlzIGh1Z2UgKGUuZy4gZmlyc3QgdmlldyBvZiBhIGxhcmdlIGZpbGUpLCBpdCdzIG5ldmVyIHNwbGljZWQuXG4gICAgICAgICAgICAvLyBJbnN0ZWFkLCBzbWFsbCBzbGljZXMgYXJlIHRha2VuLiBUaGV5J3JlIHRha2VuIGluIG9yZGVyIGJlY2F1c2Ugc2VxdWVudGlhbCBtZW1vcnkgYWNjZXNzZXMgYXJlIGZhc3Rlc3QuXG4gICAgICAgICAgICB2YXIgcmVtYWluaW5nID0gY2hpbGQubGluZXMubGVuZ3RoICUgMjUgKyAyNTtcbiAgICAgICAgICAgIGZvciAodmFyIHBvcyA9IHJlbWFpbmluZzsgcG9zIDwgY2hpbGQubGluZXMubGVuZ3RoOykge1xuICAgICAgICAgICAgICB2YXIgbGVhZiA9IG5ldyBMZWFmQ2h1bmsoY2hpbGQubGluZXMuc2xpY2UocG9zLCBwb3MgKz0gMjUpKTtcbiAgICAgICAgICAgICAgY2hpbGQuaGVpZ2h0IC09IGxlYWYuaGVpZ2h0O1xuICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuLnNwbGljZSgrK2ksIDAsIGxlYWYpO1xuICAgICAgICAgICAgICBsZWFmLnBhcmVudCA9IHRoaXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaGlsZC5saW5lcyA9IGNoaWxkLmxpbmVzLnNsaWNlKDAsIHJlbWFpbmluZyk7XG4gICAgICAgICAgICB0aGlzLm1heWJlU3BpbGwoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBhdCAtPSBzejtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gV2hlbiBhIG5vZGUgaGFzIGdyb3duLCBjaGVjayB3aGV0aGVyIGl0IHNob3VsZCBiZSBzcGxpdC5cbiAgICBtYXliZVNwaWxsOiBmdW5jdGlvbigpIHtcbiAgICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA8PSAxMCkgeyByZXR1cm4gfVxuICAgICAgdmFyIG1lID0gdGhpcztcbiAgICAgIGRvIHtcbiAgICAgICAgdmFyIHNwaWxsZWQgPSBtZS5jaGlsZHJlbi5zcGxpY2UobWUuY2hpbGRyZW4ubGVuZ3RoIC0gNSwgNSk7XG4gICAgICAgIHZhciBzaWJsaW5nID0gbmV3IEJyYW5jaENodW5rKHNwaWxsZWQpO1xuICAgICAgICBpZiAoIW1lLnBhcmVudCkgeyAvLyBCZWNvbWUgdGhlIHBhcmVudCBub2RlXG4gICAgICAgICAgdmFyIGNvcHkgPSBuZXcgQnJhbmNoQ2h1bmsobWUuY2hpbGRyZW4pO1xuICAgICAgICAgIGNvcHkucGFyZW50ID0gbWU7XG4gICAgICAgICAgbWUuY2hpbGRyZW4gPSBbY29weSwgc2libGluZ107XG4gICAgICAgICAgbWUgPSBjb3B5O1xuICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWUuc2l6ZSAtPSBzaWJsaW5nLnNpemU7XG4gICAgICAgICAgbWUuaGVpZ2h0IC09IHNpYmxpbmcuaGVpZ2h0O1xuICAgICAgICAgIHZhciBteUluZGV4ID0gaW5kZXhPZihtZS5wYXJlbnQuY2hpbGRyZW4sIG1lKTtcbiAgICAgICAgICBtZS5wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKG15SW5kZXggKyAxLCAwLCBzaWJsaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBzaWJsaW5nLnBhcmVudCA9IG1lLnBhcmVudDtcbiAgICAgIH0gd2hpbGUgKG1lLmNoaWxkcmVuLmxlbmd0aCA+IDEwKVxuICAgICAgbWUucGFyZW50Lm1heWJlU3BpbGwoKTtcbiAgICB9LFxuXG4gICAgaXRlck46IGZ1bmN0aW9uKGF0LCBuLCBvcCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV0sIHN6ID0gY2hpbGQuY2h1bmtTaXplKCk7XG4gICAgICAgIGlmIChhdCA8IHN6KSB7XG4gICAgICAgICAgdmFyIHVzZWQgPSBNYXRoLm1pbihuLCBzeiAtIGF0KTtcbiAgICAgICAgICBpZiAoY2hpbGQuaXRlck4oYXQsIHVzZWQsIG9wKSkgeyByZXR1cm4gdHJ1ZSB9XG4gICAgICAgICAgaWYgKChuIC09IHVzZWQpID09IDApIHsgYnJlYWsgfVxuICAgICAgICAgIGF0ID0gMDtcbiAgICAgICAgfSBlbHNlIHsgYXQgLT0gc3o7IH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLy8gTGluZSB3aWRnZXRzIGFyZSBibG9jayBlbGVtZW50cyBkaXNwbGF5ZWQgYWJvdmUgb3IgYmVsb3cgYSBsaW5lLlxuXG4gIHZhciBMaW5lV2lkZ2V0ID0gZnVuY3Rpb24oZG9jLCBub2RlLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMpIHsgZm9yICh2YXIgb3B0IGluIG9wdGlvbnMpIHsgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkob3B0KSlcbiAgICAgIHsgdGhpc1tvcHRdID0gb3B0aW9uc1tvcHRdOyB9IH0gfVxuICAgIHRoaXMuZG9jID0gZG9jO1xuICAgIHRoaXMubm9kZSA9IG5vZGU7XG4gIH07XG5cbiAgTGluZVdpZGdldC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGNtID0gdGhpcy5kb2MuY20sIHdzID0gdGhpcy5saW5lLndpZGdldHMsIGxpbmUgPSB0aGlzLmxpbmUsIG5vID0gbGluZU5vKGxpbmUpO1xuICAgIGlmIChubyA9PSBudWxsIHx8ICF3cykgeyByZXR1cm4gfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd3MubGVuZ3RoOyArK2kpIHsgaWYgKHdzW2ldID09IHRoaXMpIHsgd3Muc3BsaWNlKGktLSwgMSk7IH0gfVxuICAgIGlmICghd3MubGVuZ3RoKSB7IGxpbmUud2lkZ2V0cyA9IG51bGw7IH1cbiAgICB2YXIgaGVpZ2h0ID0gd2lkZ2V0SGVpZ2h0KHRoaXMpO1xuICAgIHVwZGF0ZUxpbmVIZWlnaHQobGluZSwgTWF0aC5tYXgoMCwgbGluZS5oZWlnaHQgLSBoZWlnaHQpKTtcbiAgICBpZiAoY20pIHtcbiAgICAgIHJ1bkluT3AoY20sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYWRqdXN0U2Nyb2xsV2hlbkFib3ZlVmlzaWJsZShjbSwgbGluZSwgLWhlaWdodCk7XG4gICAgICAgIHJlZ0xpbmVDaGFuZ2UoY20sIG5vLCBcIndpZGdldFwiKTtcbiAgICAgIH0pO1xuICAgICAgc2lnbmFsTGF0ZXIoY20sIFwibGluZVdpZGdldENsZWFyZWRcIiwgY20sIHRoaXMsIG5vKTtcbiAgICB9XG4gIH07XG5cbiAgTGluZVdpZGdldC5wcm90b3R5cGUuY2hhbmdlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgdmFyIG9sZEggPSB0aGlzLmhlaWdodCwgY20gPSB0aGlzLmRvYy5jbSwgbGluZSA9IHRoaXMubGluZTtcbiAgICB0aGlzLmhlaWdodCA9IG51bGw7XG4gICAgdmFyIGRpZmYgPSB3aWRnZXRIZWlnaHQodGhpcykgLSBvbGRIO1xuICAgIGlmICghZGlmZikgeyByZXR1cm4gfVxuICAgIGlmICghbGluZUlzSGlkZGVuKHRoaXMuZG9jLCBsaW5lKSkgeyB1cGRhdGVMaW5lSGVpZ2h0KGxpbmUsIGxpbmUuaGVpZ2h0ICsgZGlmZik7IH1cbiAgICBpZiAoY20pIHtcbiAgICAgIHJ1bkluT3AoY20sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY20uY3VyT3AuZm9yY2VVcGRhdGUgPSB0cnVlO1xuICAgICAgICBhZGp1c3RTY3JvbGxXaGVuQWJvdmVWaXNpYmxlKGNtLCBsaW5lLCBkaWZmKTtcbiAgICAgICAgc2lnbmFsTGF0ZXIoY20sIFwibGluZVdpZGdldENoYW5nZWRcIiwgY20sIHRoaXMkMSwgbGluZU5vKGxpbmUpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgZXZlbnRNaXhpbihMaW5lV2lkZ2V0KTtcblxuICBmdW5jdGlvbiBhZGp1c3RTY3JvbGxXaGVuQWJvdmVWaXNpYmxlKGNtLCBsaW5lLCBkaWZmKSB7XG4gICAgaWYgKGhlaWdodEF0TGluZShsaW5lKSA8ICgoY20uY3VyT3AgJiYgY20uY3VyT3Auc2Nyb2xsVG9wKSB8fCBjbS5kb2Muc2Nyb2xsVG9wKSlcbiAgICAgIHsgYWRkVG9TY3JvbGxUb3AoY20sIGRpZmYpOyB9XG4gIH1cblxuICBmdW5jdGlvbiBhZGRMaW5lV2lkZ2V0KGRvYywgaGFuZGxlLCBub2RlLCBvcHRpb25zKSB7XG4gICAgdmFyIHdpZGdldCA9IG5ldyBMaW5lV2lkZ2V0KGRvYywgbm9kZSwgb3B0aW9ucyk7XG4gICAgdmFyIGNtID0gZG9jLmNtO1xuICAgIGlmIChjbSAmJiB3aWRnZXQubm9IU2Nyb2xsKSB7IGNtLmRpc3BsYXkuYWxpZ25XaWRnZXRzID0gdHJ1ZTsgfVxuICAgIGNoYW5nZUxpbmUoZG9jLCBoYW5kbGUsIFwid2lkZ2V0XCIsIGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgICB2YXIgd2lkZ2V0cyA9IGxpbmUud2lkZ2V0cyB8fCAobGluZS53aWRnZXRzID0gW10pO1xuICAgICAgaWYgKHdpZGdldC5pbnNlcnRBdCA9PSBudWxsKSB7IHdpZGdldHMucHVzaCh3aWRnZXQpOyB9XG4gICAgICBlbHNlIHsgd2lkZ2V0cy5zcGxpY2UoTWF0aC5taW4od2lkZ2V0cy5sZW5ndGgsIE1hdGgubWF4KDAsIHdpZGdldC5pbnNlcnRBdCkpLCAwLCB3aWRnZXQpOyB9XG4gICAgICB3aWRnZXQubGluZSA9IGxpbmU7XG4gICAgICBpZiAoY20gJiYgIWxpbmVJc0hpZGRlbihkb2MsIGxpbmUpKSB7XG4gICAgICAgIHZhciBhYm92ZVZpc2libGUgPSBoZWlnaHRBdExpbmUobGluZSkgPCBkb2Muc2Nyb2xsVG9wO1xuICAgICAgICB1cGRhdGVMaW5lSGVpZ2h0KGxpbmUsIGxpbmUuaGVpZ2h0ICsgd2lkZ2V0SGVpZ2h0KHdpZGdldCkpO1xuICAgICAgICBpZiAoYWJvdmVWaXNpYmxlKSB7IGFkZFRvU2Nyb2xsVG9wKGNtLCB3aWRnZXQuaGVpZ2h0KTsgfVxuICAgICAgICBjbS5jdXJPcC5mb3JjZVVwZGF0ZSA9IHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0pO1xuICAgIGlmIChjbSkgeyBzaWduYWxMYXRlcihjbSwgXCJsaW5lV2lkZ2V0QWRkZWRcIiwgY20sIHdpZGdldCwgdHlwZW9mIGhhbmRsZSA9PSBcIm51bWJlclwiID8gaGFuZGxlIDogbGluZU5vKGhhbmRsZSkpOyB9XG4gICAgcmV0dXJuIHdpZGdldFxuICB9XG5cbiAgLy8gVEVYVE1BUktFUlNcblxuICAvLyBDcmVhdGVkIHdpdGggbWFya1RleHQgYW5kIHNldEJvb2ttYXJrIG1ldGhvZHMuIEEgVGV4dE1hcmtlciBpcyBhXG4gIC8vIGhhbmRsZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGNsZWFyIG9yIGZpbmQgYSBtYXJrZWQgcG9zaXRpb24gaW4gdGhlXG4gIC8vIGRvY3VtZW50LiBMaW5lIG9iamVjdHMgaG9sZCBhcnJheXMgKG1hcmtlZFNwYW5zKSBjb250YWluaW5nXG4gIC8vIHtmcm9tLCB0bywgbWFya2VyfSBvYmplY3QgcG9pbnRpbmcgdG8gc3VjaCBtYXJrZXIgb2JqZWN0cywgYW5kXG4gIC8vIGluZGljYXRpbmcgdGhhdCBzdWNoIGEgbWFya2VyIGlzIHByZXNlbnQgb24gdGhhdCBsaW5lLiBNdWx0aXBsZVxuICAvLyBsaW5lcyBtYXkgcG9pbnQgdG8gdGhlIHNhbWUgbWFya2VyIHdoZW4gaXQgc3BhbnMgYWNyb3NzIGxpbmVzLlxuICAvLyBUaGUgc3BhbnMgd2lsbCBoYXZlIG51bGwgZm9yIHRoZWlyIGZyb20vdG8gcHJvcGVydGllcyB3aGVuIHRoZVxuICAvLyBtYXJrZXIgY29udGludWVzIGJleW9uZCB0aGUgc3RhcnQvZW5kIG9mIHRoZSBsaW5lLiBNYXJrZXJzIGhhdmVcbiAgLy8gbGlua3MgYmFjayB0byB0aGUgbGluZXMgdGhleSBjdXJyZW50bHkgdG91Y2guXG5cbiAgLy8gQ29sbGFwc2VkIG1hcmtlcnMgaGF2ZSB1bmlxdWUgaWRzLCBpbiBvcmRlciB0byBiZSBhYmxlIHRvIG9yZGVyXG4gIC8vIHRoZW0sIHdoaWNoIGlzIG5lZWRlZCBmb3IgdW5pcXVlbHkgZGV0ZXJtaW5pbmcgYW4gb3V0ZXIgbWFya2VyXG4gIC8vIHdoZW4gdGhleSBvdmVybGFwICh0aGV5IG1heSBuZXN0LCBidXQgbm90IHBhcnRpYWxseSBvdmVybGFwKS5cbiAgdmFyIG5leHRNYXJrZXJJZCA9IDA7XG5cbiAgdmFyIFRleHRNYXJrZXIgPSBmdW5jdGlvbihkb2MsIHR5cGUpIHtcbiAgICB0aGlzLmxpbmVzID0gW107XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB0aGlzLmRvYyA9IGRvYztcbiAgICB0aGlzLmlkID0gKytuZXh0TWFya2VySWQ7XG4gIH07XG5cbiAgLy8gQ2xlYXIgdGhlIG1hcmtlci5cbiAgVGV4dE1hcmtlci5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuZXhwbGljaXRseUNsZWFyZWQpIHsgcmV0dXJuIH1cbiAgICB2YXIgY20gPSB0aGlzLmRvYy5jbSwgd2l0aE9wID0gY20gJiYgIWNtLmN1ck9wO1xuICAgIGlmICh3aXRoT3ApIHsgc3RhcnRPcGVyYXRpb24oY20pOyB9XG4gICAgaWYgKGhhc0hhbmRsZXIodGhpcywgXCJjbGVhclwiKSkge1xuICAgICAgdmFyIGZvdW5kID0gdGhpcy5maW5kKCk7XG4gICAgICBpZiAoZm91bmQpIHsgc2lnbmFsTGF0ZXIodGhpcywgXCJjbGVhclwiLCBmb3VuZC5mcm9tLCBmb3VuZC50byk7IH1cbiAgICB9XG4gICAgdmFyIG1pbiA9IG51bGwsIG1heCA9IG51bGw7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxpbmVzLmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgbGluZSA9IHRoaXMubGluZXNbaV07XG4gICAgICB2YXIgc3BhbiA9IGdldE1hcmtlZFNwYW5Gb3IobGluZS5tYXJrZWRTcGFucywgdGhpcyk7XG4gICAgICBpZiAoY20gJiYgIXRoaXMuY29sbGFwc2VkKSB7IHJlZ0xpbmVDaGFuZ2UoY20sIGxpbmVObyhsaW5lKSwgXCJ0ZXh0XCIpOyB9XG4gICAgICBlbHNlIGlmIChjbSkge1xuICAgICAgICBpZiAoc3Bhbi50byAhPSBudWxsKSB7IG1heCA9IGxpbmVObyhsaW5lKTsgfVxuICAgICAgICBpZiAoc3Bhbi5mcm9tICE9IG51bGwpIHsgbWluID0gbGluZU5vKGxpbmUpOyB9XG4gICAgICB9XG4gICAgICBsaW5lLm1hcmtlZFNwYW5zID0gcmVtb3ZlTWFya2VkU3BhbihsaW5lLm1hcmtlZFNwYW5zLCBzcGFuKTtcbiAgICAgIGlmIChzcGFuLmZyb20gPT0gbnVsbCAmJiB0aGlzLmNvbGxhcHNlZCAmJiAhbGluZUlzSGlkZGVuKHRoaXMuZG9jLCBsaW5lKSAmJiBjbSlcbiAgICAgICAgeyB1cGRhdGVMaW5lSGVpZ2h0KGxpbmUsIHRleHRIZWlnaHQoY20uZGlzcGxheSkpOyB9XG4gICAgfVxuICAgIGlmIChjbSAmJiB0aGlzLmNvbGxhcHNlZCAmJiAhY20ub3B0aW9ucy5saW5lV3JhcHBpbmcpIHsgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgdGhpcy5saW5lcy5sZW5ndGg7ICsraSQxKSB7XG4gICAgICB2YXIgdmlzdWFsID0gdmlzdWFsTGluZSh0aGlzLmxpbmVzW2kkMV0pLCBsZW4gPSBsaW5lTGVuZ3RoKHZpc3VhbCk7XG4gICAgICBpZiAobGVuID4gY20uZGlzcGxheS5tYXhMaW5lTGVuZ3RoKSB7XG4gICAgICAgIGNtLmRpc3BsYXkubWF4TGluZSA9IHZpc3VhbDtcbiAgICAgICAgY20uZGlzcGxheS5tYXhMaW5lTGVuZ3RoID0gbGVuO1xuICAgICAgICBjbS5kaXNwbGF5Lm1heExpbmVDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IH1cblxuICAgIGlmIChtaW4gIT0gbnVsbCAmJiBjbSAmJiB0aGlzLmNvbGxhcHNlZCkgeyByZWdDaGFuZ2UoY20sIG1pbiwgbWF4ICsgMSk7IH1cbiAgICB0aGlzLmxpbmVzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5leHBsaWNpdGx5Q2xlYXJlZCA9IHRydWU7XG4gICAgaWYgKHRoaXMuYXRvbWljICYmIHRoaXMuZG9jLmNhbnRFZGl0KSB7XG4gICAgICB0aGlzLmRvYy5jYW50RWRpdCA9IGZhbHNlO1xuICAgICAgaWYgKGNtKSB7IHJlQ2hlY2tTZWxlY3Rpb24oY20uZG9jKTsgfVxuICAgIH1cbiAgICBpZiAoY20pIHsgc2lnbmFsTGF0ZXIoY20sIFwibWFya2VyQ2xlYXJlZFwiLCBjbSwgdGhpcywgbWluLCBtYXgpOyB9XG4gICAgaWYgKHdpdGhPcCkgeyBlbmRPcGVyYXRpb24oY20pOyB9XG4gICAgaWYgKHRoaXMucGFyZW50KSB7IHRoaXMucGFyZW50LmNsZWFyKCk7IH1cbiAgfTtcblxuICAvLyBGaW5kIHRoZSBwb3NpdGlvbiBvZiB0aGUgbWFya2VyIGluIHRoZSBkb2N1bWVudC4gUmV0dXJucyBhIHtmcm9tLFxuICAvLyB0b30gb2JqZWN0IGJ5IGRlZmF1bHQuIFNpZGUgY2FuIGJlIHBhc3NlZCB0byBnZXQgYSBzcGVjaWZpYyBzaWRlXG4gIC8vIC0tIDAgKGJvdGgpLCAtMSAobGVmdCksIG9yIDEgKHJpZ2h0KS4gV2hlbiBsaW5lT2JqIGlzIHRydWUsIHRoZVxuICAvLyBQb3Mgb2JqZWN0cyByZXR1cm5lZCBjb250YWluIGEgbGluZSBvYmplY3QsIHJhdGhlciB0aGFuIGEgbGluZVxuICAvLyBudW1iZXIgKHVzZWQgdG8gcHJldmVudCBsb29raW5nIHVwIHRoZSBzYW1lIGxpbmUgdHdpY2UpLlxuICBUZXh0TWFya2VyLnByb3RvdHlwZS5maW5kID0gZnVuY3Rpb24gKHNpZGUsIGxpbmVPYmopIHtcbiAgICBpZiAoc2lkZSA9PSBudWxsICYmIHRoaXMudHlwZSA9PSBcImJvb2ttYXJrXCIpIHsgc2lkZSA9IDE7IH1cbiAgICB2YXIgZnJvbSwgdG87XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxpbmVzLmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgbGluZSA9IHRoaXMubGluZXNbaV07XG4gICAgICB2YXIgc3BhbiA9IGdldE1hcmtlZFNwYW5Gb3IobGluZS5tYXJrZWRTcGFucywgdGhpcyk7XG4gICAgICBpZiAoc3Bhbi5mcm9tICE9IG51bGwpIHtcbiAgICAgICAgZnJvbSA9IFBvcyhsaW5lT2JqID8gbGluZSA6IGxpbmVObyhsaW5lKSwgc3Bhbi5mcm9tKTtcbiAgICAgICAgaWYgKHNpZGUgPT0gLTEpIHsgcmV0dXJuIGZyb20gfVxuICAgICAgfVxuICAgICAgaWYgKHNwYW4udG8gIT0gbnVsbCkge1xuICAgICAgICB0byA9IFBvcyhsaW5lT2JqID8gbGluZSA6IGxpbmVObyhsaW5lKSwgc3Bhbi50byk7XG4gICAgICAgIGlmIChzaWRlID09IDEpIHsgcmV0dXJuIHRvIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZyb20gJiYge2Zyb206IGZyb20sIHRvOiB0b31cbiAgfTtcblxuICAvLyBTaWduYWxzIHRoYXQgdGhlIG1hcmtlcidzIHdpZGdldCBjaGFuZ2VkLCBhbmQgc3Vycm91bmRpbmcgbGF5b3V0XG4gIC8vIHNob3VsZCBiZSByZWNvbXB1dGVkLlxuICBUZXh0TWFya2VyLnByb3RvdHlwZS5jaGFuZ2VkID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICB2YXIgcG9zID0gdGhpcy5maW5kKC0xLCB0cnVlKSwgd2lkZ2V0ID0gdGhpcywgY20gPSB0aGlzLmRvYy5jbTtcbiAgICBpZiAoIXBvcyB8fCAhY20pIHsgcmV0dXJuIH1cbiAgICBydW5Jbk9wKGNtLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgbGluZSA9IHBvcy5saW5lLCBsaW5lTiA9IGxpbmVObyhwb3MubGluZSk7XG4gICAgICB2YXIgdmlldyA9IGZpbmRWaWV3Rm9yTGluZShjbSwgbGluZU4pO1xuICAgICAgaWYgKHZpZXcpIHtcbiAgICAgICAgY2xlYXJMaW5lTWVhc3VyZW1lbnRDYWNoZUZvcih2aWV3KTtcbiAgICAgICAgY20uY3VyT3Auc2VsZWN0aW9uQ2hhbmdlZCA9IGNtLmN1ck9wLmZvcmNlVXBkYXRlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNtLmN1ck9wLnVwZGF0ZU1heExpbmUgPSB0cnVlO1xuICAgICAgaWYgKCFsaW5lSXNIaWRkZW4od2lkZ2V0LmRvYywgbGluZSkgJiYgd2lkZ2V0LmhlaWdodCAhPSBudWxsKSB7XG4gICAgICAgIHZhciBvbGRIZWlnaHQgPSB3aWRnZXQuaGVpZ2h0O1xuICAgICAgICB3aWRnZXQuaGVpZ2h0ID0gbnVsbDtcbiAgICAgICAgdmFyIGRIZWlnaHQgPSB3aWRnZXRIZWlnaHQod2lkZ2V0KSAtIG9sZEhlaWdodDtcbiAgICAgICAgaWYgKGRIZWlnaHQpXG4gICAgICAgICAgeyB1cGRhdGVMaW5lSGVpZ2h0KGxpbmUsIGxpbmUuaGVpZ2h0ICsgZEhlaWdodCk7IH1cbiAgICAgIH1cbiAgICAgIHNpZ25hbExhdGVyKGNtLCBcIm1hcmtlckNoYW5nZWRcIiwgY20sIHRoaXMkMSk7XG4gICAgfSk7XG4gIH07XG5cbiAgVGV4dE1hcmtlci5wcm90b3R5cGUuYXR0YWNoTGluZSA9IGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgaWYgKCF0aGlzLmxpbmVzLmxlbmd0aCAmJiB0aGlzLmRvYy5jbSkge1xuICAgICAgdmFyIG9wID0gdGhpcy5kb2MuY20uY3VyT3A7XG4gICAgICBpZiAoIW9wLm1heWJlSGlkZGVuTWFya2VycyB8fCBpbmRleE9mKG9wLm1heWJlSGlkZGVuTWFya2VycywgdGhpcykgPT0gLTEpXG4gICAgICAgIHsgKG9wLm1heWJlVW5oaWRkZW5NYXJrZXJzIHx8IChvcC5tYXliZVVuaGlkZGVuTWFya2VycyA9IFtdKSkucHVzaCh0aGlzKTsgfVxuICAgIH1cbiAgICB0aGlzLmxpbmVzLnB1c2gobGluZSk7XG4gIH07XG5cbiAgVGV4dE1hcmtlci5wcm90b3R5cGUuZGV0YWNoTGluZSA9IGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgdGhpcy5saW5lcy5zcGxpY2UoaW5kZXhPZih0aGlzLmxpbmVzLCBsaW5lKSwgMSk7XG4gICAgaWYgKCF0aGlzLmxpbmVzLmxlbmd0aCAmJiB0aGlzLmRvYy5jbSkge1xuICAgICAgdmFyIG9wID0gdGhpcy5kb2MuY20uY3VyT3BcbiAgICAgIDsob3AubWF5YmVIaWRkZW5NYXJrZXJzIHx8IChvcC5tYXliZUhpZGRlbk1hcmtlcnMgPSBbXSkpLnB1c2godGhpcyk7XG4gICAgfVxuICB9O1xuICBldmVudE1peGluKFRleHRNYXJrZXIpO1xuXG4gIC8vIENyZWF0ZSBhIG1hcmtlciwgd2lyZSBpdCB1cCB0byB0aGUgcmlnaHQgbGluZXMsIGFuZFxuICBmdW5jdGlvbiBtYXJrVGV4dChkb2MsIGZyb20sIHRvLCBvcHRpb25zLCB0eXBlKSB7XG4gICAgLy8gU2hhcmVkIG1hcmtlcnMgKGFjcm9zcyBsaW5rZWQgZG9jdW1lbnRzKSBhcmUgaGFuZGxlZCBzZXBhcmF0ZWx5XG4gICAgLy8gKG1hcmtUZXh0U2hhcmVkIHdpbGwgY2FsbCBvdXQgdG8gdGhpcyBhZ2Fpbiwgb25jZSBwZXJcbiAgICAvLyBkb2N1bWVudCkuXG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5zaGFyZWQpIHsgcmV0dXJuIG1hcmtUZXh0U2hhcmVkKGRvYywgZnJvbSwgdG8sIG9wdGlvbnMsIHR5cGUpIH1cbiAgICAvLyBFbnN1cmUgd2UgYXJlIGluIGFuIG9wZXJhdGlvbi5cbiAgICBpZiAoZG9jLmNtICYmICFkb2MuY20uY3VyT3ApIHsgcmV0dXJuIG9wZXJhdGlvbihkb2MuY20sIG1hcmtUZXh0KShkb2MsIGZyb20sIHRvLCBvcHRpb25zLCB0eXBlKSB9XG5cbiAgICB2YXIgbWFya2VyID0gbmV3IFRleHRNYXJrZXIoZG9jLCB0eXBlKSwgZGlmZiA9IGNtcChmcm9tLCB0byk7XG4gICAgaWYgKG9wdGlvbnMpIHsgY29weU9iaihvcHRpb25zLCBtYXJrZXIsIGZhbHNlKTsgfVxuICAgIC8vIERvbid0IGNvbm5lY3QgZW1wdHkgbWFya2VycyB1bmxlc3MgY2xlYXJXaGVuRW1wdHkgaXMgZmFsc2VcbiAgICBpZiAoZGlmZiA+IDAgfHwgZGlmZiA9PSAwICYmIG1hcmtlci5jbGVhcldoZW5FbXB0eSAhPT0gZmFsc2UpXG4gICAgICB7IHJldHVybiBtYXJrZXIgfVxuICAgIGlmIChtYXJrZXIucmVwbGFjZWRXaXRoKSB7XG4gICAgICAvLyBTaG93aW5nIHVwIGFzIGEgd2lkZ2V0IGltcGxpZXMgY29sbGFwc2VkICh3aWRnZXQgcmVwbGFjZXMgdGV4dClcbiAgICAgIG1hcmtlci5jb2xsYXBzZWQgPSB0cnVlO1xuICAgICAgbWFya2VyLndpZGdldE5vZGUgPSBlbHRQKFwic3BhblwiLCBbbWFya2VyLnJlcGxhY2VkV2l0aF0sIFwiQ29kZU1pcnJvci13aWRnZXRcIik7XG4gICAgICBpZiAoIW9wdGlvbnMuaGFuZGxlTW91c2VFdmVudHMpIHsgbWFya2VyLndpZGdldE5vZGUuc2V0QXR0cmlidXRlKFwiY20taWdub3JlLWV2ZW50c1wiLCBcInRydWVcIik7IH1cbiAgICAgIGlmIChvcHRpb25zLmluc2VydExlZnQpIHsgbWFya2VyLndpZGdldE5vZGUuaW5zZXJ0TGVmdCA9IHRydWU7IH1cbiAgICB9XG4gICAgaWYgKG1hcmtlci5jb2xsYXBzZWQpIHtcbiAgICAgIGlmIChjb25mbGljdGluZ0NvbGxhcHNlZFJhbmdlKGRvYywgZnJvbS5saW5lLCBmcm9tLCB0bywgbWFya2VyKSB8fFxuICAgICAgICAgIGZyb20ubGluZSAhPSB0by5saW5lICYmIGNvbmZsaWN0aW5nQ29sbGFwc2VkUmFuZ2UoZG9jLCB0by5saW5lLCBmcm9tLCB0bywgbWFya2VyKSlcbiAgICAgICAgeyB0aHJvdyBuZXcgRXJyb3IoXCJJbnNlcnRpbmcgY29sbGFwc2VkIG1hcmtlciBwYXJ0aWFsbHkgb3ZlcmxhcHBpbmcgYW4gZXhpc3Rpbmcgb25lXCIpIH1cbiAgICAgIHNlZUNvbGxhcHNlZFNwYW5zKCk7XG4gICAgfVxuXG4gICAgaWYgKG1hcmtlci5hZGRUb0hpc3RvcnkpXG4gICAgICB7IGFkZENoYW5nZVRvSGlzdG9yeShkb2MsIHtmcm9tOiBmcm9tLCB0bzogdG8sIG9yaWdpbjogXCJtYXJrVGV4dFwifSwgZG9jLnNlbCwgTmFOKTsgfVxuXG4gICAgdmFyIGN1ckxpbmUgPSBmcm9tLmxpbmUsIGNtID0gZG9jLmNtLCB1cGRhdGVNYXhMaW5lO1xuICAgIGRvYy5pdGVyKGN1ckxpbmUsIHRvLmxpbmUgKyAxLCBmdW5jdGlvbiAobGluZSkge1xuICAgICAgaWYgKGNtICYmIG1hcmtlci5jb2xsYXBzZWQgJiYgIWNtLm9wdGlvbnMubGluZVdyYXBwaW5nICYmIHZpc3VhbExpbmUobGluZSkgPT0gY20uZGlzcGxheS5tYXhMaW5lKVxuICAgICAgICB7IHVwZGF0ZU1heExpbmUgPSB0cnVlOyB9XG4gICAgICBpZiAobWFya2VyLmNvbGxhcHNlZCAmJiBjdXJMaW5lICE9IGZyb20ubGluZSkgeyB1cGRhdGVMaW5lSGVpZ2h0KGxpbmUsIDApOyB9XG4gICAgICBhZGRNYXJrZWRTcGFuKGxpbmUsIG5ldyBNYXJrZWRTcGFuKG1hcmtlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyTGluZSA9PSBmcm9tLmxpbmUgPyBmcm9tLmNoIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyTGluZSA9PSB0by5saW5lID8gdG8uY2ggOiBudWxsKSk7XG4gICAgICArK2N1ckxpbmU7XG4gICAgfSk7XG4gICAgLy8gbGluZUlzSGlkZGVuIGRlcGVuZHMgb24gdGhlIHByZXNlbmNlIG9mIHRoZSBzcGFucywgc28gbmVlZHMgYSBzZWNvbmQgcGFzc1xuICAgIGlmIChtYXJrZXIuY29sbGFwc2VkKSB7IGRvYy5pdGVyKGZyb20ubGluZSwgdG8ubGluZSArIDEsIGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgICBpZiAobGluZUlzSGlkZGVuKGRvYywgbGluZSkpIHsgdXBkYXRlTGluZUhlaWdodChsaW5lLCAwKTsgfVxuICAgIH0pOyB9XG5cbiAgICBpZiAobWFya2VyLmNsZWFyT25FbnRlcikgeyBvbihtYXJrZXIsIFwiYmVmb3JlQ3Vyc29yRW50ZXJcIiwgZnVuY3Rpb24gKCkgeyByZXR1cm4gbWFya2VyLmNsZWFyKCk7IH0pOyB9XG5cbiAgICBpZiAobWFya2VyLnJlYWRPbmx5KSB7XG4gICAgICBzZWVSZWFkT25seVNwYW5zKCk7XG4gICAgICBpZiAoZG9jLmhpc3RvcnkuZG9uZS5sZW5ndGggfHwgZG9jLmhpc3RvcnkudW5kb25lLmxlbmd0aClcbiAgICAgICAgeyBkb2MuY2xlYXJIaXN0b3J5KCk7IH1cbiAgICB9XG4gICAgaWYgKG1hcmtlci5jb2xsYXBzZWQpIHtcbiAgICAgIG1hcmtlci5pZCA9ICsrbmV4dE1hcmtlcklkO1xuICAgICAgbWFya2VyLmF0b21pYyA9IHRydWU7XG4gICAgfVxuICAgIGlmIChjbSkge1xuICAgICAgLy8gU3luYyBlZGl0b3Igc3RhdGVcbiAgICAgIGlmICh1cGRhdGVNYXhMaW5lKSB7IGNtLmN1ck9wLnVwZGF0ZU1heExpbmUgPSB0cnVlOyB9XG4gICAgICBpZiAobWFya2VyLmNvbGxhcHNlZClcbiAgICAgICAgeyByZWdDaGFuZ2UoY20sIGZyb20ubGluZSwgdG8ubGluZSArIDEpOyB9XG4gICAgICBlbHNlIGlmIChtYXJrZXIuY2xhc3NOYW1lIHx8IG1hcmtlci5zdGFydFN0eWxlIHx8IG1hcmtlci5lbmRTdHlsZSB8fCBtYXJrZXIuY3NzIHx8XG4gICAgICAgICAgICAgICBtYXJrZXIuYXR0cmlidXRlcyB8fCBtYXJrZXIudGl0bGUpXG4gICAgICAgIHsgZm9yICh2YXIgaSA9IGZyb20ubGluZTsgaSA8PSB0by5saW5lOyBpKyspIHsgcmVnTGluZUNoYW5nZShjbSwgaSwgXCJ0ZXh0XCIpOyB9IH1cbiAgICAgIGlmIChtYXJrZXIuYXRvbWljKSB7IHJlQ2hlY2tTZWxlY3Rpb24oY20uZG9jKTsgfVxuICAgICAgc2lnbmFsTGF0ZXIoY20sIFwibWFya2VyQWRkZWRcIiwgY20sIG1hcmtlcik7XG4gICAgfVxuICAgIHJldHVybiBtYXJrZXJcbiAgfVxuXG4gIC8vIFNIQVJFRCBURVhUTUFSS0VSU1xuXG4gIC8vIEEgc2hhcmVkIG1hcmtlciBzcGFucyBtdWx0aXBsZSBsaW5rZWQgZG9jdW1lbnRzLiBJdCBpc1xuICAvLyBpbXBsZW1lbnRlZCBhcyBhIG1ldGEtbWFya2VyLW9iamVjdCBjb250cm9sbGluZyBtdWx0aXBsZSBub3JtYWxcbiAgLy8gbWFya2Vycy5cbiAgdmFyIFNoYXJlZFRleHRNYXJrZXIgPSBmdW5jdGlvbihtYXJrZXJzLCBwcmltYXJ5KSB7XG4gICAgdGhpcy5tYXJrZXJzID0gbWFya2VycztcbiAgICB0aGlzLnByaW1hcnkgPSBwcmltYXJ5O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7ICsraSlcbiAgICAgIHsgbWFya2Vyc1tpXS5wYXJlbnQgPSB0aGlzOyB9XG4gIH07XG5cbiAgU2hhcmVkVGV4dE1hcmtlci5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuZXhwbGljaXRseUNsZWFyZWQpIHsgcmV0dXJuIH1cbiAgICB0aGlzLmV4cGxpY2l0bHlDbGVhcmVkID0gdHJ1ZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubWFya2Vycy5sZW5ndGg7ICsraSlcbiAgICAgIHsgdGhpcy5tYXJrZXJzW2ldLmNsZWFyKCk7IH1cbiAgICBzaWduYWxMYXRlcih0aGlzLCBcImNsZWFyXCIpO1xuICB9O1xuXG4gIFNoYXJlZFRleHRNYXJrZXIucHJvdG90eXBlLmZpbmQgPSBmdW5jdGlvbiAoc2lkZSwgbGluZU9iaikge1xuICAgIHJldHVybiB0aGlzLnByaW1hcnkuZmluZChzaWRlLCBsaW5lT2JqKVxuICB9O1xuICBldmVudE1peGluKFNoYXJlZFRleHRNYXJrZXIpO1xuXG4gIGZ1bmN0aW9uIG1hcmtUZXh0U2hhcmVkKGRvYywgZnJvbSwgdG8sIG9wdGlvbnMsIHR5cGUpIHtcbiAgICBvcHRpb25zID0gY29weU9iaihvcHRpb25zKTtcbiAgICBvcHRpb25zLnNoYXJlZCA9IGZhbHNlO1xuICAgIHZhciBtYXJrZXJzID0gW21hcmtUZXh0KGRvYywgZnJvbSwgdG8sIG9wdGlvbnMsIHR5cGUpXSwgcHJpbWFyeSA9IG1hcmtlcnNbMF07XG4gICAgdmFyIHdpZGdldCA9IG9wdGlvbnMud2lkZ2V0Tm9kZTtcbiAgICBsaW5rZWREb2NzKGRvYywgZnVuY3Rpb24gKGRvYykge1xuICAgICAgaWYgKHdpZGdldCkgeyBvcHRpb25zLndpZGdldE5vZGUgPSB3aWRnZXQuY2xvbmVOb2RlKHRydWUpOyB9XG4gICAgICBtYXJrZXJzLnB1c2gobWFya1RleHQoZG9jLCBjbGlwUG9zKGRvYywgZnJvbSksIGNsaXBQb3MoZG9jLCB0byksIG9wdGlvbnMsIHR5cGUpKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZG9jLmxpbmtlZC5sZW5ndGg7ICsraSlcbiAgICAgICAgeyBpZiAoZG9jLmxpbmtlZFtpXS5pc1BhcmVudCkgeyByZXR1cm4gfSB9XG4gICAgICBwcmltYXJ5ID0gbHN0KG1hcmtlcnMpO1xuICAgIH0pO1xuICAgIHJldHVybiBuZXcgU2hhcmVkVGV4dE1hcmtlcihtYXJrZXJzLCBwcmltYXJ5KVxuICB9XG5cbiAgZnVuY3Rpb24gZmluZFNoYXJlZE1hcmtlcnMoZG9jKSB7XG4gICAgcmV0dXJuIGRvYy5maW5kTWFya3MoUG9zKGRvYy5maXJzdCwgMCksIGRvYy5jbGlwUG9zKFBvcyhkb2MubGFzdExpbmUoKSkpLCBmdW5jdGlvbiAobSkgeyByZXR1cm4gbS5wYXJlbnQ7IH0pXG4gIH1cblxuICBmdW5jdGlvbiBjb3B5U2hhcmVkTWFya2Vycyhkb2MsIG1hcmtlcnMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBtYXJrZXIgPSBtYXJrZXJzW2ldLCBwb3MgPSBtYXJrZXIuZmluZCgpO1xuICAgICAgdmFyIG1Gcm9tID0gZG9jLmNsaXBQb3MocG9zLmZyb20pLCBtVG8gPSBkb2MuY2xpcFBvcyhwb3MudG8pO1xuICAgICAgaWYgKGNtcChtRnJvbSwgbVRvKSkge1xuICAgICAgICB2YXIgc3ViTWFyayA9IG1hcmtUZXh0KGRvYywgbUZyb20sIG1UbywgbWFya2VyLnByaW1hcnksIG1hcmtlci5wcmltYXJ5LnR5cGUpO1xuICAgICAgICBtYXJrZXIubWFya2Vycy5wdXNoKHN1Yk1hcmspO1xuICAgICAgICBzdWJNYXJrLnBhcmVudCA9IG1hcmtlcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBkZXRhY2hTaGFyZWRNYXJrZXJzKG1hcmtlcnMpIHtcbiAgICB2YXIgbG9vcCA9IGZ1bmN0aW9uICggaSApIHtcbiAgICAgIHZhciBtYXJrZXIgPSBtYXJrZXJzW2ldLCBsaW5rZWQgPSBbbWFya2VyLnByaW1hcnkuZG9jXTtcbiAgICAgIGxpbmtlZERvY3MobWFya2VyLnByaW1hcnkuZG9jLCBmdW5jdGlvbiAoZCkgeyByZXR1cm4gbGlua2VkLnB1c2goZCk7IH0pO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBtYXJrZXIubWFya2Vycy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgc3ViTWFya2VyID0gbWFya2VyLm1hcmtlcnNbal07XG4gICAgICAgIGlmIChpbmRleE9mKGxpbmtlZCwgc3ViTWFya2VyLmRvYykgPT0gLTEpIHtcbiAgICAgICAgICBzdWJNYXJrZXIucGFyZW50ID0gbnVsbDtcbiAgICAgICAgICBtYXJrZXIubWFya2Vycy5zcGxpY2Uoai0tLCAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIGxvb3AoIGkgKTtcbiAgfVxuXG4gIHZhciBuZXh0RG9jSWQgPSAwO1xuICB2YXIgRG9jID0gZnVuY3Rpb24odGV4dCwgbW9kZSwgZmlyc3RMaW5lLCBsaW5lU2VwLCBkaXJlY3Rpb24pIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRG9jKSkgeyByZXR1cm4gbmV3IERvYyh0ZXh0LCBtb2RlLCBmaXJzdExpbmUsIGxpbmVTZXAsIGRpcmVjdGlvbikgfVxuICAgIGlmIChmaXJzdExpbmUgPT0gbnVsbCkgeyBmaXJzdExpbmUgPSAwOyB9XG5cbiAgICBCcmFuY2hDaHVuay5jYWxsKHRoaXMsIFtuZXcgTGVhZkNodW5rKFtuZXcgTGluZShcIlwiLCBudWxsKV0pXSk7XG4gICAgdGhpcy5maXJzdCA9IGZpcnN0TGluZTtcbiAgICB0aGlzLnNjcm9sbFRvcCA9IHRoaXMuc2Nyb2xsTGVmdCA9IDA7XG4gICAgdGhpcy5jYW50RWRpdCA9IGZhbHNlO1xuICAgIHRoaXMuY2xlYW5HZW5lcmF0aW9uID0gMTtcbiAgICB0aGlzLm1vZGVGcm9udGllciA9IHRoaXMuaGlnaGxpZ2h0RnJvbnRpZXIgPSBmaXJzdExpbmU7XG4gICAgdmFyIHN0YXJ0ID0gUG9zKGZpcnN0TGluZSwgMCk7XG4gICAgdGhpcy5zZWwgPSBzaW1wbGVTZWxlY3Rpb24oc3RhcnQpO1xuICAgIHRoaXMuaGlzdG9yeSA9IG5ldyBIaXN0b3J5KG51bGwpO1xuICAgIHRoaXMuaWQgPSArK25leHREb2NJZDtcbiAgICB0aGlzLm1vZGVPcHRpb24gPSBtb2RlO1xuICAgIHRoaXMubGluZVNlcCA9IGxpbmVTZXA7XG4gICAgdGhpcy5kaXJlY3Rpb24gPSAoZGlyZWN0aW9uID09IFwicnRsXCIpID8gXCJydGxcIiA6IFwibHRyXCI7XG4gICAgdGhpcy5leHRlbmQgPSBmYWxzZTtcblxuICAgIGlmICh0eXBlb2YgdGV4dCA9PSBcInN0cmluZ1wiKSB7IHRleHQgPSB0aGlzLnNwbGl0TGluZXModGV4dCk7IH1cbiAgICB1cGRhdGVEb2ModGhpcywge2Zyb206IHN0YXJ0LCB0bzogc3RhcnQsIHRleHQ6IHRleHR9KTtcbiAgICBzZXRTZWxlY3Rpb24odGhpcywgc2ltcGxlU2VsZWN0aW9uKHN0YXJ0KSwgc2VsX2RvbnRTY3JvbGwpO1xuICB9O1xuXG4gIERvYy5wcm90b3R5cGUgPSBjcmVhdGVPYmooQnJhbmNoQ2h1bmsucHJvdG90eXBlLCB7XG4gICAgY29uc3RydWN0b3I6IERvYyxcbiAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIGRvY3VtZW50LiBTdXBwb3J0cyB0d28gZm9ybXMgLS0gd2l0aCBvbmx5IG9uZVxuICAgIC8vIGFyZ3VtZW50LCBpdCBjYWxscyB0aGF0IGZvciBlYWNoIGxpbmUgaW4gdGhlIGRvY3VtZW50LiBXaXRoXG4gICAgLy8gdGhyZWUsIGl0IGl0ZXJhdGVzIG92ZXIgdGhlIHJhbmdlIGdpdmVuIGJ5IHRoZSBmaXJzdCB0d28gKHdpdGhcbiAgICAvLyB0aGUgc2Vjb25kIGJlaW5nIG5vbi1pbmNsdXNpdmUpLlxuICAgIGl0ZXI6IGZ1bmN0aW9uKGZyb20sIHRvLCBvcCkge1xuICAgICAgaWYgKG9wKSB7IHRoaXMuaXRlck4oZnJvbSAtIHRoaXMuZmlyc3QsIHRvIC0gZnJvbSwgb3ApOyB9XG4gICAgICBlbHNlIHsgdGhpcy5pdGVyTih0aGlzLmZpcnN0LCB0aGlzLmZpcnN0ICsgdGhpcy5zaXplLCBmcm9tKTsgfVxuICAgIH0sXG5cbiAgICAvLyBOb24tcHVibGljIGludGVyZmFjZSBmb3IgYWRkaW5nIGFuZCByZW1vdmluZyBsaW5lcy5cbiAgICBpbnNlcnQ6IGZ1bmN0aW9uKGF0LCBsaW5lcykge1xuICAgICAgdmFyIGhlaWdodCA9IDA7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgKytpKSB7IGhlaWdodCArPSBsaW5lc1tpXS5oZWlnaHQ7IH1cbiAgICAgIHRoaXMuaW5zZXJ0SW5uZXIoYXQgLSB0aGlzLmZpcnN0LCBsaW5lcywgaGVpZ2h0KTtcbiAgICB9LFxuICAgIHJlbW92ZTogZnVuY3Rpb24oYXQsIG4pIHsgdGhpcy5yZW1vdmVJbm5lcihhdCAtIHRoaXMuZmlyc3QsIG4pOyB9LFxuXG4gICAgLy8gRnJvbSBoZXJlLCB0aGUgbWV0aG9kcyBhcmUgcGFydCBvZiB0aGUgcHVibGljIGludGVyZmFjZS4gTW9zdFxuICAgIC8vIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIENvZGVNaXJyb3IgKGVkaXRvcikgaW5zdGFuY2VzLlxuXG4gICAgZ2V0VmFsdWU6IGZ1bmN0aW9uKGxpbmVTZXApIHtcbiAgICAgIHZhciBsaW5lcyA9IGdldExpbmVzKHRoaXMsIHRoaXMuZmlyc3QsIHRoaXMuZmlyc3QgKyB0aGlzLnNpemUpO1xuICAgICAgaWYgKGxpbmVTZXAgPT09IGZhbHNlKSB7IHJldHVybiBsaW5lcyB9XG4gICAgICByZXR1cm4gbGluZXMuam9pbihsaW5lU2VwIHx8IHRoaXMubGluZVNlcGFyYXRvcigpKVxuICAgIH0sXG4gICAgc2V0VmFsdWU6IGRvY01ldGhvZE9wKGZ1bmN0aW9uKGNvZGUpIHtcbiAgICAgIHZhciB0b3AgPSBQb3ModGhpcy5maXJzdCwgMCksIGxhc3QgPSB0aGlzLmZpcnN0ICsgdGhpcy5zaXplIC0gMTtcbiAgICAgIG1ha2VDaGFuZ2UodGhpcywge2Zyb206IHRvcCwgdG86IFBvcyhsYXN0LCBnZXRMaW5lKHRoaXMsIGxhc3QpLnRleHQubGVuZ3RoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IHRoaXMuc3BsaXRMaW5lcyhjb2RlKSwgb3JpZ2luOiBcInNldFZhbHVlXCIsIGZ1bGw6IHRydWV9LCB0cnVlKTtcbiAgICAgIGlmICh0aGlzLmNtKSB7IHNjcm9sbFRvQ29vcmRzKHRoaXMuY20sIDAsIDApOyB9XG4gICAgICBzZXRTZWxlY3Rpb24odGhpcywgc2ltcGxlU2VsZWN0aW9uKHRvcCksIHNlbF9kb250U2Nyb2xsKTtcbiAgICB9KSxcbiAgICByZXBsYWNlUmFuZ2U6IGZ1bmN0aW9uKGNvZGUsIGZyb20sIHRvLCBvcmlnaW4pIHtcbiAgICAgIGZyb20gPSBjbGlwUG9zKHRoaXMsIGZyb20pO1xuICAgICAgdG8gPSB0byA/IGNsaXBQb3ModGhpcywgdG8pIDogZnJvbTtcbiAgICAgIHJlcGxhY2VSYW5nZSh0aGlzLCBjb2RlLCBmcm9tLCB0bywgb3JpZ2luKTtcbiAgICB9LFxuICAgIGdldFJhbmdlOiBmdW5jdGlvbihmcm9tLCB0bywgbGluZVNlcCkge1xuICAgICAgdmFyIGxpbmVzID0gZ2V0QmV0d2Vlbih0aGlzLCBjbGlwUG9zKHRoaXMsIGZyb20pLCBjbGlwUG9zKHRoaXMsIHRvKSk7XG4gICAgICBpZiAobGluZVNlcCA9PT0gZmFsc2UpIHsgcmV0dXJuIGxpbmVzIH1cbiAgICAgIHJldHVybiBsaW5lcy5qb2luKGxpbmVTZXAgfHwgdGhpcy5saW5lU2VwYXJhdG9yKCkpXG4gICAgfSxcblxuICAgIGdldExpbmU6IGZ1bmN0aW9uKGxpbmUpIHt2YXIgbCA9IHRoaXMuZ2V0TGluZUhhbmRsZShsaW5lKTsgcmV0dXJuIGwgJiYgbC50ZXh0fSxcblxuICAgIGdldExpbmVIYW5kbGU6IGZ1bmN0aW9uKGxpbmUpIHtpZiAoaXNMaW5lKHRoaXMsIGxpbmUpKSB7IHJldHVybiBnZXRMaW5lKHRoaXMsIGxpbmUpIH19LFxuICAgIGdldExpbmVOdW1iZXI6IGZ1bmN0aW9uKGxpbmUpIHtyZXR1cm4gbGluZU5vKGxpbmUpfSxcblxuICAgIGdldExpbmVIYW5kbGVWaXN1YWxTdGFydDogZnVuY3Rpb24obGluZSkge1xuICAgICAgaWYgKHR5cGVvZiBsaW5lID09IFwibnVtYmVyXCIpIHsgbGluZSA9IGdldExpbmUodGhpcywgbGluZSk7IH1cbiAgICAgIHJldHVybiB2aXN1YWxMaW5lKGxpbmUpXG4gICAgfSxcblxuICAgIGxpbmVDb3VudDogZnVuY3Rpb24oKSB7cmV0dXJuIHRoaXMuc2l6ZX0sXG4gICAgZmlyc3RMaW5lOiBmdW5jdGlvbigpIHtyZXR1cm4gdGhpcy5maXJzdH0sXG4gICAgbGFzdExpbmU6IGZ1bmN0aW9uKCkge3JldHVybiB0aGlzLmZpcnN0ICsgdGhpcy5zaXplIC0gMX0sXG5cbiAgICBjbGlwUG9zOiBmdW5jdGlvbihwb3MpIHtyZXR1cm4gY2xpcFBvcyh0aGlzLCBwb3MpfSxcblxuICAgIGdldEN1cnNvcjogZnVuY3Rpb24oc3RhcnQpIHtcbiAgICAgIHZhciByYW5nZSA9IHRoaXMuc2VsLnByaW1hcnkoKSwgcG9zO1xuICAgICAgaWYgKHN0YXJ0ID09IG51bGwgfHwgc3RhcnQgPT0gXCJoZWFkXCIpIHsgcG9zID0gcmFuZ2UuaGVhZDsgfVxuICAgICAgZWxzZSBpZiAoc3RhcnQgPT0gXCJhbmNob3JcIikgeyBwb3MgPSByYW5nZS5hbmNob3I7IH1cbiAgICAgIGVsc2UgaWYgKHN0YXJ0ID09IFwiZW5kXCIgfHwgc3RhcnQgPT0gXCJ0b1wiIHx8IHN0YXJ0ID09PSBmYWxzZSkgeyBwb3MgPSByYW5nZS50bygpOyB9XG4gICAgICBlbHNlIHsgcG9zID0gcmFuZ2UuZnJvbSgpOyB9XG4gICAgICByZXR1cm4gcG9zXG4gICAgfSxcbiAgICBsaXN0U2VsZWN0aW9uczogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLnNlbC5yYW5nZXMgfSxcbiAgICBzb21ldGhpbmdTZWxlY3RlZDogZnVuY3Rpb24oKSB7cmV0dXJuIHRoaXMuc2VsLnNvbWV0aGluZ1NlbGVjdGVkKCl9LFxuXG4gICAgc2V0Q3Vyc29yOiBkb2NNZXRob2RPcChmdW5jdGlvbihsaW5lLCBjaCwgb3B0aW9ucykge1xuICAgICAgc2V0U2ltcGxlU2VsZWN0aW9uKHRoaXMsIGNsaXBQb3ModGhpcywgdHlwZW9mIGxpbmUgPT0gXCJudW1iZXJcIiA/IFBvcyhsaW5lLCBjaCB8fCAwKSA6IGxpbmUpLCBudWxsLCBvcHRpb25zKTtcbiAgICB9KSxcbiAgICBzZXRTZWxlY3Rpb246IGRvY01ldGhvZE9wKGZ1bmN0aW9uKGFuY2hvciwgaGVhZCwgb3B0aW9ucykge1xuICAgICAgc2V0U2ltcGxlU2VsZWN0aW9uKHRoaXMsIGNsaXBQb3ModGhpcywgYW5jaG9yKSwgY2xpcFBvcyh0aGlzLCBoZWFkIHx8IGFuY2hvciksIG9wdGlvbnMpO1xuICAgIH0pLFxuICAgIGV4dGVuZFNlbGVjdGlvbjogZG9jTWV0aG9kT3AoZnVuY3Rpb24oaGVhZCwgb3RoZXIsIG9wdGlvbnMpIHtcbiAgICAgIGV4dGVuZFNlbGVjdGlvbih0aGlzLCBjbGlwUG9zKHRoaXMsIGhlYWQpLCBvdGhlciAmJiBjbGlwUG9zKHRoaXMsIG90aGVyKSwgb3B0aW9ucyk7XG4gICAgfSksXG4gICAgZXh0ZW5kU2VsZWN0aW9uczogZG9jTWV0aG9kT3AoZnVuY3Rpb24oaGVhZHMsIG9wdGlvbnMpIHtcbiAgICAgIGV4dGVuZFNlbGVjdGlvbnModGhpcywgY2xpcFBvc0FycmF5KHRoaXMsIGhlYWRzKSwgb3B0aW9ucyk7XG4gICAgfSksXG4gICAgZXh0ZW5kU2VsZWN0aW9uc0J5OiBkb2NNZXRob2RPcChmdW5jdGlvbihmLCBvcHRpb25zKSB7XG4gICAgICB2YXIgaGVhZHMgPSBtYXAodGhpcy5zZWwucmFuZ2VzLCBmKTtcbiAgICAgIGV4dGVuZFNlbGVjdGlvbnModGhpcywgY2xpcFBvc0FycmF5KHRoaXMsIGhlYWRzKSwgb3B0aW9ucyk7XG4gICAgfSksXG4gICAgc2V0U2VsZWN0aW9uczogZG9jTWV0aG9kT3AoZnVuY3Rpb24ocmFuZ2VzLCBwcmltYXJ5LCBvcHRpb25zKSB7XG4gICAgICBpZiAoIXJhbmdlcy5sZW5ndGgpIHsgcmV0dXJuIH1cbiAgICAgIHZhciBvdXQgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKVxuICAgICAgICB7IG91dFtpXSA9IG5ldyBSYW5nZShjbGlwUG9zKHRoaXMsIHJhbmdlc1tpXS5hbmNob3IpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcFBvcyh0aGlzLCByYW5nZXNbaV0uaGVhZCB8fCByYW5nZXNbaV0uYW5jaG9yKSk7IH1cbiAgICAgIGlmIChwcmltYXJ5ID09IG51bGwpIHsgcHJpbWFyeSA9IE1hdGgubWluKHJhbmdlcy5sZW5ndGggLSAxLCB0aGlzLnNlbC5wcmltSW5kZXgpOyB9XG4gICAgICBzZXRTZWxlY3Rpb24odGhpcywgbm9ybWFsaXplU2VsZWN0aW9uKHRoaXMuY20sIG91dCwgcHJpbWFyeSksIG9wdGlvbnMpO1xuICAgIH0pLFxuICAgIGFkZFNlbGVjdGlvbjogZG9jTWV0aG9kT3AoZnVuY3Rpb24oYW5jaG9yLCBoZWFkLCBvcHRpb25zKSB7XG4gICAgICB2YXIgcmFuZ2VzID0gdGhpcy5zZWwucmFuZ2VzLnNsaWNlKDApO1xuICAgICAgcmFuZ2VzLnB1c2gobmV3IFJhbmdlKGNsaXBQb3ModGhpcywgYW5jaG9yKSwgY2xpcFBvcyh0aGlzLCBoZWFkIHx8IGFuY2hvcikpKTtcbiAgICAgIHNldFNlbGVjdGlvbih0aGlzLCBub3JtYWxpemVTZWxlY3Rpb24odGhpcy5jbSwgcmFuZ2VzLCByYW5nZXMubGVuZ3RoIC0gMSksIG9wdGlvbnMpO1xuICAgIH0pLFxuXG4gICAgZ2V0U2VsZWN0aW9uOiBmdW5jdGlvbihsaW5lU2VwKSB7XG4gICAgICB2YXIgcmFuZ2VzID0gdGhpcy5zZWwucmFuZ2VzLCBsaW5lcztcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBzZWwgPSBnZXRCZXR3ZWVuKHRoaXMsIHJhbmdlc1tpXS5mcm9tKCksIHJhbmdlc1tpXS50bygpKTtcbiAgICAgICAgbGluZXMgPSBsaW5lcyA/IGxpbmVzLmNvbmNhdChzZWwpIDogc2VsO1xuICAgICAgfVxuICAgICAgaWYgKGxpbmVTZXAgPT09IGZhbHNlKSB7IHJldHVybiBsaW5lcyB9XG4gICAgICBlbHNlIHsgcmV0dXJuIGxpbmVzLmpvaW4obGluZVNlcCB8fCB0aGlzLmxpbmVTZXBhcmF0b3IoKSkgfVxuICAgIH0sXG4gICAgZ2V0U2VsZWN0aW9uczogZnVuY3Rpb24obGluZVNlcCkge1xuICAgICAgdmFyIHBhcnRzID0gW10sIHJhbmdlcyA9IHRoaXMuc2VsLnJhbmdlcztcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBzZWwgPSBnZXRCZXR3ZWVuKHRoaXMsIHJhbmdlc1tpXS5mcm9tKCksIHJhbmdlc1tpXS50bygpKTtcbiAgICAgICAgaWYgKGxpbmVTZXAgIT09IGZhbHNlKSB7IHNlbCA9IHNlbC5qb2luKGxpbmVTZXAgfHwgdGhpcy5saW5lU2VwYXJhdG9yKCkpOyB9XG4gICAgICAgIHBhcnRzW2ldID0gc2VsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBhcnRzXG4gICAgfSxcbiAgICByZXBsYWNlU2VsZWN0aW9uOiBmdW5jdGlvbihjb2RlLCBjb2xsYXBzZSwgb3JpZ2luKSB7XG4gICAgICB2YXIgZHVwID0gW107XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc2VsLnJhbmdlcy5sZW5ndGg7IGkrKylcbiAgICAgICAgeyBkdXBbaV0gPSBjb2RlOyB9XG4gICAgICB0aGlzLnJlcGxhY2VTZWxlY3Rpb25zKGR1cCwgY29sbGFwc2UsIG9yaWdpbiB8fCBcIitpbnB1dFwiKTtcbiAgICB9LFxuICAgIHJlcGxhY2VTZWxlY3Rpb25zOiBkb2NNZXRob2RPcChmdW5jdGlvbihjb2RlLCBjb2xsYXBzZSwgb3JpZ2luKSB7XG4gICAgICB2YXIgY2hhbmdlcyA9IFtdLCBzZWwgPSB0aGlzLnNlbDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsLnJhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcmFuZ2UgPSBzZWwucmFuZ2VzW2ldO1xuICAgICAgICBjaGFuZ2VzW2ldID0ge2Zyb206IHJhbmdlLmZyb20oKSwgdG86IHJhbmdlLnRvKCksIHRleHQ6IHRoaXMuc3BsaXRMaW5lcyhjb2RlW2ldKSwgb3JpZ2luOiBvcmlnaW59O1xuICAgICAgfVxuICAgICAgdmFyIG5ld1NlbCA9IGNvbGxhcHNlICYmIGNvbGxhcHNlICE9IFwiZW5kXCIgJiYgY29tcHV0ZVJlcGxhY2VkU2VsKHRoaXMsIGNoYW5nZXMsIGNvbGxhcHNlKTtcbiAgICAgIGZvciAodmFyIGkkMSA9IGNoYW5nZXMubGVuZ3RoIC0gMTsgaSQxID49IDA7IGkkMS0tKVxuICAgICAgICB7IG1ha2VDaGFuZ2UodGhpcywgY2hhbmdlc1tpJDFdKTsgfVxuICAgICAgaWYgKG5ld1NlbCkgeyBzZXRTZWxlY3Rpb25SZXBsYWNlSGlzdG9yeSh0aGlzLCBuZXdTZWwpOyB9XG4gICAgICBlbHNlIGlmICh0aGlzLmNtKSB7IGVuc3VyZUN1cnNvclZpc2libGUodGhpcy5jbSk7IH1cbiAgICB9KSxcbiAgICB1bmRvOiBkb2NNZXRob2RPcChmdW5jdGlvbigpIHttYWtlQ2hhbmdlRnJvbUhpc3RvcnkodGhpcywgXCJ1bmRvXCIpO30pLFxuICAgIHJlZG86IGRvY01ldGhvZE9wKGZ1bmN0aW9uKCkge21ha2VDaGFuZ2VGcm9tSGlzdG9yeSh0aGlzLCBcInJlZG9cIik7fSksXG4gICAgdW5kb1NlbGVjdGlvbjogZG9jTWV0aG9kT3AoZnVuY3Rpb24oKSB7bWFrZUNoYW5nZUZyb21IaXN0b3J5KHRoaXMsIFwidW5kb1wiLCB0cnVlKTt9KSxcbiAgICByZWRvU2VsZWN0aW9uOiBkb2NNZXRob2RPcChmdW5jdGlvbigpIHttYWtlQ2hhbmdlRnJvbUhpc3RvcnkodGhpcywgXCJyZWRvXCIsIHRydWUpO30pLFxuXG4gICAgc2V0RXh0ZW5kaW5nOiBmdW5jdGlvbih2YWwpIHt0aGlzLmV4dGVuZCA9IHZhbDt9LFxuICAgIGdldEV4dGVuZGluZzogZnVuY3Rpb24oKSB7cmV0dXJuIHRoaXMuZXh0ZW5kfSxcblxuICAgIGhpc3RvcnlTaXplOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBoaXN0ID0gdGhpcy5oaXN0b3J5LCBkb25lID0gMCwgdW5kb25lID0gMDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGlzdC5kb25lLmxlbmd0aDsgaSsrKSB7IGlmICghaGlzdC5kb25lW2ldLnJhbmdlcykgeyArK2RvbmU7IH0gfVxuICAgICAgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgaGlzdC51bmRvbmUubGVuZ3RoOyBpJDErKykgeyBpZiAoIWhpc3QudW5kb25lW2kkMV0ucmFuZ2VzKSB7ICsrdW5kb25lOyB9IH1cbiAgICAgIHJldHVybiB7dW5kbzogZG9uZSwgcmVkbzogdW5kb25lfVxuICAgIH0sXG4gICAgY2xlYXJIaXN0b3J5OiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgICB0aGlzLmhpc3RvcnkgPSBuZXcgSGlzdG9yeSh0aGlzLmhpc3RvcnkpO1xuICAgICAgbGlua2VkRG9jcyh0aGlzLCBmdW5jdGlvbiAoZG9jKSB7IHJldHVybiBkb2MuaGlzdG9yeSA9IHRoaXMkMS5oaXN0b3J5OyB9LCB0cnVlKTtcbiAgICB9LFxuXG4gICAgbWFya0NsZWFuOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuY2xlYW5HZW5lcmF0aW9uID0gdGhpcy5jaGFuZ2VHZW5lcmF0aW9uKHRydWUpO1xuICAgIH0sXG4gICAgY2hhbmdlR2VuZXJhdGlvbjogZnVuY3Rpb24oZm9yY2VTcGxpdCkge1xuICAgICAgaWYgKGZvcmNlU3BsaXQpXG4gICAgICAgIHsgdGhpcy5oaXN0b3J5Lmxhc3RPcCA9IHRoaXMuaGlzdG9yeS5sYXN0U2VsT3AgPSB0aGlzLmhpc3RvcnkubGFzdE9yaWdpbiA9IG51bGw7IH1cbiAgICAgIHJldHVybiB0aGlzLmhpc3RvcnkuZ2VuZXJhdGlvblxuICAgIH0sXG4gICAgaXNDbGVhbjogZnVuY3Rpb24gKGdlbikge1xuICAgICAgcmV0dXJuIHRoaXMuaGlzdG9yeS5nZW5lcmF0aW9uID09IChnZW4gfHwgdGhpcy5jbGVhbkdlbmVyYXRpb24pXG4gICAgfSxcblxuICAgIGdldEhpc3Rvcnk6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHtkb25lOiBjb3B5SGlzdG9yeUFycmF5KHRoaXMuaGlzdG9yeS5kb25lKSxcbiAgICAgICAgICAgICAgdW5kb25lOiBjb3B5SGlzdG9yeUFycmF5KHRoaXMuaGlzdG9yeS51bmRvbmUpfVxuICAgIH0sXG4gICAgc2V0SGlzdG9yeTogZnVuY3Rpb24oaGlzdERhdGEpIHtcbiAgICAgIHZhciBoaXN0ID0gdGhpcy5oaXN0b3J5ID0gbmV3IEhpc3RvcnkodGhpcy5oaXN0b3J5KTtcbiAgICAgIGhpc3QuZG9uZSA9IGNvcHlIaXN0b3J5QXJyYXkoaGlzdERhdGEuZG9uZS5zbGljZSgwKSwgbnVsbCwgdHJ1ZSk7XG4gICAgICBoaXN0LnVuZG9uZSA9IGNvcHlIaXN0b3J5QXJyYXkoaGlzdERhdGEudW5kb25lLnNsaWNlKDApLCBudWxsLCB0cnVlKTtcbiAgICB9LFxuXG4gICAgc2V0R3V0dGVyTWFya2VyOiBkb2NNZXRob2RPcChmdW5jdGlvbihsaW5lLCBndXR0ZXJJRCwgdmFsdWUpIHtcbiAgICAgIHJldHVybiBjaGFuZ2VMaW5lKHRoaXMsIGxpbmUsIFwiZ3V0dGVyXCIsIGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgICAgIHZhciBtYXJrZXJzID0gbGluZS5ndXR0ZXJNYXJrZXJzIHx8IChsaW5lLmd1dHRlck1hcmtlcnMgPSB7fSk7XG4gICAgICAgIG1hcmtlcnNbZ3V0dGVySURdID0gdmFsdWU7XG4gICAgICAgIGlmICghdmFsdWUgJiYgaXNFbXB0eShtYXJrZXJzKSkgeyBsaW5lLmd1dHRlck1hcmtlcnMgPSBudWxsOyB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9KVxuICAgIH0pLFxuXG4gICAgY2xlYXJHdXR0ZXI6IGRvY01ldGhvZE9wKGZ1bmN0aW9uKGd1dHRlcklEKSB7XG4gICAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgICAgdGhpcy5pdGVyKGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgICAgIGlmIChsaW5lLmd1dHRlck1hcmtlcnMgJiYgbGluZS5ndXR0ZXJNYXJrZXJzW2d1dHRlcklEXSkge1xuICAgICAgICAgIGNoYW5nZUxpbmUodGhpcyQxLCBsaW5lLCBcImd1dHRlclwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsaW5lLmd1dHRlck1hcmtlcnNbZ3V0dGVySURdID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChpc0VtcHR5KGxpbmUuZ3V0dGVyTWFya2VycykpIHsgbGluZS5ndXR0ZXJNYXJrZXJzID0gbnVsbDsgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSksXG5cbiAgICBsaW5lSW5mbzogZnVuY3Rpb24obGluZSkge1xuICAgICAgdmFyIG47XG4gICAgICBpZiAodHlwZW9mIGxpbmUgPT0gXCJudW1iZXJcIikge1xuICAgICAgICBpZiAoIWlzTGluZSh0aGlzLCBsaW5lKSkgeyByZXR1cm4gbnVsbCB9XG4gICAgICAgIG4gPSBsaW5lO1xuICAgICAgICBsaW5lID0gZ2V0TGluZSh0aGlzLCBsaW5lKTtcbiAgICAgICAgaWYgKCFsaW5lKSB7IHJldHVybiBudWxsIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG4gPSBsaW5lTm8obGluZSk7XG4gICAgICAgIGlmIChuID09IG51bGwpIHsgcmV0dXJuIG51bGwgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHtsaW5lOiBuLCBoYW5kbGU6IGxpbmUsIHRleHQ6IGxpbmUudGV4dCwgZ3V0dGVyTWFya2VyczogbGluZS5ndXR0ZXJNYXJrZXJzLFxuICAgICAgICAgICAgICB0ZXh0Q2xhc3M6IGxpbmUudGV4dENsYXNzLCBiZ0NsYXNzOiBsaW5lLmJnQ2xhc3MsIHdyYXBDbGFzczogbGluZS53cmFwQ2xhc3MsXG4gICAgICAgICAgICAgIHdpZGdldHM6IGxpbmUud2lkZ2V0c31cbiAgICB9LFxuXG4gICAgYWRkTGluZUNsYXNzOiBkb2NNZXRob2RPcChmdW5jdGlvbihoYW5kbGUsIHdoZXJlLCBjbHMpIHtcbiAgICAgIHJldHVybiBjaGFuZ2VMaW5lKHRoaXMsIGhhbmRsZSwgd2hlcmUgPT0gXCJndXR0ZXJcIiA/IFwiZ3V0dGVyXCIgOiBcImNsYXNzXCIsIGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgICAgIHZhciBwcm9wID0gd2hlcmUgPT0gXCJ0ZXh0XCIgPyBcInRleHRDbGFzc1wiXG4gICAgICAgICAgICAgICAgIDogd2hlcmUgPT0gXCJiYWNrZ3JvdW5kXCIgPyBcImJnQ2xhc3NcIlxuICAgICAgICAgICAgICAgICA6IHdoZXJlID09IFwiZ3V0dGVyXCIgPyBcImd1dHRlckNsYXNzXCIgOiBcIndyYXBDbGFzc1wiO1xuICAgICAgICBpZiAoIWxpbmVbcHJvcF0pIHsgbGluZVtwcm9wXSA9IGNsczsgfVxuICAgICAgICBlbHNlIGlmIChjbGFzc1Rlc3QoY2xzKS50ZXN0KGxpbmVbcHJvcF0pKSB7IHJldHVybiBmYWxzZSB9XG4gICAgICAgIGVsc2UgeyBsaW5lW3Byb3BdICs9IFwiIFwiICsgY2xzOyB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9KVxuICAgIH0pLFxuICAgIHJlbW92ZUxpbmVDbGFzczogZG9jTWV0aG9kT3AoZnVuY3Rpb24oaGFuZGxlLCB3aGVyZSwgY2xzKSB7XG4gICAgICByZXR1cm4gY2hhbmdlTGluZSh0aGlzLCBoYW5kbGUsIHdoZXJlID09IFwiZ3V0dGVyXCIgPyBcImd1dHRlclwiIDogXCJjbGFzc1wiLCBmdW5jdGlvbiAobGluZSkge1xuICAgICAgICB2YXIgcHJvcCA9IHdoZXJlID09IFwidGV4dFwiID8gXCJ0ZXh0Q2xhc3NcIlxuICAgICAgICAgICAgICAgICA6IHdoZXJlID09IFwiYmFja2dyb3VuZFwiID8gXCJiZ0NsYXNzXCJcbiAgICAgICAgICAgICAgICAgOiB3aGVyZSA9PSBcImd1dHRlclwiID8gXCJndXR0ZXJDbGFzc1wiIDogXCJ3cmFwQ2xhc3NcIjtcbiAgICAgICAgdmFyIGN1ciA9IGxpbmVbcHJvcF07XG4gICAgICAgIGlmICghY3VyKSB7IHJldHVybiBmYWxzZSB9XG4gICAgICAgIGVsc2UgaWYgKGNscyA9PSBudWxsKSB7IGxpbmVbcHJvcF0gPSBudWxsOyB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHZhciBmb3VuZCA9IGN1ci5tYXRjaChjbGFzc1Rlc3QoY2xzKSk7XG4gICAgICAgICAgaWYgKCFmb3VuZCkgeyByZXR1cm4gZmFsc2UgfVxuICAgICAgICAgIHZhciBlbmQgPSBmb3VuZC5pbmRleCArIGZvdW5kWzBdLmxlbmd0aDtcbiAgICAgICAgICBsaW5lW3Byb3BdID0gY3VyLnNsaWNlKDAsIGZvdW5kLmluZGV4KSArICghZm91bmQuaW5kZXggfHwgZW5kID09IGN1ci5sZW5ndGggPyBcIlwiIDogXCIgXCIpICsgY3VyLnNsaWNlKGVuZCkgfHwgbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSlcbiAgICB9KSxcblxuICAgIGFkZExpbmVXaWRnZXQ6IGRvY01ldGhvZE9wKGZ1bmN0aW9uKGhhbmRsZSwgbm9kZSwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGFkZExpbmVXaWRnZXQodGhpcywgaGFuZGxlLCBub2RlLCBvcHRpb25zKVxuICAgIH0pLFxuICAgIHJlbW92ZUxpbmVXaWRnZXQ6IGZ1bmN0aW9uKHdpZGdldCkgeyB3aWRnZXQuY2xlYXIoKTsgfSxcblxuICAgIG1hcmtUZXh0OiBmdW5jdGlvbihmcm9tLCB0bywgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIG1hcmtUZXh0KHRoaXMsIGNsaXBQb3ModGhpcywgZnJvbSksIGNsaXBQb3ModGhpcywgdG8pLCBvcHRpb25zLCBvcHRpb25zICYmIG9wdGlvbnMudHlwZSB8fCBcInJhbmdlXCIpXG4gICAgfSxcbiAgICBzZXRCb29rbWFyazogZnVuY3Rpb24ocG9zLCBvcHRpb25zKSB7XG4gICAgICB2YXIgcmVhbE9wdHMgPSB7cmVwbGFjZWRXaXRoOiBvcHRpb25zICYmIChvcHRpb25zLm5vZGVUeXBlID09IG51bGwgPyBvcHRpb25zLndpZGdldCA6IG9wdGlvbnMpLFxuICAgICAgICAgICAgICAgICAgICAgIGluc2VydExlZnQ6IG9wdGlvbnMgJiYgb3B0aW9ucy5pbnNlcnRMZWZ0LFxuICAgICAgICAgICAgICAgICAgICAgIGNsZWFyV2hlbkVtcHR5OiBmYWxzZSwgc2hhcmVkOiBvcHRpb25zICYmIG9wdGlvbnMuc2hhcmVkLFxuICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZU1vdXNlRXZlbnRzOiBvcHRpb25zICYmIG9wdGlvbnMuaGFuZGxlTW91c2VFdmVudHN9O1xuICAgICAgcG9zID0gY2xpcFBvcyh0aGlzLCBwb3MpO1xuICAgICAgcmV0dXJuIG1hcmtUZXh0KHRoaXMsIHBvcywgcG9zLCByZWFsT3B0cywgXCJib29rbWFya1wiKVxuICAgIH0sXG4gICAgZmluZE1hcmtzQXQ6IGZ1bmN0aW9uKHBvcykge1xuICAgICAgcG9zID0gY2xpcFBvcyh0aGlzLCBwb3MpO1xuICAgICAgdmFyIG1hcmtlcnMgPSBbXSwgc3BhbnMgPSBnZXRMaW5lKHRoaXMsIHBvcy5saW5lKS5tYXJrZWRTcGFucztcbiAgICAgIGlmIChzcGFucykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBzcGFuID0gc3BhbnNbaV07XG4gICAgICAgIGlmICgoc3Bhbi5mcm9tID09IG51bGwgfHwgc3Bhbi5mcm9tIDw9IHBvcy5jaCkgJiZcbiAgICAgICAgICAgIChzcGFuLnRvID09IG51bGwgfHwgc3Bhbi50byA+PSBwb3MuY2gpKVxuICAgICAgICAgIHsgbWFya2Vycy5wdXNoKHNwYW4ubWFya2VyLnBhcmVudCB8fCBzcGFuLm1hcmtlcik7IH1cbiAgICAgIH0gfVxuICAgICAgcmV0dXJuIG1hcmtlcnNcbiAgICB9LFxuICAgIGZpbmRNYXJrczogZnVuY3Rpb24oZnJvbSwgdG8sIGZpbHRlcikge1xuICAgICAgZnJvbSA9IGNsaXBQb3ModGhpcywgZnJvbSk7IHRvID0gY2xpcFBvcyh0aGlzLCB0byk7XG4gICAgICB2YXIgZm91bmQgPSBbXSwgbGluZU5vID0gZnJvbS5saW5lO1xuICAgICAgdGhpcy5pdGVyKGZyb20ubGluZSwgdG8ubGluZSArIDEsIGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgICAgIHZhciBzcGFucyA9IGxpbmUubWFya2VkU3BhbnM7XG4gICAgICAgIGlmIChzcGFucykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIHNwYW4gPSBzcGFuc1tpXTtcbiAgICAgICAgICBpZiAoIShzcGFuLnRvICE9IG51bGwgJiYgbGluZU5vID09IGZyb20ubGluZSAmJiBmcm9tLmNoID49IHNwYW4udG8gfHxcbiAgICAgICAgICAgICAgICBzcGFuLmZyb20gPT0gbnVsbCAmJiBsaW5lTm8gIT0gZnJvbS5saW5lIHx8XG4gICAgICAgICAgICAgICAgc3Bhbi5mcm9tICE9IG51bGwgJiYgbGluZU5vID09IHRvLmxpbmUgJiYgc3Bhbi5mcm9tID49IHRvLmNoKSAmJlxuICAgICAgICAgICAgICAoIWZpbHRlciB8fCBmaWx0ZXIoc3Bhbi5tYXJrZXIpKSlcbiAgICAgICAgICAgIHsgZm91bmQucHVzaChzcGFuLm1hcmtlci5wYXJlbnQgfHwgc3Bhbi5tYXJrZXIpOyB9XG4gICAgICAgIH0gfVxuICAgICAgICArK2xpbmVObztcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZvdW5kXG4gICAgfSxcbiAgICBnZXRBbGxNYXJrczogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgbWFya2VycyA9IFtdO1xuICAgICAgdGhpcy5pdGVyKGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgICAgIHZhciBzcHMgPSBsaW5lLm1hcmtlZFNwYW5zO1xuICAgICAgICBpZiAoc3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgc3BzLmxlbmd0aDsgKytpKVxuICAgICAgICAgIHsgaWYgKHNwc1tpXS5mcm9tICE9IG51bGwpIHsgbWFya2Vycy5wdXNoKHNwc1tpXS5tYXJrZXIpOyB9IH0gfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbWFya2Vyc1xuICAgIH0sXG5cbiAgICBwb3NGcm9tSW5kZXg6IGZ1bmN0aW9uKG9mZikge1xuICAgICAgdmFyIGNoLCBsaW5lTm8gPSB0aGlzLmZpcnN0LCBzZXBTaXplID0gdGhpcy5saW5lU2VwYXJhdG9yKCkubGVuZ3RoO1xuICAgICAgdGhpcy5pdGVyKGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgICAgIHZhciBzeiA9IGxpbmUudGV4dC5sZW5ndGggKyBzZXBTaXplO1xuICAgICAgICBpZiAoc3ogPiBvZmYpIHsgY2ggPSBvZmY7IHJldHVybiB0cnVlIH1cbiAgICAgICAgb2ZmIC09IHN6O1xuICAgICAgICArK2xpbmVObztcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGNsaXBQb3ModGhpcywgUG9zKGxpbmVObywgY2gpKVxuICAgIH0sXG4gICAgaW5kZXhGcm9tUG9zOiBmdW5jdGlvbiAoY29vcmRzKSB7XG4gICAgICBjb29yZHMgPSBjbGlwUG9zKHRoaXMsIGNvb3Jkcyk7XG4gICAgICB2YXIgaW5kZXggPSBjb29yZHMuY2g7XG4gICAgICBpZiAoY29vcmRzLmxpbmUgPCB0aGlzLmZpcnN0IHx8IGNvb3Jkcy5jaCA8IDApIHsgcmV0dXJuIDAgfVxuICAgICAgdmFyIHNlcFNpemUgPSB0aGlzLmxpbmVTZXBhcmF0b3IoKS5sZW5ndGg7XG4gICAgICB0aGlzLml0ZXIodGhpcy5maXJzdCwgY29vcmRzLmxpbmUsIGZ1bmN0aW9uIChsaW5lKSB7IC8vIGl0ZXIgYWJvcnRzIHdoZW4gY2FsbGJhY2sgcmV0dXJucyBhIHRydXRoeSB2YWx1ZVxuICAgICAgICBpbmRleCArPSBsaW5lLnRleHQubGVuZ3RoICsgc2VwU2l6ZTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGluZGV4XG4gICAgfSxcblxuICAgIGNvcHk6IGZ1bmN0aW9uKGNvcHlIaXN0b3J5KSB7XG4gICAgICB2YXIgZG9jID0gbmV3IERvYyhnZXRMaW5lcyh0aGlzLCB0aGlzLmZpcnN0LCB0aGlzLmZpcnN0ICsgdGhpcy5zaXplKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZU9wdGlvbiwgdGhpcy5maXJzdCwgdGhpcy5saW5lU2VwLCB0aGlzLmRpcmVjdGlvbik7XG4gICAgICBkb2Muc2Nyb2xsVG9wID0gdGhpcy5zY3JvbGxUb3A7IGRvYy5zY3JvbGxMZWZ0ID0gdGhpcy5zY3JvbGxMZWZ0O1xuICAgICAgZG9jLnNlbCA9IHRoaXMuc2VsO1xuICAgICAgZG9jLmV4dGVuZCA9IGZhbHNlO1xuICAgICAgaWYgKGNvcHlIaXN0b3J5KSB7XG4gICAgICAgIGRvYy5oaXN0b3J5LnVuZG9EZXB0aCA9IHRoaXMuaGlzdG9yeS51bmRvRGVwdGg7XG4gICAgICAgIGRvYy5zZXRIaXN0b3J5KHRoaXMuZ2V0SGlzdG9yeSgpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkb2NcbiAgICB9LFxuXG4gICAgbGlua2VkRG9jOiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICBpZiAoIW9wdGlvbnMpIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICB2YXIgZnJvbSA9IHRoaXMuZmlyc3QsIHRvID0gdGhpcy5maXJzdCArIHRoaXMuc2l6ZTtcbiAgICAgIGlmIChvcHRpb25zLmZyb20gIT0gbnVsbCAmJiBvcHRpb25zLmZyb20gPiBmcm9tKSB7IGZyb20gPSBvcHRpb25zLmZyb207IH1cbiAgICAgIGlmIChvcHRpb25zLnRvICE9IG51bGwgJiYgb3B0aW9ucy50byA8IHRvKSB7IHRvID0gb3B0aW9ucy50bzsgfVxuICAgICAgdmFyIGNvcHkgPSBuZXcgRG9jKGdldExpbmVzKHRoaXMsIGZyb20sIHRvKSwgb3B0aW9ucy5tb2RlIHx8IHRoaXMubW9kZU9wdGlvbiwgZnJvbSwgdGhpcy5saW5lU2VwLCB0aGlzLmRpcmVjdGlvbik7XG4gICAgICBpZiAob3B0aW9ucy5zaGFyZWRIaXN0KSB7IGNvcHkuaGlzdG9yeSA9IHRoaXMuaGlzdG9yeVxuICAgICAgOyB9KHRoaXMubGlua2VkIHx8ICh0aGlzLmxpbmtlZCA9IFtdKSkucHVzaCh7ZG9jOiBjb3B5LCBzaGFyZWRIaXN0OiBvcHRpb25zLnNoYXJlZEhpc3R9KTtcbiAgICAgIGNvcHkubGlua2VkID0gW3tkb2M6IHRoaXMsIGlzUGFyZW50OiB0cnVlLCBzaGFyZWRIaXN0OiBvcHRpb25zLnNoYXJlZEhpc3R9XTtcbiAgICAgIGNvcHlTaGFyZWRNYXJrZXJzKGNvcHksIGZpbmRTaGFyZWRNYXJrZXJzKHRoaXMpKTtcbiAgICAgIHJldHVybiBjb3B5XG4gICAgfSxcbiAgICB1bmxpbmtEb2M6IGZ1bmN0aW9uKG90aGVyKSB7XG4gICAgICBpZiAob3RoZXIgaW5zdGFuY2VvZiBDb2RlTWlycm9yKSB7IG90aGVyID0gb3RoZXIuZG9jOyB9XG4gICAgICBpZiAodGhpcy5saW5rZWQpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxpbmtlZC5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgbGluayA9IHRoaXMubGlua2VkW2ldO1xuICAgICAgICBpZiAobGluay5kb2MgIT0gb3RoZXIpIHsgY29udGludWUgfVxuICAgICAgICB0aGlzLmxpbmtlZC5zcGxpY2UoaSwgMSk7XG4gICAgICAgIG90aGVyLnVubGlua0RvYyh0aGlzKTtcbiAgICAgICAgZGV0YWNoU2hhcmVkTWFya2VycyhmaW5kU2hhcmVkTWFya2Vycyh0aGlzKSk7XG4gICAgICAgIGJyZWFrXG4gICAgICB9IH1cbiAgICAgIC8vIElmIHRoZSBoaXN0b3JpZXMgd2VyZSBzaGFyZWQsIHNwbGl0IHRoZW0gYWdhaW5cbiAgICAgIGlmIChvdGhlci5oaXN0b3J5ID09IHRoaXMuaGlzdG9yeSkge1xuICAgICAgICB2YXIgc3BsaXRJZHMgPSBbb3RoZXIuaWRdO1xuICAgICAgICBsaW5rZWREb2NzKG90aGVyLCBmdW5jdGlvbiAoZG9jKSB7IHJldHVybiBzcGxpdElkcy5wdXNoKGRvYy5pZCk7IH0sIHRydWUpO1xuICAgICAgICBvdGhlci5oaXN0b3J5ID0gbmV3IEhpc3RvcnkobnVsbCk7XG4gICAgICAgIG90aGVyLmhpc3RvcnkuZG9uZSA9IGNvcHlIaXN0b3J5QXJyYXkodGhpcy5oaXN0b3J5LmRvbmUsIHNwbGl0SWRzKTtcbiAgICAgICAgb3RoZXIuaGlzdG9yeS51bmRvbmUgPSBjb3B5SGlzdG9yeUFycmF5KHRoaXMuaGlzdG9yeS51bmRvbmUsIHNwbGl0SWRzKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGl0ZXJMaW5rZWREb2NzOiBmdW5jdGlvbihmKSB7bGlua2VkRG9jcyh0aGlzLCBmKTt9LFxuXG4gICAgZ2V0TW9kZTogZnVuY3Rpb24oKSB7cmV0dXJuIHRoaXMubW9kZX0sXG4gICAgZ2V0RWRpdG9yOiBmdW5jdGlvbigpIHtyZXR1cm4gdGhpcy5jbX0sXG5cbiAgICBzcGxpdExpbmVzOiBmdW5jdGlvbihzdHIpIHtcbiAgICAgIGlmICh0aGlzLmxpbmVTZXApIHsgcmV0dXJuIHN0ci5zcGxpdCh0aGlzLmxpbmVTZXApIH1cbiAgICAgIHJldHVybiBzcGxpdExpbmVzQXV0byhzdHIpXG4gICAgfSxcbiAgICBsaW5lU2VwYXJhdG9yOiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMubGluZVNlcCB8fCBcIlxcblwiIH0sXG5cbiAgICBzZXREaXJlY3Rpb246IGRvY01ldGhvZE9wKGZ1bmN0aW9uIChkaXIpIHtcbiAgICAgIGlmIChkaXIgIT0gXCJydGxcIikgeyBkaXIgPSBcImx0clwiOyB9XG4gICAgICBpZiAoZGlyID09IHRoaXMuZGlyZWN0aW9uKSB7IHJldHVybiB9XG4gICAgICB0aGlzLmRpcmVjdGlvbiA9IGRpcjtcbiAgICAgIHRoaXMuaXRlcihmdW5jdGlvbiAobGluZSkgeyByZXR1cm4gbGluZS5vcmRlciA9IG51bGw7IH0pO1xuICAgICAgaWYgKHRoaXMuY20pIHsgZGlyZWN0aW9uQ2hhbmdlZCh0aGlzLmNtKTsgfVxuICAgIH0pXG4gIH0pO1xuXG4gIC8vIFB1YmxpYyBhbGlhcy5cbiAgRG9jLnByb3RvdHlwZS5lYWNoTGluZSA9IERvYy5wcm90b3R5cGUuaXRlcjtcblxuICAvLyBLbHVkZ2UgdG8gd29yayBhcm91bmQgc3RyYW5nZSBJRSBiZWhhdmlvciB3aGVyZSBpdCdsbCBzb21ldGltZXNcbiAgLy8gcmUtZmlyZSBhIHNlcmllcyBvZiBkcmFnLXJlbGF0ZWQgZXZlbnRzIHJpZ2h0IGFmdGVyIHRoZSBkcm9wICgjMTU1MSlcbiAgdmFyIGxhc3REcm9wID0gMDtcblxuICBmdW5jdGlvbiBvbkRyb3AoZSkge1xuICAgIHZhciBjbSA9IHRoaXM7XG4gICAgY2xlYXJEcmFnQ3Vyc29yKGNtKTtcbiAgICBpZiAoc2lnbmFsRE9NRXZlbnQoY20sIGUpIHx8IGV2ZW50SW5XaWRnZXQoY20uZGlzcGxheSwgZSkpXG4gICAgICB7IHJldHVybiB9XG4gICAgZV9wcmV2ZW50RGVmYXVsdChlKTtcbiAgICBpZiAoaWUpIHsgbGFzdERyb3AgPSArbmV3IERhdGU7IH1cbiAgICB2YXIgcG9zID0gcG9zRnJvbU1vdXNlKGNtLCBlLCB0cnVlKSwgZmlsZXMgPSBlLmRhdGFUcmFuc2Zlci5maWxlcztcbiAgICBpZiAoIXBvcyB8fCBjbS5pc1JlYWRPbmx5KCkpIHsgcmV0dXJuIH1cbiAgICAvLyBNaWdodCBiZSBhIGZpbGUgZHJvcCwgaW4gd2hpY2ggY2FzZSB3ZSBzaW1wbHkgZXh0cmFjdCB0aGUgdGV4dFxuICAgIC8vIGFuZCBpbnNlcnQgaXQuXG4gICAgaWYgKGZpbGVzICYmIGZpbGVzLmxlbmd0aCAmJiB3aW5kb3cuRmlsZVJlYWRlciAmJiB3aW5kb3cuRmlsZSkge1xuICAgICAgdmFyIG4gPSBmaWxlcy5sZW5ndGgsIHRleHQgPSBBcnJheShuKSwgcmVhZCA9IDA7XG4gICAgICB2YXIgbWFya0FzUmVhZEFuZFBhc3RlSWZBbGxGaWxlc0FyZVJlYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICgrK3JlYWQgPT0gbikge1xuICAgICAgICAgIG9wZXJhdGlvbihjbSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcG9zID0gY2xpcFBvcyhjbS5kb2MsIHBvcyk7XG4gICAgICAgICAgICB2YXIgY2hhbmdlID0ge2Zyb206IHBvcywgdG86IHBvcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogY20uZG9jLnNwbGl0TGluZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LmZpbHRlcihmdW5jdGlvbiAodCkgeyByZXR1cm4gdCAhPSBudWxsOyB9KS5qb2luKGNtLmRvYy5saW5lU2VwYXJhdG9yKCkpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luOiBcInBhc3RlXCJ9O1xuICAgICAgICAgICAgbWFrZUNoYW5nZShjbS5kb2MsIGNoYW5nZSk7XG4gICAgICAgICAgICBzZXRTZWxlY3Rpb25SZXBsYWNlSGlzdG9yeShjbS5kb2MsIHNpbXBsZVNlbGVjdGlvbihjbGlwUG9zKGNtLmRvYywgcG9zKSwgY2xpcFBvcyhjbS5kb2MsIGNoYW5nZUVuZChjaGFuZ2UpKSkpO1xuICAgICAgICAgIH0pKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB2YXIgcmVhZFRleHRGcm9tRmlsZSA9IGZ1bmN0aW9uIChmaWxlLCBpKSB7XG4gICAgICAgIGlmIChjbS5vcHRpb25zLmFsbG93RHJvcEZpbGVUeXBlcyAmJlxuICAgICAgICAgICAgaW5kZXhPZihjbS5vcHRpb25zLmFsbG93RHJvcEZpbGVUeXBlcywgZmlsZS50eXBlKSA9PSAtMSkge1xuICAgICAgICAgIG1hcmtBc1JlYWRBbmRQYXN0ZUlmQWxsRmlsZXNBcmVSZWFkKCk7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyO1xuICAgICAgICByZWFkZXIub25lcnJvciA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1hcmtBc1JlYWRBbmRQYXN0ZUlmQWxsRmlsZXNBcmVSZWFkKCk7IH07XG4gICAgICAgIHJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIGNvbnRlbnQgPSByZWFkZXIucmVzdWx0O1xuICAgICAgICAgIGlmICgvW1xceDAwLVxceDA4XFx4MGUtXFx4MWZdezJ9Ly50ZXN0KGNvbnRlbnQpKSB7XG4gICAgICAgICAgICBtYXJrQXNSZWFkQW5kUGFzdGVJZkFsbEZpbGVzQXJlUmVhZCgpO1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICAgIHRleHRbaV0gPSBjb250ZW50O1xuICAgICAgICAgIG1hcmtBc1JlYWRBbmRQYXN0ZUlmQWxsRmlsZXNBcmVSZWFkKCk7XG4gICAgICAgIH07XG4gICAgICAgIHJlYWRlci5yZWFkQXNUZXh0KGZpbGUpO1xuICAgICAgfTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsgcmVhZFRleHRGcm9tRmlsZShmaWxlc1tpXSwgaSk7IH1cbiAgICB9IGVsc2UgeyAvLyBOb3JtYWwgZHJvcFxuICAgICAgLy8gRG9uJ3QgZG8gYSByZXBsYWNlIGlmIHRoZSBkcm9wIGhhcHBlbmVkIGluc2lkZSBvZiB0aGUgc2VsZWN0ZWQgdGV4dC5cbiAgICAgIGlmIChjbS5zdGF0ZS5kcmFnZ2luZ1RleHQgJiYgY20uZG9jLnNlbC5jb250YWlucyhwb3MpID4gLTEpIHtcbiAgICAgICAgY20uc3RhdGUuZHJhZ2dpbmdUZXh0KGUpO1xuICAgICAgICAvLyBFbnN1cmUgdGhlIGVkaXRvciBpcyByZS1mb2N1c2VkXG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyByZXR1cm4gY20uZGlzcGxheS5pbnB1dC5mb2N1cygpOyB9LCAyMCk7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIHRleHQkMSA9IGUuZGF0YVRyYW5zZmVyLmdldERhdGEoXCJUZXh0XCIpO1xuICAgICAgICBpZiAodGV4dCQxKSB7XG4gICAgICAgICAgdmFyIHNlbGVjdGVkO1xuICAgICAgICAgIGlmIChjbS5zdGF0ZS5kcmFnZ2luZ1RleHQgJiYgIWNtLnN0YXRlLmRyYWdnaW5nVGV4dC5jb3B5KVxuICAgICAgICAgICAgeyBzZWxlY3RlZCA9IGNtLmxpc3RTZWxlY3Rpb25zKCk7IH1cbiAgICAgICAgICBzZXRTZWxlY3Rpb25Ob1VuZG8oY20uZG9jLCBzaW1wbGVTZWxlY3Rpb24ocG9zLCBwb3MpKTtcbiAgICAgICAgICBpZiAoc2VsZWN0ZWQpIHsgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgc2VsZWN0ZWQubGVuZ3RoOyArK2kkMSlcbiAgICAgICAgICAgIHsgcmVwbGFjZVJhbmdlKGNtLmRvYywgXCJcIiwgc2VsZWN0ZWRbaSQxXS5hbmNob3IsIHNlbGVjdGVkW2kkMV0uaGVhZCwgXCJkcmFnXCIpOyB9IH1cbiAgICAgICAgICBjbS5yZXBsYWNlU2VsZWN0aW9uKHRleHQkMSwgXCJhcm91bmRcIiwgXCJwYXN0ZVwiKTtcbiAgICAgICAgICBjbS5kaXNwbGF5LmlucHV0LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNhdGNoKGUkMSl7fVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uRHJhZ1N0YXJ0KGNtLCBlKSB7XG4gICAgaWYgKGllICYmICghY20uc3RhdGUuZHJhZ2dpbmdUZXh0IHx8ICtuZXcgRGF0ZSAtIGxhc3REcm9wIDwgMTAwKSkgeyBlX3N0b3AoZSk7IHJldHVybiB9XG4gICAgaWYgKHNpZ25hbERPTUV2ZW50KGNtLCBlKSB8fCBldmVudEluV2lkZ2V0KGNtLmRpc3BsYXksIGUpKSB7IHJldHVybiB9XG5cbiAgICBlLmRhdGFUcmFuc2Zlci5zZXREYXRhKFwiVGV4dFwiLCBjbS5nZXRTZWxlY3Rpb24oKSk7XG4gICAgZS5kYXRhVHJhbnNmZXIuZWZmZWN0QWxsb3dlZCA9IFwiY29weU1vdmVcIjtcblxuICAgIC8vIFVzZSBkdW1teSBpbWFnZSBpbnN0ZWFkIG9mIGRlZmF1bHQgYnJvd3NlcnMgaW1hZ2UuXG4gICAgLy8gUmVjZW50IFNhZmFyaSAofjYuMC4yKSBoYXZlIGEgdGVuZGVuY3kgdG8gc2VnZmF1bHQgd2hlbiB0aGlzIGhhcHBlbnMsIHNvIHdlIGRvbid0IGRvIGl0IHRoZXJlLlxuICAgIGlmIChlLmRhdGFUcmFuc2Zlci5zZXREcmFnSW1hZ2UgJiYgIXNhZmFyaSkge1xuICAgICAgdmFyIGltZyA9IGVsdChcImltZ1wiLCBudWxsLCBudWxsLCBcInBvc2l0aW9uOiBmaXhlZDsgbGVmdDogMDsgdG9wOiAwO1wiKTtcbiAgICAgIGltZy5zcmMgPSBcImRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQUJBQUFBQUNINUJBRUtBQUVBTEFBQUFBQUJBQUVBQUFJQ1RBRUFPdz09XCI7XG4gICAgICBpZiAocHJlc3RvKSB7XG4gICAgICAgIGltZy53aWR0aCA9IGltZy5oZWlnaHQgPSAxO1xuICAgICAgICBjbS5kaXNwbGF5LndyYXBwZXIuYXBwZW5kQ2hpbGQoaW1nKTtcbiAgICAgICAgLy8gRm9yY2UgYSByZWxheW91dCwgb3IgT3BlcmEgd29uJ3QgdXNlIG91ciBpbWFnZSBmb3Igc29tZSBvYnNjdXJlIHJlYXNvblxuICAgICAgICBpbWcuX3RvcCA9IGltZy5vZmZzZXRUb3A7XG4gICAgICB9XG4gICAgICBlLmRhdGFUcmFuc2Zlci5zZXREcmFnSW1hZ2UoaW1nLCAwLCAwKTtcbiAgICAgIGlmIChwcmVzdG8pIHsgaW1nLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoaW1nKTsgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uRHJhZ092ZXIoY20sIGUpIHtcbiAgICB2YXIgcG9zID0gcG9zRnJvbU1vdXNlKGNtLCBlKTtcbiAgICBpZiAoIXBvcykgeyByZXR1cm4gfVxuICAgIHZhciBmcmFnID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuICAgIGRyYXdTZWxlY3Rpb25DdXJzb3IoY20sIHBvcywgZnJhZyk7XG4gICAgaWYgKCFjbS5kaXNwbGF5LmRyYWdDdXJzb3IpIHtcbiAgICAgIGNtLmRpc3BsYXkuZHJhZ0N1cnNvciA9IGVsdChcImRpdlwiLCBudWxsLCBcIkNvZGVNaXJyb3ItY3Vyc29ycyBDb2RlTWlycm9yLWRyYWdjdXJzb3JzXCIpO1xuICAgICAgY20uZGlzcGxheS5saW5lU3BhY2UuaW5zZXJ0QmVmb3JlKGNtLmRpc3BsYXkuZHJhZ0N1cnNvciwgY20uZGlzcGxheS5jdXJzb3JEaXYpO1xuICAgIH1cbiAgICByZW1vdmVDaGlsZHJlbkFuZEFkZChjbS5kaXNwbGF5LmRyYWdDdXJzb3IsIGZyYWcpO1xuICB9XG5cbiAgZnVuY3Rpb24gY2xlYXJEcmFnQ3Vyc29yKGNtKSB7XG4gICAgaWYgKGNtLmRpc3BsYXkuZHJhZ0N1cnNvcikge1xuICAgICAgY20uZGlzcGxheS5saW5lU3BhY2UucmVtb3ZlQ2hpbGQoY20uZGlzcGxheS5kcmFnQ3Vyc29yKTtcbiAgICAgIGNtLmRpc3BsYXkuZHJhZ0N1cnNvciA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhlc2UgbXVzdCBiZSBoYW5kbGVkIGNhcmVmdWxseSwgYmVjYXVzZSBuYWl2ZWx5IHJlZ2lzdGVyaW5nIGFcbiAgLy8gaGFuZGxlciBmb3IgZWFjaCBlZGl0b3Igd2lsbCBjYXVzZSB0aGUgZWRpdG9ycyB0byBuZXZlciBiZVxuICAvLyBnYXJiYWdlIGNvbGxlY3RlZC5cblxuICBmdW5jdGlvbiBmb3JFYWNoQ29kZU1pcnJvcihmKSB7XG4gICAgaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSB7IHJldHVybiB9XG4gICAgdmFyIGJ5Q2xhc3MgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwiQ29kZU1pcnJvclwiKSwgZWRpdG9ycyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnlDbGFzcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNtID0gYnlDbGFzc1tpXS5Db2RlTWlycm9yO1xuICAgICAgaWYgKGNtKSB7IGVkaXRvcnMucHVzaChjbSk7IH1cbiAgICB9XG4gICAgaWYgKGVkaXRvcnMubGVuZ3RoKSB7IGVkaXRvcnNbMF0ub3BlcmF0aW9uKGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWRpdG9ycy5sZW5ndGg7IGkrKykgeyBmKGVkaXRvcnNbaV0pOyB9XG4gICAgfSk7IH1cbiAgfVxuXG4gIHZhciBnbG9iYWxzUmVnaXN0ZXJlZCA9IGZhbHNlO1xuICBmdW5jdGlvbiBlbnN1cmVHbG9iYWxIYW5kbGVycygpIHtcbiAgICBpZiAoZ2xvYmFsc1JlZ2lzdGVyZWQpIHsgcmV0dXJuIH1cbiAgICByZWdpc3Rlckdsb2JhbEhhbmRsZXJzKCk7XG4gICAgZ2xvYmFsc1JlZ2lzdGVyZWQgPSB0cnVlO1xuICB9XG4gIGZ1bmN0aW9uIHJlZ2lzdGVyR2xvYmFsSGFuZGxlcnMoKSB7XG4gICAgLy8gV2hlbiB0aGUgd2luZG93IHJlc2l6ZXMsIHdlIG5lZWQgdG8gcmVmcmVzaCBhY3RpdmUgZWRpdG9ycy5cbiAgICB2YXIgcmVzaXplVGltZXI7XG4gICAgb24od2luZG93LCBcInJlc2l6ZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAocmVzaXplVGltZXIgPT0gbnVsbCkgeyByZXNpemVUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXNpemVUaW1lciA9IG51bGw7XG4gICAgICAgIGZvckVhY2hDb2RlTWlycm9yKG9uUmVzaXplKTtcbiAgICAgIH0sIDEwMCk7IH1cbiAgICB9KTtcbiAgICAvLyBXaGVuIHRoZSB3aW5kb3cgbG9zZXMgZm9jdXMsIHdlIHdhbnQgdG8gc2hvdyB0aGUgZWRpdG9yIGFzIGJsdXJyZWRcbiAgICBvbih3aW5kb3csIFwiYmx1clwiLCBmdW5jdGlvbiAoKSB7IHJldHVybiBmb3JFYWNoQ29kZU1pcnJvcihvbkJsdXIpOyB9KTtcbiAgfVxuICAvLyBDYWxsZWQgd2hlbiB0aGUgd2luZG93IHJlc2l6ZXNcbiAgZnVuY3Rpb24gb25SZXNpemUoY20pIHtcbiAgICB2YXIgZCA9IGNtLmRpc3BsYXk7XG4gICAgLy8gTWlnaHQgYmUgYSB0ZXh0IHNjYWxpbmcgb3BlcmF0aW9uLCBjbGVhciBzaXplIGNhY2hlcy5cbiAgICBkLmNhY2hlZENoYXJXaWR0aCA9IGQuY2FjaGVkVGV4dEhlaWdodCA9IGQuY2FjaGVkUGFkZGluZ0ggPSBudWxsO1xuICAgIGQuc2Nyb2xsYmFyc0NsaXBwZWQgPSBmYWxzZTtcbiAgICBjbS5zZXRTaXplKCk7XG4gIH1cblxuICB2YXIga2V5TmFtZXMgPSB7XG4gICAgMzogXCJQYXVzZVwiLCA4OiBcIkJhY2tzcGFjZVwiLCA5OiBcIlRhYlwiLCAxMzogXCJFbnRlclwiLCAxNjogXCJTaGlmdFwiLCAxNzogXCJDdHJsXCIsIDE4OiBcIkFsdFwiLFxuICAgIDE5OiBcIlBhdXNlXCIsIDIwOiBcIkNhcHNMb2NrXCIsIDI3OiBcIkVzY1wiLCAzMjogXCJTcGFjZVwiLCAzMzogXCJQYWdlVXBcIiwgMzQ6IFwiUGFnZURvd25cIiwgMzU6IFwiRW5kXCIsXG4gICAgMzY6IFwiSG9tZVwiLCAzNzogXCJMZWZ0XCIsIDM4OiBcIlVwXCIsIDM5OiBcIlJpZ2h0XCIsIDQwOiBcIkRvd25cIiwgNDQ6IFwiUHJpbnRTY3JuXCIsIDQ1OiBcIkluc2VydFwiLFxuICAgIDQ2OiBcIkRlbGV0ZVwiLCA1OTogXCI7XCIsIDYxOiBcIj1cIiwgOTE6IFwiTW9kXCIsIDkyOiBcIk1vZFwiLCA5MzogXCJNb2RcIixcbiAgICAxMDY6IFwiKlwiLCAxMDc6IFwiPVwiLCAxMDk6IFwiLVwiLCAxMTA6IFwiLlwiLCAxMTE6IFwiL1wiLCAxNDU6IFwiU2Nyb2xsTG9ja1wiLFxuICAgIDE3MzogXCItXCIsIDE4NjogXCI7XCIsIDE4NzogXCI9XCIsIDE4ODogXCIsXCIsIDE4OTogXCItXCIsIDE5MDogXCIuXCIsIDE5MTogXCIvXCIsIDE5MjogXCJgXCIsIDIxOTogXCJbXCIsIDIyMDogXCJcXFxcXCIsXG4gICAgMjIxOiBcIl1cIiwgMjIyOiBcIidcIiwgMjI0OiBcIk1vZFwiLCA2MzIzMjogXCJVcFwiLCA2MzIzMzogXCJEb3duXCIsIDYzMjM0OiBcIkxlZnRcIiwgNjMyMzU6IFwiUmlnaHRcIiwgNjMyNzI6IFwiRGVsZXRlXCIsXG4gICAgNjMyNzM6IFwiSG9tZVwiLCA2MzI3NTogXCJFbmRcIiwgNjMyNzY6IFwiUGFnZVVwXCIsIDYzMjc3OiBcIlBhZ2VEb3duXCIsIDYzMzAyOiBcIkluc2VydFwiXG4gIH07XG5cbiAgLy8gTnVtYmVyIGtleXNcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAxMDsgaSsrKSB7IGtleU5hbWVzW2kgKyA0OF0gPSBrZXlOYW1lc1tpICsgOTZdID0gU3RyaW5nKGkpOyB9XG4gIC8vIEFscGhhYmV0aWMga2V5c1xuICBmb3IgKHZhciBpJDEgPSA2NTsgaSQxIDw9IDkwOyBpJDErKykgeyBrZXlOYW1lc1tpJDFdID0gU3RyaW5nLmZyb21DaGFyQ29kZShpJDEpOyB9XG4gIC8vIEZ1bmN0aW9uIGtleXNcbiAgZm9yICh2YXIgaSQyID0gMTsgaSQyIDw9IDEyOyBpJDIrKykgeyBrZXlOYW1lc1tpJDIgKyAxMTFdID0ga2V5TmFtZXNbaSQyICsgNjMyMzVdID0gXCJGXCIgKyBpJDI7IH1cblxuICB2YXIga2V5TWFwID0ge307XG5cbiAga2V5TWFwLmJhc2ljID0ge1xuICAgIFwiTGVmdFwiOiBcImdvQ2hhckxlZnRcIiwgXCJSaWdodFwiOiBcImdvQ2hhclJpZ2h0XCIsIFwiVXBcIjogXCJnb0xpbmVVcFwiLCBcIkRvd25cIjogXCJnb0xpbmVEb3duXCIsXG4gICAgXCJFbmRcIjogXCJnb0xpbmVFbmRcIiwgXCJIb21lXCI6IFwiZ29MaW5lU3RhcnRTbWFydFwiLCBcIlBhZ2VVcFwiOiBcImdvUGFnZVVwXCIsIFwiUGFnZURvd25cIjogXCJnb1BhZ2VEb3duXCIsXG4gICAgXCJEZWxldGVcIjogXCJkZWxDaGFyQWZ0ZXJcIiwgXCJCYWNrc3BhY2VcIjogXCJkZWxDaGFyQmVmb3JlXCIsIFwiU2hpZnQtQmFja3NwYWNlXCI6IFwiZGVsQ2hhckJlZm9yZVwiLFxuICAgIFwiVGFiXCI6IFwiZGVmYXVsdFRhYlwiLCBcIlNoaWZ0LVRhYlwiOiBcImluZGVudEF1dG9cIixcbiAgICBcIkVudGVyXCI6IFwibmV3bGluZUFuZEluZGVudFwiLCBcIkluc2VydFwiOiBcInRvZ2dsZU92ZXJ3cml0ZVwiLFxuICAgIFwiRXNjXCI6IFwic2luZ2xlU2VsZWN0aW9uXCJcbiAgfTtcbiAgLy8gTm90ZSB0aGF0IHRoZSBzYXZlIGFuZCBmaW5kLXJlbGF0ZWQgY29tbWFuZHMgYXJlbid0IGRlZmluZWQgYnlcbiAgLy8gZGVmYXVsdC4gVXNlciBjb2RlIG9yIGFkZG9ucyBjYW4gZGVmaW5lIHRoZW0uIFVua25vd24gY29tbWFuZHNcbiAgLy8gYXJlIHNpbXBseSBpZ25vcmVkLlxuICBrZXlNYXAucGNEZWZhdWx0ID0ge1xuICAgIFwiQ3RybC1BXCI6IFwic2VsZWN0QWxsXCIsIFwiQ3RybC1EXCI6IFwiZGVsZXRlTGluZVwiLCBcIkN0cmwtWlwiOiBcInVuZG9cIiwgXCJTaGlmdC1DdHJsLVpcIjogXCJyZWRvXCIsIFwiQ3RybC1ZXCI6IFwicmVkb1wiLFxuICAgIFwiQ3RybC1Ib21lXCI6IFwiZ29Eb2NTdGFydFwiLCBcIkN0cmwtRW5kXCI6IFwiZ29Eb2NFbmRcIiwgXCJDdHJsLVVwXCI6IFwiZ29MaW5lVXBcIiwgXCJDdHJsLURvd25cIjogXCJnb0xpbmVEb3duXCIsXG4gICAgXCJDdHJsLUxlZnRcIjogXCJnb0dyb3VwTGVmdFwiLCBcIkN0cmwtUmlnaHRcIjogXCJnb0dyb3VwUmlnaHRcIiwgXCJBbHQtTGVmdFwiOiBcImdvTGluZVN0YXJ0XCIsIFwiQWx0LVJpZ2h0XCI6IFwiZ29MaW5lRW5kXCIsXG4gICAgXCJDdHJsLUJhY2tzcGFjZVwiOiBcImRlbEdyb3VwQmVmb3JlXCIsIFwiQ3RybC1EZWxldGVcIjogXCJkZWxHcm91cEFmdGVyXCIsIFwiQ3RybC1TXCI6IFwic2F2ZVwiLCBcIkN0cmwtRlwiOiBcImZpbmRcIixcbiAgICBcIkN0cmwtR1wiOiBcImZpbmROZXh0XCIsIFwiU2hpZnQtQ3RybC1HXCI6IFwiZmluZFByZXZcIiwgXCJTaGlmdC1DdHJsLUZcIjogXCJyZXBsYWNlXCIsIFwiU2hpZnQtQ3RybC1SXCI6IFwicmVwbGFjZUFsbFwiLFxuICAgIFwiQ3RybC1bXCI6IFwiaW5kZW50TGVzc1wiLCBcIkN0cmwtXVwiOiBcImluZGVudE1vcmVcIixcbiAgICBcIkN0cmwtVVwiOiBcInVuZG9TZWxlY3Rpb25cIiwgXCJTaGlmdC1DdHJsLVVcIjogXCJyZWRvU2VsZWN0aW9uXCIsIFwiQWx0LVVcIjogXCJyZWRvU2VsZWN0aW9uXCIsXG4gICAgXCJmYWxsdGhyb3VnaFwiOiBcImJhc2ljXCJcbiAgfTtcbiAgLy8gVmVyeSBiYXNpYyByZWFkbGluZS9lbWFjcy1zdHlsZSBiaW5kaW5ncywgd2hpY2ggYXJlIHN0YW5kYXJkIG9uIE1hYy5cbiAga2V5TWFwLmVtYWNzeSA9IHtcbiAgICBcIkN0cmwtRlwiOiBcImdvQ2hhclJpZ2h0XCIsIFwiQ3RybC1CXCI6IFwiZ29DaGFyTGVmdFwiLCBcIkN0cmwtUFwiOiBcImdvTGluZVVwXCIsIFwiQ3RybC1OXCI6IFwiZ29MaW5lRG93blwiLFxuICAgIFwiQ3RybC1BXCI6IFwiZ29MaW5lU3RhcnRcIiwgXCJDdHJsLUVcIjogXCJnb0xpbmVFbmRcIiwgXCJDdHJsLVZcIjogXCJnb1BhZ2VEb3duXCIsIFwiU2hpZnQtQ3RybC1WXCI6IFwiZ29QYWdlVXBcIixcbiAgICBcIkN0cmwtRFwiOiBcImRlbENoYXJBZnRlclwiLCBcIkN0cmwtSFwiOiBcImRlbENoYXJCZWZvcmVcIiwgXCJBbHQtQmFja3NwYWNlXCI6IFwiZGVsV29yZEJlZm9yZVwiLCBcIkN0cmwtS1wiOiBcImtpbGxMaW5lXCIsXG4gICAgXCJDdHJsLVRcIjogXCJ0cmFuc3Bvc2VDaGFyc1wiLCBcIkN0cmwtT1wiOiBcIm9wZW5MaW5lXCJcbiAgfTtcbiAga2V5TWFwLm1hY0RlZmF1bHQgPSB7XG4gICAgXCJDbWQtQVwiOiBcInNlbGVjdEFsbFwiLCBcIkNtZC1EXCI6IFwiZGVsZXRlTGluZVwiLCBcIkNtZC1aXCI6IFwidW5kb1wiLCBcIlNoaWZ0LUNtZC1aXCI6IFwicmVkb1wiLCBcIkNtZC1ZXCI6IFwicmVkb1wiLFxuICAgIFwiQ21kLUhvbWVcIjogXCJnb0RvY1N0YXJ0XCIsIFwiQ21kLVVwXCI6IFwiZ29Eb2NTdGFydFwiLCBcIkNtZC1FbmRcIjogXCJnb0RvY0VuZFwiLCBcIkNtZC1Eb3duXCI6IFwiZ29Eb2NFbmRcIiwgXCJBbHQtTGVmdFwiOiBcImdvR3JvdXBMZWZ0XCIsXG4gICAgXCJBbHQtUmlnaHRcIjogXCJnb0dyb3VwUmlnaHRcIiwgXCJDbWQtTGVmdFwiOiBcImdvTGluZUxlZnRcIiwgXCJDbWQtUmlnaHRcIjogXCJnb0xpbmVSaWdodFwiLCBcIkFsdC1CYWNrc3BhY2VcIjogXCJkZWxHcm91cEJlZm9yZVwiLFxuICAgIFwiQ3RybC1BbHQtQmFja3NwYWNlXCI6IFwiZGVsR3JvdXBBZnRlclwiLCBcIkFsdC1EZWxldGVcIjogXCJkZWxHcm91cEFmdGVyXCIsIFwiQ21kLVNcIjogXCJzYXZlXCIsIFwiQ21kLUZcIjogXCJmaW5kXCIsXG4gICAgXCJDbWQtR1wiOiBcImZpbmROZXh0XCIsIFwiU2hpZnQtQ21kLUdcIjogXCJmaW5kUHJldlwiLCBcIkNtZC1BbHQtRlwiOiBcInJlcGxhY2VcIiwgXCJTaGlmdC1DbWQtQWx0LUZcIjogXCJyZXBsYWNlQWxsXCIsXG4gICAgXCJDbWQtW1wiOiBcImluZGVudExlc3NcIiwgXCJDbWQtXVwiOiBcImluZGVudE1vcmVcIiwgXCJDbWQtQmFja3NwYWNlXCI6IFwiZGVsV3JhcHBlZExpbmVMZWZ0XCIsIFwiQ21kLURlbGV0ZVwiOiBcImRlbFdyYXBwZWRMaW5lUmlnaHRcIixcbiAgICBcIkNtZC1VXCI6IFwidW5kb1NlbGVjdGlvblwiLCBcIlNoaWZ0LUNtZC1VXCI6IFwicmVkb1NlbGVjdGlvblwiLCBcIkN0cmwtVXBcIjogXCJnb0RvY1N0YXJ0XCIsIFwiQ3RybC1Eb3duXCI6IFwiZ29Eb2NFbmRcIixcbiAgICBcImZhbGx0aHJvdWdoXCI6IFtcImJhc2ljXCIsIFwiZW1hY3N5XCJdXG4gIH07XG4gIGtleU1hcFtcImRlZmF1bHRcIl0gPSBtYWMgPyBrZXlNYXAubWFjRGVmYXVsdCA6IGtleU1hcC5wY0RlZmF1bHQ7XG5cbiAgLy8gS0VZTUFQIERJU1BBVENIXG5cbiAgZnVuY3Rpb24gbm9ybWFsaXplS2V5TmFtZShuYW1lKSB7XG4gICAgdmFyIHBhcnRzID0gbmFtZS5zcGxpdCgvLSg/ISQpLyk7XG4gICAgbmFtZSA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdO1xuICAgIHZhciBhbHQsIGN0cmwsIHNoaWZ0LCBjbWQ7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgIHZhciBtb2QgPSBwYXJ0c1tpXTtcbiAgICAgIGlmICgvXihjbWR8bWV0YXxtKSQvaS50ZXN0KG1vZCkpIHsgY21kID0gdHJ1ZTsgfVxuICAgICAgZWxzZSBpZiAoL15hKGx0KT8kL2kudGVzdChtb2QpKSB7IGFsdCA9IHRydWU7IH1cbiAgICAgIGVsc2UgaWYgKC9eKGN8Y3RybHxjb250cm9sKSQvaS50ZXN0KG1vZCkpIHsgY3RybCA9IHRydWU7IH1cbiAgICAgIGVsc2UgaWYgKC9ecyhoaWZ0KT8kL2kudGVzdChtb2QpKSB7IHNoaWZ0ID0gdHJ1ZTsgfVxuICAgICAgZWxzZSB7IHRocm93IG5ldyBFcnJvcihcIlVucmVjb2duaXplZCBtb2RpZmllciBuYW1lOiBcIiArIG1vZCkgfVxuICAgIH1cbiAgICBpZiAoYWx0KSB7IG5hbWUgPSBcIkFsdC1cIiArIG5hbWU7IH1cbiAgICBpZiAoY3RybCkgeyBuYW1lID0gXCJDdHJsLVwiICsgbmFtZTsgfVxuICAgIGlmIChjbWQpIHsgbmFtZSA9IFwiQ21kLVwiICsgbmFtZTsgfVxuICAgIGlmIChzaGlmdCkgeyBuYW1lID0gXCJTaGlmdC1cIiArIG5hbWU7IH1cbiAgICByZXR1cm4gbmFtZVxuICB9XG5cbiAgLy8gVGhpcyBpcyBhIGtsdWRnZSB0byBrZWVwIGtleW1hcHMgbW9zdGx5IHdvcmtpbmcgYXMgcmF3IG9iamVjdHNcbiAgLy8gKGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5KSB3aGlsZSBhdCB0aGUgc2FtZSB0aW1lIHN1cHBvcnQgZmVhdHVyZXNcbiAgLy8gbGlrZSBub3JtYWxpemF0aW9uIGFuZCBtdWx0aS1zdHJva2Uga2V5IGJpbmRpbmdzLiBJdCBjb21waWxlcyBhXG4gIC8vIG5ldyBub3JtYWxpemVkIGtleW1hcCwgYW5kIHRoZW4gdXBkYXRlcyB0aGUgb2xkIG9iamVjdCB0byByZWZsZWN0XG4gIC8vIHRoaXMuXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZUtleU1hcChrZXltYXApIHtcbiAgICB2YXIgY29weSA9IHt9O1xuICAgIGZvciAodmFyIGtleW5hbWUgaW4ga2V5bWFwKSB7IGlmIChrZXltYXAuaGFzT3duUHJvcGVydHkoa2V5bmFtZSkpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGtleW1hcFtrZXluYW1lXTtcbiAgICAgIGlmICgvXihuYW1lfGZhbGx0aHJvdWdofChkZXxhdCl0YWNoKSQvLnRlc3Qoa2V5bmFtZSkpIHsgY29udGludWUgfVxuICAgICAgaWYgKHZhbHVlID09IFwiLi4uXCIpIHsgZGVsZXRlIGtleW1hcFtrZXluYW1lXTsgY29udGludWUgfVxuXG4gICAgICB2YXIga2V5cyA9IG1hcChrZXluYW1lLnNwbGl0KFwiIFwiKSwgbm9ybWFsaXplS2V5TmFtZSk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHZhbCA9ICh2b2lkIDApLCBuYW1lID0gKHZvaWQgMCk7XG4gICAgICAgIGlmIChpID09IGtleXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIG5hbWUgPSBrZXlzLmpvaW4oXCIgXCIpO1xuICAgICAgICAgIHZhbCA9IHZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5hbWUgPSBrZXlzLnNsaWNlKDAsIGkgKyAxKS5qb2luKFwiIFwiKTtcbiAgICAgICAgICB2YWwgPSBcIi4uLlwiO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwcmV2ID0gY29weVtuYW1lXTtcbiAgICAgICAgaWYgKCFwcmV2KSB7IGNvcHlbbmFtZV0gPSB2YWw7IH1cbiAgICAgICAgZWxzZSBpZiAocHJldiAhPSB2YWwpIHsgdGhyb3cgbmV3IEVycm9yKFwiSW5jb25zaXN0ZW50IGJpbmRpbmdzIGZvciBcIiArIG5hbWUpIH1cbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBrZXltYXBba2V5bmFtZV07XG4gICAgfSB9XG4gICAgZm9yICh2YXIgcHJvcCBpbiBjb3B5KSB7IGtleW1hcFtwcm9wXSA9IGNvcHlbcHJvcF07IH1cbiAgICByZXR1cm4ga2V5bWFwXG4gIH1cblxuICBmdW5jdGlvbiBsb29rdXBLZXkoa2V5LCBtYXAsIGhhbmRsZSwgY29udGV4dCkge1xuICAgIG1hcCA9IGdldEtleU1hcChtYXApO1xuICAgIHZhciBmb3VuZCA9IG1hcC5jYWxsID8gbWFwLmNhbGwoa2V5LCBjb250ZXh0KSA6IG1hcFtrZXldO1xuICAgIGlmIChmb3VuZCA9PT0gZmFsc2UpIHsgcmV0dXJuIFwibm90aGluZ1wiIH1cbiAgICBpZiAoZm91bmQgPT09IFwiLi4uXCIpIHsgcmV0dXJuIFwibXVsdGlcIiB9XG4gICAgaWYgKGZvdW5kICE9IG51bGwgJiYgaGFuZGxlKGZvdW5kKSkgeyByZXR1cm4gXCJoYW5kbGVkXCIgfVxuXG4gICAgaWYgKG1hcC5mYWxsdGhyb3VnaCkge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChtYXAuZmFsbHRocm91Z2gpICE9IFwiW29iamVjdCBBcnJheV1cIilcbiAgICAgICAgeyByZXR1cm4gbG9va3VwS2V5KGtleSwgbWFwLmZhbGx0aHJvdWdoLCBoYW5kbGUsIGNvbnRleHQpIH1cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFwLmZhbGx0aHJvdWdoLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBsb29rdXBLZXkoa2V5LCBtYXAuZmFsbHRocm91Z2hbaV0sIGhhbmRsZSwgY29udGV4dCk7XG4gICAgICAgIGlmIChyZXN1bHQpIHsgcmV0dXJuIHJlc3VsdCB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gTW9kaWZpZXIga2V5IHByZXNzZXMgZG9uJ3QgY291bnQgYXMgJ3JlYWwnIGtleSBwcmVzc2VzIGZvciB0aGVcbiAgLy8gcHVycG9zZSBvZiBrZXltYXAgZmFsbHRocm91Z2guXG4gIGZ1bmN0aW9uIGlzTW9kaWZpZXJLZXkodmFsdWUpIHtcbiAgICB2YXIgbmFtZSA9IHR5cGVvZiB2YWx1ZSA9PSBcInN0cmluZ1wiID8gdmFsdWUgOiBrZXlOYW1lc1t2YWx1ZS5rZXlDb2RlXTtcbiAgICByZXR1cm4gbmFtZSA9PSBcIkN0cmxcIiB8fCBuYW1lID09IFwiQWx0XCIgfHwgbmFtZSA9PSBcIlNoaWZ0XCIgfHwgbmFtZSA9PSBcIk1vZFwiXG4gIH1cblxuICBmdW5jdGlvbiBhZGRNb2RpZmllck5hbWVzKG5hbWUsIGV2ZW50LCBub1NoaWZ0KSB7XG4gICAgdmFyIGJhc2UgPSBuYW1lO1xuICAgIGlmIChldmVudC5hbHRLZXkgJiYgYmFzZSAhPSBcIkFsdFwiKSB7IG5hbWUgPSBcIkFsdC1cIiArIG5hbWU7IH1cbiAgICBpZiAoKGZsaXBDdHJsQ21kID8gZXZlbnQubWV0YUtleSA6IGV2ZW50LmN0cmxLZXkpICYmIGJhc2UgIT0gXCJDdHJsXCIpIHsgbmFtZSA9IFwiQ3RybC1cIiArIG5hbWU7IH1cbiAgICBpZiAoKGZsaXBDdHJsQ21kID8gZXZlbnQuY3RybEtleSA6IGV2ZW50Lm1ldGFLZXkpICYmIGJhc2UgIT0gXCJNb2RcIikgeyBuYW1lID0gXCJDbWQtXCIgKyBuYW1lOyB9XG4gICAgaWYgKCFub1NoaWZ0ICYmIGV2ZW50LnNoaWZ0S2V5ICYmIGJhc2UgIT0gXCJTaGlmdFwiKSB7IG5hbWUgPSBcIlNoaWZ0LVwiICsgbmFtZTsgfVxuICAgIHJldHVybiBuYW1lXG4gIH1cblxuICAvLyBMb29rIHVwIHRoZSBuYW1lIG9mIGEga2V5IGFzIGluZGljYXRlZCBieSBhbiBldmVudCBvYmplY3QuXG4gIGZ1bmN0aW9uIGtleU5hbWUoZXZlbnQsIG5vU2hpZnQpIHtcbiAgICBpZiAocHJlc3RvICYmIGV2ZW50LmtleUNvZGUgPT0gMzQgJiYgZXZlbnRbXCJjaGFyXCJdKSB7IHJldHVybiBmYWxzZSB9XG4gICAgdmFyIG5hbWUgPSBrZXlOYW1lc1tldmVudC5rZXlDb2RlXTtcbiAgICBpZiAobmFtZSA9PSBudWxsIHx8IGV2ZW50LmFsdEdyYXBoS2V5KSB7IHJldHVybiBmYWxzZSB9XG4gICAgLy8gQ3RybC1TY3JvbGxMb2NrIGhhcyBrZXlDb2RlIDMsIHNhbWUgYXMgQ3RybC1QYXVzZSxcbiAgICAvLyBzbyB3ZSdsbCB1c2UgZXZlbnQuY29kZSB3aGVuIGF2YWlsYWJsZSAoQ2hyb21lIDQ4KywgRkYgMzgrLCBTYWZhcmkgMTAuMSspXG4gICAgaWYgKGV2ZW50LmtleUNvZGUgPT0gMyAmJiBldmVudC5jb2RlKSB7IG5hbWUgPSBldmVudC5jb2RlOyB9XG4gICAgcmV0dXJuIGFkZE1vZGlmaWVyTmFtZXMobmFtZSwgZXZlbnQsIG5vU2hpZnQpXG4gIH1cblxuICBmdW5jdGlvbiBnZXRLZXlNYXAodmFsKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWwgPT0gXCJzdHJpbmdcIiA/IGtleU1hcFt2YWxdIDogdmFsXG4gIH1cblxuICAvLyBIZWxwZXIgZm9yIGRlbGV0aW5nIHRleHQgbmVhciB0aGUgc2VsZWN0aW9uKHMpLCB1c2VkIHRvIGltcGxlbWVudFxuICAvLyBiYWNrc3BhY2UsIGRlbGV0ZSwgYW5kIHNpbWlsYXIgZnVuY3Rpb25hbGl0eS5cbiAgZnVuY3Rpb24gZGVsZXRlTmVhclNlbGVjdGlvbihjbSwgY29tcHV0ZSkge1xuICAgIHZhciByYW5nZXMgPSBjbS5kb2Muc2VsLnJhbmdlcywga2lsbCA9IFtdO1xuICAgIC8vIEJ1aWxkIHVwIGEgc2V0IG9mIHJhbmdlcyB0byBraWxsIGZpcnN0LCBtZXJnaW5nIG92ZXJsYXBwaW5nXG4gICAgLy8gcmFuZ2VzLlxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdG9LaWxsID0gY29tcHV0ZShyYW5nZXNbaV0pO1xuICAgICAgd2hpbGUgKGtpbGwubGVuZ3RoICYmIGNtcCh0b0tpbGwuZnJvbSwgbHN0KGtpbGwpLnRvKSA8PSAwKSB7XG4gICAgICAgIHZhciByZXBsYWNlZCA9IGtpbGwucG9wKCk7XG4gICAgICAgIGlmIChjbXAocmVwbGFjZWQuZnJvbSwgdG9LaWxsLmZyb20pIDwgMCkge1xuICAgICAgICAgIHRvS2lsbC5mcm9tID0gcmVwbGFjZWQuZnJvbTtcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBraWxsLnB1c2godG9LaWxsKTtcbiAgICB9XG4gICAgLy8gTmV4dCwgcmVtb3ZlIHRob3NlIGFjdHVhbCByYW5nZXMuXG4gICAgcnVuSW5PcChjbSwgZnVuY3Rpb24gKCkge1xuICAgICAgZm9yICh2YXIgaSA9IGtpbGwubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pXG4gICAgICAgIHsgcmVwbGFjZVJhbmdlKGNtLmRvYywgXCJcIiwga2lsbFtpXS5mcm9tLCBraWxsW2ldLnRvLCBcIitkZWxldGVcIik7IH1cbiAgICAgIGVuc3VyZUN1cnNvclZpc2libGUoY20pO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gbW92ZUNoYXJMb2dpY2FsbHkobGluZSwgY2gsIGRpcikge1xuICAgIHZhciB0YXJnZXQgPSBza2lwRXh0ZW5kaW5nQ2hhcnMobGluZS50ZXh0LCBjaCArIGRpciwgZGlyKTtcbiAgICByZXR1cm4gdGFyZ2V0IDwgMCB8fCB0YXJnZXQgPiBsaW5lLnRleHQubGVuZ3RoID8gbnVsbCA6IHRhcmdldFxuICB9XG5cbiAgZnVuY3Rpb24gbW92ZUxvZ2ljYWxseShsaW5lLCBzdGFydCwgZGlyKSB7XG4gICAgdmFyIGNoID0gbW92ZUNoYXJMb2dpY2FsbHkobGluZSwgc3RhcnQuY2gsIGRpcik7XG4gICAgcmV0dXJuIGNoID09IG51bGwgPyBudWxsIDogbmV3IFBvcyhzdGFydC5saW5lLCBjaCwgZGlyIDwgMCA/IFwiYWZ0ZXJcIiA6IFwiYmVmb3JlXCIpXG4gIH1cblxuICBmdW5jdGlvbiBlbmRPZkxpbmUodmlzdWFsbHksIGNtLCBsaW5lT2JqLCBsaW5lTm8sIGRpcikge1xuICAgIGlmICh2aXN1YWxseSkge1xuICAgICAgaWYgKGNtLmRvYy5kaXJlY3Rpb24gPT0gXCJydGxcIikgeyBkaXIgPSAtZGlyOyB9XG4gICAgICB2YXIgb3JkZXIgPSBnZXRPcmRlcihsaW5lT2JqLCBjbS5kb2MuZGlyZWN0aW9uKTtcbiAgICAgIGlmIChvcmRlcikge1xuICAgICAgICB2YXIgcGFydCA9IGRpciA8IDAgPyBsc3Qob3JkZXIpIDogb3JkZXJbMF07XG4gICAgICAgIHZhciBtb3ZlSW5TdG9yYWdlT3JkZXIgPSAoZGlyIDwgMCkgPT0gKHBhcnQubGV2ZWwgPT0gMSk7XG4gICAgICAgIHZhciBzdGlja3kgPSBtb3ZlSW5TdG9yYWdlT3JkZXIgPyBcImFmdGVyXCIgOiBcImJlZm9yZVwiO1xuICAgICAgICB2YXIgY2g7XG4gICAgICAgIC8vIFdpdGggYSB3cmFwcGVkIHJ0bCBjaHVuayAocG9zc2libHkgc3Bhbm5pbmcgbXVsdGlwbGUgYmlkaSBwYXJ0cyksXG4gICAgICAgIC8vIGl0IGNvdWxkIGJlIHRoYXQgdGhlIGxhc3QgYmlkaSBwYXJ0IGlzIG5vdCBvbiB0aGUgbGFzdCB2aXN1YWwgbGluZSxcbiAgICAgICAgLy8gc2luY2UgdmlzdWFsIGxpbmVzIGNvbnRhaW4gY29udGVudCBvcmRlci1jb25zZWN1dGl2ZSBjaHVua3MuXG4gICAgICAgIC8vIFRodXMsIGluIHJ0bCwgd2UgYXJlIGxvb2tpbmcgZm9yIHRoZSBmaXJzdCAoY29udGVudC1vcmRlcikgY2hhcmFjdGVyXG4gICAgICAgIC8vIGluIHRoZSBydGwgY2h1bmsgdGhhdCBpcyBvbiB0aGUgbGFzdCBsaW5lICh0aGF0IGlzLCB0aGUgc2FtZSBsaW5lXG4gICAgICAgIC8vIGFzIHRoZSBsYXN0IChjb250ZW50LW9yZGVyKSBjaGFyYWN0ZXIpLlxuICAgICAgICBpZiAocGFydC5sZXZlbCA+IDAgfHwgY20uZG9jLmRpcmVjdGlvbiA9PSBcInJ0bFwiKSB7XG4gICAgICAgICAgdmFyIHByZXAgPSBwcmVwYXJlTWVhc3VyZUZvckxpbmUoY20sIGxpbmVPYmopO1xuICAgICAgICAgIGNoID0gZGlyIDwgMCA/IGxpbmVPYmoudGV4dC5sZW5ndGggLSAxIDogMDtcbiAgICAgICAgICB2YXIgdGFyZ2V0VG9wID0gbWVhc3VyZUNoYXJQcmVwYXJlZChjbSwgcHJlcCwgY2gpLnRvcDtcbiAgICAgICAgICBjaCA9IGZpbmRGaXJzdChmdW5jdGlvbiAoY2gpIHsgcmV0dXJuIG1lYXN1cmVDaGFyUHJlcGFyZWQoY20sIHByZXAsIGNoKS50b3AgPT0gdGFyZ2V0VG9wOyB9LCAoZGlyIDwgMCkgPT0gKHBhcnQubGV2ZWwgPT0gMSkgPyBwYXJ0LmZyb20gOiBwYXJ0LnRvIC0gMSwgY2gpO1xuICAgICAgICAgIGlmIChzdGlja3kgPT0gXCJiZWZvcmVcIikgeyBjaCA9IG1vdmVDaGFyTG9naWNhbGx5KGxpbmVPYmosIGNoLCAxKTsgfVxuICAgICAgICB9IGVsc2UgeyBjaCA9IGRpciA8IDAgPyBwYXJ0LnRvIDogcGFydC5mcm9tOyB9XG4gICAgICAgIHJldHVybiBuZXcgUG9zKGxpbmVObywgY2gsIHN0aWNreSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQb3MobGluZU5vLCBkaXIgPCAwID8gbGluZU9iai50ZXh0Lmxlbmd0aCA6IDAsIGRpciA8IDAgPyBcImJlZm9yZVwiIDogXCJhZnRlclwiKVxuICB9XG5cbiAgZnVuY3Rpb24gbW92ZVZpc3VhbGx5KGNtLCBsaW5lLCBzdGFydCwgZGlyKSB7XG4gICAgdmFyIGJpZGkgPSBnZXRPcmRlcihsaW5lLCBjbS5kb2MuZGlyZWN0aW9uKTtcbiAgICBpZiAoIWJpZGkpIHsgcmV0dXJuIG1vdmVMb2dpY2FsbHkobGluZSwgc3RhcnQsIGRpcikgfVxuICAgIGlmIChzdGFydC5jaCA+PSBsaW5lLnRleHQubGVuZ3RoKSB7XG4gICAgICBzdGFydC5jaCA9IGxpbmUudGV4dC5sZW5ndGg7XG4gICAgICBzdGFydC5zdGlja3kgPSBcImJlZm9yZVwiO1xuICAgIH0gZWxzZSBpZiAoc3RhcnQuY2ggPD0gMCkge1xuICAgICAgc3RhcnQuY2ggPSAwO1xuICAgICAgc3RhcnQuc3RpY2t5ID0gXCJhZnRlclwiO1xuICAgIH1cbiAgICB2YXIgcGFydFBvcyA9IGdldEJpZGlQYXJ0QXQoYmlkaSwgc3RhcnQuY2gsIHN0YXJ0LnN0aWNreSksIHBhcnQgPSBiaWRpW3BhcnRQb3NdO1xuICAgIGlmIChjbS5kb2MuZGlyZWN0aW9uID09IFwibHRyXCIgJiYgcGFydC5sZXZlbCAlIDIgPT0gMCAmJiAoZGlyID4gMCA/IHBhcnQudG8gPiBzdGFydC5jaCA6IHBhcnQuZnJvbSA8IHN0YXJ0LmNoKSkge1xuICAgICAgLy8gQ2FzZSAxOiBXZSBtb3ZlIHdpdGhpbiBhbiBsdHIgcGFydCBpbiBhbiBsdHIgZWRpdG9yLiBFdmVuIHdpdGggd3JhcHBlZCBsaW5lcyxcbiAgICAgIC8vIG5vdGhpbmcgaW50ZXJlc3RpbmcgaGFwcGVucy5cbiAgICAgIHJldHVybiBtb3ZlTG9naWNhbGx5KGxpbmUsIHN0YXJ0LCBkaXIpXG4gICAgfVxuXG4gICAgdmFyIG12ID0gZnVuY3Rpb24gKHBvcywgZGlyKSB7IHJldHVybiBtb3ZlQ2hhckxvZ2ljYWxseShsaW5lLCBwb3MgaW5zdGFuY2VvZiBQb3MgPyBwb3MuY2ggOiBwb3MsIGRpcik7IH07XG4gICAgdmFyIHByZXA7XG4gICAgdmFyIGdldFdyYXBwZWRMaW5lRXh0ZW50ID0gZnVuY3Rpb24gKGNoKSB7XG4gICAgICBpZiAoIWNtLm9wdGlvbnMubGluZVdyYXBwaW5nKSB7IHJldHVybiB7YmVnaW46IDAsIGVuZDogbGluZS50ZXh0Lmxlbmd0aH0gfVxuICAgICAgcHJlcCA9IHByZXAgfHwgcHJlcGFyZU1lYXN1cmVGb3JMaW5lKGNtLCBsaW5lKTtcbiAgICAgIHJldHVybiB3cmFwcGVkTGluZUV4dGVudENoYXIoY20sIGxpbmUsIHByZXAsIGNoKVxuICAgIH07XG4gICAgdmFyIHdyYXBwZWRMaW5lRXh0ZW50ID0gZ2V0V3JhcHBlZExpbmVFeHRlbnQoc3RhcnQuc3RpY2t5ID09IFwiYmVmb3JlXCIgPyBtdihzdGFydCwgLTEpIDogc3RhcnQuY2gpO1xuXG4gICAgaWYgKGNtLmRvYy5kaXJlY3Rpb24gPT0gXCJydGxcIiB8fCBwYXJ0LmxldmVsID09IDEpIHtcbiAgICAgIHZhciBtb3ZlSW5TdG9yYWdlT3JkZXIgPSAocGFydC5sZXZlbCA9PSAxKSA9PSAoZGlyIDwgMCk7XG4gICAgICB2YXIgY2ggPSBtdihzdGFydCwgbW92ZUluU3RvcmFnZU9yZGVyID8gMSA6IC0xKTtcbiAgICAgIGlmIChjaCAhPSBudWxsICYmICghbW92ZUluU3RvcmFnZU9yZGVyID8gY2ggPj0gcGFydC5mcm9tICYmIGNoID49IHdyYXBwZWRMaW5lRXh0ZW50LmJlZ2luIDogY2ggPD0gcGFydC50byAmJiBjaCA8PSB3cmFwcGVkTGluZUV4dGVudC5lbmQpKSB7XG4gICAgICAgIC8vIENhc2UgMjogV2UgbW92ZSB3aXRoaW4gYW4gcnRsIHBhcnQgb3IgaW4gYW4gcnRsIGVkaXRvciBvbiB0aGUgc2FtZSB2aXN1YWwgbGluZVxuICAgICAgICB2YXIgc3RpY2t5ID0gbW92ZUluU3RvcmFnZU9yZGVyID8gXCJiZWZvcmVcIiA6IFwiYWZ0ZXJcIjtcbiAgICAgICAgcmV0dXJuIG5ldyBQb3Moc3RhcnQubGluZSwgY2gsIHN0aWNreSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDYXNlIDM6IENvdWxkIG5vdCBtb3ZlIHdpdGhpbiB0aGlzIGJpZGkgcGFydCBpbiB0aGlzIHZpc3VhbCBsaW5lLCBzbyBsZWF2ZVxuICAgIC8vIHRoZSBjdXJyZW50IGJpZGkgcGFydFxuXG4gICAgdmFyIHNlYXJjaEluVmlzdWFsTGluZSA9IGZ1bmN0aW9uIChwYXJ0UG9zLCBkaXIsIHdyYXBwZWRMaW5lRXh0ZW50KSB7XG4gICAgICB2YXIgZ2V0UmVzID0gZnVuY3Rpb24gKGNoLCBtb3ZlSW5TdG9yYWdlT3JkZXIpIHsgcmV0dXJuIG1vdmVJblN0b3JhZ2VPcmRlclxuICAgICAgICA/IG5ldyBQb3Moc3RhcnQubGluZSwgbXYoY2gsIDEpLCBcImJlZm9yZVwiKVxuICAgICAgICA6IG5ldyBQb3Moc3RhcnQubGluZSwgY2gsIFwiYWZ0ZXJcIik7IH07XG5cbiAgICAgIGZvciAoOyBwYXJ0UG9zID49IDAgJiYgcGFydFBvcyA8IGJpZGkubGVuZ3RoOyBwYXJ0UG9zICs9IGRpcikge1xuICAgICAgICB2YXIgcGFydCA9IGJpZGlbcGFydFBvc107XG4gICAgICAgIHZhciBtb3ZlSW5TdG9yYWdlT3JkZXIgPSAoZGlyID4gMCkgPT0gKHBhcnQubGV2ZWwgIT0gMSk7XG4gICAgICAgIHZhciBjaCA9IG1vdmVJblN0b3JhZ2VPcmRlciA/IHdyYXBwZWRMaW5lRXh0ZW50LmJlZ2luIDogbXYod3JhcHBlZExpbmVFeHRlbnQuZW5kLCAtMSk7XG4gICAgICAgIGlmIChwYXJ0LmZyb20gPD0gY2ggJiYgY2ggPCBwYXJ0LnRvKSB7IHJldHVybiBnZXRSZXMoY2gsIG1vdmVJblN0b3JhZ2VPcmRlcikgfVxuICAgICAgICBjaCA9IG1vdmVJblN0b3JhZ2VPcmRlciA/IHBhcnQuZnJvbSA6IG12KHBhcnQudG8sIC0xKTtcbiAgICAgICAgaWYgKHdyYXBwZWRMaW5lRXh0ZW50LmJlZ2luIDw9IGNoICYmIGNoIDwgd3JhcHBlZExpbmVFeHRlbnQuZW5kKSB7IHJldHVybiBnZXRSZXMoY2gsIG1vdmVJblN0b3JhZ2VPcmRlcikgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBDYXNlIDNhOiBMb29rIGZvciBvdGhlciBiaWRpIHBhcnRzIG9uIHRoZSBzYW1lIHZpc3VhbCBsaW5lXG4gICAgdmFyIHJlcyA9IHNlYXJjaEluVmlzdWFsTGluZShwYXJ0UG9zICsgZGlyLCBkaXIsIHdyYXBwZWRMaW5lRXh0ZW50KTtcbiAgICBpZiAocmVzKSB7IHJldHVybiByZXMgfVxuXG4gICAgLy8gQ2FzZSAzYjogTG9vayBmb3Igb3RoZXIgYmlkaSBwYXJ0cyBvbiB0aGUgbmV4dCB2aXN1YWwgbGluZVxuICAgIHZhciBuZXh0Q2ggPSBkaXIgPiAwID8gd3JhcHBlZExpbmVFeHRlbnQuZW5kIDogbXYod3JhcHBlZExpbmVFeHRlbnQuYmVnaW4sIC0xKTtcbiAgICBpZiAobmV4dENoICE9IG51bGwgJiYgIShkaXIgPiAwICYmIG5leHRDaCA9PSBsaW5lLnRleHQubGVuZ3RoKSkge1xuICAgICAgcmVzID0gc2VhcmNoSW5WaXN1YWxMaW5lKGRpciA+IDAgPyAwIDogYmlkaS5sZW5ndGggLSAxLCBkaXIsIGdldFdyYXBwZWRMaW5lRXh0ZW50KG5leHRDaCkpO1xuICAgICAgaWYgKHJlcykgeyByZXR1cm4gcmVzIH1cbiAgICB9XG5cbiAgICAvLyBDYXNlIDQ6IE5vd2hlcmUgdG8gbW92ZVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvLyBDb21tYW5kcyBhcmUgcGFyYW1ldGVyLWxlc3MgYWN0aW9ucyB0aGF0IGNhbiBiZSBwZXJmb3JtZWQgb24gYW5cbiAgLy8gZWRpdG9yLCBtb3N0bHkgdXNlZCBmb3Iga2V5YmluZGluZ3MuXG4gIHZhciBjb21tYW5kcyA9IHtcbiAgICBzZWxlY3RBbGw6IHNlbGVjdEFsbCxcbiAgICBzaW5nbGVTZWxlY3Rpb246IGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gY20uc2V0U2VsZWN0aW9uKGNtLmdldEN1cnNvcihcImFuY2hvclwiKSwgY20uZ2V0Q3Vyc29yKFwiaGVhZFwiKSwgc2VsX2RvbnRTY3JvbGwpOyB9LFxuICAgIGtpbGxMaW5lOiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGRlbGV0ZU5lYXJTZWxlY3Rpb24oY20sIGZ1bmN0aW9uIChyYW5nZSkge1xuICAgICAgaWYgKHJhbmdlLmVtcHR5KCkpIHtcbiAgICAgICAgdmFyIGxlbiA9IGdldExpbmUoY20uZG9jLCByYW5nZS5oZWFkLmxpbmUpLnRleHQubGVuZ3RoO1xuICAgICAgICBpZiAocmFuZ2UuaGVhZC5jaCA9PSBsZW4gJiYgcmFuZ2UuaGVhZC5saW5lIDwgY20ubGFzdExpbmUoKSlcbiAgICAgICAgICB7IHJldHVybiB7ZnJvbTogcmFuZ2UuaGVhZCwgdG86IFBvcyhyYW5nZS5oZWFkLmxpbmUgKyAxLCAwKX0gfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgeyByZXR1cm4ge2Zyb206IHJhbmdlLmhlYWQsIHRvOiBQb3MocmFuZ2UuaGVhZC5saW5lLCBsZW4pfSB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge2Zyb206IHJhbmdlLmZyb20oKSwgdG86IHJhbmdlLnRvKCl9XG4gICAgICB9XG4gICAgfSk7IH0sXG4gICAgZGVsZXRlTGluZTogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBkZWxldGVOZWFyU2VsZWN0aW9uKGNtLCBmdW5jdGlvbiAocmFuZ2UpIHsgcmV0dXJuICh7XG4gICAgICBmcm9tOiBQb3MocmFuZ2UuZnJvbSgpLmxpbmUsIDApLFxuICAgICAgdG86IGNsaXBQb3MoY20uZG9jLCBQb3MocmFuZ2UudG8oKS5saW5lICsgMSwgMCkpXG4gICAgfSk7IH0pOyB9LFxuICAgIGRlbExpbmVMZWZ0OiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGRlbGV0ZU5lYXJTZWxlY3Rpb24oY20sIGZ1bmN0aW9uIChyYW5nZSkgeyByZXR1cm4gKHtcbiAgICAgIGZyb206IFBvcyhyYW5nZS5mcm9tKCkubGluZSwgMCksIHRvOiByYW5nZS5mcm9tKClcbiAgICB9KTsgfSk7IH0sXG4gICAgZGVsV3JhcHBlZExpbmVMZWZ0OiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGRlbGV0ZU5lYXJTZWxlY3Rpb24oY20sIGZ1bmN0aW9uIChyYW5nZSkge1xuICAgICAgdmFyIHRvcCA9IGNtLmNoYXJDb29yZHMocmFuZ2UuaGVhZCwgXCJkaXZcIikudG9wICsgNTtcbiAgICAgIHZhciBsZWZ0UG9zID0gY20uY29vcmRzQ2hhcih7bGVmdDogMCwgdG9wOiB0b3B9LCBcImRpdlwiKTtcbiAgICAgIHJldHVybiB7ZnJvbTogbGVmdFBvcywgdG86IHJhbmdlLmZyb20oKX1cbiAgICB9KTsgfSxcbiAgICBkZWxXcmFwcGVkTGluZVJpZ2h0OiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGRlbGV0ZU5lYXJTZWxlY3Rpb24oY20sIGZ1bmN0aW9uIChyYW5nZSkge1xuICAgICAgdmFyIHRvcCA9IGNtLmNoYXJDb29yZHMocmFuZ2UuaGVhZCwgXCJkaXZcIikudG9wICsgNTtcbiAgICAgIHZhciByaWdodFBvcyA9IGNtLmNvb3Jkc0NoYXIoe2xlZnQ6IGNtLmRpc3BsYXkubGluZURpdi5vZmZzZXRXaWR0aCArIDEwMCwgdG9wOiB0b3B9LCBcImRpdlwiKTtcbiAgICAgIHJldHVybiB7ZnJvbTogcmFuZ2UuZnJvbSgpLCB0bzogcmlnaHRQb3MgfVxuICAgIH0pOyB9LFxuICAgIHVuZG86IGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gY20udW5kbygpOyB9LFxuICAgIHJlZG86IGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gY20ucmVkbygpOyB9LFxuICAgIHVuZG9TZWxlY3Rpb246IGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gY20udW5kb1NlbGVjdGlvbigpOyB9LFxuICAgIHJlZG9TZWxlY3Rpb246IGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gY20ucmVkb1NlbGVjdGlvbigpOyB9LFxuICAgIGdvRG9jU3RhcnQ6IGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gY20uZXh0ZW5kU2VsZWN0aW9uKFBvcyhjbS5maXJzdExpbmUoKSwgMCkpOyB9LFxuICAgIGdvRG9jRW5kOiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLmV4dGVuZFNlbGVjdGlvbihQb3MoY20ubGFzdExpbmUoKSkpOyB9LFxuICAgIGdvTGluZVN0YXJ0OiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLmV4dGVuZFNlbGVjdGlvbnNCeShmdW5jdGlvbiAocmFuZ2UpIHsgcmV0dXJuIGxpbmVTdGFydChjbSwgcmFuZ2UuaGVhZC5saW5lKTsgfSxcbiAgICAgIHtvcmlnaW46IFwiK21vdmVcIiwgYmlhczogMX1cbiAgICApOyB9LFxuICAgIGdvTGluZVN0YXJ0U21hcnQ6IGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gY20uZXh0ZW5kU2VsZWN0aW9uc0J5KGZ1bmN0aW9uIChyYW5nZSkgeyByZXR1cm4gbGluZVN0YXJ0U21hcnQoY20sIHJhbmdlLmhlYWQpOyB9LFxuICAgICAge29yaWdpbjogXCIrbW92ZVwiLCBiaWFzOiAxfVxuICAgICk7IH0sXG4gICAgZ29MaW5lRW5kOiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLmV4dGVuZFNlbGVjdGlvbnNCeShmdW5jdGlvbiAocmFuZ2UpIHsgcmV0dXJuIGxpbmVFbmQoY20sIHJhbmdlLmhlYWQubGluZSk7IH0sXG4gICAgICB7b3JpZ2luOiBcIittb3ZlXCIsIGJpYXM6IC0xfVxuICAgICk7IH0sXG4gICAgZ29MaW5lUmlnaHQ6IGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gY20uZXh0ZW5kU2VsZWN0aW9uc0J5KGZ1bmN0aW9uIChyYW5nZSkge1xuICAgICAgdmFyIHRvcCA9IGNtLmN1cnNvckNvb3JkcyhyYW5nZS5oZWFkLCBcImRpdlwiKS50b3AgKyA1O1xuICAgICAgcmV0dXJuIGNtLmNvb3Jkc0NoYXIoe2xlZnQ6IGNtLmRpc3BsYXkubGluZURpdi5vZmZzZXRXaWR0aCArIDEwMCwgdG9wOiB0b3B9LCBcImRpdlwiKVxuICAgIH0sIHNlbF9tb3ZlKTsgfSxcbiAgICBnb0xpbmVMZWZ0OiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLmV4dGVuZFNlbGVjdGlvbnNCeShmdW5jdGlvbiAocmFuZ2UpIHtcbiAgICAgIHZhciB0b3AgPSBjbS5jdXJzb3JDb29yZHMocmFuZ2UuaGVhZCwgXCJkaXZcIikudG9wICsgNTtcbiAgICAgIHJldHVybiBjbS5jb29yZHNDaGFyKHtsZWZ0OiAwLCB0b3A6IHRvcH0sIFwiZGl2XCIpXG4gICAgfSwgc2VsX21vdmUpOyB9LFxuICAgIGdvTGluZUxlZnRTbWFydDogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5leHRlbmRTZWxlY3Rpb25zQnkoZnVuY3Rpb24gKHJhbmdlKSB7XG4gICAgICB2YXIgdG9wID0gY20uY3Vyc29yQ29vcmRzKHJhbmdlLmhlYWQsIFwiZGl2XCIpLnRvcCArIDU7XG4gICAgICB2YXIgcG9zID0gY20uY29vcmRzQ2hhcih7bGVmdDogMCwgdG9wOiB0b3B9LCBcImRpdlwiKTtcbiAgICAgIGlmIChwb3MuY2ggPCBjbS5nZXRMaW5lKHBvcy5saW5lKS5zZWFyY2goL1xcUy8pKSB7IHJldHVybiBsaW5lU3RhcnRTbWFydChjbSwgcmFuZ2UuaGVhZCkgfVxuICAgICAgcmV0dXJuIHBvc1xuICAgIH0sIHNlbF9tb3ZlKTsgfSxcbiAgICBnb0xpbmVVcDogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5tb3ZlVigtMSwgXCJsaW5lXCIpOyB9LFxuICAgIGdvTGluZURvd246IGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gY20ubW92ZVYoMSwgXCJsaW5lXCIpOyB9LFxuICAgIGdvUGFnZVVwOiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLm1vdmVWKC0xLCBcInBhZ2VcIik7IH0sXG4gICAgZ29QYWdlRG93bjogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5tb3ZlVigxLCBcInBhZ2VcIik7IH0sXG4gICAgZ29DaGFyTGVmdDogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5tb3ZlSCgtMSwgXCJjaGFyXCIpOyB9LFxuICAgIGdvQ2hhclJpZ2h0OiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLm1vdmVIKDEsIFwiY2hhclwiKTsgfSxcbiAgICBnb0NvbHVtbkxlZnQ6IGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gY20ubW92ZUgoLTEsIFwiY29sdW1uXCIpOyB9LFxuICAgIGdvQ29sdW1uUmlnaHQ6IGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gY20ubW92ZUgoMSwgXCJjb2x1bW5cIik7IH0sXG4gICAgZ29Xb3JkTGVmdDogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5tb3ZlSCgtMSwgXCJ3b3JkXCIpOyB9LFxuICAgIGdvR3JvdXBSaWdodDogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5tb3ZlSCgxLCBcImdyb3VwXCIpOyB9LFxuICAgIGdvR3JvdXBMZWZ0OiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLm1vdmVIKC0xLCBcImdyb3VwXCIpOyB9LFxuICAgIGdvV29yZFJpZ2h0OiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLm1vdmVIKDEsIFwid29yZFwiKTsgfSxcbiAgICBkZWxDaGFyQmVmb3JlOiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLmRlbGV0ZUgoLTEsIFwiY29kZXBvaW50XCIpOyB9LFxuICAgIGRlbENoYXJBZnRlcjogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5kZWxldGVIKDEsIFwiY2hhclwiKTsgfSxcbiAgICBkZWxXb3JkQmVmb3JlOiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLmRlbGV0ZUgoLTEsIFwid29yZFwiKTsgfSxcbiAgICBkZWxXb3JkQWZ0ZXI6IGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gY20uZGVsZXRlSCgxLCBcIndvcmRcIik7IH0sXG4gICAgZGVsR3JvdXBCZWZvcmU6IGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gY20uZGVsZXRlSCgtMSwgXCJncm91cFwiKTsgfSxcbiAgICBkZWxHcm91cEFmdGVyOiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLmRlbGV0ZUgoMSwgXCJncm91cFwiKTsgfSxcbiAgICBpbmRlbnRBdXRvOiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLmluZGVudFNlbGVjdGlvbihcInNtYXJ0XCIpOyB9LFxuICAgIGluZGVudE1vcmU6IGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gY20uaW5kZW50U2VsZWN0aW9uKFwiYWRkXCIpOyB9LFxuICAgIGluZGVudExlc3M6IGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gY20uaW5kZW50U2VsZWN0aW9uKFwic3VidHJhY3RcIik7IH0sXG4gICAgaW5zZXJ0VGFiOiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLnJlcGxhY2VTZWxlY3Rpb24oXCJcXHRcIik7IH0sXG4gICAgaW5zZXJ0U29mdFRhYjogZnVuY3Rpb24gKGNtKSB7XG4gICAgICB2YXIgc3BhY2VzID0gW10sIHJhbmdlcyA9IGNtLmxpc3RTZWxlY3Rpb25zKCksIHRhYlNpemUgPSBjbS5vcHRpb25zLnRhYlNpemU7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcG9zID0gcmFuZ2VzW2ldLmZyb20oKTtcbiAgICAgICAgdmFyIGNvbCA9IGNvdW50Q29sdW1uKGNtLmdldExpbmUocG9zLmxpbmUpLCBwb3MuY2gsIHRhYlNpemUpO1xuICAgICAgICBzcGFjZXMucHVzaChzcGFjZVN0cih0YWJTaXplIC0gY29sICUgdGFiU2l6ZSkpO1xuICAgICAgfVxuICAgICAgY20ucmVwbGFjZVNlbGVjdGlvbnMoc3BhY2VzKTtcbiAgICB9LFxuICAgIGRlZmF1bHRUYWI6IGZ1bmN0aW9uIChjbSkge1xuICAgICAgaWYgKGNtLnNvbWV0aGluZ1NlbGVjdGVkKCkpIHsgY20uaW5kZW50U2VsZWN0aW9uKFwiYWRkXCIpOyB9XG4gICAgICBlbHNlIHsgY20uZXhlY0NvbW1hbmQoXCJpbnNlcnRUYWJcIik7IH1cbiAgICB9LFxuICAgIC8vIFN3YXAgdGhlIHR3byBjaGFycyBsZWZ0IGFuZCByaWdodCBvZiBlYWNoIHNlbGVjdGlvbidzIGhlYWQuXG4gICAgLy8gTW92ZSBjdXJzb3IgYmVoaW5kIHRoZSB0d28gc3dhcHBlZCBjaGFyYWN0ZXJzIGFmdGVyd2FyZHMuXG4gICAgLy9cbiAgICAvLyBEb2Vzbid0IGNvbnNpZGVyIGxpbmUgZmVlZHMgYSBjaGFyYWN0ZXIuXG4gICAgLy8gRG9lc24ndCBzY2FuIG1vcmUgdGhhbiBvbmUgbGluZSBhYm92ZSB0byBmaW5kIGEgY2hhcmFjdGVyLlxuICAgIC8vIERvZXNuJ3QgZG8gYW55dGhpbmcgb24gYW4gZW1wdHkgbGluZS5cbiAgICAvLyBEb2Vzbid0IGRvIGFueXRoaW5nIHdpdGggbm9uLWVtcHR5IHNlbGVjdGlvbnMuXG4gICAgdHJhbnNwb3NlQ2hhcnM6IGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gcnVuSW5PcChjbSwgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHJhbmdlcyA9IGNtLmxpc3RTZWxlY3Rpb25zKCksIG5ld1NlbCA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCFyYW5nZXNbaV0uZW1wdHkoKSkgeyBjb250aW51ZSB9XG4gICAgICAgIHZhciBjdXIgPSByYW5nZXNbaV0uaGVhZCwgbGluZSA9IGdldExpbmUoY20uZG9jLCBjdXIubGluZSkudGV4dDtcbiAgICAgICAgaWYgKGxpbmUpIHtcbiAgICAgICAgICBpZiAoY3VyLmNoID09IGxpbmUubGVuZ3RoKSB7IGN1ciA9IG5ldyBQb3MoY3VyLmxpbmUsIGN1ci5jaCAtIDEpOyB9XG4gICAgICAgICAgaWYgKGN1ci5jaCA+IDApIHtcbiAgICAgICAgICAgIGN1ciA9IG5ldyBQb3MoY3VyLmxpbmUsIGN1ci5jaCArIDEpO1xuICAgICAgICAgICAgY20ucmVwbGFjZVJhbmdlKGxpbmUuY2hhckF0KGN1ci5jaCAtIDEpICsgbGluZS5jaGFyQXQoY3VyLmNoIC0gMiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zKGN1ci5saW5lLCBjdXIuY2ggLSAyKSwgY3VyLCBcIit0cmFuc3Bvc2VcIik7XG4gICAgICAgICAgfSBlbHNlIGlmIChjdXIubGluZSA+IGNtLmRvYy5maXJzdCkge1xuICAgICAgICAgICAgdmFyIHByZXYgPSBnZXRMaW5lKGNtLmRvYywgY3VyLmxpbmUgLSAxKS50ZXh0O1xuICAgICAgICAgICAgaWYgKHByZXYpIHtcbiAgICAgICAgICAgICAgY3VyID0gbmV3IFBvcyhjdXIubGluZSwgMSk7XG4gICAgICAgICAgICAgIGNtLnJlcGxhY2VSYW5nZShsaW5lLmNoYXJBdCgwKSArIGNtLmRvYy5saW5lU2VwYXJhdG9yKCkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldi5jaGFyQXQocHJldi5sZW5ndGggLSAxKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvcyhjdXIubGluZSAtIDEsIHByZXYubGVuZ3RoIC0gMSksIGN1ciwgXCIrdHJhbnNwb3NlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBuZXdTZWwucHVzaChuZXcgUmFuZ2UoY3VyLCBjdXIpKTtcbiAgICAgIH1cbiAgICAgIGNtLnNldFNlbGVjdGlvbnMobmV3U2VsKTtcbiAgICB9KTsgfSxcbiAgICBuZXdsaW5lQW5kSW5kZW50OiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIHJ1bkluT3AoY20sIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzZWxzID0gY20ubGlzdFNlbGVjdGlvbnMoKTtcbiAgICAgIGZvciAodmFyIGkgPSBzZWxzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKVxuICAgICAgICB7IGNtLnJlcGxhY2VSYW5nZShjbS5kb2MubGluZVNlcGFyYXRvcigpLCBzZWxzW2ldLmFuY2hvciwgc2Vsc1tpXS5oZWFkLCBcIitpbnB1dFwiKTsgfVxuICAgICAgc2VscyA9IGNtLmxpc3RTZWxlY3Rpb25zKCk7XG4gICAgICBmb3IgKHZhciBpJDEgPSAwOyBpJDEgPCBzZWxzLmxlbmd0aDsgaSQxKyspXG4gICAgICAgIHsgY20uaW5kZW50TGluZShzZWxzW2kkMV0uZnJvbSgpLmxpbmUsIG51bGwsIHRydWUpOyB9XG4gICAgICBlbnN1cmVDdXJzb3JWaXNpYmxlKGNtKTtcbiAgICB9KTsgfSxcbiAgICBvcGVuTGluZTogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5yZXBsYWNlU2VsZWN0aW9uKFwiXFxuXCIsIFwic3RhcnRcIik7IH0sXG4gICAgdG9nZ2xlT3ZlcndyaXRlOiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLnRvZ2dsZU92ZXJ3cml0ZSgpOyB9XG4gIH07XG5cblxuICBmdW5jdGlvbiBsaW5lU3RhcnQoY20sIGxpbmVOKSB7XG4gICAgdmFyIGxpbmUgPSBnZXRMaW5lKGNtLmRvYywgbGluZU4pO1xuICAgIHZhciB2aXN1YWwgPSB2aXN1YWxMaW5lKGxpbmUpO1xuICAgIGlmICh2aXN1YWwgIT0gbGluZSkgeyBsaW5lTiA9IGxpbmVObyh2aXN1YWwpOyB9XG4gICAgcmV0dXJuIGVuZE9mTGluZSh0cnVlLCBjbSwgdmlzdWFsLCBsaW5lTiwgMSlcbiAgfVxuICBmdW5jdGlvbiBsaW5lRW5kKGNtLCBsaW5lTikge1xuICAgIHZhciBsaW5lID0gZ2V0TGluZShjbS5kb2MsIGxpbmVOKTtcbiAgICB2YXIgdmlzdWFsID0gdmlzdWFsTGluZUVuZChsaW5lKTtcbiAgICBpZiAodmlzdWFsICE9IGxpbmUpIHsgbGluZU4gPSBsaW5lTm8odmlzdWFsKTsgfVxuICAgIHJldHVybiBlbmRPZkxpbmUodHJ1ZSwgY20sIGxpbmUsIGxpbmVOLCAtMSlcbiAgfVxuICBmdW5jdGlvbiBsaW5lU3RhcnRTbWFydChjbSwgcG9zKSB7XG4gICAgdmFyIHN0YXJ0ID0gbGluZVN0YXJ0KGNtLCBwb3MubGluZSk7XG4gICAgdmFyIGxpbmUgPSBnZXRMaW5lKGNtLmRvYywgc3RhcnQubGluZSk7XG4gICAgdmFyIG9yZGVyID0gZ2V0T3JkZXIobGluZSwgY20uZG9jLmRpcmVjdGlvbik7XG4gICAgaWYgKCFvcmRlciB8fCBvcmRlclswXS5sZXZlbCA9PSAwKSB7XG4gICAgICB2YXIgZmlyc3ROb25XUyA9IE1hdGgubWF4KHN0YXJ0LmNoLCBsaW5lLnRleHQuc2VhcmNoKC9cXFMvKSk7XG4gICAgICB2YXIgaW5XUyA9IHBvcy5saW5lID09IHN0YXJ0LmxpbmUgJiYgcG9zLmNoIDw9IGZpcnN0Tm9uV1MgJiYgcG9zLmNoO1xuICAgICAgcmV0dXJuIFBvcyhzdGFydC5saW5lLCBpbldTID8gMCA6IGZpcnN0Tm9uV1MsIHN0YXJ0LnN0aWNreSlcbiAgICB9XG4gICAgcmV0dXJuIHN0YXJ0XG4gIH1cblxuICAvLyBSdW4gYSBoYW5kbGVyIHRoYXQgd2FzIGJvdW5kIHRvIGEga2V5LlxuICBmdW5jdGlvbiBkb0hhbmRsZUJpbmRpbmcoY20sIGJvdW5kLCBkcm9wU2hpZnQpIHtcbiAgICBpZiAodHlwZW9mIGJvdW5kID09IFwic3RyaW5nXCIpIHtcbiAgICAgIGJvdW5kID0gY29tbWFuZHNbYm91bmRdO1xuICAgICAgaWYgKCFib3VuZCkgeyByZXR1cm4gZmFsc2UgfVxuICAgIH1cbiAgICAvLyBFbnN1cmUgcHJldmlvdXMgaW5wdXQgaGFzIGJlZW4gcmVhZCwgc28gdGhhdCB0aGUgaGFuZGxlciBzZWVzIGFcbiAgICAvLyBjb25zaXN0ZW50IHZpZXcgb2YgdGhlIGRvY3VtZW50XG4gICAgY20uZGlzcGxheS5pbnB1dC5lbnN1cmVQb2xsZWQoKTtcbiAgICB2YXIgcHJldlNoaWZ0ID0gY20uZGlzcGxheS5zaGlmdCwgZG9uZSA9IGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICBpZiAoY20uaXNSZWFkT25seSgpKSB7IGNtLnN0YXRlLnN1cHByZXNzRWRpdHMgPSB0cnVlOyB9XG4gICAgICBpZiAoZHJvcFNoaWZ0KSB7IGNtLmRpc3BsYXkuc2hpZnQgPSBmYWxzZTsgfVxuICAgICAgZG9uZSA9IGJvdW5kKGNtKSAhPSBQYXNzO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBjbS5kaXNwbGF5LnNoaWZ0ID0gcHJldlNoaWZ0O1xuICAgICAgY20uc3RhdGUuc3VwcHJlc3NFZGl0cyA9IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gZG9uZVxuICB9XG5cbiAgZnVuY3Rpb24gbG9va3VwS2V5Rm9yRWRpdG9yKGNtLCBuYW1lLCBoYW5kbGUpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNtLnN0YXRlLmtleU1hcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciByZXN1bHQgPSBsb29rdXBLZXkobmFtZSwgY20uc3RhdGUua2V5TWFwc1tpXSwgaGFuZGxlLCBjbSk7XG4gICAgICBpZiAocmVzdWx0KSB7IHJldHVybiByZXN1bHQgfVxuICAgIH1cbiAgICByZXR1cm4gKGNtLm9wdGlvbnMuZXh0cmFLZXlzICYmIGxvb2t1cEtleShuYW1lLCBjbS5vcHRpb25zLmV4dHJhS2V5cywgaGFuZGxlLCBjbSkpXG4gICAgICB8fCBsb29rdXBLZXkobmFtZSwgY20ub3B0aW9ucy5rZXlNYXAsIGhhbmRsZSwgY20pXG4gIH1cblxuICAvLyBOb3RlIHRoYXQsIGRlc3BpdGUgdGhlIG5hbWUsIHRoaXMgZnVuY3Rpb24gaXMgYWxzbyB1c2VkIHRvIGNoZWNrXG4gIC8vIGZvciBib3VuZCBtb3VzZSBjbGlja3MuXG5cbiAgdmFyIHN0b3BTZXEgPSBuZXcgRGVsYXllZDtcblxuICBmdW5jdGlvbiBkaXNwYXRjaEtleShjbSwgbmFtZSwgZSwgaGFuZGxlKSB7XG4gICAgdmFyIHNlcSA9IGNtLnN0YXRlLmtleVNlcTtcbiAgICBpZiAoc2VxKSB7XG4gICAgICBpZiAoaXNNb2RpZmllcktleShuYW1lKSkgeyByZXR1cm4gXCJoYW5kbGVkXCIgfVxuICAgICAgaWYgKC9cXCckLy50ZXN0KG5hbWUpKVxuICAgICAgICB7IGNtLnN0YXRlLmtleVNlcSA9IG51bGw7IH1cbiAgICAgIGVsc2VcbiAgICAgICAgeyBzdG9wU2VxLnNldCg1MCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChjbS5zdGF0ZS5rZXlTZXEgPT0gc2VxKSB7XG4gICAgICAgICAgICBjbS5zdGF0ZS5rZXlTZXEgPSBudWxsO1xuICAgICAgICAgICAgY20uZGlzcGxheS5pbnB1dC5yZXNldCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7IH1cbiAgICAgIGlmIChkaXNwYXRjaEtleUlubmVyKGNtLCBzZXEgKyBcIiBcIiArIG5hbWUsIGUsIGhhbmRsZSkpIHsgcmV0dXJuIHRydWUgfVxuICAgIH1cbiAgICByZXR1cm4gZGlzcGF0Y2hLZXlJbm5lcihjbSwgbmFtZSwgZSwgaGFuZGxlKVxuICB9XG5cbiAgZnVuY3Rpb24gZGlzcGF0Y2hLZXlJbm5lcihjbSwgbmFtZSwgZSwgaGFuZGxlKSB7XG4gICAgdmFyIHJlc3VsdCA9IGxvb2t1cEtleUZvckVkaXRvcihjbSwgbmFtZSwgaGFuZGxlKTtcblxuICAgIGlmIChyZXN1bHQgPT0gXCJtdWx0aVwiKVxuICAgICAgeyBjbS5zdGF0ZS5rZXlTZXEgPSBuYW1lOyB9XG4gICAgaWYgKHJlc3VsdCA9PSBcImhhbmRsZWRcIilcbiAgICAgIHsgc2lnbmFsTGF0ZXIoY20sIFwia2V5SGFuZGxlZFwiLCBjbSwgbmFtZSwgZSk7IH1cblxuICAgIGlmIChyZXN1bHQgPT0gXCJoYW5kbGVkXCIgfHwgcmVzdWx0ID09IFwibXVsdGlcIikge1xuICAgICAgZV9wcmV2ZW50RGVmYXVsdChlKTtcbiAgICAgIHJlc3RhcnRCbGluayhjbSk7XG4gICAgfVxuXG4gICAgcmV0dXJuICEhcmVzdWx0XG4gIH1cblxuICAvLyBIYW5kbGUgYSBrZXkgZnJvbSB0aGUga2V5ZG93biBldmVudC5cbiAgZnVuY3Rpb24gaGFuZGxlS2V5QmluZGluZyhjbSwgZSkge1xuICAgIHZhciBuYW1lID0ga2V5TmFtZShlLCB0cnVlKTtcbiAgICBpZiAoIW5hbWUpIHsgcmV0dXJuIGZhbHNlIH1cblxuICAgIGlmIChlLnNoaWZ0S2V5ICYmICFjbS5zdGF0ZS5rZXlTZXEpIHtcbiAgICAgIC8vIEZpcnN0IHRyeSB0byByZXNvbHZlIGZ1bGwgbmFtZSAoaW5jbHVkaW5nICdTaGlmdC0nKS4gRmFpbGluZ1xuICAgICAgLy8gdGhhdCwgc2VlIGlmIHRoZXJlIGlzIGEgY3Vyc29yLW1vdGlvbiBjb21tYW5kIChzdGFydGluZyB3aXRoXG4gICAgICAvLyAnZ28nKSBib3VuZCB0byB0aGUga2V5bmFtZSB3aXRob3V0ICdTaGlmdC0nLlxuICAgICAgcmV0dXJuIGRpc3BhdGNoS2V5KGNtLCBcIlNoaWZ0LVwiICsgbmFtZSwgZSwgZnVuY3Rpb24gKGIpIHsgcmV0dXJuIGRvSGFuZGxlQmluZGluZyhjbSwgYiwgdHJ1ZSk7IH0pXG4gICAgICAgICAgfHwgZGlzcGF0Y2hLZXkoY20sIG5hbWUsIGUsIGZ1bmN0aW9uIChiKSB7XG4gICAgICAgICAgICAgICBpZiAodHlwZW9mIGIgPT0gXCJzdHJpbmdcIiA/IC9eZ29bQS1aXS8udGVzdChiKSA6IGIubW90aW9uKVxuICAgICAgICAgICAgICAgICB7IHJldHVybiBkb0hhbmRsZUJpbmRpbmcoY20sIGIpIH1cbiAgICAgICAgICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZGlzcGF0Y2hLZXkoY20sIG5hbWUsIGUsIGZ1bmN0aW9uIChiKSB7IHJldHVybiBkb0hhbmRsZUJpbmRpbmcoY20sIGIpOyB9KVxuICAgIH1cbiAgfVxuXG4gIC8vIEhhbmRsZSBhIGtleSBmcm9tIHRoZSBrZXlwcmVzcyBldmVudFxuICBmdW5jdGlvbiBoYW5kbGVDaGFyQmluZGluZyhjbSwgZSwgY2gpIHtcbiAgICByZXR1cm4gZGlzcGF0Y2hLZXkoY20sIFwiJ1wiICsgY2ggKyBcIidcIiwgZSwgZnVuY3Rpb24gKGIpIHsgcmV0dXJuIGRvSGFuZGxlQmluZGluZyhjbSwgYiwgdHJ1ZSk7IH0pXG4gIH1cblxuICB2YXIgbGFzdFN0b3BwZWRLZXkgPSBudWxsO1xuICBmdW5jdGlvbiBvbktleURvd24oZSkge1xuICAgIHZhciBjbSA9IHRoaXM7XG4gICAgaWYgKGUudGFyZ2V0ICYmIGUudGFyZ2V0ICE9IGNtLmRpc3BsYXkuaW5wdXQuZ2V0RmllbGQoKSkgeyByZXR1cm4gfVxuICAgIGNtLmN1ck9wLmZvY3VzID0gYWN0aXZlRWx0KCk7XG4gICAgaWYgKHNpZ25hbERPTUV2ZW50KGNtLCBlKSkgeyByZXR1cm4gfVxuICAgIC8vIElFIGRvZXMgc3RyYW5nZSB0aGluZ3Mgd2l0aCBlc2NhcGUuXG4gICAgaWYgKGllICYmIGllX3ZlcnNpb24gPCAxMSAmJiBlLmtleUNvZGUgPT0gMjcpIHsgZS5yZXR1cm5WYWx1ZSA9IGZhbHNlOyB9XG4gICAgdmFyIGNvZGUgPSBlLmtleUNvZGU7XG4gICAgY20uZGlzcGxheS5zaGlmdCA9IGNvZGUgPT0gMTYgfHwgZS5zaGlmdEtleTtcbiAgICB2YXIgaGFuZGxlZCA9IGhhbmRsZUtleUJpbmRpbmcoY20sIGUpO1xuICAgIGlmIChwcmVzdG8pIHtcbiAgICAgIGxhc3RTdG9wcGVkS2V5ID0gaGFuZGxlZCA/IGNvZGUgOiBudWxsO1xuICAgICAgLy8gT3BlcmEgaGFzIG5vIGN1dCBldmVudC4uLiB3ZSB0cnkgdG8gYXQgbGVhc3QgY2F0Y2ggdGhlIGtleSBjb21ib1xuICAgICAgaWYgKCFoYW5kbGVkICYmIGNvZGUgPT0gODggJiYgIWhhc0NvcHlFdmVudCAmJiAobWFjID8gZS5tZXRhS2V5IDogZS5jdHJsS2V5KSlcbiAgICAgICAgeyBjbS5yZXBsYWNlU2VsZWN0aW9uKFwiXCIsIG51bGwsIFwiY3V0XCIpOyB9XG4gICAgfVxuICAgIGlmIChnZWNrbyAmJiAhbWFjICYmICFoYW5kbGVkICYmIGNvZGUgPT0gNDYgJiYgZS5zaGlmdEtleSAmJiAhZS5jdHJsS2V5ICYmIGRvY3VtZW50LmV4ZWNDb21tYW5kKVxuICAgICAgeyBkb2N1bWVudC5leGVjQ29tbWFuZChcImN1dFwiKTsgfVxuXG4gICAgLy8gVHVybiBtb3VzZSBpbnRvIGNyb3NzaGFpciB3aGVuIEFsdCBpcyBoZWxkIG9uIE1hYy5cbiAgICBpZiAoY29kZSA9PSAxOCAmJiAhL1xcYkNvZGVNaXJyb3ItY3Jvc3NoYWlyXFxiLy50ZXN0KGNtLmRpc3BsYXkubGluZURpdi5jbGFzc05hbWUpKVxuICAgICAgeyBzaG93Q3Jvc3NIYWlyKGNtKTsgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2hvd0Nyb3NzSGFpcihjbSkge1xuICAgIHZhciBsaW5lRGl2ID0gY20uZGlzcGxheS5saW5lRGl2O1xuICAgIGFkZENsYXNzKGxpbmVEaXYsIFwiQ29kZU1pcnJvci1jcm9zc2hhaXJcIik7XG5cbiAgICBmdW5jdGlvbiB1cChlKSB7XG4gICAgICBpZiAoZS5rZXlDb2RlID09IDE4IHx8ICFlLmFsdEtleSkge1xuICAgICAgICBybUNsYXNzKGxpbmVEaXYsIFwiQ29kZU1pcnJvci1jcm9zc2hhaXJcIik7XG4gICAgICAgIG9mZihkb2N1bWVudCwgXCJrZXl1cFwiLCB1cCk7XG4gICAgICAgIG9mZihkb2N1bWVudCwgXCJtb3VzZW92ZXJcIiwgdXApO1xuICAgICAgfVxuICAgIH1cbiAgICBvbihkb2N1bWVudCwgXCJrZXl1cFwiLCB1cCk7XG4gICAgb24oZG9jdW1lbnQsIFwibW91c2VvdmVyXCIsIHVwKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uS2V5VXAoZSkge1xuICAgIGlmIChlLmtleUNvZGUgPT0gMTYpIHsgdGhpcy5kb2Muc2VsLnNoaWZ0ID0gZmFsc2U7IH1cbiAgICBzaWduYWxET01FdmVudCh0aGlzLCBlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uS2V5UHJlc3MoZSkge1xuICAgIHZhciBjbSA9IHRoaXM7XG4gICAgaWYgKGUudGFyZ2V0ICYmIGUudGFyZ2V0ICE9IGNtLmRpc3BsYXkuaW5wdXQuZ2V0RmllbGQoKSkgeyByZXR1cm4gfVxuICAgIGlmIChldmVudEluV2lkZ2V0KGNtLmRpc3BsYXksIGUpIHx8IHNpZ25hbERPTUV2ZW50KGNtLCBlKSB8fCBlLmN0cmxLZXkgJiYgIWUuYWx0S2V5IHx8IG1hYyAmJiBlLm1ldGFLZXkpIHsgcmV0dXJuIH1cbiAgICB2YXIga2V5Q29kZSA9IGUua2V5Q29kZSwgY2hhckNvZGUgPSBlLmNoYXJDb2RlO1xuICAgIGlmIChwcmVzdG8gJiYga2V5Q29kZSA9PSBsYXN0U3RvcHBlZEtleSkge2xhc3RTdG9wcGVkS2V5ID0gbnVsbDsgZV9wcmV2ZW50RGVmYXVsdChlKTsgcmV0dXJufVxuICAgIGlmICgocHJlc3RvICYmICghZS53aGljaCB8fCBlLndoaWNoIDwgMTApKSAmJiBoYW5kbGVLZXlCaW5kaW5nKGNtLCBlKSkgeyByZXR1cm4gfVxuICAgIHZhciBjaCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckNvZGUgPT0gbnVsbCA/IGtleUNvZGUgOiBjaGFyQ29kZSk7XG4gICAgLy8gU29tZSBicm93c2VycyBmaXJlIGtleXByZXNzIGV2ZW50cyBmb3IgYmFja3NwYWNlXG4gICAgaWYgKGNoID09IFwiXFx4MDhcIikgeyByZXR1cm4gfVxuICAgIGlmIChoYW5kbGVDaGFyQmluZGluZyhjbSwgZSwgY2gpKSB7IHJldHVybiB9XG4gICAgY20uZGlzcGxheS5pbnB1dC5vbktleVByZXNzKGUpO1xuICB9XG5cbiAgdmFyIERPVUJMRUNMSUNLX0RFTEFZID0gNDAwO1xuXG4gIHZhciBQYXN0Q2xpY2sgPSBmdW5jdGlvbih0aW1lLCBwb3MsIGJ1dHRvbikge1xuICAgIHRoaXMudGltZSA9IHRpbWU7XG4gICAgdGhpcy5wb3MgPSBwb3M7XG4gICAgdGhpcy5idXR0b24gPSBidXR0b247XG4gIH07XG5cbiAgUGFzdENsaWNrLnByb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24gKHRpbWUsIHBvcywgYnV0dG9uKSB7XG4gICAgcmV0dXJuIHRoaXMudGltZSArIERPVUJMRUNMSUNLX0RFTEFZID4gdGltZSAmJlxuICAgICAgY21wKHBvcywgdGhpcy5wb3MpID09IDAgJiYgYnV0dG9uID09IHRoaXMuYnV0dG9uXG4gIH07XG5cbiAgdmFyIGxhc3RDbGljaywgbGFzdERvdWJsZUNsaWNrO1xuICBmdW5jdGlvbiBjbGlja1JlcGVhdChwb3MsIGJ1dHRvbikge1xuICAgIHZhciBub3cgPSArbmV3IERhdGU7XG4gICAgaWYgKGxhc3REb3VibGVDbGljayAmJiBsYXN0RG91YmxlQ2xpY2suY29tcGFyZShub3csIHBvcywgYnV0dG9uKSkge1xuICAgICAgbGFzdENsaWNrID0gbGFzdERvdWJsZUNsaWNrID0gbnVsbDtcbiAgICAgIHJldHVybiBcInRyaXBsZVwiXG4gICAgfSBlbHNlIGlmIChsYXN0Q2xpY2sgJiYgbGFzdENsaWNrLmNvbXBhcmUobm93LCBwb3MsIGJ1dHRvbikpIHtcbiAgICAgIGxhc3REb3VibGVDbGljayA9IG5ldyBQYXN0Q2xpY2sobm93LCBwb3MsIGJ1dHRvbik7XG4gICAgICBsYXN0Q2xpY2sgPSBudWxsO1xuICAgICAgcmV0dXJuIFwiZG91YmxlXCJcbiAgICB9IGVsc2Uge1xuICAgICAgbGFzdENsaWNrID0gbmV3IFBhc3RDbGljayhub3csIHBvcywgYnV0dG9uKTtcbiAgICAgIGxhc3REb3VibGVDbGljayA9IG51bGw7XG4gICAgICByZXR1cm4gXCJzaW5nbGVcIlxuICAgIH1cbiAgfVxuXG4gIC8vIEEgbW91c2UgZG93biBjYW4gYmUgYSBzaW5nbGUgY2xpY2ssIGRvdWJsZSBjbGljaywgdHJpcGxlIGNsaWNrLFxuICAvLyBzdGFydCBvZiBzZWxlY3Rpb24gZHJhZywgc3RhcnQgb2YgdGV4dCBkcmFnLCBuZXcgY3Vyc29yXG4gIC8vIChjdHJsLWNsaWNrKSwgcmVjdGFuZ2xlIGRyYWcgKGFsdC1kcmFnKSwgb3IgeHdpblxuICAvLyBtaWRkbGUtY2xpY2stcGFzdGUuIE9yIGl0IG1pZ2h0IGJlIGEgY2xpY2sgb24gc29tZXRoaW5nIHdlIHNob3VsZFxuICAvLyBub3QgaW50ZXJmZXJlIHdpdGgsIHN1Y2ggYXMgYSBzY3JvbGxiYXIgb3Igd2lkZ2V0LlxuICBmdW5jdGlvbiBvbk1vdXNlRG93bihlKSB7XG4gICAgdmFyIGNtID0gdGhpcywgZGlzcGxheSA9IGNtLmRpc3BsYXk7XG4gICAgaWYgKHNpZ25hbERPTUV2ZW50KGNtLCBlKSB8fCBkaXNwbGF5LmFjdGl2ZVRvdWNoICYmIGRpc3BsYXkuaW5wdXQuc3VwcG9ydHNUb3VjaCgpKSB7IHJldHVybiB9XG4gICAgZGlzcGxheS5pbnB1dC5lbnN1cmVQb2xsZWQoKTtcbiAgICBkaXNwbGF5LnNoaWZ0ID0gZS5zaGlmdEtleTtcblxuICAgIGlmIChldmVudEluV2lkZ2V0KGRpc3BsYXksIGUpKSB7XG4gICAgICBpZiAoIXdlYmtpdCkge1xuICAgICAgICAvLyBCcmllZmx5IHR1cm4gb2ZmIGRyYWdnYWJpbGl0eSwgdG8gYWxsb3cgd2lkZ2V0cyB0byBkb1xuICAgICAgICAvLyBub3JtYWwgZHJhZ2dpbmcgdGhpbmdzLlxuICAgICAgICBkaXNwbGF5LnNjcm9sbGVyLmRyYWdnYWJsZSA9IGZhbHNlO1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgcmV0dXJuIGRpc3BsYXkuc2Nyb2xsZXIuZHJhZ2dhYmxlID0gdHJ1ZTsgfSwgMTAwKTtcbiAgICAgIH1cbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoY2xpY2tJbkd1dHRlcihjbSwgZSkpIHsgcmV0dXJuIH1cbiAgICB2YXIgcG9zID0gcG9zRnJvbU1vdXNlKGNtLCBlKSwgYnV0dG9uID0gZV9idXR0b24oZSksIHJlcGVhdCA9IHBvcyA/IGNsaWNrUmVwZWF0KHBvcywgYnV0dG9uKSA6IFwic2luZ2xlXCI7XG4gICAgd2luZG93LmZvY3VzKCk7XG5cbiAgICAvLyAjMzI2MTogbWFrZSBzdXJlLCB0aGF0IHdlJ3JlIG5vdCBzdGFydGluZyBhIHNlY29uZCBzZWxlY3Rpb25cbiAgICBpZiAoYnV0dG9uID09IDEgJiYgY20uc3RhdGUuc2VsZWN0aW5nVGV4dClcbiAgICAgIHsgY20uc3RhdGUuc2VsZWN0aW5nVGV4dChlKTsgfVxuXG4gICAgaWYgKHBvcyAmJiBoYW5kbGVNYXBwZWRCdXR0b24oY20sIGJ1dHRvbiwgcG9zLCByZXBlYXQsIGUpKSB7IHJldHVybiB9XG5cbiAgICBpZiAoYnV0dG9uID09IDEpIHtcbiAgICAgIGlmIChwb3MpIHsgbGVmdEJ1dHRvbkRvd24oY20sIHBvcywgcmVwZWF0LCBlKTsgfVxuICAgICAgZWxzZSBpZiAoZV90YXJnZXQoZSkgPT0gZGlzcGxheS5zY3JvbGxlcikgeyBlX3ByZXZlbnREZWZhdWx0KGUpOyB9XG4gICAgfSBlbHNlIGlmIChidXR0b24gPT0gMikge1xuICAgICAgaWYgKHBvcykgeyBleHRlbmRTZWxlY3Rpb24oY20uZG9jLCBwb3MpOyB9XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgcmV0dXJuIGRpc3BsYXkuaW5wdXQuZm9jdXMoKTsgfSwgMjApO1xuICAgIH0gZWxzZSBpZiAoYnV0dG9uID09IDMpIHtcbiAgICAgIGlmIChjYXB0dXJlUmlnaHRDbGljaykgeyBjbS5kaXNwbGF5LmlucHV0Lm9uQ29udGV4dE1lbnUoZSk7IH1cbiAgICAgIGVsc2UgeyBkZWxheUJsdXJFdmVudChjbSk7IH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVNYXBwZWRCdXR0b24oY20sIGJ1dHRvbiwgcG9zLCByZXBlYXQsIGV2ZW50KSB7XG4gICAgdmFyIG5hbWUgPSBcIkNsaWNrXCI7XG4gICAgaWYgKHJlcGVhdCA9PSBcImRvdWJsZVwiKSB7IG5hbWUgPSBcIkRvdWJsZVwiICsgbmFtZTsgfVxuICAgIGVsc2UgaWYgKHJlcGVhdCA9PSBcInRyaXBsZVwiKSB7IG5hbWUgPSBcIlRyaXBsZVwiICsgbmFtZTsgfVxuICAgIG5hbWUgPSAoYnV0dG9uID09IDEgPyBcIkxlZnRcIiA6IGJ1dHRvbiA9PSAyID8gXCJNaWRkbGVcIiA6IFwiUmlnaHRcIikgKyBuYW1lO1xuXG4gICAgcmV0dXJuIGRpc3BhdGNoS2V5KGNtLCAgYWRkTW9kaWZpZXJOYW1lcyhuYW1lLCBldmVudCksIGV2ZW50LCBmdW5jdGlvbiAoYm91bmQpIHtcbiAgICAgIGlmICh0eXBlb2YgYm91bmQgPT0gXCJzdHJpbmdcIikgeyBib3VuZCA9IGNvbW1hbmRzW2JvdW5kXTsgfVxuICAgICAgaWYgKCFib3VuZCkgeyByZXR1cm4gZmFsc2UgfVxuICAgICAgdmFyIGRvbmUgPSBmYWxzZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChjbS5pc1JlYWRPbmx5KCkpIHsgY20uc3RhdGUuc3VwcHJlc3NFZGl0cyA9IHRydWU7IH1cbiAgICAgICAgZG9uZSA9IGJvdW5kKGNtLCBwb3MpICE9IFBhc3M7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBjbS5zdGF0ZS5zdXBwcmVzc0VkaXRzID0gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gZG9uZVxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiBjb25maWd1cmVNb3VzZShjbSwgcmVwZWF0LCBldmVudCkge1xuICAgIHZhciBvcHRpb24gPSBjbS5nZXRPcHRpb24oXCJjb25maWd1cmVNb3VzZVwiKTtcbiAgICB2YXIgdmFsdWUgPSBvcHRpb24gPyBvcHRpb24oY20sIHJlcGVhdCwgZXZlbnQpIDoge307XG4gICAgaWYgKHZhbHVlLnVuaXQgPT0gbnVsbCkge1xuICAgICAgdmFyIHJlY3QgPSBjaHJvbWVPUyA/IGV2ZW50LnNoaWZ0S2V5ICYmIGV2ZW50Lm1ldGFLZXkgOiBldmVudC5hbHRLZXk7XG4gICAgICB2YWx1ZS51bml0ID0gcmVjdCA/IFwicmVjdGFuZ2xlXCIgOiByZXBlYXQgPT0gXCJzaW5nbGVcIiA/IFwiY2hhclwiIDogcmVwZWF0ID09IFwiZG91YmxlXCIgPyBcIndvcmRcIiA6IFwibGluZVwiO1xuICAgIH1cbiAgICBpZiAodmFsdWUuZXh0ZW5kID09IG51bGwgfHwgY20uZG9jLmV4dGVuZCkgeyB2YWx1ZS5leHRlbmQgPSBjbS5kb2MuZXh0ZW5kIHx8IGV2ZW50LnNoaWZ0S2V5OyB9XG4gICAgaWYgKHZhbHVlLmFkZE5ldyA9PSBudWxsKSB7IHZhbHVlLmFkZE5ldyA9IG1hYyA/IGV2ZW50Lm1ldGFLZXkgOiBldmVudC5jdHJsS2V5OyB9XG4gICAgaWYgKHZhbHVlLm1vdmVPbkRyYWcgPT0gbnVsbCkgeyB2YWx1ZS5tb3ZlT25EcmFnID0gIShtYWMgPyBldmVudC5hbHRLZXkgOiBldmVudC5jdHJsS2V5KTsgfVxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgZnVuY3Rpb24gbGVmdEJ1dHRvbkRvd24oY20sIHBvcywgcmVwZWF0LCBldmVudCkge1xuICAgIGlmIChpZSkgeyBzZXRUaW1lb3V0KGJpbmQoZW5zdXJlRm9jdXMsIGNtKSwgMCk7IH1cbiAgICBlbHNlIHsgY20uY3VyT3AuZm9jdXMgPSBhY3RpdmVFbHQoKTsgfVxuXG4gICAgdmFyIGJlaGF2aW9yID0gY29uZmlndXJlTW91c2UoY20sIHJlcGVhdCwgZXZlbnQpO1xuXG4gICAgdmFyIHNlbCA9IGNtLmRvYy5zZWwsIGNvbnRhaW5lZDtcbiAgICBpZiAoY20ub3B0aW9ucy5kcmFnRHJvcCAmJiBkcmFnQW5kRHJvcCAmJiAhY20uaXNSZWFkT25seSgpICYmXG4gICAgICAgIHJlcGVhdCA9PSBcInNpbmdsZVwiICYmIChjb250YWluZWQgPSBzZWwuY29udGFpbnMocG9zKSkgPiAtMSAmJlxuICAgICAgICAoY21wKChjb250YWluZWQgPSBzZWwucmFuZ2VzW2NvbnRhaW5lZF0pLmZyb20oKSwgcG9zKSA8IDAgfHwgcG9zLnhSZWwgPiAwKSAmJlxuICAgICAgICAoY21wKGNvbnRhaW5lZC50bygpLCBwb3MpID4gMCB8fCBwb3MueFJlbCA8IDApKVxuICAgICAgeyBsZWZ0QnV0dG9uU3RhcnREcmFnKGNtLCBldmVudCwgcG9zLCBiZWhhdmlvcik7IH1cbiAgICBlbHNlXG4gICAgICB7IGxlZnRCdXR0b25TZWxlY3QoY20sIGV2ZW50LCBwb3MsIGJlaGF2aW9yKTsgfVxuICB9XG5cbiAgLy8gU3RhcnQgYSB0ZXh0IGRyYWcuIFdoZW4gaXQgZW5kcywgc2VlIGlmIGFueSBkcmFnZ2luZyBhY3R1YWxseVxuICAvLyBoYXBwZW4sIGFuZCB0cmVhdCBhcyBhIGNsaWNrIGlmIGl0IGRpZG4ndC5cbiAgZnVuY3Rpb24gbGVmdEJ1dHRvblN0YXJ0RHJhZyhjbSwgZXZlbnQsIHBvcywgYmVoYXZpb3IpIHtcbiAgICB2YXIgZGlzcGxheSA9IGNtLmRpc3BsYXksIG1vdmVkID0gZmFsc2U7XG4gICAgdmFyIGRyYWdFbmQgPSBvcGVyYXRpb24oY20sIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAod2Via2l0KSB7IGRpc3BsYXkuc2Nyb2xsZXIuZHJhZ2dhYmxlID0gZmFsc2U7IH1cbiAgICAgIGNtLnN0YXRlLmRyYWdnaW5nVGV4dCA9IGZhbHNlO1xuICAgICAgaWYgKGNtLnN0YXRlLmRlbGF5aW5nQmx1ckV2ZW50KSB7XG4gICAgICAgIGlmIChjbS5oYXNGb2N1cygpKSB7IGNtLnN0YXRlLmRlbGF5aW5nQmx1ckV2ZW50ID0gZmFsc2U7IH1cbiAgICAgICAgZWxzZSB7IGRlbGF5Qmx1ckV2ZW50KGNtKTsgfVxuICAgICAgfVxuICAgICAgb2ZmKGRpc3BsYXkud3JhcHBlci5vd25lckRvY3VtZW50LCBcIm1vdXNldXBcIiwgZHJhZ0VuZCk7XG4gICAgICBvZmYoZGlzcGxheS53cmFwcGVyLm93bmVyRG9jdW1lbnQsIFwibW91c2Vtb3ZlXCIsIG1vdXNlTW92ZSk7XG4gICAgICBvZmYoZGlzcGxheS5zY3JvbGxlciwgXCJkcmFnc3RhcnRcIiwgZHJhZ1N0YXJ0KTtcbiAgICAgIG9mZihkaXNwbGF5LnNjcm9sbGVyLCBcImRyb3BcIiwgZHJhZ0VuZCk7XG4gICAgICBpZiAoIW1vdmVkKSB7XG4gICAgICAgIGVfcHJldmVudERlZmF1bHQoZSk7XG4gICAgICAgIGlmICghYmVoYXZpb3IuYWRkTmV3KVxuICAgICAgICAgIHsgZXh0ZW5kU2VsZWN0aW9uKGNtLmRvYywgcG9zLCBudWxsLCBudWxsLCBiZWhhdmlvci5leHRlbmQpOyB9XG4gICAgICAgIC8vIFdvcmsgYXJvdW5kIHVuZXhwbGFpbmFibGUgZm9jdXMgcHJvYmxlbSBpbiBJRTkgKCMyMTI3KSBhbmQgQ2hyb21lICgjMzA4MSlcbiAgICAgICAgaWYgKCh3ZWJraXQgJiYgIXNhZmFyaSkgfHwgaWUgJiYgaWVfdmVyc2lvbiA9PSA5KVxuICAgICAgICAgIHsgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7ZGlzcGxheS53cmFwcGVyLm93bmVyRG9jdW1lbnQuYm9keS5mb2N1cyh7cHJldmVudFNjcm9sbDogdHJ1ZX0pOyBkaXNwbGF5LmlucHV0LmZvY3VzKCk7fSwgMjApOyB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICB7IGRpc3BsYXkuaW5wdXQuZm9jdXMoKTsgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHZhciBtb3VzZU1vdmUgPSBmdW5jdGlvbihlMikge1xuICAgICAgbW92ZWQgPSBtb3ZlZCB8fCBNYXRoLmFicyhldmVudC5jbGllbnRYIC0gZTIuY2xpZW50WCkgKyBNYXRoLmFicyhldmVudC5jbGllbnRZIC0gZTIuY2xpZW50WSkgPj0gMTA7XG4gICAgfTtcbiAgICB2YXIgZHJhZ1N0YXJ0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbW92ZWQgPSB0cnVlOyB9O1xuICAgIC8vIExldCB0aGUgZHJhZyBoYW5kbGVyIGhhbmRsZSB0aGlzLlxuICAgIGlmICh3ZWJraXQpIHsgZGlzcGxheS5zY3JvbGxlci5kcmFnZ2FibGUgPSB0cnVlOyB9XG4gICAgY20uc3RhdGUuZHJhZ2dpbmdUZXh0ID0gZHJhZ0VuZDtcbiAgICBkcmFnRW5kLmNvcHkgPSAhYmVoYXZpb3IubW92ZU9uRHJhZztcbiAgICBvbihkaXNwbGF5LndyYXBwZXIub3duZXJEb2N1bWVudCwgXCJtb3VzZXVwXCIsIGRyYWdFbmQpO1xuICAgIG9uKGRpc3BsYXkud3JhcHBlci5vd25lckRvY3VtZW50LCBcIm1vdXNlbW92ZVwiLCBtb3VzZU1vdmUpO1xuICAgIG9uKGRpc3BsYXkuc2Nyb2xsZXIsIFwiZHJhZ3N0YXJ0XCIsIGRyYWdTdGFydCk7XG4gICAgb24oZGlzcGxheS5zY3JvbGxlciwgXCJkcm9wXCIsIGRyYWdFbmQpO1xuXG4gICAgY20uc3RhdGUuZGVsYXlpbmdCbHVyRXZlbnQgPSB0cnVlO1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyByZXR1cm4gZGlzcGxheS5pbnB1dC5mb2N1cygpOyB9LCAyMCk7XG4gICAgLy8gSUUncyBhcHByb2FjaCB0byBkcmFnZ2FibGVcbiAgICBpZiAoZGlzcGxheS5zY3JvbGxlci5kcmFnRHJvcCkgeyBkaXNwbGF5LnNjcm9sbGVyLmRyYWdEcm9wKCk7IH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJhbmdlRm9yVW5pdChjbSwgcG9zLCB1bml0KSB7XG4gICAgaWYgKHVuaXQgPT0gXCJjaGFyXCIpIHsgcmV0dXJuIG5ldyBSYW5nZShwb3MsIHBvcykgfVxuICAgIGlmICh1bml0ID09IFwid29yZFwiKSB7IHJldHVybiBjbS5maW5kV29yZEF0KHBvcykgfVxuICAgIGlmICh1bml0ID09IFwibGluZVwiKSB7IHJldHVybiBuZXcgUmFuZ2UoUG9zKHBvcy5saW5lLCAwKSwgY2xpcFBvcyhjbS5kb2MsIFBvcyhwb3MubGluZSArIDEsIDApKSkgfVxuICAgIHZhciByZXN1bHQgPSB1bml0KGNtLCBwb3MpO1xuICAgIHJldHVybiBuZXcgUmFuZ2UocmVzdWx0LmZyb20sIHJlc3VsdC50bylcbiAgfVxuXG4gIC8vIE5vcm1hbCBzZWxlY3Rpb24sIGFzIG9wcG9zZWQgdG8gdGV4dCBkcmFnZ2luZy5cbiAgZnVuY3Rpb24gbGVmdEJ1dHRvblNlbGVjdChjbSwgZXZlbnQsIHN0YXJ0LCBiZWhhdmlvcikge1xuICAgIGlmIChpZSkgeyBkZWxheUJsdXJFdmVudChjbSk7IH1cbiAgICB2YXIgZGlzcGxheSA9IGNtLmRpc3BsYXksIGRvYyA9IGNtLmRvYztcbiAgICBlX3ByZXZlbnREZWZhdWx0KGV2ZW50KTtcblxuICAgIHZhciBvdXJSYW5nZSwgb3VySW5kZXgsIHN0YXJ0U2VsID0gZG9jLnNlbCwgcmFuZ2VzID0gc3RhcnRTZWwucmFuZ2VzO1xuICAgIGlmIChiZWhhdmlvci5hZGROZXcgJiYgIWJlaGF2aW9yLmV4dGVuZCkge1xuICAgICAgb3VySW5kZXggPSBkb2Muc2VsLmNvbnRhaW5zKHN0YXJ0KTtcbiAgICAgIGlmIChvdXJJbmRleCA+IC0xKVxuICAgICAgICB7IG91clJhbmdlID0gcmFuZ2VzW291ckluZGV4XTsgfVxuICAgICAgZWxzZVxuICAgICAgICB7IG91clJhbmdlID0gbmV3IFJhbmdlKHN0YXJ0LCBzdGFydCk7IH1cbiAgICB9IGVsc2Uge1xuICAgICAgb3VyUmFuZ2UgPSBkb2Muc2VsLnByaW1hcnkoKTtcbiAgICAgIG91ckluZGV4ID0gZG9jLnNlbC5wcmltSW5kZXg7XG4gICAgfVxuXG4gICAgaWYgKGJlaGF2aW9yLnVuaXQgPT0gXCJyZWN0YW5nbGVcIikge1xuICAgICAgaWYgKCFiZWhhdmlvci5hZGROZXcpIHsgb3VyUmFuZ2UgPSBuZXcgUmFuZ2Uoc3RhcnQsIHN0YXJ0KTsgfVxuICAgICAgc3RhcnQgPSBwb3NGcm9tTW91c2UoY20sIGV2ZW50LCB0cnVlLCB0cnVlKTtcbiAgICAgIG91ckluZGV4ID0gLTE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciByYW5nZSA9IHJhbmdlRm9yVW5pdChjbSwgc3RhcnQsIGJlaGF2aW9yLnVuaXQpO1xuICAgICAgaWYgKGJlaGF2aW9yLmV4dGVuZClcbiAgICAgICAgeyBvdXJSYW5nZSA9IGV4dGVuZFJhbmdlKG91clJhbmdlLCByYW5nZS5hbmNob3IsIHJhbmdlLmhlYWQsIGJlaGF2aW9yLmV4dGVuZCk7IH1cbiAgICAgIGVsc2VcbiAgICAgICAgeyBvdXJSYW5nZSA9IHJhbmdlOyB9XG4gICAgfVxuXG4gICAgaWYgKCFiZWhhdmlvci5hZGROZXcpIHtcbiAgICAgIG91ckluZGV4ID0gMDtcbiAgICAgIHNldFNlbGVjdGlvbihkb2MsIG5ldyBTZWxlY3Rpb24oW291clJhbmdlXSwgMCksIHNlbF9tb3VzZSk7XG4gICAgICBzdGFydFNlbCA9IGRvYy5zZWw7XG4gICAgfSBlbHNlIGlmIChvdXJJbmRleCA9PSAtMSkge1xuICAgICAgb3VySW5kZXggPSByYW5nZXMubGVuZ3RoO1xuICAgICAgc2V0U2VsZWN0aW9uKGRvYywgbm9ybWFsaXplU2VsZWN0aW9uKGNtLCByYW5nZXMuY29uY2F0KFtvdXJSYW5nZV0pLCBvdXJJbmRleCksXG4gICAgICAgICAgICAgICAgICAge3Njcm9sbDogZmFsc2UsIG9yaWdpbjogXCIqbW91c2VcIn0pO1xuICAgIH0gZWxzZSBpZiAocmFuZ2VzLmxlbmd0aCA+IDEgJiYgcmFuZ2VzW291ckluZGV4XS5lbXB0eSgpICYmIGJlaGF2aW9yLnVuaXQgPT0gXCJjaGFyXCIgJiYgIWJlaGF2aW9yLmV4dGVuZCkge1xuICAgICAgc2V0U2VsZWN0aW9uKGRvYywgbm9ybWFsaXplU2VsZWN0aW9uKGNtLCByYW5nZXMuc2xpY2UoMCwgb3VySW5kZXgpLmNvbmNhdChyYW5nZXMuc2xpY2Uob3VySW5kZXggKyAxKSksIDApLFxuICAgICAgICAgICAgICAgICAgIHtzY3JvbGw6IGZhbHNlLCBvcmlnaW46IFwiKm1vdXNlXCJ9KTtcbiAgICAgIHN0YXJ0U2VsID0gZG9jLnNlbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVwbGFjZU9uZVNlbGVjdGlvbihkb2MsIG91ckluZGV4LCBvdXJSYW5nZSwgc2VsX21vdXNlKTtcbiAgICB9XG5cbiAgICB2YXIgbGFzdFBvcyA9IHN0YXJ0O1xuICAgIGZ1bmN0aW9uIGV4dGVuZFRvKHBvcykge1xuICAgICAgaWYgKGNtcChsYXN0UG9zLCBwb3MpID09IDApIHsgcmV0dXJuIH1cbiAgICAgIGxhc3RQb3MgPSBwb3M7XG5cbiAgICAgIGlmIChiZWhhdmlvci51bml0ID09IFwicmVjdGFuZ2xlXCIpIHtcbiAgICAgICAgdmFyIHJhbmdlcyA9IFtdLCB0YWJTaXplID0gY20ub3B0aW9ucy50YWJTaXplO1xuICAgICAgICB2YXIgc3RhcnRDb2wgPSBjb3VudENvbHVtbihnZXRMaW5lKGRvYywgc3RhcnQubGluZSkudGV4dCwgc3RhcnQuY2gsIHRhYlNpemUpO1xuICAgICAgICB2YXIgcG9zQ29sID0gY291bnRDb2x1bW4oZ2V0TGluZShkb2MsIHBvcy5saW5lKS50ZXh0LCBwb3MuY2gsIHRhYlNpemUpO1xuICAgICAgICB2YXIgbGVmdCA9IE1hdGgubWluKHN0YXJ0Q29sLCBwb3NDb2wpLCByaWdodCA9IE1hdGgubWF4KHN0YXJ0Q29sLCBwb3NDb2wpO1xuICAgICAgICBmb3IgKHZhciBsaW5lID0gTWF0aC5taW4oc3RhcnQubGluZSwgcG9zLmxpbmUpLCBlbmQgPSBNYXRoLm1pbihjbS5sYXN0TGluZSgpLCBNYXRoLm1heChzdGFydC5saW5lLCBwb3MubGluZSkpO1xuICAgICAgICAgICAgIGxpbmUgPD0gZW5kOyBsaW5lKyspIHtcbiAgICAgICAgICB2YXIgdGV4dCA9IGdldExpbmUoZG9jLCBsaW5lKS50ZXh0LCBsZWZ0UG9zID0gZmluZENvbHVtbih0ZXh0LCBsZWZ0LCB0YWJTaXplKTtcbiAgICAgICAgICBpZiAobGVmdCA9PSByaWdodClcbiAgICAgICAgICAgIHsgcmFuZ2VzLnB1c2gobmV3IFJhbmdlKFBvcyhsaW5lLCBsZWZ0UG9zKSwgUG9zKGxpbmUsIGxlZnRQb3MpKSk7IH1cbiAgICAgICAgICBlbHNlIGlmICh0ZXh0Lmxlbmd0aCA+IGxlZnRQb3MpXG4gICAgICAgICAgICB7IHJhbmdlcy5wdXNoKG5ldyBSYW5nZShQb3MobGluZSwgbGVmdFBvcyksIFBvcyhsaW5lLCBmaW5kQ29sdW1uKHRleHQsIHJpZ2h0LCB0YWJTaXplKSkpKTsgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghcmFuZ2VzLmxlbmd0aCkgeyByYW5nZXMucHVzaChuZXcgUmFuZ2Uoc3RhcnQsIHN0YXJ0KSk7IH1cbiAgICAgICAgc2V0U2VsZWN0aW9uKGRvYywgbm9ybWFsaXplU2VsZWN0aW9uKGNtLCBzdGFydFNlbC5yYW5nZXMuc2xpY2UoMCwgb3VySW5kZXgpLmNvbmNhdChyYW5nZXMpLCBvdXJJbmRleCksXG4gICAgICAgICAgICAgICAgICAgICB7b3JpZ2luOiBcIiptb3VzZVwiLCBzY3JvbGw6IGZhbHNlfSk7XG4gICAgICAgIGNtLnNjcm9sbEludG9WaWV3KHBvcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgb2xkUmFuZ2UgPSBvdXJSYW5nZTtcbiAgICAgICAgdmFyIHJhbmdlID0gcmFuZ2VGb3JVbml0KGNtLCBwb3MsIGJlaGF2aW9yLnVuaXQpO1xuICAgICAgICB2YXIgYW5jaG9yID0gb2xkUmFuZ2UuYW5jaG9yLCBoZWFkO1xuICAgICAgICBpZiAoY21wKHJhbmdlLmFuY2hvciwgYW5jaG9yKSA+IDApIHtcbiAgICAgICAgICBoZWFkID0gcmFuZ2UuaGVhZDtcbiAgICAgICAgICBhbmNob3IgPSBtaW5Qb3Mob2xkUmFuZ2UuZnJvbSgpLCByYW5nZS5hbmNob3IpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGhlYWQgPSByYW5nZS5hbmNob3I7XG4gICAgICAgICAgYW5jaG9yID0gbWF4UG9zKG9sZFJhbmdlLnRvKCksIHJhbmdlLmhlYWQpO1xuICAgICAgICB9XG4gICAgICAgIHZhciByYW5nZXMkMSA9IHN0YXJ0U2VsLnJhbmdlcy5zbGljZSgwKTtcbiAgICAgICAgcmFuZ2VzJDFbb3VySW5kZXhdID0gYmlkaVNpbXBsaWZ5KGNtLCBuZXcgUmFuZ2UoY2xpcFBvcyhkb2MsIGFuY2hvciksIGhlYWQpKTtcbiAgICAgICAgc2V0U2VsZWN0aW9uKGRvYywgbm9ybWFsaXplU2VsZWN0aW9uKGNtLCByYW5nZXMkMSwgb3VySW5kZXgpLCBzZWxfbW91c2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBlZGl0b3JTaXplID0gZGlzcGxheS53cmFwcGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIC8vIFVzZWQgdG8gZW5zdXJlIHRpbWVvdXQgcmUtdHJpZXMgZG9uJ3QgZmlyZSB3aGVuIGFub3RoZXIgZXh0ZW5kXG4gICAgLy8gaGFwcGVuZWQgaW4gdGhlIG1lYW50aW1lIChjbGVhclRpbWVvdXQgaXNuJ3QgcmVsaWFibGUgLS0gYXRcbiAgICAvLyBsZWFzdCBvbiBDaHJvbWUsIHRoZSB0aW1lb3V0cyBzdGlsbCBoYXBwZW4gZXZlbiB3aGVuIGNsZWFyZWQsXG4gICAgLy8gaWYgdGhlIGNsZWFyIGhhcHBlbnMgYWZ0ZXIgdGhlaXIgc2NoZWR1bGVkIGZpcmluZyB0aW1lKS5cbiAgICB2YXIgY291bnRlciA9IDA7XG5cbiAgICBmdW5jdGlvbiBleHRlbmQoZSkge1xuICAgICAgdmFyIGN1ckNvdW50ID0gKytjb3VudGVyO1xuICAgICAgdmFyIGN1ciA9IHBvc0Zyb21Nb3VzZShjbSwgZSwgdHJ1ZSwgYmVoYXZpb3IudW5pdCA9PSBcInJlY3RhbmdsZVwiKTtcbiAgICAgIGlmICghY3VyKSB7IHJldHVybiB9XG4gICAgICBpZiAoY21wKGN1ciwgbGFzdFBvcykgIT0gMCkge1xuICAgICAgICBjbS5jdXJPcC5mb2N1cyA9IGFjdGl2ZUVsdCgpO1xuICAgICAgICBleHRlbmRUbyhjdXIpO1xuICAgICAgICB2YXIgdmlzaWJsZSA9IHZpc2libGVMaW5lcyhkaXNwbGF5LCBkb2MpO1xuICAgICAgICBpZiAoY3VyLmxpbmUgPj0gdmlzaWJsZS50byB8fCBjdXIubGluZSA8IHZpc2libGUuZnJvbSlcbiAgICAgICAgICB7IHNldFRpbWVvdXQob3BlcmF0aW9uKGNtLCBmdW5jdGlvbiAoKSB7aWYgKGNvdW50ZXIgPT0gY3VyQ291bnQpIHsgZXh0ZW5kKGUpOyB9fSksIDE1MCk7IH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBvdXRzaWRlID0gZS5jbGllbnRZIDwgZWRpdG9yU2l6ZS50b3AgPyAtMjAgOiBlLmNsaWVudFkgPiBlZGl0b3JTaXplLmJvdHRvbSA/IDIwIDogMDtcbiAgICAgICAgaWYgKG91dHNpZGUpIHsgc2V0VGltZW91dChvcGVyYXRpb24oY20sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoY291bnRlciAhPSBjdXJDb3VudCkgeyByZXR1cm4gfVxuICAgICAgICAgIGRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsVG9wICs9IG91dHNpZGU7XG4gICAgICAgICAgZXh0ZW5kKGUpO1xuICAgICAgICB9KSwgNTApOyB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZG9uZShlKSB7XG4gICAgICBjbS5zdGF0ZS5zZWxlY3RpbmdUZXh0ID0gZmFsc2U7XG4gICAgICBjb3VudGVyID0gSW5maW5pdHk7XG4gICAgICAvLyBJZiBlIGlzIG51bGwgb3IgdW5kZWZpbmVkIHdlIGludGVycHJldCB0aGlzIGFzIHNvbWVvbmUgdHJ5aW5nXG4gICAgICAvLyB0byBleHBsaWNpdGx5IGNhbmNlbCB0aGUgc2VsZWN0aW9uIHJhdGhlciB0aGFuIHRoZSB1c2VyXG4gICAgICAvLyBsZXR0aW5nIGdvIG9mIHRoZSBtb3VzZSBidXR0b24uXG4gICAgICBpZiAoZSkge1xuICAgICAgICBlX3ByZXZlbnREZWZhdWx0KGUpO1xuICAgICAgICBkaXNwbGF5LmlucHV0LmZvY3VzKCk7XG4gICAgICB9XG4gICAgICBvZmYoZGlzcGxheS53cmFwcGVyLm93bmVyRG9jdW1lbnQsIFwibW91c2Vtb3ZlXCIsIG1vdmUpO1xuICAgICAgb2ZmKGRpc3BsYXkud3JhcHBlci5vd25lckRvY3VtZW50LCBcIm1vdXNldXBcIiwgdXApO1xuICAgICAgZG9jLmhpc3RvcnkubGFzdFNlbE9yaWdpbiA9IG51bGw7XG4gICAgfVxuXG4gICAgdmFyIG1vdmUgPSBvcGVyYXRpb24oY20sIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoZS5idXR0b25zID09PSAwIHx8ICFlX2J1dHRvbihlKSkgeyBkb25lKGUpOyB9XG4gICAgICBlbHNlIHsgZXh0ZW5kKGUpOyB9XG4gICAgfSk7XG4gICAgdmFyIHVwID0gb3BlcmF0aW9uKGNtLCBkb25lKTtcbiAgICBjbS5zdGF0ZS5zZWxlY3RpbmdUZXh0ID0gdXA7XG4gICAgb24oZGlzcGxheS53cmFwcGVyLm93bmVyRG9jdW1lbnQsIFwibW91c2Vtb3ZlXCIsIG1vdmUpO1xuICAgIG9uKGRpc3BsYXkud3JhcHBlci5vd25lckRvY3VtZW50LCBcIm1vdXNldXBcIiwgdXApO1xuICB9XG5cbiAgLy8gVXNlZCB3aGVuIG1vdXNlLXNlbGVjdGluZyB0byBhZGp1c3QgdGhlIGFuY2hvciB0byB0aGUgcHJvcGVyIHNpZGVcbiAgLy8gb2YgYSBiaWRpIGp1bXAgZGVwZW5kaW5nIG9uIHRoZSB2aXN1YWwgcG9zaXRpb24gb2YgdGhlIGhlYWQuXG4gIGZ1bmN0aW9uIGJpZGlTaW1wbGlmeShjbSwgcmFuZ2UpIHtcbiAgICB2YXIgYW5jaG9yID0gcmFuZ2UuYW5jaG9yO1xuICAgIHZhciBoZWFkID0gcmFuZ2UuaGVhZDtcbiAgICB2YXIgYW5jaG9yTGluZSA9IGdldExpbmUoY20uZG9jLCBhbmNob3IubGluZSk7XG4gICAgaWYgKGNtcChhbmNob3IsIGhlYWQpID09IDAgJiYgYW5jaG9yLnN0aWNreSA9PSBoZWFkLnN0aWNreSkgeyByZXR1cm4gcmFuZ2UgfVxuICAgIHZhciBvcmRlciA9IGdldE9yZGVyKGFuY2hvckxpbmUpO1xuICAgIGlmICghb3JkZXIpIHsgcmV0dXJuIHJhbmdlIH1cbiAgICB2YXIgaW5kZXggPSBnZXRCaWRpUGFydEF0KG9yZGVyLCBhbmNob3IuY2gsIGFuY2hvci5zdGlja3kpLCBwYXJ0ID0gb3JkZXJbaW5kZXhdO1xuICAgIGlmIChwYXJ0LmZyb20gIT0gYW5jaG9yLmNoICYmIHBhcnQudG8gIT0gYW5jaG9yLmNoKSB7IHJldHVybiByYW5nZSB9XG4gICAgdmFyIGJvdW5kYXJ5ID0gaW5kZXggKyAoKHBhcnQuZnJvbSA9PSBhbmNob3IuY2gpID09IChwYXJ0LmxldmVsICE9IDEpID8gMCA6IDEpO1xuICAgIGlmIChib3VuZGFyeSA9PSAwIHx8IGJvdW5kYXJ5ID09IG9yZGVyLmxlbmd0aCkgeyByZXR1cm4gcmFuZ2UgfVxuXG4gICAgLy8gQ29tcHV0ZSB0aGUgcmVsYXRpdmUgdmlzdWFsIHBvc2l0aW9uIG9mIHRoZSBoZWFkIGNvbXBhcmVkIHRvIHRoZVxuICAgIC8vIGFuY2hvciAoPDAgaXMgdG8gdGhlIGxlZnQsID4wIHRvIHRoZSByaWdodClcbiAgICB2YXIgbGVmdFNpZGU7XG4gICAgaWYgKGhlYWQubGluZSAhPSBhbmNob3IubGluZSkge1xuICAgICAgbGVmdFNpZGUgPSAoaGVhZC5saW5lIC0gYW5jaG9yLmxpbmUpICogKGNtLmRvYy5kaXJlY3Rpb24gPT0gXCJsdHJcIiA/IDEgOiAtMSkgPiAwO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgaGVhZEluZGV4ID0gZ2V0QmlkaVBhcnRBdChvcmRlciwgaGVhZC5jaCwgaGVhZC5zdGlja3kpO1xuICAgICAgdmFyIGRpciA9IGhlYWRJbmRleCAtIGluZGV4IHx8IChoZWFkLmNoIC0gYW5jaG9yLmNoKSAqIChwYXJ0LmxldmVsID09IDEgPyAtMSA6IDEpO1xuICAgICAgaWYgKGhlYWRJbmRleCA9PSBib3VuZGFyeSAtIDEgfHwgaGVhZEluZGV4ID09IGJvdW5kYXJ5KVxuICAgICAgICB7IGxlZnRTaWRlID0gZGlyIDwgMDsgfVxuICAgICAgZWxzZVxuICAgICAgICB7IGxlZnRTaWRlID0gZGlyID4gMDsgfVxuICAgIH1cblxuICAgIHZhciB1c2VQYXJ0ID0gb3JkZXJbYm91bmRhcnkgKyAobGVmdFNpZGUgPyAtMSA6IDApXTtcbiAgICB2YXIgZnJvbSA9IGxlZnRTaWRlID09ICh1c2VQYXJ0LmxldmVsID09IDEpO1xuICAgIHZhciBjaCA9IGZyb20gPyB1c2VQYXJ0LmZyb20gOiB1c2VQYXJ0LnRvLCBzdGlja3kgPSBmcm9tID8gXCJhZnRlclwiIDogXCJiZWZvcmVcIjtcbiAgICByZXR1cm4gYW5jaG9yLmNoID09IGNoICYmIGFuY2hvci5zdGlja3kgPT0gc3RpY2t5ID8gcmFuZ2UgOiBuZXcgUmFuZ2UobmV3IFBvcyhhbmNob3IubGluZSwgY2gsIHN0aWNreSksIGhlYWQpXG4gIH1cblxuXG4gIC8vIERldGVybWluZXMgd2hldGhlciBhbiBldmVudCBoYXBwZW5lZCBpbiB0aGUgZ3V0dGVyLCBhbmQgZmlyZXMgdGhlXG4gIC8vIGhhbmRsZXJzIGZvciB0aGUgY29ycmVzcG9uZGluZyBldmVudC5cbiAgZnVuY3Rpb24gZ3V0dGVyRXZlbnQoY20sIGUsIHR5cGUsIHByZXZlbnQpIHtcbiAgICB2YXIgbVgsIG1ZO1xuICAgIGlmIChlLnRvdWNoZXMpIHtcbiAgICAgIG1YID0gZS50b3VjaGVzWzBdLmNsaWVudFg7XG4gICAgICBtWSA9IGUudG91Y2hlc1swXS5jbGllbnRZO1xuICAgIH0gZWxzZSB7XG4gICAgICB0cnkgeyBtWCA9IGUuY2xpZW50WDsgbVkgPSBlLmNsaWVudFk7IH1cbiAgICAgIGNhdGNoKGUkMSkgeyByZXR1cm4gZmFsc2UgfVxuICAgIH1cbiAgICBpZiAobVggPj0gTWF0aC5mbG9vcihjbS5kaXNwbGF5Lmd1dHRlcnMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQpKSB7IHJldHVybiBmYWxzZSB9XG4gICAgaWYgKHByZXZlbnQpIHsgZV9wcmV2ZW50RGVmYXVsdChlKTsgfVxuXG4gICAgdmFyIGRpc3BsYXkgPSBjbS5kaXNwbGF5O1xuICAgIHZhciBsaW5lQm94ID0gZGlzcGxheS5saW5lRGl2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgaWYgKG1ZID4gbGluZUJveC5ib3R0b20gfHwgIWhhc0hhbmRsZXIoY20sIHR5cGUpKSB7IHJldHVybiBlX2RlZmF1bHRQcmV2ZW50ZWQoZSkgfVxuICAgIG1ZIC09IGxpbmVCb3gudG9wIC0gZGlzcGxheS52aWV3T2Zmc2V0O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbS5kaXNwbGF5Lmd1dHRlclNwZWNzLmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgZyA9IGRpc3BsYXkuZ3V0dGVycy5jaGlsZE5vZGVzW2ldO1xuICAgICAgaWYgKGcgJiYgZy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodCA+PSBtWCkge1xuICAgICAgICB2YXIgbGluZSA9IGxpbmVBdEhlaWdodChjbS5kb2MsIG1ZKTtcbiAgICAgICAgdmFyIGd1dHRlciA9IGNtLmRpc3BsYXkuZ3V0dGVyU3BlY3NbaV07XG4gICAgICAgIHNpZ25hbChjbSwgdHlwZSwgY20sIGxpbmUsIGd1dHRlci5jbGFzc05hbWUsIGUpO1xuICAgICAgICByZXR1cm4gZV9kZWZhdWx0UHJldmVudGVkKGUpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2xpY2tJbkd1dHRlcihjbSwgZSkge1xuICAgIHJldHVybiBndXR0ZXJFdmVudChjbSwgZSwgXCJndXR0ZXJDbGlja1wiLCB0cnVlKVxuICB9XG5cbiAgLy8gQ09OVEVYVCBNRU5VIEhBTkRMSU5HXG5cbiAgLy8gVG8gbWFrZSB0aGUgY29udGV4dCBtZW51IHdvcmssIHdlIG5lZWQgdG8gYnJpZWZseSB1bmhpZGUgdGhlXG4gIC8vIHRleHRhcmVhIChtYWtpbmcgaXQgYXMgdW5vYnRydXNpdmUgYXMgcG9zc2libGUpIHRvIGxldCB0aGVcbiAgLy8gcmlnaHQtY2xpY2sgdGFrZSBlZmZlY3Qgb24gaXQuXG4gIGZ1bmN0aW9uIG9uQ29udGV4dE1lbnUoY20sIGUpIHtcbiAgICBpZiAoZXZlbnRJbldpZGdldChjbS5kaXNwbGF5LCBlKSB8fCBjb250ZXh0TWVudUluR3V0dGVyKGNtLCBlKSkgeyByZXR1cm4gfVxuICAgIGlmIChzaWduYWxET01FdmVudChjbSwgZSwgXCJjb250ZXh0bWVudVwiKSkgeyByZXR1cm4gfVxuICAgIGlmICghY2FwdHVyZVJpZ2h0Q2xpY2spIHsgY20uZGlzcGxheS5pbnB1dC5vbkNvbnRleHRNZW51KGUpOyB9XG4gIH1cblxuICBmdW5jdGlvbiBjb250ZXh0TWVudUluR3V0dGVyKGNtLCBlKSB7XG4gICAgaWYgKCFoYXNIYW5kbGVyKGNtLCBcImd1dHRlckNvbnRleHRNZW51XCIpKSB7IHJldHVybiBmYWxzZSB9XG4gICAgcmV0dXJuIGd1dHRlckV2ZW50KGNtLCBlLCBcImd1dHRlckNvbnRleHRNZW51XCIsIGZhbHNlKVxuICB9XG5cbiAgZnVuY3Rpb24gdGhlbWVDaGFuZ2VkKGNtKSB7XG4gICAgY20uZGlzcGxheS53cmFwcGVyLmNsYXNzTmFtZSA9IGNtLmRpc3BsYXkud3JhcHBlci5jbGFzc05hbWUucmVwbGFjZSgvXFxzKmNtLXMtXFxTKy9nLCBcIlwiKSArXG4gICAgICBjbS5vcHRpb25zLnRoZW1lLnJlcGxhY2UoLyhefFxccylcXHMqL2csIFwiIGNtLXMtXCIpO1xuICAgIGNsZWFyQ2FjaGVzKGNtKTtcbiAgfVxuXG4gIHZhciBJbml0ID0ge3RvU3RyaW5nOiBmdW5jdGlvbigpe3JldHVybiBcIkNvZGVNaXJyb3IuSW5pdFwifX07XG5cbiAgdmFyIGRlZmF1bHRzID0ge307XG4gIHZhciBvcHRpb25IYW5kbGVycyA9IHt9O1xuXG4gIGZ1bmN0aW9uIGRlZmluZU9wdGlvbnMoQ29kZU1pcnJvcikge1xuICAgIHZhciBvcHRpb25IYW5kbGVycyA9IENvZGVNaXJyb3Iub3B0aW9uSGFuZGxlcnM7XG5cbiAgICBmdW5jdGlvbiBvcHRpb24obmFtZSwgZGVmbHQsIGhhbmRsZSwgbm90T25Jbml0KSB7XG4gICAgICBDb2RlTWlycm9yLmRlZmF1bHRzW25hbWVdID0gZGVmbHQ7XG4gICAgICBpZiAoaGFuZGxlKSB7IG9wdGlvbkhhbmRsZXJzW25hbWVdID1cbiAgICAgICAgbm90T25Jbml0ID8gZnVuY3Rpb24gKGNtLCB2YWwsIG9sZCkge2lmIChvbGQgIT0gSW5pdCkgeyBoYW5kbGUoY20sIHZhbCwgb2xkKTsgfX0gOiBoYW5kbGU7IH1cbiAgICB9XG5cbiAgICBDb2RlTWlycm9yLmRlZmluZU9wdGlvbiA9IG9wdGlvbjtcblxuICAgIC8vIFBhc3NlZCB0byBvcHRpb24gaGFuZGxlcnMgd2hlbiB0aGVyZSBpcyBubyBvbGQgdmFsdWUuXG4gICAgQ29kZU1pcnJvci5Jbml0ID0gSW5pdDtcblxuICAgIC8vIFRoZXNlIHR3byBhcmUsIG9uIGluaXQsIGNhbGxlZCBmcm9tIHRoZSBjb25zdHJ1Y3RvciBiZWNhdXNlIHRoZXlcbiAgICAvLyBoYXZlIHRvIGJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGUgZWRpdG9yIGNhbiBzdGFydCBhdCBhbGwuXG4gICAgb3B0aW9uKFwidmFsdWVcIiwgXCJcIiwgZnVuY3Rpb24gKGNtLCB2YWwpIHsgcmV0dXJuIGNtLnNldFZhbHVlKHZhbCk7IH0sIHRydWUpO1xuICAgIG9wdGlvbihcIm1vZGVcIiwgbnVsbCwgZnVuY3Rpb24gKGNtLCB2YWwpIHtcbiAgICAgIGNtLmRvYy5tb2RlT3B0aW9uID0gdmFsO1xuICAgICAgbG9hZE1vZGUoY20pO1xuICAgIH0sIHRydWUpO1xuXG4gICAgb3B0aW9uKFwiaW5kZW50VW5pdFwiLCAyLCBsb2FkTW9kZSwgdHJ1ZSk7XG4gICAgb3B0aW9uKFwiaW5kZW50V2l0aFRhYnNcIiwgZmFsc2UpO1xuICAgIG9wdGlvbihcInNtYXJ0SW5kZW50XCIsIHRydWUpO1xuICAgIG9wdGlvbihcInRhYlNpemVcIiwgNCwgZnVuY3Rpb24gKGNtKSB7XG4gICAgICByZXNldE1vZGVTdGF0ZShjbSk7XG4gICAgICBjbGVhckNhY2hlcyhjbSk7XG4gICAgICByZWdDaGFuZ2UoY20pO1xuICAgIH0sIHRydWUpO1xuXG4gICAgb3B0aW9uKFwibGluZVNlcGFyYXRvclwiLCBudWxsLCBmdW5jdGlvbiAoY20sIHZhbCkge1xuICAgICAgY20uZG9jLmxpbmVTZXAgPSB2YWw7XG4gICAgICBpZiAoIXZhbCkgeyByZXR1cm4gfVxuICAgICAgdmFyIG5ld0JyZWFrcyA9IFtdLCBsaW5lTm8gPSBjbS5kb2MuZmlyc3Q7XG4gICAgICBjbS5kb2MuaXRlcihmdW5jdGlvbiAobGluZSkge1xuICAgICAgICBmb3IgKHZhciBwb3MgPSAwOzspIHtcbiAgICAgICAgICB2YXIgZm91bmQgPSBsaW5lLnRleHQuaW5kZXhPZih2YWwsIHBvcyk7XG4gICAgICAgICAgaWYgKGZvdW5kID09IC0xKSB7IGJyZWFrIH1cbiAgICAgICAgICBwb3MgPSBmb3VuZCArIHZhbC5sZW5ndGg7XG4gICAgICAgICAgbmV3QnJlYWtzLnB1c2goUG9zKGxpbmVObywgZm91bmQpKTtcbiAgICAgICAgfVxuICAgICAgICBsaW5lTm8rKztcbiAgICAgIH0pO1xuICAgICAgZm9yICh2YXIgaSA9IG5ld0JyZWFrcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSlcbiAgICAgICAgeyByZXBsYWNlUmFuZ2UoY20uZG9jLCB2YWwsIG5ld0JyZWFrc1tpXSwgUG9zKG5ld0JyZWFrc1tpXS5saW5lLCBuZXdCcmVha3NbaV0uY2ggKyB2YWwubGVuZ3RoKSk7IH1cbiAgICB9KTtcbiAgICBvcHRpb24oXCJzcGVjaWFsQ2hhcnNcIiwgL1tcXHUwMDAwLVxcdTAwMWZcXHUwMDdmLVxcdTAwOWZcXHUwMGFkXFx1MDYxY1xcdTIwMGJcXHUyMDBlXFx1MjAwZlxcdTIwMjhcXHUyMDI5XFx1ZmVmZlxcdWZmZjktXFx1ZmZmY10vZywgZnVuY3Rpb24gKGNtLCB2YWwsIG9sZCkge1xuICAgICAgY20uc3RhdGUuc3BlY2lhbENoYXJzID0gbmV3IFJlZ0V4cCh2YWwuc291cmNlICsgKHZhbC50ZXN0KFwiXFx0XCIpID8gXCJcIiA6IFwifFxcdFwiKSwgXCJnXCIpO1xuICAgICAgaWYgKG9sZCAhPSBJbml0KSB7IGNtLnJlZnJlc2goKTsgfVxuICAgIH0pO1xuICAgIG9wdGlvbihcInNwZWNpYWxDaGFyUGxhY2Vob2xkZXJcIiwgZGVmYXVsdFNwZWNpYWxDaGFyUGxhY2Vob2xkZXIsIGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gY20ucmVmcmVzaCgpOyB9LCB0cnVlKTtcbiAgICBvcHRpb24oXCJlbGVjdHJpY0NoYXJzXCIsIHRydWUpO1xuICAgIG9wdGlvbihcImlucHV0U3R5bGVcIiwgbW9iaWxlID8gXCJjb250ZW50ZWRpdGFibGVcIiA6IFwidGV4dGFyZWFcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW5wdXRTdHlsZSBjYW4gbm90ICh5ZXQpIGJlIGNoYW5nZWQgaW4gYSBydW5uaW5nIGVkaXRvclwiKSAvLyBGSVhNRVxuICAgIH0sIHRydWUpO1xuICAgIG9wdGlvbihcInNwZWxsY2hlY2tcIiwgZmFsc2UsIGZ1bmN0aW9uIChjbSwgdmFsKSB7IHJldHVybiBjbS5nZXRJbnB1dEZpZWxkKCkuc3BlbGxjaGVjayA9IHZhbDsgfSwgdHJ1ZSk7XG4gICAgb3B0aW9uKFwiYXV0b2NvcnJlY3RcIiwgZmFsc2UsIGZ1bmN0aW9uIChjbSwgdmFsKSB7IHJldHVybiBjbS5nZXRJbnB1dEZpZWxkKCkuYXV0b2NvcnJlY3QgPSB2YWw7IH0sIHRydWUpO1xuICAgIG9wdGlvbihcImF1dG9jYXBpdGFsaXplXCIsIGZhbHNlLCBmdW5jdGlvbiAoY20sIHZhbCkgeyByZXR1cm4gY20uZ2V0SW5wdXRGaWVsZCgpLmF1dG9jYXBpdGFsaXplID0gdmFsOyB9LCB0cnVlKTtcbiAgICBvcHRpb24oXCJydGxNb3ZlVmlzdWFsbHlcIiwgIXdpbmRvd3MpO1xuICAgIG9wdGlvbihcIndob2xlTGluZVVwZGF0ZUJlZm9yZVwiLCB0cnVlKTtcblxuICAgIG9wdGlvbihcInRoZW1lXCIsIFwiZGVmYXVsdFwiLCBmdW5jdGlvbiAoY20pIHtcbiAgICAgIHRoZW1lQ2hhbmdlZChjbSk7XG4gICAgICB1cGRhdGVHdXR0ZXJzKGNtKTtcbiAgICB9LCB0cnVlKTtcbiAgICBvcHRpb24oXCJrZXlNYXBcIiwgXCJkZWZhdWx0XCIsIGZ1bmN0aW9uIChjbSwgdmFsLCBvbGQpIHtcbiAgICAgIHZhciBuZXh0ID0gZ2V0S2V5TWFwKHZhbCk7XG4gICAgICB2YXIgcHJldiA9IG9sZCAhPSBJbml0ICYmIGdldEtleU1hcChvbGQpO1xuICAgICAgaWYgKHByZXYgJiYgcHJldi5kZXRhY2gpIHsgcHJldi5kZXRhY2goY20sIG5leHQpOyB9XG4gICAgICBpZiAobmV4dC5hdHRhY2gpIHsgbmV4dC5hdHRhY2goY20sIHByZXYgfHwgbnVsbCk7IH1cbiAgICB9KTtcbiAgICBvcHRpb24oXCJleHRyYUtleXNcIiwgbnVsbCk7XG4gICAgb3B0aW9uKFwiY29uZmlndXJlTW91c2VcIiwgbnVsbCk7XG5cbiAgICBvcHRpb24oXCJsaW5lV3JhcHBpbmdcIiwgZmFsc2UsIHdyYXBwaW5nQ2hhbmdlZCwgdHJ1ZSk7XG4gICAgb3B0aW9uKFwiZ3V0dGVyc1wiLCBbXSwgZnVuY3Rpb24gKGNtLCB2YWwpIHtcbiAgICAgIGNtLmRpc3BsYXkuZ3V0dGVyU3BlY3MgPSBnZXRHdXR0ZXJzKHZhbCwgY20ub3B0aW9ucy5saW5lTnVtYmVycyk7XG4gICAgICB1cGRhdGVHdXR0ZXJzKGNtKTtcbiAgICB9LCB0cnVlKTtcbiAgICBvcHRpb24oXCJmaXhlZEd1dHRlclwiLCB0cnVlLCBmdW5jdGlvbiAoY20sIHZhbCkge1xuICAgICAgY20uZGlzcGxheS5ndXR0ZXJzLnN0eWxlLmxlZnQgPSB2YWwgPyBjb21wZW5zYXRlRm9ySFNjcm9sbChjbS5kaXNwbGF5KSArIFwicHhcIiA6IFwiMFwiO1xuICAgICAgY20ucmVmcmVzaCgpO1xuICAgIH0sIHRydWUpO1xuICAgIG9wdGlvbihcImNvdmVyR3V0dGVyTmV4dFRvU2Nyb2xsYmFyXCIsIGZhbHNlLCBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIHVwZGF0ZVNjcm9sbGJhcnMoY20pOyB9LCB0cnVlKTtcbiAgICBvcHRpb24oXCJzY3JvbGxiYXJTdHlsZVwiLCBcIm5hdGl2ZVwiLCBmdW5jdGlvbiAoY20pIHtcbiAgICAgIGluaXRTY3JvbGxiYXJzKGNtKTtcbiAgICAgIHVwZGF0ZVNjcm9sbGJhcnMoY20pO1xuICAgICAgY20uZGlzcGxheS5zY3JvbGxiYXJzLnNldFNjcm9sbFRvcChjbS5kb2Muc2Nyb2xsVG9wKTtcbiAgICAgIGNtLmRpc3BsYXkuc2Nyb2xsYmFycy5zZXRTY3JvbGxMZWZ0KGNtLmRvYy5zY3JvbGxMZWZ0KTtcbiAgICB9LCB0cnVlKTtcbiAgICBvcHRpb24oXCJsaW5lTnVtYmVyc1wiLCBmYWxzZSwgZnVuY3Rpb24gKGNtLCB2YWwpIHtcbiAgICAgIGNtLmRpc3BsYXkuZ3V0dGVyU3BlY3MgPSBnZXRHdXR0ZXJzKGNtLm9wdGlvbnMuZ3V0dGVycywgdmFsKTtcbiAgICAgIHVwZGF0ZUd1dHRlcnMoY20pO1xuICAgIH0sIHRydWUpO1xuICAgIG9wdGlvbihcImZpcnN0TGluZU51bWJlclwiLCAxLCB1cGRhdGVHdXR0ZXJzLCB0cnVlKTtcbiAgICBvcHRpb24oXCJsaW5lTnVtYmVyRm9ybWF0dGVyXCIsIGZ1bmN0aW9uIChpbnRlZ2VyKSB7IHJldHVybiBpbnRlZ2VyOyB9LCB1cGRhdGVHdXR0ZXJzLCB0cnVlKTtcbiAgICBvcHRpb24oXCJzaG93Q3Vyc29yV2hlblNlbGVjdGluZ1wiLCBmYWxzZSwgdXBkYXRlU2VsZWN0aW9uLCB0cnVlKTtcblxuICAgIG9wdGlvbihcInJlc2V0U2VsZWN0aW9uT25Db250ZXh0TWVudVwiLCB0cnVlKTtcbiAgICBvcHRpb24oXCJsaW5lV2lzZUNvcHlDdXRcIiwgdHJ1ZSk7XG4gICAgb3B0aW9uKFwicGFzdGVMaW5lc1BlclNlbGVjdGlvblwiLCB0cnVlKTtcbiAgICBvcHRpb24oXCJzZWxlY3Rpb25zTWF5VG91Y2hcIiwgZmFsc2UpO1xuXG4gICAgb3B0aW9uKFwicmVhZE9ubHlcIiwgZmFsc2UsIGZ1bmN0aW9uIChjbSwgdmFsKSB7XG4gICAgICBpZiAodmFsID09IFwibm9jdXJzb3JcIikge1xuICAgICAgICBvbkJsdXIoY20pO1xuICAgICAgICBjbS5kaXNwbGF5LmlucHV0LmJsdXIoKTtcbiAgICAgIH1cbiAgICAgIGNtLmRpc3BsYXkuaW5wdXQucmVhZE9ubHlDaGFuZ2VkKHZhbCk7XG4gICAgfSk7XG5cbiAgICBvcHRpb24oXCJzY3JlZW5SZWFkZXJMYWJlbFwiLCBudWxsLCBmdW5jdGlvbiAoY20sIHZhbCkge1xuICAgICAgdmFsID0gKHZhbCA9PT0gJycpID8gbnVsbCA6IHZhbDtcbiAgICAgIGNtLmRpc3BsYXkuaW5wdXQuc2NyZWVuUmVhZGVyTGFiZWxDaGFuZ2VkKHZhbCk7XG4gICAgfSk7XG5cbiAgICBvcHRpb24oXCJkaXNhYmxlSW5wdXRcIiwgZmFsc2UsIGZ1bmN0aW9uIChjbSwgdmFsKSB7aWYgKCF2YWwpIHsgY20uZGlzcGxheS5pbnB1dC5yZXNldCgpOyB9fSwgdHJ1ZSk7XG4gICAgb3B0aW9uKFwiZHJhZ0Ryb3BcIiwgdHJ1ZSwgZHJhZ0Ryb3BDaGFuZ2VkKTtcbiAgICBvcHRpb24oXCJhbGxvd0Ryb3BGaWxlVHlwZXNcIiwgbnVsbCk7XG5cbiAgICBvcHRpb24oXCJjdXJzb3JCbGlua1JhdGVcIiwgNTMwKTtcbiAgICBvcHRpb24oXCJjdXJzb3JTY3JvbGxNYXJnaW5cIiwgMCk7XG4gICAgb3B0aW9uKFwiY3Vyc29ySGVpZ2h0XCIsIDEsIHVwZGF0ZVNlbGVjdGlvbiwgdHJ1ZSk7XG4gICAgb3B0aW9uKFwic2luZ2xlQ3Vyc29ySGVpZ2h0UGVyTGluZVwiLCB0cnVlLCB1cGRhdGVTZWxlY3Rpb24sIHRydWUpO1xuICAgIG9wdGlvbihcIndvcmtUaW1lXCIsIDEwMCk7XG4gICAgb3B0aW9uKFwid29ya0RlbGF5XCIsIDEwMCk7XG4gICAgb3B0aW9uKFwiZmxhdHRlblNwYW5zXCIsIHRydWUsIHJlc2V0TW9kZVN0YXRlLCB0cnVlKTtcbiAgICBvcHRpb24oXCJhZGRNb2RlQ2xhc3NcIiwgZmFsc2UsIHJlc2V0TW9kZVN0YXRlLCB0cnVlKTtcbiAgICBvcHRpb24oXCJwb2xsSW50ZXJ2YWxcIiwgMTAwKTtcbiAgICBvcHRpb24oXCJ1bmRvRGVwdGhcIiwgMjAwLCBmdW5jdGlvbiAoY20sIHZhbCkgeyByZXR1cm4gY20uZG9jLmhpc3RvcnkudW5kb0RlcHRoID0gdmFsOyB9KTtcbiAgICBvcHRpb24oXCJoaXN0b3J5RXZlbnREZWxheVwiLCAxMjUwKTtcbiAgICBvcHRpb24oXCJ2aWV3cG9ydE1hcmdpblwiLCAxMCwgZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5yZWZyZXNoKCk7IH0sIHRydWUpO1xuICAgIG9wdGlvbihcIm1heEhpZ2hsaWdodExlbmd0aFwiLCAxMDAwMCwgcmVzZXRNb2RlU3RhdGUsIHRydWUpO1xuICAgIG9wdGlvbihcIm1vdmVJbnB1dFdpdGhDdXJzb3JcIiwgdHJ1ZSwgZnVuY3Rpb24gKGNtLCB2YWwpIHtcbiAgICAgIGlmICghdmFsKSB7IGNtLmRpc3BsYXkuaW5wdXQucmVzZXRQb3NpdGlvbigpOyB9XG4gICAgfSk7XG5cbiAgICBvcHRpb24oXCJ0YWJpbmRleFwiLCBudWxsLCBmdW5jdGlvbiAoY20sIHZhbCkgeyByZXR1cm4gY20uZGlzcGxheS5pbnB1dC5nZXRGaWVsZCgpLnRhYkluZGV4ID0gdmFsIHx8IFwiXCI7IH0pO1xuICAgIG9wdGlvbihcImF1dG9mb2N1c1wiLCBudWxsKTtcbiAgICBvcHRpb24oXCJkaXJlY3Rpb25cIiwgXCJsdHJcIiwgZnVuY3Rpb24gKGNtLCB2YWwpIHsgcmV0dXJuIGNtLmRvYy5zZXREaXJlY3Rpb24odmFsKTsgfSwgdHJ1ZSk7XG4gICAgb3B0aW9uKFwicGhyYXNlc1wiLCBudWxsKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRyYWdEcm9wQ2hhbmdlZChjbSwgdmFsdWUsIG9sZCkge1xuICAgIHZhciB3YXNPbiA9IG9sZCAmJiBvbGQgIT0gSW5pdDtcbiAgICBpZiAoIXZhbHVlICE9ICF3YXNPbikge1xuICAgICAgdmFyIGZ1bmNzID0gY20uZGlzcGxheS5kcmFnRnVuY3Rpb25zO1xuICAgICAgdmFyIHRvZ2dsZSA9IHZhbHVlID8gb24gOiBvZmY7XG4gICAgICB0b2dnbGUoY20uZGlzcGxheS5zY3JvbGxlciwgXCJkcmFnc3RhcnRcIiwgZnVuY3Muc3RhcnQpO1xuICAgICAgdG9nZ2xlKGNtLmRpc3BsYXkuc2Nyb2xsZXIsIFwiZHJhZ2VudGVyXCIsIGZ1bmNzLmVudGVyKTtcbiAgICAgIHRvZ2dsZShjbS5kaXNwbGF5LnNjcm9sbGVyLCBcImRyYWdvdmVyXCIsIGZ1bmNzLm92ZXIpO1xuICAgICAgdG9nZ2xlKGNtLmRpc3BsYXkuc2Nyb2xsZXIsIFwiZHJhZ2xlYXZlXCIsIGZ1bmNzLmxlYXZlKTtcbiAgICAgIHRvZ2dsZShjbS5kaXNwbGF5LnNjcm9sbGVyLCBcImRyb3BcIiwgZnVuY3MuZHJvcCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gd3JhcHBpbmdDaGFuZ2VkKGNtKSB7XG4gICAgaWYgKGNtLm9wdGlvbnMubGluZVdyYXBwaW5nKSB7XG4gICAgICBhZGRDbGFzcyhjbS5kaXNwbGF5LndyYXBwZXIsIFwiQ29kZU1pcnJvci13cmFwXCIpO1xuICAgICAgY20uZGlzcGxheS5zaXplci5zdHlsZS5taW5XaWR0aCA9IFwiXCI7XG4gICAgICBjbS5kaXNwbGF5LnNpemVyV2lkdGggPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBybUNsYXNzKGNtLmRpc3BsYXkud3JhcHBlciwgXCJDb2RlTWlycm9yLXdyYXBcIik7XG4gICAgICBmaW5kTWF4TGluZShjbSk7XG4gICAgfVxuICAgIGVzdGltYXRlTGluZUhlaWdodHMoY20pO1xuICAgIHJlZ0NoYW5nZShjbSk7XG4gICAgY2xlYXJDYWNoZXMoY20pO1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyByZXR1cm4gdXBkYXRlU2Nyb2xsYmFycyhjbSk7IH0sIDEwMCk7XG4gIH1cblxuICAvLyBBIENvZGVNaXJyb3IgaW5zdGFuY2UgcmVwcmVzZW50cyBhbiBlZGl0b3IuIFRoaXMgaXMgdGhlIG9iamVjdFxuICAvLyB0aGF0IHVzZXIgY29kZSBpcyB1c3VhbGx5IGRlYWxpbmcgd2l0aC5cblxuICBmdW5jdGlvbiBDb2RlTWlycm9yKHBsYWNlLCBvcHRpb25zKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgQ29kZU1pcnJvcikpIHsgcmV0dXJuIG5ldyBDb2RlTWlycm9yKHBsYWNlLCBvcHRpb25zKSB9XG5cbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zID0gb3B0aW9ucyA/IGNvcHlPYmoob3B0aW9ucykgOiB7fTtcbiAgICAvLyBEZXRlcm1pbmUgZWZmZWN0aXZlIG9wdGlvbnMgYmFzZWQgb24gZ2l2ZW4gdmFsdWVzIGFuZCBkZWZhdWx0cy5cbiAgICBjb3B5T2JqKGRlZmF1bHRzLCBvcHRpb25zLCBmYWxzZSk7XG5cbiAgICB2YXIgZG9jID0gb3B0aW9ucy52YWx1ZTtcbiAgICBpZiAodHlwZW9mIGRvYyA9PSBcInN0cmluZ1wiKSB7IGRvYyA9IG5ldyBEb2MoZG9jLCBvcHRpb25zLm1vZGUsIG51bGwsIG9wdGlvbnMubGluZVNlcGFyYXRvciwgb3B0aW9ucy5kaXJlY3Rpb24pOyB9XG4gICAgZWxzZSBpZiAob3B0aW9ucy5tb2RlKSB7IGRvYy5tb2RlT3B0aW9uID0gb3B0aW9ucy5tb2RlOyB9XG4gICAgdGhpcy5kb2MgPSBkb2M7XG5cbiAgICB2YXIgaW5wdXQgPSBuZXcgQ29kZU1pcnJvci5pbnB1dFN0eWxlc1tvcHRpb25zLmlucHV0U3R5bGVdKHRoaXMpO1xuICAgIHZhciBkaXNwbGF5ID0gdGhpcy5kaXNwbGF5ID0gbmV3IERpc3BsYXkocGxhY2UsIGRvYywgaW5wdXQsIG9wdGlvbnMpO1xuICAgIGRpc3BsYXkud3JhcHBlci5Db2RlTWlycm9yID0gdGhpcztcbiAgICB0aGVtZUNoYW5nZWQodGhpcyk7XG4gICAgaWYgKG9wdGlvbnMubGluZVdyYXBwaW5nKVxuICAgICAgeyB0aGlzLmRpc3BsYXkud3JhcHBlci5jbGFzc05hbWUgKz0gXCIgQ29kZU1pcnJvci13cmFwXCI7IH1cbiAgICBpbml0U2Nyb2xsYmFycyh0aGlzKTtcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBrZXlNYXBzOiBbXSwgIC8vIHN0b3JlcyBtYXBzIGFkZGVkIGJ5IGFkZEtleU1hcFxuICAgICAgb3ZlcmxheXM6IFtdLCAvLyBoaWdobGlnaHRpbmcgb3ZlcmxheXMsIGFzIGFkZGVkIGJ5IGFkZE92ZXJsYXlcbiAgICAgIG1vZGVHZW46IDAsICAgLy8gYnVtcGVkIHdoZW4gbW9kZS9vdmVybGF5IGNoYW5nZXMsIHVzZWQgdG8gaW52YWxpZGF0ZSBoaWdobGlnaHRpbmcgaW5mb1xuICAgICAgb3ZlcndyaXRlOiBmYWxzZSxcbiAgICAgIGRlbGF5aW5nQmx1ckV2ZW50OiBmYWxzZSxcbiAgICAgIGZvY3VzZWQ6IGZhbHNlLFxuICAgICAgc3VwcHJlc3NFZGl0czogZmFsc2UsIC8vIHVzZWQgdG8gZGlzYWJsZSBlZGl0aW5nIGR1cmluZyBrZXkgaGFuZGxlcnMgd2hlbiBpbiByZWFkT25seSBtb2RlXG4gICAgICBwYXN0ZUluY29taW5nOiAtMSwgY3V0SW5jb21pbmc6IC0xLCAvLyBoZWxwIHJlY29nbml6ZSBwYXN0ZS9jdXQgZWRpdHMgaW4gaW5wdXQucG9sbFxuICAgICAgc2VsZWN0aW5nVGV4dDogZmFsc2UsXG4gICAgICBkcmFnZ2luZ1RleHQ6IGZhbHNlLFxuICAgICAgaGlnaGxpZ2h0OiBuZXcgRGVsYXllZCgpLCAvLyBzdG9yZXMgaGlnaGxpZ2h0IHdvcmtlciB0aW1lb3V0XG4gICAgICBrZXlTZXE6IG51bGwsICAvLyBVbmZpbmlzaGVkIGtleSBzZXF1ZW5jZVxuICAgICAgc3BlY2lhbENoYXJzOiBudWxsXG4gICAgfTtcblxuICAgIGlmIChvcHRpb25zLmF1dG9mb2N1cyAmJiAhbW9iaWxlKSB7IGRpc3BsYXkuaW5wdXQuZm9jdXMoKTsgfVxuXG4gICAgLy8gT3ZlcnJpZGUgbWFnaWMgdGV4dGFyZWEgY29udGVudCByZXN0b3JlIHRoYXQgSUUgc29tZXRpbWVzIGRvZXNcbiAgICAvLyBvbiBvdXIgaGlkZGVuIHRleHRhcmVhIG9uIHJlbG9hZFxuICAgIGlmIChpZSAmJiBpZV92ZXJzaW9uIDwgMTEpIHsgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzJDEuZGlzcGxheS5pbnB1dC5yZXNldCh0cnVlKTsgfSwgMjApOyB9XG5cbiAgICByZWdpc3RlckV2ZW50SGFuZGxlcnModGhpcyk7XG4gICAgZW5zdXJlR2xvYmFsSGFuZGxlcnMoKTtcblxuICAgIHN0YXJ0T3BlcmF0aW9uKHRoaXMpO1xuICAgIHRoaXMuY3VyT3AuZm9yY2VVcGRhdGUgPSB0cnVlO1xuICAgIGF0dGFjaERvYyh0aGlzLCBkb2MpO1xuXG4gICAgaWYgKChvcHRpb25zLmF1dG9mb2N1cyAmJiAhbW9iaWxlKSB8fCB0aGlzLmhhc0ZvY3VzKCkpXG4gICAgICB7IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcyQxLmhhc0ZvY3VzKCkgJiYgIXRoaXMkMS5zdGF0ZS5mb2N1c2VkKSB7IG9uRm9jdXModGhpcyQxKTsgfVxuICAgICAgfSwgMjApOyB9XG4gICAgZWxzZVxuICAgICAgeyBvbkJsdXIodGhpcyk7IH1cblxuICAgIGZvciAodmFyIG9wdCBpbiBvcHRpb25IYW5kbGVycykgeyBpZiAob3B0aW9uSGFuZGxlcnMuaGFzT3duUHJvcGVydHkob3B0KSlcbiAgICAgIHsgb3B0aW9uSGFuZGxlcnNbb3B0XSh0aGlzLCBvcHRpb25zW29wdF0sIEluaXQpOyB9IH1cbiAgICBtYXliZVVwZGF0ZUxpbmVOdW1iZXJXaWR0aCh0aGlzKTtcbiAgICBpZiAob3B0aW9ucy5maW5pc2hJbml0KSB7IG9wdGlvbnMuZmluaXNoSW5pdCh0aGlzKTsgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdEhvb2tzLmxlbmd0aDsgKytpKSB7IGluaXRIb29rc1tpXSh0aGlzKTsgfVxuICAgIGVuZE9wZXJhdGlvbih0aGlzKTtcbiAgICAvLyBTdXBwcmVzcyBvcHRpbWl6ZWxlZ2liaWxpdHkgaW4gV2Via2l0LCBzaW5jZSBpdCBicmVha3MgdGV4dFxuICAgIC8vIG1lYXN1cmluZyBvbiBsaW5lIHdyYXBwaW5nIGJvdW5kYXJpZXMuXG4gICAgaWYgKHdlYmtpdCAmJiBvcHRpb25zLmxpbmVXcmFwcGluZyAmJlxuICAgICAgICBnZXRDb21wdXRlZFN0eWxlKGRpc3BsYXkubGluZURpdikudGV4dFJlbmRlcmluZyA9PSBcIm9wdGltaXplbGVnaWJpbGl0eVwiKVxuICAgICAgeyBkaXNwbGF5LmxpbmVEaXYuc3R5bGUudGV4dFJlbmRlcmluZyA9IFwiYXV0b1wiOyB9XG4gIH1cblxuICAvLyBUaGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gIENvZGVNaXJyb3IuZGVmYXVsdHMgPSBkZWZhdWx0cztcbiAgLy8gRnVuY3Rpb25zIHRvIHJ1biB3aGVuIG9wdGlvbnMgYXJlIGNoYW5nZWQuXG4gIENvZGVNaXJyb3Iub3B0aW9uSGFuZGxlcnMgPSBvcHRpb25IYW5kbGVycztcblxuICAvLyBBdHRhY2ggdGhlIG5lY2Vzc2FyeSBldmVudCBoYW5kbGVycyB3aGVuIGluaXRpYWxpemluZyB0aGUgZWRpdG9yXG4gIGZ1bmN0aW9uIHJlZ2lzdGVyRXZlbnRIYW5kbGVycyhjbSkge1xuICAgIHZhciBkID0gY20uZGlzcGxheTtcbiAgICBvbihkLnNjcm9sbGVyLCBcIm1vdXNlZG93blwiLCBvcGVyYXRpb24oY20sIG9uTW91c2VEb3duKSk7XG4gICAgLy8gT2xkZXIgSUUncyB3aWxsIG5vdCBmaXJlIGEgc2Vjb25kIG1vdXNlZG93biBmb3IgYSBkb3VibGUgY2xpY2tcbiAgICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8IDExKVxuICAgICAgeyBvbihkLnNjcm9sbGVyLCBcImRibGNsaWNrXCIsIG9wZXJhdGlvbihjbSwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYgKHNpZ25hbERPTUV2ZW50KGNtLCBlKSkgeyByZXR1cm4gfVxuICAgICAgICB2YXIgcG9zID0gcG9zRnJvbU1vdXNlKGNtLCBlKTtcbiAgICAgICAgaWYgKCFwb3MgfHwgY2xpY2tJbkd1dHRlcihjbSwgZSkgfHwgZXZlbnRJbldpZGdldChjbS5kaXNwbGF5LCBlKSkgeyByZXR1cm4gfVxuICAgICAgICBlX3ByZXZlbnREZWZhdWx0KGUpO1xuICAgICAgICB2YXIgd29yZCA9IGNtLmZpbmRXb3JkQXQocG9zKTtcbiAgICAgICAgZXh0ZW5kU2VsZWN0aW9uKGNtLmRvYywgd29yZC5hbmNob3IsIHdvcmQuaGVhZCk7XG4gICAgICB9KSk7IH1cbiAgICBlbHNlXG4gICAgICB7IG9uKGQuc2Nyb2xsZXIsIFwiZGJsY2xpY2tcIiwgZnVuY3Rpb24gKGUpIHsgcmV0dXJuIHNpZ25hbERPTUV2ZW50KGNtLCBlKSB8fCBlX3ByZXZlbnREZWZhdWx0KGUpOyB9KTsgfVxuICAgIC8vIFNvbWUgYnJvd3NlcnMgZmlyZSBjb250ZXh0bWVudSAqYWZ0ZXIqIG9wZW5pbmcgdGhlIG1lbnUsIGF0XG4gICAgLy8gd2hpY2ggcG9pbnQgd2UgY2FuJ3QgbWVzcyB3aXRoIGl0IGFueW1vcmUuIENvbnRleHQgbWVudSBpc1xuICAgIC8vIGhhbmRsZWQgaW4gb25Nb3VzZURvd24gZm9yIHRoZXNlIGJyb3dzZXJzLlxuICAgIG9uKGQuc2Nyb2xsZXIsIFwiY29udGV4dG1lbnVcIiwgZnVuY3Rpb24gKGUpIHsgcmV0dXJuIG9uQ29udGV4dE1lbnUoY20sIGUpOyB9KTtcbiAgICBvbihkLmlucHV0LmdldEZpZWxkKCksIFwiY29udGV4dG1lbnVcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmICghZC5zY3JvbGxlci5jb250YWlucyhlLnRhcmdldCkpIHsgb25Db250ZXh0TWVudShjbSwgZSk7IH1cbiAgICB9KTtcblxuICAgIC8vIFVzZWQgdG8gc3VwcHJlc3MgbW91c2UgZXZlbnQgaGFuZGxpbmcgd2hlbiBhIHRvdWNoIGhhcHBlbnNcbiAgICB2YXIgdG91Y2hGaW5pc2hlZCwgcHJldlRvdWNoID0ge2VuZDogMH07XG4gICAgZnVuY3Rpb24gZmluaXNoVG91Y2goKSB7XG4gICAgICBpZiAoZC5hY3RpdmVUb3VjaCkge1xuICAgICAgICB0b3VjaEZpbmlzaGVkID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHJldHVybiBkLmFjdGl2ZVRvdWNoID0gbnVsbDsgfSwgMTAwMCk7XG4gICAgICAgIHByZXZUb3VjaCA9IGQuYWN0aXZlVG91Y2g7XG4gICAgICAgIHByZXZUb3VjaC5lbmQgPSArbmV3IERhdGU7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGlzTW91c2VMaWtlVG91Y2hFdmVudChlKSB7XG4gICAgICBpZiAoZS50b3VjaGVzLmxlbmd0aCAhPSAxKSB7IHJldHVybiBmYWxzZSB9XG4gICAgICB2YXIgdG91Y2ggPSBlLnRvdWNoZXNbMF07XG4gICAgICByZXR1cm4gdG91Y2gucmFkaXVzWCA8PSAxICYmIHRvdWNoLnJhZGl1c1kgPD0gMVxuICAgIH1cbiAgICBmdW5jdGlvbiBmYXJBd2F5KHRvdWNoLCBvdGhlcikge1xuICAgICAgaWYgKG90aGVyLmxlZnQgPT0gbnVsbCkgeyByZXR1cm4gdHJ1ZSB9XG4gICAgICB2YXIgZHggPSBvdGhlci5sZWZ0IC0gdG91Y2gubGVmdCwgZHkgPSBvdGhlci50b3AgLSB0b3VjaC50b3A7XG4gICAgICByZXR1cm4gZHggKiBkeCArIGR5ICogZHkgPiAyMCAqIDIwXG4gICAgfVxuICAgIG9uKGQuc2Nyb2xsZXIsIFwidG91Y2hzdGFydFwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKCFzaWduYWxET01FdmVudChjbSwgZSkgJiYgIWlzTW91c2VMaWtlVG91Y2hFdmVudChlKSAmJiAhY2xpY2tJbkd1dHRlcihjbSwgZSkpIHtcbiAgICAgICAgZC5pbnB1dC5lbnN1cmVQb2xsZWQoKTtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRvdWNoRmluaXNoZWQpO1xuICAgICAgICB2YXIgbm93ID0gK25ldyBEYXRlO1xuICAgICAgICBkLmFjdGl2ZVRvdWNoID0ge3N0YXJ0OiBub3csIG1vdmVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2OiBub3cgLSBwcmV2VG91Y2guZW5kIDw9IDMwMCA/IHByZXZUb3VjaCA6IG51bGx9O1xuICAgICAgICBpZiAoZS50b3VjaGVzLmxlbmd0aCA9PSAxKSB7XG4gICAgICAgICAgZC5hY3RpdmVUb3VjaC5sZWZ0ID0gZS50b3VjaGVzWzBdLnBhZ2VYO1xuICAgICAgICAgIGQuYWN0aXZlVG91Y2gudG9wID0gZS50b3VjaGVzWzBdLnBhZ2VZO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgb24oZC5zY3JvbGxlciwgXCJ0b3VjaG1vdmVcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGQuYWN0aXZlVG91Y2gpIHsgZC5hY3RpdmVUb3VjaC5tb3ZlZCA9IHRydWU7IH1cbiAgICB9KTtcbiAgICBvbihkLnNjcm9sbGVyLCBcInRvdWNoZW5kXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdG91Y2ggPSBkLmFjdGl2ZVRvdWNoO1xuICAgICAgaWYgKHRvdWNoICYmICFldmVudEluV2lkZ2V0KGQsIGUpICYmIHRvdWNoLmxlZnQgIT0gbnVsbCAmJlxuICAgICAgICAgICF0b3VjaC5tb3ZlZCAmJiBuZXcgRGF0ZSAtIHRvdWNoLnN0YXJ0IDwgMzAwKSB7XG4gICAgICAgIHZhciBwb3MgPSBjbS5jb29yZHNDaGFyKGQuYWN0aXZlVG91Y2gsIFwicGFnZVwiKSwgcmFuZ2U7XG4gICAgICAgIGlmICghdG91Y2gucHJldiB8fCBmYXJBd2F5KHRvdWNoLCB0b3VjaC5wcmV2KSkgLy8gU2luZ2xlIHRhcFxuICAgICAgICAgIHsgcmFuZ2UgPSBuZXcgUmFuZ2UocG9zLCBwb3MpOyB9XG4gICAgICAgIGVsc2UgaWYgKCF0b3VjaC5wcmV2LnByZXYgfHwgZmFyQXdheSh0b3VjaCwgdG91Y2gucHJldi5wcmV2KSkgLy8gRG91YmxlIHRhcFxuICAgICAgICAgIHsgcmFuZ2UgPSBjbS5maW5kV29yZEF0KHBvcyk7IH1cbiAgICAgICAgZWxzZSAvLyBUcmlwbGUgdGFwXG4gICAgICAgICAgeyByYW5nZSA9IG5ldyBSYW5nZShQb3MocG9zLmxpbmUsIDApLCBjbGlwUG9zKGNtLmRvYywgUG9zKHBvcy5saW5lICsgMSwgMCkpKTsgfVxuICAgICAgICBjbS5zZXRTZWxlY3Rpb24ocmFuZ2UuYW5jaG9yLCByYW5nZS5oZWFkKTtcbiAgICAgICAgY20uZm9jdXMoKTtcbiAgICAgICAgZV9wcmV2ZW50RGVmYXVsdChlKTtcbiAgICAgIH1cbiAgICAgIGZpbmlzaFRvdWNoKCk7XG4gICAgfSk7XG4gICAgb24oZC5zY3JvbGxlciwgXCJ0b3VjaGNhbmNlbFwiLCBmaW5pc2hUb3VjaCk7XG5cbiAgICAvLyBTeW5jIHNjcm9sbGluZyBiZXR3ZWVuIGZha2Ugc2Nyb2xsYmFycyBhbmQgcmVhbCBzY3JvbGxhYmxlXG4gICAgLy8gYXJlYSwgZW5zdXJlIHZpZXdwb3J0IGlzIHVwZGF0ZWQgd2hlbiBzY3JvbGxpbmcuXG4gICAgb24oZC5zY3JvbGxlciwgXCJzY3JvbGxcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGQuc2Nyb2xsZXIuY2xpZW50SGVpZ2h0KSB7XG4gICAgICAgIHVwZGF0ZVNjcm9sbFRvcChjbSwgZC5zY3JvbGxlci5zY3JvbGxUb3ApO1xuICAgICAgICBzZXRTY3JvbGxMZWZ0KGNtLCBkLnNjcm9sbGVyLnNjcm9sbExlZnQsIHRydWUpO1xuICAgICAgICBzaWduYWwoY20sIFwic2Nyb2xsXCIsIGNtKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIExpc3RlbiB0byB3aGVlbCBldmVudHMgaW4gb3JkZXIgdG8gdHJ5IGFuZCB1cGRhdGUgdGhlIHZpZXdwb3J0IG9uIHRpbWUuXG4gICAgb24oZC5zY3JvbGxlciwgXCJtb3VzZXdoZWVsXCIsIGZ1bmN0aW9uIChlKSB7IHJldHVybiBvblNjcm9sbFdoZWVsKGNtLCBlKTsgfSk7XG4gICAgb24oZC5zY3JvbGxlciwgXCJET01Nb3VzZVNjcm9sbFwiLCBmdW5jdGlvbiAoZSkgeyByZXR1cm4gb25TY3JvbGxXaGVlbChjbSwgZSk7IH0pO1xuXG4gICAgLy8gUHJldmVudCB3cmFwcGVyIGZyb20gZXZlciBzY3JvbGxpbmdcbiAgICBvbihkLndyYXBwZXIsIFwic2Nyb2xsXCIsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGQud3JhcHBlci5zY3JvbGxUb3AgPSBkLndyYXBwZXIuc2Nyb2xsTGVmdCA9IDA7IH0pO1xuXG4gICAgZC5kcmFnRnVuY3Rpb25zID0ge1xuICAgICAgZW50ZXI6IGZ1bmN0aW9uIChlKSB7aWYgKCFzaWduYWxET01FdmVudChjbSwgZSkpIHsgZV9zdG9wKGUpOyB9fSxcbiAgICAgIG92ZXI6IGZ1bmN0aW9uIChlKSB7aWYgKCFzaWduYWxET01FdmVudChjbSwgZSkpIHsgb25EcmFnT3ZlcihjbSwgZSk7IGVfc3RvcChlKTsgfX0sXG4gICAgICBzdGFydDogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIG9uRHJhZ1N0YXJ0KGNtLCBlKTsgfSxcbiAgICAgIGRyb3A6IG9wZXJhdGlvbihjbSwgb25Ecm9wKSxcbiAgICAgIGxlYXZlOiBmdW5jdGlvbiAoZSkge2lmICghc2lnbmFsRE9NRXZlbnQoY20sIGUpKSB7IGNsZWFyRHJhZ0N1cnNvcihjbSk7IH19XG4gICAgfTtcblxuICAgIHZhciBpbnAgPSBkLmlucHV0LmdldEZpZWxkKCk7XG4gICAgb24oaW5wLCBcImtleXVwXCIsIGZ1bmN0aW9uIChlKSB7IHJldHVybiBvbktleVVwLmNhbGwoY20sIGUpOyB9KTtcbiAgICBvbihpbnAsIFwia2V5ZG93blwiLCBvcGVyYXRpb24oY20sIG9uS2V5RG93bikpO1xuICAgIG9uKGlucCwgXCJrZXlwcmVzc1wiLCBvcGVyYXRpb24oY20sIG9uS2V5UHJlc3MpKTtcbiAgICBvbihpbnAsIFwiZm9jdXNcIiwgZnVuY3Rpb24gKGUpIHsgcmV0dXJuIG9uRm9jdXMoY20sIGUpOyB9KTtcbiAgICBvbihpbnAsIFwiYmx1clwiLCBmdW5jdGlvbiAoZSkgeyByZXR1cm4gb25CbHVyKGNtLCBlKTsgfSk7XG4gIH1cblxuICB2YXIgaW5pdEhvb2tzID0gW107XG4gIENvZGVNaXJyb3IuZGVmaW5lSW5pdEhvb2sgPSBmdW5jdGlvbiAoZikgeyByZXR1cm4gaW5pdEhvb2tzLnB1c2goZik7IH07XG5cbiAgLy8gSW5kZW50IHRoZSBnaXZlbiBsaW5lLiBUaGUgaG93IHBhcmFtZXRlciBjYW4gYmUgXCJzbWFydFwiLFxuICAvLyBcImFkZFwiL251bGwsIFwic3VidHJhY3RcIiwgb3IgXCJwcmV2XCIuIFdoZW4gYWdncmVzc2l2ZSBpcyBmYWxzZVxuICAvLyAodHlwaWNhbGx5IHNldCB0byB0cnVlIGZvciBmb3JjZWQgc2luZ2xlLWxpbmUgaW5kZW50cyksIGVtcHR5XG4gIC8vIGxpbmVzIGFyZSBub3QgaW5kZW50ZWQsIGFuZCBwbGFjZXMgd2hlcmUgdGhlIG1vZGUgcmV0dXJucyBQYXNzXG4gIC8vIGFyZSBsZWZ0IGFsb25lLlxuICBmdW5jdGlvbiBpbmRlbnRMaW5lKGNtLCBuLCBob3csIGFnZ3Jlc3NpdmUpIHtcbiAgICB2YXIgZG9jID0gY20uZG9jLCBzdGF0ZTtcbiAgICBpZiAoaG93ID09IG51bGwpIHsgaG93ID0gXCJhZGRcIjsgfVxuICAgIGlmIChob3cgPT0gXCJzbWFydFwiKSB7XG4gICAgICAvLyBGYWxsIGJhY2sgdG8gXCJwcmV2XCIgd2hlbiB0aGUgbW9kZSBkb2Vzbid0IGhhdmUgYW4gaW5kZW50YXRpb25cbiAgICAgIC8vIG1ldGhvZC5cbiAgICAgIGlmICghZG9jLm1vZGUuaW5kZW50KSB7IGhvdyA9IFwicHJldlwiOyB9XG4gICAgICBlbHNlIHsgc3RhdGUgPSBnZXRDb250ZXh0QmVmb3JlKGNtLCBuKS5zdGF0ZTsgfVxuICAgIH1cblxuICAgIHZhciB0YWJTaXplID0gY20ub3B0aW9ucy50YWJTaXplO1xuICAgIHZhciBsaW5lID0gZ2V0TGluZShkb2MsIG4pLCBjdXJTcGFjZSA9IGNvdW50Q29sdW1uKGxpbmUudGV4dCwgbnVsbCwgdGFiU2l6ZSk7XG4gICAgaWYgKGxpbmUuc3RhdGVBZnRlcikgeyBsaW5lLnN0YXRlQWZ0ZXIgPSBudWxsOyB9XG4gICAgdmFyIGN1clNwYWNlU3RyaW5nID0gbGluZS50ZXh0Lm1hdGNoKC9eXFxzKi8pWzBdLCBpbmRlbnRhdGlvbjtcbiAgICBpZiAoIWFnZ3Jlc3NpdmUgJiYgIS9cXFMvLnRlc3QobGluZS50ZXh0KSkge1xuICAgICAgaW5kZW50YXRpb24gPSAwO1xuICAgICAgaG93ID0gXCJub3RcIjtcbiAgICB9IGVsc2UgaWYgKGhvdyA9PSBcInNtYXJ0XCIpIHtcbiAgICAgIGluZGVudGF0aW9uID0gZG9jLm1vZGUuaW5kZW50KHN0YXRlLCBsaW5lLnRleHQuc2xpY2UoY3VyU3BhY2VTdHJpbmcubGVuZ3RoKSwgbGluZS50ZXh0KTtcbiAgICAgIGlmIChpbmRlbnRhdGlvbiA9PSBQYXNzIHx8IGluZGVudGF0aW9uID4gMTUwKSB7XG4gICAgICAgIGlmICghYWdncmVzc2l2ZSkgeyByZXR1cm4gfVxuICAgICAgICBob3cgPSBcInByZXZcIjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGhvdyA9PSBcInByZXZcIikge1xuICAgICAgaWYgKG4gPiBkb2MuZmlyc3QpIHsgaW5kZW50YXRpb24gPSBjb3VudENvbHVtbihnZXRMaW5lKGRvYywgbi0xKS50ZXh0LCBudWxsLCB0YWJTaXplKTsgfVxuICAgICAgZWxzZSB7IGluZGVudGF0aW9uID0gMDsgfVxuICAgIH0gZWxzZSBpZiAoaG93ID09IFwiYWRkXCIpIHtcbiAgICAgIGluZGVudGF0aW9uID0gY3VyU3BhY2UgKyBjbS5vcHRpb25zLmluZGVudFVuaXQ7XG4gICAgfSBlbHNlIGlmIChob3cgPT0gXCJzdWJ0cmFjdFwiKSB7XG4gICAgICBpbmRlbnRhdGlvbiA9IGN1clNwYWNlIC0gY20ub3B0aW9ucy5pbmRlbnRVbml0O1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGhvdyA9PSBcIm51bWJlclwiKSB7XG4gICAgICBpbmRlbnRhdGlvbiA9IGN1clNwYWNlICsgaG93O1xuICAgIH1cbiAgICBpbmRlbnRhdGlvbiA9IE1hdGgubWF4KDAsIGluZGVudGF0aW9uKTtcblxuICAgIHZhciBpbmRlbnRTdHJpbmcgPSBcIlwiLCBwb3MgPSAwO1xuICAgIGlmIChjbS5vcHRpb25zLmluZGVudFdpdGhUYWJzKVxuICAgICAgeyBmb3IgKHZhciBpID0gTWF0aC5mbG9vcihpbmRlbnRhdGlvbiAvIHRhYlNpemUpOyBpOyAtLWkpIHtwb3MgKz0gdGFiU2l6ZTsgaW5kZW50U3RyaW5nICs9IFwiXFx0XCI7fSB9XG4gICAgaWYgKHBvcyA8IGluZGVudGF0aW9uKSB7IGluZGVudFN0cmluZyArPSBzcGFjZVN0cihpbmRlbnRhdGlvbiAtIHBvcyk7IH1cblxuICAgIGlmIChpbmRlbnRTdHJpbmcgIT0gY3VyU3BhY2VTdHJpbmcpIHtcbiAgICAgIHJlcGxhY2VSYW5nZShkb2MsIGluZGVudFN0cmluZywgUG9zKG4sIDApLCBQb3MobiwgY3VyU3BhY2VTdHJpbmcubGVuZ3RoKSwgXCIraW5wdXRcIik7XG4gICAgICBsaW5lLnN0YXRlQWZ0ZXIgPSBudWxsO1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRW5zdXJlIHRoYXQsIGlmIHRoZSBjdXJzb3Igd2FzIGluIHRoZSB3aGl0ZXNwYWNlIGF0IHRoZSBzdGFydFxuICAgICAgLy8gb2YgdGhlIGxpbmUsIGl0IGlzIG1vdmVkIHRvIHRoZSBlbmQgb2YgdGhhdCBzcGFjZS5cbiAgICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IGRvYy5zZWwucmFuZ2VzLmxlbmd0aDsgaSQxKyspIHtcbiAgICAgICAgdmFyIHJhbmdlID0gZG9jLnNlbC5yYW5nZXNbaSQxXTtcbiAgICAgICAgaWYgKHJhbmdlLmhlYWQubGluZSA9PSBuICYmIHJhbmdlLmhlYWQuY2ggPCBjdXJTcGFjZVN0cmluZy5sZW5ndGgpIHtcbiAgICAgICAgICB2YXIgcG9zJDEgPSBQb3MobiwgY3VyU3BhY2VTdHJpbmcubGVuZ3RoKTtcbiAgICAgICAgICByZXBsYWNlT25lU2VsZWN0aW9uKGRvYywgaSQxLCBuZXcgUmFuZ2UocG9zJDEsIHBvcyQxKSk7XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFRoaXMgd2lsbCBiZSBzZXQgdG8gYSB7bGluZVdpc2U6IGJvb2wsIHRleHQ6IFtzdHJpbmddfSBvYmplY3QsIHNvXG4gIC8vIHRoYXQsIHdoZW4gcGFzdGluZywgd2Uga25vdyB3aGF0IGtpbmQgb2Ygc2VsZWN0aW9ucyB0aGUgY29waWVkXG4gIC8vIHRleHQgd2FzIG1hZGUgb3V0IG9mLlxuICB2YXIgbGFzdENvcGllZCA9IG51bGw7XG5cbiAgZnVuY3Rpb24gc2V0TGFzdENvcGllZChuZXdMYXN0Q29waWVkKSB7XG4gICAgbGFzdENvcGllZCA9IG5ld0xhc3RDb3BpZWQ7XG4gIH1cblxuICBmdW5jdGlvbiBhcHBseVRleHRJbnB1dChjbSwgaW5zZXJ0ZWQsIGRlbGV0ZWQsIHNlbCwgb3JpZ2luKSB7XG4gICAgdmFyIGRvYyA9IGNtLmRvYztcbiAgICBjbS5kaXNwbGF5LnNoaWZ0ID0gZmFsc2U7XG4gICAgaWYgKCFzZWwpIHsgc2VsID0gZG9jLnNlbDsgfVxuXG4gICAgdmFyIHJlY2VudCA9ICtuZXcgRGF0ZSAtIDIwMDtcbiAgICB2YXIgcGFzdGUgPSBvcmlnaW4gPT0gXCJwYXN0ZVwiIHx8IGNtLnN0YXRlLnBhc3RlSW5jb21pbmcgPiByZWNlbnQ7XG4gICAgdmFyIHRleHRMaW5lcyA9IHNwbGl0TGluZXNBdXRvKGluc2VydGVkKSwgbXVsdGlQYXN0ZSA9IG51bGw7XG4gICAgLy8gV2hlbiBwYXN0aW5nIE4gbGluZXMgaW50byBOIHNlbGVjdGlvbnMsIGluc2VydCBvbmUgbGluZSBwZXIgc2VsZWN0aW9uXG4gICAgaWYgKHBhc3RlICYmIHNlbC5yYW5nZXMubGVuZ3RoID4gMSkge1xuICAgICAgaWYgKGxhc3RDb3BpZWQgJiYgbGFzdENvcGllZC50ZXh0LmpvaW4oXCJcXG5cIikgPT0gaW5zZXJ0ZWQpIHtcbiAgICAgICAgaWYgKHNlbC5yYW5nZXMubGVuZ3RoICUgbGFzdENvcGllZC50ZXh0Lmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgbXVsdGlQYXN0ZSA9IFtdO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGFzdENvcGllZC50ZXh0Lmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgeyBtdWx0aVBhc3RlLnB1c2goZG9jLnNwbGl0TGluZXMobGFzdENvcGllZC50ZXh0W2ldKSk7IH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0ZXh0TGluZXMubGVuZ3RoID09IHNlbC5yYW5nZXMubGVuZ3RoICYmIGNtLm9wdGlvbnMucGFzdGVMaW5lc1BlclNlbGVjdGlvbikge1xuICAgICAgICBtdWx0aVBhc3RlID0gbWFwKHRleHRMaW5lcywgZnVuY3Rpb24gKGwpIHsgcmV0dXJuIFtsXTsgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHVwZGF0ZUlucHV0ID0gY20uY3VyT3AudXBkYXRlSW5wdXQ7XG4gICAgLy8gTm9ybWFsIGJlaGF2aW9yIGlzIHRvIGluc2VydCB0aGUgbmV3IHRleHQgaW50byBldmVyeSBzZWxlY3Rpb25cbiAgICBmb3IgKHZhciBpJDEgPSBzZWwucmFuZ2VzLmxlbmd0aCAtIDE7IGkkMSA+PSAwOyBpJDEtLSkge1xuICAgICAgdmFyIHJhbmdlID0gc2VsLnJhbmdlc1tpJDFdO1xuICAgICAgdmFyIGZyb20gPSByYW5nZS5mcm9tKCksIHRvID0gcmFuZ2UudG8oKTtcbiAgICAgIGlmIChyYW5nZS5lbXB0eSgpKSB7XG4gICAgICAgIGlmIChkZWxldGVkICYmIGRlbGV0ZWQgPiAwKSAvLyBIYW5kbGUgZGVsZXRpb25cbiAgICAgICAgICB7IGZyb20gPSBQb3MoZnJvbS5saW5lLCBmcm9tLmNoIC0gZGVsZXRlZCk7IH1cbiAgICAgICAgZWxzZSBpZiAoY20uc3RhdGUub3ZlcndyaXRlICYmICFwYXN0ZSkgLy8gSGFuZGxlIG92ZXJ3cml0ZVxuICAgICAgICAgIHsgdG8gPSBQb3ModG8ubGluZSwgTWF0aC5taW4oZ2V0TGluZShkb2MsIHRvLmxpbmUpLnRleHQubGVuZ3RoLCB0by5jaCArIGxzdCh0ZXh0TGluZXMpLmxlbmd0aCkpOyB9XG4gICAgICAgIGVsc2UgaWYgKHBhc3RlICYmIGxhc3RDb3BpZWQgJiYgbGFzdENvcGllZC5saW5lV2lzZSAmJiBsYXN0Q29waWVkLnRleHQuam9pbihcIlxcblwiKSA9PSB0ZXh0TGluZXMuam9pbihcIlxcblwiKSlcbiAgICAgICAgICB7IGZyb20gPSB0byA9IFBvcyhmcm9tLmxpbmUsIDApOyB9XG4gICAgICB9XG4gICAgICB2YXIgY2hhbmdlRXZlbnQgPSB7ZnJvbTogZnJvbSwgdG86IHRvLCB0ZXh0OiBtdWx0aVBhc3RlID8gbXVsdGlQYXN0ZVtpJDEgJSBtdWx0aVBhc3RlLmxlbmd0aF0gOiB0ZXh0TGluZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luOiBvcmlnaW4gfHwgKHBhc3RlID8gXCJwYXN0ZVwiIDogY20uc3RhdGUuY3V0SW5jb21pbmcgPiByZWNlbnQgPyBcImN1dFwiIDogXCIraW5wdXRcIil9O1xuICAgICAgbWFrZUNoYW5nZShjbS5kb2MsIGNoYW5nZUV2ZW50KTtcbiAgICAgIHNpZ25hbExhdGVyKGNtLCBcImlucHV0UmVhZFwiLCBjbSwgY2hhbmdlRXZlbnQpO1xuICAgIH1cbiAgICBpZiAoaW5zZXJ0ZWQgJiYgIXBhc3RlKVxuICAgICAgeyB0cmlnZ2VyRWxlY3RyaWMoY20sIGluc2VydGVkKTsgfVxuXG4gICAgZW5zdXJlQ3Vyc29yVmlzaWJsZShjbSk7XG4gICAgaWYgKGNtLmN1ck9wLnVwZGF0ZUlucHV0IDwgMikgeyBjbS5jdXJPcC51cGRhdGVJbnB1dCA9IHVwZGF0ZUlucHV0OyB9XG4gICAgY20uY3VyT3AudHlwaW5nID0gdHJ1ZTtcbiAgICBjbS5zdGF0ZS5wYXN0ZUluY29taW5nID0gY20uc3RhdGUuY3V0SW5jb21pbmcgPSAtMTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZVBhc3RlKGUsIGNtKSB7XG4gICAgdmFyIHBhc3RlZCA9IGUuY2xpcGJvYXJkRGF0YSAmJiBlLmNsaXBib2FyZERhdGEuZ2V0RGF0YShcIlRleHRcIik7XG4gICAgaWYgKHBhc3RlZCkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgaWYgKCFjbS5pc1JlYWRPbmx5KCkgJiYgIWNtLm9wdGlvbnMuZGlzYWJsZUlucHV0KVxuICAgICAgICB7IHJ1bkluT3AoY20sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFwcGx5VGV4dElucHV0KGNtLCBwYXN0ZWQsIDAsIG51bGwsIFwicGFzdGVcIik7IH0pOyB9XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHRyaWdnZXJFbGVjdHJpYyhjbSwgaW5zZXJ0ZWQpIHtcbiAgICAvLyBXaGVuIGFuICdlbGVjdHJpYycgY2hhcmFjdGVyIGlzIGluc2VydGVkLCBpbW1lZGlhdGVseSB0cmlnZ2VyIGEgcmVpbmRlbnRcbiAgICBpZiAoIWNtLm9wdGlvbnMuZWxlY3RyaWNDaGFycyB8fCAhY20ub3B0aW9ucy5zbWFydEluZGVudCkgeyByZXR1cm4gfVxuICAgIHZhciBzZWwgPSBjbS5kb2Muc2VsO1xuXG4gICAgZm9yICh2YXIgaSA9IHNlbC5yYW5nZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciByYW5nZSA9IHNlbC5yYW5nZXNbaV07XG4gICAgICBpZiAocmFuZ2UuaGVhZC5jaCA+IDEwMCB8fCAoaSAmJiBzZWwucmFuZ2VzW2kgLSAxXS5oZWFkLmxpbmUgPT0gcmFuZ2UuaGVhZC5saW5lKSkgeyBjb250aW51ZSB9XG4gICAgICB2YXIgbW9kZSA9IGNtLmdldE1vZGVBdChyYW5nZS5oZWFkKTtcbiAgICAgIHZhciBpbmRlbnRlZCA9IGZhbHNlO1xuICAgICAgaWYgKG1vZGUuZWxlY3RyaWNDaGFycykge1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG1vZGUuZWxlY3RyaWNDaGFycy5sZW5ndGg7IGorKylcbiAgICAgICAgICB7IGlmIChpbnNlcnRlZC5pbmRleE9mKG1vZGUuZWxlY3RyaWNDaGFycy5jaGFyQXQoaikpID4gLTEpIHtcbiAgICAgICAgICAgIGluZGVudGVkID0gaW5kZW50TGluZShjbSwgcmFuZ2UuaGVhZC5saW5lLCBcInNtYXJ0XCIpO1xuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9IH1cbiAgICAgIH0gZWxzZSBpZiAobW9kZS5lbGVjdHJpY0lucHV0KSB7XG4gICAgICAgIGlmIChtb2RlLmVsZWN0cmljSW5wdXQudGVzdChnZXRMaW5lKGNtLmRvYywgcmFuZ2UuaGVhZC5saW5lKS50ZXh0LnNsaWNlKDAsIHJhbmdlLmhlYWQuY2gpKSlcbiAgICAgICAgICB7IGluZGVudGVkID0gaW5kZW50TGluZShjbSwgcmFuZ2UuaGVhZC5saW5lLCBcInNtYXJ0XCIpOyB9XG4gICAgICB9XG4gICAgICBpZiAoaW5kZW50ZWQpIHsgc2lnbmFsTGF0ZXIoY20sIFwiZWxlY3RyaWNJbnB1dFwiLCBjbSwgcmFuZ2UuaGVhZC5saW5lKTsgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNvcHlhYmxlUmFuZ2VzKGNtKSB7XG4gICAgdmFyIHRleHQgPSBbXSwgcmFuZ2VzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbS5kb2Muc2VsLnJhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGxpbmUgPSBjbS5kb2Muc2VsLnJhbmdlc1tpXS5oZWFkLmxpbmU7XG4gICAgICB2YXIgbGluZVJhbmdlID0ge2FuY2hvcjogUG9zKGxpbmUsIDApLCBoZWFkOiBQb3MobGluZSArIDEsIDApfTtcbiAgICAgIHJhbmdlcy5wdXNoKGxpbmVSYW5nZSk7XG4gICAgICB0ZXh0LnB1c2goY20uZ2V0UmFuZ2UobGluZVJhbmdlLmFuY2hvciwgbGluZVJhbmdlLmhlYWQpKTtcbiAgICB9XG4gICAgcmV0dXJuIHt0ZXh0OiB0ZXh0LCByYW5nZXM6IHJhbmdlc31cbiAgfVxuXG4gIGZ1bmN0aW9uIGRpc2FibGVCcm93c2VyTWFnaWMoZmllbGQsIHNwZWxsY2hlY2ssIGF1dG9jb3JyZWN0LCBhdXRvY2FwaXRhbGl6ZSkge1xuICAgIGZpZWxkLnNldEF0dHJpYnV0ZShcImF1dG9jb3JyZWN0XCIsIGF1dG9jb3JyZWN0ID8gXCJcIiA6IFwib2ZmXCIpO1xuICAgIGZpZWxkLnNldEF0dHJpYnV0ZShcImF1dG9jYXBpdGFsaXplXCIsIGF1dG9jYXBpdGFsaXplID8gXCJcIiA6IFwib2ZmXCIpO1xuICAgIGZpZWxkLnNldEF0dHJpYnV0ZShcInNwZWxsY2hlY2tcIiwgISFzcGVsbGNoZWNrKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhpZGRlblRleHRhcmVhKCkge1xuICAgIHZhciB0ZSA9IGVsdChcInRleHRhcmVhXCIsIG51bGwsIG51bGwsIFwicG9zaXRpb246IGFic29sdXRlOyBib3R0b206IC0xZW07IHBhZGRpbmc6IDA7IHdpZHRoOiAxcHg7IGhlaWdodDogMWVtOyBvdXRsaW5lOiBub25lXCIpO1xuICAgIHZhciBkaXYgPSBlbHQoXCJkaXZcIiwgW3RlXSwgbnVsbCwgXCJvdmVyZmxvdzogaGlkZGVuOyBwb3NpdGlvbjogcmVsYXRpdmU7IHdpZHRoOiAzcHg7IGhlaWdodDogMHB4O1wiKTtcbiAgICAvLyBUaGUgdGV4dGFyZWEgaXMga2VwdCBwb3NpdGlvbmVkIG5lYXIgdGhlIGN1cnNvciB0byBwcmV2ZW50IHRoZVxuICAgIC8vIGZhY3QgdGhhdCBpdCdsbCBiZSBzY3JvbGxlZCBpbnRvIHZpZXcgb24gaW5wdXQgZnJvbSBzY3JvbGxpbmdcbiAgICAvLyBvdXIgZmFrZSBjdXJzb3Igb3V0IG9mIHZpZXcuIE9uIHdlYmtpdCwgd2hlbiB3cmFwPW9mZiwgcGFzdGUgaXNcbiAgICAvLyB2ZXJ5IHNsb3cuIFNvIG1ha2UgdGhlIGFyZWEgd2lkZSBpbnN0ZWFkLlxuICAgIGlmICh3ZWJraXQpIHsgdGUuc3R5bGUud2lkdGggPSBcIjEwMDBweFwiOyB9XG4gICAgZWxzZSB7IHRlLnNldEF0dHJpYnV0ZShcIndyYXBcIiwgXCJvZmZcIik7IH1cbiAgICAvLyBJZiBib3JkZXI6IDA7IC0tIGlPUyBmYWlscyB0byBvcGVuIGtleWJvYXJkIChpc3N1ZSAjMTI4NylcbiAgICBpZiAoaW9zKSB7IHRlLnN0eWxlLmJvcmRlciA9IFwiMXB4IHNvbGlkIGJsYWNrXCI7IH1cbiAgICBkaXNhYmxlQnJvd3Nlck1hZ2ljKHRlKTtcbiAgICByZXR1cm4gZGl2XG4gIH1cblxuICAvLyBUaGUgcHVibGljbHkgdmlzaWJsZSBBUEkuIE5vdGUgdGhhdCBtZXRob2RPcChmKSBtZWFuc1xuICAvLyAnd3JhcCBmIGluIGFuIG9wZXJhdGlvbiwgcGVyZm9ybWVkIG9uIGl0cyBgdGhpc2AgcGFyYW1ldGVyJy5cblxuICAvLyBUaGlzIGlzIG5vdCB0aGUgY29tcGxldGUgc2V0IG9mIGVkaXRvciBtZXRob2RzLiBNb3N0IG9mIHRoZVxuICAvLyBtZXRob2RzIGRlZmluZWQgb24gdGhlIERvYyB0eXBlIGFyZSBhbHNvIGluamVjdGVkIGludG9cbiAgLy8gQ29kZU1pcnJvci5wcm90b3R5cGUsIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBhbmRcbiAgLy8gY29udmVuaWVuY2UuXG5cbiAgZnVuY3Rpb24gYWRkRWRpdG9yTWV0aG9kcyhDb2RlTWlycm9yKSB7XG4gICAgdmFyIG9wdGlvbkhhbmRsZXJzID0gQ29kZU1pcnJvci5vcHRpb25IYW5kbGVycztcblxuICAgIHZhciBoZWxwZXJzID0gQ29kZU1pcnJvci5oZWxwZXJzID0ge307XG5cbiAgICBDb2RlTWlycm9yLnByb3RvdHlwZSA9IHtcbiAgICAgIGNvbnN0cnVjdG9yOiBDb2RlTWlycm9yLFxuICAgICAgZm9jdXM6IGZ1bmN0aW9uKCl7d2luZG93LmZvY3VzKCk7IHRoaXMuZGlzcGxheS5pbnB1dC5mb2N1cygpO30sXG5cbiAgICAgIHNldE9wdGlvbjogZnVuY3Rpb24ob3B0aW9uLCB2YWx1ZSkge1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucywgb2xkID0gb3B0aW9uc1tvcHRpb25dO1xuICAgICAgICBpZiAob3B0aW9uc1tvcHRpb25dID09IHZhbHVlICYmIG9wdGlvbiAhPSBcIm1vZGVcIikgeyByZXR1cm4gfVxuICAgICAgICBvcHRpb25zW29wdGlvbl0gPSB2YWx1ZTtcbiAgICAgICAgaWYgKG9wdGlvbkhhbmRsZXJzLmhhc093blByb3BlcnR5KG9wdGlvbikpXG4gICAgICAgICAgeyBvcGVyYXRpb24odGhpcywgb3B0aW9uSGFuZGxlcnNbb3B0aW9uXSkodGhpcywgdmFsdWUsIG9sZCk7IH1cbiAgICAgICAgc2lnbmFsKHRoaXMsIFwib3B0aW9uQ2hhbmdlXCIsIHRoaXMsIG9wdGlvbik7XG4gICAgICB9LFxuXG4gICAgICBnZXRPcHRpb246IGZ1bmN0aW9uKG9wdGlvbikge3JldHVybiB0aGlzLm9wdGlvbnNbb3B0aW9uXX0sXG4gICAgICBnZXREb2M6IGZ1bmN0aW9uKCkge3JldHVybiB0aGlzLmRvY30sXG5cbiAgICAgIGFkZEtleU1hcDogZnVuY3Rpb24obWFwLCBib3R0b20pIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5rZXlNYXBzW2JvdHRvbSA/IFwicHVzaFwiIDogXCJ1bnNoaWZ0XCJdKGdldEtleU1hcChtYXApKTtcbiAgICAgIH0sXG4gICAgICByZW1vdmVLZXlNYXA6IGZ1bmN0aW9uKG1hcCkge1xuICAgICAgICB2YXIgbWFwcyA9IHRoaXMuc3RhdGUua2V5TWFwcztcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXBzLmxlbmd0aDsgKytpKVxuICAgICAgICAgIHsgaWYgKG1hcHNbaV0gPT0gbWFwIHx8IG1hcHNbaV0ubmFtZSA9PSBtYXApIHtcbiAgICAgICAgICAgIG1hcHMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICB9IH1cbiAgICAgIH0sXG5cbiAgICAgIGFkZE92ZXJsYXk6IG1ldGhvZE9wKGZ1bmN0aW9uKHNwZWMsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIG1vZGUgPSBzcGVjLnRva2VuID8gc3BlYyA6IENvZGVNaXJyb3IuZ2V0TW9kZSh0aGlzLm9wdGlvbnMsIHNwZWMpO1xuICAgICAgICBpZiAobW9kZS5zdGFydFN0YXRlKSB7IHRocm93IG5ldyBFcnJvcihcIk92ZXJsYXlzIG1heSBub3QgYmUgc3RhdGVmdWwuXCIpIH1cbiAgICAgICAgaW5zZXJ0U29ydGVkKHRoaXMuc3RhdGUub3ZlcmxheXMsXG4gICAgICAgICAgICAgICAgICAgICB7bW9kZTogbW9kZSwgbW9kZVNwZWM6IHNwZWMsIG9wYXF1ZTogb3B0aW9ucyAmJiBvcHRpb25zLm9wYXF1ZSxcbiAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eTogKG9wdGlvbnMgJiYgb3B0aW9ucy5wcmlvcml0eSkgfHwgMH0sXG4gICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAob3ZlcmxheSkgeyByZXR1cm4gb3ZlcmxheS5wcmlvcml0eTsgfSk7XG4gICAgICAgIHRoaXMuc3RhdGUubW9kZUdlbisrO1xuICAgICAgICByZWdDaGFuZ2UodGhpcyk7XG4gICAgICB9KSxcbiAgICAgIHJlbW92ZU92ZXJsYXk6IG1ldGhvZE9wKGZ1bmN0aW9uKHNwZWMpIHtcbiAgICAgICAgdmFyIG92ZXJsYXlzID0gdGhpcy5zdGF0ZS5vdmVybGF5cztcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvdmVybGF5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIHZhciBjdXIgPSBvdmVybGF5c1tpXS5tb2RlU3BlYztcbiAgICAgICAgICBpZiAoY3VyID09IHNwZWMgfHwgdHlwZW9mIHNwZWMgPT0gXCJzdHJpbmdcIiAmJiBjdXIubmFtZSA9PSBzcGVjKSB7XG4gICAgICAgICAgICBvdmVybGF5cy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlLm1vZGVHZW4rKztcbiAgICAgICAgICAgIHJlZ0NoYW5nZSh0aGlzKTtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSksXG5cbiAgICAgIGluZGVudExpbmU6IG1ldGhvZE9wKGZ1bmN0aW9uKG4sIGRpciwgYWdncmVzc2l2ZSkge1xuICAgICAgICBpZiAodHlwZW9mIGRpciAhPSBcInN0cmluZ1wiICYmIHR5cGVvZiBkaXIgIT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIGlmIChkaXIgPT0gbnVsbCkgeyBkaXIgPSB0aGlzLm9wdGlvbnMuc21hcnRJbmRlbnQgPyBcInNtYXJ0XCIgOiBcInByZXZcIjsgfVxuICAgICAgICAgIGVsc2UgeyBkaXIgPSBkaXIgPyBcImFkZFwiIDogXCJzdWJ0cmFjdFwiOyB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzTGluZSh0aGlzLmRvYywgbikpIHsgaW5kZW50TGluZSh0aGlzLCBuLCBkaXIsIGFnZ3Jlc3NpdmUpOyB9XG4gICAgICB9KSxcbiAgICAgIGluZGVudFNlbGVjdGlvbjogbWV0aG9kT3AoZnVuY3Rpb24oaG93KSB7XG4gICAgICAgIHZhciByYW5nZXMgPSB0aGlzLmRvYy5zZWwucmFuZ2VzLCBlbmQgPSAtMTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgcmFuZ2UgPSByYW5nZXNbaV07XG4gICAgICAgICAgaWYgKCFyYW5nZS5lbXB0eSgpKSB7XG4gICAgICAgICAgICB2YXIgZnJvbSA9IHJhbmdlLmZyb20oKSwgdG8gPSByYW5nZS50bygpO1xuICAgICAgICAgICAgdmFyIHN0YXJ0ID0gTWF0aC5tYXgoZW5kLCBmcm9tLmxpbmUpO1xuICAgICAgICAgICAgZW5kID0gTWF0aC5taW4odGhpcy5sYXN0TGluZSgpLCB0by5saW5lIC0gKHRvLmNoID8gMCA6IDEpKSArIDE7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gc3RhcnQ7IGogPCBlbmQ7ICsrailcbiAgICAgICAgICAgICAgeyBpbmRlbnRMaW5lKHRoaXMsIGosIGhvdyk7IH1cbiAgICAgICAgICAgIHZhciBuZXdSYW5nZXMgPSB0aGlzLmRvYy5zZWwucmFuZ2VzO1xuICAgICAgICAgICAgaWYgKGZyb20uY2ggPT0gMCAmJiByYW5nZXMubGVuZ3RoID09IG5ld1Jhbmdlcy5sZW5ndGggJiYgbmV3UmFuZ2VzW2ldLmZyb20oKS5jaCA+IDApXG4gICAgICAgICAgICAgIHsgcmVwbGFjZU9uZVNlbGVjdGlvbih0aGlzLmRvYywgaSwgbmV3IFJhbmdlKGZyb20sIG5ld1Jhbmdlc1tpXS50bygpKSwgc2VsX2RvbnRTY3JvbGwpOyB9XG4gICAgICAgICAgfSBlbHNlIGlmIChyYW5nZS5oZWFkLmxpbmUgPiBlbmQpIHtcbiAgICAgICAgICAgIGluZGVudExpbmUodGhpcywgcmFuZ2UuaGVhZC5saW5lLCBob3csIHRydWUpO1xuICAgICAgICAgICAgZW5kID0gcmFuZ2UuaGVhZC5saW5lO1xuICAgICAgICAgICAgaWYgKGkgPT0gdGhpcy5kb2Muc2VsLnByaW1JbmRleCkgeyBlbnN1cmVDdXJzb3JWaXNpYmxlKHRoaXMpOyB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSxcblxuICAgICAgLy8gRmV0Y2ggdGhlIHBhcnNlciB0b2tlbiBmb3IgYSBnaXZlbiBjaGFyYWN0ZXIuIFVzZWZ1bCBmb3IgaGFja3NcbiAgICAgIC8vIHRoYXQgd2FudCB0byBpbnNwZWN0IHRoZSBtb2RlIHN0YXRlIChzYXksIGZvciBjb21wbGV0aW9uKS5cbiAgICAgIGdldFRva2VuQXQ6IGZ1bmN0aW9uKHBvcywgcHJlY2lzZSkge1xuICAgICAgICByZXR1cm4gdGFrZVRva2VuKHRoaXMsIHBvcywgcHJlY2lzZSlcbiAgICAgIH0sXG5cbiAgICAgIGdldExpbmVUb2tlbnM6IGZ1bmN0aW9uKGxpbmUsIHByZWNpc2UpIHtcbiAgICAgICAgcmV0dXJuIHRha2VUb2tlbih0aGlzLCBQb3MobGluZSksIHByZWNpc2UsIHRydWUpXG4gICAgICB9LFxuXG4gICAgICBnZXRUb2tlblR5cGVBdDogZnVuY3Rpb24ocG9zKSB7XG4gICAgICAgIHBvcyA9IGNsaXBQb3ModGhpcy5kb2MsIHBvcyk7XG4gICAgICAgIHZhciBzdHlsZXMgPSBnZXRMaW5lU3R5bGVzKHRoaXMsIGdldExpbmUodGhpcy5kb2MsIHBvcy5saW5lKSk7XG4gICAgICAgIHZhciBiZWZvcmUgPSAwLCBhZnRlciA9IChzdHlsZXMubGVuZ3RoIC0gMSkgLyAyLCBjaCA9IHBvcy5jaDtcbiAgICAgICAgdmFyIHR5cGU7XG4gICAgICAgIGlmIChjaCA9PSAwKSB7IHR5cGUgPSBzdHlsZXNbMl07IH1cbiAgICAgICAgZWxzZSB7IGZvciAoOzspIHtcbiAgICAgICAgICB2YXIgbWlkID0gKGJlZm9yZSArIGFmdGVyKSA+PiAxO1xuICAgICAgICAgIGlmICgobWlkID8gc3R5bGVzW21pZCAqIDIgLSAxXSA6IDApID49IGNoKSB7IGFmdGVyID0gbWlkOyB9XG4gICAgICAgICAgZWxzZSBpZiAoc3R5bGVzW21pZCAqIDIgKyAxXSA8IGNoKSB7IGJlZm9yZSA9IG1pZCArIDE7IH1cbiAgICAgICAgICBlbHNlIHsgdHlwZSA9IHN0eWxlc1ttaWQgKiAyICsgMl07IGJyZWFrIH1cbiAgICAgICAgfSB9XG4gICAgICAgIHZhciBjdXQgPSB0eXBlID8gdHlwZS5pbmRleE9mKFwib3ZlcmxheSBcIikgOiAtMTtcbiAgICAgICAgcmV0dXJuIGN1dCA8IDAgPyB0eXBlIDogY3V0ID09IDAgPyBudWxsIDogdHlwZS5zbGljZSgwLCBjdXQgLSAxKVxuICAgICAgfSxcblxuICAgICAgZ2V0TW9kZUF0OiBmdW5jdGlvbihwb3MpIHtcbiAgICAgICAgdmFyIG1vZGUgPSB0aGlzLmRvYy5tb2RlO1xuICAgICAgICBpZiAoIW1vZGUuaW5uZXJNb2RlKSB7IHJldHVybiBtb2RlIH1cbiAgICAgICAgcmV0dXJuIENvZGVNaXJyb3IuaW5uZXJNb2RlKG1vZGUsIHRoaXMuZ2V0VG9rZW5BdChwb3MpLnN0YXRlKS5tb2RlXG4gICAgICB9LFxuXG4gICAgICBnZXRIZWxwZXI6IGZ1bmN0aW9uKHBvcywgdHlwZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRIZWxwZXJzKHBvcywgdHlwZSlbMF1cbiAgICAgIH0sXG5cbiAgICAgIGdldEhlbHBlcnM6IGZ1bmN0aW9uKHBvcywgdHlwZSkge1xuICAgICAgICB2YXIgZm91bmQgPSBbXTtcbiAgICAgICAgaWYgKCFoZWxwZXJzLmhhc093blByb3BlcnR5KHR5cGUpKSB7IHJldHVybiBmb3VuZCB9XG4gICAgICAgIHZhciBoZWxwID0gaGVscGVyc1t0eXBlXSwgbW9kZSA9IHRoaXMuZ2V0TW9kZUF0KHBvcyk7XG4gICAgICAgIGlmICh0eXBlb2YgbW9kZVt0eXBlXSA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgaWYgKGhlbHBbbW9kZVt0eXBlXV0pIHsgZm91bmQucHVzaChoZWxwW21vZGVbdHlwZV1dKTsgfVxuICAgICAgICB9IGVsc2UgaWYgKG1vZGVbdHlwZV0pIHtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1vZGVbdHlwZV0ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciB2YWwgPSBoZWxwW21vZGVbdHlwZV1baV1dO1xuICAgICAgICAgICAgaWYgKHZhbCkgeyBmb3VuZC5wdXNoKHZhbCk7IH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAobW9kZS5oZWxwZXJUeXBlICYmIGhlbHBbbW9kZS5oZWxwZXJUeXBlXSkge1xuICAgICAgICAgIGZvdW5kLnB1c2goaGVscFttb2RlLmhlbHBlclR5cGVdKTtcbiAgICAgICAgfSBlbHNlIGlmIChoZWxwW21vZGUubmFtZV0pIHtcbiAgICAgICAgICBmb3VuZC5wdXNoKGhlbHBbbW9kZS5uYW1lXSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgaGVscC5fZ2xvYmFsLmxlbmd0aDsgaSQxKyspIHtcbiAgICAgICAgICB2YXIgY3VyID0gaGVscC5fZ2xvYmFsW2kkMV07XG4gICAgICAgICAgaWYgKGN1ci5wcmVkKG1vZGUsIHRoaXMpICYmIGluZGV4T2YoZm91bmQsIGN1ci52YWwpID09IC0xKVxuICAgICAgICAgICAgeyBmb3VuZC5wdXNoKGN1ci52YWwpOyB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZvdW5kXG4gICAgICB9LFxuXG4gICAgICBnZXRTdGF0ZUFmdGVyOiBmdW5jdGlvbihsaW5lLCBwcmVjaXNlKSB7XG4gICAgICAgIHZhciBkb2MgPSB0aGlzLmRvYztcbiAgICAgICAgbGluZSA9IGNsaXBMaW5lKGRvYywgbGluZSA9PSBudWxsID8gZG9jLmZpcnN0ICsgZG9jLnNpemUgLSAxOiBsaW5lKTtcbiAgICAgICAgcmV0dXJuIGdldENvbnRleHRCZWZvcmUodGhpcywgbGluZSArIDEsIHByZWNpc2UpLnN0YXRlXG4gICAgICB9LFxuXG4gICAgICBjdXJzb3JDb29yZHM6IGZ1bmN0aW9uKHN0YXJ0LCBtb2RlKSB7XG4gICAgICAgIHZhciBwb3MsIHJhbmdlID0gdGhpcy5kb2Muc2VsLnByaW1hcnkoKTtcbiAgICAgICAgaWYgKHN0YXJ0ID09IG51bGwpIHsgcG9zID0gcmFuZ2UuaGVhZDsgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2Ygc3RhcnQgPT0gXCJvYmplY3RcIikgeyBwb3MgPSBjbGlwUG9zKHRoaXMuZG9jLCBzdGFydCk7IH1cbiAgICAgICAgZWxzZSB7IHBvcyA9IHN0YXJ0ID8gcmFuZ2UuZnJvbSgpIDogcmFuZ2UudG8oKTsgfVxuICAgICAgICByZXR1cm4gY3Vyc29yQ29vcmRzKHRoaXMsIHBvcywgbW9kZSB8fCBcInBhZ2VcIilcbiAgICAgIH0sXG5cbiAgICAgIGNoYXJDb29yZHM6IGZ1bmN0aW9uKHBvcywgbW9kZSkge1xuICAgICAgICByZXR1cm4gY2hhckNvb3Jkcyh0aGlzLCBjbGlwUG9zKHRoaXMuZG9jLCBwb3MpLCBtb2RlIHx8IFwicGFnZVwiKVxuICAgICAgfSxcblxuICAgICAgY29vcmRzQ2hhcjogZnVuY3Rpb24oY29vcmRzLCBtb2RlKSB7XG4gICAgICAgIGNvb3JkcyA9IGZyb21Db29yZFN5c3RlbSh0aGlzLCBjb29yZHMsIG1vZGUgfHwgXCJwYWdlXCIpO1xuICAgICAgICByZXR1cm4gY29vcmRzQ2hhcih0aGlzLCBjb29yZHMubGVmdCwgY29vcmRzLnRvcClcbiAgICAgIH0sXG5cbiAgICAgIGxpbmVBdEhlaWdodDogZnVuY3Rpb24oaGVpZ2h0LCBtb2RlKSB7XG4gICAgICAgIGhlaWdodCA9IGZyb21Db29yZFN5c3RlbSh0aGlzLCB7dG9wOiBoZWlnaHQsIGxlZnQ6IDB9LCBtb2RlIHx8IFwicGFnZVwiKS50b3A7XG4gICAgICAgIHJldHVybiBsaW5lQXRIZWlnaHQodGhpcy5kb2MsIGhlaWdodCArIHRoaXMuZGlzcGxheS52aWV3T2Zmc2V0KVxuICAgICAgfSxcbiAgICAgIGhlaWdodEF0TGluZTogZnVuY3Rpb24obGluZSwgbW9kZSwgaW5jbHVkZVdpZGdldHMpIHtcbiAgICAgICAgdmFyIGVuZCA9IGZhbHNlLCBsaW5lT2JqO1xuICAgICAgICBpZiAodHlwZW9mIGxpbmUgPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIHZhciBsYXN0ID0gdGhpcy5kb2MuZmlyc3QgKyB0aGlzLmRvYy5zaXplIC0gMTtcbiAgICAgICAgICBpZiAobGluZSA8IHRoaXMuZG9jLmZpcnN0KSB7IGxpbmUgPSB0aGlzLmRvYy5maXJzdDsgfVxuICAgICAgICAgIGVsc2UgaWYgKGxpbmUgPiBsYXN0KSB7IGxpbmUgPSBsYXN0OyBlbmQgPSB0cnVlOyB9XG4gICAgICAgICAgbGluZU9iaiA9IGdldExpbmUodGhpcy5kb2MsIGxpbmUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxpbmVPYmogPSBsaW5lO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbnRvQ29vcmRTeXN0ZW0odGhpcywgbGluZU9iaiwge3RvcDogMCwgbGVmdDogMH0sIG1vZGUgfHwgXCJwYWdlXCIsIGluY2x1ZGVXaWRnZXRzIHx8IGVuZCkudG9wICtcbiAgICAgICAgICAoZW5kID8gdGhpcy5kb2MuaGVpZ2h0IC0gaGVpZ2h0QXRMaW5lKGxpbmVPYmopIDogMClcbiAgICAgIH0sXG5cbiAgICAgIGRlZmF1bHRUZXh0SGVpZ2h0OiBmdW5jdGlvbigpIHsgcmV0dXJuIHRleHRIZWlnaHQodGhpcy5kaXNwbGF5KSB9LFxuICAgICAgZGVmYXVsdENoYXJXaWR0aDogZnVuY3Rpb24oKSB7IHJldHVybiBjaGFyV2lkdGgodGhpcy5kaXNwbGF5KSB9LFxuXG4gICAgICBnZXRWaWV3cG9ydDogZnVuY3Rpb24oKSB7IHJldHVybiB7ZnJvbTogdGhpcy5kaXNwbGF5LnZpZXdGcm9tLCB0bzogdGhpcy5kaXNwbGF5LnZpZXdUb319LFxuXG4gICAgICBhZGRXaWRnZXQ6IGZ1bmN0aW9uKHBvcywgbm9kZSwgc2Nyb2xsLCB2ZXJ0LCBob3Jpeikge1xuICAgICAgICB2YXIgZGlzcGxheSA9IHRoaXMuZGlzcGxheTtcbiAgICAgICAgcG9zID0gY3Vyc29yQ29vcmRzKHRoaXMsIGNsaXBQb3ModGhpcy5kb2MsIHBvcykpO1xuICAgICAgICB2YXIgdG9wID0gcG9zLmJvdHRvbSwgbGVmdCA9IHBvcy5sZWZ0O1xuICAgICAgICBub2RlLnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShcImNtLWlnbm9yZS1ldmVudHNcIiwgXCJ0cnVlXCIpO1xuICAgICAgICB0aGlzLmRpc3BsYXkuaW5wdXQuc2V0VW5lZGl0YWJsZShub2RlKTtcbiAgICAgICAgZGlzcGxheS5zaXplci5hcHBlbmRDaGlsZChub2RlKTtcbiAgICAgICAgaWYgKHZlcnQgPT0gXCJvdmVyXCIpIHtcbiAgICAgICAgICB0b3AgPSBwb3MudG9wO1xuICAgICAgICB9IGVsc2UgaWYgKHZlcnQgPT0gXCJhYm92ZVwiIHx8IHZlcnQgPT0gXCJuZWFyXCIpIHtcbiAgICAgICAgICB2YXIgdnNwYWNlID0gTWF0aC5tYXgoZGlzcGxheS53cmFwcGVyLmNsaWVudEhlaWdodCwgdGhpcy5kb2MuaGVpZ2h0KSxcbiAgICAgICAgICBoc3BhY2UgPSBNYXRoLm1heChkaXNwbGF5LnNpemVyLmNsaWVudFdpZHRoLCBkaXNwbGF5LmxpbmVTcGFjZS5jbGllbnRXaWR0aCk7XG4gICAgICAgICAgLy8gRGVmYXVsdCB0byBwb3NpdGlvbmluZyBhYm92ZSAoaWYgc3BlY2lmaWVkIGFuZCBwb3NzaWJsZSk7IG90aGVyd2lzZSBkZWZhdWx0IHRvIHBvc2l0aW9uaW5nIGJlbG93XG4gICAgICAgICAgaWYgKCh2ZXJ0ID09ICdhYm92ZScgfHwgcG9zLmJvdHRvbSArIG5vZGUub2Zmc2V0SGVpZ2h0ID4gdnNwYWNlKSAmJiBwb3MudG9wID4gbm9kZS5vZmZzZXRIZWlnaHQpXG4gICAgICAgICAgICB7IHRvcCA9IHBvcy50b3AgLSBub2RlLm9mZnNldEhlaWdodDsgfVxuICAgICAgICAgIGVsc2UgaWYgKHBvcy5ib3R0b20gKyBub2RlLm9mZnNldEhlaWdodCA8PSB2c3BhY2UpXG4gICAgICAgICAgICB7IHRvcCA9IHBvcy5ib3R0b207IH1cbiAgICAgICAgICBpZiAobGVmdCArIG5vZGUub2Zmc2V0V2lkdGggPiBoc3BhY2UpXG4gICAgICAgICAgICB7IGxlZnQgPSBoc3BhY2UgLSBub2RlLm9mZnNldFdpZHRoOyB9XG4gICAgICAgIH1cbiAgICAgICAgbm9kZS5zdHlsZS50b3AgPSB0b3AgKyBcInB4XCI7XG4gICAgICAgIG5vZGUuc3R5bGUubGVmdCA9IG5vZGUuc3R5bGUucmlnaHQgPSBcIlwiO1xuICAgICAgICBpZiAoaG9yaXogPT0gXCJyaWdodFwiKSB7XG4gICAgICAgICAgbGVmdCA9IGRpc3BsYXkuc2l6ZXIuY2xpZW50V2lkdGggLSBub2RlLm9mZnNldFdpZHRoO1xuICAgICAgICAgIG5vZGUuc3R5bGUucmlnaHQgPSBcIjBweFwiO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChob3JpeiA9PSBcImxlZnRcIikgeyBsZWZ0ID0gMDsgfVxuICAgICAgICAgIGVsc2UgaWYgKGhvcml6ID09IFwibWlkZGxlXCIpIHsgbGVmdCA9IChkaXNwbGF5LnNpemVyLmNsaWVudFdpZHRoIC0gbm9kZS5vZmZzZXRXaWR0aCkgLyAyOyB9XG4gICAgICAgICAgbm9kZS5zdHlsZS5sZWZ0ID0gbGVmdCArIFwicHhcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2Nyb2xsKVxuICAgICAgICAgIHsgc2Nyb2xsSW50b1ZpZXcodGhpcywge2xlZnQ6IGxlZnQsIHRvcDogdG9wLCByaWdodDogbGVmdCArIG5vZGUub2Zmc2V0V2lkdGgsIGJvdHRvbTogdG9wICsgbm9kZS5vZmZzZXRIZWlnaHR9KTsgfVxuICAgICAgfSxcblxuICAgICAgdHJpZ2dlck9uS2V5RG93bjogbWV0aG9kT3Aob25LZXlEb3duKSxcbiAgICAgIHRyaWdnZXJPbktleVByZXNzOiBtZXRob2RPcChvbktleVByZXNzKSxcbiAgICAgIHRyaWdnZXJPbktleVVwOiBvbktleVVwLFxuICAgICAgdHJpZ2dlck9uTW91c2VEb3duOiBtZXRob2RPcChvbk1vdXNlRG93biksXG5cbiAgICAgIGV4ZWNDb21tYW5kOiBmdW5jdGlvbihjbWQpIHtcbiAgICAgICAgaWYgKGNvbW1hbmRzLmhhc093blByb3BlcnR5KGNtZCkpXG4gICAgICAgICAgeyByZXR1cm4gY29tbWFuZHNbY21kXS5jYWxsKG51bGwsIHRoaXMpIH1cbiAgICAgIH0sXG5cbiAgICAgIHRyaWdnZXJFbGVjdHJpYzogbWV0aG9kT3AoZnVuY3Rpb24odGV4dCkgeyB0cmlnZ2VyRWxlY3RyaWModGhpcywgdGV4dCk7IH0pLFxuXG4gICAgICBmaW5kUG9zSDogZnVuY3Rpb24oZnJvbSwgYW1vdW50LCB1bml0LCB2aXN1YWxseSkge1xuICAgICAgICB2YXIgZGlyID0gMTtcbiAgICAgICAgaWYgKGFtb3VudCA8IDApIHsgZGlyID0gLTE7IGFtb3VudCA9IC1hbW91bnQ7IH1cbiAgICAgICAgdmFyIGN1ciA9IGNsaXBQb3ModGhpcy5kb2MsIGZyb20pO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFtb3VudDsgKytpKSB7XG4gICAgICAgICAgY3VyID0gZmluZFBvc0godGhpcy5kb2MsIGN1ciwgZGlyLCB1bml0LCB2aXN1YWxseSk7XG4gICAgICAgICAgaWYgKGN1ci5oaXRTaWRlKSB7IGJyZWFrIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY3VyXG4gICAgICB9LFxuXG4gICAgICBtb3ZlSDogbWV0aG9kT3AoZnVuY3Rpb24oZGlyLCB1bml0KSB7XG4gICAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgICAgIHRoaXMuZXh0ZW5kU2VsZWN0aW9uc0J5KGZ1bmN0aW9uIChyYW5nZSkge1xuICAgICAgICAgIGlmICh0aGlzJDEuZGlzcGxheS5zaGlmdCB8fCB0aGlzJDEuZG9jLmV4dGVuZCB8fCByYW5nZS5lbXB0eSgpKVxuICAgICAgICAgICAgeyByZXR1cm4gZmluZFBvc0godGhpcyQxLmRvYywgcmFuZ2UuaGVhZCwgZGlyLCB1bml0LCB0aGlzJDEub3B0aW9ucy5ydGxNb3ZlVmlzdWFsbHkpIH1cbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7IHJldHVybiBkaXIgPCAwID8gcmFuZ2UuZnJvbSgpIDogcmFuZ2UudG8oKSB9XG4gICAgICAgIH0sIHNlbF9tb3ZlKTtcbiAgICAgIH0pLFxuXG4gICAgICBkZWxldGVIOiBtZXRob2RPcChmdW5jdGlvbihkaXIsIHVuaXQpIHtcbiAgICAgICAgdmFyIHNlbCA9IHRoaXMuZG9jLnNlbCwgZG9jID0gdGhpcy5kb2M7XG4gICAgICAgIGlmIChzZWwuc29tZXRoaW5nU2VsZWN0ZWQoKSlcbiAgICAgICAgICB7IGRvYy5yZXBsYWNlU2VsZWN0aW9uKFwiXCIsIG51bGwsIFwiK2RlbGV0ZVwiKTsgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgeyBkZWxldGVOZWFyU2VsZWN0aW9uKHRoaXMsIGZ1bmN0aW9uIChyYW5nZSkge1xuICAgICAgICAgICAgdmFyIG90aGVyID0gZmluZFBvc0goZG9jLCByYW5nZS5oZWFkLCBkaXIsIHVuaXQsIGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybiBkaXIgPCAwID8ge2Zyb206IG90aGVyLCB0bzogcmFuZ2UuaGVhZH0gOiB7ZnJvbTogcmFuZ2UuaGVhZCwgdG86IG90aGVyfVxuICAgICAgICAgIH0pOyB9XG4gICAgICB9KSxcblxuICAgICAgZmluZFBvc1Y6IGZ1bmN0aW9uKGZyb20sIGFtb3VudCwgdW5pdCwgZ29hbENvbHVtbikge1xuICAgICAgICB2YXIgZGlyID0gMSwgeCA9IGdvYWxDb2x1bW47XG4gICAgICAgIGlmIChhbW91bnQgPCAwKSB7IGRpciA9IC0xOyBhbW91bnQgPSAtYW1vdW50OyB9XG4gICAgICAgIHZhciBjdXIgPSBjbGlwUG9zKHRoaXMuZG9jLCBmcm9tKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbW91bnQ7ICsraSkge1xuICAgICAgICAgIHZhciBjb29yZHMgPSBjdXJzb3JDb29yZHModGhpcywgY3VyLCBcImRpdlwiKTtcbiAgICAgICAgICBpZiAoeCA9PSBudWxsKSB7IHggPSBjb29yZHMubGVmdDsgfVxuICAgICAgICAgIGVsc2UgeyBjb29yZHMubGVmdCA9IHg7IH1cbiAgICAgICAgICBjdXIgPSBmaW5kUG9zVih0aGlzLCBjb29yZHMsIGRpciwgdW5pdCk7XG4gICAgICAgICAgaWYgKGN1ci5oaXRTaWRlKSB7IGJyZWFrIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY3VyXG4gICAgICB9LFxuXG4gICAgICBtb3ZlVjogbWV0aG9kT3AoZnVuY3Rpb24oZGlyLCB1bml0KSB7XG4gICAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgICAgIHZhciBkb2MgPSB0aGlzLmRvYywgZ29hbHMgPSBbXTtcbiAgICAgICAgdmFyIGNvbGxhcHNlID0gIXRoaXMuZGlzcGxheS5zaGlmdCAmJiAhZG9jLmV4dGVuZCAmJiBkb2Muc2VsLnNvbWV0aGluZ1NlbGVjdGVkKCk7XG4gICAgICAgIGRvYy5leHRlbmRTZWxlY3Rpb25zQnkoZnVuY3Rpb24gKHJhbmdlKSB7XG4gICAgICAgICAgaWYgKGNvbGxhcHNlKVxuICAgICAgICAgICAgeyByZXR1cm4gZGlyIDwgMCA/IHJhbmdlLmZyb20oKSA6IHJhbmdlLnRvKCkgfVxuICAgICAgICAgIHZhciBoZWFkUG9zID0gY3Vyc29yQ29vcmRzKHRoaXMkMSwgcmFuZ2UuaGVhZCwgXCJkaXZcIik7XG4gICAgICAgICAgaWYgKHJhbmdlLmdvYWxDb2x1bW4gIT0gbnVsbCkgeyBoZWFkUG9zLmxlZnQgPSByYW5nZS5nb2FsQ29sdW1uOyB9XG4gICAgICAgICAgZ29hbHMucHVzaChoZWFkUG9zLmxlZnQpO1xuICAgICAgICAgIHZhciBwb3MgPSBmaW5kUG9zVih0aGlzJDEsIGhlYWRQb3MsIGRpciwgdW5pdCk7XG4gICAgICAgICAgaWYgKHVuaXQgPT0gXCJwYWdlXCIgJiYgcmFuZ2UgPT0gZG9jLnNlbC5wcmltYXJ5KCkpXG4gICAgICAgICAgICB7IGFkZFRvU2Nyb2xsVG9wKHRoaXMkMSwgY2hhckNvb3Jkcyh0aGlzJDEsIHBvcywgXCJkaXZcIikudG9wIC0gaGVhZFBvcy50b3ApOyB9XG4gICAgICAgICAgcmV0dXJuIHBvc1xuICAgICAgICB9LCBzZWxfbW92ZSk7XG4gICAgICAgIGlmIChnb2Fscy5sZW5ndGgpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBkb2Muc2VsLnJhbmdlcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICB7IGRvYy5zZWwucmFuZ2VzW2ldLmdvYWxDb2x1bW4gPSBnb2Fsc1tpXTsgfSB9XG4gICAgICB9KSxcblxuICAgICAgLy8gRmluZCB0aGUgd29yZCBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24gKGFzIHJldHVybmVkIGJ5IGNvb3Jkc0NoYXIpLlxuICAgICAgZmluZFdvcmRBdDogZnVuY3Rpb24ocG9zKSB7XG4gICAgICAgIHZhciBkb2MgPSB0aGlzLmRvYywgbGluZSA9IGdldExpbmUoZG9jLCBwb3MubGluZSkudGV4dDtcbiAgICAgICAgdmFyIHN0YXJ0ID0gcG9zLmNoLCBlbmQgPSBwb3MuY2g7XG4gICAgICAgIGlmIChsaW5lKSB7XG4gICAgICAgICAgdmFyIGhlbHBlciA9IHRoaXMuZ2V0SGVscGVyKHBvcywgXCJ3b3JkQ2hhcnNcIik7XG4gICAgICAgICAgaWYgKChwb3Muc3RpY2t5ID09IFwiYmVmb3JlXCIgfHwgZW5kID09IGxpbmUubGVuZ3RoKSAmJiBzdGFydCkgeyAtLXN0YXJ0OyB9IGVsc2UgeyArK2VuZDsgfVxuICAgICAgICAgIHZhciBzdGFydENoYXIgPSBsaW5lLmNoYXJBdChzdGFydCk7XG4gICAgICAgICAgdmFyIGNoZWNrID0gaXNXb3JkQ2hhcihzdGFydENoYXIsIGhlbHBlcilcbiAgICAgICAgICAgID8gZnVuY3Rpb24gKGNoKSB7IHJldHVybiBpc1dvcmRDaGFyKGNoLCBoZWxwZXIpOyB9XG4gICAgICAgICAgICA6IC9cXHMvLnRlc3Qoc3RhcnRDaGFyKSA/IGZ1bmN0aW9uIChjaCkgeyByZXR1cm4gL1xccy8udGVzdChjaCk7IH1cbiAgICAgICAgICAgIDogZnVuY3Rpb24gKGNoKSB7IHJldHVybiAoIS9cXHMvLnRlc3QoY2gpICYmICFpc1dvcmRDaGFyKGNoKSk7IH07XG4gICAgICAgICAgd2hpbGUgKHN0YXJ0ID4gMCAmJiBjaGVjayhsaW5lLmNoYXJBdChzdGFydCAtIDEpKSkgeyAtLXN0YXJ0OyB9XG4gICAgICAgICAgd2hpbGUgKGVuZCA8IGxpbmUubGVuZ3RoICYmIGNoZWNrKGxpbmUuY2hhckF0KGVuZCkpKSB7ICsrZW5kOyB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBSYW5nZShQb3MocG9zLmxpbmUsIHN0YXJ0KSwgUG9zKHBvcy5saW5lLCBlbmQpKVxuICAgICAgfSxcblxuICAgICAgdG9nZ2xlT3ZlcndyaXRlOiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSA9PSB0aGlzLnN0YXRlLm92ZXJ3cml0ZSkgeyByZXR1cm4gfVxuICAgICAgICBpZiAodGhpcy5zdGF0ZS5vdmVyd3JpdGUgPSAhdGhpcy5zdGF0ZS5vdmVyd3JpdGUpXG4gICAgICAgICAgeyBhZGRDbGFzcyh0aGlzLmRpc3BsYXkuY3Vyc29yRGl2LCBcIkNvZGVNaXJyb3Itb3ZlcndyaXRlXCIpOyB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICB7IHJtQ2xhc3ModGhpcy5kaXNwbGF5LmN1cnNvckRpdiwgXCJDb2RlTWlycm9yLW92ZXJ3cml0ZVwiKTsgfVxuXG4gICAgICAgIHNpZ25hbCh0aGlzLCBcIm92ZXJ3cml0ZVRvZ2dsZVwiLCB0aGlzLCB0aGlzLnN0YXRlLm92ZXJ3cml0ZSk7XG4gICAgICB9LFxuICAgICAgaGFzRm9jdXM6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5kaXNwbGF5LmlucHV0LmdldEZpZWxkKCkgPT0gYWN0aXZlRWx0KCkgfSxcbiAgICAgIGlzUmVhZE9ubHk6IGZ1bmN0aW9uKCkgeyByZXR1cm4gISEodGhpcy5vcHRpb25zLnJlYWRPbmx5IHx8IHRoaXMuZG9jLmNhbnRFZGl0KSB9LFxuXG4gICAgICBzY3JvbGxUbzogbWV0aG9kT3AoZnVuY3Rpb24gKHgsIHkpIHsgc2Nyb2xsVG9Db29yZHModGhpcywgeCwgeSk7IH0pLFxuICAgICAgZ2V0U2Nyb2xsSW5mbzogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBzY3JvbGxlciA9IHRoaXMuZGlzcGxheS5zY3JvbGxlcjtcbiAgICAgICAgcmV0dXJuIHtsZWZ0OiBzY3JvbGxlci5zY3JvbGxMZWZ0LCB0b3A6IHNjcm9sbGVyLnNjcm9sbFRvcCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IHNjcm9sbGVyLnNjcm9sbEhlaWdodCAtIHNjcm9sbEdhcCh0aGlzKSAtIHRoaXMuZGlzcGxheS5iYXJIZWlnaHQsXG4gICAgICAgICAgICAgICAgd2lkdGg6IHNjcm9sbGVyLnNjcm9sbFdpZHRoIC0gc2Nyb2xsR2FwKHRoaXMpIC0gdGhpcy5kaXNwbGF5LmJhcldpZHRoLFxuICAgICAgICAgICAgICAgIGNsaWVudEhlaWdodDogZGlzcGxheUhlaWdodCh0aGlzKSwgY2xpZW50V2lkdGg6IGRpc3BsYXlXaWR0aCh0aGlzKX1cbiAgICAgIH0sXG5cbiAgICAgIHNjcm9sbEludG9WaWV3OiBtZXRob2RPcChmdW5jdGlvbihyYW5nZSwgbWFyZ2luKSB7XG4gICAgICAgIGlmIChyYW5nZSA9PSBudWxsKSB7XG4gICAgICAgICAgcmFuZ2UgPSB7ZnJvbTogdGhpcy5kb2Muc2VsLnByaW1hcnkoKS5oZWFkLCB0bzogbnVsbH07XG4gICAgICAgICAgaWYgKG1hcmdpbiA9PSBudWxsKSB7IG1hcmdpbiA9IHRoaXMub3B0aW9ucy5jdXJzb3JTY3JvbGxNYXJnaW47IH1cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcmFuZ2UgPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIHJhbmdlID0ge2Zyb206IFBvcyhyYW5nZSwgMCksIHRvOiBudWxsfTtcbiAgICAgICAgfSBlbHNlIGlmIChyYW5nZS5mcm9tID09IG51bGwpIHtcbiAgICAgICAgICByYW5nZSA9IHtmcm9tOiByYW5nZSwgdG86IG51bGx9O1xuICAgICAgICB9XG4gICAgICAgIGlmICghcmFuZ2UudG8pIHsgcmFuZ2UudG8gPSByYW5nZS5mcm9tOyB9XG4gICAgICAgIHJhbmdlLm1hcmdpbiA9IG1hcmdpbiB8fCAwO1xuXG4gICAgICAgIGlmIChyYW5nZS5mcm9tLmxpbmUgIT0gbnVsbCkge1xuICAgICAgICAgIHNjcm9sbFRvUmFuZ2UodGhpcywgcmFuZ2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNjcm9sbFRvQ29vcmRzUmFuZ2UodGhpcywgcmFuZ2UuZnJvbSwgcmFuZ2UudG8sIHJhbmdlLm1hcmdpbik7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuXG4gICAgICBzZXRTaXplOiBtZXRob2RPcChmdW5jdGlvbih3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgICAgIHZhciBpbnRlcnByZXQgPSBmdW5jdGlvbiAodmFsKSB7IHJldHVybiB0eXBlb2YgdmFsID09IFwibnVtYmVyXCIgfHwgL15cXGQrJC8udGVzdChTdHJpbmcodmFsKSkgPyB2YWwgKyBcInB4XCIgOiB2YWw7IH07XG4gICAgICAgIGlmICh3aWR0aCAhPSBudWxsKSB7IHRoaXMuZGlzcGxheS53cmFwcGVyLnN0eWxlLndpZHRoID0gaW50ZXJwcmV0KHdpZHRoKTsgfVxuICAgICAgICBpZiAoaGVpZ2h0ICE9IG51bGwpIHsgdGhpcy5kaXNwbGF5LndyYXBwZXIuc3R5bGUuaGVpZ2h0ID0gaW50ZXJwcmV0KGhlaWdodCk7IH1cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5saW5lV3JhcHBpbmcpIHsgY2xlYXJMaW5lTWVhc3VyZW1lbnRDYWNoZSh0aGlzKTsgfVxuICAgICAgICB2YXIgbGluZU5vID0gdGhpcy5kaXNwbGF5LnZpZXdGcm9tO1xuICAgICAgICB0aGlzLmRvYy5pdGVyKGxpbmVObywgdGhpcy5kaXNwbGF5LnZpZXdUbywgZnVuY3Rpb24gKGxpbmUpIHtcbiAgICAgICAgICBpZiAobGluZS53aWRnZXRzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgbGluZS53aWRnZXRzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgeyBpZiAobGluZS53aWRnZXRzW2ldLm5vSFNjcm9sbCkgeyByZWdMaW5lQ2hhbmdlKHRoaXMkMSwgbGluZU5vLCBcIndpZGdldFwiKTsgYnJlYWsgfSB9IH1cbiAgICAgICAgICArK2xpbmVObztcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY3VyT3AuZm9yY2VVcGRhdGUgPSB0cnVlO1xuICAgICAgICBzaWduYWwodGhpcywgXCJyZWZyZXNoXCIsIHRoaXMpO1xuICAgICAgfSksXG5cbiAgICAgIG9wZXJhdGlvbjogZnVuY3Rpb24oZil7cmV0dXJuIHJ1bkluT3AodGhpcywgZil9LFxuICAgICAgc3RhcnRPcGVyYXRpb246IGZ1bmN0aW9uKCl7cmV0dXJuIHN0YXJ0T3BlcmF0aW9uKHRoaXMpfSxcbiAgICAgIGVuZE9wZXJhdGlvbjogZnVuY3Rpb24oKXtyZXR1cm4gZW5kT3BlcmF0aW9uKHRoaXMpfSxcblxuICAgICAgcmVmcmVzaDogbWV0aG9kT3AoZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBvbGRIZWlnaHQgPSB0aGlzLmRpc3BsYXkuY2FjaGVkVGV4dEhlaWdodDtcbiAgICAgICAgcmVnQ2hhbmdlKHRoaXMpO1xuICAgICAgICB0aGlzLmN1ck9wLmZvcmNlVXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgY2xlYXJDYWNoZXModGhpcyk7XG4gICAgICAgIHNjcm9sbFRvQ29vcmRzKHRoaXMsIHRoaXMuZG9jLnNjcm9sbExlZnQsIHRoaXMuZG9jLnNjcm9sbFRvcCk7XG4gICAgICAgIHVwZGF0ZUd1dHRlclNwYWNlKHRoaXMuZGlzcGxheSk7XG4gICAgICAgIGlmIChvbGRIZWlnaHQgPT0gbnVsbCB8fCBNYXRoLmFicyhvbGRIZWlnaHQgLSB0ZXh0SGVpZ2h0KHRoaXMuZGlzcGxheSkpID4gLjUgfHwgdGhpcy5vcHRpb25zLmxpbmVXcmFwcGluZylcbiAgICAgICAgICB7IGVzdGltYXRlTGluZUhlaWdodHModGhpcyk7IH1cbiAgICAgICAgc2lnbmFsKHRoaXMsIFwicmVmcmVzaFwiLCB0aGlzKTtcbiAgICAgIH0pLFxuXG4gICAgICBzd2FwRG9jOiBtZXRob2RPcChmdW5jdGlvbihkb2MpIHtcbiAgICAgICAgdmFyIG9sZCA9IHRoaXMuZG9jO1xuICAgICAgICBvbGQuY20gPSBudWxsO1xuICAgICAgICAvLyBDYW5jZWwgdGhlIGN1cnJlbnQgdGV4dCBzZWxlY3Rpb24gaWYgYW55ICgjNTgyMSlcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuc2VsZWN0aW5nVGV4dCkgeyB0aGlzLnN0YXRlLnNlbGVjdGluZ1RleHQoKTsgfVxuICAgICAgICBhdHRhY2hEb2ModGhpcywgZG9jKTtcbiAgICAgICAgY2xlYXJDYWNoZXModGhpcyk7XG4gICAgICAgIHRoaXMuZGlzcGxheS5pbnB1dC5yZXNldCgpO1xuICAgICAgICBzY3JvbGxUb0Nvb3Jkcyh0aGlzLCBkb2Muc2Nyb2xsTGVmdCwgZG9jLnNjcm9sbFRvcCk7XG4gICAgICAgIHRoaXMuY3VyT3AuZm9yY2VTY3JvbGwgPSB0cnVlO1xuICAgICAgICBzaWduYWxMYXRlcih0aGlzLCBcInN3YXBEb2NcIiwgdGhpcywgb2xkKTtcbiAgICAgICAgcmV0dXJuIG9sZFxuICAgICAgfSksXG5cbiAgICAgIHBocmFzZTogZnVuY3Rpb24ocGhyYXNlVGV4dCkge1xuICAgICAgICB2YXIgcGhyYXNlcyA9IHRoaXMub3B0aW9ucy5waHJhc2VzO1xuICAgICAgICByZXR1cm4gcGhyYXNlcyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocGhyYXNlcywgcGhyYXNlVGV4dCkgPyBwaHJhc2VzW3BocmFzZVRleHRdIDogcGhyYXNlVGV4dFxuICAgICAgfSxcblxuICAgICAgZ2V0SW5wdXRGaWVsZDogZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kaXNwbGF5LmlucHV0LmdldEZpZWxkKCl9LFxuICAgICAgZ2V0V3JhcHBlckVsZW1lbnQ6IGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGlzcGxheS53cmFwcGVyfSxcbiAgICAgIGdldFNjcm9sbGVyRWxlbWVudDogZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kaXNwbGF5LnNjcm9sbGVyfSxcbiAgICAgIGdldEd1dHRlckVsZW1lbnQ6IGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGlzcGxheS5ndXR0ZXJzfVxuICAgIH07XG4gICAgZXZlbnRNaXhpbihDb2RlTWlycm9yKTtcblxuICAgIENvZGVNaXJyb3IucmVnaXN0ZXJIZWxwZXIgPSBmdW5jdGlvbih0eXBlLCBuYW1lLCB2YWx1ZSkge1xuICAgICAgaWYgKCFoZWxwZXJzLmhhc093blByb3BlcnR5KHR5cGUpKSB7IGhlbHBlcnNbdHlwZV0gPSBDb2RlTWlycm9yW3R5cGVdID0ge19nbG9iYWw6IFtdfTsgfVxuICAgICAgaGVscGVyc1t0eXBlXVtuYW1lXSA9IHZhbHVlO1xuICAgIH07XG4gICAgQ29kZU1pcnJvci5yZWdpc3Rlckdsb2JhbEhlbHBlciA9IGZ1bmN0aW9uKHR5cGUsIG5hbWUsIHByZWRpY2F0ZSwgdmFsdWUpIHtcbiAgICAgIENvZGVNaXJyb3IucmVnaXN0ZXJIZWxwZXIodHlwZSwgbmFtZSwgdmFsdWUpO1xuICAgICAgaGVscGVyc1t0eXBlXS5fZ2xvYmFsLnB1c2goe3ByZWQ6IHByZWRpY2F0ZSwgdmFsOiB2YWx1ZX0pO1xuICAgIH07XG4gIH1cblxuICAvLyBVc2VkIGZvciBob3Jpem9udGFsIHJlbGF0aXZlIG1vdGlvbi4gRGlyIGlzIC0xIG9yIDEgKGxlZnQgb3JcbiAgLy8gcmlnaHQpLCB1bml0IGNhbiBiZSBcImNvZGVwb2ludFwiLCBcImNoYXJcIiwgXCJjb2x1bW5cIiAobGlrZSBjaGFyLCBidXRcbiAgLy8gZG9lc24ndCBjcm9zcyBsaW5lIGJvdW5kYXJpZXMpLCBcIndvcmRcIiAoYWNyb3NzIG5leHQgd29yZCksIG9yXG4gIC8vIFwiZ3JvdXBcIiAodG8gdGhlIHN0YXJ0IG9mIG5leHQgZ3JvdXAgb2Ygd29yZCBvclxuICAvLyBub24td29yZC1ub24td2hpdGVzcGFjZSBjaGFycykuIFRoZSB2aXN1YWxseSBwYXJhbSBjb250cm9sc1xuICAvLyB3aGV0aGVyLCBpbiByaWdodC10by1sZWZ0IHRleHQsIGRpcmVjdGlvbiAxIG1lYW5zIHRvIG1vdmUgdG93YXJkc1xuICAvLyB0aGUgbmV4dCBpbmRleCBpbiB0aGUgc3RyaW5nLCBvciB0b3dhcmRzIHRoZSBjaGFyYWN0ZXIgdG8gdGhlIHJpZ2h0XG4gIC8vIG9mIHRoZSBjdXJyZW50IHBvc2l0aW9uLiBUaGUgcmVzdWx0aW5nIHBvc2l0aW9uIHdpbGwgaGF2ZSBhXG4gIC8vIGhpdFNpZGU9dHJ1ZSBwcm9wZXJ0eSBpZiBpdCByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50LlxuICBmdW5jdGlvbiBmaW5kUG9zSChkb2MsIHBvcywgZGlyLCB1bml0LCB2aXN1YWxseSkge1xuICAgIHZhciBvbGRQb3MgPSBwb3M7XG4gICAgdmFyIG9yaWdEaXIgPSBkaXI7XG4gICAgdmFyIGxpbmVPYmogPSBnZXRMaW5lKGRvYywgcG9zLmxpbmUpO1xuICAgIHZhciBsaW5lRGlyID0gdmlzdWFsbHkgJiYgZG9jLmRpcmVjdGlvbiA9PSBcInJ0bFwiID8gLWRpciA6IGRpcjtcbiAgICBmdW5jdGlvbiBmaW5kTmV4dExpbmUoKSB7XG4gICAgICB2YXIgbCA9IHBvcy5saW5lICsgbGluZURpcjtcbiAgICAgIGlmIChsIDwgZG9jLmZpcnN0IHx8IGwgPj0gZG9jLmZpcnN0ICsgZG9jLnNpemUpIHsgcmV0dXJuIGZhbHNlIH1cbiAgICAgIHBvcyA9IG5ldyBQb3MobCwgcG9zLmNoLCBwb3Muc3RpY2t5KTtcbiAgICAgIHJldHVybiBsaW5lT2JqID0gZ2V0TGluZShkb2MsIGwpXG4gICAgfVxuICAgIGZ1bmN0aW9uIG1vdmVPbmNlKGJvdW5kVG9MaW5lKSB7XG4gICAgICB2YXIgbmV4dDtcbiAgICAgIGlmICh1bml0ID09IFwiY29kZXBvaW50XCIpIHtcbiAgICAgICAgdmFyIGNoID0gbGluZU9iai50ZXh0LmNoYXJDb2RlQXQocG9zLmNoICsgKGRpciA+IDAgPyAwIDogLTEpKTtcbiAgICAgICAgaWYgKGlzTmFOKGNoKSkge1xuICAgICAgICAgIG5leHQgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBhc3RyYWwgPSBkaXIgPiAwID8gY2ggPj0gMHhEODAwICYmIGNoIDwgMHhEQzAwIDogY2ggPj0gMHhEQzAwICYmIGNoIDwgMHhERkZGO1xuICAgICAgICAgIG5leHQgPSBuZXcgUG9zKHBvcy5saW5lLCBNYXRoLm1heCgwLCBNYXRoLm1pbihsaW5lT2JqLnRleHQubGVuZ3RoLCBwb3MuY2ggKyBkaXIgKiAoYXN0cmFsID8gMiA6IDEpKSksIC1kaXIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHZpc3VhbGx5KSB7XG4gICAgICAgIG5leHQgPSBtb3ZlVmlzdWFsbHkoZG9jLmNtLCBsaW5lT2JqLCBwb3MsIGRpcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0ID0gbW92ZUxvZ2ljYWxseShsaW5lT2JqLCBwb3MsIGRpcik7XG4gICAgICB9XG4gICAgICBpZiAobmV4dCA9PSBudWxsKSB7XG4gICAgICAgIGlmICghYm91bmRUb0xpbmUgJiYgZmluZE5leHRMaW5lKCkpXG4gICAgICAgICAgeyBwb3MgPSBlbmRPZkxpbmUodmlzdWFsbHksIGRvYy5jbSwgbGluZU9iaiwgcG9zLmxpbmUsIGxpbmVEaXIpOyB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICB7IHJldHVybiBmYWxzZSB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwb3MgPSBuZXh0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBpZiAodW5pdCA9PSBcImNoYXJcIiB8fCB1bml0ID09IFwiY29kZXBvaW50XCIpIHtcbiAgICAgIG1vdmVPbmNlKCk7XG4gICAgfSBlbHNlIGlmICh1bml0ID09IFwiY29sdW1uXCIpIHtcbiAgICAgIG1vdmVPbmNlKHRydWUpO1xuICAgIH0gZWxzZSBpZiAodW5pdCA9PSBcIndvcmRcIiB8fCB1bml0ID09IFwiZ3JvdXBcIikge1xuICAgICAgdmFyIHNhd1R5cGUgPSBudWxsLCBncm91cCA9IHVuaXQgPT0gXCJncm91cFwiO1xuICAgICAgdmFyIGhlbHBlciA9IGRvYy5jbSAmJiBkb2MuY20uZ2V0SGVscGVyKHBvcywgXCJ3b3JkQ2hhcnNcIik7XG4gICAgICBmb3IgKHZhciBmaXJzdCA9IHRydWU7OyBmaXJzdCA9IGZhbHNlKSB7XG4gICAgICAgIGlmIChkaXIgPCAwICYmICFtb3ZlT25jZSghZmlyc3QpKSB7IGJyZWFrIH1cbiAgICAgICAgdmFyIGN1ciA9IGxpbmVPYmoudGV4dC5jaGFyQXQocG9zLmNoKSB8fCBcIlxcblwiO1xuICAgICAgICB2YXIgdHlwZSA9IGlzV29yZENoYXIoY3VyLCBoZWxwZXIpID8gXCJ3XCJcbiAgICAgICAgICA6IGdyb3VwICYmIGN1ciA9PSBcIlxcblwiID8gXCJuXCJcbiAgICAgICAgICA6ICFncm91cCB8fCAvXFxzLy50ZXN0KGN1cikgPyBudWxsXG4gICAgICAgICAgOiBcInBcIjtcbiAgICAgICAgaWYgKGdyb3VwICYmICFmaXJzdCAmJiAhdHlwZSkgeyB0eXBlID0gXCJzXCI7IH1cbiAgICAgICAgaWYgKHNhd1R5cGUgJiYgc2F3VHlwZSAhPSB0eXBlKSB7XG4gICAgICAgICAgaWYgKGRpciA8IDApIHtkaXIgPSAxOyBtb3ZlT25jZSgpOyBwb3Muc3RpY2t5ID0gXCJhZnRlclwiO31cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGUpIHsgc2F3VHlwZSA9IHR5cGU7IH1cbiAgICAgICAgaWYgKGRpciA+IDAgJiYgIW1vdmVPbmNlKCFmaXJzdCkpIHsgYnJlYWsgfVxuICAgICAgfVxuICAgIH1cbiAgICB2YXIgcmVzdWx0ID0gc2tpcEF0b21pYyhkb2MsIHBvcywgb2xkUG9zLCBvcmlnRGlyLCB0cnVlKTtcbiAgICBpZiAoZXF1YWxDdXJzb3JQb3Mob2xkUG9zLCByZXN1bHQpKSB7IHJlc3VsdC5oaXRTaWRlID0gdHJ1ZTsgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8vIEZvciByZWxhdGl2ZSB2ZXJ0aWNhbCBtb3ZlbWVudC4gRGlyIG1heSBiZSAtMSBvciAxLiBVbml0IGNhbiBiZVxuICAvLyBcInBhZ2VcIiBvciBcImxpbmVcIi4gVGhlIHJlc3VsdGluZyBwb3NpdGlvbiB3aWxsIGhhdmUgYSBoaXRTaWRlPXRydWVcbiAgLy8gcHJvcGVydHkgaWYgaXQgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudC5cbiAgZnVuY3Rpb24gZmluZFBvc1YoY20sIHBvcywgZGlyLCB1bml0KSB7XG4gICAgdmFyIGRvYyA9IGNtLmRvYywgeCA9IHBvcy5sZWZ0LCB5O1xuICAgIGlmICh1bml0ID09IFwicGFnZVwiKSB7XG4gICAgICB2YXIgcGFnZVNpemUgPSBNYXRoLm1pbihjbS5kaXNwbGF5LndyYXBwZXIuY2xpZW50SGVpZ2h0LCB3aW5kb3cuaW5uZXJIZWlnaHQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCk7XG4gICAgICB2YXIgbW92ZUFtb3VudCA9IE1hdGgubWF4KHBhZ2VTaXplIC0gLjUgKiB0ZXh0SGVpZ2h0KGNtLmRpc3BsYXkpLCAzKTtcbiAgICAgIHkgPSAoZGlyID4gMCA/IHBvcy5ib3R0b20gOiBwb3MudG9wKSArIGRpciAqIG1vdmVBbW91bnQ7XG5cbiAgICB9IGVsc2UgaWYgKHVuaXQgPT0gXCJsaW5lXCIpIHtcbiAgICAgIHkgPSBkaXIgPiAwID8gcG9zLmJvdHRvbSArIDMgOiBwb3MudG9wIC0gMztcbiAgICB9XG4gICAgdmFyIHRhcmdldDtcbiAgICBmb3IgKDs7KSB7XG4gICAgICB0YXJnZXQgPSBjb29yZHNDaGFyKGNtLCB4LCB5KTtcbiAgICAgIGlmICghdGFyZ2V0Lm91dHNpZGUpIHsgYnJlYWsgfVxuICAgICAgaWYgKGRpciA8IDAgPyB5IDw9IDAgOiB5ID49IGRvYy5oZWlnaHQpIHsgdGFyZ2V0LmhpdFNpZGUgPSB0cnVlOyBicmVhayB9XG4gICAgICB5ICs9IGRpciAqIDU7XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXRcbiAgfVxuXG4gIC8vIENPTlRFTlRFRElUQUJMRSBJTlBVVCBTVFlMRVxuXG4gIHZhciBDb250ZW50RWRpdGFibGVJbnB1dCA9IGZ1bmN0aW9uKGNtKSB7XG4gICAgdGhpcy5jbSA9IGNtO1xuICAgIHRoaXMubGFzdEFuY2hvck5vZGUgPSB0aGlzLmxhc3RBbmNob3JPZmZzZXQgPSB0aGlzLmxhc3RGb2N1c05vZGUgPSB0aGlzLmxhc3RGb2N1c09mZnNldCA9IG51bGw7XG4gICAgdGhpcy5wb2xsaW5nID0gbmV3IERlbGF5ZWQoKTtcbiAgICB0aGlzLmNvbXBvc2luZyA9IG51bGw7XG4gICAgdGhpcy5ncmFjZVBlcmlvZCA9IGZhbHNlO1xuICAgIHRoaXMucmVhZERPTVRpbWVvdXQgPSBudWxsO1xuICB9O1xuXG4gIENvbnRlbnRFZGl0YWJsZUlucHV0LnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKGRpc3BsYXkpIHtcbiAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgdmFyIGlucHV0ID0gdGhpcywgY20gPSBpbnB1dC5jbTtcbiAgICB2YXIgZGl2ID0gaW5wdXQuZGl2ID0gZGlzcGxheS5saW5lRGl2O1xuICAgIGRpdi5jb250ZW50RWRpdGFibGUgPSB0cnVlO1xuICAgIGRpc2FibGVCcm93c2VyTWFnaWMoZGl2LCBjbS5vcHRpb25zLnNwZWxsY2hlY2ssIGNtLm9wdGlvbnMuYXV0b2NvcnJlY3QsIGNtLm9wdGlvbnMuYXV0b2NhcGl0YWxpemUpO1xuXG4gICAgZnVuY3Rpb24gYmVsb25nc1RvSW5wdXQoZSkge1xuICAgICAgZm9yICh2YXIgdCA9IGUudGFyZ2V0OyB0OyB0ID0gdC5wYXJlbnROb2RlKSB7XG4gICAgICAgIGlmICh0ID09IGRpdikgeyByZXR1cm4gdHJ1ZSB9XG4gICAgICAgIGlmICgvXFxiQ29kZU1pcnJvci0oPzpsaW5lKT93aWRnZXRcXGIvLnRlc3QodC5jbGFzc05hbWUpKSB7IGJyZWFrIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIG9uKGRpdiwgXCJwYXN0ZVwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKCFiZWxvbmdzVG9JbnB1dChlKSB8fCBzaWduYWxET01FdmVudChjbSwgZSkgfHwgaGFuZGxlUGFzdGUoZSwgY20pKSB7IHJldHVybiB9XG4gICAgICAvLyBJRSBkb2Vzbid0IGZpcmUgaW5wdXQgZXZlbnRzLCBzbyB3ZSBzY2hlZHVsZSBhIHJlYWQgZm9yIHRoZSBwYXN0ZWQgY29udGVudCBpbiB0aGlzIHdheVxuICAgICAgaWYgKGllX3ZlcnNpb24gPD0gMTEpIHsgc2V0VGltZW91dChvcGVyYXRpb24oY20sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMkMS51cGRhdGVGcm9tRE9NKCk7IH0pLCAyMCk7IH1cbiAgICB9KTtcblxuICAgIG9uKGRpdiwgXCJjb21wb3NpdGlvbnN0YXJ0XCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICB0aGlzJDEuY29tcG9zaW5nID0ge2RhdGE6IGUuZGF0YSwgZG9uZTogZmFsc2V9O1xuICAgIH0pO1xuICAgIG9uKGRpdiwgXCJjb21wb3NpdGlvbnVwZGF0ZVwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKCF0aGlzJDEuY29tcG9zaW5nKSB7IHRoaXMkMS5jb21wb3NpbmcgPSB7ZGF0YTogZS5kYXRhLCBkb25lOiBmYWxzZX07IH1cbiAgICB9KTtcbiAgICBvbihkaXYsIFwiY29tcG9zaXRpb25lbmRcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmICh0aGlzJDEuY29tcG9zaW5nKSB7XG4gICAgICAgIGlmIChlLmRhdGEgIT0gdGhpcyQxLmNvbXBvc2luZy5kYXRhKSB7IHRoaXMkMS5yZWFkRnJvbURPTVNvb24oKTsgfVxuICAgICAgICB0aGlzJDEuY29tcG9zaW5nLmRvbmUgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgb24oZGl2LCBcInRvdWNoc3RhcnRcIiwgZnVuY3Rpb24gKCkgeyByZXR1cm4gaW5wdXQuZm9yY2VDb21wb3NpdGlvbkVuZCgpOyB9KTtcblxuICAgIG9uKGRpdiwgXCJpbnB1dFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIXRoaXMkMS5jb21wb3NpbmcpIHsgdGhpcyQxLnJlYWRGcm9tRE9NU29vbigpOyB9XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBvbkNvcHlDdXQoZSkge1xuICAgICAgaWYgKCFiZWxvbmdzVG9JbnB1dChlKSB8fCBzaWduYWxET01FdmVudChjbSwgZSkpIHsgcmV0dXJuIH1cbiAgICAgIGlmIChjbS5zb21ldGhpbmdTZWxlY3RlZCgpKSB7XG4gICAgICAgIHNldExhc3RDb3BpZWQoe2xpbmVXaXNlOiBmYWxzZSwgdGV4dDogY20uZ2V0U2VsZWN0aW9ucygpfSk7XG4gICAgICAgIGlmIChlLnR5cGUgPT0gXCJjdXRcIikgeyBjbS5yZXBsYWNlU2VsZWN0aW9uKFwiXCIsIG51bGwsIFwiY3V0XCIpOyB9XG4gICAgICB9IGVsc2UgaWYgKCFjbS5vcHRpb25zLmxpbmVXaXNlQ29weUN1dCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciByYW5nZXMgPSBjb3B5YWJsZVJhbmdlcyhjbSk7XG4gICAgICAgIHNldExhc3RDb3BpZWQoe2xpbmVXaXNlOiB0cnVlLCB0ZXh0OiByYW5nZXMudGV4dH0pO1xuICAgICAgICBpZiAoZS50eXBlID09IFwiY3V0XCIpIHtcbiAgICAgICAgICBjbS5vcGVyYXRpb24oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY20uc2V0U2VsZWN0aW9ucyhyYW5nZXMucmFuZ2VzLCAwLCBzZWxfZG9udFNjcm9sbCk7XG4gICAgICAgICAgICBjbS5yZXBsYWNlU2VsZWN0aW9uKFwiXCIsIG51bGwsIFwiY3V0XCIpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZS5jbGlwYm9hcmREYXRhKSB7XG4gICAgICAgIGUuY2xpcGJvYXJkRGF0YS5jbGVhckRhdGEoKTtcbiAgICAgICAgdmFyIGNvbnRlbnQgPSBsYXN0Q29waWVkLnRleHQuam9pbihcIlxcblwiKTtcbiAgICAgICAgLy8gaU9TIGV4cG9zZXMgdGhlIGNsaXBib2FyZCBBUEksIGJ1dCBzZWVtcyB0byBkaXNjYXJkIGNvbnRlbnQgaW5zZXJ0ZWQgaW50byBpdFxuICAgICAgICBlLmNsaXBib2FyZERhdGEuc2V0RGF0YShcIlRleHRcIiwgY29udGVudCk7XG4gICAgICAgIGlmIChlLmNsaXBib2FyZERhdGEuZ2V0RGF0YShcIlRleHRcIikgPT0gY29udGVudCkge1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gT2xkLWZhc2hpb25lZCBicmllZmx5LWZvY3VzLWEtdGV4dGFyZWEgaGFja1xuICAgICAgdmFyIGtsdWRnZSA9IGhpZGRlblRleHRhcmVhKCksIHRlID0ga2x1ZGdlLmZpcnN0Q2hpbGQ7XG4gICAgICBjbS5kaXNwbGF5LmxpbmVTcGFjZS5pbnNlcnRCZWZvcmUoa2x1ZGdlLCBjbS5kaXNwbGF5LmxpbmVTcGFjZS5maXJzdENoaWxkKTtcbiAgICAgIHRlLnZhbHVlID0gbGFzdENvcGllZC50ZXh0LmpvaW4oXCJcXG5cIik7XG4gICAgICB2YXIgaGFkRm9jdXMgPSBhY3RpdmVFbHQoKTtcbiAgICAgIHNlbGVjdElucHV0KHRlKTtcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBjbS5kaXNwbGF5LmxpbmVTcGFjZS5yZW1vdmVDaGlsZChrbHVkZ2UpO1xuICAgICAgICBoYWRGb2N1cy5mb2N1cygpO1xuICAgICAgICBpZiAoaGFkRm9jdXMgPT0gZGl2KSB7IGlucHV0LnNob3dQcmltYXJ5U2VsZWN0aW9uKCk7IH1cbiAgICAgIH0sIDUwKTtcbiAgICB9XG4gICAgb24oZGl2LCBcImNvcHlcIiwgb25Db3B5Q3V0KTtcbiAgICBvbihkaXYsIFwiY3V0XCIsIG9uQ29weUN1dCk7XG4gIH07XG5cbiAgQ29udGVudEVkaXRhYmxlSW5wdXQucHJvdG90eXBlLnNjcmVlblJlYWRlckxhYmVsQ2hhbmdlZCA9IGZ1bmN0aW9uIChsYWJlbCkge1xuICAgIC8vIExhYmVsIGZvciBzY3JlZW5yZWFkZXJzLCBhY2Nlc3NpYmlsaXR5XG4gICAgaWYobGFiZWwpIHtcbiAgICAgIHRoaXMuZGl2LnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIGxhYmVsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXYucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWxhYmVsJyk7XG4gICAgfVxuICB9O1xuXG4gIENvbnRlbnRFZGl0YWJsZUlucHV0LnByb3RvdHlwZS5wcmVwYXJlU2VsZWN0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciByZXN1bHQgPSBwcmVwYXJlU2VsZWN0aW9uKHRoaXMuY20sIGZhbHNlKTtcbiAgICByZXN1bHQuZm9jdXMgPSBhY3RpdmVFbHQoKSA9PSB0aGlzLmRpdjtcbiAgICByZXR1cm4gcmVzdWx0XG4gIH07XG5cbiAgQ29udGVudEVkaXRhYmxlSW5wdXQucHJvdG90eXBlLnNob3dTZWxlY3Rpb24gPSBmdW5jdGlvbiAoaW5mbywgdGFrZUZvY3VzKSB7XG4gICAgaWYgKCFpbmZvIHx8ICF0aGlzLmNtLmRpc3BsYXkudmlldy5sZW5ndGgpIHsgcmV0dXJuIH1cbiAgICBpZiAoaW5mby5mb2N1cyB8fCB0YWtlRm9jdXMpIHsgdGhpcy5zaG93UHJpbWFyeVNlbGVjdGlvbigpOyB9XG4gICAgdGhpcy5zaG93TXVsdGlwbGVTZWxlY3Rpb25zKGluZm8pO1xuICB9O1xuXG4gIENvbnRlbnRFZGl0YWJsZUlucHV0LnByb3RvdHlwZS5nZXRTZWxlY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuY20uZGlzcGxheS53cmFwcGVyLm93bmVyRG9jdW1lbnQuZ2V0U2VsZWN0aW9uKClcbiAgfTtcblxuICBDb250ZW50RWRpdGFibGVJbnB1dC5wcm90b3R5cGUuc2hvd1ByaW1hcnlTZWxlY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbCA9IHRoaXMuZ2V0U2VsZWN0aW9uKCksIGNtID0gdGhpcy5jbSwgcHJpbSA9IGNtLmRvYy5zZWwucHJpbWFyeSgpO1xuICAgIHZhciBmcm9tID0gcHJpbS5mcm9tKCksIHRvID0gcHJpbS50bygpO1xuXG4gICAgaWYgKGNtLmRpc3BsYXkudmlld1RvID09IGNtLmRpc3BsYXkudmlld0Zyb20gfHwgZnJvbS5saW5lID49IGNtLmRpc3BsYXkudmlld1RvIHx8IHRvLmxpbmUgPCBjbS5kaXNwbGF5LnZpZXdGcm9tKSB7XG4gICAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB2YXIgY3VyQW5jaG9yID0gZG9tVG9Qb3MoY20sIHNlbC5hbmNob3JOb2RlLCBzZWwuYW5jaG9yT2Zmc2V0KTtcbiAgICB2YXIgY3VyRm9jdXMgPSBkb21Ub1BvcyhjbSwgc2VsLmZvY3VzTm9kZSwgc2VsLmZvY3VzT2Zmc2V0KTtcbiAgICBpZiAoY3VyQW5jaG9yICYmICFjdXJBbmNob3IuYmFkICYmIGN1ckZvY3VzICYmICFjdXJGb2N1cy5iYWQgJiZcbiAgICAgICAgY21wKG1pblBvcyhjdXJBbmNob3IsIGN1ckZvY3VzKSwgZnJvbSkgPT0gMCAmJlxuICAgICAgICBjbXAobWF4UG9zKGN1ckFuY2hvciwgY3VyRm9jdXMpLCB0bykgPT0gMClcbiAgICAgIHsgcmV0dXJuIH1cblxuICAgIHZhciB2aWV3ID0gY20uZGlzcGxheS52aWV3O1xuICAgIHZhciBzdGFydCA9IChmcm9tLmxpbmUgPj0gY20uZGlzcGxheS52aWV3RnJvbSAmJiBwb3NUb0RPTShjbSwgZnJvbSkpIHx8XG4gICAgICAgIHtub2RlOiB2aWV3WzBdLm1lYXN1cmUubWFwWzJdLCBvZmZzZXQ6IDB9O1xuICAgIHZhciBlbmQgPSB0by5saW5lIDwgY20uZGlzcGxheS52aWV3VG8gJiYgcG9zVG9ET00oY20sIHRvKTtcbiAgICBpZiAoIWVuZCkge1xuICAgICAgdmFyIG1lYXN1cmUgPSB2aWV3W3ZpZXcubGVuZ3RoIC0gMV0ubWVhc3VyZTtcbiAgICAgIHZhciBtYXAgPSBtZWFzdXJlLm1hcHMgPyBtZWFzdXJlLm1hcHNbbWVhc3VyZS5tYXBzLmxlbmd0aCAtIDFdIDogbWVhc3VyZS5tYXA7XG4gICAgICBlbmQgPSB7bm9kZTogbWFwW21hcC5sZW5ndGggLSAxXSwgb2Zmc2V0OiBtYXBbbWFwLmxlbmd0aCAtIDJdIC0gbWFwW21hcC5sZW5ndGggLSAzXX07XG4gICAgfVxuXG4gICAgaWYgKCFzdGFydCB8fCAhZW5kKSB7XG4gICAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB2YXIgb2xkID0gc2VsLnJhbmdlQ291bnQgJiYgc2VsLmdldFJhbmdlQXQoMCksIHJuZztcbiAgICB0cnkgeyBybmcgPSByYW5nZShzdGFydC5ub2RlLCBzdGFydC5vZmZzZXQsIGVuZC5vZmZzZXQsIGVuZC5ub2RlKTsgfVxuICAgIGNhdGNoKGUpIHt9IC8vIE91ciBtb2RlbCBvZiB0aGUgRE9NIG1pZ2h0IGJlIG91dGRhdGVkLCBpbiB3aGljaCBjYXNlIHRoZSByYW5nZSB3ZSB0cnkgdG8gc2V0IGNhbiBiZSBpbXBvc3NpYmxlXG4gICAgaWYgKHJuZykge1xuICAgICAgaWYgKCFnZWNrbyAmJiBjbS5zdGF0ZS5mb2N1c2VkKSB7XG4gICAgICAgIHNlbC5jb2xsYXBzZShzdGFydC5ub2RlLCBzdGFydC5vZmZzZXQpO1xuICAgICAgICBpZiAoIXJuZy5jb2xsYXBzZWQpIHtcbiAgICAgICAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICAgICAgc2VsLmFkZFJhbmdlKHJuZyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbC5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgc2VsLmFkZFJhbmdlKHJuZyk7XG4gICAgICB9XG4gICAgICBpZiAob2xkICYmIHNlbC5hbmNob3JOb2RlID09IG51bGwpIHsgc2VsLmFkZFJhbmdlKG9sZCk7IH1cbiAgICAgIGVsc2UgaWYgKGdlY2tvKSB7IHRoaXMuc3RhcnRHcmFjZVBlcmlvZCgpOyB9XG4gICAgfVxuICAgIHRoaXMucmVtZW1iZXJTZWxlY3Rpb24oKTtcbiAgfTtcblxuICBDb250ZW50RWRpdGFibGVJbnB1dC5wcm90b3R5cGUuc3RhcnRHcmFjZVBlcmlvZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuZ3JhY2VQZXJpb2QpO1xuICAgIHRoaXMuZ3JhY2VQZXJpb2QgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMkMS5ncmFjZVBlcmlvZCA9IGZhbHNlO1xuICAgICAgaWYgKHRoaXMkMS5zZWxlY3Rpb25DaGFuZ2VkKCkpXG4gICAgICAgIHsgdGhpcyQxLmNtLm9wZXJhdGlvbihmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzJDEuY20uY3VyT3Auc2VsZWN0aW9uQ2hhbmdlZCA9IHRydWU7IH0pOyB9XG4gICAgfSwgMjApO1xuICB9O1xuXG4gIENvbnRlbnRFZGl0YWJsZUlucHV0LnByb3RvdHlwZS5zaG93TXVsdGlwbGVTZWxlY3Rpb25zID0gZnVuY3Rpb24gKGluZm8pIHtcbiAgICByZW1vdmVDaGlsZHJlbkFuZEFkZCh0aGlzLmNtLmRpc3BsYXkuY3Vyc29yRGl2LCBpbmZvLmN1cnNvcnMpO1xuICAgIHJlbW92ZUNoaWxkcmVuQW5kQWRkKHRoaXMuY20uZGlzcGxheS5zZWxlY3Rpb25EaXYsIGluZm8uc2VsZWN0aW9uKTtcbiAgfTtcblxuICBDb250ZW50RWRpdGFibGVJbnB1dC5wcm90b3R5cGUucmVtZW1iZXJTZWxlY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbCA9IHRoaXMuZ2V0U2VsZWN0aW9uKCk7XG4gICAgdGhpcy5sYXN0QW5jaG9yTm9kZSA9IHNlbC5hbmNob3JOb2RlOyB0aGlzLmxhc3RBbmNob3JPZmZzZXQgPSBzZWwuYW5jaG9yT2Zmc2V0O1xuICAgIHRoaXMubGFzdEZvY3VzTm9kZSA9IHNlbC5mb2N1c05vZGU7IHRoaXMubGFzdEZvY3VzT2Zmc2V0ID0gc2VsLmZvY3VzT2Zmc2V0O1xuICB9O1xuXG4gIENvbnRlbnRFZGl0YWJsZUlucHV0LnByb3RvdHlwZS5zZWxlY3Rpb25JbkVkaXRvciA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsID0gdGhpcy5nZXRTZWxlY3Rpb24oKTtcbiAgICBpZiAoIXNlbC5yYW5nZUNvdW50KSB7IHJldHVybiBmYWxzZSB9XG4gICAgdmFyIG5vZGUgPSBzZWwuZ2V0UmFuZ2VBdCgwKS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcbiAgICByZXR1cm4gY29udGFpbnModGhpcy5kaXYsIG5vZGUpXG4gIH07XG5cbiAgQ29udGVudEVkaXRhYmxlSW5wdXQucHJvdG90eXBlLmZvY3VzID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLmNtLm9wdGlvbnMucmVhZE9ubHkgIT0gXCJub2N1cnNvclwiKSB7XG4gICAgICBpZiAoIXRoaXMuc2VsZWN0aW9uSW5FZGl0b3IoKSB8fCBhY3RpdmVFbHQoKSAhPSB0aGlzLmRpdilcbiAgICAgICAgeyB0aGlzLnNob3dTZWxlY3Rpb24odGhpcy5wcmVwYXJlU2VsZWN0aW9uKCksIHRydWUpOyB9XG4gICAgICB0aGlzLmRpdi5mb2N1cygpO1xuICAgIH1cbiAgfTtcbiAgQ29udGVudEVkaXRhYmxlSW5wdXQucHJvdG90eXBlLmJsdXIgPSBmdW5jdGlvbiAoKSB7IHRoaXMuZGl2LmJsdXIoKTsgfTtcbiAgQ29udGVudEVkaXRhYmxlSW5wdXQucHJvdG90eXBlLmdldEZpZWxkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5kaXYgfTtcblxuICBDb250ZW50RWRpdGFibGVJbnB1dC5wcm90b3R5cGUuc3VwcG9ydHNUb3VjaCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWUgfTtcblxuICBDb250ZW50RWRpdGFibGVJbnB1dC5wcm90b3R5cGUucmVjZWl2ZWRGb2N1cyA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgaW5wdXQgPSB0aGlzO1xuICAgIGlmICh0aGlzLnNlbGVjdGlvbkluRWRpdG9yKCkpXG4gICAgICB7IHRoaXMucG9sbFNlbGVjdGlvbigpOyB9XG4gICAgZWxzZVxuICAgICAgeyBydW5Jbk9wKHRoaXMuY20sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGlucHV0LmNtLmN1ck9wLnNlbGVjdGlvbkNoYW5nZWQgPSB0cnVlOyB9KTsgfVxuXG4gICAgZnVuY3Rpb24gcG9sbCgpIHtcbiAgICAgIGlmIChpbnB1dC5jbS5zdGF0ZS5mb2N1c2VkKSB7XG4gICAgICAgIGlucHV0LnBvbGxTZWxlY3Rpb24oKTtcbiAgICAgICAgaW5wdXQucG9sbGluZy5zZXQoaW5wdXQuY20ub3B0aW9ucy5wb2xsSW50ZXJ2YWwsIHBvbGwpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnBvbGxpbmcuc2V0KHRoaXMuY20ub3B0aW9ucy5wb2xsSW50ZXJ2YWwsIHBvbGwpO1xuICB9O1xuXG4gIENvbnRlbnRFZGl0YWJsZUlucHV0LnByb3RvdHlwZS5zZWxlY3Rpb25DaGFuZ2VkID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWwgPSB0aGlzLmdldFNlbGVjdGlvbigpO1xuICAgIHJldHVybiBzZWwuYW5jaG9yTm9kZSAhPSB0aGlzLmxhc3RBbmNob3JOb2RlIHx8IHNlbC5hbmNob3JPZmZzZXQgIT0gdGhpcy5sYXN0QW5jaG9yT2Zmc2V0IHx8XG4gICAgICBzZWwuZm9jdXNOb2RlICE9IHRoaXMubGFzdEZvY3VzTm9kZSB8fCBzZWwuZm9jdXNPZmZzZXQgIT0gdGhpcy5sYXN0Rm9jdXNPZmZzZXRcbiAgfTtcblxuICBDb250ZW50RWRpdGFibGVJbnB1dC5wcm90b3R5cGUucG9sbFNlbGVjdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5yZWFkRE9NVGltZW91dCAhPSBudWxsIHx8IHRoaXMuZ3JhY2VQZXJpb2QgfHwgIXRoaXMuc2VsZWN0aW9uQ2hhbmdlZCgpKSB7IHJldHVybiB9XG4gICAgdmFyIHNlbCA9IHRoaXMuZ2V0U2VsZWN0aW9uKCksIGNtID0gdGhpcy5jbTtcbiAgICAvLyBPbiBBbmRyb2lkIENocm9tZSAodmVyc2lvbiA1NiwgYXQgbGVhc3QpLCBiYWNrc3BhY2luZyBpbnRvIGFuXG4gICAgLy8gdW5lZGl0YWJsZSBibG9jayBlbGVtZW50IHdpbGwgcHV0IHRoZSBjdXJzb3IgaW4gdGhhdCBlbGVtZW50LFxuICAgIC8vIGFuZCB0aGVuLCBiZWNhdXNlIGl0J3Mgbm90IGVkaXRhYmxlLCBoaWRlIHRoZSB2aXJ0dWFsIGtleWJvYXJkLlxuICAgIC8vIEJlY2F1c2UgQW5kcm9pZCBkb2Vzbid0IGFsbG93IHVzIHRvIGFjdHVhbGx5IGRldGVjdCBiYWNrc3BhY2VcbiAgICAvLyBwcmVzc2VzIGluIGEgc2FuZSB3YXksIHRoaXMgY29kZSBjaGVja3MgZm9yIHdoZW4gdGhhdCBoYXBwZW5zXG4gICAgLy8gYW5kIHNpbXVsYXRlcyBhIGJhY2tzcGFjZSBwcmVzcyBpbiB0aGlzIGNhc2UuXG4gICAgaWYgKGFuZHJvaWQgJiYgY2hyb21lICYmIHRoaXMuY20uZGlzcGxheS5ndXR0ZXJTcGVjcy5sZW5ndGggJiYgaXNJbkd1dHRlcihzZWwuYW5jaG9yTm9kZSkpIHtcbiAgICAgIHRoaXMuY20udHJpZ2dlck9uS2V5RG93bih7dHlwZTogXCJrZXlkb3duXCIsIGtleUNvZGU6IDgsIHByZXZlbnREZWZhdWx0OiBNYXRoLmFic30pO1xuICAgICAgdGhpcy5ibHVyKCk7XG4gICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKHRoaXMuY29tcG9zaW5nKSB7IHJldHVybiB9XG4gICAgdGhpcy5yZW1lbWJlclNlbGVjdGlvbigpO1xuICAgIHZhciBhbmNob3IgPSBkb21Ub1BvcyhjbSwgc2VsLmFuY2hvck5vZGUsIHNlbC5hbmNob3JPZmZzZXQpO1xuICAgIHZhciBoZWFkID0gZG9tVG9Qb3MoY20sIHNlbC5mb2N1c05vZGUsIHNlbC5mb2N1c09mZnNldCk7XG4gICAgaWYgKGFuY2hvciAmJiBoZWFkKSB7IHJ1bkluT3AoY20sIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNldFNlbGVjdGlvbihjbS5kb2MsIHNpbXBsZVNlbGVjdGlvbihhbmNob3IsIGhlYWQpLCBzZWxfZG9udFNjcm9sbCk7XG4gICAgICBpZiAoYW5jaG9yLmJhZCB8fCBoZWFkLmJhZCkgeyBjbS5jdXJPcC5zZWxlY3Rpb25DaGFuZ2VkID0gdHJ1ZTsgfVxuICAgIH0pOyB9XG4gIH07XG5cbiAgQ29udGVudEVkaXRhYmxlSW5wdXQucHJvdG90eXBlLnBvbGxDb250ZW50ID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLnJlYWRET01UaW1lb3V0ICE9IG51bGwpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlYWRET01UaW1lb3V0KTtcbiAgICAgIHRoaXMucmVhZERPTVRpbWVvdXQgPSBudWxsO1xuICAgIH1cblxuICAgIHZhciBjbSA9IHRoaXMuY20sIGRpc3BsYXkgPSBjbS5kaXNwbGF5LCBzZWwgPSBjbS5kb2Muc2VsLnByaW1hcnkoKTtcbiAgICB2YXIgZnJvbSA9IHNlbC5mcm9tKCksIHRvID0gc2VsLnRvKCk7XG4gICAgaWYgKGZyb20uY2ggPT0gMCAmJiBmcm9tLmxpbmUgPiBjbS5maXJzdExpbmUoKSlcbiAgICAgIHsgZnJvbSA9IFBvcyhmcm9tLmxpbmUgLSAxLCBnZXRMaW5lKGNtLmRvYywgZnJvbS5saW5lIC0gMSkubGVuZ3RoKTsgfVxuICAgIGlmICh0by5jaCA9PSBnZXRMaW5lKGNtLmRvYywgdG8ubGluZSkudGV4dC5sZW5ndGggJiYgdG8ubGluZSA8IGNtLmxhc3RMaW5lKCkpXG4gICAgICB7IHRvID0gUG9zKHRvLmxpbmUgKyAxLCAwKTsgfVxuICAgIGlmIChmcm9tLmxpbmUgPCBkaXNwbGF5LnZpZXdGcm9tIHx8IHRvLmxpbmUgPiBkaXNwbGF5LnZpZXdUbyAtIDEpIHsgcmV0dXJuIGZhbHNlIH1cblxuICAgIHZhciBmcm9tSW5kZXgsIGZyb21MaW5lLCBmcm9tTm9kZTtcbiAgICBpZiAoZnJvbS5saW5lID09IGRpc3BsYXkudmlld0Zyb20gfHwgKGZyb21JbmRleCA9IGZpbmRWaWV3SW5kZXgoY20sIGZyb20ubGluZSkpID09IDApIHtcbiAgICAgIGZyb21MaW5lID0gbGluZU5vKGRpc3BsYXkudmlld1swXS5saW5lKTtcbiAgICAgIGZyb21Ob2RlID0gZGlzcGxheS52aWV3WzBdLm5vZGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZyb21MaW5lID0gbGluZU5vKGRpc3BsYXkudmlld1tmcm9tSW5kZXhdLmxpbmUpO1xuICAgICAgZnJvbU5vZGUgPSBkaXNwbGF5LnZpZXdbZnJvbUluZGV4IC0gMV0ubm9kZS5uZXh0U2libGluZztcbiAgICB9XG4gICAgdmFyIHRvSW5kZXggPSBmaW5kVmlld0luZGV4KGNtLCB0by5saW5lKTtcbiAgICB2YXIgdG9MaW5lLCB0b05vZGU7XG4gICAgaWYgKHRvSW5kZXggPT0gZGlzcGxheS52aWV3Lmxlbmd0aCAtIDEpIHtcbiAgICAgIHRvTGluZSA9IGRpc3BsYXkudmlld1RvIC0gMTtcbiAgICAgIHRvTm9kZSA9IGRpc3BsYXkubGluZURpdi5sYXN0Q2hpbGQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRvTGluZSA9IGxpbmVObyhkaXNwbGF5LnZpZXdbdG9JbmRleCArIDFdLmxpbmUpIC0gMTtcbiAgICAgIHRvTm9kZSA9IGRpc3BsYXkudmlld1t0b0luZGV4ICsgMV0ubm9kZS5wcmV2aW91c1NpYmxpbmc7XG4gICAgfVxuXG4gICAgaWYgKCFmcm9tTm9kZSkgeyByZXR1cm4gZmFsc2UgfVxuICAgIHZhciBuZXdUZXh0ID0gY20uZG9jLnNwbGl0TGluZXMoZG9tVGV4dEJldHdlZW4oY20sIGZyb21Ob2RlLCB0b05vZGUsIGZyb21MaW5lLCB0b0xpbmUpKTtcbiAgICB2YXIgb2xkVGV4dCA9IGdldEJldHdlZW4oY20uZG9jLCBQb3MoZnJvbUxpbmUsIDApLCBQb3ModG9MaW5lLCBnZXRMaW5lKGNtLmRvYywgdG9MaW5lKS50ZXh0Lmxlbmd0aCkpO1xuICAgIHdoaWxlIChuZXdUZXh0Lmxlbmd0aCA+IDEgJiYgb2xkVGV4dC5sZW5ndGggPiAxKSB7XG4gICAgICBpZiAobHN0KG5ld1RleHQpID09IGxzdChvbGRUZXh0KSkgeyBuZXdUZXh0LnBvcCgpOyBvbGRUZXh0LnBvcCgpOyB0b0xpbmUtLTsgfVxuICAgICAgZWxzZSBpZiAobmV3VGV4dFswXSA9PSBvbGRUZXh0WzBdKSB7IG5ld1RleHQuc2hpZnQoKTsgb2xkVGV4dC5zaGlmdCgpOyBmcm9tTGluZSsrOyB9XG4gICAgICBlbHNlIHsgYnJlYWsgfVxuICAgIH1cblxuICAgIHZhciBjdXRGcm9udCA9IDAsIGN1dEVuZCA9IDA7XG4gICAgdmFyIG5ld1RvcCA9IG5ld1RleHRbMF0sIG9sZFRvcCA9IG9sZFRleHRbMF0sIG1heEN1dEZyb250ID0gTWF0aC5taW4obmV3VG9wLmxlbmd0aCwgb2xkVG9wLmxlbmd0aCk7XG4gICAgd2hpbGUgKGN1dEZyb250IDwgbWF4Q3V0RnJvbnQgJiYgbmV3VG9wLmNoYXJDb2RlQXQoY3V0RnJvbnQpID09IG9sZFRvcC5jaGFyQ29kZUF0KGN1dEZyb250KSlcbiAgICAgIHsgKytjdXRGcm9udDsgfVxuICAgIHZhciBuZXdCb3QgPSBsc3QobmV3VGV4dCksIG9sZEJvdCA9IGxzdChvbGRUZXh0KTtcbiAgICB2YXIgbWF4Q3V0RW5kID0gTWF0aC5taW4obmV3Qm90Lmxlbmd0aCAtIChuZXdUZXh0Lmxlbmd0aCA9PSAxID8gY3V0RnJvbnQgOiAwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkQm90Lmxlbmd0aCAtIChvbGRUZXh0Lmxlbmd0aCA9PSAxID8gY3V0RnJvbnQgOiAwKSk7XG4gICAgd2hpbGUgKGN1dEVuZCA8IG1heEN1dEVuZCAmJlxuICAgICAgICAgICBuZXdCb3QuY2hhckNvZGVBdChuZXdCb3QubGVuZ3RoIC0gY3V0RW5kIC0gMSkgPT0gb2xkQm90LmNoYXJDb2RlQXQob2xkQm90Lmxlbmd0aCAtIGN1dEVuZCAtIDEpKVxuICAgICAgeyArK2N1dEVuZDsgfVxuICAgIC8vIFRyeSB0byBtb3ZlIHN0YXJ0IG9mIGNoYW5nZSB0byBzdGFydCBvZiBzZWxlY3Rpb24gaWYgYW1iaWd1b3VzXG4gICAgaWYgKG5ld1RleHQubGVuZ3RoID09IDEgJiYgb2xkVGV4dC5sZW5ndGggPT0gMSAmJiBmcm9tTGluZSA9PSBmcm9tLmxpbmUpIHtcbiAgICAgIHdoaWxlIChjdXRGcm9udCAmJiBjdXRGcm9udCA+IGZyb20uY2ggJiZcbiAgICAgICAgICAgICBuZXdCb3QuY2hhckNvZGVBdChuZXdCb3QubGVuZ3RoIC0gY3V0RW5kIC0gMSkgPT0gb2xkQm90LmNoYXJDb2RlQXQob2xkQm90Lmxlbmd0aCAtIGN1dEVuZCAtIDEpKSB7XG4gICAgICAgIGN1dEZyb250LS07XG4gICAgICAgIGN1dEVuZCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIG5ld1RleHRbbmV3VGV4dC5sZW5ndGggLSAxXSA9IG5ld0JvdC5zbGljZSgwLCBuZXdCb3QubGVuZ3RoIC0gY3V0RW5kKS5yZXBsYWNlKC9eXFx1MjAwYisvLCBcIlwiKTtcbiAgICBuZXdUZXh0WzBdID0gbmV3VGV4dFswXS5zbGljZShjdXRGcm9udCkucmVwbGFjZSgvXFx1MjAwYiskLywgXCJcIik7XG5cbiAgICB2YXIgY2hGcm9tID0gUG9zKGZyb21MaW5lLCBjdXRGcm9udCk7XG4gICAgdmFyIGNoVG8gPSBQb3ModG9MaW5lLCBvbGRUZXh0Lmxlbmd0aCA/IGxzdChvbGRUZXh0KS5sZW5ndGggLSBjdXRFbmQgOiAwKTtcbiAgICBpZiAobmV3VGV4dC5sZW5ndGggPiAxIHx8IG5ld1RleHRbMF0gfHwgY21wKGNoRnJvbSwgY2hUbykpIHtcbiAgICAgIHJlcGxhY2VSYW5nZShjbS5kb2MsIG5ld1RleHQsIGNoRnJvbSwgY2hUbywgXCIraW5wdXRcIik7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfTtcblxuICBDb250ZW50RWRpdGFibGVJbnB1dC5wcm90b3R5cGUuZW5zdXJlUG9sbGVkID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZm9yY2VDb21wb3NpdGlvbkVuZCgpO1xuICB9O1xuICBDb250ZW50RWRpdGFibGVJbnB1dC5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5mb3JjZUNvbXBvc2l0aW9uRW5kKCk7XG4gIH07XG4gIENvbnRlbnRFZGl0YWJsZUlucHV0LnByb3RvdHlwZS5mb3JjZUNvbXBvc2l0aW9uRW5kID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5jb21wb3NpbmcpIHsgcmV0dXJuIH1cbiAgICBjbGVhclRpbWVvdXQodGhpcy5yZWFkRE9NVGltZW91dCk7XG4gICAgdGhpcy5jb21wb3NpbmcgPSBudWxsO1xuICAgIHRoaXMudXBkYXRlRnJvbURPTSgpO1xuICAgIHRoaXMuZGl2LmJsdXIoKTtcbiAgICB0aGlzLmRpdi5mb2N1cygpO1xuICB9O1xuICBDb250ZW50RWRpdGFibGVJbnB1dC5wcm90b3R5cGUucmVhZEZyb21ET01Tb29uID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICBpZiAodGhpcy5yZWFkRE9NVGltZW91dCAhPSBudWxsKSB7IHJldHVybiB9XG4gICAgdGhpcy5yZWFkRE9NVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcyQxLnJlYWRET01UaW1lb3V0ID0gbnVsbDtcbiAgICAgIGlmICh0aGlzJDEuY29tcG9zaW5nKSB7XG4gICAgICAgIGlmICh0aGlzJDEuY29tcG9zaW5nLmRvbmUpIHsgdGhpcyQxLmNvbXBvc2luZyA9IG51bGw7IH1cbiAgICAgICAgZWxzZSB7IHJldHVybiB9XG4gICAgICB9XG4gICAgICB0aGlzJDEudXBkYXRlRnJvbURPTSgpO1xuICAgIH0sIDgwKTtcbiAgfTtcblxuICBDb250ZW50RWRpdGFibGVJbnB1dC5wcm90b3R5cGUudXBkYXRlRnJvbURPTSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgaWYgKHRoaXMuY20uaXNSZWFkT25seSgpIHx8ICF0aGlzLnBvbGxDb250ZW50KCkpXG4gICAgICB7IHJ1bkluT3AodGhpcy5jbSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gcmVnQ2hhbmdlKHRoaXMkMS5jbSk7IH0pOyB9XG4gIH07XG5cbiAgQ29udGVudEVkaXRhYmxlSW5wdXQucHJvdG90eXBlLnNldFVuZWRpdGFibGUgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgIG5vZGUuY29udGVudEVkaXRhYmxlID0gXCJmYWxzZVwiO1xuICB9O1xuXG4gIENvbnRlbnRFZGl0YWJsZUlucHV0LnByb3RvdHlwZS5vbktleVByZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICBpZiAoZS5jaGFyQ29kZSA9PSAwIHx8IHRoaXMuY29tcG9zaW5nKSB7IHJldHVybiB9XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmICghdGhpcy5jbS5pc1JlYWRPbmx5KCkpXG4gICAgICB7IG9wZXJhdGlvbih0aGlzLmNtLCBhcHBseVRleHRJbnB1dCkodGhpcy5jbSwgU3RyaW5nLmZyb21DaGFyQ29kZShlLmNoYXJDb2RlID09IG51bGwgPyBlLmtleUNvZGUgOiBlLmNoYXJDb2RlKSwgMCk7IH1cbiAgfTtcblxuICBDb250ZW50RWRpdGFibGVJbnB1dC5wcm90b3R5cGUucmVhZE9ubHlDaGFuZ2VkID0gZnVuY3Rpb24gKHZhbCkge1xuICAgIHRoaXMuZGl2LmNvbnRlbnRFZGl0YWJsZSA9IFN0cmluZyh2YWwgIT0gXCJub2N1cnNvclwiKTtcbiAgfTtcblxuICBDb250ZW50RWRpdGFibGVJbnB1dC5wcm90b3R5cGUub25Db250ZXh0TWVudSA9IGZ1bmN0aW9uICgpIHt9O1xuICBDb250ZW50RWRpdGFibGVJbnB1dC5wcm90b3R5cGUucmVzZXRQb3NpdGlvbiA9IGZ1bmN0aW9uICgpIHt9O1xuXG4gIENvbnRlbnRFZGl0YWJsZUlucHV0LnByb3RvdHlwZS5uZWVkc0NvbnRlbnRBdHRyaWJ1dGUgPSB0cnVlO1xuXG4gIGZ1bmN0aW9uIHBvc1RvRE9NKGNtLCBwb3MpIHtcbiAgICB2YXIgdmlldyA9IGZpbmRWaWV3Rm9yTGluZShjbSwgcG9zLmxpbmUpO1xuICAgIGlmICghdmlldyB8fCB2aWV3LmhpZGRlbikgeyByZXR1cm4gbnVsbCB9XG4gICAgdmFyIGxpbmUgPSBnZXRMaW5lKGNtLmRvYywgcG9zLmxpbmUpO1xuICAgIHZhciBpbmZvID0gbWFwRnJvbUxpbmVWaWV3KHZpZXcsIGxpbmUsIHBvcy5saW5lKTtcblxuICAgIHZhciBvcmRlciA9IGdldE9yZGVyKGxpbmUsIGNtLmRvYy5kaXJlY3Rpb24pLCBzaWRlID0gXCJsZWZ0XCI7XG4gICAgaWYgKG9yZGVyKSB7XG4gICAgICB2YXIgcGFydFBvcyA9IGdldEJpZGlQYXJ0QXQob3JkZXIsIHBvcy5jaCk7XG4gICAgICBzaWRlID0gcGFydFBvcyAlIDIgPyBcInJpZ2h0XCIgOiBcImxlZnRcIjtcbiAgICB9XG4gICAgdmFyIHJlc3VsdCA9IG5vZGVBbmRPZmZzZXRJbkxpbmVNYXAoaW5mby5tYXAsIHBvcy5jaCwgc2lkZSk7XG4gICAgcmVzdWx0Lm9mZnNldCA9IHJlc3VsdC5jb2xsYXBzZSA9PSBcInJpZ2h0XCIgPyByZXN1bHQuZW5kIDogcmVzdWx0LnN0YXJ0O1xuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzSW5HdXR0ZXIobm9kZSkge1xuICAgIGZvciAodmFyIHNjYW4gPSBub2RlOyBzY2FuOyBzY2FuID0gc2Nhbi5wYXJlbnROb2RlKVxuICAgICAgeyBpZiAoL0NvZGVNaXJyb3ItZ3V0dGVyLXdyYXBwZXIvLnRlc3Qoc2Nhbi5jbGFzc05hbWUpKSB7IHJldHVybiB0cnVlIH0gfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgZnVuY3Rpb24gYmFkUG9zKHBvcywgYmFkKSB7IGlmIChiYWQpIHsgcG9zLmJhZCA9IHRydWU7IH0gcmV0dXJuIHBvcyB9XG5cbiAgZnVuY3Rpb24gZG9tVGV4dEJldHdlZW4oY20sIGZyb20sIHRvLCBmcm9tTGluZSwgdG9MaW5lKSB7XG4gICAgdmFyIHRleHQgPSBcIlwiLCBjbG9zaW5nID0gZmFsc2UsIGxpbmVTZXAgPSBjbS5kb2MubGluZVNlcGFyYXRvcigpLCBleHRyYUxpbmVicmVhayA9IGZhbHNlO1xuICAgIGZ1bmN0aW9uIHJlY29nbml6ZU1hcmtlcihpZCkgeyByZXR1cm4gZnVuY3Rpb24gKG1hcmtlcikgeyByZXR1cm4gbWFya2VyLmlkID09IGlkOyB9IH1cbiAgICBmdW5jdGlvbiBjbG9zZSgpIHtcbiAgICAgIGlmIChjbG9zaW5nKSB7XG4gICAgICAgIHRleHQgKz0gbGluZVNlcDtcbiAgICAgICAgaWYgKGV4dHJhTGluZWJyZWFrKSB7IHRleHQgKz0gbGluZVNlcDsgfVxuICAgICAgICBjbG9zaW5nID0gZXh0cmFMaW5lYnJlYWsgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gYWRkVGV4dChzdHIpIHtcbiAgICAgIGlmIChzdHIpIHtcbiAgICAgICAgY2xvc2UoKTtcbiAgICAgICAgdGV4dCArPSBzdHI7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHdhbGsobm9kZSkge1xuICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSkge1xuICAgICAgICB2YXIgY21UZXh0ID0gbm9kZS5nZXRBdHRyaWJ1dGUoXCJjbS10ZXh0XCIpO1xuICAgICAgICBpZiAoY21UZXh0KSB7XG4gICAgICAgICAgYWRkVGV4dChjbVRleHQpO1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIHZhciBtYXJrZXJJRCA9IG5vZGUuZ2V0QXR0cmlidXRlKFwiY20tbWFya2VyXCIpLCByYW5nZTtcbiAgICAgICAgaWYgKG1hcmtlcklEKSB7XG4gICAgICAgICAgdmFyIGZvdW5kID0gY20uZmluZE1hcmtzKFBvcyhmcm9tTGluZSwgMCksIFBvcyh0b0xpbmUgKyAxLCAwKSwgcmVjb2duaXplTWFya2VyKCttYXJrZXJJRCkpO1xuICAgICAgICAgIGlmIChmb3VuZC5sZW5ndGggJiYgKHJhbmdlID0gZm91bmRbMF0uZmluZCgwKSkpXG4gICAgICAgICAgICB7IGFkZFRleHQoZ2V0QmV0d2VlbihjbS5kb2MsIHJhbmdlLmZyb20sIHJhbmdlLnRvKS5qb2luKGxpbmVTZXApKTsgfVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmdldEF0dHJpYnV0ZShcImNvbnRlbnRlZGl0YWJsZVwiKSA9PSBcImZhbHNlXCIpIHsgcmV0dXJuIH1cbiAgICAgICAgdmFyIGlzQmxvY2sgPSAvXihwcmV8ZGl2fHB8bGl8dGFibGV8YnIpJC9pLnRlc3Qobm9kZS5ub2RlTmFtZSk7XG4gICAgICAgIGlmICghL15iciQvaS50ZXN0KG5vZGUubm9kZU5hbWUpICYmIG5vZGUudGV4dENvbnRlbnQubGVuZ3RoID09IDApIHsgcmV0dXJuIH1cblxuICAgICAgICBpZiAoaXNCbG9jaykgeyBjbG9zZSgpOyB9XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgIHsgd2Fsayhub2RlLmNoaWxkTm9kZXNbaV0pOyB9XG5cbiAgICAgICAgaWYgKC9eKHByZXxwKSQvaS50ZXN0KG5vZGUubm9kZU5hbWUpKSB7IGV4dHJhTGluZWJyZWFrID0gdHJ1ZTsgfVxuICAgICAgICBpZiAoaXNCbG9jaykgeyBjbG9zaW5nID0gdHJ1ZTsgfVxuICAgICAgfSBlbHNlIGlmIChub2RlLm5vZGVUeXBlID09IDMpIHtcbiAgICAgICAgYWRkVGV4dChub2RlLm5vZGVWYWx1ZS5yZXBsYWNlKC9cXHUyMDBiL2csIFwiXCIpLnJlcGxhY2UoL1xcdTAwYTAvZywgXCIgXCIpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yICg7Oykge1xuICAgICAgd2Fsayhmcm9tKTtcbiAgICAgIGlmIChmcm9tID09IHRvKSB7IGJyZWFrIH1cbiAgICAgIGZyb20gPSBmcm9tLm5leHRTaWJsaW5nO1xuICAgICAgZXh0cmFMaW5lYnJlYWsgPSBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRleHRcbiAgfVxuXG4gIGZ1bmN0aW9uIGRvbVRvUG9zKGNtLCBub2RlLCBvZmZzZXQpIHtcbiAgICB2YXIgbGluZU5vZGU7XG4gICAgaWYgKG5vZGUgPT0gY20uZGlzcGxheS5saW5lRGl2KSB7XG4gICAgICBsaW5lTm9kZSA9IGNtLmRpc3BsYXkubGluZURpdi5jaGlsZE5vZGVzW29mZnNldF07XG4gICAgICBpZiAoIWxpbmVOb2RlKSB7IHJldHVybiBiYWRQb3MoY20uY2xpcFBvcyhQb3MoY20uZGlzcGxheS52aWV3VG8gLSAxKSksIHRydWUpIH1cbiAgICAgIG5vZGUgPSBudWxsOyBvZmZzZXQgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxpbmVOb2RlID0gbm9kZTs7IGxpbmVOb2RlID0gbGluZU5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgICBpZiAoIWxpbmVOb2RlIHx8IGxpbmVOb2RlID09IGNtLmRpc3BsYXkubGluZURpdikgeyByZXR1cm4gbnVsbCB9XG4gICAgICAgIGlmIChsaW5lTm9kZS5wYXJlbnROb2RlICYmIGxpbmVOb2RlLnBhcmVudE5vZGUgPT0gY20uZGlzcGxheS5saW5lRGl2KSB7IGJyZWFrIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbS5kaXNwbGF5LnZpZXcubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBsaW5lVmlldyA9IGNtLmRpc3BsYXkudmlld1tpXTtcbiAgICAgIGlmIChsaW5lVmlldy5ub2RlID09IGxpbmVOb2RlKVxuICAgICAgICB7IHJldHVybiBsb2NhdGVOb2RlSW5MaW5lVmlldyhsaW5lVmlldywgbm9kZSwgb2Zmc2V0KSB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbG9jYXRlTm9kZUluTGluZVZpZXcobGluZVZpZXcsIG5vZGUsIG9mZnNldCkge1xuICAgIHZhciB3cmFwcGVyID0gbGluZVZpZXcudGV4dC5maXJzdENoaWxkLCBiYWQgPSBmYWxzZTtcbiAgICBpZiAoIW5vZGUgfHwgIWNvbnRhaW5zKHdyYXBwZXIsIG5vZGUpKSB7IHJldHVybiBiYWRQb3MoUG9zKGxpbmVObyhsaW5lVmlldy5saW5lKSwgMCksIHRydWUpIH1cbiAgICBpZiAobm9kZSA9PSB3cmFwcGVyKSB7XG4gICAgICBiYWQgPSB0cnVlO1xuICAgICAgbm9kZSA9IHdyYXBwZXIuY2hpbGROb2Rlc1tvZmZzZXRdO1xuICAgICAgb2Zmc2V0ID0gMDtcbiAgICAgIGlmICghbm9kZSkge1xuICAgICAgICB2YXIgbGluZSA9IGxpbmVWaWV3LnJlc3QgPyBsc3QobGluZVZpZXcucmVzdCkgOiBsaW5lVmlldy5saW5lO1xuICAgICAgICByZXR1cm4gYmFkUG9zKFBvcyhsaW5lTm8obGluZSksIGxpbmUudGV4dC5sZW5ndGgpLCBiYWQpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHRleHROb2RlID0gbm9kZS5ub2RlVHlwZSA9PSAzID8gbm9kZSA6IG51bGwsIHRvcE5vZGUgPSBub2RlO1xuICAgIGlmICghdGV4dE5vZGUgJiYgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aCA9PSAxICYmIG5vZGUuZmlyc3RDaGlsZC5ub2RlVHlwZSA9PSAzKSB7XG4gICAgICB0ZXh0Tm9kZSA9IG5vZGUuZmlyc3RDaGlsZDtcbiAgICAgIGlmIChvZmZzZXQpIHsgb2Zmc2V0ID0gdGV4dE5vZGUubm9kZVZhbHVlLmxlbmd0aDsgfVxuICAgIH1cbiAgICB3aGlsZSAodG9wTm9kZS5wYXJlbnROb2RlICE9IHdyYXBwZXIpIHsgdG9wTm9kZSA9IHRvcE5vZGUucGFyZW50Tm9kZTsgfVxuICAgIHZhciBtZWFzdXJlID0gbGluZVZpZXcubWVhc3VyZSwgbWFwcyA9IG1lYXN1cmUubWFwcztcblxuICAgIGZ1bmN0aW9uIGZpbmQodGV4dE5vZGUsIHRvcE5vZGUsIG9mZnNldCkge1xuICAgICAgZm9yICh2YXIgaSA9IC0xOyBpIDwgKG1hcHMgPyBtYXBzLmxlbmd0aCA6IDApOyBpKyspIHtcbiAgICAgICAgdmFyIG1hcCA9IGkgPCAwID8gbWVhc3VyZS5tYXAgOiBtYXBzW2ldO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG1hcC5sZW5ndGg7IGogKz0gMykge1xuICAgICAgICAgIHZhciBjdXJOb2RlID0gbWFwW2ogKyAyXTtcbiAgICAgICAgICBpZiAoY3VyTm9kZSA9PSB0ZXh0Tm9kZSB8fCBjdXJOb2RlID09IHRvcE5vZGUpIHtcbiAgICAgICAgICAgIHZhciBsaW5lID0gbGluZU5vKGkgPCAwID8gbGluZVZpZXcubGluZSA6IGxpbmVWaWV3LnJlc3RbaV0pO1xuICAgICAgICAgICAgdmFyIGNoID0gbWFwW2pdICsgb2Zmc2V0O1xuICAgICAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgY3VyTm9kZSAhPSB0ZXh0Tm9kZSkgeyBjaCA9IG1hcFtqICsgKG9mZnNldCA/IDEgOiAwKV07IH1cbiAgICAgICAgICAgIHJldHVybiBQb3MobGluZSwgY2gpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBmb3VuZCA9IGZpbmQodGV4dE5vZGUsIHRvcE5vZGUsIG9mZnNldCk7XG4gICAgaWYgKGZvdW5kKSB7IHJldHVybiBiYWRQb3MoZm91bmQsIGJhZCkgfVxuXG4gICAgLy8gRklYTUUgdGhpcyBpcyBhbGwgcmVhbGx5IHNoYWt5LiBtaWdodCBoYW5kbGUgdGhlIGZldyBjYXNlcyBpdCBuZWVkcyB0byBoYW5kbGUsIGJ1dCBsaWtlbHkgdG8gY2F1c2UgcHJvYmxlbXNcbiAgICBmb3IgKHZhciBhZnRlciA9IHRvcE5vZGUubmV4dFNpYmxpbmcsIGRpc3QgPSB0ZXh0Tm9kZSA/IHRleHROb2RlLm5vZGVWYWx1ZS5sZW5ndGggLSBvZmZzZXQgOiAwOyBhZnRlcjsgYWZ0ZXIgPSBhZnRlci5uZXh0U2libGluZykge1xuICAgICAgZm91bmQgPSBmaW5kKGFmdGVyLCBhZnRlci5maXJzdENoaWxkLCAwKTtcbiAgICAgIGlmIChmb3VuZClcbiAgICAgICAgeyByZXR1cm4gYmFkUG9zKFBvcyhmb3VuZC5saW5lLCBmb3VuZC5jaCAtIGRpc3QpLCBiYWQpIH1cbiAgICAgIGVsc2VcbiAgICAgICAgeyBkaXN0ICs9IGFmdGVyLnRleHRDb250ZW50Lmxlbmd0aDsgfVxuICAgIH1cbiAgICBmb3IgKHZhciBiZWZvcmUgPSB0b3BOb2RlLnByZXZpb3VzU2libGluZywgZGlzdCQxID0gb2Zmc2V0OyBiZWZvcmU7IGJlZm9yZSA9IGJlZm9yZS5wcmV2aW91c1NpYmxpbmcpIHtcbiAgICAgIGZvdW5kID0gZmluZChiZWZvcmUsIGJlZm9yZS5maXJzdENoaWxkLCAtMSk7XG4gICAgICBpZiAoZm91bmQpXG4gICAgICAgIHsgcmV0dXJuIGJhZFBvcyhQb3MoZm91bmQubGluZSwgZm91bmQuY2ggKyBkaXN0JDEpLCBiYWQpIH1cbiAgICAgIGVsc2VcbiAgICAgICAgeyBkaXN0JDEgKz0gYmVmb3JlLnRleHRDb250ZW50Lmxlbmd0aDsgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFRFWFRBUkVBIElOUFVUIFNUWUxFXG5cbiAgdmFyIFRleHRhcmVhSW5wdXQgPSBmdW5jdGlvbihjbSkge1xuICAgIHRoaXMuY20gPSBjbTtcbiAgICAvLyBTZWUgaW5wdXQucG9sbCBhbmQgaW5wdXQucmVzZXRcbiAgICB0aGlzLnByZXZJbnB1dCA9IFwiXCI7XG5cbiAgICAvLyBGbGFnIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgd2UgZXhwZWN0IGlucHV0IHRvIGFwcGVhciByZWFsIHNvb25cbiAgICAvLyBub3cgKGFmdGVyIHNvbWUgZXZlbnQgbGlrZSAna2V5cHJlc3MnIG9yICdpbnB1dCcpIGFuZCBhcmVcbiAgICAvLyBwb2xsaW5nIGludGVuc2l2ZWx5LlxuICAgIHRoaXMucG9sbGluZ0Zhc3QgPSBmYWxzZTtcbiAgICAvLyBTZWxmLXJlc2V0dGluZyB0aW1lb3V0IGZvciB0aGUgcG9sbGVyXG4gICAgdGhpcy5wb2xsaW5nID0gbmV3IERlbGF5ZWQoKTtcbiAgICAvLyBVc2VkIHRvIHdvcmsgYXJvdW5kIElFIGlzc3VlIHdpdGggc2VsZWN0aW9uIGJlaW5nIGZvcmdvdHRlbiB3aGVuIGZvY3VzIG1vdmVzIGF3YXkgZnJvbSB0ZXh0YXJlYVxuICAgIHRoaXMuaGFzU2VsZWN0aW9uID0gZmFsc2U7XG4gICAgdGhpcy5jb21wb3NpbmcgPSBudWxsO1xuICB9O1xuXG4gIFRleHRhcmVhSW5wdXQucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbiAoZGlzcGxheSkge1xuICAgICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICB2YXIgaW5wdXQgPSB0aGlzLCBjbSA9IHRoaXMuY207XG4gICAgdGhpcy5jcmVhdGVGaWVsZChkaXNwbGF5KTtcbiAgICB2YXIgdGUgPSB0aGlzLnRleHRhcmVhO1xuXG4gICAgZGlzcGxheS53cmFwcGVyLmluc2VydEJlZm9yZSh0aGlzLndyYXBwZXIsIGRpc3BsYXkud3JhcHBlci5maXJzdENoaWxkKTtcblxuICAgIC8vIE5lZWRlZCB0byBoaWRlIGJpZyBibHVlIGJsaW5raW5nIGN1cnNvciBvbiBNb2JpbGUgU2FmYXJpIChkb2Vzbid0IHNlZW0gdG8gd29yayBpbiBpT1MgOCBhbnltb3JlKVxuICAgIGlmIChpb3MpIHsgdGUuc3R5bGUud2lkdGggPSBcIjBweFwiOyB9XG5cbiAgICBvbih0ZSwgXCJpbnB1dFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA+PSA5ICYmIHRoaXMkMS5oYXNTZWxlY3Rpb24pIHsgdGhpcyQxLmhhc1NlbGVjdGlvbiA9IG51bGw7IH1cbiAgICAgIGlucHV0LnBvbGwoKTtcbiAgICB9KTtcblxuICAgIG9uKHRlLCBcInBhc3RlXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoc2lnbmFsRE9NRXZlbnQoY20sIGUpIHx8IGhhbmRsZVBhc3RlKGUsIGNtKSkgeyByZXR1cm4gfVxuXG4gICAgICBjbS5zdGF0ZS5wYXN0ZUluY29taW5nID0gK25ldyBEYXRlO1xuICAgICAgaW5wdXQuZmFzdFBvbGwoKTtcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIHByZXBhcmVDb3B5Q3V0KGUpIHtcbiAgICAgIGlmIChzaWduYWxET01FdmVudChjbSwgZSkpIHsgcmV0dXJuIH1cbiAgICAgIGlmIChjbS5zb21ldGhpbmdTZWxlY3RlZCgpKSB7XG4gICAgICAgIHNldExhc3RDb3BpZWQoe2xpbmVXaXNlOiBmYWxzZSwgdGV4dDogY20uZ2V0U2VsZWN0aW9ucygpfSk7XG4gICAgICB9IGVsc2UgaWYgKCFjbS5vcHRpb25zLmxpbmVXaXNlQ29weUN1dCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciByYW5nZXMgPSBjb3B5YWJsZVJhbmdlcyhjbSk7XG4gICAgICAgIHNldExhc3RDb3BpZWQoe2xpbmVXaXNlOiB0cnVlLCB0ZXh0OiByYW5nZXMudGV4dH0pO1xuICAgICAgICBpZiAoZS50eXBlID09IFwiY3V0XCIpIHtcbiAgICAgICAgICBjbS5zZXRTZWxlY3Rpb25zKHJhbmdlcy5yYW5nZXMsIG51bGwsIHNlbF9kb250U2Nyb2xsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpbnB1dC5wcmV2SW5wdXQgPSBcIlwiO1xuICAgICAgICAgIHRlLnZhbHVlID0gcmFuZ2VzLnRleHQuam9pbihcIlxcblwiKTtcbiAgICAgICAgICBzZWxlY3RJbnB1dCh0ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChlLnR5cGUgPT0gXCJjdXRcIikgeyBjbS5zdGF0ZS5jdXRJbmNvbWluZyA9ICtuZXcgRGF0ZTsgfVxuICAgIH1cbiAgICBvbih0ZSwgXCJjdXRcIiwgcHJlcGFyZUNvcHlDdXQpO1xuICAgIG9uKHRlLCBcImNvcHlcIiwgcHJlcGFyZUNvcHlDdXQpO1xuXG4gICAgb24oZGlzcGxheS5zY3JvbGxlciwgXCJwYXN0ZVwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKGV2ZW50SW5XaWRnZXQoZGlzcGxheSwgZSkgfHwgc2lnbmFsRE9NRXZlbnQoY20sIGUpKSB7IHJldHVybiB9XG4gICAgICBpZiAoIXRlLmRpc3BhdGNoRXZlbnQpIHtcbiAgICAgICAgY20uc3RhdGUucGFzdGVJbmNvbWluZyA9ICtuZXcgRGF0ZTtcbiAgICAgICAgaW5wdXQuZm9jdXMoKTtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIFBhc3MgdGhlIGBwYXN0ZWAgZXZlbnQgdG8gdGhlIHRleHRhcmVhIHNvIGl0J3MgaGFuZGxlZCBieSBpdHMgZXZlbnQgbGlzdGVuZXIuXG4gICAgICB2YXIgZXZlbnQgPSBuZXcgRXZlbnQoXCJwYXN0ZVwiKTtcbiAgICAgIGV2ZW50LmNsaXBib2FyZERhdGEgPSBlLmNsaXBib2FyZERhdGE7XG4gICAgICB0ZS5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICB9KTtcblxuICAgIC8vIFByZXZlbnQgbm9ybWFsIHNlbGVjdGlvbiBpbiB0aGUgZWRpdG9yICh3ZSBoYW5kbGUgb3VyIG93bilcbiAgICBvbihkaXNwbGF5LmxpbmVTcGFjZSwgXCJzZWxlY3RzdGFydFwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKCFldmVudEluV2lkZ2V0KGRpc3BsYXksIGUpKSB7IGVfcHJldmVudERlZmF1bHQoZSk7IH1cbiAgICB9KTtcblxuICAgIG9uKHRlLCBcImNvbXBvc2l0aW9uc3RhcnRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHN0YXJ0ID0gY20uZ2V0Q3Vyc29yKFwiZnJvbVwiKTtcbiAgICAgIGlmIChpbnB1dC5jb21wb3NpbmcpIHsgaW5wdXQuY29tcG9zaW5nLnJhbmdlLmNsZWFyKCk7IH1cbiAgICAgIGlucHV0LmNvbXBvc2luZyA9IHtcbiAgICAgICAgc3RhcnQ6IHN0YXJ0LFxuICAgICAgICByYW5nZTogY20ubWFya1RleHQoc3RhcnQsIGNtLmdldEN1cnNvcihcInRvXCIpLCB7Y2xhc3NOYW1lOiBcIkNvZGVNaXJyb3ItY29tcG9zaW5nXCJ9KVxuICAgICAgfTtcbiAgICB9KTtcbiAgICBvbih0ZSwgXCJjb21wb3NpdGlvbmVuZFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoaW5wdXQuY29tcG9zaW5nKSB7XG4gICAgICAgIGlucHV0LnBvbGwoKTtcbiAgICAgICAgaW5wdXQuY29tcG9zaW5nLnJhbmdlLmNsZWFyKCk7XG4gICAgICAgIGlucHV0LmNvbXBvc2luZyA9IG51bGw7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgVGV4dGFyZWFJbnB1dC5wcm90b3R5cGUuY3JlYXRlRmllbGQgPSBmdW5jdGlvbiAoX2Rpc3BsYXkpIHtcbiAgICAvLyBXcmFwcyBhbmQgaGlkZXMgaW5wdXQgdGV4dGFyZWFcbiAgICB0aGlzLndyYXBwZXIgPSBoaWRkZW5UZXh0YXJlYSgpO1xuICAgIC8vIFRoZSBzZW1paGlkZGVuIHRleHRhcmVhIHRoYXQgaXMgZm9jdXNlZCB3aGVuIHRoZSBlZGl0b3IgaXNcbiAgICAvLyBmb2N1c2VkLCBhbmQgcmVjZWl2ZXMgaW5wdXQuXG4gICAgdGhpcy50ZXh0YXJlYSA9IHRoaXMud3JhcHBlci5maXJzdENoaWxkO1xuICB9O1xuXG4gIFRleHRhcmVhSW5wdXQucHJvdG90eXBlLnNjcmVlblJlYWRlckxhYmVsQ2hhbmdlZCA9IGZ1bmN0aW9uIChsYWJlbCkge1xuICAgIC8vIExhYmVsIGZvciBzY3JlZW5yZWFkZXJzLCBhY2Nlc3NpYmlsaXR5XG4gICAgaWYobGFiZWwpIHtcbiAgICAgIHRoaXMudGV4dGFyZWEuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgbGFiZWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRleHRhcmVhLnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcpO1xuICAgIH1cbiAgfTtcblxuICBUZXh0YXJlYUlucHV0LnByb3RvdHlwZS5wcmVwYXJlU2VsZWN0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgIC8vIFJlZHJhdyB0aGUgc2VsZWN0aW9uIGFuZC9vciBjdXJzb3JcbiAgICB2YXIgY20gPSB0aGlzLmNtLCBkaXNwbGF5ID0gY20uZGlzcGxheSwgZG9jID0gY20uZG9jO1xuICAgIHZhciByZXN1bHQgPSBwcmVwYXJlU2VsZWN0aW9uKGNtKTtcblxuICAgIC8vIE1vdmUgdGhlIGhpZGRlbiB0ZXh0YXJlYSBuZWFyIHRoZSBjdXJzb3IgdG8gcHJldmVudCBzY3JvbGxpbmcgYXJ0aWZhY3RzXG4gICAgaWYgKGNtLm9wdGlvbnMubW92ZUlucHV0V2l0aEN1cnNvcikge1xuICAgICAgdmFyIGhlYWRQb3MgPSBjdXJzb3JDb29yZHMoY20sIGRvYy5zZWwucHJpbWFyeSgpLmhlYWQsIFwiZGl2XCIpO1xuICAgICAgdmFyIHdyYXBPZmYgPSBkaXNwbGF5LndyYXBwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGxpbmVPZmYgPSBkaXNwbGF5LmxpbmVEaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICByZXN1bHQudGVUb3AgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihkaXNwbGF5LndyYXBwZXIuY2xpZW50SGVpZ2h0IC0gMTAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkUG9zLnRvcCArIGxpbmVPZmYudG9wIC0gd3JhcE9mZi50b3ApKTtcbiAgICAgIHJlc3VsdC50ZUxlZnQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihkaXNwbGF5LndyYXBwZXIuY2xpZW50V2lkdGggLSAxMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkUG9zLmxlZnQgKyBsaW5lT2ZmLmxlZnQgLSB3cmFwT2ZmLmxlZnQpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH07XG5cbiAgVGV4dGFyZWFJbnB1dC5wcm90b3R5cGUuc2hvd1NlbGVjdGlvbiA9IGZ1bmN0aW9uIChkcmF3bikge1xuICAgIHZhciBjbSA9IHRoaXMuY20sIGRpc3BsYXkgPSBjbS5kaXNwbGF5O1xuICAgIHJlbW92ZUNoaWxkcmVuQW5kQWRkKGRpc3BsYXkuY3Vyc29yRGl2LCBkcmF3bi5jdXJzb3JzKTtcbiAgICByZW1vdmVDaGlsZHJlbkFuZEFkZChkaXNwbGF5LnNlbGVjdGlvbkRpdiwgZHJhd24uc2VsZWN0aW9uKTtcbiAgICBpZiAoZHJhd24udGVUb3AgIT0gbnVsbCkge1xuICAgICAgdGhpcy53cmFwcGVyLnN0eWxlLnRvcCA9IGRyYXduLnRlVG9wICsgXCJweFwiO1xuICAgICAgdGhpcy53cmFwcGVyLnN0eWxlLmxlZnQgPSBkcmF3bi50ZUxlZnQgKyBcInB4XCI7XG4gICAgfVxuICB9O1xuXG4gIC8vIFJlc2V0IHRoZSBpbnB1dCB0byBjb3JyZXNwb25kIHRvIHRoZSBzZWxlY3Rpb24gKG9yIHRvIGJlIGVtcHR5LFxuICAvLyB3aGVuIG5vdCB0eXBpbmcgYW5kIG5vdGhpbmcgaXMgc2VsZWN0ZWQpXG4gIFRleHRhcmVhSW5wdXQucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKHR5cGluZykge1xuICAgIGlmICh0aGlzLmNvbnRleHRNZW51UGVuZGluZyB8fCB0aGlzLmNvbXBvc2luZykgeyByZXR1cm4gfVxuICAgIHZhciBjbSA9IHRoaXMuY207XG4gICAgaWYgKGNtLnNvbWV0aGluZ1NlbGVjdGVkKCkpIHtcbiAgICAgIHRoaXMucHJldklucHV0ID0gXCJcIjtcbiAgICAgIHZhciBjb250ZW50ID0gY20uZ2V0U2VsZWN0aW9uKCk7XG4gICAgICB0aGlzLnRleHRhcmVhLnZhbHVlID0gY29udGVudDtcbiAgICAgIGlmIChjbS5zdGF0ZS5mb2N1c2VkKSB7IHNlbGVjdElucHV0KHRoaXMudGV4dGFyZWEpOyB9XG4gICAgICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA+PSA5KSB7IHRoaXMuaGFzU2VsZWN0aW9uID0gY29udGVudDsgfVxuICAgIH0gZWxzZSBpZiAoIXR5cGluZykge1xuICAgICAgdGhpcy5wcmV2SW5wdXQgPSB0aGlzLnRleHRhcmVhLnZhbHVlID0gXCJcIjtcbiAgICAgIGlmIChpZSAmJiBpZV92ZXJzaW9uID49IDkpIHsgdGhpcy5oYXNTZWxlY3Rpb24gPSBudWxsOyB9XG4gICAgfVxuICB9O1xuXG4gIFRleHRhcmVhSW5wdXQucHJvdG90eXBlLmdldEZpZWxkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy50ZXh0YXJlYSB9O1xuXG4gIFRleHRhcmVhSW5wdXQucHJvdG90eXBlLnN1cHBvcnRzVG91Y2ggPSBmdW5jdGlvbiAoKSB7IHJldHVybiBmYWxzZSB9O1xuXG4gIFRleHRhcmVhSW5wdXQucHJvdG90eXBlLmZvY3VzID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLmNtLm9wdGlvbnMucmVhZE9ubHkgIT0gXCJub2N1cnNvclwiICYmICghbW9iaWxlIHx8IGFjdGl2ZUVsdCgpICE9IHRoaXMudGV4dGFyZWEpKSB7XG4gICAgICB0cnkgeyB0aGlzLnRleHRhcmVhLmZvY3VzKCk7IH1cbiAgICAgIGNhdGNoIChlKSB7fSAvLyBJRTggd2lsbCB0aHJvdyBpZiB0aGUgdGV4dGFyZWEgaXMgZGlzcGxheTogbm9uZSBvciBub3QgaW4gRE9NXG4gICAgfVxuICB9O1xuXG4gIFRleHRhcmVhSW5wdXQucHJvdG90eXBlLmJsdXIgPSBmdW5jdGlvbiAoKSB7IHRoaXMudGV4dGFyZWEuYmx1cigpOyB9O1xuXG4gIFRleHRhcmVhSW5wdXQucHJvdG90eXBlLnJlc2V0UG9zaXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy53cmFwcGVyLnN0eWxlLnRvcCA9IHRoaXMud3JhcHBlci5zdHlsZS5sZWZ0ID0gMDtcbiAgfTtcblxuICBUZXh0YXJlYUlucHV0LnByb3RvdHlwZS5yZWNlaXZlZEZvY3VzID0gZnVuY3Rpb24gKCkgeyB0aGlzLnNsb3dQb2xsKCk7IH07XG5cbiAgLy8gUG9sbCBmb3IgaW5wdXQgY2hhbmdlcywgdXNpbmcgdGhlIG5vcm1hbCByYXRlIG9mIHBvbGxpbmcuIFRoaXNcbiAgLy8gcnVucyBhcyBsb25nIGFzIHRoZSBlZGl0b3IgaXMgZm9jdXNlZC5cbiAgVGV4dGFyZWFJbnB1dC5wcm90b3R5cGUuc2xvd1BvbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIGlmICh0aGlzLnBvbGxpbmdGYXN0KSB7IHJldHVybiB9XG4gICAgdGhpcy5wb2xsaW5nLnNldCh0aGlzLmNtLm9wdGlvbnMucG9sbEludGVydmFsLCBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzJDEucG9sbCgpO1xuICAgICAgaWYgKHRoaXMkMS5jbS5zdGF0ZS5mb2N1c2VkKSB7IHRoaXMkMS5zbG93UG9sbCgpOyB9XG4gICAgfSk7XG4gIH07XG5cbiAgLy8gV2hlbiBhbiBldmVudCBoYXMganVzdCBjb21lIGluIHRoYXQgaXMgbGlrZWx5IHRvIGFkZCBvciBjaGFuZ2VcbiAgLy8gc29tZXRoaW5nIGluIHRoZSBpbnB1dCB0ZXh0YXJlYSwgd2UgcG9sbCBmYXN0ZXIsIHRvIGVuc3VyZSB0aGF0XG4gIC8vIHRoZSBjaGFuZ2UgYXBwZWFycyBvbiB0aGUgc2NyZWVuIHF1aWNrbHkuXG4gIFRleHRhcmVhSW5wdXQucHJvdG90eXBlLmZhc3RQb2xsID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBtaXNzZWQgPSBmYWxzZSwgaW5wdXQgPSB0aGlzO1xuICAgIGlucHV0LnBvbGxpbmdGYXN0ID0gdHJ1ZTtcbiAgICBmdW5jdGlvbiBwKCkge1xuICAgICAgdmFyIGNoYW5nZWQgPSBpbnB1dC5wb2xsKCk7XG4gICAgICBpZiAoIWNoYW5nZWQgJiYgIW1pc3NlZCkge21pc3NlZCA9IHRydWU7IGlucHV0LnBvbGxpbmcuc2V0KDYwLCBwKTt9XG4gICAgICBlbHNlIHtpbnB1dC5wb2xsaW5nRmFzdCA9IGZhbHNlOyBpbnB1dC5zbG93UG9sbCgpO31cbiAgICB9XG4gICAgaW5wdXQucG9sbGluZy5zZXQoMjAsIHApO1xuICB9O1xuXG4gIC8vIFJlYWQgaW5wdXQgZnJvbSB0aGUgdGV4dGFyZWEsIGFuZCB1cGRhdGUgdGhlIGRvY3VtZW50IHRvIG1hdGNoLlxuICAvLyBXaGVuIHNvbWV0aGluZyBpcyBzZWxlY3RlZCwgaXQgaXMgcHJlc2VudCBpbiB0aGUgdGV4dGFyZWEsIGFuZFxuICAvLyBzZWxlY3RlZCAodW5sZXNzIGl0IGlzIGh1Z2UsIGluIHdoaWNoIGNhc2UgYSBwbGFjZWhvbGRlciBpc1xuICAvLyB1c2VkKS4gV2hlbiBub3RoaW5nIGlzIHNlbGVjdGVkLCB0aGUgY3Vyc29yIHNpdHMgYWZ0ZXIgcHJldmlvdXNseVxuICAvLyBzZWVuIHRleHQgKGNhbiBiZSBlbXB0eSksIHdoaWNoIGlzIHN0b3JlZCBpbiBwcmV2SW5wdXQgKHdlIG11c3RcbiAgLy8gbm90IHJlc2V0IHRoZSB0ZXh0YXJlYSB3aGVuIHR5cGluZywgYmVjYXVzZSB0aGF0IGJyZWFrcyBJTUUpLlxuICBUZXh0YXJlYUlucHV0LnByb3RvdHlwZS5wb2xsID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICB2YXIgY20gPSB0aGlzLmNtLCBpbnB1dCA9IHRoaXMudGV4dGFyZWEsIHByZXZJbnB1dCA9IHRoaXMucHJldklucHV0O1xuICAgIC8vIFNpbmNlIHRoaXMgaXMgY2FsbGVkIGEgKmxvdCosIHRyeSB0byBiYWlsIG91dCBhcyBjaGVhcGx5IGFzXG4gICAgLy8gcG9zc2libGUgd2hlbiBpdCBpcyBjbGVhciB0aGF0IG5vdGhpbmcgaGFwcGVuZWQuIGhhc1NlbGVjdGlvblxuICAgIC8vIHdpbGwgYmUgdGhlIGNhc2Ugd2hlbiB0aGVyZSBpcyBhIGxvdCBvZiB0ZXh0IGluIHRoZSB0ZXh0YXJlYSxcbiAgICAvLyBpbiB3aGljaCBjYXNlIHJlYWRpbmcgaXRzIHZhbHVlIHdvdWxkIGJlIGV4cGVuc2l2ZS5cbiAgICBpZiAodGhpcy5jb250ZXh0TWVudVBlbmRpbmcgfHwgIWNtLnN0YXRlLmZvY3VzZWQgfHxcbiAgICAgICAgKGhhc1NlbGVjdGlvbihpbnB1dCkgJiYgIXByZXZJbnB1dCAmJiAhdGhpcy5jb21wb3NpbmcpIHx8XG4gICAgICAgIGNtLmlzUmVhZE9ubHkoKSB8fCBjbS5vcHRpb25zLmRpc2FibGVJbnB1dCB8fCBjbS5zdGF0ZS5rZXlTZXEpXG4gICAgICB7IHJldHVybiBmYWxzZSB9XG5cbiAgICB2YXIgdGV4dCA9IGlucHV0LnZhbHVlO1xuICAgIC8vIElmIG5vdGhpbmcgY2hhbmdlZCwgYmFpbC5cbiAgICBpZiAodGV4dCA9PSBwcmV2SW5wdXQgJiYgIWNtLnNvbWV0aGluZ1NlbGVjdGVkKCkpIHsgcmV0dXJuIGZhbHNlIH1cbiAgICAvLyBXb3JrIGFyb3VuZCBub25zZW5zaWNhbCBzZWxlY3Rpb24gcmVzZXR0aW5nIGluIElFOS8xMCwgYW5kXG4gICAgLy8gaW5leHBsaWNhYmxlIGFwcGVhcmFuY2Ugb2YgcHJpdmF0ZSBhcmVhIHVuaWNvZGUgY2hhcmFjdGVycyBvblxuICAgIC8vIHNvbWUga2V5IGNvbWJvcyBpbiBNYWMgKCMyNjg5KS5cbiAgICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA+PSA5ICYmIHRoaXMuaGFzU2VsZWN0aW9uID09PSB0ZXh0IHx8XG4gICAgICAgIG1hYyAmJiAvW1xcdWY3MDAtXFx1ZjdmZl0vLnRlc3QodGV4dCkpIHtcbiAgICAgIGNtLmRpc3BsYXkuaW5wdXQucmVzZXQoKTtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGlmIChjbS5kb2Muc2VsID09IGNtLmRpc3BsYXkuc2VsRm9yQ29udGV4dE1lbnUpIHtcbiAgICAgIHZhciBmaXJzdCA9IHRleHQuY2hhckNvZGVBdCgwKTtcbiAgICAgIGlmIChmaXJzdCA9PSAweDIwMGIgJiYgIXByZXZJbnB1dCkgeyBwcmV2SW5wdXQgPSBcIlxcdTIwMGJcIjsgfVxuICAgICAgaWYgKGZpcnN0ID09IDB4MjFkYSkgeyB0aGlzLnJlc2V0KCk7IHJldHVybiB0aGlzLmNtLmV4ZWNDb21tYW5kKFwidW5kb1wiKSB9XG4gICAgfVxuICAgIC8vIEZpbmQgdGhlIHBhcnQgb2YgdGhlIGlucHV0IHRoYXQgaXMgYWN0dWFsbHkgbmV3XG4gICAgdmFyIHNhbWUgPSAwLCBsID0gTWF0aC5taW4ocHJldklucHV0Lmxlbmd0aCwgdGV4dC5sZW5ndGgpO1xuICAgIHdoaWxlIChzYW1lIDwgbCAmJiBwcmV2SW5wdXQuY2hhckNvZGVBdChzYW1lKSA9PSB0ZXh0LmNoYXJDb2RlQXQoc2FtZSkpIHsgKytzYW1lOyB9XG5cbiAgICBydW5Jbk9wKGNtLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhcHBseVRleHRJbnB1dChjbSwgdGV4dC5zbGljZShzYW1lKSwgcHJldklucHV0Lmxlbmd0aCAtIHNhbWUsXG4gICAgICAgICAgICAgICAgICAgICBudWxsLCB0aGlzJDEuY29tcG9zaW5nID8gXCIqY29tcG9zZVwiIDogbnVsbCk7XG5cbiAgICAgIC8vIERvbid0IGxlYXZlIGxvbmcgdGV4dCBpbiB0aGUgdGV4dGFyZWEsIHNpbmNlIGl0IG1ha2VzIGZ1cnRoZXIgcG9sbGluZyBzbG93XG4gICAgICBpZiAodGV4dC5sZW5ndGggPiAxMDAwIHx8IHRleHQuaW5kZXhPZihcIlxcblwiKSA+IC0xKSB7IGlucHV0LnZhbHVlID0gdGhpcyQxLnByZXZJbnB1dCA9IFwiXCI7IH1cbiAgICAgIGVsc2UgeyB0aGlzJDEucHJldklucHV0ID0gdGV4dDsgfVxuXG4gICAgICBpZiAodGhpcyQxLmNvbXBvc2luZykge1xuICAgICAgICB0aGlzJDEuY29tcG9zaW5nLnJhbmdlLmNsZWFyKCk7XG4gICAgICAgIHRoaXMkMS5jb21wb3NpbmcucmFuZ2UgPSBjbS5tYXJrVGV4dCh0aGlzJDEuY29tcG9zaW5nLnN0YXJ0LCBjbS5nZXRDdXJzb3IoXCJ0b1wiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcIkNvZGVNaXJyb3ItY29tcG9zaW5nXCJ9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdHJ1ZVxuICB9O1xuXG4gIFRleHRhcmVhSW5wdXQucHJvdG90eXBlLmVuc3VyZVBvbGxlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5wb2xsaW5nRmFzdCAmJiB0aGlzLnBvbGwoKSkgeyB0aGlzLnBvbGxpbmdGYXN0ID0gZmFsc2U7IH1cbiAgfTtcblxuICBUZXh0YXJlYUlucHV0LnByb3RvdHlwZS5vbktleVByZXNzID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChpZSAmJiBpZV92ZXJzaW9uID49IDkpIHsgdGhpcy5oYXNTZWxlY3Rpb24gPSBudWxsOyB9XG4gICAgdGhpcy5mYXN0UG9sbCgpO1xuICB9O1xuXG4gIFRleHRhcmVhSW5wdXQucHJvdG90eXBlLm9uQ29udGV4dE1lbnUgPSBmdW5jdGlvbiAoZSkge1xuICAgIHZhciBpbnB1dCA9IHRoaXMsIGNtID0gaW5wdXQuY20sIGRpc3BsYXkgPSBjbS5kaXNwbGF5LCB0ZSA9IGlucHV0LnRleHRhcmVhO1xuICAgIGlmIChpbnB1dC5jb250ZXh0TWVudVBlbmRpbmcpIHsgaW5wdXQuY29udGV4dE1lbnVQZW5kaW5nKCk7IH1cbiAgICB2YXIgcG9zID0gcG9zRnJvbU1vdXNlKGNtLCBlKSwgc2Nyb2xsUG9zID0gZGlzcGxheS5zY3JvbGxlci5zY3JvbGxUb3A7XG4gICAgaWYgKCFwb3MgfHwgcHJlc3RvKSB7IHJldHVybiB9IC8vIE9wZXJhIGlzIGRpZmZpY3VsdC5cblxuICAgIC8vIFJlc2V0IHRoZSBjdXJyZW50IHRleHQgc2VsZWN0aW9uIG9ubHkgaWYgdGhlIGNsaWNrIGlzIGRvbmUgb3V0c2lkZSBvZiB0aGUgc2VsZWN0aW9uXG4gICAgLy8gYW5kICdyZXNldFNlbGVjdGlvbk9uQ29udGV4dE1lbnUnIG9wdGlvbiBpcyB0cnVlLlxuICAgIHZhciByZXNldCA9IGNtLm9wdGlvbnMucmVzZXRTZWxlY3Rpb25PbkNvbnRleHRNZW51O1xuICAgIGlmIChyZXNldCAmJiBjbS5kb2Muc2VsLmNvbnRhaW5zKHBvcykgPT0gLTEpXG4gICAgICB7IG9wZXJhdGlvbihjbSwgc2V0U2VsZWN0aW9uKShjbS5kb2MsIHNpbXBsZVNlbGVjdGlvbihwb3MpLCBzZWxfZG9udFNjcm9sbCk7IH1cblxuICAgIHZhciBvbGRDU1MgPSB0ZS5zdHlsZS5jc3NUZXh0LCBvbGRXcmFwcGVyQ1NTID0gaW5wdXQud3JhcHBlci5zdHlsZS5jc3NUZXh0O1xuICAgIHZhciB3cmFwcGVyQm94ID0gaW5wdXQud3JhcHBlci5vZmZzZXRQYXJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgaW5wdXQud3JhcHBlci5zdHlsZS5jc3NUZXh0ID0gXCJwb3NpdGlvbjogc3RhdGljXCI7XG4gICAgdGUuc3R5bGUuY3NzVGV4dCA9IFwicG9zaXRpb246IGFic29sdXRlOyB3aWR0aDogMzBweDsgaGVpZ2h0OiAzMHB4O1xcbiAgICAgIHRvcDogXCIgKyAoZS5jbGllbnRZIC0gd3JhcHBlckJveC50b3AgLSA1KSArIFwicHg7IGxlZnQ6IFwiICsgKGUuY2xpZW50WCAtIHdyYXBwZXJCb3gubGVmdCAtIDUpICsgXCJweDtcXG4gICAgICB6LWluZGV4OiAxMDAwOyBiYWNrZ3JvdW5kOiBcIiArIChpZSA/IFwicmdiYSgyNTUsIDI1NSwgMjU1LCAuMDUpXCIgOiBcInRyYW5zcGFyZW50XCIpICsgXCI7XFxuICAgICAgb3V0bGluZTogbm9uZTsgYm9yZGVyLXdpZHRoOiAwOyBvdXRsaW5lOiBub25lOyBvdmVyZmxvdzogaGlkZGVuOyBvcGFjaXR5OiAuMDU7IGZpbHRlcjogYWxwaGEob3BhY2l0eT01KTtcIjtcbiAgICB2YXIgb2xkU2Nyb2xsWTtcbiAgICBpZiAod2Via2l0KSB7IG9sZFNjcm9sbFkgPSB3aW5kb3cuc2Nyb2xsWTsgfSAvLyBXb3JrIGFyb3VuZCBDaHJvbWUgaXNzdWUgKCMyNzEyKVxuICAgIGRpc3BsYXkuaW5wdXQuZm9jdXMoKTtcbiAgICBpZiAod2Via2l0KSB7IHdpbmRvdy5zY3JvbGxUbyhudWxsLCBvbGRTY3JvbGxZKTsgfVxuICAgIGRpc3BsYXkuaW5wdXQucmVzZXQoKTtcbiAgICAvLyBBZGRzIFwiU2VsZWN0IGFsbFwiIHRvIGNvbnRleHQgbWVudSBpbiBGRlxuICAgIGlmICghY20uc29tZXRoaW5nU2VsZWN0ZWQoKSkgeyB0ZS52YWx1ZSA9IGlucHV0LnByZXZJbnB1dCA9IFwiIFwiOyB9XG4gICAgaW5wdXQuY29udGV4dE1lbnVQZW5kaW5nID0gcmVoaWRlO1xuICAgIGRpc3BsYXkuc2VsRm9yQ29udGV4dE1lbnUgPSBjbS5kb2Muc2VsO1xuICAgIGNsZWFyVGltZW91dChkaXNwbGF5LmRldGVjdGluZ1NlbGVjdEFsbCk7XG5cbiAgICAvLyBTZWxlY3QtYWxsIHdpbGwgYmUgZ3JleWVkIG91dCBpZiB0aGVyZSdzIG5vdGhpbmcgdG8gc2VsZWN0LCBzb1xuICAgIC8vIHRoaXMgYWRkcyBhIHplcm8td2lkdGggc3BhY2Ugc28gdGhhdCB3ZSBjYW4gbGF0ZXIgY2hlY2sgd2hldGhlclxuICAgIC8vIGl0IGdvdCBzZWxlY3RlZC5cbiAgICBmdW5jdGlvbiBwcmVwYXJlU2VsZWN0QWxsSGFjaygpIHtcbiAgICAgIGlmICh0ZS5zZWxlY3Rpb25TdGFydCAhPSBudWxsKSB7XG4gICAgICAgIHZhciBzZWxlY3RlZCA9IGNtLnNvbWV0aGluZ1NlbGVjdGVkKCk7XG4gICAgICAgIHZhciBleHR2YWwgPSBcIlxcdTIwMGJcIiArIChzZWxlY3RlZCA/IHRlLnZhbHVlIDogXCJcIik7XG4gICAgICAgIHRlLnZhbHVlID0gXCJcXHUyMWRhXCI7IC8vIFVzZWQgdG8gY2F0Y2ggY29udGV4dC1tZW51IHVuZG9cbiAgICAgICAgdGUudmFsdWUgPSBleHR2YWw7XG4gICAgICAgIGlucHV0LnByZXZJbnB1dCA9IHNlbGVjdGVkID8gXCJcIiA6IFwiXFx1MjAwYlwiO1xuICAgICAgICB0ZS5zZWxlY3Rpb25TdGFydCA9IDE7IHRlLnNlbGVjdGlvbkVuZCA9IGV4dHZhbC5sZW5ndGg7XG4gICAgICAgIC8vIFJlLXNldCB0aGlzLCBpbiBjYXNlIHNvbWUgb3RoZXIgaGFuZGxlciB0b3VjaGVkIHRoZVxuICAgICAgICAvLyBzZWxlY3Rpb24gaW4gdGhlIG1lYW50aW1lLlxuICAgICAgICBkaXNwbGF5LnNlbEZvckNvbnRleHRNZW51ID0gY20uZG9jLnNlbDtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gcmVoaWRlKCkge1xuICAgICAgaWYgKGlucHV0LmNvbnRleHRNZW51UGVuZGluZyAhPSByZWhpZGUpIHsgcmV0dXJuIH1cbiAgICAgIGlucHV0LmNvbnRleHRNZW51UGVuZGluZyA9IGZhbHNlO1xuICAgICAgaW5wdXQud3JhcHBlci5zdHlsZS5jc3NUZXh0ID0gb2xkV3JhcHBlckNTUztcbiAgICAgIHRlLnN0eWxlLmNzc1RleHQgPSBvbGRDU1M7XG4gICAgICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8IDkpIHsgZGlzcGxheS5zY3JvbGxiYXJzLnNldFNjcm9sbFRvcChkaXNwbGF5LnNjcm9sbGVyLnNjcm9sbFRvcCA9IHNjcm9sbFBvcyk7IH1cblxuICAgICAgLy8gVHJ5IHRvIGRldGVjdCB0aGUgdXNlciBjaG9vc2luZyBzZWxlY3QtYWxsXG4gICAgICBpZiAodGUuc2VsZWN0aW9uU3RhcnQgIT0gbnVsbCkge1xuICAgICAgICBpZiAoIWllIHx8IChpZSAmJiBpZV92ZXJzaW9uIDwgOSkpIHsgcHJlcGFyZVNlbGVjdEFsbEhhY2soKTsgfVxuICAgICAgICB2YXIgaSA9IDAsIHBvbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKGRpc3BsYXkuc2VsRm9yQ29udGV4dE1lbnUgPT0gY20uZG9jLnNlbCAmJiB0ZS5zZWxlY3Rpb25TdGFydCA9PSAwICYmXG4gICAgICAgICAgICAgIHRlLnNlbGVjdGlvbkVuZCA+IDAgJiYgaW5wdXQucHJldklucHV0ID09IFwiXFx1MjAwYlwiKSB7XG4gICAgICAgICAgICBvcGVyYXRpb24oY20sIHNlbGVjdEFsbCkoY20pO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaSsrIDwgMTApIHtcbiAgICAgICAgICAgIGRpc3BsYXkuZGV0ZWN0aW5nU2VsZWN0QWxsID0gc2V0VGltZW91dChwb2xsLCA1MDApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkaXNwbGF5LnNlbEZvckNvbnRleHRNZW51ID0gbnVsbDtcbiAgICAgICAgICAgIGRpc3BsYXkuaW5wdXQucmVzZXQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGRpc3BsYXkuZGV0ZWN0aW5nU2VsZWN0QWxsID0gc2V0VGltZW91dChwb2xsLCAyMDApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpZSAmJiBpZV92ZXJzaW9uID49IDkpIHsgcHJlcGFyZVNlbGVjdEFsbEhhY2soKTsgfVxuICAgIGlmIChjYXB0dXJlUmlnaHRDbGljaykge1xuICAgICAgZV9zdG9wKGUpO1xuICAgICAgdmFyIG1vdXNldXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIG9mZih3aW5kb3csIFwibW91c2V1cFwiLCBtb3VzZXVwKTtcbiAgICAgICAgc2V0VGltZW91dChyZWhpZGUsIDIwKTtcbiAgICAgIH07XG4gICAgICBvbih3aW5kb3csIFwibW91c2V1cFwiLCBtb3VzZXVwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0VGltZW91dChyZWhpZGUsIDUwKTtcbiAgICB9XG4gIH07XG5cbiAgVGV4dGFyZWFJbnB1dC5wcm90b3R5cGUucmVhZE9ubHlDaGFuZ2VkID0gZnVuY3Rpb24gKHZhbCkge1xuICAgIGlmICghdmFsKSB7IHRoaXMucmVzZXQoKTsgfVxuICAgIHRoaXMudGV4dGFyZWEuZGlzYWJsZWQgPSB2YWwgPT0gXCJub2N1cnNvclwiO1xuICAgIHRoaXMudGV4dGFyZWEucmVhZE9ubHkgPSAhIXZhbDtcbiAgfTtcblxuICBUZXh0YXJlYUlucHV0LnByb3RvdHlwZS5zZXRVbmVkaXRhYmxlID0gZnVuY3Rpb24gKCkge307XG5cbiAgVGV4dGFyZWFJbnB1dC5wcm90b3R5cGUubmVlZHNDb250ZW50QXR0cmlidXRlID0gZmFsc2U7XG5cbiAgZnVuY3Rpb24gZnJvbVRleHRBcmVhKHRleHRhcmVhLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgPyBjb3B5T2JqKG9wdGlvbnMpIDoge307XG4gICAgb3B0aW9ucy52YWx1ZSA9IHRleHRhcmVhLnZhbHVlO1xuICAgIGlmICghb3B0aW9ucy50YWJpbmRleCAmJiB0ZXh0YXJlYS50YWJJbmRleClcbiAgICAgIHsgb3B0aW9ucy50YWJpbmRleCA9IHRleHRhcmVhLnRhYkluZGV4OyB9XG4gICAgaWYgKCFvcHRpb25zLnBsYWNlaG9sZGVyICYmIHRleHRhcmVhLnBsYWNlaG9sZGVyKVxuICAgICAgeyBvcHRpb25zLnBsYWNlaG9sZGVyID0gdGV4dGFyZWEucGxhY2Vob2xkZXI7IH1cbiAgICAvLyBTZXQgYXV0b2ZvY3VzIHRvIHRydWUgaWYgdGhpcyB0ZXh0YXJlYSBpcyBmb2N1c2VkLCBvciBpZiBpdCBoYXNcbiAgICAvLyBhdXRvZm9jdXMgYW5kIG5vIG90aGVyIGVsZW1lbnQgaXMgZm9jdXNlZC5cbiAgICBpZiAob3B0aW9ucy5hdXRvZm9jdXMgPT0gbnVsbCkge1xuICAgICAgdmFyIGhhc0ZvY3VzID0gYWN0aXZlRWx0KCk7XG4gICAgICBvcHRpb25zLmF1dG9mb2N1cyA9IGhhc0ZvY3VzID09IHRleHRhcmVhIHx8XG4gICAgICAgIHRleHRhcmVhLmdldEF0dHJpYnV0ZShcImF1dG9mb2N1c1wiKSAhPSBudWxsICYmIGhhc0ZvY3VzID09IGRvY3VtZW50LmJvZHk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2F2ZSgpIHt0ZXh0YXJlYS52YWx1ZSA9IGNtLmdldFZhbHVlKCk7fVxuXG4gICAgdmFyIHJlYWxTdWJtaXQ7XG4gICAgaWYgKHRleHRhcmVhLmZvcm0pIHtcbiAgICAgIG9uKHRleHRhcmVhLmZvcm0sIFwic3VibWl0XCIsIHNhdmUpO1xuICAgICAgLy8gRGVwbG9yYWJsZSBoYWNrIHRvIG1ha2UgdGhlIHN1Ym1pdCBtZXRob2QgZG8gdGhlIHJpZ2h0IHRoaW5nLlxuICAgICAgaWYgKCFvcHRpb25zLmxlYXZlU3VibWl0TWV0aG9kQWxvbmUpIHtcbiAgICAgICAgdmFyIGZvcm0gPSB0ZXh0YXJlYS5mb3JtO1xuICAgICAgICByZWFsU3VibWl0ID0gZm9ybS5zdWJtaXQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdmFyIHdyYXBwZWRTdWJtaXQgPSBmb3JtLnN1Ym1pdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHNhdmUoKTtcbiAgICAgICAgICAgIGZvcm0uc3VibWl0ID0gcmVhbFN1Ym1pdDtcbiAgICAgICAgICAgIGZvcm0uc3VibWl0KCk7XG4gICAgICAgICAgICBmb3JtLnN1Ym1pdCA9IHdyYXBwZWRTdWJtaXQ7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSBjYXRjaChlKSB7fVxuICAgICAgfVxuICAgIH1cblxuICAgIG9wdGlvbnMuZmluaXNoSW5pdCA9IGZ1bmN0aW9uIChjbSkge1xuICAgICAgY20uc2F2ZSA9IHNhdmU7XG4gICAgICBjbS5nZXRUZXh0QXJlYSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRleHRhcmVhOyB9O1xuICAgICAgY20udG9UZXh0QXJlYSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY20udG9UZXh0QXJlYSA9IGlzTmFOOyAvLyBQcmV2ZW50IHRoaXMgZnJvbSBiZWluZyByYW4gdHdpY2VcbiAgICAgICAgc2F2ZSgpO1xuICAgICAgICB0ZXh0YXJlYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNtLmdldFdyYXBwZXJFbGVtZW50KCkpO1xuICAgICAgICB0ZXh0YXJlYS5zdHlsZS5kaXNwbGF5ID0gXCJcIjtcbiAgICAgICAgaWYgKHRleHRhcmVhLmZvcm0pIHtcbiAgICAgICAgICBvZmYodGV4dGFyZWEuZm9ybSwgXCJzdWJtaXRcIiwgc2F2ZSk7XG4gICAgICAgICAgaWYgKCFvcHRpb25zLmxlYXZlU3VibWl0TWV0aG9kQWxvbmUgJiYgdHlwZW9mIHRleHRhcmVhLmZvcm0uc3VibWl0ID09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgIHsgdGV4dGFyZWEuZm9ybS5zdWJtaXQgPSByZWFsU3VibWl0OyB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfTtcblxuICAgIHRleHRhcmVhLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICB2YXIgY20gPSBDb2RlTWlycm9yKGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiB0ZXh0YXJlYS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlLCB0ZXh0YXJlYS5uZXh0U2libGluZyk7IH0sXG4gICAgICBvcHRpb25zKTtcbiAgICByZXR1cm4gY21cbiAgfVxuXG4gIGZ1bmN0aW9uIGFkZExlZ2FjeVByb3BzKENvZGVNaXJyb3IpIHtcbiAgICBDb2RlTWlycm9yLm9mZiA9IG9mZjtcbiAgICBDb2RlTWlycm9yLm9uID0gb247XG4gICAgQ29kZU1pcnJvci53aGVlbEV2ZW50UGl4ZWxzID0gd2hlZWxFdmVudFBpeGVscztcbiAgICBDb2RlTWlycm9yLkRvYyA9IERvYztcbiAgICBDb2RlTWlycm9yLnNwbGl0TGluZXMgPSBzcGxpdExpbmVzQXV0bztcbiAgICBDb2RlTWlycm9yLmNvdW50Q29sdW1uID0gY291bnRDb2x1bW47XG4gICAgQ29kZU1pcnJvci5maW5kQ29sdW1uID0gZmluZENvbHVtbjtcbiAgICBDb2RlTWlycm9yLmlzV29yZENoYXIgPSBpc1dvcmRDaGFyQmFzaWM7XG4gICAgQ29kZU1pcnJvci5QYXNzID0gUGFzcztcbiAgICBDb2RlTWlycm9yLnNpZ25hbCA9IHNpZ25hbDtcbiAgICBDb2RlTWlycm9yLkxpbmUgPSBMaW5lO1xuICAgIENvZGVNaXJyb3IuY2hhbmdlRW5kID0gY2hhbmdlRW5kO1xuICAgIENvZGVNaXJyb3Iuc2Nyb2xsYmFyTW9kZWwgPSBzY3JvbGxiYXJNb2RlbDtcbiAgICBDb2RlTWlycm9yLlBvcyA9IFBvcztcbiAgICBDb2RlTWlycm9yLmNtcFBvcyA9IGNtcDtcbiAgICBDb2RlTWlycm9yLm1vZGVzID0gbW9kZXM7XG4gICAgQ29kZU1pcnJvci5taW1lTW9kZXMgPSBtaW1lTW9kZXM7XG4gICAgQ29kZU1pcnJvci5yZXNvbHZlTW9kZSA9IHJlc29sdmVNb2RlO1xuICAgIENvZGVNaXJyb3IuZ2V0TW9kZSA9IGdldE1vZGU7XG4gICAgQ29kZU1pcnJvci5tb2RlRXh0ZW5zaW9ucyA9IG1vZGVFeHRlbnNpb25zO1xuICAgIENvZGVNaXJyb3IuZXh0ZW5kTW9kZSA9IGV4dGVuZE1vZGU7XG4gICAgQ29kZU1pcnJvci5jb3B5U3RhdGUgPSBjb3B5U3RhdGU7XG4gICAgQ29kZU1pcnJvci5zdGFydFN0YXRlID0gc3RhcnRTdGF0ZTtcbiAgICBDb2RlTWlycm9yLmlubmVyTW9kZSA9IGlubmVyTW9kZTtcbiAgICBDb2RlTWlycm9yLmNvbW1hbmRzID0gY29tbWFuZHM7XG4gICAgQ29kZU1pcnJvci5rZXlNYXAgPSBrZXlNYXA7XG4gICAgQ29kZU1pcnJvci5rZXlOYW1lID0ga2V5TmFtZTtcbiAgICBDb2RlTWlycm9yLmlzTW9kaWZpZXJLZXkgPSBpc01vZGlmaWVyS2V5O1xuICAgIENvZGVNaXJyb3IubG9va3VwS2V5ID0gbG9va3VwS2V5O1xuICAgIENvZGVNaXJyb3Iubm9ybWFsaXplS2V5TWFwID0gbm9ybWFsaXplS2V5TWFwO1xuICAgIENvZGVNaXJyb3IuU3RyaW5nU3RyZWFtID0gU3RyaW5nU3RyZWFtO1xuICAgIENvZGVNaXJyb3IuU2hhcmVkVGV4dE1hcmtlciA9IFNoYXJlZFRleHRNYXJrZXI7XG4gICAgQ29kZU1pcnJvci5UZXh0TWFya2VyID0gVGV4dE1hcmtlcjtcbiAgICBDb2RlTWlycm9yLkxpbmVXaWRnZXQgPSBMaW5lV2lkZ2V0O1xuICAgIENvZGVNaXJyb3IuZV9wcmV2ZW50RGVmYXVsdCA9IGVfcHJldmVudERlZmF1bHQ7XG4gICAgQ29kZU1pcnJvci5lX3N0b3BQcm9wYWdhdGlvbiA9IGVfc3RvcFByb3BhZ2F0aW9uO1xuICAgIENvZGVNaXJyb3IuZV9zdG9wID0gZV9zdG9wO1xuICAgIENvZGVNaXJyb3IuYWRkQ2xhc3MgPSBhZGRDbGFzcztcbiAgICBDb2RlTWlycm9yLmNvbnRhaW5zID0gY29udGFpbnM7XG4gICAgQ29kZU1pcnJvci5ybUNsYXNzID0gcm1DbGFzcztcbiAgICBDb2RlTWlycm9yLmtleU5hbWVzID0ga2V5TmFtZXM7XG4gIH1cblxuICAvLyBFRElUT1IgQ09OU1RSVUNUT1JcblxuICBkZWZpbmVPcHRpb25zKENvZGVNaXJyb3IpO1xuXG4gIGFkZEVkaXRvck1ldGhvZHMoQ29kZU1pcnJvcik7XG5cbiAgLy8gU2V0IHVwIG1ldGhvZHMgb24gQ29kZU1pcnJvcidzIHByb3RvdHlwZSB0byByZWRpcmVjdCB0byB0aGUgZWRpdG9yJ3MgZG9jdW1lbnQuXG4gIHZhciBkb250RGVsZWdhdGUgPSBcIml0ZXIgaW5zZXJ0IHJlbW92ZSBjb3B5IGdldEVkaXRvciBjb25zdHJ1Y3RvclwiLnNwbGl0KFwiIFwiKTtcbiAgZm9yICh2YXIgcHJvcCBpbiBEb2MucHJvdG90eXBlKSB7IGlmIChEb2MucHJvdG90eXBlLmhhc093blByb3BlcnR5KHByb3ApICYmIGluZGV4T2YoZG9udERlbGVnYXRlLCBwcm9wKSA8IDApXG4gICAgeyBDb2RlTWlycm9yLnByb3RvdHlwZVtwcm9wXSA9IChmdW5jdGlvbihtZXRob2QpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtyZXR1cm4gbWV0aG9kLmFwcGx5KHRoaXMuZG9jLCBhcmd1bWVudHMpfVxuICAgIH0pKERvYy5wcm90b3R5cGVbcHJvcF0pOyB9IH1cblxuICBldmVudE1peGluKERvYyk7XG4gIENvZGVNaXJyb3IuaW5wdXRTdHlsZXMgPSB7XCJ0ZXh0YXJlYVwiOiBUZXh0YXJlYUlucHV0LCBcImNvbnRlbnRlZGl0YWJsZVwiOiBDb250ZW50RWRpdGFibGVJbnB1dH07XG5cbiAgLy8gRXh0cmEgYXJndW1lbnRzIGFyZSBzdG9yZWQgYXMgdGhlIG1vZGUncyBkZXBlbmRlbmNpZXMsIHdoaWNoIGlzXG4gIC8vIHVzZWQgYnkgKGxlZ2FjeSkgbWVjaGFuaXNtcyBsaWtlIGxvYWRtb2RlLmpzIHRvIGF1dG9tYXRpY2FsbHlcbiAgLy8gbG9hZCBhIG1vZGUuIChQcmVmZXJyZWQgbWVjaGFuaXNtIGlzIHRoZSByZXF1aXJlL2RlZmluZSBjYWxscy4pXG4gIENvZGVNaXJyb3IuZGVmaW5lTW9kZSA9IGZ1bmN0aW9uKG5hbWUvKiwgbW9kZSwg4oCmKi8pIHtcbiAgICBpZiAoIUNvZGVNaXJyb3IuZGVmYXVsdHMubW9kZSAmJiBuYW1lICE9IFwibnVsbFwiKSB7IENvZGVNaXJyb3IuZGVmYXVsdHMubW9kZSA9IG5hbWU7IH1cbiAgICBkZWZpbmVNb2RlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG5cbiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FID0gZGVmaW5lTUlNRTtcblxuICAvLyBNaW5pbWFsIGRlZmF1bHQgbW9kZS5cbiAgQ29kZU1pcnJvci5kZWZpbmVNb2RlKFwibnVsbFwiLCBmdW5jdGlvbiAoKSB7IHJldHVybiAoe3Rva2VuOiBmdW5jdGlvbiAoc3RyZWFtKSB7IHJldHVybiBzdHJlYW0uc2tpcFRvRW5kKCk7IH19KTsgfSk7XG4gIENvZGVNaXJyb3IuZGVmaW5lTUlNRShcInRleHQvcGxhaW5cIiwgXCJudWxsXCIpO1xuXG4gIC8vIEVYVEVOU0lPTlNcblxuICBDb2RlTWlycm9yLmRlZmluZUV4dGVuc2lvbiA9IGZ1bmN0aW9uIChuYW1lLCBmdW5jKSB7XG4gICAgQ29kZU1pcnJvci5wcm90b3R5cGVbbmFtZV0gPSBmdW5jO1xuICB9O1xuICBDb2RlTWlycm9yLmRlZmluZURvY0V4dGVuc2lvbiA9IGZ1bmN0aW9uIChuYW1lLCBmdW5jKSB7XG4gICAgRG9jLnByb3RvdHlwZVtuYW1lXSA9IGZ1bmM7XG4gIH07XG5cbiAgQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEgPSBmcm9tVGV4dEFyZWE7XG5cbiAgYWRkTGVnYWN5UHJvcHMoQ29kZU1pcnJvcik7XG5cbiAgQ29kZU1pcnJvci52ZXJzaW9uID0gXCI1LjYxLjBcIjtcblxuICByZXR1cm4gQ29kZU1pcnJvcjtcblxufSkpKTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/codemirror/lib/codemirror.js\n"); /***/ }), /***/ "./node_modules/codemirror/mode/clike/clike.js": -/*!*****************************************************!* +/*!*****************************************************!*\ !*** ./node_modules/codemirror/mode/clike/clike.js ***! \*****************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { -eval("// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n if (true) // CommonJS\n mod(__webpack_require__(/*! ../../lib/codemirror */ \"./node_modules/codemirror/lib/codemirror.js\"));\n else {}\n})(function(CodeMirror) {\n\"use strict\";\n\nfunction Context(indented, column, type, info, align, prev) {\n this.indented = indented;\n this.column = column;\n this.type = type;\n this.info = info;\n this.align = align;\n this.prev = prev;\n}\nfunction pushContext(state, col, type, info) {\n var indent = state.indented;\n if (state.context && state.context.type == \"statement\" && type != \"statement\")\n indent = state.context.indented;\n return state.context = new Context(indent, col, type, info, null, state.context);\n}\nfunction popContext(state) {\n var t = state.context.type;\n if (t == \")\" || t == \"]\" || t == \"}\")\n state.indented = state.context.indented;\n return state.context = state.context.prev;\n}\n\nfunction typeBefore(stream, state, pos) {\n if (state.prevToken == \"variable\" || state.prevToken == \"type\") return true;\n if (/\\S(?:[^- ]>|[*\\]])\\s*$|\\*$/.test(stream.string.slice(0, pos))) return true;\n if (state.typeAtEndOfLine && stream.column() == stream.indentation()) return true;\n}\n\nfunction isTopScope(context) {\n for (;;) {\n if (!context || context.type == \"top\") return true;\n if (context.type == \"}\" && context.prev.info != \"namespace\") return false;\n context = context.prev;\n }\n}\n\nCodeMirror.defineMode(\"clike\", function(config, parserConfig) {\n var indentUnit = config.indentUnit,\n statementIndentUnit = parserConfig.statementIndentUnit || indentUnit,\n dontAlignCalls = parserConfig.dontAlignCalls,\n keywords = parserConfig.keywords || {},\n types = parserConfig.types || {},\n builtin = parserConfig.builtin || {},\n blockKeywords = parserConfig.blockKeywords || {},\n defKeywords = parserConfig.defKeywords || {},\n atoms = parserConfig.atoms || {},\n hooks = parserConfig.hooks || {},\n multiLineStrings = parserConfig.multiLineStrings,\n indentStatements = parserConfig.indentStatements !== false,\n indentSwitch = parserConfig.indentSwitch !== false,\n namespaceSeparator = parserConfig.namespaceSeparator,\n isPunctuationChar = parserConfig.isPunctuationChar || /[\\[\\]{}\\(\\),;\\:\\.]/,\n numberStart = parserConfig.numberStart || /[\\d\\.]/,\n number = parserConfig.number || /^(?:0x[a-f\\d]+|0b[01]+|(?:\\d+\\.?\\d*|\\.\\d+)(?:e[-+]?\\d+)?)(u|ll?|l|f)?/i,\n isOperatorChar = parserConfig.isOperatorChar || /[+\\-*&%=<>!?|\\/]/,\n isIdentifierChar = parserConfig.isIdentifierChar || /[\\w\\$_\\xa1-\\uffff]/,\n // An optional function that takes a {string} token and returns true if it\n // should be treated as a builtin.\n isReservedIdentifier = parserConfig.isReservedIdentifier || false;\n\n var curPunc, isDefKeyword;\n\n function tokenBase(stream, state) {\n var ch = stream.next();\n if (hooks[ch]) {\n var result = hooks[ch](stream, state);\n if (result !== false) return result;\n }\n if (ch == '\"' || ch == \"'\") {\n state.tokenize = tokenString(ch);\n return state.tokenize(stream, state);\n }\n if (numberStart.test(ch)) {\n stream.backUp(1)\n if (stream.match(number)) return \"number\"\n stream.next()\n }\n if (isPunctuationChar.test(ch)) {\n curPunc = ch;\n return null;\n }\n if (ch == \"/\") {\n if (stream.eat(\"*\")) {\n state.tokenize = tokenComment;\n return tokenComment(stream, state);\n }\n if (stream.eat(\"/\")) {\n stream.skipToEnd();\n return \"comment\";\n }\n }\n if (isOperatorChar.test(ch)) {\n while (!stream.match(/^\\/[\\/*]/, false) && stream.eat(isOperatorChar)) {}\n return \"operator\";\n }\n stream.eatWhile(isIdentifierChar);\n if (namespaceSeparator) while (stream.match(namespaceSeparator))\n stream.eatWhile(isIdentifierChar);\n\n var cur = stream.current();\n if (contains(keywords, cur)) {\n if (contains(blockKeywords, cur)) curPunc = \"newstatement\";\n if (contains(defKeywords, cur)) isDefKeyword = true;\n return \"keyword\";\n }\n if (contains(types, cur)) return \"type\";\n if (contains(builtin, cur)\n || (isReservedIdentifier && isReservedIdentifier(cur))) {\n if (contains(blockKeywords, cur)) curPunc = \"newstatement\";\n return \"builtin\";\n }\n if (contains(atoms, cur)) return \"atom\";\n return \"variable\";\n }\n\n function tokenString(quote) {\n return function(stream, state) {\n var escaped = false, next, end = false;\n while ((next = stream.next()) != null) {\n if (next == quote && !escaped) {end = true; break;}\n escaped = !escaped && next == \"\\\\\";\n }\n if (end || !(escaped || multiLineStrings))\n state.tokenize = null;\n return \"string\";\n };\n }\n\n function tokenComment(stream, state) {\n var maybeEnd = false, ch;\n while (ch = stream.next()) {\n if (ch == \"/\" && maybeEnd) {\n state.tokenize = null;\n break;\n }\n maybeEnd = (ch == \"*\");\n }\n return \"comment\";\n }\n\n function maybeEOL(stream, state) {\n if (parserConfig.typeFirstDefinitions && stream.eol() && isTopScope(state.context))\n state.typeAtEndOfLine = typeBefore(stream, state, stream.pos)\n }\n\n // Interface\n\n return {\n startState: function(basecolumn) {\n return {\n tokenize: null,\n context: new Context((basecolumn || 0) - indentUnit, 0, \"top\", null, false),\n indented: 0,\n startOfLine: true,\n prevToken: null\n };\n },\n\n token: function(stream, state) {\n var ctx = state.context;\n if (stream.sol()) {\n if (ctx.align == null) ctx.align = false;\n state.indented = stream.indentation();\n state.startOfLine = true;\n }\n if (stream.eatSpace()) { maybeEOL(stream, state); return null; }\n curPunc = isDefKeyword = null;\n var style = (state.tokenize || tokenBase)(stream, state);\n if (style == \"comment\" || style == \"meta\") return style;\n if (ctx.align == null) ctx.align = true;\n\n if (curPunc == \";\" || curPunc == \":\" || (curPunc == \",\" && stream.match(/^\\s*(?:\\/\\/.*)?$/, false)))\n while (state.context.type == \"statement\") popContext(state);\n else if (curPunc == \"{\") pushContext(state, stream.column(), \"}\");\n else if (curPunc == \"[\") pushContext(state, stream.column(), \"]\");\n else if (curPunc == \"(\") pushContext(state, stream.column(), \")\");\n else if (curPunc == \"}\") {\n while (ctx.type == \"statement\") ctx = popContext(state);\n if (ctx.type == \"}\") ctx = popContext(state);\n while (ctx.type == \"statement\") ctx = popContext(state);\n }\n else if (curPunc == ctx.type) popContext(state);\n else if (indentStatements &&\n (((ctx.type == \"}\" || ctx.type == \"top\") && curPunc != \";\") ||\n (ctx.type == \"statement\" && curPunc == \"newstatement\"))) {\n pushContext(state, stream.column(), \"statement\", stream.current());\n }\n\n if (style == \"variable\" &&\n ((state.prevToken == \"def\" ||\n (parserConfig.typeFirstDefinitions && typeBefore(stream, state, stream.start) &&\n isTopScope(state.context) && stream.match(/^\\s*\\(/, false)))))\n style = \"def\";\n\n if (hooks.token) {\n var result = hooks.token(stream, state, style);\n if (result !== undefined) style = result;\n }\n\n if (style == \"def\" && parserConfig.styleDefs === false) style = \"variable\";\n\n state.startOfLine = false;\n state.prevToken = isDefKeyword ? \"def\" : style || curPunc;\n maybeEOL(stream, state);\n return style;\n },\n\n indent: function(state, textAfter) {\n if (state.tokenize != tokenBase && state.tokenize != null || state.typeAtEndOfLine) return CodeMirror.Pass;\n var ctx = state.context, firstChar = textAfter && textAfter.charAt(0);\n var closing = firstChar == ctx.type;\n if (ctx.type == \"statement\" && firstChar == \"}\") ctx = ctx.prev;\n if (parserConfig.dontIndentStatements)\n while (ctx.type == \"statement\" && parserConfig.dontIndentStatements.test(ctx.info))\n ctx = ctx.prev\n if (hooks.indent) {\n var hook = hooks.indent(state, ctx, textAfter, indentUnit);\n if (typeof hook == \"number\") return hook\n }\n var switchBlock = ctx.prev && ctx.prev.info == \"switch\";\n if (parserConfig.allmanIndentation && /[{(]/.test(firstChar)) {\n while (ctx.type != \"top\" && ctx.type != \"}\") ctx = ctx.prev\n return ctx.indented\n }\n if (ctx.type == \"statement\")\n return ctx.indented + (firstChar == \"{\" ? 0 : statementIndentUnit);\n if (ctx.align && (!dontAlignCalls || ctx.type != \")\"))\n return ctx.column + (closing ? 0 : 1);\n if (ctx.type == \")\" && !closing)\n return ctx.indented + statementIndentUnit;\n\n return ctx.indented + (closing ? 0 : indentUnit) +\n (!closing && switchBlock && !/^(?:case|default)\\b/.test(textAfter) ? indentUnit : 0);\n },\n\n electricInput: indentSwitch ? /^\\s*(?:case .*?:|default:|\\{\\}?|\\})$/ : /^\\s*[{}]$/,\n blockCommentStart: \"/*\",\n blockCommentEnd: \"*/\",\n blockCommentContinue: \" * \",\n lineComment: \"//\",\n fold: \"brace\"\n };\n});\n\n function words(str) {\n var obj = {}, words = str.split(\" \");\n for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n return obj;\n }\n function contains(words, word) {\n if (typeof words === \"function\") {\n return words(word);\n } else {\n return words.propertyIsEnumerable(word);\n }\n }\n var cKeywords = \"auto if break case register continue return default do sizeof \" +\n \"static else struct switch extern typedef union for goto while enum const \" +\n \"volatile inline restrict asm fortran\";\n\n // Keywords from https://en.cppreference.com/w/cpp/keyword includes C++20.\n var cppKeywords = \"alignas alignof and and_eq audit axiom bitand bitor catch \" +\n \"class compl concept constexpr const_cast decltype delete dynamic_cast \" +\n \"explicit export final friend import module mutable namespace new noexcept \" +\n \"not not_eq operator or or_eq override private protected public \" +\n \"reinterpret_cast requires static_assert static_cast template this \" +\n \"thread_local throw try typeid typename using virtual xor xor_eq\";\n\n var objCKeywords = \"bycopy byref in inout oneway out self super atomic nonatomic retain copy \" +\n \"readwrite readonly strong weak assign typeof nullable nonnull null_resettable _cmd \" +\n \"@interface @implementation @end @protocol @encode @property @synthesize @dynamic @class \" +\n \"@public @package @private @protected @required @optional @try @catch @finally @import \" +\n \"@selector @encode @defs @synchronized @autoreleasepool @compatibility_alias @available\";\n\n var objCBuiltins = \"FOUNDATION_EXPORT FOUNDATION_EXTERN NS_INLINE NS_FORMAT_FUNCTION \" +\n \" NS_RETURNS_RETAINEDNS_ERROR_ENUM NS_RETURNS_NOT_RETAINED NS_RETURNS_INNER_POINTER \" +\n \"NS_DESIGNATED_INITIALIZER NS_ENUM NS_OPTIONS NS_REQUIRES_NIL_TERMINATION \" +\n \"NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_SWIFT_NAME NS_REFINED_FOR_SWIFT\"\n\n // Do not use this. Use the cTypes function below. This is global just to avoid\n // excessive calls when cTypes is being called multiple times during a parse.\n var basicCTypes = words(\"int long char short double float unsigned signed \" +\n \"void bool\");\n\n // Do not use this. Use the objCTypes function below. This is global just to avoid\n // excessive calls when objCTypes is being called multiple times during a parse.\n var basicObjCTypes = words(\"SEL instancetype id Class Protocol BOOL\");\n\n // Returns true if identifier is a \"C\" type.\n // C type is defined as those that are reserved by the compiler (basicTypes),\n // and those that end in _t (Reserved by POSIX for types)\n // http://www.gnu.org/software/libc/manual/html_node/Reserved-Names.html\n function cTypes(identifier) {\n return contains(basicCTypes, identifier) || /.+_t$/.test(identifier);\n }\n\n // Returns true if identifier is a \"Objective C\" type.\n function objCTypes(identifier) {\n return cTypes(identifier) || contains(basicObjCTypes, identifier);\n }\n\n var cBlockKeywords = \"case do else for if switch while struct enum union\";\n var cDefKeywords = \"struct enum union\";\n\n function cppHook(stream, state) {\n if (!state.startOfLine) return false\n for (var ch, next = null; ch = stream.peek();) {\n if (ch == \"\\\\\" && stream.match(/^.$/)) {\n next = cppHook\n break\n } else if (ch == \"/\" && stream.match(/^\\/[\\/\\*]/, false)) {\n break\n }\n stream.next()\n }\n state.tokenize = next\n return \"meta\"\n }\n\n function pointerHook(_stream, state) {\n if (state.prevToken == \"type\") return \"type\";\n return false;\n }\n\n // For C and C++ (and ObjC): identifiers starting with __\n // or _ followed by a capital letter are reserved for the compiler.\n function cIsReservedIdentifier(token) {\n if (!token || token.length < 2) return false;\n if (token[0] != '_') return false;\n return (token[1] == '_') || (token[1] !== token[1].toLowerCase());\n }\n\n function cpp14Literal(stream) {\n stream.eatWhile(/[\\w\\.']/);\n return \"number\";\n }\n\n function cpp11StringHook(stream, state) {\n stream.backUp(1);\n // Raw strings.\n if (stream.match(/(R|u8R|uR|UR|LR)/)) {\n var match = stream.match(/\"([^\\s\\\\()]{0,16})\\(/);\n if (!match) {\n return false;\n }\n state.cpp11RawStringDelim = match[1];\n state.tokenize = tokenRawString;\n return tokenRawString(stream, state);\n }\n // Unicode strings/chars.\n if (stream.match(/(u8|u|U|L)/)) {\n if (stream.match(/[\"']/, /* eat */ false)) {\n return \"string\";\n }\n return false;\n }\n // Ignore this hook.\n stream.next();\n return false;\n }\n\n function cppLooksLikeConstructor(word) {\n var lastTwo = /(\\w+)::~?(\\w+)$/.exec(word);\n return lastTwo && lastTwo[1] == lastTwo[2];\n }\n\n // C#-style strings where \"\" escapes a quote.\n function tokenAtString(stream, state) {\n var next;\n while ((next = stream.next()) != null) {\n if (next == '\"' && !stream.eat('\"')) {\n state.tokenize = null;\n break;\n }\n }\n return \"string\";\n }\n\n // C++11 raw string literal is \"( anything )\", where\n // can be a string up to 16 characters long.\n function tokenRawString(stream, state) {\n // Escape characters that have special regex meanings.\n var delim = state.cpp11RawStringDelim.replace(/[^\\w\\s]/g, '\\\\$&');\n var match = stream.match(new RegExp(\".*?\\\\)\" + delim + '\"'));\n if (match)\n state.tokenize = null;\n else\n stream.skipToEnd();\n return \"string\";\n }\n\n function def(mimes, mode) {\n if (typeof mimes == \"string\") mimes = [mimes];\n var words = [];\n function add(obj) {\n if (obj) for (var prop in obj) if (obj.hasOwnProperty(prop))\n words.push(prop);\n }\n add(mode.keywords);\n add(mode.types);\n add(mode.builtin);\n add(mode.atoms);\n if (words.length) {\n mode.helperType = mimes[0];\n CodeMirror.registerHelper(\"hintWords\", mimes[0], words);\n }\n\n for (var i = 0; i < mimes.length; ++i)\n CodeMirror.defineMIME(mimes[i], mode);\n }\n\n def([\"text/x-csrc\", \"text/x-c\", \"text/x-chdr\"], {\n name: \"clike\",\n keywords: words(cKeywords),\n types: cTypes,\n blockKeywords: words(cBlockKeywords),\n defKeywords: words(cDefKeywords),\n typeFirstDefinitions: true,\n atoms: words(\"NULL true false\"),\n isReservedIdentifier: cIsReservedIdentifier,\n hooks: {\n \"#\": cppHook,\n \"*\": pointerHook,\n },\n modeProps: {fold: [\"brace\", \"include\"]}\n });\n\n def([\"text/x-c++src\", \"text/x-c++hdr\"], {\n name: \"clike\",\n keywords: words(cKeywords + \" \" + cppKeywords),\n types: cTypes,\n blockKeywords: words(cBlockKeywords + \" class try catch\"),\n defKeywords: words(cDefKeywords + \" class namespace\"),\n typeFirstDefinitions: true,\n atoms: words(\"true false NULL nullptr\"),\n dontIndentStatements: /^template$/,\n isIdentifierChar: /[\\w\\$_~\\xa1-\\uffff]/,\n isReservedIdentifier: cIsReservedIdentifier,\n hooks: {\n \"#\": cppHook,\n \"*\": pointerHook,\n \"u\": cpp11StringHook,\n \"U\": cpp11StringHook,\n \"L\": cpp11StringHook,\n \"R\": cpp11StringHook,\n \"0\": cpp14Literal,\n \"1\": cpp14Literal,\n \"2\": cpp14Literal,\n \"3\": cpp14Literal,\n \"4\": cpp14Literal,\n \"5\": cpp14Literal,\n \"6\": cpp14Literal,\n \"7\": cpp14Literal,\n \"8\": cpp14Literal,\n \"9\": cpp14Literal,\n token: function(stream, state, style) {\n if (style == \"variable\" && stream.peek() == \"(\" &&\n (state.prevToken == \";\" || state.prevToken == null ||\n state.prevToken == \"}\") &&\n cppLooksLikeConstructor(stream.current()))\n return \"def\";\n }\n },\n namespaceSeparator: \"::\",\n modeProps: {fold: [\"brace\", \"include\"]}\n });\n\n def(\"text/x-java\", {\n name: \"clike\",\n keywords: words(\"abstract assert break case catch class const continue default \" +\n \"do else enum extends final finally for goto if implements import \" +\n \"instanceof interface native new package private protected public \" +\n \"return static strictfp super switch synchronized this throw throws transient \" +\n \"try volatile while @interface\"),\n types: words(\"byte short int long float double boolean char void Boolean Byte Character Double Float \" +\n \"Integer Long Number Object Short String StringBuffer StringBuilder Void\"),\n blockKeywords: words(\"catch class do else finally for if switch try while\"),\n defKeywords: words(\"class interface enum @interface\"),\n typeFirstDefinitions: true,\n atoms: words(\"true false null\"),\n number: /^(?:0x[a-f\\d_]+|0b[01_]+|(?:[\\d_]+\\.?\\d*|\\.\\d+)(?:e[-+]?[\\d_]+)?)(u|ll?|l|f)?/i,\n hooks: {\n \"@\": function(stream) {\n // Don't match the @interface keyword.\n if (stream.match('interface', false)) return false;\n\n stream.eatWhile(/[\\w\\$_]/);\n return \"meta\";\n }\n },\n modeProps: {fold: [\"brace\", \"import\"]}\n });\n\n def(\"text/x-csharp\", {\n name: \"clike\",\n keywords: words(\"abstract as async await base break case catch checked class const continue\" +\n \" default delegate do else enum event explicit extern finally fixed for\" +\n \" foreach goto if implicit in interface internal is lock namespace new\" +\n \" operator out override params private protected public readonly ref return sealed\" +\n \" sizeof stackalloc static struct switch this throw try typeof unchecked\" +\n \" unsafe using virtual void volatile while add alias ascending descending dynamic from get\" +\n \" global group into join let orderby partial remove select set value var yield\"),\n types: words(\"Action Boolean Byte Char DateTime DateTimeOffset Decimal Double Func\" +\n \" Guid Int16 Int32 Int64 Object SByte Single String Task TimeSpan UInt16 UInt32\" +\n \" UInt64 bool byte char decimal double short int long object\" +\n \" sbyte float string ushort uint ulong\"),\n blockKeywords: words(\"catch class do else finally for foreach if struct switch try while\"),\n defKeywords: words(\"class interface namespace struct var\"),\n typeFirstDefinitions: true,\n atoms: words(\"true false null\"),\n hooks: {\n \"@\": function(stream, state) {\n if (stream.eat('\"')) {\n state.tokenize = tokenAtString;\n return tokenAtString(stream, state);\n }\n stream.eatWhile(/[\\w\\$_]/);\n return \"meta\";\n }\n }\n });\n\n function tokenTripleString(stream, state) {\n var escaped = false;\n while (!stream.eol()) {\n if (!escaped && stream.match('\"\"\"')) {\n state.tokenize = null;\n break;\n }\n escaped = stream.next() == \"\\\\\" && !escaped;\n }\n return \"string\";\n }\n\n function tokenNestedComment(depth) {\n return function (stream, state) {\n var ch\n while (ch = stream.next()) {\n if (ch == \"*\" && stream.eat(\"/\")) {\n if (depth == 1) {\n state.tokenize = null\n break\n } else {\n state.tokenize = tokenNestedComment(depth - 1)\n return state.tokenize(stream, state)\n }\n } else if (ch == \"/\" && stream.eat(\"*\")) {\n state.tokenize = tokenNestedComment(depth + 1)\n return state.tokenize(stream, state)\n }\n }\n return \"comment\"\n }\n }\n\n def(\"text/x-scala\", {\n name: \"clike\",\n keywords: words(\n /* scala */\n \"abstract case catch class def do else extends final finally for forSome if \" +\n \"implicit import lazy match new null object override package private protected return \" +\n \"sealed super this throw trait try type val var while with yield _ \" +\n\n /* package scala */\n \"assert assume require print println printf readLine readBoolean readByte readShort \" +\n \"readChar readInt readLong readFloat readDouble\"\n ),\n types: words(\n \"AnyVal App Application Array BufferedIterator BigDecimal BigInt Char Console Either \" +\n \"Enumeration Equiv Error Exception Fractional Function IndexedSeq Int Integral Iterable \" +\n \"Iterator List Map Numeric Nil NotNull Option Ordered Ordering PartialFunction PartialOrdering \" +\n \"Product Proxy Range Responder Seq Serializable Set Specializable Stream StringBuilder \" +\n \"StringContext Symbol Throwable Traversable TraversableOnce Tuple Unit Vector \" +\n\n /* package java.lang */\n \"Boolean Byte Character CharSequence Class ClassLoader Cloneable Comparable \" +\n \"Compiler Double Exception Float Integer Long Math Number Object Package Pair Process \" +\n \"Runtime Runnable SecurityManager Short StackTraceElement StrictMath String \" +\n \"StringBuffer System Thread ThreadGroup ThreadLocal Throwable Triple Void\"\n ),\n multiLineStrings: true,\n blockKeywords: words(\"catch class enum do else finally for forSome if match switch try while\"),\n defKeywords: words(\"class enum def object package trait type val var\"),\n atoms: words(\"true false null\"),\n indentStatements: false,\n indentSwitch: false,\n isOperatorChar: /[+\\-*&%=<>!?|\\/#:@]/,\n hooks: {\n \"@\": function(stream) {\n stream.eatWhile(/[\\w\\$_]/);\n return \"meta\";\n },\n '\"': function(stream, state) {\n if (!stream.match('\"\"')) return false;\n state.tokenize = tokenTripleString;\n return state.tokenize(stream, state);\n },\n \"'\": function(stream) {\n stream.eatWhile(/[\\w\\$_\\xa1-\\uffff]/);\n return \"atom\";\n },\n \"=\": function(stream, state) {\n var cx = state.context\n if (cx.type == \"}\" && cx.align && stream.eat(\">\")) {\n state.context = new Context(cx.indented, cx.column, cx.type, cx.info, null, cx.prev)\n return \"operator\"\n } else {\n return false\n }\n },\n\n \"/\": function(stream, state) {\n if (!stream.eat(\"*\")) return false\n state.tokenize = tokenNestedComment(1)\n return state.tokenize(stream, state)\n }\n },\n modeProps: {closeBrackets: {pairs: '()[]{}\"\"', triples: '\"'}}\n });\n\n function tokenKotlinString(tripleString){\n return function (stream, state) {\n var escaped = false, next, end = false;\n while (!stream.eol()) {\n if (!tripleString && !escaped && stream.match('\"') ) {end = true; break;}\n if (tripleString && stream.match('\"\"\"')) {end = true; break;}\n next = stream.next();\n if(!escaped && next == \"$\" && stream.match('{'))\n stream.skipTo(\"}\");\n escaped = !escaped && next == \"\\\\\" && !tripleString;\n }\n if (end || !tripleString)\n state.tokenize = null;\n return \"string\";\n }\n }\n\n def(\"text/x-kotlin\", {\n name: \"clike\",\n keywords: words(\n /*keywords*/\n \"package as typealias class interface this super val operator \" +\n \"var fun for is in This throw return annotation \" +\n \"break continue object if else while do try when !in !is as? \" +\n\n /*soft keywords*/\n \"file import where by get set abstract enum open inner override private public internal \" +\n \"protected catch finally out final vararg reified dynamic companion constructor init \" +\n \"sealed field property receiver param sparam lateinit data inline noinline tailrec \" +\n \"external annotation crossinline const operator infix suspend actual expect setparam\"\n ),\n types: words(\n /* package java.lang */\n \"Boolean Byte Character CharSequence Class ClassLoader Cloneable Comparable \" +\n \"Compiler Double Exception Float Integer Long Math Number Object Package Pair Process \" +\n \"Runtime Runnable SecurityManager Short StackTraceElement StrictMath String \" +\n \"StringBuffer System Thread ThreadGroup ThreadLocal Throwable Triple Void Annotation Any BooleanArray \" +\n \"ByteArray Char CharArray DeprecationLevel DoubleArray Enum FloatArray Function Int IntArray Lazy \" +\n \"LazyThreadSafetyMode LongArray Nothing ShortArray Unit\"\n ),\n intendSwitch: false,\n indentStatements: false,\n multiLineStrings: true,\n number: /^(?:0x[a-f\\d_]+|0b[01_]+|(?:[\\d_]+(\\.\\d+)?|\\.\\d+)(?:e[-+]?[\\d_]+)?)(u|ll?|l|f)?/i,\n blockKeywords: words(\"catch class do else finally for if where try while enum\"),\n defKeywords: words(\"class val var object interface fun\"),\n atoms: words(\"true false null this\"),\n hooks: {\n \"@\": function(stream) {\n stream.eatWhile(/[\\w\\$_]/);\n return \"meta\";\n },\n '*': function(_stream, state) {\n return state.prevToken == '.' ? 'variable' : 'operator';\n },\n '\"': function(stream, state) {\n state.tokenize = tokenKotlinString(stream.match('\"\"'));\n return state.tokenize(stream, state);\n },\n \"/\": function(stream, state) {\n if (!stream.eat(\"*\")) return false;\n state.tokenize = tokenNestedComment(1);\n return state.tokenize(stream, state)\n },\n indent: function(state, ctx, textAfter, indentUnit) {\n var firstChar = textAfter && textAfter.charAt(0);\n if ((state.prevToken == \"}\" || state.prevToken == \")\") && textAfter == \"\")\n return state.indented;\n if ((state.prevToken == \"operator\" && textAfter != \"}\" && state.context.type != \"}\") ||\n state.prevToken == \"variable\" && firstChar == \".\" ||\n (state.prevToken == \"}\" || state.prevToken == \")\") && firstChar == \".\")\n return indentUnit * 2 + ctx.indented;\n if (ctx.align && ctx.type == \"}\")\n return ctx.indented + (state.context.type == (textAfter || \"\").charAt(0) ? 0 : indentUnit);\n }\n },\n modeProps: {closeBrackets: {triples: '\"'}}\n });\n\n def([\"x-shader/x-vertex\", \"x-shader/x-fragment\"], {\n name: \"clike\",\n keywords: words(\"sampler1D sampler2D sampler3D samplerCube \" +\n \"sampler1DShadow sampler2DShadow \" +\n \"const attribute uniform varying \" +\n \"break continue discard return \" +\n \"for while do if else struct \" +\n \"in out inout\"),\n types: words(\"float int bool void \" +\n \"vec2 vec3 vec4 ivec2 ivec3 ivec4 bvec2 bvec3 bvec4 \" +\n \"mat2 mat3 mat4\"),\n blockKeywords: words(\"for while do if else struct\"),\n builtin: words(\"radians degrees sin cos tan asin acos atan \" +\n \"pow exp log exp2 sqrt inversesqrt \" +\n \"abs sign floor ceil fract mod min max clamp mix step smoothstep \" +\n \"length distance dot cross normalize ftransform faceforward \" +\n \"reflect refract matrixCompMult \" +\n \"lessThan lessThanEqual greaterThan greaterThanEqual \" +\n \"equal notEqual any all not \" +\n \"texture1D texture1DProj texture1DLod texture1DProjLod \" +\n \"texture2D texture2DProj texture2DLod texture2DProjLod \" +\n \"texture3D texture3DProj texture3DLod texture3DProjLod \" +\n \"textureCube textureCubeLod \" +\n \"shadow1D shadow2D shadow1DProj shadow2DProj \" +\n \"shadow1DLod shadow2DLod shadow1DProjLod shadow2DProjLod \" +\n \"dFdx dFdy fwidth \" +\n \"noise1 noise2 noise3 noise4\"),\n atoms: words(\"true false \" +\n \"gl_FragColor gl_SecondaryColor gl_Normal gl_Vertex \" +\n \"gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord3 \" +\n \"gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 \" +\n \"gl_FogCoord gl_PointCoord \" +\n \"gl_Position gl_PointSize gl_ClipVertex \" +\n \"gl_FrontColor gl_BackColor gl_FrontSecondaryColor gl_BackSecondaryColor \" +\n \"gl_TexCoord gl_FogFragCoord \" +\n \"gl_FragCoord gl_FrontFacing \" +\n \"gl_FragData gl_FragDepth \" +\n \"gl_ModelViewMatrix gl_ProjectionMatrix gl_ModelViewProjectionMatrix \" +\n \"gl_TextureMatrix gl_NormalMatrix gl_ModelViewMatrixInverse \" +\n \"gl_ProjectionMatrixInverse gl_ModelViewProjectionMatrixInverse \" +\n \"gl_TexureMatrixTranspose gl_ModelViewMatrixInverseTranspose \" +\n \"gl_ProjectionMatrixInverseTranspose \" +\n \"gl_ModelViewProjectionMatrixInverseTranspose \" +\n \"gl_TextureMatrixInverseTranspose \" +\n \"gl_NormalScale gl_DepthRange gl_ClipPlane \" +\n \"gl_Point gl_FrontMaterial gl_BackMaterial gl_LightSource gl_LightModel \" +\n \"gl_FrontLightModelProduct gl_BackLightModelProduct \" +\n \"gl_TextureColor gl_EyePlaneS gl_EyePlaneT gl_EyePlaneR gl_EyePlaneQ \" +\n \"gl_FogParameters \" +\n \"gl_MaxLights gl_MaxClipPlanes gl_MaxTextureUnits gl_MaxTextureCoords \" +\n \"gl_MaxVertexAttribs gl_MaxVertexUniformComponents gl_MaxVaryingFloats \" +\n \"gl_MaxVertexTextureImageUnits gl_MaxTextureImageUnits \" +\n \"gl_MaxFragmentUniformComponents gl_MaxCombineTextureImageUnits \" +\n \"gl_MaxDrawBuffers\"),\n indentSwitch: false,\n hooks: {\"#\": cppHook},\n modeProps: {fold: [\"brace\", \"include\"]}\n });\n\n def(\"text/x-nesc\", {\n name: \"clike\",\n keywords: words(cKeywords + \" as atomic async call command component components configuration event generic \" +\n \"implementation includes interface module new norace nx_struct nx_union post provides \" +\n \"signal task uses abstract extends\"),\n types: cTypes,\n blockKeywords: words(cBlockKeywords),\n atoms: words(\"null true false\"),\n hooks: {\"#\": cppHook},\n modeProps: {fold: [\"brace\", \"include\"]}\n });\n\n def(\"text/x-objectivec\", {\n name: \"clike\",\n keywords: words(cKeywords + \" \" + objCKeywords),\n types: objCTypes,\n builtin: words(objCBuiltins),\n blockKeywords: words(cBlockKeywords + \" @synthesize @try @catch @finally @autoreleasepool @synchronized\"),\n defKeywords: words(cDefKeywords + \" @interface @implementation @protocol @class\"),\n dontIndentStatements: /^@.*$/,\n typeFirstDefinitions: true,\n atoms: words(\"YES NO NULL Nil nil true false nullptr\"),\n isReservedIdentifier: cIsReservedIdentifier,\n hooks: {\n \"#\": cppHook,\n \"*\": pointerHook,\n },\n modeProps: {fold: [\"brace\", \"include\"]}\n });\n\n def(\"text/x-objectivec++\", {\n name: \"clike\",\n keywords: words(cKeywords + \" \" + objCKeywords + \" \" + cppKeywords),\n types: objCTypes,\n builtin: words(objCBuiltins),\n blockKeywords: words(cBlockKeywords + \" @synthesize @try @catch @finally @autoreleasepool @synchronized class try catch\"),\n defKeywords: words(cDefKeywords + \" @interface @implementation @protocol @class class namespace\"),\n dontIndentStatements: /^@.*$|^template$/,\n typeFirstDefinitions: true,\n atoms: words(\"YES NO NULL Nil nil true false nullptr\"),\n isReservedIdentifier: cIsReservedIdentifier,\n hooks: {\n \"#\": cppHook,\n \"*\": pointerHook,\n \"u\": cpp11StringHook,\n \"U\": cpp11StringHook,\n \"L\": cpp11StringHook,\n \"R\": cpp11StringHook,\n \"0\": cpp14Literal,\n \"1\": cpp14Literal,\n \"2\": cpp14Literal,\n \"3\": cpp14Literal,\n \"4\": cpp14Literal,\n \"5\": cpp14Literal,\n \"6\": cpp14Literal,\n \"7\": cpp14Literal,\n \"8\": cpp14Literal,\n \"9\": cpp14Literal,\n token: function(stream, state, style) {\n if (style == \"variable\" && stream.peek() == \"(\" &&\n (state.prevToken == \";\" || state.prevToken == null ||\n state.prevToken == \"}\") &&\n cppLooksLikeConstructor(stream.current()))\n return \"def\";\n }\n },\n namespaceSeparator: \"::\",\n modeProps: {fold: [\"brace\", \"include\"]}\n });\n\n def(\"text/x-squirrel\", {\n name: \"clike\",\n keywords: words(\"base break clone continue const default delete enum extends function in class\" +\n \" foreach local resume return this throw typeof yield constructor instanceof static\"),\n types: cTypes,\n blockKeywords: words(\"case catch class else for foreach if switch try while\"),\n defKeywords: words(\"function local class\"),\n typeFirstDefinitions: true,\n atoms: words(\"true false null\"),\n hooks: {\"#\": cppHook},\n modeProps: {fold: [\"brace\", \"include\"]}\n });\n\n // Ceylon Strings need to deal with interpolation\n var stringTokenizer = null;\n function tokenCeylonString(type) {\n return function(stream, state) {\n var escaped = false, next, end = false;\n while (!stream.eol()) {\n if (!escaped && stream.match('\"') &&\n (type == \"single\" || stream.match('\"\"'))) {\n end = true;\n break;\n }\n if (!escaped && stream.match('``')) {\n stringTokenizer = tokenCeylonString(type);\n end = true;\n break;\n }\n next = stream.next();\n escaped = type == \"single\" && !escaped && next == \"\\\\\";\n }\n if (end)\n state.tokenize = null;\n return \"string\";\n }\n }\n\n def(\"text/x-ceylon\", {\n name: \"clike\",\n keywords: words(\"abstracts alias assembly assert assign break case catch class continue dynamic else\" +\n \" exists extends finally for function given if import in interface is let module new\" +\n \" nonempty object of out outer package return satisfies super switch then this throw\" +\n \" try value void while\"),\n types: function(word) {\n // In Ceylon all identifiers that start with an uppercase are types\n var first = word.charAt(0);\n return (first === first.toUpperCase() && first !== first.toLowerCase());\n },\n blockKeywords: words(\"case catch class dynamic else finally for function if interface module new object switch try while\"),\n defKeywords: words(\"class dynamic function interface module object package value\"),\n builtin: words(\"abstract actual aliased annotation by default deprecated doc final formal late license\" +\n \" native optional sealed see serializable shared suppressWarnings tagged throws variable\"),\n isPunctuationChar: /[\\[\\]{}\\(\\),;\\:\\.`]/,\n isOperatorChar: /[+\\-*&%=<>!?|^~:\\/]/,\n numberStart: /[\\d#$]/,\n number: /^(?:#[\\da-fA-F_]+|\\$[01_]+|[\\d_]+[kMGTPmunpf]?|[\\d_]+\\.[\\d_]+(?:[eE][-+]?\\d+|[kMGTPmunpf]|)|)/i,\n multiLineStrings: true,\n typeFirstDefinitions: true,\n atoms: words(\"true false null larger smaller equal empty finished\"),\n indentSwitch: false,\n styleDefs: false,\n hooks: {\n \"@\": function(stream) {\n stream.eatWhile(/[\\w\\$_]/);\n return \"meta\";\n },\n '\"': function(stream, state) {\n state.tokenize = tokenCeylonString(stream.match('\"\"') ? \"triple\" : \"single\");\n return state.tokenize(stream, state);\n },\n '`': function(stream, state) {\n if (!stringTokenizer || !stream.match('`')) return false;\n state.tokenize = stringTokenizer;\n stringTokenizer = null;\n return state.tokenize(stream, state);\n },\n \"'\": function(stream) {\n stream.eatWhile(/[\\w\\$_\\xa1-\\uffff]/);\n return \"atom\";\n },\n token: function(_stream, state, style) {\n if ((style == \"variable\" || style == \"type\") &&\n state.prevToken == \".\") {\n return \"variable-2\";\n }\n }\n },\n modeProps: {\n fold: [\"brace\", \"import\"],\n closeBrackets: {triples: '\"'}\n }\n });\n\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vbm9kZV9tb2R1bGVzL2NvZGVtaXJyb3IvbW9kZS9jbGlrZS9jbGlrZS5qcz80YmE2Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNLElBQXVEO0FBQzdELFFBQVEsbUJBQU8sQ0FBQyx5RUFBc0I7QUFDdEMsT0FBTyxFQUdhO0FBQ3BCLENBQUM7QUFDRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUMsc0NBQXNDO0FBQ3RDLDBDQUEwQztBQUMxQyxzREFBc0Q7QUFDdEQsa0RBQWtEO0FBQ2xELHNDQUFzQztBQUN0QyxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvRUFBb0UsTUFBTTtBQUMxRTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxPQUFPO0FBQ25EO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QyxXQUFXO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4Qix5QkFBeUIsYUFBYTtBQUNwRTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx1QkFBdUI7QUFDdkI7QUFDQSw0QkFBNEIseUNBQXlDO0FBQ3JFO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0Msd0NBQXdDO0FBQ3hFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRDtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDO0FBQy9DLGtEQUFrRDtBQUNsRDtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEM7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUwsK0RBQStELEVBQUUsSUFBSSxjQUFjO0FBQ25GO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQSxnQkFBZ0I7QUFDaEIsbUJBQW1CLGtCQUFrQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw2QkFBNkIsb0JBQW9CO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxLQUFLO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsbUJBQW1CLGtCQUFrQjtBQUNyQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxnQkFBZ0I7QUFDaEIsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0M7QUFD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Y29kZW1pcnJvci9tb2RlL2NsaWtlL2NsaWtlLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnNcbi8vIERpc3RyaWJ1dGVkIHVuZGVyIGFuIE1JVCBsaWNlbnNlOiBodHRwczovL2NvZGVtaXJyb3IubmV0L0xJQ0VOU0VcblxuKGZ1bmN0aW9uKG1vZCkge1xuICBpZiAodHlwZW9mIGV4cG9ydHMgPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgbW9kdWxlID09IFwib2JqZWN0XCIpIC8vIENvbW1vbkpTXG4gICAgbW9kKHJlcXVpcmUoXCIuLi8uLi9saWIvY29kZW1pcnJvclwiKSk7XG4gIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIC8vIEFNRFxuICAgIGRlZmluZShbXCIuLi8uLi9saWIvY29kZW1pcnJvclwiXSwgbW9kKTtcbiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudlxuICAgIG1vZChDb2RlTWlycm9yKTtcbn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHtcblwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiBDb250ZXh0KGluZGVudGVkLCBjb2x1bW4sIHR5cGUsIGluZm8sIGFsaWduLCBwcmV2KSB7XG4gIHRoaXMuaW5kZW50ZWQgPSBpbmRlbnRlZDtcbiAgdGhpcy5jb2x1bW4gPSBjb2x1bW47XG4gIHRoaXMudHlwZSA9IHR5cGU7XG4gIHRoaXMuaW5mbyA9IGluZm87XG4gIHRoaXMuYWxpZ24gPSBhbGlnbjtcbiAgdGhpcy5wcmV2ID0gcHJldjtcbn1cbmZ1bmN0aW9uIHB1c2hDb250ZXh0KHN0YXRlLCBjb2wsIHR5cGUsIGluZm8pIHtcbiAgdmFyIGluZGVudCA9IHN0YXRlLmluZGVudGVkO1xuICBpZiAoc3RhdGUuY29udGV4dCAmJiBzdGF0ZS5jb250ZXh0LnR5cGUgPT0gXCJzdGF0ZW1lbnRcIiAmJiB0eXBlICE9IFwic3RhdGVtZW50XCIpXG4gICAgaW5kZW50ID0gc3RhdGUuY29udGV4dC5pbmRlbnRlZDtcbiAgcmV0dXJuIHN0YXRlLmNvbnRleHQgPSBuZXcgQ29udGV4dChpbmRlbnQsIGNvbCwgdHlwZSwgaW5mbywgbnVsbCwgc3RhdGUuY29udGV4dCk7XG59XG5mdW5jdGlvbiBwb3BDb250ZXh0KHN0YXRlKSB7XG4gIHZhciB0ID0gc3RhdGUuY29udGV4dC50eXBlO1xuICBpZiAodCA9PSBcIilcIiB8fCB0ID09IFwiXVwiIHx8IHQgPT0gXCJ9XCIpXG4gICAgc3RhdGUuaW5kZW50ZWQgPSBzdGF0ZS5jb250ZXh0LmluZGVudGVkO1xuICByZXR1cm4gc3RhdGUuY29udGV4dCA9IHN0YXRlLmNvbnRleHQucHJldjtcbn1cblxuZnVuY3Rpb24gdHlwZUJlZm9yZShzdHJlYW0sIHN0YXRlLCBwb3MpIHtcbiAgaWYgKHN0YXRlLnByZXZUb2tlbiA9PSBcInZhcmlhYmxlXCIgfHwgc3RhdGUucHJldlRva2VuID09IFwidHlwZVwiKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKC9cXFMoPzpbXi0gXT58WypcXF1dKVxccyokfFxcKiQvLnRlc3Qoc3RyZWFtLnN0cmluZy5zbGljZSgwLCBwb3MpKSkgcmV0dXJuIHRydWU7XG4gIGlmIChzdGF0ZS50eXBlQXRFbmRPZkxpbmUgJiYgc3RyZWFtLmNvbHVtbigpID09IHN0cmVhbS5pbmRlbnRhdGlvbigpKSByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaXNUb3BTY29wZShjb250ZXh0KSB7XG4gIGZvciAoOzspIHtcbiAgICBpZiAoIWNvbnRleHQgfHwgY29udGV4dC50eXBlID09IFwidG9wXCIpIHJldHVybiB0cnVlO1xuICAgIGlmIChjb250ZXh0LnR5cGUgPT0gXCJ9XCIgJiYgY29udGV4dC5wcmV2LmluZm8gIT0gXCJuYW1lc3BhY2VcIikgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnRleHQgPSBjb250ZXh0LnByZXY7XG4gIH1cbn1cblxuQ29kZU1pcnJvci5kZWZpbmVNb2RlKFwiY2xpa2VcIiwgZnVuY3Rpb24oY29uZmlnLCBwYXJzZXJDb25maWcpIHtcbiAgdmFyIGluZGVudFVuaXQgPSBjb25maWcuaW5kZW50VW5pdCxcbiAgICAgIHN0YXRlbWVudEluZGVudFVuaXQgPSBwYXJzZXJDb25maWcuc3RhdGVtZW50SW5kZW50VW5pdCB8fCBpbmRlbnRVbml0LFxuICAgICAgZG9udEFsaWduQ2FsbHMgPSBwYXJzZXJDb25maWcuZG9udEFsaWduQ2FsbHMsXG4gICAgICBrZXl3b3JkcyA9IHBhcnNlckNvbmZpZy5rZXl3b3JkcyB8fCB7fSxcbiAgICAgIHR5cGVzID0gcGFyc2VyQ29uZmlnLnR5cGVzIHx8IHt9LFxuICAgICAgYnVpbHRpbiA9IHBhcnNlckNvbmZpZy5idWlsdGluIHx8IHt9LFxuICAgICAgYmxvY2tLZXl3b3JkcyA9IHBhcnNlckNvbmZpZy5ibG9ja0tleXdvcmRzIHx8IHt9LFxuICAgICAgZGVmS2V5d29yZHMgPSBwYXJzZXJDb25maWcuZGVmS2V5d29yZHMgfHwge30sXG4gICAgICBhdG9tcyA9IHBhcnNlckNvbmZpZy5hdG9tcyB8fCB7fSxcbiAgICAgIGhvb2tzID0gcGFyc2VyQ29uZmlnLmhvb2tzIHx8IHt9LFxuICAgICAgbXVsdGlMaW5lU3RyaW5ncyA9IHBhcnNlckNvbmZpZy5tdWx0aUxpbmVTdHJpbmdzLFxuICAgICAgaW5kZW50U3RhdGVtZW50cyA9IHBhcnNlckNvbmZpZy5pbmRlbnRTdGF0ZW1lbnRzICE9PSBmYWxzZSxcbiAgICAgIGluZGVudFN3aXRjaCA9IHBhcnNlckNvbmZpZy5pbmRlbnRTd2l0Y2ggIT09IGZhbHNlLFxuICAgICAgbmFtZXNwYWNlU2VwYXJhdG9yID0gcGFyc2VyQ29uZmlnLm5hbWVzcGFjZVNlcGFyYXRvcixcbiAgICAgIGlzUHVuY3R1YXRpb25DaGFyID0gcGFyc2VyQ29uZmlnLmlzUHVuY3R1YXRpb25DaGFyIHx8IC9bXFxbXFxde31cXChcXCksO1xcOlxcLl0vLFxuICAgICAgbnVtYmVyU3RhcnQgPSBwYXJzZXJDb25maWcubnVtYmVyU3RhcnQgfHwgL1tcXGRcXC5dLyxcbiAgICAgIG51bWJlciA9IHBhcnNlckNvbmZpZy5udW1iZXIgfHwgL14oPzoweFthLWZcXGRdK3wwYlswMV0rfCg/OlxcZCtcXC4/XFxkKnxcXC5cXGQrKSg/OmVbLStdP1xcZCspPykodXxsbD98bHxmKT8vaSxcbiAgICAgIGlzT3BlcmF0b3JDaGFyID0gcGFyc2VyQ29uZmlnLmlzT3BlcmF0b3JDaGFyIHx8IC9bK1xcLSomJT08PiE/fFxcL10vLFxuICAgICAgaXNJZGVudGlmaWVyQ2hhciA9IHBhcnNlckNvbmZpZy5pc0lkZW50aWZpZXJDaGFyIHx8IC9bXFx3XFwkX1xceGExLVxcdWZmZmZdLyxcbiAgICAgIC8vIEFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSB7c3RyaW5nfSB0b2tlbiBhbmQgcmV0dXJucyB0cnVlIGlmIGl0XG4gICAgICAvLyBzaG91bGQgYmUgdHJlYXRlZCBhcyBhIGJ1aWx0aW4uXG4gICAgICBpc1Jlc2VydmVkSWRlbnRpZmllciA9IHBhcnNlckNvbmZpZy5pc1Jlc2VydmVkSWRlbnRpZmllciB8fCBmYWxzZTtcblxuICB2YXIgY3VyUHVuYywgaXNEZWZLZXl3b3JkO1xuXG4gIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7XG4gICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTtcbiAgICBpZiAoaG9va3NbY2hdKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gaG9va3NbY2hdKHN0cmVhbSwgc3RhdGUpO1xuICAgICAgaWYgKHJlc3VsdCAhPT0gZmFsc2UpIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGlmIChjaCA9PSAnXCInIHx8IGNoID09IFwiJ1wiKSB7XG4gICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuU3RyaW5nKGNoKTtcbiAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG4gICAgaWYgKG51bWJlclN0YXJ0LnRlc3QoY2gpKSB7XG4gICAgICBzdHJlYW0uYmFja1VwKDEpXG4gICAgICBpZiAoc3RyZWFtLm1hdGNoKG51bWJlcikpIHJldHVybiBcIm51bWJlclwiXG4gICAgICBzdHJlYW0ubmV4dCgpXG4gICAgfVxuICAgIGlmIChpc1B1bmN0dWF0aW9uQ2hhci50ZXN0KGNoKSkge1xuICAgICAgY3VyUHVuYyA9IGNoO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChjaCA9PSBcIi9cIikge1xuICAgICAgaWYgKHN0cmVhbS5lYXQoXCIqXCIpKSB7XG4gICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5Db21tZW50O1xuICAgICAgICByZXR1cm4gdG9rZW5Db21tZW50KHN0cmVhbSwgc3RhdGUpO1xuICAgICAgfVxuICAgICAgaWYgKHN0cmVhbS5lYXQoXCIvXCIpKSB7XG4gICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTtcbiAgICAgICAgcmV0dXJuIFwiY29tbWVudFwiO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNPcGVyYXRvckNoYXIudGVzdChjaCkpIHtcbiAgICAgIHdoaWxlICghc3RyZWFtLm1hdGNoKC9eXFwvW1xcLypdLywgZmFsc2UpICYmIHN0cmVhbS5lYXQoaXNPcGVyYXRvckNoYXIpKSB7fVxuICAgICAgcmV0dXJuIFwib3BlcmF0b3JcIjtcbiAgICB9XG4gICAgc3RyZWFtLmVhdFdoaWxlKGlzSWRlbnRpZmllckNoYXIpO1xuICAgIGlmIChuYW1lc3BhY2VTZXBhcmF0b3IpIHdoaWxlIChzdHJlYW0ubWF0Y2gobmFtZXNwYWNlU2VwYXJhdG9yKSlcbiAgICAgIHN0cmVhbS5lYXRXaGlsZShpc0lkZW50aWZpZXJDaGFyKTtcblxuICAgIHZhciBjdXIgPSBzdHJlYW0uY3VycmVudCgpO1xuICAgIGlmIChjb250YWlucyhrZXl3b3JkcywgY3VyKSkge1xuICAgICAgaWYgKGNvbnRhaW5zKGJsb2NrS2V5d29yZHMsIGN1cikpIGN1clB1bmMgPSBcIm5ld3N0YXRlbWVudFwiO1xuICAgICAgaWYgKGNvbnRhaW5zKGRlZktleXdvcmRzLCBjdXIpKSBpc0RlZktleXdvcmQgPSB0cnVlO1xuICAgICAgcmV0dXJuIFwia2V5d29yZFwiO1xuICAgIH1cbiAgICBpZiAoY29udGFpbnModHlwZXMsIGN1cikpIHJldHVybiBcInR5cGVcIjtcbiAgICBpZiAoY29udGFpbnMoYnVpbHRpbiwgY3VyKVxuICAgICAgICB8fCAoaXNSZXNlcnZlZElkZW50aWZpZXIgJiYgaXNSZXNlcnZlZElkZW50aWZpZXIoY3VyKSkpIHtcbiAgICAgIGlmIChjb250YWlucyhibG9ja0tleXdvcmRzLCBjdXIpKSBjdXJQdW5jID0gXCJuZXdzdGF0ZW1lbnRcIjtcbiAgICAgIHJldHVybiBcImJ1aWx0aW5cIjtcbiAgICB9XG4gICAgaWYgKGNvbnRhaW5zKGF0b21zLCBjdXIpKSByZXR1cm4gXCJhdG9tXCI7XG4gICAgcmV0dXJuIFwidmFyaWFibGVcIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRva2VuU3RyaW5nKHF1b3RlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHtcbiAgICAgIHZhciBlc2NhcGVkID0gZmFsc2UsIG5leHQsIGVuZCA9IGZhbHNlO1xuICAgICAgd2hpbGUgKChuZXh0ID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkge1xuICAgICAgICBpZiAobmV4dCA9PSBxdW90ZSAmJiAhZXNjYXBlZCkge2VuZCA9IHRydWU7IGJyZWFrO31cbiAgICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIG5leHQgPT0gXCJcXFxcXCI7XG4gICAgICB9XG4gICAgICBpZiAoZW5kIHx8ICEoZXNjYXBlZCB8fCBtdWx0aUxpbmVTdHJpbmdzKSlcbiAgICAgICAgc3RhdGUudG9rZW5pemUgPSBudWxsO1xuICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRva2VuQ29tbWVudChzdHJlYW0sIHN0YXRlKSB7XG4gICAgdmFyIG1heWJlRW5kID0gZmFsc2UsIGNoO1xuICAgIHdoaWxlIChjaCA9IHN0cmVhbS5uZXh0KCkpIHtcbiAgICAgIGlmIChjaCA9PSBcIi9cIiAmJiBtYXliZUVuZCkge1xuICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IG51bGw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgbWF5YmVFbmQgPSAoY2ggPT0gXCIqXCIpO1xuICAgIH1cbiAgICByZXR1cm4gXCJjb21tZW50XCI7XG4gIH1cblxuICBmdW5jdGlvbiBtYXliZUVPTChzdHJlYW0sIHN0YXRlKSB7XG4gICAgaWYgKHBhcnNlckNvbmZpZy50eXBlRmlyc3REZWZpbml0aW9ucyAmJiBzdHJlYW0uZW9sKCkgJiYgaXNUb3BTY29wZShzdGF0ZS5jb250ZXh0KSlcbiAgICAgIHN0YXRlLnR5cGVBdEVuZE9mTGluZSA9IHR5cGVCZWZvcmUoc3RyZWFtLCBzdGF0ZSwgc3RyZWFtLnBvcylcbiAgfVxuXG4gIC8vIEludGVyZmFjZVxuXG4gIHJldHVybiB7XG4gICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oYmFzZWNvbHVtbikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdG9rZW5pemU6IG51bGwsXG4gICAgICAgIGNvbnRleHQ6IG5ldyBDb250ZXh0KChiYXNlY29sdW1uIHx8IDApIC0gaW5kZW50VW5pdCwgMCwgXCJ0b3BcIiwgbnVsbCwgZmFsc2UpLFxuICAgICAgICBpbmRlbnRlZDogMCxcbiAgICAgICAgc3RhcnRPZkxpbmU6IHRydWUsXG4gICAgICAgIHByZXZUb2tlbjogbnVsbFxuICAgICAgfTtcbiAgICB9LFxuXG4gICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHtcbiAgICAgIHZhciBjdHggPSBzdGF0ZS5jb250ZXh0O1xuICAgICAgaWYgKHN0cmVhbS5zb2woKSkge1xuICAgICAgICBpZiAoY3R4LmFsaWduID09IG51bGwpIGN0eC5hbGlnbiA9IGZhbHNlO1xuICAgICAgICBzdGF0ZS5pbmRlbnRlZCA9IHN0cmVhbS5pbmRlbnRhdGlvbigpO1xuICAgICAgICBzdGF0ZS5zdGFydE9mTGluZSA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHsgbWF5YmVFT0woc3RyZWFtLCBzdGF0ZSk7IHJldHVybiBudWxsOyB9XG4gICAgICBjdXJQdW5jID0gaXNEZWZLZXl3b3JkID0gbnVsbDtcbiAgICAgIHZhciBzdHlsZSA9IChzdGF0ZS50b2tlbml6ZSB8fCB0b2tlbkJhc2UpKHN0cmVhbSwgc3RhdGUpO1xuICAgICAgaWYgKHN0eWxlID09IFwiY29tbWVudFwiIHx8IHN0eWxlID09IFwibWV0YVwiKSByZXR1cm4gc3R5bGU7XG4gICAgICBpZiAoY3R4LmFsaWduID09IG51bGwpIGN0eC5hbGlnbiA9IHRydWU7XG5cbiAgICAgIGlmIChjdXJQdW5jID09IFwiO1wiIHx8IGN1clB1bmMgPT0gXCI6XCIgfHwgKGN1clB1bmMgPT0gXCIsXCIgJiYgc3RyZWFtLm1hdGNoKC9eXFxzKig/OlxcL1xcLy4qKT8kLywgZmFsc2UpKSlcbiAgICAgICAgd2hpbGUgKHN0YXRlLmNvbnRleHQudHlwZSA9PSBcInN0YXRlbWVudFwiKSBwb3BDb250ZXh0KHN0YXRlKTtcbiAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gXCJ7XCIpIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0uY29sdW1uKCksIFwifVwiKTtcbiAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gXCJbXCIpIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0uY29sdW1uKCksIFwiXVwiKTtcbiAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gXCIoXCIpIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0uY29sdW1uKCksIFwiKVwiKTtcbiAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gXCJ9XCIpIHtcbiAgICAgICAgd2hpbGUgKGN0eC50eXBlID09IFwic3RhdGVtZW50XCIpIGN0eCA9IHBvcENvbnRleHQoc3RhdGUpO1xuICAgICAgICBpZiAoY3R4LnR5cGUgPT0gXCJ9XCIpIGN0eCA9IHBvcENvbnRleHQoc3RhdGUpO1xuICAgICAgICB3aGlsZSAoY3R4LnR5cGUgPT0gXCJzdGF0ZW1lbnRcIikgY3R4ID0gcG9wQ29udGV4dChzdGF0ZSk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChjdXJQdW5jID09IGN0eC50eXBlKSBwb3BDb250ZXh0KHN0YXRlKTtcbiAgICAgIGVsc2UgaWYgKGluZGVudFN0YXRlbWVudHMgJiZcbiAgICAgICAgICAgICAgICgoKGN0eC50eXBlID09IFwifVwiIHx8IGN0eC50eXBlID09IFwidG9wXCIpICYmIGN1clB1bmMgIT0gXCI7XCIpIHx8XG4gICAgICAgICAgICAgICAgKGN0eC50eXBlID09IFwic3RhdGVtZW50XCIgJiYgY3VyUHVuYyA9PSBcIm5ld3N0YXRlbWVudFwiKSkpIHtcbiAgICAgICAgcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbS5jb2x1bW4oKSwgXCJzdGF0ZW1lbnRcIiwgc3RyZWFtLmN1cnJlbnQoKSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdHlsZSA9PSBcInZhcmlhYmxlXCIgJiZcbiAgICAgICAgICAoKHN0YXRlLnByZXZUb2tlbiA9PSBcImRlZlwiIHx8XG4gICAgICAgICAgICAocGFyc2VyQ29uZmlnLnR5cGVGaXJzdERlZmluaXRpb25zICYmIHR5cGVCZWZvcmUoc3RyZWFtLCBzdGF0ZSwgc3RyZWFtLnN0YXJ0KSAmJlxuICAgICAgICAgICAgIGlzVG9wU2NvcGUoc3RhdGUuY29udGV4dCkgJiYgc3RyZWFtLm1hdGNoKC9eXFxzKlxcKC8sIGZhbHNlKSkpKSlcbiAgICAgICAgc3R5bGUgPSBcImRlZlwiO1xuXG4gICAgICBpZiAoaG9va3MudG9rZW4pIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGhvb2tzLnRva2VuKHN0cmVhbSwgc3RhdGUsIHN0eWxlKTtcbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSBzdHlsZSA9IHJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0eWxlID09IFwiZGVmXCIgJiYgcGFyc2VyQ29uZmlnLnN0eWxlRGVmcyA9PT0gZmFsc2UpIHN0eWxlID0gXCJ2YXJpYWJsZVwiO1xuXG4gICAgICBzdGF0ZS5zdGFydE9mTGluZSA9IGZhbHNlO1xuICAgICAgc3RhdGUucHJldlRva2VuID0gaXNEZWZLZXl3b3JkID8gXCJkZWZcIiA6IHN0eWxlIHx8IGN1clB1bmM7XG4gICAgICBtYXliZUVPTChzdHJlYW0sIHN0YXRlKTtcbiAgICAgIHJldHVybiBzdHlsZTtcbiAgICB9LFxuXG4gICAgaW5kZW50OiBmdW5jdGlvbihzdGF0ZSwgdGV4dEFmdGVyKSB7XG4gICAgICBpZiAoc3RhdGUudG9rZW5pemUgIT0gdG9rZW5CYXNlICYmIHN0YXRlLnRva2VuaXplICE9IG51bGwgfHwgc3RhdGUudHlwZUF0RW5kT2ZMaW5lKSByZXR1cm4gQ29kZU1pcnJvci5QYXNzO1xuICAgICAgdmFyIGN0eCA9IHN0YXRlLmNvbnRleHQsIGZpcnN0Q2hhciA9IHRleHRBZnRlciAmJiB0ZXh0QWZ0ZXIuY2hhckF0KDApO1xuICAgICAgdmFyIGNsb3NpbmcgPSBmaXJzdENoYXIgPT0gY3R4LnR5cGU7XG4gICAgICBpZiAoY3R4LnR5cGUgPT0gXCJzdGF0ZW1lbnRcIiAmJiBmaXJzdENoYXIgPT0gXCJ9XCIpIGN0eCA9IGN0eC5wcmV2O1xuICAgICAgaWYgKHBhcnNlckNvbmZpZy5kb250SW5kZW50U3RhdGVtZW50cylcbiAgICAgICAgd2hpbGUgKGN0eC50eXBlID09IFwic3RhdGVtZW50XCIgJiYgcGFyc2VyQ29uZmlnLmRvbnRJbmRlbnRTdGF0ZW1lbnRzLnRlc3QoY3R4LmluZm8pKVxuICAgICAgICAgIGN0eCA9IGN0eC5wcmV2XG4gICAgICBpZiAoaG9va3MuaW5kZW50KSB7XG4gICAgICAgIHZhciBob29rID0gaG9va3MuaW5kZW50KHN0YXRlLCBjdHgsIHRleHRBZnRlciwgaW5kZW50VW5pdCk7XG4gICAgICAgIGlmICh0eXBlb2YgaG9vayA9PSBcIm51bWJlclwiKSByZXR1cm4gaG9va1xuICAgICAgfVxuICAgICAgdmFyIHN3aXRjaEJsb2NrID0gY3R4LnByZXYgJiYgY3R4LnByZXYuaW5mbyA9PSBcInN3aXRjaFwiO1xuICAgICAgaWYgKHBhcnNlckNvbmZpZy5hbGxtYW5JbmRlbnRhdGlvbiAmJiAvW3soXS8udGVzdChmaXJzdENoYXIpKSB7XG4gICAgICAgIHdoaWxlIChjdHgudHlwZSAhPSBcInRvcFwiICYmIGN0eC50eXBlICE9IFwifVwiKSBjdHggPSBjdHgucHJldlxuICAgICAgICByZXR1cm4gY3R4LmluZGVudGVkXG4gICAgICB9XG4gICAgICBpZiAoY3R4LnR5cGUgPT0gXCJzdGF0ZW1lbnRcIilcbiAgICAgICAgcmV0dXJuIGN0eC5pbmRlbnRlZCArIChmaXJzdENoYXIgPT0gXCJ7XCIgPyAwIDogc3RhdGVtZW50SW5kZW50VW5pdCk7XG4gICAgICBpZiAoY3R4LmFsaWduICYmICghZG9udEFsaWduQ2FsbHMgfHwgY3R4LnR5cGUgIT0gXCIpXCIpKVxuICAgICAgICByZXR1cm4gY3R4LmNvbHVtbiArIChjbG9zaW5nID8gMCA6IDEpO1xuICAgICAgaWYgKGN0eC50eXBlID09IFwiKVwiICYmICFjbG9zaW5nKVxuICAgICAgICByZXR1cm4gY3R4LmluZGVudGVkICsgc3RhdGVtZW50SW5kZW50VW5pdDtcblxuICAgICAgcmV0dXJuIGN0eC5pbmRlbnRlZCArIChjbG9zaW5nID8gMCA6IGluZGVudFVuaXQpICtcbiAgICAgICAgKCFjbG9zaW5nICYmIHN3aXRjaEJsb2NrICYmICEvXig/OmNhc2V8ZGVmYXVsdClcXGIvLnRlc3QodGV4dEFmdGVyKSA/IGluZGVudFVuaXQgOiAwKTtcbiAgICB9LFxuXG4gICAgZWxlY3RyaWNJbnB1dDogaW5kZW50U3dpdGNoID8gL15cXHMqKD86Y2FzZSAuKj86fGRlZmF1bHQ6fFxce1xcfT98XFx9KSQvIDogL15cXHMqW3t9XSQvLFxuICAgIGJsb2NrQ29tbWVudFN0YXJ0OiBcIi8qXCIsXG4gICAgYmxvY2tDb21tZW50RW5kOiBcIiovXCIsXG4gICAgYmxvY2tDb21tZW50Q29udGludWU6IFwiICogXCIsXG4gICAgbGluZUNvbW1lbnQ6IFwiLy9cIixcbiAgICBmb2xkOiBcImJyYWNlXCJcbiAgfTtcbn0pO1xuXG4gIGZ1bmN0aW9uIHdvcmRzKHN0cikge1xuICAgIHZhciBvYmogPSB7fSwgd29yZHMgPSBzdHIuc3BsaXQoXCIgXCIpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyArK2kpIG9ialt3b3Jkc1tpXV0gPSB0cnVlO1xuICAgIHJldHVybiBvYmo7XG4gIH1cbiAgZnVuY3Rpb24gY29udGFpbnMod29yZHMsIHdvcmQpIHtcbiAgICBpZiAodHlwZW9mIHdvcmRzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiB3b3Jkcyh3b3JkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHdvcmRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKHdvcmQpO1xuICAgIH1cbiAgfVxuICB2YXIgY0tleXdvcmRzID0gXCJhdXRvIGlmIGJyZWFrIGNhc2UgcmVnaXN0ZXIgY29udGludWUgcmV0dXJuIGRlZmF1bHQgZG8gc2l6ZW9mIFwiICtcbiAgICBcInN0YXRpYyBlbHNlIHN0cnVjdCBzd2l0Y2ggZXh0ZXJuIHR5cGVkZWYgdW5pb24gZm9yIGdvdG8gd2hpbGUgZW51bSBjb25zdCBcIiArXG4gICAgXCJ2b2xhdGlsZSBpbmxpbmUgcmVzdHJpY3QgYXNtIGZvcnRyYW5cIjtcblxuICAvLyBLZXl3b3JkcyBmcm9tIGh0dHBzOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9rZXl3b3JkIGluY2x1ZGVzIEMrKzIwLlxuICB2YXIgY3BwS2V5d29yZHMgPSBcImFsaWduYXMgYWxpZ25vZiBhbmQgYW5kX2VxIGF1ZGl0IGF4aW9tIGJpdGFuZCBiaXRvciBjYXRjaCBcIiArXG4gIFwiY2xhc3MgY29tcGwgY29uY2VwdCBjb25zdGV4cHIgY29uc3RfY2FzdCBkZWNsdHlwZSBkZWxldGUgZHluYW1pY19jYXN0IFwiICtcbiAgXCJleHBsaWNpdCBleHBvcnQgZmluYWwgZnJpZW5kIGltcG9ydCBtb2R1bGUgbXV0YWJsZSBuYW1lc3BhY2UgbmV3IG5vZXhjZXB0IFwiICtcbiAgXCJub3Qgbm90X2VxIG9wZXJhdG9yIG9yIG9yX2VxIG92ZXJyaWRlIHByaXZhdGUgcHJvdGVjdGVkIHB1YmxpYyBcIiArXG4gIFwicmVpbnRlcnByZXRfY2FzdCByZXF1aXJlcyBzdGF0aWNfYXNzZXJ0IHN0YXRpY19jYXN0IHRlbXBsYXRlIHRoaXMgXCIgK1xuICBcInRocmVhZF9sb2NhbCB0aHJvdyB0cnkgdHlwZWlkIHR5cGVuYW1lIHVzaW5nIHZpcnR1YWwgeG9yIHhvcl9lcVwiO1xuXG4gIHZhciBvYmpDS2V5d29yZHMgPSBcImJ5Y29weSBieXJlZiBpbiBpbm91dCBvbmV3YXkgb3V0IHNlbGYgc3VwZXIgYXRvbWljIG5vbmF0b21pYyByZXRhaW4gY29weSBcIiArXG4gIFwicmVhZHdyaXRlIHJlYWRvbmx5IHN0cm9uZyB3ZWFrIGFzc2lnbiB0eXBlb2YgbnVsbGFibGUgbm9ubnVsbCBudWxsX3Jlc2V0dGFibGUgX2NtZCBcIiArXG4gIFwiQGludGVyZmFjZSBAaW1wbGVtZW50YXRpb24gQGVuZCBAcHJvdG9jb2wgQGVuY29kZSBAcHJvcGVydHkgQHN5bnRoZXNpemUgQGR5bmFtaWMgQGNsYXNzIFwiICtcbiAgXCJAcHVibGljIEBwYWNrYWdlIEBwcml2YXRlIEBwcm90ZWN0ZWQgQHJlcXVpcmVkIEBvcHRpb25hbCBAdHJ5IEBjYXRjaCBAZmluYWxseSBAaW1wb3J0IFwiICtcbiAgXCJAc2VsZWN0b3IgQGVuY29kZSBAZGVmcyBAc3luY2hyb25pemVkIEBhdXRvcmVsZWFzZXBvb2wgQGNvbXBhdGliaWxpdHlfYWxpYXMgQGF2YWlsYWJsZVwiO1xuXG4gIHZhciBvYmpDQnVpbHRpbnMgPSBcIkZPVU5EQVRJT05fRVhQT1JUIEZPVU5EQVRJT05fRVhURVJOIE5TX0lOTElORSBOU19GT1JNQVRfRlVOQ1RJT04gXCIgK1xuICBcIiBOU19SRVRVUk5TX1JFVEFJTkVETlNfRVJST1JfRU5VTSBOU19SRVRVUk5TX05PVF9SRVRBSU5FRCBOU19SRVRVUk5TX0lOTkVSX1BPSU5URVIgXCIgK1xuICBcIk5TX0RFU0lHTkFURURfSU5JVElBTElaRVIgTlNfRU5VTSBOU19PUFRJT05TIE5TX1JFUVVJUkVTX05JTF9URVJNSU5BVElPTiBcIiArXG4gIFwiTlNfQVNTVU1FX05PTk5VTExfQkVHSU4gTlNfQVNTVU1FX05PTk5VTExfRU5EIE5TX1NXSUZUX05BTUUgTlNfUkVGSU5FRF9GT1JfU1dJRlRcIlxuXG4gIC8vIERvIG5vdCB1c2UgdGhpcy4gVXNlIHRoZSBjVHlwZXMgZnVuY3Rpb24gYmVsb3cuIFRoaXMgaXMgZ2xvYmFsIGp1c3QgdG8gYXZvaWRcbiAgLy8gZXhjZXNzaXZlIGNhbGxzIHdoZW4gY1R5cGVzIGlzIGJlaW5nIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBkdXJpbmcgYSBwYXJzZS5cbiAgdmFyIGJhc2ljQ1R5cGVzID0gd29yZHMoXCJpbnQgbG9uZyBjaGFyIHNob3J0IGRvdWJsZSBmbG9hdCB1bnNpZ25lZCBzaWduZWQgXCIgK1xuICAgIFwidm9pZCBib29sXCIpO1xuXG4gIC8vIERvIG5vdCB1c2UgdGhpcy4gVXNlIHRoZSBvYmpDVHlwZXMgZnVuY3Rpb24gYmVsb3cuIFRoaXMgaXMgZ2xvYmFsIGp1c3QgdG8gYXZvaWRcbiAgLy8gZXhjZXNzaXZlIGNhbGxzIHdoZW4gb2JqQ1R5cGVzIGlzIGJlaW5nIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBkdXJpbmcgYSBwYXJzZS5cbiAgdmFyIGJhc2ljT2JqQ1R5cGVzID0gd29yZHMoXCJTRUwgaW5zdGFuY2V0eXBlIGlkIENsYXNzIFByb3RvY29sIEJPT0xcIik7XG5cbiAgLy8gUmV0dXJucyB0cnVlIGlmIGlkZW50aWZpZXIgaXMgYSBcIkNcIiB0eXBlLlxuICAvLyBDIHR5cGUgaXMgZGVmaW5lZCBhcyB0aG9zZSB0aGF0IGFyZSByZXNlcnZlZCBieSB0aGUgY29tcGlsZXIgKGJhc2ljVHlwZXMpLFxuICAvLyBhbmQgdGhvc2UgdGhhdCBlbmQgaW4gX3QgKFJlc2VydmVkIGJ5IFBPU0lYIGZvciB0eXBlcylcbiAgLy8gaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2xpYmMvbWFudWFsL2h0bWxfbm9kZS9SZXNlcnZlZC1OYW1lcy5odG1sXG4gIGZ1bmN0aW9uIGNUeXBlcyhpZGVudGlmaWVyKSB7XG4gICAgcmV0dXJuIGNvbnRhaW5zKGJhc2ljQ1R5cGVzLCBpZGVudGlmaWVyKSB8fCAvLitfdCQvLnRlc3QoaWRlbnRpZmllcik7XG4gIH1cblxuICAvLyBSZXR1cm5zIHRydWUgaWYgaWRlbnRpZmllciBpcyBhIFwiT2JqZWN0aXZlIENcIiB0eXBlLlxuICBmdW5jdGlvbiBvYmpDVHlwZXMoaWRlbnRpZmllcikge1xuICAgIHJldHVybiBjVHlwZXMoaWRlbnRpZmllcikgfHwgY29udGFpbnMoYmFzaWNPYmpDVHlwZXMsIGlkZW50aWZpZXIpO1xuICB9XG5cbiAgdmFyIGNCbG9ja0tleXdvcmRzID0gXCJjYXNlIGRvIGVsc2UgZm9yIGlmIHN3aXRjaCB3aGlsZSBzdHJ1Y3QgZW51bSB1bmlvblwiO1xuICB2YXIgY0RlZktleXdvcmRzID0gXCJzdHJ1Y3QgZW51bSB1bmlvblwiO1xuXG4gIGZ1bmN0aW9uIGNwcEhvb2soc3RyZWFtLCBzdGF0ZSkge1xuICAgIGlmICghc3RhdGUuc3RhcnRPZkxpbmUpIHJldHVybiBmYWxzZVxuICAgIGZvciAodmFyIGNoLCBuZXh0ID0gbnVsbDsgY2ggPSBzdHJlYW0ucGVlaygpOykge1xuICAgICAgaWYgKGNoID09IFwiXFxcXFwiICYmIHN0cmVhbS5tYXRjaCgvXi4kLykpIHtcbiAgICAgICAgbmV4dCA9IGNwcEhvb2tcbiAgICAgICAgYnJlYWtcbiAgICAgIH0gZWxzZSBpZiAoY2ggPT0gXCIvXCIgJiYgc3RyZWFtLm1hdGNoKC9eXFwvW1xcL1xcKl0vLCBmYWxzZSkpIHtcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIHN0cmVhbS5uZXh0KClcbiAgICB9XG4gICAgc3RhdGUudG9rZW5pemUgPSBuZXh0XG4gICAgcmV0dXJuIFwibWV0YVwiXG4gIH1cblxuICBmdW5jdGlvbiBwb2ludGVySG9vayhfc3RyZWFtLCBzdGF0ZSkge1xuICAgIGlmIChzdGF0ZS5wcmV2VG9rZW4gPT0gXCJ0eXBlXCIpIHJldHVybiBcInR5cGVcIjtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBGb3IgQyBhbmQgQysrIChhbmQgT2JqQyk6IGlkZW50aWZpZXJzIHN0YXJ0aW5nIHdpdGggX19cbiAgLy8gb3IgXyBmb2xsb3dlZCBieSBhIGNhcGl0YWwgbGV0dGVyIGFyZSByZXNlcnZlZCBmb3IgdGhlIGNvbXBpbGVyLlxuICBmdW5jdGlvbiBjSXNSZXNlcnZlZElkZW50aWZpZXIodG9rZW4pIHtcbiAgICBpZiAoIXRva2VuIHx8IHRva2VuLmxlbmd0aCA8IDIpIHJldHVybiBmYWxzZTtcbiAgICBpZiAodG9rZW5bMF0gIT0gJ18nKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuICh0b2tlblsxXSA9PSAnXycpIHx8ICh0b2tlblsxXSAhPT0gdG9rZW5bMV0udG9Mb3dlckNhc2UoKSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcHAxNExpdGVyYWwoc3RyZWFtKSB7XG4gICAgc3RyZWFtLmVhdFdoaWxlKC9bXFx3XFwuJ10vKTtcbiAgICByZXR1cm4gXCJudW1iZXJcIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNwcDExU3RyaW5nSG9vayhzdHJlYW0sIHN0YXRlKSB7XG4gICAgc3RyZWFtLmJhY2tVcCgxKTtcbiAgICAvLyBSYXcgc3RyaW5ncy5cbiAgICBpZiAoc3RyZWFtLm1hdGNoKC8oUnx1OFJ8dVJ8VVJ8TFIpLykpIHtcbiAgICAgIHZhciBtYXRjaCA9IHN0cmVhbS5tYXRjaCgvXCIoW15cXHNcXFxcKCldezAsMTZ9KVxcKC8pO1xuICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBzdGF0ZS5jcHAxMVJhd1N0cmluZ0RlbGltID0gbWF0Y2hbMV07XG4gICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuUmF3U3RyaW5nO1xuICAgICAgcmV0dXJuIHRva2VuUmF3U3RyaW5nKHN0cmVhbSwgc3RhdGUpO1xuICAgIH1cbiAgICAvLyBVbmljb2RlIHN0cmluZ3MvY2hhcnMuXG4gICAgaWYgKHN0cmVhbS5tYXRjaCgvKHU4fHV8VXxMKS8pKSB7XG4gICAgICBpZiAoc3RyZWFtLm1hdGNoKC9bXCInXS8sIC8qIGVhdCAqLyBmYWxzZSkpIHtcbiAgICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIElnbm9yZSB0aGlzIGhvb2suXG4gICAgc3RyZWFtLm5leHQoKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmdW5jdGlvbiBjcHBMb29rc0xpa2VDb25zdHJ1Y3Rvcih3b3JkKSB7XG4gICAgdmFyIGxhc3RUd28gPSAvKFxcdyspOjp+PyhcXHcrKSQvLmV4ZWMod29yZCk7XG4gICAgcmV0dXJuIGxhc3RUd28gJiYgbGFzdFR3b1sxXSA9PSBsYXN0VHdvWzJdO1xuICB9XG5cbiAgLy8gQyMtc3R5bGUgc3RyaW5ncyB3aGVyZSBcIlwiIGVzY2FwZXMgYSBxdW90ZS5cbiAgZnVuY3Rpb24gdG9rZW5BdFN0cmluZyhzdHJlYW0sIHN0YXRlKSB7XG4gICAgdmFyIG5leHQ7XG4gICAgd2hpbGUgKChuZXh0ID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkge1xuICAgICAgaWYgKG5leHQgPT0gJ1wiJyAmJiAhc3RyZWFtLmVhdCgnXCInKSkge1xuICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IG51bGw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgfVxuXG4gIC8vIEMrKzExIHJhdyBzdHJpbmcgbGl0ZXJhbCBpcyA8cHJlZml4PlwiPGRlbGltPiggYW55dGhpbmcgKTxkZWxpbT5cIiwgd2hlcmVcbiAgLy8gPGRlbGltPiBjYW4gYmUgYSBzdHJpbmcgdXAgdG8gMTYgY2hhcmFjdGVycyBsb25nLlxuICBmdW5jdGlvbiB0b2tlblJhd1N0cmluZyhzdHJlYW0sIHN0YXRlKSB7XG4gICAgLy8gRXNjYXBlIGNoYXJhY3RlcnMgdGhhdCBoYXZlIHNwZWNpYWwgcmVnZXggbWVhbmluZ3MuXG4gICAgdmFyIGRlbGltID0gc3RhdGUuY3BwMTFSYXdTdHJpbmdEZWxpbS5yZXBsYWNlKC9bXlxcd1xcc10vZywgJ1xcXFwkJicpO1xuICAgIHZhciBtYXRjaCA9IHN0cmVhbS5tYXRjaChuZXcgUmVnRXhwKFwiLio/XFxcXClcIiArIGRlbGltICsgJ1wiJykpO1xuICAgIGlmIChtYXRjaClcbiAgICAgIHN0YXRlLnRva2VuaXplID0gbnVsbDtcbiAgICBlbHNlXG4gICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7XG4gICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gIH1cblxuICBmdW5jdGlvbiBkZWYobWltZXMsIG1vZGUpIHtcbiAgICBpZiAodHlwZW9mIG1pbWVzID09IFwic3RyaW5nXCIpIG1pbWVzID0gW21pbWVzXTtcbiAgICB2YXIgd29yZHMgPSBbXTtcbiAgICBmdW5jdGlvbiBhZGQob2JqKSB7XG4gICAgICBpZiAob2JqKSBmb3IgKHZhciBwcm9wIGluIG9iaikgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShwcm9wKSlcbiAgICAgICAgd29yZHMucHVzaChwcm9wKTtcbiAgICB9XG4gICAgYWRkKG1vZGUua2V5d29yZHMpO1xuICAgIGFkZChtb2RlLnR5cGVzKTtcbiAgICBhZGQobW9kZS5idWlsdGluKTtcbiAgICBhZGQobW9kZS5hdG9tcyk7XG4gICAgaWYgKHdvcmRzLmxlbmd0aCkge1xuICAgICAgbW9kZS5oZWxwZXJUeXBlID0gbWltZXNbMF07XG4gICAgICBDb2RlTWlycm9yLnJlZ2lzdGVySGVscGVyKFwiaGludFdvcmRzXCIsIG1pbWVzWzBdLCB3b3Jkcyk7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtaW1lcy5sZW5ndGg7ICsraSlcbiAgICAgIENvZGVNaXJyb3IuZGVmaW5lTUlNRShtaW1lc1tpXSwgbW9kZSk7XG4gIH1cblxuICBkZWYoW1widGV4dC94LWNzcmNcIiwgXCJ0ZXh0L3gtY1wiLCBcInRleHQveC1jaGRyXCJdLCB7XG4gICAgbmFtZTogXCJjbGlrZVwiLFxuICAgIGtleXdvcmRzOiB3b3JkcyhjS2V5d29yZHMpLFxuICAgIHR5cGVzOiBjVHlwZXMsXG4gICAgYmxvY2tLZXl3b3Jkczogd29yZHMoY0Jsb2NrS2V5d29yZHMpLFxuICAgIGRlZktleXdvcmRzOiB3b3JkcyhjRGVmS2V5d29yZHMpLFxuICAgIHR5cGVGaXJzdERlZmluaXRpb25zOiB0cnVlLFxuICAgIGF0b21zOiB3b3JkcyhcIk5VTEwgdHJ1ZSBmYWxzZVwiKSxcbiAgICBpc1Jlc2VydmVkSWRlbnRpZmllcjogY0lzUmVzZXJ2ZWRJZGVudGlmaWVyLFxuICAgIGhvb2tzOiB7XG4gICAgICBcIiNcIjogY3BwSG9vayxcbiAgICAgIFwiKlwiOiBwb2ludGVySG9vayxcbiAgICB9LFxuICAgIG1vZGVQcm9wczoge2ZvbGQ6IFtcImJyYWNlXCIsIFwiaW5jbHVkZVwiXX1cbiAgfSk7XG5cbiAgZGVmKFtcInRleHQveC1jKytzcmNcIiwgXCJ0ZXh0L3gtYysraGRyXCJdLCB7XG4gICAgbmFtZTogXCJjbGlrZVwiLFxuICAgIGtleXdvcmRzOiB3b3JkcyhjS2V5d29yZHMgKyBcIiBcIiArIGNwcEtleXdvcmRzKSxcbiAgICB0eXBlczogY1R5cGVzLFxuICAgIGJsb2NrS2V5d29yZHM6IHdvcmRzKGNCbG9ja0tleXdvcmRzICsgXCIgY2xhc3MgdHJ5IGNhdGNoXCIpLFxuICAgIGRlZktleXdvcmRzOiB3b3JkcyhjRGVmS2V5d29yZHMgKyBcIiBjbGFzcyBuYW1lc3BhY2VcIiksXG4gICAgdHlwZUZpcnN0RGVmaW5pdGlvbnM6IHRydWUsXG4gICAgYXRvbXM6IHdvcmRzKFwidHJ1ZSBmYWxzZSBOVUxMIG51bGxwdHJcIiksXG4gICAgZG9udEluZGVudFN0YXRlbWVudHM6IC9edGVtcGxhdGUkLyxcbiAgICBpc0lkZW50aWZpZXJDaGFyOiAvW1xcd1xcJF9+XFx4YTEtXFx1ZmZmZl0vLFxuICAgIGlzUmVzZXJ2ZWRJZGVudGlmaWVyOiBjSXNSZXNlcnZlZElkZW50aWZpZXIsXG4gICAgaG9va3M6IHtcbiAgICAgIFwiI1wiOiBjcHBIb29rLFxuICAgICAgXCIqXCI6IHBvaW50ZXJIb29rLFxuICAgICAgXCJ1XCI6IGNwcDExU3RyaW5nSG9vayxcbiAgICAgIFwiVVwiOiBjcHAxMVN0cmluZ0hvb2ssXG4gICAgICBcIkxcIjogY3BwMTFTdHJpbmdIb29rLFxuICAgICAgXCJSXCI6IGNwcDExU3RyaW5nSG9vayxcbiAgICAgIFwiMFwiOiBjcHAxNExpdGVyYWwsXG4gICAgICBcIjFcIjogY3BwMTRMaXRlcmFsLFxuICAgICAgXCIyXCI6IGNwcDE0TGl0ZXJhbCxcbiAgICAgIFwiM1wiOiBjcHAxNExpdGVyYWwsXG4gICAgICBcIjRcIjogY3BwMTRMaXRlcmFsLFxuICAgICAgXCI1XCI6IGNwcDE0TGl0ZXJhbCxcbiAgICAgIFwiNlwiOiBjcHAxNExpdGVyYWwsXG4gICAgICBcIjdcIjogY3BwMTRMaXRlcmFsLFxuICAgICAgXCI4XCI6IGNwcDE0TGl0ZXJhbCxcbiAgICAgIFwiOVwiOiBjcHAxNExpdGVyYWwsXG4gICAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSwgc3R5bGUpIHtcbiAgICAgICAgaWYgKHN0eWxlID09IFwidmFyaWFibGVcIiAmJiBzdHJlYW0ucGVlaygpID09IFwiKFwiICYmXG4gICAgICAgICAgICAoc3RhdGUucHJldlRva2VuID09IFwiO1wiIHx8IHN0YXRlLnByZXZUb2tlbiA9PSBudWxsIHx8XG4gICAgICAgICAgICAgc3RhdGUucHJldlRva2VuID09IFwifVwiKSAmJlxuICAgICAgICAgICAgY3BwTG9va3NMaWtlQ29uc3RydWN0b3Ioc3RyZWFtLmN1cnJlbnQoKSkpXG4gICAgICAgICAgcmV0dXJuIFwiZGVmXCI7XG4gICAgICB9XG4gICAgfSxcbiAgICBuYW1lc3BhY2VTZXBhcmF0b3I6IFwiOjpcIixcbiAgICBtb2RlUHJvcHM6IHtmb2xkOiBbXCJicmFjZVwiLCBcImluY2x1ZGVcIl19XG4gIH0pO1xuXG4gIGRlZihcInRleHQveC1qYXZhXCIsIHtcbiAgICBuYW1lOiBcImNsaWtlXCIsXG4gICAga2V5d29yZHM6IHdvcmRzKFwiYWJzdHJhY3QgYXNzZXJ0IGJyZWFrIGNhc2UgY2F0Y2ggY2xhc3MgY29uc3QgY29udGludWUgZGVmYXVsdCBcIiArXG4gICAgICAgICAgICAgICAgICAgIFwiZG8gZWxzZSBlbnVtIGV4dGVuZHMgZmluYWwgZmluYWxseSBmb3IgZ290byBpZiBpbXBsZW1lbnRzIGltcG9ydCBcIiArXG4gICAgICAgICAgICAgICAgICAgIFwiaW5zdGFuY2VvZiBpbnRlcmZhY2UgbmF0aXZlIG5ldyBwYWNrYWdlIHByaXZhdGUgcHJvdGVjdGVkIHB1YmxpYyBcIiArXG4gICAgICAgICAgICAgICAgICAgIFwicmV0dXJuIHN0YXRpYyBzdHJpY3RmcCBzdXBlciBzd2l0Y2ggc3luY2hyb25pemVkIHRoaXMgdGhyb3cgdGhyb3dzIHRyYW5zaWVudCBcIiArXG4gICAgICAgICAgICAgICAgICAgIFwidHJ5IHZvbGF0aWxlIHdoaWxlIEBpbnRlcmZhY2VcIiksXG4gICAgdHlwZXM6IHdvcmRzKFwiYnl0ZSBzaG9ydCBpbnQgbG9uZyBmbG9hdCBkb3VibGUgYm9vbGVhbiBjaGFyIHZvaWQgQm9vbGVhbiBCeXRlIENoYXJhY3RlciBEb3VibGUgRmxvYXQgXCIgK1xuICAgICAgICAgICAgICAgICBcIkludGVnZXIgTG9uZyBOdW1iZXIgT2JqZWN0IFNob3J0IFN0cmluZyBTdHJpbmdCdWZmZXIgU3RyaW5nQnVpbGRlciBWb2lkXCIpLFxuICAgIGJsb2NrS2V5d29yZHM6IHdvcmRzKFwiY2F0Y2ggY2xhc3MgZG8gZWxzZSBmaW5hbGx5IGZvciBpZiBzd2l0Y2ggdHJ5IHdoaWxlXCIpLFxuICAgIGRlZktleXdvcmRzOiB3b3JkcyhcImNsYXNzIGludGVyZmFjZSBlbnVtIEBpbnRlcmZhY2VcIiksXG4gICAgdHlwZUZpcnN0RGVmaW5pdGlvbnM6IHRydWUsXG4gICAgYXRvbXM6IHdvcmRzKFwidHJ1ZSBmYWxzZSBudWxsXCIpLFxuICAgIG51bWJlcjogL14oPzoweFthLWZcXGRfXSt8MGJbMDFfXSt8KD86W1xcZF9dK1xcLj9cXGQqfFxcLlxcZCspKD86ZVstK10/W1xcZF9dKyk/KSh1fGxsP3xsfGYpPy9pLFxuICAgIGhvb2tzOiB7XG4gICAgICBcIkBcIjogZnVuY3Rpb24oc3RyZWFtKSB7XG4gICAgICAgIC8vIERvbid0IG1hdGNoIHRoZSBAaW50ZXJmYWNlIGtleXdvcmQuXG4gICAgICAgIGlmIChzdHJlYW0ubWF0Y2goJ2ludGVyZmFjZScsIGZhbHNlKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1xcd1xcJF9dLyk7XG4gICAgICAgIHJldHVybiBcIm1ldGFcIjtcbiAgICAgIH1cbiAgICB9LFxuICAgIG1vZGVQcm9wczoge2ZvbGQ6IFtcImJyYWNlXCIsIFwiaW1wb3J0XCJdfVxuICB9KTtcblxuICBkZWYoXCJ0ZXh0L3gtY3NoYXJwXCIsIHtcbiAgICBuYW1lOiBcImNsaWtlXCIsXG4gICAga2V5d29yZHM6IHdvcmRzKFwiYWJzdHJhY3QgYXMgYXN5bmMgYXdhaXQgYmFzZSBicmVhayBjYXNlIGNhdGNoIGNoZWNrZWQgY2xhc3MgY29uc3QgY29udGludWVcIiArXG4gICAgICAgICAgICAgICAgICAgIFwiIGRlZmF1bHQgZGVsZWdhdGUgZG8gZWxzZSBlbnVtIGV2ZW50IGV4cGxpY2l0IGV4dGVybiBmaW5hbGx5IGZpeGVkIGZvclwiICtcbiAgICAgICAgICAgICAgICAgICAgXCIgZm9yZWFjaCBnb3RvIGlmIGltcGxpY2l0IGluIGludGVyZmFjZSBpbnRlcm5hbCBpcyBsb2NrIG5hbWVzcGFjZSBuZXdcIiArXG4gICAgICAgICAgICAgICAgICAgIFwiIG9wZXJhdG9yIG91dCBvdmVycmlkZSBwYXJhbXMgcHJpdmF0ZSBwcm90ZWN0ZWQgcHVibGljIHJlYWRvbmx5IHJlZiByZXR1cm4gc2VhbGVkXCIgK1xuICAgICAgICAgICAgICAgICAgICBcIiBzaXplb2Ygc3RhY2thbGxvYyBzdGF0aWMgc3RydWN0IHN3aXRjaCB0aGlzIHRocm93IHRyeSB0eXBlb2YgdW5jaGVja2VkXCIgK1xuICAgICAgICAgICAgICAgICAgICBcIiB1bnNhZmUgdXNpbmcgdmlydHVhbCB2b2lkIHZvbGF0aWxlIHdoaWxlIGFkZCBhbGlhcyBhc2NlbmRpbmcgZGVzY2VuZGluZyBkeW5hbWljIGZyb20gZ2V0XCIgK1xuICAgICAgICAgICAgICAgICAgICBcIiBnbG9iYWwgZ3JvdXAgaW50byBqb2luIGxldCBvcmRlcmJ5IHBhcnRpYWwgcmVtb3ZlIHNlbGVjdCBzZXQgdmFsdWUgdmFyIHlpZWxkXCIpLFxuICAgIHR5cGVzOiB3b3JkcyhcIkFjdGlvbiBCb29sZWFuIEJ5dGUgQ2hhciBEYXRlVGltZSBEYXRlVGltZU9mZnNldCBEZWNpbWFsIERvdWJsZSBGdW5jXCIgK1xuICAgICAgICAgICAgICAgICBcIiBHdWlkIEludDE2IEludDMyIEludDY0IE9iamVjdCBTQnl0ZSBTaW5nbGUgU3RyaW5nIFRhc2sgVGltZVNwYW4gVUludDE2IFVJbnQzMlwiICtcbiAgICAgICAgICAgICAgICAgXCIgVUludDY0IGJvb2wgYnl0ZSBjaGFyIGRlY2ltYWwgZG91YmxlIHNob3J0IGludCBsb25nIG9iamVjdFwiICArXG4gICAgICAgICAgICAgICAgIFwiIHNieXRlIGZsb2F0IHN0cmluZyB1c2hvcnQgdWludCB1bG9uZ1wiKSxcbiAgICBibG9ja0tleXdvcmRzOiB3b3JkcyhcImNhdGNoIGNsYXNzIGRvIGVsc2UgZmluYWxseSBmb3IgZm9yZWFjaCBpZiBzdHJ1Y3Qgc3dpdGNoIHRyeSB3aGlsZVwiKSxcbiAgICBkZWZLZXl3b3Jkczogd29yZHMoXCJjbGFzcyBpbnRlcmZhY2UgbmFtZXNwYWNlIHN0cnVjdCB2YXJcIiksXG4gICAgdHlwZUZpcnN0RGVmaW5pdGlvbnM6IHRydWUsXG4gICAgYXRvbXM6IHdvcmRzKFwidHJ1ZSBmYWxzZSBudWxsXCIpLFxuICAgIGhvb2tzOiB7XG4gICAgICBcIkBcIjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkge1xuICAgICAgICBpZiAoc3RyZWFtLmVhdCgnXCInKSkge1xuICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5BdFN0cmluZztcbiAgICAgICAgICByZXR1cm4gdG9rZW5BdFN0cmluZyhzdHJlYW0sIHN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcXHdcXCRfXS8pO1xuICAgICAgICByZXR1cm4gXCJtZXRhXCI7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBmdW5jdGlvbiB0b2tlblRyaXBsZVN0cmluZyhzdHJlYW0sIHN0YXRlKSB7XG4gICAgdmFyIGVzY2FwZWQgPSBmYWxzZTtcbiAgICB3aGlsZSAoIXN0cmVhbS5lb2woKSkge1xuICAgICAgaWYgKCFlc2NhcGVkICYmIHN0cmVhbS5tYXRjaCgnXCJcIlwiJykpIHtcbiAgICAgICAgc3RhdGUudG9rZW5pemUgPSBudWxsO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGVzY2FwZWQgPSBzdHJlYW0ubmV4dCgpID09IFwiXFxcXFwiICYmICFlc2NhcGVkO1xuICAgIH1cbiAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRva2VuTmVzdGVkQ29tbWVudChkZXB0aCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoc3RyZWFtLCBzdGF0ZSkge1xuICAgICAgdmFyIGNoXG4gICAgICB3aGlsZSAoY2ggPSBzdHJlYW0ubmV4dCgpKSB7XG4gICAgICAgIGlmIChjaCA9PSBcIipcIiAmJiBzdHJlYW0uZWF0KFwiL1wiKSkge1xuICAgICAgICAgIGlmIChkZXB0aCA9PSAxKSB7XG4gICAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IG51bGxcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5OZXN0ZWRDb21tZW50KGRlcHRoIC0gMSlcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChjaCA9PSBcIi9cIiAmJiBzdHJlYW0uZWF0KFwiKlwiKSkge1xuICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5OZXN0ZWRDb21tZW50KGRlcHRoICsgMSlcbiAgICAgICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIFwiY29tbWVudFwiXG4gICAgfVxuICB9XG5cbiAgZGVmKFwidGV4dC94LXNjYWxhXCIsIHtcbiAgICBuYW1lOiBcImNsaWtlXCIsXG4gICAga2V5d29yZHM6IHdvcmRzKFxuICAgICAgLyogc2NhbGEgKi9cbiAgICAgIFwiYWJzdHJhY3QgY2FzZSBjYXRjaCBjbGFzcyBkZWYgZG8gZWxzZSBleHRlbmRzIGZpbmFsIGZpbmFsbHkgZm9yIGZvclNvbWUgaWYgXCIgK1xuICAgICAgXCJpbXBsaWNpdCBpbXBvcnQgbGF6eSBtYXRjaCBuZXcgbnVsbCBvYmplY3Qgb3ZlcnJpZGUgcGFja2FnZSBwcml2YXRlIHByb3RlY3RlZCByZXR1cm4gXCIgK1xuICAgICAgXCJzZWFsZWQgc3VwZXIgdGhpcyB0aHJvdyB0cmFpdCB0cnkgdHlwZSB2YWwgdmFyIHdoaWxlIHdpdGggeWllbGQgXyBcIiArXG5cbiAgICAgIC8qIHBhY2thZ2Ugc2NhbGEgKi9cbiAgICAgIFwiYXNzZXJ0IGFzc3VtZSByZXF1aXJlIHByaW50IHByaW50bG4gcHJpbnRmIHJlYWRMaW5lIHJlYWRCb29sZWFuIHJlYWRCeXRlIHJlYWRTaG9ydCBcIiArXG4gICAgICBcInJlYWRDaGFyIHJlYWRJbnQgcmVhZExvbmcgcmVhZEZsb2F0IHJlYWREb3VibGVcIlxuICAgICksXG4gICAgdHlwZXM6IHdvcmRzKFxuICAgICAgXCJBbnlWYWwgQXBwIEFwcGxpY2F0aW9uIEFycmF5IEJ1ZmZlcmVkSXRlcmF0b3IgQmlnRGVjaW1hbCBCaWdJbnQgQ2hhciBDb25zb2xlIEVpdGhlciBcIiArXG4gICAgICBcIkVudW1lcmF0aW9uIEVxdWl2IEVycm9yIEV4Y2VwdGlvbiBGcmFjdGlvbmFsIEZ1bmN0aW9uIEluZGV4ZWRTZXEgSW50IEludGVncmFsIEl0ZXJhYmxlIFwiICtcbiAgICAgIFwiSXRlcmF0b3IgTGlzdCBNYXAgTnVtZXJpYyBOaWwgTm90TnVsbCBPcHRpb24gT3JkZXJlZCBPcmRlcmluZyBQYXJ0aWFsRnVuY3Rpb24gUGFydGlhbE9yZGVyaW5nIFwiICtcbiAgICAgIFwiUHJvZHVjdCBQcm94eSBSYW5nZSBSZXNwb25kZXIgU2VxIFNlcmlhbGl6YWJsZSBTZXQgU3BlY2lhbGl6YWJsZSBTdHJlYW0gU3RyaW5nQnVpbGRlciBcIiArXG4gICAgICBcIlN0cmluZ0NvbnRleHQgU3ltYm9sIFRocm93YWJsZSBUcmF2ZXJzYWJsZSBUcmF2ZXJzYWJsZU9uY2UgVHVwbGUgVW5pdCBWZWN0b3IgXCIgK1xuXG4gICAgICAvKiBwYWNrYWdlIGphdmEubGFuZyAqL1xuICAgICAgXCJCb29sZWFuIEJ5dGUgQ2hhcmFjdGVyIENoYXJTZXF1ZW5jZSBDbGFzcyBDbGFzc0xvYWRlciBDbG9uZWFibGUgQ29tcGFyYWJsZSBcIiArXG4gICAgICBcIkNvbXBpbGVyIERvdWJsZSBFeGNlcHRpb24gRmxvYXQgSW50ZWdlciBMb25nIE1hdGggTnVtYmVyIE9iamVjdCBQYWNrYWdlIFBhaXIgUHJvY2VzcyBcIiArXG4gICAgICBcIlJ1bnRpbWUgUnVubmFibGUgU2VjdXJpdHlNYW5hZ2VyIFNob3J0IFN0YWNrVHJhY2VFbGVtZW50IFN0cmljdE1hdGggU3RyaW5nIFwiICtcbiAgICAgIFwiU3RyaW5nQnVmZmVyIFN5c3RlbSBUaHJlYWQgVGhyZWFkR3JvdXAgVGhyZWFkTG9jYWwgVGhyb3dhYmxlIFRyaXBsZSBWb2lkXCJcbiAgICApLFxuICAgIG11bHRpTGluZVN0cmluZ3M6IHRydWUsXG4gICAgYmxvY2tLZXl3b3Jkczogd29yZHMoXCJjYXRjaCBjbGFzcyBlbnVtIGRvIGVsc2UgZmluYWxseSBmb3IgZm9yU29tZSBpZiBtYXRjaCBzd2l0Y2ggdHJ5IHdoaWxlXCIpLFxuICAgIGRlZktleXdvcmRzOiB3b3JkcyhcImNsYXNzIGVudW0gZGVmIG9iamVjdCBwYWNrYWdlIHRyYWl0IHR5cGUgdmFsIHZhclwiKSxcbiAgICBhdG9tczogd29yZHMoXCJ0cnVlIGZhbHNlIG51bGxcIiksXG4gICAgaW5kZW50U3RhdGVtZW50czogZmFsc2UsXG4gICAgaW5kZW50U3dpdGNoOiBmYWxzZSxcbiAgICBpc09wZXJhdG9yQ2hhcjogL1srXFwtKiYlPTw+IT98XFwvIzpAXS8sXG4gICAgaG9va3M6IHtcbiAgICAgIFwiQFwiOiBmdW5jdGlvbihzdHJlYW0pIHtcbiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXFx3XFwkX10vKTtcbiAgICAgICAgcmV0dXJuIFwibWV0YVwiO1xuICAgICAgfSxcbiAgICAgICdcIic6IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHtcbiAgICAgICAgaWYgKCFzdHJlYW0ubWF0Y2goJ1wiXCInKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuVHJpcGxlU3RyaW5nO1xuICAgICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7XG4gICAgICB9LFxuICAgICAgXCInXCI6IGZ1bmN0aW9uKHN0cmVhbSkge1xuICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcXHdcXCRfXFx4YTEtXFx1ZmZmZl0vKTtcbiAgICAgICAgcmV0dXJuIFwiYXRvbVwiO1xuICAgICAgfSxcbiAgICAgIFwiPVwiOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7XG4gICAgICAgIHZhciBjeCA9IHN0YXRlLmNvbnRleHRcbiAgICAgICAgaWYgKGN4LnR5cGUgPT0gXCJ9XCIgJiYgY3guYWxpZ24gJiYgc3RyZWFtLmVhdChcIj5cIikpIHtcbiAgICAgICAgICBzdGF0ZS5jb250ZXh0ID0gbmV3IENvbnRleHQoY3guaW5kZW50ZWQsIGN4LmNvbHVtbiwgY3gudHlwZSwgY3guaW5mbywgbnVsbCwgY3gucHJldilcbiAgICAgICAgICByZXR1cm4gXCJvcGVyYXRvclwiXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIFwiL1wiOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7XG4gICAgICAgIGlmICghc3RyZWFtLmVhdChcIipcIikpIHJldHVybiBmYWxzZVxuICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuTmVzdGVkQ29tbWVudCgxKVxuICAgICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSlcbiAgICAgIH1cbiAgICB9LFxuICAgIG1vZGVQcm9wczoge2Nsb3NlQnJhY2tldHM6IHtwYWlyczogJygpW117fVwiXCInLCB0cmlwbGVzOiAnXCInfX1cbiAgfSk7XG5cbiAgZnVuY3Rpb24gdG9rZW5Lb3RsaW5TdHJpbmcodHJpcGxlU3RyaW5nKXtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHN0cmVhbSwgc3RhdGUpIHtcbiAgICAgIHZhciBlc2NhcGVkID0gZmFsc2UsIG5leHQsIGVuZCA9IGZhbHNlO1xuICAgICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkpIHtcbiAgICAgICAgaWYgKCF0cmlwbGVTdHJpbmcgJiYgIWVzY2FwZWQgJiYgc3RyZWFtLm1hdGNoKCdcIicpICkge2VuZCA9IHRydWU7IGJyZWFrO31cbiAgICAgICAgaWYgKHRyaXBsZVN0cmluZyAmJiBzdHJlYW0ubWF0Y2goJ1wiXCJcIicpKSB7ZW5kID0gdHJ1ZTsgYnJlYWs7fVxuICAgICAgICBuZXh0ID0gc3RyZWFtLm5leHQoKTtcbiAgICAgICAgaWYoIWVzY2FwZWQgJiYgbmV4dCA9PSBcIiRcIiAmJiBzdHJlYW0ubWF0Y2goJ3snKSlcbiAgICAgICAgICBzdHJlYW0uc2tpcFRvKFwifVwiKTtcbiAgICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIG5leHQgPT0gXCJcXFxcXCIgJiYgIXRyaXBsZVN0cmluZztcbiAgICAgIH1cbiAgICAgIGlmIChlbmQgfHwgIXRyaXBsZVN0cmluZylcbiAgICAgICAgc3RhdGUudG9rZW5pemUgPSBudWxsO1xuICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gICAgfVxuICB9XG5cbiAgZGVmKFwidGV4dC94LWtvdGxpblwiLCB7XG4gICAgbmFtZTogXCJjbGlrZVwiLFxuICAgIGtleXdvcmRzOiB3b3JkcyhcbiAgICAgIC8qa2V5d29yZHMqL1xuICAgICAgXCJwYWNrYWdlIGFzIHR5cGVhbGlhcyBjbGFzcyBpbnRlcmZhY2UgdGhpcyBzdXBlciB2YWwgb3BlcmF0b3IgXCIgK1xuICAgICAgXCJ2YXIgZnVuIGZvciBpcyBpbiBUaGlzIHRocm93IHJldHVybiBhbm5vdGF0aW9uIFwiICtcbiAgICAgIFwiYnJlYWsgY29udGludWUgb2JqZWN0IGlmIGVsc2Ugd2hpbGUgZG8gdHJ5IHdoZW4gIWluICFpcyBhcz8gXCIgK1xuXG4gICAgICAvKnNvZnQga2V5d29yZHMqL1xuICAgICAgXCJmaWxlIGltcG9ydCB3aGVyZSBieSBnZXQgc2V0IGFic3RyYWN0IGVudW0gb3BlbiBpbm5lciBvdmVycmlkZSBwcml2YXRlIHB1YmxpYyBpbnRlcm5hbCBcIiArXG4gICAgICBcInByb3RlY3RlZCBjYXRjaCBmaW5hbGx5IG91dCBmaW5hbCB2YXJhcmcgcmVpZmllZCBkeW5hbWljIGNvbXBhbmlvbiBjb25zdHJ1Y3RvciBpbml0IFwiICtcbiAgICAgIFwic2VhbGVkIGZpZWxkIHByb3BlcnR5IHJlY2VpdmVyIHBhcmFtIHNwYXJhbSBsYXRlaW5pdCBkYXRhIGlubGluZSBub2lubGluZSB0YWlscmVjIFwiICtcbiAgICAgIFwiZXh0ZXJuYWwgYW5ub3RhdGlvbiBjcm9zc2lubGluZSBjb25zdCBvcGVyYXRvciBpbmZpeCBzdXNwZW5kIGFjdHVhbCBleHBlY3Qgc2V0cGFyYW1cIlxuICAgICksXG4gICAgdHlwZXM6IHdvcmRzKFxuICAgICAgLyogcGFja2FnZSBqYXZhLmxhbmcgKi9cbiAgICAgIFwiQm9vbGVhbiBCeXRlIENoYXJhY3RlciBDaGFyU2VxdWVuY2UgQ2xhc3MgQ2xhc3NMb2FkZXIgQ2xvbmVhYmxlIENvbXBhcmFibGUgXCIgK1xuICAgICAgXCJDb21waWxlciBEb3VibGUgRXhjZXB0aW9uIEZsb2F0IEludGVnZXIgTG9uZyBNYXRoIE51bWJlciBPYmplY3QgUGFja2FnZSBQYWlyIFByb2Nlc3MgXCIgK1xuICAgICAgXCJSdW50aW1lIFJ1bm5hYmxlIFNlY3VyaXR5TWFuYWdlciBTaG9ydCBTdGFja1RyYWNlRWxlbWVudCBTdHJpY3RNYXRoIFN0cmluZyBcIiArXG4gICAgICBcIlN0cmluZ0J1ZmZlciBTeXN0ZW0gVGhyZWFkIFRocmVhZEdyb3VwIFRocmVhZExvY2FsIFRocm93YWJsZSBUcmlwbGUgVm9pZCBBbm5vdGF0aW9uIEFueSBCb29sZWFuQXJyYXkgXCIgK1xuICAgICAgXCJCeXRlQXJyYXkgQ2hhciBDaGFyQXJyYXkgRGVwcmVjYXRpb25MZXZlbCBEb3VibGVBcnJheSBFbnVtIEZsb2F0QXJyYXkgRnVuY3Rpb24gSW50IEludEFycmF5IExhenkgXCIgK1xuICAgICAgXCJMYXp5VGhyZWFkU2FmZXR5TW9kZSBMb25nQXJyYXkgTm90aGluZyBTaG9ydEFycmF5IFVuaXRcIlxuICAgICksXG4gICAgaW50ZW5kU3dpdGNoOiBmYWxzZSxcbiAgICBpbmRlbnRTdGF0ZW1lbnRzOiBmYWxzZSxcbiAgICBtdWx0aUxpbmVTdHJpbmdzOiB0cnVlLFxuICAgIG51bWJlcjogL14oPzoweFthLWZcXGRfXSt8MGJbMDFfXSt8KD86W1xcZF9dKyhcXC5cXGQrKT98XFwuXFxkKykoPzplWy0rXT9bXFxkX10rKT8pKHV8bGw/fGx8Zik/L2ksXG4gICAgYmxvY2tLZXl3b3Jkczogd29yZHMoXCJjYXRjaCBjbGFzcyBkbyBlbHNlIGZpbmFsbHkgZm9yIGlmIHdoZXJlIHRyeSB3aGlsZSBlbnVtXCIpLFxuICAgIGRlZktleXdvcmRzOiB3b3JkcyhcImNsYXNzIHZhbCB2YXIgb2JqZWN0IGludGVyZmFjZSBmdW5cIiksXG4gICAgYXRvbXM6IHdvcmRzKFwidHJ1ZSBmYWxzZSBudWxsIHRoaXNcIiksXG4gICAgaG9va3M6IHtcbiAgICAgIFwiQFwiOiBmdW5jdGlvbihzdHJlYW0pIHtcbiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXFx3XFwkX10vKTtcbiAgICAgICAgcmV0dXJuIFwibWV0YVwiO1xuICAgICAgfSxcbiAgICAgICcqJzogZnVuY3Rpb24oX3N0cmVhbSwgc3RhdGUpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlLnByZXZUb2tlbiA9PSAnLicgPyAndmFyaWFibGUnIDogJ29wZXJhdG9yJztcbiAgICAgIH0sXG4gICAgICAnXCInOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7XG4gICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5Lb3RsaW5TdHJpbmcoc3RyZWFtLm1hdGNoKCdcIlwiJykpO1xuICAgICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7XG4gICAgICB9LFxuICAgICAgXCIvXCI6IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHtcbiAgICAgICAgaWYgKCFzdHJlYW0uZWF0KFwiKlwiKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuTmVzdGVkQ29tbWVudCgxKTtcbiAgICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpXG4gICAgICB9LFxuICAgICAgaW5kZW50OiBmdW5jdGlvbihzdGF0ZSwgY3R4LCB0ZXh0QWZ0ZXIsIGluZGVudFVuaXQpIHtcbiAgICAgICAgdmFyIGZpcnN0Q2hhciA9IHRleHRBZnRlciAmJiB0ZXh0QWZ0ZXIuY2hhckF0KDApO1xuICAgICAgICBpZiAoKHN0YXRlLnByZXZUb2tlbiA9PSBcIn1cIiB8fCBzdGF0ZS5wcmV2VG9rZW4gPT0gXCIpXCIpICYmIHRleHRBZnRlciA9PSBcIlwiKVxuICAgICAgICAgIHJldHVybiBzdGF0ZS5pbmRlbnRlZDtcbiAgICAgICAgaWYgKChzdGF0ZS5wcmV2VG9rZW4gPT0gXCJvcGVyYXRvclwiICYmIHRleHRBZnRlciAhPSBcIn1cIiAmJiBzdGF0ZS5jb250ZXh0LnR5cGUgIT0gXCJ9XCIpIHx8XG4gICAgICAgICAgc3RhdGUucHJldlRva2VuID09IFwidmFyaWFibGVcIiAmJiBmaXJzdENoYXIgPT0gXCIuXCIgfHxcbiAgICAgICAgICAoc3RhdGUucHJldlRva2VuID09IFwifVwiIHx8IHN0YXRlLnByZXZUb2tlbiA9PSBcIilcIikgJiYgZmlyc3RDaGFyID09IFwiLlwiKVxuICAgICAgICAgIHJldHVybiBpbmRlbnRVbml0ICogMiArIGN0eC5pbmRlbnRlZDtcbiAgICAgICAgaWYgKGN0eC5hbGlnbiAmJiBjdHgudHlwZSA9PSBcIn1cIilcbiAgICAgICAgICByZXR1cm4gY3R4LmluZGVudGVkICsgKHN0YXRlLmNvbnRleHQudHlwZSA9PSAodGV4dEFmdGVyIHx8IFwiXCIpLmNoYXJBdCgwKSA/IDAgOiBpbmRlbnRVbml0KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG1vZGVQcm9wczoge2Nsb3NlQnJhY2tldHM6IHt0cmlwbGVzOiAnXCInfX1cbiAgfSk7XG5cbiAgZGVmKFtcIngtc2hhZGVyL3gtdmVydGV4XCIsIFwieC1zaGFkZXIveC1mcmFnbWVudFwiXSwge1xuICAgIG5hbWU6IFwiY2xpa2VcIixcbiAgICBrZXl3b3Jkczogd29yZHMoXCJzYW1wbGVyMUQgc2FtcGxlcjJEIHNhbXBsZXIzRCBzYW1wbGVyQ3ViZSBcIiArXG4gICAgICAgICAgICAgICAgICAgIFwic2FtcGxlcjFEU2hhZG93IHNhbXBsZXIyRFNoYWRvdyBcIiArXG4gICAgICAgICAgICAgICAgICAgIFwiY29uc3QgYXR0cmlidXRlIHVuaWZvcm0gdmFyeWluZyBcIiArXG4gICAgICAgICAgICAgICAgICAgIFwiYnJlYWsgY29udGludWUgZGlzY2FyZCByZXR1cm4gXCIgK1xuICAgICAgICAgICAgICAgICAgICBcImZvciB3aGlsZSBkbyBpZiBlbHNlIHN0cnVjdCBcIiArXG4gICAgICAgICAgICAgICAgICAgIFwiaW4gb3V0IGlub3V0XCIpLFxuICAgIHR5cGVzOiB3b3JkcyhcImZsb2F0IGludCBib29sIHZvaWQgXCIgK1xuICAgICAgICAgICAgICAgICBcInZlYzIgdmVjMyB2ZWM0IGl2ZWMyIGl2ZWMzIGl2ZWM0IGJ2ZWMyIGJ2ZWMzIGJ2ZWM0IFwiICtcbiAgICAgICAgICAgICAgICAgXCJtYXQyIG1hdDMgbWF0NFwiKSxcbiAgICBibG9ja0tleXdvcmRzOiB3b3JkcyhcImZvciB3aGlsZSBkbyBpZiBlbHNlIHN0cnVjdFwiKSxcbiAgICBidWlsdGluOiB3b3JkcyhcInJhZGlhbnMgZGVncmVlcyBzaW4gY29zIHRhbiBhc2luIGFjb3MgYXRhbiBcIiArXG4gICAgICAgICAgICAgICAgICAgIFwicG93IGV4cCBsb2cgZXhwMiBzcXJ0IGludmVyc2VzcXJ0IFwiICtcbiAgICAgICAgICAgICAgICAgICAgXCJhYnMgc2lnbiBmbG9vciBjZWlsIGZyYWN0IG1vZCBtaW4gbWF4IGNsYW1wIG1peCBzdGVwIHNtb290aHN0ZXAgXCIgK1xuICAgICAgICAgICAgICAgICAgICBcImxlbmd0aCBkaXN0YW5jZSBkb3QgY3Jvc3Mgbm9ybWFsaXplIGZ0cmFuc2Zvcm0gZmFjZWZvcndhcmQgXCIgK1xuICAgICAgICAgICAgICAgICAgICBcInJlZmxlY3QgcmVmcmFjdCBtYXRyaXhDb21wTXVsdCBcIiArXG4gICAgICAgICAgICAgICAgICAgIFwibGVzc1RoYW4gbGVzc1RoYW5FcXVhbCBncmVhdGVyVGhhbiBncmVhdGVyVGhhbkVxdWFsIFwiICtcbiAgICAgICAgICAgICAgICAgICAgXCJlcXVhbCBub3RFcXVhbCBhbnkgYWxsIG5vdCBcIiArXG4gICAgICAgICAgICAgICAgICAgIFwidGV4dHVyZTFEIHRleHR1cmUxRFByb2ogdGV4dHVyZTFETG9kIHRleHR1cmUxRFByb2pMb2QgXCIgK1xuICAgICAgICAgICAgICAgICAgICBcInRleHR1cmUyRCB0ZXh0dXJlMkRQcm9qIHRleHR1cmUyRExvZCB0ZXh0dXJlMkRQcm9qTG9kIFwiICtcbiAgICAgICAgICAgICAgICAgICAgXCJ0ZXh0dXJlM0QgdGV4dHVyZTNEUHJvaiB0ZXh0dXJlM0RMb2QgdGV4dHVyZTNEUHJvakxvZCBcIiArXG4gICAgICAgICAgICAgICAgICAgIFwidGV4dHVyZUN1YmUgdGV4dHVyZUN1YmVMb2QgXCIgK1xuICAgICAgICAgICAgICAgICAgICBcInNoYWRvdzFEIHNoYWRvdzJEIHNoYWRvdzFEUHJvaiBzaGFkb3cyRFByb2ogXCIgK1xuICAgICAgICAgICAgICAgICAgICBcInNoYWRvdzFETG9kIHNoYWRvdzJETG9kIHNoYWRvdzFEUHJvakxvZCBzaGFkb3cyRFByb2pMb2QgXCIgK1xuICAgICAgICAgICAgICAgICAgICBcImRGZHggZEZkeSBmd2lkdGggXCIgK1xuICAgICAgICAgICAgICAgICAgICBcIm5vaXNlMSBub2lzZTIgbm9pc2UzIG5vaXNlNFwiKSxcbiAgICBhdG9tczogd29yZHMoXCJ0cnVlIGZhbHNlIFwiICtcbiAgICAgICAgICAgICAgICBcImdsX0ZyYWdDb2xvciBnbF9TZWNvbmRhcnlDb2xvciBnbF9Ob3JtYWwgZ2xfVmVydGV4IFwiICtcbiAgICAgICAgICAgICAgICBcImdsX011bHRpVGV4Q29vcmQwIGdsX011bHRpVGV4Q29vcmQxIGdsX011bHRpVGV4Q29vcmQyIGdsX011bHRpVGV4Q29vcmQzIFwiICtcbiAgICAgICAgICAgICAgICBcImdsX011bHRpVGV4Q29vcmQ0IGdsX011bHRpVGV4Q29vcmQ1IGdsX011bHRpVGV4Q29vcmQ2IGdsX011bHRpVGV4Q29vcmQ3IFwiICtcbiAgICAgICAgICAgICAgICBcImdsX0ZvZ0Nvb3JkIGdsX1BvaW50Q29vcmQgXCIgK1xuICAgICAgICAgICAgICAgIFwiZ2xfUG9zaXRpb24gZ2xfUG9pbnRTaXplIGdsX0NsaXBWZXJ0ZXggXCIgK1xuICAgICAgICAgICAgICAgIFwiZ2xfRnJvbnRDb2xvciBnbF9CYWNrQ29sb3IgZ2xfRnJvbnRTZWNvbmRhcnlDb2xvciBnbF9CYWNrU2Vjb25kYXJ5Q29sb3IgXCIgK1xuICAgICAgICAgICAgICAgIFwiZ2xfVGV4Q29vcmQgZ2xfRm9nRnJhZ0Nvb3JkIFwiICtcbiAgICAgICAgICAgICAgICBcImdsX0ZyYWdDb29yZCBnbF9Gcm9udEZhY2luZyBcIiArXG4gICAgICAgICAgICAgICAgXCJnbF9GcmFnRGF0YSBnbF9GcmFnRGVwdGggXCIgK1xuICAgICAgICAgICAgICAgIFwiZ2xfTW9kZWxWaWV3TWF0cml4IGdsX1Byb2plY3Rpb25NYXRyaXggZ2xfTW9kZWxWaWV3UHJvamVjdGlvbk1hdHJpeCBcIiArXG4gICAgICAgICAgICAgICAgXCJnbF9UZXh0dXJlTWF0cml4IGdsX05vcm1hbE1hdHJpeCBnbF9Nb2RlbFZpZXdNYXRyaXhJbnZlcnNlIFwiICtcbiAgICAgICAgICAgICAgICBcImdsX1Byb2plY3Rpb25NYXRyaXhJbnZlcnNlIGdsX01vZGVsVmlld1Byb2plY3Rpb25NYXRyaXhJbnZlcnNlIFwiICtcbiAgICAgICAgICAgICAgICBcImdsX1RleHVyZU1hdHJpeFRyYW5zcG9zZSBnbF9Nb2RlbFZpZXdNYXRyaXhJbnZlcnNlVHJhbnNwb3NlIFwiICtcbiAgICAgICAgICAgICAgICBcImdsX1Byb2plY3Rpb25NYXRyaXhJbnZlcnNlVHJhbnNwb3NlIFwiICtcbiAgICAgICAgICAgICAgICBcImdsX01vZGVsVmlld1Byb2plY3Rpb25NYXRyaXhJbnZlcnNlVHJhbnNwb3NlIFwiICtcbiAgICAgICAgICAgICAgICBcImdsX1RleHR1cmVNYXRyaXhJbnZlcnNlVHJhbnNwb3NlIFwiICtcbiAgICAgICAgICAgICAgICBcImdsX05vcm1hbFNjYWxlIGdsX0RlcHRoUmFuZ2UgZ2xfQ2xpcFBsYW5lIFwiICtcbiAgICAgICAgICAgICAgICBcImdsX1BvaW50IGdsX0Zyb250TWF0ZXJpYWwgZ2xfQmFja01hdGVyaWFsIGdsX0xpZ2h0U291cmNlIGdsX0xpZ2h0TW9kZWwgXCIgK1xuICAgICAgICAgICAgICAgIFwiZ2xfRnJvbnRMaWdodE1vZGVsUHJvZHVjdCBnbF9CYWNrTGlnaHRNb2RlbFByb2R1Y3QgXCIgK1xuICAgICAgICAgICAgICAgIFwiZ2xfVGV4dHVyZUNvbG9yIGdsX0V5ZVBsYW5lUyBnbF9FeWVQbGFuZVQgZ2xfRXllUGxhbmVSIGdsX0V5ZVBsYW5lUSBcIiArXG4gICAgICAgICAgICAgICAgXCJnbF9Gb2dQYXJhbWV0ZXJzIFwiICtcbiAgICAgICAgICAgICAgICBcImdsX01heExpZ2h0cyBnbF9NYXhDbGlwUGxhbmVzIGdsX01heFRleHR1cmVVbml0cyBnbF9NYXhUZXh0dXJlQ29vcmRzIFwiICtcbiAgICAgICAgICAgICAgICBcImdsX01heFZlcnRleEF0dHJpYnMgZ2xfTWF4VmVydGV4VW5pZm9ybUNvbXBvbmVudHMgZ2xfTWF4VmFyeWluZ0Zsb2F0cyBcIiArXG4gICAgICAgICAgICAgICAgXCJnbF9NYXhWZXJ0ZXhUZXh0dXJlSW1hZ2VVbml0cyBnbF9NYXhUZXh0dXJlSW1hZ2VVbml0cyBcIiArXG4gICAgICAgICAgICAgICAgXCJnbF9NYXhGcmFnbWVudFVuaWZvcm1Db21wb25lbnRzIGdsX01heENvbWJpbmVUZXh0dXJlSW1hZ2VVbml0cyBcIiArXG4gICAgICAgICAgICAgICAgXCJnbF9NYXhEcmF3QnVmZmVyc1wiKSxcbiAgICBpbmRlbnRTd2l0Y2g6IGZhbHNlLFxuICAgIGhvb2tzOiB7XCIjXCI6IGNwcEhvb2t9LFxuICAgIG1vZGVQcm9wczoge2ZvbGQ6IFtcImJyYWNlXCIsIFwiaW5jbHVkZVwiXX1cbiAgfSk7XG5cbiAgZGVmKFwidGV4dC94LW5lc2NcIiwge1xuICAgIG5hbWU6IFwiY2xpa2VcIixcbiAgICBrZXl3b3Jkczogd29yZHMoY0tleXdvcmRzICsgXCIgYXMgYXRvbWljIGFzeW5jIGNhbGwgY29tbWFuZCBjb21wb25lbnQgY29tcG9uZW50cyBjb25maWd1cmF0aW9uIGV2ZW50IGdlbmVyaWMgXCIgK1xuICAgICAgICAgICAgICAgICAgICBcImltcGxlbWVudGF0aW9uIGluY2x1ZGVzIGludGVyZmFjZSBtb2R1bGUgbmV3IG5vcmFjZSBueF9zdHJ1Y3QgbnhfdW5pb24gcG9zdCBwcm92aWRlcyBcIiArXG4gICAgICAgICAgICAgICAgICAgIFwic2lnbmFsIHRhc2sgdXNlcyBhYnN0cmFjdCBleHRlbmRzXCIpLFxuICAgIHR5cGVzOiBjVHlwZXMsXG4gICAgYmxvY2tLZXl3b3Jkczogd29yZHMoY0Jsb2NrS2V5d29yZHMpLFxuICAgIGF0b21zOiB3b3JkcyhcIm51bGwgdHJ1ZSBmYWxzZVwiKSxcbiAgICBob29rczoge1wiI1wiOiBjcHBIb29rfSxcbiAgICBtb2RlUHJvcHM6IHtmb2xkOiBbXCJicmFjZVwiLCBcImluY2x1ZGVcIl19XG4gIH0pO1xuXG4gIGRlZihcInRleHQveC1vYmplY3RpdmVjXCIsIHtcbiAgICBuYW1lOiBcImNsaWtlXCIsXG4gICAga2V5d29yZHM6IHdvcmRzKGNLZXl3b3JkcyArIFwiIFwiICsgb2JqQ0tleXdvcmRzKSxcbiAgICB0eXBlczogb2JqQ1R5cGVzLFxuICAgIGJ1aWx0aW46IHdvcmRzKG9iakNCdWlsdGlucyksXG4gICAgYmxvY2tLZXl3b3Jkczogd29yZHMoY0Jsb2NrS2V5d29yZHMgKyBcIiBAc3ludGhlc2l6ZSBAdHJ5IEBjYXRjaCBAZmluYWxseSBAYXV0b3JlbGVhc2Vwb29sIEBzeW5jaHJvbml6ZWRcIiksXG4gICAgZGVmS2V5d29yZHM6IHdvcmRzKGNEZWZLZXl3b3JkcyArIFwiIEBpbnRlcmZhY2UgQGltcGxlbWVudGF0aW9uIEBwcm90b2NvbCBAY2xhc3NcIiksXG4gICAgZG9udEluZGVudFN0YXRlbWVudHM6IC9eQC4qJC8sXG4gICAgdHlwZUZpcnN0RGVmaW5pdGlvbnM6IHRydWUsXG4gICAgYXRvbXM6IHdvcmRzKFwiWUVTIE5PIE5VTEwgTmlsIG5pbCB0cnVlIGZhbHNlIG51bGxwdHJcIiksXG4gICAgaXNSZXNlcnZlZElkZW50aWZpZXI6IGNJc1Jlc2VydmVkSWRlbnRpZmllcixcbiAgICBob29rczoge1xuICAgICAgXCIjXCI6IGNwcEhvb2ssXG4gICAgICBcIipcIjogcG9pbnRlckhvb2ssXG4gICAgfSxcbiAgICBtb2RlUHJvcHM6IHtmb2xkOiBbXCJicmFjZVwiLCBcImluY2x1ZGVcIl19XG4gIH0pO1xuXG4gIGRlZihcInRleHQveC1vYmplY3RpdmVjKytcIiwge1xuICAgIG5hbWU6IFwiY2xpa2VcIixcbiAgICBrZXl3b3Jkczogd29yZHMoY0tleXdvcmRzICsgXCIgXCIgKyBvYmpDS2V5d29yZHMgKyBcIiBcIiArIGNwcEtleXdvcmRzKSxcbiAgICB0eXBlczogb2JqQ1R5cGVzLFxuICAgIGJ1aWx0aW46IHdvcmRzKG9iakNCdWlsdGlucyksXG4gICAgYmxvY2tLZXl3b3Jkczogd29yZHMoY0Jsb2NrS2V5d29yZHMgKyBcIiBAc3ludGhlc2l6ZSBAdHJ5IEBjYXRjaCBAZmluYWxseSBAYXV0b3JlbGVhc2Vwb29sIEBzeW5jaHJvbml6ZWQgY2xhc3MgdHJ5IGNhdGNoXCIpLFxuICAgIGRlZktleXdvcmRzOiB3b3JkcyhjRGVmS2V5d29yZHMgKyBcIiBAaW50ZXJmYWNlIEBpbXBsZW1lbnRhdGlvbiBAcHJvdG9jb2wgQGNsYXNzIGNsYXNzIG5hbWVzcGFjZVwiKSxcbiAgICBkb250SW5kZW50U3RhdGVtZW50czogL15ALiokfF50ZW1wbGF0ZSQvLFxuICAgIHR5cGVGaXJzdERlZmluaXRpb25zOiB0cnVlLFxuICAgIGF0b21zOiB3b3JkcyhcIllFUyBOTyBOVUxMIE5pbCBuaWwgdHJ1ZSBmYWxzZSBudWxscHRyXCIpLFxuICAgIGlzUmVzZXJ2ZWRJZGVudGlmaWVyOiBjSXNSZXNlcnZlZElkZW50aWZpZXIsXG4gICAgaG9va3M6IHtcbiAgICAgIFwiI1wiOiBjcHBIb29rLFxuICAgICAgXCIqXCI6IHBvaW50ZXJIb29rLFxuICAgICAgXCJ1XCI6IGNwcDExU3RyaW5nSG9vayxcbiAgICAgIFwiVVwiOiBjcHAxMVN0cmluZ0hvb2ssXG4gICAgICBcIkxcIjogY3BwMTFTdHJpbmdIb29rLFxuICAgICAgXCJSXCI6IGNwcDExU3RyaW5nSG9vayxcbiAgICAgIFwiMFwiOiBjcHAxNExpdGVyYWwsXG4gICAgICBcIjFcIjogY3BwMTRMaXRlcmFsLFxuICAgICAgXCIyXCI6IGNwcDE0TGl0ZXJhbCxcbiAgICAgIFwiM1wiOiBjcHAxNExpdGVyYWwsXG4gICAgICBcIjRcIjogY3BwMTRMaXRlcmFsLFxuICAgICAgXCI1XCI6IGNwcDE0TGl0ZXJhbCxcbiAgICAgIFwiNlwiOiBjcHAxNExpdGVyYWwsXG4gICAgICBcIjdcIjogY3BwMTRMaXRlcmFsLFxuICAgICAgXCI4XCI6IGNwcDE0TGl0ZXJhbCxcbiAgICAgIFwiOVwiOiBjcHAxNExpdGVyYWwsXG4gICAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSwgc3R5bGUpIHtcbiAgICAgICAgaWYgKHN0eWxlID09IFwidmFyaWFibGVcIiAmJiBzdHJlYW0ucGVlaygpID09IFwiKFwiICYmXG4gICAgICAgICAgICAoc3RhdGUucHJldlRva2VuID09IFwiO1wiIHx8IHN0YXRlLnByZXZUb2tlbiA9PSBudWxsIHx8XG4gICAgICAgICAgICAgc3RhdGUucHJldlRva2VuID09IFwifVwiKSAmJlxuICAgICAgICAgICAgY3BwTG9va3NMaWtlQ29uc3RydWN0b3Ioc3RyZWFtLmN1cnJlbnQoKSkpXG4gICAgICAgICAgcmV0dXJuIFwiZGVmXCI7XG4gICAgICB9XG4gICAgfSxcbiAgICBuYW1lc3BhY2VTZXBhcmF0b3I6IFwiOjpcIixcbiAgICBtb2RlUHJvcHM6IHtmb2xkOiBbXCJicmFjZVwiLCBcImluY2x1ZGVcIl19XG4gIH0pO1xuXG4gIGRlZihcInRleHQveC1zcXVpcnJlbFwiLCB7XG4gICAgbmFtZTogXCJjbGlrZVwiLFxuICAgIGtleXdvcmRzOiB3b3JkcyhcImJhc2UgYnJlYWsgY2xvbmUgY29udGludWUgY29uc3QgZGVmYXVsdCBkZWxldGUgZW51bSBleHRlbmRzIGZ1bmN0aW9uIGluIGNsYXNzXCIgK1xuICAgICAgICAgICAgICAgICAgICBcIiBmb3JlYWNoIGxvY2FsIHJlc3VtZSByZXR1cm4gdGhpcyB0aHJvdyB0eXBlb2YgeWllbGQgY29uc3RydWN0b3IgaW5zdGFuY2VvZiBzdGF0aWNcIiksXG4gICAgdHlwZXM6IGNUeXBlcyxcbiAgICBibG9ja0tleXdvcmRzOiB3b3JkcyhcImNhc2UgY2F0Y2ggY2xhc3MgZWxzZSBmb3IgZm9yZWFjaCBpZiBzd2l0Y2ggdHJ5IHdoaWxlXCIpLFxuICAgIGRlZktleXdvcmRzOiB3b3JkcyhcImZ1bmN0aW9uIGxvY2FsIGNsYXNzXCIpLFxuICAgIHR5cGVGaXJzdERlZmluaXRpb25zOiB0cnVlLFxuICAgIGF0b21zOiB3b3JkcyhcInRydWUgZmFsc2UgbnVsbFwiKSxcbiAgICBob29rczoge1wiI1wiOiBjcHBIb29rfSxcbiAgICBtb2RlUHJvcHM6IHtmb2xkOiBbXCJicmFjZVwiLCBcImluY2x1ZGVcIl19XG4gIH0pO1xuXG4gIC8vIENleWxvbiBTdHJpbmdzIG5lZWQgdG8gZGVhbCB3aXRoIGludGVycG9sYXRpb25cbiAgdmFyIHN0cmluZ1Rva2VuaXplciA9IG51bGw7XG4gIGZ1bmN0aW9uIHRva2VuQ2V5bG9uU3RyaW5nKHR5cGUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkge1xuICAgICAgdmFyIGVzY2FwZWQgPSBmYWxzZSwgbmV4dCwgZW5kID0gZmFsc2U7XG4gICAgICB3aGlsZSAoIXN0cmVhbS5lb2woKSkge1xuICAgICAgICBpZiAoIWVzY2FwZWQgJiYgc3RyZWFtLm1hdGNoKCdcIicpICYmXG4gICAgICAgICAgICAgICh0eXBlID09IFwic2luZ2xlXCIgfHwgc3RyZWFtLm1hdGNoKCdcIlwiJykpKSB7XG4gICAgICAgICAgZW5kID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWVzY2FwZWQgJiYgc3RyZWFtLm1hdGNoKCdgYCcpKSB7XG4gICAgICAgICAgc3RyaW5nVG9rZW5pemVyID0gdG9rZW5DZXlsb25TdHJpbmcodHlwZSk7XG4gICAgICAgICAgZW5kID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBuZXh0ID0gc3RyZWFtLm5leHQoKTtcbiAgICAgICAgZXNjYXBlZCA9IHR5cGUgPT0gXCJzaW5nbGVcIiAmJiAhZXNjYXBlZCAmJiBuZXh0ID09IFwiXFxcXFwiO1xuICAgICAgfVxuICAgICAgaWYgKGVuZClcbiAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IG51bGw7XG4gICAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgICB9XG4gIH1cblxuICBkZWYoXCJ0ZXh0L3gtY2V5bG9uXCIsIHtcbiAgICBuYW1lOiBcImNsaWtlXCIsXG4gICAga2V5d29yZHM6IHdvcmRzKFwiYWJzdHJhY3RzIGFsaWFzIGFzc2VtYmx5IGFzc2VydCBhc3NpZ24gYnJlYWsgY2FzZSBjYXRjaCBjbGFzcyBjb250aW51ZSBkeW5hbWljIGVsc2VcIiArXG4gICAgICAgICAgICAgICAgICAgIFwiIGV4aXN0cyBleHRlbmRzIGZpbmFsbHkgZm9yIGZ1bmN0aW9uIGdpdmVuIGlmIGltcG9ydCBpbiBpbnRlcmZhY2UgaXMgbGV0IG1vZHVsZSBuZXdcIiArXG4gICAgICAgICAgICAgICAgICAgIFwiIG5vbmVtcHR5IG9iamVjdCBvZiBvdXQgb3V0ZXIgcGFja2FnZSByZXR1cm4gc2F0aXNmaWVzIHN1cGVyIHN3aXRjaCB0aGVuIHRoaXMgdGhyb3dcIiArXG4gICAgICAgICAgICAgICAgICAgIFwiIHRyeSB2YWx1ZSB2b2lkIHdoaWxlXCIpLFxuICAgIHR5cGVzOiBmdW5jdGlvbih3b3JkKSB7XG4gICAgICAgIC8vIEluIENleWxvbiBhbGwgaWRlbnRpZmllcnMgdGhhdCBzdGFydCB3aXRoIGFuIHVwcGVyY2FzZSBhcmUgdHlwZXNcbiAgICAgICAgdmFyIGZpcnN0ID0gd29yZC5jaGFyQXQoMCk7XG4gICAgICAgIHJldHVybiAoZmlyc3QgPT09IGZpcnN0LnRvVXBwZXJDYXNlKCkgJiYgZmlyc3QgIT09IGZpcnN0LnRvTG93ZXJDYXNlKCkpO1xuICAgIH0sXG4gICAgYmxvY2tLZXl3b3Jkczogd29yZHMoXCJjYXNlIGNhdGNoIGNsYXNzIGR5bmFtaWMgZWxzZSBmaW5hbGx5IGZvciBmdW5jdGlvbiBpZiBpbnRlcmZhY2UgbW9kdWxlIG5ldyBvYmplY3Qgc3dpdGNoIHRyeSB3aGlsZVwiKSxcbiAgICBkZWZLZXl3b3Jkczogd29yZHMoXCJjbGFzcyBkeW5hbWljIGZ1bmN0aW9uIGludGVyZmFjZSBtb2R1bGUgb2JqZWN0IHBhY2thZ2UgdmFsdWVcIiksXG4gICAgYnVpbHRpbjogd29yZHMoXCJhYnN0cmFjdCBhY3R1YWwgYWxpYXNlZCBhbm5vdGF0aW9uIGJ5IGRlZmF1bHQgZGVwcmVjYXRlZCBkb2MgZmluYWwgZm9ybWFsIGxhdGUgbGljZW5zZVwiICtcbiAgICAgICAgICAgICAgICAgICBcIiBuYXRpdmUgb3B0aW9uYWwgc2VhbGVkIHNlZSBzZXJpYWxpemFibGUgc2hhcmVkIHN1cHByZXNzV2FybmluZ3MgdGFnZ2VkIHRocm93cyB2YXJpYWJsZVwiKSxcbiAgICBpc1B1bmN0dWF0aW9uQ2hhcjogL1tcXFtcXF17fVxcKFxcKSw7XFw6XFwuYF0vLFxuICAgIGlzT3BlcmF0b3JDaGFyOiAvWytcXC0qJiU9PD4hP3xefjpcXC9dLyxcbiAgICBudW1iZXJTdGFydDogL1tcXGQjJF0vLFxuICAgIG51bWJlcjogL14oPzojW1xcZGEtZkEtRl9dK3xcXCRbMDFfXSt8W1xcZF9dK1trTUdUUG11bnBmXT98W1xcZF9dK1xcLltcXGRfXSsoPzpbZUVdWy0rXT9cXGQrfFtrTUdUUG11bnBmXXwpfCkvaSxcbiAgICBtdWx0aUxpbmVTdHJpbmdzOiB0cnVlLFxuICAgIHR5cGVGaXJzdERlZmluaXRpb25zOiB0cnVlLFxuICAgIGF0b21zOiB3b3JkcyhcInRydWUgZmFsc2UgbnVsbCBsYXJnZXIgc21hbGxlciBlcXVhbCBlbXB0eSBmaW5pc2hlZFwiKSxcbiAgICBpbmRlbnRTd2l0Y2g6IGZhbHNlLFxuICAgIHN0eWxlRGVmczogZmFsc2UsXG4gICAgaG9va3M6IHtcbiAgICAgIFwiQFwiOiBmdW5jdGlvbihzdHJlYW0pIHtcbiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXFx3XFwkX10vKTtcbiAgICAgICAgcmV0dXJuIFwibWV0YVwiO1xuICAgICAgfSxcbiAgICAgICdcIic6IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHtcbiAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQ2V5bG9uU3RyaW5nKHN0cmVhbS5tYXRjaCgnXCJcIicpID8gXCJ0cmlwbGVcIiA6IFwic2luZ2xlXCIpO1xuICAgICAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTtcbiAgICAgICAgfSxcbiAgICAgICdgJzogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkge1xuICAgICAgICAgIGlmICghc3RyaW5nVG9rZW5pemVyIHx8ICFzdHJlYW0ubWF0Y2goJ2AnKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gc3RyaW5nVG9rZW5pemVyO1xuICAgICAgICAgIHN0cmluZ1Rva2VuaXplciA9IG51bGw7XG4gICAgICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpO1xuICAgICAgICB9LFxuICAgICAgXCInXCI6IGZ1bmN0aW9uKHN0cmVhbSkge1xuICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcXHdcXCRfXFx4YTEtXFx1ZmZmZl0vKTtcbiAgICAgICAgcmV0dXJuIFwiYXRvbVwiO1xuICAgICAgfSxcbiAgICAgIHRva2VuOiBmdW5jdGlvbihfc3RyZWFtLCBzdGF0ZSwgc3R5bGUpIHtcbiAgICAgICAgICBpZiAoKHN0eWxlID09IFwidmFyaWFibGVcIiB8fCBzdHlsZSA9PSBcInR5cGVcIikgJiZcbiAgICAgICAgICAgICAgc3RhdGUucHJldlRva2VuID09IFwiLlwiKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJ2YXJpYWJsZS0yXCI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICBtb2RlUHJvcHM6IHtcbiAgICAgICAgZm9sZDogW1wiYnJhY2VcIiwgXCJpbXBvcnRcIl0sXG4gICAgICAgIGNsb3NlQnJhY2tldHM6IHt0cmlwbGVzOiAnXCInfVxuICAgIH1cbiAgfSk7XG5cbn0pO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/codemirror/mode/clike/clike.js\n"); +eval("// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n if (true) // CommonJS\n mod(__webpack_require__(/*! ../../lib/codemirror */ \"./node_modules/codemirror/lib/codemirror.js\"));\n else {}\n})(function(CodeMirror) {\n\"use strict\";\n\nfunction Context(indented, column, type, info, align, prev) {\n this.indented = indented;\n this.column = column;\n this.type = type;\n this.info = info;\n this.align = align;\n this.prev = prev;\n}\nfunction pushContext(state, col, type, info) {\n var indent = state.indented;\n if (state.context && state.context.type == \"statement\" && type != \"statement\")\n indent = state.context.indented;\n return state.context = new Context(indent, col, type, info, null, state.context);\n}\nfunction popContext(state) {\n var t = state.context.type;\n if (t == \")\" || t == \"]\" || t == \"}\")\n state.indented = state.context.indented;\n return state.context = state.context.prev;\n}\n\nfunction typeBefore(stream, state, pos) {\n if (state.prevToken == \"variable\" || state.prevToken == \"type\") return true;\n if (/\\S(?:[^- ]>|[*\\]])\\s*$|\\*$/.test(stream.string.slice(0, pos))) return true;\n if (state.typeAtEndOfLine && stream.column() == stream.indentation()) return true;\n}\n\nfunction isTopScope(context) {\n for (;;) {\n if (!context || context.type == \"top\") return true;\n if (context.type == \"}\" && context.prev.info != \"namespace\") return false;\n context = context.prev;\n }\n}\n\nCodeMirror.defineMode(\"clike\", function(config, parserConfig) {\n var indentUnit = config.indentUnit,\n statementIndentUnit = parserConfig.statementIndentUnit || indentUnit,\n dontAlignCalls = parserConfig.dontAlignCalls,\n keywords = parserConfig.keywords || {},\n types = parserConfig.types || {},\n builtin = parserConfig.builtin || {},\n blockKeywords = parserConfig.blockKeywords || {},\n defKeywords = parserConfig.defKeywords || {},\n atoms = parserConfig.atoms || {},\n hooks = parserConfig.hooks || {},\n multiLineStrings = parserConfig.multiLineStrings,\n indentStatements = parserConfig.indentStatements !== false,\n indentSwitch = parserConfig.indentSwitch !== false,\n namespaceSeparator = parserConfig.namespaceSeparator,\n isPunctuationChar = parserConfig.isPunctuationChar || /[\\[\\]{}\\(\\),;\\:\\.]/,\n numberStart = parserConfig.numberStart || /[\\d\\.]/,\n number = parserConfig.number || /^(?:0x[a-f\\d]+|0b[01]+|(?:\\d+\\.?\\d*|\\.\\d+)(?:e[-+]?\\d+)?)(u|ll?|l|f)?/i,\n isOperatorChar = parserConfig.isOperatorChar || /[+\\-*&%=<>!?|\\/]/,\n isIdentifierChar = parserConfig.isIdentifierChar || /[\\w\\$_\\xa1-\\uffff]/,\n // An optional function that takes a {string} token and returns true if it\n // should be treated as a builtin.\n isReservedIdentifier = parserConfig.isReservedIdentifier || false;\n\n var curPunc, isDefKeyword;\n\n function tokenBase(stream, state) {\n var ch = stream.next();\n if (hooks[ch]) {\n var result = hooks[ch](stream, state);\n if (result !== false) return result;\n }\n if (ch == '\"' || ch == \"'\") {\n state.tokenize = tokenString(ch);\n return state.tokenize(stream, state);\n }\n if (numberStart.test(ch)) {\n stream.backUp(1)\n if (stream.match(number)) return \"number\"\n stream.next()\n }\n if (isPunctuationChar.test(ch)) {\n curPunc = ch;\n return null;\n }\n if (ch == \"/\") {\n if (stream.eat(\"*\")) {\n state.tokenize = tokenComment;\n return tokenComment(stream, state);\n }\n if (stream.eat(\"/\")) {\n stream.skipToEnd();\n return \"comment\";\n }\n }\n if (isOperatorChar.test(ch)) {\n while (!stream.match(/^\\/[\\/*]/, false) && stream.eat(isOperatorChar)) {}\n return \"operator\";\n }\n stream.eatWhile(isIdentifierChar);\n if (namespaceSeparator) while (stream.match(namespaceSeparator))\n stream.eatWhile(isIdentifierChar);\n\n var cur = stream.current();\n if (contains(keywords, cur)) {\n if (contains(blockKeywords, cur)) curPunc = \"newstatement\";\n if (contains(defKeywords, cur)) isDefKeyword = true;\n return \"keyword\";\n }\n if (contains(types, cur)) return \"type\";\n if (contains(builtin, cur)\n || (isReservedIdentifier && isReservedIdentifier(cur))) {\n if (contains(blockKeywords, cur)) curPunc = \"newstatement\";\n return \"builtin\";\n }\n if (contains(atoms, cur)) return \"atom\";\n return \"variable\";\n }\n\n function tokenString(quote) {\n return function(stream, state) {\n var escaped = false, next, end = false;\n while ((next = stream.next()) != null) {\n if (next == quote && !escaped) {end = true; break;}\n escaped = !escaped && next == \"\\\\\";\n }\n if (end || !(escaped || multiLineStrings))\n state.tokenize = null;\n return \"string\";\n };\n }\n\n function tokenComment(stream, state) {\n var maybeEnd = false, ch;\n while (ch = stream.next()) {\n if (ch == \"/\" && maybeEnd) {\n state.tokenize = null;\n break;\n }\n maybeEnd = (ch == \"*\");\n }\n return \"comment\";\n }\n\n function maybeEOL(stream, state) {\n if (parserConfig.typeFirstDefinitions && stream.eol() && isTopScope(state.context))\n state.typeAtEndOfLine = typeBefore(stream, state, stream.pos)\n }\n\n // Interface\n\n return {\n startState: function(basecolumn) {\n return {\n tokenize: null,\n context: new Context((basecolumn || 0) - indentUnit, 0, \"top\", null, false),\n indented: 0,\n startOfLine: true,\n prevToken: null\n };\n },\n\n token: function(stream, state) {\n var ctx = state.context;\n if (stream.sol()) {\n if (ctx.align == null) ctx.align = false;\n state.indented = stream.indentation();\n state.startOfLine = true;\n }\n if (stream.eatSpace()) { maybeEOL(stream, state); return null; }\n curPunc = isDefKeyword = null;\n var style = (state.tokenize || tokenBase)(stream, state);\n if (style == \"comment\" || style == \"meta\") return style;\n if (ctx.align == null) ctx.align = true;\n\n if (curPunc == \";\" || curPunc == \":\" || (curPunc == \",\" && stream.match(/^\\s*(?:\\/\\/.*)?$/, false)))\n while (state.context.type == \"statement\") popContext(state);\n else if (curPunc == \"{\") pushContext(state, stream.column(), \"}\");\n else if (curPunc == \"[\") pushContext(state, stream.column(), \"]\");\n else if (curPunc == \"(\") pushContext(state, stream.column(), \")\");\n else if (curPunc == \"}\") {\n while (ctx.type == \"statement\") ctx = popContext(state);\n if (ctx.type == \"}\") ctx = popContext(state);\n while (ctx.type == \"statement\") ctx = popContext(state);\n }\n else if (curPunc == ctx.type) popContext(state);\n else if (indentStatements &&\n (((ctx.type == \"}\" || ctx.type == \"top\") && curPunc != \";\") ||\n (ctx.type == \"statement\" && curPunc == \"newstatement\"))) {\n pushContext(state, stream.column(), \"statement\", stream.current());\n }\n\n if (style == \"variable\" &&\n ((state.prevToken == \"def\" ||\n (parserConfig.typeFirstDefinitions && typeBefore(stream, state, stream.start) &&\n isTopScope(state.context) && stream.match(/^\\s*\\(/, false)))))\n style = \"def\";\n\n if (hooks.token) {\n var result = hooks.token(stream, state, style);\n if (result !== undefined) style = result;\n }\n\n if (style == \"def\" && parserConfig.styleDefs === false) style = \"variable\";\n\n state.startOfLine = false;\n state.prevToken = isDefKeyword ? \"def\" : style || curPunc;\n maybeEOL(stream, state);\n return style;\n },\n\n indent: function(state, textAfter) {\n if (state.tokenize != tokenBase && state.tokenize != null || state.typeAtEndOfLine) return CodeMirror.Pass;\n var ctx = state.context, firstChar = textAfter && textAfter.charAt(0);\n var closing = firstChar == ctx.type;\n if (ctx.type == \"statement\" && firstChar == \"}\") ctx = ctx.prev;\n if (parserConfig.dontIndentStatements)\n while (ctx.type == \"statement\" && parserConfig.dontIndentStatements.test(ctx.info))\n ctx = ctx.prev\n if (hooks.indent) {\n var hook = hooks.indent(state, ctx, textAfter, indentUnit);\n if (typeof hook == \"number\") return hook\n }\n var switchBlock = ctx.prev && ctx.prev.info == \"switch\";\n if (parserConfig.allmanIndentation && /[{(]/.test(firstChar)) {\n while (ctx.type != \"top\" && ctx.type != \"}\") ctx = ctx.prev\n return ctx.indented\n }\n if (ctx.type == \"statement\")\n return ctx.indented + (firstChar == \"{\" ? 0 : statementIndentUnit);\n if (ctx.align && (!dontAlignCalls || ctx.type != \")\"))\n return ctx.column + (closing ? 0 : 1);\n if (ctx.type == \")\" && !closing)\n return ctx.indented + statementIndentUnit;\n\n return ctx.indented + (closing ? 0 : indentUnit) +\n (!closing && switchBlock && !/^(?:case|default)\\b/.test(textAfter) ? indentUnit : 0);\n },\n\n electricInput: indentSwitch ? /^\\s*(?:case .*?:|default:|\\{\\}?|\\})$/ : /^\\s*[{}]$/,\n blockCommentStart: \"/*\",\n blockCommentEnd: \"*/\",\n blockCommentContinue: \" * \",\n lineComment: \"//\",\n fold: \"brace\"\n };\n});\n\n function words(str) {\n var obj = {}, words = str.split(\" \");\n for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n return obj;\n }\n function contains(words, word) {\n if (typeof words === \"function\") {\n return words(word);\n } else {\n return words.propertyIsEnumerable(word);\n }\n }\n var cKeywords = \"auto if break case register continue return default do sizeof \" +\n \"static else struct switch extern typedef union for goto while enum const \" +\n \"volatile inline restrict asm fortran\";\n\n // Keywords from https://en.cppreference.com/w/cpp/keyword includes C++20.\n var cppKeywords = \"alignas alignof and and_eq audit axiom bitand bitor catch \" +\n \"class compl concept constexpr const_cast decltype delete dynamic_cast \" +\n \"explicit export final friend import module mutable namespace new noexcept \" +\n \"not not_eq operator or or_eq override private protected public \" +\n \"reinterpret_cast requires static_assert static_cast template this \" +\n \"thread_local throw try typeid typename using virtual xor xor_eq\";\n\n var objCKeywords = \"bycopy byref in inout oneway out self super atomic nonatomic retain copy \" +\n \"readwrite readonly strong weak assign typeof nullable nonnull null_resettable _cmd \" +\n \"@interface @implementation @end @protocol @encode @property @synthesize @dynamic @class \" +\n \"@public @package @private @protected @required @optional @try @catch @finally @import \" +\n \"@selector @encode @defs @synchronized @autoreleasepool @compatibility_alias @available\";\n\n var objCBuiltins = \"FOUNDATION_EXPORT FOUNDATION_EXTERN NS_INLINE NS_FORMAT_FUNCTION \" +\n \" NS_RETURNS_RETAINEDNS_ERROR_ENUM NS_RETURNS_NOT_RETAINED NS_RETURNS_INNER_POINTER \" +\n \"NS_DESIGNATED_INITIALIZER NS_ENUM NS_OPTIONS NS_REQUIRES_NIL_TERMINATION \" +\n \"NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_SWIFT_NAME NS_REFINED_FOR_SWIFT\"\n\n // Do not use this. Use the cTypes function below. This is global just to avoid\n // excessive calls when cTypes is being called multiple times during a parse.\n var basicCTypes = words(\"int long char short double float unsigned signed \" +\n \"void bool\");\n\n // Do not use this. Use the objCTypes function below. This is global just to avoid\n // excessive calls when objCTypes is being called multiple times during a parse.\n var basicObjCTypes = words(\"SEL instancetype id Class Protocol BOOL\");\n\n // Returns true if identifier is a \"C\" type.\n // C type is defined as those that are reserved by the compiler (basicTypes),\n // and those that end in _t (Reserved by POSIX for types)\n // http://www.gnu.org/software/libc/manual/html_node/Reserved-Names.html\n function cTypes(identifier) {\n return contains(basicCTypes, identifier) || /.+_t$/.test(identifier);\n }\n\n // Returns true if identifier is a \"Objective C\" type.\n function objCTypes(identifier) {\n return cTypes(identifier) || contains(basicObjCTypes, identifier);\n }\n\n var cBlockKeywords = \"case do else for if switch while struct enum union\";\n var cDefKeywords = \"struct enum union\";\n\n function cppHook(stream, state) {\n if (!state.startOfLine) return false\n for (var ch, next = null; ch = stream.peek();) {\n if (ch == \"\\\\\" && stream.match(/^.$/)) {\n next = cppHook\n break\n } else if (ch == \"/\" && stream.match(/^\\/[\\/\\*]/, false)) {\n break\n }\n stream.next()\n }\n state.tokenize = next\n return \"meta\"\n }\n\n function pointerHook(_stream, state) {\n if (state.prevToken == \"type\") return \"type\";\n return false;\n }\n\n // For C and C++ (and ObjC): identifiers starting with __\n // or _ followed by a capital letter are reserved for the compiler.\n function cIsReservedIdentifier(token) {\n if (!token || token.length < 2) return false;\n if (token[0] != '_') return false;\n return (token[1] == '_') || (token[1] !== token[1].toLowerCase());\n }\n\n function cpp14Literal(stream) {\n stream.eatWhile(/[\\w\\.']/);\n return \"number\";\n }\n\n function cpp11StringHook(stream, state) {\n stream.backUp(1);\n // Raw strings.\n if (stream.match(/^(?:R|u8R|uR|UR|LR)/)) {\n var match = stream.match(/^\"([^\\s\\\\()]{0,16})\\(/);\n if (!match) {\n return false;\n }\n state.cpp11RawStringDelim = match[1];\n state.tokenize = tokenRawString;\n return tokenRawString(stream, state);\n }\n // Unicode strings/chars.\n if (stream.match(/^(?:u8|u|U|L)/)) {\n if (stream.match(/^[\"']/, /* eat */ false)) {\n return \"string\";\n }\n return false;\n }\n // Ignore this hook.\n stream.next();\n return false;\n }\n\n function cppLooksLikeConstructor(word) {\n var lastTwo = /(\\w+)::~?(\\w+)$/.exec(word);\n return lastTwo && lastTwo[1] == lastTwo[2];\n }\n\n // C#-style strings where \"\" escapes a quote.\n function tokenAtString(stream, state) {\n var next;\n while ((next = stream.next()) != null) {\n if (next == '\"' && !stream.eat('\"')) {\n state.tokenize = null;\n break;\n }\n }\n return \"string\";\n }\n\n // C++11 raw string literal is \"( anything )\", where\n // can be a string up to 16 characters long.\n function tokenRawString(stream, state) {\n // Escape characters that have special regex meanings.\n var delim = state.cpp11RawStringDelim.replace(/[^\\w\\s]/g, '\\\\$&');\n var match = stream.match(new RegExp(\".*?\\\\)\" + delim + '\"'));\n if (match)\n state.tokenize = null;\n else\n stream.skipToEnd();\n return \"string\";\n }\n\n function def(mimes, mode) {\n if (typeof mimes == \"string\") mimes = [mimes];\n var words = [];\n function add(obj) {\n if (obj) for (var prop in obj) if (obj.hasOwnProperty(prop))\n words.push(prop);\n }\n add(mode.keywords);\n add(mode.types);\n add(mode.builtin);\n add(mode.atoms);\n if (words.length) {\n mode.helperType = mimes[0];\n CodeMirror.registerHelper(\"hintWords\", mimes[0], words);\n }\n\n for (var i = 0; i < mimes.length; ++i)\n CodeMirror.defineMIME(mimes[i], mode);\n }\n\n def([\"text/x-csrc\", \"text/x-c\", \"text/x-chdr\"], {\n name: \"clike\",\n keywords: words(cKeywords),\n types: cTypes,\n blockKeywords: words(cBlockKeywords),\n defKeywords: words(cDefKeywords),\n typeFirstDefinitions: true,\n atoms: words(\"NULL true false\"),\n isReservedIdentifier: cIsReservedIdentifier,\n hooks: {\n \"#\": cppHook,\n \"*\": pointerHook,\n },\n modeProps: {fold: [\"brace\", \"include\"]}\n });\n\n def([\"text/x-c++src\", \"text/x-c++hdr\"], {\n name: \"clike\",\n keywords: words(cKeywords + \" \" + cppKeywords),\n types: cTypes,\n blockKeywords: words(cBlockKeywords + \" class try catch\"),\n defKeywords: words(cDefKeywords + \" class namespace\"),\n typeFirstDefinitions: true,\n atoms: words(\"true false NULL nullptr\"),\n dontIndentStatements: /^template$/,\n isIdentifierChar: /[\\w\\$_~\\xa1-\\uffff]/,\n isReservedIdentifier: cIsReservedIdentifier,\n hooks: {\n \"#\": cppHook,\n \"*\": pointerHook,\n \"u\": cpp11StringHook,\n \"U\": cpp11StringHook,\n \"L\": cpp11StringHook,\n \"R\": cpp11StringHook,\n \"0\": cpp14Literal,\n \"1\": cpp14Literal,\n \"2\": cpp14Literal,\n \"3\": cpp14Literal,\n \"4\": cpp14Literal,\n \"5\": cpp14Literal,\n \"6\": cpp14Literal,\n \"7\": cpp14Literal,\n \"8\": cpp14Literal,\n \"9\": cpp14Literal,\n token: function(stream, state, style) {\n if (style == \"variable\" && stream.peek() == \"(\" &&\n (state.prevToken == \";\" || state.prevToken == null ||\n state.prevToken == \"}\") &&\n cppLooksLikeConstructor(stream.current()))\n return \"def\";\n }\n },\n namespaceSeparator: \"::\",\n modeProps: {fold: [\"brace\", \"include\"]}\n });\n\n def(\"text/x-java\", {\n name: \"clike\",\n keywords: words(\"abstract assert break case catch class const continue default \" +\n \"do else enum extends final finally for goto if implements import \" +\n \"instanceof interface native new package private protected public \" +\n \"return static strictfp super switch synchronized this throw throws transient \" +\n \"try volatile while @interface\"),\n types: words(\"byte short int long float double boolean char void Boolean Byte Character Double Float \" +\n \"Integer Long Number Object Short String StringBuffer StringBuilder Void\"),\n blockKeywords: words(\"catch class do else finally for if switch try while\"),\n defKeywords: words(\"class interface enum @interface\"),\n typeFirstDefinitions: true,\n atoms: words(\"true false null\"),\n number: /^(?:0x[a-f\\d_]+|0b[01_]+|(?:[\\d_]+\\.?\\d*|\\.\\d+)(?:e[-+]?[\\d_]+)?)(u|ll?|l|f)?/i,\n hooks: {\n \"@\": function(stream) {\n // Don't match the @interface keyword.\n if (stream.match('interface', false)) return false;\n\n stream.eatWhile(/[\\w\\$_]/);\n return \"meta\";\n }\n },\n modeProps: {fold: [\"brace\", \"import\"]}\n });\n\n def(\"text/x-csharp\", {\n name: \"clike\",\n keywords: words(\"abstract as async await base break case catch checked class const continue\" +\n \" default delegate do else enum event explicit extern finally fixed for\" +\n \" foreach goto if implicit in interface internal is lock namespace new\" +\n \" operator out override params private protected public readonly ref return sealed\" +\n \" sizeof stackalloc static struct switch this throw try typeof unchecked\" +\n \" unsafe using virtual void volatile while add alias ascending descending dynamic from get\" +\n \" global group into join let orderby partial remove select set value var yield\"),\n types: words(\"Action Boolean Byte Char DateTime DateTimeOffset Decimal Double Func\" +\n \" Guid Int16 Int32 Int64 Object SByte Single String Task TimeSpan UInt16 UInt32\" +\n \" UInt64 bool byte char decimal double short int long object\" +\n \" sbyte float string ushort uint ulong\"),\n blockKeywords: words(\"catch class do else finally for foreach if struct switch try while\"),\n defKeywords: words(\"class interface namespace struct var\"),\n typeFirstDefinitions: true,\n atoms: words(\"true false null\"),\n hooks: {\n \"@\": function(stream, state) {\n if (stream.eat('\"')) {\n state.tokenize = tokenAtString;\n return tokenAtString(stream, state);\n }\n stream.eatWhile(/[\\w\\$_]/);\n return \"meta\";\n }\n }\n });\n\n function tokenTripleString(stream, state) {\n var escaped = false;\n while (!stream.eol()) {\n if (!escaped && stream.match('\"\"\"')) {\n state.tokenize = null;\n break;\n }\n escaped = stream.next() == \"\\\\\" && !escaped;\n }\n return \"string\";\n }\n\n function tokenNestedComment(depth) {\n return function (stream, state) {\n var ch\n while (ch = stream.next()) {\n if (ch == \"*\" && stream.eat(\"/\")) {\n if (depth == 1) {\n state.tokenize = null\n break\n } else {\n state.tokenize = tokenNestedComment(depth - 1)\n return state.tokenize(stream, state)\n }\n } else if (ch == \"/\" && stream.eat(\"*\")) {\n state.tokenize = tokenNestedComment(depth + 1)\n return state.tokenize(stream, state)\n }\n }\n return \"comment\"\n }\n }\n\n def(\"text/x-scala\", {\n name: \"clike\",\n keywords: words(\n /* scala */\n \"abstract case catch class def do else extends final finally for forSome if \" +\n \"implicit import lazy match new null object override package private protected return \" +\n \"sealed super this throw trait try type val var while with yield _ \" +\n\n /* package scala */\n \"assert assume require print println printf readLine readBoolean readByte readShort \" +\n \"readChar readInt readLong readFloat readDouble\"\n ),\n types: words(\n \"AnyVal App Application Array BufferedIterator BigDecimal BigInt Char Console Either \" +\n \"Enumeration Equiv Error Exception Fractional Function IndexedSeq Int Integral Iterable \" +\n \"Iterator List Map Numeric Nil NotNull Option Ordered Ordering PartialFunction PartialOrdering \" +\n \"Product Proxy Range Responder Seq Serializable Set Specializable Stream StringBuilder \" +\n \"StringContext Symbol Throwable Traversable TraversableOnce Tuple Unit Vector \" +\n\n /* package java.lang */\n \"Boolean Byte Character CharSequence Class ClassLoader Cloneable Comparable \" +\n \"Compiler Double Exception Float Integer Long Math Number Object Package Pair Process \" +\n \"Runtime Runnable SecurityManager Short StackTraceElement StrictMath String \" +\n \"StringBuffer System Thread ThreadGroup ThreadLocal Throwable Triple Void\"\n ),\n multiLineStrings: true,\n blockKeywords: words(\"catch class enum do else finally for forSome if match switch try while\"),\n defKeywords: words(\"class enum def object package trait type val var\"),\n atoms: words(\"true false null\"),\n indentStatements: false,\n indentSwitch: false,\n isOperatorChar: /[+\\-*&%=<>!?|\\/#:@]/,\n hooks: {\n \"@\": function(stream) {\n stream.eatWhile(/[\\w\\$_]/);\n return \"meta\";\n },\n '\"': function(stream, state) {\n if (!stream.match('\"\"')) return false;\n state.tokenize = tokenTripleString;\n return state.tokenize(stream, state);\n },\n \"'\": function(stream) {\n stream.eatWhile(/[\\w\\$_\\xa1-\\uffff]/);\n return \"atom\";\n },\n \"=\": function(stream, state) {\n var cx = state.context\n if (cx.type == \"}\" && cx.align && stream.eat(\">\")) {\n state.context = new Context(cx.indented, cx.column, cx.type, cx.info, null, cx.prev)\n return \"operator\"\n } else {\n return false\n }\n },\n\n \"/\": function(stream, state) {\n if (!stream.eat(\"*\")) return false\n state.tokenize = tokenNestedComment(1)\n return state.tokenize(stream, state)\n }\n },\n modeProps: {closeBrackets: {pairs: '()[]{}\"\"', triples: '\"'}}\n });\n\n function tokenKotlinString(tripleString){\n return function (stream, state) {\n var escaped = false, next, end = false;\n while (!stream.eol()) {\n if (!tripleString && !escaped && stream.match('\"') ) {end = true; break;}\n if (tripleString && stream.match('\"\"\"')) {end = true; break;}\n next = stream.next();\n if(!escaped && next == \"$\" && stream.match('{'))\n stream.skipTo(\"}\");\n escaped = !escaped && next == \"\\\\\" && !tripleString;\n }\n if (end || !tripleString)\n state.tokenize = null;\n return \"string\";\n }\n }\n\n def(\"text/x-kotlin\", {\n name: \"clike\",\n keywords: words(\n /*keywords*/\n \"package as typealias class interface this super val operator \" +\n \"var fun for is in This throw return annotation \" +\n \"break continue object if else while do try when !in !is as? \" +\n\n /*soft keywords*/\n \"file import where by get set abstract enum open inner override private public internal \" +\n \"protected catch finally out final vararg reified dynamic companion constructor init \" +\n \"sealed field property receiver param sparam lateinit data inline noinline tailrec \" +\n \"external annotation crossinline const operator infix suspend actual expect setparam value\"\n ),\n types: words(\n /* package java.lang */\n \"Boolean Byte Character CharSequence Class ClassLoader Cloneable Comparable \" +\n \"Compiler Double Exception Float Integer Long Math Number Object Package Pair Process \" +\n \"Runtime Runnable SecurityManager Short StackTraceElement StrictMath String \" +\n \"StringBuffer System Thread ThreadGroup ThreadLocal Throwable Triple Void Annotation Any BooleanArray \" +\n \"ByteArray Char CharArray DeprecationLevel DoubleArray Enum FloatArray Function Int IntArray Lazy \" +\n \"LazyThreadSafetyMode LongArray Nothing ShortArray Unit\"\n ),\n intendSwitch: false,\n indentStatements: false,\n multiLineStrings: true,\n number: /^(?:0x[a-f\\d_]+|0b[01_]+|(?:[\\d_]+(\\.\\d+)?|\\.\\d+)(?:e[-+]?[\\d_]+)?)(u|ll?|l|f)?/i,\n blockKeywords: words(\"catch class do else finally for if where try while enum\"),\n defKeywords: words(\"class val var object interface fun\"),\n atoms: words(\"true false null this\"),\n hooks: {\n \"@\": function(stream) {\n stream.eatWhile(/[\\w\\$_]/);\n return \"meta\";\n },\n '*': function(_stream, state) {\n return state.prevToken == '.' ? 'variable' : 'operator';\n },\n '\"': function(stream, state) {\n state.tokenize = tokenKotlinString(stream.match('\"\"'));\n return state.tokenize(stream, state);\n },\n \"/\": function(stream, state) {\n if (!stream.eat(\"*\")) return false;\n state.tokenize = tokenNestedComment(1);\n return state.tokenize(stream, state)\n },\n indent: function(state, ctx, textAfter, indentUnit) {\n var firstChar = textAfter && textAfter.charAt(0);\n if ((state.prevToken == \"}\" || state.prevToken == \")\") && textAfter == \"\")\n return state.indented;\n if ((state.prevToken == \"operator\" && textAfter != \"}\" && state.context.type != \"}\") ||\n state.prevToken == \"variable\" && firstChar == \".\" ||\n (state.prevToken == \"}\" || state.prevToken == \")\") && firstChar == \".\")\n return indentUnit * 2 + ctx.indented;\n if (ctx.align && ctx.type == \"}\")\n return ctx.indented + (state.context.type == (textAfter || \"\").charAt(0) ? 0 : indentUnit);\n }\n },\n modeProps: {closeBrackets: {triples: '\"'}}\n });\n\n def([\"x-shader/x-vertex\", \"x-shader/x-fragment\"], {\n name: \"clike\",\n keywords: words(\"sampler1D sampler2D sampler3D samplerCube \" +\n \"sampler1DShadow sampler2DShadow \" +\n \"const attribute uniform varying \" +\n \"break continue discard return \" +\n \"for while do if else struct \" +\n \"in out inout\"),\n types: words(\"float int bool void \" +\n \"vec2 vec3 vec4 ivec2 ivec3 ivec4 bvec2 bvec3 bvec4 \" +\n \"mat2 mat3 mat4\"),\n blockKeywords: words(\"for while do if else struct\"),\n builtin: words(\"radians degrees sin cos tan asin acos atan \" +\n \"pow exp log exp2 sqrt inversesqrt \" +\n \"abs sign floor ceil fract mod min max clamp mix step smoothstep \" +\n \"length distance dot cross normalize ftransform faceforward \" +\n \"reflect refract matrixCompMult \" +\n \"lessThan lessThanEqual greaterThan greaterThanEqual \" +\n \"equal notEqual any all not \" +\n \"texture1D texture1DProj texture1DLod texture1DProjLod \" +\n \"texture2D texture2DProj texture2DLod texture2DProjLod \" +\n \"texture3D texture3DProj texture3DLod texture3DProjLod \" +\n \"textureCube textureCubeLod \" +\n \"shadow1D shadow2D shadow1DProj shadow2DProj \" +\n \"shadow1DLod shadow2DLod shadow1DProjLod shadow2DProjLod \" +\n \"dFdx dFdy fwidth \" +\n \"noise1 noise2 noise3 noise4\"),\n atoms: words(\"true false \" +\n \"gl_FragColor gl_SecondaryColor gl_Normal gl_Vertex \" +\n \"gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord3 \" +\n \"gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 \" +\n \"gl_FogCoord gl_PointCoord \" +\n \"gl_Position gl_PointSize gl_ClipVertex \" +\n \"gl_FrontColor gl_BackColor gl_FrontSecondaryColor gl_BackSecondaryColor \" +\n \"gl_TexCoord gl_FogFragCoord \" +\n \"gl_FragCoord gl_FrontFacing \" +\n \"gl_FragData gl_FragDepth \" +\n \"gl_ModelViewMatrix gl_ProjectionMatrix gl_ModelViewProjectionMatrix \" +\n \"gl_TextureMatrix gl_NormalMatrix gl_ModelViewMatrixInverse \" +\n \"gl_ProjectionMatrixInverse gl_ModelViewProjectionMatrixInverse \" +\n \"gl_TextureMatrixTranspose gl_ModelViewMatrixInverseTranspose \" +\n \"gl_ProjectionMatrixInverseTranspose \" +\n \"gl_ModelViewProjectionMatrixInverseTranspose \" +\n \"gl_TextureMatrixInverseTranspose \" +\n \"gl_NormalScale gl_DepthRange gl_ClipPlane \" +\n \"gl_Point gl_FrontMaterial gl_BackMaterial gl_LightSource gl_LightModel \" +\n \"gl_FrontLightModelProduct gl_BackLightModelProduct \" +\n \"gl_TextureColor gl_EyePlaneS gl_EyePlaneT gl_EyePlaneR gl_EyePlaneQ \" +\n \"gl_FogParameters \" +\n \"gl_MaxLights gl_MaxClipPlanes gl_MaxTextureUnits gl_MaxTextureCoords \" +\n \"gl_MaxVertexAttribs gl_MaxVertexUniformComponents gl_MaxVaryingFloats \" +\n \"gl_MaxVertexTextureImageUnits gl_MaxTextureImageUnits \" +\n \"gl_MaxFragmentUniformComponents gl_MaxCombineTextureImageUnits \" +\n \"gl_MaxDrawBuffers\"),\n indentSwitch: false,\n hooks: {\"#\": cppHook},\n modeProps: {fold: [\"brace\", \"include\"]}\n });\n\n def(\"text/x-nesc\", {\n name: \"clike\",\n keywords: words(cKeywords + \" as atomic async call command component components configuration event generic \" +\n \"implementation includes interface module new norace nx_struct nx_union post provides \" +\n \"signal task uses abstract extends\"),\n types: cTypes,\n blockKeywords: words(cBlockKeywords),\n atoms: words(\"null true false\"),\n hooks: {\"#\": cppHook},\n modeProps: {fold: [\"brace\", \"include\"]}\n });\n\n def(\"text/x-objectivec\", {\n name: \"clike\",\n keywords: words(cKeywords + \" \" + objCKeywords),\n types: objCTypes,\n builtin: words(objCBuiltins),\n blockKeywords: words(cBlockKeywords + \" @synthesize @try @catch @finally @autoreleasepool @synchronized\"),\n defKeywords: words(cDefKeywords + \" @interface @implementation @protocol @class\"),\n dontIndentStatements: /^@.*$/,\n typeFirstDefinitions: true,\n atoms: words(\"YES NO NULL Nil nil true false nullptr\"),\n isReservedIdentifier: cIsReservedIdentifier,\n hooks: {\n \"#\": cppHook,\n \"*\": pointerHook,\n },\n modeProps: {fold: [\"brace\", \"include\"]}\n });\n\n def(\"text/x-objectivec++\", {\n name: \"clike\",\n keywords: words(cKeywords + \" \" + objCKeywords + \" \" + cppKeywords),\n types: objCTypes,\n builtin: words(objCBuiltins),\n blockKeywords: words(cBlockKeywords + \" @synthesize @try @catch @finally @autoreleasepool @synchronized class try catch\"),\n defKeywords: words(cDefKeywords + \" @interface @implementation @protocol @class class namespace\"),\n dontIndentStatements: /^@.*$|^template$/,\n typeFirstDefinitions: true,\n atoms: words(\"YES NO NULL Nil nil true false nullptr\"),\n isReservedIdentifier: cIsReservedIdentifier,\n hooks: {\n \"#\": cppHook,\n \"*\": pointerHook,\n \"u\": cpp11StringHook,\n \"U\": cpp11StringHook,\n \"L\": cpp11StringHook,\n \"R\": cpp11StringHook,\n \"0\": cpp14Literal,\n \"1\": cpp14Literal,\n \"2\": cpp14Literal,\n \"3\": cpp14Literal,\n \"4\": cpp14Literal,\n \"5\": cpp14Literal,\n \"6\": cpp14Literal,\n \"7\": cpp14Literal,\n \"8\": cpp14Literal,\n \"9\": cpp14Literal,\n token: function(stream, state, style) {\n if (style == \"variable\" && stream.peek() == \"(\" &&\n (state.prevToken == \";\" || state.prevToken == null ||\n state.prevToken == \"}\") &&\n cppLooksLikeConstructor(stream.current()))\n return \"def\";\n }\n },\n namespaceSeparator: \"::\",\n modeProps: {fold: [\"brace\", \"include\"]}\n });\n\n def(\"text/x-squirrel\", {\n name: \"clike\",\n keywords: words(\"base break clone continue const default delete enum extends function in class\" +\n \" foreach local resume return this throw typeof yield constructor instanceof static\"),\n types: cTypes,\n blockKeywords: words(\"case catch class else for foreach if switch try while\"),\n defKeywords: words(\"function local class\"),\n typeFirstDefinitions: true,\n atoms: words(\"true false null\"),\n hooks: {\"#\": cppHook},\n modeProps: {fold: [\"brace\", \"include\"]}\n });\n\n // Ceylon Strings need to deal with interpolation\n var stringTokenizer = null;\n function tokenCeylonString(type) {\n return function(stream, state) {\n var escaped = false, next, end = false;\n while (!stream.eol()) {\n if (!escaped && stream.match('\"') &&\n (type == \"single\" || stream.match('\"\"'))) {\n end = true;\n break;\n }\n if (!escaped && stream.match('``')) {\n stringTokenizer = tokenCeylonString(type);\n end = true;\n break;\n }\n next = stream.next();\n escaped = type == \"single\" && !escaped && next == \"\\\\\";\n }\n if (end)\n state.tokenize = null;\n return \"string\";\n }\n }\n\n def(\"text/x-ceylon\", {\n name: \"clike\",\n keywords: words(\"abstracts alias assembly assert assign break case catch class continue dynamic else\" +\n \" exists extends finally for function given if import in interface is let module new\" +\n \" nonempty object of out outer package return satisfies super switch then this throw\" +\n \" try value void while\"),\n types: function(word) {\n // In Ceylon all identifiers that start with an uppercase are types\n var first = word.charAt(0);\n return (first === first.toUpperCase() && first !== first.toLowerCase());\n },\n blockKeywords: words(\"case catch class dynamic else finally for function if interface module new object switch try while\"),\n defKeywords: words(\"class dynamic function interface module object package value\"),\n builtin: words(\"abstract actual aliased annotation by default deprecated doc final formal late license\" +\n \" native optional sealed see serializable shared suppressWarnings tagged throws variable\"),\n isPunctuationChar: /[\\[\\]{}\\(\\),;\\:\\.`]/,\n isOperatorChar: /[+\\-*&%=<>!?|^~:\\/]/,\n numberStart: /[\\d#$]/,\n number: /^(?:#[\\da-fA-F_]+|\\$[01_]+|[\\d_]+[kMGTPmunpf]?|[\\d_]+\\.[\\d_]+(?:[eE][-+]?\\d+|[kMGTPmunpf]|)|)/i,\n multiLineStrings: true,\n typeFirstDefinitions: true,\n atoms: words(\"true false null larger smaller equal empty finished\"),\n indentSwitch: false,\n styleDefs: false,\n hooks: {\n \"@\": function(stream) {\n stream.eatWhile(/[\\w\\$_]/);\n return \"meta\";\n },\n '\"': function(stream, state) {\n state.tokenize = tokenCeylonString(stream.match('\"\"') ? \"triple\" : \"single\");\n return state.tokenize(stream, state);\n },\n '`': function(stream, state) {\n if (!stringTokenizer || !stream.match('`')) return false;\n state.tokenize = stringTokenizer;\n stringTokenizer = null;\n return state.tokenize(stream, state);\n },\n \"'\": function(stream) {\n stream.eatWhile(/[\\w\\$_\\xa1-\\uffff]/);\n return \"atom\";\n },\n token: function(_stream, state, style) {\n if ((style == \"variable\" || style == \"type\") &&\n state.prevToken == \".\") {\n return \"variable-2\";\n }\n }\n },\n modeProps: {\n fold: [\"brace\", \"import\"],\n closeBrackets: {triples: '\"'}\n }\n });\n\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vbm9kZV9tb2R1bGVzL2NvZGVtaXJyb3IvbW9kZS9jbGlrZS9jbGlrZS5qcz80YmE2Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNLElBQXVEO0FBQzdELFFBQVEsbUJBQU8sQ0FBQyx5RUFBc0I7QUFDdEMsT0FBTyxFQUdhO0FBQ3BCLENBQUM7QUFDRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUMsc0NBQXNDO0FBQ3RDLDBDQUEwQztBQUMxQyxzREFBc0Q7QUFDdEQsa0RBQWtEO0FBQ2xELHNDQUFzQztBQUN0QyxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvRUFBb0UsTUFBTTtBQUMxRTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxPQUFPO0FBQ25EO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QyxXQUFXO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4Qix5QkFBeUIsYUFBYTtBQUNwRTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx1QkFBdUI7QUFDdkI7QUFDQSw0QkFBNEIseUNBQXlDO0FBQ3JFO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0Msd0NBQXdDO0FBQ3hFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRDtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDO0FBQy9DLGtEQUFrRDtBQUNsRDtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEM7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUwsK0RBQStELEVBQUUsSUFBSSxjQUFjO0FBQ25GO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQSxnQkFBZ0I7QUFDaEIsbUJBQW1CLGtCQUFrQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw2QkFBNkIsb0JBQW9CO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxLQUFLO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsbUJBQW1CLGtCQUFrQjtBQUNyQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxnQkFBZ0I7QUFDaEIsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0M7QUFDbEMsa0NBQWtDO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLGdCQUFnQjtBQUNoQixHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsZ0JBQWdCO0FBQ2hCLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLGdCQUFnQixnQkFBZ0IsY0FBYztBQUM5QyxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOERBQThELFdBQVc7QUFDekUsa0RBQWtELFdBQVc7QUFDN0Q7QUFDQSxxREFBcUQ7QUFDckQsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLGtDQUFrQztBQUNsQztBQUNBLDZEQUE2RCw2QkFBNkI7QUFDMUY7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBLEtBQUs7QUFDTCxnQkFBZ0IsZ0JBQWdCO0FBQ2hDLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLGFBQWE7QUFDekIsZ0JBQWdCO0FBQ2hCLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksYUFBYTtBQUN6QixnQkFBZ0I7QUFDaEIsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLGdCQUFnQjtBQUNoQixHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQztBQUNsQyxrQ0FBa0M7QUFDbEM7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsZ0JBQWdCO0FBQ2hCLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxhQUFhO0FBQ3pCLGdCQUFnQjtBQUNoQixHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixNQUFNO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQSxHQUFHOztBQUVILENBQUMiLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29kZW1pcnJvci9tb2RlL2NsaWtlL2NsaWtlLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnNcbi8vIERpc3RyaWJ1dGVkIHVuZGVyIGFuIE1JVCBsaWNlbnNlOiBodHRwczovL2NvZGVtaXJyb3IubmV0L0xJQ0VOU0VcblxuKGZ1bmN0aW9uKG1vZCkge1xuICBpZiAodHlwZW9mIGV4cG9ydHMgPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgbW9kdWxlID09IFwib2JqZWN0XCIpIC8vIENvbW1vbkpTXG4gICAgbW9kKHJlcXVpcmUoXCIuLi8uLi9saWIvY29kZW1pcnJvclwiKSk7XG4gIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIC8vIEFNRFxuICAgIGRlZmluZShbXCIuLi8uLi9saWIvY29kZW1pcnJvclwiXSwgbW9kKTtcbiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudlxuICAgIG1vZChDb2RlTWlycm9yKTtcbn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHtcblwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiBDb250ZXh0KGluZGVudGVkLCBjb2x1bW4sIHR5cGUsIGluZm8sIGFsaWduLCBwcmV2KSB7XG4gIHRoaXMuaW5kZW50ZWQgPSBpbmRlbnRlZDtcbiAgdGhpcy5jb2x1bW4gPSBjb2x1bW47XG4gIHRoaXMudHlwZSA9IHR5cGU7XG4gIHRoaXMuaW5mbyA9IGluZm87XG4gIHRoaXMuYWxpZ24gPSBhbGlnbjtcbiAgdGhpcy5wcmV2ID0gcHJldjtcbn1cbmZ1bmN0aW9uIHB1c2hDb250ZXh0KHN0YXRlLCBjb2wsIHR5cGUsIGluZm8pIHtcbiAgdmFyIGluZGVudCA9IHN0YXRlLmluZGVudGVkO1xuICBpZiAoc3RhdGUuY29udGV4dCAmJiBzdGF0ZS5jb250ZXh0LnR5cGUgPT0gXCJzdGF0ZW1lbnRcIiAmJiB0eXBlICE9IFwic3RhdGVtZW50XCIpXG4gICAgaW5kZW50ID0gc3RhdGUuY29udGV4dC5pbmRlbnRlZDtcbiAgcmV0dXJuIHN0YXRlLmNvbnRleHQgPSBuZXcgQ29udGV4dChpbmRlbnQsIGNvbCwgdHlwZSwgaW5mbywgbnVsbCwgc3RhdGUuY29udGV4dCk7XG59XG5mdW5jdGlvbiBwb3BDb250ZXh0KHN0YXRlKSB7XG4gIHZhciB0ID0gc3RhdGUuY29udGV4dC50eXBlO1xuICBpZiAodCA9PSBcIilcIiB8fCB0ID09IFwiXVwiIHx8IHQgPT0gXCJ9XCIpXG4gICAgc3RhdGUuaW5kZW50ZWQgPSBzdGF0ZS5jb250ZXh0LmluZGVudGVkO1xuICByZXR1cm4gc3RhdGUuY29udGV4dCA9IHN0YXRlLmNvbnRleHQucHJldjtcbn1cblxuZnVuY3Rpb24gdHlwZUJlZm9yZShzdHJlYW0sIHN0YXRlLCBwb3MpIHtcbiAgaWYgKHN0YXRlLnByZXZUb2tlbiA9PSBcInZhcmlhYmxlXCIgfHwgc3RhdGUucHJldlRva2VuID09IFwidHlwZVwiKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKC9cXFMoPzpbXi0gXT58WypcXF1dKVxccyokfFxcKiQvLnRlc3Qoc3RyZWFtLnN0cmluZy5zbGljZSgwLCBwb3MpKSkgcmV0dXJuIHRydWU7XG4gIGlmIChzdGF0ZS50eXBlQXRFbmRPZkxpbmUgJiYgc3RyZWFtLmNvbHVtbigpID09IHN0cmVhbS5pbmRlbnRhdGlvbigpKSByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaXNUb3BTY29wZShjb250ZXh0KSB7XG4gIGZvciAoOzspIHtcbiAgICBpZiAoIWNvbnRleHQgfHwgY29udGV4dC50eXBlID09IFwidG9wXCIpIHJldHVybiB0cnVlO1xuICAgIGlmIChjb250ZXh0LnR5cGUgPT0gXCJ9XCIgJiYgY29udGV4dC5wcmV2LmluZm8gIT0gXCJuYW1lc3BhY2VcIikgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnRleHQgPSBjb250ZXh0LnByZXY7XG4gIH1cbn1cblxuQ29kZU1pcnJvci5kZWZpbmVNb2RlKFwiY2xpa2VcIiwgZnVuY3Rpb24oY29uZmlnLCBwYXJzZXJDb25maWcpIHtcbiAgdmFyIGluZGVudFVuaXQgPSBjb25maWcuaW5kZW50VW5pdCxcbiAgICAgIHN0YXRlbWVudEluZGVudFVuaXQgPSBwYXJzZXJDb25maWcuc3RhdGVtZW50SW5kZW50VW5pdCB8fCBpbmRlbnRVbml0LFxuICAgICAgZG9udEFsaWduQ2FsbHMgPSBwYXJzZXJDb25maWcuZG9udEFsaWduQ2FsbHMsXG4gICAgICBrZXl3b3JkcyA9IHBhcnNlckNvbmZpZy5rZXl3b3JkcyB8fCB7fSxcbiAgICAgIHR5cGVzID0gcGFyc2VyQ29uZmlnLnR5cGVzIHx8IHt9LFxuICAgICAgYnVpbHRpbiA9IHBhcnNlckNvbmZpZy5idWlsdGluIHx8IHt9LFxuICAgICAgYmxvY2tLZXl3b3JkcyA9IHBhcnNlckNvbmZpZy5ibG9ja0tleXdvcmRzIHx8IHt9LFxuICAgICAgZGVmS2V5d29yZHMgPSBwYXJzZXJDb25maWcuZGVmS2V5d29yZHMgfHwge30sXG4gICAgICBhdG9tcyA9IHBhcnNlckNvbmZpZy5hdG9tcyB8fCB7fSxcbiAgICAgIGhvb2tzID0gcGFyc2VyQ29uZmlnLmhvb2tzIHx8IHt9LFxuICAgICAgbXVsdGlMaW5lU3RyaW5ncyA9IHBhcnNlckNvbmZpZy5tdWx0aUxpbmVTdHJpbmdzLFxuICAgICAgaW5kZW50U3RhdGVtZW50cyA9IHBhcnNlckNvbmZpZy5pbmRlbnRTdGF0ZW1lbnRzICE9PSBmYWxzZSxcbiAgICAgIGluZGVudFN3aXRjaCA9IHBhcnNlckNvbmZpZy5pbmRlbnRTd2l0Y2ggIT09IGZhbHNlLFxuICAgICAgbmFtZXNwYWNlU2VwYXJhdG9yID0gcGFyc2VyQ29uZmlnLm5hbWVzcGFjZVNlcGFyYXRvcixcbiAgICAgIGlzUHVuY3R1YXRpb25DaGFyID0gcGFyc2VyQ29uZmlnLmlzUHVuY3R1YXRpb25DaGFyIHx8IC9bXFxbXFxde31cXChcXCksO1xcOlxcLl0vLFxuICAgICAgbnVtYmVyU3RhcnQgPSBwYXJzZXJDb25maWcubnVtYmVyU3RhcnQgfHwgL1tcXGRcXC5dLyxcbiAgICAgIG51bWJlciA9IHBhcnNlckNvbmZpZy5udW1iZXIgfHwgL14oPzoweFthLWZcXGRdK3wwYlswMV0rfCg/OlxcZCtcXC4/XFxkKnxcXC5cXGQrKSg/OmVbLStdP1xcZCspPykodXxsbD98bHxmKT8vaSxcbiAgICAgIGlzT3BlcmF0b3JDaGFyID0gcGFyc2VyQ29uZmlnLmlzT3BlcmF0b3JDaGFyIHx8IC9bK1xcLSomJT08PiE/fFxcL10vLFxuICAgICAgaXNJZGVudGlmaWVyQ2hhciA9IHBhcnNlckNvbmZpZy5pc0lkZW50aWZpZXJDaGFyIHx8IC9bXFx3XFwkX1xceGExLVxcdWZmZmZdLyxcbiAgICAgIC8vIEFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSB7c3RyaW5nfSB0b2tlbiBhbmQgcmV0dXJucyB0cnVlIGlmIGl0XG4gICAgICAvLyBzaG91bGQgYmUgdHJlYXRlZCBhcyBhIGJ1aWx0aW4uXG4gICAgICBpc1Jlc2VydmVkSWRlbnRpZmllciA9IHBhcnNlckNvbmZpZy5pc1Jlc2VydmVkSWRlbnRpZmllciB8fCBmYWxzZTtcblxuICB2YXIgY3VyUHVuYywgaXNEZWZLZXl3b3JkO1xuXG4gIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7XG4gICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTtcbiAgICBpZiAoaG9va3NbY2hdKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gaG9va3NbY2hdKHN0cmVhbSwgc3RhdGUpO1xuICAgICAgaWYgKHJlc3VsdCAhPT0gZmFsc2UpIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGlmIChjaCA9PSAnXCInIHx8IGNoID09IFwiJ1wiKSB7XG4gICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuU3RyaW5nKGNoKTtcbiAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG4gICAgaWYgKG51bWJlclN0YXJ0LnRlc3QoY2gpKSB7XG4gICAgICBzdHJlYW0uYmFja1VwKDEpXG4gICAgICBpZiAoc3RyZWFtLm1hdGNoKG51bWJlcikpIHJldHVybiBcIm51bWJlclwiXG4gICAgICBzdHJlYW0ubmV4dCgpXG4gICAgfVxuICAgIGlmIChpc1B1bmN0dWF0aW9uQ2hhci50ZXN0KGNoKSkge1xuICAgICAgY3VyUHVuYyA9IGNoO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChjaCA9PSBcIi9cIikge1xuICAgICAgaWYgKHN0cmVhbS5lYXQoXCIqXCIpKSB7XG4gICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5Db21tZW50O1xuICAgICAgICByZXR1cm4gdG9rZW5Db21tZW50KHN0cmVhbSwgc3RhdGUpO1xuICAgICAgfVxuICAgICAgaWYgKHN0cmVhbS5lYXQoXCIvXCIpKSB7XG4gICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTtcbiAgICAgICAgcmV0dXJuIFwiY29tbWVudFwiO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNPcGVyYXRvckNoYXIudGVzdChjaCkpIHtcbiAgICAgIHdoaWxlICghc3RyZWFtLm1hdGNoKC9eXFwvW1xcLypdLywgZmFsc2UpICYmIHN0cmVhbS5lYXQoaXNPcGVyYXRvckNoYXIpKSB7fVxuICAgICAgcmV0dXJuIFwib3BlcmF0b3JcIjtcbiAgICB9XG4gICAgc3RyZWFtLmVhdFdoaWxlKGlzSWRlbnRpZmllckNoYXIpO1xuICAgIGlmIChuYW1lc3BhY2VTZXBhcmF0b3IpIHdoaWxlIChzdHJlYW0ubWF0Y2gobmFtZXNwYWNlU2VwYXJhdG9yKSlcbiAgICAgIHN0cmVhbS5lYXRXaGlsZShpc0lkZW50aWZpZXJDaGFyKTtcblxuICAgIHZhciBjdXIgPSBzdHJlYW0uY3VycmVudCgpO1xuICAgIGlmIChjb250YWlucyhrZXl3b3JkcywgY3VyKSkge1xuICAgICAgaWYgKGNvbnRhaW5zKGJsb2NrS2V5d29yZHMsIGN1cikpIGN1clB1bmMgPSBcIm5ld3N0YXRlbWVudFwiO1xuICAgICAgaWYgKGNvbnRhaW5zKGRlZktleXdvcmRzLCBjdXIpKSBpc0RlZktleXdvcmQgPSB0cnVlO1xuICAgICAgcmV0dXJuIFwia2V5d29yZFwiO1xuICAgIH1cbiAgICBpZiAoY29udGFpbnModHlwZXMsIGN1cikpIHJldHVybiBcInR5cGVcIjtcbiAgICBpZiAoY29udGFpbnMoYnVpbHRpbiwgY3VyKVxuICAgICAgICB8fCAoaXNSZXNlcnZlZElkZW50aWZpZXIgJiYgaXNSZXNlcnZlZElkZW50aWZpZXIoY3VyKSkpIHtcbiAgICAgIGlmIChjb250YWlucyhibG9ja0tleXdvcmRzLCBjdXIpKSBjdXJQdW5jID0gXCJuZXdzdGF0ZW1lbnRcIjtcbiAgICAgIHJldHVybiBcImJ1aWx0aW5cIjtcbiAgICB9XG4gICAgaWYgKGNvbnRhaW5zKGF0b21zLCBjdXIpKSByZXR1cm4gXCJhdG9tXCI7XG4gICAgcmV0dXJuIFwidmFyaWFibGVcIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRva2VuU3RyaW5nKHF1b3RlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHtcbiAgICAgIHZhciBlc2NhcGVkID0gZmFsc2UsIG5leHQsIGVuZCA9IGZhbHNlO1xuICAgICAgd2hpbGUgKChuZXh0ID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkge1xuICAgICAgICBpZiAobmV4dCA9PSBxdW90ZSAmJiAhZXNjYXBlZCkge2VuZCA9IHRydWU7IGJyZWFrO31cbiAgICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIG5leHQgPT0gXCJcXFxcXCI7XG4gICAgICB9XG4gICAgICBpZiAoZW5kIHx8ICEoZXNjYXBlZCB8fCBtdWx0aUxpbmVTdHJpbmdzKSlcbiAgICAgICAgc3RhdGUudG9rZW5pemUgPSBudWxsO1xuICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRva2VuQ29tbWVudChzdHJlYW0sIHN0YXRlKSB7XG4gICAgdmFyIG1heWJlRW5kID0gZmFsc2UsIGNoO1xuICAgIHdoaWxlIChjaCA9IHN0cmVhbS5uZXh0KCkpIHtcbiAgICAgIGlmIChjaCA9PSBcIi9cIiAmJiBtYXliZUVuZCkge1xuICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IG51bGw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgbWF5YmVFbmQgPSAoY2ggPT0gXCIqXCIpO1xuICAgIH1cbiAgICByZXR1cm4gXCJjb21tZW50XCI7XG4gIH1cblxuICBmdW5jdGlvbiBtYXliZUVPTChzdHJlYW0sIHN0YXRlKSB7XG4gICAgaWYgKHBhcnNlckNvbmZpZy50eXBlRmlyc3REZWZpbml0aW9ucyAmJiBzdHJlYW0uZW9sKCkgJiYgaXNUb3BTY29wZShzdGF0ZS5jb250ZXh0KSlcbiAgICAgIHN0YXRlLnR5cGVBdEVuZE9mTGluZSA9IHR5cGVCZWZvcmUoc3RyZWFtLCBzdGF0ZSwgc3RyZWFtLnBvcylcbiAgfVxuXG4gIC8vIEludGVyZmFjZVxuXG4gIHJldHVybiB7XG4gICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oYmFzZWNvbHVtbikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdG9rZW5pemU6IG51bGwsXG4gICAgICAgIGNvbnRleHQ6IG5ldyBDb250ZXh0KChiYXNlY29sdW1uIHx8IDApIC0gaW5kZW50VW5pdCwgMCwgXCJ0b3BcIiwgbnVsbCwgZmFsc2UpLFxuICAgICAgICBpbmRlbnRlZDogMCxcbiAgICAgICAgc3RhcnRPZkxpbmU6IHRydWUsXG4gICAgICAgIHByZXZUb2tlbjogbnVsbFxuICAgICAgfTtcbiAgICB9LFxuXG4gICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHtcbiAgICAgIHZhciBjdHggPSBzdGF0ZS5jb250ZXh0O1xuICAgICAgaWYgKHN0cmVhbS5zb2woKSkge1xuICAgICAgICBpZiAoY3R4LmFsaWduID09IG51bGwpIGN0eC5hbGlnbiA9IGZhbHNlO1xuICAgICAgICBzdGF0ZS5pbmRlbnRlZCA9IHN0cmVhbS5pbmRlbnRhdGlvbigpO1xuICAgICAgICBzdGF0ZS5zdGFydE9mTGluZSA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHsgbWF5YmVFT0woc3RyZWFtLCBzdGF0ZSk7IHJldHVybiBudWxsOyB9XG4gICAgICBjdXJQdW5jID0gaXNEZWZLZXl3b3JkID0gbnVsbDtcbiAgICAgIHZhciBzdHlsZSA9IChzdGF0ZS50b2tlbml6ZSB8fCB0b2tlbkJhc2UpKHN0cmVhbSwgc3RhdGUpO1xuICAgICAgaWYgKHN0eWxlID09IFwiY29tbWVudFwiIHx8IHN0eWxlID09IFwibWV0YVwiKSByZXR1cm4gc3R5bGU7XG4gICAgICBpZiAoY3R4LmFsaWduID09IG51bGwpIGN0eC5hbGlnbiA9IHRydWU7XG5cbiAgICAgIGlmIChjdXJQdW5jID09IFwiO1wiIHx8IGN1clB1bmMgPT0gXCI6XCIgfHwgKGN1clB1bmMgPT0gXCIsXCIgJiYgc3RyZWFtLm1hdGNoKC9eXFxzKig/OlxcL1xcLy4qKT8kLywgZmFsc2UpKSlcbiAgICAgICAgd2hpbGUgKHN0YXRlLmNvbnRleHQudHlwZSA9PSBcInN0YXRlbWVudFwiKSBwb3BDb250ZXh0KHN0YXRlKTtcbiAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gXCJ7XCIpIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0uY29sdW1uKCksIFwifVwiKTtcbiAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gXCJbXCIpIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0uY29sdW1uKCksIFwiXVwiKTtcbiAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gXCIoXCIpIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0uY29sdW1uKCksIFwiKVwiKTtcbiAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gXCJ9XCIpIHtcbiAgICAgICAgd2hpbGUgKGN0eC50eXBlID09IFwic3RhdGVtZW50XCIpIGN0eCA9IHBvcENvbnRleHQoc3RhdGUpO1xuICAgICAgICBpZiAoY3R4LnR5cGUgPT0gXCJ9XCIpIGN0eCA9IHBvcENvbnRleHQoc3RhdGUpO1xuICAgICAgICB3aGlsZSAoY3R4LnR5cGUgPT0gXCJzdGF0ZW1lbnRcIikgY3R4ID0gcG9wQ29udGV4dChzdGF0ZSk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChjdXJQdW5jID09IGN0eC50eXBlKSBwb3BDb250ZXh0KHN0YXRlKTtcbiAgICAgIGVsc2UgaWYgKGluZGVudFN0YXRlbWVudHMgJiZcbiAgICAgICAgICAgICAgICgoKGN0eC50eXBlID09IFwifVwiIHx8IGN0eC50eXBlID09IFwidG9wXCIpICYmIGN1clB1bmMgIT0gXCI7XCIpIHx8XG4gICAgICAgICAgICAgICAgKGN0eC50eXBlID09IFwic3RhdGVtZW50XCIgJiYgY3VyUHVuYyA9PSBcIm5ld3N0YXRlbWVudFwiKSkpIHtcbiAgICAgICAgcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbS5jb2x1bW4oKSwgXCJzdGF0ZW1lbnRcIiwgc3RyZWFtLmN1cnJlbnQoKSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdHlsZSA9PSBcInZhcmlhYmxlXCIgJiZcbiAgICAgICAgICAoKHN0YXRlLnByZXZUb2tlbiA9PSBcImRlZlwiIHx8XG4gICAgICAgICAgICAocGFyc2VyQ29uZmlnLnR5cGVGaXJzdERlZmluaXRpb25zICYmIHR5cGVCZWZvcmUoc3RyZWFtLCBzdGF0ZSwgc3RyZWFtLnN0YXJ0KSAmJlxuICAgICAgICAgICAgIGlzVG9wU2NvcGUoc3RhdGUuY29udGV4dCkgJiYgc3RyZWFtLm1hdGNoKC9eXFxzKlxcKC8sIGZhbHNlKSkpKSlcbiAgICAgICAgc3R5bGUgPSBcImRlZlwiO1xuXG4gICAgICBpZiAoaG9va3MudG9rZW4pIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGhvb2tzLnRva2VuKHN0cmVhbSwgc3RhdGUsIHN0eWxlKTtcbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSBzdHlsZSA9IHJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0eWxlID09IFwiZGVmXCIgJiYgcGFyc2VyQ29uZmlnLnN0eWxlRGVmcyA9PT0gZmFsc2UpIHN0eWxlID0gXCJ2YXJpYWJsZVwiO1xuXG4gICAgICBzdGF0ZS5zdGFydE9mTGluZSA9IGZhbHNlO1xuICAgICAgc3RhdGUucHJldlRva2VuID0gaXNEZWZLZXl3b3JkID8gXCJkZWZcIiA6IHN0eWxlIHx8IGN1clB1bmM7XG4gICAgICBtYXliZUVPTChzdHJlYW0sIHN0YXRlKTtcbiAgICAgIHJldHVybiBzdHlsZTtcbiAgICB9LFxuXG4gICAgaW5kZW50OiBmdW5jdGlvbihzdGF0ZSwgdGV4dEFmdGVyKSB7XG4gICAgICBpZiAoc3RhdGUudG9rZW5pemUgIT0gdG9rZW5CYXNlICYmIHN0YXRlLnRva2VuaXplICE9IG51bGwgfHwgc3RhdGUudHlwZUF0RW5kT2ZMaW5lKSByZXR1cm4gQ29kZU1pcnJvci5QYXNzO1xuICAgICAgdmFyIGN0eCA9IHN0YXRlLmNvbnRleHQsIGZpcnN0Q2hhciA9IHRleHRBZnRlciAmJiB0ZXh0QWZ0ZXIuY2hhckF0KDApO1xuICAgICAgdmFyIGNsb3NpbmcgPSBmaXJzdENoYXIgPT0gY3R4LnR5cGU7XG4gICAgICBpZiAoY3R4LnR5cGUgPT0gXCJzdGF0ZW1lbnRcIiAmJiBmaXJzdENoYXIgPT0gXCJ9XCIpIGN0eCA9IGN0eC5wcmV2O1xuICAgICAgaWYgKHBhcnNlckNvbmZpZy5kb250SW5kZW50U3RhdGVtZW50cylcbiAgICAgICAgd2hpbGUgKGN0eC50eXBlID09IFwic3RhdGVtZW50XCIgJiYgcGFyc2VyQ29uZmlnLmRvbnRJbmRlbnRTdGF0ZW1lbnRzLnRlc3QoY3R4LmluZm8pKVxuICAgICAgICAgIGN0eCA9IGN0eC5wcmV2XG4gICAgICBpZiAoaG9va3MuaW5kZW50KSB7XG4gICAgICAgIHZhciBob29rID0gaG9va3MuaW5kZW50KHN0YXRlLCBjdHgsIHRleHRBZnRlciwgaW5kZW50VW5pdCk7XG4gICAgICAgIGlmICh0eXBlb2YgaG9vayA9PSBcIm51bWJlclwiKSByZXR1cm4gaG9va1xuICAgICAgfVxuICAgICAgdmFyIHN3aXRjaEJsb2NrID0gY3R4LnByZXYgJiYgY3R4LnByZXYuaW5mbyA9PSBcInN3aXRjaFwiO1xuICAgICAgaWYgKHBhcnNlckNvbmZpZy5hbGxtYW5JbmRlbnRhdGlvbiAmJiAvW3soXS8udGVzdChmaXJzdENoYXIpKSB7XG4gICAgICAgIHdoaWxlIChjdHgudHlwZSAhPSBcInRvcFwiICYmIGN0eC50eXBlICE9IFwifVwiKSBjdHggPSBjdHgucHJldlxuICAgICAgICByZXR1cm4gY3R4LmluZGVudGVkXG4gICAgICB9XG4gICAgICBpZiAoY3R4LnR5cGUgPT0gXCJzdGF0ZW1lbnRcIilcbiAgICAgICAgcmV0dXJuIGN0eC5pbmRlbnRlZCArIChmaXJzdENoYXIgPT0gXCJ7XCIgPyAwIDogc3RhdGVtZW50SW5kZW50VW5pdCk7XG4gICAgICBpZiAoY3R4LmFsaWduICYmICghZG9udEFsaWduQ2FsbHMgfHwgY3R4LnR5cGUgIT0gXCIpXCIpKVxuICAgICAgICByZXR1cm4gY3R4LmNvbHVtbiArIChjbG9zaW5nID8gMCA6IDEpO1xuICAgICAgaWYgKGN0eC50eXBlID09IFwiKVwiICYmICFjbG9zaW5nKVxuICAgICAgICByZXR1cm4gY3R4LmluZGVudGVkICsgc3RhdGVtZW50SW5kZW50VW5pdDtcblxuICAgICAgcmV0dXJuIGN0eC5pbmRlbnRlZCArIChjbG9zaW5nID8gMCA6IGluZGVudFVuaXQpICtcbiAgICAgICAgKCFjbG9zaW5nICYmIHN3aXRjaEJsb2NrICYmICEvXig/OmNhc2V8ZGVmYXVsdClcXGIvLnRlc3QodGV4dEFmdGVyKSA/IGluZGVudFVuaXQgOiAwKTtcbiAgICB9LFxuXG4gICAgZWxlY3RyaWNJbnB1dDogaW5kZW50U3dpdGNoID8gL15cXHMqKD86Y2FzZSAuKj86fGRlZmF1bHQ6fFxce1xcfT98XFx9KSQvIDogL15cXHMqW3t9XSQvLFxuICAgIGJsb2NrQ29tbWVudFN0YXJ0OiBcIi8qXCIsXG4gICAgYmxvY2tDb21tZW50RW5kOiBcIiovXCIsXG4gICAgYmxvY2tDb21tZW50Q29udGludWU6IFwiICogXCIsXG4gICAgbGluZUNvbW1lbnQ6IFwiLy9cIixcbiAgICBmb2xkOiBcImJyYWNlXCJcbiAgfTtcbn0pO1xuXG4gIGZ1bmN0aW9uIHdvcmRzKHN0cikge1xuICAgIHZhciBvYmogPSB7fSwgd29yZHMgPSBzdHIuc3BsaXQoXCIgXCIpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyArK2kpIG9ialt3b3Jkc1tpXV0gPSB0cnVlO1xuICAgIHJldHVybiBvYmo7XG4gIH1cbiAgZnVuY3Rpb24gY29udGFpbnMod29yZHMsIHdvcmQpIHtcbiAgICBpZiAodHlwZW9mIHdvcmRzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiB3b3Jkcyh3b3JkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHdvcmRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKHdvcmQpO1xuICAgIH1cbiAgfVxuICB2YXIgY0tleXdvcmRzID0gXCJhdXRvIGlmIGJyZWFrIGNhc2UgcmVnaXN0ZXIgY29udGludWUgcmV0dXJuIGRlZmF1bHQgZG8gc2l6ZW9mIFwiICtcbiAgICBcInN0YXRpYyBlbHNlIHN0cnVjdCBzd2l0Y2ggZXh0ZXJuIHR5cGVkZWYgdW5pb24gZm9yIGdvdG8gd2hpbGUgZW51bSBjb25zdCBcIiArXG4gICAgXCJ2b2xhdGlsZSBpbmxpbmUgcmVzdHJpY3QgYXNtIGZvcnRyYW5cIjtcblxuICAvLyBLZXl3b3JkcyBmcm9tIGh0dHBzOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9rZXl3b3JkIGluY2x1ZGVzIEMrKzIwLlxuICB2YXIgY3BwS2V5d29yZHMgPSBcImFsaWduYXMgYWxpZ25vZiBhbmQgYW5kX2VxIGF1ZGl0IGF4aW9tIGJpdGFuZCBiaXRvciBjYXRjaCBcIiArXG4gIFwiY2xhc3MgY29tcGwgY29uY2VwdCBjb25zdGV4cHIgY29uc3RfY2FzdCBkZWNsdHlwZSBkZWxldGUgZHluYW1pY19jYXN0IFwiICtcbiAgXCJleHBsaWNpdCBleHBvcnQgZmluYWwgZnJpZW5kIGltcG9ydCBtb2R1bGUgbXV0YWJsZSBuYW1lc3BhY2UgbmV3IG5vZXhjZXB0IFwiICtcbiAgXCJub3Qgbm90X2VxIG9wZXJhdG9yIG9yIG9yX2VxIG92ZXJyaWRlIHByaXZhdGUgcHJvdGVjdGVkIHB1YmxpYyBcIiArXG4gIFwicmVpbnRlcnByZXRfY2FzdCByZXF1aXJlcyBzdGF0aWNfYXNzZXJ0IHN0YXRpY19jYXN0IHRlbXBsYXRlIHRoaXMgXCIgK1xuICBcInRocmVhZF9sb2NhbCB0aHJvdyB0cnkgdHlwZWlkIHR5cGVuYW1lIHVzaW5nIHZpcnR1YWwgeG9yIHhvcl9lcVwiO1xuXG4gIHZhciBvYmpDS2V5d29yZHMgPSBcImJ5Y29weSBieXJlZiBpbiBpbm91dCBvbmV3YXkgb3V0IHNlbGYgc3VwZXIgYXRvbWljIG5vbmF0b21pYyByZXRhaW4gY29weSBcIiArXG4gIFwicmVhZHdyaXRlIHJlYWRvbmx5IHN0cm9uZyB3ZWFrIGFzc2lnbiB0eXBlb2YgbnVsbGFibGUgbm9ubnVsbCBudWxsX3Jlc2V0dGFibGUgX2NtZCBcIiArXG4gIFwiQGludGVyZmFjZSBAaW1wbGVtZW50YXRpb24gQGVuZCBAcHJvdG9jb2wgQGVuY29kZSBAcHJvcGVydHkgQHN5bnRoZXNpemUgQGR5bmFtaWMgQGNsYXNzIFwiICtcbiAgXCJAcHVibGljIEBwYWNrYWdlIEBwcml2YXRlIEBwcm90ZWN0ZWQgQHJlcXVpcmVkIEBvcHRpb25hbCBAdHJ5IEBjYXRjaCBAZmluYWxseSBAaW1wb3J0IFwiICtcbiAgXCJAc2VsZWN0b3IgQGVuY29kZSBAZGVmcyBAc3luY2hyb25pemVkIEBhdXRvcmVsZWFzZXBvb2wgQGNvbXBhdGliaWxpdHlfYWxpYXMgQGF2YWlsYWJsZVwiO1xuXG4gIHZhciBvYmpDQnVpbHRpbnMgPSBcIkZPVU5EQVRJT05fRVhQT1JUIEZPVU5EQVRJT05fRVhURVJOIE5TX0lOTElORSBOU19GT1JNQVRfRlVOQ1RJT04gXCIgK1xuICBcIiBOU19SRVRVUk5TX1JFVEFJTkVETlNfRVJST1JfRU5VTSBOU19SRVRVUk5TX05PVF9SRVRBSU5FRCBOU19SRVRVUk5TX0lOTkVSX1BPSU5URVIgXCIgK1xuICBcIk5TX0RFU0lHTkFURURfSU5JVElBTElaRVIgTlNfRU5VTSBOU19PUFRJT05TIE5TX1JFUVVJUkVTX05JTF9URVJNSU5BVElPTiBcIiArXG4gIFwiTlNfQVNTVU1FX05PTk5VTExfQkVHSU4gTlNfQVNTVU1FX05PTk5VTExfRU5EIE5TX1NXSUZUX05BTUUgTlNfUkVGSU5FRF9GT1JfU1dJRlRcIlxuXG4gIC8vIERvIG5vdCB1c2UgdGhpcy4gVXNlIHRoZSBjVHlwZXMgZnVuY3Rpb24gYmVsb3cuIFRoaXMgaXMgZ2xvYmFsIGp1c3QgdG8gYXZvaWRcbiAgLy8gZXhjZXNzaXZlIGNhbGxzIHdoZW4gY1R5cGVzIGlzIGJlaW5nIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBkdXJpbmcgYSBwYXJzZS5cbiAgdmFyIGJhc2ljQ1R5cGVzID0gd29yZHMoXCJpbnQgbG9uZyBjaGFyIHNob3J0IGRvdWJsZSBmbG9hdCB1bnNpZ25lZCBzaWduZWQgXCIgK1xuICAgIFwidm9pZCBib29sXCIpO1xuXG4gIC8vIERvIG5vdCB1c2UgdGhpcy4gVXNlIHRoZSBvYmpDVHlwZXMgZnVuY3Rpb24gYmVsb3cuIFRoaXMgaXMgZ2xvYmFsIGp1c3QgdG8gYXZvaWRcbiAgLy8gZXhjZXNzaXZlIGNhbGxzIHdoZW4gb2JqQ1R5cGVzIGlzIGJlaW5nIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBkdXJpbmcgYSBwYXJzZS5cbiAgdmFyIGJhc2ljT2JqQ1R5cGVzID0gd29yZHMoXCJTRUwgaW5zdGFuY2V0eXBlIGlkIENsYXNzIFByb3RvY29sIEJPT0xcIik7XG5cbiAgLy8gUmV0dXJucyB0cnVlIGlmIGlkZW50aWZpZXIgaXMgYSBcIkNcIiB0eXBlLlxuICAvLyBDIHR5cGUgaXMgZGVmaW5lZCBhcyB0aG9zZSB0aGF0IGFyZSByZXNlcnZlZCBieSB0aGUgY29tcGlsZXIgKGJhc2ljVHlwZXMpLFxuICAvLyBhbmQgdGhvc2UgdGhhdCBlbmQgaW4gX3QgKFJlc2VydmVkIGJ5IFBPU0lYIGZvciB0eXBlcylcbiAgLy8gaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2xpYmMvbWFudWFsL2h0bWxfbm9kZS9SZXNlcnZlZC1OYW1lcy5odG1sXG4gIGZ1bmN0aW9uIGNUeXBlcyhpZGVudGlmaWVyKSB7XG4gICAgcmV0dXJuIGNvbnRhaW5zKGJhc2ljQ1R5cGVzLCBpZGVudGlmaWVyKSB8fCAvLitfdCQvLnRlc3QoaWRlbnRpZmllcik7XG4gIH1cblxuICAvLyBSZXR1cm5zIHRydWUgaWYgaWRlbnRpZmllciBpcyBhIFwiT2JqZWN0aXZlIENcIiB0eXBlLlxuICBmdW5jdGlvbiBvYmpDVHlwZXMoaWRlbnRpZmllcikge1xuICAgIHJldHVybiBjVHlwZXMoaWRlbnRpZmllcikgfHwgY29udGFpbnMoYmFzaWNPYmpDVHlwZXMsIGlkZW50aWZpZXIpO1xuICB9XG5cbiAgdmFyIGNCbG9ja0tleXdvcmRzID0gXCJjYXNlIGRvIGVsc2UgZm9yIGlmIHN3aXRjaCB3aGlsZSBzdHJ1Y3QgZW51bSB1bmlvblwiO1xuICB2YXIgY0RlZktleXdvcmRzID0gXCJzdHJ1Y3QgZW51bSB1bmlvblwiO1xuXG4gIGZ1bmN0aW9uIGNwcEhvb2soc3RyZWFtLCBzdGF0ZSkge1xuICAgIGlmICghc3RhdGUuc3RhcnRPZkxpbmUpIHJldHVybiBmYWxzZVxuICAgIGZvciAodmFyIGNoLCBuZXh0ID0gbnVsbDsgY2ggPSBzdHJlYW0ucGVlaygpOykge1xuICAgICAgaWYgKGNoID09IFwiXFxcXFwiICYmIHN0cmVhbS5tYXRjaCgvXi4kLykpIHtcbiAgICAgICAgbmV4dCA9IGNwcEhvb2tcbiAgICAgICAgYnJlYWtcbiAgICAgIH0gZWxzZSBpZiAoY2ggPT0gXCIvXCIgJiYgc3RyZWFtLm1hdGNoKC9eXFwvW1xcL1xcKl0vLCBmYWxzZSkpIHtcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIHN0cmVhbS5uZXh0KClcbiAgICB9XG4gICAgc3RhdGUudG9rZW5pemUgPSBuZXh0XG4gICAgcmV0dXJuIFwibWV0YVwiXG4gIH1cblxuICBmdW5jdGlvbiBwb2ludGVySG9vayhfc3RyZWFtLCBzdGF0ZSkge1xuICAgIGlmIChzdGF0ZS5wcmV2VG9rZW4gPT0gXCJ0eXBlXCIpIHJldHVybiBcInR5cGVcIjtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBGb3IgQyBhbmQgQysrIChhbmQgT2JqQyk6IGlkZW50aWZpZXJzIHN0YXJ0aW5nIHdpdGggX19cbiAgLy8gb3IgXyBmb2xsb3dlZCBieSBhIGNhcGl0YWwgbGV0dGVyIGFyZSByZXNlcnZlZCBmb3IgdGhlIGNvbXBpbGVyLlxuICBmdW5jdGlvbiBjSXNSZXNlcnZlZElkZW50aWZpZXIodG9rZW4pIHtcbiAgICBpZiAoIXRva2VuIHx8IHRva2VuLmxlbmd0aCA8IDIpIHJldHVybiBmYWxzZTtcbiAgICBpZiAodG9rZW5bMF0gIT0gJ18nKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuICh0b2tlblsxXSA9PSAnXycpIHx8ICh0b2tlblsxXSAhPT0gdG9rZW5bMV0udG9Mb3dlckNhc2UoKSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcHAxNExpdGVyYWwoc3RyZWFtKSB7XG4gICAgc3RyZWFtLmVhdFdoaWxlKC9bXFx3XFwuJ10vKTtcbiAgICByZXR1cm4gXCJudW1iZXJcIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNwcDExU3RyaW5nSG9vayhzdHJlYW0sIHN0YXRlKSB7XG4gICAgc3RyZWFtLmJhY2tVcCgxKTtcbiAgICAvLyBSYXcgc3RyaW5ncy5cbiAgICBpZiAoc3RyZWFtLm1hdGNoKC9eKD86Unx1OFJ8dVJ8VVJ8TFIpLykpIHtcbiAgICAgIHZhciBtYXRjaCA9IHN0cmVhbS5tYXRjaCgvXlwiKFteXFxzXFxcXCgpXXswLDE2fSlcXCgvKTtcbiAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgc3RhdGUuY3BwMTFSYXdTdHJpbmdEZWxpbSA9IG1hdGNoWzFdO1xuICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblJhd1N0cmluZztcbiAgICAgIHJldHVybiB0b2tlblJhd1N0cmluZyhzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG4gICAgLy8gVW5pY29kZSBzdHJpbmdzL2NoYXJzLlxuICAgIGlmIChzdHJlYW0ubWF0Y2goL14oPzp1OHx1fFV8TCkvKSkge1xuICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXltcIiddLywgLyogZWF0ICovIGZhbHNlKSkge1xuICAgICAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gSWdub3JlIHRoaXMgaG9vay5cbiAgICBzdHJlYW0ubmV4dCgpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNwcExvb2tzTGlrZUNvbnN0cnVjdG9yKHdvcmQpIHtcbiAgICB2YXIgbGFzdFR3byA9IC8oXFx3Kyk6On4/KFxcdyspJC8uZXhlYyh3b3JkKTtcbiAgICByZXR1cm4gbGFzdFR3byAmJiBsYXN0VHdvWzFdID09IGxhc3RUd29bMl07XG4gIH1cblxuICAvLyBDIy1zdHlsZSBzdHJpbmdzIHdoZXJlIFwiXCIgZXNjYXBlcyBhIHF1b3RlLlxuICBmdW5jdGlvbiB0b2tlbkF0U3RyaW5nKHN0cmVhbSwgc3RhdGUpIHtcbiAgICB2YXIgbmV4dDtcbiAgICB3aGlsZSAoKG5leHQgPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7XG4gICAgICBpZiAobmV4dCA9PSAnXCInICYmICFzdHJlYW0uZWF0KCdcIicpKSB7XG4gICAgICAgIHN0YXRlLnRva2VuaXplID0gbnVsbDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBcInN0cmluZ1wiO1xuICB9XG5cbiAgLy8gQysrMTEgcmF3IHN0cmluZyBsaXRlcmFsIGlzIDxwcmVmaXg+XCI8ZGVsaW0+KCBhbnl0aGluZyApPGRlbGltPlwiLCB3aGVyZVxuICAvLyA8ZGVsaW0+IGNhbiBiZSBhIHN0cmluZyB1cCB0byAxNiBjaGFyYWN0ZXJzIGxvbmcuXG4gIGZ1bmN0aW9uIHRva2VuUmF3U3RyaW5nKHN0cmVhbSwgc3RhdGUpIHtcbiAgICAvLyBFc2NhcGUgY2hhcmFjdGVycyB0aGF0IGhhdmUgc3BlY2lhbCByZWdleCBtZWFuaW5ncy5cbiAgICB2YXIgZGVsaW0gPSBzdGF0ZS5jcHAxMVJhd1N0cmluZ0RlbGltLnJlcGxhY2UoL1teXFx3XFxzXS9nLCAnXFxcXCQmJyk7XG4gICAgdmFyIG1hdGNoID0gc3RyZWFtLm1hdGNoKG5ldyBSZWdFeHAoXCIuKj9cXFxcKVwiICsgZGVsaW0gKyAnXCInKSk7XG4gICAgaWYgKG1hdGNoKVxuICAgICAgc3RhdGUudG9rZW5pemUgPSBudWxsO1xuICAgIGVsc2VcbiAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTtcbiAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlZihtaW1lcywgbW9kZSkge1xuICAgIGlmICh0eXBlb2YgbWltZXMgPT0gXCJzdHJpbmdcIikgbWltZXMgPSBbbWltZXNdO1xuICAgIHZhciB3b3JkcyA9IFtdO1xuICAgIGZ1bmN0aW9uIGFkZChvYmopIHtcbiAgICAgIGlmIChvYmopIGZvciAodmFyIHByb3AgaW4gb2JqKSBpZiAob2JqLmhhc093blByb3BlcnR5KHByb3ApKVxuICAgICAgICB3b3Jkcy5wdXNoKHByb3ApO1xuICAgIH1cbiAgICBhZGQobW9kZS5rZXl3b3Jkcyk7XG4gICAgYWRkKG1vZGUudHlwZXMpO1xuICAgIGFkZChtb2RlLmJ1aWx0aW4pO1xuICAgIGFkZChtb2RlLmF0b21zKTtcbiAgICBpZiAod29yZHMubGVuZ3RoKSB7XG4gICAgICBtb2RlLmhlbHBlclR5cGUgPSBtaW1lc1swXTtcbiAgICAgIENvZGVNaXJyb3IucmVnaXN0ZXJIZWxwZXIoXCJoaW50V29yZHNcIiwgbWltZXNbMF0sIHdvcmRzKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1pbWVzLmxlbmd0aDsgKytpKVxuICAgICAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKG1pbWVzW2ldLCBtb2RlKTtcbiAgfVxuXG4gIGRlZihbXCJ0ZXh0L3gtY3NyY1wiLCBcInRleHQveC1jXCIsIFwidGV4dC94LWNoZHJcIl0sIHtcbiAgICBuYW1lOiBcImNsaWtlXCIsXG4gICAga2V5d29yZHM6IHdvcmRzKGNLZXl3b3JkcyksXG4gICAgdHlwZXM6IGNUeXBlcyxcbiAgICBibG9ja0tleXdvcmRzOiB3b3JkcyhjQmxvY2tLZXl3b3JkcyksXG4gICAgZGVmS2V5d29yZHM6IHdvcmRzKGNEZWZLZXl3b3JkcyksXG4gICAgdHlwZUZpcnN0RGVmaW5pdGlvbnM6IHRydWUsXG4gICAgYXRvbXM6IHdvcmRzKFwiTlVMTCB0cnVlIGZhbHNlXCIpLFxuICAgIGlzUmVzZXJ2ZWRJZGVudGlmaWVyOiBjSXNSZXNlcnZlZElkZW50aWZpZXIsXG4gICAgaG9va3M6IHtcbiAgICAgIFwiI1wiOiBjcHBIb29rLFxuICAgICAgXCIqXCI6IHBvaW50ZXJIb29rLFxuICAgIH0sXG4gICAgbW9kZVByb3BzOiB7Zm9sZDogW1wiYnJhY2VcIiwgXCJpbmNsdWRlXCJdfVxuICB9KTtcblxuICBkZWYoW1widGV4dC94LWMrK3NyY1wiLCBcInRleHQveC1jKytoZHJcIl0sIHtcbiAgICBuYW1lOiBcImNsaWtlXCIsXG4gICAga2V5d29yZHM6IHdvcmRzKGNLZXl3b3JkcyArIFwiIFwiICsgY3BwS2V5d29yZHMpLFxuICAgIHR5cGVzOiBjVHlwZXMsXG4gICAgYmxvY2tLZXl3b3Jkczogd29yZHMoY0Jsb2NrS2V5d29yZHMgKyBcIiBjbGFzcyB0cnkgY2F0Y2hcIiksXG4gICAgZGVmS2V5d29yZHM6IHdvcmRzKGNEZWZLZXl3b3JkcyArIFwiIGNsYXNzIG5hbWVzcGFjZVwiKSxcbiAgICB0eXBlRmlyc3REZWZpbml0aW9uczogdHJ1ZSxcbiAgICBhdG9tczogd29yZHMoXCJ0cnVlIGZhbHNlIE5VTEwgbnVsbHB0clwiKSxcbiAgICBkb250SW5kZW50U3RhdGVtZW50czogL150ZW1wbGF0ZSQvLFxuICAgIGlzSWRlbnRpZmllckNoYXI6IC9bXFx3XFwkX35cXHhhMS1cXHVmZmZmXS8sXG4gICAgaXNSZXNlcnZlZElkZW50aWZpZXI6IGNJc1Jlc2VydmVkSWRlbnRpZmllcixcbiAgICBob29rczoge1xuICAgICAgXCIjXCI6IGNwcEhvb2ssXG4gICAgICBcIipcIjogcG9pbnRlckhvb2ssXG4gICAgICBcInVcIjogY3BwMTFTdHJpbmdIb29rLFxuICAgICAgXCJVXCI6IGNwcDExU3RyaW5nSG9vayxcbiAgICAgIFwiTFwiOiBjcHAxMVN0cmluZ0hvb2ssXG4gICAgICBcIlJcIjogY3BwMTFTdHJpbmdIb29rLFxuICAgICAgXCIwXCI6IGNwcDE0TGl0ZXJhbCxcbiAgICAgIFwiMVwiOiBjcHAxNExpdGVyYWwsXG4gICAgICBcIjJcIjogY3BwMTRMaXRlcmFsLFxuICAgICAgXCIzXCI6IGNwcDE0TGl0ZXJhbCxcbiAgICAgIFwiNFwiOiBjcHAxNExpdGVyYWwsXG4gICAgICBcIjVcIjogY3BwMTRMaXRlcmFsLFxuICAgICAgXCI2XCI6IGNwcDE0TGl0ZXJhbCxcbiAgICAgIFwiN1wiOiBjcHAxNExpdGVyYWwsXG4gICAgICBcIjhcIjogY3BwMTRMaXRlcmFsLFxuICAgICAgXCI5XCI6IGNwcDE0TGl0ZXJhbCxcbiAgICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlLCBzdHlsZSkge1xuICAgICAgICBpZiAoc3R5bGUgPT0gXCJ2YXJpYWJsZVwiICYmIHN0cmVhbS5wZWVrKCkgPT0gXCIoXCIgJiZcbiAgICAgICAgICAgIChzdGF0ZS5wcmV2VG9rZW4gPT0gXCI7XCIgfHwgc3RhdGUucHJldlRva2VuID09IG51bGwgfHxcbiAgICAgICAgICAgICBzdGF0ZS5wcmV2VG9rZW4gPT0gXCJ9XCIpICYmXG4gICAgICAgICAgICBjcHBMb29rc0xpa2VDb25zdHJ1Y3RvcihzdHJlYW0uY3VycmVudCgpKSlcbiAgICAgICAgICByZXR1cm4gXCJkZWZcIjtcbiAgICAgIH1cbiAgICB9LFxuICAgIG5hbWVzcGFjZVNlcGFyYXRvcjogXCI6OlwiLFxuICAgIG1vZGVQcm9wczoge2ZvbGQ6IFtcImJyYWNlXCIsIFwiaW5jbHVkZVwiXX1cbiAgfSk7XG5cbiAgZGVmKFwidGV4dC94LWphdmFcIiwge1xuICAgIG5hbWU6IFwiY2xpa2VcIixcbiAgICBrZXl3b3Jkczogd29yZHMoXCJhYnN0cmFjdCBhc3NlcnQgYnJlYWsgY2FzZSBjYXRjaCBjbGFzcyBjb25zdCBjb250aW51ZSBkZWZhdWx0IFwiICtcbiAgICAgICAgICAgICAgICAgICAgXCJkbyBlbHNlIGVudW0gZXh0ZW5kcyBmaW5hbCBmaW5hbGx5IGZvciBnb3RvIGlmIGltcGxlbWVudHMgaW1wb3J0IFwiICtcbiAgICAgICAgICAgICAgICAgICAgXCJpbnN0YW5jZW9mIGludGVyZmFjZSBuYXRpdmUgbmV3IHBhY2thZ2UgcHJpdmF0ZSBwcm90ZWN0ZWQgcHVibGljIFwiICtcbiAgICAgICAgICAgICAgICAgICAgXCJyZXR1cm4gc3RhdGljIHN0cmljdGZwIHN1cGVyIHN3aXRjaCBzeW5jaHJvbml6ZWQgdGhpcyB0aHJvdyB0aHJvd3MgdHJhbnNpZW50IFwiICtcbiAgICAgICAgICAgICAgICAgICAgXCJ0cnkgdm9sYXRpbGUgd2hpbGUgQGludGVyZmFjZVwiKSxcbiAgICB0eXBlczogd29yZHMoXCJieXRlIHNob3J0IGludCBsb25nIGZsb2F0IGRvdWJsZSBib29sZWFuIGNoYXIgdm9pZCBCb29sZWFuIEJ5dGUgQ2hhcmFjdGVyIERvdWJsZSBGbG9hdCBcIiArXG4gICAgICAgICAgICAgICAgIFwiSW50ZWdlciBMb25nIE51bWJlciBPYmplY3QgU2hvcnQgU3RyaW5nIFN0cmluZ0J1ZmZlciBTdHJpbmdCdWlsZGVyIFZvaWRcIiksXG4gICAgYmxvY2tLZXl3b3Jkczogd29yZHMoXCJjYXRjaCBjbGFzcyBkbyBlbHNlIGZpbmFsbHkgZm9yIGlmIHN3aXRjaCB0cnkgd2hpbGVcIiksXG4gICAgZGVmS2V5d29yZHM6IHdvcmRzKFwiY2xhc3MgaW50ZXJmYWNlIGVudW0gQGludGVyZmFjZVwiKSxcbiAgICB0eXBlRmlyc3REZWZpbml0aW9uczogdHJ1ZSxcbiAgICBhdG9tczogd29yZHMoXCJ0cnVlIGZhbHNlIG51bGxcIiksXG4gICAgbnVtYmVyOiAvXig/OjB4W2EtZlxcZF9dK3wwYlswMV9dK3woPzpbXFxkX10rXFwuP1xcZCp8XFwuXFxkKykoPzplWy0rXT9bXFxkX10rKT8pKHV8bGw/fGx8Zik/L2ksXG4gICAgaG9va3M6IHtcbiAgICAgIFwiQFwiOiBmdW5jdGlvbihzdHJlYW0pIHtcbiAgICAgICAgLy8gRG9uJ3QgbWF0Y2ggdGhlIEBpbnRlcmZhY2Uga2V5d29yZC5cbiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgnaW50ZXJmYWNlJywgZmFsc2UpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXFx3XFwkX10vKTtcbiAgICAgICAgcmV0dXJuIFwibWV0YVwiO1xuICAgICAgfVxuICAgIH0sXG4gICAgbW9kZVByb3BzOiB7Zm9sZDogW1wiYnJhY2VcIiwgXCJpbXBvcnRcIl19XG4gIH0pO1xuXG4gIGRlZihcInRleHQveC1jc2hhcnBcIiwge1xuICAgIG5hbWU6IFwiY2xpa2VcIixcbiAgICBrZXl3b3Jkczogd29yZHMoXCJhYnN0cmFjdCBhcyBhc3luYyBhd2FpdCBiYXNlIGJyZWFrIGNhc2UgY2F0Y2ggY2hlY2tlZCBjbGFzcyBjb25zdCBjb250aW51ZVwiICtcbiAgICAgICAgICAgICAgICAgICAgXCIgZGVmYXVsdCBkZWxlZ2F0ZSBkbyBlbHNlIGVudW0gZXZlbnQgZXhwbGljaXQgZXh0ZXJuIGZpbmFsbHkgZml4ZWQgZm9yXCIgK1xuICAgICAgICAgICAgICAgICAgICBcIiBmb3JlYWNoIGdvdG8gaWYgaW1wbGljaXQgaW4gaW50ZXJmYWNlIGludGVybmFsIGlzIGxvY2sgbmFtZXNwYWNlIG5ld1wiICtcbiAgICAgICAgICAgICAgICAgICAgXCIgb3BlcmF0b3Igb3V0IG92ZXJyaWRlIHBhcmFtcyBwcml2YXRlIHByb3RlY3RlZCBwdWJsaWMgcmVhZG9ubHkgcmVmIHJldHVybiBzZWFsZWRcIiArXG4gICAgICAgICAgICAgICAgICAgIFwiIHNpemVvZiBzdGFja2FsbG9jIHN0YXRpYyBzdHJ1Y3Qgc3dpdGNoIHRoaXMgdGhyb3cgdHJ5IHR5cGVvZiB1bmNoZWNrZWRcIiArXG4gICAgICAgICAgICAgICAgICAgIFwiIHVuc2FmZSB1c2luZyB2aXJ0dWFsIHZvaWQgdm9sYXRpbGUgd2hpbGUgYWRkIGFsaWFzIGFzY2VuZGluZyBkZXNjZW5kaW5nIGR5bmFtaWMgZnJvbSBnZXRcIiArXG4gICAgICAgICAgICAgICAgICAgIFwiIGdsb2JhbCBncm91cCBpbnRvIGpvaW4gbGV0IG9yZGVyYnkgcGFydGlhbCByZW1vdmUgc2VsZWN0IHNldCB2YWx1ZSB2YXIgeWllbGRcIiksXG4gICAgdHlwZXM6IHdvcmRzKFwiQWN0aW9uIEJvb2xlYW4gQnl0ZSBDaGFyIERhdGVUaW1lIERhdGVUaW1lT2Zmc2V0IERlY2ltYWwgRG91YmxlIEZ1bmNcIiArXG4gICAgICAgICAgICAgICAgIFwiIEd1aWQgSW50MTYgSW50MzIgSW50NjQgT2JqZWN0IFNCeXRlIFNpbmdsZSBTdHJpbmcgVGFzayBUaW1lU3BhbiBVSW50MTYgVUludDMyXCIgK1xuICAgICAgICAgICAgICAgICBcIiBVSW50NjQgYm9vbCBieXRlIGNoYXIgZGVjaW1hbCBkb3VibGUgc2hvcnQgaW50IGxvbmcgb2JqZWN0XCIgICtcbiAgICAgICAgICAgICAgICAgXCIgc2J5dGUgZmxvYXQgc3RyaW5nIHVzaG9ydCB1aW50IHVsb25nXCIpLFxuICAgIGJsb2NrS2V5d29yZHM6IHdvcmRzKFwiY2F0Y2ggY2xhc3MgZG8gZWxzZSBmaW5hbGx5IGZvciBmb3JlYWNoIGlmIHN0cnVjdCBzd2l0Y2ggdHJ5IHdoaWxlXCIpLFxuICAgIGRlZktleXdvcmRzOiB3b3JkcyhcImNsYXNzIGludGVyZmFjZSBuYW1lc3BhY2Ugc3RydWN0IHZhclwiKSxcbiAgICB0eXBlRmlyc3REZWZpbml0aW9uczogdHJ1ZSxcbiAgICBhdG9tczogd29yZHMoXCJ0cnVlIGZhbHNlIG51bGxcIiksXG4gICAgaG9va3M6IHtcbiAgICAgIFwiQFwiOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7XG4gICAgICAgIGlmIChzdHJlYW0uZWF0KCdcIicpKSB7XG4gICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkF0U3RyaW5nO1xuICAgICAgICAgIHJldHVybiB0b2tlbkF0U3RyaW5nKHN0cmVhbSwgc3RhdGUpO1xuICAgICAgICB9XG4gICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1xcd1xcJF9dLyk7XG4gICAgICAgIHJldHVybiBcIm1ldGFcIjtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIHRva2VuVHJpcGxlU3RyaW5nKHN0cmVhbSwgc3RhdGUpIHtcbiAgICB2YXIgZXNjYXBlZCA9IGZhbHNlO1xuICAgIHdoaWxlICghc3RyZWFtLmVvbCgpKSB7XG4gICAgICBpZiAoIWVzY2FwZWQgJiYgc3RyZWFtLm1hdGNoKCdcIlwiXCInKSkge1xuICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IG51bGw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZXNjYXBlZCA9IHN0cmVhbS5uZXh0KCkgPT0gXCJcXFxcXCIgJiYgIWVzY2FwZWQ7XG4gICAgfVxuICAgIHJldHVybiBcInN0cmluZ1wiO1xuICB9XG5cbiAgZnVuY3Rpb24gdG9rZW5OZXN0ZWRDb21tZW50KGRlcHRoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzdHJlYW0sIHN0YXRlKSB7XG4gICAgICB2YXIgY2hcbiAgICAgIHdoaWxlIChjaCA9IHN0cmVhbS5uZXh0KCkpIHtcbiAgICAgICAgaWYgKGNoID09IFwiKlwiICYmIHN0cmVhbS5lYXQoXCIvXCIpKSB7XG4gICAgICAgICAgaWYgKGRlcHRoID09IDEpIHtcbiAgICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gbnVsbFxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbk5lc3RlZENvbW1lbnQoZGVwdGggLSAxKVxuICAgICAgICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGNoID09IFwiL1wiICYmIHN0cmVhbS5lYXQoXCIqXCIpKSB7XG4gICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbk5lc3RlZENvbW1lbnQoZGVwdGggKyAxKVxuICAgICAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gXCJjb21tZW50XCJcbiAgICB9XG4gIH1cblxuICBkZWYoXCJ0ZXh0L3gtc2NhbGFcIiwge1xuICAgIG5hbWU6IFwiY2xpa2VcIixcbiAgICBrZXl3b3Jkczogd29yZHMoXG4gICAgICAvKiBzY2FsYSAqL1xuICAgICAgXCJhYnN0cmFjdCBjYXNlIGNhdGNoIGNsYXNzIGRlZiBkbyBlbHNlIGV4dGVuZHMgZmluYWwgZmluYWxseSBmb3IgZm9yU29tZSBpZiBcIiArXG4gICAgICBcImltcGxpY2l0IGltcG9ydCBsYXp5IG1hdGNoIG5ldyBudWxsIG9iamVjdCBvdmVycmlkZSBwYWNrYWdlIHByaXZhdGUgcHJvdGVjdGVkIHJldHVybiBcIiArXG4gICAgICBcInNlYWxlZCBzdXBlciB0aGlzIHRocm93IHRyYWl0IHRyeSB0eXBlIHZhbCB2YXIgd2hpbGUgd2l0aCB5aWVsZCBfIFwiICtcblxuICAgICAgLyogcGFja2FnZSBzY2FsYSAqL1xuICAgICAgXCJhc3NlcnQgYXNzdW1lIHJlcXVpcmUgcHJpbnQgcHJpbnRsbiBwcmludGYgcmVhZExpbmUgcmVhZEJvb2xlYW4gcmVhZEJ5dGUgcmVhZFNob3J0IFwiICtcbiAgICAgIFwicmVhZENoYXIgcmVhZEludCByZWFkTG9uZyByZWFkRmxvYXQgcmVhZERvdWJsZVwiXG4gICAgKSxcbiAgICB0eXBlczogd29yZHMoXG4gICAgICBcIkFueVZhbCBBcHAgQXBwbGljYXRpb24gQXJyYXkgQnVmZmVyZWRJdGVyYXRvciBCaWdEZWNpbWFsIEJpZ0ludCBDaGFyIENvbnNvbGUgRWl0aGVyIFwiICtcbiAgICAgIFwiRW51bWVyYXRpb24gRXF1aXYgRXJyb3IgRXhjZXB0aW9uIEZyYWN0aW9uYWwgRnVuY3Rpb24gSW5kZXhlZFNlcSBJbnQgSW50ZWdyYWwgSXRlcmFibGUgXCIgK1xuICAgICAgXCJJdGVyYXRvciBMaXN0IE1hcCBOdW1lcmljIE5pbCBOb3ROdWxsIE9wdGlvbiBPcmRlcmVkIE9yZGVyaW5nIFBhcnRpYWxGdW5jdGlvbiBQYXJ0aWFsT3JkZXJpbmcgXCIgK1xuICAgICAgXCJQcm9kdWN0IFByb3h5IFJhbmdlIFJlc3BvbmRlciBTZXEgU2VyaWFsaXphYmxlIFNldCBTcGVjaWFsaXphYmxlIFN0cmVhbSBTdHJpbmdCdWlsZGVyIFwiICtcbiAgICAgIFwiU3RyaW5nQ29udGV4dCBTeW1ib2wgVGhyb3dhYmxlIFRyYXZlcnNhYmxlIFRyYXZlcnNhYmxlT25jZSBUdXBsZSBVbml0IFZlY3RvciBcIiArXG5cbiAgICAgIC8qIHBhY2thZ2UgamF2YS5sYW5nICovXG4gICAgICBcIkJvb2xlYW4gQnl0ZSBDaGFyYWN0ZXIgQ2hhclNlcXVlbmNlIENsYXNzIENsYXNzTG9hZGVyIENsb25lYWJsZSBDb21wYXJhYmxlIFwiICtcbiAgICAgIFwiQ29tcGlsZXIgRG91YmxlIEV4Y2VwdGlvbiBGbG9hdCBJbnRlZ2VyIExvbmcgTWF0aCBOdW1iZXIgT2JqZWN0IFBhY2thZ2UgUGFpciBQcm9jZXNzIFwiICtcbiAgICAgIFwiUnVudGltZSBSdW5uYWJsZSBTZWN1cml0eU1hbmFnZXIgU2hvcnQgU3RhY2tUcmFjZUVsZW1lbnQgU3RyaWN0TWF0aCBTdHJpbmcgXCIgK1xuICAgICAgXCJTdHJpbmdCdWZmZXIgU3lzdGVtIFRocmVhZCBUaHJlYWRHcm91cCBUaHJlYWRMb2NhbCBUaHJvd2FibGUgVHJpcGxlIFZvaWRcIlxuICAgICksXG4gICAgbXVsdGlMaW5lU3RyaW5nczogdHJ1ZSxcbiAgICBibG9ja0tleXdvcmRzOiB3b3JkcyhcImNhdGNoIGNsYXNzIGVudW0gZG8gZWxzZSBmaW5hbGx5IGZvciBmb3JTb21lIGlmIG1hdGNoIHN3aXRjaCB0cnkgd2hpbGVcIiksXG4gICAgZGVmS2V5d29yZHM6IHdvcmRzKFwiY2xhc3MgZW51bSBkZWYgb2JqZWN0IHBhY2thZ2UgdHJhaXQgdHlwZSB2YWwgdmFyXCIpLFxuICAgIGF0b21zOiB3b3JkcyhcInRydWUgZmFsc2UgbnVsbFwiKSxcbiAgICBpbmRlbnRTdGF0ZW1lbnRzOiBmYWxzZSxcbiAgICBpbmRlbnRTd2l0Y2g6IGZhbHNlLFxuICAgIGlzT3BlcmF0b3JDaGFyOiAvWytcXC0qJiU9PD4hP3xcXC8jOkBdLyxcbiAgICBob29rczoge1xuICAgICAgXCJAXCI6IGZ1bmN0aW9uKHN0cmVhbSkge1xuICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcXHdcXCRfXS8pO1xuICAgICAgICByZXR1cm4gXCJtZXRhXCI7XG4gICAgICB9LFxuICAgICAgJ1wiJzogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkge1xuICAgICAgICBpZiAoIXN0cmVhbS5tYXRjaCgnXCJcIicpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5UcmlwbGVTdHJpbmc7XG4gICAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTtcbiAgICAgIH0sXG4gICAgICBcIidcIjogZnVuY3Rpb24oc3RyZWFtKSB7XG4gICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1xcd1xcJF9cXHhhMS1cXHVmZmZmXS8pO1xuICAgICAgICByZXR1cm4gXCJhdG9tXCI7XG4gICAgICB9LFxuICAgICAgXCI9XCI6IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHtcbiAgICAgICAgdmFyIGN4ID0gc3RhdGUuY29udGV4dFxuICAgICAgICBpZiAoY3gudHlwZSA9PSBcIn1cIiAmJiBjeC5hbGlnbiAmJiBzdHJlYW0uZWF0KFwiPlwiKSkge1xuICAgICAgICAgIHN0YXRlLmNvbnRleHQgPSBuZXcgQ29udGV4dChjeC5pbmRlbnRlZCwgY3guY29sdW1uLCBjeC50eXBlLCBjeC5pbmZvLCBudWxsLCBjeC5wcmV2KVxuICAgICAgICAgIHJldHVybiBcIm9wZXJhdG9yXCJcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgXCIvXCI6IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHtcbiAgICAgICAgaWYgKCFzdHJlYW0uZWF0KFwiKlwiKSkgcmV0dXJuIGZhbHNlXG4gICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5OZXN0ZWRDb21tZW50KDEpXG4gICAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKVxuICAgICAgfVxuICAgIH0sXG4gICAgbW9kZVByb3BzOiB7Y2xvc2VCcmFja2V0czoge3BhaXJzOiAnKClbXXt9XCJcIicsIHRyaXBsZXM6ICdcIid9fVxuICB9KTtcblxuICBmdW5jdGlvbiB0b2tlbktvdGxpblN0cmluZyh0cmlwbGVTdHJpbmcpe1xuICAgIHJldHVybiBmdW5jdGlvbiAoc3RyZWFtLCBzdGF0ZSkge1xuICAgICAgdmFyIGVzY2FwZWQgPSBmYWxzZSwgbmV4dCwgZW5kID0gZmFsc2U7XG4gICAgICB3aGlsZSAoIXN0cmVhbS5lb2woKSkge1xuICAgICAgICBpZiAoIXRyaXBsZVN0cmluZyAmJiAhZXNjYXBlZCAmJiBzdHJlYW0ubWF0Y2goJ1wiJykgKSB7ZW5kID0gdHJ1ZTsgYnJlYWs7fVxuICAgICAgICBpZiAodHJpcGxlU3RyaW5nICYmIHN0cmVhbS5tYXRjaCgnXCJcIlwiJykpIHtlbmQgPSB0cnVlOyBicmVhazt9XG4gICAgICAgIG5leHQgPSBzdHJlYW0ubmV4dCgpO1xuICAgICAgICBpZighZXNjYXBlZCAmJiBuZXh0ID09IFwiJFwiICYmIHN0cmVhbS5tYXRjaCgneycpKVxuICAgICAgICAgIHN0cmVhbS5za2lwVG8oXCJ9XCIpO1xuICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgbmV4dCA9PSBcIlxcXFxcIiAmJiAhdHJpcGxlU3RyaW5nO1xuICAgICAgfVxuICAgICAgaWYgKGVuZCB8fCAhdHJpcGxlU3RyaW5nKVxuICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IG51bGw7XG4gICAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgICB9XG4gIH1cblxuICBkZWYoXCJ0ZXh0L3gta290bGluXCIsIHtcbiAgICBuYW1lOiBcImNsaWtlXCIsXG4gICAga2V5d29yZHM6IHdvcmRzKFxuICAgICAgLyprZXl3b3JkcyovXG4gICAgICBcInBhY2thZ2UgYXMgdHlwZWFsaWFzIGNsYXNzIGludGVyZmFjZSB0aGlzIHN1cGVyIHZhbCBvcGVyYXRvciBcIiArXG4gICAgICBcInZhciBmdW4gZm9yIGlzIGluIFRoaXMgdGhyb3cgcmV0dXJuIGFubm90YXRpb24gXCIgK1xuICAgICAgXCJicmVhayBjb250aW51ZSBvYmplY3QgaWYgZWxzZSB3aGlsZSBkbyB0cnkgd2hlbiAhaW4gIWlzIGFzPyBcIiArXG5cbiAgICAgIC8qc29mdCBrZXl3b3JkcyovXG4gICAgICBcImZpbGUgaW1wb3J0IHdoZXJlIGJ5IGdldCBzZXQgYWJzdHJhY3QgZW51bSBvcGVuIGlubmVyIG92ZXJyaWRlIHByaXZhdGUgcHVibGljIGludGVybmFsIFwiICtcbiAgICAgIFwicHJvdGVjdGVkIGNhdGNoIGZpbmFsbHkgb3V0IGZpbmFsIHZhcmFyZyByZWlmaWVkIGR5bmFtaWMgY29tcGFuaW9uIGNvbnN0cnVjdG9yIGluaXQgXCIgK1xuICAgICAgXCJzZWFsZWQgZmllbGQgcHJvcGVydHkgcmVjZWl2ZXIgcGFyYW0gc3BhcmFtIGxhdGVpbml0IGRhdGEgaW5saW5lIG5vaW5saW5lIHRhaWxyZWMgXCIgK1xuICAgICAgXCJleHRlcm5hbCBhbm5vdGF0aW9uIGNyb3NzaW5saW5lIGNvbnN0IG9wZXJhdG9yIGluZml4IHN1c3BlbmQgYWN0dWFsIGV4cGVjdCBzZXRwYXJhbSB2YWx1ZVwiXG4gICAgKSxcbiAgICB0eXBlczogd29yZHMoXG4gICAgICAvKiBwYWNrYWdlIGphdmEubGFuZyAqL1xuICAgICAgXCJCb29sZWFuIEJ5dGUgQ2hhcmFjdGVyIENoYXJTZXF1ZW5jZSBDbGFzcyBDbGFzc0xvYWRlciBDbG9uZWFibGUgQ29tcGFyYWJsZSBcIiArXG4gICAgICBcIkNvbXBpbGVyIERvdWJsZSBFeGNlcHRpb24gRmxvYXQgSW50ZWdlciBMb25nIE1hdGggTnVtYmVyIE9iamVjdCBQYWNrYWdlIFBhaXIgUHJvY2VzcyBcIiArXG4gICAgICBcIlJ1bnRpbWUgUnVubmFibGUgU2VjdXJpdHlNYW5hZ2VyIFNob3J0IFN0YWNrVHJhY2VFbGVtZW50IFN0cmljdE1hdGggU3RyaW5nIFwiICtcbiAgICAgIFwiU3RyaW5nQnVmZmVyIFN5c3RlbSBUaHJlYWQgVGhyZWFkR3JvdXAgVGhyZWFkTG9jYWwgVGhyb3dhYmxlIFRyaXBsZSBWb2lkIEFubm90YXRpb24gQW55IEJvb2xlYW5BcnJheSBcIiArXG4gICAgICBcIkJ5dGVBcnJheSBDaGFyIENoYXJBcnJheSBEZXByZWNhdGlvbkxldmVsIERvdWJsZUFycmF5IEVudW0gRmxvYXRBcnJheSBGdW5jdGlvbiBJbnQgSW50QXJyYXkgTGF6eSBcIiArXG4gICAgICBcIkxhenlUaHJlYWRTYWZldHlNb2RlIExvbmdBcnJheSBOb3RoaW5nIFNob3J0QXJyYXkgVW5pdFwiXG4gICAgKSxcbiAgICBpbnRlbmRTd2l0Y2g6IGZhbHNlLFxuICAgIGluZGVudFN0YXRlbWVudHM6IGZhbHNlLFxuICAgIG11bHRpTGluZVN0cmluZ3M6IHRydWUsXG4gICAgbnVtYmVyOiAvXig/OjB4W2EtZlxcZF9dK3wwYlswMV9dK3woPzpbXFxkX10rKFxcLlxcZCspP3xcXC5cXGQrKSg/OmVbLStdP1tcXGRfXSspPykodXxsbD98bHxmKT8vaSxcbiAgICBibG9ja0tleXdvcmRzOiB3b3JkcyhcImNhdGNoIGNsYXNzIGRvIGVsc2UgZmluYWxseSBmb3IgaWYgd2hlcmUgdHJ5IHdoaWxlIGVudW1cIiksXG4gICAgZGVmS2V5d29yZHM6IHdvcmRzKFwiY2xhc3MgdmFsIHZhciBvYmplY3QgaW50ZXJmYWNlIGZ1blwiKSxcbiAgICBhdG9tczogd29yZHMoXCJ0cnVlIGZhbHNlIG51bGwgdGhpc1wiKSxcbiAgICBob29rczoge1xuICAgICAgXCJAXCI6IGZ1bmN0aW9uKHN0cmVhbSkge1xuICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcXHdcXCRfXS8pO1xuICAgICAgICByZXR1cm4gXCJtZXRhXCI7XG4gICAgICB9LFxuICAgICAgJyonOiBmdW5jdGlvbihfc3RyZWFtLCBzdGF0ZSkge1xuICAgICAgICByZXR1cm4gc3RhdGUucHJldlRva2VuID09ICcuJyA/ICd2YXJpYWJsZScgOiAnb3BlcmF0b3InO1xuICAgICAgfSxcbiAgICAgICdcIic6IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHtcbiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbktvdGxpblN0cmluZyhzdHJlYW0ubWF0Y2goJ1wiXCInKSk7XG4gICAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTtcbiAgICAgIH0sXG4gICAgICBcIi9cIjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkge1xuICAgICAgICBpZiAoIXN0cmVhbS5lYXQoXCIqXCIpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5OZXN0ZWRDb21tZW50KDEpO1xuICAgICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSlcbiAgICAgIH0sXG4gICAgICBpbmRlbnQ6IGZ1bmN0aW9uKHN0YXRlLCBjdHgsIHRleHRBZnRlciwgaW5kZW50VW5pdCkge1xuICAgICAgICB2YXIgZmlyc3RDaGFyID0gdGV4dEFmdGVyICYmIHRleHRBZnRlci5jaGFyQXQoMCk7XG4gICAgICAgIGlmICgoc3RhdGUucHJldlRva2VuID09IFwifVwiIHx8IHN0YXRlLnByZXZUb2tlbiA9PSBcIilcIikgJiYgdGV4dEFmdGVyID09IFwiXCIpXG4gICAgICAgICAgcmV0dXJuIHN0YXRlLmluZGVudGVkO1xuICAgICAgICBpZiAoKHN0YXRlLnByZXZUb2tlbiA9PSBcIm9wZXJhdG9yXCIgJiYgdGV4dEFmdGVyICE9IFwifVwiICYmIHN0YXRlLmNvbnRleHQudHlwZSAhPSBcIn1cIikgfHxcbiAgICAgICAgICBzdGF0ZS5wcmV2VG9rZW4gPT0gXCJ2YXJpYWJsZVwiICYmIGZpcnN0Q2hhciA9PSBcIi5cIiB8fFxuICAgICAgICAgIChzdGF0ZS5wcmV2VG9rZW4gPT0gXCJ9XCIgfHwgc3RhdGUucHJldlRva2VuID09IFwiKVwiKSAmJiBmaXJzdENoYXIgPT0gXCIuXCIpXG4gICAgICAgICAgcmV0dXJuIGluZGVudFVuaXQgKiAyICsgY3R4LmluZGVudGVkO1xuICAgICAgICBpZiAoY3R4LmFsaWduICYmIGN0eC50eXBlID09IFwifVwiKVxuICAgICAgICAgIHJldHVybiBjdHguaW5kZW50ZWQgKyAoc3RhdGUuY29udGV4dC50eXBlID09ICh0ZXh0QWZ0ZXIgfHwgXCJcIikuY2hhckF0KDApID8gMCA6IGluZGVudFVuaXQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgbW9kZVByb3BzOiB7Y2xvc2VCcmFja2V0czoge3RyaXBsZXM6ICdcIid9fVxuICB9KTtcblxuICBkZWYoW1wieC1zaGFkZXIveC12ZXJ0ZXhcIiwgXCJ4LXNoYWRlci94LWZyYWdtZW50XCJdLCB7XG4gICAgbmFtZTogXCJjbGlrZVwiLFxuICAgIGtleXdvcmRzOiB3b3JkcyhcInNhbXBsZXIxRCBzYW1wbGVyMkQgc2FtcGxlcjNEIHNhbXBsZXJDdWJlIFwiICtcbiAgICAgICAgICAgICAgICAgICAgXCJzYW1wbGVyMURTaGFkb3cgc2FtcGxlcjJEU2hhZG93IFwiICtcbiAgICAgICAgICAgICAgICAgICAgXCJjb25zdCBhdHRyaWJ1dGUgdW5pZm9ybSB2YXJ5aW5nIFwiICtcbiAgICAgICAgICAgICAgICAgICAgXCJicmVhayBjb250aW51ZSBkaXNjYXJkIHJldHVybiBcIiArXG4gICAgICAgICAgICAgICAgICAgIFwiZm9yIHdoaWxlIGRvIGlmIGVsc2Ugc3RydWN0IFwiICtcbiAgICAgICAgICAgICAgICAgICAgXCJpbiBvdXQgaW5vdXRcIiksXG4gICAgdHlwZXM6IHdvcmRzKFwiZmxvYXQgaW50IGJvb2wgdm9pZCBcIiArXG4gICAgICAgICAgICAgICAgIFwidmVjMiB2ZWMzIHZlYzQgaXZlYzIgaXZlYzMgaXZlYzQgYnZlYzIgYnZlYzMgYnZlYzQgXCIgK1xuICAgICAgICAgICAgICAgICBcIm1hdDIgbWF0MyBtYXQ0XCIpLFxuICAgIGJsb2NrS2V5d29yZHM6IHdvcmRzKFwiZm9yIHdoaWxlIGRvIGlmIGVsc2Ugc3RydWN0XCIpLFxuICAgIGJ1aWx0aW46IHdvcmRzKFwicmFkaWFucyBkZWdyZWVzIHNpbiBjb3MgdGFuIGFzaW4gYWNvcyBhdGFuIFwiICtcbiAgICAgICAgICAgICAgICAgICAgXCJwb3cgZXhwIGxvZyBleHAyIHNxcnQgaW52ZXJzZXNxcnQgXCIgK1xuICAgICAgICAgICAgICAgICAgICBcImFicyBzaWduIGZsb29yIGNlaWwgZnJhY3QgbW9kIG1pbiBtYXggY2xhbXAgbWl4IHN0ZXAgc21vb3Roc3RlcCBcIiArXG4gICAgICAgICAgICAgICAgICAgIFwibGVuZ3RoIGRpc3RhbmNlIGRvdCBjcm9zcyBub3JtYWxpemUgZnRyYW5zZm9ybSBmYWNlZm9yd2FyZCBcIiArXG4gICAgICAgICAgICAgICAgICAgIFwicmVmbGVjdCByZWZyYWN0IG1hdHJpeENvbXBNdWx0IFwiICtcbiAgICAgICAgICAgICAgICAgICAgXCJsZXNzVGhhbiBsZXNzVGhhbkVxdWFsIGdyZWF0ZXJUaGFuIGdyZWF0ZXJUaGFuRXF1YWwgXCIgK1xuICAgICAgICAgICAgICAgICAgICBcImVxdWFsIG5vdEVxdWFsIGFueSBhbGwgbm90IFwiICtcbiAgICAgICAgICAgICAgICAgICAgXCJ0ZXh0dXJlMUQgdGV4dHVyZTFEUHJvaiB0ZXh0dXJlMURMb2QgdGV4dHVyZTFEUHJvakxvZCBcIiArXG4gICAgICAgICAgICAgICAgICAgIFwidGV4dHVyZTJEIHRleHR1cmUyRFByb2ogdGV4dHVyZTJETG9kIHRleHR1cmUyRFByb2pMb2QgXCIgK1xuICAgICAgICAgICAgICAgICAgICBcInRleHR1cmUzRCB0ZXh0dXJlM0RQcm9qIHRleHR1cmUzRExvZCB0ZXh0dXJlM0RQcm9qTG9kIFwiICtcbiAgICAgICAgICAgICAgICAgICAgXCJ0ZXh0dXJlQ3ViZSB0ZXh0dXJlQ3ViZUxvZCBcIiArXG4gICAgICAgICAgICAgICAgICAgIFwic2hhZG93MUQgc2hhZG93MkQgc2hhZG93MURQcm9qIHNoYWRvdzJEUHJvaiBcIiArXG4gICAgICAgICAgICAgICAgICAgIFwic2hhZG93MURMb2Qgc2hhZG93MkRMb2Qgc2hhZG93MURQcm9qTG9kIHNoYWRvdzJEUHJvakxvZCBcIiArXG4gICAgICAgICAgICAgICAgICAgIFwiZEZkeCBkRmR5IGZ3aWR0aCBcIiArXG4gICAgICAgICAgICAgICAgICAgIFwibm9pc2UxIG5vaXNlMiBub2lzZTMgbm9pc2U0XCIpLFxuICAgIGF0b21zOiB3b3JkcyhcInRydWUgZmFsc2UgXCIgK1xuICAgICAgICAgICAgICAgIFwiZ2xfRnJhZ0NvbG9yIGdsX1NlY29uZGFyeUNvbG9yIGdsX05vcm1hbCBnbF9WZXJ0ZXggXCIgK1xuICAgICAgICAgICAgICAgIFwiZ2xfTXVsdGlUZXhDb29yZDAgZ2xfTXVsdGlUZXhDb29yZDEgZ2xfTXVsdGlUZXhDb29yZDIgZ2xfTXVsdGlUZXhDb29yZDMgXCIgK1xuICAgICAgICAgICAgICAgIFwiZ2xfTXVsdGlUZXhDb29yZDQgZ2xfTXVsdGlUZXhDb29yZDUgZ2xfTXVsdGlUZXhDb29yZDYgZ2xfTXVsdGlUZXhDb29yZDcgXCIgK1xuICAgICAgICAgICAgICAgIFwiZ2xfRm9nQ29vcmQgZ2xfUG9pbnRDb29yZCBcIiArXG4gICAgICAgICAgICAgICAgXCJnbF9Qb3NpdGlvbiBnbF9Qb2ludFNpemUgZ2xfQ2xpcFZlcnRleCBcIiArXG4gICAgICAgICAgICAgICAgXCJnbF9Gcm9udENvbG9yIGdsX0JhY2tDb2xvciBnbF9Gcm9udFNlY29uZGFyeUNvbG9yIGdsX0JhY2tTZWNvbmRhcnlDb2xvciBcIiArXG4gICAgICAgICAgICAgICAgXCJnbF9UZXhDb29yZCBnbF9Gb2dGcmFnQ29vcmQgXCIgK1xuICAgICAgICAgICAgICAgIFwiZ2xfRnJhZ0Nvb3JkIGdsX0Zyb250RmFjaW5nIFwiICtcbiAgICAgICAgICAgICAgICBcImdsX0ZyYWdEYXRhIGdsX0ZyYWdEZXB0aCBcIiArXG4gICAgICAgICAgICAgICAgXCJnbF9Nb2RlbFZpZXdNYXRyaXggZ2xfUHJvamVjdGlvbk1hdHJpeCBnbF9Nb2RlbFZpZXdQcm9qZWN0aW9uTWF0cml4IFwiICtcbiAgICAgICAgICAgICAgICBcImdsX1RleHR1cmVNYXRyaXggZ2xfTm9ybWFsTWF0cml4IGdsX01vZGVsVmlld01hdHJpeEludmVyc2UgXCIgK1xuICAgICAgICAgICAgICAgIFwiZ2xfUHJvamVjdGlvbk1hdHJpeEludmVyc2UgZ2xfTW9kZWxWaWV3UHJvamVjdGlvbk1hdHJpeEludmVyc2UgXCIgK1xuICAgICAgICAgICAgICAgIFwiZ2xfVGV4dHVyZU1hdHJpeFRyYW5zcG9zZSBnbF9Nb2RlbFZpZXdNYXRyaXhJbnZlcnNlVHJhbnNwb3NlIFwiICtcbiAgICAgICAgICAgICAgICBcImdsX1Byb2plY3Rpb25NYXRyaXhJbnZlcnNlVHJhbnNwb3NlIFwiICtcbiAgICAgICAgICAgICAgICBcImdsX01vZGVsVmlld1Byb2plY3Rpb25NYXRyaXhJbnZlcnNlVHJhbnNwb3NlIFwiICtcbiAgICAgICAgICAgICAgICBcImdsX1RleHR1cmVNYXRyaXhJbnZlcnNlVHJhbnNwb3NlIFwiICtcbiAgICAgICAgICAgICAgICBcImdsX05vcm1hbFNjYWxlIGdsX0RlcHRoUmFuZ2UgZ2xfQ2xpcFBsYW5lIFwiICtcbiAgICAgICAgICAgICAgICBcImdsX1BvaW50IGdsX0Zyb250TWF0ZXJpYWwgZ2xfQmFja01hdGVyaWFsIGdsX0xpZ2h0U291cmNlIGdsX0xpZ2h0TW9kZWwgXCIgK1xuICAgICAgICAgICAgICAgIFwiZ2xfRnJvbnRMaWdodE1vZGVsUHJvZHVjdCBnbF9CYWNrTGlnaHRNb2RlbFByb2R1Y3QgXCIgK1xuICAgICAgICAgICAgICAgIFwiZ2xfVGV4dHVyZUNvbG9yIGdsX0V5ZVBsYW5lUyBnbF9FeWVQbGFuZVQgZ2xfRXllUGxhbmVSIGdsX0V5ZVBsYW5lUSBcIiArXG4gICAgICAgICAgICAgICAgXCJnbF9Gb2dQYXJhbWV0ZXJzIFwiICtcbiAgICAgICAgICAgICAgICBcImdsX01heExpZ2h0cyBnbF9NYXhDbGlwUGxhbmVzIGdsX01heFRleHR1cmVVbml0cyBnbF9NYXhUZXh0dXJlQ29vcmRzIFwiICtcbiAgICAgICAgICAgICAgICBcImdsX01heFZlcnRleEF0dHJpYnMgZ2xfTWF4VmVydGV4VW5pZm9ybUNvbXBvbmVudHMgZ2xfTWF4VmFyeWluZ0Zsb2F0cyBcIiArXG4gICAgICAgICAgICAgICAgXCJnbF9NYXhWZXJ0ZXhUZXh0dXJlSW1hZ2VVbml0cyBnbF9NYXhUZXh0dXJlSW1hZ2VVbml0cyBcIiArXG4gICAgICAgICAgICAgICAgXCJnbF9NYXhGcmFnbWVudFVuaWZvcm1Db21wb25lbnRzIGdsX01heENvbWJpbmVUZXh0dXJlSW1hZ2VVbml0cyBcIiArXG4gICAgICAgICAgICAgICAgXCJnbF9NYXhEcmF3QnVmZmVyc1wiKSxcbiAgICBpbmRlbnRTd2l0Y2g6IGZhbHNlLFxuICAgIGhvb2tzOiB7XCIjXCI6IGNwcEhvb2t9LFxuICAgIG1vZGVQcm9wczoge2ZvbGQ6IFtcImJyYWNlXCIsIFwiaW5jbHVkZVwiXX1cbiAgfSk7XG5cbiAgZGVmKFwidGV4dC94LW5lc2NcIiwge1xuICAgIG5hbWU6IFwiY2xpa2VcIixcbiAgICBrZXl3b3Jkczogd29yZHMoY0tleXdvcmRzICsgXCIgYXMgYXRvbWljIGFzeW5jIGNhbGwgY29tbWFuZCBjb21wb25lbnQgY29tcG9uZW50cyBjb25maWd1cmF0aW9uIGV2ZW50IGdlbmVyaWMgXCIgK1xuICAgICAgICAgICAgICAgICAgICBcImltcGxlbWVudGF0aW9uIGluY2x1ZGVzIGludGVyZmFjZSBtb2R1bGUgbmV3IG5vcmFjZSBueF9zdHJ1Y3QgbnhfdW5pb24gcG9zdCBwcm92aWRlcyBcIiArXG4gICAgICAgICAgICAgICAgICAgIFwic2lnbmFsIHRhc2sgdXNlcyBhYnN0cmFjdCBleHRlbmRzXCIpLFxuICAgIHR5cGVzOiBjVHlwZXMsXG4gICAgYmxvY2tLZXl3b3Jkczogd29yZHMoY0Jsb2NrS2V5d29yZHMpLFxuICAgIGF0b21zOiB3b3JkcyhcIm51bGwgdHJ1ZSBmYWxzZVwiKSxcbiAgICBob29rczoge1wiI1wiOiBjcHBIb29rfSxcbiAgICBtb2RlUHJvcHM6IHtmb2xkOiBbXCJicmFjZVwiLCBcImluY2x1ZGVcIl19XG4gIH0pO1xuXG4gIGRlZihcInRleHQveC1vYmplY3RpdmVjXCIsIHtcbiAgICBuYW1lOiBcImNsaWtlXCIsXG4gICAga2V5d29yZHM6IHdvcmRzKGNLZXl3b3JkcyArIFwiIFwiICsgb2JqQ0tleXdvcmRzKSxcbiAgICB0eXBlczogb2JqQ1R5cGVzLFxuICAgIGJ1aWx0aW46IHdvcmRzKG9iakNCdWlsdGlucyksXG4gICAgYmxvY2tLZXl3b3Jkczogd29yZHMoY0Jsb2NrS2V5d29yZHMgKyBcIiBAc3ludGhlc2l6ZSBAdHJ5IEBjYXRjaCBAZmluYWxseSBAYXV0b3JlbGVhc2Vwb29sIEBzeW5jaHJvbml6ZWRcIiksXG4gICAgZGVmS2V5d29yZHM6IHdvcmRzKGNEZWZLZXl3b3JkcyArIFwiIEBpbnRlcmZhY2UgQGltcGxlbWVudGF0aW9uIEBwcm90b2NvbCBAY2xhc3NcIiksXG4gICAgZG9udEluZGVudFN0YXRlbWVudHM6IC9eQC4qJC8sXG4gICAgdHlwZUZpcnN0RGVmaW5pdGlvbnM6IHRydWUsXG4gICAgYXRvbXM6IHdvcmRzKFwiWUVTIE5PIE5VTEwgTmlsIG5pbCB0cnVlIGZhbHNlIG51bGxwdHJcIiksXG4gICAgaXNSZXNlcnZlZElkZW50aWZpZXI6IGNJc1Jlc2VydmVkSWRlbnRpZmllcixcbiAgICBob29rczoge1xuICAgICAgXCIjXCI6IGNwcEhvb2ssXG4gICAgICBcIipcIjogcG9pbnRlckhvb2ssXG4gICAgfSxcbiAgICBtb2RlUHJvcHM6IHtmb2xkOiBbXCJicmFjZVwiLCBcImluY2x1ZGVcIl19XG4gIH0pO1xuXG4gIGRlZihcInRleHQveC1vYmplY3RpdmVjKytcIiwge1xuICAgIG5hbWU6IFwiY2xpa2VcIixcbiAgICBrZXl3b3Jkczogd29yZHMoY0tleXdvcmRzICsgXCIgXCIgKyBvYmpDS2V5d29yZHMgKyBcIiBcIiArIGNwcEtleXdvcmRzKSxcbiAgICB0eXBlczogb2JqQ1R5cGVzLFxuICAgIGJ1aWx0aW46IHdvcmRzKG9iakNCdWlsdGlucyksXG4gICAgYmxvY2tLZXl3b3Jkczogd29yZHMoY0Jsb2NrS2V5d29yZHMgKyBcIiBAc3ludGhlc2l6ZSBAdHJ5IEBjYXRjaCBAZmluYWxseSBAYXV0b3JlbGVhc2Vwb29sIEBzeW5jaHJvbml6ZWQgY2xhc3MgdHJ5IGNhdGNoXCIpLFxuICAgIGRlZktleXdvcmRzOiB3b3JkcyhjRGVmS2V5d29yZHMgKyBcIiBAaW50ZXJmYWNlIEBpbXBsZW1lbnRhdGlvbiBAcHJvdG9jb2wgQGNsYXNzIGNsYXNzIG5hbWVzcGFjZVwiKSxcbiAgICBkb250SW5kZW50U3RhdGVtZW50czogL15ALiokfF50ZW1wbGF0ZSQvLFxuICAgIHR5cGVGaXJzdERlZmluaXRpb25zOiB0cnVlLFxuICAgIGF0b21zOiB3b3JkcyhcIllFUyBOTyBOVUxMIE5pbCBuaWwgdHJ1ZSBmYWxzZSBudWxscHRyXCIpLFxuICAgIGlzUmVzZXJ2ZWRJZGVudGlmaWVyOiBjSXNSZXNlcnZlZElkZW50aWZpZXIsXG4gICAgaG9va3M6IHtcbiAgICAgIFwiI1wiOiBjcHBIb29rLFxuICAgICAgXCIqXCI6IHBvaW50ZXJIb29rLFxuICAgICAgXCJ1XCI6IGNwcDExU3RyaW5nSG9vayxcbiAgICAgIFwiVVwiOiBjcHAxMVN0cmluZ0hvb2ssXG4gICAgICBcIkxcIjogY3BwMTFTdHJpbmdIb29rLFxuICAgICAgXCJSXCI6IGNwcDExU3RyaW5nSG9vayxcbiAgICAgIFwiMFwiOiBjcHAxNExpdGVyYWwsXG4gICAgICBcIjFcIjogY3BwMTRMaXRlcmFsLFxuICAgICAgXCIyXCI6IGNwcDE0TGl0ZXJhbCxcbiAgICAgIFwiM1wiOiBjcHAxNExpdGVyYWwsXG4gICAgICBcIjRcIjogY3BwMTRMaXRlcmFsLFxuICAgICAgXCI1XCI6IGNwcDE0TGl0ZXJhbCxcbiAgICAgIFwiNlwiOiBjcHAxNExpdGVyYWwsXG4gICAgICBcIjdcIjogY3BwMTRMaXRlcmFsLFxuICAgICAgXCI4XCI6IGNwcDE0TGl0ZXJhbCxcbiAgICAgIFwiOVwiOiBjcHAxNExpdGVyYWwsXG4gICAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSwgc3R5bGUpIHtcbiAgICAgICAgaWYgKHN0eWxlID09IFwidmFyaWFibGVcIiAmJiBzdHJlYW0ucGVlaygpID09IFwiKFwiICYmXG4gICAgICAgICAgICAoc3RhdGUucHJldlRva2VuID09IFwiO1wiIHx8IHN0YXRlLnByZXZUb2tlbiA9PSBudWxsIHx8XG4gICAgICAgICAgICAgc3RhdGUucHJldlRva2VuID09IFwifVwiKSAmJlxuICAgICAgICAgICAgY3BwTG9va3NMaWtlQ29uc3RydWN0b3Ioc3RyZWFtLmN1cnJlbnQoKSkpXG4gICAgICAgICAgcmV0dXJuIFwiZGVmXCI7XG4gICAgICB9XG4gICAgfSxcbiAgICBuYW1lc3BhY2VTZXBhcmF0b3I6IFwiOjpcIixcbiAgICBtb2RlUHJvcHM6IHtmb2xkOiBbXCJicmFjZVwiLCBcImluY2x1ZGVcIl19XG4gIH0pO1xuXG4gIGRlZihcInRleHQveC1zcXVpcnJlbFwiLCB7XG4gICAgbmFtZTogXCJjbGlrZVwiLFxuICAgIGtleXdvcmRzOiB3b3JkcyhcImJhc2UgYnJlYWsgY2xvbmUgY29udGludWUgY29uc3QgZGVmYXVsdCBkZWxldGUgZW51bSBleHRlbmRzIGZ1bmN0aW9uIGluIGNsYXNzXCIgK1xuICAgICAgICAgICAgICAgICAgICBcIiBmb3JlYWNoIGxvY2FsIHJlc3VtZSByZXR1cm4gdGhpcyB0aHJvdyB0eXBlb2YgeWllbGQgY29uc3RydWN0b3IgaW5zdGFuY2VvZiBzdGF0aWNcIiksXG4gICAgdHlwZXM6IGNUeXBlcyxcbiAgICBibG9ja0tleXdvcmRzOiB3b3JkcyhcImNhc2UgY2F0Y2ggY2xhc3MgZWxzZSBmb3IgZm9yZWFjaCBpZiBzd2l0Y2ggdHJ5IHdoaWxlXCIpLFxuICAgIGRlZktleXdvcmRzOiB3b3JkcyhcImZ1bmN0aW9uIGxvY2FsIGNsYXNzXCIpLFxuICAgIHR5cGVGaXJzdERlZmluaXRpb25zOiB0cnVlLFxuICAgIGF0b21zOiB3b3JkcyhcInRydWUgZmFsc2UgbnVsbFwiKSxcbiAgICBob29rczoge1wiI1wiOiBjcHBIb29rfSxcbiAgICBtb2RlUHJvcHM6IHtmb2xkOiBbXCJicmFjZVwiLCBcImluY2x1ZGVcIl19XG4gIH0pO1xuXG4gIC8vIENleWxvbiBTdHJpbmdzIG5lZWQgdG8gZGVhbCB3aXRoIGludGVycG9sYXRpb25cbiAgdmFyIHN0cmluZ1Rva2VuaXplciA9IG51bGw7XG4gIGZ1bmN0aW9uIHRva2VuQ2V5bG9uU3RyaW5nKHR5cGUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkge1xuICAgICAgdmFyIGVzY2FwZWQgPSBmYWxzZSwgbmV4dCwgZW5kID0gZmFsc2U7XG4gICAgICB3aGlsZSAoIXN0cmVhbS5lb2woKSkge1xuICAgICAgICBpZiAoIWVzY2FwZWQgJiYgc3RyZWFtLm1hdGNoKCdcIicpICYmXG4gICAgICAgICAgICAgICh0eXBlID09IFwic2luZ2xlXCIgfHwgc3RyZWFtLm1hdGNoKCdcIlwiJykpKSB7XG4gICAgICAgICAgZW5kID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWVzY2FwZWQgJiYgc3RyZWFtLm1hdGNoKCdgYCcpKSB7XG4gICAgICAgICAgc3RyaW5nVG9rZW5pemVyID0gdG9rZW5DZXlsb25TdHJpbmcodHlwZSk7XG4gICAgICAgICAgZW5kID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBuZXh0ID0gc3RyZWFtLm5leHQoKTtcbiAgICAgICAgZXNjYXBlZCA9IHR5cGUgPT0gXCJzaW5nbGVcIiAmJiAhZXNjYXBlZCAmJiBuZXh0ID09IFwiXFxcXFwiO1xuICAgICAgfVxuICAgICAgaWYgKGVuZClcbiAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IG51bGw7XG4gICAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgICB9XG4gIH1cblxuICBkZWYoXCJ0ZXh0L3gtY2V5bG9uXCIsIHtcbiAgICBuYW1lOiBcImNsaWtlXCIsXG4gICAga2V5d29yZHM6IHdvcmRzKFwiYWJzdHJhY3RzIGFsaWFzIGFzc2VtYmx5IGFzc2VydCBhc3NpZ24gYnJlYWsgY2FzZSBjYXRjaCBjbGFzcyBjb250aW51ZSBkeW5hbWljIGVsc2VcIiArXG4gICAgICAgICAgICAgICAgICAgIFwiIGV4aXN0cyBleHRlbmRzIGZpbmFsbHkgZm9yIGZ1bmN0aW9uIGdpdmVuIGlmIGltcG9ydCBpbiBpbnRlcmZhY2UgaXMgbGV0IG1vZHVsZSBuZXdcIiArXG4gICAgICAgICAgICAgICAgICAgIFwiIG5vbmVtcHR5IG9iamVjdCBvZiBvdXQgb3V0ZXIgcGFja2FnZSByZXR1cm4gc2F0aXNmaWVzIHN1cGVyIHN3aXRjaCB0aGVuIHRoaXMgdGhyb3dcIiArXG4gICAgICAgICAgICAgICAgICAgIFwiIHRyeSB2YWx1ZSB2b2lkIHdoaWxlXCIpLFxuICAgIHR5cGVzOiBmdW5jdGlvbih3b3JkKSB7XG4gICAgICAgIC8vIEluIENleWxvbiBhbGwgaWRlbnRpZmllcnMgdGhhdCBzdGFydCB3aXRoIGFuIHVwcGVyY2FzZSBhcmUgdHlwZXNcbiAgICAgICAgdmFyIGZpcnN0ID0gd29yZC5jaGFyQXQoMCk7XG4gICAgICAgIHJldHVybiAoZmlyc3QgPT09IGZpcnN0LnRvVXBwZXJDYXNlKCkgJiYgZmlyc3QgIT09IGZpcnN0LnRvTG93ZXJDYXNlKCkpO1xuICAgIH0sXG4gICAgYmxvY2tLZXl3b3Jkczogd29yZHMoXCJjYXNlIGNhdGNoIGNsYXNzIGR5bmFtaWMgZWxzZSBmaW5hbGx5IGZvciBmdW5jdGlvbiBpZiBpbnRlcmZhY2UgbW9kdWxlIG5ldyBvYmplY3Qgc3dpdGNoIHRyeSB3aGlsZVwiKSxcbiAgICBkZWZLZXl3b3Jkczogd29yZHMoXCJjbGFzcyBkeW5hbWljIGZ1bmN0aW9uIGludGVyZmFjZSBtb2R1bGUgb2JqZWN0IHBhY2thZ2UgdmFsdWVcIiksXG4gICAgYnVpbHRpbjogd29yZHMoXCJhYnN0cmFjdCBhY3R1YWwgYWxpYXNlZCBhbm5vdGF0aW9uIGJ5IGRlZmF1bHQgZGVwcmVjYXRlZCBkb2MgZmluYWwgZm9ybWFsIGxhdGUgbGljZW5zZVwiICtcbiAgICAgICAgICAgICAgICAgICBcIiBuYXRpdmUgb3B0aW9uYWwgc2VhbGVkIHNlZSBzZXJpYWxpemFibGUgc2hhcmVkIHN1cHByZXNzV2FybmluZ3MgdGFnZ2VkIHRocm93cyB2YXJpYWJsZVwiKSxcbiAgICBpc1B1bmN0dWF0aW9uQ2hhcjogL1tcXFtcXF17fVxcKFxcKSw7XFw6XFwuYF0vLFxuICAgIGlzT3BlcmF0b3JDaGFyOiAvWytcXC0qJiU9PD4hP3xefjpcXC9dLyxcbiAgICBudW1iZXJTdGFydDogL1tcXGQjJF0vLFxuICAgIG51bWJlcjogL14oPzojW1xcZGEtZkEtRl9dK3xcXCRbMDFfXSt8W1xcZF9dK1trTUdUUG11bnBmXT98W1xcZF9dK1xcLltcXGRfXSsoPzpbZUVdWy0rXT9cXGQrfFtrTUdUUG11bnBmXXwpfCkvaSxcbiAgICBtdWx0aUxpbmVTdHJpbmdzOiB0cnVlLFxuICAgIHR5cGVGaXJzdERlZmluaXRpb25zOiB0cnVlLFxuICAgIGF0b21zOiB3b3JkcyhcInRydWUgZmFsc2UgbnVsbCBsYXJnZXIgc21hbGxlciBlcXVhbCBlbXB0eSBmaW5pc2hlZFwiKSxcbiAgICBpbmRlbnRTd2l0Y2g6IGZhbHNlLFxuICAgIHN0eWxlRGVmczogZmFsc2UsXG4gICAgaG9va3M6IHtcbiAgICAgIFwiQFwiOiBmdW5jdGlvbihzdHJlYW0pIHtcbiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXFx3XFwkX10vKTtcbiAgICAgICAgcmV0dXJuIFwibWV0YVwiO1xuICAgICAgfSxcbiAgICAgICdcIic6IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHtcbiAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQ2V5bG9uU3RyaW5nKHN0cmVhbS5tYXRjaCgnXCJcIicpID8gXCJ0cmlwbGVcIiA6IFwic2luZ2xlXCIpO1xuICAgICAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTtcbiAgICAgICAgfSxcbiAgICAgICdgJzogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkge1xuICAgICAgICAgIGlmICghc3RyaW5nVG9rZW5pemVyIHx8ICFzdHJlYW0ubWF0Y2goJ2AnKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gc3RyaW5nVG9rZW5pemVyO1xuICAgICAgICAgIHN0cmluZ1Rva2VuaXplciA9IG51bGw7XG4gICAgICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpO1xuICAgICAgICB9LFxuICAgICAgXCInXCI6IGZ1bmN0aW9uKHN0cmVhbSkge1xuICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcXHdcXCRfXFx4YTEtXFx1ZmZmZl0vKTtcbiAgICAgICAgcmV0dXJuIFwiYXRvbVwiO1xuICAgICAgfSxcbiAgICAgIHRva2VuOiBmdW5jdGlvbihfc3RyZWFtLCBzdGF0ZSwgc3R5bGUpIHtcbiAgICAgICAgICBpZiAoKHN0eWxlID09IFwidmFyaWFibGVcIiB8fCBzdHlsZSA9PSBcInR5cGVcIikgJiZcbiAgICAgICAgICAgICAgc3RhdGUucHJldlRva2VuID09IFwiLlwiKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJ2YXJpYWJsZS0yXCI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICBtb2RlUHJvcHM6IHtcbiAgICAgICAgZm9sZDogW1wiYnJhY2VcIiwgXCJpbXBvcnRcIl0sXG4gICAgICAgIGNsb3NlQnJhY2tldHM6IHt0cmlwbGVzOiAnXCInfVxuICAgIH1cbiAgfSk7XG5cbn0pO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/codemirror/mode/clike/clike.js\n"); /***/ }), /***/ "./node_modules/codemirror/mode/css/css.js": -/*!*************************************************!* +/*!*************************************************!*\ !*** ./node_modules/codemirror/mode/css/css.js ***! \*************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { -eval("// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n if (true) // CommonJS\n mod(__webpack_require__(/*! ../../lib/codemirror */ \"./node_modules/codemirror/lib/codemirror.js\"));\n else {}\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"css\", function(config, parserConfig) {\n var inline = parserConfig.inline\n if (!parserConfig.propertyKeywords) parserConfig = CodeMirror.resolveMode(\"text/css\");\n\n var indentUnit = config.indentUnit,\n tokenHooks = parserConfig.tokenHooks,\n documentTypes = parserConfig.documentTypes || {},\n mediaTypes = parserConfig.mediaTypes || {},\n mediaFeatures = parserConfig.mediaFeatures || {},\n mediaValueKeywords = parserConfig.mediaValueKeywords || {},\n propertyKeywords = parserConfig.propertyKeywords || {},\n nonStandardPropertyKeywords = parserConfig.nonStandardPropertyKeywords || {},\n fontProperties = parserConfig.fontProperties || {},\n counterDescriptors = parserConfig.counterDescriptors || {},\n colorKeywords = parserConfig.colorKeywords || {},\n valueKeywords = parserConfig.valueKeywords || {},\n allowNested = parserConfig.allowNested,\n lineComment = parserConfig.lineComment,\n supportsAtComponent = parserConfig.supportsAtComponent === true,\n highlightNonStandardPropertyKeywords = config.highlightNonStandardPropertyKeywords !== false;\n\n var type, override;\n function ret(style, tp) { type = tp; return style; }\n\n // Tokenizers\n\n function tokenBase(stream, state) {\n var ch = stream.next();\n if (tokenHooks[ch]) {\n var result = tokenHooks[ch](stream, state);\n if (result !== false) return result;\n }\n if (ch == \"@\") {\n stream.eatWhile(/[\\w\\\\\\-]/);\n return ret(\"def\", stream.current());\n } else if (ch == \"=\" || (ch == \"~\" || ch == \"|\") && stream.eat(\"=\")) {\n return ret(null, \"compare\");\n } else if (ch == \"\\\"\" || ch == \"'\") {\n state.tokenize = tokenString(ch);\n return state.tokenize(stream, state);\n } else if (ch == \"#\") {\n stream.eatWhile(/[\\w\\\\\\-]/);\n return ret(\"atom\", \"hash\");\n } else if (ch == \"!\") {\n stream.match(/^\\s*\\w*/);\n return ret(\"keyword\", \"important\");\n } else if (/\\d/.test(ch) || ch == \".\" && stream.eat(/\\d/)) {\n stream.eatWhile(/[\\w.%]/);\n return ret(\"number\", \"unit\");\n } else if (ch === \"-\") {\n if (/[\\d.]/.test(stream.peek())) {\n stream.eatWhile(/[\\w.%]/);\n return ret(\"number\", \"unit\");\n } else if (stream.match(/^-[\\w\\\\\\-]*/)) {\n stream.eatWhile(/[\\w\\\\\\-]/);\n if (stream.match(/^\\s*:/, false))\n return ret(\"variable-2\", \"variable-definition\");\n return ret(\"variable-2\", \"variable\");\n } else if (stream.match(/^\\w+-/)) {\n return ret(\"meta\", \"meta\");\n }\n } else if (/[,+>*\\/]/.test(ch)) {\n return ret(null, \"select-op\");\n } else if (ch == \".\" && stream.match(/^-?[_a-z][_a-z0-9-]*/i)) {\n return ret(\"qualifier\", \"qualifier\");\n } else if (/[:;{}\\[\\]\\(\\)]/.test(ch)) {\n return ret(null, ch);\n } else if (stream.match(/[\\w-.]+(?=\\()/)) {\n if (/^(url(-prefix)?|domain|regexp)$/.test(stream.current().toLowerCase())) {\n state.tokenize = tokenParenthesized;\n }\n return ret(\"variable callee\", \"variable\");\n } else if (/[\\w\\\\\\-]/.test(ch)) {\n stream.eatWhile(/[\\w\\\\\\-]/);\n return ret(\"property\", \"word\");\n } else {\n return ret(null, null);\n }\n }\n\n function tokenString(quote) {\n return function(stream, state) {\n var escaped = false, ch;\n while ((ch = stream.next()) != null) {\n if (ch == quote && !escaped) {\n if (quote == \")\") stream.backUp(1);\n break;\n }\n escaped = !escaped && ch == \"\\\\\";\n }\n if (ch == quote || !escaped && quote != \")\") state.tokenize = null;\n return ret(\"string\", \"string\");\n };\n }\n\n function tokenParenthesized(stream, state) {\n stream.next(); // Must be '('\n if (!stream.match(/\\s*[\\\"\\')]/, false))\n state.tokenize = tokenString(\")\");\n else\n state.tokenize = null;\n return ret(null, \"(\");\n }\n\n // Context management\n\n function Context(type, indent, prev) {\n this.type = type;\n this.indent = indent;\n this.prev = prev;\n }\n\n function pushContext(state, stream, type, indent) {\n state.context = new Context(type, stream.indentation() + (indent === false ? 0 : indentUnit), state.context);\n return type;\n }\n\n function popContext(state) {\n if (state.context.prev)\n state.context = state.context.prev;\n return state.context.type;\n }\n\n function pass(type, stream, state) {\n return states[state.context.type](type, stream, state);\n }\n function popAndPass(type, stream, state, n) {\n for (var i = n || 1; i > 0; i--)\n state.context = state.context.prev;\n return pass(type, stream, state);\n }\n\n // Parser\n\n function wordAsValue(stream) {\n var word = stream.current().toLowerCase();\n if (valueKeywords.hasOwnProperty(word))\n override = \"atom\";\n else if (colorKeywords.hasOwnProperty(word))\n override = \"keyword\";\n else\n override = \"variable\";\n }\n\n var states = {};\n\n states.top = function(type, stream, state) {\n if (type == \"{\") {\n return pushContext(state, stream, \"block\");\n } else if (type == \"}\" && state.context.prev) {\n return popContext(state);\n } else if (supportsAtComponent && /@component/i.test(type)) {\n return pushContext(state, stream, \"atComponentBlock\");\n } else if (/^@(-moz-)?document$/i.test(type)) {\n return pushContext(state, stream, \"documentTypes\");\n } else if (/^@(media|supports|(-moz-)?document|import)$/i.test(type)) {\n return pushContext(state, stream, \"atBlock\");\n } else if (/^@(font-face|counter-style)/i.test(type)) {\n state.stateArg = type;\n return \"restricted_atBlock_before\";\n } else if (/^@(-(moz|ms|o|webkit)-)?keyframes$/i.test(type)) {\n return \"keyframes\";\n } else if (type && type.charAt(0) == \"@\") {\n return pushContext(state, stream, \"at\");\n } else if (type == \"hash\") {\n override = \"builtin\";\n } else if (type == \"word\") {\n override = \"tag\";\n } else if (type == \"variable-definition\") {\n return \"maybeprop\";\n } else if (type == \"interpolation\") {\n return pushContext(state, stream, \"interpolation\");\n } else if (type == \":\") {\n return \"pseudo\";\n } else if (allowNested && type == \"(\") {\n return pushContext(state, stream, \"parens\");\n }\n return state.context.type;\n };\n\n states.block = function(type, stream, state) {\n if (type == \"word\") {\n var word = stream.current().toLowerCase();\n if (propertyKeywords.hasOwnProperty(word)) {\n override = \"property\";\n return \"maybeprop\";\n } else if (nonStandardPropertyKeywords.hasOwnProperty(word)) {\n override = highlightNonStandardPropertyKeywords ? \"string-2\" : \"property\";\n return \"maybeprop\";\n } else if (allowNested) {\n override = stream.match(/^\\s*:(?:\\s|$)/, false) ? \"property\" : \"tag\";\n return \"block\";\n } else {\n override += \" error\";\n return \"maybeprop\";\n }\n } else if (type == \"meta\") {\n return \"block\";\n } else if (!allowNested && (type == \"hash\" || type == \"qualifier\")) {\n override = \"error\";\n return \"block\";\n } else {\n return states.top(type, stream, state);\n }\n };\n\n states.maybeprop = function(type, stream, state) {\n if (type == \":\") return pushContext(state, stream, \"prop\");\n return pass(type, stream, state);\n };\n\n states.prop = function(type, stream, state) {\n if (type == \";\") return popContext(state);\n if (type == \"{\" && allowNested) return pushContext(state, stream, \"propBlock\");\n if (type == \"}\" || type == \"{\") return popAndPass(type, stream, state);\n if (type == \"(\") return pushContext(state, stream, \"parens\");\n\n if (type == \"hash\" && !/^#([0-9a-fA-f]{3,4}|[0-9a-fA-f]{6}|[0-9a-fA-f]{8})$/.test(stream.current())) {\n override += \" error\";\n } else if (type == \"word\") {\n wordAsValue(stream);\n } else if (type == \"interpolation\") {\n return pushContext(state, stream, \"interpolation\");\n }\n return \"prop\";\n };\n\n states.propBlock = function(type, _stream, state) {\n if (type == \"}\") return popContext(state);\n if (type == \"word\") { override = \"property\"; return \"maybeprop\"; }\n return state.context.type;\n };\n\n states.parens = function(type, stream, state) {\n if (type == \"{\" || type == \"}\") return popAndPass(type, stream, state);\n if (type == \")\") return popContext(state);\n if (type == \"(\") return pushContext(state, stream, \"parens\");\n if (type == \"interpolation\") return pushContext(state, stream, \"interpolation\");\n if (type == \"word\") wordAsValue(stream);\n return \"parens\";\n };\n\n states.pseudo = function(type, stream, state) {\n if (type == \"meta\") return \"pseudo\";\n\n if (type == \"word\") {\n override = \"variable-3\";\n return state.context.type;\n }\n return pass(type, stream, state);\n };\n\n states.documentTypes = function(type, stream, state) {\n if (type == \"word\" && documentTypes.hasOwnProperty(stream.current())) {\n override = \"tag\";\n return state.context.type;\n } else {\n return states.atBlock(type, stream, state);\n }\n };\n\n states.atBlock = function(type, stream, state) {\n if (type == \"(\") return pushContext(state, stream, \"atBlock_parens\");\n if (type == \"}\" || type == \";\") return popAndPass(type, stream, state);\n if (type == \"{\") return popContext(state) && pushContext(state, stream, allowNested ? \"block\" : \"top\");\n\n if (type == \"interpolation\") return pushContext(state, stream, \"interpolation\");\n\n if (type == \"word\") {\n var word = stream.current().toLowerCase();\n if (word == \"only\" || word == \"not\" || word == \"and\" || word == \"or\")\n override = \"keyword\";\n else if (mediaTypes.hasOwnProperty(word))\n override = \"attribute\";\n else if (mediaFeatures.hasOwnProperty(word))\n override = \"property\";\n else if (mediaValueKeywords.hasOwnProperty(word))\n override = \"keyword\";\n else if (propertyKeywords.hasOwnProperty(word))\n override = \"property\";\n else if (nonStandardPropertyKeywords.hasOwnProperty(word))\n override = highlightNonStandardPropertyKeywords ? \"string-2\" : \"property\";\n else if (valueKeywords.hasOwnProperty(word))\n override = \"atom\";\n else if (colorKeywords.hasOwnProperty(word))\n override = \"keyword\";\n else\n override = \"error\";\n }\n return state.context.type;\n };\n\n states.atComponentBlock = function(type, stream, state) {\n if (type == \"}\")\n return popAndPass(type, stream, state);\n if (type == \"{\")\n return popContext(state) && pushContext(state, stream, allowNested ? \"block\" : \"top\", false);\n if (type == \"word\")\n override = \"error\";\n return state.context.type;\n };\n\n states.atBlock_parens = function(type, stream, state) {\n if (type == \")\") return popContext(state);\n if (type == \"{\" || type == \"}\") return popAndPass(type, stream, state, 2);\n return states.atBlock(type, stream, state);\n };\n\n states.restricted_atBlock_before = function(type, stream, state) {\n if (type == \"{\")\n return pushContext(state, stream, \"restricted_atBlock\");\n if (type == \"word\" && state.stateArg == \"@counter-style\") {\n override = \"variable\";\n return \"restricted_atBlock_before\";\n }\n return pass(type, stream, state);\n };\n\n states.restricted_atBlock = function(type, stream, state) {\n if (type == \"}\") {\n state.stateArg = null;\n return popContext(state);\n }\n if (type == \"word\") {\n if ((state.stateArg == \"@font-face\" && !fontProperties.hasOwnProperty(stream.current().toLowerCase())) ||\n (state.stateArg == \"@counter-style\" && !counterDescriptors.hasOwnProperty(stream.current().toLowerCase())))\n override = \"error\";\n else\n override = \"property\";\n return \"maybeprop\";\n }\n return \"restricted_atBlock\";\n };\n\n states.keyframes = function(type, stream, state) {\n if (type == \"word\") { override = \"variable\"; return \"keyframes\"; }\n if (type == \"{\") return pushContext(state, stream, \"top\");\n return pass(type, stream, state);\n };\n\n states.at = function(type, stream, state) {\n if (type == \";\") return popContext(state);\n if (type == \"{\" || type == \"}\") return popAndPass(type, stream, state);\n if (type == \"word\") override = \"tag\";\n else if (type == \"hash\") override = \"builtin\";\n return \"at\";\n };\n\n states.interpolation = function(type, stream, state) {\n if (type == \"}\") return popContext(state);\n if (type == \"{\" || type == \";\") return popAndPass(type, stream, state);\n if (type == \"word\") override = \"variable\";\n else if (type != \"variable\" && type != \"(\" && type != \")\") override = \"error\";\n return \"interpolation\";\n };\n\n return {\n startState: function(base) {\n return {tokenize: null,\n state: inline ? \"block\" : \"top\",\n stateArg: null,\n context: new Context(inline ? \"block\" : \"top\", base || 0, null)};\n },\n\n token: function(stream, state) {\n if (!state.tokenize && stream.eatSpace()) return null;\n var style = (state.tokenize || tokenBase)(stream, state);\n if (style && typeof style == \"object\") {\n type = style[1];\n style = style[0];\n }\n override = style;\n if (type != \"comment\")\n state.state = states[state.state](type, stream, state);\n return override;\n },\n\n indent: function(state, textAfter) {\n var cx = state.context, ch = textAfter && textAfter.charAt(0);\n var indent = cx.indent;\n if (cx.type == \"prop\" && (ch == \"}\" || ch == \")\")) cx = cx.prev;\n if (cx.prev) {\n if (ch == \"}\" && (cx.type == \"block\" || cx.type == \"top\" ||\n cx.type == \"interpolation\" || cx.type == \"restricted_atBlock\")) {\n // Resume indentation from parent context.\n cx = cx.prev;\n indent = cx.indent;\n } else if (ch == \")\" && (cx.type == \"parens\" || cx.type == \"atBlock_parens\") ||\n ch == \"{\" && (cx.type == \"at\" || cx.type == \"atBlock\")) {\n // Dedent relative to current context.\n indent = Math.max(0, cx.indent - indentUnit);\n }\n }\n return indent;\n },\n\n electricChars: \"}\",\n blockCommentStart: \"/*\",\n blockCommentEnd: \"*/\",\n blockCommentContinue: \" * \",\n lineComment: lineComment,\n fold: \"brace\"\n };\n});\n\n function keySet(array) {\n var keys = {};\n for (var i = 0; i < array.length; ++i) {\n keys[array[i].toLowerCase()] = true;\n }\n return keys;\n }\n\n var documentTypes_ = [\n \"domain\", \"regexp\", \"url\", \"url-prefix\"\n ], documentTypes = keySet(documentTypes_);\n\n var mediaTypes_ = [\n \"all\", \"aural\", \"braille\", \"handheld\", \"print\", \"projection\", \"screen\",\n \"tty\", \"tv\", \"embossed\"\n ], mediaTypes = keySet(mediaTypes_);\n\n var mediaFeatures_ = [\n \"width\", \"min-width\", \"max-width\", \"height\", \"min-height\", \"max-height\",\n \"device-width\", \"min-device-width\", \"max-device-width\", \"device-height\",\n \"min-device-height\", \"max-device-height\", \"aspect-ratio\",\n \"min-aspect-ratio\", \"max-aspect-ratio\", \"device-aspect-ratio\",\n \"min-device-aspect-ratio\", \"max-device-aspect-ratio\", \"color\", \"min-color\",\n \"max-color\", \"color-index\", \"min-color-index\", \"max-color-index\",\n \"monochrome\", \"min-monochrome\", \"max-monochrome\", \"resolution\",\n \"min-resolution\", \"max-resolution\", \"scan\", \"grid\", \"orientation\",\n \"device-pixel-ratio\", \"min-device-pixel-ratio\", \"max-device-pixel-ratio\",\n \"pointer\", \"any-pointer\", \"hover\", \"any-hover\", \"prefers-color-scheme\"\n ], mediaFeatures = keySet(mediaFeatures_);\n\n var mediaValueKeywords_ = [\n \"landscape\", \"portrait\", \"none\", \"coarse\", \"fine\", \"on-demand\", \"hover\",\n \"interlace\", \"progressive\",\n \"dark\", \"light\"\n ], mediaValueKeywords = keySet(mediaValueKeywords_);\n\n var propertyKeywords_ = [\n \"align-content\", \"align-items\", \"align-self\", \"alignment-adjust\",\n \"alignment-baseline\", \"all\", \"anchor-point\", \"animation\", \"animation-delay\",\n \"animation-direction\", \"animation-duration\", \"animation-fill-mode\",\n \"animation-iteration-count\", \"animation-name\", \"animation-play-state\",\n \"animation-timing-function\", \"appearance\", \"azimuth\", \"backdrop-filter\",\n \"backface-visibility\", \"background\", \"background-attachment\",\n \"background-blend-mode\", \"background-clip\", \"background-color\",\n \"background-image\", \"background-origin\", \"background-position\",\n \"background-position-x\", \"background-position-y\", \"background-repeat\",\n \"background-size\", \"baseline-shift\", \"binding\", \"bleed\", \"block-size\",\n \"bookmark-label\", \"bookmark-level\", \"bookmark-state\", \"bookmark-target\",\n \"border\", \"border-bottom\", \"border-bottom-color\", \"border-bottom-left-radius\",\n \"border-bottom-right-radius\", \"border-bottom-style\", \"border-bottom-width\",\n \"border-collapse\", \"border-color\", \"border-image\", \"border-image-outset\",\n \"border-image-repeat\", \"border-image-slice\", \"border-image-source\",\n \"border-image-width\", \"border-left\", \"border-left-color\", \"border-left-style\",\n \"border-left-width\", \"border-radius\", \"border-right\", \"border-right-color\",\n \"border-right-style\", \"border-right-width\", \"border-spacing\", \"border-style\",\n \"border-top\", \"border-top-color\", \"border-top-left-radius\",\n \"border-top-right-radius\", \"border-top-style\", \"border-top-width\",\n \"border-width\", \"bottom\", \"box-decoration-break\", \"box-shadow\", \"box-sizing\",\n \"break-after\", \"break-before\", \"break-inside\", \"caption-side\", \"caret-color\",\n \"clear\", \"clip\", \"color\", \"color-profile\", \"column-count\", \"column-fill\",\n \"column-gap\", \"column-rule\", \"column-rule-color\", \"column-rule-style\",\n \"column-rule-width\", \"column-span\", \"column-width\", \"columns\", \"contain\",\n \"content\", \"counter-increment\", \"counter-reset\", \"crop\", \"cue\", \"cue-after\",\n \"cue-before\", \"cursor\", \"direction\", \"display\", \"dominant-baseline\",\n \"drop-initial-after-adjust\", \"drop-initial-after-align\",\n \"drop-initial-before-adjust\", \"drop-initial-before-align\", \"drop-initial-size\",\n \"drop-initial-value\", \"elevation\", \"empty-cells\", \"fit\", \"fit-position\",\n \"flex\", \"flex-basis\", \"flex-direction\", \"flex-flow\", \"flex-grow\",\n \"flex-shrink\", \"flex-wrap\", \"float\", \"float-offset\", \"flow-from\", \"flow-into\",\n \"font\", \"font-family\", \"font-feature-settings\", \"font-kerning\",\n \"font-language-override\", \"font-optical-sizing\", \"font-size\",\n \"font-size-adjust\", \"font-stretch\", \"font-style\", \"font-synthesis\",\n \"font-variant\", \"font-variant-alternates\", \"font-variant-caps\",\n \"font-variant-east-asian\", \"font-variant-ligatures\", \"font-variant-numeric\",\n \"font-variant-position\", \"font-variation-settings\", \"font-weight\", \"gap\",\n \"grid\", \"grid-area\", \"grid-auto-columns\", \"grid-auto-flow\", \"grid-auto-rows\",\n \"grid-column\", \"grid-column-end\", \"grid-column-gap\", \"grid-column-start\",\n \"grid-gap\", \"grid-row\", \"grid-row-end\", \"grid-row-gap\", \"grid-row-start\",\n \"grid-template\", \"grid-template-areas\", \"grid-template-columns\",\n \"grid-template-rows\", \"hanging-punctuation\", \"height\", \"hyphens\", \"icon\",\n \"image-orientation\", \"image-rendering\", \"image-resolution\", \"inline-box-align\",\n \"inset\", \"inset-block\", \"inset-block-end\", \"inset-block-start\", \"inset-inline\",\n \"inset-inline-end\", \"inset-inline-start\", \"isolation\", \"justify-content\",\n \"justify-items\", \"justify-self\", \"left\", \"letter-spacing\", \"line-break\",\n \"line-height\", \"line-height-step\", \"line-stacking\", \"line-stacking-ruby\",\n \"line-stacking-shift\", \"line-stacking-strategy\", \"list-style\",\n \"list-style-image\", \"list-style-position\", \"list-style-type\", \"margin\",\n \"margin-bottom\", \"margin-left\", \"margin-right\", \"margin-top\", \"marks\",\n \"marquee-direction\", \"marquee-loop\", \"marquee-play-count\", \"marquee-speed\",\n \"marquee-style\", \"mask-clip\", \"mask-composite\", \"mask-image\", \"mask-mode\",\n \"mask-origin\", \"mask-position\", \"mask-repeat\", \"mask-size\",\"mask-type\",\n \"max-block-size\", \"max-height\", \"max-inline-size\",\n \"max-width\", \"min-block-size\", \"min-height\", \"min-inline-size\", \"min-width\",\n \"mix-blend-mode\", \"move-to\", \"nav-down\", \"nav-index\", \"nav-left\", \"nav-right\",\n \"nav-up\", \"object-fit\", \"object-position\", \"offset\", \"offset-anchor\",\n \"offset-distance\", \"offset-path\", \"offset-position\", \"offset-rotate\",\n \"opacity\", \"order\", \"orphans\", \"outline\", \"outline-color\", \"outline-offset\",\n \"outline-style\", \"outline-width\", \"overflow\", \"overflow-style\",\n \"overflow-wrap\", \"overflow-x\", \"overflow-y\", \"padding\", \"padding-bottom\",\n \"padding-left\", \"padding-right\", \"padding-top\", \"page\", \"page-break-after\",\n \"page-break-before\", \"page-break-inside\", \"page-policy\", \"pause\",\n \"pause-after\", \"pause-before\", \"perspective\", \"perspective-origin\", \"pitch\",\n \"pitch-range\", \"place-content\", \"place-items\", \"place-self\", \"play-during\",\n \"position\", \"presentation-level\", \"punctuation-trim\", \"quotes\",\n \"region-break-after\", \"region-break-before\", \"region-break-inside\",\n \"region-fragment\", \"rendering-intent\", \"resize\", \"rest\", \"rest-after\",\n \"rest-before\", \"richness\", \"right\", \"rotate\", \"rotation\", \"rotation-point\",\n \"row-gap\", \"ruby-align\", \"ruby-overhang\", \"ruby-position\", \"ruby-span\",\n \"scale\", \"scroll-behavior\", \"scroll-margin\", \"scroll-margin-block\",\n \"scroll-margin-block-end\", \"scroll-margin-block-start\", \"scroll-margin-bottom\",\n \"scroll-margin-inline\", \"scroll-margin-inline-end\",\n \"scroll-margin-inline-start\", \"scroll-margin-left\", \"scroll-margin-right\",\n \"scroll-margin-top\", \"scroll-padding\", \"scroll-padding-block\",\n \"scroll-padding-block-end\", \"scroll-padding-block-start\",\n \"scroll-padding-bottom\", \"scroll-padding-inline\", \"scroll-padding-inline-end\",\n \"scroll-padding-inline-start\", \"scroll-padding-left\", \"scroll-padding-right\",\n \"scroll-padding-top\", \"scroll-snap-align\", \"scroll-snap-type\",\n \"shape-image-threshold\", \"shape-inside\", \"shape-margin\", \"shape-outside\",\n \"size\", \"speak\", \"speak-as\", \"speak-header\", \"speak-numeral\",\n \"speak-punctuation\", \"speech-rate\", \"stress\", \"string-set\", \"tab-size\",\n \"table-layout\", \"target\", \"target-name\", \"target-new\", \"target-position\",\n \"text-align\", \"text-align-last\", \"text-combine-upright\", \"text-decoration\",\n \"text-decoration-color\", \"text-decoration-line\", \"text-decoration-skip\",\n \"text-decoration-skip-ink\", \"text-decoration-style\", \"text-emphasis\",\n \"text-emphasis-color\", \"text-emphasis-position\", \"text-emphasis-style\",\n \"text-height\", \"text-indent\", \"text-justify\", \"text-orientation\",\n \"text-outline\", \"text-overflow\", \"text-rendering\", \"text-shadow\",\n \"text-size-adjust\", \"text-space-collapse\", \"text-transform\",\n \"text-underline-position\", \"text-wrap\", \"top\", \"touch-action\", \"transform\", \"transform-origin\",\n \"transform-style\", \"transition\", \"transition-delay\", \"transition-duration\",\n \"transition-property\", \"transition-timing-function\", \"translate\",\n \"unicode-bidi\", \"user-select\", \"vertical-align\", \"visibility\", \"voice-balance\",\n \"voice-duration\", \"voice-family\", \"voice-pitch\", \"voice-range\", \"voice-rate\",\n \"voice-stress\", \"voice-volume\", \"volume\", \"white-space\", \"widows\", \"width\",\n \"will-change\", \"word-break\", \"word-spacing\", \"word-wrap\", \"writing-mode\", \"z-index\",\n // SVG-specific\n \"clip-path\", \"clip-rule\", \"mask\", \"enable-background\", \"filter\", \"flood-color\",\n \"flood-opacity\", \"lighting-color\", \"stop-color\", \"stop-opacity\", \"pointer-events\",\n \"color-interpolation\", \"color-interpolation-filters\",\n \"color-rendering\", \"fill\", \"fill-opacity\", \"fill-rule\", \"image-rendering\",\n \"marker\", \"marker-end\", \"marker-mid\", \"marker-start\", \"paint-order\", \"shape-rendering\", \"stroke\",\n \"stroke-dasharray\", \"stroke-dashoffset\", \"stroke-linecap\", \"stroke-linejoin\",\n \"stroke-miterlimit\", \"stroke-opacity\", \"stroke-width\", \"text-rendering\",\n \"baseline-shift\", \"dominant-baseline\", \"glyph-orientation-horizontal\",\n \"glyph-orientation-vertical\", \"text-anchor\", \"writing-mode\",\n ], propertyKeywords = keySet(propertyKeywords_);\n\n var nonStandardPropertyKeywords_ = [\n \"border-block\", \"border-block-color\", \"border-block-end\",\n \"border-block-end-color\", \"border-block-end-style\", \"border-block-end-width\",\n \"border-block-start\", \"border-block-start-color\", \"border-block-start-style\",\n \"border-block-start-width\", \"border-block-style\", \"border-block-width\",\n \"border-inline\", \"border-inline-color\", \"border-inline-end\",\n \"border-inline-end-color\", \"border-inline-end-style\",\n \"border-inline-end-width\", \"border-inline-start\", \"border-inline-start-color\",\n \"border-inline-start-style\", \"border-inline-start-width\",\n \"border-inline-style\", \"border-inline-width\", \"margin-block\",\n \"margin-block-end\", \"margin-block-start\", \"margin-inline\", \"margin-inline-end\",\n \"margin-inline-start\", \"padding-block\", \"padding-block-end\",\n \"padding-block-start\", \"padding-inline\", \"padding-inline-end\",\n \"padding-inline-start\", \"scroll-snap-stop\", \"scrollbar-3d-light-color\",\n \"scrollbar-arrow-color\", \"scrollbar-base-color\", \"scrollbar-dark-shadow-color\",\n \"scrollbar-face-color\", \"scrollbar-highlight-color\", \"scrollbar-shadow-color\",\n \"scrollbar-track-color\", \"searchfield-cancel-button\", \"searchfield-decoration\",\n \"searchfield-results-button\", \"searchfield-results-decoration\", \"shape-inside\", \"zoom\"\n ], nonStandardPropertyKeywords = keySet(nonStandardPropertyKeywords_);\n\n var fontProperties_ = [\n \"font-display\", \"font-family\", \"src\", \"unicode-range\", \"font-variant\",\n \"font-feature-settings\", \"font-stretch\", \"font-weight\", \"font-style\"\n ], fontProperties = keySet(fontProperties_);\n\n var counterDescriptors_ = [\n \"additive-symbols\", \"fallback\", \"negative\", \"pad\", \"prefix\", \"range\",\n \"speak-as\", \"suffix\", \"symbols\", \"system\"\n ], counterDescriptors = keySet(counterDescriptors_);\n\n var colorKeywords_ = [\n \"aliceblue\", \"antiquewhite\", \"aqua\", \"aquamarine\", \"azure\", \"beige\",\n \"bisque\", \"black\", \"blanchedalmond\", \"blue\", \"blueviolet\", \"brown\",\n \"burlywood\", \"cadetblue\", \"chartreuse\", \"chocolate\", \"coral\", \"cornflowerblue\",\n \"cornsilk\", \"crimson\", \"cyan\", \"darkblue\", \"darkcyan\", \"darkgoldenrod\",\n \"darkgray\", \"darkgreen\", \"darkkhaki\", \"darkmagenta\", \"darkolivegreen\",\n \"darkorange\", \"darkorchid\", \"darkred\", \"darksalmon\", \"darkseagreen\",\n \"darkslateblue\", \"darkslategray\", \"darkturquoise\", \"darkviolet\",\n \"deeppink\", \"deepskyblue\", \"dimgray\", \"dodgerblue\", \"firebrick\",\n \"floralwhite\", \"forestgreen\", \"fuchsia\", \"gainsboro\", \"ghostwhite\",\n \"gold\", \"goldenrod\", \"gray\", \"grey\", \"green\", \"greenyellow\", \"honeydew\",\n \"hotpink\", \"indianred\", \"indigo\", \"ivory\", \"khaki\", \"lavender\",\n \"lavenderblush\", \"lawngreen\", \"lemonchiffon\", \"lightblue\", \"lightcoral\",\n \"lightcyan\", \"lightgoldenrodyellow\", \"lightgray\", \"lightgreen\", \"lightpink\",\n \"lightsalmon\", \"lightseagreen\", \"lightskyblue\", \"lightslategray\",\n \"lightsteelblue\", \"lightyellow\", \"lime\", \"limegreen\", \"linen\", \"magenta\",\n \"maroon\", \"mediumaquamarine\", \"mediumblue\", \"mediumorchid\", \"mediumpurple\",\n \"mediumseagreen\", \"mediumslateblue\", \"mediumspringgreen\", \"mediumturquoise\",\n \"mediumvioletred\", \"midnightblue\", \"mintcream\", \"mistyrose\", \"moccasin\",\n \"navajowhite\", \"navy\", \"oldlace\", \"olive\", \"olivedrab\", \"orange\", \"orangered\",\n \"orchid\", \"palegoldenrod\", \"palegreen\", \"paleturquoise\", \"palevioletred\",\n \"papayawhip\", \"peachpuff\", \"peru\", \"pink\", \"plum\", \"powderblue\",\n \"purple\", \"rebeccapurple\", \"red\", \"rosybrown\", \"royalblue\", \"saddlebrown\",\n \"salmon\", \"sandybrown\", \"seagreen\", \"seashell\", \"sienna\", \"silver\", \"skyblue\",\n \"slateblue\", \"slategray\", \"snow\", \"springgreen\", \"steelblue\", \"tan\",\n \"teal\", \"thistle\", \"tomato\", \"turquoise\", \"violet\", \"wheat\", \"white\",\n \"whitesmoke\", \"yellow\", \"yellowgreen\"\n ], colorKeywords = keySet(colorKeywords_);\n\n var valueKeywords_ = [\n \"above\", \"absolute\", \"activeborder\", \"additive\", \"activecaption\", \"afar\",\n \"after-white-space\", \"ahead\", \"alias\", \"all\", \"all-scroll\", \"alphabetic\", \"alternate\",\n \"always\", \"amharic\", \"amharic-abegede\", \"antialiased\", \"appworkspace\",\n \"arabic-indic\", \"armenian\", \"asterisks\", \"attr\", \"auto\", \"auto-flow\", \"avoid\", \"avoid-column\", \"avoid-page\",\n \"avoid-region\", \"axis-pan\", \"background\", \"backwards\", \"baseline\", \"below\", \"bidi-override\", \"binary\",\n \"bengali\", \"blink\", \"block\", \"block-axis\", \"bold\", \"bolder\", \"border\", \"border-box\",\n \"both\", \"bottom\", \"break\", \"break-all\", \"break-word\", \"bullets\", \"button\", \"button-bevel\",\n \"buttonface\", \"buttonhighlight\", \"buttonshadow\", \"buttontext\", \"calc\", \"cambodian\",\n \"capitalize\", \"caps-lock-indicator\", \"caption\", \"captiontext\", \"caret\",\n \"cell\", \"center\", \"checkbox\", \"circle\", \"cjk-decimal\", \"cjk-earthly-branch\",\n \"cjk-heavenly-stem\", \"cjk-ideographic\", \"clear\", \"clip\", \"close-quote\",\n \"col-resize\", \"collapse\", \"color\", \"color-burn\", \"color-dodge\", \"column\", \"column-reverse\",\n \"compact\", \"condensed\", \"contain\", \"content\", \"contents\",\n \"content-box\", \"context-menu\", \"continuous\", \"copy\", \"counter\", \"counters\", \"cover\", \"crop\",\n \"cross\", \"crosshair\", \"currentcolor\", \"cursive\", \"cyclic\", \"darken\", \"dashed\", \"decimal\",\n \"decimal-leading-zero\", \"default\", \"default-button\", \"dense\", \"destination-atop\",\n \"destination-in\", \"destination-out\", \"destination-over\", \"devanagari\", \"difference\",\n \"disc\", \"discard\", \"disclosure-closed\", \"disclosure-open\", \"document\",\n \"dot-dash\", \"dot-dot-dash\",\n \"dotted\", \"double\", \"down\", \"e-resize\", \"ease\", \"ease-in\", \"ease-in-out\", \"ease-out\",\n \"element\", \"ellipse\", \"ellipsis\", \"embed\", \"end\", \"ethiopic\", \"ethiopic-abegede\",\n \"ethiopic-abegede-am-et\", \"ethiopic-abegede-gez\", \"ethiopic-abegede-ti-er\",\n \"ethiopic-abegede-ti-et\", \"ethiopic-halehame-aa-er\",\n \"ethiopic-halehame-aa-et\", \"ethiopic-halehame-am-et\",\n \"ethiopic-halehame-gez\", \"ethiopic-halehame-om-et\",\n \"ethiopic-halehame-sid-et\", \"ethiopic-halehame-so-et\",\n \"ethiopic-halehame-ti-er\", \"ethiopic-halehame-ti-et\", \"ethiopic-halehame-tig\",\n \"ethiopic-numeric\", \"ew-resize\", \"exclusion\", \"expanded\", \"extends\", \"extra-condensed\",\n \"extra-expanded\", \"fantasy\", \"fast\", \"fill\", \"fill-box\", \"fixed\", \"flat\", \"flex\", \"flex-end\", \"flex-start\", \"footnotes\",\n \"forwards\", \"from\", \"geometricPrecision\", \"georgian\", \"graytext\", \"grid\", \"groove\",\n \"gujarati\", \"gurmukhi\", \"hand\", \"hangul\", \"hangul-consonant\", \"hard-light\", \"hebrew\",\n \"help\", \"hidden\", \"hide\", \"higher\", \"highlight\", \"highlighttext\",\n \"hiragana\", \"hiragana-iroha\", \"horizontal\", \"hsl\", \"hsla\", \"hue\", \"icon\", \"ignore\",\n \"inactiveborder\", \"inactivecaption\", \"inactivecaptiontext\", \"infinite\",\n \"infobackground\", \"infotext\", \"inherit\", \"initial\", \"inline\", \"inline-axis\",\n \"inline-block\", \"inline-flex\", \"inline-grid\", \"inline-table\", \"inset\", \"inside\", \"intrinsic\", \"invert\",\n \"italic\", \"japanese-formal\", \"japanese-informal\", \"justify\", \"kannada\",\n \"katakana\", \"katakana-iroha\", \"keep-all\", \"khmer\",\n \"korean-hangul-formal\", \"korean-hanja-formal\", \"korean-hanja-informal\",\n \"landscape\", \"lao\", \"large\", \"larger\", \"left\", \"level\", \"lighter\", \"lighten\",\n \"line-through\", \"linear\", \"linear-gradient\", \"lines\", \"list-item\", \"listbox\", \"listitem\",\n \"local\", \"logical\", \"loud\", \"lower\", \"lower-alpha\", \"lower-armenian\",\n \"lower-greek\", \"lower-hexadecimal\", \"lower-latin\", \"lower-norwegian\",\n \"lower-roman\", \"lowercase\", \"ltr\", \"luminosity\", \"malayalam\", \"manipulation\", \"match\", \"matrix\", \"matrix3d\",\n \"media-controls-background\", \"media-current-time-display\",\n \"media-fullscreen-button\", \"media-mute-button\", \"media-play-button\",\n \"media-return-to-realtime-button\", \"media-rewind-button\",\n \"media-seek-back-button\", \"media-seek-forward-button\", \"media-slider\",\n \"media-sliderthumb\", \"media-time-remaining-display\", \"media-volume-slider\",\n \"media-volume-slider-container\", \"media-volume-sliderthumb\", \"medium\",\n \"menu\", \"menulist\", \"menulist-button\", \"menulist-text\",\n \"menulist-textfield\", \"menutext\", \"message-box\", \"middle\", \"min-intrinsic\",\n \"mix\", \"mongolian\", \"monospace\", \"move\", \"multiple\", \"multiple_mask_images\", \"multiply\", \"myanmar\", \"n-resize\",\n \"narrower\", \"ne-resize\", \"nesw-resize\", \"no-close-quote\", \"no-drop\",\n \"no-open-quote\", \"no-repeat\", \"none\", \"normal\", \"not-allowed\", \"nowrap\",\n \"ns-resize\", \"numbers\", \"numeric\", \"nw-resize\", \"nwse-resize\", \"oblique\", \"octal\", \"opacity\", \"open-quote\",\n \"optimizeLegibility\", \"optimizeSpeed\", \"oriya\", \"oromo\", \"outset\",\n \"outside\", \"outside-shape\", \"overlay\", \"overline\", \"padding\", \"padding-box\",\n \"painted\", \"page\", \"paused\", \"persian\", \"perspective\", \"pinch-zoom\", \"plus-darker\", \"plus-lighter\",\n \"pointer\", \"polygon\", \"portrait\", \"pre\", \"pre-line\", \"pre-wrap\", \"preserve-3d\",\n \"progress\", \"push-button\", \"radial-gradient\", \"radio\", \"read-only\",\n \"read-write\", \"read-write-plaintext-only\", \"rectangle\", \"region\",\n \"relative\", \"repeat\", \"repeating-linear-gradient\",\n \"repeating-radial-gradient\", \"repeat-x\", \"repeat-y\", \"reset\", \"reverse\",\n \"rgb\", \"rgba\", \"ridge\", \"right\", \"rotate\", \"rotate3d\", \"rotateX\", \"rotateY\",\n \"rotateZ\", \"round\", \"row\", \"row-resize\", \"row-reverse\", \"rtl\", \"run-in\", \"running\",\n \"s-resize\", \"sans-serif\", \"saturation\", \"scale\", \"scale3d\", \"scaleX\", \"scaleY\", \"scaleZ\", \"screen\",\n \"scroll\", \"scrollbar\", \"scroll-position\", \"se-resize\", \"searchfield\",\n \"searchfield-cancel-button\", \"searchfield-decoration\",\n \"searchfield-results-button\", \"searchfield-results-decoration\", \"self-start\", \"self-end\",\n \"semi-condensed\", \"semi-expanded\", \"separate\", \"serif\", \"show\", \"sidama\",\n \"simp-chinese-formal\", \"simp-chinese-informal\", \"single\",\n \"skew\", \"skewX\", \"skewY\", \"skip-white-space\", \"slide\", \"slider-horizontal\",\n \"slider-vertical\", \"sliderthumb-horizontal\", \"sliderthumb-vertical\", \"slow\",\n \"small\", \"small-caps\", \"small-caption\", \"smaller\", \"soft-light\", \"solid\", \"somali\",\n \"source-atop\", \"source-in\", \"source-out\", \"source-over\", \"space\", \"space-around\", \"space-between\", \"space-evenly\", \"spell-out\", \"square\",\n \"square-button\", \"start\", \"static\", \"status-bar\", \"stretch\", \"stroke\", \"stroke-box\", \"sub\",\n \"subpixel-antialiased\", \"svg_masks\", \"super\", \"sw-resize\", \"symbolic\", \"symbols\", \"system-ui\", \"table\",\n \"table-caption\", \"table-cell\", \"table-column\", \"table-column-group\",\n \"table-footer-group\", \"table-header-group\", \"table-row\", \"table-row-group\",\n \"tamil\",\n \"telugu\", \"text\", \"text-bottom\", \"text-top\", \"textarea\", \"textfield\", \"thai\",\n \"thick\", \"thin\", \"threeddarkshadow\", \"threedface\", \"threedhighlight\",\n \"threedlightshadow\", \"threedshadow\", \"tibetan\", \"tigre\", \"tigrinya-er\",\n \"tigrinya-er-abegede\", \"tigrinya-et\", \"tigrinya-et-abegede\", \"to\", \"top\",\n \"trad-chinese-formal\", \"trad-chinese-informal\", \"transform\",\n \"translate\", \"translate3d\", \"translateX\", \"translateY\", \"translateZ\",\n \"transparent\", \"ultra-condensed\", \"ultra-expanded\", \"underline\", \"unidirectional-pan\", \"unset\", \"up\",\n \"upper-alpha\", \"upper-armenian\", \"upper-greek\", \"upper-hexadecimal\",\n \"upper-latin\", \"upper-norwegian\", \"upper-roman\", \"uppercase\", \"urdu\", \"url\",\n \"var\", \"vertical\", \"vertical-text\", \"view-box\", \"visible\", \"visibleFill\", \"visiblePainted\",\n \"visibleStroke\", \"visual\", \"w-resize\", \"wait\", \"wave\", \"wider\",\n \"window\", \"windowframe\", \"windowtext\", \"words\", \"wrap\", \"wrap-reverse\", \"x-large\", \"x-small\", \"xor\",\n \"xx-large\", \"xx-small\"\n ], valueKeywords = keySet(valueKeywords_);\n\n var allWords = documentTypes_.concat(mediaTypes_).concat(mediaFeatures_).concat(mediaValueKeywords_)\n .concat(propertyKeywords_).concat(nonStandardPropertyKeywords_).concat(colorKeywords_)\n .concat(valueKeywords_);\n CodeMirror.registerHelper(\"hintWords\", \"css\", allWords);\n\n function tokenCComment(stream, state) {\n var maybeEnd = false, ch;\n while ((ch = stream.next()) != null) {\n if (maybeEnd && ch == \"/\") {\n state.tokenize = null;\n break;\n }\n maybeEnd = (ch == \"*\");\n }\n return [\"comment\", \"comment\"];\n }\n\n CodeMirror.defineMIME(\"text/css\", {\n documentTypes: documentTypes,\n mediaTypes: mediaTypes,\n mediaFeatures: mediaFeatures,\n mediaValueKeywords: mediaValueKeywords,\n propertyKeywords: propertyKeywords,\n nonStandardPropertyKeywords: nonStandardPropertyKeywords,\n fontProperties: fontProperties,\n counterDescriptors: counterDescriptors,\n colorKeywords: colorKeywords,\n valueKeywords: valueKeywords,\n tokenHooks: {\n \"/\": function(stream, state) {\n if (!stream.eat(\"*\")) return false;\n state.tokenize = tokenCComment;\n return tokenCComment(stream, state);\n }\n },\n name: \"css\"\n });\n\n CodeMirror.defineMIME(\"text/x-scss\", {\n mediaTypes: mediaTypes,\n mediaFeatures: mediaFeatures,\n mediaValueKeywords: mediaValueKeywords,\n propertyKeywords: propertyKeywords,\n nonStandardPropertyKeywords: nonStandardPropertyKeywords,\n colorKeywords: colorKeywords,\n valueKeywords: valueKeywords,\n fontProperties: fontProperties,\n allowNested: true,\n lineComment: \"//\",\n tokenHooks: {\n \"/\": function(stream, state) {\n if (stream.eat(\"/\")) {\n stream.skipToEnd();\n return [\"comment\", \"comment\"];\n } else if (stream.eat(\"*\")) {\n state.tokenize = tokenCComment;\n return tokenCComment(stream, state);\n } else {\n return [\"operator\", \"operator\"];\n }\n },\n \":\": function(stream) {\n if (stream.match(/\\s*\\{/, false))\n return [null, null]\n return false;\n },\n \"$\": function(stream) {\n stream.match(/^[\\w-]+/);\n if (stream.match(/^\\s*:/, false))\n return [\"variable-2\", \"variable-definition\"];\n return [\"variable-2\", \"variable\"];\n },\n \"#\": function(stream) {\n if (!stream.eat(\"{\")) return false;\n return [null, \"interpolation\"];\n }\n },\n name: \"css\",\n helperType: \"scss\"\n });\n\n CodeMirror.defineMIME(\"text/x-less\", {\n mediaTypes: mediaTypes,\n mediaFeatures: mediaFeatures,\n mediaValueKeywords: mediaValueKeywords,\n propertyKeywords: propertyKeywords,\n nonStandardPropertyKeywords: nonStandardPropertyKeywords,\n colorKeywords: colorKeywords,\n valueKeywords: valueKeywords,\n fontProperties: fontProperties,\n allowNested: true,\n lineComment: \"//\",\n tokenHooks: {\n \"/\": function(stream, state) {\n if (stream.eat(\"/\")) {\n stream.skipToEnd();\n return [\"comment\", \"comment\"];\n } else if (stream.eat(\"*\")) {\n state.tokenize = tokenCComment;\n return tokenCComment(stream, state);\n } else {\n return [\"operator\", \"operator\"];\n }\n },\n \"@\": function(stream) {\n if (stream.eat(\"{\")) return [null, \"interpolation\"];\n if (stream.match(/^(charset|document|font-face|import|(-(moz|ms|o|webkit)-)?keyframes|media|namespace|page|supports)\\b/i, false)) return false;\n stream.eatWhile(/[\\w\\\\\\-]/);\n if (stream.match(/^\\s*:/, false))\n return [\"variable-2\", \"variable-definition\"];\n return [\"variable-2\", \"variable\"];\n },\n \"&\": function() {\n return [\"atom\", \"atom\"];\n }\n },\n name: \"css\",\n helperType: \"less\"\n });\n\n CodeMirror.defineMIME(\"text/x-gss\", {\n documentTypes: documentTypes,\n mediaTypes: mediaTypes,\n mediaFeatures: mediaFeatures,\n propertyKeywords: propertyKeywords,\n nonStandardPropertyKeywords: nonStandardPropertyKeywords,\n fontProperties: fontProperties,\n counterDescriptors: counterDescriptors,\n colorKeywords: colorKeywords,\n valueKeywords: valueKeywords,\n supportsAtComponent: true,\n tokenHooks: {\n \"/\": function(stream, state) {\n if (!stream.eat(\"*\")) return false;\n state.tokenize = tokenCComment;\n return tokenCComment(stream, state);\n }\n },\n name: \"css\",\n helperType: \"gss\"\n });\n\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vbm9kZV9tb2R1bGVzL2NvZGVtaXJyb3IvbW9kZS9jc3MvY3NzLmpzPzdiMDAiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7QUFFQTtBQUNBLE1BQU0sSUFBdUQ7QUFDN0QsUUFBUSxtQkFBTyxDQUFDLHlFQUFzQjtBQUN0QyxPQUFPLEVBR2E7QUFDcEIsQ0FBQztBQUNEOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esc0RBQXNEO0FBQ3RELGdEQUFnRDtBQUNoRCxzREFBc0Q7QUFDdEQsZ0VBQWdFO0FBQ2hFLDREQUE0RDtBQUM1RCxrRkFBa0Y7QUFDbEYsd0RBQXdEO0FBQ3hELGdFQUFnRTtBQUNoRSxzREFBc0Q7QUFDdEQsc0RBQXNEO0FBQ3REO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMkJBQTJCLFdBQVcsY0FBYzs7QUFFcEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLLGdCQUFnQjtBQUNyQjtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FB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Qzs7QUFFRDtBQUNBO0FBQ0EsbUJBQW1CLGtCQUFrQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7O0FBRUgsQ0FBQyIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9jb2RlbWlycm9yL21vZGUvY3NzL2Nzcy5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvZGVNaXJyb3IsIGNvcHlyaWdodCAoYykgYnkgTWFyaWpuIEhhdmVyYmVrZSBhbmQgb3RoZXJzXG4vLyBEaXN0cmlidXRlZCB1bmRlciBhbiBNSVQgbGljZW5zZTogaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFXG5cbihmdW5jdGlvbihtb2QpIHtcbiAgaWYgKHR5cGVvZiBleHBvcnRzID09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG1vZHVsZSA9PSBcIm9iamVjdFwiKSAvLyBDb21tb25KU1xuICAgIG1vZChyZXF1aXJlKFwiLi4vLi4vbGliL2NvZGVtaXJyb3JcIikpO1xuICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSAvLyBBTURcbiAgICBkZWZpbmUoW1wiLi4vLi4vbGliL2NvZGVtaXJyb3JcIl0sIG1vZCk7XG4gIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnZcbiAgICBtb2QoQ29kZU1pcnJvcik7XG59KShmdW5jdGlvbihDb2RlTWlycm9yKSB7XG5cInVzZSBzdHJpY3RcIjtcblxuQ29kZU1pcnJvci5kZWZpbmVNb2RlKFwiY3NzXCIsIGZ1bmN0aW9uKGNvbmZpZywgcGFyc2VyQ29uZmlnKSB7XG4gIHZhciBpbmxpbmUgPSBwYXJzZXJDb25maWcuaW5saW5lXG4gIGlmICghcGFyc2VyQ29uZmlnLnByb3BlcnR5S2V5d29yZHMpIHBhcnNlckNvbmZpZyA9IENvZGVNaXJyb3IucmVzb2x2ZU1vZGUoXCJ0ZXh0L2Nzc1wiKTtcblxuICB2YXIgaW5kZW50VW5pdCA9IGNvbmZpZy5pbmRlbnRVbml0LFxuICAgICAgdG9rZW5Ib29rcyA9IHBhcnNlckNvbmZpZy50b2tlbkhvb2tzLFxuICAgICAgZG9jdW1lbnRUeXBlcyA9IHBhcnNlckNvbmZpZy5kb2N1bWVudFR5cGVzIHx8IHt9LFxuICAgICAgbWVkaWFUeXBlcyA9IHBhcnNlckNvbmZpZy5tZWRpYVR5cGVzIHx8IHt9LFxuICAgICAgbWVkaWFGZWF0dXJlcyA9IHBhcnNlckNvbmZpZy5tZWRpYUZlYXR1cmVzIHx8IHt9LFxuICAgICAgbWVkaWFWYWx1ZUtleXdvcmRzID0gcGFyc2VyQ29uZmlnLm1lZGlhVmFsdWVLZXl3b3JkcyB8fCB7fSxcbiAgICAgIHByb3BlcnR5S2V5d29yZHMgPSBwYXJzZXJDb25maWcucHJvcGVydHlLZXl3b3JkcyB8fCB7fSxcbiAgICAgIG5vblN0YW5kYXJkUHJvcGVydHlLZXl3b3JkcyA9IHBhcnNlckNvbmZpZy5ub25TdGFuZGFyZFByb3BlcnR5S2V5d29yZHMgfHwge30sXG4gICAgICBmb250UHJvcGVydGllcyA9IHBhcnNlckNvbmZpZy5mb250UHJvcGVydGllcyB8fCB7fSxcbiAgICAgIGNvdW50ZXJEZXNjcmlwdG9ycyA9IHBhcnNlckNvbmZpZy5jb3VudGVyRGVzY3JpcHRvcnMgfHwge30sXG4gICAgICBjb2xvcktleXdvcmRzID0gcGFyc2VyQ29uZmlnLmNvbG9yS2V5d29yZHMgfHwge30sXG4gICAgICB2YWx1ZUtleXdvcmRzID0gcGFyc2VyQ29uZmlnLnZhbHVlS2V5d29yZHMgfHwge30sXG4gICAgICBhbGxvd05lc3RlZCA9IHBhcnNlckNvbmZpZy5hbGxvd05lc3RlZCxcbiAgICAgIGxpbmVDb21tZW50ID0gcGFyc2VyQ29uZmlnLmxpbmVDb21tZW50LFxuICAgICAgc3VwcG9ydHNBdENvbXBvbmVudCA9IHBhcnNlckNvbmZpZy5zdXBwb3J0c0F0Q29tcG9uZW50ID09PSB0cnVlLFxuICAgICAgaGlnaGxpZ2h0Tm9uU3RhbmRhcmRQcm9wZXJ0eUtleXdvcmRzID0gY29uZmlnLmhpZ2hsaWdodE5vblN0YW5kYXJkUHJvcGVydHlLZXl3b3JkcyAhPT0gZmFsc2U7XG5cbiAgdmFyIHR5cGUsIG92ZXJyaWRlO1xuICBmdW5jdGlvbiByZXQoc3R5bGUsIHRwKSB7IHR5cGUgPSB0cDsgcmV0dXJuIHN0eWxlOyB9XG5cbiAgLy8gVG9rZW5pemVyc1xuXG4gIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7XG4gICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTtcbiAgICBpZiAodG9rZW5Ib29rc1tjaF0pIHtcbiAgICAgIHZhciByZXN1bHQgPSB0b2tlbkhvb2tzW2NoXShzdHJlYW0sIHN0YXRlKTtcbiAgICAgIGlmIChyZXN1bHQgIT09IGZhbHNlKSByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBpZiAoY2ggPT0gXCJAXCIpIHtcbiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1xcd1xcXFxcXC1dLyk7XG4gICAgICByZXR1cm4gcmV0KFwiZGVmXCIsIHN0cmVhbS5jdXJyZW50KCkpO1xuICAgIH0gZWxzZSBpZiAoY2ggPT0gXCI9XCIgfHwgKGNoID09IFwiflwiIHx8IGNoID09IFwifFwiKSAmJiBzdHJlYW0uZWF0KFwiPVwiKSkge1xuICAgICAgcmV0dXJuIHJldChudWxsLCBcImNvbXBhcmVcIik7XG4gICAgfSBlbHNlIGlmIChjaCA9PSBcIlxcXCJcIiB8fCBjaCA9PSBcIidcIikge1xuICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblN0cmluZyhjaCk7XG4gICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7XG4gICAgfSBlbHNlIGlmIChjaCA9PSBcIiNcIikge1xuICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXFx3XFxcXFxcLV0vKTtcbiAgICAgIHJldHVybiByZXQoXCJhdG9tXCIsIFwiaGFzaFwiKTtcbiAgICB9IGVsc2UgaWYgKGNoID09IFwiIVwiKSB7XG4gICAgICBzdHJlYW0ubWF0Y2goL15cXHMqXFx3Ki8pO1xuICAgICAgcmV0dXJuIHJldChcImtleXdvcmRcIiwgXCJpbXBvcnRhbnRcIik7XG4gICAgfSBlbHNlIGlmICgvXFxkLy50ZXN0KGNoKSB8fCBjaCA9PSBcIi5cIiAmJiBzdHJlYW0uZWF0KC9cXGQvKSkge1xuICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXFx3LiVdLyk7XG4gICAgICByZXR1cm4gcmV0KFwibnVtYmVyXCIsIFwidW5pdFwiKTtcbiAgICB9IGVsc2UgaWYgKGNoID09PSBcIi1cIikge1xuICAgICAgaWYgKC9bXFxkLl0vLnRlc3Qoc3RyZWFtLnBlZWsoKSkpIHtcbiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXFx3LiVdLyk7XG4gICAgICAgIHJldHVybiByZXQoXCJudW1iZXJcIiwgXCJ1bml0XCIpO1xuICAgICAgfSBlbHNlIGlmIChzdHJlYW0ubWF0Y2goL14tW1xcd1xcXFxcXC1dKi8pKSB7XG4gICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1xcd1xcXFxcXC1dLyk7XG4gICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15cXHMqOi8sIGZhbHNlKSlcbiAgICAgICAgICByZXR1cm4gcmV0KFwidmFyaWFibGUtMlwiLCBcInZhcmlhYmxlLWRlZmluaXRpb25cIik7XG4gICAgICAgIHJldHVybiByZXQoXCJ2YXJpYWJsZS0yXCIsIFwidmFyaWFibGVcIik7XG4gICAgICB9IGVsc2UgaWYgKHN0cmVhbS5tYXRjaCgvXlxcdystLykpIHtcbiAgICAgICAgcmV0dXJuIHJldChcIm1ldGFcIiwgXCJtZXRhXCIpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoL1ssKz4qXFwvXS8udGVzdChjaCkpIHtcbiAgICAgIHJldHVybiByZXQobnVsbCwgXCJzZWxlY3Qtb3BcIik7XG4gICAgfSBlbHNlIGlmIChjaCA9PSBcIi5cIiAmJiBzdHJlYW0ubWF0Y2goL14tP1tfYS16XVtfYS16MC05LV0qL2kpKSB7XG4gICAgICByZXR1cm4gcmV0KFwicXVhbGlmaWVyXCIsIFwicXVhbGlmaWVyXCIpO1xuICAgIH0gZWxzZSBpZiAoL1s6O3t9XFxbXFxdXFwoXFwpXS8udGVzdChjaCkpIHtcbiAgICAgIHJldHVybiByZXQobnVsbCwgY2gpO1xuICAgIH0gZWxzZSBpZiAoc3RyZWFtLm1hdGNoKC9bXFx3LS5dKyg/PVxcKCkvKSkge1xuICAgICAgaWYgKC9eKHVybCgtcHJlZml4KT98ZG9tYWlufHJlZ2V4cCkkLy50ZXN0KHN0cmVhbS5jdXJyZW50KCkudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblBhcmVudGhlc2l6ZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmV0KFwidmFyaWFibGUgY2FsbGVlXCIsIFwidmFyaWFibGVcIik7XG4gICAgfSBlbHNlIGlmICgvW1xcd1xcXFxcXC1dLy50ZXN0KGNoKSkge1xuICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXFx3XFxcXFxcLV0vKTtcbiAgICAgIHJldHVybiByZXQoXCJwcm9wZXJ0eVwiLCBcIndvcmRcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiByZXQobnVsbCwgbnVsbCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdG9rZW5TdHJpbmcocXVvdGUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkge1xuICAgICAgdmFyIGVzY2FwZWQgPSBmYWxzZSwgY2g7XG4gICAgICB3aGlsZSAoKGNoID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkge1xuICAgICAgICBpZiAoY2ggPT0gcXVvdGUgJiYgIWVzY2FwZWQpIHtcbiAgICAgICAgICBpZiAocXVvdGUgPT0gXCIpXCIpIHN0cmVhbS5iYWNrVXAoMSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIGNoID09IFwiXFxcXFwiO1xuICAgICAgfVxuICAgICAgaWYgKGNoID09IHF1b3RlIHx8ICFlc2NhcGVkICYmIHF1b3RlICE9IFwiKVwiKSBzdGF0ZS50b2tlbml6ZSA9IG51bGw7XG4gICAgICByZXR1cm4gcmV0KFwic3RyaW5nXCIsIFwic3RyaW5nXCIpO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiB0b2tlblBhcmVudGhlc2l6ZWQoc3RyZWFtLCBzdGF0ZSkge1xuICAgIHN0cmVhbS5uZXh0KCk7IC8vIE11c3QgYmUgJygnXG4gICAgaWYgKCFzdHJlYW0ubWF0Y2goL1xccypbXFxcIlxcJyldLywgZmFsc2UpKVxuICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblN0cmluZyhcIilcIik7XG4gICAgZWxzZVxuICAgICAgc3RhdGUudG9rZW5pemUgPSBudWxsO1xuICAgIHJldHVybiByZXQobnVsbCwgXCIoXCIpO1xuICB9XG5cbiAgLy8gQ29udGV4dCBtYW5hZ2VtZW50XG5cbiAgZnVuY3Rpb24gQ29udGV4dCh0eXBlLCBpbmRlbnQsIHByZXYpIHtcbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgIHRoaXMuaW5kZW50ID0gaW5kZW50O1xuICAgIHRoaXMucHJldiA9IHByZXY7XG4gIH1cblxuICBmdW5jdGlvbiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCB0eXBlLCBpbmRlbnQpIHtcbiAgICBzdGF0ZS5jb250ZXh0ID0gbmV3IENvbnRleHQodHlwZSwgc3RyZWFtLmluZGVudGF0aW9uKCkgKyAoaW5kZW50ID09PSBmYWxzZSA/IDAgOiBpbmRlbnRVbml0KSwgc3RhdGUuY29udGV4dCk7XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cblxuICBmdW5jdGlvbiBwb3BDb250ZXh0KHN0YXRlKSB7XG4gICAgaWYgKHN0YXRlLmNvbnRleHQucHJldilcbiAgICAgIHN0YXRlLmNvbnRleHQgPSBzdGF0ZS5jb250ZXh0LnByZXY7XG4gICAgcmV0dXJuIHN0YXRlLmNvbnRleHQudHlwZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBhc3ModHlwZSwgc3RyZWFtLCBzdGF0ZSkge1xuICAgIHJldHVybiBzdGF0ZXNbc3RhdGUuY29udGV4dC50eXBlXSh0eXBlLCBzdHJlYW0sIHN0YXRlKTtcbiAgfVxuICBmdW5jdGlvbiBwb3BBbmRQYXNzKHR5cGUsIHN0cmVhbSwgc3RhdGUsIG4pIHtcbiAgICBmb3IgKHZhciBpID0gbiB8fCAxOyBpID4gMDsgaS0tKVxuICAgICAgc3RhdGUuY29udGV4dCA9IHN0YXRlLmNvbnRleHQucHJldjtcbiAgICByZXR1cm4gcGFzcyh0eXBlLCBzdHJlYW0sIHN0YXRlKTtcbiAgfVxuXG4gIC8vIFBhcnNlclxuXG4gIGZ1bmN0aW9uIHdvcmRBc1ZhbHVlKHN0cmVhbSkge1xuICAgIHZhciB3b3JkID0gc3RyZWFtLmN1cnJlbnQoKS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICh2YWx1ZUtleXdvcmRzLmhhc093blByb3BlcnR5KHdvcmQpKVxuICAgICAgb3ZlcnJpZGUgPSBcImF0b21cIjtcbiAgICBlbHNlIGlmIChjb2xvcktleXdvcmRzLmhhc093blByb3BlcnR5KHdvcmQpKVxuICAgICAgb3ZlcnJpZGUgPSBcImtleXdvcmRcIjtcbiAgICBlbHNlXG4gICAgICBvdmVycmlkZSA9IFwidmFyaWFibGVcIjtcbiAgfVxuXG4gIHZhciBzdGF0ZXMgPSB7fTtcblxuICBzdGF0ZXMudG9wID0gZnVuY3Rpb24odHlwZSwgc3RyZWFtLCBzdGF0ZSkge1xuICAgIGlmICh0eXBlID09IFwie1wiKSB7XG4gICAgICByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgXCJibG9ja1wiKTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCJ9XCIgJiYgc3RhdGUuY29udGV4dC5wcmV2KSB7XG4gICAgICByZXR1cm4gcG9wQ29udGV4dChzdGF0ZSk7XG4gICAgfSBlbHNlIGlmIChzdXBwb3J0c0F0Q29tcG9uZW50ICYmIC9AY29tcG9uZW50L2kudGVzdCh0eXBlKSkge1xuICAgICAgcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0sIFwiYXRDb21wb25lbnRCbG9ja1wiKTtcbiAgICB9IGVsc2UgaWYgKC9eQCgtbW96LSk/ZG9jdW1lbnQkL2kudGVzdCh0eXBlKSkge1xuICAgICAgcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0sIFwiZG9jdW1lbnRUeXBlc1wiKTtcbiAgICB9IGVsc2UgaWYgKC9eQChtZWRpYXxzdXBwb3J0c3woLW1vei0pP2RvY3VtZW50fGltcG9ydCkkL2kudGVzdCh0eXBlKSkge1xuICAgICAgcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0sIFwiYXRCbG9ja1wiKTtcbiAgICB9IGVsc2UgaWYgKC9eQChmb250LWZhY2V8Y291bnRlci1zdHlsZSkvaS50ZXN0KHR5cGUpKSB7XG4gICAgICBzdGF0ZS5zdGF0ZUFyZyA9IHR5cGU7XG4gICAgICByZXR1cm4gXCJyZXN0cmljdGVkX2F0QmxvY2tfYmVmb3JlXCI7XG4gICAgfSBlbHNlIGlmICgvXkAoLShtb3p8bXN8b3x3ZWJraXQpLSk/a2V5ZnJhbWVzJC9pLnRlc3QodHlwZSkpIHtcbiAgICAgIHJldHVybiBcImtleWZyYW1lc1wiO1xuICAgIH0gZWxzZSBpZiAodHlwZSAmJiB0eXBlLmNoYXJBdCgwKSA9PSBcIkBcIikge1xuICAgICAgcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0sIFwiYXRcIik7XG4gICAgfSBlbHNlIGlmICh0eXBlID09IFwiaGFzaFwiKSB7XG4gICAgICBvdmVycmlkZSA9IFwiYnVpbHRpblwiO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcIndvcmRcIikge1xuICAgICAgb3ZlcnJpZGUgPSBcInRhZ1wiO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcInZhcmlhYmxlLWRlZmluaXRpb25cIikge1xuICAgICAgcmV0dXJuIFwibWF5YmVwcm9wXCI7XG4gICAgfSBlbHNlIGlmICh0eXBlID09IFwiaW50ZXJwb2xhdGlvblwiKSB7XG4gICAgICByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgXCJpbnRlcnBvbGF0aW9uXCIpO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcIjpcIikge1xuICAgICAgcmV0dXJuIFwicHNldWRvXCI7XG4gICAgfSBlbHNlIGlmIChhbGxvd05lc3RlZCAmJiB0eXBlID09IFwiKFwiKSB7XG4gICAgICByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgXCJwYXJlbnNcIik7XG4gICAgfVxuICAgIHJldHVybiBzdGF0ZS5jb250ZXh0LnR5cGU7XG4gIH07XG5cbiAgc3RhdGVzLmJsb2NrID0gZnVuY3Rpb24odHlwZSwgc3RyZWFtLCBzdGF0ZSkge1xuICAgIGlmICh0eXBlID09IFwid29yZFwiKSB7XG4gICAgICB2YXIgd29yZCA9IHN0cmVhbS5jdXJyZW50KCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChwcm9wZXJ0eUtleXdvcmRzLmhhc093blByb3BlcnR5KHdvcmQpKSB7XG4gICAgICAgIG92ZXJyaWRlID0gXCJwcm9wZXJ0eVwiO1xuICAgICAgICByZXR1cm4gXCJtYXliZXByb3BcIjtcbiAgICAgIH0gZWxzZSBpZiAobm9uU3RhbmRhcmRQcm9wZXJ0eUtleXdvcmRzLmhhc093blByb3BlcnR5KHdvcmQpKSB7XG4gICAgICAgIG92ZXJyaWRlID0gaGlnaGxpZ2h0Tm9uU3RhbmRhcmRQcm9wZXJ0eUtleXdvcmRzID8gXCJzdHJpbmctMlwiIDogXCJwcm9wZXJ0eVwiO1xuICAgICAgICByZXR1cm4gXCJtYXliZXByb3BcIjtcbiAgICAgIH0gZWxzZSBpZiAoYWxsb3dOZXN0ZWQpIHtcbiAgICAgICAgb3ZlcnJpZGUgPSBzdHJlYW0ubWF0Y2goL15cXHMqOig/Olxcc3wkKS8sIGZhbHNlKSA/IFwicHJvcGVydHlcIiA6IFwidGFnXCI7XG4gICAgICAgIHJldHVybiBcImJsb2NrXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdmVycmlkZSArPSBcIiBlcnJvclwiO1xuICAgICAgICByZXR1cm4gXCJtYXliZXByb3BcIjtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCJtZXRhXCIpIHtcbiAgICAgIHJldHVybiBcImJsb2NrXCI7XG4gICAgfSBlbHNlIGlmICghYWxsb3dOZXN0ZWQgJiYgKHR5cGUgPT0gXCJoYXNoXCIgfHwgdHlwZSA9PSBcInF1YWxpZmllclwiKSkge1xuICAgICAgb3ZlcnJpZGUgPSBcImVycm9yXCI7XG4gICAgICByZXR1cm4gXCJibG9ja1wiO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gc3RhdGVzLnRvcCh0eXBlLCBzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG4gIH07XG5cbiAgc3RhdGVzLm1heWJlcHJvcCA9IGZ1bmN0aW9uKHR5cGUsIHN0cmVhbSwgc3RhdGUpIHtcbiAgICBpZiAodHlwZSA9PSBcIjpcIikgcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0sIFwicHJvcFwiKTtcbiAgICByZXR1cm4gcGFzcyh0eXBlLCBzdHJlYW0sIHN0YXRlKTtcbiAgfTtcblxuICBzdGF0ZXMucHJvcCA9IGZ1bmN0aW9uKHR5cGUsIHN0cmVhbSwgc3RhdGUpIHtcbiAgICBpZiAodHlwZSA9PSBcIjtcIikgcmV0dXJuIHBvcENvbnRleHQoc3RhdGUpO1xuICAgIGlmICh0eXBlID09IFwie1wiICYmIGFsbG93TmVzdGVkKSByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgXCJwcm9wQmxvY2tcIik7XG4gICAgaWYgKHR5cGUgPT0gXCJ9XCIgfHwgdHlwZSA9PSBcIntcIikgcmV0dXJuIHBvcEFuZFBhc3ModHlwZSwgc3RyZWFtLCBzdGF0ZSk7XG4gICAgaWYgKHR5cGUgPT0gXCIoXCIpIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCBcInBhcmVuc1wiKTtcblxuICAgIGlmICh0eXBlID09IFwiaGFzaFwiICYmICEvXiMoWzAtOWEtZkEtZl17Myw0fXxbMC05YS1mQS1mXXs2fXxbMC05YS1mQS1mXXs4fSkkLy50ZXN0KHN0cmVhbS5jdXJyZW50KCkpKSB7XG4gICAgICBvdmVycmlkZSArPSBcIiBlcnJvclwiO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcIndvcmRcIikge1xuICAgICAgd29yZEFzVmFsdWUoc3RyZWFtKTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCJpbnRlcnBvbGF0aW9uXCIpIHtcbiAgICAgIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCBcImludGVycG9sYXRpb25cIik7XG4gICAgfVxuICAgIHJldHVybiBcInByb3BcIjtcbiAgfTtcblxuICBzdGF0ZXMucHJvcEJsb2NrID0gZnVuY3Rpb24odHlwZSwgX3N0cmVhbSwgc3RhdGUpIHtcbiAgICBpZiAodHlwZSA9PSBcIn1cIikgcmV0dXJuIHBvcENvbnRleHQoc3RhdGUpO1xuICAgIGlmICh0eXBlID09IFwid29yZFwiKSB7IG92ZXJyaWRlID0gXCJwcm9wZXJ0eVwiOyByZXR1cm4gXCJtYXliZXByb3BcIjsgfVxuICAgIHJldHVybiBzdGF0ZS5jb250ZXh0LnR5cGU7XG4gIH07XG5cbiAgc3RhdGVzLnBhcmVucyA9IGZ1bmN0aW9uKHR5cGUsIHN0cmVhbSwgc3RhdGUpIHtcbiAgICBpZiAodHlwZSA9PSBcIntcIiB8fCB0eXBlID09IFwifVwiKSByZXR1cm4gcG9wQW5kUGFzcyh0eXBlLCBzdHJlYW0sIHN0YXRlKTtcbiAgICBpZiAodHlwZSA9PSBcIilcIikgcmV0dXJuIHBvcENvbnRleHQoc3RhdGUpO1xuICAgIGlmICh0eXBlID09IFwiKFwiKSByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgXCJwYXJlbnNcIik7XG4gICAgaWYgKHR5cGUgPT0gXCJpbnRlcnBvbGF0aW9uXCIpIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCBcImludGVycG9sYXRpb25cIik7XG4gICAgaWYgKHR5cGUgPT0gXCJ3b3JkXCIpIHdvcmRBc1ZhbHVlKHN0cmVhbSk7XG4gICAgcmV0dXJuIFwicGFyZW5zXCI7XG4gIH07XG5cbiAgc3RhdGVzLnBzZXVkbyA9IGZ1bmN0aW9uKHR5cGUsIHN0cmVhbSwgc3RhdGUpIHtcbiAgICBpZiAodHlwZSA9PSBcIm1ldGFcIikgcmV0dXJuIFwicHNldWRvXCI7XG5cbiAgICBpZiAodHlwZSA9PSBcIndvcmRcIikge1xuICAgICAgb3ZlcnJpZGUgPSBcInZhcmlhYmxlLTNcIjtcbiAgICAgIHJldHVybiBzdGF0ZS5jb250ZXh0LnR5cGU7XG4gICAgfVxuICAgIHJldHVybiBwYXNzKHR5cGUsIHN0cmVhbSwgc3RhdGUpO1xuICB9O1xuXG4gIHN0YXRlcy5kb2N1bWVudFR5cGVzID0gZnVuY3Rpb24odHlwZSwgc3RyZWFtLCBzdGF0ZSkge1xuICAgIGlmICh0eXBlID09IFwid29yZFwiICYmIGRvY3VtZW50VHlwZXMuaGFzT3duUHJvcGVydHkoc3RyZWFtLmN1cnJlbnQoKSkpIHtcbiAgICAgIG92ZXJyaWRlID0gXCJ0YWdcIjtcbiAgICAgIHJldHVybiBzdGF0ZS5jb250ZXh0LnR5cGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBzdGF0ZXMuYXRCbG9jayh0eXBlLCBzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG4gIH07XG5cbiAgc3RhdGVzLmF0QmxvY2sgPSBmdW5jdGlvbih0eXBlLCBzdHJlYW0sIHN0YXRlKSB7XG4gICAgaWYgKHR5cGUgPT0gXCIoXCIpIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCBcImF0QmxvY2tfcGFyZW5zXCIpO1xuICAgIGlmICh0eXBlID09IFwifVwiIHx8IHR5cGUgPT0gXCI7XCIpIHJldHVybiBwb3BBbmRQYXNzKHR5cGUsIHN0cmVhbSwgc3RhdGUpO1xuICAgIGlmICh0eXBlID09IFwie1wiKSByZXR1cm4gcG9wQ29udGV4dChzdGF0ZSkgJiYgcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgYWxsb3dOZXN0ZWQgPyBcImJsb2NrXCIgOiBcInRvcFwiKTtcblxuICAgIGlmICh0eXBlID09IFwiaW50ZXJwb2xhdGlvblwiKSByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgXCJpbnRlcnBvbGF0aW9uXCIpO1xuXG4gICAgaWYgKHR5cGUgPT0gXCJ3b3JkXCIpIHtcbiAgICAgIHZhciB3b3JkID0gc3RyZWFtLmN1cnJlbnQoKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKHdvcmQgPT0gXCJvbmx5XCIgfHwgd29yZCA9PSBcIm5vdFwiIHx8IHdvcmQgPT0gXCJhbmRcIiB8fCB3b3JkID09IFwib3JcIilcbiAgICAgICAgb3ZlcnJpZGUgPSBcImtleXdvcmRcIjtcbiAgICAgIGVsc2UgaWYgKG1lZGlhVHlwZXMuaGFzT3duUHJvcGVydHkod29yZCkpXG4gICAgICAgIG92ZXJyaWRlID0gXCJhdHRyaWJ1dGVcIjtcbiAgICAgIGVsc2UgaWYgKG1lZGlhRmVhdHVyZXMuaGFzT3duUHJvcGVydHkod29yZCkpXG4gICAgICAgIG92ZXJyaWRlID0gXCJwcm9wZXJ0eVwiO1xuICAgICAgZWxzZSBpZiAobWVkaWFWYWx1ZUtleXdvcmRzLmhhc093blByb3BlcnR5KHdvcmQpKVxuICAgICAgICBvdmVycmlkZSA9IFwia2V5d29yZFwiO1xuICAgICAgZWxzZSBpZiAocHJvcGVydHlLZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh3b3JkKSlcbiAgICAgICAgb3ZlcnJpZGUgPSBcInByb3BlcnR5XCI7XG4gICAgICBlbHNlIGlmIChub25TdGFuZGFyZFByb3BlcnR5S2V5d29yZHMuaGFzT3duUHJvcGVydHkod29yZCkpXG4gICAgICAgIG92ZXJyaWRlID0gaGlnaGxpZ2h0Tm9uU3RhbmRhcmRQcm9wZXJ0eUtleXdvcmRzID8gXCJzdHJpbmctMlwiIDogXCJwcm9wZXJ0eVwiO1xuICAgICAgZWxzZSBpZiAodmFsdWVLZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh3b3JkKSlcbiAgICAgICAgb3ZlcnJpZGUgPSBcImF0b21cIjtcbiAgICAgIGVsc2UgaWYgKGNvbG9yS2V5d29yZHMuaGFzT3duUHJvcGVydHkod29yZCkpXG4gICAgICAgIG92ZXJyaWRlID0gXCJrZXl3b3JkXCI7XG4gICAgICBlbHNlXG4gICAgICAgIG92ZXJyaWRlID0gXCJlcnJvclwiO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdGUuY29udGV4dC50eXBlO1xuICB9O1xuXG4gIHN0YXRlcy5hdENvbXBvbmVudEJsb2NrID0gZnVuY3Rpb24odHlwZSwgc3RyZWFtLCBzdGF0ZSkge1xuICAgIGlmICh0eXBlID09IFwifVwiKVxuICAgICAgcmV0dXJuIHBvcEFuZFBhc3ModHlwZSwgc3RyZWFtLCBzdGF0ZSk7XG4gICAgaWYgKHR5cGUgPT0gXCJ7XCIpXG4gICAgICByZXR1cm4gcG9wQ29udGV4dChzdGF0ZSkgJiYgcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgYWxsb3dOZXN0ZWQgPyBcImJsb2NrXCIgOiBcInRvcFwiLCBmYWxzZSk7XG4gICAgaWYgKHR5cGUgPT0gXCJ3b3JkXCIpXG4gICAgICBvdmVycmlkZSA9IFwiZXJyb3JcIjtcbiAgICByZXR1cm4gc3RhdGUuY29udGV4dC50eXBlO1xuICB9O1xuXG4gIHN0YXRlcy5hdEJsb2NrX3BhcmVucyA9IGZ1bmN0aW9uKHR5cGUsIHN0cmVhbSwgc3RhdGUpIHtcbiAgICBpZiAodHlwZSA9PSBcIilcIikgcmV0dXJuIHBvcENvbnRleHQoc3RhdGUpO1xuICAgIGlmICh0eXBlID09IFwie1wiIHx8IHR5cGUgPT0gXCJ9XCIpIHJldHVybiBwb3BBbmRQYXNzKHR5cGUsIHN0cmVhbSwgc3RhdGUsIDIpO1xuICAgIHJldHVybiBzdGF0ZXMuYXRCbG9jayh0eXBlLCBzdHJlYW0sIHN0YXRlKTtcbiAgfTtcblxuICBzdGF0ZXMucmVzdHJpY3RlZF9hdEJsb2NrX2JlZm9yZSA9IGZ1bmN0aW9uKHR5cGUsIHN0cmVhbSwgc3RhdGUpIHtcbiAgICBpZiAodHlwZSA9PSBcIntcIilcbiAgICAgIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCBcInJlc3RyaWN0ZWRfYXRCbG9ja1wiKTtcbiAgICBpZiAodHlwZSA9PSBcIndvcmRcIiAmJiBzdGF0ZS5zdGF0ZUFyZyA9PSBcIkBjb3VudGVyLXN0eWxlXCIpIHtcbiAgICAgIG92ZXJyaWRlID0gXCJ2YXJpYWJsZVwiO1xuICAgICAgcmV0dXJuIFwicmVzdHJpY3RlZF9hdEJsb2NrX2JlZm9yZVwiO1xuICAgIH1cbiAgICByZXR1cm4gcGFzcyh0eXBlLCBzdHJlYW0sIHN0YXRlKTtcbiAgfTtcblxuICBzdGF0ZXMucmVzdHJpY3RlZF9hdEJsb2NrID0gZnVuY3Rpb24odHlwZSwgc3RyZWFtLCBzdGF0ZSkge1xuICAgIGlmICh0eXBlID09IFwifVwiKSB7XG4gICAgICBzdGF0ZS5zdGF0ZUFyZyA9IG51bGw7XG4gICAgICByZXR1cm4gcG9wQ29udGV4dChzdGF0ZSk7XG4gICAgfVxuICAgIGlmICh0eXBlID09IFwid29yZFwiKSB7XG4gICAgICBpZiAoKHN0YXRlLnN0YXRlQXJnID09IFwiQGZvbnQtZmFjZVwiICYmICFmb250UHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShzdHJlYW0uY3VycmVudCgpLnRvTG93ZXJDYXNlKCkpKSB8fFxuICAgICAgICAgIChzdGF0ZS5zdGF0ZUFyZyA9PSBcIkBjb3VudGVyLXN0eWxlXCIgJiYgIWNvdW50ZXJEZXNjcmlwdG9ycy5oYXNPd25Qcm9wZXJ0eShzdHJlYW0uY3VycmVudCgpLnRvTG93ZXJDYXNlKCkpKSlcbiAgICAgICAgb3ZlcnJpZGUgPSBcImVycm9yXCI7XG4gICAgICBlbHNlXG4gICAgICAgIG92ZXJyaWRlID0gXCJwcm9wZXJ0eVwiO1xuICAgICAgcmV0dXJuIFwibWF5YmVwcm9wXCI7XG4gICAgfVxuICAgIHJldHVybiBcInJlc3RyaWN0ZWRfYXRCbG9ja1wiO1xuICB9O1xuXG4gIHN0YXRlcy5rZXlmcmFtZXMgPSBmdW5jdGlvbih0eXBlLCBzdHJlYW0sIHN0YXRlKSB7XG4gICAgaWYgKHR5cGUgPT0gXCJ3b3JkXCIpIHsgb3ZlcnJpZGUgPSBcInZhcmlhYmxlXCI7IHJldHVybiBcImtleWZyYW1lc1wiOyB9XG4gICAgaWYgKHR5cGUgPT0gXCJ7XCIpIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCBcInRvcFwiKTtcbiAgICByZXR1cm4gcGFzcyh0eXBlLCBzdHJlYW0sIHN0YXRlKTtcbiAgfTtcblxuICBzdGF0ZXMuYXQgPSBmdW5jdGlvbih0eXBlLCBzdHJlYW0sIHN0YXRlKSB7XG4gICAgaWYgKHR5cGUgPT0gXCI7XCIpIHJldHVybiBwb3BDb250ZXh0KHN0YXRlKTtcbiAgICBpZiAodHlwZSA9PSBcIntcIiB8fCB0eXBlID09IFwifVwiKSByZXR1cm4gcG9wQW5kUGFzcyh0eXBlLCBzdHJlYW0sIHN0YXRlKTtcbiAgICBpZiAodHlwZSA9PSBcIndvcmRcIikgb3ZlcnJpZGUgPSBcInRhZ1wiO1xuICAgIGVsc2UgaWYgKHR5cGUgPT0gXCJoYXNoXCIpIG92ZXJyaWRlID0gXCJidWlsdGluXCI7XG4gICAgcmV0dXJuIFwiYXRcIjtcbiAgfTtcblxuICBzdGF0ZXMuaW50ZXJwb2xhdGlvbiA9IGZ1bmN0aW9uKHR5cGUsIHN0cmVhbSwgc3RhdGUpIHtcbiAgICBpZiAodHlwZSA9PSBcIn1cIikgcmV0dXJuIHBvcENvbnRleHQoc3RhdGUpO1xuICAgIGlmICh0eXBlID09IFwie1wiIHx8IHR5cGUgPT0gXCI7XCIpIHJldHVybiBwb3BBbmRQYXNzKHR5cGUsIHN0cmVhbSwgc3RhdGUpO1xuICAgIGlmICh0eXBlID09IFwid29yZFwiKSBvdmVycmlkZSA9IFwidmFyaWFibGVcIjtcbiAgICBlbHNlIGlmICh0eXBlICE9IFwidmFyaWFibGVcIiAmJiB0eXBlICE9IFwiKFwiICYmIHR5cGUgIT0gXCIpXCIpIG92ZXJyaWRlID0gXCJlcnJvclwiO1xuICAgIHJldHVybiBcImludGVycG9sYXRpb25cIjtcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKGJhc2UpIHtcbiAgICAgIHJldHVybiB7dG9rZW5pemU6IG51bGwsXG4gICAgICAgICAgICAgIHN0YXRlOiBpbmxpbmUgPyBcImJsb2NrXCIgOiBcInRvcFwiLFxuICAgICAgICAgICAgICBzdGF0ZUFyZzogbnVsbCxcbiAgICAgICAgICAgICAgY29udGV4dDogbmV3IENvbnRleHQoaW5saW5lID8gXCJibG9ja1wiIDogXCJ0b3BcIiwgYmFzZSB8fCAwLCBudWxsKX07XG4gICAgfSxcblxuICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7XG4gICAgICBpZiAoIXN0YXRlLnRva2VuaXplICYmIHN0cmVhbS5lYXRTcGFjZSgpKSByZXR1cm4gbnVsbDtcbiAgICAgIHZhciBzdHlsZSA9IChzdGF0ZS50b2tlbml6ZSB8fCB0b2tlbkJhc2UpKHN0cmVhbSwgc3RhdGUpO1xuICAgICAgaWYgKHN0eWxlICYmIHR5cGVvZiBzdHlsZSA9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHR5cGUgPSBzdHlsZVsxXTtcbiAgICAgICAgc3R5bGUgPSBzdHlsZVswXTtcbiAgICAgIH1cbiAgICAgIG92ZXJyaWRlID0gc3R5bGU7XG4gICAgICBpZiAodHlwZSAhPSBcImNvbW1lbnRcIilcbiAgICAgICAgc3RhdGUuc3RhdGUgPSBzdGF0ZXNbc3RhdGUuc3RhdGVdKHR5cGUsIHN0cmVhbSwgc3RhdGUpO1xuICAgICAgcmV0dXJuIG92ZXJyaWRlO1xuICAgIH0sXG5cbiAgICBpbmRlbnQ6IGZ1bmN0aW9uKHN0YXRlLCB0ZXh0QWZ0ZXIpIHtcbiAgICAgIHZhciBjeCA9IHN0YXRlLmNvbnRleHQsIGNoID0gdGV4dEFmdGVyICYmIHRleHRBZnRlci5jaGFyQXQoMCk7XG4gICAgICB2YXIgaW5kZW50ID0gY3guaW5kZW50O1xuICAgICAgaWYgKGN4LnR5cGUgPT0gXCJwcm9wXCIgJiYgKGNoID09IFwifVwiIHx8IGNoID09IFwiKVwiKSkgY3ggPSBjeC5wcmV2O1xuICAgICAgaWYgKGN4LnByZXYpIHtcbiAgICAgICAgaWYgKGNoID09IFwifVwiICYmIChjeC50eXBlID09IFwiYmxvY2tcIiB8fCBjeC50eXBlID09IFwidG9wXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY3gudHlwZSA9PSBcImludGVycG9sYXRpb25cIiB8fCBjeC50eXBlID09IFwicmVzdHJpY3RlZF9hdEJsb2NrXCIpKSB7XG4gICAgICAgICAgLy8gUmVzdW1lIGluZGVudGF0aW9uIGZyb20gcGFyZW50IGNvbnRleHQuXG4gICAgICAgICAgY3ggPSBjeC5wcmV2O1xuICAgICAgICAgIGluZGVudCA9IGN4LmluZGVudDtcbiAgICAgICAgfSBlbHNlIGlmIChjaCA9PSBcIilcIiAmJiAoY3gudHlwZSA9PSBcInBhcmVuc1wiIHx8IGN4LnR5cGUgPT0gXCJhdEJsb2NrX3BhcmVuc1wiKSB8fFxuICAgICAgICAgICAgY2ggPT0gXCJ7XCIgJiYgKGN4LnR5cGUgPT0gXCJhdFwiIHx8IGN4LnR5cGUgPT0gXCJhdEJsb2NrXCIpKSB7XG4gICAgICAgICAgLy8gRGVkZW50IHJlbGF0aXZlIHRvIGN1cnJlbnQgY29udGV4dC5cbiAgICAgICAgICBpbmRlbnQgPSBNYXRoLm1heCgwLCBjeC5pbmRlbnQgLSBpbmRlbnRVbml0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGluZGVudDtcbiAgICB9LFxuXG4gICAgZWxlY3RyaWNDaGFyczogXCJ9XCIsXG4gICAgYmxvY2tDb21tZW50U3RhcnQ6IFwiLypcIixcbiAgICBibG9ja0NvbW1lbnRFbmQ6IFwiKi9cIixcbiAgICBibG9ja0NvbW1lbnRDb250aW51ZTogXCIgKiBcIixcbiAgICBsaW5lQ29tbWVudDogbGluZUNvbW1lbnQsXG4gICAgZm9sZDogXCJicmFjZVwiXG4gIH07XG59KTtcblxuICBmdW5jdGlvbiBrZXlTZXQoYXJyYXkpIHtcbiAgICB2YXIga2V5cyA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyArK2kpIHtcbiAgICAgIGtleXNbYXJyYXlbaV0udG9Mb3dlckNhc2UoKV0gPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4ga2V5cztcbiAgfVxuXG4gIHZhciBkb2N1bWVudFR5cGVzXyA9IFtcbiAgICBcImRvbWFpblwiLCBcInJlZ2V4cFwiLCBcInVybFwiLCBcInVybC1wcmVmaXhcIlxuICBdLCBkb2N1bWVudFR5cGVzID0ga2V5U2V0KGRvY3VtZW50VHlwZXNfKTtcblxuICB2YXIgbWVkaWFUeXBlc18gPSBbXG4gICAgXCJhbGxcIiwgXCJhdXJhbFwiLCBcImJyYWlsbGVcIiwgXCJoYW5kaGVsZFwiLCBcInByaW50XCIsIFwicHJvamVjdGlvblwiLCBcInNjcmVlblwiLFxuICAgIFwidHR5XCIsIFwidHZcIiwgXCJlbWJvc3NlZFwiXG4gIF0sIG1lZGlhVHlwZXMgPSBrZXlTZXQobWVkaWFUeXBlc18pO1xuXG4gIHZhciBtZWRpYUZlYXR1cmVzXyA9IFtcbiAgICBcIndpZHRoXCIsIFwibWluLXdpZHRoXCIsIFwibWF4LXdpZHRoXCIsIFwiaGVpZ2h0XCIsIFwibWluLWhlaWdodFwiLCBcIm1heC1oZWlnaHRcIixcbiAgICBcImRldmljZS13aWR0aFwiLCBcIm1pbi1kZXZpY2Utd2lkdGhcIiwgXCJtYXgtZGV2aWNlLXdpZHRoXCIsIFwiZGV2aWNlLWhlaWdodFwiLFxuICAgIFwibWluLWRldmljZS1oZWlnaHRcIiwgXCJtYXgtZGV2aWNlLWhlaWdodFwiLCBcImFzcGVjdC1yYXRpb1wiLFxuICAgIFwibWluLWFzcGVjdC1yYXRpb1wiLCBcIm1heC1hc3BlY3QtcmF0aW9cIiwgXCJkZXZpY2UtYXNwZWN0LXJhdGlvXCIsXG4gICAgXCJtaW4tZGV2aWNlLWFzcGVjdC1yYXRpb1wiLCBcIm1heC1kZXZpY2UtYXNwZWN0LXJhdGlvXCIsIFwiY29sb3JcIiwgXCJtaW4tY29sb3JcIixcbiAgICBcIm1heC1jb2xvclwiLCBcImNvbG9yLWluZGV4XCIsIFwibWluLWNvbG9yLWluZGV4XCIsIFwibWF4LWNvbG9yLWluZGV4XCIsXG4gICAgXCJtb25vY2hyb21lXCIsIFwibWluLW1vbm9jaHJvbWVcIiwgXCJtYXgtbW9ub2Nocm9tZVwiLCBcInJlc29sdXRpb25cIixcbiAgICBcIm1pbi1yZXNvbHV0aW9uXCIsIFwibWF4LXJlc29sdXRpb25cIiwgXCJzY2FuXCIsIFwiZ3JpZFwiLCBcIm9yaWVudGF0aW9uXCIsXG4gICAgXCJkZXZpY2UtcGl4ZWwtcmF0aW9cIiwgXCJtaW4tZGV2aWNlLXBpeGVsLXJhdGlvXCIsIFwibWF4LWRldmljZS1waXhlbC1yYXRpb1wiLFxuICAgIFwicG9pbnRlclwiLCBcImFueS1wb2ludGVyXCIsIFwiaG92ZXJcIiwgXCJhbnktaG92ZXJcIiwgXCJwcmVmZXJzLWNvbG9yLXNjaGVtZVwiXG4gIF0sIG1lZGlhRmVhdHVyZXMgPSBrZXlTZXQobWVkaWFGZWF0dXJlc18pO1xuXG4gIHZhciBtZWRpYVZhbHVlS2V5d29yZHNfID0gW1xuICAgIFwibGFuZHNjYXBlXCIsIFwicG9ydHJhaXRcIiwgXCJub25lXCIsIFwiY29hcnNlXCIsIFwiZmluZVwiLCBcIm9uLWRlbWFuZFwiLCBcImhvdmVyXCIsXG4gICAgXCJpbnRlcmxhY2VcIiwgXCJwcm9ncmVzc2l2ZVwiLFxuICAgIFwiZGFya1wiLCBcImxpZ2h0XCJcbiAgXSwgbWVkaWFWYWx1ZUtleXdvcmRzID0ga2V5U2V0KG1lZGlhVmFsdWVLZXl3b3Jkc18pO1xuXG4gIHZhciBwcm9wZXJ0eUtleXdvcmRzXyA9IFtcbiAgICBcImFsaWduLWNvbnRlbnRcIiwgXCJhbGlnbi1pdGVtc1wiLCBcImFsaWduLXNlbGZcIiwgXCJhbGlnbm1lbnQtYWRqdXN0XCIsXG4gICAgXCJhbGlnbm1lbnQtYmFzZWxpbmVcIiwgXCJhbGxcIiwgXCJhbmNob3ItcG9pbnRcIiwgXCJhbmltYXRpb25cIiwgXCJhbmltYXRpb24tZGVsYXlcIixcbiAgICBcImFuaW1hdGlvbi1kaXJlY3Rpb25cIiwgXCJhbmltYXRpb24tZHVyYXRpb25cIiwgXCJhbmltYXRpb24tZmlsbC1tb2RlXCIsXG4gICAgXCJhbmltYXRpb24taXRlcmF0aW9uLWNvdW50XCIsIFwiYW5pbWF0aW9uLW5hbWVcIiwgXCJhbmltYXRpb24tcGxheS1zdGF0ZVwiLFxuICAgIFwiYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvblwiLCBcImFwcGVhcmFuY2VcIiwgXCJhemltdXRoXCIsIFwiYmFja2Ryb3AtZmlsdGVyXCIsXG4gICAgXCJiYWNrZmFjZS12aXNpYmlsaXR5XCIsIFwiYmFja2dyb3VuZFwiLCBcImJhY2tncm91bmQtYXR0YWNobWVudFwiLFxuICAgIFwiYmFja2dyb3VuZC1ibGVuZC1tb2RlXCIsIFwiYmFja2dyb3VuZC1jbGlwXCIsIFwiYmFja2dyb3VuZC1jb2xvclwiLFxuICAgIFwiYmFja2dyb3VuZC1pbWFnZVwiLCBcImJhY2tncm91bmQtb3JpZ2luXCIsIFwiYmFja2dyb3VuZC1wb3NpdGlvblwiLFxuICAgIFwiYmFja2dyb3VuZC1wb3NpdGlvbi14XCIsIFwiYmFja2dyb3VuZC1wb3NpdGlvbi15XCIsIFwiYmFja2dyb3VuZC1yZXBlYXRcIixcbiAgICBcImJhY2tncm91bmQtc2l6ZVwiLCBcImJhc2VsaW5lLXNoaWZ0XCIsIFwiYmluZGluZ1wiLCBcImJsZWVkXCIsIFwiYmxvY2stc2l6ZVwiLFxuICAgIFwiYm9va21hcmstbGFiZWxcIiwgXCJib29rbWFyay1sZXZlbFwiLCBcImJvb2ttYXJrLXN0YXRlXCIsIFwiYm9va21hcmstdGFyZ2V0XCIsXG4gICAgXCJib3JkZXJcIiwgXCJib3JkZXItYm90dG9tXCIsIFwiYm9yZGVyLWJvdHRvbS1jb2xvclwiLCBcImJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXNcIixcbiAgICBcImJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzXCIsIFwiYm9yZGVyLWJvdHRvbS1zdHlsZVwiLCBcImJvcmRlci1ib3R0b20td2lkdGhcIixcbiAgICBcImJvcmRlci1jb2xsYXBzZVwiLCBcImJvcmRlci1jb2xvclwiLCBcImJvcmRlci1pbWFnZVwiLCBcImJvcmRlci1pbWFnZS1vdXRzZXRcIixcbiAgICBcImJvcmRlci1pbWFnZS1yZXBlYXRcIiwgXCJib3JkZXItaW1hZ2Utc2xpY2VcIiwgXCJib3JkZXItaW1hZ2Utc291cmNlXCIsXG4gICAgXCJib3JkZXItaW1hZ2Utd2lkdGhcIiwgXCJib3JkZXItbGVmdFwiLCBcImJvcmRlci1sZWZ0LWNvbG9yXCIsIFwiYm9yZGVyLWxlZnQtc3R5bGVcIixcbiAgICBcImJvcmRlci1sZWZ0LXdpZHRoXCIsIFwiYm9yZGVyLXJhZGl1c1wiLCBcImJvcmRlci1yaWdodFwiLCBcImJvcmRlci1yaWdodC1jb2xvclwiLFxuICAgIFwiYm9yZGVyLXJpZ2h0LXN0eWxlXCIsIFwiYm9yZGVyLXJpZ2h0LXdpZHRoXCIsIFwiYm9yZGVyLXNwYWNpbmdcIiwgXCJib3JkZXItc3R5bGVcIixcbiAgICBcImJvcmRlci10b3BcIiwgXCJib3JkZXItdG9wLWNvbG9yXCIsIFwiYm9yZGVyLXRvcC1sZWZ0LXJhZGl1c1wiLFxuICAgIFwiYm9yZGVyLXRvcC1yaWdodC1yYWRpdXNcIiwgXCJib3JkZXItdG9wLXN0eWxlXCIsIFwiYm9yZGVyLXRvcC13aWR0aFwiLFxuICAgIFwiYm9yZGVyLXdpZHRoXCIsIFwiYm90dG9tXCIsIFwiYm94LWRlY29yYXRpb24tYnJlYWtcIiwgXCJib3gtc2hhZG93XCIsIFwiYm94LXNpemluZ1wiLFxuICAgIFwiYnJlYWstYWZ0ZXJcIiwgXCJicmVhay1iZWZvcmVcIiwgXCJicmVhay1pbnNpZGVcIiwgXCJjYXB0aW9uLXNpZGVcIiwgXCJjYXJldC1jb2xvclwiLFxuICAgIFwiY2xlYXJcIiwgXCJjbGlwXCIsIFwiY29sb3JcIiwgXCJjb2xvci1wcm9maWxlXCIsIFwiY29sdW1uLWNvdW50XCIsIFwiY29sdW1uLWZpbGxcIixcbiAgICBcImNvbHVtbi1nYXBcIiwgXCJjb2x1bW4tcnVsZVwiLCBcImNvbHVtbi1ydWxlLWNvbG9yXCIsIFwiY29sdW1uLXJ1bGUtc3R5bGVcIixcbiAgICBcImNvbHVtbi1ydWxlLXdpZHRoXCIsIFwiY29sdW1uLXNwYW5cIiwgXCJjb2x1bW4td2lkdGhcIiwgXCJjb2x1bW5zXCIsIFwiY29udGFpblwiLFxuICAgIFwiY29udGVudFwiLCBcImNvdW50ZXItaW5jcmVtZW50XCIsIFwiY291bnRlci1yZXNldFwiLCBcImNyb3BcIiwgXCJjdWVcIiwgXCJjdWUtYWZ0ZXJcIixcbiAgICBcImN1ZS1iZWZvcmVcIiwgXCJjdXJzb3JcIiwgXCJkaXJlY3Rpb25cIiwgXCJkaXNwbGF5XCIsIFwiZG9taW5hbnQtYmFzZWxpbmVcIixcbiAgICBcImRyb3AtaW5pdGlhbC1hZnRlci1hZGp1c3RcIiwgXCJkcm9wLWluaXRpYWwtYWZ0ZXItYWxpZ25cIixcbiAgICBcImRyb3AtaW5pdGlhbC1iZWZvcmUtYWRqdXN0XCIsIFwiZHJvcC1pbml0aWFsLWJlZm9yZS1hbGlnblwiLCBcImRyb3AtaW5pdGlhbC1zaXplXCIsXG4gICAgXCJkcm9wLWluaXRpYWwtdmFsdWVcIiwgXCJlbGV2YXRpb25cIiwgXCJlbXB0eS1jZWxsc1wiLCBcImZpdFwiLCBcImZpdC1wb3NpdGlvblwiLFxuICAgIFwiZmxleFwiLCBcImZsZXgtYmFzaXNcIiwgXCJmbGV4LWRpcmVjdGlvblwiLCBcImZsZXgtZmxvd1wiLCBcImZsZXgtZ3Jvd1wiLFxuICAgIFwiZmxleC1zaHJpbmtcIiwgXCJmbGV4LXdyYXBcIiwgXCJmbG9hdFwiLCBcImZsb2F0LW9mZnNldFwiLCBcImZsb3ctZnJvbVwiLCBcImZsb3ctaW50b1wiLFxuICAgIFwiZm9udFwiLCBcImZvbnQtZmFtaWx5XCIsIFwiZm9udC1mZWF0dXJlLXNldHRpbmdzXCIsIFwiZm9udC1rZXJuaW5nXCIsXG4gICAgXCJmb250LWxhbmd1YWdlLW92ZXJyaWRlXCIsIFwiZm9udC1vcHRpY2FsLXNpemluZ1wiLCBcImZvbnQtc2l6ZVwiLFxuICAgIFwiZm9udC1zaXplLWFkanVzdFwiLCBcImZvbnQtc3RyZXRjaFwiLCBcImZvbnQtc3R5bGVcIiwgXCJmb250LXN5bnRoZXNpc1wiLFxuICAgIFwiZm9udC12YXJpYW50XCIsIFwiZm9udC12YXJpYW50LWFsdGVybmF0ZXNcIiwgXCJmb250LXZhcmlhbnQtY2Fwc1wiLFxuICAgIFwiZm9udC12YXJpYW50LWVhc3QtYXNpYW5cIiwgXCJmb250LXZhcmlhbnQtbGlnYXR1cmVzXCIsIFwiZm9udC12YXJpYW50LW51bWVyaWNcIixcbiAgICBcImZvbnQtdmFyaWFudC1wb3NpdGlvblwiLCBcImZvbnQtdmFyaWF0aW9uLXNldHRpbmdzXCIsIFwiZm9udC13ZWlnaHRcIiwgXCJnYXBcIixcbiAgICBcImdyaWRcIiwgXCJncmlkLWFyZWFcIiwgXCJncmlkLWF1dG8tY29sdW1uc1wiLCBcImdyaWQtYXV0by1mbG93XCIsIFwiZ3JpZC1hdXRvLXJvd3NcIixcbiAgICBcImdyaWQtY29sdW1uXCIsIFwiZ3JpZC1jb2x1bW4tZW5kXCIsIFwiZ3JpZC1jb2x1bW4tZ2FwXCIsIFwiZ3JpZC1jb2x1bW4tc3RhcnRcIixcbiAgICBcImdyaWQtZ2FwXCIsIFwiZ3JpZC1yb3dcIiwgXCJncmlkLXJvdy1lbmRcIiwgXCJncmlkLXJvdy1nYXBcIiwgXCJncmlkLXJvdy1zdGFydFwiLFxuICAgIFwiZ3JpZC10ZW1wbGF0ZVwiLCBcImdyaWQtdGVtcGxhdGUtYXJlYXNcIiwgXCJncmlkLXRlbXBsYXRlLWNvbHVtbnNcIixcbiAgICBcImdyaWQtdGVtcGxhdGUtcm93c1wiLCBcImhhbmdpbmctcHVuY3R1YXRpb25cIiwgXCJoZWlnaHRcIiwgXCJoeXBoZW5zXCIsIFwiaWNvblwiLFxuICAgIFwiaW1hZ2Utb3JpZW50YXRpb25cIiwgXCJpbWFnZS1yZW5kZXJpbmdcIiwgXCJpbWFnZS1yZXNvbHV0aW9uXCIsIFwiaW5saW5lLWJveC1hbGlnblwiLFxuICAgIFwiaW5zZXRcIiwgXCJpbnNldC1ibG9ja1wiLCBcImluc2V0LWJsb2NrLWVuZFwiLCBcImluc2V0LWJsb2NrLXN0YXJ0XCIsIFwiaW5zZXQtaW5saW5lXCIsXG4gICAgXCJpbnNldC1pbmxpbmUtZW5kXCIsIFwiaW5zZXQtaW5saW5lLXN0YXJ0XCIsIFwiaXNvbGF0aW9uXCIsIFwianVzdGlmeS1jb250ZW50XCIsXG4gICAgXCJqdXN0aWZ5LWl0ZW1zXCIsIFwianVzdGlmeS1zZWxmXCIsIFwibGVmdFwiLCBcImxldHRlci1zcGFjaW5nXCIsIFwibGluZS1icmVha1wiLFxuICAgIFwibGluZS1oZWlnaHRcIiwgXCJsaW5lLWhlaWdodC1zdGVwXCIsIFwibGluZS1zdGFja2luZ1wiLCBcImxpbmUtc3RhY2tpbmctcnVieVwiLFxuICAgIFwibGluZS1zdGFja2luZy1zaGlmdFwiLCBcImxpbmUtc3RhY2tpbmctc3RyYXRlZ3lcIiwgXCJsaXN0LXN0eWxlXCIsXG4gICAgXCJsaXN0LXN0eWxlLWltYWdlXCIsIFwibGlzdC1zdHlsZS1wb3NpdGlvblwiLCBcImxpc3Qtc3R5bGUtdHlwZVwiLCBcIm1hcmdpblwiLFxuICAgIFwibWFyZ2luLWJvdHRvbVwiLCBcIm1hcmdpbi1sZWZ0XCIsIFwibWFyZ2luLXJpZ2h0XCIsIFwibWFyZ2luLXRvcFwiLCBcIm1hcmtzXCIsXG4gICAgXCJtYXJxdWVlLWRpcmVjdGlvblwiLCBcIm1hcnF1ZWUtbG9vcFwiLCBcIm1hcnF1ZWUtcGxheS1jb3VudFwiLCBcIm1hcnF1ZWUtc3BlZWRcIixcbiAgICBcIm1hcnF1ZWUtc3R5bGVcIiwgXCJtYXNrLWNsaXBcIiwgXCJtYXNrLWNvbXBvc2l0ZVwiLCBcIm1hc2staW1hZ2VcIiwgXCJtYXNrLW1vZGVcIixcbiAgICBcIm1hc2stb3JpZ2luXCIsIFwibWFzay1wb3NpdGlvblwiLCBcIm1hc2stcmVwZWF0XCIsIFwibWFzay1zaXplXCIsXCJtYXNrLXR5cGVcIixcbiAgICBcIm1heC1ibG9jay1zaXplXCIsIFwibWF4LWhlaWdodFwiLCBcIm1heC1pbmxpbmUtc2l6ZVwiLFxuICAgIFwibWF4LXdpZHRoXCIsIFwibWluLWJsb2NrLXNpemVcIiwgXCJtaW4taGVpZ2h0XCIsIFwibWluLWlubGluZS1zaXplXCIsIFwibWluLXdpZHRoXCIsXG4gICAgXCJtaXgtYmxlbmQtbW9kZVwiLCBcIm1vdmUtdG9cIiwgXCJuYXYtZG93blwiLCBcIm5hdi1pbmRleFwiLCBcIm5hdi1sZWZ0XCIsIFwibmF2LXJpZ2h0XCIsXG4gICAgXCJuYXYtdXBcIiwgXCJvYmplY3QtZml0XCIsIFwib2JqZWN0LXBvc2l0aW9uXCIsIFwib2Zmc2V0XCIsIFwib2Zmc2V0LWFuY2hvclwiLFxuICAgIFwib2Zmc2V0LWRpc3RhbmNlXCIsIFwib2Zmc2V0LXBhdGhcIiwgXCJvZmZzZXQtcG9zaXRpb25cIiwgXCJvZmZzZXQtcm90YXRlXCIsXG4gICAgXCJvcGFjaXR5XCIsIFwib3JkZXJcIiwgXCJvcnBoYW5zXCIsIFwib3V0bGluZVwiLCBcIm91dGxpbmUtY29sb3JcIiwgXCJvdXRsaW5lLW9mZnNldFwiLFxuICAgIFwib3V0bGluZS1zdHlsZVwiLCBcIm91dGxpbmUtd2lkdGhcIiwgXCJvdmVyZmxvd1wiLCBcIm92ZXJmbG93LXN0eWxlXCIsXG4gICAgXCJvdmVyZmxvdy13cmFwXCIsIFwib3ZlcmZsb3cteFwiLCBcIm92ZXJmbG93LXlcIiwgXCJwYWRkaW5nXCIsIFwicGFkZGluZy1ib3R0b21cIixcbiAgICBcInBhZGRpbmctbGVmdFwiLCBcInBhZGRpbmctcmlnaHRcIiwgXCJwYWRkaW5nLXRvcFwiLCBcInBhZ2VcIiwgXCJwYWdlLWJyZWFrLWFmdGVyXCIsXG4gICAgXCJwYWdlLWJyZWFrLWJlZm9yZVwiLCBcInBhZ2UtYnJlYWstaW5zaWRlXCIsIFwicGFnZS1wb2xpY3lcIiwgXCJwYXVzZVwiLFxuICAgIFwicGF1c2UtYWZ0ZXJcIiwgXCJwYXVzZS1iZWZvcmVcIiwgXCJwZXJzcGVjdGl2ZVwiLCBcInBlcnNwZWN0aXZlLW9yaWdpblwiLCBcInBpdGNoXCIsXG4gICAgXCJwaXRjaC1yYW5nZVwiLCBcInBsYWNlLWNvbnRlbnRcIiwgXCJwbGFjZS1pdGVtc1wiLCBcInBsYWNlLXNlbGZcIiwgXCJwbGF5LWR1cmluZ1wiLFxuICAgIFwicG9zaXRpb25cIiwgXCJwcmVzZW50YXRpb24tbGV2ZWxcIiwgXCJwdW5jdHVhdGlvbi10cmltXCIsIFwicXVvdGVzXCIsXG4gICAgXCJyZWdpb24tYnJlYWstYWZ0ZXJcIiwgXCJyZWdpb24tYnJlYWstYmVmb3JlXCIsIFwicmVnaW9uLWJyZWFrLWluc2lkZVwiLFxuICAgIFwicmVnaW9uLWZyYWdtZW50XCIsIFwicmVuZGVyaW5nLWludGVudFwiLCBcInJlc2l6ZVwiLCBcInJlc3RcIiwgXCJyZXN0LWFmdGVyXCIsXG4gICAgXCJyZXN0LWJlZm9yZVwiLCBcInJpY2huZXNzXCIsIFwicmlnaHRcIiwgXCJyb3RhdGVcIiwgXCJyb3RhdGlvblwiLCBcInJvdGF0aW9uLXBvaW50XCIsXG4gICAgXCJyb3ctZ2FwXCIsIFwicnVieS1hbGlnblwiLCBcInJ1Ynktb3ZlcmhhbmdcIiwgXCJydWJ5LXBvc2l0aW9uXCIsIFwicnVieS1zcGFuXCIsXG4gICAgXCJzY2FsZVwiLCBcInNjcm9sbC1iZWhhdmlvclwiLCBcInNjcm9sbC1tYXJnaW5cIiwgXCJzY3JvbGwtbWFyZ2luLWJsb2NrXCIsXG4gICAgXCJzY3JvbGwtbWFyZ2luLWJsb2NrLWVuZFwiLCBcInNjcm9sbC1tYXJnaW4tYmxvY2stc3RhcnRcIiwgXCJzY3JvbGwtbWFyZ2luLWJvdHRvbVwiLFxuICAgIFwic2Nyb2xsLW1hcmdpbi1pbmxpbmVcIiwgXCJzY3JvbGwtbWFyZ2luLWlubGluZS1lbmRcIixcbiAgICBcInNjcm9sbC1tYXJnaW4taW5saW5lLXN0YXJ0XCIsIFwic2Nyb2xsLW1hcmdpbi1sZWZ0XCIsIFwic2Nyb2xsLW1hcmdpbi1yaWdodFwiLFxuICAgIFwic2Nyb2xsLW1hcmdpbi10b3BcIiwgXCJzY3JvbGwtcGFkZGluZ1wiLCBcInNjcm9sbC1wYWRkaW5nLWJsb2NrXCIsXG4gICAgXCJzY3JvbGwtcGFkZGluZy1ibG9jay1lbmRcIiwgXCJzY3JvbGwtcGFkZGluZy1ibG9jay1zdGFydFwiLFxuICAgIFwic2Nyb2xsLXBhZGRpbmctYm90dG9tXCIsIFwic2Nyb2xsLXBhZGRpbmctaW5saW5lXCIsIFwic2Nyb2xsLXBhZGRpbmctaW5saW5lLWVuZFwiLFxuICAgIFwic2Nyb2xsLXBhZGRpbmctaW5saW5lLXN0YXJ0XCIsIFwic2Nyb2xsLXBhZGRpbmctbGVmdFwiLCBcInNjcm9sbC1wYWRkaW5nLXJpZ2h0XCIsXG4gICAgXCJzY3JvbGwtcGFkZGluZy10b3BcIiwgXCJzY3JvbGwtc25hcC1hbGlnblwiLCBcInNjcm9sbC1zbmFwLXR5cGVcIixcbiAgICBcInNoYXBlLWltYWdlLXRocmVzaG9sZFwiLCBcInNoYXBlLWluc2lkZVwiLCBcInNoYXBlLW1hcmdpblwiLCBcInNoYXBlLW91dHNpZGVcIixcbiAgICBcInNpemVcIiwgXCJzcGVha1wiLCBcInNwZWFrLWFzXCIsIFwic3BlYWstaGVhZGVyXCIsIFwic3BlYWstbnVtZXJhbFwiLFxuICAgIFwic3BlYWstcHVuY3R1YXRpb25cIiwgXCJzcGVlY2gtcmF0ZVwiLCBcInN0cmVzc1wiLCBcInN0cmluZy1zZXRcIiwgXCJ0YWItc2l6ZVwiLFxuICAgIFwidGFibGUtbGF5b3V0XCIsIFwidGFyZ2V0XCIsIFwidGFyZ2V0LW5hbWVcIiwgXCJ0YXJnZXQtbmV3XCIsIFwidGFyZ2V0LXBvc2l0aW9uXCIsXG4gICAgXCJ0ZXh0LWFsaWduXCIsIFwidGV4dC1hbGlnbi1sYXN0XCIsIFwidGV4dC1jb21iaW5lLXVwcmlnaHRcIiwgXCJ0ZXh0LWRlY29yYXRpb25cIixcbiAgICBcInRleHQtZGVjb3JhdGlvbi1jb2xvclwiLCBcInRleHQtZGVjb3JhdGlvbi1saW5lXCIsIFwidGV4dC1kZWNvcmF0aW9uLXNraXBcIixcbiAgICBcInRleHQtZGVjb3JhdGlvbi1za2lwLWlua1wiLCBcInRleHQtZGVjb3JhdGlvbi1zdHlsZVwiLCBcInRleHQtZW1waGFzaXNcIixcbiAgICBcInRleHQtZW1waGFzaXMtY29sb3JcIiwgXCJ0ZXh0LWVtcGhhc2lzLXBvc2l0aW9uXCIsIFwidGV4dC1lbXBoYXNpcy1zdHlsZVwiLFxuICAgIFwidGV4dC1oZWlnaHRcIiwgXCJ0ZXh0LWluZGVudFwiLCBcInRleHQtanVzdGlmeVwiLCBcInRleHQtb3JpZW50YXRpb25cIixcbiAgICBcInRleHQtb3V0bGluZVwiLCBcInRleHQtb3ZlcmZsb3dcIiwgXCJ0ZXh0LXJlbmRlcmluZ1wiLCBcInRleHQtc2hhZG93XCIsXG4gICAgXCJ0ZXh0LXNpemUtYWRqdXN0XCIsIFwidGV4dC1zcGFjZS1jb2xsYXBzZVwiLCBcInRleHQtdHJhbnNmb3JtXCIsXG4gICAgXCJ0ZXh0LXVuZGVybGluZS1wb3NpdGlvblwiLCBcInRleHQtd3JhcFwiLCBcInRvcFwiLCBcInRvdWNoLWFjdGlvblwiLCBcInRyYW5zZm9ybVwiLCBcInRyYW5zZm9ybS1vcmlnaW5cIixcbiAgICBcInRyYW5zZm9ybS1zdHlsZVwiLCBcInRyYW5zaXRpb25cIiwgXCJ0cmFuc2l0aW9uLWRlbGF5XCIsIFwidHJhbnNpdGlvbi1kdXJhdGlvblwiLFxuICAgIFwidHJhbnNpdGlvbi1wcm9wZXJ0eVwiLCBcInRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uXCIsIFwidHJhbnNsYXRlXCIsXG4gICAgXCJ1bmljb2RlLWJpZGlcIiwgXCJ1c2VyLXNlbGVjdFwiLCBcInZlcnRpY2FsLWFsaWduXCIsIFwidmlzaWJpbGl0eVwiLCBcInZvaWNlLWJhbGFuY2VcIixcbiAgICBcInZvaWNlLWR1cmF0aW9uXCIsIFwidm9pY2UtZmFtaWx5XCIsIFwidm9pY2UtcGl0Y2hcIiwgXCJ2b2ljZS1yYW5nZVwiLCBcInZvaWNlLXJhdGVcIixcbiAgICBcInZvaWNlLXN0cmVzc1wiLCBcInZvaWNlLXZvbHVtZVwiLCBcInZvbHVtZVwiLCBcIndoaXRlLXNwYWNlXCIsIFwid2lkb3dzXCIsIFwid2lkdGhcIixcbiAgICBcIndpbGwtY2hhbmdlXCIsIFwid29yZC1icmVha1wiLCBcIndvcmQtc3BhY2luZ1wiLCBcIndvcmQtd3JhcFwiLCBcIndyaXRpbmctbW9kZVwiLCBcInotaW5kZXhcIixcbiAgICAvLyBTVkctc3BlY2lmaWNcbiAgICBcImNsaXAtcGF0aFwiLCBcImNsaXAtcnVsZVwiLCBcIm1hc2tcIiwgXCJlbmFibGUtYmFja2dyb3VuZFwiLCBcImZpbHRlclwiLCBcImZsb29kLWNvbG9yXCIsXG4gICAgXCJmbG9vZC1vcGFjaXR5XCIsIFwibGlnaHRpbmctY29sb3JcIiwgXCJzdG9wLWNvbG9yXCIsIFwic3RvcC1vcGFjaXR5XCIsIFwicG9pbnRlci1ldmVudHNcIixcbiAgICBcImNvbG9yLWludGVycG9sYXRpb25cIiwgXCJjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnNcIixcbiAgICBcImNvbG9yLXJlbmRlcmluZ1wiLCBcImZpbGxcIiwgXCJmaWxsLW9wYWNpdHlcIiwgXCJmaWxsLXJ1bGVcIiwgXCJpbWFnZS1yZW5kZXJpbmdcIixcbiAgICBcIm1hcmtlclwiLCBcIm1hcmtlci1lbmRcIiwgXCJtYXJrZXItbWlkXCIsIFwibWFya2VyLXN0YXJ0XCIsIFwicGFpbnQtb3JkZXJcIiwgXCJzaGFwZS1yZW5kZXJpbmdcIiwgXCJzdHJva2VcIixcbiAgICBcInN0cm9rZS1kYXNoYXJyYXlcIiwgXCJzdHJva2UtZGFzaG9mZnNldFwiLCBcInN0cm9rZS1saW5lY2FwXCIsIFwic3Ryb2tlLWxpbmVqb2luXCIsXG4gICAgXCJzdHJva2UtbWl0ZXJsaW1pdFwiLCBcInN0cm9rZS1vcGFjaXR5XCIsIFwic3Ryb2tlLXdpZHRoXCIsIFwidGV4dC1yZW5kZXJpbmdcIixcbiAgICBcImJhc2VsaW5lLXNoaWZ0XCIsIFwiZG9taW5hbnQtYmFzZWxpbmVcIiwgXCJnbHlwaC1vcmllbnRhdGlvbi1ob3Jpem9udGFsXCIsXG4gICAgXCJnbHlwaC1vcmllbnRhdGlvbi12ZXJ0aWNhbFwiLCBcInRleHQtYW5jaG9yXCIsIFwid3JpdGluZy1tb2RlXCIsXG4gIF0sIHByb3BlcnR5S2V5d29yZHMgPSBrZXlTZXQocHJvcGVydHlLZXl3b3Jkc18pO1xuXG4gIHZhciBub25TdGFuZGFyZFByb3BlcnR5S2V5d29yZHNfID0gW1xuICAgIFwiYm9yZGVyLWJsb2NrXCIsIFwiYm9yZGVyLWJsb2NrLWNvbG9yXCIsIFwiYm9yZGVyLWJsb2NrLWVuZFwiLFxuICAgIFwiYm9yZGVyLWJsb2NrLWVuZC1jb2xvclwiLCBcImJvcmRlci1ibG9jay1lbmQtc3R5bGVcIiwgXCJib3JkZXItYmxvY2stZW5kLXdpZHRoXCIsXG4gICAgXCJib3JkZXItYmxvY2stc3RhcnRcIiwgXCJib3JkZXItYmxvY2stc3RhcnQtY29sb3JcIiwgXCJib3JkZXItYmxvY2stc3RhcnQtc3R5bGVcIixcbiAgICBcImJvcmRlci1ibG9jay1zdGFydC13aWR0aFwiLCBcImJvcmRlci1ibG9jay1zdHlsZVwiLCBcImJvcmRlci1ibG9jay13aWR0aFwiLFxuICAgIFwiYm9yZGVyLWlubGluZVwiLCBcImJvcmRlci1pbmxpbmUtY29sb3JcIiwgXCJib3JkZXItaW5saW5lLWVuZFwiLFxuICAgIFwiYm9yZGVyLWlubGluZS1lbmQtY29sb3JcIiwgXCJib3JkZXItaW5saW5lLWVuZC1zdHlsZVwiLFxuICAgIFwiYm9yZGVyLWlubGluZS1lbmQtd2lkdGhcIiwgXCJib3JkZXItaW5saW5lLXN0YXJ0XCIsIFwiYm9yZGVyLWlubGluZS1zdGFydC1jb2xvclwiLFxuICAgIFwiYm9yZGVyLWlubGluZS1zdGFydC1zdHlsZVwiLCBcImJvcmRlci1pbmxpbmUtc3RhcnQtd2lkdGhcIixcbiAgICBcImJvcmRlci1pbmxpbmUtc3R5bGVcIiwgXCJib3JkZXItaW5saW5lLXdpZHRoXCIsIFwibWFyZ2luLWJsb2NrXCIsXG4gICAgXCJtYXJnaW4tYmxvY2stZW5kXCIsIFwibWFyZ2luLWJsb2NrLXN0YXJ0XCIsIFwibWFyZ2luLWlubGluZVwiLCBcIm1hcmdpbi1pbmxpbmUtZW5kXCIsXG4gICAgXCJtYXJnaW4taW5saW5lLXN0YXJ0XCIsIFwicGFkZGluZy1ibG9ja1wiLCBcInBhZGRpbmctYmxvY2stZW5kXCIsXG4gICAgXCJwYWRkaW5nLWJsb2NrLXN0YXJ0XCIsIFwicGFkZGluZy1pbmxpbmVcIiwgXCJwYWRkaW5nLWlubGluZS1lbmRcIixcbiAgICBcInBhZGRpbmctaW5saW5lLXN0YXJ0XCIsIFwic2Nyb2xsLXNuYXAtc3RvcFwiLCBcInNjcm9sbGJhci0zZC1saWdodC1jb2xvclwiLFxuICAgIFwic2Nyb2xsYmFyLWFycm93LWNvbG9yXCIsIFwic2Nyb2xsYmFyLWJhc2UtY29sb3JcIiwgXCJzY3JvbGxiYXItZGFyay1zaGFkb3ctY29sb3JcIixcbiAgICBcInNjcm9sbGJhci1mYWNlLWNvbG9yXCIsIFwic2Nyb2xsYmFyLWhpZ2hsaWdodC1jb2xvclwiLCBcInNjcm9sbGJhci1zaGFkb3ctY29sb3JcIixcbiAgICBcInNjcm9sbGJhci10cmFjay1jb2xvclwiLCBcInNlYXJjaGZpZWxkLWNhbmNlbC1idXR0b25cIiwgXCJzZWFyY2hmaWVsZC1kZWNvcmF0aW9uXCIsXG4gICAgXCJzZWFyY2hmaWVsZC1yZXN1bHRzLWJ1dHRvblwiLCBcInNlYXJjaGZpZWxkLXJlc3VsdHMtZGVjb3JhdGlvblwiLCBcInNoYXBlLWluc2lkZVwiLCBcInpvb21cIlxuICBdLCBub25TdGFuZGFyZFByb3BlcnR5S2V5d29yZHMgPSBrZXlTZXQobm9uU3RhbmRhcmRQcm9wZXJ0eUtleXdvcmRzXyk7XG5cbiAgdmFyIGZvbnRQcm9wZXJ0aWVzXyA9IFtcbiAgICBcImZvbnQtZGlzcGxheVwiLCBcImZvbnQtZmFtaWx5XCIsIFwic3JjXCIsIFwidW5pY29kZS1yYW5nZVwiLCBcImZvbnQtdmFyaWFudFwiLFxuICAgICBcImZvbnQtZmVhdHVyZS1zZXR0aW5nc1wiLCBcImZvbnQtc3RyZXRjaFwiLCBcImZvbnQtd2VpZ2h0XCIsIFwiZm9udC1zdHlsZVwiXG4gIF0sIGZvbnRQcm9wZXJ0aWVzID0ga2V5U2V0KGZvbnRQcm9wZXJ0aWVzXyk7XG5cbiAgdmFyIGNvdW50ZXJEZXNjcmlwdG9yc18gPSBbXG4gICAgXCJhZGRpdGl2ZS1zeW1ib2xzXCIsIFwiZmFsbGJhY2tcIiwgXCJuZWdhdGl2ZVwiLCBcInBhZFwiLCBcInByZWZpeFwiLCBcInJhbmdlXCIsXG4gICAgXCJzcGVhay1hc1wiLCBcInN1ZmZpeFwiLCBcInN5bWJvbHNcIiwgXCJzeXN0ZW1cIlxuICBdLCBjb3VudGVyRGVzY3JpcHRvcnMgPSBrZXlTZXQoY291bnRlckRlc2NyaXB0b3JzXyk7XG5cbiAgdmFyIGNvbG9yS2V5d29yZHNfID0gW1xuICAgIFwiYWxpY2VibHVlXCIsIFwiYW50aXF1ZXdoaXRlXCIsIFwiYXF1YVwiLCBcImFxdWFtYXJpbmVcIiwgXCJhenVyZVwiLCBcImJlaWdlXCIsXG4gICAgXCJiaXNxdWVcIiwgXCJibGFja1wiLCBcImJsYW5jaGVkYWxtb25kXCIsIFwiYmx1ZVwiLCBcImJsdWV2aW9sZXRcIiwgXCJicm93blwiLFxuICAgIFwiYnVybHl3b29kXCIsIFwiY2FkZXRibHVlXCIsIFwiY2hhcnRyZXVzZVwiLCBcImNob2NvbGF0ZVwiLCBcImNvcmFsXCIsIFwiY29ybmZsb3dlcmJsdWVcIixcbiAgICBcImNvcm5zaWxrXCIsIFwiY3JpbXNvblwiLCBcImN5YW5cIiwgXCJkYXJrYmx1ZVwiLCBcImRhcmtjeWFuXCIsIFwiZGFya2dvbGRlbnJvZFwiLFxuICAgIFwiZGFya2dyYXlcIiwgXCJkYXJrZ3JlZW5cIiwgXCJkYXJra2hha2lcIiwgXCJkYXJrbWFnZW50YVwiLCBcImRhcmtvbGl2ZWdyZWVuXCIsXG4gICAgXCJkYXJrb3JhbmdlXCIsIFwiZGFya29yY2hpZFwiLCBcImRhcmtyZWRcIiwgXCJkYXJrc2FsbW9uXCIsIFwiZGFya3NlYWdyZWVuXCIsXG4gICAgXCJkYXJrc2xhdGVibHVlXCIsIFwiZGFya3NsYXRlZ3JheVwiLCBcImRhcmt0dXJxdW9pc2VcIiwgXCJkYXJrdmlvbGV0XCIsXG4gICAgXCJkZWVwcGlua1wiLCBcImRlZXBza3libHVlXCIsIFwiZGltZ3JheVwiLCBcImRvZGdlcmJsdWVcIiwgXCJmaXJlYnJpY2tcIixcbiAgICBcImZsb3JhbHdoaXRlXCIsIFwiZm9yZXN0Z3JlZW5cIiwgXCJmdWNoc2lhXCIsIFwiZ2FpbnNib3JvXCIsIFwiZ2hvc3R3aGl0ZVwiLFxuICAgIFwiZ29sZFwiLCBcImdvbGRlbnJvZFwiLCBcImdyYXlcIiwgXCJncmV5XCIsIFwiZ3JlZW5cIiwgXCJncmVlbnllbGxvd1wiLCBcImhvbmV5ZGV3XCIsXG4gICAgXCJob3RwaW5rXCIsIFwiaW5kaWFucmVkXCIsIFwiaW5kaWdvXCIsIFwiaXZvcnlcIiwgXCJraGFraVwiLCBcImxhdmVuZGVyXCIsXG4gICAgXCJsYXZlbmRlcmJsdXNoXCIsIFwibGF3bmdyZWVuXCIsIFwibGVtb25jaGlmZm9uXCIsIFwibGlnaHRibHVlXCIsIFwibGlnaHRjb3JhbFwiLFxuICAgIFwibGlnaHRjeWFuXCIsIFwibGlnaHRnb2xkZW5yb2R5ZWxsb3dcIiwgXCJsaWdodGdyYXlcIiwgXCJsaWdodGdyZWVuXCIsIFwibGlnaHRwaW5rXCIsXG4gICAgXCJsaWdodHNhbG1vblwiLCBcImxpZ2h0c2VhZ3JlZW5cIiwgXCJsaWdodHNreWJsdWVcIiwgXCJsaWdodHNsYXRlZ3JheVwiLFxuICAgIFwibGlnaHRzdGVlbGJsdWVcIiwgXCJsaWdodHllbGxvd1wiLCBcImxpbWVcIiwgXCJsaW1lZ3JlZW5cIiwgXCJsaW5lblwiLCBcIm1hZ2VudGFcIixcbiAgICBcIm1hcm9vblwiLCBcIm1lZGl1bWFxdWFtYXJpbmVcIiwgXCJtZWRpdW1ibHVlXCIsIFwibWVkaXVtb3JjaGlkXCIsIFwibWVkaXVtcHVycGxlXCIsXG4gICAgXCJtZWRpdW1zZWFncmVlblwiLCBcIm1lZGl1bXNsYXRlYmx1ZVwiLCBcIm1lZGl1bXNwcmluZ2dyZWVuXCIsIFwibWVkaXVtdHVycXVvaXNlXCIsXG4gICAgXCJtZWRpdW12aW9sZXRyZWRcIiwgXCJtaWRuaWdodGJsdWVcIiwgXCJtaW50Y3JlYW1cIiwgXCJtaXN0eXJvc2VcIiwgXCJtb2NjYXNpblwiLFxuICAgIFwibmF2YWpvd2hpdGVcIiwgXCJuYXZ5XCIsIFwib2xkbGFjZVwiLCBcIm9saXZlXCIsIFwib2xpdmVkcmFiXCIsIFwib3JhbmdlXCIsIFwib3JhbmdlcmVkXCIsXG4gICAgXCJvcmNoaWRcIiwgXCJwYWxlZ29sZGVucm9kXCIsIFwicGFsZWdyZWVuXCIsIFwicGFsZXR1cnF1b2lzZVwiLCBcInBhbGV2aW9sZXRyZWRcIixcbiAgICBcInBhcGF5YXdoaXBcIiwgXCJwZWFjaHB1ZmZcIiwgXCJwZXJ1XCIsIFwicGlua1wiLCBcInBsdW1cIiwgXCJwb3dkZXJibHVlXCIsXG4gICAgXCJwdXJwbGVcIiwgXCJyZWJlY2NhcHVycGxlXCIsIFwicmVkXCIsIFwicm9zeWJyb3duXCIsIFwicm95YWxibHVlXCIsIFwic2FkZGxlYnJvd25cIixcbiAgICBcInNhbG1vblwiLCBcInNhbmR5YnJvd25cIiwgXCJzZWFncmVlblwiLCBcInNlYXNoZWxsXCIsIFwic2llbm5hXCIsIFwic2lsdmVyXCIsIFwic2t5Ymx1ZVwiLFxuICAgIFwic2xhdGVibHVlXCIsIFwic2xhdGVncmF5XCIsIFwic25vd1wiLCBcInNwcmluZ2dyZWVuXCIsIFwic3RlZWxibHVlXCIsIFwidGFuXCIsXG4gICAgXCJ0ZWFsXCIsIFwidGhpc3RsZVwiLCBcInRvbWF0b1wiLCBcInR1cnF1b2lzZVwiLCBcInZpb2xldFwiLCBcIndoZWF0XCIsIFwid2hpdGVcIixcbiAgICBcIndoaXRlc21va2VcIiwgXCJ5ZWxsb3dcIiwgXCJ5ZWxsb3dncmVlblwiXG4gIF0sIGNvbG9yS2V5d29yZHMgPSBrZXlTZXQoY29sb3JLZXl3b3Jkc18pO1xuXG4gIHZhciB2YWx1ZUtleXdvcmRzXyA9IFtcbiAgICBcImFib3ZlXCIsIFwiYWJzb2x1dGVcIiwgXCJhY3RpdmVib3JkZXJcIiwgXCJhZGRpdGl2ZVwiLCBcImFjdGl2ZWNhcHRpb25cIiwgXCJhZmFyXCIsXG4gICAgXCJhZnRlci13aGl0ZS1zcGFjZVwiLCBcImFoZWFkXCIsIFwiYWxpYXNcIiwgXCJhbGxcIiwgXCJhbGwtc2Nyb2xsXCIsIFwiYWxwaGFiZXRpY1wiLCBcImFsdGVybmF0ZVwiLFxuICAgIFwiYWx3YXlzXCIsIFwiYW1oYXJpY1wiLCBcImFtaGFyaWMtYWJlZ2VkZVwiLCBcImFudGlhbGlhc2VkXCIsIFwiYXBwd29ya3NwYWNlXCIsXG4gICAgXCJhcmFiaWMtaW5kaWNcIiwgXCJhcm1lbmlhblwiLCBcImFzdGVyaXNrc1wiLCBcImF0dHJcIiwgXCJhdXRvXCIsIFwiYXV0by1mbG93XCIsIFwiYXZvaWRcIiwgXCJhdm9pZC1jb2x1bW5cIiwgXCJhdm9pZC1wYWdlXCIsXG4gICAgXCJhdm9pZC1yZWdpb25cIiwgXCJheGlzLXBhblwiLCBcImJhY2tncm91bmRcIiwgXCJiYWNrd2FyZHNcIiwgXCJiYXNlbGluZVwiLCBcImJlbG93XCIsIFwiYmlkaS1vdmVycmlkZVwiLCBcImJpbmFyeVwiLFxuICAgIFwiYmVuZ2FsaVwiLCBcImJsaW5rXCIsIFwiYmxvY2tcIiwgXCJibG9jay1heGlzXCIsIFwiYm9sZFwiLCBcImJvbGRlclwiLCBcImJvcmRlclwiLCBcImJvcmRlci1ib3hcIixcbiAgICBcImJvdGhcIiwgXCJib3R0b21cIiwgXCJicmVha1wiLCBcImJyZWFrLWFsbFwiLCBcImJyZWFrLXdvcmRcIiwgXCJidWxsZXRzXCIsIFwiYnV0dG9uXCIsIFwiYnV0dG9uLWJldmVsXCIsXG4gICAgXCJidXR0b25mYWNlXCIsIFwiYnV0dG9uaGlnaGxpZ2h0XCIsIFwiYnV0dG9uc2hhZG93XCIsIFwiYnV0dG9udGV4dFwiLCBcImNhbGNcIiwgXCJjYW1ib2RpYW5cIixcbiAgICBcImNhcGl0YWxpemVcIiwgXCJjYXBzLWxvY2staW5kaWNhdG9yXCIsIFwiY2FwdGlvblwiLCBcImNhcHRpb250ZXh0XCIsIFwiY2FyZXRcIixcbiAgICBcImNlbGxcIiwgXCJjZW50ZXJcIiwgXCJjaGVja2JveFwiLCBcImNpcmNsZVwiLCBcImNqay1kZWNpbWFsXCIsIFwiY2prLWVhcnRobHktYnJhbmNoXCIsXG4gICAgXCJjamstaGVhdmVubHktc3RlbVwiLCBcImNqay1pZGVvZ3JhcGhpY1wiLCBcImNsZWFyXCIsIFwiY2xpcFwiLCBcImNsb3NlLXF1b3RlXCIsXG4gICAgXCJjb2wtcmVzaXplXCIsIFwiY29sbGFwc2VcIiwgXCJjb2xvclwiLCBcImNvbG9yLWJ1cm5cIiwgXCJjb2xvci1kb2RnZVwiLCBcImNvbHVtblwiLCBcImNvbHVtbi1yZXZlcnNlXCIsXG4gICAgXCJjb21wYWN0XCIsIFwiY29uZGVuc2VkXCIsIFwiY29udGFpblwiLCBcImNvbnRlbnRcIiwgXCJjb250ZW50c1wiLFxuICAgIFwiY29udGVudC1ib3hcIiwgXCJjb250ZXh0LW1lbnVcIiwgXCJjb250aW51b3VzXCIsIFwiY29weVwiLCBcImNvdW50ZXJcIiwgXCJjb3VudGVyc1wiLCBcImNvdmVyXCIsIFwiY3JvcFwiLFxuICAgIFwiY3Jvc3NcIiwgXCJjcm9zc2hhaXJcIiwgXCJjdXJyZW50Y29sb3JcIiwgXCJjdXJzaXZlXCIsIFwiY3ljbGljXCIsIFwiZGFya2VuXCIsIFwiZGFzaGVkXCIsIFwiZGVjaW1hbFwiLFxuICAgIFwiZGVjaW1hbC1sZWFkaW5nLXplcm9cIiwgXCJkZWZhdWx0XCIsIFwiZGVmYXVsdC1idXR0b25cIiwgXCJkZW5zZVwiLCBcImRlc3RpbmF0aW9uLWF0b3BcIixcbiAgICBcImRlc3RpbmF0aW9uLWluXCIsIFwiZGVzdGluYXRpb24tb3V0XCIsIFwiZGVzdGluYXRpb24tb3ZlclwiLCBcImRldmFuYWdhcmlcIiwgXCJkaWZmZXJlbmNlXCIsXG4gICAgXCJkaXNjXCIsIFwiZGlzY2FyZFwiLCBcImRpc2Nsb3N1cmUtY2xvc2VkXCIsIFwiZGlzY2xvc3VyZS1vcGVuXCIsIFwiZG9jdW1lbnRcIixcbiAgICBcImRvdC1kYXNoXCIsIFwiZG90LWRvdC1kYXNoXCIsXG4gICAgXCJkb3R0ZWRcIiwgXCJkb3VibGVcIiwgXCJkb3duXCIsIFwiZS1yZXNpemVcIiwgXCJlYXNlXCIsIFwiZWFzZS1pblwiLCBcImVhc2UtaW4tb3V0XCIsIFwiZWFzZS1vdXRcIixcbiAgICBcImVsZW1lbnRcIiwgXCJlbGxpcHNlXCIsIFwiZWxsaXBzaXNcIiwgXCJlbWJlZFwiLCBcImVuZFwiLCBcImV0aGlvcGljXCIsIFwiZXRoaW9waWMtYWJlZ2VkZVwiLFxuICAgIFwiZXRoaW9waWMtYWJlZ2VkZS1hbS1ldFwiLCBcImV0aGlvcGljLWFiZWdlZGUtZ2V6XCIsIFwiZXRoaW9waWMtYWJlZ2VkZS10aS1lclwiLFxuICAgIFwiZXRoaW9waWMtYWJlZ2VkZS10aS1ldFwiLCBcImV0aGlvcGljLWhhbGVoYW1lLWFhLWVyXCIsXG4gICAgXCJldGhpb3BpYy1oYWxlaGFtZS1hYS1ldFwiLCBcImV0aGlvcGljLWhhbGVoYW1lLWFtLWV0XCIsXG4gICAgXCJldGhpb3BpYy1oYWxlaGFtZS1nZXpcIiwgXCJldGhpb3BpYy1oYWxlaGFtZS1vbS1ldFwiLFxuICAgIFwiZXRoaW9waWMtaGFsZWhhbWUtc2lkLWV0XCIsIFwiZXRoaW9waWMtaGFsZWhhbWUtc28tZXRcIixcbiAgICBcImV0aGlvcGljLWhhbGVoYW1lLXRpLWVyXCIsIFwiZXRoaW9waWMtaGFsZWhhbWUtdGktZXRcIiwgXCJldGhpb3BpYy1oYWxlaGFtZS10aWdcIixcbiAgICBcImV0aGlvcGljLW51bWVyaWNcIiwgXCJldy1yZXNpemVcIiwgXCJleGNsdXNpb25cIiwgXCJleHBhbmRlZFwiLCBcImV4dGVuZHNcIiwgXCJleHRyYS1jb25kZW5zZWRcIixcbiAgICBcImV4dHJhLWV4cGFuZGVkXCIsIFwiZmFudGFzeVwiLCBcImZhc3RcIiwgXCJmaWxsXCIsIFwiZmlsbC1ib3hcIiwgXCJmaXhlZFwiLCBcImZsYXRcIiwgXCJmbGV4XCIsIFwiZmxleC1lbmRcIiwgXCJmbGV4LXN0YXJ0XCIsIFwiZm9vdG5vdGVzXCIsXG4gICAgXCJmb3J3YXJkc1wiLCBcImZyb21cIiwgXCJnZW9tZXRyaWNQcmVjaXNpb25cIiwgXCJnZW9yZ2lhblwiLCBcImdyYXl0ZXh0XCIsIFwiZ3JpZFwiLCBcImdyb292ZVwiLFxuICAgIFwiZ3VqYXJhdGlcIiwgXCJndXJtdWtoaVwiLCBcImhhbmRcIiwgXCJoYW5ndWxcIiwgXCJoYW5ndWwtY29uc29uYW50XCIsIFwiaGFyZC1saWdodFwiLCBcImhlYnJld1wiLFxuICAgIFwiaGVscFwiLCBcImhpZGRlblwiLCBcImhpZGVcIiwgXCJoaWdoZXJcIiwgXCJoaWdobGlnaHRcIiwgXCJoaWdobGlnaHR0ZXh0XCIsXG4gICAgXCJoaXJhZ2FuYVwiLCBcImhpcmFnYW5hLWlyb2hhXCIsIFwiaG9yaXpvbnRhbFwiLCBcImhzbFwiLCBcImhzbGFcIiwgXCJodWVcIiwgXCJpY29uXCIsIFwiaWdub3JlXCIsXG4gICAgXCJpbmFjdGl2ZWJvcmRlclwiLCBcImluYWN0aXZlY2FwdGlvblwiLCBcImluYWN0aXZlY2FwdGlvbnRleHRcIiwgXCJpbmZpbml0ZVwiLFxuICAgIFwiaW5mb2JhY2tncm91bmRcIiwgXCJpbmZvdGV4dFwiLCBcImluaGVyaXRcIiwgXCJpbml0aWFsXCIsIFwiaW5saW5lXCIsIFwiaW5saW5lLWF4aXNcIixcbiAgICBcImlubGluZS1ibG9ja1wiLCBcImlubGluZS1mbGV4XCIsIFwiaW5saW5lLWdyaWRcIiwgXCJpbmxpbmUtdGFibGVcIiwgXCJpbnNldFwiLCBcImluc2lkZVwiLCBcImludHJpbnNpY1wiLCBcImludmVydFwiLFxuICAgIFwiaXRhbGljXCIsIFwiamFwYW5lc2UtZm9ybWFsXCIsIFwiamFwYW5lc2UtaW5mb3JtYWxcIiwgXCJqdXN0aWZ5XCIsIFwia2FubmFkYVwiLFxuICAgIFwia2F0YWthbmFcIiwgXCJrYXRha2FuYS1pcm9oYVwiLCBcImtlZXAtYWxsXCIsIFwia2htZXJcIixcbiAgICBcImtvcmVhbi1oYW5ndWwtZm9ybWFsXCIsIFwia29yZWFuLWhhbmphLWZvcm1hbFwiLCBcImtvcmVhbi1oYW5qYS1pbmZvcm1hbFwiLFxuICAgIFwibGFuZHNjYXBlXCIsIFwibGFvXCIsIFwibGFyZ2VcIiwgXCJsYXJnZXJcIiwgXCJsZWZ0XCIsIFwibGV2ZWxcIiwgXCJsaWdodGVyXCIsIFwibGlnaHRlblwiLFxuICAgIFwibGluZS10aHJvdWdoXCIsIFwibGluZWFyXCIsIFwibGluZWFyLWdyYWRpZW50XCIsIFwibGluZXNcIiwgXCJsaXN0LWl0ZW1cIiwgXCJsaXN0Ym94XCIsIFwibGlzdGl0ZW1cIixcbiAgICBcImxvY2FsXCIsIFwibG9naWNhbFwiLCBcImxvdWRcIiwgXCJsb3dlclwiLCBcImxvd2VyLWFscGhhXCIsIFwibG93ZXItYXJtZW5pYW5cIixcbiAgICBcImxvd2VyLWdyZWVrXCIsIFwibG93ZXItaGV4YWRlY2ltYWxcIiwgXCJsb3dlci1sYXRpblwiLCBcImxvd2VyLW5vcndlZ2lhblwiLFxuICAgIFwibG93ZXItcm9tYW5cIiwgXCJsb3dlcmNhc2VcIiwgXCJsdHJcIiwgXCJsdW1pbm9zaXR5XCIsIFwibWFsYXlhbGFtXCIsIFwibWFuaXB1bGF0aW9uXCIsIFwibWF0Y2hcIiwgXCJtYXRyaXhcIiwgXCJtYXRyaXgzZFwiLFxuICAgIFwibWVkaWEtY29udHJvbHMtYmFja2dyb3VuZFwiLCBcIm1lZGlhLWN1cnJlbnQtdGltZS1kaXNwbGF5XCIsXG4gICAgXCJtZWRpYS1mdWxsc2NyZWVuLWJ1dHRvblwiLCBcIm1lZGlhLW11dGUtYnV0dG9uXCIsIFwibWVkaWEtcGxheS1idXR0b25cIixcbiAgICBcIm1lZGlhLXJldHVybi10by1yZWFsdGltZS1idXR0b25cIiwgXCJtZWRpYS1yZXdpbmQtYnV0dG9uXCIsXG4gICAgXCJtZWRpYS1zZWVrLWJhY2stYnV0dG9uXCIsIFwibWVkaWEtc2Vlay1mb3J3YXJkLWJ1dHRvblwiLCBcIm1lZGlhLXNsaWRlclwiLFxuICAgIFwibWVkaWEtc2xpZGVydGh1bWJcIiwgXCJtZWRpYS10aW1lLXJlbWFpbmluZy1kaXNwbGF5XCIsIFwibWVkaWEtdm9sdW1lLXNsaWRlclwiLFxuICAgIFwibWVkaWEtdm9sdW1lLXNsaWRlci1jb250YWluZXJcIiwgXCJtZWRpYS12b2x1bWUtc2xpZGVydGh1bWJcIiwgXCJtZWRpdW1cIixcbiAgICBcIm1lbnVcIiwgXCJtZW51bGlzdFwiLCBcIm1lbnVsaXN0LWJ1dHRvblwiLCBcIm1lbnVsaXN0LXRleHRcIixcbiAgICBcIm1lbnVsaXN0LXRleHRmaWVsZFwiLCBcIm1lbnV0ZXh0XCIsIFwibWVzc2FnZS1ib3hcIiwgXCJtaWRkbGVcIiwgXCJtaW4taW50cmluc2ljXCIsXG4gICAgXCJtaXhcIiwgXCJtb25nb2xpYW5cIiwgXCJtb25vc3BhY2VcIiwgXCJtb3ZlXCIsIFwibXVsdGlwbGVcIiwgXCJtdWx0aXBsZV9tYXNrX2ltYWdlc1wiLCBcIm11bHRpcGx5XCIsIFwibXlhbm1hclwiLCBcIm4tcmVzaXplXCIsXG4gICAgXCJuYXJyb3dlclwiLCBcIm5lLXJlc2l6ZVwiLCBcIm5lc3ctcmVzaXplXCIsIFwibm8tY2xvc2UtcXVvdGVcIiwgXCJuby1kcm9wXCIsXG4gICAgXCJuby1vcGVuLXF1b3RlXCIsIFwibm8tcmVwZWF0XCIsIFwibm9uZVwiLCBcIm5vcm1hbFwiLCBcIm5vdC1hbGxvd2VkXCIsIFwibm93cmFwXCIsXG4gICAgXCJucy1yZXNpemVcIiwgXCJudW1iZXJzXCIsIFwibnVtZXJpY1wiLCBcIm53LXJlc2l6ZVwiLCBcIm53c2UtcmVzaXplXCIsIFwib2JsaXF1ZVwiLCBcIm9jdGFsXCIsIFwib3BhY2l0eVwiLCBcIm9wZW4tcXVvdGVcIixcbiAgICBcIm9wdGltaXplTGVnaWJpbGl0eVwiLCBcIm9wdGltaXplU3BlZWRcIiwgXCJvcml5YVwiLCBcIm9yb21vXCIsIFwib3V0c2V0XCIsXG4gICAgXCJvdXRzaWRlXCIsIFwib3V0c2lkZS1zaGFwZVwiLCBcIm92ZXJsYXlcIiwgXCJvdmVybGluZVwiLCBcInBhZGRpbmdcIiwgXCJwYWRkaW5nLWJveFwiLFxuICAgIFwicGFpbnRlZFwiLCBcInBhZ2VcIiwgXCJwYXVzZWRcIiwgXCJwZXJzaWFuXCIsIFwicGVyc3BlY3RpdmVcIiwgXCJwaW5jaC16b29tXCIsIFwicGx1cy1kYXJrZXJcIiwgXCJwbHVzLWxpZ2h0ZXJcIixcbiAgICBcInBvaW50ZXJcIiwgXCJwb2x5Z29uXCIsIFwicG9ydHJhaXRcIiwgXCJwcmVcIiwgXCJwcmUtbGluZVwiLCBcInByZS13cmFwXCIsIFwicHJlc2VydmUtM2RcIixcbiAgICBcInByb2dyZXNzXCIsIFwicHVzaC1idXR0b25cIiwgXCJyYWRpYWwtZ3JhZGllbnRcIiwgXCJyYWRpb1wiLCBcInJlYWQtb25seVwiLFxuICAgIFwicmVhZC13cml0ZVwiLCBcInJlYWQtd3JpdGUtcGxhaW50ZXh0LW9ubHlcIiwgXCJyZWN0YW5nbGVcIiwgXCJyZWdpb25cIixcbiAgICBcInJlbGF0aXZlXCIsIFwicmVwZWF0XCIsIFwicmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudFwiLFxuICAgIFwicmVwZWF0aW5nLXJhZGlhbC1ncmFkaWVudFwiLCBcInJlcGVhdC14XCIsIFwicmVwZWF0LXlcIiwgXCJyZXNldFwiLCBcInJldmVyc2VcIixcbiAgICBcInJnYlwiLCBcInJnYmFcIiwgXCJyaWRnZVwiLCBcInJpZ2h0XCIsIFwicm90YXRlXCIsIFwicm90YXRlM2RcIiwgXCJyb3RhdGVYXCIsIFwicm90YXRlWVwiLFxuICAgIFwicm90YXRlWlwiLCBcInJvdW5kXCIsIFwicm93XCIsIFwicm93LXJlc2l6ZVwiLCBcInJvdy1yZXZlcnNlXCIsIFwicnRsXCIsIFwicnVuLWluXCIsIFwicnVubmluZ1wiLFxuICAgIFwicy1yZXNpemVcIiwgXCJzYW5zLXNlcmlmXCIsIFwic2F0dXJhdGlvblwiLCBcInNjYWxlXCIsIFwic2NhbGUzZFwiLCBcInNjYWxlWFwiLCBcInNjYWxlWVwiLCBcInNjYWxlWlwiLCBcInNjcmVlblwiLFxuICAgIFwic2Nyb2xsXCIsIFwic2Nyb2xsYmFyXCIsIFwic2Nyb2xsLXBvc2l0aW9uXCIsIFwic2UtcmVzaXplXCIsIFwic2VhcmNoZmllbGRcIixcbiAgICBcInNlYXJjaGZpZWxkLWNhbmNlbC1idXR0b25cIiwgXCJzZWFyY2hmaWVsZC1kZWNvcmF0aW9uXCIsXG4gICAgXCJzZWFyY2hmaWVsZC1yZXN1bHRzLWJ1dHRvblwiLCBcInNlYXJjaGZpZWxkLXJlc3VsdHMtZGVjb3JhdGlvblwiLCBcInNlbGYtc3RhcnRcIiwgXCJzZWxmLWVuZFwiLFxuICAgIFwic2VtaS1jb25kZW5zZWRcIiwgXCJzZW1pLWV4cGFuZGVkXCIsIFwic2VwYXJhdGVcIiwgXCJzZXJpZlwiLCBcInNob3dcIiwgXCJzaWRhbWFcIixcbiAgICBcInNpbXAtY2hpbmVzZS1mb3JtYWxcIiwgXCJzaW1wLWNoaW5lc2UtaW5mb3JtYWxcIiwgXCJzaW5nbGVcIixcbiAgICBcInNrZXdcIiwgXCJza2V3WFwiLCBcInNrZXdZXCIsIFwic2tpcC13aGl0ZS1zcGFjZVwiLCBcInNsaWRlXCIsIFwic2xpZGVyLWhvcml6b250YWxcIixcbiAgICBcInNsaWRlci12ZXJ0aWNhbFwiLCBcInNsaWRlcnRodW1iLWhvcml6b250YWxcIiwgXCJzbGlkZXJ0aHVtYi12ZXJ0aWNhbFwiLCBcInNsb3dcIixcbiAgICBcInNtYWxsXCIsIFwic21hbGwtY2Fwc1wiLCBcInNtYWxsLWNhcHRpb25cIiwgXCJzbWFsbGVyXCIsIFwic29mdC1saWdodFwiLCBcInNvbGlkXCIsIFwic29tYWxpXCIsXG4gICAgXCJzb3VyY2UtYXRvcFwiLCBcInNvdXJjZS1pblwiLCBcInNvdXJjZS1vdXRcIiwgXCJzb3VyY2Utb3ZlclwiLCBcInNwYWNlXCIsIFwic3BhY2UtYXJvdW5kXCIsIFwic3BhY2UtYmV0d2VlblwiLCBcInNwYWNlLWV2ZW5seVwiLCBcInNwZWxsLW91dFwiLCBcInNxdWFyZVwiLFxuICAgIFwic3F1YXJlLWJ1dHRvblwiLCBcInN0YXJ0XCIsIFwic3RhdGljXCIsIFwic3RhdHVzLWJhclwiLCBcInN0cmV0Y2hcIiwgXCJzdHJva2VcIiwgXCJzdHJva2UtYm94XCIsIFwic3ViXCIsXG4gICAgXCJzdWJwaXhlbC1hbnRpYWxpYXNlZFwiLCBcInN2Z19tYXNrc1wiLCBcInN1cGVyXCIsIFwic3ctcmVzaXplXCIsIFwic3ltYm9saWNcIiwgXCJzeW1ib2xzXCIsIFwic3lzdGVtLXVpXCIsIFwidGFibGVcIixcbiAgICBcInRhYmxlLWNhcHRpb25cIiwgXCJ0YWJsZS1jZWxsXCIsIFwidGFibGUtY29sdW1uXCIsIFwidGFibGUtY29sdW1uLWdyb3VwXCIsXG4gICAgXCJ0YWJsZS1mb290ZXItZ3JvdXBcIiwgXCJ0YWJsZS1oZWFkZXItZ3JvdXBcIiwgXCJ0YWJsZS1yb3dcIiwgXCJ0YWJsZS1yb3ctZ3JvdXBcIixcbiAgICBcInRhbWlsXCIsXG4gICAgXCJ0ZWx1Z3VcIiwgXCJ0ZXh0XCIsIFwidGV4dC1ib3R0b21cIiwgXCJ0ZXh0LXRvcFwiLCBcInRleHRhcmVhXCIsIFwidGV4dGZpZWxkXCIsIFwidGhhaVwiLFxuICAgIFwidGhpY2tcIiwgXCJ0aGluXCIsIFwidGhyZWVkZGFya3NoYWRvd1wiLCBcInRocmVlZGZhY2VcIiwgXCJ0aHJlZWRoaWdobGlnaHRcIixcbiAgICBcInRocmVlZGxpZ2h0c2hhZG93XCIsIFwidGhyZWVkc2hhZG93XCIsIFwidGliZXRhblwiLCBcInRpZ3JlXCIsIFwidGlncmlueWEtZXJcIixcbiAgICBcInRpZ3JpbnlhLWVyLWFiZWdlZGVcIiwgXCJ0aWdyaW55YS1ldFwiLCBcInRpZ3JpbnlhLWV0LWFiZWdlZGVcIiwgXCJ0b1wiLCBcInRvcFwiLFxuICAgIFwidHJhZC1jaGluZXNlLWZvcm1hbFwiLCBcInRyYWQtY2hpbmVzZS1pbmZvcm1hbFwiLCBcInRyYW5zZm9ybVwiLFxuICAgIFwidHJhbnNsYXRlXCIsIFwidHJhbnNsYXRlM2RcIiwgXCJ0cmFuc2xhdGVYXCIsIFwidHJhbnNsYXRlWVwiLCBcInRyYW5zbGF0ZVpcIixcbiAgICBcInRyYW5zcGFyZW50XCIsIFwidWx0cmEtY29uZGVuc2VkXCIsIFwidWx0cmEtZXhwYW5kZWRcIiwgXCJ1bmRlcmxpbmVcIiwgXCJ1bmlkaXJlY3Rpb25hbC1wYW5cIiwgXCJ1bnNldFwiLCBcInVwXCIsXG4gICAgXCJ1cHBlci1hbHBoYVwiLCBcInVwcGVyLWFybWVuaWFuXCIsIFwidXBwZXItZ3JlZWtcIiwgXCJ1cHBlci1oZXhhZGVjaW1hbFwiLFxuICAgIFwidXBwZXItbGF0aW5cIiwgXCJ1cHBlci1ub3J3ZWdpYW5cIiwgXCJ1cHBlci1yb21hblwiLCBcInVwcGVyY2FzZVwiLCBcInVyZHVcIiwgXCJ1cmxcIixcbiAgICBcInZhclwiLCBcInZlcnRpY2FsXCIsIFwidmVydGljYWwtdGV4dFwiLCBcInZpZXctYm94XCIsIFwidmlzaWJsZVwiLCBcInZpc2libGVGaWxsXCIsIFwidmlzaWJsZVBhaW50ZWRcIixcbiAgICBcInZpc2libGVTdHJva2VcIiwgXCJ2aXN1YWxcIiwgXCJ3LXJlc2l6ZVwiLCBcIndhaXRcIiwgXCJ3YXZlXCIsIFwid2lkZXJcIixcbiAgICBcIndpbmRvd1wiLCBcIndpbmRvd2ZyYW1lXCIsIFwid2luZG93dGV4dFwiLCBcIndvcmRzXCIsIFwid3JhcFwiLCBcIndyYXAtcmV2ZXJzZVwiLCBcIngtbGFyZ2VcIiwgXCJ4LXNtYWxsXCIsIFwieG9yXCIsXG4gICAgXCJ4eC1sYXJnZVwiLCBcInh4LXNtYWxsXCJcbiAgXSwgdmFsdWVLZXl3b3JkcyA9IGtleVNldCh2YWx1ZUtleXdvcmRzXyk7XG5cbiAgdmFyIGFsbFdvcmRzID0gZG9jdW1lbnRUeXBlc18uY29uY2F0KG1lZGlhVHlwZXNfKS5jb25jYXQobWVkaWFGZWF0dXJlc18pLmNvbmNhdChtZWRpYVZhbHVlS2V5d29yZHNfKVxuICAgIC5jb25jYXQocHJvcGVydHlLZXl3b3Jkc18pLmNvbmNhdChub25TdGFuZGFyZFByb3BlcnR5S2V5d29yZHNfKS5jb25jYXQoY29sb3JLZXl3b3Jkc18pXG4gICAgLmNvbmNhdCh2YWx1ZUtleXdvcmRzXyk7XG4gIENvZGVNaXJyb3IucmVnaXN0ZXJIZWxwZXIoXCJoaW50V29yZHNcIiwgXCJjc3NcIiwgYWxsV29yZHMpO1xuXG4gIGZ1bmN0aW9uIHRva2VuQ0NvbW1lbnQoc3RyZWFtLCBzdGF0ZSkge1xuICAgIHZhciBtYXliZUVuZCA9IGZhbHNlLCBjaDtcbiAgICB3aGlsZSAoKGNoID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkge1xuICAgICAgaWYgKG1heWJlRW5kICYmIGNoID09IFwiL1wiKSB7XG4gICAgICAgIHN0YXRlLnRva2VuaXplID0gbnVsbDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBtYXliZUVuZCA9IChjaCA9PSBcIipcIik7XG4gICAgfVxuICAgIHJldHVybiBbXCJjb21tZW50XCIsIFwiY29tbWVudFwiXTtcbiAgfVxuXG4gIENvZGVNaXJyb3IuZGVmaW5lTUlNRShcInRleHQvY3NzXCIsIHtcbiAgICBkb2N1bWVudFR5cGVzOiBkb2N1bWVudFR5cGVzLFxuICAgIG1lZGlhVHlwZXM6IG1lZGlhVHlwZXMsXG4gICAgbWVkaWFGZWF0dXJlczogbWVkaWFGZWF0dXJlcyxcbiAgICBtZWRpYVZhbHVlS2V5d29yZHM6IG1lZGlhVmFsdWVLZXl3b3JkcyxcbiAgICBwcm9wZXJ0eUtleXdvcmRzOiBwcm9wZXJ0eUtleXdvcmRzLFxuICAgIG5vblN0YW5kYXJkUHJvcGVydHlLZXl3b3Jkczogbm9uU3RhbmRhcmRQcm9wZXJ0eUtleXdvcmRzLFxuICAgIGZvbnRQcm9wZXJ0aWVzOiBmb250UHJvcGVydGllcyxcbiAgICBjb3VudGVyRGVzY3JpcHRvcnM6IGNvdW50ZXJEZXNjcmlwdG9ycyxcbiAgICBjb2xvcktleXdvcmRzOiBjb2xvcktleXdvcmRzLFxuICAgIHZhbHVlS2V5d29yZHM6IHZhbHVlS2V5d29yZHMsXG4gICAgdG9rZW5Ib29rczoge1xuICAgICAgXCIvXCI6IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHtcbiAgICAgICAgaWYgKCFzdHJlYW0uZWF0KFwiKlwiKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQ0NvbW1lbnQ7XG4gICAgICAgIHJldHVybiB0b2tlbkNDb21tZW50KHN0cmVhbSwgc3RhdGUpO1xuICAgICAgfVxuICAgIH0sXG4gICAgbmFtZTogXCJjc3NcIlxuICB9KTtcblxuICBDb2RlTWlycm9yLmRlZmluZU1JTUUoXCJ0ZXh0L3gtc2Nzc1wiLCB7XG4gICAgbWVkaWFUeXBlczogbWVkaWFUeXBlcyxcbiAgICBtZWRpYUZlYXR1cmVzOiBtZWRpYUZlYXR1cmVzLFxuICAgIG1lZGlhVmFsdWVLZXl3b3JkczogbWVkaWFWYWx1ZUtleXdvcmRzLFxuICAgIHByb3BlcnR5S2V5d29yZHM6IHByb3BlcnR5S2V5d29yZHMsXG4gICAgbm9uU3RhbmRhcmRQcm9wZXJ0eUtleXdvcmRzOiBub25TdGFuZGFyZFByb3BlcnR5S2V5d29yZHMsXG4gICAgY29sb3JLZXl3b3JkczogY29sb3JLZXl3b3JkcyxcbiAgICB2YWx1ZUtleXdvcmRzOiB2YWx1ZUtleXdvcmRzLFxuICAgIGZvbnRQcm9wZXJ0aWVzOiBmb250UHJvcGVydGllcyxcbiAgICBhbGxvd05lc3RlZDogdHJ1ZSxcbiAgICBsaW5lQ29tbWVudDogXCIvL1wiLFxuICAgIHRva2VuSG9va3M6IHtcbiAgICAgIFwiL1wiOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7XG4gICAgICAgIGlmIChzdHJlYW0uZWF0KFwiL1wiKSkge1xuICAgICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTtcbiAgICAgICAgICByZXR1cm4gW1wiY29tbWVudFwiLCBcImNvbW1lbnRcIl07XG4gICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLmVhdChcIipcIikpIHtcbiAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQ0NvbW1lbnQ7XG4gICAgICAgICAgcmV0dXJuIHRva2VuQ0NvbW1lbnQoc3RyZWFtLCBzdGF0ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIFtcIm9wZXJhdG9yXCIsIFwib3BlcmF0b3JcIl07XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcIjpcIjogZnVuY3Rpb24oc3RyZWFtKSB7XG4gICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL1xccypcXHsvLCBmYWxzZSkpXG4gICAgICAgICAgcmV0dXJuIFtudWxsLCBudWxsXVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9LFxuICAgICAgXCIkXCI6IGZ1bmN0aW9uKHN0cmVhbSkge1xuICAgICAgICBzdHJlYW0ubWF0Y2goL15bXFx3LV0rLyk7XG4gICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15cXHMqOi8sIGZhbHNlKSlcbiAgICAgICAgICByZXR1cm4gW1widmFyaWFibGUtMlwiLCBcInZhcmlhYmxlLWRlZmluaXRpb25cIl07XG4gICAgICAgIHJldHVybiBbXCJ2YXJpYWJsZS0yXCIsIFwidmFyaWFibGVcIl07XG4gICAgICB9LFxuICAgICAgXCIjXCI6IGZ1bmN0aW9uKHN0cmVhbSkge1xuICAgICAgICBpZiAoIXN0cmVhbS5lYXQoXCJ7XCIpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBbbnVsbCwgXCJpbnRlcnBvbGF0aW9uXCJdO1xuICAgICAgfVxuICAgIH0sXG4gICAgbmFtZTogXCJjc3NcIixcbiAgICBoZWxwZXJUeXBlOiBcInNjc3NcIlxuICB9KTtcblxuICBDb2RlTWlycm9yLmRlZmluZU1JTUUoXCJ0ZXh0L3gtbGVzc1wiLCB7XG4gICAgbWVkaWFUeXBlczogbWVkaWFUeXBlcyxcbiAgICBtZWRpYUZlYXR1cmVzOiBtZWRpYUZlYXR1cmVzLFxuICAgIG1lZGlhVmFsdWVLZXl3b3JkczogbWVkaWFWYWx1ZUtleXdvcmRzLFxuICAgIHByb3BlcnR5S2V5d29yZHM6IHByb3BlcnR5S2V5d29yZHMsXG4gICAgbm9uU3RhbmRhcmRQcm9wZXJ0eUtleXdvcmRzOiBub25TdGFuZGFyZFByb3BlcnR5S2V5d29yZHMsXG4gICAgY29sb3JLZXl3b3JkczogY29sb3JLZXl3b3JkcyxcbiAgICB2YWx1ZUtleXdvcmRzOiB2YWx1ZUtleXdvcmRzLFxuICAgIGZvbnRQcm9wZXJ0aWVzOiBmb250UHJvcGVydGllcyxcbiAgICBhbGxvd05lc3RlZDogdHJ1ZSxcbiAgICBsaW5lQ29tbWVudDogXCIvL1wiLFxuICAgIHRva2VuSG9va3M6IHtcbiAgICAgIFwiL1wiOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7XG4gICAgICAgIGlmIChzdHJlYW0uZWF0KFwiL1wiKSkge1xuICAgICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTtcbiAgICAgICAgICByZXR1cm4gW1wiY29tbWVudFwiLCBcImNvbW1lbnRcIl07XG4gICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLmVhdChcIipcIikpIHtcbiAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQ0NvbW1lbnQ7XG4gICAgICAgICAgcmV0dXJuIHRva2VuQ0NvbW1lbnQoc3RyZWFtLCBzdGF0ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIFtcIm9wZXJhdG9yXCIsIFwib3BlcmF0b3JcIl07XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcIkBcIjogZnVuY3Rpb24oc3RyZWFtKSB7XG4gICAgICAgIGlmIChzdHJlYW0uZWF0KFwie1wiKSkgcmV0dXJuIFtudWxsLCBcImludGVycG9sYXRpb25cIl07XG4gICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14oY2hhcnNldHxkb2N1bWVudHxmb250LWZhY2V8aW1wb3J0fCgtKG1venxtc3xvfHdlYmtpdCktKT9rZXlmcmFtZXN8bWVkaWF8bmFtZXNwYWNlfHBhZ2V8c3VwcG9ydHMpXFxiL2ksIGZhbHNlKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcXHdcXFxcXFwtXS8pO1xuICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eXFxzKjovLCBmYWxzZSkpXG4gICAgICAgICAgcmV0dXJuIFtcInZhcmlhYmxlLTJcIiwgXCJ2YXJpYWJsZS1kZWZpbml0aW9uXCJdO1xuICAgICAgICByZXR1cm4gW1widmFyaWFibGUtMlwiLCBcInZhcmlhYmxlXCJdO1xuICAgICAgfSxcbiAgICAgIFwiJlwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIFtcImF0b21cIiwgXCJhdG9tXCJdO1xuICAgICAgfVxuICAgIH0sXG4gICAgbmFtZTogXCJjc3NcIixcbiAgICBoZWxwZXJUeXBlOiBcImxlc3NcIlxuICB9KTtcblxuICBDb2RlTWlycm9yLmRlZmluZU1JTUUoXCJ0ZXh0L3gtZ3NzXCIsIHtcbiAgICBkb2N1bWVudFR5cGVzOiBkb2N1bWVudFR5cGVzLFxuICAgIG1lZGlhVHlwZXM6IG1lZGlhVHlwZXMsXG4gICAgbWVkaWFGZWF0dXJlczogbWVkaWFGZWF0dXJlcyxcbiAgICBwcm9wZXJ0eUtleXdvcmRzOiBwcm9wZXJ0eUtleXdvcmRzLFxuICAgIG5vblN0YW5kYXJkUHJvcGVydHlLZXl3b3Jkczogbm9uU3RhbmRhcmRQcm9wZXJ0eUtleXdvcmRzLFxuICAgIGZvbnRQcm9wZXJ0aWVzOiBmb250UHJvcGVydGllcyxcbiAgICBjb3VudGVyRGVzY3JpcHRvcnM6IGNvdW50ZXJEZXNjcmlwdG9ycyxcbiAgICBjb2xvcktleXdvcmRzOiBjb2xvcktleXdvcmRzLFxuICAgIHZhbHVlS2V5d29yZHM6IHZhbHVlS2V5d29yZHMsXG4gICAgc3VwcG9ydHNBdENvbXBvbmVudDogdHJ1ZSxcbiAgICB0b2tlbkhvb2tzOiB7XG4gICAgICBcIi9cIjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkge1xuICAgICAgICBpZiAoIXN0cmVhbS5lYXQoXCIqXCIpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5DQ29tbWVudDtcbiAgICAgICAgcmV0dXJuIHRva2VuQ0NvbW1lbnQoc3RyZWFtLCBzdGF0ZSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBuYW1lOiBcImNzc1wiLFxuICAgIGhlbHBlclR5cGU6IFwiZ3NzXCJcbiAgfSk7XG5cbn0pO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/codemirror/mode/css/css.js\n"); +eval("// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n if (true) // CommonJS\n mod(__webpack_require__(/*! ../../lib/codemirror */ \"./node_modules/codemirror/lib/codemirror.js\"));\n else {}\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"css\", function(config, parserConfig) {\n var inline = parserConfig.inline\n if (!parserConfig.propertyKeywords) parserConfig = CodeMirror.resolveMode(\"text/css\");\n\n var indentUnit = config.indentUnit,\n tokenHooks = parserConfig.tokenHooks,\n documentTypes = parserConfig.documentTypes || {},\n mediaTypes = parserConfig.mediaTypes || {},\n mediaFeatures = parserConfig.mediaFeatures || {},\n mediaValueKeywords = parserConfig.mediaValueKeywords || {},\n propertyKeywords = parserConfig.propertyKeywords || {},\n nonStandardPropertyKeywords = parserConfig.nonStandardPropertyKeywords || {},\n fontProperties = parserConfig.fontProperties || {},\n counterDescriptors = parserConfig.counterDescriptors || {},\n colorKeywords = parserConfig.colorKeywords || {},\n valueKeywords = parserConfig.valueKeywords || {},\n allowNested = parserConfig.allowNested,\n lineComment = parserConfig.lineComment,\n supportsAtComponent = parserConfig.supportsAtComponent === true,\n highlightNonStandardPropertyKeywords = config.highlightNonStandardPropertyKeywords !== false;\n\n var type, override;\n function ret(style, tp) { type = tp; return style; }\n\n // Tokenizers\n\n function tokenBase(stream, state) {\n var ch = stream.next();\n if (tokenHooks[ch]) {\n var result = tokenHooks[ch](stream, state);\n if (result !== false) return result;\n }\n if (ch == \"@\") {\n stream.eatWhile(/[\\w\\\\\\-]/);\n return ret(\"def\", stream.current());\n } else if (ch == \"=\" || (ch == \"~\" || ch == \"|\") && stream.eat(\"=\")) {\n return ret(null, \"compare\");\n } else if (ch == \"\\\"\" || ch == \"'\") {\n state.tokenize = tokenString(ch);\n return state.tokenize(stream, state);\n } else if (ch == \"#\") {\n stream.eatWhile(/[\\w\\\\\\-]/);\n return ret(\"atom\", \"hash\");\n } else if (ch == \"!\") {\n stream.match(/^\\s*\\w*/);\n return ret(\"keyword\", \"important\");\n } else if (/\\d/.test(ch) || ch == \".\" && stream.eat(/\\d/)) {\n stream.eatWhile(/[\\w.%]/);\n return ret(\"number\", \"unit\");\n } else if (ch === \"-\") {\n if (/[\\d.]/.test(stream.peek())) {\n stream.eatWhile(/[\\w.%]/);\n return ret(\"number\", \"unit\");\n } else if (stream.match(/^-[\\w\\\\\\-]*/)) {\n stream.eatWhile(/[\\w\\\\\\-]/);\n if (stream.match(/^\\s*:/, false))\n return ret(\"variable-2\", \"variable-definition\");\n return ret(\"variable-2\", \"variable\");\n } else if (stream.match(/^\\w+-/)) {\n return ret(\"meta\", \"meta\");\n }\n } else if (/[,+>*\\/]/.test(ch)) {\n return ret(null, \"select-op\");\n } else if (ch == \".\" && stream.match(/^-?[_a-z][_a-z0-9-]*/i)) {\n return ret(\"qualifier\", \"qualifier\");\n } else if (/[:;{}\\[\\]\\(\\)]/.test(ch)) {\n return ret(null, ch);\n } else if (stream.match(/^[\\w-.]+(?=\\()/)) {\n if (/^(url(-prefix)?|domain|regexp)$/i.test(stream.current())) {\n state.tokenize = tokenParenthesized;\n }\n return ret(\"variable callee\", \"variable\");\n } else if (/[\\w\\\\\\-]/.test(ch)) {\n stream.eatWhile(/[\\w\\\\\\-]/);\n return ret(\"property\", \"word\");\n } else {\n return ret(null, null);\n }\n }\n\n function tokenString(quote) {\n return function(stream, state) {\n var escaped = false, ch;\n while ((ch = stream.next()) != null) {\n if (ch == quote && !escaped) {\n if (quote == \")\") stream.backUp(1);\n break;\n }\n escaped = !escaped && ch == \"\\\\\";\n }\n if (ch == quote || !escaped && quote != \")\") state.tokenize = null;\n return ret(\"string\", \"string\");\n };\n }\n\n function tokenParenthesized(stream, state) {\n stream.next(); // Must be '('\n if (!stream.match(/^\\s*[\\\"\\')]/, false))\n state.tokenize = tokenString(\")\");\n else\n state.tokenize = null;\n return ret(null, \"(\");\n }\n\n // Context management\n\n function Context(type, indent, prev) {\n this.type = type;\n this.indent = indent;\n this.prev = prev;\n }\n\n function pushContext(state, stream, type, indent) {\n state.context = new Context(type, stream.indentation() + (indent === false ? 0 : indentUnit), state.context);\n return type;\n }\n\n function popContext(state) {\n if (state.context.prev)\n state.context = state.context.prev;\n return state.context.type;\n }\n\n function pass(type, stream, state) {\n return states[state.context.type](type, stream, state);\n }\n function popAndPass(type, stream, state, n) {\n for (var i = n || 1; i > 0; i--)\n state.context = state.context.prev;\n return pass(type, stream, state);\n }\n\n // Parser\n\n function wordAsValue(stream) {\n var word = stream.current().toLowerCase();\n if (valueKeywords.hasOwnProperty(word))\n override = \"atom\";\n else if (colorKeywords.hasOwnProperty(word))\n override = \"keyword\";\n else\n override = \"variable\";\n }\n\n var states = {};\n\n states.top = function(type, stream, state) {\n if (type == \"{\") {\n return pushContext(state, stream, \"block\");\n } else if (type == \"}\" && state.context.prev) {\n return popContext(state);\n } else if (supportsAtComponent && /@component/i.test(type)) {\n return pushContext(state, stream, \"atComponentBlock\");\n } else if (/^@(-moz-)?document$/i.test(type)) {\n return pushContext(state, stream, \"documentTypes\");\n } else if (/^@(media|supports|(-moz-)?document|import)$/i.test(type)) {\n return pushContext(state, stream, \"atBlock\");\n } else if (/^@(font-face|counter-style)/i.test(type)) {\n state.stateArg = type;\n return \"restricted_atBlock_before\";\n } else if (/^@(-(moz|ms|o|webkit)-)?keyframes$/i.test(type)) {\n return \"keyframes\";\n } else if (type && type.charAt(0) == \"@\") {\n return pushContext(state, stream, \"at\");\n } else if (type == \"hash\") {\n override = \"builtin\";\n } else if (type == \"word\") {\n override = \"tag\";\n } else if (type == \"variable-definition\") {\n return \"maybeprop\";\n } else if (type == \"interpolation\") {\n return pushContext(state, stream, \"interpolation\");\n } else if (type == \":\") {\n return \"pseudo\";\n } else if (allowNested && type == \"(\") {\n return pushContext(state, stream, \"parens\");\n }\n return state.context.type;\n };\n\n states.block = function(type, stream, state) {\n if (type == \"word\") {\n var word = stream.current().toLowerCase();\n if (propertyKeywords.hasOwnProperty(word)) {\n override = \"property\";\n return \"maybeprop\";\n } else if (nonStandardPropertyKeywords.hasOwnProperty(word)) {\n override = highlightNonStandardPropertyKeywords ? \"string-2\" : \"property\";\n return \"maybeprop\";\n } else if (allowNested) {\n override = stream.match(/^\\s*:(?:\\s|$)/, false) ? \"property\" : \"tag\";\n return \"block\";\n } else {\n override += \" error\";\n return \"maybeprop\";\n }\n } else if (type == \"meta\") {\n return \"block\";\n } else if (!allowNested && (type == \"hash\" || type == \"qualifier\")) {\n override = \"error\";\n return \"block\";\n } else {\n return states.top(type, stream, state);\n }\n };\n\n states.maybeprop = function(type, stream, state) {\n if (type == \":\") return pushContext(state, stream, \"prop\");\n return pass(type, stream, state);\n };\n\n states.prop = function(type, stream, state) {\n if (type == \";\") return popContext(state);\n if (type == \"{\" && allowNested) return pushContext(state, stream, \"propBlock\");\n if (type == \"}\" || type == \"{\") return popAndPass(type, stream, state);\n if (type == \"(\") return pushContext(state, stream, \"parens\");\n\n if (type == \"hash\" && !/^#([0-9a-fA-f]{3,4}|[0-9a-fA-f]{6}|[0-9a-fA-f]{8})$/.test(stream.current())) {\n override += \" error\";\n } else if (type == \"word\") {\n wordAsValue(stream);\n } else if (type == \"interpolation\") {\n return pushContext(state, stream, \"interpolation\");\n }\n return \"prop\";\n };\n\n states.propBlock = function(type, _stream, state) {\n if (type == \"}\") return popContext(state);\n if (type == \"word\") { override = \"property\"; return \"maybeprop\"; }\n return state.context.type;\n };\n\n states.parens = function(type, stream, state) {\n if (type == \"{\" || type == \"}\") return popAndPass(type, stream, state);\n if (type == \")\") return popContext(state);\n if (type == \"(\") return pushContext(state, stream, \"parens\");\n if (type == \"interpolation\") return pushContext(state, stream, \"interpolation\");\n if (type == \"word\") wordAsValue(stream);\n return \"parens\";\n };\n\n states.pseudo = function(type, stream, state) {\n if (type == \"meta\") return \"pseudo\";\n\n if (type == \"word\") {\n override = \"variable-3\";\n return state.context.type;\n }\n return pass(type, stream, state);\n };\n\n states.documentTypes = function(type, stream, state) {\n if (type == \"word\" && documentTypes.hasOwnProperty(stream.current())) {\n override = \"tag\";\n return state.context.type;\n } else {\n return states.atBlock(type, stream, state);\n }\n };\n\n states.atBlock = function(type, stream, state) {\n if (type == \"(\") return pushContext(state, stream, \"atBlock_parens\");\n if (type == \"}\" || type == \";\") return popAndPass(type, stream, state);\n if (type == \"{\") return popContext(state) && pushContext(state, stream, allowNested ? \"block\" : \"top\");\n\n if (type == \"interpolation\") return pushContext(state, stream, \"interpolation\");\n\n if (type == \"word\") {\n var word = stream.current().toLowerCase();\n if (word == \"only\" || word == \"not\" || word == \"and\" || word == \"or\")\n override = \"keyword\";\n else if (mediaTypes.hasOwnProperty(word))\n override = \"attribute\";\n else if (mediaFeatures.hasOwnProperty(word))\n override = \"property\";\n else if (mediaValueKeywords.hasOwnProperty(word))\n override = \"keyword\";\n else if (propertyKeywords.hasOwnProperty(word))\n override = \"property\";\n else if (nonStandardPropertyKeywords.hasOwnProperty(word))\n override = highlightNonStandardPropertyKeywords ? \"string-2\" : \"property\";\n else if (valueKeywords.hasOwnProperty(word))\n override = \"atom\";\n else if (colorKeywords.hasOwnProperty(word))\n override = \"keyword\";\n else\n override = \"error\";\n }\n return state.context.type;\n };\n\n states.atComponentBlock = function(type, stream, state) {\n if (type == \"}\")\n return popAndPass(type, stream, state);\n if (type == \"{\")\n return popContext(state) && pushContext(state, stream, allowNested ? \"block\" : \"top\", false);\n if (type == \"word\")\n override = \"error\";\n return state.context.type;\n };\n\n states.atBlock_parens = function(type, stream, state) {\n if (type == \")\") return popContext(state);\n if (type == \"{\" || type == \"}\") return popAndPass(type, stream, state, 2);\n return states.atBlock(type, stream, state);\n };\n\n states.restricted_atBlock_before = function(type, stream, state) {\n if (type == \"{\")\n return pushContext(state, stream, \"restricted_atBlock\");\n if (type == \"word\" && state.stateArg == \"@counter-style\") {\n override = \"variable\";\n return \"restricted_atBlock_before\";\n }\n return pass(type, stream, state);\n };\n\n states.restricted_atBlock = function(type, stream, state) {\n if (type == \"}\") {\n state.stateArg = null;\n return popContext(state);\n }\n if (type == \"word\") {\n if ((state.stateArg == \"@font-face\" && !fontProperties.hasOwnProperty(stream.current().toLowerCase())) ||\n (state.stateArg == \"@counter-style\" && !counterDescriptors.hasOwnProperty(stream.current().toLowerCase())))\n override = \"error\";\n else\n override = \"property\";\n return \"maybeprop\";\n }\n return \"restricted_atBlock\";\n };\n\n states.keyframes = function(type, stream, state) {\n if (type == \"word\") { override = \"variable\"; return \"keyframes\"; }\n if (type == \"{\") return pushContext(state, stream, \"top\");\n return pass(type, stream, state);\n };\n\n states.at = function(type, stream, state) {\n if (type == \";\") return popContext(state);\n if (type == \"{\" || type == \"}\") return popAndPass(type, stream, state);\n if (type == \"word\") override = \"tag\";\n else if (type == \"hash\") override = \"builtin\";\n return \"at\";\n };\n\n states.interpolation = function(type, stream, state) {\n if (type == \"}\") return popContext(state);\n if (type == \"{\" || type == \";\") return popAndPass(type, stream, state);\n if (type == \"word\") override = \"variable\";\n else if (type != \"variable\" && type != \"(\" && type != \")\") override = \"error\";\n return \"interpolation\";\n };\n\n return {\n startState: function(base) {\n return {tokenize: null,\n state: inline ? \"block\" : \"top\",\n stateArg: null,\n context: new Context(inline ? \"block\" : \"top\", base || 0, null)};\n },\n\n token: function(stream, state) {\n if (!state.tokenize && stream.eatSpace()) return null;\n var style = (state.tokenize || tokenBase)(stream, state);\n if (style && typeof style == \"object\") {\n type = style[1];\n style = style[0];\n }\n override = style;\n if (type != \"comment\")\n state.state = states[state.state](type, stream, state);\n return override;\n },\n\n indent: function(state, textAfter) {\n var cx = state.context, ch = textAfter && textAfter.charAt(0);\n var indent = cx.indent;\n if (cx.type == \"prop\" && (ch == \"}\" || ch == \")\")) cx = cx.prev;\n if (cx.prev) {\n if (ch == \"}\" && (cx.type == \"block\" || cx.type == \"top\" ||\n cx.type == \"interpolation\" || cx.type == \"restricted_atBlock\")) {\n // Resume indentation from parent context.\n cx = cx.prev;\n indent = cx.indent;\n } else if (ch == \")\" && (cx.type == \"parens\" || cx.type == \"atBlock_parens\") ||\n ch == \"{\" && (cx.type == \"at\" || cx.type == \"atBlock\")) {\n // Dedent relative to current context.\n indent = Math.max(0, cx.indent - indentUnit);\n }\n }\n return indent;\n },\n\n electricChars: \"}\",\n blockCommentStart: \"/*\",\n blockCommentEnd: \"*/\",\n blockCommentContinue: \" * \",\n lineComment: lineComment,\n fold: \"brace\"\n };\n});\n\n function keySet(array) {\n var keys = {};\n for (var i = 0; i < array.length; ++i) {\n keys[array[i].toLowerCase()] = true;\n }\n return keys;\n }\n\n var documentTypes_ = [\n \"domain\", \"regexp\", \"url\", \"url-prefix\"\n ], documentTypes = keySet(documentTypes_);\n\n var mediaTypes_ = [\n \"all\", \"aural\", \"braille\", \"handheld\", \"print\", \"projection\", \"screen\",\n \"tty\", \"tv\", \"embossed\"\n ], mediaTypes = keySet(mediaTypes_);\n\n var mediaFeatures_ = [\n \"width\", \"min-width\", \"max-width\", \"height\", \"min-height\", \"max-height\",\n \"device-width\", \"min-device-width\", \"max-device-width\", \"device-height\",\n \"min-device-height\", \"max-device-height\", \"aspect-ratio\",\n \"min-aspect-ratio\", \"max-aspect-ratio\", \"device-aspect-ratio\",\n \"min-device-aspect-ratio\", \"max-device-aspect-ratio\", \"color\", \"min-color\",\n \"max-color\", \"color-index\", \"min-color-index\", \"max-color-index\",\n \"monochrome\", \"min-monochrome\", \"max-monochrome\", \"resolution\",\n \"min-resolution\", \"max-resolution\", \"scan\", \"grid\", \"orientation\",\n \"device-pixel-ratio\", \"min-device-pixel-ratio\", \"max-device-pixel-ratio\",\n \"pointer\", \"any-pointer\", \"hover\", \"any-hover\", \"prefers-color-scheme\"\n ], mediaFeatures = keySet(mediaFeatures_);\n\n var mediaValueKeywords_ = [\n \"landscape\", \"portrait\", \"none\", \"coarse\", \"fine\", \"on-demand\", \"hover\",\n \"interlace\", \"progressive\",\n \"dark\", \"light\"\n ], mediaValueKeywords = keySet(mediaValueKeywords_);\n\n var propertyKeywords_ = [\n \"align-content\", \"align-items\", \"align-self\", \"alignment-adjust\",\n \"alignment-baseline\", \"all\", \"anchor-point\", \"animation\", \"animation-delay\",\n \"animation-direction\", \"animation-duration\", \"animation-fill-mode\",\n \"animation-iteration-count\", \"animation-name\", \"animation-play-state\",\n \"animation-timing-function\", \"appearance\", \"azimuth\", \"backdrop-filter\",\n \"backface-visibility\", \"background\", \"background-attachment\",\n \"background-blend-mode\", \"background-clip\", \"background-color\",\n \"background-image\", \"background-origin\", \"background-position\",\n \"background-position-x\", \"background-position-y\", \"background-repeat\",\n \"background-size\", \"baseline-shift\", \"binding\", \"bleed\", \"block-size\",\n \"bookmark-label\", \"bookmark-level\", \"bookmark-state\", \"bookmark-target\",\n \"border\", \"border-bottom\", \"border-bottom-color\", \"border-bottom-left-radius\",\n \"border-bottom-right-radius\", \"border-bottom-style\", \"border-bottom-width\",\n \"border-collapse\", \"border-color\", \"border-image\", \"border-image-outset\",\n \"border-image-repeat\", \"border-image-slice\", \"border-image-source\",\n \"border-image-width\", \"border-left\", \"border-left-color\", \"border-left-style\",\n \"border-left-width\", \"border-radius\", \"border-right\", \"border-right-color\",\n \"border-right-style\", \"border-right-width\", \"border-spacing\", \"border-style\",\n \"border-top\", \"border-top-color\", \"border-top-left-radius\",\n \"border-top-right-radius\", \"border-top-style\", \"border-top-width\",\n \"border-width\", \"bottom\", \"box-decoration-break\", \"box-shadow\", \"box-sizing\",\n \"break-after\", \"break-before\", \"break-inside\", \"caption-side\", \"caret-color\",\n \"clear\", \"clip\", \"color\", \"color-profile\", \"column-count\", \"column-fill\",\n \"column-gap\", \"column-rule\", \"column-rule-color\", \"column-rule-style\",\n \"column-rule-width\", \"column-span\", \"column-width\", \"columns\", \"contain\",\n \"content\", \"counter-increment\", \"counter-reset\", \"crop\", \"cue\", \"cue-after\",\n \"cue-before\", \"cursor\", \"direction\", \"display\", \"dominant-baseline\",\n \"drop-initial-after-adjust\", \"drop-initial-after-align\",\n \"drop-initial-before-adjust\", \"drop-initial-before-align\", \"drop-initial-size\",\n \"drop-initial-value\", \"elevation\", \"empty-cells\", \"fit\", \"fit-position\",\n \"flex\", \"flex-basis\", \"flex-direction\", \"flex-flow\", \"flex-grow\",\n \"flex-shrink\", \"flex-wrap\", \"float\", \"float-offset\", \"flow-from\", \"flow-into\",\n \"font\", \"font-family\", \"font-feature-settings\", \"font-kerning\",\n \"font-language-override\", \"font-optical-sizing\", \"font-size\",\n \"font-size-adjust\", \"font-stretch\", \"font-style\", \"font-synthesis\",\n \"font-variant\", \"font-variant-alternates\", \"font-variant-caps\",\n \"font-variant-east-asian\", \"font-variant-ligatures\", \"font-variant-numeric\",\n \"font-variant-position\", \"font-variation-settings\", \"font-weight\", \"gap\",\n \"grid\", \"grid-area\", \"grid-auto-columns\", \"grid-auto-flow\", \"grid-auto-rows\",\n \"grid-column\", \"grid-column-end\", \"grid-column-gap\", \"grid-column-start\",\n \"grid-gap\", \"grid-row\", \"grid-row-end\", \"grid-row-gap\", \"grid-row-start\",\n \"grid-template\", \"grid-template-areas\", \"grid-template-columns\",\n \"grid-template-rows\", \"hanging-punctuation\", \"height\", \"hyphens\", \"icon\",\n \"image-orientation\", \"image-rendering\", \"image-resolution\", \"inline-box-align\",\n \"inset\", \"inset-block\", \"inset-block-end\", \"inset-block-start\", \"inset-inline\",\n \"inset-inline-end\", \"inset-inline-start\", \"isolation\", \"justify-content\",\n \"justify-items\", \"justify-self\", \"left\", \"letter-spacing\", \"line-break\",\n \"line-height\", \"line-height-step\", \"line-stacking\", \"line-stacking-ruby\",\n \"line-stacking-shift\", \"line-stacking-strategy\", \"list-style\",\n \"list-style-image\", \"list-style-position\", \"list-style-type\", \"margin\",\n \"margin-bottom\", \"margin-left\", \"margin-right\", \"margin-top\", \"marks\",\n \"marquee-direction\", \"marquee-loop\", \"marquee-play-count\", \"marquee-speed\",\n \"marquee-style\", \"mask-clip\", \"mask-composite\", \"mask-image\", \"mask-mode\",\n \"mask-origin\", \"mask-position\", \"mask-repeat\", \"mask-size\",\"mask-type\",\n \"max-block-size\", \"max-height\", \"max-inline-size\",\n \"max-width\", \"min-block-size\", \"min-height\", \"min-inline-size\", \"min-width\",\n \"mix-blend-mode\", \"move-to\", \"nav-down\", \"nav-index\", \"nav-left\", \"nav-right\",\n \"nav-up\", \"object-fit\", \"object-position\", \"offset\", \"offset-anchor\",\n \"offset-distance\", \"offset-path\", \"offset-position\", \"offset-rotate\",\n \"opacity\", \"order\", \"orphans\", \"outline\", \"outline-color\", \"outline-offset\",\n \"outline-style\", \"outline-width\", \"overflow\", \"overflow-style\",\n \"overflow-wrap\", \"overflow-x\", \"overflow-y\", \"padding\", \"padding-bottom\",\n \"padding-left\", \"padding-right\", \"padding-top\", \"page\", \"page-break-after\",\n \"page-break-before\", \"page-break-inside\", \"page-policy\", \"pause\",\n \"pause-after\", \"pause-before\", \"perspective\", \"perspective-origin\", \"pitch\",\n \"pitch-range\", \"place-content\", \"place-items\", \"place-self\", \"play-during\",\n \"position\", \"presentation-level\", \"punctuation-trim\", \"quotes\",\n \"region-break-after\", \"region-break-before\", \"region-break-inside\",\n \"region-fragment\", \"rendering-intent\", \"resize\", \"rest\", \"rest-after\",\n \"rest-before\", \"richness\", \"right\", \"rotate\", \"rotation\", \"rotation-point\",\n \"row-gap\", \"ruby-align\", \"ruby-overhang\", \"ruby-position\", \"ruby-span\",\n \"scale\", \"scroll-behavior\", \"scroll-margin\", \"scroll-margin-block\",\n \"scroll-margin-block-end\", \"scroll-margin-block-start\", \"scroll-margin-bottom\",\n \"scroll-margin-inline\", \"scroll-margin-inline-end\",\n \"scroll-margin-inline-start\", \"scroll-margin-left\", \"scroll-margin-right\",\n \"scroll-margin-top\", \"scroll-padding\", \"scroll-padding-block\",\n \"scroll-padding-block-end\", \"scroll-padding-block-start\",\n \"scroll-padding-bottom\", \"scroll-padding-inline\", \"scroll-padding-inline-end\",\n \"scroll-padding-inline-start\", \"scroll-padding-left\", \"scroll-padding-right\",\n \"scroll-padding-top\", \"scroll-snap-align\", \"scroll-snap-type\",\n \"shape-image-threshold\", \"shape-inside\", \"shape-margin\", \"shape-outside\",\n \"size\", \"speak\", \"speak-as\", \"speak-header\", \"speak-numeral\",\n \"speak-punctuation\", \"speech-rate\", \"stress\", \"string-set\", \"tab-size\",\n \"table-layout\", \"target\", \"target-name\", \"target-new\", \"target-position\",\n \"text-align\", \"text-align-last\", \"text-combine-upright\", \"text-decoration\",\n \"text-decoration-color\", \"text-decoration-line\", \"text-decoration-skip\",\n \"text-decoration-skip-ink\", \"text-decoration-style\", \"text-emphasis\",\n \"text-emphasis-color\", \"text-emphasis-position\", \"text-emphasis-style\",\n \"text-height\", \"text-indent\", \"text-justify\", \"text-orientation\",\n \"text-outline\", \"text-overflow\", \"text-rendering\", \"text-shadow\",\n \"text-size-adjust\", \"text-space-collapse\", \"text-transform\",\n \"text-underline-position\", \"text-wrap\", \"top\", \"touch-action\", \"transform\", \"transform-origin\",\n \"transform-style\", \"transition\", \"transition-delay\", \"transition-duration\",\n \"transition-property\", \"transition-timing-function\", \"translate\",\n \"unicode-bidi\", \"user-select\", \"vertical-align\", \"visibility\", \"voice-balance\",\n \"voice-duration\", \"voice-family\", \"voice-pitch\", \"voice-range\", \"voice-rate\",\n \"voice-stress\", \"voice-volume\", \"volume\", \"white-space\", \"widows\", \"width\",\n \"will-change\", \"word-break\", \"word-spacing\", \"word-wrap\", \"writing-mode\", \"z-index\",\n // SVG-specific\n \"clip-path\", \"clip-rule\", \"mask\", \"enable-background\", \"filter\", \"flood-color\",\n \"flood-opacity\", \"lighting-color\", \"stop-color\", \"stop-opacity\", \"pointer-events\",\n \"color-interpolation\", \"color-interpolation-filters\",\n \"color-rendering\", \"fill\", \"fill-opacity\", \"fill-rule\", \"image-rendering\",\n \"marker\", \"marker-end\", \"marker-mid\", \"marker-start\", \"paint-order\", \"shape-rendering\", \"stroke\",\n \"stroke-dasharray\", \"stroke-dashoffset\", \"stroke-linecap\", \"stroke-linejoin\",\n \"stroke-miterlimit\", \"stroke-opacity\", \"stroke-width\", \"text-rendering\",\n \"baseline-shift\", \"dominant-baseline\", \"glyph-orientation-horizontal\",\n \"glyph-orientation-vertical\", \"text-anchor\", \"writing-mode\",\n ], propertyKeywords = keySet(propertyKeywords_);\n\n var nonStandardPropertyKeywords_ = [\n \"border-block\", \"border-block-color\", \"border-block-end\",\n \"border-block-end-color\", \"border-block-end-style\", \"border-block-end-width\",\n \"border-block-start\", \"border-block-start-color\", \"border-block-start-style\",\n \"border-block-start-width\", \"border-block-style\", \"border-block-width\",\n \"border-inline\", \"border-inline-color\", \"border-inline-end\",\n \"border-inline-end-color\", \"border-inline-end-style\",\n \"border-inline-end-width\", \"border-inline-start\", \"border-inline-start-color\",\n \"border-inline-start-style\", \"border-inline-start-width\",\n \"border-inline-style\", \"border-inline-width\", \"margin-block\",\n \"margin-block-end\", \"margin-block-start\", \"margin-inline\", \"margin-inline-end\",\n \"margin-inline-start\", \"padding-block\", \"padding-block-end\",\n \"padding-block-start\", \"padding-inline\", \"padding-inline-end\",\n \"padding-inline-start\", \"scroll-snap-stop\", \"scrollbar-3d-light-color\",\n \"scrollbar-arrow-color\", \"scrollbar-base-color\", \"scrollbar-dark-shadow-color\",\n \"scrollbar-face-color\", \"scrollbar-highlight-color\", \"scrollbar-shadow-color\",\n \"scrollbar-track-color\", \"searchfield-cancel-button\", \"searchfield-decoration\",\n \"searchfield-results-button\", \"searchfield-results-decoration\", \"shape-inside\", \"zoom\"\n ], nonStandardPropertyKeywords = keySet(nonStandardPropertyKeywords_);\n\n var fontProperties_ = [\n \"font-display\", \"font-family\", \"src\", \"unicode-range\", \"font-variant\",\n \"font-feature-settings\", \"font-stretch\", \"font-weight\", \"font-style\"\n ], fontProperties = keySet(fontProperties_);\n\n var counterDescriptors_ = [\n \"additive-symbols\", \"fallback\", \"negative\", \"pad\", \"prefix\", \"range\",\n \"speak-as\", \"suffix\", \"symbols\", \"system\"\n ], counterDescriptors = keySet(counterDescriptors_);\n\n var colorKeywords_ = [\n \"aliceblue\", \"antiquewhite\", \"aqua\", \"aquamarine\", \"azure\", \"beige\",\n \"bisque\", \"black\", \"blanchedalmond\", \"blue\", \"blueviolet\", \"brown\",\n \"burlywood\", \"cadetblue\", \"chartreuse\", \"chocolate\", \"coral\", \"cornflowerblue\",\n \"cornsilk\", \"crimson\", \"cyan\", \"darkblue\", \"darkcyan\", \"darkgoldenrod\",\n \"darkgray\", \"darkgreen\", \"darkkhaki\", \"darkmagenta\", \"darkolivegreen\",\n \"darkorange\", \"darkorchid\", \"darkred\", \"darksalmon\", \"darkseagreen\",\n \"darkslateblue\", \"darkslategray\", \"darkturquoise\", \"darkviolet\",\n \"deeppink\", \"deepskyblue\", \"dimgray\", \"dodgerblue\", \"firebrick\",\n \"floralwhite\", \"forestgreen\", \"fuchsia\", \"gainsboro\", \"ghostwhite\",\n \"gold\", \"goldenrod\", \"gray\", \"grey\", \"green\", \"greenyellow\", \"honeydew\",\n \"hotpink\", \"indianred\", \"indigo\", \"ivory\", \"khaki\", \"lavender\",\n \"lavenderblush\", \"lawngreen\", \"lemonchiffon\", \"lightblue\", \"lightcoral\",\n \"lightcyan\", \"lightgoldenrodyellow\", \"lightgray\", \"lightgreen\", \"lightpink\",\n \"lightsalmon\", \"lightseagreen\", \"lightskyblue\", \"lightslategray\",\n \"lightsteelblue\", \"lightyellow\", \"lime\", \"limegreen\", \"linen\", \"magenta\",\n \"maroon\", \"mediumaquamarine\", \"mediumblue\", \"mediumorchid\", \"mediumpurple\",\n \"mediumseagreen\", \"mediumslateblue\", \"mediumspringgreen\", \"mediumturquoise\",\n \"mediumvioletred\", \"midnightblue\", \"mintcream\", \"mistyrose\", \"moccasin\",\n \"navajowhite\", \"navy\", \"oldlace\", \"olive\", \"olivedrab\", \"orange\", \"orangered\",\n \"orchid\", \"palegoldenrod\", \"palegreen\", \"paleturquoise\", \"palevioletred\",\n \"papayawhip\", \"peachpuff\", \"peru\", \"pink\", \"plum\", \"powderblue\",\n \"purple\", \"rebeccapurple\", \"red\", \"rosybrown\", \"royalblue\", \"saddlebrown\",\n \"salmon\", \"sandybrown\", \"seagreen\", \"seashell\", \"sienna\", \"silver\", \"skyblue\",\n \"slateblue\", \"slategray\", \"snow\", \"springgreen\", \"steelblue\", \"tan\",\n \"teal\", \"thistle\", \"tomato\", \"turquoise\", \"violet\", \"wheat\", \"white\",\n \"whitesmoke\", \"yellow\", \"yellowgreen\"\n ], colorKeywords = keySet(colorKeywords_);\n\n var valueKeywords_ = [\n \"above\", \"absolute\", \"activeborder\", \"additive\", \"activecaption\", \"afar\",\n \"after-white-space\", \"ahead\", \"alias\", \"all\", \"all-scroll\", \"alphabetic\", \"alternate\",\n \"always\", \"amharic\", \"amharic-abegede\", \"antialiased\", \"appworkspace\",\n \"arabic-indic\", \"armenian\", \"asterisks\", \"attr\", \"auto\", \"auto-flow\", \"avoid\", \"avoid-column\", \"avoid-page\",\n \"avoid-region\", \"axis-pan\", \"background\", \"backwards\", \"baseline\", \"below\", \"bidi-override\", \"binary\",\n \"bengali\", \"blink\", \"block\", \"block-axis\", \"bold\", \"bolder\", \"border\", \"border-box\",\n \"both\", \"bottom\", \"break\", \"break-all\", \"break-word\", \"bullets\", \"button\", \"button-bevel\",\n \"buttonface\", \"buttonhighlight\", \"buttonshadow\", \"buttontext\", \"calc\", \"cambodian\",\n \"capitalize\", \"caps-lock-indicator\", \"caption\", \"captiontext\", \"caret\",\n \"cell\", \"center\", \"checkbox\", \"circle\", \"cjk-decimal\", \"cjk-earthly-branch\",\n \"cjk-heavenly-stem\", \"cjk-ideographic\", \"clear\", \"clip\", \"close-quote\",\n \"col-resize\", \"collapse\", \"color\", \"color-burn\", \"color-dodge\", \"column\", \"column-reverse\",\n \"compact\", \"condensed\", \"contain\", \"content\", \"contents\",\n \"content-box\", \"context-menu\", \"continuous\", \"copy\", \"counter\", \"counters\", \"cover\", \"crop\",\n \"cross\", \"crosshair\", \"currentcolor\", \"cursive\", \"cyclic\", \"darken\", \"dashed\", \"decimal\",\n \"decimal-leading-zero\", \"default\", \"default-button\", \"dense\", \"destination-atop\",\n \"destination-in\", \"destination-out\", \"destination-over\", \"devanagari\", \"difference\",\n \"disc\", \"discard\", \"disclosure-closed\", \"disclosure-open\", \"document\",\n \"dot-dash\", \"dot-dot-dash\",\n \"dotted\", \"double\", \"down\", \"e-resize\", \"ease\", \"ease-in\", \"ease-in-out\", \"ease-out\",\n \"element\", \"ellipse\", \"ellipsis\", \"embed\", \"end\", \"ethiopic\", \"ethiopic-abegede\",\n \"ethiopic-abegede-am-et\", \"ethiopic-abegede-gez\", \"ethiopic-abegede-ti-er\",\n \"ethiopic-abegede-ti-et\", \"ethiopic-halehame-aa-er\",\n \"ethiopic-halehame-aa-et\", \"ethiopic-halehame-am-et\",\n \"ethiopic-halehame-gez\", \"ethiopic-halehame-om-et\",\n \"ethiopic-halehame-sid-et\", \"ethiopic-halehame-so-et\",\n \"ethiopic-halehame-ti-er\", \"ethiopic-halehame-ti-et\", \"ethiopic-halehame-tig\",\n \"ethiopic-numeric\", \"ew-resize\", \"exclusion\", \"expanded\", \"extends\", \"extra-condensed\",\n \"extra-expanded\", \"fantasy\", \"fast\", \"fill\", \"fill-box\", \"fixed\", \"flat\", \"flex\", \"flex-end\", \"flex-start\", \"footnotes\",\n \"forwards\", \"from\", \"geometricPrecision\", \"georgian\", \"graytext\", \"grid\", \"groove\",\n \"gujarati\", \"gurmukhi\", \"hand\", \"hangul\", \"hangul-consonant\", \"hard-light\", \"hebrew\",\n \"help\", \"hidden\", \"hide\", \"higher\", \"highlight\", \"highlighttext\",\n \"hiragana\", \"hiragana-iroha\", \"horizontal\", \"hsl\", \"hsla\", \"hue\", \"icon\", \"ignore\",\n \"inactiveborder\", \"inactivecaption\", \"inactivecaptiontext\", \"infinite\",\n \"infobackground\", \"infotext\", \"inherit\", \"initial\", \"inline\", \"inline-axis\",\n \"inline-block\", \"inline-flex\", \"inline-grid\", \"inline-table\", \"inset\", \"inside\", \"intrinsic\", \"invert\",\n \"italic\", \"japanese-formal\", \"japanese-informal\", \"justify\", \"kannada\",\n \"katakana\", \"katakana-iroha\", \"keep-all\", \"khmer\",\n \"korean-hangul-formal\", \"korean-hanja-formal\", \"korean-hanja-informal\",\n \"landscape\", \"lao\", \"large\", \"larger\", \"left\", \"level\", \"lighter\", \"lighten\",\n \"line-through\", \"linear\", \"linear-gradient\", \"lines\", \"list-item\", \"listbox\", \"listitem\",\n \"local\", \"logical\", \"loud\", \"lower\", \"lower-alpha\", \"lower-armenian\",\n \"lower-greek\", \"lower-hexadecimal\", \"lower-latin\", \"lower-norwegian\",\n \"lower-roman\", \"lowercase\", \"ltr\", \"luminosity\", \"malayalam\", \"manipulation\", \"match\", \"matrix\", \"matrix3d\",\n \"media-controls-background\", \"media-current-time-display\",\n \"media-fullscreen-button\", \"media-mute-button\", \"media-play-button\",\n \"media-return-to-realtime-button\", \"media-rewind-button\",\n \"media-seek-back-button\", \"media-seek-forward-button\", \"media-slider\",\n \"media-sliderthumb\", \"media-time-remaining-display\", \"media-volume-slider\",\n \"media-volume-slider-container\", \"media-volume-sliderthumb\", \"medium\",\n \"menu\", \"menulist\", \"menulist-button\", \"menulist-text\",\n \"menulist-textfield\", \"menutext\", \"message-box\", \"middle\", \"min-intrinsic\",\n \"mix\", \"mongolian\", \"monospace\", \"move\", \"multiple\", \"multiple_mask_images\", \"multiply\", \"myanmar\", \"n-resize\",\n \"narrower\", \"ne-resize\", \"nesw-resize\", \"no-close-quote\", \"no-drop\",\n \"no-open-quote\", \"no-repeat\", \"none\", \"normal\", \"not-allowed\", \"nowrap\",\n \"ns-resize\", \"numbers\", \"numeric\", \"nw-resize\", \"nwse-resize\", \"oblique\", \"octal\", \"opacity\", \"open-quote\",\n \"optimizeLegibility\", \"optimizeSpeed\", \"oriya\", \"oromo\", \"outset\",\n \"outside\", \"outside-shape\", \"overlay\", \"overline\", \"padding\", \"padding-box\",\n \"painted\", \"page\", \"paused\", \"persian\", \"perspective\", \"pinch-zoom\", \"plus-darker\", \"plus-lighter\",\n \"pointer\", \"polygon\", \"portrait\", \"pre\", \"pre-line\", \"pre-wrap\", \"preserve-3d\",\n \"progress\", \"push-button\", \"radial-gradient\", \"radio\", \"read-only\",\n \"read-write\", \"read-write-plaintext-only\", \"rectangle\", \"region\",\n \"relative\", \"repeat\", \"repeating-linear-gradient\",\n \"repeating-radial-gradient\", \"repeat-x\", \"repeat-y\", \"reset\", \"reverse\",\n \"rgb\", \"rgba\", \"ridge\", \"right\", \"rotate\", \"rotate3d\", \"rotateX\", \"rotateY\",\n \"rotateZ\", \"round\", \"row\", \"row-resize\", \"row-reverse\", \"rtl\", \"run-in\", \"running\",\n \"s-resize\", \"sans-serif\", \"saturation\", \"scale\", \"scale3d\", \"scaleX\", \"scaleY\", \"scaleZ\", \"screen\",\n \"scroll\", \"scrollbar\", \"scroll-position\", \"se-resize\", \"searchfield\",\n \"searchfield-cancel-button\", \"searchfield-decoration\",\n \"searchfield-results-button\", \"searchfield-results-decoration\", \"self-start\", \"self-end\",\n \"semi-condensed\", \"semi-expanded\", \"separate\", \"serif\", \"show\", \"sidama\",\n \"simp-chinese-formal\", \"simp-chinese-informal\", \"single\",\n \"skew\", \"skewX\", \"skewY\", \"skip-white-space\", \"slide\", \"slider-horizontal\",\n \"slider-vertical\", \"sliderthumb-horizontal\", \"sliderthumb-vertical\", \"slow\",\n \"small\", \"small-caps\", \"small-caption\", \"smaller\", \"soft-light\", \"solid\", \"somali\",\n \"source-atop\", \"source-in\", \"source-out\", \"source-over\", \"space\", \"space-around\", \"space-between\", \"space-evenly\", \"spell-out\", \"square\",\n \"square-button\", \"start\", \"static\", \"status-bar\", \"stretch\", \"stroke\", \"stroke-box\", \"sub\",\n \"subpixel-antialiased\", \"svg_masks\", \"super\", \"sw-resize\", \"symbolic\", \"symbols\", \"system-ui\", \"table\",\n \"table-caption\", \"table-cell\", \"table-column\", \"table-column-group\",\n \"table-footer-group\", \"table-header-group\", \"table-row\", \"table-row-group\",\n \"tamil\",\n \"telugu\", \"text\", \"text-bottom\", \"text-top\", \"textarea\", \"textfield\", \"thai\",\n \"thick\", \"thin\", \"threeddarkshadow\", \"threedface\", \"threedhighlight\",\n \"threedlightshadow\", \"threedshadow\", \"tibetan\", \"tigre\", \"tigrinya-er\",\n \"tigrinya-er-abegede\", \"tigrinya-et\", \"tigrinya-et-abegede\", \"to\", \"top\",\n \"trad-chinese-formal\", \"trad-chinese-informal\", \"transform\",\n \"translate\", \"translate3d\", \"translateX\", \"translateY\", \"translateZ\",\n \"transparent\", \"ultra-condensed\", \"ultra-expanded\", \"underline\", \"unidirectional-pan\", \"unset\", \"up\",\n \"upper-alpha\", \"upper-armenian\", \"upper-greek\", \"upper-hexadecimal\",\n \"upper-latin\", \"upper-norwegian\", \"upper-roman\", \"uppercase\", \"urdu\", \"url\",\n \"var\", \"vertical\", \"vertical-text\", \"view-box\", \"visible\", \"visibleFill\", \"visiblePainted\",\n \"visibleStroke\", \"visual\", \"w-resize\", \"wait\", \"wave\", \"wider\",\n \"window\", \"windowframe\", \"windowtext\", \"words\", \"wrap\", \"wrap-reverse\", \"x-large\", \"x-small\", \"xor\",\n \"xx-large\", \"xx-small\"\n ], valueKeywords = keySet(valueKeywords_);\n\n var allWords = documentTypes_.concat(mediaTypes_).concat(mediaFeatures_).concat(mediaValueKeywords_)\n .concat(propertyKeywords_).concat(nonStandardPropertyKeywords_).concat(colorKeywords_)\n .concat(valueKeywords_);\n CodeMirror.registerHelper(\"hintWords\", \"css\", allWords);\n\n function tokenCComment(stream, state) {\n var maybeEnd = false, ch;\n while ((ch = stream.next()) != null) {\n if (maybeEnd && ch == \"/\") {\n state.tokenize = null;\n break;\n }\n maybeEnd = (ch == \"*\");\n }\n return [\"comment\", \"comment\"];\n }\n\n CodeMirror.defineMIME(\"text/css\", {\n documentTypes: documentTypes,\n mediaTypes: mediaTypes,\n mediaFeatures: mediaFeatures,\n mediaValueKeywords: mediaValueKeywords,\n propertyKeywords: propertyKeywords,\n nonStandardPropertyKeywords: nonStandardPropertyKeywords,\n fontProperties: fontProperties,\n counterDescriptors: counterDescriptors,\n colorKeywords: colorKeywords,\n valueKeywords: valueKeywords,\n tokenHooks: {\n \"/\": function(stream, state) {\n if (!stream.eat(\"*\")) return false;\n state.tokenize = tokenCComment;\n return tokenCComment(stream, state);\n }\n },\n name: \"css\"\n });\n\n CodeMirror.defineMIME(\"text/x-scss\", {\n mediaTypes: mediaTypes,\n mediaFeatures: mediaFeatures,\n mediaValueKeywords: mediaValueKeywords,\n propertyKeywords: propertyKeywords,\n nonStandardPropertyKeywords: nonStandardPropertyKeywords,\n colorKeywords: colorKeywords,\n valueKeywords: valueKeywords,\n fontProperties: fontProperties,\n allowNested: true,\n lineComment: \"//\",\n tokenHooks: {\n \"/\": function(stream, state) {\n if (stream.eat(\"/\")) {\n stream.skipToEnd();\n return [\"comment\", \"comment\"];\n } else if (stream.eat(\"*\")) {\n state.tokenize = tokenCComment;\n return tokenCComment(stream, state);\n } else {\n return [\"operator\", \"operator\"];\n }\n },\n \":\": function(stream) {\n if (stream.match(/^\\s*\\{/, false))\n return [null, null]\n return false;\n },\n \"$\": function(stream) {\n stream.match(/^[\\w-]+/);\n if (stream.match(/^\\s*:/, false))\n return [\"variable-2\", \"variable-definition\"];\n return [\"variable-2\", \"variable\"];\n },\n \"#\": function(stream) {\n if (!stream.eat(\"{\")) return false;\n return [null, \"interpolation\"];\n }\n },\n name: \"css\",\n helperType: \"scss\"\n });\n\n CodeMirror.defineMIME(\"text/x-less\", {\n mediaTypes: mediaTypes,\n mediaFeatures: mediaFeatures,\n mediaValueKeywords: mediaValueKeywords,\n propertyKeywords: propertyKeywords,\n nonStandardPropertyKeywords: nonStandardPropertyKeywords,\n colorKeywords: colorKeywords,\n valueKeywords: valueKeywords,\n fontProperties: fontProperties,\n allowNested: true,\n lineComment: \"//\",\n tokenHooks: {\n \"/\": function(stream, state) {\n if (stream.eat(\"/\")) {\n stream.skipToEnd();\n return [\"comment\", \"comment\"];\n } else if (stream.eat(\"*\")) {\n state.tokenize = tokenCComment;\n return tokenCComment(stream, state);\n } else {\n return [\"operator\", \"operator\"];\n }\n },\n \"@\": function(stream) {\n if (stream.eat(\"{\")) return [null, \"interpolation\"];\n if (stream.match(/^(charset|document|font-face|import|(-(moz|ms|o|webkit)-)?keyframes|media|namespace|page|supports)\\b/i, false)) return false;\n stream.eatWhile(/[\\w\\\\\\-]/);\n if (stream.match(/^\\s*:/, false))\n return [\"variable-2\", \"variable-definition\"];\n return [\"variable-2\", \"variable\"];\n },\n \"&\": function() {\n return [\"atom\", \"atom\"];\n }\n },\n name: \"css\",\n helperType: \"less\"\n });\n\n CodeMirror.defineMIME(\"text/x-gss\", {\n documentTypes: documentTypes,\n mediaTypes: mediaTypes,\n mediaFeatures: mediaFeatures,\n propertyKeywords: propertyKeywords,\n nonStandardPropertyKeywords: nonStandardPropertyKeywords,\n fontProperties: fontProperties,\n counterDescriptors: counterDescriptors,\n colorKeywords: colorKeywords,\n valueKeywords: valueKeywords,\n supportsAtComponent: true,\n tokenHooks: {\n \"/\": function(stream, state) {\n if (!stream.eat(\"*\")) return false;\n state.tokenize = tokenCComment;\n return tokenCComment(stream, state);\n }\n },\n name: \"css\",\n helperType: \"gss\"\n });\n\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vbm9kZV9tb2R1bGVzL2NvZGVtaXJyb3IvbW9kZS9jc3MvY3NzLmpzPzdiMDAiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7QUFFQTtBQUNBLE1BQU0sSUFBdUQ7QUFDN0QsUUFBUSxtQkFBTyxDQUFDLHlFQUFzQjtBQUN0QyxPQUFPLEVBR2E7QUFDcEIsQ0FBQztBQUNEOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esc0RBQXNEO0FBQ3RELGdEQUFnRDtBQUNoRCxzREFBc0Q7QUFDdEQsZ0VBQWdFO0FBQ2hFLDREQUE0RDtBQUM1RCxrRkFBa0Y7QUFDbEYsd0RBQXdEO0FBQ3hELGdFQUFnRTtBQUNoRSxzREFBc0Q7QUFDdEQsc0RBQXNEO0FBQ3REO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMkJBQTJCLFdBQVcsY0FBYzs7QUFFcEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLLGdCQUFnQjtBQUNyQjtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsT0FBTztBQUMvQjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0EsS0FBSyxvQkFBb0I7QUFDekI7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEIsa0JBQWtCLGVBQWU7QUFDakM7O0FBRUEsMkNBQTJDLElBQUksYUFBYSxFQUFFLGFBQWEsRUFBRTtBQUM3RTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQjtBQUNsQix5QkFBeUIsdUJBQXVCLG9CQUFvQjtBQUNwRTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLGVBQWU7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCLGVBQWU7QUFDakMsa0JBQWtCOztBQUVsQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQixlQUFlO0FBQ2pDO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx5QkFBeUIsdUJBQXVCLG9CQUFvQjtBQUNwRSxrQkFBa0I7QUFDbEI7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQjtBQUNsQixrQkFBa0IsZUFBZTtBQUNqQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQjtBQUNsQixrQkFBa0IsZUFBZTtBQUNqQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTCxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0EsbUJBQW1CLGtCQUFrQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7O0FBRUgsQ0FBQyIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9jb2RlbWlycm9yL21vZGUvY3NzL2Nzcy5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvZGVNaXJyb3IsIGNvcHlyaWdodCAoYykgYnkgTWFyaWpuIEhhdmVyYmVrZSBhbmQgb3RoZXJzXG4vLyBEaXN0cmlidXRlZCB1bmRlciBhbiBNSVQgbGljZW5zZTogaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFXG5cbihmdW5jdGlvbihtb2QpIHtcbiAgaWYgKHR5cGVvZiBleHBvcnRzID09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG1vZHVsZSA9PSBcIm9iamVjdFwiKSAvLyBDb21tb25KU1xuICAgIG1vZChyZXF1aXJlKFwiLi4vLi4vbGliL2NvZGVtaXJyb3JcIikpO1xuICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSAvLyBBTURcbiAgICBkZWZpbmUoW1wiLi4vLi4vbGliL2NvZGVtaXJyb3JcIl0sIG1vZCk7XG4gIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnZcbiAgICBtb2QoQ29kZU1pcnJvcik7XG59KShmdW5jdGlvbihDb2RlTWlycm9yKSB7XG5cInVzZSBzdHJpY3RcIjtcblxuQ29kZU1pcnJvci5kZWZpbmVNb2RlKFwiY3NzXCIsIGZ1bmN0aW9uKGNvbmZpZywgcGFyc2VyQ29uZmlnKSB7XG4gIHZhciBpbmxpbmUgPSBwYXJzZXJDb25maWcuaW5saW5lXG4gIGlmICghcGFyc2VyQ29uZmlnLnByb3BlcnR5S2V5d29yZHMpIHBhcnNlckNvbmZpZyA9IENvZGVNaXJyb3IucmVzb2x2ZU1vZGUoXCJ0ZXh0L2Nzc1wiKTtcblxuICB2YXIgaW5kZW50VW5pdCA9IGNvbmZpZy5pbmRlbnRVbml0LFxuICAgICAgdG9rZW5Ib29rcyA9IHBhcnNlckNvbmZpZy50b2tlbkhvb2tzLFxuICAgICAgZG9jdW1lbnRUeXBlcyA9IHBhcnNlckNvbmZpZy5kb2N1bWVudFR5cGVzIHx8IHt9LFxuICAgICAgbWVkaWFUeXBlcyA9IHBhcnNlckNvbmZpZy5tZWRpYVR5cGVzIHx8IHt9LFxuICAgICAgbWVkaWFGZWF0dXJlcyA9IHBhcnNlckNvbmZpZy5tZWRpYUZlYXR1cmVzIHx8IHt9LFxuICAgICAgbWVkaWFWYWx1ZUtleXdvcmRzID0gcGFyc2VyQ29uZmlnLm1lZGlhVmFsdWVLZXl3b3JkcyB8fCB7fSxcbiAgICAgIHByb3BlcnR5S2V5d29yZHMgPSBwYXJzZXJDb25maWcucHJvcGVydHlLZXl3b3JkcyB8fCB7fSxcbiAgICAgIG5vblN0YW5kYXJkUHJvcGVydHlLZXl3b3JkcyA9IHBhcnNlckNvbmZpZy5ub25TdGFuZGFyZFByb3BlcnR5S2V5d29yZHMgfHwge30sXG4gICAgICBmb250UHJvcGVydGllcyA9IHBhcnNlckNvbmZpZy5mb250UHJvcGVydGllcyB8fCB7fSxcbiAgICAgIGNvdW50ZXJEZXNjcmlwdG9ycyA9IHBhcnNlckNvbmZpZy5jb3VudGVyRGVzY3JpcHRvcnMgfHwge30sXG4gICAgICBjb2xvcktleXdvcmRzID0gcGFyc2VyQ29uZmlnLmNvbG9yS2V5d29yZHMgfHwge30sXG4gICAgICB2YWx1ZUtleXdvcmRzID0gcGFyc2VyQ29uZmlnLnZhbHVlS2V5d29yZHMgfHwge30sXG4gICAgICBhbGxvd05lc3RlZCA9IHBhcnNlckNvbmZpZy5hbGxvd05lc3RlZCxcbiAgICAgIGxpbmVDb21tZW50ID0gcGFyc2VyQ29uZmlnLmxpbmVDb21tZW50LFxuICAgICAgc3VwcG9ydHNBdENvbXBvbmVudCA9IHBhcnNlckNvbmZpZy5zdXBwb3J0c0F0Q29tcG9uZW50ID09PSB0cnVlLFxuICAgICAgaGlnaGxpZ2h0Tm9uU3RhbmRhcmRQcm9wZXJ0eUtleXdvcmRzID0gY29uZmlnLmhpZ2hsaWdodE5vblN0YW5kYXJkUHJvcGVydHlLZXl3b3JkcyAhPT0gZmFsc2U7XG5cbiAgdmFyIHR5cGUsIG92ZXJyaWRlO1xuICBmdW5jdGlvbiByZXQoc3R5bGUsIHRwKSB7IHR5cGUgPSB0cDsgcmV0dXJuIHN0eWxlOyB9XG5cbiAgLy8gVG9rZW5pemVyc1xuXG4gIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7XG4gICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTtcbiAgICBpZiAodG9rZW5Ib29rc1tjaF0pIHtcbiAgICAgIHZhciByZXN1bHQgPSB0b2tlbkhvb2tzW2NoXShzdHJlYW0sIHN0YXRlKTtcbiAgICAgIGlmIChyZXN1bHQgIT09IGZhbHNlKSByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBpZiAoY2ggPT0gXCJAXCIpIHtcbiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1xcd1xcXFxcXC1dLyk7XG4gICAgICByZXR1cm4gcmV0KFwiZGVmXCIsIHN0cmVhbS5jdXJyZW50KCkpO1xuICAgIH0gZWxzZSBpZiAoY2ggPT0gXCI9XCIgfHwgKGNoID09IFwiflwiIHx8IGNoID09IFwifFwiKSAmJiBzdHJlYW0uZWF0KFwiPVwiKSkge1xuICAgICAgcmV0dXJuIHJldChudWxsLCBcImNvbXBhcmVcIik7XG4gICAgfSBlbHNlIGlmIChjaCA9PSBcIlxcXCJcIiB8fCBjaCA9PSBcIidcIikge1xuICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblN0cmluZyhjaCk7XG4gICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7XG4gICAgfSBlbHNlIGlmIChjaCA9PSBcIiNcIikge1xuICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXFx3XFxcXFxcLV0vKTtcbiAgICAgIHJldHVybiByZXQoXCJhdG9tXCIsIFwiaGFzaFwiKTtcbiAgICB9IGVsc2UgaWYgKGNoID09IFwiIVwiKSB7XG4gICAgICBzdHJlYW0ubWF0Y2goL15cXHMqXFx3Ki8pO1xuICAgICAgcmV0dXJuIHJldChcImtleXdvcmRcIiwgXCJpbXBvcnRhbnRcIik7XG4gICAgfSBlbHNlIGlmICgvXFxkLy50ZXN0KGNoKSB8fCBjaCA9PSBcIi5cIiAmJiBzdHJlYW0uZWF0KC9cXGQvKSkge1xuICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXFx3LiVdLyk7XG4gICAgICByZXR1cm4gcmV0KFwibnVtYmVyXCIsIFwidW5pdFwiKTtcbiAgICB9IGVsc2UgaWYgKGNoID09PSBcIi1cIikge1xuICAgICAgaWYgKC9bXFxkLl0vLnRlc3Qoc3RyZWFtLnBlZWsoKSkpIHtcbiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXFx3LiVdLyk7XG4gICAgICAgIHJldHVybiByZXQoXCJudW1iZXJcIiwgXCJ1bml0XCIpO1xuICAgICAgfSBlbHNlIGlmIChzdHJlYW0ubWF0Y2goL14tW1xcd1xcXFxcXC1dKi8pKSB7XG4gICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1xcd1xcXFxcXC1dLyk7XG4gICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15cXHMqOi8sIGZhbHNlKSlcbiAgICAgICAgICByZXR1cm4gcmV0KFwidmFyaWFibGUtMlwiLCBcInZhcmlhYmxlLWRlZmluaXRpb25cIik7XG4gICAgICAgIHJldHVybiByZXQoXCJ2YXJpYWJsZS0yXCIsIFwidmFyaWFibGVcIik7XG4gICAgICB9IGVsc2UgaWYgKHN0cmVhbS5tYXRjaCgvXlxcdystLykpIHtcbiAgICAgICAgcmV0dXJuIHJldChcIm1ldGFcIiwgXCJtZXRhXCIpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoL1ssKz4qXFwvXS8udGVzdChjaCkpIHtcbiAgICAgIHJldHVybiByZXQobnVsbCwgXCJzZWxlY3Qtb3BcIik7XG4gICAgfSBlbHNlIGlmIChjaCA9PSBcIi5cIiAmJiBzdHJlYW0ubWF0Y2goL14tP1tfYS16XVtfYS16MC05LV0qL2kpKSB7XG4gICAgICByZXR1cm4gcmV0KFwicXVhbGlmaWVyXCIsIFwicXVhbGlmaWVyXCIpO1xuICAgIH0gZWxzZSBpZiAoL1s6O3t9XFxbXFxdXFwoXFwpXS8udGVzdChjaCkpIHtcbiAgICAgIHJldHVybiByZXQobnVsbCwgY2gpO1xuICAgIH0gZWxzZSBpZiAoc3RyZWFtLm1hdGNoKC9eW1xcdy0uXSsoPz1cXCgpLykpIHtcbiAgICAgIGlmICgvXih1cmwoLXByZWZpeCk/fGRvbWFpbnxyZWdleHApJC9pLnRlc3Qoc3RyZWFtLmN1cnJlbnQoKSkpIHtcbiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblBhcmVudGhlc2l6ZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmV0KFwidmFyaWFibGUgY2FsbGVlXCIsIFwidmFyaWFibGVcIik7XG4gICAgfSBlbHNlIGlmICgvW1xcd1xcXFxcXC1dLy50ZXN0KGNoKSkge1xuICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXFx3XFxcXFxcLV0vKTtcbiAgICAgIHJldHVybiByZXQoXCJwcm9wZXJ0eVwiLCBcIndvcmRcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiByZXQobnVsbCwgbnVsbCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdG9rZW5TdHJpbmcocXVvdGUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkge1xuICAgICAgdmFyIGVzY2FwZWQgPSBmYWxzZSwgY2g7XG4gICAgICB3aGlsZSAoKGNoID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkge1xuICAgICAgICBpZiAoY2ggPT0gcXVvdGUgJiYgIWVzY2FwZWQpIHtcbiAgICAgICAgICBpZiAocXVvdGUgPT0gXCIpXCIpIHN0cmVhbS5iYWNrVXAoMSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIGNoID09IFwiXFxcXFwiO1xuICAgICAgfVxuICAgICAgaWYgKGNoID09IHF1b3RlIHx8ICFlc2NhcGVkICYmIHF1b3RlICE9IFwiKVwiKSBzdGF0ZS50b2tlbml6ZSA9IG51bGw7XG4gICAgICByZXR1cm4gcmV0KFwic3RyaW5nXCIsIFwic3RyaW5nXCIpO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiB0b2tlblBhcmVudGhlc2l6ZWQoc3RyZWFtLCBzdGF0ZSkge1xuICAgIHN0cmVhbS5uZXh0KCk7IC8vIE11c3QgYmUgJygnXG4gICAgaWYgKCFzdHJlYW0ubWF0Y2goL15cXHMqW1xcXCJcXCcpXS8sIGZhbHNlKSlcbiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5TdHJpbmcoXCIpXCIpO1xuICAgIGVsc2VcbiAgICAgIHN0YXRlLnRva2VuaXplID0gbnVsbDtcbiAgICByZXR1cm4gcmV0KG51bGwsIFwiKFwiKTtcbiAgfVxuXG4gIC8vIENvbnRleHQgbWFuYWdlbWVudFxuXG4gIGZ1bmN0aW9uIENvbnRleHQodHlwZSwgaW5kZW50LCBwcmV2KSB7XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB0aGlzLmluZGVudCA9IGluZGVudDtcbiAgICB0aGlzLnByZXYgPSBwcmV2O1xuICB9XG5cbiAgZnVuY3Rpb24gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgdHlwZSwgaW5kZW50KSB7XG4gICAgc3RhdGUuY29udGV4dCA9IG5ldyBDb250ZXh0KHR5cGUsIHN0cmVhbS5pbmRlbnRhdGlvbigpICsgKGluZGVudCA9PT0gZmFsc2UgPyAwIDogaW5kZW50VW5pdCksIHN0YXRlLmNvbnRleHQpO1xuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgZnVuY3Rpb24gcG9wQ29udGV4dChzdGF0ZSkge1xuICAgIGlmIChzdGF0ZS5jb250ZXh0LnByZXYpXG4gICAgICBzdGF0ZS5jb250ZXh0ID0gc3RhdGUuY29udGV4dC5wcmV2O1xuICAgIHJldHVybiBzdGF0ZS5jb250ZXh0LnR5cGU7XG4gIH1cblxuICBmdW5jdGlvbiBwYXNzKHR5cGUsIHN0cmVhbSwgc3RhdGUpIHtcbiAgICByZXR1cm4gc3RhdGVzW3N0YXRlLmNvbnRleHQudHlwZV0odHlwZSwgc3RyZWFtLCBzdGF0ZSk7XG4gIH1cbiAgZnVuY3Rpb24gcG9wQW5kUGFzcyh0eXBlLCBzdHJlYW0sIHN0YXRlLCBuKSB7XG4gICAgZm9yICh2YXIgaSA9IG4gfHwgMTsgaSA+IDA7IGktLSlcbiAgICAgIHN0YXRlLmNvbnRleHQgPSBzdGF0ZS5jb250ZXh0LnByZXY7XG4gICAgcmV0dXJuIHBhc3ModHlwZSwgc3RyZWFtLCBzdGF0ZSk7XG4gIH1cblxuICAvLyBQYXJzZXJcblxuICBmdW5jdGlvbiB3b3JkQXNWYWx1ZShzdHJlYW0pIHtcbiAgICB2YXIgd29yZCA9IHN0cmVhbS5jdXJyZW50KCkudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAodmFsdWVLZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh3b3JkKSlcbiAgICAgIG92ZXJyaWRlID0gXCJhdG9tXCI7XG4gICAgZWxzZSBpZiAoY29sb3JLZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh3b3JkKSlcbiAgICAgIG92ZXJyaWRlID0gXCJrZXl3b3JkXCI7XG4gICAgZWxzZVxuICAgICAgb3ZlcnJpZGUgPSBcInZhcmlhYmxlXCI7XG4gIH1cblxuICB2YXIgc3RhdGVzID0ge307XG5cbiAgc3RhdGVzLnRvcCA9IGZ1bmN0aW9uKHR5cGUsIHN0cmVhbSwgc3RhdGUpIHtcbiAgICBpZiAodHlwZSA9PSBcIntcIikge1xuICAgICAgcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0sIFwiYmxvY2tcIik7XG4gICAgfSBlbHNlIGlmICh0eXBlID09IFwifVwiICYmIHN0YXRlLmNvbnRleHQucHJldikge1xuICAgICAgcmV0dXJuIHBvcENvbnRleHQoc3RhdGUpO1xuICAgIH0gZWxzZSBpZiAoc3VwcG9ydHNBdENvbXBvbmVudCAmJiAvQGNvbXBvbmVudC9pLnRlc3QodHlwZSkpIHtcbiAgICAgIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCBcImF0Q29tcG9uZW50QmxvY2tcIik7XG4gICAgfSBlbHNlIGlmICgvXkAoLW1vei0pP2RvY3VtZW50JC9pLnRlc3QodHlwZSkpIHtcbiAgICAgIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCBcImRvY3VtZW50VHlwZXNcIik7XG4gICAgfSBlbHNlIGlmICgvXkAobWVkaWF8c3VwcG9ydHN8KC1tb3otKT9kb2N1bWVudHxpbXBvcnQpJC9pLnRlc3QodHlwZSkpIHtcbiAgICAgIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCBcImF0QmxvY2tcIik7XG4gICAgfSBlbHNlIGlmICgvXkAoZm9udC1mYWNlfGNvdW50ZXItc3R5bGUpL2kudGVzdCh0eXBlKSkge1xuICAgICAgc3RhdGUuc3RhdGVBcmcgPSB0eXBlO1xuICAgICAgcmV0dXJuIFwicmVzdHJpY3RlZF9hdEJsb2NrX2JlZm9yZVwiO1xuICAgIH0gZWxzZSBpZiAoL15AKC0obW96fG1zfG98d2Via2l0KS0pP2tleWZyYW1lcyQvaS50ZXN0KHR5cGUpKSB7XG4gICAgICByZXR1cm4gXCJrZXlmcmFtZXNcIjtcbiAgICB9IGVsc2UgaWYgKHR5cGUgJiYgdHlwZS5jaGFyQXQoMCkgPT0gXCJAXCIpIHtcbiAgICAgIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCBcImF0XCIpO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcImhhc2hcIikge1xuICAgICAgb3ZlcnJpZGUgPSBcImJ1aWx0aW5cIjtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCJ3b3JkXCIpIHtcbiAgICAgIG92ZXJyaWRlID0gXCJ0YWdcIjtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCJ2YXJpYWJsZS1kZWZpbml0aW9uXCIpIHtcbiAgICAgIHJldHVybiBcIm1heWJlcHJvcFwiO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcImludGVycG9sYXRpb25cIikge1xuICAgICAgcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0sIFwiaW50ZXJwb2xhdGlvblwiKTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCI6XCIpIHtcbiAgICAgIHJldHVybiBcInBzZXVkb1wiO1xuICAgIH0gZWxzZSBpZiAoYWxsb3dOZXN0ZWQgJiYgdHlwZSA9PSBcIihcIikge1xuICAgICAgcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0sIFwicGFyZW5zXCIpO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdGUuY29udGV4dC50eXBlO1xuICB9O1xuXG4gIHN0YXRlcy5ibG9jayA9IGZ1bmN0aW9uKHR5cGUsIHN0cmVhbSwgc3RhdGUpIHtcbiAgICBpZiAodHlwZSA9PSBcIndvcmRcIikge1xuICAgICAgdmFyIHdvcmQgPSBzdHJlYW0uY3VycmVudCgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAocHJvcGVydHlLZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh3b3JkKSkge1xuICAgICAgICBvdmVycmlkZSA9IFwicHJvcGVydHlcIjtcbiAgICAgICAgcmV0dXJuIFwibWF5YmVwcm9wXCI7XG4gICAgICB9IGVsc2UgaWYgKG5vblN0YW5kYXJkUHJvcGVydHlLZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh3b3JkKSkge1xuICAgICAgICBvdmVycmlkZSA9IGhpZ2hsaWdodE5vblN0YW5kYXJkUHJvcGVydHlLZXl3b3JkcyA/IFwic3RyaW5nLTJcIiA6IFwicHJvcGVydHlcIjtcbiAgICAgICAgcmV0dXJuIFwibWF5YmVwcm9wXCI7XG4gICAgICB9IGVsc2UgaWYgKGFsbG93TmVzdGVkKSB7XG4gICAgICAgIG92ZXJyaWRlID0gc3RyZWFtLm1hdGNoKC9eXFxzKjooPzpcXHN8JCkvLCBmYWxzZSkgPyBcInByb3BlcnR5XCIgOiBcInRhZ1wiO1xuICAgICAgICByZXR1cm4gXCJibG9ja1wiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3ZlcnJpZGUgKz0gXCIgZXJyb3JcIjtcbiAgICAgICAgcmV0dXJuIFwibWF5YmVwcm9wXCI7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09IFwibWV0YVwiKSB7XG4gICAgICByZXR1cm4gXCJibG9ja1wiO1xuICAgIH0gZWxzZSBpZiAoIWFsbG93TmVzdGVkICYmICh0eXBlID09IFwiaGFzaFwiIHx8IHR5cGUgPT0gXCJxdWFsaWZpZXJcIikpIHtcbiAgICAgIG92ZXJyaWRlID0gXCJlcnJvclwiO1xuICAgICAgcmV0dXJuIFwiYmxvY2tcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHN0YXRlcy50b3AodHlwZSwgc3RyZWFtLCBzdGF0ZSk7XG4gICAgfVxuICB9O1xuXG4gIHN0YXRlcy5tYXliZXByb3AgPSBmdW5jdGlvbih0eXBlLCBzdHJlYW0sIHN0YXRlKSB7XG4gICAgaWYgKHR5cGUgPT0gXCI6XCIpIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCBcInByb3BcIik7XG4gICAgcmV0dXJuIHBhc3ModHlwZSwgc3RyZWFtLCBzdGF0ZSk7XG4gIH07XG5cbiAgc3RhdGVzLnByb3AgPSBmdW5jdGlvbih0eXBlLCBzdHJlYW0sIHN0YXRlKSB7XG4gICAgaWYgKHR5cGUgPT0gXCI7XCIpIHJldHVybiBwb3BDb250ZXh0KHN0YXRlKTtcbiAgICBpZiAodHlwZSA9PSBcIntcIiAmJiBhbGxvd05lc3RlZCkgcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0sIFwicHJvcEJsb2NrXCIpO1xuICAgIGlmICh0eXBlID09IFwifVwiIHx8IHR5cGUgPT0gXCJ7XCIpIHJldHVybiBwb3BBbmRQYXNzKHR5cGUsIHN0cmVhbSwgc3RhdGUpO1xuICAgIGlmICh0eXBlID09IFwiKFwiKSByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgXCJwYXJlbnNcIik7XG5cbiAgICBpZiAodHlwZSA9PSBcImhhc2hcIiAmJiAhL14jKFswLTlhLWZBLWZdezMsNH18WzAtOWEtZkEtZl17Nn18WzAtOWEtZkEtZl17OH0pJC8udGVzdChzdHJlYW0uY3VycmVudCgpKSkge1xuICAgICAgb3ZlcnJpZGUgKz0gXCIgZXJyb3JcIjtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCJ3b3JkXCIpIHtcbiAgICAgIHdvcmRBc1ZhbHVlKHN0cmVhbSk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09IFwiaW50ZXJwb2xhdGlvblwiKSB7XG4gICAgICByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgXCJpbnRlcnBvbGF0aW9uXCIpO1xuICAgIH1cbiAgICByZXR1cm4gXCJwcm9wXCI7XG4gIH07XG5cbiAgc3RhdGVzLnByb3BCbG9jayA9IGZ1bmN0aW9uKHR5cGUsIF9zdHJlYW0sIHN0YXRlKSB7XG4gICAgaWYgKHR5cGUgPT0gXCJ9XCIpIHJldHVybiBwb3BDb250ZXh0KHN0YXRlKTtcbiAgICBpZiAodHlwZSA9PSBcIndvcmRcIikgeyBvdmVycmlkZSA9IFwicHJvcGVydHlcIjsgcmV0dXJuIFwibWF5YmVwcm9wXCI7IH1cbiAgICByZXR1cm4gc3RhdGUuY29udGV4dC50eXBlO1xuICB9O1xuXG4gIHN0YXRlcy5wYXJlbnMgPSBmdW5jdGlvbih0eXBlLCBzdHJlYW0sIHN0YXRlKSB7XG4gICAgaWYgKHR5cGUgPT0gXCJ7XCIgfHwgdHlwZSA9PSBcIn1cIikgcmV0dXJuIHBvcEFuZFBhc3ModHlwZSwgc3RyZWFtLCBzdGF0ZSk7XG4gICAgaWYgKHR5cGUgPT0gXCIpXCIpIHJldHVybiBwb3BDb250ZXh0KHN0YXRlKTtcbiAgICBpZiAodHlwZSA9PSBcIihcIikgcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0sIFwicGFyZW5zXCIpO1xuICAgIGlmICh0eXBlID09IFwiaW50ZXJwb2xhdGlvblwiKSByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgXCJpbnRlcnBvbGF0aW9uXCIpO1xuICAgIGlmICh0eXBlID09IFwid29yZFwiKSB3b3JkQXNWYWx1ZShzdHJlYW0pO1xuICAgIHJldHVybiBcInBhcmVuc1wiO1xuICB9O1xuXG4gIHN0YXRlcy5wc2V1ZG8gPSBmdW5jdGlvbih0eXBlLCBzdHJlYW0sIHN0YXRlKSB7XG4gICAgaWYgKHR5cGUgPT0gXCJtZXRhXCIpIHJldHVybiBcInBzZXVkb1wiO1xuXG4gICAgaWYgKHR5cGUgPT0gXCJ3b3JkXCIpIHtcbiAgICAgIG92ZXJyaWRlID0gXCJ2YXJpYWJsZS0zXCI7XG4gICAgICByZXR1cm4gc3RhdGUuY29udGV4dC50eXBlO1xuICAgIH1cbiAgICByZXR1cm4gcGFzcyh0eXBlLCBzdHJlYW0sIHN0YXRlKTtcbiAgfTtcblxuICBzdGF0ZXMuZG9jdW1lbnRUeXBlcyA9IGZ1bmN0aW9uKHR5cGUsIHN0cmVhbSwgc3RhdGUpIHtcbiAgICBpZiAodHlwZSA9PSBcIndvcmRcIiAmJiBkb2N1bWVudFR5cGVzLmhhc093blByb3BlcnR5KHN0cmVhbS5jdXJyZW50KCkpKSB7XG4gICAgICBvdmVycmlkZSA9IFwidGFnXCI7XG4gICAgICByZXR1cm4gc3RhdGUuY29udGV4dC50eXBlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gc3RhdGVzLmF0QmxvY2sodHlwZSwgc3RyZWFtLCBzdGF0ZSk7XG4gICAgfVxuICB9O1xuXG4gIHN0YXRlcy5hdEJsb2NrID0gZnVuY3Rpb24odHlwZSwgc3RyZWFtLCBzdGF0ZSkge1xuICAgIGlmICh0eXBlID09IFwiKFwiKSByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgXCJhdEJsb2NrX3BhcmVuc1wiKTtcbiAgICBpZiAodHlwZSA9PSBcIn1cIiB8fCB0eXBlID09IFwiO1wiKSByZXR1cm4gcG9wQW5kUGFzcyh0eXBlLCBzdHJlYW0sIHN0YXRlKTtcbiAgICBpZiAodHlwZSA9PSBcIntcIikgcmV0dXJuIHBvcENvbnRleHQoc3RhdGUpICYmIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0sIGFsbG93TmVzdGVkID8gXCJibG9ja1wiIDogXCJ0b3BcIik7XG5cbiAgICBpZiAodHlwZSA9PSBcImludGVycG9sYXRpb25cIikgcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0sIFwiaW50ZXJwb2xhdGlvblwiKTtcblxuICAgIGlmICh0eXBlID09IFwid29yZFwiKSB7XG4gICAgICB2YXIgd29yZCA9IHN0cmVhbS5jdXJyZW50KCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmICh3b3JkID09IFwib25seVwiIHx8IHdvcmQgPT0gXCJub3RcIiB8fCB3b3JkID09IFwiYW5kXCIgfHwgd29yZCA9PSBcIm9yXCIpXG4gICAgICAgIG92ZXJyaWRlID0gXCJrZXl3b3JkXCI7XG4gICAgICBlbHNlIGlmIChtZWRpYVR5cGVzLmhhc093blByb3BlcnR5KHdvcmQpKVxuICAgICAgICBvdmVycmlkZSA9IFwiYXR0cmlidXRlXCI7XG4gICAgICBlbHNlIGlmIChtZWRpYUZlYXR1cmVzLmhhc093blByb3BlcnR5KHdvcmQpKVxuICAgICAgICBvdmVycmlkZSA9IFwicHJvcGVydHlcIjtcbiAgICAgIGVsc2UgaWYgKG1lZGlhVmFsdWVLZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh3b3JkKSlcbiAgICAgICAgb3ZlcnJpZGUgPSBcImtleXdvcmRcIjtcbiAgICAgIGVsc2UgaWYgKHByb3BlcnR5S2V5d29yZHMuaGFzT3duUHJvcGVydHkod29yZCkpXG4gICAgICAgIG92ZXJyaWRlID0gXCJwcm9wZXJ0eVwiO1xuICAgICAgZWxzZSBpZiAobm9uU3RhbmRhcmRQcm9wZXJ0eUtleXdvcmRzLmhhc093blByb3BlcnR5KHdvcmQpKVxuICAgICAgICBvdmVycmlkZSA9IGhpZ2hsaWdodE5vblN0YW5kYXJkUHJvcGVydHlLZXl3b3JkcyA/IFwic3RyaW5nLTJcIiA6IFwicHJvcGVydHlcIjtcbiAgICAgIGVsc2UgaWYgKHZhbHVlS2V5d29yZHMuaGFzT3duUHJvcGVydHkod29yZCkpXG4gICAgICAgIG92ZXJyaWRlID0gXCJhdG9tXCI7XG4gICAgICBlbHNlIGlmIChjb2xvcktleXdvcmRzLmhhc093blByb3BlcnR5KHdvcmQpKVxuICAgICAgICBvdmVycmlkZSA9IFwia2V5d29yZFwiO1xuICAgICAgZWxzZVxuICAgICAgICBvdmVycmlkZSA9IFwiZXJyb3JcIjtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlLmNvbnRleHQudHlwZTtcbiAgfTtcblxuICBzdGF0ZXMuYXRDb21wb25lbnRCbG9jayA9IGZ1bmN0aW9uKHR5cGUsIHN0cmVhbSwgc3RhdGUpIHtcbiAgICBpZiAodHlwZSA9PSBcIn1cIilcbiAgICAgIHJldHVybiBwb3BBbmRQYXNzKHR5cGUsIHN0cmVhbSwgc3RhdGUpO1xuICAgIGlmICh0eXBlID09IFwie1wiKVxuICAgICAgcmV0dXJuIHBvcENvbnRleHQoc3RhdGUpICYmIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0sIGFsbG93TmVzdGVkID8gXCJibG9ja1wiIDogXCJ0b3BcIiwgZmFsc2UpO1xuICAgIGlmICh0eXBlID09IFwid29yZFwiKVxuICAgICAgb3ZlcnJpZGUgPSBcImVycm9yXCI7XG4gICAgcmV0dXJuIHN0YXRlLmNvbnRleHQudHlwZTtcbiAgfTtcblxuICBzdGF0ZXMuYXRCbG9ja19wYXJlbnMgPSBmdW5jdGlvbih0eXBlLCBzdHJlYW0sIHN0YXRlKSB7XG4gICAgaWYgKHR5cGUgPT0gXCIpXCIpIHJldHVybiBwb3BDb250ZXh0KHN0YXRlKTtcbiAgICBpZiAodHlwZSA9PSBcIntcIiB8fCB0eXBlID09IFwifVwiKSByZXR1cm4gcG9wQW5kUGFzcyh0eXBlLCBzdHJlYW0sIHN0YXRlLCAyKTtcbiAgICByZXR1cm4gc3RhdGVzLmF0QmxvY2sodHlwZSwgc3RyZWFtLCBzdGF0ZSk7XG4gIH07XG5cbiAgc3RhdGVzLnJlc3RyaWN0ZWRfYXRCbG9ja19iZWZvcmUgPSBmdW5jdGlvbih0eXBlLCBzdHJlYW0sIHN0YXRlKSB7XG4gICAgaWYgKHR5cGUgPT0gXCJ7XCIpXG4gICAgICByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgXCJyZXN0cmljdGVkX2F0QmxvY2tcIik7XG4gICAgaWYgKHR5cGUgPT0gXCJ3b3JkXCIgJiYgc3RhdGUuc3RhdGVBcmcgPT0gXCJAY291bnRlci1zdHlsZVwiKSB7XG4gICAgICBvdmVycmlkZSA9IFwidmFyaWFibGVcIjtcbiAgICAgIHJldHVybiBcInJlc3RyaWN0ZWRfYXRCbG9ja19iZWZvcmVcIjtcbiAgICB9XG4gICAgcmV0dXJuIHBhc3ModHlwZSwgc3RyZWFtLCBzdGF0ZSk7XG4gIH07XG5cbiAgc3RhdGVzLnJlc3RyaWN0ZWRfYXRCbG9jayA9IGZ1bmN0aW9uKHR5cGUsIHN0cmVhbSwgc3RhdGUpIHtcbiAgICBpZiAodHlwZSA9PSBcIn1cIikge1xuICAgICAgc3RhdGUuc3RhdGVBcmcgPSBudWxsO1xuICAgICAgcmV0dXJuIHBvcENvbnRleHQoc3RhdGUpO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PSBcIndvcmRcIikge1xuICAgICAgaWYgKChzdGF0ZS5zdGF0ZUFyZyA9PSBcIkBmb250LWZhY2VcIiAmJiAhZm9udFByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkoc3RyZWFtLmN1cnJlbnQoKS50b0xvd2VyQ2FzZSgpKSkgfHxcbiAgICAgICAgICAoc3RhdGUuc3RhdGVBcmcgPT0gXCJAY291bnRlci1zdHlsZVwiICYmICFjb3VudGVyRGVzY3JpcHRvcnMuaGFzT3duUHJvcGVydHkoc3RyZWFtLmN1cnJlbnQoKS50b0xvd2VyQ2FzZSgpKSkpXG4gICAgICAgIG92ZXJyaWRlID0gXCJlcnJvclwiO1xuICAgICAgZWxzZVxuICAgICAgICBvdmVycmlkZSA9IFwicHJvcGVydHlcIjtcbiAgICAgIHJldHVybiBcIm1heWJlcHJvcFwiO1xuICAgIH1cbiAgICByZXR1cm4gXCJyZXN0cmljdGVkX2F0QmxvY2tcIjtcbiAgfTtcblxuICBzdGF0ZXMua2V5ZnJhbWVzID0gZnVuY3Rpb24odHlwZSwgc3RyZWFtLCBzdGF0ZSkge1xuICAgIGlmICh0eXBlID09IFwid29yZFwiKSB7IG92ZXJyaWRlID0gXCJ2YXJpYWJsZVwiOyByZXR1cm4gXCJrZXlmcmFtZXNcIjsgfVxuICAgIGlmICh0eXBlID09IFwie1wiKSByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgXCJ0b3BcIik7XG4gICAgcmV0dXJuIHBhc3ModHlwZSwgc3RyZWFtLCBzdGF0ZSk7XG4gIH07XG5cbiAgc3RhdGVzLmF0ID0gZnVuY3Rpb24odHlwZSwgc3RyZWFtLCBzdGF0ZSkge1xuICAgIGlmICh0eXBlID09IFwiO1wiKSByZXR1cm4gcG9wQ29udGV4dChzdGF0ZSk7XG4gICAgaWYgKHR5cGUgPT0gXCJ7XCIgfHwgdHlwZSA9PSBcIn1cIikgcmV0dXJuIHBvcEFuZFBhc3ModHlwZSwgc3RyZWFtLCBzdGF0ZSk7XG4gICAgaWYgKHR5cGUgPT0gXCJ3b3JkXCIpIG92ZXJyaWRlID0gXCJ0YWdcIjtcbiAgICBlbHNlIGlmICh0eXBlID09IFwiaGFzaFwiKSBvdmVycmlkZSA9IFwiYnVpbHRpblwiO1xuICAgIHJldHVybiBcImF0XCI7XG4gIH07XG5cbiAgc3RhdGVzLmludGVycG9sYXRpb24gPSBmdW5jdGlvbih0eXBlLCBzdHJlYW0sIHN0YXRlKSB7XG4gICAgaWYgKHR5cGUgPT0gXCJ9XCIpIHJldHVybiBwb3BDb250ZXh0KHN0YXRlKTtcbiAgICBpZiAodHlwZSA9PSBcIntcIiB8fCB0eXBlID09IFwiO1wiKSByZXR1cm4gcG9wQW5kUGFzcyh0eXBlLCBzdHJlYW0sIHN0YXRlKTtcbiAgICBpZiAodHlwZSA9PSBcIndvcmRcIikgb3ZlcnJpZGUgPSBcInZhcmlhYmxlXCI7XG4gICAgZWxzZSBpZiAodHlwZSAhPSBcInZhcmlhYmxlXCIgJiYgdHlwZSAhPSBcIihcIiAmJiB0eXBlICE9IFwiKVwiKSBvdmVycmlkZSA9IFwiZXJyb3JcIjtcbiAgICByZXR1cm4gXCJpbnRlcnBvbGF0aW9uXCI7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbihiYXNlKSB7XG4gICAgICByZXR1cm4ge3Rva2VuaXplOiBudWxsLFxuICAgICAgICAgICAgICBzdGF0ZTogaW5saW5lID8gXCJibG9ja1wiIDogXCJ0b3BcIixcbiAgICAgICAgICAgICAgc3RhdGVBcmc6IG51bGwsXG4gICAgICAgICAgICAgIGNvbnRleHQ6IG5ldyBDb250ZXh0KGlubGluZSA/IFwiYmxvY2tcIiA6IFwidG9wXCIsIGJhc2UgfHwgMCwgbnVsbCl9O1xuICAgIH0sXG5cbiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkge1xuICAgICAgaWYgKCFzdGF0ZS50b2tlbml6ZSAmJiBzdHJlYW0uZWF0U3BhY2UoKSkgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgc3R5bGUgPSAoc3RhdGUudG9rZW5pemUgfHwgdG9rZW5CYXNlKShzdHJlYW0sIHN0YXRlKTtcbiAgICAgIGlmIChzdHlsZSAmJiB0eXBlb2Ygc3R5bGUgPT0gXCJvYmplY3RcIikge1xuICAgICAgICB0eXBlID0gc3R5bGVbMV07XG4gICAgICAgIHN0eWxlID0gc3R5bGVbMF07XG4gICAgICB9XG4gICAgICBvdmVycmlkZSA9IHN0eWxlO1xuICAgICAgaWYgKHR5cGUgIT0gXCJjb21tZW50XCIpXG4gICAgICAgIHN0YXRlLnN0YXRlID0gc3RhdGVzW3N0YXRlLnN0YXRlXSh0eXBlLCBzdHJlYW0sIHN0YXRlKTtcbiAgICAgIHJldHVybiBvdmVycmlkZTtcbiAgICB9LFxuXG4gICAgaW5kZW50OiBmdW5jdGlvbihzdGF0ZSwgdGV4dEFmdGVyKSB7XG4gICAgICB2YXIgY3ggPSBzdGF0ZS5jb250ZXh0LCBjaCA9IHRleHRBZnRlciAmJiB0ZXh0QWZ0ZXIuY2hhckF0KDApO1xuICAgICAgdmFyIGluZGVudCA9IGN4LmluZGVudDtcbiAgICAgIGlmIChjeC50eXBlID09IFwicHJvcFwiICYmIChjaCA9PSBcIn1cIiB8fCBjaCA9PSBcIilcIikpIGN4ID0gY3gucHJldjtcbiAgICAgIGlmIChjeC5wcmV2KSB7XG4gICAgICAgIGlmIChjaCA9PSBcIn1cIiAmJiAoY3gudHlwZSA9PSBcImJsb2NrXCIgfHwgY3gudHlwZSA9PSBcInRvcFwiIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGN4LnR5cGUgPT0gXCJpbnRlcnBvbGF0aW9uXCIgfHwgY3gudHlwZSA9PSBcInJlc3RyaWN0ZWRfYXRCbG9ja1wiKSkge1xuICAgICAgICAgIC8vIFJlc3VtZSBpbmRlbnRhdGlvbiBmcm9tIHBhcmVudCBjb250ZXh0LlxuICAgICAgICAgIGN4ID0gY3gucHJldjtcbiAgICAgICAgICBpbmRlbnQgPSBjeC5pbmRlbnQ7XG4gICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gXCIpXCIgJiYgKGN4LnR5cGUgPT0gXCJwYXJlbnNcIiB8fCBjeC50eXBlID09IFwiYXRCbG9ja19wYXJlbnNcIikgfHxcbiAgICAgICAgICAgIGNoID09IFwie1wiICYmIChjeC50eXBlID09IFwiYXRcIiB8fCBjeC50eXBlID09IFwiYXRCbG9ja1wiKSkge1xuICAgICAgICAgIC8vIERlZGVudCByZWxhdGl2ZSB0byBjdXJyZW50IGNvbnRleHQuXG4gICAgICAgICAgaW5kZW50ID0gTWF0aC5tYXgoMCwgY3guaW5kZW50IC0gaW5kZW50VW5pdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBpbmRlbnQ7XG4gICAgfSxcblxuICAgIGVsZWN0cmljQ2hhcnM6IFwifVwiLFxuICAgIGJsb2NrQ29tbWVudFN0YXJ0OiBcIi8qXCIsXG4gICAgYmxvY2tDb21tZW50RW5kOiBcIiovXCIsXG4gICAgYmxvY2tDb21tZW50Q29udGludWU6IFwiICogXCIsXG4gICAgbGluZUNvbW1lbnQ6IGxpbmVDb21tZW50LFxuICAgIGZvbGQ6IFwiYnJhY2VcIlxuICB9O1xufSk7XG5cbiAgZnVuY3Rpb24ga2V5U2V0KGFycmF5KSB7XG4gICAgdmFyIGtleXMgPSB7fTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgKytpKSB7XG4gICAgICBrZXlzW2FycmF5W2ldLnRvTG93ZXJDYXNlKCldID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGtleXM7XG4gIH1cblxuICB2YXIgZG9jdW1lbnRUeXBlc18gPSBbXG4gICAgXCJkb21haW5cIiwgXCJyZWdleHBcIiwgXCJ1cmxcIiwgXCJ1cmwtcHJlZml4XCJcbiAgXSwgZG9jdW1lbnRUeXBlcyA9IGtleVNldChkb2N1bWVudFR5cGVzXyk7XG5cbiAgdmFyIG1lZGlhVHlwZXNfID0gW1xuICAgIFwiYWxsXCIsIFwiYXVyYWxcIiwgXCJicmFpbGxlXCIsIFwiaGFuZGhlbGRcIiwgXCJwcmludFwiLCBcInByb2plY3Rpb25cIiwgXCJzY3JlZW5cIixcbiAgICBcInR0eVwiLCBcInR2XCIsIFwiZW1ib3NzZWRcIlxuICBdLCBtZWRpYVR5cGVzID0ga2V5U2V0KG1lZGlhVHlwZXNfKTtcblxuICB2YXIgbWVkaWFGZWF0dXJlc18gPSBbXG4gICAgXCJ3aWR0aFwiLCBcIm1pbi13aWR0aFwiLCBcIm1heC13aWR0aFwiLCBcImhlaWdodFwiLCBcIm1pbi1oZWlnaHRcIiwgXCJtYXgtaGVpZ2h0XCIsXG4gICAgXCJkZXZpY2Utd2lkdGhcIiwgXCJtaW4tZGV2aWNlLXdpZHRoXCIsIFwibWF4LWRldmljZS13aWR0aFwiLCBcImRldmljZS1oZWlnaHRcIixcbiAgICBcIm1pbi1kZXZpY2UtaGVpZ2h0XCIsIFwibWF4LWRldmljZS1oZWlnaHRcIiwgXCJhc3BlY3QtcmF0aW9cIixcbiAgICBcIm1pbi1hc3BlY3QtcmF0aW9cIiwgXCJtYXgtYXNwZWN0LXJhdGlvXCIsIFwiZGV2aWNlLWFzcGVjdC1yYXRpb1wiLFxuICAgIFwibWluLWRldmljZS1hc3BlY3QtcmF0aW9cIiwgXCJtYXgtZGV2aWNlLWFzcGVjdC1yYXRpb1wiLCBcImNvbG9yXCIsIFwibWluLWNvbG9yXCIsXG4gICAgXCJtYXgtY29sb3JcIiwgXCJjb2xvci1pbmRleFwiLCBcIm1pbi1jb2xvci1pbmRleFwiLCBcIm1heC1jb2xvci1pbmRleFwiLFxuICAgIFwibW9ub2Nocm9tZVwiLCBcIm1pbi1tb25vY2hyb21lXCIsIFwibWF4LW1vbm9jaHJvbWVcIiwgXCJyZXNvbHV0aW9uXCIsXG4gICAgXCJtaW4tcmVzb2x1dGlvblwiLCBcIm1heC1yZXNvbHV0aW9uXCIsIFwic2NhblwiLCBcImdyaWRcIiwgXCJvcmllbnRhdGlvblwiLFxuICAgIFwiZGV2aWNlLXBpeGVsLXJhdGlvXCIsIFwibWluLWRldmljZS1waXhlbC1yYXRpb1wiLCBcIm1heC1kZXZpY2UtcGl4ZWwtcmF0aW9cIixcbiAgICBcInBvaW50ZXJcIiwgXCJhbnktcG9pbnRlclwiLCBcImhvdmVyXCIsIFwiYW55LWhvdmVyXCIsIFwicHJlZmVycy1jb2xvci1zY2hlbWVcIlxuICBdLCBtZWRpYUZlYXR1cmVzID0ga2V5U2V0KG1lZGlhRmVhdHVyZXNfKTtcblxuICB2YXIgbWVkaWFWYWx1ZUtleXdvcmRzXyA9IFtcbiAgICBcImxhbmRzY2FwZVwiLCBcInBvcnRyYWl0XCIsIFwibm9uZVwiLCBcImNvYXJzZVwiLCBcImZpbmVcIiwgXCJvbi1kZW1hbmRcIiwgXCJob3ZlclwiLFxuICAgIFwiaW50ZXJsYWNlXCIsIFwicHJvZ3Jlc3NpdmVcIixcbiAgICBcImRhcmtcIiwgXCJsaWdodFwiXG4gIF0sIG1lZGlhVmFsdWVLZXl3b3JkcyA9IGtleVNldChtZWRpYVZhbHVlS2V5d29yZHNfKTtcblxuICB2YXIgcHJvcGVydHlLZXl3b3Jkc18gPSBbXG4gICAgXCJhbGlnbi1jb250ZW50XCIsIFwiYWxpZ24taXRlbXNcIiwgXCJhbGlnbi1zZWxmXCIsIFwiYWxpZ25tZW50LWFkanVzdFwiLFxuICAgIFwiYWxpZ25tZW50LWJhc2VsaW5lXCIsIFwiYWxsXCIsIFwiYW5jaG9yLXBvaW50XCIsIFwiYW5pbWF0aW9uXCIsIFwiYW5pbWF0aW9uLWRlbGF5XCIsXG4gICAgXCJhbmltYXRpb24tZGlyZWN0aW9uXCIsIFwiYW5pbWF0aW9uLWR1cmF0aW9uXCIsIFwiYW5pbWF0aW9uLWZpbGwtbW9kZVwiLFxuICAgIFwiYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudFwiLCBcImFuaW1hdGlvbi1uYW1lXCIsIFwiYW5pbWF0aW9uLXBsYXktc3RhdGVcIixcbiAgICBcImFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb25cIiwgXCJhcHBlYXJhbmNlXCIsIFwiYXppbXV0aFwiLCBcImJhY2tkcm9wLWZpbHRlclwiLFxuICAgIFwiYmFja2ZhY2UtdmlzaWJpbGl0eVwiLCBcImJhY2tncm91bmRcIiwgXCJiYWNrZ3JvdW5kLWF0dGFjaG1lbnRcIixcbiAgICBcImJhY2tncm91bmQtYmxlbmQtbW9kZVwiLCBcImJhY2tncm91bmQtY2xpcFwiLCBcImJhY2tncm91bmQtY29sb3JcIixcbiAgICBcImJhY2tncm91bmQtaW1hZ2VcIiwgXCJiYWNrZ3JvdW5kLW9yaWdpblwiLCBcImJhY2tncm91bmQtcG9zaXRpb25cIixcbiAgICBcImJhY2tncm91bmQtcG9zaXRpb24teFwiLCBcImJhY2tncm91bmQtcG9zaXRpb24teVwiLCBcImJhY2tncm91bmQtcmVwZWF0XCIsXG4gICAgXCJiYWNrZ3JvdW5kLXNpemVcIiwgXCJiYXNlbGluZS1zaGlmdFwiLCBcImJpbmRpbmdcIiwgXCJibGVlZFwiLCBcImJsb2NrLXNpemVcIixcbiAgICBcImJvb2ttYXJrLWxhYmVsXCIsIFwiYm9va21hcmstbGV2ZWxcIiwgXCJib29rbWFyay1zdGF0ZVwiLCBcImJvb2ttYXJrLXRhcmdldFwiLFxuICAgIFwiYm9yZGVyXCIsIFwiYm9yZGVyLWJvdHRvbVwiLCBcImJvcmRlci1ib3R0b20tY29sb3JcIiwgXCJib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzXCIsXG4gICAgXCJib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1c1wiLCBcImJvcmRlci1ib3R0b20tc3R5bGVcIiwgXCJib3JkZXItYm90dG9tLXdpZHRoXCIsXG4gICAgXCJib3JkZXItY29sbGFwc2VcIiwgXCJib3JkZXItY29sb3JcIiwgXCJib3JkZXItaW1hZ2VcIiwgXCJib3JkZXItaW1hZ2Utb3V0c2V0XCIsXG4gICAgXCJib3JkZXItaW1hZ2UtcmVwZWF0XCIsIFwiYm9yZGVyLWltYWdlLXNsaWNlXCIsIFwiYm9yZGVyLWltYWdlLXNvdXJjZVwiLFxuICAgIFwiYm9yZGVyLWltYWdlLXdpZHRoXCIsIFwiYm9yZGVyLWxlZnRcIiwgXCJib3JkZXItbGVmdC1jb2xvclwiLCBcImJvcmRlci1sZWZ0LXN0eWxlXCIsXG4gICAgXCJib3JkZXItbGVmdC13aWR0aFwiLCBcImJvcmRlci1yYWRpdXNcIiwgXCJib3JkZXItcmlnaHRcIiwgXCJib3JkZXItcmlnaHQtY29sb3JcIixcbiAgICBcImJvcmRlci1yaWdodC1zdHlsZVwiLCBcImJvcmRlci1yaWdodC13aWR0aFwiLCBcImJvcmRlci1zcGFjaW5nXCIsIFwiYm9yZGVyLXN0eWxlXCIsXG4gICAgXCJib3JkZXItdG9wXCIsIFwiYm9yZGVyLXRvcC1jb2xvclwiLCBcImJvcmRlci10b3AtbGVmdC1yYWRpdXNcIixcbiAgICBcImJvcmRlci10b3AtcmlnaHQtcmFkaXVzXCIsIFwiYm9yZGVyLXRvcC1zdHlsZVwiLCBcImJvcmRlci10b3Atd2lkdGhcIixcbiAgICBcImJvcmRlci13aWR0aFwiLCBcImJvdHRvbVwiLCBcImJveC1kZWNvcmF0aW9uLWJyZWFrXCIsIFwiYm94LXNoYWRvd1wiLCBcImJveC1zaXppbmdcIixcbiAgICBcImJyZWFrLWFmdGVyXCIsIFwiYnJlYWstYmVmb3JlXCIsIFwiYnJlYWstaW5zaWRlXCIsIFwiY2FwdGlvbi1zaWRlXCIsIFwiY2FyZXQtY29sb3JcIixcbiAgICBcImNsZWFyXCIsIFwiY2xpcFwiLCBcImNvbG9yXCIsIFwiY29sb3ItcHJvZmlsZVwiLCBcImNvbHVtbi1jb3VudFwiLCBcImNvbHVtbi1maWxsXCIsXG4gICAgXCJjb2x1bW4tZ2FwXCIsIFwiY29sdW1uLXJ1bGVcIiwgXCJjb2x1bW4tcnVsZS1jb2xvclwiLCBcImNvbHVtbi1ydWxlLXN0eWxlXCIsXG4gICAgXCJjb2x1bW4tcnVsZS13aWR0aFwiLCBcImNvbHVtbi1zcGFuXCIsIFwiY29sdW1uLXdpZHRoXCIsIFwiY29sdW1uc1wiLCBcImNvbnRhaW5cIixcbiAgICBcImNvbnRlbnRcIiwgXCJjb3VudGVyLWluY3JlbWVudFwiLCBcImNvdW50ZXItcmVzZXRcIiwgXCJjcm9wXCIsIFwiY3VlXCIsIFwiY3VlLWFmdGVyXCIsXG4gICAgXCJjdWUtYmVmb3JlXCIsIFwiY3Vyc29yXCIsIFwiZGlyZWN0aW9uXCIsIFwiZGlzcGxheVwiLCBcImRvbWluYW50LWJhc2VsaW5lXCIsXG4gICAgXCJkcm9wLWluaXRpYWwtYWZ0ZXItYWRqdXN0XCIsIFwiZHJvcC1pbml0aWFsLWFmdGVyLWFsaWduXCIsXG4gICAgXCJkcm9wLWluaXRpYWwtYmVmb3JlLWFkanVzdFwiLCBcImRyb3AtaW5pdGlhbC1iZWZvcmUtYWxpZ25cIiwgXCJkcm9wLWluaXRpYWwtc2l6ZVwiLFxuICAgIFwiZHJvcC1pbml0aWFsLXZhbHVlXCIsIFwiZWxldmF0aW9uXCIsIFwiZW1wdHktY2VsbHNcIiwgXCJmaXRcIiwgXCJmaXQtcG9zaXRpb25cIixcbiAgICBcImZsZXhcIiwgXCJmbGV4LWJhc2lzXCIsIFwiZmxleC1kaXJlY3Rpb25cIiwgXCJmbGV4LWZsb3dcIiwgXCJmbGV4LWdyb3dcIixcbiAgICBcImZsZXgtc2hyaW5rXCIsIFwiZmxleC13cmFwXCIsIFwiZmxvYXRcIiwgXCJmbG9hdC1vZmZzZXRcIiwgXCJmbG93LWZyb21cIiwgXCJmbG93LWludG9cIixcbiAgICBcImZvbnRcIiwgXCJmb250LWZhbWlseVwiLCBcImZvbnQtZmVhdHVyZS1zZXR0aW5nc1wiLCBcImZvbnQta2VybmluZ1wiLFxuICAgIFwiZm9udC1sYW5ndWFnZS1vdmVycmlkZVwiLCBcImZvbnQtb3B0aWNhbC1zaXppbmdcIiwgXCJmb250LXNpemVcIixcbiAgICBcImZvbnQtc2l6ZS1hZGp1c3RcIiwgXCJmb250LXN0cmV0Y2hcIiwgXCJmb250LXN0eWxlXCIsIFwiZm9udC1zeW50aGVzaXNcIixcbiAgICBcImZvbnQtdmFyaWFudFwiLCBcImZvbnQtdmFyaWFudC1hbHRlcm5hdGVzXCIsIFwiZm9udC12YXJpYW50LWNhcHNcIixcbiAgICBcImZvbnQtdmFyaWFudC1lYXN0LWFzaWFuXCIsIFwiZm9udC12YXJpYW50LWxpZ2F0dXJlc1wiLCBcImZvbnQtdmFyaWFudC1udW1lcmljXCIsXG4gICAgXCJmb250LXZhcmlhbnQtcG9zaXRpb25cIiwgXCJmb250LXZhcmlhdGlvbi1zZXR0aW5nc1wiLCBcImZvbnQtd2VpZ2h0XCIsIFwiZ2FwXCIsXG4gICAgXCJncmlkXCIsIFwiZ3JpZC1hcmVhXCIsIFwiZ3JpZC1hdXRvLWNvbHVtbnNcIiwgXCJncmlkLWF1dG8tZmxvd1wiLCBcImdyaWQtYXV0by1yb3dzXCIsXG4gICAgXCJncmlkLWNvbHVtblwiLCBcImdyaWQtY29sdW1uLWVuZFwiLCBcImdyaWQtY29sdW1uLWdhcFwiLCBcImdyaWQtY29sdW1uLXN0YXJ0XCIsXG4gICAgXCJncmlkLWdhcFwiLCBcImdyaWQtcm93XCIsIFwiZ3JpZC1yb3ctZW5kXCIsIFwiZ3JpZC1yb3ctZ2FwXCIsIFwiZ3JpZC1yb3ctc3RhcnRcIixcbiAgICBcImdyaWQtdGVtcGxhdGVcIiwgXCJncmlkLXRlbXBsYXRlLWFyZWFzXCIsIFwiZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zXCIsXG4gICAgXCJncmlkLXRlbXBsYXRlLXJvd3NcIiwgXCJoYW5naW5nLXB1bmN0dWF0aW9uXCIsIFwiaGVpZ2h0XCIsIFwiaHlwaGVuc1wiLCBcImljb25cIixcbiAgICBcImltYWdlLW9yaWVudGF0aW9uXCIsIFwiaW1hZ2UtcmVuZGVyaW5nXCIsIFwiaW1hZ2UtcmVzb2x1dGlvblwiLCBcImlubGluZS1ib3gtYWxpZ25cIixcbiAgICBcImluc2V0XCIsIFwiaW5zZXQtYmxvY2tcIiwgXCJpbnNldC1ibG9jay1lbmRcIiwgXCJpbnNldC1ibG9jay1zdGFydFwiLCBcImluc2V0LWlubGluZVwiLFxuICAgIFwiaW5zZXQtaW5saW5lLWVuZFwiLCBcImluc2V0LWlubGluZS1zdGFydFwiLCBcImlzb2xhdGlvblwiLCBcImp1c3RpZnktY29udGVudFwiLFxuICAgIFwianVzdGlmeS1pdGVtc1wiLCBcImp1c3RpZnktc2VsZlwiLCBcImxlZnRcIiwgXCJsZXR0ZXItc3BhY2luZ1wiLCBcImxpbmUtYnJlYWtcIixcbiAgICBcImxpbmUtaGVpZ2h0XCIsIFwibGluZS1oZWlnaHQtc3RlcFwiLCBcImxpbmUtc3RhY2tpbmdcIiwgXCJsaW5lLXN0YWNraW5nLXJ1YnlcIixcbiAgICBcImxpbmUtc3RhY2tpbmctc2hpZnRcIiwgXCJsaW5lLXN0YWNraW5nLXN0cmF0ZWd5XCIsIFwibGlzdC1zdHlsZVwiLFxuICAgIFwibGlzdC1zdHlsZS1pbWFnZVwiLCBcImxpc3Qtc3R5bGUtcG9zaXRpb25cIiwgXCJsaXN0LXN0eWxlLXR5cGVcIiwgXCJtYXJnaW5cIixcbiAgICBcIm1hcmdpbi1ib3R0b21cIiwgXCJtYXJnaW4tbGVmdFwiLCBcIm1hcmdpbi1yaWdodFwiLCBcIm1hcmdpbi10b3BcIiwgXCJtYXJrc1wiLFxuICAgIFwibWFycXVlZS1kaXJlY3Rpb25cIiwgXCJtYXJxdWVlLWxvb3BcIiwgXCJtYXJxdWVlLXBsYXktY291bnRcIiwgXCJtYXJxdWVlLXNwZWVkXCIsXG4gICAgXCJtYXJxdWVlLXN0eWxlXCIsIFwibWFzay1jbGlwXCIsIFwibWFzay1jb21wb3NpdGVcIiwgXCJtYXNrLWltYWdlXCIsIFwibWFzay1tb2RlXCIsXG4gICAgXCJtYXNrLW9yaWdpblwiLCBcIm1hc2stcG9zaXRpb25cIiwgXCJtYXNrLXJlcGVhdFwiLCBcIm1hc2stc2l6ZVwiLFwibWFzay10eXBlXCIsXG4gICAgXCJtYXgtYmxvY2stc2l6ZVwiLCBcIm1heC1oZWlnaHRcIiwgXCJtYXgtaW5saW5lLXNpemVcIixcbiAgICBcIm1heC13aWR0aFwiLCBcIm1pbi1ibG9jay1zaXplXCIsIFwibWluLWhlaWdodFwiLCBcIm1pbi1pbmxpbmUtc2l6ZVwiLCBcIm1pbi13aWR0aFwiLFxuICAgIFwibWl4LWJsZW5kLW1vZGVcIiwgXCJtb3ZlLXRvXCIsIFwibmF2LWRvd25cIiwgXCJuYXYtaW5kZXhcIiwgXCJuYXYtbGVmdFwiLCBcIm5hdi1yaWdodFwiLFxuICAgIFwibmF2LXVwXCIsIFwib2JqZWN0LWZpdFwiLCBcIm9iamVjdC1wb3NpdGlvblwiLCBcIm9mZnNldFwiLCBcIm9mZnNldC1hbmNob3JcIixcbiAgICBcIm9mZnNldC1kaXN0YW5jZVwiLCBcIm9mZnNldC1wYXRoXCIsIFwib2Zmc2V0LXBvc2l0aW9uXCIsIFwib2Zmc2V0LXJvdGF0ZVwiLFxuICAgIFwib3BhY2l0eVwiLCBcIm9yZGVyXCIsIFwib3JwaGFuc1wiLCBcIm91dGxpbmVcIiwgXCJvdXRsaW5lLWNvbG9yXCIsIFwib3V0bGluZS1vZmZzZXRcIixcbiAgICBcIm91dGxpbmUtc3R5bGVcIiwgXCJvdXRsaW5lLXdpZHRoXCIsIFwib3ZlcmZsb3dcIiwgXCJvdmVyZmxvdy1zdHlsZVwiLFxuICAgIFwib3ZlcmZsb3ctd3JhcFwiLCBcIm92ZXJmbG93LXhcIiwgXCJvdmVyZmxvdy15XCIsIFwicGFkZGluZ1wiLCBcInBhZGRpbmctYm90dG9tXCIsXG4gICAgXCJwYWRkaW5nLWxlZnRcIiwgXCJwYWRkaW5nLXJpZ2h0XCIsIFwicGFkZGluZy10b3BcIiwgXCJwYWdlXCIsIFwicGFnZS1icmVhay1hZnRlclwiLFxuICAgIFwicGFnZS1icmVhay1iZWZvcmVcIiwgXCJwYWdlLWJyZWFrLWluc2lkZVwiLCBcInBhZ2UtcG9saWN5XCIsIFwicGF1c2VcIixcbiAgICBcInBhdXNlLWFmdGVyXCIsIFwicGF1c2UtYmVmb3JlXCIsIFwicGVyc3BlY3RpdmVcIiwgXCJwZXJzcGVjdGl2ZS1vcmlnaW5cIiwgXCJwaXRjaFwiLFxuICAgIFwicGl0Y2gtcmFuZ2VcIiwgXCJwbGFjZS1jb250ZW50XCIsIFwicGxhY2UtaXRlbXNcIiwgXCJwbGFjZS1zZWxmXCIsIFwicGxheS1kdXJpbmdcIixcbiAgICBcInBvc2l0aW9uXCIsIFwicHJlc2VudGF0aW9uLWxldmVsXCIsIFwicHVuY3R1YXRpb24tdHJpbVwiLCBcInF1b3Rlc1wiLFxuICAgIFwicmVnaW9uLWJyZWFrLWFmdGVyXCIsIFwicmVnaW9uLWJyZWFrLWJlZm9yZVwiLCBcInJlZ2lvbi1icmVhay1pbnNpZGVcIixcbiAgICBcInJlZ2lvbi1mcmFnbWVudFwiLCBcInJlbmRlcmluZy1pbnRlbnRcIiwgXCJyZXNpemVcIiwgXCJyZXN0XCIsIFwicmVzdC1hZnRlclwiLFxuICAgIFwicmVzdC1iZWZvcmVcIiwgXCJyaWNobmVzc1wiLCBcInJpZ2h0XCIsIFwicm90YXRlXCIsIFwicm90YXRpb25cIiwgXCJyb3RhdGlvbi1wb2ludFwiLFxuICAgIFwicm93LWdhcFwiLCBcInJ1YnktYWxpZ25cIiwgXCJydWJ5LW92ZXJoYW5nXCIsIFwicnVieS1wb3NpdGlvblwiLCBcInJ1Ynktc3BhblwiLFxuICAgIFwic2NhbGVcIiwgXCJzY3JvbGwtYmVoYXZpb3JcIiwgXCJzY3JvbGwtbWFyZ2luXCIsIFwic2Nyb2xsLW1hcmdpbi1ibG9ja1wiLFxuICAgIFwic2Nyb2xsLW1hcmdpbi1ibG9jay1lbmRcIiwgXCJzY3JvbGwtbWFyZ2luLWJsb2NrLXN0YXJ0XCIsIFwic2Nyb2xsLW1hcmdpbi1ib3R0b21cIixcbiAgICBcInNjcm9sbC1tYXJnaW4taW5saW5lXCIsIFwic2Nyb2xsLW1hcmdpbi1pbmxpbmUtZW5kXCIsXG4gICAgXCJzY3JvbGwtbWFyZ2luLWlubGluZS1zdGFydFwiLCBcInNjcm9sbC1tYXJnaW4tbGVmdFwiLCBcInNjcm9sbC1tYXJnaW4tcmlnaHRcIixcbiAgICBcInNjcm9sbC1tYXJnaW4tdG9wXCIsIFwic2Nyb2xsLXBhZGRpbmdcIiwgXCJzY3JvbGwtcGFkZGluZy1ibG9ja1wiLFxuICAgIFwic2Nyb2xsLXBhZGRpbmctYmxvY2stZW5kXCIsIFwic2Nyb2xsLXBhZGRpbmctYmxvY2stc3RhcnRcIixcbiAgICBcInNjcm9sbC1wYWRkaW5nLWJvdHRvbVwiLCBcInNjcm9sbC1wYWRkaW5nLWlubGluZVwiLCBcInNjcm9sbC1wYWRkaW5nLWlubGluZS1lbmRcIixcbiAgICBcInNjcm9sbC1wYWRkaW5nLWlubGluZS1zdGFydFwiLCBcInNjcm9sbC1wYWRkaW5nLWxlZnRcIiwgXCJzY3JvbGwtcGFkZGluZy1yaWdodFwiLFxuICAgIFwic2Nyb2xsLXBhZGRpbmctdG9wXCIsIFwic2Nyb2xsLXNuYXAtYWxpZ25cIiwgXCJzY3JvbGwtc25hcC10eXBlXCIsXG4gICAgXCJzaGFwZS1pbWFnZS10aHJlc2hvbGRcIiwgXCJzaGFwZS1pbnNpZGVcIiwgXCJzaGFwZS1tYXJnaW5cIiwgXCJzaGFwZS1vdXRzaWRlXCIsXG4gICAgXCJzaXplXCIsIFwic3BlYWtcIiwgXCJzcGVhay1hc1wiLCBcInNwZWFrLWhlYWRlclwiLCBcInNwZWFrLW51bWVyYWxcIixcbiAgICBcInNwZWFrLXB1bmN0dWF0aW9uXCIsIFwic3BlZWNoLXJhdGVcIiwgXCJzdHJlc3NcIiwgXCJzdHJpbmctc2V0XCIsIFwidGFiLXNpemVcIixcbiAgICBcInRhYmxlLWxheW91dFwiLCBcInRhcmdldFwiLCBcInRhcmdldC1uYW1lXCIsIFwidGFyZ2V0LW5ld1wiLCBcInRhcmdldC1wb3NpdGlvblwiLFxuICAgIFwidGV4dC1hbGlnblwiLCBcInRleHQtYWxpZ24tbGFzdFwiLCBcInRleHQtY29tYmluZS11cHJpZ2h0XCIsIFwidGV4dC1kZWNvcmF0aW9uXCIsXG4gICAgXCJ0ZXh0LWRlY29yYXRpb24tY29sb3JcIiwgXCJ0ZXh0LWRlY29yYXRpb24tbGluZVwiLCBcInRleHQtZGVjb3JhdGlvbi1za2lwXCIsXG4gICAgXCJ0ZXh0LWRlY29yYXRpb24tc2tpcC1pbmtcIiwgXCJ0ZXh0LWRlY29yYXRpb24tc3R5bGVcIiwgXCJ0ZXh0LWVtcGhhc2lzXCIsXG4gICAgXCJ0ZXh0LWVtcGhhc2lzLWNvbG9yXCIsIFwidGV4dC1lbXBoYXNpcy1wb3NpdGlvblwiLCBcInRleHQtZW1waGFzaXMtc3R5bGVcIixcbiAgICBcInRleHQtaGVpZ2h0XCIsIFwidGV4dC1pbmRlbnRcIiwgXCJ0ZXh0LWp1c3RpZnlcIiwgXCJ0ZXh0LW9yaWVudGF0aW9uXCIsXG4gICAgXCJ0ZXh0LW91dGxpbmVcIiwgXCJ0ZXh0LW92ZXJmbG93XCIsIFwidGV4dC1yZW5kZXJpbmdcIiwgXCJ0ZXh0LXNoYWRvd1wiLFxuICAgIFwidGV4dC1zaXplLWFkanVzdFwiLCBcInRleHQtc3BhY2UtY29sbGFwc2VcIiwgXCJ0ZXh0LXRyYW5zZm9ybVwiLFxuICAgIFwidGV4dC11bmRlcmxpbmUtcG9zaXRpb25cIiwgXCJ0ZXh0LXdyYXBcIiwgXCJ0b3BcIiwgXCJ0b3VjaC1hY3Rpb25cIiwgXCJ0cmFuc2Zvcm1cIiwgXCJ0cmFuc2Zvcm0tb3JpZ2luXCIsXG4gICAgXCJ0cmFuc2Zvcm0tc3R5bGVcIiwgXCJ0cmFuc2l0aW9uXCIsIFwidHJhbnNpdGlvbi1kZWxheVwiLCBcInRyYW5zaXRpb24tZHVyYXRpb25cIixcbiAgICBcInRyYW5zaXRpb24tcHJvcGVydHlcIiwgXCJ0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvblwiLCBcInRyYW5zbGF0ZVwiLFxuICAgIFwidW5pY29kZS1iaWRpXCIsIFwidXNlci1zZWxlY3RcIiwgXCJ2ZXJ0aWNhbC1hbGlnblwiLCBcInZpc2liaWxpdHlcIiwgXCJ2b2ljZS1iYWxhbmNlXCIsXG4gICAgXCJ2b2ljZS1kdXJhdGlvblwiLCBcInZvaWNlLWZhbWlseVwiLCBcInZvaWNlLXBpdGNoXCIsIFwidm9pY2UtcmFuZ2VcIiwgXCJ2b2ljZS1yYXRlXCIsXG4gICAgXCJ2b2ljZS1zdHJlc3NcIiwgXCJ2b2ljZS12b2x1bWVcIiwgXCJ2b2x1bWVcIiwgXCJ3aGl0ZS1zcGFjZVwiLCBcIndpZG93c1wiLCBcIndpZHRoXCIsXG4gICAgXCJ3aWxsLWNoYW5nZVwiLCBcIndvcmQtYnJlYWtcIiwgXCJ3b3JkLXNwYWNpbmdcIiwgXCJ3b3JkLXdyYXBcIiwgXCJ3cml0aW5nLW1vZGVcIiwgXCJ6LWluZGV4XCIsXG4gICAgLy8gU1ZHLXNwZWNpZmljXG4gICAgXCJjbGlwLXBhdGhcIiwgXCJjbGlwLXJ1bGVcIiwgXCJtYXNrXCIsIFwiZW5hYmxlLWJhY2tncm91bmRcIiwgXCJmaWx0ZXJcIiwgXCJmbG9vZC1jb2xvclwiLFxuICAgIFwiZmxvb2Qtb3BhY2l0eVwiLCBcImxpZ2h0aW5nLWNvbG9yXCIsIFwic3RvcC1jb2xvclwiLCBcInN0b3Atb3BhY2l0eVwiLCBcInBvaW50ZXItZXZlbnRzXCIsXG4gICAgXCJjb2xvci1pbnRlcnBvbGF0aW9uXCIsIFwiY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzXCIsXG4gICAgXCJjb2xvci1yZW5kZXJpbmdcIiwgXCJmaWxsXCIsIFwiZmlsbC1vcGFjaXR5XCIsIFwiZmlsbC1ydWxlXCIsIFwiaW1hZ2UtcmVuZGVyaW5nXCIsXG4gICAgXCJtYXJrZXJcIiwgXCJtYXJrZXItZW5kXCIsIFwibWFya2VyLW1pZFwiLCBcIm1hcmtlci1zdGFydFwiLCBcInBhaW50LW9yZGVyXCIsIFwic2hhcGUtcmVuZGVyaW5nXCIsIFwic3Ryb2tlXCIsXG4gICAgXCJzdHJva2UtZGFzaGFycmF5XCIsIFwic3Ryb2tlLWRhc2hvZmZzZXRcIiwgXCJzdHJva2UtbGluZWNhcFwiLCBcInN0cm9rZS1saW5lam9pblwiLFxuICAgIFwic3Ryb2tlLW1pdGVybGltaXRcIiwgXCJzdHJva2Utb3BhY2l0eVwiLCBcInN0cm9rZS13aWR0aFwiLCBcInRleHQtcmVuZGVyaW5nXCIsXG4gICAgXCJiYXNlbGluZS1zaGlmdFwiLCBcImRvbWluYW50LWJhc2VsaW5lXCIsIFwiZ2x5cGgtb3JpZW50YXRpb24taG9yaXpvbnRhbFwiLFxuICAgIFwiZ2x5cGgtb3JpZW50YXRpb24tdmVydGljYWxcIiwgXCJ0ZXh0LWFuY2hvclwiLCBcIndyaXRpbmctbW9kZVwiLFxuICBdLCBwcm9wZXJ0eUtleXdvcmRzID0ga2V5U2V0KHByb3BlcnR5S2V5d29yZHNfKTtcblxuICB2YXIgbm9uU3RhbmRhcmRQcm9wZXJ0eUtleXdvcmRzXyA9IFtcbiAgICBcImJvcmRlci1ibG9ja1wiLCBcImJvcmRlci1ibG9jay1jb2xvclwiLCBcImJvcmRlci1ibG9jay1lbmRcIixcbiAgICBcImJvcmRlci1ibG9jay1lbmQtY29sb3JcIiwgXCJib3JkZXItYmxvY2stZW5kLXN0eWxlXCIsIFwiYm9yZGVyLWJsb2NrLWVuZC13aWR0aFwiLFxuICAgIFwiYm9yZGVyLWJsb2NrLXN0YXJ0XCIsIFwiYm9yZGVyLWJsb2NrLXN0YXJ0LWNvbG9yXCIsIFwiYm9yZGVyLWJsb2NrLXN0YXJ0LXN0eWxlXCIsXG4gICAgXCJib3JkZXItYmxvY2stc3RhcnQtd2lkdGhcIiwgXCJib3JkZXItYmxvY2stc3R5bGVcIiwgXCJib3JkZXItYmxvY2std2lkdGhcIixcbiAgICBcImJvcmRlci1pbmxpbmVcIiwgXCJib3JkZXItaW5saW5lLWNvbG9yXCIsIFwiYm9yZGVyLWlubGluZS1lbmRcIixcbiAgICBcImJvcmRlci1pbmxpbmUtZW5kLWNvbG9yXCIsIFwiYm9yZGVyLWlubGluZS1lbmQtc3R5bGVcIixcbiAgICBcImJvcmRlci1pbmxpbmUtZW5kLXdpZHRoXCIsIFwiYm9yZGVyLWlubGluZS1zdGFydFwiLCBcImJvcmRlci1pbmxpbmUtc3RhcnQtY29sb3JcIixcbiAgICBcImJvcmRlci1pbmxpbmUtc3RhcnQtc3R5bGVcIiwgXCJib3JkZXItaW5saW5lLXN0YXJ0LXdpZHRoXCIsXG4gICAgXCJib3JkZXItaW5saW5lLXN0eWxlXCIsIFwiYm9yZGVyLWlubGluZS13aWR0aFwiLCBcIm1hcmdpbi1ibG9ja1wiLFxuICAgIFwibWFyZ2luLWJsb2NrLWVuZFwiLCBcIm1hcmdpbi1ibG9jay1zdGFydFwiLCBcIm1hcmdpbi1pbmxpbmVcIiwgXCJtYXJnaW4taW5saW5lLWVuZFwiLFxuICAgIFwibWFyZ2luLWlubGluZS1zdGFydFwiLCBcInBhZGRpbmctYmxvY2tcIiwgXCJwYWRkaW5nLWJsb2NrLWVuZFwiLFxuICAgIFwicGFkZGluZy1ibG9jay1zdGFydFwiLCBcInBhZGRpbmctaW5saW5lXCIsIFwicGFkZGluZy1pbmxpbmUtZW5kXCIsXG4gICAgXCJwYWRkaW5nLWlubGluZS1zdGFydFwiLCBcInNjcm9sbC1zbmFwLXN0b3BcIiwgXCJzY3JvbGxiYXItM2QtbGlnaHQtY29sb3JcIixcbiAgICBcInNjcm9sbGJhci1hcnJvdy1jb2xvclwiLCBcInNjcm9sbGJhci1iYXNlLWNvbG9yXCIsIFwic2Nyb2xsYmFyLWRhcmstc2hhZG93LWNvbG9yXCIsXG4gICAgXCJzY3JvbGxiYXItZmFjZS1jb2xvclwiLCBcInNjcm9sbGJhci1oaWdobGlnaHQtY29sb3JcIiwgXCJzY3JvbGxiYXItc2hhZG93LWNvbG9yXCIsXG4gICAgXCJzY3JvbGxiYXItdHJhY2stY29sb3JcIiwgXCJzZWFyY2hmaWVsZC1jYW5jZWwtYnV0dG9uXCIsIFwic2VhcmNoZmllbGQtZGVjb3JhdGlvblwiLFxuICAgIFwic2VhcmNoZmllbGQtcmVzdWx0cy1idXR0b25cIiwgXCJzZWFyY2hmaWVsZC1yZXN1bHRzLWRlY29yYXRpb25cIiwgXCJzaGFwZS1pbnNpZGVcIiwgXCJ6b29tXCJcbiAgXSwgbm9uU3RhbmRhcmRQcm9wZXJ0eUtleXdvcmRzID0ga2V5U2V0KG5vblN0YW5kYXJkUHJvcGVydHlLZXl3b3Jkc18pO1xuXG4gIHZhciBmb250UHJvcGVydGllc18gPSBbXG4gICAgXCJmb250LWRpc3BsYXlcIiwgXCJmb250LWZhbWlseVwiLCBcInNyY1wiLCBcInVuaWNvZGUtcmFuZ2VcIiwgXCJmb250LXZhcmlhbnRcIixcbiAgICAgXCJmb250LWZlYXR1cmUtc2V0dGluZ3NcIiwgXCJmb250LXN0cmV0Y2hcIiwgXCJmb250LXdlaWdodFwiLCBcImZvbnQtc3R5bGVcIlxuICBdLCBmb250UHJvcGVydGllcyA9IGtleVNldChmb250UHJvcGVydGllc18pO1xuXG4gIHZhciBjb3VudGVyRGVzY3JpcHRvcnNfID0gW1xuICAgIFwiYWRkaXRpdmUtc3ltYm9sc1wiLCBcImZhbGxiYWNrXCIsIFwibmVnYXRpdmVcIiwgXCJwYWRcIiwgXCJwcmVmaXhcIiwgXCJyYW5nZVwiLFxuICAgIFwic3BlYWstYXNcIiwgXCJzdWZmaXhcIiwgXCJzeW1ib2xzXCIsIFwic3lzdGVtXCJcbiAgXSwgY291bnRlckRlc2NyaXB0b3JzID0ga2V5U2V0KGNvdW50ZXJEZXNjcmlwdG9yc18pO1xuXG4gIHZhciBjb2xvcktleXdvcmRzXyA9IFtcbiAgICBcImFsaWNlYmx1ZVwiLCBcImFudGlxdWV3aGl0ZVwiLCBcImFxdWFcIiwgXCJhcXVhbWFyaW5lXCIsIFwiYXp1cmVcIiwgXCJiZWlnZVwiLFxuICAgIFwiYmlzcXVlXCIsIFwiYmxhY2tcIiwgXCJibGFuY2hlZGFsbW9uZFwiLCBcImJsdWVcIiwgXCJibHVldmlvbGV0XCIsIFwiYnJvd25cIixcbiAgICBcImJ1cmx5d29vZFwiLCBcImNhZGV0Ymx1ZVwiLCBcImNoYXJ0cmV1c2VcIiwgXCJjaG9jb2xhdGVcIiwgXCJjb3JhbFwiLCBcImNvcm5mbG93ZXJibHVlXCIsXG4gICAgXCJjb3Juc2lsa1wiLCBcImNyaW1zb25cIiwgXCJjeWFuXCIsIFwiZGFya2JsdWVcIiwgXCJkYXJrY3lhblwiLCBcImRhcmtnb2xkZW5yb2RcIixcbiAgICBcImRhcmtncmF5XCIsIFwiZGFya2dyZWVuXCIsIFwiZGFya2toYWtpXCIsIFwiZGFya21hZ2VudGFcIiwgXCJkYXJrb2xpdmVncmVlblwiLFxuICAgIFwiZGFya29yYW5nZVwiLCBcImRhcmtvcmNoaWRcIiwgXCJkYXJrcmVkXCIsIFwiZGFya3NhbG1vblwiLCBcImRhcmtzZWFncmVlblwiLFxuICAgIFwiZGFya3NsYXRlYmx1ZVwiLCBcImRhcmtzbGF0ZWdyYXlcIiwgXCJkYXJrdHVycXVvaXNlXCIsIFwiZGFya3Zpb2xldFwiLFxuICAgIFwiZGVlcHBpbmtcIiwgXCJkZWVwc2t5Ymx1ZVwiLCBcImRpbWdyYXlcIiwgXCJkb2RnZXJibHVlXCIsIFwiZmlyZWJyaWNrXCIsXG4gICAgXCJmbG9yYWx3aGl0ZVwiLCBcImZvcmVzdGdyZWVuXCIsIFwiZnVjaHNpYVwiLCBcImdhaW5zYm9yb1wiLCBcImdob3N0d2hpdGVcIixcbiAgICBcImdvbGRcIiwgXCJnb2xkZW5yb2RcIiwgXCJncmF5XCIsIFwiZ3JleVwiLCBcImdyZWVuXCIsIFwiZ3JlZW55ZWxsb3dcIiwgXCJob25leWRld1wiLFxuICAgIFwiaG90cGlua1wiLCBcImluZGlhbnJlZFwiLCBcImluZGlnb1wiLCBcIml2b3J5XCIsIFwia2hha2lcIiwgXCJsYXZlbmRlclwiLFxuICAgIFwibGF2ZW5kZXJibHVzaFwiLCBcImxhd25ncmVlblwiLCBcImxlbW9uY2hpZmZvblwiLCBcImxpZ2h0Ymx1ZVwiLCBcImxpZ2h0Y29yYWxcIixcbiAgICBcImxpZ2h0Y3lhblwiLCBcImxpZ2h0Z29sZGVucm9keWVsbG93XCIsIFwibGlnaHRncmF5XCIsIFwibGlnaHRncmVlblwiLCBcImxpZ2h0cGlua1wiLFxuICAgIFwibGlnaHRzYWxtb25cIiwgXCJsaWdodHNlYWdyZWVuXCIsIFwibGlnaHRza3libHVlXCIsIFwibGlnaHRzbGF0ZWdyYXlcIixcbiAgICBcImxpZ2h0c3RlZWxibHVlXCIsIFwibGlnaHR5ZWxsb3dcIiwgXCJsaW1lXCIsIFwibGltZWdyZWVuXCIsIFwibGluZW5cIiwgXCJtYWdlbnRhXCIsXG4gICAgXCJtYXJvb25cIiwgXCJtZWRpdW1hcXVhbWFyaW5lXCIsIFwibWVkaXVtYmx1ZVwiLCBcIm1lZGl1bW9yY2hpZFwiLCBcIm1lZGl1bXB1cnBsZVwiLFxuICAgIFwibWVkaXVtc2VhZ3JlZW5cIiwgXCJtZWRpdW1zbGF0ZWJsdWVcIiwgXCJtZWRpdW1zcHJpbmdncmVlblwiLCBcIm1lZGl1bXR1cnF1b2lzZVwiLFxuICAgIFwibWVkaXVtdmlvbGV0cmVkXCIsIFwibWlkbmlnaHRibHVlXCIsIFwibWludGNyZWFtXCIsIFwibWlzdHlyb3NlXCIsIFwibW9jY2FzaW5cIixcbiAgICBcIm5hdmFqb3doaXRlXCIsIFwibmF2eVwiLCBcIm9sZGxhY2VcIiwgXCJvbGl2ZVwiLCBcIm9saXZlZHJhYlwiLCBcIm9yYW5nZVwiLCBcIm9yYW5nZXJlZFwiLFxuICAgIFwib3JjaGlkXCIsIFwicGFsZWdvbGRlbnJvZFwiLCBcInBhbGVncmVlblwiLCBcInBhbGV0dXJxdW9pc2VcIiwgXCJwYWxldmlvbGV0cmVkXCIsXG4gICAgXCJwYXBheWF3aGlwXCIsIFwicGVhY2hwdWZmXCIsIFwicGVydVwiLCBcInBpbmtcIiwgXCJwbHVtXCIsIFwicG93ZGVyYmx1ZVwiLFxuICAgIFwicHVycGxlXCIsIFwicmViZWNjYXB1cnBsZVwiLCBcInJlZFwiLCBcInJvc3licm93blwiLCBcInJveWFsYmx1ZVwiLCBcInNhZGRsZWJyb3duXCIsXG4gICAgXCJzYWxtb25cIiwgXCJzYW5keWJyb3duXCIsIFwic2VhZ3JlZW5cIiwgXCJzZWFzaGVsbFwiLCBcInNpZW5uYVwiLCBcInNpbHZlclwiLCBcInNreWJsdWVcIixcbiAgICBcInNsYXRlYmx1ZVwiLCBcInNsYXRlZ3JheVwiLCBcInNub3dcIiwgXCJzcHJpbmdncmVlblwiLCBcInN0ZWVsYmx1ZVwiLCBcInRhblwiLFxuICAgIFwidGVhbFwiLCBcInRoaXN0bGVcIiwgXCJ0b21hdG9cIiwgXCJ0dXJxdW9pc2VcIiwgXCJ2aW9sZXRcIiwgXCJ3aGVhdFwiLCBcIndoaXRlXCIsXG4gICAgXCJ3aGl0ZXNtb2tlXCIsIFwieWVsbG93XCIsIFwieWVsbG93Z3JlZW5cIlxuICBdLCBjb2xvcktleXdvcmRzID0ga2V5U2V0KGNvbG9yS2V5d29yZHNfKTtcblxuICB2YXIgdmFsdWVLZXl3b3Jkc18gPSBbXG4gICAgXCJhYm92ZVwiLCBcImFic29sdXRlXCIsIFwiYWN0aXZlYm9yZGVyXCIsIFwiYWRkaXRpdmVcIiwgXCJhY3RpdmVjYXB0aW9uXCIsIFwiYWZhclwiLFxuICAgIFwiYWZ0ZXItd2hpdGUtc3BhY2VcIiwgXCJhaGVhZFwiLCBcImFsaWFzXCIsIFwiYWxsXCIsIFwiYWxsLXNjcm9sbFwiLCBcImFscGhhYmV0aWNcIiwgXCJhbHRlcm5hdGVcIixcbiAgICBcImFsd2F5c1wiLCBcImFtaGFyaWNcIiwgXCJhbWhhcmljLWFiZWdlZGVcIiwgXCJhbnRpYWxpYXNlZFwiLCBcImFwcHdvcmtzcGFjZVwiLFxuICAgIFwiYXJhYmljLWluZGljXCIsIFwiYXJtZW5pYW5cIiwgXCJhc3Rlcmlza3NcIiwgXCJhdHRyXCIsIFwiYXV0b1wiLCBcImF1dG8tZmxvd1wiLCBcImF2b2lkXCIsIFwiYXZvaWQtY29sdW1uXCIsIFwiYXZvaWQtcGFnZVwiLFxuICAgIFwiYXZvaWQtcmVnaW9uXCIsIFwiYXhpcy1wYW5cIiwgXCJiYWNrZ3JvdW5kXCIsIFwiYmFja3dhcmRzXCIsIFwiYmFzZWxpbmVcIiwgXCJiZWxvd1wiLCBcImJpZGktb3ZlcnJpZGVcIiwgXCJiaW5hcnlcIixcbiAgICBcImJlbmdhbGlcIiwgXCJibGlua1wiLCBcImJsb2NrXCIsIFwiYmxvY2stYXhpc1wiLCBcImJvbGRcIiwgXCJib2xkZXJcIiwgXCJib3JkZXJcIiwgXCJib3JkZXItYm94XCIsXG4gICAgXCJib3RoXCIsIFwiYm90dG9tXCIsIFwiYnJlYWtcIiwgXCJicmVhay1hbGxcIiwgXCJicmVhay13b3JkXCIsIFwiYnVsbGV0c1wiLCBcImJ1dHRvblwiLCBcImJ1dHRvbi1iZXZlbFwiLFxuICAgIFwiYnV0dG9uZmFjZVwiLCBcImJ1dHRvbmhpZ2hsaWdodFwiLCBcImJ1dHRvbnNoYWRvd1wiLCBcImJ1dHRvbnRleHRcIiwgXCJjYWxjXCIsIFwiY2FtYm9kaWFuXCIsXG4gICAgXCJjYXBpdGFsaXplXCIsIFwiY2Fwcy1sb2NrLWluZGljYXRvclwiLCBcImNhcHRpb25cIiwgXCJjYXB0aW9udGV4dFwiLCBcImNhcmV0XCIsXG4gICAgXCJjZWxsXCIsIFwiY2VudGVyXCIsIFwiY2hlY2tib3hcIiwgXCJjaXJjbGVcIiwgXCJjamstZGVjaW1hbFwiLCBcImNqay1lYXJ0aGx5LWJyYW5jaFwiLFxuICAgIFwiY2prLWhlYXZlbmx5LXN0ZW1cIiwgXCJjamstaWRlb2dyYXBoaWNcIiwgXCJjbGVhclwiLCBcImNsaXBcIiwgXCJjbG9zZS1xdW90ZVwiLFxuICAgIFwiY29sLXJlc2l6ZVwiLCBcImNvbGxhcHNlXCIsIFwiY29sb3JcIiwgXCJjb2xvci1idXJuXCIsIFwiY29sb3ItZG9kZ2VcIiwgXCJjb2x1bW5cIiwgXCJjb2x1bW4tcmV2ZXJzZVwiLFxuICAgIFwiY29tcGFjdFwiLCBcImNvbmRlbnNlZFwiLCBcImNvbnRhaW5cIiwgXCJjb250ZW50XCIsIFwiY29udGVudHNcIixcbiAgICBcImNvbnRlbnQtYm94XCIsIFwiY29udGV4dC1tZW51XCIsIFwiY29udGludW91c1wiLCBcImNvcHlcIiwgXCJjb3VudGVyXCIsIFwiY291bnRlcnNcIiwgXCJjb3ZlclwiLCBcImNyb3BcIixcbiAgICBcImNyb3NzXCIsIFwiY3Jvc3NoYWlyXCIsIFwiY3VycmVudGNvbG9yXCIsIFwiY3Vyc2l2ZVwiLCBcImN5Y2xpY1wiLCBcImRhcmtlblwiLCBcImRhc2hlZFwiLCBcImRlY2ltYWxcIixcbiAgICBcImRlY2ltYWwtbGVhZGluZy16ZXJvXCIsIFwiZGVmYXVsdFwiLCBcImRlZmF1bHQtYnV0dG9uXCIsIFwiZGVuc2VcIiwgXCJkZXN0aW5hdGlvbi1hdG9wXCIsXG4gICAgXCJkZXN0aW5hdGlvbi1pblwiLCBcImRlc3RpbmF0aW9uLW91dFwiLCBcImRlc3RpbmF0aW9uLW92ZXJcIiwgXCJkZXZhbmFnYXJpXCIsIFwiZGlmZmVyZW5jZVwiLFxuICAgIFwiZGlzY1wiLCBcImRpc2NhcmRcIiwgXCJkaXNjbG9zdXJlLWNsb3NlZFwiLCBcImRpc2Nsb3N1cmUtb3BlblwiLCBcImRvY3VtZW50XCIsXG4gICAgXCJkb3QtZGFzaFwiLCBcImRvdC1kb3QtZGFzaFwiLFxuICAgIFwiZG90dGVkXCIsIFwiZG91YmxlXCIsIFwiZG93blwiLCBcImUtcmVzaXplXCIsIFwiZWFzZVwiLCBcImVhc2UtaW5cIiwgXCJlYXNlLWluLW91dFwiLCBcImVhc2Utb3V0XCIsXG4gICAgXCJlbGVtZW50XCIsIFwiZWxsaXBzZVwiLCBcImVsbGlwc2lzXCIsIFwiZW1iZWRcIiwgXCJlbmRcIiwgXCJldGhpb3BpY1wiLCBcImV0aGlvcGljLWFiZWdlZGVcIixcbiAgICBcImV0aGlvcGljLWFiZWdlZGUtYW0tZXRcIiwgXCJldGhpb3BpYy1hYmVnZWRlLWdlelwiLCBcImV0aGlvcGljLWFiZWdlZGUtdGktZXJcIixcbiAgICBcImV0aGlvcGljLWFiZWdlZGUtdGktZXRcIiwgXCJldGhpb3BpYy1oYWxlaGFtZS1hYS1lclwiLFxuICAgIFwiZXRoaW9waWMtaGFsZWhhbWUtYWEtZXRcIiwgXCJldGhpb3BpYy1oYWxlaGFtZS1hbS1ldFwiLFxuICAgIFwiZXRoaW9waWMtaGFsZWhhbWUtZ2V6XCIsIFwiZXRoaW9waWMtaGFsZWhhbWUtb20tZXRcIixcbiAgICBcImV0aGlvcGljLWhhbGVoYW1lLXNpZC1ldFwiLCBcImV0aGlvcGljLWhhbGVoYW1lLXNvLWV0XCIsXG4gICAgXCJldGhpb3BpYy1oYWxlaGFtZS10aS1lclwiLCBcImV0aGlvcGljLWhhbGVoYW1lLXRpLWV0XCIsIFwiZXRoaW9waWMtaGFsZWhhbWUtdGlnXCIsXG4gICAgXCJldGhpb3BpYy1udW1lcmljXCIsIFwiZXctcmVzaXplXCIsIFwiZXhjbHVzaW9uXCIsIFwiZXhwYW5kZWRcIiwgXCJleHRlbmRzXCIsIFwiZXh0cmEtY29uZGVuc2VkXCIsXG4gICAgXCJleHRyYS1leHBhbmRlZFwiLCBcImZhbnRhc3lcIiwgXCJmYXN0XCIsIFwiZmlsbFwiLCBcImZpbGwtYm94XCIsIFwiZml4ZWRcIiwgXCJmbGF0XCIsIFwiZmxleFwiLCBcImZsZXgtZW5kXCIsIFwiZmxleC1zdGFydFwiLCBcImZvb3Rub3Rlc1wiLFxuICAgIFwiZm9yd2FyZHNcIiwgXCJmcm9tXCIsIFwiZ2VvbWV0cmljUHJlY2lzaW9uXCIsIFwiZ2VvcmdpYW5cIiwgXCJncmF5dGV4dFwiLCBcImdyaWRcIiwgXCJncm9vdmVcIixcbiAgICBcImd1amFyYXRpXCIsIFwiZ3VybXVraGlcIiwgXCJoYW5kXCIsIFwiaGFuZ3VsXCIsIFwiaGFuZ3VsLWNvbnNvbmFudFwiLCBcImhhcmQtbGlnaHRcIiwgXCJoZWJyZXdcIixcbiAgICBcImhlbHBcIiwgXCJoaWRkZW5cIiwgXCJoaWRlXCIsIFwiaGlnaGVyXCIsIFwiaGlnaGxpZ2h0XCIsIFwiaGlnaGxpZ2h0dGV4dFwiLFxuICAgIFwiaGlyYWdhbmFcIiwgXCJoaXJhZ2FuYS1pcm9oYVwiLCBcImhvcml6b250YWxcIiwgXCJoc2xcIiwgXCJoc2xhXCIsIFwiaHVlXCIsIFwiaWNvblwiLCBcImlnbm9yZVwiLFxuICAgIFwiaW5hY3RpdmVib3JkZXJcIiwgXCJpbmFjdGl2ZWNhcHRpb25cIiwgXCJpbmFjdGl2ZWNhcHRpb250ZXh0XCIsIFwiaW5maW5pdGVcIixcbiAgICBcImluZm9iYWNrZ3JvdW5kXCIsIFwiaW5mb3RleHRcIiwgXCJpbmhlcml0XCIsIFwiaW5pdGlhbFwiLCBcImlubGluZVwiLCBcImlubGluZS1heGlzXCIsXG4gICAgXCJpbmxpbmUtYmxvY2tcIiwgXCJpbmxpbmUtZmxleFwiLCBcImlubGluZS1ncmlkXCIsIFwiaW5saW5lLXRhYmxlXCIsIFwiaW5zZXRcIiwgXCJpbnNpZGVcIiwgXCJpbnRyaW5zaWNcIiwgXCJpbnZlcnRcIixcbiAgICBcIml0YWxpY1wiLCBcImphcGFuZXNlLWZvcm1hbFwiLCBcImphcGFuZXNlLWluZm9ybWFsXCIsIFwianVzdGlmeVwiLCBcImthbm5hZGFcIixcbiAgICBcImthdGFrYW5hXCIsIFwia2F0YWthbmEtaXJvaGFcIiwgXCJrZWVwLWFsbFwiLCBcImtobWVyXCIsXG4gICAgXCJrb3JlYW4taGFuZ3VsLWZvcm1hbFwiLCBcImtvcmVhbi1oYW5qYS1mb3JtYWxcIiwgXCJrb3JlYW4taGFuamEtaW5mb3JtYWxcIixcbiAgICBcImxhbmRzY2FwZVwiLCBcImxhb1wiLCBcImxhcmdlXCIsIFwibGFyZ2VyXCIsIFwibGVmdFwiLCBcImxldmVsXCIsIFwibGlnaHRlclwiLCBcImxpZ2h0ZW5cIixcbiAgICBcImxpbmUtdGhyb3VnaFwiLCBcImxpbmVhclwiLCBcImxpbmVhci1ncmFkaWVudFwiLCBcImxpbmVzXCIsIFwibGlzdC1pdGVtXCIsIFwibGlzdGJveFwiLCBcImxpc3RpdGVtXCIsXG4gICAgXCJsb2NhbFwiLCBcImxvZ2ljYWxcIiwgXCJsb3VkXCIsIFwibG93ZXJcIiwgXCJsb3dlci1hbHBoYVwiLCBcImxvd2VyLWFybWVuaWFuXCIsXG4gICAgXCJsb3dlci1ncmVla1wiLCBcImxvd2VyLWhleGFkZWNpbWFsXCIsIFwibG93ZXItbGF0aW5cIiwgXCJsb3dlci1ub3J3ZWdpYW5cIixcbiAgICBcImxvd2VyLXJvbWFuXCIsIFwibG93ZXJjYXNlXCIsIFwibHRyXCIsIFwibHVtaW5vc2l0eVwiLCBcIm1hbGF5YWxhbVwiLCBcIm1hbmlwdWxhdGlvblwiLCBcIm1hdGNoXCIsIFwibWF0cml4XCIsIFwibWF0cml4M2RcIixcbiAgICBcIm1lZGlhLWNvbnRyb2xzLWJhY2tncm91bmRcIiwgXCJtZWRpYS1jdXJyZW50LXRpbWUtZGlzcGxheVwiLFxuICAgIFwibWVkaWEtZnVsbHNjcmVlbi1idXR0b25cIiwgXCJtZWRpYS1tdXRlLWJ1dHRvblwiLCBcIm1lZGlhLXBsYXktYnV0dG9uXCIsXG4gICAgXCJtZWRpYS1yZXR1cm4tdG8tcmVhbHRpbWUtYnV0dG9uXCIsIFwibWVkaWEtcmV3aW5kLWJ1dHRvblwiLFxuICAgIFwibWVkaWEtc2Vlay1iYWNrLWJ1dHRvblwiLCBcIm1lZGlhLXNlZWstZm9yd2FyZC1idXR0b25cIiwgXCJtZWRpYS1zbGlkZXJcIixcbiAgICBcIm1lZGlhLXNsaWRlcnRodW1iXCIsIFwibWVkaWEtdGltZS1yZW1haW5pbmctZGlzcGxheVwiLCBcIm1lZGlhLXZvbHVtZS1zbGlkZXJcIixcbiAgICBcIm1lZGlhLXZvbHVtZS1zbGlkZXItY29udGFpbmVyXCIsIFwibWVkaWEtdm9sdW1lLXNsaWRlcnRodW1iXCIsIFwibWVkaXVtXCIsXG4gICAgXCJtZW51XCIsIFwibWVudWxpc3RcIiwgXCJtZW51bGlzdC1idXR0b25cIiwgXCJtZW51bGlzdC10ZXh0XCIsXG4gICAgXCJtZW51bGlzdC10ZXh0ZmllbGRcIiwgXCJtZW51dGV4dFwiLCBcIm1lc3NhZ2UtYm94XCIsIFwibWlkZGxlXCIsIFwibWluLWludHJpbnNpY1wiLFxuICAgIFwibWl4XCIsIFwibW9uZ29saWFuXCIsIFwibW9ub3NwYWNlXCIsIFwibW92ZVwiLCBcIm11bHRpcGxlXCIsIFwibXVsdGlwbGVfbWFza19pbWFnZXNcIiwgXCJtdWx0aXBseVwiLCBcIm15YW5tYXJcIiwgXCJuLXJlc2l6ZVwiLFxuICAgIFwibmFycm93ZXJcIiwgXCJuZS1yZXNpemVcIiwgXCJuZXN3LXJlc2l6ZVwiLCBcIm5vLWNsb3NlLXF1b3RlXCIsIFwibm8tZHJvcFwiLFxuICAgIFwibm8tb3Blbi1xdW90ZVwiLCBcIm5vLXJlcGVhdFwiLCBcIm5vbmVcIiwgXCJub3JtYWxcIiwgXCJub3QtYWxsb3dlZFwiLCBcIm5vd3JhcFwiLFxuICAgIFwibnMtcmVzaXplXCIsIFwibnVtYmVyc1wiLCBcIm51bWVyaWNcIiwgXCJudy1yZXNpemVcIiwgXCJud3NlLXJlc2l6ZVwiLCBcIm9ibGlxdWVcIiwgXCJvY3RhbFwiLCBcIm9wYWNpdHlcIiwgXCJvcGVuLXF1b3RlXCIsXG4gICAgXCJvcHRpbWl6ZUxlZ2liaWxpdHlcIiwgXCJvcHRpbWl6ZVNwZWVkXCIsIFwib3JpeWFcIiwgXCJvcm9tb1wiLCBcIm91dHNldFwiLFxuICAgIFwib3V0c2lkZVwiLCBcIm91dHNpZGUtc2hhcGVcIiwgXCJvdmVybGF5XCIsIFwib3ZlcmxpbmVcIiwgXCJwYWRkaW5nXCIsIFwicGFkZGluZy1ib3hcIixcbiAgICBcInBhaW50ZWRcIiwgXCJwYWdlXCIsIFwicGF1c2VkXCIsIFwicGVyc2lhblwiLCBcInBlcnNwZWN0aXZlXCIsIFwicGluY2gtem9vbVwiLCBcInBsdXMtZGFya2VyXCIsIFwicGx1cy1saWdodGVyXCIsXG4gICAgXCJwb2ludGVyXCIsIFwicG9seWdvblwiLCBcInBvcnRyYWl0XCIsIFwicHJlXCIsIFwicHJlLWxpbmVcIiwgXCJwcmUtd3JhcFwiLCBcInByZXNlcnZlLTNkXCIsXG4gICAgXCJwcm9ncmVzc1wiLCBcInB1c2gtYnV0dG9uXCIsIFwicmFkaWFsLWdyYWRpZW50XCIsIFwicmFkaW9cIiwgXCJyZWFkLW9ubHlcIixcbiAgICBcInJlYWQtd3JpdGVcIiwgXCJyZWFkLXdyaXRlLXBsYWludGV4dC1vbmx5XCIsIFwicmVjdGFuZ2xlXCIsIFwicmVnaW9uXCIsXG4gICAgXCJyZWxhdGl2ZVwiLCBcInJlcGVhdFwiLCBcInJlcGVhdGluZy1saW5lYXItZ3JhZGllbnRcIixcbiAgICBcInJlcGVhdGluZy1yYWRpYWwtZ3JhZGllbnRcIiwgXCJyZXBlYXQteFwiLCBcInJlcGVhdC15XCIsIFwicmVzZXRcIiwgXCJyZXZlcnNlXCIsXG4gICAgXCJyZ2JcIiwgXCJyZ2JhXCIsIFwicmlkZ2VcIiwgXCJyaWdodFwiLCBcInJvdGF0ZVwiLCBcInJvdGF0ZTNkXCIsIFwicm90YXRlWFwiLCBcInJvdGF0ZVlcIixcbiAgICBcInJvdGF0ZVpcIiwgXCJyb3VuZFwiLCBcInJvd1wiLCBcInJvdy1yZXNpemVcIiwgXCJyb3ctcmV2ZXJzZVwiLCBcInJ0bFwiLCBcInJ1bi1pblwiLCBcInJ1bm5pbmdcIixcbiAgICBcInMtcmVzaXplXCIsIFwic2Fucy1zZXJpZlwiLCBcInNhdHVyYXRpb25cIiwgXCJzY2FsZVwiLCBcInNjYWxlM2RcIiwgXCJzY2FsZVhcIiwgXCJzY2FsZVlcIiwgXCJzY2FsZVpcIiwgXCJzY3JlZW5cIixcbiAgICBcInNjcm9sbFwiLCBcInNjcm9sbGJhclwiLCBcInNjcm9sbC1wb3NpdGlvblwiLCBcInNlLXJlc2l6ZVwiLCBcInNlYXJjaGZpZWxkXCIsXG4gICAgXCJzZWFyY2hmaWVsZC1jYW5jZWwtYnV0dG9uXCIsIFwic2VhcmNoZmllbGQtZGVjb3JhdGlvblwiLFxuICAgIFwic2VhcmNoZmllbGQtcmVzdWx0cy1idXR0b25cIiwgXCJzZWFyY2hmaWVsZC1yZXN1bHRzLWRlY29yYXRpb25cIiwgXCJzZWxmLXN0YXJ0XCIsIFwic2VsZi1lbmRcIixcbiAgICBcInNlbWktY29uZGVuc2VkXCIsIFwic2VtaS1leHBhbmRlZFwiLCBcInNlcGFyYXRlXCIsIFwic2VyaWZcIiwgXCJzaG93XCIsIFwic2lkYW1hXCIsXG4gICAgXCJzaW1wLWNoaW5lc2UtZm9ybWFsXCIsIFwic2ltcC1jaGluZXNlLWluZm9ybWFsXCIsIFwic2luZ2xlXCIsXG4gICAgXCJza2V3XCIsIFwic2tld1hcIiwgXCJza2V3WVwiLCBcInNraXAtd2hpdGUtc3BhY2VcIiwgXCJzbGlkZVwiLCBcInNsaWRlci1ob3Jpem9udGFsXCIsXG4gICAgXCJzbGlkZXItdmVydGljYWxcIiwgXCJzbGlkZXJ0aHVtYi1ob3Jpem9udGFsXCIsIFwic2xpZGVydGh1bWItdmVydGljYWxcIiwgXCJzbG93XCIsXG4gICAgXCJzbWFsbFwiLCBcInNtYWxsLWNhcHNcIiwgXCJzbWFsbC1jYXB0aW9uXCIsIFwic21hbGxlclwiLCBcInNvZnQtbGlnaHRcIiwgXCJzb2xpZFwiLCBcInNvbWFsaVwiLFxuICAgIFwic291cmNlLWF0b3BcIiwgXCJzb3VyY2UtaW5cIiwgXCJzb3VyY2Utb3V0XCIsIFwic291cmNlLW92ZXJcIiwgXCJzcGFjZVwiLCBcInNwYWNlLWFyb3VuZFwiLCBcInNwYWNlLWJldHdlZW5cIiwgXCJzcGFjZS1ldmVubHlcIiwgXCJzcGVsbC1vdXRcIiwgXCJzcXVhcmVcIixcbiAgICBcInNxdWFyZS1idXR0b25cIiwgXCJzdGFydFwiLCBcInN0YXRpY1wiLCBcInN0YXR1cy1iYXJcIiwgXCJzdHJldGNoXCIsIFwic3Ryb2tlXCIsIFwic3Ryb2tlLWJveFwiLCBcInN1YlwiLFxuICAgIFwic3VicGl4ZWwtYW50aWFsaWFzZWRcIiwgXCJzdmdfbWFza3NcIiwgXCJzdXBlclwiLCBcInN3LXJlc2l6ZVwiLCBcInN5bWJvbGljXCIsIFwic3ltYm9sc1wiLCBcInN5c3RlbS11aVwiLCBcInRhYmxlXCIsXG4gICAgXCJ0YWJsZS1jYXB0aW9uXCIsIFwidGFibGUtY2VsbFwiLCBcInRhYmxlLWNvbHVtblwiLCBcInRhYmxlLWNvbHVtbi1ncm91cFwiLFxuICAgIFwidGFibGUtZm9vdGVyLWdyb3VwXCIsIFwidGFibGUtaGVhZGVyLWdyb3VwXCIsIFwidGFibGUtcm93XCIsIFwidGFibGUtcm93LWdyb3VwXCIsXG4gICAgXCJ0YW1pbFwiLFxuICAgIFwidGVsdWd1XCIsIFwidGV4dFwiLCBcInRleHQtYm90dG9tXCIsIFwidGV4dC10b3BcIiwgXCJ0ZXh0YXJlYVwiLCBcInRleHRmaWVsZFwiLCBcInRoYWlcIixcbiAgICBcInRoaWNrXCIsIFwidGhpblwiLCBcInRocmVlZGRhcmtzaGFkb3dcIiwgXCJ0aHJlZWRmYWNlXCIsIFwidGhyZWVkaGlnaGxpZ2h0XCIsXG4gICAgXCJ0aHJlZWRsaWdodHNoYWRvd1wiLCBcInRocmVlZHNoYWRvd1wiLCBcInRpYmV0YW5cIiwgXCJ0aWdyZVwiLCBcInRpZ3JpbnlhLWVyXCIsXG4gICAgXCJ0aWdyaW55YS1lci1hYmVnZWRlXCIsIFwidGlncmlueWEtZXRcIiwgXCJ0aWdyaW55YS1ldC1hYmVnZWRlXCIsIFwidG9cIiwgXCJ0b3BcIixcbiAgICBcInRyYWQtY2hpbmVzZS1mb3JtYWxcIiwgXCJ0cmFkLWNoaW5lc2UtaW5mb3JtYWxcIiwgXCJ0cmFuc2Zvcm1cIixcbiAgICBcInRyYW5zbGF0ZVwiLCBcInRyYW5zbGF0ZTNkXCIsIFwidHJhbnNsYXRlWFwiLCBcInRyYW5zbGF0ZVlcIiwgXCJ0cmFuc2xhdGVaXCIsXG4gICAgXCJ0cmFuc3BhcmVudFwiLCBcInVsdHJhLWNvbmRlbnNlZFwiLCBcInVsdHJhLWV4cGFuZGVkXCIsIFwidW5kZXJsaW5lXCIsIFwidW5pZGlyZWN0aW9uYWwtcGFuXCIsIFwidW5zZXRcIiwgXCJ1cFwiLFxuICAgIFwidXBwZXItYWxwaGFcIiwgXCJ1cHBlci1hcm1lbmlhblwiLCBcInVwcGVyLWdyZWVrXCIsIFwidXBwZXItaGV4YWRlY2ltYWxcIixcbiAgICBcInVwcGVyLWxhdGluXCIsIFwidXBwZXItbm9yd2VnaWFuXCIsIFwidXBwZXItcm9tYW5cIiwgXCJ1cHBlcmNhc2VcIiwgXCJ1cmR1XCIsIFwidXJsXCIsXG4gICAgXCJ2YXJcIiwgXCJ2ZXJ0aWNhbFwiLCBcInZlcnRpY2FsLXRleHRcIiwgXCJ2aWV3LWJveFwiLCBcInZpc2libGVcIiwgXCJ2aXNpYmxlRmlsbFwiLCBcInZpc2libGVQYWludGVkXCIsXG4gICAgXCJ2aXNpYmxlU3Ryb2tlXCIsIFwidmlzdWFsXCIsIFwidy1yZXNpemVcIiwgXCJ3YWl0XCIsIFwid2F2ZVwiLCBcIndpZGVyXCIsXG4gICAgXCJ3aW5kb3dcIiwgXCJ3aW5kb3dmcmFtZVwiLCBcIndpbmRvd3RleHRcIiwgXCJ3b3Jkc1wiLCBcIndyYXBcIiwgXCJ3cmFwLXJldmVyc2VcIiwgXCJ4LWxhcmdlXCIsIFwieC1zbWFsbFwiLCBcInhvclwiLFxuICAgIFwieHgtbGFyZ2VcIiwgXCJ4eC1zbWFsbFwiXG4gIF0sIHZhbHVlS2V5d29yZHMgPSBrZXlTZXQodmFsdWVLZXl3b3Jkc18pO1xuXG4gIHZhciBhbGxXb3JkcyA9IGRvY3VtZW50VHlwZXNfLmNvbmNhdChtZWRpYVR5cGVzXykuY29uY2F0KG1lZGlhRmVhdHVyZXNfKS5jb25jYXQobWVkaWFWYWx1ZUtleXdvcmRzXylcbiAgICAuY29uY2F0KHByb3BlcnR5S2V5d29yZHNfKS5jb25jYXQobm9uU3RhbmRhcmRQcm9wZXJ0eUtleXdvcmRzXykuY29uY2F0KGNvbG9yS2V5d29yZHNfKVxuICAgIC5jb25jYXQodmFsdWVLZXl3b3Jkc18pO1xuICBDb2RlTWlycm9yLnJlZ2lzdGVySGVscGVyKFwiaGludFdvcmRzXCIsIFwiY3NzXCIsIGFsbFdvcmRzKTtcblxuICBmdW5jdGlvbiB0b2tlbkNDb21tZW50KHN0cmVhbSwgc3RhdGUpIHtcbiAgICB2YXIgbWF5YmVFbmQgPSBmYWxzZSwgY2g7XG4gICAgd2hpbGUgKChjaCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHtcbiAgICAgIGlmIChtYXliZUVuZCAmJiBjaCA9PSBcIi9cIikge1xuICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IG51bGw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgbWF5YmVFbmQgPSAoY2ggPT0gXCIqXCIpO1xuICAgIH1cbiAgICByZXR1cm4gW1wiY29tbWVudFwiLCBcImNvbW1lbnRcIl07XG4gIH1cblxuICBDb2RlTWlycm9yLmRlZmluZU1JTUUoXCJ0ZXh0L2Nzc1wiLCB7XG4gICAgZG9jdW1lbnRUeXBlczogZG9jdW1lbnRUeXBlcyxcbiAgICBtZWRpYVR5cGVzOiBtZWRpYVR5cGVzLFxuICAgIG1lZGlhRmVhdHVyZXM6IG1lZGlhRmVhdHVyZXMsXG4gICAgbWVkaWFWYWx1ZUtleXdvcmRzOiBtZWRpYVZhbHVlS2V5d29yZHMsXG4gICAgcHJvcGVydHlLZXl3b3JkczogcHJvcGVydHlLZXl3b3JkcyxcbiAgICBub25TdGFuZGFyZFByb3BlcnR5S2V5d29yZHM6IG5vblN0YW5kYXJkUHJvcGVydHlLZXl3b3JkcyxcbiAgICBmb250UHJvcGVydGllczogZm9udFByb3BlcnRpZXMsXG4gICAgY291bnRlckRlc2NyaXB0b3JzOiBjb3VudGVyRGVzY3JpcHRvcnMsXG4gICAgY29sb3JLZXl3b3JkczogY29sb3JLZXl3b3JkcyxcbiAgICB2YWx1ZUtleXdvcmRzOiB2YWx1ZUtleXdvcmRzLFxuICAgIHRva2VuSG9va3M6IHtcbiAgICAgIFwiL1wiOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7XG4gICAgICAgIGlmICghc3RyZWFtLmVhdChcIipcIikpIHJldHVybiBmYWxzZTtcbiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkNDb21tZW50O1xuICAgICAgICByZXR1cm4gdG9rZW5DQ29tbWVudChzdHJlYW0sIHN0YXRlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG5hbWU6IFwiY3NzXCJcbiAgfSk7XG5cbiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKFwidGV4dC94LXNjc3NcIiwge1xuICAgIG1lZGlhVHlwZXM6IG1lZGlhVHlwZXMsXG4gICAgbWVkaWFGZWF0dXJlczogbWVkaWFGZWF0dXJlcyxcbiAgICBtZWRpYVZhbHVlS2V5d29yZHM6IG1lZGlhVmFsdWVLZXl3b3JkcyxcbiAgICBwcm9wZXJ0eUtleXdvcmRzOiBwcm9wZXJ0eUtleXdvcmRzLFxuICAgIG5vblN0YW5kYXJkUHJvcGVydHlLZXl3b3Jkczogbm9uU3RhbmRhcmRQcm9wZXJ0eUtleXdvcmRzLFxuICAgIGNvbG9yS2V5d29yZHM6IGNvbG9yS2V5d29yZHMsXG4gICAgdmFsdWVLZXl3b3JkczogdmFsdWVLZXl3b3JkcyxcbiAgICBmb250UHJvcGVydGllczogZm9udFByb3BlcnRpZXMsXG4gICAgYWxsb3dOZXN0ZWQ6IHRydWUsXG4gICAgbGluZUNvbW1lbnQ6IFwiLy9cIixcbiAgICB0b2tlbkhvb2tzOiB7XG4gICAgICBcIi9cIjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkge1xuICAgICAgICBpZiAoc3RyZWFtLmVhdChcIi9cIikpIHtcbiAgICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7XG4gICAgICAgICAgcmV0dXJuIFtcImNvbW1lbnRcIiwgXCJjb21tZW50XCJdO1xuICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbS5lYXQoXCIqXCIpKSB7XG4gICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkNDb21tZW50O1xuICAgICAgICAgIHJldHVybiB0b2tlbkNDb21tZW50KHN0cmVhbSwgc3RhdGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBbXCJvcGVyYXRvclwiLCBcIm9wZXJhdG9yXCJdO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCI6XCI6IGZ1bmN0aW9uKHN0cmVhbSkge1xuICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eXFxzKlxcey8sIGZhbHNlKSlcbiAgICAgICAgICByZXR1cm4gW251bGwsIG51bGxdXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0sXG4gICAgICBcIiRcIjogZnVuY3Rpb24oc3RyZWFtKSB7XG4gICAgICAgIHN0cmVhbS5tYXRjaCgvXltcXHctXSsvKTtcbiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXlxccyo6LywgZmFsc2UpKVxuICAgICAgICAgIHJldHVybiBbXCJ2YXJpYWJsZS0yXCIsIFwidmFyaWFibGUtZGVmaW5pdGlvblwiXTtcbiAgICAgICAgcmV0dXJuIFtcInZhcmlhYmxlLTJcIiwgXCJ2YXJpYWJsZVwiXTtcbiAgICAgIH0sXG4gICAgICBcIiNcIjogZnVuY3Rpb24oc3RyZWFtKSB7XG4gICAgICAgIGlmICghc3RyZWFtLmVhdChcIntcIikpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIFtudWxsLCBcImludGVycG9sYXRpb25cIl07XG4gICAgICB9XG4gICAgfSxcbiAgICBuYW1lOiBcImNzc1wiLFxuICAgIGhlbHBlclR5cGU6IFwic2Nzc1wiXG4gIH0pO1xuXG4gIENvZGVNaXJyb3IuZGVmaW5lTUlNRShcInRleHQveC1sZXNzXCIsIHtcbiAgICBtZWRpYVR5cGVzOiBtZWRpYVR5cGVzLFxuICAgIG1lZGlhRmVhdHVyZXM6IG1lZGlhRmVhdHVyZXMsXG4gICAgbWVkaWFWYWx1ZUtleXdvcmRzOiBtZWRpYVZhbHVlS2V5d29yZHMsXG4gICAgcHJvcGVydHlLZXl3b3JkczogcHJvcGVydHlLZXl3b3JkcyxcbiAgICBub25TdGFuZGFyZFByb3BlcnR5S2V5d29yZHM6IG5vblN0YW5kYXJkUHJvcGVydHlLZXl3b3JkcyxcbiAgICBjb2xvcktleXdvcmRzOiBjb2xvcktleXdvcmRzLFxuICAgIHZhbHVlS2V5d29yZHM6IHZhbHVlS2V5d29yZHMsXG4gICAgZm9udFByb3BlcnRpZXM6IGZvbnRQcm9wZXJ0aWVzLFxuICAgIGFsbG93TmVzdGVkOiB0cnVlLFxuICAgIGxpbmVDb21tZW50OiBcIi8vXCIsXG4gICAgdG9rZW5Ib29rczoge1xuICAgICAgXCIvXCI6IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHtcbiAgICAgICAgaWYgKHN0cmVhbS5lYXQoXCIvXCIpKSB7XG4gICAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpO1xuICAgICAgICAgIHJldHVybiBbXCJjb21tZW50XCIsIFwiY29tbWVudFwiXTtcbiAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0uZWF0KFwiKlwiKSkge1xuICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5DQ29tbWVudDtcbiAgICAgICAgICByZXR1cm4gdG9rZW5DQ29tbWVudChzdHJlYW0sIHN0YXRlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gW1wib3BlcmF0b3JcIiwgXCJvcGVyYXRvclwiXTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFwiQFwiOiBmdW5jdGlvbihzdHJlYW0pIHtcbiAgICAgICAgaWYgKHN0cmVhbS5lYXQoXCJ7XCIpKSByZXR1cm4gW251bGwsIFwiaW50ZXJwb2xhdGlvblwiXTtcbiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXihjaGFyc2V0fGRvY3VtZW50fGZvbnQtZmFjZXxpbXBvcnR8KC0obW96fG1zfG98d2Via2l0KS0pP2tleWZyYW1lc3xtZWRpYXxuYW1lc3BhY2V8cGFnZXxzdXBwb3J0cylcXGIvaSwgZmFsc2UpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1xcd1xcXFxcXC1dLyk7XG4gICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15cXHMqOi8sIGZhbHNlKSlcbiAgICAgICAgICByZXR1cm4gW1widmFyaWFibGUtMlwiLCBcInZhcmlhYmxlLWRlZmluaXRpb25cIl07XG4gICAgICAgIHJldHVybiBbXCJ2YXJpYWJsZS0yXCIsIFwidmFyaWFibGVcIl07XG4gICAgICB9LFxuICAgICAgXCImXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gW1wiYXRvbVwiLCBcImF0b21cIl07XG4gICAgICB9XG4gICAgfSxcbiAgICBuYW1lOiBcImNzc1wiLFxuICAgIGhlbHBlclR5cGU6IFwibGVzc1wiXG4gIH0pO1xuXG4gIENvZGVNaXJyb3IuZGVmaW5lTUlNRShcInRleHQveC1nc3NcIiwge1xuICAgIGRvY3VtZW50VHlwZXM6IGRvY3VtZW50VHlwZXMsXG4gICAgbWVkaWFUeXBlczogbWVkaWFUeXBlcyxcbiAgICBtZWRpYUZlYXR1cmVzOiBtZWRpYUZlYXR1cmVzLFxuICAgIHByb3BlcnR5S2V5d29yZHM6IHByb3BlcnR5S2V5d29yZHMsXG4gICAgbm9uU3RhbmRhcmRQcm9wZXJ0eUtleXdvcmRzOiBub25TdGFuZGFyZFByb3BlcnR5S2V5d29yZHMsXG4gICAgZm9udFByb3BlcnRpZXM6IGZvbnRQcm9wZXJ0aWVzLFxuICAgIGNvdW50ZXJEZXNjcmlwdG9yczogY291bnRlckRlc2NyaXB0b3JzLFxuICAgIGNvbG9yS2V5d29yZHM6IGNvbG9yS2V5d29yZHMsXG4gICAgdmFsdWVLZXl3b3JkczogdmFsdWVLZXl3b3JkcyxcbiAgICBzdXBwb3J0c0F0Q29tcG9uZW50OiB0cnVlLFxuICAgIHRva2VuSG9va3M6IHtcbiAgICAgIFwiL1wiOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7XG4gICAgICAgIGlmICghc3RyZWFtLmVhdChcIipcIikpIHJldHVybiBmYWxzZTtcbiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkNDb21tZW50O1xuICAgICAgICByZXR1cm4gdG9rZW5DQ29tbWVudChzdHJlYW0sIHN0YXRlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG5hbWU6IFwiY3NzXCIsXG4gICAgaGVscGVyVHlwZTogXCJnc3NcIlxuICB9KTtcblxufSk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/codemirror/mode/css/css.js\n"); /***/ }), /***/ "./node_modules/codemirror/mode/gfm/gfm.js": -/*!*************************************************!* +/*!*************************************************!*\ !*** ./node_modules/codemirror/mode/gfm/gfm.js ***! \*************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -203,7 +181,7 @@ eval("// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distribute /***/ }), /***/ "./node_modules/codemirror/mode/htmlmixed/htmlmixed.js": -/*!*************************************************************!* +/*!*************************************************************!*\ !*** ./node_modules/codemirror/mode/htmlmixed/htmlmixed.js ***! \*************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -213,57 +191,57 @@ eval("// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distribute /***/ }), /***/ "./node_modules/codemirror/mode/javascript/javascript.js": -/*!***************************************************************!* +/*!***************************************************************!*\ !*** ./node_modules/codemirror/mode/javascript/javascript.js ***! \***************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { -eval("// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n if (true) // CommonJS\n mod(__webpack_require__(/*! ../../lib/codemirror */ \"./node_modules/codemirror/lib/codemirror.js\"));\n else {}\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"javascript\", function(config, parserConfig) {\n var indentUnit = config.indentUnit;\n var statementIndent = parserConfig.statementIndent;\n var jsonldMode = parserConfig.jsonld;\n var jsonMode = parserConfig.json || jsonldMode;\n var isTS = parserConfig.typescript;\n var wordRE = parserConfig.wordCharacters || /[\\w$\\xa1-\\uffff]/;\n\n // Tokenizer\n\n var keywords = function(){\n function kw(type) {return {type: type, style: \"keyword\"};}\n var A = kw(\"keyword a\"), B = kw(\"keyword b\"), C = kw(\"keyword c\"), D = kw(\"keyword d\");\n var operator = kw(\"operator\"), atom = {type: \"atom\", style: \"atom\"};\n\n return {\n \"if\": kw(\"if\"), \"while\": A, \"with\": A, \"else\": B, \"do\": B, \"try\": B, \"finally\": B,\n \"return\": D, \"break\": D, \"continue\": D, \"new\": kw(\"new\"), \"delete\": C, \"void\": C, \"throw\": C,\n \"debugger\": kw(\"debugger\"), \"var\": kw(\"var\"), \"const\": kw(\"var\"), \"let\": kw(\"var\"),\n \"function\": kw(\"function\"), \"catch\": kw(\"catch\"),\n \"for\": kw(\"for\"), \"switch\": kw(\"switch\"), \"case\": kw(\"case\"), \"default\": kw(\"default\"),\n \"in\": operator, \"typeof\": operator, \"instanceof\": operator,\n \"true\": atom, \"false\": atom, \"null\": atom, \"undefined\": atom, \"NaN\": atom, \"Infinity\": atom,\n \"this\": kw(\"this\"), \"class\": kw(\"class\"), \"super\": kw(\"atom\"),\n \"yield\": C, \"export\": kw(\"export\"), \"import\": kw(\"import\"), \"extends\": C,\n \"await\": C\n };\n }();\n\n var isOperatorChar = /[+\\-*&%=<>!?|~^@]/;\n var isJsonldKeyword = /^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)\"/;\n\n function readRegexp(stream) {\n var escaped = false, next, inSet = false;\n while ((next = stream.next()) != null) {\n if (!escaped) {\n if (next == \"/\" && !inSet) return;\n if (next == \"[\") inSet = true;\n else if (inSet && next == \"]\") inSet = false;\n }\n escaped = !escaped && next == \"\\\\\";\n }\n }\n\n // Used as scratch variables to communicate multiple values without\n // consing up tons of objects.\n var type, content;\n function ret(tp, style, cont) {\n type = tp; content = cont;\n return style;\n }\n function tokenBase(stream, state) {\n var ch = stream.next();\n if (ch == '\"' || ch == \"'\") {\n state.tokenize = tokenString(ch);\n return state.tokenize(stream, state);\n } else if (ch == \".\" && stream.match(/^\\d[\\d_]*(?:[eE][+\\-]?[\\d_]+)?/)) {\n return ret(\"number\", \"number\");\n } else if (ch == \".\" && stream.match(\"..\")) {\n return ret(\"spread\", \"meta\");\n } else if (/[\\[\\]{}\\(\\),;\\:\\.]/.test(ch)) {\n return ret(ch);\n } else if (ch == \"=\" && stream.eat(\">\")) {\n return ret(\"=>\", \"operator\");\n } else if (ch == \"0\" && stream.match(/^(?:x[\\dA-Fa-f_]+|o[0-7_]+|b[01_]+)n?/)) {\n return ret(\"number\", \"number\");\n } else if (/\\d/.test(ch)) {\n stream.match(/^[\\d_]*(?:n|(?:\\.[\\d_]*)?(?:[eE][+\\-]?[\\d_]+)?)?/);\n return ret(\"number\", \"number\");\n } else if (ch == \"/\") {\n if (stream.eat(\"*\")) {\n state.tokenize = tokenComment;\n return tokenComment(stream, state);\n } else if (stream.eat(\"/\")) {\n stream.skipToEnd();\n return ret(\"comment\", \"comment\");\n } else if (expressionAllowed(stream, state, 1)) {\n readRegexp(stream);\n stream.match(/^\\b(([gimyus])(?![gimyus]*\\2))+\\b/);\n return ret(\"regexp\", \"string-2\");\n } else {\n stream.eat(\"=\");\n return ret(\"operator\", \"operator\", stream.current());\n }\n } else if (ch == \"`\") {\n state.tokenize = tokenQuasi;\n return tokenQuasi(stream, state);\n } else if (ch == \"#\" && stream.peek() == \"!\") {\n stream.skipToEnd();\n return ret(\"meta\", \"meta\");\n } else if (ch == \"#\" && stream.eatWhile(wordRE)) {\n return ret(\"variable\", \"property\")\n } else if (ch == \"<\" && stream.match(\"!--\") ||\n (ch == \"-\" && stream.match(\"->\") && !/\\S/.test(stream.string.slice(0, stream.start)))) {\n stream.skipToEnd()\n return ret(\"comment\", \"comment\")\n } else if (isOperatorChar.test(ch)) {\n if (ch != \">\" || !state.lexical || state.lexical.type != \">\") {\n if (stream.eat(\"=\")) {\n if (ch == \"!\" || ch == \"=\") stream.eat(\"=\")\n } else if (/[<>*+\\-|&?]/.test(ch)) {\n stream.eat(ch)\n if (ch == \">\") stream.eat(ch)\n }\n }\n if (ch == \"?\" && stream.eat(\".\")) return ret(\".\")\n return ret(\"operator\", \"operator\", stream.current());\n } else if (wordRE.test(ch)) {\n stream.eatWhile(wordRE);\n var word = stream.current()\n if (state.lastType != \".\") {\n if (keywords.propertyIsEnumerable(word)) {\n var kw = keywords[word]\n return ret(kw.type, kw.style, word)\n }\n if (word == \"async\" && stream.match(/^(\\s|\\/\\*([^*]|\\*(?!\\/))*?\\*\\/)*[\\[\\(\\w]/, false))\n return ret(\"async\", \"keyword\", word)\n }\n return ret(\"variable\", \"variable\", word)\n }\n }\n\n function tokenString(quote) {\n return function(stream, state) {\n var escaped = false, next;\n if (jsonldMode && stream.peek() == \"@\" && stream.match(isJsonldKeyword)){\n state.tokenize = tokenBase;\n return ret(\"jsonld-keyword\", \"meta\");\n }\n while ((next = stream.next()) != null) {\n if (next == quote && !escaped) break;\n escaped = !escaped && next == \"\\\\\";\n }\n if (!escaped) state.tokenize = tokenBase;\n return ret(\"string\", \"string\");\n };\n }\n\n function tokenComment(stream, state) {\n var maybeEnd = false, ch;\n while (ch = stream.next()) {\n if (ch == \"/\" && maybeEnd) {\n state.tokenize = tokenBase;\n break;\n }\n maybeEnd = (ch == \"*\");\n }\n return ret(\"comment\", \"comment\");\n }\n\n function tokenQuasi(stream, state) {\n var escaped = false, next;\n while ((next = stream.next()) != null) {\n if (!escaped && (next == \"`\" || next == \"$\" && stream.eat(\"{\"))) {\n state.tokenize = tokenBase;\n break;\n }\n escaped = !escaped && next == \"\\\\\";\n }\n return ret(\"quasi\", \"string-2\", stream.current());\n }\n\n var brackets = \"([{}])\";\n // This is a crude lookahead trick to try and notice that we're\n // parsing the argument patterns for a fat-arrow function before we\n // actually hit the arrow token. It only works if the arrow is on\n // the same line as the arguments and there's no strange noise\n // (comments) in between. Fallback is to only notice when we hit the\n // arrow, and not declare the arguments as locals for the arrow\n // body.\n function findFatArrow(stream, state) {\n if (state.fatArrowAt) state.fatArrowAt = null;\n var arrow = stream.string.indexOf(\"=>\", stream.start);\n if (arrow < 0) return;\n\n if (isTS) { // Try to skip TypeScript return type declarations after the arguments\n var m = /:\\s*(?:\\w+(?:<[^>]*>|\\[\\])?|\\{[^}]*\\})\\s*$/.exec(stream.string.slice(stream.start, arrow))\n if (m) arrow = m.index\n }\n\n var depth = 0, sawSomething = false;\n for (var pos = arrow - 1; pos >= 0; --pos) {\n var ch = stream.string.charAt(pos);\n var bracket = brackets.indexOf(ch);\n if (bracket >= 0 && bracket < 3) {\n if (!depth) { ++pos; break; }\n if (--depth == 0) { if (ch == \"(\") sawSomething = true; break; }\n } else if (bracket >= 3 && bracket < 6) {\n ++depth;\n } else if (wordRE.test(ch)) {\n sawSomething = true;\n } else if (/[\"'\\/`]/.test(ch)) {\n for (;; --pos) {\n if (pos == 0) return\n var next = stream.string.charAt(pos - 1)\n if (next == ch && stream.string.charAt(pos - 2) != \"\\\\\") { pos--; break }\n }\n } else if (sawSomething && !depth) {\n ++pos;\n break;\n }\n }\n if (sawSomething && !depth) state.fatArrowAt = pos;\n }\n\n // Parser\n\n var atomicTypes = {\"atom\": true, \"number\": true, \"variable\": true, \"string\": true, \"regexp\": true, \"this\": true, \"jsonld-keyword\": true};\n\n function JSLexical(indented, column, type, align, prev, info) {\n this.indented = indented;\n this.column = column;\n this.type = type;\n this.prev = prev;\n this.info = info;\n if (align != null) this.align = align;\n }\n\n function inScope(state, varname) {\n for (var v = state.localVars; v; v = v.next)\n if (v.name == varname) return true;\n for (var cx = state.context; cx; cx = cx.prev) {\n for (var v = cx.vars; v; v = v.next)\n if (v.name == varname) return true;\n }\n }\n\n function parseJS(state, style, type, content, stream) {\n var cc = state.cc;\n // Communicate our context to the combinators.\n // (Less wasteful than consing up a hundred closures on every call.)\n cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc; cx.style = style;\n\n if (!state.lexical.hasOwnProperty(\"align\"))\n state.lexical.align = true;\n\n while(true) {\n var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement;\n if (combinator(type, content)) {\n while(cc.length && cc[cc.length - 1].lex)\n cc.pop()();\n if (cx.marked) return cx.marked;\n if (type == \"variable\" && inScope(state, content)) return \"variable-2\";\n return style;\n }\n }\n }\n\n // Combinator utils\n\n var cx = {state: null, column: null, marked: null, cc: null};\n function pass() {\n for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]);\n }\n function cont() {\n pass.apply(null, arguments);\n return true;\n }\n function inList(name, list) {\n for (var v = list; v; v = v.next) if (v.name == name) return true\n return false;\n }\n function register(varname) {\n var state = cx.state;\n cx.marked = \"def\";\n if (state.context) {\n if (state.lexical.info == \"var\" && state.context && state.context.block) {\n // FIXME function decls are also not block scoped\n var newContext = registerVarScoped(varname, state.context)\n if (newContext != null) {\n state.context = newContext\n return\n }\n } else if (!inList(varname, state.localVars)) {\n state.localVars = new Var(varname, state.localVars)\n return\n }\n }\n // Fall through means this is global\n if (parserConfig.globalVars && !inList(varname, state.globalVars))\n state.globalVars = new Var(varname, state.globalVars)\n }\n function registerVarScoped(varname, context) {\n if (!context) {\n return null\n } else if (context.block) {\n var inner = registerVarScoped(varname, context.prev)\n if (!inner) return null\n if (inner == context.prev) return context\n return new Context(inner, context.vars, true)\n } else if (inList(varname, context.vars)) {\n return context\n } else {\n return new Context(context.prev, new Var(varname, context.vars), false)\n }\n }\n\n function isModifier(name) {\n return name == \"public\" || name == \"private\" || name == \"protected\" || name == \"abstract\" || name == \"readonly\"\n }\n\n // Combinators\n\n function Context(prev, vars, block) { this.prev = prev; this.vars = vars; this.block = block }\n function Var(name, next) { this.name = name; this.next = next }\n\n var defaultVars = new Var(\"this\", new Var(\"arguments\", null))\n function pushcontext() {\n cx.state.context = new Context(cx.state.context, cx.state.localVars, false)\n cx.state.localVars = defaultVars\n }\n function pushblockcontext() {\n cx.state.context = new Context(cx.state.context, cx.state.localVars, true)\n cx.state.localVars = null\n }\n function popcontext() {\n cx.state.localVars = cx.state.context.vars\n cx.state.context = cx.state.context.prev\n }\n popcontext.lex = true\n function pushlex(type, info) {\n var result = function() {\n var state = cx.state, indent = state.indented;\n if (state.lexical.type == \"stat\") indent = state.lexical.indented;\n else for (var outer = state.lexical; outer && outer.type == \")\" && outer.align; outer = outer.prev)\n indent = outer.indented;\n state.lexical = new JSLexical(indent, cx.stream.column(), type, null, state.lexical, info);\n };\n result.lex = true;\n return result;\n }\n function poplex() {\n var state = cx.state;\n if (state.lexical.prev) {\n if (state.lexical.type == \")\")\n state.indented = state.lexical.indented;\n state.lexical = state.lexical.prev;\n }\n }\n poplex.lex = true;\n\n function expect(wanted) {\n function exp(type) {\n if (type == wanted) return cont();\n else if (wanted == \";\" || type == \"}\" || type == \")\" || type == \"]\") return pass();\n else return cont(exp);\n };\n return exp;\n }\n\n function statement(type, value) {\n if (type == \"var\") return cont(pushlex(\"vardef\", value), vardef, expect(\";\"), poplex);\n if (type == \"keyword a\") return cont(pushlex(\"form\"), parenExpr, statement, poplex);\n if (type == \"keyword b\") return cont(pushlex(\"form\"), statement, poplex);\n if (type == \"keyword d\") return cx.stream.match(/^\\s*$/, false) ? cont() : cont(pushlex(\"stat\"), maybeexpression, expect(\";\"), poplex);\n if (type == \"debugger\") return cont(expect(\";\"));\n if (type == \"{\") return cont(pushlex(\"}\"), pushblockcontext, block, poplex, popcontext);\n if (type == \";\") return cont();\n if (type == \"if\") {\n if (cx.state.lexical.info == \"else\" && cx.state.cc[cx.state.cc.length - 1] == poplex)\n cx.state.cc.pop()();\n return cont(pushlex(\"form\"), parenExpr, statement, poplex, maybeelse);\n }\n if (type == \"function\") return cont(functiondef);\n if (type == \"for\") return cont(pushlex(\"form\"), forspec, statement, poplex);\n if (type == \"class\" || (isTS && value == \"interface\")) {\n cx.marked = \"keyword\"\n return cont(pushlex(\"form\", type == \"class\" ? type : value), className, poplex)\n }\n if (type == \"variable\") {\n if (isTS && value == \"declare\") {\n cx.marked = \"keyword\"\n return cont(statement)\n } else if (isTS && (value == \"module\" || value == \"enum\" || value == \"type\") && cx.stream.match(/^\\s*\\w/, false)) {\n cx.marked = \"keyword\"\n if (value == \"enum\") return cont(enumdef);\n else if (value == \"type\") return cont(typename, expect(\"operator\"), typeexpr, expect(\";\"));\n else return cont(pushlex(\"form\"), pattern, expect(\"{\"), pushlex(\"}\"), block, poplex, poplex)\n } else if (isTS && value == \"namespace\") {\n cx.marked = \"keyword\"\n return cont(pushlex(\"form\"), expression, statement, poplex)\n } else if (isTS && value == \"abstract\") {\n cx.marked = \"keyword\"\n return cont(statement)\n } else {\n return cont(pushlex(\"stat\"), maybelabel);\n }\n }\n if (type == \"switch\") return cont(pushlex(\"form\"), parenExpr, expect(\"{\"), pushlex(\"}\", \"switch\"), pushblockcontext,\n block, poplex, poplex, popcontext);\n if (type == \"case\") return cont(expression, expect(\":\"));\n if (type == \"default\") return cont(expect(\":\"));\n if (type == \"catch\") return cont(pushlex(\"form\"), pushcontext, maybeCatchBinding, statement, poplex, popcontext);\n if (type == \"export\") return cont(pushlex(\"stat\"), afterExport, poplex);\n if (type == \"import\") return cont(pushlex(\"stat\"), afterImport, poplex);\n if (type == \"async\") return cont(statement)\n if (value == \"@\") return cont(expression, statement)\n return pass(pushlex(\"stat\"), expression, expect(\";\"), poplex);\n }\n function maybeCatchBinding(type) {\n if (type == \"(\") return cont(funarg, expect(\")\"))\n }\n function expression(type, value) {\n return expressionInner(type, value, false);\n }\n function expressionNoComma(type, value) {\n return expressionInner(type, value, true);\n }\n function parenExpr(type) {\n if (type != \"(\") return pass()\n return cont(pushlex(\")\"), maybeexpression, expect(\")\"), poplex)\n }\n function expressionInner(type, value, noComma) {\n if (cx.state.fatArrowAt == cx.stream.start) {\n var body = noComma ? arrowBodyNoComma : arrowBody;\n if (type == \"(\") return cont(pushcontext, pushlex(\")\"), commasep(funarg, \")\"), poplex, expect(\"=>\"), body, popcontext);\n else if (type == \"variable\") return pass(pushcontext, pattern, expect(\"=>\"), body, popcontext);\n }\n\n var maybeop = noComma ? maybeoperatorNoComma : maybeoperatorComma;\n if (atomicTypes.hasOwnProperty(type)) return cont(maybeop);\n if (type == \"function\") return cont(functiondef, maybeop);\n if (type == \"class\" || (isTS && value == \"interface\")) { cx.marked = \"keyword\"; return cont(pushlex(\"form\"), classExpression, poplex); }\n if (type == \"keyword c\" || type == \"async\") return cont(noComma ? expressionNoComma : expression);\n if (type == \"(\") return cont(pushlex(\")\"), maybeexpression, expect(\")\"), poplex, maybeop);\n if (type == \"operator\" || type == \"spread\") return cont(noComma ? expressionNoComma : expression);\n if (type == \"[\") return cont(pushlex(\"]\"), arrayLiteral, poplex, maybeop);\n if (type == \"{\") return contCommasep(objprop, \"}\", null, maybeop);\n if (type == \"quasi\") return pass(quasi, maybeop);\n if (type == \"new\") return cont(maybeTarget(noComma));\n if (type == \"import\") return cont(expression);\n return cont();\n }\n function maybeexpression(type) {\n if (type.match(/[;\\}\\)\\],]/)) return pass();\n return pass(expression);\n }\n\n function maybeoperatorComma(type, value) {\n if (type == \",\") return cont(maybeexpression);\n return maybeoperatorNoComma(type, value, false);\n }\n function maybeoperatorNoComma(type, value, noComma) {\n var me = noComma == false ? maybeoperatorComma : maybeoperatorNoComma;\n var expr = noComma == false ? expression : expressionNoComma;\n if (type == \"=>\") return cont(pushcontext, noComma ? arrowBodyNoComma : arrowBody, popcontext);\n if (type == \"operator\") {\n if (/\\+\\+|--/.test(value) || isTS && value == \"!\") return cont(me);\n if (isTS && value == \"<\" && cx.stream.match(/^([^<>]|<[^<>]*>)*>\\s*\\(/, false))\n return cont(pushlex(\">\"), commasep(typeexpr, \">\"), poplex, me);\n if (value == \"?\") return cont(expression, expect(\":\"), expr);\n return cont(expr);\n }\n if (type == \"quasi\") { return pass(quasi, me); }\n if (type == \";\") return;\n if (type == \"(\") return contCommasep(expressionNoComma, \")\", \"call\", me);\n if (type == \".\") return cont(property, me);\n if (type == \"[\") return cont(pushlex(\"]\"), maybeexpression, expect(\"]\"), poplex, me);\n if (isTS && value == \"as\") { cx.marked = \"keyword\"; return cont(typeexpr, me) }\n if (type == \"regexp\") {\n cx.state.lastType = cx.marked = \"operator\"\n cx.stream.backUp(cx.stream.pos - cx.stream.start - 1)\n return cont(expr)\n }\n }\n function quasi(type, value) {\n if (type != \"quasi\") return pass();\n if (value.slice(value.length - 2) != \"${\") return cont(quasi);\n return cont(expression, continueQuasi);\n }\n function continueQuasi(type) {\n if (type == \"}\") {\n cx.marked = \"string-2\";\n cx.state.tokenize = tokenQuasi;\n return cont(quasi);\n }\n }\n function arrowBody(type) {\n findFatArrow(cx.stream, cx.state);\n return pass(type == \"{\" ? statement : expression);\n }\n function arrowBodyNoComma(type) {\n findFatArrow(cx.stream, cx.state);\n return pass(type == \"{\" ? statement : expressionNoComma);\n }\n function maybeTarget(noComma) {\n return function(type) {\n if (type == \".\") return cont(noComma ? targetNoComma : target);\n else if (type == \"variable\" && isTS) return cont(maybeTypeArgs, noComma ? maybeoperatorNoComma : maybeoperatorComma)\n else return pass(noComma ? expressionNoComma : expression);\n };\n }\n function target(_, value) {\n if (value == \"target\") { cx.marked = \"keyword\"; return cont(maybeoperatorComma); }\n }\n function targetNoComma(_, value) {\n if (value == \"target\") { cx.marked = \"keyword\"; return cont(maybeoperatorNoComma); }\n }\n function maybelabel(type) {\n if (type == \":\") return cont(poplex, statement);\n return pass(maybeoperatorComma, expect(\";\"), poplex);\n }\n function property(type) {\n if (type == \"variable\") {cx.marked = \"property\"; return cont();}\n }\n function objprop(type, value) {\n if (type == \"async\") {\n cx.marked = \"property\";\n return cont(objprop);\n } else if (type == \"variable\" || cx.style == \"keyword\") {\n cx.marked = \"property\";\n if (value == \"get\" || value == \"set\") return cont(getterSetter);\n var m // Work around fat-arrow-detection complication for detecting typescript typed arrow params\n if (isTS && cx.state.fatArrowAt == cx.stream.start && (m = cx.stream.match(/^\\s*:\\s*/, false)))\n cx.state.fatArrowAt = cx.stream.pos + m[0].length\n return cont(afterprop);\n } else if (type == \"number\" || type == \"string\") {\n cx.marked = jsonldMode ? \"property\" : (cx.style + \" property\");\n return cont(afterprop);\n } else if (type == \"jsonld-keyword\") {\n return cont(afterprop);\n } else if (isTS && isModifier(value)) {\n cx.marked = \"keyword\"\n return cont(objprop)\n } else if (type == \"[\") {\n return cont(expression, maybetype, expect(\"]\"), afterprop);\n } else if (type == \"spread\") {\n return cont(expressionNoComma, afterprop);\n } else if (value == \"*\") {\n cx.marked = \"keyword\";\n return cont(objprop);\n } else if (type == \":\") {\n return pass(afterprop)\n }\n }\n function getterSetter(type) {\n if (type != \"variable\") return pass(afterprop);\n cx.marked = \"property\";\n return cont(functiondef);\n }\n function afterprop(type) {\n if (type == \":\") return cont(expressionNoComma);\n if (type == \"(\") return pass(functiondef);\n }\n function commasep(what, end, sep) {\n function proceed(type, value) {\n if (sep ? sep.indexOf(type) > -1 : type == \",\") {\n var lex = cx.state.lexical;\n if (lex.info == \"call\") lex.pos = (lex.pos || 0) + 1;\n return cont(function(type, value) {\n if (type == end || value == end) return pass()\n return pass(what)\n }, proceed);\n }\n if (type == end || value == end) return cont();\n if (sep && sep.indexOf(\";\") > -1) return pass(what)\n return cont(expect(end));\n }\n return function(type, value) {\n if (type == end || value == end) return cont();\n return pass(what, proceed);\n };\n }\n function contCommasep(what, end, info) {\n for (var i = 3; i < arguments.length; i++)\n cx.cc.push(arguments[i]);\n return cont(pushlex(end, info), commasep(what, end), poplex);\n }\n function block(type) {\n if (type == \"}\") return cont();\n return pass(statement, block);\n }\n function maybetype(type, value) {\n if (isTS) {\n if (type == \":\") return cont(typeexpr);\n if (value == \"?\") return cont(maybetype);\n }\n }\n function maybetypeOrIn(type, value) {\n if (isTS && (type == \":\" || value == \"in\")) return cont(typeexpr)\n }\n function mayberettype(type) {\n if (isTS && type == \":\") {\n if (cx.stream.match(/^\\s*\\w+\\s+is\\b/, false)) return cont(expression, isKW, typeexpr)\n else return cont(typeexpr)\n }\n }\n function isKW(_, value) {\n if (value == \"is\") {\n cx.marked = \"keyword\"\n return cont()\n }\n }\n function typeexpr(type, value) {\n if (value == \"keyof\" || value == \"typeof\" || value == \"infer\") {\n cx.marked = \"keyword\"\n return cont(value == \"typeof\" ? expressionNoComma : typeexpr)\n }\n if (type == \"variable\" || value == \"void\") {\n cx.marked = \"type\"\n return cont(afterType)\n }\n if (value == \"|\" || value == \"&\") return cont(typeexpr)\n if (type == \"string\" || type == \"number\" || type == \"atom\") return cont(afterType);\n if (type == \"[\") return cont(pushlex(\"]\"), commasep(typeexpr, \"]\", \",\"), poplex, afterType)\n if (type == \"{\") return cont(pushlex(\"}\"), commasep(typeprop, \"}\", \",;\"), poplex, afterType)\n if (type == \"(\") return cont(commasep(typearg, \")\"), maybeReturnType, afterType)\n if (type == \"<\") return cont(commasep(typeexpr, \">\"), typeexpr)\n }\n function maybeReturnType(type) {\n if (type == \"=>\") return cont(typeexpr)\n }\n function typeprop(type, value) {\n if (type == \"variable\" || cx.style == \"keyword\") {\n cx.marked = \"property\"\n return cont(typeprop)\n } else if (value == \"?\" || type == \"number\" || type == \"string\") {\n return cont(typeprop)\n } else if (type == \":\") {\n return cont(typeexpr)\n } else if (type == \"[\") {\n return cont(expect(\"variable\"), maybetypeOrIn, expect(\"]\"), typeprop)\n } else if (type == \"(\") {\n return pass(functiondecl, typeprop)\n }\n }\n function typearg(type, value) {\n if (type == \"variable\" && cx.stream.match(/^\\s*[?:]/, false) || value == \"?\") return cont(typearg)\n if (type == \":\") return cont(typeexpr)\n if (type == \"spread\") return cont(typearg)\n return pass(typeexpr)\n }\n function afterType(type, value) {\n if (value == \"<\") return cont(pushlex(\">\"), commasep(typeexpr, \">\"), poplex, afterType)\n if (value == \"|\" || type == \".\" || value == \"&\") return cont(typeexpr)\n if (type == \"[\") return cont(typeexpr, expect(\"]\"), afterType)\n if (value == \"extends\" || value == \"implements\") { cx.marked = \"keyword\"; return cont(typeexpr) }\n if (value == \"?\") return cont(typeexpr, expect(\":\"), typeexpr)\n }\n function maybeTypeArgs(_, value) {\n if (value == \"<\") return cont(pushlex(\">\"), commasep(typeexpr, \">\"), poplex, afterType)\n }\n function typeparam() {\n return pass(typeexpr, maybeTypeDefault)\n }\n function maybeTypeDefault(_, value) {\n if (value == \"=\") return cont(typeexpr)\n }\n function vardef(_, value) {\n if (value == \"enum\") {cx.marked = \"keyword\"; return cont(enumdef)}\n return pass(pattern, maybetype, maybeAssign, vardefCont);\n }\n function pattern(type, value) {\n if (isTS && isModifier(value)) { cx.marked = \"keyword\"; return cont(pattern) }\n if (type == \"variable\") { register(value); return cont(); }\n if (type == \"spread\") return cont(pattern);\n if (type == \"[\") return contCommasep(eltpattern, \"]\");\n if (type == \"{\") return contCommasep(proppattern, \"}\");\n }\n function proppattern(type, value) {\n if (type == \"variable\" && !cx.stream.match(/^\\s*:/, false)) {\n register(value);\n return cont(maybeAssign);\n }\n if (type == \"variable\") cx.marked = \"property\";\n if (type == \"spread\") return cont(pattern);\n if (type == \"}\") return pass();\n if (type == \"[\") return cont(expression, expect(']'), expect(':'), proppattern);\n return cont(expect(\":\"), pattern, maybeAssign);\n }\n function eltpattern() {\n return pass(pattern, maybeAssign)\n }\n function maybeAssign(_type, value) {\n if (value == \"=\") return cont(expressionNoComma);\n }\n function vardefCont(type) {\n if (type == \",\") return cont(vardef);\n }\n function maybeelse(type, value) {\n if (type == \"keyword b\" && value == \"else\") return cont(pushlex(\"form\", \"else\"), statement, poplex);\n }\n function forspec(type, value) {\n if (value == \"await\") return cont(forspec);\n if (type == \"(\") return cont(pushlex(\")\"), forspec1, poplex);\n }\n function forspec1(type) {\n if (type == \"var\") return cont(vardef, forspec2);\n if (type == \"variable\") return cont(forspec2);\n return pass(forspec2)\n }\n function forspec2(type, value) {\n if (type == \")\") return cont()\n if (type == \";\") return cont(forspec2)\n if (value == \"in\" || value == \"of\") { cx.marked = \"keyword\"; return cont(expression, forspec2) }\n return pass(expression, forspec2)\n }\n function functiondef(type, value) {\n if (value == \"*\") {cx.marked = \"keyword\"; return cont(functiondef);}\n if (type == \"variable\") {register(value); return cont(functiondef);}\n if (type == \"(\") return cont(pushcontext, pushlex(\")\"), commasep(funarg, \")\"), poplex, mayberettype, statement, popcontext);\n if (isTS && value == \"<\") return cont(pushlex(\">\"), commasep(typeparam, \">\"), poplex, functiondef)\n }\n function functiondecl(type, value) {\n if (value == \"*\") {cx.marked = \"keyword\"; return cont(functiondecl);}\n if (type == \"variable\") {register(value); return cont(functiondecl);}\n if (type == \"(\") return cont(pushcontext, pushlex(\")\"), commasep(funarg, \")\"), poplex, mayberettype, popcontext);\n if (isTS && value == \"<\") return cont(pushlex(\">\"), commasep(typeparam, \">\"), poplex, functiondecl)\n }\n function typename(type, value) {\n if (type == \"keyword\" || type == \"variable\") {\n cx.marked = \"type\"\n return cont(typename)\n } else if (value == \"<\") {\n return cont(pushlex(\">\"), commasep(typeparam, \">\"), poplex)\n }\n }\n function funarg(type, value) {\n if (value == \"@\") cont(expression, funarg)\n if (type == \"spread\") return cont(funarg);\n if (isTS && isModifier(value)) { cx.marked = \"keyword\"; return cont(funarg); }\n if (isTS && type == \"this\") return cont(maybetype, maybeAssign)\n return pass(pattern, maybetype, maybeAssign);\n }\n function classExpression(type, value) {\n // Class expressions may have an optional name.\n if (type == \"variable\") return className(type, value);\n return classNameAfter(type, value);\n }\n function className(type, value) {\n if (type == \"variable\") {register(value); return cont(classNameAfter);}\n }\n function classNameAfter(type, value) {\n if (value == \"<\") return cont(pushlex(\">\"), commasep(typeparam, \">\"), poplex, classNameAfter)\n if (value == \"extends\" || value == \"implements\" || (isTS && type == \",\")) {\n if (value == \"implements\") cx.marked = \"keyword\";\n return cont(isTS ? typeexpr : expression, classNameAfter);\n }\n if (type == \"{\") return cont(pushlex(\"}\"), classBody, poplex);\n }\n function classBody(type, value) {\n if (type == \"async\" ||\n (type == \"variable\" &&\n (value == \"static\" || value == \"get\" || value == \"set\" || (isTS && isModifier(value))) &&\n cx.stream.match(/^\\s+[\\w$\\xa1-\\uffff]/, false))) {\n cx.marked = \"keyword\";\n return cont(classBody);\n }\n if (type == \"variable\" || cx.style == \"keyword\") {\n cx.marked = \"property\";\n return cont(classfield, classBody);\n }\n if (type == \"number\" || type == \"string\") return cont(classfield, classBody);\n if (type == \"[\")\n return cont(expression, maybetype, expect(\"]\"), classfield, classBody)\n if (value == \"*\") {\n cx.marked = \"keyword\";\n return cont(classBody);\n }\n if (isTS && type == \"(\") return pass(functiondecl, classBody)\n if (type == \";\" || type == \",\") return cont(classBody);\n if (type == \"}\") return cont();\n if (value == \"@\") return cont(expression, classBody)\n }\n function classfield(type, value) {\n if (value == \"?\") return cont(classfield)\n if (type == \":\") return cont(typeexpr, maybeAssign)\n if (value == \"=\") return cont(expressionNoComma)\n var context = cx.state.lexical.prev, isInterface = context && context.info == \"interface\"\n return pass(isInterface ? functiondecl : functiondef)\n }\n function afterExport(type, value) {\n if (value == \"*\") { cx.marked = \"keyword\"; return cont(maybeFrom, expect(\";\")); }\n if (value == \"default\") { cx.marked = \"keyword\"; return cont(expression, expect(\";\")); }\n if (type == \"{\") return cont(commasep(exportField, \"}\"), maybeFrom, expect(\";\"));\n return pass(statement);\n }\n function exportField(type, value) {\n if (value == \"as\") { cx.marked = \"keyword\"; return cont(expect(\"variable\")); }\n if (type == \"variable\") return pass(expressionNoComma, exportField);\n }\n function afterImport(type) {\n if (type == \"string\") return cont();\n if (type == \"(\") return pass(expression);\n return pass(importSpec, maybeMoreImports, maybeFrom);\n }\n function importSpec(type, value) {\n if (type == \"{\") return contCommasep(importSpec, \"}\");\n if (type == \"variable\") register(value);\n if (value == \"*\") cx.marked = \"keyword\";\n return cont(maybeAs);\n }\n function maybeMoreImports(type) {\n if (type == \",\") return cont(importSpec, maybeMoreImports)\n }\n function maybeAs(_type, value) {\n if (value == \"as\") { cx.marked = \"keyword\"; return cont(importSpec); }\n }\n function maybeFrom(_type, value) {\n if (value == \"from\") { cx.marked = \"keyword\"; return cont(expression); }\n }\n function arrayLiteral(type) {\n if (type == \"]\") return cont();\n return pass(commasep(expressionNoComma, \"]\"));\n }\n function enumdef() {\n return pass(pushlex(\"form\"), pattern, expect(\"{\"), pushlex(\"}\"), commasep(enummember, \"}\"), poplex, poplex)\n }\n function enummember() {\n return pass(pattern, maybeAssign);\n }\n\n function isContinuedStatement(state, textAfter) {\n return state.lastType == \"operator\" || state.lastType == \",\" ||\n isOperatorChar.test(textAfter.charAt(0)) ||\n /[,.]/.test(textAfter.charAt(0));\n }\n\n function expressionAllowed(stream, state, backUp) {\n return state.tokenize == tokenBase &&\n /^(?:operator|sof|keyword [bcd]|case|new|export|default|spread|[\\[{}\\(,;:]|=>)$/.test(state.lastType) ||\n (state.lastType == \"quasi\" && /\\{\\s*$/.test(stream.string.slice(0, stream.pos - (backUp || 0))))\n }\n\n // Interface\n\n return {\n startState: function(basecolumn) {\n var state = {\n tokenize: tokenBase,\n lastType: \"sof\",\n cc: [],\n lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, \"block\", false),\n localVars: parserConfig.localVars,\n context: parserConfig.localVars && new Context(null, null, false),\n indented: basecolumn || 0\n };\n if (parserConfig.globalVars && typeof parserConfig.globalVars == \"object\")\n state.globalVars = parserConfig.globalVars;\n return state;\n },\n\n token: function(stream, state) {\n if (stream.sol()) {\n if (!state.lexical.hasOwnProperty(\"align\"))\n state.lexical.align = false;\n state.indented = stream.indentation();\n findFatArrow(stream, state);\n }\n if (state.tokenize != tokenComment && stream.eatSpace()) return null;\n var style = state.tokenize(stream, state);\n if (type == \"comment\") return style;\n state.lastType = type == \"operator\" && (content == \"++\" || content == \"--\") ? \"incdec\" : type;\n return parseJS(state, style, type, content, stream);\n },\n\n indent: function(state, textAfter) {\n if (state.tokenize == tokenComment || state.tokenize == tokenQuasi) return CodeMirror.Pass;\n if (state.tokenize != tokenBase) return 0;\n var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical, top\n // Kludge to prevent 'maybelse' from blocking lexical scope pops\n if (!/^\\s*else\\b/.test(textAfter)) for (var i = state.cc.length - 1; i >= 0; --i) {\n var c = state.cc[i];\n if (c == poplex) lexical = lexical.prev;\n else if (c != maybeelse) break;\n }\n while ((lexical.type == \"stat\" || lexical.type == \"form\") &&\n (firstChar == \"}\" || ((top = state.cc[state.cc.length - 1]) &&\n (top == maybeoperatorComma || top == maybeoperatorNoComma) &&\n !/^[,\\.=+\\-*:?[\\(]/.test(textAfter))))\n lexical = lexical.prev;\n if (statementIndent && lexical.type == \")\" && lexical.prev.type == \"stat\")\n lexical = lexical.prev;\n var type = lexical.type, closing = firstChar == type;\n\n if (type == \"vardef\") return lexical.indented + (state.lastType == \"operator\" || state.lastType == \",\" ? lexical.info.length + 1 : 0);\n else if (type == \"form\" && firstChar == \"{\") return lexical.indented;\n else if (type == \"form\") return lexical.indented + indentUnit;\n else if (type == \"stat\")\n return lexical.indented + (isContinuedStatement(state, textAfter) ? statementIndent || indentUnit : 0);\n else if (lexical.info == \"switch\" && !closing && parserConfig.doubleIndentSwitch != false)\n return lexical.indented + (/^(?:case|default)\\b/.test(textAfter) ? indentUnit : 2 * indentUnit);\n else if (lexical.align) return lexical.column + (closing ? 0 : 1);\n else return lexical.indented + (closing ? 0 : indentUnit);\n },\n\n electricInput: /^\\s*(?:case .*?:|default:|\\{|\\})$/,\n blockCommentStart: jsonMode ? null : \"/*\",\n blockCommentEnd: jsonMode ? null : \"*/\",\n blockCommentContinue: jsonMode ? null : \" * \",\n lineComment: jsonMode ? null : \"//\",\n fold: \"brace\",\n closeBrackets: \"()[]{}''\\\"\\\"``\",\n\n helperType: jsonMode ? \"json\" : \"javascript\",\n jsonldMode: jsonldMode,\n jsonMode: jsonMode,\n\n expressionAllowed: expressionAllowed,\n\n skipExpression: function(state) {\n var top = state.cc[state.cc.length - 1]\n if (top == expression || top == expressionNoComma) state.cc.pop()\n }\n };\n});\n\nCodeMirror.registerHelper(\"wordChars\", \"javascript\", /[\\w$]/);\n\nCodeMirror.defineMIME(\"text/javascript\", \"javascript\");\nCodeMirror.defineMIME(\"text/ecmascript\", \"javascript\");\nCodeMirror.defineMIME(\"application/javascript\", \"javascript\");\nCodeMirror.defineMIME(\"application/x-javascript\", \"javascript\");\nCodeMirror.defineMIME(\"application/ecmascript\", \"javascript\");\nCodeMirror.defineMIME(\"application/json\", {name: \"javascript\", json: true});\nCodeMirror.defineMIME(\"application/x-json\", {name: \"javascript\", json: true});\nCodeMirror.defineMIME(\"application/ld+json\", {name: \"javascript\", jsonld: true});\nCodeMirror.defineMIME(\"text/typescript\", { name: \"javascript\", typescript: true });\nCodeMirror.defineMIME(\"application/typescript\", { name: \"javascript\", typescript: true });\n\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vbm9kZV9tb2R1bGVzL2NvZGVtaXJyb3IvbW9kZS9qYXZhc2NyaXB0L2phdmFzY3JpcHQuanM/ZjlkNCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUVBO0FBQ0EsTUFBTSxJQUF1RDtBQUM3RCxRQUFRLG1CQUFPLENBQUMseUVBQXNCO0FBQ3RDLE9BQU8sRUFHYTtBQUNwQixDQUFDO0FBQ0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSx1QkFBdUIsUUFBUTtBQUMvQjtBQUNBLDJDQUEyQzs7QUFFM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLLGtCQUFrQixNQUFNO0FBQzdCO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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LG1EQUFtRCxjQUFjLDJCQUEyQjtBQUM1RjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwwRUFBMEUsSUFBSTtBQUM5RSx1Q0FBdUM7QUFDdkM7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEVBQTBFLFFBQVE7QUFDbEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxnREFBZ0Q7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMLGdEQUFnRCxHQUFHO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7O0FBRTFCO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLCtCQUErQjtBQUMxRSw2Q0FBNkMsK0JBQStCO0FBQzVFLDhDQUE4QyxpQ0FBaUM7QUFDL0UsMENBQTBDLHVDQUF1QztBQUNqRixpREFBaUQsdUNBQXVDOztBQUV4RixDQUFDIiwiZmlsZSI6Ii4vbm9kZV9tb2R1bGVzL2NvZGVtaXJyb3IvbW9kZS9qYXZhc2NyaXB0L2phdmFzY3JpcHQuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb2RlTWlycm9yLCBjb3B5cmlnaHQgKGMpIGJ5IE1hcmlqbiBIYXZlcmJla2UgYW5kIG90aGVyc1xuLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHBzOi8vY29kZW1pcnJvci5uZXQvTElDRU5TRVxuXG4oZnVuY3Rpb24obW9kKSB7XG4gIGlmICh0eXBlb2YgZXhwb3J0cyA9PSBcIm9iamVjdFwiICYmIHR5cGVvZiBtb2R1bGUgPT0gXCJvYmplY3RcIikgLy8gQ29tbW9uSlNcbiAgICBtb2QocmVxdWlyZShcIi4uLy4uL2xpYi9jb2RlbWlycm9yXCIpKTtcbiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkgLy8gQU1EXG4gICAgZGVmaW5lKFtcIi4uLy4uL2xpYi9jb2RlbWlycm9yXCJdLCBtb2QpO1xuICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52XG4gICAgbW9kKENvZGVNaXJyb3IpO1xufSkoZnVuY3Rpb24oQ29kZU1pcnJvcikge1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbkNvZGVNaXJyb3IuZGVmaW5lTW9kZShcImphdmFzY3JpcHRcIiwgZnVuY3Rpb24oY29uZmlnLCBwYXJzZXJDb25maWcpIHtcbiAgdmFyIGluZGVudFVuaXQgPSBjb25maWcuaW5kZW50VW5pdDtcbiAgdmFyIHN0YXRlbWVudEluZGVudCA9IHBhcnNlckNvbmZpZy5zdGF0ZW1lbnRJbmRlbnQ7XG4gIHZhciBqc29ubGRNb2RlID0gcGFyc2VyQ29uZmlnLmpzb25sZDtcbiAgdmFyIGpzb25Nb2RlID0gcGFyc2VyQ29uZmlnLmpzb24gfHwganNvbmxkTW9kZTtcbiAgdmFyIGlzVFMgPSBwYXJzZXJDb25maWcudHlwZXNjcmlwdDtcbiAgdmFyIHdvcmRSRSA9IHBhcnNlckNvbmZpZy53b3JkQ2hhcmFjdGVycyB8fCAvW1xcdyRcXHhhMS1cXHVmZmZmXS87XG5cbiAgLy8gVG9rZW5pemVyXG5cbiAgdmFyIGtleXdvcmRzID0gZnVuY3Rpb24oKXtcbiAgICBmdW5jdGlvbiBrdyh0eXBlKSB7cmV0dXJuIHt0eXBlOiB0eXBlLCBzdHlsZTogXCJrZXl3b3JkXCJ9O31cbiAgICB2YXIgQSA9IGt3KFwia2V5d29yZCBhXCIpLCBCID0ga3coXCJrZXl3b3JkIGJcIiksIEMgPSBrdyhcImtleXdvcmQgY1wiKSwgRCA9IGt3KFwia2V5d29yZCBkXCIpO1xuICAgIHZhciBvcGVyYXRvciA9IGt3KFwib3BlcmF0b3JcIiksIGF0b20gPSB7dHlwZTogXCJhdG9tXCIsIHN0eWxlOiBcImF0b21cIn07XG5cbiAgICByZXR1cm4ge1xuICAgICAgXCJpZlwiOiBrdyhcImlmXCIpLCBcIndoaWxlXCI6IEEsIFwid2l0aFwiOiBBLCBcImVsc2VcIjogQiwgXCJkb1wiOiBCLCBcInRyeVwiOiBCLCBcImZpbmFsbHlcIjogQixcbiAgICAgIFwicmV0dXJuXCI6IEQsIFwiYnJlYWtcIjogRCwgXCJjb250aW51ZVwiOiBELCBcIm5ld1wiOiBrdyhcIm5ld1wiKSwgXCJkZWxldGVcIjogQywgXCJ2b2lkXCI6IEMsIFwidGhyb3dcIjogQyxcbiAgICAgIFwiZGVidWdnZXJcIjoga3coXCJkZWJ1Z2dlclwiKSwgXCJ2YXJcIjoga3coXCJ2YXJcIiksIFwiY29uc3RcIjoga3coXCJ2YXJcIiksIFwibGV0XCI6IGt3KFwidmFyXCIpLFxuICAgICAgXCJmdW5jdGlvblwiOiBrdyhcImZ1bmN0aW9uXCIpLCBcImNhdGNoXCI6IGt3KFwiY2F0Y2hcIiksXG4gICAgICBcImZvclwiOiBrdyhcImZvclwiKSwgXCJzd2l0Y2hcIjoga3coXCJzd2l0Y2hcIiksIFwiY2FzZVwiOiBrdyhcImNhc2VcIiksIFwiZGVmYXVsdFwiOiBrdyhcImRlZmF1bHRcIiksXG4gICAgICBcImluXCI6IG9wZXJhdG9yLCBcInR5cGVvZlwiOiBvcGVyYXRvciwgXCJpbnN0YW5jZW9mXCI6IG9wZXJhdG9yLFxuICAgICAgXCJ0cnVlXCI6IGF0b20sIFwiZmFsc2VcIjogYXRvbSwgXCJudWxsXCI6IGF0b20sIFwidW5kZWZpbmVkXCI6IGF0b20sIFwiTmFOXCI6IGF0b20sIFwiSW5maW5pdHlcIjogYXRvbSxcbiAgICAgIFwidGhpc1wiOiBrdyhcInRoaXNcIiksIFwiY2xhc3NcIjoga3coXCJjbGFzc1wiKSwgXCJzdXBlclwiOiBrdyhcImF0b21cIiksXG4gICAgICBcInlpZWxkXCI6IEMsIFwiZXhwb3J0XCI6IGt3KFwiZXhwb3J0XCIpLCBcImltcG9ydFwiOiBrdyhcImltcG9ydFwiKSwgXCJleHRlbmRzXCI6IEMsXG4gICAgICBcImF3YWl0XCI6IENcbiAgICB9O1xuICB9KCk7XG5cbiAgdmFyIGlzT3BlcmF0b3JDaGFyID0gL1srXFwtKiYlPTw+IT98fl5AXS87XG4gIHZhciBpc0pzb25sZEtleXdvcmQgPSAvXkAoY29udGV4dHxpZHx2YWx1ZXxsYW5ndWFnZXx0eXBlfGNvbnRhaW5lcnxsaXN0fHNldHxyZXZlcnNlfGluZGV4fGJhc2V8dm9jYWJ8Z3JhcGgpXCIvO1xuXG4gIGZ1bmN0aW9uIHJlYWRSZWdleHAoc3RyZWFtKSB7XG4gICAgdmFyIGVzY2FwZWQgPSBmYWxzZSwgbmV4dCwgaW5TZXQgPSBmYWxzZTtcbiAgICB3aGlsZSAoKG5leHQgPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7XG4gICAgICBpZiAoIWVzY2FwZWQpIHtcbiAgICAgICAgaWYgKG5leHQgPT0gXCIvXCIgJiYgIWluU2V0KSByZXR1cm47XG4gICAgICAgIGlmIChuZXh0ID09IFwiW1wiKSBpblNldCA9IHRydWU7XG4gICAgICAgIGVsc2UgaWYgKGluU2V0ICYmIG5leHQgPT0gXCJdXCIpIGluU2V0ID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgbmV4dCA9PSBcIlxcXFxcIjtcbiAgICB9XG4gIH1cblxuICAvLyBVc2VkIGFzIHNjcmF0Y2ggdmFyaWFibGVzIHRvIGNvbW11bmljYXRlIG11bHRpcGxlIHZhbHVlcyB3aXRob3V0XG4gIC8vIGNvbnNpbmcgdXAgdG9ucyBvZiBvYmplY3RzLlxuICB2YXIgdHlwZSwgY29udGVudDtcbiAgZnVuY3Rpb24gcmV0KHRwLCBzdHlsZSwgY29udCkge1xuICAgIHR5cGUgPSB0cDsgY29udGVudCA9IGNvbnQ7XG4gICAgcmV0dXJuIHN0eWxlO1xuICB9XG4gIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7XG4gICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTtcbiAgICBpZiAoY2ggPT0gJ1wiJyB8fCBjaCA9PSBcIidcIikge1xuICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblN0cmluZyhjaCk7XG4gICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7XG4gICAgfSBlbHNlIGlmIChjaCA9PSBcIi5cIiAmJiBzdHJlYW0ubWF0Y2goL15cXGRbXFxkX10qKD86W2VFXVsrXFwtXT9bXFxkX10rKT8vKSkge1xuICAgICAgcmV0dXJuIHJldChcIm51bWJlclwiLCBcIm51bWJlclwiKTtcbiAgICB9IGVsc2UgaWYgKGNoID09IFwiLlwiICYmIHN0cmVhbS5tYXRjaChcIi4uXCIpKSB7XG4gICAgICByZXR1cm4gcmV0KFwic3ByZWFkXCIsIFwibWV0YVwiKTtcbiAgICB9IGVsc2UgaWYgKC9bXFxbXFxde31cXChcXCksO1xcOlxcLl0vLnRlc3QoY2gpKSB7XG4gICAgICByZXR1cm4gcmV0KGNoKTtcbiAgICB9IGVsc2UgaWYgKGNoID09IFwiPVwiICYmIHN0cmVhbS5lYXQoXCI+XCIpKSB7XG4gICAgICByZXR1cm4gcmV0KFwiPT5cIiwgXCJvcGVyYXRvclwiKTtcbiAgICB9IGVsc2UgaWYgKGNoID09IFwiMFwiICYmIHN0cmVhbS5tYXRjaCgvXig/OnhbXFxkQS1GYS1mX10rfG9bMC03X10rfGJbMDFfXSspbj8vKSkge1xuICAgICAgcmV0dXJuIHJldChcIm51bWJlclwiLCBcIm51bWJlclwiKTtcbiAgICB9IGVsc2UgaWYgKC9cXGQvLnRlc3QoY2gpKSB7XG4gICAgICBzdHJlYW0ubWF0Y2goL15bXFxkX10qKD86bnwoPzpcXC5bXFxkX10qKT8oPzpbZUVdWytcXC1dP1tcXGRfXSspPyk/Lyk7XG4gICAgICByZXR1cm4gcmV0KFwibnVtYmVyXCIsIFwibnVtYmVyXCIpO1xuICAgIH0gZWxzZSBpZiAoY2ggPT0gXCIvXCIpIHtcbiAgICAgIGlmIChzdHJlYW0uZWF0KFwiKlwiKSkge1xuICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQ29tbWVudDtcbiAgICAgICAgcmV0dXJuIHRva2VuQ29tbWVudChzdHJlYW0sIHN0YXRlKTtcbiAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLmVhdChcIi9cIikpIHtcbiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpO1xuICAgICAgICByZXR1cm4gcmV0KFwiY29tbWVudFwiLCBcImNvbW1lbnRcIik7XG4gICAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb25BbGxvd2VkKHN0cmVhbSwgc3RhdGUsIDEpKSB7XG4gICAgICAgIHJlYWRSZWdleHAoc3RyZWFtKTtcbiAgICAgICAgc3RyZWFtLm1hdGNoKC9eXFxiKChbZ2lteXVzXSkoPyFbZ2lteXVzXSpcXDIpKStcXGIvKTtcbiAgICAgICAgcmV0dXJuIHJldChcInJlZ2V4cFwiLCBcInN0cmluZy0yXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RyZWFtLmVhdChcIj1cIik7XG4gICAgICAgIHJldHVybiByZXQoXCJvcGVyYXRvclwiLCBcIm9wZXJhdG9yXCIsIHN0cmVhbS5jdXJyZW50KCkpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY2ggPT0gXCJgXCIpIHtcbiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5RdWFzaTtcbiAgICAgIHJldHVybiB0b2tlblF1YXNpKHN0cmVhbSwgc3RhdGUpO1xuICAgIH0gZWxzZSBpZiAoY2ggPT0gXCIjXCIgJiYgc3RyZWFtLnBlZWsoKSA9PSBcIiFcIikge1xuICAgICAgc3RyZWFtLnNraXBUb0VuZCgpO1xuICAgICAgcmV0dXJuIHJldChcIm1ldGFcIiwgXCJtZXRhXCIpO1xuICAgIH0gZWxzZSBpZiAoY2ggPT0gXCIjXCIgJiYgc3RyZWFtLmVhdFdoaWxlKHdvcmRSRSkpIHtcbiAgICAgIHJldHVybiByZXQoXCJ2YXJpYWJsZVwiLCBcInByb3BlcnR5XCIpXG4gICAgfSBlbHNlIGlmIChjaCA9PSBcIjxcIiAmJiBzdHJlYW0ubWF0Y2goXCIhLS1cIikgfHxcbiAgICAgICAgICAgICAgIChjaCA9PSBcIi1cIiAmJiBzdHJlYW0ubWF0Y2goXCItPlwiKSAmJiAhL1xcUy8udGVzdChzdHJlYW0uc3RyaW5nLnNsaWNlKDAsIHN0cmVhbS5zdGFydCkpKSkge1xuICAgICAgc3RyZWFtLnNraXBUb0VuZCgpXG4gICAgICByZXR1cm4gcmV0KFwiY29tbWVudFwiLCBcImNvbW1lbnRcIilcbiAgICB9IGVsc2UgaWYgKGlzT3BlcmF0b3JDaGFyLnRlc3QoY2gpKSB7XG4gICAgICBpZiAoY2ggIT0gXCI+XCIgfHwgIXN0YXRlLmxleGljYWwgfHwgc3RhdGUubGV4aWNhbC50eXBlICE9IFwiPlwiKSB7XG4gICAgICAgIGlmIChzdHJlYW0uZWF0KFwiPVwiKSkge1xuICAgICAgICAgIGlmIChjaCA9PSBcIiFcIiB8fCBjaCA9PSBcIj1cIikgc3RyZWFtLmVhdChcIj1cIilcbiAgICAgICAgfSBlbHNlIGlmICgvWzw+KitcXC18Jj9dLy50ZXN0KGNoKSkge1xuICAgICAgICAgIHN0cmVhbS5lYXQoY2gpXG4gICAgICAgICAgaWYgKGNoID09IFwiPlwiKSBzdHJlYW0uZWF0KGNoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoY2ggPT0gXCI/XCIgJiYgc3RyZWFtLmVhdChcIi5cIikpIHJldHVybiByZXQoXCIuXCIpXG4gICAgICByZXR1cm4gcmV0KFwib3BlcmF0b3JcIiwgXCJvcGVyYXRvclwiLCBzdHJlYW0uY3VycmVudCgpKTtcbiAgICB9IGVsc2UgaWYgKHdvcmRSRS50ZXN0KGNoKSkge1xuICAgICAgc3RyZWFtLmVhdFdoaWxlKHdvcmRSRSk7XG4gICAgICB2YXIgd29yZCA9IHN0cmVhbS5jdXJyZW50KClcbiAgICAgIGlmIChzdGF0ZS5sYXN0VHlwZSAhPSBcIi5cIikge1xuICAgICAgICBpZiAoa2V5d29yZHMucHJvcGVydHlJc0VudW1lcmFibGUod29yZCkpIHtcbiAgICAgICAgICB2YXIga3cgPSBrZXl3b3Jkc1t3b3JkXVxuICAgICAgICAgIHJldHVybiByZXQoa3cudHlwZSwga3cuc3R5bGUsIHdvcmQpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdvcmQgPT0gXCJhc3luY1wiICYmIHN0cmVhbS5tYXRjaCgvXihcXHN8XFwvXFwqKFteKl18XFwqKD8hXFwvKSkqP1xcKlxcLykqW1xcW1xcKFxcd10vLCBmYWxzZSkpXG4gICAgICAgICAgcmV0dXJuIHJldChcImFzeW5jXCIsIFwia2V5d29yZFwiLCB3b3JkKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJldChcInZhcmlhYmxlXCIsIFwidmFyaWFibGVcIiwgd29yZClcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB0b2tlblN0cmluZyhxdW90ZSkge1xuICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7XG4gICAgICB2YXIgZXNjYXBlZCA9IGZhbHNlLCBuZXh0O1xuICAgICAgaWYgKGpzb25sZE1vZGUgJiYgc3RyZWFtLnBlZWsoKSA9PSBcIkBcIiAmJiBzdHJlYW0ubWF0Y2goaXNKc29ubGRLZXl3b3JkKSl7XG4gICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlO1xuICAgICAgICByZXR1cm4gcmV0KFwianNvbmxkLWtleXdvcmRcIiwgXCJtZXRhXCIpO1xuICAgICAgfVxuICAgICAgd2hpbGUgKChuZXh0ID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkge1xuICAgICAgICBpZiAobmV4dCA9PSBxdW90ZSAmJiAhZXNjYXBlZCkgYnJlYWs7XG4gICAgICAgIGVzY2FwZWQgPSAhZXNjYXBlZCAmJiBuZXh0ID09IFwiXFxcXFwiO1xuICAgICAgfVxuICAgICAgaWYgKCFlc2NhcGVkKSBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTtcbiAgICAgIHJldHVybiByZXQoXCJzdHJpbmdcIiwgXCJzdHJpbmdcIik7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRva2VuQ29tbWVudChzdHJlYW0sIHN0YXRlKSB7XG4gICAgdmFyIG1heWJlRW5kID0gZmFsc2UsIGNoO1xuICAgIHdoaWxlIChjaCA9IHN0cmVhbS5uZXh0KCkpIHtcbiAgICAgIGlmIChjaCA9PSBcIi9cIiAmJiBtYXliZUVuZCkge1xuICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBtYXliZUVuZCA9IChjaCA9PSBcIipcIik7XG4gICAgfVxuICAgIHJldHVybiByZXQoXCJjb21tZW50XCIsIFwiY29tbWVudFwiKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRva2VuUXVhc2koc3RyZWFtLCBzdGF0ZSkge1xuICAgIHZhciBlc2NhcGVkID0gZmFsc2UsIG5leHQ7XG4gICAgd2hpbGUgKChuZXh0ID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkge1xuICAgICAgaWYgKCFlc2NhcGVkICYmIChuZXh0ID09IFwiYFwiIHx8IG5leHQgPT0gXCIkXCIgJiYgc3RyZWFtLmVhdChcIntcIikpKSB7XG4gICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGVzY2FwZWQgPSAhZXNjYXBlZCAmJiBuZXh0ID09IFwiXFxcXFwiO1xuICAgIH1cbiAgICByZXR1cm4gcmV0KFwicXVhc2lcIiwgXCJzdHJpbmctMlwiLCBzdHJlYW0uY3VycmVudCgpKTtcbiAgfVxuXG4gIHZhciBicmFja2V0cyA9IFwiKFt7fV0pXCI7XG4gIC8vIFRoaXMgaXMgYSBjcnVkZSBsb29rYWhlYWQgdHJpY2sgdG8gdHJ5IGFuZCBub3RpY2UgdGhhdCB3ZSdyZVxuICAvLyBwYXJzaW5nIHRoZSBhcmd1bWVudCBwYXR0ZXJucyBmb3IgYSBmYXQtYXJyb3cgZnVuY3Rpb24gYmVmb3JlIHdlXG4gIC8vIGFjdHVhbGx5IGhpdCB0aGUgYXJyb3cgdG9rZW4uIEl0IG9ubHkgd29ya3MgaWYgdGhlIGFycm93IGlzIG9uXG4gIC8vIHRoZSBzYW1lIGxpbmUgYXMgdGhlIGFyZ3VtZW50cyBhbmQgdGhlcmUncyBubyBzdHJhbmdlIG5vaXNlXG4gIC8vIChjb21tZW50cykgaW4gYmV0d2Vlbi4gRmFsbGJhY2sgaXMgdG8gb25seSBub3RpY2Ugd2hlbiB3ZSBoaXQgdGhlXG4gIC8vIGFycm93LCBhbmQgbm90IGRlY2xhcmUgdGhlIGFyZ3VtZW50cyBhcyBsb2NhbHMgZm9yIHRoZSBhcnJvd1xuICAvLyBib2R5LlxuICBmdW5jdGlvbiBmaW5kRmF0QXJyb3coc3RyZWFtLCBzdGF0ZSkge1xuICAgIGlmIChzdGF0ZS5mYXRBcnJvd0F0KSBzdGF0ZS5mYXRBcnJvd0F0ID0gbnVsbDtcbiAgICB2YXIgYXJyb3cgPSBzdHJlYW0uc3RyaW5nLmluZGV4T2YoXCI9PlwiLCBzdHJlYW0uc3RhcnQpO1xuICAgIGlmIChhcnJvdyA8IDApIHJldHVybjtcblxuICAgIGlmIChpc1RTKSB7IC8vIFRyeSB0byBza2lwIFR5cGVTY3JpcHQgcmV0dXJuIHR5cGUgZGVjbGFyYXRpb25zIGFmdGVyIHRoZSBhcmd1bWVudHNcbiAgICAgIHZhciBtID0gLzpcXHMqKD86XFx3Kyg/OjxbXj5dKj58XFxbXFxdKT98XFx7W159XSpcXH0pXFxzKiQvLmV4ZWMoc3RyZWFtLnN0cmluZy5zbGljZShzdHJlYW0uc3RhcnQsIGFycm93KSlcbiAgICAgIGlmIChtKSBhcnJvdyA9IG0uaW5kZXhcbiAgICB9XG5cbiAgICB2YXIgZGVwdGggPSAwLCBzYXdTb21ldGhpbmcgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBwb3MgPSBhcnJvdyAtIDE7IHBvcyA+PSAwOyAtLXBvcykge1xuICAgICAgdmFyIGNoID0gc3RyZWFtLnN0cmluZy5jaGFyQXQocG9zKTtcbiAgICAgIHZhciBicmFja2V0ID0gYnJhY2tldHMuaW5kZXhPZihjaCk7XG4gICAgICBpZiAoYnJhY2tldCA+PSAwICYmIGJyYWNrZXQgPCAzKSB7XG4gICAgICAgIGlmICghZGVwdGgpIHsgKytwb3M7IGJyZWFrOyB9XG4gICAgICAgIGlmICgtLWRlcHRoID09IDApIHsgaWYgKGNoID09IFwiKFwiKSBzYXdTb21ldGhpbmcgPSB0cnVlOyBicmVhazsgfVxuICAgICAgfSBlbHNlIGlmIChicmFja2V0ID49IDMgJiYgYnJhY2tldCA8IDYpIHtcbiAgICAgICAgKytkZXB0aDtcbiAgICAgIH0gZWxzZSBpZiAod29yZFJFLnRlc3QoY2gpKSB7XG4gICAgICAgIHNhd1NvbWV0aGluZyA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKC9bXCInXFwvYF0vLnRlc3QoY2gpKSB7XG4gICAgICAgIGZvciAoOzsgLS1wb3MpIHtcbiAgICAgICAgICBpZiAocG9zID09IDApIHJldHVyblxuICAgICAgICAgIHZhciBuZXh0ID0gc3RyZWFtLnN0cmluZy5jaGFyQXQocG9zIC0gMSlcbiAgICAgICAgICBpZiAobmV4dCA9PSBjaCAmJiBzdHJlYW0uc3RyaW5nLmNoYXJBdChwb3MgLSAyKSAhPSBcIlxcXFxcIikgeyBwb3MtLTsgYnJlYWsgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHNhd1NvbWV0aGluZyAmJiAhZGVwdGgpIHtcbiAgICAgICAgKytwb3M7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc2F3U29tZXRoaW5nICYmICFkZXB0aCkgc3RhdGUuZmF0QXJyb3dBdCA9IHBvcztcbiAgfVxuXG4gIC8vIFBhcnNlclxuXG4gIHZhciBhdG9taWNUeXBlcyA9IHtcImF0b21cIjogdHJ1ZSwgXCJudW1iZXJcIjogdHJ1ZSwgXCJ2YXJpYWJsZVwiOiB0cnVlLCBcInN0cmluZ1wiOiB0cnVlLCBcInJlZ2V4cFwiOiB0cnVlLCBcInRoaXNcIjogdHJ1ZSwgXCJqc29ubGQta2V5d29yZFwiOiB0cnVlfTtcblxuICBmdW5jdGlvbiBKU0xleGljYWwoaW5kZW50ZWQsIGNvbHVtbiwgdHlwZSwgYWxpZ24sIHByZXYsIGluZm8pIHtcbiAgICB0aGlzLmluZGVudGVkID0gaW5kZW50ZWQ7XG4gICAgdGhpcy5jb2x1bW4gPSBjb2x1bW47XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB0aGlzLnByZXYgPSBwcmV2O1xuICAgIHRoaXMuaW5mbyA9IGluZm87XG4gICAgaWYgKGFsaWduICE9IG51bGwpIHRoaXMuYWxpZ24gPSBhbGlnbjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluU2NvcGUoc3RhdGUsIHZhcm5hbWUpIHtcbiAgICBmb3IgKHZhciB2ID0gc3RhdGUubG9jYWxWYXJzOyB2OyB2ID0gdi5uZXh0KVxuICAgICAgaWYgKHYubmFtZSA9PSB2YXJuYW1lKSByZXR1cm4gdHJ1ZTtcbiAgICBmb3IgKHZhciBjeCA9IHN0YXRlLmNvbnRleHQ7IGN4OyBjeCA9IGN4LnByZXYpIHtcbiAgICAgIGZvciAodmFyIHYgPSBjeC52YXJzOyB2OyB2ID0gdi5uZXh0KVxuICAgICAgICBpZiAodi5uYW1lID09IHZhcm5hbWUpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlSlMoc3RhdGUsIHN0eWxlLCB0eXBlLCBjb250ZW50LCBzdHJlYW0pIHtcbiAgICB2YXIgY2MgPSBzdGF0ZS5jYztcbiAgICAvLyBDb21tdW5pY2F0ZSBvdXIgY29udGV4dCB0byB0aGUgY29tYmluYXRvcnMuXG4gICAgLy8gKExlc3Mgd2FzdGVmdWwgdGhhbiBjb25zaW5nIHVwIGEgaHVuZHJlZCBjbG9zdXJlcyBvbiBldmVyeSBjYWxsLilcbiAgICBjeC5zdGF0ZSA9IHN0YXRlOyBjeC5zdHJlYW0gPSBzdHJlYW07IGN4Lm1hcmtlZCA9IG51bGwsIGN4LmNjID0gY2M7IGN4LnN0eWxlID0gc3R5bGU7XG5cbiAgICBpZiAoIXN0YXRlLmxleGljYWwuaGFzT3duUHJvcGVydHkoXCJhbGlnblwiKSlcbiAgICAgIHN0YXRlLmxleGljYWwuYWxpZ24gPSB0cnVlO1xuXG4gICAgd2hpbGUodHJ1ZSkge1xuICAgICAgdmFyIGNvbWJpbmF0b3IgPSBjYy5sZW5ndGggPyBjYy5wb3AoKSA6IGpzb25Nb2RlID8gZXhwcmVzc2lvbiA6IHN0YXRlbWVudDtcbiAgICAgIGlmIChjb21iaW5hdG9yKHR5cGUsIGNvbnRlbnQpKSB7XG4gICAgICAgIHdoaWxlKGNjLmxlbmd0aCAmJiBjY1tjYy5sZW5ndGggLSAxXS5sZXgpXG4gICAgICAgICAgY2MucG9wKCkoKTtcbiAgICAgICAgaWYgKGN4Lm1hcmtlZCkgcmV0dXJuIGN4Lm1hcmtlZDtcbiAgICAgICAgaWYgKHR5cGUgPT0gXCJ2YXJpYWJsZVwiICYmIGluU2NvcGUoc3RhdGUsIGNvbnRlbnQpKSByZXR1cm4gXCJ2YXJpYWJsZS0yXCI7XG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBDb21iaW5hdG9yIHV0aWxzXG5cbiAgdmFyIGN4ID0ge3N0YXRlOiBudWxsLCBjb2x1bW46IG51bGwsIG1hcmtlZDogbnVsbCwgY2M6IG51bGx9O1xuICBmdW5jdGlvbiBwYXNzKCkge1xuICAgIGZvciAodmFyIGkgPSBhcmd1bWVudHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGN4LmNjLnB1c2goYXJndW1lbnRzW2ldKTtcbiAgfVxuICBmdW5jdGlvbiBjb250KCkge1xuICAgIHBhc3MuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBmdW5jdGlvbiBpbkxpc3QobmFtZSwgbGlzdCkge1xuICAgIGZvciAodmFyIHYgPSBsaXN0OyB2OyB2ID0gdi5uZXh0KSBpZiAodi5uYW1lID09IG5hbWUpIHJldHVybiB0cnVlXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGZ1bmN0aW9uIHJlZ2lzdGVyKHZhcm5hbWUpIHtcbiAgICB2YXIgc3RhdGUgPSBjeC5zdGF0ZTtcbiAgICBjeC5tYXJrZWQgPSBcImRlZlwiO1xuICAgIGlmIChzdGF0ZS5jb250ZXh0KSB7XG4gICAgICBpZiAoc3RhdGUubGV4aWNhbC5pbmZvID09IFwidmFyXCIgJiYgc3RhdGUuY29udGV4dCAmJiBzdGF0ZS5jb250ZXh0LmJsb2NrKSB7XG4gICAgICAgIC8vIEZJWE1FIGZ1bmN0aW9uIGRlY2xzIGFyZSBhbHNvIG5vdCBibG9jayBzY29wZWRcbiAgICAgICAgdmFyIG5ld0NvbnRleHQgPSByZWdpc3RlclZhclNjb3BlZCh2YXJuYW1lLCBzdGF0ZS5jb250ZXh0KVxuICAgICAgICBpZiAobmV3Q29udGV4dCAhPSBudWxsKSB7XG4gICAgICAgICAgc3RhdGUuY29udGV4dCA9IG5ld0NvbnRleHRcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghaW5MaXN0KHZhcm5hbWUsIHN0YXRlLmxvY2FsVmFycykpIHtcbiAgICAgICAgc3RhdGUubG9jYWxWYXJzID0gbmV3IFZhcih2YXJuYW1lLCBzdGF0ZS5sb2NhbFZhcnMpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cbiAgICAvLyBGYWxsIHRocm91Z2ggbWVhbnMgdGhpcyBpcyBnbG9iYWxcbiAgICBpZiAocGFyc2VyQ29uZmlnLmdsb2JhbFZhcnMgJiYgIWluTGlzdCh2YXJuYW1lLCBzdGF0ZS5nbG9iYWxWYXJzKSlcbiAgICAgIHN0YXRlLmdsb2JhbFZhcnMgPSBuZXcgVmFyKHZhcm5hbWUsIHN0YXRlLmdsb2JhbFZhcnMpXG4gIH1cbiAgZnVuY3Rpb24gcmVnaXN0ZXJWYXJTY29wZWQodmFybmFtZSwgY29udGV4dCkge1xuICAgIGlmICghY29udGV4dCkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9IGVsc2UgaWYgKGNvbnRleHQuYmxvY2spIHtcbiAgICAgIHZhciBpbm5lciA9IHJlZ2lzdGVyVmFyU2NvcGVkKHZhcm5hbWUsIGNvbnRleHQucHJldilcbiAgICAgIGlmICghaW5uZXIpIHJldHVybiBudWxsXG4gICAgICBpZiAoaW5uZXIgPT0gY29udGV4dC5wcmV2KSByZXR1cm4gY29udGV4dFxuICAgICAgcmV0dXJuIG5ldyBDb250ZXh0KGlubmVyLCBjb250ZXh0LnZhcnMsIHRydWUpXG4gICAgfSBlbHNlIGlmIChpbkxpc3QodmFybmFtZSwgY29udGV4dC52YXJzKSkge1xuICAgICAgcmV0dXJuIGNvbnRleHRcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBDb250ZXh0KGNvbnRleHQucHJldiwgbmV3IFZhcih2YXJuYW1lLCBjb250ZXh0LnZhcnMpLCBmYWxzZSlcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpc01vZGlmaWVyKG5hbWUpIHtcbiAgICByZXR1cm4gbmFtZSA9PSBcInB1YmxpY1wiIHx8IG5hbWUgPT0gXCJwcml2YXRlXCIgfHwgbmFtZSA9PSBcInByb3RlY3RlZFwiIHx8IG5hbWUgPT0gXCJhYnN0cmFjdFwiIHx8IG5hbWUgPT0gXCJyZWFkb25seVwiXG4gIH1cblxuICAvLyBDb21iaW5hdG9yc1xuXG4gIGZ1bmN0aW9uIENvbnRleHQocHJldiwgdmFycywgYmxvY2spIHsgdGhpcy5wcmV2ID0gcHJldjsgdGhpcy52YXJzID0gdmFyczsgdGhpcy5ibG9jayA9IGJsb2NrIH1cbiAgZnVuY3Rpb24gVmFyKG5hbWUsIG5leHQpIHsgdGhpcy5uYW1lID0gbmFtZTsgdGhpcy5uZXh0ID0gbmV4dCB9XG5cbiAgdmFyIGRlZmF1bHRWYXJzID0gbmV3IFZhcihcInRoaXNcIiwgbmV3IFZhcihcImFyZ3VtZW50c1wiLCBudWxsKSlcbiAgZnVuY3Rpb24gcHVzaGNvbnRleHQoKSB7XG4gICAgY3guc3RhdGUuY29udGV4dCA9IG5ldyBDb250ZXh0KGN4LnN0YXRlLmNvbnRleHQsIGN4LnN0YXRlLmxvY2FsVmFycywgZmFsc2UpXG4gICAgY3guc3RhdGUubG9jYWxWYXJzID0gZGVmYXVsdFZhcnNcbiAgfVxuICBmdW5jdGlvbiBwdXNoYmxvY2tjb250ZXh0KCkge1xuICAgIGN4LnN0YXRlLmNvbnRleHQgPSBuZXcgQ29udGV4dChjeC5zdGF0ZS5jb250ZXh0LCBjeC5zdGF0ZS5sb2NhbFZhcnMsIHRydWUpXG4gICAgY3guc3RhdGUubG9jYWxWYXJzID0gbnVsbFxuICB9XG4gIGZ1bmN0aW9uIHBvcGNvbnRleHQoKSB7XG4gICAgY3guc3RhdGUubG9jYWxWYXJzID0gY3guc3RhdGUuY29udGV4dC52YXJzXG4gICAgY3guc3RhdGUuY29udGV4dCA9IGN4LnN0YXRlLmNvbnRleHQucHJldlxuICB9XG4gIHBvcGNvbnRleHQubGV4ID0gdHJ1ZVxuICBmdW5jdGlvbiBwdXNobGV4KHR5cGUsIGluZm8pIHtcbiAgICB2YXIgcmVzdWx0ID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc3RhdGUgPSBjeC5zdGF0ZSwgaW5kZW50ID0gc3RhdGUuaW5kZW50ZWQ7XG4gICAgICBpZiAoc3RhdGUubGV4aWNhbC50eXBlID09IFwic3RhdFwiKSBpbmRlbnQgPSBzdGF0ZS5sZXhpY2FsLmluZGVudGVkO1xuICAgICAgZWxzZSBmb3IgKHZhciBvdXRlciA9IHN0YXRlLmxleGljYWw7IG91dGVyICYmIG91dGVyLnR5cGUgPT0gXCIpXCIgJiYgb3V0ZXIuYWxpZ247IG91dGVyID0gb3V0ZXIucHJldilcbiAgICAgICAgaW5kZW50ID0gb3V0ZXIuaW5kZW50ZWQ7XG4gICAgICBzdGF0ZS5sZXhpY2FsID0gbmV3IEpTTGV4aWNhbChpbmRlbnQsIGN4LnN0cmVhbS5jb2x1bW4oKSwgdHlwZSwgbnVsbCwgc3RhdGUubGV4aWNhbCwgaW5mbyk7XG4gICAgfTtcbiAgICByZXN1bHQubGV4ID0gdHJ1ZTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGZ1bmN0aW9uIHBvcGxleCgpIHtcbiAgICB2YXIgc3RhdGUgPSBjeC5zdGF0ZTtcbiAgICBpZiAoc3RhdGUubGV4aWNhbC5wcmV2KSB7XG4gICAgICBpZiAoc3RhdGUubGV4aWNhbC50eXBlID09IFwiKVwiKVxuICAgICAgICBzdGF0ZS5pbmRlbnRlZCA9IHN0YXRlLmxleGljYWwuaW5kZW50ZWQ7XG4gICAgICBzdGF0ZS5sZXhpY2FsID0gc3RhdGUubGV4aWNhbC5wcmV2O1xuICAgIH1cbiAgfVxuICBwb3BsZXgubGV4ID0gdHJ1ZTtcblxuICBmdW5jdGlvbiBleHBlY3Qod2FudGVkKSB7XG4gICAgZnVuY3Rpb24gZXhwKHR5cGUpIHtcbiAgICAgIGlmICh0eXBlID09IHdhbnRlZCkgcmV0dXJuIGNvbnQoKTtcbiAgICAgIGVsc2UgaWYgKHdhbnRlZCA9PSBcIjtcIiB8fCB0eXBlID09IFwifVwiIHx8IHR5cGUgPT0gXCIpXCIgfHwgdHlwZSA9PSBcIl1cIikgcmV0dXJuIHBhc3MoKTtcbiAgICAgIGVsc2UgcmV0dXJuIGNvbnQoZXhwKTtcbiAgICB9O1xuICAgIHJldHVybiBleHA7XG4gIH1cblxuICBmdW5jdGlvbiBzdGF0ZW1lbnQodHlwZSwgdmFsdWUpIHtcbiAgICBpZiAodHlwZSA9PSBcInZhclwiKSByZXR1cm4gY29udChwdXNobGV4KFwidmFyZGVmXCIsIHZhbHVlKSwgdmFyZGVmLCBleHBlY3QoXCI7XCIpLCBwb3BsZXgpO1xuICAgIGlmICh0eXBlID09IFwia2V5d29yZCBhXCIpIHJldHVybiBjb250KHB1c2hsZXgoXCJmb3JtXCIpLCBwYXJlbkV4cHIsIHN0YXRlbWVudCwgcG9wbGV4KTtcbiAgICBpZiAodHlwZSA9PSBcImtleXdvcmQgYlwiKSByZXR1cm4gY29udChwdXNobGV4KFwiZm9ybVwiKSwgc3RhdGVtZW50LCBwb3BsZXgpO1xuICAgIGlmICh0eXBlID09IFwia2V5d29yZCBkXCIpIHJldHVybiBjeC5zdHJlYW0ubWF0Y2goL15cXHMqJC8sIGZhbHNlKSA/IGNvbnQoKSA6IGNvbnQocHVzaGxleChcInN0YXRcIiksIG1heWJlZXhwcmVzc2lvbiwgZXhwZWN0KFwiO1wiKSwgcG9wbGV4KTtcbiAgICBpZiAodHlwZSA9PSBcImRlYnVnZ2VyXCIpIHJldHVybiBjb250KGV4cGVjdChcIjtcIikpO1xuICAgIGlmICh0eXBlID09IFwie1wiKSByZXR1cm4gY29udChwdXNobGV4KFwifVwiKSwgcHVzaGJsb2NrY29udGV4dCwgYmxvY2ssIHBvcGxleCwgcG9wY29udGV4dCk7XG4gICAgaWYgKHR5cGUgPT0gXCI7XCIpIHJldHVybiBjb250KCk7XG4gICAgaWYgKHR5cGUgPT0gXCJpZlwiKSB7XG4gICAgICBpZiAoY3guc3RhdGUubGV4aWNhbC5pbmZvID09IFwiZWxzZVwiICYmIGN4LnN0YXRlLmNjW2N4LnN0YXRlLmNjLmxlbmd0aCAtIDFdID09IHBvcGxleClcbiAgICAgICAgY3guc3RhdGUuY2MucG9wKCkoKTtcbiAgICAgIHJldHVybiBjb250KHB1c2hsZXgoXCJmb3JtXCIpLCBwYXJlbkV4cHIsIHN0YXRlbWVudCwgcG9wbGV4LCBtYXliZWVsc2UpO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBjb250KGZ1bmN0aW9uZGVmKTtcbiAgICBpZiAodHlwZSA9PSBcImZvclwiKSByZXR1cm4gY29udChwdXNobGV4KFwiZm9ybVwiKSwgZm9yc3BlYywgc3RhdGVtZW50LCBwb3BsZXgpO1xuICAgIGlmICh0eXBlID09IFwiY2xhc3NcIiB8fCAoaXNUUyAmJiB2YWx1ZSA9PSBcImludGVyZmFjZVwiKSkge1xuICAgICAgY3gubWFya2VkID0gXCJrZXl3b3JkXCJcbiAgICAgIHJldHVybiBjb250KHB1c2hsZXgoXCJmb3JtXCIsIHR5cGUgPT0gXCJjbGFzc1wiID8gdHlwZSA6IHZhbHVlKSwgY2xhc3NOYW1lLCBwb3BsZXgpXG4gICAgfVxuICAgIGlmICh0eXBlID09IFwidmFyaWFibGVcIikge1xuICAgICAgaWYgKGlzVFMgJiYgdmFsdWUgPT0gXCJkZWNsYXJlXCIpIHtcbiAgICAgICAgY3gubWFya2VkID0gXCJrZXl3b3JkXCJcbiAgICAgICAgcmV0dXJuIGNvbnQoc3RhdGVtZW50KVxuICAgICAgfSBlbHNlIGlmIChpc1RTICYmICh2YWx1ZSA9PSBcIm1vZHVsZVwiIHx8IHZhbHVlID09IFwiZW51bVwiIHx8IHZhbHVlID09IFwidHlwZVwiKSAmJiBjeC5zdHJlYW0ubWF0Y2goL15cXHMqXFx3LywgZmFsc2UpKSB7XG4gICAgICAgIGN4Lm1hcmtlZCA9IFwia2V5d29yZFwiXG4gICAgICAgIGlmICh2YWx1ZSA9PSBcImVudW1cIikgcmV0dXJuIGNvbnQoZW51bWRlZik7XG4gICAgICAgIGVsc2UgaWYgKHZhbHVlID09IFwidHlwZVwiKSByZXR1cm4gY29udCh0eXBlbmFtZSwgZXhwZWN0KFwib3BlcmF0b3JcIiksIHR5cGVleHByLCBleHBlY3QoXCI7XCIpKTtcbiAgICAgICAgZWxzZSByZXR1cm4gY29udChwdXNobGV4KFwiZm9ybVwiKSwgcGF0dGVybiwgZXhwZWN0KFwie1wiKSwgcHVzaGxleChcIn1cIiksIGJsb2NrLCBwb3BsZXgsIHBvcGxleClcbiAgICAgIH0gZWxzZSBpZiAoaXNUUyAmJiB2YWx1ZSA9PSBcIm5hbWVzcGFjZVwiKSB7XG4gICAgICAgIGN4Lm1hcmtlZCA9IFwia2V5d29yZFwiXG4gICAgICAgIHJldHVybiBjb250KHB1c2hsZXgoXCJmb3JtXCIpLCBleHByZXNzaW9uLCBzdGF0ZW1lbnQsIHBvcGxleClcbiAgICAgIH0gZWxzZSBpZiAoaXNUUyAmJiB2YWx1ZSA9PSBcImFic3RyYWN0XCIpIHtcbiAgICAgICAgY3gubWFya2VkID0gXCJrZXl3b3JkXCJcbiAgICAgICAgcmV0dXJuIGNvbnQoc3RhdGVtZW50KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGNvbnQocHVzaGxleChcInN0YXRcIiksIG1heWJlbGFiZWwpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodHlwZSA9PSBcInN3aXRjaFwiKSByZXR1cm4gY29udChwdXNobGV4KFwiZm9ybVwiKSwgcGFyZW5FeHByLCBleHBlY3QoXCJ7XCIpLCBwdXNobGV4KFwifVwiLCBcInN3aXRjaFwiKSwgcHVzaGJsb2NrY29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2ssIHBvcGxleCwgcG9wbGV4LCBwb3Bjb250ZXh0KTtcbiAgICBpZiAodHlwZSA9PSBcImNhc2VcIikgcmV0dXJuIGNvbnQoZXhwcmVzc2lvbiwgZXhwZWN0KFwiOlwiKSk7XG4gICAgaWYgKHR5cGUgPT0gXCJkZWZhdWx0XCIpIHJldHVybiBjb250KGV4cGVjdChcIjpcIikpO1xuICAgIGlmICh0eXBlID09IFwiY2F0Y2hcIikgcmV0dXJuIGNvbnQocHVzaGxleChcImZvcm1cIiksIHB1c2hjb250ZXh0LCBtYXliZUNhdGNoQmluZGluZywgc3RhdGVtZW50LCBwb3BsZXgsIHBvcGNvbnRleHQpO1xuICAgIGlmICh0eXBlID09IFwiZXhwb3J0XCIpIHJldHVybiBjb250KHB1c2hsZXgoXCJzdGF0XCIpLCBhZnRlckV4cG9ydCwgcG9wbGV4KTtcbiAgICBpZiAodHlwZSA9PSBcImltcG9ydFwiKSByZXR1cm4gY29udChwdXNobGV4KFwic3RhdFwiKSwgYWZ0ZXJJbXBvcnQsIHBvcGxleCk7XG4gICAgaWYgKHR5cGUgPT0gXCJhc3luY1wiKSByZXR1cm4gY29udChzdGF0ZW1lbnQpXG4gICAgaWYgKHZhbHVlID09IFwiQFwiKSByZXR1cm4gY29udChleHByZXNzaW9uLCBzdGF0ZW1lbnQpXG4gICAgcmV0dXJuIHBhc3MocHVzaGxleChcInN0YXRcIiksIGV4cHJlc3Npb24sIGV4cGVjdChcIjtcIiksIHBvcGxleCk7XG4gIH1cbiAgZnVuY3Rpb24gbWF5YmVDYXRjaEJpbmRpbmcodHlwZSkge1xuICAgIGlmICh0eXBlID09IFwiKFwiKSByZXR1cm4gY29udChmdW5hcmcsIGV4cGVjdChcIilcIikpXG4gIH1cbiAgZnVuY3Rpb24gZXhwcmVzc2lvbih0eXBlLCB2YWx1ZSkge1xuICAgIHJldHVybiBleHByZXNzaW9uSW5uZXIodHlwZSwgdmFsdWUsIGZhbHNlKTtcbiAgfVxuICBmdW5jdGlvbiBleHByZXNzaW9uTm9Db21tYSh0eXBlLCB2YWx1ZSkge1xuICAgIHJldHVybiBleHByZXNzaW9uSW5uZXIodHlwZSwgdmFsdWUsIHRydWUpO1xuICB9XG4gIGZ1bmN0aW9uIHBhcmVuRXhwcih0eXBlKSB7XG4gICAgaWYgKHR5cGUgIT0gXCIoXCIpIHJldHVybiBwYXNzKClcbiAgICByZXR1cm4gY29udChwdXNobGV4KFwiKVwiKSwgbWF5YmVleHByZXNzaW9uLCBleHBlY3QoXCIpXCIpLCBwb3BsZXgpXG4gIH1cbiAgZnVuY3Rpb24gZXhwcmVzc2lvbklubmVyKHR5cGUsIHZhbHVlLCBub0NvbW1hKSB7XG4gICAgaWYgKGN4LnN0YXRlLmZhdEFycm93QXQgPT0gY3guc3RyZWFtLnN0YXJ0KSB7XG4gICAgICB2YXIgYm9keSA9IG5vQ29tbWEgPyBhcnJvd0JvZHlOb0NvbW1hIDogYXJyb3dCb2R5O1xuICAgICAgaWYgKHR5cGUgPT0gXCIoXCIpIHJldHVybiBjb250KHB1c2hjb250ZXh0LCBwdXNobGV4KFwiKVwiKSwgY29tbWFzZXAoZnVuYXJnLCBcIilcIiksIHBvcGxleCwgZXhwZWN0KFwiPT5cIiksIGJvZHksIHBvcGNvbnRleHQpO1xuICAgICAgZWxzZSBpZiAodHlwZSA9PSBcInZhcmlhYmxlXCIpIHJldHVybiBwYXNzKHB1c2hjb250ZXh0LCBwYXR0ZXJuLCBleHBlY3QoXCI9PlwiKSwgYm9keSwgcG9wY29udGV4dCk7XG4gICAgfVxuXG4gICAgdmFyIG1heWJlb3AgPSBub0NvbW1hID8gbWF5YmVvcGVyYXRvck5vQ29tbWEgOiBtYXliZW9wZXJhdG9yQ29tbWE7XG4gICAgaWYgKGF0b21pY1R5cGVzLmhhc093blByb3BlcnR5KHR5cGUpKSByZXR1cm4gY29udChtYXliZW9wKTtcbiAgICBpZiAodHlwZSA9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBjb250KGZ1bmN0aW9uZGVmLCBtYXliZW9wKTtcbiAgICBpZiAodHlwZSA9PSBcImNsYXNzXCIgfHwgKGlzVFMgJiYgdmFsdWUgPT0gXCJpbnRlcmZhY2VcIikpIHsgY3gubWFya2VkID0gXCJrZXl3b3JkXCI7IHJldHVybiBjb250KHB1c2hsZXgoXCJmb3JtXCIpLCBjbGFzc0V4cHJlc3Npb24sIHBvcGxleCk7IH1cbiAgICBpZiAodHlwZSA9PSBcImtleXdvcmQgY1wiIHx8IHR5cGUgPT0gXCJhc3luY1wiKSByZXR1cm4gY29udChub0NvbW1hID8gZXhwcmVzc2lvbk5vQ29tbWEgOiBleHByZXNzaW9uKTtcbiAgICBpZiAodHlwZSA9PSBcIihcIikgcmV0dXJuIGNvbnQocHVzaGxleChcIilcIiksIG1heWJlZXhwcmVzc2lvbiwgZXhwZWN0KFwiKVwiKSwgcG9wbGV4LCBtYXliZW9wKTtcbiAgICBpZiAodHlwZSA9PSBcIm9wZXJhdG9yXCIgfHwgdHlwZSA9PSBcInNwcmVhZFwiKSByZXR1cm4gY29udChub0NvbW1hID8gZXhwcmVzc2lvbk5vQ29tbWEgOiBleHByZXNzaW9uKTtcbiAgICBpZiAodHlwZSA9PSBcIltcIikgcmV0dXJuIGNvbnQocHVzaGxleChcIl1cIiksIGFycmF5TGl0ZXJhbCwgcG9wbGV4LCBtYXliZW9wKTtcbiAgICBpZiAodHlwZSA9PSBcIntcIikgcmV0dXJuIGNvbnRDb21tYXNlcChvYmpwcm9wLCBcIn1cIiwgbnVsbCwgbWF5YmVvcCk7XG4gICAgaWYgKHR5cGUgPT0gXCJxdWFzaVwiKSByZXR1cm4gcGFzcyhxdWFzaSwgbWF5YmVvcCk7XG4gICAgaWYgKHR5cGUgPT0gXCJuZXdcIikgcmV0dXJuIGNvbnQobWF5YmVUYXJnZXQobm9Db21tYSkpO1xuICAgIGlmICh0eXBlID09IFwiaW1wb3J0XCIpIHJldHVybiBjb250KGV4cHJlc3Npb24pO1xuICAgIHJldHVybiBjb250KCk7XG4gIH1cbiAgZnVuY3Rpb24gbWF5YmVleHByZXNzaW9uKHR5cGUpIHtcbiAgICBpZiAodHlwZS5tYXRjaCgvWztcXH1cXClcXF0sXS8pKSByZXR1cm4gcGFzcygpO1xuICAgIHJldHVybiBwYXNzKGV4cHJlc3Npb24pO1xuICB9XG5cbiAgZnVuY3Rpb24gbWF5YmVvcGVyYXRvckNvbW1hKHR5cGUsIHZhbHVlKSB7XG4gICAgaWYgKHR5cGUgPT0gXCIsXCIpIHJldHVybiBjb250KG1heWJlZXhwcmVzc2lvbik7XG4gICAgcmV0dXJuIG1heWJlb3BlcmF0b3JOb0NvbW1hKHR5cGUsIHZhbHVlLCBmYWxzZSk7XG4gIH1cbiAgZnVuY3Rpb24gbWF5YmVvcGVyYXRvck5vQ29tbWEodHlwZSwgdmFsdWUsIG5vQ29tbWEpIHtcbiAgICB2YXIgbWUgPSBub0NvbW1hID09IGZhbHNlID8gbWF5YmVvcGVyYXRvckNvbW1hIDogbWF5YmVvcGVyYXRvck5vQ29tbWE7XG4gICAgdmFyIGV4cHIgPSBub0NvbW1hID09IGZhbHNlID8gZXhwcmVzc2lvbiA6IGV4cHJlc3Npb25Ob0NvbW1hO1xuICAgIGlmICh0eXBlID09IFwiPT5cIikgcmV0dXJuIGNvbnQocHVzaGNvbnRleHQsIG5vQ29tbWEgPyBhcnJvd0JvZHlOb0NvbW1hIDogYXJyb3dCb2R5LCBwb3Bjb250ZXh0KTtcbiAgICBpZiAodHlwZSA9PSBcIm9wZXJhdG9yXCIpIHtcbiAgICAgIGlmICgvXFwrXFwrfC0tLy50ZXN0KHZhbHVlKSB8fCBpc1RTICYmIHZhbHVlID09IFwiIVwiKSByZXR1cm4gY29udChtZSk7XG4gICAgICBpZiAoaXNUUyAmJiB2YWx1ZSA9PSBcIjxcIiAmJiBjeC5zdHJlYW0ubWF0Y2goL14oW148Pl18PFtePD5dKj4pKj5cXHMqXFwoLywgZmFsc2UpKVxuICAgICAgICByZXR1cm4gY29udChwdXNobGV4KFwiPlwiKSwgY29tbWFzZXAodHlwZWV4cHIsIFwiPlwiKSwgcG9wbGV4LCBtZSk7XG4gICAgICBpZiAodmFsdWUgPT0gXCI/XCIpIHJldHVybiBjb250KGV4cHJlc3Npb24sIGV4cGVjdChcIjpcIiksIGV4cHIpO1xuICAgICAgcmV0dXJuIGNvbnQoZXhwcik7XG4gICAgfVxuICAgIGlmICh0eXBlID09IFwicXVhc2lcIikgeyByZXR1cm4gcGFzcyhxdWFzaSwgbWUpOyB9XG4gICAgaWYgKHR5cGUgPT0gXCI7XCIpIHJldHVybjtcbiAgICBpZiAodHlwZSA9PSBcIihcIikgcmV0dXJuIGNvbnRDb21tYXNlcChleHByZXNzaW9uTm9Db21tYSwgXCIpXCIsIFwiY2FsbFwiLCBtZSk7XG4gICAgaWYgKHR5cGUgPT0gXCIuXCIpIHJldHVybiBjb250KHByb3BlcnR5LCBtZSk7XG4gICAgaWYgKHR5cGUgPT0gXCJbXCIpIHJldHVybiBjb250KHB1c2hsZXgoXCJdXCIpLCBtYXliZWV4cHJlc3Npb24sIGV4cGVjdChcIl1cIiksIHBvcGxleCwgbWUpO1xuICAgIGlmIChpc1RTICYmIHZhbHVlID09IFwiYXNcIikgeyBjeC5tYXJrZWQgPSBcImtleXdvcmRcIjsgcmV0dXJuIGNvbnQodHlwZWV4cHIsIG1lKSB9XG4gICAgaWYgKHR5cGUgPT0gXCJyZWdleHBcIikge1xuICAgICAgY3guc3RhdGUubGFzdFR5cGUgPSBjeC5tYXJrZWQgPSBcIm9wZXJhdG9yXCJcbiAgICAgIGN4LnN0cmVhbS5iYWNrVXAoY3guc3RyZWFtLnBvcyAtIGN4LnN0cmVhbS5zdGFydCAtIDEpXG4gICAgICByZXR1cm4gY29udChleHByKVxuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBxdWFzaSh0eXBlLCB2YWx1ZSkge1xuICAgIGlmICh0eXBlICE9IFwicXVhc2lcIikgcmV0dXJuIHBhc3MoKTtcbiAgICBpZiAodmFsdWUuc2xpY2UodmFsdWUubGVuZ3RoIC0gMikgIT0gXCIke1wiKSByZXR1cm4gY29udChxdWFzaSk7XG4gICAgcmV0dXJuIGNvbnQoZXhwcmVzc2lvbiwgY29udGludWVRdWFzaSk7XG4gIH1cbiAgZnVuY3Rpb24gY29udGludWVRdWFzaSh0eXBlKSB7XG4gICAgaWYgKHR5cGUgPT0gXCJ9XCIpIHtcbiAgICAgIGN4Lm1hcmtlZCA9IFwic3RyaW5nLTJcIjtcbiAgICAgIGN4LnN0YXRlLnRva2VuaXplID0gdG9rZW5RdWFzaTtcbiAgICAgIHJldHVybiBjb250KHF1YXNpKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gYXJyb3dCb2R5KHR5cGUpIHtcbiAgICBmaW5kRmF0QXJyb3coY3guc3RyZWFtLCBjeC5zdGF0ZSk7XG4gICAgcmV0dXJuIHBhc3ModHlwZSA9PSBcIntcIiA/IHN0YXRlbWVudCA6IGV4cHJlc3Npb24pO1xuICB9XG4gIGZ1bmN0aW9uIGFycm93Qm9keU5vQ29tbWEodHlwZSkge1xuICAgIGZpbmRGYXRBcnJvdyhjeC5zdHJlYW0sIGN4LnN0YXRlKTtcbiAgICByZXR1cm4gcGFzcyh0eXBlID09IFwie1wiID8gc3RhdGVtZW50IDogZXhwcmVzc2lvbk5vQ29tbWEpO1xuICB9XG4gIGZ1bmN0aW9uIG1heWJlVGFyZ2V0KG5vQ29tbWEpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24odHlwZSkge1xuICAgICAgaWYgKHR5cGUgPT0gXCIuXCIpIHJldHVybiBjb250KG5vQ29tbWEgPyB0YXJnZXROb0NvbW1hIDogdGFyZ2V0KTtcbiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gXCJ2YXJpYWJsZVwiICYmIGlzVFMpIHJldHVybiBjb250KG1heWJlVHlwZUFyZ3MsIG5vQ29tbWEgPyBtYXliZW9wZXJhdG9yTm9Db21tYSA6IG1heWJlb3BlcmF0b3JDb21tYSlcbiAgICAgIGVsc2UgcmV0dXJuIHBhc3Mobm9Db21tYSA/IGV4cHJlc3Npb25Ob0NvbW1hIDogZXhwcmVzc2lvbik7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiB0YXJnZXQoXywgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gXCJ0YXJnZXRcIikgeyBjeC5tYXJrZWQgPSBcImtleXdvcmRcIjsgcmV0dXJuIGNvbnQobWF5YmVvcGVyYXRvckNvbW1hKTsgfVxuICB9XG4gIGZ1bmN0aW9uIHRhcmdldE5vQ29tbWEoXywgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gXCJ0YXJnZXRcIikgeyBjeC5tYXJrZWQgPSBcImtleXdvcmRcIjsgcmV0dXJuIGNvbnQobWF5YmVvcGVyYXRvck5vQ29tbWEpOyB9XG4gIH1cbiAgZnVuY3Rpb24gbWF5YmVsYWJlbCh0eXBlKSB7XG4gICAgaWYgKHR5cGUgPT0gXCI6XCIpIHJldHVybiBjb250KHBvcGxleCwgc3RhdGVtZW50KTtcbiAgICByZXR1cm4gcGFzcyhtYXliZW9wZXJhdG9yQ29tbWEsIGV4cGVjdChcIjtcIiksIHBvcGxleCk7XG4gIH1cbiAgZnVuY3Rpb24gcHJvcGVydHkodHlwZSkge1xuICAgIGlmICh0eXBlID09IFwidmFyaWFibGVcIikge2N4Lm1hcmtlZCA9IFwicHJvcGVydHlcIjsgcmV0dXJuIGNvbnQoKTt9XG4gIH1cbiAgZnVuY3Rpb24gb2JqcHJvcCh0eXBlLCB2YWx1ZSkge1xuICAgIGlmICh0eXBlID09IFwiYXN5bmNcIikge1xuICAgICAgY3gubWFya2VkID0gXCJwcm9wZXJ0eVwiO1xuICAgICAgcmV0dXJuIGNvbnQob2JqcHJvcCk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09IFwidmFyaWFibGVcIiB8fCBjeC5zdHlsZSA9PSBcImtleXdvcmRcIikge1xuICAgICAgY3gubWFya2VkID0gXCJwcm9wZXJ0eVwiO1xuICAgICAgaWYgKHZhbHVlID09IFwiZ2V0XCIgfHwgdmFsdWUgPT0gXCJzZXRcIikgcmV0dXJuIGNvbnQoZ2V0dGVyU2V0dGVyKTtcbiAgICAgIHZhciBtIC8vIFdvcmsgYXJvdW5kIGZhdC1hcnJvdy1kZXRlY3Rpb24gY29tcGxpY2F0aW9uIGZvciBkZXRlY3RpbmcgdHlwZXNjcmlwdCB0eXBlZCBhcnJvdyBwYXJhbXNcbiAgICAgIGlmIChpc1RTICYmIGN4LnN0YXRlLmZhdEFycm93QXQgPT0gY3guc3RyZWFtLnN0YXJ0ICYmIChtID0gY3guc3RyZWFtLm1hdGNoKC9eXFxzKjpcXHMqLywgZmFsc2UpKSlcbiAgICAgICAgY3guc3RhdGUuZmF0QXJyb3dBdCA9IGN4LnN0cmVhbS5wb3MgKyBtWzBdLmxlbmd0aFxuICAgICAgcmV0dXJuIGNvbnQoYWZ0ZXJwcm9wKTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCJudW1iZXJcIiB8fCB0eXBlID09IFwic3RyaW5nXCIpIHtcbiAgICAgIGN4Lm1hcmtlZCA9IGpzb25sZE1vZGUgPyBcInByb3BlcnR5XCIgOiAoY3guc3R5bGUgKyBcIiBwcm9wZXJ0eVwiKTtcbiAgICAgIHJldHVybiBjb250KGFmdGVycHJvcCk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09IFwianNvbmxkLWtleXdvcmRcIikge1xuICAgICAgcmV0dXJuIGNvbnQoYWZ0ZXJwcm9wKTtcbiAgICB9IGVsc2UgaWYgKGlzVFMgJiYgaXNNb2RpZmllcih2YWx1ZSkpIHtcbiAgICAgIGN4Lm1hcmtlZCA9IFwia2V5d29yZFwiXG4gICAgICByZXR1cm4gY29udChvYmpwcm9wKVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcIltcIikge1xuICAgICAgcmV0dXJuIGNvbnQoZXhwcmVzc2lvbiwgbWF5YmV0eXBlLCBleHBlY3QoXCJdXCIpLCBhZnRlcnByb3ApO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcInNwcmVhZFwiKSB7XG4gICAgICByZXR1cm4gY29udChleHByZXNzaW9uTm9Db21tYSwgYWZ0ZXJwcm9wKTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlID09IFwiKlwiKSB7XG4gICAgICBjeC5tYXJrZWQgPSBcImtleXdvcmRcIjtcbiAgICAgIHJldHVybiBjb250KG9ianByb3ApO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcIjpcIikge1xuICAgICAgcmV0dXJuIHBhc3MoYWZ0ZXJwcm9wKVxuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBnZXR0ZXJTZXR0ZXIodHlwZSkge1xuICAgIGlmICh0eXBlICE9IFwidmFyaWFibGVcIikgcmV0dXJuIHBhc3MoYWZ0ZXJwcm9wKTtcbiAgICBjeC5tYXJrZWQgPSBcInByb3BlcnR5XCI7XG4gICAgcmV0dXJuIGNvbnQoZnVuY3Rpb25kZWYpO1xuICB9XG4gIGZ1bmN0aW9uIGFmdGVycHJvcCh0eXBlKSB7XG4gICAgaWYgKHR5cGUgPT0gXCI6XCIpIHJldHVybiBjb250KGV4cHJlc3Npb25Ob0NvbW1hKTtcbiAgICBpZiAodHlwZSA9PSBcIihcIikgcmV0dXJuIHBhc3MoZnVuY3Rpb25kZWYpO1xuICB9XG4gIGZ1bmN0aW9uIGNvbW1hc2VwKHdoYXQsIGVuZCwgc2VwKSB7XG4gICAgZnVuY3Rpb24gcHJvY2VlZCh0eXBlLCB2YWx1ZSkge1xuICAgICAgaWYgKHNlcCA/IHNlcC5pbmRleE9mKHR5cGUpID4gLTEgOiB0eXBlID09IFwiLFwiKSB7XG4gICAgICAgIHZhciBsZXggPSBjeC5zdGF0ZS5sZXhpY2FsO1xuICAgICAgICBpZiAobGV4LmluZm8gPT0gXCJjYWxsXCIpIGxleC5wb3MgPSAobGV4LnBvcyB8fCAwKSArIDE7XG4gICAgICAgIHJldHVybiBjb250KGZ1bmN0aW9uKHR5cGUsIHZhbHVlKSB7XG4gICAgICAgICAgaWYgKHR5cGUgPT0gZW5kIHx8IHZhbHVlID09IGVuZCkgcmV0dXJuIHBhc3MoKVxuICAgICAgICAgIHJldHVybiBwYXNzKHdoYXQpXG4gICAgICAgIH0sIHByb2NlZWQpO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGUgPT0gZW5kIHx8IHZhbHVlID09IGVuZCkgcmV0dXJuIGNvbnQoKTtcbiAgICAgIGlmIChzZXAgJiYgc2VwLmluZGV4T2YoXCI7XCIpID4gLTEpIHJldHVybiBwYXNzKHdoYXQpXG4gICAgICByZXR1cm4gY29udChleHBlY3QoZW5kKSk7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbih0eXBlLCB2YWx1ZSkge1xuICAgICAgaWYgKHR5cGUgPT0gZW5kIHx8IHZhbHVlID09IGVuZCkgcmV0dXJuIGNvbnQoKTtcbiAgICAgIHJldHVybiBwYXNzKHdoYXQsIHByb2NlZWQpO1xuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gY29udENvbW1hc2VwKHdoYXQsIGVuZCwgaW5mbykge1xuICAgIGZvciAodmFyIGkgPSAzOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxuICAgICAgY3guY2MucHVzaChhcmd1bWVudHNbaV0pO1xuICAgIHJldHVybiBjb250KHB1c2hsZXgoZW5kLCBpbmZvKSwgY29tbWFzZXAod2hhdCwgZW5kKSwgcG9wbGV4KTtcbiAgfVxuICBmdW5jdGlvbiBibG9jayh0eXBlKSB7XG4gICAgaWYgKHR5cGUgPT0gXCJ9XCIpIHJldHVybiBjb250KCk7XG4gICAgcmV0dXJuIHBhc3Moc3RhdGVtZW50LCBibG9jayk7XG4gIH1cbiAgZnVuY3Rpb24gbWF5YmV0eXBlKHR5cGUsIHZhbHVlKSB7XG4gICAgaWYgKGlzVFMpIHtcbiAgICAgIGlmICh0eXBlID09IFwiOlwiKSByZXR1cm4gY29udCh0eXBlZXhwcik7XG4gICAgICBpZiAodmFsdWUgPT0gXCI/XCIpIHJldHVybiBjb250KG1heWJldHlwZSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIG1heWJldHlwZU9ySW4odHlwZSwgdmFsdWUpIHtcbiAgICBpZiAoaXNUUyAmJiAodHlwZSA9PSBcIjpcIiB8fCB2YWx1ZSA9PSBcImluXCIpKSByZXR1cm4gY29udCh0eXBlZXhwcilcbiAgfVxuICBmdW5jdGlvbiBtYXliZXJldHR5cGUodHlwZSkge1xuICAgIGlmIChpc1RTICYmIHR5cGUgPT0gXCI6XCIpIHtcbiAgICAgIGlmIChjeC5zdHJlYW0ubWF0Y2goL15cXHMqXFx3K1xccytpc1xcYi8sIGZhbHNlKSkgcmV0dXJuIGNvbnQoZXhwcmVzc2lvbiwgaXNLVywgdHlwZWV4cHIpXG4gICAgICBlbHNlIHJldHVybiBjb250KHR5cGVleHByKVxuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBpc0tXKF8sIHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09IFwiaXNcIikge1xuICAgICAgY3gubWFya2VkID0gXCJrZXl3b3JkXCJcbiAgICAgIHJldHVybiBjb250KClcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gdHlwZWV4cHIodHlwZSwgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gXCJrZXlvZlwiIHx8IHZhbHVlID09IFwidHlwZW9mXCIgfHwgdmFsdWUgPT0gXCJpbmZlclwiKSB7XG4gICAgICBjeC5tYXJrZWQgPSBcImtleXdvcmRcIlxuICAgICAgcmV0dXJuIGNvbnQodmFsdWUgPT0gXCJ0eXBlb2ZcIiA/IGV4cHJlc3Npb25Ob0NvbW1hIDogdHlwZWV4cHIpXG4gICAgfVxuICAgIGlmICh0eXBlID09IFwidmFyaWFibGVcIiB8fCB2YWx1ZSA9PSBcInZvaWRcIikge1xuICAgICAgY3gubWFya2VkID0gXCJ0eXBlXCJcbiAgICAgIHJldHVybiBjb250KGFmdGVyVHlwZSlcbiAgICB9XG4gICAgaWYgKHZhbHVlID09IFwifFwiIHx8IHZhbHVlID09IFwiJlwiKSByZXR1cm4gY29udCh0eXBlZXhwcilcbiAgICBpZiAodHlwZSA9PSBcInN0cmluZ1wiIHx8IHR5cGUgPT0gXCJudW1iZXJcIiB8fCB0eXBlID09IFwiYXRvbVwiKSByZXR1cm4gY29udChhZnRlclR5cGUpO1xuICAgIGlmICh0eXBlID09IFwiW1wiKSByZXR1cm4gY29udChwdXNobGV4KFwiXVwiKSwgY29tbWFzZXAodHlwZWV4cHIsIFwiXVwiLCBcIixcIiksIHBvcGxleCwgYWZ0ZXJUeXBlKVxuICAgIGlmICh0eXBlID09IFwie1wiKSByZXR1cm4gY29udChwdXNobGV4KFwifVwiKSwgY29tbWFzZXAodHlwZXByb3AsIFwifVwiLCBcIiw7XCIpLCBwb3BsZXgsIGFmdGVyVHlwZSlcbiAgICBpZiAodHlwZSA9PSBcIihcIikgcmV0dXJuIGNvbnQoY29tbWFzZXAodHlwZWFyZywgXCIpXCIpLCBtYXliZVJldHVyblR5cGUsIGFmdGVyVHlwZSlcbiAgICBpZiAodHlwZSA9PSBcIjxcIikgcmV0dXJuIGNvbnQoY29tbWFzZXAodHlwZWV4cHIsIFwiPlwiKSwgdHlwZWV4cHIpXG4gIH1cbiAgZnVuY3Rpb24gbWF5YmVSZXR1cm5UeXBlKHR5cGUpIHtcbiAgICBpZiAodHlwZSA9PSBcIj0+XCIpIHJldHVybiBjb250KHR5cGVleHByKVxuICB9XG4gIGZ1bmN0aW9uIHR5cGVwcm9wKHR5cGUsIHZhbHVlKSB7XG4gICAgaWYgKHR5cGUgPT0gXCJ2YXJpYWJsZVwiIHx8IGN4LnN0eWxlID09IFwia2V5d29yZFwiKSB7XG4gICAgICBjeC5tYXJrZWQgPSBcInByb3BlcnR5XCJcbiAgICAgIHJldHVybiBjb250KHR5cGVwcm9wKVxuICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gXCI/XCIgfHwgdHlwZSA9PSBcIm51bWJlclwiIHx8IHR5cGUgPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIGNvbnQodHlwZXByb3ApXG4gICAgfSBlbHNlIGlmICh0eXBlID09IFwiOlwiKSB7XG4gICAgICByZXR1cm4gY29udCh0eXBlZXhwcilcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCJbXCIpIHtcbiAgICAgIHJldHVybiBjb250KGV4cGVjdChcInZhcmlhYmxlXCIpLCBtYXliZXR5cGVPckluLCBleHBlY3QoXCJdXCIpLCB0eXBlcHJvcClcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCIoXCIpIHtcbiAgICAgIHJldHVybiBwYXNzKGZ1bmN0aW9uZGVjbCwgdHlwZXByb3ApXG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHR5cGVhcmcodHlwZSwgdmFsdWUpIHtcbiAgICBpZiAodHlwZSA9PSBcInZhcmlhYmxlXCIgJiYgY3guc3RyZWFtLm1hdGNoKC9eXFxzKls/Ol0vLCBmYWxzZSkgfHwgdmFsdWUgPT0gXCI/XCIpIHJldHVybiBjb250KHR5cGVhcmcpXG4gICAgaWYgKHR5cGUgPT0gXCI6XCIpIHJldHVybiBjb250KHR5cGVleHByKVxuICAgIGlmICh0eXBlID09IFwic3ByZWFkXCIpIHJldHVybiBjb250KHR5cGVhcmcpXG4gICAgcmV0dXJuIHBhc3ModHlwZWV4cHIpXG4gIH1cbiAgZnVuY3Rpb24gYWZ0ZXJUeXBlKHR5cGUsIHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09IFwiPFwiKSByZXR1cm4gY29udChwdXNobGV4KFwiPlwiKSwgY29tbWFzZXAodHlwZWV4cHIsIFwiPlwiKSwgcG9wbGV4LCBhZnRlclR5cGUpXG4gICAgaWYgKHZhbHVlID09IFwifFwiIHx8IHR5cGUgPT0gXCIuXCIgfHwgdmFsdWUgPT0gXCImXCIpIHJldHVybiBjb250KHR5cGVleHByKVxuICAgIGlmICh0eXBlID09IFwiW1wiKSByZXR1cm4gY29udCh0eXBlZXhwciwgZXhwZWN0KFwiXVwiKSwgYWZ0ZXJUeXBlKVxuICAgIGlmICh2YWx1ZSA9PSBcImV4dGVuZHNcIiB8fCB2YWx1ZSA9PSBcImltcGxlbWVudHNcIikgeyBjeC5tYXJrZWQgPSBcImtleXdvcmRcIjsgcmV0dXJuIGNvbnQodHlwZWV4cHIpIH1cbiAgICBpZiAodmFsdWUgPT0gXCI/XCIpIHJldHVybiBjb250KHR5cGVleHByLCBleHBlY3QoXCI6XCIpLCB0eXBlZXhwcilcbiAgfVxuICBmdW5jdGlvbiBtYXliZVR5cGVBcmdzKF8sIHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09IFwiPFwiKSByZXR1cm4gY29udChwdXNobGV4KFwiPlwiKSwgY29tbWFzZXAodHlwZWV4cHIsIFwiPlwiKSwgcG9wbGV4LCBhZnRlclR5cGUpXG4gIH1cbiAgZnVuY3Rpb24gdHlwZXBhcmFtKCkge1xuICAgIHJldHVybiBwYXNzKHR5cGVleHByLCBtYXliZVR5cGVEZWZhdWx0KVxuICB9XG4gIGZ1bmN0aW9uIG1heWJlVHlwZURlZmF1bHQoXywgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gXCI9XCIpIHJldHVybiBjb250KHR5cGVleHByKVxuICB9XG4gIGZ1bmN0aW9uIHZhcmRlZihfLCB2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PSBcImVudW1cIikge2N4Lm1hcmtlZCA9IFwia2V5d29yZFwiOyByZXR1cm4gY29udChlbnVtZGVmKX1cbiAgICByZXR1cm4gcGFzcyhwYXR0ZXJuLCBtYXliZXR5cGUsIG1heWJlQXNzaWduLCB2YXJkZWZDb250KTtcbiAgfVxuICBmdW5jdGlvbiBwYXR0ZXJuKHR5cGUsIHZhbHVlKSB7XG4gICAgaWYgKGlzVFMgJiYgaXNNb2RpZmllcih2YWx1ZSkpIHsgY3gubWFya2VkID0gXCJrZXl3b3JkXCI7IHJldHVybiBjb250KHBhdHRlcm4pIH1cbiAgICBpZiAodHlwZSA9PSBcInZhcmlhYmxlXCIpIHsgcmVnaXN0ZXIodmFsdWUpOyByZXR1cm4gY29udCgpOyB9XG4gICAgaWYgKHR5cGUgPT0gXCJzcHJlYWRcIikgcmV0dXJuIGNvbnQocGF0dGVybik7XG4gICAgaWYgKHR5cGUgPT0gXCJbXCIpIHJldHVybiBjb250Q29tbWFzZXAoZWx0cGF0dGVybiwgXCJdXCIpO1xuICAgIGlmICh0eXBlID09IFwie1wiKSByZXR1cm4gY29udENvbW1hc2VwKHByb3BwYXR0ZXJuLCBcIn1cIik7XG4gIH1cbiAgZnVuY3Rpb24gcHJvcHBhdHRlcm4odHlwZSwgdmFsdWUpIHtcbiAgICBpZiAodHlwZSA9PSBcInZhcmlhYmxlXCIgJiYgIWN4LnN0cmVhbS5tYXRjaCgvXlxccyo6LywgZmFsc2UpKSB7XG4gICAgICByZWdpc3Rlcih2YWx1ZSk7XG4gICAgICByZXR1cm4gY29udChtYXliZUFzc2lnbik7XG4gICAgfVxuICAgIGlmICh0eXBlID09IFwidmFyaWFibGVcIikgY3gubWFya2VkID0gXCJwcm9wZXJ0eVwiO1xuICAgIGlmICh0eXBlID09IFwic3ByZWFkXCIpIHJldHVybiBjb250KHBhdHRlcm4pO1xuICAgIGlmICh0eXBlID09IFwifVwiKSByZXR1cm4gcGFzcygpO1xuICAgIGlmICh0eXBlID09IFwiW1wiKSByZXR1cm4gY29udChleHByZXNzaW9uLCBleHBlY3QoJ10nKSwgZXhwZWN0KCc6JyksIHByb3BwYXR0ZXJuKTtcbiAgICByZXR1cm4gY29udChleHBlY3QoXCI6XCIpLCBwYXR0ZXJuLCBtYXliZUFzc2lnbik7XG4gIH1cbiAgZnVuY3Rpb24gZWx0cGF0dGVybigpIHtcbiAgICByZXR1cm4gcGFzcyhwYXR0ZXJuLCBtYXliZUFzc2lnbilcbiAgfVxuICBmdW5jdGlvbiBtYXliZUFzc2lnbihfdHlwZSwgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gXCI9XCIpIHJldHVybiBjb250KGV4cHJlc3Npb25Ob0NvbW1hKTtcbiAgfVxuICBmdW5jdGlvbiB2YXJkZWZDb250KHR5cGUpIHtcbiAgICBpZiAodHlwZSA9PSBcIixcIikgcmV0dXJuIGNvbnQodmFyZGVmKTtcbiAgfVxuICBmdW5jdGlvbiBtYXliZWVsc2UodHlwZSwgdmFsdWUpIHtcbiAgICBpZiAodHlwZSA9PSBcImtleXdvcmQgYlwiICYmIHZhbHVlID09IFwiZWxzZVwiKSByZXR1cm4gY29udChwdXNobGV4KFwiZm9ybVwiLCBcImVsc2VcIiksIHN0YXRlbWVudCwgcG9wbGV4KTtcbiAgfVxuICBmdW5jdGlvbiBmb3JzcGVjKHR5cGUsIHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09IFwiYXdhaXRcIikgcmV0dXJuIGNvbnQoZm9yc3BlYyk7XG4gICAgaWYgKHR5cGUgPT0gXCIoXCIpIHJldHVybiBjb250KHB1c2hsZXgoXCIpXCIpLCBmb3JzcGVjMSwgcG9wbGV4KTtcbiAgfVxuICBmdW5jdGlvbiBmb3JzcGVjMSh0eXBlKSB7XG4gICAgaWYgKHR5cGUgPT0gXCJ2YXJcIikgcmV0dXJuIGNvbnQodmFyZGVmLCBmb3JzcGVjMik7XG4gICAgaWYgKHR5cGUgPT0gXCJ2YXJpYWJsZVwiKSByZXR1cm4gY29udChmb3JzcGVjMik7XG4gICAgcmV0dXJuIHBhc3MoZm9yc3BlYzIpXG4gIH1cbiAgZnVuY3Rpb24gZm9yc3BlYzIodHlwZSwgdmFsdWUpIHtcbiAgICBpZiAodHlwZSA9PSBcIilcIikgcmV0dXJuIGNvbnQoKVxuICAgIGlmICh0eXBlID09IFwiO1wiKSByZXR1cm4gY29udChmb3JzcGVjMilcbiAgICBpZiAodmFsdWUgPT0gXCJpblwiIHx8IHZhbHVlID09IFwib2ZcIikgeyBjeC5tYXJrZWQgPSBcImtleXdvcmRcIjsgcmV0dXJuIGNvbnQoZXhwcmVzc2lvbiwgZm9yc3BlYzIpIH1cbiAgICByZXR1cm4gcGFzcyhleHByZXNzaW9uLCBmb3JzcGVjMilcbiAgfVxuICBmdW5jdGlvbiBmdW5jdGlvbmRlZih0eXBlLCB2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PSBcIipcIikge2N4Lm1hcmtlZCA9IFwia2V5d29yZFwiOyByZXR1cm4gY29udChmdW5jdGlvbmRlZik7fVxuICAgIGlmICh0eXBlID09IFwidmFyaWFibGVcIikge3JlZ2lzdGVyKHZhbHVlKTsgcmV0dXJuIGNvbnQoZnVuY3Rpb25kZWYpO31cbiAgICBpZiAodHlwZSA9PSBcIihcIikgcmV0dXJuIGNvbnQocHVzaGNvbnRleHQsIHB1c2hsZXgoXCIpXCIpLCBjb21tYXNlcChmdW5hcmcsIFwiKVwiKSwgcG9wbGV4LCBtYXliZXJldHR5cGUsIHN0YXRlbWVudCwgcG9wY29udGV4dCk7XG4gICAgaWYgKGlzVFMgJiYgdmFsdWUgPT0gXCI8XCIpIHJldHVybiBjb250KHB1c2hsZXgoXCI+XCIpLCBjb21tYXNlcCh0eXBlcGFyYW0sIFwiPlwiKSwgcG9wbGV4LCBmdW5jdGlvbmRlZilcbiAgfVxuICBmdW5jdGlvbiBmdW5jdGlvbmRlY2wodHlwZSwgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gXCIqXCIpIHtjeC5tYXJrZWQgPSBcImtleXdvcmRcIjsgcmV0dXJuIGNvbnQoZnVuY3Rpb25kZWNsKTt9XG4gICAgaWYgKHR5cGUgPT0gXCJ2YXJpYWJsZVwiKSB7cmVnaXN0ZXIodmFsdWUpOyByZXR1cm4gY29udChmdW5jdGlvbmRlY2wpO31cbiAgICBpZiAodHlwZSA9PSBcIihcIikgcmV0dXJuIGNvbnQocHVzaGNvbnRleHQsIHB1c2hsZXgoXCIpXCIpLCBjb21tYXNlcChmdW5hcmcsIFwiKVwiKSwgcG9wbGV4LCBtYXliZXJldHR5cGUsIHBvcGNvbnRleHQpO1xuICAgIGlmIChpc1RTICYmIHZhbHVlID09IFwiPFwiKSByZXR1cm4gY29udChwdXNobGV4KFwiPlwiKSwgY29tbWFzZXAodHlwZXBhcmFtLCBcIj5cIiksIHBvcGxleCwgZnVuY3Rpb25kZWNsKVxuICB9XG4gIGZ1bmN0aW9uIHR5cGVuYW1lKHR5cGUsIHZhbHVlKSB7XG4gICAgaWYgKHR5cGUgPT0gXCJrZXl3b3JkXCIgfHwgdHlwZSA9PSBcInZhcmlhYmxlXCIpIHtcbiAgICAgIGN4Lm1hcmtlZCA9IFwidHlwZVwiXG4gICAgICByZXR1cm4gY29udCh0eXBlbmFtZSlcbiAgICB9IGVsc2UgaWYgKHZhbHVlID09IFwiPFwiKSB7XG4gICAgICByZXR1cm4gY29udChwdXNobGV4KFwiPlwiKSwgY29tbWFzZXAodHlwZXBhcmFtLCBcIj5cIiksIHBvcGxleClcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZnVuYXJnKHR5cGUsIHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09IFwiQFwiKSBjb250KGV4cHJlc3Npb24sIGZ1bmFyZylcbiAgICBpZiAodHlwZSA9PSBcInNwcmVhZFwiKSByZXR1cm4gY29udChmdW5hcmcpO1xuICAgIGlmIChpc1RTICYmIGlzTW9kaWZpZXIodmFsdWUpKSB7IGN4Lm1hcmtlZCA9IFwia2V5d29yZFwiOyByZXR1cm4gY29udChmdW5hcmcpOyB9XG4gICAgaWYgKGlzVFMgJiYgdHlwZSA9PSBcInRoaXNcIikgcmV0dXJuIGNvbnQobWF5YmV0eXBlLCBtYXliZUFzc2lnbilcbiAgICByZXR1cm4gcGFzcyhwYXR0ZXJuLCBtYXliZXR5cGUsIG1heWJlQXNzaWduKTtcbiAgfVxuICBmdW5jdGlvbiBjbGFzc0V4cHJlc3Npb24odHlwZSwgdmFsdWUpIHtcbiAgICAvLyBDbGFzcyBleHByZXNzaW9ucyBtYXkgaGF2ZSBhbiBvcHRpb25hbCBuYW1lLlxuICAgIGlmICh0eXBlID09IFwidmFyaWFibGVcIikgcmV0dXJuIGNsYXNzTmFtZSh0eXBlLCB2YWx1ZSk7XG4gICAgcmV0dXJuIGNsYXNzTmFtZUFmdGVyKHR5cGUsIHZhbHVlKTtcbiAgfVxuICBmdW5jdGlvbiBjbGFzc05hbWUodHlwZSwgdmFsdWUpIHtcbiAgICBpZiAodHlwZSA9PSBcInZhcmlhYmxlXCIpIHtyZWdpc3Rlcih2YWx1ZSk7IHJldHVybiBjb250KGNsYXNzTmFtZUFmdGVyKTt9XG4gIH1cbiAgZnVuY3Rpb24gY2xhc3NOYW1lQWZ0ZXIodHlwZSwgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gXCI8XCIpIHJldHVybiBjb250KHB1c2hsZXgoXCI+XCIpLCBjb21tYXNlcCh0eXBlcGFyYW0sIFwiPlwiKSwgcG9wbGV4LCBjbGFzc05hbWVBZnRlcilcbiAgICBpZiAodmFsdWUgPT0gXCJleHRlbmRzXCIgfHwgdmFsdWUgPT0gXCJpbXBsZW1lbnRzXCIgfHwgKGlzVFMgJiYgdHlwZSA9PSBcIixcIikpIHtcbiAgICAgIGlmICh2YWx1ZSA9PSBcImltcGxlbWVudHNcIikgY3gubWFya2VkID0gXCJrZXl3b3JkXCI7XG4gICAgICByZXR1cm4gY29udChpc1RTID8gdHlwZWV4cHIgOiBleHByZXNzaW9uLCBjbGFzc05hbWVBZnRlcik7XG4gICAgfVxuICAgIGlmICh0eXBlID09IFwie1wiKSByZXR1cm4gY29udChwdXNobGV4KFwifVwiKSwgY2xhc3NCb2R5LCBwb3BsZXgpO1xuICB9XG4gIGZ1bmN0aW9uIGNsYXNzQm9keSh0eXBlLCB2YWx1ZSkge1xuICAgIGlmICh0eXBlID09IFwiYXN5bmNcIiB8fFxuICAgICAgICAodHlwZSA9PSBcInZhcmlhYmxlXCIgJiZcbiAgICAgICAgICh2YWx1ZSA9PSBcInN0YXRpY1wiIHx8IHZhbHVlID09IFwiZ2V0XCIgfHwgdmFsdWUgPT0gXCJzZXRcIiB8fCAoaXNUUyAmJiBpc01vZGlmaWVyKHZhbHVlKSkpICYmXG4gICAgICAgICBjeC5zdHJlYW0ubWF0Y2goL15cXHMrW1xcdyRcXHhhMS1cXHVmZmZmXS8sIGZhbHNlKSkpIHtcbiAgICAgIGN4Lm1hcmtlZCA9IFwia2V5d29yZFwiO1xuICAgICAgcmV0dXJuIGNvbnQoY2xhc3NCb2R5KTtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT0gXCJ2YXJpYWJsZVwiIHx8IGN4LnN0eWxlID09IFwia2V5d29yZFwiKSB7XG4gICAgICBjeC5tYXJrZWQgPSBcInByb3BlcnR5XCI7XG4gICAgICByZXR1cm4gY29udChjbGFzc2ZpZWxkLCBjbGFzc0JvZHkpO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PSBcIm51bWJlclwiIHx8IHR5cGUgPT0gXCJzdHJpbmdcIikgcmV0dXJuIGNvbnQoY2xhc3NmaWVsZCwgY2xhc3NCb2R5KTtcbiAgICBpZiAodHlwZSA9PSBcIltcIilcbiAgICAgIHJldHVybiBjb250KGV4cHJlc3Npb24sIG1heWJldHlwZSwgZXhwZWN0KFwiXVwiKSwgY2xhc3NmaWVsZCwgY2xhc3NCb2R5KVxuICAgIGlmICh2YWx1ZSA9PSBcIipcIikge1xuICAgICAgY3gubWFya2VkID0gXCJrZXl3b3JkXCI7XG4gICAgICByZXR1cm4gY29udChjbGFzc0JvZHkpO1xuICAgIH1cbiAgICBpZiAoaXNUUyAmJiB0eXBlID09IFwiKFwiKSByZXR1cm4gcGFzcyhmdW5jdGlvbmRlY2wsIGNsYXNzQm9keSlcbiAgICBpZiAodHlwZSA9PSBcIjtcIiB8fCB0eXBlID09IFwiLFwiKSByZXR1cm4gY29udChjbGFzc0JvZHkpO1xuICAgIGlmICh0eXBlID09IFwifVwiKSByZXR1cm4gY29udCgpO1xuICAgIGlmICh2YWx1ZSA9PSBcIkBcIikgcmV0dXJuIGNvbnQoZXhwcmVzc2lvbiwgY2xhc3NCb2R5KVxuICB9XG4gIGZ1bmN0aW9uIGNsYXNzZmllbGQodHlwZSwgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gXCI/XCIpIHJldHVybiBjb250KGNsYXNzZmllbGQpXG4gICAgaWYgKHR5cGUgPT0gXCI6XCIpIHJldHVybiBjb250KHR5cGVleHByLCBtYXliZUFzc2lnbilcbiAgICBpZiAodmFsdWUgPT0gXCI9XCIpIHJldHVybiBjb250KGV4cHJlc3Npb25Ob0NvbW1hKVxuICAgIHZhciBjb250ZXh0ID0gY3guc3RhdGUubGV4aWNhbC5wcmV2LCBpc0ludGVyZmFjZSA9IGNvbnRleHQgJiYgY29udGV4dC5pbmZvID09IFwiaW50ZXJmYWNlXCJcbiAgICByZXR1cm4gcGFzcyhpc0ludGVyZmFjZSA/IGZ1bmN0aW9uZGVjbCA6IGZ1bmN0aW9uZGVmKVxuICB9XG4gIGZ1bmN0aW9uIGFmdGVyRXhwb3J0KHR5cGUsIHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09IFwiKlwiKSB7IGN4Lm1hcmtlZCA9IFwia2V5d29yZFwiOyByZXR1cm4gY29udChtYXliZUZyb20sIGV4cGVjdChcIjtcIikpOyB9XG4gICAgaWYgKHZhbHVlID09IFwiZGVmYXVsdFwiKSB7IGN4Lm1hcmtlZCA9IFwia2V5d29yZFwiOyByZXR1cm4gY29udChleHByZXNzaW9uLCBleHBlY3QoXCI7XCIpKTsgfVxuICAgIGlmICh0eXBlID09IFwie1wiKSByZXR1cm4gY29udChjb21tYXNlcChleHBvcnRGaWVsZCwgXCJ9XCIpLCBtYXliZUZyb20sIGV4cGVjdChcIjtcIikpO1xuICAgIHJldHVybiBwYXNzKHN0YXRlbWVudCk7XG4gIH1cbiAgZnVuY3Rpb24gZXhwb3J0RmllbGQodHlwZSwgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gXCJhc1wiKSB7IGN4Lm1hcmtlZCA9IFwia2V5d29yZFwiOyByZXR1cm4gY29udChleHBlY3QoXCJ2YXJpYWJsZVwiKSk7IH1cbiAgICBpZiAodHlwZSA9PSBcInZhcmlhYmxlXCIpIHJldHVybiBwYXNzKGV4cHJlc3Npb25Ob0NvbW1hLCBleHBvcnRGaWVsZCk7XG4gIH1cbiAgZnVuY3Rpb24gYWZ0ZXJJbXBvcnQodHlwZSkge1xuICAgIGlmICh0eXBlID09IFwic3RyaW5nXCIpIHJldHVybiBjb250KCk7XG4gICAgaWYgKHR5cGUgPT0gXCIoXCIpIHJldHVybiBwYXNzKGV4cHJlc3Npb24pO1xuICAgIHJldHVybiBwYXNzKGltcG9ydFNwZWMsIG1heWJlTW9yZUltcG9ydHMsIG1heWJlRnJvbSk7XG4gIH1cbiAgZnVuY3Rpb24gaW1wb3J0U3BlYyh0eXBlLCB2YWx1ZSkge1xuICAgIGlmICh0eXBlID09IFwie1wiKSByZXR1cm4gY29udENvbW1hc2VwKGltcG9ydFNwZWMsIFwifVwiKTtcbiAgICBpZiAodHlwZSA9PSBcInZhcmlhYmxlXCIpIHJlZ2lzdGVyKHZhbHVlKTtcbiAgICBpZiAodmFsdWUgPT0gXCIqXCIpIGN4Lm1hcmtlZCA9IFwia2V5d29yZFwiO1xuICAgIHJldHVybiBjb250KG1heWJlQXMpO1xuICB9XG4gIGZ1bmN0aW9uIG1heWJlTW9yZUltcG9ydHModHlwZSkge1xuICAgIGlmICh0eXBlID09IFwiLFwiKSByZXR1cm4gY29udChpbXBvcnRTcGVjLCBtYXliZU1vcmVJbXBvcnRzKVxuICB9XG4gIGZ1bmN0aW9uIG1heWJlQXMoX3R5cGUsIHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09IFwiYXNcIikgeyBjeC5tYXJrZWQgPSBcImtleXdvcmRcIjsgcmV0dXJuIGNvbnQoaW1wb3J0U3BlYyk7IH1cbiAgfVxuICBmdW5jdGlvbiBtYXliZUZyb20oX3R5cGUsIHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09IFwiZnJvbVwiKSB7IGN4Lm1hcmtlZCA9IFwia2V5d29yZFwiOyByZXR1cm4gY29udChleHByZXNzaW9uKTsgfVxuICB9XG4gIGZ1bmN0aW9uIGFycmF5TGl0ZXJhbCh0eXBlKSB7XG4gICAgaWYgKHR5cGUgPT0gXCJdXCIpIHJldHVybiBjb250KCk7XG4gICAgcmV0dXJuIHBhc3MoY29tbWFzZXAoZXhwcmVzc2lvbk5vQ29tbWEsIFwiXVwiKSk7XG4gIH1cbiAgZnVuY3Rpb24gZW51bWRlZigpIHtcbiAgICByZXR1cm4gcGFzcyhwdXNobGV4KFwiZm9ybVwiKSwgcGF0dGVybiwgZXhwZWN0KFwie1wiKSwgcHVzaGxleChcIn1cIiksIGNvbW1hc2VwKGVudW1tZW1iZXIsIFwifVwiKSwgcG9wbGV4LCBwb3BsZXgpXG4gIH1cbiAgZnVuY3Rpb24gZW51bW1lbWJlcigpIHtcbiAgICByZXR1cm4gcGFzcyhwYXR0ZXJuLCBtYXliZUFzc2lnbik7XG4gIH1cblxuICBmdW5jdGlvbiBpc0NvbnRpbnVlZFN0YXRlbWVudChzdGF0ZSwgdGV4dEFmdGVyKSB7XG4gICAgcmV0dXJuIHN0YXRlLmxhc3RUeXBlID09IFwib3BlcmF0b3JcIiB8fCBzdGF0ZS5sYXN0VHlwZSA9PSBcIixcIiB8fFxuICAgICAgaXNPcGVyYXRvckNoYXIudGVzdCh0ZXh0QWZ0ZXIuY2hhckF0KDApKSB8fFxuICAgICAgL1ssLl0vLnRlc3QodGV4dEFmdGVyLmNoYXJBdCgwKSk7XG4gIH1cblxuICBmdW5jdGlvbiBleHByZXNzaW9uQWxsb3dlZChzdHJlYW0sIHN0YXRlLCBiYWNrVXApIHtcbiAgICByZXR1cm4gc3RhdGUudG9rZW5pemUgPT0gdG9rZW5CYXNlICYmXG4gICAgICAvXig/Om9wZXJhdG9yfHNvZnxrZXl3b3JkIFtiY2RdfGNhc2V8bmV3fGV4cG9ydHxkZWZhdWx0fHNwcmVhZHxbXFxbe31cXCgsOzpdfD0+KSQvLnRlc3Qoc3RhdGUubGFzdFR5cGUpIHx8XG4gICAgICAoc3RhdGUubGFzdFR5cGUgPT0gXCJxdWFzaVwiICYmIC9cXHtcXHMqJC8udGVzdChzdHJlYW0uc3RyaW5nLnNsaWNlKDAsIHN0cmVhbS5wb3MgLSAoYmFja1VwIHx8IDApKSkpXG4gIH1cblxuICAvLyBJbnRlcmZhY2VcblxuICByZXR1cm4ge1xuICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKGJhc2Vjb2x1bW4pIHtcbiAgICAgIHZhciBzdGF0ZSA9IHtcbiAgICAgICAgdG9rZW5pemU6IHRva2VuQmFzZSxcbiAgICAgICAgbGFzdFR5cGU6IFwic29mXCIsXG4gICAgICAgIGNjOiBbXSxcbiAgICAgICAgbGV4aWNhbDogbmV3IEpTTGV4aWNhbCgoYmFzZWNvbHVtbiB8fCAwKSAtIGluZGVudFVuaXQsIDAsIFwiYmxvY2tcIiwgZmFsc2UpLFxuICAgICAgICBsb2NhbFZhcnM6IHBhcnNlckNvbmZpZy5sb2NhbFZhcnMsXG4gICAgICAgIGNvbnRleHQ6IHBhcnNlckNvbmZpZy5sb2NhbFZhcnMgJiYgbmV3IENvbnRleHQobnVsbCwgbnVsbCwgZmFsc2UpLFxuICAgICAgICBpbmRlbnRlZDogYmFzZWNvbHVtbiB8fCAwXG4gICAgICB9O1xuICAgICAgaWYgKHBhcnNlckNvbmZpZy5nbG9iYWxWYXJzICYmIHR5cGVvZiBwYXJzZXJDb25maWcuZ2xvYmFsVmFycyA9PSBcIm9iamVjdFwiKVxuICAgICAgICBzdGF0ZS5nbG9iYWxWYXJzID0gcGFyc2VyQ29uZmlnLmdsb2JhbFZhcnM7XG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgfSxcblxuICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7XG4gICAgICBpZiAoc3RyZWFtLnNvbCgpKSB7XG4gICAgICAgIGlmICghc3RhdGUubGV4aWNhbC5oYXNPd25Qcm9wZXJ0eShcImFsaWduXCIpKVxuICAgICAgICAgIHN0YXRlLmxleGljYWwuYWxpZ24gPSBmYWxzZTtcbiAgICAgICAgc3RhdGUuaW5kZW50ZWQgPSBzdHJlYW0uaW5kZW50YXRpb24oKTtcbiAgICAgICAgZmluZEZhdEFycm93KHN0cmVhbSwgc3RhdGUpO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXRlLnRva2VuaXplICE9IHRva2VuQ29tbWVudCAmJiBzdHJlYW0uZWF0U3BhY2UoKSkgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgc3R5bGUgPSBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTtcbiAgICAgIGlmICh0eXBlID09IFwiY29tbWVudFwiKSByZXR1cm4gc3R5bGU7XG4gICAgICBzdGF0ZS5sYXN0VHlwZSA9IHR5cGUgPT0gXCJvcGVyYXRvclwiICYmIChjb250ZW50ID09IFwiKytcIiB8fCBjb250ZW50ID09IFwiLS1cIikgPyBcImluY2RlY1wiIDogdHlwZTtcbiAgICAgIHJldHVybiBwYXJzZUpTKHN0YXRlLCBzdHlsZSwgdHlwZSwgY29udGVudCwgc3RyZWFtKTtcbiAgICB9LFxuXG4gICAgaW5kZW50OiBmdW5jdGlvbihzdGF0ZSwgdGV4dEFmdGVyKSB7XG4gICAgICBpZiAoc3RhdGUudG9rZW5pemUgPT0gdG9rZW5Db21tZW50IHx8IHN0YXRlLnRva2VuaXplID09IHRva2VuUXVhc2kpIHJldHVybiBDb2RlTWlycm9yLlBhc3M7XG4gICAgICBpZiAoc3RhdGUudG9rZW5pemUgIT0gdG9rZW5CYXNlKSByZXR1cm4gMDtcbiAgICAgIHZhciBmaXJzdENoYXIgPSB0ZXh0QWZ0ZXIgJiYgdGV4dEFmdGVyLmNoYXJBdCgwKSwgbGV4aWNhbCA9IHN0YXRlLmxleGljYWwsIHRvcFxuICAgICAgLy8gS2x1ZGdlIHRvIHByZXZlbnQgJ21heWJlbHNlJyBmcm9tIGJsb2NraW5nIGxleGljYWwgc2NvcGUgcG9wc1xuICAgICAgaWYgKCEvXlxccyplbHNlXFxiLy50ZXN0KHRleHRBZnRlcikpIGZvciAodmFyIGkgPSBzdGF0ZS5jYy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgYyA9IHN0YXRlLmNjW2ldO1xuICAgICAgICBpZiAoYyA9PSBwb3BsZXgpIGxleGljYWwgPSBsZXhpY2FsLnByZXY7XG4gICAgICAgIGVsc2UgaWYgKGMgIT0gbWF5YmVlbHNlKSBicmVhaztcbiAgICAgIH1cbiAgICAgIHdoaWxlICgobGV4aWNhbC50eXBlID09IFwic3RhdFwiIHx8IGxleGljYWwudHlwZSA9PSBcImZvcm1cIikgJiZcbiAgICAgICAgICAgICAoZmlyc3RDaGFyID09IFwifVwiIHx8ICgodG9wID0gc3RhdGUuY2Nbc3RhdGUuY2MubGVuZ3RoIC0gMV0pICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0b3AgPT0gbWF5YmVvcGVyYXRvckNvbW1hIHx8IHRvcCA9PSBtYXliZW9wZXJhdG9yTm9Db21tYSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIS9eWyxcXC49K1xcLSo6P1tcXChdLy50ZXN0KHRleHRBZnRlcikpKSlcbiAgICAgICAgbGV4aWNhbCA9IGxleGljYWwucHJldjtcbiAgICAgIGlmIChzdGF0ZW1lbnRJbmRlbnQgJiYgbGV4aWNhbC50eXBlID09IFwiKVwiICYmIGxleGljYWwucHJldi50eXBlID09IFwic3RhdFwiKVxuICAgICAgICBsZXhpY2FsID0gbGV4aWNhbC5wcmV2O1xuICAgICAgdmFyIHR5cGUgPSBsZXhpY2FsLnR5cGUsIGNsb3NpbmcgPSBmaXJzdENoYXIgPT0gdHlwZTtcblxuICAgICAgaWYgKHR5cGUgPT0gXCJ2YXJkZWZcIikgcmV0dXJuIGxleGljYWwuaW5kZW50ZWQgKyAoc3RhdGUubGFzdFR5cGUgPT0gXCJvcGVyYXRvclwiIHx8IHN0YXRlLmxhc3RUeXBlID09IFwiLFwiID8gbGV4aWNhbC5pbmZvLmxlbmd0aCArIDEgOiAwKTtcbiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gXCJmb3JtXCIgJiYgZmlyc3RDaGFyID09IFwie1wiKSByZXR1cm4gbGV4aWNhbC5pbmRlbnRlZDtcbiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gXCJmb3JtXCIpIHJldHVybiBsZXhpY2FsLmluZGVudGVkICsgaW5kZW50VW5pdDtcbiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gXCJzdGF0XCIpXG4gICAgICAgIHJldHVybiBsZXhpY2FsLmluZGVudGVkICsgKGlzQ29udGludWVkU3RhdGVtZW50KHN0YXRlLCB0ZXh0QWZ0ZXIpID8gc3RhdGVtZW50SW5kZW50IHx8IGluZGVudFVuaXQgOiAwKTtcbiAgICAgIGVsc2UgaWYgKGxleGljYWwuaW5mbyA9PSBcInN3aXRjaFwiICYmICFjbG9zaW5nICYmIHBhcnNlckNvbmZpZy5kb3VibGVJbmRlbnRTd2l0Y2ggIT0gZmFsc2UpXG4gICAgICAgIHJldHVybiBsZXhpY2FsLmluZGVudGVkICsgKC9eKD86Y2FzZXxkZWZhdWx0KVxcYi8udGVzdCh0ZXh0QWZ0ZXIpID8gaW5kZW50VW5pdCA6IDIgKiBpbmRlbnRVbml0KTtcbiAgICAgIGVsc2UgaWYgKGxleGljYWwuYWxpZ24pIHJldHVybiBsZXhpY2FsLmNvbHVtbiArIChjbG9zaW5nID8gMCA6IDEpO1xuICAgICAgZWxzZSByZXR1cm4gbGV4aWNhbC5pbmRlbnRlZCArIChjbG9zaW5nID8gMCA6IGluZGVudFVuaXQpO1xuICAgIH0sXG5cbiAgICBlbGVjdHJpY0lucHV0OiAvXlxccyooPzpjYXNlIC4qPzp8ZGVmYXVsdDp8XFx7fFxcfSkkLyxcbiAgICBibG9ja0NvbW1lbnRTdGFydDoganNvbk1vZGUgPyBudWxsIDogXCIvKlwiLFxuICAgIGJsb2NrQ29tbWVudEVuZDoganNvbk1vZGUgPyBudWxsIDogXCIqL1wiLFxuICAgIGJsb2NrQ29tbWVudENvbnRpbnVlOiBqc29uTW9kZSA/IG51bGwgOiBcIiAqIFwiLFxuICAgIGxpbmVDb21tZW50OiBqc29uTW9kZSA/IG51bGwgOiBcIi8vXCIsXG4gICAgZm9sZDogXCJicmFjZVwiLFxuICAgIGNsb3NlQnJhY2tldHM6IFwiKClbXXt9JydcXFwiXFxcImBgXCIsXG5cbiAgICBoZWxwZXJUeXBlOiBqc29uTW9kZSA/IFwianNvblwiIDogXCJqYXZhc2NyaXB0XCIsXG4gICAganNvbmxkTW9kZToganNvbmxkTW9kZSxcbiAgICBqc29uTW9kZToganNvbk1vZGUsXG5cbiAgICBleHByZXNzaW9uQWxsb3dlZDogZXhwcmVzc2lvbkFsbG93ZWQsXG5cbiAgICBza2lwRXhwcmVzc2lvbjogZnVuY3Rpb24oc3RhdGUpIHtcbiAgICAgIHZhciB0b3AgPSBzdGF0ZS5jY1tzdGF0ZS5jYy5sZW5ndGggLSAxXVxuICAgICAgaWYgKHRvcCA9PSBleHByZXNzaW9uIHx8IHRvcCA9PSBleHByZXNzaW9uTm9Db21tYSkgc3RhdGUuY2MucG9wKClcbiAgICB9XG4gIH07XG59KTtcblxuQ29kZU1pcnJvci5yZWdpc3RlckhlbHBlcihcIndvcmRDaGFyc1wiLCBcImphdmFzY3JpcHRcIiwgL1tcXHckXS8pO1xuXG5Db2RlTWlycm9yLmRlZmluZU1JTUUoXCJ0ZXh0L2phdmFzY3JpcHRcIiwgXCJqYXZhc2NyaXB0XCIpO1xuQ29kZU1pcnJvci5kZWZpbmVNSU1FKFwidGV4dC9lY21hc2NyaXB0XCIsIFwiamF2YXNjcmlwdFwiKTtcbkNvZGVNaXJyb3IuZGVmaW5lTUlNRShcImFwcGxpY2F0aW9uL2phdmFzY3JpcHRcIiwgXCJqYXZhc2NyaXB0XCIpO1xuQ29kZU1pcnJvci5kZWZpbmVNSU1FKFwiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0XCIsIFwiamF2YXNjcmlwdFwiKTtcbkNvZGVNaXJyb3IuZGVmaW5lTUlNRShcImFwcGxpY2F0aW9uL2VjbWFzY3JpcHRcIiwgXCJqYXZhc2NyaXB0XCIpO1xuQ29kZU1pcnJvci5kZWZpbmVNSU1FKFwiYXBwbGljYXRpb24vanNvblwiLCB7bmFtZTogXCJqYXZhc2NyaXB0XCIsIGpzb246IHRydWV9KTtcbkNvZGVNaXJyb3IuZGVmaW5lTUlNRShcImFwcGxpY2F0aW9uL3gtanNvblwiLCB7bmFtZTogXCJqYXZhc2NyaXB0XCIsIGpzb246IHRydWV9KTtcbkNvZGVNaXJyb3IuZGVmaW5lTUlNRShcImFwcGxpY2F0aW9uL2xkK2pzb25cIiwge25hbWU6IFwiamF2YXNjcmlwdFwiLCBqc29ubGQ6IHRydWV9KTtcbkNvZGVNaXJyb3IuZGVmaW5lTUlNRShcInRleHQvdHlwZXNjcmlwdFwiLCB7IG5hbWU6IFwiamF2YXNjcmlwdFwiLCB0eXBlc2NyaXB0OiB0cnVlIH0pO1xuQ29kZU1pcnJvci5kZWZpbmVNSU1FKFwiYXBwbGljYXRpb24vdHlwZXNjcmlwdFwiLCB7IG5hbWU6IFwiamF2YXNjcmlwdFwiLCB0eXBlc2NyaXB0OiB0cnVlIH0pO1xuXG59KTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/codemirror/mode/javascript/javascript.js\n"); +eval("// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n if (true) // CommonJS\n mod(__webpack_require__(/*! ../../lib/codemirror */ \"./node_modules/codemirror/lib/codemirror.js\"));\n else {}\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"javascript\", function(config, parserConfig) {\n var indentUnit = config.indentUnit;\n var statementIndent = parserConfig.statementIndent;\n var jsonldMode = parserConfig.jsonld;\n var jsonMode = parserConfig.json || jsonldMode;\n var trackScope = parserConfig.trackScope !== false\n var isTS = parserConfig.typescript;\n var wordRE = parserConfig.wordCharacters || /[\\w$\\xa1-\\uffff]/;\n\n // Tokenizer\n\n var keywords = function(){\n function kw(type) {return {type: type, style: \"keyword\"};}\n var A = kw(\"keyword a\"), B = kw(\"keyword b\"), C = kw(\"keyword c\"), D = kw(\"keyword d\");\n var operator = kw(\"operator\"), atom = {type: \"atom\", style: \"atom\"};\n\n return {\n \"if\": kw(\"if\"), \"while\": A, \"with\": A, \"else\": B, \"do\": B, \"try\": B, \"finally\": B,\n \"return\": D, \"break\": D, \"continue\": D, \"new\": kw(\"new\"), \"delete\": C, \"void\": C, \"throw\": C,\n \"debugger\": kw(\"debugger\"), \"var\": kw(\"var\"), \"const\": kw(\"var\"), \"let\": kw(\"var\"),\n \"function\": kw(\"function\"), \"catch\": kw(\"catch\"),\n \"for\": kw(\"for\"), \"switch\": kw(\"switch\"), \"case\": kw(\"case\"), \"default\": kw(\"default\"),\n \"in\": operator, \"typeof\": operator, \"instanceof\": operator,\n \"true\": atom, \"false\": atom, \"null\": atom, \"undefined\": atom, \"NaN\": atom, \"Infinity\": atom,\n \"this\": kw(\"this\"), \"class\": kw(\"class\"), \"super\": kw(\"atom\"),\n \"yield\": C, \"export\": kw(\"export\"), \"import\": kw(\"import\"), \"extends\": C,\n \"await\": C\n };\n }();\n\n var isOperatorChar = /[+\\-*&%=<>!?|~^@]/;\n var isJsonldKeyword = /^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)\"/;\n\n function readRegexp(stream) {\n var escaped = false, next, inSet = false;\n while ((next = stream.next()) != null) {\n if (!escaped) {\n if (next == \"/\" && !inSet) return;\n if (next == \"[\") inSet = true;\n else if (inSet && next == \"]\") inSet = false;\n }\n escaped = !escaped && next == \"\\\\\";\n }\n }\n\n // Used as scratch variables to communicate multiple values without\n // consing up tons of objects.\n var type, content;\n function ret(tp, style, cont) {\n type = tp; content = cont;\n return style;\n }\n function tokenBase(stream, state) {\n var ch = stream.next();\n if (ch == '\"' || ch == \"'\") {\n state.tokenize = tokenString(ch);\n return state.tokenize(stream, state);\n } else if (ch == \".\" && stream.match(/^\\d[\\d_]*(?:[eE][+\\-]?[\\d_]+)?/)) {\n return ret(\"number\", \"number\");\n } else if (ch == \".\" && stream.match(\"..\")) {\n return ret(\"spread\", \"meta\");\n } else if (/[\\[\\]{}\\(\\),;\\:\\.]/.test(ch)) {\n return ret(ch);\n } else if (ch == \"=\" && stream.eat(\">\")) {\n return ret(\"=>\", \"operator\");\n } else if (ch == \"0\" && stream.match(/^(?:x[\\dA-Fa-f_]+|o[0-7_]+|b[01_]+)n?/)) {\n return ret(\"number\", \"number\");\n } else if (/\\d/.test(ch)) {\n stream.match(/^[\\d_]*(?:n|(?:\\.[\\d_]*)?(?:[eE][+\\-]?[\\d_]+)?)?/);\n return ret(\"number\", \"number\");\n } else if (ch == \"/\") {\n if (stream.eat(\"*\")) {\n state.tokenize = tokenComment;\n return tokenComment(stream, state);\n } else if (stream.eat(\"/\")) {\n stream.skipToEnd();\n return ret(\"comment\", \"comment\");\n } else if (expressionAllowed(stream, state, 1)) {\n readRegexp(stream);\n stream.match(/^\\b(([gimyus])(?![gimyus]*\\2))+\\b/);\n return ret(\"regexp\", \"string-2\");\n } else {\n stream.eat(\"=\");\n return ret(\"operator\", \"operator\", stream.current());\n }\n } else if (ch == \"`\") {\n state.tokenize = tokenQuasi;\n return tokenQuasi(stream, state);\n } else if (ch == \"#\" && stream.peek() == \"!\") {\n stream.skipToEnd();\n return ret(\"meta\", \"meta\");\n } else if (ch == \"#\" && stream.eatWhile(wordRE)) {\n return ret(\"variable\", \"property\")\n } else if (ch == \"<\" && stream.match(\"!--\") ||\n (ch == \"-\" && stream.match(\"->\") && !/\\S/.test(stream.string.slice(0, stream.start)))) {\n stream.skipToEnd()\n return ret(\"comment\", \"comment\")\n } else if (isOperatorChar.test(ch)) {\n if (ch != \">\" || !state.lexical || state.lexical.type != \">\") {\n if (stream.eat(\"=\")) {\n if (ch == \"!\" || ch == \"=\") stream.eat(\"=\")\n } else if (/[<>*+\\-|&?]/.test(ch)) {\n stream.eat(ch)\n if (ch == \">\") stream.eat(ch)\n }\n }\n if (ch == \"?\" && stream.eat(\".\")) return ret(\".\")\n return ret(\"operator\", \"operator\", stream.current());\n } else if (wordRE.test(ch)) {\n stream.eatWhile(wordRE);\n var word = stream.current()\n if (state.lastType != \".\") {\n if (keywords.propertyIsEnumerable(word)) {\n var kw = keywords[word]\n return ret(kw.type, kw.style, word)\n }\n if (word == \"async\" && stream.match(/^(\\s|\\/\\*([^*]|\\*(?!\\/))*?\\*\\/)*[\\[\\(\\w]/, false))\n return ret(\"async\", \"keyword\", word)\n }\n return ret(\"variable\", \"variable\", word)\n }\n }\n\n function tokenString(quote) {\n return function(stream, state) {\n var escaped = false, next;\n if (jsonldMode && stream.peek() == \"@\" && stream.match(isJsonldKeyword)){\n state.tokenize = tokenBase;\n return ret(\"jsonld-keyword\", \"meta\");\n }\n while ((next = stream.next()) != null) {\n if (next == quote && !escaped) break;\n escaped = !escaped && next == \"\\\\\";\n }\n if (!escaped) state.tokenize = tokenBase;\n return ret(\"string\", \"string\");\n };\n }\n\n function tokenComment(stream, state) {\n var maybeEnd = false, ch;\n while (ch = stream.next()) {\n if (ch == \"/\" && maybeEnd) {\n state.tokenize = tokenBase;\n break;\n }\n maybeEnd = (ch == \"*\");\n }\n return ret(\"comment\", \"comment\");\n }\n\n function tokenQuasi(stream, state) {\n var escaped = false, next;\n while ((next = stream.next()) != null) {\n if (!escaped && (next == \"`\" || next == \"$\" && stream.eat(\"{\"))) {\n state.tokenize = tokenBase;\n break;\n }\n escaped = !escaped && next == \"\\\\\";\n }\n return ret(\"quasi\", \"string-2\", stream.current());\n }\n\n var brackets = \"([{}])\";\n // This is a crude lookahead trick to try and notice that we're\n // parsing the argument patterns for a fat-arrow function before we\n // actually hit the arrow token. It only works if the arrow is on\n // the same line as the arguments and there's no strange noise\n // (comments) in between. Fallback is to only notice when we hit the\n // arrow, and not declare the arguments as locals for the arrow\n // body.\n function findFatArrow(stream, state) {\n if (state.fatArrowAt) state.fatArrowAt = null;\n var arrow = stream.string.indexOf(\"=>\", stream.start);\n if (arrow < 0) return;\n\n if (isTS) { // Try to skip TypeScript return type declarations after the arguments\n var m = /:\\s*(?:\\w+(?:<[^>]*>|\\[\\])?|\\{[^}]*\\})\\s*$/.exec(stream.string.slice(stream.start, arrow))\n if (m) arrow = m.index\n }\n\n var depth = 0, sawSomething = false;\n for (var pos = arrow - 1; pos >= 0; --pos) {\n var ch = stream.string.charAt(pos);\n var bracket = brackets.indexOf(ch);\n if (bracket >= 0 && bracket < 3) {\n if (!depth) { ++pos; break; }\n if (--depth == 0) { if (ch == \"(\") sawSomething = true; break; }\n } else if (bracket >= 3 && bracket < 6) {\n ++depth;\n } else if (wordRE.test(ch)) {\n sawSomething = true;\n } else if (/[\"'\\/`]/.test(ch)) {\n for (;; --pos) {\n if (pos == 0) return\n var next = stream.string.charAt(pos - 1)\n if (next == ch && stream.string.charAt(pos - 2) != \"\\\\\") { pos--; break }\n }\n } else if (sawSomething && !depth) {\n ++pos;\n break;\n }\n }\n if (sawSomething && !depth) state.fatArrowAt = pos;\n }\n\n // Parser\n\n var atomicTypes = {\"atom\": true, \"number\": true, \"variable\": true, \"string\": true,\n \"regexp\": true, \"this\": true, \"import\": true, \"jsonld-keyword\": true};\n\n function JSLexical(indented, column, type, align, prev, info) {\n this.indented = indented;\n this.column = column;\n this.type = type;\n this.prev = prev;\n this.info = info;\n if (align != null) this.align = align;\n }\n\n function inScope(state, varname) {\n if (!trackScope) return false\n for (var v = state.localVars; v; v = v.next)\n if (v.name == varname) return true;\n for (var cx = state.context; cx; cx = cx.prev) {\n for (var v = cx.vars; v; v = v.next)\n if (v.name == varname) return true;\n }\n }\n\n function parseJS(state, style, type, content, stream) {\n var cc = state.cc;\n // Communicate our context to the combinators.\n // (Less wasteful than consing up a hundred closures on every call.)\n cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc; cx.style = style;\n\n if (!state.lexical.hasOwnProperty(\"align\"))\n state.lexical.align = true;\n\n while(true) {\n var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement;\n if (combinator(type, content)) {\n while(cc.length && cc[cc.length - 1].lex)\n cc.pop()();\n if (cx.marked) return cx.marked;\n if (type == \"variable\" && inScope(state, content)) return \"variable-2\";\n return style;\n }\n }\n }\n\n // Combinator utils\n\n var cx = {state: null, column: null, marked: null, cc: null};\n function pass() {\n for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]);\n }\n function cont() {\n pass.apply(null, arguments);\n return true;\n }\n function inList(name, list) {\n for (var v = list; v; v = v.next) if (v.name == name) return true\n return false;\n }\n function register(varname) {\n var state = cx.state;\n cx.marked = \"def\";\n if (!trackScope) return\n if (state.context) {\n if (state.lexical.info == \"var\" && state.context && state.context.block) {\n // FIXME function decls are also not block scoped\n var newContext = registerVarScoped(varname, state.context)\n if (newContext != null) {\n state.context = newContext\n return\n }\n } else if (!inList(varname, state.localVars)) {\n state.localVars = new Var(varname, state.localVars)\n return\n }\n }\n // Fall through means this is global\n if (parserConfig.globalVars && !inList(varname, state.globalVars))\n state.globalVars = new Var(varname, state.globalVars)\n }\n function registerVarScoped(varname, context) {\n if (!context) {\n return null\n } else if (context.block) {\n var inner = registerVarScoped(varname, context.prev)\n if (!inner) return null\n if (inner == context.prev) return context\n return new Context(inner, context.vars, true)\n } else if (inList(varname, context.vars)) {\n return context\n } else {\n return new Context(context.prev, new Var(varname, context.vars), false)\n }\n }\n\n function isModifier(name) {\n return name == \"public\" || name == \"private\" || name == \"protected\" || name == \"abstract\" || name == \"readonly\"\n }\n\n // Combinators\n\n function Context(prev, vars, block) { this.prev = prev; this.vars = vars; this.block = block }\n function Var(name, next) { this.name = name; this.next = next }\n\n var defaultVars = new Var(\"this\", new Var(\"arguments\", null))\n function pushcontext() {\n cx.state.context = new Context(cx.state.context, cx.state.localVars, false)\n cx.state.localVars = defaultVars\n }\n function pushblockcontext() {\n cx.state.context = new Context(cx.state.context, cx.state.localVars, true)\n cx.state.localVars = null\n }\n function popcontext() {\n cx.state.localVars = cx.state.context.vars\n cx.state.context = cx.state.context.prev\n }\n popcontext.lex = true\n function pushlex(type, info) {\n var result = function() {\n var state = cx.state, indent = state.indented;\n if (state.lexical.type == \"stat\") indent = state.lexical.indented;\n else for (var outer = state.lexical; outer && outer.type == \")\" && outer.align; outer = outer.prev)\n indent = outer.indented;\n state.lexical = new JSLexical(indent, cx.stream.column(), type, null, state.lexical, info);\n };\n result.lex = true;\n return result;\n }\n function poplex() {\n var state = cx.state;\n if (state.lexical.prev) {\n if (state.lexical.type == \")\")\n state.indented = state.lexical.indented;\n state.lexical = state.lexical.prev;\n }\n }\n poplex.lex = true;\n\n function expect(wanted) {\n function exp(type) {\n if (type == wanted) return cont();\n else if (wanted == \";\" || type == \"}\" || type == \")\" || type == \"]\") return pass();\n else return cont(exp);\n };\n return exp;\n }\n\n function statement(type, value) {\n if (type == \"var\") return cont(pushlex(\"vardef\", value), vardef, expect(\";\"), poplex);\n if (type == \"keyword a\") return cont(pushlex(\"form\"), parenExpr, statement, poplex);\n if (type == \"keyword b\") return cont(pushlex(\"form\"), statement, poplex);\n if (type == \"keyword d\") return cx.stream.match(/^\\s*$/, false) ? cont() : cont(pushlex(\"stat\"), maybeexpression, expect(\";\"), poplex);\n if (type == \"debugger\") return cont(expect(\";\"));\n if (type == \"{\") return cont(pushlex(\"}\"), pushblockcontext, block, poplex, popcontext);\n if (type == \";\") return cont();\n if (type == \"if\") {\n if (cx.state.lexical.info == \"else\" && cx.state.cc[cx.state.cc.length - 1] == poplex)\n cx.state.cc.pop()();\n return cont(pushlex(\"form\"), parenExpr, statement, poplex, maybeelse);\n }\n if (type == \"function\") return cont(functiondef);\n if (type == \"for\") return cont(pushlex(\"form\"), pushblockcontext, forspec, statement, popcontext, poplex);\n if (type == \"class\" || (isTS && value == \"interface\")) {\n cx.marked = \"keyword\"\n return cont(pushlex(\"form\", type == \"class\" ? type : value), className, poplex)\n }\n if (type == \"variable\") {\n if (isTS && value == \"declare\") {\n cx.marked = \"keyword\"\n return cont(statement)\n } else if (isTS && (value == \"module\" || value == \"enum\" || value == \"type\") && cx.stream.match(/^\\s*\\w/, false)) {\n cx.marked = \"keyword\"\n if (value == \"enum\") return cont(enumdef);\n else if (value == \"type\") return cont(typename, expect(\"operator\"), typeexpr, expect(\";\"));\n else return cont(pushlex(\"form\"), pattern, expect(\"{\"), pushlex(\"}\"), block, poplex, poplex)\n } else if (isTS && value == \"namespace\") {\n cx.marked = \"keyword\"\n return cont(pushlex(\"form\"), expression, statement, poplex)\n } else if (isTS && value == \"abstract\") {\n cx.marked = \"keyword\"\n return cont(statement)\n } else {\n return cont(pushlex(\"stat\"), maybelabel);\n }\n }\n if (type == \"switch\") return cont(pushlex(\"form\"), parenExpr, expect(\"{\"), pushlex(\"}\", \"switch\"), pushblockcontext,\n block, poplex, poplex, popcontext);\n if (type == \"case\") return cont(expression, expect(\":\"));\n if (type == \"default\") return cont(expect(\":\"));\n if (type == \"catch\") return cont(pushlex(\"form\"), pushcontext, maybeCatchBinding, statement, poplex, popcontext);\n if (type == \"export\") return cont(pushlex(\"stat\"), afterExport, poplex);\n if (type == \"import\") return cont(pushlex(\"stat\"), afterImport, poplex);\n if (type == \"async\") return cont(statement)\n if (value == \"@\") return cont(expression, statement)\n return pass(pushlex(\"stat\"), expression, expect(\";\"), poplex);\n }\n function maybeCatchBinding(type) {\n if (type == \"(\") return cont(funarg, expect(\")\"))\n }\n function expression(type, value) {\n return expressionInner(type, value, false);\n }\n function expressionNoComma(type, value) {\n return expressionInner(type, value, true);\n }\n function parenExpr(type) {\n if (type != \"(\") return pass()\n return cont(pushlex(\")\"), maybeexpression, expect(\")\"), poplex)\n }\n function expressionInner(type, value, noComma) {\n if (cx.state.fatArrowAt == cx.stream.start) {\n var body = noComma ? arrowBodyNoComma : arrowBody;\n if (type == \"(\") return cont(pushcontext, pushlex(\")\"), commasep(funarg, \")\"), poplex, expect(\"=>\"), body, popcontext);\n else if (type == \"variable\") return pass(pushcontext, pattern, expect(\"=>\"), body, popcontext);\n }\n\n var maybeop = noComma ? maybeoperatorNoComma : maybeoperatorComma;\n if (atomicTypes.hasOwnProperty(type)) return cont(maybeop);\n if (type == \"function\") return cont(functiondef, maybeop);\n if (type == \"class\" || (isTS && value == \"interface\")) { cx.marked = \"keyword\"; return cont(pushlex(\"form\"), classExpression, poplex); }\n if (type == \"keyword c\" || type == \"async\") return cont(noComma ? expressionNoComma : expression);\n if (type == \"(\") return cont(pushlex(\")\"), maybeexpression, expect(\")\"), poplex, maybeop);\n if (type == \"operator\" || type == \"spread\") return cont(noComma ? expressionNoComma : expression);\n if (type == \"[\") return cont(pushlex(\"]\"), arrayLiteral, poplex, maybeop);\n if (type == \"{\") return contCommasep(objprop, \"}\", null, maybeop);\n if (type == \"quasi\") return pass(quasi, maybeop);\n if (type == \"new\") return cont(maybeTarget(noComma));\n return cont();\n }\n function maybeexpression(type) {\n if (type.match(/[;\\}\\)\\],]/)) return pass();\n return pass(expression);\n }\n\n function maybeoperatorComma(type, value) {\n if (type == \",\") return cont(maybeexpression);\n return maybeoperatorNoComma(type, value, false);\n }\n function maybeoperatorNoComma(type, value, noComma) {\n var me = noComma == false ? maybeoperatorComma : maybeoperatorNoComma;\n var expr = noComma == false ? expression : expressionNoComma;\n if (type == \"=>\") return cont(pushcontext, noComma ? arrowBodyNoComma : arrowBody, popcontext);\n if (type == \"operator\") {\n if (/\\+\\+|--/.test(value) || isTS && value == \"!\") return cont(me);\n if (isTS && value == \"<\" && cx.stream.match(/^([^<>]|<[^<>]*>)*>\\s*\\(/, false))\n return cont(pushlex(\">\"), commasep(typeexpr, \">\"), poplex, me);\n if (value == \"?\") return cont(expression, expect(\":\"), expr);\n return cont(expr);\n }\n if (type == \"quasi\") { return pass(quasi, me); }\n if (type == \";\") return;\n if (type == \"(\") return contCommasep(expressionNoComma, \")\", \"call\", me);\n if (type == \".\") return cont(property, me);\n if (type == \"[\") return cont(pushlex(\"]\"), maybeexpression, expect(\"]\"), poplex, me);\n if (isTS && value == \"as\") { cx.marked = \"keyword\"; return cont(typeexpr, me) }\n if (type == \"regexp\") {\n cx.state.lastType = cx.marked = \"operator\"\n cx.stream.backUp(cx.stream.pos - cx.stream.start - 1)\n return cont(expr)\n }\n }\n function quasi(type, value) {\n if (type != \"quasi\") return pass();\n if (value.slice(value.length - 2) != \"${\") return cont(quasi);\n return cont(expression, continueQuasi);\n }\n function continueQuasi(type) {\n if (type == \"}\") {\n cx.marked = \"string-2\";\n cx.state.tokenize = tokenQuasi;\n return cont(quasi);\n }\n }\n function arrowBody(type) {\n findFatArrow(cx.stream, cx.state);\n return pass(type == \"{\" ? statement : expression);\n }\n function arrowBodyNoComma(type) {\n findFatArrow(cx.stream, cx.state);\n return pass(type == \"{\" ? statement : expressionNoComma);\n }\n function maybeTarget(noComma) {\n return function(type) {\n if (type == \".\") return cont(noComma ? targetNoComma : target);\n else if (type == \"variable\" && isTS) return cont(maybeTypeArgs, noComma ? maybeoperatorNoComma : maybeoperatorComma)\n else return pass(noComma ? expressionNoComma : expression);\n };\n }\n function target(_, value) {\n if (value == \"target\") { cx.marked = \"keyword\"; return cont(maybeoperatorComma); }\n }\n function targetNoComma(_, value) {\n if (value == \"target\") { cx.marked = \"keyword\"; return cont(maybeoperatorNoComma); }\n }\n function maybelabel(type) {\n if (type == \":\") return cont(poplex, statement);\n return pass(maybeoperatorComma, expect(\";\"), poplex);\n }\n function property(type) {\n if (type == \"variable\") {cx.marked = \"property\"; return cont();}\n }\n function objprop(type, value) {\n if (type == \"async\") {\n cx.marked = \"property\";\n return cont(objprop);\n } else if (type == \"variable\" || cx.style == \"keyword\") {\n cx.marked = \"property\";\n if (value == \"get\" || value == \"set\") return cont(getterSetter);\n var m // Work around fat-arrow-detection complication for detecting typescript typed arrow params\n if (isTS && cx.state.fatArrowAt == cx.stream.start && (m = cx.stream.match(/^\\s*:\\s*/, false)))\n cx.state.fatArrowAt = cx.stream.pos + m[0].length\n return cont(afterprop);\n } else if (type == \"number\" || type == \"string\") {\n cx.marked = jsonldMode ? \"property\" : (cx.style + \" property\");\n return cont(afterprop);\n } else if (type == \"jsonld-keyword\") {\n return cont(afterprop);\n } else if (isTS && isModifier(value)) {\n cx.marked = \"keyword\"\n return cont(objprop)\n } else if (type == \"[\") {\n return cont(expression, maybetype, expect(\"]\"), afterprop);\n } else if (type == \"spread\") {\n return cont(expressionNoComma, afterprop);\n } else if (value == \"*\") {\n cx.marked = \"keyword\";\n return cont(objprop);\n } else if (type == \":\") {\n return pass(afterprop)\n }\n }\n function getterSetter(type) {\n if (type != \"variable\") return pass(afterprop);\n cx.marked = \"property\";\n return cont(functiondef);\n }\n function afterprop(type) {\n if (type == \":\") return cont(expressionNoComma);\n if (type == \"(\") return pass(functiondef);\n }\n function commasep(what, end, sep) {\n function proceed(type, value) {\n if (sep ? sep.indexOf(type) > -1 : type == \",\") {\n var lex = cx.state.lexical;\n if (lex.info == \"call\") lex.pos = (lex.pos || 0) + 1;\n return cont(function(type, value) {\n if (type == end || value == end) return pass()\n return pass(what)\n }, proceed);\n }\n if (type == end || value == end) return cont();\n if (sep && sep.indexOf(\";\") > -1) return pass(what)\n return cont(expect(end));\n }\n return function(type, value) {\n if (type == end || value == end) return cont();\n return pass(what, proceed);\n };\n }\n function contCommasep(what, end, info) {\n for (var i = 3; i < arguments.length; i++)\n cx.cc.push(arguments[i]);\n return cont(pushlex(end, info), commasep(what, end), poplex);\n }\n function block(type) {\n if (type == \"}\") return cont();\n return pass(statement, block);\n }\n function maybetype(type, value) {\n if (isTS) {\n if (type == \":\") return cont(typeexpr);\n if (value == \"?\") return cont(maybetype);\n }\n }\n function maybetypeOrIn(type, value) {\n if (isTS && (type == \":\" || value == \"in\")) return cont(typeexpr)\n }\n function mayberettype(type) {\n if (isTS && type == \":\") {\n if (cx.stream.match(/^\\s*\\w+\\s+is\\b/, false)) return cont(expression, isKW, typeexpr)\n else return cont(typeexpr)\n }\n }\n function isKW(_, value) {\n if (value == \"is\") {\n cx.marked = \"keyword\"\n return cont()\n }\n }\n function typeexpr(type, value) {\n if (value == \"keyof\" || value == \"typeof\" || value == \"infer\" || value == \"readonly\") {\n cx.marked = \"keyword\"\n return cont(value == \"typeof\" ? expressionNoComma : typeexpr)\n }\n if (type == \"variable\" || value == \"void\") {\n cx.marked = \"type\"\n return cont(afterType)\n }\n if (value == \"|\" || value == \"&\") return cont(typeexpr)\n if (type == \"string\" || type == \"number\" || type == \"atom\") return cont(afterType);\n if (type == \"[\") return cont(pushlex(\"]\"), commasep(typeexpr, \"]\", \",\"), poplex, afterType)\n if (type == \"{\") return cont(pushlex(\"}\"), typeprops, poplex, afterType)\n if (type == \"(\") return cont(commasep(typearg, \")\"), maybeReturnType, afterType)\n if (type == \"<\") return cont(commasep(typeexpr, \">\"), typeexpr)\n }\n function maybeReturnType(type) {\n if (type == \"=>\") return cont(typeexpr)\n }\n function typeprops(type) {\n if (type.match(/[\\}\\)\\]]/)) return cont()\n if (type == \",\" || type == \";\") return cont(typeprops)\n return pass(typeprop, typeprops)\n }\n function typeprop(type, value) {\n if (type == \"variable\" || cx.style == \"keyword\") {\n cx.marked = \"property\"\n return cont(typeprop)\n } else if (value == \"?\" || type == \"number\" || type == \"string\") {\n return cont(typeprop)\n } else if (type == \":\") {\n return cont(typeexpr)\n } else if (type == \"[\") {\n return cont(expect(\"variable\"), maybetypeOrIn, expect(\"]\"), typeprop)\n } else if (type == \"(\") {\n return pass(functiondecl, typeprop)\n } else if (!type.match(/[;\\}\\)\\],]/)) {\n return cont()\n }\n }\n function typearg(type, value) {\n if (type == \"variable\" && cx.stream.match(/^\\s*[?:]/, false) || value == \"?\") return cont(typearg)\n if (type == \":\") return cont(typeexpr)\n if (type == \"spread\") return cont(typearg)\n return pass(typeexpr)\n }\n function afterType(type, value) {\n if (value == \"<\") return cont(pushlex(\">\"), commasep(typeexpr, \">\"), poplex, afterType)\n if (value == \"|\" || type == \".\" || value == \"&\") return cont(typeexpr)\n if (type == \"[\") return cont(typeexpr, expect(\"]\"), afterType)\n if (value == \"extends\" || value == \"implements\") { cx.marked = \"keyword\"; return cont(typeexpr) }\n if (value == \"?\") return cont(typeexpr, expect(\":\"), typeexpr)\n }\n function maybeTypeArgs(_, value) {\n if (value == \"<\") return cont(pushlex(\">\"), commasep(typeexpr, \">\"), poplex, afterType)\n }\n function typeparam() {\n return pass(typeexpr, maybeTypeDefault)\n }\n function maybeTypeDefault(_, value) {\n if (value == \"=\") return cont(typeexpr)\n }\n function vardef(_, value) {\n if (value == \"enum\") {cx.marked = \"keyword\"; return cont(enumdef)}\n return pass(pattern, maybetype, maybeAssign, vardefCont);\n }\n function pattern(type, value) {\n if (isTS && isModifier(value)) { cx.marked = \"keyword\"; return cont(pattern) }\n if (type == \"variable\") { register(value); return cont(); }\n if (type == \"spread\") return cont(pattern);\n if (type == \"[\") return contCommasep(eltpattern, \"]\");\n if (type == \"{\") return contCommasep(proppattern, \"}\");\n }\n function proppattern(type, value) {\n if (type == \"variable\" && !cx.stream.match(/^\\s*:/, false)) {\n register(value);\n return cont(maybeAssign);\n }\n if (type == \"variable\") cx.marked = \"property\";\n if (type == \"spread\") return cont(pattern);\n if (type == \"}\") return pass();\n if (type == \"[\") return cont(expression, expect(']'), expect(':'), proppattern);\n return cont(expect(\":\"), pattern, maybeAssign);\n }\n function eltpattern() {\n return pass(pattern, maybeAssign)\n }\n function maybeAssign(_type, value) {\n if (value == \"=\") return cont(expressionNoComma);\n }\n function vardefCont(type) {\n if (type == \",\") return cont(vardef);\n }\n function maybeelse(type, value) {\n if (type == \"keyword b\" && value == \"else\") return cont(pushlex(\"form\", \"else\"), statement, poplex);\n }\n function forspec(type, value) {\n if (value == \"await\") return cont(forspec);\n if (type == \"(\") return cont(pushlex(\")\"), forspec1, poplex);\n }\n function forspec1(type) {\n if (type == \"var\") return cont(vardef, forspec2);\n if (type == \"variable\") return cont(forspec2);\n return pass(forspec2)\n }\n function forspec2(type, value) {\n if (type == \")\") return cont()\n if (type == \";\") return cont(forspec2)\n if (value == \"in\" || value == \"of\") { cx.marked = \"keyword\"; return cont(expression, forspec2) }\n return pass(expression, forspec2)\n }\n function functiondef(type, value) {\n if (value == \"*\") {cx.marked = \"keyword\"; return cont(functiondef);}\n if (type == \"variable\") {register(value); return cont(functiondef);}\n if (type == \"(\") return cont(pushcontext, pushlex(\")\"), commasep(funarg, \")\"), poplex, mayberettype, statement, popcontext);\n if (isTS && value == \"<\") return cont(pushlex(\">\"), commasep(typeparam, \">\"), poplex, functiondef)\n }\n function functiondecl(type, value) {\n if (value == \"*\") {cx.marked = \"keyword\"; return cont(functiondecl);}\n if (type == \"variable\") {register(value); return cont(functiondecl);}\n if (type == \"(\") return cont(pushcontext, pushlex(\")\"), commasep(funarg, \")\"), poplex, mayberettype, popcontext);\n if (isTS && value == \"<\") return cont(pushlex(\">\"), commasep(typeparam, \">\"), poplex, functiondecl)\n }\n function typename(type, value) {\n if (type == \"keyword\" || type == \"variable\") {\n cx.marked = \"type\"\n return cont(typename)\n } else if (value == \"<\") {\n return cont(pushlex(\">\"), commasep(typeparam, \">\"), poplex)\n }\n }\n function funarg(type, value) {\n if (value == \"@\") cont(expression, funarg)\n if (type == \"spread\") return cont(funarg);\n if (isTS && isModifier(value)) { cx.marked = \"keyword\"; return cont(funarg); }\n if (isTS && type == \"this\") return cont(maybetype, maybeAssign)\n return pass(pattern, maybetype, maybeAssign);\n }\n function classExpression(type, value) {\n // Class expressions may have an optional name.\n if (type == \"variable\") return className(type, value);\n return classNameAfter(type, value);\n }\n function className(type, value) {\n if (type == \"variable\") {register(value); return cont(classNameAfter);}\n }\n function classNameAfter(type, value) {\n if (value == \"<\") return cont(pushlex(\">\"), commasep(typeparam, \">\"), poplex, classNameAfter)\n if (value == \"extends\" || value == \"implements\" || (isTS && type == \",\")) {\n if (value == \"implements\") cx.marked = \"keyword\";\n return cont(isTS ? typeexpr : expression, classNameAfter);\n }\n if (type == \"{\") return cont(pushlex(\"}\"), classBody, poplex);\n }\n function classBody(type, value) {\n if (type == \"async\" ||\n (type == \"variable\" &&\n (value == \"static\" || value == \"get\" || value == \"set\" || (isTS && isModifier(value))) &&\n cx.stream.match(/^\\s+[\\w$\\xa1-\\uffff]/, false))) {\n cx.marked = \"keyword\";\n return cont(classBody);\n }\n if (type == \"variable\" || cx.style == \"keyword\") {\n cx.marked = \"property\";\n return cont(classfield, classBody);\n }\n if (type == \"number\" || type == \"string\") return cont(classfield, classBody);\n if (type == \"[\")\n return cont(expression, maybetype, expect(\"]\"), classfield, classBody)\n if (value == \"*\") {\n cx.marked = \"keyword\";\n return cont(classBody);\n }\n if (isTS && type == \"(\") return pass(functiondecl, classBody)\n if (type == \";\" || type == \",\") return cont(classBody);\n if (type == \"}\") return cont();\n if (value == \"@\") return cont(expression, classBody)\n }\n function classfield(type, value) {\n if (value == \"?\") return cont(classfield)\n if (type == \":\") return cont(typeexpr, maybeAssign)\n if (value == \"=\") return cont(expressionNoComma)\n var context = cx.state.lexical.prev, isInterface = context && context.info == \"interface\"\n return pass(isInterface ? functiondecl : functiondef)\n }\n function afterExport(type, value) {\n if (value == \"*\") { cx.marked = \"keyword\"; return cont(maybeFrom, expect(\";\")); }\n if (value == \"default\") { cx.marked = \"keyword\"; return cont(expression, expect(\";\")); }\n if (type == \"{\") return cont(commasep(exportField, \"}\"), maybeFrom, expect(\";\"));\n return pass(statement);\n }\n function exportField(type, value) {\n if (value == \"as\") { cx.marked = \"keyword\"; return cont(expect(\"variable\")); }\n if (type == \"variable\") return pass(expressionNoComma, exportField);\n }\n function afterImport(type) {\n if (type == \"string\") return cont();\n if (type == \"(\") return pass(expression);\n if (type == \".\") return pass(maybeoperatorComma);\n return pass(importSpec, maybeMoreImports, maybeFrom);\n }\n function importSpec(type, value) {\n if (type == \"{\") return contCommasep(importSpec, \"}\");\n if (type == \"variable\") register(value);\n if (value == \"*\") cx.marked = \"keyword\";\n return cont(maybeAs);\n }\n function maybeMoreImports(type) {\n if (type == \",\") return cont(importSpec, maybeMoreImports)\n }\n function maybeAs(_type, value) {\n if (value == \"as\") { cx.marked = \"keyword\"; return cont(importSpec); }\n }\n function maybeFrom(_type, value) {\n if (value == \"from\") { cx.marked = \"keyword\"; return cont(expression); }\n }\n function arrayLiteral(type) {\n if (type == \"]\") return cont();\n return pass(commasep(expressionNoComma, \"]\"));\n }\n function enumdef() {\n return pass(pushlex(\"form\"), pattern, expect(\"{\"), pushlex(\"}\"), commasep(enummember, \"}\"), poplex, poplex)\n }\n function enummember() {\n return pass(pattern, maybeAssign);\n }\n\n function isContinuedStatement(state, textAfter) {\n return state.lastType == \"operator\" || state.lastType == \",\" ||\n isOperatorChar.test(textAfter.charAt(0)) ||\n /[,.]/.test(textAfter.charAt(0));\n }\n\n function expressionAllowed(stream, state, backUp) {\n return state.tokenize == tokenBase &&\n /^(?:operator|sof|keyword [bcd]|case|new|export|default|spread|[\\[{}\\(,;:]|=>)$/.test(state.lastType) ||\n (state.lastType == \"quasi\" && /\\{\\s*$/.test(stream.string.slice(0, stream.pos - (backUp || 0))))\n }\n\n // Interface\n\n return {\n startState: function(basecolumn) {\n var state = {\n tokenize: tokenBase,\n lastType: \"sof\",\n cc: [],\n lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, \"block\", false),\n localVars: parserConfig.localVars,\n context: parserConfig.localVars && new Context(null, null, false),\n indented: basecolumn || 0\n };\n if (parserConfig.globalVars && typeof parserConfig.globalVars == \"object\")\n state.globalVars = parserConfig.globalVars;\n return state;\n },\n\n token: function(stream, state) {\n if (stream.sol()) {\n if (!state.lexical.hasOwnProperty(\"align\"))\n state.lexical.align = false;\n state.indented = stream.indentation();\n findFatArrow(stream, state);\n }\n if (state.tokenize != tokenComment && stream.eatSpace()) return null;\n var style = state.tokenize(stream, state);\n if (type == \"comment\") return style;\n state.lastType = type == \"operator\" && (content == \"++\" || content == \"--\") ? \"incdec\" : type;\n return parseJS(state, style, type, content, stream);\n },\n\n indent: function(state, textAfter) {\n if (state.tokenize == tokenComment || state.tokenize == tokenQuasi) return CodeMirror.Pass;\n if (state.tokenize != tokenBase) return 0;\n var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical, top\n // Kludge to prevent 'maybelse' from blocking lexical scope pops\n if (!/^\\s*else\\b/.test(textAfter)) for (var i = state.cc.length - 1; i >= 0; --i) {\n var c = state.cc[i];\n if (c == poplex) lexical = lexical.prev;\n else if (c != maybeelse && c != popcontext) break;\n }\n while ((lexical.type == \"stat\" || lexical.type == \"form\") &&\n (firstChar == \"}\" || ((top = state.cc[state.cc.length - 1]) &&\n (top == maybeoperatorComma || top == maybeoperatorNoComma) &&\n !/^[,\\.=+\\-*:?[\\(]/.test(textAfter))))\n lexical = lexical.prev;\n if (statementIndent && lexical.type == \")\" && lexical.prev.type == \"stat\")\n lexical = lexical.prev;\n var type = lexical.type, closing = firstChar == type;\n\n if (type == \"vardef\") return lexical.indented + (state.lastType == \"operator\" || state.lastType == \",\" ? lexical.info.length + 1 : 0);\n else if (type == \"form\" && firstChar == \"{\") return lexical.indented;\n else if (type == \"form\") return lexical.indented + indentUnit;\n else if (type == \"stat\")\n return lexical.indented + (isContinuedStatement(state, textAfter) ? statementIndent || indentUnit : 0);\n else if (lexical.info == \"switch\" && !closing && parserConfig.doubleIndentSwitch != false)\n return lexical.indented + (/^(?:case|default)\\b/.test(textAfter) ? indentUnit : 2 * indentUnit);\n else if (lexical.align) return lexical.column + (closing ? 0 : 1);\n else return lexical.indented + (closing ? 0 : indentUnit);\n },\n\n electricInput: /^\\s*(?:case .*?:|default:|\\{|\\})$/,\n blockCommentStart: jsonMode ? null : \"/*\",\n blockCommentEnd: jsonMode ? null : \"*/\",\n blockCommentContinue: jsonMode ? null : \" * \",\n lineComment: jsonMode ? null : \"//\",\n fold: \"brace\",\n closeBrackets: \"()[]{}''\\\"\\\"``\",\n\n helperType: jsonMode ? \"json\" : \"javascript\",\n jsonldMode: jsonldMode,\n jsonMode: jsonMode,\n\n expressionAllowed: expressionAllowed,\n\n skipExpression: function(state) {\n var top = state.cc[state.cc.length - 1]\n if (top == expression || top == expressionNoComma) state.cc.pop()\n }\n };\n});\n\nCodeMirror.registerHelper(\"wordChars\", \"javascript\", /[\\w$]/);\n\nCodeMirror.defineMIME(\"text/javascript\", \"javascript\");\nCodeMirror.defineMIME(\"text/ecmascript\", \"javascript\");\nCodeMirror.defineMIME(\"application/javascript\", \"javascript\");\nCodeMirror.defineMIME(\"application/x-javascript\", \"javascript\");\nCodeMirror.defineMIME(\"application/ecmascript\", \"javascript\");\nCodeMirror.defineMIME(\"application/json\", { name: \"javascript\", json: true });\nCodeMirror.defineMIME(\"application/x-json\", { name: \"javascript\", json: true });\nCodeMirror.defineMIME(\"application/manifest+json\", { name: \"javascript\", json: true })\nCodeMirror.defineMIME(\"application/ld+json\", { name: \"javascript\", jsonld: true });\nCodeMirror.defineMIME(\"text/typescript\", { name: \"javascript\", typescript: true });\nCodeMirror.defineMIME(\"application/typescript\", { name: \"javascript\", typescript: true });\n\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vbm9kZV9tb2R1bGVzL2NvZGVtaXJyb3IvbW9kZS9qYXZhc2NyaXB0L2phdmFzY3JpcHQuanM/ZjlkNCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUVBO0FBQ0EsTUFBTSxJQUF1RDtBQUM3RCxRQUFRLG1CQUFPLENBQUMseUVBQXNCO0FBQ3RDLE9BQU8sRUFHYTtBQUNwQixDQUFDO0FBQ0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLHVCQUF1QixRQUFRO0FBQy9CO0FBQ0EsMkNBQTJDOztBQUUzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUssa0JBQWtCLE1BQU07QUFDN0I7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUF5QjtBQUN4RTtBQUNBO0FBQ0EsMEJBQTBCLHVCQUF1Qix5QkFBeUI7QUFDMUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1ELGNBQWMsMkJBQTJCO0FBQzVGO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDBFQUEwRSxJQUFJO0FBQzlFLHVDQUF1QztBQUN2Qzs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwRUFBMEUsUUFBUTtBQUNsRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGdEQUFnRDtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUwsZ0RBQWdELEdBQUc7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjs7QUFFMUI7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkMsaUNBQWlDO0FBQzVFLDZDQUE2QyxpQ0FBaUM7QUFDOUUsb0RBQW9ELGlDQUFpQztBQUNyRiw4Q0FBOEMsbUNBQW1DO0FBQ2pGLDBDQUEwQyx1Q0FBdUM7QUFDakYsaURBQWlELHVDQUF1Qzs7QUFFeEYsQ0FBQyIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9jb2RlbWlycm9yL21vZGUvamF2YXNjcmlwdC9qYXZhc2NyaXB0LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnNcbi8vIERpc3RyaWJ1dGVkIHVuZGVyIGFuIE1JVCBsaWNlbnNlOiBodHRwczovL2NvZGVtaXJyb3IubmV0L0xJQ0VOU0VcblxuKGZ1bmN0aW9uKG1vZCkge1xuICBpZiAodHlwZW9mIGV4cG9ydHMgPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgbW9kdWxlID09IFwib2JqZWN0XCIpIC8vIENvbW1vbkpTXG4gICAgbW9kKHJlcXVpcmUoXCIuLi8uLi9saWIvY29kZW1pcnJvclwiKSk7XG4gIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIC8vIEFNRFxuICAgIGRlZmluZShbXCIuLi8uLi9saWIvY29kZW1pcnJvclwiXSwgbW9kKTtcbiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudlxuICAgIG1vZChDb2RlTWlycm9yKTtcbn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHtcblwidXNlIHN0cmljdFwiO1xuXG5Db2RlTWlycm9yLmRlZmluZU1vZGUoXCJqYXZhc2NyaXB0XCIsIGZ1bmN0aW9uKGNvbmZpZywgcGFyc2VyQ29uZmlnKSB7XG4gIHZhciBpbmRlbnRVbml0ID0gY29uZmlnLmluZGVudFVuaXQ7XG4gIHZhciBzdGF0ZW1lbnRJbmRlbnQgPSBwYXJzZXJDb25maWcuc3RhdGVtZW50SW5kZW50O1xuICB2YXIganNvbmxkTW9kZSA9IHBhcnNlckNvbmZpZy5qc29ubGQ7XG4gIHZhciBqc29uTW9kZSA9IHBhcnNlckNvbmZpZy5qc29uIHx8IGpzb25sZE1vZGU7XG4gIHZhciB0cmFja1Njb3BlID0gcGFyc2VyQ29uZmlnLnRyYWNrU2NvcGUgIT09IGZhbHNlXG4gIHZhciBpc1RTID0gcGFyc2VyQ29uZmlnLnR5cGVzY3JpcHQ7XG4gIHZhciB3b3JkUkUgPSBwYXJzZXJDb25maWcud29yZENoYXJhY3RlcnMgfHwgL1tcXHckXFx4YTEtXFx1ZmZmZl0vO1xuXG4gIC8vIFRva2VuaXplclxuXG4gIHZhciBrZXl3b3JkcyA9IGZ1bmN0aW9uKCl7XG4gICAgZnVuY3Rpb24ga3codHlwZSkge3JldHVybiB7dHlwZTogdHlwZSwgc3R5bGU6IFwia2V5d29yZFwifTt9XG4gICAgdmFyIEEgPSBrdyhcImtleXdvcmQgYVwiKSwgQiA9IGt3KFwia2V5d29yZCBiXCIpLCBDID0ga3coXCJrZXl3b3JkIGNcIiksIEQgPSBrdyhcImtleXdvcmQgZFwiKTtcbiAgICB2YXIgb3BlcmF0b3IgPSBrdyhcIm9wZXJhdG9yXCIpLCBhdG9tID0ge3R5cGU6IFwiYXRvbVwiLCBzdHlsZTogXCJhdG9tXCJ9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIFwiaWZcIjoga3coXCJpZlwiKSwgXCJ3aGlsZVwiOiBBLCBcIndpdGhcIjogQSwgXCJlbHNlXCI6IEIsIFwiZG9cIjogQiwgXCJ0cnlcIjogQiwgXCJmaW5hbGx5XCI6IEIsXG4gICAgICBcInJldHVyblwiOiBELCBcImJyZWFrXCI6IEQsIFwiY29udGludWVcIjogRCwgXCJuZXdcIjoga3coXCJuZXdcIiksIFwiZGVsZXRlXCI6IEMsIFwidm9pZFwiOiBDLCBcInRocm93XCI6IEMsXG4gICAgICBcImRlYnVnZ2VyXCI6IGt3KFwiZGVidWdnZXJcIiksIFwidmFyXCI6IGt3KFwidmFyXCIpLCBcImNvbnN0XCI6IGt3KFwidmFyXCIpLCBcImxldFwiOiBrdyhcInZhclwiKSxcbiAgICAgIFwiZnVuY3Rpb25cIjoga3coXCJmdW5jdGlvblwiKSwgXCJjYXRjaFwiOiBrdyhcImNhdGNoXCIpLFxuICAgICAgXCJmb3JcIjoga3coXCJmb3JcIiksIFwic3dpdGNoXCI6IGt3KFwic3dpdGNoXCIpLCBcImNhc2VcIjoga3coXCJjYXNlXCIpLCBcImRlZmF1bHRcIjoga3coXCJkZWZhdWx0XCIpLFxuICAgICAgXCJpblwiOiBvcGVyYXRvciwgXCJ0eXBlb2ZcIjogb3BlcmF0b3IsIFwiaW5zdGFuY2VvZlwiOiBvcGVyYXRvcixcbiAgICAgIFwidHJ1ZVwiOiBhdG9tLCBcImZhbHNlXCI6IGF0b20sIFwibnVsbFwiOiBhdG9tLCBcInVuZGVmaW5lZFwiOiBhdG9tLCBcIk5hTlwiOiBhdG9tLCBcIkluZmluaXR5XCI6IGF0b20sXG4gICAgICBcInRoaXNcIjoga3coXCJ0aGlzXCIpLCBcImNsYXNzXCI6IGt3KFwiY2xhc3NcIiksIFwic3VwZXJcIjoga3coXCJhdG9tXCIpLFxuICAgICAgXCJ5aWVsZFwiOiBDLCBcImV4cG9ydFwiOiBrdyhcImV4cG9ydFwiKSwgXCJpbXBvcnRcIjoga3coXCJpbXBvcnRcIiksIFwiZXh0ZW5kc1wiOiBDLFxuICAgICAgXCJhd2FpdFwiOiBDXG4gICAgfTtcbiAgfSgpO1xuXG4gIHZhciBpc09wZXJhdG9yQ2hhciA9IC9bK1xcLSomJT08PiE/fH5eQF0vO1xuICB2YXIgaXNKc29ubGRLZXl3b3JkID0gL15AKGNvbnRleHR8aWR8dmFsdWV8bGFuZ3VhZ2V8dHlwZXxjb250YWluZXJ8bGlzdHxzZXR8cmV2ZXJzZXxpbmRleHxiYXNlfHZvY2FifGdyYXBoKVwiLztcblxuICBmdW5jdGlvbiByZWFkUmVnZXhwKHN0cmVhbSkge1xuICAgIHZhciBlc2NhcGVkID0gZmFsc2UsIG5leHQsIGluU2V0ID0gZmFsc2U7XG4gICAgd2hpbGUgKChuZXh0ID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkge1xuICAgICAgaWYgKCFlc2NhcGVkKSB7XG4gICAgICAgIGlmIChuZXh0ID09IFwiL1wiICYmICFpblNldCkgcmV0dXJuO1xuICAgICAgICBpZiAobmV4dCA9PSBcIltcIikgaW5TZXQgPSB0cnVlO1xuICAgICAgICBlbHNlIGlmIChpblNldCAmJiBuZXh0ID09IFwiXVwiKSBpblNldCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIG5leHQgPT0gXCJcXFxcXCI7XG4gICAgfVxuICB9XG5cbiAgLy8gVXNlZCBhcyBzY3JhdGNoIHZhcmlhYmxlcyB0byBjb21tdW5pY2F0ZSBtdWx0aXBsZSB2YWx1ZXMgd2l0aG91dFxuICAvLyBjb25zaW5nIHVwIHRvbnMgb2Ygb2JqZWN0cy5cbiAgdmFyIHR5cGUsIGNvbnRlbnQ7XG4gIGZ1bmN0aW9uIHJldCh0cCwgc3R5bGUsIGNvbnQpIHtcbiAgICB0eXBlID0gdHA7IGNvbnRlbnQgPSBjb250O1xuICAgIHJldHVybiBzdHlsZTtcbiAgfVxuICBmdW5jdGlvbiB0b2tlbkJhc2Uoc3RyZWFtLCBzdGF0ZSkge1xuICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCk7XG4gICAgaWYgKGNoID09ICdcIicgfHwgY2ggPT0gXCInXCIpIHtcbiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5TdHJpbmcoY2gpO1xuICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpO1xuICAgIH0gZWxzZSBpZiAoY2ggPT0gXCIuXCIgJiYgc3RyZWFtLm1hdGNoKC9eXFxkW1xcZF9dKig/OltlRV1bK1xcLV0/W1xcZF9dKyk/LykpIHtcbiAgICAgIHJldHVybiByZXQoXCJudW1iZXJcIiwgXCJudW1iZXJcIik7XG4gICAgfSBlbHNlIGlmIChjaCA9PSBcIi5cIiAmJiBzdHJlYW0ubWF0Y2goXCIuLlwiKSkge1xuICAgICAgcmV0dXJuIHJldChcInNwcmVhZFwiLCBcIm1ldGFcIik7XG4gICAgfSBlbHNlIGlmICgvW1xcW1xcXXt9XFwoXFwpLDtcXDpcXC5dLy50ZXN0KGNoKSkge1xuICAgICAgcmV0dXJuIHJldChjaCk7XG4gICAgfSBlbHNlIGlmIChjaCA9PSBcIj1cIiAmJiBzdHJlYW0uZWF0KFwiPlwiKSkge1xuICAgICAgcmV0dXJuIHJldChcIj0+XCIsIFwib3BlcmF0b3JcIik7XG4gICAgfSBlbHNlIGlmIChjaCA9PSBcIjBcIiAmJiBzdHJlYW0ubWF0Y2goL14oPzp4W1xcZEEtRmEtZl9dK3xvWzAtN19dK3xiWzAxX10rKW4/LykpIHtcbiAgICAgIHJldHVybiByZXQoXCJudW1iZXJcIiwgXCJudW1iZXJcIik7XG4gICAgfSBlbHNlIGlmICgvXFxkLy50ZXN0KGNoKSkge1xuICAgICAgc3RyZWFtLm1hdGNoKC9eW1xcZF9dKig/Om58KD86XFwuW1xcZF9dKik/KD86W2VFXVsrXFwtXT9bXFxkX10rKT8pPy8pO1xuICAgICAgcmV0dXJuIHJldChcIm51bWJlclwiLCBcIm51bWJlclwiKTtcbiAgICB9IGVsc2UgaWYgKGNoID09IFwiL1wiKSB7XG4gICAgICBpZiAoc3RyZWFtLmVhdChcIipcIikpIHtcbiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkNvbW1lbnQ7XG4gICAgICAgIHJldHVybiB0b2tlbkNvbW1lbnQoc3RyZWFtLCBzdGF0ZSk7XG4gICAgICB9IGVsc2UgaWYgKHN0cmVhbS5lYXQoXCIvXCIpKSB7XG4gICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTtcbiAgICAgICAgcmV0dXJuIHJldChcImNvbW1lbnRcIiwgXCJjb21tZW50XCIpO1xuICAgICAgfSBlbHNlIGlmIChleHByZXNzaW9uQWxsb3dlZChzdHJlYW0sIHN0YXRlLCAxKSkge1xuICAgICAgICByZWFkUmVnZXhwKHN0cmVhbSk7XG4gICAgICAgIHN0cmVhbS5tYXRjaCgvXlxcYigoW2dpbXl1c10pKD8hW2dpbXl1c10qXFwyKSkrXFxiLyk7XG4gICAgICAgIHJldHVybiByZXQoXCJyZWdleHBcIiwgXCJzdHJpbmctMlwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0cmVhbS5lYXQoXCI9XCIpO1xuICAgICAgICByZXR1cm4gcmV0KFwib3BlcmF0b3JcIiwgXCJvcGVyYXRvclwiLCBzdHJlYW0uY3VycmVudCgpKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNoID09IFwiYFwiKSB7XG4gICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuUXVhc2k7XG4gICAgICByZXR1cm4gdG9rZW5RdWFzaShzdHJlYW0sIHN0YXRlKTtcbiAgICB9IGVsc2UgaWYgKGNoID09IFwiI1wiICYmIHN0cmVhbS5wZWVrKCkgPT0gXCIhXCIpIHtcbiAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTtcbiAgICAgIHJldHVybiByZXQoXCJtZXRhXCIsIFwibWV0YVwiKTtcbiAgICB9IGVsc2UgaWYgKGNoID09IFwiI1wiICYmIHN0cmVhbS5lYXRXaGlsZSh3b3JkUkUpKSB7XG4gICAgICByZXR1cm4gcmV0KFwidmFyaWFibGVcIiwgXCJwcm9wZXJ0eVwiKVxuICAgIH0gZWxzZSBpZiAoY2ggPT0gXCI8XCIgJiYgc3RyZWFtLm1hdGNoKFwiIS0tXCIpIHx8XG4gICAgICAgICAgICAgICAoY2ggPT0gXCItXCIgJiYgc3RyZWFtLm1hdGNoKFwiLT5cIikgJiYgIS9cXFMvLnRlc3Qoc3RyZWFtLnN0cmluZy5zbGljZSgwLCBzdHJlYW0uc3RhcnQpKSkpIHtcbiAgICAgIHN0cmVhbS5za2lwVG9FbmQoKVxuICAgICAgcmV0dXJuIHJldChcImNvbW1lbnRcIiwgXCJjb21tZW50XCIpXG4gICAgfSBlbHNlIGlmIChpc09wZXJhdG9yQ2hhci50ZXN0KGNoKSkge1xuICAgICAgaWYgKGNoICE9IFwiPlwiIHx8ICFzdGF0ZS5sZXhpY2FsIHx8IHN0YXRlLmxleGljYWwudHlwZSAhPSBcIj5cIikge1xuICAgICAgICBpZiAoc3RyZWFtLmVhdChcIj1cIikpIHtcbiAgICAgICAgICBpZiAoY2ggPT0gXCIhXCIgfHwgY2ggPT0gXCI9XCIpIHN0cmVhbS5lYXQoXCI9XCIpXG4gICAgICAgIH0gZWxzZSBpZiAoL1s8PiorXFwtfCY/XS8udGVzdChjaCkpIHtcbiAgICAgICAgICBzdHJlYW0uZWF0KGNoKVxuICAgICAgICAgIGlmIChjaCA9PSBcIj5cIikgc3RyZWFtLmVhdChjaClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGNoID09IFwiP1wiICYmIHN0cmVhbS5lYXQoXCIuXCIpKSByZXR1cm4gcmV0KFwiLlwiKVxuICAgICAgcmV0dXJuIHJldChcIm9wZXJhdG9yXCIsIFwib3BlcmF0b3JcIiwgc3RyZWFtLmN1cnJlbnQoKSk7XG4gICAgfSBlbHNlIGlmICh3b3JkUkUudGVzdChjaCkpIHtcbiAgICAgIHN0cmVhbS5lYXRXaGlsZSh3b3JkUkUpO1xuICAgICAgdmFyIHdvcmQgPSBzdHJlYW0uY3VycmVudCgpXG4gICAgICBpZiAoc3RhdGUubGFzdFR5cGUgIT0gXCIuXCIpIHtcbiAgICAgICAgaWYgKGtleXdvcmRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKHdvcmQpKSB7XG4gICAgICAgICAgdmFyIGt3ID0ga2V5d29yZHNbd29yZF1cbiAgICAgICAgICByZXR1cm4gcmV0KGt3LnR5cGUsIGt3LnN0eWxlLCB3b3JkKVxuICAgICAgICB9XG4gICAgICAgIGlmICh3b3JkID09IFwiYXN5bmNcIiAmJiBzdHJlYW0ubWF0Y2goL14oXFxzfFxcL1xcKihbXipdfFxcKig/IVxcLykpKj9cXCpcXC8pKltcXFtcXChcXHddLywgZmFsc2UpKVxuICAgICAgICAgIHJldHVybiByZXQoXCJhc3luY1wiLCBcImtleXdvcmRcIiwgd29yZClcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXQoXCJ2YXJpYWJsZVwiLCBcInZhcmlhYmxlXCIsIHdvcmQpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdG9rZW5TdHJpbmcocXVvdGUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkge1xuICAgICAgdmFyIGVzY2FwZWQgPSBmYWxzZSwgbmV4dDtcbiAgICAgIGlmIChqc29ubGRNb2RlICYmIHN0cmVhbS5wZWVrKCkgPT0gXCJAXCIgJiYgc3RyZWFtLm1hdGNoKGlzSnNvbmxkS2V5d29yZCkpe1xuICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTtcbiAgICAgICAgcmV0dXJuIHJldChcImpzb25sZC1rZXl3b3JkXCIsIFwibWV0YVwiKTtcbiAgICAgIH1cbiAgICAgIHdoaWxlICgobmV4dCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHtcbiAgICAgICAgaWYgKG5leHQgPT0gcXVvdGUgJiYgIWVzY2FwZWQpIGJyZWFrO1xuICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgbmV4dCA9PSBcIlxcXFxcIjtcbiAgICAgIH1cbiAgICAgIGlmICghZXNjYXBlZCkgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7XG4gICAgICByZXR1cm4gcmV0KFwic3RyaW5nXCIsIFwic3RyaW5nXCIpO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiB0b2tlbkNvbW1lbnQoc3RyZWFtLCBzdGF0ZSkge1xuICAgIHZhciBtYXliZUVuZCA9IGZhbHNlLCBjaDtcbiAgICB3aGlsZSAoY2ggPSBzdHJlYW0ubmV4dCgpKSB7XG4gICAgICBpZiAoY2ggPT0gXCIvXCIgJiYgbWF5YmVFbmQpIHtcbiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgbWF5YmVFbmQgPSAoY2ggPT0gXCIqXCIpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0KFwiY29tbWVudFwiLCBcImNvbW1lbnRcIik7XG4gIH1cblxuICBmdW5jdGlvbiB0b2tlblF1YXNpKHN0cmVhbSwgc3RhdGUpIHtcbiAgICB2YXIgZXNjYXBlZCA9IGZhbHNlLCBuZXh0O1xuICAgIHdoaWxlICgobmV4dCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHtcbiAgICAgIGlmICghZXNjYXBlZCAmJiAobmV4dCA9PSBcImBcIiB8fCBuZXh0ID09IFwiJFwiICYmIHN0cmVhbS5lYXQoXCJ7XCIpKSkge1xuICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgbmV4dCA9PSBcIlxcXFxcIjtcbiAgICB9XG4gICAgcmV0dXJuIHJldChcInF1YXNpXCIsIFwic3RyaW5nLTJcIiwgc3RyZWFtLmN1cnJlbnQoKSk7XG4gIH1cblxuICB2YXIgYnJhY2tldHMgPSBcIihbe31dKVwiO1xuICAvLyBUaGlzIGlzIGEgY3J1ZGUgbG9va2FoZWFkIHRyaWNrIHRvIHRyeSBhbmQgbm90aWNlIHRoYXQgd2UncmVcbiAgLy8gcGFyc2luZyB0aGUgYXJndW1lbnQgcGF0dGVybnMgZm9yIGEgZmF0LWFycm93IGZ1bmN0aW9uIGJlZm9yZSB3ZVxuICAvLyBhY3R1YWxseSBoaXQgdGhlIGFycm93IHRva2VuLiBJdCBvbmx5IHdvcmtzIGlmIHRoZSBhcnJvdyBpcyBvblxuICAvLyB0aGUgc2FtZSBsaW5lIGFzIHRoZSBhcmd1bWVudHMgYW5kIHRoZXJlJ3Mgbm8gc3RyYW5nZSBub2lzZVxuICAvLyAoY29tbWVudHMpIGluIGJldHdlZW4uIEZhbGxiYWNrIGlzIHRvIG9ubHkgbm90aWNlIHdoZW4gd2UgaGl0IHRoZVxuICAvLyBhcnJvdywgYW5kIG5vdCBkZWNsYXJlIHRoZSBhcmd1bWVudHMgYXMgbG9jYWxzIGZvciB0aGUgYXJyb3dcbiAgLy8gYm9keS5cbiAgZnVuY3Rpb24gZmluZEZhdEFycm93KHN0cmVhbSwgc3RhdGUpIHtcbiAgICBpZiAoc3RhdGUuZmF0QXJyb3dBdCkgc3RhdGUuZmF0QXJyb3dBdCA9IG51bGw7XG4gICAgdmFyIGFycm93ID0gc3RyZWFtLnN0cmluZy5pbmRleE9mKFwiPT5cIiwgc3RyZWFtLnN0YXJ0KTtcbiAgICBpZiAoYXJyb3cgPCAwKSByZXR1cm47XG5cbiAgICBpZiAoaXNUUykgeyAvLyBUcnkgdG8gc2tpcCBUeXBlU2NyaXB0IHJldHVybiB0eXBlIGRlY2xhcmF0aW9ucyBhZnRlciB0aGUgYXJndW1lbnRzXG4gICAgICB2YXIgbSA9IC86XFxzKig/OlxcdysoPzo8W14+XSo+fFxcW1xcXSk/fFxce1tefV0qXFx9KVxccyokLy5leGVjKHN0cmVhbS5zdHJpbmcuc2xpY2Uoc3RyZWFtLnN0YXJ0LCBhcnJvdykpXG4gICAgICBpZiAobSkgYXJyb3cgPSBtLmluZGV4XG4gICAgfVxuXG4gICAgdmFyIGRlcHRoID0gMCwgc2F3U29tZXRoaW5nID0gZmFsc2U7XG4gICAgZm9yICh2YXIgcG9zID0gYXJyb3cgLSAxOyBwb3MgPj0gMDsgLS1wb3MpIHtcbiAgICAgIHZhciBjaCA9IHN0cmVhbS5zdHJpbmcuY2hhckF0KHBvcyk7XG4gICAgICB2YXIgYnJhY2tldCA9IGJyYWNrZXRzLmluZGV4T2YoY2gpO1xuICAgICAgaWYgKGJyYWNrZXQgPj0gMCAmJiBicmFja2V0IDwgMykge1xuICAgICAgICBpZiAoIWRlcHRoKSB7ICsrcG9zOyBicmVhazsgfVxuICAgICAgICBpZiAoLS1kZXB0aCA9PSAwKSB7IGlmIChjaCA9PSBcIihcIikgc2F3U29tZXRoaW5nID0gdHJ1ZTsgYnJlYWs7IH1cbiAgICAgIH0gZWxzZSBpZiAoYnJhY2tldCA+PSAzICYmIGJyYWNrZXQgPCA2KSB7XG4gICAgICAgICsrZGVwdGg7XG4gICAgICB9IGVsc2UgaWYgKHdvcmRSRS50ZXN0KGNoKSkge1xuICAgICAgICBzYXdTb21ldGhpbmcgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmICgvW1wiJ1xcL2BdLy50ZXN0KGNoKSkge1xuICAgICAgICBmb3IgKDs7IC0tcG9zKSB7XG4gICAgICAgICAgaWYgKHBvcyA9PSAwKSByZXR1cm5cbiAgICAgICAgICB2YXIgbmV4dCA9IHN0cmVhbS5zdHJpbmcuY2hhckF0KHBvcyAtIDEpXG4gICAgICAgICAgaWYgKG5leHQgPT0gY2ggJiYgc3RyZWFtLnN0cmluZy5jaGFyQXQocG9zIC0gMikgIT0gXCJcXFxcXCIpIHsgcG9zLS07IGJyZWFrIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzYXdTb21ldGhpbmcgJiYgIWRlcHRoKSB7XG4gICAgICAgICsrcG9zO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNhd1NvbWV0aGluZyAmJiAhZGVwdGgpIHN0YXRlLmZhdEFycm93QXQgPSBwb3M7XG4gIH1cblxuICAvLyBQYXJzZXJcblxuICB2YXIgYXRvbWljVHlwZXMgPSB7XCJhdG9tXCI6IHRydWUsIFwibnVtYmVyXCI6IHRydWUsIFwidmFyaWFibGVcIjogdHJ1ZSwgXCJzdHJpbmdcIjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgIFwicmVnZXhwXCI6IHRydWUsIFwidGhpc1wiOiB0cnVlLCBcImltcG9ydFwiOiB0cnVlLCBcImpzb25sZC1rZXl3b3JkXCI6IHRydWV9O1xuXG4gIGZ1bmN0aW9uIEpTTGV4aWNhbChpbmRlbnRlZCwgY29sdW1uLCB0eXBlLCBhbGlnbiwgcHJldiwgaW5mbykge1xuICAgIHRoaXMuaW5kZW50ZWQgPSBpbmRlbnRlZDtcbiAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjtcbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgIHRoaXMucHJldiA9IHByZXY7XG4gICAgdGhpcy5pbmZvID0gaW5mbztcbiAgICBpZiAoYWxpZ24gIT0gbnVsbCkgdGhpcy5hbGlnbiA9IGFsaWduO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5TY29wZShzdGF0ZSwgdmFybmFtZSkge1xuICAgIGlmICghdHJhY2tTY29wZSkgcmV0dXJuIGZhbHNlXG4gICAgZm9yICh2YXIgdiA9IHN0YXRlLmxvY2FsVmFyczsgdjsgdiA9IHYubmV4dClcbiAgICAgIGlmICh2Lm5hbWUgPT0gdmFybmFtZSkgcmV0dXJuIHRydWU7XG4gICAgZm9yICh2YXIgY3ggPSBzdGF0ZS5jb250ZXh0OyBjeDsgY3ggPSBjeC5wcmV2KSB7XG4gICAgICBmb3IgKHZhciB2ID0gY3gudmFyczsgdjsgdiA9IHYubmV4dClcbiAgICAgICAgaWYgKHYubmFtZSA9PSB2YXJuYW1lKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZUpTKHN0YXRlLCBzdHlsZSwgdHlwZSwgY29udGVudCwgc3RyZWFtKSB7XG4gICAgdmFyIGNjID0gc3RhdGUuY2M7XG4gICAgLy8gQ29tbXVuaWNhdGUgb3VyIGNvbnRleHQgdG8gdGhlIGNvbWJpbmF0b3JzLlxuICAgIC8vIChMZXNzIHdhc3RlZnVsIHRoYW4gY29uc2luZyB1cCBhIGh1bmRyZWQgY2xvc3VyZXMgb24gZXZlcnkgY2FsbC4pXG4gICAgY3guc3RhdGUgPSBzdGF0ZTsgY3guc3RyZWFtID0gc3RyZWFtOyBjeC5tYXJrZWQgPSBudWxsLCBjeC5jYyA9IGNjOyBjeC5zdHlsZSA9IHN0eWxlO1xuXG4gICAgaWYgKCFzdGF0ZS5sZXhpY2FsLmhhc093blByb3BlcnR5KFwiYWxpZ25cIikpXG4gICAgICBzdGF0ZS5sZXhpY2FsLmFsaWduID0gdHJ1ZTtcblxuICAgIHdoaWxlKHRydWUpIHtcbiAgICAgIHZhciBjb21iaW5hdG9yID0gY2MubGVuZ3RoID8gY2MucG9wKCkgOiBqc29uTW9kZSA/IGV4cHJlc3Npb24gOiBzdGF0ZW1lbnQ7XG4gICAgICBpZiAoY29tYmluYXRvcih0eXBlLCBjb250ZW50KSkge1xuICAgICAgICB3aGlsZShjYy5sZW5ndGggJiYgY2NbY2MubGVuZ3RoIC0gMV0ubGV4KVxuICAgICAgICAgIGNjLnBvcCgpKCk7XG4gICAgICAgIGlmIChjeC5tYXJrZWQpIHJldHVybiBjeC5tYXJrZWQ7XG4gICAgICAgIGlmICh0eXBlID09IFwidmFyaWFibGVcIiAmJiBpblNjb3BlKHN0YXRlLCBjb250ZW50KSkgcmV0dXJuIFwidmFyaWFibGUtMlwiO1xuICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQ29tYmluYXRvciB1dGlsc1xuXG4gIHZhciBjeCA9IHtzdGF0ZTogbnVsbCwgY29sdW1uOiBudWxsLCBtYXJrZWQ6IG51bGwsIGNjOiBudWxsfTtcbiAgZnVuY3Rpb24gcGFzcygpIHtcbiAgICBmb3IgKHZhciBpID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBjeC5jYy5wdXNoKGFyZ3VtZW50c1tpXSk7XG4gIH1cbiAgZnVuY3Rpb24gY29udCgpIHtcbiAgICBwYXNzLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZnVuY3Rpb24gaW5MaXN0KG5hbWUsIGxpc3QpIHtcbiAgICBmb3IgKHZhciB2ID0gbGlzdDsgdjsgdiA9IHYubmV4dCkgaWYgKHYubmFtZSA9PSBuYW1lKSByZXR1cm4gdHJ1ZVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBmdW5jdGlvbiByZWdpc3Rlcih2YXJuYW1lKSB7XG4gICAgdmFyIHN0YXRlID0gY3guc3RhdGU7XG4gICAgY3gubWFya2VkID0gXCJkZWZcIjtcbiAgICBpZiAoIXRyYWNrU2NvcGUpIHJldHVyblxuICAgIGlmIChzdGF0ZS5jb250ZXh0KSB7XG4gICAgICBpZiAoc3RhdGUubGV4aWNhbC5pbmZvID09IFwidmFyXCIgJiYgc3RhdGUuY29udGV4dCAmJiBzdGF0ZS5jb250ZXh0LmJsb2NrKSB7XG4gICAgICAgIC8vIEZJWE1FIGZ1bmN0aW9uIGRlY2xzIGFyZSBhbHNvIG5vdCBibG9jayBzY29wZWRcbiAgICAgICAgdmFyIG5ld0NvbnRleHQgPSByZWdpc3RlclZhclNjb3BlZCh2YXJuYW1lLCBzdGF0ZS5jb250ZXh0KVxuICAgICAgICBpZiAobmV3Q29udGV4dCAhPSBudWxsKSB7XG4gICAgICAgICAgc3RhdGUuY29udGV4dCA9IG5ld0NvbnRleHRcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghaW5MaXN0KHZhcm5hbWUsIHN0YXRlLmxvY2FsVmFycykpIHtcbiAgICAgICAgc3RhdGUubG9jYWxWYXJzID0gbmV3IFZhcih2YXJuYW1lLCBzdGF0ZS5sb2NhbFZhcnMpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cbiAgICAvLyBGYWxsIHRocm91Z2ggbWVhbnMgdGhpcyBpcyBnbG9iYWxcbiAgICBpZiAocGFyc2VyQ29uZmlnLmdsb2JhbFZhcnMgJiYgIWluTGlzdCh2YXJuYW1lLCBzdGF0ZS5nbG9iYWxWYXJzKSlcbiAgICAgIHN0YXRlLmdsb2JhbFZhcnMgPSBuZXcgVmFyKHZhcm5hbWUsIHN0YXRlLmdsb2JhbFZhcnMpXG4gIH1cbiAgZnVuY3Rpb24gcmVnaXN0ZXJWYXJTY29wZWQodmFybmFtZSwgY29udGV4dCkge1xuICAgIGlmICghY29udGV4dCkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9IGVsc2UgaWYgKGNvbnRleHQuYmxvY2spIHtcbiAgICAgIHZhciBpbm5lciA9IHJlZ2lzdGVyVmFyU2NvcGVkKHZhcm5hbWUsIGNvbnRleHQucHJldilcbiAgICAgIGlmICghaW5uZXIpIHJldHVybiBudWxsXG4gICAgICBpZiAoaW5uZXIgPT0gY29udGV4dC5wcmV2KSByZXR1cm4gY29udGV4dFxuICAgICAgcmV0dXJuIG5ldyBDb250ZXh0KGlubmVyLCBjb250ZXh0LnZhcnMsIHRydWUpXG4gICAgfSBlbHNlIGlmIChpbkxpc3QodmFybmFtZSwgY29udGV4dC52YXJzKSkge1xuICAgICAgcmV0dXJuIGNvbnRleHRcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBDb250ZXh0KGNvbnRleHQucHJldiwgbmV3IFZhcih2YXJuYW1lLCBjb250ZXh0LnZhcnMpLCBmYWxzZSlcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpc01vZGlmaWVyKG5hbWUpIHtcbiAgICByZXR1cm4gbmFtZSA9PSBcInB1YmxpY1wiIHx8IG5hbWUgPT0gXCJwcml2YXRlXCIgfHwgbmFtZSA9PSBcInByb3RlY3RlZFwiIHx8IG5hbWUgPT0gXCJhYnN0cmFjdFwiIHx8IG5hbWUgPT0gXCJyZWFkb25seVwiXG4gIH1cblxuICAvLyBDb21iaW5hdG9yc1xuXG4gIGZ1bmN0aW9uIENvbnRleHQocHJldiwgdmFycywgYmxvY2spIHsgdGhpcy5wcmV2ID0gcHJldjsgdGhpcy52YXJzID0gdmFyczsgdGhpcy5ibG9jayA9IGJsb2NrIH1cbiAgZnVuY3Rpb24gVmFyKG5hbWUsIG5leHQpIHsgdGhpcy5uYW1lID0gbmFtZTsgdGhpcy5uZXh0ID0gbmV4dCB9XG5cbiAgdmFyIGRlZmF1bHRWYXJzID0gbmV3IFZhcihcInRoaXNcIiwgbmV3IFZhcihcImFyZ3VtZW50c1wiLCBudWxsKSlcbiAgZnVuY3Rpb24gcHVzaGNvbnRleHQoKSB7XG4gICAgY3guc3RhdGUuY29udGV4dCA9IG5ldyBDb250ZXh0KGN4LnN0YXRlLmNvbnRleHQsIGN4LnN0YXRlLmxvY2FsVmFycywgZmFsc2UpXG4gICAgY3guc3RhdGUubG9jYWxWYXJzID0gZGVmYXVsdFZhcnNcbiAgfVxuICBmdW5jdGlvbiBwdXNoYmxvY2tjb250ZXh0KCkge1xuICAgIGN4LnN0YXRlLmNvbnRleHQgPSBuZXcgQ29udGV4dChjeC5zdGF0ZS5jb250ZXh0LCBjeC5zdGF0ZS5sb2NhbFZhcnMsIHRydWUpXG4gICAgY3guc3RhdGUubG9jYWxWYXJzID0gbnVsbFxuICB9XG4gIGZ1bmN0aW9uIHBvcGNvbnRleHQoKSB7XG4gICAgY3guc3RhdGUubG9jYWxWYXJzID0gY3guc3RhdGUuY29udGV4dC52YXJzXG4gICAgY3guc3RhdGUuY29udGV4dCA9IGN4LnN0YXRlLmNvbnRleHQucHJldlxuICB9XG4gIHBvcGNvbnRleHQubGV4ID0gdHJ1ZVxuICBmdW5jdGlvbiBwdXNobGV4KHR5cGUsIGluZm8pIHtcbiAgICB2YXIgcmVzdWx0ID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc3RhdGUgPSBjeC5zdGF0ZSwgaW5kZW50ID0gc3RhdGUuaW5kZW50ZWQ7XG4gICAgICBpZiAoc3RhdGUubGV4aWNhbC50eXBlID09IFwic3RhdFwiKSBpbmRlbnQgPSBzdGF0ZS5sZXhpY2FsLmluZGVudGVkO1xuICAgICAgZWxzZSBmb3IgKHZhciBvdXRlciA9IHN0YXRlLmxleGljYWw7IG91dGVyICYmIG91dGVyLnR5cGUgPT0gXCIpXCIgJiYgb3V0ZXIuYWxpZ247IG91dGVyID0gb3V0ZXIucHJldilcbiAgICAgICAgaW5kZW50ID0gb3V0ZXIuaW5kZW50ZWQ7XG4gICAgICBzdGF0ZS5sZXhpY2FsID0gbmV3IEpTTGV4aWNhbChpbmRlbnQsIGN4LnN0cmVhbS5jb2x1bW4oKSwgdHlwZSwgbnVsbCwgc3RhdGUubGV4aWNhbCwgaW5mbyk7XG4gICAgfTtcbiAgICByZXN1bHQubGV4ID0gdHJ1ZTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGZ1bmN0aW9uIHBvcGxleCgpIHtcbiAgICB2YXIgc3RhdGUgPSBjeC5zdGF0ZTtcbiAgICBpZiAoc3RhdGUubGV4aWNhbC5wcmV2KSB7XG4gICAgICBpZiAoc3RhdGUubGV4aWNhbC50eXBlID09IFwiKVwiKVxuICAgICAgICBzdGF0ZS5pbmRlbnRlZCA9IHN0YXRlLmxleGljYWwuaW5kZW50ZWQ7XG4gICAgICBzdGF0ZS5sZXhpY2FsID0gc3RhdGUubGV4aWNhbC5wcmV2O1xuICAgIH1cbiAgfVxuICBwb3BsZXgubGV4ID0gdHJ1ZTtcblxuICBmdW5jdGlvbiBleHBlY3Qod2FudGVkKSB7XG4gICAgZnVuY3Rpb24gZXhwKHR5cGUpIHtcbiAgICAgIGlmICh0eXBlID09IHdhbnRlZCkgcmV0dXJuIGNvbnQoKTtcbiAgICAgIGVsc2UgaWYgKHdhbnRlZCA9PSBcIjtcIiB8fCB0eXBlID09IFwifVwiIHx8IHR5cGUgPT0gXCIpXCIgfHwgdHlwZSA9PSBcIl1cIikgcmV0dXJuIHBhc3MoKTtcbiAgICAgIGVsc2UgcmV0dXJuIGNvbnQoZXhwKTtcbiAgICB9O1xuICAgIHJldHVybiBleHA7XG4gIH1cblxuICBmdW5jdGlvbiBzdGF0ZW1lbnQodHlwZSwgdmFsdWUpIHtcbiAgICBpZiAodHlwZSA9PSBcInZhclwiKSByZXR1cm4gY29udChwdXNobGV4KFwidmFyZGVmXCIsIHZhbHVlKSwgdmFyZGVmLCBleHBlY3QoXCI7XCIpLCBwb3BsZXgpO1xuICAgIGlmICh0eXBlID09IFwia2V5d29yZCBhXCIpIHJldHVybiBjb250KHB1c2hsZXgoXCJmb3JtXCIpLCBwYXJlbkV4cHIsIHN0YXRlbWVudCwgcG9wbGV4KTtcbiAgICBpZiAodHlwZSA9PSBcImtleXdvcmQgYlwiKSByZXR1cm4gY29udChwdXNobGV4KFwiZm9ybVwiKSwgc3RhdGVtZW50LCBwb3BsZXgpO1xuICAgIGlmICh0eXBlID09IFwia2V5d29yZCBkXCIpIHJldHVybiBjeC5zdHJlYW0ubWF0Y2goL15cXHMqJC8sIGZhbHNlKSA/IGNvbnQoKSA6IGNvbnQocHVzaGxleChcInN0YXRcIiksIG1heWJlZXhwcmVzc2lvbiwgZXhwZWN0KFwiO1wiKSwgcG9wbGV4KTtcbiAgICBpZiAodHlwZSA9PSBcImRlYnVnZ2VyXCIpIHJldHVybiBjb250KGV4cGVjdChcIjtcIikpO1xuICAgIGlmICh0eXBlID09IFwie1wiKSByZXR1cm4gY29udChwdXNobGV4KFwifVwiKSwgcHVzaGJsb2NrY29udGV4dCwgYmxvY2ssIHBvcGxleCwgcG9wY29udGV4dCk7XG4gICAgaWYgKHR5cGUgPT0gXCI7XCIpIHJldHVybiBjb250KCk7XG4gICAgaWYgKHR5cGUgPT0gXCJpZlwiKSB7XG4gICAgICBpZiAoY3guc3RhdGUubGV4aWNhbC5pbmZvID09IFwiZWxzZVwiICYmIGN4LnN0YXRlLmNjW2N4LnN0YXRlLmNjLmxlbmd0aCAtIDFdID09IHBvcGxleClcbiAgICAgICAgY3guc3RhdGUuY2MucG9wKCkoKTtcbiAgICAgIHJldHVybiBjb250KHB1c2hsZXgoXCJmb3JtXCIpLCBwYXJlbkV4cHIsIHN0YXRlbWVudCwgcG9wbGV4LCBtYXliZWVsc2UpO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBjb250KGZ1bmN0aW9uZGVmKTtcbiAgICBpZiAodHlwZSA9PSBcImZvclwiKSByZXR1cm4gY29udChwdXNobGV4KFwiZm9ybVwiKSwgcHVzaGJsb2NrY29udGV4dCwgZm9yc3BlYywgc3RhdGVtZW50LCBwb3Bjb250ZXh0LCBwb3BsZXgpO1xuICAgIGlmICh0eXBlID09IFwiY2xhc3NcIiB8fCAoaXNUUyAmJiB2YWx1ZSA9PSBcImludGVyZmFjZVwiKSkge1xuICAgICAgY3gubWFya2VkID0gXCJrZXl3b3JkXCJcbiAgICAgIHJldHVybiBjb250KHB1c2hsZXgoXCJmb3JtXCIsIHR5cGUgPT0gXCJjbGFzc1wiID8gdHlwZSA6IHZhbHVlKSwgY2xhc3NOYW1lLCBwb3BsZXgpXG4gICAgfVxuICAgIGlmICh0eXBlID09IFwidmFyaWFibGVcIikge1xuICAgICAgaWYgKGlzVFMgJiYgdmFsdWUgPT0gXCJkZWNsYXJlXCIpIHtcbiAgICAgICAgY3gubWFya2VkID0gXCJrZXl3b3JkXCJcbiAgICAgICAgcmV0dXJuIGNvbnQoc3RhdGVtZW50KVxuICAgICAgfSBlbHNlIGlmIChpc1RTICYmICh2YWx1ZSA9PSBcIm1vZHVsZVwiIHx8IHZhbHVlID09IFwiZW51bVwiIHx8IHZhbHVlID09IFwidHlwZVwiKSAmJiBjeC5zdHJlYW0ubWF0Y2goL15cXHMqXFx3LywgZmFsc2UpKSB7XG4gICAgICAgIGN4Lm1hcmtlZCA9IFwia2V5d29yZFwiXG4gICAgICAgIGlmICh2YWx1ZSA9PSBcImVudW1cIikgcmV0dXJuIGNvbnQoZW51bWRlZik7XG4gICAgICAgIGVsc2UgaWYgKHZhbHVlID09IFwidHlwZVwiKSByZXR1cm4gY29udCh0eXBlbmFtZSwgZXhwZWN0KFwib3BlcmF0b3JcIiksIHR5cGVleHByLCBleHBlY3QoXCI7XCIpKTtcbiAgICAgICAgZWxzZSByZXR1cm4gY29udChwdXNobGV4KFwiZm9ybVwiKSwgcGF0dGVybiwgZXhwZWN0KFwie1wiKSwgcHVzaGxleChcIn1cIiksIGJsb2NrLCBwb3BsZXgsIHBvcGxleClcbiAgICAgIH0gZWxzZSBpZiAoaXNUUyAmJiB2YWx1ZSA9PSBcIm5hbWVzcGFjZVwiKSB7XG4gICAgICAgIGN4Lm1hcmtlZCA9IFwia2V5d29yZFwiXG4gICAgICAgIHJldHVybiBjb250KHB1c2hsZXgoXCJmb3JtXCIpLCBleHByZXNzaW9uLCBzdGF0ZW1lbnQsIHBvcGxleClcbiAgICAgIH0gZWxzZSBpZiAoaXNUUyAmJiB2YWx1ZSA9PSBcImFic3RyYWN0XCIpIHtcbiAgICAgICAgY3gubWFya2VkID0gXCJrZXl3b3JkXCJcbiAgICAgICAgcmV0dXJuIGNvbnQoc3RhdGVtZW50KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGNvbnQocHVzaGxleChcInN0YXRcIiksIG1heWJlbGFiZWwpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodHlwZSA9PSBcInN3aXRjaFwiKSByZXR1cm4gY29udChwdXNobGV4KFwiZm9ybVwiKSwgcGFyZW5FeHByLCBleHBlY3QoXCJ7XCIpLCBwdXNobGV4KFwifVwiLCBcInN3aXRjaFwiKSwgcHVzaGJsb2NrY29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2ssIHBvcGxleCwgcG9wbGV4LCBwb3Bjb250ZXh0KTtcbiAgICBpZiAodHlwZSA9PSBcImNhc2VcIikgcmV0dXJuIGNvbnQoZXhwcmVzc2lvbiwgZXhwZWN0KFwiOlwiKSk7XG4gICAgaWYgKHR5cGUgPT0gXCJkZWZhdWx0XCIpIHJldHVybiBjb250KGV4cGVjdChcIjpcIikpO1xuICAgIGlmICh0eXBlID09IFwiY2F0Y2hcIikgcmV0dXJuIGNvbnQocHVzaGxleChcImZvcm1cIiksIHB1c2hjb250ZXh0LCBtYXliZUNhdGNoQmluZGluZywgc3RhdGVtZW50LCBwb3BsZXgsIHBvcGNvbnRleHQpO1xuICAgIGlmICh0eXBlID09IFwiZXhwb3J0XCIpIHJldHVybiBjb250KHB1c2hsZXgoXCJzdGF0XCIpLCBhZnRlckV4cG9ydCwgcG9wbGV4KTtcbiAgICBpZiAodHlwZSA9PSBcImltcG9ydFwiKSByZXR1cm4gY29udChwdXNobGV4KFwic3RhdFwiKSwgYWZ0ZXJJbXBvcnQsIHBvcGxleCk7XG4gICAgaWYgKHR5cGUgPT0gXCJhc3luY1wiKSByZXR1cm4gY29udChzdGF0ZW1lbnQpXG4gICAgaWYgKHZhbHVlID09IFwiQFwiKSByZXR1cm4gY29udChleHByZXNzaW9uLCBzdGF0ZW1lbnQpXG4gICAgcmV0dXJuIHBhc3MocHVzaGxleChcInN0YXRcIiksIGV4cHJlc3Npb24sIGV4cGVjdChcIjtcIiksIHBvcGxleCk7XG4gIH1cbiAgZnVuY3Rpb24gbWF5YmVDYXRjaEJpbmRpbmcodHlwZSkge1xuICAgIGlmICh0eXBlID09IFwiKFwiKSByZXR1cm4gY29udChmdW5hcmcsIGV4cGVjdChcIilcIikpXG4gIH1cbiAgZnVuY3Rpb24gZXhwcmVzc2lvbih0eXBlLCB2YWx1ZSkge1xuICAgIHJldHVybiBleHByZXNzaW9uSW5uZXIodHlwZSwgdmFsdWUsIGZhbHNlKTtcbiAgfVxuICBmdW5jdGlvbiBleHByZXNzaW9uTm9Db21tYSh0eXBlLCB2YWx1ZSkge1xuICAgIHJldHVybiBleHByZXNzaW9uSW5uZXIodHlwZSwgdmFsdWUsIHRydWUpO1xuICB9XG4gIGZ1bmN0aW9uIHBhcmVuRXhwcih0eXBlKSB7XG4gICAgaWYgKHR5cGUgIT0gXCIoXCIpIHJldHVybiBwYXNzKClcbiAgICByZXR1cm4gY29udChwdXNobGV4KFwiKVwiKSwgbWF5YmVleHByZXNzaW9uLCBleHBlY3QoXCIpXCIpLCBwb3BsZXgpXG4gIH1cbiAgZnVuY3Rpb24gZXhwcmVzc2lvbklubmVyKHR5cGUsIHZhbHVlLCBub0NvbW1hKSB7XG4gICAgaWYgKGN4LnN0YXRlLmZhdEFycm93QXQgPT0gY3guc3RyZWFtLnN0YXJ0KSB7XG4gICAgICB2YXIgYm9keSA9IG5vQ29tbWEgPyBhcnJvd0JvZHlOb0NvbW1hIDogYXJyb3dCb2R5O1xuICAgICAgaWYgKHR5cGUgPT0gXCIoXCIpIHJldHVybiBjb250KHB1c2hjb250ZXh0LCBwdXNobGV4KFwiKVwiKSwgY29tbWFzZXAoZnVuYXJnLCBcIilcIiksIHBvcGxleCwgZXhwZWN0KFwiPT5cIiksIGJvZHksIHBvcGNvbnRleHQpO1xuICAgICAgZWxzZSBpZiAodHlwZSA9PSBcInZhcmlhYmxlXCIpIHJldHVybiBwYXNzKHB1c2hjb250ZXh0LCBwYXR0ZXJuLCBleHBlY3QoXCI9PlwiKSwgYm9keSwgcG9wY29udGV4dCk7XG4gICAgfVxuXG4gICAgdmFyIG1heWJlb3AgPSBub0NvbW1hID8gbWF5YmVvcGVyYXRvck5vQ29tbWEgOiBtYXliZW9wZXJhdG9yQ29tbWE7XG4gICAgaWYgKGF0b21pY1R5cGVzLmhhc093blByb3BlcnR5KHR5cGUpKSByZXR1cm4gY29udChtYXliZW9wKTtcbiAgICBpZiAodHlwZSA9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBjb250KGZ1bmN0aW9uZGVmLCBtYXliZW9wKTtcbiAgICBpZiAodHlwZSA9PSBcImNsYXNzXCIgfHwgKGlzVFMgJiYgdmFsdWUgPT0gXCJpbnRlcmZhY2VcIikpIHsgY3gubWFya2VkID0gXCJrZXl3b3JkXCI7IHJldHVybiBjb250KHB1c2hsZXgoXCJmb3JtXCIpLCBjbGFzc0V4cHJlc3Npb24sIHBvcGxleCk7IH1cbiAgICBpZiAodHlwZSA9PSBcImtleXdvcmQgY1wiIHx8IHR5cGUgPT0gXCJhc3luY1wiKSByZXR1cm4gY29udChub0NvbW1hID8gZXhwcmVzc2lvbk5vQ29tbWEgOiBleHByZXNzaW9uKTtcbiAgICBpZiAodHlwZSA9PSBcIihcIikgcmV0dXJuIGNvbnQocHVzaGxleChcIilcIiksIG1heWJlZXhwcmVzc2lvbiwgZXhwZWN0KFwiKVwiKSwgcG9wbGV4LCBtYXliZW9wKTtcbiAgICBpZiAodHlwZSA9PSBcIm9wZXJhdG9yXCIgfHwgdHlwZSA9PSBcInNwcmVhZFwiKSByZXR1cm4gY29udChub0NvbW1hID8gZXhwcmVzc2lvbk5vQ29tbWEgOiBleHByZXNzaW9uKTtcbiAgICBpZiAodHlwZSA9PSBcIltcIikgcmV0dXJuIGNvbnQocHVzaGxleChcIl1cIiksIGFycmF5TGl0ZXJhbCwgcG9wbGV4LCBtYXliZW9wKTtcbiAgICBpZiAodHlwZSA9PSBcIntcIikgcmV0dXJuIGNvbnRDb21tYXNlcChvYmpwcm9wLCBcIn1cIiwgbnVsbCwgbWF5YmVvcCk7XG4gICAgaWYgKHR5cGUgPT0gXCJxdWFzaVwiKSByZXR1cm4gcGFzcyhxdWFzaSwgbWF5YmVvcCk7XG4gICAgaWYgKHR5cGUgPT0gXCJuZXdcIikgcmV0dXJuIGNvbnQobWF5YmVUYXJnZXQobm9Db21tYSkpO1xuICAgIHJldHVybiBjb250KCk7XG4gIH1cbiAgZnVuY3Rpb24gbWF5YmVleHByZXNzaW9uKHR5cGUpIHtcbiAgICBpZiAodHlwZS5tYXRjaCgvWztcXH1cXClcXF0sXS8pKSByZXR1cm4gcGFzcygpO1xuICAgIHJldHVybiBwYXNzKGV4cHJlc3Npb24pO1xuICB9XG5cbiAgZnVuY3Rpb24gbWF5YmVvcGVyYXRvckNvbW1hKHR5cGUsIHZhbHVlKSB7XG4gICAgaWYgKHR5cGUgPT0gXCIsXCIpIHJldHVybiBjb250KG1heWJlZXhwcmVzc2lvbik7XG4gICAgcmV0dXJuIG1heWJlb3BlcmF0b3JOb0NvbW1hKHR5cGUsIHZhbHVlLCBmYWxzZSk7XG4gIH1cbiAgZnVuY3Rpb24gbWF5YmVvcGVyYXRvck5vQ29tbWEodHlwZSwgdmFsdWUsIG5vQ29tbWEpIHtcbiAgICB2YXIgbWUgPSBub0NvbW1hID09IGZhbHNlID8gbWF5YmVvcGVyYXRvckNvbW1hIDogbWF5YmVvcGVyYXRvck5vQ29tbWE7XG4gICAgdmFyIGV4cHIgPSBub0NvbW1hID09IGZhbHNlID8gZXhwcmVzc2lvbiA6IGV4cHJlc3Npb25Ob0NvbW1hO1xuICAgIGlmICh0eXBlID09IFwiPT5cIikgcmV0dXJuIGNvbnQocHVzaGNvbnRleHQsIG5vQ29tbWEgPyBhcnJvd0JvZHlOb0NvbW1hIDogYXJyb3dCb2R5LCBwb3Bjb250ZXh0KTtcbiAgICBpZiAodHlwZSA9PSBcIm9wZXJhdG9yXCIpIHtcbiAgICAgIGlmICgvXFwrXFwrfC0tLy50ZXN0KHZhbHVlKSB8fCBpc1RTICYmIHZhbHVlID09IFwiIVwiKSByZXR1cm4gY29udChtZSk7XG4gICAgICBpZiAoaXNUUyAmJiB2YWx1ZSA9PSBcIjxcIiAmJiBjeC5zdHJlYW0ubWF0Y2goL14oW148Pl18PFtePD5dKj4pKj5cXHMqXFwoLywgZmFsc2UpKVxuICAgICAgICByZXR1cm4gY29udChwdXNobGV4KFwiPlwiKSwgY29tbWFzZXAodHlwZWV4cHIsIFwiPlwiKSwgcG9wbGV4LCBtZSk7XG4gICAgICBpZiAodmFsdWUgPT0gXCI/XCIpIHJldHVybiBjb250KGV4cHJlc3Npb24sIGV4cGVjdChcIjpcIiksIGV4cHIpO1xuICAgICAgcmV0dXJuIGNvbnQoZXhwcik7XG4gICAgfVxuICAgIGlmICh0eXBlID09IFwicXVhc2lcIikgeyByZXR1cm4gcGFzcyhxdWFzaSwgbWUpOyB9XG4gICAgaWYgKHR5cGUgPT0gXCI7XCIpIHJldHVybjtcbiAgICBpZiAodHlwZSA9PSBcIihcIikgcmV0dXJuIGNvbnRDb21tYXNlcChleHByZXNzaW9uTm9Db21tYSwgXCIpXCIsIFwiY2FsbFwiLCBtZSk7XG4gICAgaWYgKHR5cGUgPT0gXCIuXCIpIHJldHVybiBjb250KHByb3BlcnR5LCBtZSk7XG4gICAgaWYgKHR5cGUgPT0gXCJbXCIpIHJldHVybiBjb250KHB1c2hsZXgoXCJdXCIpLCBtYXliZWV4cHJlc3Npb24sIGV4cGVjdChcIl1cIiksIHBvcGxleCwgbWUpO1xuICAgIGlmIChpc1RTICYmIHZhbHVlID09IFwiYXNcIikgeyBjeC5tYXJrZWQgPSBcImtleXdvcmRcIjsgcmV0dXJuIGNvbnQodHlwZWV4cHIsIG1lKSB9XG4gICAgaWYgKHR5cGUgPT0gXCJyZWdleHBcIikge1xuICAgICAgY3guc3RhdGUubGFzdFR5cGUgPSBjeC5tYXJrZWQgPSBcIm9wZXJhdG9yXCJcbiAgICAgIGN4LnN0cmVhbS5iYWNrVXAoY3guc3RyZWFtLnBvcyAtIGN4LnN0cmVhbS5zdGFydCAtIDEpXG4gICAgICByZXR1cm4gY29udChleHByKVxuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBxdWFzaSh0eXBlLCB2YWx1ZSkge1xuICAgIGlmICh0eXBlICE9IFwicXVhc2lcIikgcmV0dXJuIHBhc3MoKTtcbiAgICBpZiAodmFsdWUuc2xpY2UodmFsdWUubGVuZ3RoIC0gMikgIT0gXCIke1wiKSByZXR1cm4gY29udChxdWFzaSk7XG4gICAgcmV0dXJuIGNvbnQoZXhwcmVzc2lvbiwgY29udGludWVRdWFzaSk7XG4gIH1cbiAgZnVuY3Rpb24gY29udGludWVRdWFzaSh0eXBlKSB7XG4gICAgaWYgKHR5cGUgPT0gXCJ9XCIpIHtcbiAgICAgIGN4Lm1hcmtlZCA9IFwic3RyaW5nLTJcIjtcbiAgICAgIGN4LnN0YXRlLnRva2VuaXplID0gdG9rZW5RdWFzaTtcbiAgICAgIHJldHVybiBjb250KHF1YXNpKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gYXJyb3dCb2R5KHR5cGUpIHtcbiAgICBmaW5kRmF0QXJyb3coY3guc3RyZWFtLCBjeC5zdGF0ZSk7XG4gICAgcmV0dXJuIHBhc3ModHlwZSA9PSBcIntcIiA/IHN0YXRlbWVudCA6IGV4cHJlc3Npb24pO1xuICB9XG4gIGZ1bmN0aW9uIGFycm93Qm9keU5vQ29tbWEodHlwZSkge1xuICAgIGZpbmRGYXRBcnJvdyhjeC5zdHJlYW0sIGN4LnN0YXRlKTtcbiAgICByZXR1cm4gcGFzcyh0eXBlID09IFwie1wiID8gc3RhdGVtZW50IDogZXhwcmVzc2lvbk5vQ29tbWEpO1xuICB9XG4gIGZ1bmN0aW9uIG1heWJlVGFyZ2V0KG5vQ29tbWEpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24odHlwZSkge1xuICAgICAgaWYgKHR5cGUgPT0gXCIuXCIpIHJldHVybiBjb250KG5vQ29tbWEgPyB0YXJnZXROb0NvbW1hIDogdGFyZ2V0KTtcbiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gXCJ2YXJpYWJsZVwiICYmIGlzVFMpIHJldHVybiBjb250KG1heWJlVHlwZUFyZ3MsIG5vQ29tbWEgPyBtYXliZW9wZXJhdG9yTm9Db21tYSA6IG1heWJlb3BlcmF0b3JDb21tYSlcbiAgICAgIGVsc2UgcmV0dXJuIHBhc3Mobm9Db21tYSA/IGV4cHJlc3Npb25Ob0NvbW1hIDogZXhwcmVzc2lvbik7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiB0YXJnZXQoXywgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gXCJ0YXJnZXRcIikgeyBjeC5tYXJrZWQgPSBcImtleXdvcmRcIjsgcmV0dXJuIGNvbnQobWF5YmVvcGVyYXRvckNvbW1hKTsgfVxuICB9XG4gIGZ1bmN0aW9uIHRhcmdldE5vQ29tbWEoXywgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gXCJ0YXJnZXRcIikgeyBjeC5tYXJrZWQgPSBcImtleXdvcmRcIjsgcmV0dXJuIGNvbnQobWF5YmVvcGVyYXRvck5vQ29tbWEpOyB9XG4gIH1cbiAgZnVuY3Rpb24gbWF5YmVsYWJlbCh0eXBlKSB7XG4gICAgaWYgKHR5cGUgPT0gXCI6XCIpIHJldHVybiBjb250KHBvcGxleCwgc3RhdGVtZW50KTtcbiAgICByZXR1cm4gcGFzcyhtYXliZW9wZXJhdG9yQ29tbWEsIGV4cGVjdChcIjtcIiksIHBvcGxleCk7XG4gIH1cbiAgZnVuY3Rpb24gcHJvcGVydHkodHlwZSkge1xuICAgIGlmICh0eXBlID09IFwidmFyaWFibGVcIikge2N4Lm1hcmtlZCA9IFwicHJvcGVydHlcIjsgcmV0dXJuIGNvbnQoKTt9XG4gIH1cbiAgZnVuY3Rpb24gb2JqcHJvcCh0eXBlLCB2YWx1ZSkge1xuICAgIGlmICh0eXBlID09IFwiYXN5bmNcIikge1xuICAgICAgY3gubWFya2VkID0gXCJwcm9wZXJ0eVwiO1xuICAgICAgcmV0dXJuIGNvbnQob2JqcHJvcCk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09IFwidmFyaWFibGVcIiB8fCBjeC5zdHlsZSA9PSBcImtleXdvcmRcIikge1xuICAgICAgY3gubWFya2VkID0gXCJwcm9wZXJ0eVwiO1xuICAgICAgaWYgKHZhbHVlID09IFwiZ2V0XCIgfHwgdmFsdWUgPT0gXCJzZXRcIikgcmV0dXJuIGNvbnQoZ2V0dGVyU2V0dGVyKTtcbiAgICAgIHZhciBtIC8vIFdvcmsgYXJvdW5kIGZhdC1hcnJvdy1kZXRlY3Rpb24gY29tcGxpY2F0aW9uIGZvciBkZXRlY3RpbmcgdHlwZXNjcmlwdCB0eXBlZCBhcnJvdyBwYXJhbXNcbiAgICAgIGlmIChpc1RTICYmIGN4LnN0YXRlLmZhdEFycm93QXQgPT0gY3guc3RyZWFtLnN0YXJ0ICYmIChtID0gY3guc3RyZWFtLm1hdGNoKC9eXFxzKjpcXHMqLywgZmFsc2UpKSlcbiAgICAgICAgY3guc3RhdGUuZmF0QXJyb3dBdCA9IGN4LnN0cmVhbS5wb3MgKyBtWzBdLmxlbmd0aFxuICAgICAgcmV0dXJuIGNvbnQoYWZ0ZXJwcm9wKTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCJudW1iZXJcIiB8fCB0eXBlID09IFwic3RyaW5nXCIpIHtcbiAgICAgIGN4Lm1hcmtlZCA9IGpzb25sZE1vZGUgPyBcInByb3BlcnR5XCIgOiAoY3guc3R5bGUgKyBcIiBwcm9wZXJ0eVwiKTtcbiAgICAgIHJldHVybiBjb250KGFmdGVycHJvcCk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09IFwianNvbmxkLWtleXdvcmRcIikge1xuICAgICAgcmV0dXJuIGNvbnQoYWZ0ZXJwcm9wKTtcbiAgICB9IGVsc2UgaWYgKGlzVFMgJiYgaXNNb2RpZmllcih2YWx1ZSkpIHtcbiAgICAgIGN4Lm1hcmtlZCA9IFwia2V5d29yZFwiXG4gICAgICByZXR1cm4gY29udChvYmpwcm9wKVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcIltcIikge1xuICAgICAgcmV0dXJuIGNvbnQoZXhwcmVzc2lvbiwgbWF5YmV0eXBlLCBleHBlY3QoXCJdXCIpLCBhZnRlcnByb3ApO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcInNwcmVhZFwiKSB7XG4gICAgICByZXR1cm4gY29udChleHByZXNzaW9uTm9Db21tYSwgYWZ0ZXJwcm9wKTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlID09IFwiKlwiKSB7XG4gICAgICBjeC5tYXJrZWQgPSBcImtleXdvcmRcIjtcbiAgICAgIHJldHVybiBjb250KG9ianByb3ApO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcIjpcIikge1xuICAgICAgcmV0dXJuIHBhc3MoYWZ0ZXJwcm9wKVxuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBnZXR0ZXJTZXR0ZXIodHlwZSkge1xuICAgIGlmICh0eXBlICE9IFwidmFyaWFibGVcIikgcmV0dXJuIHBhc3MoYWZ0ZXJwcm9wKTtcbiAgICBjeC5tYXJrZWQgPSBcInByb3BlcnR5XCI7XG4gICAgcmV0dXJuIGNvbnQoZnVuY3Rpb25kZWYpO1xuICB9XG4gIGZ1bmN0aW9uIGFmdGVycHJvcCh0eXBlKSB7XG4gICAgaWYgKHR5cGUgPT0gXCI6XCIpIHJldHVybiBjb250KGV4cHJlc3Npb25Ob0NvbW1hKTtcbiAgICBpZiAodHlwZSA9PSBcIihcIikgcmV0dXJuIHBhc3MoZnVuY3Rpb25kZWYpO1xuICB9XG4gIGZ1bmN0aW9uIGNvbW1hc2VwKHdoYXQsIGVuZCwgc2VwKSB7XG4gICAgZnVuY3Rpb24gcHJvY2VlZCh0eXBlLCB2YWx1ZSkge1xuICAgICAgaWYgKHNlcCA/IHNlcC5pbmRleE9mKHR5cGUpID4gLTEgOiB0eXBlID09IFwiLFwiKSB7XG4gICAgICAgIHZhciBsZXggPSBjeC5zdGF0ZS5sZXhpY2FsO1xuICAgICAgICBpZiAobGV4LmluZm8gPT0gXCJjYWxsXCIpIGxleC5wb3MgPSAobGV4LnBvcyB8fCAwKSArIDE7XG4gICAgICAgIHJldHVybiBjb250KGZ1bmN0aW9uKHR5cGUsIHZhbHVlKSB7XG4gICAgICAgICAgaWYgKHR5cGUgPT0gZW5kIHx8IHZhbHVlID09IGVuZCkgcmV0dXJuIHBhc3MoKVxuICAgICAgICAgIHJldHVybiBwYXNzKHdoYXQpXG4gICAgICAgIH0sIHByb2NlZWQpO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGUgPT0gZW5kIHx8IHZhbHVlID09IGVuZCkgcmV0dXJuIGNvbnQoKTtcbiAgICAgIGlmIChzZXAgJiYgc2VwLmluZGV4T2YoXCI7XCIpID4gLTEpIHJldHVybiBwYXNzKHdoYXQpXG4gICAgICByZXR1cm4gY29udChleHBlY3QoZW5kKSk7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbih0eXBlLCB2YWx1ZSkge1xuICAgICAgaWYgKHR5cGUgPT0gZW5kIHx8IHZhbHVlID09IGVuZCkgcmV0dXJuIGNvbnQoKTtcbiAgICAgIHJldHVybiBwYXNzKHdoYXQsIHByb2NlZWQpO1xuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gY29udENvbW1hc2VwKHdoYXQsIGVuZCwgaW5mbykge1xuICAgIGZvciAodmFyIGkgPSAzOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxuICAgICAgY3guY2MucHVzaChhcmd1bWVudHNbaV0pO1xuICAgIHJldHVybiBjb250KHB1c2hsZXgoZW5kLCBpbmZvKSwgY29tbWFzZXAod2hhdCwgZW5kKSwgcG9wbGV4KTtcbiAgfVxuICBmdW5jdGlvbiBibG9jayh0eXBlKSB7XG4gICAgaWYgKHR5cGUgPT0gXCJ9XCIpIHJldHVybiBjb250KCk7XG4gICAgcmV0dXJuIHBhc3Moc3RhdGVtZW50LCBibG9jayk7XG4gIH1cbiAgZnVuY3Rpb24gbWF5YmV0eXBlKHR5cGUsIHZhbHVlKSB7XG4gICAgaWYgKGlzVFMpIHtcbiAgICAgIGlmICh0eXBlID09IFwiOlwiKSByZXR1cm4gY29udCh0eXBlZXhwcik7XG4gICAgICBpZiAodmFsdWUgPT0gXCI/XCIpIHJldHVybiBjb250KG1heWJldHlwZSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIG1heWJldHlwZU9ySW4odHlwZSwgdmFsdWUpIHtcbiAgICBpZiAoaXNUUyAmJiAodHlwZSA9PSBcIjpcIiB8fCB2YWx1ZSA9PSBcImluXCIpKSByZXR1cm4gY29udCh0eXBlZXhwcilcbiAgfVxuICBmdW5jdGlvbiBtYXliZXJldHR5cGUodHlwZSkge1xuICAgIGlmIChpc1RTICYmIHR5cGUgPT0gXCI6XCIpIHtcbiAgICAgIGlmIChjeC5zdHJlYW0ubWF0Y2goL15cXHMqXFx3K1xccytpc1xcYi8sIGZhbHNlKSkgcmV0dXJuIGNvbnQoZXhwcmVzc2lvbiwgaXNLVywgdHlwZWV4cHIpXG4gICAgICBlbHNlIHJldHVybiBjb250KHR5cGVleHByKVxuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBpc0tXKF8sIHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09IFwiaXNcIikge1xuICAgICAgY3gubWFya2VkID0gXCJrZXl3b3JkXCJcbiAgICAgIHJldHVybiBjb250KClcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gdHlwZWV4cHIodHlwZSwgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gXCJrZXlvZlwiIHx8IHZhbHVlID09IFwidHlwZW9mXCIgfHwgdmFsdWUgPT0gXCJpbmZlclwiIHx8IHZhbHVlID09IFwicmVhZG9ubHlcIikge1xuICAgICAgY3gubWFya2VkID0gXCJrZXl3b3JkXCJcbiAgICAgIHJldHVybiBjb250KHZhbHVlID09IFwidHlwZW9mXCIgPyBleHByZXNzaW9uTm9Db21tYSA6IHR5cGVleHByKVxuICAgIH1cbiAgICBpZiAodHlwZSA9PSBcInZhcmlhYmxlXCIgfHwgdmFsdWUgPT0gXCJ2b2lkXCIpIHtcbiAgICAgIGN4Lm1hcmtlZCA9IFwidHlwZVwiXG4gICAgICByZXR1cm4gY29udChhZnRlclR5cGUpXG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PSBcInxcIiB8fCB2YWx1ZSA9PSBcIiZcIikgcmV0dXJuIGNvbnQodHlwZWV4cHIpXG4gICAgaWYgKHR5cGUgPT0gXCJzdHJpbmdcIiB8fCB0eXBlID09IFwibnVtYmVyXCIgfHwgdHlwZSA9PSBcImF0b21cIikgcmV0dXJuIGNvbnQoYWZ0ZXJUeXBlKTtcbiAgICBpZiAodHlwZSA9PSBcIltcIikgcmV0dXJuIGNvbnQocHVzaGxleChcIl1cIiksIGNvbW1hc2VwKHR5cGVleHByLCBcIl1cIiwgXCIsXCIpLCBwb3BsZXgsIGFmdGVyVHlwZSlcbiAgICBpZiAodHlwZSA9PSBcIntcIikgcmV0dXJuIGNvbnQocHVzaGxleChcIn1cIiksIHR5cGVwcm9wcywgcG9wbGV4LCBhZnRlclR5cGUpXG4gICAgaWYgKHR5cGUgPT0gXCIoXCIpIHJldHVybiBjb250KGNvbW1hc2VwKHR5cGVhcmcsIFwiKVwiKSwgbWF5YmVSZXR1cm5UeXBlLCBhZnRlclR5cGUpXG4gICAgaWYgKHR5cGUgPT0gXCI8XCIpIHJldHVybiBjb250KGNvbW1hc2VwKHR5cGVleHByLCBcIj5cIiksIHR5cGVleHByKVxuICB9XG4gIGZ1bmN0aW9uIG1heWJlUmV0dXJuVHlwZSh0eXBlKSB7XG4gICAgaWYgKHR5cGUgPT0gXCI9PlwiKSByZXR1cm4gY29udCh0eXBlZXhwcilcbiAgfVxuICBmdW5jdGlvbiB0eXBlcHJvcHModHlwZSkge1xuICAgIGlmICh0eXBlLm1hdGNoKC9bXFx9XFwpXFxdXS8pKSByZXR1cm4gY29udCgpXG4gICAgaWYgKHR5cGUgPT0gXCIsXCIgfHwgdHlwZSA9PSBcIjtcIikgcmV0dXJuIGNvbnQodHlwZXByb3BzKVxuICAgIHJldHVybiBwYXNzKHR5cGVwcm9wLCB0eXBlcHJvcHMpXG4gIH1cbiAgZnVuY3Rpb24gdHlwZXByb3AodHlwZSwgdmFsdWUpIHtcbiAgICBpZiAodHlwZSA9PSBcInZhcmlhYmxlXCIgfHwgY3guc3R5bGUgPT0gXCJrZXl3b3JkXCIpIHtcbiAgICAgIGN4Lm1hcmtlZCA9IFwicHJvcGVydHlcIlxuICAgICAgcmV0dXJuIGNvbnQodHlwZXByb3ApXG4gICAgfSBlbHNlIGlmICh2YWx1ZSA9PSBcIj9cIiB8fCB0eXBlID09IFwibnVtYmVyXCIgfHwgdHlwZSA9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gY29udCh0eXBlcHJvcClcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCI6XCIpIHtcbiAgICAgIHJldHVybiBjb250KHR5cGVleHByKVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcIltcIikge1xuICAgICAgcmV0dXJuIGNvbnQoZXhwZWN0KFwidmFyaWFibGVcIiksIG1heWJldHlwZU9ySW4sIGV4cGVjdChcIl1cIiksIHR5cGVwcm9wKVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcIihcIikge1xuICAgICAgcmV0dXJuIHBhc3MoZnVuY3Rpb25kZWNsLCB0eXBlcHJvcClcbiAgICB9IGVsc2UgaWYgKCF0eXBlLm1hdGNoKC9bO1xcfVxcKVxcXSxdLykpIHtcbiAgICAgIHJldHVybiBjb250KClcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gdHlwZWFyZyh0eXBlLCB2YWx1ZSkge1xuICAgIGlmICh0eXBlID09IFwidmFyaWFibGVcIiAmJiBjeC5zdHJlYW0ubWF0Y2goL15cXHMqWz86XS8sIGZhbHNlKSB8fCB2YWx1ZSA9PSBcIj9cIikgcmV0dXJuIGNvbnQodHlwZWFyZylcbiAgICBpZiAodHlwZSA9PSBcIjpcIikgcmV0dXJuIGNvbnQodHlwZWV4cHIpXG4gICAgaWYgKHR5cGUgPT0gXCJzcHJlYWRcIikgcmV0dXJuIGNvbnQodHlwZWFyZylcbiAgICByZXR1cm4gcGFzcyh0eXBlZXhwcilcbiAgfVxuICBmdW5jdGlvbiBhZnRlclR5cGUodHlwZSwgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gXCI8XCIpIHJldHVybiBjb250KHB1c2hsZXgoXCI+XCIpLCBjb21tYXNlcCh0eXBlZXhwciwgXCI+XCIpLCBwb3BsZXgsIGFmdGVyVHlwZSlcbiAgICBpZiAodmFsdWUgPT0gXCJ8XCIgfHwgdHlwZSA9PSBcIi5cIiB8fCB2YWx1ZSA9PSBcIiZcIikgcmV0dXJuIGNvbnQodHlwZWV4cHIpXG4gICAgaWYgKHR5cGUgPT0gXCJbXCIpIHJldHVybiBjb250KHR5cGVleHByLCBleHBlY3QoXCJdXCIpLCBhZnRlclR5cGUpXG4gICAgaWYgKHZhbHVlID09IFwiZXh0ZW5kc1wiIHx8IHZhbHVlID09IFwiaW1wbGVtZW50c1wiKSB7IGN4Lm1hcmtlZCA9IFwia2V5d29yZFwiOyByZXR1cm4gY29udCh0eXBlZXhwcikgfVxuICAgIGlmICh2YWx1ZSA9PSBcIj9cIikgcmV0dXJuIGNvbnQodHlwZWV4cHIsIGV4cGVjdChcIjpcIiksIHR5cGVleHByKVxuICB9XG4gIGZ1bmN0aW9uIG1heWJlVHlwZUFyZ3MoXywgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gXCI8XCIpIHJldHVybiBjb250KHB1c2hsZXgoXCI+XCIpLCBjb21tYXNlcCh0eXBlZXhwciwgXCI+XCIpLCBwb3BsZXgsIGFmdGVyVHlwZSlcbiAgfVxuICBmdW5jdGlvbiB0eXBlcGFyYW0oKSB7XG4gICAgcmV0dXJuIHBhc3ModHlwZWV4cHIsIG1heWJlVHlwZURlZmF1bHQpXG4gIH1cbiAgZnVuY3Rpb24gbWF5YmVUeXBlRGVmYXVsdChfLCB2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PSBcIj1cIikgcmV0dXJuIGNvbnQodHlwZWV4cHIpXG4gIH1cbiAgZnVuY3Rpb24gdmFyZGVmKF8sIHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09IFwiZW51bVwiKSB7Y3gubWFya2VkID0gXCJrZXl3b3JkXCI7IHJldHVybiBjb250KGVudW1kZWYpfVxuICAgIHJldHVybiBwYXNzKHBhdHRlcm4sIG1heWJldHlwZSwgbWF5YmVBc3NpZ24sIHZhcmRlZkNvbnQpO1xuICB9XG4gIGZ1bmN0aW9uIHBhdHRlcm4odHlwZSwgdmFsdWUpIHtcbiAgICBpZiAoaXNUUyAmJiBpc01vZGlmaWVyKHZhbHVlKSkgeyBjeC5tYXJrZWQgPSBcImtleXdvcmRcIjsgcmV0dXJuIGNvbnQocGF0dGVybikgfVxuICAgIGlmICh0eXBlID09IFwidmFyaWFibGVcIikgeyByZWdpc3Rlcih2YWx1ZSk7IHJldHVybiBjb250KCk7IH1cbiAgICBpZiAodHlwZSA9PSBcInNwcmVhZFwiKSByZXR1cm4gY29udChwYXR0ZXJuKTtcbiAgICBpZiAodHlwZSA9PSBcIltcIikgcmV0dXJuIGNvbnRDb21tYXNlcChlbHRwYXR0ZXJuLCBcIl1cIik7XG4gICAgaWYgKHR5cGUgPT0gXCJ7XCIpIHJldHVybiBjb250Q29tbWFzZXAocHJvcHBhdHRlcm4sIFwifVwiKTtcbiAgfVxuICBmdW5jdGlvbiBwcm9wcGF0dGVybih0eXBlLCB2YWx1ZSkge1xuICAgIGlmICh0eXBlID09IFwidmFyaWFibGVcIiAmJiAhY3guc3RyZWFtLm1hdGNoKC9eXFxzKjovLCBmYWxzZSkpIHtcbiAgICAgIHJlZ2lzdGVyKHZhbHVlKTtcbiAgICAgIHJldHVybiBjb250KG1heWJlQXNzaWduKTtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT0gXCJ2YXJpYWJsZVwiKSBjeC5tYXJrZWQgPSBcInByb3BlcnR5XCI7XG4gICAgaWYgKHR5cGUgPT0gXCJzcHJlYWRcIikgcmV0dXJuIGNvbnQocGF0dGVybik7XG4gICAgaWYgKHR5cGUgPT0gXCJ9XCIpIHJldHVybiBwYXNzKCk7XG4gICAgaWYgKHR5cGUgPT0gXCJbXCIpIHJldHVybiBjb250KGV4cHJlc3Npb24sIGV4cGVjdCgnXScpLCBleHBlY3QoJzonKSwgcHJvcHBhdHRlcm4pO1xuICAgIHJldHVybiBjb250KGV4cGVjdChcIjpcIiksIHBhdHRlcm4sIG1heWJlQXNzaWduKTtcbiAgfVxuICBmdW5jdGlvbiBlbHRwYXR0ZXJuKCkge1xuICAgIHJldHVybiBwYXNzKHBhdHRlcm4sIG1heWJlQXNzaWduKVxuICB9XG4gIGZ1bmN0aW9uIG1heWJlQXNzaWduKF90eXBlLCB2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PSBcIj1cIikgcmV0dXJuIGNvbnQoZXhwcmVzc2lvbk5vQ29tbWEpO1xuICB9XG4gIGZ1bmN0aW9uIHZhcmRlZkNvbnQodHlwZSkge1xuICAgIGlmICh0eXBlID09IFwiLFwiKSByZXR1cm4gY29udCh2YXJkZWYpO1xuICB9XG4gIGZ1bmN0aW9uIG1heWJlZWxzZSh0eXBlLCB2YWx1ZSkge1xuICAgIGlmICh0eXBlID09IFwia2V5d29yZCBiXCIgJiYgdmFsdWUgPT0gXCJlbHNlXCIpIHJldHVybiBjb250KHB1c2hsZXgoXCJmb3JtXCIsIFwiZWxzZVwiKSwgc3RhdGVtZW50LCBwb3BsZXgpO1xuICB9XG4gIGZ1bmN0aW9uIGZvcnNwZWModHlwZSwgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gXCJhd2FpdFwiKSByZXR1cm4gY29udChmb3JzcGVjKTtcbiAgICBpZiAodHlwZSA9PSBcIihcIikgcmV0dXJuIGNvbnQocHVzaGxleChcIilcIiksIGZvcnNwZWMxLCBwb3BsZXgpO1xuICB9XG4gIGZ1bmN0aW9uIGZvcnNwZWMxKHR5cGUpIHtcbiAgICBpZiAodHlwZSA9PSBcInZhclwiKSByZXR1cm4gY29udCh2YXJkZWYsIGZvcnNwZWMyKTtcbiAgICBpZiAodHlwZSA9PSBcInZhcmlhYmxlXCIpIHJldHVybiBjb250KGZvcnNwZWMyKTtcbiAgICByZXR1cm4gcGFzcyhmb3JzcGVjMilcbiAgfVxuICBmdW5jdGlvbiBmb3JzcGVjMih0eXBlLCB2YWx1ZSkge1xuICAgIGlmICh0eXBlID09IFwiKVwiKSByZXR1cm4gY29udCgpXG4gICAgaWYgKHR5cGUgPT0gXCI7XCIpIHJldHVybiBjb250KGZvcnNwZWMyKVxuICAgIGlmICh2YWx1ZSA9PSBcImluXCIgfHwgdmFsdWUgPT0gXCJvZlwiKSB7IGN4Lm1hcmtlZCA9IFwia2V5d29yZFwiOyByZXR1cm4gY29udChleHByZXNzaW9uLCBmb3JzcGVjMikgfVxuICAgIHJldHVybiBwYXNzKGV4cHJlc3Npb24sIGZvcnNwZWMyKVxuICB9XG4gIGZ1bmN0aW9uIGZ1bmN0aW9uZGVmKHR5cGUsIHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09IFwiKlwiKSB7Y3gubWFya2VkID0gXCJrZXl3b3JkXCI7IHJldHVybiBjb250KGZ1bmN0aW9uZGVmKTt9XG4gICAgaWYgKHR5cGUgPT0gXCJ2YXJpYWJsZVwiKSB7cmVnaXN0ZXIodmFsdWUpOyByZXR1cm4gY29udChmdW5jdGlvbmRlZik7fVxuICAgIGlmICh0eXBlID09IFwiKFwiKSByZXR1cm4gY29udChwdXNoY29udGV4dCwgcHVzaGxleChcIilcIiksIGNvbW1hc2VwKGZ1bmFyZywgXCIpXCIpLCBwb3BsZXgsIG1heWJlcmV0dHlwZSwgc3RhdGVtZW50LCBwb3Bjb250ZXh0KTtcbiAgICBpZiAoaXNUUyAmJiB2YWx1ZSA9PSBcIjxcIikgcmV0dXJuIGNvbnQocHVzaGxleChcIj5cIiksIGNvbW1hc2VwKHR5cGVwYXJhbSwgXCI+XCIpLCBwb3BsZXgsIGZ1bmN0aW9uZGVmKVxuICB9XG4gIGZ1bmN0aW9uIGZ1bmN0aW9uZGVjbCh0eXBlLCB2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PSBcIipcIikge2N4Lm1hcmtlZCA9IFwia2V5d29yZFwiOyByZXR1cm4gY29udChmdW5jdGlvbmRlY2wpO31cbiAgICBpZiAodHlwZSA9PSBcInZhcmlhYmxlXCIpIHtyZWdpc3Rlcih2YWx1ZSk7IHJldHVybiBjb250KGZ1bmN0aW9uZGVjbCk7fVxuICAgIGlmICh0eXBlID09IFwiKFwiKSByZXR1cm4gY29udChwdXNoY29udGV4dCwgcHVzaGxleChcIilcIiksIGNvbW1hc2VwKGZ1bmFyZywgXCIpXCIpLCBwb3BsZXgsIG1heWJlcmV0dHlwZSwgcG9wY29udGV4dCk7XG4gICAgaWYgKGlzVFMgJiYgdmFsdWUgPT0gXCI8XCIpIHJldHVybiBjb250KHB1c2hsZXgoXCI+XCIpLCBjb21tYXNlcCh0eXBlcGFyYW0sIFwiPlwiKSwgcG9wbGV4LCBmdW5jdGlvbmRlY2wpXG4gIH1cbiAgZnVuY3Rpb24gdHlwZW5hbWUodHlwZSwgdmFsdWUpIHtcbiAgICBpZiAodHlwZSA9PSBcImtleXdvcmRcIiB8fCB0eXBlID09IFwidmFyaWFibGVcIikge1xuICAgICAgY3gubWFya2VkID0gXCJ0eXBlXCJcbiAgICAgIHJldHVybiBjb250KHR5cGVuYW1lKVxuICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gXCI8XCIpIHtcbiAgICAgIHJldHVybiBjb250KHB1c2hsZXgoXCI+XCIpLCBjb21tYXNlcCh0eXBlcGFyYW0sIFwiPlwiKSwgcG9wbGV4KVxuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBmdW5hcmcodHlwZSwgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gXCJAXCIpIGNvbnQoZXhwcmVzc2lvbiwgZnVuYXJnKVxuICAgIGlmICh0eXBlID09IFwic3ByZWFkXCIpIHJldHVybiBjb250KGZ1bmFyZyk7XG4gICAgaWYgKGlzVFMgJiYgaXNNb2RpZmllcih2YWx1ZSkpIHsgY3gubWFya2VkID0gXCJrZXl3b3JkXCI7IHJldHVybiBjb250KGZ1bmFyZyk7IH1cbiAgICBpZiAoaXNUUyAmJiB0eXBlID09IFwidGhpc1wiKSByZXR1cm4gY29udChtYXliZXR5cGUsIG1heWJlQXNzaWduKVxuICAgIHJldHVybiBwYXNzKHBhdHRlcm4sIG1heWJldHlwZSwgbWF5YmVBc3NpZ24pO1xuICB9XG4gIGZ1bmN0aW9uIGNsYXNzRXhwcmVzc2lvbih0eXBlLCB2YWx1ZSkge1xuICAgIC8vIENsYXNzIGV4cHJlc3Npb25zIG1heSBoYXZlIGFuIG9wdGlvbmFsIG5hbWUuXG4gICAgaWYgKHR5cGUgPT0gXCJ2YXJpYWJsZVwiKSByZXR1cm4gY2xhc3NOYW1lKHR5cGUsIHZhbHVlKTtcbiAgICByZXR1cm4gY2xhc3NOYW1lQWZ0ZXIodHlwZSwgdmFsdWUpO1xuICB9XG4gIGZ1bmN0aW9uIGNsYXNzTmFtZSh0eXBlLCB2YWx1ZSkge1xuICAgIGlmICh0eXBlID09IFwidmFyaWFibGVcIikge3JlZ2lzdGVyKHZhbHVlKTsgcmV0dXJuIGNvbnQoY2xhc3NOYW1lQWZ0ZXIpO31cbiAgfVxuICBmdW5jdGlvbiBjbGFzc05hbWVBZnRlcih0eXBlLCB2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PSBcIjxcIikgcmV0dXJuIGNvbnQocHVzaGxleChcIj5cIiksIGNvbW1hc2VwKHR5cGVwYXJhbSwgXCI+XCIpLCBwb3BsZXgsIGNsYXNzTmFtZUFmdGVyKVxuICAgIGlmICh2YWx1ZSA9PSBcImV4dGVuZHNcIiB8fCB2YWx1ZSA9PSBcImltcGxlbWVudHNcIiB8fCAoaXNUUyAmJiB0eXBlID09IFwiLFwiKSkge1xuICAgICAgaWYgKHZhbHVlID09IFwiaW1wbGVtZW50c1wiKSBjeC5tYXJrZWQgPSBcImtleXdvcmRcIjtcbiAgICAgIHJldHVybiBjb250KGlzVFMgPyB0eXBlZXhwciA6IGV4cHJlc3Npb24sIGNsYXNzTmFtZUFmdGVyKTtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT0gXCJ7XCIpIHJldHVybiBjb250KHB1c2hsZXgoXCJ9XCIpLCBjbGFzc0JvZHksIHBvcGxleCk7XG4gIH1cbiAgZnVuY3Rpb24gY2xhc3NCb2R5KHR5cGUsIHZhbHVlKSB7XG4gICAgaWYgKHR5cGUgPT0gXCJhc3luY1wiIHx8XG4gICAgICAgICh0eXBlID09IFwidmFyaWFibGVcIiAmJlxuICAgICAgICAgKHZhbHVlID09IFwic3RhdGljXCIgfHwgdmFsdWUgPT0gXCJnZXRcIiB8fCB2YWx1ZSA9PSBcInNldFwiIHx8IChpc1RTICYmIGlzTW9kaWZpZXIodmFsdWUpKSkgJiZcbiAgICAgICAgIGN4LnN0cmVhbS5tYXRjaCgvXlxccytbXFx3JFxceGExLVxcdWZmZmZdLywgZmFsc2UpKSkge1xuICAgICAgY3gubWFya2VkID0gXCJrZXl3b3JkXCI7XG4gICAgICByZXR1cm4gY29udChjbGFzc0JvZHkpO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PSBcInZhcmlhYmxlXCIgfHwgY3guc3R5bGUgPT0gXCJrZXl3b3JkXCIpIHtcbiAgICAgIGN4Lm1hcmtlZCA9IFwicHJvcGVydHlcIjtcbiAgICAgIHJldHVybiBjb250KGNsYXNzZmllbGQsIGNsYXNzQm9keSk7XG4gICAgfVxuICAgIGlmICh0eXBlID09IFwibnVtYmVyXCIgfHwgdHlwZSA9PSBcInN0cmluZ1wiKSByZXR1cm4gY29udChjbGFzc2ZpZWxkLCBjbGFzc0JvZHkpO1xuICAgIGlmICh0eXBlID09IFwiW1wiKVxuICAgICAgcmV0dXJuIGNvbnQoZXhwcmVzc2lvbiwgbWF5YmV0eXBlLCBleHBlY3QoXCJdXCIpLCBjbGFzc2ZpZWxkLCBjbGFzc0JvZHkpXG4gICAgaWYgKHZhbHVlID09IFwiKlwiKSB7XG4gICAgICBjeC5tYXJrZWQgPSBcImtleXdvcmRcIjtcbiAgICAgIHJldHVybiBjb250KGNsYXNzQm9keSk7XG4gICAgfVxuICAgIGlmIChpc1RTICYmIHR5cGUgPT0gXCIoXCIpIHJldHVybiBwYXNzKGZ1bmN0aW9uZGVjbCwgY2xhc3NCb2R5KVxuICAgIGlmICh0eXBlID09IFwiO1wiIHx8IHR5cGUgPT0gXCIsXCIpIHJldHVybiBjb250KGNsYXNzQm9keSk7XG4gICAgaWYgKHR5cGUgPT0gXCJ9XCIpIHJldHVybiBjb250KCk7XG4gICAgaWYgKHZhbHVlID09IFwiQFwiKSByZXR1cm4gY29udChleHByZXNzaW9uLCBjbGFzc0JvZHkpXG4gIH1cbiAgZnVuY3Rpb24gY2xhc3NmaWVsZCh0eXBlLCB2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PSBcIj9cIikgcmV0dXJuIGNvbnQoY2xhc3NmaWVsZClcbiAgICBpZiAodHlwZSA9PSBcIjpcIikgcmV0dXJuIGNvbnQodHlwZWV4cHIsIG1heWJlQXNzaWduKVxuICAgIGlmICh2YWx1ZSA9PSBcIj1cIikgcmV0dXJuIGNvbnQoZXhwcmVzc2lvbk5vQ29tbWEpXG4gICAgdmFyIGNvbnRleHQgPSBjeC5zdGF0ZS5sZXhpY2FsLnByZXYsIGlzSW50ZXJmYWNlID0gY29udGV4dCAmJiBjb250ZXh0LmluZm8gPT0gXCJpbnRlcmZhY2VcIlxuICAgIHJldHVybiBwYXNzKGlzSW50ZXJmYWNlID8gZnVuY3Rpb25kZWNsIDogZnVuY3Rpb25kZWYpXG4gIH1cbiAgZnVuY3Rpb24gYWZ0ZXJFeHBvcnQodHlwZSwgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gXCIqXCIpIHsgY3gubWFya2VkID0gXCJrZXl3b3JkXCI7IHJldHVybiBjb250KG1heWJlRnJvbSwgZXhwZWN0KFwiO1wiKSk7IH1cbiAgICBpZiAodmFsdWUgPT0gXCJkZWZhdWx0XCIpIHsgY3gubWFya2VkID0gXCJrZXl3b3JkXCI7IHJldHVybiBjb250KGV4cHJlc3Npb24sIGV4cGVjdChcIjtcIikpOyB9XG4gICAgaWYgKHR5cGUgPT0gXCJ7XCIpIHJldHVybiBjb250KGNvbW1hc2VwKGV4cG9ydEZpZWxkLCBcIn1cIiksIG1heWJlRnJvbSwgZXhwZWN0KFwiO1wiKSk7XG4gICAgcmV0dXJuIHBhc3Moc3RhdGVtZW50KTtcbiAgfVxuICBmdW5jdGlvbiBleHBvcnRGaWVsZCh0eXBlLCB2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PSBcImFzXCIpIHsgY3gubWFya2VkID0gXCJrZXl3b3JkXCI7IHJldHVybiBjb250KGV4cGVjdChcInZhcmlhYmxlXCIpKTsgfVxuICAgIGlmICh0eXBlID09IFwidmFyaWFibGVcIikgcmV0dXJuIHBhc3MoZXhwcmVzc2lvbk5vQ29tbWEsIGV4cG9ydEZpZWxkKTtcbiAgfVxuICBmdW5jdGlvbiBhZnRlckltcG9ydCh0eXBlKSB7XG4gICAgaWYgKHR5cGUgPT0gXCJzdHJpbmdcIikgcmV0dXJuIGNvbnQoKTtcbiAgICBpZiAodHlwZSA9PSBcIihcIikgcmV0dXJuIHBhc3MoZXhwcmVzc2lvbik7XG4gICAgaWYgKHR5cGUgPT0gXCIuXCIpIHJldHVybiBwYXNzKG1heWJlb3BlcmF0b3JDb21tYSk7XG4gICAgcmV0dXJuIHBhc3MoaW1wb3J0U3BlYywgbWF5YmVNb3JlSW1wb3J0cywgbWF5YmVGcm9tKTtcbiAgfVxuICBmdW5jdGlvbiBpbXBvcnRTcGVjKHR5cGUsIHZhbHVlKSB7XG4gICAgaWYgKHR5cGUgPT0gXCJ7XCIpIHJldHVybiBjb250Q29tbWFzZXAoaW1wb3J0U3BlYywgXCJ9XCIpO1xuICAgIGlmICh0eXBlID09IFwidmFyaWFibGVcIikgcmVnaXN0ZXIodmFsdWUpO1xuICAgIGlmICh2YWx1ZSA9PSBcIipcIikgY3gubWFya2VkID0gXCJrZXl3b3JkXCI7XG4gICAgcmV0dXJuIGNvbnQobWF5YmVBcyk7XG4gIH1cbiAgZnVuY3Rpb24gbWF5YmVNb3JlSW1wb3J0cyh0eXBlKSB7XG4gICAgaWYgKHR5cGUgPT0gXCIsXCIpIHJldHVybiBjb250KGltcG9ydFNwZWMsIG1heWJlTW9yZUltcG9ydHMpXG4gIH1cbiAgZnVuY3Rpb24gbWF5YmVBcyhfdHlwZSwgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gXCJhc1wiKSB7IGN4Lm1hcmtlZCA9IFwia2V5d29yZFwiOyByZXR1cm4gY29udChpbXBvcnRTcGVjKTsgfVxuICB9XG4gIGZ1bmN0aW9uIG1heWJlRnJvbShfdHlwZSwgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gXCJmcm9tXCIpIHsgY3gubWFya2VkID0gXCJrZXl3b3JkXCI7IHJldHVybiBjb250KGV4cHJlc3Npb24pOyB9XG4gIH1cbiAgZnVuY3Rpb24gYXJyYXlMaXRlcmFsKHR5cGUpIHtcbiAgICBpZiAodHlwZSA9PSBcIl1cIikgcmV0dXJuIGNvbnQoKTtcbiAgICByZXR1cm4gcGFzcyhjb21tYXNlcChleHByZXNzaW9uTm9Db21tYSwgXCJdXCIpKTtcbiAgfVxuICBmdW5jdGlvbiBlbnVtZGVmKCkge1xuICAgIHJldHVybiBwYXNzKHB1c2hsZXgoXCJmb3JtXCIpLCBwYXR0ZXJuLCBleHBlY3QoXCJ7XCIpLCBwdXNobGV4KFwifVwiKSwgY29tbWFzZXAoZW51bW1lbWJlciwgXCJ9XCIpLCBwb3BsZXgsIHBvcGxleClcbiAgfVxuICBmdW5jdGlvbiBlbnVtbWVtYmVyKCkge1xuICAgIHJldHVybiBwYXNzKHBhdHRlcm4sIG1heWJlQXNzaWduKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzQ29udGludWVkU3RhdGVtZW50KHN0YXRlLCB0ZXh0QWZ0ZXIpIHtcbiAgICByZXR1cm4gc3RhdGUubGFzdFR5cGUgPT0gXCJvcGVyYXRvclwiIHx8IHN0YXRlLmxhc3RUeXBlID09IFwiLFwiIHx8XG4gICAgICBpc09wZXJhdG9yQ2hhci50ZXN0KHRleHRBZnRlci5jaGFyQXQoMCkpIHx8XG4gICAgICAvWywuXS8udGVzdCh0ZXh0QWZ0ZXIuY2hhckF0KDApKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGV4cHJlc3Npb25BbGxvd2VkKHN0cmVhbSwgc3RhdGUsIGJhY2tVcCkge1xuICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZSA9PSB0b2tlbkJhc2UgJiZcbiAgICAgIC9eKD86b3BlcmF0b3J8c29mfGtleXdvcmQgW2JjZF18Y2FzZXxuZXd8ZXhwb3J0fGRlZmF1bHR8c3ByZWFkfFtcXFt7fVxcKCw7Ol18PT4pJC8udGVzdChzdGF0ZS5sYXN0VHlwZSkgfHxcbiAgICAgIChzdGF0ZS5sYXN0VHlwZSA9PSBcInF1YXNpXCIgJiYgL1xce1xccyokLy50ZXN0KHN0cmVhbS5zdHJpbmcuc2xpY2UoMCwgc3RyZWFtLnBvcyAtIChiYWNrVXAgfHwgMCkpKSlcbiAgfVxuXG4gIC8vIEludGVyZmFjZVxuXG4gIHJldHVybiB7XG4gICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oYmFzZWNvbHVtbikge1xuICAgICAgdmFyIHN0YXRlID0ge1xuICAgICAgICB0b2tlbml6ZTogdG9rZW5CYXNlLFxuICAgICAgICBsYXN0VHlwZTogXCJzb2ZcIixcbiAgICAgICAgY2M6IFtdLFxuICAgICAgICBsZXhpY2FsOiBuZXcgSlNMZXhpY2FsKChiYXNlY29sdW1uIHx8IDApIC0gaW5kZW50VW5pdCwgMCwgXCJibG9ja1wiLCBmYWxzZSksXG4gICAgICAgIGxvY2FsVmFyczogcGFyc2VyQ29uZmlnLmxvY2FsVmFycyxcbiAgICAgICAgY29udGV4dDogcGFyc2VyQ29uZmlnLmxvY2FsVmFycyAmJiBuZXcgQ29udGV4dChudWxsLCBudWxsLCBmYWxzZSksXG4gICAgICAgIGluZGVudGVkOiBiYXNlY29sdW1uIHx8IDBcbiAgICAgIH07XG4gICAgICBpZiAocGFyc2VyQ29uZmlnLmdsb2JhbFZhcnMgJiYgdHlwZW9mIHBhcnNlckNvbmZpZy5nbG9iYWxWYXJzID09IFwib2JqZWN0XCIpXG4gICAgICAgIHN0YXRlLmdsb2JhbFZhcnMgPSBwYXJzZXJDb25maWcuZ2xvYmFsVmFycztcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9LFxuXG4gICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHtcbiAgICAgIGlmIChzdHJlYW0uc29sKCkpIHtcbiAgICAgICAgaWYgKCFzdGF0ZS5sZXhpY2FsLmhhc093blByb3BlcnR5KFwiYWxpZ25cIikpXG4gICAgICAgICAgc3RhdGUubGV4aWNhbC5hbGlnbiA9IGZhbHNlO1xuICAgICAgICBzdGF0ZS5pbmRlbnRlZCA9IHN0cmVhbS5pbmRlbnRhdGlvbigpO1xuICAgICAgICBmaW5kRmF0QXJyb3coc3RyZWFtLCBzdGF0ZSk7XG4gICAgICB9XG4gICAgICBpZiAoc3RhdGUudG9rZW5pemUgIT0gdG9rZW5Db21tZW50ICYmIHN0cmVhbS5lYXRTcGFjZSgpKSByZXR1cm4gbnVsbDtcbiAgICAgIHZhciBzdHlsZSA9IHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpO1xuICAgICAgaWYgKHR5cGUgPT0gXCJjb21tZW50XCIpIHJldHVybiBzdHlsZTtcbiAgICAgIHN0YXRlLmxhc3RUeXBlID0gdHlwZSA9PSBcIm9wZXJhdG9yXCIgJiYgKGNvbnRlbnQgPT0gXCIrK1wiIHx8IGNvbnRlbnQgPT0gXCItLVwiKSA/IFwiaW5jZGVjXCIgOiB0eXBlO1xuICAgICAgcmV0dXJuIHBhcnNlSlMoc3RhdGUsIHN0eWxlLCB0eXBlLCBjb250ZW50LCBzdHJlYW0pO1xuICAgIH0sXG5cbiAgICBpbmRlbnQ6IGZ1bmN0aW9uKHN0YXRlLCB0ZXh0QWZ0ZXIpIHtcbiAgICAgIGlmIChzdGF0ZS50b2tlbml6ZSA9PSB0b2tlbkNvbW1lbnQgfHwgc3RhdGUudG9rZW5pemUgPT0gdG9rZW5RdWFzaSkgcmV0dXJuIENvZGVNaXJyb3IuUGFzcztcbiAgICAgIGlmIChzdGF0ZS50b2tlbml6ZSAhPSB0b2tlbkJhc2UpIHJldHVybiAwO1xuICAgICAgdmFyIGZpcnN0Q2hhciA9IHRleHRBZnRlciAmJiB0ZXh0QWZ0ZXIuY2hhckF0KDApLCBsZXhpY2FsID0gc3RhdGUubGV4aWNhbCwgdG9wXG4gICAgICAvLyBLbHVkZ2UgdG8gcHJldmVudCAnbWF5YmVsc2UnIGZyb20gYmxvY2tpbmcgbGV4aWNhbCBzY29wZSBwb3BzXG4gICAgICBpZiAoIS9eXFxzKmVsc2VcXGIvLnRlc3QodGV4dEFmdGVyKSkgZm9yICh2YXIgaSA9IHN0YXRlLmNjLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBjID0gc3RhdGUuY2NbaV07XG4gICAgICAgIGlmIChjID09IHBvcGxleCkgbGV4aWNhbCA9IGxleGljYWwucHJldjtcbiAgICAgICAgZWxzZSBpZiAoYyAhPSBtYXliZWVsc2UgJiYgYyAhPSBwb3Bjb250ZXh0KSBicmVhaztcbiAgICAgIH1cbiAgICAgIHdoaWxlICgobGV4aWNhbC50eXBlID09IFwic3RhdFwiIHx8IGxleGljYWwudHlwZSA9PSBcImZvcm1cIikgJiZcbiAgICAgICAgICAgICAoZmlyc3RDaGFyID09IFwifVwiIHx8ICgodG9wID0gc3RhdGUuY2Nbc3RhdGUuY2MubGVuZ3RoIC0gMV0pICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0b3AgPT0gbWF5YmVvcGVyYXRvckNvbW1hIHx8IHRvcCA9PSBtYXliZW9wZXJhdG9yTm9Db21tYSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIS9eWyxcXC49K1xcLSo6P1tcXChdLy50ZXN0KHRleHRBZnRlcikpKSlcbiAgICAgICAgbGV4aWNhbCA9IGxleGljYWwucHJldjtcbiAgICAgIGlmIChzdGF0ZW1lbnRJbmRlbnQgJiYgbGV4aWNhbC50eXBlID09IFwiKVwiICYmIGxleGljYWwucHJldi50eXBlID09IFwic3RhdFwiKVxuICAgICAgICBsZXhpY2FsID0gbGV4aWNhbC5wcmV2O1xuICAgICAgdmFyIHR5cGUgPSBsZXhpY2FsLnR5cGUsIGNsb3NpbmcgPSBmaXJzdENoYXIgPT0gdHlwZTtcblxuICAgICAgaWYgKHR5cGUgPT0gXCJ2YXJkZWZcIikgcmV0dXJuIGxleGljYWwuaW5kZW50ZWQgKyAoc3RhdGUubGFzdFR5cGUgPT0gXCJvcGVyYXRvclwiIHx8IHN0YXRlLmxhc3RUeXBlID09IFwiLFwiID8gbGV4aWNhbC5pbmZvLmxlbmd0aCArIDEgOiAwKTtcbiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gXCJmb3JtXCIgJiYgZmlyc3RDaGFyID09IFwie1wiKSByZXR1cm4gbGV4aWNhbC5pbmRlbnRlZDtcbiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gXCJmb3JtXCIpIHJldHVybiBsZXhpY2FsLmluZGVudGVkICsgaW5kZW50VW5pdDtcbiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gXCJzdGF0XCIpXG4gICAgICAgIHJldHVybiBsZXhpY2FsLmluZGVudGVkICsgKGlzQ29udGludWVkU3RhdGVtZW50KHN0YXRlLCB0ZXh0QWZ0ZXIpID8gc3RhdGVtZW50SW5kZW50IHx8IGluZGVudFVuaXQgOiAwKTtcbiAgICAgIGVsc2UgaWYgKGxleGljYWwuaW5mbyA9PSBcInN3aXRjaFwiICYmICFjbG9zaW5nICYmIHBhcnNlckNvbmZpZy5kb3VibGVJbmRlbnRTd2l0Y2ggIT0gZmFsc2UpXG4gICAgICAgIHJldHVybiBsZXhpY2FsLmluZGVudGVkICsgKC9eKD86Y2FzZXxkZWZhdWx0KVxcYi8udGVzdCh0ZXh0QWZ0ZXIpID8gaW5kZW50VW5pdCA6IDIgKiBpbmRlbnRVbml0KTtcbiAgICAgIGVsc2UgaWYgKGxleGljYWwuYWxpZ24pIHJldHVybiBsZXhpY2FsLmNvbHVtbiArIChjbG9zaW5nID8gMCA6IDEpO1xuICAgICAgZWxzZSByZXR1cm4gbGV4aWNhbC5pbmRlbnRlZCArIChjbG9zaW5nID8gMCA6IGluZGVudFVuaXQpO1xuICAgIH0sXG5cbiAgICBlbGVjdHJpY0lucHV0OiAvXlxccyooPzpjYXNlIC4qPzp8ZGVmYXVsdDp8XFx7fFxcfSkkLyxcbiAgICBibG9ja0NvbW1lbnRTdGFydDoganNvbk1vZGUgPyBudWxsIDogXCIvKlwiLFxuICAgIGJsb2NrQ29tbWVudEVuZDoganNvbk1vZGUgPyBudWxsIDogXCIqL1wiLFxuICAgIGJsb2NrQ29tbWVudENvbnRpbnVlOiBqc29uTW9kZSA/IG51bGwgOiBcIiAqIFwiLFxuICAgIGxpbmVDb21tZW50OiBqc29uTW9kZSA/IG51bGwgOiBcIi8vXCIsXG4gICAgZm9sZDogXCJicmFjZVwiLFxuICAgIGNsb3NlQnJhY2tldHM6IFwiKClbXXt9JydcXFwiXFxcImBgXCIsXG5cbiAgICBoZWxwZXJUeXBlOiBqc29uTW9kZSA/IFwianNvblwiIDogXCJqYXZhc2NyaXB0XCIsXG4gICAganNvbmxkTW9kZToganNvbmxkTW9kZSxcbiAgICBqc29uTW9kZToganNvbk1vZGUsXG5cbiAgICBleHByZXNzaW9uQWxsb3dlZDogZXhwcmVzc2lvbkFsbG93ZWQsXG5cbiAgICBza2lwRXhwcmVzc2lvbjogZnVuY3Rpb24oc3RhdGUpIHtcbiAgICAgIHZhciB0b3AgPSBzdGF0ZS5jY1tzdGF0ZS5jYy5sZW5ndGggLSAxXVxuICAgICAgaWYgKHRvcCA9PSBleHByZXNzaW9uIHx8IHRvcCA9PSBleHByZXNzaW9uTm9Db21tYSkgc3RhdGUuY2MucG9wKClcbiAgICB9XG4gIH07XG59KTtcblxuQ29kZU1pcnJvci5yZWdpc3RlckhlbHBlcihcIndvcmRDaGFyc1wiLCBcImphdmFzY3JpcHRcIiwgL1tcXHckXS8pO1xuXG5Db2RlTWlycm9yLmRlZmluZU1JTUUoXCJ0ZXh0L2phdmFzY3JpcHRcIiwgXCJqYXZhc2NyaXB0XCIpO1xuQ29kZU1pcnJvci5kZWZpbmVNSU1FKFwidGV4dC9lY21hc2NyaXB0XCIsIFwiamF2YXNjcmlwdFwiKTtcbkNvZGVNaXJyb3IuZGVmaW5lTUlNRShcImFwcGxpY2F0aW9uL2phdmFzY3JpcHRcIiwgXCJqYXZhc2NyaXB0XCIpO1xuQ29kZU1pcnJvci5kZWZpbmVNSU1FKFwiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0XCIsIFwiamF2YXNjcmlwdFwiKTtcbkNvZGVNaXJyb3IuZGVmaW5lTUlNRShcImFwcGxpY2F0aW9uL2VjbWFzY3JpcHRcIiwgXCJqYXZhc2NyaXB0XCIpO1xuQ29kZU1pcnJvci5kZWZpbmVNSU1FKFwiYXBwbGljYXRpb24vanNvblwiLCB7IG5hbWU6IFwiamF2YXNjcmlwdFwiLCBqc29uOiB0cnVlIH0pO1xuQ29kZU1pcnJvci5kZWZpbmVNSU1FKFwiYXBwbGljYXRpb24veC1qc29uXCIsIHsgbmFtZTogXCJqYXZhc2NyaXB0XCIsIGpzb246IHRydWUgfSk7XG5Db2RlTWlycm9yLmRlZmluZU1JTUUoXCJhcHBsaWNhdGlvbi9tYW5pZmVzdCtqc29uXCIsIHsgbmFtZTogXCJqYXZhc2NyaXB0XCIsIGpzb246IHRydWUgfSlcbkNvZGVNaXJyb3IuZGVmaW5lTUlNRShcImFwcGxpY2F0aW9uL2xkK2pzb25cIiwgeyBuYW1lOiBcImphdmFzY3JpcHRcIiwganNvbmxkOiB0cnVlIH0pO1xuQ29kZU1pcnJvci5kZWZpbmVNSU1FKFwidGV4dC90eXBlc2NyaXB0XCIsIHsgbmFtZTogXCJqYXZhc2NyaXB0XCIsIHR5cGVzY3JpcHQ6IHRydWUgfSk7XG5Db2RlTWlycm9yLmRlZmluZU1JTUUoXCJhcHBsaWNhdGlvbi90eXBlc2NyaXB0XCIsIHsgbmFtZTogXCJqYXZhc2NyaXB0XCIsIHR5cGVzY3JpcHQ6IHRydWUgfSk7XG5cbn0pO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/codemirror/mode/javascript/javascript.js\n"); /***/ }), /***/ "./node_modules/codemirror/mode/markdown/markdown.js": -/*!***********************************************************!* +/*!***********************************************************!*\ !*** ./node_modules/codemirror/mode/markdown/markdown.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { -eval("// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n if (true) // CommonJS\n mod(__webpack_require__(/*! ../../lib/codemirror */ \"./node_modules/codemirror/lib/codemirror.js\"), __webpack_require__(/*! ../xml/xml */ \"./node_modules/codemirror/mode/xml/xml.js\"), __webpack_require__(/*! ../meta */ \"./node_modules/codemirror/mode/meta.js\"));\n else {}\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"markdown\", function(cmCfg, modeCfg) {\n\n var htmlMode = CodeMirror.getMode(cmCfg, \"text/html\");\n var htmlModeMissing = htmlMode.name == \"null\"\n\n function getMode(name) {\n if (CodeMirror.findModeByName) {\n var found = CodeMirror.findModeByName(name);\n if (found) name = found.mime || found.mimes[0];\n }\n var mode = CodeMirror.getMode(cmCfg, name);\n return mode.name == \"null\" ? null : mode;\n }\n\n // Should characters that affect highlighting be highlighted separate?\n // Does not include characters that will be output (such as `1.` and `-` for lists)\n if (modeCfg.highlightFormatting === undefined)\n modeCfg.highlightFormatting = false;\n\n // Maximum number of nested blockquotes. Set to 0 for infinite nesting.\n // Excess `>` will emit `error` token.\n if (modeCfg.maxBlockquoteDepth === undefined)\n modeCfg.maxBlockquoteDepth = 0;\n\n // Turn on task lists? (\"- [ ] \" and \"- [x] \")\n if (modeCfg.taskLists === undefined) modeCfg.taskLists = false;\n\n // Turn on strikethrough syntax\n if (modeCfg.strikethrough === undefined)\n modeCfg.strikethrough = false;\n\n if (modeCfg.emoji === undefined)\n modeCfg.emoji = false;\n\n if (modeCfg.fencedCodeBlockHighlighting === undefined)\n modeCfg.fencedCodeBlockHighlighting = true;\n\n if (modeCfg.fencedCodeBlockDefaultMode === undefined)\n modeCfg.fencedCodeBlockDefaultMode = 'text/plain';\n\n if (modeCfg.xml === undefined)\n modeCfg.xml = true;\n\n // Allow token types to be overridden by user-provided token types.\n if (modeCfg.tokenTypeOverrides === undefined)\n modeCfg.tokenTypeOverrides = {};\n\n var tokenTypes = {\n header: \"header\",\n code: \"comment\",\n quote: \"quote\",\n list1: \"variable-2\",\n list2: \"variable-3\",\n list3: \"keyword\",\n hr: \"hr\",\n image: \"image\",\n imageAltText: \"image-alt-text\",\n imageMarker: \"image-marker\",\n formatting: \"formatting\",\n linkInline: \"link\",\n linkEmail: \"link\",\n linkText: \"link\",\n linkHref: \"string\",\n em: \"em\",\n strong: \"strong\",\n strikethrough: \"strikethrough\",\n emoji: \"builtin\"\n };\n\n for (var tokenType in tokenTypes) {\n if (tokenTypes.hasOwnProperty(tokenType) && modeCfg.tokenTypeOverrides[tokenType]) {\n tokenTypes[tokenType] = modeCfg.tokenTypeOverrides[tokenType];\n }\n }\n\n var hrRE = /^([*\\-_])(?:\\s*\\1){2,}\\s*$/\n , listRE = /^(?:[*\\-+]|^[0-9]+([.)]))\\s+/\n , taskListRE = /^\\[(x| )\\](?=\\s)/i // Must follow listRE\n , atxHeaderRE = modeCfg.allowAtxHeaderWithoutSpace ? /^(#+)/ : /^(#+)(?: |$)/\n , setextHeaderRE = /^ {0,3}(?:\\={1,}|-{2,})\\s*$/\n , textRE = /^[^#!\\[\\]*_\\\\<>` \"'(~:]+/\n , fencedCodeRE = /^(~~~+|```+)[ \\t]*([\\w\\/+#-]*)[^\\n`]*$/\n , linkDefRE = /^\\s*\\[[^\\]]+?\\]:.*$/ // naive link-definition\n , punctuation = /[!\"#$%&'()*+,\\-.\\/:;<=>?@\\[\\\\\\]^_`{|}~\\xA1\\xA7\\xAB\\xB6\\xB7\\xBB\\xBF\\u037E\\u0387\\u055A-\\u055F\\u0589\\u058A\\u05BE\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061E\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u0AF0\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F14\\u0F3A-\\u0F3D\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1360-\\u1368\\u1400\\u166D\\u166E\\u169B\\u169C\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B5A-\\u1B60\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CC0-\\u1CC7\\u1CD3\\u2010-\\u2027\\u2030-\\u2043\\u2045-\\u2051\\u2053-\\u205E\\u207D\\u207E\\u208D\\u208E\\u2308-\\u230B\\u2329\\u232A\\u2768-\\u2775\\u27C5\\u27C6\\u27E6-\\u27EF\\u2983-\\u2998\\u29D8-\\u29DB\\u29FC\\u29FD\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00-\\u2E2E\\u2E30-\\u2E42\\u3001-\\u3003\\u3008-\\u3011\\u3014-\\u301F\\u3030\\u303D\\u30A0\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA8FC\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uAAF0\\uAAF1\\uABEB\\uFD3E\\uFD3F\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE61\\uFE63\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF0A\\uFF0C-\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3B-\\uFF3D\\uFF3F\\uFF5B\\uFF5D\\uFF5F-\\uFF65]|\\uD800[\\uDD00-\\uDD02\\uDF9F\\uDFD0]|\\uD801\\uDD6F|\\uD802[\\uDC57\\uDD1F\\uDD3F\\uDE50-\\uDE58\\uDE7F\\uDEF0-\\uDEF6\\uDF39-\\uDF3F\\uDF99-\\uDF9C]|\\uD804[\\uDC47-\\uDC4D\\uDCBB\\uDCBC\\uDCBE-\\uDCC1\\uDD40-\\uDD43\\uDD74\\uDD75\\uDDC5-\\uDDC9\\uDDCD\\uDDDB\\uDDDD-\\uDDDF\\uDE38-\\uDE3D\\uDEA9]|\\uD805[\\uDCC6\\uDDC1-\\uDDD7\\uDE41-\\uDE43\\uDF3C-\\uDF3E]|\\uD809[\\uDC70-\\uDC74]|\\uD81A[\\uDE6E\\uDE6F\\uDEF5\\uDF37-\\uDF3B\\uDF44]|\\uD82F\\uDC9F|\\uD836[\\uDE87-\\uDE8B]/\n , expandedTab = \" \" // CommonMark specifies tab as 4 spaces\n\n function switchInline(stream, state, f) {\n state.f = state.inline = f;\n return f(stream, state);\n }\n\n function switchBlock(stream, state, f) {\n state.f = state.block = f;\n return f(stream, state);\n }\n\n function lineIsEmpty(line) {\n return !line || !/\\S/.test(line.string)\n }\n\n // Blocks\n\n function blankLine(state) {\n // Reset linkTitle state\n state.linkTitle = false;\n state.linkHref = false;\n state.linkText = false;\n // Reset EM state\n state.em = false;\n // Reset STRONG state\n state.strong = false;\n // Reset strikethrough state\n state.strikethrough = false;\n // Reset state.quote\n state.quote = 0;\n // Reset state.indentedCode\n state.indentedCode = false;\n if (state.f == htmlBlock) {\n var exit = htmlModeMissing\n if (!exit) {\n var inner = CodeMirror.innerMode(htmlMode, state.htmlState)\n exit = inner.mode.name == \"xml\" && inner.state.tagStart === null &&\n (!inner.state.context && inner.state.tokenize.isInText)\n }\n if (exit) {\n state.f = inlineNormal;\n state.block = blockNormal;\n state.htmlState = null;\n }\n }\n // Reset state.trailingSpace\n state.trailingSpace = 0;\n state.trailingSpaceNewLine = false;\n // Mark this line as blank\n state.prevLine = state.thisLine\n state.thisLine = {stream: null}\n return null;\n }\n\n function blockNormal(stream, state) {\n var firstTokenOnLine = stream.column() === state.indentation;\n var prevLineLineIsEmpty = lineIsEmpty(state.prevLine.stream);\n var prevLineIsIndentedCode = state.indentedCode;\n var prevLineIsHr = state.prevLine.hr;\n var prevLineIsList = state.list !== false;\n var maxNonCodeIndentation = (state.listStack[state.listStack.length - 1] || 0) + 3;\n\n state.indentedCode = false;\n\n var lineIndentation = state.indentation;\n // compute once per line (on first token)\n if (state.indentationDiff === null) {\n state.indentationDiff = state.indentation;\n if (prevLineIsList) {\n state.list = null;\n // While this list item's marker's indentation is less than the deepest\n // list item's content's indentation,pop the deepest list item\n // indentation off the stack, and update block indentation state\n while (lineIndentation < state.listStack[state.listStack.length - 1]) {\n state.listStack.pop();\n if (state.listStack.length) {\n state.indentation = state.listStack[state.listStack.length - 1];\n // less than the first list's indent -> the line is no longer a list\n } else {\n state.list = false;\n }\n }\n if (state.list !== false) {\n state.indentationDiff = lineIndentation - state.listStack[state.listStack.length - 1]\n }\n }\n }\n\n // not comprehensive (currently only for setext detection purposes)\n var allowsInlineContinuation = (\n !prevLineLineIsEmpty && !prevLineIsHr && !state.prevLine.header &&\n (!prevLineIsList || !prevLineIsIndentedCode) &&\n !state.prevLine.fencedCodeEnd\n );\n\n var isHr = (state.list === false || prevLineIsHr || prevLineLineIsEmpty) &&\n state.indentation <= maxNonCodeIndentation && stream.match(hrRE);\n\n var match = null;\n if (state.indentationDiff >= 4 && (prevLineIsIndentedCode || state.prevLine.fencedCodeEnd ||\n state.prevLine.header || prevLineLineIsEmpty)) {\n stream.skipToEnd();\n state.indentedCode = true;\n return tokenTypes.code;\n } else if (stream.eatSpace()) {\n return null;\n } else if (firstTokenOnLine && state.indentation <= maxNonCodeIndentation && (match = stream.match(atxHeaderRE)) && match[1].length <= 6) {\n state.quote = 0;\n state.header = match[1].length;\n state.thisLine.header = true;\n if (modeCfg.highlightFormatting) state.formatting = \"header\";\n state.f = state.inline;\n return getType(state);\n } else if (state.indentation <= maxNonCodeIndentation && stream.eat('>')) {\n state.quote = firstTokenOnLine ? 1 : state.quote + 1;\n if (modeCfg.highlightFormatting) state.formatting = \"quote\";\n stream.eatSpace();\n return getType(state);\n } else if (!isHr && !state.setext && firstTokenOnLine && state.indentation <= maxNonCodeIndentation && (match = stream.match(listRE))) {\n var listType = match[1] ? \"ol\" : \"ul\";\n\n state.indentation = lineIndentation + stream.current().length;\n state.list = true;\n state.quote = 0;\n\n // Add this list item's content's indentation to the stack\n state.listStack.push(state.indentation);\n // Reset inline styles which shouldn't propagate aross list items\n state.em = false;\n state.strong = false;\n state.code = false;\n state.strikethrough = false;\n\n if (modeCfg.taskLists && stream.match(taskListRE, false)) {\n state.taskList = true;\n }\n state.f = state.inline;\n if (modeCfg.highlightFormatting) state.formatting = [\"list\", \"list-\" + listType];\n return getType(state);\n } else if (firstTokenOnLine && state.indentation <= maxNonCodeIndentation && (match = stream.match(fencedCodeRE, true))) {\n state.quote = 0;\n state.fencedEndRE = new RegExp(match[1] + \"+ *$\");\n // try switching mode\n state.localMode = modeCfg.fencedCodeBlockHighlighting && getMode(match[2] || modeCfg.fencedCodeBlockDefaultMode );\n if (state.localMode) state.localState = CodeMirror.startState(state.localMode);\n state.f = state.block = local;\n if (modeCfg.highlightFormatting) state.formatting = \"code-block\";\n state.code = -1\n return getType(state);\n // SETEXT has lowest block-scope precedence after HR, so check it after\n // the others (code, blockquote, list...)\n } else if (\n // if setext set, indicates line after ---/===\n state.setext || (\n // line before ---/===\n (!allowsInlineContinuation || !prevLineIsList) && !state.quote && state.list === false &&\n !state.code && !isHr && !linkDefRE.test(stream.string) &&\n (match = stream.lookAhead(1)) && (match = match.match(setextHeaderRE))\n )\n ) {\n if ( !state.setext ) {\n state.header = match[0].charAt(0) == '=' ? 1 : 2;\n state.setext = state.header;\n } else {\n state.header = state.setext;\n // has no effect on type so we can reset it now\n state.setext = 0;\n stream.skipToEnd();\n if (modeCfg.highlightFormatting) state.formatting = \"header\";\n }\n state.thisLine.header = true;\n state.f = state.inline;\n return getType(state);\n } else if (isHr) {\n stream.skipToEnd();\n state.hr = true;\n state.thisLine.hr = true;\n return tokenTypes.hr;\n } else if (stream.peek() === '[') {\n return switchInline(stream, state, footnoteLink);\n }\n\n return switchInline(stream, state, state.inline);\n }\n\n function htmlBlock(stream, state) {\n var style = htmlMode.token(stream, state.htmlState);\n if (!htmlModeMissing) {\n var inner = CodeMirror.innerMode(htmlMode, state.htmlState)\n if ((inner.mode.name == \"xml\" && inner.state.tagStart === null &&\n (!inner.state.context && inner.state.tokenize.isInText)) ||\n (state.md_inside && stream.current().indexOf(\">\") > -1)) {\n state.f = inlineNormal;\n state.block = blockNormal;\n state.htmlState = null;\n }\n }\n return style;\n }\n\n function local(stream, state) {\n var currListInd = state.listStack[state.listStack.length - 1] || 0;\n var hasExitedList = state.indentation < currListInd;\n var maxFencedEndInd = currListInd + 3;\n if (state.fencedEndRE && state.indentation <= maxFencedEndInd && (hasExitedList || stream.match(state.fencedEndRE))) {\n if (modeCfg.highlightFormatting) state.formatting = \"code-block\";\n var returnType;\n if (!hasExitedList) returnType = getType(state)\n state.localMode = state.localState = null;\n state.block = blockNormal;\n state.f = inlineNormal;\n state.fencedEndRE = null;\n state.code = 0\n state.thisLine.fencedCodeEnd = true;\n if (hasExitedList) return switchBlock(stream, state, state.block);\n return returnType;\n } else if (state.localMode) {\n return state.localMode.token(stream, state.localState);\n } else {\n stream.skipToEnd();\n return tokenTypes.code;\n }\n }\n\n // Inline\n function getType(state) {\n var styles = [];\n\n if (state.formatting) {\n styles.push(tokenTypes.formatting);\n\n if (typeof state.formatting === \"string\") state.formatting = [state.formatting];\n\n for (var i = 0; i < state.formatting.length; i++) {\n styles.push(tokenTypes.formatting + \"-\" + state.formatting[i]);\n\n if (state.formatting[i] === \"header\") {\n styles.push(tokenTypes.formatting + \"-\" + state.formatting[i] + \"-\" + state.header);\n }\n\n // Add `formatting-quote` and `formatting-quote-#` for blockquotes\n // Add `error` instead if the maximum blockquote nesting depth is passed\n if (state.formatting[i] === \"quote\") {\n if (!modeCfg.maxBlockquoteDepth || modeCfg.maxBlockquoteDepth >= state.quote) {\n styles.push(tokenTypes.formatting + \"-\" + state.formatting[i] + \"-\" + state.quote);\n } else {\n styles.push(\"error\");\n }\n }\n }\n }\n\n if (state.taskOpen) {\n styles.push(\"meta\");\n return styles.length ? styles.join(' ') : null;\n }\n if (state.taskClosed) {\n styles.push(\"property\");\n return styles.length ? styles.join(' ') : null;\n }\n\n if (state.linkHref) {\n styles.push(tokenTypes.linkHref, \"url\");\n } else { // Only apply inline styles to non-url text\n if (state.strong) { styles.push(tokenTypes.strong); }\n if (state.em) { styles.push(tokenTypes.em); }\n if (state.strikethrough) { styles.push(tokenTypes.strikethrough); }\n if (state.emoji) { styles.push(tokenTypes.emoji); }\n if (state.linkText) { styles.push(tokenTypes.linkText); }\n if (state.code) { styles.push(tokenTypes.code); }\n if (state.image) { styles.push(tokenTypes.image); }\n if (state.imageAltText) { styles.push(tokenTypes.imageAltText, \"link\"); }\n if (state.imageMarker) { styles.push(tokenTypes.imageMarker); }\n }\n\n if (state.header) { styles.push(tokenTypes.header, tokenTypes.header + \"-\" + state.header); }\n\n if (state.quote) {\n styles.push(tokenTypes.quote);\n\n // Add `quote-#` where the maximum for `#` is modeCfg.maxBlockquoteDepth\n if (!modeCfg.maxBlockquoteDepth || modeCfg.maxBlockquoteDepth >= state.quote) {\n styles.push(tokenTypes.quote + \"-\" + state.quote);\n } else {\n styles.push(tokenTypes.quote + \"-\" + modeCfg.maxBlockquoteDepth);\n }\n }\n\n if (state.list !== false) {\n var listMod = (state.listStack.length - 1) % 3;\n if (!listMod) {\n styles.push(tokenTypes.list1);\n } else if (listMod === 1) {\n styles.push(tokenTypes.list2);\n } else {\n styles.push(tokenTypes.list3);\n }\n }\n\n if (state.trailingSpaceNewLine) {\n styles.push(\"trailing-space-new-line\");\n } else if (state.trailingSpace) {\n styles.push(\"trailing-space-\" + (state.trailingSpace % 2 ? \"a\" : \"b\"));\n }\n\n return styles.length ? styles.join(' ') : null;\n }\n\n function handleText(stream, state) {\n if (stream.match(textRE, true)) {\n return getType(state);\n }\n return undefined;\n }\n\n function inlineNormal(stream, state) {\n var style = state.text(stream, state);\n if (typeof style !== 'undefined')\n return style;\n\n if (state.list) { // List marker (*, +, -, 1., etc)\n state.list = null;\n return getType(state);\n }\n\n if (state.taskList) {\n var taskOpen = stream.match(taskListRE, true)[1] === \" \";\n if (taskOpen) state.taskOpen = true;\n else state.taskClosed = true;\n if (modeCfg.highlightFormatting) state.formatting = \"task\";\n state.taskList = false;\n return getType(state);\n }\n\n state.taskOpen = false;\n state.taskClosed = false;\n\n if (state.header && stream.match(/^#+$/, true)) {\n if (modeCfg.highlightFormatting) state.formatting = \"header\";\n return getType(state);\n }\n\n var ch = stream.next();\n\n // Matches link titles present on next line\n if (state.linkTitle) {\n state.linkTitle = false;\n var matchCh = ch;\n if (ch === '(') {\n matchCh = ')';\n }\n matchCh = (matchCh+'').replace(/([.?*+^\\[\\]\\\\(){}|-])/g, \"\\\\$1\");\n var regex = '^\\\\s*(?:[^' + matchCh + '\\\\\\\\]+|\\\\\\\\\\\\\\\\|\\\\\\\\.)' + matchCh;\n if (stream.match(new RegExp(regex), true)) {\n return tokenTypes.linkHref;\n }\n }\n\n // If this block is changed, it may need to be updated in GFM mode\n if (ch === '`') {\n var previousFormatting = state.formatting;\n if (modeCfg.highlightFormatting) state.formatting = \"code\";\n stream.eatWhile('`');\n var count = stream.current().length\n if (state.code == 0 && (!state.quote || count == 1)) {\n state.code = count\n return getType(state)\n } else if (count == state.code) { // Must be exact\n var t = getType(state)\n state.code = 0\n return t\n } else {\n state.formatting = previousFormatting\n return getType(state)\n }\n } else if (state.code) {\n return getType(state);\n }\n\n if (ch === '\\\\') {\n stream.next();\n if (modeCfg.highlightFormatting) {\n var type = getType(state);\n var formattingEscape = tokenTypes.formatting + \"-escape\";\n return type ? type + \" \" + formattingEscape : formattingEscape;\n }\n }\n\n if (ch === '!' && stream.match(/\\[[^\\]]*\\] ?(?:\\(|\\[)/, false)) {\n state.imageMarker = true;\n state.image = true;\n if (modeCfg.highlightFormatting) state.formatting = \"image\";\n return getType(state);\n }\n\n if (ch === '[' && state.imageMarker && stream.match(/[^\\]]*\\](\\(.*?\\)| ?\\[.*?\\])/, false)) {\n state.imageMarker = false;\n state.imageAltText = true\n if (modeCfg.highlightFormatting) state.formatting = \"image\";\n return getType(state);\n }\n\n if (ch === ']' && state.imageAltText) {\n if (modeCfg.highlightFormatting) state.formatting = \"image\";\n var type = getType(state);\n state.imageAltText = false;\n state.image = false;\n state.inline = state.f = linkHref;\n return type;\n }\n\n if (ch === '[' && !state.image) {\n if (state.linkText && stream.match(/^.*?\\]/)) return getType(state)\n state.linkText = true;\n if (modeCfg.highlightFormatting) state.formatting = \"link\";\n return getType(state);\n }\n\n if (ch === ']' && state.linkText) {\n if (modeCfg.highlightFormatting) state.formatting = \"link\";\n var type = getType(state);\n state.linkText = false;\n state.inline = state.f = stream.match(/\\(.*?\\)| ?\\[.*?\\]/, false) ? linkHref : inlineNormal\n return type;\n }\n\n if (ch === '<' && stream.match(/^(https?|ftps?):\\/\\/(?:[^\\\\>]|\\\\.)+>/, false)) {\n state.f = state.inline = linkInline;\n if (modeCfg.highlightFormatting) state.formatting = \"link\";\n var type = getType(state);\n if (type){\n type += \" \";\n } else {\n type = \"\";\n }\n return type + tokenTypes.linkInline;\n }\n\n if (ch === '<' && stream.match(/^[^> \\\\]+@(?:[^\\\\>]|\\\\.)+>/, false)) {\n state.f = state.inline = linkInline;\n if (modeCfg.highlightFormatting) state.formatting = \"link\";\n var type = getType(state);\n if (type){\n type += \" \";\n } else {\n type = \"\";\n }\n return type + tokenTypes.linkEmail;\n }\n\n if (modeCfg.xml && ch === '<' && stream.match(/^(!--|\\?|!\\[CDATA\\[|[a-z][a-z0-9-]*(?:\\s+[a-z_:.\\-]+(?:\\s*=\\s*[^>]+)?)*\\s*(?:>|$))/i, false)) {\n var end = stream.string.indexOf(\">\", stream.pos);\n if (end != -1) {\n var atts = stream.string.substring(stream.start, end);\n if (/markdown\\s*=\\s*('|\"){0,1}1('|\"){0,1}/.test(atts)) state.md_inside = true;\n }\n stream.backUp(1);\n state.htmlState = CodeMirror.startState(htmlMode);\n return switchBlock(stream, state, htmlBlock);\n }\n\n if (modeCfg.xml && ch === '<' && stream.match(/^\\/\\w*?>/)) {\n state.md_inside = false;\n return \"tag\";\n } else if (ch === \"*\" || ch === \"_\") {\n var len = 1, before = stream.pos == 1 ? \" \" : stream.string.charAt(stream.pos - 2)\n while (len < 3 && stream.eat(ch)) len++\n var after = stream.peek() || \" \"\n // See http://spec.commonmark.org/0.27/#emphasis-and-strong-emphasis\n var leftFlanking = !/\\s/.test(after) && (!punctuation.test(after) || /\\s/.test(before) || punctuation.test(before))\n var rightFlanking = !/\\s/.test(before) && (!punctuation.test(before) || /\\s/.test(after) || punctuation.test(after))\n var setEm = null, setStrong = null\n if (len % 2) { // Em\n if (!state.em && leftFlanking && (ch === \"*\" || !rightFlanking || punctuation.test(before)))\n setEm = true\n else if (state.em == ch && rightFlanking && (ch === \"*\" || !leftFlanking || punctuation.test(after)))\n setEm = false\n }\n if (len > 1) { // Strong\n if (!state.strong && leftFlanking && (ch === \"*\" || !rightFlanking || punctuation.test(before)))\n setStrong = true\n else if (state.strong == ch && rightFlanking && (ch === \"*\" || !leftFlanking || punctuation.test(after)))\n setStrong = false\n }\n if (setStrong != null || setEm != null) {\n if (modeCfg.highlightFormatting) state.formatting = setEm == null ? \"strong\" : setStrong == null ? \"em\" : \"strong em\"\n if (setEm === true) state.em = ch\n if (setStrong === true) state.strong = ch\n var t = getType(state)\n if (setEm === false) state.em = false\n if (setStrong === false) state.strong = false\n return t\n }\n } else if (ch === ' ') {\n if (stream.eat('*') || stream.eat('_')) { // Probably surrounded by spaces\n if (stream.peek() === ' ') { // Surrounded by spaces, ignore\n return getType(state);\n } else { // Not surrounded by spaces, back up pointer\n stream.backUp(1);\n }\n }\n }\n\n if (modeCfg.strikethrough) {\n if (ch === '~' && stream.eatWhile(ch)) {\n if (state.strikethrough) {// Remove strikethrough\n if (modeCfg.highlightFormatting) state.formatting = \"strikethrough\";\n var t = getType(state);\n state.strikethrough = false;\n return t;\n } else if (stream.match(/^[^\\s]/, false)) {// Add strikethrough\n state.strikethrough = true;\n if (modeCfg.highlightFormatting) state.formatting = \"strikethrough\";\n return getType(state);\n }\n } else if (ch === ' ') {\n if (stream.match(/^~~/, true)) { // Probably surrounded by space\n if (stream.peek() === ' ') { // Surrounded by spaces, ignore\n return getType(state);\n } else { // Not surrounded by spaces, back up pointer\n stream.backUp(2);\n }\n }\n }\n }\n\n if (modeCfg.emoji && ch === \":\" && stream.match(/^(?:[a-z_\\d+][a-z_\\d+-]*|\\-[a-z_\\d+][a-z_\\d+-]*):/)) {\n state.emoji = true;\n if (modeCfg.highlightFormatting) state.formatting = \"emoji\";\n var retType = getType(state);\n state.emoji = false;\n return retType;\n }\n\n if (ch === ' ') {\n if (stream.match(/^ +$/, false)) {\n state.trailingSpace++;\n } else if (state.trailingSpace) {\n state.trailingSpaceNewLine = true;\n }\n }\n\n return getType(state);\n }\n\n function linkInline(stream, state) {\n var ch = stream.next();\n\n if (ch === \">\") {\n state.f = state.inline = inlineNormal;\n if (modeCfg.highlightFormatting) state.formatting = \"link\";\n var type = getType(state);\n if (type){\n type += \" \";\n } else {\n type = \"\";\n }\n return type + tokenTypes.linkInline;\n }\n\n stream.match(/^[^>]+/, true);\n\n return tokenTypes.linkInline;\n }\n\n function linkHref(stream, state) {\n // Check if space, and return NULL if so (to avoid marking the space)\n if(stream.eatSpace()){\n return null;\n }\n var ch = stream.next();\n if (ch === '(' || ch === '[') {\n state.f = state.inline = getLinkHrefInside(ch === \"(\" ? \")\" : \"]\");\n if (modeCfg.highlightFormatting) state.formatting = \"link-string\";\n state.linkHref = true;\n return getType(state);\n }\n return 'error';\n }\n\n var linkRE = {\n \")\": /^(?:[^\\\\\\(\\)]|\\\\.|\\((?:[^\\\\\\(\\)]|\\\\.)*\\))*?(?=\\))/,\n \"]\": /^(?:[^\\\\\\[\\]]|\\\\.|\\[(?:[^\\\\\\[\\]]|\\\\.)*\\])*?(?=\\])/\n }\n\n function getLinkHrefInside(endChar) {\n return function(stream, state) {\n var ch = stream.next();\n\n if (ch === endChar) {\n state.f = state.inline = inlineNormal;\n if (modeCfg.highlightFormatting) state.formatting = \"link-string\";\n var returnState = getType(state);\n state.linkHref = false;\n return returnState;\n }\n\n stream.match(linkRE[endChar])\n state.linkHref = true;\n return getType(state);\n };\n }\n\n function footnoteLink(stream, state) {\n if (stream.match(/^([^\\]\\\\]|\\\\.)*\\]:/, false)) {\n state.f = footnoteLinkInside;\n stream.next(); // Consume [\n if (modeCfg.highlightFormatting) state.formatting = \"link\";\n state.linkText = true;\n return getType(state);\n }\n return switchInline(stream, state, inlineNormal);\n }\n\n function footnoteLinkInside(stream, state) {\n if (stream.match(/^\\]:/, true)) {\n state.f = state.inline = footnoteUrl;\n if (modeCfg.highlightFormatting) state.formatting = \"link\";\n var returnType = getType(state);\n state.linkText = false;\n return returnType;\n }\n\n stream.match(/^([^\\]\\\\]|\\\\.)+/, true);\n\n return tokenTypes.linkText;\n }\n\n function footnoteUrl(stream, state) {\n // Check if space, and return NULL if so (to avoid marking the space)\n if(stream.eatSpace()){\n return null;\n }\n // Match URL\n stream.match(/^[^\\s]+/, true);\n // Check for link title\n if (stream.peek() === undefined) { // End of line, set flag to check next line\n state.linkTitle = true;\n } else { // More content on line, check if link title\n stream.match(/^(?:\\s+(?:\"(?:[^\"\\\\]|\\\\\\\\|\\\\.)+\"|'(?:[^'\\\\]|\\\\\\\\|\\\\.)+'|\\((?:[^)\\\\]|\\\\\\\\|\\\\.)+\\)))?/, true);\n }\n state.f = state.inline = inlineNormal;\n return tokenTypes.linkHref + \" url\";\n }\n\n var mode = {\n startState: function() {\n return {\n f: blockNormal,\n\n prevLine: {stream: null},\n thisLine: {stream: null},\n\n block: blockNormal,\n htmlState: null,\n indentation: 0,\n\n inline: inlineNormal,\n text: handleText,\n\n formatting: false,\n linkText: false,\n linkHref: false,\n linkTitle: false,\n code: 0,\n em: false,\n strong: false,\n header: 0,\n setext: 0,\n hr: false,\n taskList: false,\n list: false,\n listStack: [],\n quote: 0,\n trailingSpace: 0,\n trailingSpaceNewLine: false,\n strikethrough: false,\n emoji: false,\n fencedEndRE: null\n };\n },\n\n copyState: function(s) {\n return {\n f: s.f,\n\n prevLine: s.prevLine,\n thisLine: s.thisLine,\n\n block: s.block,\n htmlState: s.htmlState && CodeMirror.copyState(htmlMode, s.htmlState),\n indentation: s.indentation,\n\n localMode: s.localMode,\n localState: s.localMode ? CodeMirror.copyState(s.localMode, s.localState) : null,\n\n inline: s.inline,\n text: s.text,\n formatting: false,\n linkText: s.linkText,\n linkTitle: s.linkTitle,\n linkHref: s.linkHref,\n code: s.code,\n em: s.em,\n strong: s.strong,\n strikethrough: s.strikethrough,\n emoji: s.emoji,\n header: s.header,\n setext: s.setext,\n hr: s.hr,\n taskList: s.taskList,\n list: s.list,\n listStack: s.listStack.slice(0),\n quote: s.quote,\n indentedCode: s.indentedCode,\n trailingSpace: s.trailingSpace,\n trailingSpaceNewLine: s.trailingSpaceNewLine,\n md_inside: s.md_inside,\n fencedEndRE: s.fencedEndRE\n };\n },\n\n token: function(stream, state) {\n\n // Reset state.formatting\n state.formatting = false;\n\n if (stream != state.thisLine.stream) {\n state.header = 0;\n state.hr = false;\n\n if (stream.match(/^\\s*$/, true)) {\n blankLine(state);\n return null;\n }\n\n state.prevLine = state.thisLine\n state.thisLine = {stream: stream}\n\n // Reset state.taskList\n state.taskList = false;\n\n // Reset state.trailingSpace\n state.trailingSpace = 0;\n state.trailingSpaceNewLine = false;\n\n if (!state.localState) {\n state.f = state.block;\n if (state.f != htmlBlock) {\n var indentation = stream.match(/^\\s*/, true)[0].replace(/\\t/g, expandedTab).length;\n state.indentation = indentation;\n state.indentationDiff = null;\n if (indentation > 0) return null;\n }\n }\n }\n return state.f(stream, state);\n },\n\n innerMode: function(state) {\n if (state.block == htmlBlock) return {state: state.htmlState, mode: htmlMode};\n if (state.localState) return {state: state.localState, mode: state.localMode};\n return {state: state, mode: mode};\n },\n\n indent: function(state, textAfter, line) {\n if (state.block == htmlBlock && htmlMode.indent) return htmlMode.indent(state.htmlState, textAfter, line)\n if (state.localState && state.localMode.indent) return state.localMode.indent(state.localState, textAfter, line)\n return CodeMirror.Pass\n },\n\n blankLine: blankLine,\n\n getType: getType,\n\n blockCommentStart: \"\",\n closeBrackets: \"()[]{}''\\\"\\\"``\",\n fold: \"markdown\"\n };\n return mode;\n}, \"xml\");\n\nCodeMirror.defineMIME(\"text/markdown\", \"markdown\");\n\nCodeMirror.defineMIME(\"text/x-markdown\", \"markdown\");\n\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vbm9kZV9tb2R1bGVzL2NvZGVtaXJyb3IvbW9kZS9tYXJrZG93bi9tYXJrZG93bi5qcz85NTliIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNLElBQXVEO0FBQzdELFFBQVEsbUJBQU8sQ0FBQyx5RUFBc0IsR0FBRyxtQkFBTyxDQUFDLDZEQUFZLEdBQUcsbUJBQU8sQ0FBQyx1REFBUztBQUNqRixPQUFPLEVBR2E7QUFDcEIsQ0FBQztBQUNEOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpQ0FBaUMsR0FBRztBQUNwQztBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsSUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHO0FBQzlDO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxlQUFlLEVBQUU7QUFDMUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FB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QTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQSxLQUFLLE9BQU87QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG1CQUFtQixhQUFhO0FBQ2hDLG1CQUFtQixhQUFhOztBQUVoQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMEJBQTBCOztBQUUxQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLDRDQUE0QztBQUM1QyxvQ0FBb0M7QUFDcEMsY0FBYztBQUNkLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMOztBQUVBOztBQUVBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDs7QUFFQTs7QUFFQSxDQUFDIiwiZmlsZSI6Ii4vbm9kZV9tb2R1bGVzL2NvZGVtaXJyb3IvbW9kZS9tYXJrZG93bi9tYXJrZG93bi5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvZGVNaXJyb3IsIGNvcHlyaWdodCAoYykgYnkgTWFyaWpuIEhhdmVyYmVrZSBhbmQgb3RoZXJzXG4vLyBEaXN0cmlidXRlZCB1bmRlciBhbiBNSVQgbGljZW5zZTogaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFXG5cbihmdW5jdGlvbihtb2QpIHtcbiAgaWYgKHR5cGVvZiBleHBvcnRzID09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG1vZHVsZSA9PSBcIm9iamVjdFwiKSAvLyBDb21tb25KU1xuICAgIG1vZChyZXF1aXJlKFwiLi4vLi4vbGliL2NvZGVtaXJyb3JcIiksIHJlcXVpcmUoXCIuLi94bWwveG1sXCIpLCByZXF1aXJlKFwiLi4vbWV0YVwiKSk7XG4gIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIC8vIEFNRFxuICAgIGRlZmluZShbXCIuLi8uLi9saWIvY29kZW1pcnJvclwiLCBcIi4uL3htbC94bWxcIiwgXCIuLi9tZXRhXCJdLCBtb2QpO1xuICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52XG4gICAgbW9kKENvZGVNaXJyb3IpO1xufSkoZnVuY3Rpb24oQ29kZU1pcnJvcikge1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbkNvZGVNaXJyb3IuZGVmaW5lTW9kZShcIm1hcmtkb3duXCIsIGZ1bmN0aW9uKGNtQ2ZnLCBtb2RlQ2ZnKSB7XG5cbiAgdmFyIGh0bWxNb2RlID0gQ29kZU1pcnJvci5nZXRNb2RlKGNtQ2ZnLCBcInRleHQvaHRtbFwiKTtcbiAgdmFyIGh0bWxNb2RlTWlzc2luZyA9IGh0bWxNb2RlLm5hbWUgPT0gXCJudWxsXCJcblxuICBmdW5jdGlvbiBnZXRNb2RlKG5hbWUpIHtcbiAgICBpZiAoQ29kZU1pcnJvci5maW5kTW9kZUJ5TmFtZSkge1xuICAgICAgdmFyIGZvdW5kID0gQ29kZU1pcnJvci5maW5kTW9kZUJ5TmFtZShuYW1lKTtcbiAgICAgIGlmIChmb3VuZCkgbmFtZSA9IGZvdW5kLm1pbWUgfHwgZm91bmQubWltZXNbMF07XG4gICAgfVxuICAgIHZhciBtb2RlID0gQ29kZU1pcnJvci5nZXRNb2RlKGNtQ2ZnLCBuYW1lKTtcbiAgICByZXR1cm4gbW9kZS5uYW1lID09IFwibnVsbFwiID8gbnVsbCA6IG1vZGU7XG4gIH1cblxuICAvLyBTaG91bGQgY2hhcmFjdGVycyB0aGF0IGFmZmVjdCBoaWdobGlnaHRpbmcgYmUgaGlnaGxpZ2h0ZWQgc2VwYXJhdGU/XG4gIC8vIERvZXMgbm90IGluY2x1ZGUgY2hhcmFjdGVycyB0aGF0IHdpbGwgYmUgb3V0cHV0IChzdWNoIGFzIGAxLmAgYW5kIGAtYCBmb3IgbGlzdHMpXG4gIGlmIChtb2RlQ2ZnLmhpZ2hsaWdodEZvcm1hdHRpbmcgPT09IHVuZGVmaW5lZClcbiAgICBtb2RlQ2ZnLmhpZ2hsaWdodEZvcm1hdHRpbmcgPSBmYWxzZTtcblxuICAvLyBNYXhpbXVtIG51bWJlciBvZiBuZXN0ZWQgYmxvY2txdW90ZXMuIFNldCB0byAwIGZvciBpbmZpbml0ZSBuZXN0aW5nLlxuICAvLyBFeGNlc3MgYD5gIHdpbGwgZW1pdCBgZXJyb3JgIHRva2VuLlxuICBpZiAobW9kZUNmZy5tYXhCbG9ja3F1b3RlRGVwdGggPT09IHVuZGVmaW5lZClcbiAgICBtb2RlQ2ZnLm1heEJsb2NrcXVvdGVEZXB0aCA9IDA7XG5cbiAgLy8gVHVybiBvbiB0YXNrIGxpc3RzPyAoXCItIFsgXSBcIiBhbmQgXCItIFt4XSBcIilcbiAgaWYgKG1vZGVDZmcudGFza0xpc3RzID09PSB1bmRlZmluZWQpIG1vZGVDZmcudGFza0xpc3RzID0gZmFsc2U7XG5cbiAgLy8gVHVybiBvbiBzdHJpa2V0aHJvdWdoIHN5bnRheFxuICBpZiAobW9kZUNmZy5zdHJpa2V0aHJvdWdoID09PSB1bmRlZmluZWQpXG4gICAgbW9kZUNmZy5zdHJpa2V0aHJvdWdoID0gZmFsc2U7XG5cbiAgaWYgKG1vZGVDZmcuZW1vamkgPT09IHVuZGVmaW5lZClcbiAgICBtb2RlQ2ZnLmVtb2ppID0gZmFsc2U7XG5cbiAgaWYgKG1vZGVDZmcuZmVuY2VkQ29kZUJsb2NrSGlnaGxpZ2h0aW5nID09PSB1bmRlZmluZWQpXG4gICAgbW9kZUNmZy5mZW5jZWRDb2RlQmxvY2tIaWdobGlnaHRpbmcgPSB0cnVlO1xuXG4gIGlmIChtb2RlQ2ZnLmZlbmNlZENvZGVCbG9ja0RlZmF1bHRNb2RlID09PSB1bmRlZmluZWQpXG4gICAgbW9kZUNmZy5mZW5jZWRDb2RlQmxvY2tEZWZhdWx0TW9kZSA9ICd0ZXh0L3BsYWluJztcblxuICBpZiAobW9kZUNmZy54bWwgPT09IHVuZGVmaW5lZClcbiAgICBtb2RlQ2ZnLnhtbCA9IHRydWU7XG5cbiAgLy8gQWxsb3cgdG9rZW4gdHlwZXMgdG8gYmUgb3ZlcnJpZGRlbiBieSB1c2VyLXByb3ZpZGVkIHRva2VuIHR5cGVzLlxuICBpZiAobW9kZUNmZy50b2tlblR5cGVPdmVycmlkZXMgPT09IHVuZGVmaW5lZClcbiAgICBtb2RlQ2ZnLnRva2VuVHlwZU92ZXJyaWRlcyA9IHt9O1xuXG4gIHZhciB0b2tlblR5cGVzID0ge1xuICAgIGhlYWRlcjogXCJoZWFkZXJcIixcbiAgICBjb2RlOiBcImNvbW1lbnRcIixcbiAgICBxdW90ZTogXCJxdW90ZVwiLFxuICAgIGxpc3QxOiBcInZhcmlhYmxlLTJcIixcbiAgICBsaXN0MjogXCJ2YXJpYWJsZS0zXCIsXG4gICAgbGlzdDM6IFwia2V5d29yZFwiLFxuICAgIGhyOiBcImhyXCIsXG4gICAgaW1hZ2U6IFwiaW1hZ2VcIixcbiAgICBpbWFnZUFsdFRleHQ6IFwiaW1hZ2UtYWx0LXRleHRcIixcbiAgICBpbWFnZU1hcmtlcjogXCJpbWFnZS1tYXJrZXJcIixcbiAgICBmb3JtYXR0aW5nOiBcImZvcm1hdHRpbmdcIixcbiAgICBsaW5rSW5saW5lOiBcImxpbmtcIixcbiAgICBsaW5rRW1haWw6IFwibGlua1wiLFxuICAgIGxpbmtUZXh0OiBcImxpbmtcIixcbiAgICBsaW5rSHJlZjogXCJzdHJpbmdcIixcbiAgICBlbTogXCJlbVwiLFxuICAgIHN0cm9uZzogXCJzdHJvbmdcIixcbiAgICBzdHJpa2V0aHJvdWdoOiBcInN0cmlrZXRocm91Z2hcIixcbiAgICBlbW9qaTogXCJidWlsdGluXCJcbiAgfTtcblxuICBmb3IgKHZhciB0b2tlblR5cGUgaW4gdG9rZW5UeXBlcykge1xuICAgIGlmICh0b2tlblR5cGVzLmhhc093blByb3BlcnR5KHRva2VuVHlwZSkgJiYgbW9kZUNmZy50b2tlblR5cGVPdmVycmlkZXNbdG9rZW5UeXBlXSkge1xuICAgICAgdG9rZW5UeXBlc1t0b2tlblR5cGVdID0gbW9kZUNmZy50b2tlblR5cGVPdmVycmlkZXNbdG9rZW5UeXBlXTtcbiAgICB9XG4gIH1cblxuICB2YXIgaHJSRSA9IC9eKFsqXFwtX10pKD86XFxzKlxcMSl7Mix9XFxzKiQvXG4gICwgICBsaXN0UkUgPSAvXig/OlsqXFwtK118XlswLTldKyhbLildKSlcXHMrL1xuICAsICAgdGFza0xpc3RSRSA9IC9eXFxbKHh8IClcXF0oPz1cXHMpL2kgLy8gTXVzdCBmb2xsb3cgbGlzdFJFXG4gICwgICBhdHhIZWFkZXJSRSA9IG1vZGVDZmcuYWxsb3dBdHhIZWFkZXJXaXRob3V0U3BhY2UgPyAvXigjKykvIDogL14oIyspKD86IHwkKS9cbiAgLCAgIHNldGV4dEhlYWRlclJFID0gL14gezAsM30oPzpcXD17MSx9fC17Mix9KVxccyokL1xuICAsICAgdGV4dFJFID0gL15bXiMhXFxbXFxdKl9cXFxcPD5gIFwiJyh+Ol0rL1xuICAsICAgZmVuY2VkQ29kZVJFID0gL14ofn5+K3xgYGArKVsgXFx0XSooW1xcd1xcLysjLV0qKVteXFxuYF0qJC9cbiAgLCAgIGxpbmtEZWZSRSA9IC9eXFxzKlxcW1teXFxdXSs/XFxdOi4qJC8gLy8gbmFpdmUgbGluay1kZWZpbml0aW9uXG4gICwgICBwdW5jdHVhdGlvbiA9IC9bIVwiIyQlJicoKSorLFxcLS5cXC86Ozw9Pj9AXFxbXFxcXFxcXV5fYHt8fX5cXHhBMVxceEE3XFx4QUJcXHhCNlxceEI3XFx4QkJcXHhCRlxcdTAzN0VcXHUwMzg3XFx1MDU1QS1cXHUwNTVGXFx1MDU4OVxcdTA1OEFcXHUwNUJFXFx1MDVDMFxcdTA1QzNcXHUwNUM2XFx1MDVGM1xcdTA1RjRcXHUwNjA5XFx1MDYwQVxcdTA2MENcXHUwNjBEXFx1MDYxQlxcdTA2MUVcXHUwNjFGXFx1MDY2QS1cXHUwNjZEXFx1MDZENFxcdTA3MDAtXFx1MDcwRFxcdTA3RjctXFx1MDdGOVxcdTA4MzAtXFx1MDgzRVxcdTA4NUVcXHUwOTY0XFx1MDk2NVxcdTA5NzBcXHUwQUYwXFx1MERGNFxcdTBFNEZcXHUwRTVBXFx1MEU1QlxcdTBGMDQtXFx1MEYxMlxcdTBGMTRcXHUwRjNBLVxcdTBGM0RcXHUwRjg1XFx1MEZEMC1cXHUwRkQ0XFx1MEZEOVxcdTBGREFcXHUxMDRBLVxcdTEwNEZcXHUxMEZCXFx1MTM2MC1cXHUxMzY4XFx1MTQwMFxcdTE2NkRcXHUxNjZFXFx1MTY5QlxcdTE2OUNcXHUxNkVCLVxcdTE2RURcXHUxNzM1XFx1MTczNlxcdTE3RDQtXFx1MTdENlxcdTE3RDgtXFx1MTdEQVxcdTE4MDAtXFx1MTgwQVxcdTE5NDRcXHUxOTQ1XFx1MUExRVxcdTFBMUZcXHUxQUEwLVxcdTFBQTZcXHUxQUE4LVxcdTFBQURcXHUxQjVBLVxcdTFCNjBcXHUxQkZDLVxcdTFCRkZcXHUxQzNCLVxcdTFDM0ZcXHUxQzdFXFx1MUM3RlxcdTFDQzAtXFx1MUNDN1xcdTFDRDNcXHUyMDEwLVxcdTIwMjdcXHUyMDMwLVxcdTIwNDNcXHUyMDQ1LVxcdTIwNTFcXHUyMDUzLVxcdTIwNUVcXHUyMDdEXFx1MjA3RVxcdTIwOERcXHUyMDhFXFx1MjMwOC1cXHUyMzBCXFx1MjMyOVxcdTIzMkFcXHUyNzY4LVxcdTI3NzVcXHUyN0M1XFx1MjdDNlxcdTI3RTYtXFx1MjdFRlxcdTI5ODMtXFx1Mjk5OFxcdTI5RDgtXFx1MjlEQlxcdTI5RkNcXHUyOUZEXFx1MkNGOS1cXHUyQ0ZDXFx1MkNGRVxcdTJDRkZcXHUyRDcwXFx1MkUwMC1cXHUyRTJFXFx1MkUzMC1cXHUyRTQyXFx1MzAwMS1cXHUzMDAzXFx1MzAwOC1cXHUzMDExXFx1MzAxNC1cXHUzMDFGXFx1MzAzMFxcdTMwM0RcXHUzMEEwXFx1MzBGQlxcdUE0RkVcXHVBNEZGXFx1QTYwRC1cXHVBNjBGXFx1QTY3M1xcdUE2N0VcXHVBNkYyLVxcdUE2RjdcXHVBODc0LVxcdUE4NzdcXHVBOENFXFx1QThDRlxcdUE4RjgtXFx1QThGQVxcdUE4RkNcXHVBOTJFXFx1QTkyRlxcdUE5NUZcXHVBOUMxLVxcdUE5Q0RcXHVBOURFXFx1QTlERlxcdUFBNUMtXFx1QUE1RlxcdUFBREVcXHVBQURGXFx1QUFGMFxcdUFBRjFcXHVBQkVCXFx1RkQzRVxcdUZEM0ZcXHVGRTEwLVxcdUZFMTlcXHVGRTMwLVxcdUZFNTJcXHVGRTU0LVxcdUZFNjFcXHVGRTYzXFx1RkU2OFxcdUZFNkFcXHVGRTZCXFx1RkYwMS1cXHVGRjAzXFx1RkYwNS1cXHVGRjBBXFx1RkYwQy1cXHVGRjBGXFx1RkYxQVxcdUZGMUJcXHVGRjFGXFx1RkYyMFxcdUZGM0ItXFx1RkYzRFxcdUZGM0ZcXHVGRjVCXFx1RkY1RFxcdUZGNUYtXFx1RkY2NV18XFx1RDgwMFtcXHVERDAwLVxcdUREMDJcXHVERjlGXFx1REZEMF18XFx1RDgwMVxcdURENkZ8XFx1RDgwMltcXHVEQzU3XFx1REQxRlxcdUREM0ZcXHVERTUwLVxcdURFNThcXHVERTdGXFx1REVGMC1cXHVERUY2XFx1REYzOS1cXHVERjNGXFx1REY5OS1cXHVERjlDXXxcXHVEODA0W1xcdURDNDctXFx1REM0RFxcdURDQkJcXHVEQ0JDXFx1RENCRS1cXHVEQ0MxXFx1REQ0MC1cXHVERDQzXFx1REQ3NFxcdURENzVcXHVEREM1LVxcdUREQzlcXHVERENEXFx1REREQlxcdUREREQtXFx1RERERlxcdURFMzgtXFx1REUzRFxcdURFQTldfFxcdUQ4MDVbXFx1RENDNlxcdUREQzEtXFx1REREN1xcdURFNDEtXFx1REU0M1xcdURGM0MtXFx1REYzRV18XFx1RDgwOVtcXHVEQzcwLVxcdURDNzRdfFxcdUQ4MUFbXFx1REU2RVxcdURFNkZcXHVERUY1XFx1REYzNy1cXHVERjNCXFx1REY0NF18XFx1RDgyRlxcdURDOUZ8XFx1RDgzNltcXHVERTg3LVxcdURFOEJdL1xuICAsICAgZXhwYW5kZWRUYWIgPSBcIiAgICBcIiAvLyBDb21tb25NYXJrIHNwZWNpZmllcyB0YWIgYXMgNCBzcGFjZXNcblxuICBmdW5jdGlvbiBzd2l0Y2hJbmxpbmUoc3RyZWFtLCBzdGF0ZSwgZikge1xuICAgIHN0YXRlLmYgPSBzdGF0ZS5pbmxpbmUgPSBmO1xuICAgIHJldHVybiBmKHN0cmVhbSwgc3RhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gc3dpdGNoQmxvY2soc3RyZWFtLCBzdGF0ZSwgZikge1xuICAgIHN0YXRlLmYgPSBzdGF0ZS5ibG9jayA9IGY7XG4gICAgcmV0dXJuIGYoc3RyZWFtLCBzdGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBsaW5lSXNFbXB0eShsaW5lKSB7XG4gICAgcmV0dXJuICFsaW5lIHx8ICEvXFxTLy50ZXN0KGxpbmUuc3RyaW5nKVxuICB9XG5cbiAgLy8gQmxvY2tzXG5cbiAgZnVuY3Rpb24gYmxhbmtMaW5lKHN0YXRlKSB7XG4gICAgLy8gUmVzZXQgbGlua1RpdGxlIHN0YXRlXG4gICAgc3RhdGUubGlua1RpdGxlID0gZmFsc2U7XG4gICAgc3RhdGUubGlua0hyZWYgPSBmYWxzZTtcbiAgICBzdGF0ZS5saW5rVGV4dCA9IGZhbHNlO1xuICAgIC8vIFJlc2V0IEVNIHN0YXRlXG4gICAgc3RhdGUuZW0gPSBmYWxzZTtcbiAgICAvLyBSZXNldCBTVFJPTkcgc3RhdGVcbiAgICBzdGF0ZS5zdHJvbmcgPSBmYWxzZTtcbiAgICAvLyBSZXNldCBzdHJpa2V0aHJvdWdoIHN0YXRlXG4gICAgc3RhdGUuc3RyaWtldGhyb3VnaCA9IGZhbHNlO1xuICAgIC8vIFJlc2V0IHN0YXRlLnF1b3RlXG4gICAgc3RhdGUucXVvdGUgPSAwO1xuICAgIC8vIFJlc2V0IHN0YXRlLmluZGVudGVkQ29kZVxuICAgIHN0YXRlLmluZGVudGVkQ29kZSA9IGZhbHNlO1xuICAgIGlmIChzdGF0ZS5mID09IGh0bWxCbG9jaykge1xuICAgICAgdmFyIGV4aXQgPSBodG1sTW9kZU1pc3NpbmdcbiAgICAgIGlmICghZXhpdCkge1xuICAgICAgICB2YXIgaW5uZXIgPSBDb2RlTWlycm9yLmlubmVyTW9kZShodG1sTW9kZSwgc3RhdGUuaHRtbFN0YXRlKVxuICAgICAgICBleGl0ID0gaW5uZXIubW9kZS5uYW1lID09IFwieG1sXCIgJiYgaW5uZXIuc3RhdGUudGFnU3RhcnQgPT09IG51bGwgJiZcbiAgICAgICAgICAoIWlubmVyLnN0YXRlLmNvbnRleHQgJiYgaW5uZXIuc3RhdGUudG9rZW5pemUuaXNJblRleHQpXG4gICAgICB9XG4gICAgICBpZiAoZXhpdCkge1xuICAgICAgICBzdGF0ZS5mID0gaW5saW5lTm9ybWFsO1xuICAgICAgICBzdGF0ZS5ibG9jayA9IGJsb2NrTm9ybWFsO1xuICAgICAgICBzdGF0ZS5odG1sU3RhdGUgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBSZXNldCBzdGF0ZS50cmFpbGluZ1NwYWNlXG4gICAgc3RhdGUudHJhaWxpbmdTcGFjZSA9IDA7XG4gICAgc3RhdGUudHJhaWxpbmdTcGFjZU5ld0xpbmUgPSBmYWxzZTtcbiAgICAvLyBNYXJrIHRoaXMgbGluZSBhcyBibGFua1xuICAgIHN0YXRlLnByZXZMaW5lID0gc3RhdGUudGhpc0xpbmVcbiAgICBzdGF0ZS50aGlzTGluZSA9IHtzdHJlYW06IG51bGx9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiBibG9ja05vcm1hbChzdHJlYW0sIHN0YXRlKSB7XG4gICAgdmFyIGZpcnN0VG9rZW5PbkxpbmUgPSBzdHJlYW0uY29sdW1uKCkgPT09IHN0YXRlLmluZGVudGF0aW9uO1xuICAgIHZhciBwcmV2TGluZUxpbmVJc0VtcHR5ID0gbGluZUlzRW1wdHkoc3RhdGUucHJldkxpbmUuc3RyZWFtKTtcbiAgICB2YXIgcHJldkxpbmVJc0luZGVudGVkQ29kZSA9IHN0YXRlLmluZGVudGVkQ29kZTtcbiAgICB2YXIgcHJldkxpbmVJc0hyID0gc3RhdGUucHJldkxpbmUuaHI7XG4gICAgdmFyIHByZXZMaW5lSXNMaXN0ID0gc3RhdGUubGlzdCAhPT0gZmFsc2U7XG4gICAgdmFyIG1heE5vbkNvZGVJbmRlbnRhdGlvbiA9IChzdGF0ZS5saXN0U3RhY2tbc3RhdGUubGlzdFN0YWNrLmxlbmd0aCAtIDFdIHx8IDApICsgMztcblxuICAgIHN0YXRlLmluZGVudGVkQ29kZSA9IGZhbHNlO1xuXG4gICAgdmFyIGxpbmVJbmRlbnRhdGlvbiA9IHN0YXRlLmluZGVudGF0aW9uO1xuICAgIC8vIGNvbXB1dGUgb25jZSBwZXIgbGluZSAob24gZmlyc3QgdG9rZW4pXG4gICAgaWYgKHN0YXRlLmluZGVudGF0aW9uRGlmZiA9PT0gbnVsbCkge1xuICAgICAgc3RhdGUuaW5kZW50YXRpb25EaWZmID0gc3RhdGUuaW5kZW50YXRpb247XG4gICAgICBpZiAocHJldkxpbmVJc0xpc3QpIHtcbiAgICAgICAgc3RhdGUubGlzdCA9IG51bGw7XG4gICAgICAgIC8vIFdoaWxlIHRoaXMgbGlzdCBpdGVtJ3MgbWFya2VyJ3MgaW5kZW50YXRpb24gaXMgbGVzcyB0aGFuIHRoZSBkZWVwZXN0XG4gICAgICAgIC8vICBsaXN0IGl0ZW0ncyBjb250ZW50J3MgaW5kZW50YXRpb24scG9wIHRoZSBkZWVwZXN0IGxpc3QgaXRlbVxuICAgICAgICAvLyAgaW5kZW50YXRpb24gb2ZmIHRoZSBzdGFjaywgYW5kIHVwZGF0ZSBibG9jayBpbmRlbnRhdGlvbiBzdGF0ZVxuICAgICAgICB3aGlsZSAobGluZUluZGVudGF0aW9uIDwgc3RhdGUubGlzdFN0YWNrW3N0YXRlLmxpc3RTdGFjay5sZW5ndGggLSAxXSkge1xuICAgICAgICAgIHN0YXRlLmxpc3RTdGFjay5wb3AoKTtcbiAgICAgICAgICBpZiAoc3RhdGUubGlzdFN0YWNrLmxlbmd0aCkge1xuICAgICAgICAgICAgc3RhdGUuaW5kZW50YXRpb24gPSBzdGF0ZS5saXN0U3RhY2tbc3RhdGUubGlzdFN0YWNrLmxlbmd0aCAtIDFdO1xuICAgICAgICAgIC8vIGxlc3MgdGhhbiB0aGUgZmlyc3QgbGlzdCdzIGluZGVudCAtPiB0aGUgbGluZSBpcyBubyBsb25nZXIgYSBsaXN0XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXRlLmxpc3QgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLmxpc3QgIT09IGZhbHNlKSB7XG4gICAgICAgICAgc3RhdGUuaW5kZW50YXRpb25EaWZmID0gbGluZUluZGVudGF0aW9uIC0gc3RhdGUubGlzdFN0YWNrW3N0YXRlLmxpc3RTdGFjay5sZW5ndGggLSAxXVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gbm90IGNvbXByZWhlbnNpdmUgKGN1cnJlbnRseSBvbmx5IGZvciBzZXRleHQgZGV0ZWN0aW9uIHB1cnBvc2VzKVxuICAgIHZhciBhbGxvd3NJbmxpbmVDb250aW51YXRpb24gPSAoXG4gICAgICAgICFwcmV2TGluZUxpbmVJc0VtcHR5ICYmICFwcmV2TGluZUlzSHIgJiYgIXN0YXRlLnByZXZMaW5lLmhlYWRlciAmJlxuICAgICAgICAoIXByZXZMaW5lSXNMaXN0IHx8ICFwcmV2TGluZUlzSW5kZW50ZWRDb2RlKSAmJlxuICAgICAgICAhc3RhdGUucHJldkxpbmUuZmVuY2VkQ29kZUVuZFxuICAgICk7XG5cbiAgICB2YXIgaXNIciA9IChzdGF0ZS5saXN0ID09PSBmYWxzZSB8fCBwcmV2TGluZUlzSHIgfHwgcHJldkxpbmVMaW5lSXNFbXB0eSkgJiZcbiAgICAgIHN0YXRlLmluZGVudGF0aW9uIDw9IG1heE5vbkNvZGVJbmRlbnRhdGlvbiAmJiBzdHJlYW0ubWF0Y2goaHJSRSk7XG5cbiAgICB2YXIgbWF0Y2ggPSBudWxsO1xuICAgIGlmIChzdGF0ZS5pbmRlbnRhdGlvbkRpZmYgPj0gNCAmJiAocHJldkxpbmVJc0luZGVudGVkQ29kZSB8fCBzdGF0ZS5wcmV2TGluZS5mZW5jZWRDb2RlRW5kIHx8XG4gICAgICAgICBzdGF0ZS5wcmV2TGluZS5oZWFkZXIgfHwgcHJldkxpbmVMaW5lSXNFbXB0eSkpIHtcbiAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTtcbiAgICAgIHN0YXRlLmluZGVudGVkQ29kZSA9IHRydWU7XG4gICAgICByZXR1cm4gdG9rZW5UeXBlcy5jb2RlO1xuICAgIH0gZWxzZSBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSBpZiAoZmlyc3RUb2tlbk9uTGluZSAmJiBzdGF0ZS5pbmRlbnRhdGlvbiA8PSBtYXhOb25Db2RlSW5kZW50YXRpb24gJiYgKG1hdGNoID0gc3RyZWFtLm1hdGNoKGF0eEhlYWRlclJFKSkgJiYgbWF0Y2hbMV0ubGVuZ3RoIDw9IDYpIHtcbiAgICAgIHN0YXRlLnF1b3RlID0gMDtcbiAgICAgIHN0YXRlLmhlYWRlciA9IG1hdGNoWzFdLmxlbmd0aDtcbiAgICAgIHN0YXRlLnRoaXNMaW5lLmhlYWRlciA9IHRydWU7XG4gICAgICBpZiAobW9kZUNmZy5oaWdobGlnaHRGb3JtYXR0aW5nKSBzdGF0ZS5mb3JtYXR0aW5nID0gXCJoZWFkZXJcIjtcbiAgICAgIHN0YXRlLmYgPSBzdGF0ZS5pbmxpbmU7XG4gICAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSk7XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5pbmRlbnRhdGlvbiA8PSBtYXhOb25Db2RlSW5kZW50YXRpb24gJiYgc3RyZWFtLmVhdCgnPicpKSB7XG4gICAgICBzdGF0ZS5xdW90ZSA9IGZpcnN0VG9rZW5PbkxpbmUgPyAxIDogc3RhdGUucXVvdGUgKyAxO1xuICAgICAgaWYgKG1vZGVDZmcuaGlnaGxpZ2h0Rm9ybWF0dGluZykgc3RhdGUuZm9ybWF0dGluZyA9IFwicXVvdGVcIjtcbiAgICAgIHN0cmVhbS5lYXRTcGFjZSgpO1xuICAgICAgcmV0dXJuIGdldFR5cGUoc3RhdGUpO1xuICAgIH0gZWxzZSBpZiAoIWlzSHIgJiYgIXN0YXRlLnNldGV4dCAmJiBmaXJzdFRva2VuT25MaW5lICYmIHN0YXRlLmluZGVudGF0aW9uIDw9IG1heE5vbkNvZGVJbmRlbnRhdGlvbiAmJiAobWF0Y2ggPSBzdHJlYW0ubWF0Y2gobGlzdFJFKSkpIHtcbiAgICAgIHZhciBsaXN0VHlwZSA9IG1hdGNoWzFdID8gXCJvbFwiIDogXCJ1bFwiO1xuXG4gICAgICBzdGF0ZS5pbmRlbnRhdGlvbiA9IGxpbmVJbmRlbnRhdGlvbiArIHN0cmVhbS5jdXJyZW50KCkubGVuZ3RoO1xuICAgICAgc3RhdGUubGlzdCA9IHRydWU7XG4gICAgICBzdGF0ZS5xdW90ZSA9IDA7XG5cbiAgICAgIC8vIEFkZCB0aGlzIGxpc3QgaXRlbSdzIGNvbnRlbnQncyBpbmRlbnRhdGlvbiB0byB0aGUgc3RhY2tcbiAgICAgIHN0YXRlLmxpc3RTdGFjay5wdXNoKHN0YXRlLmluZGVudGF0aW9uKTtcbiAgICAgIC8vIFJlc2V0IGlubGluZSBzdHlsZXMgd2hpY2ggc2hvdWxkbid0IHByb3BhZ2F0ZSBhcm9zcyBsaXN0IGl0ZW1zXG4gICAgICBzdGF0ZS5lbSA9IGZhbHNlO1xuICAgICAgc3RhdGUuc3Ryb25nID0gZmFsc2U7XG4gICAgICBzdGF0ZS5jb2RlID0gZmFsc2U7XG4gICAgICBzdGF0ZS5zdHJpa2V0aHJvdWdoID0gZmFsc2U7XG5cbiAgICAgIGlmIChtb2RlQ2ZnLnRhc2tMaXN0cyAmJiBzdHJlYW0ubWF0Y2godGFza0xpc3RSRSwgZmFsc2UpKSB7XG4gICAgICAgIHN0YXRlLnRhc2tMaXN0ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHN0YXRlLmYgPSBzdGF0ZS5pbmxpbmU7XG4gICAgICBpZiAobW9kZUNmZy5oaWdobGlnaHRGb3JtYXR0aW5nKSBzdGF0ZS5mb3JtYXR0aW5nID0gW1wibGlzdFwiLCBcImxpc3QtXCIgKyBsaXN0VHlwZV07XG4gICAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSk7XG4gICAgfSBlbHNlIGlmIChmaXJzdFRva2VuT25MaW5lICYmIHN0YXRlLmluZGVudGF0aW9uIDw9IG1heE5vbkNvZGVJbmRlbnRhdGlvbiAmJiAobWF0Y2ggPSBzdHJlYW0ubWF0Y2goZmVuY2VkQ29kZVJFLCB0cnVlKSkpIHtcbiAgICAgIHN0YXRlLnF1b3RlID0gMDtcbiAgICAgIHN0YXRlLmZlbmNlZEVuZFJFID0gbmV3IFJlZ0V4cChtYXRjaFsxXSArIFwiKyAqJFwiKTtcbiAgICAgIC8vIHRyeSBzd2l0Y2hpbmcgbW9kZVxuICAgICAgc3RhdGUubG9jYWxNb2RlID0gbW9kZUNmZy5mZW5jZWRDb2RlQmxvY2tIaWdobGlnaHRpbmcgJiYgZ2V0TW9kZShtYXRjaFsyXSB8fCBtb2RlQ2ZnLmZlbmNlZENvZGVCbG9ja0RlZmF1bHRNb2RlICk7XG4gICAgICBpZiAoc3RhdGUubG9jYWxNb2RlKSBzdGF0ZS5sb2NhbFN0YXRlID0gQ29kZU1pcnJvci5zdGFydFN0YXRlKHN0YXRlLmxvY2FsTW9kZSk7XG4gICAgICBzdGF0ZS5mID0gc3RhdGUuYmxvY2sgPSBsb2NhbDtcbiAgICAgIGlmIChtb2RlQ2ZnLmhpZ2hsaWdodEZvcm1hdHRpbmcpIHN0YXRlLmZvcm1hdHRpbmcgPSBcImNvZGUtYmxvY2tcIjtcbiAgICAgIHN0YXRlLmNvZGUgPSAtMVxuICAgICAgcmV0dXJuIGdldFR5cGUoc3RhdGUpO1xuICAgIC8vIFNFVEVYVCBoYXMgbG93ZXN0IGJsb2NrLXNjb3BlIHByZWNlZGVuY2UgYWZ0ZXIgSFIsIHNvIGNoZWNrIGl0IGFmdGVyXG4gICAgLy8gIHRoZSBvdGhlcnMgKGNvZGUsIGJsb2NrcXVvdGUsIGxpc3QuLi4pXG4gICAgfSBlbHNlIGlmIChcbiAgICAgIC8vIGlmIHNldGV4dCBzZXQsIGluZGljYXRlcyBsaW5lIGFmdGVyIC0tLS89PT1cbiAgICAgIHN0YXRlLnNldGV4dCB8fCAoXG4gICAgICAgIC8vIGxpbmUgYmVmb3JlIC0tLS89PT1cbiAgICAgICAgKCFhbGxvd3NJbmxpbmVDb250aW51YXRpb24gfHwgIXByZXZMaW5lSXNMaXN0KSAmJiAhc3RhdGUucXVvdGUgJiYgc3RhdGUubGlzdCA9PT0gZmFsc2UgJiZcbiAgICAgICAgIXN0YXRlLmNvZGUgJiYgIWlzSHIgJiYgIWxpbmtEZWZSRS50ZXN0KHN0cmVhbS5zdHJpbmcpICYmXG4gICAgICAgIChtYXRjaCA9IHN0cmVhbS5sb29rQWhlYWQoMSkpICYmIChtYXRjaCA9IG1hdGNoLm1hdGNoKHNldGV4dEhlYWRlclJFKSlcbiAgICAgIClcbiAgICApIHtcbiAgICAgIGlmICggIXN0YXRlLnNldGV4dCApIHtcbiAgICAgICAgc3RhdGUuaGVhZGVyID0gbWF0Y2hbMF0uY2hhckF0KDApID09ICc9JyA/IDEgOiAyO1xuICAgICAgICBzdGF0ZS5zZXRleHQgPSBzdGF0ZS5oZWFkZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5oZWFkZXIgPSBzdGF0ZS5zZXRleHQ7XG4gICAgICAgIC8vIGhhcyBubyBlZmZlY3Qgb24gdHlwZSBzbyB3ZSBjYW4gcmVzZXQgaXQgbm93XG4gICAgICAgIHN0YXRlLnNldGV4dCA9IDA7XG4gICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTtcbiAgICAgICAgaWYgKG1vZGVDZmcuaGlnaGxpZ2h0Rm9ybWF0dGluZykgc3RhdGUuZm9ybWF0dGluZyA9IFwiaGVhZGVyXCI7XG4gICAgICB9XG4gICAgICBzdGF0ZS50aGlzTGluZS5oZWFkZXIgPSB0cnVlO1xuICAgICAgc3RhdGUuZiA9IHN0YXRlLmlubGluZTtcbiAgICAgIHJldHVybiBnZXRUeXBlKHN0YXRlKTtcbiAgICB9IGVsc2UgaWYgKGlzSHIpIHtcbiAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTtcbiAgICAgIHN0YXRlLmhyID0gdHJ1ZTtcbiAgICAgIHN0YXRlLnRoaXNMaW5lLmhyID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0b2tlblR5cGVzLmhyO1xuICAgIH0gZWxzZSBpZiAoc3RyZWFtLnBlZWsoKSA9PT0gJ1snKSB7XG4gICAgICByZXR1cm4gc3dpdGNoSW5saW5lKHN0cmVhbSwgc3RhdGUsIGZvb3Rub3RlTGluayk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN3aXRjaElubGluZShzdHJlYW0sIHN0YXRlLCBzdGF0ZS5pbmxpbmUpO1xuICB9XG5cbiAgZnVuY3Rpb24gaHRtbEJsb2NrKHN0cmVhbSwgc3RhdGUpIHtcbiAgICB2YXIgc3R5bGUgPSBodG1sTW9kZS50b2tlbihzdHJlYW0sIHN0YXRlLmh0bWxTdGF0ZSk7XG4gICAgaWYgKCFodG1sTW9kZU1pc3NpbmcpIHtcbiAgICAgIHZhciBpbm5lciA9IENvZGVNaXJyb3IuaW5uZXJNb2RlKGh0bWxNb2RlLCBzdGF0ZS5odG1sU3RhdGUpXG4gICAgICBpZiAoKGlubmVyLm1vZGUubmFtZSA9PSBcInhtbFwiICYmIGlubmVyLnN0YXRlLnRhZ1N0YXJ0ID09PSBudWxsICYmXG4gICAgICAgICAgICghaW5uZXIuc3RhdGUuY29udGV4dCAmJiBpbm5lci5zdGF0ZS50b2tlbml6ZS5pc0luVGV4dCkpIHx8XG4gICAgICAgICAgKHN0YXRlLm1kX2luc2lkZSAmJiBzdHJlYW0uY3VycmVudCgpLmluZGV4T2YoXCI+XCIpID4gLTEpKSB7XG4gICAgICAgIHN0YXRlLmYgPSBpbmxpbmVOb3JtYWw7XG4gICAgICAgIHN0YXRlLmJsb2NrID0gYmxvY2tOb3JtYWw7XG4gICAgICAgIHN0YXRlLmh0bWxTdGF0ZSA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdHlsZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxvY2FsKHN0cmVhbSwgc3RhdGUpIHtcbiAgICB2YXIgY3Vyckxpc3RJbmQgPSBzdGF0ZS5saXN0U3RhY2tbc3RhdGUubGlzdFN0YWNrLmxlbmd0aCAtIDFdIHx8IDA7XG4gICAgdmFyIGhhc0V4aXRlZExpc3QgPSBzdGF0ZS5pbmRlbnRhdGlvbiA8IGN1cnJMaXN0SW5kO1xuICAgIHZhciBtYXhGZW5jZWRFbmRJbmQgPSBjdXJyTGlzdEluZCArIDM7XG4gICAgaWYgKHN0YXRlLmZlbmNlZEVuZFJFICYmIHN0YXRlLmluZGVudGF0aW9uIDw9IG1heEZlbmNlZEVuZEluZCAmJiAoaGFzRXhpdGVkTGlzdCB8fCBzdHJlYW0ubWF0Y2goc3RhdGUuZmVuY2VkRW5kUkUpKSkge1xuICAgICAgaWYgKG1vZGVDZmcuaGlnaGxpZ2h0Rm9ybWF0dGluZykgc3RhdGUuZm9ybWF0dGluZyA9IFwiY29kZS1ibG9ja1wiO1xuICAgICAgdmFyIHJldHVyblR5cGU7XG4gICAgICBpZiAoIWhhc0V4aXRlZExpc3QpIHJldHVyblR5cGUgPSBnZXRUeXBlKHN0YXRlKVxuICAgICAgc3RhdGUubG9jYWxNb2RlID0gc3RhdGUubG9jYWxTdGF0ZSA9IG51bGw7XG4gICAgICBzdGF0ZS5ibG9jayA9IGJsb2NrTm9ybWFsO1xuICAgICAgc3RhdGUuZiA9IGlubGluZU5vcm1hbDtcbiAgICAgIHN0YXRlLmZlbmNlZEVuZFJFID0gbnVsbDtcbiAgICAgIHN0YXRlLmNvZGUgPSAwXG4gICAgICBzdGF0ZS50aGlzTGluZS5mZW5jZWRDb2RlRW5kID0gdHJ1ZTtcbiAgICAgIGlmIChoYXNFeGl0ZWRMaXN0KSByZXR1cm4gc3dpdGNoQmxvY2soc3RyZWFtLCBzdGF0ZSwgc3RhdGUuYmxvY2spO1xuICAgICAgcmV0dXJuIHJldHVyblR5cGU7XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5sb2NhbE1vZGUpIHtcbiAgICAgIHJldHVybiBzdGF0ZS5sb2NhbE1vZGUudG9rZW4oc3RyZWFtLCBzdGF0ZS5sb2NhbFN0YXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyZWFtLnNraXBUb0VuZCgpO1xuICAgICAgcmV0dXJuIHRva2VuVHlwZXMuY29kZTtcbiAgICB9XG4gIH1cblxuICAvLyBJbmxpbmVcbiAgZnVuY3Rpb24gZ2V0VHlwZShzdGF0ZSkge1xuICAgIHZhciBzdHlsZXMgPSBbXTtcblxuICAgIGlmIChzdGF0ZS5mb3JtYXR0aW5nKSB7XG4gICAgICBzdHlsZXMucHVzaCh0b2tlblR5cGVzLmZvcm1hdHRpbmcpO1xuXG4gICAgICBpZiAodHlwZW9mIHN0YXRlLmZvcm1hdHRpbmcgPT09IFwic3RyaW5nXCIpIHN0YXRlLmZvcm1hdHRpbmcgPSBbc3RhdGUuZm9ybWF0dGluZ107XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RhdGUuZm9ybWF0dGluZy5sZW5ndGg7IGkrKykge1xuICAgICAgICBzdHlsZXMucHVzaCh0b2tlblR5cGVzLmZvcm1hdHRpbmcgKyBcIi1cIiArIHN0YXRlLmZvcm1hdHRpbmdbaV0pO1xuXG4gICAgICAgIGlmIChzdGF0ZS5mb3JtYXR0aW5nW2ldID09PSBcImhlYWRlclwiKSB7XG4gICAgICAgICAgc3R5bGVzLnB1c2godG9rZW5UeXBlcy5mb3JtYXR0aW5nICsgXCItXCIgKyBzdGF0ZS5mb3JtYXR0aW5nW2ldICsgXCItXCIgKyBzdGF0ZS5oZWFkZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIGBmb3JtYXR0aW5nLXF1b3RlYCBhbmQgYGZvcm1hdHRpbmctcXVvdGUtI2AgZm9yIGJsb2NrcXVvdGVzXG4gICAgICAgIC8vIEFkZCBgZXJyb3JgIGluc3RlYWQgaWYgdGhlIG1heGltdW0gYmxvY2txdW90ZSBuZXN0aW5nIGRlcHRoIGlzIHBhc3NlZFxuICAgICAgICBpZiAoc3RhdGUuZm9ybWF0dGluZ1tpXSA9PT0gXCJxdW90ZVwiKSB7XG4gICAgICAgICAgaWYgKCFtb2RlQ2ZnLm1heEJsb2NrcXVvdGVEZXB0aCB8fCBtb2RlQ2ZnLm1heEJsb2NrcXVvdGVEZXB0aCA+PSBzdGF0ZS5xdW90ZSkge1xuICAgICAgICAgICAgc3R5bGVzLnB1c2godG9rZW5UeXBlcy5mb3JtYXR0aW5nICsgXCItXCIgKyBzdGF0ZS5mb3JtYXR0aW5nW2ldICsgXCItXCIgKyBzdGF0ZS5xdW90ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0eWxlcy5wdXNoKFwiZXJyb3JcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLnRhc2tPcGVuKSB7XG4gICAgICBzdHlsZXMucHVzaChcIm1ldGFcIik7XG4gICAgICByZXR1cm4gc3R5bGVzLmxlbmd0aCA/IHN0eWxlcy5qb2luKCcgJykgOiBudWxsO1xuICAgIH1cbiAgICBpZiAoc3RhdGUudGFza0Nsb3NlZCkge1xuICAgICAgc3R5bGVzLnB1c2goXCJwcm9wZXJ0eVwiKTtcbiAgICAgIHJldHVybiBzdHlsZXMubGVuZ3RoID8gc3R5bGVzLmpvaW4oJyAnKSA6IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLmxpbmtIcmVmKSB7XG4gICAgICBzdHlsZXMucHVzaCh0b2tlblR5cGVzLmxpbmtIcmVmLCBcInVybFwiKTtcbiAgICB9IGVsc2UgeyAvLyBPbmx5IGFwcGx5IGlubGluZSBzdHlsZXMgdG8gbm9uLXVybCB0ZXh0XG4gICAgICBpZiAoc3RhdGUuc3Ryb25nKSB7IHN0eWxlcy5wdXNoKHRva2VuVHlwZXMuc3Ryb25nKTsgfVxuICAgICAgaWYgKHN0YXRlLmVtKSB7IHN0eWxlcy5wdXNoKHRva2VuVHlwZXMuZW0pOyB9XG4gICAgICBpZiAoc3RhdGUuc3RyaWtldGhyb3VnaCkgeyBzdHlsZXMucHVzaCh0b2tlblR5cGVzLnN0cmlrZXRocm91Z2gpOyB9XG4gICAgICBpZiAoc3RhdGUuZW1vamkpIHsgc3R5bGVzLnB1c2godG9rZW5UeXBlcy5lbW9qaSk7IH1cbiAgICAgIGlmIChzdGF0ZS5saW5rVGV4dCkgeyBzdHlsZXMucHVzaCh0b2tlblR5cGVzLmxpbmtUZXh0KTsgfVxuICAgICAgaWYgKHN0YXRlLmNvZGUpIHsgc3R5bGVzLnB1c2godG9rZW5UeXBlcy5jb2RlKTsgfVxuICAgICAgaWYgKHN0YXRlLmltYWdlKSB7IHN0eWxlcy5wdXNoKHRva2VuVHlwZXMuaW1hZ2UpOyB9XG4gICAgICBpZiAoc3RhdGUuaW1hZ2VBbHRUZXh0KSB7IHN0eWxlcy5wdXNoKHRva2VuVHlwZXMuaW1hZ2VBbHRUZXh0LCBcImxpbmtcIik7IH1cbiAgICAgIGlmIChzdGF0ZS5pbWFnZU1hcmtlcikgeyBzdHlsZXMucHVzaCh0b2tlblR5cGVzLmltYWdlTWFya2VyKTsgfVxuICAgIH1cblxuICAgIGlmIChzdGF0ZS5oZWFkZXIpIHsgc3R5bGVzLnB1c2godG9rZW5UeXBlcy5oZWFkZXIsIHRva2VuVHlwZXMuaGVhZGVyICsgXCItXCIgKyBzdGF0ZS5oZWFkZXIpOyB9XG5cbiAgICBpZiAoc3RhdGUucXVvdGUpIHtcbiAgICAgIHN0eWxlcy5wdXNoKHRva2VuVHlwZXMucXVvdGUpO1xuXG4gICAgICAvLyBBZGQgYHF1b3RlLSNgIHdoZXJlIHRoZSBtYXhpbXVtIGZvciBgI2AgaXMgbW9kZUNmZy5tYXhCbG9ja3F1b3RlRGVwdGhcbiAgICAgIGlmICghbW9kZUNmZy5tYXhCbG9ja3F1b3RlRGVwdGggfHwgbW9kZUNmZy5tYXhCbG9ja3F1b3RlRGVwdGggPj0gc3RhdGUucXVvdGUpIHtcbiAgICAgICAgc3R5bGVzLnB1c2godG9rZW5UeXBlcy5xdW90ZSArIFwiLVwiICsgc3RhdGUucXVvdGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3R5bGVzLnB1c2godG9rZW5UeXBlcy5xdW90ZSArIFwiLVwiICsgbW9kZUNmZy5tYXhCbG9ja3F1b3RlRGVwdGgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdGF0ZS5saXN0ICE9PSBmYWxzZSkge1xuICAgICAgdmFyIGxpc3RNb2QgPSAoc3RhdGUubGlzdFN0YWNrLmxlbmd0aCAtIDEpICUgMztcbiAgICAgIGlmICghbGlzdE1vZCkge1xuICAgICAgICBzdHlsZXMucHVzaCh0b2tlblR5cGVzLmxpc3QxKTtcbiAgICAgIH0gZWxzZSBpZiAobGlzdE1vZCA9PT0gMSkge1xuICAgICAgICBzdHlsZXMucHVzaCh0b2tlblR5cGVzLmxpc3QyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0eWxlcy5wdXNoKHRva2VuVHlwZXMubGlzdDMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdGF0ZS50cmFpbGluZ1NwYWNlTmV3TGluZSkge1xuICAgICAgc3R5bGVzLnB1c2goXCJ0cmFpbGluZy1zcGFjZS1uZXctbGluZVwiKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLnRyYWlsaW5nU3BhY2UpIHtcbiAgICAgIHN0eWxlcy5wdXNoKFwidHJhaWxpbmctc3BhY2UtXCIgKyAoc3RhdGUudHJhaWxpbmdTcGFjZSAlIDIgPyBcImFcIiA6IFwiYlwiKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0eWxlcy5sZW5ndGggPyBzdHlsZXMuam9pbignICcpIDogbnVsbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZVRleHQoc3RyZWFtLCBzdGF0ZSkge1xuICAgIGlmIChzdHJlYW0ubWF0Y2godGV4dFJFLCB0cnVlKSkge1xuICAgICAgcmV0dXJuIGdldFR5cGUoc3RhdGUpO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5saW5lTm9ybWFsKHN0cmVhbSwgc3RhdGUpIHtcbiAgICB2YXIgc3R5bGUgPSBzdGF0ZS50ZXh0KHN0cmVhbSwgc3RhdGUpO1xuICAgIGlmICh0eXBlb2Ygc3R5bGUgIT09ICd1bmRlZmluZWQnKVxuICAgICAgcmV0dXJuIHN0eWxlO1xuXG4gICAgaWYgKHN0YXRlLmxpc3QpIHsgLy8gTGlzdCBtYXJrZXIgKCosICssIC0sIDEuLCBldGMpXG4gICAgICBzdGF0ZS5saXN0ID0gbnVsbDtcbiAgICAgIHJldHVybiBnZXRUeXBlKHN0YXRlKTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGUudGFza0xpc3QpIHtcbiAgICAgIHZhciB0YXNrT3BlbiA9IHN0cmVhbS5tYXRjaCh0YXNrTGlzdFJFLCB0cnVlKVsxXSA9PT0gXCIgXCI7XG4gICAgICBpZiAodGFza09wZW4pIHN0YXRlLnRhc2tPcGVuID0gdHJ1ZTtcbiAgICAgIGVsc2Ugc3RhdGUudGFza0Nsb3NlZCA9IHRydWU7XG4gICAgICBpZiAobW9kZUNmZy5oaWdobGlnaHRGb3JtYXR0aW5nKSBzdGF0ZS5mb3JtYXR0aW5nID0gXCJ0YXNrXCI7XG4gICAgICBzdGF0ZS50YXNrTGlzdCA9IGZhbHNlO1xuICAgICAgcmV0dXJuIGdldFR5cGUoc3RhdGUpO1xuICAgIH1cblxuICAgIHN0YXRlLnRhc2tPcGVuID0gZmFsc2U7XG4gICAgc3RhdGUudGFza0Nsb3NlZCA9IGZhbHNlO1xuXG4gICAgaWYgKHN0YXRlLmhlYWRlciAmJiBzdHJlYW0ubWF0Y2goL14jKyQvLCB0cnVlKSkge1xuICAgICAgaWYgKG1vZGVDZmcuaGlnaGxpZ2h0Rm9ybWF0dGluZykgc3RhdGUuZm9ybWF0dGluZyA9IFwiaGVhZGVyXCI7XG4gICAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSk7XG4gICAgfVxuXG4gICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTtcblxuICAgIC8vIE1hdGNoZXMgbGluayB0aXRsZXMgcHJlc2VudCBvbiBuZXh0IGxpbmVcbiAgICBpZiAoc3RhdGUubGlua1RpdGxlKSB7XG4gICAgICBzdGF0ZS5saW5rVGl0bGUgPSBmYWxzZTtcbiAgICAgIHZhciBtYXRjaENoID0gY2g7XG4gICAgICBpZiAoY2ggPT09ICcoJykge1xuICAgICAgICBtYXRjaENoID0gJyknO1xuICAgICAgfVxuICAgICAgbWF0Y2hDaCA9IChtYXRjaENoKycnKS5yZXBsYWNlKC8oWy4/KiteXFxbXFxdXFxcXCgpe318LV0pL2csIFwiXFxcXCQxXCIpO1xuICAgICAgdmFyIHJlZ2V4ID0gJ15cXFxccyooPzpbXicgKyBtYXRjaENoICsgJ1xcXFxcXFxcXSt8XFxcXFxcXFxcXFxcXFxcXHxcXFxcXFxcXC4pJyArIG1hdGNoQ2g7XG4gICAgICBpZiAoc3RyZWFtLm1hdGNoKG5ldyBSZWdFeHAocmVnZXgpLCB0cnVlKSkge1xuICAgICAgICByZXR1cm4gdG9rZW5UeXBlcy5saW5rSHJlZjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiB0aGlzIGJsb2NrIGlzIGNoYW5nZWQsIGl0IG1heSBuZWVkIHRvIGJlIHVwZGF0ZWQgaW4gR0ZNIG1vZGVcbiAgICBpZiAoY2ggPT09ICdgJykge1xuICAgICAgdmFyIHByZXZpb3VzRm9ybWF0dGluZyA9IHN0YXRlLmZvcm1hdHRpbmc7XG4gICAgICBpZiAobW9kZUNmZy5oaWdobGlnaHRGb3JtYXR0aW5nKSBzdGF0ZS5mb3JtYXR0aW5nID0gXCJjb2RlXCI7XG4gICAgICBzdHJlYW0uZWF0V2hpbGUoJ2AnKTtcbiAgICAgIHZhciBjb3VudCA9IHN0cmVhbS5jdXJyZW50KCkubGVuZ3RoXG4gICAgICBpZiAoc3RhdGUuY29kZSA9PSAwICYmICghc3RhdGUucXVvdGUgfHwgY291bnQgPT0gMSkpIHtcbiAgICAgICAgc3RhdGUuY29kZSA9IGNvdW50XG4gICAgICAgIHJldHVybiBnZXRUeXBlKHN0YXRlKVxuICAgICAgfSBlbHNlIGlmIChjb3VudCA9PSBzdGF0ZS5jb2RlKSB7IC8vIE11c3QgYmUgZXhhY3RcbiAgICAgICAgdmFyIHQgPSBnZXRUeXBlKHN0YXRlKVxuICAgICAgICBzdGF0ZS5jb2RlID0gMFxuICAgICAgICByZXR1cm4gdFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUuZm9ybWF0dGluZyA9IHByZXZpb3VzRm9ybWF0dGluZ1xuICAgICAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHN0YXRlLmNvZGUpIHtcbiAgICAgIHJldHVybiBnZXRUeXBlKHN0YXRlKTtcbiAgICB9XG5cbiAgICBpZiAoY2ggPT09ICdcXFxcJykge1xuICAgICAgc3RyZWFtLm5leHQoKTtcbiAgICAgIGlmIChtb2RlQ2ZnLmhpZ2hsaWdodEZvcm1hdHRpbmcpIHtcbiAgICAgICAgdmFyIHR5cGUgPSBnZXRUeXBlKHN0YXRlKTtcbiAgICAgICAgdmFyIGZvcm1hdHRpbmdFc2NhcGUgPSB0b2tlblR5cGVzLmZvcm1hdHRpbmcgKyBcIi1lc2NhcGVcIjtcbiAgICAgICAgcmV0dXJuIHR5cGUgPyB0eXBlICsgXCIgXCIgKyBmb3JtYXR0aW5nRXNjYXBlIDogZm9ybWF0dGluZ0VzY2FwZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2ggPT09ICchJyAmJiBzdHJlYW0ubWF0Y2goL1xcW1teXFxdXSpcXF0gPyg/OlxcKHxcXFspLywgZmFsc2UpKSB7XG4gICAgICBzdGF0ZS5pbWFnZU1hcmtlciA9IHRydWU7XG4gICAgICBzdGF0ZS5pbWFnZSA9IHRydWU7XG4gICAgICBpZiAobW9kZUNmZy5oaWdobGlnaHRGb3JtYXR0aW5nKSBzdGF0ZS5mb3JtYXR0aW5nID0gXCJpbWFnZVwiO1xuICAgICAgcmV0dXJuIGdldFR5cGUoc3RhdGUpO1xuICAgIH1cblxuICAgIGlmIChjaCA9PT0gJ1snICYmIHN0YXRlLmltYWdlTWFya2VyICYmIHN0cmVhbS5tYXRjaCgvW15cXF1dKlxcXShcXCguKj9cXCl8ID9cXFsuKj9cXF0pLywgZmFsc2UpKSB7XG4gICAgICBzdGF0ZS5pbWFnZU1hcmtlciA9IGZhbHNlO1xuICAgICAgc3RhdGUuaW1hZ2VBbHRUZXh0ID0gdHJ1ZVxuICAgICAgaWYgKG1vZGVDZmcuaGlnaGxpZ2h0Rm9ybWF0dGluZykgc3RhdGUuZm9ybWF0dGluZyA9IFwiaW1hZ2VcIjtcbiAgICAgIHJldHVybiBnZXRUeXBlKHN0YXRlKTtcbiAgICB9XG5cbiAgICBpZiAoY2ggPT09ICddJyAmJiBzdGF0ZS5pbWFnZUFsdFRleHQpIHtcbiAgICAgIGlmIChtb2RlQ2ZnLmhpZ2hsaWdodEZvcm1hdHRpbmcpIHN0YXRlLmZvcm1hdHRpbmcgPSBcImltYWdlXCI7XG4gICAgICB2YXIgdHlwZSA9IGdldFR5cGUoc3RhdGUpO1xuICAgICAgc3RhdGUuaW1hZ2VBbHRUZXh0ID0gZmFsc2U7XG4gICAgICBzdGF0ZS5pbWFnZSA9IGZhbHNlO1xuICAgICAgc3RhdGUuaW5saW5lID0gc3RhdGUuZiA9IGxpbmtIcmVmO1xuICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfVxuXG4gICAgaWYgKGNoID09PSAnWycgJiYgIXN0YXRlLmltYWdlKSB7XG4gICAgICBpZiAoc3RhdGUubGlua1RleHQgJiYgc3RyZWFtLm1hdGNoKC9eLio/XFxdLykpIHJldHVybiBnZXRUeXBlKHN0YXRlKVxuICAgICAgc3RhdGUubGlua1RleHQgPSB0cnVlO1xuICAgICAgaWYgKG1vZGVDZmcuaGlnaGxpZ2h0Rm9ybWF0dGluZykgc3RhdGUuZm9ybWF0dGluZyA9IFwibGlua1wiO1xuICAgICAgcmV0dXJuIGdldFR5cGUoc3RhdGUpO1xuICAgIH1cblxuICAgIGlmIChjaCA9PT0gJ10nICYmIHN0YXRlLmxpbmtUZXh0KSB7XG4gICAgICBpZiAobW9kZUNmZy5oaWdobGlnaHRGb3JtYXR0aW5nKSBzdGF0ZS5mb3JtYXR0aW5nID0gXCJsaW5rXCI7XG4gICAgICB2YXIgdHlwZSA9IGdldFR5cGUoc3RhdGUpO1xuICAgICAgc3RhdGUubGlua1RleHQgPSBmYWxzZTtcbiAgICAgIHN0YXRlLmlubGluZSA9IHN0YXRlLmYgPSBzdHJlYW0ubWF0Y2goL1xcKC4qP1xcKXwgP1xcWy4qP1xcXS8sIGZhbHNlKSA/IGxpbmtIcmVmIDogaW5saW5lTm9ybWFsXG4gICAgICByZXR1cm4gdHlwZTtcbiAgICB9XG5cbiAgICBpZiAoY2ggPT09ICc8JyAmJiBzdHJlYW0ubWF0Y2goL14oaHR0cHM/fGZ0cHM/KTpcXC9cXC8oPzpbXlxcXFw+XXxcXFxcLikrPi8sIGZhbHNlKSkge1xuICAgICAgc3RhdGUuZiA9IHN0YXRlLmlubGluZSA9IGxpbmtJbmxpbmU7XG4gICAgICBpZiAobW9kZUNmZy5oaWdobGlnaHRGb3JtYXR0aW5nKSBzdGF0ZS5mb3JtYXR0aW5nID0gXCJsaW5rXCI7XG4gICAgICB2YXIgdHlwZSA9IGdldFR5cGUoc3RhdGUpO1xuICAgICAgaWYgKHR5cGUpe1xuICAgICAgICB0eXBlICs9IFwiIFwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHlwZSA9IFwiXCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHlwZSArIHRva2VuVHlwZXMubGlua0lubGluZTtcbiAgICB9XG5cbiAgICBpZiAoY2ggPT09ICc8JyAmJiBzdHJlYW0ubWF0Y2goL15bXj4gXFxcXF0rQCg/OlteXFxcXD5dfFxcXFwuKSs+LywgZmFsc2UpKSB7XG4gICAgICBzdGF0ZS5mID0gc3RhdGUuaW5saW5lID0gbGlua0lubGluZTtcbiAgICAgIGlmIChtb2RlQ2ZnLmhpZ2hsaWdodEZvcm1hdHRpbmcpIHN0YXRlLmZvcm1hdHRpbmcgPSBcImxpbmtcIjtcbiAgICAgIHZhciB0eXBlID0gZ2V0VHlwZShzdGF0ZSk7XG4gICAgICBpZiAodHlwZSl7XG4gICAgICAgIHR5cGUgKz0gXCIgXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0eXBlID0gXCJcIjtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0eXBlICsgdG9rZW5UeXBlcy5saW5rRW1haWw7XG4gICAgfVxuXG4gICAgaWYgKG1vZGVDZmcueG1sICYmIGNoID09PSAnPCcgJiYgc3RyZWFtLm1hdGNoKC9eKCEtLXxcXD98IVxcW0NEQVRBXFxbfFthLXpdW2EtejAtOS1dKig/OlxccytbYS16XzouXFwtXSsoPzpcXHMqPVxccypbXj5dKyk/KSpcXHMqKD86PnwkKSkvaSwgZmFsc2UpKSB7XG4gICAgICB2YXIgZW5kID0gc3RyZWFtLnN0cmluZy5pbmRleE9mKFwiPlwiLCBzdHJlYW0ucG9zKTtcbiAgICAgIGlmIChlbmQgIT0gLTEpIHtcbiAgICAgICAgdmFyIGF0dHMgPSBzdHJlYW0uc3RyaW5nLnN1YnN0cmluZyhzdHJlYW0uc3RhcnQsIGVuZCk7XG4gICAgICAgIGlmICgvbWFya2Rvd25cXHMqPVxccyooJ3xcIil7MCwxfTEoJ3xcIil7MCwxfS8udGVzdChhdHRzKSkgc3RhdGUubWRfaW5zaWRlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHN0cmVhbS5iYWNrVXAoMSk7XG4gICAgICBzdGF0ZS5odG1sU3RhdGUgPSBDb2RlTWlycm9yLnN0YXJ0U3RhdGUoaHRtbE1vZGUpO1xuICAgICAgcmV0dXJuIHN3aXRjaEJsb2NrKHN0cmVhbSwgc3RhdGUsIGh0bWxCbG9jayk7XG4gICAgfVxuXG4gICAgaWYgKG1vZGVDZmcueG1sICYmIGNoID09PSAnPCcgJiYgc3RyZWFtLm1hdGNoKC9eXFwvXFx3Kj8+LykpIHtcbiAgICAgIHN0YXRlLm1kX2luc2lkZSA9IGZhbHNlO1xuICAgICAgcmV0dXJuIFwidGFnXCI7XG4gICAgfSBlbHNlIGlmIChjaCA9PT0gXCIqXCIgfHwgY2ggPT09IFwiX1wiKSB7XG4gICAgICB2YXIgbGVuID0gMSwgYmVmb3JlID0gc3RyZWFtLnBvcyA9PSAxID8gXCIgXCIgOiBzdHJlYW0uc3RyaW5nLmNoYXJBdChzdHJlYW0ucG9zIC0gMilcbiAgICAgIHdoaWxlIChsZW4gPCAzICYmIHN0cmVhbS5lYXQoY2gpKSBsZW4rK1xuICAgICAgdmFyIGFmdGVyID0gc3RyZWFtLnBlZWsoKSB8fCBcIiBcIlxuICAgICAgLy8gU2VlIGh0dHA6Ly9zcGVjLmNvbW1vbm1hcmsub3JnLzAuMjcvI2VtcGhhc2lzLWFuZC1zdHJvbmctZW1waGFzaXNcbiAgICAgIHZhciBsZWZ0RmxhbmtpbmcgPSAhL1xccy8udGVzdChhZnRlcikgJiYgKCFwdW5jdHVhdGlvbi50ZXN0KGFmdGVyKSB8fCAvXFxzLy50ZXN0KGJlZm9yZSkgfHwgcHVuY3R1YXRpb24udGVzdChiZWZvcmUpKVxuICAgICAgdmFyIHJpZ2h0RmxhbmtpbmcgPSAhL1xccy8udGVzdChiZWZvcmUpICYmICghcHVuY3R1YXRpb24udGVzdChiZWZvcmUpIHx8IC9cXHMvLnRlc3QoYWZ0ZXIpIHx8IHB1bmN0dWF0aW9uLnRlc3QoYWZ0ZXIpKVxuICAgICAgdmFyIHNldEVtID0gbnVsbCwgc2V0U3Ryb25nID0gbnVsbFxuICAgICAgaWYgKGxlbiAlIDIpIHsgLy8gRW1cbiAgICAgICAgaWYgKCFzdGF0ZS5lbSAmJiBsZWZ0RmxhbmtpbmcgJiYgKGNoID09PSBcIipcIiB8fCAhcmlnaHRGbGFua2luZyB8fCBwdW5jdHVhdGlvbi50ZXN0KGJlZm9yZSkpKVxuICAgICAgICAgIHNldEVtID0gdHJ1ZVxuICAgICAgICBlbHNlIGlmIChzdGF0ZS5lbSA9PSBjaCAmJiByaWdodEZsYW5raW5nICYmIChjaCA9PT0gXCIqXCIgfHwgIWxlZnRGbGFua2luZyB8fCBwdW5jdHVhdGlvbi50ZXN0KGFmdGVyKSkpXG4gICAgICAgICAgc2V0RW0gPSBmYWxzZVxuICAgICAgfVxuICAgICAgaWYgKGxlbiA+IDEpIHsgLy8gU3Ryb25nXG4gICAgICAgIGlmICghc3RhdGUuc3Ryb25nICYmIGxlZnRGbGFua2luZyAmJiAoY2ggPT09IFwiKlwiIHx8ICFyaWdodEZsYW5raW5nIHx8IHB1bmN0dWF0aW9uLnRlc3QoYmVmb3JlKSkpXG4gICAgICAgICAgc2V0U3Ryb25nID0gdHJ1ZVxuICAgICAgICBlbHNlIGlmIChzdGF0ZS5zdHJvbmcgPT0gY2ggJiYgcmlnaHRGbGFua2luZyAmJiAoY2ggPT09IFwiKlwiIHx8ICFsZWZ0RmxhbmtpbmcgfHwgcHVuY3R1YXRpb24udGVzdChhZnRlcikpKVxuICAgICAgICAgIHNldFN0cm9uZyA9IGZhbHNlXG4gICAgICB9XG4gICAgICBpZiAoc2V0U3Ryb25nICE9IG51bGwgfHwgc2V0RW0gIT0gbnVsbCkge1xuICAgICAgICBpZiAobW9kZUNmZy5oaWdobGlnaHRGb3JtYXR0aW5nKSBzdGF0ZS5mb3JtYXR0aW5nID0gc2V0RW0gPT0gbnVsbCA/IFwic3Ryb25nXCIgOiBzZXRTdHJvbmcgPT0gbnVsbCA/IFwiZW1cIiA6IFwic3Ryb25nIGVtXCJcbiAgICAgICAgaWYgKHNldEVtID09PSB0cnVlKSBzdGF0ZS5lbSA9IGNoXG4gICAgICAgIGlmIChzZXRTdHJvbmcgPT09IHRydWUpIHN0YXRlLnN0cm9uZyA9IGNoXG4gICAgICAgIHZhciB0ID0gZ2V0VHlwZShzdGF0ZSlcbiAgICAgICAgaWYgKHNldEVtID09PSBmYWxzZSkgc3RhdGUuZW0gPSBmYWxzZVxuICAgICAgICBpZiAoc2V0U3Ryb25nID09PSBmYWxzZSkgc3RhdGUuc3Ryb25nID0gZmFsc2VcbiAgICAgICAgcmV0dXJuIHRcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNoID09PSAnICcpIHtcbiAgICAgIGlmIChzdHJlYW0uZWF0KCcqJykgfHwgc3RyZWFtLmVhdCgnXycpKSB7IC8vIFByb2JhYmx5IHN1cnJvdW5kZWQgYnkgc3BhY2VzXG4gICAgICAgIGlmIChzdHJlYW0ucGVlaygpID09PSAnICcpIHsgLy8gU3Vycm91bmRlZCBieSBzcGFjZXMsIGlnbm9yZVxuICAgICAgICAgIHJldHVybiBnZXRUeXBlKHN0YXRlKTtcbiAgICAgICAgfSBlbHNlIHsgLy8gTm90IHN1cnJvdW5kZWQgYnkgc3BhY2VzLCBiYWNrIHVwIHBvaW50ZXJcbiAgICAgICAgICBzdHJlYW0uYmFja1VwKDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1vZGVDZmcuc3RyaWtldGhyb3VnaCkge1xuICAgICAgaWYgKGNoID09PSAnficgJiYgc3RyZWFtLmVhdFdoaWxlKGNoKSkge1xuICAgICAgICBpZiAoc3RhdGUuc3RyaWtldGhyb3VnaCkgey8vIFJlbW92ZSBzdHJpa2V0aHJvdWdoXG4gICAgICAgICAgaWYgKG1vZGVDZmcuaGlnaGxpZ2h0Rm9ybWF0dGluZykgc3RhdGUuZm9ybWF0dGluZyA9IFwic3RyaWtldGhyb3VnaFwiO1xuICAgICAgICAgIHZhciB0ID0gZ2V0VHlwZShzdGF0ZSk7XG4gICAgICAgICAgc3RhdGUuc3RyaWtldGhyb3VnaCA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiB0O1xuICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbS5tYXRjaCgvXlteXFxzXS8sIGZhbHNlKSkgey8vIEFkZCBzdHJpa2V0aHJvdWdoXG4gICAgICAgICAgc3RhdGUuc3RyaWtldGhyb3VnaCA9IHRydWU7XG4gICAgICAgICAgaWYgKG1vZGVDZmcuaGlnaGxpZ2h0Rm9ybWF0dGluZykgc3RhdGUuZm9ybWF0dGluZyA9IFwic3RyaWtldGhyb3VnaFwiO1xuICAgICAgICAgIHJldHVybiBnZXRUeXBlKHN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJyAnKSB7XG4gICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15+fi8sIHRydWUpKSB7IC8vIFByb2JhYmx5IHN1cnJvdW5kZWQgYnkgc3BhY2VcbiAgICAgICAgICBpZiAoc3RyZWFtLnBlZWsoKSA9PT0gJyAnKSB7IC8vIFN1cnJvdW5kZWQgYnkgc3BhY2VzLCBpZ25vcmVcbiAgICAgICAgICAgIHJldHVybiBnZXRUeXBlKHN0YXRlKTtcbiAgICAgICAgICB9IGVsc2UgeyAvLyBOb3Qgc3Vycm91bmRlZCBieSBzcGFjZXMsIGJhY2sgdXAgcG9pbnRlclxuICAgICAgICAgICAgc3RyZWFtLmJhY2tVcCgyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobW9kZUNmZy5lbW9qaSAmJiBjaCA9PT0gXCI6XCIgJiYgc3RyZWFtLm1hdGNoKC9eKD86W2Etel9cXGQrXVthLXpfXFxkKy1dKnxcXC1bYS16X1xcZCtdW2Etel9cXGQrLV0qKTovKSkge1xuICAgICAgc3RhdGUuZW1vamkgPSB0cnVlO1xuICAgICAgaWYgKG1vZGVDZmcuaGlnaGxpZ2h0Rm9ybWF0dGluZykgc3RhdGUuZm9ybWF0dGluZyA9IFwiZW1vamlcIjtcbiAgICAgIHZhciByZXRUeXBlID0gZ2V0VHlwZShzdGF0ZSk7XG4gICAgICBzdGF0ZS5lbW9qaSA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHJldFR5cGU7XG4gICAgfVxuXG4gICAgaWYgKGNoID09PSAnICcpIHtcbiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14gKyQvLCBmYWxzZSkpIHtcbiAgICAgICAgc3RhdGUudHJhaWxpbmdTcGFjZSsrO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS50cmFpbGluZ1NwYWNlKSB7XG4gICAgICAgIHN0YXRlLnRyYWlsaW5nU3BhY2VOZXdMaW5lID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBsaW5rSW5saW5lKHN0cmVhbSwgc3RhdGUpIHtcbiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpO1xuXG4gICAgaWYgKGNoID09PSBcIj5cIikge1xuICAgICAgc3RhdGUuZiA9IHN0YXRlLmlubGluZSA9IGlubGluZU5vcm1hbDtcbiAgICAgIGlmIChtb2RlQ2ZnLmhpZ2hsaWdodEZvcm1hdHRpbmcpIHN0YXRlLmZvcm1hdHRpbmcgPSBcImxpbmtcIjtcbiAgICAgIHZhciB0eXBlID0gZ2V0VHlwZShzdGF0ZSk7XG4gICAgICBpZiAodHlwZSl7XG4gICAgICAgIHR5cGUgKz0gXCIgXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0eXBlID0gXCJcIjtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0eXBlICsgdG9rZW5UeXBlcy5saW5rSW5saW5lO1xuICAgIH1cblxuICAgIHN0cmVhbS5tYXRjaCgvXltePl0rLywgdHJ1ZSk7XG5cbiAgICByZXR1cm4gdG9rZW5UeXBlcy5saW5rSW5saW5lO1xuICB9XG5cbiAgZnVuY3Rpb24gbGlua0hyZWYoc3RyZWFtLCBzdGF0ZSkge1xuICAgIC8vIENoZWNrIGlmIHNwYWNlLCBhbmQgcmV0dXJuIE5VTEwgaWYgc28gKHRvIGF2b2lkIG1hcmtpbmcgdGhlIHNwYWNlKVxuICAgIGlmKHN0cmVhbS5lYXRTcGFjZSgpKXtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpO1xuICAgIGlmIChjaCA9PT0gJygnIHx8IGNoID09PSAnWycpIHtcbiAgICAgIHN0YXRlLmYgPSBzdGF0ZS5pbmxpbmUgPSBnZXRMaW5rSHJlZkluc2lkZShjaCA9PT0gXCIoXCIgPyBcIilcIiA6IFwiXVwiKTtcbiAgICAgIGlmIChtb2RlQ2ZnLmhpZ2hsaWdodEZvcm1hdHRpbmcpIHN0YXRlLmZvcm1hdHRpbmcgPSBcImxpbmstc3RyaW5nXCI7XG4gICAgICBzdGF0ZS5saW5rSHJlZiA9IHRydWU7XG4gICAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSk7XG4gICAgfVxuICAgIHJldHVybiAnZXJyb3InO1xuICB9XG5cbiAgdmFyIGxpbmtSRSA9IHtcbiAgICBcIilcIjogL14oPzpbXlxcXFxcXChcXCldfFxcXFwufFxcKCg/OlteXFxcXFxcKFxcKV18XFxcXC4pKlxcKSkqPyg/PVxcKSkvLFxuICAgIFwiXVwiOiAvXig/OlteXFxcXFxcW1xcXV18XFxcXC58XFxbKD86W15cXFxcXFxbXFxdXXxcXFxcLikqXFxdKSo/KD89XFxdKS9cbiAgfVxuXG4gIGZ1bmN0aW9uIGdldExpbmtIcmVmSW5zaWRlKGVuZENoYXIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkge1xuICAgICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTtcblxuICAgICAgaWYgKGNoID09PSBlbmRDaGFyKSB7XG4gICAgICAgIHN0YXRlLmYgPSBzdGF0ZS5pbmxpbmUgPSBpbmxpbmVOb3JtYWw7XG4gICAgICAgIGlmIChtb2RlQ2ZnLmhpZ2hsaWdodEZvcm1hdHRpbmcpIHN0YXRlLmZvcm1hdHRpbmcgPSBcImxpbmstc3RyaW5nXCI7XG4gICAgICAgIHZhciByZXR1cm5TdGF0ZSA9IGdldFR5cGUoc3RhdGUpO1xuICAgICAgICBzdGF0ZS5saW5rSHJlZiA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gcmV0dXJuU3RhdGU7XG4gICAgICB9XG5cbiAgICAgIHN0cmVhbS5tYXRjaChsaW5rUkVbZW5kQ2hhcl0pXG4gICAgICBzdGF0ZS5saW5rSHJlZiA9IHRydWU7XG4gICAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSk7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvb3Rub3RlTGluayhzdHJlYW0sIHN0YXRlKSB7XG4gICAgaWYgKHN0cmVhbS5tYXRjaCgvXihbXlxcXVxcXFxdfFxcXFwuKSpcXF06LywgZmFsc2UpKSB7XG4gICAgICBzdGF0ZS5mID0gZm9vdG5vdGVMaW5rSW5zaWRlO1xuICAgICAgc3RyZWFtLm5leHQoKTsgLy8gQ29uc3VtZSBbXG4gICAgICBpZiAobW9kZUNmZy5oaWdobGlnaHRGb3JtYXR0aW5nKSBzdGF0ZS5mb3JtYXR0aW5nID0gXCJsaW5rXCI7XG4gICAgICBzdGF0ZS5saW5rVGV4dCA9IHRydWU7XG4gICAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSk7XG4gICAgfVxuICAgIHJldHVybiBzd2l0Y2hJbmxpbmUoc3RyZWFtLCBzdGF0ZSwgaW5saW5lTm9ybWFsKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvb3Rub3RlTGlua0luc2lkZShzdHJlYW0sIHN0YXRlKSB7XG4gICAgaWYgKHN0cmVhbS5tYXRjaCgvXlxcXTovLCB0cnVlKSkge1xuICAgICAgc3RhdGUuZiA9IHN0YXRlLmlubGluZSA9IGZvb3Rub3RlVXJsO1xuICAgICAgaWYgKG1vZGVDZmcuaGlnaGxpZ2h0Rm9ybWF0dGluZykgc3RhdGUuZm9ybWF0dGluZyA9IFwibGlua1wiO1xuICAgICAgdmFyIHJldHVyblR5cGUgPSBnZXRUeXBlKHN0YXRlKTtcbiAgICAgIHN0YXRlLmxpbmtUZXh0ID0gZmFsc2U7XG4gICAgICByZXR1cm4gcmV0dXJuVHlwZTtcbiAgICB9XG5cbiAgICBzdHJlYW0ubWF0Y2goL14oW15cXF1cXFxcXXxcXFxcLikrLywgdHJ1ZSk7XG5cbiAgICByZXR1cm4gdG9rZW5UeXBlcy5saW5rVGV4dDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvb3Rub3RlVXJsKHN0cmVhbSwgc3RhdGUpIHtcbiAgICAvLyBDaGVjayBpZiBzcGFjZSwgYW5kIHJldHVybiBOVUxMIGlmIHNvICh0byBhdm9pZCBtYXJraW5nIHRoZSBzcGFjZSlcbiAgICBpZihzdHJlYW0uZWF0U3BhY2UoKSl7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLy8gTWF0Y2ggVVJMXG4gICAgc3RyZWFtLm1hdGNoKC9eW15cXHNdKy8sIHRydWUpO1xuICAgIC8vIENoZWNrIGZvciBsaW5rIHRpdGxlXG4gICAgaWYgKHN0cmVhbS5wZWVrKCkgPT09IHVuZGVmaW5lZCkgeyAvLyBFbmQgb2YgbGluZSwgc2V0IGZsYWcgdG8gY2hlY2sgbmV4dCBsaW5lXG4gICAgICBzdGF0ZS5saW5rVGl0bGUgPSB0cnVlO1xuICAgIH0gZWxzZSB7IC8vIE1vcmUgY29udGVudCBvbiBsaW5lLCBjaGVjayBpZiBsaW5rIHRpdGxlXG4gICAgICBzdHJlYW0ubWF0Y2goL14oPzpcXHMrKD86XCIoPzpbXlwiXFxcXF18XFxcXFxcXFx8XFxcXC4pK1wifCcoPzpbXidcXFxcXXxcXFxcXFxcXHxcXFxcLikrJ3xcXCgoPzpbXilcXFxcXXxcXFxcXFxcXHxcXFxcLikrXFwpKSk/LywgdHJ1ZSk7XG4gICAgfVxuICAgIHN0YXRlLmYgPSBzdGF0ZS5pbmxpbmUgPSBpbmxpbmVOb3JtYWw7XG4gICAgcmV0dXJuIHRva2VuVHlwZXMubGlua0hyZWYgKyBcIiB1cmxcIjtcbiAgfVxuXG4gIHZhciBtb2RlID0ge1xuICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZjogYmxvY2tOb3JtYWwsXG5cbiAgICAgICAgcHJldkxpbmU6IHtzdHJlYW06IG51bGx9LFxuICAgICAgICB0aGlzTGluZToge3N0cmVhbTogbnVsbH0sXG5cbiAgICAgICAgYmxvY2s6IGJsb2NrTm9ybWFsLFxuICAgICAgICBodG1sU3RhdGU6IG51bGwsXG4gICAgICAgIGluZGVudGF0aW9uOiAwLFxuXG4gICAgICAgIGlubGluZTogaW5saW5lTm9ybWFsLFxuICAgICAgICB0ZXh0OiBoYW5kbGVUZXh0LFxuXG4gICAgICAgIGZvcm1hdHRpbmc6IGZhbHNlLFxuICAgICAgICBsaW5rVGV4dDogZmFsc2UsXG4gICAgICAgIGxpbmtIcmVmOiBmYWxzZSxcbiAgICAgICAgbGlua1RpdGxlOiBmYWxzZSxcbiAgICAgICAgY29kZTogMCxcbiAgICAgICAgZW06IGZhbHNlLFxuICAgICAgICBzdHJvbmc6IGZhbHNlLFxuICAgICAgICBoZWFkZXI6IDAsXG4gICAgICAgIHNldGV4dDogMCxcbiAgICAgICAgaHI6IGZhbHNlLFxuICAgICAgICB0YXNrTGlzdDogZmFsc2UsXG4gICAgICAgIGxpc3Q6IGZhbHNlLFxuICAgICAgICBsaXN0U3RhY2s6IFtdLFxuICAgICAgICBxdW90ZTogMCxcbiAgICAgICAgdHJhaWxpbmdTcGFjZTogMCxcbiAgICAgICAgdHJhaWxpbmdTcGFjZU5ld0xpbmU6IGZhbHNlLFxuICAgICAgICBzdHJpa2V0aHJvdWdoOiBmYWxzZSxcbiAgICAgICAgZW1vamk6IGZhbHNlLFxuICAgICAgICBmZW5jZWRFbmRSRTogbnVsbFxuICAgICAgfTtcbiAgICB9LFxuXG4gICAgY29weVN0YXRlOiBmdW5jdGlvbihzKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBmOiBzLmYsXG5cbiAgICAgICAgcHJldkxpbmU6IHMucHJldkxpbmUsXG4gICAgICAgIHRoaXNMaW5lOiBzLnRoaXNMaW5lLFxuXG4gICAgICAgIGJsb2NrOiBzLmJsb2NrLFxuICAgICAgICBodG1sU3RhdGU6IHMuaHRtbFN0YXRlICYmIENvZGVNaXJyb3IuY29weVN0YXRlKGh0bWxNb2RlLCBzLmh0bWxTdGF0ZSksXG4gICAgICAgIGluZGVudGF0aW9uOiBzLmluZGVudGF0aW9uLFxuXG4gICAgICAgIGxvY2FsTW9kZTogcy5sb2NhbE1vZGUsXG4gICAgICAgIGxvY2FsU3RhdGU6IHMubG9jYWxNb2RlID8gQ29kZU1pcnJvci5jb3B5U3RhdGUocy5sb2NhbE1vZGUsIHMubG9jYWxTdGF0ZSkgOiBudWxsLFxuXG4gICAgICAgIGlubGluZTogcy5pbmxpbmUsXG4gICAgICAgIHRleHQ6IHMudGV4dCxcbiAgICAgICAgZm9ybWF0dGluZzogZmFsc2UsXG4gICAgICAgIGxpbmtUZXh0OiBzLmxpbmtUZXh0LFxuICAgICAgICBsaW5rVGl0bGU6IHMubGlua1RpdGxlLFxuICAgICAgICBsaW5rSHJlZjogcy5saW5rSHJlZixcbiAgICAgICAgY29kZTogcy5jb2RlLFxuICAgICAgICBlbTogcy5lbSxcbiAgICAgICAgc3Ryb25nOiBzLnN0cm9uZyxcbiAgICAgICAgc3RyaWtldGhyb3VnaDogcy5zdHJpa2V0aHJvdWdoLFxuICAgICAgICBlbW9qaTogcy5lbW9qaSxcbiAgICAgICAgaGVhZGVyOiBzLmhlYWRlcixcbiAgICAgICAgc2V0ZXh0OiBzLnNldGV4dCxcbiAgICAgICAgaHI6IHMuaHIsXG4gICAgICAgIHRhc2tMaXN0OiBzLnRhc2tMaXN0LFxuICAgICAgICBsaXN0OiBzLmxpc3QsXG4gICAgICAgIGxpc3RTdGFjazogcy5saXN0U3RhY2suc2xpY2UoMCksXG4gICAgICAgIHF1b3RlOiBzLnF1b3RlLFxuICAgICAgICBpbmRlbnRlZENvZGU6IHMuaW5kZW50ZWRDb2RlLFxuICAgICAgICB0cmFpbGluZ1NwYWNlOiBzLnRyYWlsaW5nU3BhY2UsXG4gICAgICAgIHRyYWlsaW5nU3BhY2VOZXdMaW5lOiBzLnRyYWlsaW5nU3BhY2VOZXdMaW5lLFxuICAgICAgICBtZF9pbnNpZGU6IHMubWRfaW5zaWRlLFxuICAgICAgICBmZW5jZWRFbmRSRTogcy5mZW5jZWRFbmRSRVxuICAgICAgfTtcbiAgICB9LFxuXG4gICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHtcblxuICAgICAgLy8gUmVzZXQgc3RhdGUuZm9ybWF0dGluZ1xuICAgICAgc3RhdGUuZm9ybWF0dGluZyA9IGZhbHNlO1xuXG4gICAgICBpZiAoc3RyZWFtICE9IHN0YXRlLnRoaXNMaW5lLnN0cmVhbSkge1xuICAgICAgICBzdGF0ZS5oZWFkZXIgPSAwO1xuICAgICAgICBzdGF0ZS5ociA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15cXHMqJC8sIHRydWUpKSB7XG4gICAgICAgICAgYmxhbmtMaW5lKHN0YXRlKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlLnByZXZMaW5lID0gc3RhdGUudGhpc0xpbmVcbiAgICAgICAgc3RhdGUudGhpc0xpbmUgPSB7c3RyZWFtOiBzdHJlYW19XG5cbiAgICAgICAgLy8gUmVzZXQgc3RhdGUudGFza0xpc3RcbiAgICAgICAgc3RhdGUudGFza0xpc3QgPSBmYWxzZTtcblxuICAgICAgICAvLyBSZXNldCBzdGF0ZS50cmFpbGluZ1NwYWNlXG4gICAgICAgIHN0YXRlLnRyYWlsaW5nU3BhY2UgPSAwO1xuICAgICAgICBzdGF0ZS50cmFpbGluZ1NwYWNlTmV3TGluZSA9IGZhbHNlO1xuXG4gICAgICAgIGlmICghc3RhdGUubG9jYWxTdGF0ZSkge1xuICAgICAgICAgIHN0YXRlLmYgPSBzdGF0ZS5ibG9jaztcbiAgICAgICAgICBpZiAoc3RhdGUuZiAhPSBodG1sQmxvY2spIHtcbiAgICAgICAgICAgIHZhciBpbmRlbnRhdGlvbiA9IHN0cmVhbS5tYXRjaCgvXlxccyovLCB0cnVlKVswXS5yZXBsYWNlKC9cXHQvZywgZXhwYW5kZWRUYWIpLmxlbmd0aDtcbiAgICAgICAgICAgIHN0YXRlLmluZGVudGF0aW9uID0gaW5kZW50YXRpb247XG4gICAgICAgICAgICBzdGF0ZS5pbmRlbnRhdGlvbkRpZmYgPSBudWxsO1xuICAgICAgICAgICAgaWYgKGluZGVudGF0aW9uID4gMCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RhdGUuZihzdHJlYW0sIHN0YXRlKTtcbiAgICB9LFxuXG4gICAgaW5uZXJNb2RlOiBmdW5jdGlvbihzdGF0ZSkge1xuICAgICAgaWYgKHN0YXRlLmJsb2NrID09IGh0bWxCbG9jaykgcmV0dXJuIHtzdGF0ZTogc3RhdGUuaHRtbFN0YXRlLCBtb2RlOiBodG1sTW9kZX07XG4gICAgICBpZiAoc3RhdGUubG9jYWxTdGF0ZSkgcmV0dXJuIHtzdGF0ZTogc3RhdGUubG9jYWxTdGF0ZSwgbW9kZTogc3RhdGUubG9jYWxNb2RlfTtcbiAgICAgIHJldHVybiB7c3RhdGU6IHN0YXRlLCBtb2RlOiBtb2RlfTtcbiAgICB9LFxuXG4gICAgaW5kZW50OiBmdW5jdGlvbihzdGF0ZSwgdGV4dEFmdGVyLCBsaW5lKSB7XG4gICAgICBpZiAoc3RhdGUuYmxvY2sgPT0gaHRtbEJsb2NrICYmIGh0bWxNb2RlLmluZGVudCkgcmV0dXJuIGh0bWxNb2RlLmluZGVudChzdGF0ZS5odG1sU3RhdGUsIHRleHRBZnRlciwgbGluZSlcbiAgICAgIGlmIChzdGF0ZS5sb2NhbFN0YXRlICYmIHN0YXRlLmxvY2FsTW9kZS5pbmRlbnQpIHJldHVybiBzdGF0ZS5sb2NhbE1vZGUuaW5kZW50KHN0YXRlLmxvY2FsU3RhdGUsIHRleHRBZnRlciwgbGluZSlcbiAgICAgIHJldHVybiBDb2RlTWlycm9yLlBhc3NcbiAgICB9LFxuXG4gICAgYmxhbmtMaW5lOiBibGFua0xpbmUsXG5cbiAgICBnZXRUeXBlOiBnZXRUeXBlLFxuXG4gICAgYmxvY2tDb21tZW50U3RhcnQ6IFwiPCEtLVwiLFxuICAgIGJsb2NrQ29tbWVudEVuZDogXCItLT5cIixcbiAgICBjbG9zZUJyYWNrZXRzOiBcIigpW117fScnXFxcIlxcXCJgYFwiLFxuICAgIGZvbGQ6IFwibWFya2Rvd25cIlxuICB9O1xuICByZXR1cm4gbW9kZTtcbn0sIFwieG1sXCIpO1xuXG5Db2RlTWlycm9yLmRlZmluZU1JTUUoXCJ0ZXh0L21hcmtkb3duXCIsIFwibWFya2Rvd25cIik7XG5cbkNvZGVNaXJyb3IuZGVmaW5lTUlNRShcInRleHQveC1tYXJrZG93blwiLCBcIm1hcmtkb3duXCIpO1xuXG59KTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/codemirror/mode/markdown/markdown.js\n"); +eval("// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n if (true) // CommonJS\n mod(__webpack_require__(/*! ../../lib/codemirror */ \"./node_modules/codemirror/lib/codemirror.js\"), __webpack_require__(/*! ../xml/xml */ \"./node_modules/codemirror/mode/xml/xml.js\"), __webpack_require__(/*! ../meta */ \"./node_modules/codemirror/mode/meta.js\"));\n else {}\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"markdown\", function(cmCfg, modeCfg) {\n\n var htmlMode = CodeMirror.getMode(cmCfg, \"text/html\");\n var htmlModeMissing = htmlMode.name == \"null\"\n\n function getMode(name) {\n if (CodeMirror.findModeByName) {\n var found = CodeMirror.findModeByName(name);\n if (found) name = found.mime || found.mimes[0];\n }\n var mode = CodeMirror.getMode(cmCfg, name);\n return mode.name == \"null\" ? null : mode;\n }\n\n // Should characters that affect highlighting be highlighted separate?\n // Does not include characters that will be output (such as `1.` and `-` for lists)\n if (modeCfg.highlightFormatting === undefined)\n modeCfg.highlightFormatting = false;\n\n // Maximum number of nested blockquotes. Set to 0 for infinite nesting.\n // Excess `>` will emit `error` token.\n if (modeCfg.maxBlockquoteDepth === undefined)\n modeCfg.maxBlockquoteDepth = 0;\n\n // Turn on task lists? (\"- [ ] \" and \"- [x] \")\n if (modeCfg.taskLists === undefined) modeCfg.taskLists = false;\n\n // Turn on strikethrough syntax\n if (modeCfg.strikethrough === undefined)\n modeCfg.strikethrough = false;\n\n if (modeCfg.emoji === undefined)\n modeCfg.emoji = false;\n\n if (modeCfg.fencedCodeBlockHighlighting === undefined)\n modeCfg.fencedCodeBlockHighlighting = true;\n\n if (modeCfg.fencedCodeBlockDefaultMode === undefined)\n modeCfg.fencedCodeBlockDefaultMode = 'text/plain';\n\n if (modeCfg.xml === undefined)\n modeCfg.xml = true;\n\n // Allow token types to be overridden by user-provided token types.\n if (modeCfg.tokenTypeOverrides === undefined)\n modeCfg.tokenTypeOverrides = {};\n\n var tokenTypes = {\n header: \"header\",\n code: \"comment\",\n quote: \"quote\",\n list1: \"variable-2\",\n list2: \"variable-3\",\n list3: \"keyword\",\n hr: \"hr\",\n image: \"image\",\n imageAltText: \"image-alt-text\",\n imageMarker: \"image-marker\",\n formatting: \"formatting\",\n linkInline: \"link\",\n linkEmail: \"link\",\n linkText: \"link\",\n linkHref: \"string\",\n em: \"em\",\n strong: \"strong\",\n strikethrough: \"strikethrough\",\n emoji: \"builtin\"\n };\n\n for (var tokenType in tokenTypes) {\n if (tokenTypes.hasOwnProperty(tokenType) && modeCfg.tokenTypeOverrides[tokenType]) {\n tokenTypes[tokenType] = modeCfg.tokenTypeOverrides[tokenType];\n }\n }\n\n var hrRE = /^([*\\-_])(?:\\s*\\1){2,}\\s*$/\n , listRE = /^(?:[*\\-+]|^[0-9]+([.)]))\\s+/\n , taskListRE = /^\\[(x| )\\](?=\\s)/i // Must follow listRE\n , atxHeaderRE = modeCfg.allowAtxHeaderWithoutSpace ? /^(#+)/ : /^(#+)(?: |$)/\n , setextHeaderRE = /^ {0,3}(?:\\={1,}|-{2,})\\s*$/\n , textRE = /^[^#!\\[\\]*_\\\\<>` \"'(~:]+/\n , fencedCodeRE = /^(~~~+|```+)[ \\t]*([\\w\\/+#-]*)[^\\n`]*$/\n , linkDefRE = /^\\s*\\[[^\\]]+?\\]:.*$/ // naive link-definition\n , punctuation = /[!\"#$%&'()*+,\\-.\\/:;<=>?@\\[\\\\\\]^_`{|}~\\xA1\\xA7\\xAB\\xB6\\xB7\\xBB\\xBF\\u037E\\u0387\\u055A-\\u055F\\u0589\\u058A\\u05BE\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061E\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u0AF0\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F14\\u0F3A-\\u0F3D\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1360-\\u1368\\u1400\\u166D\\u166E\\u169B\\u169C\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B5A-\\u1B60\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CC0-\\u1CC7\\u1CD3\\u2010-\\u2027\\u2030-\\u2043\\u2045-\\u2051\\u2053-\\u205E\\u207D\\u207E\\u208D\\u208E\\u2308-\\u230B\\u2329\\u232A\\u2768-\\u2775\\u27C5\\u27C6\\u27E6-\\u27EF\\u2983-\\u2998\\u29D8-\\u29DB\\u29FC\\u29FD\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00-\\u2E2E\\u2E30-\\u2E42\\u3001-\\u3003\\u3008-\\u3011\\u3014-\\u301F\\u3030\\u303D\\u30A0\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA8FC\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uAAF0\\uAAF1\\uABEB\\uFD3E\\uFD3F\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE61\\uFE63\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF0A\\uFF0C-\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3B-\\uFF3D\\uFF3F\\uFF5B\\uFF5D\\uFF5F-\\uFF65]|\\uD800[\\uDD00-\\uDD02\\uDF9F\\uDFD0]|\\uD801\\uDD6F|\\uD802[\\uDC57\\uDD1F\\uDD3F\\uDE50-\\uDE58\\uDE7F\\uDEF0-\\uDEF6\\uDF39-\\uDF3F\\uDF99-\\uDF9C]|\\uD804[\\uDC47-\\uDC4D\\uDCBB\\uDCBC\\uDCBE-\\uDCC1\\uDD40-\\uDD43\\uDD74\\uDD75\\uDDC5-\\uDDC9\\uDDCD\\uDDDB\\uDDDD-\\uDDDF\\uDE38-\\uDE3D\\uDEA9]|\\uD805[\\uDCC6\\uDDC1-\\uDDD7\\uDE41-\\uDE43\\uDF3C-\\uDF3E]|\\uD809[\\uDC70-\\uDC74]|\\uD81A[\\uDE6E\\uDE6F\\uDEF5\\uDF37-\\uDF3B\\uDF44]|\\uD82F\\uDC9F|\\uD836[\\uDE87-\\uDE8B]/\n , expandedTab = \" \" // CommonMark specifies tab as 4 spaces\n\n function switchInline(stream, state, f) {\n state.f = state.inline = f;\n return f(stream, state);\n }\n\n function switchBlock(stream, state, f) {\n state.f = state.block = f;\n return f(stream, state);\n }\n\n function lineIsEmpty(line) {\n return !line || !/\\S/.test(line.string)\n }\n\n // Blocks\n\n function blankLine(state) {\n // Reset linkTitle state\n state.linkTitle = false;\n state.linkHref = false;\n state.linkText = false;\n // Reset EM state\n state.em = false;\n // Reset STRONG state\n state.strong = false;\n // Reset strikethrough state\n state.strikethrough = false;\n // Reset state.quote\n state.quote = 0;\n // Reset state.indentedCode\n state.indentedCode = false;\n if (state.f == htmlBlock) {\n var exit = htmlModeMissing\n if (!exit) {\n var inner = CodeMirror.innerMode(htmlMode, state.htmlState)\n exit = inner.mode.name == \"xml\" && inner.state.tagStart === null &&\n (!inner.state.context && inner.state.tokenize.isInText)\n }\n if (exit) {\n state.f = inlineNormal;\n state.block = blockNormal;\n state.htmlState = null;\n }\n }\n // Reset state.trailingSpace\n state.trailingSpace = 0;\n state.trailingSpaceNewLine = false;\n // Mark this line as blank\n state.prevLine = state.thisLine\n state.thisLine = {stream: null}\n return null;\n }\n\n function blockNormal(stream, state) {\n var firstTokenOnLine = stream.column() === state.indentation;\n var prevLineLineIsEmpty = lineIsEmpty(state.prevLine.stream);\n var prevLineIsIndentedCode = state.indentedCode;\n var prevLineIsHr = state.prevLine.hr;\n var prevLineIsList = state.list !== false;\n var maxNonCodeIndentation = (state.listStack[state.listStack.length - 1] || 0) + 3;\n\n state.indentedCode = false;\n\n var lineIndentation = state.indentation;\n // compute once per line (on first token)\n if (state.indentationDiff === null) {\n state.indentationDiff = state.indentation;\n if (prevLineIsList) {\n state.list = null;\n // While this list item's marker's indentation is less than the deepest\n // list item's content's indentation,pop the deepest list item\n // indentation off the stack, and update block indentation state\n while (lineIndentation < state.listStack[state.listStack.length - 1]) {\n state.listStack.pop();\n if (state.listStack.length) {\n state.indentation = state.listStack[state.listStack.length - 1];\n // less than the first list's indent -> the line is no longer a list\n } else {\n state.list = false;\n }\n }\n if (state.list !== false) {\n state.indentationDiff = lineIndentation - state.listStack[state.listStack.length - 1]\n }\n }\n }\n\n // not comprehensive (currently only for setext detection purposes)\n var allowsInlineContinuation = (\n !prevLineLineIsEmpty && !prevLineIsHr && !state.prevLine.header &&\n (!prevLineIsList || !prevLineIsIndentedCode) &&\n !state.prevLine.fencedCodeEnd\n );\n\n var isHr = (state.list === false || prevLineIsHr || prevLineLineIsEmpty) &&\n state.indentation <= maxNonCodeIndentation && stream.match(hrRE);\n\n var match = null;\n if (state.indentationDiff >= 4 && (prevLineIsIndentedCode || state.prevLine.fencedCodeEnd ||\n state.prevLine.header || prevLineLineIsEmpty)) {\n stream.skipToEnd();\n state.indentedCode = true;\n return tokenTypes.code;\n } else if (stream.eatSpace()) {\n return null;\n } else if (firstTokenOnLine && state.indentation <= maxNonCodeIndentation && (match = stream.match(atxHeaderRE)) && match[1].length <= 6) {\n state.quote = 0;\n state.header = match[1].length;\n state.thisLine.header = true;\n if (modeCfg.highlightFormatting) state.formatting = \"header\";\n state.f = state.inline;\n return getType(state);\n } else if (state.indentation <= maxNonCodeIndentation && stream.eat('>')) {\n state.quote = firstTokenOnLine ? 1 : state.quote + 1;\n if (modeCfg.highlightFormatting) state.formatting = \"quote\";\n stream.eatSpace();\n return getType(state);\n } else if (!isHr && !state.setext && firstTokenOnLine && state.indentation <= maxNonCodeIndentation && (match = stream.match(listRE))) {\n var listType = match[1] ? \"ol\" : \"ul\";\n\n state.indentation = lineIndentation + stream.current().length;\n state.list = true;\n state.quote = 0;\n\n // Add this list item's content's indentation to the stack\n state.listStack.push(state.indentation);\n // Reset inline styles which shouldn't propagate across list items\n state.em = false;\n state.strong = false;\n state.code = false;\n state.strikethrough = false;\n\n if (modeCfg.taskLists && stream.match(taskListRE, false)) {\n state.taskList = true;\n }\n state.f = state.inline;\n if (modeCfg.highlightFormatting) state.formatting = [\"list\", \"list-\" + listType];\n return getType(state);\n } else if (firstTokenOnLine && state.indentation <= maxNonCodeIndentation && (match = stream.match(fencedCodeRE, true))) {\n state.quote = 0;\n state.fencedEndRE = new RegExp(match[1] + \"+ *$\");\n // try switching mode\n state.localMode = modeCfg.fencedCodeBlockHighlighting && getMode(match[2] || modeCfg.fencedCodeBlockDefaultMode );\n if (state.localMode) state.localState = CodeMirror.startState(state.localMode);\n state.f = state.block = local;\n if (modeCfg.highlightFormatting) state.formatting = \"code-block\";\n state.code = -1\n return getType(state);\n // SETEXT has lowest block-scope precedence after HR, so check it after\n // the others (code, blockquote, list...)\n } else if (\n // if setext set, indicates line after ---/===\n state.setext || (\n // line before ---/===\n (!allowsInlineContinuation || !prevLineIsList) && !state.quote && state.list === false &&\n !state.code && !isHr && !linkDefRE.test(stream.string) &&\n (match = stream.lookAhead(1)) && (match = match.match(setextHeaderRE))\n )\n ) {\n if ( !state.setext ) {\n state.header = match[0].charAt(0) == '=' ? 1 : 2;\n state.setext = state.header;\n } else {\n state.header = state.setext;\n // has no effect on type so we can reset it now\n state.setext = 0;\n stream.skipToEnd();\n if (modeCfg.highlightFormatting) state.formatting = \"header\";\n }\n state.thisLine.header = true;\n state.f = state.inline;\n return getType(state);\n } else if (isHr) {\n stream.skipToEnd();\n state.hr = true;\n state.thisLine.hr = true;\n return tokenTypes.hr;\n } else if (stream.peek() === '[') {\n return switchInline(stream, state, footnoteLink);\n }\n\n return switchInline(stream, state, state.inline);\n }\n\n function htmlBlock(stream, state) {\n var style = htmlMode.token(stream, state.htmlState);\n if (!htmlModeMissing) {\n var inner = CodeMirror.innerMode(htmlMode, state.htmlState)\n if ((inner.mode.name == \"xml\" && inner.state.tagStart === null &&\n (!inner.state.context && inner.state.tokenize.isInText)) ||\n (state.md_inside && stream.current().indexOf(\">\") > -1)) {\n state.f = inlineNormal;\n state.block = blockNormal;\n state.htmlState = null;\n }\n }\n return style;\n }\n\n function local(stream, state) {\n var currListInd = state.listStack[state.listStack.length - 1] || 0;\n var hasExitedList = state.indentation < currListInd;\n var maxFencedEndInd = currListInd + 3;\n if (state.fencedEndRE && state.indentation <= maxFencedEndInd && (hasExitedList || stream.match(state.fencedEndRE))) {\n if (modeCfg.highlightFormatting) state.formatting = \"code-block\";\n var returnType;\n if (!hasExitedList) returnType = getType(state)\n state.localMode = state.localState = null;\n state.block = blockNormal;\n state.f = inlineNormal;\n state.fencedEndRE = null;\n state.code = 0\n state.thisLine.fencedCodeEnd = true;\n if (hasExitedList) return switchBlock(stream, state, state.block);\n return returnType;\n } else if (state.localMode) {\n return state.localMode.token(stream, state.localState);\n } else {\n stream.skipToEnd();\n return tokenTypes.code;\n }\n }\n\n // Inline\n function getType(state) {\n var styles = [];\n\n if (state.formatting) {\n styles.push(tokenTypes.formatting);\n\n if (typeof state.formatting === \"string\") state.formatting = [state.formatting];\n\n for (var i = 0; i < state.formatting.length; i++) {\n styles.push(tokenTypes.formatting + \"-\" + state.formatting[i]);\n\n if (state.formatting[i] === \"header\") {\n styles.push(tokenTypes.formatting + \"-\" + state.formatting[i] + \"-\" + state.header);\n }\n\n // Add `formatting-quote` and `formatting-quote-#` for blockquotes\n // Add `error` instead if the maximum blockquote nesting depth is passed\n if (state.formatting[i] === \"quote\") {\n if (!modeCfg.maxBlockquoteDepth || modeCfg.maxBlockquoteDepth >= state.quote) {\n styles.push(tokenTypes.formatting + \"-\" + state.formatting[i] + \"-\" + state.quote);\n } else {\n styles.push(\"error\");\n }\n }\n }\n }\n\n if (state.taskOpen) {\n styles.push(\"meta\");\n return styles.length ? styles.join(' ') : null;\n }\n if (state.taskClosed) {\n styles.push(\"property\");\n return styles.length ? styles.join(' ') : null;\n }\n\n if (state.linkHref) {\n styles.push(tokenTypes.linkHref, \"url\");\n } else { // Only apply inline styles to non-url text\n if (state.strong) { styles.push(tokenTypes.strong); }\n if (state.em) { styles.push(tokenTypes.em); }\n if (state.strikethrough) { styles.push(tokenTypes.strikethrough); }\n if (state.emoji) { styles.push(tokenTypes.emoji); }\n if (state.linkText) { styles.push(tokenTypes.linkText); }\n if (state.code) { styles.push(tokenTypes.code); }\n if (state.image) { styles.push(tokenTypes.image); }\n if (state.imageAltText) { styles.push(tokenTypes.imageAltText, \"link\"); }\n if (state.imageMarker) { styles.push(tokenTypes.imageMarker); }\n }\n\n if (state.header) { styles.push(tokenTypes.header, tokenTypes.header + \"-\" + state.header); }\n\n if (state.quote) {\n styles.push(tokenTypes.quote);\n\n // Add `quote-#` where the maximum for `#` is modeCfg.maxBlockquoteDepth\n if (!modeCfg.maxBlockquoteDepth || modeCfg.maxBlockquoteDepth >= state.quote) {\n styles.push(tokenTypes.quote + \"-\" + state.quote);\n } else {\n styles.push(tokenTypes.quote + \"-\" + modeCfg.maxBlockquoteDepth);\n }\n }\n\n if (state.list !== false) {\n var listMod = (state.listStack.length - 1) % 3;\n if (!listMod) {\n styles.push(tokenTypes.list1);\n } else if (listMod === 1) {\n styles.push(tokenTypes.list2);\n } else {\n styles.push(tokenTypes.list3);\n }\n }\n\n if (state.trailingSpaceNewLine) {\n styles.push(\"trailing-space-new-line\");\n } else if (state.trailingSpace) {\n styles.push(\"trailing-space-\" + (state.trailingSpace % 2 ? \"a\" : \"b\"));\n }\n\n return styles.length ? styles.join(' ') : null;\n }\n\n function handleText(stream, state) {\n if (stream.match(textRE, true)) {\n return getType(state);\n }\n return undefined;\n }\n\n function inlineNormal(stream, state) {\n var style = state.text(stream, state);\n if (typeof style !== 'undefined')\n return style;\n\n if (state.list) { // List marker (*, +, -, 1., etc)\n state.list = null;\n return getType(state);\n }\n\n if (state.taskList) {\n var taskOpen = stream.match(taskListRE, true)[1] === \" \";\n if (taskOpen) state.taskOpen = true;\n else state.taskClosed = true;\n if (modeCfg.highlightFormatting) state.formatting = \"task\";\n state.taskList = false;\n return getType(state);\n }\n\n state.taskOpen = false;\n state.taskClosed = false;\n\n if (state.header && stream.match(/^#+$/, true)) {\n if (modeCfg.highlightFormatting) state.formatting = \"header\";\n return getType(state);\n }\n\n var ch = stream.next();\n\n // Matches link titles present on next line\n if (state.linkTitle) {\n state.linkTitle = false;\n var matchCh = ch;\n if (ch === '(') {\n matchCh = ')';\n }\n matchCh = (matchCh+'').replace(/([.?*+^\\[\\]\\\\(){}|-])/g, \"\\\\$1\");\n var regex = '^\\\\s*(?:[^' + matchCh + '\\\\\\\\]+|\\\\\\\\\\\\\\\\|\\\\\\\\.)' + matchCh;\n if (stream.match(new RegExp(regex), true)) {\n return tokenTypes.linkHref;\n }\n }\n\n // If this block is changed, it may need to be updated in GFM mode\n if (ch === '`') {\n var previousFormatting = state.formatting;\n if (modeCfg.highlightFormatting) state.formatting = \"code\";\n stream.eatWhile('`');\n var count = stream.current().length\n if (state.code == 0 && (!state.quote || count == 1)) {\n state.code = count\n return getType(state)\n } else if (count == state.code) { // Must be exact\n var t = getType(state)\n state.code = 0\n return t\n } else {\n state.formatting = previousFormatting\n return getType(state)\n }\n } else if (state.code) {\n return getType(state);\n }\n\n if (ch === '\\\\') {\n stream.next();\n if (modeCfg.highlightFormatting) {\n var type = getType(state);\n var formattingEscape = tokenTypes.formatting + \"-escape\";\n return type ? type + \" \" + formattingEscape : formattingEscape;\n }\n }\n\n if (ch === '!' && stream.match(/\\[[^\\]]*\\] ?(?:\\(|\\[)/, false)) {\n state.imageMarker = true;\n state.image = true;\n if (modeCfg.highlightFormatting) state.formatting = \"image\";\n return getType(state);\n }\n\n if (ch === '[' && state.imageMarker && stream.match(/[^\\]]*\\](\\(.*?\\)| ?\\[.*?\\])/, false)) {\n state.imageMarker = false;\n state.imageAltText = true\n if (modeCfg.highlightFormatting) state.formatting = \"image\";\n return getType(state);\n }\n\n if (ch === ']' && state.imageAltText) {\n if (modeCfg.highlightFormatting) state.formatting = \"image\";\n var type = getType(state);\n state.imageAltText = false;\n state.image = false;\n state.inline = state.f = linkHref;\n return type;\n }\n\n if (ch === '[' && !state.image) {\n if (state.linkText && stream.match(/^.*?\\]/)) return getType(state)\n state.linkText = true;\n if (modeCfg.highlightFormatting) state.formatting = \"link\";\n return getType(state);\n }\n\n if (ch === ']' && state.linkText) {\n if (modeCfg.highlightFormatting) state.formatting = \"link\";\n var type = getType(state);\n state.linkText = false;\n state.inline = state.f = stream.match(/\\(.*?\\)| ?\\[.*?\\]/, false) ? linkHref : inlineNormal\n return type;\n }\n\n if (ch === '<' && stream.match(/^(https?|ftps?):\\/\\/(?:[^\\\\>]|\\\\.)+>/, false)) {\n state.f = state.inline = linkInline;\n if (modeCfg.highlightFormatting) state.formatting = \"link\";\n var type = getType(state);\n if (type){\n type += \" \";\n } else {\n type = \"\";\n }\n return type + tokenTypes.linkInline;\n }\n\n if (ch === '<' && stream.match(/^[^> \\\\]+@(?:[^\\\\>]|\\\\.)+>/, false)) {\n state.f = state.inline = linkInline;\n if (modeCfg.highlightFormatting) state.formatting = \"link\";\n var type = getType(state);\n if (type){\n type += \" \";\n } else {\n type = \"\";\n }\n return type + tokenTypes.linkEmail;\n }\n\n if (modeCfg.xml && ch === '<' && stream.match(/^(!--|\\?|!\\[CDATA\\[|[a-z][a-z0-9-]*(?:\\s+[a-z_:.\\-]+(?:\\s*=\\s*[^>]+)?)*\\s*(?:>|$))/i, false)) {\n var end = stream.string.indexOf(\">\", stream.pos);\n if (end != -1) {\n var atts = stream.string.substring(stream.start, end);\n if (/markdown\\s*=\\s*('|\"){0,1}1('|\"){0,1}/.test(atts)) state.md_inside = true;\n }\n stream.backUp(1);\n state.htmlState = CodeMirror.startState(htmlMode);\n return switchBlock(stream, state, htmlBlock);\n }\n\n if (modeCfg.xml && ch === '<' && stream.match(/^\\/\\w*?>/)) {\n state.md_inside = false;\n return \"tag\";\n } else if (ch === \"*\" || ch === \"_\") {\n var len = 1, before = stream.pos == 1 ? \" \" : stream.string.charAt(stream.pos - 2)\n while (len < 3 && stream.eat(ch)) len++\n var after = stream.peek() || \" \"\n // See http://spec.commonmark.org/0.27/#emphasis-and-strong-emphasis\n var leftFlanking = !/\\s/.test(after) && (!punctuation.test(after) || /\\s/.test(before) || punctuation.test(before))\n var rightFlanking = !/\\s/.test(before) && (!punctuation.test(before) || /\\s/.test(after) || punctuation.test(after))\n var setEm = null, setStrong = null\n if (len % 2) { // Em\n if (!state.em && leftFlanking && (ch === \"*\" || !rightFlanking || punctuation.test(before)))\n setEm = true\n else if (state.em == ch && rightFlanking && (ch === \"*\" || !leftFlanking || punctuation.test(after)))\n setEm = false\n }\n if (len > 1) { // Strong\n if (!state.strong && leftFlanking && (ch === \"*\" || !rightFlanking || punctuation.test(before)))\n setStrong = true\n else if (state.strong == ch && rightFlanking && (ch === \"*\" || !leftFlanking || punctuation.test(after)))\n setStrong = false\n }\n if (setStrong != null || setEm != null) {\n if (modeCfg.highlightFormatting) state.formatting = setEm == null ? \"strong\" : setStrong == null ? \"em\" : \"strong em\"\n if (setEm === true) state.em = ch\n if (setStrong === true) state.strong = ch\n var t = getType(state)\n if (setEm === false) state.em = false\n if (setStrong === false) state.strong = false\n return t\n }\n } else if (ch === ' ') {\n if (stream.eat('*') || stream.eat('_')) { // Probably surrounded by spaces\n if (stream.peek() === ' ') { // Surrounded by spaces, ignore\n return getType(state);\n } else { // Not surrounded by spaces, back up pointer\n stream.backUp(1);\n }\n }\n }\n\n if (modeCfg.strikethrough) {\n if (ch === '~' && stream.eatWhile(ch)) {\n if (state.strikethrough) {// Remove strikethrough\n if (modeCfg.highlightFormatting) state.formatting = \"strikethrough\";\n var t = getType(state);\n state.strikethrough = false;\n return t;\n } else if (stream.match(/^[^\\s]/, false)) {// Add strikethrough\n state.strikethrough = true;\n if (modeCfg.highlightFormatting) state.formatting = \"strikethrough\";\n return getType(state);\n }\n } else if (ch === ' ') {\n if (stream.match('~~', true)) { // Probably surrounded by space\n if (stream.peek() === ' ') { // Surrounded by spaces, ignore\n return getType(state);\n } else { // Not surrounded by spaces, back up pointer\n stream.backUp(2);\n }\n }\n }\n }\n\n if (modeCfg.emoji && ch === \":\" && stream.match(/^(?:[a-z_\\d+][a-z_\\d+-]*|\\-[a-z_\\d+][a-z_\\d+-]*):/)) {\n state.emoji = true;\n if (modeCfg.highlightFormatting) state.formatting = \"emoji\";\n var retType = getType(state);\n state.emoji = false;\n return retType;\n }\n\n if (ch === ' ') {\n if (stream.match(/^ +$/, false)) {\n state.trailingSpace++;\n } else if (state.trailingSpace) {\n state.trailingSpaceNewLine = true;\n }\n }\n\n return getType(state);\n }\n\n function linkInline(stream, state) {\n var ch = stream.next();\n\n if (ch === \">\") {\n state.f = state.inline = inlineNormal;\n if (modeCfg.highlightFormatting) state.formatting = \"link\";\n var type = getType(state);\n if (type){\n type += \" \";\n } else {\n type = \"\";\n }\n return type + tokenTypes.linkInline;\n }\n\n stream.match(/^[^>]+/, true);\n\n return tokenTypes.linkInline;\n }\n\n function linkHref(stream, state) {\n // Check if space, and return NULL if so (to avoid marking the space)\n if(stream.eatSpace()){\n return null;\n }\n var ch = stream.next();\n if (ch === '(' || ch === '[') {\n state.f = state.inline = getLinkHrefInside(ch === \"(\" ? \")\" : \"]\");\n if (modeCfg.highlightFormatting) state.formatting = \"link-string\";\n state.linkHref = true;\n return getType(state);\n }\n return 'error';\n }\n\n var linkRE = {\n \")\": /^(?:[^\\\\\\(\\)]|\\\\.|\\((?:[^\\\\\\(\\)]|\\\\.)*\\))*?(?=\\))/,\n \"]\": /^(?:[^\\\\\\[\\]]|\\\\.|\\[(?:[^\\\\\\[\\]]|\\\\.)*\\])*?(?=\\])/\n }\n\n function getLinkHrefInside(endChar) {\n return function(stream, state) {\n var ch = stream.next();\n\n if (ch === endChar) {\n state.f = state.inline = inlineNormal;\n if (modeCfg.highlightFormatting) state.formatting = \"link-string\";\n var returnState = getType(state);\n state.linkHref = false;\n return returnState;\n }\n\n stream.match(linkRE[endChar])\n state.linkHref = true;\n return getType(state);\n };\n }\n\n function footnoteLink(stream, state) {\n if (stream.match(/^([^\\]\\\\]|\\\\.)*\\]:/, false)) {\n state.f = footnoteLinkInside;\n stream.next(); // Consume [\n if (modeCfg.highlightFormatting) state.formatting = \"link\";\n state.linkText = true;\n return getType(state);\n }\n return switchInline(stream, state, inlineNormal);\n }\n\n function footnoteLinkInside(stream, state) {\n if (stream.match(']:', true)) {\n state.f = state.inline = footnoteUrl;\n if (modeCfg.highlightFormatting) state.formatting = \"link\";\n var returnType = getType(state);\n state.linkText = false;\n return returnType;\n }\n\n stream.match(/^([^\\]\\\\]|\\\\.)+/, true);\n\n return tokenTypes.linkText;\n }\n\n function footnoteUrl(stream, state) {\n // Check if space, and return NULL if so (to avoid marking the space)\n if(stream.eatSpace()){\n return null;\n }\n // Match URL\n stream.match(/^[^\\s]+/, true);\n // Check for link title\n if (stream.peek() === undefined) { // End of line, set flag to check next line\n state.linkTitle = true;\n } else { // More content on line, check if link title\n stream.match(/^(?:\\s+(?:\"(?:[^\"\\\\]|\\\\.)+\"|'(?:[^'\\\\]|\\\\.)+'|\\((?:[^)\\\\]|\\\\.)+\\)))?/, true);\n }\n state.f = state.inline = inlineNormal;\n return tokenTypes.linkHref + \" url\";\n }\n\n var mode = {\n startState: function() {\n return {\n f: blockNormal,\n\n prevLine: {stream: null},\n thisLine: {stream: null},\n\n block: blockNormal,\n htmlState: null,\n indentation: 0,\n\n inline: inlineNormal,\n text: handleText,\n\n formatting: false,\n linkText: false,\n linkHref: false,\n linkTitle: false,\n code: 0,\n em: false,\n strong: false,\n header: 0,\n setext: 0,\n hr: false,\n taskList: false,\n list: false,\n listStack: [],\n quote: 0,\n trailingSpace: 0,\n trailingSpaceNewLine: false,\n strikethrough: false,\n emoji: false,\n fencedEndRE: null\n };\n },\n\n copyState: function(s) {\n return {\n f: s.f,\n\n prevLine: s.prevLine,\n thisLine: s.thisLine,\n\n block: s.block,\n htmlState: s.htmlState && CodeMirror.copyState(htmlMode, s.htmlState),\n indentation: s.indentation,\n\n localMode: s.localMode,\n localState: s.localMode ? CodeMirror.copyState(s.localMode, s.localState) : null,\n\n inline: s.inline,\n text: s.text,\n formatting: false,\n linkText: s.linkText,\n linkTitle: s.linkTitle,\n linkHref: s.linkHref,\n code: s.code,\n em: s.em,\n strong: s.strong,\n strikethrough: s.strikethrough,\n emoji: s.emoji,\n header: s.header,\n setext: s.setext,\n hr: s.hr,\n taskList: s.taskList,\n list: s.list,\n listStack: s.listStack.slice(0),\n quote: s.quote,\n indentedCode: s.indentedCode,\n trailingSpace: s.trailingSpace,\n trailingSpaceNewLine: s.trailingSpaceNewLine,\n md_inside: s.md_inside,\n fencedEndRE: s.fencedEndRE\n };\n },\n\n token: function(stream, state) {\n\n // Reset state.formatting\n state.formatting = false;\n\n if (stream != state.thisLine.stream) {\n state.header = 0;\n state.hr = false;\n\n if (stream.match(/^\\s*$/, true)) {\n blankLine(state);\n return null;\n }\n\n state.prevLine = state.thisLine\n state.thisLine = {stream: stream}\n\n // Reset state.taskList\n state.taskList = false;\n\n // Reset state.trailingSpace\n state.trailingSpace = 0;\n state.trailingSpaceNewLine = false;\n\n if (!state.localState) {\n state.f = state.block;\n if (state.f != htmlBlock) {\n var indentation = stream.match(/^\\s*/, true)[0].replace(/\\t/g, expandedTab).length;\n state.indentation = indentation;\n state.indentationDiff = null;\n if (indentation > 0) return null;\n }\n }\n }\n return state.f(stream, state);\n },\n\n innerMode: function(state) {\n if (state.block == htmlBlock) return {state: state.htmlState, mode: htmlMode};\n if (state.localState) return {state: state.localState, mode: state.localMode};\n return {state: state, mode: mode};\n },\n\n indent: function(state, textAfter, line) {\n if (state.block == htmlBlock && htmlMode.indent) return htmlMode.indent(state.htmlState, textAfter, line)\n if (state.localState && state.localMode.indent) return state.localMode.indent(state.localState, textAfter, line)\n return CodeMirror.Pass\n },\n\n blankLine: blankLine,\n\n getType: getType,\n\n blockCommentStart: \"\",\n closeBrackets: \"()[]{}''\\\"\\\"``\",\n fold: \"markdown\"\n };\n return mode;\n}, \"xml\");\n\nCodeMirror.defineMIME(\"text/markdown\", \"markdown\");\n\nCodeMirror.defineMIME(\"text/x-markdown\", \"markdown\");\n\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vbm9kZV9tb2R1bGVzL2NvZGVtaXJyb3IvbW9kZS9tYXJrZG93bi9tYXJrZG93bi5qcz85NTliIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNLElBQXVEO0FBQzdELFFBQVEsbUJBQU8sQ0FBQyx5RUFBc0IsR0FBRyxtQkFBTyxDQUFDLDZEQUFZLEdBQUcsbUJBQU8sQ0FBQyx1REFBUztBQUNqRixPQUFPLEVBR2E7QUFDcEIsQ0FBQztBQUNEOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpQ0FBaUMsR0FBRztBQUNwQztBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsSUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHO0FBQzlDO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxlQUFlLEVBQUU7QUFDMUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FB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QTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQSxLQUFLLE9BQU87QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG1CQUFtQixhQUFhO0FBQ2hDLG1CQUFtQixhQUFhOztBQUVoQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMEJBQTBCOztBQUUxQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLDRDQUE0QztBQUM1QyxvQ0FBb0M7QUFDcEMsY0FBYztBQUNkLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMOztBQUVBOztBQUVBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDs7QUFFQTs7QUFFQSxDQUFDIiwiZmlsZSI6Ii4vbm9kZV9tb2R1bGVzL2NvZGVtaXJyb3IvbW9kZS9tYXJrZG93bi9tYXJrZG93bi5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvZGVNaXJyb3IsIGNvcHlyaWdodCAoYykgYnkgTWFyaWpuIEhhdmVyYmVrZSBhbmQgb3RoZXJzXG4vLyBEaXN0cmlidXRlZCB1bmRlciBhbiBNSVQgbGljZW5zZTogaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFXG5cbihmdW5jdGlvbihtb2QpIHtcbiAgaWYgKHR5cGVvZiBleHBvcnRzID09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG1vZHVsZSA9PSBcIm9iamVjdFwiKSAvLyBDb21tb25KU1xuICAgIG1vZChyZXF1aXJlKFwiLi4vLi4vbGliL2NvZGVtaXJyb3JcIiksIHJlcXVpcmUoXCIuLi94bWwveG1sXCIpLCByZXF1aXJlKFwiLi4vbWV0YVwiKSk7XG4gIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIC8vIEFNRFxuICAgIGRlZmluZShbXCIuLi8uLi9saWIvY29kZW1pcnJvclwiLCBcIi4uL3htbC94bWxcIiwgXCIuLi9tZXRhXCJdLCBtb2QpO1xuICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52XG4gICAgbW9kKENvZGVNaXJyb3IpO1xufSkoZnVuY3Rpb24oQ29kZU1pcnJvcikge1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbkNvZGVNaXJyb3IuZGVmaW5lTW9kZShcIm1hcmtkb3duXCIsIGZ1bmN0aW9uKGNtQ2ZnLCBtb2RlQ2ZnKSB7XG5cbiAgdmFyIGh0bWxNb2RlID0gQ29kZU1pcnJvci5nZXRNb2RlKGNtQ2ZnLCBcInRleHQvaHRtbFwiKTtcbiAgdmFyIGh0bWxNb2RlTWlzc2luZyA9IGh0bWxNb2RlLm5hbWUgPT0gXCJudWxsXCJcblxuICBmdW5jdGlvbiBnZXRNb2RlKG5hbWUpIHtcbiAgICBpZiAoQ29kZU1pcnJvci5maW5kTW9kZUJ5TmFtZSkge1xuICAgICAgdmFyIGZvdW5kID0gQ29kZU1pcnJvci5maW5kTW9kZUJ5TmFtZShuYW1lKTtcbiAgICAgIGlmIChmb3VuZCkgbmFtZSA9IGZvdW5kLm1pbWUgfHwgZm91bmQubWltZXNbMF07XG4gICAgfVxuICAgIHZhciBtb2RlID0gQ29kZU1pcnJvci5nZXRNb2RlKGNtQ2ZnLCBuYW1lKTtcbiAgICByZXR1cm4gbW9kZS5uYW1lID09IFwibnVsbFwiID8gbnVsbCA6IG1vZGU7XG4gIH1cblxuICAvLyBTaG91bGQgY2hhcmFjdGVycyB0aGF0IGFmZmVjdCBoaWdobGlnaHRpbmcgYmUgaGlnaGxpZ2h0ZWQgc2VwYXJhdGU/XG4gIC8vIERvZXMgbm90IGluY2x1ZGUgY2hhcmFjdGVycyB0aGF0IHdpbGwgYmUgb3V0cHV0IChzdWNoIGFzIGAxLmAgYW5kIGAtYCBmb3IgbGlzdHMpXG4gIGlmIChtb2RlQ2ZnLmhpZ2hsaWdodEZvcm1hdHRpbmcgPT09IHVuZGVmaW5lZClcbiAgICBtb2RlQ2ZnLmhpZ2hsaWdodEZvcm1hdHRpbmcgPSBmYWxzZTtcblxuICAvLyBNYXhpbXVtIG51bWJlciBvZiBuZXN0ZWQgYmxvY2txdW90ZXMuIFNldCB0byAwIGZvciBpbmZpbml0ZSBuZXN0aW5nLlxuICAvLyBFeGNlc3MgYD5gIHdpbGwgZW1pdCBgZXJyb3JgIHRva2VuLlxuICBpZiAobW9kZUNmZy5tYXhCbG9ja3F1b3RlRGVwdGggPT09IHVuZGVmaW5lZClcbiAgICBtb2RlQ2ZnLm1heEJsb2NrcXVvdGVEZXB0aCA9IDA7XG5cbiAgLy8gVHVybiBvbiB0YXNrIGxpc3RzPyAoXCItIFsgXSBcIiBhbmQgXCItIFt4XSBcIilcbiAgaWYgKG1vZGVDZmcudGFza0xpc3RzID09PSB1bmRlZmluZWQpIG1vZGVDZmcudGFza0xpc3RzID0gZmFsc2U7XG5cbiAgLy8gVHVybiBvbiBzdHJpa2V0aHJvdWdoIHN5bnRheFxuICBpZiAobW9kZUNmZy5zdHJpa2V0aHJvdWdoID09PSB1bmRlZmluZWQpXG4gICAgbW9kZUNmZy5zdHJpa2V0aHJvdWdoID0gZmFsc2U7XG5cbiAgaWYgKG1vZGVDZmcuZW1vamkgPT09IHVuZGVmaW5lZClcbiAgICBtb2RlQ2ZnLmVtb2ppID0gZmFsc2U7XG5cbiAgaWYgKG1vZGVDZmcuZmVuY2VkQ29kZUJsb2NrSGlnaGxpZ2h0aW5nID09PSB1bmRlZmluZWQpXG4gICAgbW9kZUNmZy5mZW5jZWRDb2RlQmxvY2tIaWdobGlnaHRpbmcgPSB0cnVlO1xuXG4gIGlmIChtb2RlQ2ZnLmZlbmNlZENvZGVCbG9ja0RlZmF1bHRNb2RlID09PSB1bmRlZmluZWQpXG4gICAgbW9kZUNmZy5mZW5jZWRDb2RlQmxvY2tEZWZhdWx0TW9kZSA9ICd0ZXh0L3BsYWluJztcblxuICBpZiAobW9kZUNmZy54bWwgPT09IHVuZGVmaW5lZClcbiAgICBtb2RlQ2ZnLnhtbCA9IHRydWU7XG5cbiAgLy8gQWxsb3cgdG9rZW4gdHlwZXMgdG8gYmUgb3ZlcnJpZGRlbiBieSB1c2VyLXByb3ZpZGVkIHRva2VuIHR5cGVzLlxuICBpZiAobW9kZUNmZy50b2tlblR5cGVPdmVycmlkZXMgPT09IHVuZGVmaW5lZClcbiAgICBtb2RlQ2ZnLnRva2VuVHlwZU92ZXJyaWRlcyA9IHt9O1xuXG4gIHZhciB0b2tlblR5cGVzID0ge1xuICAgIGhlYWRlcjogXCJoZWFkZXJcIixcbiAgICBjb2RlOiBcImNvbW1lbnRcIixcbiAgICBxdW90ZTogXCJxdW90ZVwiLFxuICAgIGxpc3QxOiBcInZhcmlhYmxlLTJcIixcbiAgICBsaXN0MjogXCJ2YXJpYWJsZS0zXCIsXG4gICAgbGlzdDM6IFwia2V5d29yZFwiLFxuICAgIGhyOiBcImhyXCIsXG4gICAgaW1hZ2U6IFwiaW1hZ2VcIixcbiAgICBpbWFnZUFsdFRleHQ6IFwiaW1hZ2UtYWx0LXRleHRcIixcbiAgICBpbWFnZU1hcmtlcjogXCJpbWFnZS1tYXJrZXJcIixcbiAgICBmb3JtYXR0aW5nOiBcImZvcm1hdHRpbmdcIixcbiAgICBsaW5rSW5saW5lOiBcImxpbmtcIixcbiAgICBsaW5rRW1haWw6IFwibGlua1wiLFxuICAgIGxpbmtUZXh0OiBcImxpbmtcIixcbiAgICBsaW5rSHJlZjogXCJzdHJpbmdcIixcbiAgICBlbTogXCJlbVwiLFxuICAgIHN0cm9uZzogXCJzdHJvbmdcIixcbiAgICBzdHJpa2V0aHJvdWdoOiBcInN0cmlrZXRocm91Z2hcIixcbiAgICBlbW9qaTogXCJidWlsdGluXCJcbiAgfTtcblxuICBmb3IgKHZhciB0b2tlblR5cGUgaW4gdG9rZW5UeXBlcykge1xuICAgIGlmICh0b2tlblR5cGVzLmhhc093blByb3BlcnR5KHRva2VuVHlwZSkgJiYgbW9kZUNmZy50b2tlblR5cGVPdmVycmlkZXNbdG9rZW5UeXBlXSkge1xuICAgICAgdG9rZW5UeXBlc1t0b2tlblR5cGVdID0gbW9kZUNmZy50b2tlblR5cGVPdmVycmlkZXNbdG9rZW5UeXBlXTtcbiAgICB9XG4gIH1cblxuICB2YXIgaHJSRSA9IC9eKFsqXFwtX10pKD86XFxzKlxcMSl7Mix9XFxzKiQvXG4gICwgICBsaXN0UkUgPSAvXig/OlsqXFwtK118XlswLTldKyhbLildKSlcXHMrL1xuICAsICAgdGFza0xpc3RSRSA9IC9eXFxbKHh8IClcXF0oPz1cXHMpL2kgLy8gTXVzdCBmb2xsb3cgbGlzdFJFXG4gICwgICBhdHhIZWFkZXJSRSA9IG1vZGVDZmcuYWxsb3dBdHhIZWFkZXJXaXRob3V0U3BhY2UgPyAvXigjKykvIDogL14oIyspKD86IHwkKS9cbiAgLCAgIHNldGV4dEhlYWRlclJFID0gL14gezAsM30oPzpcXD17MSx9fC17Mix9KVxccyokL1xuICAsICAgdGV4dFJFID0gL15bXiMhXFxbXFxdKl9cXFxcPD5gIFwiJyh+Ol0rL1xuICAsICAgZmVuY2VkQ29kZVJFID0gL14ofn5+K3xgYGArKVsgXFx0XSooW1xcd1xcLysjLV0qKVteXFxuYF0qJC9cbiAgLCAgIGxpbmtEZWZSRSA9IC9eXFxzKlxcW1teXFxdXSs/XFxdOi4qJC8gLy8gbmFpdmUgbGluay1kZWZpbml0aW9uXG4gICwgICBwdW5jdHVhdGlvbiA9IC9bIVwiIyQlJicoKSorLFxcLS5cXC86Ozw9Pj9AXFxbXFxcXFxcXV5fYHt8fX5cXHhBMVxceEE3XFx4QUJcXHhCNlxceEI3XFx4QkJcXHhCRlxcdTAzN0VcXHUwMzg3XFx1MDU1QS1cXHUwNTVGXFx1MDU4OVxcdTA1OEFcXHUwNUJFXFx1MDVDMFxcdTA1QzNcXHUwNUM2XFx1MDVGM1xcdTA1RjRcXHUwNjA5XFx1MDYwQVxcdTA2MENcXHUwNjBEXFx1MDYxQlxcdTA2MUVcXHUwNjFGXFx1MDY2QS1cXHUwNjZEXFx1MDZENFxcdTA3MDAtXFx1MDcwRFxcdTA3RjctXFx1MDdGOVxcdTA4MzAtXFx1MDgzRVxcdTA4NUVcXHUwOTY0XFx1MDk2NVxcdTA5NzBcXHUwQUYwXFx1MERGNFxcdTBFNEZcXHUwRTVBXFx1MEU1QlxcdTBGMDQtXFx1MEYxMlxcdTBGMTRcXHUwRjNBLVxcdTBGM0RcXHUwRjg1XFx1MEZEMC1cXHUwRkQ0XFx1MEZEOVxcdTBGREFcXHUxMDRBLVxcdTEwNEZcXHUxMEZCXFx1MTM2MC1cXHUxMzY4XFx1MTQwMFxcdTE2NkRcXHUxNjZFXFx1MTY5QlxcdTE2OUNcXHUxNkVCLVxcdTE2RURcXHUxNzM1XFx1MTczNlxcdTE3RDQtXFx1MTdENlxcdTE3RDgtXFx1MTdEQVxcdTE4MDAtXFx1MTgwQVxcdTE5NDRcXHUxOTQ1XFx1MUExRVxcdTFBMUZcXHUxQUEwLVxcdTFBQTZcXHUxQUE4LVxcdTFBQURcXHUxQjVBLVxcdTFCNjBcXHUxQkZDLVxcdTFCRkZcXHUxQzNCLVxcdTFDM0ZcXHUxQzdFXFx1MUM3RlxcdTFDQzAtXFx1MUNDN1xcdTFDRDNcXHUyMDEwLVxcdTIwMjdcXHUyMDMwLVxcdTIwNDNcXHUyMDQ1LVxcdTIwNTFcXHUyMDUzLVxcdTIwNUVcXHUyMDdEXFx1MjA3RVxcdTIwOERcXHUyMDhFXFx1MjMwOC1cXHUyMzBCXFx1MjMyOVxcdTIzMkFcXHUyNzY4LVxcdTI3NzVcXHUyN0M1XFx1MjdDNlxcdTI3RTYtXFx1MjdFRlxcdTI5ODMtXFx1Mjk5OFxcdTI5RDgtXFx1MjlEQlxcdTI5RkNcXHUyOUZEXFx1MkNGOS1cXHUyQ0ZDXFx1MkNGRVxcdTJDRkZcXHUyRDcwXFx1MkUwMC1cXHUyRTJFXFx1MkUzMC1cXHUyRTQyXFx1MzAwMS1cXHUzMDAzXFx1MzAwOC1cXHUzMDExXFx1MzAxNC1cXHUzMDFGXFx1MzAzMFxcdTMwM0RcXHUzMEEwXFx1MzBGQlxcdUE0RkVcXHVBNEZGXFx1QTYwRC1cXHVBNjBGXFx1QTY3M1xcdUE2N0VcXHVBNkYyLVxcdUE2RjdcXHVBODc0LVxcdUE4NzdcXHVBOENFXFx1QThDRlxcdUE4RjgtXFx1QThGQVxcdUE4RkNcXHVBOTJFXFx1QTkyRlxcdUE5NUZcXHVBOUMxLVxcdUE5Q0RcXHVBOURFXFx1QTlERlxcdUFBNUMtXFx1QUE1RlxcdUFBREVcXHVBQURGXFx1QUFGMFxcdUFBRjFcXHVBQkVCXFx1RkQzRVxcdUZEM0ZcXHVGRTEwLVxcdUZFMTlcXHVGRTMwLVxcdUZFNTJcXHVGRTU0LVxcdUZFNjFcXHVGRTYzXFx1RkU2OFxcdUZFNkFcXHVGRTZCXFx1RkYwMS1cXHVGRjAzXFx1RkYwNS1cXHVGRjBBXFx1RkYwQy1cXHVGRjBGXFx1RkYxQVxcdUZGMUJcXHVGRjFGXFx1RkYyMFxcdUZGM0ItXFx1RkYzRFxcdUZGM0ZcXHVGRjVCXFx1RkY1RFxcdUZGNUYtXFx1RkY2NV18XFx1RDgwMFtcXHVERDAwLVxcdUREMDJcXHVERjlGXFx1REZEMF18XFx1RDgwMVxcdURENkZ8XFx1RDgwMltcXHVEQzU3XFx1REQxRlxcdUREM0ZcXHVERTUwLVxcdURFNThcXHVERTdGXFx1REVGMC1cXHVERUY2XFx1REYzOS1cXHVERjNGXFx1REY5OS1cXHVERjlDXXxcXHVEODA0W1xcdURDNDctXFx1REM0RFxcdURDQkJcXHVEQ0JDXFx1RENCRS1cXHVEQ0MxXFx1REQ0MC1cXHVERDQzXFx1REQ3NFxcdURENzVcXHVEREM1LVxcdUREQzlcXHVERENEXFx1REREQlxcdUREREQtXFx1RERERlxcdURFMzgtXFx1REUzRFxcdURFQTldfFxcdUQ4MDVbXFx1RENDNlxcdUREQzEtXFx1REREN1xcdURFNDEtXFx1REU0M1xcdURGM0MtXFx1REYzRV18XFx1RDgwOVtcXHVEQzcwLVxcdURDNzRdfFxcdUQ4MUFbXFx1REU2RVxcdURFNkZcXHVERUY1XFx1REYzNy1cXHVERjNCXFx1REY0NF18XFx1RDgyRlxcdURDOUZ8XFx1RDgzNltcXHVERTg3LVxcdURFOEJdL1xuICAsICAgZXhwYW5kZWRUYWIgPSBcIiAgICBcIiAvLyBDb21tb25NYXJrIHNwZWNpZmllcyB0YWIgYXMgNCBzcGFjZXNcblxuICBmdW5jdGlvbiBzd2l0Y2hJbmxpbmUoc3RyZWFtLCBzdGF0ZSwgZikge1xuICAgIHN0YXRlLmYgPSBzdGF0ZS5pbmxpbmUgPSBmO1xuICAgIHJldHVybiBmKHN0cmVhbSwgc3RhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gc3dpdGNoQmxvY2soc3RyZWFtLCBzdGF0ZSwgZikge1xuICAgIHN0YXRlLmYgPSBzdGF0ZS5ibG9jayA9IGY7XG4gICAgcmV0dXJuIGYoc3RyZWFtLCBzdGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBsaW5lSXNFbXB0eShsaW5lKSB7XG4gICAgcmV0dXJuICFsaW5lIHx8ICEvXFxTLy50ZXN0KGxpbmUuc3RyaW5nKVxuICB9XG5cbiAgLy8gQmxvY2tzXG5cbiAgZnVuY3Rpb24gYmxhbmtMaW5lKHN0YXRlKSB7XG4gICAgLy8gUmVzZXQgbGlua1RpdGxlIHN0YXRlXG4gICAgc3RhdGUubGlua1RpdGxlID0gZmFsc2U7XG4gICAgc3RhdGUubGlua0hyZWYgPSBmYWxzZTtcbiAgICBzdGF0ZS5saW5rVGV4dCA9IGZhbHNlO1xuICAgIC8vIFJlc2V0IEVNIHN0YXRlXG4gICAgc3RhdGUuZW0gPSBmYWxzZTtcbiAgICAvLyBSZXNldCBTVFJPTkcgc3RhdGVcbiAgICBzdGF0ZS5zdHJvbmcgPSBmYWxzZTtcbiAgICAvLyBSZXNldCBzdHJpa2V0aHJvdWdoIHN0YXRlXG4gICAgc3RhdGUuc3RyaWtldGhyb3VnaCA9IGZhbHNlO1xuICAgIC8vIFJlc2V0IHN0YXRlLnF1b3RlXG4gICAgc3RhdGUucXVvdGUgPSAwO1xuICAgIC8vIFJlc2V0IHN0YXRlLmluZGVudGVkQ29kZVxuICAgIHN0YXRlLmluZGVudGVkQ29kZSA9IGZhbHNlO1xuICAgIGlmIChzdGF0ZS5mID09IGh0bWxCbG9jaykge1xuICAgICAgdmFyIGV4aXQgPSBodG1sTW9kZU1pc3NpbmdcbiAgICAgIGlmICghZXhpdCkge1xuICAgICAgICB2YXIgaW5uZXIgPSBDb2RlTWlycm9yLmlubmVyTW9kZShodG1sTW9kZSwgc3RhdGUuaHRtbFN0YXRlKVxuICAgICAgICBleGl0ID0gaW5uZXIubW9kZS5uYW1lID09IFwieG1sXCIgJiYgaW5uZXIuc3RhdGUudGFnU3RhcnQgPT09IG51bGwgJiZcbiAgICAgICAgICAoIWlubmVyLnN0YXRlLmNvbnRleHQgJiYgaW5uZXIuc3RhdGUudG9rZW5pemUuaXNJblRleHQpXG4gICAgICB9XG4gICAgICBpZiAoZXhpdCkge1xuICAgICAgICBzdGF0ZS5mID0gaW5saW5lTm9ybWFsO1xuICAgICAgICBzdGF0ZS5ibG9jayA9IGJsb2NrTm9ybWFsO1xuICAgICAgICBzdGF0ZS5odG1sU3RhdGUgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBSZXNldCBzdGF0ZS50cmFpbGluZ1NwYWNlXG4gICAgc3RhdGUudHJhaWxpbmdTcGFjZSA9IDA7XG4gICAgc3RhdGUudHJhaWxpbmdTcGFjZU5ld0xpbmUgPSBmYWxzZTtcbiAgICAvLyBNYXJrIHRoaXMgbGluZSBhcyBibGFua1xuICAgIHN0YXRlLnByZXZMaW5lID0gc3RhdGUudGhpc0xpbmVcbiAgICBzdGF0ZS50aGlzTGluZSA9IHtzdHJlYW06IG51bGx9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiBibG9ja05vcm1hbChzdHJlYW0sIHN0YXRlKSB7XG4gICAgdmFyIGZpcnN0VG9rZW5PbkxpbmUgPSBzdHJlYW0uY29sdW1uKCkgPT09IHN0YXRlLmluZGVudGF0aW9uO1xuICAgIHZhciBwcmV2TGluZUxpbmVJc0VtcHR5ID0gbGluZUlzRW1wdHkoc3RhdGUucHJldkxpbmUuc3RyZWFtKTtcbiAgICB2YXIgcHJldkxpbmVJc0luZGVudGVkQ29kZSA9IHN0YXRlLmluZGVudGVkQ29kZTtcbiAgICB2YXIgcHJldkxpbmVJc0hyID0gc3RhdGUucHJldkxpbmUuaHI7XG4gICAgdmFyIHByZXZMaW5lSXNMaXN0ID0gc3RhdGUubGlzdCAhPT0gZmFsc2U7XG4gICAgdmFyIG1heE5vbkNvZGVJbmRlbnRhdGlvbiA9IChzdGF0ZS5saXN0U3RhY2tbc3RhdGUubGlzdFN0YWNrLmxlbmd0aCAtIDFdIHx8IDApICsgMztcblxuICAgIHN0YXRlLmluZGVudGVkQ29kZSA9IGZhbHNlO1xuXG4gICAgdmFyIGxpbmVJbmRlbnRhdGlvbiA9IHN0YXRlLmluZGVudGF0aW9uO1xuICAgIC8vIGNvbXB1dGUgb25jZSBwZXIgbGluZSAob24gZmlyc3QgdG9rZW4pXG4gICAgaWYgKHN0YXRlLmluZGVudGF0aW9uRGlmZiA9PT0gbnVsbCkge1xuICAgICAgc3RhdGUuaW5kZW50YXRpb25EaWZmID0gc3RhdGUuaW5kZW50YXRpb247XG4gICAgICBpZiAocHJldkxpbmVJc0xpc3QpIHtcbiAgICAgICAgc3RhdGUubGlzdCA9IG51bGw7XG4gICAgICAgIC8vIFdoaWxlIHRoaXMgbGlzdCBpdGVtJ3MgbWFya2VyJ3MgaW5kZW50YXRpb24gaXMgbGVzcyB0aGFuIHRoZSBkZWVwZXN0XG4gICAgICAgIC8vICBsaXN0IGl0ZW0ncyBjb250ZW50J3MgaW5kZW50YXRpb24scG9wIHRoZSBkZWVwZXN0IGxpc3QgaXRlbVxuICAgICAgICAvLyAgaW5kZW50YXRpb24gb2ZmIHRoZSBzdGFjaywgYW5kIHVwZGF0ZSBibG9jayBpbmRlbnRhdGlvbiBzdGF0ZVxuICAgICAgICB3aGlsZSAobGluZUluZGVudGF0aW9uIDwgc3RhdGUubGlzdFN0YWNrW3N0YXRlLmxpc3RTdGFjay5sZW5ndGggLSAxXSkge1xuICAgICAgICAgIHN0YXRlLmxpc3RTdGFjay5wb3AoKTtcbiAgICAgICAgICBpZiAoc3RhdGUubGlzdFN0YWNrLmxlbmd0aCkge1xuICAgICAgICAgICAgc3RhdGUuaW5kZW50YXRpb24gPSBzdGF0ZS5saXN0U3RhY2tbc3RhdGUubGlzdFN0YWNrLmxlbmd0aCAtIDFdO1xuICAgICAgICAgIC8vIGxlc3MgdGhhbiB0aGUgZmlyc3QgbGlzdCdzIGluZGVudCAtPiB0aGUgbGluZSBpcyBubyBsb25nZXIgYSBsaXN0XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXRlLmxpc3QgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLmxpc3QgIT09IGZhbHNlKSB7XG4gICAgICAgICAgc3RhdGUuaW5kZW50YXRpb25EaWZmID0gbGluZUluZGVudGF0aW9uIC0gc3RhdGUubGlzdFN0YWNrW3N0YXRlLmxpc3RTdGFjay5sZW5ndGggLSAxXVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gbm90IGNvbXByZWhlbnNpdmUgKGN1cnJlbnRseSBvbmx5IGZvciBzZXRleHQgZGV0ZWN0aW9uIHB1cnBvc2VzKVxuICAgIHZhciBhbGxvd3NJbmxpbmVDb250aW51YXRpb24gPSAoXG4gICAgICAgICFwcmV2TGluZUxpbmVJc0VtcHR5ICYmICFwcmV2TGluZUlzSHIgJiYgIXN0YXRlLnByZXZMaW5lLmhlYWRlciAmJlxuICAgICAgICAoIXByZXZMaW5lSXNMaXN0IHx8ICFwcmV2TGluZUlzSW5kZW50ZWRDb2RlKSAmJlxuICAgICAgICAhc3RhdGUucHJldkxpbmUuZmVuY2VkQ29kZUVuZFxuICAgICk7XG5cbiAgICB2YXIgaXNIciA9IChzdGF0ZS5saXN0ID09PSBmYWxzZSB8fCBwcmV2TGluZUlzSHIgfHwgcHJldkxpbmVMaW5lSXNFbXB0eSkgJiZcbiAgICAgIHN0YXRlLmluZGVudGF0aW9uIDw9IG1heE5vbkNvZGVJbmRlbnRhdGlvbiAmJiBzdHJlYW0ubWF0Y2goaHJSRSk7XG5cbiAgICB2YXIgbWF0Y2ggPSBudWxsO1xuICAgIGlmIChzdGF0ZS5pbmRlbnRhdGlvbkRpZmYgPj0gNCAmJiAocHJldkxpbmVJc0luZGVudGVkQ29kZSB8fCBzdGF0ZS5wcmV2TGluZS5mZW5jZWRDb2RlRW5kIHx8XG4gICAgICAgICBzdGF0ZS5wcmV2TGluZS5oZWFkZXIgfHwgcHJldkxpbmVMaW5lSXNFbXB0eSkpIHtcbiAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTtcbiAgICAgIHN0YXRlLmluZGVudGVkQ29kZSA9IHRydWU7XG4gICAgICByZXR1cm4gdG9rZW5UeXBlcy5jb2RlO1xuICAgIH0gZWxzZSBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSBpZiAoZmlyc3RUb2tlbk9uTGluZSAmJiBzdGF0ZS5pbmRlbnRhdGlvbiA8PSBtYXhOb25Db2RlSW5kZW50YXRpb24gJiYgKG1hdGNoID0gc3RyZWFtLm1hdGNoKGF0eEhlYWRlclJFKSkgJiYgbWF0Y2hbMV0ubGVuZ3RoIDw9IDYpIHtcbiAgICAgIHN0YXRlLnF1b3RlID0gMDtcbiAgICAgIHN0YXRlLmhlYWRlciA9IG1hdGNoWzFdLmxlbmd0aDtcbiAgICAgIHN0YXRlLnRoaXNMaW5lLmhlYWRlciA9IHRydWU7XG4gICAgICBpZiAobW9kZUNmZy5oaWdobGlnaHRGb3JtYXR0aW5nKSBzdGF0ZS5mb3JtYXR0aW5nID0gXCJoZWFkZXJcIjtcbiAgICAgIHN0YXRlLmYgPSBzdGF0ZS5pbmxpbmU7XG4gICAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSk7XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5pbmRlbnRhdGlvbiA8PSBtYXhOb25Db2RlSW5kZW50YXRpb24gJiYgc3RyZWFtLmVhdCgnPicpKSB7XG4gICAgICBzdGF0ZS5xdW90ZSA9IGZpcnN0VG9rZW5PbkxpbmUgPyAxIDogc3RhdGUucXVvdGUgKyAxO1xuICAgICAgaWYgKG1vZGVDZmcuaGlnaGxpZ2h0Rm9ybWF0dGluZykgc3RhdGUuZm9ybWF0dGluZyA9IFwicXVvdGVcIjtcbiAgICAgIHN0cmVhbS5lYXRTcGFjZSgpO1xuICAgICAgcmV0dXJuIGdldFR5cGUoc3RhdGUpO1xuICAgIH0gZWxzZSBpZiAoIWlzSHIgJiYgIXN0YXRlLnNldGV4dCAmJiBmaXJzdFRva2VuT25MaW5lICYmIHN0YXRlLmluZGVudGF0aW9uIDw9IG1heE5vbkNvZGVJbmRlbnRhdGlvbiAmJiAobWF0Y2ggPSBzdHJlYW0ubWF0Y2gobGlzdFJFKSkpIHtcbiAgICAgIHZhciBsaXN0VHlwZSA9IG1hdGNoWzFdID8gXCJvbFwiIDogXCJ1bFwiO1xuXG4gICAgICBzdGF0ZS5pbmRlbnRhdGlvbiA9IGxpbmVJbmRlbnRhdGlvbiArIHN0cmVhbS5jdXJyZW50KCkubGVuZ3RoO1xuICAgICAgc3RhdGUubGlzdCA9IHRydWU7XG4gICAgICBzdGF0ZS5xdW90ZSA9IDA7XG5cbiAgICAgIC8vIEFkZCB0aGlzIGxpc3QgaXRlbSdzIGNvbnRlbnQncyBpbmRlbnRhdGlvbiB0byB0aGUgc3RhY2tcbiAgICAgIHN0YXRlLmxpc3RTdGFjay5wdXNoKHN0YXRlLmluZGVudGF0aW9uKTtcbiAgICAgIC8vIFJlc2V0IGlubGluZSBzdHlsZXMgd2hpY2ggc2hvdWxkbid0IHByb3BhZ2F0ZSBhY3Jvc3MgbGlzdCBpdGVtc1xuICAgICAgc3RhdGUuZW0gPSBmYWxzZTtcbiAgICAgIHN0YXRlLnN0cm9uZyA9IGZhbHNlO1xuICAgICAgc3RhdGUuY29kZSA9IGZhbHNlO1xuICAgICAgc3RhdGUuc3RyaWtldGhyb3VnaCA9IGZhbHNlO1xuXG4gICAgICBpZiAobW9kZUNmZy50YXNrTGlzdHMgJiYgc3RyZWFtLm1hdGNoKHRhc2tMaXN0UkUsIGZhbHNlKSkge1xuICAgICAgICBzdGF0ZS50YXNrTGlzdCA9IHRydWU7XG4gICAgICB9XG4gICAgICBzdGF0ZS5mID0gc3RhdGUuaW5saW5lO1xuICAgICAgaWYgKG1vZGVDZmcuaGlnaGxpZ2h0Rm9ybWF0dGluZykgc3RhdGUuZm9ybWF0dGluZyA9IFtcImxpc3RcIiwgXCJsaXN0LVwiICsgbGlzdFR5cGVdO1xuICAgICAgcmV0dXJuIGdldFR5cGUoc3RhdGUpO1xuICAgIH0gZWxzZSBpZiAoZmlyc3RUb2tlbk9uTGluZSAmJiBzdGF0ZS5pbmRlbnRhdGlvbiA8PSBtYXhOb25Db2RlSW5kZW50YXRpb24gJiYgKG1hdGNoID0gc3RyZWFtLm1hdGNoKGZlbmNlZENvZGVSRSwgdHJ1ZSkpKSB7XG4gICAgICBzdGF0ZS5xdW90ZSA9IDA7XG4gICAgICBzdGF0ZS5mZW5jZWRFbmRSRSA9IG5ldyBSZWdFeHAobWF0Y2hbMV0gKyBcIisgKiRcIik7XG4gICAgICAvLyB0cnkgc3dpdGNoaW5nIG1vZGVcbiAgICAgIHN0YXRlLmxvY2FsTW9kZSA9IG1vZGVDZmcuZmVuY2VkQ29kZUJsb2NrSGlnaGxpZ2h0aW5nICYmIGdldE1vZGUobWF0Y2hbMl0gfHwgbW9kZUNmZy5mZW5jZWRDb2RlQmxvY2tEZWZhdWx0TW9kZSApO1xuICAgICAgaWYgKHN0YXRlLmxvY2FsTW9kZSkgc3RhdGUubG9jYWxTdGF0ZSA9IENvZGVNaXJyb3Iuc3RhcnRTdGF0ZShzdGF0ZS5sb2NhbE1vZGUpO1xuICAgICAgc3RhdGUuZiA9IHN0YXRlLmJsb2NrID0gbG9jYWw7XG4gICAgICBpZiAobW9kZUNmZy5oaWdobGlnaHRGb3JtYXR0aW5nKSBzdGF0ZS5mb3JtYXR0aW5nID0gXCJjb2RlLWJsb2NrXCI7XG4gICAgICBzdGF0ZS5jb2RlID0gLTFcbiAgICAgIHJldHVybiBnZXRUeXBlKHN0YXRlKTtcbiAgICAvLyBTRVRFWFQgaGFzIGxvd2VzdCBibG9jay1zY29wZSBwcmVjZWRlbmNlIGFmdGVyIEhSLCBzbyBjaGVjayBpdCBhZnRlclxuICAgIC8vICB0aGUgb3RoZXJzIChjb2RlLCBibG9ja3F1b3RlLCBsaXN0Li4uKVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICAvLyBpZiBzZXRleHQgc2V0LCBpbmRpY2F0ZXMgbGluZSBhZnRlciAtLS0vPT09XG4gICAgICBzdGF0ZS5zZXRleHQgfHwgKFxuICAgICAgICAvLyBsaW5lIGJlZm9yZSAtLS0vPT09XG4gICAgICAgICghYWxsb3dzSW5saW5lQ29udGludWF0aW9uIHx8ICFwcmV2TGluZUlzTGlzdCkgJiYgIXN0YXRlLnF1b3RlICYmIHN0YXRlLmxpc3QgPT09IGZhbHNlICYmXG4gICAgICAgICFzdGF0ZS5jb2RlICYmICFpc0hyICYmICFsaW5rRGVmUkUudGVzdChzdHJlYW0uc3RyaW5nKSAmJlxuICAgICAgICAobWF0Y2ggPSBzdHJlYW0ubG9va0FoZWFkKDEpKSAmJiAobWF0Y2ggPSBtYXRjaC5tYXRjaChzZXRleHRIZWFkZXJSRSkpXG4gICAgICApXG4gICAgKSB7XG4gICAgICBpZiAoICFzdGF0ZS5zZXRleHQgKSB7XG4gICAgICAgIHN0YXRlLmhlYWRlciA9IG1hdGNoWzBdLmNoYXJBdCgwKSA9PSAnPScgPyAxIDogMjtcbiAgICAgICAgc3RhdGUuc2V0ZXh0ID0gc3RhdGUuaGVhZGVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUuaGVhZGVyID0gc3RhdGUuc2V0ZXh0O1xuICAgICAgICAvLyBoYXMgbm8gZWZmZWN0IG9uIHR5cGUgc28gd2UgY2FuIHJlc2V0IGl0IG5vd1xuICAgICAgICBzdGF0ZS5zZXRleHQgPSAwO1xuICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7XG4gICAgICAgIGlmIChtb2RlQ2ZnLmhpZ2hsaWdodEZvcm1hdHRpbmcpIHN0YXRlLmZvcm1hdHRpbmcgPSBcImhlYWRlclwiO1xuICAgICAgfVxuICAgICAgc3RhdGUudGhpc0xpbmUuaGVhZGVyID0gdHJ1ZTtcbiAgICAgIHN0YXRlLmYgPSBzdGF0ZS5pbmxpbmU7XG4gICAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSk7XG4gICAgfSBlbHNlIGlmIChpc0hyKSB7XG4gICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7XG4gICAgICBzdGF0ZS5ociA9IHRydWU7XG4gICAgICBzdGF0ZS50aGlzTGluZS5ociA9IHRydWU7XG4gICAgICByZXR1cm4gdG9rZW5UeXBlcy5ocjtcbiAgICB9IGVsc2UgaWYgKHN0cmVhbS5wZWVrKCkgPT09ICdbJykge1xuICAgICAgcmV0dXJuIHN3aXRjaElubGluZShzdHJlYW0sIHN0YXRlLCBmb290bm90ZUxpbmspO1xuICAgIH1cblxuICAgIHJldHVybiBzd2l0Y2hJbmxpbmUoc3RyZWFtLCBzdGF0ZSwgc3RhdGUuaW5saW5lKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGh0bWxCbG9jayhzdHJlYW0sIHN0YXRlKSB7XG4gICAgdmFyIHN0eWxlID0gaHRtbE1vZGUudG9rZW4oc3RyZWFtLCBzdGF0ZS5odG1sU3RhdGUpO1xuICAgIGlmICghaHRtbE1vZGVNaXNzaW5nKSB7XG4gICAgICB2YXIgaW5uZXIgPSBDb2RlTWlycm9yLmlubmVyTW9kZShodG1sTW9kZSwgc3RhdGUuaHRtbFN0YXRlKVxuICAgICAgaWYgKChpbm5lci5tb2RlLm5hbWUgPT0gXCJ4bWxcIiAmJiBpbm5lci5zdGF0ZS50YWdTdGFydCA9PT0gbnVsbCAmJlxuICAgICAgICAgICAoIWlubmVyLnN0YXRlLmNvbnRleHQgJiYgaW5uZXIuc3RhdGUudG9rZW5pemUuaXNJblRleHQpKSB8fFxuICAgICAgICAgIChzdGF0ZS5tZF9pbnNpZGUgJiYgc3RyZWFtLmN1cnJlbnQoKS5pbmRleE9mKFwiPlwiKSA+IC0xKSkge1xuICAgICAgICBzdGF0ZS5mID0gaW5saW5lTm9ybWFsO1xuICAgICAgICBzdGF0ZS5ibG9jayA9IGJsb2NrTm9ybWFsO1xuICAgICAgICBzdGF0ZS5odG1sU3RhdGUgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3R5bGU7XG4gIH1cblxuICBmdW5jdGlvbiBsb2NhbChzdHJlYW0sIHN0YXRlKSB7XG4gICAgdmFyIGN1cnJMaXN0SW5kID0gc3RhdGUubGlzdFN0YWNrW3N0YXRlLmxpc3RTdGFjay5sZW5ndGggLSAxXSB8fCAwO1xuICAgIHZhciBoYXNFeGl0ZWRMaXN0ID0gc3RhdGUuaW5kZW50YXRpb24gPCBjdXJyTGlzdEluZDtcbiAgICB2YXIgbWF4RmVuY2VkRW5kSW5kID0gY3Vyckxpc3RJbmQgKyAzO1xuICAgIGlmIChzdGF0ZS5mZW5jZWRFbmRSRSAmJiBzdGF0ZS5pbmRlbnRhdGlvbiA8PSBtYXhGZW5jZWRFbmRJbmQgJiYgKGhhc0V4aXRlZExpc3QgfHwgc3RyZWFtLm1hdGNoKHN0YXRlLmZlbmNlZEVuZFJFKSkpIHtcbiAgICAgIGlmIChtb2RlQ2ZnLmhpZ2hsaWdodEZvcm1hdHRpbmcpIHN0YXRlLmZvcm1hdHRpbmcgPSBcImNvZGUtYmxvY2tcIjtcbiAgICAgIHZhciByZXR1cm5UeXBlO1xuICAgICAgaWYgKCFoYXNFeGl0ZWRMaXN0KSByZXR1cm5UeXBlID0gZ2V0VHlwZShzdGF0ZSlcbiAgICAgIHN0YXRlLmxvY2FsTW9kZSA9IHN0YXRlLmxvY2FsU3RhdGUgPSBudWxsO1xuICAgICAgc3RhdGUuYmxvY2sgPSBibG9ja05vcm1hbDtcbiAgICAgIHN0YXRlLmYgPSBpbmxpbmVOb3JtYWw7XG4gICAgICBzdGF0ZS5mZW5jZWRFbmRSRSA9IG51bGw7XG4gICAgICBzdGF0ZS5jb2RlID0gMFxuICAgICAgc3RhdGUudGhpc0xpbmUuZmVuY2VkQ29kZUVuZCA9IHRydWU7XG4gICAgICBpZiAoaGFzRXhpdGVkTGlzdCkgcmV0dXJuIHN3aXRjaEJsb2NrKHN0cmVhbSwgc3RhdGUsIHN0YXRlLmJsb2NrKTtcbiAgICAgIHJldHVybiByZXR1cm5UeXBlO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUubG9jYWxNb2RlKSB7XG4gICAgICByZXR1cm4gc3RhdGUubG9jYWxNb2RlLnRva2VuKHN0cmVhbSwgc3RhdGUubG9jYWxTdGF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTtcbiAgICAgIHJldHVybiB0b2tlblR5cGVzLmNvZGU7XG4gICAgfVxuICB9XG5cbiAgLy8gSW5saW5lXG4gIGZ1bmN0aW9uIGdldFR5cGUoc3RhdGUpIHtcbiAgICB2YXIgc3R5bGVzID0gW107XG5cbiAgICBpZiAoc3RhdGUuZm9ybWF0dGluZykge1xuICAgICAgc3R5bGVzLnB1c2godG9rZW5UeXBlcy5mb3JtYXR0aW5nKTtcblxuICAgICAgaWYgKHR5cGVvZiBzdGF0ZS5mb3JtYXR0aW5nID09PSBcInN0cmluZ1wiKSBzdGF0ZS5mb3JtYXR0aW5nID0gW3N0YXRlLmZvcm1hdHRpbmddO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0YXRlLmZvcm1hdHRpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgc3R5bGVzLnB1c2godG9rZW5UeXBlcy5mb3JtYXR0aW5nICsgXCItXCIgKyBzdGF0ZS5mb3JtYXR0aW5nW2ldKTtcblxuICAgICAgICBpZiAoc3RhdGUuZm9ybWF0dGluZ1tpXSA9PT0gXCJoZWFkZXJcIikge1xuICAgICAgICAgIHN0eWxlcy5wdXNoKHRva2VuVHlwZXMuZm9ybWF0dGluZyArIFwiLVwiICsgc3RhdGUuZm9ybWF0dGluZ1tpXSArIFwiLVwiICsgc3RhdGUuaGVhZGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCBgZm9ybWF0dGluZy1xdW90ZWAgYW5kIGBmb3JtYXR0aW5nLXF1b3RlLSNgIGZvciBibG9ja3F1b3Rlc1xuICAgICAgICAvLyBBZGQgYGVycm9yYCBpbnN0ZWFkIGlmIHRoZSBtYXhpbXVtIGJsb2NrcXVvdGUgbmVzdGluZyBkZXB0aCBpcyBwYXNzZWRcbiAgICAgICAgaWYgKHN0YXRlLmZvcm1hdHRpbmdbaV0gPT09IFwicXVvdGVcIikge1xuICAgICAgICAgIGlmICghbW9kZUNmZy5tYXhCbG9ja3F1b3RlRGVwdGggfHwgbW9kZUNmZy5tYXhCbG9ja3F1b3RlRGVwdGggPj0gc3RhdGUucXVvdGUpIHtcbiAgICAgICAgICAgIHN0eWxlcy5wdXNoKHRva2VuVHlwZXMuZm9ybWF0dGluZyArIFwiLVwiICsgc3RhdGUuZm9ybWF0dGluZ1tpXSArIFwiLVwiICsgc3RhdGUucXVvdGUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdHlsZXMucHVzaChcImVycm9yXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdGF0ZS50YXNrT3Blbikge1xuICAgICAgc3R5bGVzLnB1c2goXCJtZXRhXCIpO1xuICAgICAgcmV0dXJuIHN0eWxlcy5sZW5ndGggPyBzdHlsZXMuam9pbignICcpIDogbnVsbDtcbiAgICB9XG4gICAgaWYgKHN0YXRlLnRhc2tDbG9zZWQpIHtcbiAgICAgIHN0eWxlcy5wdXNoKFwicHJvcGVydHlcIik7XG4gICAgICByZXR1cm4gc3R5bGVzLmxlbmd0aCA/IHN0eWxlcy5qb2luKCcgJykgOiBudWxsO1xuICAgIH1cblxuICAgIGlmIChzdGF0ZS5saW5rSHJlZikge1xuICAgICAgc3R5bGVzLnB1c2godG9rZW5UeXBlcy5saW5rSHJlZiwgXCJ1cmxcIik7XG4gICAgfSBlbHNlIHsgLy8gT25seSBhcHBseSBpbmxpbmUgc3R5bGVzIHRvIG5vbi11cmwgdGV4dFxuICAgICAgaWYgKHN0YXRlLnN0cm9uZykgeyBzdHlsZXMucHVzaCh0b2tlblR5cGVzLnN0cm9uZyk7IH1cbiAgICAgIGlmIChzdGF0ZS5lbSkgeyBzdHlsZXMucHVzaCh0b2tlblR5cGVzLmVtKTsgfVxuICAgICAgaWYgKHN0YXRlLnN0cmlrZXRocm91Z2gpIHsgc3R5bGVzLnB1c2godG9rZW5UeXBlcy5zdHJpa2V0aHJvdWdoKTsgfVxuICAgICAgaWYgKHN0YXRlLmVtb2ppKSB7IHN0eWxlcy5wdXNoKHRva2VuVHlwZXMuZW1vamkpOyB9XG4gICAgICBpZiAoc3RhdGUubGlua1RleHQpIHsgc3R5bGVzLnB1c2godG9rZW5UeXBlcy5saW5rVGV4dCk7IH1cbiAgICAgIGlmIChzdGF0ZS5jb2RlKSB7IHN0eWxlcy5wdXNoKHRva2VuVHlwZXMuY29kZSk7IH1cbiAgICAgIGlmIChzdGF0ZS5pbWFnZSkgeyBzdHlsZXMucHVzaCh0b2tlblR5cGVzLmltYWdlKTsgfVxuICAgICAgaWYgKHN0YXRlLmltYWdlQWx0VGV4dCkgeyBzdHlsZXMucHVzaCh0b2tlblR5cGVzLmltYWdlQWx0VGV4dCwgXCJsaW5rXCIpOyB9XG4gICAgICBpZiAoc3RhdGUuaW1hZ2VNYXJrZXIpIHsgc3R5bGVzLnB1c2godG9rZW5UeXBlcy5pbWFnZU1hcmtlcik7IH1cbiAgICB9XG5cbiAgICBpZiAoc3RhdGUuaGVhZGVyKSB7IHN0eWxlcy5wdXNoKHRva2VuVHlwZXMuaGVhZGVyLCB0b2tlblR5cGVzLmhlYWRlciArIFwiLVwiICsgc3RhdGUuaGVhZGVyKTsgfVxuXG4gICAgaWYgKHN0YXRlLnF1b3RlKSB7XG4gICAgICBzdHlsZXMucHVzaCh0b2tlblR5cGVzLnF1b3RlKTtcblxuICAgICAgLy8gQWRkIGBxdW90ZS0jYCB3aGVyZSB0aGUgbWF4aW11bSBmb3IgYCNgIGlzIG1vZGVDZmcubWF4QmxvY2txdW90ZURlcHRoXG4gICAgICBpZiAoIW1vZGVDZmcubWF4QmxvY2txdW90ZURlcHRoIHx8IG1vZGVDZmcubWF4QmxvY2txdW90ZURlcHRoID49IHN0YXRlLnF1b3RlKSB7XG4gICAgICAgIHN0eWxlcy5wdXNoKHRva2VuVHlwZXMucXVvdGUgKyBcIi1cIiArIHN0YXRlLnF1b3RlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0eWxlcy5wdXNoKHRva2VuVHlwZXMucXVvdGUgKyBcIi1cIiArIG1vZGVDZmcubWF4QmxvY2txdW90ZURlcHRoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3RhdGUubGlzdCAhPT0gZmFsc2UpIHtcbiAgICAgIHZhciBsaXN0TW9kID0gKHN0YXRlLmxpc3RTdGFjay5sZW5ndGggLSAxKSAlIDM7XG4gICAgICBpZiAoIWxpc3RNb2QpIHtcbiAgICAgICAgc3R5bGVzLnB1c2godG9rZW5UeXBlcy5saXN0MSk7XG4gICAgICB9IGVsc2UgaWYgKGxpc3RNb2QgPT09IDEpIHtcbiAgICAgICAgc3R5bGVzLnB1c2godG9rZW5UeXBlcy5saXN0Mik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdHlsZXMucHVzaCh0b2tlblR5cGVzLmxpc3QzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3RhdGUudHJhaWxpbmdTcGFjZU5ld0xpbmUpIHtcbiAgICAgIHN0eWxlcy5wdXNoKFwidHJhaWxpbmctc3BhY2UtbmV3LWxpbmVcIik7XG4gICAgfSBlbHNlIGlmIChzdGF0ZS50cmFpbGluZ1NwYWNlKSB7XG4gICAgICBzdHlsZXMucHVzaChcInRyYWlsaW5nLXNwYWNlLVwiICsgKHN0YXRlLnRyYWlsaW5nU3BhY2UgJSAyID8gXCJhXCIgOiBcImJcIikpO1xuICAgIH1cblxuICAgIHJldHVybiBzdHlsZXMubGVuZ3RoID8gc3R5bGVzLmpvaW4oJyAnKSA6IG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVUZXh0KHN0cmVhbSwgc3RhdGUpIHtcbiAgICBpZiAoc3RyZWFtLm1hdGNoKHRleHRSRSwgdHJ1ZSkpIHtcbiAgICAgIHJldHVybiBnZXRUeXBlKHN0YXRlKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlubGluZU5vcm1hbChzdHJlYW0sIHN0YXRlKSB7XG4gICAgdmFyIHN0eWxlID0gc3RhdGUudGV4dChzdHJlYW0sIHN0YXRlKTtcbiAgICBpZiAodHlwZW9mIHN0eWxlICE9PSAndW5kZWZpbmVkJylcbiAgICAgIHJldHVybiBzdHlsZTtcblxuICAgIGlmIChzdGF0ZS5saXN0KSB7IC8vIExpc3QgbWFya2VyICgqLCArLCAtLCAxLiwgZXRjKVxuICAgICAgc3RhdGUubGlzdCA9IG51bGw7XG4gICAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLnRhc2tMaXN0KSB7XG4gICAgICB2YXIgdGFza09wZW4gPSBzdHJlYW0ubWF0Y2godGFza0xpc3RSRSwgdHJ1ZSlbMV0gPT09IFwiIFwiO1xuICAgICAgaWYgKHRhc2tPcGVuKSBzdGF0ZS50YXNrT3BlbiA9IHRydWU7XG4gICAgICBlbHNlIHN0YXRlLnRhc2tDbG9zZWQgPSB0cnVlO1xuICAgICAgaWYgKG1vZGVDZmcuaGlnaGxpZ2h0Rm9ybWF0dGluZykgc3RhdGUuZm9ybWF0dGluZyA9IFwidGFza1wiO1xuICAgICAgc3RhdGUudGFza0xpc3QgPSBmYWxzZTtcbiAgICAgIHJldHVybiBnZXRUeXBlKHN0YXRlKTtcbiAgICB9XG5cbiAgICBzdGF0ZS50YXNrT3BlbiA9IGZhbHNlO1xuICAgIHN0YXRlLnRhc2tDbG9zZWQgPSBmYWxzZTtcblxuICAgIGlmIChzdGF0ZS5oZWFkZXIgJiYgc3RyZWFtLm1hdGNoKC9eIyskLywgdHJ1ZSkpIHtcbiAgICAgIGlmIChtb2RlQ2ZnLmhpZ2hsaWdodEZvcm1hdHRpbmcpIHN0YXRlLmZvcm1hdHRpbmcgPSBcImhlYWRlclwiO1xuICAgICAgcmV0dXJuIGdldFR5cGUoc3RhdGUpO1xuICAgIH1cblxuICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCk7XG5cbiAgICAvLyBNYXRjaGVzIGxpbmsgdGl0bGVzIHByZXNlbnQgb24gbmV4dCBsaW5lXG4gICAgaWYgKHN0YXRlLmxpbmtUaXRsZSkge1xuICAgICAgc3RhdGUubGlua1RpdGxlID0gZmFsc2U7XG4gICAgICB2YXIgbWF0Y2hDaCA9IGNoO1xuICAgICAgaWYgKGNoID09PSAnKCcpIHtcbiAgICAgICAgbWF0Y2hDaCA9ICcpJztcbiAgICAgIH1cbiAgICAgIG1hdGNoQ2ggPSAobWF0Y2hDaCsnJykucmVwbGFjZSgvKFsuPyorXlxcW1xcXVxcXFwoKXt9fC1dKS9nLCBcIlxcXFwkMVwiKTtcbiAgICAgIHZhciByZWdleCA9ICdeXFxcXHMqKD86W14nICsgbWF0Y2hDaCArICdcXFxcXFxcXF0rfFxcXFxcXFxcXFxcXFxcXFx8XFxcXFxcXFwuKScgKyBtYXRjaENoO1xuICAgICAgaWYgKHN0cmVhbS5tYXRjaChuZXcgUmVnRXhwKHJlZ2V4KSwgdHJ1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHRva2VuVHlwZXMubGlua0hyZWY7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgdGhpcyBibG9jayBpcyBjaGFuZ2VkLCBpdCBtYXkgbmVlZCB0byBiZSB1cGRhdGVkIGluIEdGTSBtb2RlXG4gICAgaWYgKGNoID09PSAnYCcpIHtcbiAgICAgIHZhciBwcmV2aW91c0Zvcm1hdHRpbmcgPSBzdGF0ZS5mb3JtYXR0aW5nO1xuICAgICAgaWYgKG1vZGVDZmcuaGlnaGxpZ2h0Rm9ybWF0dGluZykgc3RhdGUuZm9ybWF0dGluZyA9IFwiY29kZVwiO1xuICAgICAgc3RyZWFtLmVhdFdoaWxlKCdgJyk7XG4gICAgICB2YXIgY291bnQgPSBzdHJlYW0uY3VycmVudCgpLmxlbmd0aFxuICAgICAgaWYgKHN0YXRlLmNvZGUgPT0gMCAmJiAoIXN0YXRlLnF1b3RlIHx8IGNvdW50ID09IDEpKSB7XG4gICAgICAgIHN0YXRlLmNvZGUgPSBjb3VudFxuICAgICAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSlcbiAgICAgIH0gZWxzZSBpZiAoY291bnQgPT0gc3RhdGUuY29kZSkgeyAvLyBNdXN0IGJlIGV4YWN0XG4gICAgICAgIHZhciB0ID0gZ2V0VHlwZShzdGF0ZSlcbiAgICAgICAgc3RhdGUuY29kZSA9IDBcbiAgICAgICAgcmV0dXJuIHRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXRlLmZvcm1hdHRpbmcgPSBwcmV2aW91c0Zvcm1hdHRpbmdcbiAgICAgICAgcmV0dXJuIGdldFR5cGUoc3RhdGUpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5jb2RlKSB7XG4gICAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKGNoID09PSAnXFxcXCcpIHtcbiAgICAgIHN0cmVhbS5uZXh0KCk7XG4gICAgICBpZiAobW9kZUNmZy5oaWdobGlnaHRGb3JtYXR0aW5nKSB7XG4gICAgICAgIHZhciB0eXBlID0gZ2V0VHlwZShzdGF0ZSk7XG4gICAgICAgIHZhciBmb3JtYXR0aW5nRXNjYXBlID0gdG9rZW5UeXBlcy5mb3JtYXR0aW5nICsgXCItZXNjYXBlXCI7XG4gICAgICAgIHJldHVybiB0eXBlID8gdHlwZSArIFwiIFwiICsgZm9ybWF0dGluZ0VzY2FwZSA6IGZvcm1hdHRpbmdFc2NhcGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNoID09PSAnIScgJiYgc3RyZWFtLm1hdGNoKC9cXFtbXlxcXV0qXFxdID8oPzpcXCh8XFxbKS8sIGZhbHNlKSkge1xuICAgICAgc3RhdGUuaW1hZ2VNYXJrZXIgPSB0cnVlO1xuICAgICAgc3RhdGUuaW1hZ2UgPSB0cnVlO1xuICAgICAgaWYgKG1vZGVDZmcuaGlnaGxpZ2h0Rm9ybWF0dGluZykgc3RhdGUuZm9ybWF0dGluZyA9IFwiaW1hZ2VcIjtcbiAgICAgIHJldHVybiBnZXRUeXBlKHN0YXRlKTtcbiAgICB9XG5cbiAgICBpZiAoY2ggPT09ICdbJyAmJiBzdGF0ZS5pbWFnZU1hcmtlciAmJiBzdHJlYW0ubWF0Y2goL1teXFxdXSpcXF0oXFwoLio/XFwpfCA/XFxbLio/XFxdKS8sIGZhbHNlKSkge1xuICAgICAgc3RhdGUuaW1hZ2VNYXJrZXIgPSBmYWxzZTtcbiAgICAgIHN0YXRlLmltYWdlQWx0VGV4dCA9IHRydWVcbiAgICAgIGlmIChtb2RlQ2ZnLmhpZ2hsaWdodEZvcm1hdHRpbmcpIHN0YXRlLmZvcm1hdHRpbmcgPSBcImltYWdlXCI7XG4gICAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKGNoID09PSAnXScgJiYgc3RhdGUuaW1hZ2VBbHRUZXh0KSB7XG4gICAgICBpZiAobW9kZUNmZy5oaWdobGlnaHRGb3JtYXR0aW5nKSBzdGF0ZS5mb3JtYXR0aW5nID0gXCJpbWFnZVwiO1xuICAgICAgdmFyIHR5cGUgPSBnZXRUeXBlKHN0YXRlKTtcbiAgICAgIHN0YXRlLmltYWdlQWx0VGV4dCA9IGZhbHNlO1xuICAgICAgc3RhdGUuaW1hZ2UgPSBmYWxzZTtcbiAgICAgIHN0YXRlLmlubGluZSA9IHN0YXRlLmYgPSBsaW5rSHJlZjtcbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cblxuICAgIGlmIChjaCA9PT0gJ1snICYmICFzdGF0ZS5pbWFnZSkge1xuICAgICAgaWYgKHN0YXRlLmxpbmtUZXh0ICYmIHN0cmVhbS5tYXRjaCgvXi4qP1xcXS8pKSByZXR1cm4gZ2V0VHlwZShzdGF0ZSlcbiAgICAgIHN0YXRlLmxpbmtUZXh0ID0gdHJ1ZTtcbiAgICAgIGlmIChtb2RlQ2ZnLmhpZ2hsaWdodEZvcm1hdHRpbmcpIHN0YXRlLmZvcm1hdHRpbmcgPSBcImxpbmtcIjtcbiAgICAgIHJldHVybiBnZXRUeXBlKHN0YXRlKTtcbiAgICB9XG5cbiAgICBpZiAoY2ggPT09ICddJyAmJiBzdGF0ZS5saW5rVGV4dCkge1xuICAgICAgaWYgKG1vZGVDZmcuaGlnaGxpZ2h0Rm9ybWF0dGluZykgc3RhdGUuZm9ybWF0dGluZyA9IFwibGlua1wiO1xuICAgICAgdmFyIHR5cGUgPSBnZXRUeXBlKHN0YXRlKTtcbiAgICAgIHN0YXRlLmxpbmtUZXh0ID0gZmFsc2U7XG4gICAgICBzdGF0ZS5pbmxpbmUgPSBzdGF0ZS5mID0gc3RyZWFtLm1hdGNoKC9cXCguKj9cXCl8ID9cXFsuKj9cXF0vLCBmYWxzZSkgPyBsaW5rSHJlZiA6IGlubGluZU5vcm1hbFxuICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfVxuXG4gICAgaWYgKGNoID09PSAnPCcgJiYgc3RyZWFtLm1hdGNoKC9eKGh0dHBzP3xmdHBzPyk6XFwvXFwvKD86W15cXFxcPl18XFxcXC4pKz4vLCBmYWxzZSkpIHtcbiAgICAgIHN0YXRlLmYgPSBzdGF0ZS5pbmxpbmUgPSBsaW5rSW5saW5lO1xuICAgICAgaWYgKG1vZGVDZmcuaGlnaGxpZ2h0Rm9ybWF0dGluZykgc3RhdGUuZm9ybWF0dGluZyA9IFwibGlua1wiO1xuICAgICAgdmFyIHR5cGUgPSBnZXRUeXBlKHN0YXRlKTtcbiAgICAgIGlmICh0eXBlKXtcbiAgICAgICAgdHlwZSArPSBcIiBcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHR5cGUgPSBcIlwiO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHR5cGUgKyB0b2tlblR5cGVzLmxpbmtJbmxpbmU7XG4gICAgfVxuXG4gICAgaWYgKGNoID09PSAnPCcgJiYgc3RyZWFtLm1hdGNoKC9eW14+IFxcXFxdK0AoPzpbXlxcXFw+XXxcXFxcLikrPi8sIGZhbHNlKSkge1xuICAgICAgc3RhdGUuZiA9IHN0YXRlLmlubGluZSA9IGxpbmtJbmxpbmU7XG4gICAgICBpZiAobW9kZUNmZy5oaWdobGlnaHRGb3JtYXR0aW5nKSBzdGF0ZS5mb3JtYXR0aW5nID0gXCJsaW5rXCI7XG4gICAgICB2YXIgdHlwZSA9IGdldFR5cGUoc3RhdGUpO1xuICAgICAgaWYgKHR5cGUpe1xuICAgICAgICB0eXBlICs9IFwiIFwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHlwZSA9IFwiXCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHlwZSArIHRva2VuVHlwZXMubGlua0VtYWlsO1xuICAgIH1cblxuICAgIGlmIChtb2RlQ2ZnLnhtbCAmJiBjaCA9PT0gJzwnICYmIHN0cmVhbS5tYXRjaCgvXighLS18XFw/fCFcXFtDREFUQVxcW3xbYS16XVthLXowLTktXSooPzpcXHMrW2Etel86LlxcLV0rKD86XFxzKj1cXHMqW14+XSspPykqXFxzKig/Oj58JCkpL2ksIGZhbHNlKSkge1xuICAgICAgdmFyIGVuZCA9IHN0cmVhbS5zdHJpbmcuaW5kZXhPZihcIj5cIiwgc3RyZWFtLnBvcyk7XG4gICAgICBpZiAoZW5kICE9IC0xKSB7XG4gICAgICAgIHZhciBhdHRzID0gc3RyZWFtLnN0cmluZy5zdWJzdHJpbmcoc3RyZWFtLnN0YXJ0LCBlbmQpO1xuICAgICAgICBpZiAoL21hcmtkb3duXFxzKj1cXHMqKCd8XCIpezAsMX0xKCd8XCIpezAsMX0vLnRlc3QoYXR0cykpIHN0YXRlLm1kX2luc2lkZSA9IHRydWU7XG4gICAgICB9XG4gICAgICBzdHJlYW0uYmFja1VwKDEpO1xuICAgICAgc3RhdGUuaHRtbFN0YXRlID0gQ29kZU1pcnJvci5zdGFydFN0YXRlKGh0bWxNb2RlKTtcbiAgICAgIHJldHVybiBzd2l0Y2hCbG9jayhzdHJlYW0sIHN0YXRlLCBodG1sQmxvY2spO1xuICAgIH1cblxuICAgIGlmIChtb2RlQ2ZnLnhtbCAmJiBjaCA9PT0gJzwnICYmIHN0cmVhbS5tYXRjaCgvXlxcL1xcdyo/Pi8pKSB7XG4gICAgICBzdGF0ZS5tZF9pbnNpZGUgPSBmYWxzZTtcbiAgICAgIHJldHVybiBcInRhZ1wiO1xuICAgIH0gZWxzZSBpZiAoY2ggPT09IFwiKlwiIHx8IGNoID09PSBcIl9cIikge1xuICAgICAgdmFyIGxlbiA9IDEsIGJlZm9yZSA9IHN0cmVhbS5wb3MgPT0gMSA/IFwiIFwiIDogc3RyZWFtLnN0cmluZy5jaGFyQXQoc3RyZWFtLnBvcyAtIDIpXG4gICAgICB3aGlsZSAobGVuIDwgMyAmJiBzdHJlYW0uZWF0KGNoKSkgbGVuKytcbiAgICAgIHZhciBhZnRlciA9IHN0cmVhbS5wZWVrKCkgfHwgXCIgXCJcbiAgICAgIC8vIFNlZSBodHRwOi8vc3BlYy5jb21tb25tYXJrLm9yZy8wLjI3LyNlbXBoYXNpcy1hbmQtc3Ryb25nLWVtcGhhc2lzXG4gICAgICB2YXIgbGVmdEZsYW5raW5nID0gIS9cXHMvLnRlc3QoYWZ0ZXIpICYmICghcHVuY3R1YXRpb24udGVzdChhZnRlcikgfHwgL1xccy8udGVzdChiZWZvcmUpIHx8IHB1bmN0dWF0aW9uLnRlc3QoYmVmb3JlKSlcbiAgICAgIHZhciByaWdodEZsYW5raW5nID0gIS9cXHMvLnRlc3QoYmVmb3JlKSAmJiAoIXB1bmN0dWF0aW9uLnRlc3QoYmVmb3JlKSB8fCAvXFxzLy50ZXN0KGFmdGVyKSB8fCBwdW5jdHVhdGlvbi50ZXN0KGFmdGVyKSlcbiAgICAgIHZhciBzZXRFbSA9IG51bGwsIHNldFN0cm9uZyA9IG51bGxcbiAgICAgIGlmIChsZW4gJSAyKSB7IC8vIEVtXG4gICAgICAgIGlmICghc3RhdGUuZW0gJiYgbGVmdEZsYW5raW5nICYmIChjaCA9PT0gXCIqXCIgfHwgIXJpZ2h0RmxhbmtpbmcgfHwgcHVuY3R1YXRpb24udGVzdChiZWZvcmUpKSlcbiAgICAgICAgICBzZXRFbSA9IHRydWVcbiAgICAgICAgZWxzZSBpZiAoc3RhdGUuZW0gPT0gY2ggJiYgcmlnaHRGbGFua2luZyAmJiAoY2ggPT09IFwiKlwiIHx8ICFsZWZ0RmxhbmtpbmcgfHwgcHVuY3R1YXRpb24udGVzdChhZnRlcikpKVxuICAgICAgICAgIHNldEVtID0gZmFsc2VcbiAgICAgIH1cbiAgICAgIGlmIChsZW4gPiAxKSB7IC8vIFN0cm9uZ1xuICAgICAgICBpZiAoIXN0YXRlLnN0cm9uZyAmJiBsZWZ0RmxhbmtpbmcgJiYgKGNoID09PSBcIipcIiB8fCAhcmlnaHRGbGFua2luZyB8fCBwdW5jdHVhdGlvbi50ZXN0KGJlZm9yZSkpKVxuICAgICAgICAgIHNldFN0cm9uZyA9IHRydWVcbiAgICAgICAgZWxzZSBpZiAoc3RhdGUuc3Ryb25nID09IGNoICYmIHJpZ2h0RmxhbmtpbmcgJiYgKGNoID09PSBcIipcIiB8fCAhbGVmdEZsYW5raW5nIHx8IHB1bmN0dWF0aW9uLnRlc3QoYWZ0ZXIpKSlcbiAgICAgICAgICBzZXRTdHJvbmcgPSBmYWxzZVxuICAgICAgfVxuICAgICAgaWYgKHNldFN0cm9uZyAhPSBudWxsIHx8IHNldEVtICE9IG51bGwpIHtcbiAgICAgICAgaWYgKG1vZGVDZmcuaGlnaGxpZ2h0Rm9ybWF0dGluZykgc3RhdGUuZm9ybWF0dGluZyA9IHNldEVtID09IG51bGwgPyBcInN0cm9uZ1wiIDogc2V0U3Ryb25nID09IG51bGwgPyBcImVtXCIgOiBcInN0cm9uZyBlbVwiXG4gICAgICAgIGlmIChzZXRFbSA9PT0gdHJ1ZSkgc3RhdGUuZW0gPSBjaFxuICAgICAgICBpZiAoc2V0U3Ryb25nID09PSB0cnVlKSBzdGF0ZS5zdHJvbmcgPSBjaFxuICAgICAgICB2YXIgdCA9IGdldFR5cGUoc3RhdGUpXG4gICAgICAgIGlmIChzZXRFbSA9PT0gZmFsc2UpIHN0YXRlLmVtID0gZmFsc2VcbiAgICAgICAgaWYgKHNldFN0cm9uZyA9PT0gZmFsc2UpIHN0YXRlLnN0cm9uZyA9IGZhbHNlXG4gICAgICAgIHJldHVybiB0XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjaCA9PT0gJyAnKSB7XG4gICAgICBpZiAoc3RyZWFtLmVhdCgnKicpIHx8IHN0cmVhbS5lYXQoJ18nKSkgeyAvLyBQcm9iYWJseSBzdXJyb3VuZGVkIGJ5IHNwYWNlc1xuICAgICAgICBpZiAoc3RyZWFtLnBlZWsoKSA9PT0gJyAnKSB7IC8vIFN1cnJvdW5kZWQgYnkgc3BhY2VzLCBpZ25vcmVcbiAgICAgICAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSk7XG4gICAgICAgIH0gZWxzZSB7IC8vIE5vdCBzdXJyb3VuZGVkIGJ5IHNwYWNlcywgYmFjayB1cCBwb2ludGVyXG4gICAgICAgICAgc3RyZWFtLmJhY2tVcCgxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtb2RlQ2ZnLnN0cmlrZXRocm91Z2gpIHtcbiAgICAgIGlmIChjaCA9PT0gJ34nICYmIHN0cmVhbS5lYXRXaGlsZShjaCkpIHtcbiAgICAgICAgaWYgKHN0YXRlLnN0cmlrZXRocm91Z2gpIHsvLyBSZW1vdmUgc3RyaWtldGhyb3VnaFxuICAgICAgICAgIGlmIChtb2RlQ2ZnLmhpZ2hsaWdodEZvcm1hdHRpbmcpIHN0YXRlLmZvcm1hdHRpbmcgPSBcInN0cmlrZXRocm91Z2hcIjtcbiAgICAgICAgICB2YXIgdCA9IGdldFR5cGUoc3RhdGUpO1xuICAgICAgICAgIHN0YXRlLnN0cmlrZXRocm91Z2ggPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm4gdDtcbiAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0ubWF0Y2goL15bXlxcc10vLCBmYWxzZSkpIHsvLyBBZGQgc3RyaWtldGhyb3VnaFxuICAgICAgICAgIHN0YXRlLnN0cmlrZXRocm91Z2ggPSB0cnVlO1xuICAgICAgICAgIGlmIChtb2RlQ2ZnLmhpZ2hsaWdodEZvcm1hdHRpbmcpIHN0YXRlLmZvcm1hdHRpbmcgPSBcInN0cmlrZXRocm91Z2hcIjtcbiAgICAgICAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY2ggPT09ICcgJykge1xuICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKCd+ficsIHRydWUpKSB7IC8vIFByb2JhYmx5IHN1cnJvdW5kZWQgYnkgc3BhY2VcbiAgICAgICAgICBpZiAoc3RyZWFtLnBlZWsoKSA9PT0gJyAnKSB7IC8vIFN1cnJvdW5kZWQgYnkgc3BhY2VzLCBpZ25vcmVcbiAgICAgICAgICAgIHJldHVybiBnZXRUeXBlKHN0YXRlKTtcbiAgICAgICAgICB9IGVsc2UgeyAvLyBOb3Qgc3Vycm91bmRlZCBieSBzcGFjZXMsIGJhY2sgdXAgcG9pbnRlclxuICAgICAgICAgICAgc3RyZWFtLmJhY2tVcCgyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobW9kZUNmZy5lbW9qaSAmJiBjaCA9PT0gXCI6XCIgJiYgc3RyZWFtLm1hdGNoKC9eKD86W2Etel9cXGQrXVthLXpfXFxkKy1dKnxcXC1bYS16X1xcZCtdW2Etel9cXGQrLV0qKTovKSkge1xuICAgICAgc3RhdGUuZW1vamkgPSB0cnVlO1xuICAgICAgaWYgKG1vZGVDZmcuaGlnaGxpZ2h0Rm9ybWF0dGluZykgc3RhdGUuZm9ybWF0dGluZyA9IFwiZW1vamlcIjtcbiAgICAgIHZhciByZXRUeXBlID0gZ2V0VHlwZShzdGF0ZSk7XG4gICAgICBzdGF0ZS5lbW9qaSA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHJldFR5cGU7XG4gICAgfVxuXG4gICAgaWYgKGNoID09PSAnICcpIHtcbiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14gKyQvLCBmYWxzZSkpIHtcbiAgICAgICAgc3RhdGUudHJhaWxpbmdTcGFjZSsrO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS50cmFpbGluZ1NwYWNlKSB7XG4gICAgICAgIHN0YXRlLnRyYWlsaW5nU3BhY2VOZXdMaW5lID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBsaW5rSW5saW5lKHN0cmVhbSwgc3RhdGUpIHtcbiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpO1xuXG4gICAgaWYgKGNoID09PSBcIj5cIikge1xuICAgICAgc3RhdGUuZiA9IHN0YXRlLmlubGluZSA9IGlubGluZU5vcm1hbDtcbiAgICAgIGlmIChtb2RlQ2ZnLmhpZ2hsaWdodEZvcm1hdHRpbmcpIHN0YXRlLmZvcm1hdHRpbmcgPSBcImxpbmtcIjtcbiAgICAgIHZhciB0eXBlID0gZ2V0VHlwZShzdGF0ZSk7XG4gICAgICBpZiAodHlwZSl7XG4gICAgICAgIHR5cGUgKz0gXCIgXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0eXBlID0gXCJcIjtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0eXBlICsgdG9rZW5UeXBlcy5saW5rSW5saW5lO1xuICAgIH1cblxuICAgIHN0cmVhbS5tYXRjaCgvXltePl0rLywgdHJ1ZSk7XG5cbiAgICByZXR1cm4gdG9rZW5UeXBlcy5saW5rSW5saW5lO1xuICB9XG5cbiAgZnVuY3Rpb24gbGlua0hyZWYoc3RyZWFtLCBzdGF0ZSkge1xuICAgIC8vIENoZWNrIGlmIHNwYWNlLCBhbmQgcmV0dXJuIE5VTEwgaWYgc28gKHRvIGF2b2lkIG1hcmtpbmcgdGhlIHNwYWNlKVxuICAgIGlmKHN0cmVhbS5lYXRTcGFjZSgpKXtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpO1xuICAgIGlmIChjaCA9PT0gJygnIHx8IGNoID09PSAnWycpIHtcbiAgICAgIHN0YXRlLmYgPSBzdGF0ZS5pbmxpbmUgPSBnZXRMaW5rSHJlZkluc2lkZShjaCA9PT0gXCIoXCIgPyBcIilcIiA6IFwiXVwiKTtcbiAgICAgIGlmIChtb2RlQ2ZnLmhpZ2hsaWdodEZvcm1hdHRpbmcpIHN0YXRlLmZvcm1hdHRpbmcgPSBcImxpbmstc3RyaW5nXCI7XG4gICAgICBzdGF0ZS5saW5rSHJlZiA9IHRydWU7XG4gICAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSk7XG4gICAgfVxuICAgIHJldHVybiAnZXJyb3InO1xuICB9XG5cbiAgdmFyIGxpbmtSRSA9IHtcbiAgICBcIilcIjogL14oPzpbXlxcXFxcXChcXCldfFxcXFwufFxcKCg/OlteXFxcXFxcKFxcKV18XFxcXC4pKlxcKSkqPyg/PVxcKSkvLFxuICAgIFwiXVwiOiAvXig/OlteXFxcXFxcW1xcXV18XFxcXC58XFxbKD86W15cXFxcXFxbXFxdXXxcXFxcLikqXFxdKSo/KD89XFxdKS9cbiAgfVxuXG4gIGZ1bmN0aW9uIGdldExpbmtIcmVmSW5zaWRlKGVuZENoYXIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkge1xuICAgICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTtcblxuICAgICAgaWYgKGNoID09PSBlbmRDaGFyKSB7XG4gICAgICAgIHN0YXRlLmYgPSBzdGF0ZS5pbmxpbmUgPSBpbmxpbmVOb3JtYWw7XG4gICAgICAgIGlmIChtb2RlQ2ZnLmhpZ2hsaWdodEZvcm1hdHRpbmcpIHN0YXRlLmZvcm1hdHRpbmcgPSBcImxpbmstc3RyaW5nXCI7XG4gICAgICAgIHZhciByZXR1cm5TdGF0ZSA9IGdldFR5cGUoc3RhdGUpO1xuICAgICAgICBzdGF0ZS5saW5rSHJlZiA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gcmV0dXJuU3RhdGU7XG4gICAgICB9XG5cbiAgICAgIHN0cmVhbS5tYXRjaChsaW5rUkVbZW5kQ2hhcl0pXG4gICAgICBzdGF0ZS5saW5rSHJlZiA9IHRydWU7XG4gICAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSk7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvb3Rub3RlTGluayhzdHJlYW0sIHN0YXRlKSB7XG4gICAgaWYgKHN0cmVhbS5tYXRjaCgvXihbXlxcXVxcXFxdfFxcXFwuKSpcXF06LywgZmFsc2UpKSB7XG4gICAgICBzdGF0ZS5mID0gZm9vdG5vdGVMaW5rSW5zaWRlO1xuICAgICAgc3RyZWFtLm5leHQoKTsgLy8gQ29uc3VtZSBbXG4gICAgICBpZiAobW9kZUNmZy5oaWdobGlnaHRGb3JtYXR0aW5nKSBzdGF0ZS5mb3JtYXR0aW5nID0gXCJsaW5rXCI7XG4gICAgICBzdGF0ZS5saW5rVGV4dCA9IHRydWU7XG4gICAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSk7XG4gICAgfVxuICAgIHJldHVybiBzd2l0Y2hJbmxpbmUoc3RyZWFtLCBzdGF0ZSwgaW5saW5lTm9ybWFsKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvb3Rub3RlTGlua0luc2lkZShzdHJlYW0sIHN0YXRlKSB7XG4gICAgaWYgKHN0cmVhbS5tYXRjaCgnXTonLCB0cnVlKSkge1xuICAgICAgc3RhdGUuZiA9IHN0YXRlLmlubGluZSA9IGZvb3Rub3RlVXJsO1xuICAgICAgaWYgKG1vZGVDZmcuaGlnaGxpZ2h0Rm9ybWF0dGluZykgc3RhdGUuZm9ybWF0dGluZyA9IFwibGlua1wiO1xuICAgICAgdmFyIHJldHVyblR5cGUgPSBnZXRUeXBlKHN0YXRlKTtcbiAgICAgIHN0YXRlLmxpbmtUZXh0ID0gZmFsc2U7XG4gICAgICByZXR1cm4gcmV0dXJuVHlwZTtcbiAgICB9XG5cbiAgICBzdHJlYW0ubWF0Y2goL14oW15cXF1cXFxcXXxcXFxcLikrLywgdHJ1ZSk7XG5cbiAgICByZXR1cm4gdG9rZW5UeXBlcy5saW5rVGV4dDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvb3Rub3RlVXJsKHN0cmVhbSwgc3RhdGUpIHtcbiAgICAvLyBDaGVjayBpZiBzcGFjZSwgYW5kIHJldHVybiBOVUxMIGlmIHNvICh0byBhdm9pZCBtYXJraW5nIHRoZSBzcGFjZSlcbiAgICBpZihzdHJlYW0uZWF0U3BhY2UoKSl7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLy8gTWF0Y2ggVVJMXG4gICAgc3RyZWFtLm1hdGNoKC9eW15cXHNdKy8sIHRydWUpO1xuICAgIC8vIENoZWNrIGZvciBsaW5rIHRpdGxlXG4gICAgaWYgKHN0cmVhbS5wZWVrKCkgPT09IHVuZGVmaW5lZCkgeyAvLyBFbmQgb2YgbGluZSwgc2V0IGZsYWcgdG8gY2hlY2sgbmV4dCBsaW5lXG4gICAgICBzdGF0ZS5saW5rVGl0bGUgPSB0cnVlO1xuICAgIH0gZWxzZSB7IC8vIE1vcmUgY29udGVudCBvbiBsaW5lLCBjaGVjayBpZiBsaW5rIHRpdGxlXG4gICAgICBzdHJlYW0ubWF0Y2goL14oPzpcXHMrKD86XCIoPzpbXlwiXFxcXF18XFxcXC4pK1wifCcoPzpbXidcXFxcXXxcXFxcLikrJ3xcXCgoPzpbXilcXFxcXXxcXFxcLikrXFwpKSk/LywgdHJ1ZSk7XG4gICAgfVxuICAgIHN0YXRlLmYgPSBzdGF0ZS5pbmxpbmUgPSBpbmxpbmVOb3JtYWw7XG4gICAgcmV0dXJuIHRva2VuVHlwZXMubGlua0hyZWYgKyBcIiB1cmxcIjtcbiAgfVxuXG4gIHZhciBtb2RlID0ge1xuICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZjogYmxvY2tOb3JtYWwsXG5cbiAgICAgICAgcHJldkxpbmU6IHtzdHJlYW06IG51bGx9LFxuICAgICAgICB0aGlzTGluZToge3N0cmVhbTogbnVsbH0sXG5cbiAgICAgICAgYmxvY2s6IGJsb2NrTm9ybWFsLFxuICAgICAgICBodG1sU3RhdGU6IG51bGwsXG4gICAgICAgIGluZGVudGF0aW9uOiAwLFxuXG4gICAgICAgIGlubGluZTogaW5saW5lTm9ybWFsLFxuICAgICAgICB0ZXh0OiBoYW5kbGVUZXh0LFxuXG4gICAgICAgIGZvcm1hdHRpbmc6IGZhbHNlLFxuICAgICAgICBsaW5rVGV4dDogZmFsc2UsXG4gICAgICAgIGxpbmtIcmVmOiBmYWxzZSxcbiAgICAgICAgbGlua1RpdGxlOiBmYWxzZSxcbiAgICAgICAgY29kZTogMCxcbiAgICAgICAgZW06IGZhbHNlLFxuICAgICAgICBzdHJvbmc6IGZhbHNlLFxuICAgICAgICBoZWFkZXI6IDAsXG4gICAgICAgIHNldGV4dDogMCxcbiAgICAgICAgaHI6IGZhbHNlLFxuICAgICAgICB0YXNrTGlzdDogZmFsc2UsXG4gICAgICAgIGxpc3Q6IGZhbHNlLFxuICAgICAgICBsaXN0U3RhY2s6IFtdLFxuICAgICAgICBxdW90ZTogMCxcbiAgICAgICAgdHJhaWxpbmdTcGFjZTogMCxcbiAgICAgICAgdHJhaWxpbmdTcGFjZU5ld0xpbmU6IGZhbHNlLFxuICAgICAgICBzdHJpa2V0aHJvdWdoOiBmYWxzZSxcbiAgICAgICAgZW1vamk6IGZhbHNlLFxuICAgICAgICBmZW5jZWRFbmRSRTogbnVsbFxuICAgICAgfTtcbiAgICB9LFxuXG4gICAgY29weVN0YXRlOiBmdW5jdGlvbihzKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBmOiBzLmYsXG5cbiAgICAgICAgcHJldkxpbmU6IHMucHJldkxpbmUsXG4gICAgICAgIHRoaXNMaW5lOiBzLnRoaXNMaW5lLFxuXG4gICAgICAgIGJsb2NrOiBzLmJsb2NrLFxuICAgICAgICBodG1sU3RhdGU6IHMuaHRtbFN0YXRlICYmIENvZGVNaXJyb3IuY29weVN0YXRlKGh0bWxNb2RlLCBzLmh0bWxTdGF0ZSksXG4gICAgICAgIGluZGVudGF0aW9uOiBzLmluZGVudGF0aW9uLFxuXG4gICAgICAgIGxvY2FsTW9kZTogcy5sb2NhbE1vZGUsXG4gICAgICAgIGxvY2FsU3RhdGU6IHMubG9jYWxNb2RlID8gQ29kZU1pcnJvci5jb3B5U3RhdGUocy5sb2NhbE1vZGUsIHMubG9jYWxTdGF0ZSkgOiBudWxsLFxuXG4gICAgICAgIGlubGluZTogcy5pbmxpbmUsXG4gICAgICAgIHRleHQ6IHMudGV4dCxcbiAgICAgICAgZm9ybWF0dGluZzogZmFsc2UsXG4gICAgICAgIGxpbmtUZXh0OiBzLmxpbmtUZXh0LFxuICAgICAgICBsaW5rVGl0bGU6IHMubGlua1RpdGxlLFxuICAgICAgICBsaW5rSHJlZjogcy5saW5rSHJlZixcbiAgICAgICAgY29kZTogcy5jb2RlLFxuICAgICAgICBlbTogcy5lbSxcbiAgICAgICAgc3Ryb25nOiBzLnN0cm9uZyxcbiAgICAgICAgc3RyaWtldGhyb3VnaDogcy5zdHJpa2V0aHJvdWdoLFxuICAgICAgICBlbW9qaTogcy5lbW9qaSxcbiAgICAgICAgaGVhZGVyOiBzLmhlYWRlcixcbiAgICAgICAgc2V0ZXh0OiBzLnNldGV4dCxcbiAgICAgICAgaHI6IHMuaHIsXG4gICAgICAgIHRhc2tMaXN0OiBzLnRhc2tMaXN0LFxuICAgICAgICBsaXN0OiBzLmxpc3QsXG4gICAgICAgIGxpc3RTdGFjazogcy5saXN0U3RhY2suc2xpY2UoMCksXG4gICAgICAgIHF1b3RlOiBzLnF1b3RlLFxuICAgICAgICBpbmRlbnRlZENvZGU6IHMuaW5kZW50ZWRDb2RlLFxuICAgICAgICB0cmFpbGluZ1NwYWNlOiBzLnRyYWlsaW5nU3BhY2UsXG4gICAgICAgIHRyYWlsaW5nU3BhY2VOZXdMaW5lOiBzLnRyYWlsaW5nU3BhY2VOZXdMaW5lLFxuICAgICAgICBtZF9pbnNpZGU6IHMubWRfaW5zaWRlLFxuICAgICAgICBmZW5jZWRFbmRSRTogcy5mZW5jZWRFbmRSRVxuICAgICAgfTtcbiAgICB9LFxuXG4gICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHtcblxuICAgICAgLy8gUmVzZXQgc3RhdGUuZm9ybWF0dGluZ1xuICAgICAgc3RhdGUuZm9ybWF0dGluZyA9IGZhbHNlO1xuXG4gICAgICBpZiAoc3RyZWFtICE9IHN0YXRlLnRoaXNMaW5lLnN0cmVhbSkge1xuICAgICAgICBzdGF0ZS5oZWFkZXIgPSAwO1xuICAgICAgICBzdGF0ZS5ociA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15cXHMqJC8sIHRydWUpKSB7XG4gICAgICAgICAgYmxhbmtMaW5lKHN0YXRlKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlLnByZXZMaW5lID0gc3RhdGUudGhpc0xpbmVcbiAgICAgICAgc3RhdGUudGhpc0xpbmUgPSB7c3RyZWFtOiBzdHJlYW19XG5cbiAgICAgICAgLy8gUmVzZXQgc3RhdGUudGFza0xpc3RcbiAgICAgICAgc3RhdGUudGFza0xpc3QgPSBmYWxzZTtcblxuICAgICAgICAvLyBSZXNldCBzdGF0ZS50cmFpbGluZ1NwYWNlXG4gICAgICAgIHN0YXRlLnRyYWlsaW5nU3BhY2UgPSAwO1xuICAgICAgICBzdGF0ZS50cmFpbGluZ1NwYWNlTmV3TGluZSA9IGZhbHNlO1xuXG4gICAgICAgIGlmICghc3RhdGUubG9jYWxTdGF0ZSkge1xuICAgICAgICAgIHN0YXRlLmYgPSBzdGF0ZS5ibG9jaztcbiAgICAgICAgICBpZiAoc3RhdGUuZiAhPSBodG1sQmxvY2spIHtcbiAgICAgICAgICAgIHZhciBpbmRlbnRhdGlvbiA9IHN0cmVhbS5tYXRjaCgvXlxccyovLCB0cnVlKVswXS5yZXBsYWNlKC9cXHQvZywgZXhwYW5kZWRUYWIpLmxlbmd0aDtcbiAgICAgICAgICAgIHN0YXRlLmluZGVudGF0aW9uID0gaW5kZW50YXRpb247XG4gICAgICAgICAgICBzdGF0ZS5pbmRlbnRhdGlvbkRpZmYgPSBudWxsO1xuICAgICAgICAgICAgaWYgKGluZGVudGF0aW9uID4gMCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RhdGUuZihzdHJlYW0sIHN0YXRlKTtcbiAgICB9LFxuXG4gICAgaW5uZXJNb2RlOiBmdW5jdGlvbihzdGF0ZSkge1xuICAgICAgaWYgKHN0YXRlLmJsb2NrID09IGh0bWxCbG9jaykgcmV0dXJuIHtzdGF0ZTogc3RhdGUuaHRtbFN0YXRlLCBtb2RlOiBodG1sTW9kZX07XG4gICAgICBpZiAoc3RhdGUubG9jYWxTdGF0ZSkgcmV0dXJuIHtzdGF0ZTogc3RhdGUubG9jYWxTdGF0ZSwgbW9kZTogc3RhdGUubG9jYWxNb2RlfTtcbiAgICAgIHJldHVybiB7c3RhdGU6IHN0YXRlLCBtb2RlOiBtb2RlfTtcbiAgICB9LFxuXG4gICAgaW5kZW50OiBmdW5jdGlvbihzdGF0ZSwgdGV4dEFmdGVyLCBsaW5lKSB7XG4gICAgICBpZiAoc3RhdGUuYmxvY2sgPT0gaHRtbEJsb2NrICYmIGh0bWxNb2RlLmluZGVudCkgcmV0dXJuIGh0bWxNb2RlLmluZGVudChzdGF0ZS5odG1sU3RhdGUsIHRleHRBZnRlciwgbGluZSlcbiAgICAgIGlmIChzdGF0ZS5sb2NhbFN0YXRlICYmIHN0YXRlLmxvY2FsTW9kZS5pbmRlbnQpIHJldHVybiBzdGF0ZS5sb2NhbE1vZGUuaW5kZW50KHN0YXRlLmxvY2FsU3RhdGUsIHRleHRBZnRlciwgbGluZSlcbiAgICAgIHJldHVybiBDb2RlTWlycm9yLlBhc3NcbiAgICB9LFxuXG4gICAgYmxhbmtMaW5lOiBibGFua0xpbmUsXG5cbiAgICBnZXRUeXBlOiBnZXRUeXBlLFxuXG4gICAgYmxvY2tDb21tZW50U3RhcnQ6IFwiPCEtLVwiLFxuICAgIGJsb2NrQ29tbWVudEVuZDogXCItLT5cIixcbiAgICBjbG9zZUJyYWNrZXRzOiBcIigpW117fScnXFxcIlxcXCJgYFwiLFxuICAgIGZvbGQ6IFwibWFya2Rvd25cIlxuICB9O1xuICByZXR1cm4gbW9kZTtcbn0sIFwieG1sXCIpO1xuXG5Db2RlTWlycm9yLmRlZmluZU1JTUUoXCJ0ZXh0L21hcmtkb3duXCIsIFwibWFya2Rvd25cIik7XG5cbkNvZGVNaXJyb3IuZGVmaW5lTUlNRShcInRleHQveC1tYXJrZG93blwiLCBcIm1hcmtkb3duXCIpO1xuXG59KTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/codemirror/mode/markdown/markdown.js\n"); /***/ }), /***/ "./node_modules/codemirror/mode/meta.js": -/*!**********************************************!* +/*!**********************************************!*\ !*** ./node_modules/codemirror/mode/meta.js ***! \**********************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { -eval("// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n if (true) // CommonJS\n mod(__webpack_require__(/*! ../lib/codemirror */ \"./node_modules/codemirror/lib/codemirror.js\"));\n else {}\n})(function(CodeMirror) {\n \"use strict\";\n\n CodeMirror.modeInfo = [\n {name: \"APL\", mime: \"text/apl\", mode: \"apl\", ext: [\"dyalog\", \"apl\"]},\n {name: \"PGP\", mimes: [\"application/pgp\", \"application/pgp-encrypted\", \"application/pgp-keys\", \"application/pgp-signature\"], mode: \"asciiarmor\", ext: [\"asc\", \"pgp\", \"sig\"]},\n {name: \"ASN.1\", mime: \"text/x-ttcn-asn\", mode: \"asn.1\", ext: [\"asn\", \"asn1\"]},\n {name: \"Asterisk\", mime: \"text/x-asterisk\", mode: \"asterisk\", file: /^extensions\\.conf$/i},\n {name: \"Brainfuck\", mime: \"text/x-brainfuck\", mode: \"brainfuck\", ext: [\"b\", \"bf\"]},\n {name: \"C\", mime: \"text/x-csrc\", mode: \"clike\", ext: [\"c\", \"h\", \"ino\"]},\n {name: \"C++\", mime: \"text/x-c++src\", mode: \"clike\", ext: [\"cpp\", \"c++\", \"cc\", \"cxx\", \"hpp\", \"h++\", \"hh\", \"hxx\"], alias: [\"cpp\"]},\n {name: \"Cobol\", mime: \"text/x-cobol\", mode: \"cobol\", ext: [\"cob\", \"cpy\"]},\n {name: \"C#\", mime: \"text/x-csharp\", mode: \"clike\", ext: [\"cs\"], alias: [\"csharp\", \"cs\"]},\n {name: \"Clojure\", mime: \"text/x-clojure\", mode: \"clojure\", ext: [\"clj\", \"cljc\", \"cljx\"]},\n {name: \"ClojureScript\", mime: \"text/x-clojurescript\", mode: \"clojure\", ext: [\"cljs\"]},\n {name: \"Closure Stylesheets (GSS)\", mime: \"text/x-gss\", mode: \"css\", ext: [\"gss\"]},\n {name: \"CMake\", mime: \"text/x-cmake\", mode: \"cmake\", ext: [\"cmake\", \"cmake.in\"], file: /^CMakeLists\\.txt$/},\n {name: \"CoffeeScript\", mimes: [\"application/vnd.coffeescript\", \"text/coffeescript\", \"text/x-coffeescript\"], mode: \"coffeescript\", ext: [\"coffee\"], alias: [\"coffee\", \"coffee-script\"]},\n {name: \"Common Lisp\", mime: \"text/x-common-lisp\", mode: \"commonlisp\", ext: [\"cl\", \"lisp\", \"el\"], alias: [\"lisp\"]},\n {name: \"Cypher\", mime: \"application/x-cypher-query\", mode: \"cypher\", ext: [\"cyp\", \"cypher\"]},\n {name: \"Cython\", mime: \"text/x-cython\", mode: \"python\", ext: [\"pyx\", \"pxd\", \"pxi\"]},\n {name: \"Crystal\", mime: \"text/x-crystal\", mode: \"crystal\", ext: [\"cr\"]},\n {name: \"CSS\", mime: \"text/css\", mode: \"css\", ext: [\"css\"]},\n {name: \"CQL\", mime: \"text/x-cassandra\", mode: \"sql\", ext: [\"cql\"]},\n {name: \"D\", mime: \"text/x-d\", mode: \"d\", ext: [\"d\"]},\n {name: \"Dart\", mimes: [\"application/dart\", \"text/x-dart\"], mode: \"dart\", ext: [\"dart\"]},\n {name: \"diff\", mime: \"text/x-diff\", mode: \"diff\", ext: [\"diff\", \"patch\"]},\n {name: \"Django\", mime: \"text/x-django\", mode: \"django\"},\n {name: \"Dockerfile\", mime: \"text/x-dockerfile\", mode: \"dockerfile\", file: /^Dockerfile$/},\n {name: \"DTD\", mime: \"application/xml-dtd\", mode: \"dtd\", ext: [\"dtd\"]},\n {name: \"Dylan\", mime: \"text/x-dylan\", mode: \"dylan\", ext: [\"dylan\", \"dyl\", \"intr\"]},\n {name: \"EBNF\", mime: \"text/x-ebnf\", mode: \"ebnf\"},\n {name: \"ECL\", mime: \"text/x-ecl\", mode: \"ecl\", ext: [\"ecl\"]},\n {name: \"edn\", mime: \"application/edn\", mode: \"clojure\", ext: [\"edn\"]},\n {name: \"Eiffel\", mime: \"text/x-eiffel\", mode: \"eiffel\", ext: [\"e\"]},\n {name: \"Elm\", mime: \"text/x-elm\", mode: \"elm\", ext: [\"elm\"]},\n {name: \"Embedded Javascript\", mime: \"application/x-ejs\", mode: \"htmlembedded\", ext: [\"ejs\"]},\n {name: \"Embedded Ruby\", mime: \"application/x-erb\", mode: \"htmlembedded\", ext: [\"erb\"]},\n {name: \"Erlang\", mime: \"text/x-erlang\", mode: \"erlang\", ext: [\"erl\"]},\n {name: \"Esper\", mime: \"text/x-esper\", mode: \"sql\"},\n {name: \"Factor\", mime: \"text/x-factor\", mode: \"factor\", ext: [\"factor\"]},\n {name: \"FCL\", mime: \"text/x-fcl\", mode: \"fcl\"},\n {name: \"Forth\", mime: \"text/x-forth\", mode: \"forth\", ext: [\"forth\", \"fth\", \"4th\"]},\n {name: \"Fortran\", mime: \"text/x-fortran\", mode: \"fortran\", ext: [\"f\", \"for\", \"f77\", \"f90\", \"f95\"]},\n {name: \"F#\", mime: \"text/x-fsharp\", mode: \"mllike\", ext: [\"fs\"], alias: [\"fsharp\"]},\n {name: \"Gas\", mime: \"text/x-gas\", mode: \"gas\", ext: [\"s\"]},\n {name: \"Gherkin\", mime: \"text/x-feature\", mode: \"gherkin\", ext: [\"feature\"]},\n {name: \"GitHub Flavored Markdown\", mime: \"text/x-gfm\", mode: \"gfm\", file: /^(readme|contributing|history)\\.md$/i},\n {name: \"Go\", mime: \"text/x-go\", mode: \"go\", ext: [\"go\"]},\n {name: \"Groovy\", mime: \"text/x-groovy\", mode: \"groovy\", ext: [\"groovy\", \"gradle\"], file: /^Jenkinsfile$/},\n {name: \"HAML\", mime: \"text/x-haml\", mode: \"haml\", ext: [\"haml\"]},\n {name: \"Haskell\", mime: \"text/x-haskell\", mode: \"haskell\", ext: [\"hs\"]},\n {name: \"Haskell (Literate)\", mime: \"text/x-literate-haskell\", mode: \"haskell-literate\", ext: [\"lhs\"]},\n {name: \"Haxe\", mime: \"text/x-haxe\", mode: \"haxe\", ext: [\"hx\"]},\n {name: \"HXML\", mime: \"text/x-hxml\", mode: \"haxe\", ext: [\"hxml\"]},\n {name: \"ASP.NET\", mime: \"application/x-aspx\", mode: \"htmlembedded\", ext: [\"aspx\"], alias: [\"asp\", \"aspx\"]},\n {name: \"HTML\", mime: \"text/html\", mode: \"htmlmixed\", ext: [\"html\", \"htm\", \"handlebars\", \"hbs\"], alias: [\"xhtml\"]},\n {name: \"HTTP\", mime: \"message/http\", mode: \"http\"},\n {name: \"IDL\", mime: \"text/x-idl\", mode: \"idl\", ext: [\"pro\"]},\n {name: \"Pug\", mime: \"text/x-pug\", mode: \"pug\", ext: [\"jade\", \"pug\"], alias: [\"jade\"]},\n {name: \"Java\", mime: \"text/x-java\", mode: \"clike\", ext: [\"java\"]},\n {name: \"Java Server Pages\", mime: \"application/x-jsp\", mode: \"htmlembedded\", ext: [\"jsp\"], alias: [\"jsp\"]},\n {name: \"JavaScript\", mimes: [\"text/javascript\", \"text/ecmascript\", \"application/javascript\", \"application/x-javascript\", \"application/ecmascript\"],\n mode: \"javascript\", ext: [\"js\"], alias: [\"ecmascript\", \"js\", \"node\"]},\n {name: \"JSON\", mimes: [\"application/json\", \"application/x-json\"], mode: \"javascript\", ext: [\"json\", \"map\"], alias: [\"json5\"]},\n {name: \"JSON-LD\", mime: \"application/ld+json\", mode: \"javascript\", ext: [\"jsonld\"], alias: [\"jsonld\"]},\n {name: \"JSX\", mime: \"text/jsx\", mode: \"jsx\", ext: [\"jsx\"]},\n {name: \"Jinja2\", mime: \"text/jinja2\", mode: \"jinja2\", ext: [\"j2\", \"jinja\", \"jinja2\"]},\n {name: \"Julia\", mime: \"text/x-julia\", mode: \"julia\", ext: [\"jl\"]},\n {name: \"Kotlin\", mime: \"text/x-kotlin\", mode: \"clike\", ext: [\"kt\"]},\n {name: \"LESS\", mime: \"text/x-less\", mode: \"css\", ext: [\"less\"]},\n {name: \"LiveScript\", mime: \"text/x-livescript\", mode: \"livescript\", ext: [\"ls\"], alias: [\"ls\"]},\n {name: \"Lua\", mime: \"text/x-lua\", mode: \"lua\", ext: [\"lua\"]},\n {name: \"Markdown\", mime: \"text/x-markdown\", mode: \"markdown\", ext: [\"markdown\", \"md\", \"mkd\"]},\n {name: \"mIRC\", mime: \"text/mirc\", mode: \"mirc\"},\n {name: \"MariaDB SQL\", mime: \"text/x-mariadb\", mode: \"sql\"},\n {name: \"Mathematica\", mime: \"text/x-mathematica\", mode: \"mathematica\", ext: [\"m\", \"nb\", \"wl\", \"wls\"]},\n {name: \"Modelica\", mime: \"text/x-modelica\", mode: \"modelica\", ext: [\"mo\"]},\n {name: \"MUMPS\", mime: \"text/x-mumps\", mode: \"mumps\", ext: [\"mps\"]},\n {name: \"MS SQL\", mime: \"text/x-mssql\", mode: \"sql\"},\n {name: \"mbox\", mime: \"application/mbox\", mode: \"mbox\", ext: [\"mbox\"]},\n {name: \"MySQL\", mime: \"text/x-mysql\", mode: \"sql\"},\n {name: \"Nginx\", mime: \"text/x-nginx-conf\", mode: \"nginx\", file: /nginx.*\\.conf$/i},\n {name: \"NSIS\", mime: \"text/x-nsis\", mode: \"nsis\", ext: [\"nsh\", \"nsi\"]},\n {name: \"NTriples\", mimes: [\"application/n-triples\", \"application/n-quads\", \"text/n-triples\"],\n mode: \"ntriples\", ext: [\"nt\", \"nq\"]},\n {name: \"Objective-C\", mime: \"text/x-objectivec\", mode: \"clike\", ext: [\"m\"], alias: [\"objective-c\", \"objc\"]},\n {name: \"Objective-C++\", mime: \"text/x-objectivec++\", mode: \"clike\", ext: [\"mm\"], alias: [\"objective-c++\", \"objc++\"]},\n {name: \"OCaml\", mime: \"text/x-ocaml\", mode: \"mllike\", ext: [\"ml\", \"mli\", \"mll\", \"mly\"]},\n {name: \"Octave\", mime: \"text/x-octave\", mode: \"octave\", ext: [\"m\"]},\n {name: \"Oz\", mime: \"text/x-oz\", mode: \"oz\", ext: [\"oz\"]},\n {name: \"Pascal\", mime: \"text/x-pascal\", mode: \"pascal\", ext: [\"p\", \"pas\"]},\n {name: \"PEG.js\", mime: \"null\", mode: \"pegjs\", ext: [\"jsonld\"]},\n {name: \"Perl\", mime: \"text/x-perl\", mode: \"perl\", ext: [\"pl\", \"pm\"]},\n {name: \"PHP\", mimes: [\"text/x-php\", \"application/x-httpd-php\", \"application/x-httpd-php-open\"], mode: \"php\", ext: [\"php\", \"php3\", \"php4\", \"php5\", \"php7\", \"phtml\"]},\n {name: \"Pig\", mime: \"text/x-pig\", mode: \"pig\", ext: [\"pig\"]},\n {name: \"Plain Text\", mime: \"text/plain\", mode: \"null\", ext: [\"txt\", \"text\", \"conf\", \"def\", \"list\", \"log\"]},\n {name: \"PLSQL\", mime: \"text/x-plsql\", mode: \"sql\", ext: [\"pls\"]},\n {name: \"PostgreSQL\", mime: \"text/x-pgsql\", mode: \"sql\"},\n {name: \"PowerShell\", mime: \"application/x-powershell\", mode: \"powershell\", ext: [\"ps1\", \"psd1\", \"psm1\"]},\n {name: \"Properties files\", mime: \"text/x-properties\", mode: \"properties\", ext: [\"properties\", \"ini\", \"in\"], alias: [\"ini\", \"properties\"]},\n {name: \"ProtoBuf\", mime: \"text/x-protobuf\", mode: \"protobuf\", ext: [\"proto\"]},\n {name: \"Python\", mime: \"text/x-python\", mode: \"python\", ext: [\"BUILD\", \"bzl\", \"py\", \"pyw\"], file: /^(BUCK|BUILD)$/},\n {name: \"Puppet\", mime: \"text/x-puppet\", mode: \"puppet\", ext: [\"pp\"]},\n {name: \"Q\", mime: \"text/x-q\", mode: \"q\", ext: [\"q\"]},\n {name: \"R\", mime: \"text/x-rsrc\", mode: \"r\", ext: [\"r\", \"R\"], alias: [\"rscript\"]},\n {name: \"reStructuredText\", mime: \"text/x-rst\", mode: \"rst\", ext: [\"rst\"], alias: [\"rst\"]},\n {name: \"RPM Changes\", mime: \"text/x-rpm-changes\", mode: \"rpm\"},\n {name: \"RPM Spec\", mime: \"text/x-rpm-spec\", mode: \"rpm\", ext: [\"spec\"]},\n {name: \"Ruby\", mime: \"text/x-ruby\", mode: \"ruby\", ext: [\"rb\"], alias: [\"jruby\", \"macruby\", \"rake\", \"rb\", \"rbx\"]},\n {name: \"Rust\", mime: \"text/x-rustsrc\", mode: \"rust\", ext: [\"rs\"]},\n {name: \"SAS\", mime: \"text/x-sas\", mode: \"sas\", ext: [\"sas\"]},\n {name: \"Sass\", mime: \"text/x-sass\", mode: \"sass\", ext: [\"sass\"]},\n {name: \"Scala\", mime: \"text/x-scala\", mode: \"clike\", ext: [\"scala\"]},\n {name: \"Scheme\", mime: \"text/x-scheme\", mode: \"scheme\", ext: [\"scm\", \"ss\"]},\n {name: \"SCSS\", mime: \"text/x-scss\", mode: \"css\", ext: [\"scss\"]},\n {name: \"Shell\", mimes: [\"text/x-sh\", \"application/x-sh\"], mode: \"shell\", ext: [\"sh\", \"ksh\", \"bash\"], alias: [\"bash\", \"sh\", \"zsh\"], file: /^PKGBUILD$/},\n {name: \"Sieve\", mime: \"application/sieve\", mode: \"sieve\", ext: [\"siv\", \"sieve\"]},\n {name: \"Slim\", mimes: [\"text/x-slim\", \"application/x-slim\"], mode: \"slim\", ext: [\"slim\"]},\n {name: \"Smalltalk\", mime: \"text/x-stsrc\", mode: \"smalltalk\", ext: [\"st\"]},\n {name: \"Smarty\", mime: \"text/x-smarty\", mode: \"smarty\", ext: [\"tpl\"]},\n {name: \"Solr\", mime: \"text/x-solr\", mode: \"solr\"},\n {name: \"SML\", mime: \"text/x-sml\", mode: \"mllike\", ext: [\"sml\", \"sig\", \"fun\", \"smackspec\"]},\n {name: \"Soy\", mime: \"text/x-soy\", mode: \"soy\", ext: [\"soy\"], alias: [\"closure template\"]},\n {name: \"SPARQL\", mime: \"application/sparql-query\", mode: \"sparql\", ext: [\"rq\", \"sparql\"], alias: [\"sparul\"]},\n {name: \"Spreadsheet\", mime: \"text/x-spreadsheet\", mode: \"spreadsheet\", alias: [\"excel\", \"formula\"]},\n {name: \"SQL\", mime: \"text/x-sql\", mode: \"sql\", ext: [\"sql\"]},\n {name: \"SQLite\", mime: \"text/x-sqlite\", mode: \"sql\"},\n {name: \"Squirrel\", mime: \"text/x-squirrel\", mode: \"clike\", ext: [\"nut\"]},\n {name: \"Stylus\", mime: \"text/x-styl\", mode: \"stylus\", ext: [\"styl\"]},\n {name: \"Swift\", mime: \"text/x-swift\", mode: \"swift\", ext: [\"swift\"]},\n {name: \"sTeX\", mime: \"text/x-stex\", mode: \"stex\"},\n {name: \"LaTeX\", mime: \"text/x-latex\", mode: \"stex\", ext: [\"text\", \"ltx\", \"tex\"], alias: [\"tex\"]},\n {name: \"SystemVerilog\", mime: \"text/x-systemverilog\", mode: \"verilog\", ext: [\"v\", \"sv\", \"svh\"]},\n {name: \"Tcl\", mime: \"text/x-tcl\", mode: \"tcl\", ext: [\"tcl\"]},\n {name: \"Textile\", mime: \"text/x-textile\", mode: \"textile\", ext: [\"textile\"]},\n {name: \"TiddlyWiki\", mime: \"text/x-tiddlywiki\", mode: \"tiddlywiki\"},\n {name: \"Tiki wiki\", mime: \"text/tiki\", mode: \"tiki\"},\n {name: \"TOML\", mime: \"text/x-toml\", mode: \"toml\", ext: [\"toml\"]},\n {name: \"Tornado\", mime: \"text/x-tornado\", mode: \"tornado\"},\n {name: \"troff\", mime: \"text/troff\", mode: \"troff\", ext: [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\"]},\n {name: \"TTCN\", mime: \"text/x-ttcn\", mode: \"ttcn\", ext: [\"ttcn\", \"ttcn3\", \"ttcnpp\"]},\n {name: \"TTCN_CFG\", mime: \"text/x-ttcn-cfg\", mode: \"ttcn-cfg\", ext: [\"cfg\"]},\n {name: \"Turtle\", mime: \"text/turtle\", mode: \"turtle\", ext: [\"ttl\"]},\n {name: \"TypeScript\", mime: \"application/typescript\", mode: \"javascript\", ext: [\"ts\"], alias: [\"ts\"]},\n {name: \"TypeScript-JSX\", mime: \"text/typescript-jsx\", mode: \"jsx\", ext: [\"tsx\"], alias: [\"tsx\"]},\n {name: \"Twig\", mime: \"text/x-twig\", mode: \"twig\"},\n {name: \"Web IDL\", mime: \"text/x-webidl\", mode: \"webidl\", ext: [\"webidl\"]},\n {name: \"VB.NET\", mime: \"text/x-vb\", mode: \"vb\", ext: [\"vb\"]},\n {name: \"VBScript\", mime: \"text/vbscript\", mode: \"vbscript\", ext: [\"vbs\"]},\n {name: \"Velocity\", mime: \"text/velocity\", mode: \"velocity\", ext: [\"vtl\"]},\n {name: \"Verilog\", mime: \"text/x-verilog\", mode: \"verilog\", ext: [\"v\"]},\n {name: \"VHDL\", mime: \"text/x-vhdl\", mode: \"vhdl\", ext: [\"vhd\", \"vhdl\"]},\n {name: \"Vue.js Component\", mimes: [\"script/x-vue\", \"text/x-vue\"], mode: \"vue\", ext: [\"vue\"]},\n {name: \"XML\", mimes: [\"application/xml\", \"text/xml\"], mode: \"xml\", ext: [\"xml\", \"xsl\", \"xsd\", \"svg\"], alias: [\"rss\", \"wsdl\", \"xsd\"]},\n {name: \"XQuery\", mime: \"application/xquery\", mode: \"xquery\", ext: [\"xy\", \"xquery\"]},\n {name: \"Yacas\", mime: \"text/x-yacas\", mode: \"yacas\", ext: [\"ys\"]},\n {name: \"YAML\", mimes: [\"text/x-yaml\", \"text/yaml\"], mode: \"yaml\", ext: [\"yaml\", \"yml\"], alias: [\"yml\"]},\n {name: \"Z80\", mime: \"text/x-z80\", mode: \"z80\", ext: [\"z80\"]},\n {name: \"mscgen\", mime: \"text/x-mscgen\", mode: \"mscgen\", ext: [\"mscgen\", \"mscin\", \"msc\"]},\n {name: \"xu\", mime: \"text/x-xu\", mode: \"mscgen\", ext: [\"xu\"]},\n {name: \"msgenny\", mime: \"text/x-msgenny\", mode: \"mscgen\", ext: [\"msgenny\"]},\n {name: \"WebAssembly\", mime: \"text/webassembly\", mode: \"wast\", ext: [\"wat\", \"wast\"]},\n ];\n // Ensure all modes have a mime property for backwards compatibility\n for (var i = 0; i < CodeMirror.modeInfo.length; i++) {\n var info = CodeMirror.modeInfo[i];\n if (info.mimes) info.mime = info.mimes[0];\n }\n\n CodeMirror.findModeByMIME = function(mime) {\n mime = mime.toLowerCase();\n for (var i = 0; i < CodeMirror.modeInfo.length; i++) {\n var info = CodeMirror.modeInfo[i];\n if (info.mime == mime) return info;\n if (info.mimes) for (var j = 0; j < info.mimes.length; j++)\n if (info.mimes[j] == mime) return info;\n }\n if (/\\+xml$/.test(mime)) return CodeMirror.findModeByMIME(\"application/xml\")\n if (/\\+json$/.test(mime)) return CodeMirror.findModeByMIME(\"application/json\")\n };\n\n CodeMirror.findModeByExtension = function(ext) {\n ext = ext.toLowerCase();\n for (var i = 0; i < CodeMirror.modeInfo.length; i++) {\n var info = CodeMirror.modeInfo[i];\n if (info.ext) for (var j = 0; j < info.ext.length; j++)\n if (info.ext[j] == ext) return info;\n }\n };\n\n CodeMirror.findModeByFileName = function(filename) {\n for (var i = 0; i < CodeMirror.modeInfo.length; i++) {\n var info = CodeMirror.modeInfo[i];\n if (info.file && info.file.test(filename)) return info;\n }\n var dot = filename.lastIndexOf(\".\");\n var ext = dot > -1 && filename.substring(dot + 1, filename.length);\n if (ext) return CodeMirror.findModeByExtension(ext);\n };\n\n CodeMirror.findModeByName = function(name) {\n name = name.toLowerCase();\n for (var i = 0; i < CodeMirror.modeInfo.length; i++) {\n var info = CodeMirror.modeInfo[i];\n if (info.name.toLowerCase() == name) return info;\n if (info.alias) for (var j = 0; j < info.alias.length; j++)\n if (info.alias[j].toLowerCase() == name) return info;\n }\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vbm9kZV9tb2R1bGVzL2NvZGVtaXJyb3IvbW9kZS9tZXRhLmpzP2YwNDAiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7QUFFQTtBQUNBLE1BQU0sSUFBdUQ7QUFDN0QsUUFBUSxtQkFBTyxDQUFDLHNFQUFtQjtBQUNuQyxPQUFPLEVBR2E7QUFDcEIsQ0FBQztBQUNEOztBQUVBO0FBQ0EsS0FBSyxtRUFBbUU7QUFDeEUsS0FBSywwS0FBMEs7QUFDL0ssS0FBSyw0RUFBNEU7QUFDakYsS0FBSyx5RkFBeUY7QUFDOUYsS0FBSyxpRkFBaUY7QUFDdEYsS0FBSyxzRUFBc0U7QUFDM0UsS0FBSywrSEFBK0g7QUFDcEksS0FBSyx3RUFBd0U7QUFDN0UsS0FBSyx1RkFBdUY7QUFDNUYsS0FBSyx1RkFBdUY7QUFDNUYsS0FBSyxvRkFBb0Y7QUFDekYsS0FBSyxpRkFBaUY7QUFDdEYsS0FBSywwR0FBMEc7QUFDL0csS0FBSyxxTEFBcUw7QUFDMUwsS0FBSyxnSEFBZ0g7QUFDckgsS0FBSywyRkFBMkY7QUFDaEcsS0FBSyxrRkFBa0Y7QUFDdkYsS0FBSyxzRUFBc0U7QUFDM0UsS0FBSyx5REFBeUQ7QUFDOUQsS0FBSyxpRUFBaUU7QUFDdEUsS0FBSyxtREFBbUQ7QUFDeEQsS0FBSyxzRkFBc0Y7QUFDM0YsS0FBSyx3RUFBd0U7QUFDN0UsS0FBSyxzREFBc0Q7QUFDM0QsS0FBSyx3RkFBd0Y7QUFDN0YsS0FBSyxvRUFBb0U7QUFDekUsS0FBSyxrRkFBa0Y7QUFDdkYsS0FBSyxnREFBZ0Q7QUFDckQsS0FBSywyREFBMkQ7QUFDaEUsS0FBSyxvRUFBb0U7QUFDekUsS0FBSyxrRUFBa0U7QUFDdkUsS0FBSywyREFBMkQ7QUFDaEUsS0FBSywyRkFBMkY7QUFDaEcsS0FBSyxxRkFBcUY7QUFDMUYsS0FBSyxvRUFBb0U7QUFDekUsS0FBSyxpREFBaUQ7QUFDdEQsS0FBSyx1RUFBdUU7QUFDNUUsS0FBSyw2Q0FBNkM7QUFDbEQsS0FB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O0FBQ3ZFLEtBQUssbUdBQW1HO0FBQ3hHLEtBQUssK0ZBQStGO0FBQ3BHLEtBQUssZ0RBQWdEO0FBQ3JELEtBQUssd0VBQXdFO0FBQzdFLEtBQUssMkRBQTJEO0FBQ2hFLEtBQUssd0VBQXdFO0FBQzdFLEtBQUssd0VBQXdFO0FBQzdFLEtBQUsscUVBQXFFO0FBQzFFLEtBQUssc0VBQXNFO0FBQzNFLEtBQUssMkZBQTJGO0FBQ2hHLEtBQUssbUlBQW1JO0FBQ3hJLEtBQUssa0ZBQWtGO0FBQ3ZGLEtBQUssZ0VBQWdFO0FBQ3JFLEtBQUssc0dBQXNHO0FBQzNHLEtBQUssMkRBQTJEO0FBQ2hFLEtBQUssdUZBQXVGO0FBQzVGLEtBQUssMkRBQTJEO0FBQ2hFLEtBQUssMEVBQTBFO0FBQy9FLEtBQUssa0ZBQWtGO0FBQ3ZGO0FBQ0E7QUFDQSxpQkFBaUIsZ0NBQWdDO0FBQ2pEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsbUJBQW1CLGdDQUFnQztBQUNuRDtBQUNBO0FBQ0EscUNBQXFDLHVCQUF1QjtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxtQkFBbUIsZ0NBQWdDO0FBQ25EO0FBQ0EsbUNBQW1DLHFCQUFxQjtBQUN4RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtQkFBbUIsZ0NBQWdDO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxtQkFBbUIsZ0NBQWdDO0FBQ25EO0FBQ0E7QUFDQSxxQ0FBcUMsdUJBQXVCO0FBQzVEO0FBQ0E7QUFDQTtBQUNBLENBQUMiLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29kZW1pcnJvci9tb2RlL21ldGEuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb2RlTWlycm9yLCBjb3B5cmlnaHQgKGMpIGJ5IE1hcmlqbiBIYXZlcmJla2UgYW5kIG90aGVyc1xuLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHBzOi8vY29kZW1pcnJvci5uZXQvTElDRU5TRVxuXG4oZnVuY3Rpb24obW9kKSB7XG4gIGlmICh0eXBlb2YgZXhwb3J0cyA9PSBcIm9iamVjdFwiICYmIHR5cGVvZiBtb2R1bGUgPT0gXCJvYmplY3RcIikgLy8gQ29tbW9uSlNcbiAgICBtb2QocmVxdWlyZShcIi4uL2xpYi9jb2RlbWlycm9yXCIpKTtcbiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkgLy8gQU1EXG4gICAgZGVmaW5lKFtcIi4uL2xpYi9jb2RlbWlycm9yXCJdLCBtb2QpO1xuICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52XG4gICAgbW9kKENvZGVNaXJyb3IpO1xufSkoZnVuY3Rpb24oQ29kZU1pcnJvcikge1xuICBcInVzZSBzdHJpY3RcIjtcblxuICBDb2RlTWlycm9yLm1vZGVJbmZvID0gW1xuICAgIHtuYW1lOiBcIkFQTFwiLCBtaW1lOiBcInRleHQvYXBsXCIsIG1vZGU6IFwiYXBsXCIsIGV4dDogW1wiZHlhbG9nXCIsIFwiYXBsXCJdfSxcbiAgICB7bmFtZTogXCJQR1BcIiwgbWltZXM6IFtcImFwcGxpY2F0aW9uL3BncFwiLCBcImFwcGxpY2F0aW9uL3BncC1lbmNyeXB0ZWRcIiwgXCJhcHBsaWNhdGlvbi9wZ3Ata2V5c1wiLCBcImFwcGxpY2F0aW9uL3BncC1zaWduYXR1cmVcIl0sIG1vZGU6IFwiYXNjaWlhcm1vclwiLCBleHQ6IFtcImFzY1wiLCBcInBncFwiLCBcInNpZ1wiXX0sXG4gICAge25hbWU6IFwiQVNOLjFcIiwgbWltZTogXCJ0ZXh0L3gtdHRjbi1hc25cIiwgbW9kZTogXCJhc24uMVwiLCBleHQ6IFtcImFzblwiLCBcImFzbjFcIl19LFxuICAgIHtuYW1lOiBcIkFzdGVyaXNrXCIsIG1pbWU6IFwidGV4dC94LWFzdGVyaXNrXCIsIG1vZGU6IFwiYXN0ZXJpc2tcIiwgZmlsZTogL15leHRlbnNpb25zXFwuY29uZiQvaX0sXG4gICAge25hbWU6IFwiQnJhaW5mdWNrXCIsIG1pbWU6IFwidGV4dC94LWJyYWluZnVja1wiLCBtb2RlOiBcImJyYWluZnVja1wiLCBleHQ6IFtcImJcIiwgXCJiZlwiXX0sXG4gICAge25hbWU6IFwiQ1wiLCBtaW1lOiBcInRleHQveC1jc3JjXCIsIG1vZGU6IFwiY2xpa2VcIiwgZXh0OiBbXCJjXCIsIFwiaFwiLCBcImlub1wiXX0sXG4gICAge25hbWU6IFwiQysrXCIsIG1pbWU6IFwidGV4dC94LWMrK3NyY1wiLCBtb2RlOiBcImNsaWtlXCIsIGV4dDogW1wiY3BwXCIsIFwiYysrXCIsIFwiY2NcIiwgXCJjeHhcIiwgXCJocHBcIiwgXCJoKytcIiwgXCJoaFwiLCBcImh4eFwiXSwgYWxpYXM6IFtcImNwcFwiXX0sXG4gICAge25hbWU6IFwiQ29ib2xcIiwgbWltZTogXCJ0ZXh0L3gtY29ib2xcIiwgbW9kZTogXCJjb2JvbFwiLCBleHQ6IFtcImNvYlwiLCBcImNweVwiXX0sXG4gICAge25hbWU6IFwiQyNcIiwgbWltZTogXCJ0ZXh0L3gtY3NoYXJwXCIsIG1vZGU6IFwiY2xpa2VcIiwgZXh0OiBbXCJjc1wiXSwgYWxpYXM6IFtcImNzaGFycFwiLCBcImNzXCJdfSxcbiAgICB7bmFtZTogXCJDbG9qdXJlXCIsIG1pbWU6IFwidGV4dC94LWNsb2p1cmVcIiwgbW9kZTogXCJjbG9qdXJlXCIsIGV4dDogW1wiY2xqXCIsIFwiY2xqY1wiLCBcImNsanhcIl19LFxuICAgIHtuYW1lOiBcIkNsb2p1cmVTY3JpcHRcIiwgbWltZTogXCJ0ZXh0L3gtY2xvanVyZXNjcmlwdFwiLCBtb2RlOiBcImNsb2p1cmVcIiwgZXh0OiBbXCJjbGpzXCJdfSxcbiAgICB7bmFtZTogXCJDbG9zdXJlIFN0eWxlc2hlZXRzIChHU1MpXCIsIG1pbWU6IFwidGV4dC94LWdzc1wiLCBtb2RlOiBcImNzc1wiLCBleHQ6IFtcImdzc1wiXX0sXG4gICAge25hbWU6IFwiQ01ha2VcIiwgbWltZTogXCJ0ZXh0L3gtY21ha2VcIiwgbW9kZTogXCJjbWFrZVwiLCBleHQ6IFtcImNtYWtlXCIsIFwiY21ha2UuaW5cIl0sIGZpbGU6IC9eQ01ha2VMaXN0c1xcLnR4dCQvfSxcbiAgICB7bmFtZTogXCJDb2ZmZWVTY3JpcHRcIiwgbWltZXM6IFtcImFwcGxpY2F0aW9uL3ZuZC5jb2ZmZWVzY3JpcHRcIiwgXCJ0ZXh0L2NvZmZlZXNjcmlwdFwiLCBcInRleHQveC1jb2ZmZWVzY3JpcHRcIl0sIG1vZGU6IFwiY29mZmVlc2NyaXB0XCIsIGV4dDogW1wiY29mZmVlXCJdLCBhbGlhczogW1wiY29mZmVlXCIsIFwiY29mZmVlLXNjcmlwdFwiXX0sXG4gICAge25hbWU6IFwiQ29tbW9uIExpc3BcIiwgbWltZTogXCJ0ZXh0L3gtY29tbW9uLWxpc3BcIiwgbW9kZTogXCJjb21tb25saXNwXCIsIGV4dDogW1wiY2xcIiwgXCJsaXNwXCIsIFwiZWxcIl0sIGFsaWFzOiBbXCJsaXNwXCJdfSxcbiAgICB7bmFtZTogXCJDeXBoZXJcIiwgbWltZTogXCJhcHBsaWNhdGlvbi94LWN5cGhlci1xdWVyeVwiLCBtb2RlOiBcImN5cGhlclwiLCBleHQ6IFtcImN5cFwiLCBcImN5cGhlclwiXX0sXG4gICAge25hbWU6IFwiQ3l0aG9uXCIsIG1pbWU6IFwidGV4dC94LWN5dGhvblwiLCBtb2RlOiBcInB5dGhvblwiLCBleHQ6IFtcInB5eFwiLCBcInB4ZFwiLCBcInB4aVwiXX0sXG4gICAge25hbWU6IFwiQ3J5c3RhbFwiLCBtaW1lOiBcInRleHQveC1jcnlzdGFsXCIsIG1vZGU6IFwiY3J5c3RhbFwiLCBleHQ6IFtcImNyXCJdfSxcbiAgICB7bmFtZTogXCJDU1NcIiwgbWltZTogXCJ0ZXh0L2Nzc1wiLCBtb2RlOiBcImNzc1wiLCBleHQ6IFtcImNzc1wiXX0sXG4gICAge25hbWU6IFwiQ1FMXCIsIG1pbWU6IFwidGV4dC94LWNhc3NhbmRyYVwiLCBtb2RlOiBcInNxbFwiLCBleHQ6IFtcImNxbFwiXX0sXG4gICAge25hbWU6IFwiRFwiLCBtaW1lOiBcInRleHQveC1kXCIsIG1vZGU6IFwiZFwiLCBleHQ6IFtcImRcIl19LFxuICAgIHtuYW1lOiBcIkRhcnRcIiwgbWltZXM6IFtcImFwcGxpY2F0aW9uL2RhcnRcIiwgXCJ0ZXh0L3gtZGFydFwiXSwgbW9kZTogXCJkYXJ0XCIsIGV4dDogW1wiZGFydFwiXX0sXG4gICAge25hbWU6IFwiZGlmZlwiLCBtaW1lOiBcInRleHQveC1kaWZmXCIsIG1vZGU6IFwiZGlmZlwiLCBleHQ6IFtcImRpZmZcIiwgXCJwYXRjaFwiXX0sXG4gICAge25hbWU6IFwiRGphbmdvXCIsIG1pbWU6IFwidGV4dC94LWRqYW5nb1wiLCBtb2RlOiBcImRqYW5nb1wifSxcbiAgICB7bmFtZTogXCJEb2NrZXJmaWxlXCIsIG1pbWU6IFwidGV4dC94LWRvY2tlcmZpbGVcIiwgbW9kZTogXCJkb2NrZXJmaWxlXCIsIGZpbGU6IC9eRG9ja2VyZmlsZSQvfSxcbiAgICB7bmFtZTogXCJEVERcIiwgbWltZTogXCJhcHBsaWNhdGlvbi94bWwtZHRkXCIsIG1vZGU6IFwiZHRkXCIsIGV4dDogW1wiZHRkXCJdfSxcbiAgICB7bmFtZTogXCJEeWxhblwiLCBtaW1lOiBcInRleHQveC1keWxhblwiLCBtb2RlOiBcImR5bGFuXCIsIGV4dDogW1wiZHlsYW5cIiwgXCJkeWxcIiwgXCJpbnRyXCJdfSxcbiAgICB7bmFtZTogXCJFQk5GXCIsIG1pbWU6IFwidGV4dC94LWVibmZcIiwgbW9kZTogXCJlYm5mXCJ9LFxuICAgIHtuYW1lOiBcIkVDTFwiLCBtaW1lOiBcInRleHQveC1lY2xcIiwgbW9kZTogXCJlY2xcIiwgZXh0OiBbXCJlY2xcIl19LFxuICAgIHtuYW1lOiBcImVkblwiLCBtaW1lOiBcImFwcGxpY2F0aW9uL2VkblwiLCBtb2RlOiBcImNsb2p1cmVcIiwgZXh0OiBbXCJlZG5cIl19LFxuICAgIHtuYW1lOiBcIkVpZmZlbFwiLCBtaW1lOiBcInRleHQveC1laWZmZWxcIiwgbW9kZTogXCJlaWZmZWxcIiwgZXh0OiBbXCJlXCJdfSxcbiAgICB7bmFtZTogXCJFbG1cIiwgbWltZTogXCJ0ZXh0L3gtZWxtXCIsIG1vZGU6IFwiZWxtXCIsIGV4dDogW1wiZWxtXCJdfSxcbiAgICB7bmFtZTogXCJFbWJlZGRlZCBKYXZhc2NyaXB0XCIsIG1pbWU6IFwiYXBwbGljYXRpb24veC1lanNcIiwgbW9kZTogXCJodG1sZW1iZWRkZWRcIiwgZXh0OiBbXCJlanNcIl19LFxuICAgIHtuYW1lOiBcIkVtYmVkZGVkIFJ1YnlcIiwgbWltZTogXCJhcHBsaWNhdGlvbi94LWVyYlwiLCBtb2RlOiBcImh0bWxlbWJlZGRlZFwiLCBleHQ6IFtcImVyYlwiXX0sXG4gICAge25hbWU6IFwiRXJsYW5nXCIsIG1pbWU6IFwidGV4dC94LWVybGFuZ1wiLCBtb2RlOiBcImVybGFuZ1wiLCBleHQ6IFtcImVybFwiXX0sXG4gICAge25hbWU6IFwiRXNwZXJcIiwgbWltZTogXCJ0ZXh0L3gtZXNwZXJcIiwgbW9kZTogXCJzcWxcIn0sXG4gICAge25hbWU6IFwiRmFjdG9yXCIsIG1pbWU6IFwidGV4dC94LWZhY3RvclwiLCBtb2RlOiBcImZhY3RvclwiLCBleHQ6IFtcImZhY3RvclwiXX0sXG4gICAge25hbWU6IFwiRkNMXCIsIG1pbWU6IFwidGV4dC94LWZjbFwiLCBtb2RlOiBcImZjbFwifSxcbiAgICB7bmFtZTogXCJGb3J0aFwiLCBtaW1lOiBcInRleHQveC1mb3J0aFwiLCBtb2RlOiBcImZvcnRoXCIsIGV4dDogW1wiZm9ydGhcIiwgXCJmdGhcIiwgXCI0dGhcIl19LFxuICAgIHtuYW1lOiBcIkZvcnRyYW5cIiwgbWltZTogXCJ0ZXh0L3gtZm9ydHJhblwiLCBtb2RlOiBcImZvcnRyYW5cIiwgZXh0OiBbXCJmXCIsIFwiZm9yXCIsIFwiZjc3XCIsIFwiZjkwXCIsIFwiZjk1XCJdfSxcbiAgICB7bmFtZTogXCJGI1wiLCBtaW1lOiBcInRleHQveC1mc2hhcnBcIiwgbW9kZTogXCJtbGxpa2VcIiwgZXh0OiBbXCJmc1wiXSwgYWxpYXM6IFtcImZzaGFycFwiXX0sXG4gICAge25hbWU6IFwiR2FzXCIsIG1pbWU6IFwidGV4dC94LWdhc1wiLCBtb2RlOiBcImdhc1wiLCBleHQ6IFtcInNcIl19LFxuICAgIHtuYW1lOiBcIkdoZXJraW5cIiwgbWltZTogXCJ0ZXh0L3gtZmVhdHVyZVwiLCBtb2RlOiBcImdoZXJraW5cIiwgZXh0OiBbXCJmZWF0dXJlXCJdfSxcbiAgICB7bmFtZTogXCJHaXRIdWIgRmxhdm9yZWQgTWFya2Rvd25cIiwgbWltZTogXCJ0ZXh0L3gtZ2ZtXCIsIG1vZGU6IFwiZ2ZtXCIsIGZpbGU6IC9eKHJlYWRtZXxjb250cmlidXRpbmd8aGlzdG9yeSlcXC5tZCQvaX0sXG4gICAge25hbWU6IFwiR29cIiwgbWltZTogXCJ0ZXh0L3gtZ29cIiwgbW9kZTogXCJnb1wiLCBleHQ6IFtcImdvXCJdfSxcbiAgICB7bmFtZTogXCJHcm9vdnlcIiwgbWltZTogXCJ0ZXh0L3gtZ3Jvb3Z5XCIsIG1vZGU6IFwiZ3Jvb3Z5XCIsIGV4dDogW1wiZ3Jvb3Z5XCIsIFwiZ3JhZGxlXCJdLCBmaWxlOiAvXkplbmtpbnNmaWxlJC99LFxuICAgIHtuYW1lOiBcIkhBTUxcIiwgbWltZTogXCJ0ZXh0L3gtaGFtbFwiLCBtb2RlOiBcImhhbWxcIiwgZXh0OiBbXCJoYW1sXCJdfSxcbiAgICB7bmFtZTogXCJIYXNrZWxsXCIsIG1pbWU6IFwidGV4dC94LWhhc2tlbGxcIiwgbW9kZTogXCJoYXNrZWxsXCIsIGV4dDogW1wiaHNcIl19LFxuICAgIHtuYW1lOiBcIkhhc2tlbGwgKExpdGVyYXRlKVwiLCBtaW1lOiBcInRleHQveC1saXRlcmF0ZS1oYXNrZWxsXCIsIG1vZGU6IFwiaGFza2VsbC1saXRlcmF0ZVwiLCBleHQ6IFtcImxoc1wiXX0sXG4gICAge25hbWU6IFwiSGF4ZVwiLCBtaW1lOiBcInRleHQveC1oYXhlXCIsIG1vZGU6IFwiaGF4ZVwiLCBleHQ6IFtcImh4XCJdfSxcbiAgICB7bmFtZTogXCJIWE1MXCIsIG1pbWU6IFwidGV4dC94LWh4bWxcIiwgbW9kZTogXCJoYXhlXCIsIGV4dDogW1wiaHhtbFwiXX0sXG4gICAge25hbWU6IFwiQVNQLk5FVFwiLCBtaW1lOiBcImFwcGxpY2F0aW9uL3gtYXNweFwiLCBtb2RlOiBcImh0bWxlbWJlZGRlZFwiLCBleHQ6IFtcImFzcHhcIl0sIGFsaWFzOiBbXCJhc3BcIiwgXCJhc3B4XCJdfSxcbiAgICB7bmFtZTogXCJIVE1MXCIsIG1pbWU6IFwidGV4dC9odG1sXCIsIG1vZGU6IFwiaHRtbG1peGVkXCIsIGV4dDogW1wiaHRtbFwiLCBcImh0bVwiLCBcImhhbmRsZWJhcnNcIiwgXCJoYnNcIl0sIGFsaWFzOiBbXCJ4aHRtbFwiXX0sXG4gICAge25hbWU6IFwiSFRUUFwiLCBtaW1lOiBcIm1lc3NhZ2UvaHR0cFwiLCBtb2RlOiBcImh0dHBcIn0sXG4gICAge25hbWU6IFwiSURMXCIsIG1pbWU6IFwidGV4dC94LWlkbFwiLCBtb2RlOiBcImlkbFwiLCBleHQ6IFtcInByb1wiXX0sXG4gICAge25hbWU6IFwiUHVnXCIsIG1pbWU6IFwidGV4dC94LXB1Z1wiLCBtb2RlOiBcInB1Z1wiLCBleHQ6IFtcImphZGVcIiwgXCJwdWdcIl0sIGFsaWFzOiBbXCJqYWRlXCJdfSxcbiAgICB7bmFtZTogXCJKYXZhXCIsIG1pbWU6IFwidGV4dC94LWphdmFcIiwgbW9kZTogXCJjbGlrZVwiLCBleHQ6IFtcImphdmFcIl19LFxuICAgIHtuYW1lOiBcIkphdmEgU2VydmVyIFBhZ2VzXCIsIG1pbWU6IFwiYXBwbGljYXRpb24veC1qc3BcIiwgbW9kZTogXCJodG1sZW1iZWRkZWRcIiwgZXh0OiBbXCJqc3BcIl0sIGFsaWFzOiBbXCJqc3BcIl19LFxuICAgIHtuYW1lOiBcIkphdmFTY3JpcHRcIiwgbWltZXM6IFtcInRleHQvamF2YXNjcmlwdFwiLCBcInRleHQvZWNtYXNjcmlwdFwiLCBcImFwcGxpY2F0aW9uL2phdmFzY3JpcHRcIiwgXCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHRcIiwgXCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0XCJdLFxuICAgICBtb2RlOiBcImphdmFzY3JpcHRcIiwgZXh0OiBbXCJqc1wiXSwgYWxpYXM6IFtcImVjbWFzY3JpcHRcIiwgXCJqc1wiLCBcIm5vZGVcIl19LFxuICAgIHtuYW1lOiBcIkpTT05cIiwgbWltZXM6IFtcImFwcGxpY2F0aW9uL2pzb25cIiwgXCJhcHBsaWNhdGlvbi94LWpzb25cIl0sIG1vZGU6IFwiamF2YXNjcmlwdFwiLCBleHQ6IFtcImpzb25cIiwgXCJtYXBcIl0sIGFsaWFzOiBbXCJqc29uNVwiXX0sXG4gICAge25hbWU6IFwiSlNPTi1MRFwiLCBtaW1lOiBcImFwcGxpY2F0aW9uL2xkK2pzb25cIiwgbW9kZTogXCJqYXZhc2NyaXB0XCIsIGV4dDogW1wianNvbmxkXCJdLCBhbGlhczogW1wianNvbmxkXCJdfSxcbiAgICB7bmFtZTogXCJKU1hcIiwgbWltZTogXCJ0ZXh0L2pzeFwiLCBtb2RlOiBcImpzeFwiLCBleHQ6IFtcImpzeFwiXX0sXG4gICAge25hbWU6IFwiSmluamEyXCIsIG1pbWU6IFwidGV4dC9qaW5qYTJcIiwgbW9kZTogXCJqaW5qYTJcIiwgZXh0OiBbXCJqMlwiLCBcImppbmphXCIsIFwiamluamEyXCJdfSxcbiAgICB7bmFtZTogXCJKdWxpYVwiLCBtaW1lOiBcInRleHQveC1qdWxpYVwiLCBtb2RlOiBcImp1bGlhXCIsIGV4dDogW1wiamxcIl19LFxuICAgIHtuYW1lOiBcIktvdGxpblwiLCBtaW1lOiBcInRleHQveC1rb3RsaW5cIiwgbW9kZTogXCJjbGlrZVwiLCBleHQ6IFtcImt0XCJdfSxcbiAgICB7bmFtZTogXCJMRVNTXCIsIG1pbWU6IFwidGV4dC94LWxlc3NcIiwgbW9kZTogXCJjc3NcIiwgZXh0OiBbXCJsZXNzXCJdfSxcbiAgICB7bmFtZTogXCJMaXZlU2NyaXB0XCIsIG1pbWU6IFwidGV4dC94LWxpdmVzY3JpcHRcIiwgbW9kZTogXCJsaXZlc2NyaXB0XCIsIGV4dDogW1wibHNcIl0sIGFsaWFzOiBbXCJsc1wiXX0sXG4gICAge25hbWU6IFwiTHVhXCIsIG1pbWU6IFwidGV4dC94LWx1YVwiLCBtb2RlOiBcImx1YVwiLCBleHQ6IFtcImx1YVwiXX0sXG4gICAge25hbWU6IFwiTWFya2Rvd25cIiwgbWltZTogXCJ0ZXh0L3gtbWFya2Rvd25cIiwgbW9kZTogXCJtYXJrZG93blwiLCBleHQ6IFtcIm1hcmtkb3duXCIsIFwibWRcIiwgXCJta2RcIl19LFxuICAgIHtuYW1lOiBcIm1JUkNcIiwgbWltZTogXCJ0ZXh0L21pcmNcIiwgbW9kZTogXCJtaXJjXCJ9LFxuICAgIHtuYW1lOiBcIk1hcmlhREIgU1FMXCIsIG1pbWU6IFwidGV4dC94LW1hcmlhZGJcIiwgbW9kZTogXCJzcWxcIn0sXG4gICAge25hbWU6IFwiTWF0aGVtYXRpY2FcIiwgbWltZTogXCJ0ZXh0L3gtbWF0aGVtYXRpY2FcIiwgbW9kZTogXCJtYXRoZW1hdGljYVwiLCBleHQ6IFtcIm1cIiwgXCJuYlwiLCBcIndsXCIsIFwid2xzXCJdfSxcbiAgICB7bmFtZTogXCJNb2RlbGljYVwiLCBtaW1lOiBcInRleHQveC1tb2RlbGljYVwiLCBtb2RlOiBcIm1vZGVsaWNhXCIsIGV4dDogW1wibW9cIl19LFxuICAgIHtuYW1lOiBcIk1VTVBTXCIsIG1pbWU6IFwidGV4dC94LW11bXBzXCIsIG1vZGU6IFwibXVtcHNcIiwgZXh0OiBbXCJtcHNcIl19LFxuICAgIHtuYW1lOiBcIk1TIFNRTFwiLCBtaW1lOiBcInRleHQveC1tc3NxbFwiLCBtb2RlOiBcInNxbFwifSxcbiAgICB7bmFtZTogXCJtYm94XCIsIG1pbWU6IFwiYXBwbGljYXRpb24vbWJveFwiLCBtb2RlOiBcIm1ib3hcIiwgZXh0OiBbXCJtYm94XCJdfSxcbiAgICB7bmFtZTogXCJNeVNRTFwiLCBtaW1lOiBcInRleHQveC1teXNxbFwiLCBtb2RlOiBcInNxbFwifSxcbiAgICB7bmFtZTogXCJOZ2lueFwiLCBtaW1lOiBcInRleHQveC1uZ2lueC1jb25mXCIsIG1vZGU6IFwibmdpbnhcIiwgZmlsZTogL25naW54LipcXC5jb25mJC9pfSxcbiAgICB7bmFtZTogXCJOU0lTXCIsIG1pbWU6IFwidGV4dC94LW5zaXNcIiwgbW9kZTogXCJuc2lzXCIsIGV4dDogW1wibnNoXCIsIFwibnNpXCJdfSxcbiAgICB7bmFtZTogXCJOVHJpcGxlc1wiLCBtaW1lczogW1wiYXBwbGljYXRpb24vbi10cmlwbGVzXCIsIFwiYXBwbGljYXRpb24vbi1xdWFkc1wiLCBcInRleHQvbi10cmlwbGVzXCJdLFxuICAgICBtb2RlOiBcIm50cmlwbGVzXCIsIGV4dDogW1wibnRcIiwgXCJucVwiXX0sXG4gICAge25hbWU6IFwiT2JqZWN0aXZlLUNcIiwgbWltZTogXCJ0ZXh0L3gtb2JqZWN0aXZlY1wiLCBtb2RlOiBcImNsaWtlXCIsIGV4dDogW1wibVwiXSwgYWxpYXM6IFtcIm9iamVjdGl2ZS1jXCIsIFwib2JqY1wiXX0sXG4gICAge25hbWU6IFwiT2JqZWN0aXZlLUMrK1wiLCBtaW1lOiBcInRleHQveC1vYmplY3RpdmVjKytcIiwgbW9kZTogXCJjbGlrZVwiLCBleHQ6IFtcIm1tXCJdLCBhbGlhczogW1wib2JqZWN0aXZlLWMrK1wiLCBcIm9iamMrK1wiXX0sXG4gICAge25hbWU6IFwiT0NhbWxcIiwgbWltZTogXCJ0ZXh0L3gtb2NhbWxcIiwgbW9kZTogXCJtbGxpa2VcIiwgZXh0OiBbXCJtbFwiLCBcIm1saVwiLCBcIm1sbFwiLCBcIm1seVwiXX0sXG4gICAge25hbWU6IFwiT2N0YXZlXCIsIG1pbWU6IFwidGV4dC94LW9jdGF2ZVwiLCBtb2RlOiBcIm9jdGF2ZVwiLCBleHQ6IFtcIm1cIl19LFxuICAgIHtuYW1lOiBcIk96XCIsIG1pbWU6IFwidGV4dC94LW96XCIsIG1vZGU6IFwib3pcIiwgZXh0OiBbXCJvelwiXX0sXG4gICAge25hbWU6IFwiUGFzY2FsXCIsIG1pbWU6IFwidGV4dC94LXBhc2NhbFwiLCBtb2RlOiBcInBhc2NhbFwiLCBleHQ6IFtcInBcIiwgXCJwYXNcIl19LFxuICAgIHtuYW1lOiBcIlBFRy5qc1wiLCBtaW1lOiBcIm51bGxcIiwgbW9kZTogXCJwZWdqc1wiLCBleHQ6IFtcImpzb25sZFwiXX0sXG4gICAge25hbWU6IFwiUGVybFwiLCBtaW1lOiBcInRleHQveC1wZXJsXCIsIG1vZGU6IFwicGVybFwiLCBleHQ6IFtcInBsXCIsIFwicG1cIl19LFxuICAgIHtuYW1lOiBcIlBIUFwiLCBtaW1lczogW1widGV4dC94LXBocFwiLCBcImFwcGxpY2F0aW9uL3gtaHR0cGQtcGhwXCIsIFwiYXBwbGljYXRpb24veC1odHRwZC1waHAtb3BlblwiXSwgbW9kZTogXCJwaHBcIiwgZXh0OiBbXCJwaHBcIiwgXCJwaHAzXCIsIFwicGhwNFwiLCBcInBocDVcIiwgXCJwaHA3XCIsIFwicGh0bWxcIl19LFxuICAgIHtuYW1lOiBcIlBpZ1wiLCBtaW1lOiBcInRleHQveC1waWdcIiwgbW9kZTogXCJwaWdcIiwgZXh0OiBbXCJwaWdcIl19LFxuICAgIHtuYW1lOiBcIlBsYWluIFRleHRcIiwgbWltZTogXCJ0ZXh0L3BsYWluXCIsIG1vZGU6IFwibnVsbFwiLCBleHQ6IFtcInR4dFwiLCBcInRleHRcIiwgXCJjb25mXCIsIFwiZGVmXCIsIFwibGlzdFwiLCBcImxvZ1wiXX0sXG4gICAge25hbWU6IFwiUExTUUxcIiwgbWltZTogXCJ0ZXh0L3gtcGxzcWxcIiwgbW9kZTogXCJzcWxcIiwgZXh0OiBbXCJwbHNcIl19LFxuICAgIHtuYW1lOiBcIlBvc3RncmVTUUxcIiwgbWltZTogXCJ0ZXh0L3gtcGdzcWxcIiwgbW9kZTogXCJzcWxcIn0sXG4gICAge25hbWU6IFwiUG93ZXJTaGVsbFwiLCBtaW1lOiBcImFwcGxpY2F0aW9uL3gtcG93ZXJzaGVsbFwiLCBtb2RlOiBcInBvd2Vyc2hlbGxcIiwgZXh0OiBbXCJwczFcIiwgXCJwc2QxXCIsIFwicHNtMVwiXX0sXG4gICAge25hbWU6IFwiUHJvcGVydGllcyBmaWxlc1wiLCBtaW1lOiBcInRleHQveC1wcm9wZXJ0aWVzXCIsIG1vZGU6IFwicHJvcGVydGllc1wiLCBleHQ6IFtcInByb3BlcnRpZXNcIiwgXCJpbmlcIiwgXCJpblwiXSwgYWxpYXM6IFtcImluaVwiLCBcInByb3BlcnRpZXNcIl19LFxuICAgIHtuYW1lOiBcIlByb3RvQnVmXCIsIG1pbWU6IFwidGV4dC94LXByb3RvYnVmXCIsIG1vZGU6IFwicHJvdG9idWZcIiwgZXh0OiBbXCJwcm90b1wiXX0sXG4gICAge25hbWU6IFwiUHl0aG9uXCIsIG1pbWU6IFwidGV4dC94LXB5dGhvblwiLCBtb2RlOiBcInB5dGhvblwiLCBleHQ6IFtcIkJVSUxEXCIsIFwiYnpsXCIsIFwicHlcIiwgXCJweXdcIl0sIGZpbGU6IC9eKEJVQ0t8QlVJTEQpJC99LFxuICAgIHtuYW1lOiBcIlB1cHBldFwiLCBtaW1lOiBcInRleHQveC1wdXBwZXRcIiwgbW9kZTogXCJwdXBwZXRcIiwgZXh0OiBbXCJwcFwiXX0sXG4gICAge25hbWU6IFwiUVwiLCBtaW1lOiBcInRleHQveC1xXCIsIG1vZGU6IFwicVwiLCBleHQ6IFtcInFcIl19LFxuICAgIHtuYW1lOiBcIlJcIiwgbWltZTogXCJ0ZXh0L3gtcnNyY1wiLCBtb2RlOiBcInJcIiwgZXh0OiBbXCJyXCIsIFwiUlwiXSwgYWxpYXM6IFtcInJzY3JpcHRcIl19LFxuICAgIHtuYW1lOiBcInJlU3RydWN0dXJlZFRleHRcIiwgbWltZTogXCJ0ZXh0L3gtcnN0XCIsIG1vZGU6IFwicnN0XCIsIGV4dDogW1wicnN0XCJdLCBhbGlhczogW1wicnN0XCJdfSxcbiAgICB7bmFtZTogXCJSUE0gQ2hhbmdlc1wiLCBtaW1lOiBcInRleHQveC1ycG0tY2hhbmdlc1wiLCBtb2RlOiBcInJwbVwifSxcbiAgICB7bmFtZTogXCJSUE0gU3BlY1wiLCBtaW1lOiBcInRleHQveC1ycG0tc3BlY1wiLCBtb2RlOiBcInJwbVwiLCBleHQ6IFtcInNwZWNcIl19LFxuICAgIHtuYW1lOiBcIlJ1YnlcIiwgbWltZTogXCJ0ZXh0L3gtcnVieVwiLCBtb2RlOiBcInJ1YnlcIiwgZXh0OiBbXCJyYlwiXSwgYWxpYXM6IFtcImpydWJ5XCIsIFwibWFjcnVieVwiLCBcInJha2VcIiwgXCJyYlwiLCBcInJieFwiXX0sXG4gICAge25hbWU6IFwiUnVzdFwiLCBtaW1lOiBcInRleHQveC1ydXN0c3JjXCIsIG1vZGU6IFwicnVzdFwiLCBleHQ6IFtcInJzXCJdfSxcbiAgICB7bmFtZTogXCJTQVNcIiwgbWltZTogXCJ0ZXh0L3gtc2FzXCIsIG1vZGU6IFwic2FzXCIsIGV4dDogW1wic2FzXCJdfSxcbiAgICB7bmFtZTogXCJTYXNzXCIsIG1pbWU6IFwidGV4dC94LXNhc3NcIiwgbW9kZTogXCJzYXNzXCIsIGV4dDogW1wic2Fzc1wiXX0sXG4gICAge25hbWU6IFwiU2NhbGFcIiwgbWltZTogXCJ0ZXh0L3gtc2NhbGFcIiwgbW9kZTogXCJjbGlrZVwiLCBleHQ6IFtcInNjYWxhXCJdfSxcbiAgICB7bmFtZTogXCJTY2hlbWVcIiwgbWltZTogXCJ0ZXh0L3gtc2NoZW1lXCIsIG1vZGU6IFwic2NoZW1lXCIsIGV4dDogW1wic2NtXCIsIFwic3NcIl19LFxuICAgIHtuYW1lOiBcIlNDU1NcIiwgbWltZTogXCJ0ZXh0L3gtc2Nzc1wiLCBtb2RlOiBcImNzc1wiLCBleHQ6IFtcInNjc3NcIl19LFxuICAgIHtuYW1lOiBcIlNoZWxsXCIsIG1pbWVzOiBbXCJ0ZXh0L3gtc2hcIiwgXCJhcHBsaWNhdGlvbi94LXNoXCJdLCBtb2RlOiBcInNoZWxsXCIsIGV4dDogW1wic2hcIiwgXCJrc2hcIiwgXCJiYXNoXCJdLCBhbGlhczogW1wiYmFzaFwiLCBcInNoXCIsIFwienNoXCJdLCBmaWxlOiAvXlBLR0JVSUxEJC99LFxuICAgIHtuYW1lOiBcIlNpZXZlXCIsIG1pbWU6IFwiYXBwbGljYXRpb24vc2lldmVcIiwgbW9kZTogXCJzaWV2ZVwiLCBleHQ6IFtcInNpdlwiLCBcInNpZXZlXCJdfSxcbiAgICB7bmFtZTogXCJTbGltXCIsIG1pbWVzOiBbXCJ0ZXh0L3gtc2xpbVwiLCBcImFwcGxpY2F0aW9uL3gtc2xpbVwiXSwgbW9kZTogXCJzbGltXCIsIGV4dDogW1wic2xpbVwiXX0sXG4gICAge25hbWU6IFwiU21hbGx0YWxrXCIsIG1pbWU6IFwidGV4dC94LXN0c3JjXCIsIG1vZGU6IFwic21hbGx0YWxrXCIsIGV4dDogW1wic3RcIl19LFxuICAgIHtuYW1lOiBcIlNtYXJ0eVwiLCBtaW1lOiBcInRleHQveC1zbWFydHlcIiwgbW9kZTogXCJzbWFydHlcIiwgZXh0OiBbXCJ0cGxcIl19LFxuICAgIHtuYW1lOiBcIlNvbHJcIiwgbWltZTogXCJ0ZXh0L3gtc29sclwiLCBtb2RlOiBcInNvbHJcIn0sXG4gICAge25hbWU6IFwiU01MXCIsIG1pbWU6IFwidGV4dC94LXNtbFwiLCBtb2RlOiBcIm1sbGlrZVwiLCBleHQ6IFtcInNtbFwiLCBcInNpZ1wiLCBcImZ1blwiLCBcInNtYWNrc3BlY1wiXX0sXG4gICAge25hbWU6IFwiU295XCIsIG1pbWU6IFwidGV4dC94LXNveVwiLCBtb2RlOiBcInNveVwiLCBleHQ6IFtcInNveVwiXSwgYWxpYXM6IFtcImNsb3N1cmUgdGVtcGxhdGVcIl19LFxuICAgIHtuYW1lOiBcIlNQQVJRTFwiLCBtaW1lOiBcImFwcGxpY2F0aW9uL3NwYXJxbC1xdWVyeVwiLCBtb2RlOiBcInNwYXJxbFwiLCBleHQ6IFtcInJxXCIsIFwic3BhcnFsXCJdLCBhbGlhczogW1wic3BhcnVsXCJdfSxcbiAgICB7bmFtZTogXCJTcHJlYWRzaGVldFwiLCBtaW1lOiBcInRleHQveC1zcHJlYWRzaGVldFwiLCBtb2RlOiBcInNwcmVhZHNoZWV0XCIsIGFsaWFzOiBbXCJleGNlbFwiLCBcImZvcm11bGFcIl19LFxuICAgIHtuYW1lOiBcIlNRTFwiLCBtaW1lOiBcInRleHQveC1zcWxcIiwgbW9kZTogXCJzcWxcIiwgZXh0OiBbXCJzcWxcIl19LFxuICAgIHtuYW1lOiBcIlNRTGl0ZVwiLCBtaW1lOiBcInRleHQveC1zcWxpdGVcIiwgbW9kZTogXCJzcWxcIn0sXG4gICAge25hbWU6IFwiU3F1aXJyZWxcIiwgbWltZTogXCJ0ZXh0L3gtc3F1aXJyZWxcIiwgbW9kZTogXCJjbGlrZVwiLCBleHQ6IFtcIm51dFwiXX0sXG4gICAge25hbWU6IFwiU3R5bHVzXCIsIG1pbWU6IFwidGV4dC94LXN0eWxcIiwgbW9kZTogXCJzdHlsdXNcIiwgZXh0OiBbXCJzdHlsXCJdfSxcbiAgICB7bmFtZTogXCJTd2lmdFwiLCBtaW1lOiBcInRleHQveC1zd2lmdFwiLCBtb2RlOiBcInN3aWZ0XCIsIGV4dDogW1wic3dpZnRcIl19LFxuICAgIHtuYW1lOiBcInNUZVhcIiwgbWltZTogXCJ0ZXh0L3gtc3RleFwiLCBtb2RlOiBcInN0ZXhcIn0sXG4gICAge25hbWU6IFwiTGFUZVhcIiwgbWltZTogXCJ0ZXh0L3gtbGF0ZXhcIiwgbW9kZTogXCJzdGV4XCIsIGV4dDogW1widGV4dFwiLCBcImx0eFwiLCBcInRleFwiXSwgYWxpYXM6IFtcInRleFwiXX0sXG4gICAge25hbWU6IFwiU3lzdGVtVmVyaWxvZ1wiLCBtaW1lOiBcInRleHQveC1zeXN0ZW12ZXJpbG9nXCIsIG1vZGU6IFwidmVyaWxvZ1wiLCBleHQ6IFtcInZcIiwgXCJzdlwiLCBcInN2aFwiXX0sXG4gICAge25hbWU6IFwiVGNsXCIsIG1pbWU6IFwidGV4dC94LXRjbFwiLCBtb2RlOiBcInRjbFwiLCBleHQ6IFtcInRjbFwiXX0sXG4gICAge25hbWU6IFwiVGV4dGlsZVwiLCBtaW1lOiBcInRleHQveC10ZXh0aWxlXCIsIG1vZGU6IFwidGV4dGlsZVwiLCBleHQ6IFtcInRleHRpbGVcIl19LFxuICAgIHtuYW1lOiBcIlRpZGRseVdpa2lcIiwgbWltZTogXCJ0ZXh0L3gtdGlkZGx5d2lraVwiLCBtb2RlOiBcInRpZGRseXdpa2lcIn0sXG4gICAge25hbWU6IFwiVGlraSB3aWtpXCIsIG1pbWU6IFwidGV4dC90aWtpXCIsIG1vZGU6IFwidGlraVwifSxcbiAgICB7bmFtZTogXCJUT01MXCIsIG1pbWU6IFwidGV4dC94LXRvbWxcIiwgbW9kZTogXCJ0b21sXCIsIGV4dDogW1widG9tbFwiXX0sXG4gICAge25hbWU6IFwiVG9ybmFkb1wiLCBtaW1lOiBcInRleHQveC10b3JuYWRvXCIsIG1vZGU6IFwidG9ybmFkb1wifSxcbiAgICB7bmFtZTogXCJ0cm9mZlwiLCBtaW1lOiBcInRleHQvdHJvZmZcIiwgbW9kZTogXCJ0cm9mZlwiLCBleHQ6IFtcIjFcIiwgXCIyXCIsIFwiM1wiLCBcIjRcIiwgXCI1XCIsIFwiNlwiLCBcIjdcIiwgXCI4XCIsIFwiOVwiXX0sXG4gICAge25hbWU6IFwiVFRDTlwiLCBtaW1lOiBcInRleHQveC10dGNuXCIsIG1vZGU6IFwidHRjblwiLCBleHQ6IFtcInR0Y25cIiwgXCJ0dGNuM1wiLCBcInR0Y25wcFwiXX0sXG4gICAge25hbWU6IFwiVFRDTl9DRkdcIiwgbWltZTogXCJ0ZXh0L3gtdHRjbi1jZmdcIiwgbW9kZTogXCJ0dGNuLWNmZ1wiLCBleHQ6IFtcImNmZ1wiXX0sXG4gICAge25hbWU6IFwiVHVydGxlXCIsIG1pbWU6IFwidGV4dC90dXJ0bGVcIiwgbW9kZTogXCJ0dXJ0bGVcIiwgZXh0OiBbXCJ0dGxcIl19LFxuICAgIHtuYW1lOiBcIlR5cGVTY3JpcHRcIiwgbWltZTogXCJhcHBsaWNhdGlvbi90eXBlc2NyaXB0XCIsIG1vZGU6IFwiamF2YXNjcmlwdFwiLCBleHQ6IFtcInRzXCJdLCBhbGlhczogW1widHNcIl19LFxuICAgIHtuYW1lOiBcIlR5cGVTY3JpcHQtSlNYXCIsIG1pbWU6IFwidGV4dC90eXBlc2NyaXB0LWpzeFwiLCBtb2RlOiBcImpzeFwiLCBleHQ6IFtcInRzeFwiXSwgYWxpYXM6IFtcInRzeFwiXX0sXG4gICAge25hbWU6IFwiVHdpZ1wiLCBtaW1lOiBcInRleHQveC10d2lnXCIsIG1vZGU6IFwidHdpZ1wifSxcbiAgICB7bmFtZTogXCJXZWIgSURMXCIsIG1pbWU6IFwidGV4dC94LXdlYmlkbFwiLCBtb2RlOiBcIndlYmlkbFwiLCBleHQ6IFtcIndlYmlkbFwiXX0sXG4gICAge25hbWU6IFwiVkIuTkVUXCIsIG1pbWU6IFwidGV4dC94LXZiXCIsIG1vZGU6IFwidmJcIiwgZXh0OiBbXCJ2YlwiXX0sXG4gICAge25hbWU6IFwiVkJTY3JpcHRcIiwgbWltZTogXCJ0ZXh0L3Zic2NyaXB0XCIsIG1vZGU6IFwidmJzY3JpcHRcIiwgZXh0OiBbXCJ2YnNcIl19LFxuICAgIHtuYW1lOiBcIlZlbG9jaXR5XCIsIG1pbWU6IFwidGV4dC92ZWxvY2l0eVwiLCBtb2RlOiBcInZlbG9jaXR5XCIsIGV4dDogW1widnRsXCJdfSxcbiAgICB7bmFtZTogXCJWZXJpbG9nXCIsIG1pbWU6IFwidGV4dC94LXZlcmlsb2dcIiwgbW9kZTogXCJ2ZXJpbG9nXCIsIGV4dDogW1widlwiXX0sXG4gICAge25hbWU6IFwiVkhETFwiLCBtaW1lOiBcInRleHQveC12aGRsXCIsIG1vZGU6IFwidmhkbFwiLCBleHQ6IFtcInZoZFwiLCBcInZoZGxcIl19LFxuICAgIHtuYW1lOiBcIlZ1ZS5qcyBDb21wb25lbnRcIiwgbWltZXM6IFtcInNjcmlwdC94LXZ1ZVwiLCBcInRleHQveC12dWVcIl0sIG1vZGU6IFwidnVlXCIsIGV4dDogW1widnVlXCJdfSxcbiAgICB7bmFtZTogXCJYTUxcIiwgbWltZXM6IFtcImFwcGxpY2F0aW9uL3htbFwiLCBcInRleHQveG1sXCJdLCBtb2RlOiBcInhtbFwiLCBleHQ6IFtcInhtbFwiLCBcInhzbFwiLCBcInhzZFwiLCBcInN2Z1wiXSwgYWxpYXM6IFtcInJzc1wiLCBcIndzZGxcIiwgXCJ4c2RcIl19LFxuICAgIHtuYW1lOiBcIlhRdWVyeVwiLCBtaW1lOiBcImFwcGxpY2F0aW9uL3hxdWVyeVwiLCBtb2RlOiBcInhxdWVyeVwiLCBleHQ6IFtcInh5XCIsIFwieHF1ZXJ5XCJdfSxcbiAgICB7bmFtZTogXCJZYWNhc1wiLCBtaW1lOiBcInRleHQveC15YWNhc1wiLCBtb2RlOiBcInlhY2FzXCIsIGV4dDogW1wieXNcIl19LFxuICAgIHtuYW1lOiBcIllBTUxcIiwgbWltZXM6IFtcInRleHQveC15YW1sXCIsIFwidGV4dC95YW1sXCJdLCBtb2RlOiBcInlhbWxcIiwgZXh0OiBbXCJ5YW1sXCIsIFwieW1sXCJdLCBhbGlhczogW1wieW1sXCJdfSxcbiAgICB7bmFtZTogXCJaODBcIiwgbWltZTogXCJ0ZXh0L3gtejgwXCIsIG1vZGU6IFwiejgwXCIsIGV4dDogW1wiejgwXCJdfSxcbiAgICB7bmFtZTogXCJtc2NnZW5cIiwgbWltZTogXCJ0ZXh0L3gtbXNjZ2VuXCIsIG1vZGU6IFwibXNjZ2VuXCIsIGV4dDogW1wibXNjZ2VuXCIsIFwibXNjaW5cIiwgXCJtc2NcIl19LFxuICAgIHtuYW1lOiBcInh1XCIsIG1pbWU6IFwidGV4dC94LXh1XCIsIG1vZGU6IFwibXNjZ2VuXCIsIGV4dDogW1wieHVcIl19LFxuICAgIHtuYW1lOiBcIm1zZ2VubnlcIiwgbWltZTogXCJ0ZXh0L3gtbXNnZW5ueVwiLCBtb2RlOiBcIm1zY2dlblwiLCBleHQ6IFtcIm1zZ2VubnlcIl19LFxuICAgIHtuYW1lOiBcIldlYkFzc2VtYmx5XCIsIG1pbWU6IFwidGV4dC93ZWJhc3NlbWJseVwiLCBtb2RlOiBcIndhc3RcIiwgZXh0OiBbXCJ3YXRcIiwgXCJ3YXN0XCJdfSxcbiAgXTtcbiAgLy8gRW5zdXJlIGFsbCBtb2RlcyBoYXZlIGEgbWltZSBwcm9wZXJ0eSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBDb2RlTWlycm9yLm1vZGVJbmZvLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGluZm8gPSBDb2RlTWlycm9yLm1vZGVJbmZvW2ldO1xuICAgIGlmIChpbmZvLm1pbWVzKSBpbmZvLm1pbWUgPSBpbmZvLm1pbWVzWzBdO1xuICB9XG5cbiAgQ29kZU1pcnJvci5maW5kTW9kZUJ5TUlNRSA9IGZ1bmN0aW9uKG1pbWUpIHtcbiAgICBtaW1lID0gbWltZS50b0xvd2VyQ2FzZSgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgQ29kZU1pcnJvci5tb2RlSW5mby5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGluZm8gPSBDb2RlTWlycm9yLm1vZGVJbmZvW2ldO1xuICAgICAgaWYgKGluZm8ubWltZSA9PSBtaW1lKSByZXR1cm4gaW5mbztcbiAgICAgIGlmIChpbmZvLm1pbWVzKSBmb3IgKHZhciBqID0gMDsgaiA8IGluZm8ubWltZXMubGVuZ3RoOyBqKyspXG4gICAgICAgIGlmIChpbmZvLm1pbWVzW2pdID09IG1pbWUpIHJldHVybiBpbmZvO1xuICAgIH1cbiAgICBpZiAoL1xcK3htbCQvLnRlc3QobWltZSkpIHJldHVybiBDb2RlTWlycm9yLmZpbmRNb2RlQnlNSU1FKFwiYXBwbGljYXRpb24veG1sXCIpXG4gICAgaWYgKC9cXCtqc29uJC8udGVzdChtaW1lKSkgcmV0dXJuIENvZGVNaXJyb3IuZmluZE1vZGVCeU1JTUUoXCJhcHBsaWNhdGlvbi9qc29uXCIpXG4gIH07XG5cbiAgQ29kZU1pcnJvci5maW5kTW9kZUJ5RXh0ZW5zaW9uID0gZnVuY3Rpb24oZXh0KSB7XG4gICAgZXh0ID0gZXh0LnRvTG93ZXJDYXNlKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBDb2RlTWlycm9yLm1vZGVJbmZvLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaW5mbyA9IENvZGVNaXJyb3IubW9kZUluZm9baV07XG4gICAgICBpZiAoaW5mby5leHQpIGZvciAodmFyIGogPSAwOyBqIDwgaW5mby5leHQubGVuZ3RoOyBqKyspXG4gICAgICAgIGlmIChpbmZvLmV4dFtqXSA9PSBleHQpIHJldHVybiBpbmZvO1xuICAgIH1cbiAgfTtcblxuICBDb2RlTWlycm9yLmZpbmRNb2RlQnlGaWxlTmFtZSA9IGZ1bmN0aW9uKGZpbGVuYW1lKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBDb2RlTWlycm9yLm1vZGVJbmZvLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaW5mbyA9IENvZGVNaXJyb3IubW9kZUluZm9baV07XG4gICAgICBpZiAoaW5mby5maWxlICYmIGluZm8uZmlsZS50ZXN0KGZpbGVuYW1lKSkgcmV0dXJuIGluZm87XG4gICAgfVxuICAgIHZhciBkb3QgPSBmaWxlbmFtZS5sYXN0SW5kZXhPZihcIi5cIik7XG4gICAgdmFyIGV4dCA9IGRvdCA+IC0xICYmIGZpbGVuYW1lLnN1YnN0cmluZyhkb3QgKyAxLCBmaWxlbmFtZS5sZW5ndGgpO1xuICAgIGlmIChleHQpIHJldHVybiBDb2RlTWlycm9yLmZpbmRNb2RlQnlFeHRlbnNpb24oZXh0KTtcbiAgfTtcblxuICBDb2RlTWlycm9yLmZpbmRNb2RlQnlOYW1lID0gZnVuY3Rpb24obmFtZSkge1xuICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBDb2RlTWlycm9yLm1vZGVJbmZvLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaW5mbyA9IENvZGVNaXJyb3IubW9kZUluZm9baV07XG4gICAgICBpZiAoaW5mby5uYW1lLnRvTG93ZXJDYXNlKCkgPT0gbmFtZSkgcmV0dXJuIGluZm87XG4gICAgICBpZiAoaW5mby5hbGlhcykgZm9yICh2YXIgaiA9IDA7IGogPCBpbmZvLmFsaWFzLmxlbmd0aDsgaisrKVxuICAgICAgICBpZiAoaW5mby5hbGlhc1tqXS50b0xvd2VyQ2FzZSgpID09IG5hbWUpIHJldHVybiBpbmZvO1xuICAgIH1cbiAgfTtcbn0pO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/codemirror/mode/meta.js\n"); +eval("// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n if (true) // CommonJS\n mod(__webpack_require__(/*! ../lib/codemirror */ \"./node_modules/codemirror/lib/codemirror.js\"));\n else {}\n})(function(CodeMirror) {\n \"use strict\";\n\n CodeMirror.modeInfo = [\n {name: \"APL\", mime: \"text/apl\", mode: \"apl\", ext: [\"dyalog\", \"apl\"]},\n {name: \"PGP\", mimes: [\"application/pgp\", \"application/pgp-encrypted\", \"application/pgp-keys\", \"application/pgp-signature\"], mode: \"asciiarmor\", ext: [\"asc\", \"pgp\", \"sig\"]},\n {name: \"ASN.1\", mime: \"text/x-ttcn-asn\", mode: \"asn.1\", ext: [\"asn\", \"asn1\"]},\n {name: \"Asterisk\", mime: \"text/x-asterisk\", mode: \"asterisk\", file: /^extensions\\.conf$/i},\n {name: \"Brainfuck\", mime: \"text/x-brainfuck\", mode: \"brainfuck\", ext: [\"b\", \"bf\"]},\n {name: \"C\", mime: \"text/x-csrc\", mode: \"clike\", ext: [\"c\", \"h\", \"ino\"]},\n {name: \"C++\", mime: \"text/x-c++src\", mode: \"clike\", ext: [\"cpp\", \"c++\", \"cc\", \"cxx\", \"hpp\", \"h++\", \"hh\", \"hxx\"], alias: [\"cpp\"]},\n {name: \"Cobol\", mime: \"text/x-cobol\", mode: \"cobol\", ext: [\"cob\", \"cpy\"]},\n {name: \"C#\", mime: \"text/x-csharp\", mode: \"clike\", ext: [\"cs\"], alias: [\"csharp\", \"cs\"]},\n {name: \"Clojure\", mime: \"text/x-clojure\", mode: \"clojure\", ext: [\"clj\", \"cljc\", \"cljx\"]},\n {name: \"ClojureScript\", mime: \"text/x-clojurescript\", mode: \"clojure\", ext: [\"cljs\"]},\n {name: \"Closure Stylesheets (GSS)\", mime: \"text/x-gss\", mode: \"css\", ext: [\"gss\"]},\n {name: \"CMake\", mime: \"text/x-cmake\", mode: \"cmake\", ext: [\"cmake\", \"cmake.in\"], file: /^CMakeLists\\.txt$/},\n {name: \"CoffeeScript\", mimes: [\"application/vnd.coffeescript\", \"text/coffeescript\", \"text/x-coffeescript\"], mode: \"coffeescript\", ext: [\"coffee\"], alias: [\"coffee\", \"coffee-script\"]},\n {name: \"Common Lisp\", mime: \"text/x-common-lisp\", mode: \"commonlisp\", ext: [\"cl\", \"lisp\", \"el\"], alias: [\"lisp\"]},\n {name: \"Cypher\", mime: \"application/x-cypher-query\", mode: \"cypher\", ext: [\"cyp\", \"cypher\"]},\n {name: \"Cython\", mime: \"text/x-cython\", mode: \"python\", ext: [\"pyx\", \"pxd\", \"pxi\"]},\n {name: \"Crystal\", mime: \"text/x-crystal\", mode: \"crystal\", ext: [\"cr\"]},\n {name: \"CSS\", mime: \"text/css\", mode: \"css\", ext: [\"css\"]},\n {name: \"CQL\", mime: \"text/x-cassandra\", mode: \"sql\", ext: [\"cql\"]},\n {name: \"D\", mime: \"text/x-d\", mode: \"d\", ext: [\"d\"]},\n {name: \"Dart\", mimes: [\"application/dart\", \"text/x-dart\"], mode: \"dart\", ext: [\"dart\"]},\n {name: \"diff\", mime: \"text/x-diff\", mode: \"diff\", ext: [\"diff\", \"patch\"]},\n {name: \"Django\", mime: \"text/x-django\", mode: \"django\"},\n {name: \"Dockerfile\", mime: \"text/x-dockerfile\", mode: \"dockerfile\", file: /^Dockerfile$/},\n {name: \"DTD\", mime: \"application/xml-dtd\", mode: \"dtd\", ext: [\"dtd\"]},\n {name: \"Dylan\", mime: \"text/x-dylan\", mode: \"dylan\", ext: [\"dylan\", \"dyl\", \"intr\"]},\n {name: \"EBNF\", mime: \"text/x-ebnf\", mode: \"ebnf\"},\n {name: \"ECL\", mime: \"text/x-ecl\", mode: \"ecl\", ext: [\"ecl\"]},\n {name: \"edn\", mime: \"application/edn\", mode: \"clojure\", ext: [\"edn\"]},\n {name: \"Eiffel\", mime: \"text/x-eiffel\", mode: \"eiffel\", ext: [\"e\"]},\n {name: \"Elm\", mime: \"text/x-elm\", mode: \"elm\", ext: [\"elm\"]},\n {name: \"Embedded JavaScript\", mime: \"application/x-ejs\", mode: \"htmlembedded\", ext: [\"ejs\"]},\n {name: \"Embedded Ruby\", mime: \"application/x-erb\", mode: \"htmlembedded\", ext: [\"erb\"]},\n {name: \"Erlang\", mime: \"text/x-erlang\", mode: \"erlang\", ext: [\"erl\"]},\n {name: \"Esper\", mime: \"text/x-esper\", mode: \"sql\"},\n {name: \"Factor\", mime: \"text/x-factor\", mode: \"factor\", ext: [\"factor\"]},\n {name: \"FCL\", mime: \"text/x-fcl\", mode: \"fcl\"},\n {name: \"Forth\", mime: \"text/x-forth\", mode: \"forth\", ext: [\"forth\", \"fth\", \"4th\"]},\n {name: \"Fortran\", mime: \"text/x-fortran\", mode: \"fortran\", ext: [\"f\", \"for\", \"f77\", \"f90\", \"f95\"]},\n {name: \"F#\", mime: \"text/x-fsharp\", mode: \"mllike\", ext: [\"fs\"], alias: [\"fsharp\"]},\n {name: \"Gas\", mime: \"text/x-gas\", mode: \"gas\", ext: [\"s\"]},\n {name: \"Gherkin\", mime: \"text/x-feature\", mode: \"gherkin\", ext: [\"feature\"]},\n {name: \"GitHub Flavored Markdown\", mime: \"text/x-gfm\", mode: \"gfm\", file: /^(readme|contributing|history)\\.md$/i},\n {name: \"Go\", mime: \"text/x-go\", mode: \"go\", ext: [\"go\"]},\n {name: \"Groovy\", mime: \"text/x-groovy\", mode: \"groovy\", ext: [\"groovy\", \"gradle\"], file: /^Jenkinsfile$/},\n {name: \"HAML\", mime: \"text/x-haml\", mode: \"haml\", ext: [\"haml\"]},\n {name: \"Haskell\", mime: \"text/x-haskell\", mode: \"haskell\", ext: [\"hs\"]},\n {name: \"Haskell (Literate)\", mime: \"text/x-literate-haskell\", mode: \"haskell-literate\", ext: [\"lhs\"]},\n {name: \"Haxe\", mime: \"text/x-haxe\", mode: \"haxe\", ext: [\"hx\"]},\n {name: \"HXML\", mime: \"text/x-hxml\", mode: \"haxe\", ext: [\"hxml\"]},\n {name: \"ASP.NET\", mime: \"application/x-aspx\", mode: \"htmlembedded\", ext: [\"aspx\"], alias: [\"asp\", \"aspx\"]},\n {name: \"HTML\", mime: \"text/html\", mode: \"htmlmixed\", ext: [\"html\", \"htm\", \"handlebars\", \"hbs\"], alias: [\"xhtml\"]},\n {name: \"HTTP\", mime: \"message/http\", mode: \"http\"},\n {name: \"IDL\", mime: \"text/x-idl\", mode: \"idl\", ext: [\"pro\"]},\n {name: \"Pug\", mime: \"text/x-pug\", mode: \"pug\", ext: [\"jade\", \"pug\"], alias: [\"jade\"]},\n {name: \"Java\", mime: \"text/x-java\", mode: \"clike\", ext: [\"java\"]},\n {name: \"Java Server Pages\", mime: \"application/x-jsp\", mode: \"htmlembedded\", ext: [\"jsp\"], alias: [\"jsp\"]},\n {name: \"JavaScript\", mimes: [\"text/javascript\", \"text/ecmascript\", \"application/javascript\", \"application/x-javascript\", \"application/ecmascript\"],\n mode: \"javascript\", ext: [\"js\"], alias: [\"ecmascript\", \"js\", \"node\"]},\n {name: \"JSON\", mimes: [\"application/json\", \"application/x-json\"], mode: \"javascript\", ext: [\"json\", \"map\"], alias: [\"json5\"]},\n {name: \"JSON-LD\", mime: \"application/ld+json\", mode: \"javascript\", ext: [\"jsonld\"], alias: [\"jsonld\"]},\n {name: \"JSX\", mime: \"text/jsx\", mode: \"jsx\", ext: [\"jsx\"]},\n {name: \"Jinja2\", mime: \"text/jinja2\", mode: \"jinja2\", ext: [\"j2\", \"jinja\", \"jinja2\"]},\n {name: \"Julia\", mime: \"text/x-julia\", mode: \"julia\", ext: [\"jl\"], alias: [\"jl\"]},\n {name: \"Kotlin\", mime: \"text/x-kotlin\", mode: \"clike\", ext: [\"kt\"]},\n {name: \"LESS\", mime: \"text/x-less\", mode: \"css\", ext: [\"less\"]},\n {name: \"LiveScript\", mime: \"text/x-livescript\", mode: \"livescript\", ext: [\"ls\"], alias: [\"ls\"]},\n {name: \"Lua\", mime: \"text/x-lua\", mode: \"lua\", ext: [\"lua\"]},\n {name: \"Markdown\", mime: \"text/x-markdown\", mode: \"markdown\", ext: [\"markdown\", \"md\", \"mkd\"]},\n {name: \"mIRC\", mime: \"text/mirc\", mode: \"mirc\"},\n {name: \"MariaDB SQL\", mime: \"text/x-mariadb\", mode: \"sql\"},\n {name: \"Mathematica\", mime: \"text/x-mathematica\", mode: \"mathematica\", ext: [\"m\", \"nb\", \"wl\", \"wls\"]},\n {name: \"Modelica\", mime: \"text/x-modelica\", mode: \"modelica\", ext: [\"mo\"]},\n {name: \"MUMPS\", mime: \"text/x-mumps\", mode: \"mumps\", ext: [\"mps\"]},\n {name: \"MS SQL\", mime: \"text/x-mssql\", mode: \"sql\"},\n {name: \"mbox\", mime: \"application/mbox\", mode: \"mbox\", ext: [\"mbox\"]},\n {name: \"MySQL\", mime: \"text/x-mysql\", mode: \"sql\"},\n {name: \"Nginx\", mime: \"text/x-nginx-conf\", mode: \"nginx\", file: /nginx.*\\.conf$/i},\n {name: \"NSIS\", mime: \"text/x-nsis\", mode: \"nsis\", ext: [\"nsh\", \"nsi\"]},\n {name: \"NTriples\", mimes: [\"application/n-triples\", \"application/n-quads\", \"text/n-triples\"],\n mode: \"ntriples\", ext: [\"nt\", \"nq\"]},\n {name: \"Objective-C\", mime: \"text/x-objectivec\", mode: \"clike\", ext: [\"m\"], alias: [\"objective-c\", \"objc\"]},\n {name: \"Objective-C++\", mime: \"text/x-objectivec++\", mode: \"clike\", ext: [\"mm\"], alias: [\"objective-c++\", \"objc++\"]},\n {name: \"OCaml\", mime: \"text/x-ocaml\", mode: \"mllike\", ext: [\"ml\", \"mli\", \"mll\", \"mly\"]},\n {name: \"Octave\", mime: \"text/x-octave\", mode: \"octave\", ext: [\"m\"]},\n {name: \"Oz\", mime: \"text/x-oz\", mode: \"oz\", ext: [\"oz\"]},\n {name: \"Pascal\", mime: \"text/x-pascal\", mode: \"pascal\", ext: [\"p\", \"pas\"]},\n {name: \"PEG.js\", mime: \"null\", mode: \"pegjs\", ext: [\"jsonld\"]},\n {name: \"Perl\", mime: \"text/x-perl\", mode: \"perl\", ext: [\"pl\", \"pm\"]},\n {name: \"PHP\", mimes: [\"text/x-php\", \"application/x-httpd-php\", \"application/x-httpd-php-open\"], mode: \"php\", ext: [\"php\", \"php3\", \"php4\", \"php5\", \"php7\", \"phtml\"]},\n {name: \"Pig\", mime: \"text/x-pig\", mode: \"pig\", ext: [\"pig\"]},\n {name: \"Plain Text\", mime: \"text/plain\", mode: \"null\", ext: [\"txt\", \"text\", \"conf\", \"def\", \"list\", \"log\"]},\n {name: \"PLSQL\", mime: \"text/x-plsql\", mode: \"sql\", ext: [\"pls\"]},\n {name: \"PostgreSQL\", mime: \"text/x-pgsql\", mode: \"sql\"},\n {name: \"PowerShell\", mime: \"application/x-powershell\", mode: \"powershell\", ext: [\"ps1\", \"psd1\", \"psm1\"]},\n {name: \"Properties files\", mime: \"text/x-properties\", mode: \"properties\", ext: [\"properties\", \"ini\", \"in\"], alias: [\"ini\", \"properties\"]},\n {name: \"ProtoBuf\", mime: \"text/x-protobuf\", mode: \"protobuf\", ext: [\"proto\"]},\n {name: \"Python\", mime: \"text/x-python\", mode: \"python\", ext: [\"BUILD\", \"bzl\", \"py\", \"pyw\"], file: /^(BUCK|BUILD)$/},\n {name: \"Puppet\", mime: \"text/x-puppet\", mode: \"puppet\", ext: [\"pp\"]},\n {name: \"Q\", mime: \"text/x-q\", mode: \"q\", ext: [\"q\"]},\n {name: \"R\", mime: \"text/x-rsrc\", mode: \"r\", ext: [\"r\", \"R\"], alias: [\"rscript\"]},\n {name: \"reStructuredText\", mime: \"text/x-rst\", mode: \"rst\", ext: [\"rst\"], alias: [\"rst\"]},\n {name: \"RPM Changes\", mime: \"text/x-rpm-changes\", mode: \"rpm\"},\n {name: \"RPM Spec\", mime: \"text/x-rpm-spec\", mode: \"rpm\", ext: [\"spec\"]},\n {name: \"Ruby\", mime: \"text/x-ruby\", mode: \"ruby\", ext: [\"rb\"], alias: [\"jruby\", \"macruby\", \"rake\", \"rb\", \"rbx\"]},\n {name: \"Rust\", mime: \"text/x-rustsrc\", mode: \"rust\", ext: [\"rs\"]},\n {name: \"SAS\", mime: \"text/x-sas\", mode: \"sas\", ext: [\"sas\"]},\n {name: \"Sass\", mime: \"text/x-sass\", mode: \"sass\", ext: [\"sass\"]},\n {name: \"Scala\", mime: \"text/x-scala\", mode: \"clike\", ext: [\"scala\"]},\n {name: \"Scheme\", mime: \"text/x-scheme\", mode: \"scheme\", ext: [\"scm\", \"ss\"]},\n {name: \"SCSS\", mime: \"text/x-scss\", mode: \"css\", ext: [\"scss\"]},\n {name: \"Shell\", mimes: [\"text/x-sh\", \"application/x-sh\"], mode: \"shell\", ext: [\"sh\", \"ksh\", \"bash\"], alias: [\"bash\", \"sh\", \"zsh\"], file: /^PKGBUILD$/},\n {name: \"Sieve\", mime: \"application/sieve\", mode: \"sieve\", ext: [\"siv\", \"sieve\"]},\n {name: \"Slim\", mimes: [\"text/x-slim\", \"application/x-slim\"], mode: \"slim\", ext: [\"slim\"]},\n {name: \"Smalltalk\", mime: \"text/x-stsrc\", mode: \"smalltalk\", ext: [\"st\"]},\n {name: \"Smarty\", mime: \"text/x-smarty\", mode: \"smarty\", ext: [\"tpl\"]},\n {name: \"Solr\", mime: \"text/x-solr\", mode: \"solr\"},\n {name: \"SML\", mime: \"text/x-sml\", mode: \"mllike\", ext: [\"sml\", \"sig\", \"fun\", \"smackspec\"]},\n {name: \"Soy\", mime: \"text/x-soy\", mode: \"soy\", ext: [\"soy\"], alias: [\"closure template\"]},\n {name: \"SPARQL\", mime: \"application/sparql-query\", mode: \"sparql\", ext: [\"rq\", \"sparql\"], alias: [\"sparul\"]},\n {name: \"Spreadsheet\", mime: \"text/x-spreadsheet\", mode: \"spreadsheet\", alias: [\"excel\", \"formula\"]},\n {name: \"SQL\", mime: \"text/x-sql\", mode: \"sql\", ext: [\"sql\"]},\n {name: \"SQLite\", mime: \"text/x-sqlite\", mode: \"sql\"},\n {name: \"Squirrel\", mime: \"text/x-squirrel\", mode: \"clike\", ext: [\"nut\"]},\n {name: \"Stylus\", mime: \"text/x-styl\", mode: \"stylus\", ext: [\"styl\"]},\n {name: \"Swift\", mime: \"text/x-swift\", mode: \"swift\", ext: [\"swift\"]},\n {name: \"sTeX\", mime: \"text/x-stex\", mode: \"stex\"},\n {name: \"LaTeX\", mime: \"text/x-latex\", mode: \"stex\", ext: [\"text\", \"ltx\", \"tex\"], alias: [\"tex\"]},\n {name: \"SystemVerilog\", mime: \"text/x-systemverilog\", mode: \"verilog\", ext: [\"v\", \"sv\", \"svh\"]},\n {name: \"Tcl\", mime: \"text/x-tcl\", mode: \"tcl\", ext: [\"tcl\"]},\n {name: \"Textile\", mime: \"text/x-textile\", mode: \"textile\", ext: [\"textile\"]},\n {name: \"TiddlyWiki\", mime: \"text/x-tiddlywiki\", mode: \"tiddlywiki\"},\n {name: \"Tiki wiki\", mime: \"text/tiki\", mode: \"tiki\"},\n {name: \"TOML\", mime: \"text/x-toml\", mode: \"toml\", ext: [\"toml\"]},\n {name: \"Tornado\", mime: \"text/x-tornado\", mode: \"tornado\"},\n {name: \"troff\", mime: \"text/troff\", mode: \"troff\", ext: [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\"]},\n {name: \"TTCN\", mime: \"text/x-ttcn\", mode: \"ttcn\", ext: [\"ttcn\", \"ttcn3\", \"ttcnpp\"]},\n {name: \"TTCN_CFG\", mime: \"text/x-ttcn-cfg\", mode: \"ttcn-cfg\", ext: [\"cfg\"]},\n {name: \"Turtle\", mime: \"text/turtle\", mode: \"turtle\", ext: [\"ttl\"]},\n {name: \"TypeScript\", mime: \"application/typescript\", mode: \"javascript\", ext: [\"ts\"], alias: [\"ts\"]},\n {name: \"TypeScript-JSX\", mime: \"text/typescript-jsx\", mode: \"jsx\", ext: [\"tsx\"], alias: [\"tsx\"]},\n {name: \"Twig\", mime: \"text/x-twig\", mode: \"twig\"},\n {name: \"Web IDL\", mime: \"text/x-webidl\", mode: \"webidl\", ext: [\"webidl\"]},\n {name: \"VB.NET\", mime: \"text/x-vb\", mode: \"vb\", ext: [\"vb\"]},\n {name: \"VBScript\", mime: \"text/vbscript\", mode: \"vbscript\", ext: [\"vbs\"]},\n {name: \"Velocity\", mime: \"text/velocity\", mode: \"velocity\", ext: [\"vtl\"]},\n {name: \"Verilog\", mime: \"text/x-verilog\", mode: \"verilog\", ext: [\"v\"]},\n {name: \"VHDL\", mime: \"text/x-vhdl\", mode: \"vhdl\", ext: [\"vhd\", \"vhdl\"]},\n {name: \"Vue.js Component\", mimes: [\"script/x-vue\", \"text/x-vue\"], mode: \"vue\", ext: [\"vue\"]},\n {name: \"XML\", mimes: [\"application/xml\", \"text/xml\"], mode: \"xml\", ext: [\"xml\", \"xsl\", \"xsd\", \"svg\"], alias: [\"rss\", \"wsdl\", \"xsd\"]},\n {name: \"XQuery\", mime: \"application/xquery\", mode: \"xquery\", ext: [\"xy\", \"xquery\"]},\n {name: \"Yacas\", mime: \"text/x-yacas\", mode: \"yacas\", ext: [\"ys\"]},\n {name: \"YAML\", mimes: [\"text/x-yaml\", \"text/yaml\"], mode: \"yaml\", ext: [\"yaml\", \"yml\"], alias: [\"yml\"]},\n {name: \"Z80\", mime: \"text/x-z80\", mode: \"z80\", ext: [\"z80\"]},\n {name: \"mscgen\", mime: \"text/x-mscgen\", mode: \"mscgen\", ext: [\"mscgen\", \"mscin\", \"msc\"]},\n {name: \"xu\", mime: \"text/x-xu\", mode: \"mscgen\", ext: [\"xu\"]},\n {name: \"msgenny\", mime: \"text/x-msgenny\", mode: \"mscgen\", ext: [\"msgenny\"]},\n {name: \"WebAssembly\", mime: \"text/webassembly\", mode: \"wast\", ext: [\"wat\", \"wast\"]},\n ];\n // Ensure all modes have a mime property for backwards compatibility\n for (var i = 0; i < CodeMirror.modeInfo.length; i++) {\n var info = CodeMirror.modeInfo[i];\n if (info.mimes) info.mime = info.mimes[0];\n }\n\n CodeMirror.findModeByMIME = function(mime) {\n mime = mime.toLowerCase();\n for (var i = 0; i < CodeMirror.modeInfo.length; i++) {\n var info = CodeMirror.modeInfo[i];\n if (info.mime == mime) return info;\n if (info.mimes) for (var j = 0; j < info.mimes.length; j++)\n if (info.mimes[j] == mime) return info;\n }\n if (/\\+xml$/.test(mime)) return CodeMirror.findModeByMIME(\"application/xml\")\n if (/\\+json$/.test(mime)) return CodeMirror.findModeByMIME(\"application/json\")\n };\n\n CodeMirror.findModeByExtension = function(ext) {\n ext = ext.toLowerCase();\n for (var i = 0; i < CodeMirror.modeInfo.length; i++) {\n var info = CodeMirror.modeInfo[i];\n if (info.ext) for (var j = 0; j < info.ext.length; j++)\n if (info.ext[j] == ext) return info;\n }\n };\n\n CodeMirror.findModeByFileName = function(filename) {\n for (var i = 0; i < CodeMirror.modeInfo.length; i++) {\n var info = CodeMirror.modeInfo[i];\n if (info.file && info.file.test(filename)) return info;\n }\n var dot = filename.lastIndexOf(\".\");\n var ext = dot > -1 && filename.substring(dot + 1, filename.length);\n if (ext) return CodeMirror.findModeByExtension(ext);\n };\n\n CodeMirror.findModeByName = function(name) {\n name = name.toLowerCase();\n for (var i = 0; i < CodeMirror.modeInfo.length; i++) {\n var info = CodeMirror.modeInfo[i];\n if (info.name.toLowerCase() == name) return info;\n if (info.alias) for (var j = 0; j < info.alias.length; j++)\n if (info.alias[j].toLowerCase() == name) return info;\n }\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vbm9kZV9tb2R1bGVzL2NvZGVtaXJyb3IvbW9kZS9tZXRhLmpzP2YwNDAiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7QUFFQTtBQUNBLE1BQU0sSUFBdUQ7QUFDN0QsUUFBUSxtQkFBTyxDQUFDLHNFQUFtQjtBQUNuQyxPQUFPLEVBR2E7QUFDcEIsQ0FBQztBQUNEOztBQUVBO0FBQ0EsS0FBSyxtRUFBbUU7QUFDeEUsS0FBSywwS0FBMEs7QUFDL0ssS0FBSyw0RUFBNEU7QUFDakYsS0FBSyx5RkFBeUY7QUFDOUYsS0FBSyxpRkFBaUY7QUFDdEYsS0FBSyxzRUFBc0U7QUFDM0UsS0FBSywrSEFBK0g7QUFDcEksS0FBSyx3RUFBd0U7QUFDN0UsS0FBSyx1RkFBdUY7QUFDNUYsS0FBSyx1RkFBdUY7QUFDNUYsS0FBSyxvRkFBb0Y7QUFDekYsS0FBSyxpRkFBaUY7QUFDdEYsS0FBSywwR0FBMEc7QUFDL0csS0FBSyxxTEFBcUw7QUFDMUwsS0FBSyxnSEFBZ0g7QUFDckgsS0FBSywyRkFBMkY7QUFDaEcsS0FBSyxrRkFBa0Y7QUFDdkYsS0FBSyxzRUFBc0U7QUFDM0UsS0FBSyx5REFBeUQ7QUFDOUQsS0FBSyxpRUFBaUU7QUFDdEUsS0FBSyxtREFBbUQ7QUFDeEQsS0FBSyxzRkFBc0Y7QUFDM0YsS0FBSyx3RUFBd0U7QUFDN0UsS0FBSyxzREFBc0Q7QUFDM0QsS0FBSyx3RkFBd0Y7QUFDN0YsS0FBSyxvRUFBb0U7QUFDekUsS0FBSyxrRkFBa0Y7QUFDdkYsS0FBSyxnREFBZ0Q7QUFDckQsS0FBSywyREFBMkQ7QUFDaEUsS0FBSyxvRUFBb0U7QUFDekUsS0FBSyxrRUFBa0U7QUFDdkUsS0FBSywyREFBMkQ7QUFDaEUsS0FBSywyRkFBMkY7QUFDaEcsS0FBSyxxRkFBcUY7QUFDMUYsS0FBSyxvRUFBb0U7QUFDekUsS0FBSyxpREFBaUQ7QUFDdEQsS0FBSyx1RUFBdUU7QUFDNUUsS0FBSyw2Q0FBNkM7QUFDbEQsS0FB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O0FBQ3ZFLEtBQUssbUdBQW1HO0FBQ3hHLEtBQUssK0ZBQStGO0FBQ3BHLEtBQUssZ0RBQWdEO0FBQ3JELEtBQUssd0VBQXdFO0FBQzdFLEtBQUssMkRBQTJEO0FBQ2hFLEtBQUssd0VBQXdFO0FBQzdFLEtBQUssd0VBQXdFO0FBQzdFLEtBQUsscUVBQXFFO0FBQzFFLEtBQUssc0VBQXNFO0FBQzNFLEtBQUssMkZBQTJGO0FBQ2hHLEtBQUssbUlBQW1JO0FBQ3hJLEtBQUssa0ZBQWtGO0FBQ3ZGLEtBQUssZ0VBQWdFO0FBQ3JFLEtBQUssc0dBQXNHO0FBQzNHLEtBQUssMkRBQTJEO0FBQ2hFLEtBQUssdUZBQXVGO0FBQzVGLEtBQUssMkRBQTJEO0FBQ2hFLEtBQUssMEVBQTBFO0FBQy9FLEtBQUssa0ZBQWtGO0FBQ3ZGO0FBQ0E7QUFDQSxpQkFBaUIsZ0NBQWdDO0FBQ2pEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsbUJBQW1CLGdDQUFnQztBQUNuRDtBQUNBO0FBQ0EscUNBQXFDLHVCQUF1QjtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxtQkFBbUIsZ0NBQWdDO0FBQ25EO0FBQ0EsbUNBQW1DLHFCQUFxQjtBQUN4RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtQkFBbUIsZ0NBQWdDO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxtQkFBbUIsZ0NBQWdDO0FBQ25EO0FBQ0E7QUFDQSxxQ0FBcUMsdUJBQXVCO0FBQzVEO0FBQ0E7QUFDQTtBQUNBLENBQUMiLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29kZW1pcnJvci9tb2RlL21ldGEuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb2RlTWlycm9yLCBjb3B5cmlnaHQgKGMpIGJ5IE1hcmlqbiBIYXZlcmJla2UgYW5kIG90aGVyc1xuLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHBzOi8vY29kZW1pcnJvci5uZXQvTElDRU5TRVxuXG4oZnVuY3Rpb24obW9kKSB7XG4gIGlmICh0eXBlb2YgZXhwb3J0cyA9PSBcIm9iamVjdFwiICYmIHR5cGVvZiBtb2R1bGUgPT0gXCJvYmplY3RcIikgLy8gQ29tbW9uSlNcbiAgICBtb2QocmVxdWlyZShcIi4uL2xpYi9jb2RlbWlycm9yXCIpKTtcbiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkgLy8gQU1EXG4gICAgZGVmaW5lKFtcIi4uL2xpYi9jb2RlbWlycm9yXCJdLCBtb2QpO1xuICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52XG4gICAgbW9kKENvZGVNaXJyb3IpO1xufSkoZnVuY3Rpb24oQ29kZU1pcnJvcikge1xuICBcInVzZSBzdHJpY3RcIjtcblxuICBDb2RlTWlycm9yLm1vZGVJbmZvID0gW1xuICAgIHtuYW1lOiBcIkFQTFwiLCBtaW1lOiBcInRleHQvYXBsXCIsIG1vZGU6IFwiYXBsXCIsIGV4dDogW1wiZHlhbG9nXCIsIFwiYXBsXCJdfSxcbiAgICB7bmFtZTogXCJQR1BcIiwgbWltZXM6IFtcImFwcGxpY2F0aW9uL3BncFwiLCBcImFwcGxpY2F0aW9uL3BncC1lbmNyeXB0ZWRcIiwgXCJhcHBsaWNhdGlvbi9wZ3Ata2V5c1wiLCBcImFwcGxpY2F0aW9uL3BncC1zaWduYXR1cmVcIl0sIG1vZGU6IFwiYXNjaWlhcm1vclwiLCBleHQ6IFtcImFzY1wiLCBcInBncFwiLCBcInNpZ1wiXX0sXG4gICAge25hbWU6IFwiQVNOLjFcIiwgbWltZTogXCJ0ZXh0L3gtdHRjbi1hc25cIiwgbW9kZTogXCJhc24uMVwiLCBleHQ6IFtcImFzblwiLCBcImFzbjFcIl19LFxuICAgIHtuYW1lOiBcIkFzdGVyaXNrXCIsIG1pbWU6IFwidGV4dC94LWFzdGVyaXNrXCIsIG1vZGU6IFwiYXN0ZXJpc2tcIiwgZmlsZTogL15leHRlbnNpb25zXFwuY29uZiQvaX0sXG4gICAge25hbWU6IFwiQnJhaW5mdWNrXCIsIG1pbWU6IFwidGV4dC94LWJyYWluZnVja1wiLCBtb2RlOiBcImJyYWluZnVja1wiLCBleHQ6IFtcImJcIiwgXCJiZlwiXX0sXG4gICAge25hbWU6IFwiQ1wiLCBtaW1lOiBcInRleHQveC1jc3JjXCIsIG1vZGU6IFwiY2xpa2VcIiwgZXh0OiBbXCJjXCIsIFwiaFwiLCBcImlub1wiXX0sXG4gICAge25hbWU6IFwiQysrXCIsIG1pbWU6IFwidGV4dC94LWMrK3NyY1wiLCBtb2RlOiBcImNsaWtlXCIsIGV4dDogW1wiY3BwXCIsIFwiYysrXCIsIFwiY2NcIiwgXCJjeHhcIiwgXCJocHBcIiwgXCJoKytcIiwgXCJoaFwiLCBcImh4eFwiXSwgYWxpYXM6IFtcImNwcFwiXX0sXG4gICAge25hbWU6IFwiQ29ib2xcIiwgbWltZTogXCJ0ZXh0L3gtY29ib2xcIiwgbW9kZTogXCJjb2JvbFwiLCBleHQ6IFtcImNvYlwiLCBcImNweVwiXX0sXG4gICAge25hbWU6IFwiQyNcIiwgbWltZTogXCJ0ZXh0L3gtY3NoYXJwXCIsIG1vZGU6IFwiY2xpa2VcIiwgZXh0OiBbXCJjc1wiXSwgYWxpYXM6IFtcImNzaGFycFwiLCBcImNzXCJdfSxcbiAgICB7bmFtZTogXCJDbG9qdXJlXCIsIG1pbWU6IFwidGV4dC94LWNsb2p1cmVcIiwgbW9kZTogXCJjbG9qdXJlXCIsIGV4dDogW1wiY2xqXCIsIFwiY2xqY1wiLCBcImNsanhcIl19LFxuICAgIHtuYW1lOiBcIkNsb2p1cmVTY3JpcHRcIiwgbWltZTogXCJ0ZXh0L3gtY2xvanVyZXNjcmlwdFwiLCBtb2RlOiBcImNsb2p1cmVcIiwgZXh0OiBbXCJjbGpzXCJdfSxcbiAgICB7bmFtZTogXCJDbG9zdXJlIFN0eWxlc2hlZXRzIChHU1MpXCIsIG1pbWU6IFwidGV4dC94LWdzc1wiLCBtb2RlOiBcImNzc1wiLCBleHQ6IFtcImdzc1wiXX0sXG4gICAge25hbWU6IFwiQ01ha2VcIiwgbWltZTogXCJ0ZXh0L3gtY21ha2VcIiwgbW9kZTogXCJjbWFrZVwiLCBleHQ6IFtcImNtYWtlXCIsIFwiY21ha2UuaW5cIl0sIGZpbGU6IC9eQ01ha2VMaXN0c1xcLnR4dCQvfSxcbiAgICB7bmFtZTogXCJDb2ZmZWVTY3JpcHRcIiwgbWltZXM6IFtcImFwcGxpY2F0aW9uL3ZuZC5jb2ZmZWVzY3JpcHRcIiwgXCJ0ZXh0L2NvZmZlZXNjcmlwdFwiLCBcInRleHQveC1jb2ZmZWVzY3JpcHRcIl0sIG1vZGU6IFwiY29mZmVlc2NyaXB0XCIsIGV4dDogW1wiY29mZmVlXCJdLCBhbGlhczogW1wiY29mZmVlXCIsIFwiY29mZmVlLXNjcmlwdFwiXX0sXG4gICAge25hbWU6IFwiQ29tbW9uIExpc3BcIiwgbWltZTogXCJ0ZXh0L3gtY29tbW9uLWxpc3BcIiwgbW9kZTogXCJjb21tb25saXNwXCIsIGV4dDogW1wiY2xcIiwgXCJsaXNwXCIsIFwiZWxcIl0sIGFsaWFzOiBbXCJsaXNwXCJdfSxcbiAgICB7bmFtZTogXCJDeXBoZXJcIiwgbWltZTogXCJhcHBsaWNhdGlvbi94LWN5cGhlci1xdWVyeVwiLCBtb2RlOiBcImN5cGhlclwiLCBleHQ6IFtcImN5cFwiLCBcImN5cGhlclwiXX0sXG4gICAge25hbWU6IFwiQ3l0aG9uXCIsIG1pbWU6IFwidGV4dC94LWN5dGhvblwiLCBtb2RlOiBcInB5dGhvblwiLCBleHQ6IFtcInB5eFwiLCBcInB4ZFwiLCBcInB4aVwiXX0sXG4gICAge25hbWU6IFwiQ3J5c3RhbFwiLCBtaW1lOiBcInRleHQveC1jcnlzdGFsXCIsIG1vZGU6IFwiY3J5c3RhbFwiLCBleHQ6IFtcImNyXCJdfSxcbiAgICB7bmFtZTogXCJDU1NcIiwgbWltZTogXCJ0ZXh0L2Nzc1wiLCBtb2RlOiBcImNzc1wiLCBleHQ6IFtcImNzc1wiXX0sXG4gICAge25hbWU6IFwiQ1FMXCIsIG1pbWU6IFwidGV4dC94LWNhc3NhbmRyYVwiLCBtb2RlOiBcInNxbFwiLCBleHQ6IFtcImNxbFwiXX0sXG4gICAge25hbWU6IFwiRFwiLCBtaW1lOiBcInRleHQveC1kXCIsIG1vZGU6IFwiZFwiLCBleHQ6IFtcImRcIl19LFxuICAgIHtuYW1lOiBcIkRhcnRcIiwgbWltZXM6IFtcImFwcGxpY2F0aW9uL2RhcnRcIiwgXCJ0ZXh0L3gtZGFydFwiXSwgbW9kZTogXCJkYXJ0XCIsIGV4dDogW1wiZGFydFwiXX0sXG4gICAge25hbWU6IFwiZGlmZlwiLCBtaW1lOiBcInRleHQveC1kaWZmXCIsIG1vZGU6IFwiZGlmZlwiLCBleHQ6IFtcImRpZmZcIiwgXCJwYXRjaFwiXX0sXG4gICAge25hbWU6IFwiRGphbmdvXCIsIG1pbWU6IFwidGV4dC94LWRqYW5nb1wiLCBtb2RlOiBcImRqYW5nb1wifSxcbiAgICB7bmFtZTogXCJEb2NrZXJmaWxlXCIsIG1pbWU6IFwidGV4dC94LWRvY2tlcmZpbGVcIiwgbW9kZTogXCJkb2NrZXJmaWxlXCIsIGZpbGU6IC9eRG9ja2VyZmlsZSQvfSxcbiAgICB7bmFtZTogXCJEVERcIiwgbWltZTogXCJhcHBsaWNhdGlvbi94bWwtZHRkXCIsIG1vZGU6IFwiZHRkXCIsIGV4dDogW1wiZHRkXCJdfSxcbiAgICB7bmFtZTogXCJEeWxhblwiLCBtaW1lOiBcInRleHQveC1keWxhblwiLCBtb2RlOiBcImR5bGFuXCIsIGV4dDogW1wiZHlsYW5cIiwgXCJkeWxcIiwgXCJpbnRyXCJdfSxcbiAgICB7bmFtZTogXCJFQk5GXCIsIG1pbWU6IFwidGV4dC94LWVibmZcIiwgbW9kZTogXCJlYm5mXCJ9LFxuICAgIHtuYW1lOiBcIkVDTFwiLCBtaW1lOiBcInRleHQveC1lY2xcIiwgbW9kZTogXCJlY2xcIiwgZXh0OiBbXCJlY2xcIl19LFxuICAgIHtuYW1lOiBcImVkblwiLCBtaW1lOiBcImFwcGxpY2F0aW9uL2VkblwiLCBtb2RlOiBcImNsb2p1cmVcIiwgZXh0OiBbXCJlZG5cIl19LFxuICAgIHtuYW1lOiBcIkVpZmZlbFwiLCBtaW1lOiBcInRleHQveC1laWZmZWxcIiwgbW9kZTogXCJlaWZmZWxcIiwgZXh0OiBbXCJlXCJdfSxcbiAgICB7bmFtZTogXCJFbG1cIiwgbWltZTogXCJ0ZXh0L3gtZWxtXCIsIG1vZGU6IFwiZWxtXCIsIGV4dDogW1wiZWxtXCJdfSxcbiAgICB7bmFtZTogXCJFbWJlZGRlZCBKYXZhU2NyaXB0XCIsIG1pbWU6IFwiYXBwbGljYXRpb24veC1lanNcIiwgbW9kZTogXCJodG1sZW1iZWRkZWRcIiwgZXh0OiBbXCJlanNcIl19LFxuICAgIHtuYW1lOiBcIkVtYmVkZGVkIFJ1YnlcIiwgbWltZTogXCJhcHBsaWNhdGlvbi94LWVyYlwiLCBtb2RlOiBcImh0bWxlbWJlZGRlZFwiLCBleHQ6IFtcImVyYlwiXX0sXG4gICAge25hbWU6IFwiRXJsYW5nXCIsIG1pbWU6IFwidGV4dC94LWVybGFuZ1wiLCBtb2RlOiBcImVybGFuZ1wiLCBleHQ6IFtcImVybFwiXX0sXG4gICAge25hbWU6IFwiRXNwZXJcIiwgbWltZTogXCJ0ZXh0L3gtZXNwZXJcIiwgbW9kZTogXCJzcWxcIn0sXG4gICAge25hbWU6IFwiRmFjdG9yXCIsIG1pbWU6IFwidGV4dC94LWZhY3RvclwiLCBtb2RlOiBcImZhY3RvclwiLCBleHQ6IFtcImZhY3RvclwiXX0sXG4gICAge25hbWU6IFwiRkNMXCIsIG1pbWU6IFwidGV4dC94LWZjbFwiLCBtb2RlOiBcImZjbFwifSxcbiAgICB7bmFtZTogXCJGb3J0aFwiLCBtaW1lOiBcInRleHQveC1mb3J0aFwiLCBtb2RlOiBcImZvcnRoXCIsIGV4dDogW1wiZm9ydGhcIiwgXCJmdGhcIiwgXCI0dGhcIl19LFxuICAgIHtuYW1lOiBcIkZvcnRyYW5cIiwgbWltZTogXCJ0ZXh0L3gtZm9ydHJhblwiLCBtb2RlOiBcImZvcnRyYW5cIiwgZXh0OiBbXCJmXCIsIFwiZm9yXCIsIFwiZjc3XCIsIFwiZjkwXCIsIFwiZjk1XCJdfSxcbiAgICB7bmFtZTogXCJGI1wiLCBtaW1lOiBcInRleHQveC1mc2hhcnBcIiwgbW9kZTogXCJtbGxpa2VcIiwgZXh0OiBbXCJmc1wiXSwgYWxpYXM6IFtcImZzaGFycFwiXX0sXG4gICAge25hbWU6IFwiR2FzXCIsIG1pbWU6IFwidGV4dC94LWdhc1wiLCBtb2RlOiBcImdhc1wiLCBleHQ6IFtcInNcIl19LFxuICAgIHtuYW1lOiBcIkdoZXJraW5cIiwgbWltZTogXCJ0ZXh0L3gtZmVhdHVyZVwiLCBtb2RlOiBcImdoZXJraW5cIiwgZXh0OiBbXCJmZWF0dXJlXCJdfSxcbiAgICB7bmFtZTogXCJHaXRIdWIgRmxhdm9yZWQgTWFya2Rvd25cIiwgbWltZTogXCJ0ZXh0L3gtZ2ZtXCIsIG1vZGU6IFwiZ2ZtXCIsIGZpbGU6IC9eKHJlYWRtZXxjb250cmlidXRpbmd8aGlzdG9yeSlcXC5tZCQvaX0sXG4gICAge25hbWU6IFwiR29cIiwgbWltZTogXCJ0ZXh0L3gtZ29cIiwgbW9kZTogXCJnb1wiLCBleHQ6IFtcImdvXCJdfSxcbiAgICB7bmFtZTogXCJHcm9vdnlcIiwgbWltZTogXCJ0ZXh0L3gtZ3Jvb3Z5XCIsIG1vZGU6IFwiZ3Jvb3Z5XCIsIGV4dDogW1wiZ3Jvb3Z5XCIsIFwiZ3JhZGxlXCJdLCBmaWxlOiAvXkplbmtpbnNmaWxlJC99LFxuICAgIHtuYW1lOiBcIkhBTUxcIiwgbWltZTogXCJ0ZXh0L3gtaGFtbFwiLCBtb2RlOiBcImhhbWxcIiwgZXh0OiBbXCJoYW1sXCJdfSxcbiAgICB7bmFtZTogXCJIYXNrZWxsXCIsIG1pbWU6IFwidGV4dC94LWhhc2tlbGxcIiwgbW9kZTogXCJoYXNrZWxsXCIsIGV4dDogW1wiaHNcIl19LFxuICAgIHtuYW1lOiBcIkhhc2tlbGwgKExpdGVyYXRlKVwiLCBtaW1lOiBcInRleHQveC1saXRlcmF0ZS1oYXNrZWxsXCIsIG1vZGU6IFwiaGFza2VsbC1saXRlcmF0ZVwiLCBleHQ6IFtcImxoc1wiXX0sXG4gICAge25hbWU6IFwiSGF4ZVwiLCBtaW1lOiBcInRleHQveC1oYXhlXCIsIG1vZGU6IFwiaGF4ZVwiLCBleHQ6IFtcImh4XCJdfSxcbiAgICB7bmFtZTogXCJIWE1MXCIsIG1pbWU6IFwidGV4dC94LWh4bWxcIiwgbW9kZTogXCJoYXhlXCIsIGV4dDogW1wiaHhtbFwiXX0sXG4gICAge25hbWU6IFwiQVNQLk5FVFwiLCBtaW1lOiBcImFwcGxpY2F0aW9uL3gtYXNweFwiLCBtb2RlOiBcImh0bWxlbWJlZGRlZFwiLCBleHQ6IFtcImFzcHhcIl0sIGFsaWFzOiBbXCJhc3BcIiwgXCJhc3B4XCJdfSxcbiAgICB7bmFtZTogXCJIVE1MXCIsIG1pbWU6IFwidGV4dC9odG1sXCIsIG1vZGU6IFwiaHRtbG1peGVkXCIsIGV4dDogW1wiaHRtbFwiLCBcImh0bVwiLCBcImhhbmRsZWJhcnNcIiwgXCJoYnNcIl0sIGFsaWFzOiBbXCJ4aHRtbFwiXX0sXG4gICAge25hbWU6IFwiSFRUUFwiLCBtaW1lOiBcIm1lc3NhZ2UvaHR0cFwiLCBtb2RlOiBcImh0dHBcIn0sXG4gICAge25hbWU6IFwiSURMXCIsIG1pbWU6IFwidGV4dC94LWlkbFwiLCBtb2RlOiBcImlkbFwiLCBleHQ6IFtcInByb1wiXX0sXG4gICAge25hbWU6IFwiUHVnXCIsIG1pbWU6IFwidGV4dC94LXB1Z1wiLCBtb2RlOiBcInB1Z1wiLCBleHQ6IFtcImphZGVcIiwgXCJwdWdcIl0sIGFsaWFzOiBbXCJqYWRlXCJdfSxcbiAgICB7bmFtZTogXCJKYXZhXCIsIG1pbWU6IFwidGV4dC94LWphdmFcIiwgbW9kZTogXCJjbGlrZVwiLCBleHQ6IFtcImphdmFcIl19LFxuICAgIHtuYW1lOiBcIkphdmEgU2VydmVyIFBhZ2VzXCIsIG1pbWU6IFwiYXBwbGljYXRpb24veC1qc3BcIiwgbW9kZTogXCJodG1sZW1iZWRkZWRcIiwgZXh0OiBbXCJqc3BcIl0sIGFsaWFzOiBbXCJqc3BcIl19LFxuICAgIHtuYW1lOiBcIkphdmFTY3JpcHRcIiwgbWltZXM6IFtcInRleHQvamF2YXNjcmlwdFwiLCBcInRleHQvZWNtYXNjcmlwdFwiLCBcImFwcGxpY2F0aW9uL2phdmFzY3JpcHRcIiwgXCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHRcIiwgXCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0XCJdLFxuICAgICBtb2RlOiBcImphdmFzY3JpcHRcIiwgZXh0OiBbXCJqc1wiXSwgYWxpYXM6IFtcImVjbWFzY3JpcHRcIiwgXCJqc1wiLCBcIm5vZGVcIl19LFxuICAgIHtuYW1lOiBcIkpTT05cIiwgbWltZXM6IFtcImFwcGxpY2F0aW9uL2pzb25cIiwgXCJhcHBsaWNhdGlvbi94LWpzb25cIl0sIG1vZGU6IFwiamF2YXNjcmlwdFwiLCBleHQ6IFtcImpzb25cIiwgXCJtYXBcIl0sIGFsaWFzOiBbXCJqc29uNVwiXX0sXG4gICAge25hbWU6IFwiSlNPTi1MRFwiLCBtaW1lOiBcImFwcGxpY2F0aW9uL2xkK2pzb25cIiwgbW9kZTogXCJqYXZhc2NyaXB0XCIsIGV4dDogW1wianNvbmxkXCJdLCBhbGlhczogW1wianNvbmxkXCJdfSxcbiAgICB7bmFtZTogXCJKU1hcIiwgbWltZTogXCJ0ZXh0L2pzeFwiLCBtb2RlOiBcImpzeFwiLCBleHQ6IFtcImpzeFwiXX0sXG4gICAge25hbWU6IFwiSmluamEyXCIsIG1pbWU6IFwidGV4dC9qaW5qYTJcIiwgbW9kZTogXCJqaW5qYTJcIiwgZXh0OiBbXCJqMlwiLCBcImppbmphXCIsIFwiamluamEyXCJdfSxcbiAgICB7bmFtZTogXCJKdWxpYVwiLCBtaW1lOiBcInRleHQveC1qdWxpYVwiLCBtb2RlOiBcImp1bGlhXCIsIGV4dDogW1wiamxcIl0sIGFsaWFzOiBbXCJqbFwiXX0sXG4gICAge25hbWU6IFwiS290bGluXCIsIG1pbWU6IFwidGV4dC94LWtvdGxpblwiLCBtb2RlOiBcImNsaWtlXCIsIGV4dDogW1wia3RcIl19LFxuICAgIHtuYW1lOiBcIkxFU1NcIiwgbWltZTogXCJ0ZXh0L3gtbGVzc1wiLCBtb2RlOiBcImNzc1wiLCBleHQ6IFtcImxlc3NcIl19LFxuICAgIHtuYW1lOiBcIkxpdmVTY3JpcHRcIiwgbWltZTogXCJ0ZXh0L3gtbGl2ZXNjcmlwdFwiLCBtb2RlOiBcImxpdmVzY3JpcHRcIiwgZXh0OiBbXCJsc1wiXSwgYWxpYXM6IFtcImxzXCJdfSxcbiAgICB7bmFtZTogXCJMdWFcIiwgbWltZTogXCJ0ZXh0L3gtbHVhXCIsIG1vZGU6IFwibHVhXCIsIGV4dDogW1wibHVhXCJdfSxcbiAgICB7bmFtZTogXCJNYXJrZG93blwiLCBtaW1lOiBcInRleHQveC1tYXJrZG93blwiLCBtb2RlOiBcIm1hcmtkb3duXCIsIGV4dDogW1wibWFya2Rvd25cIiwgXCJtZFwiLCBcIm1rZFwiXX0sXG4gICAge25hbWU6IFwibUlSQ1wiLCBtaW1lOiBcInRleHQvbWlyY1wiLCBtb2RlOiBcIm1pcmNcIn0sXG4gICAge25hbWU6IFwiTWFyaWFEQiBTUUxcIiwgbWltZTogXCJ0ZXh0L3gtbWFyaWFkYlwiLCBtb2RlOiBcInNxbFwifSxcbiAgICB7bmFtZTogXCJNYXRoZW1hdGljYVwiLCBtaW1lOiBcInRleHQveC1tYXRoZW1hdGljYVwiLCBtb2RlOiBcIm1hdGhlbWF0aWNhXCIsIGV4dDogW1wibVwiLCBcIm5iXCIsIFwid2xcIiwgXCJ3bHNcIl19LFxuICAgIHtuYW1lOiBcIk1vZGVsaWNhXCIsIG1pbWU6IFwidGV4dC94LW1vZGVsaWNhXCIsIG1vZGU6IFwibW9kZWxpY2FcIiwgZXh0OiBbXCJtb1wiXX0sXG4gICAge25hbWU6IFwiTVVNUFNcIiwgbWltZTogXCJ0ZXh0L3gtbXVtcHNcIiwgbW9kZTogXCJtdW1wc1wiLCBleHQ6IFtcIm1wc1wiXX0sXG4gICAge25hbWU6IFwiTVMgU1FMXCIsIG1pbWU6IFwidGV4dC94LW1zc3FsXCIsIG1vZGU6IFwic3FsXCJ9LFxuICAgIHtuYW1lOiBcIm1ib3hcIiwgbWltZTogXCJhcHBsaWNhdGlvbi9tYm94XCIsIG1vZGU6IFwibWJveFwiLCBleHQ6IFtcIm1ib3hcIl19LFxuICAgIHtuYW1lOiBcIk15U1FMXCIsIG1pbWU6IFwidGV4dC94LW15c3FsXCIsIG1vZGU6IFwic3FsXCJ9LFxuICAgIHtuYW1lOiBcIk5naW54XCIsIG1pbWU6IFwidGV4dC94LW5naW54LWNvbmZcIiwgbW9kZTogXCJuZ2lueFwiLCBmaWxlOiAvbmdpbnguKlxcLmNvbmYkL2l9LFxuICAgIHtuYW1lOiBcIk5TSVNcIiwgbWltZTogXCJ0ZXh0L3gtbnNpc1wiLCBtb2RlOiBcIm5zaXNcIiwgZXh0OiBbXCJuc2hcIiwgXCJuc2lcIl19LFxuICAgIHtuYW1lOiBcIk5UcmlwbGVzXCIsIG1pbWVzOiBbXCJhcHBsaWNhdGlvbi9uLXRyaXBsZXNcIiwgXCJhcHBsaWNhdGlvbi9uLXF1YWRzXCIsIFwidGV4dC9uLXRyaXBsZXNcIl0sXG4gICAgIG1vZGU6IFwibnRyaXBsZXNcIiwgZXh0OiBbXCJudFwiLCBcIm5xXCJdfSxcbiAgICB7bmFtZTogXCJPYmplY3RpdmUtQ1wiLCBtaW1lOiBcInRleHQveC1vYmplY3RpdmVjXCIsIG1vZGU6IFwiY2xpa2VcIiwgZXh0OiBbXCJtXCJdLCBhbGlhczogW1wib2JqZWN0aXZlLWNcIiwgXCJvYmpjXCJdfSxcbiAgICB7bmFtZTogXCJPYmplY3RpdmUtQysrXCIsIG1pbWU6IFwidGV4dC94LW9iamVjdGl2ZWMrK1wiLCBtb2RlOiBcImNsaWtlXCIsIGV4dDogW1wibW1cIl0sIGFsaWFzOiBbXCJvYmplY3RpdmUtYysrXCIsIFwib2JqYysrXCJdfSxcbiAgICB7bmFtZTogXCJPQ2FtbFwiLCBtaW1lOiBcInRleHQveC1vY2FtbFwiLCBtb2RlOiBcIm1sbGlrZVwiLCBleHQ6IFtcIm1sXCIsIFwibWxpXCIsIFwibWxsXCIsIFwibWx5XCJdfSxcbiAgICB7bmFtZTogXCJPY3RhdmVcIiwgbWltZTogXCJ0ZXh0L3gtb2N0YXZlXCIsIG1vZGU6IFwib2N0YXZlXCIsIGV4dDogW1wibVwiXX0sXG4gICAge25hbWU6IFwiT3pcIiwgbWltZTogXCJ0ZXh0L3gtb3pcIiwgbW9kZTogXCJvelwiLCBleHQ6IFtcIm96XCJdfSxcbiAgICB7bmFtZTogXCJQYXNjYWxcIiwgbWltZTogXCJ0ZXh0L3gtcGFzY2FsXCIsIG1vZGU6IFwicGFzY2FsXCIsIGV4dDogW1wicFwiLCBcInBhc1wiXX0sXG4gICAge25hbWU6IFwiUEVHLmpzXCIsIG1pbWU6IFwibnVsbFwiLCBtb2RlOiBcInBlZ2pzXCIsIGV4dDogW1wianNvbmxkXCJdfSxcbiAgICB7bmFtZTogXCJQZXJsXCIsIG1pbWU6IFwidGV4dC94LXBlcmxcIiwgbW9kZTogXCJwZXJsXCIsIGV4dDogW1wicGxcIiwgXCJwbVwiXX0sXG4gICAge25hbWU6IFwiUEhQXCIsIG1pbWVzOiBbXCJ0ZXh0L3gtcGhwXCIsIFwiYXBwbGljYXRpb24veC1odHRwZC1waHBcIiwgXCJhcHBsaWNhdGlvbi94LWh0dHBkLXBocC1vcGVuXCJdLCBtb2RlOiBcInBocFwiLCBleHQ6IFtcInBocFwiLCBcInBocDNcIiwgXCJwaHA0XCIsIFwicGhwNVwiLCBcInBocDdcIiwgXCJwaHRtbFwiXX0sXG4gICAge25hbWU6IFwiUGlnXCIsIG1pbWU6IFwidGV4dC94LXBpZ1wiLCBtb2RlOiBcInBpZ1wiLCBleHQ6IFtcInBpZ1wiXX0sXG4gICAge25hbWU6IFwiUGxhaW4gVGV4dFwiLCBtaW1lOiBcInRleHQvcGxhaW5cIiwgbW9kZTogXCJudWxsXCIsIGV4dDogW1widHh0XCIsIFwidGV4dFwiLCBcImNvbmZcIiwgXCJkZWZcIiwgXCJsaXN0XCIsIFwibG9nXCJdfSxcbiAgICB7bmFtZTogXCJQTFNRTFwiLCBtaW1lOiBcInRleHQveC1wbHNxbFwiLCBtb2RlOiBcInNxbFwiLCBleHQ6IFtcInBsc1wiXX0sXG4gICAge25hbWU6IFwiUG9zdGdyZVNRTFwiLCBtaW1lOiBcInRleHQveC1wZ3NxbFwiLCBtb2RlOiBcInNxbFwifSxcbiAgICB7bmFtZTogXCJQb3dlclNoZWxsXCIsIG1pbWU6IFwiYXBwbGljYXRpb24veC1wb3dlcnNoZWxsXCIsIG1vZGU6IFwicG93ZXJzaGVsbFwiLCBleHQ6IFtcInBzMVwiLCBcInBzZDFcIiwgXCJwc20xXCJdfSxcbiAgICB7bmFtZTogXCJQcm9wZXJ0aWVzIGZpbGVzXCIsIG1pbWU6IFwidGV4dC94LXByb3BlcnRpZXNcIiwgbW9kZTogXCJwcm9wZXJ0aWVzXCIsIGV4dDogW1wicHJvcGVydGllc1wiLCBcImluaVwiLCBcImluXCJdLCBhbGlhczogW1wiaW5pXCIsIFwicHJvcGVydGllc1wiXX0sXG4gICAge25hbWU6IFwiUHJvdG9CdWZcIiwgbWltZTogXCJ0ZXh0L3gtcHJvdG9idWZcIiwgbW9kZTogXCJwcm90b2J1ZlwiLCBleHQ6IFtcInByb3RvXCJdfSxcbiAgICB7bmFtZTogXCJQeXRob25cIiwgbWltZTogXCJ0ZXh0L3gtcHl0aG9uXCIsIG1vZGU6IFwicHl0aG9uXCIsIGV4dDogW1wiQlVJTERcIiwgXCJiemxcIiwgXCJweVwiLCBcInB5d1wiXSwgZmlsZTogL14oQlVDS3xCVUlMRCkkL30sXG4gICAge25hbWU6IFwiUHVwcGV0XCIsIG1pbWU6IFwidGV4dC94LXB1cHBldFwiLCBtb2RlOiBcInB1cHBldFwiLCBleHQ6IFtcInBwXCJdfSxcbiAgICB7bmFtZTogXCJRXCIsIG1pbWU6IFwidGV4dC94LXFcIiwgbW9kZTogXCJxXCIsIGV4dDogW1wicVwiXX0sXG4gICAge25hbWU6IFwiUlwiLCBtaW1lOiBcInRleHQveC1yc3JjXCIsIG1vZGU6IFwiclwiLCBleHQ6IFtcInJcIiwgXCJSXCJdLCBhbGlhczogW1wicnNjcmlwdFwiXX0sXG4gICAge25hbWU6IFwicmVTdHJ1Y3R1cmVkVGV4dFwiLCBtaW1lOiBcInRleHQveC1yc3RcIiwgbW9kZTogXCJyc3RcIiwgZXh0OiBbXCJyc3RcIl0sIGFsaWFzOiBbXCJyc3RcIl19LFxuICAgIHtuYW1lOiBcIlJQTSBDaGFuZ2VzXCIsIG1pbWU6IFwidGV4dC94LXJwbS1jaGFuZ2VzXCIsIG1vZGU6IFwicnBtXCJ9LFxuICAgIHtuYW1lOiBcIlJQTSBTcGVjXCIsIG1pbWU6IFwidGV4dC94LXJwbS1zcGVjXCIsIG1vZGU6IFwicnBtXCIsIGV4dDogW1wic3BlY1wiXX0sXG4gICAge25hbWU6IFwiUnVieVwiLCBtaW1lOiBcInRleHQveC1ydWJ5XCIsIG1vZGU6IFwicnVieVwiLCBleHQ6IFtcInJiXCJdLCBhbGlhczogW1wianJ1YnlcIiwgXCJtYWNydWJ5XCIsIFwicmFrZVwiLCBcInJiXCIsIFwicmJ4XCJdfSxcbiAgICB7bmFtZTogXCJSdXN0XCIsIG1pbWU6IFwidGV4dC94LXJ1c3RzcmNcIiwgbW9kZTogXCJydXN0XCIsIGV4dDogW1wicnNcIl19LFxuICAgIHtuYW1lOiBcIlNBU1wiLCBtaW1lOiBcInRleHQveC1zYXNcIiwgbW9kZTogXCJzYXNcIiwgZXh0OiBbXCJzYXNcIl19LFxuICAgIHtuYW1lOiBcIlNhc3NcIiwgbWltZTogXCJ0ZXh0L3gtc2Fzc1wiLCBtb2RlOiBcInNhc3NcIiwgZXh0OiBbXCJzYXNzXCJdfSxcbiAgICB7bmFtZTogXCJTY2FsYVwiLCBtaW1lOiBcInRleHQveC1zY2FsYVwiLCBtb2RlOiBcImNsaWtlXCIsIGV4dDogW1wic2NhbGFcIl19LFxuICAgIHtuYW1lOiBcIlNjaGVtZVwiLCBtaW1lOiBcInRleHQveC1zY2hlbWVcIiwgbW9kZTogXCJzY2hlbWVcIiwgZXh0OiBbXCJzY21cIiwgXCJzc1wiXX0sXG4gICAge25hbWU6IFwiU0NTU1wiLCBtaW1lOiBcInRleHQveC1zY3NzXCIsIG1vZGU6IFwiY3NzXCIsIGV4dDogW1wic2Nzc1wiXX0sXG4gICAge25hbWU6IFwiU2hlbGxcIiwgbWltZXM6IFtcInRleHQveC1zaFwiLCBcImFwcGxpY2F0aW9uL3gtc2hcIl0sIG1vZGU6IFwic2hlbGxcIiwgZXh0OiBbXCJzaFwiLCBcImtzaFwiLCBcImJhc2hcIl0sIGFsaWFzOiBbXCJiYXNoXCIsIFwic2hcIiwgXCJ6c2hcIl0sIGZpbGU6IC9eUEtHQlVJTEQkL30sXG4gICAge25hbWU6IFwiU2lldmVcIiwgbWltZTogXCJhcHBsaWNhdGlvbi9zaWV2ZVwiLCBtb2RlOiBcInNpZXZlXCIsIGV4dDogW1wic2l2XCIsIFwic2lldmVcIl19LFxuICAgIHtuYW1lOiBcIlNsaW1cIiwgbWltZXM6IFtcInRleHQveC1zbGltXCIsIFwiYXBwbGljYXRpb24veC1zbGltXCJdLCBtb2RlOiBcInNsaW1cIiwgZXh0OiBbXCJzbGltXCJdfSxcbiAgICB7bmFtZTogXCJTbWFsbHRhbGtcIiwgbWltZTogXCJ0ZXh0L3gtc3RzcmNcIiwgbW9kZTogXCJzbWFsbHRhbGtcIiwgZXh0OiBbXCJzdFwiXX0sXG4gICAge25hbWU6IFwiU21hcnR5XCIsIG1pbWU6IFwidGV4dC94LXNtYXJ0eVwiLCBtb2RlOiBcInNtYXJ0eVwiLCBleHQ6IFtcInRwbFwiXX0sXG4gICAge25hbWU6IFwiU29sclwiLCBtaW1lOiBcInRleHQveC1zb2xyXCIsIG1vZGU6IFwic29sclwifSxcbiAgICB7bmFtZTogXCJTTUxcIiwgbWltZTogXCJ0ZXh0L3gtc21sXCIsIG1vZGU6IFwibWxsaWtlXCIsIGV4dDogW1wic21sXCIsIFwic2lnXCIsIFwiZnVuXCIsIFwic21hY2tzcGVjXCJdfSxcbiAgICB7bmFtZTogXCJTb3lcIiwgbWltZTogXCJ0ZXh0L3gtc295XCIsIG1vZGU6IFwic295XCIsIGV4dDogW1wic295XCJdLCBhbGlhczogW1wiY2xvc3VyZSB0ZW1wbGF0ZVwiXX0sXG4gICAge25hbWU6IFwiU1BBUlFMXCIsIG1pbWU6IFwiYXBwbGljYXRpb24vc3BhcnFsLXF1ZXJ5XCIsIG1vZGU6IFwic3BhcnFsXCIsIGV4dDogW1wicnFcIiwgXCJzcGFycWxcIl0sIGFsaWFzOiBbXCJzcGFydWxcIl19LFxuICAgIHtuYW1lOiBcIlNwcmVhZHNoZWV0XCIsIG1pbWU6IFwidGV4dC94LXNwcmVhZHNoZWV0XCIsIG1vZGU6IFwic3ByZWFkc2hlZXRcIiwgYWxpYXM6IFtcImV4Y2VsXCIsIFwiZm9ybXVsYVwiXX0sXG4gICAge25hbWU6IFwiU1FMXCIsIG1pbWU6IFwidGV4dC94LXNxbFwiLCBtb2RlOiBcInNxbFwiLCBleHQ6IFtcInNxbFwiXX0sXG4gICAge25hbWU6IFwiU1FMaXRlXCIsIG1pbWU6IFwidGV4dC94LXNxbGl0ZVwiLCBtb2RlOiBcInNxbFwifSxcbiAgICB7bmFtZTogXCJTcXVpcnJlbFwiLCBtaW1lOiBcInRleHQveC1zcXVpcnJlbFwiLCBtb2RlOiBcImNsaWtlXCIsIGV4dDogW1wibnV0XCJdfSxcbiAgICB7bmFtZTogXCJTdHlsdXNcIiwgbWltZTogXCJ0ZXh0L3gtc3R5bFwiLCBtb2RlOiBcInN0eWx1c1wiLCBleHQ6IFtcInN0eWxcIl19LFxuICAgIHtuYW1lOiBcIlN3aWZ0XCIsIG1pbWU6IFwidGV4dC94LXN3aWZ0XCIsIG1vZGU6IFwic3dpZnRcIiwgZXh0OiBbXCJzd2lmdFwiXX0sXG4gICAge25hbWU6IFwic1RlWFwiLCBtaW1lOiBcInRleHQveC1zdGV4XCIsIG1vZGU6IFwic3RleFwifSxcbiAgICB7bmFtZTogXCJMYVRlWFwiLCBtaW1lOiBcInRleHQveC1sYXRleFwiLCBtb2RlOiBcInN0ZXhcIiwgZXh0OiBbXCJ0ZXh0XCIsIFwibHR4XCIsIFwidGV4XCJdLCBhbGlhczogW1widGV4XCJdfSxcbiAgICB7bmFtZTogXCJTeXN0ZW1WZXJpbG9nXCIsIG1pbWU6IFwidGV4dC94LXN5c3RlbXZlcmlsb2dcIiwgbW9kZTogXCJ2ZXJpbG9nXCIsIGV4dDogW1widlwiLCBcInN2XCIsIFwic3ZoXCJdfSxcbiAgICB7bmFtZTogXCJUY2xcIiwgbWltZTogXCJ0ZXh0L3gtdGNsXCIsIG1vZGU6IFwidGNsXCIsIGV4dDogW1widGNsXCJdfSxcbiAgICB7bmFtZTogXCJUZXh0aWxlXCIsIG1pbWU6IFwidGV4dC94LXRleHRpbGVcIiwgbW9kZTogXCJ0ZXh0aWxlXCIsIGV4dDogW1widGV4dGlsZVwiXX0sXG4gICAge25hbWU6IFwiVGlkZGx5V2lraVwiLCBtaW1lOiBcInRleHQveC10aWRkbHl3aWtpXCIsIG1vZGU6IFwidGlkZGx5d2lraVwifSxcbiAgICB7bmFtZTogXCJUaWtpIHdpa2lcIiwgbWltZTogXCJ0ZXh0L3Rpa2lcIiwgbW9kZTogXCJ0aWtpXCJ9LFxuICAgIHtuYW1lOiBcIlRPTUxcIiwgbWltZTogXCJ0ZXh0L3gtdG9tbFwiLCBtb2RlOiBcInRvbWxcIiwgZXh0OiBbXCJ0b21sXCJdfSxcbiAgICB7bmFtZTogXCJUb3JuYWRvXCIsIG1pbWU6IFwidGV4dC94LXRvcm5hZG9cIiwgbW9kZTogXCJ0b3JuYWRvXCJ9LFxuICAgIHtuYW1lOiBcInRyb2ZmXCIsIG1pbWU6IFwidGV4dC90cm9mZlwiLCBtb2RlOiBcInRyb2ZmXCIsIGV4dDogW1wiMVwiLCBcIjJcIiwgXCIzXCIsIFwiNFwiLCBcIjVcIiwgXCI2XCIsIFwiN1wiLCBcIjhcIiwgXCI5XCJdfSxcbiAgICB7bmFtZTogXCJUVENOXCIsIG1pbWU6IFwidGV4dC94LXR0Y25cIiwgbW9kZTogXCJ0dGNuXCIsIGV4dDogW1widHRjblwiLCBcInR0Y24zXCIsIFwidHRjbnBwXCJdfSxcbiAgICB7bmFtZTogXCJUVENOX0NGR1wiLCBtaW1lOiBcInRleHQveC10dGNuLWNmZ1wiLCBtb2RlOiBcInR0Y24tY2ZnXCIsIGV4dDogW1wiY2ZnXCJdfSxcbiAgICB7bmFtZTogXCJUdXJ0bGVcIiwgbWltZTogXCJ0ZXh0L3R1cnRsZVwiLCBtb2RlOiBcInR1cnRsZVwiLCBleHQ6IFtcInR0bFwiXX0sXG4gICAge25hbWU6IFwiVHlwZVNjcmlwdFwiLCBtaW1lOiBcImFwcGxpY2F0aW9uL3R5cGVzY3JpcHRcIiwgbW9kZTogXCJqYXZhc2NyaXB0XCIsIGV4dDogW1widHNcIl0sIGFsaWFzOiBbXCJ0c1wiXX0sXG4gICAge25hbWU6IFwiVHlwZVNjcmlwdC1KU1hcIiwgbWltZTogXCJ0ZXh0L3R5cGVzY3JpcHQtanN4XCIsIG1vZGU6IFwianN4XCIsIGV4dDogW1widHN4XCJdLCBhbGlhczogW1widHN4XCJdfSxcbiAgICB7bmFtZTogXCJUd2lnXCIsIG1pbWU6IFwidGV4dC94LXR3aWdcIiwgbW9kZTogXCJ0d2lnXCJ9LFxuICAgIHtuYW1lOiBcIldlYiBJRExcIiwgbWltZTogXCJ0ZXh0L3gtd2ViaWRsXCIsIG1vZGU6IFwid2ViaWRsXCIsIGV4dDogW1wid2ViaWRsXCJdfSxcbiAgICB7bmFtZTogXCJWQi5ORVRcIiwgbWltZTogXCJ0ZXh0L3gtdmJcIiwgbW9kZTogXCJ2YlwiLCBleHQ6IFtcInZiXCJdfSxcbiAgICB7bmFtZTogXCJWQlNjcmlwdFwiLCBtaW1lOiBcInRleHQvdmJzY3JpcHRcIiwgbW9kZTogXCJ2YnNjcmlwdFwiLCBleHQ6IFtcInZic1wiXX0sXG4gICAge25hbWU6IFwiVmVsb2NpdHlcIiwgbWltZTogXCJ0ZXh0L3ZlbG9jaXR5XCIsIG1vZGU6IFwidmVsb2NpdHlcIiwgZXh0OiBbXCJ2dGxcIl19LFxuICAgIHtuYW1lOiBcIlZlcmlsb2dcIiwgbWltZTogXCJ0ZXh0L3gtdmVyaWxvZ1wiLCBtb2RlOiBcInZlcmlsb2dcIiwgZXh0OiBbXCJ2XCJdfSxcbiAgICB7bmFtZTogXCJWSERMXCIsIG1pbWU6IFwidGV4dC94LXZoZGxcIiwgbW9kZTogXCJ2aGRsXCIsIGV4dDogW1widmhkXCIsIFwidmhkbFwiXX0sXG4gICAge25hbWU6IFwiVnVlLmpzIENvbXBvbmVudFwiLCBtaW1lczogW1wic2NyaXB0L3gtdnVlXCIsIFwidGV4dC94LXZ1ZVwiXSwgbW9kZTogXCJ2dWVcIiwgZXh0OiBbXCJ2dWVcIl19LFxuICAgIHtuYW1lOiBcIlhNTFwiLCBtaW1lczogW1wiYXBwbGljYXRpb24veG1sXCIsIFwidGV4dC94bWxcIl0sIG1vZGU6IFwieG1sXCIsIGV4dDogW1wieG1sXCIsIFwieHNsXCIsIFwieHNkXCIsIFwic3ZnXCJdLCBhbGlhczogW1wicnNzXCIsIFwid3NkbFwiLCBcInhzZFwiXX0sXG4gICAge25hbWU6IFwiWFF1ZXJ5XCIsIG1pbWU6IFwiYXBwbGljYXRpb24veHF1ZXJ5XCIsIG1vZGU6IFwieHF1ZXJ5XCIsIGV4dDogW1wieHlcIiwgXCJ4cXVlcnlcIl19LFxuICAgIHtuYW1lOiBcIllhY2FzXCIsIG1pbWU6IFwidGV4dC94LXlhY2FzXCIsIG1vZGU6IFwieWFjYXNcIiwgZXh0OiBbXCJ5c1wiXX0sXG4gICAge25hbWU6IFwiWUFNTFwiLCBtaW1lczogW1widGV4dC94LXlhbWxcIiwgXCJ0ZXh0L3lhbWxcIl0sIG1vZGU6IFwieWFtbFwiLCBleHQ6IFtcInlhbWxcIiwgXCJ5bWxcIl0sIGFsaWFzOiBbXCJ5bWxcIl19LFxuICAgIHtuYW1lOiBcIlo4MFwiLCBtaW1lOiBcInRleHQveC16ODBcIiwgbW9kZTogXCJ6ODBcIiwgZXh0OiBbXCJ6ODBcIl19LFxuICAgIHtuYW1lOiBcIm1zY2dlblwiLCBtaW1lOiBcInRleHQveC1tc2NnZW5cIiwgbW9kZTogXCJtc2NnZW5cIiwgZXh0OiBbXCJtc2NnZW5cIiwgXCJtc2NpblwiLCBcIm1zY1wiXX0sXG4gICAge25hbWU6IFwieHVcIiwgbWltZTogXCJ0ZXh0L3gteHVcIiwgbW9kZTogXCJtc2NnZW5cIiwgZXh0OiBbXCJ4dVwiXX0sXG4gICAge25hbWU6IFwibXNnZW5ueVwiLCBtaW1lOiBcInRleHQveC1tc2dlbm55XCIsIG1vZGU6IFwibXNjZ2VuXCIsIGV4dDogW1wibXNnZW5ueVwiXX0sXG4gICAge25hbWU6IFwiV2ViQXNzZW1ibHlcIiwgbWltZTogXCJ0ZXh0L3dlYmFzc2VtYmx5XCIsIG1vZGU6IFwid2FzdFwiLCBleHQ6IFtcIndhdFwiLCBcIndhc3RcIl19LFxuICBdO1xuICAvLyBFbnN1cmUgYWxsIG1vZGVzIGhhdmUgYSBtaW1lIHByb3BlcnR5IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICBmb3IgKHZhciBpID0gMDsgaSA8IENvZGVNaXJyb3IubW9kZUluZm8ubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgaW5mbyA9IENvZGVNaXJyb3IubW9kZUluZm9baV07XG4gICAgaWYgKGluZm8ubWltZXMpIGluZm8ubWltZSA9IGluZm8ubWltZXNbMF07XG4gIH1cblxuICBDb2RlTWlycm9yLmZpbmRNb2RlQnlNSU1FID0gZnVuY3Rpb24obWltZSkge1xuICAgIG1pbWUgPSBtaW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBDb2RlTWlycm9yLm1vZGVJbmZvLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaW5mbyA9IENvZGVNaXJyb3IubW9kZUluZm9baV07XG4gICAgICBpZiAoaW5mby5taW1lID09IG1pbWUpIHJldHVybiBpbmZvO1xuICAgICAgaWYgKGluZm8ubWltZXMpIGZvciAodmFyIGogPSAwOyBqIDwgaW5mby5taW1lcy5sZW5ndGg7IGorKylcbiAgICAgICAgaWYgKGluZm8ubWltZXNbal0gPT0gbWltZSkgcmV0dXJuIGluZm87XG4gICAgfVxuICAgIGlmICgvXFwreG1sJC8udGVzdChtaW1lKSkgcmV0dXJuIENvZGVNaXJyb3IuZmluZE1vZGVCeU1JTUUoXCJhcHBsaWNhdGlvbi94bWxcIilcbiAgICBpZiAoL1xcK2pzb24kLy50ZXN0KG1pbWUpKSByZXR1cm4gQ29kZU1pcnJvci5maW5kTW9kZUJ5TUlNRShcImFwcGxpY2F0aW9uL2pzb25cIilcbiAgfTtcblxuICBDb2RlTWlycm9yLmZpbmRNb2RlQnlFeHRlbnNpb24gPSBmdW5jdGlvbihleHQpIHtcbiAgICBleHQgPSBleHQudG9Mb3dlckNhc2UoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IENvZGVNaXJyb3IubW9kZUluZm8ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpbmZvID0gQ29kZU1pcnJvci5tb2RlSW5mb1tpXTtcbiAgICAgIGlmIChpbmZvLmV4dCkgZm9yICh2YXIgaiA9IDA7IGogPCBpbmZvLmV4dC5sZW5ndGg7IGorKylcbiAgICAgICAgaWYgKGluZm8uZXh0W2pdID09IGV4dCkgcmV0dXJuIGluZm87XG4gICAgfVxuICB9O1xuXG4gIENvZGVNaXJyb3IuZmluZE1vZGVCeUZpbGVOYW1lID0gZnVuY3Rpb24oZmlsZW5hbWUpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IENvZGVNaXJyb3IubW9kZUluZm8ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpbmZvID0gQ29kZU1pcnJvci5tb2RlSW5mb1tpXTtcbiAgICAgIGlmIChpbmZvLmZpbGUgJiYgaW5mby5maWxlLnRlc3QoZmlsZW5hbWUpKSByZXR1cm4gaW5mbztcbiAgICB9XG4gICAgdmFyIGRvdCA9IGZpbGVuYW1lLmxhc3RJbmRleE9mKFwiLlwiKTtcbiAgICB2YXIgZXh0ID0gZG90ID4gLTEgJiYgZmlsZW5hbWUuc3Vic3RyaW5nKGRvdCArIDEsIGZpbGVuYW1lLmxlbmd0aCk7XG4gICAgaWYgKGV4dCkgcmV0dXJuIENvZGVNaXJyb3IuZmluZE1vZGVCeUV4dGVuc2lvbihleHQpO1xuICB9O1xuXG4gIENvZGVNaXJyb3IuZmluZE1vZGVCeU5hbWUgPSBmdW5jdGlvbihuYW1lKSB7XG4gICAgbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IENvZGVNaXJyb3IubW9kZUluZm8ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpbmZvID0gQ29kZU1pcnJvci5tb2RlSW5mb1tpXTtcbiAgICAgIGlmIChpbmZvLm5hbWUudG9Mb3dlckNhc2UoKSA9PSBuYW1lKSByZXR1cm4gaW5mbztcbiAgICAgIGlmIChpbmZvLmFsaWFzKSBmb3IgKHZhciBqID0gMDsgaiA8IGluZm8uYWxpYXMubGVuZ3RoOyBqKyspXG4gICAgICAgIGlmIChpbmZvLmFsaWFzW2pdLnRvTG93ZXJDYXNlKCkgPT0gbmFtZSkgcmV0dXJuIGluZm87XG4gICAgfVxuICB9O1xufSk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/codemirror/mode/meta.js\n"); /***/ }), /***/ "./node_modules/codemirror/mode/php/php.js": -/*!*************************************************!* +/*!*************************************************!*\ !*** ./node_modules/codemirror/mode/php/php.js ***! \*************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { -eval("// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n if (true) // CommonJS\n mod(__webpack_require__(/*! ../../lib/codemirror */ \"./node_modules/codemirror/lib/codemirror.js\"), __webpack_require__(/*! ../htmlmixed/htmlmixed */ \"./node_modules/codemirror/mode/htmlmixed/htmlmixed.js\"), __webpack_require__(/*! ../clike/clike */ \"./node_modules/codemirror/mode/clike/clike.js\"));\n else {}\n})(function(CodeMirror) {\n \"use strict\";\n\n function keywords(str) {\n var obj = {}, words = str.split(\" \");\n for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n return obj;\n }\n\n // Helper for phpString\n function matchSequence(list, end, escapes) {\n if (list.length == 0) return phpString(end);\n return function (stream, state) {\n var patterns = list[0];\n for (var i = 0; i < patterns.length; i++) if (stream.match(patterns[i][0])) {\n state.tokenize = matchSequence(list.slice(1), end);\n return patterns[i][1];\n }\n state.tokenize = phpString(end, escapes);\n return \"string\";\n };\n }\n function phpString(closing, escapes) {\n return function(stream, state) { return phpString_(stream, state, closing, escapes); };\n }\n function phpString_(stream, state, closing, escapes) {\n // \"Complex\" syntax\n if (escapes !== false && stream.match(\"${\", false) || stream.match(\"{$\", false)) {\n state.tokenize = null;\n return \"string\";\n }\n\n // Simple syntax\n if (escapes !== false && stream.match(/^\\$[a-zA-Z_][a-zA-Z0-9_]*/)) {\n // After the variable name there may appear array or object operator.\n if (stream.match(\"[\", false)) {\n // Match array operator\n state.tokenize = matchSequence([\n [[\"[\", null]],\n [[/\\d[\\w\\.]*/, \"number\"],\n [/\\$[a-zA-Z_][a-zA-Z0-9_]*/, \"variable-2\"],\n [/[\\w\\$]+/, \"variable\"]],\n [[\"]\", null]]\n ], closing, escapes);\n }\n if (stream.match(/\\-\\>\\w/, false)) {\n // Match object operator\n state.tokenize = matchSequence([\n [[\"->\", null]],\n [[/[\\w]+/, \"variable\"]]\n ], closing, escapes);\n }\n return \"variable-2\";\n }\n\n var escaped = false;\n // Normal string\n while (!stream.eol() &&\n (escaped || escapes === false ||\n (!stream.match(\"{$\", false) &&\n !stream.match(/^(\\$[a-zA-Z_][a-zA-Z0-9_]*|\\$\\{)/, false)))) {\n if (!escaped && stream.match(closing)) {\n state.tokenize = null;\n state.tokStack.pop(); state.tokStack.pop();\n break;\n }\n escaped = stream.next() == \"\\\\\" && !escaped;\n }\n return \"string\";\n }\n\n var phpKeywords = \"abstract and array as break case catch class clone const continue declare default \" +\n \"do else elseif enddeclare endfor endforeach endif endswitch endwhile extends final \" +\n \"for foreach function global goto if implements interface instanceof namespace \" +\n \"new or private protected public static switch throw trait try use var while xor \" +\n \"die echo empty exit eval include include_once isset list require require_once return \" +\n \"print unset __halt_compiler self static parent yield insteadof finally\";\n var phpAtoms = \"true false null TRUE FALSE NULL __CLASS__ __DIR__ __FILE__ __LINE__ __METHOD__ __FUNCTION__ __NAMESPACE__ __TRAIT__\";\n var phpBuiltin = \"func_num_args func_get_arg func_get_args strlen strcmp strncmp strcasecmp strncasecmp each error_reporting define defined trigger_error user_error set_error_handler restore_error_handler get_declared_classes get_loaded_extensions extension_loaded get_extension_funcs debug_backtrace constant bin2hex hex2bin sleep usleep time mktime gmmktime strftime gmstrftime strtotime date gmdate getdate localtime checkdate flush wordwrap htmlspecialchars htmlentities html_entity_decode md5 md5_file crc32 getimagesize image_type_to_mime_type phpinfo phpversion phpcredits strnatcmp strnatcasecmp substr_count strspn strcspn strtok strtoupper strtolower strpos strrpos strrev hebrev hebrevc nl2br basename dirname pathinfo stripslashes stripcslashes strstr stristr strrchr str_shuffle str_word_count strcoll substr substr_replace quotemeta ucfirst ucwords strtr addslashes addcslashes rtrim str_replace str_repeat count_chars chunk_split trim ltrim strip_tags similar_text explode implode setlocale localeconv parse_str str_pad chop strchr sprintf printf vprintf vsprintf sscanf fscanf parse_url urlencode urldecode rawurlencode rawurldecode readlink linkinfo link unlink exec system escapeshellcmd escapeshellarg passthru shell_exec proc_open proc_close rand srand getrandmax mt_rand mt_srand mt_getrandmax base64_decode base64_encode abs ceil floor round is_finite is_nan is_infinite bindec hexdec octdec decbin decoct dechex base_convert number_format fmod ip2long long2ip getenv putenv getopt microtime gettimeofday getrusage uniqid quoted_printable_decode set_time_limit get_cfg_var magic_quotes_runtime set_magic_quotes_runtime get_magic_quotes_gpc get_magic_quotes_runtime import_request_variables error_log serialize unserialize memory_get_usage var_dump var_export debug_zval_dump print_r highlight_file show_source highlight_string ini_get ini_get_all ini_set ini_alter ini_restore get_include_path set_include_path restore_include_path setcookie header headers_sent connection_aborted connection_status ignore_user_abort parse_ini_file is_uploaded_file move_uploaded_file intval floatval doubleval strval gettype settype is_null is_resource is_bool is_long is_float is_int is_integer is_double is_real is_numeric is_string is_array is_object is_scalar ereg ereg_replace eregi eregi_replace split spliti join sql_regcase dl pclose popen readfile rewind rmdir umask fclose feof fgetc fgets fgetss fread fopen fpassthru ftruncate fstat fseek ftell fflush fwrite fputs mkdir rename copy tempnam tmpfile file file_get_contents file_put_contents stream_select stream_context_create stream_context_set_params stream_context_set_option stream_context_get_options stream_filter_prepend stream_filter_append fgetcsv flock get_meta_tags stream_set_write_buffer set_file_buffer set_socket_blocking stream_set_blocking socket_set_blocking stream_get_meta_data stream_register_wrapper stream_wrapper_register stream_set_timeout socket_set_timeout socket_get_status realpath fnmatch fsockopen pfsockopen pack unpack get_browser crypt opendir closedir chdir getcwd rewinddir readdir dir glob fileatime filectime filegroup fileinode filemtime fileowner fileperms filesize filetype file_exists is_writable is_writeable is_readable is_executable is_file is_dir is_link stat lstat chown touch clearstatcache mail ob_start ob_flush ob_clean ob_end_flush ob_end_clean ob_get_flush ob_get_clean ob_get_length ob_get_level ob_get_status ob_get_contents ob_implicit_flush ob_list_handlers ksort krsort natsort natcasesort asort arsort sort rsort usort uasort uksort shuffle array_walk count end prev next reset current key min max in_array array_search extract compact array_fill range array_multisort array_push array_pop array_shift array_unshift array_splice array_slice array_merge array_merge_recursive array_keys array_values array_count_values array_reverse array_reduce array_pad array_flip array_change_key_case array_rand array_unique array_intersect array_intersect_assoc array_diff array_diff_assoc array_sum array_filter array_map array_chunk array_key_exists array_intersect_key array_combine array_column pos sizeof key_exists assert assert_options version_compare ftok str_rot13 aggregate session_name session_module_name session_save_path session_id session_regenerate_id session_decode session_register session_unregister session_is_registered session_encode session_start session_destroy session_unset session_set_save_handler session_cache_limiter session_cache_expire session_set_cookie_params session_get_cookie_params session_write_close preg_match preg_match_all preg_replace preg_replace_callback preg_split preg_quote preg_grep overload ctype_alnum ctype_alpha ctype_cntrl ctype_digit ctype_lower ctype_graph ctype_print ctype_punct ctype_space ctype_upper ctype_xdigit virtual apache_request_headers apache_note apache_lookup_uri apache_child_terminate apache_setenv apache_response_headers apache_get_version getallheaders mysql_connect mysql_pconnect mysql_close mysql_select_db mysql_create_db mysql_drop_db mysql_query mysql_unbuffered_query mysql_db_query mysql_list_dbs mysql_list_tables mysql_list_fields mysql_list_processes mysql_error mysql_errno mysql_affected_rows mysql_insert_id mysql_result mysql_num_rows mysql_num_fields mysql_fetch_row mysql_fetch_array mysql_fetch_assoc mysql_fetch_object mysql_data_seek mysql_fetch_lengths mysql_fetch_field mysql_field_seek mysql_free_result mysql_field_name mysql_field_table mysql_field_len mysql_field_type mysql_field_flags mysql_escape_string mysql_real_escape_string mysql_stat mysql_thread_id mysql_client_encoding mysql_get_client_info mysql_get_host_info mysql_get_proto_info mysql_get_server_info mysql_info mysql mysql_fieldname mysql_fieldtable mysql_fieldlen mysql_fieldtype mysql_fieldflags mysql_selectdb mysql_createdb mysql_dropdb mysql_freeresult mysql_numfields mysql_numrows mysql_listdbs mysql_listtables mysql_listfields mysql_db_name mysql_dbname mysql_tablename mysql_table_name pg_connect pg_pconnect pg_close pg_connection_status pg_connection_busy pg_connection_reset pg_host pg_dbname pg_port pg_tty pg_options pg_ping pg_query pg_send_query pg_cancel_query pg_fetch_result pg_fetch_row pg_fetch_assoc pg_fetch_array pg_fetch_object pg_fetch_all pg_affected_rows pg_get_result pg_result_seek pg_result_status pg_free_result pg_last_oid pg_num_rows pg_num_fields pg_field_name pg_field_num pg_field_size pg_field_type pg_field_prtlen pg_field_is_null pg_get_notify pg_get_pid pg_result_error pg_last_error pg_last_notice pg_put_line pg_end_copy pg_copy_to pg_copy_from pg_trace pg_untrace pg_lo_create pg_lo_unlink pg_lo_open pg_lo_close pg_lo_read pg_lo_write pg_lo_read_all pg_lo_import pg_lo_export pg_lo_seek pg_lo_tell pg_escape_string pg_escape_bytea pg_unescape_bytea pg_client_encoding pg_set_client_encoding pg_meta_data pg_convert pg_insert pg_update pg_delete pg_select pg_exec pg_getlastoid pg_cmdtuples pg_errormessage pg_numrows pg_numfields pg_fieldname pg_fieldsize pg_fieldtype pg_fieldnum pg_fieldprtlen pg_fieldisnull pg_freeresult pg_result pg_loreadall pg_locreate pg_lounlink pg_loopen pg_loclose pg_loread pg_lowrite pg_loimport pg_loexport http_response_code get_declared_traits getimagesizefromstring socket_import_stream stream_set_chunk_size trait_exists header_register_callback class_uses session_status session_register_shutdown echo print global static exit array empty eval isset unset die include require include_once require_once json_decode json_encode json_last_error json_last_error_msg curl_close curl_copy_handle curl_errno curl_error curl_escape curl_exec curl_file_create curl_getinfo curl_init curl_multi_add_handle curl_multi_close curl_multi_exec curl_multi_getcontent curl_multi_info_read curl_multi_init curl_multi_remove_handle curl_multi_select curl_multi_setopt curl_multi_strerror curl_pause curl_reset curl_setopt_array curl_setopt curl_share_close curl_share_init curl_share_setopt curl_strerror curl_unescape curl_version mysqli_affected_rows mysqli_autocommit mysqli_change_user mysqli_character_set_name mysqli_close mysqli_commit mysqli_connect_errno mysqli_connect_error mysqli_connect mysqli_data_seek mysqli_debug mysqli_dump_debug_info mysqli_errno mysqli_error_list mysqli_error mysqli_fetch_all mysqli_fetch_array mysqli_fetch_assoc mysqli_fetch_field_direct mysqli_fetch_field mysqli_fetch_fields mysqli_fetch_lengths mysqli_fetch_object mysqli_fetch_row mysqli_field_count mysqli_field_seek mysqli_field_tell mysqli_free_result mysqli_get_charset mysqli_get_client_info mysqli_get_client_stats mysqli_get_client_version mysqli_get_connection_stats mysqli_get_host_info mysqli_get_proto_info mysqli_get_server_info mysqli_get_server_version mysqli_info mysqli_init mysqli_insert_id mysqli_kill mysqli_more_results mysqli_multi_query mysqli_next_result mysqli_num_fields mysqli_num_rows mysqli_options mysqli_ping mysqli_prepare mysqli_query mysqli_real_connect mysqli_real_escape_string mysqli_real_query mysqli_reap_async_query mysqli_refresh mysqli_rollback mysqli_select_db mysqli_set_charset mysqli_set_local_infile_default mysqli_set_local_infile_handler mysqli_sqlstate mysqli_ssl_set mysqli_stat mysqli_stmt_init mysqli_store_result mysqli_thread_id mysqli_thread_safe mysqli_use_result mysqli_warning_count\";\n CodeMirror.registerHelper(\"hintWords\", \"php\", [phpKeywords, phpAtoms, phpBuiltin].join(\" \").split(\" \"));\n CodeMirror.registerHelper(\"wordChars\", \"php\", /[\\w$]/);\n\n var phpConfig = {\n name: \"clike\",\n helperType: \"php\",\n keywords: keywords(phpKeywords),\n blockKeywords: keywords(\"catch do else elseif for foreach if switch try while finally\"),\n defKeywords: keywords(\"class function interface namespace trait\"),\n atoms: keywords(phpAtoms),\n builtin: keywords(phpBuiltin),\n multiLineStrings: true,\n hooks: {\n \"$\": function(stream) {\n stream.eatWhile(/[\\w\\$_]/);\n return \"variable-2\";\n },\n \"<\": function(stream, state) {\n var before;\n if (before = stream.match(/<<\\s*/)) {\n var quoted = stream.eat(/['\"]/);\n stream.eatWhile(/[\\w\\.]/);\n var delim = stream.current().slice(before[0].length + (quoted ? 2 : 1));\n if (quoted) stream.eat(quoted);\n if (delim) {\n (state.tokStack || (state.tokStack = [])).push(delim, 0);\n state.tokenize = phpString(delim, quoted != \"'\");\n return \"string\";\n }\n }\n return false;\n },\n \"#\": function(stream) {\n while (!stream.eol() && !stream.match(\"?>\", false)) stream.next();\n return \"comment\";\n },\n \"/\": function(stream) {\n if (stream.eat(\"/\")) {\n while (!stream.eol() && !stream.match(\"?>\", false)) stream.next();\n return \"comment\";\n }\n return false;\n },\n '\"': function(_stream, state) {\n (state.tokStack || (state.tokStack = [])).push('\"', 0);\n state.tokenize = phpString('\"');\n return \"string\";\n },\n \"{\": function(_stream, state) {\n if (state.tokStack && state.tokStack.length)\n state.tokStack[state.tokStack.length - 1]++;\n return false;\n },\n \"}\": function(_stream, state) {\n if (state.tokStack && state.tokStack.length > 0 &&\n !--state.tokStack[state.tokStack.length - 1]) {\n state.tokenize = phpString(state.tokStack[state.tokStack.length - 2]);\n }\n return false;\n }\n }\n };\n\n CodeMirror.defineMode(\"php\", function(config, parserConfig) {\n var htmlMode = CodeMirror.getMode(config, (parserConfig && parserConfig.htmlMode) || \"text/html\");\n var phpMode = CodeMirror.getMode(config, phpConfig);\n\n function dispatch(stream, state) {\n var isPHP = state.curMode == phpMode;\n if (stream.sol() && state.pending && state.pending != '\"' && state.pending != \"'\") state.pending = null;\n if (!isPHP) {\n if (stream.match(/^<\\?\\w*/)) {\n state.curMode = phpMode;\n if (!state.php) state.php = CodeMirror.startState(phpMode, htmlMode.indent(state.html, \"\", \"\"))\n state.curState = state.php;\n return \"meta\";\n }\n if (state.pending == '\"' || state.pending == \"'\") {\n while (!stream.eol() && stream.next() != state.pending) {}\n var style = \"string\";\n } else if (state.pending && stream.pos < state.pending.end) {\n stream.pos = state.pending.end;\n var style = state.pending.style;\n } else {\n var style = htmlMode.token(stream, state.curState);\n }\n if (state.pending) state.pending = null;\n var cur = stream.current(), openPHP = cur.search(/<\\?/), m;\n if (openPHP != -1) {\n if (style == \"string\" && (m = cur.match(/[\\'\\\"]$/)) && !/\\?>/.test(cur)) state.pending = m[0];\n else state.pending = {end: stream.pos, style: style};\n stream.backUp(cur.length - openPHP);\n }\n return style;\n } else if (isPHP && state.php.tokenize == null && stream.match(\"?>\")) {\n state.curMode = htmlMode;\n state.curState = state.html;\n if (!state.php.context.prev) state.php = null;\n return \"meta\";\n } else {\n return phpMode.token(stream, state.curState);\n }\n }\n\n return {\n startState: function() {\n var html = CodeMirror.startState(htmlMode)\n var php = parserConfig.startOpen ? CodeMirror.startState(phpMode) : null\n return {html: html,\n php: php,\n curMode: parserConfig.startOpen ? phpMode : htmlMode,\n curState: parserConfig.startOpen ? php : html,\n pending: null};\n },\n\n copyState: function(state) {\n var html = state.html, htmlNew = CodeMirror.copyState(htmlMode, html),\n php = state.php, phpNew = php && CodeMirror.copyState(phpMode, php), cur;\n if (state.curMode == htmlMode) cur = htmlNew;\n else cur = phpNew;\n return {html: htmlNew, php: phpNew, curMode: state.curMode, curState: cur,\n pending: state.pending};\n },\n\n token: dispatch,\n\n indent: function(state, textAfter, line) {\n if ((state.curMode != phpMode && /^\\s*<\\//.test(textAfter)) ||\n (state.curMode == phpMode && /^\\?>/.test(textAfter)))\n return htmlMode.indent(state.html, textAfter, line);\n return state.curMode.indent(state.curState, textAfter, line);\n },\n\n blockCommentStart: \"/*\",\n blockCommentEnd: \"*/\",\n lineComment: \"//\",\n\n innerMode: function(state) { return {state: state.curState, mode: state.curMode}; }\n };\n }, \"htmlmixed\", \"clike\");\n\n CodeMirror.defineMIME(\"application/x-httpd-php\", \"php\");\n CodeMirror.defineMIME(\"application/x-httpd-php-open\", {name: \"php\", startOpen: true});\n CodeMirror.defineMIME(\"text/x-php\", phpConfig);\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vbm9kZV9tb2R1bGVzL2NvZGVtaXJyb3IvbW9kZS9waHAvcGhwLmpzPzQ0ZDUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7QUFFQTtBQUNBLE1BQU0sSUFBdUQ7QUFDN0QsUUFBUSxtQkFBTyxDQUFDLHlFQUFzQixHQUFHLG1CQUFPLENBQUMscUZBQXdCLEdBQUcsbUJBQU8sQ0FBQyxxRUFBZ0I7QUFDcEcsT0FBTyxFQUdhO0FBQ3BCLENBQUM7QUFDRDs7QUFFQTtBQUNBLGdCQUFnQjtBQUNoQixtQkFBbUIsa0JBQWtCO0FBQ3JDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixxQkFBcUI7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyxvREFBb0Q7QUFDeEY7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLDRCQUE0QjtBQUN6RTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0IsMkRBQTJEO0FBQzNEO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQztBQUNoQztBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0EsT0FBTzs7QUFFUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7O0FBRUEsa0NBQWtDLFNBQVMsNENBQTRDO0FBQ3ZGO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLHlEQUF5RCw2QkFBNkI7QUFDdEY7QUFDQSxDQUFDIiwiZmlsZSI6Ii4vbm9kZV9tb2R1bGVzL2NvZGVtaXJyb3IvbW9kZS9waHAvcGhwLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnNcbi8vIERpc3RyaWJ1dGVkIHVuZGVyIGFuIE1JVCBsaWNlbnNlOiBodHRwczovL2NvZGVtaXJyb3IubmV0L0xJQ0VOU0VcblxuKGZ1bmN0aW9uKG1vZCkge1xuICBpZiAodHlwZW9mIGV4cG9ydHMgPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgbW9kdWxlID09IFwib2JqZWN0XCIpIC8vIENvbW1vbkpTXG4gICAgbW9kKHJlcXVpcmUoXCIuLi8uLi9saWIvY29kZW1pcnJvclwiKSwgcmVxdWlyZShcIi4uL2h0bWxtaXhlZC9odG1sbWl4ZWRcIiksIHJlcXVpcmUoXCIuLi9jbGlrZS9jbGlrZVwiKSk7XG4gIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIC8vIEFNRFxuICAgIGRlZmluZShbXCIuLi8uLi9saWIvY29kZW1pcnJvclwiLCBcIi4uL2h0bWxtaXhlZC9odG1sbWl4ZWRcIiwgXCIuLi9jbGlrZS9jbGlrZVwiXSwgbW9kKTtcbiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudlxuICAgIG1vZChDb2RlTWlycm9yKTtcbn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgZnVuY3Rpb24ga2V5d29yZHMoc3RyKSB7XG4gICAgdmFyIG9iaiA9IHt9LCB3b3JkcyA9IHN0ci5zcGxpdChcIiBcIik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB3b3Jkcy5sZW5ndGg7ICsraSkgb2JqW3dvcmRzW2ldXSA9IHRydWU7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIC8vIEhlbHBlciBmb3IgcGhwU3RyaW5nXG4gIGZ1bmN0aW9uIG1hdGNoU2VxdWVuY2UobGlzdCwgZW5kLCBlc2NhcGVzKSB7XG4gICAgaWYgKGxpc3QubGVuZ3RoID09IDApIHJldHVybiBwaHBTdHJpbmcoZW5kKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHN0cmVhbSwgc3RhdGUpIHtcbiAgICAgIHZhciBwYXR0ZXJucyA9IGxpc3RbMF07XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdHRlcm5zLmxlbmd0aDsgaSsrKSBpZiAoc3RyZWFtLm1hdGNoKHBhdHRlcm5zW2ldWzBdKSkge1xuICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IG1hdGNoU2VxdWVuY2UobGlzdC5zbGljZSgxKSwgZW5kKTtcbiAgICAgICAgcmV0dXJuIHBhdHRlcm5zW2ldWzFdO1xuICAgICAgfVxuICAgICAgc3RhdGUudG9rZW5pemUgPSBwaHBTdHJpbmcoZW5kLCBlc2NhcGVzKTtcbiAgICAgIHJldHVybiBcInN0cmluZ1wiO1xuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gcGhwU3RyaW5nKGNsb3NpbmcsIGVzY2FwZXMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgeyByZXR1cm4gcGhwU3RyaW5nXyhzdHJlYW0sIHN0YXRlLCBjbG9zaW5nLCBlc2NhcGVzKTsgfTtcbiAgfVxuICBmdW5jdGlvbiBwaHBTdHJpbmdfKHN0cmVhbSwgc3RhdGUsIGNsb3NpbmcsIGVzY2FwZXMpIHtcbiAgICAvLyBcIkNvbXBsZXhcIiBzeW50YXhcbiAgICBpZiAoZXNjYXBlcyAhPT0gZmFsc2UgJiYgc3RyZWFtLm1hdGNoKFwiJHtcIiwgZmFsc2UpIHx8IHN0cmVhbS5tYXRjaChcInskXCIsIGZhbHNlKSkge1xuICAgICAgc3RhdGUudG9rZW5pemUgPSBudWxsO1xuICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gICAgfVxuXG4gICAgLy8gU2ltcGxlIHN5bnRheFxuICAgIGlmIChlc2NhcGVzICE9PSBmYWxzZSAmJiBzdHJlYW0ubWF0Y2goL15cXCRbYS16QS1aX11bYS16QS1aMC05X10qLykpIHtcbiAgICAgIC8vIEFmdGVyIHRoZSB2YXJpYWJsZSBuYW1lIHRoZXJlIG1heSBhcHBlYXIgYXJyYXkgb3Igb2JqZWN0IG9wZXJhdG9yLlxuICAgICAgaWYgKHN0cmVhbS5tYXRjaChcIltcIiwgZmFsc2UpKSB7XG4gICAgICAgIC8vIE1hdGNoIGFycmF5IG9wZXJhdG9yXG4gICAgICAgIHN0YXRlLnRva2VuaXplID0gbWF0Y2hTZXF1ZW5jZShbXG4gICAgICAgICAgW1tcIltcIiwgbnVsbF1dLFxuICAgICAgICAgIFtbL1xcZFtcXHdcXC5dKi8sIFwibnVtYmVyXCJdLFxuICAgICAgICAgICBbL1xcJFthLXpBLVpfXVthLXpBLVowLTlfXSovLCBcInZhcmlhYmxlLTJcIl0sXG4gICAgICAgICAgIFsvW1xcd1xcJF0rLywgXCJ2YXJpYWJsZVwiXV0sXG4gICAgICAgICAgW1tcIl1cIiwgbnVsbF1dXG4gICAgICAgIF0sIGNsb3NpbmcsIGVzY2FwZXMpO1xuICAgICAgfVxuICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXFwtXFw+XFx3LywgZmFsc2UpKSB7XG4gICAgICAgIC8vIE1hdGNoIG9iamVjdCBvcGVyYXRvclxuICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IG1hdGNoU2VxdWVuY2UoW1xuICAgICAgICAgIFtbXCItPlwiLCBudWxsXV0sXG4gICAgICAgICAgW1svW1xcd10rLywgXCJ2YXJpYWJsZVwiXV1cbiAgICAgICAgXSwgY2xvc2luZywgZXNjYXBlcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gXCJ2YXJpYWJsZS0yXCI7XG4gICAgfVxuXG4gICAgdmFyIGVzY2FwZWQgPSBmYWxzZTtcbiAgICAvLyBOb3JtYWwgc3RyaW5nXG4gICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkgJiZcbiAgICAgICAgICAgKGVzY2FwZWQgfHwgZXNjYXBlcyA9PT0gZmFsc2UgfHxcbiAgICAgICAgICAgICghc3RyZWFtLm1hdGNoKFwieyRcIiwgZmFsc2UpICYmXG4gICAgICAgICAgICAgIXN0cmVhbS5tYXRjaCgvXihcXCRbYS16QS1aX11bYS16QS1aMC05X10qfFxcJFxceykvLCBmYWxzZSkpKSkge1xuICAgICAgaWYgKCFlc2NhcGVkICYmIHN0cmVhbS5tYXRjaChjbG9zaW5nKSkge1xuICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IG51bGw7XG4gICAgICAgIHN0YXRlLnRva1N0YWNrLnBvcCgpOyBzdGF0ZS50b2tTdGFjay5wb3AoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBlc2NhcGVkID0gc3RyZWFtLm5leHQoKSA9PSBcIlxcXFxcIiAmJiAhZXNjYXBlZDtcbiAgICB9XG4gICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gIH1cblxuICB2YXIgcGhwS2V5d29yZHMgPSBcImFic3RyYWN0IGFuZCBhcnJheSBhcyBicmVhayBjYXNlIGNhdGNoIGNsYXNzIGNsb25lIGNvbnN0IGNvbnRpbnVlIGRlY2xhcmUgZGVmYXVsdCBcIiArXG4gICAgXCJkbyBlbHNlIGVsc2VpZiBlbmRkZWNsYXJlIGVuZGZvciBlbmRmb3JlYWNoIGVuZGlmIGVuZHN3aXRjaCBlbmR3aGlsZSBleHRlbmRzIGZpbmFsIFwiICtcbiAgICBcImZvciBmb3JlYWNoIGZ1bmN0aW9uIGdsb2JhbCBnb3RvIGlmIGltcGxlbWVudHMgaW50ZXJmYWNlIGluc3RhbmNlb2YgbmFtZXNwYWNlIFwiICtcbiAgICBcIm5ldyBvciBwcml2YXRlIHByb3RlY3RlZCBwdWJsaWMgc3RhdGljIHN3aXRjaCB0aHJvdyB0cmFpdCB0cnkgdXNlIHZhciB3aGlsZSB4b3IgXCIgK1xuICAgIFwiZGllIGVjaG8gZW1wdHkgZXhpdCBldmFsIGluY2x1ZGUgaW5jbHVkZV9vbmNlIGlzc2V0IGxpc3QgcmVxdWlyZSByZXF1aXJlX29uY2UgcmV0dXJuIFwiICtcbiAgICBcInByaW50IHVuc2V0IF9faGFsdF9jb21waWxlciBzZWxmIHN0YXRpYyBwYXJlbnQgeWllbGQgaW5zdGVhZG9mIGZpbmFsbHlcIjtcbiAgdmFyIHBocEF0b21zID0gXCJ0cnVlIGZhbHNlIG51bGwgVFJVRSBGQUxTRSBOVUxMIF9fQ0xBU1NfXyBfX0RJUl9fIF9fRklMRV9fIF9fTElORV9fIF9fTUVUSE9EX18gX19GVU5DVElPTl9fIF9fTkFNRVNQQUNFX18gX19UUkFJVF9fXCI7XG4gIHZhciBwaHBCdWlsdGluID0gXCJmdW5jX251bV9hcmdzIGZ1bmNfZ2V0X2FyZyBmdW5jX2dldF9hcmdzIHN0cmxlbiBzdHJjbXAgc3RybmNtcCBzdHJjYXNlY21wIHN0cm5jYXNlY21wIGVhY2ggZXJyb3JfcmVwb3J0aW5nIGRlZmluZSBkZWZpbmVkIHRyaWdnZXJfZXJyb3IgdXNlcl9lcnJvciBzZXRfZXJyb3JfaGFuZGxlciByZXN0b3JlX2Vycm9yX2hhbmRsZXIgZ2V0X2RlY2xhcmVkX2NsYXNzZXMgZ2V0X2xvYWRlZF9leHRlbnNpb25zIGV4dGVuc2lvbl9sb2FkZWQgZ2V0X2V4dGVuc2lvbl9mdW5jcyBkZWJ1Z19iYWNrdHJhY2UgY29uc3RhbnQgYmluMmhleCBoZXgyYmluIHNsZWVwIHVzbGVlcCB0aW1lIG1rdGltZSBnbW1rdGltZSBzdHJmdGltZSBnbXN0cmZ0aW1lIHN0cnRvdGltZSBkYXRlIGdtZGF0ZSBnZXRkYXRlIGxvY2FsdGltZSBjaGVja2RhdGUgZmx1c2ggd29yZHdyYXAgaHRtbHNwZWNpYWxjaGFycyBodG1sZW50aXRpZXMgaHRtbF9lbnRpdHlfZGVjb2RlIG1kNSBtZDVfZmlsZSBjcmMzMiBnZXRpbWFnZXNpemUgaW1hZ2VfdHlwZV90b19taW1lX3R5cGUgcGhwaW5mbyBwaHB2ZXJzaW9uIHBocGNyZWRpdHMgc3RybmF0Y21wIHN0cm5hdGNhc2VjbXAgc3Vic3RyX2NvdW50IHN0cnNwbiBzdHJjc3BuIHN0cnRvayBzdHJ0b3VwcGVyIHN0cnRvbG93ZXIgc3RycG9zIHN0cnJwb3Mgc3RycmV2IGhlYnJldiBoZWJyZXZjIG5sMmJyIGJhc2VuYW1lIGRpcm5hbWUgcGF0aGluZm8gc3RyaXBzbGFzaGVzIHN0cmlwY3NsYXNoZXMgc3Ryc3RyIHN0cmlzdHIgc3RycmNociBzdHJfc2h1ZmZsZSBzdHJfd29yZF9jb3VudCBzdHJjb2xsIHN1YnN0ciBzdWJzdHJfcmVwbGFjZSBxdW90ZW1ldGEgdWNmaXJzdCB1Y3dvcmRzIHN0cnRyIGFkZHNsYXNoZXMgYWRkY3NsYXNoZXMgcnRyaW0gc3RyX3JlcGxhY2Ugc3RyX3JlcGVhdCBjb3VudF9jaGFycyBjaHVua19zcGxpdCB0cmltIGx0cmltIHN0cmlwX3RhZ3Mgc2ltaWxhcl90ZXh0IGV4cGxvZGUgaW1wbG9kZSBzZXRsb2NhbGUgbG9jYWxlY29udiBwYXJzZV9zdHIgc3RyX3BhZCBjaG9wIHN0cmNociBzcHJpbnRmIHByaW50ZiB2cHJpbnRmIHZzcHJpbnRmIHNzY2FuZiBmc2NhbmYgcGFyc2VfdXJsIHVybGVuY29kZSB1cmxkZWNvZGUgcmF3dXJsZW5jb2RlIHJhd3VybGRlY29kZSByZWFkbGluayBsaW5raW5mbyBsaW5rIHVubGluayBleGVjIHN5c3RlbSBlc2NhcGVzaGVsbGNtZCBlc2NhcGVzaGVsbGFyZyBwYXNzdGhydSBzaGVsbF9leGVjIHByb2Nfb3BlbiBwcm9jX2Nsb3NlIHJhbmQgc3JhbmQgZ2V0cmFuZG1heCBtdF9yYW5kIG10X3NyYW5kIG10X2dldHJhbmRtYXggYmFzZTY0X2RlY29kZSBiYXNlNjRfZW5jb2RlIGFicyBjZWlsIGZsb29yIHJvdW5kIGlzX2Zpbml0ZSBpc19uYW4gaXNfaW5maW5pdGUgYmluZGVjIGhleGRlYyBvY3RkZWMgZGVjYmluIGRlY29jdCBkZWNoZXggYmFzZV9jb252ZXJ0IG51bWJlcl9mb3JtYXQgZm1vZCBpcDJsb25nIGxvbmcyaXAgZ2V0ZW52IHB1dGVudiBnZXRvcHQgbWljcm90aW1lIGdldHRpbWVvZmRheSBnZXRydXNhZ2UgdW5pcWlkIHF1b3RlZF9wcmludGFibGVfZGVjb2RlIHNldF90aW1lX2xpbWl0IGdldF9jZmdfdmFyIG1hZ2ljX3F1b3Rlc19ydW50aW1lIHNldF9tYWdpY19xdW90ZXNfcnVudGltZSBnZXRfbWFnaWNfcXVvdGVzX2dwYyBnZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUgaW1wb3J0X3JlcXVlc3RfdmFyaWFibGVzIGVycm9yX2xvZyBzZXJpYWxpemUgdW5zZXJpYWxpemUgbWVtb3J5X2dldF91c2FnZSB2YXJfZHVtcCB2YXJfZXhwb3J0IGRlYnVnX3p2YWxfZHVtcCBwcmludF9yIGhpZ2hsaWdodF9maWxlIHNob3dfc291cmNlIGhpZ2hsaWdodF9zdHJpbmcgaW5pX2dldCBpbmlfZ2V0X2FsbCBpbmlfc2V0IGluaV9hbHRlciBpbmlfcmVzdG9yZSBnZXRfaW5jbHVkZV9wYXRoIHNldF9pbmNsdWRlX3BhdGggcmVzdG9yZV9pbmNsdWRlX3BhdGggc2V0Y29va2llIGhlYWRlciBoZWFkZXJzX3NlbnQgY29ubmVjdGlvbl9hYm9ydGVkIGNvbm5lY3Rpb25fc3RhdHVzIGlnbm9yZV91c2VyX2Fib3J0IHBhcnNlX2luaV9maWxlIGlzX3VwbG9hZGVkX2ZpbGUgbW92ZV91cGxvYWRlZF9maWxlIGludHZhbCBmbG9hdHZhbCBkb3VibGV2YWwgc3RydmFsIGdldHR5cGUgc2V0dHlwZSBpc19udWxsIGlzX3Jlc291cmNlIGlzX2Jvb2wgaXNfbG9uZyBpc19mbG9hdCBpc19pbnQgaXNfaW50ZWdlciBpc19kb3VibGUgaXNfcmVhbCBpc19udW1lcmljIGlzX3N0cmluZyBpc19hcnJheSBpc19vYmplY3QgaXNfc2NhbGFyIGVyZWcgZXJlZ19yZXBsYWNlIGVyZWdpIGVyZWdpX3JlcGxhY2Ugc3BsaXQgc3BsaXRpIGpvaW4gc3FsX3JlZ2Nhc2UgZGwgcGNsb3NlIHBvcGVuIHJlYWRmaWxlIHJld2luZCBybWRpciB1bWFzayBmY2xvc2UgZmVvZiBmZ2V0YyBmZ2V0cyBmZ2V0c3MgZnJlYWQgZm9wZW4gZnBhc3N0aHJ1IGZ0cnVuY2F0ZSBmc3RhdCBmc2VlayBmdGVsbCBmZmx1c2ggZndyaXRlIGZwdXRzIG1rZGlyIHJlbmFtZSBjb3B5IHRlbXBuYW0gdG1wZmlsZSBmaWxlIGZpbGVfZ2V0X2NvbnRlbnRzIGZpbGVfcHV0X2NvbnRlbnRzIHN0cmVhbV9zZWxlY3Qgc3RyZWFtX2NvbnRleHRfY3JlYXRlIHN0cmVhbV9jb250ZXh0X3NldF9wYXJhbXMgc3RyZWFtX2NvbnRleHRfc2V0X29wdGlvbiBzdHJlYW1fY29udGV4dF9nZXRfb3B0aW9ucyBzdHJlYW1fZmlsdGVyX3ByZXBlbmQgc3RyZWFtX2ZpbHRlcl9hcHBlbmQgZmdldGNzdiBmbG9jayBnZXRfbWV0YV90YWdzIHN0cmVhbV9zZXRfd3JpdGVfYnVmZmVyIHNldF9maWxlX2J1ZmZlciBzZXRfc29ja2V0X2Jsb2NraW5nIHN0cmVhbV9zZXRfYmxvY2tpbmcgc29ja2V0X3NldF9ibG9ja2luZyBzdHJlYW1fZ2V0X21ldGFfZGF0YSBzdHJlYW1fcmVnaXN0ZXJfd3JhcHBlciBzdHJlYW1fd3JhcHBlcl9yZWdpc3RlciBzdHJlYW1fc2V0X3RpbWVvdXQgc29ja2V0X3NldF90aW1lb3V0IHNvY2tldF9nZXRfc3RhdHVzIHJlYWxwYXRoIGZubWF0Y2ggZnNvY2tvcGVuIHBmc29ja29wZW4gcGFjayB1bnBhY2sgZ2V0X2Jyb3dzZXIgY3J5cHQgb3BlbmRpciBjbG9zZWRpciBjaGRpciBnZXRjd2QgcmV3aW5kZGlyIHJlYWRkaXIgZGlyIGdsb2IgZmlsZWF0aW1lIGZpbGVjdGltZSBmaWxlZ3JvdXAgZmlsZWlub2RlIGZpbGVtdGltZSBmaWxlb3duZXIgZmlsZXBlcm1zIGZpbGVzaXplIGZpbGV0eXBlIGZpbGVfZXhpc3RzIGlzX3dyaXRhYmxlIGlzX3dyaXRlYWJsZSBpc19yZWFkYWJsZSBpc19leGVjdXRhYmxlIGlzX2ZpbGUgaXNfZGlyIGlzX2xpbmsgc3RhdCBsc3RhdCBjaG93biB0b3VjaCBjbGVhcnN0YXRjYWNoZSBtYWlsIG9iX3N0YXJ0IG9iX2ZsdXNoIG9iX2NsZWFuIG9iX2VuZF9mbHVzaCBvYl9lbmRfY2xlYW4gb2JfZ2V0X2ZsdXNoIG9iX2dldF9jbGVhbiBvYl9nZXRfbGVuZ3RoIG9iX2dldF9sZXZlbCBvYl9nZXRfc3RhdHVzIG9iX2dldF9jb250ZW50cyBvYl9pbXBsaWNpdF9mbHVzaCBvYl9saXN0X2hhbmRsZXJzIGtzb3J0IGtyc29ydCBuYXRzb3J0IG5hdGNhc2Vzb3J0IGFzb3J0IGFyc29ydCBzb3J0IHJzb3J0IHVzb3J0IHVhc29ydCB1a3NvcnQgc2h1ZmZsZSBhcnJheV93YWxrIGNvdW50IGVuZCBwcmV2IG5leHQgcmVzZXQgY3VycmVudCBrZXkgbWluIG1heCBpbl9hcnJheSBhcnJheV9zZWFyY2ggZXh0cmFjdCBjb21wYWN0IGFycmF5X2ZpbGwgcmFuZ2UgYXJyYXlfbXVsdGlzb3J0IGFycmF5X3B1c2ggYXJyYXlfcG9wIGFycmF5X3NoaWZ0IGFycmF5X3Vuc2hpZnQgYXJyYXlfc3BsaWNlIGFycmF5X3NsaWNlIGFycmF5X21lcmdlIGFycmF5X21lcmdlX3JlY3Vyc2l2ZSBhcnJheV9rZXlzIGFycmF5X3ZhbHVlcyBhcnJheV9jb3VudF92YWx1ZXMgYXJyYXlfcmV2ZXJzZSBhcnJheV9yZWR1Y2UgYXJyYXlfcGFkIGFycmF5X2ZsaXAgYXJyYXlfY2hhbmdlX2tleV9jYXNlIGFycmF5X3JhbmQgYXJyYXlfdW5pcXVlIGFycmF5X2ludGVyc2VjdCBhcnJheV9pbnRlcnNlY3RfYXNzb2MgYXJyYXlfZGlmZiBhcnJheV9kaWZmX2Fzc29jIGFycmF5X3N1bSBhcnJheV9maWx0ZXIgYXJyYXlfbWFwIGFycmF5X2NodW5rIGFycmF5X2tleV9leGlzdHMgYXJyYXlfaW50ZXJzZWN0X2tleSBhcnJheV9jb21iaW5lIGFycmF5X2NvbHVtbiBwb3Mgc2l6ZW9mIGtleV9leGlzdHMgYXNzZXJ0IGFzc2VydF9vcHRpb25zIHZlcnNpb25fY29tcGFyZSBmdG9rIHN0cl9yb3QxMyBhZ2dyZWdhdGUgc2Vzc2lvbl9uYW1lIHNlc3Npb25fbW9kdWxlX25hbWUgc2Vzc2lvbl9zYXZlX3BhdGggc2Vzc2lvbl9pZCBzZXNzaW9uX3JlZ2VuZXJhdGVfaWQgc2Vzc2lvbl9kZWNvZGUgc2Vzc2lvbl9yZWdpc3RlciBzZXNzaW9uX3VucmVnaXN0ZXIgc2Vzc2lvbl9pc19yZWdpc3RlcmVkIHNlc3Npb25fZW5jb2RlIHNlc3Npb25fc3RhcnQgc2Vzc2lvbl9kZXN0cm95IHNlc3Npb25fdW5zZXQgc2Vzc2lvbl9zZXRfc2F2ZV9oYW5kbGVyIHNlc3Npb25fY2FjaGVfbGltaXRlciBzZXNzaW9uX2NhY2hlX2V4cGlyZSBzZXNzaW9uX3NldF9jb29raWVfcGFyYW1zIHNlc3Npb25fZ2V0X2Nvb2tpZV9wYXJhbXMgc2Vzc2lvbl93cml0ZV9jbG9zZSBwcmVnX21hdGNoIHByZWdfbWF0Y2hfYWxsIHByZWdfcmVwbGFjZSBwcmVnX3JlcGxhY2VfY2FsbGJhY2sgcHJlZ19zcGxpdCBwcmVnX3F1b3RlIHByZWdfZ3JlcCBvdmVybG9hZCBjdHlwZV9hbG51bSBjdHlwZV9hbHBoYSBjdHlwZV9jbnRybCBjdHlwZV9kaWdpdCBjdHlwZV9sb3dlciBjdHlwZV9ncmFwaCBjdHlwZV9wcmludCBjdHlwZV9wdW5jdCBjdHlwZV9zcGFjZSBjdHlwZV91cHBlciBjdHlwZV94ZGlnaXQgdmlydHVhbCBhcGFjaGVfcmVxdWVzdF9oZWFkZXJzIGFwYWNoZV9ub3RlIGFwYWNoZV9sb29rdXBfdXJpIGFwYWNoZV9jaGlsZF90ZXJtaW5hdGUgYXBhY2hlX3NldGVudiBhcGFjaGVfcmVzcG9uc2VfaGVhZGVycyBhcGFjaGVfZ2V0X3ZlcnNpb24gZ2V0YWxsaGVhZGVycyBteXNxbF9jb25uZWN0IG15c3FsX3Bjb25uZWN0IG15c3FsX2Nsb3NlIG15c3FsX3NlbGVjdF9kYiBteXNxbF9jcmVhdGVfZGIgbXlzcWxfZHJvcF9kYiBteXNxbF9xdWVyeSBteXNxbF91bmJ1ZmZlcmVkX3F1ZXJ5IG15c3FsX2RiX3F1ZXJ5IG15c3FsX2xpc3RfZGJzIG15c3FsX2xpc3RfdGFibGVzIG15c3FsX2xpc3RfZmllbGRzIG15c3FsX2xpc3RfcHJvY2Vzc2VzIG15c3FsX2Vycm9yIG15c3FsX2Vycm5vIG15c3FsX2FmZmVjdGVkX3Jvd3MgbXlzcWxfaW5zZXJ0X2lkIG15c3FsX3Jlc3VsdCBteXNxbF9udW1fcm93cyBteXNxbF9udW1fZmllbGRzIG15c3FsX2ZldGNoX3JvdyBteXNxbF9mZXRjaF9hcnJheSBteXNxbF9mZXRjaF9hc3NvYyBteXNxbF9mZXRjaF9vYmplY3QgbXlzcWxfZGF0YV9zZWVrIG15c3FsX2ZldGNoX2xlbmd0aHMgbXlzcWxfZmV0Y2hfZmllbGQgbXlzcWxfZmllbGRfc2VlayBteXNxbF9mcmVlX3Jlc3VsdCBteXNxbF9maWVsZF9uYW1lIG15c3FsX2ZpZWxkX3RhYmxlIG15c3FsX2ZpZWxkX2xlbiBteXNxbF9maWVsZF90eXBlIG15c3FsX2ZpZWxkX2ZsYWdzIG15c3FsX2VzY2FwZV9zdHJpbmcgbXlzcWxfcmVhbF9lc2NhcGVfc3RyaW5nIG15c3FsX3N0YXQgbXlzcWxfdGhyZWFkX2lkIG15c3FsX2NsaWVudF9lbmNvZGluZyBteXNxbF9nZXRfY2xpZW50X2luZm8gbXlzcWxfZ2V0X2hvc3RfaW5mbyBteXNxbF9nZXRfcHJvdG9faW5mbyBteXNxbF9nZXRfc2VydmVyX2luZm8gbXlzcWxfaW5mbyBteXNxbCBteXNxbF9maWVsZG5hbWUgbXlzcWxfZmllbGR0YWJsZSBteXNxbF9maWVsZGxlbiBteXNxbF9maWVsZHR5cGUgbXlzcWxfZmllbGRmbGFncyBteXNxbF9zZWxlY3RkYiBteXNxbF9jcmVhdGVkYiBteXNxbF9kcm9wZGIgbXlzcWxfZnJlZXJlc3VsdCBteXNxbF9udW1maWVsZHMgbXlzcWxfbnVtcm93cyBteXNxbF9saXN0ZGJzIG15c3FsX2xpc3R0YWJsZXMgbXlzcWxfbGlzdGZpZWxkcyBteXNxbF9kYl9uYW1lIG15c3FsX2RibmFtZSBteXNxbF90YWJsZW5hbWUgbXlzcWxfdGFibGVfbmFtZSBwZ19jb25uZWN0IHBnX3Bjb25uZWN0IHBnX2Nsb3NlIHBnX2Nvbm5lY3Rpb25fc3RhdHVzIHBnX2Nvbm5lY3Rpb25fYnVzeSBwZ19jb25uZWN0aW9uX3Jlc2V0IHBnX2hvc3QgcGdfZGJuYW1lIHBnX3BvcnQgcGdfdHR5IHBnX29wdGlvbnMgcGdfcGluZyBwZ19xdWVyeSBwZ19zZW5kX3F1ZXJ5IHBnX2NhbmNlbF9xdWVyeSBwZ19mZXRjaF9yZXN1bHQgcGdfZmV0Y2hfcm93IHBnX2ZldGNoX2Fzc29jIHBnX2ZldGNoX2FycmF5IHBnX2ZldGNoX29iamVjdCBwZ19mZXRjaF9hbGwgcGdfYWZmZWN0ZWRfcm93cyBwZ19nZXRfcmVzdWx0IHBnX3Jlc3VsdF9zZWVrIHBnX3Jlc3VsdF9zdGF0dXMgcGdfZnJlZV9yZXN1bHQgcGdfbGFzdF9vaWQgcGdfbnVtX3Jvd3MgcGdfbnVtX2ZpZWxkcyBwZ19maWVsZF9uYW1lIHBnX2ZpZWxkX251bSBwZ19maWVsZF9zaXplIHBnX2ZpZWxkX3R5cGUgcGdfZmllbGRfcHJ0bGVuIHBnX2ZpZWxkX2lzX251bGwgcGdfZ2V0X25vdGlmeSBwZ19nZXRfcGlkIHBnX3Jlc3VsdF9lcnJvciBwZ19sYXN0X2Vycm9yIHBnX2xhc3Rfbm90aWNlIHBnX3B1dF9saW5lIHBnX2VuZF9jb3B5IHBnX2NvcHlfdG8gcGdfY29weV9mcm9tIHBnX3RyYWNlIHBnX3VudHJhY2UgcGdfbG9fY3JlYXRlIHBnX2xvX3VubGluayBwZ19sb19vcGVuIHBnX2xvX2Nsb3NlIHBnX2xvX3JlYWQgcGdfbG9fd3JpdGUgcGdfbG9fcmVhZF9hbGwgcGdfbG9faW1wb3J0IHBnX2xvX2V4cG9ydCBwZ19sb19zZWVrIHBnX2xvX3RlbGwgcGdfZXNjYXBlX3N0cmluZyBwZ19lc2NhcGVfYnl0ZWEgcGdfdW5lc2NhcGVfYnl0ZWEgcGdfY2xpZW50X2VuY29kaW5nIHBnX3NldF9jbGllbnRfZW5jb2RpbmcgcGdfbWV0YV9kYXRhIHBnX2NvbnZlcnQgcGdfaW5zZXJ0IHBnX3VwZGF0ZSBwZ19kZWxldGUgcGdfc2VsZWN0IHBnX2V4ZWMgcGdfZ2V0bGFzdG9pZCBwZ19jbWR0dXBsZXMgcGdfZXJyb3JtZXNzYWdlIHBnX251bXJvd3MgcGdfbnVtZmllbGRzIHBnX2ZpZWxkbmFtZSBwZ19maWVsZHNpemUgcGdfZmllbGR0eXBlIHBnX2ZpZWxkbnVtIHBnX2ZpZWxkcHJ0bGVuIHBnX2ZpZWxkaXNudWxsIHBnX2ZyZWVyZXN1bHQgcGdfcmVzdWx0IHBnX2xvcmVhZGFsbCBwZ19sb2NyZWF0ZSBwZ19sb3VubGluayBwZ19sb29wZW4gcGdfbG9jbG9zZSBwZ19sb3JlYWQgcGdfbG93cml0ZSBwZ19sb2ltcG9ydCBwZ19sb2V4cG9ydCBodHRwX3Jlc3BvbnNlX2NvZGUgZ2V0X2RlY2xhcmVkX3RyYWl0cyBnZXRpbWFnZXNpemVmcm9tc3RyaW5nIHNvY2tldF9pbXBvcnRfc3RyZWFtIHN0cmVhbV9zZXRfY2h1bmtfc2l6ZSB0cmFpdF9leGlzdHMgaGVhZGVyX3JlZ2lzdGVyX2NhbGxiYWNrIGNsYXNzX3VzZXMgc2Vzc2lvbl9zdGF0dXMgc2Vzc2lvbl9yZWdpc3Rlcl9zaHV0ZG93biBlY2hvIHByaW50IGdsb2JhbCBzdGF0aWMgZXhpdCBhcnJheSBlbXB0eSBldmFsIGlzc2V0IHVuc2V0IGRpZSBpbmNsdWRlIHJlcXVpcmUgaW5jbHVkZV9vbmNlIHJlcXVpcmVfb25jZSBqc29uX2RlY29kZSBqc29uX2VuY29kZSBqc29uX2xhc3RfZXJyb3IganNvbl9sYXN0X2Vycm9yX21zZyBjdXJsX2Nsb3NlIGN1cmxfY29weV9oYW5kbGUgY3VybF9lcnJubyBjdXJsX2Vycm9yIGN1cmxfZXNjYXBlIGN1cmxfZXhlYyBjdXJsX2ZpbGVfY3JlYXRlIGN1cmxfZ2V0aW5mbyBjdXJsX2luaXQgY3VybF9tdWx0aV9hZGRfaGFuZGxlIGN1cmxfbXVsdGlfY2xvc2UgY3VybF9tdWx0aV9leGVjIGN1cmxfbXVsdGlfZ2V0Y29udGVudCBjdXJsX211bHRpX2luZm9fcmVhZCBjdXJsX211bHRpX2luaXQgY3VybF9tdWx0aV9yZW1vdmVfaGFuZGxlIGN1cmxfbXVsdGlfc2VsZWN0IGN1cmxfbXVsdGlfc2V0b3B0IGN1cmxfbXVsdGlfc3RyZXJyb3IgY3VybF9wYXVzZSBjdXJsX3Jlc2V0IGN1cmxfc2V0b3B0X2FycmF5IGN1cmxfc2V0b3B0IGN1cmxfc2hhcmVfY2xvc2UgY3VybF9zaGFyZV9pbml0IGN1cmxfc2hhcmVfc2V0b3B0IGN1cmxfc3RyZXJyb3IgY3VybF91bmVzY2FwZSBjdXJsX3ZlcnNpb24gbXlzcWxpX2FmZmVjdGVkX3Jvd3MgbXlzcWxpX2F1dG9jb21taXQgbXlzcWxpX2NoYW5nZV91c2VyIG15c3FsaV9jaGFyYWN0ZXJfc2V0X25hbWUgbXlzcWxpX2Nsb3NlIG15c3FsaV9jb21taXQgbXlzcWxpX2Nvbm5lY3RfZXJybm8gbXlzcWxpX2Nvbm5lY3RfZXJyb3IgbXlzcWxpX2Nvbm5lY3QgbXlzcWxpX2RhdGFfc2VlayBteXNxbGlfZGVidWcgbXlzcWxpX2R1bXBfZGVidWdfaW5mbyBteXNxbGlfZXJybm8gbXlzcWxpX2Vycm9yX2xpc3QgbXlzcWxpX2Vycm9yIG15c3FsaV9mZXRjaF9hbGwgbXlzcWxpX2ZldGNoX2FycmF5IG15c3FsaV9mZXRjaF9hc3NvYyBteXNxbGlfZmV0Y2hfZmllbGRfZGlyZWN0IG15c3FsaV9mZXRjaF9maWVsZCBteXNxbGlfZmV0Y2hfZmllbGRzIG15c3FsaV9mZXRjaF9sZW5ndGhzIG15c3FsaV9mZXRjaF9vYmplY3QgbXlzcWxpX2ZldGNoX3JvdyBteXNxbGlfZmllbGRfY291bnQgbXlzcWxpX2ZpZWxkX3NlZWsgbXlzcWxpX2ZpZWxkX3RlbGwgbXlzcWxpX2ZyZWVfcmVzdWx0IG15c3FsaV9nZXRfY2hhcnNldCBteXNxbGlfZ2V0X2NsaWVudF9pbmZvIG15c3FsaV9nZXRfY2xpZW50X3N0YXRzIG15c3FsaV9nZXRfY2xpZW50X3ZlcnNpb24gbXlzcWxpX2dldF9jb25uZWN0aW9uX3N0YXRzIG15c3FsaV9nZXRfaG9zdF9pbmZvIG15c3FsaV9nZXRfcHJvdG9faW5mbyBteXNxbGlfZ2V0X3NlcnZlcl9pbmZvIG15c3FsaV9nZXRfc2VydmVyX3ZlcnNpb24gbXlzcWxpX2luZm8gbXlzcWxpX2luaXQgbXlzcWxpX2luc2VydF9pZCBteXNxbGlfa2lsbCBteXNxbGlfbW9yZV9yZXN1bHRzIG15c3FsaV9tdWx0aV9xdWVyeSBteXNxbGlfbmV4dF9yZXN1bHQgbXlzcWxpX251bV9maWVsZHMgbXlzcWxpX251bV9yb3dzIG15c3FsaV9vcHRpb25zIG15c3FsaV9waW5nIG15c3FsaV9wcmVwYXJlIG15c3FsaV9xdWVyeSBteXNxbGlfcmVhbF9jb25uZWN0IG15c3FsaV9yZWFsX2VzY2FwZV9zdHJpbmcgbXlzcWxpX3JlYWxfcXVlcnkgbXlzcWxpX3JlYXBfYXN5bmNfcXVlcnkgbXlzcWxpX3JlZnJlc2ggbXlzcWxpX3JvbGxiYWNrIG15c3FsaV9zZWxlY3RfZGIgbXlzcWxpX3NldF9jaGFyc2V0IG15c3FsaV9zZXRfbG9jYWxfaW5maWxlX2RlZmF1bHQgbXlzcWxpX3NldF9sb2NhbF9pbmZpbGVfaGFuZGxlciBteXNxbGlfc3Fsc3RhdGUgbXlzcWxpX3NzbF9zZXQgbXlzcWxpX3N0YXQgbXlzcWxpX3N0bXRfaW5pdCBteXNxbGlfc3RvcmVfcmVzdWx0IG15c3FsaV90aHJlYWRfaWQgbXlzcWxpX3RocmVhZF9zYWZlIG15c3FsaV91c2VfcmVzdWx0IG15c3FsaV93YXJuaW5nX2NvdW50XCI7XG4gIENvZGVNaXJyb3IucmVnaXN0ZXJIZWxwZXIoXCJoaW50V29yZHNcIiwgXCJwaHBcIiwgW3BocEtleXdvcmRzLCBwaHBBdG9tcywgcGhwQnVpbHRpbl0uam9pbihcIiBcIikuc3BsaXQoXCIgXCIpKTtcbiAgQ29kZU1pcnJvci5yZWdpc3RlckhlbHBlcihcIndvcmRDaGFyc1wiLCBcInBocFwiLCAvW1xcdyRdLyk7XG5cbiAgdmFyIHBocENvbmZpZyA9IHtcbiAgICBuYW1lOiBcImNsaWtlXCIsXG4gICAgaGVscGVyVHlwZTogXCJwaHBcIixcbiAgICBrZXl3b3Jkczoga2V5d29yZHMocGhwS2V5d29yZHMpLFxuICAgIGJsb2NrS2V5d29yZHM6IGtleXdvcmRzKFwiY2F0Y2ggZG8gZWxzZSBlbHNlaWYgZm9yIGZvcmVhY2ggaWYgc3dpdGNoIHRyeSB3aGlsZSBmaW5hbGx5XCIpLFxuICAgIGRlZktleXdvcmRzOiBrZXl3b3JkcyhcImNsYXNzIGZ1bmN0aW9uIGludGVyZmFjZSBuYW1lc3BhY2UgdHJhaXRcIiksXG4gICAgYXRvbXM6IGtleXdvcmRzKHBocEF0b21zKSxcbiAgICBidWlsdGluOiBrZXl3b3JkcyhwaHBCdWlsdGluKSxcbiAgICBtdWx0aUxpbmVTdHJpbmdzOiB0cnVlLFxuICAgIGhvb2tzOiB7XG4gICAgICBcIiRcIjogZnVuY3Rpb24oc3RyZWFtKSB7XG4gICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1xcd1xcJF9dLyk7XG4gICAgICAgIHJldHVybiBcInZhcmlhYmxlLTJcIjtcbiAgICAgIH0sXG4gICAgICBcIjxcIjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkge1xuICAgICAgICB2YXIgYmVmb3JlO1xuICAgICAgICBpZiAoYmVmb3JlID0gc3RyZWFtLm1hdGNoKC88PFxccyovKSkge1xuICAgICAgICAgIHZhciBxdW90ZWQgPSBzdHJlYW0uZWF0KC9bJ1wiXS8pO1xuICAgICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1xcd1xcLl0vKTtcbiAgICAgICAgICB2YXIgZGVsaW0gPSBzdHJlYW0uY3VycmVudCgpLnNsaWNlKGJlZm9yZVswXS5sZW5ndGggKyAocXVvdGVkID8gMiA6IDEpKTtcbiAgICAgICAgICBpZiAocXVvdGVkKSBzdHJlYW0uZWF0KHF1b3RlZCk7XG4gICAgICAgICAgaWYgKGRlbGltKSB7XG4gICAgICAgICAgICAoc3RhdGUudG9rU3RhY2sgfHwgKHN0YXRlLnRva1N0YWNrID0gW10pKS5wdXNoKGRlbGltLCAwKTtcbiAgICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gcGhwU3RyaW5nKGRlbGltLCBxdW90ZWQgIT0gXCInXCIpO1xuICAgICAgICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0sXG4gICAgICBcIiNcIjogZnVuY3Rpb24oc3RyZWFtKSB7XG4gICAgICAgIHdoaWxlICghc3RyZWFtLmVvbCgpICYmICFzdHJlYW0ubWF0Y2goXCI/PlwiLCBmYWxzZSkpIHN0cmVhbS5uZXh0KCk7XG4gICAgICAgIHJldHVybiBcImNvbW1lbnRcIjtcbiAgICAgIH0sXG4gICAgICBcIi9cIjogZnVuY3Rpb24oc3RyZWFtKSB7XG4gICAgICAgIGlmIChzdHJlYW0uZWF0KFwiL1wiKSkge1xuICAgICAgICAgIHdoaWxlICghc3RyZWFtLmVvbCgpICYmICFzdHJlYW0ubWF0Y2goXCI/PlwiLCBmYWxzZSkpIHN0cmVhbS5uZXh0KCk7XG4gICAgICAgICAgcmV0dXJuIFwiY29tbWVudFwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0sXG4gICAgICAnXCInOiBmdW5jdGlvbihfc3RyZWFtLCBzdGF0ZSkge1xuICAgICAgICAoc3RhdGUudG9rU3RhY2sgfHwgKHN0YXRlLnRva1N0YWNrID0gW10pKS5wdXNoKCdcIicsIDApO1xuICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHBocFN0cmluZygnXCInKTtcbiAgICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gICAgICB9LFxuICAgICAgXCJ7XCI6IGZ1bmN0aW9uKF9zdHJlYW0sIHN0YXRlKSB7XG4gICAgICAgIGlmIChzdGF0ZS50b2tTdGFjayAmJiBzdGF0ZS50b2tTdGFjay5sZW5ndGgpXG4gICAgICAgICAgc3RhdGUudG9rU3RhY2tbc3RhdGUudG9rU3RhY2subGVuZ3RoIC0gMV0rKztcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSxcbiAgICAgIFwifVwiOiBmdW5jdGlvbihfc3RyZWFtLCBzdGF0ZSkge1xuICAgICAgICBpZiAoc3RhdGUudG9rU3RhY2sgJiYgc3RhdGUudG9rU3RhY2subGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgIS0tc3RhdGUudG9rU3RhY2tbc3RhdGUudG9rU3RhY2subGVuZ3RoIC0gMV0pIHtcbiAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHBocFN0cmluZyhzdGF0ZS50b2tTdGFja1tzdGF0ZS50b2tTdGFjay5sZW5ndGggLSAyXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBDb2RlTWlycm9yLmRlZmluZU1vZGUoXCJwaHBcIiwgZnVuY3Rpb24oY29uZmlnLCBwYXJzZXJDb25maWcpIHtcbiAgICB2YXIgaHRtbE1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoY29uZmlnLCAocGFyc2VyQ29uZmlnICYmIHBhcnNlckNvbmZpZy5odG1sTW9kZSkgfHwgXCJ0ZXh0L2h0bWxcIik7XG4gICAgdmFyIHBocE1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoY29uZmlnLCBwaHBDb25maWcpO1xuXG4gICAgZnVuY3Rpb24gZGlzcGF0Y2goc3RyZWFtLCBzdGF0ZSkge1xuICAgICAgdmFyIGlzUEhQID0gc3RhdGUuY3VyTW9kZSA9PSBwaHBNb2RlO1xuICAgICAgaWYgKHN0cmVhbS5zb2woKSAmJiBzdGF0ZS5wZW5kaW5nICYmIHN0YXRlLnBlbmRpbmcgIT0gJ1wiJyAmJiBzdGF0ZS5wZW5kaW5nICE9IFwiJ1wiKSBzdGF0ZS5wZW5kaW5nID0gbnVsbDtcbiAgICAgIGlmICghaXNQSFApIHtcbiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXjxcXD9cXHcqLykpIHtcbiAgICAgICAgICBzdGF0ZS5jdXJNb2RlID0gcGhwTW9kZTtcbiAgICAgICAgICBpZiAoIXN0YXRlLnBocCkgc3RhdGUucGhwID0gQ29kZU1pcnJvci5zdGFydFN0YXRlKHBocE1vZGUsIGh0bWxNb2RlLmluZGVudChzdGF0ZS5odG1sLCBcIlwiLCBcIlwiKSlcbiAgICAgICAgICBzdGF0ZS5jdXJTdGF0ZSA9IHN0YXRlLnBocDtcbiAgICAgICAgICByZXR1cm4gXCJtZXRhXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLnBlbmRpbmcgPT0gJ1wiJyB8fCBzdGF0ZS5wZW5kaW5nID09IFwiJ1wiKSB7XG4gICAgICAgICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkgJiYgc3RyZWFtLm5leHQoKSAhPSBzdGF0ZS5wZW5kaW5nKSB7fVxuICAgICAgICAgIHZhciBzdHlsZSA9IFwic3RyaW5nXCI7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUucGVuZGluZyAmJiBzdHJlYW0ucG9zIDwgc3RhdGUucGVuZGluZy5lbmQpIHtcbiAgICAgICAgICBzdHJlYW0ucG9zID0gc3RhdGUucGVuZGluZy5lbmQ7XG4gICAgICAgICAgdmFyIHN0eWxlID0gc3RhdGUucGVuZGluZy5zdHlsZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgc3R5bGUgPSBodG1sTW9kZS50b2tlbihzdHJlYW0sIHN0YXRlLmN1clN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUucGVuZGluZykgc3RhdGUucGVuZGluZyA9IG51bGw7XG4gICAgICAgIHZhciBjdXIgPSBzdHJlYW0uY3VycmVudCgpLCBvcGVuUEhQID0gY3VyLnNlYXJjaCgvPFxcPy8pLCBtO1xuICAgICAgICBpZiAob3BlblBIUCAhPSAtMSkge1xuICAgICAgICAgIGlmIChzdHlsZSA9PSBcInN0cmluZ1wiICYmIChtID0gY3VyLm1hdGNoKC9bXFwnXFxcIl0kLykpICYmICEvXFw/Pi8udGVzdChjdXIpKSBzdGF0ZS5wZW5kaW5nID0gbVswXTtcbiAgICAgICAgICBlbHNlIHN0YXRlLnBlbmRpbmcgPSB7ZW5kOiBzdHJlYW0ucG9zLCBzdHlsZTogc3R5bGV9O1xuICAgICAgICAgIHN0cmVhbS5iYWNrVXAoY3VyLmxlbmd0aCAtIG9wZW5QSFApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICAgIH0gZWxzZSBpZiAoaXNQSFAgJiYgc3RhdGUucGhwLnRva2VuaXplID09IG51bGwgJiYgc3RyZWFtLm1hdGNoKFwiPz5cIikpIHtcbiAgICAgICAgc3RhdGUuY3VyTW9kZSA9IGh0bWxNb2RlO1xuICAgICAgICBzdGF0ZS5jdXJTdGF0ZSA9IHN0YXRlLmh0bWw7XG4gICAgICAgIGlmICghc3RhdGUucGhwLmNvbnRleHQucHJldikgc3RhdGUucGhwID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIFwibWV0YVwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHBocE1vZGUudG9rZW4oc3RyZWFtLCBzdGF0ZS5jdXJTdGF0ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgaHRtbCA9IENvZGVNaXJyb3Iuc3RhcnRTdGF0ZShodG1sTW9kZSlcbiAgICAgICAgdmFyIHBocCA9IHBhcnNlckNvbmZpZy5zdGFydE9wZW4gPyBDb2RlTWlycm9yLnN0YXJ0U3RhdGUocGhwTW9kZSkgOiBudWxsXG4gICAgICAgIHJldHVybiB7aHRtbDogaHRtbCxcbiAgICAgICAgICAgICAgICBwaHA6IHBocCxcbiAgICAgICAgICAgICAgICBjdXJNb2RlOiBwYXJzZXJDb25maWcuc3RhcnRPcGVuID8gcGhwTW9kZSA6IGh0bWxNb2RlLFxuICAgICAgICAgICAgICAgIGN1clN0YXRlOiBwYXJzZXJDb25maWcuc3RhcnRPcGVuID8gcGhwIDogaHRtbCxcbiAgICAgICAgICAgICAgICBwZW5kaW5nOiBudWxsfTtcbiAgICAgIH0sXG5cbiAgICAgIGNvcHlTdGF0ZTogZnVuY3Rpb24oc3RhdGUpIHtcbiAgICAgICAgdmFyIGh0bWwgPSBzdGF0ZS5odG1sLCBodG1sTmV3ID0gQ29kZU1pcnJvci5jb3B5U3RhdGUoaHRtbE1vZGUsIGh0bWwpLFxuICAgICAgICAgICAgcGhwID0gc3RhdGUucGhwLCBwaHBOZXcgPSBwaHAgJiYgQ29kZU1pcnJvci5jb3B5U3RhdGUocGhwTW9kZSwgcGhwKSwgY3VyO1xuICAgICAgICBpZiAoc3RhdGUuY3VyTW9kZSA9PSBodG1sTW9kZSkgY3VyID0gaHRtbE5ldztcbiAgICAgICAgZWxzZSBjdXIgPSBwaHBOZXc7XG4gICAgICAgIHJldHVybiB7aHRtbDogaHRtbE5ldywgcGhwOiBwaHBOZXcsIGN1ck1vZGU6IHN0YXRlLmN1ck1vZGUsIGN1clN0YXRlOiBjdXIsXG4gICAgICAgICAgICAgICAgcGVuZGluZzogc3RhdGUucGVuZGluZ307XG4gICAgICB9LFxuXG4gICAgICB0b2tlbjogZGlzcGF0Y2gsXG5cbiAgICAgIGluZGVudDogZnVuY3Rpb24oc3RhdGUsIHRleHRBZnRlciwgbGluZSkge1xuICAgICAgICBpZiAoKHN0YXRlLmN1ck1vZGUgIT0gcGhwTW9kZSAmJiAvXlxccyo8XFwvLy50ZXN0KHRleHRBZnRlcikpIHx8XG4gICAgICAgICAgICAoc3RhdGUuY3VyTW9kZSA9PSBwaHBNb2RlICYmIC9eXFw/Pi8udGVzdCh0ZXh0QWZ0ZXIpKSlcbiAgICAgICAgICByZXR1cm4gaHRtbE1vZGUuaW5kZW50KHN0YXRlLmh0bWwsIHRleHRBZnRlciwgbGluZSk7XG4gICAgICAgIHJldHVybiBzdGF0ZS5jdXJNb2RlLmluZGVudChzdGF0ZS5jdXJTdGF0ZSwgdGV4dEFmdGVyLCBsaW5lKTtcbiAgICAgIH0sXG5cbiAgICAgIGJsb2NrQ29tbWVudFN0YXJ0OiBcIi8qXCIsXG4gICAgICBibG9ja0NvbW1lbnRFbmQ6IFwiKi9cIixcbiAgICAgIGxpbmVDb21tZW50OiBcIi8vXCIsXG5cbiAgICAgIGlubmVyTW9kZTogZnVuY3Rpb24oc3RhdGUpIHsgcmV0dXJuIHtzdGF0ZTogc3RhdGUuY3VyU3RhdGUsIG1vZGU6IHN0YXRlLmN1ck1vZGV9OyB9XG4gICAgfTtcbiAgfSwgXCJodG1sbWl4ZWRcIiwgXCJjbGlrZVwiKTtcblxuICBDb2RlTWlycm9yLmRlZmluZU1JTUUoXCJhcHBsaWNhdGlvbi94LWh0dHBkLXBocFwiLCBcInBocFwiKTtcbiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKFwiYXBwbGljYXRpb24veC1odHRwZC1waHAtb3BlblwiLCB7bmFtZTogXCJwaHBcIiwgc3RhcnRPcGVuOiB0cnVlfSk7XG4gIENvZGVNaXJyb3IuZGVmaW5lTUlNRShcInRleHQveC1waHBcIiwgcGhwQ29uZmlnKTtcbn0pO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/codemirror/mode/php/php.js\n"); +eval("// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n if (true) // CommonJS\n mod(__webpack_require__(/*! ../../lib/codemirror */ \"./node_modules/codemirror/lib/codemirror.js\"), __webpack_require__(/*! ../htmlmixed/htmlmixed */ \"./node_modules/codemirror/mode/htmlmixed/htmlmixed.js\"), __webpack_require__(/*! ../clike/clike */ \"./node_modules/codemirror/mode/clike/clike.js\"));\n else {}\n})(function(CodeMirror) {\n \"use strict\";\n\n function keywords(str) {\n var obj = {}, words = str.split(\" \");\n for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n return obj;\n }\n\n // Helper for phpString\n function matchSequence(list, end, escapes) {\n if (list.length == 0) return phpString(end);\n return function (stream, state) {\n var patterns = list[0];\n for (var i = 0; i < patterns.length; i++) if (stream.match(patterns[i][0])) {\n state.tokenize = matchSequence(list.slice(1), end);\n return patterns[i][1];\n }\n state.tokenize = phpString(end, escapes);\n return \"string\";\n };\n }\n function phpString(closing, escapes) {\n return function(stream, state) { return phpString_(stream, state, closing, escapes); };\n }\n function phpString_(stream, state, closing, escapes) {\n // \"Complex\" syntax\n if (escapes !== false && stream.match(\"${\", false) || stream.match(\"{$\", false)) {\n state.tokenize = null;\n return \"string\";\n }\n\n // Simple syntax\n if (escapes !== false && stream.match(/^\\$[a-zA-Z_][a-zA-Z0-9_]*/)) {\n // After the variable name there may appear array or object operator.\n if (stream.match(\"[\", false)) {\n // Match array operator\n state.tokenize = matchSequence([\n [[\"[\", null]],\n [[/\\d[\\w\\.]*/, \"number\"],\n [/\\$[a-zA-Z_][a-zA-Z0-9_]*/, \"variable-2\"],\n [/[\\w\\$]+/, \"variable\"]],\n [[\"]\", null]]\n ], closing, escapes);\n }\n if (stream.match(/^->\\w/, false)) {\n // Match object operator\n state.tokenize = matchSequence([\n [[\"->\", null]],\n [[/[\\w]+/, \"variable\"]]\n ], closing, escapes);\n }\n return \"variable-2\";\n }\n\n var escaped = false;\n // Normal string\n while (!stream.eol() &&\n (escaped || escapes === false ||\n (!stream.match(\"{$\", false) &&\n !stream.match(/^(\\$[a-zA-Z_][a-zA-Z0-9_]*|\\$\\{)/, false)))) {\n if (!escaped && stream.match(closing)) {\n state.tokenize = null;\n state.tokStack.pop(); state.tokStack.pop();\n break;\n }\n escaped = stream.next() == \"\\\\\" && !escaped;\n }\n return \"string\";\n }\n\n var phpKeywords = \"abstract and array as break case catch class clone const continue declare default \" +\n \"do else elseif enddeclare endfor endforeach endif endswitch endwhile extends final \" +\n \"for foreach function global goto if implements interface instanceof namespace \" +\n \"new or private protected public static switch throw trait try use var while xor \" +\n \"die echo empty exit eval include include_once isset list require require_once return \" +\n \"print unset __halt_compiler self static parent yield insteadof finally\";\n var phpAtoms = \"true false null TRUE FALSE NULL __CLASS__ __DIR__ __FILE__ __LINE__ __METHOD__ __FUNCTION__ __NAMESPACE__ __TRAIT__\";\n var phpBuiltin = \"func_num_args func_get_arg func_get_args strlen strcmp strncmp strcasecmp strncasecmp each error_reporting define defined trigger_error user_error set_error_handler restore_error_handler get_declared_classes get_loaded_extensions extension_loaded get_extension_funcs debug_backtrace constant bin2hex hex2bin sleep usleep time mktime gmmktime strftime gmstrftime strtotime date gmdate getdate localtime checkdate flush wordwrap htmlspecialchars htmlentities html_entity_decode md5 md5_file crc32 getimagesize image_type_to_mime_type phpinfo phpversion phpcredits strnatcmp strnatcasecmp substr_count strspn strcspn strtok strtoupper strtolower strpos strrpos strrev hebrev hebrevc nl2br basename dirname pathinfo stripslashes stripcslashes strstr stristr strrchr str_shuffle str_word_count strcoll substr substr_replace quotemeta ucfirst ucwords strtr addslashes addcslashes rtrim str_replace str_repeat count_chars chunk_split trim ltrim strip_tags similar_text explode implode setlocale localeconv parse_str str_pad chop strchr sprintf printf vprintf vsprintf sscanf fscanf parse_url urlencode urldecode rawurlencode rawurldecode readlink linkinfo link unlink exec system escapeshellcmd escapeshellarg passthru shell_exec proc_open proc_close rand srand getrandmax mt_rand mt_srand mt_getrandmax base64_decode base64_encode abs ceil floor round is_finite is_nan is_infinite bindec hexdec octdec decbin decoct dechex base_convert number_format fmod ip2long long2ip getenv putenv getopt microtime gettimeofday getrusage uniqid quoted_printable_decode set_time_limit get_cfg_var magic_quotes_runtime set_magic_quotes_runtime get_magic_quotes_gpc get_magic_quotes_runtime import_request_variables error_log serialize unserialize memory_get_usage memory_get_peak_usage var_dump var_export debug_zval_dump print_r highlight_file show_source highlight_string ini_get ini_get_all ini_set ini_alter ini_restore get_include_path set_include_path restore_include_path setcookie header headers_sent connection_aborted connection_status ignore_user_abort parse_ini_file is_uploaded_file move_uploaded_file intval floatval doubleval strval gettype settype is_null is_resource is_bool is_long is_float is_int is_integer is_double is_real is_numeric is_string is_array is_object is_scalar ereg ereg_replace eregi eregi_replace split spliti join sql_regcase dl pclose popen readfile rewind rmdir umask fclose feof fgetc fgets fgetss fread fopen fpassthru ftruncate fstat fseek ftell fflush fwrite fputs mkdir rename copy tempnam tmpfile file file_get_contents file_put_contents stream_select stream_context_create stream_context_set_params stream_context_set_option stream_context_get_options stream_filter_prepend stream_filter_append fgetcsv flock get_meta_tags stream_set_write_buffer set_file_buffer set_socket_blocking stream_set_blocking socket_set_blocking stream_get_meta_data stream_register_wrapper stream_wrapper_register stream_set_timeout socket_set_timeout socket_get_status realpath fnmatch fsockopen pfsockopen pack unpack get_browser crypt opendir closedir chdir getcwd rewinddir readdir dir glob fileatime filectime filegroup fileinode filemtime fileowner fileperms filesize filetype file_exists is_writable is_writeable is_readable is_executable is_file is_dir is_link stat lstat chown touch clearstatcache mail ob_start ob_flush ob_clean ob_end_flush ob_end_clean ob_get_flush ob_get_clean ob_get_length ob_get_level ob_get_status ob_get_contents ob_implicit_flush ob_list_handlers ksort krsort natsort natcasesort asort arsort sort rsort usort uasort uksort shuffle array_walk count end prev next reset current key min max in_array array_search extract compact array_fill range array_multisort array_push array_pop array_shift array_unshift array_splice array_slice array_merge array_merge_recursive array_keys array_values array_count_values array_reverse array_reduce array_pad array_flip array_change_key_case array_rand array_unique array_intersect array_intersect_assoc array_diff array_diff_assoc array_sum array_filter array_map array_chunk array_key_exists array_intersect_key array_combine array_column pos sizeof key_exists assert assert_options version_compare ftok str_rot13 aggregate session_name session_module_name session_save_path session_id session_regenerate_id session_decode session_register session_unregister session_is_registered session_encode session_start session_destroy session_unset session_set_save_handler session_cache_limiter session_cache_expire session_set_cookie_params session_get_cookie_params session_write_close preg_match preg_match_all preg_replace preg_replace_callback preg_split preg_quote preg_grep overload ctype_alnum ctype_alpha ctype_cntrl ctype_digit ctype_lower ctype_graph ctype_print ctype_punct ctype_space ctype_upper ctype_xdigit virtual apache_request_headers apache_note apache_lookup_uri apache_child_terminate apache_setenv apache_response_headers apache_get_version getallheaders mysql_connect mysql_pconnect mysql_close mysql_select_db mysql_create_db mysql_drop_db mysql_query mysql_unbuffered_query mysql_db_query mysql_list_dbs mysql_list_tables mysql_list_fields mysql_list_processes mysql_error mysql_errno mysql_affected_rows mysql_insert_id mysql_result mysql_num_rows mysql_num_fields mysql_fetch_row mysql_fetch_array mysql_fetch_assoc mysql_fetch_object mysql_data_seek mysql_fetch_lengths mysql_fetch_field mysql_field_seek mysql_free_result mysql_field_name mysql_field_table mysql_field_len mysql_field_type mysql_field_flags mysql_escape_string mysql_real_escape_string mysql_stat mysql_thread_id mysql_client_encoding mysql_get_client_info mysql_get_host_info mysql_get_proto_info mysql_get_server_info mysql_info mysql mysql_fieldname mysql_fieldtable mysql_fieldlen mysql_fieldtype mysql_fieldflags mysql_selectdb mysql_createdb mysql_dropdb mysql_freeresult mysql_numfields mysql_numrows mysql_listdbs mysql_listtables mysql_listfields mysql_db_name mysql_dbname mysql_tablename mysql_table_name pg_connect pg_pconnect pg_close pg_connection_status pg_connection_busy pg_connection_reset pg_host pg_dbname pg_port pg_tty pg_options pg_ping pg_query pg_send_query pg_cancel_query pg_fetch_result pg_fetch_row pg_fetch_assoc pg_fetch_array pg_fetch_object pg_fetch_all pg_affected_rows pg_get_result pg_result_seek pg_result_status pg_free_result pg_last_oid pg_num_rows pg_num_fields pg_field_name pg_field_num pg_field_size pg_field_type pg_field_prtlen pg_field_is_null pg_get_notify pg_get_pid pg_result_error pg_last_error pg_last_notice pg_put_line pg_end_copy pg_copy_to pg_copy_from pg_trace pg_untrace pg_lo_create pg_lo_unlink pg_lo_open pg_lo_close pg_lo_read pg_lo_write pg_lo_read_all pg_lo_import pg_lo_export pg_lo_seek pg_lo_tell pg_escape_string pg_escape_bytea pg_unescape_bytea pg_client_encoding pg_set_client_encoding pg_meta_data pg_convert pg_insert pg_update pg_delete pg_select pg_exec pg_getlastoid pg_cmdtuples pg_errormessage pg_numrows pg_numfields pg_fieldname pg_fieldsize pg_fieldtype pg_fieldnum pg_fieldprtlen pg_fieldisnull pg_freeresult pg_result pg_loreadall pg_locreate pg_lounlink pg_loopen pg_loclose pg_loread pg_lowrite pg_loimport pg_loexport http_response_code get_declared_traits getimagesizefromstring socket_import_stream stream_set_chunk_size trait_exists header_register_callback class_uses session_status session_register_shutdown echo print global static exit array empty eval isset unset die include require include_once require_once json_decode json_encode json_last_error json_last_error_msg curl_close curl_copy_handle curl_errno curl_error curl_escape curl_exec curl_file_create curl_getinfo curl_init curl_multi_add_handle curl_multi_close curl_multi_exec curl_multi_getcontent curl_multi_info_read curl_multi_init curl_multi_remove_handle curl_multi_select curl_multi_setopt curl_multi_strerror curl_pause curl_reset curl_setopt_array curl_setopt curl_share_close curl_share_init curl_share_setopt curl_strerror curl_unescape curl_version mysqli_affected_rows mysqli_autocommit mysqli_change_user mysqli_character_set_name mysqli_close mysqli_commit mysqli_connect_errno mysqli_connect_error mysqli_connect mysqli_data_seek mysqli_debug mysqli_dump_debug_info mysqli_errno mysqli_error_list mysqli_error mysqli_fetch_all mysqli_fetch_array mysqli_fetch_assoc mysqli_fetch_field_direct mysqli_fetch_field mysqli_fetch_fields mysqli_fetch_lengths mysqli_fetch_object mysqli_fetch_row mysqli_field_count mysqli_field_seek mysqli_field_tell mysqli_free_result mysqli_get_charset mysqli_get_client_info mysqli_get_client_stats mysqli_get_client_version mysqli_get_connection_stats mysqli_get_host_info mysqli_get_proto_info mysqli_get_server_info mysqli_get_server_version mysqli_info mysqli_init mysqli_insert_id mysqli_kill mysqli_more_results mysqli_multi_query mysqli_next_result mysqli_num_fields mysqli_num_rows mysqli_options mysqli_ping mysqli_prepare mysqli_query mysqli_real_connect mysqli_real_escape_string mysqli_real_query mysqli_reap_async_query mysqli_refresh mysqli_rollback mysqli_select_db mysqli_set_charset mysqli_set_local_infile_default mysqli_set_local_infile_handler mysqli_sqlstate mysqli_ssl_set mysqli_stat mysqli_stmt_init mysqli_store_result mysqli_thread_id mysqli_thread_safe mysqli_use_result mysqli_warning_count\";\n CodeMirror.registerHelper(\"hintWords\", \"php\", [phpKeywords, phpAtoms, phpBuiltin].join(\" \").split(\" \"));\n CodeMirror.registerHelper(\"wordChars\", \"php\", /[\\w$]/);\n\n var phpConfig = {\n name: \"clike\",\n helperType: \"php\",\n keywords: keywords(phpKeywords),\n blockKeywords: keywords(\"catch do else elseif for foreach if switch try while finally\"),\n defKeywords: keywords(\"class function interface namespace trait\"),\n atoms: keywords(phpAtoms),\n builtin: keywords(phpBuiltin),\n multiLineStrings: true,\n hooks: {\n \"$\": function(stream) {\n stream.eatWhile(/[\\w\\$_]/);\n return \"variable-2\";\n },\n \"<\": function(stream, state) {\n var before;\n if (before = stream.match(/^<<\\s*/)) {\n var quoted = stream.eat(/['\"]/);\n stream.eatWhile(/[\\w\\.]/);\n var delim = stream.current().slice(before[0].length + (quoted ? 2 : 1));\n if (quoted) stream.eat(quoted);\n if (delim) {\n (state.tokStack || (state.tokStack = [])).push(delim, 0);\n state.tokenize = phpString(delim, quoted != \"'\");\n return \"string\";\n }\n }\n return false;\n },\n \"#\": function(stream) {\n while (!stream.eol() && !stream.match(\"?>\", false)) stream.next();\n return \"comment\";\n },\n \"/\": function(stream) {\n if (stream.eat(\"/\")) {\n while (!stream.eol() && !stream.match(\"?>\", false)) stream.next();\n return \"comment\";\n }\n return false;\n },\n '\"': function(_stream, state) {\n (state.tokStack || (state.tokStack = [])).push('\"', 0);\n state.tokenize = phpString('\"');\n return \"string\";\n },\n \"{\": function(_stream, state) {\n if (state.tokStack && state.tokStack.length)\n state.tokStack[state.tokStack.length - 1]++;\n return false;\n },\n \"}\": function(_stream, state) {\n if (state.tokStack && state.tokStack.length > 0 &&\n !--state.tokStack[state.tokStack.length - 1]) {\n state.tokenize = phpString(state.tokStack[state.tokStack.length - 2]);\n }\n return false;\n }\n }\n };\n\n CodeMirror.defineMode(\"php\", function(config, parserConfig) {\n var htmlMode = CodeMirror.getMode(config, (parserConfig && parserConfig.htmlMode) || \"text/html\");\n var phpMode = CodeMirror.getMode(config, phpConfig);\n\n function dispatch(stream, state) {\n var isPHP = state.curMode == phpMode;\n if (stream.sol() && state.pending && state.pending != '\"' && state.pending != \"'\") state.pending = null;\n if (!isPHP) {\n if (stream.match(/^<\\?\\w*/)) {\n state.curMode = phpMode;\n if (!state.php) state.php = CodeMirror.startState(phpMode, htmlMode.indent(state.html, \"\", \"\"))\n state.curState = state.php;\n return \"meta\";\n }\n if (state.pending == '\"' || state.pending == \"'\") {\n while (!stream.eol() && stream.next() != state.pending) {}\n var style = \"string\";\n } else if (state.pending && stream.pos < state.pending.end) {\n stream.pos = state.pending.end;\n var style = state.pending.style;\n } else {\n var style = htmlMode.token(stream, state.curState);\n }\n if (state.pending) state.pending = null;\n var cur = stream.current(), openPHP = cur.search(/<\\?/), m;\n if (openPHP != -1) {\n if (style == \"string\" && (m = cur.match(/[\\'\\\"]$/)) && !/\\?>/.test(cur)) state.pending = m[0];\n else state.pending = {end: stream.pos, style: style};\n stream.backUp(cur.length - openPHP);\n }\n return style;\n } else if (isPHP && state.php.tokenize == null && stream.match(\"?>\")) {\n state.curMode = htmlMode;\n state.curState = state.html;\n if (!state.php.context.prev) state.php = null;\n return \"meta\";\n } else {\n return phpMode.token(stream, state.curState);\n }\n }\n\n return {\n startState: function() {\n var html = CodeMirror.startState(htmlMode)\n var php = parserConfig.startOpen ? CodeMirror.startState(phpMode) : null\n return {html: html,\n php: php,\n curMode: parserConfig.startOpen ? phpMode : htmlMode,\n curState: parserConfig.startOpen ? php : html,\n pending: null};\n },\n\n copyState: function(state) {\n var html = state.html, htmlNew = CodeMirror.copyState(htmlMode, html),\n php = state.php, phpNew = php && CodeMirror.copyState(phpMode, php), cur;\n if (state.curMode == htmlMode) cur = htmlNew;\n else cur = phpNew;\n return {html: htmlNew, php: phpNew, curMode: state.curMode, curState: cur,\n pending: state.pending};\n },\n\n token: dispatch,\n\n indent: function(state, textAfter, line) {\n if ((state.curMode != phpMode && /^\\s*<\\//.test(textAfter)) ||\n (state.curMode == phpMode && /^\\?>/.test(textAfter)))\n return htmlMode.indent(state.html, textAfter, line);\n return state.curMode.indent(state.curState, textAfter, line);\n },\n\n blockCommentStart: \"/*\",\n blockCommentEnd: \"*/\",\n lineComment: \"//\",\n\n innerMode: function(state) { return {state: state.curState, mode: state.curMode}; }\n };\n }, \"htmlmixed\", \"clike\");\n\n CodeMirror.defineMIME(\"application/x-httpd-php\", \"php\");\n CodeMirror.defineMIME(\"application/x-httpd-php-open\", {name: \"php\", startOpen: true});\n CodeMirror.defineMIME(\"text/x-php\", phpConfig);\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vbm9kZV9tb2R1bGVzL2NvZGVtaXJyb3IvbW9kZS9waHAvcGhwLmpzPzQ0ZDUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7QUFFQTtBQUNBLE1BQU0sSUFBdUQ7QUFDN0QsUUFBUSxtQkFBTyxDQUFDLHlFQUFzQixHQUFHLG1CQUFPLENBQUMscUZBQXdCLEdBQUcsbUJBQU8sQ0FBQyxxRUFBZ0I7QUFDcEcsT0FBTyxFQUdhO0FBQ3BCLENBQUM7QUFDRDs7QUFFQTtBQUNBLGdCQUFnQjtBQUNoQixtQkFBbUIsa0JBQWtCO0FBQ3JDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixxQkFBcUI7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyxvREFBb0Q7QUFDeEY7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLDRCQUE0QjtBQUN6RTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0IsMkRBQTJEO0FBQzNEO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQztBQUNoQztBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0EsT0FBTzs7QUFFUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7O0FBRUEsa0NBQWtDLFNBQVMsNENBQTRDO0FBQ3ZGO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLHlEQUF5RCw2QkFBNkI7QUFDdEY7QUFDQSxDQUFDIiwiZmlsZSI6Ii4vbm9kZV9tb2R1bGVzL2NvZGVtaXJyb3IvbW9kZS9waHAvcGhwLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnNcbi8vIERpc3RyaWJ1dGVkIHVuZGVyIGFuIE1JVCBsaWNlbnNlOiBodHRwczovL2NvZGVtaXJyb3IubmV0L0xJQ0VOU0VcblxuKGZ1bmN0aW9uKG1vZCkge1xuICBpZiAodHlwZW9mIGV4cG9ydHMgPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgbW9kdWxlID09IFwib2JqZWN0XCIpIC8vIENvbW1vbkpTXG4gICAgbW9kKHJlcXVpcmUoXCIuLi8uLi9saWIvY29kZW1pcnJvclwiKSwgcmVxdWlyZShcIi4uL2h0bWxtaXhlZC9odG1sbWl4ZWRcIiksIHJlcXVpcmUoXCIuLi9jbGlrZS9jbGlrZVwiKSk7XG4gIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIC8vIEFNRFxuICAgIGRlZmluZShbXCIuLi8uLi9saWIvY29kZW1pcnJvclwiLCBcIi4uL2h0bWxtaXhlZC9odG1sbWl4ZWRcIiwgXCIuLi9jbGlrZS9jbGlrZVwiXSwgbW9kKTtcbiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudlxuICAgIG1vZChDb2RlTWlycm9yKTtcbn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgZnVuY3Rpb24ga2V5d29yZHMoc3RyKSB7XG4gICAgdmFyIG9iaiA9IHt9LCB3b3JkcyA9IHN0ci5zcGxpdChcIiBcIik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB3b3Jkcy5sZW5ndGg7ICsraSkgb2JqW3dvcmRzW2ldXSA9IHRydWU7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIC8vIEhlbHBlciBmb3IgcGhwU3RyaW5nXG4gIGZ1bmN0aW9uIG1hdGNoU2VxdWVuY2UobGlzdCwgZW5kLCBlc2NhcGVzKSB7XG4gICAgaWYgKGxpc3QubGVuZ3RoID09IDApIHJldHVybiBwaHBTdHJpbmcoZW5kKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHN0cmVhbSwgc3RhdGUpIHtcbiAgICAgIHZhciBwYXR0ZXJucyA9IGxpc3RbMF07XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdHRlcm5zLmxlbmd0aDsgaSsrKSBpZiAoc3RyZWFtLm1hdGNoKHBhdHRlcm5zW2ldWzBdKSkge1xuICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IG1hdGNoU2VxdWVuY2UobGlzdC5zbGljZSgxKSwgZW5kKTtcbiAgICAgICAgcmV0dXJuIHBhdHRlcm5zW2ldWzFdO1xuICAgICAgfVxuICAgICAgc3RhdGUudG9rZW5pemUgPSBwaHBTdHJpbmcoZW5kLCBlc2NhcGVzKTtcbiAgICAgIHJldHVybiBcInN0cmluZ1wiO1xuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gcGhwU3RyaW5nKGNsb3NpbmcsIGVzY2FwZXMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgeyByZXR1cm4gcGhwU3RyaW5nXyhzdHJlYW0sIHN0YXRlLCBjbG9zaW5nLCBlc2NhcGVzKTsgfTtcbiAgfVxuICBmdW5jdGlvbiBwaHBTdHJpbmdfKHN0cmVhbSwgc3RhdGUsIGNsb3NpbmcsIGVzY2FwZXMpIHtcbiAgICAvLyBcIkNvbXBsZXhcIiBzeW50YXhcbiAgICBpZiAoZXNjYXBlcyAhPT0gZmFsc2UgJiYgc3RyZWFtLm1hdGNoKFwiJHtcIiwgZmFsc2UpIHx8IHN0cmVhbS5tYXRjaChcInskXCIsIGZhbHNlKSkge1xuICAgICAgc3RhdGUudG9rZW5pemUgPSBudWxsO1xuICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gICAgfVxuXG4gICAgLy8gU2ltcGxlIHN5bnRheFxuICAgIGlmIChlc2NhcGVzICE9PSBmYWxzZSAmJiBzdHJlYW0ubWF0Y2goL15cXCRbYS16QS1aX11bYS16QS1aMC05X10qLykpIHtcbiAgICAgIC8vIEFmdGVyIHRoZSB2YXJpYWJsZSBuYW1lIHRoZXJlIG1heSBhcHBlYXIgYXJyYXkgb3Igb2JqZWN0IG9wZXJhdG9yLlxuICAgICAgaWYgKHN0cmVhbS5tYXRjaChcIltcIiwgZmFsc2UpKSB7XG4gICAgICAgIC8vIE1hdGNoIGFycmF5IG9wZXJhdG9yXG4gICAgICAgIHN0YXRlLnRva2VuaXplID0gbWF0Y2hTZXF1ZW5jZShbXG4gICAgICAgICAgW1tcIltcIiwgbnVsbF1dLFxuICAgICAgICAgIFtbL1xcZFtcXHdcXC5dKi8sIFwibnVtYmVyXCJdLFxuICAgICAgICAgICBbL1xcJFthLXpBLVpfXVthLXpBLVowLTlfXSovLCBcInZhcmlhYmxlLTJcIl0sXG4gICAgICAgICAgIFsvW1xcd1xcJF0rLywgXCJ2YXJpYWJsZVwiXV0sXG4gICAgICAgICAgW1tcIl1cIiwgbnVsbF1dXG4gICAgICAgIF0sIGNsb3NpbmcsIGVzY2FwZXMpO1xuICAgICAgfVxuICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXi0+XFx3LywgZmFsc2UpKSB7XG4gICAgICAgIC8vIE1hdGNoIG9iamVjdCBvcGVyYXRvclxuICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IG1hdGNoU2VxdWVuY2UoW1xuICAgICAgICAgIFtbXCItPlwiLCBudWxsXV0sXG4gICAgICAgICAgW1svW1xcd10rLywgXCJ2YXJpYWJsZVwiXV1cbiAgICAgICAgXSwgY2xvc2luZywgZXNjYXBlcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gXCJ2YXJpYWJsZS0yXCI7XG4gICAgfVxuXG4gICAgdmFyIGVzY2FwZWQgPSBmYWxzZTtcbiAgICAvLyBOb3JtYWwgc3RyaW5nXG4gICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkgJiZcbiAgICAgICAgICAgKGVzY2FwZWQgfHwgZXNjYXBlcyA9PT0gZmFsc2UgfHxcbiAgICAgICAgICAgICghc3RyZWFtLm1hdGNoKFwieyRcIiwgZmFsc2UpICYmXG4gICAgICAgICAgICAgIXN0cmVhbS5tYXRjaCgvXihcXCRbYS16QS1aX11bYS16QS1aMC05X10qfFxcJFxceykvLCBmYWxzZSkpKSkge1xuICAgICAgaWYgKCFlc2NhcGVkICYmIHN0cmVhbS5tYXRjaChjbG9zaW5nKSkge1xuICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IG51bGw7XG4gICAgICAgIHN0YXRlLnRva1N0YWNrLnBvcCgpOyBzdGF0ZS50b2tTdGFjay5wb3AoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBlc2NhcGVkID0gc3RyZWFtLm5leHQoKSA9PSBcIlxcXFxcIiAmJiAhZXNjYXBlZDtcbiAgICB9XG4gICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gIH1cblxuICB2YXIgcGhwS2V5d29yZHMgPSBcImFic3RyYWN0IGFuZCBhcnJheSBhcyBicmVhayBjYXNlIGNhdGNoIGNsYXNzIGNsb25lIGNvbnN0IGNvbnRpbnVlIGRlY2xhcmUgZGVmYXVsdCBcIiArXG4gICAgXCJkbyBlbHNlIGVsc2VpZiBlbmRkZWNsYXJlIGVuZGZvciBlbmRmb3JlYWNoIGVuZGlmIGVuZHN3aXRjaCBlbmR3aGlsZSBleHRlbmRzIGZpbmFsIFwiICtcbiAgICBcImZvciBmb3JlYWNoIGZ1bmN0aW9uIGdsb2JhbCBnb3RvIGlmIGltcGxlbWVudHMgaW50ZXJmYWNlIGluc3RhbmNlb2YgbmFtZXNwYWNlIFwiICtcbiAgICBcIm5ldyBvciBwcml2YXRlIHByb3RlY3RlZCBwdWJsaWMgc3RhdGljIHN3aXRjaCB0aHJvdyB0cmFpdCB0cnkgdXNlIHZhciB3aGlsZSB4b3IgXCIgK1xuICAgIFwiZGllIGVjaG8gZW1wdHkgZXhpdCBldmFsIGluY2x1ZGUgaW5jbHVkZV9vbmNlIGlzc2V0IGxpc3QgcmVxdWlyZSByZXF1aXJlX29uY2UgcmV0dXJuIFwiICtcbiAgICBcInByaW50IHVuc2V0IF9faGFsdF9jb21waWxlciBzZWxmIHN0YXRpYyBwYXJlbnQgeWllbGQgaW5zdGVhZG9mIGZpbmFsbHlcIjtcbiAgdmFyIHBocEF0b21zID0gXCJ0cnVlIGZhbHNlIG51bGwgVFJVRSBGQUxTRSBOVUxMIF9fQ0xBU1NfXyBfX0RJUl9fIF9fRklMRV9fIF9fTElORV9fIF9fTUVUSE9EX18gX19GVU5DVElPTl9fIF9fTkFNRVNQQUNFX18gX19UUkFJVF9fXCI7XG4gIHZhciBwaHBCdWlsdGluID0gXCJmdW5jX251bV9hcmdzIGZ1bmNfZ2V0X2FyZyBmdW5jX2dldF9hcmdzIHN0cmxlbiBzdHJjbXAgc3RybmNtcCBzdHJjYXNlY21wIHN0cm5jYXNlY21wIGVhY2ggZXJyb3JfcmVwb3J0aW5nIGRlZmluZSBkZWZpbmVkIHRyaWdnZXJfZXJyb3IgdXNlcl9lcnJvciBzZXRfZXJyb3JfaGFuZGxlciByZXN0b3JlX2Vycm9yX2hhbmRsZXIgZ2V0X2RlY2xhcmVkX2NsYXNzZXMgZ2V0X2xvYWRlZF9leHRlbnNpb25zIGV4dGVuc2lvbl9sb2FkZWQgZ2V0X2V4dGVuc2lvbl9mdW5jcyBkZWJ1Z19iYWNrdHJhY2UgY29uc3RhbnQgYmluMmhleCBoZXgyYmluIHNsZWVwIHVzbGVlcCB0aW1lIG1rdGltZSBnbW1rdGltZSBzdHJmdGltZSBnbXN0cmZ0aW1lIHN0cnRvdGltZSBkYXRlIGdtZGF0ZSBnZXRkYXRlIGxvY2FsdGltZSBjaGVja2RhdGUgZmx1c2ggd29yZHdyYXAgaHRtbHNwZWNpYWxjaGFycyBodG1sZW50aXRpZXMgaHRtbF9lbnRpdHlfZGVjb2RlIG1kNSBtZDVfZmlsZSBjcmMzMiBnZXRpbWFnZXNpemUgaW1hZ2VfdHlwZV90b19taW1lX3R5cGUgcGhwaW5mbyBwaHB2ZXJzaW9uIHBocGNyZWRpdHMgc3RybmF0Y21wIHN0cm5hdGNhc2VjbXAgc3Vic3RyX2NvdW50IHN0cnNwbiBzdHJjc3BuIHN0cnRvayBzdHJ0b3VwcGVyIHN0cnRvbG93ZXIgc3RycG9zIHN0cnJwb3Mgc3RycmV2IGhlYnJldiBoZWJyZXZjIG5sMmJyIGJhc2VuYW1lIGRpcm5hbWUgcGF0aGluZm8gc3RyaXBzbGFzaGVzIHN0cmlwY3NsYXNoZXMgc3Ryc3RyIHN0cmlzdHIgc3RycmNociBzdHJfc2h1ZmZsZSBzdHJfd29yZF9jb3VudCBzdHJjb2xsIHN1YnN0ciBzdWJzdHJfcmVwbGFjZSBxdW90ZW1ldGEgdWNmaXJzdCB1Y3dvcmRzIHN0cnRyIGFkZHNsYXNoZXMgYWRkY3NsYXNoZXMgcnRyaW0gc3RyX3JlcGxhY2Ugc3RyX3JlcGVhdCBjb3VudF9jaGFycyBjaHVua19zcGxpdCB0cmltIGx0cmltIHN0cmlwX3RhZ3Mgc2ltaWxhcl90ZXh0IGV4cGxvZGUgaW1wbG9kZSBzZXRsb2NhbGUgbG9jYWxlY29udiBwYXJzZV9zdHIgc3RyX3BhZCBjaG9wIHN0cmNociBzcHJpbnRmIHByaW50ZiB2cHJpbnRmIHZzcHJpbnRmIHNzY2FuZiBmc2NhbmYgcGFyc2VfdXJsIHVybGVuY29kZSB1cmxkZWNvZGUgcmF3dXJsZW5jb2RlIHJhd3VybGRlY29kZSByZWFkbGluayBsaW5raW5mbyBsaW5rIHVubGluayBleGVjIHN5c3RlbSBlc2NhcGVzaGVsbGNtZCBlc2NhcGVzaGVsbGFyZyBwYXNzdGhydSBzaGVsbF9leGVjIHByb2Nfb3BlbiBwcm9jX2Nsb3NlIHJhbmQgc3JhbmQgZ2V0cmFuZG1heCBtdF9yYW5kIG10X3NyYW5kIG10X2dldHJhbmRtYXggYmFzZTY0X2RlY29kZSBiYXNlNjRfZW5jb2RlIGFicyBjZWlsIGZsb29yIHJvdW5kIGlzX2Zpbml0ZSBpc19uYW4gaXNfaW5maW5pdGUgYmluZGVjIGhleGRlYyBvY3RkZWMgZGVjYmluIGRlY29jdCBkZWNoZXggYmFzZV9jb252ZXJ0IG51bWJlcl9mb3JtYXQgZm1vZCBpcDJsb25nIGxvbmcyaXAgZ2V0ZW52IHB1dGVudiBnZXRvcHQgbWljcm90aW1lIGdldHRpbWVvZmRheSBnZXRydXNhZ2UgdW5pcWlkIHF1b3RlZF9wcmludGFibGVfZGVjb2RlIHNldF90aW1lX2xpbWl0IGdldF9jZmdfdmFyIG1hZ2ljX3F1b3Rlc19ydW50aW1lIHNldF9tYWdpY19xdW90ZXNfcnVudGltZSBnZXRfbWFnaWNfcXVvdGVzX2dwYyBnZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUgaW1wb3J0X3JlcXVlc3RfdmFyaWFibGVzIGVycm9yX2xvZyBzZXJpYWxpemUgdW5zZXJpYWxpemUgbWVtb3J5X2dldF91c2FnZSBtZW1vcnlfZ2V0X3BlYWtfdXNhZ2UgdmFyX2R1bXAgdmFyX2V4cG9ydCBkZWJ1Z196dmFsX2R1bXAgcHJpbnRfciBoaWdobGlnaHRfZmlsZSBzaG93X3NvdXJjZSBoaWdobGlnaHRfc3RyaW5nIGluaV9nZXQgaW5pX2dldF9hbGwgaW5pX3NldCBpbmlfYWx0ZXIgaW5pX3Jlc3RvcmUgZ2V0X2luY2x1ZGVfcGF0aCBzZXRfaW5jbHVkZV9wYXRoIHJlc3RvcmVfaW5jbHVkZV9wYXRoIHNldGNvb2tpZSBoZWFkZXIgaGVhZGVyc19zZW50IGNvbm5lY3Rpb25fYWJvcnRlZCBjb25uZWN0aW9uX3N0YXR1cyBpZ25vcmVfdXNlcl9hYm9ydCBwYXJzZV9pbmlfZmlsZSBpc191cGxvYWRlZF9maWxlIG1vdmVfdXBsb2FkZWRfZmlsZSBpbnR2YWwgZmxvYXR2YWwgZG91YmxldmFsIHN0cnZhbCBnZXR0eXBlIHNldHR5cGUgaXNfbnVsbCBpc19yZXNvdXJjZSBpc19ib29sIGlzX2xvbmcgaXNfZmxvYXQgaXNfaW50IGlzX2ludGVnZXIgaXNfZG91YmxlIGlzX3JlYWwgaXNfbnVtZXJpYyBpc19zdHJpbmcgaXNfYXJyYXkgaXNfb2JqZWN0IGlzX3NjYWxhciBlcmVnIGVyZWdfcmVwbGFjZSBlcmVnaSBlcmVnaV9yZXBsYWNlIHNwbGl0IHNwbGl0aSBqb2luIHNxbF9yZWdjYXNlIGRsIHBjbG9zZSBwb3BlbiByZWFkZmlsZSByZXdpbmQgcm1kaXIgdW1hc2sgZmNsb3NlIGZlb2YgZmdldGMgZmdldHMgZmdldHNzIGZyZWFkIGZvcGVuIGZwYXNzdGhydSBmdHJ1bmNhdGUgZnN0YXQgZnNlZWsgZnRlbGwgZmZsdXNoIGZ3cml0ZSBmcHV0cyBta2RpciByZW5hbWUgY29weSB0ZW1wbmFtIHRtcGZpbGUgZmlsZSBmaWxlX2dldF9jb250ZW50cyBmaWxlX3B1dF9jb250ZW50cyBzdHJlYW1fc2VsZWN0IHN0cmVhbV9jb250ZXh0X2NyZWF0ZSBzdHJlYW1fY29udGV4dF9zZXRfcGFyYW1zIHN0cmVhbV9jb250ZXh0X3NldF9vcHRpb24gc3RyZWFtX2NvbnRleHRfZ2V0X29wdGlvbnMgc3RyZWFtX2ZpbHRlcl9wcmVwZW5kIHN0cmVhbV9maWx0ZXJfYXBwZW5kIGZnZXRjc3YgZmxvY2sgZ2V0X21ldGFfdGFncyBzdHJlYW1fc2V0X3dyaXRlX2J1ZmZlciBzZXRfZmlsZV9idWZmZXIgc2V0X3NvY2tldF9ibG9ja2luZyBzdHJlYW1fc2V0X2Jsb2NraW5nIHNvY2tldF9zZXRfYmxvY2tpbmcgc3RyZWFtX2dldF9tZXRhX2RhdGEgc3RyZWFtX3JlZ2lzdGVyX3dyYXBwZXIgc3RyZWFtX3dyYXBwZXJfcmVnaXN0ZXIgc3RyZWFtX3NldF90aW1lb3V0IHNvY2tldF9zZXRfdGltZW91dCBzb2NrZXRfZ2V0X3N0YXR1cyByZWFscGF0aCBmbm1hdGNoIGZzb2Nrb3BlbiBwZnNvY2tvcGVuIHBhY2sgdW5wYWNrIGdldF9icm93c2VyIGNyeXB0IG9wZW5kaXIgY2xvc2VkaXIgY2hkaXIgZ2V0Y3dkIHJld2luZGRpciByZWFkZGlyIGRpciBnbG9iIGZpbGVhdGltZSBmaWxlY3RpbWUgZmlsZWdyb3VwIGZpbGVpbm9kZSBmaWxlbXRpbWUgZmlsZW93bmVyIGZpbGVwZXJtcyBmaWxlc2l6ZSBmaWxldHlwZSBmaWxlX2V4aXN0cyBpc193cml0YWJsZSBpc193cml0ZWFibGUgaXNfcmVhZGFibGUgaXNfZXhlY3V0YWJsZSBpc19maWxlIGlzX2RpciBpc19saW5rIHN0YXQgbHN0YXQgY2hvd24gdG91Y2ggY2xlYXJzdGF0Y2FjaGUgbWFpbCBvYl9zdGFydCBvYl9mbHVzaCBvYl9jbGVhbiBvYl9lbmRfZmx1c2ggb2JfZW5kX2NsZWFuIG9iX2dldF9mbHVzaCBvYl9nZXRfY2xlYW4gb2JfZ2V0X2xlbmd0aCBvYl9nZXRfbGV2ZWwgb2JfZ2V0X3N0YXR1cyBvYl9nZXRfY29udGVudHMgb2JfaW1wbGljaXRfZmx1c2ggb2JfbGlzdF9oYW5kbGVycyBrc29ydCBrcnNvcnQgbmF0c29ydCBuYXRjYXNlc29ydCBhc29ydCBhcnNvcnQgc29ydCByc29ydCB1c29ydCB1YXNvcnQgdWtzb3J0IHNodWZmbGUgYXJyYXlfd2FsayBjb3VudCBlbmQgcHJldiBuZXh0IHJlc2V0IGN1cnJlbnQga2V5IG1pbiBtYXggaW5fYXJyYXkgYXJyYXlfc2VhcmNoIGV4dHJhY3QgY29tcGFjdCBhcnJheV9maWxsIHJhbmdlIGFycmF5X211bHRpc29ydCBhcnJheV9wdXNoIGFycmF5X3BvcCBhcnJheV9zaGlmdCBhcnJheV91bnNoaWZ0IGFycmF5X3NwbGljZSBhcnJheV9zbGljZSBhcnJheV9tZXJnZSBhcnJheV9tZXJnZV9yZWN1cnNpdmUgYXJyYXlfa2V5cyBhcnJheV92YWx1ZXMgYXJyYXlfY291bnRfdmFsdWVzIGFycmF5X3JldmVyc2UgYXJyYXlfcmVkdWNlIGFycmF5X3BhZCBhcnJheV9mbGlwIGFycmF5X2NoYW5nZV9rZXlfY2FzZSBhcnJheV9yYW5kIGFycmF5X3VuaXF1ZSBhcnJheV9pbnRlcnNlY3QgYXJyYXlfaW50ZXJzZWN0X2Fzc29jIGFycmF5X2RpZmYgYXJyYXlfZGlmZl9hc3NvYyBhcnJheV9zdW0gYXJyYXlfZmlsdGVyIGFycmF5X21hcCBhcnJheV9jaHVuayBhcnJheV9rZXlfZXhpc3RzIGFycmF5X2ludGVyc2VjdF9rZXkgYXJyYXlfY29tYmluZSBhcnJheV9jb2x1bW4gcG9zIHNpemVvZiBrZXlfZXhpc3RzIGFzc2VydCBhc3NlcnRfb3B0aW9ucyB2ZXJzaW9uX2NvbXBhcmUgZnRvayBzdHJfcm90MTMgYWdncmVnYXRlIHNlc3Npb25fbmFtZSBzZXNzaW9uX21vZHVsZV9uYW1lIHNlc3Npb25fc2F2ZV9wYXRoIHNlc3Npb25faWQgc2Vzc2lvbl9yZWdlbmVyYXRlX2lkIHNlc3Npb25fZGVjb2RlIHNlc3Npb25fcmVnaXN0ZXIgc2Vzc2lvbl91bnJlZ2lzdGVyIHNlc3Npb25faXNfcmVnaXN0ZXJlZCBzZXNzaW9uX2VuY29kZSBzZXNzaW9uX3N0YXJ0IHNlc3Npb25fZGVzdHJveSBzZXNzaW9uX3Vuc2V0IHNlc3Npb25fc2V0X3NhdmVfaGFuZGxlciBzZXNzaW9uX2NhY2hlX2xpbWl0ZXIgc2Vzc2lvbl9jYWNoZV9leHBpcmUgc2Vzc2lvbl9zZXRfY29va2llX3BhcmFtcyBzZXNzaW9uX2dldF9jb29raWVfcGFyYW1zIHNlc3Npb25fd3JpdGVfY2xvc2UgcHJlZ19tYXRjaCBwcmVnX21hdGNoX2FsbCBwcmVnX3JlcGxhY2UgcHJlZ19yZXBsYWNlX2NhbGxiYWNrIHByZWdfc3BsaXQgcHJlZ19xdW90ZSBwcmVnX2dyZXAgb3ZlcmxvYWQgY3R5cGVfYWxudW0gY3R5cGVfYWxwaGEgY3R5cGVfY250cmwgY3R5cGVfZGlnaXQgY3R5cGVfbG93ZXIgY3R5cGVfZ3JhcGggY3R5cGVfcHJpbnQgY3R5cGVfcHVuY3QgY3R5cGVfc3BhY2UgY3R5cGVfdXBwZXIgY3R5cGVfeGRpZ2l0IHZpcnR1YWwgYXBhY2hlX3JlcXVlc3RfaGVhZGVycyBhcGFjaGVfbm90ZSBhcGFjaGVfbG9va3VwX3VyaSBhcGFjaGVfY2hpbGRfdGVybWluYXRlIGFwYWNoZV9zZXRlbnYgYXBhY2hlX3Jlc3BvbnNlX2hlYWRlcnMgYXBhY2hlX2dldF92ZXJzaW9uIGdldGFsbGhlYWRlcnMgbXlzcWxfY29ubmVjdCBteXNxbF9wY29ubmVjdCBteXNxbF9jbG9zZSBteXNxbF9zZWxlY3RfZGIgbXlzcWxfY3JlYXRlX2RiIG15c3FsX2Ryb3BfZGIgbXlzcWxfcXVlcnkgbXlzcWxfdW5idWZmZXJlZF9xdWVyeSBteXNxbF9kYl9xdWVyeSBteXNxbF9saXN0X2RicyBteXNxbF9saXN0X3RhYmxlcyBteXNxbF9saXN0X2ZpZWxkcyBteXNxbF9saXN0X3Byb2Nlc3NlcyBteXNxbF9lcnJvciBteXNxbF9lcnJubyBteXNxbF9hZmZlY3RlZF9yb3dzIG15c3FsX2luc2VydF9pZCBteXNxbF9yZXN1bHQgbXlzcWxfbnVtX3Jvd3MgbXlzcWxfbnVtX2ZpZWxkcyBteXNxbF9mZXRjaF9yb3cgbXlzcWxfZmV0Y2hfYXJyYXkgbXlzcWxfZmV0Y2hfYXNzb2MgbXlzcWxfZmV0Y2hfb2JqZWN0IG15c3FsX2RhdGFfc2VlayBteXNxbF9mZXRjaF9sZW5ndGhzIG15c3FsX2ZldGNoX2ZpZWxkIG15c3FsX2ZpZWxkX3NlZWsgbXlzcWxfZnJlZV9yZXN1bHQgbXlzcWxfZmllbGRfbmFtZSBteXNxbF9maWVsZF90YWJsZSBteXNxbF9maWVsZF9sZW4gbXlzcWxfZmllbGRfdHlwZSBteXNxbF9maWVsZF9mbGFncyBteXNxbF9lc2NhcGVfc3RyaW5nIG15c3FsX3JlYWxfZXNjYXBlX3N0cmluZyBteXNxbF9zdGF0IG15c3FsX3RocmVhZF9pZCBteXNxbF9jbGllbnRfZW5jb2RpbmcgbXlzcWxfZ2V0X2NsaWVudF9pbmZvIG15c3FsX2dldF9ob3N0X2luZm8gbXlzcWxfZ2V0X3Byb3RvX2luZm8gbXlzcWxfZ2V0X3NlcnZlcl9pbmZvIG15c3FsX2luZm8gbXlzcWwgbXlzcWxfZmllbGRuYW1lIG15c3FsX2ZpZWxkdGFibGUgbXlzcWxfZmllbGRsZW4gbXlzcWxfZmllbGR0eXBlIG15c3FsX2ZpZWxkZmxhZ3MgbXlzcWxfc2VsZWN0ZGIgbXlzcWxfY3JlYXRlZGIgbXlzcWxfZHJvcGRiIG15c3FsX2ZyZWVyZXN1bHQgbXlzcWxfbnVtZmllbGRzIG15c3FsX251bXJvd3MgbXlzcWxfbGlzdGRicyBteXNxbF9saXN0dGFibGVzIG15c3FsX2xpc3RmaWVsZHMgbXlzcWxfZGJfbmFtZSBteXNxbF9kYm5hbWUgbXlzcWxfdGFibGVuYW1lIG15c3FsX3RhYmxlX25hbWUgcGdfY29ubmVjdCBwZ19wY29ubmVjdCBwZ19jbG9zZSBwZ19jb25uZWN0aW9uX3N0YXR1cyBwZ19jb25uZWN0aW9uX2J1c3kgcGdfY29ubmVjdGlvbl9yZXNldCBwZ19ob3N0IHBnX2RibmFtZSBwZ19wb3J0IHBnX3R0eSBwZ19vcHRpb25zIHBnX3BpbmcgcGdfcXVlcnkgcGdfc2VuZF9xdWVyeSBwZ19jYW5jZWxfcXVlcnkgcGdfZmV0Y2hfcmVzdWx0IHBnX2ZldGNoX3JvdyBwZ19mZXRjaF9hc3NvYyBwZ19mZXRjaF9hcnJheSBwZ19mZXRjaF9vYmplY3QgcGdfZmV0Y2hfYWxsIHBnX2FmZmVjdGVkX3Jvd3MgcGdfZ2V0X3Jlc3VsdCBwZ19yZXN1bHRfc2VlayBwZ19yZXN1bHRfc3RhdHVzIHBnX2ZyZWVfcmVzdWx0IHBnX2xhc3Rfb2lkIHBnX251bV9yb3dzIHBnX251bV9maWVsZHMgcGdfZmllbGRfbmFtZSBwZ19maWVsZF9udW0gcGdfZmllbGRfc2l6ZSBwZ19maWVsZF90eXBlIHBnX2ZpZWxkX3BydGxlbiBwZ19maWVsZF9pc19udWxsIHBnX2dldF9ub3RpZnkgcGdfZ2V0X3BpZCBwZ19yZXN1bHRfZXJyb3IgcGdfbGFzdF9lcnJvciBwZ19sYXN0X25vdGljZSBwZ19wdXRfbGluZSBwZ19lbmRfY29weSBwZ19jb3B5X3RvIHBnX2NvcHlfZnJvbSBwZ190cmFjZSBwZ191bnRyYWNlIHBnX2xvX2NyZWF0ZSBwZ19sb191bmxpbmsgcGdfbG9fb3BlbiBwZ19sb19jbG9zZSBwZ19sb19yZWFkIHBnX2xvX3dyaXRlIHBnX2xvX3JlYWRfYWxsIHBnX2xvX2ltcG9ydCBwZ19sb19leHBvcnQgcGdfbG9fc2VlayBwZ19sb190ZWxsIHBnX2VzY2FwZV9zdHJpbmcgcGdfZXNjYXBlX2J5dGVhIHBnX3VuZXNjYXBlX2J5dGVhIHBnX2NsaWVudF9lbmNvZGluZyBwZ19zZXRfY2xpZW50X2VuY29kaW5nIHBnX21ldGFfZGF0YSBwZ19jb252ZXJ0IHBnX2luc2VydCBwZ191cGRhdGUgcGdfZGVsZXRlIHBnX3NlbGVjdCBwZ19leGVjIHBnX2dldGxhc3RvaWQgcGdfY21kdHVwbGVzIHBnX2Vycm9ybWVzc2FnZSBwZ19udW1yb3dzIHBnX251bWZpZWxkcyBwZ19maWVsZG5hbWUgcGdfZmllbGRzaXplIHBnX2ZpZWxkdHlwZSBwZ19maWVsZG51bSBwZ19maWVsZHBydGxlbiBwZ19maWVsZGlzbnVsbCBwZ19mcmVlcmVzdWx0IHBnX3Jlc3VsdCBwZ19sb3JlYWRhbGwgcGdfbG9jcmVhdGUgcGdfbG91bmxpbmsgcGdfbG9vcGVuIHBnX2xvY2xvc2UgcGdfbG9yZWFkIHBnX2xvd3JpdGUgcGdfbG9pbXBvcnQgcGdfbG9leHBvcnQgaHR0cF9yZXNwb25zZV9jb2RlIGdldF9kZWNsYXJlZF90cmFpdHMgZ2V0aW1hZ2VzaXplZnJvbXN0cmluZyBzb2NrZXRfaW1wb3J0X3N0cmVhbSBzdHJlYW1fc2V0X2NodW5rX3NpemUgdHJhaXRfZXhpc3RzIGhlYWRlcl9yZWdpc3Rlcl9jYWxsYmFjayBjbGFzc191c2VzIHNlc3Npb25fc3RhdHVzIHNlc3Npb25fcmVnaXN0ZXJfc2h1dGRvd24gZWNobyBwcmludCBnbG9iYWwgc3RhdGljIGV4aXQgYXJyYXkgZW1wdHkgZXZhbCBpc3NldCB1bnNldCBkaWUgaW5jbHVkZSByZXF1aXJlIGluY2x1ZGVfb25jZSByZXF1aXJlX29uY2UganNvbl9kZWNvZGUganNvbl9lbmNvZGUganNvbl9sYXN0X2Vycm9yIGpzb25fbGFzdF9lcnJvcl9tc2cgY3VybF9jbG9zZSBjdXJsX2NvcHlfaGFuZGxlIGN1cmxfZXJybm8gY3VybF9lcnJvciBjdXJsX2VzY2FwZSBjdXJsX2V4ZWMgY3VybF9maWxlX2NyZWF0ZSBjdXJsX2dldGluZm8gY3VybF9pbml0IGN1cmxfbXVsdGlfYWRkX2hhbmRsZSBjdXJsX211bHRpX2Nsb3NlIGN1cmxfbXVsdGlfZXhlYyBjdXJsX211bHRpX2dldGNvbnRlbnQgY3VybF9tdWx0aV9pbmZvX3JlYWQgY3VybF9tdWx0aV9pbml0IGN1cmxfbXVsdGlfcmVtb3ZlX2hhbmRsZSBjdXJsX211bHRpX3NlbGVjdCBjdXJsX211bHRpX3NldG9wdCBjdXJsX211bHRpX3N0cmVycm9yIGN1cmxfcGF1c2UgY3VybF9yZXNldCBjdXJsX3NldG9wdF9hcnJheSBjdXJsX3NldG9wdCBjdXJsX3NoYXJlX2Nsb3NlIGN1cmxfc2hhcmVfaW5pdCBjdXJsX3NoYXJlX3NldG9wdCBjdXJsX3N0cmVycm9yIGN1cmxfdW5lc2NhcGUgY3VybF92ZXJzaW9uIG15c3FsaV9hZmZlY3RlZF9yb3dzIG15c3FsaV9hdXRvY29tbWl0IG15c3FsaV9jaGFuZ2VfdXNlciBteXNxbGlfY2hhcmFjdGVyX3NldF9uYW1lIG15c3FsaV9jbG9zZSBteXNxbGlfY29tbWl0IG15c3FsaV9jb25uZWN0X2Vycm5vIG15c3FsaV9jb25uZWN0X2Vycm9yIG15c3FsaV9jb25uZWN0IG15c3FsaV9kYXRhX3NlZWsgbXlzcWxpX2RlYnVnIG15c3FsaV9kdW1wX2RlYnVnX2luZm8gbXlzcWxpX2Vycm5vIG15c3FsaV9lcnJvcl9saXN0IG15c3FsaV9lcnJvciBteXNxbGlfZmV0Y2hfYWxsIG15c3FsaV9mZXRjaF9hcnJheSBteXNxbGlfZmV0Y2hfYXNzb2MgbXlzcWxpX2ZldGNoX2ZpZWxkX2RpcmVjdCBteXNxbGlfZmV0Y2hfZmllbGQgbXlzcWxpX2ZldGNoX2ZpZWxkcyBteXNxbGlfZmV0Y2hfbGVuZ3RocyBteXNxbGlfZmV0Y2hfb2JqZWN0IG15c3FsaV9mZXRjaF9yb3cgbXlzcWxpX2ZpZWxkX2NvdW50IG15c3FsaV9maWVsZF9zZWVrIG15c3FsaV9maWVsZF90ZWxsIG15c3FsaV9mcmVlX3Jlc3VsdCBteXNxbGlfZ2V0X2NoYXJzZXQgbXlzcWxpX2dldF9jbGllbnRfaW5mbyBteXNxbGlfZ2V0X2NsaWVudF9zdGF0cyBteXNxbGlfZ2V0X2NsaWVudF92ZXJzaW9uIG15c3FsaV9nZXRfY29ubmVjdGlvbl9zdGF0cyBteXNxbGlfZ2V0X2hvc3RfaW5mbyBteXNxbGlfZ2V0X3Byb3RvX2luZm8gbXlzcWxpX2dldF9zZXJ2ZXJfaW5mbyBteXNxbGlfZ2V0X3NlcnZlcl92ZXJzaW9uIG15c3FsaV9pbmZvIG15c3FsaV9pbml0IG15c3FsaV9pbnNlcnRfaWQgbXlzcWxpX2tpbGwgbXlzcWxpX21vcmVfcmVzdWx0cyBteXNxbGlfbXVsdGlfcXVlcnkgbXlzcWxpX25leHRfcmVzdWx0IG15c3FsaV9udW1fZmllbGRzIG15c3FsaV9udW1fcm93cyBteXNxbGlfb3B0aW9ucyBteXNxbGlfcGluZyBteXNxbGlfcHJlcGFyZSBteXNxbGlfcXVlcnkgbXlzcWxpX3JlYWxfY29ubmVjdCBteXNxbGlfcmVhbF9lc2NhcGVfc3RyaW5nIG15c3FsaV9yZWFsX3F1ZXJ5IG15c3FsaV9yZWFwX2FzeW5jX3F1ZXJ5IG15c3FsaV9yZWZyZXNoIG15c3FsaV9yb2xsYmFjayBteXNxbGlfc2VsZWN0X2RiIG15c3FsaV9zZXRfY2hhcnNldCBteXNxbGlfc2V0X2xvY2FsX2luZmlsZV9kZWZhdWx0IG15c3FsaV9zZXRfbG9jYWxfaW5maWxlX2hhbmRsZXIgbXlzcWxpX3NxbHN0YXRlIG15c3FsaV9zc2xfc2V0IG15c3FsaV9zdGF0IG15c3FsaV9zdG10X2luaXQgbXlzcWxpX3N0b3JlX3Jlc3VsdCBteXNxbGlfdGhyZWFkX2lkIG15c3FsaV90aHJlYWRfc2FmZSBteXNxbGlfdXNlX3Jlc3VsdCBteXNxbGlfd2FybmluZ19jb3VudFwiO1xuICBDb2RlTWlycm9yLnJlZ2lzdGVySGVscGVyKFwiaGludFdvcmRzXCIsIFwicGhwXCIsIFtwaHBLZXl3b3JkcywgcGhwQXRvbXMsIHBocEJ1aWx0aW5dLmpvaW4oXCIgXCIpLnNwbGl0KFwiIFwiKSk7XG4gIENvZGVNaXJyb3IucmVnaXN0ZXJIZWxwZXIoXCJ3b3JkQ2hhcnNcIiwgXCJwaHBcIiwgL1tcXHckXS8pO1xuXG4gIHZhciBwaHBDb25maWcgPSB7XG4gICAgbmFtZTogXCJjbGlrZVwiLFxuICAgIGhlbHBlclR5cGU6IFwicGhwXCIsXG4gICAga2V5d29yZHM6IGtleXdvcmRzKHBocEtleXdvcmRzKSxcbiAgICBibG9ja0tleXdvcmRzOiBrZXl3b3JkcyhcImNhdGNoIGRvIGVsc2UgZWxzZWlmIGZvciBmb3JlYWNoIGlmIHN3aXRjaCB0cnkgd2hpbGUgZmluYWxseVwiKSxcbiAgICBkZWZLZXl3b3Jkczoga2V5d29yZHMoXCJjbGFzcyBmdW5jdGlvbiBpbnRlcmZhY2UgbmFtZXNwYWNlIHRyYWl0XCIpLFxuICAgIGF0b21zOiBrZXl3b3JkcyhwaHBBdG9tcyksXG4gICAgYnVpbHRpbjoga2V5d29yZHMocGhwQnVpbHRpbiksXG4gICAgbXVsdGlMaW5lU3RyaW5nczogdHJ1ZSxcbiAgICBob29rczoge1xuICAgICAgXCIkXCI6IGZ1bmN0aW9uKHN0cmVhbSkge1xuICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcXHdcXCRfXS8pO1xuICAgICAgICByZXR1cm4gXCJ2YXJpYWJsZS0yXCI7XG4gICAgICB9LFxuICAgICAgXCI8XCI6IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHtcbiAgICAgICAgdmFyIGJlZm9yZTtcbiAgICAgICAgaWYgKGJlZm9yZSA9IHN0cmVhbS5tYXRjaCgvXjw8XFxzKi8pKSB7XG4gICAgICAgICAgdmFyIHF1b3RlZCA9IHN0cmVhbS5lYXQoL1snXCJdLyk7XG4gICAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXFx3XFwuXS8pO1xuICAgICAgICAgIHZhciBkZWxpbSA9IHN0cmVhbS5jdXJyZW50KCkuc2xpY2UoYmVmb3JlWzBdLmxlbmd0aCArIChxdW90ZWQgPyAyIDogMSkpO1xuICAgICAgICAgIGlmIChxdW90ZWQpIHN0cmVhbS5lYXQocXVvdGVkKTtcbiAgICAgICAgICBpZiAoZGVsaW0pIHtcbiAgICAgICAgICAgIChzdGF0ZS50b2tTdGFjayB8fCAoc3RhdGUudG9rU3RhY2sgPSBbXSkpLnB1c2goZGVsaW0sIDApO1xuICAgICAgICAgICAgc3RhdGUudG9rZW5pemUgPSBwaHBTdHJpbmcoZGVsaW0sIHF1b3RlZCAhPSBcIidcIik7XG4gICAgICAgICAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSxcbiAgICAgIFwiI1wiOiBmdW5jdGlvbihzdHJlYW0pIHtcbiAgICAgICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkgJiYgIXN0cmVhbS5tYXRjaChcIj8+XCIsIGZhbHNlKSkgc3RyZWFtLm5leHQoKTtcbiAgICAgICAgcmV0dXJuIFwiY29tbWVudFwiO1xuICAgICAgfSxcbiAgICAgIFwiL1wiOiBmdW5jdGlvbihzdHJlYW0pIHtcbiAgICAgICAgaWYgKHN0cmVhbS5lYXQoXCIvXCIpKSB7XG4gICAgICAgICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkgJiYgIXN0cmVhbS5tYXRjaChcIj8+XCIsIGZhbHNlKSkgc3RyZWFtLm5leHQoKTtcbiAgICAgICAgICByZXR1cm4gXCJjb21tZW50XCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSxcbiAgICAgICdcIic6IGZ1bmN0aW9uKF9zdHJlYW0sIHN0YXRlKSB7XG4gICAgICAgIChzdGF0ZS50b2tTdGFjayB8fCAoc3RhdGUudG9rU3RhY2sgPSBbXSkpLnB1c2goJ1wiJywgMCk7XG4gICAgICAgIHN0YXRlLnRva2VuaXplID0gcGhwU3RyaW5nKCdcIicpO1xuICAgICAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgICAgIH0sXG4gICAgICBcIntcIjogZnVuY3Rpb24oX3N0cmVhbSwgc3RhdGUpIHtcbiAgICAgICAgaWYgKHN0YXRlLnRva1N0YWNrICYmIHN0YXRlLnRva1N0YWNrLmxlbmd0aClcbiAgICAgICAgICBzdGF0ZS50b2tTdGFja1tzdGF0ZS50b2tTdGFjay5sZW5ndGggLSAxXSsrO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9LFxuICAgICAgXCJ9XCI6IGZ1bmN0aW9uKF9zdHJlYW0sIHN0YXRlKSB7XG4gICAgICAgIGlmIChzdGF0ZS50b2tTdGFjayAmJiBzdGF0ZS50b2tTdGFjay5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAhLS1zdGF0ZS50b2tTdGFja1tzdGF0ZS50b2tTdGFjay5sZW5ndGggLSAxXSkge1xuICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gcGhwU3RyaW5nKHN0YXRlLnRva1N0YWNrW3N0YXRlLnRva1N0YWNrLmxlbmd0aCAtIDJdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIENvZGVNaXJyb3IuZGVmaW5lTW9kZShcInBocFwiLCBmdW5jdGlvbihjb25maWcsIHBhcnNlckNvbmZpZykge1xuICAgIHZhciBodG1sTW9kZSA9IENvZGVNaXJyb3IuZ2V0TW9kZShjb25maWcsIChwYXJzZXJDb25maWcgJiYgcGFyc2VyQ29uZmlnLmh0bWxNb2RlKSB8fCBcInRleHQvaHRtbFwiKTtcbiAgICB2YXIgcGhwTW9kZSA9IENvZGVNaXJyb3IuZ2V0TW9kZShjb25maWcsIHBocENvbmZpZyk7XG5cbiAgICBmdW5jdGlvbiBkaXNwYXRjaChzdHJlYW0sIHN0YXRlKSB7XG4gICAgICB2YXIgaXNQSFAgPSBzdGF0ZS5jdXJNb2RlID09IHBocE1vZGU7XG4gICAgICBpZiAoc3RyZWFtLnNvbCgpICYmIHN0YXRlLnBlbmRpbmcgJiYgc3RhdGUucGVuZGluZyAhPSAnXCInICYmIHN0YXRlLnBlbmRpbmcgIT0gXCInXCIpIHN0YXRlLnBlbmRpbmcgPSBudWxsO1xuICAgICAgaWYgKCFpc1BIUCkge1xuICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9ePFxcP1xcdyovKSkge1xuICAgICAgICAgIHN0YXRlLmN1ck1vZGUgPSBwaHBNb2RlO1xuICAgICAgICAgIGlmICghc3RhdGUucGhwKSBzdGF0ZS5waHAgPSBDb2RlTWlycm9yLnN0YXJ0U3RhdGUocGhwTW9kZSwgaHRtbE1vZGUuaW5kZW50KHN0YXRlLmh0bWwsIFwiXCIsIFwiXCIpKVxuICAgICAgICAgIHN0YXRlLmN1clN0YXRlID0gc3RhdGUucGhwO1xuICAgICAgICAgIHJldHVybiBcIm1ldGFcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUucGVuZGluZyA9PSAnXCInIHx8IHN0YXRlLnBlbmRpbmcgPT0gXCInXCIpIHtcbiAgICAgICAgICB3aGlsZSAoIXN0cmVhbS5lb2woKSAmJiBzdHJlYW0ubmV4dCgpICE9IHN0YXRlLnBlbmRpbmcpIHt9XG4gICAgICAgICAgdmFyIHN0eWxlID0gXCJzdHJpbmdcIjtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5wZW5kaW5nICYmIHN0cmVhbS5wb3MgPCBzdGF0ZS5wZW5kaW5nLmVuZCkge1xuICAgICAgICAgIHN0cmVhbS5wb3MgPSBzdGF0ZS5wZW5kaW5nLmVuZDtcbiAgICAgICAgICB2YXIgc3R5bGUgPSBzdGF0ZS5wZW5kaW5nLnN0eWxlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBzdHlsZSA9IGh0bWxNb2RlLnRva2VuKHN0cmVhbSwgc3RhdGUuY3VyU3RhdGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZS5wZW5kaW5nKSBzdGF0ZS5wZW5kaW5nID0gbnVsbDtcbiAgICAgICAgdmFyIGN1ciA9IHN0cmVhbS5jdXJyZW50KCksIG9wZW5QSFAgPSBjdXIuc2VhcmNoKC88XFw/LyksIG07XG4gICAgICAgIGlmIChvcGVuUEhQICE9IC0xKSB7XG4gICAgICAgICAgaWYgKHN0eWxlID09IFwic3RyaW5nXCIgJiYgKG0gPSBjdXIubWF0Y2goL1tcXCdcXFwiXSQvKSkgJiYgIS9cXD8+Ly50ZXN0KGN1cikpIHN0YXRlLnBlbmRpbmcgPSBtWzBdO1xuICAgICAgICAgIGVsc2Ugc3RhdGUucGVuZGluZyA9IHtlbmQ6IHN0cmVhbS5wb3MsIHN0eWxlOiBzdHlsZX07XG4gICAgICAgICAgc3RyZWFtLmJhY2tVcChjdXIubGVuZ3RoIC0gb3BlblBIUCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0eWxlO1xuICAgICAgfSBlbHNlIGlmIChpc1BIUCAmJiBzdGF0ZS5waHAudG9rZW5pemUgPT0gbnVsbCAmJiBzdHJlYW0ubWF0Y2goXCI/PlwiKSkge1xuICAgICAgICBzdGF0ZS5jdXJNb2RlID0gaHRtbE1vZGU7XG4gICAgICAgIHN0YXRlLmN1clN0YXRlID0gc3RhdGUuaHRtbDtcbiAgICAgICAgaWYgKCFzdGF0ZS5waHAuY29udGV4dC5wcmV2KSBzdGF0ZS5waHAgPSBudWxsO1xuICAgICAgICByZXR1cm4gXCJtZXRhXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcGhwTW9kZS50b2tlbihzdHJlYW0sIHN0YXRlLmN1clN0YXRlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBodG1sID0gQ29kZU1pcnJvci5zdGFydFN0YXRlKGh0bWxNb2RlKVxuICAgICAgICB2YXIgcGhwID0gcGFyc2VyQ29uZmlnLnN0YXJ0T3BlbiA/IENvZGVNaXJyb3Iuc3RhcnRTdGF0ZShwaHBNb2RlKSA6IG51bGxcbiAgICAgICAgcmV0dXJuIHtodG1sOiBodG1sLFxuICAgICAgICAgICAgICAgIHBocDogcGhwLFxuICAgICAgICAgICAgICAgIGN1ck1vZGU6IHBhcnNlckNvbmZpZy5zdGFydE9wZW4gPyBwaHBNb2RlIDogaHRtbE1vZGUsXG4gICAgICAgICAgICAgICAgY3VyU3RhdGU6IHBhcnNlckNvbmZpZy5zdGFydE9wZW4gPyBwaHAgOiBodG1sLFxuICAgICAgICAgICAgICAgIHBlbmRpbmc6IG51bGx9O1xuICAgICAgfSxcblxuICAgICAgY29weVN0YXRlOiBmdW5jdGlvbihzdGF0ZSkge1xuICAgICAgICB2YXIgaHRtbCA9IHN0YXRlLmh0bWwsIGh0bWxOZXcgPSBDb2RlTWlycm9yLmNvcHlTdGF0ZShodG1sTW9kZSwgaHRtbCksXG4gICAgICAgICAgICBwaHAgPSBzdGF0ZS5waHAsIHBocE5ldyA9IHBocCAmJiBDb2RlTWlycm9yLmNvcHlTdGF0ZShwaHBNb2RlLCBwaHApLCBjdXI7XG4gICAgICAgIGlmIChzdGF0ZS5jdXJNb2RlID09IGh0bWxNb2RlKSBjdXIgPSBodG1sTmV3O1xuICAgICAgICBlbHNlIGN1ciA9IHBocE5ldztcbiAgICAgICAgcmV0dXJuIHtodG1sOiBodG1sTmV3LCBwaHA6IHBocE5ldywgY3VyTW9kZTogc3RhdGUuY3VyTW9kZSwgY3VyU3RhdGU6IGN1cixcbiAgICAgICAgICAgICAgICBwZW5kaW5nOiBzdGF0ZS5wZW5kaW5nfTtcbiAgICAgIH0sXG5cbiAgICAgIHRva2VuOiBkaXNwYXRjaCxcblxuICAgICAgaW5kZW50OiBmdW5jdGlvbihzdGF0ZSwgdGV4dEFmdGVyLCBsaW5lKSB7XG4gICAgICAgIGlmICgoc3RhdGUuY3VyTW9kZSAhPSBwaHBNb2RlICYmIC9eXFxzKjxcXC8vLnRlc3QodGV4dEFmdGVyKSkgfHxcbiAgICAgICAgICAgIChzdGF0ZS5jdXJNb2RlID09IHBocE1vZGUgJiYgL15cXD8+Ly50ZXN0KHRleHRBZnRlcikpKVxuICAgICAgICAgIHJldHVybiBodG1sTW9kZS5pbmRlbnQoc3RhdGUuaHRtbCwgdGV4dEFmdGVyLCBsaW5lKTtcbiAgICAgICAgcmV0dXJuIHN0YXRlLmN1ck1vZGUuaW5kZW50KHN0YXRlLmN1clN0YXRlLCB0ZXh0QWZ0ZXIsIGxpbmUpO1xuICAgICAgfSxcblxuICAgICAgYmxvY2tDb21tZW50U3RhcnQ6IFwiLypcIixcbiAgICAgIGJsb2NrQ29tbWVudEVuZDogXCIqL1wiLFxuICAgICAgbGluZUNvbW1lbnQ6IFwiLy9cIixcblxuICAgICAgaW5uZXJNb2RlOiBmdW5jdGlvbihzdGF0ZSkgeyByZXR1cm4ge3N0YXRlOiBzdGF0ZS5jdXJTdGF0ZSwgbW9kZTogc3RhdGUuY3VyTW9kZX07IH1cbiAgICB9O1xuICB9LCBcImh0bWxtaXhlZFwiLCBcImNsaWtlXCIpO1xuXG4gIENvZGVNaXJyb3IuZGVmaW5lTUlNRShcImFwcGxpY2F0aW9uL3gtaHR0cGQtcGhwXCIsIFwicGhwXCIpO1xuICBDb2RlTWlycm9yLmRlZmluZU1JTUUoXCJhcHBsaWNhdGlvbi94LWh0dHBkLXBocC1vcGVuXCIsIHtuYW1lOiBcInBocFwiLCBzdGFydE9wZW46IHRydWV9KTtcbiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKFwidGV4dC94LXBocFwiLCBwaHBDb25maWcpO1xufSk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/codemirror/mode/php/php.js\n"); /***/ }), /***/ "./node_modules/codemirror/mode/sass/sass.js": -/*!***************************************************!* +/*!***************************************************!*\ !*** ./node_modules/codemirror/mode/sass/sass.js ***! \***************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { -eval("// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n if (true) // CommonJS\n mod(__webpack_require__(/*! ../../lib/codemirror */ \"./node_modules/codemirror/lib/codemirror.js\"), __webpack_require__(/*! ../css/css */ \"./node_modules/codemirror/mode/css/css.js\"));\n else {}\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"sass\", function(config) {\n var cssMode = CodeMirror.mimeModes[\"text/css\"];\n var propertyKeywords = cssMode.propertyKeywords || {},\n colorKeywords = cssMode.colorKeywords || {},\n valueKeywords = cssMode.valueKeywords || {},\n fontProperties = cssMode.fontProperties || {};\n\n function tokenRegexp(words) {\n return new RegExp(\"^\" + words.join(\"|\"));\n }\n\n var keywords = [\"true\", \"false\", \"null\", \"auto\"];\n var keywordsRegexp = new RegExp(\"^\" + keywords.join(\"|\"));\n\n var operators = [\"\\\\(\", \"\\\\)\", \"=\", \">\", \"<\", \"==\", \">=\", \"<=\", \"\\\\+\", \"-\",\n \"\\\\!=\", \"/\", \"\\\\*\", \"%\", \"and\", \"or\", \"not\", \";\",\"\\\\{\",\"\\\\}\",\":\"];\n var opRegexp = tokenRegexp(operators);\n\n var pseudoElementsRegexp = /^::?[a-zA-Z_][\\w\\-]*/;\n\n var word;\n\n function isEndLine(stream) {\n return !stream.peek() || stream.match(/\\s+$/, false);\n }\n\n function urlTokens(stream, state) {\n var ch = stream.peek();\n\n if (ch === \")\") {\n stream.next();\n state.tokenizer = tokenBase;\n return \"operator\";\n } else if (ch === \"(\") {\n stream.next();\n stream.eatSpace();\n\n return \"operator\";\n } else if (ch === \"'\" || ch === '\"') {\n state.tokenizer = buildStringTokenizer(stream.next());\n return \"string\";\n } else {\n state.tokenizer = buildStringTokenizer(\")\", false);\n return \"string\";\n }\n }\n function comment(indentation, multiLine) {\n return function(stream, state) {\n if (stream.sol() && stream.indentation() <= indentation) {\n state.tokenizer = tokenBase;\n return tokenBase(stream, state);\n }\n\n if (multiLine && stream.skipTo(\"*/\")) {\n stream.next();\n stream.next();\n state.tokenizer = tokenBase;\n } else {\n stream.skipToEnd();\n }\n\n return \"comment\";\n };\n }\n\n function buildStringTokenizer(quote, greedy) {\n if (greedy == null) { greedy = true; }\n\n function stringTokenizer(stream, state) {\n var nextChar = stream.next();\n var peekChar = stream.peek();\n var previousChar = stream.string.charAt(stream.pos-2);\n\n var endingString = ((nextChar !== \"\\\\\" && peekChar === quote) || (nextChar === quote && previousChar !== \"\\\\\"));\n\n if (endingString) {\n if (nextChar !== quote && greedy) { stream.next(); }\n if (isEndLine(stream)) {\n state.cursorHalf = 0;\n }\n state.tokenizer = tokenBase;\n return \"string\";\n } else if (nextChar === \"#\" && peekChar === \"{\") {\n state.tokenizer = buildInterpolationTokenizer(stringTokenizer);\n stream.next();\n return \"operator\";\n } else {\n return \"string\";\n }\n }\n\n return stringTokenizer;\n }\n\n function buildInterpolationTokenizer(currentTokenizer) {\n return function(stream, state) {\n if (stream.peek() === \"}\") {\n stream.next();\n state.tokenizer = currentTokenizer;\n return \"operator\";\n } else {\n return tokenBase(stream, state);\n }\n };\n }\n\n function indent(state) {\n if (state.indentCount == 0) {\n state.indentCount++;\n var lastScopeOffset = state.scopes[0].offset;\n var currentOffset = lastScopeOffset + config.indentUnit;\n state.scopes.unshift({ offset:currentOffset });\n }\n }\n\n function dedent(state) {\n if (state.scopes.length == 1) return;\n\n state.scopes.shift();\n }\n\n function tokenBase(stream, state) {\n var ch = stream.peek();\n\n // Comment\n if (stream.match(\"/*\")) {\n state.tokenizer = comment(stream.indentation(), true);\n return state.tokenizer(stream, state);\n }\n if (stream.match(\"//\")) {\n state.tokenizer = comment(stream.indentation(), false);\n return state.tokenizer(stream, state);\n }\n\n // Interpolation\n if (stream.match(\"#{\")) {\n state.tokenizer = buildInterpolationTokenizer(tokenBase);\n return \"operator\";\n }\n\n // Strings\n if (ch === '\"' || ch === \"'\") {\n stream.next();\n state.tokenizer = buildStringTokenizer(ch);\n return \"string\";\n }\n\n if(!state.cursorHalf){// state.cursorHalf === 0\n // first half i.e. before : for key-value pairs\n // including selectors\n\n if (ch === \"-\") {\n if (stream.match(/^-\\w+-/)) {\n return \"meta\";\n }\n }\n\n if (ch === \".\") {\n stream.next();\n if (stream.match(/^[\\w-]+/)) {\n indent(state);\n return \"qualifier\";\n } else if (stream.peek() === \"#\") {\n indent(state);\n return \"tag\";\n }\n }\n\n if (ch === \"#\") {\n stream.next();\n // ID selectors\n if (stream.match(/^[\\w-]+/)) {\n indent(state);\n return \"builtin\";\n }\n if (stream.peek() === \"#\") {\n indent(state);\n return \"tag\";\n }\n }\n\n // Variables\n if (ch === \"$\") {\n stream.next();\n stream.eatWhile(/[\\w-]/);\n return \"variable-2\";\n }\n\n // Numbers\n if (stream.match(/^-?[0-9\\.]+/))\n return \"number\";\n\n // Units\n if (stream.match(/^(px|em|in)\\b/))\n return \"unit\";\n\n if (stream.match(keywordsRegexp))\n return \"keyword\";\n\n if (stream.match(/^url/) && stream.peek() === \"(\") {\n state.tokenizer = urlTokens;\n return \"atom\";\n }\n\n if (ch === \"=\") {\n // Match shortcut mixin definition\n if (stream.match(/^=[\\w-]+/)) {\n indent(state);\n return \"meta\";\n }\n }\n\n if (ch === \"+\") {\n // Match shortcut mixin definition\n if (stream.match(/^\\+[\\w-]+/)){\n return \"variable-3\";\n }\n }\n\n if(ch === \"@\"){\n if(stream.match(/@extend/)){\n if(!stream.match(/\\s*[\\w]/))\n dedent(state);\n }\n }\n\n\n // Indent Directives\n if (stream.match(/^@(else if|if|media|else|for|each|while|mixin|function)/)) {\n indent(state);\n return \"def\";\n }\n\n // Other Directives\n if (ch === \"@\") {\n stream.next();\n stream.eatWhile(/[\\w-]/);\n return \"def\";\n }\n\n if (stream.eatWhile(/[\\w-]/)){\n if(stream.match(/ *: *[\\w-\\+\\$#!\\(\"']/,false)){\n word = stream.current().toLowerCase();\n var prop = state.prevProp + \"-\" + word;\n if (propertyKeywords.hasOwnProperty(prop)) {\n return \"property\";\n } else if (propertyKeywords.hasOwnProperty(word)) {\n state.prevProp = word;\n return \"property\";\n } else if (fontProperties.hasOwnProperty(word)) {\n return \"property\";\n }\n return \"tag\";\n }\n else if(stream.match(/ *:/,false)){\n indent(state);\n state.cursorHalf = 1;\n state.prevProp = stream.current().toLowerCase();\n return \"property\";\n }\n else if(stream.match(/ *,/,false)){\n return \"tag\";\n }\n else{\n indent(state);\n return \"tag\";\n }\n }\n\n if(ch === \":\"){\n if (stream.match(pseudoElementsRegexp)){ // could be a pseudo-element\n return \"variable-3\";\n }\n stream.next();\n state.cursorHalf=1;\n return \"operator\";\n }\n\n } // cursorHalf===0 ends here\n else{\n\n if (ch === \"#\") {\n stream.next();\n // Hex numbers\n if (stream.match(/[0-9a-fA-F]{6}|[0-9a-fA-F]{3}/)){\n if (isEndLine(stream)) {\n state.cursorHalf = 0;\n }\n return \"number\";\n }\n }\n\n // Numbers\n if (stream.match(/^-?[0-9\\.]+/)){\n if (isEndLine(stream)) {\n state.cursorHalf = 0;\n }\n return \"number\";\n }\n\n // Units\n if (stream.match(/^(px|em|in)\\b/)){\n if (isEndLine(stream)) {\n state.cursorHalf = 0;\n }\n return \"unit\";\n }\n\n if (stream.match(keywordsRegexp)){\n if (isEndLine(stream)) {\n state.cursorHalf = 0;\n }\n return \"keyword\";\n }\n\n if (stream.match(/^url/) && stream.peek() === \"(\") {\n state.tokenizer = urlTokens;\n if (isEndLine(stream)) {\n state.cursorHalf = 0;\n }\n return \"atom\";\n }\n\n // Variables\n if (ch === \"$\") {\n stream.next();\n stream.eatWhile(/[\\w-]/);\n if (isEndLine(stream)) {\n state.cursorHalf = 0;\n }\n return \"variable-2\";\n }\n\n // bang character for !important, !default, etc.\n if (ch === \"!\") {\n stream.next();\n state.cursorHalf = 0;\n return stream.match(/^[\\w]+/) ? \"keyword\": \"operator\";\n }\n\n if (stream.match(opRegexp)){\n if (isEndLine(stream)) {\n state.cursorHalf = 0;\n }\n return \"operator\";\n }\n\n // attributes\n if (stream.eatWhile(/[\\w-]/)) {\n if (isEndLine(stream)) {\n state.cursorHalf = 0;\n }\n word = stream.current().toLowerCase();\n if (valueKeywords.hasOwnProperty(word)) {\n return \"atom\";\n } else if (colorKeywords.hasOwnProperty(word)) {\n return \"keyword\";\n } else if (propertyKeywords.hasOwnProperty(word)) {\n state.prevProp = stream.current().toLowerCase();\n return \"property\";\n } else {\n return \"tag\";\n }\n }\n\n //stream.eatSpace();\n if (isEndLine(stream)) {\n state.cursorHalf = 0;\n return null;\n }\n\n } // else ends here\n\n if (stream.match(opRegexp))\n return \"operator\";\n\n // If we haven't returned by now, we move 1 character\n // and return an error\n stream.next();\n return null;\n }\n\n function tokenLexer(stream, state) {\n if (stream.sol()) state.indentCount = 0;\n var style = state.tokenizer(stream, state);\n var current = stream.current();\n\n if (current === \"@return\" || current === \"}\"){\n dedent(state);\n }\n\n if (style !== null) {\n var startOfToken = stream.pos - current.length;\n\n var withCurrentIndent = startOfToken + (config.indentUnit * state.indentCount);\n\n var newScopes = [];\n\n for (var i = 0; i < state.scopes.length; i++) {\n var scope = state.scopes[i];\n\n if (scope.offset <= withCurrentIndent)\n newScopes.push(scope);\n }\n\n state.scopes = newScopes;\n }\n\n\n return style;\n }\n\n return {\n startState: function() {\n return {\n tokenizer: tokenBase,\n scopes: [{offset: 0, type: \"sass\"}],\n indentCount: 0,\n cursorHalf: 0, // cursor half tells us if cursor lies after (1)\n // or before (0) colon (well... more or less)\n definedVars: [],\n definedMixins: []\n };\n },\n token: function(stream, state) {\n var style = tokenLexer(stream, state);\n\n state.lastToken = { style: style, content: stream.current() };\n\n return style;\n },\n\n indent: function(state) {\n return state.scopes[0].offset;\n }\n };\n}, \"css\");\n\nCodeMirror.defineMIME(\"text/x-sass\", \"sass\");\n\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vbm9kZV9tb2R1bGVzL2NvZGVtaXJyb3IvbW9kZS9zYXNzL3Nhc3MuanM/MWI2MyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUVBO0FBQ0EsTUFBTSxJQUF1RDtBQUM3RCxRQUFRLG1CQUFPLENBQUMseUVBQXNCLEdBQUcsbUJBQU8sQ0FBQyw2REFBWTtBQUM3RCxPQUFPLEVBR2E7QUFDcEIsQ0FBQztBQUNEOztBQUVBO0FBQ0E7QUFDQSx1REFBdUQ7QUFDdkQsaURBQWlEO0FBQ2pELGlEQUFpRDtBQUNqRDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLGtFQUFrRSxNQUFNLE1BQU07QUFDOUU7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EseUJBQXlCLGVBQWU7O0FBRXhDO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsMkNBQTJDLGVBQWU7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sNkNBQTZDO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLHVCQUF1QjtBQUNuRDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDBCQUEwQjtBQUMxQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxnREFBZ0Q7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsRUFBRSxhQUFhLEVBQUU7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsK0NBQStDO0FBQy9DO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQSxxQkFBcUIseUJBQXlCO0FBQzlDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHdCQUF3QjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQSx5QkFBeUI7O0FBRXpCO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7O0FBRUEsQ0FBQyIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9jb2RlbWlycm9yL21vZGUvc2Fzcy9zYXNzLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnNcbi8vIERpc3RyaWJ1dGVkIHVuZGVyIGFuIE1JVCBsaWNlbnNlOiBodHRwczovL2NvZGVtaXJyb3IubmV0L0xJQ0VOU0VcblxuKGZ1bmN0aW9uKG1vZCkge1xuICBpZiAodHlwZW9mIGV4cG9ydHMgPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgbW9kdWxlID09IFwib2JqZWN0XCIpIC8vIENvbW1vbkpTXG4gICAgbW9kKHJlcXVpcmUoXCIuLi8uLi9saWIvY29kZW1pcnJvclwiKSwgcmVxdWlyZShcIi4uL2Nzcy9jc3NcIikpO1xuICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSAvLyBBTURcbiAgICBkZWZpbmUoW1wiLi4vLi4vbGliL2NvZGVtaXJyb3JcIiwgXCIuLi9jc3MvY3NzXCJdLCBtb2QpO1xuICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52XG4gICAgbW9kKENvZGVNaXJyb3IpO1xufSkoZnVuY3Rpb24oQ29kZU1pcnJvcikge1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbkNvZGVNaXJyb3IuZGVmaW5lTW9kZShcInNhc3NcIiwgZnVuY3Rpb24oY29uZmlnKSB7XG4gIHZhciBjc3NNb2RlID0gQ29kZU1pcnJvci5taW1lTW9kZXNbXCJ0ZXh0L2Nzc1wiXTtcbiAgdmFyIHByb3BlcnR5S2V5d29yZHMgPSBjc3NNb2RlLnByb3BlcnR5S2V5d29yZHMgfHwge30sXG4gICAgICBjb2xvcktleXdvcmRzID0gY3NzTW9kZS5jb2xvcktleXdvcmRzIHx8IHt9LFxuICAgICAgdmFsdWVLZXl3b3JkcyA9IGNzc01vZGUudmFsdWVLZXl3b3JkcyB8fCB7fSxcbiAgICAgIGZvbnRQcm9wZXJ0aWVzID0gY3NzTW9kZS5mb250UHJvcGVydGllcyB8fCB7fTtcblxuICBmdW5jdGlvbiB0b2tlblJlZ2V4cCh3b3Jkcykge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKFwiXlwiICsgd29yZHMuam9pbihcInxcIikpO1xuICB9XG5cbiAgdmFyIGtleXdvcmRzID0gW1widHJ1ZVwiLCBcImZhbHNlXCIsIFwibnVsbFwiLCBcImF1dG9cIl07XG4gIHZhciBrZXl3b3Jkc1JlZ2V4cCA9IG5ldyBSZWdFeHAoXCJeXCIgKyBrZXl3b3Jkcy5qb2luKFwifFwiKSk7XG5cbiAgdmFyIG9wZXJhdG9ycyA9IFtcIlxcXFwoXCIsIFwiXFxcXClcIiwgXCI9XCIsIFwiPlwiLCBcIjxcIiwgXCI9PVwiLCBcIj49XCIsIFwiPD1cIiwgXCJcXFxcK1wiLCBcIi1cIixcbiAgICAgICAgICAgICAgICAgICBcIlxcXFwhPVwiLCBcIi9cIiwgXCJcXFxcKlwiLCBcIiVcIiwgXCJhbmRcIiwgXCJvclwiLCBcIm5vdFwiLCBcIjtcIixcIlxcXFx7XCIsXCJcXFxcfVwiLFwiOlwiXTtcbiAgdmFyIG9wUmVnZXhwID0gdG9rZW5SZWdleHAob3BlcmF0b3JzKTtcblxuICB2YXIgcHNldWRvRWxlbWVudHNSZWdleHAgPSAvXjo6P1thLXpBLVpfXVtcXHdcXC1dKi87XG5cbiAgdmFyIHdvcmQ7XG5cbiAgZnVuY3Rpb24gaXNFbmRMaW5lKHN0cmVhbSkge1xuICAgIHJldHVybiAhc3RyZWFtLnBlZWsoKSB8fCBzdHJlYW0ubWF0Y2goL1xccyskLywgZmFsc2UpO1xuICB9XG5cbiAgZnVuY3Rpb24gdXJsVG9rZW5zKHN0cmVhbSwgc3RhdGUpIHtcbiAgICB2YXIgY2ggPSBzdHJlYW0ucGVlaygpO1xuXG4gICAgaWYgKGNoID09PSBcIilcIikge1xuICAgICAgc3RyZWFtLm5leHQoKTtcbiAgICAgIHN0YXRlLnRva2VuaXplciA9IHRva2VuQmFzZTtcbiAgICAgIHJldHVybiBcIm9wZXJhdG9yXCI7XG4gICAgfSBlbHNlIGlmIChjaCA9PT0gXCIoXCIpIHtcbiAgICAgIHN0cmVhbS5uZXh0KCk7XG4gICAgICBzdHJlYW0uZWF0U3BhY2UoKTtcblxuICAgICAgcmV0dXJuIFwib3BlcmF0b3JcIjtcbiAgICB9IGVsc2UgaWYgKGNoID09PSBcIidcIiB8fCBjaCA9PT0gJ1wiJykge1xuICAgICAgc3RhdGUudG9rZW5pemVyID0gYnVpbGRTdHJpbmdUb2tlbml6ZXIoc3RyZWFtLm5leHQoKSk7XG4gICAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUudG9rZW5pemVyID0gYnVpbGRTdHJpbmdUb2tlbml6ZXIoXCIpXCIsIGZhbHNlKTtcbiAgICAgIHJldHVybiBcInN0cmluZ1wiO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBjb21tZW50KGluZGVudGF0aW9uLCBtdWx0aUxpbmUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkge1xuICAgICAgaWYgKHN0cmVhbS5zb2woKSAmJiBzdHJlYW0uaW5kZW50YXRpb24oKSA8PSBpbmRlbnRhdGlvbikge1xuICAgICAgICBzdGF0ZS50b2tlbml6ZXIgPSB0b2tlbkJhc2U7XG4gICAgICAgIHJldHVybiB0b2tlbkJhc2Uoc3RyZWFtLCBzdGF0ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChtdWx0aUxpbmUgJiYgc3RyZWFtLnNraXBUbyhcIiovXCIpKSB7XG4gICAgICAgIHN0cmVhbS5uZXh0KCk7XG4gICAgICAgIHN0cmVhbS5uZXh0KCk7XG4gICAgICAgIHN0YXRlLnRva2VuaXplciA9IHRva2VuQmFzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFwiY29tbWVudFwiO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBidWlsZFN0cmluZ1Rva2VuaXplcihxdW90ZSwgZ3JlZWR5KSB7XG4gICAgaWYgKGdyZWVkeSA9PSBudWxsKSB7IGdyZWVkeSA9IHRydWU7IH1cblxuICAgIGZ1bmN0aW9uIHN0cmluZ1Rva2VuaXplcihzdHJlYW0sIHN0YXRlKSB7XG4gICAgICB2YXIgbmV4dENoYXIgPSBzdHJlYW0ubmV4dCgpO1xuICAgICAgdmFyIHBlZWtDaGFyID0gc3RyZWFtLnBlZWsoKTtcbiAgICAgIHZhciBwcmV2aW91c0NoYXIgPSBzdHJlYW0uc3RyaW5nLmNoYXJBdChzdHJlYW0ucG9zLTIpO1xuXG4gICAgICB2YXIgZW5kaW5nU3RyaW5nID0gKChuZXh0Q2hhciAhPT0gXCJcXFxcXCIgJiYgcGVla0NoYXIgPT09IHF1b3RlKSB8fCAobmV4dENoYXIgPT09IHF1b3RlICYmIHByZXZpb3VzQ2hhciAhPT0gXCJcXFxcXCIpKTtcblxuICAgICAgaWYgKGVuZGluZ1N0cmluZykge1xuICAgICAgICBpZiAobmV4dENoYXIgIT09IHF1b3RlICYmIGdyZWVkeSkgeyBzdHJlYW0ubmV4dCgpOyB9XG4gICAgICAgIGlmIChpc0VuZExpbmUoc3RyZWFtKSkge1xuICAgICAgICAgIHN0YXRlLmN1cnNvckhhbGYgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLnRva2VuaXplciA9IHRva2VuQmFzZTtcbiAgICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gICAgICB9IGVsc2UgaWYgKG5leHRDaGFyID09PSBcIiNcIiAmJiBwZWVrQ2hhciA9PT0gXCJ7XCIpIHtcbiAgICAgICAgc3RhdGUudG9rZW5pemVyID0gYnVpbGRJbnRlcnBvbGF0aW9uVG9rZW5pemVyKHN0cmluZ1Rva2VuaXplcik7XG4gICAgICAgIHN0cmVhbS5uZXh0KCk7XG4gICAgICAgIHJldHVybiBcIm9wZXJhdG9yXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc3RyaW5nVG9rZW5pemVyO1xuICB9XG5cbiAgZnVuY3Rpb24gYnVpbGRJbnRlcnBvbGF0aW9uVG9rZW5pemVyKGN1cnJlbnRUb2tlbml6ZXIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkge1xuICAgICAgaWYgKHN0cmVhbS5wZWVrKCkgPT09IFwifVwiKSB7XG4gICAgICAgIHN0cmVhbS5uZXh0KCk7XG4gICAgICAgIHN0YXRlLnRva2VuaXplciA9IGN1cnJlbnRUb2tlbml6ZXI7XG4gICAgICAgIHJldHVybiBcIm9wZXJhdG9yXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdG9rZW5CYXNlKHN0cmVhbSwgc3RhdGUpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBpbmRlbnQoc3RhdGUpIHtcbiAgICBpZiAoc3RhdGUuaW5kZW50Q291bnQgPT0gMCkge1xuICAgICAgc3RhdGUuaW5kZW50Q291bnQrKztcbiAgICAgIHZhciBsYXN0U2NvcGVPZmZzZXQgPSBzdGF0ZS5zY29wZXNbMF0ub2Zmc2V0O1xuICAgICAgdmFyIGN1cnJlbnRPZmZzZXQgPSBsYXN0U2NvcGVPZmZzZXQgKyBjb25maWcuaW5kZW50VW5pdDtcbiAgICAgIHN0YXRlLnNjb3Blcy51bnNoaWZ0KHsgb2Zmc2V0OmN1cnJlbnRPZmZzZXQgfSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZGVkZW50KHN0YXRlKSB7XG4gICAgaWYgKHN0YXRlLnNjb3Blcy5sZW5ndGggPT0gMSkgcmV0dXJuO1xuXG4gICAgc3RhdGUuc2NvcGVzLnNoaWZ0KCk7XG4gIH1cblxuICBmdW5jdGlvbiB0b2tlbkJhc2Uoc3RyZWFtLCBzdGF0ZSkge1xuICAgIHZhciBjaCA9IHN0cmVhbS5wZWVrKCk7XG5cbiAgICAvLyBDb21tZW50XG4gICAgaWYgKHN0cmVhbS5tYXRjaChcIi8qXCIpKSB7XG4gICAgICBzdGF0ZS50b2tlbml6ZXIgPSBjb21tZW50KHN0cmVhbS5pbmRlbnRhdGlvbigpLCB0cnVlKTtcbiAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZXIoc3RyZWFtLCBzdGF0ZSk7XG4gICAgfVxuICAgIGlmIChzdHJlYW0ubWF0Y2goXCIvL1wiKSkge1xuICAgICAgc3RhdGUudG9rZW5pemVyID0gY29tbWVudChzdHJlYW0uaW5kZW50YXRpb24oKSwgZmFsc2UpO1xuICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplcihzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG5cbiAgICAvLyBJbnRlcnBvbGF0aW9uXG4gICAgaWYgKHN0cmVhbS5tYXRjaChcIiN7XCIpKSB7XG4gICAgICBzdGF0ZS50b2tlbml6ZXIgPSBidWlsZEludGVycG9sYXRpb25Ub2tlbml6ZXIodG9rZW5CYXNlKTtcbiAgICAgIHJldHVybiBcIm9wZXJhdG9yXCI7XG4gICAgfVxuXG4gICAgLy8gU3RyaW5nc1xuICAgIGlmIChjaCA9PT0gJ1wiJyB8fCBjaCA9PT0gXCInXCIpIHtcbiAgICAgIHN0cmVhbS5uZXh0KCk7XG4gICAgICBzdGF0ZS50b2tlbml6ZXIgPSBidWlsZFN0cmluZ1Rva2VuaXplcihjaCk7XG4gICAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgICB9XG5cbiAgICBpZighc3RhdGUuY3Vyc29ySGFsZil7Ly8gc3RhdGUuY3Vyc29ySGFsZiA9PT0gMFxuICAgIC8vIGZpcnN0IGhhbGYgaS5lLiBiZWZvcmUgOiBmb3Iga2V5LXZhbHVlIHBhaXJzXG4gICAgLy8gaW5jbHVkaW5nIHNlbGVjdG9yc1xuXG4gICAgICBpZiAoY2ggPT09IFwiLVwiKSB7XG4gICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14tXFx3Ky0vKSkge1xuICAgICAgICAgIHJldHVybiBcIm1ldGFcIjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY2ggPT09IFwiLlwiKSB7XG4gICAgICAgIHN0cmVhbS5uZXh0KCk7XG4gICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15bXFx3LV0rLykpIHtcbiAgICAgICAgICBpbmRlbnQoc3RhdGUpO1xuICAgICAgICAgIHJldHVybiBcInF1YWxpZmllclwiO1xuICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbS5wZWVrKCkgPT09IFwiI1wiKSB7XG4gICAgICAgICAgaW5kZW50KHN0YXRlKTtcbiAgICAgICAgICByZXR1cm4gXCJ0YWdcIjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY2ggPT09IFwiI1wiKSB7XG4gICAgICAgIHN0cmVhbS5uZXh0KCk7XG4gICAgICAgIC8vIElEIHNlbGVjdG9yc1xuICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eW1xcdy1dKy8pKSB7XG4gICAgICAgICAgaW5kZW50KHN0YXRlKTtcbiAgICAgICAgICByZXR1cm4gXCJidWlsdGluXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0cmVhbS5wZWVrKCkgPT09IFwiI1wiKSB7XG4gICAgICAgICAgaW5kZW50KHN0YXRlKTtcbiAgICAgICAgICByZXR1cm4gXCJ0YWdcIjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBWYXJpYWJsZXNcbiAgICAgIGlmIChjaCA9PT0gXCIkXCIpIHtcbiAgICAgICAgc3RyZWFtLm5leHQoKTtcbiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXFx3LV0vKTtcbiAgICAgICAgcmV0dXJuIFwidmFyaWFibGUtMlwiO1xuICAgICAgfVxuXG4gICAgICAvLyBOdW1iZXJzXG4gICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eLT9bMC05XFwuXSsvKSlcbiAgICAgICAgcmV0dXJuIFwibnVtYmVyXCI7XG5cbiAgICAgIC8vIFVuaXRzXG4gICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eKHB4fGVtfGluKVxcYi8pKVxuICAgICAgICByZXR1cm4gXCJ1bml0XCI7XG5cbiAgICAgIGlmIChzdHJlYW0ubWF0Y2goa2V5d29yZHNSZWdleHApKVxuICAgICAgICByZXR1cm4gXCJrZXl3b3JkXCI7XG5cbiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL151cmwvKSAmJiBzdHJlYW0ucGVlaygpID09PSBcIihcIikge1xuICAgICAgICBzdGF0ZS50b2tlbml6ZXIgPSB1cmxUb2tlbnM7XG4gICAgICAgIHJldHVybiBcImF0b21cIjtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoID09PSBcIj1cIikge1xuICAgICAgICAvLyBNYXRjaCBzaG9ydGN1dCBtaXhpbiBkZWZpbml0aW9uXG4gICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL149W1xcdy1dKy8pKSB7XG4gICAgICAgICAgaW5kZW50KHN0YXRlKTtcbiAgICAgICAgICByZXR1cm4gXCJtZXRhXCI7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNoID09PSBcIitcIikge1xuICAgICAgICAvLyBNYXRjaCBzaG9ydGN1dCBtaXhpbiBkZWZpbml0aW9uXG4gICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15cXCtbXFx3LV0rLykpe1xuICAgICAgICAgIHJldHVybiBcInZhcmlhYmxlLTNcIjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZihjaCA9PT0gXCJAXCIpe1xuICAgICAgICBpZihzdHJlYW0ubWF0Y2goL0BleHRlbmQvKSl7XG4gICAgICAgICAgaWYoIXN0cmVhbS5tYXRjaCgvXFxzKltcXHddLykpXG4gICAgICAgICAgICBkZWRlbnQoc3RhdGUpO1xuICAgICAgICB9XG4gICAgICB9XG5cblxuICAgICAgLy8gSW5kZW50IERpcmVjdGl2ZXNcbiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15AKGVsc2UgaWZ8aWZ8bWVkaWF8ZWxzZXxmb3J8ZWFjaHx3aGlsZXxtaXhpbnxmdW5jdGlvbikvKSkge1xuICAgICAgICBpbmRlbnQoc3RhdGUpO1xuICAgICAgICByZXR1cm4gXCJkZWZcIjtcbiAgICAgIH1cblxuICAgICAgLy8gT3RoZXIgRGlyZWN0aXZlc1xuICAgICAgaWYgKGNoID09PSBcIkBcIikge1xuICAgICAgICBzdHJlYW0ubmV4dCgpO1xuICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcXHctXS8pO1xuICAgICAgICByZXR1cm4gXCJkZWZcIjtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0cmVhbS5lYXRXaGlsZSgvW1xcdy1dLykpe1xuICAgICAgICBpZihzdHJlYW0ubWF0Y2goLyAqOiAqW1xcdy1cXCtcXCQjIVxcKFwiJ10vLGZhbHNlKSl7XG4gICAgICAgICAgd29yZCA9IHN0cmVhbS5jdXJyZW50KCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICB2YXIgcHJvcCA9IHN0YXRlLnByZXZQcm9wICsgXCItXCIgKyB3b3JkO1xuICAgICAgICAgIGlmIChwcm9wZXJ0eUtleXdvcmRzLmhhc093blByb3BlcnR5KHByb3ApKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJwcm9wZXJ0eVwiO1xuICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHlLZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh3b3JkKSkge1xuICAgICAgICAgICAgc3RhdGUucHJldlByb3AgPSB3b3JkO1xuICAgICAgICAgICAgcmV0dXJuIFwicHJvcGVydHlcIjtcbiAgICAgICAgICB9IGVsc2UgaWYgKGZvbnRQcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KHdvcmQpKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJwcm9wZXJ0eVwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gXCJ0YWdcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmKHN0cmVhbS5tYXRjaCgvICo6LyxmYWxzZSkpe1xuICAgICAgICAgIGluZGVudChzdGF0ZSk7XG4gICAgICAgICAgc3RhdGUuY3Vyc29ySGFsZiA9IDE7XG4gICAgICAgICAgc3RhdGUucHJldlByb3AgPSBzdHJlYW0uY3VycmVudCgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgcmV0dXJuIFwicHJvcGVydHlcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmKHN0cmVhbS5tYXRjaCgvICosLyxmYWxzZSkpe1xuICAgICAgICAgIHJldHVybiBcInRhZ1wiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2V7XG4gICAgICAgICAgaW5kZW50KHN0YXRlKTtcbiAgICAgICAgICByZXR1cm4gXCJ0YWdcIjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZihjaCA9PT0gXCI6XCIpe1xuICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKHBzZXVkb0VsZW1lbnRzUmVnZXhwKSl7IC8vIGNvdWxkIGJlIGEgcHNldWRvLWVsZW1lbnRcbiAgICAgICAgICByZXR1cm4gXCJ2YXJpYWJsZS0zXCI7XG4gICAgICAgIH1cbiAgICAgICAgc3RyZWFtLm5leHQoKTtcbiAgICAgICAgc3RhdGUuY3Vyc29ySGFsZj0xO1xuICAgICAgICByZXR1cm4gXCJvcGVyYXRvclwiO1xuICAgICAgfVxuXG4gICAgfSAvLyBjdXJzb3JIYWxmPT09MCBlbmRzIGhlcmVcbiAgICBlbHNle1xuXG4gICAgICBpZiAoY2ggPT09IFwiI1wiKSB7XG4gICAgICAgIHN0cmVhbS5uZXh0KCk7XG4gICAgICAgIC8vIEhleCBudW1iZXJzXG4gICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL1swLTlhLWZBLUZdezZ9fFswLTlhLWZBLUZdezN9Lykpe1xuICAgICAgICAgIGlmIChpc0VuZExpbmUoc3RyZWFtKSkge1xuICAgICAgICAgICAgc3RhdGUuY3Vyc29ySGFsZiA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBcIm51bWJlclwiO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIE51bWJlcnNcbiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14tP1swLTlcXC5dKy8pKXtcbiAgICAgICAgaWYgKGlzRW5kTGluZShzdHJlYW0pKSB7XG4gICAgICAgICAgc3RhdGUuY3Vyc29ySGFsZiA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwibnVtYmVyXCI7XG4gICAgICB9XG5cbiAgICAgIC8vIFVuaXRzXG4gICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eKHB4fGVtfGluKVxcYi8pKXtcbiAgICAgICAgaWYgKGlzRW5kTGluZShzdHJlYW0pKSB7XG4gICAgICAgICAgc3RhdGUuY3Vyc29ySGFsZiA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwidW5pdFwiO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RyZWFtLm1hdGNoKGtleXdvcmRzUmVnZXhwKSl7XG4gICAgICAgIGlmIChpc0VuZExpbmUoc3RyZWFtKSkge1xuICAgICAgICAgIHN0YXRlLmN1cnNvckhhbGYgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcImtleXdvcmRcIjtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXnVybC8pICYmIHN0cmVhbS5wZWVrKCkgPT09IFwiKFwiKSB7XG4gICAgICAgIHN0YXRlLnRva2VuaXplciA9IHVybFRva2VucztcbiAgICAgICAgaWYgKGlzRW5kTGluZShzdHJlYW0pKSB7XG4gICAgICAgICAgc3RhdGUuY3Vyc29ySGFsZiA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwiYXRvbVwiO1xuICAgICAgfVxuXG4gICAgICAvLyBWYXJpYWJsZXNcbiAgICAgIGlmIChjaCA9PT0gXCIkXCIpIHtcbiAgICAgICAgc3RyZWFtLm5leHQoKTtcbiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXFx3LV0vKTtcbiAgICAgICAgaWYgKGlzRW5kTGluZShzdHJlYW0pKSB7XG4gICAgICAgICAgc3RhdGUuY3Vyc29ySGFsZiA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwidmFyaWFibGUtMlwiO1xuICAgICAgfVxuXG4gICAgICAvLyBiYW5nIGNoYXJhY3RlciBmb3IgIWltcG9ydGFudCwgIWRlZmF1bHQsIGV0Yy5cbiAgICAgIGlmIChjaCA9PT0gXCIhXCIpIHtcbiAgICAgICAgc3RyZWFtLm5leHQoKTtcbiAgICAgICAgc3RhdGUuY3Vyc29ySGFsZiA9IDA7XG4gICAgICAgIHJldHVybiBzdHJlYW0ubWF0Y2goL15bXFx3XSsvKSA/IFwia2V5d29yZFwiOiBcIm9wZXJhdG9yXCI7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdHJlYW0ubWF0Y2gob3BSZWdleHApKXtcbiAgICAgICAgaWYgKGlzRW5kTGluZShzdHJlYW0pKSB7XG4gICAgICAgICAgc3RhdGUuY3Vyc29ySGFsZiA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwib3BlcmF0b3JcIjtcbiAgICAgIH1cblxuICAgICAgLy8gYXR0cmlidXRlc1xuICAgICAgaWYgKHN0cmVhbS5lYXRXaGlsZSgvW1xcdy1dLykpIHtcbiAgICAgICAgaWYgKGlzRW5kTGluZShzdHJlYW0pKSB7XG4gICAgICAgICAgc3RhdGUuY3Vyc29ySGFsZiA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgd29yZCA9IHN0cmVhbS5jdXJyZW50KCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKHZhbHVlS2V5d29yZHMuaGFzT3duUHJvcGVydHkod29yZCkpIHtcbiAgICAgICAgICByZXR1cm4gXCJhdG9tXCI7XG4gICAgICAgIH0gZWxzZSBpZiAoY29sb3JLZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh3b3JkKSkge1xuICAgICAgICAgIHJldHVybiBcImtleXdvcmRcIjtcbiAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eUtleXdvcmRzLmhhc093blByb3BlcnR5KHdvcmQpKSB7XG4gICAgICAgICAgc3RhdGUucHJldlByb3AgPSBzdHJlYW0uY3VycmVudCgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgcmV0dXJuIFwicHJvcGVydHlcIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gXCJ0YWdcIjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvL3N0cmVhbS5lYXRTcGFjZSgpO1xuICAgICAgaWYgKGlzRW5kTGluZShzdHJlYW0pKSB7XG4gICAgICAgIHN0YXRlLmN1cnNvckhhbGYgPSAwO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIH0gLy8gZWxzZSBlbmRzIGhlcmVcblxuICAgIGlmIChzdHJlYW0ubWF0Y2gob3BSZWdleHApKVxuICAgICAgcmV0dXJuIFwib3BlcmF0b3JcIjtcblxuICAgIC8vIElmIHdlIGhhdmVuJ3QgcmV0dXJuZWQgYnkgbm93LCB3ZSBtb3ZlIDEgY2hhcmFjdGVyXG4gICAgLy8gYW5kIHJldHVybiBhbiBlcnJvclxuICAgIHN0cmVhbS5uZXh0KCk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiB0b2tlbkxleGVyKHN0cmVhbSwgc3RhdGUpIHtcbiAgICBpZiAoc3RyZWFtLnNvbCgpKSBzdGF0ZS5pbmRlbnRDb3VudCA9IDA7XG4gICAgdmFyIHN0eWxlID0gc3RhdGUudG9rZW5pemVyKHN0cmVhbSwgc3RhdGUpO1xuICAgIHZhciBjdXJyZW50ID0gc3RyZWFtLmN1cnJlbnQoKTtcblxuICAgIGlmIChjdXJyZW50ID09PSBcIkByZXR1cm5cIiB8fCBjdXJyZW50ID09PSBcIn1cIil7XG4gICAgICBkZWRlbnQoc3RhdGUpO1xuICAgIH1cblxuICAgIGlmIChzdHlsZSAhPT0gbnVsbCkge1xuICAgICAgdmFyIHN0YXJ0T2ZUb2tlbiA9IHN0cmVhbS5wb3MgLSBjdXJyZW50Lmxlbmd0aDtcblxuICAgICAgdmFyIHdpdGhDdXJyZW50SW5kZW50ID0gc3RhcnRPZlRva2VuICsgKGNvbmZpZy5pbmRlbnRVbml0ICogc3RhdGUuaW5kZW50Q291bnQpO1xuXG4gICAgICB2YXIgbmV3U2NvcGVzID0gW107XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RhdGUuc2NvcGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBzY29wZSA9IHN0YXRlLnNjb3Blc1tpXTtcblxuICAgICAgICBpZiAoc2NvcGUub2Zmc2V0IDw9IHdpdGhDdXJyZW50SW5kZW50KVxuICAgICAgICAgIG5ld1Njb3Blcy5wdXNoKHNjb3BlKTtcbiAgICAgIH1cblxuICAgICAgc3RhdGUuc2NvcGVzID0gbmV3U2NvcGVzO1xuICAgIH1cblxuXG4gICAgcmV0dXJuIHN0eWxlO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRva2VuaXplcjogdG9rZW5CYXNlLFxuICAgICAgICBzY29wZXM6IFt7b2Zmc2V0OiAwLCB0eXBlOiBcInNhc3NcIn1dLFxuICAgICAgICBpbmRlbnRDb3VudDogMCxcbiAgICAgICAgY3Vyc29ySGFsZjogMCwgIC8vIGN1cnNvciBoYWxmIHRlbGxzIHVzIGlmIGN1cnNvciBsaWVzIGFmdGVyICgxKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3IgYmVmb3JlICgwKSBjb2xvbiAod2VsbC4uLiBtb3JlIG9yIGxlc3MpXG4gICAgICAgIGRlZmluZWRWYXJzOiBbXSxcbiAgICAgICAgZGVmaW5lZE1peGluczogW11cbiAgICAgIH07XG4gICAgfSxcbiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkge1xuICAgICAgdmFyIHN0eWxlID0gdG9rZW5MZXhlcihzdHJlYW0sIHN0YXRlKTtcblxuICAgICAgc3RhdGUubGFzdFRva2VuID0geyBzdHlsZTogc3R5bGUsIGNvbnRlbnQ6IHN0cmVhbS5jdXJyZW50KCkgfTtcblxuICAgICAgcmV0dXJuIHN0eWxlO1xuICAgIH0sXG5cbiAgICBpbmRlbnQ6IGZ1bmN0aW9uKHN0YXRlKSB7XG4gICAgICByZXR1cm4gc3RhdGUuc2NvcGVzWzBdLm9mZnNldDtcbiAgICB9XG4gIH07XG59LCBcImNzc1wiKTtcblxuQ29kZU1pcnJvci5kZWZpbmVNSU1FKFwidGV4dC94LXNhc3NcIiwgXCJzYXNzXCIpO1xuXG59KTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/codemirror/mode/sass/sass.js\n"); +eval("// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n if (true) // CommonJS\n mod(__webpack_require__(/*! ../../lib/codemirror */ \"./node_modules/codemirror/lib/codemirror.js\"), __webpack_require__(/*! ../css/css */ \"./node_modules/codemirror/mode/css/css.js\"));\n else {}\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"sass\", function(config) {\n var cssMode = CodeMirror.mimeModes[\"text/css\"];\n var propertyKeywords = cssMode.propertyKeywords || {},\n colorKeywords = cssMode.colorKeywords || {},\n valueKeywords = cssMode.valueKeywords || {},\n fontProperties = cssMode.fontProperties || {};\n\n function tokenRegexp(words) {\n return new RegExp(\"^\" + words.join(\"|\"));\n }\n\n var keywords = [\"true\", \"false\", \"null\", \"auto\"];\n var keywordsRegexp = new RegExp(\"^\" + keywords.join(\"|\"));\n\n var operators = [\"\\\\(\", \"\\\\)\", \"=\", \">\", \"<\", \"==\", \">=\", \"<=\", \"\\\\+\", \"-\",\n \"\\\\!=\", \"/\", \"\\\\*\", \"%\", \"and\", \"or\", \"not\", \";\",\"\\\\{\",\"\\\\}\",\":\"];\n var opRegexp = tokenRegexp(operators);\n\n var pseudoElementsRegexp = /^::?[a-zA-Z_][\\w\\-]*/;\n\n var word;\n\n function isEndLine(stream) {\n return !stream.peek() || stream.match(/\\s+$/, false);\n }\n\n function urlTokens(stream, state) {\n var ch = stream.peek();\n\n if (ch === \")\") {\n stream.next();\n state.tokenizer = tokenBase;\n return \"operator\";\n } else if (ch === \"(\") {\n stream.next();\n stream.eatSpace();\n\n return \"operator\";\n } else if (ch === \"'\" || ch === '\"') {\n state.tokenizer = buildStringTokenizer(stream.next());\n return \"string\";\n } else {\n state.tokenizer = buildStringTokenizer(\")\", false);\n return \"string\";\n }\n }\n function comment(indentation, multiLine) {\n return function(stream, state) {\n if (stream.sol() && stream.indentation() <= indentation) {\n state.tokenizer = tokenBase;\n return tokenBase(stream, state);\n }\n\n if (multiLine && stream.skipTo(\"*/\")) {\n stream.next();\n stream.next();\n state.tokenizer = tokenBase;\n } else {\n stream.skipToEnd();\n }\n\n return \"comment\";\n };\n }\n\n function buildStringTokenizer(quote, greedy) {\n if (greedy == null) { greedy = true; }\n\n function stringTokenizer(stream, state) {\n var nextChar = stream.next();\n var peekChar = stream.peek();\n var previousChar = stream.string.charAt(stream.pos-2);\n\n var endingString = ((nextChar !== \"\\\\\" && peekChar === quote) || (nextChar === quote && previousChar !== \"\\\\\"));\n\n if (endingString) {\n if (nextChar !== quote && greedy) { stream.next(); }\n if (isEndLine(stream)) {\n state.cursorHalf = 0;\n }\n state.tokenizer = tokenBase;\n return \"string\";\n } else if (nextChar === \"#\" && peekChar === \"{\") {\n state.tokenizer = buildInterpolationTokenizer(stringTokenizer);\n stream.next();\n return \"operator\";\n } else {\n return \"string\";\n }\n }\n\n return stringTokenizer;\n }\n\n function buildInterpolationTokenizer(currentTokenizer) {\n return function(stream, state) {\n if (stream.peek() === \"}\") {\n stream.next();\n state.tokenizer = currentTokenizer;\n return \"operator\";\n } else {\n return tokenBase(stream, state);\n }\n };\n }\n\n function indent(state) {\n if (state.indentCount == 0) {\n state.indentCount++;\n var lastScopeOffset = state.scopes[0].offset;\n var currentOffset = lastScopeOffset + config.indentUnit;\n state.scopes.unshift({ offset:currentOffset });\n }\n }\n\n function dedent(state) {\n if (state.scopes.length == 1) return;\n\n state.scopes.shift();\n }\n\n function tokenBase(stream, state) {\n var ch = stream.peek();\n\n // Comment\n if (stream.match(\"/*\")) {\n state.tokenizer = comment(stream.indentation(), true);\n return state.tokenizer(stream, state);\n }\n if (stream.match(\"//\")) {\n state.tokenizer = comment(stream.indentation(), false);\n return state.tokenizer(stream, state);\n }\n\n // Interpolation\n if (stream.match(\"#{\")) {\n state.tokenizer = buildInterpolationTokenizer(tokenBase);\n return \"operator\";\n }\n\n // Strings\n if (ch === '\"' || ch === \"'\") {\n stream.next();\n state.tokenizer = buildStringTokenizer(ch);\n return \"string\";\n }\n\n if(!state.cursorHalf){// state.cursorHalf === 0\n // first half i.e. before : for key-value pairs\n // including selectors\n\n if (ch === \"-\") {\n if (stream.match(/^-\\w+-/)) {\n return \"meta\";\n }\n }\n\n if (ch === \".\") {\n stream.next();\n if (stream.match(/^[\\w-]+/)) {\n indent(state);\n return \"qualifier\";\n } else if (stream.peek() === \"#\") {\n indent(state);\n return \"tag\";\n }\n }\n\n if (ch === \"#\") {\n stream.next();\n // ID selectors\n if (stream.match(/^[\\w-]+/)) {\n indent(state);\n return \"builtin\";\n }\n if (stream.peek() === \"#\") {\n indent(state);\n return \"tag\";\n }\n }\n\n // Variables\n if (ch === \"$\") {\n stream.next();\n stream.eatWhile(/[\\w-]/);\n return \"variable-2\";\n }\n\n // Numbers\n if (stream.match(/^-?[0-9\\.]+/))\n return \"number\";\n\n // Units\n if (stream.match(/^(px|em|in)\\b/))\n return \"unit\";\n\n if (stream.match(keywordsRegexp))\n return \"keyword\";\n\n if (stream.match(/^url/) && stream.peek() === \"(\") {\n state.tokenizer = urlTokens;\n return \"atom\";\n }\n\n if (ch === \"=\") {\n // Match shortcut mixin definition\n if (stream.match(/^=[\\w-]+/)) {\n indent(state);\n return \"meta\";\n }\n }\n\n if (ch === \"+\") {\n // Match shortcut mixin definition\n if (stream.match(/^\\+[\\w-]+/)){\n return \"variable-3\";\n }\n }\n\n if(ch === \"@\"){\n if(stream.match('@extend')){\n if(!stream.match(/\\s*[\\w]/))\n dedent(state);\n }\n }\n\n\n // Indent Directives\n if (stream.match(/^@(else if|if|media|else|for|each|while|mixin|function)/)) {\n indent(state);\n return \"def\";\n }\n\n // Other Directives\n if (ch === \"@\") {\n stream.next();\n stream.eatWhile(/[\\w-]/);\n return \"def\";\n }\n\n if (stream.eatWhile(/[\\w-]/)){\n if(stream.match(/ *: *[\\w-\\+\\$#!\\(\"']/,false)){\n word = stream.current().toLowerCase();\n var prop = state.prevProp + \"-\" + word;\n if (propertyKeywords.hasOwnProperty(prop)) {\n return \"property\";\n } else if (propertyKeywords.hasOwnProperty(word)) {\n state.prevProp = word;\n return \"property\";\n } else if (fontProperties.hasOwnProperty(word)) {\n return \"property\";\n }\n return \"tag\";\n }\n else if(stream.match(/ *:/,false)){\n indent(state);\n state.cursorHalf = 1;\n state.prevProp = stream.current().toLowerCase();\n return \"property\";\n }\n else if(stream.match(/ *,/,false)){\n return \"tag\";\n }\n else{\n indent(state);\n return \"tag\";\n }\n }\n\n if(ch === \":\"){\n if (stream.match(pseudoElementsRegexp)){ // could be a pseudo-element\n return \"variable-3\";\n }\n stream.next();\n state.cursorHalf=1;\n return \"operator\";\n }\n\n } // cursorHalf===0 ends here\n else{\n\n if (ch === \"#\") {\n stream.next();\n // Hex numbers\n if (stream.match(/[0-9a-fA-F]{6}|[0-9a-fA-F]{3}/)){\n if (isEndLine(stream)) {\n state.cursorHalf = 0;\n }\n return \"number\";\n }\n }\n\n // Numbers\n if (stream.match(/^-?[0-9\\.]+/)){\n if (isEndLine(stream)) {\n state.cursorHalf = 0;\n }\n return \"number\";\n }\n\n // Units\n if (stream.match(/^(px|em|in)\\b/)){\n if (isEndLine(stream)) {\n state.cursorHalf = 0;\n }\n return \"unit\";\n }\n\n if (stream.match(keywordsRegexp)){\n if (isEndLine(stream)) {\n state.cursorHalf = 0;\n }\n return \"keyword\";\n }\n\n if (stream.match(/^url/) && stream.peek() === \"(\") {\n state.tokenizer = urlTokens;\n if (isEndLine(stream)) {\n state.cursorHalf = 0;\n }\n return \"atom\";\n }\n\n // Variables\n if (ch === \"$\") {\n stream.next();\n stream.eatWhile(/[\\w-]/);\n if (isEndLine(stream)) {\n state.cursorHalf = 0;\n }\n return \"variable-2\";\n }\n\n // bang character for !important, !default, etc.\n if (ch === \"!\") {\n stream.next();\n state.cursorHalf = 0;\n return stream.match(/^[\\w]+/) ? \"keyword\": \"operator\";\n }\n\n if (stream.match(opRegexp)){\n if (isEndLine(stream)) {\n state.cursorHalf = 0;\n }\n return \"operator\";\n }\n\n // attributes\n if (stream.eatWhile(/[\\w-]/)) {\n if (isEndLine(stream)) {\n state.cursorHalf = 0;\n }\n word = stream.current().toLowerCase();\n if (valueKeywords.hasOwnProperty(word)) {\n return \"atom\";\n } else if (colorKeywords.hasOwnProperty(word)) {\n return \"keyword\";\n } else if (propertyKeywords.hasOwnProperty(word)) {\n state.prevProp = stream.current().toLowerCase();\n return \"property\";\n } else {\n return \"tag\";\n }\n }\n\n //stream.eatSpace();\n if (isEndLine(stream)) {\n state.cursorHalf = 0;\n return null;\n }\n\n } // else ends here\n\n if (stream.match(opRegexp))\n return \"operator\";\n\n // If we haven't returned by now, we move 1 character\n // and return an error\n stream.next();\n return null;\n }\n\n function tokenLexer(stream, state) {\n if (stream.sol()) state.indentCount = 0;\n var style = state.tokenizer(stream, state);\n var current = stream.current();\n\n if (current === \"@return\" || current === \"}\"){\n dedent(state);\n }\n\n if (style !== null) {\n var startOfToken = stream.pos - current.length;\n\n var withCurrentIndent = startOfToken + (config.indentUnit * state.indentCount);\n\n var newScopes = [];\n\n for (var i = 0; i < state.scopes.length; i++) {\n var scope = state.scopes[i];\n\n if (scope.offset <= withCurrentIndent)\n newScopes.push(scope);\n }\n\n state.scopes = newScopes;\n }\n\n\n return style;\n }\n\n return {\n startState: function() {\n return {\n tokenizer: tokenBase,\n scopes: [{offset: 0, type: \"sass\"}],\n indentCount: 0,\n cursorHalf: 0, // cursor half tells us if cursor lies after (1)\n // or before (0) colon (well... more or less)\n definedVars: [],\n definedMixins: []\n };\n },\n token: function(stream, state) {\n var style = tokenLexer(stream, state);\n\n state.lastToken = { style: style, content: stream.current() };\n\n return style;\n },\n\n indent: function(state) {\n return state.scopes[0].offset;\n },\n\n blockCommentStart: \"/*\",\n blockCommentEnd: \"*/\",\n lineComment: \"//\",\n fold: \"indent\"\n };\n}, \"css\");\n\nCodeMirror.defineMIME(\"text/x-sass\", \"sass\");\n\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vbm9kZV9tb2R1bGVzL2NvZGVtaXJyb3IvbW9kZS9zYXNzL3Nhc3MuanM/MWI2MyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUVBO0FBQ0EsTUFBTSxJQUF1RDtBQUM3RCxRQUFRLG1CQUFPLENBQUMseUVBQXNCLEdBQUcsbUJBQU8sQ0FBQyw2REFBWTtBQUM3RCxPQUFPLEVBR2E7QUFDcEIsQ0FBQztBQUNEOztBQUVBO0FBQ0E7QUFDQSx1REFBdUQ7QUFDdkQsaURBQWlEO0FBQ2pELGlEQUFpRDtBQUNqRDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLGtFQUFrRSxNQUFNLE1BQU07QUFDOUU7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EseUJBQXlCLGVBQWU7O0FBRXhDO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsMkNBQTJDLGVBQWU7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sNkNBQTZDO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLHVCQUF1QjtBQUNuRDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDBCQUEwQjtBQUMxQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxnREFBZ0Q7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsRUFBRSxhQUFhLEVBQUU7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsK0NBQStDO0FBQy9DO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQSxxQkFBcUIseUJBQXlCO0FBQzlDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHdCQUF3QjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQSx5QkFBeUI7O0FBRXpCO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDs7QUFFQSxDQUFDIiwiZmlsZSI6Ii4vbm9kZV9tb2R1bGVzL2NvZGVtaXJyb3IvbW9kZS9zYXNzL3Nhc3MuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb2RlTWlycm9yLCBjb3B5cmlnaHQgKGMpIGJ5IE1hcmlqbiBIYXZlcmJla2UgYW5kIG90aGVyc1xuLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHBzOi8vY29kZW1pcnJvci5uZXQvTElDRU5TRVxuXG4oZnVuY3Rpb24obW9kKSB7XG4gIGlmICh0eXBlb2YgZXhwb3J0cyA9PSBcIm9iamVjdFwiICYmIHR5cGVvZiBtb2R1bGUgPT0gXCJvYmplY3RcIikgLy8gQ29tbW9uSlNcbiAgICBtb2QocmVxdWlyZShcIi4uLy4uL2xpYi9jb2RlbWlycm9yXCIpLCByZXF1aXJlKFwiLi4vY3NzL2Nzc1wiKSk7XG4gIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIC8vIEFNRFxuICAgIGRlZmluZShbXCIuLi8uLi9saWIvY29kZW1pcnJvclwiLCBcIi4uL2Nzcy9jc3NcIl0sIG1vZCk7XG4gIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnZcbiAgICBtb2QoQ29kZU1pcnJvcik7XG59KShmdW5jdGlvbihDb2RlTWlycm9yKSB7XG5cInVzZSBzdHJpY3RcIjtcblxuQ29kZU1pcnJvci5kZWZpbmVNb2RlKFwic2Fzc1wiLCBmdW5jdGlvbihjb25maWcpIHtcbiAgdmFyIGNzc01vZGUgPSBDb2RlTWlycm9yLm1pbWVNb2Rlc1tcInRleHQvY3NzXCJdO1xuICB2YXIgcHJvcGVydHlLZXl3b3JkcyA9IGNzc01vZGUucHJvcGVydHlLZXl3b3JkcyB8fCB7fSxcbiAgICAgIGNvbG9yS2V5d29yZHMgPSBjc3NNb2RlLmNvbG9yS2V5d29yZHMgfHwge30sXG4gICAgICB2YWx1ZUtleXdvcmRzID0gY3NzTW9kZS52YWx1ZUtleXdvcmRzIHx8IHt9LFxuICAgICAgZm9udFByb3BlcnRpZXMgPSBjc3NNb2RlLmZvbnRQcm9wZXJ0aWVzIHx8IHt9O1xuXG4gIGZ1bmN0aW9uIHRva2VuUmVnZXhwKHdvcmRzKSB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoXCJeXCIgKyB3b3Jkcy5qb2luKFwifFwiKSk7XG4gIH1cblxuICB2YXIga2V5d29yZHMgPSBbXCJ0cnVlXCIsIFwiZmFsc2VcIiwgXCJudWxsXCIsIFwiYXV0b1wiXTtcbiAgdmFyIGtleXdvcmRzUmVnZXhwID0gbmV3IFJlZ0V4cChcIl5cIiArIGtleXdvcmRzLmpvaW4oXCJ8XCIpKTtcblxuICB2YXIgb3BlcmF0b3JzID0gW1wiXFxcXChcIiwgXCJcXFxcKVwiLCBcIj1cIiwgXCI+XCIsIFwiPFwiLCBcIj09XCIsIFwiPj1cIiwgXCI8PVwiLCBcIlxcXFwrXCIsIFwiLVwiLFxuICAgICAgICAgICAgICAgICAgIFwiXFxcXCE9XCIsIFwiL1wiLCBcIlxcXFwqXCIsIFwiJVwiLCBcImFuZFwiLCBcIm9yXCIsIFwibm90XCIsIFwiO1wiLFwiXFxcXHtcIixcIlxcXFx9XCIsXCI6XCJdO1xuICB2YXIgb3BSZWdleHAgPSB0b2tlblJlZ2V4cChvcGVyYXRvcnMpO1xuXG4gIHZhciBwc2V1ZG9FbGVtZW50c1JlZ2V4cCA9IC9eOjo/W2EtekEtWl9dW1xcd1xcLV0qLztcblxuICB2YXIgd29yZDtcblxuICBmdW5jdGlvbiBpc0VuZExpbmUoc3RyZWFtKSB7XG4gICAgcmV0dXJuICFzdHJlYW0ucGVlaygpIHx8IHN0cmVhbS5tYXRjaCgvXFxzKyQvLCBmYWxzZSk7XG4gIH1cblxuICBmdW5jdGlvbiB1cmxUb2tlbnMoc3RyZWFtLCBzdGF0ZSkge1xuICAgIHZhciBjaCA9IHN0cmVhbS5wZWVrKCk7XG5cbiAgICBpZiAoY2ggPT09IFwiKVwiKSB7XG4gICAgICBzdHJlYW0ubmV4dCgpO1xuICAgICAgc3RhdGUudG9rZW5pemVyID0gdG9rZW5CYXNlO1xuICAgICAgcmV0dXJuIFwib3BlcmF0b3JcIjtcbiAgICB9IGVsc2UgaWYgKGNoID09PSBcIihcIikge1xuICAgICAgc3RyZWFtLm5leHQoKTtcbiAgICAgIHN0cmVhbS5lYXRTcGFjZSgpO1xuXG4gICAgICByZXR1cm4gXCJvcGVyYXRvclwiO1xuICAgIH0gZWxzZSBpZiAoY2ggPT09IFwiJ1wiIHx8IGNoID09PSAnXCInKSB7XG4gICAgICBzdGF0ZS50b2tlbml6ZXIgPSBidWlsZFN0cmluZ1Rva2VuaXplcihzdHJlYW0ubmV4dCgpKTtcbiAgICAgIHJldHVybiBcInN0cmluZ1wiO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS50b2tlbml6ZXIgPSBidWlsZFN0cmluZ1Rva2VuaXplcihcIilcIiwgZmFsc2UpO1xuICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGNvbW1lbnQoaW5kZW50YXRpb24sIG11bHRpTGluZSkge1xuICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7XG4gICAgICBpZiAoc3RyZWFtLnNvbCgpICYmIHN0cmVhbS5pbmRlbnRhdGlvbigpIDw9IGluZGVudGF0aW9uKSB7XG4gICAgICAgIHN0YXRlLnRva2VuaXplciA9IHRva2VuQmFzZTtcbiAgICAgICAgcmV0dXJuIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG11bHRpTGluZSAmJiBzdHJlYW0uc2tpcFRvKFwiKi9cIikpIHtcbiAgICAgICAgc3RyZWFtLm5leHQoKTtcbiAgICAgICAgc3RyZWFtLm5leHQoKTtcbiAgICAgICAgc3RhdGUudG9rZW5pemVyID0gdG9rZW5CYXNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gXCJjb21tZW50XCI7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGJ1aWxkU3RyaW5nVG9rZW5pemVyKHF1b3RlLCBncmVlZHkpIHtcbiAgICBpZiAoZ3JlZWR5ID09IG51bGwpIHsgZ3JlZWR5ID0gdHJ1ZTsgfVxuXG4gICAgZnVuY3Rpb24gc3RyaW5nVG9rZW5pemVyKHN0cmVhbSwgc3RhdGUpIHtcbiAgICAgIHZhciBuZXh0Q2hhciA9IHN0cmVhbS5uZXh0KCk7XG4gICAgICB2YXIgcGVla0NoYXIgPSBzdHJlYW0ucGVlaygpO1xuICAgICAgdmFyIHByZXZpb3VzQ2hhciA9IHN0cmVhbS5zdHJpbmcuY2hhckF0KHN0cmVhbS5wb3MtMik7XG5cbiAgICAgIHZhciBlbmRpbmdTdHJpbmcgPSAoKG5leHRDaGFyICE9PSBcIlxcXFxcIiAmJiBwZWVrQ2hhciA9PT0gcXVvdGUpIHx8IChuZXh0Q2hhciA9PT0gcXVvdGUgJiYgcHJldmlvdXNDaGFyICE9PSBcIlxcXFxcIikpO1xuXG4gICAgICBpZiAoZW5kaW5nU3RyaW5nKSB7XG4gICAgICAgIGlmIChuZXh0Q2hhciAhPT0gcXVvdGUgJiYgZ3JlZWR5KSB7IHN0cmVhbS5uZXh0KCk7IH1cbiAgICAgICAgaWYgKGlzRW5kTGluZShzdHJlYW0pKSB7XG4gICAgICAgICAgc3RhdGUuY3Vyc29ySGFsZiA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUudG9rZW5pemVyID0gdG9rZW5CYXNlO1xuICAgICAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgICAgIH0gZWxzZSBpZiAobmV4dENoYXIgPT09IFwiI1wiICYmIHBlZWtDaGFyID09PSBcIntcIikge1xuICAgICAgICBzdGF0ZS50b2tlbml6ZXIgPSBidWlsZEludGVycG9sYXRpb25Ub2tlbml6ZXIoc3RyaW5nVG9rZW5pemVyKTtcbiAgICAgICAgc3RyZWFtLm5leHQoKTtcbiAgICAgICAgcmV0dXJuIFwib3BlcmF0b3JcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBcInN0cmluZ1wiO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzdHJpbmdUb2tlbml6ZXI7XG4gIH1cblxuICBmdW5jdGlvbiBidWlsZEludGVycG9sYXRpb25Ub2tlbml6ZXIoY3VycmVudFRva2VuaXplcikge1xuICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7XG4gICAgICBpZiAoc3RyZWFtLnBlZWsoKSA9PT0gXCJ9XCIpIHtcbiAgICAgICAgc3RyZWFtLm5leHQoKTtcbiAgICAgICAgc3RhdGUudG9rZW5pemVyID0gY3VycmVudFRva2VuaXplcjtcbiAgICAgICAgcmV0dXJuIFwib3BlcmF0b3JcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0b2tlbkJhc2Uoc3RyZWFtLCBzdGF0ZSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluZGVudChzdGF0ZSkge1xuICAgIGlmIChzdGF0ZS5pbmRlbnRDb3VudCA9PSAwKSB7XG4gICAgICBzdGF0ZS5pbmRlbnRDb3VudCsrO1xuICAgICAgdmFyIGxhc3RTY29wZU9mZnNldCA9IHN0YXRlLnNjb3Blc1swXS5vZmZzZXQ7XG4gICAgICB2YXIgY3VycmVudE9mZnNldCA9IGxhc3RTY29wZU9mZnNldCArIGNvbmZpZy5pbmRlbnRVbml0O1xuICAgICAgc3RhdGUuc2NvcGVzLnVuc2hpZnQoeyBvZmZzZXQ6Y3VycmVudE9mZnNldCB9KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBkZWRlbnQoc3RhdGUpIHtcbiAgICBpZiAoc3RhdGUuc2NvcGVzLmxlbmd0aCA9PSAxKSByZXR1cm47XG5cbiAgICBzdGF0ZS5zY29wZXMuc2hpZnQoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7XG4gICAgdmFyIGNoID0gc3RyZWFtLnBlZWsoKTtcblxuICAgIC8vIENvbW1lbnRcbiAgICBpZiAoc3RyZWFtLm1hdGNoKFwiLypcIikpIHtcbiAgICAgIHN0YXRlLnRva2VuaXplciA9IGNvbW1lbnQoc3RyZWFtLmluZGVudGF0aW9uKCksIHRydWUpO1xuICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplcihzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG4gICAgaWYgKHN0cmVhbS5tYXRjaChcIi8vXCIpKSB7XG4gICAgICBzdGF0ZS50b2tlbml6ZXIgPSBjb21tZW50KHN0cmVhbS5pbmRlbnRhdGlvbigpLCBmYWxzZSk7XG4gICAgICByZXR1cm4gc3RhdGUudG9rZW5pemVyKHN0cmVhbSwgc3RhdGUpO1xuICAgIH1cblxuICAgIC8vIEludGVycG9sYXRpb25cbiAgICBpZiAoc3RyZWFtLm1hdGNoKFwiI3tcIikpIHtcbiAgICAgIHN0YXRlLnRva2VuaXplciA9IGJ1aWxkSW50ZXJwb2xhdGlvblRva2VuaXplcih0b2tlbkJhc2UpO1xuICAgICAgcmV0dXJuIFwib3BlcmF0b3JcIjtcbiAgICB9XG5cbiAgICAvLyBTdHJpbmdzXG4gICAgaWYgKGNoID09PSAnXCInIHx8IGNoID09PSBcIidcIikge1xuICAgICAgc3RyZWFtLm5leHQoKTtcbiAgICAgIHN0YXRlLnRva2VuaXplciA9IGJ1aWxkU3RyaW5nVG9rZW5pemVyKGNoKTtcbiAgICAgIHJldHVybiBcInN0cmluZ1wiO1xuICAgIH1cblxuICAgIGlmKCFzdGF0ZS5jdXJzb3JIYWxmKXsvLyBzdGF0ZS5jdXJzb3JIYWxmID09PSAwXG4gICAgLy8gZmlyc3QgaGFsZiBpLmUuIGJlZm9yZSA6IGZvciBrZXktdmFsdWUgcGFpcnNcbiAgICAvLyBpbmNsdWRpbmcgc2VsZWN0b3JzXG5cbiAgICAgIGlmIChjaCA9PT0gXCItXCIpIHtcbiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXi1cXHcrLS8pKSB7XG4gICAgICAgICAgcmV0dXJuIFwibWV0YVwiO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjaCA9PT0gXCIuXCIpIHtcbiAgICAgICAgc3RyZWFtLm5leHQoKTtcbiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXltcXHctXSsvKSkge1xuICAgICAgICAgIGluZGVudChzdGF0ZSk7XG4gICAgICAgICAgcmV0dXJuIFwicXVhbGlmaWVyXCI7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLnBlZWsoKSA9PT0gXCIjXCIpIHtcbiAgICAgICAgICBpbmRlbnQoc3RhdGUpO1xuICAgICAgICAgIHJldHVybiBcInRhZ1wiO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjaCA9PT0gXCIjXCIpIHtcbiAgICAgICAgc3RyZWFtLm5leHQoKTtcbiAgICAgICAgLy8gSUQgc2VsZWN0b3JzXG4gICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15bXFx3LV0rLykpIHtcbiAgICAgICAgICBpbmRlbnQoc3RhdGUpO1xuICAgICAgICAgIHJldHVybiBcImJ1aWx0aW5cIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RyZWFtLnBlZWsoKSA9PT0gXCIjXCIpIHtcbiAgICAgICAgICBpbmRlbnQoc3RhdGUpO1xuICAgICAgICAgIHJldHVybiBcInRhZ1wiO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFZhcmlhYmxlc1xuICAgICAgaWYgKGNoID09PSBcIiRcIikge1xuICAgICAgICBzdHJlYW0ubmV4dCgpO1xuICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcXHctXS8pO1xuICAgICAgICByZXR1cm4gXCJ2YXJpYWJsZS0yXCI7XG4gICAgICB9XG5cbiAgICAgIC8vIE51bWJlcnNcbiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14tP1swLTlcXC5dKy8pKVxuICAgICAgICByZXR1cm4gXCJudW1iZXJcIjtcblxuICAgICAgLy8gVW5pdHNcbiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14ocHh8ZW18aW4pXFxiLykpXG4gICAgICAgIHJldHVybiBcInVuaXRcIjtcblxuICAgICAgaWYgKHN0cmVhbS5tYXRjaChrZXl3b3Jkc1JlZ2V4cCkpXG4gICAgICAgIHJldHVybiBcImtleXdvcmRcIjtcblxuICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXnVybC8pICYmIHN0cmVhbS5wZWVrKCkgPT09IFwiKFwiKSB7XG4gICAgICAgIHN0YXRlLnRva2VuaXplciA9IHVybFRva2VucztcbiAgICAgICAgcmV0dXJuIFwiYXRvbVwiO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2ggPT09IFwiPVwiKSB7XG4gICAgICAgIC8vIE1hdGNoIHNob3J0Y3V0IG1peGluIGRlZmluaXRpb25cbiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXj1bXFx3LV0rLykpIHtcbiAgICAgICAgICBpbmRlbnQoc3RhdGUpO1xuICAgICAgICAgIHJldHVybiBcIm1ldGFcIjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY2ggPT09IFwiK1wiKSB7XG4gICAgICAgIC8vIE1hdGNoIHNob3J0Y3V0IG1peGluIGRlZmluaXRpb25cbiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXlxcK1tcXHctXSsvKSl7XG4gICAgICAgICAgcmV0dXJuIFwidmFyaWFibGUtM1wiO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmKGNoID09PSBcIkBcIil7XG4gICAgICAgIGlmKHN0cmVhbS5tYXRjaCgnQGV4dGVuZCcpKXtcbiAgICAgICAgICBpZighc3RyZWFtLm1hdGNoKC9cXHMqW1xcd10vKSlcbiAgICAgICAgICAgIGRlZGVudChzdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuXG4gICAgICAvLyBJbmRlbnQgRGlyZWN0aXZlc1xuICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXkAoZWxzZSBpZnxpZnxtZWRpYXxlbHNlfGZvcnxlYWNofHdoaWxlfG1peGlufGZ1bmN0aW9uKS8pKSB7XG4gICAgICAgIGluZGVudChzdGF0ZSk7XG4gICAgICAgIHJldHVybiBcImRlZlwiO1xuICAgICAgfVxuXG4gICAgICAvLyBPdGhlciBEaXJlY3RpdmVzXG4gICAgICBpZiAoY2ggPT09IFwiQFwiKSB7XG4gICAgICAgIHN0cmVhbS5uZXh0KCk7XG4gICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1xcdy1dLyk7XG4gICAgICAgIHJldHVybiBcImRlZlwiO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RyZWFtLmVhdFdoaWxlKC9bXFx3LV0vKSl7XG4gICAgICAgIGlmKHN0cmVhbS5tYXRjaCgvICo6ICpbXFx3LVxcK1xcJCMhXFwoXCInXS8sZmFsc2UpKXtcbiAgICAgICAgICB3b3JkID0gc3RyZWFtLmN1cnJlbnQoKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIHZhciBwcm9wID0gc3RhdGUucHJldlByb3AgKyBcIi1cIiArIHdvcmQ7XG4gICAgICAgICAgaWYgKHByb3BlcnR5S2V5d29yZHMuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgICAgICAgIHJldHVybiBcInByb3BlcnR5XCI7XG4gICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eUtleXdvcmRzLmhhc093blByb3BlcnR5KHdvcmQpKSB7XG4gICAgICAgICAgICBzdGF0ZS5wcmV2UHJvcCA9IHdvcmQ7XG4gICAgICAgICAgICByZXR1cm4gXCJwcm9wZXJ0eVwiO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZm9udFByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkod29yZCkpIHtcbiAgICAgICAgICAgIHJldHVybiBcInByb3BlcnR5XCI7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBcInRhZ1wiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYoc3RyZWFtLm1hdGNoKC8gKjovLGZhbHNlKSl7XG4gICAgICAgICAgaW5kZW50KHN0YXRlKTtcbiAgICAgICAgICBzdGF0ZS5jdXJzb3JIYWxmID0gMTtcbiAgICAgICAgICBzdGF0ZS5wcmV2UHJvcCA9IHN0cmVhbS5jdXJyZW50KCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICByZXR1cm4gXCJwcm9wZXJ0eVwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYoc3RyZWFtLm1hdGNoKC8gKiwvLGZhbHNlKSl7XG4gICAgICAgICAgcmV0dXJuIFwidGFnXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZXtcbiAgICAgICAgICBpbmRlbnQoc3RhdGUpO1xuICAgICAgICAgIHJldHVybiBcInRhZ1wiO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmKGNoID09PSBcIjpcIil7XG4gICAgICAgIGlmIChzdHJlYW0ubWF0Y2gocHNldWRvRWxlbWVudHNSZWdleHApKXsgLy8gY291bGQgYmUgYSBwc2V1ZG8tZWxlbWVudFxuICAgICAgICAgIHJldHVybiBcInZhcmlhYmxlLTNcIjtcbiAgICAgICAgfVxuICAgICAgICBzdHJlYW0ubmV4dCgpO1xuICAgICAgICBzdGF0ZS5jdXJzb3JIYWxmPTE7XG4gICAgICAgIHJldHVybiBcIm9wZXJhdG9yXCI7XG4gICAgICB9XG5cbiAgICB9IC8vIGN1cnNvckhhbGY9PT0wIGVuZHMgaGVyZVxuICAgIGVsc2V7XG5cbiAgICAgIGlmIChjaCA9PT0gXCIjXCIpIHtcbiAgICAgICAgc3RyZWFtLm5leHQoKTtcbiAgICAgICAgLy8gSGV4IG51bWJlcnNcbiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvWzAtOWEtZkEtRl17Nn18WzAtOWEtZkEtRl17M30vKSl7XG4gICAgICAgICAgaWYgKGlzRW5kTGluZShzdHJlYW0pKSB7XG4gICAgICAgICAgICBzdGF0ZS5jdXJzb3JIYWxmID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFwibnVtYmVyXCI7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gTnVtYmVyc1xuICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXi0/WzAtOVxcLl0rLykpe1xuICAgICAgICBpZiAoaXNFbmRMaW5lKHN0cmVhbSkpIHtcbiAgICAgICAgICBzdGF0ZS5jdXJzb3JIYWxmID0gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gXCJudW1iZXJcIjtcbiAgICAgIH1cblxuICAgICAgLy8gVW5pdHNcbiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14ocHh8ZW18aW4pXFxiLykpe1xuICAgICAgICBpZiAoaXNFbmRMaW5lKHN0cmVhbSkpIHtcbiAgICAgICAgICBzdGF0ZS5jdXJzb3JIYWxmID0gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gXCJ1bml0XCI7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdHJlYW0ubWF0Y2goa2V5d29yZHNSZWdleHApKXtcbiAgICAgICAgaWYgKGlzRW5kTGluZShzdHJlYW0pKSB7XG4gICAgICAgICAgc3RhdGUuY3Vyc29ySGFsZiA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwia2V5d29yZFwiO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RyZWFtLm1hdGNoKC9edXJsLykgJiYgc3RyZWFtLnBlZWsoKSA9PT0gXCIoXCIpIHtcbiAgICAgICAgc3RhdGUudG9rZW5pemVyID0gdXJsVG9rZW5zO1xuICAgICAgICBpZiAoaXNFbmRMaW5lKHN0cmVhbSkpIHtcbiAgICAgICAgICBzdGF0ZS5jdXJzb3JIYWxmID0gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gXCJhdG9tXCI7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhcmlhYmxlc1xuICAgICAgaWYgKGNoID09PSBcIiRcIikge1xuICAgICAgICBzdHJlYW0ubmV4dCgpO1xuICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcXHctXS8pO1xuICAgICAgICBpZiAoaXNFbmRMaW5lKHN0cmVhbSkpIHtcbiAgICAgICAgICBzdGF0ZS5jdXJzb3JIYWxmID0gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gXCJ2YXJpYWJsZS0yXCI7XG4gICAgICB9XG5cbiAgICAgIC8vIGJhbmcgY2hhcmFjdGVyIGZvciAhaW1wb3J0YW50LCAhZGVmYXVsdCwgZXRjLlxuICAgICAgaWYgKGNoID09PSBcIiFcIikge1xuICAgICAgICBzdHJlYW0ubmV4dCgpO1xuICAgICAgICBzdGF0ZS5jdXJzb3JIYWxmID0gMDtcbiAgICAgICAgcmV0dXJuIHN0cmVhbS5tYXRjaCgvXltcXHddKy8pID8gXCJrZXl3b3JkXCI6IFwib3BlcmF0b3JcIjtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0cmVhbS5tYXRjaChvcFJlZ2V4cCkpe1xuICAgICAgICBpZiAoaXNFbmRMaW5lKHN0cmVhbSkpIHtcbiAgICAgICAgICBzdGF0ZS5jdXJzb3JIYWxmID0gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gXCJvcGVyYXRvclwiO1xuICAgICAgfVxuXG4gICAgICAvLyBhdHRyaWJ1dGVzXG4gICAgICBpZiAoc3RyZWFtLmVhdFdoaWxlKC9bXFx3LV0vKSkge1xuICAgICAgICBpZiAoaXNFbmRMaW5lKHN0cmVhbSkpIHtcbiAgICAgICAgICBzdGF0ZS5jdXJzb3JIYWxmID0gMDtcbiAgICAgICAgfVxuICAgICAgICB3b3JkID0gc3RyZWFtLmN1cnJlbnQoKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAodmFsdWVLZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh3b3JkKSkge1xuICAgICAgICAgIHJldHVybiBcImF0b21cIjtcbiAgICAgICAgfSBlbHNlIGlmIChjb2xvcktleXdvcmRzLmhhc093blByb3BlcnR5KHdvcmQpKSB7XG4gICAgICAgICAgcmV0dXJuIFwia2V5d29yZFwiO1xuICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5S2V5d29yZHMuaGFzT3duUHJvcGVydHkod29yZCkpIHtcbiAgICAgICAgICBzdGF0ZS5wcmV2UHJvcCA9IHN0cmVhbS5jdXJyZW50KCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICByZXR1cm4gXCJwcm9wZXJ0eVwiO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBcInRhZ1wiO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vc3RyZWFtLmVhdFNwYWNlKCk7XG4gICAgICBpZiAoaXNFbmRMaW5lKHN0cmVhbSkpIHtcbiAgICAgICAgc3RhdGUuY3Vyc29ySGFsZiA9IDA7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgfSAvLyBlbHNlIGVuZHMgaGVyZVxuXG4gICAgaWYgKHN0cmVhbS5tYXRjaChvcFJlZ2V4cCkpXG4gICAgICByZXR1cm4gXCJvcGVyYXRvclwiO1xuXG4gICAgLy8gSWYgd2UgaGF2ZW4ndCByZXR1cm5lZCBieSBub3csIHdlIG1vdmUgMSBjaGFyYWN0ZXJcbiAgICAvLyBhbmQgcmV0dXJuIGFuIGVycm9yXG4gICAgc3RyZWFtLm5leHQoKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRva2VuTGV4ZXIoc3RyZWFtLCBzdGF0ZSkge1xuICAgIGlmIChzdHJlYW0uc29sKCkpIHN0YXRlLmluZGVudENvdW50ID0gMDtcbiAgICB2YXIgc3R5bGUgPSBzdGF0ZS50b2tlbml6ZXIoc3RyZWFtLCBzdGF0ZSk7XG4gICAgdmFyIGN1cnJlbnQgPSBzdHJlYW0uY3VycmVudCgpO1xuXG4gICAgaWYgKGN1cnJlbnQgPT09IFwiQHJldHVyblwiIHx8IGN1cnJlbnQgPT09IFwifVwiKXtcbiAgICAgIGRlZGVudChzdGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKHN0eWxlICE9PSBudWxsKSB7XG4gICAgICB2YXIgc3RhcnRPZlRva2VuID0gc3RyZWFtLnBvcyAtIGN1cnJlbnQubGVuZ3RoO1xuXG4gICAgICB2YXIgd2l0aEN1cnJlbnRJbmRlbnQgPSBzdGFydE9mVG9rZW4gKyAoY29uZmlnLmluZGVudFVuaXQgKiBzdGF0ZS5pbmRlbnRDb3VudCk7XG5cbiAgICAgIHZhciBuZXdTY29wZXMgPSBbXTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGF0ZS5zY29wZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHNjb3BlID0gc3RhdGUuc2NvcGVzW2ldO1xuXG4gICAgICAgIGlmIChzY29wZS5vZmZzZXQgPD0gd2l0aEN1cnJlbnRJbmRlbnQpXG4gICAgICAgICAgbmV3U2NvcGVzLnB1c2goc2NvcGUpO1xuICAgICAgfVxuXG4gICAgICBzdGF0ZS5zY29wZXMgPSBuZXdTY29wZXM7XG4gICAgfVxuXG5cbiAgICByZXR1cm4gc3R5bGU7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdG9rZW5pemVyOiB0b2tlbkJhc2UsXG4gICAgICAgIHNjb3BlczogW3tvZmZzZXQ6IDAsIHR5cGU6IFwic2Fzc1wifV0sXG4gICAgICAgIGluZGVudENvdW50OiAwLFxuICAgICAgICBjdXJzb3JIYWxmOiAwLCAgLy8gY3Vyc29yIGhhbGYgdGVsbHMgdXMgaWYgY3Vyc29yIGxpZXMgYWZ0ZXIgKDEpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvciBiZWZvcmUgKDApIGNvbG9uICh3ZWxsLi4uIG1vcmUgb3IgbGVzcylcbiAgICAgICAgZGVmaW5lZFZhcnM6IFtdLFxuICAgICAgICBkZWZpbmVkTWl4aW5zOiBbXVxuICAgICAgfTtcbiAgICB9LFxuICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7XG4gICAgICB2YXIgc3R5bGUgPSB0b2tlbkxleGVyKHN0cmVhbSwgc3RhdGUpO1xuXG4gICAgICBzdGF0ZS5sYXN0VG9rZW4gPSB7IHN0eWxlOiBzdHlsZSwgY29udGVudDogc3RyZWFtLmN1cnJlbnQoKSB9O1xuXG4gICAgICByZXR1cm4gc3R5bGU7XG4gICAgfSxcblxuICAgIGluZGVudDogZnVuY3Rpb24oc3RhdGUpIHtcbiAgICAgIHJldHVybiBzdGF0ZS5zY29wZXNbMF0ub2Zmc2V0O1xuICAgIH0sXG5cbiAgICBibG9ja0NvbW1lbnRTdGFydDogXCIvKlwiLFxuICAgIGJsb2NrQ29tbWVudEVuZDogXCIqL1wiLFxuICAgIGxpbmVDb21tZW50OiBcIi8vXCIsXG4gICAgZm9sZDogXCJpbmRlbnRcIlxuICB9O1xufSwgXCJjc3NcIik7XG5cbkNvZGVNaXJyb3IuZGVmaW5lTUlNRShcInRleHQveC1zYXNzXCIsIFwic2Fzc1wiKTtcblxufSk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/codemirror/mode/sass/sass.js\n"); /***/ }), /***/ "./node_modules/codemirror/mode/twig/twig.js": -/*!***************************************************!* +/*!***************************************************!*\ !*** ./node_modules/codemirror/mode/twig/twig.js ***! \***************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -273,7 +251,7 @@ eval("// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distribute /***/ }), /***/ "./node_modules/codemirror/mode/xml/xml.js": -/*!*************************************************!* +/*!*************************************************!*\ !*** ./node_modules/codemirror/mode/xml/xml.js ***! \*************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -283,17 +261,17 @@ eval("// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distribute /***/ }), /***/ "./node_modules/codemirror/mode/yaml/yaml.js": -/*!***************************************************!* +/*!***************************************************!*\ !*** ./node_modules/codemirror/mode/yaml/yaml.js ***! \***************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { -eval("// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n if (true) // CommonJS\n mod(__webpack_require__(/*! ../../lib/codemirror */ \"./node_modules/codemirror/lib/codemirror.js\"));\n else {}\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"yaml\", function() {\n\n var cons = ['true', 'false', 'on', 'off', 'yes', 'no'];\n var keywordRegex = new RegExp(\"\\\\b((\"+cons.join(\")|(\")+\"))$\", 'i');\n\n return {\n token: function(stream, state) {\n var ch = stream.peek();\n var esc = state.escaped;\n state.escaped = false;\n /* comments */\n if (ch == \"#\" && (stream.pos == 0 || /\\s/.test(stream.string.charAt(stream.pos - 1)))) {\n stream.skipToEnd();\n return \"comment\";\n }\n\n if (stream.match(/^('([^']|\\\\.)*'?|\"([^\"]|\\\\.)*\"?)/))\n return \"string\";\n\n if (state.literal && stream.indentation() > state.keyCol) {\n stream.skipToEnd(); return \"string\";\n } else if (state.literal) { state.literal = false; }\n if (stream.sol()) {\n state.keyCol = 0;\n state.pair = false;\n state.pairStart = false;\n /* document start */\n if(stream.match(/---/)) { return \"def\"; }\n /* document end */\n if (stream.match(/\\.\\.\\./)) { return \"def\"; }\n /* array list item */\n if (stream.match(/\\s*-\\s+/)) { return 'meta'; }\n }\n /* inline pairs/lists */\n if (stream.match(/^(\\{|\\}|\\[|\\])/)) {\n if (ch == '{')\n state.inlinePairs++;\n else if (ch == '}')\n state.inlinePairs--;\n else if (ch == '[')\n state.inlineList++;\n else\n state.inlineList--;\n return 'meta';\n }\n\n /* list seperator */\n if (state.inlineList > 0 && !esc && ch == ',') {\n stream.next();\n return 'meta';\n }\n /* pairs seperator */\n if (state.inlinePairs > 0 && !esc && ch == ',') {\n state.keyCol = 0;\n state.pair = false;\n state.pairStart = false;\n stream.next();\n return 'meta';\n }\n\n /* start of value of a pair */\n if (state.pairStart) {\n /* block literals */\n if (stream.match(/^\\s*(\\||\\>)\\s*/)) { state.literal = true; return 'meta'; };\n /* references */\n if (stream.match(/^\\s*(\\&|\\*)[a-z0-9\\._-]+\\b/i)) { return 'variable-2'; }\n /* numbers */\n if (state.inlinePairs == 0 && stream.match(/^\\s*-?[0-9\\.\\,]+\\s?$/)) { return 'number'; }\n if (state.inlinePairs > 0 && stream.match(/^\\s*-?[0-9\\.\\,]+\\s?(?=(,|}))/)) { return 'number'; }\n /* keywords */\n if (stream.match(keywordRegex)) { return 'keyword'; }\n }\n\n /* pairs (associative arrays) -> key */\n if (!state.pair && stream.match(/^\\s*(?:[,\\[\\]{}&*!|>'\"%@`][^\\s'\":]|[^,\\[\\]{}#&*!|>'\"%@`])[^#]*?(?=\\s*:($|\\s))/)) {\n state.pair = true;\n state.keyCol = stream.indentation();\n return \"atom\";\n }\n if (state.pair && stream.match(/^:\\s*/)) { state.pairStart = true; return 'meta'; }\n\n /* nothing found, continue */\n state.pairStart = false;\n state.escaped = (ch == '\\\\');\n stream.next();\n return null;\n },\n startState: function() {\n return {\n pair: false,\n pairStart: false,\n keyCol: 0,\n inlinePairs: 0,\n inlineList: 0,\n literal: false,\n escaped: false\n };\n },\n lineComment: \"#\",\n fold: \"indent\"\n };\n});\n\nCodeMirror.defineMIME(\"text/x-yaml\", \"yaml\");\nCodeMirror.defineMIME(\"text/yaml\", \"yaml\");\n\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vbm9kZV9tb2R1bGVzL2NvZGVtaXJyb3IvbW9kZS95YW1sL3lhbWwuanM/Y2VkMCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUVBO0FBQ0EsTUFBTSxJQUF1RDtBQUM3RCxRQUFRLG1CQUFPLENBQUMseUVBQXNCO0FBQ3RDLE9BQU8sRUFHYTtBQUNwQixDQUFDO0FBQ0Q7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsMkJBQTJCO0FBQzNCLE9BQU8sMEJBQTBCLHVCQUF1QjtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLGNBQWM7QUFDL0M7QUFDQSxxQ0FBcUMsY0FBYztBQUNuRDtBQUNBLHNDQUFzQyxlQUFlO0FBQ3JEO0FBQ0E7QUFDQSw0QkFBNEIsR0FBRztBQUMvQixvQkFBb0I7QUFDcEI7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLHNCQUFzQixlQUFlO0FBQ2xGO0FBQ0EsMERBQTBELHFCQUFxQjtBQUMvRTtBQUNBLDZFQUE2RSxpQkFBaUI7QUFDOUYsNkVBQTZFLE9BQU8saUJBQWlCO0FBQ3JHO0FBQ0EseUNBQXlDLGtCQUFrQjtBQUMzRDs7QUFFQTtBQUNBLHNEQUFzRCw2QkFBNkI7QUFDbkY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0Qsd0JBQXdCLGVBQWU7O0FBRXZGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBOztBQUVBLENBQUMiLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29kZW1pcnJvci9tb2RlL3lhbWwveWFtbC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvZGVNaXJyb3IsIGNvcHlyaWdodCAoYykgYnkgTWFyaWpuIEhhdmVyYmVrZSBhbmQgb3RoZXJzXG4vLyBEaXN0cmlidXRlZCB1bmRlciBhbiBNSVQgbGljZW5zZTogaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFXG5cbihmdW5jdGlvbihtb2QpIHtcbiAgaWYgKHR5cGVvZiBleHBvcnRzID09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG1vZHVsZSA9PSBcIm9iamVjdFwiKSAvLyBDb21tb25KU1xuICAgIG1vZChyZXF1aXJlKFwiLi4vLi4vbGliL2NvZGVtaXJyb3JcIikpO1xuICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSAvLyBBTURcbiAgICBkZWZpbmUoW1wiLi4vLi4vbGliL2NvZGVtaXJyb3JcIl0sIG1vZCk7XG4gIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnZcbiAgICBtb2QoQ29kZU1pcnJvcik7XG59KShmdW5jdGlvbihDb2RlTWlycm9yKSB7XG5cInVzZSBzdHJpY3RcIjtcblxuQ29kZU1pcnJvci5kZWZpbmVNb2RlKFwieWFtbFwiLCBmdW5jdGlvbigpIHtcblxuICB2YXIgY29ucyA9IFsndHJ1ZScsICdmYWxzZScsICdvbicsICdvZmYnLCAneWVzJywgJ25vJ107XG4gIHZhciBrZXl3b3JkUmVnZXggPSBuZXcgUmVnRXhwKFwiXFxcXGIoKFwiK2NvbnMuam9pbihcIil8KFwiKStcIikpJFwiLCAnaScpO1xuXG4gIHJldHVybiB7XG4gICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHtcbiAgICAgIHZhciBjaCA9IHN0cmVhbS5wZWVrKCk7XG4gICAgICB2YXIgZXNjID0gc3RhdGUuZXNjYXBlZDtcbiAgICAgIHN0YXRlLmVzY2FwZWQgPSBmYWxzZTtcbiAgICAgIC8qIGNvbW1lbnRzICovXG4gICAgICBpZiAoY2ggPT0gXCIjXCIgJiYgKHN0cmVhbS5wb3MgPT0gMCB8fCAvXFxzLy50ZXN0KHN0cmVhbS5zdHJpbmcuY2hhckF0KHN0cmVhbS5wb3MgLSAxKSkpKSB7XG4gICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTtcbiAgICAgICAgcmV0dXJuIFwiY29tbWVudFwiO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eKCcoW14nXXxcXFxcLikqJz98XCIoW15cIl18XFxcXC4pKlwiPykvKSlcbiAgICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XG5cbiAgICAgIGlmIChzdGF0ZS5saXRlcmFsICYmIHN0cmVhbS5pbmRlbnRhdGlvbigpID4gc3RhdGUua2V5Q29sKSB7XG4gICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsgcmV0dXJuIFwic3RyaW5nXCI7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlLmxpdGVyYWwpIHsgc3RhdGUubGl0ZXJhbCA9IGZhbHNlOyB9XG4gICAgICBpZiAoc3RyZWFtLnNvbCgpKSB7XG4gICAgICAgIHN0YXRlLmtleUNvbCA9IDA7XG4gICAgICAgIHN0YXRlLnBhaXIgPSBmYWxzZTtcbiAgICAgICAgc3RhdGUucGFpclN0YXJ0ID0gZmFsc2U7XG4gICAgICAgIC8qIGRvY3VtZW50IHN0YXJ0ICovXG4gICAgICAgIGlmKHN0cmVhbS5tYXRjaCgvLS0tLykpIHsgcmV0dXJuIFwiZGVmXCI7IH1cbiAgICAgICAgLyogZG9jdW1lbnQgZW5kICovXG4gICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL1xcLlxcLlxcLi8pKSB7IHJldHVybiBcImRlZlwiOyB9XG4gICAgICAgIC8qIGFycmF5IGxpc3QgaXRlbSAqL1xuICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9cXHMqLVxccysvKSkgeyByZXR1cm4gJ21ldGEnOyB9XG4gICAgICB9XG4gICAgICAvKiBpbmxpbmUgcGFpcnMvbGlzdHMgKi9cbiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14oXFx7fFxcfXxcXFt8XFxdKS8pKSB7XG4gICAgICAgIGlmIChjaCA9PSAneycpXG4gICAgICAgICAgc3RhdGUuaW5saW5lUGFpcnMrKztcbiAgICAgICAgZWxzZSBpZiAoY2ggPT0gJ30nKVxuICAgICAgICAgIHN0YXRlLmlubGluZVBhaXJzLS07XG4gICAgICAgIGVsc2UgaWYgKGNoID09ICdbJylcbiAgICAgICAgICBzdGF0ZS5pbmxpbmVMaXN0Kys7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICBzdGF0ZS5pbmxpbmVMaXN0LS07XG4gICAgICAgIHJldHVybiAnbWV0YSc7XG4gICAgICB9XG5cbiAgICAgIC8qIGxpc3Qgc2VwZXJhdG9yICovXG4gICAgICBpZiAoc3RhdGUuaW5saW5lTGlzdCA+IDAgJiYgIWVzYyAmJiBjaCA9PSAnLCcpIHtcbiAgICAgICAgc3RyZWFtLm5leHQoKTtcbiAgICAgICAgcmV0dXJuICdtZXRhJztcbiAgICAgIH1cbiAgICAgIC8qIHBhaXJzIHNlcGVyYXRvciAqL1xuICAgICAgaWYgKHN0YXRlLmlubGluZVBhaXJzID4gMCAmJiAhZXNjICYmIGNoID09ICcsJykge1xuICAgICAgICBzdGF0ZS5rZXlDb2wgPSAwO1xuICAgICAgICBzdGF0ZS5wYWlyID0gZmFsc2U7XG4gICAgICAgIHN0YXRlLnBhaXJTdGFydCA9IGZhbHNlO1xuICAgICAgICBzdHJlYW0ubmV4dCgpO1xuICAgICAgICByZXR1cm4gJ21ldGEnO1xuICAgICAgfVxuXG4gICAgICAvKiBzdGFydCBvZiB2YWx1ZSBvZiBhIHBhaXIgKi9cbiAgICAgIGlmIChzdGF0ZS5wYWlyU3RhcnQpIHtcbiAgICAgICAgLyogYmxvY2sgbGl0ZXJhbHMgKi9cbiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXlxccyooXFx8fFxcPilcXHMqLykpIHsgc3RhdGUubGl0ZXJhbCA9IHRydWU7IHJldHVybiAnbWV0YSc7IH07XG4gICAgICAgIC8qIHJlZmVyZW5jZXMgKi9cbiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXlxccyooXFwmfFxcKilbYS16MC05XFwuXy1dK1xcYi9pKSkgeyByZXR1cm4gJ3ZhcmlhYmxlLTInOyB9XG4gICAgICAgIC8qIG51bWJlcnMgKi9cbiAgICAgICAgaWYgKHN0YXRlLmlubGluZVBhaXJzID09IDAgJiYgc3RyZWFtLm1hdGNoKC9eXFxzKi0/WzAtOVxcLlxcLF0rXFxzPyQvKSkgeyByZXR1cm4gJ251bWJlcic7IH1cbiAgICAgICAgaWYgKHN0YXRlLmlubGluZVBhaXJzID4gMCAmJiBzdHJlYW0ubWF0Y2goL15cXHMqLT9bMC05XFwuXFwsXStcXHM/KD89KCx8fSkpLykpIHsgcmV0dXJuICdudW1iZXInOyB9XG4gICAgICAgIC8qIGtleXdvcmRzICovXG4gICAgICAgIGlmIChzdHJlYW0ubWF0Y2goa2V5d29yZFJlZ2V4KSkgeyByZXR1cm4gJ2tleXdvcmQnOyB9XG4gICAgICB9XG5cbiAgICAgIC8qIHBhaXJzIChhc3NvY2lhdGl2ZSBhcnJheXMpIC0+IGtleSAqL1xuICAgICAgaWYgKCFzdGF0ZS5wYWlyICYmIHN0cmVhbS5tYXRjaCgvXlxccyooPzpbLFxcW1xcXXt9JiohfD4nXCIlQGBdW15cXHMnXCI6XXxbXixcXFtcXF17fSMmKiF8PidcIiVAYF0pW14jXSo/KD89XFxzKjooJHxcXHMpKS8pKSB7XG4gICAgICAgIHN0YXRlLnBhaXIgPSB0cnVlO1xuICAgICAgICBzdGF0ZS5rZXlDb2wgPSBzdHJlYW0uaW5kZW50YXRpb24oKTtcbiAgICAgICAgcmV0dXJuIFwiYXRvbVwiO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXRlLnBhaXIgJiYgc3RyZWFtLm1hdGNoKC9eOlxccyovKSkgeyBzdGF0ZS5wYWlyU3RhcnQgPSB0cnVlOyByZXR1cm4gJ21ldGEnOyB9XG5cbiAgICAgIC8qIG5vdGhpbmcgZm91bmQsIGNvbnRpbnVlICovXG4gICAgICBzdGF0ZS5wYWlyU3RhcnQgPSBmYWxzZTtcbiAgICAgIHN0YXRlLmVzY2FwZWQgPSAoY2ggPT0gJ1xcXFwnKTtcbiAgICAgIHN0cmVhbS5uZXh0KCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGFpcjogZmFsc2UsXG4gICAgICAgIHBhaXJTdGFydDogZmFsc2UsXG4gICAgICAgIGtleUNvbDogMCxcbiAgICAgICAgaW5saW5lUGFpcnM6IDAsXG4gICAgICAgIGlubGluZUxpc3Q6IDAsXG4gICAgICAgIGxpdGVyYWw6IGZhbHNlLFxuICAgICAgICBlc2NhcGVkOiBmYWxzZVxuICAgICAgfTtcbiAgICB9LFxuICAgIGxpbmVDb21tZW50OiBcIiNcIixcbiAgICBmb2xkOiBcImluZGVudFwiXG4gIH07XG59KTtcblxuQ29kZU1pcnJvci5kZWZpbmVNSU1FKFwidGV4dC94LXlhbWxcIiwgXCJ5YW1sXCIpO1xuQ29kZU1pcnJvci5kZWZpbmVNSU1FKFwidGV4dC95YW1sXCIsIFwieWFtbFwiKTtcblxufSk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/codemirror/mode/yaml/yaml.js\n"); +eval("// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n if (true) // CommonJS\n mod(__webpack_require__(/*! ../../lib/codemirror */ \"./node_modules/codemirror/lib/codemirror.js\"));\n else {}\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"yaml\", function() {\n\n var cons = ['true', 'false', 'on', 'off', 'yes', 'no'];\n var keywordRegex = new RegExp(\"\\\\b((\"+cons.join(\")|(\")+\"))$\", 'i');\n\n return {\n token: function(stream, state) {\n var ch = stream.peek();\n var esc = state.escaped;\n state.escaped = false;\n /* comments */\n if (ch == \"#\" && (stream.pos == 0 || /\\s/.test(stream.string.charAt(stream.pos - 1)))) {\n stream.skipToEnd();\n return \"comment\";\n }\n\n if (stream.match(/^('([^']|\\\\.)*'?|\"([^\"]|\\\\.)*\"?)/))\n return \"string\";\n\n if (state.literal && stream.indentation() > state.keyCol) {\n stream.skipToEnd(); return \"string\";\n } else if (state.literal) { state.literal = false; }\n if (stream.sol()) {\n state.keyCol = 0;\n state.pair = false;\n state.pairStart = false;\n /* document start */\n if(stream.match('---')) { return \"def\"; }\n /* document end */\n if (stream.match('...')) { return \"def\"; }\n /* array list item */\n if (stream.match(/\\s*-\\s+/)) { return 'meta'; }\n }\n /* inline pairs/lists */\n if (stream.match(/^(\\{|\\}|\\[|\\])/)) {\n if (ch == '{')\n state.inlinePairs++;\n else if (ch == '}')\n state.inlinePairs--;\n else if (ch == '[')\n state.inlineList++;\n else\n state.inlineList--;\n return 'meta';\n }\n\n /* list separator */\n if (state.inlineList > 0 && !esc && ch == ',') {\n stream.next();\n return 'meta';\n }\n /* pairs separator */\n if (state.inlinePairs > 0 && !esc && ch == ',') {\n state.keyCol = 0;\n state.pair = false;\n state.pairStart = false;\n stream.next();\n return 'meta';\n }\n\n /* start of value of a pair */\n if (state.pairStart) {\n /* block literals */\n if (stream.match(/^\\s*(\\||\\>)\\s*/)) { state.literal = true; return 'meta'; };\n /* references */\n if (stream.match(/^\\s*(\\&|\\*)[a-z0-9\\._-]+\\b/i)) { return 'variable-2'; }\n /* numbers */\n if (state.inlinePairs == 0 && stream.match(/^\\s*-?[0-9\\.\\,]+\\s?$/)) { return 'number'; }\n if (state.inlinePairs > 0 && stream.match(/^\\s*-?[0-9\\.\\,]+\\s?(?=(,|}))/)) { return 'number'; }\n /* keywords */\n if (stream.match(keywordRegex)) { return 'keyword'; }\n }\n\n /* pairs (associative arrays) -> key */\n if (!state.pair && stream.match(/^\\s*(?:[,\\[\\]{}&*!|>'\"%@`][^\\s'\":]|[^,\\[\\]{}#&*!|>'\"%@`])[^#]*?(?=\\s*:($|\\s))/)) {\n state.pair = true;\n state.keyCol = stream.indentation();\n return \"atom\";\n }\n if (state.pair && stream.match(/^:\\s*/)) { state.pairStart = true; return 'meta'; }\n\n /* nothing found, continue */\n state.pairStart = false;\n state.escaped = (ch == '\\\\');\n stream.next();\n return null;\n },\n startState: function() {\n return {\n pair: false,\n pairStart: false,\n keyCol: 0,\n inlinePairs: 0,\n inlineList: 0,\n literal: false,\n escaped: false\n };\n },\n lineComment: \"#\",\n fold: \"indent\"\n };\n});\n\nCodeMirror.defineMIME(\"text/x-yaml\", \"yaml\");\nCodeMirror.defineMIME(\"text/yaml\", \"yaml\");\n\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vbm9kZV9tb2R1bGVzL2NvZGVtaXJyb3IvbW9kZS95YW1sL3lhbWwuanM/Y2VkMCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUVBO0FBQ0EsTUFBTSxJQUF1RDtBQUM3RCxRQUFRLG1CQUFPLENBQUMseUVBQXNCO0FBQ3RDLE9BQU8sRUFHYTtBQUNwQixDQUFDO0FBQ0Q7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsMkJBQTJCO0FBQzNCLE9BQU8sMEJBQTBCLHVCQUF1QjtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLGNBQWM7QUFDL0M7QUFDQSxrQ0FBa0MsY0FBYztBQUNoRDtBQUNBLHNDQUFzQyxlQUFlO0FBQ3JEO0FBQ0E7QUFDQSw0QkFBNEIsR0FBRztBQUMvQixvQkFBb0I7QUFDcEI7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLHNCQUFzQixlQUFlO0FBQ2xGO0FBQ0EsMERBQTBELHFCQUFxQjtBQUMvRTtBQUNBLDZFQUE2RSxpQkFBaUI7QUFDOUYsNkVBQTZFLE9BQU8saUJBQWlCO0FBQ3JHO0FBQ0EseUNBQXlDLGtCQUFrQjtBQUMzRDs7QUFFQTtBQUNBLHNEQUFzRCw2QkFBNkI7QUFDbkY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0Qsd0JBQXdCLGVBQWU7O0FBRXZGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBOztBQUVBLENBQUMiLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29kZW1pcnJvci9tb2RlL3lhbWwveWFtbC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvZGVNaXJyb3IsIGNvcHlyaWdodCAoYykgYnkgTWFyaWpuIEhhdmVyYmVrZSBhbmQgb3RoZXJzXG4vLyBEaXN0cmlidXRlZCB1bmRlciBhbiBNSVQgbGljZW5zZTogaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFXG5cbihmdW5jdGlvbihtb2QpIHtcbiAgaWYgKHR5cGVvZiBleHBvcnRzID09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG1vZHVsZSA9PSBcIm9iamVjdFwiKSAvLyBDb21tb25KU1xuICAgIG1vZChyZXF1aXJlKFwiLi4vLi4vbGliL2NvZGVtaXJyb3JcIikpO1xuICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSAvLyBBTURcbiAgICBkZWZpbmUoW1wiLi4vLi4vbGliL2NvZGVtaXJyb3JcIl0sIG1vZCk7XG4gIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnZcbiAgICBtb2QoQ29kZU1pcnJvcik7XG59KShmdW5jdGlvbihDb2RlTWlycm9yKSB7XG5cInVzZSBzdHJpY3RcIjtcblxuQ29kZU1pcnJvci5kZWZpbmVNb2RlKFwieWFtbFwiLCBmdW5jdGlvbigpIHtcblxuICB2YXIgY29ucyA9IFsndHJ1ZScsICdmYWxzZScsICdvbicsICdvZmYnLCAneWVzJywgJ25vJ107XG4gIHZhciBrZXl3b3JkUmVnZXggPSBuZXcgUmVnRXhwKFwiXFxcXGIoKFwiK2NvbnMuam9pbihcIil8KFwiKStcIikpJFwiLCAnaScpO1xuXG4gIHJldHVybiB7XG4gICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHtcbiAgICAgIHZhciBjaCA9IHN0cmVhbS5wZWVrKCk7XG4gICAgICB2YXIgZXNjID0gc3RhdGUuZXNjYXBlZDtcbiAgICAgIHN0YXRlLmVzY2FwZWQgPSBmYWxzZTtcbiAgICAgIC8qIGNvbW1lbnRzICovXG4gICAgICBpZiAoY2ggPT0gXCIjXCIgJiYgKHN0cmVhbS5wb3MgPT0gMCB8fCAvXFxzLy50ZXN0KHN0cmVhbS5zdHJpbmcuY2hhckF0KHN0cmVhbS5wb3MgLSAxKSkpKSB7XG4gICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTtcbiAgICAgICAgcmV0dXJuIFwiY29tbWVudFwiO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eKCcoW14nXXxcXFxcLikqJz98XCIoW15cIl18XFxcXC4pKlwiPykvKSlcbiAgICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XG5cbiAgICAgIGlmIChzdGF0ZS5saXRlcmFsICYmIHN0cmVhbS5pbmRlbnRhdGlvbigpID4gc3RhdGUua2V5Q29sKSB7XG4gICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsgcmV0dXJuIFwic3RyaW5nXCI7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlLmxpdGVyYWwpIHsgc3RhdGUubGl0ZXJhbCA9IGZhbHNlOyB9XG4gICAgICBpZiAoc3RyZWFtLnNvbCgpKSB7XG4gICAgICAgIHN0YXRlLmtleUNvbCA9IDA7XG4gICAgICAgIHN0YXRlLnBhaXIgPSBmYWxzZTtcbiAgICAgICAgc3RhdGUucGFpclN0YXJ0ID0gZmFsc2U7XG4gICAgICAgIC8qIGRvY3VtZW50IHN0YXJ0ICovXG4gICAgICAgIGlmKHN0cmVhbS5tYXRjaCgnLS0tJykpIHsgcmV0dXJuIFwiZGVmXCI7IH1cbiAgICAgICAgLyogZG9jdW1lbnQgZW5kICovXG4gICAgICAgIGlmIChzdHJlYW0ubWF0Y2goJy4uLicpKSB7IHJldHVybiBcImRlZlwiOyB9XG4gICAgICAgIC8qIGFycmF5IGxpc3QgaXRlbSAqL1xuICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9cXHMqLVxccysvKSkgeyByZXR1cm4gJ21ldGEnOyB9XG4gICAgICB9XG4gICAgICAvKiBpbmxpbmUgcGFpcnMvbGlzdHMgKi9cbiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14oXFx7fFxcfXxcXFt8XFxdKS8pKSB7XG4gICAgICAgIGlmIChjaCA9PSAneycpXG4gICAgICAgICAgc3RhdGUuaW5saW5lUGFpcnMrKztcbiAgICAgICAgZWxzZSBpZiAoY2ggPT0gJ30nKVxuICAgICAgICAgIHN0YXRlLmlubGluZVBhaXJzLS07XG4gICAgICAgIGVsc2UgaWYgKGNoID09ICdbJylcbiAgICAgICAgICBzdGF0ZS5pbmxpbmVMaXN0Kys7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICBzdGF0ZS5pbmxpbmVMaXN0LS07XG4gICAgICAgIHJldHVybiAnbWV0YSc7XG4gICAgICB9XG5cbiAgICAgIC8qIGxpc3Qgc2VwYXJhdG9yICovXG4gICAgICBpZiAoc3RhdGUuaW5saW5lTGlzdCA+IDAgJiYgIWVzYyAmJiBjaCA9PSAnLCcpIHtcbiAgICAgICAgc3RyZWFtLm5leHQoKTtcbiAgICAgICAgcmV0dXJuICdtZXRhJztcbiAgICAgIH1cbiAgICAgIC8qIHBhaXJzIHNlcGFyYXRvciAqL1xuICAgICAgaWYgKHN0YXRlLmlubGluZVBhaXJzID4gMCAmJiAhZXNjICYmIGNoID09ICcsJykge1xuICAgICAgICBzdGF0ZS5rZXlDb2wgPSAwO1xuICAgICAgICBzdGF0ZS5wYWlyID0gZmFsc2U7XG4gICAgICAgIHN0YXRlLnBhaXJTdGFydCA9IGZhbHNlO1xuICAgICAgICBzdHJlYW0ubmV4dCgpO1xuICAgICAgICByZXR1cm4gJ21ldGEnO1xuICAgICAgfVxuXG4gICAgICAvKiBzdGFydCBvZiB2YWx1ZSBvZiBhIHBhaXIgKi9cbiAgICAgIGlmIChzdGF0ZS5wYWlyU3RhcnQpIHtcbiAgICAgICAgLyogYmxvY2sgbGl0ZXJhbHMgKi9cbiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXlxccyooXFx8fFxcPilcXHMqLykpIHsgc3RhdGUubGl0ZXJhbCA9IHRydWU7IHJldHVybiAnbWV0YSc7IH07XG4gICAgICAgIC8qIHJlZmVyZW5jZXMgKi9cbiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXlxccyooXFwmfFxcKilbYS16MC05XFwuXy1dK1xcYi9pKSkgeyByZXR1cm4gJ3ZhcmlhYmxlLTInOyB9XG4gICAgICAgIC8qIG51bWJlcnMgKi9cbiAgICAgICAgaWYgKHN0YXRlLmlubGluZVBhaXJzID09IDAgJiYgc3RyZWFtLm1hdGNoKC9eXFxzKi0/WzAtOVxcLlxcLF0rXFxzPyQvKSkgeyByZXR1cm4gJ251bWJlcic7IH1cbiAgICAgICAgaWYgKHN0YXRlLmlubGluZVBhaXJzID4gMCAmJiBzdHJlYW0ubWF0Y2goL15cXHMqLT9bMC05XFwuXFwsXStcXHM/KD89KCx8fSkpLykpIHsgcmV0dXJuICdudW1iZXInOyB9XG4gICAgICAgIC8qIGtleXdvcmRzICovXG4gICAgICAgIGlmIChzdHJlYW0ubWF0Y2goa2V5d29yZFJlZ2V4KSkgeyByZXR1cm4gJ2tleXdvcmQnOyB9XG4gICAgICB9XG5cbiAgICAgIC8qIHBhaXJzIChhc3NvY2lhdGl2ZSBhcnJheXMpIC0+IGtleSAqL1xuICAgICAgaWYgKCFzdGF0ZS5wYWlyICYmIHN0cmVhbS5tYXRjaCgvXlxccyooPzpbLFxcW1xcXXt9JiohfD4nXCIlQGBdW15cXHMnXCI6XXxbXixcXFtcXF17fSMmKiF8PidcIiVAYF0pW14jXSo/KD89XFxzKjooJHxcXHMpKS8pKSB7XG4gICAgICAgIHN0YXRlLnBhaXIgPSB0cnVlO1xuICAgICAgICBzdGF0ZS5rZXlDb2wgPSBzdHJlYW0uaW5kZW50YXRpb24oKTtcbiAgICAgICAgcmV0dXJuIFwiYXRvbVwiO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXRlLnBhaXIgJiYgc3RyZWFtLm1hdGNoKC9eOlxccyovKSkgeyBzdGF0ZS5wYWlyU3RhcnQgPSB0cnVlOyByZXR1cm4gJ21ldGEnOyB9XG5cbiAgICAgIC8qIG5vdGhpbmcgZm91bmQsIGNvbnRpbnVlICovXG4gICAgICBzdGF0ZS5wYWlyU3RhcnQgPSBmYWxzZTtcbiAgICAgIHN0YXRlLmVzY2FwZWQgPSAoY2ggPT0gJ1xcXFwnKTtcbiAgICAgIHN0cmVhbS5uZXh0KCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGFpcjogZmFsc2UsXG4gICAgICAgIHBhaXJTdGFydDogZmFsc2UsXG4gICAgICAgIGtleUNvbDogMCxcbiAgICAgICAgaW5saW5lUGFpcnM6IDAsXG4gICAgICAgIGlubGluZUxpc3Q6IDAsXG4gICAgICAgIGxpdGVyYWw6IGZhbHNlLFxuICAgICAgICBlc2NhcGVkOiBmYWxzZVxuICAgICAgfTtcbiAgICB9LFxuICAgIGxpbmVDb21tZW50OiBcIiNcIixcbiAgICBmb2xkOiBcImluZGVudFwiXG4gIH07XG59KTtcblxuQ29kZU1pcnJvci5kZWZpbmVNSU1FKFwidGV4dC94LXlhbWxcIiwgXCJ5YW1sXCIpO1xuQ29kZU1pcnJvci5kZWZpbmVNSU1FKFwidGV4dC95YW1sXCIsIFwieWFtbFwiKTtcblxufSk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/codemirror/mode/yaml/yaml.js\n"); /***/ }), /***/ "./node_modules/core-js/es6/index.js": -/*!*******************************************!* +/*!*******************************************!*\ !*** ./node_modules/core-js/es6/index.js ***! \*******************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -303,7 +281,7 @@ eval("__webpack_require__(/*! ../modules/es6.symbol */ \"./node_modules/core-js/ /***/ }), /***/ "./node_modules/core-js/fn/array/flat-map.js": -/*!***************************************************!* +/*!***************************************************!*\ !*** ./node_modules/core-js/fn/array/flat-map.js ***! \***************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -313,7 +291,7 @@ eval("__webpack_require__(/*! ../../modules/es7.array.flat-map */ \"./node_modul /***/ }), /***/ "./node_modules/core-js/fn/array/includes.js": -/*!***************************************************!* +/*!***************************************************!*\ !*** ./node_modules/core-js/fn/array/includes.js ***! \***************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -323,7 +301,7 @@ eval("__webpack_require__(/*! ../../modules/es7.array.includes */ \"./node_modul /***/ }), /***/ "./node_modules/core-js/fn/object/entries.js": -/*!***************************************************!* +/*!***************************************************!*\ !*** ./node_modules/core-js/fn/object/entries.js ***! \***************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -333,7 +311,7 @@ eval("__webpack_require__(/*! ../../modules/es7.object.entries */ \"./node_modul /***/ }), /***/ "./node_modules/core-js/fn/object/get-own-property-descriptors.js": -/*!************************************************************************!* +/*!************************************************************************!*\ !*** ./node_modules/core-js/fn/object/get-own-property-descriptors.js ***! \************************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -343,7 +321,7 @@ eval("__webpack_require__(/*! ../../modules/es7.object.get-own-property-descript /***/ }), /***/ "./node_modules/core-js/fn/object/values.js": -/*!**************************************************!* +/*!**************************************************!*\ !*** ./node_modules/core-js/fn/object/values.js ***! \**************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -353,7 +331,7 @@ eval("__webpack_require__(/*! ../../modules/es7.object.values */ \"./node_module /***/ }), /***/ "./node_modules/core-js/fn/promise/finally.js": -/*!****************************************************!* +/*!****************************************************!*\ !*** ./node_modules/core-js/fn/promise/finally.js ***! \****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -364,7 +342,7 @@ eval("\n__webpack_require__(/*! ../../modules/es6.promise */ \"./node_modules/co /***/ }), /***/ "./node_modules/core-js/fn/string/pad-end.js": -/*!***************************************************!* +/*!***************************************************!*\ !*** ./node_modules/core-js/fn/string/pad-end.js ***! \***************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -374,7 +352,7 @@ eval("__webpack_require__(/*! ../../modules/es7.string.pad-end */ \"./node_modul /***/ }), /***/ "./node_modules/core-js/fn/string/pad-start.js": -/*!*****************************************************!* +/*!*****************************************************!*\ !*** ./node_modules/core-js/fn/string/pad-start.js ***! \*****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -384,7 +362,7 @@ eval("__webpack_require__(/*! ../../modules/es7.string.pad-start */ \"./node_mod /***/ }), /***/ "./node_modules/core-js/fn/string/trim-end.js": -/*!****************************************************!* +/*!****************************************************!*\ !*** ./node_modules/core-js/fn/string/trim-end.js ***! \****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -394,7 +372,7 @@ eval("__webpack_require__(/*! ../../modules/es7.string.trim-right */ \"./node_mo /***/ }), /***/ "./node_modules/core-js/fn/string/trim-start.js": -/*!******************************************************!* +/*!******************************************************!*\ !*** ./node_modules/core-js/fn/string/trim-start.js ***! \******************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -404,7 +382,7 @@ eval("__webpack_require__(/*! ../../modules/es7.string.trim-left */ \"./node_mod /***/ }), /***/ "./node_modules/core-js/fn/symbol/async-iterator.js": -/*!**********************************************************!* +/*!**********************************************************!*\ !*** ./node_modules/core-js/fn/symbol/async-iterator.js ***! \**********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -414,7 +392,7 @@ eval("__webpack_require__(/*! ../../modules/es7.symbol.async-iterator */ \"./nod /***/ }), /***/ "./node_modules/core-js/library/fn/global.js": -/*!***************************************************!* +/*!***************************************************!*\ !*** ./node_modules/core-js/library/fn/global.js ***! \***************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -424,7 +402,7 @@ eval("__webpack_require__(/*! ../modules/es7.global */ \"./node_modules/core-js/ /***/ }), /***/ "./node_modules/core-js/library/modules/_a-function.js": -/*!*************************************************************!* +/*!*************************************************************!*\ !*** ./node_modules/core-js/library/modules/_a-function.js ***! \*************************************************************/ /***/ ((module) => { @@ -434,7 +412,7 @@ eval("module.exports = function (it) {\n if (typeof it != 'function') throw Typ /***/ }), /***/ "./node_modules/core-js/library/modules/_an-object.js": -/*!************************************************************!* +/*!************************************************************!*\ !*** ./node_modules/core-js/library/modules/_an-object.js ***! \************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -444,7 +422,7 @@ eval("var isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/co /***/ }), /***/ "./node_modules/core-js/library/modules/_core.js": -/*!*******************************************************!* +/*!*******************************************************!*\ !*** ./node_modules/core-js/library/modules/_core.js ***! \*******************************************************/ /***/ ((module) => { @@ -454,7 +432,7 @@ eval("var core = module.exports = { version: '2.6.12' };\nif (typeof __e == 'num /***/ }), /***/ "./node_modules/core-js/library/modules/_ctx.js": -/*!******************************************************!* +/*!******************************************************!*\ !*** ./node_modules/core-js/library/modules/_ctx.js ***! \******************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -464,7 +442,7 @@ eval("// optional / simple context binding\nvar aFunction = __webpack_require__( /***/ }), /***/ "./node_modules/core-js/library/modules/_descriptors.js": -/*!**************************************************************!* +/*!**************************************************************!*\ !*** ./node_modules/core-js/library/modules/_descriptors.js ***! \**************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -474,7 +452,7 @@ eval("// Thank's IE8 for his funny defineProperty\nmodule.exports = !__webpack_r /***/ }), /***/ "./node_modules/core-js/library/modules/_dom-create.js": -/*!*************************************************************!* +/*!*************************************************************!*\ !*** ./node_modules/core-js/library/modules/_dom-create.js ***! \*************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -484,7 +462,7 @@ eval("var isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/co /***/ }), /***/ "./node_modules/core-js/library/modules/_export.js": -/*!*********************************************************!* +/*!*********************************************************!*\ !*** ./node_modules/core-js/library/modules/_export.js ***! \*********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -494,7 +472,7 @@ eval("var global = __webpack_require__(/*! ./_global */ \"./node_modules/core-js /***/ }), /***/ "./node_modules/core-js/library/modules/_fails.js": -/*!********************************************************!* +/*!********************************************************!*\ !*** ./node_modules/core-js/library/modules/_fails.js ***! \********************************************************/ /***/ ((module) => { @@ -504,7 +482,7 @@ eval("module.exports = function (exec) {\n try {\n return !!exec();\n } cat /***/ }), /***/ "./node_modules/core-js/library/modules/_global.js": -/*!*********************************************************!* +/*!*********************************************************!*\ !*** ./node_modules/core-js/library/modules/_global.js ***! \*********************************************************/ /***/ ((module) => { @@ -514,7 +492,7 @@ eval("// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nv /***/ }), /***/ "./node_modules/core-js/library/modules/_has.js": -/*!******************************************************!* +/*!******************************************************!*\ !*** ./node_modules/core-js/library/modules/_has.js ***! \******************************************************/ /***/ ((module) => { @@ -524,7 +502,7 @@ eval("var hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, ke /***/ }), /***/ "./node_modules/core-js/library/modules/_hide.js": -/*!*******************************************************!* +/*!*******************************************************!*\ !*** ./node_modules/core-js/library/modules/_hide.js ***! \*******************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -534,7 +512,7 @@ eval("var dP = __webpack_require__(/*! ./_object-dp */ \"./node_modules/core-js/ /***/ }), /***/ "./node_modules/core-js/library/modules/_ie8-dom-define.js": -/*!*****************************************************************!* +/*!*****************************************************************!*\ !*** ./node_modules/core-js/library/modules/_ie8-dom-define.js ***! \*****************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -544,7 +522,7 @@ eval("module.exports = !__webpack_require__(/*! ./_descriptors */ \"./node_modul /***/ }), /***/ "./node_modules/core-js/library/modules/_is-object.js": -/*!************************************************************!* +/*!************************************************************!*\ !*** ./node_modules/core-js/library/modules/_is-object.js ***! \************************************************************/ /***/ ((module) => { @@ -554,7 +532,7 @@ eval("module.exports = function (it) {\n return typeof it === 'object' ? it !== /***/ }), /***/ "./node_modules/core-js/library/modules/_object-dp.js": -/*!************************************************************!* +/*!************************************************************!*\ !*** ./node_modules/core-js/library/modules/_object-dp.js ***! \************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { @@ -564,7 +542,7 @@ eval("var anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/co /***/ }), /***/ "./node_modules/core-js/library/modules/_property-desc.js": -/*!****************************************************************!* +/*!****************************************************************!*\ !*** ./node_modules/core-js/library/modules/_property-desc.js ***! \****************************************************************/ /***/ ((module) => { @@ -574,7 +552,7 @@ eval("module.exports = function (bitmap, value) {\n return {\n enumerable: ! /***/ }), /***/ "./node_modules/core-js/library/modules/_to-primitive.js": -/*!***************************************************************!* +/*!***************************************************************!*\ !*** ./node_modules/core-js/library/modules/_to-primitive.js ***! \***************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -584,7 +562,7 @@ eval("// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = __webpack_re /***/ }), /***/ "./node_modules/core-js/library/modules/es7.global.js": -/*!************************************************************!* +/*!************************************************************!*\ !*** ./node_modules/core-js/library/modules/es7.global.js ***! \************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -594,7 +572,7 @@ eval("// https://github.com/tc39/proposal-global\nvar $export = __webpack_requir /***/ }), /***/ "./node_modules/core-js/modules/_a-function.js": -/*!*****************************************************!* +/*!*****************************************************!*\ !*** ./node_modules/core-js/modules/_a-function.js ***! \*****************************************************/ /***/ ((module) => { @@ -604,7 +582,7 @@ eval("module.exports = function (it) {\n if (typeof it != 'function') throw Typ /***/ }), /***/ "./node_modules/core-js/modules/_a-number-value.js": -/*!*********************************************************!* +/*!*********************************************************!*\ !*** ./node_modules/core-js/modules/_a-number-value.js ***! \*********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -614,7 +592,7 @@ eval("var cof = __webpack_require__(/*! ./_cof */ \"./node_modules/core-js/modul /***/ }), /***/ "./node_modules/core-js/modules/_add-to-unscopables.js": -/*!*************************************************************!* +/*!*************************************************************!*\ !*** ./node_modules/core-js/modules/_add-to-unscopables.js ***! \*************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -624,7 +602,7 @@ eval("// 22.1.3.31 Array.prototype[@@unscopables]\nvar UNSCOPABLES = __webpack_r /***/ }), /***/ "./node_modules/core-js/modules/_advance-string-index.js": -/*!***************************************************************!* +/*!***************************************************************!*\ !*** ./node_modules/core-js/modules/_advance-string-index.js ***! \***************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -635,7 +613,7 @@ eval("\nvar at = __webpack_require__(/*! ./_string-at */ \"./node_modules/core-j /***/ }), /***/ "./node_modules/core-js/modules/_an-instance.js": -/*!******************************************************!* +/*!******************************************************!*\ !*** ./node_modules/core-js/modules/_an-instance.js ***! \******************************************************/ /***/ ((module) => { @@ -645,7 +623,7 @@ eval("module.exports = function (it, Constructor, name, forbiddenField) {\n if /***/ }), /***/ "./node_modules/core-js/modules/_an-object.js": -/*!****************************************************!* +/*!****************************************************!*\ !*** ./node_modules/core-js/modules/_an-object.js ***! \****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -655,7 +633,7 @@ eval("var isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/co /***/ }), /***/ "./node_modules/core-js/modules/_array-copy-within.js": -/*!************************************************************!* +/*!************************************************************!*\ !*** ./node_modules/core-js/modules/_array-copy-within.js ***! \************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -666,7 +644,7 @@ eval("// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\n /***/ }), /***/ "./node_modules/core-js/modules/_array-fill.js": -/*!*****************************************************!* +/*!*****************************************************!*\ !*** ./node_modules/core-js/modules/_array-fill.js ***! \*****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -677,7 +655,7 @@ eval("// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\n\nv /***/ }), /***/ "./node_modules/core-js/modules/_array-includes.js": -/*!*********************************************************!* +/*!*********************************************************!*\ !*** ./node_modules/core-js/modules/_array-includes.js ***! \*********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -687,7 +665,7 @@ eval("// false -> Array#indexOf\n// true -> Array#includes\nvar toIObject = __w /***/ }), /***/ "./node_modules/core-js/modules/_array-methods.js": -/*!********************************************************!* +/*!********************************************************!*\ !*** ./node_modules/core-js/modules/_array-methods.js ***! \********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -697,7 +675,7 @@ eval("// 0 -> Array#forEach\n// 1 -> Array#map\n// 2 -> Array#filter\n// 3 -> Ar /***/ }), /***/ "./node_modules/core-js/modules/_array-reduce.js": -/*!*******************************************************!* +/*!*******************************************************!*\ !*** ./node_modules/core-js/modules/_array-reduce.js ***! \*******************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -707,7 +685,7 @@ eval("var aFunction = __webpack_require__(/*! ./_a-function */ \"./node_modules/ /***/ }), /***/ "./node_modules/core-js/modules/_array-species-constructor.js": -/*!********************************************************************!* +/*!********************************************************************!*\ !*** ./node_modules/core-js/modules/_array-species-constructor.js ***! \********************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -717,7 +695,7 @@ eval("var isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/co /***/ }), /***/ "./node_modules/core-js/modules/_array-species-create.js": -/*!***************************************************************!* +/*!***************************************************************!*\ !*** ./node_modules/core-js/modules/_array-species-create.js ***! \***************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -727,7 +705,7 @@ eval("// 9.4.2.3 ArraySpeciesCreate(originalArray, length)\nvar speciesConstruct /***/ }), /***/ "./node_modules/core-js/modules/_bind.js": -/*!***********************************************!* +/*!***********************************************!*\ !*** ./node_modules/core-js/modules/_bind.js ***! \***********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -738,7 +716,7 @@ eval("\nvar aFunction = __webpack_require__(/*! ./_a-function */ \"./node_module /***/ }), /***/ "./node_modules/core-js/modules/_classof.js": -/*!**************************************************!* +/*!**************************************************!*\ !*** ./node_modules/core-js/modules/_classof.js ***! \**************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -748,7 +726,7 @@ eval("// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = __webp /***/ }), /***/ "./node_modules/core-js/modules/_cof.js": -/*!**********************************************!* +/*!**********************************************!*\ !*** ./node_modules/core-js/modules/_cof.js ***! \**********************************************/ /***/ ((module) => { @@ -758,7 +736,7 @@ eval("var toString = {}.toString;\n\nmodule.exports = function (it) {\n return /***/ }), /***/ "./node_modules/core-js/modules/_collection-strong.js": -/*!************************************************************!* +/*!************************************************************!*\ !*** ./node_modules/core-js/modules/_collection-strong.js ***! \************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -769,7 +747,7 @@ eval("\nvar dP = __webpack_require__(/*! ./_object-dp */ \"./node_modules/core-j /***/ }), /***/ "./node_modules/core-js/modules/_collection-weak.js": -/*!**********************************************************!* +/*!**********************************************************!*\ !*** ./node_modules/core-js/modules/_collection-weak.js ***! \**********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -780,7 +758,7 @@ eval("\nvar redefineAll = __webpack_require__(/*! ./_redefine-all */ \"./node_mo /***/ }), /***/ "./node_modules/core-js/modules/_collection.js": -/*!*****************************************************!* +/*!*****************************************************!*\ !*** ./node_modules/core-js/modules/_collection.js ***! \*****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -791,7 +769,7 @@ eval("\nvar global = __webpack_require__(/*! ./_global */ \"./node_modules/core- /***/ }), /***/ "./node_modules/core-js/modules/_core.js": -/*!***********************************************!* +/*!***********************************************!*\ !*** ./node_modules/core-js/modules/_core.js ***! \***********************************************/ /***/ ((module) => { @@ -801,7 +779,7 @@ eval("var core = module.exports = { version: '2.6.12' };\nif (typeof __e == 'num /***/ }), /***/ "./node_modules/core-js/modules/_create-property.js": -/*!**********************************************************!* +/*!**********************************************************!*\ !*** ./node_modules/core-js/modules/_create-property.js ***! \**********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -812,7 +790,7 @@ eval("\nvar $defineProperty = __webpack_require__(/*! ./_object-dp */ \"./node_m /***/ }), /***/ "./node_modules/core-js/modules/_ctx.js": -/*!**********************************************!* +/*!**********************************************!*\ !*** ./node_modules/core-js/modules/_ctx.js ***! \**********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -822,7 +800,7 @@ eval("// optional / simple context binding\nvar aFunction = __webpack_require__( /***/ }), /***/ "./node_modules/core-js/modules/_date-to-iso-string.js": -/*!*************************************************************!* +/*!*************************************************************!*\ !*** ./node_modules/core-js/modules/_date-to-iso-string.js ***! \*************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -833,7 +811,7 @@ eval("\n// 20.3.4.36 / 15.9.5.43 Date.prototype.toISOString()\nvar fails = __web /***/ }), /***/ "./node_modules/core-js/modules/_date-to-primitive.js": -/*!************************************************************!* +/*!************************************************************!*\ !*** ./node_modules/core-js/modules/_date-to-primitive.js ***! \************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -844,7 +822,7 @@ eval("\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/ /***/ }), /***/ "./node_modules/core-js/modules/_defined.js": -/*!**************************************************!* +/*!**************************************************!*\ !*** ./node_modules/core-js/modules/_defined.js ***! \**************************************************/ /***/ ((module) => { @@ -854,7 +832,7 @@ eval("// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) /***/ }), /***/ "./node_modules/core-js/modules/_descriptors.js": -/*!******************************************************!* +/*!******************************************************!*\ !*** ./node_modules/core-js/modules/_descriptors.js ***! \******************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -864,7 +842,7 @@ eval("// Thank's IE8 for his funny defineProperty\nmodule.exports = !__webpack_r /***/ }), /***/ "./node_modules/core-js/modules/_dom-create.js": -/*!*****************************************************!* +/*!*****************************************************!*\ !*** ./node_modules/core-js/modules/_dom-create.js ***! \*****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -874,7 +852,7 @@ eval("var isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/co /***/ }), /***/ "./node_modules/core-js/modules/_enum-bug-keys.js": -/*!********************************************************!* +/*!********************************************************!*\ !*** ./node_modules/core-js/modules/_enum-bug-keys.js ***! \********************************************************/ /***/ ((module) => { @@ -884,7 +862,7 @@ eval("// IE 8- don't enum bug keys\nmodule.exports = (\n 'constructor,hasOwnPro /***/ }), /***/ "./node_modules/core-js/modules/_enum-keys.js": -/*!****************************************************!* +/*!****************************************************!*\ !*** ./node_modules/core-js/modules/_enum-keys.js ***! \****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -894,7 +872,7 @@ eval("// all enumerable object keys, includes symbols\nvar getKeys = __webpack_r /***/ }), /***/ "./node_modules/core-js/modules/_export.js": -/*!*************************************************!* +/*!*************************************************!*\ !*** ./node_modules/core-js/modules/_export.js ***! \*************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -904,7 +882,7 @@ eval("var global = __webpack_require__(/*! ./_global */ \"./node_modules/core-js /***/ }), /***/ "./node_modules/core-js/modules/_fails-is-regexp.js": -/*!**********************************************************!* +/*!**********************************************************!*\ !*** ./node_modules/core-js/modules/_fails-is-regexp.js ***! \**********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -914,7 +892,7 @@ eval("var MATCH = __webpack_require__(/*! ./_wks */ \"./node_modules/core-js/mod /***/ }), /***/ "./node_modules/core-js/modules/_fails.js": -/*!************************************************!* +/*!************************************************!*\ !*** ./node_modules/core-js/modules/_fails.js ***! \************************************************/ /***/ ((module) => { @@ -924,7 +902,7 @@ eval("module.exports = function (exec) {\n try {\n return !!exec();\n } cat /***/ }), /***/ "./node_modules/core-js/modules/_fix-re-wks.js": -/*!*****************************************************!* +/*!*****************************************************!*\ !*** ./node_modules/core-js/modules/_fix-re-wks.js ***! \*****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -935,7 +913,7 @@ eval("\n__webpack_require__(/*! ./es6.regexp.exec */ \"./node_modules/core-js/mo /***/ }), /***/ "./node_modules/core-js/modules/_flags.js": -/*!************************************************!* +/*!************************************************!*\ !*** ./node_modules/core-js/modules/_flags.js ***! \************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -946,7 +924,7 @@ eval("\n// 21.2.5.3 get RegExp.prototype.flags\nvar anObject = __webpack_require /***/ }), /***/ "./node_modules/core-js/modules/_flatten-into-array.js": -/*!*************************************************************!* +/*!*************************************************************!*\ !*** ./node_modules/core-js/modules/_flatten-into-array.js ***! \*************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -957,7 +935,7 @@ eval("\n// https://tc39.github.io/proposal-flatMap/#sec-FlattenIntoArray\nvar is /***/ }), /***/ "./node_modules/core-js/modules/_for-of.js": -/*!*************************************************!* +/*!*************************************************!*\ !*** ./node_modules/core-js/modules/_for-of.js ***! \*************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -967,7 +945,7 @@ eval("var ctx = __webpack_require__(/*! ./_ctx */ \"./node_modules/core-js/modul /***/ }), /***/ "./node_modules/core-js/modules/_function-to-string.js": -/*!*************************************************************!* +/*!*************************************************************!*\ !*** ./node_modules/core-js/modules/_function-to-string.js ***! \*************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -977,7 +955,7 @@ eval("module.exports = __webpack_require__(/*! ./_shared */ \"./node_modules/cor /***/ }), /***/ "./node_modules/core-js/modules/_global.js": -/*!*************************************************!* +/*!*************************************************!*\ !*** ./node_modules/core-js/modules/_global.js ***! \*************************************************/ /***/ ((module) => { @@ -987,7 +965,7 @@ eval("// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nv /***/ }), /***/ "./node_modules/core-js/modules/_has.js": -/*!**********************************************!* +/*!**********************************************!*\ !*** ./node_modules/core-js/modules/_has.js ***! \**********************************************/ /***/ ((module) => { @@ -997,7 +975,7 @@ eval("var hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, ke /***/ }), /***/ "./node_modules/core-js/modules/_hide.js": -/*!***********************************************!* +/*!***********************************************!*\ !*** ./node_modules/core-js/modules/_hide.js ***! \***********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1007,7 +985,7 @@ eval("var dP = __webpack_require__(/*! ./_object-dp */ \"./node_modules/core-js/ /***/ }), /***/ "./node_modules/core-js/modules/_html.js": -/*!***********************************************!* +/*!***********************************************!*\ !*** ./node_modules/core-js/modules/_html.js ***! \***********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1017,7 +995,7 @@ eval("var document = __webpack_require__(/*! ./_global */ \"./node_modules/core- /***/ }), /***/ "./node_modules/core-js/modules/_ie8-dom-define.js": -/*!*********************************************************!* +/*!*********************************************************!*\ !*** ./node_modules/core-js/modules/_ie8-dom-define.js ***! \*********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1027,7 +1005,7 @@ eval("module.exports = !__webpack_require__(/*! ./_descriptors */ \"./node_modul /***/ }), /***/ "./node_modules/core-js/modules/_inherit-if-required.js": -/*!**************************************************************!* +/*!**************************************************************!*\ !*** ./node_modules/core-js/modules/_inherit-if-required.js ***! \**************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1037,7 +1015,7 @@ eval("var isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/co /***/ }), /***/ "./node_modules/core-js/modules/_invoke.js": -/*!*************************************************!* +/*!*************************************************!*\ !*** ./node_modules/core-js/modules/_invoke.js ***! \*************************************************/ /***/ ((module) => { @@ -1047,7 +1025,7 @@ eval("// fast apply, http://jsperf.lnkit.com/fast-apply/5\nmodule.exports = func /***/ }), /***/ "./node_modules/core-js/modules/_iobject.js": -/*!**************************************************!* +/*!**************************************************!*\ !*** ./node_modules/core-js/modules/_iobject.js ***! \**************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1057,7 +1035,7 @@ eval("// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar /***/ }), /***/ "./node_modules/core-js/modules/_is-array-iter.js": -/*!********************************************************!* +/*!********************************************************!*\ !*** ./node_modules/core-js/modules/_is-array-iter.js ***! \********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1067,7 +1045,7 @@ eval("// check on default Array iterator\nvar Iterators = __webpack_require__(/* /***/ }), /***/ "./node_modules/core-js/modules/_is-array.js": -/*!***************************************************!* +/*!***************************************************!*\ !*** ./node_modules/core-js/modules/_is-array.js ***! \***************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1077,7 +1055,7 @@ eval("// 7.2.2 IsArray(argument)\nvar cof = __webpack_require__(/*! ./_cof */ \" /***/ }), /***/ "./node_modules/core-js/modules/_is-integer.js": -/*!*****************************************************!* +/*!*****************************************************!*\ !*** ./node_modules/core-js/modules/_is-integer.js ***! \*****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1087,7 +1065,7 @@ eval("// 20.1.2.3 Number.isInteger(number)\nvar isObject = __webpack_require__(/ /***/ }), /***/ "./node_modules/core-js/modules/_is-object.js": -/*!****************************************************!* +/*!****************************************************!*\ !*** ./node_modules/core-js/modules/_is-object.js ***! \****************************************************/ /***/ ((module) => { @@ -1097,7 +1075,7 @@ eval("module.exports = function (it) {\n return typeof it === 'object' ? it !== /***/ }), /***/ "./node_modules/core-js/modules/_is-regexp.js": -/*!****************************************************!* +/*!****************************************************!*\ !*** ./node_modules/core-js/modules/_is-regexp.js ***! \****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1107,7 +1085,7 @@ eval("// 7.2.8 IsRegExp(argument)\nvar isObject = __webpack_require__(/*! ./_is- /***/ }), /***/ "./node_modules/core-js/modules/_iter-call.js": -/*!****************************************************!* +/*!****************************************************!*\ !*** ./node_modules/core-js/modules/_iter-call.js ***! \****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1117,7 +1095,7 @@ eval("// call something on iterator step with safe closing on error\nvar anObjec /***/ }), /***/ "./node_modules/core-js/modules/_iter-create.js": -/*!******************************************************!* +/*!******************************************************!*\ !*** ./node_modules/core-js/modules/_iter-create.js ***! \******************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1128,7 +1106,7 @@ eval("\nvar create = __webpack_require__(/*! ./_object-create */ \"./node_module /***/ }), /***/ "./node_modules/core-js/modules/_iter-define.js": -/*!******************************************************!* +/*!******************************************************!*\ !*** ./node_modules/core-js/modules/_iter-define.js ***! \******************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1139,7 +1117,7 @@ eval("\nvar LIBRARY = __webpack_require__(/*! ./_library */ \"./node_modules/cor /***/ }), /***/ "./node_modules/core-js/modules/_iter-detect.js": -/*!******************************************************!* +/*!******************************************************!*\ !*** ./node_modules/core-js/modules/_iter-detect.js ***! \******************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1149,7 +1127,7 @@ eval("var ITERATOR = __webpack_require__(/*! ./_wks */ \"./node_modules/core-js/ /***/ }), /***/ "./node_modules/core-js/modules/_iter-step.js": -/*!****************************************************!* +/*!****************************************************!*\ !*** ./node_modules/core-js/modules/_iter-step.js ***! \****************************************************/ /***/ ((module) => { @@ -1159,7 +1137,7 @@ eval("module.exports = function (done, value) {\n return { value: value, done: /***/ }), /***/ "./node_modules/core-js/modules/_iterators.js": -/*!****************************************************!* +/*!****************************************************!*\ !*** ./node_modules/core-js/modules/_iterators.js ***! \****************************************************/ /***/ ((module) => { @@ -1169,7 +1147,7 @@ eval("module.exports = {};\n//# sourceURL=[module]\n//# sourceMappingURL=data:ap /***/ }), /***/ "./node_modules/core-js/modules/_library.js": -/*!**************************************************!* +/*!**************************************************!*\ !*** ./node_modules/core-js/modules/_library.js ***! \**************************************************/ /***/ ((module) => { @@ -1179,7 +1157,7 @@ eval("module.exports = false;\n//# sourceURL=[module]\n//# sourceMappingURL=data /***/ }), /***/ "./node_modules/core-js/modules/_math-expm1.js": -/*!*****************************************************!* +/*!*****************************************************!*\ !*** ./node_modules/core-js/modules/_math-expm1.js ***! \*****************************************************/ /***/ ((module) => { @@ -1189,7 +1167,7 @@ eval("// 20.2.2.14 Math.expm1(x)\nvar $expm1 = Math.expm1;\nmodule.exports = (!$ /***/ }), /***/ "./node_modules/core-js/modules/_math-fround.js": -/*!******************************************************!* +/*!******************************************************!*\ !*** ./node_modules/core-js/modules/_math-fround.js ***! \******************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1199,7 +1177,7 @@ eval("// 20.2.2.16 Math.fround(x)\nvar sign = __webpack_require__(/*! ./_math-si /***/ }), /***/ "./node_modules/core-js/modules/_math-log1p.js": -/*!*****************************************************!* +/*!*****************************************************!*\ !*** ./node_modules/core-js/modules/_math-log1p.js ***! \*****************************************************/ /***/ ((module) => { @@ -1209,7 +1187,7 @@ eval("// 20.2.2.20 Math.log1p(x)\nmodule.exports = Math.log1p || function log1p( /***/ }), /***/ "./node_modules/core-js/modules/_math-sign.js": -/*!****************************************************!* +/*!****************************************************!*\ !*** ./node_modules/core-js/modules/_math-sign.js ***! \****************************************************/ /***/ ((module) => { @@ -1219,7 +1197,7 @@ eval("// 20.2.2.28 Math.sign(x)\nmodule.exports = Math.sign || function sign(x) /***/ }), /***/ "./node_modules/core-js/modules/_meta.js": -/*!***********************************************!* +/*!***********************************************!*\ !*** ./node_modules/core-js/modules/_meta.js ***! \***********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1229,7 +1207,7 @@ eval("var META = __webpack_require__(/*! ./_uid */ \"./node_modules/core-js/modu /***/ }), /***/ "./node_modules/core-js/modules/_microtask.js": -/*!****************************************************!* +/*!****************************************************!*\ !*** ./node_modules/core-js/modules/_microtask.js ***! \****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1239,7 +1217,7 @@ eval("var global = __webpack_require__(/*! ./_global */ \"./node_modules/core-js /***/ }), /***/ "./node_modules/core-js/modules/_new-promise-capability.js": -/*!*****************************************************************!* +/*!*****************************************************************!*\ !*** ./node_modules/core-js/modules/_new-promise-capability.js ***! \*****************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1250,7 +1228,7 @@ eval("\n// 25.4.1.5 NewPromiseCapability(C)\nvar aFunction = __webpack_require__ /***/ }), /***/ "./node_modules/core-js/modules/_object-assign.js": -/*!********************************************************!* +/*!********************************************************!*\ !*** ./node_modules/core-js/modules/_object-assign.js ***! \********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1261,7 +1239,7 @@ eval("\n// 19.1.2.1 Object.assign(target, source, ...)\nvar DESCRIPTORS = __webp /***/ }), /***/ "./node_modules/core-js/modules/_object-create.js": -/*!********************************************************!* +/*!********************************************************!*\ !*** ./node_modules/core-js/modules/_object-create.js ***! \********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1271,7 +1249,7 @@ eval("// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = __w /***/ }), /***/ "./node_modules/core-js/modules/_object-dp.js": -/*!****************************************************!* +/*!****************************************************!*\ !*** ./node_modules/core-js/modules/_object-dp.js ***! \****************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { @@ -1281,7 +1259,7 @@ eval("var anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/co /***/ }), /***/ "./node_modules/core-js/modules/_object-dps.js": -/*!*****************************************************!* +/*!*****************************************************!*\ !*** ./node_modules/core-js/modules/_object-dps.js ***! \*****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1291,7 +1269,7 @@ eval("var dP = __webpack_require__(/*! ./_object-dp */ \"./node_modules/core-js/ /***/ }), /***/ "./node_modules/core-js/modules/_object-gopd.js": -/*!******************************************************!* +/*!******************************************************!*\ !*** ./node_modules/core-js/modules/_object-gopd.js ***! \******************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { @@ -1301,7 +1279,7 @@ eval("var pIE = __webpack_require__(/*! ./_object-pie */ \"./node_modules/core-j /***/ }), /***/ "./node_modules/core-js/modules/_object-gopn-ext.js": -/*!**********************************************************!* +/*!**********************************************************!*\ !*** ./node_modules/core-js/modules/_object-gopn-ext.js ***! \**********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1311,7 +1289,7 @@ eval("// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and wind /***/ }), /***/ "./node_modules/core-js/modules/_object-gopn.js": -/*!******************************************************!* +/*!******************************************************!*\ !*** ./node_modules/core-js/modules/_object-gopn.js ***! \******************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { @@ -1321,7 +1299,7 @@ eval("// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar $keys = __webpac /***/ }), /***/ "./node_modules/core-js/modules/_object-gops.js": -/*!******************************************************!* +/*!******************************************************!*\ !*** ./node_modules/core-js/modules/_object-gops.js ***! \******************************************************/ /***/ ((__unused_webpack_module, exports) => { @@ -1331,7 +1309,7 @@ eval("exports.f = Object.getOwnPropertySymbols;\n//# sourceURL=[module]\n//# sou /***/ }), /***/ "./node_modules/core-js/modules/_object-gpo.js": -/*!*****************************************************!* +/*!*****************************************************!*\ !*** ./node_modules/core-js/modules/_object-gpo.js ***! \*****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1341,7 +1319,7 @@ eval("// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has = __webpack_requi /***/ }), /***/ "./node_modules/core-js/modules/_object-keys-internal.js": -/*!***************************************************************!* +/*!***************************************************************!*\ !*** ./node_modules/core-js/modules/_object-keys-internal.js ***! \***************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1351,7 +1329,7 @@ eval("var has = __webpack_require__(/*! ./_has */ \"./node_modules/core-js/modul /***/ }), /***/ "./node_modules/core-js/modules/_object-keys.js": -/*!******************************************************!* +/*!******************************************************!*\ !*** ./node_modules/core-js/modules/_object-keys.js ***! \******************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1361,7 +1339,7 @@ eval("// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = __webpack_require__(/ /***/ }), /***/ "./node_modules/core-js/modules/_object-pie.js": -/*!*****************************************************!* +/*!*****************************************************!*\ !*** ./node_modules/core-js/modules/_object-pie.js ***! \*****************************************************/ /***/ ((__unused_webpack_module, exports) => { @@ -1371,7 +1349,7 @@ eval("exports.f = {}.propertyIsEnumerable;\n//# sourceURL=[module]\n//# sourceMa /***/ }), /***/ "./node_modules/core-js/modules/_object-sap.js": -/*!*****************************************************!* +/*!*****************************************************!*\ !*** ./node_modules/core-js/modules/_object-sap.js ***! \*****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1381,7 +1359,7 @@ eval("// most Object methods by ES6 should accept primitives\nvar $export = __we /***/ }), /***/ "./node_modules/core-js/modules/_object-to-array.js": -/*!**********************************************************!* +/*!**********************************************************!*\ !*** ./node_modules/core-js/modules/_object-to-array.js ***! \**********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1391,7 +1369,7 @@ eval("var DESCRIPTORS = __webpack_require__(/*! ./_descriptors */ \"./node_modul /***/ }), /***/ "./node_modules/core-js/modules/_own-keys.js": -/*!***************************************************!* +/*!***************************************************!*\ !*** ./node_modules/core-js/modules/_own-keys.js ***! \***************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1401,7 +1379,7 @@ eval("// all object keys, includes non-enumerable and symbols\nvar gOPN = __webp /***/ }), /***/ "./node_modules/core-js/modules/_parse-float.js": -/*!******************************************************!* +/*!******************************************************!*\ !*** ./node_modules/core-js/modules/_parse-float.js ***! \******************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1411,7 +1389,7 @@ eval("var $parseFloat = __webpack_require__(/*! ./_global */ \"./node_modules/co /***/ }), /***/ "./node_modules/core-js/modules/_parse-int.js": -/*!****************************************************!* +/*!****************************************************!*\ !*** ./node_modules/core-js/modules/_parse-int.js ***! \****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1421,7 +1399,7 @@ eval("var $parseInt = __webpack_require__(/*! ./_global */ \"./node_modules/core /***/ }), /***/ "./node_modules/core-js/modules/_perform.js": -/*!**************************************************!* +/*!**************************************************!*\ !*** ./node_modules/core-js/modules/_perform.js ***! \**************************************************/ /***/ ((module) => { @@ -1431,7 +1409,7 @@ eval("module.exports = function (exec) {\n try {\n return { e: false, v: exe /***/ }), /***/ "./node_modules/core-js/modules/_promise-resolve.js": -/*!**********************************************************!* +/*!**********************************************************!*\ !*** ./node_modules/core-js/modules/_promise-resolve.js ***! \**********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1441,7 +1419,7 @@ eval("var anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/co /***/ }), /***/ "./node_modules/core-js/modules/_property-desc.js": -/*!********************************************************!* +/*!********************************************************!*\ !*** ./node_modules/core-js/modules/_property-desc.js ***! \********************************************************/ /***/ ((module) => { @@ -1451,7 +1429,7 @@ eval("module.exports = function (bitmap, value) {\n return {\n enumerable: ! /***/ }), /***/ "./node_modules/core-js/modules/_redefine-all.js": -/*!*******************************************************!* +/*!*******************************************************!*\ !*** ./node_modules/core-js/modules/_redefine-all.js ***! \*******************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1461,7 +1439,7 @@ eval("var redefine = __webpack_require__(/*! ./_redefine */ \"./node_modules/cor /***/ }), /***/ "./node_modules/core-js/modules/_redefine.js": -/*!***************************************************!* +/*!***************************************************!*\ !*** ./node_modules/core-js/modules/_redefine.js ***! \***************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1471,7 +1449,7 @@ eval("var global = __webpack_require__(/*! ./_global */ \"./node_modules/core-js /***/ }), /***/ "./node_modules/core-js/modules/_regexp-exec-abstract.js": -/*!***************************************************************!* +/*!***************************************************************!*\ !*** ./node_modules/core-js/modules/_regexp-exec-abstract.js ***! \***************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1482,7 +1460,7 @@ eval("\n\nvar classof = __webpack_require__(/*! ./_classof */ \"./node_modules/c /***/ }), /***/ "./node_modules/core-js/modules/_regexp-exec.js": -/*!******************************************************!* +/*!******************************************************!*\ !*** ./node_modules/core-js/modules/_regexp-exec.js ***! \******************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1493,7 +1471,7 @@ eval("\n\nvar regexpFlags = __webpack_require__(/*! ./_flags */ \"./node_modules /***/ }), /***/ "./node_modules/core-js/modules/_same-value.js": -/*!*****************************************************!* +/*!*****************************************************!*\ !*** ./node_modules/core-js/modules/_same-value.js ***! \*****************************************************/ /***/ ((module) => { @@ -1503,7 +1481,7 @@ eval("// 7.2.9 SameValue(x, y)\nmodule.exports = Object.is || function is(x, y) /***/ }), /***/ "./node_modules/core-js/modules/_set-proto.js": -/*!****************************************************!* +/*!****************************************************!*\ !*** ./node_modules/core-js/modules/_set-proto.js ***! \****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1513,7 +1491,7 @@ eval("// Works with __proto__ only. Old v8 can't work with null proto objects.\n /***/ }), /***/ "./node_modules/core-js/modules/_set-species.js": -/*!******************************************************!* +/*!******************************************************!*\ !*** ./node_modules/core-js/modules/_set-species.js ***! \******************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1524,7 +1502,7 @@ eval("\nvar global = __webpack_require__(/*! ./_global */ \"./node_modules/core- /***/ }), /***/ "./node_modules/core-js/modules/_set-to-string-tag.js": -/*!************************************************************!* +/*!************************************************************!*\ !*** ./node_modules/core-js/modules/_set-to-string-tag.js ***! \************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1534,7 +1512,7 @@ eval("var def = __webpack_require__(/*! ./_object-dp */ \"./node_modules/core-js /***/ }), /***/ "./node_modules/core-js/modules/_shared-key.js": -/*!*****************************************************!* +/*!*****************************************************!*\ !*** ./node_modules/core-js/modules/_shared-key.js ***! \*****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1544,7 +1522,7 @@ eval("var shared = __webpack_require__(/*! ./_shared */ \"./node_modules/core-js /***/ }), /***/ "./node_modules/core-js/modules/_shared.js": -/*!*************************************************!* +/*!*************************************************!*\ !*** ./node_modules/core-js/modules/_shared.js ***! \*************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1554,7 +1532,7 @@ eval("var core = __webpack_require__(/*! ./_core */ \"./node_modules/core-js/mod /***/ }), /***/ "./node_modules/core-js/modules/_species-constructor.js": -/*!**************************************************************!* +/*!**************************************************************!*\ !*** ./node_modules/core-js/modules/_species-constructor.js ***! \**************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1564,7 +1542,7 @@ eval("// 7.3.20 SpeciesConstructor(O, defaultConstructor)\nvar anObject = __webp /***/ }), /***/ "./node_modules/core-js/modules/_strict-method.js": -/*!********************************************************!* +/*!********************************************************!*\ !*** ./node_modules/core-js/modules/_strict-method.js ***! \********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1575,7 +1553,7 @@ eval("\nvar fails = __webpack_require__(/*! ./_fails */ \"./node_modules/core-js /***/ }), /***/ "./node_modules/core-js/modules/_string-at.js": -/*!****************************************************!* +/*!****************************************************!*\ !*** ./node_modules/core-js/modules/_string-at.js ***! \****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1585,7 +1563,7 @@ eval("var toInteger = __webpack_require__(/*! ./_to-integer */ \"./node_modules/ /***/ }), /***/ "./node_modules/core-js/modules/_string-context.js": -/*!*********************************************************!* +/*!*********************************************************!*\ !*** ./node_modules/core-js/modules/_string-context.js ***! \*********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1595,7 +1573,7 @@ eval("// helper for String#{startsWith, endsWith, includes}\nvar isRegExp = __we /***/ }), /***/ "./node_modules/core-js/modules/_string-html.js": -/*!******************************************************!* +/*!******************************************************!*\ !*** ./node_modules/core-js/modules/_string-html.js ***! \******************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1605,7 +1583,7 @@ eval("var $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-j /***/ }), /***/ "./node_modules/core-js/modules/_string-pad.js": -/*!*****************************************************!* +/*!*****************************************************!*\ !*** ./node_modules/core-js/modules/_string-pad.js ***! \*****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1615,7 +1593,7 @@ eval("// https://github.com/tc39/proposal-string-pad-start-end\nvar toLength = _ /***/ }), /***/ "./node_modules/core-js/modules/_string-repeat.js": -/*!********************************************************!* +/*!********************************************************!*\ !*** ./node_modules/core-js/modules/_string-repeat.js ***! \********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1626,7 +1604,7 @@ eval("\nvar toInteger = __webpack_require__(/*! ./_to-integer */ \"./node_module /***/ }), /***/ "./node_modules/core-js/modules/_string-trim.js": -/*!******************************************************!* +/*!******************************************************!*\ !*** ./node_modules/core-js/modules/_string-trim.js ***! \******************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1636,7 +1614,7 @@ eval("var $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-j /***/ }), /***/ "./node_modules/core-js/modules/_string-ws.js": -/*!****************************************************!* +/*!****************************************************!*\ !*** ./node_modules/core-js/modules/_string-ws.js ***! \****************************************************/ /***/ ((module) => { @@ -1646,7 +1624,7 @@ eval("module.exports = '\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000 /***/ }), /***/ "./node_modules/core-js/modules/_task.js": -/*!***********************************************!* +/*!***********************************************!*\ !*** ./node_modules/core-js/modules/_task.js ***! \***********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1656,7 +1634,7 @@ eval("var ctx = __webpack_require__(/*! ./_ctx */ \"./node_modules/core-js/modul /***/ }), /***/ "./node_modules/core-js/modules/_to-absolute-index.js": -/*!************************************************************!* +/*!************************************************************!*\ !*** ./node_modules/core-js/modules/_to-absolute-index.js ***! \************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1666,7 +1644,7 @@ eval("var toInteger = __webpack_require__(/*! ./_to-integer */ \"./node_modules/ /***/ }), /***/ "./node_modules/core-js/modules/_to-index.js": -/*!***************************************************!* +/*!***************************************************!*\ !*** ./node_modules/core-js/modules/_to-index.js ***! \***************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1676,7 +1654,7 @@ eval("// https://tc39.github.io/ecma262/#sec-toindex\nvar toInteger = __webpack_ /***/ }), /***/ "./node_modules/core-js/modules/_to-integer.js": -/*!*****************************************************!* +/*!*****************************************************!*\ !*** ./node_modules/core-js/modules/_to-integer.js ***! \*****************************************************/ /***/ ((module) => { @@ -1686,7 +1664,7 @@ eval("// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule /***/ }), /***/ "./node_modules/core-js/modules/_to-iobject.js": -/*!*****************************************************!* +/*!*****************************************************!*\ !*** ./node_modules/core-js/modules/_to-iobject.js ***! \*****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1696,7 +1674,7 @@ eval("// to indexed object, toObject with fallback for non-array-like ES3 string /***/ }), /***/ "./node_modules/core-js/modules/_to-length.js": -/*!****************************************************!* +/*!****************************************************!*\ !*** ./node_modules/core-js/modules/_to-length.js ***! \****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1706,7 +1684,7 @@ eval("// 7.1.15 ToLength\nvar toInteger = __webpack_require__(/*! ./_to-integer /***/ }), /***/ "./node_modules/core-js/modules/_to-object.js": -/*!****************************************************!* +/*!****************************************************!*\ !*** ./node_modules/core-js/modules/_to-object.js ***! \****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1716,7 +1694,7 @@ eval("// 7.1.13 ToObject(argument)\nvar defined = __webpack_require__(/*! ./_def /***/ }), /***/ "./node_modules/core-js/modules/_to-primitive.js": -/*!*******************************************************!* +/*!*******************************************************!*\ !*** ./node_modules/core-js/modules/_to-primitive.js ***! \*******************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1726,7 +1704,7 @@ eval("// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = __webpack_re /***/ }), /***/ "./node_modules/core-js/modules/_typed-array.js": -/*!******************************************************!* +/*!******************************************************!*\ !*** ./node_modules/core-js/modules/_typed-array.js ***! \******************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1737,7 +1715,7 @@ eval("\nif (__webpack_require__(/*! ./_descriptors */ \"./node_modules/core-js/m /***/ }), /***/ "./node_modules/core-js/modules/_typed-buffer.js": -/*!*******************************************************!* +/*!*******************************************************!*\ !*** ./node_modules/core-js/modules/_typed-buffer.js ***! \*******************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { @@ -1748,7 +1726,7 @@ eval("\nvar global = __webpack_require__(/*! ./_global */ \"./node_modules/core- /***/ }), /***/ "./node_modules/core-js/modules/_typed.js": -/*!************************************************!* +/*!************************************************!*\ !*** ./node_modules/core-js/modules/_typed.js ***! \************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1758,7 +1736,7 @@ eval("var global = __webpack_require__(/*! ./_global */ \"./node_modules/core-js /***/ }), /***/ "./node_modules/core-js/modules/_uid.js": -/*!**********************************************!* +/*!**********************************************!*\ !*** ./node_modules/core-js/modules/_uid.js ***! \**********************************************/ /***/ ((module) => { @@ -1768,7 +1746,7 @@ eval("var id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n /***/ }), /***/ "./node_modules/core-js/modules/_user-agent.js": -/*!*****************************************************!* +/*!*****************************************************!*\ !*** ./node_modules/core-js/modules/_user-agent.js ***! \*****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1778,7 +1756,7 @@ eval("var global = __webpack_require__(/*! ./_global */ \"./node_modules/core-js /***/ }), /***/ "./node_modules/core-js/modules/_validate-collection.js": -/*!**************************************************************!* +/*!**************************************************************!*\ !*** ./node_modules/core-js/modules/_validate-collection.js ***! \**************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1788,7 +1766,7 @@ eval("var isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/co /***/ }), /***/ "./node_modules/core-js/modules/_wks-define.js": -/*!*****************************************************!* +/*!*****************************************************!*\ !*** ./node_modules/core-js/modules/_wks-define.js ***! \*****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1798,7 +1776,7 @@ eval("var global = __webpack_require__(/*! ./_global */ \"./node_modules/core-js /***/ }), /***/ "./node_modules/core-js/modules/_wks-ext.js": -/*!**************************************************!* +/*!**************************************************!*\ !*** ./node_modules/core-js/modules/_wks-ext.js ***! \**************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { @@ -1808,7 +1786,7 @@ eval("exports.f = __webpack_require__(/*! ./_wks */ \"./node_modules/core-js/mod /***/ }), /***/ "./node_modules/core-js/modules/_wks.js": -/*!**********************************************!* +/*!**********************************************!*\ !*** ./node_modules/core-js/modules/_wks.js ***! \**********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1818,7 +1796,7 @@ eval("var store = __webpack_require__(/*! ./_shared */ \"./node_modules/core-js/ /***/ }), /***/ "./node_modules/core-js/modules/core.get-iterator-method.js": -/*!******************************************************************!* +/*!******************************************************************!*\ !*** ./node_modules/core-js/modules/core.get-iterator-method.js ***! \******************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1828,7 +1806,7 @@ eval("var classof = __webpack_require__(/*! ./_classof */ \"./node_modules/core- /***/ }), /***/ "./node_modules/core-js/modules/es6.array.copy-within.js": -/*!***************************************************************!* +/*!***************************************************************!*\ !*** ./node_modules/core-js/modules/es6.array.copy-within.js ***! \***************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -1838,7 +1816,7 @@ eval("// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\n /***/ }), /***/ "./node_modules/core-js/modules/es6.array.every.js": -/*!*********************************************************!* +/*!*********************************************************!*\ !*** ./node_modules/core-js/modules/es6.array.every.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -1849,7 +1827,7 @@ eval("\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core /***/ }), /***/ "./node_modules/core-js/modules/es6.array.fill.js": -/*!********************************************************!* +/*!********************************************************!*\ !*** ./node_modules/core-js/modules/es6.array.fill.js ***! \********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -1859,7 +1837,7 @@ eval("// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\nvar /***/ }), /***/ "./node_modules/core-js/modules/es6.array.filter.js": -/*!**********************************************************!* +/*!**********************************************************!*\ !*** ./node_modules/core-js/modules/es6.array.filter.js ***! \**********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -1870,7 +1848,7 @@ eval("\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core /***/ }), /***/ "./node_modules/core-js/modules/es6.array.find-index.js": -/*!**************************************************************!* +/*!**************************************************************!*\ !*** ./node_modules/core-js/modules/es6.array.find-index.js ***! \**************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -1881,7 +1859,7 @@ eval("\n// 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined)\nv /***/ }), /***/ "./node_modules/core-js/modules/es6.array.find.js": -/*!********************************************************!* +/*!********************************************************!*\ !*** ./node_modules/core-js/modules/es6.array.find.js ***! \********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -1892,7 +1870,7 @@ eval("\n// 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined)\nvar $e /***/ }), /***/ "./node_modules/core-js/modules/es6.array.for-each.js": -/*!************************************************************!* +/*!************************************************************!*\ !*** ./node_modules/core-js/modules/es6.array.for-each.js ***! \************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -1903,7 +1881,7 @@ eval("\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core /***/ }), /***/ "./node_modules/core-js/modules/es6.array.from.js": -/*!********************************************************!* +/*!********************************************************!*\ !*** ./node_modules/core-js/modules/es6.array.from.js ***! \********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -1914,7 +1892,7 @@ eval("\nvar ctx = __webpack_require__(/*! ./_ctx */ \"./node_modules/core-js/mod /***/ }), /***/ "./node_modules/core-js/modules/es6.array.index-of.js": -/*!************************************************************!* +/*!************************************************************!*\ !*** ./node_modules/core-js/modules/es6.array.index-of.js ***! \************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -1925,7 +1903,7 @@ eval("\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core /***/ }), /***/ "./node_modules/core-js/modules/es6.array.is-array.js": -/*!************************************************************!* +/*!************************************************************!*\ !*** ./node_modules/core-js/modules/es6.array.is-array.js ***! \************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -1935,7 +1913,7 @@ eval("// 22.1.2.2 / 15.4.3.2 Array.isArray(arg)\nvar $export = __webpack_require /***/ }), /***/ "./node_modules/core-js/modules/es6.array.iterator.js": -/*!************************************************************!* +/*!************************************************************!*\ !*** ./node_modules/core-js/modules/es6.array.iterator.js ***! \************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -1946,7 +1924,7 @@ eval("\nvar addToUnscopables = __webpack_require__(/*! ./_add-to-unscopables */ /***/ }), /***/ "./node_modules/core-js/modules/es6.array.join.js": -/*!********************************************************!* +/*!********************************************************!*\ !*** ./node_modules/core-js/modules/es6.array.join.js ***! \********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -1957,7 +1935,7 @@ eval("\n// 22.1.3.13 Array.prototype.join(separator)\nvar $export = __webpack_re /***/ }), /***/ "./node_modules/core-js/modules/es6.array.last-index-of.js": -/*!*****************************************************************!* +/*!*****************************************************************!*\ !*** ./node_modules/core-js/modules/es6.array.last-index-of.js ***! \*****************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -1968,7 +1946,7 @@ eval("\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core /***/ }), /***/ "./node_modules/core-js/modules/es6.array.map.js": -/*!*******************************************************!* +/*!*******************************************************!*\ !*** ./node_modules/core-js/modules/es6.array.map.js ***! \*******************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -1979,7 +1957,7 @@ eval("\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core /***/ }), /***/ "./node_modules/core-js/modules/es6.array.of.js": -/*!******************************************************!* +/*!******************************************************!*\ !*** ./node_modules/core-js/modules/es6.array.of.js ***! \******************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -1990,7 +1968,7 @@ eval("\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core /***/ }), /***/ "./node_modules/core-js/modules/es6.array.reduce-right.js": -/*!****************************************************************!* +/*!****************************************************************!*\ !*** ./node_modules/core-js/modules/es6.array.reduce-right.js ***! \****************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2001,7 +1979,7 @@ eval("\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core /***/ }), /***/ "./node_modules/core-js/modules/es6.array.reduce.js": -/*!**********************************************************!* +/*!**********************************************************!*\ !*** ./node_modules/core-js/modules/es6.array.reduce.js ***! \**********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2012,7 +1990,7 @@ eval("\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core /***/ }), /***/ "./node_modules/core-js/modules/es6.array.slice.js": -/*!*********************************************************!* +/*!*********************************************************!*\ !*** ./node_modules/core-js/modules/es6.array.slice.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2023,7 +2001,7 @@ eval("\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core /***/ }), /***/ "./node_modules/core-js/modules/es6.array.some.js": -/*!********************************************************!* +/*!********************************************************!*\ !*** ./node_modules/core-js/modules/es6.array.some.js ***! \********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2034,7 +2012,7 @@ eval("\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core /***/ }), /***/ "./node_modules/core-js/modules/es6.array.sort.js": -/*!********************************************************!* +/*!********************************************************!*\ !*** ./node_modules/core-js/modules/es6.array.sort.js ***! \********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2045,7 +2023,7 @@ eval("\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core /***/ }), /***/ "./node_modules/core-js/modules/es6.array.species.js": -/*!***********************************************************!* +/*!***********************************************************!*\ !*** ./node_modules/core-js/modules/es6.array.species.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2055,7 +2033,7 @@ eval("__webpack_require__(/*! ./_set-species */ \"./node_modules/core-js/modules /***/ }), /***/ "./node_modules/core-js/modules/es6.date.now.js": -/*!******************************************************!* +/*!******************************************************!*\ !*** ./node_modules/core-js/modules/es6.date.now.js ***! \******************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2065,7 +2043,7 @@ eval("// 20.3.3.1 / 15.9.4.4 Date.now()\nvar $export = __webpack_require__(/*! . /***/ }), /***/ "./node_modules/core-js/modules/es6.date.to-iso-string.js": -/*!****************************************************************!* +/*!****************************************************************!*\ !*** ./node_modules/core-js/modules/es6.date.to-iso-string.js ***! \****************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2075,7 +2053,7 @@ eval("// 20.3.4.36 / 15.9.5.43 Date.prototype.toISOString()\nvar $export = __web /***/ }), /***/ "./node_modules/core-js/modules/es6.date.to-json.js": -/*!**********************************************************!* +/*!**********************************************************!*\ !*** ./node_modules/core-js/modules/es6.date.to-json.js ***! \**********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2086,7 +2064,7 @@ eval("\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core /***/ }), /***/ "./node_modules/core-js/modules/es6.date.to-primitive.js": -/*!***************************************************************!* +/*!***************************************************************!*\ !*** ./node_modules/core-js/modules/es6.date.to-primitive.js ***! \***************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2096,7 +2074,7 @@ eval("var TO_PRIMITIVE = __webpack_require__(/*! ./_wks */ \"./node_modules/core /***/ }), /***/ "./node_modules/core-js/modules/es6.date.to-string.js": -/*!************************************************************!* +/*!************************************************************!*\ !*** ./node_modules/core-js/modules/es6.date.to-string.js ***! \************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2106,7 +2084,7 @@ eval("var DateProto = Date.prototype;\nvar INVALID_DATE = 'Invalid Date';\nvar T /***/ }), /***/ "./node_modules/core-js/modules/es6.function.bind.js": -/*!***********************************************************!* +/*!***********************************************************!*\ !*** ./node_modules/core-js/modules/es6.function.bind.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2116,7 +2094,7 @@ eval("// 19.2.3.2 / 15.3.4.5 Function.prototype.bind(thisArg, args...)\nvar $exp /***/ }), /***/ "./node_modules/core-js/modules/es6.function.has-instance.js": -/*!*******************************************************************!* +/*!*******************************************************************!*\ !*** ./node_modules/core-js/modules/es6.function.has-instance.js ***! \*******************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2127,7 +2105,7 @@ eval("\nvar isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/ /***/ }), /***/ "./node_modules/core-js/modules/es6.function.name.js": -/*!***********************************************************!* +/*!***********************************************************!*\ !*** ./node_modules/core-js/modules/es6.function.name.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2137,7 +2115,7 @@ eval("var dP = __webpack_require__(/*! ./_object-dp */ \"./node_modules/core-js/ /***/ }), /***/ "./node_modules/core-js/modules/es6.map.js": -/*!*************************************************!* +/*!*************************************************!*\ !*** ./node_modules/core-js/modules/es6.map.js ***! \*************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -2148,7 +2126,7 @@ eval("\nvar strong = __webpack_require__(/*! ./_collection-strong */ \"./node_mo /***/ }), /***/ "./node_modules/core-js/modules/es6.math.acosh.js": -/*!********************************************************!* +/*!********************************************************!*\ !*** ./node_modules/core-js/modules/es6.math.acosh.js ***! \********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2158,7 +2136,7 @@ eval("// 20.2.2.3 Math.acosh(x)\nvar $export = __webpack_require__(/*! ./_export /***/ }), /***/ "./node_modules/core-js/modules/es6.math.asinh.js": -/*!********************************************************!* +/*!********************************************************!*\ !*** ./node_modules/core-js/modules/es6.math.asinh.js ***! \********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2168,7 +2146,7 @@ eval("// 20.2.2.5 Math.asinh(x)\nvar $export = __webpack_require__(/*! ./_export /***/ }), /***/ "./node_modules/core-js/modules/es6.math.atanh.js": -/*!********************************************************!* +/*!********************************************************!*\ !*** ./node_modules/core-js/modules/es6.math.atanh.js ***! \********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2178,7 +2156,7 @@ eval("// 20.2.2.7 Math.atanh(x)\nvar $export = __webpack_require__(/*! ./_export /***/ }), /***/ "./node_modules/core-js/modules/es6.math.cbrt.js": -/*!*******************************************************!* +/*!*******************************************************!*\ !*** ./node_modules/core-js/modules/es6.math.cbrt.js ***! \*******************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2188,7 +2166,7 @@ eval("// 20.2.2.9 Math.cbrt(x)\nvar $export = __webpack_require__(/*! ./_export /***/ }), /***/ "./node_modules/core-js/modules/es6.math.clz32.js": -/*!********************************************************!* +/*!********************************************************!*\ !*** ./node_modules/core-js/modules/es6.math.clz32.js ***! \********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2198,7 +2176,7 @@ eval("// 20.2.2.11 Math.clz32(x)\nvar $export = __webpack_require__(/*! ./_expor /***/ }), /***/ "./node_modules/core-js/modules/es6.math.cosh.js": -/*!*******************************************************!* +/*!*******************************************************!*\ !*** ./node_modules/core-js/modules/es6.math.cosh.js ***! \*******************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2208,7 +2186,7 @@ eval("// 20.2.2.12 Math.cosh(x)\nvar $export = __webpack_require__(/*! ./_export /***/ }), /***/ "./node_modules/core-js/modules/es6.math.expm1.js": -/*!********************************************************!* +/*!********************************************************!*\ !*** ./node_modules/core-js/modules/es6.math.expm1.js ***! \********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2218,7 +2196,7 @@ eval("// 20.2.2.14 Math.expm1(x)\nvar $export = __webpack_require__(/*! ./_expor /***/ }), /***/ "./node_modules/core-js/modules/es6.math.fround.js": -/*!*********************************************************!* +/*!*********************************************************!*\ !*** ./node_modules/core-js/modules/es6.math.fround.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2228,7 +2206,7 @@ eval("// 20.2.2.16 Math.fround(x)\nvar $export = __webpack_require__(/*! ./_expo /***/ }), /***/ "./node_modules/core-js/modules/es6.math.hypot.js": -/*!********************************************************!* +/*!********************************************************!*\ !*** ./node_modules/core-js/modules/es6.math.hypot.js ***! \********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2238,7 +2216,7 @@ eval("// 20.2.2.17 Math.hypot([value1[, value2[, … ]]])\nvar $export = __webpa /***/ }), /***/ "./node_modules/core-js/modules/es6.math.imul.js": -/*!*******************************************************!* +/*!*******************************************************!*\ !*** ./node_modules/core-js/modules/es6.math.imul.js ***! \*******************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2248,7 +2226,7 @@ eval("// 20.2.2.18 Math.imul(x, y)\nvar $export = __webpack_require__(/*! ./_exp /***/ }), /***/ "./node_modules/core-js/modules/es6.math.log10.js": -/*!********************************************************!* +/*!********************************************************!*\ !*** ./node_modules/core-js/modules/es6.math.log10.js ***! \********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2258,7 +2236,7 @@ eval("// 20.2.2.21 Math.log10(x)\nvar $export = __webpack_require__(/*! ./_expor /***/ }), /***/ "./node_modules/core-js/modules/es6.math.log1p.js": -/*!********************************************************!* +/*!********************************************************!*\ !*** ./node_modules/core-js/modules/es6.math.log1p.js ***! \********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2268,7 +2246,7 @@ eval("// 20.2.2.20 Math.log1p(x)\nvar $export = __webpack_require__(/*! ./_expor /***/ }), /***/ "./node_modules/core-js/modules/es6.math.log2.js": -/*!*******************************************************!* +/*!*******************************************************!*\ !*** ./node_modules/core-js/modules/es6.math.log2.js ***! \*******************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2278,7 +2256,7 @@ eval("// 20.2.2.22 Math.log2(x)\nvar $export = __webpack_require__(/*! ./_export /***/ }), /***/ "./node_modules/core-js/modules/es6.math.sign.js": -/*!*******************************************************!* +/*!*******************************************************!*\ !*** ./node_modules/core-js/modules/es6.math.sign.js ***! \*******************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2288,7 +2266,7 @@ eval("// 20.2.2.28 Math.sign(x)\nvar $export = __webpack_require__(/*! ./_export /***/ }), /***/ "./node_modules/core-js/modules/es6.math.sinh.js": -/*!*******************************************************!* +/*!*******************************************************!*\ !*** ./node_modules/core-js/modules/es6.math.sinh.js ***! \*******************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2298,7 +2276,7 @@ eval("// 20.2.2.30 Math.sinh(x)\nvar $export = __webpack_require__(/*! ./_export /***/ }), /***/ "./node_modules/core-js/modules/es6.math.tanh.js": -/*!*******************************************************!* +/*!*******************************************************!*\ !*** ./node_modules/core-js/modules/es6.math.tanh.js ***! \*******************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2308,7 +2286,7 @@ eval("// 20.2.2.33 Math.tanh(x)\nvar $export = __webpack_require__(/*! ./_export /***/ }), /***/ "./node_modules/core-js/modules/es6.math.trunc.js": -/*!********************************************************!* +/*!********************************************************!*\ !*** ./node_modules/core-js/modules/es6.math.trunc.js ***! \********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2318,7 +2296,7 @@ eval("// 20.2.2.34 Math.trunc(x)\nvar $export = __webpack_require__(/*! ./_expor /***/ }), /***/ "./node_modules/core-js/modules/es6.number.constructor.js": -/*!****************************************************************!* +/*!****************************************************************!*\ !*** ./node_modules/core-js/modules/es6.number.constructor.js ***! \****************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2329,7 +2307,7 @@ eval("\nvar global = __webpack_require__(/*! ./_global */ \"./node_modules/core- /***/ }), /***/ "./node_modules/core-js/modules/es6.number.epsilon.js": -/*!************************************************************!* +/*!************************************************************!*\ !*** ./node_modules/core-js/modules/es6.number.epsilon.js ***! \************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2339,7 +2317,7 @@ eval("// 20.1.2.1 Number.EPSILON\nvar $export = __webpack_require__(/*! ./_expor /***/ }), /***/ "./node_modules/core-js/modules/es6.number.is-finite.js": -/*!**************************************************************!* +/*!**************************************************************!*\ !*** ./node_modules/core-js/modules/es6.number.is-finite.js ***! \**************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2349,7 +2327,7 @@ eval("// 20.1.2.2 Number.isFinite(number)\nvar $export = __webpack_require__(/*! /***/ }), /***/ "./node_modules/core-js/modules/es6.number.is-integer.js": -/*!***************************************************************!* +/*!***************************************************************!*\ !*** ./node_modules/core-js/modules/es6.number.is-integer.js ***! \***************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2359,7 +2337,7 @@ eval("// 20.1.2.3 Number.isInteger(number)\nvar $export = __webpack_require__(/* /***/ }), /***/ "./node_modules/core-js/modules/es6.number.is-nan.js": -/*!***********************************************************!* +/*!***********************************************************!*\ !*** ./node_modules/core-js/modules/es6.number.is-nan.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2369,7 +2347,7 @@ eval("// 20.1.2.4 Number.isNaN(number)\nvar $export = __webpack_require__(/*! ./ /***/ }), /***/ "./node_modules/core-js/modules/es6.number.is-safe-integer.js": -/*!********************************************************************!* +/*!********************************************************************!*\ !*** ./node_modules/core-js/modules/es6.number.is-safe-integer.js ***! \********************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2379,7 +2357,7 @@ eval("// 20.1.2.5 Number.isSafeInteger(number)\nvar $export = __webpack_require_ /***/ }), /***/ "./node_modules/core-js/modules/es6.number.max-safe-integer.js": -/*!*********************************************************************!* +/*!*********************************************************************!*\ !*** ./node_modules/core-js/modules/es6.number.max-safe-integer.js ***! \*********************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2389,7 +2367,7 @@ eval("// 20.1.2.6 Number.MAX_SAFE_INTEGER\nvar $export = __webpack_require__(/*! /***/ }), /***/ "./node_modules/core-js/modules/es6.number.min-safe-integer.js": -/*!*********************************************************************!* +/*!*********************************************************************!*\ !*** ./node_modules/core-js/modules/es6.number.min-safe-integer.js ***! \*********************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2399,7 +2377,7 @@ eval("// 20.1.2.10 Number.MIN_SAFE_INTEGER\nvar $export = __webpack_require__(/* /***/ }), /***/ "./node_modules/core-js/modules/es6.number.parse-float.js": -/*!****************************************************************!* +/*!****************************************************************!*\ !*** ./node_modules/core-js/modules/es6.number.parse-float.js ***! \****************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2409,7 +2387,7 @@ eval("var $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-j /***/ }), /***/ "./node_modules/core-js/modules/es6.number.parse-int.js": -/*!**************************************************************!* +/*!**************************************************************!*\ !*** ./node_modules/core-js/modules/es6.number.parse-int.js ***! \**************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2419,7 +2397,7 @@ eval("var $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-j /***/ }), /***/ "./node_modules/core-js/modules/es6.number.to-fixed.js": -/*!*************************************************************!* +/*!*************************************************************!*\ !*** ./node_modules/core-js/modules/es6.number.to-fixed.js ***! \*************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2430,7 +2408,7 @@ eval("\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core /***/ }), /***/ "./node_modules/core-js/modules/es6.number.to-precision.js": -/*!*****************************************************************!* +/*!*****************************************************************!*\ !*** ./node_modules/core-js/modules/es6.number.to-precision.js ***! \*****************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2441,7 +2419,7 @@ eval("\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core /***/ }), /***/ "./node_modules/core-js/modules/es6.object.assign.js": -/*!***********************************************************!* +/*!***********************************************************!*\ !*** ./node_modules/core-js/modules/es6.object.assign.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2451,7 +2429,7 @@ eval("// 19.1.3.1 Object.assign(target, source)\nvar $export = __webpack_require /***/ }), /***/ "./node_modules/core-js/modules/es6.object.create.js": -/*!***********************************************************!* +/*!***********************************************************!*\ !*** ./node_modules/core-js/modules/es6.object.create.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2461,7 +2439,7 @@ eval("var $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-j /***/ }), /***/ "./node_modules/core-js/modules/es6.object.define-properties.js": -/*!**********************************************************************!* +/*!**********************************************************************!*\ !*** ./node_modules/core-js/modules/es6.object.define-properties.js ***! \**********************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2471,7 +2449,7 @@ eval("var $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-j /***/ }), /***/ "./node_modules/core-js/modules/es6.object.define-property.js": -/*!********************************************************************!* +/*!********************************************************************!*\ !*** ./node_modules/core-js/modules/es6.object.define-property.js ***! \********************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2481,7 +2459,7 @@ eval("var $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-j /***/ }), /***/ "./node_modules/core-js/modules/es6.object.freeze.js": -/*!***********************************************************!* +/*!***********************************************************!*\ !*** ./node_modules/core-js/modules/es6.object.freeze.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2491,7 +2469,7 @@ eval("// 19.1.2.5 Object.freeze(O)\nvar isObject = __webpack_require__(/*! ./_is /***/ }), /***/ "./node_modules/core-js/modules/es6.object.get-own-property-descriptor.js": -/*!********************************************************************************!* +/*!********************************************************************************!*\ !*** ./node_modules/core-js/modules/es6.object.get-own-property-descriptor.js ***! \********************************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2501,7 +2479,7 @@ eval("// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\nvar toIObject = __webpa /***/ }), /***/ "./node_modules/core-js/modules/es6.object.get-own-property-names.js": -/*!***************************************************************************!* +/*!***************************************************************************!*\ !*** ./node_modules/core-js/modules/es6.object.get-own-property-names.js ***! \***************************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2511,7 +2489,7 @@ eval("// 19.1.2.7 Object.getOwnPropertyNames(O)\n__webpack_require__(/*! ./_obje /***/ }), /***/ "./node_modules/core-js/modules/es6.object.get-prototype-of.js": -/*!*********************************************************************!* +/*!*********************************************************************!*\ !*** ./node_modules/core-js/modules/es6.object.get-prototype-of.js ***! \*********************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2521,7 +2499,7 @@ eval("// 19.1.2.9 Object.getPrototypeOf(O)\nvar toObject = __webpack_require__(/ /***/ }), /***/ "./node_modules/core-js/modules/es6.object.is-extensible.js": -/*!******************************************************************!* +/*!******************************************************************!*\ !*** ./node_modules/core-js/modules/es6.object.is-extensible.js ***! \******************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2531,7 +2509,7 @@ eval("// 19.1.2.11 Object.isExtensible(O)\nvar isObject = __webpack_require__(/* /***/ }), /***/ "./node_modules/core-js/modules/es6.object.is-frozen.js": -/*!**************************************************************!* +/*!**************************************************************!*\ !*** ./node_modules/core-js/modules/es6.object.is-frozen.js ***! \**************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2541,7 +2519,7 @@ eval("// 19.1.2.12 Object.isFrozen(O)\nvar isObject = __webpack_require__(/*! ./ /***/ }), /***/ "./node_modules/core-js/modules/es6.object.is-sealed.js": -/*!**************************************************************!* +/*!**************************************************************!*\ !*** ./node_modules/core-js/modules/es6.object.is-sealed.js ***! \**************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2551,7 +2529,7 @@ eval("// 19.1.2.13 Object.isSealed(O)\nvar isObject = __webpack_require__(/*! ./ /***/ }), /***/ "./node_modules/core-js/modules/es6.object.is.js": -/*!*******************************************************!* +/*!*******************************************************!*\ !*** ./node_modules/core-js/modules/es6.object.is.js ***! \*******************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2561,7 +2539,7 @@ eval("// 19.1.3.10 Object.is(value1, value2)\nvar $export = __webpack_require__( /***/ }), /***/ "./node_modules/core-js/modules/es6.object.keys.js": -/*!*********************************************************!* +/*!*********************************************************!*\ !*** ./node_modules/core-js/modules/es6.object.keys.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2571,7 +2549,7 @@ eval("// 19.1.2.14 Object.keys(O)\nvar toObject = __webpack_require__(/*! ./_to- /***/ }), /***/ "./node_modules/core-js/modules/es6.object.prevent-extensions.js": -/*!***********************************************************************!* +/*!***********************************************************************!*\ !*** ./node_modules/core-js/modules/es6.object.prevent-extensions.js ***! \***********************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2581,7 +2559,7 @@ eval("// 19.1.2.15 Object.preventExtensions(O)\nvar isObject = __webpack_require /***/ }), /***/ "./node_modules/core-js/modules/es6.object.seal.js": -/*!*********************************************************!* +/*!*********************************************************!*\ !*** ./node_modules/core-js/modules/es6.object.seal.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2591,7 +2569,7 @@ eval("// 19.1.2.17 Object.seal(O)\nvar isObject = __webpack_require__(/*! ./_is- /***/ }), /***/ "./node_modules/core-js/modules/es6.object.set-prototype-of.js": -/*!*********************************************************************!* +/*!*********************************************************************!*\ !*** ./node_modules/core-js/modules/es6.object.set-prototype-of.js ***! \*********************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2601,7 +2579,7 @@ eval("// 19.1.3.19 Object.setPrototypeOf(O, proto)\nvar $export = __webpack_requ /***/ }), /***/ "./node_modules/core-js/modules/es6.object.to-string.js": -/*!**************************************************************!* +/*!**************************************************************!*\ !*** ./node_modules/core-js/modules/es6.object.to-string.js ***! \**************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2612,7 +2590,7 @@ eval("\n// 19.1.3.6 Object.prototype.toString()\nvar classof = __webpack_require /***/ }), /***/ "./node_modules/core-js/modules/es6.parse-float.js": -/*!*********************************************************!* +/*!*********************************************************!*\ !*** ./node_modules/core-js/modules/es6.parse-float.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2622,7 +2600,7 @@ eval("var $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-j /***/ }), /***/ "./node_modules/core-js/modules/es6.parse-int.js": -/*!*******************************************************!* +/*!*******************************************************!*\ !*** ./node_modules/core-js/modules/es6.parse-int.js ***! \*******************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2632,7 +2610,7 @@ eval("var $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-j /***/ }), /***/ "./node_modules/core-js/modules/es6.promise.js": -/*!*****************************************************!* +/*!*****************************************************!*\ !*** ./node_modules/core-js/modules/es6.promise.js ***! \*****************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2643,7 +2621,7 @@ eval("\nvar LIBRARY = __webpack_require__(/*! ./_library */ \"./node_modules/cor /***/ }), /***/ "./node_modules/core-js/modules/es6.reflect.apply.js": -/*!***********************************************************!* +/*!***********************************************************!*\ !*** ./node_modules/core-js/modules/es6.reflect.apply.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2653,7 +2631,7 @@ eval("// 26.1.1 Reflect.apply(target, thisArgument, argumentsList)\nvar $export /***/ }), /***/ "./node_modules/core-js/modules/es6.reflect.construct.js": -/*!***************************************************************!* +/*!***************************************************************!*\ !*** ./node_modules/core-js/modules/es6.reflect.construct.js ***! \***************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2663,7 +2641,7 @@ eval("// 26.1.2 Reflect.construct(target, argumentsList [, newTarget])\nvar $exp /***/ }), /***/ "./node_modules/core-js/modules/es6.reflect.define-property.js": -/*!*********************************************************************!* +/*!*********************************************************************!*\ !*** ./node_modules/core-js/modules/es6.reflect.define-property.js ***! \*********************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2673,7 +2651,7 @@ eval("// 26.1.3 Reflect.defineProperty(target, propertyKey, attributes)\nvar dP /***/ }), /***/ "./node_modules/core-js/modules/es6.reflect.delete-property.js": -/*!*********************************************************************!* +/*!*********************************************************************!*\ !*** ./node_modules/core-js/modules/es6.reflect.delete-property.js ***! \*********************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2683,7 +2661,7 @@ eval("// 26.1.4 Reflect.deleteProperty(target, propertyKey)\nvar $export = __web /***/ }), /***/ "./node_modules/core-js/modules/es6.reflect.enumerate.js": -/*!***************************************************************!* +/*!***************************************************************!*\ !*** ./node_modules/core-js/modules/es6.reflect.enumerate.js ***! \***************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2694,7 +2672,7 @@ eval("\n// 26.1.5 Reflect.enumerate(target)\nvar $export = __webpack_require__(/ /***/ }), /***/ "./node_modules/core-js/modules/es6.reflect.get-own-property-descriptor.js": -/*!*********************************************************************************!* +/*!*********************************************************************************!*\ !*** ./node_modules/core-js/modules/es6.reflect.get-own-property-descriptor.js ***! \*********************************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2704,7 +2682,7 @@ eval("// 26.1.7 Reflect.getOwnPropertyDescriptor(target, propertyKey)\nvar gOPD /***/ }), /***/ "./node_modules/core-js/modules/es6.reflect.get-prototype-of.js": -/*!**********************************************************************!* +/*!**********************************************************************!*\ !*** ./node_modules/core-js/modules/es6.reflect.get-prototype-of.js ***! \**********************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2714,7 +2692,7 @@ eval("// 26.1.8 Reflect.getPrototypeOf(target)\nvar $export = __webpack_require_ /***/ }), /***/ "./node_modules/core-js/modules/es6.reflect.get.js": -/*!*********************************************************!* +/*!*********************************************************!*\ !*** ./node_modules/core-js/modules/es6.reflect.get.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2724,7 +2702,7 @@ eval("// 26.1.6 Reflect.get(target, propertyKey [, receiver])\nvar gOPD = __webp /***/ }), /***/ "./node_modules/core-js/modules/es6.reflect.has.js": -/*!*********************************************************!* +/*!*********************************************************!*\ !*** ./node_modules/core-js/modules/es6.reflect.has.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2734,7 +2712,7 @@ eval("// 26.1.9 Reflect.has(target, propertyKey)\nvar $export = __webpack_requir /***/ }), /***/ "./node_modules/core-js/modules/es6.reflect.is-extensible.js": -/*!*******************************************************************!* +/*!*******************************************************************!*\ !*** ./node_modules/core-js/modules/es6.reflect.is-extensible.js ***! \*******************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2744,7 +2722,7 @@ eval("// 26.1.10 Reflect.isExtensible(target)\nvar $export = __webpack_require__ /***/ }), /***/ "./node_modules/core-js/modules/es6.reflect.own-keys.js": -/*!**************************************************************!* +/*!**************************************************************!*\ !*** ./node_modules/core-js/modules/es6.reflect.own-keys.js ***! \**************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2754,7 +2732,7 @@ eval("// 26.1.11 Reflect.ownKeys(target)\nvar $export = __webpack_require__(/*! /***/ }), /***/ "./node_modules/core-js/modules/es6.reflect.prevent-extensions.js": -/*!************************************************************************!* +/*!************************************************************************!*\ !*** ./node_modules/core-js/modules/es6.reflect.prevent-extensions.js ***! \************************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2764,7 +2742,7 @@ eval("// 26.1.12 Reflect.preventExtensions(target)\nvar $export = __webpack_requ /***/ }), /***/ "./node_modules/core-js/modules/es6.reflect.set-prototype-of.js": -/*!**********************************************************************!* +/*!**********************************************************************!*\ !*** ./node_modules/core-js/modules/es6.reflect.set-prototype-of.js ***! \**********************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2774,7 +2752,7 @@ eval("// 26.1.14 Reflect.setPrototypeOf(target, proto)\nvar $export = __webpack_ /***/ }), /***/ "./node_modules/core-js/modules/es6.reflect.set.js": -/*!*********************************************************!* +/*!*********************************************************!*\ !*** ./node_modules/core-js/modules/es6.reflect.set.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2784,7 +2762,7 @@ eval("// 26.1.13 Reflect.set(target, propertyKey, V [, receiver])\nvar dP = __we /***/ }), /***/ "./node_modules/core-js/modules/es6.regexp.constructor.js": -/*!****************************************************************!* +/*!****************************************************************!*\ !*** ./node_modules/core-js/modules/es6.regexp.constructor.js ***! \****************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2794,7 +2772,7 @@ eval("var global = __webpack_require__(/*! ./_global */ \"./node_modules/core-js /***/ }), /***/ "./node_modules/core-js/modules/es6.regexp.exec.js": -/*!*********************************************************!* +/*!*********************************************************!*\ !*** ./node_modules/core-js/modules/es6.regexp.exec.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2805,7 +2783,7 @@ eval("\nvar regexpExec = __webpack_require__(/*! ./_regexp-exec */ \"./node_modu /***/ }), /***/ "./node_modules/core-js/modules/es6.regexp.flags.js": -/*!**********************************************************!* +/*!**********************************************************!*\ !*** ./node_modules/core-js/modules/es6.regexp.flags.js ***! \**********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2815,7 +2793,7 @@ eval("// 21.2.5.3 get RegExp.prototype.flags()\nif (__webpack_require__(/*! ./_d /***/ }), /***/ "./node_modules/core-js/modules/es6.regexp.match.js": -/*!**********************************************************!* +/*!**********************************************************!*\ !*** ./node_modules/core-js/modules/es6.regexp.match.js ***! \**********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2826,7 +2804,7 @@ eval("\n\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_module /***/ }), /***/ "./node_modules/core-js/modules/es6.regexp.replace.js": -/*!************************************************************!* +/*!************************************************************!*\ !*** ./node_modules/core-js/modules/es6.regexp.replace.js ***! \************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2837,7 +2815,7 @@ eval("\n\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_module /***/ }), /***/ "./node_modules/core-js/modules/es6.regexp.search.js": -/*!***********************************************************!* +/*!***********************************************************!*\ !*** ./node_modules/core-js/modules/es6.regexp.search.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2848,7 +2826,7 @@ eval("\n\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_module /***/ }), /***/ "./node_modules/core-js/modules/es6.regexp.split.js": -/*!**********************************************************!* +/*!**********************************************************!*\ !*** ./node_modules/core-js/modules/es6.regexp.split.js ***! \**********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2859,7 +2837,7 @@ eval("\n\nvar isRegExp = __webpack_require__(/*! ./_is-regexp */ \"./node_module /***/ }), /***/ "./node_modules/core-js/modules/es6.regexp.to-string.js": -/*!**************************************************************!* +/*!**************************************************************!*\ !*** ./node_modules/core-js/modules/es6.regexp.to-string.js ***! \**************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2870,7 +2848,7 @@ eval("\n__webpack_require__(/*! ./es6.regexp.flags */ \"./node_modules/core-js/m /***/ }), /***/ "./node_modules/core-js/modules/es6.set.js": -/*!*************************************************!* +/*!*************************************************!*\ !*** ./node_modules/core-js/modules/es6.set.js ***! \*************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -2881,7 +2859,7 @@ eval("\nvar strong = __webpack_require__(/*! ./_collection-strong */ \"./node_mo /***/ }), /***/ "./node_modules/core-js/modules/es6.string.anchor.js": -/*!***********************************************************!* +/*!***********************************************************!*\ !*** ./node_modules/core-js/modules/es6.string.anchor.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2892,7 +2870,7 @@ eval("\n// B.2.3.2 String.prototype.anchor(name)\n__webpack_require__(/*! ./_str /***/ }), /***/ "./node_modules/core-js/modules/es6.string.big.js": -/*!********************************************************!* +/*!********************************************************!*\ !*** ./node_modules/core-js/modules/es6.string.big.js ***! \********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2903,7 +2881,7 @@ eval("\n// B.2.3.3 String.prototype.big()\n__webpack_require__(/*! ./_string-htm /***/ }), /***/ "./node_modules/core-js/modules/es6.string.blink.js": -/*!**********************************************************!* +/*!**********************************************************!*\ !*** ./node_modules/core-js/modules/es6.string.blink.js ***! \**********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2914,7 +2892,7 @@ eval("\n// B.2.3.4 String.prototype.blink()\n__webpack_require__(/*! ./_string-h /***/ }), /***/ "./node_modules/core-js/modules/es6.string.bold.js": -/*!*********************************************************!* +/*!*********************************************************!*\ !*** ./node_modules/core-js/modules/es6.string.bold.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2925,7 +2903,7 @@ eval("\n// B.2.3.5 String.prototype.bold()\n__webpack_require__(/*! ./_string-ht /***/ }), /***/ "./node_modules/core-js/modules/es6.string.code-point-at.js": -/*!******************************************************************!* +/*!******************************************************************!*\ !*** ./node_modules/core-js/modules/es6.string.code-point-at.js ***! \******************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2936,7 +2914,7 @@ eval("\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core /***/ }), /***/ "./node_modules/core-js/modules/es6.string.ends-with.js": -/*!**************************************************************!* +/*!**************************************************************!*\ !*** ./node_modules/core-js/modules/es6.string.ends-with.js ***! \**************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2947,7 +2925,7 @@ eval("// 21.1.3.6 String.prototype.endsWith(searchString [, endPosition])\n\nvar /***/ }), /***/ "./node_modules/core-js/modules/es6.string.fixed.js": -/*!**********************************************************!* +/*!**********************************************************!*\ !*** ./node_modules/core-js/modules/es6.string.fixed.js ***! \**********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2958,7 +2936,7 @@ eval("\n// B.2.3.6 String.prototype.fixed()\n__webpack_require__(/*! ./_string-h /***/ }), /***/ "./node_modules/core-js/modules/es6.string.fontcolor.js": -/*!**************************************************************!* +/*!**************************************************************!*\ !*** ./node_modules/core-js/modules/es6.string.fontcolor.js ***! \**************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2969,7 +2947,7 @@ eval("\n// B.2.3.7 String.prototype.fontcolor(color)\n__webpack_require__(/*! ./ /***/ }), /***/ "./node_modules/core-js/modules/es6.string.fontsize.js": -/*!*************************************************************!* +/*!*************************************************************!*\ !*** ./node_modules/core-js/modules/es6.string.fontsize.js ***! \*************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2980,7 +2958,7 @@ eval("\n// B.2.3.8 String.prototype.fontsize(size)\n__webpack_require__(/*! ./_s /***/ }), /***/ "./node_modules/core-js/modules/es6.string.from-code-point.js": -/*!********************************************************************!* +/*!********************************************************************!*\ !*** ./node_modules/core-js/modules/es6.string.from-code-point.js ***! \********************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -2990,7 +2968,7 @@ eval("var $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-j /***/ }), /***/ "./node_modules/core-js/modules/es6.string.includes.js": -/*!*************************************************************!* +/*!*************************************************************!*\ !*** ./node_modules/core-js/modules/es6.string.includes.js ***! \*************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -3001,7 +2979,7 @@ eval("// 21.1.3.7 String.prototype.includes(searchString, position = 0)\n\nvar $ /***/ }), /***/ "./node_modules/core-js/modules/es6.string.italics.js": -/*!************************************************************!* +/*!************************************************************!*\ !*** ./node_modules/core-js/modules/es6.string.italics.js ***! \************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -3012,7 +2990,7 @@ eval("\n// B.2.3.9 String.prototype.italics()\n__webpack_require__(/*! ./_string /***/ }), /***/ "./node_modules/core-js/modules/es6.string.iterator.js": -/*!*************************************************************!* +/*!*************************************************************!*\ !*** ./node_modules/core-js/modules/es6.string.iterator.js ***! \*************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -3023,7 +3001,7 @@ eval("\nvar $at = __webpack_require__(/*! ./_string-at */ \"./node_modules/core- /***/ }), /***/ "./node_modules/core-js/modules/es6.string.link.js": -/*!*********************************************************!* +/*!*********************************************************!*\ !*** ./node_modules/core-js/modules/es6.string.link.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -3034,7 +3012,7 @@ eval("\n// B.2.3.10 String.prototype.link(url)\n__webpack_require__(/*! ./_strin /***/ }), /***/ "./node_modules/core-js/modules/es6.string.raw.js": -/*!********************************************************!* +/*!********************************************************!*\ !*** ./node_modules/core-js/modules/es6.string.raw.js ***! \********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -3044,7 +3022,7 @@ eval("var $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-j /***/ }), /***/ "./node_modules/core-js/modules/es6.string.repeat.js": -/*!***********************************************************!* +/*!***********************************************************!*\ !*** ./node_modules/core-js/modules/es6.string.repeat.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -3054,7 +3032,7 @@ eval("var $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-j /***/ }), /***/ "./node_modules/core-js/modules/es6.string.small.js": -/*!**********************************************************!* +/*!**********************************************************!*\ !*** ./node_modules/core-js/modules/es6.string.small.js ***! \**********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -3065,7 +3043,7 @@ eval("\n// B.2.3.11 String.prototype.small()\n__webpack_require__(/*! ./_string- /***/ }), /***/ "./node_modules/core-js/modules/es6.string.starts-with.js": -/*!****************************************************************!* +/*!****************************************************************!*\ !*** ./node_modules/core-js/modules/es6.string.starts-with.js ***! \****************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -3076,7 +3054,7 @@ eval("// 21.1.3.18 String.prototype.startsWith(searchString [, position ])\n\nva /***/ }), /***/ "./node_modules/core-js/modules/es6.string.strike.js": -/*!***********************************************************!* +/*!***********************************************************!*\ !*** ./node_modules/core-js/modules/es6.string.strike.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -3087,7 +3065,7 @@ eval("\n// B.2.3.12 String.prototype.strike()\n__webpack_require__(/*! ./_string /***/ }), /***/ "./node_modules/core-js/modules/es6.string.sub.js": -/*!********************************************************!* +/*!********************************************************!*\ !*** ./node_modules/core-js/modules/es6.string.sub.js ***! \********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -3098,7 +3076,7 @@ eval("\n// B.2.3.13 String.prototype.sub()\n__webpack_require__(/*! ./_string-ht /***/ }), /***/ "./node_modules/core-js/modules/es6.string.sup.js": -/*!********************************************************!* +/*!********************************************************!*\ !*** ./node_modules/core-js/modules/es6.string.sup.js ***! \********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -3109,7 +3087,7 @@ eval("\n// B.2.3.14 String.prototype.sup()\n__webpack_require__(/*! ./_string-ht /***/ }), /***/ "./node_modules/core-js/modules/es6.string.trim.js": -/*!*********************************************************!* +/*!*********************************************************!*\ !*** ./node_modules/core-js/modules/es6.string.trim.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -3120,7 +3098,7 @@ eval("\n// 21.1.3.25 String.prototype.trim()\n__webpack_require__(/*! ./_string- /***/ }), /***/ "./node_modules/core-js/modules/es6.symbol.js": -/*!****************************************************!* +/*!****************************************************!*\ !*** ./node_modules/core-js/modules/es6.symbol.js ***! \****************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -3131,7 +3109,7 @@ eval("\n// ECMAScript 6 symbols shim\nvar global = __webpack_require__(/*! ./_gl /***/ }), /***/ "./node_modules/core-js/modules/es6.typed.array-buffer.js": -/*!****************************************************************!* +/*!****************************************************************!*\ !*** ./node_modules/core-js/modules/es6.typed.array-buffer.js ***! \****************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -3142,7 +3120,7 @@ eval("\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/core /***/ }), /***/ "./node_modules/core-js/modules/es6.typed.data-view.js": -/*!*************************************************************!* +/*!*************************************************************!*\ !*** ./node_modules/core-js/modules/es6.typed.data-view.js ***! \*************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -3152,7 +3130,7 @@ eval("var $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-j /***/ }), /***/ "./node_modules/core-js/modules/es6.typed.float32-array.js": -/*!*****************************************************************!* +/*!*****************************************************************!*\ !*** ./node_modules/core-js/modules/es6.typed.float32-array.js ***! \*****************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -3162,7 +3140,7 @@ eval("__webpack_require__(/*! ./_typed-array */ \"./node_modules/core-js/modules /***/ }), /***/ "./node_modules/core-js/modules/es6.typed.float64-array.js": -/*!*****************************************************************!* +/*!*****************************************************************!*\ !*** ./node_modules/core-js/modules/es6.typed.float64-array.js ***! \*****************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -3172,7 +3150,7 @@ eval("__webpack_require__(/*! ./_typed-array */ \"./node_modules/core-js/modules /***/ }), /***/ "./node_modules/core-js/modules/es6.typed.int16-array.js": -/*!***************************************************************!* +/*!***************************************************************!*\ !*** ./node_modules/core-js/modules/es6.typed.int16-array.js ***! \***************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -3182,7 +3160,7 @@ eval("__webpack_require__(/*! ./_typed-array */ \"./node_modules/core-js/modules /***/ }), /***/ "./node_modules/core-js/modules/es6.typed.int32-array.js": -/*!***************************************************************!* +/*!***************************************************************!*\ !*** ./node_modules/core-js/modules/es6.typed.int32-array.js ***! \***************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -3192,7 +3170,7 @@ eval("__webpack_require__(/*! ./_typed-array */ \"./node_modules/core-js/modules /***/ }), /***/ "./node_modules/core-js/modules/es6.typed.int8-array.js": -/*!**************************************************************!* +/*!**************************************************************!*\ !*** ./node_modules/core-js/modules/es6.typed.int8-array.js ***! \**************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -3202,7 +3180,7 @@ eval("__webpack_require__(/*! ./_typed-array */ \"./node_modules/core-js/modules /***/ }), /***/ "./node_modules/core-js/modules/es6.typed.uint16-array.js": -/*!****************************************************************!* +/*!****************************************************************!*\ !*** ./node_modules/core-js/modules/es6.typed.uint16-array.js ***! \****************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -3212,7 +3190,7 @@ eval("__webpack_require__(/*! ./_typed-array */ \"./node_modules/core-js/modules /***/ }), /***/ "./node_modules/core-js/modules/es6.typed.uint32-array.js": -/*!****************************************************************!* +/*!****************************************************************!*\ !*** ./node_modules/core-js/modules/es6.typed.uint32-array.js ***! \****************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -3222,7 +3200,7 @@ eval("__webpack_require__(/*! ./_typed-array */ \"./node_modules/core-js/modules /***/ }), /***/ "./node_modules/core-js/modules/es6.typed.uint8-array.js": -/*!***************************************************************!* +/*!***************************************************************!*\ !*** ./node_modules/core-js/modules/es6.typed.uint8-array.js ***! \***************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -3232,7 +3210,7 @@ eval("__webpack_require__(/*! ./_typed-array */ \"./node_modules/core-js/modules /***/ }), /***/ "./node_modules/core-js/modules/es6.typed.uint8-clamped-array.js": -/*!***********************************************************************!* +/*!***********************************************************************!*\ !*** ./node_modules/core-js/modules/es6.typed.uint8-clamped-array.js ***! \***********************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -3242,7 +3220,7 @@ eval("__webpack_require__(/*! ./_typed-array */ \"./node_modules/core-js/modules /***/ }), /***/ "./node_modules/core-js/modules/es6.weak-map.js": -/*!******************************************************!* +/*!******************************************************!*\ !*** ./node_modules/core-js/modules/es6.weak-map.js ***! \******************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -3253,7 +3231,7 @@ eval("\nvar global = __webpack_require__(/*! ./_global */ \"./node_modules/core- /***/ }), /***/ "./node_modules/core-js/modules/es6.weak-set.js": -/*!******************************************************!* +/*!******************************************************!*\ !*** ./node_modules/core-js/modules/es6.weak-set.js ***! \******************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -3264,7 +3242,7 @@ eval("\nvar weak = __webpack_require__(/*! ./_collection-weak */ \"./node_module /***/ }), /***/ "./node_modules/core-js/modules/es7.array.flat-map.js": -/*!************************************************************!* +/*!************************************************************!*\ !*** ./node_modules/core-js/modules/es7.array.flat-map.js ***! \************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -3275,7 +3253,7 @@ eval("\n// https://tc39.github.io/proposal-flatMap/#sec-Array.prototype.flatMap\ /***/ }), /***/ "./node_modules/core-js/modules/es7.array.includes.js": -/*!************************************************************!* +/*!************************************************************!*\ !*** ./node_modules/core-js/modules/es7.array.includes.js ***! \************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -3286,7 +3264,7 @@ eval("\n// https://github.com/tc39/Array.prototype.includes\nvar $export = __web /***/ }), /***/ "./node_modules/core-js/modules/es7.object.entries.js": -/*!************************************************************!* +/*!************************************************************!*\ !*** ./node_modules/core-js/modules/es7.object.entries.js ***! \************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -3296,7 +3274,7 @@ eval("// https://github.com/tc39/proposal-object-values-entries\nvar $export = _ /***/ }), /***/ "./node_modules/core-js/modules/es7.object.get-own-property-descriptors.js": -/*!*********************************************************************************!* +/*!*********************************************************************************!*\ !*** ./node_modules/core-js/modules/es7.object.get-own-property-descriptors.js ***! \*********************************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -3306,7 +3284,7 @@ eval("// https://github.com/tc39/proposal-object-getownpropertydescriptors\nvar /***/ }), /***/ "./node_modules/core-js/modules/es7.object.values.js": -/*!***********************************************************!* +/*!***********************************************************!*\ !*** ./node_modules/core-js/modules/es7.object.values.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -3316,7 +3294,7 @@ eval("// https://github.com/tc39/proposal-object-values-entries\nvar $export = _ /***/ }), /***/ "./node_modules/core-js/modules/es7.promise.finally.js": -/*!*************************************************************!* +/*!*************************************************************!*\ !*** ./node_modules/core-js/modules/es7.promise.finally.js ***! \*************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -3327,7 +3305,7 @@ eval("// https://github.com/tc39/proposal-promise-finally\n\nvar $export = __web /***/ }), /***/ "./node_modules/core-js/modules/es7.string.pad-end.js": -/*!************************************************************!* +/*!************************************************************!*\ !*** ./node_modules/core-js/modules/es7.string.pad-end.js ***! \************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -3338,7 +3316,7 @@ eval("\n// https://github.com/tc39/proposal-string-pad-start-end\nvar $export = /***/ }), /***/ "./node_modules/core-js/modules/es7.string.pad-start.js": -/*!**************************************************************!* +/*!**************************************************************!*\ !*** ./node_modules/core-js/modules/es7.string.pad-start.js ***! \**************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -3349,7 +3327,7 @@ eval("\n// https://github.com/tc39/proposal-string-pad-start-end\nvar $export = /***/ }), /***/ "./node_modules/core-js/modules/es7.string.trim-left.js": -/*!**************************************************************!* +/*!**************************************************************!*\ !*** ./node_modules/core-js/modules/es7.string.trim-left.js ***! \**************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -3360,7 +3338,7 @@ eval("\n// https://github.com/sebmarkbage/ecmascript-string-left-right-trim\n__w /***/ }), /***/ "./node_modules/core-js/modules/es7.string.trim-right.js": -/*!***************************************************************!* +/*!***************************************************************!*\ !*** ./node_modules/core-js/modules/es7.string.trim-right.js ***! \***************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -3371,7 +3349,7 @@ eval("\n// https://github.com/sebmarkbage/ecmascript-string-left-right-trim\n__w /***/ }), /***/ "./node_modules/core-js/modules/es7.symbol.async-iterator.js": -/*!*******************************************************************!* +/*!*******************************************************************!*\ !*** ./node_modules/core-js/modules/es7.symbol.async-iterator.js ***! \*******************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -3381,7 +3359,7 @@ eval("__webpack_require__(/*! ./_wks-define */ \"./node_modules/core-js/modules/ /***/ }), /***/ "./node_modules/core-js/modules/web.dom.iterable.js": -/*!**********************************************************!* +/*!**********************************************************!*\ !*** ./node_modules/core-js/modules/web.dom.iterable.js ***! \**********************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -3391,7 +3369,7 @@ eval("var $iterators = __webpack_require__(/*! ./es6.array.iterator */ \"./node_ /***/ }), /***/ "./node_modules/core-js/modules/web.immediate.js": -/*!*******************************************************!* +/*!*******************************************************!*\ !*** ./node_modules/core-js/modules/web.immediate.js ***! \*******************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -3401,7 +3379,7 @@ eval("var $export = __webpack_require__(/*! ./_export */ \"./node_modules/core-j /***/ }), /***/ "./node_modules/core-js/modules/web.timers.js": -/*!****************************************************!* +/*!****************************************************!*\ !*** ./node_modules/core-js/modules/web.timers.js ***! \****************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { @@ -3411,7 +3389,7 @@ eval("// ie9- setTimeout & setInterval additional parameters fix\nvar global = _ /***/ }), /***/ "./node_modules/core-js/web/index.js": -/*!*******************************************!* +/*!*******************************************!*\ !*** ./node_modules/core-js/web/index.js ***! \*******************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -3421,40 +3399,40 @@ eval("__webpack_require__(/*! ../modules/web.timers */ \"./node_modules/core-js/ /***/ }), /***/ "./node_modules/css-loader/dist/cjs.js!./node_modules/codemirror/addon/lint/lint.css": -/*!*******************************************************************************************!* +/*!*******************************************************************************************!*\ !*** ./node_modules/css-loader/dist/cjs.js!./node_modules/codemirror/addon/lint/lint.css ***! \*******************************************************************************************/ /***/ ((module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => __WEBPACK_DEFAULT_EXPORT__\n/* harmony export */ });\n/* harmony import */ var _css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../css-loader/dist/runtime/cssWithMappingToString.js */ \"./node_modules/css-loader/dist/runtime/cssWithMappingToString.js\");\n/* harmony import */ var _css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"/* The lint marker gutter */\\n.CodeMirror-lint-markers {\\n width: 16px;\\n}\\n\\n.CodeMirror-lint-tooltip {\\n background-color: #ffd;\\n border: 1px solid black;\\n border-radius: 4px 4px 4px 4px;\\n color: black;\\n font-family: monospace;\\n font-size: 10pt;\\n overflow: hidden;\\n padding: 2px 5px;\\n position: fixed;\\n white-space: pre;\\n white-space: pre-wrap;\\n z-index: 100;\\n max-width: 600px;\\n opacity: 0;\\n transition: opacity .4s;\\n -moz-transition: opacity .4s;\\n -webkit-transition: opacity .4s;\\n -o-transition: opacity .4s;\\n -ms-transition: opacity .4s;\\n}\\n\\n.CodeMirror-lint-mark {\\n background-position: left bottom;\\n background-repeat: repeat-x;\\n}\\n\\n.CodeMirror-lint-mark-warning {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=\\\");\\n}\\n\\n.CodeMirror-lint-mark-error {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==\\\");\\n}\\n\\n.CodeMirror-lint-marker {\\n background-position: center center;\\n background-repeat: no-repeat;\\n cursor: pointer;\\n display: inline-block;\\n height: 16px;\\n width: 16px;\\n vertical-align: middle;\\n position: relative;\\n}\\n\\n.CodeMirror-lint-message {\\n padding-left: 18px;\\n background-position: top left;\\n background-repeat: no-repeat;\\n}\\n\\n.CodeMirror-lint-marker-warning, .CodeMirror-lint-message-warning {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=\\\");\\n}\\n\\n.CodeMirror-lint-marker-error, .CodeMirror-lint-message-error {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=\\\");\\n}\\n\\n.CodeMirror-lint-marker-multiple {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC\\\");\\n background-repeat: no-repeat;\\n background-position: right bottom;\\n width: 100%; height: 100%;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/codemirror/addon/lint/lint.css\"],\"names\":[],\"mappings\":\"AAAA,2BAA2B;AAC3B;EACE,WAAW;AACb;;AAEA;EACE,sBAAsB;EACtB,uBAAuB;EACvB,8BAA8B;EAC9B,YAAY;EACZ,sBAAsB;EACtB,eAAe;EACf,gBAAgB;EAChB,gBAAgB;EAChB,eAAe;EACf,gBAAgB;EAChB,qBAAqB;EACrB,YAAY;EACZ,gBAAgB;EAChB,UAAU;EACV,uBAAuB;EACvB,4BAA4B;EAC5B,+BAA+B;EAC/B,0BAA0B;EAC1B,2BAA2B;AAC7B;;AAEA;EACE,gCAAgC;EAChC,2BAA2B;AAC7B;;AAEA;EACE,+UAA+U;AACjV;;AAEA;EACE,mTAAmT;AACrT;;AAEA;EACE,kCAAkC;EAClC,4BAA4B;EAC5B,eAAe;EACf,qBAAqB;EACrB,YAAY;EACZ,WAAW;EACX,sBAAsB;EACtB,kBAAkB;AACpB;;AAEA;EACE,kBAAkB;EAClB,6BAA6B;EAC7B,4BAA4B;AAC9B;;AAEA;EACE,uWAAuW;AACzW;;AAEA;EACE,mTAAmT;AACrT;;AAEA;EACE,uNAAuN;EACvN,4BAA4B;EAC5B,iCAAiC;EACjC,WAAW,EAAE,YAAY;AAC3B\",\"sourcesContent\":[\"/* The lint marker gutter */\\n.CodeMirror-lint-markers {\\n width: 16px;\\n}\\n\\n.CodeMirror-lint-tooltip {\\n background-color: #ffd;\\n border: 1px solid black;\\n border-radius: 4px 4px 4px 4px;\\n color: black;\\n font-family: monospace;\\n font-size: 10pt;\\n overflow: hidden;\\n padding: 2px 5px;\\n position: fixed;\\n white-space: pre;\\n white-space: pre-wrap;\\n z-index: 100;\\n max-width: 600px;\\n opacity: 0;\\n transition: opacity .4s;\\n -moz-transition: opacity .4s;\\n -webkit-transition: opacity .4s;\\n -o-transition: opacity .4s;\\n -ms-transition: opacity .4s;\\n}\\n\\n.CodeMirror-lint-mark {\\n background-position: left bottom;\\n background-repeat: repeat-x;\\n}\\n\\n.CodeMirror-lint-mark-warning {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=\\\");\\n}\\n\\n.CodeMirror-lint-mark-error {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==\\\");\\n}\\n\\n.CodeMirror-lint-marker {\\n background-position: center center;\\n background-repeat: no-repeat;\\n cursor: pointer;\\n display: inline-block;\\n height: 16px;\\n width: 16px;\\n vertical-align: middle;\\n position: relative;\\n}\\n\\n.CodeMirror-lint-message {\\n padding-left: 18px;\\n background-position: top left;\\n background-repeat: no-repeat;\\n}\\n\\n.CodeMirror-lint-marker-warning, .CodeMirror-lint-message-warning {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=\\\");\\n}\\n\\n.CodeMirror-lint-marker-error, .CodeMirror-lint-message-error {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=\\\");\\n}\\n\\n.CodeMirror-lint-marker-multiple {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC\\\");\\n background-repeat: no-repeat;\\n background-position: right bottom;\\n width: 100%; height: 100%;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vbm9kZV9tb2R1bGVzL2NvZGVtaXJyb3IvYWRkb24vbGludC9saW50LmNzcz9jMzA1Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7QUFDK0c7QUFDN0I7QUFDbEYsOEJBQThCLHNFQUEyQixDQUFDLDJGQUFxQztBQUMvRjtBQUNBLGtHQUFrRyxnQkFBZ0IsR0FBRyw4QkFBOEIsMkJBQTJCLDRCQUE0QixtQ0FBbUMsaUJBQWlCLDJCQUEyQixvQkFBb0IscUJBQXFCLHFCQUFxQixvQkFBb0IscUJBQXFCLDBCQUEwQixpQkFBaUIscUJBQXFCLGVBQWUsNEJBQTRCLGlDQUFpQyxvQ0FBb0MsK0JBQStCLGdDQUFnQyxHQUFHLDJCQUEyQixxQ0FBcUMsZ0NBQWdDLEdBQUcsbUNBQW1DLDJDQUEyQywyU0FBMlMsR0FBRyxpQ0FBaUMsMkNBQTJDLCtRQUErUSxHQUFHLDZCQUE2Qix1Q0FBdUMsaUNBQWlDLG9CQUFvQiwwQkFBMEIsaUJBQWlCLGdCQUFnQiwyQkFBMkIsdUJBQXVCLEdBQUcsOEJBQThCLHVCQUF1QixrQ0FBa0MsaUNBQWlDLEdBQUcsdUVBQXVFLDJDQUEyQyxtVUFBbVUsR0FBRyxtRUFBbUUsMkNBQTJDLCtRQUErUSxHQUFHLHNDQUFzQywyQ0FBMkMsbUxBQW1MLGlDQUFpQyxzQ0FBc0MsZ0JBQWdCLGNBQWMsR0FBRyxTQUFTLHFIQUFxSCxNQUFNLFVBQVUsTUFBTSxLQUFLLFlBQVksYUFBYSxhQUFhLFdBQVcsWUFBWSxXQUFXLFlBQVksYUFBYSxXQUFXLFlBQVksYUFBYSxXQUFXLFlBQVksV0FBVyxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsT0FBTyxLQUFLLFlBQVksYUFBYSxPQUFPLEtBQUssWUFBWSxPQUFPLEtBQUssWUFBWSxPQUFPLEtBQUssWUFBWSxhQUFhLFdBQVcsWUFBWSxXQUFXLFVBQVUsWUFBWSxhQUFhLE9BQU8sS0FBSyxZQUFZLGFBQWEsYUFBYSxPQUFPLEtBQUssWUFBWSxPQUFPLEtBQUssWUFBWSxPQUFPLEtBQUssWUFBWSxhQUFhLGFBQWEscUJBQXFCLGtGQUFrRixnQkFBZ0IsR0FBRyw4QkFBOEIsMkJBQTJCLDRCQUE0QixtQ0FBbUMsaUJBQWlCLDJCQUEyQixvQkFBb0IscUJBQXFCLHFCQUFxQixvQkFBb0IscUJBQXFCLDBCQUEwQixpQkFBaUIscUJBQXFCLGVBQWUsNEJBQTRCLGlDQUFpQyxvQ0FBb0MsK0JBQStCLGdDQUFnQyxHQUFHLDJCQUEyQixxQ0FBcUMsZ0NBQWdDLEdBQUcsbUNBQW1DLDJDQUEyQywyU0FBMlMsR0FBRyxpQ0FBaUMsMkNBQTJDLCtRQUErUSxHQUFHLDZCQUE2Qix1Q0FBdUMsaUNBQWlDLG9CQUFvQiwwQkFBMEIsaUJBQWlCLGdCQUFnQiwyQkFBMkIsdUJBQXVCLEdBQUcsOEJBQThCLHVCQUF1QixrQ0FBa0MsaUNBQWlDLEdBQUcsdUVBQXVFLDJDQUEyQyxtVUFBbVUsR0FBRyxtRUFBbUUsMkNBQTJDLCtRQUErUSxHQUFHLHNDQUFzQywyQ0FBMkMsbUxBQW1MLGlDQUFpQyxzQ0FBc0MsZ0JBQWdCLGNBQWMsR0FBRyxxQkFBcUI7QUFDM2xOO0FBQ0EsaUVBQWUsdUJBQXVCLEVBQUMiLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL25vZGVfbW9kdWxlcy9jb2RlbWlycm9yL2FkZG9uL2xpbnQvbGludC5jc3MuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvY3NzV2l0aE1hcHBpbmdUb1N0cmluZy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgXCIvKiBUaGUgbGludCBtYXJrZXIgZ3V0dGVyICovXFxuLkNvZGVNaXJyb3ItbGludC1tYXJrZXJzIHtcXG4gIHdpZHRoOiAxNnB4O1xcbn1cXG5cXG4uQ29kZU1pcnJvci1saW50LXRvb2x0aXAge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZDtcXG4gIGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrO1xcbiAgYm9yZGVyLXJhZGl1czogNHB4IDRweCA0cHggNHB4O1xcbiAgY29sb3I6IGJsYWNrO1xcbiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTtcXG4gIGZvbnQtc2l6ZTogMTBwdDtcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxuICBwYWRkaW5nOiAycHggNXB4O1xcbiAgcG9zaXRpb246IGZpeGVkO1xcbiAgd2hpdGUtc3BhY2U6IHByZTtcXG4gIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcXG4gIHotaW5kZXg6IDEwMDtcXG4gIG1heC13aWR0aDogNjAwcHg7XFxuICBvcGFjaXR5OiAwO1xcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAuNHM7XFxuICAtbW96LXRyYW5zaXRpb246IG9wYWNpdHkgLjRzO1xcbiAgLXdlYmtpdC10cmFuc2l0aW9uOiBvcGFjaXR5IC40cztcXG4gIC1vLXRyYW5zaXRpb246IG9wYWNpdHkgLjRzO1xcbiAgLW1zLXRyYW5zaXRpb246IG9wYWNpdHkgLjRzO1xcbn1cXG5cXG4uQ29kZU1pcnJvci1saW50LW1hcmsge1xcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogbGVmdCBib3R0b207XFxuICBiYWNrZ3JvdW5kLXJlcGVhdDogcmVwZWF0LXg7XFxufVxcblxcbi5Db2RlTWlycm9yLWxpbnQtbWFyay13YXJuaW5nIHtcXG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChcXFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBUUFBQUFEQ0FZQUFBQzA5SzdHQUFBQUFYTlNSMElBcnM0YzZRQUFBQVppUzBkRUFQOEEvd0Qvb0wybmt3QUFBQWx3U0ZsekFBQUxFd0FBQ3hNQkFKcWNHQUFBQUFkMFNVMUZCOXNKRmhRWEViaFRnN1lBQUFBWmRFVllkRU52YlcxbGJuUUFRM0psWVhSbFpDQjNhWFJvSUVkSlRWQlhnUTRYQUFBQU1rbEVRVlFJMTJOa2dJSXZKM1FYTWpBd2RETitPYUVieXNEQTRNUEF3TkROd01Dd2lPSExDZDF6WDA3bzZrQlZHUUVBS0JBTnRvYnNrTk1BQUFBQVNVVk9SSzVDWUlJPVxcXCIpO1xcbn1cXG5cXG4uQ29kZU1pcnJvci1saW50LW1hcmstZXJyb3Ige1xcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFxcXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFRQUFBQURDQVlBQUFDMDlLN0dBQUFBQVhOU1IwSUFyczRjNlFBQUFBWmlTMGRFQVA4QS93RC9vTDJua3dBQUFBbHdTRmx6QUFBTEV3QUFDeE1CQUpxY0dBQUFBQWQwU1UxRkI5c0pEdzRjT0NXMS9LSUFBQUFaZEVWWWRFTnZiVzFsYm5RQVEzSmxZWFJsWkNCM2FYUm9JRWRKVFZCWGdRNFhBQUFBSEVsRVFWUUkxMk5nZ0lML0RBei9HZEE1L3hrWS9xUEtNREF3QUFETFp3ZjVydm0rTFFBQUFBQkpSVTVFcmtKZ2dnPT1cXFwiKTtcXG59XFxuXFxuLkNvZGVNaXJyb3ItbGludC1tYXJrZXIge1xcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIGNlbnRlcjtcXG4gIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICBoZWlnaHQ6IDE2cHg7XFxuICB3aWR0aDogMTZweDtcXG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxufVxcblxcbi5Db2RlTWlycm9yLWxpbnQtbWVzc2FnZSB7XFxuICBwYWRkaW5nLWxlZnQ6IDE4cHg7XFxuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiB0b3AgbGVmdDtcXG4gIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XFxufVxcblxcbi5Db2RlTWlycm9yLWxpbnQtbWFya2VyLXdhcm5pbmcsIC5Db2RlTWlycm9yLWxpbnQtbWVzc2FnZS13YXJuaW5nIHtcXG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChcXFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FNQUFBQW9MUTlUQUFBQU5sQk1WRVgvdXdEdnJ3RC91d0QvdXdEL3V3RC91d0QvdXdEL3V3RC91d0Q2dHdEL3V3QUFBQUR1cndEMnRRRDd1QUQrdWdBQUFBRC91d0RobWVUUkFBQUFESFJTVGxNSjhtTjFFWWNibWlpeGdBQ203V2J1QUFBQVZrbEVRVlI0Mm4zUFVRcUFJQkJGVVUxTExjM3UvamRiT0pvVzFQMDhEQTlHYmE4K1lXSjZnTkpvTllJQnpBQTJjaEJ0aDVrTG1HOVlVb0cwTkhBVXdGWHdPOUx1QlFMMWdpQ1FiOGdDOU9ybzJ2cDVybmNDSVk4TDh1RXg1WmtBQUFBQVNVVk9SSzVDWUlJPVxcXCIpO1xcbn1cXG5cXG4uQ29kZU1pcnJvci1saW50LW1hcmtlci1lcnJvciwgLkNvZGVNaXJyb3ItbGludC1tZXNzYWdlLWVycm9yIHtcXG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChcXFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FNQUFBQW9MUTlUQUFBQUhsQk1WRVc3QUFDN0FBQ3hBQUM3QUFDN0FBQUFBQUM0QUFDNUFBRC8vLys3QUFBVWRjbHBBQUFBQm5SU1RsTVhuT1JTaXdDSzBaS1NBQUFBVFVsRVFWUjQybVdQT1E3QVFBZ0R1UUx4L3o4Y3NZUm1QUklGSXdSR25vc1JycGFtdmtLaTBGVElpTUFTUjNoaEtXK2hBTjYvdElXaHU5UERXaVRHTkVrVHRJT3VjQTVPeXI5Y2tQZ0FXbTBHUEJvZzZ2NEFBQUFBU1VWT1JLNUNZSUk9XFxcIik7XFxufVxcblxcbi5Db2RlTWlycm9yLWxpbnQtbWFya2VyLW11bHRpcGxlIHtcXG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChcXFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBY0FBQUFIQ0FNQUFBRHpqS2ZoQUFBQUNWQk1WRVVBQUFBQUFBQy92NzkxNGt5SEFBQUFBWFJTVGxNQVFPYllaZ0FBQUNOSlJFRlVlTm8xaW9FSkFBQUl3bXovSDkwaUZGU0dKZ0ZNZTNnYUxaMG9kKzkvQVFaMEFEb3NiWXJhQUFBQUFFbEZUa1N1UW1DQ1xcXCIpO1xcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcXG4gIGJhY2tncm91bmQtcG9zaXRpb246IHJpZ2h0IGJvdHRvbTtcXG4gIHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7XFxufVxcblwiLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9jb2RlbWlycm9yL2FkZG9uL2xpbnQvbGludC5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUEsMkJBQTJCO0FBQzNCO0VBQ0UsV0FBVztBQUNiOztBQUVBO0VBQ0Usc0JBQXNCO0VBQ3RCLHVCQUF1QjtFQUN2Qiw4QkFBOEI7RUFDOUIsWUFBWTtFQUNaLHNCQUFzQjtFQUN0QixlQUFlO0VBQ2YsZ0JBQWdCO0VBQ2hCLGdCQUFnQjtFQUNoQixlQUFlO0VBQ2YsZ0JBQWdCO0VBQ2hCLHFCQUFxQjtFQUNyQixZQUFZO0VBQ1osZ0JBQWdCO0VBQ2hCLFVBQVU7RUFDVix1QkFBdUI7RUFDdkIsNEJBQTRCO0VBQzVCLCtCQUErQjtFQUMvQiwwQkFBMEI7RUFDMUIsMkJBQTJCO0FBQzdCOztBQUVBO0VBQ0UsZ0NBQWdDO0VBQ2hDLDJCQUEyQjtBQUM3Qjs7QUFFQTtFQUNFLCtVQUErVTtBQUNqVjs7QUFFQTtFQUNFLG1UQUFtVDtBQUNyVDs7QUFFQTtFQUNFLGtDQUFrQztFQUNsQyw0QkFBNEI7RUFDNUIsZUFBZTtFQUNmLHFCQUFxQjtFQUNyQixZQUFZO0VBQ1osV0FBVztFQUNYLHNCQUFzQjtFQUN0QixrQkFBa0I7QUFDcEI7O0FBRUE7RUFDRSxrQkFBa0I7RUFDbEIsNkJBQTZCO0VBQzdCLDRCQUE0QjtBQUM5Qjs7QUFFQTtFQUNFLHVXQUF1VztBQUN6Vzs7QUFFQTtFQUNFLG1UQUFtVDtBQUNyVDs7QUFFQTtFQUNFLHVOQUF1TjtFQUN2Tiw0QkFBNEI7RUFDNUIsaUNBQWlDO0VBQ2pDLFdBQVcsRUFBRSxZQUFZO0FBQzNCXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi8qIFRoZSBsaW50IG1hcmtlciBndXR0ZXIgKi9cXG4uQ29kZU1pcnJvci1saW50LW1hcmtlcnMge1xcbiAgd2lkdGg6IDE2cHg7XFxufVxcblxcbi5Db2RlTWlycm9yLWxpbnQtdG9vbHRpcCB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZkO1xcbiAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7XFxuICBib3JkZXItcmFkaXVzOiA0cHggNHB4IDRweCA0cHg7XFxuICBjb2xvcjogYmxhY2s7XFxuICBmb250LWZhbWlseTogbW9ub3NwYWNlO1xcbiAgZm9udC1zaXplOiAxMHB0O1xcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcXG4gIHBhZGRpbmc6IDJweCA1cHg7XFxuICBwb3NpdGlvbjogZml4ZWQ7XFxuICB3aGl0ZS1zcGFjZTogcHJlO1xcbiAgd2hpdGUtc3BhY2U6IHByZS13cmFwO1xcbiAgei1pbmRleDogMTAwO1xcbiAgbWF4LXdpZHRoOiA2MDBweDtcXG4gIG9wYWNpdHk6IDA7XFxuICB0cmFuc2l0aW9uOiBvcGFjaXR5IC40cztcXG4gIC1tb3otdHJhbnNpdGlvbjogb3BhY2l0eSAuNHM7XFxuICAtd2Via2l0LXRyYW5zaXRpb246IG9wYWNpdHkgLjRzO1xcbiAgLW8tdHJhbnNpdGlvbjogb3BhY2l0eSAuNHM7XFxuICAtbXMtdHJhbnNpdGlvbjogb3BhY2l0eSAuNHM7XFxufVxcblxcbi5Db2RlTWlycm9yLWxpbnQtbWFyayB7XFxuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBsZWZ0IGJvdHRvbTtcXG4gIGJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteDtcXG59XFxuXFxuLkNvZGVNaXJyb3ItbGludC1tYXJrLXdhcm5pbmcge1xcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFxcXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFRQUFBQURDQVlBQUFDMDlLN0dBQUFBQVhOU1IwSUFyczRjNlFBQUFBWmlTMGRFQVA4QS93RC9vTDJua3dBQUFBbHdTRmx6QUFBTEV3QUFDeE1CQUpxY0dBQUFBQWQwU1UxRkI5c0pGaFFYRWJoVGc3WUFBQUFaZEVWWWRFTnZiVzFsYm5RQVEzSmxZWFJsWkNCM2FYUm9JRWRKVFZCWGdRNFhBQUFBTWtsRVFWUUkxMk5rZ0lJdkozUVhNakF3ZEROK09hRWJ5c0RBNE1QQXdORE53TUN3aU9ITENkMXpYMDdvNmtCVkdRRUFLQkFOdG9ic2tOTUFBQUFBU1VWT1JLNUNZSUk9XFxcIik7XFxufVxcblxcbi5Db2RlTWlycm9yLWxpbnQtbWFyay1lcnJvciB7XFxuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXFxcImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQVFBQUFBRENBWUFBQUMwOUs3R0FBQUFBWE5TUjBJQXJzNGM2UUFBQUFaaVMwZEVBUDhBL3dEL29MMm5rd0FBQUFsd1NGbHpBQUFMRXdBQUN4TUJBSnFjR0FBQUFBZDBTVTFGQjlzSkR3NGNPQ1cxL0tJQUFBQVpkRVZZZEVOdmJXMWxiblFBUTNKbFlYUmxaQ0IzYVhSb0lFZEpUVkJYZ1E0WEFBQUFIRWxFUVZRSTEyTmdnSUwvREF6L0dkQTUveGtZL3FQS01EQXdBQURMWndmNXJ2bStMUUFBQUFCSlJVNUVya0pnZ2c9PVxcXCIpO1xcbn1cXG5cXG4uQ29kZU1pcnJvci1saW50LW1hcmtlciB7XFxuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgY2VudGVyO1xcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gIGhlaWdodDogMTZweDtcXG4gIHdpZHRoOiAxNnB4O1xcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG59XFxuXFxuLkNvZGVNaXJyb3ItbGludC1tZXNzYWdlIHtcXG4gIHBhZGRpbmctbGVmdDogMThweDtcXG4gIGJhY2tncm91bmQtcG9zaXRpb246IHRvcCBsZWZ0O1xcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcXG59XFxuXFxuLkNvZGVNaXJyb3ItbGludC1tYXJrZXItd2FybmluZywgLkNvZGVNaXJyb3ItbGludC1tZXNzYWdlLXdhcm5pbmcge1xcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFxcXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQU1BQUFBb0xROVRBQUFBTmxCTVZFWC91d0R2cndEL3V3RC91d0QvdXdEL3V3RC91d0QvdXdEL3V3RDZ0d0QvdXdBQUFBRHVyd0QydFFEN3VBRCt1Z0FBQUFEL3V3RGhtZVRSQUFBQURIUlNUbE1KOG1OMUVZY2JtaWl4Z0FDbTdXYnVBQUFBVmtsRVFWUjQybjNQVVFxQUlCQkZVVTFMTGMzdS9qZGJPSm9XMVAwOERBOUdiYTgrWVdKNmdOSm9OWUlCekFBMmNoQnRoNWtMbUc5WVVvRzBOSEFVd0ZYd085THVCUUwxZ2lDUWI4Z0M5T3JvMnZwNXJuY0NJWThMOHVFeDVaa0FBQUFBU1VWT1JLNUNZSUk9XFxcIik7XFxufVxcblxcbi5Db2RlTWlycm9yLWxpbnQtbWFya2VyLWVycm9yLCAuQ29kZU1pcnJvci1saW50LW1lc3NhZ2UtZXJyb3Ige1xcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFxcXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQU1BQUFBb0xROVRBQUFBSGxCTVZFVzdBQUM3QUFDeEFBQzdBQUM3QUFBQUFBQzRBQUM1QUFELy8vKzdBQUFVZGNscEFBQUFCblJTVGxNWG5PUlNpd0NLMFpLU0FBQUFUVWxFUVZSNDJtV1BPUTdBUUFnRHVRTHgvejhjc1lSbVBSSUZJd1JHbm9zUnJwYW12a0tpMEZUSWlNQVNSM2hoS1craEFONi90SVdodTlQRFdpVEdORWtUdElPdWNBNU95cjlja1BnQVdtMEdQQm9nNnY0QUFBQUFTVVZPUks1Q1lJST1cXFwiKTtcXG59XFxuXFxuLkNvZGVNaXJyb3ItbGludC1tYXJrZXItbXVsdGlwbGUge1xcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFxcXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFjQUFBQUhDQU1BQUFEempLZmhBQUFBQ1ZCTVZFVUFBQUFBQUFDL3Y3OTE0a3lIQUFBQUFYUlNUbE1BUU9iWVpnQUFBQ05KUkVGVWVObzFpb0VKQUFBSXdtei9IOTBpRkZTR0pnRk1lM2dhTFowb2QrOS9BUVowQURvc2JZcmFBQUFBQUVsRlRrU3VRbUNDXFxcIik7XFxuICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogcmlnaHQgYm90dG9tO1xcbiAgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTtcXG59XFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/css-loader/dist/cjs.js!./node_modules/codemirror/addon/lint/lint.css\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../css-loader/dist/runtime/cssWithMappingToString.js */ \"./node_modules/css-loader/dist/runtime/cssWithMappingToString.js\");\n/* harmony import */ var _css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"/* The lint marker gutter */\\n.CodeMirror-lint-markers {\\n width: 16px;\\n}\\n\\n.CodeMirror-lint-tooltip {\\n background-color: #ffd;\\n border: 1px solid black;\\n border-radius: 4px 4px 4px 4px;\\n color: black;\\n font-family: monospace;\\n font-size: 10pt;\\n overflow: hidden;\\n padding: 2px 5px;\\n position: fixed;\\n white-space: pre;\\n white-space: pre-wrap;\\n z-index: 100;\\n max-width: 600px;\\n opacity: 0;\\n transition: opacity .4s;\\n -moz-transition: opacity .4s;\\n -webkit-transition: opacity .4s;\\n -o-transition: opacity .4s;\\n -ms-transition: opacity .4s;\\n}\\n\\n.CodeMirror-lint-mark {\\n background-position: left bottom;\\n background-repeat: repeat-x;\\n}\\n\\n.CodeMirror-lint-mark-warning {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=\\\");\\n}\\n\\n.CodeMirror-lint-mark-error {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==\\\");\\n}\\n\\n.CodeMirror-lint-marker {\\n background-position: center center;\\n background-repeat: no-repeat;\\n cursor: pointer;\\n display: inline-block;\\n height: 16px;\\n width: 16px;\\n vertical-align: middle;\\n position: relative;\\n}\\n\\n.CodeMirror-lint-message {\\n padding-left: 18px;\\n background-position: top left;\\n background-repeat: no-repeat;\\n}\\n\\n.CodeMirror-lint-marker-warning, .CodeMirror-lint-message-warning {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=\\\");\\n}\\n\\n.CodeMirror-lint-marker-error, .CodeMirror-lint-message-error {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=\\\");\\n}\\n\\n.CodeMirror-lint-marker-multiple {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC\\\");\\n background-repeat: no-repeat;\\n background-position: right bottom;\\n width: 100%; height: 100%;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/codemirror/addon/lint/lint.css\"],\"names\":[],\"mappings\":\"AAAA,2BAA2B;AAC3B;EACE,WAAW;AACb;;AAEA;EACE,sBAAsB;EACtB,uBAAuB;EACvB,8BAA8B;EAC9B,YAAY;EACZ,sBAAsB;EACtB,eAAe;EACf,gBAAgB;EAChB,gBAAgB;EAChB,eAAe;EACf,gBAAgB;EAChB,qBAAqB;EACrB,YAAY;EACZ,gBAAgB;EAChB,UAAU;EACV,uBAAuB;EACvB,4BAA4B;EAC5B,+BAA+B;EAC/B,0BAA0B;EAC1B,2BAA2B;AAC7B;;AAEA;EACE,gCAAgC;EAChC,2BAA2B;AAC7B;;AAEA;EACE,+UAA+U;AACjV;;AAEA;EACE,mTAAmT;AACrT;;AAEA;EACE,kCAAkC;EAClC,4BAA4B;EAC5B,eAAe;EACf,qBAAqB;EACrB,YAAY;EACZ,WAAW;EACX,sBAAsB;EACtB,kBAAkB;AACpB;;AAEA;EACE,kBAAkB;EAClB,6BAA6B;EAC7B,4BAA4B;AAC9B;;AAEA;EACE,uWAAuW;AACzW;;AAEA;EACE,mTAAmT;AACrT;;AAEA;EACE,uNAAuN;EACvN,4BAA4B;EAC5B,iCAAiC;EACjC,WAAW,EAAE,YAAY;AAC3B\",\"sourcesContent\":[\"/* The lint marker gutter */\\n.CodeMirror-lint-markers {\\n width: 16px;\\n}\\n\\n.CodeMirror-lint-tooltip {\\n background-color: #ffd;\\n border: 1px solid black;\\n border-radius: 4px 4px 4px 4px;\\n color: black;\\n font-family: monospace;\\n font-size: 10pt;\\n overflow: hidden;\\n padding: 2px 5px;\\n position: fixed;\\n white-space: pre;\\n white-space: pre-wrap;\\n z-index: 100;\\n max-width: 600px;\\n opacity: 0;\\n transition: opacity .4s;\\n -moz-transition: opacity .4s;\\n -webkit-transition: opacity .4s;\\n -o-transition: opacity .4s;\\n -ms-transition: opacity .4s;\\n}\\n\\n.CodeMirror-lint-mark {\\n background-position: left bottom;\\n background-repeat: repeat-x;\\n}\\n\\n.CodeMirror-lint-mark-warning {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=\\\");\\n}\\n\\n.CodeMirror-lint-mark-error {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==\\\");\\n}\\n\\n.CodeMirror-lint-marker {\\n background-position: center center;\\n background-repeat: no-repeat;\\n cursor: pointer;\\n display: inline-block;\\n height: 16px;\\n width: 16px;\\n vertical-align: middle;\\n position: relative;\\n}\\n\\n.CodeMirror-lint-message {\\n padding-left: 18px;\\n background-position: top left;\\n background-repeat: no-repeat;\\n}\\n\\n.CodeMirror-lint-marker-warning, .CodeMirror-lint-message-warning {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=\\\");\\n}\\n\\n.CodeMirror-lint-marker-error, .CodeMirror-lint-message-error {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=\\\");\\n}\\n\\n.CodeMirror-lint-marker-multiple {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC\\\");\\n background-repeat: no-repeat;\\n background-position: right bottom;\\n width: 100%; height: 100%;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vbm9kZV9tb2R1bGVzL2NvZGVtaXJyb3IvYWRkb24vbGludC9saW50LmNzcz9jMzA1Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7QUFDK0c7QUFDN0I7QUFDbEYsOEJBQThCLHNFQUEyQixDQUFDLDJGQUFxQztBQUMvRjtBQUNBLGtHQUFrRyxnQkFBZ0IsR0FBRyw4QkFBOEIsMkJBQTJCLDRCQUE0QixtQ0FBbUMsaUJBQWlCLDJCQUEyQixvQkFBb0IscUJBQXFCLHFCQUFxQixvQkFBb0IscUJBQXFCLDBCQUEwQixpQkFBaUIscUJBQXFCLGVBQWUsNEJBQTRCLGlDQUFpQyxvQ0FBb0MsK0JBQStCLGdDQUFnQyxHQUFHLDJCQUEyQixxQ0FBcUMsZ0NBQWdDLEdBQUcsbUNBQW1DLDJDQUEyQywyU0FBMlMsR0FBRyxpQ0FBaUMsMkNBQTJDLCtRQUErUSxHQUFHLDZCQUE2Qix1Q0FBdUMsaUNBQWlDLG9CQUFvQiwwQkFBMEIsaUJBQWlCLGdCQUFnQiwyQkFBMkIsdUJBQXVCLEdBQUcsOEJBQThCLHVCQUF1QixrQ0FBa0MsaUNBQWlDLEdBQUcsdUVBQXVFLDJDQUEyQyxtVUFBbVUsR0FBRyxtRUFBbUUsMkNBQTJDLCtRQUErUSxHQUFHLHNDQUFzQywyQ0FBMkMsbUxBQW1MLGlDQUFpQyxzQ0FBc0MsZ0JBQWdCLGNBQWMsR0FBRyxTQUFTLHFIQUFxSCxNQUFNLFVBQVUsTUFBTSxLQUFLLFlBQVksYUFBYSxhQUFhLFdBQVcsWUFBWSxXQUFXLFlBQVksYUFBYSxXQUFXLFlBQVksYUFBYSxXQUFXLFlBQVksV0FBVyxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsT0FBTyxLQUFLLFlBQVksYUFBYSxPQUFPLEtBQUssWUFBWSxPQUFPLEtBQUssWUFBWSxPQUFPLEtBQUssWUFBWSxhQUFhLFdBQVcsWUFBWSxXQUFXLFVBQVUsWUFBWSxhQUFhLE9BQU8sS0FBSyxZQUFZLGFBQWEsYUFBYSxPQUFPLEtBQUssWUFBWSxPQUFPLEtBQUssWUFBWSxPQUFPLEtBQUssWUFBWSxhQUFhLGFBQWEscUJBQXFCLGtGQUFrRixnQkFBZ0IsR0FBRyw4QkFBOEIsMkJBQTJCLDRCQUE0QixtQ0FBbUMsaUJBQWlCLDJCQUEyQixvQkFBb0IscUJBQXFCLHFCQUFxQixvQkFBb0IscUJBQXFCLDBCQUEwQixpQkFBaUIscUJBQXFCLGVBQWUsNEJBQTRCLGlDQUFpQyxvQ0FBb0MsK0JBQStCLGdDQUFnQyxHQUFHLDJCQUEyQixxQ0FBcUMsZ0NBQWdDLEdBQUcsbUNBQW1DLDJDQUEyQywyU0FBMlMsR0FBRyxpQ0FBaUMsMkNBQTJDLCtRQUErUSxHQUFHLDZCQUE2Qix1Q0FBdUMsaUNBQWlDLG9CQUFvQiwwQkFBMEIsaUJBQWlCLGdCQUFnQiwyQkFBMkIsdUJBQXVCLEdBQUcsOEJBQThCLHVCQUF1QixrQ0FBa0MsaUNBQWlDLEdBQUcsdUVBQXVFLDJDQUEyQyxtVUFBbVUsR0FBRyxtRUFBbUUsMkNBQTJDLCtRQUErUSxHQUFHLHNDQUFzQywyQ0FBMkMsbUxBQW1MLGlDQUFpQyxzQ0FBc0MsZ0JBQWdCLGNBQWMsR0FBRyxxQkFBcUI7QUFDM2xOO0FBQ0EsaUVBQWUsdUJBQXVCLEVBQUMiLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL25vZGVfbW9kdWxlcy9jb2RlbWlycm9yL2FkZG9uL2xpbnQvbGludC5jc3MuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvY3NzV2l0aE1hcHBpbmdUb1N0cmluZy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgXCIvKiBUaGUgbGludCBtYXJrZXIgZ3V0dGVyICovXFxuLkNvZGVNaXJyb3ItbGludC1tYXJrZXJzIHtcXG4gIHdpZHRoOiAxNnB4O1xcbn1cXG5cXG4uQ29kZU1pcnJvci1saW50LXRvb2x0aXAge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZDtcXG4gIGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrO1xcbiAgYm9yZGVyLXJhZGl1czogNHB4IDRweCA0cHggNHB4O1xcbiAgY29sb3I6IGJsYWNrO1xcbiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTtcXG4gIGZvbnQtc2l6ZTogMTBwdDtcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxuICBwYWRkaW5nOiAycHggNXB4O1xcbiAgcG9zaXRpb246IGZpeGVkO1xcbiAgd2hpdGUtc3BhY2U6IHByZTtcXG4gIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcXG4gIHotaW5kZXg6IDEwMDtcXG4gIG1heC13aWR0aDogNjAwcHg7XFxuICBvcGFjaXR5OiAwO1xcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAuNHM7XFxuICAtbW96LXRyYW5zaXRpb246IG9wYWNpdHkgLjRzO1xcbiAgLXdlYmtpdC10cmFuc2l0aW9uOiBvcGFjaXR5IC40cztcXG4gIC1vLXRyYW5zaXRpb246IG9wYWNpdHkgLjRzO1xcbiAgLW1zLXRyYW5zaXRpb246IG9wYWNpdHkgLjRzO1xcbn1cXG5cXG4uQ29kZU1pcnJvci1saW50LW1hcmsge1xcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogbGVmdCBib3R0b207XFxuICBiYWNrZ3JvdW5kLXJlcGVhdDogcmVwZWF0LXg7XFxufVxcblxcbi5Db2RlTWlycm9yLWxpbnQtbWFyay13YXJuaW5nIHtcXG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChcXFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBUUFBQUFEQ0FZQUFBQzA5SzdHQUFBQUFYTlNSMElBcnM0YzZRQUFBQVppUzBkRUFQOEEvd0Qvb0wybmt3QUFBQWx3U0ZsekFBQUxFd0FBQ3hNQkFKcWNHQUFBQUFkMFNVMUZCOXNKRmhRWEViaFRnN1lBQUFBWmRFVllkRU52YlcxbGJuUUFRM0psWVhSbFpDQjNhWFJvSUVkSlRWQlhnUTRYQUFBQU1rbEVRVlFJMTJOa2dJSXZKM1FYTWpBd2RETitPYUVieXNEQTRNUEF3TkROd01Dd2lPSExDZDF6WDA3bzZrQlZHUUVBS0JBTnRvYnNrTk1BQUFBQVNVVk9SSzVDWUlJPVxcXCIpO1xcbn1cXG5cXG4uQ29kZU1pcnJvci1saW50LW1hcmstZXJyb3Ige1xcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFxcXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFRQUFBQURDQVlBQUFDMDlLN0dBQUFBQVhOU1IwSUFyczRjNlFBQUFBWmlTMGRFQVA4QS93RC9vTDJua3dBQUFBbHdTRmx6QUFBTEV3QUFDeE1CQUpxY0dBQUFBQWQwU1UxRkI5c0pEdzRjT0NXMS9LSUFBQUFaZEVWWWRFTnZiVzFsYm5RQVEzSmxZWFJsWkNCM2FYUm9JRWRKVFZCWGdRNFhBQUFBSEVsRVFWUUkxMk5nZ0lML0RBei9HZEE1L3hrWS9xUEtNREF3QUFETFp3ZjVydm0rTFFBQUFBQkpSVTVFcmtKZ2dnPT1cXFwiKTtcXG59XFxuXFxuLkNvZGVNaXJyb3ItbGludC1tYXJrZXIge1xcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIGNlbnRlcjtcXG4gIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICBoZWlnaHQ6IDE2cHg7XFxuICB3aWR0aDogMTZweDtcXG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxufVxcblxcbi5Db2RlTWlycm9yLWxpbnQtbWVzc2FnZSB7XFxuICBwYWRkaW5nLWxlZnQ6IDE4cHg7XFxuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiB0b3AgbGVmdDtcXG4gIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XFxufVxcblxcbi5Db2RlTWlycm9yLWxpbnQtbWFya2VyLXdhcm5pbmcsIC5Db2RlTWlycm9yLWxpbnQtbWVzc2FnZS13YXJuaW5nIHtcXG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChcXFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FNQUFBQW9MUTlUQUFBQU5sQk1WRVgvdXdEdnJ3RC91d0QvdXdEL3V3RC91d0QvdXdEL3V3RC91d0Q2dHdEL3V3QUFBQUR1cndEMnRRRDd1QUQrdWdBQUFBRC91d0RobWVUUkFBQUFESFJTVGxNSjhtTjFFWWNibWlpeGdBQ203V2J1QUFBQVZrbEVRVlI0Mm4zUFVRcUFJQkJGVVUxTExjM3UvamRiT0pvVzFQMDhEQTlHYmE4K1lXSjZnTkpvTllJQnpBQTJjaEJ0aDVrTG1HOVlVb0cwTkhBVXdGWHdPOUx1QlFMMWdpQ1FiOGdDOU9ybzJ2cDVybmNDSVk4TDh1RXg1WmtBQUFBQVNVVk9SSzVDWUlJPVxcXCIpO1xcbn1cXG5cXG4uQ29kZU1pcnJvci1saW50LW1hcmtlci1lcnJvciwgLkNvZGVNaXJyb3ItbGludC1tZXNzYWdlLWVycm9yIHtcXG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChcXFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FNQUFBQW9MUTlUQUFBQUhsQk1WRVc3QUFDN0FBQ3hBQUM3QUFDN0FBQUFBQUM0QUFDNUFBRC8vLys3QUFBVWRjbHBBQUFBQm5SU1RsTVhuT1JTaXdDSzBaS1NBQUFBVFVsRVFWUjQybVdQT1E3QVFBZ0R1UUx4L3o4Y3NZUm1QUklGSXdSR25vc1JycGFtdmtLaTBGVElpTUFTUjNoaEtXK2hBTjYvdElXaHU5UERXaVRHTkVrVHRJT3VjQTVPeXI5Y2tQZ0FXbTBHUEJvZzZ2NEFBQUFBU1VWT1JLNUNZSUk9XFxcIik7XFxufVxcblxcbi5Db2RlTWlycm9yLWxpbnQtbWFya2VyLW11bHRpcGxlIHtcXG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChcXFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBY0FBQUFIQ0FNQUFBRHpqS2ZoQUFBQUNWQk1WRVVBQUFBQUFBQy92NzkxNGt5SEFBQUFBWFJTVGxNQVFPYllaZ0FBQUNOSlJFRlVlTm8xaW9FSkFBQUl3bXovSDkwaUZGU0dKZ0ZNZTNnYUxaMG9kKzkvQVFaMEFEb3NiWXJhQUFBQUFFbEZUa1N1UW1DQ1xcXCIpO1xcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcXG4gIGJhY2tncm91bmQtcG9zaXRpb246IHJpZ2h0IGJvdHRvbTtcXG4gIHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7XFxufVxcblwiLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9jb2RlbWlycm9yL2FkZG9uL2xpbnQvbGludC5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUEsMkJBQTJCO0FBQzNCO0VBQ0UsV0FBVztBQUNiOztBQUVBO0VBQ0Usc0JBQXNCO0VBQ3RCLHVCQUF1QjtFQUN2Qiw4QkFBOEI7RUFDOUIsWUFBWTtFQUNaLHNCQUFzQjtFQUN0QixlQUFlO0VBQ2YsZ0JBQWdCO0VBQ2hCLGdCQUFnQjtFQUNoQixlQUFlO0VBQ2YsZ0JBQWdCO0VBQ2hCLHFCQUFxQjtFQUNyQixZQUFZO0VBQ1osZ0JBQWdCO0VBQ2hCLFVBQVU7RUFDVix1QkFBdUI7RUFDdkIsNEJBQTRCO0VBQzVCLCtCQUErQjtFQUMvQiwwQkFBMEI7RUFDMUIsMkJBQTJCO0FBQzdCOztBQUVBO0VBQ0UsZ0NBQWdDO0VBQ2hDLDJCQUEyQjtBQUM3Qjs7QUFFQTtFQUNFLCtVQUErVTtBQUNqVjs7QUFFQTtFQUNFLG1UQUFtVDtBQUNyVDs7QUFFQTtFQUNFLGtDQUFrQztFQUNsQyw0QkFBNEI7RUFDNUIsZUFBZTtFQUNmLHFCQUFxQjtFQUNyQixZQUFZO0VBQ1osV0FBVztFQUNYLHNCQUFzQjtFQUN0QixrQkFBa0I7QUFDcEI7O0FBRUE7RUFDRSxrQkFBa0I7RUFDbEIsNkJBQTZCO0VBQzdCLDRCQUE0QjtBQUM5Qjs7QUFFQTtFQUNFLHVXQUF1VztBQUN6Vzs7QUFFQTtFQUNFLG1UQUFtVDtBQUNyVDs7QUFFQTtFQUNFLHVOQUF1TjtFQUN2Tiw0QkFBNEI7RUFDNUIsaUNBQWlDO0VBQ2pDLFdBQVcsRUFBRSxZQUFZO0FBQzNCXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi8qIFRoZSBsaW50IG1hcmtlciBndXR0ZXIgKi9cXG4uQ29kZU1pcnJvci1saW50LW1hcmtlcnMge1xcbiAgd2lkdGg6IDE2cHg7XFxufVxcblxcbi5Db2RlTWlycm9yLWxpbnQtdG9vbHRpcCB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZkO1xcbiAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7XFxuICBib3JkZXItcmFkaXVzOiA0cHggNHB4IDRweCA0cHg7XFxuICBjb2xvcjogYmxhY2s7XFxuICBmb250LWZhbWlseTogbW9ub3NwYWNlO1xcbiAgZm9udC1zaXplOiAxMHB0O1xcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcXG4gIHBhZGRpbmc6IDJweCA1cHg7XFxuICBwb3NpdGlvbjogZml4ZWQ7XFxuICB3aGl0ZS1zcGFjZTogcHJlO1xcbiAgd2hpdGUtc3BhY2U6IHByZS13cmFwO1xcbiAgei1pbmRleDogMTAwO1xcbiAgbWF4LXdpZHRoOiA2MDBweDtcXG4gIG9wYWNpdHk6IDA7XFxuICB0cmFuc2l0aW9uOiBvcGFjaXR5IC40cztcXG4gIC1tb3otdHJhbnNpdGlvbjogb3BhY2l0eSAuNHM7XFxuICAtd2Via2l0LXRyYW5zaXRpb246IG9wYWNpdHkgLjRzO1xcbiAgLW8tdHJhbnNpdGlvbjogb3BhY2l0eSAuNHM7XFxuICAtbXMtdHJhbnNpdGlvbjogb3BhY2l0eSAuNHM7XFxufVxcblxcbi5Db2RlTWlycm9yLWxpbnQtbWFyayB7XFxuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBsZWZ0IGJvdHRvbTtcXG4gIGJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteDtcXG59XFxuXFxuLkNvZGVNaXJyb3ItbGludC1tYXJrLXdhcm5pbmcge1xcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFxcXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFRQUFBQURDQVlBQUFDMDlLN0dBQUFBQVhOU1IwSUFyczRjNlFBQUFBWmlTMGRFQVA4QS93RC9vTDJua3dBQUFBbHdTRmx6QUFBTEV3QUFDeE1CQUpxY0dBQUFBQWQwU1UxRkI5c0pGaFFYRWJoVGc3WUFBQUFaZEVWWWRFTnZiVzFsYm5RQVEzSmxZWFJsWkNCM2FYUm9JRWRKVFZCWGdRNFhBQUFBTWtsRVFWUUkxMk5rZ0lJdkozUVhNakF3ZEROK09hRWJ5c0RBNE1QQXdORE53TUN3aU9ITENkMXpYMDdvNmtCVkdRRUFLQkFOdG9ic2tOTUFBQUFBU1VWT1JLNUNZSUk9XFxcIik7XFxufVxcblxcbi5Db2RlTWlycm9yLWxpbnQtbWFyay1lcnJvciB7XFxuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXFxcImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQVFBQUFBRENBWUFBQUMwOUs3R0FBQUFBWE5TUjBJQXJzNGM2UUFBQUFaaVMwZEVBUDhBL3dEL29MMm5rd0FBQUFsd1NGbHpBQUFMRXdBQUN4TUJBSnFjR0FBQUFBZDBTVTFGQjlzSkR3NGNPQ1cxL0tJQUFBQVpkRVZZZEVOdmJXMWxiblFBUTNKbFlYUmxaQ0IzYVhSb0lFZEpUVkJYZ1E0WEFBQUFIRWxFUVZRSTEyTmdnSUwvREF6L0dkQTUveGtZL3FQS01EQXdBQURMWndmNXJ2bStMUUFBQUFCSlJVNUVya0pnZ2c9PVxcXCIpO1xcbn1cXG5cXG4uQ29kZU1pcnJvci1saW50LW1hcmtlciB7XFxuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgY2VudGVyO1xcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gIGhlaWdodDogMTZweDtcXG4gIHdpZHRoOiAxNnB4O1xcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG59XFxuXFxuLkNvZGVNaXJyb3ItbGludC1tZXNzYWdlIHtcXG4gIHBhZGRpbmctbGVmdDogMThweDtcXG4gIGJhY2tncm91bmQtcG9zaXRpb246IHRvcCBsZWZ0O1xcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcXG59XFxuXFxuLkNvZGVNaXJyb3ItbGludC1tYXJrZXItd2FybmluZywgLkNvZGVNaXJyb3ItbGludC1tZXNzYWdlLXdhcm5pbmcge1xcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFxcXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQU1BQUFBb0xROVRBQUFBTmxCTVZFWC91d0R2cndEL3V3RC91d0QvdXdEL3V3RC91d0QvdXdEL3V3RDZ0d0QvdXdBQUFBRHVyd0QydFFEN3VBRCt1Z0FBQUFEL3V3RGhtZVRSQUFBQURIUlNUbE1KOG1OMUVZY2JtaWl4Z0FDbTdXYnVBQUFBVmtsRVFWUjQybjNQVVFxQUlCQkZVVTFMTGMzdS9qZGJPSm9XMVAwOERBOUdiYTgrWVdKNmdOSm9OWUlCekFBMmNoQnRoNWtMbUc5WVVvRzBOSEFVd0ZYd085THVCUUwxZ2lDUWI4Z0M5T3JvMnZwNXJuY0NJWThMOHVFeDVaa0FBQUFBU1VWT1JLNUNZSUk9XFxcIik7XFxufVxcblxcbi5Db2RlTWlycm9yLWxpbnQtbWFya2VyLWVycm9yLCAuQ29kZU1pcnJvci1saW50LW1lc3NhZ2UtZXJyb3Ige1xcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFxcXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQU1BQUFBb0xROVRBQUFBSGxCTVZFVzdBQUM3QUFDeEFBQzdBQUM3QUFBQUFBQzRBQUM1QUFELy8vKzdBQUFVZGNscEFBQUFCblJTVGxNWG5PUlNpd0NLMFpLU0FBQUFUVWxFUVZSNDJtV1BPUTdBUUFnRHVRTHgvejhjc1lSbVBSSUZJd1JHbm9zUnJwYW12a0tpMEZUSWlNQVNSM2hoS1craEFONi90SVdodTlQRFdpVEdORWtUdElPdWNBNU95cjlja1BnQVdtMEdQQm9nNnY0QUFBQUFTVVZPUks1Q1lJST1cXFwiKTtcXG59XFxuXFxuLkNvZGVNaXJyb3ItbGludC1tYXJrZXItbXVsdGlwbGUge1xcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFxcXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFjQUFBQUhDQU1BQUFEempLZmhBQUFBQ1ZCTVZFVUFBQUFBQUFDL3Y3OTE0a3lIQUFBQUFYUlNUbE1BUU9iWVpnQUFBQ05KUkVGVWVObzFpb0VKQUFBSXdtei9IOTBpRkZTR0pnRk1lM2dhTFowb2QrOS9BUVowQURvc2JZcmFBQUFBQUVsRlRrU3VRbUNDXFxcIik7XFxuICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogcmlnaHQgYm90dG9tO1xcbiAgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTtcXG59XFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/css-loader/dist/cjs.js!./node_modules/codemirror/addon/lint/lint.css\n"); /***/ }), /***/ "./node_modules/css-loader/dist/runtime/api.js": -/*!*****************************************************!* +/*!*****************************************************!*\ !*** ./node_modules/css-loader/dist/runtime/api.js ***! \*****************************************************/ /***/ ((module) => { "use strict"; -eval("\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\n// css base code, injected by the css-loader\n// eslint-disable-next-line func-names\nmodule.exports = function (cssWithMappingToString) {\n var list = []; // return the list of modules as css string\n\n list.toString = function toString() {\n return this.map(function (item) {\n var content = cssWithMappingToString(item);\n\n if (item[2]) {\n return \"@media \".concat(item[2], \" {\").concat(content, \"}\");\n }\n\n return content;\n }).join('');\n }; // import a list of modules into the list\n // eslint-disable-next-line func-names\n\n\n list.i = function (modules, mediaQuery, dedupe) {\n if (typeof modules === 'string') {\n // eslint-disable-next-line no-param-reassign\n modules = [[null, modules, '']];\n }\n\n var alreadyImportedModules = {};\n\n if (dedupe) {\n for (var i = 0; i < this.length; i++) {\n // eslint-disable-next-line prefer-destructuring\n var id = this[i][0];\n\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n\n for (var _i = 0; _i < modules.length; _i++) {\n var item = [].concat(modules[_i]);\n\n if (dedupe && alreadyImportedModules[item[0]]) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n if (mediaQuery) {\n if (!item[2]) {\n item[2] = mediaQuery;\n } else {\n item[2] = \"\".concat(mediaQuery, \" and \").concat(item[2]);\n }\n }\n\n list.push(item);\n }\n };\n\n return list;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qcz8yNGZiIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCOztBQUVoQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw0Q0FBNEMscUJBQXFCO0FBQ2pFOztBQUVBO0FBQ0EsS0FBSztBQUNMLElBQUk7QUFDSjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLHFCQUFxQixpQkFBaUI7QUFDdEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG9CQUFvQixxQkFBcUI7QUFDekM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuLypcbiAgTUlUIExpY2Vuc2UgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHBcbiAgQXV0aG9yIFRvYmlhcyBLb3BwZXJzIEBzb2tyYVxuKi9cbi8vIGNzcyBiYXNlIGNvZGUsIGluamVjdGVkIGJ5IHRoZSBjc3MtbG9hZGVyXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoY3NzV2l0aE1hcHBpbmdUb1N0cmluZykge1xuICB2YXIgbGlzdCA9IFtdOyAvLyByZXR1cm4gdGhlIGxpc3Qgb2YgbW9kdWxlcyBhcyBjc3Mgc3RyaW5nXG5cbiAgbGlzdC50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgdmFyIGNvbnRlbnQgPSBjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKGl0ZW0pO1xuXG4gICAgICBpZiAoaXRlbVsyXSkge1xuICAgICAgICByZXR1cm4gXCJAbWVkaWEgXCIuY29uY2F0KGl0ZW1bMl0sIFwiIHtcIikuY29uY2F0KGNvbnRlbnQsIFwifVwiKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgfSkuam9pbignJyk7XG4gIH07IC8vIGltcG9ydCBhIGxpc3Qgb2YgbW9kdWxlcyBpbnRvIHRoZSBsaXN0XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG5cblxuICBsaXN0LmkgPSBmdW5jdGlvbiAobW9kdWxlcywgbWVkaWFRdWVyeSwgZGVkdXBlKSB7XG4gICAgaWYgKHR5cGVvZiBtb2R1bGVzID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICBtb2R1bGVzID0gW1tudWxsLCBtb2R1bGVzLCAnJ11dO1xuICAgIH1cblxuICAgIHZhciBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzID0ge307XG5cbiAgICBpZiAoZGVkdXBlKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1kZXN0cnVjdHVyaW5nXG4gICAgICAgIHZhciBpZCA9IHRoaXNbaV1bMF07XG5cbiAgICAgICAgaWYgKGlkICE9IG51bGwpIHtcbiAgICAgICAgICBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2lkXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbW9kdWxlcy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBpdGVtID0gW10uY29uY2F0KG1vZHVsZXNbX2ldKTtcblxuICAgICAgaWYgKGRlZHVwZSAmJiBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2l0ZW1bMF1dKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250aW51ZVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1lZGlhUXVlcnkpIHtcbiAgICAgICAgaWYgKCFpdGVtWzJdKSB7XG4gICAgICAgICAgaXRlbVsyXSA9IG1lZGlhUXVlcnk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsyXSA9IFwiXCIuY29uY2F0KG1lZGlhUXVlcnksIFwiIGFuZCBcIikuY29uY2F0KGl0ZW1bMl0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxpc3QucHVzaChpdGVtKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIGxpc3Q7XG59OyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/css-loader/dist/runtime/api.js\n"); +eval("\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\n// css base code, injected by the css-loader\n// eslint-disable-next-line func-names\nmodule.exports = function (cssWithMappingToString) {\n var list = []; // return the list of modules as css string\n\n list.toString = function toString() {\n return this.map(function (item) {\n var content = cssWithMappingToString(item);\n\n if (item[2]) {\n return \"@media \".concat(item[2], \" {\").concat(content, \"}\");\n }\n\n return content;\n }).join(\"\");\n }; // import a list of modules into the list\n // eslint-disable-next-line func-names\n\n\n list.i = function (modules, mediaQuery, dedupe) {\n if (typeof modules === \"string\") {\n // eslint-disable-next-line no-param-reassign\n modules = [[null, modules, \"\"]];\n }\n\n var alreadyImportedModules = {};\n\n if (dedupe) {\n for (var i = 0; i < this.length; i++) {\n // eslint-disable-next-line prefer-destructuring\n var id = this[i][0];\n\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n\n for (var _i = 0; _i < modules.length; _i++) {\n var item = [].concat(modules[_i]);\n\n if (dedupe && alreadyImportedModules[item[0]]) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n if (mediaQuery) {\n if (!item[2]) {\n item[2] = mediaQuery;\n } else {\n item[2] = \"\".concat(mediaQuery, \" and \").concat(item[2]);\n }\n }\n\n list.push(item);\n }\n };\n\n return list;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qcz8yNGZiIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCOztBQUVoQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw0Q0FBNEMscUJBQXFCO0FBQ2pFOztBQUVBO0FBQ0EsS0FBSztBQUNMLElBQUk7QUFDSjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLHFCQUFxQixpQkFBaUI7QUFDdEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG9CQUFvQixxQkFBcUI7QUFDekM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuLypcbiAgTUlUIExpY2Vuc2UgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHBcbiAgQXV0aG9yIFRvYmlhcyBLb3BwZXJzIEBzb2tyYVxuKi9cbi8vIGNzcyBiYXNlIGNvZGUsIGluamVjdGVkIGJ5IHRoZSBjc3MtbG9hZGVyXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoY3NzV2l0aE1hcHBpbmdUb1N0cmluZykge1xuICB2YXIgbGlzdCA9IFtdOyAvLyByZXR1cm4gdGhlIGxpc3Qgb2YgbW9kdWxlcyBhcyBjc3Mgc3RyaW5nXG5cbiAgbGlzdC50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgdmFyIGNvbnRlbnQgPSBjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKGl0ZW0pO1xuXG4gICAgICBpZiAoaXRlbVsyXSkge1xuICAgICAgICByZXR1cm4gXCJAbWVkaWEgXCIuY29uY2F0KGl0ZW1bMl0sIFwiIHtcIikuY29uY2F0KGNvbnRlbnQsIFwifVwiKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgfSkuam9pbihcIlwiKTtcbiAgfTsgLy8gaW1wb3J0IGEgbGlzdCBvZiBtb2R1bGVzIGludG8gdGhlIGxpc3RcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcblxuXG4gIGxpc3QuaSA9IGZ1bmN0aW9uIChtb2R1bGVzLCBtZWRpYVF1ZXJ5LCBkZWR1cGUpIHtcbiAgICBpZiAodHlwZW9mIG1vZHVsZXMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgbW9kdWxlcyA9IFtbbnVsbCwgbW9kdWxlcywgXCJcIl1dO1xuICAgIH1cblxuICAgIHZhciBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzID0ge307XG5cbiAgICBpZiAoZGVkdXBlKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1kZXN0cnVjdHVyaW5nXG4gICAgICAgIHZhciBpZCA9IHRoaXNbaV1bMF07XG5cbiAgICAgICAgaWYgKGlkICE9IG51bGwpIHtcbiAgICAgICAgICBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2lkXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbW9kdWxlcy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBpdGVtID0gW10uY29uY2F0KG1vZHVsZXNbX2ldKTtcblxuICAgICAgaWYgKGRlZHVwZSAmJiBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2l0ZW1bMF1dKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250aW51ZVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1lZGlhUXVlcnkpIHtcbiAgICAgICAgaWYgKCFpdGVtWzJdKSB7XG4gICAgICAgICAgaXRlbVsyXSA9IG1lZGlhUXVlcnk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsyXSA9IFwiXCIuY29uY2F0KG1lZGlhUXVlcnksIFwiIGFuZCBcIikuY29uY2F0KGl0ZW1bMl0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxpc3QucHVzaChpdGVtKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIGxpc3Q7XG59OyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/css-loader/dist/runtime/api.js\n"); /***/ }), /***/ "./node_modules/css-loader/dist/runtime/cssWithMappingToString.js": -/*!************************************************************************!* +/*!************************************************************************!*\ !*** ./node_modules/css-loader/dist/runtime/cssWithMappingToString.js ***! \************************************************************************/ /***/ ((module) => { "use strict"; -eval("\n\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _iterableToArrayLimit(arr, i) { if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nmodule.exports = function cssWithMappingToString(item) {\n var _item = _slicedToArray(item, 4),\n content = _item[1],\n cssMapping = _item[3];\n\n if (typeof btoa === 'function') {\n // eslint-disable-next-line no-undef\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n var sourceMapping = \"/*# \".concat(data, \" */\");\n var sourceURLs = cssMapping.sources.map(function (source) {\n return \"/*# sourceURL=\".concat(cssMapping.sourceRoot || '').concat(source, \" */\");\n });\n return [content].concat(sourceURLs).concat([sourceMapping]).join('\\n');\n }\n\n return [content].join('\\n');\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2Nzc1dpdGhNYXBwaW5nVG9TdHJpbmcuanM/NzVlOSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixpQ0FBaUMsMkhBQTJIOztBQUU1Siw2QkFBNkIsa0tBQWtLOztBQUUvTCxpREFBaUQsZ0JBQWdCLGdFQUFnRSx3REFBd0QsNkRBQTZELHNEQUFzRCxrSEFBa0g7O0FBRTlaLHNDQUFzQyx1REFBdUQsdUNBQXVDLFNBQVMsT0FBTyxrQkFBa0IsRUFBRSxhQUFhOztBQUVyTCx3Q0FBd0MsZ0ZBQWdGLGVBQWUsZUFBZSxnQkFBZ0Isb0JBQW9CLE1BQU0sMENBQTBDLCtCQUErQixhQUFhLHFCQUFxQixtQ0FBbUMsRUFBRSxFQUFFLGNBQWMsV0FBVyxVQUFVLEVBQUUsVUFBVSxNQUFNLGlEQUFpRCxFQUFFLFVBQVUsa0JBQWtCLEVBQUUsRUFBRSxhQUFhOztBQUV2ZSwrQkFBK0Isb0NBQW9DOztBQUVuRTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQsY0FBYztBQUNyRTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBIiwiZmlsZSI6Ii4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2Nzc1dpdGhNYXBwaW5nVG9TdHJpbmcuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkoYXJyLCBpKSB7IHJldHVybiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyLCBpKSB8fCBfbm9uSXRlcmFibGVSZXN0KCk7IH1cblxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgIShTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGFycikpKSByZXR1cm47IHZhciBfYXJyID0gW107IHZhciBfbiA9IHRydWU7IHZhciBfZCA9IGZhbHNlOyB2YXIgX2UgPSB1bmRlZmluZWQ7IHRyeSB7IGZvciAodmFyIF9pID0gYXJyW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHsgX2Fyci5wdXNoKF9zLnZhbHVlKTsgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrOyB9IH0gY2F0Y2ggKGVycikgeyBfZCA9IHRydWU7IF9lID0gZXJyOyB9IGZpbmFsbHkgeyB0cnkgeyBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdICE9IG51bGwpIF9pW1wicmV0dXJuXCJdKCk7IH0gZmluYWxseSB7IGlmIChfZCkgdGhyb3cgX2U7IH0gfSByZXR1cm4gX2FycjsgfVxuXG5mdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7IH1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKGl0ZW0pIHtcbiAgdmFyIF9pdGVtID0gX3NsaWNlZFRvQXJyYXkoaXRlbSwgNCksXG4gICAgICBjb250ZW50ID0gX2l0ZW1bMV0sXG4gICAgICBjc3NNYXBwaW5nID0gX2l0ZW1bM107XG5cbiAgaWYgKHR5cGVvZiBidG9hID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICAgdmFyIGJhc2U2NCA9IGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KGNzc01hcHBpbmcpKSkpO1xuICAgIHZhciBkYXRhID0gXCJzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxcIi5jb25jYXQoYmFzZTY0KTtcbiAgICB2YXIgc291cmNlTWFwcGluZyA9IFwiLyojIFwiLmNvbmNhdChkYXRhLCBcIiAqL1wiKTtcbiAgICB2YXIgc291cmNlVVJMcyA9IGNzc01hcHBpbmcuc291cmNlcy5tYXAoZnVuY3Rpb24gKHNvdXJjZSkge1xuICAgICAgcmV0dXJuIFwiLyojIHNvdXJjZVVSTD1cIi5jb25jYXQoY3NzTWFwcGluZy5zb3VyY2VSb290IHx8ICcnKS5jb25jYXQoc291cmNlLCBcIiAqL1wiKTtcbiAgICB9KTtcbiAgICByZXR1cm4gW2NvbnRlbnRdLmNvbmNhdChzb3VyY2VVUkxzKS5jb25jYXQoW3NvdXJjZU1hcHBpbmddKS5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIHJldHVybiBbY29udGVudF0uam9pbignXFxuJyk7XG59OyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/css-loader/dist/runtime/cssWithMappingToString.js\n"); +eval("\n\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _iterableToArrayLimit(arr, i) { if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nmodule.exports = function cssWithMappingToString(item) {\n var _item = _slicedToArray(item, 4),\n content = _item[1],\n cssMapping = _item[3];\n\n if (typeof btoa === \"function\") {\n // eslint-disable-next-line no-undef\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n var sourceMapping = \"/*# \".concat(data, \" */\");\n var sourceURLs = cssMapping.sources.map(function (source) {\n return \"/*# sourceURL=\".concat(cssMapping.sourceRoot || \"\").concat(source, \" */\");\n });\n return [content].concat(sourceURLs).concat([sourceMapping]).join(\"\\n\");\n }\n\n return [content].join(\"\\n\");\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2Nzc1dpdGhNYXBwaW5nVG9TdHJpbmcuanM/NzVlOSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixpQ0FBaUMsMkhBQTJIOztBQUU1Siw2QkFBNkIsa0tBQWtLOztBQUUvTCxpREFBaUQsZ0JBQWdCLGdFQUFnRSx3REFBd0QsNkRBQTZELHNEQUFzRCxrSEFBa0g7O0FBRTlaLHNDQUFzQyx1REFBdUQsdUNBQXVDLFNBQVMsT0FBTyxrQkFBa0IsRUFBRSxhQUFhOztBQUVyTCx3Q0FBd0MsZ0ZBQWdGLGVBQWUsZUFBZSxnQkFBZ0Isb0JBQW9CLE1BQU0sMENBQTBDLCtCQUErQixhQUFhLHFCQUFxQixtQ0FBbUMsRUFBRSxFQUFFLGNBQWMsV0FBVyxVQUFVLEVBQUUsVUFBVSxNQUFNLGlEQUFpRCxFQUFFLFVBQVUsa0JBQWtCLEVBQUUsRUFBRSxhQUFhOztBQUV2ZSwrQkFBK0Isb0NBQW9DOztBQUVuRTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQsY0FBYztBQUNyRTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBIiwiZmlsZSI6Ii4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2Nzc1dpdGhNYXBwaW5nVG9TdHJpbmcuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkoYXJyLCBpKSB7IHJldHVybiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyLCBpKSB8fCBfbm9uSXRlcmFibGVSZXN0KCk7IH1cblxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgIShTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGFycikpKSByZXR1cm47IHZhciBfYXJyID0gW107IHZhciBfbiA9IHRydWU7IHZhciBfZCA9IGZhbHNlOyB2YXIgX2UgPSB1bmRlZmluZWQ7IHRyeSB7IGZvciAodmFyIF9pID0gYXJyW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHsgX2Fyci5wdXNoKF9zLnZhbHVlKTsgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrOyB9IH0gY2F0Y2ggKGVycikgeyBfZCA9IHRydWU7IF9lID0gZXJyOyB9IGZpbmFsbHkgeyB0cnkgeyBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdICE9IG51bGwpIF9pW1wicmV0dXJuXCJdKCk7IH0gZmluYWxseSB7IGlmIChfZCkgdGhyb3cgX2U7IH0gfSByZXR1cm4gX2FycjsgfVxuXG5mdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7IH1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKGl0ZW0pIHtcbiAgdmFyIF9pdGVtID0gX3NsaWNlZFRvQXJyYXkoaXRlbSwgNCksXG4gICAgICBjb250ZW50ID0gX2l0ZW1bMV0sXG4gICAgICBjc3NNYXBwaW5nID0gX2l0ZW1bM107XG5cbiAgaWYgKHR5cGVvZiBidG9hID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgICB2YXIgYmFzZTY0ID0gYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoY3NzTWFwcGluZykpKSk7XG4gICAgdmFyIGRhdGEgPSBcInNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LFwiLmNvbmNhdChiYXNlNjQpO1xuICAgIHZhciBzb3VyY2VNYXBwaW5nID0gXCIvKiMgXCIuY29uY2F0KGRhdGEsIFwiICovXCIpO1xuICAgIHZhciBzb3VyY2VVUkxzID0gY3NzTWFwcGluZy5zb3VyY2VzLm1hcChmdW5jdGlvbiAoc291cmNlKSB7XG4gICAgICByZXR1cm4gXCIvKiMgc291cmNlVVJMPVwiLmNvbmNhdChjc3NNYXBwaW5nLnNvdXJjZVJvb3QgfHwgXCJcIikuY29uY2F0KHNvdXJjZSwgXCIgKi9cIik7XG4gICAgfSk7XG4gICAgcmV0dXJuIFtjb250ZW50XS5jb25jYXQoc291cmNlVVJMcykuY29uY2F0KFtzb3VyY2VNYXBwaW5nXSkuam9pbihcIlxcblwiKTtcbiAgfVxuXG4gIHJldHVybiBbY29udGVudF0uam9pbihcIlxcblwiKTtcbn07Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/css-loader/dist/runtime/cssWithMappingToString.js\n"); /***/ }), /***/ "./node_modules/d/auto-bind.js": -/*!*************************************!* +/*!*************************************!*\ !*** ./node_modules/d/auto-bind.js ***! \*************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -3465,7 +3443,7 @@ eval("\n\nvar isValue = __webpack_require__(/*! type/value/is */ \". /***/ }), /***/ "./node_modules/d/index.js": -/*!*********************************!* +/*!*********************************!*\ !*** ./node_modules/d/index.js ***! \*********************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -3476,7 +3454,7 @@ eval("\n\nvar isValue = __webpack_require__(/*! type/value/is */ \"./nod /***/ }), /***/ "./node_modules/debounce/index.js": -/*!****************************************!* +/*!****************************************!*\ !*** ./node_modules/debounce/index.js ***! \****************************************/ /***/ ((module) => { @@ -3486,18 +3464,17 @@ eval("/**\n * Returns a function, that, as long as it continues to be invoked, w /***/ }), /***/ "./node_modules/dropzone/dist/dropzone.js": -/*!************************************************!* +/*!************************************************!*\ !*** ./node_modules/dropzone/dist/dropzone.js ***! \************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { +/***/ ((module) => { -"use strict"; -eval("/* module decorator */ module = __webpack_require__.nmd(module);\n\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it[\"return\"] != null) it[\"return\"](); } finally { if (didErr) throw err; } } }; }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n/*\n *\n * More info at [www.dropzonejs.com](http://www.dropzonejs.com)\n *\n * Copyright (c) 2012, Matias Meno\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n// The Emitter class provides the ability to call `.on()` on Dropzone to listen\n// to events.\n// It is strongly based on component's emitter class, and I removed the\n// functionality because of the dependency hell with different frameworks.\nvar Emitter = /*#__PURE__*/function () {\n function Emitter() {\n _classCallCheck(this, Emitter);\n }\n\n _createClass(Emitter, [{\n key: \"on\",\n // Add an event listener for given event\n value: function on(event, fn) {\n this._callbacks = this._callbacks || {}; // Create namespace for this event\n\n if (!this._callbacks[event]) {\n this._callbacks[event] = [];\n }\n\n this._callbacks[event].push(fn);\n\n return this;\n }\n }, {\n key: \"emit\",\n value: function emit(event) {\n this._callbacks = this._callbacks || {};\n var callbacks = this._callbacks[event];\n\n if (callbacks) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n var _iterator = _createForOfIteratorHelper(callbacks),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var callback = _step.value;\n callback.apply(this, args);\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n }\n\n return this;\n } // Remove event listener for given event. If fn is not provided, all event\n // listeners for that event will be removed. If neither is provided, all\n // event listeners will be removed.\n\n }, {\n key: \"off\",\n value: function off(event, fn) {\n if (!this._callbacks || arguments.length === 0) {\n this._callbacks = {};\n return this;\n } // specific event\n\n\n var callbacks = this._callbacks[event];\n\n if (!callbacks) {\n return this;\n } // remove all handlers\n\n\n if (arguments.length === 1) {\n delete this._callbacks[event];\n return this;\n } // remove specific handler\n\n\n for (var i = 0; i < callbacks.length; i++) {\n var callback = callbacks[i];\n\n if (callback === fn) {\n callbacks.splice(i, 1);\n break;\n }\n }\n\n return this;\n }\n }]);\n\n return Emitter;\n}();\n\nvar Dropzone = /*#__PURE__*/function (_Emitter) {\n _inherits(Dropzone, _Emitter);\n\n var _super = _createSuper(Dropzone);\n\n _createClass(Dropzone, null, [{\n key: \"initClass\",\n value: function initClass() {\n // Exposing the emitter class, mainly for tests\n this.prototype.Emitter = Emitter;\n /*\n This is a list of all available events you can register on a dropzone object.\n You can register an event handler like this:\n dropzone.on(\"dragEnter\", function() { });\n */\n\n this.prototype.events = [\"drop\", \"dragstart\", \"dragend\", \"dragenter\", \"dragover\", \"dragleave\", \"addedfile\", \"addedfiles\", \"removedfile\", \"thumbnail\", \"error\", \"errormultiple\", \"processing\", \"processingmultiple\", \"uploadprogress\", \"totaluploadprogress\", \"sending\", \"sendingmultiple\", \"success\", \"successmultiple\", \"canceled\", \"canceledmultiple\", \"complete\", \"completemultiple\", \"reset\", \"maxfilesexceeded\", \"maxfilesreached\", \"queuecomplete\"];\n this.prototype.defaultOptions = {\n /**\n * Has to be specified on elements other than form (or when the form\n * doesn't have an `action` attribute). You can also\n * provide a function that will be called with `files` and\n * must return the url (since `v3.12.0`)\n */\n url: null,\n\n /**\n * Can be changed to `\"put\"` if necessary. You can also provide a function\n * that will be called with `files` and must return the method (since `v3.12.0`).\n */\n method: \"post\",\n\n /**\n * Will be set on the XHRequest.\n */\n withCredentials: false,\n\n /**\n * The timeout for the XHR requests in milliseconds (since `v4.4.0`).\n */\n timeout: 30000,\n\n /**\n * How many file uploads to process in parallel (See the\n * Enqueuing file uploads documentation section for more info)\n */\n parallelUploads: 2,\n\n /**\n * Whether to send multiple files in one request. If\n * this it set to true, then the fallback file input element will\n * have the `multiple` attribute as well. This option will\n * also trigger additional events (like `processingmultiple`). See the events\n * documentation section for more information.\n */\n uploadMultiple: false,\n\n /**\n * Whether you want files to be uploaded in chunks to your server. This can't be\n * used in combination with `uploadMultiple`.\n *\n * See [chunksUploaded](#config-chunksUploaded) for the callback to finalise an upload.\n */\n chunking: false,\n\n /**\n * If `chunking` is enabled, this defines whether **every** file should be chunked,\n * even if the file size is below chunkSize. This means, that the additional chunk\n * form data will be submitted and the `chunksUploaded` callback will be invoked.\n */\n forceChunking: false,\n\n /**\n * If `chunking` is `true`, then this defines the chunk size in bytes.\n */\n chunkSize: 2000000,\n\n /**\n * If `true`, the individual chunks of a file are being uploaded simultaneously.\n */\n parallelChunkUploads: false,\n\n /**\n * Whether a chunk should be retried if it fails.\n */\n retryChunks: false,\n\n /**\n * If `retryChunks` is true, how many times should it be retried.\n */\n retryChunksLimit: 3,\n\n /**\n * If not `null` defines how many files this Dropzone handles. If it exceeds,\n * the event `maxfilesexceeded` will be called. The dropzone element gets the\n * class `dz-max-files-reached` accordingly so you can provide visual feedback.\n */\n maxFilesize: 256,\n\n /**\n * The name of the file param that gets transferred.\n * **NOTE**: If you have the option `uploadMultiple` set to `true`, then\n * Dropzone will append `[]` to the name.\n */\n paramName: \"file\",\n\n /**\n * Whether thumbnails for images should be generated\n */\n createImageThumbnails: true,\n\n /**\n * In MB. When the filename exceeds this limit, the thumbnail will not be generated.\n */\n maxThumbnailFilesize: 10,\n\n /**\n * If `null`, the ratio of the image will be used to calculate it.\n */\n thumbnailWidth: 120,\n\n /**\n * The same as `thumbnailWidth`. If both are null, images will not be resized.\n */\n thumbnailHeight: 120,\n\n /**\n * How the images should be scaled down in case both, `thumbnailWidth` and `thumbnailHeight` are provided.\n * Can be either `contain` or `crop`.\n */\n thumbnailMethod: 'crop',\n\n /**\n * If set, images will be resized to these dimensions before being **uploaded**.\n * If only one, `resizeWidth` **or** `resizeHeight` is provided, the original aspect\n * ratio of the file will be preserved.\n *\n * The `options.transformFile` function uses these options, so if the `transformFile` function\n * is overridden, these options don't do anything.\n */\n resizeWidth: null,\n\n /**\n * See `resizeWidth`.\n */\n resizeHeight: null,\n\n /**\n * The mime type of the resized image (before it gets uploaded to the server).\n * If `null` the original mime type will be used. To force jpeg, for example, use `image/jpeg`.\n * See `resizeWidth` for more information.\n */\n resizeMimeType: null,\n\n /**\n * The quality of the resized images. See `resizeWidth`.\n */\n resizeQuality: 0.8,\n\n /**\n * How the images should be scaled down in case both, `resizeWidth` and `resizeHeight` are provided.\n * Can be either `contain` or `crop`.\n */\n resizeMethod: 'contain',\n\n /**\n * The base that is used to calculate the filesize. You can change this to\n * 1024 if you would rather display kibibytes, mebibytes, etc...\n * 1024 is technically incorrect, because `1024 bytes` are `1 kibibyte` not `1 kilobyte`.\n * You can change this to `1024` if you don't care about validity.\n */\n filesizeBase: 1000,\n\n /**\n * Can be used to limit the maximum number of files that will be handled by this Dropzone\n */\n maxFiles: null,\n\n /**\n * An optional object to send additional headers to the server. Eg:\n * `{ \"My-Awesome-Header\": \"header value\" }`\n */\n headers: null,\n\n /**\n * If `true`, the dropzone element itself will be clickable, if `false`\n * nothing will be clickable.\n *\n * You can also pass an HTML element, a CSS selector (for multiple elements)\n * or an array of those. In that case, all of those elements will trigger an\n * upload when clicked.\n */\n clickable: true,\n\n /**\n * Whether hidden files in directories should be ignored.\n */\n ignoreHiddenFiles: true,\n\n /**\n * The default implementation of `accept` checks the file's mime type or\n * extension against this list. This is a comma separated list of mime\n * types or file extensions.\n *\n * Eg.: `image/*,application/pdf,.psd`\n *\n * If the Dropzone is `clickable` this option will also be used as\n * [`accept`](https://developer.mozilla.org/en-US/docs/HTML/Element/input#attr-accept)\n * parameter on the hidden file input as well.\n */\n acceptedFiles: null,\n\n /**\n * **Deprecated!**\n * Use acceptedFiles instead.\n */\n acceptedMimeTypes: null,\n\n /**\n * If false, files will be added to the queue but the queue will not be\n * processed automatically.\n * This can be useful if you need some additional user input before sending\n * files (or if you want want all files sent at once).\n * If you're ready to send the file simply call `myDropzone.processQueue()`.\n *\n * See the [enqueuing file uploads](#enqueuing-file-uploads) documentation\n * section for more information.\n */\n autoProcessQueue: true,\n\n /**\n * If false, files added to the dropzone will not be queued by default.\n * You'll have to call `enqueueFile(file)` manually.\n */\n autoQueue: true,\n\n /**\n * If `true`, this will add a link to every file preview to remove or cancel (if\n * already uploading) the file. The `dictCancelUpload`, `dictCancelUploadConfirmation`\n * and `dictRemoveFile` options are used for the wording.\n */\n addRemoveLinks: false,\n\n /**\n * Defines where to display the file previews – if `null` the\n * Dropzone element itself is used. Can be a plain `HTMLElement` or a CSS\n * selector. The element should have the `dropzone-previews` class so\n * the previews are displayed properly.\n */\n previewsContainer: null,\n\n /**\n * This is the element the hidden input field (which is used when clicking on the\n * dropzone to trigger file selection) will be appended to. This might\n * be important in case you use frameworks to switch the content of your page.\n *\n * Can be a selector string, or an element directly.\n */\n hiddenInputContainer: \"body\",\n\n /**\n * If null, no capture type will be specified\n * If camera, mobile devices will skip the file selection and choose camera\n * If microphone, mobile devices will skip the file selection and choose the microphone\n * If camcorder, mobile devices will skip the file selection and choose the camera in video mode\n * On apple devices multiple must be set to false. AcceptedFiles may need to\n * be set to an appropriate mime type (e.g. \"image/*\", \"audio/*\", or \"video/*\").\n */\n capture: null,\n\n /**\n * **Deprecated**. Use `renameFile` instead.\n */\n renameFilename: null,\n\n /**\n * A function that is invoked before the file is uploaded to the server and renames the file.\n * This function gets the `File` as argument and can use the `file.name`. The actual name of the\n * file that gets used during the upload can be accessed through `file.upload.filename`.\n */\n renameFile: null,\n\n /**\n * If `true` the fallback will be forced. This is very useful to test your server\n * implementations first and make sure that everything works as\n * expected without dropzone if you experience problems, and to test\n * how your fallbacks will look.\n */\n forceFallback: false,\n\n /**\n * The text used before any files are dropped.\n */\n dictDefaultMessage: \"Drop files here to upload\",\n\n /**\n * The text that replaces the default message text it the browser is not supported.\n */\n dictFallbackMessage: \"Your browser does not support drag'n'drop file uploads.\",\n\n /**\n * The text that will be added before the fallback form.\n * If you provide a fallback element yourself, or if this option is `null` this will\n * be ignored.\n */\n dictFallbackText: \"Please use the fallback form below to upload your files like in the olden days.\",\n\n /**\n * If the filesize is too big.\n * `{{filesize}}` and `{{maxFilesize}}` will be replaced with the respective configuration values.\n */\n dictFileTooBig: \"File is too big ({{filesize}}MiB). Max filesize: {{maxFilesize}}MiB.\",\n\n /**\n * If the file doesn't match the file type.\n */\n dictInvalidFileType: \"You can't upload files of this type.\",\n\n /**\n * If the server response was invalid.\n * `{{statusCode}}` will be replaced with the servers status code.\n */\n dictResponseError: \"Server responded with {{statusCode}} code.\",\n\n /**\n * If `addRemoveLinks` is true, the text to be used for the cancel upload link.\n */\n dictCancelUpload: \"Cancel upload\",\n\n /**\n * The text that is displayed if an upload was manually canceled\n */\n dictUploadCanceled: \"Upload canceled.\",\n\n /**\n * If `addRemoveLinks` is true, the text to be used for confirmation when cancelling upload.\n */\n dictCancelUploadConfirmation: \"Are you sure you want to cancel this upload?\",\n\n /**\n * If `addRemoveLinks` is true, the text to be used to remove a file.\n */\n dictRemoveFile: \"Remove file\",\n\n /**\n * If this is not null, then the user will be prompted before removing a file.\n */\n dictRemoveFileConfirmation: null,\n\n /**\n * Displayed if `maxFiles` is st and exceeded.\n * The string `{{maxFiles}}` will be replaced by the configuration value.\n */\n dictMaxFilesExceeded: \"You can not upload any more files.\",\n\n /**\n * Allows you to translate the different units. Starting with `tb` for terabytes and going down to\n * `b` for bytes.\n */\n dictFileSizeUnits: {\n tb: \"TB\",\n gb: \"GB\",\n mb: \"MB\",\n kb: \"KB\",\n b: \"b\"\n },\n\n /**\n * Called when dropzone initialized\n * You can add event listeners here\n */\n init: function init() {},\n\n /**\n * Can be an **object** of additional parameters to transfer to the server, **or** a `Function`\n * that gets invoked with the `files`, `xhr` and, if it's a chunked upload, `chunk` arguments. In case\n * of a function, this needs to return a map.\n *\n * The default implementation does nothing for normal uploads, but adds relevant information for\n * chunked uploads.\n *\n * This is the same as adding hidden input fields in the form element.\n */\n params: function params(files, xhr, chunk) {\n if (chunk) {\n return {\n dzuuid: chunk.file.upload.uuid,\n dzchunkindex: chunk.index,\n dztotalfilesize: chunk.file.size,\n dzchunksize: this.options.chunkSize,\n dztotalchunkcount: chunk.file.upload.totalChunkCount,\n dzchunkbyteoffset: chunk.index * this.options.chunkSize\n };\n }\n },\n\n /**\n * A function that gets a [file](https://developer.mozilla.org/en-US/docs/DOM/File)\n * and a `done` function as parameters.\n *\n * If the done function is invoked without arguments, the file is \"accepted\" and will\n * be processed. If you pass an error message, the file is rejected, and the error\n * message will be displayed.\n * This function will not be called if the file is too big or doesn't match the mime types.\n */\n accept: function accept(file, done) {\n return done();\n },\n\n /**\n * The callback that will be invoked when all chunks have been uploaded for a file.\n * It gets the file for which the chunks have been uploaded as the first parameter,\n * and the `done` function as second. `done()` needs to be invoked when everything\n * needed to finish the upload process is done.\n */\n chunksUploaded: function chunksUploaded(file, done) {\n done();\n },\n\n /**\n * Gets called when the browser is not supported.\n * The default implementation shows the fallback input field and adds\n * a text.\n */\n fallback: function fallback() {\n // This code should pass in IE7... :(\n var messageElement;\n this.element.className = \"\".concat(this.element.className, \" dz-browser-not-supported\");\n\n var _iterator2 = _createForOfIteratorHelper(this.element.getElementsByTagName(\"div\")),\n _step2;\n\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n var child = _step2.value;\n\n if (/(^| )dz-message($| )/.test(child.className)) {\n messageElement = child;\n child.className = \"dz-message\"; // Removes the 'dz-default' class\n\n break;\n }\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n\n if (!messageElement) {\n messageElement = Dropzone.createElement(\"
                  \");\n this.element.appendChild(messageElement);\n }\n\n var span = messageElement.getElementsByTagName(\"span\")[0];\n\n if (span) {\n if (span.textContent != null) {\n span.textContent = this.options.dictFallbackMessage;\n } else if (span.innerText != null) {\n span.innerText = this.options.dictFallbackMessage;\n }\n }\n\n return this.element.appendChild(this.getFallbackForm());\n },\n\n /**\n * Gets called to calculate the thumbnail dimensions.\n *\n * It gets `file`, `width` and `height` (both may be `null`) as parameters and must return an object containing:\n *\n * - `srcWidth` & `srcHeight` (required)\n * - `trgWidth` & `trgHeight` (required)\n * - `srcX` & `srcY` (optional, default `0`)\n * - `trgX` & `trgY` (optional, default `0`)\n *\n * Those values are going to be used by `ctx.drawImage()`.\n */\n resize: function resize(file, width, height, resizeMethod) {\n var info = {\n srcX: 0,\n srcY: 0,\n srcWidth: file.width,\n srcHeight: file.height\n };\n var srcRatio = file.width / file.height; // Automatically calculate dimensions if not specified\n\n if (width == null && height == null) {\n width = info.srcWidth;\n height = info.srcHeight;\n } else if (width == null) {\n width = height * srcRatio;\n } else if (height == null) {\n height = width / srcRatio;\n } // Make sure images aren't upscaled\n\n\n width = Math.min(width, info.srcWidth);\n height = Math.min(height, info.srcHeight);\n var trgRatio = width / height;\n\n if (info.srcWidth > width || info.srcHeight > height) {\n // Image is bigger and needs rescaling\n if (resizeMethod === 'crop') {\n if (srcRatio > trgRatio) {\n info.srcHeight = file.height;\n info.srcWidth = info.srcHeight * trgRatio;\n } else {\n info.srcWidth = file.width;\n info.srcHeight = info.srcWidth / trgRatio;\n }\n } else if (resizeMethod === 'contain') {\n // Method 'contain'\n if (srcRatio > trgRatio) {\n height = width / srcRatio;\n } else {\n width = height * srcRatio;\n }\n } else {\n throw new Error(\"Unknown resizeMethod '\".concat(resizeMethod, \"'\"));\n }\n }\n\n info.srcX = (file.width - info.srcWidth) / 2;\n info.srcY = (file.height - info.srcHeight) / 2;\n info.trgWidth = width;\n info.trgHeight = height;\n return info;\n },\n\n /**\n * Can be used to transform the file (for example, resize an image if necessary).\n *\n * The default implementation uses `resizeWidth` and `resizeHeight` (if provided) and resizes\n * images according to those dimensions.\n *\n * Gets the `file` as the first parameter, and a `done()` function as the second, that needs\n * to be invoked with the file when the transformation is done.\n */\n transformFile: function transformFile(file, done) {\n if ((this.options.resizeWidth || this.options.resizeHeight) && file.type.match(/image.*/)) {\n return this.resizeImage(file, this.options.resizeWidth, this.options.resizeHeight, this.options.resizeMethod, done);\n } else {\n return done(file);\n }\n },\n\n /**\n * A string that contains the template used for each dropped\n * file. Change it to fulfill your needs but make sure to properly\n * provide all elements.\n *\n * If you want to use an actual HTML element instead of providing a String\n * as a config option, you could create a div with the id `tpl`,\n * put the template inside it and provide the element like this:\n *\n * document\n * .querySelector('#tpl')\n * .innerHTML\n *\n */\n previewTemplate: \"
                  \\n
                  \\n
                  \\n
                  \\n
                  \\n
                  \\n
                  \\n
                  \\n
                  \\n \\n Check\\n \\n \\n \\n \\n
                  \\n
                  \\n \\n Error\\n \\n \\n \\n \\n \\n \\n
                  \\n
                  \",\n // END OPTIONS\n // (Required by the dropzone documentation parser)\n\n /*\n Those functions register themselves to the events on init and handle all\n the user interface specific stuff. Overwriting them won't break the upload\n but can break the way it's displayed.\n You can overwrite them if you don't like the default behavior. If you just\n want to add an additional event handler, register it on the dropzone object\n and don't overwrite those options.\n */\n // Those are self explanatory and simply concern the DragnDrop.\n drop: function drop(e) {\n return this.element.classList.remove(\"dz-drag-hover\");\n },\n dragstart: function dragstart(e) {},\n dragend: function dragend(e) {\n return this.element.classList.remove(\"dz-drag-hover\");\n },\n dragenter: function dragenter(e) {\n return this.element.classList.add(\"dz-drag-hover\");\n },\n dragover: function dragover(e) {\n return this.element.classList.add(\"dz-drag-hover\");\n },\n dragleave: function dragleave(e) {\n return this.element.classList.remove(\"dz-drag-hover\");\n },\n paste: function paste(e) {},\n // Called whenever there are no files left in the dropzone anymore, and the\n // dropzone should be displayed as if in the initial state.\n reset: function reset() {\n return this.element.classList.remove(\"dz-started\");\n },\n // Called when a file is added to the queue\n // Receives `file`\n addedfile: function addedfile(file) {\n var _this2 = this;\n\n if (this.element === this.previewsContainer) {\n this.element.classList.add(\"dz-started\");\n }\n\n if (this.previewsContainer) {\n file.previewElement = Dropzone.createElement(this.options.previewTemplate.trim());\n file.previewTemplate = file.previewElement; // Backwards compatibility\n\n this.previewsContainer.appendChild(file.previewElement);\n\n var _iterator3 = _createForOfIteratorHelper(file.previewElement.querySelectorAll(\"[data-dz-name]\")),\n _step3;\n\n try {\n for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {\n var node = _step3.value;\n node.textContent = file.name;\n }\n } catch (err) {\n _iterator3.e(err);\n } finally {\n _iterator3.f();\n }\n\n var _iterator4 = _createForOfIteratorHelper(file.previewElement.querySelectorAll(\"[data-dz-size]\")),\n _step4;\n\n try {\n for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {\n node = _step4.value;\n node.innerHTML = this.filesize(file.size);\n }\n } catch (err) {\n _iterator4.e(err);\n } finally {\n _iterator4.f();\n }\n\n if (this.options.addRemoveLinks) {\n file._removeLink = Dropzone.createElement(\"\".concat(this.options.dictRemoveFile, \"\"));\n file.previewElement.appendChild(file._removeLink);\n }\n\n var removeFileEvent = function removeFileEvent(e) {\n e.preventDefault();\n e.stopPropagation();\n\n if (file.status === Dropzone.UPLOADING) {\n return Dropzone.confirm(_this2.options.dictCancelUploadConfirmation, function () {\n return _this2.removeFile(file);\n });\n } else {\n if (_this2.options.dictRemoveFileConfirmation) {\n return Dropzone.confirm(_this2.options.dictRemoveFileConfirmation, function () {\n return _this2.removeFile(file);\n });\n } else {\n return _this2.removeFile(file);\n }\n }\n };\n\n var _iterator5 = _createForOfIteratorHelper(file.previewElement.querySelectorAll(\"[data-dz-remove]\")),\n _step5;\n\n try {\n for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {\n var removeLink = _step5.value;\n removeLink.addEventListener(\"click\", removeFileEvent);\n }\n } catch (err) {\n _iterator5.e(err);\n } finally {\n _iterator5.f();\n }\n }\n },\n // Called whenever a file is removed.\n removedfile: function removedfile(file) {\n if (file.previewElement != null && file.previewElement.parentNode != null) {\n file.previewElement.parentNode.removeChild(file.previewElement);\n }\n\n return this._updateMaxFilesReachedClass();\n },\n // Called when a thumbnail has been generated\n // Receives `file` and `dataUrl`\n thumbnail: function thumbnail(file, dataUrl) {\n if (file.previewElement) {\n file.previewElement.classList.remove(\"dz-file-preview\");\n\n var _iterator6 = _createForOfIteratorHelper(file.previewElement.querySelectorAll(\"[data-dz-thumbnail]\")),\n _step6;\n\n try {\n for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {\n var thumbnailElement = _step6.value;\n thumbnailElement.alt = file.name;\n thumbnailElement.src = dataUrl;\n }\n } catch (err) {\n _iterator6.e(err);\n } finally {\n _iterator6.f();\n }\n\n return setTimeout(function () {\n return file.previewElement.classList.add(\"dz-image-preview\");\n }, 1);\n }\n },\n // Called whenever an error occurs\n // Receives `file` and `message`\n error: function error(file, message) {\n if (file.previewElement) {\n file.previewElement.classList.add(\"dz-error\");\n\n if (typeof message !== \"string\" && message.error) {\n message = message.error;\n }\n\n var _iterator7 = _createForOfIteratorHelper(file.previewElement.querySelectorAll(\"[data-dz-errormessage]\")),\n _step7;\n\n try {\n for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {\n var node = _step7.value;\n node.textContent = message;\n }\n } catch (err) {\n _iterator7.e(err);\n } finally {\n _iterator7.f();\n }\n }\n },\n errormultiple: function errormultiple() {},\n // Called when a file gets processed. Since there is a cue, not all added\n // files are processed immediately.\n // Receives `file`\n processing: function processing(file) {\n if (file.previewElement) {\n file.previewElement.classList.add(\"dz-processing\");\n\n if (file._removeLink) {\n return file._removeLink.innerHTML = this.options.dictCancelUpload;\n }\n }\n },\n processingmultiple: function processingmultiple() {},\n // Called whenever the upload progress gets updated.\n // Receives `file`, `progress` (percentage 0-100) and `bytesSent`.\n // To get the total number of bytes of the file, use `file.size`\n uploadprogress: function uploadprogress(file, progress, bytesSent) {\n if (file.previewElement) {\n var _iterator8 = _createForOfIteratorHelper(file.previewElement.querySelectorAll(\"[data-dz-uploadprogress]\")),\n _step8;\n\n try {\n for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) {\n var node = _step8.value;\n node.nodeName === 'PROGRESS' ? node.value = progress : node.style.width = \"\".concat(progress, \"%\");\n }\n } catch (err) {\n _iterator8.e(err);\n } finally {\n _iterator8.f();\n }\n }\n },\n // Called whenever the total upload progress gets updated.\n // Called with totalUploadProgress (0-100), totalBytes and totalBytesSent\n totaluploadprogress: function totaluploadprogress() {},\n // Called just before the file is sent. Gets the `xhr` object as second\n // parameter, so you can modify it (for example to add a CSRF token) and a\n // `formData` object to add additional information.\n sending: function sending() {},\n sendingmultiple: function sendingmultiple() {},\n // When the complete upload is finished and successful\n // Receives `file`\n success: function success(file) {\n if (file.previewElement) {\n return file.previewElement.classList.add(\"dz-success\");\n }\n },\n successmultiple: function successmultiple() {},\n // When the upload is canceled.\n canceled: function canceled(file) {\n return this.emit(\"error\", file, this.options.dictUploadCanceled);\n },\n canceledmultiple: function canceledmultiple() {},\n // When the upload is finished, either with success or an error.\n // Receives `file`\n complete: function complete(file) {\n if (file._removeLink) {\n file._removeLink.innerHTML = this.options.dictRemoveFile;\n }\n\n if (file.previewElement) {\n return file.previewElement.classList.add(\"dz-complete\");\n }\n },\n completemultiple: function completemultiple() {},\n maxfilesexceeded: function maxfilesexceeded() {},\n maxfilesreached: function maxfilesreached() {},\n queuecomplete: function queuecomplete() {},\n addedfiles: function addedfiles() {}\n };\n this.prototype._thumbnailQueue = [];\n this.prototype._processingThumbnail = false;\n } // global utility\n\n }, {\n key: \"extend\",\n value: function extend(target) {\n for (var _len2 = arguments.length, objects = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n objects[_key2 - 1] = arguments[_key2];\n }\n\n for (var _i = 0, _objects = objects; _i < _objects.length; _i++) {\n var object = _objects[_i];\n\n for (var key in object) {\n var val = object[key];\n target[key] = val;\n }\n }\n\n return target;\n }\n }]);\n\n function Dropzone(el, options) {\n var _this;\n\n _classCallCheck(this, Dropzone);\n\n _this = _super.call(this);\n var fallback, left;\n _this.element = el; // For backwards compatibility since the version was in the prototype previously\n\n _this.version = Dropzone.version;\n _this.defaultOptions.previewTemplate = _this.defaultOptions.previewTemplate.replace(/\\n*/g, \"\");\n _this.clickableElements = [];\n _this.listeners = [];\n _this.files = []; // All files\n\n if (typeof _this.element === \"string\") {\n _this.element = document.querySelector(_this.element);\n } // Not checking if instance of HTMLElement or Element since IE9 is extremely weird.\n\n\n if (!_this.element || _this.element.nodeType == null) {\n throw new Error(\"Invalid dropzone element.\");\n }\n\n if (_this.element.dropzone) {\n throw new Error(\"Dropzone already attached.\");\n } // Now add this dropzone to the instances.\n\n\n Dropzone.instances.push(_assertThisInitialized(_this)); // Put the dropzone inside the element itself.\n\n _this.element.dropzone = _assertThisInitialized(_this);\n var elementOptions = (left = Dropzone.optionsForElement(_this.element)) != null ? left : {};\n _this.options = Dropzone.extend({}, _this.defaultOptions, elementOptions, options != null ? options : {}); // If the browser failed, just call the fallback and leave\n\n if (_this.options.forceFallback || !Dropzone.isBrowserSupported()) {\n return _possibleConstructorReturn(_this, _this.options.fallback.call(_assertThisInitialized(_this)));\n } // @options.url = @element.getAttribute \"action\" unless @options.url?\n\n\n if (_this.options.url == null) {\n _this.options.url = _this.element.getAttribute(\"action\");\n }\n\n if (!_this.options.url) {\n throw new Error(\"No URL provided.\");\n }\n\n if (_this.options.acceptedFiles && _this.options.acceptedMimeTypes) {\n throw new Error(\"You can't provide both 'acceptedFiles' and 'acceptedMimeTypes'. 'acceptedMimeTypes' is deprecated.\");\n }\n\n if (_this.options.uploadMultiple && _this.options.chunking) {\n throw new Error('You cannot set both: uploadMultiple and chunking.');\n } // Backwards compatibility\n\n\n if (_this.options.acceptedMimeTypes) {\n _this.options.acceptedFiles = _this.options.acceptedMimeTypes;\n delete _this.options.acceptedMimeTypes;\n } // Backwards compatibility\n\n\n if (_this.options.renameFilename != null) {\n _this.options.renameFile = function (file) {\n return _this.options.renameFilename.call(_assertThisInitialized(_this), file.name, file);\n };\n }\n\n if (typeof _this.options.method === 'string') {\n _this.options.method = _this.options.method.toUpperCase();\n }\n\n if ((fallback = _this.getExistingFallback()) && fallback.parentNode) {\n // Remove the fallback\n fallback.parentNode.removeChild(fallback);\n } // Display previews in the previewsContainer element or the Dropzone element unless explicitly set to false\n\n\n if (_this.options.previewsContainer !== false) {\n if (_this.options.previewsContainer) {\n _this.previewsContainer = Dropzone.getElement(_this.options.previewsContainer, \"previewsContainer\");\n } else {\n _this.previewsContainer = _this.element;\n }\n }\n\n if (_this.options.clickable) {\n if (_this.options.clickable === true) {\n _this.clickableElements = [_this.element];\n } else {\n _this.clickableElements = Dropzone.getElements(_this.options.clickable, \"clickable\");\n }\n }\n\n _this.init();\n\n return _this;\n } // Returns all files that have been accepted\n\n\n _createClass(Dropzone, [{\n key: \"getAcceptedFiles\",\n value: function getAcceptedFiles() {\n return this.files.filter(function (file) {\n return file.accepted;\n }).map(function (file) {\n return file;\n });\n } // Returns all files that have been rejected\n // Not sure when that's going to be useful, but added for completeness.\n\n }, {\n key: \"getRejectedFiles\",\n value: function getRejectedFiles() {\n return this.files.filter(function (file) {\n return !file.accepted;\n }).map(function (file) {\n return file;\n });\n }\n }, {\n key: \"getFilesWithStatus\",\n value: function getFilesWithStatus(status) {\n return this.files.filter(function (file) {\n return file.status === status;\n }).map(function (file) {\n return file;\n });\n } // Returns all files that are in the queue\n\n }, {\n key: \"getQueuedFiles\",\n value: function getQueuedFiles() {\n return this.getFilesWithStatus(Dropzone.QUEUED);\n }\n }, {\n key: \"getUploadingFiles\",\n value: function getUploadingFiles() {\n return this.getFilesWithStatus(Dropzone.UPLOADING);\n }\n }, {\n key: \"getAddedFiles\",\n value: function getAddedFiles() {\n return this.getFilesWithStatus(Dropzone.ADDED);\n } // Files that are either queued or uploading\n\n }, {\n key: \"getActiveFiles\",\n value: function getActiveFiles() {\n return this.files.filter(function (file) {\n return file.status === Dropzone.UPLOADING || file.status === Dropzone.QUEUED;\n }).map(function (file) {\n return file;\n });\n } // The function that gets called when Dropzone is initialized. You\n // can (and should) setup event listeners inside this function.\n\n }, {\n key: \"init\",\n value: function init() {\n var _this3 = this;\n\n // In case it isn't set already\n if (this.element.tagName === \"form\") {\n this.element.setAttribute(\"enctype\", \"multipart/form-data\");\n }\n\n if (this.element.classList.contains(\"dropzone\") && !this.element.querySelector(\".dz-message\")) {\n this.element.appendChild(Dropzone.createElement(\"
                  \")));\n }\n\n if (this.clickableElements.length) {\n var setupHiddenFileInput = function setupHiddenFileInput() {\n if (_this3.hiddenFileInput) {\n _this3.hiddenFileInput.parentNode.removeChild(_this3.hiddenFileInput);\n }\n\n _this3.hiddenFileInput = document.createElement(\"input\");\n\n _this3.hiddenFileInput.setAttribute(\"type\", \"file\");\n\n if (_this3.options.maxFiles === null || _this3.options.maxFiles > 1) {\n _this3.hiddenFileInput.setAttribute(\"multiple\", \"multiple\");\n }\n\n _this3.hiddenFileInput.className = \"dz-hidden-input\";\n\n if (_this3.options.acceptedFiles !== null) {\n _this3.hiddenFileInput.setAttribute(\"accept\", _this3.options.acceptedFiles);\n }\n\n if (_this3.options.capture !== null) {\n _this3.hiddenFileInput.setAttribute(\"capture\", _this3.options.capture);\n } // Not setting `display=\"none\"` because some browsers don't accept clicks\n // on elements that aren't displayed.\n\n\n _this3.hiddenFileInput.style.visibility = \"hidden\";\n _this3.hiddenFileInput.style.position = \"absolute\";\n _this3.hiddenFileInput.style.top = \"0\";\n _this3.hiddenFileInput.style.left = \"0\";\n _this3.hiddenFileInput.style.height = \"0\";\n _this3.hiddenFileInput.style.width = \"0\";\n Dropzone.getElement(_this3.options.hiddenInputContainer, 'hiddenInputContainer').appendChild(_this3.hiddenFileInput);\n return _this3.hiddenFileInput.addEventListener(\"change\", function () {\n var files = _this3.hiddenFileInput.files;\n\n if (files.length) {\n var _iterator9 = _createForOfIteratorHelper(files),\n _step9;\n\n try {\n for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) {\n var file = _step9.value;\n\n _this3.addFile(file);\n }\n } catch (err) {\n _iterator9.e(err);\n } finally {\n _iterator9.f();\n }\n }\n\n _this3.emit(\"addedfiles\", files);\n\n return setupHiddenFileInput();\n });\n };\n\n setupHiddenFileInput();\n }\n\n this.URL = window.URL !== null ? window.URL : window.webkitURL; // Setup all event listeners on the Dropzone object itself.\n // They're not in @setupEventListeners() because they shouldn't be removed\n // again when the dropzone gets disabled.\n\n var _iterator10 = _createForOfIteratorHelper(this.events),\n _step10;\n\n try {\n for (_iterator10.s(); !(_step10 = _iterator10.n()).done;) {\n var eventName = _step10.value;\n this.on(eventName, this.options[eventName]);\n }\n } catch (err) {\n _iterator10.e(err);\n } finally {\n _iterator10.f();\n }\n\n this.on(\"uploadprogress\", function () {\n return _this3.updateTotalUploadProgress();\n });\n this.on(\"removedfile\", function () {\n return _this3.updateTotalUploadProgress();\n });\n this.on(\"canceled\", function (file) {\n return _this3.emit(\"complete\", file);\n }); // Emit a `queuecomplete` event if all files finished uploading.\n\n this.on(\"complete\", function (file) {\n if (_this3.getAddedFiles().length === 0 && _this3.getUploadingFiles().length === 0 && _this3.getQueuedFiles().length === 0) {\n // This needs to be deferred so that `queuecomplete` really triggers after `complete`\n return setTimeout(function () {\n return _this3.emit(\"queuecomplete\");\n }, 0);\n }\n });\n\n var containsFiles = function containsFiles(e) {\n if (e.dataTransfer.types) {\n // Because e.dataTransfer.types is an Object in\n // IE, we need to iterate like this instead of\n // using e.dataTransfer.types.some()\n for (var i = 0; i < e.dataTransfer.types.length; i++) {\n if (e.dataTransfer.types[i] === \"Files\") return true;\n }\n }\n\n return false;\n };\n\n var noPropagation = function noPropagation(e) {\n // If there are no files, we don't want to stop\n // propagation so we don't interfere with other\n // drag and drop behaviour.\n if (!containsFiles(e)) return;\n e.stopPropagation();\n\n if (e.preventDefault) {\n return e.preventDefault();\n } else {\n return e.returnValue = false;\n }\n }; // Create the listeners\n\n\n this.listeners = [{\n element: this.element,\n events: {\n \"dragstart\": function dragstart(e) {\n return _this3.emit(\"dragstart\", e);\n },\n \"dragenter\": function dragenter(e) {\n noPropagation(e);\n return _this3.emit(\"dragenter\", e);\n },\n \"dragover\": function dragover(e) {\n // Makes it possible to drag files from chrome's download bar\n // http://stackoverflow.com/questions/19526430/drag-and-drop-file-uploads-from-chrome-downloads-bar\n // Try is required to prevent bug in Internet Explorer 11 (SCRIPT65535 exception)\n var efct;\n\n try {\n efct = e.dataTransfer.effectAllowed;\n } catch (error) {}\n\n e.dataTransfer.dropEffect = 'move' === efct || 'linkMove' === efct ? 'move' : 'copy';\n noPropagation(e);\n return _this3.emit(\"dragover\", e);\n },\n \"dragleave\": function dragleave(e) {\n return _this3.emit(\"dragleave\", e);\n },\n \"drop\": function drop(e) {\n noPropagation(e);\n return _this3.drop(e);\n },\n \"dragend\": function dragend(e) {\n return _this3.emit(\"dragend\", e);\n }\n } // This is disabled right now, because the browsers don't implement it properly.\n // \"paste\": (e) =>\n // noPropagation e\n // @paste e\n\n }];\n this.clickableElements.forEach(function (clickableElement) {\n return _this3.listeners.push({\n element: clickableElement,\n events: {\n \"click\": function click(evt) {\n // Only the actual dropzone or the message element should trigger file selection\n if (clickableElement !== _this3.element || evt.target === _this3.element || Dropzone.elementInside(evt.target, _this3.element.querySelector(\".dz-message\"))) {\n _this3.hiddenFileInput.click(); // Forward the click\n\n }\n\n return true;\n }\n }\n });\n });\n this.enable();\n return this.options.init.call(this);\n } // Not fully tested yet\n\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.disable();\n this.removeAllFiles(true);\n\n if (this.hiddenFileInput != null ? this.hiddenFileInput.parentNode : undefined) {\n this.hiddenFileInput.parentNode.removeChild(this.hiddenFileInput);\n this.hiddenFileInput = null;\n }\n\n delete this.element.dropzone;\n return Dropzone.instances.splice(Dropzone.instances.indexOf(this), 1);\n }\n }, {\n key: \"updateTotalUploadProgress\",\n value: function updateTotalUploadProgress() {\n var totalUploadProgress;\n var totalBytesSent = 0;\n var totalBytes = 0;\n var activeFiles = this.getActiveFiles();\n\n if (activeFiles.length) {\n var _iterator11 = _createForOfIteratorHelper(this.getActiveFiles()),\n _step11;\n\n try {\n for (_iterator11.s(); !(_step11 = _iterator11.n()).done;) {\n var file = _step11.value;\n totalBytesSent += file.upload.bytesSent;\n totalBytes += file.upload.total;\n }\n } catch (err) {\n _iterator11.e(err);\n } finally {\n _iterator11.f();\n }\n\n totalUploadProgress = 100 * totalBytesSent / totalBytes;\n } else {\n totalUploadProgress = 100;\n }\n\n return this.emit(\"totaluploadprogress\", totalUploadProgress, totalBytes, totalBytesSent);\n } // @options.paramName can be a function taking one parameter rather than a string.\n // A parameter name for a file is obtained simply by calling this with an index number.\n\n }, {\n key: \"_getParamName\",\n value: function _getParamName(n) {\n if (typeof this.options.paramName === \"function\") {\n return this.options.paramName(n);\n } else {\n return \"\".concat(this.options.paramName).concat(this.options.uploadMultiple ? \"[\".concat(n, \"]\") : \"\");\n }\n } // If @options.renameFile is a function,\n // the function will be used to rename the file.name before appending it to the formData\n\n }, {\n key: \"_renameFile\",\n value: function _renameFile(file) {\n if (typeof this.options.renameFile !== \"function\") {\n return file.name;\n }\n\n return this.options.renameFile(file);\n } // Returns a form that can be used as fallback if the browser does not support DragnDrop\n //\n // If the dropzone is already a form, only the input field and button are returned. Otherwise a complete form element is provided.\n // This code has to pass in IE7 :(\n\n }, {\n key: \"getFallbackForm\",\n value: function getFallbackForm() {\n var existingFallback, form;\n\n if (existingFallback = this.getExistingFallback()) {\n return existingFallback;\n }\n\n var fieldsString = \"
                  \";\n\n if (this.options.dictFallbackText) {\n fieldsString += \"

                  \".concat(this.options.dictFallbackText, \"

                  \");\n }\n\n fieldsString += \"
                  \");\n var fields = Dropzone.createElement(fieldsString);\n\n if (this.element.tagName !== \"FORM\") {\n form = Dropzone.createElement(\"
                  \"));\n form.appendChild(fields);\n } else {\n // Make sure that the enctype and method attributes are set properly\n this.element.setAttribute(\"enctype\", \"multipart/form-data\");\n this.element.setAttribute(\"method\", this.options.method);\n }\n\n return form != null ? form : fields;\n } // Returns the fallback elements if they exist already\n //\n // This code has to pass in IE7 :(\n\n }, {\n key: \"getExistingFallback\",\n value: function getExistingFallback() {\n var getFallback = function getFallback(elements) {\n var _iterator12 = _createForOfIteratorHelper(elements),\n _step12;\n\n try {\n for (_iterator12.s(); !(_step12 = _iterator12.n()).done;) {\n var el = _step12.value;\n\n if (/(^| )fallback($| )/.test(el.className)) {\n return el;\n }\n }\n } catch (err) {\n _iterator12.e(err);\n } finally {\n _iterator12.f();\n }\n };\n\n for (var _i2 = 0, _arr = [\"div\", \"form\"]; _i2 < _arr.length; _i2++) {\n var tagName = _arr[_i2];\n var fallback;\n\n if (fallback = getFallback(this.element.getElementsByTagName(tagName))) {\n return fallback;\n }\n }\n } // Activates all listeners stored in @listeners\n\n }, {\n key: \"setupEventListeners\",\n value: function setupEventListeners() {\n return this.listeners.map(function (elementListeners) {\n return function () {\n var result = [];\n\n for (var event in elementListeners.events) {\n var listener = elementListeners.events[event];\n result.push(elementListeners.element.addEventListener(event, listener, false));\n }\n\n return result;\n }();\n });\n } // Deactivates all listeners stored in @listeners\n\n }, {\n key: \"removeEventListeners\",\n value: function removeEventListeners() {\n return this.listeners.map(function (elementListeners) {\n return function () {\n var result = [];\n\n for (var event in elementListeners.events) {\n var listener = elementListeners.events[event];\n result.push(elementListeners.element.removeEventListener(event, listener, false));\n }\n\n return result;\n }();\n });\n } // Removes all event listeners and cancels all files in the queue or being processed.\n\n }, {\n key: \"disable\",\n value: function disable() {\n var _this4 = this;\n\n this.clickableElements.forEach(function (element) {\n return element.classList.remove(\"dz-clickable\");\n });\n this.removeEventListeners();\n this.disabled = true;\n return this.files.map(function (file) {\n return _this4.cancelUpload(file);\n });\n }\n }, {\n key: \"enable\",\n value: function enable() {\n delete this.disabled;\n this.clickableElements.forEach(function (element) {\n return element.classList.add(\"dz-clickable\");\n });\n return this.setupEventListeners();\n } // Returns a nicely formatted filesize\n\n }, {\n key: \"filesize\",\n value: function filesize(size) {\n var selectedSize = 0;\n var selectedUnit = \"b\";\n\n if (size > 0) {\n var units = ['tb', 'gb', 'mb', 'kb', 'b'];\n\n for (var i = 0; i < units.length; i++) {\n var unit = units[i];\n var cutoff = Math.pow(this.options.filesizeBase, 4 - i) / 10;\n\n if (size >= cutoff) {\n selectedSize = size / Math.pow(this.options.filesizeBase, 4 - i);\n selectedUnit = unit;\n break;\n }\n }\n\n selectedSize = Math.round(10 * selectedSize) / 10; // Cutting of digits\n }\n\n return \"\".concat(selectedSize, \" \").concat(this.options.dictFileSizeUnits[selectedUnit]);\n } // Adds or removes the `dz-max-files-reached` class from the form.\n\n }, {\n key: \"_updateMaxFilesReachedClass\",\n value: function _updateMaxFilesReachedClass() {\n if (this.options.maxFiles != null && this.getAcceptedFiles().length >= this.options.maxFiles) {\n if (this.getAcceptedFiles().length === this.options.maxFiles) {\n this.emit('maxfilesreached', this.files);\n }\n\n return this.element.classList.add(\"dz-max-files-reached\");\n } else {\n return this.element.classList.remove(\"dz-max-files-reached\");\n }\n }\n }, {\n key: \"drop\",\n value: function drop(e) {\n if (!e.dataTransfer) {\n return;\n }\n\n this.emit(\"drop\", e); // Convert the FileList to an Array\n // This is necessary for IE11\n\n var files = [];\n\n for (var i = 0; i < e.dataTransfer.files.length; i++) {\n files[i] = e.dataTransfer.files[i];\n } // Even if it's a folder, files.length will contain the folders.\n\n\n if (files.length) {\n var items = e.dataTransfer.items;\n\n if (items && items.length && items[0].webkitGetAsEntry != null) {\n // The browser supports dropping of folders, so handle items instead of files\n this._addFilesFromItems(items);\n } else {\n this.handleFiles(files);\n }\n }\n\n this.emit(\"addedfiles\", files);\n }\n }, {\n key: \"paste\",\n value: function paste(e) {\n if (__guard__(e != null ? e.clipboardData : undefined, function (x) {\n return x.items;\n }) == null) {\n return;\n }\n\n this.emit(\"paste\", e);\n var items = e.clipboardData.items;\n\n if (items.length) {\n return this._addFilesFromItems(items);\n }\n }\n }, {\n key: \"handleFiles\",\n value: function handleFiles(files) {\n var _iterator13 = _createForOfIteratorHelper(files),\n _step13;\n\n try {\n for (_iterator13.s(); !(_step13 = _iterator13.n()).done;) {\n var file = _step13.value;\n this.addFile(file);\n }\n } catch (err) {\n _iterator13.e(err);\n } finally {\n _iterator13.f();\n }\n } // When a folder is dropped (or files are pasted), items must be handled\n // instead of files.\n\n }, {\n key: \"_addFilesFromItems\",\n value: function _addFilesFromItems(items) {\n var _this5 = this;\n\n return function () {\n var result = [];\n\n var _iterator14 = _createForOfIteratorHelper(items),\n _step14;\n\n try {\n for (_iterator14.s(); !(_step14 = _iterator14.n()).done;) {\n var item = _step14.value;\n var entry;\n\n if (item.webkitGetAsEntry != null && (entry = item.webkitGetAsEntry())) {\n if (entry.isFile) {\n result.push(_this5.addFile(item.getAsFile()));\n } else if (entry.isDirectory) {\n // Append all files from that directory to files\n result.push(_this5._addFilesFromDirectory(entry, entry.name));\n } else {\n result.push(undefined);\n }\n } else if (item.getAsFile != null) {\n if (item.kind == null || item.kind === \"file\") {\n result.push(_this5.addFile(item.getAsFile()));\n } else {\n result.push(undefined);\n }\n } else {\n result.push(undefined);\n }\n }\n } catch (err) {\n _iterator14.e(err);\n } finally {\n _iterator14.f();\n }\n\n return result;\n }();\n } // Goes through the directory, and adds each file it finds recursively\n\n }, {\n key: \"_addFilesFromDirectory\",\n value: function _addFilesFromDirectory(directory, path) {\n var _this6 = this;\n\n var dirReader = directory.createReader();\n\n var errorHandler = function errorHandler(error) {\n return __guardMethod__(console, 'log', function (o) {\n return o.log(error);\n });\n };\n\n var readEntries = function readEntries() {\n return dirReader.readEntries(function (entries) {\n if (entries.length > 0) {\n var _iterator15 = _createForOfIteratorHelper(entries),\n _step15;\n\n try {\n for (_iterator15.s(); !(_step15 = _iterator15.n()).done;) {\n var entry = _step15.value;\n\n if (entry.isFile) {\n entry.file(function (file) {\n if (_this6.options.ignoreHiddenFiles && file.name.substring(0, 1) === '.') {\n return;\n }\n\n file.fullPath = \"\".concat(path, \"/\").concat(file.name);\n return _this6.addFile(file);\n });\n } else if (entry.isDirectory) {\n _this6._addFilesFromDirectory(entry, \"\".concat(path, \"/\").concat(entry.name));\n }\n } // Recursively call readEntries() again, since browser only handle\n // the first 100 entries.\n // See: https://developer.mozilla.org/en-US/docs/Web/API/DirectoryReader#readEntries\n\n } catch (err) {\n _iterator15.e(err);\n } finally {\n _iterator15.f();\n }\n\n readEntries();\n }\n\n return null;\n }, errorHandler);\n };\n\n return readEntries();\n } // If `done()` is called without argument the file is accepted\n // If you call it with an error message, the file is rejected\n // (This allows for asynchronous validation)\n //\n // This function checks the filesize, and if the file.type passes the\n // `acceptedFiles` check.\n\n }, {\n key: \"accept\",\n value: function accept(file, done) {\n if (this.options.maxFilesize && file.size > this.options.maxFilesize * 1024 * 1024) {\n done(this.options.dictFileTooBig.replace(\"{{filesize}}\", Math.round(file.size / 1024 / 10.24) / 100).replace(\"{{maxFilesize}}\", this.options.maxFilesize));\n } else if (!Dropzone.isValidFile(file, this.options.acceptedFiles)) {\n done(this.options.dictInvalidFileType);\n } else if (this.options.maxFiles != null && this.getAcceptedFiles().length >= this.options.maxFiles) {\n done(this.options.dictMaxFilesExceeded.replace(\"{{maxFiles}}\", this.options.maxFiles));\n this.emit(\"maxfilesexceeded\", file);\n } else {\n this.options.accept.call(this, file, done);\n }\n }\n }, {\n key: \"addFile\",\n value: function addFile(file) {\n var _this7 = this;\n\n file.upload = {\n uuid: Dropzone.uuidv4(),\n progress: 0,\n // Setting the total upload size to file.size for the beginning\n // It's actual different than the size to be transmitted.\n total: file.size,\n bytesSent: 0,\n filename: this._renameFile(file) // Not setting chunking information here, because the acutal data — and\n // thus the chunks — might change if `options.transformFile` is set\n // and does something to the data.\n\n };\n this.files.push(file);\n file.status = Dropzone.ADDED;\n this.emit(\"addedfile\", file);\n\n this._enqueueThumbnail(file);\n\n this.accept(file, function (error) {\n if (error) {\n file.accepted = false;\n\n _this7._errorProcessing([file], error); // Will set the file.status\n\n } else {\n file.accepted = true;\n\n if (_this7.options.autoQueue) {\n _this7.enqueueFile(file);\n } // Will set .accepted = true\n\n }\n\n _this7._updateMaxFilesReachedClass();\n });\n } // Wrapper for enqueueFile\n\n }, {\n key: \"enqueueFiles\",\n value: function enqueueFiles(files) {\n var _iterator16 = _createForOfIteratorHelper(files),\n _step16;\n\n try {\n for (_iterator16.s(); !(_step16 = _iterator16.n()).done;) {\n var file = _step16.value;\n this.enqueueFile(file);\n }\n } catch (err) {\n _iterator16.e(err);\n } finally {\n _iterator16.f();\n }\n\n return null;\n }\n }, {\n key: \"enqueueFile\",\n value: function enqueueFile(file) {\n var _this8 = this;\n\n if (file.status === Dropzone.ADDED && file.accepted === true) {\n file.status = Dropzone.QUEUED;\n\n if (this.options.autoProcessQueue) {\n return setTimeout(function () {\n return _this8.processQueue();\n }, 0); // Deferring the call\n }\n } else {\n throw new Error(\"This file can't be queued because it has already been processed or was rejected.\");\n }\n }\n }, {\n key: \"_enqueueThumbnail\",\n value: function _enqueueThumbnail(file) {\n var _this9 = this;\n\n if (this.options.createImageThumbnails && file.type.match(/image.*/) && file.size <= this.options.maxThumbnailFilesize * 1024 * 1024) {\n this._thumbnailQueue.push(file);\n\n return setTimeout(function () {\n return _this9._processThumbnailQueue();\n }, 0); // Deferring the call\n }\n }\n }, {\n key: \"_processThumbnailQueue\",\n value: function _processThumbnailQueue() {\n var _this10 = this;\n\n if (this._processingThumbnail || this._thumbnailQueue.length === 0) {\n return;\n }\n\n this._processingThumbnail = true;\n\n var file = this._thumbnailQueue.shift();\n\n return this.createThumbnail(file, this.options.thumbnailWidth, this.options.thumbnailHeight, this.options.thumbnailMethod, true, function (dataUrl) {\n _this10.emit(\"thumbnail\", file, dataUrl);\n\n _this10._processingThumbnail = false;\n return _this10._processThumbnailQueue();\n });\n } // Can be called by the user to remove a file\n\n }, {\n key: \"removeFile\",\n value: function removeFile(file) {\n if (file.status === Dropzone.UPLOADING) {\n this.cancelUpload(file);\n }\n\n this.files = without(this.files, file);\n this.emit(\"removedfile\", file);\n\n if (this.files.length === 0) {\n return this.emit(\"reset\");\n }\n } // Removes all files that aren't currently processed from the list\n\n }, {\n key: \"removeAllFiles\",\n value: function removeAllFiles(cancelIfNecessary) {\n // Create a copy of files since removeFile() changes the @files array.\n if (cancelIfNecessary == null) {\n cancelIfNecessary = false;\n }\n\n var _iterator17 = _createForOfIteratorHelper(this.files.slice()),\n _step17;\n\n try {\n for (_iterator17.s(); !(_step17 = _iterator17.n()).done;) {\n var file = _step17.value;\n\n if (file.status !== Dropzone.UPLOADING || cancelIfNecessary) {\n this.removeFile(file);\n }\n }\n } catch (err) {\n _iterator17.e(err);\n } finally {\n _iterator17.f();\n }\n\n return null;\n } // Resizes an image before it gets sent to the server. This function is the default behavior of\n // `options.transformFile` if `resizeWidth` or `resizeHeight` are set. The callback is invoked with\n // the resized blob.\n\n }, {\n key: \"resizeImage\",\n value: function resizeImage(file, width, height, resizeMethod, callback) {\n var _this11 = this;\n\n return this.createThumbnail(file, width, height, resizeMethod, true, function (dataUrl, canvas) {\n if (canvas == null) {\n // The image has not been resized\n return callback(file);\n } else {\n var resizeMimeType = _this11.options.resizeMimeType;\n\n if (resizeMimeType == null) {\n resizeMimeType = file.type;\n }\n\n var resizedDataURL = canvas.toDataURL(resizeMimeType, _this11.options.resizeQuality);\n\n if (resizeMimeType === 'image/jpeg' || resizeMimeType === 'image/jpg') {\n // Now add the original EXIF information\n resizedDataURL = ExifRestore.restore(file.dataURL, resizedDataURL);\n }\n\n return callback(Dropzone.dataURItoBlob(resizedDataURL));\n }\n });\n }\n }, {\n key: \"createThumbnail\",\n value: function createThumbnail(file, width, height, resizeMethod, fixOrientation, callback) {\n var _this12 = this;\n\n var fileReader = new FileReader();\n\n fileReader.onload = function () {\n file.dataURL = fileReader.result; // Don't bother creating a thumbnail for SVG images since they're vector\n\n if (file.type === \"image/svg+xml\") {\n if (callback != null) {\n callback(fileReader.result);\n }\n\n return;\n }\n\n _this12.createThumbnailFromUrl(file, width, height, resizeMethod, fixOrientation, callback);\n };\n\n fileReader.readAsDataURL(file);\n } // `mockFile` needs to have these attributes:\n // \n // { name: 'name', size: 12345, imageUrl: '' }\n //\n // `callback` will be invoked when the image has been downloaded and displayed.\n // `crossOrigin` will be added to the `img` tag when accessing the file.\n\n }, {\n key: \"displayExistingFile\",\n value: function displayExistingFile(mockFile, imageUrl, callback, crossOrigin) {\n var _this13 = this;\n\n var resizeThumbnail = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n this.emit(\"addedfile\", mockFile);\n this.emit(\"complete\", mockFile);\n\n if (!resizeThumbnail) {\n this.emit(\"thumbnail\", mockFile, imageUrl);\n if (callback) callback();\n } else {\n var onDone = function onDone(thumbnail) {\n _this13.emit('thumbnail', mockFile, thumbnail);\n\n if (callback) callback();\n };\n\n mockFile.dataURL = imageUrl;\n this.createThumbnailFromUrl(mockFile, this.options.thumbnailWidth, this.options.thumbnailHeight, this.options.resizeMethod, this.options.fixOrientation, onDone, crossOrigin);\n }\n }\n }, {\n key: \"createThumbnailFromUrl\",\n value: function createThumbnailFromUrl(file, width, height, resizeMethod, fixOrientation, callback, crossOrigin) {\n var _this14 = this;\n\n // Not using `new Image` here because of a bug in latest Chrome versions.\n // See https://github.com/enyo/dropzone/pull/226\n var img = document.createElement(\"img\");\n\n if (crossOrigin) {\n img.crossOrigin = crossOrigin;\n } // fixOrientation is not needed anymore with browsers handling imageOrientation\n\n\n fixOrientation = getComputedStyle(document.body)['imageOrientation'] == 'from-image' ? false : fixOrientation;\n\n img.onload = function () {\n var loadExif = function loadExif(callback) {\n return callback(1);\n };\n\n if (typeof EXIF !== 'undefined' && EXIF !== null && fixOrientation) {\n loadExif = function loadExif(callback) {\n return EXIF.getData(img, function () {\n return callback(EXIF.getTag(this, 'Orientation'));\n });\n };\n }\n\n return loadExif(function (orientation) {\n file.width = img.width;\n file.height = img.height;\n\n var resizeInfo = _this14.options.resize.call(_this14, file, width, height, resizeMethod);\n\n var canvas = document.createElement(\"canvas\");\n var ctx = canvas.getContext(\"2d\");\n canvas.width = resizeInfo.trgWidth;\n canvas.height = resizeInfo.trgHeight;\n\n if (orientation > 4) {\n canvas.width = resizeInfo.trgHeight;\n canvas.height = resizeInfo.trgWidth;\n }\n\n switch (orientation) {\n case 2:\n // horizontal flip\n ctx.translate(canvas.width, 0);\n ctx.scale(-1, 1);\n break;\n\n case 3:\n // 180° rotate left\n ctx.translate(canvas.width, canvas.height);\n ctx.rotate(Math.PI);\n break;\n\n case 4:\n // vertical flip\n ctx.translate(0, canvas.height);\n ctx.scale(1, -1);\n break;\n\n case 5:\n // vertical flip + 90 rotate right\n ctx.rotate(0.5 * Math.PI);\n ctx.scale(1, -1);\n break;\n\n case 6:\n // 90° rotate right\n ctx.rotate(0.5 * Math.PI);\n ctx.translate(0, -canvas.width);\n break;\n\n case 7:\n // horizontal flip + 90 rotate right\n ctx.rotate(0.5 * Math.PI);\n ctx.translate(canvas.height, -canvas.width);\n ctx.scale(-1, 1);\n break;\n\n case 8:\n // 90° rotate left\n ctx.rotate(-0.5 * Math.PI);\n ctx.translate(-canvas.height, 0);\n break;\n } // This is a bugfix for iOS' scaling bug.\n\n\n drawImageIOSFix(ctx, img, resizeInfo.srcX != null ? resizeInfo.srcX : 0, resizeInfo.srcY != null ? resizeInfo.srcY : 0, resizeInfo.srcWidth, resizeInfo.srcHeight, resizeInfo.trgX != null ? resizeInfo.trgX : 0, resizeInfo.trgY != null ? resizeInfo.trgY : 0, resizeInfo.trgWidth, resizeInfo.trgHeight);\n var thumbnail = canvas.toDataURL(\"image/png\");\n\n if (callback != null) {\n return callback(thumbnail, canvas);\n }\n });\n };\n\n if (callback != null) {\n img.onerror = callback;\n }\n\n return img.src = file.dataURL;\n } // Goes through the queue and processes files if there aren't too many already.\n\n }, {\n key: \"processQueue\",\n value: function processQueue() {\n var parallelUploads = this.options.parallelUploads;\n var processingLength = this.getUploadingFiles().length;\n var i = processingLength; // There are already at least as many files uploading than should be\n\n if (processingLength >= parallelUploads) {\n return;\n }\n\n var queuedFiles = this.getQueuedFiles();\n\n if (!(queuedFiles.length > 0)) {\n return;\n }\n\n if (this.options.uploadMultiple) {\n // The files should be uploaded in one request\n return this.processFiles(queuedFiles.slice(0, parallelUploads - processingLength));\n } else {\n while (i < parallelUploads) {\n if (!queuedFiles.length) {\n return;\n } // Nothing left to process\n\n\n this.processFile(queuedFiles.shift());\n i++;\n }\n }\n } // Wrapper for `processFiles`\n\n }, {\n key: \"processFile\",\n value: function processFile(file) {\n return this.processFiles([file]);\n } // Loads the file, then calls finishedLoading()\n\n }, {\n key: \"processFiles\",\n value: function processFiles(files) {\n var _iterator18 = _createForOfIteratorHelper(files),\n _step18;\n\n try {\n for (_iterator18.s(); !(_step18 = _iterator18.n()).done;) {\n var file = _step18.value;\n file.processing = true; // Backwards compatibility\n\n file.status = Dropzone.UPLOADING;\n this.emit(\"processing\", file);\n }\n } catch (err) {\n _iterator18.e(err);\n } finally {\n _iterator18.f();\n }\n\n if (this.options.uploadMultiple) {\n this.emit(\"processingmultiple\", files);\n }\n\n return this.uploadFiles(files);\n }\n }, {\n key: \"_getFilesWithXhr\",\n value: function _getFilesWithXhr(xhr) {\n var files;\n return files = this.files.filter(function (file) {\n return file.xhr === xhr;\n }).map(function (file) {\n return file;\n });\n } // Cancels the file upload and sets the status to CANCELED\n // **if** the file is actually being uploaded.\n // If it's still in the queue, the file is being removed from it and the status\n // set to CANCELED.\n\n }, {\n key: \"cancelUpload\",\n value: function cancelUpload(file) {\n if (file.status === Dropzone.UPLOADING) {\n var groupedFiles = this._getFilesWithXhr(file.xhr);\n\n var _iterator19 = _createForOfIteratorHelper(groupedFiles),\n _step19;\n\n try {\n for (_iterator19.s(); !(_step19 = _iterator19.n()).done;) {\n var groupedFile = _step19.value;\n groupedFile.status = Dropzone.CANCELED;\n }\n } catch (err) {\n _iterator19.e(err);\n } finally {\n _iterator19.f();\n }\n\n if (typeof file.xhr !== 'undefined') {\n file.xhr.abort();\n }\n\n var _iterator20 = _createForOfIteratorHelper(groupedFiles),\n _step20;\n\n try {\n for (_iterator20.s(); !(_step20 = _iterator20.n()).done;) {\n var _groupedFile = _step20.value;\n this.emit(\"canceled\", _groupedFile);\n }\n } catch (err) {\n _iterator20.e(err);\n } finally {\n _iterator20.f();\n }\n\n if (this.options.uploadMultiple) {\n this.emit(\"canceledmultiple\", groupedFiles);\n }\n } else if (file.status === Dropzone.ADDED || file.status === Dropzone.QUEUED) {\n file.status = Dropzone.CANCELED;\n this.emit(\"canceled\", file);\n\n if (this.options.uploadMultiple) {\n this.emit(\"canceledmultiple\", [file]);\n }\n }\n\n if (this.options.autoProcessQueue) {\n return this.processQueue();\n }\n }\n }, {\n key: \"resolveOption\",\n value: function resolveOption(option) {\n if (typeof option === 'function') {\n for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {\n args[_key3 - 1] = arguments[_key3];\n }\n\n return option.apply(this, args);\n }\n\n return option;\n }\n }, {\n key: \"uploadFile\",\n value: function uploadFile(file) {\n return this.uploadFiles([file]);\n }\n }, {\n key: \"uploadFiles\",\n value: function uploadFiles(files) {\n var _this15 = this;\n\n this._transformFiles(files, function (transformedFiles) {\n if (_this15.options.chunking) {\n // Chunking is not allowed to be used with `uploadMultiple` so we know\n // that there is only __one__file.\n var transformedFile = transformedFiles[0];\n files[0].upload.chunked = _this15.options.chunking && (_this15.options.forceChunking || transformedFile.size > _this15.options.chunkSize);\n files[0].upload.totalChunkCount = Math.ceil(transformedFile.size / _this15.options.chunkSize);\n }\n\n if (files[0].upload.chunked) {\n // This file should be sent in chunks!\n // If the chunking option is set, we **know** that there can only be **one** file, since\n // uploadMultiple is not allowed with this option.\n var file = files[0];\n var _transformedFile = transformedFiles[0];\n var startedChunkCount = 0;\n file.upload.chunks = [];\n\n var handleNextChunk = function handleNextChunk() {\n var chunkIndex = 0; // Find the next item in file.upload.chunks that is not defined yet.\n\n while (file.upload.chunks[chunkIndex] !== undefined) {\n chunkIndex++;\n } // This means, that all chunks have already been started.\n\n\n if (chunkIndex >= file.upload.totalChunkCount) return;\n startedChunkCount++;\n var start = chunkIndex * _this15.options.chunkSize;\n var end = Math.min(start + _this15.options.chunkSize, _transformedFile.size);\n var dataBlock = {\n name: _this15._getParamName(0),\n data: _transformedFile.webkitSlice ? _transformedFile.webkitSlice(start, end) : _transformedFile.slice(start, end),\n filename: file.upload.filename,\n chunkIndex: chunkIndex\n };\n file.upload.chunks[chunkIndex] = {\n file: file,\n index: chunkIndex,\n dataBlock: dataBlock,\n // In case we want to retry.\n status: Dropzone.UPLOADING,\n progress: 0,\n retries: 0 // The number of times this block has been retried.\n\n };\n\n _this15._uploadData(files, [dataBlock]);\n };\n\n file.upload.finishedChunkUpload = function (chunk) {\n var allFinished = true;\n chunk.status = Dropzone.SUCCESS; // Clear the data from the chunk\n\n chunk.dataBlock = null; // Leaving this reference to xhr intact here will cause memory leaks in some browsers\n\n chunk.xhr = null;\n\n for (var i = 0; i < file.upload.totalChunkCount; i++) {\n if (file.upload.chunks[i] === undefined) {\n return handleNextChunk();\n }\n\n if (file.upload.chunks[i].status !== Dropzone.SUCCESS) {\n allFinished = false;\n }\n }\n\n if (allFinished) {\n _this15.options.chunksUploaded(file, function () {\n _this15._finished(files, '', null);\n });\n }\n };\n\n if (_this15.options.parallelChunkUploads) {\n for (var i = 0; i < file.upload.totalChunkCount; i++) {\n handleNextChunk();\n }\n } else {\n handleNextChunk();\n }\n } else {\n var dataBlocks = [];\n\n for (var _i3 = 0; _i3 < files.length; _i3++) {\n dataBlocks[_i3] = {\n name: _this15._getParamName(_i3),\n data: transformedFiles[_i3],\n filename: files[_i3].upload.filename\n };\n }\n\n _this15._uploadData(files, dataBlocks);\n }\n });\n } /// Returns the right chunk for given file and xhr\n\n }, {\n key: \"_getChunk\",\n value: function _getChunk(file, xhr) {\n for (var i = 0; i < file.upload.totalChunkCount; i++) {\n if (file.upload.chunks[i] !== undefined && file.upload.chunks[i].xhr === xhr) {\n return file.upload.chunks[i];\n }\n }\n } // This function actually uploads the file(s) to the server.\n // If dataBlocks contains the actual data to upload (meaning, that this could either be transformed\n // files, or individual chunks for chunked upload).\n\n }, {\n key: \"_uploadData\",\n value: function _uploadData(files, dataBlocks) {\n var _this16 = this;\n\n var xhr = new XMLHttpRequest(); // Put the xhr object in the file objects to be able to reference it later.\n\n var _iterator21 = _createForOfIteratorHelper(files),\n _step21;\n\n try {\n for (_iterator21.s(); !(_step21 = _iterator21.n()).done;) {\n var file = _step21.value;\n file.xhr = xhr;\n }\n } catch (err) {\n _iterator21.e(err);\n } finally {\n _iterator21.f();\n }\n\n if (files[0].upload.chunked) {\n // Put the xhr object in the right chunk object, so it can be associated later, and found with _getChunk\n files[0].upload.chunks[dataBlocks[0].chunkIndex].xhr = xhr;\n }\n\n var method = this.resolveOption(this.options.method, files);\n var url = this.resolveOption(this.options.url, files);\n xhr.open(method, url, true); // Setting the timeout after open because of IE11 issue: https://gitlab.com/meno/dropzone/issues/8\n\n xhr.timeout = this.resolveOption(this.options.timeout, files); // Has to be after `.open()`. See https://github.com/enyo/dropzone/issues/179\n\n xhr.withCredentials = !!this.options.withCredentials;\n\n xhr.onload = function (e) {\n _this16._finishedUploading(files, xhr, e);\n };\n\n xhr.ontimeout = function () {\n _this16._handleUploadError(files, xhr, \"Request timedout after \".concat(_this16.options.timeout / 1000, \" seconds\"));\n };\n\n xhr.onerror = function () {\n _this16._handleUploadError(files, xhr);\n }; // Some browsers do not have the .upload property\n\n\n var progressObj = xhr.upload != null ? xhr.upload : xhr;\n\n progressObj.onprogress = function (e) {\n return _this16._updateFilesUploadProgress(files, xhr, e);\n };\n\n var headers = {\n \"Accept\": \"application/json\",\n \"Cache-Control\": \"no-cache\",\n \"X-Requested-With\": \"XMLHttpRequest\"\n };\n\n if (this.options.headers) {\n Dropzone.extend(headers, this.options.headers);\n }\n\n for (var headerName in headers) {\n var headerValue = headers[headerName];\n\n if (headerValue) {\n xhr.setRequestHeader(headerName, headerValue);\n }\n }\n\n var formData = new FormData(); // Adding all @options parameters\n\n if (this.options.params) {\n var additionalParams = this.options.params;\n\n if (typeof additionalParams === 'function') {\n additionalParams = additionalParams.call(this, files, xhr, files[0].upload.chunked ? this._getChunk(files[0], xhr) : null);\n }\n\n for (var key in additionalParams) {\n var value = additionalParams[key];\n\n if (Array.isArray(value)) {\n // The additional parameter contains an array,\n // so lets iterate over it to attach each value\n // individually.\n for (var i = 0; i < value.length; i++) {\n formData.append(key, value[i]);\n }\n } else {\n formData.append(key, value);\n }\n }\n } // Let the user add additional data if necessary\n\n\n var _iterator22 = _createForOfIteratorHelper(files),\n _step22;\n\n try {\n for (_iterator22.s(); !(_step22 = _iterator22.n()).done;) {\n var _file = _step22.value;\n this.emit(\"sending\", _file, xhr, formData);\n }\n } catch (err) {\n _iterator22.e(err);\n } finally {\n _iterator22.f();\n }\n\n if (this.options.uploadMultiple) {\n this.emit(\"sendingmultiple\", files, xhr, formData);\n }\n\n this._addFormElementData(formData); // Finally add the files\n // Has to be last because some servers (eg: S3) expect the file to be the last parameter\n\n\n for (var _i4 = 0; _i4 < dataBlocks.length; _i4++) {\n var dataBlock = dataBlocks[_i4];\n formData.append(dataBlock.name, dataBlock.data, dataBlock.filename);\n }\n\n this.submitRequest(xhr, formData, files);\n } // Transforms all files with this.options.transformFile and invokes done with the transformed files when done.\n\n }, {\n key: \"_transformFiles\",\n value: function _transformFiles(files, done) {\n var _this17 = this;\n\n var transformedFiles = []; // Clumsy way of handling asynchronous calls, until I get to add a proper Future library.\n\n var doneCounter = 0;\n\n var _loop = function _loop(i) {\n _this17.options.transformFile.call(_this17, files[i], function (transformedFile) {\n transformedFiles[i] = transformedFile;\n\n if (++doneCounter === files.length) {\n done(transformedFiles);\n }\n });\n };\n\n for (var i = 0; i < files.length; i++) {\n _loop(i);\n }\n } // Takes care of adding other input elements of the form to the AJAX request\n\n }, {\n key: \"_addFormElementData\",\n value: function _addFormElementData(formData) {\n // Take care of other input elements\n if (this.element.tagName === \"FORM\") {\n var _iterator23 = _createForOfIteratorHelper(this.element.querySelectorAll(\"input, textarea, select, button\")),\n _step23;\n\n try {\n for (_iterator23.s(); !(_step23 = _iterator23.n()).done;) {\n var input = _step23.value;\n var inputName = input.getAttribute(\"name\");\n var inputType = input.getAttribute(\"type\");\n if (inputType) inputType = inputType.toLowerCase(); // If the input doesn't have a name, we can't use it.\n\n if (typeof inputName === 'undefined' || inputName === null) continue;\n\n if (input.tagName === \"SELECT\" && input.hasAttribute(\"multiple\")) {\n // Possibly multiple values\n var _iterator24 = _createForOfIteratorHelper(input.options),\n _step24;\n\n try {\n for (_iterator24.s(); !(_step24 = _iterator24.n()).done;) {\n var option = _step24.value;\n\n if (option.selected) {\n formData.append(inputName, option.value);\n }\n }\n } catch (err) {\n _iterator24.e(err);\n } finally {\n _iterator24.f();\n }\n } else if (!inputType || inputType !== \"checkbox\" && inputType !== \"radio\" || input.checked) {\n formData.append(inputName, input.value);\n }\n }\n } catch (err) {\n _iterator23.e(err);\n } finally {\n _iterator23.f();\n }\n }\n } // Invoked when there is new progress information about given files.\n // If e is not provided, it is assumed that the upload is finished.\n\n }, {\n key: \"_updateFilesUploadProgress\",\n value: function _updateFilesUploadProgress(files, xhr, e) {\n var progress;\n\n if (typeof e !== 'undefined') {\n progress = 100 * e.loaded / e.total;\n\n if (files[0].upload.chunked) {\n var file = files[0]; // Since this is a chunked upload, we need to update the appropriate chunk progress.\n\n var chunk = this._getChunk(file, xhr);\n\n chunk.progress = progress;\n chunk.total = e.total;\n chunk.bytesSent = e.loaded;\n var fileProgress = 0,\n fileTotal,\n fileBytesSent;\n file.upload.progress = 0;\n file.upload.total = 0;\n file.upload.bytesSent = 0;\n\n for (var i = 0; i < file.upload.totalChunkCount; i++) {\n if (file.upload.chunks[i] !== undefined && file.upload.chunks[i].progress !== undefined) {\n file.upload.progress += file.upload.chunks[i].progress;\n file.upload.total += file.upload.chunks[i].total;\n file.upload.bytesSent += file.upload.chunks[i].bytesSent;\n }\n }\n\n file.upload.progress = file.upload.progress / file.upload.totalChunkCount;\n } else {\n var _iterator25 = _createForOfIteratorHelper(files),\n _step25;\n\n try {\n for (_iterator25.s(); !(_step25 = _iterator25.n()).done;) {\n var _file2 = _step25.value;\n _file2.upload.progress = progress;\n _file2.upload.total = e.total;\n _file2.upload.bytesSent = e.loaded;\n }\n } catch (err) {\n _iterator25.e(err);\n } finally {\n _iterator25.f();\n }\n }\n\n var _iterator26 = _createForOfIteratorHelper(files),\n _step26;\n\n try {\n for (_iterator26.s(); !(_step26 = _iterator26.n()).done;) {\n var _file3 = _step26.value;\n this.emit(\"uploadprogress\", _file3, _file3.upload.progress, _file3.upload.bytesSent);\n }\n } catch (err) {\n _iterator26.e(err);\n } finally {\n _iterator26.f();\n }\n } else {\n // Called when the file finished uploading\n var allFilesFinished = true;\n progress = 100;\n\n var _iterator27 = _createForOfIteratorHelper(files),\n _step27;\n\n try {\n for (_iterator27.s(); !(_step27 = _iterator27.n()).done;) {\n var _file4 = _step27.value;\n\n if (_file4.upload.progress !== 100 || _file4.upload.bytesSent !== _file4.upload.total) {\n allFilesFinished = false;\n }\n\n _file4.upload.progress = progress;\n _file4.upload.bytesSent = _file4.upload.total;\n } // Nothing to do, all files already at 100%\n\n } catch (err) {\n _iterator27.e(err);\n } finally {\n _iterator27.f();\n }\n\n if (allFilesFinished) {\n return;\n }\n\n var _iterator28 = _createForOfIteratorHelper(files),\n _step28;\n\n try {\n for (_iterator28.s(); !(_step28 = _iterator28.n()).done;) {\n var _file5 = _step28.value;\n this.emit(\"uploadprogress\", _file5, progress, _file5.upload.bytesSent);\n }\n } catch (err) {\n _iterator28.e(err);\n } finally {\n _iterator28.f();\n }\n }\n }\n }, {\n key: \"_finishedUploading\",\n value: function _finishedUploading(files, xhr, e) {\n var response;\n\n if (files[0].status === Dropzone.CANCELED) {\n return;\n }\n\n if (xhr.readyState !== 4) {\n return;\n }\n\n if (xhr.responseType !== 'arraybuffer' && xhr.responseType !== 'blob') {\n response = xhr.responseText;\n\n if (xhr.getResponseHeader(\"content-type\") && ~xhr.getResponseHeader(\"content-type\").indexOf(\"application/json\")) {\n try {\n response = JSON.parse(response);\n } catch (error) {\n e = error;\n response = \"Invalid JSON response from server.\";\n }\n }\n }\n\n this._updateFilesUploadProgress(files);\n\n if (!(200 <= xhr.status && xhr.status < 300)) {\n this._handleUploadError(files, xhr, response);\n } else {\n if (files[0].upload.chunked) {\n files[0].upload.finishedChunkUpload(this._getChunk(files[0], xhr));\n } else {\n this._finished(files, response, e);\n }\n }\n }\n }, {\n key: \"_handleUploadError\",\n value: function _handleUploadError(files, xhr, response) {\n if (files[0].status === Dropzone.CANCELED) {\n return;\n }\n\n if (files[0].upload.chunked && this.options.retryChunks) {\n var chunk = this._getChunk(files[0], xhr);\n\n if (chunk.retries++ < this.options.retryChunksLimit) {\n this._uploadData(files, [chunk.dataBlock]);\n\n return;\n } else {\n console.warn('Retried this chunk too often. Giving up.');\n }\n }\n\n this._errorProcessing(files, response || this.options.dictResponseError.replace(\"{{statusCode}}\", xhr.status), xhr);\n }\n }, {\n key: \"submitRequest\",\n value: function submitRequest(xhr, formData, files) {\n xhr.send(formData);\n } // Called internally when processing is finished.\n // Individual callbacks have to be called in the appropriate sections.\n\n }, {\n key: \"_finished\",\n value: function _finished(files, responseText, e) {\n var _iterator29 = _createForOfIteratorHelper(files),\n _step29;\n\n try {\n for (_iterator29.s(); !(_step29 = _iterator29.n()).done;) {\n var file = _step29.value;\n file.status = Dropzone.SUCCESS;\n this.emit(\"success\", file, responseText, e);\n this.emit(\"complete\", file);\n }\n } catch (err) {\n _iterator29.e(err);\n } finally {\n _iterator29.f();\n }\n\n if (this.options.uploadMultiple) {\n this.emit(\"successmultiple\", files, responseText, e);\n this.emit(\"completemultiple\", files);\n }\n\n if (this.options.autoProcessQueue) {\n return this.processQueue();\n }\n } // Called internally when processing is finished.\n // Individual callbacks have to be called in the appropriate sections.\n\n }, {\n key: \"_errorProcessing\",\n value: function _errorProcessing(files, message, xhr) {\n var _iterator30 = _createForOfIteratorHelper(files),\n _step30;\n\n try {\n for (_iterator30.s(); !(_step30 = _iterator30.n()).done;) {\n var file = _step30.value;\n file.status = Dropzone.ERROR;\n this.emit(\"error\", file, message, xhr);\n this.emit(\"complete\", file);\n }\n } catch (err) {\n _iterator30.e(err);\n } finally {\n _iterator30.f();\n }\n\n if (this.options.uploadMultiple) {\n this.emit(\"errormultiple\", files, message, xhr);\n this.emit(\"completemultiple\", files);\n }\n\n if (this.options.autoProcessQueue) {\n return this.processQueue();\n }\n }\n }], [{\n key: \"uuidv4\",\n value: function uuidv4() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n var r = Math.random() * 16 | 0,\n v = c === 'x' ? r : r & 0x3 | 0x8;\n return v.toString(16);\n });\n }\n }]);\n\n return Dropzone;\n}(Emitter);\n\nDropzone.initClass();\nDropzone.version = \"5.7.2\"; // This is a map of options for your different dropzones. Add configurations\n// to this object for your different dropzone elemens.\n//\n// Example:\n//\n// Dropzone.options.myDropzoneElementId = { maxFilesize: 1 };\n//\n// To disable autoDiscover for a specific element, you can set `false` as an option:\n//\n// Dropzone.options.myDisabledElementId = false;\n//\n// And in html:\n//\n//
                  \n\nDropzone.options = {}; // Returns the options for an element or undefined if none available.\n\nDropzone.optionsForElement = function (element) {\n // Get the `Dropzone.options.elementId` for this element if it exists\n if (element.getAttribute(\"id\")) {\n return Dropzone.options[camelize(element.getAttribute(\"id\"))];\n } else {\n return undefined;\n }\n}; // Holds a list of all dropzone instances\n\n\nDropzone.instances = []; // Returns the dropzone for given element if any\n\nDropzone.forElement = function (element) {\n if (typeof element === \"string\") {\n element = document.querySelector(element);\n }\n\n if ((element != null ? element.dropzone : undefined) == null) {\n throw new Error(\"No Dropzone found for given element. This is probably because you're trying to access it before Dropzone had the time to initialize. Use the `init` option to setup any additional observers on your Dropzone.\");\n }\n\n return element.dropzone;\n}; // Set to false if you don't want Dropzone to automatically find and attach to .dropzone elements.\n\n\nDropzone.autoDiscover = true; // Looks for all .dropzone elements and creates a dropzone for them\n\nDropzone.discover = function () {\n var dropzones;\n\n if (document.querySelectorAll) {\n dropzones = document.querySelectorAll(\".dropzone\");\n } else {\n dropzones = []; // IE :(\n\n var checkElements = function checkElements(elements) {\n return function () {\n var result = [];\n\n var _iterator31 = _createForOfIteratorHelper(elements),\n _step31;\n\n try {\n for (_iterator31.s(); !(_step31 = _iterator31.n()).done;) {\n var el = _step31.value;\n\n if (/(^| )dropzone($| )/.test(el.className)) {\n result.push(dropzones.push(el));\n } else {\n result.push(undefined);\n }\n }\n } catch (err) {\n _iterator31.e(err);\n } finally {\n _iterator31.f();\n }\n\n return result;\n }();\n };\n\n checkElements(document.getElementsByTagName(\"div\"));\n checkElements(document.getElementsByTagName(\"form\"));\n }\n\n return function () {\n var result = [];\n\n var _iterator32 = _createForOfIteratorHelper(dropzones),\n _step32;\n\n try {\n for (_iterator32.s(); !(_step32 = _iterator32.n()).done;) {\n var dropzone = _step32.value;\n\n // Create a dropzone unless auto discover has been disabled for specific element\n if (Dropzone.optionsForElement(dropzone) !== false) {\n result.push(new Dropzone(dropzone));\n } else {\n result.push(undefined);\n }\n }\n } catch (err) {\n _iterator32.e(err);\n } finally {\n _iterator32.f();\n }\n\n return result;\n }();\n}; // Since the whole Drag'n'Drop API is pretty new, some browsers implement it,\n// but not correctly.\n// So I created a blacklist of userAgents. Yes, yes. Browser sniffing, I know.\n// But what to do when browsers *theoretically* support an API, but crash\n// when using it.\n//\n// This is a list of regular expressions tested against navigator.userAgent\n//\n// ** It should only be used on browser that *do* support the API, but\n// incorrectly **\n//\n\n\nDropzone.blacklistedBrowsers = [// The mac os and windows phone version of opera 12 seems to have a problem with the File drag'n'drop API.\n/opera.*(Macintosh|Windows Phone).*version\\/12/i]; // Checks if the browser is supported\n\nDropzone.isBrowserSupported = function () {\n var capableBrowser = true;\n\n if (window.File && window.FileReader && window.FileList && window.Blob && window.FormData && document.querySelector) {\n if (!(\"classList\" in document.createElement(\"a\"))) {\n capableBrowser = false;\n } else {\n // The browser supports the API, but may be blacklisted.\n var _iterator33 = _createForOfIteratorHelper(Dropzone.blacklistedBrowsers),\n _step33;\n\n try {\n for (_iterator33.s(); !(_step33 = _iterator33.n()).done;) {\n var regex = _step33.value;\n\n if (regex.test(navigator.userAgent)) {\n capableBrowser = false;\n continue;\n }\n }\n } catch (err) {\n _iterator33.e(err);\n } finally {\n _iterator33.f();\n }\n }\n } else {\n capableBrowser = false;\n }\n\n return capableBrowser;\n};\n\nDropzone.dataURItoBlob = function (dataURI) {\n // convert base64 to raw binary data held in a string\n // doesn't handle URLEncoded DataURIs - see SO answer #6850276 for code that does this\n var byteString = atob(dataURI.split(',')[1]); // separate out the mime component\n\n var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]; // write the bytes of the string to an ArrayBuffer\n\n var ab = new ArrayBuffer(byteString.length);\n var ia = new Uint8Array(ab);\n\n for (var i = 0, end = byteString.length, asc = 0 <= end; asc ? i <= end : i >= end; asc ? i++ : i--) {\n ia[i] = byteString.charCodeAt(i);\n } // write the ArrayBuffer to a blob\n\n\n return new Blob([ab], {\n type: mimeString\n });\n}; // Returns an array without the rejected item\n\n\nvar without = function without(list, rejectedItem) {\n return list.filter(function (item) {\n return item !== rejectedItem;\n }).map(function (item) {\n return item;\n });\n}; // abc-def_ghi -> abcDefGhi\n\n\nvar camelize = function camelize(str) {\n return str.replace(/[\\-_](\\w)/g, function (match) {\n return match.charAt(1).toUpperCase();\n });\n}; // Creates an element from string\n\n\nDropzone.createElement = function (string) {\n var div = document.createElement(\"div\");\n div.innerHTML = string;\n return div.childNodes[0];\n}; // Tests if given element is inside (or simply is) the container\n\n\nDropzone.elementInside = function (element, container) {\n if (element === container) {\n return true;\n } // Coffeescript doesn't support do/while loops\n\n\n while (element = element.parentNode) {\n if (element === container) {\n return true;\n }\n }\n\n return false;\n};\n\nDropzone.getElement = function (el, name) {\n var element;\n\n if (typeof el === \"string\") {\n element = document.querySelector(el);\n } else if (el.nodeType != null) {\n element = el;\n }\n\n if (element == null) {\n throw new Error(\"Invalid `\".concat(name, \"` option provided. Please provide a CSS selector or a plain HTML element.\"));\n }\n\n return element;\n};\n\nDropzone.getElements = function (els, name) {\n var el, elements;\n\n if (els instanceof Array) {\n elements = [];\n\n try {\n var _iterator34 = _createForOfIteratorHelper(els),\n _step34;\n\n try {\n for (_iterator34.s(); !(_step34 = _iterator34.n()).done;) {\n el = _step34.value;\n elements.push(this.getElement(el, name));\n }\n } catch (err) {\n _iterator34.e(err);\n } finally {\n _iterator34.f();\n }\n } catch (e) {\n elements = null;\n }\n } else if (typeof els === \"string\") {\n elements = [];\n\n var _iterator35 = _createForOfIteratorHelper(document.querySelectorAll(els)),\n _step35;\n\n try {\n for (_iterator35.s(); !(_step35 = _iterator35.n()).done;) {\n el = _step35.value;\n elements.push(el);\n }\n } catch (err) {\n _iterator35.e(err);\n } finally {\n _iterator35.f();\n }\n } else if (els.nodeType != null) {\n elements = [els];\n }\n\n if (elements == null || !elements.length) {\n throw new Error(\"Invalid `\".concat(name, \"` option provided. Please provide a CSS selector, a plain HTML element or a list of those.\"));\n }\n\n return elements;\n}; // Asks the user the question and calls accepted or rejected accordingly\n//\n// The default implementation just uses `window.confirm` and then calls the\n// appropriate callback.\n\n\nDropzone.confirm = function (question, accepted, rejected) {\n if (window.confirm(question)) {\n return accepted();\n } else if (rejected != null) {\n return rejected();\n }\n}; // Validates the mime type like this:\n//\n// https://developer.mozilla.org/en-US/docs/HTML/Element/input#attr-accept\n\n\nDropzone.isValidFile = function (file, acceptedFiles) {\n if (!acceptedFiles) {\n return true;\n } // If there are no accepted mime types, it's OK\n\n\n acceptedFiles = acceptedFiles.split(\",\");\n var mimeType = file.type;\n var baseMimeType = mimeType.replace(/\\/.*$/, \"\");\n\n var _iterator36 = _createForOfIteratorHelper(acceptedFiles),\n _step36;\n\n try {\n for (_iterator36.s(); !(_step36 = _iterator36.n()).done;) {\n var validType = _step36.value;\n validType = validType.trim();\n\n if (validType.charAt(0) === \".\") {\n if (file.name.toLowerCase().indexOf(validType.toLowerCase(), file.name.length - validType.length) !== -1) {\n return true;\n }\n } else if (/\\/\\*$/.test(validType)) {\n // This is something like a image/* mime type\n if (baseMimeType === validType.replace(/\\/.*$/, \"\")) {\n return true;\n }\n } else {\n if (mimeType === validType) {\n return true;\n }\n }\n }\n } catch (err) {\n _iterator36.e(err);\n } finally {\n _iterator36.f();\n }\n\n return false;\n}; // Augment jQuery\n\n\nif (typeof jQuery !== 'undefined' && jQuery !== null) {\n jQuery.fn.dropzone = function (options) {\n return this.each(function () {\n return new Dropzone(this, options);\n });\n };\n}\n\nif ( true && module !== null) {\n module.exports = Dropzone;\n} else {\n window.Dropzone = Dropzone;\n} // Dropzone file status codes\n\n\nDropzone.ADDED = \"added\";\nDropzone.QUEUED = \"queued\"; // For backwards compatibility. Now, if a file is accepted, it's either queued\n// or uploading.\n\nDropzone.ACCEPTED = Dropzone.QUEUED;\nDropzone.UPLOADING = \"uploading\";\nDropzone.PROCESSING = Dropzone.UPLOADING; // alias\n\nDropzone.CANCELED = \"canceled\";\nDropzone.ERROR = \"error\";\nDropzone.SUCCESS = \"success\";\n/*\n\n Bugfix for iOS 6 and 7\n Source: http://stackoverflow.com/questions/11929099/html5-canvas-drawimage-ratio-bug-ios\n based on the work of https://github.com/stomita/ios-imagefile-megapixel\n\n */\n// Detecting vertical squash in loaded image.\n// Fixes a bug which squash image vertically while drawing into canvas for some images.\n// This is a bug in iOS6 devices. This function from https://github.com/stomita/ios-imagefile-megapixel\n\nvar detectVerticalSquash = function detectVerticalSquash(img) {\n var iw = img.naturalWidth;\n var ih = img.naturalHeight;\n var canvas = document.createElement(\"canvas\");\n canvas.width = 1;\n canvas.height = ih;\n var ctx = canvas.getContext(\"2d\");\n ctx.drawImage(img, 0, 0);\n\n var _ctx$getImageData = ctx.getImageData(1, 0, 1, ih),\n data = _ctx$getImageData.data; // search image edge pixel position in case it is squashed vertically.\n\n\n var sy = 0;\n var ey = ih;\n var py = ih;\n\n while (py > sy) {\n var alpha = data[(py - 1) * 4 + 3];\n\n if (alpha === 0) {\n ey = py;\n } else {\n sy = py;\n }\n\n py = ey + sy >> 1;\n }\n\n var ratio = py / ih;\n\n if (ratio === 0) {\n return 1;\n } else {\n return ratio;\n }\n}; // A replacement for context.drawImage\n// (args are for source and destination).\n\n\nvar drawImageIOSFix = function drawImageIOSFix(ctx, img, sx, sy, sw, sh, dx, dy, dw, dh) {\n var vertSquashRatio = detectVerticalSquash(img);\n return ctx.drawImage(img, sx, sy, sw, sh, dx, dy, dw, dh / vertSquashRatio);\n}; // Based on MinifyJpeg\n// Source: http://www.perry.cz/files/ExifRestorer.js\n// http://elicon.blog57.fc2.com/blog-entry-206.html\n\n\nvar ExifRestore = /*#__PURE__*/function () {\n function ExifRestore() {\n _classCallCheck(this, ExifRestore);\n }\n\n _createClass(ExifRestore, null, [{\n key: \"initClass\",\n value: function initClass() {\n this.KEY_STR = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n }\n }, {\n key: \"encode64\",\n value: function encode64(input) {\n var output = '';\n var chr1 = undefined;\n var chr2 = undefined;\n var chr3 = '';\n var enc1 = undefined;\n var enc2 = undefined;\n var enc3 = undefined;\n var enc4 = '';\n var i = 0;\n\n while (true) {\n chr1 = input[i++];\n chr2 = input[i++];\n chr3 = input[i++];\n enc1 = chr1 >> 2;\n enc2 = (chr1 & 3) << 4 | chr2 >> 4;\n enc3 = (chr2 & 15) << 2 | chr3 >> 6;\n enc4 = chr3 & 63;\n\n if (isNaN(chr2)) {\n enc3 = enc4 = 64;\n } else if (isNaN(chr3)) {\n enc4 = 64;\n }\n\n output = output + this.KEY_STR.charAt(enc1) + this.KEY_STR.charAt(enc2) + this.KEY_STR.charAt(enc3) + this.KEY_STR.charAt(enc4);\n chr1 = chr2 = chr3 = '';\n enc1 = enc2 = enc3 = enc4 = '';\n\n if (!(i < input.length)) {\n break;\n }\n }\n\n return output;\n }\n }, {\n key: \"restore\",\n value: function restore(origFileBase64, resizedFileBase64) {\n if (!origFileBase64.match('data:image/jpeg;base64,')) {\n return resizedFileBase64;\n }\n\n var rawImage = this.decode64(origFileBase64.replace('data:image/jpeg;base64,', ''));\n var segments = this.slice2Segments(rawImage);\n var image = this.exifManipulation(resizedFileBase64, segments);\n return \"data:image/jpeg;base64,\".concat(this.encode64(image));\n }\n }, {\n key: \"exifManipulation\",\n value: function exifManipulation(resizedFileBase64, segments) {\n var exifArray = this.getExifArray(segments);\n var newImageArray = this.insertExif(resizedFileBase64, exifArray);\n var aBuffer = new Uint8Array(newImageArray);\n return aBuffer;\n }\n }, {\n key: \"getExifArray\",\n value: function getExifArray(segments) {\n var seg = undefined;\n var x = 0;\n\n while (x < segments.length) {\n seg = segments[x];\n\n if (seg[0] === 255 & seg[1] === 225) {\n return seg;\n }\n\n x++;\n }\n\n return [];\n }\n }, {\n key: \"insertExif\",\n value: function insertExif(resizedFileBase64, exifArray) {\n var imageData = resizedFileBase64.replace('data:image/jpeg;base64,', '');\n var buf = this.decode64(imageData);\n var separatePoint = buf.indexOf(255, 3);\n var mae = buf.slice(0, separatePoint);\n var ato = buf.slice(separatePoint);\n var array = mae;\n array = array.concat(exifArray);\n array = array.concat(ato);\n return array;\n }\n }, {\n key: \"slice2Segments\",\n value: function slice2Segments(rawImageArray) {\n var head = 0;\n var segments = [];\n\n while (true) {\n var length;\n\n if (rawImageArray[head] === 255 & rawImageArray[head + 1] === 218) {\n break;\n }\n\n if (rawImageArray[head] === 255 & rawImageArray[head + 1] === 216) {\n head += 2;\n } else {\n length = rawImageArray[head + 2] * 256 + rawImageArray[head + 3];\n var endPoint = head + length + 2;\n var seg = rawImageArray.slice(head, endPoint);\n segments.push(seg);\n head = endPoint;\n }\n\n if (head > rawImageArray.length) {\n break;\n }\n }\n\n return segments;\n }\n }, {\n key: \"decode64\",\n value: function decode64(input) {\n var output = '';\n var chr1 = undefined;\n var chr2 = undefined;\n var chr3 = '';\n var enc1 = undefined;\n var enc2 = undefined;\n var enc3 = undefined;\n var enc4 = '';\n var i = 0;\n var buf = []; // remove all characters that are not A-Z, a-z, 0-9, +, /, or =\n\n var base64test = /[^A-Za-z0-9\\+\\/\\=]/g;\n\n if (base64test.exec(input)) {\n console.warn('There were invalid base64 characters in the input text.\\nValid base64 characters are A-Z, a-z, 0-9, \\'+\\', \\'/\\',and \\'=\\'\\nExpect errors in decoding.');\n }\n\n input = input.replace(/[^A-Za-z0-9\\+\\/\\=]/g, '');\n\n while (true) {\n enc1 = this.KEY_STR.indexOf(input.charAt(i++));\n enc2 = this.KEY_STR.indexOf(input.charAt(i++));\n enc3 = this.KEY_STR.indexOf(input.charAt(i++));\n enc4 = this.KEY_STR.indexOf(input.charAt(i++));\n chr1 = enc1 << 2 | enc2 >> 4;\n chr2 = (enc2 & 15) << 4 | enc3 >> 2;\n chr3 = (enc3 & 3) << 6 | enc4;\n buf.push(chr1);\n\n if (enc3 !== 64) {\n buf.push(chr2);\n }\n\n if (enc4 !== 64) {\n buf.push(chr3);\n }\n\n chr1 = chr2 = chr3 = '';\n enc1 = enc2 = enc3 = enc4 = '';\n\n if (!(i < input.length)) {\n break;\n }\n }\n\n return buf;\n }\n }]);\n\n return ExifRestore;\n}();\n\nExifRestore.initClass();\n/*\n * contentloaded.js\n *\n * Author: Diego Perini (diego.perini at gmail.com)\n * Summary: cross-browser wrapper for DOMContentLoaded\n * Updated: 20101020\n * License: MIT\n * Version: 1.2\n *\n * URL:\n * http://javascript.nwbox.com/ContentLoaded/\n * http://javascript.nwbox.com/ContentLoaded/MIT-LICENSE\n */\n// @win window reference\n// @fn function reference\n\nvar contentLoaded = function contentLoaded(win, fn) {\n var done = false;\n var top = true;\n var doc = win.document;\n var root = doc.documentElement;\n var add = doc.addEventListener ? \"addEventListener\" : \"attachEvent\";\n var rem = doc.addEventListener ? \"removeEventListener\" : \"detachEvent\";\n var pre = doc.addEventListener ? \"\" : \"on\";\n\n var init = function init(e) {\n if (e.type === \"readystatechange\" && doc.readyState !== \"complete\") {\n return;\n }\n\n (e.type === \"load\" ? win : doc)[rem](pre + e.type, init, false);\n\n if (!done && (done = true)) {\n return fn.call(win, e.type || e);\n }\n };\n\n var poll = function poll() {\n try {\n root.doScroll(\"left\");\n } catch (e) {\n setTimeout(poll, 50);\n return;\n }\n\n return init(\"poll\");\n };\n\n if (doc.readyState !== \"complete\") {\n if (doc.createEventObject && root.doScroll) {\n try {\n top = !win.frameElement;\n } catch (error) {}\n\n if (top) {\n poll();\n }\n }\n\n doc[add](pre + \"DOMContentLoaded\", init, false);\n doc[add](pre + \"readystatechange\", init, false);\n return win[add](pre + \"load\", init, false);\n }\n}; // As a single function to be able to write tests.\n\n\nDropzone._autoDiscoverFunction = function () {\n if (Dropzone.autoDiscover) {\n return Dropzone.discover();\n }\n};\n\ncontentLoaded(window, Dropzone._autoDiscoverFunction);\n\nfunction __guard__(value, transform) {\n return typeof value !== 'undefined' && value !== null ? transform(value) : undefined;\n}\n\nfunction __guardMethod__(obj, methodName, transform) {\n if (typeof obj !== 'undefined' && obj !== null && typeof obj[methodName] === 'function') {\n return transform(obj, methodName);\n } else {\n return undefined;\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vbm9kZV9tb2R1bGVzL2Ryb3B6b25lL2Rpc3QvZHJvcHpvbmUuanM/NzllMyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQWE7O0FBRWIsdUJBQXVCLDJCQUEyQiwyRUFBMkUsa0NBQWtDLG1CQUFtQixHQUFHLEVBQUUsT0FBTyxrQ0FBa0MsOEhBQThILEdBQUcsRUFBRSxxQkFBcUI7O0FBRXhYLDBDQUEwQywrREFBK0QsMkVBQTJFLEVBQUUseUVBQXlFLGVBQWUsc0RBQXNELEVBQUUsRUFBRSx1REFBdUQ7O0FBRS9YLGdDQUFnQyw0RUFBNEUsaUJBQWlCLFVBQVUsR0FBRyw4QkFBOEI7O0FBRXhLLGdDQUFnQyw2REFBNkQseUNBQXlDLDhDQUE4QyxpQ0FBaUMsbURBQW1ELHlEQUF5RCxFQUFFLE9BQU8sdUNBQXVDLEVBQUUsaURBQWlELEdBQUc7O0FBRXZhLGlEQUFpRCwwRUFBMEUsYUFBYSxFQUFFLHFDQUFxQzs7QUFFL0ssdUNBQXVDLHVCQUF1Qix1RkFBdUYsRUFBRSxhQUFhOztBQUVwSyxzQ0FBc0Msd0VBQXdFLDBDQUEwQyw4Q0FBOEMsTUFBTSx3RUFBd0UsR0FBRyxhQUFhLEVBQUUsWUFBWSxjQUFjLEVBQUU7O0FBRWxVLDZCQUE2QixnR0FBZ0csZ0RBQWdELEdBQUcsMkJBQTJCOztBQUUzTSx3REFBd0QsUUFBUSxtRUFBbUUsd0hBQXdILGdCQUFnQixXQUFXLHlCQUF5QixTQUFTLHdCQUF3Qiw0QkFBNEIsY0FBYyxTQUFTLDhCQUE4QixFQUFFLHFCQUFxQixVQUFVLEVBQUUsU0FBUyxFQUFFLDhKQUE4SixFQUFFLGtEQUFrRCxTQUFTLGtCQUFrQiwyQkFBMkIsRUFBRSxtQkFBbUIsc0JBQXNCLDhCQUE4QixhQUFhLEVBQUUsc0JBQXNCLGVBQWUsV0FBVyxFQUFFLG1CQUFtQixNQUFNLCtEQUErRCxFQUFFLFVBQVUsdUJBQXVCLEVBQUUsRUFBRSxHQUFHOztBQUVuK0IsaURBQWlELGdCQUFnQixnRUFBZ0Usd0RBQXdELDZEQUE2RCxzREFBc0Qsa0hBQWtIOztBQUU5WixzQ0FBc0MsdURBQXVELHVDQUF1QyxTQUFTLE9BQU8sa0JBQWtCLEVBQUUsYUFBYTs7QUFFckwsaURBQWlELDBDQUEwQywwREFBMEQsRUFBRTs7QUFFdkosMkNBQTJDLGdCQUFnQixrQkFBa0IsT0FBTywyQkFBMkIsd0RBQXdELGdDQUFnQyx1REFBdUQsMkRBQTJELEVBQUU7O0FBRTNULDZEQUE2RCxzRUFBc0UsOERBQThELG9CQUFvQjs7QUFFck47QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDOztBQUU5QztBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhGQUE4RixhQUFhO0FBQzNHO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLDZCQUE2QiwrQkFBK0I7QUFDNUQ7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7O0FBRUE7QUFDQTtBQUNBLE9BQU87OztBQUdQO0FBQ0E7QUFDQTtBQUNBLE9BQU87OztBQUdQLHFCQUFxQixzQkFBc0I7QUFDM0M7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLENBQUM7O0FBRUQ7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLEVBQUU7QUFDL0M7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxhQUFhLHNDQUFzQztBQUNuRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FB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QTtBQUNBLHNDQUFzQyxzRUFBc0UsRUFBRTs7QUFFOUc7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLOzs7QUFHTDtBQUNBO0FBQ0E7QUFDQSxLQUFLOzs7QUFHTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOzs7QUFHTDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1AsS0FBSzs7QUFFTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVztBQUNYOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0NBQW9DLGlDQUFpQztBQUNyRTs7QUFFQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLFdBQVc7QUFDWDs7QUFFQTtBQUNBOztBQUVBLHFFQUFxRTtBQUNyRTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSw2QkFBNkIsbUNBQW1DO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTyxFQUFFOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsaUNBQWlDO0FBQzFEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQzs7QUFFL0M7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSzs7QUFFTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwrQkFBK0IsbUNBQW1DO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwrQkFBK0IsbUNBQW1DO0FBQ2xFOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQSwrQ0FBK0MsbUJBQW1CO0FBQ2xFO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUCxLQUFLOztBQUVMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUCxLQUFLOztBQUVMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1COztBQUVuQjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9kcm9wem9uZS9kaXN0L2Ryb3B6b25lLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cblxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IG8uX19wcm90b19fID0gcDsgcmV0dXJuIG87IH07IHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7IH1cblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoY2FsbCAmJiAoX3R5cGVvZihjYWxsKSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkgeyByZXR1cm4gY2FsbDsgfSByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsgfVxuXG5mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIHNlbGY7IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG5mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pOyB9OyByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pOyB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG8sIGFsbG93QXJyYXlMaWtlKSB7IHZhciBpdDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgeyBpZiAoaXQpIG8gPSBpdDsgdmFyIGkgPSAwOyB2YXIgRiA9IGZ1bmN0aW9uIEYoKSB7fTsgcmV0dXJuIHsgczogRiwgbjogZnVuY3Rpb24gbigpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfSwgZTogZnVuY3Rpb24gZShfZSkgeyB0aHJvdyBfZTsgfSwgZjogRiB9OyB9IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSB2YXIgbm9ybWFsQ29tcGxldGlvbiA9IHRydWUsIGRpZEVyciA9IGZhbHNlLCBlcnI7IHJldHVybiB7IHM6IGZ1bmN0aW9uIHMoKSB7IGl0ID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IH0sIG46IGZ1bmN0aW9uIG4oKSB7IHZhciBzdGVwID0gaXQubmV4dCgpOyBub3JtYWxDb21wbGV0aW9uID0gc3RlcC5kb25lOyByZXR1cm4gc3RlcDsgfSwgZTogZnVuY3Rpb24gZShfZTIpIHsgZGlkRXJyID0gdHJ1ZTsgZXJyID0gX2UyOyB9LCBmOiBmdW5jdGlvbiBmKCkgeyB0cnkgeyBpZiAoIW5vcm1hbENvbXBsZXRpb24gJiYgaXRbXCJyZXR1cm5cIl0gIT0gbnVsbCkgaXRbXCJyZXR1cm5cIl0oKTsgfSBmaW5hbGx5IHsgaWYgKGRpZEVycikgdGhyb3cgZXJyOyB9IH0gfTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuLypcbiAqXG4gKiBNb3JlIGluZm8gYXQgW3d3dy5kcm9wem9uZWpzLmNvbV0oaHR0cDovL3d3dy5kcm9wem9uZWpzLmNvbSlcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTIsIE1hdGlhcyBNZW5vXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbiAqIFRIRSBTT0ZUV0FSRS5cbiAqXG4gKi9cbi8vIFRoZSBFbWl0dGVyIGNsYXNzIHByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIGNhbGwgYC5vbigpYCBvbiBEcm9wem9uZSB0byBsaXN0ZW5cbi8vIHRvIGV2ZW50cy5cbi8vIEl0IGlzIHN0cm9uZ2x5IGJhc2VkIG9uIGNvbXBvbmVudCdzIGVtaXR0ZXIgY2xhc3MsIGFuZCBJIHJlbW92ZWQgdGhlXG4vLyBmdW5jdGlvbmFsaXR5IGJlY2F1c2Ugb2YgdGhlIGRlcGVuZGVuY3kgaGVsbCB3aXRoIGRpZmZlcmVudCBmcmFtZXdvcmtzLlxudmFyIEVtaXR0ZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBFbWl0dGVyKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBFbWl0dGVyKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhFbWl0dGVyLCBbe1xuICAgIGtleTogXCJvblwiLFxuICAgIC8vIEFkZCBhbiBldmVudCBsaXN0ZW5lciBmb3IgZ2l2ZW4gZXZlbnRcbiAgICB2YWx1ZTogZnVuY3Rpb24gb24oZXZlbnQsIGZuKSB7XG4gICAgICB0aGlzLl9jYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3MgfHwge307IC8vIENyZWF0ZSBuYW1lc3BhY2UgZm9yIHRoaXMgZXZlbnRcblxuICAgICAgaWYgKCF0aGlzLl9jYWxsYmFja3NbZXZlbnRdKSB7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrc1tldmVudF0gPSBbXTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fY2FsbGJhY2tzW2V2ZW50XS5wdXNoKGZuKTtcblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImVtaXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZW1pdChldmVudCkge1xuICAgICAgdGhpcy5fY2FsbGJhY2tzID0gdGhpcy5fY2FsbGJhY2tzIHx8IHt9O1xuICAgICAgdmFyIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrc1tldmVudF07XG5cbiAgICAgIGlmIChjYWxsYmFja3MpIHtcbiAgICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGNhbGxiYWNrcyksXG4gICAgICAgICAgICBfc3RlcDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBfc3RlcC52YWx1ZTtcbiAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgX2l0ZXJhdG9yLmUoZXJyKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBfaXRlcmF0b3IuZigpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gLy8gUmVtb3ZlIGV2ZW50IGxpc3RlbmVyIGZvciBnaXZlbiBldmVudC4gSWYgZm4gaXMgbm90IHByb3ZpZGVkLCBhbGwgZXZlbnRcbiAgICAvLyBsaXN0ZW5lcnMgZm9yIHRoYXQgZXZlbnQgd2lsbCBiZSByZW1vdmVkLiBJZiBuZWl0aGVyIGlzIHByb3ZpZGVkLCBhbGxcbiAgICAvLyBldmVudCBsaXN0ZW5lcnMgd2lsbCBiZSByZW1vdmVkLlxuXG4gIH0sIHtcbiAgICBrZXk6IFwib2ZmXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9mZihldmVudCwgZm4pIHtcbiAgICAgIGlmICghdGhpcy5fY2FsbGJhY2tzIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5fY2FsbGJhY2tzID0ge307XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSAvLyBzcGVjaWZpYyBldmVudFxuXG5cbiAgICAgIHZhciBjYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3NbZXZlbnRdO1xuXG4gICAgICBpZiAoIWNhbGxiYWNrcykge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0gLy8gcmVtb3ZlIGFsbCBoYW5kbGVyc1xuXG5cbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9jYWxsYmFja3NbZXZlbnRdO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0gLy8gcmVtb3ZlIHNwZWNpZmljIGhhbmRsZXJcblxuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNhbGxiYWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2FsbGJhY2sgPSBjYWxsYmFja3NbaV07XG5cbiAgICAgICAgaWYgKGNhbGxiYWNrID09PSBmbikge1xuICAgICAgICAgIGNhbGxiYWNrcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEVtaXR0ZXI7XG59KCk7XG5cbnZhciBEcm9wem9uZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0VtaXR0ZXIpIHtcbiAgX2luaGVyaXRzKERyb3B6b25lLCBfRW1pdHRlcik7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihEcm9wem9uZSk7XG5cbiAgX2NyZWF0ZUNsYXNzKERyb3B6b25lLCBudWxsLCBbe1xuICAgIGtleTogXCJpbml0Q2xhc3NcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5pdENsYXNzKCkge1xuICAgICAgLy8gRXhwb3NpbmcgdGhlIGVtaXR0ZXIgY2xhc3MsIG1haW5seSBmb3IgdGVzdHNcbiAgICAgIHRoaXMucHJvdG90eXBlLkVtaXR0ZXIgPSBFbWl0dGVyO1xuICAgICAgLypcbiAgICAgICBUaGlzIGlzIGEgbGlzdCBvZiBhbGwgYXZhaWxhYmxlIGV2ZW50cyB5b3UgY2FuIHJlZ2lzdGVyIG9uIGEgZHJvcHpvbmUgb2JqZWN0LlxuICAgICAgICBZb3UgY2FuIHJlZ2lzdGVyIGFuIGV2ZW50IGhhbmRsZXIgbGlrZSB0aGlzOlxuICAgICAgICBkcm9wem9uZS5vbihcImRyYWdFbnRlclwiLCBmdW5jdGlvbigpIHsgfSk7XG4gICAgICAgICovXG5cbiAgICAgIHRoaXMucHJvdG90eXBlLmV2ZW50cyA9IFtcImRyb3BcIiwgXCJkcmFnc3RhcnRcIiwgXCJkcmFnZW5kXCIsIFwiZHJhZ2VudGVyXCIsIFwiZHJhZ292ZXJcIiwgXCJkcmFnbGVhdmVcIiwgXCJhZGRlZGZpbGVcIiwgXCJhZGRlZGZpbGVzXCIsIFwicmVtb3ZlZGZpbGVcIiwgXCJ0aHVtYm5haWxcIiwgXCJlcnJvclwiLCBcImVycm9ybXVsdGlwbGVcIiwgXCJwcm9jZXNzaW5nXCIsIFwicHJvY2Vzc2luZ211bHRpcGxlXCIsIFwidXBsb2FkcHJvZ3Jlc3NcIiwgXCJ0b3RhbHVwbG9hZHByb2dyZXNzXCIsIFwic2VuZGluZ1wiLCBcInNlbmRpbmdtdWx0aXBsZVwiLCBcInN1Y2Nlc3NcIiwgXCJzdWNjZXNzbXVsdGlwbGVcIiwgXCJjYW5jZWxlZFwiLCBcImNhbmNlbGVkbXVsdGlwbGVcIiwgXCJjb21wbGV0ZVwiLCBcImNvbXBsZXRlbXVsdGlwbGVcIiwgXCJyZXNldFwiLCBcIm1heGZpbGVzZXhjZWVkZWRcIiwgXCJtYXhmaWxlc3JlYWNoZWRcIiwgXCJxdWV1ZWNvbXBsZXRlXCJdO1xuICAgICAgdGhpcy5wcm90b3R5cGUuZGVmYXVsdE9wdGlvbnMgPSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBIYXMgdG8gYmUgc3BlY2lmaWVkIG9uIGVsZW1lbnRzIG90aGVyIHRoYW4gZm9ybSAob3Igd2hlbiB0aGUgZm9ybVxuICAgICAgICAgKiBkb2Vzbid0IGhhdmUgYW4gYGFjdGlvbmAgYXR0cmlidXRlKS4gWW91IGNhbiBhbHNvXG4gICAgICAgICAqIHByb3ZpZGUgYSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHdpdGggYGZpbGVzYCBhbmRcbiAgICAgICAgICogbXVzdCByZXR1cm4gdGhlIHVybCAoc2luY2UgYHYzLjEyLjBgKVxuICAgICAgICAgKi9cbiAgICAgICAgdXJsOiBudWxsLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYW4gYmUgY2hhbmdlZCB0byBgXCJwdXRcImAgaWYgbmVjZXNzYXJ5LiBZb3UgY2FuIGFsc28gcHJvdmlkZSBhIGZ1bmN0aW9uXG4gICAgICAgICAqIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2l0aCBgZmlsZXNgIGFuZCBtdXN0IHJldHVybiB0aGUgbWV0aG9kIChzaW5jZSBgdjMuMTIuMGApLlxuICAgICAgICAgKi9cbiAgICAgICAgbWV0aG9kOiBcInBvc3RcIixcblxuICAgICAgICAvKipcbiAgICAgICAgICogV2lsbCBiZSBzZXQgb24gdGhlIFhIUmVxdWVzdC5cbiAgICAgICAgICovXG4gICAgICAgIHdpdGhDcmVkZW50aWFsczogZmFsc2UsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSB0aW1lb3V0IGZvciB0aGUgWEhSIHJlcXVlc3RzIGluIG1pbGxpc2Vjb25kcyAoc2luY2UgYHY0LjQuMGApLlxuICAgICAgICAgKi9cbiAgICAgICAgdGltZW91dDogMzAwMDAsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEhvdyBtYW55IGZpbGUgdXBsb2FkcyB0byBwcm9jZXNzIGluIHBhcmFsbGVsIChTZWUgdGhlXG4gICAgICAgICAqIEVucXVldWluZyBmaWxlIHVwbG9hZHMgZG9jdW1lbnRhdGlvbiBzZWN0aW9uIGZvciBtb3JlIGluZm8pXG4gICAgICAgICAqL1xuICAgICAgICBwYXJhbGxlbFVwbG9hZHM6IDIsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdoZXRoZXIgdG8gc2VuZCBtdWx0aXBsZSBmaWxlcyBpbiBvbmUgcmVxdWVzdC4gSWZcbiAgICAgICAgICogdGhpcyBpdCBzZXQgdG8gdHJ1ZSwgdGhlbiB0aGUgZmFsbGJhY2sgZmlsZSBpbnB1dCBlbGVtZW50IHdpbGxcbiAgICAgICAgICogaGF2ZSB0aGUgYG11bHRpcGxlYCBhdHRyaWJ1dGUgYXMgd2VsbC4gVGhpcyBvcHRpb24gd2lsbFxuICAgICAgICAgKiBhbHNvIHRyaWdnZXIgYWRkaXRpb25hbCBldmVudHMgKGxpa2UgYHByb2Nlc3NpbmdtdWx0aXBsZWApLiBTZWUgdGhlIGV2ZW50c1xuICAgICAgICAgKiBkb2N1bWVudGF0aW9uIHNlY3Rpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICAgICAqL1xuICAgICAgICB1cGxvYWRNdWx0aXBsZTogZmFsc2UsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdoZXRoZXIgeW91IHdhbnQgZmlsZXMgdG8gYmUgdXBsb2FkZWQgaW4gY2h1bmtzIHRvIHlvdXIgc2VydmVyLiBUaGlzIGNhbid0IGJlXG4gICAgICAgICAqIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aCBgdXBsb2FkTXVsdGlwbGVgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBTZWUgW2NodW5rc1VwbG9hZGVkXSgjY29uZmlnLWNodW5rc1VwbG9hZGVkKSBmb3IgdGhlIGNhbGxiYWNrIHRvIGZpbmFsaXNlIGFuIHVwbG9hZC5cbiAgICAgICAgICovXG4gICAgICAgIGNodW5raW5nOiBmYWxzZSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogSWYgYGNodW5raW5nYCBpcyBlbmFibGVkLCB0aGlzIGRlZmluZXMgd2hldGhlciAqKmV2ZXJ5KiogZmlsZSBzaG91bGQgYmUgY2h1bmtlZCxcbiAgICAgICAgICogZXZlbiBpZiB0aGUgZmlsZSBzaXplIGlzIGJlbG93IGNodW5rU2l6ZS4gVGhpcyBtZWFucywgdGhhdCB0aGUgYWRkaXRpb25hbCBjaHVua1xuICAgICAgICAgKiBmb3JtIGRhdGEgd2lsbCBiZSBzdWJtaXR0ZWQgYW5kIHRoZSBgY2h1bmtzVXBsb2FkZWRgIGNhbGxiYWNrIHdpbGwgYmUgaW52b2tlZC5cbiAgICAgICAgICovXG4gICAgICAgIGZvcmNlQ2h1bmtpbmc6IGZhbHNlLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJZiBgY2h1bmtpbmdgIGlzIGB0cnVlYCwgdGhlbiB0aGlzIGRlZmluZXMgdGhlIGNodW5rIHNpemUgaW4gYnl0ZXMuXG4gICAgICAgICAqL1xuICAgICAgICBjaHVua1NpemU6IDIwMDAwMDAsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElmIGB0cnVlYCwgdGhlIGluZGl2aWR1YWwgY2h1bmtzIG9mIGEgZmlsZSBhcmUgYmVpbmcgdXBsb2FkZWQgc2ltdWx0YW5lb3VzbHkuXG4gICAgICAgICAqL1xuICAgICAgICBwYXJhbGxlbENodW5rVXBsb2FkczogZmFsc2UsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdoZXRoZXIgYSBjaHVuayBzaG91bGQgYmUgcmV0cmllZCBpZiBpdCBmYWlscy5cbiAgICAgICAgICovXG4gICAgICAgIHJldHJ5Q2h1bmtzOiBmYWxzZSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogSWYgYHJldHJ5Q2h1bmtzYCBpcyB0cnVlLCBob3cgbWFueSB0aW1lcyBzaG91bGQgaXQgYmUgcmV0cmllZC5cbiAgICAgICAgICovXG4gICAgICAgIHJldHJ5Q2h1bmtzTGltaXQ6IDMsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElmIG5vdCBgbnVsbGAgZGVmaW5lcyBob3cgbWFueSBmaWxlcyB0aGlzIERyb3B6b25lIGhhbmRsZXMuIElmIGl0IGV4Y2VlZHMsXG4gICAgICAgICAqIHRoZSBldmVudCBgbWF4ZmlsZXNleGNlZWRlZGAgd2lsbCBiZSBjYWxsZWQuIFRoZSBkcm9wem9uZSBlbGVtZW50IGdldHMgdGhlXG4gICAgICAgICAqIGNsYXNzIGBkei1tYXgtZmlsZXMtcmVhY2hlZGAgYWNjb3JkaW5nbHkgc28geW91IGNhbiBwcm92aWRlIHZpc3VhbCBmZWVkYmFjay5cbiAgICAgICAgICovXG4gICAgICAgIG1heEZpbGVzaXplOiAyNTYsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSBmaWxlIHBhcmFtIHRoYXQgZ2V0cyB0cmFuc2ZlcnJlZC5cbiAgICAgICAgICogKipOT1RFKio6IElmIHlvdSBoYXZlIHRoZSBvcHRpb24gIGB1cGxvYWRNdWx0aXBsZWAgc2V0IHRvIGB0cnVlYCwgdGhlblxuICAgICAgICAgKiBEcm9wem9uZSB3aWxsIGFwcGVuZCBgW11gIHRvIHRoZSBuYW1lLlxuICAgICAgICAgKi9cbiAgICAgICAgcGFyYW1OYW1lOiBcImZpbGVcIixcblxuICAgICAgICAvKipcbiAgICAgICAgICogV2hldGhlciB0aHVtYm5haWxzIGZvciBpbWFnZXMgc2hvdWxkIGJlIGdlbmVyYXRlZFxuICAgICAgICAgKi9cbiAgICAgICAgY3JlYXRlSW1hZ2VUaHVtYm5haWxzOiB0cnVlLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbiBNQi4gV2hlbiB0aGUgZmlsZW5hbWUgZXhjZWVkcyB0aGlzIGxpbWl0LCB0aGUgdGh1bWJuYWlsIHdpbGwgbm90IGJlIGdlbmVyYXRlZC5cbiAgICAgICAgICovXG4gICAgICAgIG1heFRodW1ibmFpbEZpbGVzaXplOiAxMCxcblxuICAgICAgICAvKipcbiAgICAgICAgICogSWYgYG51bGxgLCB0aGUgcmF0aW8gb2YgdGhlIGltYWdlIHdpbGwgYmUgdXNlZCB0byBjYWxjdWxhdGUgaXQuXG4gICAgICAgICAqL1xuICAgICAgICB0aHVtYm5haWxXaWR0aDogMTIwLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgc2FtZSBhcyBgdGh1bWJuYWlsV2lkdGhgLiBJZiBib3RoIGFyZSBudWxsLCBpbWFnZXMgd2lsbCBub3QgYmUgcmVzaXplZC5cbiAgICAgICAgICovXG4gICAgICAgIHRodW1ibmFpbEhlaWdodDogMTIwLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBIb3cgdGhlIGltYWdlcyBzaG91bGQgYmUgc2NhbGVkIGRvd24gaW4gY2FzZSBib3RoLCBgdGh1bWJuYWlsV2lkdGhgIGFuZCBgdGh1bWJuYWlsSGVpZ2h0YCBhcmUgcHJvdmlkZWQuXG4gICAgICAgICAqIENhbiBiZSBlaXRoZXIgYGNvbnRhaW5gIG9yIGBjcm9wYC5cbiAgICAgICAgICovXG4gICAgICAgIHRodW1ibmFpbE1ldGhvZDogJ2Nyb3AnLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJZiBzZXQsIGltYWdlcyB3aWxsIGJlIHJlc2l6ZWQgdG8gdGhlc2UgZGltZW5zaW9ucyBiZWZvcmUgYmVpbmcgKip1cGxvYWRlZCoqLlxuICAgICAgICAgKiBJZiBvbmx5IG9uZSwgYHJlc2l6ZVdpZHRoYCAqKm9yKiogYHJlc2l6ZUhlaWdodGAgaXMgcHJvdmlkZWQsIHRoZSBvcmlnaW5hbCBhc3BlY3RcbiAgICAgICAgICogcmF0aW8gb2YgdGhlIGZpbGUgd2lsbCBiZSBwcmVzZXJ2ZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZSBgb3B0aW9ucy50cmFuc2Zvcm1GaWxlYCBmdW5jdGlvbiB1c2VzIHRoZXNlIG9wdGlvbnMsIHNvIGlmIHRoZSBgdHJhbnNmb3JtRmlsZWAgZnVuY3Rpb25cbiAgICAgICAgICogaXMgb3ZlcnJpZGRlbiwgdGhlc2Ugb3B0aW9ucyBkb24ndCBkbyBhbnl0aGluZy5cbiAgICAgICAgICovXG4gICAgICAgIHJlc2l6ZVdpZHRoOiBudWxsLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZWUgYHJlc2l6ZVdpZHRoYC5cbiAgICAgICAgICovXG4gICAgICAgIHJlc2l6ZUhlaWdodDogbnVsbCxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIG1pbWUgdHlwZSBvZiB0aGUgcmVzaXplZCBpbWFnZSAoYmVmb3JlIGl0IGdldHMgdXBsb2FkZWQgdG8gdGhlIHNlcnZlcikuXG4gICAgICAgICAqIElmIGBudWxsYCB0aGUgb3JpZ2luYWwgbWltZSB0eXBlIHdpbGwgYmUgdXNlZC4gVG8gZm9yY2UganBlZywgZm9yIGV4YW1wbGUsIHVzZSBgaW1hZ2UvanBlZ2AuXG4gICAgICAgICAqIFNlZSBgcmVzaXplV2lkdGhgIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgICAgICAgKi9cbiAgICAgICAgcmVzaXplTWltZVR5cGU6IG51bGwsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBxdWFsaXR5IG9mIHRoZSByZXNpemVkIGltYWdlcy4gU2VlIGByZXNpemVXaWR0aGAuXG4gICAgICAgICAqL1xuICAgICAgICByZXNpemVRdWFsaXR5OiAwLjgsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEhvdyB0aGUgaW1hZ2VzIHNob3VsZCBiZSBzY2FsZWQgZG93biBpbiBjYXNlIGJvdGgsIGByZXNpemVXaWR0aGAgYW5kIGByZXNpemVIZWlnaHRgIGFyZSBwcm92aWRlZC5cbiAgICAgICAgICogQ2FuIGJlIGVpdGhlciBgY29udGFpbmAgb3IgYGNyb3BgLlxuICAgICAgICAgKi9cbiAgICAgICAgcmVzaXplTWV0aG9kOiAnY29udGFpbicsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBiYXNlIHRoYXQgaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIGZpbGVzaXplLiBZb3UgY2FuIGNoYW5nZSB0aGlzIHRvXG4gICAgICAgICAqIDEwMjQgaWYgeW91IHdvdWxkIHJhdGhlciBkaXNwbGF5IGtpYmlieXRlcywgbWViaWJ5dGVzLCBldGMuLi5cbiAgICAgICAgICogMTAyNCBpcyB0ZWNobmljYWxseSBpbmNvcnJlY3QsIGJlY2F1c2UgYDEwMjQgYnl0ZXNgIGFyZSBgMSBraWJpYnl0ZWAgbm90IGAxIGtpbG9ieXRlYC5cbiAgICAgICAgICogWW91IGNhbiBjaGFuZ2UgdGhpcyB0byBgMTAyNGAgaWYgeW91IGRvbid0IGNhcmUgYWJvdXQgdmFsaWRpdHkuXG4gICAgICAgICAqL1xuICAgICAgICBmaWxlc2l6ZUJhc2U6IDEwMDAsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhbiBiZSB1c2VkIHRvIGxpbWl0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBmaWxlcyB0aGF0IHdpbGwgYmUgaGFuZGxlZCBieSB0aGlzIERyb3B6b25lXG4gICAgICAgICAqL1xuICAgICAgICBtYXhGaWxlczogbnVsbCxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIHNlbmQgYWRkaXRpb25hbCBoZWFkZXJzIHRvIHRoZSBzZXJ2ZXIuIEVnOlxuICAgICAgICAgKiBgeyBcIk15LUF3ZXNvbWUtSGVhZGVyXCI6IFwiaGVhZGVyIHZhbHVlXCIgfWBcbiAgICAgICAgICovXG4gICAgICAgIGhlYWRlcnM6IG51bGwsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElmIGB0cnVlYCwgdGhlIGRyb3B6b25lIGVsZW1lbnQgaXRzZWxmIHdpbGwgYmUgY2xpY2thYmxlLCBpZiBgZmFsc2VgXG4gICAgICAgICAqIG5vdGhpbmcgd2lsbCBiZSBjbGlja2FibGUuXG4gICAgICAgICAqXG4gICAgICAgICAqIFlvdSBjYW4gYWxzbyBwYXNzIGFuIEhUTUwgZWxlbWVudCwgYSBDU1Mgc2VsZWN0b3IgKGZvciBtdWx0aXBsZSBlbGVtZW50cylcbiAgICAgICAgICogb3IgYW4gYXJyYXkgb2YgdGhvc2UuIEluIHRoYXQgY2FzZSwgYWxsIG9mIHRob3NlIGVsZW1lbnRzIHdpbGwgdHJpZ2dlciBhblxuICAgICAgICAgKiB1cGxvYWQgd2hlbiBjbGlja2VkLlxuICAgICAgICAgKi9cbiAgICAgICAgY2xpY2thYmxlOiB0cnVlLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXaGV0aGVyIGhpZGRlbiBmaWxlcyBpbiBkaXJlY3RvcmllcyBzaG91bGQgYmUgaWdub3JlZC5cbiAgICAgICAgICovXG4gICAgICAgIGlnbm9yZUhpZGRlbkZpbGVzOiB0cnVlLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBgYWNjZXB0YCBjaGVja3MgdGhlIGZpbGUncyBtaW1lIHR5cGUgb3JcbiAgICAgICAgICogZXh0ZW5zaW9uIGFnYWluc3QgdGhpcyBsaXN0LiBUaGlzIGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgbWltZVxuICAgICAgICAgKiB0eXBlcyBvciBmaWxlIGV4dGVuc2lvbnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEVnLjogYGltYWdlLyosYXBwbGljYXRpb24vcGRmLC5wc2RgXG4gICAgICAgICAqXG4gICAgICAgICAqIElmIHRoZSBEcm9wem9uZSBpcyBgY2xpY2thYmxlYCB0aGlzIG9wdGlvbiB3aWxsIGFsc28gYmUgdXNlZCBhc1xuICAgICAgICAgKiBbYGFjY2VwdGBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvSFRNTC9FbGVtZW50L2lucHV0I2F0dHItYWNjZXB0KVxuICAgICAgICAgKiBwYXJhbWV0ZXIgb24gdGhlIGhpZGRlbiBmaWxlIGlucHV0IGFzIHdlbGwuXG4gICAgICAgICAqL1xuICAgICAgICBhY2NlcHRlZEZpbGVzOiBudWxsLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiAqKkRlcHJlY2F0ZWQhKipcbiAgICAgICAgICogVXNlIGFjY2VwdGVkRmlsZXMgaW5zdGVhZC5cbiAgICAgICAgICovXG4gICAgICAgIGFjY2VwdGVkTWltZVR5cGVzOiBudWxsLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJZiBmYWxzZSwgZmlsZXMgd2lsbCBiZSBhZGRlZCB0byB0aGUgcXVldWUgYnV0IHRoZSBxdWV1ZSB3aWxsIG5vdCBiZVxuICAgICAgICAgKiBwcm9jZXNzZWQgYXV0b21hdGljYWxseS5cbiAgICAgICAgICogVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSBuZWVkIHNvbWUgYWRkaXRpb25hbCB1c2VyIGlucHV0IGJlZm9yZSBzZW5kaW5nXG4gICAgICAgICAqIGZpbGVzIChvciBpZiB5b3Ugd2FudCB3YW50IGFsbCBmaWxlcyBzZW50IGF0IG9uY2UpLlxuICAgICAgICAgKiBJZiB5b3UncmUgcmVhZHkgdG8gc2VuZCB0aGUgZmlsZSBzaW1wbHkgY2FsbCBgbXlEcm9wem9uZS5wcm9jZXNzUXVldWUoKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIFNlZSB0aGUgW2VucXVldWluZyBmaWxlIHVwbG9hZHNdKCNlbnF1ZXVpbmctZmlsZS11cGxvYWRzKSBkb2N1bWVudGF0aW9uXG4gICAgICAgICAqIHNlY3Rpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICAgICAqL1xuICAgICAgICBhdXRvUHJvY2Vzc1F1ZXVlOiB0cnVlLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJZiBmYWxzZSwgZmlsZXMgYWRkZWQgdG8gdGhlIGRyb3B6b25lIHdpbGwgbm90IGJlIHF1ZXVlZCBieSBkZWZhdWx0LlxuICAgICAgICAgKiBZb3UnbGwgaGF2ZSB0byBjYWxsIGBlbnF1ZXVlRmlsZShmaWxlKWAgbWFudWFsbHkuXG4gICAgICAgICAqL1xuICAgICAgICBhdXRvUXVldWU6IHRydWUsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElmIGB0cnVlYCwgdGhpcyB3aWxsIGFkZCBhIGxpbmsgdG8gZXZlcnkgZmlsZSBwcmV2aWV3IHRvIHJlbW92ZSBvciBjYW5jZWwgKGlmXG4gICAgICAgICAqIGFscmVhZHkgdXBsb2FkaW5nKSB0aGUgZmlsZS4gVGhlIGBkaWN0Q2FuY2VsVXBsb2FkYCwgYGRpY3RDYW5jZWxVcGxvYWRDb25maXJtYXRpb25gXG4gICAgICAgICAqIGFuZCBgZGljdFJlbW92ZUZpbGVgIG9wdGlvbnMgYXJlIHVzZWQgZm9yIHRoZSB3b3JkaW5nLlxuICAgICAgICAgKi9cbiAgICAgICAgYWRkUmVtb3ZlTGlua3M6IGZhbHNlLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZWZpbmVzIHdoZXJlIHRvIGRpc3BsYXkgdGhlIGZpbGUgcHJldmlld3Mg4oCTIGlmIGBudWxsYCB0aGVcbiAgICAgICAgICogRHJvcHpvbmUgZWxlbWVudCBpdHNlbGYgaXMgdXNlZC4gQ2FuIGJlIGEgcGxhaW4gYEhUTUxFbGVtZW50YCBvciBhIENTU1xuICAgICAgICAgKiBzZWxlY3Rvci4gVGhlIGVsZW1lbnQgc2hvdWxkIGhhdmUgdGhlIGBkcm9wem9uZS1wcmV2aWV3c2AgY2xhc3Mgc29cbiAgICAgICAgICogdGhlIHByZXZpZXdzIGFyZSBkaXNwbGF5ZWQgcHJvcGVybHkuXG4gICAgICAgICAqL1xuICAgICAgICBwcmV2aWV3c0NvbnRhaW5lcjogbnVsbCxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBpcyB0aGUgZWxlbWVudCB0aGUgaGlkZGVuIGlucHV0IGZpZWxkICh3aGljaCBpcyB1c2VkIHdoZW4gY2xpY2tpbmcgb24gdGhlXG4gICAgICAgICAqIGRyb3B6b25lIHRvIHRyaWdnZXIgZmlsZSBzZWxlY3Rpb24pIHdpbGwgYmUgYXBwZW5kZWQgdG8uIFRoaXMgbWlnaHRcbiAgICAgICAgICogYmUgaW1wb3J0YW50IGluIGNhc2UgeW91IHVzZSBmcmFtZXdvcmtzIHRvIHN3aXRjaCB0aGUgY29udGVudCBvZiB5b3VyIHBhZ2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIENhbiBiZSBhIHNlbGVjdG9yIHN0cmluZywgb3IgYW4gZWxlbWVudCBkaXJlY3RseS5cbiAgICAgICAgICovXG4gICAgICAgIGhpZGRlbklucHV0Q29udGFpbmVyOiBcImJvZHlcIixcblxuICAgICAgICAvKipcbiAgICAgICAgICogSWYgbnVsbCwgbm8gY2FwdHVyZSB0eXBlIHdpbGwgYmUgc3BlY2lmaWVkXG4gICAgICAgICAqIElmIGNhbWVyYSwgbW9iaWxlIGRldmljZXMgd2lsbCBza2lwIHRoZSBmaWxlIHNlbGVjdGlvbiBhbmQgY2hvb3NlIGNhbWVyYVxuICAgICAgICAgKiBJZiBtaWNyb3Bob25lLCBtb2JpbGUgZGV2aWNlcyB3aWxsIHNraXAgdGhlIGZpbGUgc2VsZWN0aW9uIGFuZCBjaG9vc2UgdGhlIG1pY3JvcGhvbmVcbiAgICAgICAgICogSWYgY2FtY29yZGVyLCBtb2JpbGUgZGV2aWNlcyB3aWxsIHNraXAgdGhlIGZpbGUgc2VsZWN0aW9uIGFuZCBjaG9vc2UgdGhlIGNhbWVyYSBpbiB2aWRlbyBtb2RlXG4gICAgICAgICAqIE9uIGFwcGxlIGRldmljZXMgbXVsdGlwbGUgbXVzdCBiZSBzZXQgdG8gZmFsc2UuICBBY2NlcHRlZEZpbGVzIG1heSBuZWVkIHRvXG4gICAgICAgICAqIGJlIHNldCB0byBhbiBhcHByb3ByaWF0ZSBtaW1lIHR5cGUgKGUuZy4gXCJpbWFnZS8qXCIsIFwiYXVkaW8vKlwiLCBvciBcInZpZGVvLypcIikuXG4gICAgICAgICAqL1xuICAgICAgICBjYXB0dXJlOiBudWxsLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiAqKkRlcHJlY2F0ZWQqKi4gVXNlIGByZW5hbWVGaWxlYCBpbnN0ZWFkLlxuICAgICAgICAgKi9cbiAgICAgICAgcmVuYW1lRmlsZW5hbWU6IG51bGwsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgZnVuY3Rpb24gdGhhdCBpcyBpbnZva2VkIGJlZm9yZSB0aGUgZmlsZSBpcyB1cGxvYWRlZCB0byB0aGUgc2VydmVyIGFuZCByZW5hbWVzIHRoZSBmaWxlLlxuICAgICAgICAgKiBUaGlzIGZ1bmN0aW9uIGdldHMgdGhlIGBGaWxlYCBhcyBhcmd1bWVudCBhbmQgY2FuIHVzZSB0aGUgYGZpbGUubmFtZWAuIFRoZSBhY3R1YWwgbmFtZSBvZiB0aGVcbiAgICAgICAgICogZmlsZSB0aGF0IGdldHMgdXNlZCBkdXJpbmcgdGhlIHVwbG9hZCBjYW4gYmUgYWNjZXNzZWQgdGhyb3VnaCBgZmlsZS51cGxvYWQuZmlsZW5hbWVgLlxuICAgICAgICAgKi9cbiAgICAgICAgcmVuYW1lRmlsZTogbnVsbCxcblxuICAgICAgICAvKipcbiAgICAgICAgICogSWYgYHRydWVgIHRoZSBmYWxsYmFjayB3aWxsIGJlIGZvcmNlZC4gVGhpcyBpcyB2ZXJ5IHVzZWZ1bCB0byB0ZXN0IHlvdXIgc2VydmVyXG4gICAgICAgICAqIGltcGxlbWVudGF0aW9ucyBmaXJzdCBhbmQgbWFrZSBzdXJlIHRoYXQgZXZlcnl0aGluZyB3b3JrcyBhc1xuICAgICAgICAgKiBleHBlY3RlZCB3aXRob3V0IGRyb3B6b25lIGlmIHlvdSBleHBlcmllbmNlIHByb2JsZW1zLCBhbmQgdG8gdGVzdFxuICAgICAgICAgKiBob3cgeW91ciBmYWxsYmFja3Mgd2lsbCBsb29rLlxuICAgICAgICAgKi9cbiAgICAgICAgZm9yY2VGYWxsYmFjazogZmFsc2UsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSB0ZXh0IHVzZWQgYmVmb3JlIGFueSBmaWxlcyBhcmUgZHJvcHBlZC5cbiAgICAgICAgICovXG4gICAgICAgIGRpY3REZWZhdWx0TWVzc2FnZTogXCJEcm9wIGZpbGVzIGhlcmUgdG8gdXBsb2FkXCIsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSB0ZXh0IHRoYXQgcmVwbGFjZXMgdGhlIGRlZmF1bHQgbWVzc2FnZSB0ZXh0IGl0IHRoZSBicm93c2VyIGlzIG5vdCBzdXBwb3J0ZWQuXG4gICAgICAgICAqL1xuICAgICAgICBkaWN0RmFsbGJhY2tNZXNzYWdlOiBcIllvdXIgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IGRyYWcnbidkcm9wIGZpbGUgdXBsb2Fkcy5cIixcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHRleHQgdGhhdCB3aWxsIGJlIGFkZGVkIGJlZm9yZSB0aGUgZmFsbGJhY2sgZm9ybS5cbiAgICAgICAgICogSWYgeW91IHByb3ZpZGUgYSAgZmFsbGJhY2sgZWxlbWVudCB5b3Vyc2VsZiwgb3IgaWYgdGhpcyBvcHRpb24gaXMgYG51bGxgIHRoaXMgd2lsbFxuICAgICAgICAgKiBiZSBpZ25vcmVkLlxuICAgICAgICAgKi9cbiAgICAgICAgZGljdEZhbGxiYWNrVGV4dDogXCJQbGVhc2UgdXNlIHRoZSBmYWxsYmFjayBmb3JtIGJlbG93IHRvIHVwbG9hZCB5b3VyIGZpbGVzIGxpa2UgaW4gdGhlIG9sZGVuIGRheXMuXCIsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElmIHRoZSBmaWxlc2l6ZSBpcyB0b28gYmlnLlxuICAgICAgICAgKiBge3tmaWxlc2l6ZX19YCBhbmQgYHt7bWF4RmlsZXNpemV9fWAgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSByZXNwZWN0aXZlIGNvbmZpZ3VyYXRpb24gdmFsdWVzLlxuICAgICAgICAgKi9cbiAgICAgICAgZGljdEZpbGVUb29CaWc6IFwiRmlsZSBpcyB0b28gYmlnICh7e2ZpbGVzaXplfX1NaUIpLiBNYXggZmlsZXNpemU6IHt7bWF4RmlsZXNpemV9fU1pQi5cIixcblxuICAgICAgICAvKipcbiAgICAgICAgICogSWYgdGhlIGZpbGUgZG9lc24ndCBtYXRjaCB0aGUgZmlsZSB0eXBlLlxuICAgICAgICAgKi9cbiAgICAgICAgZGljdEludmFsaWRGaWxlVHlwZTogXCJZb3UgY2FuJ3QgdXBsb2FkIGZpbGVzIG9mIHRoaXMgdHlwZS5cIixcblxuICAgICAgICAvKipcbiAgICAgICAgICogSWYgdGhlIHNlcnZlciByZXNwb25zZSB3YXMgaW52YWxpZC5cbiAgICAgICAgICogYHt7c3RhdHVzQ29kZX19YCB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIHNlcnZlcnMgc3RhdHVzIGNvZGUuXG4gICAgICAgICAqL1xuICAgICAgICBkaWN0UmVzcG9uc2VFcnJvcjogXCJTZXJ2ZXIgcmVzcG9uZGVkIHdpdGgge3tzdGF0dXNDb2RlfX0gY29kZS5cIixcblxuICAgICAgICAvKipcbiAgICAgICAgICogSWYgYGFkZFJlbW92ZUxpbmtzYCBpcyB0cnVlLCB0aGUgdGV4dCB0byBiZSB1c2VkIGZvciB0aGUgY2FuY2VsIHVwbG9hZCBsaW5rLlxuICAgICAgICAgKi9cbiAgICAgICAgZGljdENhbmNlbFVwbG9hZDogXCJDYW5jZWwgdXBsb2FkXCIsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSB0ZXh0IHRoYXQgaXMgZGlzcGxheWVkIGlmIGFuIHVwbG9hZCB3YXMgbWFudWFsbHkgY2FuY2VsZWRcbiAgICAgICAgICovXG4gICAgICAgIGRpY3RVcGxvYWRDYW5jZWxlZDogXCJVcGxvYWQgY2FuY2VsZWQuXCIsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElmIGBhZGRSZW1vdmVMaW5rc2AgaXMgdHJ1ZSwgdGhlIHRleHQgdG8gYmUgdXNlZCBmb3IgY29uZmlybWF0aW9uIHdoZW4gY2FuY2VsbGluZyB1cGxvYWQuXG4gICAgICAgICAqL1xuICAgICAgICBkaWN0Q2FuY2VsVXBsb2FkQ29uZmlybWF0aW9uOiBcIkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBjYW5jZWwgdGhpcyB1cGxvYWQ/XCIsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElmIGBhZGRSZW1vdmVMaW5rc2AgaXMgdHJ1ZSwgdGhlIHRleHQgdG8gYmUgdXNlZCB0byByZW1vdmUgYSBmaWxlLlxuICAgICAgICAgKi9cbiAgICAgICAgZGljdFJlbW92ZUZpbGU6IFwiUmVtb3ZlIGZpbGVcIixcblxuICAgICAgICAvKipcbiAgICAgICAgICogSWYgdGhpcyBpcyBub3QgbnVsbCwgdGhlbiB0aGUgdXNlciB3aWxsIGJlIHByb21wdGVkIGJlZm9yZSByZW1vdmluZyBhIGZpbGUuXG4gICAgICAgICAqL1xuICAgICAgICBkaWN0UmVtb3ZlRmlsZUNvbmZpcm1hdGlvbjogbnVsbCxcblxuICAgICAgICAvKipcbiAgICAgICAgICogRGlzcGxheWVkIGlmIGBtYXhGaWxlc2AgaXMgc3QgYW5kIGV4Y2VlZGVkLlxuICAgICAgICAgKiBUaGUgc3RyaW5nIGB7e21heEZpbGVzfX1gIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIGNvbmZpZ3VyYXRpb24gdmFsdWUuXG4gICAgICAgICAqL1xuICAgICAgICBkaWN0TWF4RmlsZXNFeGNlZWRlZDogXCJZb3UgY2FuIG5vdCB1cGxvYWQgYW55IG1vcmUgZmlsZXMuXCIsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFsbG93cyB5b3UgdG8gdHJhbnNsYXRlIHRoZSBkaWZmZXJlbnQgdW5pdHMuIFN0YXJ0aW5nIHdpdGggYHRiYCBmb3IgdGVyYWJ5dGVzIGFuZCBnb2luZyBkb3duIHRvXG4gICAgICAgICAqIGBiYCBmb3IgYnl0ZXMuXG4gICAgICAgICAqL1xuICAgICAgICBkaWN0RmlsZVNpemVVbml0czoge1xuICAgICAgICAgIHRiOiBcIlRCXCIsXG4gICAgICAgICAgZ2I6IFwiR0JcIixcbiAgICAgICAgICBtYjogXCJNQlwiLFxuICAgICAgICAgIGtiOiBcIktCXCIsXG4gICAgICAgICAgYjogXCJiXCJcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsbGVkIHdoZW4gZHJvcHpvbmUgaW5pdGlhbGl6ZWRcbiAgICAgICAgICogWW91IGNhbiBhZGQgZXZlbnQgbGlzdGVuZXJzIGhlcmVcbiAgICAgICAgICovXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uIGluaXQoKSB7fSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FuIGJlIGFuICoqb2JqZWN0Kiogb2YgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIHRvIHRyYW5zZmVyIHRvIHRoZSBzZXJ2ZXIsICoqb3IqKiBhIGBGdW5jdGlvbmBcbiAgICAgICAgICogdGhhdCBnZXRzIGludm9rZWQgd2l0aCB0aGUgYGZpbGVzYCwgYHhocmAgYW5kLCBpZiBpdCdzIGEgY2h1bmtlZCB1cGxvYWQsIGBjaHVua2AgYXJndW1lbnRzLiBJbiBjYXNlXG4gICAgICAgICAqIG9mIGEgZnVuY3Rpb24sIHRoaXMgbmVlZHMgdG8gcmV0dXJuIGEgbWFwLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcgZm9yIG5vcm1hbCB1cGxvYWRzLCBidXQgYWRkcyByZWxldmFudCBpbmZvcm1hdGlvbiBmb3JcbiAgICAgICAgICogY2h1bmtlZCB1cGxvYWRzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGlzIGlzIHRoZSBzYW1lIGFzIGFkZGluZyBoaWRkZW4gaW5wdXQgZmllbGRzIGluIHRoZSBmb3JtIGVsZW1lbnQuXG4gICAgICAgICAqL1xuICAgICAgICBwYXJhbXM6IGZ1bmN0aW9uIHBhcmFtcyhmaWxlcywgeGhyLCBjaHVuaykge1xuICAgICAgICAgIGlmIChjaHVuaykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgZHp1dWlkOiBjaHVuay5maWxlLnVwbG9hZC51dWlkLFxuICAgICAgICAgICAgICBkemNodW5raW5kZXg6IGNodW5rLmluZGV4LFxuICAgICAgICAgICAgICBkenRvdGFsZmlsZXNpemU6IGNodW5rLmZpbGUuc2l6ZSxcbiAgICAgICAgICAgICAgZHpjaHVua3NpemU6IHRoaXMub3B0aW9ucy5jaHVua1NpemUsXG4gICAgICAgICAgICAgIGR6dG90YWxjaHVua2NvdW50OiBjaHVuay5maWxlLnVwbG9hZC50b3RhbENodW5rQ291bnQsXG4gICAgICAgICAgICAgIGR6Y2h1bmtieXRlb2Zmc2V0OiBjaHVuay5pbmRleCAqIHRoaXMub3B0aW9ucy5jaHVua1NpemVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGZ1bmN0aW9uIHRoYXQgZ2V0cyBhIFtmaWxlXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0RPTS9GaWxlKVxuICAgICAgICAgKiBhbmQgYSBgZG9uZWAgZnVuY3Rpb24gYXMgcGFyYW1ldGVycy5cbiAgICAgICAgICpcbiAgICAgICAgICogSWYgdGhlIGRvbmUgZnVuY3Rpb24gaXMgaW52b2tlZCB3aXRob3V0IGFyZ3VtZW50cywgdGhlIGZpbGUgaXMgXCJhY2NlcHRlZFwiIGFuZCB3aWxsXG4gICAgICAgICAqIGJlIHByb2Nlc3NlZC4gSWYgeW91IHBhc3MgYW4gZXJyb3IgbWVzc2FnZSwgdGhlIGZpbGUgaXMgcmVqZWN0ZWQsIGFuZCB0aGUgZXJyb3JcbiAgICAgICAgICogbWVzc2FnZSB3aWxsIGJlIGRpc3BsYXllZC5cbiAgICAgICAgICogVGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBiZSBjYWxsZWQgaWYgdGhlIGZpbGUgaXMgdG9vIGJpZyBvciBkb2Vzbid0IG1hdGNoIHRoZSBtaW1lIHR5cGVzLlxuICAgICAgICAgKi9cbiAgICAgICAgYWNjZXB0OiBmdW5jdGlvbiBhY2NlcHQoZmlsZSwgZG9uZSkge1xuICAgICAgICAgIHJldHVybiBkb25lKCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBjYWxsYmFjayB0aGF0IHdpbGwgYmUgaW52b2tlZCB3aGVuIGFsbCBjaHVua3MgaGF2ZSBiZWVuIHVwbG9hZGVkIGZvciBhIGZpbGUuXG4gICAgICAgICAqIEl0IGdldHMgdGhlIGZpbGUgZm9yIHdoaWNoIHRoZSBjaHVua3MgaGF2ZSBiZWVuIHVwbG9hZGVkIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIsXG4gICAgICAgICAqIGFuZCB0aGUgYGRvbmVgIGZ1bmN0aW9uIGFzIHNlY29uZC4gYGRvbmUoKWAgbmVlZHMgdG8gYmUgaW52b2tlZCB3aGVuIGV2ZXJ5dGhpbmdcbiAgICAgICAgICogbmVlZGVkIHRvIGZpbmlzaCB0aGUgdXBsb2FkIHByb2Nlc3MgaXMgZG9uZS5cbiAgICAgICAgICovXG4gICAgICAgIGNodW5rc1VwbG9hZGVkOiBmdW5jdGlvbiBjaHVua3NVcGxvYWRlZChmaWxlLCBkb25lKSB7XG4gICAgICAgICAgZG9uZSgpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIGNhbGxlZCB3aGVuIHRoZSBicm93c2VyIGlzIG5vdCBzdXBwb3J0ZWQuXG4gICAgICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNob3dzIHRoZSBmYWxsYmFjayBpbnB1dCBmaWVsZCBhbmQgYWRkc1xuICAgICAgICAgKiBhIHRleHQuXG4gICAgICAgICAqL1xuICAgICAgICBmYWxsYmFjazogZnVuY3Rpb24gZmFsbGJhY2soKSB7XG4gICAgICAgICAgLy8gVGhpcyBjb2RlIHNob3VsZCBwYXNzIGluIElFNy4uLiA6KFxuICAgICAgICAgIHZhciBtZXNzYWdlRWxlbWVudDtcbiAgICAgICAgICB0aGlzLmVsZW1lbnQuY2xhc3NOYW1lID0gXCJcIi5jb25jYXQodGhpcy5lbGVtZW50LmNsYXNzTmFtZSwgXCIgZHotYnJvd3Nlci1ub3Qtc3VwcG9ydGVkXCIpO1xuXG4gICAgICAgICAgdmFyIF9pdGVyYXRvcjIgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcih0aGlzLmVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJkaXZcIikpLFxuICAgICAgICAgICAgICBfc3RlcDI7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yIChfaXRlcmF0b3IyLnMoKTsgIShfc3RlcDIgPSBfaXRlcmF0b3IyLm4oKSkuZG9uZTspIHtcbiAgICAgICAgICAgICAgdmFyIGNoaWxkID0gX3N0ZXAyLnZhbHVlO1xuXG4gICAgICAgICAgICAgIGlmICgvKF58IClkei1tZXNzYWdlKCR8ICkvLnRlc3QoY2hpbGQuY2xhc3NOYW1lKSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VFbGVtZW50ID0gY2hpbGQ7XG4gICAgICAgICAgICAgICAgY2hpbGQuY2xhc3NOYW1lID0gXCJkei1tZXNzYWdlXCI7IC8vIFJlbW92ZXMgdGhlICdkei1kZWZhdWx0JyBjbGFzc1xuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIF9pdGVyYXRvcjIuZShlcnIpO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBfaXRlcmF0b3IyLmYoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIW1lc3NhZ2VFbGVtZW50KSB7XG4gICAgICAgICAgICBtZXNzYWdlRWxlbWVudCA9IERyb3B6b25lLmNyZWF0ZUVsZW1lbnQoXCI8ZGl2IGNsYXNzPVxcXCJkei1tZXNzYWdlXFxcIj48c3Bhbj48L3NwYW4+PC9kaXY+XCIpO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKG1lc3NhZ2VFbGVtZW50KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgc3BhbiA9IG1lc3NhZ2VFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwic3BhblwiKVswXTtcblxuICAgICAgICAgIGlmIChzcGFuKSB7XG4gICAgICAgICAgICBpZiAoc3Bhbi50ZXh0Q29udGVudCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIHNwYW4udGV4dENvbnRlbnQgPSB0aGlzLm9wdGlvbnMuZGljdEZhbGxiYWNrTWVzc2FnZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3Bhbi5pbm5lclRleHQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICBzcGFuLmlubmVyVGV4dCA9IHRoaXMub3B0aW9ucy5kaWN0RmFsbGJhY2tNZXNzYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5nZXRGYWxsYmFja0Zvcm0oKSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgY2FsbGVkIHRvIGNhbGN1bGF0ZSB0aGUgdGh1bWJuYWlsIGRpbWVuc2lvbnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEl0IGdldHMgYGZpbGVgLCBgd2lkdGhgIGFuZCBgaGVpZ2h0YCAoYm90aCBtYXkgYmUgYG51bGxgKSBhcyBwYXJhbWV0ZXJzIGFuZCBtdXN0IHJldHVybiBhbiBvYmplY3QgY29udGFpbmluZzpcbiAgICAgICAgICpcbiAgICAgICAgICogIC0gYHNyY1dpZHRoYCAmIGBzcmNIZWlnaHRgIChyZXF1aXJlZClcbiAgICAgICAgICogIC0gYHRyZ1dpZHRoYCAmIGB0cmdIZWlnaHRgIChyZXF1aXJlZClcbiAgICAgICAgICogIC0gYHNyY1hgICYgYHNyY1lgIChvcHRpb25hbCwgZGVmYXVsdCBgMGApXG4gICAgICAgICAqICAtIGB0cmdYYCAmIGB0cmdZYCAob3B0aW9uYWwsIGRlZmF1bHQgYDBgKVxuICAgICAgICAgKlxuICAgICAgICAgKiBUaG9zZSB2YWx1ZXMgYXJlIGdvaW5nIHRvIGJlIHVzZWQgYnkgYGN0eC5kcmF3SW1hZ2UoKWAuXG4gICAgICAgICAqL1xuICAgICAgICByZXNpemU6IGZ1bmN0aW9uIHJlc2l6ZShmaWxlLCB3aWR0aCwgaGVpZ2h0LCByZXNpemVNZXRob2QpIHtcbiAgICAgICAgICB2YXIgaW5mbyA9IHtcbiAgICAgICAgICAgIHNyY1g6IDAsXG4gICAgICAgICAgICBzcmNZOiAwLFxuICAgICAgICAgICAgc3JjV2lkdGg6IGZpbGUud2lkdGgsXG4gICAgICAgICAgICBzcmNIZWlnaHQ6IGZpbGUuaGVpZ2h0XG4gICAgICAgICAgfTtcbiAgICAgICAgICB2YXIgc3JjUmF0aW8gPSBmaWxlLndpZHRoIC8gZmlsZS5oZWlnaHQ7IC8vIEF1dG9tYXRpY2FsbHkgY2FsY3VsYXRlIGRpbWVuc2lvbnMgaWYgbm90IHNwZWNpZmllZFxuXG4gICAgICAgICAgaWYgKHdpZHRoID09IG51bGwgJiYgaGVpZ2h0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHdpZHRoID0gaW5mby5zcmNXaWR0aDtcbiAgICAgICAgICAgIGhlaWdodCA9IGluZm8uc3JjSGVpZ2h0O1xuICAgICAgICAgIH0gZWxzZSBpZiAod2lkdGggPT0gbnVsbCkge1xuICAgICAgICAgICAgd2lkdGggPSBoZWlnaHQgKiBzcmNSYXRpbztcbiAgICAgICAgICB9IGVsc2UgaWYgKGhlaWdodCA9PSBudWxsKSB7XG4gICAgICAgICAgICBoZWlnaHQgPSB3aWR0aCAvIHNyY1JhdGlvO1xuICAgICAgICAgIH0gLy8gTWFrZSBzdXJlIGltYWdlcyBhcmVuJ3QgdXBzY2FsZWRcblxuXG4gICAgICAgICAgd2lkdGggPSBNYXRoLm1pbih3aWR0aCwgaW5mby5zcmNXaWR0aCk7XG4gICAgICAgICAgaGVpZ2h0ID0gTWF0aC5taW4oaGVpZ2h0LCBpbmZvLnNyY0hlaWdodCk7XG4gICAgICAgICAgdmFyIHRyZ1JhdGlvID0gd2lkdGggLyBoZWlnaHQ7XG5cbiAgICAgICAgICBpZiAoaW5mby5zcmNXaWR0aCA+IHdpZHRoIHx8IGluZm8uc3JjSGVpZ2h0ID4gaGVpZ2h0KSB7XG4gICAgICAgICAgICAvLyBJbWFnZSBpcyBiaWdnZXIgYW5kIG5lZWRzIHJlc2NhbGluZ1xuICAgICAgICAgICAgaWYgKHJlc2l6ZU1ldGhvZCA9PT0gJ2Nyb3AnKSB7XG4gICAgICAgICAgICAgIGlmIChzcmNSYXRpbyA+IHRyZ1JhdGlvKSB7XG4gICAgICAgICAgICAgICAgaW5mby5zcmNIZWlnaHQgPSBmaWxlLmhlaWdodDtcbiAgICAgICAgICAgICAgICBpbmZvLnNyY1dpZHRoID0gaW5mby5zcmNIZWlnaHQgKiB0cmdSYXRpbztcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbmZvLnNyY1dpZHRoID0gZmlsZS53aWR0aDtcbiAgICAgICAgICAgICAgICBpbmZvLnNyY0hlaWdodCA9IGluZm8uc3JjV2lkdGggLyB0cmdSYXRpbztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNpemVNZXRob2QgPT09ICdjb250YWluJykge1xuICAgICAgICAgICAgICAvLyBNZXRob2QgJ2NvbnRhaW4nXG4gICAgICAgICAgICAgIGlmIChzcmNSYXRpbyA+IHRyZ1JhdGlvKSB7XG4gICAgICAgICAgICAgICAgaGVpZ2h0ID0gd2lkdGggLyBzcmNSYXRpbztcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB3aWR0aCA9IGhlaWdodCAqIHNyY1JhdGlvO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIHJlc2l6ZU1ldGhvZCAnXCIuY29uY2F0KHJlc2l6ZU1ldGhvZCwgXCInXCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpbmZvLnNyY1ggPSAoZmlsZS53aWR0aCAtIGluZm8uc3JjV2lkdGgpIC8gMjtcbiAgICAgICAgICBpbmZvLnNyY1kgPSAoZmlsZS5oZWlnaHQgLSBpbmZvLnNyY0hlaWdodCkgLyAyO1xuICAgICAgICAgIGluZm8udHJnV2lkdGggPSB3aWR0aDtcbiAgICAgICAgICBpbmZvLnRyZ0hlaWdodCA9IGhlaWdodDtcbiAgICAgICAgICByZXR1cm4gaW5mbztcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FuIGJlIHVzZWQgdG8gdHJhbnNmb3JtIHRoZSBmaWxlIChmb3IgZXhhbXBsZSwgcmVzaXplIGFuIGltYWdlIGlmIG5lY2Vzc2FyeSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHVzZXMgYHJlc2l6ZVdpZHRoYCBhbmQgYHJlc2l6ZUhlaWdodGAgKGlmIHByb3ZpZGVkKSBhbmQgcmVzaXplc1xuICAgICAgICAgKiBpbWFnZXMgYWNjb3JkaW5nIHRvIHRob3NlIGRpbWVuc2lvbnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEdldHMgdGhlIGBmaWxlYCBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyLCBhbmQgYSBgZG9uZSgpYCBmdW5jdGlvbiBhcyB0aGUgc2Vjb25kLCB0aGF0IG5lZWRzXG4gICAgICAgICAqIHRvIGJlIGludm9rZWQgd2l0aCB0aGUgZmlsZSB3aGVuIHRoZSB0cmFuc2Zvcm1hdGlvbiBpcyBkb25lLlxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmb3JtRmlsZTogZnVuY3Rpb24gdHJhbnNmb3JtRmlsZShmaWxlLCBkb25lKSB7XG4gICAgICAgICAgaWYgKCh0aGlzLm9wdGlvbnMucmVzaXplV2lkdGggfHwgdGhpcy5vcHRpb25zLnJlc2l6ZUhlaWdodCkgJiYgZmlsZS50eXBlLm1hdGNoKC9pbWFnZS4qLykpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlc2l6ZUltYWdlKGZpbGUsIHRoaXMub3B0aW9ucy5yZXNpemVXaWR0aCwgdGhpcy5vcHRpb25zLnJlc2l6ZUhlaWdodCwgdGhpcy5vcHRpb25zLnJlc2l6ZU1ldGhvZCwgZG9uZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBkb25lKGZpbGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQSBzdHJpbmcgdGhhdCBjb250YWlucyB0aGUgdGVtcGxhdGUgdXNlZCBmb3IgZWFjaCBkcm9wcGVkXG4gICAgICAgICAqIGZpbGUuIENoYW5nZSBpdCB0byBmdWxmaWxsIHlvdXIgbmVlZHMgYnV0IG1ha2Ugc3VyZSB0byBwcm9wZXJseVxuICAgICAgICAgKiBwcm92aWRlIGFsbCBlbGVtZW50cy5cbiAgICAgICAgICpcbiAgICAgICAgICogSWYgeW91IHdhbnQgdG8gdXNlIGFuIGFjdHVhbCBIVE1MIGVsZW1lbnQgaW5zdGVhZCBvZiBwcm92aWRpbmcgYSBTdHJpbmdcbiAgICAgICAgICogYXMgYSBjb25maWcgb3B0aW9uLCB5b3UgY291bGQgY3JlYXRlIGEgZGl2IHdpdGggdGhlIGlkIGB0cGxgLFxuICAgICAgICAgKiBwdXQgdGhlIHRlbXBsYXRlIGluc2lkZSBpdCBhbmQgcHJvdmlkZSB0aGUgZWxlbWVudCBsaWtlIHRoaXM6XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBkb2N1bWVudFxuICAgICAgICAgKiAgICAgICAucXVlcnlTZWxlY3RvcignI3RwbCcpXG4gICAgICAgICAqICAgICAgIC5pbm5lckhUTUxcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIHByZXZpZXdUZW1wbGF0ZTogXCI8ZGl2IGNsYXNzPVxcXCJkei1wcmV2aWV3IGR6LWZpbGUtcHJldmlld1xcXCI+XFxuICA8ZGl2IGNsYXNzPVxcXCJkei1pbWFnZVxcXCI+PGltZyBkYXRhLWR6LXRodW1ibmFpbCAvPjwvZGl2PlxcbiAgPGRpdiBjbGFzcz1cXFwiZHotZGV0YWlsc1xcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcImR6LXNpemVcXFwiPjxzcGFuIGRhdGEtZHotc2l6ZT48L3NwYW4+PC9kaXY+XFxuICAgIDxkaXYgY2xhc3M9XFxcImR6LWZpbGVuYW1lXFxcIj48c3BhbiBkYXRhLWR6LW5hbWU+PC9zcGFuPjwvZGl2PlxcbiAgPC9kaXY+XFxuICA8ZGl2IGNsYXNzPVxcXCJkei1wcm9ncmVzc1xcXCI+PHNwYW4gY2xhc3M9XFxcImR6LXVwbG9hZFxcXCIgZGF0YS1kei11cGxvYWRwcm9ncmVzcz48L3NwYW4+PC9kaXY+XFxuICA8ZGl2IGNsYXNzPVxcXCJkei1lcnJvci1tZXNzYWdlXFxcIj48c3BhbiBkYXRhLWR6LWVycm9ybWVzc2FnZT48L3NwYW4+PC9kaXY+XFxuICA8ZGl2IGNsYXNzPVxcXCJkei1zdWNjZXNzLW1hcmtcXFwiPlxcbiAgICA8c3ZnIHdpZHRoPVxcXCI1NHB4XFxcIiBoZWlnaHQ9XFxcIjU0cHhcXFwiIHZpZXdCb3g9XFxcIjAgMCA1NCA1NFxcXCIgdmVyc2lvbj1cXFwiMS4xXFxcIiB4bWxucz1cXFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcXFwiIHhtbG5zOnhsaW5rPVxcXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXFxcIj5cXG4gICAgICA8dGl0bGU+Q2hlY2s8L3RpdGxlPlxcbiAgICAgIDxnIHN0cm9rZT1cXFwibm9uZVxcXCIgc3Ryb2tlLXdpZHRoPVxcXCIxXFxcIiBmaWxsPVxcXCJub25lXFxcIiBmaWxsLXJ1bGU9XFxcImV2ZW5vZGRcXFwiPlxcbiAgICAgICAgPHBhdGggZD1cXFwiTTIzLjUsMzEuODQzMTQ1OCBMMTcuNTg1MjQxOSwyNS45MjgzODc3IEMxNi4wMjQ4MjUzLDI0LjM2Nzk3MTEgMTMuNDkxMDI5NCwyNC4zNjY4MzUgMTEuOTI4OTMyMiwyNS45Mjg5MzIyIEMxMC4zNzAwMTM2LDI3LjQ4Nzg1MDggMTAuMzY2NTkxMiwzMC4wMjM0NDU1IDExLjkyODM4NzcsMzEuNTg1MjQxOSBMMjAuNDE0NzU4MSw0MC4wNzE2MTIzIEMyMC41MTMzOTk5LDQwLjE3MDI1NDEgMjAuNjE1OTMxNSw0MC4yNjI2NjQ5IDIwLjcyMTg2MTUsNDAuMzQ4ODQzNSBDMjIuMjgzNTY2OSw0MS44NzI1NjUxIDI0Ljc5NDIzNCw0MS44NjI2MjAyIDI2LjM0NjE1NjQsNDAuMzEwNjk3OCBMNDMuMzEwNjk3OCwyMy4zNDYxNTY0IEM0NC44NzcxMDIxLDIxLjc3OTc1MjEgNDQuODc1ODA1NywxOS4yNDgzODg3IDQzLjMxMzcwODUsMTcuNjg2MjkxNSBDNDEuNzU0Nzg5OSwxNi4xMjczNzI5IDM5LjIxNzYwMzUsMTYuMTI1NTQyMiAzNy42NTM4NDM2LDE3LjY4OTMwMjIgTDIzLjUsMzEuODQzMTQ1OCBaIE0yNyw1MyBDNDEuMzU5NDAzNSw1MyA1Myw0MS4zNTk0MDM1IDUzLDI3IEM1MywxMi42NDA1OTY1IDQxLjM1OTQwMzUsMSAyNywxIEMxMi42NDA1OTY1LDEgMSwxMi42NDA1OTY1IDEsMjcgQzEsNDEuMzU5NDAzNSAxMi42NDA1OTY1LDUzIDI3LDUzIFpcXFwiIHN0cm9rZS1vcGFjaXR5PVxcXCIwLjE5ODc5NDE1OFxcXCIgc3Ryb2tlPVxcXCIjNzQ3NDc0XFxcIiBmaWxsLW9wYWNpdHk9XFxcIjAuODE2NTE5NDc1XFxcIiBmaWxsPVxcXCIjRkZGRkZGXFxcIj48L3BhdGg+XFxuICAgICAgPC9nPlxcbiAgICA8L3N2Zz5cXG4gIDwvZGl2PlxcbiAgPGRpdiBjbGFzcz1cXFwiZHotZXJyb3ItbWFya1xcXCI+XFxuICAgIDxzdmcgd2lkdGg9XFxcIjU0cHhcXFwiIGhlaWdodD1cXFwiNTRweFxcXCIgdmlld0JveD1cXFwiMCAwIDU0IDU0XFxcIiB2ZXJzaW9uPVxcXCIxLjFcXFwiIHhtbG5zPVxcXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1xcXCIgeG1sbnM6eGxpbms9XFxcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcXFwiPlxcbiAgICAgIDx0aXRsZT5FcnJvcjwvdGl0bGU+XFxuICAgICAgPGcgc3Ryb2tlPVxcXCJub25lXFxcIiBzdHJva2Utd2lkdGg9XFxcIjFcXFwiIGZpbGw9XFxcIm5vbmVcXFwiIGZpbGwtcnVsZT1cXFwiZXZlbm9kZFxcXCI+XFxuICAgICAgICA8ZyBzdHJva2U9XFxcIiM3NDc0NzRcXFwiIHN0cm9rZS1vcGFjaXR5PVxcXCIwLjE5ODc5NDE1OFxcXCIgZmlsbD1cXFwiI0ZGRkZGRlxcXCIgZmlsbC1vcGFjaXR5PVxcXCIwLjgxNjUxOTQ3NVxcXCI+XFxuICAgICAgICAgIDxwYXRoIGQ9XFxcIk0zMi42NTY4NTQyLDI5IEwzOC4zMTA2OTc4LDIzLjM0NjE1NjQgQzM5Ljg3NzEwMjEsMjEuNzc5NzUyMSAzOS44NzU4MDU3LDE5LjI0ODM4ODcgMzguMzEzNzA4NSwxNy42ODYyOTE1IEMzNi43NTQ3ODk5LDE2LjEyNzM3MjkgMzQuMjE3NjAzNSwxNi4xMjU1NDIyIDMyLjY1Mzg0MzYsMTcuNjg5MzAyMiBMMjcsMjMuMzQzMTQ1OCBMMjEuMzQ2MTU2NCwxNy42ODkzMDIyIEMxOS43ODIzOTY1LDE2LjEyNTU0MjIgMTcuMjQ1MjEwMSwxNi4xMjczNzI5IDE1LjY4NjI5MTUsMTcuNjg2MjkxNSBDMTQuMTI0MTk0MywxOS4yNDgzODg3IDE0LjEyMjg5NzksMjEuNzc5NzUyMSAxNS42ODkzMDIyLDIzLjM0NjE1NjQgTDIxLjM0MzE0NTgsMjkgTDE1LjY4OTMwMjIsMzQuNjUzODQzNiBDMTQuMTIyODk3OSwzNi4yMjAyNDc5IDE0LjEyNDE5NDMsMzguNzUxNjExMyAxNS42ODYyOTE1LDQwLjMxMzcwODUgQzE3LjI0NTIxMDEsNDEuODcyNjI3MSAxOS43ODIzOTY1LDQxLjg3NDQ1NzggMjEuMzQ2MTU2NCw0MC4zMTA2OTc4IEwyNywzNC42NTY4NTQyIEwzMi42NTM4NDM2LDQwLjMxMDY5NzggQzM0LjIxNzYwMzUsNDEuODc0NDU3OCAzNi43NTQ3ODk5LDQxLjg3MjYyNzEgMzguMzEzNzA4NSw0MC4zMTM3MDg1IEMzOS44NzU4MDU3LDM4Ljc1MTYxMTMgMzkuODc3MTAyMSwzNi4yMjAyNDc5IDM4LjMxMDY5NzgsMzQuNjUzODQzNiBMMzIuNjU2ODU0MiwyOSBaIE0yNyw1MyBDNDEuMzU5NDAzNSw1MyA1Myw0MS4zNTk0MDM1IDUzLDI3IEM1MywxMi42NDA1OTY1IDQxLjM1OTQwMzUsMSAyNywxIEMxMi42NDA1OTY1LDEgMSwxMi42NDA1OTY1IDEsMjcgQzEsNDEuMzU5NDAzNSAxMi42NDA1OTY1LDUzIDI3LDUzIFpcXFwiPjwvcGF0aD5cXG4gICAgICAgIDwvZz5cXG4gICAgICA8L2c+XFxuICAgIDwvc3ZnPlxcbiAgPC9kaXY+XFxuPC9kaXY+XCIsXG4gICAgICAgIC8vIEVORCBPUFRJT05TXG4gICAgICAgIC8vIChSZXF1aXJlZCBieSB0aGUgZHJvcHpvbmUgZG9jdW1lbnRhdGlvbiBwYXJzZXIpXG5cbiAgICAgICAgLypcbiAgICAgICAgIFRob3NlIGZ1bmN0aW9ucyByZWdpc3RlciB0aGVtc2VsdmVzIHRvIHRoZSBldmVudHMgb24gaW5pdCBhbmQgaGFuZGxlIGFsbFxuICAgICAgICAgdGhlIHVzZXIgaW50ZXJmYWNlIHNwZWNpZmljIHN0dWZmLiBPdmVyd3JpdGluZyB0aGVtIHdvbid0IGJyZWFrIHRoZSB1cGxvYWRcbiAgICAgICAgIGJ1dCBjYW4gYnJlYWsgdGhlIHdheSBpdCdzIGRpc3BsYXllZC5cbiAgICAgICAgIFlvdSBjYW4gb3ZlcndyaXRlIHRoZW0gaWYgeW91IGRvbid0IGxpa2UgdGhlIGRlZmF1bHQgYmVoYXZpb3IuIElmIHlvdSBqdXN0XG4gICAgICAgICB3YW50IHRvIGFkZCBhbiBhZGRpdGlvbmFsIGV2ZW50IGhhbmRsZXIsIHJlZ2lzdGVyIGl0IG9uIHRoZSBkcm9wem9uZSBvYmplY3RcbiAgICAgICAgIGFuZCBkb24ndCBvdmVyd3JpdGUgdGhvc2Ugb3B0aW9ucy5cbiAgICAgICAgICovXG4gICAgICAgIC8vIFRob3NlIGFyZSBzZWxmIGV4cGxhbmF0b3J5IGFuZCBzaW1wbHkgY29uY2VybiB0aGUgRHJhZ25Ecm9wLlxuICAgICAgICBkcm9wOiBmdW5jdGlvbiBkcm9wKGUpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoXCJkei1kcmFnLWhvdmVyXCIpO1xuICAgICAgICB9LFxuICAgICAgICBkcmFnc3RhcnQ6IGZ1bmN0aW9uIGRyYWdzdGFydChlKSB7fSxcbiAgICAgICAgZHJhZ2VuZDogZnVuY3Rpb24gZHJhZ2VuZChlKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKFwiZHotZHJhZy1ob3ZlclwiKTtcbiAgICAgICAgfSxcbiAgICAgICAgZHJhZ2VudGVyOiBmdW5jdGlvbiBkcmFnZW50ZXIoZSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZChcImR6LWRyYWctaG92ZXJcIik7XG4gICAgICAgIH0sXG4gICAgICAgIGRyYWdvdmVyOiBmdW5jdGlvbiBkcmFnb3ZlcihlKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiZHotZHJhZy1ob3ZlclwiKTtcbiAgICAgICAgfSxcbiAgICAgICAgZHJhZ2xlYXZlOiBmdW5jdGlvbiBkcmFnbGVhdmUoZSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShcImR6LWRyYWctaG92ZXJcIik7XG4gICAgICAgIH0sXG4gICAgICAgIHBhc3RlOiBmdW5jdGlvbiBwYXN0ZShlKSB7fSxcbiAgICAgICAgLy8gQ2FsbGVkIHdoZW5ldmVyIHRoZXJlIGFyZSBubyBmaWxlcyBsZWZ0IGluIHRoZSBkcm9wem9uZSBhbnltb3JlLCBhbmQgdGhlXG4gICAgICAgIC8vIGRyb3B6b25lIHNob3VsZCBiZSBkaXNwbGF5ZWQgYXMgaWYgaW4gdGhlIGluaXRpYWwgc3RhdGUuXG4gICAgICAgIHJlc2V0OiBmdW5jdGlvbiByZXNldCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoXCJkei1zdGFydGVkXCIpO1xuICAgICAgICB9LFxuICAgICAgICAvLyBDYWxsZWQgd2hlbiBhIGZpbGUgaXMgYWRkZWQgdG8gdGhlIHF1ZXVlXG4gICAgICAgIC8vIFJlY2VpdmVzIGBmaWxlYFxuICAgICAgICBhZGRlZGZpbGU6IGZ1bmN0aW9uIGFkZGVkZmlsZShmaWxlKSB7XG4gICAgICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgICAgICBpZiAodGhpcy5lbGVtZW50ID09PSB0aGlzLnByZXZpZXdzQ29udGFpbmVyKSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZChcImR6LXN0YXJ0ZWRcIik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRoaXMucHJldmlld3NDb250YWluZXIpIHtcbiAgICAgICAgICAgIGZpbGUucHJldmlld0VsZW1lbnQgPSBEcm9wem9uZS5jcmVhdGVFbGVtZW50KHRoaXMub3B0aW9ucy5wcmV2aWV3VGVtcGxhdGUudHJpbSgpKTtcbiAgICAgICAgICAgIGZpbGUucHJldmlld1RlbXBsYXRlID0gZmlsZS5wcmV2aWV3RWxlbWVudDsgLy8gQmFja3dhcmRzIGNvbXBhdGliaWxpdHlcblxuICAgICAgICAgICAgdGhpcy5wcmV2aWV3c0NvbnRhaW5lci5hcHBlbmRDaGlsZChmaWxlLnByZXZpZXdFbGVtZW50KTtcblxuICAgICAgICAgICAgdmFyIF9pdGVyYXRvcjMgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihmaWxlLnByZXZpZXdFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbZGF0YS1kei1uYW1lXVwiKSksXG4gICAgICAgICAgICAgICAgX3N0ZXAzO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBmb3IgKF9pdGVyYXRvcjMucygpOyAhKF9zdGVwMyA9IF9pdGVyYXRvcjMubigpKS5kb25lOykge1xuICAgICAgICAgICAgICAgIHZhciBub2RlID0gX3N0ZXAzLnZhbHVlO1xuICAgICAgICAgICAgICAgIG5vZGUudGV4dENvbnRlbnQgPSBmaWxlLm5hbWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICBfaXRlcmF0b3IzLmUoZXJyKTtcbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgIF9pdGVyYXRvcjMuZigpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgX2l0ZXJhdG9yNCA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGZpbGUucHJldmlld0VsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltkYXRhLWR6LXNpemVdXCIpKSxcbiAgICAgICAgICAgICAgICBfc3RlcDQ7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGZvciAoX2l0ZXJhdG9yNC5zKCk7ICEoX3N0ZXA0ID0gX2l0ZXJhdG9yNC5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgICAgICAgbm9kZSA9IF9zdGVwNC52YWx1ZTtcbiAgICAgICAgICAgICAgICBub2RlLmlubmVySFRNTCA9IHRoaXMuZmlsZXNpemUoZmlsZS5zaXplKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgIF9pdGVyYXRvcjQuZShlcnIpO1xuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgX2l0ZXJhdG9yNC5mKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYWRkUmVtb3ZlTGlua3MpIHtcbiAgICAgICAgICAgICAgZmlsZS5fcmVtb3ZlTGluayA9IERyb3B6b25lLmNyZWF0ZUVsZW1lbnQoXCI8YSBjbGFzcz1cXFwiZHotcmVtb3ZlXFxcIiBocmVmPVxcXCJqYXZhc2NyaXB0OnVuZGVmaW5lZDtcXFwiIGRhdGEtZHotcmVtb3ZlPlwiLmNvbmNhdCh0aGlzLm9wdGlvbnMuZGljdFJlbW92ZUZpbGUsIFwiPC9hPlwiKSk7XG4gICAgICAgICAgICAgIGZpbGUucHJldmlld0VsZW1lbnQuYXBwZW5kQ2hpbGQoZmlsZS5fcmVtb3ZlTGluayk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciByZW1vdmVGaWxlRXZlbnQgPSBmdW5jdGlvbiByZW1vdmVGaWxlRXZlbnQoZSkge1xuICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgICAgICAgaWYgKGZpbGUuc3RhdHVzID09PSBEcm9wem9uZS5VUExPQURJTkcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRHJvcHpvbmUuY29uZmlybShfdGhpczIub3B0aW9ucy5kaWN0Q2FuY2VsVXBsb2FkQ29uZmlybWF0aW9uLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMyLnJlbW92ZUZpbGUoZmlsZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKF90aGlzMi5vcHRpb25zLmRpY3RSZW1vdmVGaWxlQ29uZmlybWF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gRHJvcHpvbmUuY29uZmlybShfdGhpczIub3B0aW9ucy5kaWN0UmVtb3ZlRmlsZUNvbmZpcm1hdGlvbiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMyLnJlbW92ZUZpbGUoZmlsZSk7XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMi5yZW1vdmVGaWxlKGZpbGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdmFyIF9pdGVyYXRvcjUgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihmaWxlLnByZXZpZXdFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbZGF0YS1kei1yZW1vdmVdXCIpKSxcbiAgICAgICAgICAgICAgICBfc3RlcDU7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGZvciAoX2l0ZXJhdG9yNS5zKCk7ICEoX3N0ZXA1ID0gX2l0ZXJhdG9yNS5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlbW92ZUxpbmsgPSBfc3RlcDUudmFsdWU7XG4gICAgICAgICAgICAgICAgcmVtb3ZlTGluay5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgcmVtb3ZlRmlsZUV2ZW50KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgIF9pdGVyYXRvcjUuZShlcnIpO1xuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgX2l0ZXJhdG9yNS5mKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAvLyBDYWxsZWQgd2hlbmV2ZXIgYSBmaWxlIGlzIHJlbW92ZWQuXG4gICAgICAgIHJlbW92ZWRmaWxlOiBmdW5jdGlvbiByZW1vdmVkZmlsZShmaWxlKSB7XG4gICAgICAgICAgaWYgKGZpbGUucHJldmlld0VsZW1lbnQgIT0gbnVsbCAmJiBmaWxlLnByZXZpZXdFbGVtZW50LnBhcmVudE5vZGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgZmlsZS5wcmV2aWV3RWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGZpbGUucHJldmlld0VsZW1lbnQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB0aGlzLl91cGRhdGVNYXhGaWxlc1JlYWNoZWRDbGFzcygpO1xuICAgICAgICB9LFxuICAgICAgICAvLyBDYWxsZWQgd2hlbiBhIHRodW1ibmFpbCBoYXMgYmVlbiBnZW5lcmF0ZWRcbiAgICAgICAgLy8gUmVjZWl2ZXMgYGZpbGVgIGFuZCBgZGF0YVVybGBcbiAgICAgICAgdGh1bWJuYWlsOiBmdW5jdGlvbiB0aHVtYm5haWwoZmlsZSwgZGF0YVVybCkge1xuICAgICAgICAgIGlmIChmaWxlLnByZXZpZXdFbGVtZW50KSB7XG4gICAgICAgICAgICBmaWxlLnByZXZpZXdFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoXCJkei1maWxlLXByZXZpZXdcIik7XG5cbiAgICAgICAgICAgIHZhciBfaXRlcmF0b3I2ID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoZmlsZS5wcmV2aWV3RWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2RhdGEtZHotdGh1bWJuYWlsXVwiKSksXG4gICAgICAgICAgICAgICAgX3N0ZXA2O1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBmb3IgKF9pdGVyYXRvcjYucygpOyAhKF9zdGVwNiA9IF9pdGVyYXRvcjYubigpKS5kb25lOykge1xuICAgICAgICAgICAgICAgIHZhciB0aHVtYm5haWxFbGVtZW50ID0gX3N0ZXA2LnZhbHVlO1xuICAgICAgICAgICAgICAgIHRodW1ibmFpbEVsZW1lbnQuYWx0ID0gZmlsZS5uYW1lO1xuICAgICAgICAgICAgICAgIHRodW1ibmFpbEVsZW1lbnQuc3JjID0gZGF0YVVybDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgIF9pdGVyYXRvcjYuZShlcnIpO1xuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgX2l0ZXJhdG9yNi5mKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZpbGUucHJldmlld0VsZW1lbnQuY2xhc3NMaXN0LmFkZChcImR6LWltYWdlLXByZXZpZXdcIik7XG4gICAgICAgICAgICB9LCAxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIC8vIENhbGxlZCB3aGVuZXZlciBhbiBlcnJvciBvY2N1cnNcbiAgICAgICAgLy8gUmVjZWl2ZXMgYGZpbGVgIGFuZCBgbWVzc2FnZWBcbiAgICAgICAgZXJyb3I6IGZ1bmN0aW9uIGVycm9yKGZpbGUsIG1lc3NhZ2UpIHtcbiAgICAgICAgICBpZiAoZmlsZS5wcmV2aWV3RWxlbWVudCkge1xuICAgICAgICAgICAgZmlsZS5wcmV2aWV3RWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiZHotZXJyb3JcIik7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgbWVzc2FnZSAhPT0gXCJzdHJpbmdcIiAmJiBtZXNzYWdlLmVycm9yKSB7XG4gICAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlLmVycm9yO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgX2l0ZXJhdG9yNyA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGZpbGUucHJldmlld0VsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltkYXRhLWR6LWVycm9ybWVzc2FnZV1cIikpLFxuICAgICAgICAgICAgICAgIF9zdGVwNztcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgZm9yIChfaXRlcmF0b3I3LnMoKTsgIShfc3RlcDcgPSBfaXRlcmF0b3I3Lm4oKSkuZG9uZTspIHtcbiAgICAgICAgICAgICAgICB2YXIgbm9kZSA9IF9zdGVwNy52YWx1ZTtcbiAgICAgICAgICAgICAgICBub2RlLnRleHRDb250ZW50ID0gbWVzc2FnZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgIF9pdGVyYXRvcjcuZShlcnIpO1xuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgX2l0ZXJhdG9yNy5mKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcm11bHRpcGxlOiBmdW5jdGlvbiBlcnJvcm11bHRpcGxlKCkge30sXG4gICAgICAgIC8vIENhbGxlZCB3aGVuIGEgZmlsZSBnZXRzIHByb2Nlc3NlZC4gU2luY2UgdGhlcmUgaXMgYSBjdWUsIG5vdCBhbGwgYWRkZWRcbiAgICAgICAgLy8gZmlsZXMgYXJlIHByb2Nlc3NlZCBpbW1lZGlhdGVseS5cbiAgICAgICAgLy8gUmVjZWl2ZXMgYGZpbGVgXG4gICAgICAgIHByb2Nlc3Npbmc6IGZ1bmN0aW9uIHByb2Nlc3NpbmcoZmlsZSkge1xuICAgICAgICAgIGlmIChmaWxlLnByZXZpZXdFbGVtZW50KSB7XG4gICAgICAgICAgICBmaWxlLnByZXZpZXdFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJkei1wcm9jZXNzaW5nXCIpO1xuXG4gICAgICAgICAgICBpZiAoZmlsZS5fcmVtb3ZlTGluaykge1xuICAgICAgICAgICAgICByZXR1cm4gZmlsZS5fcmVtb3ZlTGluay5pbm5lckhUTUwgPSB0aGlzLm9wdGlvbnMuZGljdENhbmNlbFVwbG9hZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHByb2Nlc3NpbmdtdWx0aXBsZTogZnVuY3Rpb24gcHJvY2Vzc2luZ211bHRpcGxlKCkge30sXG4gICAgICAgIC8vIENhbGxlZCB3aGVuZXZlciB0aGUgdXBsb2FkIHByb2dyZXNzIGdldHMgdXBkYXRlZC5cbiAgICAgICAgLy8gUmVjZWl2ZXMgYGZpbGVgLCBgcHJvZ3Jlc3NgIChwZXJjZW50YWdlIDAtMTAwKSBhbmQgYGJ5dGVzU2VudGAuXG4gICAgICAgIC8vIFRvIGdldCB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIG9mIHRoZSBmaWxlLCB1c2UgYGZpbGUuc2l6ZWBcbiAgICAgICAgdXBsb2FkcHJvZ3Jlc3M6IGZ1bmN0aW9uIHVwbG9hZHByb2dyZXNzKGZpbGUsIHByb2dyZXNzLCBieXRlc1NlbnQpIHtcbiAgICAgICAgICBpZiAoZmlsZS5wcmV2aWV3RWxlbWVudCkge1xuICAgICAgICAgICAgdmFyIF9pdGVyYXRvcjggPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihmaWxlLnByZXZpZXdFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbZGF0YS1kei11cGxvYWRwcm9ncmVzc11cIikpLFxuICAgICAgICAgICAgICAgIF9zdGVwODtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgZm9yIChfaXRlcmF0b3I4LnMoKTsgIShfc3RlcDggPSBfaXRlcmF0b3I4Lm4oKSkuZG9uZTspIHtcbiAgICAgICAgICAgICAgICB2YXIgbm9kZSA9IF9zdGVwOC52YWx1ZTtcbiAgICAgICAgICAgICAgICBub2RlLm5vZGVOYW1lID09PSAnUFJPR1JFU1MnID8gbm9kZS52YWx1ZSA9IHByb2dyZXNzIDogbm9kZS5zdHlsZS53aWR0aCA9IFwiXCIuY29uY2F0KHByb2dyZXNzLCBcIiVcIik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICBfaXRlcmF0b3I4LmUoZXJyKTtcbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgIF9pdGVyYXRvcjguZigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgLy8gQ2FsbGVkIHdoZW5ldmVyIHRoZSB0b3RhbCB1cGxvYWQgcHJvZ3Jlc3MgZ2V0cyB1cGRhdGVkLlxuICAgICAgICAvLyBDYWxsZWQgd2l0aCB0b3RhbFVwbG9hZFByb2dyZXNzICgwLTEwMCksIHRvdGFsQnl0ZXMgYW5kIHRvdGFsQnl0ZXNTZW50XG4gICAgICAgIHRvdGFsdXBsb2FkcHJvZ3Jlc3M6IGZ1bmN0aW9uIHRvdGFsdXBsb2FkcHJvZ3Jlc3MoKSB7fSxcbiAgICAgICAgLy8gQ2FsbGVkIGp1c3QgYmVmb3JlIHRoZSBmaWxlIGlzIHNlbnQuIEdldHMgdGhlIGB4aHJgIG9iamVjdCBhcyBzZWNvbmRcbiAgICAgICAgLy8gcGFyYW1ldGVyLCBzbyB5b3UgY2FuIG1vZGlmeSBpdCAoZm9yIGV4YW1wbGUgdG8gYWRkIGEgQ1NSRiB0b2tlbikgYW5kIGFcbiAgICAgICAgLy8gYGZvcm1EYXRhYCBvYmplY3QgdG8gYWRkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uXG4gICAgICAgIHNlbmRpbmc6IGZ1bmN0aW9uIHNlbmRpbmcoKSB7fSxcbiAgICAgICAgc2VuZGluZ211bHRpcGxlOiBmdW5jdGlvbiBzZW5kaW5nbXVsdGlwbGUoKSB7fSxcbiAgICAgICAgLy8gV2hlbiB0aGUgY29tcGxldGUgdXBsb2FkIGlzIGZpbmlzaGVkIGFuZCBzdWNjZXNzZnVsXG4gICAgICAgIC8vIFJlY2VpdmVzIGBmaWxlYFxuICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiBzdWNjZXNzKGZpbGUpIHtcbiAgICAgICAgICBpZiAoZmlsZS5wcmV2aWV3RWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGZpbGUucHJldmlld0VsZW1lbnQuY2xhc3NMaXN0LmFkZChcImR6LXN1Y2Nlc3NcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBzdWNjZXNzbXVsdGlwbGU6IGZ1bmN0aW9uIHN1Y2Nlc3NtdWx0aXBsZSgpIHt9LFxuICAgICAgICAvLyBXaGVuIHRoZSB1cGxvYWQgaXMgY2FuY2VsZWQuXG4gICAgICAgIGNhbmNlbGVkOiBmdW5jdGlvbiBjYW5jZWxlZChmaWxlKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZW1pdChcImVycm9yXCIsIGZpbGUsIHRoaXMub3B0aW9ucy5kaWN0VXBsb2FkQ2FuY2VsZWQpO1xuICAgICAgICB9LFxuICAgICAgICBjYW5jZWxlZG11bHRpcGxlOiBmdW5jdGlvbiBjYW5jZWxlZG11bHRpcGxlKCkge30sXG4gICAgICAgIC8vIFdoZW4gdGhlIHVwbG9hZCBpcyBmaW5pc2hlZCwgZWl0aGVyIHdpdGggc3VjY2VzcyBvciBhbiBlcnJvci5cbiAgICAgICAgLy8gUmVjZWl2ZXMgYGZpbGVgXG4gICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbiBjb21wbGV0ZShmaWxlKSB7XG4gICAgICAgICAgaWYgKGZpbGUuX3JlbW92ZUxpbmspIHtcbiAgICAgICAgICAgIGZpbGUuX3JlbW92ZUxpbmsuaW5uZXJIVE1MID0gdGhpcy5vcHRpb25zLmRpY3RSZW1vdmVGaWxlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChmaWxlLnByZXZpZXdFbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZmlsZS5wcmV2aWV3RWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiZHotY29tcGxldGVcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjb21wbGV0ZW11bHRpcGxlOiBmdW5jdGlvbiBjb21wbGV0ZW11bHRpcGxlKCkge30sXG4gICAgICAgIG1heGZpbGVzZXhjZWVkZWQ6IGZ1bmN0aW9uIG1heGZpbGVzZXhjZWVkZWQoKSB7fSxcbiAgICAgICAgbWF4ZmlsZXNyZWFjaGVkOiBmdW5jdGlvbiBtYXhmaWxlc3JlYWNoZWQoKSB7fSxcbiAgICAgICAgcXVldWVjb21wbGV0ZTogZnVuY3Rpb24gcXVldWVjb21wbGV0ZSgpIHt9LFxuICAgICAgICBhZGRlZGZpbGVzOiBmdW5jdGlvbiBhZGRlZGZpbGVzKCkge31cbiAgICAgIH07XG4gICAgICB0aGlzLnByb3RvdHlwZS5fdGh1bWJuYWlsUXVldWUgPSBbXTtcbiAgICAgIHRoaXMucHJvdG90eXBlLl9wcm9jZXNzaW5nVGh1bWJuYWlsID0gZmFsc2U7XG4gICAgfSAvLyBnbG9iYWwgdXRpbGl0eVxuXG4gIH0sIHtcbiAgICBrZXk6IFwiZXh0ZW5kXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGV4dGVuZCh0YXJnZXQpIHtcbiAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgb2JqZWN0cyA9IG5ldyBBcnJheShfbGVuMiA+IDEgPyBfbGVuMiAtIDEgOiAwKSwgX2tleTIgPSAxOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgIG9iamVjdHNbX2tleTIgLSAxXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIF9pID0gMCwgX29iamVjdHMgPSBvYmplY3RzOyBfaSA8IF9vYmplY3RzLmxlbmd0aDsgX2krKykge1xuICAgICAgICB2YXIgb2JqZWN0ID0gX29iamVjdHNbX2ldO1xuXG4gICAgICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgICB2YXIgdmFsID0gb2JqZWN0W2tleV07XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSB2YWw7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG4gIH1dKTtcblxuICBmdW5jdGlvbiBEcm9wem9uZShlbCwgb3B0aW9ucykge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBEcm9wem9uZSk7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpO1xuICAgIHZhciBmYWxsYmFjaywgbGVmdDtcbiAgICBfdGhpcy5lbGVtZW50ID0gZWw7IC8vIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBzaW5jZSB0aGUgdmVyc2lvbiB3YXMgaW4gdGhlIHByb3RvdHlwZSBwcmV2aW91c2x5XG5cbiAgICBfdGhpcy52ZXJzaW9uID0gRHJvcHpvbmUudmVyc2lvbjtcbiAgICBfdGhpcy5kZWZhdWx0T3B0aW9ucy5wcmV2aWV3VGVtcGxhdGUgPSBfdGhpcy5kZWZhdWx0T3B0aW9ucy5wcmV2aWV3VGVtcGxhdGUucmVwbGFjZSgvXFxuKi9nLCBcIlwiKTtcbiAgICBfdGhpcy5jbGlja2FibGVFbGVtZW50cyA9IFtdO1xuICAgIF90aGlzLmxpc3RlbmVycyA9IFtdO1xuICAgIF90aGlzLmZpbGVzID0gW107IC8vIEFsbCBmaWxlc1xuXG4gICAgaWYgKHR5cGVvZiBfdGhpcy5lbGVtZW50ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBfdGhpcy5lbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihfdGhpcy5lbGVtZW50KTtcbiAgICB9IC8vIE5vdCBjaGVja2luZyBpZiBpbnN0YW5jZSBvZiBIVE1MRWxlbWVudCBvciBFbGVtZW50IHNpbmNlIElFOSBpcyBleHRyZW1lbHkgd2VpcmQuXG5cblxuICAgIGlmICghX3RoaXMuZWxlbWVudCB8fCBfdGhpcy5lbGVtZW50Lm5vZGVUeXBlID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgZHJvcHpvbmUgZWxlbWVudC5cIik7XG4gICAgfVxuXG4gICAgaWYgKF90aGlzLmVsZW1lbnQuZHJvcHpvbmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkRyb3B6b25lIGFscmVhZHkgYXR0YWNoZWQuXCIpO1xuICAgIH0gLy8gTm93IGFkZCB0aGlzIGRyb3B6b25lIHRvIHRoZSBpbnN0YW5jZXMuXG5cblxuICAgIERyb3B6b25lLmluc3RhbmNlcy5wdXNoKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKTsgLy8gUHV0IHRoZSBkcm9wem9uZSBpbnNpZGUgdGhlIGVsZW1lbnQgaXRzZWxmLlxuXG4gICAgX3RoaXMuZWxlbWVudC5kcm9wem9uZSA9IF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpO1xuICAgIHZhciBlbGVtZW50T3B0aW9ucyA9IChsZWZ0ID0gRHJvcHpvbmUub3B0aW9uc0ZvckVsZW1lbnQoX3RoaXMuZWxlbWVudCkpICE9IG51bGwgPyBsZWZ0IDoge307XG4gICAgX3RoaXMub3B0aW9ucyA9IERyb3B6b25lLmV4dGVuZCh7fSwgX3RoaXMuZGVmYXVsdE9wdGlvbnMsIGVsZW1lbnRPcHRpb25zLCBvcHRpb25zICE9IG51bGwgPyBvcHRpb25zIDoge30pOyAvLyBJZiB0aGUgYnJvd3NlciBmYWlsZWQsIGp1c3QgY2FsbCB0aGUgZmFsbGJhY2sgYW5kIGxlYXZlXG5cbiAgICBpZiAoX3RoaXMub3B0aW9ucy5mb3JjZUZhbGxiYWNrIHx8ICFEcm9wem9uZS5pc0Jyb3dzZXJTdXBwb3J0ZWQoKSkge1xuICAgICAgcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKF90aGlzLCBfdGhpcy5vcHRpb25zLmZhbGxiYWNrLmNhbGwoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpKTtcbiAgICB9IC8vIEBvcHRpb25zLnVybCA9IEBlbGVtZW50LmdldEF0dHJpYnV0ZSBcImFjdGlvblwiIHVubGVzcyBAb3B0aW9ucy51cmw/XG5cblxuICAgIGlmIChfdGhpcy5vcHRpb25zLnVybCA9PSBudWxsKSB7XG4gICAgICBfdGhpcy5vcHRpb25zLnVybCA9IF90aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiYWN0aW9uXCIpO1xuICAgIH1cblxuICAgIGlmICghX3RoaXMub3B0aW9ucy51cmwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIFVSTCBwcm92aWRlZC5cIik7XG4gICAgfVxuXG4gICAgaWYgKF90aGlzLm9wdGlvbnMuYWNjZXB0ZWRGaWxlcyAmJiBfdGhpcy5vcHRpb25zLmFjY2VwdGVkTWltZVR5cGVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJZb3UgY2FuJ3QgcHJvdmlkZSBib3RoICdhY2NlcHRlZEZpbGVzJyBhbmQgJ2FjY2VwdGVkTWltZVR5cGVzJy4gJ2FjY2VwdGVkTWltZVR5cGVzJyBpcyBkZXByZWNhdGVkLlwiKTtcbiAgICB9XG5cbiAgICBpZiAoX3RoaXMub3B0aW9ucy51cGxvYWRNdWx0aXBsZSAmJiBfdGhpcy5vcHRpb25zLmNodW5raW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBjYW5ub3Qgc2V0IGJvdGg6IHVwbG9hZE11bHRpcGxlIGFuZCBjaHVua2luZy4nKTtcbiAgICB9IC8vIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5cblxuICAgIGlmIChfdGhpcy5vcHRpb25zLmFjY2VwdGVkTWltZVR5cGVzKSB7XG4gICAgICBfdGhpcy5vcHRpb25zLmFjY2VwdGVkRmlsZXMgPSBfdGhpcy5vcHRpb25zLmFjY2VwdGVkTWltZVR5cGVzO1xuICAgICAgZGVsZXRlIF90aGlzLm9wdGlvbnMuYWNjZXB0ZWRNaW1lVHlwZXM7XG4gICAgfSAvLyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuXG5cbiAgICBpZiAoX3RoaXMub3B0aW9ucy5yZW5hbWVGaWxlbmFtZSAhPSBudWxsKSB7XG4gICAgICBfdGhpcy5vcHRpb25zLnJlbmFtZUZpbGUgPSBmdW5jdGlvbiAoZmlsZSkge1xuICAgICAgICByZXR1cm4gX3RoaXMub3B0aW9ucy5yZW5hbWVGaWxlbmFtZS5jYWxsKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBmaWxlLm5hbWUsIGZpbGUpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIF90aGlzLm9wdGlvbnMubWV0aG9kID09PSAnc3RyaW5nJykge1xuICAgICAgX3RoaXMub3B0aW9ucy5tZXRob2QgPSBfdGhpcy5vcHRpb25zLm1ldGhvZC50b1VwcGVyQ2FzZSgpO1xuICAgIH1cblxuICAgIGlmICgoZmFsbGJhY2sgPSBfdGhpcy5nZXRFeGlzdGluZ0ZhbGxiYWNrKCkpICYmIGZhbGxiYWNrLnBhcmVudE5vZGUpIHtcbiAgICAgIC8vIFJlbW92ZSB0aGUgZmFsbGJhY2tcbiAgICAgIGZhbGxiYWNrLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZmFsbGJhY2spO1xuICAgIH0gLy8gRGlzcGxheSBwcmV2aWV3cyBpbiB0aGUgcHJldmlld3NDb250YWluZXIgZWxlbWVudCBvciB0aGUgRHJvcHpvbmUgZWxlbWVudCB1bmxlc3MgZXhwbGljaXRseSBzZXQgdG8gZmFsc2VcblxuXG4gICAgaWYgKF90aGlzLm9wdGlvbnMucHJldmlld3NDb250YWluZXIgIT09IGZhbHNlKSB7XG4gICAgICBpZiAoX3RoaXMub3B0aW9ucy5wcmV2aWV3c0NvbnRhaW5lcikge1xuICAgICAgICBfdGhpcy5wcmV2aWV3c0NvbnRhaW5lciA9IERyb3B6b25lLmdldEVsZW1lbnQoX3RoaXMub3B0aW9ucy5wcmV2aWV3c0NvbnRhaW5lciwgXCJwcmV2aWV3c0NvbnRhaW5lclwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF90aGlzLnByZXZpZXdzQ29udGFpbmVyID0gX3RoaXMuZWxlbWVudDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoX3RoaXMub3B0aW9ucy5jbGlja2FibGUpIHtcbiAgICAgIGlmIChfdGhpcy5vcHRpb25zLmNsaWNrYWJsZSA9PT0gdHJ1ZSkge1xuICAgICAgICBfdGhpcy5jbGlja2FibGVFbGVtZW50cyA9IFtfdGhpcy5lbGVtZW50XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF90aGlzLmNsaWNrYWJsZUVsZW1lbnRzID0gRHJvcHpvbmUuZ2V0RWxlbWVudHMoX3RoaXMub3B0aW9ucy5jbGlja2FibGUsIFwiY2xpY2thYmxlXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIF90aGlzLmluaXQoKTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfSAvLyBSZXR1cm5zIGFsbCBmaWxlcyB0aGF0IGhhdmUgYmVlbiBhY2NlcHRlZFxuXG5cbiAgX2NyZWF0ZUNsYXNzKERyb3B6b25lLCBbe1xuICAgIGtleTogXCJnZXRBY2NlcHRlZEZpbGVzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEFjY2VwdGVkRmlsZXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWxlcy5maWx0ZXIoZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgICAgcmV0dXJuIGZpbGUuYWNjZXB0ZWQ7XG4gICAgICB9KS5tYXAoZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgICAgcmV0dXJuIGZpbGU7XG4gICAgICB9KTtcbiAgICB9IC8vIFJldHVybnMgYWxsIGZpbGVzIHRoYXQgaGF2ZSBiZWVuIHJlamVjdGVkXG4gICAgLy8gTm90IHN1cmUgd2hlbiB0aGF0J3MgZ29pbmcgdG8gYmUgdXNlZnVsLCBidXQgYWRkZWQgZm9yIGNvbXBsZXRlbmVzcy5cblxuICB9LCB7XG4gICAga2V5OiBcImdldFJlamVjdGVkRmlsZXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UmVqZWN0ZWRGaWxlcygpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbGVzLmZpbHRlcihmdW5jdGlvbiAoZmlsZSkge1xuICAgICAgICByZXR1cm4gIWZpbGUuYWNjZXB0ZWQ7XG4gICAgICB9KS5tYXAoZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgICAgcmV0dXJuIGZpbGU7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0RmlsZXNXaXRoU3RhdHVzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEZpbGVzV2l0aFN0YXR1cyhzdGF0dXMpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbGVzLmZpbHRlcihmdW5jdGlvbiAoZmlsZSkge1xuICAgICAgICByZXR1cm4gZmlsZS5zdGF0dXMgPT09IHN0YXR1cztcbiAgICAgIH0pLm1hcChmdW5jdGlvbiAoZmlsZSkge1xuICAgICAgICByZXR1cm4gZmlsZTtcbiAgICAgIH0pO1xuICAgIH0gLy8gUmV0dXJucyBhbGwgZmlsZXMgdGhhdCBhcmUgaW4gdGhlIHF1ZXVlXG5cbiAgfSwge1xuICAgIGtleTogXCJnZXRRdWV1ZWRGaWxlc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRRdWV1ZWRGaWxlcygpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEZpbGVzV2l0aFN0YXR1cyhEcm9wem9uZS5RVUVVRUQpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRVcGxvYWRpbmdGaWxlc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRVcGxvYWRpbmdGaWxlcygpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEZpbGVzV2l0aFN0YXR1cyhEcm9wem9uZS5VUExPQURJTkcpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRBZGRlZEZpbGVzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEFkZGVkRmlsZXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRGaWxlc1dpdGhTdGF0dXMoRHJvcHpvbmUuQURERUQpO1xuICAgIH0gLy8gRmlsZXMgdGhhdCBhcmUgZWl0aGVyIHF1ZXVlZCBvciB1cGxvYWRpbmdcblxuICB9LCB7XG4gICAga2V5OiBcImdldEFjdGl2ZUZpbGVzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEFjdGl2ZUZpbGVzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsZXMuZmlsdGVyKGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgICAgIHJldHVybiBmaWxlLnN0YXR1cyA9PT0gRHJvcHpvbmUuVVBMT0FESU5HIHx8IGZpbGUuc3RhdHVzID09PSBEcm9wem9uZS5RVUVVRUQ7XG4gICAgICB9KS5tYXAoZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgICAgcmV0dXJuIGZpbGU7XG4gICAgICB9KTtcbiAgICB9IC8vIFRoZSBmdW5jdGlvbiB0aGF0IGdldHMgY2FsbGVkIHdoZW4gRHJvcHpvbmUgaXMgaW5pdGlhbGl6ZWQuIFlvdVxuICAgIC8vIGNhbiAoYW5kIHNob3VsZCkgc2V0dXAgZXZlbnQgbGlzdGVuZXJzIGluc2lkZSB0aGlzIGZ1bmN0aW9uLlxuXG4gIH0sIHtcbiAgICBrZXk6IFwiaW5pdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIC8vIEluIGNhc2UgaXQgaXNuJ3Qgc2V0IGFscmVhZHlcbiAgICAgIGlmICh0aGlzLmVsZW1lbnQudGFnTmFtZSA9PT0gXCJmb3JtXCIpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZShcImVuY3R5cGVcIiwgXCJtdWx0aXBhcnQvZm9ybS1kYXRhXCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhcImRyb3B6b25lXCIpICYmICF0aGlzLmVsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5kei1tZXNzYWdlXCIpKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZChEcm9wem9uZS5jcmVhdGVFbGVtZW50KFwiPGRpdiBjbGFzcz1cXFwiZHotZGVmYXVsdCBkei1tZXNzYWdlXFxcIj48YnV0dG9uIGNsYXNzPVxcXCJkei1idXR0b25cXFwiIHR5cGU9XFxcImJ1dHRvblxcXCI+XCIuY29uY2F0KHRoaXMub3B0aW9ucy5kaWN0RGVmYXVsdE1lc3NhZ2UsIFwiPC9idXR0b24+PC9kaXY+XCIpKSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmNsaWNrYWJsZUVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICB2YXIgc2V0dXBIaWRkZW5GaWxlSW5wdXQgPSBmdW5jdGlvbiBzZXR1cEhpZGRlbkZpbGVJbnB1dCgpIHtcbiAgICAgICAgICBpZiAoX3RoaXMzLmhpZGRlbkZpbGVJbnB1dCkge1xuICAgICAgICAgICAgX3RoaXMzLmhpZGRlbkZpbGVJbnB1dC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKF90aGlzMy5oaWRkZW5GaWxlSW5wdXQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF90aGlzMy5oaWRkZW5GaWxlSW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG5cbiAgICAgICAgICBfdGhpczMuaGlkZGVuRmlsZUlucHV0LnNldEF0dHJpYnV0ZShcInR5cGVcIiwgXCJmaWxlXCIpO1xuXG4gICAgICAgICAgaWYgKF90aGlzMy5vcHRpb25zLm1heEZpbGVzID09PSBudWxsIHx8IF90aGlzMy5vcHRpb25zLm1heEZpbGVzID4gMSkge1xuICAgICAgICAgICAgX3RoaXMzLmhpZGRlbkZpbGVJbnB1dC5zZXRBdHRyaWJ1dGUoXCJtdWx0aXBsZVwiLCBcIm11bHRpcGxlXCIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF90aGlzMy5oaWRkZW5GaWxlSW5wdXQuY2xhc3NOYW1lID0gXCJkei1oaWRkZW4taW5wdXRcIjtcblxuICAgICAgICAgIGlmIChfdGhpczMub3B0aW9ucy5hY2NlcHRlZEZpbGVzICE9PSBudWxsKSB7XG4gICAgICAgICAgICBfdGhpczMuaGlkZGVuRmlsZUlucHV0LnNldEF0dHJpYnV0ZShcImFjY2VwdFwiLCBfdGhpczMub3B0aW9ucy5hY2NlcHRlZEZpbGVzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoX3RoaXMzLm9wdGlvbnMuY2FwdHVyZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgX3RoaXMzLmhpZGRlbkZpbGVJbnB1dC5zZXRBdHRyaWJ1dGUoXCJjYXB0dXJlXCIsIF90aGlzMy5vcHRpb25zLmNhcHR1cmUpO1xuICAgICAgICAgIH0gLy8gTm90IHNldHRpbmcgYGRpc3BsYXk9XCJub25lXCJgIGJlY2F1c2Ugc29tZSBicm93c2VycyBkb24ndCBhY2NlcHQgY2xpY2tzXG4gICAgICAgICAgLy8gb24gZWxlbWVudHMgdGhhdCBhcmVuJ3QgZGlzcGxheWVkLlxuXG5cbiAgICAgICAgICBfdGhpczMuaGlkZGVuRmlsZUlucHV0LnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xuICAgICAgICAgIF90aGlzMy5oaWRkZW5GaWxlSW5wdXQuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgICAgICAgX3RoaXMzLmhpZGRlbkZpbGVJbnB1dC5zdHlsZS50b3AgPSBcIjBcIjtcbiAgICAgICAgICBfdGhpczMuaGlkZGVuRmlsZUlucHV0LnN0eWxlLmxlZnQgPSBcIjBcIjtcbiAgICAgICAgICBfdGhpczMuaGlkZGVuRmlsZUlucHV0LnN0eWxlLmhlaWdodCA9IFwiMFwiO1xuICAgICAgICAgIF90aGlzMy5oaWRkZW5GaWxlSW5wdXQuc3R5bGUud2lkdGggPSBcIjBcIjtcbiAgICAgICAgICBEcm9wem9uZS5nZXRFbGVtZW50KF90aGlzMy5vcHRpb25zLmhpZGRlbklucHV0Q29udGFpbmVyLCAnaGlkZGVuSW5wdXRDb250YWluZXInKS5hcHBlbmRDaGlsZChfdGhpczMuaGlkZGVuRmlsZUlucHV0KTtcbiAgICAgICAgICByZXR1cm4gX3RoaXMzLmhpZGRlbkZpbGVJbnB1dC5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBmaWxlcyA9IF90aGlzMy5oaWRkZW5GaWxlSW5wdXQuZmlsZXM7XG5cbiAgICAgICAgICAgIGlmIChmaWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgdmFyIF9pdGVyYXRvcjkgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihmaWxlcyksXG4gICAgICAgICAgICAgICAgICBfc3RlcDk7XG5cbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmb3IgKF9pdGVyYXRvcjkucygpOyAhKF9zdGVwOSA9IF9pdGVyYXRvcjkubigpKS5kb25lOykge1xuICAgICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBfc3RlcDkudmFsdWU7XG5cbiAgICAgICAgICAgICAgICAgIF90aGlzMy5hZGRGaWxlKGZpbGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgX2l0ZXJhdG9yOS5lKGVycik7XG4gICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgX2l0ZXJhdG9yOS5mKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX3RoaXMzLmVtaXQoXCJhZGRlZGZpbGVzXCIsIGZpbGVzKTtcblxuICAgICAgICAgICAgcmV0dXJuIHNldHVwSGlkZGVuRmlsZUlucHV0KCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgc2V0dXBIaWRkZW5GaWxlSW5wdXQoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5VUkwgPSB3aW5kb3cuVVJMICE9PSBudWxsID8gd2luZG93LlVSTCA6IHdpbmRvdy53ZWJraXRVUkw7IC8vIFNldHVwIGFsbCBldmVudCBsaXN0ZW5lcnMgb24gdGhlIERyb3B6b25lIG9iamVjdCBpdHNlbGYuXG4gICAgICAvLyBUaGV5J3JlIG5vdCBpbiBAc2V0dXBFdmVudExpc3RlbmVycygpIGJlY2F1c2UgdGhleSBzaG91bGRuJ3QgYmUgcmVtb3ZlZFxuICAgICAgLy8gYWdhaW4gd2hlbiB0aGUgZHJvcHpvbmUgZ2V0cyBkaXNhYmxlZC5cblxuICAgICAgdmFyIF9pdGVyYXRvcjEwID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIodGhpcy5ldmVudHMpLFxuICAgICAgICAgIF9zdGVwMTA7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoX2l0ZXJhdG9yMTAucygpOyAhKF9zdGVwMTAgPSBfaXRlcmF0b3IxMC5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgdmFyIGV2ZW50TmFtZSA9IF9zdGVwMTAudmFsdWU7XG4gICAgICAgICAgdGhpcy5vbihldmVudE5hbWUsIHRoaXMub3B0aW9uc1tldmVudE5hbWVdKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9pdGVyYXRvcjEwLmUoZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIF9pdGVyYXRvcjEwLmYoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5vbihcInVwbG9hZHByb2dyZXNzXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMy51cGRhdGVUb3RhbFVwbG9hZFByb2dyZXNzKCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMub24oXCJyZW1vdmVkZmlsZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfdGhpczMudXBkYXRlVG90YWxVcGxvYWRQcm9ncmVzcygpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLm9uKFwiY2FuY2VsZWRcIiwgZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMy5lbWl0KFwiY29tcGxldGVcIiwgZmlsZSk7XG4gICAgICB9KTsgLy8gRW1pdCBhIGBxdWV1ZWNvbXBsZXRlYCBldmVudCBpZiBhbGwgZmlsZXMgZmluaXNoZWQgdXBsb2FkaW5nLlxuXG4gICAgICB0aGlzLm9uKFwiY29tcGxldGVcIiwgZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgICAgaWYgKF90aGlzMy5nZXRBZGRlZEZpbGVzKCkubGVuZ3RoID09PSAwICYmIF90aGlzMy5nZXRVcGxvYWRpbmdGaWxlcygpLmxlbmd0aCA9PT0gMCAmJiBfdGhpczMuZ2V0UXVldWVkRmlsZXMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAvLyBUaGlzIG5lZWRzIHRvIGJlIGRlZmVycmVkIHNvIHRoYXQgYHF1ZXVlY29tcGxldGVgIHJlYWxseSB0cmlnZ2VycyBhZnRlciBgY29tcGxldGVgXG4gICAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzMy5lbWl0KFwicXVldWVjb21wbGV0ZVwiKTtcbiAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHZhciBjb250YWluc0ZpbGVzID0gZnVuY3Rpb24gY29udGFpbnNGaWxlcyhlKSB7XG4gICAgICAgIGlmIChlLmRhdGFUcmFuc2Zlci50eXBlcykge1xuICAgICAgICAgIC8vIEJlY2F1c2UgZS5kYXRhVHJhbnNmZXIudHlwZXMgaXMgYW4gT2JqZWN0IGluXG4gICAgICAgICAgLy8gSUUsIHdlIG5lZWQgdG8gaXRlcmF0ZSBsaWtlIHRoaXMgaW5zdGVhZCBvZlxuICAgICAgICAgIC8vIHVzaW5nIGUuZGF0YVRyYW5zZmVyLnR5cGVzLnNvbWUoKVxuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZS5kYXRhVHJhbnNmZXIudHlwZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChlLmRhdGFUcmFuc2Zlci50eXBlc1tpXSA9PT0gXCJGaWxlc1wiKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9O1xuXG4gICAgICB2YXIgbm9Qcm9wYWdhdGlvbiA9IGZ1bmN0aW9uIG5vUHJvcGFnYXRpb24oZSkge1xuICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gZmlsZXMsIHdlIGRvbid0IHdhbnQgdG8gc3RvcFxuICAgICAgICAvLyBwcm9wYWdhdGlvbiBzbyB3ZSBkb24ndCBpbnRlcmZlcmUgd2l0aCBvdGhlclxuICAgICAgICAvLyBkcmFnIGFuZCBkcm9wIGJlaGF2aW91ci5cbiAgICAgICAgaWYgKCFjb250YWluc0ZpbGVzKGUpKSByZXR1cm47XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgaWYgKGUucHJldmVudERlZmF1bHQpIHtcbiAgICAgICAgICByZXR1cm4gZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBlLnJldHVyblZhbHVlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH07IC8vIENyZWF0ZSB0aGUgbGlzdGVuZXJzXG5cblxuICAgICAgdGhpcy5saXN0ZW5lcnMgPSBbe1xuICAgICAgICBlbGVtZW50OiB0aGlzLmVsZW1lbnQsXG4gICAgICAgIGV2ZW50czoge1xuICAgICAgICAgIFwiZHJhZ3N0YXJ0XCI6IGZ1bmN0aW9uIGRyYWdzdGFydChlKSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMzLmVtaXQoXCJkcmFnc3RhcnRcIiwgZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcImRyYWdlbnRlclwiOiBmdW5jdGlvbiBkcmFnZW50ZXIoZSkge1xuICAgICAgICAgICAgbm9Qcm9wYWdhdGlvbihlKTtcbiAgICAgICAgICAgIHJldHVybiBfdGhpczMuZW1pdChcImRyYWdlbnRlclwiLCBlKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiZHJhZ292ZXJcIjogZnVuY3Rpb24gZHJhZ292ZXIoZSkge1xuICAgICAgICAgICAgLy8gTWFrZXMgaXQgcG9zc2libGUgdG8gZHJhZyBmaWxlcyBmcm9tIGNocm9tZSdzIGRvd25sb2FkIGJhclxuICAgICAgICAgICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xOTUyNjQzMC9kcmFnLWFuZC1kcm9wLWZpbGUtdXBsb2Fkcy1mcm9tLWNocm9tZS1kb3dubG9hZHMtYmFyXG4gICAgICAgICAgICAvLyBUcnkgaXMgcmVxdWlyZWQgdG8gcHJldmVudCBidWcgaW4gSW50ZXJuZXQgRXhwbG9yZXIgMTEgKFNDUklQVDY1NTM1IGV4Y2VwdGlvbilcbiAgICAgICAgICAgIHZhciBlZmN0O1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBlZmN0ID0gZS5kYXRhVHJhbnNmZXIuZWZmZWN0QWxsb3dlZDtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7fVxuXG4gICAgICAgICAgICBlLmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gJ21vdmUnID09PSBlZmN0IHx8ICdsaW5rTW92ZScgPT09IGVmY3QgPyAnbW92ZScgOiAnY29weSc7XG4gICAgICAgICAgICBub1Byb3BhZ2F0aW9uKGUpO1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzMy5lbWl0KFwiZHJhZ292ZXJcIiwgZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcImRyYWdsZWF2ZVwiOiBmdW5jdGlvbiBkcmFnbGVhdmUoZSkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzMy5lbWl0KFwiZHJhZ2xlYXZlXCIsIGUpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJkcm9wXCI6IGZ1bmN0aW9uIGRyb3AoZSkge1xuICAgICAgICAgICAgbm9Qcm9wYWdhdGlvbihlKTtcbiAgICAgICAgICAgIHJldHVybiBfdGhpczMuZHJvcChlKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiZHJhZ2VuZFwiOiBmdW5jdGlvbiBkcmFnZW5kKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBfdGhpczMuZW1pdChcImRyYWdlbmRcIiwgZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIFRoaXMgaXMgZGlzYWJsZWQgcmlnaHQgbm93LCBiZWNhdXNlIHRoZSBicm93c2VycyBkb24ndCBpbXBsZW1lbnQgaXQgcHJvcGVybHkuXG4gICAgICAgIC8vIFwicGFzdGVcIjogKGUpID0+XG4gICAgICAgIC8vICAgbm9Qcm9wYWdhdGlvbiBlXG4gICAgICAgIC8vICAgQHBhc3RlIGVcblxuICAgICAgfV07XG4gICAgICB0aGlzLmNsaWNrYWJsZUVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGNsaWNrYWJsZUVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMy5saXN0ZW5lcnMucHVzaCh7XG4gICAgICAgICAgZWxlbWVudDogY2xpY2thYmxlRWxlbWVudCxcbiAgICAgICAgICBldmVudHM6IHtcbiAgICAgICAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24gY2xpY2soZXZ0KSB7XG4gICAgICAgICAgICAgIC8vIE9ubHkgdGhlIGFjdHVhbCBkcm9wem9uZSBvciB0aGUgbWVzc2FnZSBlbGVtZW50IHNob3VsZCB0cmlnZ2VyIGZpbGUgc2VsZWN0aW9uXG4gICAgICAgICAgICAgIGlmIChjbGlja2FibGVFbGVtZW50ICE9PSBfdGhpczMuZWxlbWVudCB8fCBldnQudGFyZ2V0ID09PSBfdGhpczMuZWxlbWVudCB8fCBEcm9wem9uZS5lbGVtZW50SW5zaWRlKGV2dC50YXJnZXQsIF90aGlzMy5lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuZHotbWVzc2FnZVwiKSkpIHtcbiAgICAgICAgICAgICAgICBfdGhpczMuaGlkZGVuRmlsZUlucHV0LmNsaWNrKCk7IC8vIEZvcndhcmQgdGhlIGNsaWNrXG5cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZW5hYmxlKCk7XG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmluaXQuY2FsbCh0aGlzKTtcbiAgICB9IC8vIE5vdCBmdWxseSB0ZXN0ZWQgeWV0XG5cbiAgfSwge1xuICAgIGtleTogXCJkZXN0cm95XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICB0aGlzLmRpc2FibGUoKTtcbiAgICAgIHRoaXMucmVtb3ZlQWxsRmlsZXModHJ1ZSk7XG5cbiAgICAgIGlmICh0aGlzLmhpZGRlbkZpbGVJbnB1dCAhPSBudWxsID8gdGhpcy5oaWRkZW5GaWxlSW5wdXQucGFyZW50Tm9kZSA6IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmhpZGRlbkZpbGVJbnB1dC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuaGlkZGVuRmlsZUlucHV0KTtcbiAgICAgICAgdGhpcy5oaWRkZW5GaWxlSW5wdXQgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBkZWxldGUgdGhpcy5lbGVtZW50LmRyb3B6b25lO1xuICAgICAgcmV0dXJuIERyb3B6b25lLmluc3RhbmNlcy5zcGxpY2UoRHJvcHpvbmUuaW5zdGFuY2VzLmluZGV4T2YodGhpcyksIDEpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ1cGRhdGVUb3RhbFVwbG9hZFByb2dyZXNzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVwZGF0ZVRvdGFsVXBsb2FkUHJvZ3Jlc3MoKSB7XG4gICAgICB2YXIgdG90YWxVcGxvYWRQcm9ncmVzcztcbiAgICAgIHZhciB0b3RhbEJ5dGVzU2VudCA9IDA7XG4gICAgICB2YXIgdG90YWxCeXRlcyA9IDA7XG4gICAgICB2YXIgYWN0aXZlRmlsZXMgPSB0aGlzLmdldEFjdGl2ZUZpbGVzKCk7XG5cbiAgICAgIGlmIChhY3RpdmVGaWxlcy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIF9pdGVyYXRvcjExID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIodGhpcy5nZXRBY3RpdmVGaWxlcygpKSxcbiAgICAgICAgICAgIF9zdGVwMTE7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmb3IgKF9pdGVyYXRvcjExLnMoKTsgIShfc3RlcDExID0gX2l0ZXJhdG9yMTEubigpKS5kb25lOykge1xuICAgICAgICAgICAgdmFyIGZpbGUgPSBfc3RlcDExLnZhbHVlO1xuICAgICAgICAgICAgdG90YWxCeXRlc1NlbnQgKz0gZmlsZS51cGxvYWQuYnl0ZXNTZW50O1xuICAgICAgICAgICAgdG90YWxCeXRlcyArPSBmaWxlLnVwbG9hZC50b3RhbDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIF9pdGVyYXRvcjExLmUoZXJyKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBfaXRlcmF0b3IxMS5mKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0b3RhbFVwbG9hZFByb2dyZXNzID0gMTAwICogdG90YWxCeXRlc1NlbnQgLyB0b3RhbEJ5dGVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdG90YWxVcGxvYWRQcm9ncmVzcyA9IDEwMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuZW1pdChcInRvdGFsdXBsb2FkcHJvZ3Jlc3NcIiwgdG90YWxVcGxvYWRQcm9ncmVzcywgdG90YWxCeXRlcywgdG90YWxCeXRlc1NlbnQpO1xuICAgIH0gLy8gQG9wdGlvbnMucGFyYW1OYW1lIGNhbiBiZSBhIGZ1bmN0aW9uIHRha2luZyBvbmUgcGFyYW1ldGVyIHJhdGhlciB0aGFuIGEgc3RyaW5nLlxuICAgIC8vIEEgcGFyYW1ldGVyIG5hbWUgZm9yIGEgZmlsZSBpcyBvYnRhaW5lZCBzaW1wbHkgYnkgY2FsbGluZyB0aGlzIHdpdGggYW4gaW5kZXggbnVtYmVyLlxuXG4gIH0sIHtcbiAgICBrZXk6IFwiX2dldFBhcmFtTmFtZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfZ2V0UGFyYW1OYW1lKG4pIHtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLnBhcmFtTmFtZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMucGFyYW1OYW1lKG4pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFwiXCIuY29uY2F0KHRoaXMub3B0aW9ucy5wYXJhbU5hbWUpLmNvbmNhdCh0aGlzLm9wdGlvbnMudXBsb2FkTXVsdGlwbGUgPyBcIltcIi5jb25jYXQobiwgXCJdXCIpIDogXCJcIik7XG4gICAgICB9XG4gICAgfSAvLyBJZiBAb3B0aW9ucy5yZW5hbWVGaWxlIGlzIGEgZnVuY3Rpb24sXG4gICAgLy8gdGhlIGZ1bmN0aW9uIHdpbGwgYmUgdXNlZCB0byByZW5hbWUgdGhlIGZpbGUubmFtZSBiZWZvcmUgYXBwZW5kaW5nIGl0IHRvIHRoZSBmb3JtRGF0YVxuXG4gIH0sIHtcbiAgICBrZXk6IFwiX3JlbmFtZUZpbGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3JlbmFtZUZpbGUoZmlsZSkge1xuICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMucmVuYW1lRmlsZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBmaWxlLm5hbWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMucmVuYW1lRmlsZShmaWxlKTtcbiAgICB9IC8vIFJldHVybnMgYSBmb3JtIHRoYXQgY2FuIGJlIHVzZWQgYXMgZmFsbGJhY2sgaWYgdGhlIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBEcmFnbkRyb3BcbiAgICAvL1xuICAgIC8vIElmIHRoZSBkcm9wem9uZSBpcyBhbHJlYWR5IGEgZm9ybSwgb25seSB0aGUgaW5wdXQgZmllbGQgYW5kIGJ1dHRvbiBhcmUgcmV0dXJuZWQuIE90aGVyd2lzZSBhIGNvbXBsZXRlIGZvcm0gZWxlbWVudCBpcyBwcm92aWRlZC5cbiAgICAvLyBUaGlzIGNvZGUgaGFzIHRvIHBhc3MgaW4gSUU3IDooXG5cbiAgfSwge1xuICAgIGtleTogXCJnZXRGYWxsYmFja0Zvcm1cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0RmFsbGJhY2tGb3JtKCkge1xuICAgICAgdmFyIGV4aXN0aW5nRmFsbGJhY2ssIGZvcm07XG5cbiAgICAgIGlmIChleGlzdGluZ0ZhbGxiYWNrID0gdGhpcy5nZXRFeGlzdGluZ0ZhbGxiYWNrKCkpIHtcbiAgICAgICAgcmV0dXJuIGV4aXN0aW5nRmFsbGJhY2s7XG4gICAgICB9XG5cbiAgICAgIHZhciBmaWVsZHNTdHJpbmcgPSBcIjxkaXYgY2xhc3M9XFxcImR6LWZhbGxiYWNrXFxcIj5cIjtcblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5kaWN0RmFsbGJhY2tUZXh0KSB7XG4gICAgICAgIGZpZWxkc1N0cmluZyArPSBcIjxwPlwiLmNvbmNhdCh0aGlzLm9wdGlvbnMuZGljdEZhbGxiYWNrVGV4dCwgXCI8L3A+XCIpO1xuICAgICAgfVxuXG4gICAgICBmaWVsZHNTdHJpbmcgKz0gXCI8aW5wdXQgdHlwZT1cXFwiZmlsZVxcXCIgbmFtZT1cXFwiXCIuY29uY2F0KHRoaXMuX2dldFBhcmFtTmFtZSgwKSwgXCJcXFwiIFwiKS5jb25jYXQodGhpcy5vcHRpb25zLnVwbG9hZE11bHRpcGxlID8gJ211bHRpcGxlPVwibXVsdGlwbGVcIicgOiB1bmRlZmluZWQsIFwiIC8+PGlucHV0IHR5cGU9XFxcInN1Ym1pdFxcXCIgdmFsdWU9XFxcIlVwbG9hZCFcXFwiPjwvZGl2PlwiKTtcbiAgICAgIHZhciBmaWVsZHMgPSBEcm9wem9uZS5jcmVhdGVFbGVtZW50KGZpZWxkc1N0cmluZyk7XG5cbiAgICAgIGlmICh0aGlzLmVsZW1lbnQudGFnTmFtZSAhPT0gXCJGT1JNXCIpIHtcbiAgICAgICAgZm9ybSA9IERyb3B6b25lLmNyZWF0ZUVsZW1lbnQoXCI8Zm9ybSBhY3Rpb249XFxcIlwiLmNvbmNhdCh0aGlzLm9wdGlvbnMudXJsLCBcIlxcXCIgZW5jdHlwZT1cXFwibXVsdGlwYXJ0L2Zvcm0tZGF0YVxcXCIgbWV0aG9kPVxcXCJcIikuY29uY2F0KHRoaXMub3B0aW9ucy5tZXRob2QsIFwiXFxcIj48L2Zvcm0+XCIpKTtcbiAgICAgICAgZm9ybS5hcHBlbmRDaGlsZChmaWVsZHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGVuY3R5cGUgYW5kIG1ldGhvZCBhdHRyaWJ1dGVzIGFyZSBzZXQgcHJvcGVybHlcbiAgICAgICAgdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZShcImVuY3R5cGVcIiwgXCJtdWx0aXBhcnQvZm9ybS1kYXRhXCIpO1xuICAgICAgICB0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKFwibWV0aG9kXCIsIHRoaXMub3B0aW9ucy5tZXRob2QpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZm9ybSAhPSBudWxsID8gZm9ybSA6IGZpZWxkcztcbiAgICB9IC8vIFJldHVybnMgdGhlIGZhbGxiYWNrIGVsZW1lbnRzIGlmIHRoZXkgZXhpc3QgYWxyZWFkeVxuICAgIC8vXG4gICAgLy8gVGhpcyBjb2RlIGhhcyB0byBwYXNzIGluIElFNyA6KFxuXG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0RXhpc3RpbmdGYWxsYmFja1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRFeGlzdGluZ0ZhbGxiYWNrKCkge1xuICAgICAgdmFyIGdldEZhbGxiYWNrID0gZnVuY3Rpb24gZ2V0RmFsbGJhY2soZWxlbWVudHMpIHtcbiAgICAgICAgdmFyIF9pdGVyYXRvcjEyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoZWxlbWVudHMpLFxuICAgICAgICAgICAgX3N0ZXAxMjtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAoX2l0ZXJhdG9yMTIucygpOyAhKF9zdGVwMTIgPSBfaXRlcmF0b3IxMi5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgICB2YXIgZWwgPSBfc3RlcDEyLnZhbHVlO1xuXG4gICAgICAgICAgICBpZiAoLyhefCApZmFsbGJhY2soJHwgKS8udGVzdChlbC5jbGFzc05hbWUpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBlbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIF9pdGVyYXRvcjEyLmUoZXJyKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBfaXRlcmF0b3IxMi5mKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGZvciAodmFyIF9pMiA9IDAsIF9hcnIgPSBbXCJkaXZcIiwgXCJmb3JtXCJdOyBfaTIgPCBfYXJyLmxlbmd0aDsgX2kyKyspIHtcbiAgICAgICAgdmFyIHRhZ05hbWUgPSBfYXJyW19pMl07XG4gICAgICAgIHZhciBmYWxsYmFjaztcblxuICAgICAgICBpZiAoZmFsbGJhY2sgPSBnZXRGYWxsYmFjayh0aGlzLmVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnTmFtZSkpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbGxiYWNrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSAvLyBBY3RpdmF0ZXMgYWxsIGxpc3RlbmVycyBzdG9yZWQgaW4gQGxpc3RlbmVyc1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0dXBFdmVudExpc3RlbmVyc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXR1cEV2ZW50TGlzdGVuZXJzKCkge1xuICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXJzLm1hcChmdW5jdGlvbiAoZWxlbWVudExpc3RlbmVycykge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciByZXN1bHQgPSBbXTtcblxuICAgICAgICAgIGZvciAodmFyIGV2ZW50IGluIGVsZW1lbnRMaXN0ZW5lcnMuZXZlbnRzKSB7XG4gICAgICAgICAgICB2YXIgbGlzdGVuZXIgPSBlbGVtZW50TGlzdGVuZXJzLmV2ZW50c1tldmVudF07XG4gICAgICAgICAgICByZXN1bHQucHVzaChlbGVtZW50TGlzdGVuZXJzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIsIGZhbHNlKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSgpO1xuICAgICAgfSk7XG4gICAgfSAvLyBEZWFjdGl2YXRlcyBhbGwgbGlzdGVuZXJzIHN0b3JlZCBpbiBAbGlzdGVuZXJzXG5cbiAgfSwge1xuICAgIGtleTogXCJyZW1vdmVFdmVudExpc3RlbmVyc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVycygpIHtcbiAgICAgIHJldHVybiB0aGlzLmxpc3RlbmVycy5tYXAoZnVuY3Rpb24gKGVsZW1lbnRMaXN0ZW5lcnMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gW107XG5cbiAgICAgICAgICBmb3IgKHZhciBldmVudCBpbiBlbGVtZW50TGlzdGVuZXJzLmV2ZW50cykge1xuICAgICAgICAgICAgdmFyIGxpc3RlbmVyID0gZWxlbWVudExpc3RlbmVycy5ldmVudHNbZXZlbnRdO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goZWxlbWVudExpc3RlbmVycy5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyLCBmYWxzZSkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0oKTtcbiAgICAgIH0pO1xuICAgIH0gLy8gUmVtb3ZlcyBhbGwgZXZlbnQgbGlzdGVuZXJzIGFuZCBjYW5jZWxzIGFsbCBmaWxlcyBpbiB0aGUgcXVldWUgb3IgYmVpbmcgcHJvY2Vzc2VkLlxuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGlzYWJsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkaXNhYmxlKCkge1xuICAgICAgdmFyIF90aGlzNCA9IHRoaXM7XG5cbiAgICAgIHRoaXMuY2xpY2thYmxlRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKFwiZHotY2xpY2thYmxlXCIpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXJzKCk7XG4gICAgICB0aGlzLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0aGlzLmZpbGVzLm1hcChmdW5jdGlvbiAoZmlsZSkge1xuICAgICAgICByZXR1cm4gX3RoaXM0LmNhbmNlbFVwbG9hZChmaWxlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJlbmFibGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZW5hYmxlKCkge1xuICAgICAgZGVsZXRlIHRoaXMuZGlzYWJsZWQ7XG4gICAgICB0aGlzLmNsaWNrYWJsZUVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChcImR6LWNsaWNrYWJsZVwiKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRoaXMuc2V0dXBFdmVudExpc3RlbmVycygpO1xuICAgIH0gLy8gUmV0dXJucyBhIG5pY2VseSBmb3JtYXR0ZWQgZmlsZXNpemVcblxuICB9LCB7XG4gICAga2V5OiBcImZpbGVzaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZpbGVzaXplKHNpemUpIHtcbiAgICAgIHZhciBzZWxlY3RlZFNpemUgPSAwO1xuICAgICAgdmFyIHNlbGVjdGVkVW5pdCA9IFwiYlwiO1xuXG4gICAgICBpZiAoc2l6ZSA+IDApIHtcbiAgICAgICAgdmFyIHVuaXRzID0gWyd0YicsICdnYicsICdtYicsICdrYicsICdiJ107XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB1bml0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciB1bml0ID0gdW5pdHNbaV07XG4gICAgICAgICAgdmFyIGN1dG9mZiA9IE1hdGgucG93KHRoaXMub3B0aW9ucy5maWxlc2l6ZUJhc2UsIDQgLSBpKSAvIDEwO1xuXG4gICAgICAgICAgaWYgKHNpemUgPj0gY3V0b2ZmKSB7XG4gICAgICAgICAgICBzZWxlY3RlZFNpemUgPSBzaXplIC8gTWF0aC5wb3codGhpcy5vcHRpb25zLmZpbGVzaXplQmFzZSwgNCAtIGkpO1xuICAgICAgICAgICAgc2VsZWN0ZWRVbml0ID0gdW5pdDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHNlbGVjdGVkU2l6ZSA9IE1hdGgucm91bmQoMTAgKiBzZWxlY3RlZFNpemUpIC8gMTA7IC8vIEN1dHRpbmcgb2YgZGlnaXRzXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBcIjxzdHJvbmc+XCIuY29uY2F0KHNlbGVjdGVkU2l6ZSwgXCI8L3N0cm9uZz4gXCIpLmNvbmNhdCh0aGlzLm9wdGlvbnMuZGljdEZpbGVTaXplVW5pdHNbc2VsZWN0ZWRVbml0XSk7XG4gICAgfSAvLyBBZGRzIG9yIHJlbW92ZXMgdGhlIGBkei1tYXgtZmlsZXMtcmVhY2hlZGAgY2xhc3MgZnJvbSB0aGUgZm9ybS5cblxuICB9LCB7XG4gICAga2V5OiBcIl91cGRhdGVNYXhGaWxlc1JlYWNoZWRDbGFzc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfdXBkYXRlTWF4RmlsZXNSZWFjaGVkQ2xhc3MoKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm1heEZpbGVzICE9IG51bGwgJiYgdGhpcy5nZXRBY2NlcHRlZEZpbGVzKCkubGVuZ3RoID49IHRoaXMub3B0aW9ucy5tYXhGaWxlcykge1xuICAgICAgICBpZiAodGhpcy5nZXRBY2NlcHRlZEZpbGVzKCkubGVuZ3RoID09PSB0aGlzLm9wdGlvbnMubWF4RmlsZXMpIHtcbiAgICAgICAgICB0aGlzLmVtaXQoJ21heGZpbGVzcmVhY2hlZCcsIHRoaXMuZmlsZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiZHotbWF4LWZpbGVzLXJlYWNoZWRcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoXCJkei1tYXgtZmlsZXMtcmVhY2hlZFwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZHJvcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkcm9wKGUpIHtcbiAgICAgIGlmICghZS5kYXRhVHJhbnNmZXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmVtaXQoXCJkcm9wXCIsIGUpOyAvLyBDb252ZXJ0IHRoZSBGaWxlTGlzdCB0byBhbiBBcnJheVxuICAgICAgLy8gVGhpcyBpcyBuZWNlc3NhcnkgZm9yIElFMTFcblxuICAgICAgdmFyIGZpbGVzID0gW107XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZS5kYXRhVHJhbnNmZXIuZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZmlsZXNbaV0gPSBlLmRhdGFUcmFuc2Zlci5maWxlc1tpXTtcbiAgICAgIH0gLy8gRXZlbiBpZiBpdCdzIGEgZm9sZGVyLCBmaWxlcy5sZW5ndGggd2lsbCBjb250YWluIHRoZSBmb2xkZXJzLlxuXG5cbiAgICAgIGlmIChmaWxlcy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGl0ZW1zID0gZS5kYXRhVHJhbnNmZXIuaXRlbXM7XG5cbiAgICAgICAgaWYgKGl0ZW1zICYmIGl0ZW1zLmxlbmd0aCAmJiBpdGVtc1swXS53ZWJraXRHZXRBc0VudHJ5ICE9IG51bGwpIHtcbiAgICAgICAgICAvLyBUaGUgYnJvd3NlciBzdXBwb3J0cyBkcm9wcGluZyBvZiBmb2xkZXJzLCBzbyBoYW5kbGUgaXRlbXMgaW5zdGVhZCBvZiBmaWxlc1xuICAgICAgICAgIHRoaXMuX2FkZEZpbGVzRnJvbUl0ZW1zKGl0ZW1zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmhhbmRsZUZpbGVzKGZpbGVzKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLmVtaXQoXCJhZGRlZGZpbGVzXCIsIGZpbGVzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicGFzdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGFzdGUoZSkge1xuICAgICAgaWYgKF9fZ3VhcmRfXyhlICE9IG51bGwgPyBlLmNsaXBib2FyZERhdGEgOiB1bmRlZmluZWQsIGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHJldHVybiB4Lml0ZW1zO1xuICAgICAgfSkgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZW1pdChcInBhc3RlXCIsIGUpO1xuICAgICAgdmFyIGl0ZW1zID0gZS5jbGlwYm9hcmREYXRhLml0ZW1zO1xuXG4gICAgICBpZiAoaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRGaWxlc0Zyb21JdGVtcyhpdGVtcyk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImhhbmRsZUZpbGVzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZUZpbGVzKGZpbGVzKSB7XG4gICAgICB2YXIgX2l0ZXJhdG9yMTMgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihmaWxlcyksXG4gICAgICAgICAgX3N0ZXAxMztcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChfaXRlcmF0b3IxMy5zKCk7ICEoX3N0ZXAxMyA9IF9pdGVyYXRvcjEzLm4oKSkuZG9uZTspIHtcbiAgICAgICAgICB2YXIgZmlsZSA9IF9zdGVwMTMudmFsdWU7XG4gICAgICAgICAgdGhpcy5hZGRGaWxlKGZpbGUpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgX2l0ZXJhdG9yMTMuZShlcnIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgX2l0ZXJhdG9yMTMuZigpO1xuICAgICAgfVxuICAgIH0gLy8gV2hlbiBhIGZvbGRlciBpcyBkcm9wcGVkIChvciBmaWxlcyBhcmUgcGFzdGVkKSwgaXRlbXMgbXVzdCBiZSBoYW5kbGVkXG4gICAgLy8gaW5zdGVhZCBvZiBmaWxlcy5cblxuICB9LCB7XG4gICAga2V5OiBcIl9hZGRGaWxlc0Zyb21JdGVtc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfYWRkRmlsZXNGcm9tSXRlbXMoaXRlbXMpIHtcbiAgICAgIHZhciBfdGhpczUgPSB0aGlzO1xuXG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gW107XG5cbiAgICAgICAgdmFyIF9pdGVyYXRvcjE0ID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoaXRlbXMpLFxuICAgICAgICAgICAgX3N0ZXAxNDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAoX2l0ZXJhdG9yMTQucygpOyAhKF9zdGVwMTQgPSBfaXRlcmF0b3IxNC5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgICB2YXIgaXRlbSA9IF9zdGVwMTQudmFsdWU7XG4gICAgICAgICAgICB2YXIgZW50cnk7XG5cbiAgICAgICAgICAgIGlmIChpdGVtLndlYmtpdEdldEFzRW50cnkgIT0gbnVsbCAmJiAoZW50cnkgPSBpdGVtLndlYmtpdEdldEFzRW50cnkoKSkpIHtcbiAgICAgICAgICAgICAgaWYgKGVudHJ5LmlzRmlsZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKF90aGlzNS5hZGRGaWxlKGl0ZW0uZ2V0QXNGaWxlKCkpKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbnRyeS5pc0RpcmVjdG9yeSkge1xuICAgICAgICAgICAgICAgIC8vIEFwcGVuZCBhbGwgZmlsZXMgZnJvbSB0aGF0IGRpcmVjdG9yeSB0byBmaWxlc1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKF90aGlzNS5fYWRkRmlsZXNGcm9tRGlyZWN0b3J5KGVudHJ5LCBlbnRyeS5uYW1lKSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtLmdldEFzRmlsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIGlmIChpdGVtLmtpbmQgPT0gbnVsbCB8fCBpdGVtLmtpbmQgPT09IFwiZmlsZVwiKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goX3RoaXM1LmFkZEZpbGUoaXRlbS5nZXRBc0ZpbGUoKSkpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBfaXRlcmF0b3IxNC5lKGVycik7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgX2l0ZXJhdG9yMTQuZigpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0oKTtcbiAgICB9IC8vIEdvZXMgdGhyb3VnaCB0aGUgZGlyZWN0b3J5LCBhbmQgYWRkcyBlYWNoIGZpbGUgaXQgZmluZHMgcmVjdXJzaXZlbHlcblxuICB9LCB7XG4gICAga2V5OiBcIl9hZGRGaWxlc0Zyb21EaXJlY3RvcnlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2FkZEZpbGVzRnJvbURpcmVjdG9yeShkaXJlY3RvcnksIHBhdGgpIHtcbiAgICAgIHZhciBfdGhpczYgPSB0aGlzO1xuXG4gICAgICB2YXIgZGlyUmVhZGVyID0gZGlyZWN0b3J5LmNyZWF0ZVJlYWRlcigpO1xuXG4gICAgICB2YXIgZXJyb3JIYW5kbGVyID0gZnVuY3Rpb24gZXJyb3JIYW5kbGVyKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBfX2d1YXJkTWV0aG9kX18oY29uc29sZSwgJ2xvZycsIGZ1bmN0aW9uIChvKSB7XG4gICAgICAgICAgcmV0dXJuIG8ubG9nKGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICB2YXIgcmVhZEVudHJpZXMgPSBmdW5jdGlvbiByZWFkRW50cmllcygpIHtcbiAgICAgICAgcmV0dXJuIGRpclJlYWRlci5yZWFkRW50cmllcyhmdW5jdGlvbiAoZW50cmllcykge1xuICAgICAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHZhciBfaXRlcmF0b3IxNSA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGVudHJpZXMpLFxuICAgICAgICAgICAgICAgIF9zdGVwMTU7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGZvciAoX2l0ZXJhdG9yMTUucygpOyAhKF9zdGVwMTUgPSBfaXRlcmF0b3IxNS5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgICAgICAgdmFyIGVudHJ5ID0gX3N0ZXAxNS52YWx1ZTtcblxuICAgICAgICAgICAgICAgIGlmIChlbnRyeS5pc0ZpbGUpIHtcbiAgICAgICAgICAgICAgICAgIGVudHJ5LmZpbGUoZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF90aGlzNi5vcHRpb25zLmlnbm9yZUhpZGRlbkZpbGVzICYmIGZpbGUubmFtZS5zdWJzdHJpbmcoMCwgMSkgPT09ICcuJykge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGZpbGUuZnVsbFBhdGggPSBcIlwiLmNvbmNhdChwYXRoLCBcIi9cIikuY29uY2F0KGZpbGUubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczYuYWRkRmlsZShmaWxlKTtcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZW50cnkuaXNEaXJlY3RvcnkpIHtcbiAgICAgICAgICAgICAgICAgIF90aGlzNi5fYWRkRmlsZXNGcm9tRGlyZWN0b3J5KGVudHJ5LCBcIlwiLmNvbmNhdChwYXRoLCBcIi9cIikuY29uY2F0KGVudHJ5Lm5hbWUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gLy8gUmVjdXJzaXZlbHkgY2FsbCByZWFkRW50cmllcygpIGFnYWluLCBzaW5jZSBicm93c2VyIG9ubHkgaGFuZGxlXG4gICAgICAgICAgICAgIC8vIHRoZSBmaXJzdCAxMDAgZW50cmllcy5cbiAgICAgICAgICAgICAgLy8gU2VlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRGlyZWN0b3J5UmVhZGVyI3JlYWRFbnRyaWVzXG5cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICBfaXRlcmF0b3IxNS5lKGVycik7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICBfaXRlcmF0b3IxNS5mKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlYWRFbnRyaWVzKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0sIGVycm9ySGFuZGxlcik7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gcmVhZEVudHJpZXMoKTtcbiAgICB9IC8vIElmIGBkb25lKClgIGlzIGNhbGxlZCB3aXRob3V0IGFyZ3VtZW50IHRoZSBmaWxlIGlzIGFjY2VwdGVkXG4gICAgLy8gSWYgeW91IGNhbGwgaXQgd2l0aCBhbiBlcnJvciBtZXNzYWdlLCB0aGUgZmlsZSBpcyByZWplY3RlZFxuICAgIC8vIChUaGlzIGFsbG93cyBmb3IgYXN5bmNocm9ub3VzIHZhbGlkYXRpb24pXG4gICAgLy9cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB0aGUgZmlsZXNpemUsIGFuZCBpZiB0aGUgZmlsZS50eXBlIHBhc3NlcyB0aGVcbiAgICAvLyBgYWNjZXB0ZWRGaWxlc2AgY2hlY2suXG5cbiAgfSwge1xuICAgIGtleTogXCJhY2NlcHRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWNjZXB0KGZpbGUsIGRvbmUpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMubWF4RmlsZXNpemUgJiYgZmlsZS5zaXplID4gdGhpcy5vcHRpb25zLm1heEZpbGVzaXplICogMTAyNCAqIDEwMjQpIHtcbiAgICAgICAgZG9uZSh0aGlzLm9wdGlvbnMuZGljdEZpbGVUb29CaWcucmVwbGFjZShcInt7ZmlsZXNpemV9fVwiLCBNYXRoLnJvdW5kKGZpbGUuc2l6ZSAvIDEwMjQgLyAxMC4yNCkgLyAxMDApLnJlcGxhY2UoXCJ7e21heEZpbGVzaXplfX1cIiwgdGhpcy5vcHRpb25zLm1heEZpbGVzaXplKSk7XG4gICAgICB9IGVsc2UgaWYgKCFEcm9wem9uZS5pc1ZhbGlkRmlsZShmaWxlLCB0aGlzLm9wdGlvbnMuYWNjZXB0ZWRGaWxlcykpIHtcbiAgICAgICAgZG9uZSh0aGlzLm9wdGlvbnMuZGljdEludmFsaWRGaWxlVHlwZSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5tYXhGaWxlcyAhPSBudWxsICYmIHRoaXMuZ2V0QWNjZXB0ZWRGaWxlcygpLmxlbmd0aCA+PSB0aGlzLm9wdGlvbnMubWF4RmlsZXMpIHtcbiAgICAgICAgZG9uZSh0aGlzLm9wdGlvbnMuZGljdE1heEZpbGVzRXhjZWVkZWQucmVwbGFjZShcInt7bWF4RmlsZXN9fVwiLCB0aGlzLm9wdGlvbnMubWF4RmlsZXMpKTtcbiAgICAgICAgdGhpcy5lbWl0KFwibWF4ZmlsZXNleGNlZWRlZFwiLCBmaWxlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5hY2NlcHQuY2FsbCh0aGlzLCBmaWxlLCBkb25lKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkRmlsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRGaWxlKGZpbGUpIHtcbiAgICAgIHZhciBfdGhpczcgPSB0aGlzO1xuXG4gICAgICBmaWxlLnVwbG9hZCA9IHtcbiAgICAgICAgdXVpZDogRHJvcHpvbmUudXVpZHY0KCksXG4gICAgICAgIHByb2dyZXNzOiAwLFxuICAgICAgICAvLyBTZXR0aW5nIHRoZSB0b3RhbCB1cGxvYWQgc2l6ZSB0byBmaWxlLnNpemUgZm9yIHRoZSBiZWdpbm5pbmdcbiAgICAgICAgLy8gSXQncyBhY3R1YWwgZGlmZmVyZW50IHRoYW4gdGhlIHNpemUgdG8gYmUgdHJhbnNtaXR0ZWQuXG4gICAgICAgIHRvdGFsOiBmaWxlLnNpemUsXG4gICAgICAgIGJ5dGVzU2VudDogMCxcbiAgICAgICAgZmlsZW5hbWU6IHRoaXMuX3JlbmFtZUZpbGUoZmlsZSkgLy8gTm90IHNldHRpbmcgY2h1bmtpbmcgaW5mb3JtYXRpb24gaGVyZSwgYmVjYXVzZSB0aGUgYWN1dGFsIGRhdGEg4oCUIGFuZFxuICAgICAgICAvLyB0aHVzIHRoZSBjaHVua3Mg4oCUIG1pZ2h0IGNoYW5nZSBpZiBgb3B0aW9ucy50cmFuc2Zvcm1GaWxlYCBpcyBzZXRcbiAgICAgICAgLy8gYW5kIGRvZXMgc29tZXRoaW5nIHRvIHRoZSBkYXRhLlxuXG4gICAgICB9O1xuICAgICAgdGhpcy5maWxlcy5wdXNoKGZpbGUpO1xuICAgICAgZmlsZS5zdGF0dXMgPSBEcm9wem9uZS5BRERFRDtcbiAgICAgIHRoaXMuZW1pdChcImFkZGVkZmlsZVwiLCBmaWxlKTtcblxuICAgICAgdGhpcy5fZW5xdWV1ZVRodW1ibmFpbChmaWxlKTtcblxuICAgICAgdGhpcy5hY2NlcHQoZmlsZSwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIGZpbGUuYWNjZXB0ZWQgPSBmYWxzZTtcblxuICAgICAgICAgIF90aGlzNy5fZXJyb3JQcm9jZXNzaW5nKFtmaWxlXSwgZXJyb3IpOyAvLyBXaWxsIHNldCB0aGUgZmlsZS5zdGF0dXNcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpbGUuYWNjZXB0ZWQgPSB0cnVlO1xuXG4gICAgICAgICAgaWYgKF90aGlzNy5vcHRpb25zLmF1dG9RdWV1ZSkge1xuICAgICAgICAgICAgX3RoaXM3LmVucXVldWVGaWxlKGZpbGUpO1xuICAgICAgICAgIH0gLy8gV2lsbCBzZXQgLmFjY2VwdGVkID0gdHJ1ZVxuXG4gICAgICAgIH1cblxuICAgICAgICBfdGhpczcuX3VwZGF0ZU1heEZpbGVzUmVhY2hlZENsYXNzKCk7XG4gICAgICB9KTtcbiAgICB9IC8vIFdyYXBwZXIgZm9yIGVucXVldWVGaWxlXG5cbiAgfSwge1xuICAgIGtleTogXCJlbnF1ZXVlRmlsZXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZW5xdWV1ZUZpbGVzKGZpbGVzKSB7XG4gICAgICB2YXIgX2l0ZXJhdG9yMTYgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihmaWxlcyksXG4gICAgICAgICAgX3N0ZXAxNjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChfaXRlcmF0b3IxNi5zKCk7ICEoX3N0ZXAxNiA9IF9pdGVyYXRvcjE2Lm4oKSkuZG9uZTspIHtcbiAgICAgICAgICB2YXIgZmlsZSA9IF9zdGVwMTYudmFsdWU7XG4gICAgICAgICAgdGhpcy5lbnF1ZXVlRmlsZShmaWxlKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9pdGVyYXRvcjE2LmUoZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIF9pdGVyYXRvcjE2LmYoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImVucXVldWVGaWxlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVucXVldWVGaWxlKGZpbGUpIHtcbiAgICAgIHZhciBfdGhpczggPSB0aGlzO1xuXG4gICAgICBpZiAoZmlsZS5zdGF0dXMgPT09IERyb3B6b25lLkFEREVEICYmIGZpbGUuYWNjZXB0ZWQgPT09IHRydWUpIHtcbiAgICAgICAgZmlsZS5zdGF0dXMgPSBEcm9wem9uZS5RVUVVRUQ7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5hdXRvUHJvY2Vzc1F1ZXVlKSB7XG4gICAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzOC5wcm9jZXNzUXVldWUoKTtcbiAgICAgICAgICB9LCAwKTsgLy8gRGVmZXJyaW5nIHRoZSBjYWxsXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgZmlsZSBjYW4ndCBiZSBxdWV1ZWQgYmVjYXVzZSBpdCBoYXMgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZCBvciB3YXMgcmVqZWN0ZWQuXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfZW5xdWV1ZVRodW1ibmFpbFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfZW5xdWV1ZVRodW1ibmFpbChmaWxlKSB7XG4gICAgICB2YXIgX3RoaXM5ID0gdGhpcztcblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5jcmVhdGVJbWFnZVRodW1ibmFpbHMgJiYgZmlsZS50eXBlLm1hdGNoKC9pbWFnZS4qLykgJiYgZmlsZS5zaXplIDw9IHRoaXMub3B0aW9ucy5tYXhUaHVtYm5haWxGaWxlc2l6ZSAqIDEwMjQgKiAxMDI0KSB7XG4gICAgICAgIHRoaXMuX3RodW1ibmFpbFF1ZXVlLnB1c2goZmlsZSk7XG5cbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBfdGhpczkuX3Byb2Nlc3NUaHVtYm5haWxRdWV1ZSgpO1xuICAgICAgICB9LCAwKTsgLy8gRGVmZXJyaW5nIHRoZSBjYWxsXG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9wcm9jZXNzVGh1bWJuYWlsUXVldWVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3Byb2Nlc3NUaHVtYm5haWxRdWV1ZSgpIHtcbiAgICAgIHZhciBfdGhpczEwID0gdGhpcztcblxuICAgICAgaWYgKHRoaXMuX3Byb2Nlc3NpbmdUaHVtYm5haWwgfHwgdGhpcy5fdGh1bWJuYWlsUXVldWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fcHJvY2Vzc2luZ1RodW1ibmFpbCA9IHRydWU7XG5cbiAgICAgIHZhciBmaWxlID0gdGhpcy5fdGh1bWJuYWlsUXVldWUuc2hpZnQoKTtcblxuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVGh1bWJuYWlsKGZpbGUsIHRoaXMub3B0aW9ucy50aHVtYm5haWxXaWR0aCwgdGhpcy5vcHRpb25zLnRodW1ibmFpbEhlaWdodCwgdGhpcy5vcHRpb25zLnRodW1ibmFpbE1ldGhvZCwgdHJ1ZSwgZnVuY3Rpb24gKGRhdGFVcmwpIHtcbiAgICAgICAgX3RoaXMxMC5lbWl0KFwidGh1bWJuYWlsXCIsIGZpbGUsIGRhdGFVcmwpO1xuXG4gICAgICAgIF90aGlzMTAuX3Byb2Nlc3NpbmdUaHVtYm5haWwgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIF90aGlzMTAuX3Byb2Nlc3NUaHVtYm5haWxRdWV1ZSgpO1xuICAgICAgfSk7XG4gICAgfSAvLyBDYW4gYmUgY2FsbGVkIGJ5IHRoZSB1c2VyIHRvIHJlbW92ZSBhIGZpbGVcblxuICB9LCB7XG4gICAga2V5OiBcInJlbW92ZUZpbGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlRmlsZShmaWxlKSB7XG4gICAgICBpZiAoZmlsZS5zdGF0dXMgPT09IERyb3B6b25lLlVQTE9BRElORykge1xuICAgICAgICB0aGlzLmNhbmNlbFVwbG9hZChmaWxlKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5maWxlcyA9IHdpdGhvdXQodGhpcy5maWxlcywgZmlsZSk7XG4gICAgICB0aGlzLmVtaXQoXCJyZW1vdmVkZmlsZVwiLCBmaWxlKTtcblxuICAgICAgaWYgKHRoaXMuZmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVtaXQoXCJyZXNldFwiKTtcbiAgICAgIH1cbiAgICB9IC8vIFJlbW92ZXMgYWxsIGZpbGVzIHRoYXQgYXJlbid0IGN1cnJlbnRseSBwcm9jZXNzZWQgZnJvbSB0aGUgbGlzdFxuXG4gIH0sIHtcbiAgICBrZXk6IFwicmVtb3ZlQWxsRmlsZXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlQWxsRmlsZXMoY2FuY2VsSWZOZWNlc3NhcnkpIHtcbiAgICAgIC8vIENyZWF0ZSBhIGNvcHkgb2YgZmlsZXMgc2luY2UgcmVtb3ZlRmlsZSgpIGNoYW5nZXMgdGhlIEBmaWxlcyBhcnJheS5cbiAgICAgIGlmIChjYW5jZWxJZk5lY2Vzc2FyeSA9PSBudWxsKSB7XG4gICAgICAgIGNhbmNlbElmTmVjZXNzYXJ5ID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHZhciBfaXRlcmF0b3IxNyA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHRoaXMuZmlsZXMuc2xpY2UoKSksXG4gICAgICAgICAgX3N0ZXAxNztcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChfaXRlcmF0b3IxNy5zKCk7ICEoX3N0ZXAxNyA9IF9pdGVyYXRvcjE3Lm4oKSkuZG9uZTspIHtcbiAgICAgICAgICB2YXIgZmlsZSA9IF9zdGVwMTcudmFsdWU7XG5cbiAgICAgICAgICBpZiAoZmlsZS5zdGF0dXMgIT09IERyb3B6b25lLlVQTE9BRElORyB8fCBjYW5jZWxJZk5lY2Vzc2FyeSkge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVGaWxlKGZpbGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9pdGVyYXRvcjE3LmUoZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIF9pdGVyYXRvcjE3LmYoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSAvLyBSZXNpemVzIGFuIGltYWdlIGJlZm9yZSBpdCBnZXRzIHNlbnQgdG8gdGhlIHNlcnZlci4gVGhpcyBmdW5jdGlvbiBpcyB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZlxuICAgIC8vIGBvcHRpb25zLnRyYW5zZm9ybUZpbGVgIGlmIGByZXNpemVXaWR0aGAgb3IgYHJlc2l6ZUhlaWdodGAgYXJlIHNldC4gVGhlIGNhbGxiYWNrIGlzIGludm9rZWQgd2l0aFxuICAgIC8vIHRoZSByZXNpemVkIGJsb2IuXG5cbiAgfSwge1xuICAgIGtleTogXCJyZXNpemVJbWFnZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXNpemVJbWFnZShmaWxlLCB3aWR0aCwgaGVpZ2h0LCByZXNpemVNZXRob2QsIGNhbGxiYWNrKSB7XG4gICAgICB2YXIgX3RoaXMxMSA9IHRoaXM7XG5cbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVRodW1ibmFpbChmaWxlLCB3aWR0aCwgaGVpZ2h0LCByZXNpemVNZXRob2QsIHRydWUsIGZ1bmN0aW9uIChkYXRhVXJsLCBjYW52YXMpIHtcbiAgICAgICAgaWYgKGNhbnZhcyA9PSBudWxsKSB7XG4gICAgICAgICAgLy8gVGhlIGltYWdlIGhhcyBub3QgYmVlbiByZXNpemVkXG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGZpbGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciByZXNpemVNaW1lVHlwZSA9IF90aGlzMTEub3B0aW9ucy5yZXNpemVNaW1lVHlwZTtcblxuICAgICAgICAgIGlmIChyZXNpemVNaW1lVHlwZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXNpemVNaW1lVHlwZSA9IGZpbGUudHlwZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgcmVzaXplZERhdGFVUkwgPSBjYW52YXMudG9EYXRhVVJMKHJlc2l6ZU1pbWVUeXBlLCBfdGhpczExLm9wdGlvbnMucmVzaXplUXVhbGl0eSk7XG5cbiAgICAgICAgICBpZiAocmVzaXplTWltZVR5cGUgPT09ICdpbWFnZS9qcGVnJyB8fCByZXNpemVNaW1lVHlwZSA9PT0gJ2ltYWdlL2pwZycpIHtcbiAgICAgICAgICAgIC8vIE5vdyBhZGQgdGhlIG9yaWdpbmFsIEVYSUYgaW5mb3JtYXRpb25cbiAgICAgICAgICAgIHJlc2l6ZWREYXRhVVJMID0gRXhpZlJlc3RvcmUucmVzdG9yZShmaWxlLmRhdGFVUkwsIHJlc2l6ZWREYXRhVVJMKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2soRHJvcHpvbmUuZGF0YVVSSXRvQmxvYihyZXNpemVkRGF0YVVSTCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY3JlYXRlVGh1bWJuYWlsXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNyZWF0ZVRodW1ibmFpbChmaWxlLCB3aWR0aCwgaGVpZ2h0LCByZXNpemVNZXRob2QsIGZpeE9yaWVudGF0aW9uLCBjYWxsYmFjaykge1xuICAgICAgdmFyIF90aGlzMTIgPSB0aGlzO1xuXG4gICAgICB2YXIgZmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG5cbiAgICAgIGZpbGVSZWFkZXIub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBmaWxlLmRhdGFVUkwgPSBmaWxlUmVhZGVyLnJlc3VsdDsgLy8gRG9uJ3QgYm90aGVyIGNyZWF0aW5nIGEgdGh1bWJuYWlsIGZvciBTVkcgaW1hZ2VzIHNpbmNlIHRoZXkncmUgdmVjdG9yXG5cbiAgICAgICAgaWYgKGZpbGUudHlwZSA9PT0gXCJpbWFnZS9zdmcreG1sXCIpIHtcbiAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkge1xuICAgICAgICAgICAgY2FsbGJhY2soZmlsZVJlYWRlci5yZXN1bHQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzMTIuY3JlYXRlVGh1bWJuYWlsRnJvbVVybChmaWxlLCB3aWR0aCwgaGVpZ2h0LCByZXNpemVNZXRob2QsIGZpeE9yaWVudGF0aW9uLCBjYWxsYmFjayk7XG4gICAgICB9O1xuXG4gICAgICBmaWxlUmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XG4gICAgfSAvLyBgbW9ja0ZpbGVgIG5lZWRzIHRvIGhhdmUgdGhlc2UgYXR0cmlidXRlczpcbiAgICAvLyBcbiAgICAvLyAgICAgeyBuYW1lOiAnbmFtZScsIHNpemU6IDEyMzQ1LCBpbWFnZVVybDogJycgfVxuICAgIC8vXG4gICAgLy8gYGNhbGxiYWNrYCB3aWxsIGJlIGludm9rZWQgd2hlbiB0aGUgaW1hZ2UgaGFzIGJlZW4gZG93bmxvYWRlZCBhbmQgZGlzcGxheWVkLlxuICAgIC8vIGBjcm9zc09yaWdpbmAgd2lsbCBiZSBhZGRlZCB0byB0aGUgYGltZ2AgdGFnIHdoZW4gYWNjZXNzaW5nIHRoZSBmaWxlLlxuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGlzcGxheUV4aXN0aW5nRmlsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkaXNwbGF5RXhpc3RpbmdGaWxlKG1vY2tGaWxlLCBpbWFnZVVybCwgY2FsbGJhY2ssIGNyb3NzT3JpZ2luKSB7XG4gICAgICB2YXIgX3RoaXMxMyA9IHRoaXM7XG5cbiAgICAgIHZhciByZXNpemVUaHVtYm5haWwgPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiBhcmd1bWVudHNbNF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s0XSA6IHRydWU7XG4gICAgICB0aGlzLmVtaXQoXCJhZGRlZGZpbGVcIiwgbW9ja0ZpbGUpO1xuICAgICAgdGhpcy5lbWl0KFwiY29tcGxldGVcIiwgbW9ja0ZpbGUpO1xuXG4gICAgICBpZiAoIXJlc2l6ZVRodW1ibmFpbCkge1xuICAgICAgICB0aGlzLmVtaXQoXCJ0aHVtYm5haWxcIiwgbW9ja0ZpbGUsIGltYWdlVXJsKTtcbiAgICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjaygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG9uRG9uZSA9IGZ1bmN0aW9uIG9uRG9uZSh0aHVtYm5haWwpIHtcbiAgICAgICAgICBfdGhpczEzLmVtaXQoJ3RodW1ibmFpbCcsIG1vY2tGaWxlLCB0aHVtYm5haWwpO1xuXG4gICAgICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjaygpO1xuICAgICAgICB9O1xuXG4gICAgICAgIG1vY2tGaWxlLmRhdGFVUkwgPSBpbWFnZVVybDtcbiAgICAgICAgdGhpcy5jcmVhdGVUaHVtYm5haWxGcm9tVXJsKG1vY2tGaWxlLCB0aGlzLm9wdGlvbnMudGh1bWJuYWlsV2lkdGgsIHRoaXMub3B0aW9ucy50aHVtYm5haWxIZWlnaHQsIHRoaXMub3B0aW9ucy5yZXNpemVNZXRob2QsIHRoaXMub3B0aW9ucy5maXhPcmllbnRhdGlvbiwgb25Eb25lLCBjcm9zc09yaWdpbik7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNyZWF0ZVRodW1ibmFpbEZyb21VcmxcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY3JlYXRlVGh1bWJuYWlsRnJvbVVybChmaWxlLCB3aWR0aCwgaGVpZ2h0LCByZXNpemVNZXRob2QsIGZpeE9yaWVudGF0aW9uLCBjYWxsYmFjaywgY3Jvc3NPcmlnaW4pIHtcbiAgICAgIHZhciBfdGhpczE0ID0gdGhpcztcblxuICAgICAgLy8gTm90IHVzaW5nIGBuZXcgSW1hZ2VgIGhlcmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBsYXRlc3QgQ2hyb21lIHZlcnNpb25zLlxuICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbnlvL2Ryb3B6b25lL3B1bGwvMjI2XG4gICAgICB2YXIgaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImltZ1wiKTtcblxuICAgICAgaWYgKGNyb3NzT3JpZ2luKSB7XG4gICAgICAgIGltZy5jcm9zc09yaWdpbiA9IGNyb3NzT3JpZ2luO1xuICAgICAgfSAvLyBmaXhPcmllbnRhdGlvbiBpcyBub3QgbmVlZGVkIGFueW1vcmUgd2l0aCBicm93c2VycyBoYW5kbGluZyBpbWFnZU9yaWVudGF0aW9uXG5cblxuICAgICAgZml4T3JpZW50YXRpb24gPSBnZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHkpWydpbWFnZU9yaWVudGF0aW9uJ10gPT0gJ2Zyb20taW1hZ2UnID8gZmFsc2UgOiBmaXhPcmllbnRhdGlvbjtcblxuICAgICAgaW1nLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGxvYWRFeGlmID0gZnVuY3Rpb24gbG9hZEV4aWYoY2FsbGJhY2spIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2soMSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHR5cGVvZiBFWElGICE9PSAndW5kZWZpbmVkJyAmJiBFWElGICE9PSBudWxsICYmIGZpeE9yaWVudGF0aW9uKSB7XG4gICAgICAgICAgbG9hZEV4aWYgPSBmdW5jdGlvbiBsb2FkRXhpZihjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIEVYSUYuZ2V0RGF0YShpbWcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKEVYSUYuZ2V0VGFnKHRoaXMsICdPcmllbnRhdGlvbicpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbG9hZEV4aWYoZnVuY3Rpb24gKG9yaWVudGF0aW9uKSB7XG4gICAgICAgICAgZmlsZS53aWR0aCA9IGltZy53aWR0aDtcbiAgICAgICAgICBmaWxlLmhlaWdodCA9IGltZy5oZWlnaHQ7XG5cbiAgICAgICAgICB2YXIgcmVzaXplSW5mbyA9IF90aGlzMTQub3B0aW9ucy5yZXNpemUuY2FsbChfdGhpczE0LCBmaWxlLCB3aWR0aCwgaGVpZ2h0LCByZXNpemVNZXRob2QpO1xuXG4gICAgICAgICAgdmFyIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgICAgICAgdmFyIGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgICAgICAgY2FudmFzLndpZHRoID0gcmVzaXplSW5mby50cmdXaWR0aDtcbiAgICAgICAgICBjYW52YXMuaGVpZ2h0ID0gcmVzaXplSW5mby50cmdIZWlnaHQ7XG5cbiAgICAgICAgICBpZiAob3JpZW50YXRpb24gPiA0KSB7XG4gICAgICAgICAgICBjYW52YXMud2lkdGggPSByZXNpemVJbmZvLnRyZ0hlaWdodDtcbiAgICAgICAgICAgIGNhbnZhcy5oZWlnaHQgPSByZXNpemVJbmZvLnRyZ1dpZHRoO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHN3aXRjaCAob3JpZW50YXRpb24pIHtcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgLy8gaG9yaXpvbnRhbCBmbGlwXG4gICAgICAgICAgICAgIGN0eC50cmFuc2xhdGUoY2FudmFzLndpZHRoLCAwKTtcbiAgICAgICAgICAgICAgY3R4LnNjYWxlKC0xLCAxKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgLy8gMTgwwrAgcm90YXRlIGxlZnRcbiAgICAgICAgICAgICAgY3R4LnRyYW5zbGF0ZShjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xuICAgICAgICAgICAgICBjdHgucm90YXRlKE1hdGguUEkpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAvLyB2ZXJ0aWNhbCBmbGlwXG4gICAgICAgICAgICAgIGN0eC50cmFuc2xhdGUoMCwgY2FudmFzLmhlaWdodCk7XG4gICAgICAgICAgICAgIGN0eC5zY2FsZSgxLCAtMSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgIC8vIHZlcnRpY2FsIGZsaXAgKyA5MCByb3RhdGUgcmlnaHRcbiAgICAgICAgICAgICAgY3R4LnJvdGF0ZSgwLjUgKiBNYXRoLlBJKTtcbiAgICAgICAgICAgICAgY3R4LnNjYWxlKDEsIC0xKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgLy8gOTDCsCByb3RhdGUgcmlnaHRcbiAgICAgICAgICAgICAgY3R4LnJvdGF0ZSgwLjUgKiBNYXRoLlBJKTtcbiAgICAgICAgICAgICAgY3R4LnRyYW5zbGF0ZSgwLCAtY2FudmFzLndpZHRoKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgLy8gaG9yaXpvbnRhbCBmbGlwICsgOTAgcm90YXRlIHJpZ2h0XG4gICAgICAgICAgICAgIGN0eC5yb3RhdGUoMC41ICogTWF0aC5QSSk7XG4gICAgICAgICAgICAgIGN0eC50cmFuc2xhdGUoY2FudmFzLmhlaWdodCwgLWNhbnZhcy53aWR0aCk7XG4gICAgICAgICAgICAgIGN0eC5zY2FsZSgtMSwgMSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgIC8vIDkwwrAgcm90YXRlIGxlZnRcbiAgICAgICAgICAgICAgY3R4LnJvdGF0ZSgtMC41ICogTWF0aC5QSSk7XG4gICAgICAgICAgICAgIGN0eC50cmFuc2xhdGUoLWNhbnZhcy5oZWlnaHQsIDApO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9IC8vIFRoaXMgaXMgYSBidWdmaXggZm9yIGlPUycgc2NhbGluZyBidWcuXG5cblxuICAgICAgICAgIGRyYXdJbWFnZUlPU0ZpeChjdHgsIGltZywgcmVzaXplSW5mby5zcmNYICE9IG51bGwgPyByZXNpemVJbmZvLnNyY1ggOiAwLCByZXNpemVJbmZvLnNyY1kgIT0gbnVsbCA/IHJlc2l6ZUluZm8uc3JjWSA6IDAsIHJlc2l6ZUluZm8uc3JjV2lkdGgsIHJlc2l6ZUluZm8uc3JjSGVpZ2h0LCByZXNpemVJbmZvLnRyZ1ggIT0gbnVsbCA/IHJlc2l6ZUluZm8udHJnWCA6IDAsIHJlc2l6ZUluZm8udHJnWSAhPSBudWxsID8gcmVzaXplSW5mby50cmdZIDogMCwgcmVzaXplSW5mby50cmdXaWR0aCwgcmVzaXplSW5mby50cmdIZWlnaHQpO1xuICAgICAgICAgIHZhciB0aHVtYm5haWwgPSBjYW52YXMudG9EYXRhVVJMKFwiaW1hZ2UvcG5nXCIpO1xuXG4gICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayh0aHVtYm5haWwsIGNhbnZhcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7XG4gICAgICAgIGltZy5vbmVycm9yID0gY2FsbGJhY2s7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpbWcuc3JjID0gZmlsZS5kYXRhVVJMO1xuICAgIH0gLy8gR29lcyB0aHJvdWdoIHRoZSBxdWV1ZSBhbmQgcHJvY2Vzc2VzIGZpbGVzIGlmIHRoZXJlIGFyZW4ndCB0b28gbWFueSBhbHJlYWR5LlxuXG4gIH0sIHtcbiAgICBrZXk6IFwicHJvY2Vzc1F1ZXVlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHByb2Nlc3NRdWV1ZSgpIHtcbiAgICAgIHZhciBwYXJhbGxlbFVwbG9hZHMgPSB0aGlzLm9wdGlvbnMucGFyYWxsZWxVcGxvYWRzO1xuICAgICAgdmFyIHByb2Nlc3NpbmdMZW5ndGggPSB0aGlzLmdldFVwbG9hZGluZ0ZpbGVzKCkubGVuZ3RoO1xuICAgICAgdmFyIGkgPSBwcm9jZXNzaW5nTGVuZ3RoOyAvLyBUaGVyZSBhcmUgYWxyZWFkeSBhdCBsZWFzdCBhcyBtYW55IGZpbGVzIHVwbG9hZGluZyB0aGFuIHNob3VsZCBiZVxuXG4gICAgICBpZiAocHJvY2Vzc2luZ0xlbmd0aCA+PSBwYXJhbGxlbFVwbG9hZHMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgcXVldWVkRmlsZXMgPSB0aGlzLmdldFF1ZXVlZEZpbGVzKCk7XG5cbiAgICAgIGlmICghKHF1ZXVlZEZpbGVzLmxlbmd0aCA+IDApKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy51cGxvYWRNdWx0aXBsZSkge1xuICAgICAgICAvLyBUaGUgZmlsZXMgc2hvdWxkIGJlIHVwbG9hZGVkIGluIG9uZSByZXF1ZXN0XG4gICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NGaWxlcyhxdWV1ZWRGaWxlcy5zbGljZSgwLCBwYXJhbGxlbFVwbG9hZHMgLSBwcm9jZXNzaW5nTGVuZ3RoKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aGlsZSAoaSA8IHBhcmFsbGVsVXBsb2Fkcykge1xuICAgICAgICAgIGlmICghcXVldWVkRmlsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfSAvLyBOb3RoaW5nIGxlZnQgdG8gcHJvY2Vzc1xuXG5cbiAgICAgICAgICB0aGlzLnByb2Nlc3NGaWxlKHF1ZXVlZEZpbGVzLnNoaWZ0KCkpO1xuICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8gV3JhcHBlciBmb3IgYHByb2Nlc3NGaWxlc2BcblxuICB9LCB7XG4gICAga2V5OiBcInByb2Nlc3NGaWxlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHByb2Nlc3NGaWxlKGZpbGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NGaWxlcyhbZmlsZV0pO1xuICAgIH0gLy8gTG9hZHMgdGhlIGZpbGUsIHRoZW4gY2FsbHMgZmluaXNoZWRMb2FkaW5nKClcblxuICB9LCB7XG4gICAga2V5OiBcInByb2Nlc3NGaWxlc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwcm9jZXNzRmlsZXMoZmlsZXMpIHtcbiAgICAgIHZhciBfaXRlcmF0b3IxOCA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGZpbGVzKSxcbiAgICAgICAgICBfc3RlcDE4O1xuXG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKF9pdGVyYXRvcjE4LnMoKTsgIShfc3RlcDE4ID0gX2l0ZXJhdG9yMTgubigpKS5kb25lOykge1xuICAgICAgICAgIHZhciBmaWxlID0gX3N0ZXAxOC52YWx1ZTtcbiAgICAgICAgICBmaWxlLnByb2Nlc3NpbmcgPSB0cnVlOyAvLyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuXG4gICAgICAgICAgZmlsZS5zdGF0dXMgPSBEcm9wem9uZS5VUExPQURJTkc7XG4gICAgICAgICAgdGhpcy5lbWl0KFwicHJvY2Vzc2luZ1wiLCBmaWxlKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9pdGVyYXRvcjE4LmUoZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIF9pdGVyYXRvcjE4LmYoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy51cGxvYWRNdWx0aXBsZSkge1xuICAgICAgICB0aGlzLmVtaXQoXCJwcm9jZXNzaW5nbXVsdGlwbGVcIiwgZmlsZXMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy51cGxvYWRGaWxlcyhmaWxlcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9nZXRGaWxlc1dpdGhYaHJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2dldEZpbGVzV2l0aFhocih4aHIpIHtcbiAgICAgIHZhciBmaWxlcztcbiAgICAgIHJldHVybiBmaWxlcyA9IHRoaXMuZmlsZXMuZmlsdGVyKGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgICAgIHJldHVybiBmaWxlLnhociA9PT0geGhyO1xuICAgICAgfSkubWFwKGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgICAgIHJldHVybiBmaWxlO1xuICAgICAgfSk7XG4gICAgfSAvLyBDYW5jZWxzIHRoZSBmaWxlIHVwbG9hZCBhbmQgc2V0cyB0aGUgc3RhdHVzIHRvIENBTkNFTEVEXG4gICAgLy8gKippZioqIHRoZSBmaWxlIGlzIGFjdHVhbGx5IGJlaW5nIHVwbG9hZGVkLlxuICAgIC8vIElmIGl0J3Mgc3RpbGwgaW4gdGhlIHF1ZXVlLCB0aGUgZmlsZSBpcyBiZWluZyByZW1vdmVkIGZyb20gaXQgYW5kIHRoZSBzdGF0dXNcbiAgICAvLyBzZXQgdG8gQ0FOQ0VMRUQuXG5cbiAgfSwge1xuICAgIGtleTogXCJjYW5jZWxVcGxvYWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2FuY2VsVXBsb2FkKGZpbGUpIHtcbiAgICAgIGlmIChmaWxlLnN0YXR1cyA9PT0gRHJvcHpvbmUuVVBMT0FESU5HKSB7XG4gICAgICAgIHZhciBncm91cGVkRmlsZXMgPSB0aGlzLl9nZXRGaWxlc1dpdGhYaHIoZmlsZS54aHIpO1xuXG4gICAgICAgIHZhciBfaXRlcmF0b3IxOSA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGdyb3VwZWRGaWxlcyksXG4gICAgICAgICAgICBfc3RlcDE5O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZm9yIChfaXRlcmF0b3IxOS5zKCk7ICEoX3N0ZXAxOSA9IF9pdGVyYXRvcjE5Lm4oKSkuZG9uZTspIHtcbiAgICAgICAgICAgIHZhciBncm91cGVkRmlsZSA9IF9zdGVwMTkudmFsdWU7XG4gICAgICAgICAgICBncm91cGVkRmlsZS5zdGF0dXMgPSBEcm9wem9uZS5DQU5DRUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIF9pdGVyYXRvcjE5LmUoZXJyKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBfaXRlcmF0b3IxOS5mKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGZpbGUueGhyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGZpbGUueGhyLmFib3J0KCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgX2l0ZXJhdG9yMjAgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihncm91cGVkRmlsZXMpLFxuICAgICAgICAgICAgX3N0ZXAyMDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAoX2l0ZXJhdG9yMjAucygpOyAhKF9zdGVwMjAgPSBfaXRlcmF0b3IyMC5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgICB2YXIgX2dyb3VwZWRGaWxlID0gX3N0ZXAyMC52YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuZW1pdChcImNhbmNlbGVkXCIsIF9ncm91cGVkRmlsZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBfaXRlcmF0b3IyMC5lKGVycik7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgX2l0ZXJhdG9yMjAuZigpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy51cGxvYWRNdWx0aXBsZSkge1xuICAgICAgICAgIHRoaXMuZW1pdChcImNhbmNlbGVkbXVsdGlwbGVcIiwgZ3JvdXBlZEZpbGVzKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChmaWxlLnN0YXR1cyA9PT0gRHJvcHpvbmUuQURERUQgfHwgZmlsZS5zdGF0dXMgPT09IERyb3B6b25lLlFVRVVFRCkge1xuICAgICAgICBmaWxlLnN0YXR1cyA9IERyb3B6b25lLkNBTkNFTEVEO1xuICAgICAgICB0aGlzLmVtaXQoXCJjYW5jZWxlZFwiLCBmaWxlKTtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnVwbG9hZE11bHRpcGxlKSB7XG4gICAgICAgICAgdGhpcy5lbWl0KFwiY2FuY2VsZWRtdWx0aXBsZVwiLCBbZmlsZV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXV0b1Byb2Nlc3NRdWV1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzUXVldWUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVzb2x2ZU9wdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXNvbHZlT3B0aW9uKG9wdGlvbikge1xuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZm9yICh2YXIgX2xlbjMgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4zID4gMSA/IF9sZW4zIC0gMSA6IDApLCBfa2V5MyA9IDE7IF9rZXkzIDwgX2xlbjM7IF9rZXkzKyspIHtcbiAgICAgICAgICBhcmdzW19rZXkzIC0gMV0gPSBhcmd1bWVudHNbX2tleTNdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9wdGlvbi5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9wdGlvbjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidXBsb2FkRmlsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1cGxvYWRGaWxlKGZpbGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnVwbG9hZEZpbGVzKFtmaWxlXSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInVwbG9hZEZpbGVzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVwbG9hZEZpbGVzKGZpbGVzKSB7XG4gICAgICB2YXIgX3RoaXMxNSA9IHRoaXM7XG5cbiAgICAgIHRoaXMuX3RyYW5zZm9ybUZpbGVzKGZpbGVzLCBmdW5jdGlvbiAodHJhbnNmb3JtZWRGaWxlcykge1xuICAgICAgICBpZiAoX3RoaXMxNS5vcHRpb25zLmNodW5raW5nKSB7XG4gICAgICAgICAgLy8gQ2h1bmtpbmcgaXMgbm90IGFsbG93ZWQgdG8gYmUgdXNlZCB3aXRoIGB1cGxvYWRNdWx0aXBsZWAgc28gd2Uga25vd1xuICAgICAgICAgIC8vIHRoYXQgdGhlcmUgaXMgb25seSBfX29uZV9fZmlsZS5cbiAgICAgICAgICB2YXIgdHJhbnNmb3JtZWRGaWxlID0gdHJhbnNmb3JtZWRGaWxlc1swXTtcbiAgICAgICAgICBmaWxlc1swXS51cGxvYWQuY2h1bmtlZCA9IF90aGlzMTUub3B0aW9ucy5jaHVua2luZyAmJiAoX3RoaXMxNS5vcHRpb25zLmZvcmNlQ2h1bmtpbmcgfHwgdHJhbnNmb3JtZWRGaWxlLnNpemUgPiBfdGhpczE1Lm9wdGlvbnMuY2h1bmtTaXplKTtcbiAgICAgICAgICBmaWxlc1swXS51cGxvYWQudG90YWxDaHVua0NvdW50ID0gTWF0aC5jZWlsKHRyYW5zZm9ybWVkRmlsZS5zaXplIC8gX3RoaXMxNS5vcHRpb25zLmNodW5rU2l6ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmlsZXNbMF0udXBsb2FkLmNodW5rZWQpIHtcbiAgICAgICAgICAvLyBUaGlzIGZpbGUgc2hvdWxkIGJlIHNlbnQgaW4gY2h1bmtzIVxuICAgICAgICAgIC8vIElmIHRoZSBjaHVua2luZyBvcHRpb24gaXMgc2V0LCB3ZSAqKmtub3cqKiB0aGF0IHRoZXJlIGNhbiBvbmx5IGJlICoqb25lKiogZmlsZSwgc2luY2VcbiAgICAgICAgICAvLyB1cGxvYWRNdWx0aXBsZSBpcyBub3QgYWxsb3dlZCB3aXRoIHRoaXMgb3B0aW9uLlxuICAgICAgICAgIHZhciBmaWxlID0gZmlsZXNbMF07XG4gICAgICAgICAgdmFyIF90cmFuc2Zvcm1lZEZpbGUgPSB0cmFuc2Zvcm1lZEZpbGVzWzBdO1xuICAgICAgICAgIHZhciBzdGFydGVkQ2h1bmtDb3VudCA9IDA7XG4gICAgICAgICAgZmlsZS51cGxvYWQuY2h1bmtzID0gW107XG5cbiAgICAgICAgICB2YXIgaGFuZGxlTmV4dENodW5rID0gZnVuY3Rpb24gaGFuZGxlTmV4dENodW5rKCkge1xuICAgICAgICAgICAgdmFyIGNodW5rSW5kZXggPSAwOyAvLyBGaW5kIHRoZSBuZXh0IGl0ZW0gaW4gZmlsZS51cGxvYWQuY2h1bmtzIHRoYXQgaXMgbm90IGRlZmluZWQgeWV0LlxuXG4gICAgICAgICAgICB3aGlsZSAoZmlsZS51cGxvYWQuY2h1bmtzW2NodW5rSW5kZXhdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgY2h1bmtJbmRleCsrO1xuICAgICAgICAgICAgfSAvLyBUaGlzIG1lYW5zLCB0aGF0IGFsbCBjaHVua3MgaGF2ZSBhbHJlYWR5IGJlZW4gc3RhcnRlZC5cblxuXG4gICAgICAgICAgICBpZiAoY2h1bmtJbmRleCA+PSBmaWxlLnVwbG9hZC50b3RhbENodW5rQ291bnQpIHJldHVybjtcbiAgICAgICAgICAgIHN0YXJ0ZWRDaHVua0NvdW50Kys7XG4gICAgICAgICAgICB2YXIgc3RhcnQgPSBjaHVua0luZGV4ICogX3RoaXMxNS5vcHRpb25zLmNodW5rU2l6ZTtcbiAgICAgICAgICAgIHZhciBlbmQgPSBNYXRoLm1pbihzdGFydCArIF90aGlzMTUub3B0aW9ucy5jaHVua1NpemUsIF90cmFuc2Zvcm1lZEZpbGUuc2l6ZSk7XG4gICAgICAgICAgICB2YXIgZGF0YUJsb2NrID0ge1xuICAgICAgICAgICAgICBuYW1lOiBfdGhpczE1Ll9nZXRQYXJhbU5hbWUoMCksXG4gICAgICAgICAgICAgIGRhdGE6IF90cmFuc2Zvcm1lZEZpbGUud2Via2l0U2xpY2UgPyBfdHJhbnNmb3JtZWRGaWxlLndlYmtpdFNsaWNlKHN0YXJ0LCBlbmQpIDogX3RyYW5zZm9ybWVkRmlsZS5zbGljZShzdGFydCwgZW5kKSxcbiAgICAgICAgICAgICAgZmlsZW5hbWU6IGZpbGUudXBsb2FkLmZpbGVuYW1lLFxuICAgICAgICAgICAgICBjaHVua0luZGV4OiBjaHVua0luZGV4XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZmlsZS51cGxvYWQuY2h1bmtzW2NodW5rSW5kZXhdID0ge1xuICAgICAgICAgICAgICBmaWxlOiBmaWxlLFxuICAgICAgICAgICAgICBpbmRleDogY2h1bmtJbmRleCxcbiAgICAgICAgICAgICAgZGF0YUJsb2NrOiBkYXRhQmxvY2ssXG4gICAgICAgICAgICAgIC8vIEluIGNhc2Ugd2Ugd2FudCB0byByZXRyeS5cbiAgICAgICAgICAgICAgc3RhdHVzOiBEcm9wem9uZS5VUExPQURJTkcsXG4gICAgICAgICAgICAgIHByb2dyZXNzOiAwLFxuICAgICAgICAgICAgICByZXRyaWVzOiAwIC8vIFRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBibG9jayBoYXMgYmVlbiByZXRyaWVkLlxuXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBfdGhpczE1Ll91cGxvYWREYXRhKGZpbGVzLCBbZGF0YUJsb2NrXSk7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGZpbGUudXBsb2FkLmZpbmlzaGVkQ2h1bmtVcGxvYWQgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICAgICAgICAgIHZhciBhbGxGaW5pc2hlZCA9IHRydWU7XG4gICAgICAgICAgICBjaHVuay5zdGF0dXMgPSBEcm9wem9uZS5TVUNDRVNTOyAvLyBDbGVhciB0aGUgZGF0YSBmcm9tIHRoZSBjaHVua1xuXG4gICAgICAgICAgICBjaHVuay5kYXRhQmxvY2sgPSBudWxsOyAvLyBMZWF2aW5nIHRoaXMgcmVmZXJlbmNlIHRvIHhociBpbnRhY3QgaGVyZSB3aWxsIGNhdXNlIG1lbW9yeSBsZWFrcyBpbiBzb21lIGJyb3dzZXJzXG5cbiAgICAgICAgICAgIGNodW5rLnhociA9IG51bGw7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmlsZS51cGxvYWQudG90YWxDaHVua0NvdW50OyBpKyspIHtcbiAgICAgICAgICAgICAgaWYgKGZpbGUudXBsb2FkLmNodW5rc1tpXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZU5leHRDaHVuaygpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKGZpbGUudXBsb2FkLmNodW5rc1tpXS5zdGF0dXMgIT09IERyb3B6b25lLlNVQ0NFU1MpIHtcbiAgICAgICAgICAgICAgICBhbGxGaW5pc2hlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChhbGxGaW5pc2hlZCkge1xuICAgICAgICAgICAgICBfdGhpczE1Lm9wdGlvbnMuY2h1bmtzVXBsb2FkZWQoZmlsZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIF90aGlzMTUuX2ZpbmlzaGVkKGZpbGVzLCAnJywgbnVsbCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBpZiAoX3RoaXMxNS5vcHRpb25zLnBhcmFsbGVsQ2h1bmtVcGxvYWRzKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbGUudXBsb2FkLnRvdGFsQ2h1bmtDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICAgIGhhbmRsZU5leHRDaHVuaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoYW5kbGVOZXh0Q2h1bmsoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIGRhdGFCbG9ja3MgPSBbXTtcblxuICAgICAgICAgIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IGZpbGVzLmxlbmd0aDsgX2kzKyspIHtcbiAgICAgICAgICAgIGRhdGFCbG9ja3NbX2kzXSA9IHtcbiAgICAgICAgICAgICAgbmFtZTogX3RoaXMxNS5fZ2V0UGFyYW1OYW1lKF9pMyksXG4gICAgICAgICAgICAgIGRhdGE6IHRyYW5zZm9ybWVkRmlsZXNbX2kzXSxcbiAgICAgICAgICAgICAgZmlsZW5hbWU6IGZpbGVzW19pM10udXBsb2FkLmZpbGVuYW1lXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF90aGlzMTUuX3VwbG9hZERhdGEoZmlsZXMsIGRhdGFCbG9ja3MpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IC8vLyBSZXR1cm5zIHRoZSByaWdodCBjaHVuayBmb3IgZ2l2ZW4gZmlsZSBhbmQgeGhyXG5cbiAgfSwge1xuICAgIGtleTogXCJfZ2V0Q2h1bmtcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2dldENodW5rKGZpbGUsIHhocikge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWxlLnVwbG9hZC50b3RhbENodW5rQ291bnQ7IGkrKykge1xuICAgICAgICBpZiAoZmlsZS51cGxvYWQuY2h1bmtzW2ldICE9PSB1bmRlZmluZWQgJiYgZmlsZS51cGxvYWQuY2h1bmtzW2ldLnhociA9PT0geGhyKSB7XG4gICAgICAgICAgcmV0dXJuIGZpbGUudXBsb2FkLmNodW5rc1tpXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8gVGhpcyBmdW5jdGlvbiBhY3R1YWxseSB1cGxvYWRzIHRoZSBmaWxlKHMpIHRvIHRoZSBzZXJ2ZXIuXG4gICAgLy8gSWYgZGF0YUJsb2NrcyBjb250YWlucyB0aGUgYWN0dWFsIGRhdGEgdG8gdXBsb2FkIChtZWFuaW5nLCB0aGF0IHRoaXMgY291bGQgZWl0aGVyIGJlIHRyYW5zZm9ybWVkXG4gICAgLy8gZmlsZXMsIG9yIGluZGl2aWR1YWwgY2h1bmtzIGZvciBjaHVua2VkIHVwbG9hZCkuXG5cbiAgfSwge1xuICAgIGtleTogXCJfdXBsb2FkRGF0YVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfdXBsb2FkRGF0YShmaWxlcywgZGF0YUJsb2Nrcykge1xuICAgICAgdmFyIF90aGlzMTYgPSB0aGlzO1xuXG4gICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7IC8vIFB1dCB0aGUgeGhyIG9iamVjdCBpbiB0aGUgZmlsZSBvYmplY3RzIHRvIGJlIGFibGUgdG8gcmVmZXJlbmNlIGl0IGxhdGVyLlxuXG4gICAgICB2YXIgX2l0ZXJhdG9yMjEgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihmaWxlcyksXG4gICAgICAgICAgX3N0ZXAyMTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChfaXRlcmF0b3IyMS5zKCk7ICEoX3N0ZXAyMSA9IF9pdGVyYXRvcjIxLm4oKSkuZG9uZTspIHtcbiAgICAgICAgICB2YXIgZmlsZSA9IF9zdGVwMjEudmFsdWU7XG4gICAgICAgICAgZmlsZS54aHIgPSB4aHI7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfaXRlcmF0b3IyMS5lKGVycik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBfaXRlcmF0b3IyMS5mKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChmaWxlc1swXS51cGxvYWQuY2h1bmtlZCkge1xuICAgICAgICAvLyBQdXQgdGhlIHhociBvYmplY3QgaW4gdGhlIHJpZ2h0IGNodW5rIG9iamVjdCwgc28gaXQgY2FuIGJlIGFzc29jaWF0ZWQgbGF0ZXIsIGFuZCBmb3VuZCB3aXRoIF9nZXRDaHVua1xuICAgICAgICBmaWxlc1swXS51cGxvYWQuY2h1bmtzW2RhdGFCbG9ja3NbMF0uY2h1bmtJbmRleF0ueGhyID0geGhyO1xuICAgICAgfVxuXG4gICAgICB2YXIgbWV0aG9kID0gdGhpcy5yZXNvbHZlT3B0aW9uKHRoaXMub3B0aW9ucy5tZXRob2QsIGZpbGVzKTtcbiAgICAgIHZhciB1cmwgPSB0aGlzLnJlc29sdmVPcHRpb24odGhpcy5vcHRpb25zLnVybCwgZmlsZXMpO1xuICAgICAgeGhyLm9wZW4obWV0aG9kLCB1cmwsIHRydWUpOyAvLyBTZXR0aW5nIHRoZSB0aW1lb3V0IGFmdGVyIG9wZW4gYmVjYXVzZSBvZiBJRTExIGlzc3VlOiBodHRwczovL2dpdGxhYi5jb20vbWVuby9kcm9wem9uZS9pc3N1ZXMvOFxuXG4gICAgICB4aHIudGltZW91dCA9IHRoaXMucmVzb2x2ZU9wdGlvbih0aGlzLm9wdGlvbnMudGltZW91dCwgZmlsZXMpOyAvLyBIYXMgdG8gYmUgYWZ0ZXIgYC5vcGVuKClgLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VueW8vZHJvcHpvbmUvaXNzdWVzLzE3OVxuXG4gICAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gISF0aGlzLm9wdGlvbnMud2l0aENyZWRlbnRpYWxzO1xuXG4gICAgICB4aHIub25sb2FkID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgX3RoaXMxNi5fZmluaXNoZWRVcGxvYWRpbmcoZmlsZXMsIHhociwgZSk7XG4gICAgICB9O1xuXG4gICAgICB4aHIub250aW1lb3V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpczE2Ll9oYW5kbGVVcGxvYWRFcnJvcihmaWxlcywgeGhyLCBcIlJlcXVlc3QgdGltZWRvdXQgYWZ0ZXIgXCIuY29uY2F0KF90aGlzMTYub3B0aW9ucy50aW1lb3V0IC8gMTAwMCwgXCIgc2Vjb25kc1wiKSk7XG4gICAgICB9O1xuXG4gICAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXMxNi5faGFuZGxlVXBsb2FkRXJyb3IoZmlsZXMsIHhocik7XG4gICAgICB9OyAvLyBTb21lIGJyb3dzZXJzIGRvIG5vdCBoYXZlIHRoZSAudXBsb2FkIHByb3BlcnR5XG5cblxuICAgICAgdmFyIHByb2dyZXNzT2JqID0geGhyLnVwbG9hZCAhPSBudWxsID8geGhyLnVwbG9hZCA6IHhocjtcblxuICAgICAgcHJvZ3Jlc3NPYmoub25wcm9ncmVzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiBfdGhpczE2Ll91cGRhdGVGaWxlc1VwbG9hZFByb2dyZXNzKGZpbGVzLCB4aHIsIGUpO1xuICAgICAgfTtcblxuICAgICAgdmFyIGhlYWRlcnMgPSB7XG4gICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICBcIkNhY2hlLUNvbnRyb2xcIjogXCJuby1jYWNoZVwiLFxuICAgICAgICBcIlgtUmVxdWVzdGVkLVdpdGhcIjogXCJYTUxIdHRwUmVxdWVzdFwiXG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmhlYWRlcnMpIHtcbiAgICAgICAgRHJvcHpvbmUuZXh0ZW5kKGhlYWRlcnMsIHRoaXMub3B0aW9ucy5oZWFkZXJzKTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaGVhZGVyTmFtZSBpbiBoZWFkZXJzKSB7XG4gICAgICAgIHZhciBoZWFkZXJWYWx1ZSA9IGhlYWRlcnNbaGVhZGVyTmFtZV07XG5cbiAgICAgICAgaWYgKGhlYWRlclZhbHVlKSB7XG4gICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyTmFtZSwgaGVhZGVyVmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOyAvLyBBZGRpbmcgYWxsIEBvcHRpb25zIHBhcmFtZXRlcnNcblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5wYXJhbXMpIHtcbiAgICAgICAgdmFyIGFkZGl0aW9uYWxQYXJhbXMgPSB0aGlzLm9wdGlvbnMucGFyYW1zO1xuXG4gICAgICAgIGlmICh0eXBlb2YgYWRkaXRpb25hbFBhcmFtcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGFkZGl0aW9uYWxQYXJhbXMgPSBhZGRpdGlvbmFsUGFyYW1zLmNhbGwodGhpcywgZmlsZXMsIHhociwgZmlsZXNbMF0udXBsb2FkLmNodW5rZWQgPyB0aGlzLl9nZXRDaHVuayhmaWxlc1swXSwgeGhyKSA6IG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIga2V5IGluIGFkZGl0aW9uYWxQYXJhbXMpIHtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBhZGRpdGlvbmFsUGFyYW1zW2tleV07XG5cbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIC8vIFRoZSBhZGRpdGlvbmFsIHBhcmFtZXRlciBjb250YWlucyBhbiBhcnJheSxcbiAgICAgICAgICAgIC8vIHNvIGxldHMgaXRlcmF0ZSBvdmVyIGl0IHRvIGF0dGFjaCBlYWNoIHZhbHVlXG4gICAgICAgICAgICAvLyBpbmRpdmlkdWFsbHkuXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIHZhbHVlW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgdmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSAvLyBMZXQgdGhlIHVzZXIgYWRkIGFkZGl0aW9uYWwgZGF0YSBpZiBuZWNlc3NhcnlcblxuXG4gICAgICB2YXIgX2l0ZXJhdG9yMjIgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihmaWxlcyksXG4gICAgICAgICAgX3N0ZXAyMjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChfaXRlcmF0b3IyMi5zKCk7ICEoX3N0ZXAyMiA9IF9pdGVyYXRvcjIyLm4oKSkuZG9uZTspIHtcbiAgICAgICAgICB2YXIgX2ZpbGUgPSBfc3RlcDIyLnZhbHVlO1xuICAgICAgICAgIHRoaXMuZW1pdChcInNlbmRpbmdcIiwgX2ZpbGUsIHhociwgZm9ybURhdGEpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgX2l0ZXJhdG9yMjIuZShlcnIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgX2l0ZXJhdG9yMjIuZigpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnVwbG9hZE11bHRpcGxlKSB7XG4gICAgICAgIHRoaXMuZW1pdChcInNlbmRpbmdtdWx0aXBsZVwiLCBmaWxlcywgeGhyLCBmb3JtRGF0YSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2FkZEZvcm1FbGVtZW50RGF0YShmb3JtRGF0YSk7IC8vIEZpbmFsbHkgYWRkIHRoZSBmaWxlc1xuICAgICAgLy8gSGFzIHRvIGJlIGxhc3QgYmVjYXVzZSBzb21lIHNlcnZlcnMgKGVnOiBTMykgZXhwZWN0IHRoZSBmaWxlIHRvIGJlIHRoZSBsYXN0IHBhcmFtZXRlclxuXG5cbiAgICAgIGZvciAodmFyIF9pNCA9IDA7IF9pNCA8IGRhdGFCbG9ja3MubGVuZ3RoOyBfaTQrKykge1xuICAgICAgICB2YXIgZGF0YUJsb2NrID0gZGF0YUJsb2Nrc1tfaTRdO1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQoZGF0YUJsb2NrLm5hbWUsIGRhdGFCbG9jay5kYXRhLCBkYXRhQmxvY2suZmlsZW5hbWUpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnN1Ym1pdFJlcXVlc3QoeGhyLCBmb3JtRGF0YSwgZmlsZXMpO1xuICAgIH0gLy8gVHJhbnNmb3JtcyBhbGwgZmlsZXMgd2l0aCB0aGlzLm9wdGlvbnMudHJhbnNmb3JtRmlsZSBhbmQgaW52b2tlcyBkb25lIHdpdGggdGhlIHRyYW5zZm9ybWVkIGZpbGVzIHdoZW4gZG9uZS5cblxuICB9LCB7XG4gICAga2V5OiBcIl90cmFuc2Zvcm1GaWxlc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfdHJhbnNmb3JtRmlsZXMoZmlsZXMsIGRvbmUpIHtcbiAgICAgIHZhciBfdGhpczE3ID0gdGhpcztcblxuICAgICAgdmFyIHRyYW5zZm9ybWVkRmlsZXMgPSBbXTsgLy8gQ2x1bXN5IHdheSBvZiBoYW5kbGluZyBhc3luY2hyb25vdXMgY2FsbHMsIHVudGlsIEkgZ2V0IHRvIGFkZCBhIHByb3BlciBGdXR1cmUgbGlicmFyeS5cblxuICAgICAgdmFyIGRvbmVDb3VudGVyID0gMDtcblxuICAgICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoaSkge1xuICAgICAgICBfdGhpczE3Lm9wdGlvbnMudHJhbnNmb3JtRmlsZS5jYWxsKF90aGlzMTcsIGZpbGVzW2ldLCBmdW5jdGlvbiAodHJhbnNmb3JtZWRGaWxlKSB7XG4gICAgICAgICAgdHJhbnNmb3JtZWRGaWxlc1tpXSA9IHRyYW5zZm9ybWVkRmlsZTtcblxuICAgICAgICAgIGlmICgrK2RvbmVDb3VudGVyID09PSBmaWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRvbmUodHJhbnNmb3JtZWRGaWxlcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgX2xvb3AoaSk7XG4gICAgICB9XG4gICAgfSAvLyBUYWtlcyBjYXJlIG9mIGFkZGluZyBvdGhlciBpbnB1dCBlbGVtZW50cyBvZiB0aGUgZm9ybSB0byB0aGUgQUpBWCByZXF1ZXN0XG5cbiAgfSwge1xuICAgIGtleTogXCJfYWRkRm9ybUVsZW1lbnREYXRhXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9hZGRGb3JtRWxlbWVudERhdGEoZm9ybURhdGEpIHtcbiAgICAgIC8vIFRha2UgY2FyZSBvZiBvdGhlciBpbnB1dCBlbGVtZW50c1xuICAgICAgaWYgKHRoaXMuZWxlbWVudC50YWdOYW1lID09PSBcIkZPUk1cIikge1xuICAgICAgICB2YXIgX2l0ZXJhdG9yMjMgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcih0aGlzLmVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcImlucHV0LCB0ZXh0YXJlYSwgc2VsZWN0LCBidXR0b25cIikpLFxuICAgICAgICAgICAgX3N0ZXAyMztcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAoX2l0ZXJhdG9yMjMucygpOyAhKF9zdGVwMjMgPSBfaXRlcmF0b3IyMy5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgICB2YXIgaW5wdXQgPSBfc3RlcDIzLnZhbHVlO1xuICAgICAgICAgICAgdmFyIGlucHV0TmFtZSA9IGlucHV0LmdldEF0dHJpYnV0ZShcIm5hbWVcIik7XG4gICAgICAgICAgICB2YXIgaW5wdXRUeXBlID0gaW5wdXQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKTtcbiAgICAgICAgICAgIGlmIChpbnB1dFR5cGUpIGlucHV0VHlwZSA9IGlucHV0VHlwZS50b0xvd2VyQ2FzZSgpOyAvLyBJZiB0aGUgaW5wdXQgZG9lc24ndCBoYXZlIGEgbmFtZSwgd2UgY2FuJ3QgdXNlIGl0LlxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGlucHV0TmFtZSA9PT0gJ3VuZGVmaW5lZCcgfHwgaW5wdXROYW1lID09PSBudWxsKSBjb250aW51ZTtcblxuICAgICAgICAgICAgaWYgKGlucHV0LnRhZ05hbWUgPT09IFwiU0VMRUNUXCIgJiYgaW5wdXQuaGFzQXR0cmlidXRlKFwibXVsdGlwbGVcIikpIHtcbiAgICAgICAgICAgICAgLy8gUG9zc2libHkgbXVsdGlwbGUgdmFsdWVzXG4gICAgICAgICAgICAgIHZhciBfaXRlcmF0b3IyNCA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGlucHV0Lm9wdGlvbnMpLFxuICAgICAgICAgICAgICAgICAgX3N0ZXAyNDtcblxuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZvciAoX2l0ZXJhdG9yMjQucygpOyAhKF9zdGVwMjQgPSBfaXRlcmF0b3IyNC5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgICAgICAgICB2YXIgb3B0aW9uID0gX3N0ZXAyNC52YWx1ZTtcblxuICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbi5zZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoaW5wdXROYW1lLCBvcHRpb24udmFsdWUpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgX2l0ZXJhdG9yMjQuZShlcnIpO1xuICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIF9pdGVyYXRvcjI0LmYoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICghaW5wdXRUeXBlIHx8IGlucHV0VHlwZSAhPT0gXCJjaGVja2JveFwiICYmIGlucHV0VHlwZSAhPT0gXCJyYWRpb1wiIHx8IGlucHV0LmNoZWNrZWQpIHtcbiAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGlucHV0TmFtZSwgaW5wdXQudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgX2l0ZXJhdG9yMjMuZShlcnIpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIF9pdGVyYXRvcjIzLmYoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8gSW52b2tlZCB3aGVuIHRoZXJlIGlzIG5ldyBwcm9ncmVzcyBpbmZvcm1hdGlvbiBhYm91dCBnaXZlbiBmaWxlcy5cbiAgICAvLyBJZiBlIGlzIG5vdCBwcm92aWRlZCwgaXQgaXMgYXNzdW1lZCB0aGF0IHRoZSB1cGxvYWQgaXMgZmluaXNoZWQuXG5cbiAgfSwge1xuICAgIGtleTogXCJfdXBkYXRlRmlsZXNVcGxvYWRQcm9ncmVzc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfdXBkYXRlRmlsZXNVcGxvYWRQcm9ncmVzcyhmaWxlcywgeGhyLCBlKSB7XG4gICAgICB2YXIgcHJvZ3Jlc3M7XG5cbiAgICAgIGlmICh0eXBlb2YgZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcHJvZ3Jlc3MgPSAxMDAgKiBlLmxvYWRlZCAvIGUudG90YWw7XG5cbiAgICAgICAgaWYgKGZpbGVzWzBdLnVwbG9hZC5jaHVua2VkKSB7XG4gICAgICAgICAgdmFyIGZpbGUgPSBmaWxlc1swXTsgLy8gU2luY2UgdGhpcyBpcyBhIGNodW5rZWQgdXBsb2FkLCB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgYXBwcm9wcmlhdGUgY2h1bmsgcHJvZ3Jlc3MuXG5cbiAgICAgICAgICB2YXIgY2h1bmsgPSB0aGlzLl9nZXRDaHVuayhmaWxlLCB4aHIpO1xuXG4gICAgICAgICAgY2h1bmsucHJvZ3Jlc3MgPSBwcm9ncmVzcztcbiAgICAgICAgICBjaHVuay50b3RhbCA9IGUudG90YWw7XG4gICAgICAgICAgY2h1bmsuYnl0ZXNTZW50ID0gZS5sb2FkZWQ7XG4gICAgICAgICAgdmFyIGZpbGVQcm9ncmVzcyA9IDAsXG4gICAgICAgICAgICAgIGZpbGVUb3RhbCxcbiAgICAgICAgICAgICAgZmlsZUJ5dGVzU2VudDtcbiAgICAgICAgICBmaWxlLnVwbG9hZC5wcm9ncmVzcyA9IDA7XG4gICAgICAgICAgZmlsZS51cGxvYWQudG90YWwgPSAwO1xuICAgICAgICAgIGZpbGUudXBsb2FkLmJ5dGVzU2VudCA9IDA7XG5cbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbGUudXBsb2FkLnRvdGFsQ2h1bmtDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoZmlsZS51cGxvYWQuY2h1bmtzW2ldICE9PSB1bmRlZmluZWQgJiYgZmlsZS51cGxvYWQuY2h1bmtzW2ldLnByb2dyZXNzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgZmlsZS51cGxvYWQucHJvZ3Jlc3MgKz0gZmlsZS51cGxvYWQuY2h1bmtzW2ldLnByb2dyZXNzO1xuICAgICAgICAgICAgICBmaWxlLnVwbG9hZC50b3RhbCArPSBmaWxlLnVwbG9hZC5jaHVua3NbaV0udG90YWw7XG4gICAgICAgICAgICAgIGZpbGUudXBsb2FkLmJ5dGVzU2VudCArPSBmaWxlLnVwbG9hZC5jaHVua3NbaV0uYnl0ZXNTZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGZpbGUudXBsb2FkLnByb2dyZXNzID0gZmlsZS51cGxvYWQucHJvZ3Jlc3MgLyBmaWxlLnVwbG9hZC50b3RhbENodW5rQ291bnQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIF9pdGVyYXRvcjI1ID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoZmlsZXMpLFxuICAgICAgICAgICAgICBfc3RlcDI1O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAoX2l0ZXJhdG9yMjUucygpOyAhKF9zdGVwMjUgPSBfaXRlcmF0b3IyNS5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgICAgIHZhciBfZmlsZTIgPSBfc3RlcDI1LnZhbHVlO1xuICAgICAgICAgICAgICBfZmlsZTIudXBsb2FkLnByb2dyZXNzID0gcHJvZ3Jlc3M7XG4gICAgICAgICAgICAgIF9maWxlMi51cGxvYWQudG90YWwgPSBlLnRvdGFsO1xuICAgICAgICAgICAgICBfZmlsZTIudXBsb2FkLmJ5dGVzU2VudCA9IGUubG9hZGVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgX2l0ZXJhdG9yMjUuZShlcnIpO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBfaXRlcmF0b3IyNS5mKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIF9pdGVyYXRvcjI2ID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoZmlsZXMpLFxuICAgICAgICAgICAgX3N0ZXAyNjtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAoX2l0ZXJhdG9yMjYucygpOyAhKF9zdGVwMjYgPSBfaXRlcmF0b3IyNi5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgICB2YXIgX2ZpbGUzID0gX3N0ZXAyNi52YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuZW1pdChcInVwbG9hZHByb2dyZXNzXCIsIF9maWxlMywgX2ZpbGUzLnVwbG9hZC5wcm9ncmVzcywgX2ZpbGUzLnVwbG9hZC5ieXRlc1NlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgX2l0ZXJhdG9yMjYuZShlcnIpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIF9pdGVyYXRvcjI2LmYoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQ2FsbGVkIHdoZW4gdGhlIGZpbGUgZmluaXNoZWQgdXBsb2FkaW5nXG4gICAgICAgIHZhciBhbGxGaWxlc0ZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgcHJvZ3Jlc3MgPSAxMDA7XG5cbiAgICAgICAgdmFyIF9pdGVyYXRvcjI3ID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoZmlsZXMpLFxuICAgICAgICAgICAgX3N0ZXAyNztcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAoX2l0ZXJhdG9yMjcucygpOyAhKF9zdGVwMjcgPSBfaXRlcmF0b3IyNy5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgICB2YXIgX2ZpbGU0ID0gX3N0ZXAyNy52YWx1ZTtcblxuICAgICAgICAgICAgaWYgKF9maWxlNC51cGxvYWQucHJvZ3Jlc3MgIT09IDEwMCB8fCBfZmlsZTQudXBsb2FkLmJ5dGVzU2VudCAhPT0gX2ZpbGU0LnVwbG9hZC50b3RhbCkge1xuICAgICAgICAgICAgICBhbGxGaWxlc0ZpbmlzaGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF9maWxlNC51cGxvYWQucHJvZ3Jlc3MgPSBwcm9ncmVzcztcbiAgICAgICAgICAgIF9maWxlNC51cGxvYWQuYnl0ZXNTZW50ID0gX2ZpbGU0LnVwbG9hZC50b3RhbDtcbiAgICAgICAgICB9IC8vIE5vdGhpbmcgdG8gZG8sIGFsbCBmaWxlcyBhbHJlYWR5IGF0IDEwMCVcblxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBfaXRlcmF0b3IyNy5lKGVycik7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgX2l0ZXJhdG9yMjcuZigpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFsbEZpbGVzRmluaXNoZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgX2l0ZXJhdG9yMjggPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihmaWxlcyksXG4gICAgICAgICAgICBfc3RlcDI4O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZm9yIChfaXRlcmF0b3IyOC5zKCk7ICEoX3N0ZXAyOCA9IF9pdGVyYXRvcjI4Lm4oKSkuZG9uZTspIHtcbiAgICAgICAgICAgIHZhciBfZmlsZTUgPSBfc3RlcDI4LnZhbHVlO1xuICAgICAgICAgICAgdGhpcy5lbWl0KFwidXBsb2FkcHJvZ3Jlc3NcIiwgX2ZpbGU1LCBwcm9ncmVzcywgX2ZpbGU1LnVwbG9hZC5ieXRlc1NlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgX2l0ZXJhdG9yMjguZShlcnIpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIF9pdGVyYXRvcjI4LmYoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfZmluaXNoZWRVcGxvYWRpbmdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2ZpbmlzaGVkVXBsb2FkaW5nKGZpbGVzLCB4aHIsIGUpIHtcbiAgICAgIHZhciByZXNwb25zZTtcblxuICAgICAgaWYgKGZpbGVzWzBdLnN0YXR1cyA9PT0gRHJvcHpvbmUuQ0FOQ0VMRUQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgIT09IDQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoeGhyLnJlc3BvbnNlVHlwZSAhPT0gJ2FycmF5YnVmZmVyJyAmJiB4aHIucmVzcG9uc2VUeXBlICE9PSAnYmxvYicpIHtcbiAgICAgICAgcmVzcG9uc2UgPSB4aHIucmVzcG9uc2VUZXh0O1xuXG4gICAgICAgIGlmICh4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoXCJjb250ZW50LXR5cGVcIikgJiYgfnhoci5nZXRSZXNwb25zZUhlYWRlcihcImNvbnRlbnQtdHlwZVwiKS5pbmRleE9mKFwiYXBwbGljYXRpb24vanNvblwiKSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXNwb25zZSA9IEpTT04ucGFyc2UocmVzcG9uc2UpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBlID0gZXJyb3I7XG4gICAgICAgICAgICByZXNwb25zZSA9IFwiSW52YWxpZCBKU09OIHJlc3BvbnNlIGZyb20gc2VydmVyLlwiO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLl91cGRhdGVGaWxlc1VwbG9hZFByb2dyZXNzKGZpbGVzKTtcblxuICAgICAgaWYgKCEoMjAwIDw9IHhoci5zdGF0dXMgJiYgeGhyLnN0YXR1cyA8IDMwMCkpIHtcbiAgICAgICAgdGhpcy5faGFuZGxlVXBsb2FkRXJyb3IoZmlsZXMsIHhociwgcmVzcG9uc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGZpbGVzWzBdLnVwbG9hZC5jaHVua2VkKSB7XG4gICAgICAgICAgZmlsZXNbMF0udXBsb2FkLmZpbmlzaGVkQ2h1bmtVcGxvYWQodGhpcy5fZ2V0Q2h1bmsoZmlsZXNbMF0sIHhocikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX2ZpbmlzaGVkKGZpbGVzLCByZXNwb25zZSwgZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX2hhbmRsZVVwbG9hZEVycm9yXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9oYW5kbGVVcGxvYWRFcnJvcihmaWxlcywgeGhyLCByZXNwb25zZSkge1xuICAgICAgaWYgKGZpbGVzWzBdLnN0YXR1cyA9PT0gRHJvcHpvbmUuQ0FOQ0VMRUQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmlsZXNbMF0udXBsb2FkLmNodW5rZWQgJiYgdGhpcy5vcHRpb25zLnJldHJ5Q2h1bmtzKSB7XG4gICAgICAgIHZhciBjaHVuayA9IHRoaXMuX2dldENodW5rKGZpbGVzWzBdLCB4aHIpO1xuXG4gICAgICAgIGlmIChjaHVuay5yZXRyaWVzKysgPCB0aGlzLm9wdGlvbnMucmV0cnlDaHVua3NMaW1pdCkge1xuICAgICAgICAgIHRoaXMuX3VwbG9hZERhdGEoZmlsZXMsIFtjaHVuay5kYXRhQmxvY2tdKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1JldHJpZWQgdGhpcyBjaHVuayB0b28gb2Z0ZW4uIEdpdmluZyB1cC4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9lcnJvclByb2Nlc3NpbmcoZmlsZXMsIHJlc3BvbnNlIHx8IHRoaXMub3B0aW9ucy5kaWN0UmVzcG9uc2VFcnJvci5yZXBsYWNlKFwie3tzdGF0dXNDb2RlfX1cIiwgeGhyLnN0YXR1cyksIHhocik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInN1Ym1pdFJlcXVlc3RcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3VibWl0UmVxdWVzdCh4aHIsIGZvcm1EYXRhLCBmaWxlcykge1xuICAgICAgeGhyLnNlbmQoZm9ybURhdGEpO1xuICAgIH0gLy8gQ2FsbGVkIGludGVybmFsbHkgd2hlbiBwcm9jZXNzaW5nIGlzIGZpbmlzaGVkLlxuICAgIC8vIEluZGl2aWR1YWwgY2FsbGJhY2tzIGhhdmUgdG8gYmUgY2FsbGVkIGluIHRoZSBhcHByb3ByaWF0ZSBzZWN0aW9ucy5cblxuICB9LCB7XG4gICAga2V5OiBcIl9maW5pc2hlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfZmluaXNoZWQoZmlsZXMsIHJlc3BvbnNlVGV4dCwgZSkge1xuICAgICAgdmFyIF9pdGVyYXRvcjI5ID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoZmlsZXMpLFxuICAgICAgICAgIF9zdGVwMjk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoX2l0ZXJhdG9yMjkucygpOyAhKF9zdGVwMjkgPSBfaXRlcmF0b3IyOS5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgdmFyIGZpbGUgPSBfc3RlcDI5LnZhbHVlO1xuICAgICAgICAgIGZpbGUuc3RhdHVzID0gRHJvcHpvbmUuU1VDQ0VTUztcbiAgICAgICAgICB0aGlzLmVtaXQoXCJzdWNjZXNzXCIsIGZpbGUsIHJlc3BvbnNlVGV4dCwgZSk7XG4gICAgICAgICAgdGhpcy5lbWl0KFwiY29tcGxldGVcIiwgZmlsZSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfaXRlcmF0b3IyOS5lKGVycik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBfaXRlcmF0b3IyOS5mKCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMudXBsb2FkTXVsdGlwbGUpIHtcbiAgICAgICAgdGhpcy5lbWl0KFwic3VjY2Vzc211bHRpcGxlXCIsIGZpbGVzLCByZXNwb25zZVRleHQsIGUpO1xuICAgICAgICB0aGlzLmVtaXQoXCJjb21wbGV0ZW11bHRpcGxlXCIsIGZpbGVzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5hdXRvUHJvY2Vzc1F1ZXVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NRdWV1ZSgpO1xuICAgICAgfVxuICAgIH0gLy8gQ2FsbGVkIGludGVybmFsbHkgd2hlbiBwcm9jZXNzaW5nIGlzIGZpbmlzaGVkLlxuICAgIC8vIEluZGl2aWR1YWwgY2FsbGJhY2tzIGhhdmUgdG8gYmUgY2FsbGVkIGluIHRoZSBhcHByb3ByaWF0ZSBzZWN0aW9ucy5cblxuICB9LCB7XG4gICAga2V5OiBcIl9lcnJvclByb2Nlc3NpbmdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2Vycm9yUHJvY2Vzc2luZyhmaWxlcywgbWVzc2FnZSwgeGhyKSB7XG4gICAgICB2YXIgX2l0ZXJhdG9yMzAgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihmaWxlcyksXG4gICAgICAgICAgX3N0ZXAzMDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChfaXRlcmF0b3IzMC5zKCk7ICEoX3N0ZXAzMCA9IF9pdGVyYXRvcjMwLm4oKSkuZG9uZTspIHtcbiAgICAgICAgICB2YXIgZmlsZSA9IF9zdGVwMzAudmFsdWU7XG4gICAgICAgICAgZmlsZS5zdGF0dXMgPSBEcm9wem9uZS5FUlJPUjtcbiAgICAgICAgICB0aGlzLmVtaXQoXCJlcnJvclwiLCBmaWxlLCBtZXNzYWdlLCB4aHIpO1xuICAgICAgICAgIHRoaXMuZW1pdChcImNvbXBsZXRlXCIsIGZpbGUpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgX2l0ZXJhdG9yMzAuZShlcnIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgX2l0ZXJhdG9yMzAuZigpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnVwbG9hZE11bHRpcGxlKSB7XG4gICAgICAgIHRoaXMuZW1pdChcImVycm9ybXVsdGlwbGVcIiwgZmlsZXMsIG1lc3NhZ2UsIHhocik7XG4gICAgICAgIHRoaXMuZW1pdChcImNvbXBsZXRlbXVsdGlwbGVcIiwgZmlsZXMpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmF1dG9Qcm9jZXNzUXVldWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1F1ZXVlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6IFwidXVpZHY0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHV1aWR2NCgpIHtcbiAgICAgIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uIChjKSB7XG4gICAgICAgIHZhciByID0gTWF0aC5yYW5kb20oKSAqIDE2IHwgMCxcbiAgICAgICAgICAgIHYgPSBjID09PSAneCcgPyByIDogciAmIDB4MyB8IDB4ODtcbiAgICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIERyb3B6b25lO1xufShFbWl0dGVyKTtcblxuRHJvcHpvbmUuaW5pdENsYXNzKCk7XG5Ecm9wem9uZS52ZXJzaW9uID0gXCI1LjcuMlwiOyAvLyBUaGlzIGlzIGEgbWFwIG9mIG9wdGlvbnMgZm9yIHlvdXIgZGlmZmVyZW50IGRyb3B6b25lcy4gQWRkIGNvbmZpZ3VyYXRpb25zXG4vLyB0byB0aGlzIG9iamVjdCBmb3IgeW91ciBkaWZmZXJlbnQgZHJvcHpvbmUgZWxlbWVucy5cbi8vXG4vLyBFeGFtcGxlOlxuLy9cbi8vICAgICBEcm9wem9uZS5vcHRpb25zLm15RHJvcHpvbmVFbGVtZW50SWQgPSB7IG1heEZpbGVzaXplOiAxIH07XG4vL1xuLy8gVG8gZGlzYWJsZSBhdXRvRGlzY292ZXIgZm9yIGEgc3BlY2lmaWMgZWxlbWVudCwgeW91IGNhbiBzZXQgYGZhbHNlYCBhcyBhbiBvcHRpb246XG4vL1xuLy8gICAgIERyb3B6b25lLm9wdGlvbnMubXlEaXNhYmxlZEVsZW1lbnRJZCA9IGZhbHNlO1xuLy9cbi8vIEFuZCBpbiBodG1sOlxuLy9cbi8vICAgICA8Zm9ybSBhY3Rpb249XCIvdXBsb2FkXCIgaWQ9XCJteS1kcm9wem9uZS1lbGVtZW50LWlkXCIgY2xhc3M9XCJkcm9wem9uZVwiPjwvZm9ybT5cblxuRHJvcHpvbmUub3B0aW9ucyA9IHt9OyAvLyBSZXR1cm5zIHRoZSBvcHRpb25zIGZvciBhbiBlbGVtZW50IG9yIHVuZGVmaW5lZCBpZiBub25lIGF2YWlsYWJsZS5cblxuRHJvcHpvbmUub3B0aW9uc0ZvckVsZW1lbnQgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAvLyBHZXQgdGhlIGBEcm9wem9uZS5vcHRpb25zLmVsZW1lbnRJZGAgZm9yIHRoaXMgZWxlbWVudCBpZiBpdCBleGlzdHNcbiAgaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiaWRcIikpIHtcbiAgICByZXR1cm4gRHJvcHpvbmUub3B0aW9uc1tjYW1lbGl6ZShlbGVtZW50LmdldEF0dHJpYnV0ZShcImlkXCIpKV07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufTsgLy8gSG9sZHMgYSBsaXN0IG9mIGFsbCBkcm9wem9uZSBpbnN0YW5jZXNcblxuXG5Ecm9wem9uZS5pbnN0YW5jZXMgPSBbXTsgLy8gUmV0dXJucyB0aGUgZHJvcHpvbmUgZm9yIGdpdmVuIGVsZW1lbnQgaWYgYW55XG5cbkRyb3B6b25lLmZvckVsZW1lbnQgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICBpZiAodHlwZW9mIGVsZW1lbnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlbGVtZW50KTtcbiAgfVxuXG4gIGlmICgoZWxlbWVudCAhPSBudWxsID8gZWxlbWVudC5kcm9wem9uZSA6IHVuZGVmaW5lZCkgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vIERyb3B6b25lIGZvdW5kIGZvciBnaXZlbiBlbGVtZW50LiBUaGlzIGlzIHByb2JhYmx5IGJlY2F1c2UgeW91J3JlIHRyeWluZyB0byBhY2Nlc3MgaXQgYmVmb3JlIERyb3B6b25lIGhhZCB0aGUgdGltZSB0byBpbml0aWFsaXplLiBVc2UgdGhlIGBpbml0YCBvcHRpb24gdG8gc2V0dXAgYW55IGFkZGl0aW9uYWwgb2JzZXJ2ZXJzIG9uIHlvdXIgRHJvcHpvbmUuXCIpO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQuZHJvcHpvbmU7XG59OyAvLyBTZXQgdG8gZmFsc2UgaWYgeW91IGRvbid0IHdhbnQgRHJvcHpvbmUgdG8gYXV0b21hdGljYWxseSBmaW5kIGFuZCBhdHRhY2ggdG8gLmRyb3B6b25lIGVsZW1lbnRzLlxuXG5cbkRyb3B6b25lLmF1dG9EaXNjb3ZlciA9IHRydWU7IC8vIExvb2tzIGZvciBhbGwgLmRyb3B6b25lIGVsZW1lbnRzIGFuZCBjcmVhdGVzIGEgZHJvcHpvbmUgZm9yIHRoZW1cblxuRHJvcHpvbmUuZGlzY292ZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBkcm9wem9uZXM7XG5cbiAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwpIHtcbiAgICBkcm9wem9uZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiLmRyb3B6b25lXCIpO1xuICB9IGVsc2Uge1xuICAgIGRyb3B6b25lcyA9IFtdOyAvLyBJRSA6KFxuXG4gICAgdmFyIGNoZWNrRWxlbWVudHMgPSBmdW5jdGlvbiBjaGVja0VsZW1lbnRzKGVsZW1lbnRzKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gW107XG5cbiAgICAgICAgdmFyIF9pdGVyYXRvcjMxID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoZWxlbWVudHMpLFxuICAgICAgICAgICAgX3N0ZXAzMTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAoX2l0ZXJhdG9yMzEucygpOyAhKF9zdGVwMzEgPSBfaXRlcmF0b3IzMS5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgICB2YXIgZWwgPSBfc3RlcDMxLnZhbHVlO1xuXG4gICAgICAgICAgICBpZiAoLyhefCApZHJvcHpvbmUoJHwgKS8udGVzdChlbC5jbGFzc05hbWUpKSB7XG4gICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGRyb3B6b25lcy5wdXNoKGVsKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXN1bHQucHVzaCh1bmRlZmluZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgX2l0ZXJhdG9yMzEuZShlcnIpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIF9pdGVyYXRvcjMxLmYoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KCk7XG4gICAgfTtcblxuICAgIGNoZWNrRWxlbWVudHMoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJkaXZcIikpO1xuICAgIGNoZWNrRWxlbWVudHMoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJmb3JtXCIpKTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuXG4gICAgdmFyIF9pdGVyYXRvcjMyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoZHJvcHpvbmVzKSxcbiAgICAgICAgX3N0ZXAzMjtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgKF9pdGVyYXRvcjMyLnMoKTsgIShfc3RlcDMyID0gX2l0ZXJhdG9yMzIubigpKS5kb25lOykge1xuICAgICAgICB2YXIgZHJvcHpvbmUgPSBfc3RlcDMyLnZhbHVlO1xuXG4gICAgICAgIC8vIENyZWF0ZSBhIGRyb3B6b25lIHVubGVzcyBhdXRvIGRpc2NvdmVyIGhhcyBiZWVuIGRpc2FibGVkIGZvciBzcGVjaWZpYyBlbGVtZW50XG4gICAgICAgIGlmIChEcm9wem9uZS5vcHRpb25zRm9yRWxlbWVudChkcm9wem9uZSkgIT09IGZhbHNlKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2gobmV3IERyb3B6b25lKGRyb3B6b25lKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgX2l0ZXJhdG9yMzIuZShlcnIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBfaXRlcmF0b3IzMi5mKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSgpO1xufTsgLy8gU2luY2UgdGhlIHdob2xlIERyYWcnbidEcm9wIEFQSSBpcyBwcmV0dHkgbmV3LCBzb21lIGJyb3dzZXJzIGltcGxlbWVudCBpdCxcbi8vIGJ1dCBub3QgY29ycmVjdGx5LlxuLy8gU28gSSBjcmVhdGVkIGEgYmxhY2tsaXN0IG9mIHVzZXJBZ2VudHMuIFllcywgeWVzLiBCcm93c2VyIHNuaWZmaW5nLCBJIGtub3cuXG4vLyBCdXQgd2hhdCB0byBkbyB3aGVuIGJyb3dzZXJzICp0aGVvcmV0aWNhbGx5KiBzdXBwb3J0IGFuIEFQSSwgYnV0IGNyYXNoXG4vLyB3aGVuIHVzaW5nIGl0LlxuLy9cbi8vIFRoaXMgaXMgYSBsaXN0IG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMgdGVzdGVkIGFnYWluc3QgbmF2aWdhdG9yLnVzZXJBZ2VudFxuLy9cbi8vICoqIEl0IHNob3VsZCBvbmx5IGJlIHVzZWQgb24gYnJvd3NlciB0aGF0ICpkbyogc3VwcG9ydCB0aGUgQVBJLCBidXRcbi8vIGluY29ycmVjdGx5ICoqXG4vL1xuXG5cbkRyb3B6b25lLmJsYWNrbGlzdGVkQnJvd3NlcnMgPSBbLy8gVGhlIG1hYyBvcyBhbmQgd2luZG93cyBwaG9uZSB2ZXJzaW9uIG9mIG9wZXJhIDEyIHNlZW1zIHRvIGhhdmUgYSBwcm9ibGVtIHdpdGggdGhlIEZpbGUgZHJhZyduJ2Ryb3AgQVBJLlxuL29wZXJhLiooTWFjaW50b3NofFdpbmRvd3MgUGhvbmUpLip2ZXJzaW9uXFwvMTIvaV07IC8vIENoZWNrcyBpZiB0aGUgYnJvd3NlciBpcyBzdXBwb3J0ZWRcblxuRHJvcHpvbmUuaXNCcm93c2VyU3VwcG9ydGVkID0gZnVuY3Rpb24gKCkge1xuICB2YXIgY2FwYWJsZUJyb3dzZXIgPSB0cnVlO1xuXG4gIGlmICh3aW5kb3cuRmlsZSAmJiB3aW5kb3cuRmlsZVJlYWRlciAmJiB3aW5kb3cuRmlsZUxpc3QgJiYgd2luZG93LkJsb2IgJiYgd2luZG93LkZvcm1EYXRhICYmIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IpIHtcbiAgICBpZiAoIShcImNsYXNzTGlzdFwiIGluIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpKSkge1xuICAgICAgY2FwYWJsZUJyb3dzZXIgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIGJyb3dzZXIgc3VwcG9ydHMgdGhlIEFQSSwgYnV0IG1heSBiZSBibGFja2xpc3RlZC5cbiAgICAgIHZhciBfaXRlcmF0b3IzMyA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKERyb3B6b25lLmJsYWNrbGlzdGVkQnJvd3NlcnMpLFxuICAgICAgICAgIF9zdGVwMzM7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoX2l0ZXJhdG9yMzMucygpOyAhKF9zdGVwMzMgPSBfaXRlcmF0b3IzMy5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgdmFyIHJlZ2V4ID0gX3N0ZXAzMy52YWx1ZTtcblxuICAgICAgICAgIGlmIChyZWdleC50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKSB7XG4gICAgICAgICAgICBjYXBhYmxlQnJvd3NlciA9IGZhbHNlO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgX2l0ZXJhdG9yMzMuZShlcnIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgX2l0ZXJhdG9yMzMuZigpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjYXBhYmxlQnJvd3NlciA9IGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGNhcGFibGVCcm93c2VyO1xufTtcblxuRHJvcHpvbmUuZGF0YVVSSXRvQmxvYiA9IGZ1bmN0aW9uIChkYXRhVVJJKSB7XG4gIC8vIGNvbnZlcnQgYmFzZTY0IHRvIHJhdyBiaW5hcnkgZGF0YSBoZWxkIGluIGEgc3RyaW5nXG4gIC8vIGRvZXNuJ3QgaGFuZGxlIFVSTEVuY29kZWQgRGF0YVVSSXMgLSBzZWUgU08gYW5zd2VyICM2ODUwMjc2IGZvciBjb2RlIHRoYXQgZG9lcyB0aGlzXG4gIHZhciBieXRlU3RyaW5nID0gYXRvYihkYXRhVVJJLnNwbGl0KCcsJylbMV0pOyAvLyBzZXBhcmF0ZSBvdXQgdGhlIG1pbWUgY29tcG9uZW50XG5cbiAgdmFyIG1pbWVTdHJpbmcgPSBkYXRhVVJJLnNwbGl0KCcsJylbMF0uc3BsaXQoJzonKVsxXS5zcGxpdCgnOycpWzBdOyAvLyB3cml0ZSB0aGUgYnl0ZXMgb2YgdGhlIHN0cmluZyB0byBhbiBBcnJheUJ1ZmZlclxuXG4gIHZhciBhYiA9IG5ldyBBcnJheUJ1ZmZlcihieXRlU3RyaW5nLmxlbmd0aCk7XG4gIHZhciBpYSA9IG5ldyBVaW50OEFycmF5KGFiKTtcblxuICBmb3IgKHZhciBpID0gMCwgZW5kID0gYnl0ZVN0cmluZy5sZW5ndGgsIGFzYyA9IDAgPD0gZW5kOyBhc2MgPyBpIDw9IGVuZCA6IGkgPj0gZW5kOyBhc2MgPyBpKysgOiBpLS0pIHtcbiAgICBpYVtpXSA9IGJ5dGVTdHJpbmcuY2hhckNvZGVBdChpKTtcbiAgfSAvLyB3cml0ZSB0aGUgQXJyYXlCdWZmZXIgdG8gYSBibG9iXG5cblxuICByZXR1cm4gbmV3IEJsb2IoW2FiXSwge1xuICAgIHR5cGU6IG1pbWVTdHJpbmdcbiAgfSk7XG59OyAvLyBSZXR1cm5zIGFuIGFycmF5IHdpdGhvdXQgdGhlIHJlamVjdGVkIGl0ZW1cblxuXG52YXIgd2l0aG91dCA9IGZ1bmN0aW9uIHdpdGhvdXQobGlzdCwgcmVqZWN0ZWRJdGVtKSB7XG4gIHJldHVybiBsaXN0LmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuICAgIHJldHVybiBpdGVtICE9PSByZWplY3RlZEl0ZW07XG4gIH0pLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgIHJldHVybiBpdGVtO1xuICB9KTtcbn07IC8vIGFiYy1kZWZfZ2hpIC0+IGFiY0RlZkdoaVxuXG5cbnZhciBjYW1lbGl6ZSA9IGZ1bmN0aW9uIGNhbWVsaXplKHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoL1tcXC1fXShcXHcpL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgIHJldHVybiBtYXRjaC5jaGFyQXQoMSkudG9VcHBlckNhc2UoKTtcbiAgfSk7XG59OyAvLyBDcmVhdGVzIGFuIGVsZW1lbnQgZnJvbSBzdHJpbmdcblxuXG5Ecm9wem9uZS5jcmVhdGVFbGVtZW50ID0gZnVuY3Rpb24gKHN0cmluZykge1xuICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgZGl2LmlubmVySFRNTCA9IHN0cmluZztcbiAgcmV0dXJuIGRpdi5jaGlsZE5vZGVzWzBdO1xufTsgLy8gVGVzdHMgaWYgZ2l2ZW4gZWxlbWVudCBpcyBpbnNpZGUgKG9yIHNpbXBseSBpcykgdGhlIGNvbnRhaW5lclxuXG5cbkRyb3B6b25lLmVsZW1lbnRJbnNpZGUgPSBmdW5jdGlvbiAoZWxlbWVudCwgY29udGFpbmVyKSB7XG4gIGlmIChlbGVtZW50ID09PSBjb250YWluZXIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSAvLyBDb2ZmZWVzY3JpcHQgZG9lc24ndCBzdXBwb3J0IGRvL3doaWxlIGxvb3BzXG5cblxuICB3aGlsZSAoZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgIGlmIChlbGVtZW50ID09PSBjb250YWluZXIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbkRyb3B6b25lLmdldEVsZW1lbnQgPSBmdW5jdGlvbiAoZWwsIG5hbWUpIHtcbiAgdmFyIGVsZW1lbnQ7XG5cbiAgaWYgKHR5cGVvZiBlbCA9PT0gXCJzdHJpbmdcIikge1xuICAgIGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGVsKTtcbiAgfSBlbHNlIGlmIChlbC5ub2RlVHlwZSAhPSBudWxsKSB7XG4gICAgZWxlbWVudCA9IGVsO1xuICB9XG5cbiAgaWYgKGVsZW1lbnQgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYFwiLmNvbmNhdChuYW1lLCBcImAgb3B0aW9uIHByb3ZpZGVkLiBQbGVhc2UgcHJvdmlkZSBhIENTUyBzZWxlY3RvciBvciBhIHBsYWluIEhUTUwgZWxlbWVudC5cIikpO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59O1xuXG5Ecm9wem9uZS5nZXRFbGVtZW50cyA9IGZ1bmN0aW9uIChlbHMsIG5hbWUpIHtcbiAgdmFyIGVsLCBlbGVtZW50cztcblxuICBpZiAoZWxzIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICBlbGVtZW50cyA9IFtdO1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhciBfaXRlcmF0b3IzNCA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGVscyksXG4gICAgICAgICAgX3N0ZXAzNDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChfaXRlcmF0b3IzNC5zKCk7ICEoX3N0ZXAzNCA9IF9pdGVyYXRvcjM0Lm4oKSkuZG9uZTspIHtcbiAgICAgICAgICBlbCA9IF9zdGVwMzQudmFsdWU7XG4gICAgICAgICAgZWxlbWVudHMucHVzaCh0aGlzLmdldEVsZW1lbnQoZWwsIG5hbWUpKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9pdGVyYXRvcjM0LmUoZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIF9pdGVyYXRvcjM0LmYoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlbGVtZW50cyA9IG51bGw7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBlbHMgPT09IFwic3RyaW5nXCIpIHtcbiAgICBlbGVtZW50cyA9IFtdO1xuXG4gICAgdmFyIF9pdGVyYXRvcjM1ID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChlbHMpKSxcbiAgICAgICAgX3N0ZXAzNTtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgKF9pdGVyYXRvcjM1LnMoKTsgIShfc3RlcDM1ID0gX2l0ZXJhdG9yMzUubigpKS5kb25lOykge1xuICAgICAgICBlbCA9IF9zdGVwMzUudmFsdWU7XG4gICAgICAgIGVsZW1lbnRzLnB1c2goZWwpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgX2l0ZXJhdG9yMzUuZShlcnIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBfaXRlcmF0b3IzNS5mKCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGVscy5ub2RlVHlwZSAhPSBudWxsKSB7XG4gICAgZWxlbWVudHMgPSBbZWxzXTtcbiAgfVxuXG4gIGlmIChlbGVtZW50cyA9PSBudWxsIHx8ICFlbGVtZW50cy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGBcIi5jb25jYXQobmFtZSwgXCJgIG9wdGlvbiBwcm92aWRlZC4gUGxlYXNlIHByb3ZpZGUgYSBDU1Mgc2VsZWN0b3IsIGEgcGxhaW4gSFRNTCBlbGVtZW50IG9yIGEgbGlzdCBvZiB0aG9zZS5cIikpO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnRzO1xufTsgLy8gQXNrcyB0aGUgdXNlciB0aGUgcXVlc3Rpb24gYW5kIGNhbGxzIGFjY2VwdGVkIG9yIHJlamVjdGVkIGFjY29yZGluZ2x5XG4vL1xuLy8gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24ganVzdCB1c2VzIGB3aW5kb3cuY29uZmlybWAgYW5kIHRoZW4gY2FsbHMgdGhlXG4vLyBhcHByb3ByaWF0ZSBjYWxsYmFjay5cblxuXG5Ecm9wem9uZS5jb25maXJtID0gZnVuY3Rpb24gKHF1ZXN0aW9uLCBhY2NlcHRlZCwgcmVqZWN0ZWQpIHtcbiAgaWYgKHdpbmRvdy5jb25maXJtKHF1ZXN0aW9uKSkge1xuICAgIHJldHVybiBhY2NlcHRlZCgpO1xuICB9IGVsc2UgaWYgKHJlamVjdGVkICE9IG51bGwpIHtcbiAgICByZXR1cm4gcmVqZWN0ZWQoKTtcbiAgfVxufTsgLy8gVmFsaWRhdGVzIHRoZSBtaW1lIHR5cGUgbGlrZSB0aGlzOlxuLy9cbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvSFRNTC9FbGVtZW50L2lucHV0I2F0dHItYWNjZXB0XG5cblxuRHJvcHpvbmUuaXNWYWxpZEZpbGUgPSBmdW5jdGlvbiAoZmlsZSwgYWNjZXB0ZWRGaWxlcykge1xuICBpZiAoIWFjY2VwdGVkRmlsZXMpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSAvLyBJZiB0aGVyZSBhcmUgbm8gYWNjZXB0ZWQgbWltZSB0eXBlcywgaXQncyBPS1xuXG5cbiAgYWNjZXB0ZWRGaWxlcyA9IGFjY2VwdGVkRmlsZXMuc3BsaXQoXCIsXCIpO1xuICB2YXIgbWltZVR5cGUgPSBmaWxlLnR5cGU7XG4gIHZhciBiYXNlTWltZVR5cGUgPSBtaW1lVHlwZS5yZXBsYWNlKC9cXC8uKiQvLCBcIlwiKTtcblxuICB2YXIgX2l0ZXJhdG9yMzYgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihhY2NlcHRlZEZpbGVzKSxcbiAgICAgIF9zdGVwMzY7XG5cbiAgdHJ5IHtcbiAgICBmb3IgKF9pdGVyYXRvcjM2LnMoKTsgIShfc3RlcDM2ID0gX2l0ZXJhdG9yMzYubigpKS5kb25lOykge1xuICAgICAgdmFyIHZhbGlkVHlwZSA9IF9zdGVwMzYudmFsdWU7XG4gICAgICB2YWxpZFR5cGUgPSB2YWxpZFR5cGUudHJpbSgpO1xuXG4gICAgICBpZiAodmFsaWRUeXBlLmNoYXJBdCgwKSA9PT0gXCIuXCIpIHtcbiAgICAgICAgaWYgKGZpbGUubmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YodmFsaWRUeXBlLnRvTG93ZXJDYXNlKCksIGZpbGUubmFtZS5sZW5ndGggLSB2YWxpZFR5cGUubGVuZ3RoKSAhPT0gLTEpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICgvXFwvXFwqJC8udGVzdCh2YWxpZFR5cGUpKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgc29tZXRoaW5nIGxpa2UgYSBpbWFnZS8qIG1pbWUgdHlwZVxuICAgICAgICBpZiAoYmFzZU1pbWVUeXBlID09PSB2YWxpZFR5cGUucmVwbGFjZSgvXFwvLiokLywgXCJcIikpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG1pbWVUeXBlID09PSB2YWxpZFR5cGUpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgX2l0ZXJhdG9yMzYuZShlcnIpO1xuICB9IGZpbmFsbHkge1xuICAgIF9pdGVyYXRvcjM2LmYoKTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07IC8vIEF1Z21lbnQgalF1ZXJ5XG5cblxuaWYgKHR5cGVvZiBqUXVlcnkgIT09ICd1bmRlZmluZWQnICYmIGpRdWVyeSAhPT0gbnVsbCkge1xuICBqUXVlcnkuZm4uZHJvcHpvbmUgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG5ldyBEcm9wem9uZSh0aGlzLCBvcHRpb25zKTtcbiAgICB9KTtcbiAgfTtcbn1cblxuaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZSAhPT0gbnVsbCkge1xuICBtb2R1bGUuZXhwb3J0cyA9IERyb3B6b25lO1xufSBlbHNlIHtcbiAgd2luZG93LkRyb3B6b25lID0gRHJvcHpvbmU7XG59IC8vIERyb3B6b25lIGZpbGUgc3RhdHVzIGNvZGVzXG5cblxuRHJvcHpvbmUuQURERUQgPSBcImFkZGVkXCI7XG5Ecm9wem9uZS5RVUVVRUQgPSBcInF1ZXVlZFwiOyAvLyBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIE5vdywgaWYgYSBmaWxlIGlzIGFjY2VwdGVkLCBpdCdzIGVpdGhlciBxdWV1ZWRcbi8vIG9yIHVwbG9hZGluZy5cblxuRHJvcHpvbmUuQUNDRVBURUQgPSBEcm9wem9uZS5RVUVVRUQ7XG5Ecm9wem9uZS5VUExPQURJTkcgPSBcInVwbG9hZGluZ1wiO1xuRHJvcHpvbmUuUFJPQ0VTU0lORyA9IERyb3B6b25lLlVQTE9BRElORzsgLy8gYWxpYXNcblxuRHJvcHpvbmUuQ0FOQ0VMRUQgPSBcImNhbmNlbGVkXCI7XG5Ecm9wem9uZS5FUlJPUiA9IFwiZXJyb3JcIjtcbkRyb3B6b25lLlNVQ0NFU1MgPSBcInN1Y2Nlc3NcIjtcbi8qXG5cbiBCdWdmaXggZm9yIGlPUyA2IGFuZCA3XG4gU291cmNlOiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzExOTI5MDk5L2h0bWw1LWNhbnZhcy1kcmF3aW1hZ2UtcmF0aW8tYnVnLWlvc1xuIGJhc2VkIG9uIHRoZSB3b3JrIG9mIGh0dHBzOi8vZ2l0aHViLmNvbS9zdG9taXRhL2lvcy1pbWFnZWZpbGUtbWVnYXBpeGVsXG5cbiAqL1xuLy8gRGV0ZWN0aW5nIHZlcnRpY2FsIHNxdWFzaCBpbiBsb2FkZWQgaW1hZ2UuXG4vLyBGaXhlcyBhIGJ1ZyB3aGljaCBzcXVhc2ggaW1hZ2UgdmVydGljYWxseSB3aGlsZSBkcmF3aW5nIGludG8gY2FudmFzIGZvciBzb21lIGltYWdlcy5cbi8vIFRoaXMgaXMgYSBidWcgaW4gaU9TNiBkZXZpY2VzLiBUaGlzIGZ1bmN0aW9uIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL3N0b21pdGEvaW9zLWltYWdlZmlsZS1tZWdhcGl4ZWxcblxudmFyIGRldGVjdFZlcnRpY2FsU3F1YXNoID0gZnVuY3Rpb24gZGV0ZWN0VmVydGljYWxTcXVhc2goaW1nKSB7XG4gIHZhciBpdyA9IGltZy5uYXR1cmFsV2lkdGg7XG4gIHZhciBpaCA9IGltZy5uYXR1cmFsSGVpZ2h0O1xuICB2YXIgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgY2FudmFzLndpZHRoID0gMTtcbiAgY2FudmFzLmhlaWdodCA9IGloO1xuICB2YXIgY3R4ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgY3R4LmRyYXdJbWFnZShpbWcsIDAsIDApO1xuXG4gIHZhciBfY3R4JGdldEltYWdlRGF0YSA9IGN0eC5nZXRJbWFnZURhdGEoMSwgMCwgMSwgaWgpLFxuICAgICAgZGF0YSA9IF9jdHgkZ2V0SW1hZ2VEYXRhLmRhdGE7IC8vIHNlYXJjaCBpbWFnZSBlZGdlIHBpeGVsIHBvc2l0aW9uIGluIGNhc2UgaXQgaXMgc3F1YXNoZWQgdmVydGljYWxseS5cblxuXG4gIHZhciBzeSA9IDA7XG4gIHZhciBleSA9IGloO1xuICB2YXIgcHkgPSBpaDtcblxuICB3aGlsZSAocHkgPiBzeSkge1xuICAgIHZhciBhbHBoYSA9IGRhdGFbKHB5IC0gMSkgKiA0ICsgM107XG5cbiAgICBpZiAoYWxwaGEgPT09IDApIHtcbiAgICAgIGV5ID0gcHk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN5ID0gcHk7XG4gICAgfVxuXG4gICAgcHkgPSBleSArIHN5ID4+IDE7XG4gIH1cblxuICB2YXIgcmF0aW8gPSBweSAvIGloO1xuXG4gIGlmIChyYXRpbyA9PT0gMCkge1xuICAgIHJldHVybiAxO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiByYXRpbztcbiAgfVxufTsgLy8gQSByZXBsYWNlbWVudCBmb3IgY29udGV4dC5kcmF3SW1hZ2Vcbi8vIChhcmdzIGFyZSBmb3Igc291cmNlIGFuZCBkZXN0aW5hdGlvbikuXG5cblxudmFyIGRyYXdJbWFnZUlPU0ZpeCA9IGZ1bmN0aW9uIGRyYXdJbWFnZUlPU0ZpeChjdHgsIGltZywgc3gsIHN5LCBzdywgc2gsIGR4LCBkeSwgZHcsIGRoKSB7XG4gIHZhciB2ZXJ0U3F1YXNoUmF0aW8gPSBkZXRlY3RWZXJ0aWNhbFNxdWFzaChpbWcpO1xuICByZXR1cm4gY3R4LmRyYXdJbWFnZShpbWcsIHN4LCBzeSwgc3csIHNoLCBkeCwgZHksIGR3LCBkaCAvIHZlcnRTcXVhc2hSYXRpbyk7XG59OyAvLyBCYXNlZCBvbiBNaW5pZnlKcGVnXG4vLyBTb3VyY2U6IGh0dHA6Ly93d3cucGVycnkuY3ovZmlsZXMvRXhpZlJlc3RvcmVyLmpzXG4vLyBodHRwOi8vZWxpY29uLmJsb2c1Ny5mYzIuY29tL2Jsb2ctZW50cnktMjA2Lmh0bWxcblxuXG52YXIgRXhpZlJlc3RvcmUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBFeGlmUmVzdG9yZSgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRXhpZlJlc3RvcmUpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEV4aWZSZXN0b3JlLCBudWxsLCBbe1xuICAgIGtleTogXCJpbml0Q2xhc3NcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5pdENsYXNzKCkge1xuICAgICAgdGhpcy5LRVlfU1RSID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89JztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZW5jb2RlNjRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZW5jb2RlNjQoaW5wdXQpIHtcbiAgICAgIHZhciBvdXRwdXQgPSAnJztcbiAgICAgIHZhciBjaHIxID0gdW5kZWZpbmVkO1xuICAgICAgdmFyIGNocjIgPSB1bmRlZmluZWQ7XG4gICAgICB2YXIgY2hyMyA9ICcnO1xuICAgICAgdmFyIGVuYzEgPSB1bmRlZmluZWQ7XG4gICAgICB2YXIgZW5jMiA9IHVuZGVmaW5lZDtcbiAgICAgIHZhciBlbmMzID0gdW5kZWZpbmVkO1xuICAgICAgdmFyIGVuYzQgPSAnJztcbiAgICAgIHZhciBpID0gMDtcblxuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgY2hyMSA9IGlucHV0W2krK107XG4gICAgICAgIGNocjIgPSBpbnB1dFtpKytdO1xuICAgICAgICBjaHIzID0gaW5wdXRbaSsrXTtcbiAgICAgICAgZW5jMSA9IGNocjEgPj4gMjtcbiAgICAgICAgZW5jMiA9IChjaHIxICYgMykgPDwgNCB8IGNocjIgPj4gNDtcbiAgICAgICAgZW5jMyA9IChjaHIyICYgMTUpIDw8IDIgfCBjaHIzID4+IDY7XG4gICAgICAgIGVuYzQgPSBjaHIzICYgNjM7XG5cbiAgICAgICAgaWYgKGlzTmFOKGNocjIpKSB7XG4gICAgICAgICAgZW5jMyA9IGVuYzQgPSA2NDtcbiAgICAgICAgfSBlbHNlIGlmIChpc05hTihjaHIzKSkge1xuICAgICAgICAgIGVuYzQgPSA2NDtcbiAgICAgICAgfVxuXG4gICAgICAgIG91dHB1dCA9IG91dHB1dCArIHRoaXMuS0VZX1NUUi5jaGFyQXQoZW5jMSkgKyB0aGlzLktFWV9TVFIuY2hhckF0KGVuYzIpICsgdGhpcy5LRVlfU1RSLmNoYXJBdChlbmMzKSArIHRoaXMuS0VZX1NUUi5jaGFyQXQoZW5jNCk7XG4gICAgICAgIGNocjEgPSBjaHIyID0gY2hyMyA9ICcnO1xuICAgICAgICBlbmMxID0gZW5jMiA9IGVuYzMgPSBlbmM0ID0gJyc7XG5cbiAgICAgICAgaWYgKCEoaSA8IGlucHV0Lmxlbmd0aCkpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZXN0b3JlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc3RvcmUob3JpZ0ZpbGVCYXNlNjQsIHJlc2l6ZWRGaWxlQmFzZTY0KSB7XG4gICAgICBpZiAoIW9yaWdGaWxlQmFzZTY0Lm1hdGNoKCdkYXRhOmltYWdlL2pwZWc7YmFzZTY0LCcpKSB7XG4gICAgICAgIHJldHVybiByZXNpemVkRmlsZUJhc2U2NDtcbiAgICAgIH1cblxuICAgICAgdmFyIHJhd0ltYWdlID0gdGhpcy5kZWNvZGU2NChvcmlnRmlsZUJhc2U2NC5yZXBsYWNlKCdkYXRhOmltYWdlL2pwZWc7YmFzZTY0LCcsICcnKSk7XG4gICAgICB2YXIgc2VnbWVudHMgPSB0aGlzLnNsaWNlMlNlZ21lbnRzKHJhd0ltYWdlKTtcbiAgICAgIHZhciBpbWFnZSA9IHRoaXMuZXhpZk1hbmlwdWxhdGlvbihyZXNpemVkRmlsZUJhc2U2NCwgc2VnbWVudHMpO1xuICAgICAgcmV0dXJuIFwiZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCxcIi5jb25jYXQodGhpcy5lbmNvZGU2NChpbWFnZSkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJleGlmTWFuaXB1bGF0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGV4aWZNYW5pcHVsYXRpb24ocmVzaXplZEZpbGVCYXNlNjQsIHNlZ21lbnRzKSB7XG4gICAgICB2YXIgZXhpZkFycmF5ID0gdGhpcy5nZXRFeGlmQXJyYXkoc2VnbWVudHMpO1xuICAgICAgdmFyIG5ld0ltYWdlQXJyYXkgPSB0aGlzLmluc2VydEV4aWYocmVzaXplZEZpbGVCYXNlNjQsIGV4aWZBcnJheSk7XG4gICAgICB2YXIgYUJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KG5ld0ltYWdlQXJyYXkpO1xuICAgICAgcmV0dXJuIGFCdWZmZXI7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldEV4aWZBcnJheVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRFeGlmQXJyYXkoc2VnbWVudHMpIHtcbiAgICAgIHZhciBzZWcgPSB1bmRlZmluZWQ7XG4gICAgICB2YXIgeCA9IDA7XG5cbiAgICAgIHdoaWxlICh4IDwgc2VnbWVudHMubGVuZ3RoKSB7XG4gICAgICAgIHNlZyA9IHNlZ21lbnRzW3hdO1xuXG4gICAgICAgIGlmIChzZWdbMF0gPT09IDI1NSAmIHNlZ1sxXSA9PT0gMjI1KSB7XG4gICAgICAgICAgcmV0dXJuIHNlZztcbiAgICAgICAgfVxuXG4gICAgICAgIHgrKztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpbnNlcnRFeGlmXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGluc2VydEV4aWYocmVzaXplZEZpbGVCYXNlNjQsIGV4aWZBcnJheSkge1xuICAgICAgdmFyIGltYWdlRGF0YSA9IHJlc2l6ZWRGaWxlQmFzZTY0LnJlcGxhY2UoJ2RhdGE6aW1hZ2UvanBlZztiYXNlNjQsJywgJycpO1xuICAgICAgdmFyIGJ1ZiA9IHRoaXMuZGVjb2RlNjQoaW1hZ2VEYXRhKTtcbiAgICAgIHZhciBzZXBhcmF0ZVBvaW50ID0gYnVmLmluZGV4T2YoMjU1LCAzKTtcbiAgICAgIHZhciBtYWUgPSBidWYuc2xpY2UoMCwgc2VwYXJhdGVQb2ludCk7XG4gICAgICB2YXIgYXRvID0gYnVmLnNsaWNlKHNlcGFyYXRlUG9pbnQpO1xuICAgICAgdmFyIGFycmF5ID0gbWFlO1xuICAgICAgYXJyYXkgPSBhcnJheS5jb25jYXQoZXhpZkFycmF5KTtcbiAgICAgIGFycmF5ID0gYXJyYXkuY29uY2F0KGF0byk7XG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNsaWNlMlNlZ21lbnRzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNsaWNlMlNlZ21lbnRzKHJhd0ltYWdlQXJyYXkpIHtcbiAgICAgIHZhciBoZWFkID0gMDtcbiAgICAgIHZhciBzZWdtZW50cyA9IFtdO1xuXG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICB2YXIgbGVuZ3RoO1xuXG4gICAgICAgIGlmIChyYXdJbWFnZUFycmF5W2hlYWRdID09PSAyNTUgJiByYXdJbWFnZUFycmF5W2hlYWQgKyAxXSA9PT0gMjE4KSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmF3SW1hZ2VBcnJheVtoZWFkXSA9PT0gMjU1ICYgcmF3SW1hZ2VBcnJheVtoZWFkICsgMV0gPT09IDIxNikge1xuICAgICAgICAgIGhlYWQgKz0gMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZW5ndGggPSByYXdJbWFnZUFycmF5W2hlYWQgKyAyXSAqIDI1NiArIHJhd0ltYWdlQXJyYXlbaGVhZCArIDNdO1xuICAgICAgICAgIHZhciBlbmRQb2ludCA9IGhlYWQgKyBsZW5ndGggKyAyO1xuICAgICAgICAgIHZhciBzZWcgPSByYXdJbWFnZUFycmF5LnNsaWNlKGhlYWQsIGVuZFBvaW50KTtcbiAgICAgICAgICBzZWdtZW50cy5wdXNoKHNlZyk7XG4gICAgICAgICAgaGVhZCA9IGVuZFBvaW50O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhlYWQgPiByYXdJbWFnZUFycmF5Lmxlbmd0aCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWdtZW50cztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZGVjb2RlNjRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVjb2RlNjQoaW5wdXQpIHtcbiAgICAgIHZhciBvdXRwdXQgPSAnJztcbiAgICAgIHZhciBjaHIxID0gdW5kZWZpbmVkO1xuICAgICAgdmFyIGNocjIgPSB1bmRlZmluZWQ7XG4gICAgICB2YXIgY2hyMyA9ICcnO1xuICAgICAgdmFyIGVuYzEgPSB1bmRlZmluZWQ7XG4gICAgICB2YXIgZW5jMiA9IHVuZGVmaW5lZDtcbiAgICAgIHZhciBlbmMzID0gdW5kZWZpbmVkO1xuICAgICAgdmFyIGVuYzQgPSAnJztcbiAgICAgIHZhciBpID0gMDtcbiAgICAgIHZhciBidWYgPSBbXTsgLy8gcmVtb3ZlIGFsbCBjaGFyYWN0ZXJzIHRoYXQgYXJlIG5vdCBBLVosIGEteiwgMC05LCArLCAvLCBvciA9XG5cbiAgICAgIHZhciBiYXNlNjR0ZXN0ID0gL1teQS1aYS16MC05XFwrXFwvXFw9XS9nO1xuXG4gICAgICBpZiAoYmFzZTY0dGVzdC5leGVjKGlucHV0KSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1RoZXJlIHdlcmUgaW52YWxpZCBiYXNlNjQgY2hhcmFjdGVycyBpbiB0aGUgaW5wdXQgdGV4dC5cXG5WYWxpZCBiYXNlNjQgY2hhcmFjdGVycyBhcmUgQS1aLCBhLXosIDAtOSwgXFwnK1xcJywgXFwnL1xcJyxhbmQgXFwnPVxcJ1xcbkV4cGVjdCBlcnJvcnMgaW4gZGVjb2RpbmcuJyk7XG4gICAgICB9XG5cbiAgICAgIGlucHV0ID0gaW5wdXQucmVwbGFjZSgvW15BLVphLXowLTlcXCtcXC9cXD1dL2csICcnKTtcblxuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgZW5jMSA9IHRoaXMuS0VZX1NUUi5pbmRleE9mKGlucHV0LmNoYXJBdChpKyspKTtcbiAgICAgICAgZW5jMiA9IHRoaXMuS0VZX1NUUi5pbmRleE9mKGlucHV0LmNoYXJBdChpKyspKTtcbiAgICAgICAgZW5jMyA9IHRoaXMuS0VZX1NUUi5pbmRleE9mKGlucHV0LmNoYXJBdChpKyspKTtcbiAgICAgICAgZW5jNCA9IHRoaXMuS0VZX1NUUi5pbmRleE9mKGlucHV0LmNoYXJBdChpKyspKTtcbiAgICAgICAgY2hyMSA9IGVuYzEgPDwgMiB8IGVuYzIgPj4gNDtcbiAgICAgICAgY2hyMiA9IChlbmMyICYgMTUpIDw8IDQgfCBlbmMzID4+IDI7XG4gICAgICAgIGNocjMgPSAoZW5jMyAmIDMpIDw8IDYgfCBlbmM0O1xuICAgICAgICBidWYucHVzaChjaHIxKTtcblxuICAgICAgICBpZiAoZW5jMyAhPT0gNjQpIHtcbiAgICAgICAgICBidWYucHVzaChjaHIyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbmM0ICE9PSA2NCkge1xuICAgICAgICAgIGJ1Zi5wdXNoKGNocjMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hyMSA9IGNocjIgPSBjaHIzID0gJyc7XG4gICAgICAgIGVuYzEgPSBlbmMyID0gZW5jMyA9IGVuYzQgPSAnJztcblxuICAgICAgICBpZiAoIShpIDwgaW5wdXQubGVuZ3RoKSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBidWY7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEV4aWZSZXN0b3JlO1xufSgpO1xuXG5FeGlmUmVzdG9yZS5pbml0Q2xhc3MoKTtcbi8qXG4gKiBjb250ZW50bG9hZGVkLmpzXG4gKlxuICogQXV0aG9yOiBEaWVnbyBQZXJpbmkgKGRpZWdvLnBlcmluaSBhdCBnbWFpbC5jb20pXG4gKiBTdW1tYXJ5OiBjcm9zcy1icm93c2VyIHdyYXBwZXIgZm9yIERPTUNvbnRlbnRMb2FkZWRcbiAqIFVwZGF0ZWQ6IDIwMTAxMDIwXG4gKiBMaWNlbnNlOiBNSVRcbiAqIFZlcnNpb246IDEuMlxuICpcbiAqIFVSTDpcbiAqIGh0dHA6Ly9qYXZhc2NyaXB0Lm53Ym94LmNvbS9Db250ZW50TG9hZGVkL1xuICogaHR0cDovL2phdmFzY3JpcHQubndib3guY29tL0NvbnRlbnRMb2FkZWQvTUlULUxJQ0VOU0VcbiAqL1xuLy8gQHdpbiB3aW5kb3cgcmVmZXJlbmNlXG4vLyBAZm4gZnVuY3Rpb24gcmVmZXJlbmNlXG5cbnZhciBjb250ZW50TG9hZGVkID0gZnVuY3Rpb24gY29udGVudExvYWRlZCh3aW4sIGZuKSB7XG4gIHZhciBkb25lID0gZmFsc2U7XG4gIHZhciB0b3AgPSB0cnVlO1xuICB2YXIgZG9jID0gd2luLmRvY3VtZW50O1xuICB2YXIgcm9vdCA9IGRvYy5kb2N1bWVudEVsZW1lbnQ7XG4gIHZhciBhZGQgPSBkb2MuYWRkRXZlbnRMaXN0ZW5lciA/IFwiYWRkRXZlbnRMaXN0ZW5lclwiIDogXCJhdHRhY2hFdmVudFwiO1xuICB2YXIgcmVtID0gZG9jLmFkZEV2ZW50TGlzdGVuZXIgPyBcInJlbW92ZUV2ZW50TGlzdGVuZXJcIiA6IFwiZGV0YWNoRXZlbnRcIjtcbiAgdmFyIHByZSA9IGRvYy5hZGRFdmVudExpc3RlbmVyID8gXCJcIiA6IFwib25cIjtcblxuICB2YXIgaW5pdCA9IGZ1bmN0aW9uIGluaXQoZSkge1xuICAgIGlmIChlLnR5cGUgPT09IFwicmVhZHlzdGF0ZWNoYW5nZVwiICYmIGRvYy5yZWFkeVN0YXRlICE9PSBcImNvbXBsZXRlXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAoZS50eXBlID09PSBcImxvYWRcIiA/IHdpbiA6IGRvYylbcmVtXShwcmUgKyBlLnR5cGUsIGluaXQsIGZhbHNlKTtcblxuICAgIGlmICghZG9uZSAmJiAoZG9uZSA9IHRydWUpKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh3aW4sIGUudHlwZSB8fCBlKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHBvbGwgPSBmdW5jdGlvbiBwb2xsKCkge1xuICAgIHRyeSB7XG4gICAgICByb290LmRvU2Nyb2xsKFwibGVmdFwiKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzZXRUaW1lb3V0KHBvbGwsIDUwKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5pdChcInBvbGxcIik7XG4gIH07XG5cbiAgaWYgKGRvYy5yZWFkeVN0YXRlICE9PSBcImNvbXBsZXRlXCIpIHtcbiAgICBpZiAoZG9jLmNyZWF0ZUV2ZW50T2JqZWN0ICYmIHJvb3QuZG9TY3JvbGwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRvcCA9ICF3aW4uZnJhbWVFbGVtZW50O1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHt9XG5cbiAgICAgIGlmICh0b3ApIHtcbiAgICAgICAgcG9sbCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGRvY1thZGRdKHByZSArIFwiRE9NQ29udGVudExvYWRlZFwiLCBpbml0LCBmYWxzZSk7XG4gICAgZG9jW2FkZF0ocHJlICsgXCJyZWFkeXN0YXRlY2hhbmdlXCIsIGluaXQsIGZhbHNlKTtcbiAgICByZXR1cm4gd2luW2FkZF0ocHJlICsgXCJsb2FkXCIsIGluaXQsIGZhbHNlKTtcbiAgfVxufTsgLy8gQXMgYSBzaW5nbGUgZnVuY3Rpb24gdG8gYmUgYWJsZSB0byB3cml0ZSB0ZXN0cy5cblxuXG5Ecm9wem9uZS5fYXV0b0Rpc2NvdmVyRnVuY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gIGlmIChEcm9wem9uZS5hdXRvRGlzY292ZXIpIHtcbiAgICByZXR1cm4gRHJvcHpvbmUuZGlzY292ZXIoKTtcbiAgfVxufTtcblxuY29udGVudExvYWRlZCh3aW5kb3csIERyb3B6b25lLl9hdXRvRGlzY292ZXJGdW5jdGlvbik7XG5cbmZ1bmN0aW9uIF9fZ3VhcmRfXyh2YWx1ZSwgdHJhbnNmb3JtKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnICYmIHZhbHVlICE9PSBudWxsID8gdHJhbnNmb3JtKHZhbHVlKSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gX19ndWFyZE1ldGhvZF9fKG9iaiwgbWV0aG9kTmFtZSwgdHJhbnNmb3JtKSB7XG4gIGlmICh0eXBlb2Ygb2JqICE9PSAndW5kZWZpbmVkJyAmJiBvYmogIT09IG51bGwgJiYgdHlwZW9mIG9ialttZXRob2ROYW1lXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0cmFuc2Zvcm0ob2JqLCBtZXRob2ROYW1lKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/dropzone/dist/dropzone.js\n"); +eval("(function webpackUniversalModuleDefinition(root, factory) {\n\tif(true)\n\t\tmodule.exports = factory();\n\telse { var i, a; }\n})(self, function() {\nreturn /******/ (function() { // webpackBootstrap\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ 3099:\n/***/ (function(module) {\n\nmodule.exports = function (it) {\n if (typeof it != 'function') {\n throw TypeError(String(it) + ' is not a function');\n } return it;\n};\n\n\n/***/ }),\n\n/***/ 6077:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_703__) {\n\nvar isObject = __nested_webpack_require_703__(111);\n\nmodule.exports = function (it) {\n if (!isObject(it) && it !== null) {\n throw TypeError(\"Can't set \" + String(it) + ' as a prototype');\n } return it;\n};\n\n\n/***/ }),\n\n/***/ 1223:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_1001__) {\n\nvar wellKnownSymbol = __nested_webpack_require_1001__(5112);\nvar create = __nested_webpack_require_1001__(30);\nvar definePropertyModule = __nested_webpack_require_1001__(3070);\n\nvar UNSCOPABLES = wellKnownSymbol('unscopables');\nvar ArrayPrototype = Array.prototype;\n\n// Array.prototype[@@unscopables]\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\nif (ArrayPrototype[UNSCOPABLES] == undefined) {\n definePropertyModule.f(ArrayPrototype, UNSCOPABLES, {\n configurable: true,\n value: create(null)\n });\n}\n\n// add a key to Array.prototype[@@unscopables]\nmodule.exports = function (key) {\n ArrayPrototype[UNSCOPABLES][key] = true;\n};\n\n\n/***/ }),\n\n/***/ 1530:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_1715__) {\n\n\"use strict\";\n\nvar charAt = __nested_webpack_require_1715__(8710).charAt;\n\n// `AdvanceStringIndex` abstract operation\n// https://tc39.es/ecma262/#sec-advancestringindex\nmodule.exports = function (S, index, unicode) {\n return index + (unicode ? charAt(S, index).length : 1);\n};\n\n\n/***/ }),\n\n/***/ 5787:\n/***/ (function(module) {\n\nmodule.exports = function (it, Constructor, name) {\n if (!(it instanceof Constructor)) {\n throw TypeError('Incorrect ' + (name ? name + ' ' : '') + 'invocation');\n } return it;\n};\n\n\n/***/ }),\n\n/***/ 9670:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_2317__) {\n\nvar isObject = __nested_webpack_require_2317__(111);\n\nmodule.exports = function (it) {\n if (!isObject(it)) {\n throw TypeError(String(it) + ' is not an object');\n } return it;\n};\n\n\n/***/ }),\n\n/***/ 4019:\n/***/ (function(module) {\n\nmodule.exports = typeof ArrayBuffer !== 'undefined' && typeof DataView !== 'undefined';\n\n\n/***/ }),\n\n/***/ 260:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_2726__) {\n\n\"use strict\";\n\nvar NATIVE_ARRAY_BUFFER = __nested_webpack_require_2726__(4019);\nvar DESCRIPTORS = __nested_webpack_require_2726__(9781);\nvar global = __nested_webpack_require_2726__(7854);\nvar isObject = __nested_webpack_require_2726__(111);\nvar has = __nested_webpack_require_2726__(6656);\nvar classof = __nested_webpack_require_2726__(648);\nvar createNonEnumerableProperty = __nested_webpack_require_2726__(8880);\nvar redefine = __nested_webpack_require_2726__(1320);\nvar defineProperty = __nested_webpack_require_2726__(3070).f;\nvar getPrototypeOf = __nested_webpack_require_2726__(9518);\nvar setPrototypeOf = __nested_webpack_require_2726__(7674);\nvar wellKnownSymbol = __nested_webpack_require_2726__(5112);\nvar uid = __nested_webpack_require_2726__(9711);\n\nvar Int8Array = global.Int8Array;\nvar Int8ArrayPrototype = Int8Array && Int8Array.prototype;\nvar Uint8ClampedArray = global.Uint8ClampedArray;\nvar Uint8ClampedArrayPrototype = Uint8ClampedArray && Uint8ClampedArray.prototype;\nvar TypedArray = Int8Array && getPrototypeOf(Int8Array);\nvar TypedArrayPrototype = Int8ArrayPrototype && getPrototypeOf(Int8ArrayPrototype);\nvar ObjectPrototype = Object.prototype;\nvar isPrototypeOf = ObjectPrototype.isPrototypeOf;\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar TYPED_ARRAY_TAG = uid('TYPED_ARRAY_TAG');\n// Fixing native typed arrays in Opera Presto crashes the browser, see #595\nvar NATIVE_ARRAY_BUFFER_VIEWS = NATIVE_ARRAY_BUFFER && !!setPrototypeOf && classof(global.opera) !== 'Opera';\nvar TYPED_ARRAY_TAG_REQIRED = false;\nvar NAME;\n\nvar TypedArrayConstructorsList = {\n Int8Array: 1,\n Uint8Array: 1,\n Uint8ClampedArray: 1,\n Int16Array: 2,\n Uint16Array: 2,\n Int32Array: 4,\n Uint32Array: 4,\n Float32Array: 4,\n Float64Array: 8\n};\n\nvar BigIntArrayConstructorsList = {\n BigInt64Array: 8,\n BigUint64Array: 8\n};\n\nvar isView = function isView(it) {\n if (!isObject(it)) return false;\n var klass = classof(it);\n return klass === 'DataView'\n || has(TypedArrayConstructorsList, klass)\n || has(BigIntArrayConstructorsList, klass);\n};\n\nvar isTypedArray = function (it) {\n if (!isObject(it)) return false;\n var klass = classof(it);\n return has(TypedArrayConstructorsList, klass)\n || has(BigIntArrayConstructorsList, klass);\n};\n\nvar aTypedArray = function (it) {\n if (isTypedArray(it)) return it;\n throw TypeError('Target is not a typed array');\n};\n\nvar aTypedArrayConstructor = function (C) {\n if (setPrototypeOf) {\n if (isPrototypeOf.call(TypedArray, C)) return C;\n } else for (var ARRAY in TypedArrayConstructorsList) if (has(TypedArrayConstructorsList, NAME)) {\n var TypedArrayConstructor = global[ARRAY];\n if (TypedArrayConstructor && (C === TypedArrayConstructor || isPrototypeOf.call(TypedArrayConstructor, C))) {\n return C;\n }\n } throw TypeError('Target is not a typed array constructor');\n};\n\nvar exportTypedArrayMethod = function (KEY, property, forced) {\n if (!DESCRIPTORS) return;\n if (forced) for (var ARRAY in TypedArrayConstructorsList) {\n var TypedArrayConstructor = global[ARRAY];\n if (TypedArrayConstructor && has(TypedArrayConstructor.prototype, KEY)) {\n delete TypedArrayConstructor.prototype[KEY];\n }\n }\n if (!TypedArrayPrototype[KEY] || forced) {\n redefine(TypedArrayPrototype, KEY, forced ? property\n : NATIVE_ARRAY_BUFFER_VIEWS && Int8ArrayPrototype[KEY] || property);\n }\n};\n\nvar exportTypedArrayStaticMethod = function (KEY, property, forced) {\n var ARRAY, TypedArrayConstructor;\n if (!DESCRIPTORS) return;\n if (setPrototypeOf) {\n if (forced) for (ARRAY in TypedArrayConstructorsList) {\n TypedArrayConstructor = global[ARRAY];\n if (TypedArrayConstructor && has(TypedArrayConstructor, KEY)) {\n delete TypedArrayConstructor[KEY];\n }\n }\n if (!TypedArray[KEY] || forced) {\n // V8 ~ Chrome 49-50 `%TypedArray%` methods are non-writable non-configurable\n try {\n return redefine(TypedArray, KEY, forced ? property : NATIVE_ARRAY_BUFFER_VIEWS && Int8Array[KEY] || property);\n } catch (error) { /* empty */ }\n } else return;\n }\n for (ARRAY in TypedArrayConstructorsList) {\n TypedArrayConstructor = global[ARRAY];\n if (TypedArrayConstructor && (!TypedArrayConstructor[KEY] || forced)) {\n redefine(TypedArrayConstructor, KEY, property);\n }\n }\n};\n\nfor (NAME in TypedArrayConstructorsList) {\n if (!global[NAME]) NATIVE_ARRAY_BUFFER_VIEWS = false;\n}\n\n// WebKit bug - typed arrays constructors prototype is Object.prototype\nif (!NATIVE_ARRAY_BUFFER_VIEWS || typeof TypedArray != 'function' || TypedArray === Function.prototype) {\n // eslint-disable-next-line no-shadow -- safe\n TypedArray = function TypedArray() {\n throw TypeError('Incorrect invocation');\n };\n if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME in TypedArrayConstructorsList) {\n if (global[NAME]) setPrototypeOf(global[NAME], TypedArray);\n }\n}\n\nif (!NATIVE_ARRAY_BUFFER_VIEWS || !TypedArrayPrototype || TypedArrayPrototype === ObjectPrototype) {\n TypedArrayPrototype = TypedArray.prototype;\n if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME in TypedArrayConstructorsList) {\n if (global[NAME]) setPrototypeOf(global[NAME].prototype, TypedArrayPrototype);\n }\n}\n\n// WebKit bug - one more object in Uint8ClampedArray prototype chain\nif (NATIVE_ARRAY_BUFFER_VIEWS && getPrototypeOf(Uint8ClampedArrayPrototype) !== TypedArrayPrototype) {\n setPrototypeOf(Uint8ClampedArrayPrototype, TypedArrayPrototype);\n}\n\nif (DESCRIPTORS && !has(TypedArrayPrototype, TO_STRING_TAG)) {\n TYPED_ARRAY_TAG_REQIRED = true;\n defineProperty(TypedArrayPrototype, TO_STRING_TAG, { get: function () {\n return isObject(this) ? this[TYPED_ARRAY_TAG] : undefined;\n } });\n for (NAME in TypedArrayConstructorsList) if (global[NAME]) {\n createNonEnumerableProperty(global[NAME], TYPED_ARRAY_TAG, NAME);\n }\n}\n\nmodule.exports = {\n NATIVE_ARRAY_BUFFER_VIEWS: NATIVE_ARRAY_BUFFER_VIEWS,\n TYPED_ARRAY_TAG: TYPED_ARRAY_TAG_REQIRED && TYPED_ARRAY_TAG,\n aTypedArray: aTypedArray,\n aTypedArrayConstructor: aTypedArrayConstructor,\n exportTypedArrayMethod: exportTypedArrayMethod,\n exportTypedArrayStaticMethod: exportTypedArrayStaticMethod,\n isView: isView,\n isTypedArray: isTypedArray,\n TypedArray: TypedArray,\n TypedArrayPrototype: TypedArrayPrototype\n};\n\n\n/***/ }),\n\n/***/ 3331:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_8934__) {\n\n\"use strict\";\n\nvar global = __nested_webpack_require_8934__(7854);\nvar DESCRIPTORS = __nested_webpack_require_8934__(9781);\nvar NATIVE_ARRAY_BUFFER = __nested_webpack_require_8934__(4019);\nvar createNonEnumerableProperty = __nested_webpack_require_8934__(8880);\nvar redefineAll = __nested_webpack_require_8934__(2248);\nvar fails = __nested_webpack_require_8934__(7293);\nvar anInstance = __nested_webpack_require_8934__(5787);\nvar toInteger = __nested_webpack_require_8934__(9958);\nvar toLength = __nested_webpack_require_8934__(7466);\nvar toIndex = __nested_webpack_require_8934__(7067);\nvar IEEE754 = __nested_webpack_require_8934__(1179);\nvar getPrototypeOf = __nested_webpack_require_8934__(9518);\nvar setPrototypeOf = __nested_webpack_require_8934__(7674);\nvar getOwnPropertyNames = __nested_webpack_require_8934__(8006).f;\nvar defineProperty = __nested_webpack_require_8934__(3070).f;\nvar arrayFill = __nested_webpack_require_8934__(1285);\nvar setToStringTag = __nested_webpack_require_8934__(8003);\nvar InternalStateModule = __nested_webpack_require_8934__(9909);\n\nvar getInternalState = InternalStateModule.get;\nvar setInternalState = InternalStateModule.set;\nvar ARRAY_BUFFER = 'ArrayBuffer';\nvar DATA_VIEW = 'DataView';\nvar PROTOTYPE = 'prototype';\nvar WRONG_LENGTH = 'Wrong length';\nvar WRONG_INDEX = 'Wrong index';\nvar NativeArrayBuffer = global[ARRAY_BUFFER];\nvar $ArrayBuffer = NativeArrayBuffer;\nvar $DataView = global[DATA_VIEW];\nvar $DataViewPrototype = $DataView && $DataView[PROTOTYPE];\nvar ObjectPrototype = Object.prototype;\nvar RangeError = global.RangeError;\n\nvar packIEEE754 = IEEE754.pack;\nvar unpackIEEE754 = IEEE754.unpack;\n\nvar packInt8 = function (number) {\n return [number & 0xFF];\n};\n\nvar packInt16 = function (number) {\n return [number & 0xFF, number >> 8 & 0xFF];\n};\n\nvar packInt32 = function (number) {\n return [number & 0xFF, number >> 8 & 0xFF, number >> 16 & 0xFF, number >> 24 & 0xFF];\n};\n\nvar unpackInt32 = function (buffer) {\n return buffer[3] << 24 | buffer[2] << 16 | buffer[1] << 8 | buffer[0];\n};\n\nvar packFloat32 = function (number) {\n return packIEEE754(number, 23, 4);\n};\n\nvar packFloat64 = function (number) {\n return packIEEE754(number, 52, 8);\n};\n\nvar addGetter = function (Constructor, key) {\n defineProperty(Constructor[PROTOTYPE], key, { get: function () { return getInternalState(this)[key]; } });\n};\n\nvar get = function (view, count, index, isLittleEndian) {\n var intIndex = toIndex(index);\n var store = getInternalState(view);\n if (intIndex + count > store.byteLength) throw RangeError(WRONG_INDEX);\n var bytes = getInternalState(store.buffer).bytes;\n var start = intIndex + store.byteOffset;\n var pack = bytes.slice(start, start + count);\n return isLittleEndian ? pack : pack.reverse();\n};\n\nvar set = function (view, count, index, conversion, value, isLittleEndian) {\n var intIndex = toIndex(index);\n var store = getInternalState(view);\n if (intIndex + count > store.byteLength) throw RangeError(WRONG_INDEX);\n var bytes = getInternalState(store.buffer).bytes;\n var start = intIndex + store.byteOffset;\n var pack = conversion(+value);\n for (var i = 0; i < count; i++) bytes[start + i] = pack[isLittleEndian ? i : count - i - 1];\n};\n\nif (!NATIVE_ARRAY_BUFFER) {\n $ArrayBuffer = function ArrayBuffer(length) {\n anInstance(this, $ArrayBuffer, ARRAY_BUFFER);\n var byteLength = toIndex(length);\n setInternalState(this, {\n bytes: arrayFill.call(new Array(byteLength), 0),\n byteLength: byteLength\n });\n if (!DESCRIPTORS) this.byteLength = byteLength;\n };\n\n $DataView = function DataView(buffer, byteOffset, byteLength) {\n anInstance(this, $DataView, DATA_VIEW);\n anInstance(buffer, $ArrayBuffer, DATA_VIEW);\n var bufferLength = getInternalState(buffer).byteLength;\n var offset = toInteger(byteOffset);\n if (offset < 0 || offset > bufferLength) throw RangeError('Wrong offset');\n byteLength = byteLength === undefined ? bufferLength - offset : toLength(byteLength);\n if (offset + byteLength > bufferLength) throw RangeError(WRONG_LENGTH);\n setInternalState(this, {\n buffer: buffer,\n byteLength: byteLength,\n byteOffset: offset\n });\n if (!DESCRIPTORS) {\n this.buffer = buffer;\n this.byteLength = byteLength;\n this.byteOffset = offset;\n }\n };\n\n if (DESCRIPTORS) {\n addGetter($ArrayBuffer, 'byteLength');\n addGetter($DataView, 'buffer');\n addGetter($DataView, 'byteLength');\n addGetter($DataView, 'byteOffset');\n }\n\n redefineAll($DataView[PROTOTYPE], {\n getInt8: function getInt8(byteOffset) {\n return get(this, 1, byteOffset)[0] << 24 >> 24;\n },\n getUint8: function getUint8(byteOffset) {\n return get(this, 1, byteOffset)[0];\n },\n getInt16: function getInt16(byteOffset /* , littleEndian */) {\n var bytes = get(this, 2, byteOffset, arguments.length > 1 ? arguments[1] : undefined);\n return (bytes[1] << 8 | bytes[0]) << 16 >> 16;\n },\n getUint16: function getUint16(byteOffset /* , littleEndian */) {\n var bytes = get(this, 2, byteOffset, arguments.length > 1 ? arguments[1] : undefined);\n return bytes[1] << 8 | bytes[0];\n },\n getInt32: function getInt32(byteOffset /* , littleEndian */) {\n return unpackInt32(get(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined));\n },\n getUint32: function getUint32(byteOffset /* , littleEndian */) {\n return unpackInt32(get(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined)) >>> 0;\n },\n getFloat32: function getFloat32(byteOffset /* , littleEndian */) {\n return unpackIEEE754(get(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined), 23);\n },\n getFloat64: function getFloat64(byteOffset /* , littleEndian */) {\n return unpackIEEE754(get(this, 8, byteOffset, arguments.length > 1 ? arguments[1] : undefined), 52);\n },\n setInt8: function setInt8(byteOffset, value) {\n set(this, 1, byteOffset, packInt8, value);\n },\n setUint8: function setUint8(byteOffset, value) {\n set(this, 1, byteOffset, packInt8, value);\n },\n setInt16: function setInt16(byteOffset, value /* , littleEndian */) {\n set(this, 2, byteOffset, packInt16, value, arguments.length > 2 ? arguments[2] : undefined);\n },\n setUint16: function setUint16(byteOffset, value /* , littleEndian */) {\n set(this, 2, byteOffset, packInt16, value, arguments.length > 2 ? arguments[2] : undefined);\n },\n setInt32: function setInt32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packInt32, value, arguments.length > 2 ? arguments[2] : undefined);\n },\n setUint32: function setUint32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packInt32, value, arguments.length > 2 ? arguments[2] : undefined);\n },\n setFloat32: function setFloat32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packFloat32, value, arguments.length > 2 ? arguments[2] : undefined);\n },\n setFloat64: function setFloat64(byteOffset, value /* , littleEndian */) {\n set(this, 8, byteOffset, packFloat64, value, arguments.length > 2 ? arguments[2] : undefined);\n }\n });\n} else {\n /* eslint-disable no-new -- required for testing */\n if (!fails(function () {\n NativeArrayBuffer(1);\n }) || !fails(function () {\n new NativeArrayBuffer(-1);\n }) || fails(function () {\n new NativeArrayBuffer();\n new NativeArrayBuffer(1.5);\n new NativeArrayBuffer(NaN);\n return NativeArrayBuffer.name != ARRAY_BUFFER;\n })) {\n /* eslint-enable no-new -- required for testing */\n $ArrayBuffer = function ArrayBuffer(length) {\n anInstance(this, $ArrayBuffer);\n return new NativeArrayBuffer(toIndex(length));\n };\n var ArrayBufferPrototype = $ArrayBuffer[PROTOTYPE] = NativeArrayBuffer[PROTOTYPE];\n for (var keys = getOwnPropertyNames(NativeArrayBuffer), j = 0, key; keys.length > j;) {\n if (!((key = keys[j++]) in $ArrayBuffer)) {\n createNonEnumerableProperty($ArrayBuffer, key, NativeArrayBuffer[key]);\n }\n }\n ArrayBufferPrototype.constructor = $ArrayBuffer;\n }\n\n // WebKit bug - the same parent prototype for typed arrays and data view\n if (setPrototypeOf && getPrototypeOf($DataViewPrototype) !== ObjectPrototype) {\n setPrototypeOf($DataViewPrototype, ObjectPrototype);\n }\n\n // iOS Safari 7.x bug\n var testView = new $DataView(new $ArrayBuffer(2));\n var nativeSetInt8 = $DataViewPrototype.setInt8;\n testView.setInt8(0, 2147483648);\n testView.setInt8(1, 2147483649);\n if (testView.getInt8(0) || !testView.getInt8(1)) redefineAll($DataViewPrototype, {\n setInt8: function setInt8(byteOffset, value) {\n nativeSetInt8.call(this, byteOffset, value << 24 >> 24);\n },\n setUint8: function setUint8(byteOffset, value) {\n nativeSetInt8.call(this, byteOffset, value << 24 >> 24);\n }\n }, { unsafe: true });\n}\n\nsetToStringTag($ArrayBuffer, ARRAY_BUFFER);\nsetToStringTag($DataView, DATA_VIEW);\n\nmodule.exports = {\n ArrayBuffer: $ArrayBuffer,\n DataView: $DataView\n};\n\n\n/***/ }),\n\n/***/ 1048:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_17881__) {\n\n\"use strict\";\n\nvar toObject = __nested_webpack_require_17881__(7908);\nvar toAbsoluteIndex = __nested_webpack_require_17881__(1400);\nvar toLength = __nested_webpack_require_17881__(7466);\n\nvar min = Math.min;\n\n// `Array.prototype.copyWithin` method implementation\n// https://tc39.es/ecma262/#sec-array.prototype.copywithin\nmodule.exports = [].copyWithin || function copyWithin(target /* = 0 */, start /* = 0, end = @length */) {\n var O = toObject(this);\n var len = toLength(O.length);\n var to = toAbsoluteIndex(target, len);\n var from = toAbsoluteIndex(start, len);\n var end = arguments.length > 2 ? arguments[2] : undefined;\n var count = min((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to);\n var inc = 1;\n if (from < to && to < from + count) {\n inc = -1;\n from += count - 1;\n to += count - 1;\n }\n while (count-- > 0) {\n if (from in O) O[to] = O[from];\n else delete O[to];\n to += inc;\n from += inc;\n } return O;\n};\n\n\n/***/ }),\n\n/***/ 1285:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_18911__) {\n\n\"use strict\";\n\nvar toObject = __nested_webpack_require_18911__(7908);\nvar toAbsoluteIndex = __nested_webpack_require_18911__(1400);\nvar toLength = __nested_webpack_require_18911__(7466);\n\n// `Array.prototype.fill` method implementation\n// https://tc39.es/ecma262/#sec-array.prototype.fill\nmodule.exports = function fill(value /* , start = 0, end = @length */) {\n var O = toObject(this);\n var length = toLength(O.length);\n var argumentsLength = arguments.length;\n var index = toAbsoluteIndex(argumentsLength > 1 ? arguments[1] : undefined, length);\n var end = argumentsLength > 2 ? arguments[2] : undefined;\n var endPos = end === undefined ? length : toAbsoluteIndex(end, length);\n while (endPos > index) O[index++] = value;\n return O;\n};\n\n\n/***/ }),\n\n/***/ 8533:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_19717__) {\n\n\"use strict\";\n\nvar $forEach = __nested_webpack_require_19717__(2092).forEach;\nvar arrayMethodIsStrict = __nested_webpack_require_19717__(9341);\n\nvar STRICT_METHOD = arrayMethodIsStrict('forEach');\n\n// `Array.prototype.forEach` method implementation\n// https://tc39.es/ecma262/#sec-array.prototype.foreach\nmodule.exports = !STRICT_METHOD ? function forEach(callbackfn /* , thisArg */) {\n return $forEach(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n} : [].forEach;\n\n\n/***/ }),\n\n/***/ 8457:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_20278__) {\n\n\"use strict\";\n\nvar bind = __nested_webpack_require_20278__(9974);\nvar toObject = __nested_webpack_require_20278__(7908);\nvar callWithSafeIterationClosing = __nested_webpack_require_20278__(3411);\nvar isArrayIteratorMethod = __nested_webpack_require_20278__(7659);\nvar toLength = __nested_webpack_require_20278__(7466);\nvar createProperty = __nested_webpack_require_20278__(6135);\nvar getIteratorMethod = __nested_webpack_require_20278__(1246);\n\n// `Array.from` method implementation\n// https://tc39.es/ecma262/#sec-array.from\nmodule.exports = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = toObject(arrayLike);\n var C = typeof this == 'function' ? this : Array;\n var argumentsLength = arguments.length;\n var mapfn = argumentsLength > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var iteratorMethod = getIteratorMethod(O);\n var index = 0;\n var length, result, step, iterator, next, value;\n if (mapping) mapfn = bind(mapfn, argumentsLength > 2 ? arguments[2] : undefined, 2);\n // if the target is not iterable or it's an array with the default iterator - use a simple case\n if (iteratorMethod != undefined && !(C == Array && isArrayIteratorMethod(iteratorMethod))) {\n iterator = iteratorMethod.call(O);\n next = iterator.next;\n result = new C();\n for (;!(step = next.call(iterator)).done; index++) {\n value = mapping ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true) : step.value;\n createProperty(result, index, value);\n }\n } else {\n length = toLength(O.length);\n result = new C(length);\n for (;length > index; index++) {\n value = mapping ? mapfn(O[index], index) : O[index];\n createProperty(result, index, value);\n }\n }\n result.length = index;\n return result;\n};\n\n\n/***/ }),\n\n/***/ 1318:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_22092__) {\n\nvar toIndexedObject = __nested_webpack_require_22092__(5656);\nvar toLength = __nested_webpack_require_22092__(7466);\nvar toAbsoluteIndex = __nested_webpack_require_22092__(1400);\n\n// `Array.prototype.{ indexOf, includes }` methods implementation\nvar createMethod = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIndexedObject($this);\n var length = toLength(O.length);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare -- NaN check\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare -- NaN check\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) {\n if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.includes` method\n // https://tc39.es/ecma262/#sec-array.prototype.includes\n includes: createMethod(true),\n // `Array.prototype.indexOf` method\n // https://tc39.es/ecma262/#sec-array.prototype.indexof\n indexOf: createMethod(false)\n};\n\n\n/***/ }),\n\n/***/ 2092:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_23446__) {\n\nvar bind = __nested_webpack_require_23446__(9974);\nvar IndexedObject = __nested_webpack_require_23446__(8361);\nvar toObject = __nested_webpack_require_23446__(7908);\nvar toLength = __nested_webpack_require_23446__(7466);\nvar arraySpeciesCreate = __nested_webpack_require_23446__(5417);\n\nvar push = [].push;\n\n// `Array.prototype.{ forEach, map, filter, some, every, find, findIndex, filterOut }` methods implementation\nvar createMethod = function (TYPE) {\n var IS_MAP = TYPE == 1;\n var IS_FILTER = TYPE == 2;\n var IS_SOME = TYPE == 3;\n var IS_EVERY = TYPE == 4;\n var IS_FIND_INDEX = TYPE == 6;\n var IS_FILTER_OUT = TYPE == 7;\n var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n return function ($this, callbackfn, that, specificCreate) {\n var O = toObject($this);\n var self = IndexedObject(O);\n var boundFunction = bind(callbackfn, that, 3);\n var length = toLength(self.length);\n var index = 0;\n var create = specificCreate || arraySpeciesCreate;\n var target = IS_MAP ? create($this, length) : IS_FILTER || IS_FILTER_OUT ? create($this, 0) : undefined;\n var value, result;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n value = self[index];\n result = boundFunction(value, index, O);\n if (TYPE) {\n if (IS_MAP) target[index] = result; // map\n else if (result) switch (TYPE) {\n case 3: return true; // some\n case 5: return value; // find\n case 6: return index; // findIndex\n case 2: push.call(target, value); // filter\n } else switch (TYPE) {\n case 4: return false; // every\n case 7: push.call(target, value); // filterOut\n }\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.forEach` method\n // https://tc39.es/ecma262/#sec-array.prototype.foreach\n forEach: createMethod(0),\n // `Array.prototype.map` method\n // https://tc39.es/ecma262/#sec-array.prototype.map\n map: createMethod(1),\n // `Array.prototype.filter` method\n // https://tc39.es/ecma262/#sec-array.prototype.filter\n filter: createMethod(2),\n // `Array.prototype.some` method\n // https://tc39.es/ecma262/#sec-array.prototype.some\n some: createMethod(3),\n // `Array.prototype.every` method\n // https://tc39.es/ecma262/#sec-array.prototype.every\n every: createMethod(4),\n // `Array.prototype.find` method\n // https://tc39.es/ecma262/#sec-array.prototype.find\n find: createMethod(5),\n // `Array.prototype.findIndex` method\n // https://tc39.es/ecma262/#sec-array.prototype.findIndex\n findIndex: createMethod(6),\n // `Array.prototype.filterOut` method\n // https://github.com/tc39/proposal-array-filtering\n filterOut: createMethod(7)\n};\n\n\n/***/ }),\n\n/***/ 6583:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_26271__) {\n\n\"use strict\";\n\nvar toIndexedObject = __nested_webpack_require_26271__(5656);\nvar toInteger = __nested_webpack_require_26271__(9958);\nvar toLength = __nested_webpack_require_26271__(7466);\nvar arrayMethodIsStrict = __nested_webpack_require_26271__(9341);\n\nvar min = Math.min;\nvar nativeLastIndexOf = [].lastIndexOf;\nvar NEGATIVE_ZERO = !!nativeLastIndexOf && 1 / [1].lastIndexOf(1, -0) < 0;\nvar STRICT_METHOD = arrayMethodIsStrict('lastIndexOf');\nvar FORCED = NEGATIVE_ZERO || !STRICT_METHOD;\n\n// `Array.prototype.lastIndexOf` method implementation\n// https://tc39.es/ecma262/#sec-array.prototype.lastindexof\nmodule.exports = FORCED ? function lastIndexOf(searchElement /* , fromIndex = @[*-1] */) {\n // convert -0 to +0\n if (NEGATIVE_ZERO) return nativeLastIndexOf.apply(this, arguments) || 0;\n var O = toIndexedObject(this);\n var length = toLength(O.length);\n var index = length - 1;\n if (arguments.length > 1) index = min(index, toInteger(arguments[1]));\n if (index < 0) index = length + index;\n for (;index >= 0; index--) if (index in O && O[index] === searchElement) return index || 0;\n return -1;\n} : nativeLastIndexOf;\n\n\n/***/ }),\n\n/***/ 1194:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_27452__) {\n\nvar fails = __nested_webpack_require_27452__(7293);\nvar wellKnownSymbol = __nested_webpack_require_27452__(5112);\nvar V8_VERSION = __nested_webpack_require_27452__(7392);\n\nvar SPECIES = wellKnownSymbol('species');\n\nmodule.exports = function (METHOD_NAME) {\n // We can't use this feature detection in V8 since it causes\n // deoptimization and serious performance degradation\n // https://github.com/zloirock/core-js/issues/677\n return V8_VERSION >= 51 || !fails(function () {\n var array = [];\n var constructor = array.constructor = {};\n constructor[SPECIES] = function () {\n return { foo: 1 };\n };\n return array[METHOD_NAME](Boolean).foo !== 1;\n });\n};\n\n\n/***/ }),\n\n/***/ 9341:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_28188__) {\n\n\"use strict\";\n\nvar fails = __nested_webpack_require_28188__(7293);\n\nmodule.exports = function (METHOD_NAME, argument) {\n var method = [][METHOD_NAME];\n return !!method && fails(function () {\n // eslint-disable-next-line no-useless-call,no-throw-literal -- required for testing\n method.call(null, argument || function () { throw 1; }, 1);\n });\n};\n\n\n/***/ }),\n\n/***/ 3671:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_28629__) {\n\nvar aFunction = __nested_webpack_require_28629__(3099);\nvar toObject = __nested_webpack_require_28629__(7908);\nvar IndexedObject = __nested_webpack_require_28629__(8361);\nvar toLength = __nested_webpack_require_28629__(7466);\n\n// `Array.prototype.{ reduce, reduceRight }` methods implementation\nvar createMethod = function (IS_RIGHT) {\n return function (that, callbackfn, argumentsLength, memo) {\n aFunction(callbackfn);\n var O = toObject(that);\n var self = IndexedObject(O);\n var length = toLength(O.length);\n var index = IS_RIGHT ? length - 1 : 0;\n var i = IS_RIGHT ? -1 : 1;\n if (argumentsLength < 2) while (true) {\n if (index in self) {\n memo = self[index];\n index += i;\n break;\n }\n index += i;\n if (IS_RIGHT ? index < 0 : length <= index) {\n throw TypeError('Reduce of empty array with no initial value');\n }\n }\n for (;IS_RIGHT ? index >= 0 : length > index; index += i) if (index in self) {\n memo = callbackfn(memo, self[index], index, O);\n }\n return memo;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.reduce` method\n // https://tc39.es/ecma262/#sec-array.prototype.reduce\n left: createMethod(false),\n // `Array.prototype.reduceRight` method\n // https://tc39.es/ecma262/#sec-array.prototype.reduceright\n right: createMethod(true)\n};\n\n\n/***/ }),\n\n/***/ 5417:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_30017__) {\n\nvar isObject = __nested_webpack_require_30017__(111);\nvar isArray = __nested_webpack_require_30017__(3157);\nvar wellKnownSymbol = __nested_webpack_require_30017__(5112);\n\nvar SPECIES = wellKnownSymbol('species');\n\n// `ArraySpeciesCreate` abstract operation\n// https://tc39.es/ecma262/#sec-arrayspeciescreate\nmodule.exports = function (originalArray, length) {\n var C;\n if (isArray(originalArray)) {\n C = originalArray.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n else if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return new (C === undefined ? Array : C)(length === 0 ? 0 : length);\n};\n\n\n/***/ }),\n\n/***/ 3411:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_30798__) {\n\nvar anObject = __nested_webpack_require_30798__(9670);\nvar iteratorClose = __nested_webpack_require_30798__(9212);\n\n// call something on iterator step with safe closing on error\nmodule.exports = function (iterator, fn, value, ENTRIES) {\n try {\n return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value);\n // 7.4.6 IteratorClose(iterator, completion)\n } catch (error) {\n iteratorClose(iterator);\n throw error;\n }\n};\n\n\n/***/ }),\n\n/***/ 7072:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_31303__) {\n\nvar wellKnownSymbol = __nested_webpack_require_31303__(5112);\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var called = 0;\n var iteratorWithReturn = {\n next: function () {\n return { done: !!called++ };\n },\n 'return': function () {\n SAFE_CLOSING = true;\n }\n };\n iteratorWithReturn[ITERATOR] = function () {\n return this;\n };\n // eslint-disable-next-line no-throw-literal -- required for testing\n Array.from(iteratorWithReturn, function () { throw 2; });\n} catch (error) { /* empty */ }\n\nmodule.exports = function (exec, SKIP_CLOSING) {\n if (!SKIP_CLOSING && !SAFE_CLOSING) return false;\n var ITERATION_SUPPORT = false;\n try {\n var object = {};\n object[ITERATOR] = function () {\n return {\n next: function () {\n return { done: ITERATION_SUPPORT = true };\n }\n };\n };\n exec(object);\n } catch (error) { /* empty */ }\n return ITERATION_SUPPORT;\n};\n\n\n/***/ }),\n\n/***/ 4326:\n/***/ (function(module) {\n\nvar toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n\n\n/***/ }),\n\n/***/ 648:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_32503__) {\n\nvar TO_STRING_TAG_SUPPORT = __nested_webpack_require_32503__(1694);\nvar classofRaw = __nested_webpack_require_32503__(4326);\nvar wellKnownSymbol = __nested_webpack_require_32503__(5112);\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n// ES3 wrong here\nvar CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (error) { /* empty */ }\n};\n\n// getting tag from ES6+ `Object.prototype.toString`\nmodule.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) {\n var O, tag, result;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG)) == 'string' ? tag\n // builtinTag case\n : CORRECT_ARGUMENTS ? classofRaw(O)\n // ES3 arguments fallback\n : (result = classofRaw(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : result;\n};\n\n\n/***/ }),\n\n/***/ 9920:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_33565__) {\n\nvar has = __nested_webpack_require_33565__(6656);\nvar ownKeys = __nested_webpack_require_33565__(3887);\nvar getOwnPropertyDescriptorModule = __nested_webpack_require_33565__(1236);\nvar definePropertyModule = __nested_webpack_require_33565__(3070);\n\nmodule.exports = function (target, source) {\n var keys = ownKeys(source);\n var defineProperty = definePropertyModule.f;\n var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (!has(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n }\n};\n\n\n/***/ }),\n\n/***/ 8544:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_34217__) {\n\nvar fails = __nested_webpack_require_34217__(7293);\n\nmodule.exports = !fails(function () {\n function F() { /* empty */ }\n F.prototype.constructor = null;\n return Object.getPrototypeOf(new F()) !== F.prototype;\n});\n\n\n/***/ }),\n\n/***/ 4994:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_34520__) {\n\n\"use strict\";\n\nvar IteratorPrototype = __nested_webpack_require_34520__(3383).IteratorPrototype;\nvar create = __nested_webpack_require_34520__(30);\nvar createPropertyDescriptor = __nested_webpack_require_34520__(9114);\nvar setToStringTag = __nested_webpack_require_34520__(8003);\nvar Iterators = __nested_webpack_require_34520__(7497);\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (IteratorConstructor, NAME, next) {\n var TO_STRING_TAG = NAME + ' Iterator';\n IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(1, next) });\n setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true);\n Iterators[TO_STRING_TAG] = returnThis;\n return IteratorConstructor;\n};\n\n\n/***/ }),\n\n/***/ 8880:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_35290__) {\n\nvar DESCRIPTORS = __nested_webpack_require_35290__(9781);\nvar definePropertyModule = __nested_webpack_require_35290__(3070);\nvar createPropertyDescriptor = __nested_webpack_require_35290__(9114);\n\nmodule.exports = DESCRIPTORS ? function (object, key, value) {\n return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n\n\n/***/ }),\n\n/***/ 9114:\n/***/ (function(module) {\n\nmodule.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n\n\n/***/ }),\n\n/***/ 6135:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_35996__) {\n\n\"use strict\";\n\nvar toPrimitive = __nested_webpack_require_35996__(7593);\nvar definePropertyModule = __nested_webpack_require_35996__(3070);\nvar createPropertyDescriptor = __nested_webpack_require_35996__(9114);\n\nmodule.exports = function (object, key, value) {\n var propertyKey = toPrimitive(key);\n if (propertyKey in object) definePropertyModule.f(object, propertyKey, createPropertyDescriptor(0, value));\n else object[propertyKey] = value;\n};\n\n\n/***/ }),\n\n/***/ 654:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_36503__) {\n\n\"use strict\";\n\nvar $ = __nested_webpack_require_36503__(2109);\nvar createIteratorConstructor = __nested_webpack_require_36503__(4994);\nvar getPrototypeOf = __nested_webpack_require_36503__(9518);\nvar setPrototypeOf = __nested_webpack_require_36503__(7674);\nvar setToStringTag = __nested_webpack_require_36503__(8003);\nvar createNonEnumerableProperty = __nested_webpack_require_36503__(8880);\nvar redefine = __nested_webpack_require_36503__(1320);\nvar wellKnownSymbol = __nested_webpack_require_36503__(5112);\nvar IS_PURE = __nested_webpack_require_36503__(1913);\nvar Iterators = __nested_webpack_require_36503__(7497);\nvar IteratorsCore = __nested_webpack_require_36503__(3383);\n\nvar IteratorPrototype = IteratorsCore.IteratorPrototype;\nvar BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS;\nvar ITERATOR = wellKnownSymbol('iterator');\nvar KEYS = 'keys';\nvar VALUES = 'values';\nvar ENTRIES = 'entries';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {\n createIteratorConstructor(IteratorConstructor, NAME, next);\n\n var getIterationMethod = function (KIND) {\n if (KIND === DEFAULT && defaultIterator) return defaultIterator;\n if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND];\n switch (KIND) {\n case KEYS: return function keys() { return new IteratorConstructor(this, KIND); };\n case VALUES: return function values() { return new IteratorConstructor(this, KIND); };\n case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); };\n } return function () { return new IteratorConstructor(this); };\n };\n\n var TO_STRING_TAG = NAME + ' Iterator';\n var INCORRECT_VALUES_NAME = false;\n var IterablePrototype = Iterable.prototype;\n var nativeIterator = IterablePrototype[ITERATOR]\n || IterablePrototype['@@iterator']\n || DEFAULT && IterablePrototype[DEFAULT];\n var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT);\n var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;\n var CurrentIteratorPrototype, methods, KEY;\n\n // fix native\n if (anyNativeIterator) {\n CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable()));\n if (IteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) {\n if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) {\n if (setPrototypeOf) {\n setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype);\n } else if (typeof CurrentIteratorPrototype[ITERATOR] != 'function') {\n createNonEnumerableProperty(CurrentIteratorPrototype, ITERATOR, returnThis);\n }\n }\n // Set @@toStringTag to native iterators\n setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true);\n if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis;\n }\n }\n\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) {\n INCORRECT_VALUES_NAME = true;\n defaultIterator = function values() { return nativeIterator.call(this); };\n }\n\n // define iterator\n if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) {\n createNonEnumerableProperty(IterablePrototype, ITERATOR, defaultIterator);\n }\n Iterators[NAME] = defaultIterator;\n\n // export additional methods\n if (DEFAULT) {\n methods = {\n values: getIterationMethod(VALUES),\n keys: IS_SET ? defaultIterator : getIterationMethod(KEYS),\n entries: getIterationMethod(ENTRIES)\n };\n if (FORCED) for (KEY in methods) {\n if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {\n redefine(IterablePrototype, KEY, methods[KEY]);\n }\n } else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods);\n }\n\n return methods;\n};\n\n\n/***/ }),\n\n/***/ 9781:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_40475__) {\n\nvar fails = __nested_webpack_require_40475__(7293);\n\n// Detect IE8's incomplete defineProperty implementation\nmodule.exports = !fails(function () {\n return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7;\n});\n\n\n/***/ }),\n\n/***/ 317:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_40795__) {\n\nvar global = __nested_webpack_require_40795__(7854);\nvar isObject = __nested_webpack_require_40795__(111);\n\nvar document = global.document;\n// typeof document.createElement is 'object' in old IE\nvar EXISTS = isObject(document) && isObject(document.createElement);\n\nmodule.exports = function (it) {\n return EXISTS ? document.createElement(it) : {};\n};\n\n\n/***/ }),\n\n/***/ 8324:\n/***/ (function(module) {\n\n// iterable DOM collections\n// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods\nmodule.exports = {\n CSSRuleList: 0,\n CSSStyleDeclaration: 0,\n CSSValueList: 0,\n ClientRectList: 0,\n DOMRectList: 0,\n DOMStringList: 0,\n DOMTokenList: 1,\n DataTransferItemList: 0,\n FileList: 0,\n HTMLAllCollection: 0,\n HTMLCollection: 0,\n HTMLFormElement: 0,\n HTMLSelectElement: 0,\n MediaList: 0,\n MimeTypeArray: 0,\n NamedNodeMap: 0,\n NodeList: 1,\n PaintRequestList: 0,\n Plugin: 0,\n PluginArray: 0,\n SVGLengthList: 0,\n SVGNumberList: 0,\n SVGPathSegList: 0,\n SVGPointList: 0,\n SVGStringList: 0,\n SVGTransformList: 0,\n SourceBufferList: 0,\n StyleSheetList: 0,\n TextTrackCueList: 0,\n TextTrackList: 0,\n TouchList: 0\n};\n\n\n/***/ }),\n\n/***/ 8113:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_42025__) {\n\nvar getBuiltIn = __nested_webpack_require_42025__(5005);\n\nmodule.exports = getBuiltIn('navigator', 'userAgent') || '';\n\n\n/***/ }),\n\n/***/ 7392:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_42230__) {\n\nvar global = __nested_webpack_require_42230__(7854);\nvar userAgent = __nested_webpack_require_42230__(8113);\n\nvar process = global.process;\nvar versions = process && process.versions;\nvar v8 = versions && versions.v8;\nvar match, version;\n\nif (v8) {\n match = v8.split('.');\n version = match[0] + match[1];\n} else if (userAgent) {\n match = userAgent.match(/Edge\\/(\\d+)/);\n if (!match || match[1] >= 74) {\n match = userAgent.match(/Chrome\\/(\\d+)/);\n if (match) version = match[1];\n }\n}\n\nmodule.exports = version && +version;\n\n\n/***/ }),\n\n/***/ 748:\n/***/ (function(module) {\n\n// IE8- don't enum bug keys\nmodule.exports = [\n 'constructor',\n 'hasOwnProperty',\n 'isPrototypeOf',\n 'propertyIsEnumerable',\n 'toLocaleString',\n 'toString',\n 'valueOf'\n];\n\n\n/***/ }),\n\n/***/ 2109:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_43065__) {\n\nvar global = __nested_webpack_require_43065__(7854);\nvar getOwnPropertyDescriptor = __nested_webpack_require_43065__(1236).f;\nvar createNonEnumerableProperty = __nested_webpack_require_43065__(8880);\nvar redefine = __nested_webpack_require_43065__(1320);\nvar setGlobal = __nested_webpack_require_43065__(3505);\nvar copyConstructorProperties = __nested_webpack_require_43065__(9920);\nvar isForced = __nested_webpack_require_43065__(4705);\n\n/*\n options.target - name of the target object\n options.global - target is the global object\n options.stat - export as static methods of target\n options.proto - export as prototype methods of target\n options.real - real prototype method for the `pure` version\n options.forced - export even if the native feature is available\n options.bind - bind methods to the target, required for the `pure` version\n options.wrap - wrap constructors to preventing global pollution, required for the `pure` version\n options.unsafe - use the simple assignment of property instead of delete + defineProperty\n options.sham - add a flag to not completely full polyfills\n options.enumerable - export as enumerable property\n options.noTargetGet - prevent calling a getter on target\n*/\nmodule.exports = function (options, source) {\n var TARGET = options.target;\n var GLOBAL = options.global;\n var STATIC = options.stat;\n var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n if (GLOBAL) {\n target = global;\n } else if (STATIC) {\n target = global[TARGET] || setGlobal(TARGET, {});\n } else {\n target = (global[TARGET] || {}).prototype;\n }\n if (target) for (key in source) {\n sourceProperty = source[key];\n if (options.noTargetGet) {\n descriptor = getOwnPropertyDescriptor(target, key);\n targetProperty = descriptor && descriptor.value;\n } else targetProperty = target[key];\n FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n // contained in target\n if (!FORCED && targetProperty !== undefined) {\n if (typeof sourceProperty === typeof targetProperty) continue;\n copyConstructorProperties(sourceProperty, targetProperty);\n }\n // add a flag to not completely full polyfills\n if (options.sham || (targetProperty && targetProperty.sham)) {\n createNonEnumerableProperty(sourceProperty, 'sham', true);\n }\n // extend global\n redefine(target, key, sourceProperty, options);\n }\n};\n\n\n/***/ }),\n\n/***/ 7293:\n/***/ (function(module) {\n\nmodule.exports = function (exec) {\n try {\n return !!exec();\n } catch (error) {\n return true;\n }\n};\n\n\n/***/ }),\n\n/***/ 7007:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_45726__) {\n\n\"use strict\";\n\n// TODO: Remove from `core-js@4` since it's moved to entry points\n__nested_webpack_require_45726__(4916);\nvar redefine = __nested_webpack_require_45726__(1320);\nvar fails = __nested_webpack_require_45726__(7293);\nvar wellKnownSymbol = __nested_webpack_require_45726__(5112);\nvar regexpExec = __nested_webpack_require_45726__(2261);\nvar createNonEnumerableProperty = __nested_webpack_require_45726__(8880);\n\nvar SPECIES = wellKnownSymbol('species');\n\nvar REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\n // #replace needs built-in support for named groups.\n // #match works fine because it just return the exec results, even if it has\n // a \"grops\" property.\n var re = /./;\n re.exec = function () {\n var result = [];\n result.groups = { a: '7' };\n return result;\n };\n return ''.replace(re, '$') !== '7';\n});\n\n// IE <= 11 replaces $0 with the whole match, as if it was $&\n// https://stackoverflow.com/questions/6024666/getting-ie-to-replace-a-regex-with-the-literal-string-0\nvar REPLACE_KEEPS_$0 = (function () {\n return 'a'.replace(/./, '$0') === '$0';\n})();\n\nvar REPLACE = wellKnownSymbol('replace');\n// Safari <= 13.0.3(?) substitutes nth capture where n>m with an empty string\nvar REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = (function () {\n if (/./[REPLACE]) {\n return /./[REPLACE]('a', '$0') === '';\n }\n return false;\n})();\n\n// Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n// Weex JS has frozen built-in prototypes, so use try / catch wrapper\nvar SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = !fails(function () {\n // eslint-disable-next-line regexp/no-empty-group -- required for testing\n var re = /(?:)/;\n var originalExec = re.exec;\n re.exec = function () { return originalExec.apply(this, arguments); };\n var result = 'ab'.split(re);\n return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b';\n});\n\nmodule.exports = function (KEY, length, exec, sham) {\n var SYMBOL = wellKnownSymbol(KEY);\n\n var DELEGATES_TO_SYMBOL = !fails(function () {\n // String methods call symbol-named RegEp methods\n var O = {};\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) != 7;\n });\n\n var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails(function () {\n // Symbol-named RegExp methods call .exec\n var execCalled = false;\n var re = /a/;\n\n if (KEY === 'split') {\n // We can't use real regex here since it causes deoptimization\n // and serious performance degradation in V8\n // https://github.com/zloirock/core-js/issues/306\n re = {};\n // RegExp[@@split] doesn't call the regex's exec method, but first creates\n // a new one. We need to return the patched regex when creating the new one.\n re.constructor = {};\n re.constructor[SPECIES] = function () { return re; };\n re.flags = '';\n re[SYMBOL] = /./[SYMBOL];\n }\n\n re.exec = function () { execCalled = true; return null; };\n\n re[SYMBOL]('');\n return !execCalled;\n });\n\n if (\n !DELEGATES_TO_SYMBOL ||\n !DELEGATES_TO_EXEC ||\n (KEY === 'replace' && !(\n REPLACE_SUPPORTS_NAMED_GROUPS &&\n REPLACE_KEEPS_$0 &&\n !REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE\n )) ||\n (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC)\n ) {\n var nativeRegExpMethod = /./[SYMBOL];\n var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) {\n if (regexp.exec === regexpExec) {\n if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n // The native String method already delegates to @@method (this\n // polyfilled function), leasing to infinite recursion.\n // We avoid it by directly calling the native @@method method.\n return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };\n }\n return { done: true, value: nativeMethod.call(str, regexp, arg2) };\n }\n return { done: false };\n }, {\n REPLACE_KEEPS_$0: REPLACE_KEEPS_$0,\n REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE: REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE\n });\n var stringMethod = methods[0];\n var regexMethod = methods[1];\n\n redefine(String.prototype, KEY, stringMethod);\n redefine(RegExp.prototype, SYMBOL, length == 2\n // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n ? function (string, arg) { return regexMethod.call(string, this, arg); }\n // 21.2.5.6 RegExp.prototype[@@match](string)\n // 21.2.5.9 RegExp.prototype[@@search](string)\n : function (string) { return regexMethod.call(string, this); }\n );\n }\n\n if (sham) createNonEnumerableProperty(RegExp.prototype[SYMBOL], 'sham', true);\n};\n\n\n/***/ }),\n\n/***/ 9974:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_50488__) {\n\nvar aFunction = __nested_webpack_require_50488__(3099);\n\n// optional / simple context binding\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 0: return function () {\n return fn.call(that);\n };\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n\n\n/***/ }),\n\n/***/ 5005:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_51177__) {\n\nvar path = __nested_webpack_require_51177__(857);\nvar global = __nested_webpack_require_51177__(7854);\n\nvar aFunction = function (variable) {\n return typeof variable == 'function' ? variable : undefined;\n};\n\nmodule.exports = function (namespace, method) {\n return arguments.length < 2 ? aFunction(path[namespace]) || aFunction(global[namespace])\n : path[namespace] && path[namespace][method] || global[namespace] && global[namespace][method];\n};\n\n\n/***/ }),\n\n/***/ 1246:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_51701__) {\n\nvar classof = __nested_webpack_require_51701__(648);\nvar Iterators = __nested_webpack_require_51701__(7497);\nvar wellKnownSymbol = __nested_webpack_require_51701__(5112);\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = function (it) {\n if (it != undefined) return it[ITERATOR]\n || it['@@iterator']\n || Iterators[classof(it)];\n};\n\n\n/***/ }),\n\n/***/ 8554:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_52112__) {\n\nvar anObject = __nested_webpack_require_52112__(9670);\nvar getIteratorMethod = __nested_webpack_require_52112__(1246);\n\nmodule.exports = function (it) {\n var iteratorMethod = getIteratorMethod(it);\n if (typeof iteratorMethod != 'function') {\n throw TypeError(String(it) + ' is not iterable');\n } return anObject(iteratorMethod.call(it));\n};\n\n\n/***/ }),\n\n/***/ 647:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_52531__) {\n\nvar toObject = __nested_webpack_require_52531__(7908);\n\nvar floor = Math.floor;\nvar replace = ''.replace;\nvar SUBSTITUTION_SYMBOLS = /\\$([$&'`]|\\d\\d?|<[^>]*>)/g;\nvar SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&'`]|\\d\\d?)/g;\n\n// https://tc39.es/ecma262/#sec-getsubstitution\nmodule.exports = function (matched, str, position, captures, namedCaptures, replacement) {\n var tailPos = position + matched.length;\n var m = captures.length;\n var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\n if (namedCaptures !== undefined) {\n namedCaptures = toObject(namedCaptures);\n symbols = SUBSTITUTION_SYMBOLS;\n }\n return replace.call(replacement, symbols, function (match, ch) {\n var capture;\n switch (ch.charAt(0)) {\n case '$': return '$';\n case '&': return matched;\n case '`': return str.slice(0, position);\n case \"'\": return str.slice(tailPos);\n case '<':\n capture = namedCaptures[ch.slice(1, -1)];\n break;\n default: // \\d\\d?\n var n = +ch;\n if (n === 0) return match;\n if (n > m) {\n var f = floor(n / 10);\n if (f === 0) return match;\n if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);\n return match;\n }\n capture = captures[n - 1];\n }\n return capture === undefined ? '' : capture;\n });\n};\n\n\n/***/ }),\n\n/***/ 7854:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_53970__) {\n\nvar check = function (it) {\n return it && it.Math == Math && it;\n};\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nmodule.exports =\n /* global globalThis -- safe */\n check(typeof globalThis == 'object' && globalThis) ||\n check(typeof window == 'object' && window) ||\n check(typeof self == 'object' && self) ||\n check(typeof __nested_webpack_require_53970__.g == 'object' && __nested_webpack_require_53970__.g) ||\n // eslint-disable-next-line no-new-func -- fallback\n (function () { return this; })() || Function('return this')();\n\n\n/***/ }),\n\n/***/ 6656:\n/***/ (function(module) {\n\nvar hasOwnProperty = {}.hasOwnProperty;\n\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n\n\n/***/ }),\n\n/***/ 3501:\n/***/ (function(module) {\n\nmodule.exports = {};\n\n\n/***/ }),\n\n/***/ 490:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_54852__) {\n\nvar getBuiltIn = __nested_webpack_require_54852__(5005);\n\nmodule.exports = getBuiltIn('document', 'documentElement');\n\n\n/***/ }),\n\n/***/ 4664:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_55056__) {\n\nvar DESCRIPTORS = __nested_webpack_require_55056__(9781);\nvar fails = __nested_webpack_require_55056__(7293);\nvar createElement = __nested_webpack_require_55056__(317);\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !DESCRIPTORS && !fails(function () {\n return Object.defineProperty(createElement('div'), 'a', {\n get: function () { return 7; }\n }).a != 7;\n});\n\n\n/***/ }),\n\n/***/ 1179:\n/***/ (function(module) {\n\n// IEEE754 conversions based on https://github.com/feross/ieee754\nvar abs = Math.abs;\nvar pow = Math.pow;\nvar floor = Math.floor;\nvar log = Math.log;\nvar LN2 = Math.LN2;\n\nvar pack = function (number, mantissaLength, bytes) {\n var buffer = new Array(bytes);\n var exponentLength = bytes * 8 - mantissaLength - 1;\n var eMax = (1 << exponentLength) - 1;\n var eBias = eMax >> 1;\n var rt = mantissaLength === 23 ? pow(2, -24) - pow(2, -77) : 0;\n var sign = number < 0 || number === 0 && 1 / number < 0 ? 1 : 0;\n var index = 0;\n var exponent, mantissa, c;\n number = abs(number);\n // eslint-disable-next-line no-self-compare -- NaN check\n if (number != number || number === Infinity) {\n // eslint-disable-next-line no-self-compare -- NaN check\n mantissa = number != number ? 1 : 0;\n exponent = eMax;\n } else {\n exponent = floor(log(number) / LN2);\n if (number * (c = pow(2, -exponent)) < 1) {\n exponent--;\n c *= 2;\n }\n if (exponent + eBias >= 1) {\n number += rt / c;\n } else {\n number += rt * pow(2, 1 - eBias);\n }\n if (number * c >= 2) {\n exponent++;\n c /= 2;\n }\n if (exponent + eBias >= eMax) {\n mantissa = 0;\n exponent = eMax;\n } else if (exponent + eBias >= 1) {\n mantissa = (number * c - 1) * pow(2, mantissaLength);\n exponent = exponent + eBias;\n } else {\n mantissa = number * pow(2, eBias - 1) * pow(2, mantissaLength);\n exponent = 0;\n }\n }\n for (; mantissaLength >= 8; buffer[index++] = mantissa & 255, mantissa /= 256, mantissaLength -= 8);\n exponent = exponent << mantissaLength | mantissa;\n exponentLength += mantissaLength;\n for (; exponentLength > 0; buffer[index++] = exponent & 255, exponent /= 256, exponentLength -= 8);\n buffer[--index] |= sign * 128;\n return buffer;\n};\n\nvar unpack = function (buffer, mantissaLength) {\n var bytes = buffer.length;\n var exponentLength = bytes * 8 - mantissaLength - 1;\n var eMax = (1 << exponentLength) - 1;\n var eBias = eMax >> 1;\n var nBits = exponentLength - 7;\n var index = bytes - 1;\n var sign = buffer[index--];\n var exponent = sign & 127;\n var mantissa;\n sign >>= 7;\n for (; nBits > 0; exponent = exponent * 256 + buffer[index], index--, nBits -= 8);\n mantissa = exponent & (1 << -nBits) - 1;\n exponent >>= -nBits;\n nBits += mantissaLength;\n for (; nBits > 0; mantissa = mantissa * 256 + buffer[index], index--, nBits -= 8);\n if (exponent === 0) {\n exponent = 1 - eBias;\n } else if (exponent === eMax) {\n return mantissa ? NaN : sign ? -Infinity : Infinity;\n } else {\n mantissa = mantissa + pow(2, mantissaLength);\n exponent = exponent - eBias;\n } return (sign ? -1 : 1) * mantissa * pow(2, exponent - mantissaLength);\n};\n\nmodule.exports = {\n pack: pack,\n unpack: unpack\n};\n\n\n/***/ }),\n\n/***/ 8361:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_58329__) {\n\nvar fails = __nested_webpack_require_58329__(7293);\nvar classof = __nested_webpack_require_58329__(4326);\n\nvar split = ''.split;\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nmodule.exports = fails(function () {\n // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n // eslint-disable-next-line no-prototype-builtins -- safe\n return !Object('z').propertyIsEnumerable(0);\n}) ? function (it) {\n return classof(it) == 'String' ? split.call(it, '') : Object(it);\n} : Object;\n\n\n/***/ }),\n\n/***/ 9587:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_58925__) {\n\nvar isObject = __nested_webpack_require_58925__(111);\nvar setPrototypeOf = __nested_webpack_require_58925__(7674);\n\n// makes subclassing work correct for wrapped built-ins\nmodule.exports = function ($this, dummy, Wrapper) {\n var NewTarget, NewTargetPrototype;\n if (\n // it can work only with native `setPrototypeOf`\n setPrototypeOf &&\n // we haven't completely correct pre-ES6 way for getting `new.target`, so use this\n typeof (NewTarget = dummy.constructor) == 'function' &&\n NewTarget !== Wrapper &&\n isObject(NewTargetPrototype = NewTarget.prototype) &&\n NewTargetPrototype !== Wrapper.prototype\n ) setPrototypeOf($this, NewTargetPrototype);\n return $this;\n};\n\n\n/***/ }),\n\n/***/ 2788:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_59686__) {\n\nvar store = __nested_webpack_require_59686__(5465);\n\nvar functionToString = Function.toString;\n\n// this helper broken in `3.4.1-3.4.4`, so we can't use `shared` helper\nif (typeof store.inspectSource != 'function') {\n store.inspectSource = function (it) {\n return functionToString.call(it);\n };\n}\n\nmodule.exports = store.inspectSource;\n\n\n/***/ }),\n\n/***/ 9909:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_60112__) {\n\nvar NATIVE_WEAK_MAP = __nested_webpack_require_60112__(8536);\nvar global = __nested_webpack_require_60112__(7854);\nvar isObject = __nested_webpack_require_60112__(111);\nvar createNonEnumerableProperty = __nested_webpack_require_60112__(8880);\nvar objectHas = __nested_webpack_require_60112__(6656);\nvar shared = __nested_webpack_require_60112__(5465);\nvar sharedKey = __nested_webpack_require_60112__(6200);\nvar hiddenKeys = __nested_webpack_require_60112__(3501);\n\nvar WeakMap = global.WeakMap;\nvar set, get, has;\n\nvar enforce = function (it) {\n return has(it) ? get(it) : set(it, {});\n};\n\nvar getterFor = function (TYPE) {\n return function (it) {\n var state;\n if (!isObject(it) || (state = get(it)).type !== TYPE) {\n throw TypeError('Incompatible receiver, ' + TYPE + ' required');\n } return state;\n };\n};\n\nif (NATIVE_WEAK_MAP) {\n var store = shared.state || (shared.state = new WeakMap());\n var wmget = store.get;\n var wmhas = store.has;\n var wmset = store.set;\n set = function (it, metadata) {\n metadata.facade = it;\n wmset.call(store, it, metadata);\n return metadata;\n };\n get = function (it) {\n return wmget.call(store, it) || {};\n };\n has = function (it) {\n return wmhas.call(store, it);\n };\n} else {\n var STATE = sharedKey('state');\n hiddenKeys[STATE] = true;\n set = function (it, metadata) {\n metadata.facade = it;\n createNonEnumerableProperty(it, STATE, metadata);\n return metadata;\n };\n get = function (it) {\n return objectHas(it, STATE) ? it[STATE] : {};\n };\n has = function (it) {\n return objectHas(it, STATE);\n };\n}\n\nmodule.exports = {\n set: set,\n get: get,\n has: has,\n enforce: enforce,\n getterFor: getterFor\n};\n\n\n/***/ }),\n\n/***/ 7659:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_61804__) {\n\nvar wellKnownSymbol = __nested_webpack_require_61804__(5112);\nvar Iterators = __nested_webpack_require_61804__(7497);\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar ArrayPrototype = Array.prototype;\n\n// check on default Array iterator\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it);\n};\n\n\n/***/ }),\n\n/***/ 3157:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_62240__) {\n\nvar classof = __nested_webpack_require_62240__(4326);\n\n// `IsArray` abstract operation\n// https://tc39.es/ecma262/#sec-isarray\nmodule.exports = Array.isArray || function isArray(arg) {\n return classof(arg) == 'Array';\n};\n\n\n/***/ }),\n\n/***/ 4705:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_62548__) {\n\nvar fails = __nested_webpack_require_62548__(7293);\n\nvar replacement = /#|\\.prototype\\./;\n\nvar isForced = function (feature, detection) {\n var value = data[normalize(feature)];\n return value == POLYFILL ? true\n : value == NATIVE ? false\n : typeof detection == 'function' ? fails(detection)\n : !!detection;\n};\n\nvar normalize = isForced.normalize = function (string) {\n return String(string).replace(replacement, '.').toLowerCase();\n};\n\nvar data = isForced.data = {};\nvar NATIVE = isForced.NATIVE = 'N';\nvar POLYFILL = isForced.POLYFILL = 'P';\n\nmodule.exports = isForced;\n\n\n/***/ }),\n\n/***/ 111:\n/***/ (function(module) {\n\nmodule.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n\n\n/***/ }),\n\n/***/ 1913:\n/***/ (function(module) {\n\nmodule.exports = false;\n\n\n/***/ }),\n\n/***/ 7850:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_63453__) {\n\nvar isObject = __nested_webpack_require_63453__(111);\nvar classof = __nested_webpack_require_63453__(4326);\nvar wellKnownSymbol = __nested_webpack_require_63453__(5112);\n\nvar MATCH = wellKnownSymbol('match');\n\n// `IsRegExp` abstract operation\n// https://tc39.es/ecma262/#sec-isregexp\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classof(it) == 'RegExp');\n};\n\n\n/***/ }),\n\n/***/ 9212:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_63953__) {\n\nvar anObject = __nested_webpack_require_63953__(9670);\n\nmodule.exports = function (iterator) {\n var returnMethod = iterator['return'];\n if (returnMethod !== undefined) {\n return anObject(returnMethod.call(iterator)).value;\n }\n};\n\n\n/***/ }),\n\n/***/ 3383:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_64274__) {\n\n\"use strict\";\n\nvar fails = __nested_webpack_require_64274__(7293);\nvar getPrototypeOf = __nested_webpack_require_64274__(9518);\nvar createNonEnumerableProperty = __nested_webpack_require_64274__(8880);\nvar has = __nested_webpack_require_64274__(6656);\nvar wellKnownSymbol = __nested_webpack_require_64274__(5112);\nvar IS_PURE = __nested_webpack_require_64274__(1913);\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar BUGGY_SAFARI_ITERATORS = false;\n\nvar returnThis = function () { return this; };\n\n// `%IteratorPrototype%` object\n// https://tc39.es/ecma262/#sec-%iteratorprototype%-object\nvar IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;\n\nif ([].keys) {\n arrayIterator = [].keys();\n // Safari 8 has buggy iterators w/o `next`\n if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;\n else {\n PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator));\n if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;\n }\n}\n\nvar NEW_ITERATOR_PROTOTYPE = IteratorPrototype == undefined || fails(function () {\n var test = {};\n // FF44- legacy iterators case\n return IteratorPrototype[ITERATOR].call(test) !== test;\n});\n\nif (NEW_ITERATOR_PROTOTYPE) IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nif ((!IS_PURE || NEW_ITERATOR_PROTOTYPE) && !has(IteratorPrototype, ITERATOR)) {\n createNonEnumerableProperty(IteratorPrototype, ITERATOR, returnThis);\n}\n\nmodule.exports = {\n IteratorPrototype: IteratorPrototype,\n BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS\n};\n\n\n/***/ }),\n\n/***/ 7497:\n/***/ (function(module) {\n\nmodule.exports = {};\n\n\n/***/ }),\n\n/***/ 133:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_65970__) {\n\nvar fails = __nested_webpack_require_65970__(7293);\n\nmodule.exports = !!Object.getOwnPropertySymbols && !fails(function () {\n // Chrome 38 Symbol has incorrect toString conversion\n /* global Symbol -- required for testing */\n return !String(Symbol());\n});\n\n\n/***/ }),\n\n/***/ 590:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_66314__) {\n\nvar fails = __nested_webpack_require_66314__(7293);\nvar wellKnownSymbol = __nested_webpack_require_66314__(5112);\nvar IS_PURE = __nested_webpack_require_66314__(1913);\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = !fails(function () {\n var url = new URL('b?a=1&b=2&c=3', 'http://a');\n var searchParams = url.searchParams;\n var result = '';\n url.pathname = 'c%20d';\n searchParams.forEach(function (value, key) {\n searchParams['delete']('b');\n result += key + value;\n });\n return (IS_PURE && !url.toJSON)\n || !searchParams.sort\n || url.href !== 'http://a/c%20d?a=1&c=3'\n || searchParams.get('c') !== '3'\n || String(new URLSearchParams('?a=1')) !== 'a=1'\n || !searchParams[ITERATOR]\n // throws in Edge\n || new URL('https://a@b').username !== 'a'\n || new URLSearchParams(new URLSearchParams('a=b')).get('a') !== 'b'\n // not punycoded in Edge\n || new URL('http://тест').host !== 'xn--e1aybc'\n // not escaped in Chrome 62-\n || new URL('http://a#б').hash !== '#%D0%B1'\n // fails in Chrome 66-\n || result !== 'a1c3'\n // throws in Safari\n || new URL('http://x', undefined).host !== 'x';\n});\n\n\n/***/ }),\n\n/***/ 8536:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_67534__) {\n\nvar global = __nested_webpack_require_67534__(7854);\nvar inspectSource = __nested_webpack_require_67534__(2788);\n\nvar WeakMap = global.WeakMap;\n\nmodule.exports = typeof WeakMap === 'function' && /native code/.test(inspectSource(WeakMap));\n\n\n/***/ }),\n\n/***/ 1574:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_67846__) {\n\n\"use strict\";\n\nvar DESCRIPTORS = __nested_webpack_require_67846__(9781);\nvar fails = __nested_webpack_require_67846__(7293);\nvar objectKeys = __nested_webpack_require_67846__(1956);\nvar getOwnPropertySymbolsModule = __nested_webpack_require_67846__(5181);\nvar propertyIsEnumerableModule = __nested_webpack_require_67846__(5296);\nvar toObject = __nested_webpack_require_67846__(7908);\nvar IndexedObject = __nested_webpack_require_67846__(8361);\n\nvar nativeAssign = Object.assign;\nvar defineProperty = Object.defineProperty;\n\n// `Object.assign` method\n// https://tc39.es/ecma262/#sec-object.assign\nmodule.exports = !nativeAssign || fails(function () {\n // should have correct order of operations (Edge bug)\n if (DESCRIPTORS && nativeAssign({ b: 1 }, nativeAssign(defineProperty({}, 'a', {\n enumerable: true,\n get: function () {\n defineProperty(this, 'b', {\n value: 3,\n enumerable: false\n });\n }\n }), { b: 2 })).b !== 1) return true;\n // should work with symbols and should have deterministic property order (V8 bug)\n var A = {};\n var B = {};\n /* global Symbol -- required for testing */\n var symbol = Symbol();\n var alphabet = 'abcdefghijklmnopqrst';\n A[symbol] = 7;\n alphabet.split('').forEach(function (chr) { B[chr] = chr; });\n return nativeAssign({}, A)[symbol] != 7 || objectKeys(nativeAssign({}, B)).join('') != alphabet;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars -- required for `.length`\n var T = toObject(target);\n var argumentsLength = arguments.length;\n var index = 1;\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n var propertyIsEnumerable = propertyIsEnumerableModule.f;\n while (argumentsLength > index) {\n var S = IndexedObject(arguments[index++]);\n var keys = getOwnPropertySymbols ? objectKeys(S).concat(getOwnPropertySymbols(S)) : objectKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) {\n key = keys[j++];\n if (!DESCRIPTORS || propertyIsEnumerable.call(S, key)) T[key] = S[key];\n }\n } return T;\n} : nativeAssign;\n\n\n/***/ }),\n\n/***/ 30:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_69941__) {\n\nvar anObject = __nested_webpack_require_69941__(9670);\nvar defineProperties = __nested_webpack_require_69941__(6048);\nvar enumBugKeys = __nested_webpack_require_69941__(748);\nvar hiddenKeys = __nested_webpack_require_69941__(3501);\nvar html = __nested_webpack_require_69941__(490);\nvar documentCreateElement = __nested_webpack_require_69941__(317);\nvar sharedKey = __nested_webpack_require_69941__(6200);\n\nvar GT = '>';\nvar LT = '<';\nvar PROTOTYPE = 'prototype';\nvar SCRIPT = 'script';\nvar IE_PROTO = sharedKey('IE_PROTO');\n\nvar EmptyConstructor = function () { /* empty */ };\n\nvar scriptTag = function (content) {\n return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;\n};\n\n// Create object with fake `null` prototype: use ActiveX Object with cleared prototype\nvar NullProtoObjectViaActiveX = function (activeXDocument) {\n activeXDocument.write(scriptTag(''));\n activeXDocument.close();\n var temp = activeXDocument.parentWindow.Object;\n activeXDocument = null; // avoid memory leak\n return temp;\n};\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar NullProtoObjectViaIFrame = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = documentCreateElement('iframe');\n var JS = 'java' + SCRIPT + ':';\n var iframeDocument;\n iframe.style.display = 'none';\n html.appendChild(iframe);\n // https://github.com/zloirock/core-js/issues/475\n iframe.src = String(JS);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(scriptTag('document.F=Object'));\n iframeDocument.close();\n return iframeDocument.F;\n};\n\n// Check for document.domain and active x support\n// No need to use active x approach when document.domain is not set\n// see https://github.com/es-shims/es5-shim/issues/150\n// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346\n// avoid IE GC bug\nvar activeXDocument;\nvar NullProtoObject = function () {\n try {\n /* global ActiveXObject -- old IE */\n activeXDocument = document.domain && new ActiveXObject('htmlfile');\n } catch (error) { /* ignore */ }\n NullProtoObject = activeXDocument ? NullProtoObjectViaActiveX(activeXDocument) : NullProtoObjectViaIFrame();\n var length = enumBugKeys.length;\n while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];\n return NullProtoObject();\n};\n\nhiddenKeys[IE_PROTO] = true;\n\n// `Object.create` method\n// https://tc39.es/ecma262/#sec-object.create\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n EmptyConstructor[PROTOTYPE] = anObject(O);\n result = new EmptyConstructor();\n EmptyConstructor[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = NullProtoObject();\n return Properties === undefined ? result : defineProperties(result, Properties);\n};\n\n\n/***/ }),\n\n/***/ 6048:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_72835__) {\n\nvar DESCRIPTORS = __nested_webpack_require_72835__(9781);\nvar definePropertyModule = __nested_webpack_require_72835__(3070);\nvar anObject = __nested_webpack_require_72835__(9670);\nvar objectKeys = __nested_webpack_require_72835__(1956);\n\n// `Object.defineProperties` method\n// https://tc39.es/ecma262/#sec-object.defineproperties\nmodule.exports = DESCRIPTORS ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = objectKeys(Properties);\n var length = keys.length;\n var index = 0;\n var key;\n while (length > index) definePropertyModule.f(O, key = keys[index++], Properties[key]);\n return O;\n};\n\n\n/***/ }),\n\n/***/ 3070:\n/***/ (function(__unused_webpack_module, exports, __nested_webpack_require_73525__) {\n\nvar DESCRIPTORS = __nested_webpack_require_73525__(9781);\nvar IE8_DOM_DEFINE = __nested_webpack_require_73525__(4664);\nvar anObject = __nested_webpack_require_73525__(9670);\nvar toPrimitive = __nested_webpack_require_73525__(7593);\n\nvar nativeDefineProperty = Object.defineProperty;\n\n// `Object.defineProperty` method\n// https://tc39.es/ecma262/#sec-object.defineproperty\nexports.f = DESCRIPTORS ? nativeDefineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return nativeDefineProperty(O, P, Attributes);\n } catch (error) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n\n\n/***/ }),\n\n/***/ 1236:\n/***/ (function(__unused_webpack_module, exports, __nested_webpack_require_74380__) {\n\nvar DESCRIPTORS = __nested_webpack_require_74380__(9781);\nvar propertyIsEnumerableModule = __nested_webpack_require_74380__(5296);\nvar createPropertyDescriptor = __nested_webpack_require_74380__(9114);\nvar toIndexedObject = __nested_webpack_require_74380__(5656);\nvar toPrimitive = __nested_webpack_require_74380__(7593);\nvar has = __nested_webpack_require_74380__(6656);\nvar IE8_DOM_DEFINE = __nested_webpack_require_74380__(4664);\n\nvar nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor\nexports.f = DESCRIPTORS ? nativeGetOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n O = toIndexedObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return nativeGetOwnPropertyDescriptor(O, P);\n } catch (error) { /* empty */ }\n if (has(O, P)) return createPropertyDescriptor(!propertyIsEnumerableModule.f.call(O, P), O[P]);\n};\n\n\n/***/ }),\n\n/***/ 8006:\n/***/ (function(__unused_webpack_module, exports, __nested_webpack_require_75368__) {\n\nvar internalObjectKeys = __nested_webpack_require_75368__(6324);\nvar enumBugKeys = __nested_webpack_require_75368__(748);\n\nvar hiddenKeys = enumBugKeys.concat('length', 'prototype');\n\n// `Object.getOwnPropertyNames` method\n// https://tc39.es/ecma262/#sec-object.getownpropertynames\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return internalObjectKeys(O, hiddenKeys);\n};\n\n\n/***/ }),\n\n/***/ 5181:\n/***/ (function(__unused_webpack_module, exports) {\n\nexports.f = Object.getOwnPropertySymbols;\n\n\n/***/ }),\n\n/***/ 9518:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_75966__) {\n\nvar has = __nested_webpack_require_75966__(6656);\nvar toObject = __nested_webpack_require_75966__(7908);\nvar sharedKey = __nested_webpack_require_75966__(6200);\nvar CORRECT_PROTOTYPE_GETTER = __nested_webpack_require_75966__(8544);\n\nvar IE_PROTO = sharedKey('IE_PROTO');\nvar ObjectPrototype = Object.prototype;\n\n// `Object.getPrototypeOf` method\n// https://tc39.es/ecma262/#sec-object.getprototypeof\nmodule.exports = CORRECT_PROTOTYPE_GETTER ? Object.getPrototypeOf : function (O) {\n O = toObject(O);\n if (has(O, IE_PROTO)) return O[IE_PROTO];\n if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n return O.constructor.prototype;\n } return O instanceof Object ? ObjectPrototype : null;\n};\n\n\n/***/ }),\n\n/***/ 6324:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_76729__) {\n\nvar has = __nested_webpack_require_76729__(6656);\nvar toIndexedObject = __nested_webpack_require_76729__(5656);\nvar indexOf = __nested_webpack_require_76729__(1318).indexOf;\nvar hiddenKeys = __nested_webpack_require_76729__(3501);\n\nmodule.exports = function (object, names) {\n var O = toIndexedObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) !has(hiddenKeys, key) && has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (has(O, key = names[i++])) {\n ~indexOf(result, key) || result.push(key);\n }\n return result;\n};\n\n\n/***/ }),\n\n/***/ 1956:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_77369__) {\n\nvar internalObjectKeys = __nested_webpack_require_77369__(6324);\nvar enumBugKeys = __nested_webpack_require_77369__(748);\n\n// `Object.keys` method\n// https://tc39.es/ecma262/#sec-object.keys\nmodule.exports = Object.keys || function keys(O) {\n return internalObjectKeys(O, enumBugKeys);\n};\n\n\n/***/ }),\n\n/***/ 5296:\n/***/ (function(__unused_webpack_module, exports) {\n\n\"use strict\";\n\nvar nativePropertyIsEnumerable = {}.propertyIsEnumerable;\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Nashorn ~ JDK8 bug\nvar NASHORN_BUG = getOwnPropertyDescriptor && !nativePropertyIsEnumerable.call({ 1: 2 }, 1);\n\n// `Object.prototype.propertyIsEnumerable` method implementation\n// https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable\nexports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n var descriptor = getOwnPropertyDescriptor(this, V);\n return !!descriptor && descriptor.enumerable;\n} : nativePropertyIsEnumerable;\n\n\n/***/ }),\n\n/***/ 7674:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_78394__) {\n\n/* eslint-disable no-proto -- safe */\nvar anObject = __nested_webpack_require_78394__(9670);\nvar aPossiblePrototype = __nested_webpack_require_78394__(6077);\n\n// `Object.setPrototypeOf` method\n// https://tc39.es/ecma262/#sec-object.setprototypeof\n// Works with __proto__ only. Old v8 can't work with null proto objects.\nmodule.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () {\n var CORRECT_SETTER = false;\n var test = {};\n var setter;\n try {\n setter = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set;\n setter.call(test, []);\n CORRECT_SETTER = test instanceof Array;\n } catch (error) { /* empty */ }\n return function setPrototypeOf(O, proto) {\n anObject(O);\n aPossiblePrototype(proto);\n if (CORRECT_SETTER) setter.call(O, proto);\n else O.__proto__ = proto;\n return O;\n };\n}() : undefined);\n\n\n/***/ }),\n\n/***/ 288:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_79325__) {\n\n\"use strict\";\n\nvar TO_STRING_TAG_SUPPORT = __nested_webpack_require_79325__(1694);\nvar classof = __nested_webpack_require_79325__(648);\n\n// `Object.prototype.toString` method implementation\n// https://tc39.es/ecma262/#sec-object.prototype.tostring\nmodule.exports = TO_STRING_TAG_SUPPORT ? {}.toString : function toString() {\n return '[object ' + classof(this) + ']';\n};\n\n\n/***/ }),\n\n/***/ 3887:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_79769__) {\n\nvar getBuiltIn = __nested_webpack_require_79769__(5005);\nvar getOwnPropertyNamesModule = __nested_webpack_require_79769__(8006);\nvar getOwnPropertySymbolsModule = __nested_webpack_require_79769__(5181);\nvar anObject = __nested_webpack_require_79769__(9670);\n\n// all object keys, includes non-enumerable and symbols\nmodule.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\n var keys = getOwnPropertyNamesModule.f(anObject(it));\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys;\n};\n\n\n/***/ }),\n\n/***/ 857:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_80406__) {\n\nvar global = __nested_webpack_require_80406__(7854);\n\nmodule.exports = global;\n\n\n/***/ }),\n\n/***/ 2248:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_80571__) {\n\nvar redefine = __nested_webpack_require_80571__(1320);\n\nmodule.exports = function (target, src, options) {\n for (var key in src) redefine(target, key, src[key], options);\n return target;\n};\n\n\n/***/ }),\n\n/***/ 1320:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_80849__) {\n\nvar global = __nested_webpack_require_80849__(7854);\nvar createNonEnumerableProperty = __nested_webpack_require_80849__(8880);\nvar has = __nested_webpack_require_80849__(6656);\nvar setGlobal = __nested_webpack_require_80849__(3505);\nvar inspectSource = __nested_webpack_require_80849__(2788);\nvar InternalStateModule = __nested_webpack_require_80849__(9909);\n\nvar getInternalState = InternalStateModule.get;\nvar enforceInternalState = InternalStateModule.enforce;\nvar TEMPLATE = String(String).split('String');\n\n(module.exports = function (O, key, value, options) {\n var unsafe = options ? !!options.unsafe : false;\n var simple = options ? !!options.enumerable : false;\n var noTargetGet = options ? !!options.noTargetGet : false;\n var state;\n if (typeof value == 'function') {\n if (typeof key == 'string' && !has(value, 'name')) {\n createNonEnumerableProperty(value, 'name', key);\n }\n state = enforceInternalState(value);\n if (!state.source) {\n state.source = TEMPLATE.join(typeof key == 'string' ? key : '');\n }\n }\n if (O === global) {\n if (simple) O[key] = value;\n else setGlobal(key, value);\n return;\n } else if (!unsafe) {\n delete O[key];\n } else if (!noTargetGet && O[key]) {\n simple = true;\n }\n if (simple) O[key] = value;\n else createNonEnumerableProperty(O, key, value);\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, 'toString', function toString() {\n return typeof this == 'function' && getInternalState(this).source || inspectSource(this);\n});\n\n\n/***/ }),\n\n/***/ 7651:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_82466__) {\n\nvar classof = __nested_webpack_require_82466__(4326);\nvar regexpExec = __nested_webpack_require_82466__(2261);\n\n// `RegExpExec` abstract operation\n// https://tc39.es/ecma262/#sec-regexpexec\nmodule.exports = function (R, S) {\n var exec = R.exec;\n if (typeof exec === 'function') {\n var result = exec.call(R, S);\n if (typeof result !== 'object') {\n throw TypeError('RegExp exec method returned something other than an Object or null');\n }\n return result;\n }\n\n if (classof(R) !== 'RegExp') {\n throw TypeError('RegExp#exec called on incompatible receiver');\n }\n\n return regexpExec.call(R, S);\n};\n\n\n\n/***/ }),\n\n/***/ 2261:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_83158__) {\n\n\"use strict\";\n\nvar regexpFlags = __nested_webpack_require_83158__(7066);\nvar stickyHelpers = __nested_webpack_require_83158__(2999);\n\nvar nativeExec = RegExp.prototype.exec;\n// This always refers to the native implementation, because the\n// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,\n// which loads this file before patching the method.\nvar nativeReplace = String.prototype.replace;\n\nvar patchedExec = nativeExec;\n\nvar UPDATES_LAST_INDEX_WRONG = (function () {\n var re1 = /a/;\n var re2 = /b*/g;\n nativeExec.call(re1, 'a');\n nativeExec.call(re2, 'a');\n return re1.lastIndex !== 0 || re2.lastIndex !== 0;\n})();\n\nvar UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y || stickyHelpers.BROKEN_CARET;\n\n// nonparticipating capturing group, copied from es5-shim's String#split patch.\n// eslint-disable-next-line regexp/no-assertion-capturing-group, regexp/no-empty-group -- required for testing\nvar NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\nvar PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED || UNSUPPORTED_Y;\n\nif (PATCH) {\n patchedExec = function exec(str) {\n var re = this;\n var lastIndex, reCopy, match, i;\n var sticky = UNSUPPORTED_Y && re.sticky;\n var flags = regexpFlags.call(re);\n var source = re.source;\n var charsAdded = 0;\n var strCopy = str;\n\n if (sticky) {\n flags = flags.replace('y', '');\n if (flags.indexOf('g') === -1) {\n flags += 'g';\n }\n\n strCopy = String(str).slice(re.lastIndex);\n // Support anchored sticky behavior.\n if (re.lastIndex > 0 && (!re.multiline || re.multiline && str[re.lastIndex - 1] !== '\\n')) {\n source = '(?: ' + source + ')';\n strCopy = ' ' + strCopy;\n charsAdded++;\n }\n // ^(? + rx + ) is needed, in combination with some str slicing, to\n // simulate the 'y' flag.\n reCopy = new RegExp('^(?:' + source + ')', flags);\n }\n\n if (NPCG_INCLUDED) {\n reCopy = new RegExp('^' + source + '$(?!\\\\s)', flags);\n }\n if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex;\n\n match = nativeExec.call(sticky ? reCopy : re, strCopy);\n\n if (sticky) {\n if (match) {\n match.input = match.input.slice(charsAdded);\n match[0] = match[0].slice(charsAdded);\n match.index = re.lastIndex;\n re.lastIndex += match[0].length;\n } else re.lastIndex = 0;\n } else if (UPDATES_LAST_INDEX_WRONG && match) {\n re.lastIndex = re.global ? match.index + match[0].length : lastIndex;\n }\n if (NPCG_INCLUDED && match && match.length > 1) {\n // Fix browsers whose `exec` methods don't consistently return `undefined`\n // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\n nativeReplace.call(match[0], reCopy, function () {\n for (i = 1; i < arguments.length - 2; i++) {\n if (arguments[i] === undefined) match[i] = undefined;\n }\n });\n }\n\n return match;\n };\n}\n\nmodule.exports = patchedExec;\n\n\n/***/ }),\n\n/***/ 7066:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_86176__) {\n\n\"use strict\";\n\nvar anObject = __nested_webpack_require_86176__(9670);\n\n// `RegExp.prototype.flags` getter implementation\n// https://tc39.es/ecma262/#sec-get-regexp.prototype.flags\nmodule.exports = function () {\n var that = anObject(this);\n var result = '';\n if (that.global) result += 'g';\n if (that.ignoreCase) result += 'i';\n if (that.multiline) result += 'm';\n if (that.dotAll) result += 's';\n if (that.unicode) result += 'u';\n if (that.sticky) result += 'y';\n return result;\n};\n\n\n/***/ }),\n\n/***/ 2999:\n/***/ (function(__unused_webpack_module, exports, __nested_webpack_require_86753__) {\n\n\"use strict\";\n\n\nvar fails = __nested_webpack_require_86753__(7293);\n\n// babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError,\n// so we use an intermediate function.\nfunction RE(s, f) {\n return RegExp(s, f);\n}\n\nexports.UNSUPPORTED_Y = fails(function () {\n // babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError\n var re = RE('a', 'y');\n re.lastIndex = 2;\n return re.exec('abcd') != null;\n});\n\nexports.BROKEN_CARET = fails(function () {\n // https://bugzilla.mozilla.org/show_bug.cgi?id=773687\n var re = RE('^r', 'gy');\n re.lastIndex = 2;\n return re.exec('str') != null;\n});\n\n\n/***/ }),\n\n/***/ 4488:\n/***/ (function(module) {\n\n// `RequireObjectCoercible` abstract operation\n// https://tc39.es/ecma262/#sec-requireobjectcoercible\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n\n\n/***/ }),\n\n/***/ 3505:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_87737__) {\n\nvar global = __nested_webpack_require_87737__(7854);\nvar createNonEnumerableProperty = __nested_webpack_require_87737__(8880);\n\nmodule.exports = function (key, value) {\n try {\n createNonEnumerableProperty(global, key, value);\n } catch (error) {\n global[key] = value;\n } return value;\n};\n\n\n/***/ }),\n\n/***/ 6340:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_88106__) {\n\n\"use strict\";\n\nvar getBuiltIn = __nested_webpack_require_88106__(5005);\nvar definePropertyModule = __nested_webpack_require_88106__(3070);\nvar wellKnownSymbol = __nested_webpack_require_88106__(5112);\nvar DESCRIPTORS = __nested_webpack_require_88106__(9781);\n\nvar SPECIES = wellKnownSymbol('species');\n\nmodule.exports = function (CONSTRUCTOR_NAME) {\n var Constructor = getBuiltIn(CONSTRUCTOR_NAME);\n var defineProperty = definePropertyModule.f;\n\n if (DESCRIPTORS && Constructor && !Constructor[SPECIES]) {\n defineProperty(Constructor, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n }\n};\n\n\n/***/ }),\n\n/***/ 8003:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_88786__) {\n\nvar defineProperty = __nested_webpack_require_88786__(3070).f;\nvar has = __nested_webpack_require_88786__(6656);\nvar wellKnownSymbol = __nested_webpack_require_88786__(5112);\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n\nmodule.exports = function (it, TAG, STATIC) {\n if (it && !has(it = STATIC ? it : it.prototype, TO_STRING_TAG)) {\n defineProperty(it, TO_STRING_TAG, { configurable: true, value: TAG });\n }\n};\n\n\n/***/ }),\n\n/***/ 6200:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_89271__) {\n\nvar shared = __nested_webpack_require_89271__(2309);\nvar uid = __nested_webpack_require_89271__(9711);\n\nvar keys = shared('keys');\n\nmodule.exports = function (key) {\n return keys[key] || (keys[key] = uid(key));\n};\n\n\n/***/ }),\n\n/***/ 5465:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_89559__) {\n\nvar global = __nested_webpack_require_89559__(7854);\nvar setGlobal = __nested_webpack_require_89559__(3505);\n\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || setGlobal(SHARED, {});\n\nmodule.exports = store;\n\n\n/***/ }),\n\n/***/ 2309:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_89855__) {\n\nvar IS_PURE = __nested_webpack_require_89855__(1913);\nvar store = __nested_webpack_require_89855__(5465);\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: '3.9.0',\n mode: IS_PURE ? 'pure' : 'global',\n copyright: '© 2021 Denis Pushkarev (zloirock.ru)'\n});\n\n\n/***/ }),\n\n/***/ 6707:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_90288__) {\n\nvar anObject = __nested_webpack_require_90288__(9670);\nvar aFunction = __nested_webpack_require_90288__(3099);\nvar wellKnownSymbol = __nested_webpack_require_90288__(5112);\n\nvar SPECIES = wellKnownSymbol('species');\n\n// `SpeciesConstructor` abstract operation\n// https://tc39.es/ecma262/#sec-speciesconstructor\nmodule.exports = function (O, defaultConstructor) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? defaultConstructor : aFunction(S);\n};\n\n\n/***/ }),\n\n/***/ 8710:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_90863__) {\n\nvar toInteger = __nested_webpack_require_90863__(9958);\nvar requireObjectCoercible = __nested_webpack_require_90863__(4488);\n\n// `String.prototype.{ codePointAt, at }` methods implementation\nvar createMethod = function (CONVERT_TO_STRING) {\n return function ($this, pos) {\n var S = String(requireObjectCoercible($this));\n var position = toInteger(pos);\n var size = S.length;\n var first, second;\n if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;\n first = S.charCodeAt(position);\n return first < 0xD800 || first > 0xDBFF || position + 1 === size\n || (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF\n ? CONVERT_TO_STRING ? S.charAt(position) : first\n : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;\n };\n};\n\nmodule.exports = {\n // `String.prototype.codePointAt` method\n // https://tc39.es/ecma262/#sec-string.prototype.codepointat\n codeAt: createMethod(false),\n // `String.prototype.at` method\n // https://github.com/mathiasbynens/String.prototype.at\n charAt: createMethod(true)\n};\n\n\n/***/ }),\n\n/***/ 3197:\n/***/ (function(module) {\n\n\"use strict\";\n\n// based on https://github.com/bestiejs/punycode.js/blob/master/punycode.js\nvar maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\nvar base = 36;\nvar tMin = 1;\nvar tMax = 26;\nvar skew = 38;\nvar damp = 700;\nvar initialBias = 72;\nvar initialN = 128; // 0x80\nvar delimiter = '-'; // '\\x2D'\nvar regexNonASCII = /[^\\0-\\u007E]/; // non-ASCII chars\nvar regexSeparators = /[.\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\nvar OVERFLOW_ERROR = 'Overflow: input needs wider integers to process';\nvar baseMinusTMin = base - tMin;\nvar floor = Math.floor;\nvar stringFromCharCode = String.fromCharCode;\n\n/**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n */\nvar ucs2decode = function (string) {\n var output = [];\n var counter = 0;\n var length = string.length;\n while (counter < length) {\n var value = string.charCodeAt(counter++);\n if (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n // It's a high surrogate, and there is a next character.\n var extra = string.charCodeAt(counter++);\n if ((extra & 0xFC00) == 0xDC00) { // Low surrogate.\n output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n } else {\n // It's an unmatched surrogate; only append this code unit, in case the\n // next code unit is the high surrogate of a surrogate pair.\n output.push(value);\n counter--;\n }\n } else {\n output.push(value);\n }\n }\n return output;\n};\n\n/**\n * Converts a digit/integer into a basic code point.\n */\nvar digitToBasic = function (digit) {\n // 0..25 map to ASCII a..z or A..Z\n // 26..35 map to ASCII 0..9\n return digit + 22 + 75 * (digit < 26);\n};\n\n/**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * https://tools.ietf.org/html/rfc3492#section-3.4\n */\nvar adapt = function (delta, numPoints, firstTime) {\n var k = 0;\n delta = firstTime ? floor(delta / damp) : delta >> 1;\n delta += floor(delta / numPoints);\n for (; delta > baseMinusTMin * tMax >> 1; k += base) {\n delta = floor(delta / baseMinusTMin);\n }\n return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n};\n\n/**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n */\n// eslint-disable-next-line max-statements -- TODO\nvar encode = function (input) {\n var output = [];\n\n // Convert the input in UCS-2 to an array of Unicode code points.\n input = ucs2decode(input);\n\n // Cache the length.\n var inputLength = input.length;\n\n // Initialize the state.\n var n = initialN;\n var delta = 0;\n var bias = initialBias;\n var i, currentValue;\n\n // Handle the basic code points.\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue < 0x80) {\n output.push(stringFromCharCode(currentValue));\n }\n }\n\n var basicLength = output.length; // number of basic code points.\n var handledCPCount = basicLength; // number of code points that have been handled;\n\n // Finish the basic string with a delimiter unless it's empty.\n if (basicLength) {\n output.push(delimiter);\n }\n\n // Main encoding loop:\n while (handledCPCount < inputLength) {\n // All non-basic code points < n have been handled already. Find the next larger one:\n var m = maxInt;\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue >= n && currentValue < m) {\n m = currentValue;\n }\n }\n\n // Increase `delta` enough to advance the decoder's state to , but guard against overflow.\n var handledCPCountPlusOne = handledCPCount + 1;\n if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n throw RangeError(OVERFLOW_ERROR);\n }\n\n delta += (m - n) * handledCPCountPlusOne;\n n = m;\n\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue < n && ++delta > maxInt) {\n throw RangeError(OVERFLOW_ERROR);\n }\n if (currentValue == n) {\n // Represent delta as a generalized variable-length integer.\n var q = delta;\n for (var k = base; /* no condition */; k += base) {\n var t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n if (q < t) break;\n var qMinusT = q - t;\n var baseMinusT = base - t;\n output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT)));\n q = floor(qMinusT / baseMinusT);\n }\n\n output.push(stringFromCharCode(digitToBasic(q)));\n bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n delta = 0;\n ++handledCPCount;\n }\n }\n\n ++delta;\n ++n;\n }\n return output.join('');\n};\n\nmodule.exports = function (input) {\n var encoded = [];\n var labels = input.toLowerCase().replace(regexSeparators, '\\u002E').split('.');\n var i, label;\n for (i = 0; i < labels.length; i++) {\n label = labels[i];\n encoded.push(regexNonASCII.test(label) ? 'xn--' + encode(label) : label);\n }\n return encoded.join('.');\n};\n\n\n/***/ }),\n\n/***/ 6091:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_97360__) {\n\nvar fails = __nested_webpack_require_97360__(7293);\nvar whitespaces = __nested_webpack_require_97360__(1361);\n\nvar non = '\\u200B\\u0085\\u180E';\n\n// check that a method works with the correct list\n// of whitespaces and has a correct name\nmodule.exports = function (METHOD_NAME) {\n return fails(function () {\n return !!whitespaces[METHOD_NAME]() || non[METHOD_NAME]() != non || whitespaces[METHOD_NAME].name !== METHOD_NAME;\n });\n};\n\n\n/***/ }),\n\n/***/ 3111:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_97868__) {\n\nvar requireObjectCoercible = __nested_webpack_require_97868__(4488);\nvar whitespaces = __nested_webpack_require_97868__(1361);\n\nvar whitespace = '[' + whitespaces + ']';\nvar ltrim = RegExp('^' + whitespace + whitespace + '*');\nvar rtrim = RegExp(whitespace + whitespace + '*$');\n\n// `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation\nvar createMethod = function (TYPE) {\n return function ($this) {\n var string = String(requireObjectCoercible($this));\n if (TYPE & 1) string = string.replace(ltrim, '');\n if (TYPE & 2) string = string.replace(rtrim, '');\n return string;\n };\n};\n\nmodule.exports = {\n // `String.prototype.{ trimLeft, trimStart }` methods\n // https://tc39.es/ecma262/#sec-string.prototype.trimstart\n start: createMethod(1),\n // `String.prototype.{ trimRight, trimEnd }` methods\n // https://tc39.es/ecma262/#sec-string.prototype.trimend\n end: createMethod(2),\n // `String.prototype.trim` method\n // https://tc39.es/ecma262/#sec-string.prototype.trim\n trim: createMethod(3)\n};\n\n\n/***/ }),\n\n/***/ 1400:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_98992__) {\n\nvar toInteger = __nested_webpack_require_98992__(9958);\n\nvar max = Math.max;\nvar min = Math.min;\n\n// Helper for a popular repeating case of the spec:\n// Let integer be ? ToInteger(index).\n// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\nmodule.exports = function (index, length) {\n var integer = toInteger(index);\n return integer < 0 ? max(integer + length, 0) : min(integer, length);\n};\n\n\n/***/ }),\n\n/***/ 7067:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_99521__) {\n\nvar toInteger = __nested_webpack_require_99521__(9958);\nvar toLength = __nested_webpack_require_99521__(7466);\n\n// `ToIndex` abstract operation\n// https://tc39.es/ecma262/#sec-toindex\nmodule.exports = function (it) {\n if (it === undefined) return 0;\n var number = toInteger(it);\n var length = toLength(number);\n if (number !== length) throw RangeError('Wrong length or index');\n return length;\n};\n\n\n/***/ }),\n\n/***/ 5656:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_99996__) {\n\n// toObject with fallback for non-array-like ES3 strings\nvar IndexedObject = __nested_webpack_require_99996__(8361);\nvar requireObjectCoercible = __nested_webpack_require_99996__(4488);\n\nmodule.exports = function (it) {\n return IndexedObject(requireObjectCoercible(it));\n};\n\n\n/***/ }),\n\n/***/ 9958:\n/***/ (function(module) {\n\nvar ceil = Math.ceil;\nvar floor = Math.floor;\n\n// `ToInteger` abstract operation\n// https://tc39.es/ecma262/#sec-tointeger\nmodule.exports = function (argument) {\n return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor : ceil)(argument);\n};\n\n\n/***/ }),\n\n/***/ 7466:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_100645__) {\n\nvar toInteger = __nested_webpack_require_100645__(9958);\n\nvar min = Math.min;\n\n// `ToLength` abstract operation\n// https://tc39.es/ecma262/#sec-tolength\nmodule.exports = function (argument) {\n return argument > 0 ? min(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n};\n\n\n/***/ }),\n\n/***/ 7908:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_101032__) {\n\nvar requireObjectCoercible = __nested_webpack_require_101032__(4488);\n\n// `ToObject` abstract operation\n// https://tc39.es/ecma262/#sec-toobject\nmodule.exports = function (argument) {\n return Object(requireObjectCoercible(argument));\n};\n\n\n/***/ }),\n\n/***/ 4590:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_101355__) {\n\nvar toPositiveInteger = __nested_webpack_require_101355__(3002);\n\nmodule.exports = function (it, BYTES) {\n var offset = toPositiveInteger(it);\n if (offset % BYTES) throw RangeError('Wrong offset');\n return offset;\n};\n\n\n/***/ }),\n\n/***/ 3002:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_101660__) {\n\nvar toInteger = __nested_webpack_require_101660__(9958);\n\nmodule.exports = function (it) {\n var result = toInteger(it);\n if (result < 0) throw RangeError(\"The argument can't be less than 0\");\n return result;\n};\n\n\n/***/ }),\n\n/***/ 7593:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_101959__) {\n\nvar isObject = __nested_webpack_require_101959__(111);\n\n// `ToPrimitive` abstract operation\n// https://tc39.es/ecma262/#sec-toprimitive\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (input, PREFERRED_STRING) {\n if (!isObject(input)) return input;\n var fn, val;\n if (PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\n if (typeof (fn = input.valueOf) == 'function' && !isObject(val = fn.call(input))) return val;\n if (!PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n\n\n/***/ }),\n\n/***/ 1694:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_102821__) {\n\nvar wellKnownSymbol = __nested_webpack_require_102821__(5112);\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar test = {};\n\ntest[TO_STRING_TAG] = 'z';\n\nmodule.exports = String(test) === '[object z]';\n\n\n/***/ }),\n\n/***/ 9843:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_103114__) {\n\n\"use strict\";\n\nvar $ = __nested_webpack_require_103114__(2109);\nvar global = __nested_webpack_require_103114__(7854);\nvar DESCRIPTORS = __nested_webpack_require_103114__(9781);\nvar TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS = __nested_webpack_require_103114__(3832);\nvar ArrayBufferViewCore = __nested_webpack_require_103114__(260);\nvar ArrayBufferModule = __nested_webpack_require_103114__(3331);\nvar anInstance = __nested_webpack_require_103114__(5787);\nvar createPropertyDescriptor = __nested_webpack_require_103114__(9114);\nvar createNonEnumerableProperty = __nested_webpack_require_103114__(8880);\nvar toLength = __nested_webpack_require_103114__(7466);\nvar toIndex = __nested_webpack_require_103114__(7067);\nvar toOffset = __nested_webpack_require_103114__(4590);\nvar toPrimitive = __nested_webpack_require_103114__(7593);\nvar has = __nested_webpack_require_103114__(6656);\nvar classof = __nested_webpack_require_103114__(648);\nvar isObject = __nested_webpack_require_103114__(111);\nvar create = __nested_webpack_require_103114__(30);\nvar setPrototypeOf = __nested_webpack_require_103114__(7674);\nvar getOwnPropertyNames = __nested_webpack_require_103114__(8006).f;\nvar typedArrayFrom = __nested_webpack_require_103114__(7321);\nvar forEach = __nested_webpack_require_103114__(2092).forEach;\nvar setSpecies = __nested_webpack_require_103114__(6340);\nvar definePropertyModule = __nested_webpack_require_103114__(3070);\nvar getOwnPropertyDescriptorModule = __nested_webpack_require_103114__(1236);\nvar InternalStateModule = __nested_webpack_require_103114__(9909);\nvar inheritIfRequired = __nested_webpack_require_103114__(9587);\n\nvar getInternalState = InternalStateModule.get;\nvar setInternalState = InternalStateModule.set;\nvar nativeDefineProperty = definePropertyModule.f;\nvar nativeGetOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\nvar round = Math.round;\nvar RangeError = global.RangeError;\nvar ArrayBuffer = ArrayBufferModule.ArrayBuffer;\nvar DataView = ArrayBufferModule.DataView;\nvar NATIVE_ARRAY_BUFFER_VIEWS = ArrayBufferViewCore.NATIVE_ARRAY_BUFFER_VIEWS;\nvar TYPED_ARRAY_TAG = ArrayBufferViewCore.TYPED_ARRAY_TAG;\nvar TypedArray = ArrayBufferViewCore.TypedArray;\nvar TypedArrayPrototype = ArrayBufferViewCore.TypedArrayPrototype;\nvar aTypedArrayConstructor = ArrayBufferViewCore.aTypedArrayConstructor;\nvar isTypedArray = ArrayBufferViewCore.isTypedArray;\nvar BYTES_PER_ELEMENT = 'BYTES_PER_ELEMENT';\nvar WRONG_LENGTH = 'Wrong length';\n\nvar fromList = function (C, list) {\n var index = 0;\n var length = list.length;\n var result = new (aTypedArrayConstructor(C))(length);\n while (length > index) result[index] = list[index++];\n return result;\n};\n\nvar addGetter = function (it, key) {\n nativeDefineProperty(it, key, { get: function () {\n return getInternalState(this)[key];\n } });\n};\n\nvar isArrayBuffer = function (it) {\n var klass;\n return it instanceof ArrayBuffer || (klass = classof(it)) == 'ArrayBuffer' || klass == 'SharedArrayBuffer';\n};\n\nvar isTypedArrayIndex = function (target, key) {\n return isTypedArray(target)\n && typeof key != 'symbol'\n && key in target\n && String(+key) == String(key);\n};\n\nvar wrappedGetOwnPropertyDescriptor = function getOwnPropertyDescriptor(target, key) {\n return isTypedArrayIndex(target, key = toPrimitive(key, true))\n ? createPropertyDescriptor(2, target[key])\n : nativeGetOwnPropertyDescriptor(target, key);\n};\n\nvar wrappedDefineProperty = function defineProperty(target, key, descriptor) {\n if (isTypedArrayIndex(target, key = toPrimitive(key, true))\n && isObject(descriptor)\n && has(descriptor, 'value')\n && !has(descriptor, 'get')\n && !has(descriptor, 'set')\n // TODO: add validation descriptor w/o calling accessors\n && !descriptor.configurable\n && (!has(descriptor, 'writable') || descriptor.writable)\n && (!has(descriptor, 'enumerable') || descriptor.enumerable)\n ) {\n target[key] = descriptor.value;\n return target;\n } return nativeDefineProperty(target, key, descriptor);\n};\n\nif (DESCRIPTORS) {\n if (!NATIVE_ARRAY_BUFFER_VIEWS) {\n getOwnPropertyDescriptorModule.f = wrappedGetOwnPropertyDescriptor;\n definePropertyModule.f = wrappedDefineProperty;\n addGetter(TypedArrayPrototype, 'buffer');\n addGetter(TypedArrayPrototype, 'byteOffset');\n addGetter(TypedArrayPrototype, 'byteLength');\n addGetter(TypedArrayPrototype, 'length');\n }\n\n $({ target: 'Object', stat: true, forced: !NATIVE_ARRAY_BUFFER_VIEWS }, {\n getOwnPropertyDescriptor: wrappedGetOwnPropertyDescriptor,\n defineProperty: wrappedDefineProperty\n });\n\n module.exports = function (TYPE, wrapper, CLAMPED) {\n var BYTES = TYPE.match(/\\d+$/)[0] / 8;\n var CONSTRUCTOR_NAME = TYPE + (CLAMPED ? 'Clamped' : '') + 'Array';\n var GETTER = 'get' + TYPE;\n var SETTER = 'set' + TYPE;\n var NativeTypedArrayConstructor = global[CONSTRUCTOR_NAME];\n var TypedArrayConstructor = NativeTypedArrayConstructor;\n var TypedArrayConstructorPrototype = TypedArrayConstructor && TypedArrayConstructor.prototype;\n var exported = {};\n\n var getter = function (that, index) {\n var data = getInternalState(that);\n return data.view[GETTER](index * BYTES + data.byteOffset, true);\n };\n\n var setter = function (that, index, value) {\n var data = getInternalState(that);\n if (CLAMPED) value = (value = round(value)) < 0 ? 0 : value > 0xFF ? 0xFF : value & 0xFF;\n data.view[SETTER](index * BYTES + data.byteOffset, value, true);\n };\n\n var addElement = function (that, index) {\n nativeDefineProperty(that, index, {\n get: function () {\n return getter(this, index);\n },\n set: function (value) {\n return setter(this, index, value);\n },\n enumerable: true\n });\n };\n\n if (!NATIVE_ARRAY_BUFFER_VIEWS) {\n TypedArrayConstructor = wrapper(function (that, data, offset, $length) {\n anInstance(that, TypedArrayConstructor, CONSTRUCTOR_NAME);\n var index = 0;\n var byteOffset = 0;\n var buffer, byteLength, length;\n if (!isObject(data)) {\n length = toIndex(data);\n byteLength = length * BYTES;\n buffer = new ArrayBuffer(byteLength);\n } else if (isArrayBuffer(data)) {\n buffer = data;\n byteOffset = toOffset(offset, BYTES);\n var $len = data.byteLength;\n if ($length === undefined) {\n if ($len % BYTES) throw RangeError(WRONG_LENGTH);\n byteLength = $len - byteOffset;\n if (byteLength < 0) throw RangeError(WRONG_LENGTH);\n } else {\n byteLength = toLength($length) * BYTES;\n if (byteLength + byteOffset > $len) throw RangeError(WRONG_LENGTH);\n }\n length = byteLength / BYTES;\n } else if (isTypedArray(data)) {\n return fromList(TypedArrayConstructor, data);\n } else {\n return typedArrayFrom.call(TypedArrayConstructor, data);\n }\n setInternalState(that, {\n buffer: buffer,\n byteOffset: byteOffset,\n byteLength: byteLength,\n length: length,\n view: new DataView(buffer)\n });\n while (index < length) addElement(that, index++);\n });\n\n if (setPrototypeOf) setPrototypeOf(TypedArrayConstructor, TypedArray);\n TypedArrayConstructorPrototype = TypedArrayConstructor.prototype = create(TypedArrayPrototype);\n } else if (TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS) {\n TypedArrayConstructor = wrapper(function (dummy, data, typedArrayOffset, $length) {\n anInstance(dummy, TypedArrayConstructor, CONSTRUCTOR_NAME);\n return inheritIfRequired(function () {\n if (!isObject(data)) return new NativeTypedArrayConstructor(toIndex(data));\n if (isArrayBuffer(data)) return $length !== undefined\n ? new NativeTypedArrayConstructor(data, toOffset(typedArrayOffset, BYTES), $length)\n : typedArrayOffset !== undefined\n ? new NativeTypedArrayConstructor(data, toOffset(typedArrayOffset, BYTES))\n : new NativeTypedArrayConstructor(data);\n if (isTypedArray(data)) return fromList(TypedArrayConstructor, data);\n return typedArrayFrom.call(TypedArrayConstructor, data);\n }(), dummy, TypedArrayConstructor);\n });\n\n if (setPrototypeOf) setPrototypeOf(TypedArrayConstructor, TypedArray);\n forEach(getOwnPropertyNames(NativeTypedArrayConstructor), function (key) {\n if (!(key in TypedArrayConstructor)) {\n createNonEnumerableProperty(TypedArrayConstructor, key, NativeTypedArrayConstructor[key]);\n }\n });\n TypedArrayConstructor.prototype = TypedArrayConstructorPrototype;\n }\n\n if (TypedArrayConstructorPrototype.constructor !== TypedArrayConstructor) {\n createNonEnumerableProperty(TypedArrayConstructorPrototype, 'constructor', TypedArrayConstructor);\n }\n\n if (TYPED_ARRAY_TAG) {\n createNonEnumerableProperty(TypedArrayConstructorPrototype, TYPED_ARRAY_TAG, CONSTRUCTOR_NAME);\n }\n\n exported[CONSTRUCTOR_NAME] = TypedArrayConstructor;\n\n $({\n global: true, forced: TypedArrayConstructor != NativeTypedArrayConstructor, sham: !NATIVE_ARRAY_BUFFER_VIEWS\n }, exported);\n\n if (!(BYTES_PER_ELEMENT in TypedArrayConstructor)) {\n createNonEnumerableProperty(TypedArrayConstructor, BYTES_PER_ELEMENT, BYTES);\n }\n\n if (!(BYTES_PER_ELEMENT in TypedArrayConstructorPrototype)) {\n createNonEnumerableProperty(TypedArrayConstructorPrototype, BYTES_PER_ELEMENT, BYTES);\n }\n\n setSpecies(CONSTRUCTOR_NAME);\n };\n} else module.exports = function () { /* empty */ };\n\n\n/***/ }),\n\n/***/ 3832:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_112503__) {\n\n/* eslint-disable no-new -- required for testing */\nvar global = __nested_webpack_require_112503__(7854);\nvar fails = __nested_webpack_require_112503__(7293);\nvar checkCorrectnessOfIteration = __nested_webpack_require_112503__(7072);\nvar NATIVE_ARRAY_BUFFER_VIEWS = __nested_webpack_require_112503__(260).NATIVE_ARRAY_BUFFER_VIEWS;\n\nvar ArrayBuffer = global.ArrayBuffer;\nvar Int8Array = global.Int8Array;\n\nmodule.exports = !NATIVE_ARRAY_BUFFER_VIEWS || !fails(function () {\n Int8Array(1);\n}) || !fails(function () {\n new Int8Array(-1);\n}) || !checkCorrectnessOfIteration(function (iterable) {\n new Int8Array();\n new Int8Array(null);\n new Int8Array(1.5);\n new Int8Array(iterable);\n}, true) || fails(function () {\n // Safari (11+) bug - a reason why even Safari 13 should load a typed array polyfill\n return new Int8Array(new ArrayBuffer(2), 1, undefined).length !== 1;\n});\n\n\n/***/ }),\n\n/***/ 3074:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_113426__) {\n\nvar aTypedArrayConstructor = __nested_webpack_require_113426__(260).aTypedArrayConstructor;\nvar speciesConstructor = __nested_webpack_require_113426__(6707);\n\nmodule.exports = function (instance, list) {\n var C = speciesConstructor(instance, instance.constructor);\n var index = 0;\n var length = list.length;\n var result = new (aTypedArrayConstructor(C))(length);\n while (length > index) result[index] = list[index++];\n return result;\n};\n\n\n/***/ }),\n\n/***/ 7321:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_113940__) {\n\nvar toObject = __nested_webpack_require_113940__(7908);\nvar toLength = __nested_webpack_require_113940__(7466);\nvar getIteratorMethod = __nested_webpack_require_113940__(1246);\nvar isArrayIteratorMethod = __nested_webpack_require_113940__(7659);\nvar bind = __nested_webpack_require_113940__(9974);\nvar aTypedArrayConstructor = __nested_webpack_require_113940__(260).aTypedArrayConstructor;\n\nmodule.exports = function from(source /* , mapfn, thisArg */) {\n var O = toObject(source);\n var argumentsLength = arguments.length;\n var mapfn = argumentsLength > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var iteratorMethod = getIteratorMethod(O);\n var i, length, result, step, iterator, next;\n if (iteratorMethod != undefined && !isArrayIteratorMethod(iteratorMethod)) {\n iterator = iteratorMethod.call(O);\n next = iterator.next;\n O = [];\n while (!(step = next.call(iterator)).done) {\n O.push(step.value);\n }\n }\n if (mapping && argumentsLength > 2) {\n mapfn = bind(mapfn, arguments[2], 2);\n }\n length = toLength(O.length);\n result = new (aTypedArrayConstructor(this))(length);\n for (i = 0; length > i; i++) {\n result[i] = mapping ? mapfn(O[i], i) : O[i];\n }\n return result;\n};\n\n\n/***/ }),\n\n/***/ 9711:\n/***/ (function(module) {\n\nvar id = 0;\nvar postfix = Math.random();\n\nmodule.exports = function (key) {\n return 'Symbol(' + String(key === undefined ? '' : key) + ')_' + (++id + postfix).toString(36);\n};\n\n\n/***/ }),\n\n/***/ 3307:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_115419__) {\n\nvar NATIVE_SYMBOL = __nested_webpack_require_115419__(133);\n\nmodule.exports = NATIVE_SYMBOL\n /* global Symbol -- safe */\n && !Symbol.sham\n && typeof Symbol.iterator == 'symbol';\n\n\n/***/ }),\n\n/***/ 5112:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_115685__) {\n\nvar global = __nested_webpack_require_115685__(7854);\nvar shared = __nested_webpack_require_115685__(2309);\nvar has = __nested_webpack_require_115685__(6656);\nvar uid = __nested_webpack_require_115685__(9711);\nvar NATIVE_SYMBOL = __nested_webpack_require_115685__(133);\nvar USE_SYMBOL_AS_UID = __nested_webpack_require_115685__(3307);\n\nvar WellKnownSymbolsStore = shared('wks');\nvar Symbol = global.Symbol;\nvar createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol : Symbol && Symbol.withoutSetter || uid;\n\nmodule.exports = function (name) {\n if (!has(WellKnownSymbolsStore, name)) {\n if (NATIVE_SYMBOL && has(Symbol, name)) WellKnownSymbolsStore[name] = Symbol[name];\n else WellKnownSymbolsStore[name] = createWellKnownSymbol('Symbol.' + name);\n } return WellKnownSymbolsStore[name];\n};\n\n\n/***/ }),\n\n/***/ 1361:\n/***/ (function(module) {\n\n// a string of all valid unicode whitespaces\nmodule.exports = '\\u0009\\u000A\\u000B\\u000C\\u000D\\u0020\\u00A0\\u1680\\u2000\\u2001\\u2002' +\n '\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n\n\n/***/ }),\n\n/***/ 8264:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_116785__) {\n\n\"use strict\";\n\nvar $ = __nested_webpack_require_116785__(2109);\nvar global = __nested_webpack_require_116785__(7854);\nvar arrayBufferModule = __nested_webpack_require_116785__(3331);\nvar setSpecies = __nested_webpack_require_116785__(6340);\n\nvar ARRAY_BUFFER = 'ArrayBuffer';\nvar ArrayBuffer = arrayBufferModule[ARRAY_BUFFER];\nvar NativeArrayBuffer = global[ARRAY_BUFFER];\n\n// `ArrayBuffer` constructor\n// https://tc39.es/ecma262/#sec-arraybuffer-constructor\n$({ global: true, forced: NativeArrayBuffer !== ArrayBuffer }, {\n ArrayBuffer: ArrayBuffer\n});\n\nsetSpecies(ARRAY_BUFFER);\n\n\n/***/ }),\n\n/***/ 2222:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_117427__) {\n\n\"use strict\";\n\nvar $ = __nested_webpack_require_117427__(2109);\nvar fails = __nested_webpack_require_117427__(7293);\nvar isArray = __nested_webpack_require_117427__(3157);\nvar isObject = __nested_webpack_require_117427__(111);\nvar toObject = __nested_webpack_require_117427__(7908);\nvar toLength = __nested_webpack_require_117427__(7466);\nvar createProperty = __nested_webpack_require_117427__(6135);\nvar arraySpeciesCreate = __nested_webpack_require_117427__(5417);\nvar arrayMethodHasSpeciesSupport = __nested_webpack_require_117427__(1194);\nvar wellKnownSymbol = __nested_webpack_require_117427__(5112);\nvar V8_VERSION = __nested_webpack_require_117427__(7392);\n\nvar IS_CONCAT_SPREADABLE = wellKnownSymbol('isConcatSpreadable');\nvar MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;\nvar MAXIMUM_ALLOWED_INDEX_EXCEEDED = 'Maximum allowed index exceeded';\n\n// We can't use this feature detection in V8 since it causes\n// deoptimization and serious performance degradation\n// https://github.com/zloirock/core-js/issues/679\nvar IS_CONCAT_SPREADABLE_SUPPORT = V8_VERSION >= 51 || !fails(function () {\n var array = [];\n array[IS_CONCAT_SPREADABLE] = false;\n return array.concat()[0] !== array;\n});\n\nvar SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('concat');\n\nvar isConcatSpreadable = function (O) {\n if (!isObject(O)) return false;\n var spreadable = O[IS_CONCAT_SPREADABLE];\n return spreadable !== undefined ? !!spreadable : isArray(O);\n};\n\nvar FORCED = !IS_CONCAT_SPREADABLE_SUPPORT || !SPECIES_SUPPORT;\n\n// `Array.prototype.concat` method\n// https://tc39.es/ecma262/#sec-array.prototype.concat\n// with adding support of @@isConcatSpreadable and @@species\n$({ target: 'Array', proto: true, forced: FORCED }, {\n // eslint-disable-next-line no-unused-vars -- required for `.length`\n concat: function concat(arg) {\n var O = toObject(this);\n var A = arraySpeciesCreate(O, 0);\n var n = 0;\n var i, k, length, len, E;\n for (i = -1, length = arguments.length; i < length; i++) {\n E = i === -1 ? O : arguments[i];\n if (isConcatSpreadable(E)) {\n len = toLength(E.length);\n if (n + len > MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\n for (k = 0; k < len; k++, n++) if (k in E) createProperty(A, n, E[k]);\n } else {\n if (n >= MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\n createProperty(A, n++, E);\n }\n }\n A.length = n;\n return A;\n }\n});\n\n\n/***/ }),\n\n/***/ 7327:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_119834__) {\n\n\"use strict\";\n\nvar $ = __nested_webpack_require_119834__(2109);\nvar $filter = __nested_webpack_require_119834__(2092).filter;\nvar arrayMethodHasSpeciesSupport = __nested_webpack_require_119834__(1194);\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('filter');\n\n// `Array.prototype.filter` method\n// https://tc39.es/ecma262/#sec-array.prototype.filter\n// with adding support of @@species\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, {\n filter: function filter(callbackfn /* , thisArg */) {\n return $filter(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n\n/***/ }),\n\n/***/ 2772:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_120523__) {\n\n\"use strict\";\n\nvar $ = __nested_webpack_require_120523__(2109);\nvar $indexOf = __nested_webpack_require_120523__(1318).indexOf;\nvar arrayMethodIsStrict = __nested_webpack_require_120523__(9341);\n\nvar nativeIndexOf = [].indexOf;\n\nvar NEGATIVE_ZERO = !!nativeIndexOf && 1 / [1].indexOf(1, -0) < 0;\nvar STRICT_METHOD = arrayMethodIsStrict('indexOf');\n\n// `Array.prototype.indexOf` method\n// https://tc39.es/ecma262/#sec-array.prototype.indexof\n$({ target: 'Array', proto: true, forced: NEGATIVE_ZERO || !STRICT_METHOD }, {\n indexOf: function indexOf(searchElement /* , fromIndex = 0 */) {\n return NEGATIVE_ZERO\n // convert -0 to +0\n ? nativeIndexOf.apply(this, arguments) || 0\n : $indexOf(this, searchElement, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n\n/***/ }),\n\n/***/ 6992:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_121364__) {\n\n\"use strict\";\n\nvar toIndexedObject = __nested_webpack_require_121364__(5656);\nvar addToUnscopables = __nested_webpack_require_121364__(1223);\nvar Iterators = __nested_webpack_require_121364__(7497);\nvar InternalStateModule = __nested_webpack_require_121364__(9909);\nvar defineIterator = __nested_webpack_require_121364__(654);\n\nvar ARRAY_ITERATOR = 'Array Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR);\n\n// `Array.prototype.entries` method\n// https://tc39.es/ecma262/#sec-array.prototype.entries\n// `Array.prototype.keys` method\n// https://tc39.es/ecma262/#sec-array.prototype.keys\n// `Array.prototype.values` method\n// https://tc39.es/ecma262/#sec-array.prototype.values\n// `Array.prototype[@@iterator]` method\n// https://tc39.es/ecma262/#sec-array.prototype-@@iterator\n// `CreateArrayIterator` internal method\n// https://tc39.es/ecma262/#sec-createarrayiterator\nmodule.exports = defineIterator(Array, 'Array', function (iterated, kind) {\n setInternalState(this, {\n type: ARRAY_ITERATOR,\n target: toIndexedObject(iterated), // target\n index: 0, // next index\n kind: kind // kind\n });\n// `%ArrayIteratorPrototype%.next` method\n// https://tc39.es/ecma262/#sec-%arrayiteratorprototype%.next\n}, function () {\n var state = getInternalState(this);\n var target = state.target;\n var kind = state.kind;\n var index = state.index++;\n if (!target || index >= target.length) {\n state.target = undefined;\n return { value: undefined, done: true };\n }\n if (kind == 'keys') return { value: index, done: false };\n if (kind == 'values') return { value: target[index], done: false };\n return { value: [index, target[index]], done: false };\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values%\n// https://tc39.es/ecma262/#sec-createunmappedargumentsobject\n// https://tc39.es/ecma262/#sec-createmappedargumentsobject\nIterators.Arguments = Iterators.Array;\n\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n\n\n/***/ }),\n\n/***/ 1249:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_123565__) {\n\n\"use strict\";\n\nvar $ = __nested_webpack_require_123565__(2109);\nvar $map = __nested_webpack_require_123565__(2092).map;\nvar arrayMethodHasSpeciesSupport = __nested_webpack_require_123565__(1194);\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('map');\n\n// `Array.prototype.map` method\n// https://tc39.es/ecma262/#sec-array.prototype.map\n// with adding support of @@species\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, {\n map: function map(callbackfn /* , thisArg */) {\n return $map(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n\n/***/ }),\n\n/***/ 7042:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_124230__) {\n\n\"use strict\";\n\nvar $ = __nested_webpack_require_124230__(2109);\nvar isObject = __nested_webpack_require_124230__(111);\nvar isArray = __nested_webpack_require_124230__(3157);\nvar toAbsoluteIndex = __nested_webpack_require_124230__(1400);\nvar toLength = __nested_webpack_require_124230__(7466);\nvar toIndexedObject = __nested_webpack_require_124230__(5656);\nvar createProperty = __nested_webpack_require_124230__(6135);\nvar wellKnownSymbol = __nested_webpack_require_124230__(5112);\nvar arrayMethodHasSpeciesSupport = __nested_webpack_require_124230__(1194);\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('slice');\n\nvar SPECIES = wellKnownSymbol('species');\nvar nativeSlice = [].slice;\nvar max = Math.max;\n\n// `Array.prototype.slice` method\n// https://tc39.es/ecma262/#sec-array.prototype.slice\n// fallback for not array-like ES3 strings and DOM objects\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, {\n slice: function slice(start, end) {\n var O = toIndexedObject(this);\n var length = toLength(O.length);\n var k = toAbsoluteIndex(start, length);\n var fin = toAbsoluteIndex(end === undefined ? length : end, length);\n // inline `ArraySpeciesCreate` for usage native `Array#slice` where it's possible\n var Constructor, result, n;\n if (isArray(O)) {\n Constructor = O.constructor;\n // cross-realm fallback\n if (typeof Constructor == 'function' && (Constructor === Array || isArray(Constructor.prototype))) {\n Constructor = undefined;\n } else if (isObject(Constructor)) {\n Constructor = Constructor[SPECIES];\n if (Constructor === null) Constructor = undefined;\n }\n if (Constructor === Array || Constructor === undefined) {\n return nativeSlice.call(O, k, fin);\n }\n }\n result = new (Constructor === undefined ? Array : Constructor)(max(fin - k, 0));\n for (n = 0; k < fin; k++, n++) if (k in O) createProperty(result, n, O[k]);\n result.length = n;\n return result;\n }\n});\n\n\n/***/ }),\n\n/***/ 561:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_126211__) {\n\n\"use strict\";\n\nvar $ = __nested_webpack_require_126211__(2109);\nvar toAbsoluteIndex = __nested_webpack_require_126211__(1400);\nvar toInteger = __nested_webpack_require_126211__(9958);\nvar toLength = __nested_webpack_require_126211__(7466);\nvar toObject = __nested_webpack_require_126211__(7908);\nvar arraySpeciesCreate = __nested_webpack_require_126211__(5417);\nvar createProperty = __nested_webpack_require_126211__(6135);\nvar arrayMethodHasSpeciesSupport = __nested_webpack_require_126211__(1194);\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('splice');\n\nvar max = Math.max;\nvar min = Math.min;\nvar MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;\nvar MAXIMUM_ALLOWED_LENGTH_EXCEEDED = 'Maximum allowed length exceeded';\n\n// `Array.prototype.splice` method\n// https://tc39.es/ecma262/#sec-array.prototype.splice\n// with adding support of @@species\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, {\n splice: function splice(start, deleteCount /* , ...items */) {\n var O = toObject(this);\n var len = toLength(O.length);\n var actualStart = toAbsoluteIndex(start, len);\n var argumentsLength = arguments.length;\n var insertCount, actualDeleteCount, A, k, from, to;\n if (argumentsLength === 0) {\n insertCount = actualDeleteCount = 0;\n } else if (argumentsLength === 1) {\n insertCount = 0;\n actualDeleteCount = len - actualStart;\n } else {\n insertCount = argumentsLength - 2;\n actualDeleteCount = min(max(toInteger(deleteCount), 0), len - actualStart);\n }\n if (len + insertCount - actualDeleteCount > MAX_SAFE_INTEGER) {\n throw TypeError(MAXIMUM_ALLOWED_LENGTH_EXCEEDED);\n }\n A = arraySpeciesCreate(O, actualDeleteCount);\n for (k = 0; k < actualDeleteCount; k++) {\n from = actualStart + k;\n if (from in O) createProperty(A, k, O[from]);\n }\n A.length = actualDeleteCount;\n if (insertCount < actualDeleteCount) {\n for (k = actualStart; k < len - actualDeleteCount; k++) {\n from = k + actualDeleteCount;\n to = k + insertCount;\n if (from in O) O[to] = O[from];\n else delete O[to];\n }\n for (k = len; k > len - actualDeleteCount + insertCount; k--) delete O[k - 1];\n } else if (insertCount > actualDeleteCount) {\n for (k = len - actualDeleteCount; k > actualStart; k--) {\n from = k + actualDeleteCount - 1;\n to = k + insertCount - 1;\n if (from in O) O[to] = O[from];\n else delete O[to];\n }\n }\n for (k = 0; k < insertCount; k++) {\n O[k + actualStart] = arguments[k + 2];\n }\n O.length = len - actualDeleteCount + insertCount;\n return A;\n }\n});\n\n\n/***/ }),\n\n/***/ 8309:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_128857__) {\n\nvar DESCRIPTORS = __nested_webpack_require_128857__(9781);\nvar defineProperty = __nested_webpack_require_128857__(3070).f;\n\nvar FunctionPrototype = Function.prototype;\nvar FunctionPrototypeToString = FunctionPrototype.toString;\nvar nameRE = /^\\s*function ([^ (]*)/;\nvar NAME = 'name';\n\n// Function instances `.name` property\n// https://tc39.es/ecma262/#sec-function-instances-name\nif (DESCRIPTORS && !(NAME in FunctionPrototype)) {\n defineProperty(FunctionPrototype, NAME, {\n configurable: true,\n get: function () {\n try {\n return FunctionPrototypeToString.call(this).match(nameRE)[1];\n } catch (error) {\n return '';\n }\n }\n });\n}\n\n\n/***/ }),\n\n/***/ 489:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_129614__) {\n\nvar $ = __nested_webpack_require_129614__(2109);\nvar fails = __nested_webpack_require_129614__(7293);\nvar toObject = __nested_webpack_require_129614__(7908);\nvar nativeGetPrototypeOf = __nested_webpack_require_129614__(9518);\nvar CORRECT_PROTOTYPE_GETTER = __nested_webpack_require_129614__(8544);\n\nvar FAILS_ON_PRIMITIVES = fails(function () { nativeGetPrototypeOf(1); });\n\n// `Object.getPrototypeOf` method\n// https://tc39.es/ecma262/#sec-object.getprototypeof\n$({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES, sham: !CORRECT_PROTOTYPE_GETTER }, {\n getPrototypeOf: function getPrototypeOf(it) {\n return nativeGetPrototypeOf(toObject(it));\n }\n});\n\n\n\n/***/ }),\n\n/***/ 1539:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_130327__) {\n\nvar TO_STRING_TAG_SUPPORT = __nested_webpack_require_130327__(1694);\nvar redefine = __nested_webpack_require_130327__(1320);\nvar toString = __nested_webpack_require_130327__(288);\n\n// `Object.prototype.toString` method\n// https://tc39.es/ecma262/#sec-object.prototype.tostring\nif (!TO_STRING_TAG_SUPPORT) {\n redefine(Object.prototype, 'toString', toString, { unsafe: true });\n}\n\n\n/***/ }),\n\n/***/ 4916:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_130780__) {\n\n\"use strict\";\n\nvar $ = __nested_webpack_require_130780__(2109);\nvar exec = __nested_webpack_require_130780__(2261);\n\n// `RegExp.prototype.exec` method\n// https://tc39.es/ecma262/#sec-regexp.prototype.exec\n$({ target: 'RegExp', proto: true, forced: /./.exec !== exec }, {\n exec: exec\n});\n\n\n/***/ }),\n\n/***/ 9714:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_131156__) {\n\n\"use strict\";\n\nvar redefine = __nested_webpack_require_131156__(1320);\nvar anObject = __nested_webpack_require_131156__(9670);\nvar fails = __nested_webpack_require_131156__(7293);\nvar flags = __nested_webpack_require_131156__(7066);\n\nvar TO_STRING = 'toString';\nvar RegExpPrototype = RegExp.prototype;\nvar nativeToString = RegExpPrototype[TO_STRING];\n\nvar NOT_GENERIC = fails(function () { return nativeToString.call({ source: 'a', flags: 'b' }) != '/a/b'; });\n// FF44- RegExp#toString has a wrong name\nvar INCORRECT_NAME = nativeToString.name != TO_STRING;\n\n// `RegExp.prototype.toString` method\n// https://tc39.es/ecma262/#sec-regexp.prototype.tostring\nif (NOT_GENERIC || INCORRECT_NAME) {\n redefine(RegExp.prototype, TO_STRING, function toString() {\n var R = anObject(this);\n var p = String(R.source);\n var rf = R.flags;\n var f = String(rf === undefined && R instanceof RegExp && !('flags' in RegExpPrototype) ? flags.call(R) : rf);\n return '/' + p + '/' + f;\n }, { unsafe: true });\n}\n\n\n/***/ }),\n\n/***/ 8783:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_132221__) {\n\n\"use strict\";\n\nvar charAt = __nested_webpack_require_132221__(8710).charAt;\nvar InternalStateModule = __nested_webpack_require_132221__(9909);\nvar defineIterator = __nested_webpack_require_132221__(654);\n\nvar STRING_ITERATOR = 'String Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(STRING_ITERATOR);\n\n// `String.prototype[@@iterator]` method\n// https://tc39.es/ecma262/#sec-string.prototype-@@iterator\ndefineIterator(String, 'String', function (iterated) {\n setInternalState(this, {\n type: STRING_ITERATOR,\n string: String(iterated),\n index: 0\n });\n// `%StringIteratorPrototype%.next` method\n// https://tc39.es/ecma262/#sec-%stringiteratorprototype%.next\n}, function next() {\n var state = getInternalState(this);\n var string = state.string;\n var index = state.index;\n var point;\n if (index >= string.length) return { value: undefined, done: true };\n point = charAt(string, index);\n state.index += point.length;\n return { value: point, done: false };\n});\n\n\n/***/ }),\n\n/***/ 4723:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_133333__) {\n\n\"use strict\";\n\nvar fixRegExpWellKnownSymbolLogic = __nested_webpack_require_133333__(7007);\nvar anObject = __nested_webpack_require_133333__(9670);\nvar toLength = __nested_webpack_require_133333__(7466);\nvar requireObjectCoercible = __nested_webpack_require_133333__(4488);\nvar advanceStringIndex = __nested_webpack_require_133333__(1530);\nvar regExpExec = __nested_webpack_require_133333__(7651);\n\n// @@match logic\nfixRegExpWellKnownSymbolLogic('match', 1, function (MATCH, nativeMatch, maybeCallNative) {\n return [\n // `String.prototype.match` method\n // https://tc39.es/ecma262/#sec-string.prototype.match\n function match(regexp) {\n var O = requireObjectCoercible(this);\n var matcher = regexp == undefined ? undefined : regexp[MATCH];\n return matcher !== undefined ? matcher.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n },\n // `RegExp.prototype[@@match]` method\n // https://tc39.es/ecma262/#sec-regexp.prototype-@@match\n function (regexp) {\n var res = maybeCallNative(nativeMatch, regexp, this);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n\n if (!rx.global) return regExpExec(rx, S);\n\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n var A = [];\n var n = 0;\n var result;\n while ((result = regExpExec(rx, S)) !== null) {\n var matchStr = String(result[0]);\n A[n] = matchStr;\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n n++;\n }\n return n === 0 ? null : A;\n }\n ];\n});\n\n\n/***/ }),\n\n/***/ 5306:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_134975__) {\n\n\"use strict\";\n\nvar fixRegExpWellKnownSymbolLogic = __nested_webpack_require_134975__(7007);\nvar anObject = __nested_webpack_require_134975__(9670);\nvar toLength = __nested_webpack_require_134975__(7466);\nvar toInteger = __nested_webpack_require_134975__(9958);\nvar requireObjectCoercible = __nested_webpack_require_134975__(4488);\nvar advanceStringIndex = __nested_webpack_require_134975__(1530);\nvar getSubstitution = __nested_webpack_require_134975__(647);\nvar regExpExec = __nested_webpack_require_134975__(7651);\n\nvar max = Math.max;\nvar min = Math.min;\n\nvar maybeToString = function (it) {\n return it === undefined ? it : String(it);\n};\n\n// @@replace logic\nfixRegExpWellKnownSymbolLogic('replace', 2, function (REPLACE, nativeReplace, maybeCallNative, reason) {\n var REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = reason.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE;\n var REPLACE_KEEPS_$0 = reason.REPLACE_KEEPS_$0;\n var UNSAFE_SUBSTITUTE = REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE ? '$' : '$0';\n\n return [\n // `String.prototype.replace` method\n // https://tc39.es/ecma262/#sec-string.prototype.replace\n function replace(searchValue, replaceValue) {\n var O = requireObjectCoercible(this);\n var replacer = searchValue == undefined ? undefined : searchValue[REPLACE];\n return replacer !== undefined\n ? replacer.call(searchValue, O, replaceValue)\n : nativeReplace.call(String(O), searchValue, replaceValue);\n },\n // `RegExp.prototype[@@replace]` method\n // https://tc39.es/ecma262/#sec-regexp.prototype-@@replace\n function (regexp, replaceValue) {\n if (\n (!REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE && REPLACE_KEEPS_$0) ||\n (typeof replaceValue === 'string' && replaceValue.indexOf(UNSAFE_SUBSTITUTE) === -1)\n ) {\n var res = maybeCallNative(nativeReplace, regexp, this, replaceValue);\n if (res.done) return res.value;\n }\n\n var rx = anObject(regexp);\n var S = String(this);\n\n var functionalReplace = typeof replaceValue === 'function';\n if (!functionalReplace) replaceValue = String(replaceValue);\n\n var global = rx.global;\n if (global) {\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n }\n var results = [];\n while (true) {\n var result = regExpExec(rx, S);\n if (result === null) break;\n\n results.push(result);\n if (!global) break;\n\n var matchStr = String(result[0]);\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n }\n\n var accumulatedResult = '';\n var nextSourcePosition = 0;\n for (var i = 0; i < results.length; i++) {\n result = results[i];\n\n var matched = String(result[0]);\n var position = max(min(toInteger(result.index), S.length), 0);\n var captures = [];\n // NOTE: This is equivalent to\n // captures = result.slice(1).map(maybeToString)\n // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j]));\n var namedCaptures = result.groups;\n if (functionalReplace) {\n var replacerArgs = [matched].concat(captures, position, S);\n if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);\n var replacement = String(replaceValue.apply(undefined, replacerArgs));\n } else {\n replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n }\n if (position >= nextSourcePosition) {\n accumulatedResult += S.slice(nextSourcePosition, position) + replacement;\n nextSourcePosition = position + matched.length;\n }\n }\n return accumulatedResult + S.slice(nextSourcePosition);\n }\n ];\n});\n\n\n/***/ }),\n\n/***/ 3123:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_139010__) {\n\n\"use strict\";\n\nvar fixRegExpWellKnownSymbolLogic = __nested_webpack_require_139010__(7007);\nvar isRegExp = __nested_webpack_require_139010__(7850);\nvar anObject = __nested_webpack_require_139010__(9670);\nvar requireObjectCoercible = __nested_webpack_require_139010__(4488);\nvar speciesConstructor = __nested_webpack_require_139010__(6707);\nvar advanceStringIndex = __nested_webpack_require_139010__(1530);\nvar toLength = __nested_webpack_require_139010__(7466);\nvar callRegExpExec = __nested_webpack_require_139010__(7651);\nvar regexpExec = __nested_webpack_require_139010__(2261);\nvar fails = __nested_webpack_require_139010__(7293);\n\nvar arrayPush = [].push;\nvar min = Math.min;\nvar MAX_UINT32 = 0xFFFFFFFF;\n\n// babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError\nvar SUPPORTS_Y = !fails(function () { return !RegExp(MAX_UINT32, 'y'); });\n\n// @@split logic\nfixRegExpWellKnownSymbolLogic('split', 2, function (SPLIT, nativeSplit, maybeCallNative) {\n var internalSplit;\n if (\n 'abbc'.split(/(b)*/)[1] == 'c' ||\n // eslint-disable-next-line regexp/no-empty-group -- required for testing\n 'test'.split(/(?:)/, -1).length != 4 ||\n 'ab'.split(/(?:ab)*/).length != 2 ||\n '.'.split(/(.?)(.?)/).length != 4 ||\n // eslint-disable-next-line regexp/no-assertion-capturing-group, regexp/no-empty-group -- required for testing\n '.'.split(/()()/).length > 1 ||\n ''.split(/.?/).length\n ) {\n // based on es5-shim implementation, need to rework it\n internalSplit = function (separator, limit) {\n var string = String(requireObjectCoercible(this));\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (separator === undefined) return [string];\n // If `separator` is not a regex, use native split\n if (!isRegExp(separator)) {\n return nativeSplit.call(string, separator, lim);\n }\n var output = [];\n var flags = (separator.ignoreCase ? 'i' : '') +\n (separator.multiline ? 'm' : '') +\n (separator.unicode ? 'u' : '') +\n (separator.sticky ? 'y' : '');\n var lastLastIndex = 0;\n // Make `global` and avoid `lastIndex` issues by working with a copy\n var separatorCopy = new RegExp(separator.source, flags + 'g');\n var match, lastIndex, lastLength;\n while (match = regexpExec.call(separatorCopy, string)) {\n lastIndex = separatorCopy.lastIndex;\n if (lastIndex > lastLastIndex) {\n output.push(string.slice(lastLastIndex, match.index));\n if (match.length > 1 && match.index < string.length) arrayPush.apply(output, match.slice(1));\n lastLength = match[0].length;\n lastLastIndex = lastIndex;\n if (output.length >= lim) break;\n }\n if (separatorCopy.lastIndex === match.index) separatorCopy.lastIndex++; // Avoid an infinite loop\n }\n if (lastLastIndex === string.length) {\n if (lastLength || !separatorCopy.test('')) output.push('');\n } else output.push(string.slice(lastLastIndex));\n return output.length > lim ? output.slice(0, lim) : output;\n };\n // Chakra, V8\n } else if ('0'.split(undefined, 0).length) {\n internalSplit = function (separator, limit) {\n return separator === undefined && limit === 0 ? [] : nativeSplit.call(this, separator, limit);\n };\n } else internalSplit = nativeSplit;\n\n return [\n // `String.prototype.split` method\n // https://tc39.es/ecma262/#sec-string.prototype.split\n function split(separator, limit) {\n var O = requireObjectCoercible(this);\n var splitter = separator == undefined ? undefined : separator[SPLIT];\n return splitter !== undefined\n ? splitter.call(separator, O, limit)\n : internalSplit.call(String(O), separator, limit);\n },\n // `RegExp.prototype[@@split]` method\n // https://tc39.es/ecma262/#sec-regexp.prototype-@@split\n //\n // NOTE: This cannot be properly polyfilled in engines that don't support\n // the 'y' flag.\n function (regexp, limit) {\n var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== nativeSplit);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n var C = speciesConstructor(rx, RegExp);\n\n var unicodeMatching = rx.unicode;\n var flags = (rx.ignoreCase ? 'i' : '') +\n (rx.multiline ? 'm' : '') +\n (rx.unicode ? 'u' : '') +\n (SUPPORTS_Y ? 'y' : 'g');\n\n // ^(? + rx + ) is needed, in combination with some S slicing, to\n // simulate the 'y' flag.\n var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags);\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (S.length === 0) return callRegExpExec(splitter, S) === null ? [S] : [];\n var p = 0;\n var q = 0;\n var A = [];\n while (q < S.length) {\n splitter.lastIndex = SUPPORTS_Y ? q : 0;\n var z = callRegExpExec(splitter, SUPPORTS_Y ? S : S.slice(q));\n var e;\n if (\n z === null ||\n (e = min(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p\n ) {\n q = advanceStringIndex(S, q, unicodeMatching);\n } else {\n A.push(S.slice(p, q));\n if (A.length === lim) return A;\n for (var i = 1; i <= z.length - 1; i++) {\n A.push(z[i]);\n if (A.length === lim) return A;\n }\n q = p = e;\n }\n }\n A.push(S.slice(p));\n return A;\n }\n ];\n}, !SUPPORTS_Y);\n\n\n/***/ }),\n\n/***/ 3210:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_144619__) {\n\n\"use strict\";\n\nvar $ = __nested_webpack_require_144619__(2109);\nvar $trim = __nested_webpack_require_144619__(3111).trim;\nvar forcedStringTrimMethod = __nested_webpack_require_144619__(6091);\n\n// `String.prototype.trim` method\n// https://tc39.es/ecma262/#sec-string.prototype.trim\n$({ target: 'String', proto: true, forced: forcedStringTrimMethod('trim') }, {\n trim: function trim() {\n return $trim(this);\n }\n});\n\n\n/***/ }),\n\n/***/ 2990:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_145111__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_145111__(260);\nvar $copyWithin = __nested_webpack_require_145111__(1048);\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.copyWithin` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.copywithin\nexportTypedArrayMethod('copyWithin', function copyWithin(target, start /* , end */) {\n return $copyWithin.call(aTypedArray(this), target, start, arguments.length > 2 ? arguments[2] : undefined);\n});\n\n\n/***/ }),\n\n/***/ 8927:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_145777__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_145777__(260);\nvar $every = __nested_webpack_require_145777__(2092).every;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.every` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.every\nexportTypedArrayMethod('every', function every(callbackfn /* , thisArg */) {\n return $every(aTypedArray(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n});\n\n\n/***/ }),\n\n/***/ 3105:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_146412__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_146412__(260);\nvar $fill = __nested_webpack_require_146412__(1285);\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.fill` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.fill\n// eslint-disable-next-line no-unused-vars -- required for `.length`\nexportTypedArrayMethod('fill', function fill(value /* , start, end */) {\n return $fill.apply(aTypedArray(this), arguments);\n});\n\n\n/***/ }),\n\n/***/ 5035:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_147058__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_147058__(260);\nvar $filter = __nested_webpack_require_147058__(2092).filter;\nvar fromSpeciesAndList = __nested_webpack_require_147058__(3074);\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.filter` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.filter\nexportTypedArrayMethod('filter', function filter(callbackfn /* , thisArg */) {\n var list = $filter(aTypedArray(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n return fromSpeciesAndList(this, list);\n});\n\n\n/***/ }),\n\n/***/ 7174:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_147797__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_147797__(260);\nvar $findIndex = __nested_webpack_require_147797__(2092).findIndex;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.findIndex` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.findindex\nexportTypedArrayMethod('findIndex', function findIndex(predicate /* , thisArg */) {\n return $findIndex(aTypedArray(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n});\n\n\n/***/ }),\n\n/***/ 4345:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_148458__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_148458__(260);\nvar $find = __nested_webpack_require_148458__(2092).find;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.find` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.find\nexportTypedArrayMethod('find', function find(predicate /* , thisArg */) {\n return $find(aTypedArray(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n});\n\n\n/***/ }),\n\n/***/ 2846:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_149084__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_149084__(260);\nvar $forEach = __nested_webpack_require_149084__(2092).forEach;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.forEach` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.foreach\nexportTypedArrayMethod('forEach', function forEach(callbackfn /* , thisArg */) {\n $forEach(aTypedArray(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n});\n\n\n/***/ }),\n\n/***/ 4731:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_149726__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_149726__(260);\nvar $includes = __nested_webpack_require_149726__(1318).includes;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.includes` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.includes\nexportTypedArrayMethod('includes', function includes(searchElement /* , fromIndex */) {\n return $includes(aTypedArray(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n});\n\n\n/***/ }),\n\n/***/ 7209:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_150390__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_150390__(260);\nvar $indexOf = __nested_webpack_require_150390__(1318).indexOf;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.indexOf` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.indexof\nexportTypedArrayMethod('indexOf', function indexOf(searchElement /* , fromIndex */) {\n return $indexOf(aTypedArray(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n});\n\n\n/***/ }),\n\n/***/ 6319:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_151047__) {\n\n\"use strict\";\n\nvar global = __nested_webpack_require_151047__(7854);\nvar ArrayBufferViewCore = __nested_webpack_require_151047__(260);\nvar ArrayIterators = __nested_webpack_require_151047__(6992);\nvar wellKnownSymbol = __nested_webpack_require_151047__(5112);\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar Uint8Array = global.Uint8Array;\nvar arrayValues = ArrayIterators.values;\nvar arrayKeys = ArrayIterators.keys;\nvar arrayEntries = ArrayIterators.entries;\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar nativeTypedArrayIterator = Uint8Array && Uint8Array.prototype[ITERATOR];\n\nvar CORRECT_ITER_NAME = !!nativeTypedArrayIterator\n && (nativeTypedArrayIterator.name == 'values' || nativeTypedArrayIterator.name == undefined);\n\nvar typedArrayValues = function values() {\n return arrayValues.call(aTypedArray(this));\n};\n\n// `%TypedArray%.prototype.entries` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.entries\nexportTypedArrayMethod('entries', function entries() {\n return arrayEntries.call(aTypedArray(this));\n});\n// `%TypedArray%.prototype.keys` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.keys\nexportTypedArrayMethod('keys', function keys() {\n return arrayKeys.call(aTypedArray(this));\n});\n// `%TypedArray%.prototype.values` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.values\nexportTypedArrayMethod('values', typedArrayValues, !CORRECT_ITER_NAME);\n// `%TypedArray%.prototype[@@iterator]` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype-@@iterator\nexportTypedArrayMethod(ITERATOR, typedArrayValues, !CORRECT_ITER_NAME);\n\n\n/***/ }),\n\n/***/ 8867:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_152782__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_152782__(260);\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar $join = [].join;\n\n// `%TypedArray%.prototype.join` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.join\n// eslint-disable-next-line no-unused-vars -- required for `.length`\nexportTypedArrayMethod('join', function join(separator) {\n return $join.apply(aTypedArray(this), arguments);\n});\n\n\n/***/ }),\n\n/***/ 7789:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_153395__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_153395__(260);\nvar $lastIndexOf = __nested_webpack_require_153395__(6583);\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.lastIndexOf` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.lastindexof\n// eslint-disable-next-line no-unused-vars -- required for `.length`\nexportTypedArrayMethod('lastIndexOf', function lastIndexOf(searchElement /* , fromIndex */) {\n return $lastIndexOf.apply(aTypedArray(this), arguments);\n});\n\n\n/***/ }),\n\n/***/ 3739:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_154090__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_154090__(260);\nvar $map = __nested_webpack_require_154090__(2092).map;\nvar speciesConstructor = __nested_webpack_require_154090__(6707);\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar aTypedArrayConstructor = ArrayBufferViewCore.aTypedArrayConstructor;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.map` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.map\nexportTypedArrayMethod('map', function map(mapfn /* , thisArg */) {\n return $map(aTypedArray(this), mapfn, arguments.length > 1 ? arguments[1] : undefined, function (O, length) {\n return new (aTypedArrayConstructor(speciesConstructor(O, O.constructor)))(length);\n });\n});\n\n\n/***/ }),\n\n/***/ 4483:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_154941__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_154941__(260);\nvar $reduceRight = __nested_webpack_require_154941__(3671).right;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.reduceRicht` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.reduceright\nexportTypedArrayMethod('reduceRight', function reduceRight(callbackfn /* , initialValue */) {\n return $reduceRight(aTypedArray(this), callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);\n});\n\n\n/***/ }),\n\n/***/ 9368:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_155635__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_155635__(260);\nvar $reduce = __nested_webpack_require_155635__(3671).left;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.reduce` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.reduce\nexportTypedArrayMethod('reduce', function reduce(callbackfn /* , initialValue */) {\n return $reduce(aTypedArray(this), callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);\n});\n\n\n/***/ }),\n\n/***/ 2056:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_156298__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_156298__(260);\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar floor = Math.floor;\n\n// `%TypedArray%.prototype.reverse` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.reverse\nexportTypedArrayMethod('reverse', function reverse() {\n var that = this;\n var length = aTypedArray(that).length;\n var middle = floor(length / 2);\n var index = 0;\n var value;\n while (index < middle) {\n value = that[index];\n that[index++] = that[--length];\n that[length] = value;\n } return that;\n});\n\n\n/***/ }),\n\n/***/ 3462:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_157051__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_157051__(260);\nvar toLength = __nested_webpack_require_157051__(7466);\nvar toOffset = __nested_webpack_require_157051__(4590);\nvar toObject = __nested_webpack_require_157051__(7908);\nvar fails = __nested_webpack_require_157051__(7293);\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\nvar FORCED = fails(function () {\n /* global Int8Array -- safe */\n new Int8Array(1).set({});\n});\n\n// `%TypedArray%.prototype.set` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.set\nexportTypedArrayMethod('set', function set(arrayLike /* , offset */) {\n aTypedArray(this);\n var offset = toOffset(arguments.length > 1 ? arguments[1] : undefined, 1);\n var length = this.length;\n var src = toObject(arrayLike);\n var len = toLength(src.length);\n var index = 0;\n if (len + offset > length) throw RangeError('Wrong length');\n while (index < len) this[offset + index] = src[index++];\n}, FORCED);\n\n\n/***/ }),\n\n/***/ 678:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_158136__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_158136__(260);\nvar speciesConstructor = __nested_webpack_require_158136__(6707);\nvar fails = __nested_webpack_require_158136__(7293);\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar aTypedArrayConstructor = ArrayBufferViewCore.aTypedArrayConstructor;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar $slice = [].slice;\n\nvar FORCED = fails(function () {\n /* global Int8Array -- safe */\n new Int8Array(1).slice();\n});\n\n// `%TypedArray%.prototype.slice` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.slice\nexportTypedArrayMethod('slice', function slice(start, end) {\n var list = $slice.call(aTypedArray(this), start, end);\n var C = speciesConstructor(this, this.constructor);\n var index = 0;\n var length = list.length;\n var result = new (aTypedArrayConstructor(C))(length);\n while (length > index) result[index] = list[index++];\n return result;\n}, FORCED);\n\n\n/***/ }),\n\n/***/ 7462:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_159191__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_159191__(260);\nvar $some = __nested_webpack_require_159191__(2092).some;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.some` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.some\nexportTypedArrayMethod('some', function some(callbackfn /* , thisArg */) {\n return $some(aTypedArray(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n});\n\n\n/***/ }),\n\n/***/ 3824:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_159819__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_159819__(260);\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar $sort = [].sort;\n\n// `%TypedArray%.prototype.sort` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.sort\nexportTypedArrayMethod('sort', function sort(comparefn) {\n return $sort.call(aTypedArray(this), comparefn);\n});\n\n\n/***/ }),\n\n/***/ 5021:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_160362__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_160362__(260);\nvar toLength = __nested_webpack_require_160362__(7466);\nvar toAbsoluteIndex = __nested_webpack_require_160362__(1400);\nvar speciesConstructor = __nested_webpack_require_160362__(6707);\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.subarray` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.subarray\nexportTypedArrayMethod('subarray', function subarray(begin, end) {\n var O = aTypedArray(this);\n var length = O.length;\n var beginIndex = toAbsoluteIndex(begin, length);\n return new (speciesConstructor(O, O.constructor))(\n O.buffer,\n O.byteOffset + beginIndex * O.BYTES_PER_ELEMENT,\n toLength((end === undefined ? length : toAbsoluteIndex(end, length)) - beginIndex)\n );\n});\n\n\n/***/ }),\n\n/***/ 2974:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_161310__) {\n\n\"use strict\";\n\nvar global = __nested_webpack_require_161310__(7854);\nvar ArrayBufferViewCore = __nested_webpack_require_161310__(260);\nvar fails = __nested_webpack_require_161310__(7293);\n\nvar Int8Array = global.Int8Array;\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar $toLocaleString = [].toLocaleString;\nvar $slice = [].slice;\n\n// iOS Safari 6.x fails here\nvar TO_LOCALE_STRING_BUG = !!Int8Array && fails(function () {\n $toLocaleString.call(new Int8Array(1));\n});\n\nvar FORCED = fails(function () {\n return [1, 2].toLocaleString() != new Int8Array([1, 2]).toLocaleString();\n}) || !fails(function () {\n Int8Array.prototype.toLocaleString.call([1, 2]);\n});\n\n// `%TypedArray%.prototype.toLocaleString` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.tolocalestring\nexportTypedArrayMethod('toLocaleString', function toLocaleString() {\n return $toLocaleString.apply(TO_LOCALE_STRING_BUG ? $slice.call(aTypedArray(this)) : aTypedArray(this), arguments);\n}, FORCED);\n\n\n/***/ }),\n\n/***/ 5016:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_162445__) {\n\n\"use strict\";\n\nvar exportTypedArrayMethod = __nested_webpack_require_162445__(260).exportTypedArrayMethod;\nvar fails = __nested_webpack_require_162445__(7293);\nvar global = __nested_webpack_require_162445__(7854);\n\nvar Uint8Array = global.Uint8Array;\nvar Uint8ArrayPrototype = Uint8Array && Uint8Array.prototype || {};\nvar arrayToString = [].toString;\nvar arrayJoin = [].join;\n\nif (fails(function () { arrayToString.call({}); })) {\n arrayToString = function toString() {\n return arrayJoin.call(this);\n };\n}\n\nvar IS_NOT_ARRAY_METHOD = Uint8ArrayPrototype.toString != arrayToString;\n\n// `%TypedArray%.prototype.toString` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.tostring\nexportTypedArrayMethod('toString', arrayToString, IS_NOT_ARRAY_METHOD);\n\n\n/***/ }),\n\n/***/ 2472:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_163286__) {\n\nvar createTypedArrayConstructor = __nested_webpack_require_163286__(9843);\n\n// `Uint8Array` constructor\n// https://tc39.es/ecma262/#sec-typedarray-objects\ncreateTypedArrayConstructor('Uint8', function (init) {\n return function Uint8Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n\n\n/***/ }),\n\n/***/ 4747:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_163713__) {\n\nvar global = __nested_webpack_require_163713__(7854);\nvar DOMIterables = __nested_webpack_require_163713__(8324);\nvar forEach = __nested_webpack_require_163713__(8533);\nvar createNonEnumerableProperty = __nested_webpack_require_163713__(8880);\n\nfor (var COLLECTION_NAME in DOMIterables) {\n var Collection = global[COLLECTION_NAME];\n var CollectionPrototype = Collection && Collection.prototype;\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype && CollectionPrototype.forEach !== forEach) try {\n createNonEnumerableProperty(CollectionPrototype, 'forEach', forEach);\n } catch (error) {\n CollectionPrototype.forEach = forEach;\n }\n}\n\n\n/***/ }),\n\n/***/ 3948:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_164461__) {\n\nvar global = __nested_webpack_require_164461__(7854);\nvar DOMIterables = __nested_webpack_require_164461__(8324);\nvar ArrayIteratorMethods = __nested_webpack_require_164461__(6992);\nvar createNonEnumerableProperty = __nested_webpack_require_164461__(8880);\nvar wellKnownSymbol = __nested_webpack_require_164461__(5112);\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar ArrayValues = ArrayIteratorMethods.values;\n\nfor (var COLLECTION_NAME in DOMIterables) {\n var Collection = global[COLLECTION_NAME];\n var CollectionPrototype = Collection && Collection.prototype;\n if (CollectionPrototype) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype[ITERATOR] !== ArrayValues) try {\n createNonEnumerableProperty(CollectionPrototype, ITERATOR, ArrayValues);\n } catch (error) {\n CollectionPrototype[ITERATOR] = ArrayValues;\n }\n if (!CollectionPrototype[TO_STRING_TAG]) {\n createNonEnumerableProperty(CollectionPrototype, TO_STRING_TAG, COLLECTION_NAME);\n }\n if (DOMIterables[COLLECTION_NAME]) for (var METHOD_NAME in ArrayIteratorMethods) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype[METHOD_NAME] !== ArrayIteratorMethods[METHOD_NAME]) try {\n createNonEnumerableProperty(CollectionPrototype, METHOD_NAME, ArrayIteratorMethods[METHOD_NAME]);\n } catch (error) {\n CollectionPrototype[METHOD_NAME] = ArrayIteratorMethods[METHOD_NAME];\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ 1637:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_166049__) {\n\n\"use strict\";\n\n// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\n__nested_webpack_require_166049__(6992);\nvar $ = __nested_webpack_require_166049__(2109);\nvar getBuiltIn = __nested_webpack_require_166049__(5005);\nvar USE_NATIVE_URL = __nested_webpack_require_166049__(590);\nvar redefine = __nested_webpack_require_166049__(1320);\nvar redefineAll = __nested_webpack_require_166049__(2248);\nvar setToStringTag = __nested_webpack_require_166049__(8003);\nvar createIteratorConstructor = __nested_webpack_require_166049__(4994);\nvar InternalStateModule = __nested_webpack_require_166049__(9909);\nvar anInstance = __nested_webpack_require_166049__(5787);\nvar hasOwn = __nested_webpack_require_166049__(6656);\nvar bind = __nested_webpack_require_166049__(9974);\nvar classof = __nested_webpack_require_166049__(648);\nvar anObject = __nested_webpack_require_166049__(9670);\nvar isObject = __nested_webpack_require_166049__(111);\nvar create = __nested_webpack_require_166049__(30);\nvar createPropertyDescriptor = __nested_webpack_require_166049__(9114);\nvar getIterator = __nested_webpack_require_166049__(8554);\nvar getIteratorMethod = __nested_webpack_require_166049__(1246);\nvar wellKnownSymbol = __nested_webpack_require_166049__(5112);\n\nvar $fetch = getBuiltIn('fetch');\nvar Headers = getBuiltIn('Headers');\nvar ITERATOR = wellKnownSymbol('iterator');\nvar URL_SEARCH_PARAMS = 'URLSearchParams';\nvar URL_SEARCH_PARAMS_ITERATOR = URL_SEARCH_PARAMS + 'Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalParamsState = InternalStateModule.getterFor(URL_SEARCH_PARAMS);\nvar getInternalIteratorState = InternalStateModule.getterFor(URL_SEARCH_PARAMS_ITERATOR);\n\nvar plus = /\\+/g;\nvar sequences = Array(4);\n\nvar percentSequence = function (bytes) {\n return sequences[bytes - 1] || (sequences[bytes - 1] = RegExp('((?:%[\\\\da-f]{2}){' + bytes + '})', 'gi'));\n};\n\nvar percentDecode = function (sequence) {\n try {\n return decodeURIComponent(sequence);\n } catch (error) {\n return sequence;\n }\n};\n\nvar deserialize = function (it) {\n var result = it.replace(plus, ' ');\n var bytes = 4;\n try {\n return decodeURIComponent(result);\n } catch (error) {\n while (bytes) {\n result = result.replace(percentSequence(bytes--), percentDecode);\n }\n return result;\n }\n};\n\nvar find = /[!'()~]|%20/g;\n\nvar replace = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+'\n};\n\nvar replacer = function (match) {\n return replace[match];\n};\n\nvar serialize = function (it) {\n return encodeURIComponent(it).replace(find, replacer);\n};\n\nvar parseSearchParams = function (result, query) {\n if (query) {\n var attributes = query.split('&');\n var index = 0;\n var attribute, entry;\n while (index < attributes.length) {\n attribute = attributes[index++];\n if (attribute.length) {\n entry = attribute.split('=');\n result.push({\n key: deserialize(entry.shift()),\n value: deserialize(entry.join('='))\n });\n }\n }\n }\n};\n\nvar updateSearchParams = function (query) {\n this.entries.length = 0;\n parseSearchParams(this.entries, query);\n};\n\nvar validateArgumentsLength = function (passed, required) {\n if (passed < required) throw TypeError('Not enough arguments');\n};\n\nvar URLSearchParamsIterator = createIteratorConstructor(function Iterator(params, kind) {\n setInternalState(this, {\n type: URL_SEARCH_PARAMS_ITERATOR,\n iterator: getIterator(getInternalParamsState(params).entries),\n kind: kind\n });\n}, 'Iterator', function next() {\n var state = getInternalIteratorState(this);\n var kind = state.kind;\n var step = state.iterator.next();\n var entry = step.value;\n if (!step.done) {\n step.value = kind === 'keys' ? entry.key : kind === 'values' ? entry.value : [entry.key, entry.value];\n } return step;\n});\n\n// `URLSearchParams` constructor\n// https://url.spec.whatwg.org/#interface-urlsearchparams\nvar URLSearchParamsConstructor = function URLSearchParams(/* init */) {\n anInstance(this, URLSearchParamsConstructor, URL_SEARCH_PARAMS);\n var init = arguments.length > 0 ? arguments[0] : undefined;\n var that = this;\n var entries = [];\n var iteratorMethod, iterator, next, step, entryIterator, entryNext, first, second, key;\n\n setInternalState(that, {\n type: URL_SEARCH_PARAMS,\n entries: entries,\n updateURL: function () { /* empty */ },\n updateSearchParams: updateSearchParams\n });\n\n if (init !== undefined) {\n if (isObject(init)) {\n iteratorMethod = getIteratorMethod(init);\n if (typeof iteratorMethod === 'function') {\n iterator = iteratorMethod.call(init);\n next = iterator.next;\n while (!(step = next.call(iterator)).done) {\n entryIterator = getIterator(anObject(step.value));\n entryNext = entryIterator.next;\n if (\n (first = entryNext.call(entryIterator)).done ||\n (second = entryNext.call(entryIterator)).done ||\n !entryNext.call(entryIterator).done\n ) throw TypeError('Expected sequence with length 2');\n entries.push({ key: first.value + '', value: second.value + '' });\n }\n } else for (key in init) if (hasOwn(init, key)) entries.push({ key: key, value: init[key] + '' });\n } else {\n parseSearchParams(entries, typeof init === 'string' ? init.charAt(0) === '?' ? init.slice(1) : init : init + '');\n }\n }\n};\n\nvar URLSearchParamsPrototype = URLSearchParamsConstructor.prototype;\n\nredefineAll(URLSearchParamsPrototype, {\n // `URLSearchParams.prototype.append` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-append\n append: function append(name, value) {\n validateArgumentsLength(arguments.length, 2);\n var state = getInternalParamsState(this);\n state.entries.push({ key: name + '', value: value + '' });\n state.updateURL();\n },\n // `URLSearchParams.prototype.delete` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-delete\n 'delete': function (name) {\n validateArgumentsLength(arguments.length, 1);\n var state = getInternalParamsState(this);\n var entries = state.entries;\n var key = name + '';\n var index = 0;\n while (index < entries.length) {\n if (entries[index].key === key) entries.splice(index, 1);\n else index++;\n }\n state.updateURL();\n },\n // `URLSearchParams.prototype.get` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-get\n get: function get(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var index = 0;\n for (; index < entries.length; index++) {\n if (entries[index].key === key) return entries[index].value;\n }\n return null;\n },\n // `URLSearchParams.prototype.getAll` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-getall\n getAll: function getAll(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var result = [];\n var index = 0;\n for (; index < entries.length; index++) {\n if (entries[index].key === key) result.push(entries[index].value);\n }\n return result;\n },\n // `URLSearchParams.prototype.has` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-has\n has: function has(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var index = 0;\n while (index < entries.length) {\n if (entries[index++].key === key) return true;\n }\n return false;\n },\n // `URLSearchParams.prototype.set` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-set\n set: function set(name, value) {\n validateArgumentsLength(arguments.length, 1);\n var state = getInternalParamsState(this);\n var entries = state.entries;\n var found = false;\n var key = name + '';\n var val = value + '';\n var index = 0;\n var entry;\n for (; index < entries.length; index++) {\n entry = entries[index];\n if (entry.key === key) {\n if (found) entries.splice(index--, 1);\n else {\n found = true;\n entry.value = val;\n }\n }\n }\n if (!found) entries.push({ key: key, value: val });\n state.updateURL();\n },\n // `URLSearchParams.prototype.sort` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-sort\n sort: function sort() {\n var state = getInternalParamsState(this);\n var entries = state.entries;\n // Array#sort is not stable in some engines\n var slice = entries.slice();\n var entry, entriesIndex, sliceIndex;\n entries.length = 0;\n for (sliceIndex = 0; sliceIndex < slice.length; sliceIndex++) {\n entry = slice[sliceIndex];\n for (entriesIndex = 0; entriesIndex < sliceIndex; entriesIndex++) {\n if (entries[entriesIndex].key > entry.key) {\n entries.splice(entriesIndex, 0, entry);\n break;\n }\n }\n if (entriesIndex === sliceIndex) entries.push(entry);\n }\n state.updateURL();\n },\n // `URLSearchParams.prototype.forEach` method\n forEach: function forEach(callback /* , thisArg */) {\n var entries = getInternalParamsState(this).entries;\n var boundFunction = bind(callback, arguments.length > 1 ? arguments[1] : undefined, 3);\n var index = 0;\n var entry;\n while (index < entries.length) {\n entry = entries[index++];\n boundFunction(entry.value, entry.key, this);\n }\n },\n // `URLSearchParams.prototype.keys` method\n keys: function keys() {\n return new URLSearchParamsIterator(this, 'keys');\n },\n // `URLSearchParams.prototype.values` method\n values: function values() {\n return new URLSearchParamsIterator(this, 'values');\n },\n // `URLSearchParams.prototype.entries` method\n entries: function entries() {\n return new URLSearchParamsIterator(this, 'entries');\n }\n}, { enumerable: true });\n\n// `URLSearchParams.prototype[@@iterator]` method\nredefine(URLSearchParamsPrototype, ITERATOR, URLSearchParamsPrototype.entries);\n\n// `URLSearchParams.prototype.toString` method\n// https://url.spec.whatwg.org/#urlsearchparams-stringification-behavior\nredefine(URLSearchParamsPrototype, 'toString', function toString() {\n var entries = getInternalParamsState(this).entries;\n var result = [];\n var index = 0;\n var entry;\n while (index < entries.length) {\n entry = entries[index++];\n result.push(serialize(entry.key) + '=' + serialize(entry.value));\n } return result.join('&');\n}, { enumerable: true });\n\nsetToStringTag(URLSearchParamsConstructor, URL_SEARCH_PARAMS);\n\n$({ global: true, forced: !USE_NATIVE_URL }, {\n URLSearchParams: URLSearchParamsConstructor\n});\n\n// Wrap `fetch` for correct work with polyfilled `URLSearchParams`\n// https://github.com/zloirock/core-js/issues/674\nif (!USE_NATIVE_URL && typeof $fetch == 'function' && typeof Headers == 'function') {\n $({ global: true, enumerable: true, forced: true }, {\n fetch: function fetch(input /* , init */) {\n var args = [input];\n var init, body, headers;\n if (arguments.length > 1) {\n init = arguments[1];\n if (isObject(init)) {\n body = init.body;\n if (classof(body) === URL_SEARCH_PARAMS) {\n headers = init.headers ? new Headers(init.headers) : new Headers();\n if (!headers.has('content-type')) {\n headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');\n }\n init = create(init, {\n body: createPropertyDescriptor(0, String(body)),\n headers: createPropertyDescriptor(0, headers)\n });\n }\n }\n args.push(init);\n } return $fetch.apply(this, args);\n }\n });\n}\n\nmodule.exports = {\n URLSearchParams: URLSearchParamsConstructor,\n getState: getInternalParamsState\n};\n\n\n/***/ }),\n\n/***/ 285:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_177789__) {\n\n\"use strict\";\n\n// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\n__nested_webpack_require_177789__(8783);\nvar $ = __nested_webpack_require_177789__(2109);\nvar DESCRIPTORS = __nested_webpack_require_177789__(9781);\nvar USE_NATIVE_URL = __nested_webpack_require_177789__(590);\nvar global = __nested_webpack_require_177789__(7854);\nvar defineProperties = __nested_webpack_require_177789__(6048);\nvar redefine = __nested_webpack_require_177789__(1320);\nvar anInstance = __nested_webpack_require_177789__(5787);\nvar has = __nested_webpack_require_177789__(6656);\nvar assign = __nested_webpack_require_177789__(1574);\nvar arrayFrom = __nested_webpack_require_177789__(8457);\nvar codeAt = __nested_webpack_require_177789__(8710).codeAt;\nvar toASCII = __nested_webpack_require_177789__(3197);\nvar setToStringTag = __nested_webpack_require_177789__(8003);\nvar URLSearchParamsModule = __nested_webpack_require_177789__(1637);\nvar InternalStateModule = __nested_webpack_require_177789__(9909);\n\nvar NativeURL = global.URL;\nvar URLSearchParams = URLSearchParamsModule.URLSearchParams;\nvar getInternalSearchParamsState = URLSearchParamsModule.getState;\nvar setInternalState = InternalStateModule.set;\nvar getInternalURLState = InternalStateModule.getterFor('URL');\nvar floor = Math.floor;\nvar pow = Math.pow;\n\nvar INVALID_AUTHORITY = 'Invalid authority';\nvar INVALID_SCHEME = 'Invalid scheme';\nvar INVALID_HOST = 'Invalid host';\nvar INVALID_PORT = 'Invalid port';\n\nvar ALPHA = /[A-Za-z]/;\nvar ALPHANUMERIC = /[\\d+-.A-Za-z]/;\nvar DIGIT = /\\d/;\nvar HEX_START = /^(0x|0X)/;\nvar OCT = /^[0-7]+$/;\nvar DEC = /^\\d+$/;\nvar HEX = /^[\\dA-Fa-f]+$/;\n/* eslint-disable no-control-regex -- safe */\nvar FORBIDDEN_HOST_CODE_POINT = /[\\u0000\\t\\u000A\\u000D #%/:?@[\\\\]]/;\nvar FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT = /[\\u0000\\t\\u000A\\u000D #/:?@[\\\\]]/;\nvar LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE = /^[\\u0000-\\u001F ]+|[\\u0000-\\u001F ]+$/g;\nvar TAB_AND_NEW_LINE = /[\\t\\u000A\\u000D]/g;\n/* eslint-enable no-control-regex -- safe */\nvar EOF;\n\nvar parseHost = function (url, input) {\n var result, codePoints, index;\n if (input.charAt(0) == '[') {\n if (input.charAt(input.length - 1) != ']') return INVALID_HOST;\n result = parseIPv6(input.slice(1, -1));\n if (!result) return INVALID_HOST;\n url.host = result;\n // opaque host\n } else if (!isSpecial(url)) {\n if (FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT.test(input)) return INVALID_HOST;\n result = '';\n codePoints = arrayFrom(input);\n for (index = 0; index < codePoints.length; index++) {\n result += percentEncode(codePoints[index], C0ControlPercentEncodeSet);\n }\n url.host = result;\n } else {\n input = toASCII(input);\n if (FORBIDDEN_HOST_CODE_POINT.test(input)) return INVALID_HOST;\n result = parseIPv4(input);\n if (result === null) return INVALID_HOST;\n url.host = result;\n }\n};\n\nvar parseIPv4 = function (input) {\n var parts = input.split('.');\n var partsLength, numbers, index, part, radix, number, ipv4;\n if (parts.length && parts[parts.length - 1] == '') {\n parts.pop();\n }\n partsLength = parts.length;\n if (partsLength > 4) return input;\n numbers = [];\n for (index = 0; index < partsLength; index++) {\n part = parts[index];\n if (part == '') return input;\n radix = 10;\n if (part.length > 1 && part.charAt(0) == '0') {\n radix = HEX_START.test(part) ? 16 : 8;\n part = part.slice(radix == 8 ? 1 : 2);\n }\n if (part === '') {\n number = 0;\n } else {\n if (!(radix == 10 ? DEC : radix == 8 ? OCT : HEX).test(part)) return input;\n number = parseInt(part, radix);\n }\n numbers.push(number);\n }\n for (index = 0; index < partsLength; index++) {\n number = numbers[index];\n if (index == partsLength - 1) {\n if (number >= pow(256, 5 - partsLength)) return null;\n } else if (number > 255) return null;\n }\n ipv4 = numbers.pop();\n for (index = 0; index < numbers.length; index++) {\n ipv4 += numbers[index] * pow(256, 3 - index);\n }\n return ipv4;\n};\n\n// eslint-disable-next-line max-statements -- TODO\nvar parseIPv6 = function (input) {\n var address = [0, 0, 0, 0, 0, 0, 0, 0];\n var pieceIndex = 0;\n var compress = null;\n var pointer = 0;\n var value, length, numbersSeen, ipv4Piece, number, swaps, swap;\n\n var char = function () {\n return input.charAt(pointer);\n };\n\n if (char() == ':') {\n if (input.charAt(1) != ':') return;\n pointer += 2;\n pieceIndex++;\n compress = pieceIndex;\n }\n while (char()) {\n if (pieceIndex == 8) return;\n if (char() == ':') {\n if (compress !== null) return;\n pointer++;\n pieceIndex++;\n compress = pieceIndex;\n continue;\n }\n value = length = 0;\n while (length < 4 && HEX.test(char())) {\n value = value * 16 + parseInt(char(), 16);\n pointer++;\n length++;\n }\n if (char() == '.') {\n if (length == 0) return;\n pointer -= length;\n if (pieceIndex > 6) return;\n numbersSeen = 0;\n while (char()) {\n ipv4Piece = null;\n if (numbersSeen > 0) {\n if (char() == '.' && numbersSeen < 4) pointer++;\n else return;\n }\n if (!DIGIT.test(char())) return;\n while (DIGIT.test(char())) {\n number = parseInt(char(), 10);\n if (ipv4Piece === null) ipv4Piece = number;\n else if (ipv4Piece == 0) return;\n else ipv4Piece = ipv4Piece * 10 + number;\n if (ipv4Piece > 255) return;\n pointer++;\n }\n address[pieceIndex] = address[pieceIndex] * 256 + ipv4Piece;\n numbersSeen++;\n if (numbersSeen == 2 || numbersSeen == 4) pieceIndex++;\n }\n if (numbersSeen != 4) return;\n break;\n } else if (char() == ':') {\n pointer++;\n if (!char()) return;\n } else if (char()) return;\n address[pieceIndex++] = value;\n }\n if (compress !== null) {\n swaps = pieceIndex - compress;\n pieceIndex = 7;\n while (pieceIndex != 0 && swaps > 0) {\n swap = address[pieceIndex];\n address[pieceIndex--] = address[compress + swaps - 1];\n address[compress + --swaps] = swap;\n }\n } else if (pieceIndex != 8) return;\n return address;\n};\n\nvar findLongestZeroSequence = function (ipv6) {\n var maxIndex = null;\n var maxLength = 1;\n var currStart = null;\n var currLength = 0;\n var index = 0;\n for (; index < 8; index++) {\n if (ipv6[index] !== 0) {\n if (currLength > maxLength) {\n maxIndex = currStart;\n maxLength = currLength;\n }\n currStart = null;\n currLength = 0;\n } else {\n if (currStart === null) currStart = index;\n ++currLength;\n }\n }\n if (currLength > maxLength) {\n maxIndex = currStart;\n maxLength = currLength;\n }\n return maxIndex;\n};\n\nvar serializeHost = function (host) {\n var result, index, compress, ignore0;\n // ipv4\n if (typeof host == 'number') {\n result = [];\n for (index = 0; index < 4; index++) {\n result.unshift(host % 256);\n host = floor(host / 256);\n } return result.join('.');\n // ipv6\n } else if (typeof host == 'object') {\n result = '';\n compress = findLongestZeroSequence(host);\n for (index = 0; index < 8; index++) {\n if (ignore0 && host[index] === 0) continue;\n if (ignore0) ignore0 = false;\n if (compress === index) {\n result += index ? ':' : '::';\n ignore0 = true;\n } else {\n result += host[index].toString(16);\n if (index < 7) result += ':';\n }\n }\n return '[' + result + ']';\n } return host;\n};\n\nvar C0ControlPercentEncodeSet = {};\nvar fragmentPercentEncodeSet = assign({}, C0ControlPercentEncodeSet, {\n ' ': 1, '\"': 1, '<': 1, '>': 1, '`': 1\n});\nvar pathPercentEncodeSet = assign({}, fragmentPercentEncodeSet, {\n '#': 1, '?': 1, '{': 1, '}': 1\n});\nvar userinfoPercentEncodeSet = assign({}, pathPercentEncodeSet, {\n '/': 1, ':': 1, ';': 1, '=': 1, '@': 1, '[': 1, '\\\\': 1, ']': 1, '^': 1, '|': 1\n});\n\nvar percentEncode = function (char, set) {\n var code = codeAt(char, 0);\n return code > 0x20 && code < 0x7F && !has(set, char) ? char : encodeURIComponent(char);\n};\n\nvar specialSchemes = {\n ftp: 21,\n file: null,\n http: 80,\n https: 443,\n ws: 80,\n wss: 443\n};\n\nvar isSpecial = function (url) {\n return has(specialSchemes, url.scheme);\n};\n\nvar includesCredentials = function (url) {\n return url.username != '' || url.password != '';\n};\n\nvar cannotHaveUsernamePasswordPort = function (url) {\n return !url.host || url.cannotBeABaseURL || url.scheme == 'file';\n};\n\nvar isWindowsDriveLetter = function (string, normalized) {\n var second;\n return string.length == 2 && ALPHA.test(string.charAt(0))\n && ((second = string.charAt(1)) == ':' || (!normalized && second == '|'));\n};\n\nvar startsWithWindowsDriveLetter = function (string) {\n var third;\n return string.length > 1 && isWindowsDriveLetter(string.slice(0, 2)) && (\n string.length == 2 ||\n ((third = string.charAt(2)) === '/' || third === '\\\\' || third === '?' || third === '#')\n );\n};\n\nvar shortenURLsPath = function (url) {\n var path = url.path;\n var pathSize = path.length;\n if (pathSize && (url.scheme != 'file' || pathSize != 1 || !isWindowsDriveLetter(path[0], true))) {\n path.pop();\n }\n};\n\nvar isSingleDot = function (segment) {\n return segment === '.' || segment.toLowerCase() === '%2e';\n};\n\nvar isDoubleDot = function (segment) {\n segment = segment.toLowerCase();\n return segment === '..' || segment === '%2e.' || segment === '.%2e' || segment === '%2e%2e';\n};\n\n// States:\nvar SCHEME_START = {};\nvar SCHEME = {};\nvar NO_SCHEME = {};\nvar SPECIAL_RELATIVE_OR_AUTHORITY = {};\nvar PATH_OR_AUTHORITY = {};\nvar RELATIVE = {};\nvar RELATIVE_SLASH = {};\nvar SPECIAL_AUTHORITY_SLASHES = {};\nvar SPECIAL_AUTHORITY_IGNORE_SLASHES = {};\nvar AUTHORITY = {};\nvar HOST = {};\nvar HOSTNAME = {};\nvar PORT = {};\nvar FILE = {};\nvar FILE_SLASH = {};\nvar FILE_HOST = {};\nvar PATH_START = {};\nvar PATH = {};\nvar CANNOT_BE_A_BASE_URL_PATH = {};\nvar QUERY = {};\nvar FRAGMENT = {};\n\n// eslint-disable-next-line max-statements -- TODO\nvar parseURL = function (url, input, stateOverride, base) {\n var state = stateOverride || SCHEME_START;\n var pointer = 0;\n var buffer = '';\n var seenAt = false;\n var seenBracket = false;\n var seenPasswordToken = false;\n var codePoints, char, bufferCodePoints, failure;\n\n if (!stateOverride) {\n url.scheme = '';\n url.username = '';\n url.password = '';\n url.host = null;\n url.port = null;\n url.path = [];\n url.query = null;\n url.fragment = null;\n url.cannotBeABaseURL = false;\n input = input.replace(LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE, '');\n }\n\n input = input.replace(TAB_AND_NEW_LINE, '');\n\n codePoints = arrayFrom(input);\n\n while (pointer <= codePoints.length) {\n char = codePoints[pointer];\n switch (state) {\n case SCHEME_START:\n if (char && ALPHA.test(char)) {\n buffer += char.toLowerCase();\n state = SCHEME;\n } else if (!stateOverride) {\n state = NO_SCHEME;\n continue;\n } else return INVALID_SCHEME;\n break;\n\n case SCHEME:\n if (char && (ALPHANUMERIC.test(char) || char == '+' || char == '-' || char == '.')) {\n buffer += char.toLowerCase();\n } else if (char == ':') {\n if (stateOverride && (\n (isSpecial(url) != has(specialSchemes, buffer)) ||\n (buffer == 'file' && (includesCredentials(url) || url.port !== null)) ||\n (url.scheme == 'file' && !url.host)\n )) return;\n url.scheme = buffer;\n if (stateOverride) {\n if (isSpecial(url) && specialSchemes[url.scheme] == url.port) url.port = null;\n return;\n }\n buffer = '';\n if (url.scheme == 'file') {\n state = FILE;\n } else if (isSpecial(url) && base && base.scheme == url.scheme) {\n state = SPECIAL_RELATIVE_OR_AUTHORITY;\n } else if (isSpecial(url)) {\n state = SPECIAL_AUTHORITY_SLASHES;\n } else if (codePoints[pointer + 1] == '/') {\n state = PATH_OR_AUTHORITY;\n pointer++;\n } else {\n url.cannotBeABaseURL = true;\n url.path.push('');\n state = CANNOT_BE_A_BASE_URL_PATH;\n }\n } else if (!stateOverride) {\n buffer = '';\n state = NO_SCHEME;\n pointer = 0;\n continue;\n } else return INVALID_SCHEME;\n break;\n\n case NO_SCHEME:\n if (!base || (base.cannotBeABaseURL && char != '#')) return INVALID_SCHEME;\n if (base.cannotBeABaseURL && char == '#') {\n url.scheme = base.scheme;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n url.cannotBeABaseURL = true;\n state = FRAGMENT;\n break;\n }\n state = base.scheme == 'file' ? FILE : RELATIVE;\n continue;\n\n case SPECIAL_RELATIVE_OR_AUTHORITY:\n if (char == '/' && codePoints[pointer + 1] == '/') {\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n pointer++;\n } else {\n state = RELATIVE;\n continue;\n } break;\n\n case PATH_OR_AUTHORITY:\n if (char == '/') {\n state = AUTHORITY;\n break;\n } else {\n state = PATH;\n continue;\n }\n\n case RELATIVE:\n url.scheme = base.scheme;\n if (char == EOF) {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = base.query;\n } else if (char == '/' || (char == '\\\\' && isSpecial(url))) {\n state = RELATIVE_SLASH;\n } else if (char == '?') {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n state = FRAGMENT;\n } else {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.path.pop();\n state = PATH;\n continue;\n } break;\n\n case RELATIVE_SLASH:\n if (isSpecial(url) && (char == '/' || char == '\\\\')) {\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n } else if (char == '/') {\n state = AUTHORITY;\n } else {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n state = PATH;\n continue;\n } break;\n\n case SPECIAL_AUTHORITY_SLASHES:\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n if (char != '/' || buffer.charAt(pointer + 1) != '/') continue;\n pointer++;\n break;\n\n case SPECIAL_AUTHORITY_IGNORE_SLASHES:\n if (char != '/' && char != '\\\\') {\n state = AUTHORITY;\n continue;\n } break;\n\n case AUTHORITY:\n if (char == '@') {\n if (seenAt) buffer = '%40' + buffer;\n seenAt = true;\n bufferCodePoints = arrayFrom(buffer);\n for (var i = 0; i < bufferCodePoints.length; i++) {\n var codePoint = bufferCodePoints[i];\n if (codePoint == ':' && !seenPasswordToken) {\n seenPasswordToken = true;\n continue;\n }\n var encodedCodePoints = percentEncode(codePoint, userinfoPercentEncodeSet);\n if (seenPasswordToken) url.password += encodedCodePoints;\n else url.username += encodedCodePoints;\n }\n buffer = '';\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url))\n ) {\n if (seenAt && buffer == '') return INVALID_AUTHORITY;\n pointer -= arrayFrom(buffer).length + 1;\n buffer = '';\n state = HOST;\n } else buffer += char;\n break;\n\n case HOST:\n case HOSTNAME:\n if (stateOverride && url.scheme == 'file') {\n state = FILE_HOST;\n continue;\n } else if (char == ':' && !seenBracket) {\n if (buffer == '') return INVALID_HOST;\n failure = parseHost(url, buffer);\n if (failure) return failure;\n buffer = '';\n state = PORT;\n if (stateOverride == HOSTNAME) return;\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url))\n ) {\n if (isSpecial(url) && buffer == '') return INVALID_HOST;\n if (stateOverride && buffer == '' && (includesCredentials(url) || url.port !== null)) return;\n failure = parseHost(url, buffer);\n if (failure) return failure;\n buffer = '';\n state = PATH_START;\n if (stateOverride) return;\n continue;\n } else {\n if (char == '[') seenBracket = true;\n else if (char == ']') seenBracket = false;\n buffer += char;\n } break;\n\n case PORT:\n if (DIGIT.test(char)) {\n buffer += char;\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url)) ||\n stateOverride\n ) {\n if (buffer != '') {\n var port = parseInt(buffer, 10);\n if (port > 0xFFFF) return INVALID_PORT;\n url.port = (isSpecial(url) && port === specialSchemes[url.scheme]) ? null : port;\n buffer = '';\n }\n if (stateOverride) return;\n state = PATH_START;\n continue;\n } else return INVALID_PORT;\n break;\n\n case FILE:\n url.scheme = 'file';\n if (char == '/' || char == '\\\\') state = FILE_SLASH;\n else if (base && base.scheme == 'file') {\n if (char == EOF) {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = base.query;\n } else if (char == '?') {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n state = FRAGMENT;\n } else {\n if (!startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {\n url.host = base.host;\n url.path = base.path.slice();\n shortenURLsPath(url);\n }\n state = PATH;\n continue;\n }\n } else {\n state = PATH;\n continue;\n } break;\n\n case FILE_SLASH:\n if (char == '/' || char == '\\\\') {\n state = FILE_HOST;\n break;\n }\n if (base && base.scheme == 'file' && !startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {\n if (isWindowsDriveLetter(base.path[0], true)) url.path.push(base.path[0]);\n else url.host = base.host;\n }\n state = PATH;\n continue;\n\n case FILE_HOST:\n if (char == EOF || char == '/' || char == '\\\\' || char == '?' || char == '#') {\n if (!stateOverride && isWindowsDriveLetter(buffer)) {\n state = PATH;\n } else if (buffer == '') {\n url.host = '';\n if (stateOverride) return;\n state = PATH_START;\n } else {\n failure = parseHost(url, buffer);\n if (failure) return failure;\n if (url.host == 'localhost') url.host = '';\n if (stateOverride) return;\n buffer = '';\n state = PATH_START;\n } continue;\n } else buffer += char;\n break;\n\n case PATH_START:\n if (isSpecial(url)) {\n state = PATH;\n if (char != '/' && char != '\\\\') continue;\n } else if (!stateOverride && char == '?') {\n url.query = '';\n state = QUERY;\n } else if (!stateOverride && char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n state = PATH;\n if (char != '/') continue;\n } break;\n\n case PATH:\n if (\n char == EOF || char == '/' ||\n (char == '\\\\' && isSpecial(url)) ||\n (!stateOverride && (char == '?' || char == '#'))\n ) {\n if (isDoubleDot(buffer)) {\n shortenURLsPath(url);\n if (char != '/' && !(char == '\\\\' && isSpecial(url))) {\n url.path.push('');\n }\n } else if (isSingleDot(buffer)) {\n if (char != '/' && !(char == '\\\\' && isSpecial(url))) {\n url.path.push('');\n }\n } else {\n if (url.scheme == 'file' && !url.path.length && isWindowsDriveLetter(buffer)) {\n if (url.host) url.host = '';\n buffer = buffer.charAt(0) + ':'; // normalize windows drive letter\n }\n url.path.push(buffer);\n }\n buffer = '';\n if (url.scheme == 'file' && (char == EOF || char == '?' || char == '#')) {\n while (url.path.length > 1 && url.path[0] === '') {\n url.path.shift();\n }\n }\n if (char == '?') {\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n }\n } else {\n buffer += percentEncode(char, pathPercentEncodeSet);\n } break;\n\n case CANNOT_BE_A_BASE_URL_PATH:\n if (char == '?') {\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n url.path[0] += percentEncode(char, C0ControlPercentEncodeSet);\n } break;\n\n case QUERY:\n if (!stateOverride && char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n if (char == \"'\" && isSpecial(url)) url.query += '%27';\n else if (char == '#') url.query += '%23';\n else url.query += percentEncode(char, C0ControlPercentEncodeSet);\n } break;\n\n case FRAGMENT:\n if (char != EOF) url.fragment += percentEncode(char, fragmentPercentEncodeSet);\n break;\n }\n\n pointer++;\n }\n};\n\n// `URL` constructor\n// https://url.spec.whatwg.org/#url-class\nvar URLConstructor = function URL(url /* , base */) {\n var that = anInstance(this, URLConstructor, 'URL');\n var base = arguments.length > 1 ? arguments[1] : undefined;\n var urlString = String(url);\n var state = setInternalState(that, { type: 'URL' });\n var baseState, failure;\n if (base !== undefined) {\n if (base instanceof URLConstructor) baseState = getInternalURLState(base);\n else {\n failure = parseURL(baseState = {}, String(base));\n if (failure) throw TypeError(failure);\n }\n }\n failure = parseURL(state, urlString, null, baseState);\n if (failure) throw TypeError(failure);\n var searchParams = state.searchParams = new URLSearchParams();\n var searchParamsState = getInternalSearchParamsState(searchParams);\n searchParamsState.updateSearchParams(state.query);\n searchParamsState.updateURL = function () {\n state.query = String(searchParams) || null;\n };\n if (!DESCRIPTORS) {\n that.href = serializeURL.call(that);\n that.origin = getOrigin.call(that);\n that.protocol = getProtocol.call(that);\n that.username = getUsername.call(that);\n that.password = getPassword.call(that);\n that.host = getHost.call(that);\n that.hostname = getHostname.call(that);\n that.port = getPort.call(that);\n that.pathname = getPathname.call(that);\n that.search = getSearch.call(that);\n that.searchParams = getSearchParams.call(that);\n that.hash = getHash.call(that);\n }\n};\n\nvar URLPrototype = URLConstructor.prototype;\n\nvar serializeURL = function () {\n var url = getInternalURLState(this);\n var scheme = url.scheme;\n var username = url.username;\n var password = url.password;\n var host = url.host;\n var port = url.port;\n var path = url.path;\n var query = url.query;\n var fragment = url.fragment;\n var output = scheme + ':';\n if (host !== null) {\n output += '//';\n if (includesCredentials(url)) {\n output += username + (password ? ':' + password : '') + '@';\n }\n output += serializeHost(host);\n if (port !== null) output += ':' + port;\n } else if (scheme == 'file') output += '//';\n output += url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';\n if (query !== null) output += '?' + query;\n if (fragment !== null) output += '#' + fragment;\n return output;\n};\n\nvar getOrigin = function () {\n var url = getInternalURLState(this);\n var scheme = url.scheme;\n var port = url.port;\n if (scheme == 'blob') try {\n return new URL(scheme.path[0]).origin;\n } catch (error) {\n return 'null';\n }\n if (scheme == 'file' || !isSpecial(url)) return 'null';\n return scheme + '://' + serializeHost(url.host) + (port !== null ? ':' + port : '');\n};\n\nvar getProtocol = function () {\n return getInternalURLState(this).scheme + ':';\n};\n\nvar getUsername = function () {\n return getInternalURLState(this).username;\n};\n\nvar getPassword = function () {\n return getInternalURLState(this).password;\n};\n\nvar getHost = function () {\n var url = getInternalURLState(this);\n var host = url.host;\n var port = url.port;\n return host === null ? ''\n : port === null ? serializeHost(host)\n : serializeHost(host) + ':' + port;\n};\n\nvar getHostname = function () {\n var host = getInternalURLState(this).host;\n return host === null ? '' : serializeHost(host);\n};\n\nvar getPort = function () {\n var port = getInternalURLState(this).port;\n return port === null ? '' : String(port);\n};\n\nvar getPathname = function () {\n var url = getInternalURLState(this);\n var path = url.path;\n return url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';\n};\n\nvar getSearch = function () {\n var query = getInternalURLState(this).query;\n return query ? '?' + query : '';\n};\n\nvar getSearchParams = function () {\n return getInternalURLState(this).searchParams;\n};\n\nvar getHash = function () {\n var fragment = getInternalURLState(this).fragment;\n return fragment ? '#' + fragment : '';\n};\n\nvar accessorDescriptor = function (getter, setter) {\n return { get: getter, set: setter, configurable: true, enumerable: true };\n};\n\nif (DESCRIPTORS) {\n defineProperties(URLPrototype, {\n // `URL.prototype.href` accessors pair\n // https://url.spec.whatwg.org/#dom-url-href\n href: accessorDescriptor(serializeURL, function (href) {\n var url = getInternalURLState(this);\n var urlString = String(href);\n var failure = parseURL(url, urlString);\n if (failure) throw TypeError(failure);\n getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);\n }),\n // `URL.prototype.origin` getter\n // https://url.spec.whatwg.org/#dom-url-origin\n origin: accessorDescriptor(getOrigin),\n // `URL.prototype.protocol` accessors pair\n // https://url.spec.whatwg.org/#dom-url-protocol\n protocol: accessorDescriptor(getProtocol, function (protocol) {\n var url = getInternalURLState(this);\n parseURL(url, String(protocol) + ':', SCHEME_START);\n }),\n // `URL.prototype.username` accessors pair\n // https://url.spec.whatwg.org/#dom-url-username\n username: accessorDescriptor(getUsername, function (username) {\n var url = getInternalURLState(this);\n var codePoints = arrayFrom(String(username));\n if (cannotHaveUsernamePasswordPort(url)) return;\n url.username = '';\n for (var i = 0; i < codePoints.length; i++) {\n url.username += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n }\n }),\n // `URL.prototype.password` accessors pair\n // https://url.spec.whatwg.org/#dom-url-password\n password: accessorDescriptor(getPassword, function (password) {\n var url = getInternalURLState(this);\n var codePoints = arrayFrom(String(password));\n if (cannotHaveUsernamePasswordPort(url)) return;\n url.password = '';\n for (var i = 0; i < codePoints.length; i++) {\n url.password += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n }\n }),\n // `URL.prototype.host` accessors pair\n // https://url.spec.whatwg.org/#dom-url-host\n host: accessorDescriptor(getHost, function (host) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n parseURL(url, String(host), HOST);\n }),\n // `URL.prototype.hostname` accessors pair\n // https://url.spec.whatwg.org/#dom-url-hostname\n hostname: accessorDescriptor(getHostname, function (hostname) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n parseURL(url, String(hostname), HOSTNAME);\n }),\n // `URL.prototype.port` accessors pair\n // https://url.spec.whatwg.org/#dom-url-port\n port: accessorDescriptor(getPort, function (port) {\n var url = getInternalURLState(this);\n if (cannotHaveUsernamePasswordPort(url)) return;\n port = String(port);\n if (port == '') url.port = null;\n else parseURL(url, port, PORT);\n }),\n // `URL.prototype.pathname` accessors pair\n // https://url.spec.whatwg.org/#dom-url-pathname\n pathname: accessorDescriptor(getPathname, function (pathname) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n url.path = [];\n parseURL(url, pathname + '', PATH_START);\n }),\n // `URL.prototype.search` accessors pair\n // https://url.spec.whatwg.org/#dom-url-search\n search: accessorDescriptor(getSearch, function (search) {\n var url = getInternalURLState(this);\n search = String(search);\n if (search == '') {\n url.query = null;\n } else {\n if ('?' == search.charAt(0)) search = search.slice(1);\n url.query = '';\n parseURL(url, search, QUERY);\n }\n getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);\n }),\n // `URL.prototype.searchParams` getter\n // https://url.spec.whatwg.org/#dom-url-searchparams\n searchParams: accessorDescriptor(getSearchParams),\n // `URL.prototype.hash` accessors pair\n // https://url.spec.whatwg.org/#dom-url-hash\n hash: accessorDescriptor(getHash, function (hash) {\n var url = getInternalURLState(this);\n hash = String(hash);\n if (hash == '') {\n url.fragment = null;\n return;\n }\n if ('#' == hash.charAt(0)) hash = hash.slice(1);\n url.fragment = '';\n parseURL(url, hash, FRAGMENT);\n })\n });\n}\n\n// `URL.prototype.toJSON` method\n// https://url.spec.whatwg.org/#dom-url-tojson\nredefine(URLPrototype, 'toJSON', function toJSON() {\n return serializeURL.call(this);\n}, { enumerable: true });\n\n// `URL.prototype.toString` method\n// https://url.spec.whatwg.org/#URL-stringification-behavior\nredefine(URLPrototype, 'toString', function toString() {\n return serializeURL.call(this);\n}, { enumerable: true });\n\nif (NativeURL) {\n var nativeCreateObjectURL = NativeURL.createObjectURL;\n var nativeRevokeObjectURL = NativeURL.revokeObjectURL;\n // `URL.createObjectURL` method\n // https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL\n // eslint-disable-next-line no-unused-vars -- required for `.length`\n if (nativeCreateObjectURL) redefine(URLConstructor, 'createObjectURL', function createObjectURL(blob) {\n return nativeCreateObjectURL.apply(NativeURL, arguments);\n });\n // `URL.revokeObjectURL` method\n // https://developer.mozilla.org/en-US/docs/Web/API/URL/revokeObjectURL\n // eslint-disable-next-line no-unused-vars -- required for `.length`\n if (nativeRevokeObjectURL) redefine(URLConstructor, 'revokeObjectURL', function revokeObjectURL(url) {\n return nativeRevokeObjectURL.apply(NativeURL, arguments);\n });\n}\n\nsetToStringTag(URLConstructor, 'URL');\n\n$({ global: true, forced: !USE_NATIVE_URL, sham: !DESCRIPTORS }, {\n URL: URLConstructor\n});\n\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __nested_webpack_require_210484__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(__webpack_module_cache__[moduleId]) {\n/******/ \t\t\treturn __webpack_module_cache__[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __nested_webpack_require_210484__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t!function() {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__nested_webpack_require_210484__.d = function(exports, definition) {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__nested_webpack_require_210484__.o(definition, key) && !__nested_webpack_require_210484__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/global */\n/******/ \t!function() {\n/******/ \t\t__nested_webpack_require_210484__.g = (function() {\n/******/ \t\t\tif (typeof globalThis === 'object') return globalThis;\n/******/ \t\t\ttry {\n/******/ \t\t\t\treturn this || new Function('return this')();\n/******/ \t\t\t} catch (e) {\n/******/ \t\t\t\tif (typeof window === 'object') return window;\n/******/ \t\t\t}\n/******/ \t\t})();\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t!function() {\n/******/ \t\t__nested_webpack_require_210484__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/make namespace object */\n/******/ \t!function() {\n/******/ \t\t// define __esModule on exports\n/******/ \t\t__nested_webpack_require_210484__.r = function(exports) {\n/******/ \t\t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t\t}\n/******/ \t\t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/************************************************************************/\nvar __webpack_exports__ = {};\n// This entry need to be wrapped in an IIFE because it need to be in strict mode.\n!function() {\n\"use strict\";\n// ESM COMPAT FLAG\n__nested_webpack_require_210484__.r(__webpack_exports__);\n\n// EXPORTS\n__nested_webpack_require_210484__.d(__webpack_exports__, {\n \"Dropzone\": function() { return /* reexport */ Dropzone; },\n \"default\": function() { return /* binding */ dropzone_dist; }\n});\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.concat.js\nvar es_array_concat = __nested_webpack_require_210484__(2222);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.filter.js\nvar es_array_filter = __nested_webpack_require_210484__(7327);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.index-of.js\nvar es_array_index_of = __nested_webpack_require_210484__(2772);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.iterator.js\nvar es_array_iterator = __nested_webpack_require_210484__(6992);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.map.js\nvar es_array_map = __nested_webpack_require_210484__(1249);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.slice.js\nvar es_array_slice = __nested_webpack_require_210484__(7042);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.splice.js\nvar es_array_splice = __nested_webpack_require_210484__(561);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array-buffer.constructor.js\nvar es_array_buffer_constructor = __nested_webpack_require_210484__(8264);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.function.name.js\nvar es_function_name = __nested_webpack_require_210484__(8309);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.object.get-prototype-of.js\nvar es_object_get_prototype_of = __nested_webpack_require_210484__(489);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.object.to-string.js\nvar es_object_to_string = __nested_webpack_require_210484__(1539);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.regexp.exec.js\nvar es_regexp_exec = __nested_webpack_require_210484__(4916);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.regexp.to-string.js\nvar es_regexp_to_string = __nested_webpack_require_210484__(9714);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.string.iterator.js\nvar es_string_iterator = __nested_webpack_require_210484__(8783);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.string.match.js\nvar es_string_match = __nested_webpack_require_210484__(4723);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.string.replace.js\nvar es_string_replace = __nested_webpack_require_210484__(5306);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.string.split.js\nvar es_string_split = __nested_webpack_require_210484__(3123);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.string.trim.js\nvar es_string_trim = __nested_webpack_require_210484__(3210);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.uint8-array.js\nvar es_typed_array_uint8_array = __nested_webpack_require_210484__(2472);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.copy-within.js\nvar es_typed_array_copy_within = __nested_webpack_require_210484__(2990);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.every.js\nvar es_typed_array_every = __nested_webpack_require_210484__(8927);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.fill.js\nvar es_typed_array_fill = __nested_webpack_require_210484__(3105);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.filter.js\nvar es_typed_array_filter = __nested_webpack_require_210484__(5035);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.find.js\nvar es_typed_array_find = __nested_webpack_require_210484__(4345);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.find-index.js\nvar es_typed_array_find_index = __nested_webpack_require_210484__(7174);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.for-each.js\nvar es_typed_array_for_each = __nested_webpack_require_210484__(2846);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.includes.js\nvar es_typed_array_includes = __nested_webpack_require_210484__(4731);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.index-of.js\nvar es_typed_array_index_of = __nested_webpack_require_210484__(7209);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.iterator.js\nvar es_typed_array_iterator = __nested_webpack_require_210484__(6319);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.join.js\nvar es_typed_array_join = __nested_webpack_require_210484__(8867);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.last-index-of.js\nvar es_typed_array_last_index_of = __nested_webpack_require_210484__(7789);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.map.js\nvar es_typed_array_map = __nested_webpack_require_210484__(3739);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.reduce.js\nvar es_typed_array_reduce = __nested_webpack_require_210484__(9368);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.reduce-right.js\nvar es_typed_array_reduce_right = __nested_webpack_require_210484__(4483);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.reverse.js\nvar es_typed_array_reverse = __nested_webpack_require_210484__(2056);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.set.js\nvar es_typed_array_set = __nested_webpack_require_210484__(3462);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.slice.js\nvar es_typed_array_slice = __nested_webpack_require_210484__(678);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.some.js\nvar es_typed_array_some = __nested_webpack_require_210484__(7462);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.sort.js\nvar es_typed_array_sort = __nested_webpack_require_210484__(3824);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.subarray.js\nvar es_typed_array_subarray = __nested_webpack_require_210484__(5021);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.to-locale-string.js\nvar es_typed_array_to_locale_string = __nested_webpack_require_210484__(2974);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.to-string.js\nvar es_typed_array_to_string = __nested_webpack_require_210484__(5016);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/web.dom-collections.for-each.js\nvar web_dom_collections_for_each = __nested_webpack_require_210484__(4747);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/web.dom-collections.iterator.js\nvar web_dom_collections_iterator = __nested_webpack_require_210484__(3948);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/web.url.js\nvar web_url = __nested_webpack_require_210484__(285);\n;// CONCATENATED MODULE: ./src/emitter.js\n\n\nfunction _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n// The Emitter class provides the ability to call `.on()` on Dropzone to listen\n// to events.\n// It is strongly based on component's emitter class, and I removed the\n// functionality because of the dependency hell with different frameworks.\nvar Emitter = /*#__PURE__*/function () {\n function Emitter() {\n _classCallCheck(this, Emitter);\n }\n\n _createClass(Emitter, [{\n key: \"on\",\n value: // Add an event listener for given event\n function on(event, fn) {\n this._callbacks = this._callbacks || {}; // Create namespace for this event\n\n if (!this._callbacks[event]) {\n this._callbacks[event] = [];\n }\n\n this._callbacks[event].push(fn);\n\n return this;\n }\n }, {\n key: \"emit\",\n value: function emit(event) {\n this._callbacks = this._callbacks || {};\n var callbacks = this._callbacks[event];\n\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n if (callbacks) {\n var _iterator = _createForOfIteratorHelper(callbacks, true),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var callback = _step.value;\n callback.apply(this, args);\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n } // trigger a corresponding DOM event\n\n\n if (this.element) {\n this.element.dispatchEvent(this.makeEvent(\"dropzone:\" + event, {\n args: args\n }));\n }\n\n return this;\n }\n }, {\n key: \"makeEvent\",\n value: function makeEvent(eventName, detail) {\n var params = {\n bubbles: true,\n cancelable: true,\n detail: detail\n };\n\n if (typeof window.CustomEvent === \"function\") {\n return new CustomEvent(eventName, params);\n } else {\n // IE 11 support\n // https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent\n var evt = document.createEvent(\"CustomEvent\");\n evt.initCustomEvent(eventName, params.bubbles, params.cancelable, params.detail);\n return evt;\n }\n } // Remove event listener for given event. If fn is not provided, all event\n // listeners for that event will be removed. If neither is provided, all\n // event listeners will be removed.\n\n }, {\n key: \"off\",\n value: function off(event, fn) {\n if (!this._callbacks || arguments.length === 0) {\n this._callbacks = {};\n return this;\n } // specific event\n\n\n var callbacks = this._callbacks[event];\n\n if (!callbacks) {\n return this;\n } // remove all handlers\n\n\n if (arguments.length === 1) {\n delete this._callbacks[event];\n return this;\n } // remove specific handler\n\n\n for (var i = 0; i < callbacks.length; i++) {\n var callback = callbacks[i];\n\n if (callback === fn) {\n callbacks.splice(i, 1);\n break;\n }\n }\n\n return this;\n }\n }]);\n\n return Emitter;\n}();\n\n\n;// CONCATENATED MODULE: ./src/preview-template.html\n// Module\nvar code = \"
                  Check
                  Error
                  \";\n// Exports\n/* harmony default export */ var preview_template = (code);\n;// CONCATENATED MODULE: ./src/options.js\n\n\n\n\n\nfunction options_createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = options_unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }\n\nfunction options_unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return options_arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return options_arrayLikeToArray(o, minLen); }\n\nfunction options_arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\n\n\nvar defaultOptions = {\n /**\n * Has to be specified on elements other than form (or when the form\n * doesn't have an `action` attribute). You can also\n * provide a function that will be called with `files` and\n * must return the url (since `v3.12.0`)\n */\n url: null,\n\n /**\n * Can be changed to `\"put\"` if necessary. You can also provide a function\n * that will be called with `files` and must return the method (since `v3.12.0`).\n */\n method: \"post\",\n\n /**\n * Will be set on the XHRequest.\n */\n withCredentials: false,\n\n /**\n * The timeout for the XHR requests in milliseconds (since `v4.4.0`).\n * If set to null or 0, no timeout is going to be set.\n */\n timeout: null,\n\n /**\n * How many file uploads to process in parallel (See the\n * Enqueuing file uploads documentation section for more info)\n */\n parallelUploads: 2,\n\n /**\n * Whether to send multiple files in one request. If\n * this it set to true, then the fallback file input element will\n * have the `multiple` attribute as well. This option will\n * also trigger additional events (like `processingmultiple`). See the events\n * documentation section for more information.\n */\n uploadMultiple: false,\n\n /**\n * Whether you want files to be uploaded in chunks to your server. This can't be\n * used in combination with `uploadMultiple`.\n *\n * See [chunksUploaded](#config-chunksUploaded) for the callback to finalise an upload.\n */\n chunking: false,\n\n /**\n * If `chunking` is enabled, this defines whether **every** file should be chunked,\n * even if the file size is below chunkSize. This means, that the additional chunk\n * form data will be submitted and the `chunksUploaded` callback will be invoked.\n */\n forceChunking: false,\n\n /**\n * If `chunking` is `true`, then this defines the chunk size in bytes.\n */\n chunkSize: 2000000,\n\n /**\n * If `true`, the individual chunks of a file are being uploaded simultaneously.\n */\n parallelChunkUploads: false,\n\n /**\n * Whether a chunk should be retried if it fails.\n */\n retryChunks: false,\n\n /**\n * If `retryChunks` is true, how many times should it be retried.\n */\n retryChunksLimit: 3,\n\n /**\n * The maximum filesize (in bytes) that is allowed to be uploaded.\n */\n maxFilesize: 256,\n\n /**\n * The name of the file param that gets transferred.\n * **NOTE**: If you have the option `uploadMultiple` set to `true`, then\n * Dropzone will append `[]` to the name.\n */\n paramName: \"file\",\n\n /**\n * Whether thumbnails for images should be generated\n */\n createImageThumbnails: true,\n\n /**\n * In MB. When the filename exceeds this limit, the thumbnail will not be generated.\n */\n maxThumbnailFilesize: 10,\n\n /**\n * If `null`, the ratio of the image will be used to calculate it.\n */\n thumbnailWidth: 120,\n\n /**\n * The same as `thumbnailWidth`. If both are null, images will not be resized.\n */\n thumbnailHeight: 120,\n\n /**\n * How the images should be scaled down in case both, `thumbnailWidth` and `thumbnailHeight` are provided.\n * Can be either `contain` or `crop`.\n */\n thumbnailMethod: \"crop\",\n\n /**\n * If set, images will be resized to these dimensions before being **uploaded**.\n * If only one, `resizeWidth` **or** `resizeHeight` is provided, the original aspect\n * ratio of the file will be preserved.\n *\n * The `options.transformFile` function uses these options, so if the `transformFile` function\n * is overridden, these options don't do anything.\n */\n resizeWidth: null,\n\n /**\n * See `resizeWidth`.\n */\n resizeHeight: null,\n\n /**\n * The mime type of the resized image (before it gets uploaded to the server).\n * If `null` the original mime type will be used. To force jpeg, for example, use `image/jpeg`.\n * See `resizeWidth` for more information.\n */\n resizeMimeType: null,\n\n /**\n * The quality of the resized images. See `resizeWidth`.\n */\n resizeQuality: 0.8,\n\n /**\n * How the images should be scaled down in case both, `resizeWidth` and `resizeHeight` are provided.\n * Can be either `contain` or `crop`.\n */\n resizeMethod: \"contain\",\n\n /**\n * The base that is used to calculate the **displayed** filesize. You can\n * change this to 1024 if you would rather display kibibytes, mebibytes,\n * etc... 1024 is technically incorrect, because `1024 bytes` are `1 kibibyte`\n * not `1 kilobyte`. You can change this to `1024` if you don't care about\n * validity.\n */\n filesizeBase: 1000,\n\n /**\n * If not `null` defines how many files this Dropzone handles. If it exceeds,\n * the event `maxfilesexceeded` will be called. The dropzone element gets the\n * class `dz-max-files-reached` accordingly so you can provide visual\n * feedback.\n */\n maxFiles: null,\n\n /**\n * An optional object to send additional headers to the server. Eg:\n * `{ \"My-Awesome-Header\": \"header value\" }`\n */\n headers: null,\n\n /**\n * If `true`, the dropzone element itself will be clickable, if `false`\n * nothing will be clickable.\n *\n * You can also pass an HTML element, a CSS selector (for multiple elements)\n * or an array of those. In that case, all of those elements will trigger an\n * upload when clicked.\n */\n clickable: true,\n\n /**\n * Whether hidden files in directories should be ignored.\n */\n ignoreHiddenFiles: true,\n\n /**\n * The default implementation of `accept` checks the file's mime type or\n * extension against this list. This is a comma separated list of mime\n * types or file extensions.\n *\n * Eg.: `image/*,application/pdf,.psd`\n *\n * If the Dropzone is `clickable` this option will also be used as\n * [`accept`](https://developer.mozilla.org/en-US/docs/HTML/Element/input#attr-accept)\n * parameter on the hidden file input as well.\n */\n acceptedFiles: null,\n\n /**\n * **Deprecated!**\n * Use acceptedFiles instead.\n */\n acceptedMimeTypes: null,\n\n /**\n * If false, files will be added to the queue but the queue will not be\n * processed automatically.\n * This can be useful if you need some additional user input before sending\n * files (or if you want want all files sent at once).\n * If you're ready to send the file simply call `myDropzone.processQueue()`.\n *\n * See the [enqueuing file uploads](#enqueuing-file-uploads) documentation\n * section for more information.\n */\n autoProcessQueue: true,\n\n /**\n * If false, files added to the dropzone will not be queued by default.\n * You'll have to call `enqueueFile(file)` manually.\n */\n autoQueue: true,\n\n /**\n * If `true`, this will add a link to every file preview to remove or cancel (if\n * already uploading) the file. The `dictCancelUpload`, `dictCancelUploadConfirmation`\n * and `dictRemoveFile` options are used for the wording.\n */\n addRemoveLinks: false,\n\n /**\n * Defines where to display the file previews – if `null` the\n * Dropzone element itself is used. Can be a plain `HTMLElement` or a CSS\n * selector. The element should have the `dropzone-previews` class so\n * the previews are displayed properly.\n */\n previewsContainer: null,\n\n /**\n * Set this to `true` if you don't want previews to be shown.\n */\n disablePreviews: false,\n\n /**\n * This is the element the hidden input field (which is used when clicking on the\n * dropzone to trigger file selection) will be appended to. This might\n * be important in case you use frameworks to switch the content of your page.\n *\n * Can be a selector string, or an element directly.\n */\n hiddenInputContainer: \"body\",\n\n /**\n * If null, no capture type will be specified\n * If camera, mobile devices will skip the file selection and choose camera\n * If microphone, mobile devices will skip the file selection and choose the microphone\n * If camcorder, mobile devices will skip the file selection and choose the camera in video mode\n * On apple devices multiple must be set to false. AcceptedFiles may need to\n * be set to an appropriate mime type (e.g. \"image/*\", \"audio/*\", or \"video/*\").\n */\n capture: null,\n\n /**\n * **Deprecated**. Use `renameFile` instead.\n */\n renameFilename: null,\n\n /**\n * A function that is invoked before the file is uploaded to the server and renames the file.\n * This function gets the `File` as argument and can use the `file.name`. The actual name of the\n * file that gets used during the upload can be accessed through `file.upload.filename`.\n */\n renameFile: null,\n\n /**\n * If `true` the fallback will be forced. This is very useful to test your server\n * implementations first and make sure that everything works as\n * expected without dropzone if you experience problems, and to test\n * how your fallbacks will look.\n */\n forceFallback: false,\n\n /**\n * The text used before any files are dropped.\n */\n dictDefaultMessage: \"Drop files here to upload\",\n\n /**\n * The text that replaces the default message text it the browser is not supported.\n */\n dictFallbackMessage: \"Your browser does not support drag'n'drop file uploads.\",\n\n /**\n * The text that will be added before the fallback form.\n * If you provide a fallback element yourself, or if this option is `null` this will\n * be ignored.\n */\n dictFallbackText: \"Please use the fallback form below to upload your files like in the olden days.\",\n\n /**\n * If the filesize is too big.\n * `{{filesize}}` and `{{maxFilesize}}` will be replaced with the respective configuration values.\n */\n dictFileTooBig: \"File is too big ({{filesize}}MiB). Max filesize: {{maxFilesize}}MiB.\",\n\n /**\n * If the file doesn't match the file type.\n */\n dictInvalidFileType: \"You can't upload files of this type.\",\n\n /**\n * If the server response was invalid.\n * `{{statusCode}}` will be replaced with the servers status code.\n */\n dictResponseError: \"Server responded with {{statusCode}} code.\",\n\n /**\n * If `addRemoveLinks` is true, the text to be used for the cancel upload link.\n */\n dictCancelUpload: \"Cancel upload\",\n\n /**\n * The text that is displayed if an upload was manually canceled\n */\n dictUploadCanceled: \"Upload canceled.\",\n\n /**\n * If `addRemoveLinks` is true, the text to be used for confirmation when cancelling upload.\n */\n dictCancelUploadConfirmation: \"Are you sure you want to cancel this upload?\",\n\n /**\n * If `addRemoveLinks` is true, the text to be used to remove a file.\n */\n dictRemoveFile: \"Remove file\",\n\n /**\n * If this is not null, then the user will be prompted before removing a file.\n */\n dictRemoveFileConfirmation: null,\n\n /**\n * Displayed if `maxFiles` is st and exceeded.\n * The string `{{maxFiles}}` will be replaced by the configuration value.\n */\n dictMaxFilesExceeded: \"You can not upload any more files.\",\n\n /**\n * Allows you to translate the different units. Starting with `tb` for terabytes and going down to\n * `b` for bytes.\n */\n dictFileSizeUnits: {\n tb: \"TB\",\n gb: \"GB\",\n mb: \"MB\",\n kb: \"KB\",\n b: \"b\"\n },\n\n /**\n * Called when dropzone initialized\n * You can add event listeners here\n */\n init: function init() {},\n\n /**\n * Can be an **object** of additional parameters to transfer to the server, **or** a `Function`\n * that gets invoked with the `files`, `xhr` and, if it's a chunked upload, `chunk` arguments. In case\n * of a function, this needs to return a map.\n *\n * The default implementation does nothing for normal uploads, but adds relevant information for\n * chunked uploads.\n *\n * This is the same as adding hidden input fields in the form element.\n */\n params: function params(files, xhr, chunk) {\n if (chunk) {\n return {\n dzuuid: chunk.file.upload.uuid,\n dzchunkindex: chunk.index,\n dztotalfilesize: chunk.file.size,\n dzchunksize: this.options.chunkSize,\n dztotalchunkcount: chunk.file.upload.totalChunkCount,\n dzchunkbyteoffset: chunk.index * this.options.chunkSize\n };\n }\n },\n\n /**\n * A function that gets a [file](https://developer.mozilla.org/en-US/docs/DOM/File)\n * and a `done` function as parameters.\n *\n * If the done function is invoked without arguments, the file is \"accepted\" and will\n * be processed. If you pass an error message, the file is rejected, and the error\n * message will be displayed.\n * This function will not be called if the file is too big or doesn't match the mime types.\n */\n accept: function accept(file, done) {\n return done();\n },\n\n /**\n * The callback that will be invoked when all chunks have been uploaded for a file.\n * It gets the file for which the chunks have been uploaded as the first parameter,\n * and the `done` function as second. `done()` needs to be invoked when everything\n * needed to finish the upload process is done.\n */\n chunksUploaded: function chunksUploaded(file, done) {\n done();\n },\n\n /**\n * Gets called when the browser is not supported.\n * The default implementation shows the fallback input field and adds\n * a text.\n */\n fallback: function fallback() {\n // This code should pass in IE7... :(\n var messageElement;\n this.element.className = \"\".concat(this.element.className, \" dz-browser-not-supported\");\n\n var _iterator = options_createForOfIteratorHelper(this.element.getElementsByTagName(\"div\"), true),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var child = _step.value;\n\n if (/(^| )dz-message($| )/.test(child.className)) {\n messageElement = child;\n child.className = \"dz-message\"; // Removes the 'dz-default' class\n\n break;\n }\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n\n if (!messageElement) {\n messageElement = Dropzone.createElement('
                  ');\n this.element.appendChild(messageElement);\n }\n\n var span = messageElement.getElementsByTagName(\"span\")[0];\n\n if (span) {\n if (span.textContent != null) {\n span.textContent = this.options.dictFallbackMessage;\n } else if (span.innerText != null) {\n span.innerText = this.options.dictFallbackMessage;\n }\n }\n\n return this.element.appendChild(this.getFallbackForm());\n },\n\n /**\n * Gets called to calculate the thumbnail dimensions.\n *\n * It gets `file`, `width` and `height` (both may be `null`) as parameters and must return an object containing:\n *\n * - `srcWidth` & `srcHeight` (required)\n * - `trgWidth` & `trgHeight` (required)\n * - `srcX` & `srcY` (optional, default `0`)\n * - `trgX` & `trgY` (optional, default `0`)\n *\n * Those values are going to be used by `ctx.drawImage()`.\n */\n resize: function resize(file, width, height, resizeMethod) {\n var info = {\n srcX: 0,\n srcY: 0,\n srcWidth: file.width,\n srcHeight: file.height\n };\n var srcRatio = file.width / file.height; // Automatically calculate dimensions if not specified\n\n if (width == null && height == null) {\n width = info.srcWidth;\n height = info.srcHeight;\n } else if (width == null) {\n width = height * srcRatio;\n } else if (height == null) {\n height = width / srcRatio;\n } // Make sure images aren't upscaled\n\n\n width = Math.min(width, info.srcWidth);\n height = Math.min(height, info.srcHeight);\n var trgRatio = width / height;\n\n if (info.srcWidth > width || info.srcHeight > height) {\n // Image is bigger and needs rescaling\n if (resizeMethod === \"crop\") {\n if (srcRatio > trgRatio) {\n info.srcHeight = file.height;\n info.srcWidth = info.srcHeight * trgRatio;\n } else {\n info.srcWidth = file.width;\n info.srcHeight = info.srcWidth / trgRatio;\n }\n } else if (resizeMethod === \"contain\") {\n // Method 'contain'\n if (srcRatio > trgRatio) {\n height = width / srcRatio;\n } else {\n width = height * srcRatio;\n }\n } else {\n throw new Error(\"Unknown resizeMethod '\".concat(resizeMethod, \"'\"));\n }\n }\n\n info.srcX = (file.width - info.srcWidth) / 2;\n info.srcY = (file.height - info.srcHeight) / 2;\n info.trgWidth = width;\n info.trgHeight = height;\n return info;\n },\n\n /**\n * Can be used to transform the file (for example, resize an image if necessary).\n *\n * The default implementation uses `resizeWidth` and `resizeHeight` (if provided) and resizes\n * images according to those dimensions.\n *\n * Gets the `file` as the first parameter, and a `done()` function as the second, that needs\n * to be invoked with the file when the transformation is done.\n */\n transformFile: function transformFile(file, done) {\n if ((this.options.resizeWidth || this.options.resizeHeight) && file.type.match(/image.*/)) {\n return this.resizeImage(file, this.options.resizeWidth, this.options.resizeHeight, this.options.resizeMethod, done);\n } else {\n return done(file);\n }\n },\n\n /**\n * A string that contains the template used for each dropped\n * file. Change it to fulfill your needs but make sure to properly\n * provide all elements.\n *\n * If you want to use an actual HTML element instead of providing a String\n * as a config option, you could create a div with the id `tpl`,\n * put the template inside it and provide the element like this:\n *\n * document\n * .querySelector('#tpl')\n * .innerHTML\n *\n */\n previewTemplate: preview_template,\n\n /*\n Those functions register themselves to the events on init and handle all\n the user interface specific stuff. Overwriting them won't break the upload\n but can break the way it's displayed.\n You can overwrite them if you don't like the default behavior. If you just\n want to add an additional event handler, register it on the dropzone object\n and don't overwrite those options.\n */\n // Those are self explanatory and simply concern the DragnDrop.\n drop: function drop(e) {\n return this.element.classList.remove(\"dz-drag-hover\");\n },\n dragstart: function dragstart(e) {},\n dragend: function dragend(e) {\n return this.element.classList.remove(\"dz-drag-hover\");\n },\n dragenter: function dragenter(e) {\n return this.element.classList.add(\"dz-drag-hover\");\n },\n dragover: function dragover(e) {\n return this.element.classList.add(\"dz-drag-hover\");\n },\n dragleave: function dragleave(e) {\n return this.element.classList.remove(\"dz-drag-hover\");\n },\n paste: function paste(e) {},\n // Called whenever there are no files left in the dropzone anymore, and the\n // dropzone should be displayed as if in the initial state.\n reset: function reset() {\n return this.element.classList.remove(\"dz-started\");\n },\n // Called when a file is added to the queue\n // Receives `file`\n addedfile: function addedfile(file) {\n var _this = this;\n\n if (this.element === this.previewsContainer) {\n this.element.classList.add(\"dz-started\");\n }\n\n if (this.previewsContainer && !this.options.disablePreviews) {\n file.previewElement = Dropzone.createElement(this.options.previewTemplate.trim());\n file.previewTemplate = file.previewElement; // Backwards compatibility\n\n this.previewsContainer.appendChild(file.previewElement);\n\n var _iterator2 = options_createForOfIteratorHelper(file.previewElement.querySelectorAll(\"[data-dz-name]\"), true),\n _step2;\n\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n var node = _step2.value;\n node.textContent = file.name;\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n\n var _iterator3 = options_createForOfIteratorHelper(file.previewElement.querySelectorAll(\"[data-dz-size]\"), true),\n _step3;\n\n try {\n for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {\n node = _step3.value;\n node.innerHTML = this.filesize(file.size);\n }\n } catch (err) {\n _iterator3.e(err);\n } finally {\n _iterator3.f();\n }\n\n if (this.options.addRemoveLinks) {\n file._removeLink = Dropzone.createElement(\"
                  \".concat(this.options.dictRemoveFile, \"\"));\n file.previewElement.appendChild(file._removeLink);\n }\n\n var removeFileEvent = function removeFileEvent(e) {\n e.preventDefault();\n e.stopPropagation();\n\n if (file.status === Dropzone.UPLOADING) {\n return Dropzone.confirm(_this.options.dictCancelUploadConfirmation, function () {\n return _this.removeFile(file);\n });\n } else {\n if (_this.options.dictRemoveFileConfirmation) {\n return Dropzone.confirm(_this.options.dictRemoveFileConfirmation, function () {\n return _this.removeFile(file);\n });\n } else {\n return _this.removeFile(file);\n }\n }\n };\n\n var _iterator4 = options_createForOfIteratorHelper(file.previewElement.querySelectorAll(\"[data-dz-remove]\"), true),\n _step4;\n\n try {\n for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {\n var removeLink = _step4.value;\n removeLink.addEventListener(\"click\", removeFileEvent);\n }\n } catch (err) {\n _iterator4.e(err);\n } finally {\n _iterator4.f();\n }\n }\n },\n // Called whenever a file is removed.\n removedfile: function removedfile(file) {\n if (file.previewElement != null && file.previewElement.parentNode != null) {\n file.previewElement.parentNode.removeChild(file.previewElement);\n }\n\n return this._updateMaxFilesReachedClass();\n },\n // Called when a thumbnail has been generated\n // Receives `file` and `dataUrl`\n thumbnail: function thumbnail(file, dataUrl) {\n if (file.previewElement) {\n file.previewElement.classList.remove(\"dz-file-preview\");\n\n var _iterator5 = options_createForOfIteratorHelper(file.previewElement.querySelectorAll(\"[data-dz-thumbnail]\"), true),\n _step5;\n\n try {\n for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {\n var thumbnailElement = _step5.value;\n thumbnailElement.alt = file.name;\n thumbnailElement.src = dataUrl;\n }\n } catch (err) {\n _iterator5.e(err);\n } finally {\n _iterator5.f();\n }\n\n return setTimeout(function () {\n return file.previewElement.classList.add(\"dz-image-preview\");\n }, 1);\n }\n },\n // Called whenever an error occurs\n // Receives `file` and `message`\n error: function error(file, message) {\n if (file.previewElement) {\n file.previewElement.classList.add(\"dz-error\");\n\n if (typeof message !== \"string\" && message.error) {\n message = message.error;\n }\n\n var _iterator6 = options_createForOfIteratorHelper(file.previewElement.querySelectorAll(\"[data-dz-errormessage]\"), true),\n _step6;\n\n try {\n for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {\n var node = _step6.value;\n node.textContent = message;\n }\n } catch (err) {\n _iterator6.e(err);\n } finally {\n _iterator6.f();\n }\n }\n },\n errormultiple: function errormultiple() {},\n // Called when a file gets processed. Since there is a cue, not all added\n // files are processed immediately.\n // Receives `file`\n processing: function processing(file) {\n if (file.previewElement) {\n file.previewElement.classList.add(\"dz-processing\");\n\n if (file._removeLink) {\n return file._removeLink.innerHTML = this.options.dictCancelUpload;\n }\n }\n },\n processingmultiple: function processingmultiple() {},\n // Called whenever the upload progress gets updated.\n // Receives `file`, `progress` (percentage 0-100) and `bytesSent`.\n // To get the total number of bytes of the file, use `file.size`\n uploadprogress: function uploadprogress(file, progress, bytesSent) {\n if (file.previewElement) {\n var _iterator7 = options_createForOfIteratorHelper(file.previewElement.querySelectorAll(\"[data-dz-uploadprogress]\"), true),\n _step7;\n\n try {\n for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {\n var node = _step7.value;\n node.nodeName === \"PROGRESS\" ? node.value = progress : node.style.width = \"\".concat(progress, \"%\");\n }\n } catch (err) {\n _iterator7.e(err);\n } finally {\n _iterator7.f();\n }\n }\n },\n // Called whenever the total upload progress gets updated.\n // Called with totalUploadProgress (0-100), totalBytes and totalBytesSent\n totaluploadprogress: function totaluploadprogress() {},\n // Called just before the file is sent. Gets the `xhr` object as second\n // parameter, so you can modify it (for example to add a CSRF token) and a\n // `formData` object to add additional information.\n sending: function sending() {},\n sendingmultiple: function sendingmultiple() {},\n // When the complete upload is finished and successful\n // Receives `file`\n success: function success(file) {\n if (file.previewElement) {\n return file.previewElement.classList.add(\"dz-success\");\n }\n },\n successmultiple: function successmultiple() {},\n // When the upload is canceled.\n canceled: function canceled(file) {\n return this.emit(\"error\", file, this.options.dictUploadCanceled);\n },\n canceledmultiple: function canceledmultiple() {},\n // When the upload is finished, either with success or an error.\n // Receives `file`\n complete: function complete(file) {\n if (file._removeLink) {\n file._removeLink.innerHTML = this.options.dictRemoveFile;\n }\n\n if (file.previewElement) {\n return file.previewElement.classList.add(\"dz-complete\");\n }\n },\n completemultiple: function completemultiple() {},\n maxfilesexceeded: function maxfilesexceeded() {},\n maxfilesreached: function maxfilesreached() {},\n queuecomplete: function queuecomplete() {},\n addedfiles: function addedfiles() {}\n};\n/* harmony default export */ var src_options = (defaultOptions);\n;// CONCATENATED MODULE: ./src/dropzone.js\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction dropzone_createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = dropzone_unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }\n\nfunction dropzone_unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return dropzone_arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return dropzone_arrayLikeToArray(o, minLen); }\n\nfunction dropzone_arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction dropzone_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction dropzone_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction dropzone_createClass(Constructor, protoProps, staticProps) { if (protoProps) dropzone_defineProperties(Constructor.prototype, protoProps); if (staticProps) dropzone_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\nvar Dropzone = /*#__PURE__*/function (_Emitter) {\n _inherits(Dropzone, _Emitter);\n\n var _super = _createSuper(Dropzone);\n\n function Dropzone(el, options) {\n var _this;\n\n dropzone_classCallCheck(this, Dropzone);\n\n _this = _super.call(this);\n var fallback, left;\n _this.element = el; // For backwards compatibility since the version was in the prototype previously\n\n _this.version = Dropzone.version;\n _this.clickableElements = [];\n _this.listeners = [];\n _this.files = []; // All files\n\n if (typeof _this.element === \"string\") {\n _this.element = document.querySelector(_this.element);\n } // Not checking if instance of HTMLElement or Element since IE9 is extremely weird.\n\n\n if (!_this.element || _this.element.nodeType == null) {\n throw new Error(\"Invalid dropzone element.\");\n }\n\n if (_this.element.dropzone) {\n throw new Error(\"Dropzone already attached.\");\n } // Now add this dropzone to the instances.\n\n\n Dropzone.instances.push(_assertThisInitialized(_this)); // Put the dropzone inside the element itself.\n\n _this.element.dropzone = _assertThisInitialized(_this);\n var elementOptions = (left = Dropzone.optionsForElement(_this.element)) != null ? left : {};\n _this.options = Dropzone.extend({}, src_options, elementOptions, options != null ? options : {});\n _this.options.previewTemplate = _this.options.previewTemplate.replace(/\\n*/g, \"\"); // If the browser failed, just call the fallback and leave\n\n if (_this.options.forceFallback || !Dropzone.isBrowserSupported()) {\n return _possibleConstructorReturn(_this, _this.options.fallback.call(_assertThisInitialized(_this)));\n } // @options.url = @element.getAttribute \"action\" unless @options.url?\n\n\n if (_this.options.url == null) {\n _this.options.url = _this.element.getAttribute(\"action\");\n }\n\n if (!_this.options.url) {\n throw new Error(\"No URL provided.\");\n }\n\n if (_this.options.acceptedFiles && _this.options.acceptedMimeTypes) {\n throw new Error(\"You can't provide both 'acceptedFiles' and 'acceptedMimeTypes'. 'acceptedMimeTypes' is deprecated.\");\n }\n\n if (_this.options.uploadMultiple && _this.options.chunking) {\n throw new Error(\"You cannot set both: uploadMultiple and chunking.\");\n } // Backwards compatibility\n\n\n if (_this.options.acceptedMimeTypes) {\n _this.options.acceptedFiles = _this.options.acceptedMimeTypes;\n delete _this.options.acceptedMimeTypes;\n } // Backwards compatibility\n\n\n if (_this.options.renameFilename != null) {\n _this.options.renameFile = function (file) {\n return _this.options.renameFilename.call(_assertThisInitialized(_this), file.name, file);\n };\n }\n\n if (typeof _this.options.method === \"string\") {\n _this.options.method = _this.options.method.toUpperCase();\n }\n\n if ((fallback = _this.getExistingFallback()) && fallback.parentNode) {\n // Remove the fallback\n fallback.parentNode.removeChild(fallback);\n } // Display previews in the previewsContainer element or the Dropzone element unless explicitly set to false\n\n\n if (_this.options.previewsContainer !== false) {\n if (_this.options.previewsContainer) {\n _this.previewsContainer = Dropzone.getElement(_this.options.previewsContainer, \"previewsContainer\");\n } else {\n _this.previewsContainer = _this.element;\n }\n }\n\n if (_this.options.clickable) {\n if (_this.options.clickable === true) {\n _this.clickableElements = [_this.element];\n } else {\n _this.clickableElements = Dropzone.getElements(_this.options.clickable, \"clickable\");\n }\n }\n\n _this.init();\n\n return _this;\n } // Returns all files that have been accepted\n\n\n dropzone_createClass(Dropzone, [{\n key: \"getAcceptedFiles\",\n value: function getAcceptedFiles() {\n return this.files.filter(function (file) {\n return file.accepted;\n }).map(function (file) {\n return file;\n });\n } // Returns all files that have been rejected\n // Not sure when that's going to be useful, but added for completeness.\n\n }, {\n key: \"getRejectedFiles\",\n value: function getRejectedFiles() {\n return this.files.filter(function (file) {\n return !file.accepted;\n }).map(function (file) {\n return file;\n });\n }\n }, {\n key: \"getFilesWithStatus\",\n value: function getFilesWithStatus(status) {\n return this.files.filter(function (file) {\n return file.status === status;\n }).map(function (file) {\n return file;\n });\n } // Returns all files that are in the queue\n\n }, {\n key: \"getQueuedFiles\",\n value: function getQueuedFiles() {\n return this.getFilesWithStatus(Dropzone.QUEUED);\n }\n }, {\n key: \"getUploadingFiles\",\n value: function getUploadingFiles() {\n return this.getFilesWithStatus(Dropzone.UPLOADING);\n }\n }, {\n key: \"getAddedFiles\",\n value: function getAddedFiles() {\n return this.getFilesWithStatus(Dropzone.ADDED);\n } // Files that are either queued or uploading\n\n }, {\n key: \"getActiveFiles\",\n value: function getActiveFiles() {\n return this.files.filter(function (file) {\n return file.status === Dropzone.UPLOADING || file.status === Dropzone.QUEUED;\n }).map(function (file) {\n return file;\n });\n } // The function that gets called when Dropzone is initialized. You\n // can (and should) setup event listeners inside this function.\n\n }, {\n key: \"init\",\n value: function init() {\n var _this2 = this;\n\n // In case it isn't set already\n if (this.element.tagName === \"form\") {\n this.element.setAttribute(\"enctype\", \"multipart/form-data\");\n }\n\n if (this.element.classList.contains(\"dropzone\") && !this.element.querySelector(\".dz-message\")) {\n this.element.appendChild(Dropzone.createElement(\"
                  \")));\n }\n\n if (this.clickableElements.length) {\n var setupHiddenFileInput = function setupHiddenFileInput() {\n if (_this2.hiddenFileInput) {\n _this2.hiddenFileInput.parentNode.removeChild(_this2.hiddenFileInput);\n }\n\n _this2.hiddenFileInput = document.createElement(\"input\");\n\n _this2.hiddenFileInput.setAttribute(\"type\", \"file\");\n\n if (_this2.options.maxFiles === null || _this2.options.maxFiles > 1) {\n _this2.hiddenFileInput.setAttribute(\"multiple\", \"multiple\");\n }\n\n _this2.hiddenFileInput.className = \"dz-hidden-input\";\n\n if (_this2.options.acceptedFiles !== null) {\n _this2.hiddenFileInput.setAttribute(\"accept\", _this2.options.acceptedFiles);\n }\n\n if (_this2.options.capture !== null) {\n _this2.hiddenFileInput.setAttribute(\"capture\", _this2.options.capture);\n } // Making sure that no one can \"tab\" into this field.\n\n\n _this2.hiddenFileInput.setAttribute(\"tabindex\", \"-1\"); // Not setting `display=\"none\"` because some browsers don't accept clicks\n // on elements that aren't displayed.\n\n\n _this2.hiddenFileInput.style.visibility = \"hidden\";\n _this2.hiddenFileInput.style.position = \"absolute\";\n _this2.hiddenFileInput.style.top = \"0\";\n _this2.hiddenFileInput.style.left = \"0\";\n _this2.hiddenFileInput.style.height = \"0\";\n _this2.hiddenFileInput.style.width = \"0\";\n Dropzone.getElement(_this2.options.hiddenInputContainer, \"hiddenInputContainer\").appendChild(_this2.hiddenFileInput);\n\n _this2.hiddenFileInput.addEventListener(\"change\", function () {\n var files = _this2.hiddenFileInput.files;\n\n if (files.length) {\n var _iterator = dropzone_createForOfIteratorHelper(files, true),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var file = _step.value;\n\n _this2.addFile(file);\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n }\n\n _this2.emit(\"addedfiles\", files);\n\n setupHiddenFileInput();\n });\n };\n\n setupHiddenFileInput();\n }\n\n this.URL = window.URL !== null ? window.URL : window.webkitURL; // Setup all event listeners on the Dropzone object itself.\n // They're not in @setupEventListeners() because they shouldn't be removed\n // again when the dropzone gets disabled.\n\n var _iterator2 = dropzone_createForOfIteratorHelper(this.events, true),\n _step2;\n\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n var eventName = _step2.value;\n this.on(eventName, this.options[eventName]);\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n\n this.on(\"uploadprogress\", function () {\n return _this2.updateTotalUploadProgress();\n });\n this.on(\"removedfile\", function () {\n return _this2.updateTotalUploadProgress();\n });\n this.on(\"canceled\", function (file) {\n return _this2.emit(\"complete\", file);\n }); // Emit a `queuecomplete` event if all files finished uploading.\n\n this.on(\"complete\", function (file) {\n if (_this2.getAddedFiles().length === 0 && _this2.getUploadingFiles().length === 0 && _this2.getQueuedFiles().length === 0) {\n // This needs to be deferred so that `queuecomplete` really triggers after `complete`\n return setTimeout(function () {\n return _this2.emit(\"queuecomplete\");\n }, 0);\n }\n });\n\n var containsFiles = function containsFiles(e) {\n if (e.dataTransfer.types) {\n // Because e.dataTransfer.types is an Object in\n // IE, we need to iterate like this instead of\n // using e.dataTransfer.types.some()\n for (var i = 0; i < e.dataTransfer.types.length; i++) {\n if (e.dataTransfer.types[i] === \"Files\") return true;\n }\n }\n\n return false;\n };\n\n var noPropagation = function noPropagation(e) {\n // If there are no files, we don't want to stop\n // propagation so we don't interfere with other\n // drag and drop behaviour.\n if (!containsFiles(e)) return;\n e.stopPropagation();\n\n if (e.preventDefault) {\n return e.preventDefault();\n } else {\n return e.returnValue = false;\n }\n }; // Create the listeners\n\n\n this.listeners = [{\n element: this.element,\n events: {\n dragstart: function dragstart(e) {\n return _this2.emit(\"dragstart\", e);\n },\n dragenter: function dragenter(e) {\n noPropagation(e);\n return _this2.emit(\"dragenter\", e);\n },\n dragover: function dragover(e) {\n // Makes it possible to drag files from chrome's download bar\n // http://stackoverflow.com/questions/19526430/drag-and-drop-file-uploads-from-chrome-downloads-bar\n // Try is required to prevent bug in Internet Explorer 11 (SCRIPT65535 exception)\n var efct;\n\n try {\n efct = e.dataTransfer.effectAllowed;\n } catch (error) {}\n\n e.dataTransfer.dropEffect = \"move\" === efct || \"linkMove\" === efct ? \"move\" : \"copy\";\n noPropagation(e);\n return _this2.emit(\"dragover\", e);\n },\n dragleave: function dragleave(e) {\n return _this2.emit(\"dragleave\", e);\n },\n drop: function drop(e) {\n noPropagation(e);\n return _this2.drop(e);\n },\n dragend: function dragend(e) {\n return _this2.emit(\"dragend\", e);\n }\n } // This is disabled right now, because the browsers don't implement it properly.\n // \"paste\": (e) =>\n // noPropagation e\n // @paste e\n\n }];\n this.clickableElements.forEach(function (clickableElement) {\n return _this2.listeners.push({\n element: clickableElement,\n events: {\n click: function click(evt) {\n // Only the actual dropzone or the message element should trigger file selection\n if (clickableElement !== _this2.element || evt.target === _this2.element || Dropzone.elementInside(evt.target, _this2.element.querySelector(\".dz-message\"))) {\n _this2.hiddenFileInput.click(); // Forward the click\n\n }\n\n return true;\n }\n }\n });\n });\n this.enable();\n return this.options.init.call(this);\n } // Not fully tested yet\n\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.disable();\n this.removeAllFiles(true);\n\n if (this.hiddenFileInput != null ? this.hiddenFileInput.parentNode : undefined) {\n this.hiddenFileInput.parentNode.removeChild(this.hiddenFileInput);\n this.hiddenFileInput = null;\n }\n\n delete this.element.dropzone;\n return Dropzone.instances.splice(Dropzone.instances.indexOf(this), 1);\n }\n }, {\n key: \"updateTotalUploadProgress\",\n value: function updateTotalUploadProgress() {\n var totalUploadProgress;\n var totalBytesSent = 0;\n var totalBytes = 0;\n var activeFiles = this.getActiveFiles();\n\n if (activeFiles.length) {\n var _iterator3 = dropzone_createForOfIteratorHelper(this.getActiveFiles(), true),\n _step3;\n\n try {\n for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {\n var file = _step3.value;\n totalBytesSent += file.upload.bytesSent;\n totalBytes += file.upload.total;\n }\n } catch (err) {\n _iterator3.e(err);\n } finally {\n _iterator3.f();\n }\n\n totalUploadProgress = 100 * totalBytesSent / totalBytes;\n } else {\n totalUploadProgress = 100;\n }\n\n return this.emit(\"totaluploadprogress\", totalUploadProgress, totalBytes, totalBytesSent);\n } // @options.paramName can be a function taking one parameter rather than a string.\n // A parameter name for a file is obtained simply by calling this with an index number.\n\n }, {\n key: \"_getParamName\",\n value: function _getParamName(n) {\n if (typeof this.options.paramName === \"function\") {\n return this.options.paramName(n);\n } else {\n return \"\".concat(this.options.paramName).concat(this.options.uploadMultiple ? \"[\".concat(n, \"]\") : \"\");\n }\n } // If @options.renameFile is a function,\n // the function will be used to rename the file.name before appending it to the formData\n\n }, {\n key: \"_renameFile\",\n value: function _renameFile(file) {\n if (typeof this.options.renameFile !== \"function\") {\n return file.name;\n }\n\n return this.options.renameFile(file);\n } // Returns a form that can be used as fallback if the browser does not support DragnDrop\n //\n // If the dropzone is already a form, only the input field and button are returned. Otherwise a complete form element is provided.\n // This code has to pass in IE7 :(\n\n }, {\n key: \"getFallbackForm\",\n value: function getFallbackForm() {\n var existingFallback, form;\n\n if (existingFallback = this.getExistingFallback()) {\n return existingFallback;\n }\n\n var fieldsString = '
                  ';\n\n if (this.options.dictFallbackText) {\n fieldsString += \"

                  \".concat(this.options.dictFallbackText, \"

                  \");\n }\n\n fieldsString += \"
                  \");\n var fields = Dropzone.createElement(fieldsString);\n\n if (this.element.tagName !== \"FORM\") {\n form = Dropzone.createElement(\"
                  \"));\n form.appendChild(fields);\n } else {\n // Make sure that the enctype and method attributes are set properly\n this.element.setAttribute(\"enctype\", \"multipart/form-data\");\n this.element.setAttribute(\"method\", this.options.method);\n }\n\n return form != null ? form : fields;\n } // Returns the fallback elements if they exist already\n //\n // This code has to pass in IE7 :(\n\n }, {\n key: \"getExistingFallback\",\n value: function getExistingFallback() {\n var getFallback = function getFallback(elements) {\n var _iterator4 = dropzone_createForOfIteratorHelper(elements, true),\n _step4;\n\n try {\n for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {\n var el = _step4.value;\n\n if (/(^| )fallback($| )/.test(el.className)) {\n return el;\n }\n }\n } catch (err) {\n _iterator4.e(err);\n } finally {\n _iterator4.f();\n }\n };\n\n for (var _i = 0, _arr = [\"div\", \"form\"]; _i < _arr.length; _i++) {\n var tagName = _arr[_i];\n var fallback;\n\n if (fallback = getFallback(this.element.getElementsByTagName(tagName))) {\n return fallback;\n }\n }\n } // Activates all listeners stored in @listeners\n\n }, {\n key: \"setupEventListeners\",\n value: function setupEventListeners() {\n return this.listeners.map(function (elementListeners) {\n return function () {\n var result = [];\n\n for (var event in elementListeners.events) {\n var listener = elementListeners.events[event];\n result.push(elementListeners.element.addEventListener(event, listener, false));\n }\n\n return result;\n }();\n });\n } // Deactivates all listeners stored in @listeners\n\n }, {\n key: \"removeEventListeners\",\n value: function removeEventListeners() {\n return this.listeners.map(function (elementListeners) {\n return function () {\n var result = [];\n\n for (var event in elementListeners.events) {\n var listener = elementListeners.events[event];\n result.push(elementListeners.element.removeEventListener(event, listener, false));\n }\n\n return result;\n }();\n });\n } // Removes all event listeners and cancels all files in the queue or being processed.\n\n }, {\n key: \"disable\",\n value: function disable() {\n var _this3 = this;\n\n this.clickableElements.forEach(function (element) {\n return element.classList.remove(\"dz-clickable\");\n });\n this.removeEventListeners();\n this.disabled = true;\n return this.files.map(function (file) {\n return _this3.cancelUpload(file);\n });\n }\n }, {\n key: \"enable\",\n value: function enable() {\n delete this.disabled;\n this.clickableElements.forEach(function (element) {\n return element.classList.add(\"dz-clickable\");\n });\n return this.setupEventListeners();\n } // Returns a nicely formatted filesize\n\n }, {\n key: \"filesize\",\n value: function filesize(size) {\n var selectedSize = 0;\n var selectedUnit = \"b\";\n\n if (size > 0) {\n var units = [\"tb\", \"gb\", \"mb\", \"kb\", \"b\"];\n\n for (var i = 0; i < units.length; i++) {\n var unit = units[i];\n var cutoff = Math.pow(this.options.filesizeBase, 4 - i) / 10;\n\n if (size >= cutoff) {\n selectedSize = size / Math.pow(this.options.filesizeBase, 4 - i);\n selectedUnit = unit;\n break;\n }\n }\n\n selectedSize = Math.round(10 * selectedSize) / 10; // Cutting of digits\n }\n\n return \"\".concat(selectedSize, \" \").concat(this.options.dictFileSizeUnits[selectedUnit]);\n } // Adds or removes the `dz-max-files-reached` class from the form.\n\n }, {\n key: \"_updateMaxFilesReachedClass\",\n value: function _updateMaxFilesReachedClass() {\n if (this.options.maxFiles != null && this.getAcceptedFiles().length >= this.options.maxFiles) {\n if (this.getAcceptedFiles().length === this.options.maxFiles) {\n this.emit(\"maxfilesreached\", this.files);\n }\n\n return this.element.classList.add(\"dz-max-files-reached\");\n } else {\n return this.element.classList.remove(\"dz-max-files-reached\");\n }\n }\n }, {\n key: \"drop\",\n value: function drop(e) {\n if (!e.dataTransfer) {\n return;\n }\n\n this.emit(\"drop\", e); // Convert the FileList to an Array\n // This is necessary for IE11\n\n var files = [];\n\n for (var i = 0; i < e.dataTransfer.files.length; i++) {\n files[i] = e.dataTransfer.files[i];\n } // Even if it's a folder, files.length will contain the folders.\n\n\n if (files.length) {\n var items = e.dataTransfer.items;\n\n if (items && items.length && items[0].webkitGetAsEntry != null) {\n // The browser supports dropping of folders, so handle items instead of files\n this._addFilesFromItems(items);\n } else {\n this.handleFiles(files);\n }\n }\n\n this.emit(\"addedfiles\", files);\n }\n }, {\n key: \"paste\",\n value: function paste(e) {\n if (__guard__(e != null ? e.clipboardData : undefined, function (x) {\n return x.items;\n }) == null) {\n return;\n }\n\n this.emit(\"paste\", e);\n var items = e.clipboardData.items;\n\n if (items.length) {\n return this._addFilesFromItems(items);\n }\n }\n }, {\n key: \"handleFiles\",\n value: function handleFiles(files) {\n var _iterator5 = dropzone_createForOfIteratorHelper(files, true),\n _step5;\n\n try {\n for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {\n var file = _step5.value;\n this.addFile(file);\n }\n } catch (err) {\n _iterator5.e(err);\n } finally {\n _iterator5.f();\n }\n } // When a folder is dropped (or files are pasted), items must be handled\n // instead of files.\n\n }, {\n key: \"_addFilesFromItems\",\n value: function _addFilesFromItems(items) {\n var _this4 = this;\n\n return function () {\n var result = [];\n\n var _iterator6 = dropzone_createForOfIteratorHelper(items, true),\n _step6;\n\n try {\n for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {\n var item = _step6.value;\n var entry;\n\n if (item.webkitGetAsEntry != null && (entry = item.webkitGetAsEntry())) {\n if (entry.isFile) {\n result.push(_this4.addFile(item.getAsFile()));\n } else if (entry.isDirectory) {\n // Append all files from that directory to files\n result.push(_this4._addFilesFromDirectory(entry, entry.name));\n } else {\n result.push(undefined);\n }\n } else if (item.getAsFile != null) {\n if (item.kind == null || item.kind === \"file\") {\n result.push(_this4.addFile(item.getAsFile()));\n } else {\n result.push(undefined);\n }\n } else {\n result.push(undefined);\n }\n }\n } catch (err) {\n _iterator6.e(err);\n } finally {\n _iterator6.f();\n }\n\n return result;\n }();\n } // Goes through the directory, and adds each file it finds recursively\n\n }, {\n key: \"_addFilesFromDirectory\",\n value: function _addFilesFromDirectory(directory, path) {\n var _this5 = this;\n\n var dirReader = directory.createReader();\n\n var errorHandler = function errorHandler(error) {\n return __guardMethod__(console, \"log\", function (o) {\n return o.log(error);\n });\n };\n\n var readEntries = function readEntries() {\n return dirReader.readEntries(function (entries) {\n if (entries.length > 0) {\n var _iterator7 = dropzone_createForOfIteratorHelper(entries, true),\n _step7;\n\n try {\n for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {\n var entry = _step7.value;\n\n if (entry.isFile) {\n entry.file(function (file) {\n if (_this5.options.ignoreHiddenFiles && file.name.substring(0, 1) === \".\") {\n return;\n }\n\n file.fullPath = \"\".concat(path, \"/\").concat(file.name);\n return _this5.addFile(file);\n });\n } else if (entry.isDirectory) {\n _this5._addFilesFromDirectory(entry, \"\".concat(path, \"/\").concat(entry.name));\n }\n } // Recursively call readEntries() again, since browser only handle\n // the first 100 entries.\n // See: https://developer.mozilla.org/en-US/docs/Web/API/DirectoryReader#readEntries\n\n } catch (err) {\n _iterator7.e(err);\n } finally {\n _iterator7.f();\n }\n\n readEntries();\n }\n\n return null;\n }, errorHandler);\n };\n\n return readEntries();\n } // If `done()` is called without argument the file is accepted\n // If you call it with an error message, the file is rejected\n // (This allows for asynchronous validation)\n //\n // This function checks the filesize, and if the file.type passes the\n // `acceptedFiles` check.\n\n }, {\n key: \"accept\",\n value: function accept(file, done) {\n if (this.options.maxFilesize && file.size > this.options.maxFilesize * 1024 * 1024) {\n done(this.options.dictFileTooBig.replace(\"{{filesize}}\", Math.round(file.size / 1024 / 10.24) / 100).replace(\"{{maxFilesize}}\", this.options.maxFilesize));\n } else if (!Dropzone.isValidFile(file, this.options.acceptedFiles)) {\n done(this.options.dictInvalidFileType);\n } else if (this.options.maxFiles != null && this.getAcceptedFiles().length >= this.options.maxFiles) {\n done(this.options.dictMaxFilesExceeded.replace(\"{{maxFiles}}\", this.options.maxFiles));\n this.emit(\"maxfilesexceeded\", file);\n } else {\n this.options.accept.call(this, file, done);\n }\n }\n }, {\n key: \"addFile\",\n value: function addFile(file) {\n var _this6 = this;\n\n file.upload = {\n uuid: Dropzone.uuidv4(),\n progress: 0,\n // Setting the total upload size to file.size for the beginning\n // It's actual different than the size to be transmitted.\n total: file.size,\n bytesSent: 0,\n filename: this._renameFile(file) // Not setting chunking information here, because the acutal data — and\n // thus the chunks — might change if `options.transformFile` is set\n // and does something to the data.\n\n };\n this.files.push(file);\n file.status = Dropzone.ADDED;\n this.emit(\"addedfile\", file);\n\n this._enqueueThumbnail(file);\n\n this.accept(file, function (error) {\n if (error) {\n file.accepted = false;\n\n _this6._errorProcessing([file], error); // Will set the file.status\n\n } else {\n file.accepted = true;\n\n if (_this6.options.autoQueue) {\n _this6.enqueueFile(file);\n } // Will set .accepted = true\n\n }\n\n _this6._updateMaxFilesReachedClass();\n });\n } // Wrapper for enqueueFile\n\n }, {\n key: \"enqueueFiles\",\n value: function enqueueFiles(files) {\n var _iterator8 = dropzone_createForOfIteratorHelper(files, true),\n _step8;\n\n try {\n for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) {\n var file = _step8.value;\n this.enqueueFile(file);\n }\n } catch (err) {\n _iterator8.e(err);\n } finally {\n _iterator8.f();\n }\n\n return null;\n }\n }, {\n key: \"enqueueFile\",\n value: function enqueueFile(file) {\n var _this7 = this;\n\n if (file.status === Dropzone.ADDED && file.accepted === true) {\n file.status = Dropzone.QUEUED;\n\n if (this.options.autoProcessQueue) {\n return setTimeout(function () {\n return _this7.processQueue();\n }, 0); // Deferring the call\n }\n } else {\n throw new Error(\"This file can't be queued because it has already been processed or was rejected.\");\n }\n }\n }, {\n key: \"_enqueueThumbnail\",\n value: function _enqueueThumbnail(file) {\n var _this8 = this;\n\n if (this.options.createImageThumbnails && file.type.match(/image.*/) && file.size <= this.options.maxThumbnailFilesize * 1024 * 1024) {\n this._thumbnailQueue.push(file);\n\n return setTimeout(function () {\n return _this8._processThumbnailQueue();\n }, 0); // Deferring the call\n }\n }\n }, {\n key: \"_processThumbnailQueue\",\n value: function _processThumbnailQueue() {\n var _this9 = this;\n\n if (this._processingThumbnail || this._thumbnailQueue.length === 0) {\n return;\n }\n\n this._processingThumbnail = true;\n\n var file = this._thumbnailQueue.shift();\n\n return this.createThumbnail(file, this.options.thumbnailWidth, this.options.thumbnailHeight, this.options.thumbnailMethod, true, function (dataUrl) {\n _this9.emit(\"thumbnail\", file, dataUrl);\n\n _this9._processingThumbnail = false;\n return _this9._processThumbnailQueue();\n });\n } // Can be called by the user to remove a file\n\n }, {\n key: \"removeFile\",\n value: function removeFile(file) {\n if (file.status === Dropzone.UPLOADING) {\n this.cancelUpload(file);\n }\n\n this.files = without(this.files, file);\n this.emit(\"removedfile\", file);\n\n if (this.files.length === 0) {\n return this.emit(\"reset\");\n }\n } // Removes all files that aren't currently processed from the list\n\n }, {\n key: \"removeAllFiles\",\n value: function removeAllFiles(cancelIfNecessary) {\n // Create a copy of files since removeFile() changes the @files array.\n if (cancelIfNecessary == null) {\n cancelIfNecessary = false;\n }\n\n var _iterator9 = dropzone_createForOfIteratorHelper(this.files.slice(), true),\n _step9;\n\n try {\n for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) {\n var file = _step9.value;\n\n if (file.status !== Dropzone.UPLOADING || cancelIfNecessary) {\n this.removeFile(file);\n }\n }\n } catch (err) {\n _iterator9.e(err);\n } finally {\n _iterator9.f();\n }\n\n return null;\n } // Resizes an image before it gets sent to the server. This function is the default behavior of\n // `options.transformFile` if `resizeWidth` or `resizeHeight` are set. The callback is invoked with\n // the resized blob.\n\n }, {\n key: \"resizeImage\",\n value: function resizeImage(file, width, height, resizeMethod, callback) {\n var _this10 = this;\n\n return this.createThumbnail(file, width, height, resizeMethod, true, function (dataUrl, canvas) {\n if (canvas == null) {\n // The image has not been resized\n return callback(file);\n } else {\n var resizeMimeType = _this10.options.resizeMimeType;\n\n if (resizeMimeType == null) {\n resizeMimeType = file.type;\n }\n\n var resizedDataURL = canvas.toDataURL(resizeMimeType, _this10.options.resizeQuality);\n\n if (resizeMimeType === \"image/jpeg\" || resizeMimeType === \"image/jpg\") {\n // Now add the original EXIF information\n resizedDataURL = ExifRestore.restore(file.dataURL, resizedDataURL);\n }\n\n return callback(Dropzone.dataURItoBlob(resizedDataURL));\n }\n });\n }\n }, {\n key: \"createThumbnail\",\n value: function createThumbnail(file, width, height, resizeMethod, fixOrientation, callback) {\n var _this11 = this;\n\n var fileReader = new FileReader();\n\n fileReader.onload = function () {\n file.dataURL = fileReader.result; // Don't bother creating a thumbnail for SVG images since they're vector\n\n if (file.type === \"image/svg+xml\") {\n if (callback != null) {\n callback(fileReader.result);\n }\n\n return;\n }\n\n _this11.createThumbnailFromUrl(file, width, height, resizeMethod, fixOrientation, callback);\n };\n\n fileReader.readAsDataURL(file);\n } // `mockFile` needs to have these attributes:\n //\n // { name: 'name', size: 12345, imageUrl: '' }\n //\n // `callback` will be invoked when the image has been downloaded and displayed.\n // `crossOrigin` will be added to the `img` tag when accessing the file.\n\n }, {\n key: \"displayExistingFile\",\n value: function displayExistingFile(mockFile, imageUrl, callback, crossOrigin) {\n var _this12 = this;\n\n var resizeThumbnail = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n this.emit(\"addedfile\", mockFile);\n this.emit(\"complete\", mockFile);\n\n if (!resizeThumbnail) {\n this.emit(\"thumbnail\", mockFile, imageUrl);\n if (callback) callback();\n } else {\n var onDone = function onDone(thumbnail) {\n _this12.emit(\"thumbnail\", mockFile, thumbnail);\n\n if (callback) callback();\n };\n\n mockFile.dataURL = imageUrl;\n this.createThumbnailFromUrl(mockFile, this.options.thumbnailWidth, this.options.thumbnailHeight, this.options.resizeMethod, this.options.fixOrientation, onDone, crossOrigin);\n }\n }\n }, {\n key: \"createThumbnailFromUrl\",\n value: function createThumbnailFromUrl(file, width, height, resizeMethod, fixOrientation, callback, crossOrigin) {\n var _this13 = this;\n\n // Not using `new Image` here because of a bug in latest Chrome versions.\n // See https://github.com/enyo/dropzone/pull/226\n var img = document.createElement(\"img\");\n\n if (crossOrigin) {\n img.crossOrigin = crossOrigin;\n } // fixOrientation is not needed anymore with browsers handling imageOrientation\n\n\n fixOrientation = getComputedStyle(document.body)[\"imageOrientation\"] == \"from-image\" ? false : fixOrientation;\n\n img.onload = function () {\n var loadExif = function loadExif(callback) {\n return callback(1);\n };\n\n if (typeof EXIF !== \"undefined\" && EXIF !== null && fixOrientation) {\n loadExif = function loadExif(callback) {\n return EXIF.getData(img, function () {\n return callback(EXIF.getTag(this, \"Orientation\"));\n });\n };\n }\n\n return loadExif(function (orientation) {\n file.width = img.width;\n file.height = img.height;\n\n var resizeInfo = _this13.options.resize.call(_this13, file, width, height, resizeMethod);\n\n var canvas = document.createElement(\"canvas\");\n var ctx = canvas.getContext(\"2d\");\n canvas.width = resizeInfo.trgWidth;\n canvas.height = resizeInfo.trgHeight;\n\n if (orientation > 4) {\n canvas.width = resizeInfo.trgHeight;\n canvas.height = resizeInfo.trgWidth;\n }\n\n switch (orientation) {\n case 2:\n // horizontal flip\n ctx.translate(canvas.width, 0);\n ctx.scale(-1, 1);\n break;\n\n case 3:\n // 180° rotate left\n ctx.translate(canvas.width, canvas.height);\n ctx.rotate(Math.PI);\n break;\n\n case 4:\n // vertical flip\n ctx.translate(0, canvas.height);\n ctx.scale(1, -1);\n break;\n\n case 5:\n // vertical flip + 90 rotate right\n ctx.rotate(0.5 * Math.PI);\n ctx.scale(1, -1);\n break;\n\n case 6:\n // 90° rotate right\n ctx.rotate(0.5 * Math.PI);\n ctx.translate(0, -canvas.width);\n break;\n\n case 7:\n // horizontal flip + 90 rotate right\n ctx.rotate(0.5 * Math.PI);\n ctx.translate(canvas.height, -canvas.width);\n ctx.scale(-1, 1);\n break;\n\n case 8:\n // 90° rotate left\n ctx.rotate(-0.5 * Math.PI);\n ctx.translate(-canvas.height, 0);\n break;\n } // This is a bugfix for iOS' scaling bug.\n\n\n drawImageIOSFix(ctx, img, resizeInfo.srcX != null ? resizeInfo.srcX : 0, resizeInfo.srcY != null ? resizeInfo.srcY : 0, resizeInfo.srcWidth, resizeInfo.srcHeight, resizeInfo.trgX != null ? resizeInfo.trgX : 0, resizeInfo.trgY != null ? resizeInfo.trgY : 0, resizeInfo.trgWidth, resizeInfo.trgHeight);\n var thumbnail = canvas.toDataURL(\"image/png\");\n\n if (callback != null) {\n return callback(thumbnail, canvas);\n }\n });\n };\n\n if (callback != null) {\n img.onerror = callback;\n }\n\n return img.src = file.dataURL;\n } // Goes through the queue and processes files if there aren't too many already.\n\n }, {\n key: \"processQueue\",\n value: function processQueue() {\n var parallelUploads = this.options.parallelUploads;\n var processingLength = this.getUploadingFiles().length;\n var i = processingLength; // There are already at least as many files uploading than should be\n\n if (processingLength >= parallelUploads) {\n return;\n }\n\n var queuedFiles = this.getQueuedFiles();\n\n if (!(queuedFiles.length > 0)) {\n return;\n }\n\n if (this.options.uploadMultiple) {\n // The files should be uploaded in one request\n return this.processFiles(queuedFiles.slice(0, parallelUploads - processingLength));\n } else {\n while (i < parallelUploads) {\n if (!queuedFiles.length) {\n return;\n } // Nothing left to process\n\n\n this.processFile(queuedFiles.shift());\n i++;\n }\n }\n } // Wrapper for `processFiles`\n\n }, {\n key: \"processFile\",\n value: function processFile(file) {\n return this.processFiles([file]);\n } // Loads the file, then calls finishedLoading()\n\n }, {\n key: \"processFiles\",\n value: function processFiles(files) {\n var _iterator10 = dropzone_createForOfIteratorHelper(files, true),\n _step10;\n\n try {\n for (_iterator10.s(); !(_step10 = _iterator10.n()).done;) {\n var file = _step10.value;\n file.processing = true; // Backwards compatibility\n\n file.status = Dropzone.UPLOADING;\n this.emit(\"processing\", file);\n }\n } catch (err) {\n _iterator10.e(err);\n } finally {\n _iterator10.f();\n }\n\n if (this.options.uploadMultiple) {\n this.emit(\"processingmultiple\", files);\n }\n\n return this.uploadFiles(files);\n }\n }, {\n key: \"_getFilesWithXhr\",\n value: function _getFilesWithXhr(xhr) {\n var files;\n return files = this.files.filter(function (file) {\n return file.xhr === xhr;\n }).map(function (file) {\n return file;\n });\n } // Cancels the file upload and sets the status to CANCELED\n // **if** the file is actually being uploaded.\n // If it's still in the queue, the file is being removed from it and the status\n // set to CANCELED.\n\n }, {\n key: \"cancelUpload\",\n value: function cancelUpload(file) {\n if (file.status === Dropzone.UPLOADING) {\n var groupedFiles = this._getFilesWithXhr(file.xhr);\n\n var _iterator11 = dropzone_createForOfIteratorHelper(groupedFiles, true),\n _step11;\n\n try {\n for (_iterator11.s(); !(_step11 = _iterator11.n()).done;) {\n var groupedFile = _step11.value;\n groupedFile.status = Dropzone.CANCELED;\n }\n } catch (err) {\n _iterator11.e(err);\n } finally {\n _iterator11.f();\n }\n\n if (typeof file.xhr !== \"undefined\") {\n file.xhr.abort();\n }\n\n var _iterator12 = dropzone_createForOfIteratorHelper(groupedFiles, true),\n _step12;\n\n try {\n for (_iterator12.s(); !(_step12 = _iterator12.n()).done;) {\n var _groupedFile = _step12.value;\n this.emit(\"canceled\", _groupedFile);\n }\n } catch (err) {\n _iterator12.e(err);\n } finally {\n _iterator12.f();\n }\n\n if (this.options.uploadMultiple) {\n this.emit(\"canceledmultiple\", groupedFiles);\n }\n } else if (file.status === Dropzone.ADDED || file.status === Dropzone.QUEUED) {\n file.status = Dropzone.CANCELED;\n this.emit(\"canceled\", file);\n\n if (this.options.uploadMultiple) {\n this.emit(\"canceledmultiple\", [file]);\n }\n }\n\n if (this.options.autoProcessQueue) {\n return this.processQueue();\n }\n }\n }, {\n key: \"resolveOption\",\n value: function resolveOption(option) {\n if (typeof option === \"function\") {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n return option.apply(this, args);\n }\n\n return option;\n }\n }, {\n key: \"uploadFile\",\n value: function uploadFile(file) {\n return this.uploadFiles([file]);\n }\n }, {\n key: \"uploadFiles\",\n value: function uploadFiles(files) {\n var _this14 = this;\n\n this._transformFiles(files, function (transformedFiles) {\n if (_this14.options.chunking) {\n // Chunking is not allowed to be used with `uploadMultiple` so we know\n // that there is only __one__file.\n var transformedFile = transformedFiles[0];\n files[0].upload.chunked = _this14.options.chunking && (_this14.options.forceChunking || transformedFile.size > _this14.options.chunkSize);\n files[0].upload.totalChunkCount = Math.ceil(transformedFile.size / _this14.options.chunkSize);\n }\n\n if (files[0].upload.chunked) {\n // This file should be sent in chunks!\n // If the chunking option is set, we **know** that there can only be **one** file, since\n // uploadMultiple is not allowed with this option.\n var file = files[0];\n var _transformedFile = transformedFiles[0];\n var startedChunkCount = 0;\n file.upload.chunks = [];\n\n var handleNextChunk = function handleNextChunk() {\n var chunkIndex = 0; // Find the next item in file.upload.chunks that is not defined yet.\n\n while (file.upload.chunks[chunkIndex] !== undefined) {\n chunkIndex++;\n } // This means, that all chunks have already been started.\n\n\n if (chunkIndex >= file.upload.totalChunkCount) return;\n startedChunkCount++;\n var start = chunkIndex * _this14.options.chunkSize;\n var end = Math.min(start + _this14.options.chunkSize, _transformedFile.size);\n var dataBlock = {\n name: _this14._getParamName(0),\n data: _transformedFile.webkitSlice ? _transformedFile.webkitSlice(start, end) : _transformedFile.slice(start, end),\n filename: file.upload.filename,\n chunkIndex: chunkIndex\n };\n file.upload.chunks[chunkIndex] = {\n file: file,\n index: chunkIndex,\n dataBlock: dataBlock,\n // In case we want to retry.\n status: Dropzone.UPLOADING,\n progress: 0,\n retries: 0 // The number of times this block has been retried.\n\n };\n\n _this14._uploadData(files, [dataBlock]);\n };\n\n file.upload.finishedChunkUpload = function (chunk, response) {\n var allFinished = true;\n chunk.status = Dropzone.SUCCESS; // Clear the data from the chunk\n\n chunk.dataBlock = null; // Leaving this reference to xhr intact here will cause memory leaks in some browsers\n\n chunk.xhr = null;\n\n for (var i = 0; i < file.upload.totalChunkCount; i++) {\n if (file.upload.chunks[i] === undefined) {\n return handleNextChunk();\n }\n\n if (file.upload.chunks[i].status !== Dropzone.SUCCESS) {\n allFinished = false;\n }\n }\n\n if (allFinished) {\n _this14.options.chunksUploaded(file, function () {\n _this14._finished(files, response, null);\n });\n }\n };\n\n if (_this14.options.parallelChunkUploads) {\n for (var i = 0; i < file.upload.totalChunkCount; i++) {\n handleNextChunk();\n }\n } else {\n handleNextChunk();\n }\n } else {\n var dataBlocks = [];\n\n for (var _i2 = 0; _i2 < files.length; _i2++) {\n dataBlocks[_i2] = {\n name: _this14._getParamName(_i2),\n data: transformedFiles[_i2],\n filename: files[_i2].upload.filename\n };\n }\n\n _this14._uploadData(files, dataBlocks);\n }\n });\n } /// Returns the right chunk for given file and xhr\n\n }, {\n key: \"_getChunk\",\n value: function _getChunk(file, xhr) {\n for (var i = 0; i < file.upload.totalChunkCount; i++) {\n if (file.upload.chunks[i] !== undefined && file.upload.chunks[i].xhr === xhr) {\n return file.upload.chunks[i];\n }\n }\n } // This function actually uploads the file(s) to the server.\n // If dataBlocks contains the actual data to upload (meaning, that this could either be transformed\n // files, or individual chunks for chunked upload).\n\n }, {\n key: \"_uploadData\",\n value: function _uploadData(files, dataBlocks) {\n var _this15 = this;\n\n var xhr = new XMLHttpRequest(); // Put the xhr object in the file objects to be able to reference it later.\n\n var _iterator13 = dropzone_createForOfIteratorHelper(files, true),\n _step13;\n\n try {\n for (_iterator13.s(); !(_step13 = _iterator13.n()).done;) {\n var file = _step13.value;\n file.xhr = xhr;\n }\n } catch (err) {\n _iterator13.e(err);\n } finally {\n _iterator13.f();\n }\n\n if (files[0].upload.chunked) {\n // Put the xhr object in the right chunk object, so it can be associated later, and found with _getChunk\n files[0].upload.chunks[dataBlocks[0].chunkIndex].xhr = xhr;\n }\n\n var method = this.resolveOption(this.options.method, files);\n var url = this.resolveOption(this.options.url, files);\n xhr.open(method, url, true); // Setting the timeout after open because of IE11 issue: https://gitlab.com/meno/dropzone/issues/8\n\n var timeout = this.resolveOption(this.options.timeout, files);\n if (timeout) xhr.timeout = this.resolveOption(this.options.timeout, files); // Has to be after `.open()`. See https://github.com/enyo/dropzone/issues/179\n\n xhr.withCredentials = !!this.options.withCredentials;\n\n xhr.onload = function (e) {\n _this15._finishedUploading(files, xhr, e);\n };\n\n xhr.ontimeout = function () {\n _this15._handleUploadError(files, xhr, \"Request timedout after \".concat(_this15.options.timeout / 1000, \" seconds\"));\n };\n\n xhr.onerror = function () {\n _this15._handleUploadError(files, xhr);\n }; // Some browsers do not have the .upload property\n\n\n var progressObj = xhr.upload != null ? xhr.upload : xhr;\n\n progressObj.onprogress = function (e) {\n return _this15._updateFilesUploadProgress(files, xhr, e);\n };\n\n var headers = {\n Accept: \"application/json\",\n \"Cache-Control\": \"no-cache\",\n \"X-Requested-With\": \"XMLHttpRequest\"\n };\n\n if (this.options.headers) {\n Dropzone.extend(headers, this.options.headers);\n }\n\n for (var headerName in headers) {\n var headerValue = headers[headerName];\n\n if (headerValue) {\n xhr.setRequestHeader(headerName, headerValue);\n }\n }\n\n var formData = new FormData(); // Adding all @options parameters\n\n if (this.options.params) {\n var additionalParams = this.options.params;\n\n if (typeof additionalParams === \"function\") {\n additionalParams = additionalParams.call(this, files, xhr, files[0].upload.chunked ? this._getChunk(files[0], xhr) : null);\n }\n\n for (var key in additionalParams) {\n var value = additionalParams[key];\n\n if (Array.isArray(value)) {\n // The additional parameter contains an array,\n // so lets iterate over it to attach each value\n // individually.\n for (var i = 0; i < value.length; i++) {\n formData.append(key, value[i]);\n }\n } else {\n formData.append(key, value);\n }\n }\n } // Let the user add additional data if necessary\n\n\n var _iterator14 = dropzone_createForOfIteratorHelper(files, true),\n _step14;\n\n try {\n for (_iterator14.s(); !(_step14 = _iterator14.n()).done;) {\n var _file = _step14.value;\n this.emit(\"sending\", _file, xhr, formData);\n }\n } catch (err) {\n _iterator14.e(err);\n } finally {\n _iterator14.f();\n }\n\n if (this.options.uploadMultiple) {\n this.emit(\"sendingmultiple\", files, xhr, formData);\n }\n\n this._addFormElementData(formData); // Finally add the files\n // Has to be last because some servers (eg: S3) expect the file to be the last parameter\n\n\n for (var _i3 = 0; _i3 < dataBlocks.length; _i3++) {\n var dataBlock = dataBlocks[_i3];\n formData.append(dataBlock.name, dataBlock.data, dataBlock.filename);\n }\n\n this.submitRequest(xhr, formData, files);\n } // Transforms all files with this.options.transformFile and invokes done with the transformed files when done.\n\n }, {\n key: \"_transformFiles\",\n value: function _transformFiles(files, done) {\n var _this16 = this;\n\n var transformedFiles = []; // Clumsy way of handling asynchronous calls, until I get to add a proper Future library.\n\n var doneCounter = 0;\n\n var _loop = function _loop(i) {\n _this16.options.transformFile.call(_this16, files[i], function (transformedFile) {\n transformedFiles[i] = transformedFile;\n\n if (++doneCounter === files.length) {\n done(transformedFiles);\n }\n });\n };\n\n for (var i = 0; i < files.length; i++) {\n _loop(i);\n }\n } // Takes care of adding other input elements of the form to the AJAX request\n\n }, {\n key: \"_addFormElementData\",\n value: function _addFormElementData(formData) {\n // Take care of other input elements\n if (this.element.tagName === \"FORM\") {\n var _iterator15 = dropzone_createForOfIteratorHelper(this.element.querySelectorAll(\"input, textarea, select, button\"), true),\n _step15;\n\n try {\n for (_iterator15.s(); !(_step15 = _iterator15.n()).done;) {\n var input = _step15.value;\n var inputName = input.getAttribute(\"name\");\n var inputType = input.getAttribute(\"type\");\n if (inputType) inputType = inputType.toLowerCase(); // If the input doesn't have a name, we can't use it.\n\n if (typeof inputName === \"undefined\" || inputName === null) continue;\n\n if (input.tagName === \"SELECT\" && input.hasAttribute(\"multiple\")) {\n // Possibly multiple values\n var _iterator16 = dropzone_createForOfIteratorHelper(input.options, true),\n _step16;\n\n try {\n for (_iterator16.s(); !(_step16 = _iterator16.n()).done;) {\n var option = _step16.value;\n\n if (option.selected) {\n formData.append(inputName, option.value);\n }\n }\n } catch (err) {\n _iterator16.e(err);\n } finally {\n _iterator16.f();\n }\n } else if (!inputType || inputType !== \"checkbox\" && inputType !== \"radio\" || input.checked) {\n formData.append(inputName, input.value);\n }\n }\n } catch (err) {\n _iterator15.e(err);\n } finally {\n _iterator15.f();\n }\n }\n } // Invoked when there is new progress information about given files.\n // If e is not provided, it is assumed that the upload is finished.\n\n }, {\n key: \"_updateFilesUploadProgress\",\n value: function _updateFilesUploadProgress(files, xhr, e) {\n if (!files[0].upload.chunked) {\n // Handle file uploads without chunking\n var _iterator17 = dropzone_createForOfIteratorHelper(files, true),\n _step17;\n\n try {\n for (_iterator17.s(); !(_step17 = _iterator17.n()).done;) {\n var file = _step17.value;\n\n if (file.upload.total && file.upload.bytesSent && file.upload.bytesSent == file.upload.total) {\n // If both, the `total` and `bytesSent` have already been set, and\n // they are equal (meaning progress is at 100%), we can skip this\n // file, since an upload progress shouldn't go down.\n continue;\n }\n\n if (e) {\n file.upload.progress = 100 * e.loaded / e.total;\n file.upload.total = e.total;\n file.upload.bytesSent = e.loaded;\n } else {\n // No event, so we're at 100%\n file.upload.progress = 100;\n file.upload.bytesSent = file.upload.total;\n }\n\n this.emit(\"uploadprogress\", file, file.upload.progress, file.upload.bytesSent);\n }\n } catch (err) {\n _iterator17.e(err);\n } finally {\n _iterator17.f();\n }\n } else {\n // Handle chunked file uploads\n // Chunked upload is not compatible with uploading multiple files in one\n // request, so we know there's only one file.\n var _file2 = files[0]; // Since this is a chunked upload, we need to update the appropriate chunk\n // progress.\n\n var chunk = this._getChunk(_file2, xhr);\n\n if (e) {\n chunk.progress = 100 * e.loaded / e.total;\n chunk.total = e.total;\n chunk.bytesSent = e.loaded;\n } else {\n // No event, so we're at 100%\n chunk.progress = 100;\n chunk.bytesSent = chunk.total;\n } // Now tally the *file* upload progress from its individual chunks\n\n\n _file2.upload.progress = 0;\n _file2.upload.total = 0;\n _file2.upload.bytesSent = 0;\n\n for (var i = 0; i < _file2.upload.totalChunkCount; i++) {\n if (_file2.upload.chunks[i] && typeof _file2.upload.chunks[i].progress !== \"undefined\") {\n _file2.upload.progress += _file2.upload.chunks[i].progress;\n _file2.upload.total += _file2.upload.chunks[i].total;\n _file2.upload.bytesSent += _file2.upload.chunks[i].bytesSent;\n }\n } // Since the process is a percentage, we need to divide by the amount of\n // chunks we've used.\n\n\n _file2.upload.progress = _file2.upload.progress / _file2.upload.totalChunkCount;\n this.emit(\"uploadprogress\", _file2, _file2.upload.progress, _file2.upload.bytesSent);\n }\n }\n }, {\n key: \"_finishedUploading\",\n value: function _finishedUploading(files, xhr, e) {\n var response;\n\n if (files[0].status === Dropzone.CANCELED) {\n return;\n }\n\n if (xhr.readyState !== 4) {\n return;\n }\n\n if (xhr.responseType !== \"arraybuffer\" && xhr.responseType !== \"blob\") {\n response = xhr.responseText;\n\n if (xhr.getResponseHeader(\"content-type\") && ~xhr.getResponseHeader(\"content-type\").indexOf(\"application/json\")) {\n try {\n response = JSON.parse(response);\n } catch (error) {\n e = error;\n response = \"Invalid JSON response from server.\";\n }\n }\n }\n\n this._updateFilesUploadProgress(files, xhr);\n\n if (!(200 <= xhr.status && xhr.status < 300)) {\n this._handleUploadError(files, xhr, response);\n } else {\n if (files[0].upload.chunked) {\n files[0].upload.finishedChunkUpload(this._getChunk(files[0], xhr), response);\n } else {\n this._finished(files, response, e);\n }\n }\n }\n }, {\n key: \"_handleUploadError\",\n value: function _handleUploadError(files, xhr, response) {\n if (files[0].status === Dropzone.CANCELED) {\n return;\n }\n\n if (files[0].upload.chunked && this.options.retryChunks) {\n var chunk = this._getChunk(files[0], xhr);\n\n if (chunk.retries++ < this.options.retryChunksLimit) {\n this._uploadData(files, [chunk.dataBlock]);\n\n return;\n } else {\n console.warn(\"Retried this chunk too often. Giving up.\");\n }\n }\n\n this._errorProcessing(files, response || this.options.dictResponseError.replace(\"{{statusCode}}\", xhr.status), xhr);\n }\n }, {\n key: \"submitRequest\",\n value: function submitRequest(xhr, formData, files) {\n if (xhr.readyState != 1) {\n console.warn(\"Cannot send this request because the XMLHttpRequest.readyState is not OPENED.\");\n return;\n }\n\n xhr.send(formData);\n } // Called internally when processing is finished.\n // Individual callbacks have to be called in the appropriate sections.\n\n }, {\n key: \"_finished\",\n value: function _finished(files, responseText, e) {\n var _iterator18 = dropzone_createForOfIteratorHelper(files, true),\n _step18;\n\n try {\n for (_iterator18.s(); !(_step18 = _iterator18.n()).done;) {\n var file = _step18.value;\n file.status = Dropzone.SUCCESS;\n this.emit(\"success\", file, responseText, e);\n this.emit(\"complete\", file);\n }\n } catch (err) {\n _iterator18.e(err);\n } finally {\n _iterator18.f();\n }\n\n if (this.options.uploadMultiple) {\n this.emit(\"successmultiple\", files, responseText, e);\n this.emit(\"completemultiple\", files);\n }\n\n if (this.options.autoProcessQueue) {\n return this.processQueue();\n }\n } // Called internally when processing is finished.\n // Individual callbacks have to be called in the appropriate sections.\n\n }, {\n key: \"_errorProcessing\",\n value: function _errorProcessing(files, message, xhr) {\n var _iterator19 = dropzone_createForOfIteratorHelper(files, true),\n _step19;\n\n try {\n for (_iterator19.s(); !(_step19 = _iterator19.n()).done;) {\n var file = _step19.value;\n file.status = Dropzone.ERROR;\n this.emit(\"error\", file, message, xhr);\n this.emit(\"complete\", file);\n }\n } catch (err) {\n _iterator19.e(err);\n } finally {\n _iterator19.f();\n }\n\n if (this.options.uploadMultiple) {\n this.emit(\"errormultiple\", files, message, xhr);\n this.emit(\"completemultiple\", files);\n }\n\n if (this.options.autoProcessQueue) {\n return this.processQueue();\n }\n }\n }], [{\n key: \"initClass\",\n value: function initClass() {\n // Exposing the emitter class, mainly for tests\n this.prototype.Emitter = Emitter;\n /*\n This is a list of all available events you can register on a dropzone object.\n You can register an event handler like this:\n dropzone.on(\"dragEnter\", function() { });\n */\n\n this.prototype.events = [\"drop\", \"dragstart\", \"dragend\", \"dragenter\", \"dragover\", \"dragleave\", \"addedfile\", \"addedfiles\", \"removedfile\", \"thumbnail\", \"error\", \"errormultiple\", \"processing\", \"processingmultiple\", \"uploadprogress\", \"totaluploadprogress\", \"sending\", \"sendingmultiple\", \"success\", \"successmultiple\", \"canceled\", \"canceledmultiple\", \"complete\", \"completemultiple\", \"reset\", \"maxfilesexceeded\", \"maxfilesreached\", \"queuecomplete\"];\n this.prototype._thumbnailQueue = [];\n this.prototype._processingThumbnail = false;\n } // global utility\n\n }, {\n key: \"extend\",\n value: function extend(target) {\n for (var _len2 = arguments.length, objects = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n objects[_key2 - 1] = arguments[_key2];\n }\n\n for (var _i4 = 0, _objects = objects; _i4 < _objects.length; _i4++) {\n var object = _objects[_i4];\n\n for (var key in object) {\n var val = object[key];\n target[key] = val;\n }\n }\n\n return target;\n }\n }, {\n key: \"uuidv4\",\n value: function uuidv4() {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, function (c) {\n var r = Math.random() * 16 | 0,\n v = c === \"x\" ? r : r & 0x3 | 0x8;\n return v.toString(16);\n });\n }\n }]);\n\n return Dropzone;\n}(Emitter);\n\n\nDropzone.initClass();\nDropzone.version = \"5.9.2\"; // This is a map of options for your different dropzones. Add configurations\n// to this object for your different dropzone elemens.\n//\n// Example:\n//\n// Dropzone.options.myDropzoneElementId = { maxFilesize: 1 };\n//\n// To disable autoDiscover for a specific element, you can set `false` as an option:\n//\n// Dropzone.options.myDisabledElementId = false;\n//\n// And in html:\n//\n//
                  \n\nDropzone.options = {}; // Returns the options for an element or undefined if none available.\n\nDropzone.optionsForElement = function (element) {\n // Get the `Dropzone.options.elementId` for this element if it exists\n if (element.getAttribute(\"id\")) {\n return Dropzone.options[camelize(element.getAttribute(\"id\"))];\n } else {\n return undefined;\n }\n}; // Holds a list of all dropzone instances\n\n\nDropzone.instances = []; // Returns the dropzone for given element if any\n\nDropzone.forElement = function (element) {\n if (typeof element === \"string\") {\n element = document.querySelector(element);\n }\n\n if ((element != null ? element.dropzone : undefined) == null) {\n throw new Error(\"No Dropzone found for given element. This is probably because you're trying to access it before Dropzone had the time to initialize. Use the `init` option to setup any additional observers on your Dropzone.\");\n }\n\n return element.dropzone;\n}; // Set to false if you don't want Dropzone to automatically find and attach to .dropzone elements.\n\n\nDropzone.autoDiscover = true; // Looks for all .dropzone elements and creates a dropzone for them\n\nDropzone.discover = function () {\n var dropzones;\n\n if (document.querySelectorAll) {\n dropzones = document.querySelectorAll(\".dropzone\");\n } else {\n dropzones = []; // IE :(\n\n var checkElements = function checkElements(elements) {\n return function () {\n var result = [];\n\n var _iterator20 = dropzone_createForOfIteratorHelper(elements, true),\n _step20;\n\n try {\n for (_iterator20.s(); !(_step20 = _iterator20.n()).done;) {\n var el = _step20.value;\n\n if (/(^| )dropzone($| )/.test(el.className)) {\n result.push(dropzones.push(el));\n } else {\n result.push(undefined);\n }\n }\n } catch (err) {\n _iterator20.e(err);\n } finally {\n _iterator20.f();\n }\n\n return result;\n }();\n };\n\n checkElements(document.getElementsByTagName(\"div\"));\n checkElements(document.getElementsByTagName(\"form\"));\n }\n\n return function () {\n var result = [];\n\n var _iterator21 = dropzone_createForOfIteratorHelper(dropzones, true),\n _step21;\n\n try {\n for (_iterator21.s(); !(_step21 = _iterator21.n()).done;) {\n var dropzone = _step21.value;\n\n // Create a dropzone unless auto discover has been disabled for specific element\n if (Dropzone.optionsForElement(dropzone) !== false) {\n result.push(new Dropzone(dropzone));\n } else {\n result.push(undefined);\n }\n }\n } catch (err) {\n _iterator21.e(err);\n } finally {\n _iterator21.f();\n }\n\n return result;\n }();\n}; // Some browsers support drag and drog functionality, but not correctly.\n//\n// So I created a blocklist of userAgents. Yes, yes. Browser sniffing, I know.\n// But what to do when browsers *theoretically* support an API, but crash\n// when using it.\n//\n// This is a list of regular expressions tested against navigator.userAgent\n//\n// ** It should only be used on browser that *do* support the API, but\n// incorrectly **\n\n\nDropzone.blockedBrowsers = [// The mac os and windows phone version of opera 12 seems to have a problem with the File drag'n'drop API.\n/opera.*(Macintosh|Windows Phone).*version\\/12/i]; // Checks if the browser is supported\n\nDropzone.isBrowserSupported = function () {\n var capableBrowser = true;\n\n if (window.File && window.FileReader && window.FileList && window.Blob && window.FormData && document.querySelector) {\n if (!(\"classList\" in document.createElement(\"a\"))) {\n capableBrowser = false;\n } else {\n if (Dropzone.blacklistedBrowsers !== undefined) {\n // Since this has been renamed, this makes sure we don't break older\n // configuration.\n Dropzone.blockedBrowsers = Dropzone.blacklistedBrowsers;\n } // The browser supports the API, but may be blocked.\n\n\n var _iterator22 = dropzone_createForOfIteratorHelper(Dropzone.blockedBrowsers, true),\n _step22;\n\n try {\n for (_iterator22.s(); !(_step22 = _iterator22.n()).done;) {\n var regex = _step22.value;\n\n if (regex.test(navigator.userAgent)) {\n capableBrowser = false;\n continue;\n }\n }\n } catch (err) {\n _iterator22.e(err);\n } finally {\n _iterator22.f();\n }\n }\n } else {\n capableBrowser = false;\n }\n\n return capableBrowser;\n};\n\nDropzone.dataURItoBlob = function (dataURI) {\n // convert base64 to raw binary data held in a string\n // doesn't handle URLEncoded DataURIs - see SO answer #6850276 for code that does this\n var byteString = atob(dataURI.split(\",\")[1]); // separate out the mime component\n\n var mimeString = dataURI.split(\",\")[0].split(\":\")[1].split(\";\")[0]; // write the bytes of the string to an ArrayBuffer\n\n var ab = new ArrayBuffer(byteString.length);\n var ia = new Uint8Array(ab);\n\n for (var i = 0, end = byteString.length, asc = 0 <= end; asc ? i <= end : i >= end; asc ? i++ : i--) {\n ia[i] = byteString.charCodeAt(i);\n } // write the ArrayBuffer to a blob\n\n\n return new Blob([ab], {\n type: mimeString\n });\n}; // Returns an array without the rejected item\n\n\nvar without = function without(list, rejectedItem) {\n return list.filter(function (item) {\n return item !== rejectedItem;\n }).map(function (item) {\n return item;\n });\n}; // abc-def_ghi -> abcDefGhi\n\n\nvar camelize = function camelize(str) {\n return str.replace(/[\\-_](\\w)/g, function (match) {\n return match.charAt(1).toUpperCase();\n });\n}; // Creates an element from string\n\n\nDropzone.createElement = function (string) {\n var div = document.createElement(\"div\");\n div.innerHTML = string;\n return div.childNodes[0];\n}; // Tests if given element is inside (or simply is) the container\n\n\nDropzone.elementInside = function (element, container) {\n if (element === container) {\n return true;\n } // Coffeescript doesn't support do/while loops\n\n\n while (element = element.parentNode) {\n if (element === container) {\n return true;\n }\n }\n\n return false;\n};\n\nDropzone.getElement = function (el, name) {\n var element;\n\n if (typeof el === \"string\") {\n element = document.querySelector(el);\n } else if (el.nodeType != null) {\n element = el;\n }\n\n if (element == null) {\n throw new Error(\"Invalid `\".concat(name, \"` option provided. Please provide a CSS selector or a plain HTML element.\"));\n }\n\n return element;\n};\n\nDropzone.getElements = function (els, name) {\n var el, elements;\n\n if (els instanceof Array) {\n elements = [];\n\n try {\n var _iterator23 = dropzone_createForOfIteratorHelper(els, true),\n _step23;\n\n try {\n for (_iterator23.s(); !(_step23 = _iterator23.n()).done;) {\n el = _step23.value;\n elements.push(this.getElement(el, name));\n }\n } catch (err) {\n _iterator23.e(err);\n } finally {\n _iterator23.f();\n }\n } catch (e) {\n elements = null;\n }\n } else if (typeof els === \"string\") {\n elements = [];\n\n var _iterator24 = dropzone_createForOfIteratorHelper(document.querySelectorAll(els), true),\n _step24;\n\n try {\n for (_iterator24.s(); !(_step24 = _iterator24.n()).done;) {\n el = _step24.value;\n elements.push(el);\n }\n } catch (err) {\n _iterator24.e(err);\n } finally {\n _iterator24.f();\n }\n } else if (els.nodeType != null) {\n elements = [els];\n }\n\n if (elements == null || !elements.length) {\n throw new Error(\"Invalid `\".concat(name, \"` option provided. Please provide a CSS selector, a plain HTML element or a list of those.\"));\n }\n\n return elements;\n}; // Asks the user the question and calls accepted or rejected accordingly\n//\n// The default implementation just uses `window.confirm` and then calls the\n// appropriate callback.\n\n\nDropzone.confirm = function (question, accepted, rejected) {\n if (window.confirm(question)) {\n return accepted();\n } else if (rejected != null) {\n return rejected();\n }\n}; // Validates the mime type like this:\n//\n// https://developer.mozilla.org/en-US/docs/HTML/Element/input#attr-accept\n\n\nDropzone.isValidFile = function (file, acceptedFiles) {\n if (!acceptedFiles) {\n return true;\n } // If there are no accepted mime types, it's OK\n\n\n acceptedFiles = acceptedFiles.split(\",\");\n var mimeType = file.type;\n var baseMimeType = mimeType.replace(/\\/.*$/, \"\");\n\n var _iterator25 = dropzone_createForOfIteratorHelper(acceptedFiles, true),\n _step25;\n\n try {\n for (_iterator25.s(); !(_step25 = _iterator25.n()).done;) {\n var validType = _step25.value;\n validType = validType.trim();\n\n if (validType.charAt(0) === \".\") {\n if (file.name.toLowerCase().indexOf(validType.toLowerCase(), file.name.length - validType.length) !== -1) {\n return true;\n }\n } else if (/\\/\\*$/.test(validType)) {\n // This is something like a image/* mime type\n if (baseMimeType === validType.replace(/\\/.*$/, \"\")) {\n return true;\n }\n } else {\n if (mimeType === validType) {\n return true;\n }\n }\n }\n } catch (err) {\n _iterator25.e(err);\n } finally {\n _iterator25.f();\n }\n\n return false;\n}; // Augment jQuery\n\n\nif (typeof jQuery !== \"undefined\" && jQuery !== null) {\n jQuery.fn.dropzone = function (options) {\n return this.each(function () {\n return new Dropzone(this, options);\n });\n };\n} // Dropzone file status codes\n\n\nDropzone.ADDED = \"added\";\nDropzone.QUEUED = \"queued\"; // For backwards compatibility. Now, if a file is accepted, it's either queued\n// or uploading.\n\nDropzone.ACCEPTED = Dropzone.QUEUED;\nDropzone.UPLOADING = \"uploading\";\nDropzone.PROCESSING = Dropzone.UPLOADING; // alias\n\nDropzone.CANCELED = \"canceled\";\nDropzone.ERROR = \"error\";\nDropzone.SUCCESS = \"success\";\n/*\n\n Bugfix for iOS 6 and 7\n Source: http://stackoverflow.com/questions/11929099/html5-canvas-drawimage-ratio-bug-ios\n based on the work of https://github.com/stomita/ios-imagefile-megapixel\n\n */\n// Detecting vertical squash in loaded image.\n// Fixes a bug which squash image vertically while drawing into canvas for some images.\n// This is a bug in iOS6 devices. This function from https://github.com/stomita/ios-imagefile-megapixel\n\nvar detectVerticalSquash = function detectVerticalSquash(img) {\n var iw = img.naturalWidth;\n var ih = img.naturalHeight;\n var canvas = document.createElement(\"canvas\");\n canvas.width = 1;\n canvas.height = ih;\n var ctx = canvas.getContext(\"2d\");\n ctx.drawImage(img, 0, 0);\n\n var _ctx$getImageData = ctx.getImageData(1, 0, 1, ih),\n data = _ctx$getImageData.data; // search image edge pixel position in case it is squashed vertically.\n\n\n var sy = 0;\n var ey = ih;\n var py = ih;\n\n while (py > sy) {\n var alpha = data[(py - 1) * 4 + 3];\n\n if (alpha === 0) {\n ey = py;\n } else {\n sy = py;\n }\n\n py = ey + sy >> 1;\n }\n\n var ratio = py / ih;\n\n if (ratio === 0) {\n return 1;\n } else {\n return ratio;\n }\n}; // A replacement for context.drawImage\n// (args are for source and destination).\n\n\nvar drawImageIOSFix = function drawImageIOSFix(ctx, img, sx, sy, sw, sh, dx, dy, dw, dh) {\n var vertSquashRatio = detectVerticalSquash(img);\n return ctx.drawImage(img, sx, sy, sw, sh, dx, dy, dw, dh / vertSquashRatio);\n}; // Based on MinifyJpeg\n// Source: http://www.perry.cz/files/ExifRestorer.js\n// http://elicon.blog57.fc2.com/blog-entry-206.html\n\n\nvar ExifRestore = /*#__PURE__*/function () {\n function ExifRestore() {\n dropzone_classCallCheck(this, ExifRestore);\n }\n\n dropzone_createClass(ExifRestore, null, [{\n key: \"initClass\",\n value: function initClass() {\n this.KEY_STR = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n }\n }, {\n key: \"encode64\",\n value: function encode64(input) {\n var output = \"\";\n var chr1 = undefined;\n var chr2 = undefined;\n var chr3 = \"\";\n var enc1 = undefined;\n var enc2 = undefined;\n var enc3 = undefined;\n var enc4 = \"\";\n var i = 0;\n\n while (true) {\n chr1 = input[i++];\n chr2 = input[i++];\n chr3 = input[i++];\n enc1 = chr1 >> 2;\n enc2 = (chr1 & 3) << 4 | chr2 >> 4;\n enc3 = (chr2 & 15) << 2 | chr3 >> 6;\n enc4 = chr3 & 63;\n\n if (isNaN(chr2)) {\n enc3 = enc4 = 64;\n } else if (isNaN(chr3)) {\n enc4 = 64;\n }\n\n output = output + this.KEY_STR.charAt(enc1) + this.KEY_STR.charAt(enc2) + this.KEY_STR.charAt(enc3) + this.KEY_STR.charAt(enc4);\n chr1 = chr2 = chr3 = \"\";\n enc1 = enc2 = enc3 = enc4 = \"\";\n\n if (!(i < input.length)) {\n break;\n }\n }\n\n return output;\n }\n }, {\n key: \"restore\",\n value: function restore(origFileBase64, resizedFileBase64) {\n if (!origFileBase64.match(\"data:image/jpeg;base64,\")) {\n return resizedFileBase64;\n }\n\n var rawImage = this.decode64(origFileBase64.replace(\"data:image/jpeg;base64,\", \"\"));\n var segments = this.slice2Segments(rawImage);\n var image = this.exifManipulation(resizedFileBase64, segments);\n return \"data:image/jpeg;base64,\".concat(this.encode64(image));\n }\n }, {\n key: \"exifManipulation\",\n value: function exifManipulation(resizedFileBase64, segments) {\n var exifArray = this.getExifArray(segments);\n var newImageArray = this.insertExif(resizedFileBase64, exifArray);\n var aBuffer = new Uint8Array(newImageArray);\n return aBuffer;\n }\n }, {\n key: \"getExifArray\",\n value: function getExifArray(segments) {\n var seg = undefined;\n var x = 0;\n\n while (x < segments.length) {\n seg = segments[x];\n\n if (seg[0] === 255 & seg[1] === 225) {\n return seg;\n }\n\n x++;\n }\n\n return [];\n }\n }, {\n key: \"insertExif\",\n value: function insertExif(resizedFileBase64, exifArray) {\n var imageData = resizedFileBase64.replace(\"data:image/jpeg;base64,\", \"\");\n var buf = this.decode64(imageData);\n var separatePoint = buf.indexOf(255, 3);\n var mae = buf.slice(0, separatePoint);\n var ato = buf.slice(separatePoint);\n var array = mae;\n array = array.concat(exifArray);\n array = array.concat(ato);\n return array;\n }\n }, {\n key: \"slice2Segments\",\n value: function slice2Segments(rawImageArray) {\n var head = 0;\n var segments = [];\n\n while (true) {\n var length;\n\n if (rawImageArray[head] === 255 & rawImageArray[head + 1] === 218) {\n break;\n }\n\n if (rawImageArray[head] === 255 & rawImageArray[head + 1] === 216) {\n head += 2;\n } else {\n length = rawImageArray[head + 2] * 256 + rawImageArray[head + 3];\n var endPoint = head + length + 2;\n var seg = rawImageArray.slice(head, endPoint);\n segments.push(seg);\n head = endPoint;\n }\n\n if (head > rawImageArray.length) {\n break;\n }\n }\n\n return segments;\n }\n }, {\n key: \"decode64\",\n value: function decode64(input) {\n var output = \"\";\n var chr1 = undefined;\n var chr2 = undefined;\n var chr3 = \"\";\n var enc1 = undefined;\n var enc2 = undefined;\n var enc3 = undefined;\n var enc4 = \"\";\n var i = 0;\n var buf = []; // remove all characters that are not A-Z, a-z, 0-9, +, /, or =\n\n var base64test = /[^A-Za-z0-9\\+\\/\\=]/g;\n\n if (base64test.exec(input)) {\n console.warn(\"There were invalid base64 characters in the input text.\\nValid base64 characters are A-Z, a-z, 0-9, '+', '/',and '='\\nExpect errors in decoding.\");\n }\n\n input = input.replace(/[^A-Za-z0-9\\+\\/\\=]/g, \"\");\n\n while (true) {\n enc1 = this.KEY_STR.indexOf(input.charAt(i++));\n enc2 = this.KEY_STR.indexOf(input.charAt(i++));\n enc3 = this.KEY_STR.indexOf(input.charAt(i++));\n enc4 = this.KEY_STR.indexOf(input.charAt(i++));\n chr1 = enc1 << 2 | enc2 >> 4;\n chr2 = (enc2 & 15) << 4 | enc3 >> 2;\n chr3 = (enc3 & 3) << 6 | enc4;\n buf.push(chr1);\n\n if (enc3 !== 64) {\n buf.push(chr2);\n }\n\n if (enc4 !== 64) {\n buf.push(chr3);\n }\n\n chr1 = chr2 = chr3 = \"\";\n enc1 = enc2 = enc3 = enc4 = \"\";\n\n if (!(i < input.length)) {\n break;\n }\n }\n\n return buf;\n }\n }]);\n\n return ExifRestore;\n}();\n\nExifRestore.initClass();\n/*\n * contentloaded.js\n *\n * Author: Diego Perini (diego.perini at gmail.com)\n * Summary: cross-browser wrapper for DOMContentLoaded\n * Updated: 20101020\n * License: MIT\n * Version: 1.2\n *\n * URL:\n * http://javascript.nwbox.com/ContentLoaded/\n * http://javascript.nwbox.com/ContentLoaded/MIT-LICENSE\n */\n// @win window reference\n// @fn function reference\n\nvar contentLoaded = function contentLoaded(win, fn) {\n var done = false;\n var top = true;\n var doc = win.document;\n var root = doc.documentElement;\n var add = doc.addEventListener ? \"addEventListener\" : \"attachEvent\";\n var rem = doc.addEventListener ? \"removeEventListener\" : \"detachEvent\";\n var pre = doc.addEventListener ? \"\" : \"on\";\n\n var init = function init(e) {\n if (e.type === \"readystatechange\" && doc.readyState !== \"complete\") {\n return;\n }\n\n (e.type === \"load\" ? win : doc)[rem](pre + e.type, init, false);\n\n if (!done && (done = true)) {\n return fn.call(win, e.type || e);\n }\n };\n\n var poll = function poll() {\n try {\n root.doScroll(\"left\");\n } catch (e) {\n setTimeout(poll, 50);\n return;\n }\n\n return init(\"poll\");\n };\n\n if (doc.readyState !== \"complete\") {\n if (doc.createEventObject && root.doScroll) {\n try {\n top = !win.frameElement;\n } catch (error) {}\n\n if (top) {\n poll();\n }\n }\n\n doc[add](pre + \"DOMContentLoaded\", init, false);\n doc[add](pre + \"readystatechange\", init, false);\n return win[add](pre + \"load\", init, false);\n }\n}; // As a single function to be able to write tests.\n\n\nDropzone._autoDiscoverFunction = function () {\n if (Dropzone.autoDiscover) {\n return Dropzone.discover();\n }\n};\n\ncontentLoaded(window, Dropzone._autoDiscoverFunction);\n\nfunction __guard__(value, transform) {\n return typeof value !== \"undefined\" && value !== null ? transform(value) : undefined;\n}\n\nfunction __guardMethod__(obj, methodName, transform) {\n if (typeof obj !== \"undefined\" && obj !== null && typeof obj[methodName] === \"function\") {\n return transform(obj, methodName);\n } else {\n return undefined;\n }\n}\n\n\n;// CONCATENATED MODULE: ./tool/dropzone.dist.js\n /// Make Dropzone a global variable.\n\nwindow.Dropzone = Dropzone;\n/* harmony default export */ var dropzone_dist = (Dropzone);\n\n}();\n/******/ \treturn __webpack_exports__;\n/******/ })()\n;\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmF2Ly4vbm9kZV9tb2R1bGVzL2Ryb3B6b25lL2Rpc3QvZHJvcHpvbmUuanM/NzllMyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBLElBQUksSUFBeUQ7QUFDN0Q7QUFDQSxNQUFNLGFBS0o7QUFDRixDQUFDO0FBQ0QsNkJBQTZCO0FBQzdCOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7QUFHQSxPQUFPOztBQUVQO0FBQ0Esa0RBQWtELDhCQUFtQjs7QUFFckUsZUFBZSw4QkFBbUI7O0FBRWxDO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0EsT0FBTzs7QUFFUDtBQUNBLGtEQUFrRCwrQkFBbUI7O0FBRXJFLHNCQUFzQiwrQkFBbUI7QUFDekMsYUFBYSwrQkFBbUI7QUFDaEMsMkJBQTJCLCtCQUFtQjs7QUFFOUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87O0FBRVA7QUFDQSxrREFBa0QsK0JBQW1COztBQUVyRTs7QUFFQSxhQUFhLCtCQUFtQjs7QUFFaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTzs7QUFFUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0EsT0FBTzs7QUFFUDtBQUNBLGtEQUFrRCwrQkFBbUI7O0FBRXJFLGVBQWUsK0JBQW1COztBQUVsQztBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7OztBQUdBLE9BQU87O0FBRVA7QUFDQTs7QUFFQTs7O0FBR0EsT0FBTzs7QUFFUDtBQUNBLGtEQUFrRCwrQkFBbUI7O0FBRXJFOztBQUVBLDBCQUEwQiwrQkFBbUI7QUFDN0Msa0JBQWtCLCtCQUFtQjtBQUNyQyxhQUFhLCtCQUFtQjtBQUNoQyxlQUFlLCtCQUFtQjtBQUNsQyxVQUFVLCtCQUFtQjtBQUM3QixjQUFjLCtCQUFt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QUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsV0FBVztBQUNYO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsNkJBQTZCO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLDhDQUE4QztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsY0FBYztBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxVQUFVO0FBQ1Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQix1QkFBdUI7QUFDNUM7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQix1QkFBdUI7QUFDNUM7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxL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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7O0FBRTFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSx5QkFBeUIsK0JBQStCO0FBQ3hEOztBQUVBO0FBQ0E7QUFDQSx5Q0FBeUM7O0FBRXpDO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDOztBQUU1QztBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLOzs7QUFHTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7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QUFDQTtBQUNBLGlFQUFpRTtBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1COztBQUVuQjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7O0FBR0EsQ0FBQztBQUNEOztBQUVBO0FBQ0E7O0FBRUEsQ0FBQztBQUNEO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsQ0FBQyIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9kcm9wem9uZS9kaXN0L2Ryb3B6b25lLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIHtcblx0XHR2YXIgYSA9IGZhY3RvcnkoKTtcblx0XHRmb3IodmFyIGkgaW4gYSkgKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyA/IGV4cG9ydHMgOiByb290KVtpXSA9IGFbaV07XG5cdH1cbn0pKHNlbGYsIGZ1bmN0aW9uKCkge1xucmV0dXJuIC8qKioqKiovIChmdW5jdGlvbigpIHsgLy8gd2VicGFja0Jvb3RzdHJhcFxuLyoqKioqKi8gXHR2YXIgX193ZWJwYWNrX21vZHVsZXNfXyA9ICh7XG5cbi8qKiovIDMwOTk6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmICh0eXBlb2YgaXQgIT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IFR5cGVFcnJvcihTdHJpbmcoaXQpICsgJyBpcyBub3QgYSBmdW5jdGlvbicpO1xuICB9IHJldHVybiBpdDtcbn07XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDYwNzc6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMTEpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoIWlzT2JqZWN0KGl0KSAmJiBpdCAhPT0gbnVsbCkge1xuICAgIHRocm93IFR5cGVFcnJvcihcIkNhbid0IHNldCBcIiArIFN0cmluZyhpdCkgKyAnIGFzIGEgcHJvdG90eXBlJyk7XG4gIH0gcmV0dXJuIGl0O1xufTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gMTIyMzpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1MTEyKTtcbnZhciBjcmVhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMwKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oMzA3MCk7XG5cbnZhciBVTlNDT1BBQkxFUyA9IHdlbGxLbm93blN5bWJvbCgndW5zY29wYWJsZXMnKTtcbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxuLy8gQXJyYXkucHJvdG90eXBlW0BAdW5zY29wYWJsZXNdXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQHVuc2NvcGFibGVzXG5pZiAoQXJyYXlQcm90b3R5cGVbVU5TQ09QQUJMRVNdID09IHVuZGVmaW5lZCkge1xuICBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKEFycmF5UHJvdG90eXBlLCBVTlNDT1BBQkxFUywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB2YWx1ZTogY3JlYXRlKG51bGwpXG4gIH0pO1xufVxuXG4vLyBhZGQgYSBrZXkgdG8gQXJyYXkucHJvdG90eXBlW0BAdW5zY29wYWJsZXNdXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgQXJyYXlQcm90b3R5cGVbVU5TQ09QQUJMRVNdW2tleV0gPSB0cnVlO1xufTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gMTUzMDpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxudmFyIGNoYXJBdCA9IF9fd2VicGFja19yZXF1aXJlX18oODcxMCkuY2hhckF0O1xuXG4vLyBgQWR2YW5jZVN0cmluZ0luZGV4YCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYWR2YW5jZXN0cmluZ2luZGV4XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChTLCBpbmRleCwgdW5pY29kZSkge1xuICByZXR1cm4gaW5kZXggKyAodW5pY29kZSA/IGNoYXJBdChTLCBpbmRleCkubGVuZ3RoIDogMSk7XG59O1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA1Nzg3OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSkge1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgQ29uc3RydWN0b3IsIG5hbWUpIHtcbiAgaWYgKCEoaXQgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ0luY29ycmVjdCAnICsgKG5hbWUgPyBuYW1lICsgJyAnIDogJycpICsgJ2ludm9jYXRpb24nKTtcbiAgfSByZXR1cm4gaXQ7XG59O1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA5NjcwOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTExKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKCFpc09iamVjdChpdCkpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoU3RyaW5nKGl0KSArICcgaXMgbm90IGFuIG9iamVjdCcpO1xuICB9IHJldHVybiBpdDtcbn07XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDQwMTk6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gdHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgRGF0YVZpZXcgIT09ICd1bmRlZmluZWQnO1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyAyNjA6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBOQVRJVkVfQVJSQVlfQlVGRkVSID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MDE5KTtcbnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oOTc4MSk7XG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3ODU0KTtcbnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTExKTtcbnZhciBoYXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY2NTYpO1xudmFyIGNsYXNzb2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY0OCk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4ODgwKTtcbnZhciByZWRlZmluZSA9IF9fd2VicGFja19yZXF1aXJlX18oMTMyMCk7XG52YXIgZGVmaW5lUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMwNzApLmY7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk1MTgpO1xudmFyIHNldFByb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3Njc0KTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUxMTIpO1xudmFyIHVpZCA9IF9fd2VicGFja19yZXF1aXJlX18oOTcxMSk7XG5cbnZhciBJbnQ4QXJyYXkgPSBnbG9iYWwuSW50OEFycmF5O1xudmFyIEludDhBcnJheVByb3RvdHlwZSA9IEludDhBcnJheSAmJiBJbnQ4QXJyYXkucHJvdG90eXBlO1xudmFyIFVpbnQ4Q2xhbXBlZEFycmF5ID0gZ2xvYmFsLlVpbnQ4Q2xhbXBlZEFycmF5O1xudmFyIFVpbnQ4Q2xhbXBlZEFycmF5UHJvdG90eXBlID0gVWludDhDbGFtcGVkQXJyYXkgJiYgVWludDhDbGFtcGVkQXJyYXkucHJvdG90eXBlO1xudmFyIFR5cGVkQXJyYXkgPSBJbnQ4QXJyYXkgJiYgZ2V0UHJvdG90eXBlT2YoSW50OEFycmF5KTtcbnZhciBUeXBlZEFycmF5UHJvdG90eXBlID0gSW50OEFycmF5UHJvdG90eXBlICYmIGdldFByb3RvdHlwZU9mKEludDhBcnJheVByb3RvdHlwZSk7XG52YXIgT2JqZWN0UHJvdG90eXBlID0gT2JqZWN0LnByb3RvdHlwZTtcbnZhciBpc1Byb3RvdHlwZU9mID0gT2JqZWN0UHJvdG90eXBlLmlzUHJvdG90eXBlT2Y7XG5cbnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpO1xudmFyIFRZUEVEX0FSUkFZX1RBRyA9IHVpZCgnVFlQRURfQVJSQVlfVEFHJyk7XG4vLyBGaXhpbmcgbmF0aXZlIHR5cGVkIGFycmF5cyBpbiBPcGVyYSBQcmVzdG8gY3Jhc2hlcyB0aGUgYnJvd3Nlciwgc2VlICM1OTVcbnZhciBOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTID0gTkFUSVZFX0FSUkFZX0JVRkZFUiAmJiAhIXNldFByb3RvdHlwZU9mICYmIGNsYXNzb2YoZ2xvYmFsLm9wZXJhKSAhPT0gJ09wZXJhJztcbnZhciBUWVBFRF9BUlJBWV9UQUdfUkVRSVJFRCA9IGZhbHNlO1xudmFyIE5BTUU7XG5cbnZhciBUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCA9IHtcbiAgSW50OEFycmF5OiAxLFxuICBVaW50OEFycmF5OiAxLFxuICBVaW50OENsYW1wZWRBcnJheTogMSxcbiAgSW50MTZBcnJheTogMixcbiAgVWludDE2QXJyYXk6IDIsXG4gIEludDMyQXJyYXk6IDQsXG4gIFVpbnQzMkFycmF5OiA0LFxuICBGbG9hdDMyQXJyYXk6IDQsXG4gIEZsb2F0NjRBcnJheTogOFxufTtcblxudmFyIEJpZ0ludEFycmF5Q29uc3RydWN0b3JzTGlzdCA9IHtcbiAgQmlnSW50NjRBcnJheTogOCxcbiAgQmlnVWludDY0QXJyYXk6IDhcbn07XG5cbnZhciBpc1ZpZXcgPSBmdW5jdGlvbiBpc1ZpZXcoaXQpIHtcbiAgaWYgKCFpc09iamVjdChpdCkpIHJldHVybiBmYWxzZTtcbiAgdmFyIGtsYXNzID0gY2xhc3NvZihpdCk7XG4gIHJldHVybiBrbGFzcyA9PT0gJ0RhdGFWaWV3J1xuICAgIHx8IGhhcyhUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCwga2xhc3MpXG4gICAgfHwgaGFzKEJpZ0ludEFycmF5Q29uc3RydWN0b3JzTGlzdCwga2xhc3MpO1xufTtcblxudmFyIGlzVHlwZWRBcnJheSA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoIWlzT2JqZWN0KGl0KSkgcmV0dXJuIGZhbHNlO1xuICB2YXIga2xhc3MgPSBjbGFzc29mKGl0KTtcbiAgcmV0dXJuIGhhcyhUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCwga2xhc3MpXG4gICAgfHwgaGFzKEJpZ0ludEFycmF5Q29uc3RydWN0b3JzTGlzdCwga2xhc3MpO1xufTtcblxudmFyIGFUeXBlZEFycmF5ID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpc1R5cGVkQXJyYXkoaXQpKSByZXR1cm4gaXQ7XG4gIHRocm93IFR5cGVFcnJvcignVGFyZ2V0IGlzIG5vdCBhIHR5cGVkIGFycmF5Jyk7XG59O1xuXG52YXIgYVR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uIChDKSB7XG4gIGlmIChzZXRQcm90b3R5cGVPZikge1xuICAgIGlmIChpc1Byb3RvdHlwZU9mLmNhbGwoVHlwZWRBcnJheSwgQykpIHJldHVybiBDO1xuICB9IGVsc2UgZm9yICh2YXIgQVJSQVkgaW4gVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QpIGlmIChoYXMoVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QsIE5BTUUpKSB7XG4gICAgdmFyIFR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IGdsb2JhbFtBUlJBWV07XG4gICAgaWYgKFR5cGVkQXJyYXlDb25zdHJ1Y3RvciAmJiAoQyA9PT0gVHlwZWRBcnJheUNvbnN0cnVjdG9yIHx8IGlzUHJvdG90eXBlT2YuY2FsbChUeXBlZEFycmF5Q29uc3RydWN0b3IsIEMpKSkge1xuICAgICAgcmV0dXJuIEM7XG4gICAgfVxuICB9IHRocm93IFR5cGVFcnJvcignVGFyZ2V0IGlzIG5vdCBhIHR5cGVkIGFycmF5IGNvbnN0cnVjdG9yJyk7XG59O1xuXG52YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IGZ1bmN0aW9uIChLRVksIHByb3BlcnR5LCBmb3JjZWQpIHtcbiAgaWYgKCFERVNDUklQVE9SUykgcmV0dXJuO1xuICBpZiAoZm9yY2VkKSBmb3IgKHZhciBBUlJBWSBpbiBUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCkge1xuICAgIHZhciBUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBnbG9iYWxbQVJSQVldO1xuICAgIGlmIChUeXBlZEFycmF5Q29uc3RydWN0b3IgJiYgaGFzKFR5cGVkQXJyYXlDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIEtFWSkpIHtcbiAgICAgIGRlbGV0ZSBUeXBlZEFycmF5Q29uc3RydWN0b3IucHJvdG90eXBlW0tFWV07XG4gICAgfVxuICB9XG4gIGlmICghVHlwZWRBcnJheVByb3RvdHlwZVtLRVldIHx8IGZvcmNlZCkge1xuICAgIHJlZGVmaW5lKFR5cGVkQXJyYXlQcm90b3R5cGUsIEtFWSwgZm9yY2VkID8gcHJvcGVydHlcbiAgICAgIDogTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyAmJiBJbnQ4QXJyYXlQcm90b3R5cGVbS0VZXSB8fCBwcm9wZXJ0eSk7XG4gIH1cbn07XG5cbnZhciBleHBvcnRUeXBlZEFycmF5U3RhdGljTWV0aG9kID0gZnVuY3Rpb24gKEtFWSwgcHJvcGVydHksIGZvcmNlZCkge1xuICB2YXIgQVJSQVksIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcjtcbiAgaWYgKCFERVNDUklQVE9SUykgcmV0dXJuO1xuICBpZiAoc2V0UHJvdG90eXBlT2YpIHtcbiAgICBpZiAoZm9yY2VkKSBmb3IgKEFSUkFZIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0KSB7XG4gICAgICBUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBnbG9iYWxbQVJSQVldO1xuICAgICAgaWYgKFR5cGVkQXJyYXlDb25zdHJ1Y3RvciAmJiBoYXMoVHlwZWRBcnJheUNvbnN0cnVjdG9yLCBLRVkpKSB7XG4gICAgICAgIGRlbGV0ZSBUeXBlZEFycmF5Q29uc3RydWN0b3JbS0VZXTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFUeXBlZEFycmF5W0tFWV0gfHwgZm9yY2VkKSB7XG4gICAgICAvLyBWOCB+IENocm9tZSA0OS01MCBgJVR5cGVkQXJyYXklYCBtZXRob2RzIGFyZSBub24td3JpdGFibGUgbm9uLWNvbmZpZ3VyYWJsZVxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHJlZGVmaW5lKFR5cGVkQXJyYXksIEtFWSwgZm9yY2VkID8gcHJvcGVydHkgOiBOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTICYmIEludDhBcnJheVtLRVldIHx8IHByb3BlcnR5KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgICB9IGVsc2UgcmV0dXJuO1xuICB9XG4gIGZvciAoQVJSQVkgaW4gVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QpIHtcbiAgICBUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBnbG9iYWxbQVJSQVldO1xuICAgIGlmIChUeXBlZEFycmF5Q29uc3RydWN0b3IgJiYgKCFUeXBlZEFycmF5Q29uc3RydWN0b3JbS0VZXSB8fCBmb3JjZWQpKSB7XG4gICAgICByZWRlZmluZShUeXBlZEFycmF5Q29uc3RydWN0b3IsIEtFWSwgcHJvcGVydHkpO1xuICAgIH1cbiAgfVxufTtcblxuZm9yIChOQU1FIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0KSB7XG4gIGlmICghZ2xvYmFsW05BTUVdKSBOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTID0gZmFsc2U7XG59XG5cbi8vIFdlYktpdCBidWcgLSB0eXBlZCBhcnJheXMgY29uc3RydWN0b3JzIHByb3RvdHlwZSBpcyBPYmplY3QucHJvdG90eXBlXG5pZiAoIU5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MgfHwgdHlwZW9mIFR5cGVkQXJyYXkgIT0gJ2Z1bmN0aW9uJyB8fCBUeXBlZEFycmF5ID09PSBGdW5jdGlvbi5wcm90b3R5cGUpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvdyAtLSBzYWZlXG4gIFR5cGVkQXJyYXkgPSBmdW5jdGlvbiBUeXBlZEFycmF5KCkge1xuICAgIHRocm93IFR5cGVFcnJvcignSW5jb3JyZWN0IGludm9jYXRpb24nKTtcbiAgfTtcbiAgaWYgKE5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MpIGZvciAoTkFNRSBpbiBUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCkge1xuICAgIGlmIChnbG9iYWxbTkFNRV0pIHNldFByb3RvdHlwZU9mKGdsb2JhbFtOQU1FXSwgVHlwZWRBcnJheSk7XG4gIH1cbn1cblxuaWYgKCFOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTIHx8ICFUeXBlZEFycmF5UHJvdG90eXBlIHx8IFR5cGVkQXJyYXlQcm90b3R5cGUgPT09IE9iamVjdFByb3RvdHlwZSkge1xuICBUeXBlZEFycmF5UHJvdG90eXBlID0gVHlwZWRBcnJheS5wcm90b3R5cGU7XG4gIGlmIChOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTKSBmb3IgKE5BTUUgaW4gVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QpIHtcbiAgICBpZiAoZ2xvYmFsW05BTUVdKSBzZXRQcm90b3R5cGVPZihnbG9iYWxbTkFNRV0ucHJvdG90eXBlLCBUeXBlZEFycmF5UHJvdG90eXBlKTtcbiAgfVxufVxuXG4vLyBXZWJLaXQgYnVnIC0gb25lIG1vcmUgb2JqZWN0IGluIFVpbnQ4Q2xhbXBlZEFycmF5IHByb3RvdHlwZSBjaGFpblxuaWYgKE5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MgJiYgZ2V0UHJvdG90eXBlT2YoVWludDhDbGFtcGVkQXJyYXlQcm90b3R5cGUpICE9PSBUeXBlZEFycmF5UHJvdG90eXBlKSB7XG4gIHNldFByb3RvdHlwZU9mKFVpbnQ4Q2xhbXBlZEFycmF5UHJvdG90eXBlLCBUeXBlZEFycmF5UHJvdG90eXBlKTtcbn1cblxuaWYgKERFU0NSSVBUT1JTICYmICFoYXMoVHlwZWRBcnJheVByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRykpIHtcbiAgVFlQRURfQVJSQVlfVEFHX1JFUUlSRUQgPSB0cnVlO1xuICBkZWZpbmVQcm9wZXJ0eShUeXBlZEFycmF5UHJvdG90eXBlLCBUT19TVFJJTkdfVEFHLCB7IGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBpc09iamVjdCh0aGlzKSA/IHRoaXNbVFlQRURfQVJSQVlfVEFHXSA6IHVuZGVmaW5lZDtcbiAgfSB9KTtcbiAgZm9yIChOQU1FIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0KSBpZiAoZ2xvYmFsW05BTUVdKSB7XG4gICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KGdsb2JhbFtOQU1FXSwgVFlQRURfQVJSQVlfVEFHLCBOQU1FKTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUzogTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyxcbiAgVFlQRURfQVJSQVlfVEFHOiBUWVBFRF9BUlJBWV9UQUdfUkVRSVJFRCAmJiBUWVBFRF9BUlJBWV9UQUcsXG4gIGFUeXBlZEFycmF5OiBhVHlwZWRBcnJheSxcbiAgYVR5cGVkQXJyYXlDb25zdHJ1Y3RvcjogYVR5cGVkQXJyYXlDb25zdHJ1Y3RvcixcbiAgZXhwb3J0VHlwZWRBcnJheU1ldGhvZDogZXhwb3J0VHlwZWRBcnJheU1ldGhvZCxcbiAgZXhwb3J0VHlwZWRBcnJheVN0YXRpY01ldGhvZDogZXhwb3J0VHlwZWRBcnJheVN0YXRpY01ldGhvZCxcbiAgaXNWaWV3OiBpc1ZpZXcsXG4gIGlzVHlwZWRBcnJheTogaXNUeXBlZEFycmF5LFxuICBUeXBlZEFycmF5OiBUeXBlZEFycmF5LFxuICBUeXBlZEFycmF5UHJvdG90eXBlOiBUeXBlZEFycmF5UHJvdG90eXBlXG59O1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyAzMzMxOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3ODU0KTtcbnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oOTc4MSk7XG52YXIgTkFUSVZFX0FSUkFZX0JVRkZFUiA9IF9fd2VicGFja19yZXF1aXJlX18oNDAxOSk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4ODgwKTtcbnZhciByZWRlZmluZUFsbCA9IF9fd2VicGFja19yZXF1aXJlX18oMjI0OCk7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcyOTMpO1xudmFyIGFuSW5zdGFuY2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU3ODcpO1xudmFyIHRvSW50ZWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oOTk1OCk7XG52YXIgdG9MZW5ndGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc0NjYpO1xudmFyIHRvSW5kZXggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcwNjcpO1xudmFyIElFRUU3NTQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExNzkpO1xudmFyIGdldFByb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NTE4KTtcbnZhciBzZXRQcm90b3R5cGVPZiA9IF9fd2VicGFja19yZXF1aXJlX18oNzY3NCk7XG52YXIgZ2V0T3duUHJvcGVydHlOYW1lcyA9IF9fd2VicGFja19yZXF1aXJlX18oODAwNikuZjtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oMzA3MCkuZjtcbnZhciBhcnJheUZpbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyODUpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MDAzKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5OTA5KTtcblxudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldDtcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgQVJSQVlfQlVGRkVSID0gJ0FycmF5QnVmZmVyJztcbnZhciBEQVRBX1ZJRVcgPSAnRGF0YVZpZXcnO1xudmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xudmFyIFdST05HX0xFTkdUSCA9ICdXcm9uZyBsZW5ndGgnO1xudmFyIFdST05HX0lOREVYID0gJ1dyb25nIGluZGV4JztcbnZhciBOYXRpdmVBcnJheUJ1ZmZlciA9IGdsb2JhbFtBUlJBWV9CVUZGRVJdO1xudmFyICRBcnJheUJ1ZmZlciA9IE5hdGl2ZUFycmF5QnVmZmVyO1xudmFyICREYXRhVmlldyA9IGdsb2JhbFtEQVRBX1ZJRVddO1xudmFyICREYXRhVmlld1Byb3RvdHlwZSA9ICREYXRhVmlldyAmJiAkRGF0YVZpZXdbUFJPVE9UWVBFXTtcbnZhciBPYmplY3RQcm90b3R5cGUgPSBPYmplY3QucHJvdG90eXBlO1xudmFyIFJhbmdlRXJyb3IgPSBnbG9iYWwuUmFuZ2VFcnJvcjtcblxudmFyIHBhY2tJRUVFNzU0ID0gSUVFRTc1NC5wYWNrO1xudmFyIHVucGFja0lFRUU3NTQgPSBJRUVFNzU0LnVucGFjaztcblxudmFyIHBhY2tJbnQ4ID0gZnVuY3Rpb24gKG51bWJlcikge1xuICByZXR1cm4gW251bWJlciAmIDB4RkZdO1xufTtcblxudmFyIHBhY2tJbnQxNiA9IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgcmV0dXJuIFtudW1iZXIgJiAweEZGLCBudW1iZXIgPj4gOCAmIDB4RkZdO1xufTtcblxudmFyIHBhY2tJbnQzMiA9IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgcmV0dXJuIFtudW1iZXIgJiAweEZGLCBudW1iZXIgPj4gOCAmIDB4RkYsIG51bWJlciA+PiAxNiAmIDB4RkYsIG51bWJlciA+PiAyNCAmIDB4RkZdO1xufTtcblxudmFyIHVucGFja0ludDMyID0gZnVuY3Rpb24gKGJ1ZmZlcikge1xuICByZXR1cm4gYnVmZmVyWzNdIDw8IDI0IHwgYnVmZmVyWzJdIDw8IDE2IHwgYnVmZmVyWzFdIDw8IDggfCBidWZmZXJbMF07XG59O1xuXG52YXIgcGFja0Zsb2F0MzIgPSBmdW5jdGlvbiAobnVtYmVyKSB7XG4gIHJldHVybiBwYWNrSUVFRTc1NChudW1iZXIsIDIzLCA0KTtcbn07XG5cbnZhciBwYWNrRmxvYXQ2NCA9IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgcmV0dXJuIHBhY2tJRUVFNzU0KG51bWJlciwgNTIsIDgpO1xufTtcblxudmFyIGFkZEdldHRlciA9IGZ1bmN0aW9uIChDb25zdHJ1Y3Rvciwga2V5KSB7XG4gIGRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yW1BST1RPVFlQRV0sIGtleSwgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGdldEludGVybmFsU3RhdGUodGhpcylba2V5XTsgfSB9KTtcbn07XG5cbnZhciBnZXQgPSBmdW5jdGlvbiAodmlldywgY291bnQsIGluZGV4LCBpc0xpdHRsZUVuZGlhbikge1xuICB2YXIgaW50SW5kZXggPSB0b0luZGV4KGluZGV4KTtcbiAgdmFyIHN0b3JlID0gZ2V0SW50ZXJuYWxTdGF0ZSh2aWV3KTtcbiAgaWYgKGludEluZGV4ICsgY291bnQgPiBzdG9yZS5ieXRlTGVuZ3RoKSB0aHJvdyBSYW5nZUVycm9yKFdST05HX0lOREVYKTtcbiAgdmFyIGJ5dGVzID0gZ2V0SW50ZXJuYWxTdGF0ZShzdG9yZS5idWZmZXIpLmJ5dGVzO1xuICB2YXIgc3RhcnQgPSBpbnRJbmRleCArIHN0b3JlLmJ5dGVPZmZzZXQ7XG4gIHZhciBwYWNrID0gYnl0ZXMuc2xpY2Uoc3RhcnQsIHN0YXJ0ICsgY291bnQpO1xuICByZXR1cm4gaXNMaXR0bGVFbmRpYW4gPyBwYWNrIDogcGFjay5yZXZlcnNlKCk7XG59O1xuXG52YXIgc2V0ID0gZnVuY3Rpb24gKHZpZXcsIGNvdW50LCBpbmRleCwgY29udmVyc2lvbiwgdmFsdWUsIGlzTGl0dGxlRW5kaWFuKSB7XG4gIHZhciBpbnRJbmRleCA9IHRvSW5kZXgoaW5kZXgpO1xuICB2YXIgc3RvcmUgPSBnZXRJbnRlcm5hbFN0YXRlKHZpZXcpO1xuICBpZiAoaW50SW5kZXggKyBjb3VudCA+IHN0b3JlLmJ5dGVMZW5ndGgpIHRocm93IFJhbmdlRXJyb3IoV1JPTkdfSU5ERVgpO1xuICB2YXIgYnl0ZXMgPSBnZXRJbnRlcm5hbFN0YXRlKHN0b3JlLmJ1ZmZlcikuYnl0ZXM7XG4gIHZhciBzdGFydCA9IGludEluZGV4ICsgc3RvcmUuYnl0ZU9mZnNldDtcbiAgdmFyIHBhY2sgPSBjb252ZXJzaW9uKCt2YWx1ZSk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgYnl0ZXNbc3RhcnQgKyBpXSA9IHBhY2tbaXNMaXR0bGVFbmRpYW4gPyBpIDogY291bnQgLSBpIC0gMV07XG59O1xuXG5pZiAoIU5BVElWRV9BUlJBWV9CVUZGRVIpIHtcbiAgJEFycmF5QnVmZmVyID0gZnVuY3Rpb24gQXJyYXlCdWZmZXIobGVuZ3RoKSB7XG4gICAgYW5JbnN0YW5jZSh0aGlzLCAkQXJyYXlCdWZmZXIsIEFSUkFZX0JVRkZFUik7XG4gICAgdmFyIGJ5dGVMZW5ndGggPSB0b0luZGV4KGxlbmd0aCk7XG4gICAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgICBieXRlczogYXJyYXlGaWxsLmNhbGwobmV3IEFycmF5KGJ5dGVMZW5ndGgpLCAwKSxcbiAgICAgIGJ5dGVMZW5ndGg6IGJ5dGVMZW5ndGhcbiAgICB9KTtcbiAgICBpZiAoIURFU0NSSVBUT1JTKSB0aGlzLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoO1xuICB9O1xuXG4gICREYXRhVmlldyA9IGZ1bmN0aW9uIERhdGFWaWV3KGJ1ZmZlciwgYnl0ZU9mZnNldCwgYnl0ZUxlbmd0aCkge1xuICAgIGFuSW5zdGFuY2UodGhpcywgJERhdGFWaWV3LCBEQVRBX1ZJRVcpO1xuICAgIGFuSW5zdGFuY2UoYnVmZmVyLCAkQXJyYXlCdWZmZXIsIERBVEFfVklFVyk7XG4gICAgdmFyIGJ1ZmZlckxlbmd0aCA9IGdldEludGVybmFsU3RhdGUoYnVmZmVyKS5ieXRlTGVuZ3RoO1xuICAgIHZhciBvZmZzZXQgPSB0b0ludGVnZXIoYnl0ZU9mZnNldCk7XG4gICAgaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ID4gYnVmZmVyTGVuZ3RoKSB0aHJvdyBSYW5nZUVycm9yKCdXcm9uZyBvZmZzZXQnKTtcbiAgICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA9PT0gdW5kZWZpbmVkID8gYnVmZmVyTGVuZ3RoIC0gb2Zmc2V0IDogdG9MZW5ndGgoYnl0ZUxlbmd0aCk7XG4gICAgaWYgKG9mZnNldCArIGJ5dGVMZW5ndGggPiBidWZmZXJMZW5ndGgpIHRocm93IFJhbmdlRXJyb3IoV1JPTkdfTEVOR1RIKTtcbiAgICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHtcbiAgICAgIGJ1ZmZlcjogYnVmZmVyLFxuICAgICAgYnl0ZUxlbmd0aDogYnl0ZUxlbmd0aCxcbiAgICAgIGJ5dGVPZmZzZXQ6IG9mZnNldFxuICAgIH0pO1xuICAgIGlmICghREVTQ1JJUFRPUlMpIHtcbiAgICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyO1xuICAgICAgdGhpcy5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aDtcbiAgICAgIHRoaXMuYnl0ZU9mZnNldCA9IG9mZnNldDtcbiAgICB9XG4gIH07XG5cbiAgaWYgKERFU0NSSVBUT1JTKSB7XG4gICAgYWRkR2V0dGVyKCRBcnJheUJ1ZmZlciwgJ2J5dGVMZW5ndGgnKTtcbiAgICBhZGRHZXR0ZXIoJERhdGFWaWV3LCAnYnVmZmVyJyk7XG4gICAgYWRkR2V0dGVyKCREYXRhVmlldywgJ2J5dGVMZW5ndGgnKTtcbiAgICBhZGRHZXR0ZXIoJERhdGFWaWV3LCAnYnl0ZU9mZnNldCcpO1xuICB9XG5cbiAgcmVkZWZpbmVBbGwoJERhdGFWaWV3W1BST1RPVFlQRV0sIHtcbiAgICBnZXRJbnQ4OiBmdW5jdGlvbiBnZXRJbnQ4KGJ5dGVPZmZzZXQpIHtcbiAgICAgIHJldHVybiBnZXQodGhpcywgMSwgYnl0ZU9mZnNldClbMF0gPDwgMjQgPj4gMjQ7XG4gICAgfSxcbiAgICBnZXRVaW50ODogZnVuY3Rpb24gZ2V0VWludDgoYnl0ZU9mZnNldCkge1xuICAgICAgcmV0dXJuIGdldCh0aGlzLCAxLCBieXRlT2Zmc2V0KVswXTtcbiAgICB9LFxuICAgIGdldEludDE2OiBmdW5jdGlvbiBnZXRJbnQxNihieXRlT2Zmc2V0IC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICB2YXIgYnl0ZXMgPSBnZXQodGhpcywgMiwgYnl0ZU9mZnNldCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICAgICAgcmV0dXJuIChieXRlc1sxXSA8PCA4IHwgYnl0ZXNbMF0pIDw8IDE2ID4+IDE2O1xuICAgIH0sXG4gICAgZ2V0VWludDE2OiBmdW5jdGlvbiBnZXRVaW50MTYoYnl0ZU9mZnNldCAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgdmFyIGJ5dGVzID0gZ2V0KHRoaXMsIDIsIGJ5dGVPZmZzZXQsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgICAgIHJldHVybiBieXRlc1sxXSA8PCA4IHwgYnl0ZXNbMF07XG4gICAgfSxcbiAgICBnZXRJbnQzMjogZnVuY3Rpb24gZ2V0SW50MzIoYnl0ZU9mZnNldCAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgcmV0dXJuIHVucGFja0ludDMyKGdldCh0aGlzLCA0LCBieXRlT2Zmc2V0LCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCkpO1xuICAgIH0sXG4gICAgZ2V0VWludDMyOiBmdW5jdGlvbiBnZXRVaW50MzIoYnl0ZU9mZnNldCAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgcmV0dXJuIHVucGFja0ludDMyKGdldCh0aGlzLCA0LCBieXRlT2Zmc2V0LCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCkpID4+PiAwO1xuICAgIH0sXG4gICAgZ2V0RmxvYXQzMjogZnVuY3Rpb24gZ2V0RmxvYXQzMihieXRlT2Zmc2V0IC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICByZXR1cm4gdW5wYWNrSUVFRTc1NChnZXQodGhpcywgNCwgYnl0ZU9mZnNldCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpLCAyMyk7XG4gICAgfSxcbiAgICBnZXRGbG9hdDY0OiBmdW5jdGlvbiBnZXRGbG9hdDY0KGJ5dGVPZmZzZXQgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHJldHVybiB1bnBhY2tJRUVFNzU0KGdldCh0aGlzLCA4LCBieXRlT2Zmc2V0LCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCksIDUyKTtcbiAgICB9LFxuICAgIHNldEludDg6IGZ1bmN0aW9uIHNldEludDgoYnl0ZU9mZnNldCwgdmFsdWUpIHtcbiAgICAgIHNldCh0aGlzLCAxLCBieXRlT2Zmc2V0LCBwYWNrSW50OCwgdmFsdWUpO1xuICAgIH0sXG4gICAgc2V0VWludDg6IGZ1bmN0aW9uIHNldFVpbnQ4KGJ5dGVPZmZzZXQsIHZhbHVlKSB7XG4gICAgICBzZXQodGhpcywgMSwgYnl0ZU9mZnNldCwgcGFja0ludDgsIHZhbHVlKTtcbiAgICB9LFxuICAgIHNldEludDE2OiBmdW5jdGlvbiBzZXRJbnQxNihieXRlT2Zmc2V0LCB2YWx1ZSAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgc2V0KHRoaXMsIDIsIGJ5dGVPZmZzZXQsIHBhY2tJbnQxNiwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkKTtcbiAgICB9LFxuICAgIHNldFVpbnQxNjogZnVuY3Rpb24gc2V0VWludDE2KGJ5dGVPZmZzZXQsIHZhbHVlIC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICBzZXQodGhpcywgMiwgYnl0ZU9mZnNldCwgcGFja0ludDE2LCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQpO1xuICAgIH0sXG4gICAgc2V0SW50MzI6IGZ1bmN0aW9uIHNldEludDMyKGJ5dGVPZmZzZXQsIHZhbHVlIC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICBzZXQodGhpcywgNCwgYnl0ZU9mZnNldCwgcGFja0ludDMyLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQpO1xuICAgIH0sXG4gICAgc2V0VWludDMyOiBmdW5jdGlvbiBzZXRVaW50MzIoYnl0ZU9mZnNldCwgdmFsdWUgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHNldCh0aGlzLCA0LCBieXRlT2Zmc2V0LCBwYWNrSW50MzIsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZCk7XG4gICAgfSxcbiAgICBzZXRGbG9hdDMyOiBmdW5jdGlvbiBzZXRGbG9hdDMyKGJ5dGVPZmZzZXQsIHZhbHVlIC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICBzZXQodGhpcywgNCwgYnl0ZU9mZnNldCwgcGFja0Zsb2F0MzIsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZCk7XG4gICAgfSxcbiAgICBzZXRGbG9hdDY0OiBmdW5jdGlvbiBzZXRGbG9hdDY0KGJ5dGVPZmZzZXQsIHZhbHVlIC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICBzZXQodGhpcywgOCwgYnl0ZU9mZnNldCwgcGFja0Zsb2F0NjQsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZCk7XG4gICAgfVxuICB9KTtcbn0gZWxzZSB7XG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLW5ldyAtLSByZXF1aXJlZCBmb3IgdGVzdGluZyAqL1xuICBpZiAoIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICBOYXRpdmVBcnJheUJ1ZmZlcigxKTtcbiAgfSkgfHwgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICBuZXcgTmF0aXZlQXJyYXlCdWZmZXIoLTEpO1xuICB9KSB8fCBmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgbmV3IE5hdGl2ZUFycmF5QnVmZmVyKCk7XG4gICAgbmV3IE5hdGl2ZUFycmF5QnVmZmVyKDEuNSk7XG4gICAgbmV3IE5hdGl2ZUFycmF5QnVmZmVyKE5hTik7XG4gICAgcmV0dXJuIE5hdGl2ZUFycmF5QnVmZmVyLm5hbWUgIT0gQVJSQVlfQlVGRkVSO1xuICB9KSkge1xuICAvKiBlc2xpbnQtZW5hYmxlIG5vLW5ldyAtLSByZXF1aXJlZCBmb3IgdGVzdGluZyAqL1xuICAgICRBcnJheUJ1ZmZlciA9IGZ1bmN0aW9uIEFycmF5QnVmZmVyKGxlbmd0aCkge1xuICAgICAgYW5JbnN0YW5jZSh0aGlzLCAkQXJyYXlCdWZmZXIpO1xuICAgICAgcmV0dXJuIG5ldyBOYXRpdmVBcnJheUJ1ZmZlcih0b0luZGV4KGxlbmd0aCkpO1xuICAgIH07XG4gICAgdmFyIEFycmF5QnVmZmVyUHJvdG90eXBlID0gJEFycmF5QnVmZmVyW1BST1RPVFlQRV0gPSBOYXRpdmVBcnJheUJ1ZmZlcltQUk9UT1RZUEVdO1xuICAgIGZvciAodmFyIGtleXMgPSBnZXRPd25Qcm9wZXJ0eU5hbWVzKE5hdGl2ZUFycmF5QnVmZmVyKSwgaiA9IDAsIGtleTsga2V5cy5sZW5ndGggPiBqOykge1xuICAgICAgaWYgKCEoKGtleSA9IGtleXNbaisrXSkgaW4gJEFycmF5QnVmZmVyKSkge1xuICAgICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoJEFycmF5QnVmZmVyLCBrZXksIE5hdGl2ZUFycmF5QnVmZmVyW2tleV0pO1xuICAgICAgfVxuICAgIH1cbiAgICBBcnJheUJ1ZmZlclByb3RvdHlwZS5jb25zdHJ1Y3RvciA9ICRBcnJheUJ1ZmZlcjtcbiAgfVxuXG4gIC8vIFdlYktpdCBidWcgLSB0aGUgc2FtZSBwYXJlbnQgcHJvdG90eXBlIGZvciB0eXBlZCBhcnJheXMgYW5kIGRhdGEgdmlld1xuICBpZiAoc2V0UHJvdG90eXBlT2YgJiYgZ2V0UHJvdG90eXBlT2YoJERhdGFWaWV3UHJvdG90eXBlKSAhPT0gT2JqZWN0UHJvdG90eXBlKSB7XG4gICAgc2V0UHJvdG90eXBlT2YoJERhdGFWaWV3UHJvdG90eXBlLCBPYmplY3RQcm90b3R5cGUpO1xuICB9XG5cbiAgLy8gaU9TIFNhZmFyaSA3LnggYnVnXG4gIHZhciB0ZXN0VmlldyA9IG5ldyAkRGF0YVZpZXcobmV3ICRBcnJheUJ1ZmZlcigyKSk7XG4gIHZhciBuYXRpdmVTZXRJbnQ4ID0gJERhdGFWaWV3UHJvdG90eXBlLnNldEludDg7XG4gIHRlc3RWaWV3LnNldEludDgoMCwgMjE0NzQ4MzY0OCk7XG4gIHRlc3RWaWV3LnNldEludDgoMSwgMjE0NzQ4MzY0OSk7XG4gIGlmICh0ZXN0Vmlldy5nZXRJbnQ4KDApIHx8ICF0ZXN0Vmlldy5nZXRJbnQ4KDEpKSByZWRlZmluZUFsbCgkRGF0YVZpZXdQcm90b3R5cGUsIHtcbiAgICBzZXRJbnQ4OiBmdW5jdGlvbiBzZXRJbnQ4KGJ5dGVPZmZzZXQsIHZhbHVlKSB7XG4gICAgICBuYXRpdmVTZXRJbnQ4LmNhbGwodGhpcywgYnl0ZU9mZnNldCwgdmFsdWUgPDwgMjQgPj4gMjQpO1xuICAgIH0sXG4gICAgc2V0VWludDg6IGZ1bmN0aW9uIHNldFVpbnQ4KGJ5dGVPZmZzZXQsIHZhbHVlKSB7XG4gICAgICBuYXRpdmVTZXRJbnQ4LmNhbGwodGhpcywgYnl0ZU9mZnNldCwgdmFsdWUgPDwgMjQgPj4gMjQpO1xuICAgIH1cbiAgfSwgeyB1bnNhZmU6IHRydWUgfSk7XG59XG5cbnNldFRvU3RyaW5nVGFnKCRBcnJheUJ1ZmZlciwgQVJSQVlfQlVGRkVSKTtcbnNldFRvU3RyaW5nVGFnKCREYXRhVmlldywgREFUQV9WSUVXKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEFycmF5QnVmZmVyOiAkQXJyYXlCdWZmZXIsXG4gIERhdGFWaWV3OiAkRGF0YVZpZXdcbn07XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDEwNDg6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oNzkwOCk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDAwKTtcbnZhciB0b0xlbmd0aCA9IF9fd2VicGFja19yZXF1aXJlX18oNzQ2Nik7XG5cbnZhciBtaW4gPSBNYXRoLm1pbjtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5jb3B5V2l0aGluYCBtZXRob2QgaW1wbGVtZW50YXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmNvcHl3aXRoaW5cbm1vZHVsZS5leHBvcnRzID0gW10uY29weVdpdGhpbiB8fCBmdW5jdGlvbiBjb3B5V2l0aGluKHRhcmdldCAvKiA9IDAgKi8sIHN0YXJ0IC8qID0gMCwgZW5kID0gQGxlbmd0aCAqLykge1xuICB2YXIgTyA9IHRvT2JqZWN0KHRoaXMpO1xuICB2YXIgbGVuID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICB2YXIgdG8gPSB0b0Fic29sdXRlSW5kZXgodGFyZ2V0LCBsZW4pO1xuICB2YXIgZnJvbSA9IHRvQWJzb2x1dGVJbmRleChzdGFydCwgbGVuKTtcbiAgdmFyIGVuZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkO1xuICB2YXIgY291bnQgPSBtaW4oKGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuIDogdG9BYnNvbHV0ZUluZGV4KGVuZCwgbGVuKSkgLSBmcm9tLCBsZW4gLSB0byk7XG4gIHZhciBpbmMgPSAxO1xuICBpZiAoZnJvbSA8IHRvICYmIHRvIDwgZnJvbSArIGNvdW50KSB7XG4gICAgaW5jID0gLTE7XG4gICAgZnJvbSArPSBjb3VudCAtIDE7XG4gICAgdG8gKz0gY291bnQgLSAxO1xuICB9XG4gIHdoaWxlIChjb3VudC0tID4gMCkge1xuICAgIGlmIChmcm9tIGluIE8pIE9bdG9dID0gT1tmcm9tXTtcbiAgICBlbHNlIGRlbGV0ZSBPW3RvXTtcbiAgICB0byArPSBpbmM7XG4gICAgZnJvbSArPSBpbmM7XG4gIH0gcmV0dXJuIE87XG59O1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyAxMjg1OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG52YXIgdG9PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5MDgpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IF9fd2VicGFja19yZXF1aXJlX18oMTQwMCk7XG52YXIgdG9MZW5ndGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc0NjYpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmZpbGxgIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZmlsbFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmaWxsKHZhbHVlIC8qICwgc3RhcnQgPSAwLCBlbmQgPSBAbGVuZ3RoICovKSB7XG4gIHZhciBPID0gdG9PYmplY3QodGhpcyk7XG4gIHZhciBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gIHZhciBhcmd1bWVudHNMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgaW5kZXggPSB0b0Fic29sdXRlSW5kZXgoYXJndW1lbnRzTGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgbGVuZ3RoKTtcbiAgdmFyIGVuZCA9IGFyZ3VtZW50c0xlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQ7XG4gIHZhciBlbmRQb3MgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IHRvQWJzb2x1dGVJbmRleChlbmQsIGxlbmd0aCk7XG4gIHdoaWxlIChlbmRQb3MgPiBpbmRleCkgT1tpbmRleCsrXSA9IHZhbHVlO1xuICByZXR1cm4gTztcbn07XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDg1MzM6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciAkZm9yRWFjaCA9IF9fd2VicGFja19yZXF1aXJlX18oMjA5MikuZm9yRWFjaDtcbnZhciBhcnJheU1ldGhvZElzU3RyaWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5MzQxKTtcblxudmFyIFNUUklDVF9NRVRIT0QgPSBhcnJheU1ldGhvZElzU3RyaWN0KCdmb3JFYWNoJyk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuZm9yRWFjaGAgbWV0aG9kIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5mb3JlYWNoXG5tb2R1bGUuZXhwb3J0cyA9ICFTVFJJQ1RfTUVUSE9EID8gZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICByZXR1cm4gJGZvckVhY2godGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xufSA6IFtdLmZvckVhY2g7XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDg0NTc6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBiaW5kID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5OTc0KTtcbnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oNzkwOCk7XG52YXIgY2FsbFdpdGhTYWZlSXRlcmF0aW9uQ2xvc2luZyA9IF9fd2VicGFja19yZXF1aXJlX18oMzQxMSk7XG52YXIgaXNBcnJheUl0ZXJhdG9yTWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NjU5KTtcbnZhciB0b0xlbmd0aCA9IF9fd2VicGFja19yZXF1aXJlX18oNzQ2Nik7XG52YXIgY3JlYXRlUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYxMzUpO1xudmFyIGdldEl0ZXJhdG9yTWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMjQ2KTtcblxuLy8gYEFycmF5LmZyb21gIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5mcm9tXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGZyb20oYXJyYXlMaWtlIC8qICwgbWFwZm4gPSB1bmRlZmluZWQsIHRoaXNBcmcgPSB1bmRlZmluZWQgKi8pIHtcbiAgdmFyIE8gPSB0b09iamVjdChhcnJheUxpa2UpO1xuICB2YXIgQyA9IHR5cGVvZiB0aGlzID09ICdmdW5jdGlvbicgPyB0aGlzIDogQXJyYXk7XG4gIHZhciBhcmd1bWVudHNMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgbWFwZm4gPSBhcmd1bWVudHNMZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuICB2YXIgbWFwcGluZyA9IG1hcGZuICE9PSB1bmRlZmluZWQ7XG4gIHZhciBpdGVyYXRvck1ldGhvZCA9IGdldEl0ZXJhdG9yTWV0aG9kKE8pO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgbGVuZ3RoLCByZXN1bHQsIHN0ZXAsIGl0ZXJhdG9yLCBuZXh0LCB2YWx1ZTtcbiAgaWYgKG1hcHBpbmcpIG1hcGZuID0gYmluZChtYXBmbiwgYXJndW1lbnRzTGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZCwgMik7XG4gIC8vIGlmIHRoZSB0YXJnZXQgaXMgbm90IGl0ZXJhYmxlIG9yIGl0J3MgYW4gYXJyYXkgd2l0aCB0aGUgZGVmYXVsdCBpdGVyYXRvciAtIHVzZSBhIHNpbXBsZSBjYXNlXG4gIGlmIChpdGVyYXRvck1ldGhvZCAhPSB1bmRlZmluZWQgJiYgIShDID09IEFycmF5ICYmIGlzQXJyYXlJdGVyYXRvck1ldGhvZChpdGVyYXRvck1ldGhvZCkpKSB7XG4gICAgaXRlcmF0b3IgPSBpdGVyYXRvck1ldGhvZC5jYWxsKE8pO1xuICAgIG5leHQgPSBpdGVyYXRvci5uZXh0O1xuICAgIHJlc3VsdCA9IG5ldyBDKCk7XG4gICAgZm9yICg7IShzdGVwID0gbmV4dC5jYWxsKGl0ZXJhdG9yKSkuZG9uZTsgaW5kZXgrKykge1xuICAgICAgdmFsdWUgPSBtYXBwaW5nID8gY2FsbFdpdGhTYWZlSXRlcmF0aW9uQ2xvc2luZyhpdGVyYXRvciwgbWFwZm4sIFtzdGVwLnZhbHVlLCBpbmRleF0sIHRydWUpIDogc3RlcC52YWx1ZTtcbiAgICAgIGNyZWF0ZVByb3BlcnR5KHJlc3VsdCwgaW5kZXgsIHZhbHVlKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICAgIHJlc3VsdCA9IG5ldyBDKGxlbmd0aCk7XG4gICAgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIHtcbiAgICAgIHZhbHVlID0gbWFwcGluZyA/IG1hcGZuKE9baW5kZXhdLCBpbmRleCkgOiBPW2luZGV4XTtcbiAgICAgIGNyZWF0ZVByb3BlcnR5KHJlc3VsdCwgaW5kZXgsIHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmVzdWx0Lmxlbmd0aCA9IGluZGV4O1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gMTMxODpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgdG9JbmRleGVkT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NjU2KTtcbnZhciB0b0xlbmd0aCA9IF9fd2VicGFja19yZXF1aXJlX18oNzQ2Nik7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDAwKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS57IGluZGV4T2YsIGluY2x1ZGVzIH1gIG1ldGhvZHMgaW1wbGVtZW50YXRpb25cbnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoSVNfSU5DTFVERVMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgZWwsIGZyb21JbmRleCkge1xuICAgIHZhciBPID0gdG9JbmRleGVkT2JqZWN0KCR0aGlzKTtcbiAgICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICAgIHZhciBpbmRleCA9IHRvQWJzb2x1dGVJbmRleChmcm9tSW5kZXgsIGxlbmd0aCk7XG4gICAgdmFyIHZhbHVlO1xuICAgIC8vIEFycmF5I2luY2x1ZGVzIHVzZXMgU2FtZVZhbHVlWmVybyBlcXVhbGl0eSBhbGdvcml0aG1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIE5hTiBjaGVja1xuICAgIGlmIChJU19JTkNMVURFUyAmJiBlbCAhPSBlbCkgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSB7XG4gICAgICB2YWx1ZSA9IE9baW5kZXgrK107XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIE5hTiBjaGVja1xuICAgICAgaWYgKHZhbHVlICE9IHZhbHVlKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBBcnJheSNpbmRleE9mIGlnbm9yZXMgaG9sZXMsIEFycmF5I2luY2x1ZGVzIC0gbm90XG4gICAgfSBlbHNlIGZvciAoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgICBpZiAoKElTX0lOQ0xVREVTIHx8IGluZGV4IGluIE8pICYmIE9baW5kZXhdID09PSBlbCkgcmV0dXJuIElTX0lOQ0xVREVTIHx8IGluZGV4IHx8IDA7XG4gICAgfSByZXR1cm4gIUlTX0lOQ0xVREVTICYmIC0xO1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIGBBcnJheS5wcm90b3R5cGUuaW5jbHVkZXNgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5pbmNsdWRlc1xuICBpbmNsdWRlczogY3JlYXRlTWV0aG9kKHRydWUpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmluZGV4T2ZgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5pbmRleG9mXG4gIGluZGV4T2Y6IGNyZWF0ZU1ldGhvZChmYWxzZSlcbn07XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDIwOTI6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIGJpbmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk5NzQpO1xudmFyIEluZGV4ZWRPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgzNjEpO1xudmFyIHRvT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OTA4KTtcbnZhciB0b0xlbmd0aCA9IF9fd2VicGFja19yZXF1aXJlX18oNzQ2Nik7XG52YXIgYXJyYXlTcGVjaWVzQ3JlYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NDE3KTtcblxudmFyIHB1c2ggPSBbXS5wdXNoO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLnsgZm9yRWFjaCwgbWFwLCBmaWx0ZXIsIHNvbWUsIGV2ZXJ5LCBmaW5kLCBmaW5kSW5kZXgsIGZpbHRlck91dCB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKFRZUEUpIHtcbiAgdmFyIElTX01BUCA9IFRZUEUgPT0gMTtcbiAgdmFyIElTX0ZJTFRFUiA9IFRZUEUgPT0gMjtcbiAgdmFyIElTX1NPTUUgPSBUWVBFID09IDM7XG4gIHZhciBJU19FVkVSWSA9IFRZUEUgPT0gNDtcbiAgdmFyIElTX0ZJTkRfSU5ERVggPSBUWVBFID09IDY7XG4gIHZhciBJU19GSUxURVJfT1VUID0gVFlQRSA9PSA3O1xuICB2YXIgTk9fSE9MRVMgPSBUWVBFID09IDUgfHwgSVNfRklORF9JTkRFWDtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgY2FsbGJhY2tmbiwgdGhhdCwgc3BlY2lmaWNDcmVhdGUpIHtcbiAgICB2YXIgTyA9IHRvT2JqZWN0KCR0aGlzKTtcbiAgICB2YXIgc2VsZiA9IEluZGV4ZWRPYmplY3QoTyk7XG4gICAgdmFyIGJvdW5kRnVuY3Rpb24gPSBiaW5kKGNhbGxiYWNrZm4sIHRoYXQsIDMpO1xuICAgIHZhciBsZW5ndGggPSB0b0xlbmd0aChzZWxmLmxlbmd0aCk7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgY3JlYXRlID0gc3BlY2lmaWNDcmVhdGUgfHwgYXJyYXlTcGVjaWVzQ3JlYXRlO1xuICAgIHZhciB0YXJnZXQgPSBJU19NQVAgPyBjcmVhdGUoJHRoaXMsIGxlbmd0aCkgOiBJU19GSUxURVIgfHwgSVNfRklMVEVSX09VVCA/IGNyZWF0ZSgkdGhpcywgMCkgOiB1bmRlZmluZWQ7XG4gICAgdmFyIHZhbHVlLCByZXN1bHQ7XG4gICAgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIGlmIChOT19IT0xFUyB8fCBpbmRleCBpbiBzZWxmKSB7XG4gICAgICB2YWx1ZSA9IHNlbGZbaW5kZXhdO1xuICAgICAgcmVzdWx0ID0gYm91bmRGdW5jdGlvbih2YWx1ZSwgaW5kZXgsIE8pO1xuICAgICAgaWYgKFRZUEUpIHtcbiAgICAgICAgaWYgKElTX01BUCkgdGFyZ2V0W2luZGV4XSA9IHJlc3VsdDsgLy8gbWFwXG4gICAgICAgIGVsc2UgaWYgKHJlc3VsdCkgc3dpdGNoIChUWVBFKSB7XG4gICAgICAgICAgY2FzZSAzOiByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgIC8vIHNvbWVcbiAgICAgICAgICBjYXNlIDU6IHJldHVybiB2YWx1ZTsgICAgICAgICAgICAgLy8gZmluZFxuICAgICAgICAgIGNhc2UgNjogcmV0dXJuIGluZGV4OyAgICAgICAgICAgICAvLyBmaW5kSW5kZXhcbiAgICAgICAgICBjYXNlIDI6IHB1c2guY2FsbCh0YXJnZXQsIHZhbHVlKTsgLy8gZmlsdGVyXG4gICAgICAgIH0gZWxzZSBzd2l0Y2ggKFRZUEUpIHtcbiAgICAgICAgICBjYXNlIDQ6IHJldHVybiBmYWxzZTsgICAgICAgICAgICAgLy8gZXZlcnlcbiAgICAgICAgICBjYXNlIDc6IHB1c2guY2FsbCh0YXJnZXQsIHZhbHVlKTsgLy8gZmlsdGVyT3V0XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIElTX0ZJTkRfSU5ERVggPyAtMSA6IElTX1NPTUUgfHwgSVNfRVZFUlkgPyBJU19FVkVSWSA6IHRhcmdldDtcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBgQXJyYXkucHJvdG90eXBlLmZvckVhY2hgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5mb3JlYWNoXG4gIGZvckVhY2g6IGNyZWF0ZU1ldGhvZCgwKSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5tYXBgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5tYXBcbiAgbWFwOiBjcmVhdGVNZXRob2QoMSksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuZmlsdGVyYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZmlsdGVyXG4gIGZpbHRlcjogY3JlYXRlTWV0aG9kKDIpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLnNvbWVgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5zb21lXG4gIHNvbWU6IGNyZWF0ZU1ldGhvZCgzKSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5ldmVyeWAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmV2ZXJ5XG4gIGV2ZXJ5OiBjcmVhdGVNZXRob2QoNCksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuZmluZGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZpbmRcbiAgZmluZDogY3JlYXRlTWV0aG9kKDUpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmZpbmRJbmRleGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZpbmRJbmRleFxuICBmaW5kSW5kZXg6IGNyZWF0ZU1ldGhvZCg2KSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5maWx0ZXJPdXRgIG1ldGhvZFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1hcnJheS1maWx0ZXJpbmdcbiAgZmlsdGVyT3V0OiBjcmVhdGVNZXRob2QoNylcbn07XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDY1ODM6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciB0b0luZGV4ZWRPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU2NTYpO1xudmFyIHRvSW50ZWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oOTk1OCk7XG52YXIgdG9MZW5ndGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc0NjYpO1xudmFyIGFycmF5TWV0aG9kSXNTdHJpY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkzNDEpO1xuXG52YXIgbWluID0gTWF0aC5taW47XG52YXIgbmF0aXZlTGFzdEluZGV4T2YgPSBbXS5sYXN0SW5kZXhPZjtcbnZhciBORUdBVElWRV9aRVJPID0gISFuYXRpdmVMYXN0SW5kZXhPZiAmJiAxIC8gWzFdLmxhc3RJbmRleE9mKDEsIC0wKSA8IDA7XG52YXIgU1RSSUNUX01FVEhPRCA9IGFycmF5TWV0aG9kSXNTdHJpY3QoJ2xhc3RJbmRleE9mJyk7XG52YXIgRk9SQ0VEID0gTkVHQVRJVkVfWkVSTyB8fCAhU1RSSUNUX01FVEhPRDtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZmAgbWV0aG9kIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5sYXN0aW5kZXhvZlxubW9kdWxlLmV4cG9ydHMgPSBGT1JDRUQgPyBmdW5jdGlvbiBsYXN0SW5kZXhPZihzZWFyY2hFbGVtZW50IC8qICwgZnJvbUluZGV4ID0gQFsqLTFdICovKSB7XG4gIC8vIGNvbnZlcnQgLTAgdG8gKzBcbiAgaWYgKE5FR0FUSVZFX1pFUk8pIHJldHVybiBuYXRpdmVMYXN0SW5kZXhPZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IDA7XG4gIHZhciBPID0gdG9JbmRleGVkT2JqZWN0KHRoaXMpO1xuICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICB2YXIgaW5kZXggPSBsZW5ndGggLSAxO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIGluZGV4ID0gbWluKGluZGV4LCB0b0ludGVnZXIoYXJndW1lbnRzWzFdKSk7XG4gIGlmIChpbmRleCA8IDApIGluZGV4ID0gbGVuZ3RoICsgaW5kZXg7XG4gIGZvciAoO2luZGV4ID49IDA7IGluZGV4LS0pIGlmIChpbmRleCBpbiBPICYmIE9baW5kZXhdID09PSBzZWFyY2hFbGVtZW50KSByZXR1cm4gaW5kZXggfHwgMDtcbiAgcmV0dXJuIC0xO1xufSA6IG5hdGl2ZUxhc3RJbmRleE9mO1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyAxMTk0OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNzI5Myk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1MTEyKTtcbnZhciBWOF9WRVJTSU9OID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3MzkyKTtcblxudmFyIFNQRUNJRVMgPSB3ZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTUVUSE9EX05BTUUpIHtcbiAgLy8gV2UgY2FuJ3QgdXNlIHRoaXMgZmVhdHVyZSBkZXRlY3Rpb24gaW4gVjggc2luY2UgaXQgY2F1c2VzXG4gIC8vIGRlb3B0aW1pemF0aW9uIGFuZCBzZXJpb3VzIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy82NzdcbiAgcmV0dXJuIFY4X1ZFUlNJT04gPj0gNTEgfHwgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYXJyYXkgPSBbXTtcbiAgICB2YXIgY29uc3RydWN0b3IgPSBhcnJheS5jb25zdHJ1Y3RvciA9IHt9O1xuICAgIGNvbnN0cnVjdG9yW1NQRUNJRVNdID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHsgZm9vOiAxIH07XG4gICAgfTtcbiAgICByZXR1cm4gYXJyYXlbTUVUSE9EX05BTUVdKEJvb2xlYW4pLmZvbyAhPT0gMTtcbiAgfSk7XG59O1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA5MzQxOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcyOTMpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChNRVRIT0RfTkFNRSwgYXJndW1lbnQpIHtcbiAgdmFyIG1ldGhvZCA9IFtdW01FVEhPRF9OQU1FXTtcbiAgcmV0dXJuICEhbWV0aG9kICYmIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlbGVzcy1jYWxsLG5vLXRocm93LWxpdGVyYWwgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgICBtZXRob2QuY2FsbChudWxsLCBhcmd1bWVudCB8fCBmdW5jdGlvbiAoKSB7IHRocm93IDE7IH0sIDEpO1xuICB9KTtcbn07XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDM2NzE6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIGFGdW5jdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oMzA5OSk7XG52YXIgdG9PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5MDgpO1xudmFyIEluZGV4ZWRPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgzNjEpO1xudmFyIHRvTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NDY2KTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS57IHJlZHVjZSwgcmVkdWNlUmlnaHQgfWAgbWV0aG9kcyBpbXBsZW1lbnRhdGlvblxudmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChJU19SSUdIVCkge1xuICByZXR1cm4gZnVuY3Rpb24gKHRoYXQsIGNhbGxiYWNrZm4sIGFyZ3VtZW50c0xlbmd0aCwgbWVtbykge1xuICAgIGFGdW5jdGlvbihjYWxsYmFja2ZuKTtcbiAgICB2YXIgTyA9IHRvT2JqZWN0KHRoYXQpO1xuICAgIHZhciBzZWxmID0gSW5kZXhlZE9iamVjdChPKTtcbiAgICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICAgIHZhciBpbmRleCA9IElTX1JJR0hUID8gbGVuZ3RoIC0gMSA6IDA7XG4gICAgdmFyIGkgPSBJU19SSUdIVCA/IC0xIDogMTtcbiAgICBpZiAoYXJndW1lbnRzTGVuZ3RoIDwgMikgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmIChpbmRleCBpbiBzZWxmKSB7XG4gICAgICAgIG1lbW8gPSBzZWxmW2luZGV4XTtcbiAgICAgICAgaW5kZXggKz0gaTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpbmRleCArPSBpO1xuICAgICAgaWYgKElTX1JJR0hUID8gaW5kZXggPCAwIDogbGVuZ3RoIDw9IGluZGV4KSB7XG4gICAgICAgIHRocm93IFR5cGVFcnJvcignUmVkdWNlIG9mIGVtcHR5IGFycmF5IHdpdGggbm8gaW5pdGlhbCB2YWx1ZScpO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKDtJU19SSUdIVCA/IGluZGV4ID49IDAgOiBsZW5ndGggPiBpbmRleDsgaW5kZXggKz0gaSkgaWYgKGluZGV4IGluIHNlbGYpIHtcbiAgICAgIG1lbW8gPSBjYWxsYmFja2ZuKG1lbW8sIHNlbGZbaW5kZXhdLCBpbmRleCwgTyk7XG4gICAgfVxuICAgIHJldHVybiBtZW1vO1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIGBBcnJheS5wcm90b3R5cGUucmVkdWNlYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUucmVkdWNlXG4gIGxlZnQ6IGNyZWF0ZU1ldGhvZChmYWxzZSksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUucmVkdWNlUmlnaHRgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5yZWR1Y2VyaWdodFxuICByaWdodDogY3JlYXRlTWV0aG9kKHRydWUpXG59O1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA1NDE3OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTExKTtcbnZhciBpc0FycmF5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMTU3KTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUxMTIpO1xuXG52YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpO1xuXG4vLyBgQXJyYXlTcGVjaWVzQ3JlYXRlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXlzcGVjaWVzY3JlYXRlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvcmlnaW5hbEFycmF5LCBsZW5ndGgpIHtcbiAgdmFyIEM7XG4gIGlmIChpc0FycmF5KG9yaWdpbmFsQXJyYXkpKSB7XG4gICAgQyA9IG9yaWdpbmFsQXJyYXkuY29uc3RydWN0b3I7XG4gICAgLy8gY3Jvc3MtcmVhbG0gZmFsbGJhY2tcbiAgICBpZiAodHlwZW9mIEMgPT0gJ2Z1bmN0aW9uJyAmJiAoQyA9PT0gQXJyYXkgfHwgaXNBcnJheShDLnByb3RvdHlwZSkpKSBDID0gdW5kZWZpbmVkO1xuICAgIGVsc2UgaWYgKGlzT2JqZWN0KEMpKSB7XG4gICAgICBDID0gQ1tTUEVDSUVTXTtcbiAgICAgIGlmIChDID09PSBudWxsKSBDID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfSByZXR1cm4gbmV3IChDID09PSB1bmRlZmluZWQgPyBBcnJheSA6IEMpKGxlbmd0aCA9PT0gMCA/IDAgOiBsZW5ndGgpO1xufTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gMzQxMTpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk2NzApO1xudmFyIGl0ZXJhdG9yQ2xvc2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkyMTIpO1xuXG4vLyBjYWxsIHNvbWV0aGluZyBvbiBpdGVyYXRvciBzdGVwIHdpdGggc2FmZSBjbG9zaW5nIG9uIGVycm9yXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYXRvciwgZm4sIHZhbHVlLCBFTlRSSUVTKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEVOVFJJRVMgPyBmbihhbk9iamVjdCh2YWx1ZSlbMF0sIHZhbHVlWzFdKSA6IGZuKHZhbHVlKTtcbiAgLy8gNy40LjYgSXRlcmF0b3JDbG9zZShpdGVyYXRvciwgY29tcGxldGlvbilcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpdGVyYXRvckNsb3NlKGl0ZXJhdG9yKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gNzA3Mjpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1MTEyKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIFNBRkVfQ0xPU0lORyA9IGZhbHNlO1xuXG50cnkge1xuICB2YXIgY2FsbGVkID0gMDtcbiAgdmFyIGl0ZXJhdG9yV2l0aFJldHVybiA9IHtcbiAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4geyBkb25lOiAhIWNhbGxlZCsrIH07XG4gICAgfSxcbiAgICAncmV0dXJuJzogZnVuY3Rpb24gKCkge1xuICAgICAgU0FGRV9DTE9TSU5HID0gdHJ1ZTtcbiAgICB9XG4gIH07XG4gIGl0ZXJhdG9yV2l0aFJldHVybltJVEVSQVRPUl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby10aHJvdy1saXRlcmFsIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gIEFycmF5LmZyb20oaXRlcmF0b3JXaXRoUmV0dXJuLCBmdW5jdGlvbiAoKSB7IHRocm93IDI7IH0pO1xufSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjLCBTS0lQX0NMT1NJTkcpIHtcbiAgaWYgKCFTS0lQX0NMT1NJTkcgJiYgIVNBRkVfQ0xPU0lORykgcmV0dXJuIGZhbHNlO1xuICB2YXIgSVRFUkFUSU9OX1NVUFBPUlQgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICB2YXIgb2JqZWN0ID0ge307XG4gICAgb2JqZWN0W0lURVJBVE9SXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4geyBkb25lOiBJVEVSQVRJT05fU1VQUE9SVCA9IHRydWUgfTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuICAgIGV4ZWMob2JqZWN0KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICByZXR1cm4gSVRFUkFUSU9OX1NVUFBPUlQ7XG59O1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA0MzI2OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSkge1xuXG52YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoaXQpLnNsaWNlKDgsIC0xKTtcbn07XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDY0ODpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgVE9fU1RSSU5HX1RBR19TVVBQT1JUID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNjk0KTtcbnZhciBjbGFzc29mUmF3ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MzI2KTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUxMTIpO1xuXG52YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTtcbi8vIEVTMyB3cm9uZyBoZXJlXG52YXIgQ09SUkVDVF9BUkdVTUVOVFMgPSBjbGFzc29mUmF3KGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKSA9PSAnQXJndW1lbnRzJztcblxuLy8gZmFsbGJhY2sgZm9yIElFMTEgU2NyaXB0IEFjY2VzcyBEZW5pZWQgZXJyb3JcbnZhciB0cnlHZXQgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICB0cnkge1xuICAgIHJldHVybiBpdFtrZXldO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG59O1xuXG4vLyBnZXR0aW5nIHRhZyBmcm9tIEVTNisgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgXG5tb2R1bGUuZXhwb3J0cyA9IFRPX1NUUklOR19UQUdfU1VQUE9SVCA/IGNsYXNzb2ZSYXcgOiBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIE8sIHRhZywgcmVzdWx0O1xuICByZXR1cm4gaXQgPT09IHVuZGVmaW5lZCA/ICdVbmRlZmluZWQnIDogaXQgPT09IG51bGwgPyAnTnVsbCdcbiAgICAvLyBAQHRvU3RyaW5nVGFnIGNhc2VcbiAgICA6IHR5cGVvZiAodGFnID0gdHJ5R2V0KE8gPSBPYmplY3QoaXQpLCBUT19TVFJJTkdfVEFHKSkgPT0gJ3N0cmluZycgPyB0YWdcbiAgICAvLyBidWlsdGluVGFnIGNhc2VcbiAgICA6IENPUlJFQ1RfQVJHVU1FTlRTID8gY2xhc3NvZlJhdyhPKVxuICAgIC8vIEVTMyBhcmd1bWVudHMgZmFsbGJhY2tcbiAgICA6IChyZXN1bHQgPSBjbGFzc29mUmF3KE8pKSA9PSAnT2JqZWN0JyAmJiB0eXBlb2YgTy5jYWxsZWUgPT0gJ2Z1bmN0aW9uJyA/ICdBcmd1bWVudHMnIDogcmVzdWx0O1xufTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gOTkyMDpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgaGFzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NjU2KTtcbnZhciBvd25LZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygzODg3KTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyMzYpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMDcwKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGFyZ2V0LCBzb3VyY2UpIHtcbiAgdmFyIGtleXMgPSBvd25LZXlzKHNvdXJjZSk7XG4gIHZhciBkZWZpbmVQcm9wZXJ0eSA9IGRlZmluZVByb3BlcnR5TW9kdWxlLmY7XG4gIHZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUuZjtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgaWYgKCFoYXModGFyZ2V0LCBrZXkpKSBkZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gIH1cbn07XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDg1NDQ6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3MjkzKTtcblxubW9kdWxlLmV4cG9ydHMgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBGKCkgeyAvKiBlbXB0eSAqLyB9XG4gIEYucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gbnVsbDtcbiAgcmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZihuZXcgRigpKSAhPT0gRi5wcm90b3R5cGU7XG59KTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gNDk5NDpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxudmFyIEl0ZXJhdG9yUHJvdG90eXBlID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMzgzKS5JdGVyYXRvclByb3RvdHlwZTtcbnZhciBjcmVhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMwKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkxMTQpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MDAzKTtcbnZhciBJdGVyYXRvcnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc0OTcpO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEl0ZXJhdG9yQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpIHtcbiAgdmFyIFRPX1NUUklOR19UQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7XG4gIEl0ZXJhdG9yQ29uc3RydWN0b3IucHJvdG90eXBlID0gY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlLCB7IG5leHQ6IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigxLCBuZXh0KSB9KTtcbiAgc2V0VG9TdHJpbmdUYWcoSXRlcmF0b3JDb25zdHJ1Y3RvciwgVE9fU1RSSU5HX1RBRywgZmFsc2UsIHRydWUpO1xuICBJdGVyYXRvcnNbVE9fU1RSSU5HX1RBR10gPSByZXR1cm5UaGlzO1xuICByZXR1cm4gSXRlcmF0b3JDb25zdHJ1Y3Rvcjtcbn07XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDg4ODA6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NzgxKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oMzA3MCk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5MTE0KTtcblxubW9kdWxlLmV4cG9ydHMgPSBERVNDUklQVE9SUyA/IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIGRlZmluZVByb3BlcnR5TW9kdWxlLmYob2JqZWN0LCBrZXksIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigxLCB2YWx1ZSkpO1xufSA6IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iamVjdDtcbn07XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDkxMTQ6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGJpdG1hcCwgdmFsdWUpIHtcbiAgcmV0dXJuIHtcbiAgICBlbnVtZXJhYmxlOiAhKGJpdG1hcCAmIDEpLFxuICAgIGNvbmZpZ3VyYWJsZTogIShiaXRtYXAgJiAyKSxcbiAgICB3cml0YWJsZTogIShiaXRtYXAgJiA0KSxcbiAgICB2YWx1ZTogdmFsdWVcbiAgfTtcbn07XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDYxMzU6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciB0b1ByaW1pdGl2ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzU5Myk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMwNzApO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IF9fd2VicGFja19yZXF1aXJlX18oOTExNCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICB2YXIgcHJvcGVydHlLZXkgPSB0b1ByaW1pdGl2ZShrZXkpO1xuICBpZiAocHJvcGVydHlLZXkgaW4gb2JqZWN0KSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKG9iamVjdCwgcHJvcGVydHlLZXksIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigwLCB2YWx1ZSkpO1xuICBlbHNlIG9iamVjdFtwcm9wZXJ0eUtleV0gPSB2YWx1ZTtcbn07XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDY1NDpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxMDkpO1xudmFyIGNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ5OTQpO1xudmFyIGdldFByb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NTE4KTtcbnZhciBzZXRQcm90b3R5cGVPZiA9IF9fd2VicGFja19yZXF1aXJlX18oNzY3NCk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgwMDMpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oODg4MCk7XG52YXIgcmVkZWZpbmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzMjApO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oNTExMik7XG52YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oMTkxMyk7XG52YXIgSXRlcmF0b3JzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NDk3KTtcbnZhciBJdGVyYXRvcnNDb3JlID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMzgzKTtcblxudmFyIEl0ZXJhdG9yUHJvdG90eXBlID0gSXRlcmF0b3JzQ29yZS5JdGVyYXRvclByb3RvdHlwZTtcbnZhciBCVUdHWV9TQUZBUklfSVRFUkFUT1JTID0gSXRlcmF0b3JzQ29yZS5CVUdHWV9TQUZBUklfSVRFUkFUT1JTO1xudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIEtFWVMgPSAna2V5cyc7XG52YXIgVkFMVUVTID0gJ3ZhbHVlcyc7XG52YXIgRU5UUklFUyA9ICdlbnRyaWVzJztcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChJdGVyYWJsZSwgTkFNRSwgSXRlcmF0b3JDb25zdHJ1Y3RvciwgbmV4dCwgREVGQVVMVCwgSVNfU0VULCBGT1JDRUQpIHtcbiAgY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvcihJdGVyYXRvckNvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KTtcblxuICB2YXIgZ2V0SXRlcmF0aW9uTWV0aG9kID0gZnVuY3Rpb24gKEtJTkQpIHtcbiAgICBpZiAoS0lORCA9PT0gREVGQVVMVCAmJiBkZWZhdWx0SXRlcmF0b3IpIHJldHVybiBkZWZhdWx0SXRlcmF0b3I7XG4gICAgaWYgKCFCVUdHWV9TQUZBUklfSVRFUkFUT1JTICYmIEtJTkQgaW4gSXRlcmFibGVQcm90b3R5cGUpIHJldHVybiBJdGVyYWJsZVByb3RvdHlwZVtLSU5EXTtcbiAgICBzd2l0Y2ggKEtJTkQpIHtcbiAgICAgIGNhc2UgS0VZUzogcmV0dXJuIGZ1bmN0aW9uIGtleXMoKSB7IHJldHVybiBuZXcgSXRlcmF0b3JDb25zdHJ1Y3Rvcih0aGlzLCBLSU5EKTsgfTtcbiAgICAgIGNhc2UgVkFMVUVTOiByZXR1cm4gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcywgS0lORCk7IH07XG4gICAgICBjYXNlIEVOVFJJRVM6IHJldHVybiBmdW5jdGlvbiBlbnRyaWVzKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcywgS0lORCk7IH07XG4gICAgfSByZXR1cm4gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcyk7IH07XG4gIH07XG5cbiAgdmFyIFRPX1NUUklOR19UQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7XG4gIHZhciBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgPSBmYWxzZTtcbiAgdmFyIEl0ZXJhYmxlUHJvdG90eXBlID0gSXRlcmFibGUucHJvdG90eXBlO1xuICB2YXIgbmF0aXZlSXRlcmF0b3IgPSBJdGVyYWJsZVByb3RvdHlwZVtJVEVSQVRPUl1cbiAgICB8fCBJdGVyYWJsZVByb3RvdHlwZVsnQEBpdGVyYXRvciddXG4gICAgfHwgREVGQVVMVCAmJiBJdGVyYWJsZVByb3RvdHlwZVtERUZBVUxUXTtcbiAgdmFyIGRlZmF1bHRJdGVyYXRvciA9ICFCVUdHWV9TQUZBUklfSVRFUkFUT1JTICYmIG5hdGl2ZUl0ZXJhdG9yIHx8IGdldEl0ZXJhdGlvbk1ldGhvZChERUZBVUxUKTtcbiAgdmFyIGFueU5hdGl2ZUl0ZXJhdG9yID0gTkFNRSA9PSAnQXJyYXknID8gSXRlcmFibGVQcm90b3R5cGUuZW50cmllcyB8fCBuYXRpdmVJdGVyYXRvciA6IG5hdGl2ZUl0ZXJhdG9yO1xuICB2YXIgQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLCBtZXRob2RzLCBLRVk7XG5cbiAgLy8gZml4IG5hdGl2ZVxuICBpZiAoYW55TmF0aXZlSXRlcmF0b3IpIHtcbiAgICBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZihhbnlOYXRpdmVJdGVyYXRvci5jYWxsKG5ldyBJdGVyYWJsZSgpKSk7XG4gICAgaWYgKEl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZS5uZXh0KSB7XG4gICAgICBpZiAoIUlTX1BVUkUgJiYgZ2V0UHJvdG90eXBlT2YoQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlKSAhPT0gSXRlcmF0b3JQcm90b3R5cGUpIHtcbiAgICAgICAgaWYgKHNldFByb3RvdHlwZU9mKSB7XG4gICAgICAgICAgc2V0UHJvdG90eXBlT2YoQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLCBJdGVyYXRvclByb3RvdHlwZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZVtJVEVSQVRPUl0gIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SLCByZXR1cm5UaGlzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gU2V0IEBAdG9TdHJpbmdUYWcgdG8gbmF0aXZlIGl0ZXJhdG9yc1xuICAgICAgc2V0VG9TdHJpbmdUYWcoQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLCBUT19TVFJJTkdfVEFHLCB0cnVlLCB0cnVlKTtcbiAgICAgIGlmIChJU19QVVJFKSBJdGVyYXRvcnNbVE9fU1RSSU5HX1RBR10gPSByZXR1cm5UaGlzO1xuICAgIH1cbiAgfVxuXG4gIC8vIGZpeCBBcnJheSN7dmFsdWVzLCBAQGl0ZXJhdG9yfS5uYW1lIGluIFY4IC8gRkZcbiAgaWYgKERFRkFVTFQgPT0gVkFMVUVTICYmIG5hdGl2ZUl0ZXJhdG9yICYmIG5hdGl2ZUl0ZXJhdG9yLm5hbWUgIT09IFZBTFVFUykge1xuICAgIElOQ09SUkVDVF9WQUxVRVNfTkFNRSA9IHRydWU7XG4gICAgZGVmYXVsdEl0ZXJhdG9yID0gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gbmF0aXZlSXRlcmF0b3IuY2FsbCh0aGlzKTsgfTtcbiAgfVxuXG4gIC8vIGRlZmluZSBpdGVyYXRvclxuICBpZiAoKCFJU19QVVJFIHx8IEZPUkNFRCkgJiYgSXRlcmFibGVQcm90b3R5cGVbSVRFUkFUT1JdICE9PSBkZWZhdWx0SXRlcmF0b3IpIHtcbiAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoSXRlcmFibGVQcm90b3R5cGUsIElURVJBVE9SLCBkZWZhdWx0SXRlcmF0b3IpO1xuICB9XG4gIEl0ZXJhdG9yc1tOQU1FXSA9IGRlZmF1bHRJdGVyYXRvcjtcblxuICAvLyBleHBvcnQgYWRkaXRpb25hbCBtZXRob2RzXG4gIGlmIChERUZBVUxUKSB7XG4gICAgbWV0aG9kcyA9IHtcbiAgICAgIHZhbHVlczogZ2V0SXRlcmF0aW9uTWV0aG9kKFZBTFVFUyksXG4gICAgICBrZXlzOiBJU19TRVQgPyBkZWZhdWx0SXRlcmF0b3IgOiBnZXRJdGVyYXRpb25NZXRob2QoS0VZUyksXG4gICAgICBlbnRyaWVzOiBnZXRJdGVyYXRpb25NZXRob2QoRU5UUklFUylcbiAgICB9O1xuICAgIGlmIChGT1JDRUQpIGZvciAoS0VZIGluIG1ldGhvZHMpIHtcbiAgICAgIGlmIChCVUdHWV9TQUZBUklfSVRFUkFUT1JTIHx8IElOQ09SUkVDVF9WQUxVRVNfTkFNRSB8fCAhKEtFWSBpbiBJdGVyYWJsZVByb3RvdHlwZSkpIHtcbiAgICAgICAgcmVkZWZpbmUoSXRlcmFibGVQcm90b3R5cGUsIEtFWSwgbWV0aG9kc1tLRVldKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgJCh7IHRhcmdldDogTkFNRSwgcHJvdG86IHRydWUsIGZvcmNlZDogQlVHR1lfU0FGQVJJX0lURVJBVE9SUyB8fCBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgfSwgbWV0aG9kcyk7XG4gIH1cblxuICByZXR1cm4gbWV0aG9kcztcbn07XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDk3ODE6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3MjkzKTtcblxuLy8gRGV0ZWN0IElFOCdzIGluY29tcGxldGUgZGVmaW5lUHJvcGVydHkgaW1wbGVtZW50YXRpb25cbm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgMSwgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSlbMV0gIT0gNztcbn0pO1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyAzMTc6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oNzg1NCk7XG52YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExMSk7XG5cbnZhciBkb2N1bWVudCA9IGdsb2JhbC5kb2N1bWVudDtcbi8vIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50IGlzICdvYmplY3QnIGluIG9sZCBJRVxudmFyIEVYSVNUUyA9IGlzT2JqZWN0KGRvY3VtZW50KSAmJiBpc09iamVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIEVYSVNUUyA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaXQpIDoge307XG59O1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA4MzI0OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSkge1xuXG4vLyBpdGVyYWJsZSBET00gY29sbGVjdGlvbnNcbi8vIGZsYWcgLSBgaXRlcmFibGVgIGludGVyZmFjZSAtICdlbnRyaWVzJywgJ2tleXMnLCAndmFsdWVzJywgJ2ZvckVhY2gnIG1ldGhvZHNcbm1vZHVsZS5leHBvcnRzID0ge1xuICBDU1NSdWxlTGlzdDogMCxcbiAgQ1NTU3R5bGVEZWNsYXJhdGlvbjogMCxcbiAgQ1NTVmFsdWVMaXN0OiAwLFxuICBDbGllbnRSZWN0TGlzdDogMCxcbiAgRE9NUmVjdExpc3Q6IDAsXG4gIERPTVN0cmluZ0xpc3Q6IDAsXG4gIERPTVRva2VuTGlzdDogMSxcbiAgRGF0YVRyYW5zZmVySXRlbUxpc3Q6IDAsXG4gIEZpbGVMaXN0OiAwLFxuICBIVE1MQWxsQ29sbGVjdGlvbjogMCxcbiAgSFRNTENvbGxlY3Rpb246IDAsXG4gIEhUTUxGb3JtRWxlbWVudDogMCxcbiAgSFRNTFNlbGVjdEVsZW1lbnQ6IDAsXG4gIE1lZGlhTGlzdDogMCxcbiAgTWltZVR5cGVBcnJheTogMCxcbiAgTmFtZWROb2RlTWFwOiAwLFxuICBOb2RlTGlzdDogMSxcbiAgUGFpbnRSZXF1ZXN0TGlzdDogMCxcbiAgUGx1Z2luOiAwLFxuICBQbHVnaW5BcnJheTogMCxcbiAgU1ZHTGVuZ3RoTGlzdDogMCxcbiAgU1ZHTnVtYmVyTGlzdDogMCxcbiAgU1ZHUGF0aFNlZ0xpc3Q6IDAsXG4gIFNWR1BvaW50TGlzdDogMCxcbiAgU1ZHU3RyaW5nTGlzdDogMCxcbiAgU1ZHVHJhbnNmb3JtTGlzdDogMCxcbiAgU291cmNlQnVmZmVyTGlzdDogMCxcbiAgU3R5bGVTaGVldExpc3Q6IDAsXG4gIFRleHRUcmFja0N1ZUxpc3Q6IDAsXG4gIFRleHRUcmFja0xpc3Q6IDAsXG4gIFRvdWNoTGlzdDogMFxufTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gODExMzpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgZ2V0QnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oNTAwNSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJbignbmF2aWdhdG9yJywgJ3VzZXJBZ2VudCcpIHx8ICcnO1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA3MzkyOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4NTQpO1xudmFyIHVzZXJBZ2VudCA9IF9fd2VicGFja19yZXF1aXJlX18oODExMyk7XG5cbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgdmVyc2lvbnMgPSBwcm9jZXNzICYmIHByb2Nlc3MudmVyc2lvbnM7XG52YXIgdjggPSB2ZXJzaW9ucyAmJiB2ZXJzaW9ucy52ODtcbnZhciBtYXRjaCwgdmVyc2lvbjtcblxuaWYgKHY4KSB7XG4gIG1hdGNoID0gdjguc3BsaXQoJy4nKTtcbiAgdmVyc2lvbiA9IG1hdGNoWzBdICsgbWF0Y2hbMV07XG59IGVsc2UgaWYgKHVzZXJBZ2VudCkge1xuICBtYXRjaCA9IHVzZXJBZ2VudC5tYXRjaCgvRWRnZVxcLyhcXGQrKS8pO1xuICBpZiAoIW1hdGNoIHx8IG1hdGNoWzFdID49IDc0KSB7XG4gICAgbWF0Y2ggPSB1c2VyQWdlbnQubWF0Y2goL0Nocm9tZVxcLyhcXGQrKS8pO1xuICAgIGlmIChtYXRjaCkgdmVyc2lvbiA9IG1hdGNoWzFdO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdmVyc2lvbiAmJiArdmVyc2lvbjtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gNzQ4OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSkge1xuXG4vLyBJRTgtIGRvbid0IGVudW0gYnVnIGtleXNcbm1vZHVsZS5leHBvcnRzID0gW1xuICAnY29uc3RydWN0b3InLFxuICAnaGFzT3duUHJvcGVydHknLFxuICAnaXNQcm90b3R5cGVPZicsXG4gICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsXG4gICd0b0xvY2FsZVN0cmluZycsXG4gICd0b1N0cmluZycsXG4gICd2YWx1ZU9mJ1xuXTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gMjEwOTpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3ODU0KTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyMzYpLmY7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4ODgwKTtcbnZhciByZWRlZmluZSA9IF9fd2VicGFja19yZXF1aXJlX18oMTMyMCk7XG52YXIgc2V0R2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNTA1KTtcbnZhciBjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5OTIwKTtcbnZhciBpc0ZvcmNlZCA9IF9fd2VicGFja19yZXF1aXJlX18oNDcwNSk7XG5cbi8qXG4gIG9wdGlvbnMudGFyZ2V0ICAgICAgLSBuYW1lIG9mIHRoZSB0YXJnZXQgb2JqZWN0XG4gIG9wdGlvbnMuZ2xvYmFsICAgICAgLSB0YXJnZXQgaXMgdGhlIGdsb2JhbCBvYmplY3RcbiAgb3B0aW9ucy5zdGF0ICAgICAgICAtIGV4cG9ydCBhcyBzdGF0aWMgbWV0aG9kcyBvZiB0YXJnZXRcbiAgb3B0aW9ucy5wcm90byAgICAgICAtIGV4cG9ydCBhcyBwcm90b3R5cGUgbWV0aG9kcyBvZiB0YXJnZXRcbiAgb3B0aW9ucy5yZWFsICAgICAgICAtIHJlYWwgcHJvdG90eXBlIG1ldGhvZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uXG4gIG9wdGlvbnMuZm9yY2VkICAgICAgLSBleHBvcnQgZXZlbiBpZiB0aGUgbmF0aXZlIGZlYXR1cmUgaXMgYXZhaWxhYmxlXG4gIG9wdGlvbnMuYmluZCAgICAgICAgLSBiaW5kIG1ldGhvZHMgdG8gdGhlIHRhcmdldCwgcmVxdWlyZWQgZm9yIHRoZSBgcHVyZWAgdmVyc2lvblxuICBvcHRpb25zLndyYXAgICAgICAgIC0gd3JhcCBjb25zdHJ1Y3RvcnMgdG8gcHJldmVudGluZyBnbG9iYWwgcG9sbHV0aW9uLCByZXF1aXJlZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uXG4gIG9wdGlvbnMudW5zYWZlICAgICAgLSB1c2UgdGhlIHNpbXBsZSBhc3NpZ25tZW50IG9mIHByb3BlcnR5IGluc3RlYWQgb2YgZGVsZXRlICsgZGVmaW5lUHJvcGVydHlcbiAgb3B0aW9ucy5zaGFtICAgICAgICAtIGFkZCBhIGZsYWcgdG8gbm90IGNvbXBsZXRlbHkgZnVsbCBwb2x5ZmlsbHNcbiAgb3B0aW9ucy5lbnVtZXJhYmxlICAtIGV4cG9ydCBhcyBlbnVtZXJhYmxlIHByb3BlcnR5XG4gIG9wdGlvbnMubm9UYXJnZXRHZXQgLSBwcmV2ZW50IGNhbGxpbmcgYSBnZXR0ZXIgb24gdGFyZ2V0XG4qL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3B0aW9ucywgc291cmNlKSB7XG4gIHZhciBUQVJHRVQgPSBvcHRpb25zLnRhcmdldDtcbiAgdmFyIEdMT0JBTCA9IG9wdGlvbnMuZ2xvYmFsO1xuICB2YXIgU1RBVElDID0gb3B0aW9ucy5zdGF0O1xuICB2YXIgRk9SQ0VELCB0YXJnZXQsIGtleSwgdGFyZ2V0UHJvcGVydHksIHNvdXJjZVByb3BlcnR5LCBkZXNjcmlwdG9yO1xuICBpZiAoR0xPQkFMKSB7XG4gICAgdGFyZ2V0ID0gZ2xvYmFsO1xuICB9IGVsc2UgaWYgKFNUQVRJQykge1xuICAgIHRhcmdldCA9IGdsb2JhbFtUQVJHRVRdIHx8IHNldEdsb2JhbChUQVJHRVQsIHt9KTtcbiAgfSBlbHNlIHtcbiAgICB0YXJnZXQgPSAoZ2xvYmFsW1RBUkdFVF0gfHwge30pLnByb3RvdHlwZTtcbiAgfVxuICBpZiAodGFyZ2V0KSBmb3IgKGtleSBpbiBzb3VyY2UpIHtcbiAgICBzb3VyY2VQcm9wZXJ0eSA9IHNvdXJjZVtrZXldO1xuICAgIGlmIChvcHRpb25zLm5vVGFyZ2V0R2V0KSB7XG4gICAgICBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KTtcbiAgICAgIHRhcmdldFByb3BlcnR5ID0gZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLnZhbHVlO1xuICAgIH0gZWxzZSB0YXJnZXRQcm9wZXJ0eSA9IHRhcmdldFtrZXldO1xuICAgIEZPUkNFRCA9IGlzRm9yY2VkKEdMT0JBTCA/IGtleSA6IFRBUkdFVCArIChTVEFUSUMgPyAnLicgOiAnIycpICsga2V5LCBvcHRpb25zLmZvcmNlZCk7XG4gICAgLy8gY29udGFpbmVkIGluIHRhcmdldFxuICAgIGlmICghRk9SQ0VEICYmIHRhcmdldFByb3BlcnR5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2Ygc291cmNlUHJvcGVydHkgPT09IHR5cGVvZiB0YXJnZXRQcm9wZXJ0eSkgY29udGludWU7XG4gICAgICBjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzKHNvdXJjZVByb3BlcnR5LCB0YXJnZXRQcm9wZXJ0eSk7XG4gICAgfVxuICAgIC8vIGFkZCBhIGZsYWcgdG8gbm90IGNvbXBsZXRlbHkgZnVsbCBwb2x5ZmlsbHNcbiAgICBpZiAob3B0aW9ucy5zaGFtIHx8ICh0YXJnZXRQcm9wZXJ0eSAmJiB0YXJnZXRQcm9wZXJ0eS5zaGFtKSkge1xuICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KHNvdXJjZVByb3BlcnR5LCAnc2hhbScsIHRydWUpO1xuICAgIH1cbiAgICAvLyBleHRlbmQgZ2xvYmFsXG4gICAgcmVkZWZpbmUodGFyZ2V0LCBrZXksIHNvdXJjZVByb3BlcnR5LCBvcHRpb25zKTtcbiAgfVxufTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gNzI5Mzpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykge1xuICB0cnkge1xuICAgIHJldHVybiAhIWV4ZWMoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gNzAwNzpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuLy8gVE9ETzogUmVtb3ZlIGZyb20gYGNvcmUtanNANGAgc2luY2UgaXQncyBtb3ZlZCB0byBlbnRyeSBwb2ludHNcbl9fd2VicGFja19yZXF1aXJlX18oNDkxNik7XG52YXIgcmVkZWZpbmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzMjApO1xudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3MjkzKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUxMTIpO1xudmFyIHJlZ2V4cEV4ZWMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIyNjEpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oODg4MCk7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG5cbnZhciBSRVBMQUNFX1NVUFBPUlRTX05BTUVEX0dST1VQUyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vICNyZXBsYWNlIG5lZWRzIGJ1aWx0LWluIHN1cHBvcnQgZm9yIG5hbWVkIGdyb3Vwcy5cbiAgLy8gI21hdGNoIHdvcmtzIGZpbmUgYmVjYXVzZSBpdCBqdXN0IHJldHVybiB0aGUgZXhlYyByZXN1bHRzLCBldmVuIGlmIGl0IGhhc1xuICAvLyBhIFwiZ3JvcHNcIiBwcm9wZXJ0eS5cbiAgdmFyIHJlID0gLy4vO1xuICByZS5leGVjID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICByZXN1bHQuZ3JvdXBzID0geyBhOiAnNycgfTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICByZXR1cm4gJycucmVwbGFjZShyZSwgJyQ8YT4nKSAhPT0gJzcnO1xufSk7XG5cbi8vIElFIDw9IDExIHJlcGxhY2VzICQwIHdpdGggdGhlIHdob2xlIG1hdGNoLCBhcyBpZiBpdCB3YXMgJCZcbi8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzYwMjQ2NjYvZ2V0dGluZy1pZS10by1yZXBsYWNlLWEtcmVnZXgtd2l0aC10aGUtbGl0ZXJhbC1zdHJpbmctMFxudmFyIFJFUExBQ0VfS0VFUFNfJDAgPSAoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gJ2EnLnJlcGxhY2UoLy4vLCAnJDAnKSA9PT0gJyQwJztcbn0pKCk7XG5cbnZhciBSRVBMQUNFID0gd2VsbEtub3duU3ltYm9sKCdyZXBsYWNlJyk7XG4vLyBTYWZhcmkgPD0gMTMuMC4zKD8pIHN1YnN0aXR1dGVzIG50aCBjYXB0dXJlIHdoZXJlIG4+bSB3aXRoIGFuIGVtcHR5IHN0cmluZ1xudmFyIFJFR0VYUF9SRVBMQUNFX1NVQlNUSVRVVEVTX1VOREVGSU5FRF9DQVBUVVJFID0gKGZ1bmN0aW9uICgpIHtcbiAgaWYgKC8uL1tSRVBMQUNFXSkge1xuICAgIHJldHVybiAvLi9bUkVQTEFDRV0oJ2EnLCAnJDAnKSA9PT0gJyc7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufSkoKTtcblxuLy8gQ2hyb21lIDUxIGhhcyBhIGJ1Z2d5IFwic3BsaXRcIiBpbXBsZW1lbnRhdGlvbiB3aGVuIFJlZ0V4cCNleGVjICE9PSBuYXRpdmVFeGVjXG4vLyBXZWV4IEpTIGhhcyBmcm96ZW4gYnVpbHQtaW4gcHJvdG90eXBlcywgc28gdXNlIHRyeSAvIGNhdGNoIHdyYXBwZXJcbnZhciBTUExJVF9XT1JLU19XSVRIX09WRVJXUklUVEVOX0VYRUMgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL25vLWVtcHR5LWdyb3VwIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gIHZhciByZSA9IC8oPzopLztcbiAgdmFyIG9yaWdpbmFsRXhlYyA9IHJlLmV4ZWM7XG4gIHJlLmV4ZWMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBvcmlnaW5hbEV4ZWMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfTtcbiAgdmFyIHJlc3VsdCA9ICdhYicuc3BsaXQocmUpO1xuICByZXR1cm4gcmVzdWx0Lmxlbmd0aCAhPT0gMiB8fCByZXN1bHRbMF0gIT09ICdhJyB8fCByZXN1bHRbMV0gIT09ICdiJztcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChLRVksIGxlbmd0aCwgZXhlYywgc2hhbSkge1xuICB2YXIgU1lNQk9MID0gd2VsbEtub3duU3ltYm9sKEtFWSk7XG5cbiAgdmFyIERFTEVHQVRFU19UT19TWU1CT0wgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIC8vIFN0cmluZyBtZXRob2RzIGNhbGwgc3ltYm9sLW5hbWVkIFJlZ0VwIG1ldGhvZHNcbiAgICB2YXIgTyA9IHt9O1xuICAgIE9bU1lNQk9MXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH07XG4gICAgcmV0dXJuICcnW0tFWV0oTykgIT0gNztcbiAgfSk7XG5cbiAgdmFyIERFTEVHQVRFU19UT19FWEVDID0gREVMRUdBVEVTX1RPX1NZTUJPTCAmJiAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIC8vIFN5bWJvbC1uYW1lZCBSZWdFeHAgbWV0aG9kcyBjYWxsIC5leGVjXG4gICAgdmFyIGV4ZWNDYWxsZWQgPSBmYWxzZTtcbiAgICB2YXIgcmUgPSAvYS87XG5cbiAgICBpZiAoS0VZID09PSAnc3BsaXQnKSB7XG4gICAgICAvLyBXZSBjYW4ndCB1c2UgcmVhbCByZWdleCBoZXJlIHNpbmNlIGl0IGNhdXNlcyBkZW9wdGltaXphdGlvblxuICAgICAgLy8gYW5kIHNlcmlvdXMgcGVyZm9ybWFuY2UgZGVncmFkYXRpb24gaW4gVjhcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8zMDZcbiAgICAgIHJlID0ge307XG4gICAgICAvLyBSZWdFeHBbQEBzcGxpdF0gZG9lc24ndCBjYWxsIHRoZSByZWdleCdzIGV4ZWMgbWV0aG9kLCBidXQgZmlyc3QgY3JlYXRlc1xuICAgICAgLy8gYSBuZXcgb25lLiBXZSBuZWVkIHRvIHJldHVybiB0aGUgcGF0Y2hlZCByZWdleCB3aGVuIGNyZWF0aW5nIHRoZSBuZXcgb25lLlxuICAgICAgcmUuY29uc3RydWN0b3IgPSB7fTtcbiAgICAgIHJlLmNvbnN0cnVjdG9yW1NQRUNJRVNdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gcmU7IH07XG4gICAgICByZS5mbGFncyA9ICcnO1xuICAgICAgcmVbU1lNQk9MXSA9IC8uL1tTWU1CT0xdO1xuICAgIH1cblxuICAgIHJlLmV4ZWMgPSBmdW5jdGlvbiAoKSB7IGV4ZWNDYWxsZWQgPSB0cnVlOyByZXR1cm4gbnVsbDsgfTtcblxuICAgIHJlW1NZTUJPTF0oJycpO1xuICAgIHJldHVybiAhZXhlY0NhbGxlZDtcbiAgfSk7XG5cbiAgaWYgKFxuICAgICFERUxFR0FURVNfVE9fU1lNQk9MIHx8XG4gICAgIURFTEVHQVRFU19UT19FWEVDIHx8XG4gICAgKEtFWSA9PT0gJ3JlcGxhY2UnICYmICEoXG4gICAgICBSRVBMQUNFX1NVUFBPUlRTX05BTUVEX0dST1VQUyAmJlxuICAgICAgUkVQTEFDRV9LRUVQU18kMCAmJlxuICAgICAgIVJFR0VYUF9SRVBMQUNFX1NVQlNUSVRVVEVTX1VOREVGSU5FRF9DQVBUVVJFXG4gICAgKSkgfHxcbiAgICAoS0VZID09PSAnc3BsaXQnICYmICFTUExJVF9XT1JLU19XSVRIX09WRVJXUklUVEVOX0VYRUMpXG4gICkge1xuICAgIHZhciBuYXRpdmVSZWdFeHBNZXRob2QgPSAvLi9bU1lNQk9MXTtcbiAgICB2YXIgbWV0aG9kcyA9IGV4ZWMoU1lNQk9MLCAnJ1tLRVldLCBmdW5jdGlvbiAobmF0aXZlTWV0aG9kLCByZWdleHAsIHN0ciwgYXJnMiwgZm9yY2VTdHJpbmdNZXRob2QpIHtcbiAgICAgIGlmIChyZWdleHAuZXhlYyA9PT0gcmVnZXhwRXhlYykge1xuICAgICAgICBpZiAoREVMRUdBVEVTX1RPX1NZTUJPTCAmJiAhZm9yY2VTdHJpbmdNZXRob2QpIHtcbiAgICAgICAgICAvLyBUaGUgbmF0aXZlIFN0cmluZyBtZXRob2QgYWxyZWFkeSBkZWxlZ2F0ZXMgdG8gQEBtZXRob2QgKHRoaXNcbiAgICAgICAgICAvLyBwb2x5ZmlsbGVkIGZ1bmN0aW9uKSwgbGVhc2luZyB0byBpbmZpbml0ZSByZWN1cnNpb24uXG4gICAgICAgICAgLy8gV2UgYXZvaWQgaXQgYnkgZGlyZWN0bHkgY2FsbGluZyB0aGUgbmF0aXZlIEBAbWV0aG9kIG1ldGhvZC5cbiAgICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogbmF0aXZlUmVnRXhwTWV0aG9kLmNhbGwocmVnZXhwLCBzdHIsIGFyZzIpIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IG5hdGl2ZU1ldGhvZC5jYWxsKHN0ciwgcmVnZXhwLCBhcmcyKSB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgZG9uZTogZmFsc2UgfTtcbiAgICB9LCB7XG4gICAgICBSRVBMQUNFX0tFRVBTXyQwOiBSRVBMQUNFX0tFRVBTXyQwLFxuICAgICAgUkVHRVhQX1JFUExBQ0VfU1VCU1RJVFVURVNfVU5ERUZJTkVEX0NBUFRVUkU6IFJFR0VYUF9SRVBMQUNFX1NVQlNUSVRVVEVTX1VOREVGSU5FRF9DQVBUVVJFXG4gICAgfSk7XG4gICAgdmFyIHN0cmluZ01ldGhvZCA9IG1ldGhvZHNbMF07XG4gICAgdmFyIHJlZ2V4TWV0aG9kID0gbWV0aG9kc1sxXTtcblxuICAgIHJlZGVmaW5lKFN0cmluZy5wcm90b3R5cGUsIEtFWSwgc3RyaW5nTWV0aG9kKTtcbiAgICByZWRlZmluZShSZWdFeHAucHJvdG90eXBlLCBTWU1CT0wsIGxlbmd0aCA9PSAyXG4gICAgICAvLyAyMS4yLjUuOCBSZWdFeHAucHJvdG90eXBlW0BAcmVwbGFjZV0oc3RyaW5nLCByZXBsYWNlVmFsdWUpXG4gICAgICAvLyAyMS4yLjUuMTEgUmVnRXhwLnByb3RvdHlwZVtAQHNwbGl0XShzdHJpbmcsIGxpbWl0KVxuICAgICAgPyBmdW5jdGlvbiAoc3RyaW5nLCBhcmcpIHsgcmV0dXJuIHJlZ2V4TWV0aG9kLmNhbGwoc3RyaW5nLCB0aGlzLCBhcmcpOyB9XG4gICAgICAvLyAyMS4yLjUuNiBSZWdFeHAucHJvdG90eXBlW0BAbWF0Y2hdKHN0cmluZylcbiAgICAgIC8vIDIxLjIuNS45IFJlZ0V4cC5wcm90b3R5cGVbQEBzZWFyY2hdKHN0cmluZylcbiAgICAgIDogZnVuY3Rpb24gKHN0cmluZykgeyByZXR1cm4gcmVnZXhNZXRob2QuY2FsbChzdHJpbmcsIHRoaXMpOyB9XG4gICAgKTtcbiAgfVxuXG4gIGlmIChzaGFtKSBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoUmVnRXhwLnByb3RvdHlwZVtTWU1CT0xdLCAnc2hhbScsIHRydWUpO1xufTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gOTk3NDpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgYUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMDk5KTtcblxuLy8gb3B0aW9uYWwgLyBzaW1wbGUgY29udGV4dCBiaW5kaW5nXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmbiwgdGhhdCwgbGVuZ3RoKSB7XG4gIGFGdW5jdGlvbihmbik7XG4gIGlmICh0aGF0ID09PSB1bmRlZmluZWQpIHJldHVybiBmbjtcbiAgc3dpdGNoIChsZW5ndGgpIHtcbiAgICBjYXNlIDA6IHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0KTtcbiAgICB9O1xuICAgIGNhc2UgMTogcmV0dXJuIGZ1bmN0aW9uIChhKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhKTtcbiAgICB9O1xuICAgIGNhc2UgMjogcmV0dXJuIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiKTtcbiAgICB9O1xuICAgIGNhc2UgMzogcmV0dXJuIGZ1bmN0aW9uIChhLCBiLCBjKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiLCBjKTtcbiAgICB9O1xuICB9XG4gIHJldHVybiBmdW5jdGlvbiAoLyogLi4uYXJncyAqLykge1xuICAgIHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmd1bWVudHMpO1xuICB9O1xufTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gNTAwNTpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgcGF0aCA9IF9fd2VicGFja19yZXF1aXJlX18oODU3KTtcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4NTQpO1xuXG52YXIgYUZ1bmN0aW9uID0gZnVuY3Rpb24gKHZhcmlhYmxlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFyaWFibGUgPT0gJ2Z1bmN0aW9uJyA/IHZhcmlhYmxlIDogdW5kZWZpbmVkO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmFtZXNwYWNlLCBtZXRob2QpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPCAyID8gYUZ1bmN0aW9uKHBhdGhbbmFtZXNwYWNlXSkgfHwgYUZ1bmN0aW9uKGdsb2JhbFtuYW1lc3BhY2VdKVxuICAgIDogcGF0aFtuYW1lc3BhY2VdICYmIHBhdGhbbmFtZXNwYWNlXVttZXRob2RdIHx8IGdsb2JhbFtuYW1lc3BhY2VdICYmIGdsb2JhbFtuYW1lc3BhY2VdW21ldGhvZF07XG59O1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyAxMjQ2OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NDgpO1xudmFyIEl0ZXJhdG9ycyA9IF9fd2VicGFja19yZXF1aXJlX18oNzQ5Nyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1MTEyKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgIT0gdW5kZWZpbmVkKSByZXR1cm4gaXRbSVRFUkFUT1JdXG4gICAgfHwgaXRbJ0BAaXRlcmF0b3InXVxuICAgIHx8IEl0ZXJhdG9yc1tjbGFzc29mKGl0KV07XG59O1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA4NTU0OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oOTY3MCk7XG52YXIgZ2V0SXRlcmF0b3JNZXRob2QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyNDYpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgaXRlcmF0b3JNZXRob2QgPSBnZXRJdGVyYXRvck1ldGhvZChpdCk7XG4gIGlmICh0eXBlb2YgaXRlcmF0b3JNZXRob2QgIT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IFR5cGVFcnJvcihTdHJpbmcoaXQpICsgJyBpcyBub3QgaXRlcmFibGUnKTtcbiAgfSByZXR1cm4gYW5PYmplY3QoaXRlcmF0b3JNZXRob2QuY2FsbChpdCkpO1xufTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gNjQ3OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oNzkwOCk7XG5cbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG52YXIgcmVwbGFjZSA9ICcnLnJlcGxhY2U7XG52YXIgU1VCU1RJVFVUSU9OX1NZTUJPTFMgPSAvXFwkKFskJidgXXxcXGRcXGQ/fDxbXj5dKj4pL2c7XG52YXIgU1VCU1RJVFVUSU9OX1NZTUJPTFNfTk9fTkFNRUQgPSAvXFwkKFskJidgXXxcXGRcXGQ/KS9nO1xuXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWdldHN1YnN0aXR1dGlvblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobWF0Y2hlZCwgc3RyLCBwb3NpdGlvbiwgY2FwdHVyZXMsIG5hbWVkQ2FwdHVyZXMsIHJlcGxhY2VtZW50KSB7XG4gIHZhciB0YWlsUG9zID0gcG9zaXRpb24gKyBtYXRjaGVkLmxlbmd0aDtcbiAgdmFyIG0gPSBjYXB0dXJlcy5sZW5ndGg7XG4gIHZhciBzeW1ib2xzID0gU1VCU1RJVFVUSU9OX1NZTUJPTFNfTk9fTkFNRUQ7XG4gIGlmIChuYW1lZENhcHR1cmVzICE9PSB1bmRlZmluZWQpIHtcbiAgICBuYW1lZENhcHR1cmVzID0gdG9PYmplY3QobmFtZWRDYXB0dXJlcyk7XG4gICAgc3ltYm9scyA9IFNVQlNUSVRVVElPTl9TWU1CT0xTO1xuICB9XG4gIHJldHVybiByZXBsYWNlLmNhbGwocmVwbGFjZW1lbnQsIHN5bWJvbHMsIGZ1bmN0aW9uIChtYXRjaCwgY2gpIHtcbiAgICB2YXIgY2FwdHVyZTtcbiAgICBzd2l0Y2ggKGNoLmNoYXJBdCgwKSkge1xuICAgICAgY2FzZSAnJCc6IHJldHVybiAnJCc7XG4gICAgICBjYXNlICcmJzogcmV0dXJuIG1hdGNoZWQ7XG4gICAgICBjYXNlICdgJzogcmV0dXJuIHN0ci5zbGljZSgwLCBwb3NpdGlvbik7XG4gICAgICBjYXNlIFwiJ1wiOiByZXR1cm4gc3RyLnNsaWNlKHRhaWxQb3MpO1xuICAgICAgY2FzZSAnPCc6XG4gICAgICAgIGNhcHR1cmUgPSBuYW1lZENhcHR1cmVzW2NoLnNsaWNlKDEsIC0xKV07XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDogLy8gXFxkXFxkP1xuICAgICAgICB2YXIgbiA9ICtjaDtcbiAgICAgICAgaWYgKG4gPT09IDApIHJldHVybiBtYXRjaDtcbiAgICAgICAgaWYgKG4gPiBtKSB7XG4gICAgICAgICAgdmFyIGYgPSBmbG9vcihuIC8gMTApO1xuICAgICAgICAgIGlmIChmID09PSAwKSByZXR1cm4gbWF0Y2g7XG4gICAgICAgICAgaWYgKGYgPD0gbSkgcmV0dXJuIGNhcHR1cmVzW2YgLSAxXSA9PT0gdW5kZWZpbmVkID8gY2guY2hhckF0KDEpIDogY2FwdHVyZXNbZiAtIDFdICsgY2guY2hhckF0KDEpO1xuICAgICAgICAgIHJldHVybiBtYXRjaDtcbiAgICAgICAgfVxuICAgICAgICBjYXB0dXJlID0gY2FwdHVyZXNbbiAtIDFdO1xuICAgIH1cbiAgICByZXR1cm4gY2FwdHVyZSA9PT0gdW5kZWZpbmVkID8gJycgOiBjYXB0dXJlO1xuICB9KTtcbn07XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDc4NTQ6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIGNoZWNrID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpdCAmJiBpdC5NYXRoID09IE1hdGggJiYgaXQ7XG59O1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvODYjaXNzdWVjb21tZW50LTExNTc1OTAyOFxubW9kdWxlLmV4cG9ydHMgPVxuICAvKiBnbG9iYWwgZ2xvYmFsVGhpcyAtLSBzYWZlICovXG4gIGNoZWNrKHR5cGVvZiBnbG9iYWxUaGlzID09ICdvYmplY3QnICYmIGdsb2JhbFRoaXMpIHx8XG4gIGNoZWNrKHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCcgJiYgd2luZG93KSB8fFxuICBjaGVjayh0eXBlb2Ygc2VsZiA9PSAnb2JqZWN0JyAmJiBzZWxmKSB8fFxuICBjaGVjayh0eXBlb2YgX193ZWJwYWNrX3JlcXVpcmVfXy5nID09ICdvYmplY3QnICYmIF9fd2VicGFja19yZXF1aXJlX18uZykgfHxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jIC0tIGZhbGxiYWNrXG4gIChmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9KSgpIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDY2NTY6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlKSB7XG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IHt9Lmhhc093blByb3BlcnR5O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwga2V5KSB7XG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGl0LCBrZXkpO1xufTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gMzUwMTpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHtcblxubW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gNDkwOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBnZXRCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1MDA1KTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluKCdkb2N1bWVudCcsICdkb2N1bWVudEVsZW1lbnQnKTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gNDY2NDpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk3ODEpO1xudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3MjkzKTtcbnZhciBjcmVhdGVFbGVtZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMTcpO1xuXG4vLyBUaGFuaydzIElFOCBmb3IgaGlzIGZ1bm55IGRlZmluZVByb3BlcnR5XG5tb2R1bGUuZXhwb3J0cyA9ICFERVNDUklQVE9SUyAmJiAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGNyZWF0ZUVsZW1lbnQoJ2RpdicpLCAnYScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH1cbiAgfSkuYSAhPSA3O1xufSk7XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDExNzk6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlKSB7XG5cbi8vIElFRUU3NTQgY29udmVyc2lvbnMgYmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9pZWVlNzU0XG52YXIgYWJzID0gTWF0aC5hYnM7XG52YXIgcG93ID0gTWF0aC5wb3c7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xudmFyIGxvZyA9IE1hdGgubG9nO1xudmFyIExOMiA9IE1hdGguTE4yO1xuXG52YXIgcGFjayA9IGZ1bmN0aW9uIChudW1iZXIsIG1hbnRpc3NhTGVuZ3RoLCBieXRlcykge1xuICB2YXIgYnVmZmVyID0gbmV3IEFycmF5KGJ5dGVzKTtcbiAgdmFyIGV4cG9uZW50TGVuZ3RoID0gYnl0ZXMgKiA4IC0gbWFudGlzc2FMZW5ndGggLSAxO1xuICB2YXIgZU1heCA9ICgxIDw8IGV4cG9uZW50TGVuZ3RoKSAtIDE7XG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMTtcbiAgdmFyIHJ0ID0gbWFudGlzc2FMZW5ndGggPT09IDIzID8gcG93KDIsIC0yNCkgLSBwb3coMiwgLTc3KSA6IDA7XG4gIHZhciBzaWduID0gbnVtYmVyIDwgMCB8fCBudW1iZXIgPT09IDAgJiYgMSAvIG51bWJlciA8IDAgPyAxIDogMDtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGV4cG9uZW50LCBtYW50aXNzYSwgYztcbiAgbnVtYmVyID0gYWJzKG51bWJlcik7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmUgLS0gTmFOIGNoZWNrXG4gIGlmIChudW1iZXIgIT0gbnVtYmVyIHx8IG51bWJlciA9PT0gSW5maW5pdHkpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIE5hTiBjaGVja1xuICAgIG1hbnRpc3NhID0gbnVtYmVyICE9IG51bWJlciA/IDEgOiAwO1xuICAgIGV4cG9uZW50ID0gZU1heDtcbiAgfSBlbHNlIHtcbiAgICBleHBvbmVudCA9IGZsb29yKGxvZyhudW1iZXIpIC8gTE4yKTtcbiAgICBpZiAobnVtYmVyICogKGMgPSBwb3coMiwgLWV4cG9uZW50KSkgPCAxKSB7XG4gICAgICBleHBvbmVudC0tO1xuICAgICAgYyAqPSAyO1xuICAgIH1cbiAgICBpZiAoZXhwb25lbnQgKyBlQmlhcyA+PSAxKSB7XG4gICAgICBudW1iZXIgKz0gcnQgLyBjO1xuICAgIH0gZWxzZSB7XG4gICAgICBudW1iZXIgKz0gcnQgKiBwb3coMiwgMSAtIGVCaWFzKTtcbiAgICB9XG4gICAgaWYgKG51bWJlciAqIGMgPj0gMikge1xuICAgICAgZXhwb25lbnQrKztcbiAgICAgIGMgLz0gMjtcbiAgICB9XG4gICAgaWYgKGV4cG9uZW50ICsgZUJpYXMgPj0gZU1heCkge1xuICAgICAgbWFudGlzc2EgPSAwO1xuICAgICAgZXhwb25lbnQgPSBlTWF4O1xuICAgIH0gZWxzZSBpZiAoZXhwb25lbnQgKyBlQmlhcyA+PSAxKSB7XG4gICAgICBtYW50aXNzYSA9IChudW1iZXIgKiBjIC0gMSkgKiBwb3coMiwgbWFudGlzc2FMZW5ndGgpO1xuICAgICAgZXhwb25lbnQgPSBleHBvbmVudCArIGVCaWFzO1xuICAgIH0gZWxzZSB7XG4gICAgICBtYW50aXNzYSA9IG51bWJlciAqIHBvdygyLCBlQmlhcyAtIDEpICogcG93KDIsIG1hbnRpc3NhTGVuZ3RoKTtcbiAgICAgIGV4cG9uZW50ID0gMDtcbiAgICB9XG4gIH1cbiAgZm9yICg7IG1hbnRpc3NhTGVuZ3RoID49IDg7IGJ1ZmZlcltpbmRleCsrXSA9IG1hbnRpc3NhICYgMjU1LCBtYW50aXNzYSAvPSAyNTYsIG1hbnRpc3NhTGVuZ3RoIC09IDgpO1xuICBleHBvbmVudCA9IGV4cG9uZW50IDw8IG1hbnRpc3NhTGVuZ3RoIHwgbWFudGlzc2E7XG4gIGV4cG9uZW50TGVuZ3RoICs9IG1hbnRpc3NhTGVuZ3RoO1xuICBmb3IgKDsgZXhwb25lbnRMZW5ndGggPiAwOyBidWZmZXJbaW5kZXgrK10gPSBleHBvbmVudCAmIDI1NSwgZXhwb25lbnQgLz0gMjU2LCBleHBvbmVudExlbmd0aCAtPSA4KTtcbiAgYnVmZmVyWy0taW5kZXhdIHw9IHNpZ24gKiAxMjg7XG4gIHJldHVybiBidWZmZXI7XG59O1xuXG52YXIgdW5wYWNrID0gZnVuY3Rpb24gKGJ1ZmZlciwgbWFudGlzc2FMZW5ndGgpIHtcbiAgdmFyIGJ5dGVzID0gYnVmZmVyLmxlbmd0aDtcbiAgdmFyIGV4cG9uZW50TGVuZ3RoID0gYnl0ZXMgKiA4IC0gbWFudGlzc2FMZW5ndGggLSAxO1xuICB2YXIgZU1heCA9ICgxIDw8IGV4cG9uZW50TGVuZ3RoKSAtIDE7XG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMTtcbiAgdmFyIG5CaXRzID0gZXhwb25lbnRMZW5ndGggLSA3O1xuICB2YXIgaW5kZXggPSBieXRlcyAtIDE7XG4gIHZhciBzaWduID0gYnVmZmVyW2luZGV4LS1dO1xuICB2YXIgZXhwb25lbnQgPSBzaWduICYgMTI3O1xuICB2YXIgbWFudGlzc2E7XG4gIHNpZ24gPj49IDc7XG4gIGZvciAoOyBuQml0cyA+IDA7IGV4cG9uZW50ID0gZXhwb25lbnQgKiAyNTYgKyBidWZmZXJbaW5kZXhdLCBpbmRleC0tLCBuQml0cyAtPSA4KTtcbiAgbWFudGlzc2EgPSBleHBvbmVudCAmICgxIDw8IC1uQml0cykgLSAxO1xuICBleHBvbmVudCA+Pj0gLW5CaXRzO1xuICBuQml0cyArPSBtYW50aXNzYUxlbmd0aDtcbiAgZm9yICg7IG5CaXRzID4gMDsgbWFudGlzc2EgPSBtYW50aXNzYSAqIDI1NiArIGJ1ZmZlcltpbmRleF0sIGluZGV4LS0sIG5CaXRzIC09IDgpO1xuICBpZiAoZXhwb25lbnQgPT09IDApIHtcbiAgICBleHBvbmVudCA9IDEgLSBlQmlhcztcbiAgfSBlbHNlIGlmIChleHBvbmVudCA9PT0gZU1heCkge1xuICAgIHJldHVybiBtYW50aXNzYSA/IE5hTiA6IHNpZ24gPyAtSW5maW5pdHkgOiBJbmZpbml0eTtcbiAgfSBlbHNlIHtcbiAgICBtYW50aXNzYSA9IG1hbnRpc3NhICsgcG93KDIsIG1hbnRpc3NhTGVuZ3RoKTtcbiAgICBleHBvbmVudCA9IGV4cG9uZW50IC0gZUJpYXM7XG4gIH0gcmV0dXJuIChzaWduID8gLTEgOiAxKSAqIG1hbnRpc3NhICogcG93KDIsIGV4cG9uZW50IC0gbWFudGlzc2FMZW5ndGgpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHBhY2s6IHBhY2ssXG4gIHVucGFjazogdW5wYWNrXG59O1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA4MzYxOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNzI5Myk7XG52YXIgY2xhc3NvZiA9IF9fd2VicGFja19yZXF1aXJlX18oNDMyNik7XG5cbnZhciBzcGxpdCA9ICcnLnNwbGl0O1xuXG4vLyBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIGFuZCBub24tZW51bWVyYWJsZSBvbGQgVjggc3RyaW5nc1xubW9kdWxlLmV4cG9ydHMgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIHRocm93cyBhbiBlcnJvciBpbiByaGlubywgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3JoaW5vL2lzc3Vlcy8zNDZcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGlucyAtLSBzYWZlXG4gIHJldHVybiAhT2JqZWN0KCd6JykucHJvcGVydHlJc0VudW1lcmFibGUoMCk7XG59KSA/IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gY2xhc3NvZihpdCkgPT0gJ1N0cmluZycgPyBzcGxpdC5jYWxsKGl0LCAnJykgOiBPYmplY3QoaXQpO1xufSA6IE9iamVjdDtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gOTU4Nzpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExMSk7XG52YXIgc2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc2NzQpO1xuXG4vLyBtYWtlcyBzdWJjbGFzc2luZyB3b3JrIGNvcnJlY3QgZm9yIHdyYXBwZWQgYnVpbHQtaW5zXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgkdGhpcywgZHVtbXksIFdyYXBwZXIpIHtcbiAgdmFyIE5ld1RhcmdldCwgTmV3VGFyZ2V0UHJvdG90eXBlO1xuICBpZiAoXG4gICAgLy8gaXQgY2FuIHdvcmsgb25seSB3aXRoIG5hdGl2ZSBgc2V0UHJvdG90eXBlT2ZgXG4gICAgc2V0UHJvdG90eXBlT2YgJiZcbiAgICAvLyB3ZSBoYXZlbid0IGNvbXBsZXRlbHkgY29ycmVjdCBwcmUtRVM2IHdheSBmb3IgZ2V0dGluZyBgbmV3LnRhcmdldGAsIHNvIHVzZSB0aGlzXG4gICAgdHlwZW9mIChOZXdUYXJnZXQgPSBkdW1teS5jb25zdHJ1Y3RvcikgPT0gJ2Z1bmN0aW9uJyAmJlxuICAgIE5ld1RhcmdldCAhPT0gV3JhcHBlciAmJlxuICAgIGlzT2JqZWN0KE5ld1RhcmdldFByb3RvdHlwZSA9IE5ld1RhcmdldC5wcm90b3R5cGUpICYmXG4gICAgTmV3VGFyZ2V0UHJvdG90eXBlICE9PSBXcmFwcGVyLnByb3RvdHlwZVxuICApIHNldFByb3RvdHlwZU9mKCR0aGlzLCBOZXdUYXJnZXRQcm90b3R5cGUpO1xuICByZXR1cm4gJHRoaXM7XG59O1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyAyNzg4OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBzdG9yZSA9IF9fd2VicGFja19yZXF1aXJlX18oNTQ2NSk7XG5cbnZhciBmdW5jdGlvblRvU3RyaW5nID0gRnVuY3Rpb24udG9TdHJpbmc7XG5cbi8vIHRoaXMgaGVscGVyIGJyb2tlbiBpbiBgMy40LjEtMy40LjRgLCBzbyB3ZSBjYW4ndCB1c2UgYHNoYXJlZGAgaGVscGVyXG5pZiAodHlwZW9mIHN0b3JlLmluc3BlY3RTb3VyY2UgIT0gJ2Z1bmN0aW9uJykge1xuICBzdG9yZS5pbnNwZWN0U291cmNlID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uVG9TdHJpbmcuY2FsbChpdCk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RvcmUuaW5zcGVjdFNvdXJjZTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gOTkwOTpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgTkFUSVZFX1dFQUtfTUFQID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NTM2KTtcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4NTQpO1xudmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMTEpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oODg4MCk7XG52YXIgb2JqZWN0SGFzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NjU2KTtcbnZhciBzaGFyZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU0NjUpO1xudmFyIHNoYXJlZEtleSA9IF9fd2VicGFja19yZXF1aXJlX18oNjIwMCk7XG52YXIgaGlkZGVuS2V5cyA9IF9fd2VicGFja19yZXF1aXJlX18oMzUwMSk7XG5cbnZhciBXZWFrTWFwID0gZ2xvYmFsLldlYWtNYXA7XG52YXIgc2V0LCBnZXQsIGhhcztcblxudmFyIGVuZm9yY2UgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGhhcyhpdCkgPyBnZXQoaXQpIDogc2V0KGl0LCB7fSk7XG59O1xuXG52YXIgZ2V0dGVyRm9yID0gZnVuY3Rpb24gKFRZUEUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChpdCkge1xuICAgIHZhciBzdGF0ZTtcbiAgICBpZiAoIWlzT2JqZWN0KGl0KSB8fCAoc3RhdGUgPSBnZXQoaXQpKS50eXBlICE9PSBUWVBFKSB7XG4gICAgICB0aHJvdyBUeXBlRXJyb3IoJ0luY29tcGF0aWJsZSByZWNlaXZlciwgJyArIFRZUEUgKyAnIHJlcXVpcmVkJyk7XG4gICAgfSByZXR1cm4gc3RhdGU7XG4gIH07XG59O1xuXG5pZiAoTkFUSVZFX1dFQUtfTUFQKSB7XG4gIHZhciBzdG9yZSA9IHNoYXJlZC5zdGF0ZSB8fCAoc2hhcmVkLnN0YXRlID0gbmV3IFdlYWtNYXAoKSk7XG4gIHZhciB3bWdldCA9IHN0b3JlLmdldDtcbiAgdmFyIHdtaGFzID0gc3RvcmUuaGFzO1xuICB2YXIgd21zZXQgPSBzdG9yZS5zZXQ7XG4gIHNldCA9IGZ1bmN0aW9uIChpdCwgbWV0YWRhdGEpIHtcbiAgICBtZXRhZGF0YS5mYWNhZGUgPSBpdDtcbiAgICB3bXNldC5jYWxsKHN0b3JlLCBpdCwgbWV0YWRhdGEpO1xuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfTtcbiAgZ2V0ID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIHdtZ2V0LmNhbGwoc3RvcmUsIGl0KSB8fCB7fTtcbiAgfTtcbiAgaGFzID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIHdtaGFzLmNhbGwoc3RvcmUsIGl0KTtcbiAgfTtcbn0gZWxzZSB7XG4gIHZhciBTVEFURSA9IHNoYXJlZEtleSgnc3RhdGUnKTtcbiAgaGlkZGVuS2V5c1tTVEFURV0gPSB0cnVlO1xuICBzZXQgPSBmdW5jdGlvbiAoaXQsIG1ldGFkYXRhKSB7XG4gICAgbWV0YWRhdGEuZmFjYWRlID0gaXQ7XG4gICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KGl0LCBTVEFURSwgbWV0YWRhdGEpO1xuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfTtcbiAgZ2V0ID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIG9iamVjdEhhcyhpdCwgU1RBVEUpID8gaXRbU1RBVEVdIDoge307XG4gIH07XG4gIGhhcyA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBvYmplY3RIYXMoaXQsIFNUQVRFKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogc2V0LFxuICBnZXQ6IGdldCxcbiAgaGFzOiBoYXMsXG4gIGVuZm9yY2U6IGVuZm9yY2UsXG4gIGdldHRlckZvcjogZ2V0dGVyRm9yXG59O1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA3NjU5OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUxMTIpO1xudmFyIEl0ZXJhdG9ycyA9IF9fd2VicGFja19yZXF1aXJlX18oNzQ5Nyk7XG5cbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxuLy8gY2hlY2sgb24gZGVmYXVsdCBBcnJheSBpdGVyYXRvclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ICE9PSB1bmRlZmluZWQgJiYgKEl0ZXJhdG9ycy5BcnJheSA9PT0gaXQgfHwgQXJyYXlQcm90b3R5cGVbSVRFUkFUT1JdID09PSBpdCk7XG59O1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyAzMTU3OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MzI2KTtcblxuLy8gYElzQXJyYXlgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1pc2FycmF5XG5tb2R1bGUuZXhwb3J0cyA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gaXNBcnJheShhcmcpIHtcbiAgcmV0dXJuIGNsYXNzb2YoYXJnKSA9PSAnQXJyYXknO1xufTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gNDcwNTpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcyOTMpO1xuXG52YXIgcmVwbGFjZW1lbnQgPSAvI3xcXC5wcm90b3R5cGVcXC4vO1xuXG52YXIgaXNGb3JjZWQgPSBmdW5jdGlvbiAoZmVhdHVyZSwgZGV0ZWN0aW9uKSB7XG4gIHZhciB2YWx1ZSA9IGRhdGFbbm9ybWFsaXplKGZlYXR1cmUpXTtcbiAgcmV0dXJuIHZhbHVlID09IFBPTFlGSUxMID8gdHJ1ZVxuICAgIDogdmFsdWUgPT0gTkFUSVZFID8gZmFsc2VcbiAgICA6IHR5cGVvZiBkZXRlY3Rpb24gPT0gJ2Z1bmN0aW9uJyA/IGZhaWxzKGRldGVjdGlvbilcbiAgICA6ICEhZGV0ZWN0aW9uO1xufTtcblxudmFyIG5vcm1hbGl6ZSA9IGlzRm9yY2VkLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgcmV0dXJuIFN0cmluZyhzdHJpbmcpLnJlcGxhY2UocmVwbGFjZW1lbnQsICcuJykudG9Mb3dlckNhc2UoKTtcbn07XG5cbnZhciBkYXRhID0gaXNGb3JjZWQuZGF0YSA9IHt9O1xudmFyIE5BVElWRSA9IGlzRm9yY2VkLk5BVElWRSA9ICdOJztcbnZhciBQT0xZRklMTCA9IGlzRm9yY2VkLlBPTFlGSUxMID0gJ1AnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRm9yY2VkO1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyAxMTE6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0eXBlb2YgaXQgPT09ICdvYmplY3QnID8gaXQgIT09IG51bGwgOiB0eXBlb2YgaXQgPT09ICdmdW5jdGlvbic7XG59O1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyAxOTEzOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSkge1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZhbHNlO1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA3ODUwOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTExKTtcbnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MzI2KTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUxMTIpO1xuXG52YXIgTUFUQ0ggPSB3ZWxsS25vd25TeW1ib2woJ21hdGNoJyk7XG5cbi8vIGBJc1JlZ0V4cGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWlzcmVnZXhwXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgaXNSZWdFeHA7XG4gIHJldHVybiBpc09iamVjdChpdCkgJiYgKChpc1JlZ0V4cCA9IGl0W01BVENIXSkgIT09IHVuZGVmaW5lZCA/ICEhaXNSZWdFeHAgOiBjbGFzc29mKGl0KSA9PSAnUmVnRXhwJyk7XG59O1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA5MjEyOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oOTY3MCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXJhdG9yKSB7XG4gIHZhciByZXR1cm5NZXRob2QgPSBpdGVyYXRvclsncmV0dXJuJ107XG4gIGlmIChyZXR1cm5NZXRob2QgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBhbk9iamVjdChyZXR1cm5NZXRob2QuY2FsbChpdGVyYXRvcikpLnZhbHVlO1xuICB9XG59O1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyAzMzgzOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcyOTMpO1xudmFyIGdldFByb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NTE4KTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg4ODApO1xudmFyIGhhcyA9IF9fd2VicGFja19yZXF1aXJlX18oNjY1Nik7XG52YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1MTEyKTtcbnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOTEzKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgPSBmYWxzZTtcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuXG4vLyBgJUl0ZXJhdG9yUHJvdG90eXBlJWAgb2JqZWN0XG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSVpdGVyYXRvcnByb3RvdHlwZSUtb2JqZWN0XG52YXIgSXRlcmF0b3JQcm90b3R5cGUsIFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSwgYXJyYXlJdGVyYXRvcjtcblxuaWYgKFtdLmtleXMpIHtcbiAgYXJyYXlJdGVyYXRvciA9IFtdLmtleXMoKTtcbiAgLy8gU2FmYXJpIDggaGFzIGJ1Z2d5IGl0ZXJhdG9ycyB3L28gYG5leHRgXG4gIGlmICghKCduZXh0JyBpbiBhcnJheUl0ZXJhdG9yKSkgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IHRydWU7XG4gIGVsc2Uge1xuICAgIFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKGdldFByb3RvdHlwZU9mKGFycmF5SXRlcmF0b3IpKTtcbiAgICBpZiAoUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlKSBJdGVyYXRvclByb3RvdHlwZSA9IFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZTtcbiAgfVxufVxuXG52YXIgTkVXX0lURVJBVE9SX1BST1RPVFlQRSA9IEl0ZXJhdG9yUHJvdG90eXBlID09IHVuZGVmaW5lZCB8fCBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHZhciB0ZXN0ID0ge307XG4gIC8vIEZGNDQtIGxlZ2FjeSBpdGVyYXRvcnMgY2FzZVxuICByZXR1cm4gSXRlcmF0b3JQcm90b3R5cGVbSVRFUkFUT1JdLmNhbGwodGVzdCkgIT09IHRlc3Q7XG59KTtcblxuaWYgKE5FV19JVEVSQVRPUl9QUk9UT1RZUEUpIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG5cbi8vIDI1LjEuMi4xLjEgJUl0ZXJhdG9yUHJvdG90eXBlJVtAQGl0ZXJhdG9yXSgpXG5pZiAoKCFJU19QVVJFIHx8IE5FV19JVEVSQVRPUl9QUk9UT1RZUEUpICYmICFoYXMoSXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SKSkge1xuICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoSXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SLCByZXR1cm5UaGlzKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEl0ZXJhdG9yUHJvdG90eXBlOiBJdGVyYXRvclByb3RvdHlwZSxcbiAgQlVHR1lfU0FGQVJJX0lURVJBVE9SUzogQlVHR1lfU0FGQVJJX0lURVJBVE9SU1xufTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gNzQ5Nzpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHtcblxubW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gMTMzOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNzI5Myk7XG5cbm1vZHVsZS5leHBvcnRzID0gISFPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzICYmICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIENocm9tZSAzOCBTeW1ib2wgaGFzIGluY29ycmVjdCB0b1N0cmluZyBjb252ZXJzaW9uXG4gIC8qIGdsb2JhbCBTeW1ib2wgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmcgKi9cbiAgcmV0dXJuICFTdHJpbmcoU3ltYm9sKCkpO1xufSk7XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDU5MDpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcyOTMpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oNTExMik7XG52YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oMTkxMyk7XG5cbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIgdXJsID0gbmV3IFVSTCgnYj9hPTEmYj0yJmM9MycsICdodHRwOi8vYScpO1xuICB2YXIgc2VhcmNoUGFyYW1zID0gdXJsLnNlYXJjaFBhcmFtcztcbiAgdmFyIHJlc3VsdCA9ICcnO1xuICB1cmwucGF0aG5hbWUgPSAnYyUyMGQnO1xuICBzZWFyY2hQYXJhbXMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgIHNlYXJjaFBhcmFtc1snZGVsZXRlJ10oJ2InKTtcbiAgICByZXN1bHQgKz0ga2V5ICsgdmFsdWU7XG4gIH0pO1xuICByZXR1cm4gKElTX1BVUkUgJiYgIXVybC50b0pTT04pXG4gICAgfHwgIXNlYXJjaFBhcmFtcy5zb3J0XG4gICAgfHwgdXJsLmhyZWYgIT09ICdodHRwOi8vYS9jJTIwZD9hPTEmYz0zJ1xuICAgIHx8IHNlYXJjaFBhcmFtcy5nZXQoJ2MnKSAhPT0gJzMnXG4gICAgfHwgU3RyaW5nKG5ldyBVUkxTZWFyY2hQYXJhbXMoJz9hPTEnKSkgIT09ICdhPTEnXG4gICAgfHwgIXNlYXJjaFBhcmFtc1tJVEVSQVRPUl1cbiAgICAvLyB0aHJvd3MgaW4gRWRnZVxuICAgIHx8IG5ldyBVUkwoJ2h0dHBzOi8vYUBiJykudXNlcm5hbWUgIT09ICdhJ1xuICAgIHx8IG5ldyBVUkxTZWFyY2hQYXJhbXMobmV3IFVSTFNlYXJjaFBhcmFtcygnYT1iJykpLmdldCgnYScpICE9PSAnYidcbiAgICAvLyBub3QgcHVueWNvZGVkIGluIEVkZ2VcbiAgICB8fCBuZXcgVVJMKCdodHRwOi8v0YLQtdGB0YInKS5ob3N0ICE9PSAneG4tLWUxYXliYydcbiAgICAvLyBub3QgZXNjYXBlZCBpbiBDaHJvbWUgNjItXG4gICAgfHwgbmV3IFVSTCgnaHR0cDovL2Ej0LEnKS5oYXNoICE9PSAnIyVEMCVCMSdcbiAgICAvLyBmYWlscyBpbiBDaHJvbWUgNjYtXG4gICAgfHwgcmVzdWx0ICE9PSAnYTFjMydcbiAgICAvLyB0aHJvd3MgaW4gU2FmYXJpXG4gICAgfHwgbmV3IFVSTCgnaHR0cDovL3gnLCB1bmRlZmluZWQpLmhvc3QgIT09ICd4Jztcbn0pO1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA4NTM2OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4NTQpO1xudmFyIGluc3BlY3RTb3VyY2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI3ODgpO1xuXG52YXIgV2Vha01hcCA9IGdsb2JhbC5XZWFrTWFwO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nICYmIC9uYXRpdmUgY29kZS8udGVzdChpbnNwZWN0U291cmNlKFdlYWtNYXApKTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gMTU3NDpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxudmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NzgxKTtcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNzI5Myk7XG52YXIgb2JqZWN0S2V5cyA9IF9fd2VicGFja19yZXF1aXJlX18oMTk1Nik7XG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1MTgxKTtcbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oNTI5Nik7XG52YXIgdG9PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5MDgpO1xudmFyIEluZGV4ZWRPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgzNjEpO1xuXG52YXIgbmF0aXZlQXNzaWduID0gT2JqZWN0LmFzc2lnbjtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcblxuLy8gYE9iamVjdC5hc3NpZ25gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuYXNzaWduXG5tb2R1bGUuZXhwb3J0cyA9ICFuYXRpdmVBc3NpZ24gfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBzaG91bGQgaGF2ZSBjb3JyZWN0IG9yZGVyIG9mIG9wZXJhdGlvbnMgKEVkZ2UgYnVnKVxuICBpZiAoREVTQ1JJUFRPUlMgJiYgbmF0aXZlQXNzaWduKHsgYjogMSB9LCBuYXRpdmVBc3NpZ24oZGVmaW5lUHJvcGVydHkoe30sICdhJywge1xuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICBkZWZpbmVQcm9wZXJ0eSh0aGlzLCAnYicsIHtcbiAgICAgICAgdmFsdWU6IDMsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG4gIH0pLCB7IGI6IDIgfSkpLmIgIT09IDEpIHJldHVybiB0cnVlO1xuICAvLyBzaG91bGQgd29yayB3aXRoIHN5bWJvbHMgYW5kIHNob3VsZCBoYXZlIGRldGVybWluaXN0aWMgcHJvcGVydHkgb3JkZXIgKFY4IGJ1ZylcbiAgdmFyIEEgPSB7fTtcbiAgdmFyIEIgPSB7fTtcbiAgLyogZ2xvYmFsIFN5bWJvbCAtLSByZXF1aXJlZCBmb3IgdGVzdGluZyAqL1xuICB2YXIgc3ltYm9sID0gU3ltYm9sKCk7XG4gIHZhciBhbHBoYWJldCA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdCc7XG4gIEFbc3ltYm9sXSA9IDc7XG4gIGFscGhhYmV0LnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uIChjaHIpIHsgQltjaHJdID0gY2hyOyB9KTtcbiAgcmV0dXJuIG5hdGl2ZUFzc2lnbih7fSwgQSlbc3ltYm9sXSAhPSA3IHx8IG9iamVjdEtleXMobmF0aXZlQXNzaWduKHt9LCBCKSkuam9pbignJykgIT0gYWxwaGFiZXQ7XG59KSA/IGZ1bmN0aW9uIGFzc2lnbih0YXJnZXQsIHNvdXJjZSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzIC0tIHJlcXVpcmVkIGZvciBgLmxlbmd0aGBcbiAgdmFyIFQgPSB0b09iamVjdCh0YXJnZXQpO1xuICB2YXIgYXJndW1lbnRzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgdmFyIGluZGV4ID0gMTtcbiAgdmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZS5mO1xuICB2YXIgcHJvcGVydHlJc0VudW1lcmFibGUgPSBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZS5mO1xuICB3aGlsZSAoYXJndW1lbnRzTGVuZ3RoID4gaW5kZXgpIHtcbiAgICB2YXIgUyA9IEluZGV4ZWRPYmplY3QoYXJndW1lbnRzW2luZGV4KytdKTtcbiAgICB2YXIga2V5cyA9IGdldE93blByb3BlcnR5U3ltYm9scyA/IG9iamVjdEtleXMoUykuY29uY2F0KGdldE93blByb3BlcnR5U3ltYm9scyhTKSkgOiBvYmplY3RLZXlzKFMpO1xuICAgIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgICB2YXIgaiA9IDA7XG4gICAgdmFyIGtleTtcbiAgICB3aGlsZSAobGVuZ3RoID4gaikge1xuICAgICAga2V5ID0ga2V5c1tqKytdO1xuICAgICAgaWYgKCFERVNDUklQVE9SUyB8fCBwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKFMsIGtleSkpIFRba2V5XSA9IFNba2V5XTtcbiAgICB9XG4gIH0gcmV0dXJuIFQ7XG59IDogbmF0aXZlQXNzaWduO1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyAzMDpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk2NzApO1xudmFyIGRlZmluZVByb3BlcnRpZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYwNDgpO1xudmFyIGVudW1CdWdLZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NDgpO1xudmFyIGhpZGRlbktleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM1MDEpO1xudmFyIGh0bWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ5MCk7XG52YXIgZG9jdW1lbnRDcmVhdGVFbGVtZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMTcpO1xudmFyIHNoYXJlZEtleSA9IF9fd2VicGFja19yZXF1aXJlX18oNjIwMCk7XG5cbnZhciBHVCA9ICc+JztcbnZhciBMVCA9ICc8JztcbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcbnZhciBTQ1JJUFQgPSAnc2NyaXB0JztcbnZhciBJRV9QUk9UTyA9IHNoYXJlZEtleSgnSUVfUFJPVE8nKTtcblxudmFyIEVtcHR5Q29uc3RydWN0b3IgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG5cbnZhciBzY3JpcHRUYWcgPSBmdW5jdGlvbiAoY29udGVudCkge1xuICByZXR1cm4gTFQgKyBTQ1JJUFQgKyBHVCArIGNvbnRlbnQgKyBMVCArICcvJyArIFNDUklQVCArIEdUO1xufTtcblxuLy8gQ3JlYXRlIG9iamVjdCB3aXRoIGZha2UgYG51bGxgIHByb3RvdHlwZTogdXNlIEFjdGl2ZVggT2JqZWN0IHdpdGggY2xlYXJlZCBwcm90b3R5cGVcbnZhciBOdWxsUHJvdG9PYmplY3RWaWFBY3RpdmVYID0gZnVuY3Rpb24gKGFjdGl2ZVhEb2N1bWVudCkge1xuICBhY3RpdmVYRG9jdW1lbnQud3JpdGUoc2NyaXB0VGFnKCcnKSk7XG4gIGFjdGl2ZVhEb2N1bWVudC5jbG9zZSgpO1xuICB2YXIgdGVtcCA9IGFjdGl2ZVhEb2N1bWVudC5wYXJlbnRXaW5kb3cuT2JqZWN0O1xuICBhY3RpdmVYRG9jdW1lbnQgPSBudWxsOyAvLyBhdm9pZCBtZW1vcnkgbGVha1xuICByZXR1cm4gdGVtcDtcbn07XG5cbi8vIENyZWF0ZSBvYmplY3Qgd2l0aCBmYWtlIGBudWxsYCBwcm90b3R5cGU6IHVzZSBpZnJhbWUgT2JqZWN0IHdpdGggY2xlYXJlZCBwcm90b3R5cGVcbnZhciBOdWxsUHJvdG9PYmplY3RWaWFJRnJhbWUgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIFRocmFzaCwgd2FzdGUgYW5kIHNvZG9teTogSUUgR0MgYnVnXG4gIHZhciBpZnJhbWUgPSBkb2N1bWVudENyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICB2YXIgSlMgPSAnamF2YScgKyBTQ1JJUFQgKyAnOic7XG4gIHZhciBpZnJhbWVEb2N1bWVudDtcbiAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIGh0bWwuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzQ3NVxuICBpZnJhbWUuc3JjID0gU3RyaW5nKEpTKTtcbiAgaWZyYW1lRG9jdW1lbnQgPSBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgaWZyYW1lRG9jdW1lbnQub3BlbigpO1xuICBpZnJhbWVEb2N1bWVudC53cml0ZShzY3JpcHRUYWcoJ2RvY3VtZW50LkY9T2JqZWN0JykpO1xuICBpZnJhbWVEb2N1bWVudC5jbG9zZSgpO1xuICByZXR1cm4gaWZyYW1lRG9jdW1lbnQuRjtcbn07XG5cbi8vIENoZWNrIGZvciBkb2N1bWVudC5kb21haW4gYW5kIGFjdGl2ZSB4IHN1cHBvcnRcbi8vIE5vIG5lZWQgdG8gdXNlIGFjdGl2ZSB4IGFwcHJvYWNoIHdoZW4gZG9jdW1lbnQuZG9tYWluIGlzIG5vdCBzZXRcbi8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZXMtc2hpbXMvZXM1LXNoaW0vaXNzdWVzLzE1MFxuLy8gdmFyaWF0aW9uIG9mIGh0dHBzOi8vZ2l0aHViLmNvbS9raXRjYW1icmlkZ2UvZXM1LXNoaW0vY29tbWl0LzRmNzM4YWMwNjYzNDZcbi8vIGF2b2lkIElFIEdDIGJ1Z1xudmFyIGFjdGl2ZVhEb2N1bWVudDtcbnZhciBOdWxsUHJvdG9PYmplY3QgPSBmdW5jdGlvbiAoKSB7XG4gIHRyeSB7XG4gICAgLyogZ2xvYmFsIEFjdGl2ZVhPYmplY3QgLS0gb2xkIElFICovXG4gICAgYWN0aXZlWERvY3VtZW50ID0gZG9jdW1lbnQuZG9tYWluICYmIG5ldyBBY3RpdmVYT2JqZWN0KCdodG1sZmlsZScpO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBpZ25vcmUgKi8gfVxuICBOdWxsUHJvdG9PYmplY3QgPSBhY3RpdmVYRG9jdW1lbnQgPyBOdWxsUHJvdG9PYmplY3RWaWFBY3RpdmVYKGFjdGl2ZVhEb2N1bWVudCkgOiBOdWxsUHJvdG9PYmplY3RWaWFJRnJhbWUoKTtcbiAgdmFyIGxlbmd0aCA9IGVudW1CdWdLZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGxlbmd0aC0tKSBkZWxldGUgTnVsbFByb3RvT2JqZWN0W1BST1RPVFlQRV1bZW51bUJ1Z0tleXNbbGVuZ3RoXV07XG4gIHJldHVybiBOdWxsUHJvdG9PYmplY3QoKTtcbn07XG5cbmhpZGRlbktleXNbSUVfUFJPVE9dID0gdHJ1ZTtcblxuLy8gYE9iamVjdC5jcmVhdGVgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuY3JlYXRlXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5jcmVhdGUgfHwgZnVuY3Rpb24gY3JlYXRlKE8sIFByb3BlcnRpZXMpIHtcbiAgdmFyIHJlc3VsdDtcbiAgaWYgKE8gIT09IG51bGwpIHtcbiAgICBFbXB0eUNvbnN0cnVjdG9yW1BST1RPVFlQRV0gPSBhbk9iamVjdChPKTtcbiAgICByZXN1bHQgPSBuZXcgRW1wdHlDb25zdHJ1Y3RvcigpO1xuICAgIEVtcHR5Q29uc3RydWN0b3JbUFJPVE9UWVBFXSA9IG51bGw7XG4gICAgLy8gYWRkIFwiX19wcm90b19fXCIgZm9yIE9iamVjdC5nZXRQcm90b3R5cGVPZiBwb2x5ZmlsbFxuICAgIHJlc3VsdFtJRV9QUk9UT10gPSBPO1xuICB9IGVsc2UgcmVzdWx0ID0gTnVsbFByb3RvT2JqZWN0KCk7XG4gIHJldHVybiBQcm9wZXJ0aWVzID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiBkZWZpbmVQcm9wZXJ0aWVzKHJlc3VsdCwgUHJvcGVydGllcyk7XG59O1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA2MDQ4OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oOTc4MSk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMwNzApO1xudmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NjcwKTtcbnZhciBvYmplY3RLZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOTU2KTtcblxuLy8gYE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmRlZmluZXByb3BlcnRpZXNcbm1vZHVsZS5leHBvcnRzID0gREVTQ1JJUFRPUlMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcykge1xuICBhbk9iamVjdChPKTtcbiAgdmFyIGtleXMgPSBvYmplY3RLZXlzKFByb3BlcnRpZXMpO1xuICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBrZXk7XG4gIHdoaWxlIChsZW5ndGggPiBpbmRleCkgZGVmaW5lUHJvcGVydHlNb2R1bGUuZihPLCBrZXkgPSBrZXlzW2luZGV4KytdLCBQcm9wZXJ0aWVzW2tleV0pO1xuICByZXR1cm4gTztcbn07XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDMwNzA6XG4vKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NzgxKTtcbnZhciBJRThfRE9NX0RFRklORSA9IF9fd2VicGFja19yZXF1aXJlX18oNDY2NCk7XG52YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk2NzApO1xudmFyIHRvUHJpbWl0aXZlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NTkzKTtcblxudmFyIG5hdGl2ZURlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuXG4vLyBgT2JqZWN0LmRlZmluZVByb3BlcnR5YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmRlZmluZXByb3BlcnR5XG5leHBvcnRzLmYgPSBERVNDUklQVE9SUyA/IG5hdGl2ZURlZmluZVByb3BlcnR5IDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykge1xuICBhbk9iamVjdChPKTtcbiAgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBhbk9iamVjdChBdHRyaWJ1dGVzKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiBuYXRpdmVEZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICBpZiAoJ2dldCcgaW4gQXR0cmlidXRlcyB8fCAnc2V0JyBpbiBBdHRyaWJ1dGVzKSB0aHJvdyBUeXBlRXJyb3IoJ0FjY2Vzc29ycyBub3Qgc3VwcG9ydGVkJyk7XG4gIGlmICgndmFsdWUnIGluIEF0dHJpYnV0ZXMpIE9bUF0gPSBBdHRyaWJ1dGVzLnZhbHVlO1xuICByZXR1cm4gTztcbn07XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDEyMzY6XG4vKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NzgxKTtcbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oNTI5Nik7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5MTE0KTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU2NTYpO1xudmFyIHRvUHJpbWl0aXZlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NTkzKTtcbnZhciBoYXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY2NTYpO1xudmFyIElFOF9ET01fREVGSU5FID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NjY0KTtcblxudmFyIG5hdGl2ZUdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbi8vIGBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmdldG93bnByb3BlcnR5ZGVzY3JpcHRvclxuZXhwb3J0cy5mID0gREVTQ1JJUFRPUlMgPyBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCkge1xuICBPID0gdG9JbmRleGVkT2JqZWN0KE8pO1xuICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gIGlmIChJRThfRE9NX0RFRklORSkgdHJ5IHtcbiAgICByZXR1cm4gbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIGlmIChoYXMoTywgUCkpIHJldHVybiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoIXByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlLmYuY2FsbChPLCBQKSwgT1tQXSk7XG59O1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA4MDA2OlxuLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBpbnRlcm5hbE9iamVjdEtleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYzMjQpO1xudmFyIGVudW1CdWdLZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NDgpO1xuXG52YXIgaGlkZGVuS2V5cyA9IGVudW1CdWdLZXlzLmNvbmNhdCgnbGVuZ3RoJywgJ3Byb3RvdHlwZScpO1xuXG4vLyBgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZ2V0b3ducHJvcGVydHluYW1lc1xuZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhPKSB7XG4gIHJldHVybiBpbnRlcm5hbE9iamVjdEtleXMoTywgaGlkZGVuS2V5cyk7XG59O1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA1MTgxOlxuLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzKSB7XG5cbmV4cG9ydHMuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDk1MTg6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIGhhcyA9IF9fd2VicGFja19yZXF1aXJlX18oNjY1Nik7XG52YXIgdG9PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5MDgpO1xudmFyIHNoYXJlZEtleSA9IF9fd2VicGFja19yZXF1aXJlX18oNjIwMCk7XG52YXIgQ09SUkVDVF9QUk9UT1RZUEVfR0VUVEVSID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NTQ0KTtcblxudmFyIElFX1BST1RPID0gc2hhcmVkS2V5KCdJRV9QUk9UTycpO1xudmFyIE9iamVjdFByb3RvdHlwZSA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8vIGBPYmplY3QuZ2V0UHJvdG90eXBlT2ZgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZ2V0cHJvdG90eXBlb2Zcbm1vZHVsZS5leHBvcnRzID0gQ09SUkVDVF9QUk9UT1RZUEVfR0VUVEVSID8gT2JqZWN0LmdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gKE8pIHtcbiAgTyA9IHRvT2JqZWN0KE8pO1xuICBpZiAoaGFzKE8sIElFX1BST1RPKSkgcmV0dXJuIE9bSUVfUFJPVE9dO1xuICBpZiAodHlwZW9mIE8uY29uc3RydWN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBPIGluc3RhbmNlb2YgTy5jb25zdHJ1Y3Rvcikge1xuICAgIHJldHVybiBPLmNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgfSByZXR1cm4gTyBpbnN0YW5jZW9mIE9iamVjdCA/IE9iamVjdFByb3RvdHlwZSA6IG51bGw7XG59O1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA2MzI0OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBoYXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY2NTYpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oNTY1Nik7XG52YXIgaW5kZXhPZiA9IF9fd2VicGFja19yZXF1aXJlX18oMTMxOCkuaW5kZXhPZjtcbnZhciBoaWRkZW5LZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNTAxKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBuYW1lcykge1xuICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdChvYmplY3QpO1xuICB2YXIgaSA9IDA7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGtleTtcbiAgZm9yIChrZXkgaW4gTykgIWhhcyhoaWRkZW5LZXlzLCBrZXkpICYmIGhhcyhPLCBrZXkpICYmIHJlc3VsdC5wdXNoKGtleSk7XG4gIC8vIERvbid0IGVudW0gYnVnICYgaGlkZGVuIGtleXNcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIGlmIChoYXMoTywga2V5ID0gbmFtZXNbaSsrXSkpIHtcbiAgICB+aW5kZXhPZihyZXN1bHQsIGtleSkgfHwgcmVzdWx0LnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gMTk1Njpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgaW50ZXJuYWxPYmplY3RLZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2MzI0KTtcbnZhciBlbnVtQnVnS2V5cyA9IF9fd2VicGFja19yZXF1aXJlX18oNzQ4KTtcblxuLy8gYE9iamVjdC5rZXlzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmtleXNcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24ga2V5cyhPKSB7XG4gIHJldHVybiBpbnRlcm5hbE9iamVjdEtleXMoTywgZW51bUJ1Z0tleXMpO1xufTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gNTI5Njpcbi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxudmFyIG5hdGl2ZVByb3BlcnR5SXNFbnVtZXJhYmxlID0ge30ucHJvcGVydHlJc0VudW1lcmFibGU7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuLy8gTmFzaG9ybiB+IEpESzggYnVnXG52YXIgTkFTSE9STl9CVUcgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgJiYgIW5hdGl2ZVByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoeyAxOiAyIH0sIDEpO1xuXG4vLyBgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZWAgbWV0aG9kIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5wcm90b3R5cGUucHJvcGVydHlpc2VudW1lcmFibGVcbmV4cG9ydHMuZiA9IE5BU0hPUk5fQlVHID8gZnVuY3Rpb24gcHJvcGVydHlJc0VudW1lcmFibGUoVikge1xuICB2YXIgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0aGlzLCBWKTtcbiAgcmV0dXJuICEhZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLmVudW1lcmFibGU7XG59IDogbmF0aXZlUHJvcGVydHlJc0VudW1lcmFibGU7XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDc2NzQ6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gLS0gc2FmZSAqL1xudmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NjcwKTtcbnZhciBhUG9zc2libGVQcm90b3R5cGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYwNzcpO1xuXG4vLyBgT2JqZWN0LnNldFByb3RvdHlwZU9mYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LnNldHByb3RvdHlwZW9mXG4vLyBXb3JrcyB3aXRoIF9fcHJvdG9fXyBvbmx5LiBPbGQgdjggY2FuJ3Qgd29yayB3aXRoIG51bGwgcHJvdG8gb2JqZWN0cy5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8ICgnX19wcm90b19fJyBpbiB7fSA/IGZ1bmN0aW9uICgpIHtcbiAgdmFyIENPUlJFQ1RfU0VUVEVSID0gZmFsc2U7XG4gIHZhciB0ZXN0ID0ge307XG4gIHZhciBzZXR0ZXI7XG4gIHRyeSB7XG4gICAgc2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QucHJvdG90eXBlLCAnX19wcm90b19fJykuc2V0O1xuICAgIHNldHRlci5jYWxsKHRlc3QsIFtdKTtcbiAgICBDT1JSRUNUX1NFVFRFUiA9IHRlc3QgaW5zdGFuY2VvZiBBcnJheTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICByZXR1cm4gZnVuY3Rpb24gc2V0UHJvdG90eXBlT2YoTywgcHJvdG8pIHtcbiAgICBhbk9iamVjdChPKTtcbiAgICBhUG9zc2libGVQcm90b3R5cGUocHJvdG8pO1xuICAgIGlmIChDT1JSRUNUX1NFVFRFUikgc2V0dGVyLmNhbGwoTywgcHJvdG8pO1xuICAgIGVsc2UgTy5fX3Byb3RvX18gPSBwcm90bztcbiAgICByZXR1cm4gTztcbiAgfTtcbn0oKSA6IHVuZGVmaW5lZCk7XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDI4ODpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxudmFyIFRPX1NUUklOR19UQUdfU1VQUE9SVCA9IF9fd2VicGFja19yZXF1aXJlX18oMTY5NCk7XG52YXIgY2xhc3NvZiA9IF9fd2VicGFja19yZXF1aXJlX18oNjQ4KTtcblxuLy8gYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nXG5tb2R1bGUuZXhwb3J0cyA9IFRPX1NUUklOR19UQUdfU1VQUE9SVCA/IHt9LnRvU3RyaW5nIDogZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gIHJldHVybiAnW29iamVjdCAnICsgY2xhc3NvZih0aGlzKSArICddJztcbn07XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDM4ODc6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIGdldEJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUwMDUpO1xudmFyIGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgwMDYpO1xudmFyIGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oNTE4MSk7XG52YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk2NzApO1xuXG4vLyBhbGwgb2JqZWN0IGtleXMsIGluY2x1ZGVzIG5vbi1lbnVtZXJhYmxlIGFuZCBzeW1ib2xzXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW4oJ1JlZmxlY3QnLCAnb3duS2V5cycpIHx8IGZ1bmN0aW9uIG93bktleXMoaXQpIHtcbiAgdmFyIGtleXMgPSBnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlLmYoYW5PYmplY3QoaXQpKTtcbiAgdmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZS5mO1xuICByZXR1cm4gZ2V0T3duUHJvcGVydHlTeW1ib2xzID8ga2V5cy5jb25jYXQoZ2V0T3duUHJvcGVydHlTeW1ib2xzKGl0KSkgOiBrZXlzO1xufTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gODU3OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4NTQpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdsb2JhbDtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gMjI0ODpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgcmVkZWZpbmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzMjApO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIHNyYywgb3B0aW9ucykge1xuICBmb3IgKHZhciBrZXkgaW4gc3JjKSByZWRlZmluZSh0YXJnZXQsIGtleSwgc3JjW2tleV0sIG9wdGlvbnMpO1xuICByZXR1cm4gdGFyZ2V0O1xufTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gMTMyMDpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3ODU0KTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg4ODApO1xudmFyIGhhcyA9IF9fd2VicGFja19yZXF1aXJlX18oNjY1Nik7XG52YXIgc2V0R2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNTA1KTtcbnZhciBpbnNwZWN0U291cmNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNzg4KTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5OTA5KTtcblxudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldDtcbnZhciBlbmZvcmNlSW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZW5mb3JjZTtcbnZhciBURU1QTEFURSA9IFN0cmluZyhTdHJpbmcpLnNwbGl0KCdTdHJpbmcnKTtcblxuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIGtleSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgdmFyIHVuc2FmZSA9IG9wdGlvbnMgPyAhIW9wdGlvbnMudW5zYWZlIDogZmFsc2U7XG4gIHZhciBzaW1wbGUgPSBvcHRpb25zID8gISFvcHRpb25zLmVudW1lcmFibGUgOiBmYWxzZTtcbiAgdmFyIG5vVGFyZ2V0R2V0ID0gb3B0aW9ucyA/ICEhb3B0aW9ucy5ub1RhcmdldEdldCA6IGZhbHNlO1xuICB2YXIgc3RhdGU7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJykge1xuICAgIGlmICh0eXBlb2Yga2V5ID09ICdzdHJpbmcnICYmICFoYXModmFsdWUsICduYW1lJykpIHtcbiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSh2YWx1ZSwgJ25hbWUnLCBrZXkpO1xuICAgIH1cbiAgICBzdGF0ZSA9IGVuZm9yY2VJbnRlcm5hbFN0YXRlKHZhbHVlKTtcbiAgICBpZiAoIXN0YXRlLnNvdXJjZSkge1xuICAgICAgc3RhdGUuc291cmNlID0gVEVNUExBVEUuam9pbih0eXBlb2Yga2V5ID09ICdzdHJpbmcnID8ga2V5IDogJycpO1xuICAgIH1cbiAgfVxuICBpZiAoTyA9PT0gZ2xvYmFsKSB7XG4gICAgaWYgKHNpbXBsZSkgT1trZXldID0gdmFsdWU7XG4gICAgZWxzZSBzZXRHbG9iYWwoa2V5LCB2YWx1ZSk7XG4gICAgcmV0dXJuO1xuICB9IGVsc2UgaWYgKCF1bnNhZmUpIHtcbiAgICBkZWxldGUgT1trZXldO1xuICB9IGVsc2UgaWYgKCFub1RhcmdldEdldCAmJiBPW2tleV0pIHtcbiAgICBzaW1wbGUgPSB0cnVlO1xuICB9XG4gIGlmIChzaW1wbGUpIE9ba2V5XSA9IHZhbHVlO1xuICBlbHNlIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShPLCBrZXksIHZhbHVlKTtcbi8vIGFkZCBmYWtlIEZ1bmN0aW9uI3RvU3RyaW5nIGZvciBjb3JyZWN0IHdvcmsgd3JhcHBlZCBtZXRob2RzIC8gY29uc3RydWN0b3JzIHdpdGggbWV0aG9kcyBsaWtlIExvRGFzaCBpc05hdGl2ZVxufSkoRnVuY3Rpb24ucHJvdG90eXBlLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgcmV0dXJuIHR5cGVvZiB0aGlzID09ICdmdW5jdGlvbicgJiYgZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS5zb3VyY2UgfHwgaW5zcGVjdFNvdXJjZSh0aGlzKTtcbn0pO1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA3NjUxOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MzI2KTtcbnZhciByZWdleHBFeGVjID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMjYxKTtcblxuLy8gYFJlZ0V4cEV4ZWNgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1yZWdleHBleGVjXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChSLCBTKSB7XG4gIHZhciBleGVjID0gUi5leGVjO1xuICBpZiAodHlwZW9mIGV4ZWMgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgcmVzdWx0ID0gZXhlYy5jYWxsKFIsIFMpO1xuICAgIGlmICh0eXBlb2YgcmVzdWx0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgVHlwZUVycm9yKCdSZWdFeHAgZXhlYyBtZXRob2QgcmV0dXJuZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYW4gT2JqZWN0IG9yIG51bGwnKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGlmIChjbGFzc29mKFIpICE9PSAnUmVnRXhwJykge1xuICAgIHRocm93IFR5cGVFcnJvcignUmVnRXhwI2V4ZWMgY2FsbGVkIG9uIGluY29tcGF0aWJsZSByZWNlaXZlcicpO1xuICB9XG5cbiAgcmV0dXJuIHJlZ2V4cEV4ZWMuY2FsbChSLCBTKTtcbn07XG5cblxuXG4vKioqLyB9KSxcblxuLyoqKi8gMjI2MTpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxudmFyIHJlZ2V4cEZsYWdzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3MDY2KTtcbnZhciBzdGlja3lIZWxwZXJzID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOTk5KTtcblxudmFyIG5hdGl2ZUV4ZWMgPSBSZWdFeHAucHJvdG90eXBlLmV4ZWM7XG4vLyBUaGlzIGFsd2F5cyByZWZlcnMgdG8gdGhlIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbiwgYmVjYXVzZSB0aGVcbi8vIFN0cmluZyNyZXBsYWNlIHBvbHlmaWxsIHVzZXMgLi9maXgtcmVnZXhwLXdlbGwta25vd24tc3ltYm9sLWxvZ2ljLmpzLFxuLy8gd2hpY2ggbG9hZHMgdGhpcyBmaWxlIGJlZm9yZSBwYXRjaGluZyB0aGUgbWV0aG9kLlxudmFyIG5hdGl2ZVJlcGxhY2UgPSBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2U7XG5cbnZhciBwYXRjaGVkRXhlYyA9IG5hdGl2ZUV4ZWM7XG5cbnZhciBVUERBVEVTX0xBU1RfSU5ERVhfV1JPTkcgPSAoZnVuY3Rpb24gKCkge1xuICB2YXIgcmUxID0gL2EvO1xuICB2YXIgcmUyID0gL2IqL2c7XG4gIG5hdGl2ZUV4ZWMuY2FsbChyZTEsICdhJyk7XG4gIG5hdGl2ZUV4ZWMuY2FsbChyZTIsICdhJyk7XG4gIHJldHVybiByZTEubGFzdEluZGV4ICE9PSAwIHx8IHJlMi5sYXN0SW5kZXggIT09IDA7XG59KSgpO1xuXG52YXIgVU5TVVBQT1JURURfWSA9IHN0aWNreUhlbHBlcnMuVU5TVVBQT1JURURfWSB8fCBzdGlja3lIZWxwZXJzLkJST0tFTl9DQVJFVDtcblxuLy8gbm9ucGFydGljaXBhdGluZyBjYXB0dXJpbmcgZ3JvdXAsIGNvcGllZCBmcm9tIGVzNS1zaGltJ3MgU3RyaW5nI3NwbGl0IHBhdGNoLlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlZ2V4cC9uby1hc3NlcnRpb24tY2FwdHVyaW5nLWdyb3VwLCByZWdleHAvbm8tZW1wdHktZ3JvdXAgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbnZhciBOUENHX0lOQ0xVREVEID0gLygpPz8vLmV4ZWMoJycpWzFdICE9PSB1bmRlZmluZWQ7XG5cbnZhciBQQVRDSCA9IFVQREFURVNfTEFTVF9JTkRFWF9XUk9ORyB8fCBOUENHX0lOQ0xVREVEIHx8IFVOU1VQUE9SVEVEX1k7XG5cbmlmIChQQVRDSCkge1xuICBwYXRjaGVkRXhlYyA9IGZ1bmN0aW9uIGV4ZWMoc3RyKSB7XG4gICAgdmFyIHJlID0gdGhpcztcbiAgICB2YXIgbGFzdEluZGV4LCByZUNvcHksIG1hdGNoLCBpO1xuICAgIHZhciBzdGlja3kgPSBVTlNVUFBPUlRFRF9ZICYmIHJlLnN0aWNreTtcbiAgICB2YXIgZmxhZ3MgPSByZWdleHBGbGFncy5jYWxsKHJlKTtcbiAgICB2YXIgc291cmNlID0gcmUuc291cmNlO1xuICAgIHZhciBjaGFyc0FkZGVkID0gMDtcbiAgICB2YXIgc3RyQ29weSA9IHN0cjtcblxuICAgIGlmIChzdGlja3kpIHtcbiAgICAgIGZsYWdzID0gZmxhZ3MucmVwbGFjZSgneScsICcnKTtcbiAgICAgIGlmIChmbGFncy5pbmRleE9mKCdnJykgPT09IC0xKSB7XG4gICAgICAgIGZsYWdzICs9ICdnJztcbiAgICAgIH1cblxuICAgICAgc3RyQ29weSA9IFN0cmluZyhzdHIpLnNsaWNlKHJlLmxhc3RJbmRleCk7XG4gICAgICAvLyBTdXBwb3J0IGFuY2hvcmVkIHN0aWNreSBiZWhhdmlvci5cbiAgICAgIGlmIChyZS5sYXN0SW5kZXggPiAwICYmICghcmUubXVsdGlsaW5lIHx8IHJlLm11bHRpbGluZSAmJiBzdHJbcmUubGFzdEluZGV4IC0gMV0gIT09ICdcXG4nKSkge1xuICAgICAgICBzb3VyY2UgPSAnKD86ICcgKyBzb3VyY2UgKyAnKSc7XG4gICAgICAgIHN0ckNvcHkgPSAnICcgKyBzdHJDb3B5O1xuICAgICAgICBjaGFyc0FkZGVkKys7XG4gICAgICB9XG4gICAgICAvLyBeKD8gKyByeCArICkgaXMgbmVlZGVkLCBpbiBjb21iaW5hdGlvbiB3aXRoIHNvbWUgc3RyIHNsaWNpbmcsIHRvXG4gICAgICAvLyBzaW11bGF0ZSB0aGUgJ3knIGZsYWcuXG4gICAgICByZUNvcHkgPSBuZXcgUmVnRXhwKCdeKD86JyArIHNvdXJjZSArICcpJywgZmxhZ3MpO1xuICAgIH1cblxuICAgIGlmIChOUENHX0lOQ0xVREVEKSB7XG4gICAgICByZUNvcHkgPSBuZXcgUmVnRXhwKCdeJyArIHNvdXJjZSArICckKD8hXFxcXHMpJywgZmxhZ3MpO1xuICAgIH1cbiAgICBpZiAoVVBEQVRFU19MQVNUX0lOREVYX1dST05HKSBsYXN0SW5kZXggPSByZS5sYXN0SW5kZXg7XG5cbiAgICBtYXRjaCA9IG5hdGl2ZUV4ZWMuY2FsbChzdGlja3kgPyByZUNvcHkgOiByZSwgc3RyQ29weSk7XG5cbiAgICBpZiAoc3RpY2t5KSB7XG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgbWF0Y2guaW5wdXQgPSBtYXRjaC5pbnB1dC5zbGljZShjaGFyc0FkZGVkKTtcbiAgICAgICAgbWF0Y2hbMF0gPSBtYXRjaFswXS5zbGljZShjaGFyc0FkZGVkKTtcbiAgICAgICAgbWF0Y2guaW5kZXggPSByZS5sYXN0SW5kZXg7XG4gICAgICAgIHJlLmxhc3RJbmRleCArPSBtYXRjaFswXS5sZW5ndGg7XG4gICAgICB9IGVsc2UgcmUubGFzdEluZGV4ID0gMDtcbiAgICB9IGVsc2UgaWYgKFVQREFURVNfTEFTVF9JTkRFWF9XUk9ORyAmJiBtYXRjaCkge1xuICAgICAgcmUubGFzdEluZGV4ID0gcmUuZ2xvYmFsID8gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGggOiBsYXN0SW5kZXg7XG4gICAgfVxuICAgIGlmIChOUENHX0lOQ0xVREVEICYmIG1hdGNoICYmIG1hdGNoLmxlbmd0aCA+IDEpIHtcbiAgICAgIC8vIEZpeCBicm93c2VycyB3aG9zZSBgZXhlY2AgbWV0aG9kcyBkb24ndCBjb25zaXN0ZW50bHkgcmV0dXJuIGB1bmRlZmluZWRgXG4gICAgICAvLyBmb3IgTlBDRywgbGlrZSBJRTguIE5PVEU6IFRoaXMgZG9lc24nIHdvcmsgZm9yIC8oLj8pPy9cbiAgICAgIG5hdGl2ZVJlcGxhY2UuY2FsbChtYXRjaFswXSwgcmVDb3B5LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZvciAoaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoIC0gMjsgaSsrKSB7XG4gICAgICAgICAgaWYgKGFyZ3VtZW50c1tpXSA9PT0gdW5kZWZpbmVkKSBtYXRjaFtpXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hdGNoO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGNoZWRFeGVjO1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA3MDY2OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG52YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk2NzApO1xuXG4vLyBgUmVnRXhwLnByb3RvdHlwZS5mbGFnc2AgZ2V0dGVyIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWdldC1yZWdleHAucHJvdG90eXBlLmZsYWdzXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHRoYXQgPSBhbk9iamVjdCh0aGlzKTtcbiAgdmFyIHJlc3VsdCA9ICcnO1xuICBpZiAodGhhdC5nbG9iYWwpIHJlc3VsdCArPSAnZyc7XG4gIGlmICh0aGF0Lmlnbm9yZUNhc2UpIHJlc3VsdCArPSAnaSc7XG4gIGlmICh0aGF0Lm11bHRpbGluZSkgcmVzdWx0ICs9ICdtJztcbiAgaWYgKHRoYXQuZG90QWxsKSByZXN1bHQgKz0gJ3MnO1xuICBpZiAodGhhdC51bmljb2RlKSByZXN1bHQgKz0gJ3UnO1xuICBpZiAodGhhdC5zdGlja3kpIHJlc3VsdCArPSAneSc7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyAyOTk5OlxuLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNzI5Myk7XG5cbi8vIGJhYmVsLW1pbmlmeSB0cmFuc3BpbGVzIFJlZ0V4cCgnYScsICd5JykgLT4gL2EveSBhbmQgaXQgY2F1c2VzIFN5bnRheEVycm9yLFxuLy8gc28gd2UgdXNlIGFuIGludGVybWVkaWF0ZSBmdW5jdGlvbi5cbmZ1bmN0aW9uIFJFKHMsIGYpIHtcbiAgcmV0dXJuIFJlZ0V4cChzLCBmKTtcbn1cblxuZXhwb3J0cy5VTlNVUFBPUlRFRF9ZID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBiYWJlbC1taW5pZnkgdHJhbnNwaWxlcyBSZWdFeHAoJ2EnLCAneScpIC0+IC9hL3kgYW5kIGl0IGNhdXNlcyBTeW50YXhFcnJvclxuICB2YXIgcmUgPSBSRSgnYScsICd5Jyk7XG4gIHJlLmxhc3RJbmRleCA9IDI7XG4gIHJldHVybiByZS5leGVjKCdhYmNkJykgIT0gbnVsbDtcbn0pO1xuXG5leHBvcnRzLkJST0tFTl9DQVJFVCA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzczNjg3XG4gIHZhciByZSA9IFJFKCdecicsICdneScpO1xuICByZS5sYXN0SW5kZXggPSAyO1xuICByZXR1cm4gcmUuZXhlYygnc3RyJykgIT0gbnVsbDtcbn0pO1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA0NDg4OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSkge1xuXG4vLyBgUmVxdWlyZU9iamVjdENvZXJjaWJsZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXJlcXVpcmVvYmplY3Rjb2VyY2libGVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCA9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uIFwiICsgaXQpO1xuICByZXR1cm4gaXQ7XG59O1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyAzNTA1OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4NTQpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oODg4MCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgdHJ5IHtcbiAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoZ2xvYmFsLCBrZXksIHZhbHVlKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBnbG9iYWxba2V5XSA9IHZhbHVlO1xuICB9IHJldHVybiB2YWx1ZTtcbn07XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDYzNDA6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBnZXRCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1MDA1KTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oMzA3MCk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1MTEyKTtcbnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oOTc4MSk7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENPTlNUUlVDVE9SX05BTUUpIHtcbiAgdmFyIENvbnN0cnVjdG9yID0gZ2V0QnVpbHRJbihDT05TVFJVQ1RPUl9OQU1FKTtcbiAgdmFyIGRlZmluZVByb3BlcnR5ID0gZGVmaW5lUHJvcGVydHlNb2R1bGUuZjtcblxuICBpZiAoREVTQ1JJUFRPUlMgJiYgQ29uc3RydWN0b3IgJiYgIUNvbnN0cnVjdG9yW1NQRUNJRVNdKSB7XG4gICAgZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsIFNQRUNJRVMsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfVxuICAgIH0pO1xuICB9XG59O1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA4MDAzOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBkZWZpbmVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oMzA3MCkuZjtcbnZhciBoYXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY2NTYpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oNTExMik7XG5cbnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgVEFHLCBTVEFUSUMpIHtcbiAgaWYgKGl0ICYmICFoYXMoaXQgPSBTVEFUSUMgPyBpdCA6IGl0LnByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRykpIHtcbiAgICBkZWZpbmVQcm9wZXJ0eShpdCwgVE9fU1RSSU5HX1RBRywgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiBUQUcgfSk7XG4gIH1cbn07XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDYyMDA6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIHNoYXJlZCA9IF9fd2VicGFja19yZXF1aXJlX18oMjMwOSk7XG52YXIgdWlkID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NzExKTtcblxudmFyIGtleXMgPSBzaGFyZWQoJ2tleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiBrZXlzW2tleV0gfHwgKGtleXNba2V5XSA9IHVpZChrZXkpKTtcbn07XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDU0NjU6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oNzg1NCk7XG52YXIgc2V0R2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNTA1KTtcblxudmFyIFNIQVJFRCA9ICdfX2NvcmUtanNfc2hhcmVkX18nO1xudmFyIHN0b3JlID0gZ2xvYmFsW1NIQVJFRF0gfHwgc2V0R2xvYmFsKFNIQVJFRCwge30pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHN0b3JlO1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyAyMzA5OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOTEzKTtcbnZhciBzdG9yZSA9IF9fd2VicGFja19yZXF1aXJlX18oNTQ2NSk7XG5cbihtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gIHJldHVybiBzdG9yZVtrZXldIHx8IChzdG9yZVtrZXldID0gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDoge30pO1xufSkoJ3ZlcnNpb25zJywgW10pLnB1c2goe1xuICB2ZXJzaW9uOiAnMy45LjAnLFxuICBtb2RlOiBJU19QVVJFID8gJ3B1cmUnIDogJ2dsb2JhbCcsXG4gIGNvcHlyaWdodDogJ8KpIDIwMjEgRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSknXG59KTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gNjcwNzpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk2NzApO1xudmFyIGFGdW5jdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oMzA5OSk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1MTEyKTtcblxudmFyIFNQRUNJRVMgPSB3ZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTtcblxuLy8gYFNwZWNpZXNDb25zdHJ1Y3RvcmAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXNwZWNpZXNjb25zdHJ1Y3RvclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywgZGVmYXVsdENvbnN0cnVjdG9yKSB7XG4gIHZhciBDID0gYW5PYmplY3QoTykuY29uc3RydWN0b3I7XG4gIHZhciBTO1xuICByZXR1cm4gQyA9PT0gdW5kZWZpbmVkIHx8IChTID0gYW5PYmplY3QoQylbU1BFQ0lFU10pID09IHVuZGVmaW5lZCA/IGRlZmF1bHRDb25zdHJ1Y3RvciA6IGFGdW5jdGlvbihTKTtcbn07XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDg3MTA6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIHRvSW50ZWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oOTk1OCk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oNDQ4OCk7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLnsgY29kZVBvaW50QXQsIGF0IH1gIG1ldGhvZHMgaW1wbGVtZW50YXRpb25cbnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoQ09OVkVSVF9UT19TVFJJTkcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgcG9zKSB7XG4gICAgdmFyIFMgPSBTdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSgkdGhpcykpO1xuICAgIHZhciBwb3NpdGlvbiA9IHRvSW50ZWdlcihwb3MpO1xuICAgIHZhciBzaXplID0gUy5sZW5ndGg7XG4gICAgdmFyIGZpcnN0LCBzZWNvbmQ7XG4gICAgaWYgKHBvc2l0aW9uIDwgMCB8fCBwb3NpdGlvbiA+PSBzaXplKSByZXR1cm4gQ09OVkVSVF9UT19TVFJJTkcgPyAnJyA6IHVuZGVmaW5lZDtcbiAgICBmaXJzdCA9IFMuY2hhckNvZGVBdChwb3NpdGlvbik7XG4gICAgcmV0dXJuIGZpcnN0IDwgMHhEODAwIHx8IGZpcnN0ID4gMHhEQkZGIHx8IHBvc2l0aW9uICsgMSA9PT0gc2l6ZVxuICAgICAgfHwgKHNlY29uZCA9IFMuY2hhckNvZGVBdChwb3NpdGlvbiArIDEpKSA8IDB4REMwMCB8fCBzZWNvbmQgPiAweERGRkZcbiAgICAgICAgPyBDT05WRVJUX1RPX1NUUklORyA/IFMuY2hhckF0KHBvc2l0aW9uKSA6IGZpcnN0XG4gICAgICAgIDogQ09OVkVSVF9UT19TVFJJTkcgPyBTLnNsaWNlKHBvc2l0aW9uLCBwb3NpdGlvbiArIDIpIDogKGZpcnN0IC0gMHhEODAwIDw8IDEwKSArIChzZWNvbmQgLSAweERDMDApICsgMHgxMDAwMDtcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBgU3RyaW5nLnByb3RvdHlwZS5jb2RlUG9pbnRBdGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5jb2RlcG9pbnRhdFxuICBjb2RlQXQ6IGNyZWF0ZU1ldGhvZChmYWxzZSksXG4gIC8vIGBTdHJpbmcucHJvdG90eXBlLmF0YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21hdGhpYXNieW5lbnMvU3RyaW5nLnByb3RvdHlwZS5hdFxuICBjaGFyQXQ6IGNyZWF0ZU1ldGhvZCh0cnVlKVxufTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gMzE5Nzpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbi8vIGJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9iZXN0aWVqcy9wdW55Y29kZS5qcy9ibG9iL21hc3Rlci9wdW55Y29kZS5qc1xudmFyIG1heEludCA9IDIxNDc0ODM2NDc7IC8vIGFrYS4gMHg3RkZGRkZGRiBvciAyXjMxLTFcbnZhciBiYXNlID0gMzY7XG52YXIgdE1pbiA9IDE7XG52YXIgdE1heCA9IDI2O1xudmFyIHNrZXcgPSAzODtcbnZhciBkYW1wID0gNzAwO1xudmFyIGluaXRpYWxCaWFzID0gNzI7XG52YXIgaW5pdGlhbE4gPSAxMjg7IC8vIDB4ODBcbnZhciBkZWxpbWl0ZXIgPSAnLSc7IC8vICdcXHgyRCdcbnZhciByZWdleE5vbkFTQ0lJID0gL1teXFwwLVxcdTAwN0VdLzsgLy8gbm9uLUFTQ0lJIGNoYXJzXG52YXIgcmVnZXhTZXBhcmF0b3JzID0gL1suXFx1MzAwMlxcdUZGMEVcXHVGRjYxXS9nOyAvLyBSRkMgMzQ5MCBzZXBhcmF0b3JzXG52YXIgT1ZFUkZMT1dfRVJST1IgPSAnT3ZlcmZsb3c6IGlucHV0IG5lZWRzIHdpZGVyIGludGVnZXJzIHRvIHByb2Nlc3MnO1xudmFyIGJhc2VNaW51c1RNaW4gPSBiYXNlIC0gdE1pbjtcbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG52YXIgc3RyaW5nRnJvbUNoYXJDb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIG51bWVyaWMgY29kZSBwb2ludHMgb2YgZWFjaCBVbmljb2RlXG4gKiBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy4gV2hpbGUgSmF2YVNjcmlwdCB1c2VzIFVDUy0yIGludGVybmFsbHksXG4gKiB0aGlzIGZ1bmN0aW9uIHdpbGwgY29udmVydCBhIHBhaXIgb2Ygc3Vycm9nYXRlIGhhbHZlcyAoZWFjaCBvZiB3aGljaFxuICogVUNTLTIgZXhwb3NlcyBhcyBzZXBhcmF0ZSBjaGFyYWN0ZXJzKSBpbnRvIGEgc2luZ2xlIGNvZGUgcG9pbnQsXG4gKiBtYXRjaGluZyBVVEYtMTYuXG4gKi9cbnZhciB1Y3MyZGVjb2RlID0gZnVuY3Rpb24gKHN0cmluZykge1xuICB2YXIgb3V0cHV0ID0gW107XG4gIHZhciBjb3VudGVyID0gMDtcbiAgdmFyIGxlbmd0aCA9IHN0cmluZy5sZW5ndGg7XG4gIHdoaWxlIChjb3VudGVyIDwgbGVuZ3RoKSB7XG4gICAgdmFyIHZhbHVlID0gc3RyaW5nLmNoYXJDb2RlQXQoY291bnRlcisrKTtcbiAgICBpZiAodmFsdWUgPj0gMHhEODAwICYmIHZhbHVlIDw9IDB4REJGRiAmJiBjb3VudGVyIDwgbGVuZ3RoKSB7XG4gICAgICAvLyBJdCdzIGEgaGlnaCBzdXJyb2dhdGUsIGFuZCB0aGVyZSBpcyBhIG5leHQgY2hhcmFjdGVyLlxuICAgICAgdmFyIGV4dHJhID0gc3RyaW5nLmNoYXJDb2RlQXQoY291bnRlcisrKTtcbiAgICAgIGlmICgoZXh0cmEgJiAweEZDMDApID09IDB4REMwMCkgeyAvLyBMb3cgc3Vycm9nYXRlLlxuICAgICAgICBvdXRwdXQucHVzaCgoKHZhbHVlICYgMHgzRkYpIDw8IDEwKSArIChleHRyYSAmIDB4M0ZGKSArIDB4MTAwMDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSXQncyBhbiB1bm1hdGNoZWQgc3Vycm9nYXRlOyBvbmx5IGFwcGVuZCB0aGlzIGNvZGUgdW5pdCwgaW4gY2FzZSB0aGVcbiAgICAgICAgLy8gbmV4dCBjb2RlIHVuaXQgaXMgdGhlIGhpZ2ggc3Vycm9nYXRlIG9mIGEgc3Vycm9nYXRlIHBhaXIuXG4gICAgICAgIG91dHB1dC5wdXNoKHZhbHVlKTtcbiAgICAgICAgY291bnRlci0tO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBvdXRwdXQucHVzaCh2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXRwdXQ7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGEgZGlnaXQvaW50ZWdlciBpbnRvIGEgYmFzaWMgY29kZSBwb2ludC5cbiAqL1xudmFyIGRpZ2l0VG9CYXNpYyA9IGZ1bmN0aW9uIChkaWdpdCkge1xuICAvLyAgMC4uMjUgbWFwIHRvIEFTQ0lJIGEuLnogb3IgQS4uWlxuICAvLyAyNi4uMzUgbWFwIHRvIEFTQ0lJIDAuLjlcbiAgcmV0dXJuIGRpZ2l0ICsgMjIgKyA3NSAqIChkaWdpdCA8IDI2KTtcbn07XG5cbi8qKlxuICogQmlhcyBhZGFwdGF0aW9uIGZ1bmN0aW9uIGFzIHBlciBzZWN0aW9uIDMuNCBvZiBSRkMgMzQ5Mi5cbiAqIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNDkyI3NlY3Rpb24tMy40XG4gKi9cbnZhciBhZGFwdCA9IGZ1bmN0aW9uIChkZWx0YSwgbnVtUG9pbnRzLCBmaXJzdFRpbWUpIHtcbiAgdmFyIGsgPSAwO1xuICBkZWx0YSA9IGZpcnN0VGltZSA/IGZsb29yKGRlbHRhIC8gZGFtcCkgOiBkZWx0YSA+PiAxO1xuICBkZWx0YSArPSBmbG9vcihkZWx0YSAvIG51bVBvaW50cyk7XG4gIGZvciAoOyBkZWx0YSA+IGJhc2VNaW51c1RNaW4gKiB0TWF4ID4+IDE7IGsgKz0gYmFzZSkge1xuICAgIGRlbHRhID0gZmxvb3IoZGVsdGEgLyBiYXNlTWludXNUTWluKTtcbiAgfVxuICByZXR1cm4gZmxvb3IoayArIChiYXNlTWludXNUTWluICsgMSkgKiBkZWx0YSAvIChkZWx0YSArIHNrZXcpKTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYSBzdHJpbmcgb2YgVW5pY29kZSBzeW1ib2xzIChlLmcuIGEgZG9tYWluIG5hbWUgbGFiZWwpIHRvIGFcbiAqIFB1bnljb2RlIHN0cmluZyBvZiBBU0NJSS1vbmx5IHN5bWJvbHMuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtc3RhdGVtZW50cyAtLSBUT0RPXG52YXIgZW5jb2RlID0gZnVuY3Rpb24gKGlucHV0KSB7XG4gIHZhciBvdXRwdXQgPSBbXTtcblxuICAvLyBDb252ZXJ0IHRoZSBpbnB1dCBpbiBVQ1MtMiB0byBhbiBhcnJheSBvZiBVbmljb2RlIGNvZGUgcG9pbnRzLlxuICBpbnB1dCA9IHVjczJkZWNvZGUoaW5wdXQpO1xuXG4gIC8vIENhY2hlIHRoZSBsZW5ndGguXG4gIHZhciBpbnB1dExlbmd0aCA9IGlucHV0Lmxlbmd0aDtcblxuICAvLyBJbml0aWFsaXplIHRoZSBzdGF0ZS5cbiAgdmFyIG4gPSBpbml0aWFsTjtcbiAgdmFyIGRlbHRhID0gMDtcbiAgdmFyIGJpYXMgPSBpbml0aWFsQmlhcztcbiAgdmFyIGksIGN1cnJlbnRWYWx1ZTtcblxuICAvLyBIYW5kbGUgdGhlIGJhc2ljIGNvZGUgcG9pbnRzLlxuICBmb3IgKGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspIHtcbiAgICBjdXJyZW50VmFsdWUgPSBpbnB1dFtpXTtcbiAgICBpZiAoY3VycmVudFZhbHVlIDwgMHg4MCkge1xuICAgICAgb3V0cHV0LnB1c2goc3RyaW5nRnJvbUNoYXJDb2RlKGN1cnJlbnRWYWx1ZSkpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBiYXNpY0xlbmd0aCA9IG91dHB1dC5sZW5ndGg7IC8vIG51bWJlciBvZiBiYXNpYyBjb2RlIHBvaW50cy5cbiAgdmFyIGhhbmRsZWRDUENvdW50ID0gYmFzaWNMZW5ndGg7IC8vIG51bWJlciBvZiBjb2RlIHBvaW50cyB0aGF0IGhhdmUgYmVlbiBoYW5kbGVkO1xuXG4gIC8vIEZpbmlzaCB0aGUgYmFzaWMgc3RyaW5nIHdpdGggYSBkZWxpbWl0ZXIgdW5sZXNzIGl0J3MgZW1wdHkuXG4gIGlmIChiYXNpY0xlbmd0aCkge1xuICAgIG91dHB1dC5wdXNoKGRlbGltaXRlcik7XG4gIH1cblxuICAvLyBNYWluIGVuY29kaW5nIGxvb3A6XG4gIHdoaWxlIChoYW5kbGVkQ1BDb3VudCA8IGlucHV0TGVuZ3RoKSB7XG4gICAgLy8gQWxsIG5vbi1iYXNpYyBjb2RlIHBvaW50cyA8IG4gaGF2ZSBiZWVuIGhhbmRsZWQgYWxyZWFkeS4gRmluZCB0aGUgbmV4dCBsYXJnZXIgb25lOlxuICAgIHZhciBtID0gbWF4SW50O1xuICAgIGZvciAoaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykge1xuICAgICAgY3VycmVudFZhbHVlID0gaW5wdXRbaV07XG4gICAgICBpZiAoY3VycmVudFZhbHVlID49IG4gJiYgY3VycmVudFZhbHVlIDwgbSkge1xuICAgICAgICBtID0gY3VycmVudFZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEluY3JlYXNlIGBkZWx0YWAgZW5vdWdoIHRvIGFkdmFuY2UgdGhlIGRlY29kZXIncyA8bixpPiBzdGF0ZSB0byA8bSwwPiwgYnV0IGd1YXJkIGFnYWluc3Qgb3ZlcmZsb3cuXG4gICAgdmFyIGhhbmRsZWRDUENvdW50UGx1c09uZSA9IGhhbmRsZWRDUENvdW50ICsgMTtcbiAgICBpZiAobSAtIG4gPiBmbG9vcigobWF4SW50IC0gZGVsdGEpIC8gaGFuZGxlZENQQ291bnRQbHVzT25lKSkge1xuICAgICAgdGhyb3cgUmFuZ2VFcnJvcihPVkVSRkxPV19FUlJPUik7XG4gICAgfVxuXG4gICAgZGVsdGEgKz0gKG0gLSBuKSAqIGhhbmRsZWRDUENvdW50UGx1c09uZTtcbiAgICBuID0gbTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykge1xuICAgICAgY3VycmVudFZhbHVlID0gaW5wdXRbaV07XG4gICAgICBpZiAoY3VycmVudFZhbHVlIDwgbiAmJiArK2RlbHRhID4gbWF4SW50KSB7XG4gICAgICAgIHRocm93IFJhbmdlRXJyb3IoT1ZFUkZMT1dfRVJST1IpO1xuICAgICAgfVxuICAgICAgaWYgKGN1cnJlbnRWYWx1ZSA9PSBuKSB7XG4gICAgICAgIC8vIFJlcHJlc2VudCBkZWx0YSBhcyBhIGdlbmVyYWxpemVkIHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VyLlxuICAgICAgICB2YXIgcSA9IGRlbHRhO1xuICAgICAgICBmb3IgKHZhciBrID0gYmFzZTsgLyogbm8gY29uZGl0aW9uICovOyBrICs9IGJhc2UpIHtcbiAgICAgICAgICB2YXIgdCA9IGsgPD0gYmlhcyA/IHRNaW4gOiAoayA+PSBiaWFzICsgdE1heCA/IHRNYXggOiBrIC0gYmlhcyk7XG4gICAgICAgICAgaWYgKHEgPCB0KSBicmVhaztcbiAgICAgICAgICB2YXIgcU1pbnVzVCA9IHEgLSB0O1xuICAgICAgICAgIHZhciBiYXNlTWludXNUID0gYmFzZSAtIHQ7XG4gICAgICAgICAgb3V0cHV0LnB1c2goc3RyaW5nRnJvbUNoYXJDb2RlKGRpZ2l0VG9CYXNpYyh0ICsgcU1pbnVzVCAlIGJhc2VNaW51c1QpKSk7XG4gICAgICAgICAgcSA9IGZsb29yKHFNaW51c1QgLyBiYXNlTWludXNUKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG91dHB1dC5wdXNoKHN0cmluZ0Zyb21DaGFyQ29kZShkaWdpdFRvQmFzaWMocSkpKTtcbiAgICAgICAgYmlhcyA9IGFkYXB0KGRlbHRhLCBoYW5kbGVkQ1BDb3VudFBsdXNPbmUsIGhhbmRsZWRDUENvdW50ID09IGJhc2ljTGVuZ3RoKTtcbiAgICAgICAgZGVsdGEgPSAwO1xuICAgICAgICArK2hhbmRsZWRDUENvdW50O1xuICAgICAgfVxuICAgIH1cblxuICAgICsrZGVsdGE7XG4gICAgKytuO1xuICB9XG4gIHJldHVybiBvdXRwdXQuam9pbignJyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbnB1dCkge1xuICB2YXIgZW5jb2RlZCA9IFtdO1xuICB2YXIgbGFiZWxzID0gaW5wdXQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKHJlZ2V4U2VwYXJhdG9ycywgJ1xcdTAwMkUnKS5zcGxpdCgnLicpO1xuICB2YXIgaSwgbGFiZWw7XG4gIGZvciAoaSA9IDA7IGkgPCBsYWJlbHMubGVuZ3RoOyBpKyspIHtcbiAgICBsYWJlbCA9IGxhYmVsc1tpXTtcbiAgICBlbmNvZGVkLnB1c2gocmVnZXhOb25BU0NJSS50ZXN0KGxhYmVsKSA/ICd4bi0tJyArIGVuY29kZShsYWJlbCkgOiBsYWJlbCk7XG4gIH1cbiAgcmV0dXJuIGVuY29kZWQuam9pbignLicpO1xufTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gNjA5MTpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcyOTMpO1xudmFyIHdoaXRlc3BhY2VzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMzYxKTtcblxudmFyIG5vbiA9ICdcXHUyMDBCXFx1MDA4NVxcdTE4MEUnO1xuXG4vLyBjaGVjayB0aGF0IGEgbWV0aG9kIHdvcmtzIHdpdGggdGhlIGNvcnJlY3QgbGlzdFxuLy8gb2Ygd2hpdGVzcGFjZXMgYW5kIGhhcyBhIGNvcnJlY3QgbmFtZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTUVUSE9EX05BTUUpIHtcbiAgcmV0dXJuIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gISF3aGl0ZXNwYWNlc1tNRVRIT0RfTkFNRV0oKSB8fCBub25bTUVUSE9EX05BTUVdKCkgIT0gbm9uIHx8IHdoaXRlc3BhY2VzW01FVEhPRF9OQU1FXS5uYW1lICE9PSBNRVRIT0RfTkFNRTtcbiAgfSk7XG59O1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyAzMTExOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NDg4KTtcbnZhciB3aGl0ZXNwYWNlcyA9IF9fd2VicGFja19yZXF1aXJlX18oMTM2MSk7XG5cbnZhciB3aGl0ZXNwYWNlID0gJ1snICsgd2hpdGVzcGFjZXMgKyAnXSc7XG52YXIgbHRyaW0gPSBSZWdFeHAoJ14nICsgd2hpdGVzcGFjZSArIHdoaXRlc3BhY2UgKyAnKicpO1xudmFyIHJ0cmltID0gUmVnRXhwKHdoaXRlc3BhY2UgKyB3aGl0ZXNwYWNlICsgJyokJyk7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLnsgdHJpbSwgdHJpbVN0YXJ0LCB0cmltRW5kLCB0cmltTGVmdCwgdHJpbVJpZ2h0IH1gIG1ldGhvZHMgaW1wbGVtZW50YXRpb25cbnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoVFlQRSkge1xuICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzKSB7XG4gICAgdmFyIHN0cmluZyA9IFN0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKCR0aGlzKSk7XG4gICAgaWYgKFRZUEUgJiAxKSBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShsdHJpbSwgJycpO1xuICAgIGlmIChUWVBFICYgMikgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UocnRyaW0sICcnKTtcbiAgICByZXR1cm4gc3RyaW5nO1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIGBTdHJpbmcucHJvdG90eXBlLnsgdHJpbUxlZnQsIHRyaW1TdGFydCB9YCBtZXRob2RzXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS50cmltc3RhcnRcbiAgc3RhcnQ6IGNyZWF0ZU1ldGhvZCgxKSxcbiAgLy8gYFN0cmluZy5wcm90b3R5cGUueyB0cmltUmlnaHQsIHRyaW1FbmQgfWAgbWV0aG9kc1xuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUudHJpbWVuZFxuICBlbmQ6IGNyZWF0ZU1ldGhvZCgyKSxcbiAgLy8gYFN0cmluZy5wcm90b3R5cGUudHJpbWAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS50cmltXG4gIHRyaW06IGNyZWF0ZU1ldGhvZCgzKVxufTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gMTQwMDpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgdG9JbnRlZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5OTU4KTtcblxudmFyIG1heCA9IE1hdGgubWF4O1xudmFyIG1pbiA9IE1hdGgubWluO1xuXG4vLyBIZWxwZXIgZm9yIGEgcG9wdWxhciByZXBlYXRpbmcgY2FzZSBvZiB0aGUgc3BlYzpcbi8vIExldCBpbnRlZ2VyIGJlID8gVG9JbnRlZ2VyKGluZGV4KS5cbi8vIElmIGludGVnZXIgPCAwLCBsZXQgcmVzdWx0IGJlIG1heCgobGVuZ3RoICsgaW50ZWdlciksIDApOyBlbHNlIGxldCByZXN1bHQgYmUgbWluKGludGVnZXIsIGxlbmd0aCkuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbmRleCwgbGVuZ3RoKSB7XG4gIHZhciBpbnRlZ2VyID0gdG9JbnRlZ2VyKGluZGV4KTtcbiAgcmV0dXJuIGludGVnZXIgPCAwID8gbWF4KGludGVnZXIgKyBsZW5ndGgsIDApIDogbWluKGludGVnZXIsIGxlbmd0aCk7XG59O1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA3MDY3OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciB0b0ludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk5NTgpO1xudmFyIHRvTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NDY2KTtcblxuLy8gYFRvSW5kZXhgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b2luZGV4XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIDA7XG4gIHZhciBudW1iZXIgPSB0b0ludGVnZXIoaXQpO1xuICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgobnVtYmVyKTtcbiAgaWYgKG51bWJlciAhPT0gbGVuZ3RoKSB0aHJvdyBSYW5nZUVycm9yKCdXcm9uZyBsZW5ndGggb3IgaW5kZXgnKTtcbiAgcmV0dXJuIGxlbmd0aDtcbn07XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDU2NTY6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuLy8gdG9PYmplY3Qgd2l0aCBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIHN0cmluZ3NcbnZhciBJbmRleGVkT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MzYxKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NDg4KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIEluZGV4ZWRPYmplY3QocmVxdWlyZU9iamVjdENvZXJjaWJsZShpdCkpO1xufTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gOTk1ODpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHtcblxudmFyIGNlaWwgPSBNYXRoLmNlaWw7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xuXG4vLyBgVG9JbnRlZ2VyYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtdG9pbnRlZ2VyXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICByZXR1cm4gaXNOYU4oYXJndW1lbnQgPSArYXJndW1lbnQpID8gMCA6IChhcmd1bWVudCA+IDAgPyBmbG9vciA6IGNlaWwpKGFyZ3VtZW50KTtcbn07XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDc0NjY6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIHRvSW50ZWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oOTk1OCk7XG5cbnZhciBtaW4gPSBNYXRoLm1pbjtcblxuLy8gYFRvTGVuZ3RoYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtdG9sZW5ndGhcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHJldHVybiBhcmd1bWVudCA+IDAgPyBtaW4odG9JbnRlZ2VyKGFyZ3VtZW50KSwgMHgxRkZGRkZGRkZGRkZGRikgOiAwOyAvLyAyICoqIDUzIC0gMSA9PSA5MDA3MTk5MjU0NzQwOTkxXG59O1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA3OTA4OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NDg4KTtcblxuLy8gYFRvT2JqZWN0YCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtdG9vYmplY3Rcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHJldHVybiBPYmplY3QocmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudCkpO1xufTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gNDU5MDpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgdG9Qb3NpdGl2ZUludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMwMDIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgQllURVMpIHtcbiAgdmFyIG9mZnNldCA9IHRvUG9zaXRpdmVJbnRlZ2VyKGl0KTtcbiAgaWYgKG9mZnNldCAlIEJZVEVTKSB0aHJvdyBSYW5nZUVycm9yKCdXcm9uZyBvZmZzZXQnKTtcbiAgcmV0dXJuIG9mZnNldDtcbn07XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDMwMDI6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIHRvSW50ZWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oOTk1OCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciByZXN1bHQgPSB0b0ludGVnZXIoaXQpO1xuICBpZiAocmVzdWx0IDwgMCkgdGhyb3cgUmFuZ2VFcnJvcihcIlRoZSBhcmd1bWVudCBjYW4ndCBiZSBsZXNzIHRoYW4gMFwiKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDc1OTM6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMTEpO1xuXG4vLyBgVG9QcmltaXRpdmVgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b3ByaW1pdGl2ZVxuLy8gaW5zdGVhZCBvZiB0aGUgRVM2IHNwZWMgdmVyc2lvbiwgd2UgZGlkbid0IGltcGxlbWVudCBAQHRvUHJpbWl0aXZlIGNhc2Vcbi8vIGFuZCB0aGUgc2Vjb25kIGFyZ3VtZW50IC0gZmxhZyAtIHByZWZlcnJlZCB0eXBlIGlzIGEgc3RyaW5nXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbnB1dCwgUFJFRkVSUkVEX1NUUklORykge1xuICBpZiAoIWlzT2JqZWN0KGlucHV0KSkgcmV0dXJuIGlucHV0O1xuICB2YXIgZm4sIHZhbDtcbiAgaWYgKFBSRUZFUlJFRF9TVFJJTkcgJiYgdHlwZW9mIChmbiA9IGlucHV0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGlucHV0KSkpIHJldHVybiB2YWw7XG4gIGlmICh0eXBlb2YgKGZuID0gaW5wdXQudmFsdWVPZikgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpbnB1dCkpKSByZXR1cm4gdmFsO1xuICBpZiAoIVBSRUZFUlJFRF9TVFJJTkcgJiYgdHlwZW9mIChmbiA9IGlucHV0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGlucHV0KSkpIHJldHVybiB2YWw7XG4gIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcbn07XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDE2OTQ6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oNTExMik7XG5cbnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpO1xudmFyIHRlc3QgPSB7fTtcblxudGVzdFtUT19TVFJJTkdfVEFHXSA9ICd6JztcblxubW9kdWxlLmV4cG9ydHMgPSBTdHJpbmcodGVzdCkgPT09ICdbb2JqZWN0IHpdJztcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gOTg0Mzpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxMDkpO1xudmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oNzg1NCk7XG52YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk3ODEpO1xudmFyIFRZUEVEX0FSUkFZU19DT05TVFJVQ1RPUlNfUkVRVUlSRVNfV1JBUFBFUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM4MzIpO1xudmFyIEFycmF5QnVmZmVyVmlld0NvcmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI2MCk7XG52YXIgQXJyYXlCdWZmZXJNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMzMzEpO1xudmFyIGFuSW5zdGFuY2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU3ODcpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IF9fd2VicGFja19yZXF1aXJlX18oOTExNCk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4ODgwKTtcbnZhciB0b0xlbmd0aCA9IF9fd2VicGFja19yZXF1aXJlX18oNzQ2Nik7XG52YXIgdG9JbmRleCA9IF9fd2VicGFja19yZXF1aXJlX18oNzA2Nyk7XG52YXIgdG9PZmZzZXQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ1OTApO1xudmFyIHRvUHJpbWl0aXZlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NTkzKTtcbnZhciBoYXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY2NTYpO1xudmFyIGNsYXNzb2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY0OCk7XG52YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExMSk7XG52YXIgY3JlYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMCk7XG52YXIgc2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc2NzQpO1xudmFyIGdldE93blByb3BlcnR5TmFtZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgwMDYpLmY7XG52YXIgdHlwZWRBcnJheUZyb20gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDczMjEpO1xudmFyIGZvckVhY2ggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwOTIpLmZvckVhY2g7XG52YXIgc2V0U3BlY2llcyA9IF9fd2VicGFja19yZXF1aXJlX18oNjM0MCk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMwNzApO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oMTIzNik7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oOTkwOSk7XG52YXIgaW5oZXJpdElmUmVxdWlyZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk1ODcpO1xuXG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0O1xudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBuYXRpdmVEZWZpbmVQcm9wZXJ0eSA9IGRlZmluZVByb3BlcnR5TW9kdWxlLmY7XG52YXIgbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlLmY7XG52YXIgcm91bmQgPSBNYXRoLnJvdW5kO1xudmFyIFJhbmdlRXJyb3IgPSBnbG9iYWwuUmFuZ2VFcnJvcjtcbnZhciBBcnJheUJ1ZmZlciA9IEFycmF5QnVmZmVyTW9kdWxlLkFycmF5QnVmZmVyO1xudmFyIERhdGFWaWV3ID0gQXJyYXlCdWZmZXJNb2R1bGUuRGF0YVZpZXc7XG52YXIgTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyA9IEFycmF5QnVmZmVyVmlld0NvcmUuTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUztcbnZhciBUWVBFRF9BUlJBWV9UQUcgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLlRZUEVEX0FSUkFZX1RBRztcbnZhciBUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5UeXBlZEFycmF5O1xudmFyIFR5cGVkQXJyYXlQcm90b3R5cGUgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLlR5cGVkQXJyYXlQcm90b3R5cGU7XG52YXIgYVR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXlDb25zdHJ1Y3RvcjtcbnZhciBpc1R5cGVkQXJyYXkgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmlzVHlwZWRBcnJheTtcbnZhciBCWVRFU19QRVJfRUxFTUVOVCA9ICdCWVRFU19QRVJfRUxFTUVOVCc7XG52YXIgV1JPTkdfTEVOR1RIID0gJ1dyb25nIGxlbmd0aCc7XG5cbnZhciBmcm9tTGlzdCA9IGZ1bmN0aW9uIChDLCBsaXN0KSB7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBsZW5ndGggPSBsaXN0Lmxlbmd0aDtcbiAgdmFyIHJlc3VsdCA9IG5ldyAoYVR5cGVkQXJyYXlDb25zdHJ1Y3RvcihDKSkobGVuZ3RoKTtcbiAgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSByZXN1bHRbaW5kZXhdID0gbGlzdFtpbmRleCsrXTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbnZhciBhZGRHZXR0ZXIgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICBuYXRpdmVEZWZpbmVQcm9wZXJ0eShpdCwga2V5LCB7IGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpW2tleV07XG4gIH0gfSk7XG59O1xuXG52YXIgaXNBcnJheUJ1ZmZlciA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIga2xhc3M7XG4gIHJldHVybiBpdCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8IChrbGFzcyA9IGNsYXNzb2YoaXQpKSA9PSAnQXJyYXlCdWZmZXInIHx8IGtsYXNzID09ICdTaGFyZWRBcnJheUJ1ZmZlcic7XG59O1xuXG52YXIgaXNUeXBlZEFycmF5SW5kZXggPSBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHtcbiAgcmV0dXJuIGlzVHlwZWRBcnJheSh0YXJnZXQpXG4gICAgJiYgdHlwZW9mIGtleSAhPSAnc3ltYm9sJ1xuICAgICYmIGtleSBpbiB0YXJnZXRcbiAgICAmJiBTdHJpbmcoK2tleSkgPT0gU3RyaW5nKGtleSk7XG59O1xuXG52YXIgd3JhcHBlZEdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkge1xuICByZXR1cm4gaXNUeXBlZEFycmF5SW5kZXgodGFyZ2V0LCBrZXkgPSB0b1ByaW1pdGl2ZShrZXksIHRydWUpKVxuICAgID8gY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDIsIHRhcmdldFtrZXldKVxuICAgIDogbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KTtcbn07XG5cbnZhciB3cmFwcGVkRGVmaW5lUHJvcGVydHkgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgZGVzY3JpcHRvcikge1xuICBpZiAoaXNUeXBlZEFycmF5SW5kZXgodGFyZ2V0LCBrZXkgPSB0b1ByaW1pdGl2ZShrZXksIHRydWUpKVxuICAgICYmIGlzT2JqZWN0KGRlc2NyaXB0b3IpXG4gICAgJiYgaGFzKGRlc2NyaXB0b3IsICd2YWx1ZScpXG4gICAgJiYgIWhhcyhkZXNjcmlwdG9yLCAnZ2V0JylcbiAgICAmJiAhaGFzKGRlc2NyaXB0b3IsICdzZXQnKVxuICAgIC8vIFRPRE86IGFkZCB2YWxpZGF0aW9uIGRlc2NyaXB0b3Igdy9vIGNhbGxpbmcgYWNjZXNzb3JzXG4gICAgJiYgIWRlc2NyaXB0b3IuY29uZmlndXJhYmxlXG4gICAgJiYgKCFoYXMoZGVzY3JpcHRvciwgJ3dyaXRhYmxlJykgfHwgZGVzY3JpcHRvci53cml0YWJsZSlcbiAgICAmJiAoIWhhcyhkZXNjcmlwdG9yLCAnZW51bWVyYWJsZScpIHx8IGRlc2NyaXB0b3IuZW51bWVyYWJsZSlcbiAgKSB7XG4gICAgdGFyZ2V0W2tleV0gPSBkZXNjcmlwdG9yLnZhbHVlO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH0gcmV0dXJuIG5hdGl2ZURlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBkZXNjcmlwdG9yKTtcbn07XG5cbmlmIChERVNDUklQVE9SUykge1xuICBpZiAoIU5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MpIHtcbiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUuZiA9IHdyYXBwZWRHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG4gICAgZGVmaW5lUHJvcGVydHlNb2R1bGUuZiA9IHdyYXBwZWREZWZpbmVQcm9wZXJ0eTtcbiAgICBhZGRHZXR0ZXIoVHlwZWRBcnJheVByb3RvdHlwZSwgJ2J1ZmZlcicpO1xuICAgIGFkZEdldHRlcihUeXBlZEFycmF5UHJvdG90eXBlLCAnYnl0ZU9mZnNldCcpO1xuICAgIGFkZEdldHRlcihUeXBlZEFycmF5UHJvdG90eXBlLCAnYnl0ZUxlbmd0aCcpO1xuICAgIGFkZEdldHRlcihUeXBlZEFycmF5UHJvdG90eXBlLCAnbGVuZ3RoJyk7XG4gIH1cblxuICAkKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiAhTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyB9LCB7XG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiB3cmFwcGVkR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuICAgIGRlZmluZVByb3BlcnR5OiB3cmFwcGVkRGVmaW5lUHJvcGVydHlcbiAgfSk7XG5cbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoVFlQRSwgd3JhcHBlciwgQ0xBTVBFRCkge1xuICAgIHZhciBCWVRFUyA9IFRZUEUubWF0Y2goL1xcZCskLylbMF0gLyA4O1xuICAgIHZhciBDT05TVFJVQ1RPUl9OQU1FID0gVFlQRSArIChDTEFNUEVEID8gJ0NsYW1wZWQnIDogJycpICsgJ0FycmF5JztcbiAgICB2YXIgR0VUVEVSID0gJ2dldCcgKyBUWVBFO1xuICAgIHZhciBTRVRURVIgPSAnc2V0JyArIFRZUEU7XG4gICAgdmFyIE5hdGl2ZVR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IGdsb2JhbFtDT05TVFJVQ1RPUl9OQU1FXTtcbiAgICB2YXIgVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gTmF0aXZlVHlwZWRBcnJheUNvbnN0cnVjdG9yO1xuICAgIHZhciBUeXBlZEFycmF5Q29uc3RydWN0b3JQcm90b3R5cGUgPSBUeXBlZEFycmF5Q29uc3RydWN0b3IgJiYgVHlwZWRBcnJheUNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgICB2YXIgZXhwb3J0ZWQgPSB7fTtcblxuICAgIHZhciBnZXR0ZXIgPSBmdW5jdGlvbiAodGhhdCwgaW5kZXgpIHtcbiAgICAgIHZhciBkYXRhID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGF0KTtcbiAgICAgIHJldHVybiBkYXRhLnZpZXdbR0VUVEVSXShpbmRleCAqIEJZVEVTICsgZGF0YS5ieXRlT2Zmc2V0LCB0cnVlKTtcbiAgICB9O1xuXG4gICAgdmFyIHNldHRlciA9IGZ1bmN0aW9uICh0aGF0LCBpbmRleCwgdmFsdWUpIHtcbiAgICAgIHZhciBkYXRhID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGF0KTtcbiAgICAgIGlmIChDTEFNUEVEKSB2YWx1ZSA9ICh2YWx1ZSA9IHJvdW5kKHZhbHVlKSkgPCAwID8gMCA6IHZhbHVlID4gMHhGRiA/IDB4RkYgOiB2YWx1ZSAmIDB4RkY7XG4gICAgICBkYXRhLnZpZXdbU0VUVEVSXShpbmRleCAqIEJZVEVTICsgZGF0YS5ieXRlT2Zmc2V0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgfTtcblxuICAgIHZhciBhZGRFbGVtZW50ID0gZnVuY3Rpb24gKHRoYXQsIGluZGV4KSB7XG4gICAgICBuYXRpdmVEZWZpbmVQcm9wZXJ0eSh0aGF0LCBpbmRleCwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gZ2V0dGVyKHRoaXMsIGluZGV4KTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gc2V0dGVyKHRoaXMsIGluZGV4LCB2YWx1ZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBpZiAoIU5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MpIHtcbiAgICAgIFR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IHdyYXBwZXIoZnVuY3Rpb24gKHRoYXQsIGRhdGEsIG9mZnNldCwgJGxlbmd0aCkge1xuICAgICAgICBhbkluc3RhbmNlKHRoYXQsIFR5cGVkQXJyYXlDb25zdHJ1Y3RvciwgQ09OU1RSVUNUT1JfTkFNRSk7XG4gICAgICAgIHZhciBpbmRleCA9IDA7XG4gICAgICAgIHZhciBieXRlT2Zmc2V0ID0gMDtcbiAgICAgICAgdmFyIGJ1ZmZlciwgYnl0ZUxlbmd0aCwgbGVuZ3RoO1xuICAgICAgICBpZiAoIWlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICAgICAgbGVuZ3RoID0gdG9JbmRleChkYXRhKTtcbiAgICAgICAgICBieXRlTGVuZ3RoID0gbGVuZ3RoICogQllURVM7XG4gICAgICAgICAgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKGJ5dGVMZW5ndGgpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzQXJyYXlCdWZmZXIoZGF0YSkpIHtcbiAgICAgICAgICBidWZmZXIgPSBkYXRhO1xuICAgICAgICAgIGJ5dGVPZmZzZXQgPSB0b09mZnNldChvZmZzZXQsIEJZVEVTKTtcbiAgICAgICAgICB2YXIgJGxlbiA9IGRhdGEuYnl0ZUxlbmd0aDtcbiAgICAgICAgICBpZiAoJGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAoJGxlbiAlIEJZVEVTKSB0aHJvdyBSYW5nZUVycm9yKFdST05HX0xFTkdUSCk7XG4gICAgICAgICAgICBieXRlTGVuZ3RoID0gJGxlbiAtIGJ5dGVPZmZzZXQ7XG4gICAgICAgICAgICBpZiAoYnl0ZUxlbmd0aCA8IDApIHRocm93IFJhbmdlRXJyb3IoV1JPTkdfTEVOR1RIKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYnl0ZUxlbmd0aCA9IHRvTGVuZ3RoKCRsZW5ndGgpICogQllURVM7XG4gICAgICAgICAgICBpZiAoYnl0ZUxlbmd0aCArIGJ5dGVPZmZzZXQgPiAkbGVuKSB0aHJvdyBSYW5nZUVycm9yKFdST05HX0xFTkdUSCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxlbmd0aCA9IGJ5dGVMZW5ndGggLyBCWVRFUztcbiAgICAgICAgfSBlbHNlIGlmIChpc1R5cGVkQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgICByZXR1cm4gZnJvbUxpc3QoVHlwZWRBcnJheUNvbnN0cnVjdG9yLCBkYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdHlwZWRBcnJheUZyb20uY2FsbChUeXBlZEFycmF5Q29uc3RydWN0b3IsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIHNldEludGVybmFsU3RhdGUodGhhdCwge1xuICAgICAgICAgIGJ1ZmZlcjogYnVmZmVyLFxuICAgICAgICAgIGJ5dGVPZmZzZXQ6IGJ5dGVPZmZzZXQsXG4gICAgICAgICAgYnl0ZUxlbmd0aDogYnl0ZUxlbmd0aCxcbiAgICAgICAgICBsZW5ndGg6IGxlbmd0aCxcbiAgICAgICAgICB2aWV3OiBuZXcgRGF0YVZpZXcoYnVmZmVyKVxuICAgICAgICB9KTtcbiAgICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSBhZGRFbGVtZW50KHRoYXQsIGluZGV4KyspO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChzZXRQcm90b3R5cGVPZikgc2V0UHJvdG90eXBlT2YoVHlwZWRBcnJheUNvbnN0cnVjdG9yLCBUeXBlZEFycmF5KTtcbiAgICAgIFR5cGVkQXJyYXlDb25zdHJ1Y3RvclByb3RvdHlwZSA9IFR5cGVkQXJyYXlDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBjcmVhdGUoVHlwZWRBcnJheVByb3RvdHlwZSk7XG4gICAgfSBlbHNlIGlmIChUWVBFRF9BUlJBWVNfQ09OU1RSVUNUT1JTX1JFUVVJUkVTX1dSQVBQRVJTKSB7XG4gICAgICBUeXBlZEFycmF5Q29uc3RydWN0b3IgPSB3cmFwcGVyKGZ1bmN0aW9uIChkdW1teSwgZGF0YSwgdHlwZWRBcnJheU9mZnNldCwgJGxlbmd0aCkge1xuICAgICAgICBhbkluc3RhbmNlKGR1bW15LCBUeXBlZEFycmF5Q29uc3RydWN0b3IsIENPTlNUUlVDVE9SX05BTUUpO1xuICAgICAgICByZXR1cm4gaW5oZXJpdElmUmVxdWlyZWQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICghaXNPYmplY3QoZGF0YSkpIHJldHVybiBuZXcgTmF0aXZlVHlwZWRBcnJheUNvbnN0cnVjdG9yKHRvSW5kZXgoZGF0YSkpO1xuICAgICAgICAgIGlmIChpc0FycmF5QnVmZmVyKGRhdGEpKSByZXR1cm4gJGxlbmd0aCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IG5ldyBOYXRpdmVUeXBlZEFycmF5Q29uc3RydWN0b3IoZGF0YSwgdG9PZmZzZXQodHlwZWRBcnJheU9mZnNldCwgQllURVMpLCAkbGVuZ3RoKVxuICAgICAgICAgICAgOiB0eXBlZEFycmF5T2Zmc2V0ICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgPyBuZXcgTmF0aXZlVHlwZWRBcnJheUNvbnN0cnVjdG9yKGRhdGEsIHRvT2Zmc2V0KHR5cGVkQXJyYXlPZmZzZXQsIEJZVEVTKSlcbiAgICAgICAgICAgICAgOiBuZXcgTmF0aXZlVHlwZWRBcnJheUNvbnN0cnVjdG9yKGRhdGEpO1xuICAgICAgICAgIGlmIChpc1R5cGVkQXJyYXkoZGF0YSkpIHJldHVybiBmcm9tTGlzdChUeXBlZEFycmF5Q29uc3RydWN0b3IsIGRhdGEpO1xuICAgICAgICAgIHJldHVybiB0eXBlZEFycmF5RnJvbS5jYWxsKFR5cGVkQXJyYXlDb25zdHJ1Y3RvciwgZGF0YSk7XG4gICAgICAgIH0oKSwgZHVtbXksIFR5cGVkQXJyYXlDb25zdHJ1Y3Rvcik7XG4gICAgICB9KTtcblxuICAgICAgaWYgKHNldFByb3RvdHlwZU9mKSBzZXRQcm90b3R5cGVPZihUeXBlZEFycmF5Q29uc3RydWN0b3IsIFR5cGVkQXJyYXkpO1xuICAgICAgZm9yRWFjaChnZXRPd25Qcm9wZXJ0eU5hbWVzKE5hdGl2ZVR5cGVkQXJyYXlDb25zdHJ1Y3RvciksIGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgaWYgKCEoa2V5IGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcikpIHtcbiAgICAgICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoVHlwZWRBcnJheUNvbnN0cnVjdG9yLCBrZXksIE5hdGl2ZVR5cGVkQXJyYXlDb25zdHJ1Y3RvcltrZXldKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBUeXBlZEFycmF5Q29uc3RydWN0b3IucHJvdG90eXBlID0gVHlwZWRBcnJheUNvbnN0cnVjdG9yUHJvdG90eXBlO1xuICAgIH1cblxuICAgIGlmIChUeXBlZEFycmF5Q29uc3RydWN0b3JQcm90b3R5cGUuY29uc3RydWN0b3IgIT09IFR5cGVkQXJyYXlDb25zdHJ1Y3Rvcikge1xuICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KFR5cGVkQXJyYXlDb25zdHJ1Y3RvclByb3RvdHlwZSwgJ2NvbnN0cnVjdG9yJywgVHlwZWRBcnJheUNvbnN0cnVjdG9yKTtcbiAgICB9XG5cbiAgICBpZiAoVFlQRURfQVJSQVlfVEFHKSB7XG4gICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoVHlwZWRBcnJheUNvbnN0cnVjdG9yUHJvdG90eXBlLCBUWVBFRF9BUlJBWV9UQUcsIENPTlNUUlVDVE9SX05BTUUpO1xuICAgIH1cblxuICAgIGV4cG9ydGVkW0NPTlNUUlVDVE9SX05BTUVdID0gVHlwZWRBcnJheUNvbnN0cnVjdG9yO1xuXG4gICAgJCh7XG4gICAgICBnbG9iYWw6IHRydWUsIGZvcmNlZDogVHlwZWRBcnJheUNvbnN0cnVjdG9yICE9IE5hdGl2ZVR5cGVkQXJyYXlDb25zdHJ1Y3Rvciwgc2hhbTogIU5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1NcbiAgICB9LCBleHBvcnRlZCk7XG5cbiAgICBpZiAoIShCWVRFU19QRVJfRUxFTUVOVCBpbiBUeXBlZEFycmF5Q29uc3RydWN0b3IpKSB7XG4gICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoVHlwZWRBcnJheUNvbnN0cnVjdG9yLCBCWVRFU19QRVJfRUxFTUVOVCwgQllURVMpO1xuICAgIH1cblxuICAgIGlmICghKEJZVEVTX1BFUl9FTEVNRU5UIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvclByb3RvdHlwZSkpIHtcbiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShUeXBlZEFycmF5Q29uc3RydWN0b3JQcm90b3R5cGUsIEJZVEVTX1BFUl9FTEVNRU5ULCBCWVRFUyk7XG4gICAgfVxuXG4gICAgc2V0U3BlY2llcyhDT05TVFJVQ1RPUl9OQU1FKTtcbiAgfTtcbn0gZWxzZSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gMzgzMjpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1uZXcgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmcgKi9cbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4NTQpO1xudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3MjkzKTtcbnZhciBjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcwNzIpO1xudmFyIE5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI2MCkuTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUztcblxudmFyIEFycmF5QnVmZmVyID0gZ2xvYmFsLkFycmF5QnVmZmVyO1xudmFyIEludDhBcnJheSA9IGdsb2JhbC5JbnQ4QXJyYXk7XG5cbm1vZHVsZS5leHBvcnRzID0gIU5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MgfHwgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgSW50OEFycmF5KDEpO1xufSkgfHwgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgbmV3IEludDhBcnJheSgtMSk7XG59KSB8fCAhY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uKGZ1bmN0aW9uIChpdGVyYWJsZSkge1xuICBuZXcgSW50OEFycmF5KCk7XG4gIG5ldyBJbnQ4QXJyYXkobnVsbCk7XG4gIG5ldyBJbnQ4QXJyYXkoMS41KTtcbiAgbmV3IEludDhBcnJheShpdGVyYWJsZSk7XG59LCB0cnVlKSB8fCBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIFNhZmFyaSAoMTErKSBidWcgLSBhIHJlYXNvbiB3aHkgZXZlbiBTYWZhcmkgMTMgc2hvdWxkIGxvYWQgYSB0eXBlZCBhcnJheSBwb2x5ZmlsbFxuICByZXR1cm4gbmV3IEludDhBcnJheShuZXcgQXJyYXlCdWZmZXIoMiksIDEsIHVuZGVmaW5lZCkubGVuZ3RoICE9PSAxO1xufSk7XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDMwNzQ6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIGFUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI2MCkuYVR5cGVkQXJyYXlDb25zdHJ1Y3RvcjtcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY3MDcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbnN0YW5jZSwgbGlzdCkge1xuICB2YXIgQyA9IHNwZWNpZXNDb25zdHJ1Y3RvcihpbnN0YW5jZSwgaW5zdGFuY2UuY29uc3RydWN0b3IpO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgbGVuZ3RoID0gbGlzdC5sZW5ndGg7XG4gIHZhciByZXN1bHQgPSBuZXcgKGFUeXBlZEFycmF5Q29uc3RydWN0b3IoQykpKGxlbmd0aCk7XG4gIHdoaWxlIChsZW5ndGggPiBpbmRleCkgcmVzdWx0W2luZGV4XSA9IGxpc3RbaW5kZXgrK107XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA3MzIxOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oNzkwOCk7XG52YXIgdG9MZW5ndGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc0NjYpO1xudmFyIGdldEl0ZXJhdG9yTWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMjQ2KTtcbnZhciBpc0FycmF5SXRlcmF0b3JNZXRob2QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc2NTkpO1xudmFyIGJpbmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk5NzQpO1xudmFyIGFUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI2MCkuYVR5cGVkQXJyYXlDb25zdHJ1Y3RvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmcm9tKHNvdXJjZSAvKiAsIG1hcGZuLCB0aGlzQXJnICovKSB7XG4gIHZhciBPID0gdG9PYmplY3Qoc291cmNlKTtcbiAgdmFyIGFyZ3VtZW50c0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIHZhciBtYXBmbiA9IGFyZ3VtZW50c0xlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gIHZhciBtYXBwaW5nID0gbWFwZm4gIT09IHVuZGVmaW5lZDtcbiAgdmFyIGl0ZXJhdG9yTWV0aG9kID0gZ2V0SXRlcmF0b3JNZXRob2QoTyk7XG4gIHZhciBpLCBsZW5ndGgsIHJlc3VsdCwgc3RlcCwgaXRlcmF0b3IsIG5leHQ7XG4gIGlmIChpdGVyYXRvck1ldGhvZCAhPSB1bmRlZmluZWQgJiYgIWlzQXJyYXlJdGVyYXRvck1ldGhvZChpdGVyYXRvck1ldGhvZCkpIHtcbiAgICBpdGVyYXRvciA9IGl0ZXJhdG9yTWV0aG9kLmNhbGwoTyk7XG4gICAgbmV4dCA9IGl0ZXJhdG9yLm5leHQ7XG4gICAgTyA9IFtdO1xuICAgIHdoaWxlICghKHN0ZXAgPSBuZXh0LmNhbGwoaXRlcmF0b3IpKS5kb25lKSB7XG4gICAgICBPLnB1c2goc3RlcC52YWx1ZSk7XG4gICAgfVxuICB9XG4gIGlmIChtYXBwaW5nICYmIGFyZ3VtZW50c0xlbmd0aCA+IDIpIHtcbiAgICBtYXBmbiA9IGJpbmQobWFwZm4sIGFyZ3VtZW50c1syXSwgMik7XG4gIH1cbiAgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICByZXN1bHQgPSBuZXcgKGFUeXBlZEFycmF5Q29uc3RydWN0b3IodGhpcykpKGxlbmd0aCk7XG4gIGZvciAoaSA9IDA7IGxlbmd0aCA+IGk7IGkrKykge1xuICAgIHJlc3VsdFtpXSA9IG1hcHBpbmcgPyBtYXBmbihPW2ldLCBpKSA6IE9baV07XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDk3MTE6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlKSB7XG5cbnZhciBpZCA9IDA7XG52YXIgcG9zdGZpeCA9IE1hdGgucmFuZG9tKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gJ1N5bWJvbCgnICsgU3RyaW5nKGtleSA9PT0gdW5kZWZpbmVkID8gJycgOiBrZXkpICsgJylfJyArICgrK2lkICsgcG9zdGZpeCkudG9TdHJpbmcoMzYpO1xufTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gMzMwNzpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgTkFUSVZFX1NZTUJPTCA9IF9fd2VicGFja19yZXF1aXJlX18oMTMzKTtcblxubW9kdWxlLmV4cG9ydHMgPSBOQVRJVkVfU1lNQk9MXG4gIC8qIGdsb2JhbCBTeW1ib2wgLS0gc2FmZSAqL1xuICAmJiAhU3ltYm9sLnNoYW1cbiAgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PSAnc3ltYm9sJztcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gNTExMjpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3ODU0KTtcbnZhciBzaGFyZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIzMDkpO1xudmFyIGhhcyA9IF9fd2VicGFja19yZXF1aXJlX18oNjY1Nik7XG52YXIgdWlkID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NzExKTtcbnZhciBOQVRJVkVfU1lNQk9MID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMzMpO1xudmFyIFVTRV9TWU1CT0xfQVNfVUlEID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMzA3KTtcblxudmFyIFdlbGxLbm93blN5bWJvbHNTdG9yZSA9IHNoYXJlZCgnd2tzJyk7XG52YXIgU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDtcbnZhciBjcmVhdGVXZWxsS25vd25TeW1ib2wgPSBVU0VfU1lNQk9MX0FTX1VJRCA/IFN5bWJvbCA6IFN5bWJvbCAmJiBTeW1ib2wud2l0aG91dFNldHRlciB8fCB1aWQ7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgaWYgKCFoYXMoV2VsbEtub3duU3ltYm9sc1N0b3JlLCBuYW1lKSkge1xuICAgIGlmIChOQVRJVkVfU1lNQk9MICYmIGhhcyhTeW1ib2wsIG5hbWUpKSBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV0gPSBTeW1ib2xbbmFtZV07XG4gICAgZWxzZSBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV0gPSBjcmVhdGVXZWxsS25vd25TeW1ib2woJ1N5bWJvbC4nICsgbmFtZSk7XG4gIH0gcmV0dXJuIFdlbGxLbm93blN5bWJvbHNTdG9yZVtuYW1lXTtcbn07XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDEzNjE6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlKSB7XG5cbi8vIGEgc3RyaW5nIG9mIGFsbCB2YWxpZCB1bmljb2RlIHdoaXRlc3BhY2VzXG5tb2R1bGUuZXhwb3J0cyA9ICdcXHUwMDA5XFx1MDAwQVxcdTAwMEJcXHUwMDBDXFx1MDAwRFxcdTAwMjBcXHUwMEEwXFx1MTY4MFxcdTIwMDBcXHUyMDAxXFx1MjAwMicgK1xuICAnXFx1MjAwM1xcdTIwMDRcXHUyMDA1XFx1MjAwNlxcdTIwMDdcXHUyMDA4XFx1MjAwOVxcdTIwMEFcXHUyMDJGXFx1MjA1RlxcdTMwMDBcXHUyMDI4XFx1MjAyOVxcdUZFRkYnO1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA4MjY0OlxuLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMTA5KTtcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4NTQpO1xudmFyIGFycmF5QnVmZmVyTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMzMxKTtcbnZhciBzZXRTcGVjaWVzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2MzQwKTtcblxudmFyIEFSUkFZX0JVRkZFUiA9ICdBcnJheUJ1ZmZlcic7XG52YXIgQXJyYXlCdWZmZXIgPSBhcnJheUJ1ZmZlck1vZHVsZVtBUlJBWV9CVUZGRVJdO1xudmFyIE5hdGl2ZUFycmF5QnVmZmVyID0gZ2xvYmFsW0FSUkFZX0JVRkZFUl07XG5cbi8vIGBBcnJheUJ1ZmZlcmAgY29uc3RydWN0b3Jcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXlidWZmZXItY29uc3RydWN0b3JcbiQoeyBnbG9iYWw6IHRydWUsIGZvcmNlZDogTmF0aXZlQXJyYXlCdWZmZXIgIT09IEFycmF5QnVmZmVyIH0sIHtcbiAgQXJyYXlCdWZmZXI6IEFycmF5QnVmZmVyXG59KTtcblxuc2V0U3BlY2llcyhBUlJBWV9CVUZGRVIpO1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyAyMjIyOlxuLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMTA5KTtcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNzI5Myk7XG52YXIgaXNBcnJheSA9IF9fd2VicGFja19yZXF1aXJlX18oMzE1Nyk7XG52YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExMSk7XG52YXIgdG9PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5MDgpO1xudmFyIHRvTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NDY2KTtcbnZhciBjcmVhdGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oNjEzNSk7XG52YXIgYXJyYXlTcGVjaWVzQ3JlYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NDE3KTtcbnZhciBhcnJheU1ldGhvZEhhc1NwZWNpZXNTdXBwb3J0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMTk0KTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUxMTIpO1xudmFyIFY4X1ZFUlNJT04gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDczOTIpO1xuXG52YXIgSVNfQ09OQ0FUX1NQUkVBREFCTEUgPSB3ZWxsS25vd25TeW1ib2woJ2lzQ29uY2F0U3ByZWFkYWJsZScpO1xudmFyIE1BWF9TQUZFX0lOVEVHRVIgPSAweDFGRkZGRkZGRkZGRkZGO1xudmFyIE1BWElNVU1fQUxMT1dFRF9JTkRFWF9FWENFRURFRCA9ICdNYXhpbXVtIGFsbG93ZWQgaW5kZXggZXhjZWVkZWQnO1xuXG4vLyBXZSBjYW4ndCB1c2UgdGhpcyBmZWF0dXJlIGRldGVjdGlvbiBpbiBWOCBzaW5jZSBpdCBjYXVzZXNcbi8vIGRlb3B0aW1pemF0aW9uIGFuZCBzZXJpb3VzIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uXG4vLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNjc5XG52YXIgSVNfQ09OQ0FUX1NQUkVBREFCTEVfU1VQUE9SVCA9IFY4X1ZFUlNJT04gPj0gNTEgfHwgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIGFycmF5ID0gW107XG4gIGFycmF5W0lTX0NPTkNBVF9TUFJFQURBQkxFXSA9IGZhbHNlO1xuICByZXR1cm4gYXJyYXkuY29uY2F0KClbMF0gIT09IGFycmF5O1xufSk7XG5cbnZhciBTUEVDSUVTX1NVUFBPUlQgPSBhcnJheU1ldGhvZEhhc1NwZWNpZXNTdXBwb3J0KCdjb25jYXQnKTtcblxudmFyIGlzQ29uY2F0U3ByZWFkYWJsZSA9IGZ1bmN0aW9uIChPKSB7XG4gIGlmICghaXNPYmplY3QoTykpIHJldHVybiBmYWxzZTtcbiAgdmFyIHNwcmVhZGFibGUgPSBPW0lTX0NPTkNBVF9TUFJFQURBQkxFXTtcbiAgcmV0dXJuIHNwcmVhZGFibGUgIT09IHVuZGVmaW5lZCA/ICEhc3ByZWFkYWJsZSA6IGlzQXJyYXkoTyk7XG59O1xuXG52YXIgRk9SQ0VEID0gIUlTX0NPTkNBVF9TUFJFQURBQkxFX1NVUFBPUlQgfHwgIVNQRUNJRVNfU1VQUE9SVDtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5jb25jYXRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuY29uY2F0XG4vLyB3aXRoIGFkZGluZyBzdXBwb3J0IG9mIEBAaXNDb25jYXRTcHJlYWRhYmxlIGFuZCBAQHNwZWNpZXNcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFycyAtLSByZXF1aXJlZCBmb3IgYC5sZW5ndGhgXG4gIGNvbmNhdDogZnVuY3Rpb24gY29uY2F0KGFyZykge1xuICAgIHZhciBPID0gdG9PYmplY3QodGhpcyk7XG4gICAgdmFyIEEgPSBhcnJheVNwZWNpZXNDcmVhdGUoTywgMCk7XG4gICAgdmFyIG4gPSAwO1xuICAgIHZhciBpLCBrLCBsZW5ndGgsIGxlbiwgRTtcbiAgICBmb3IgKGkgPSAtMSwgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBFID0gaSA9PT0gLTEgPyBPIDogYXJndW1lbnRzW2ldO1xuICAgICAgaWYgKGlzQ29uY2F0U3ByZWFkYWJsZShFKSkge1xuICAgICAgICBsZW4gPSB0b0xlbmd0aChFLmxlbmd0aCk7XG4gICAgICAgIGlmIChuICsgbGVuID4gTUFYX1NBRkVfSU5URUdFUikgdGhyb3cgVHlwZUVycm9yKE1BWElNVU1fQUxMT1dFRF9JTkRFWF9FWENFRURFRCk7XG4gICAgICAgIGZvciAoayA9IDA7IGsgPCBsZW47IGsrKywgbisrKSBpZiAoayBpbiBFKSBjcmVhdGVQcm9wZXJ0eShBLCBuLCBFW2tdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChuID49IE1BWF9TQUZFX0lOVEVHRVIpIHRocm93IFR5cGVFcnJvcihNQVhJTVVNX0FMTE9XRURfSU5ERVhfRVhDRUVERUQpO1xuICAgICAgICBjcmVhdGVQcm9wZXJ0eShBLCBuKyssIEUpO1xuICAgICAgfVxuICAgIH1cbiAgICBBLmxlbmd0aCA9IG47XG4gICAgcmV0dXJuIEE7XG4gIH1cbn0pO1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA3MzI3OlxuLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMTA5KTtcbnZhciAkZmlsdGVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMDkyKS5maWx0ZXI7XG52YXIgYXJyYXlNZXRob2RIYXNTcGVjaWVzU3VwcG9ydCA9IF9fd2VicGFja19yZXF1aXJlX18oMTE5NCk7XG5cbnZhciBIQVNfU1BFQ0lFU19TVVBQT1JUID0gYXJyYXlNZXRob2RIYXNTcGVjaWVzU3VwcG9ydCgnZmlsdGVyJyk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuZmlsdGVyYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZpbHRlclxuLy8gd2l0aCBhZGRpbmcgc3VwcG9ydCBvZiBAQHNwZWNpZXNcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6ICFIQVNfU1BFQ0lFU19TVVBQT1JUIH0sIHtcbiAgZmlsdGVyOiBmdW5jdGlvbiBmaWx0ZXIoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICByZXR1cm4gJGZpbHRlcih0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gIH1cbn0pO1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyAyNzcyOlxuLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMTA5KTtcbnZhciAkaW5kZXhPZiA9IF9fd2VicGFja19yZXF1aXJlX18oMTMxOCkuaW5kZXhPZjtcbnZhciBhcnJheU1ldGhvZElzU3RyaWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5MzQxKTtcblxudmFyIG5hdGl2ZUluZGV4T2YgPSBbXS5pbmRleE9mO1xuXG52YXIgTkVHQVRJVkVfWkVSTyA9ICEhbmF0aXZlSW5kZXhPZiAmJiAxIC8gWzFdLmluZGV4T2YoMSwgLTApIDwgMDtcbnZhciBTVFJJQ1RfTUVUSE9EID0gYXJyYXlNZXRob2RJc1N0cmljdCgnaW5kZXhPZicpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmluZGV4T2ZgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuaW5kZXhvZlxuJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogTkVHQVRJVkVfWkVSTyB8fCAhU1RSSUNUX01FVEhPRCB9LCB7XG4gIGluZGV4T2Y6IGZ1bmN0aW9uIGluZGV4T2Yoc2VhcmNoRWxlbWVudCAvKiAsIGZyb21JbmRleCA9IDAgKi8pIHtcbiAgICByZXR1cm4gTkVHQVRJVkVfWkVST1xuICAgICAgLy8gY29udmVydCAtMCB0byArMFxuICAgICAgPyBuYXRpdmVJbmRleE9mLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgMFxuICAgICAgOiAkaW5kZXhPZih0aGlzLCBzZWFyY2hFbGVtZW50LCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gIH1cbn0pO1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA2OTkyOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG52YXIgdG9JbmRleGVkT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NjU2KTtcbnZhciBhZGRUb1Vuc2NvcGFibGVzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMjIzKTtcbnZhciBJdGVyYXRvcnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc0OTcpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk5MDkpO1xudmFyIGRlZmluZUl0ZXJhdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NTQpO1xuXG52YXIgQVJSQVlfSVRFUkFUT1IgPSAnQXJyYXkgSXRlcmF0b3InO1xudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBnZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3IoQVJSQVlfSVRFUkFUT1IpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmVudHJpZXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZW50cmllc1xuLy8gYEFycmF5LnByb3RvdHlwZS5rZXlzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmtleXNcbi8vIGBBcnJheS5wcm90b3R5cGUudmFsdWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLnZhbHVlc1xuLy8gYEFycmF5LnByb3RvdHlwZVtAQGl0ZXJhdG9yXWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQGl0ZXJhdG9yXG4vLyBgQ3JlYXRlQXJyYXlJdGVyYXRvcmAgaW50ZXJuYWwgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWNyZWF0ZWFycmF5aXRlcmF0b3Jcbm1vZHVsZS5leHBvcnRzID0gZGVmaW5lSXRlcmF0b3IoQXJyYXksICdBcnJheScsIGZ1bmN0aW9uIChpdGVyYXRlZCwga2luZCkge1xuICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHtcbiAgICB0eXBlOiBBUlJBWV9JVEVSQVRPUixcbiAgICB0YXJnZXQ6IHRvSW5kZXhlZE9iamVjdChpdGVyYXRlZCksIC8vIHRhcmdldFxuICAgIGluZGV4OiAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuICAgIGtpbmQ6IGtpbmQgICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2luZFxuICB9KTtcbi8vIGAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUubmV4dGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSVhcnJheWl0ZXJhdG9ycHJvdG90eXBlJS5uZXh0XG59LCBmdW5jdGlvbiAoKSB7XG4gIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7XG4gIHZhciB0YXJnZXQgPSBzdGF0ZS50YXJnZXQ7XG4gIHZhciBraW5kID0gc3RhdGUua2luZDtcbiAgdmFyIGluZGV4ID0gc3RhdGUuaW5kZXgrKztcbiAgaWYgKCF0YXJnZXQgfHwgaW5kZXggPj0gdGFyZ2V0Lmxlbmd0aCkge1xuICAgIHN0YXRlLnRhcmdldCA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gIH1cbiAgaWYgKGtpbmQgPT0gJ2tleXMnKSByZXR1cm4geyB2YWx1ZTogaW5kZXgsIGRvbmU6IGZhbHNlIH07XG4gIGlmIChraW5kID09ICd2YWx1ZXMnKSByZXR1cm4geyB2YWx1ZTogdGFyZ2V0W2luZGV4XSwgZG9uZTogZmFsc2UgfTtcbiAgcmV0dXJuIHsgdmFsdWU6IFtpbmRleCwgdGFyZ2V0W2luZGV4XV0sIGRvbmU6IGZhbHNlIH07XG59LCAndmFsdWVzJyk7XG5cbi8vIGFyZ3VtZW50c0xpc3RbQEBpdGVyYXRvcl0gaXMgJUFycmF5UHJvdG9fdmFsdWVzJVxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1jcmVhdGV1bm1hcHBlZGFyZ3VtZW50c29iamVjdFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1jcmVhdGVtYXBwZWRhcmd1bWVudHNvYmplY3Rcbkl0ZXJhdG9ycy5Bcmd1bWVudHMgPSBJdGVyYXRvcnMuQXJyYXk7XG5cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAdW5zY29wYWJsZXNcbmFkZFRvVW5zY29wYWJsZXMoJ2tleXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ3ZhbHVlcycpO1xuYWRkVG9VbnNjb3BhYmxlcygnZW50cmllcycpO1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyAxMjQ5OlxuLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMTA5KTtcbnZhciAkbWFwID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMDkyKS5tYXA7XG52YXIgYXJyYXlNZXRob2RIYXNTcGVjaWVzU3VwcG9ydCA9IF9fd2VicGFja19yZXF1aXJlX18oMTE5NCk7XG5cbnZhciBIQVNfU1BFQ0lFU19TVVBQT1JUID0gYXJyYXlNZXRob2RIYXNTcGVjaWVzU3VwcG9ydCgnbWFwJyk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUubWFwYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLm1hcFxuLy8gd2l0aCBhZGRpbmcgc3VwcG9ydCBvZiBAQHNwZWNpZXNcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6ICFIQVNfU1BFQ0lFU19TVVBQT1JUIH0sIHtcbiAgbWFwOiBmdW5jdGlvbiBtYXAoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICByZXR1cm4gJG1hcCh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gIH1cbn0pO1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA3MDQyOlxuLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMTA5KTtcbnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTExKTtcbnZhciBpc0FycmF5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMTU3KTtcbnZhciB0b0Fic29sdXRlSW5kZXggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0MDApO1xudmFyIHRvTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NDY2KTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU2NTYpO1xudmFyIGNyZWF0ZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2MTM1KTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUxMTIpO1xudmFyIGFycmF5TWV0aG9kSGFzU3BlY2llc1N1cHBvcnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExOTQpO1xuXG52YXIgSEFTX1NQRUNJRVNfU1VQUE9SVCA9IGFycmF5TWV0aG9kSGFzU3BlY2llc1N1cHBvcnQoJ3NsaWNlJyk7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG52YXIgbmF0aXZlU2xpY2UgPSBbXS5zbGljZTtcbnZhciBtYXggPSBNYXRoLm1heDtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5zbGljZWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5zbGljZVxuLy8gZmFsbGJhY2sgZm9yIG5vdCBhcnJheS1saWtlIEVTMyBzdHJpbmdzIGFuZCBET00gb2JqZWN0c1xuJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogIUhBU19TUEVDSUVTX1NVUFBPUlQgfSwge1xuICBzbGljZTogZnVuY3Rpb24gc2xpY2Uoc3RhcnQsIGVuZCkge1xuICAgIHZhciBPID0gdG9JbmRleGVkT2JqZWN0KHRoaXMpO1xuICAgIHZhciBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gICAgdmFyIGsgPSB0b0Fic29sdXRlSW5kZXgoc3RhcnQsIGxlbmd0aCk7XG4gICAgdmFyIGZpbiA9IHRvQWJzb2x1dGVJbmRleChlbmQgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IGVuZCwgbGVuZ3RoKTtcbiAgICAvLyBpbmxpbmUgYEFycmF5U3BlY2llc0NyZWF0ZWAgZm9yIHVzYWdlIG5hdGl2ZSBgQXJyYXkjc2xpY2VgIHdoZXJlIGl0J3MgcG9zc2libGVcbiAgICB2YXIgQ29uc3RydWN0b3IsIHJlc3VsdCwgbjtcbiAgICBpZiAoaXNBcnJheShPKSkge1xuICAgICAgQ29uc3RydWN0b3IgPSBPLmNvbnN0cnVjdG9yO1xuICAgICAgLy8gY3Jvc3MtcmVhbG0gZmFsbGJhY2tcbiAgICAgIGlmICh0eXBlb2YgQ29uc3RydWN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiAoQ29uc3RydWN0b3IgPT09IEFycmF5IHx8IGlzQXJyYXkoQ29uc3RydWN0b3IucHJvdG90eXBlKSkpIHtcbiAgICAgICAgQ29uc3RydWN0b3IgPSB1bmRlZmluZWQ7XG4gICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KENvbnN0cnVjdG9yKSkge1xuICAgICAgICBDb25zdHJ1Y3RvciA9IENvbnN0cnVjdG9yW1NQRUNJRVNdO1xuICAgICAgICBpZiAoQ29uc3RydWN0b3IgPT09IG51bGwpIENvbnN0cnVjdG9yID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKENvbnN0cnVjdG9yID09PSBBcnJheSB8fCBDb25zdHJ1Y3RvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBuYXRpdmVTbGljZS5jYWxsKE8sIGssIGZpbik7XG4gICAgICB9XG4gICAgfVxuICAgIHJlc3VsdCA9IG5ldyAoQ29uc3RydWN0b3IgPT09IHVuZGVmaW5lZCA/IEFycmF5IDogQ29uc3RydWN0b3IpKG1heChmaW4gLSBrLCAwKSk7XG4gICAgZm9yIChuID0gMDsgayA8IGZpbjsgaysrLCBuKyspIGlmIChrIGluIE8pIGNyZWF0ZVByb3BlcnR5KHJlc3VsdCwgbiwgT1trXSk7XG4gICAgcmVzdWx0Lmxlbmd0aCA9IG47XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufSk7XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDU2MTpcbi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oMjEwOSk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDAwKTtcbnZhciB0b0ludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk5NTgpO1xudmFyIHRvTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NDY2KTtcbnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oNzkwOCk7XG52YXIgYXJyYXlTcGVjaWVzQ3JlYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NDE3KTtcbnZhciBjcmVhdGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oNjEzNSk7XG52YXIgYXJyYXlNZXRob2RIYXNTcGVjaWVzU3VwcG9ydCA9IF9fd2VicGFja19yZXF1aXJlX18oMTE5NCk7XG5cbnZhciBIQVNfU1BFQ0lFU19TVVBQT1JUID0gYXJyYXlNZXRob2RIYXNTcGVjaWVzU3VwcG9ydCgnc3BsaWNlJyk7XG5cbnZhciBtYXggPSBNYXRoLm1heDtcbnZhciBtaW4gPSBNYXRoLm1pbjtcbnZhciBNQVhfU0FGRV9JTlRFR0VSID0gMHgxRkZGRkZGRkZGRkZGRjtcbnZhciBNQVhJTVVNX0FMTE9XRURfTEVOR1RIX0VYQ0VFREVEID0gJ01heGltdW0gYWxsb3dlZCBsZW5ndGggZXhjZWVkZWQnO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLnNwbGljZWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5zcGxpY2Vcbi8vIHdpdGggYWRkaW5nIHN1cHBvcnQgb2YgQEBzcGVjaWVzXG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiAhSEFTX1NQRUNJRVNfU1VQUE9SVCB9LCB7XG4gIHNwbGljZTogZnVuY3Rpb24gc3BsaWNlKHN0YXJ0LCBkZWxldGVDb3VudCAvKiAsIC4uLml0ZW1zICovKSB7XG4gICAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTtcbiAgICB2YXIgbGVuID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICAgIHZhciBhY3R1YWxTdGFydCA9IHRvQWJzb2x1dGVJbmRleChzdGFydCwgbGVuKTtcbiAgICB2YXIgYXJndW1lbnRzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB2YXIgaW5zZXJ0Q291bnQsIGFjdHVhbERlbGV0ZUNvdW50LCBBLCBrLCBmcm9tLCB0bztcbiAgICBpZiAoYXJndW1lbnRzTGVuZ3RoID09PSAwKSB7XG4gICAgICBpbnNlcnRDb3VudCA9IGFjdHVhbERlbGV0ZUNvdW50ID0gMDtcbiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50c0xlbmd0aCA9PT0gMSkge1xuICAgICAgaW5zZXJ0Q291bnQgPSAwO1xuICAgICAgYWN0dWFsRGVsZXRlQ291bnQgPSBsZW4gLSBhY3R1YWxTdGFydDtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5zZXJ0Q291bnQgPSBhcmd1bWVudHNMZW5ndGggLSAyO1xuICAgICAgYWN0dWFsRGVsZXRlQ291bnQgPSBtaW4obWF4KHRvSW50ZWdlcihkZWxldGVDb3VudCksIDApLCBsZW4gLSBhY3R1YWxTdGFydCk7XG4gICAgfVxuICAgIGlmIChsZW4gKyBpbnNlcnRDb3VudCAtIGFjdHVhbERlbGV0ZUNvdW50ID4gTUFYX1NBRkVfSU5URUdFUikge1xuICAgICAgdGhyb3cgVHlwZUVycm9yKE1BWElNVU1fQUxMT1dFRF9MRU5HVEhfRVhDRUVERUQpO1xuICAgIH1cbiAgICBBID0gYXJyYXlTcGVjaWVzQ3JlYXRlKE8sIGFjdHVhbERlbGV0ZUNvdW50KTtcbiAgICBmb3IgKGsgPSAwOyBrIDwgYWN0dWFsRGVsZXRlQ291bnQ7IGsrKykge1xuICAgICAgZnJvbSA9IGFjdHVhbFN0YXJ0ICsgaztcbiAgICAgIGlmIChmcm9tIGluIE8pIGNyZWF0ZVByb3BlcnR5KEEsIGssIE9bZnJvbV0pO1xuICAgIH1cbiAgICBBLmxlbmd0aCA9IGFjdHVhbERlbGV0ZUNvdW50O1xuICAgIGlmIChpbnNlcnRDb3VudCA8IGFjdHVhbERlbGV0ZUNvdW50KSB7XG4gICAgICBmb3IgKGsgPSBhY3R1YWxTdGFydDsgayA8IGxlbiAtIGFjdHVhbERlbGV0ZUNvdW50OyBrKyspIHtcbiAgICAgICAgZnJvbSA9IGsgKyBhY3R1YWxEZWxldGVDb3VudDtcbiAgICAgICAgdG8gPSBrICsgaW5zZXJ0Q291bnQ7XG4gICAgICAgIGlmIChmcm9tIGluIE8pIE9bdG9dID0gT1tmcm9tXTtcbiAgICAgICAgZWxzZSBkZWxldGUgT1t0b107XG4gICAgICB9XG4gICAgICBmb3IgKGsgPSBsZW47IGsgPiBsZW4gLSBhY3R1YWxEZWxldGVDb3VudCArIGluc2VydENvdW50OyBrLS0pIGRlbGV0ZSBPW2sgLSAxXTtcbiAgICB9IGVsc2UgaWYgKGluc2VydENvdW50ID4gYWN0dWFsRGVsZXRlQ291bnQpIHtcbiAgICAgIGZvciAoayA9IGxlbiAtIGFjdHVhbERlbGV0ZUNvdW50OyBrID4gYWN0dWFsU3RhcnQ7IGstLSkge1xuICAgICAgICBmcm9tID0gayArIGFjdHVhbERlbGV0ZUNvdW50IC0gMTtcbiAgICAgICAgdG8gPSBrICsgaW5zZXJ0Q291bnQgLSAxO1xuICAgICAgICBpZiAoZnJvbSBpbiBPKSBPW3RvXSA9IE9bZnJvbV07XG4gICAgICAgIGVsc2UgZGVsZXRlIE9bdG9dO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGsgPSAwOyBrIDwgaW5zZXJ0Q291bnQ7IGsrKykge1xuICAgICAgT1trICsgYWN0dWFsU3RhcnRdID0gYXJndW1lbnRzW2sgKyAyXTtcbiAgICB9XG4gICAgTy5sZW5ndGggPSBsZW4gLSBhY3R1YWxEZWxldGVDb3VudCArIGluc2VydENvdW50O1xuICAgIHJldHVybiBBO1xuICB9XG59KTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gODMwOTpcbi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oOTc4MSk7XG52YXIgZGVmaW5lUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMwNzApLmY7XG5cbnZhciBGdW5jdGlvblByb3RvdHlwZSA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcbnZhciBGdW5jdGlvblByb3RvdHlwZVRvU3RyaW5nID0gRnVuY3Rpb25Qcm90b3R5cGUudG9TdHJpbmc7XG52YXIgbmFtZVJFID0gL15cXHMqZnVuY3Rpb24gKFteIChdKikvO1xudmFyIE5BTUUgPSAnbmFtZSc7XG5cbi8vIEZ1bmN0aW9uIGluc3RhbmNlcyBgLm5hbWVgIHByb3BlcnR5XG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWZ1bmN0aW9uLWluc3RhbmNlcy1uYW1lXG5pZiAoREVTQ1JJUFRPUlMgJiYgIShOQU1FIGluIEZ1bmN0aW9uUHJvdG90eXBlKSkge1xuICBkZWZpbmVQcm9wZXJ0eShGdW5jdGlvblByb3RvdHlwZSwgTkFNRSwge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvblByb3RvdHlwZVRvU3RyaW5nLmNhbGwodGhpcykubWF0Y2gobmFtZVJFKVsxXTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA0ODk6XG4vKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oMjEwOSk7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcyOTMpO1xudmFyIHRvT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OTA4KTtcbnZhciBuYXRpdmVHZXRQcm90b3R5cGVPZiA9IF9fd2VicGFja19yZXF1aXJlX18oOTUxOCk7XG52YXIgQ09SUkVDVF9QUk9UT1RZUEVfR0VUVEVSID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NTQ0KTtcblxudmFyIEZBSUxTX09OX1BSSU1JVElWRVMgPSBmYWlscyhmdW5jdGlvbiAoKSB7IG5hdGl2ZUdldFByb3RvdHlwZU9mKDEpOyB9KTtcblxuLy8gYE9iamVjdC5nZXRQcm90b3R5cGVPZmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRwcm90b3R5cGVvZlxuJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogRkFJTFNfT05fUFJJTUlUSVZFUywgc2hhbTogIUNPUlJFQ1RfUFJPVE9UWVBFX0dFVFRFUiB9LCB7XG4gIGdldFByb3RvdHlwZU9mOiBmdW5jdGlvbiBnZXRQcm90b3R5cGVPZihpdCkge1xuICAgIHJldHVybiBuYXRpdmVHZXRQcm90b3R5cGVPZih0b09iamVjdChpdCkpO1xuICB9XG59KTtcblxuXG5cbi8qKiovIH0pLFxuXG4vKioqLyAxNTM5OlxuLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIFRPX1NUUklOR19UQUdfU1VQUE9SVCA9IF9fd2VicGFja19yZXF1aXJlX18oMTY5NCk7XG52YXIgcmVkZWZpbmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzMjApO1xudmFyIHRvU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygyODgpO1xuXG4vLyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmdcbmlmICghVE9fU1RSSU5HX1RBR19TVVBQT1JUKSB7XG4gIHJlZGVmaW5lKE9iamVjdC5wcm90b3R5cGUsICd0b1N0cmluZycsIHRvU3RyaW5nLCB7IHVuc2FmZTogdHJ1ZSB9KTtcbn1cblxuXG4vKioqLyB9KSxcblxuLyoqKi8gNDkxNjpcbi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oMjEwOSk7XG52YXIgZXhlYyA9IF9fd2VicGFja19yZXF1aXJlX18oMjI2MSk7XG5cbi8vIGBSZWdFeHAucHJvdG90eXBlLmV4ZWNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1yZWdleHAucHJvdG90eXBlLmV4ZWNcbiQoeyB0YXJnZXQ6ICdSZWdFeHAnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiAvLi8uZXhlYyAhPT0gZXhlYyB9LCB7XG4gIGV4ZWM6IGV4ZWNcbn0pO1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA5NzE0OlxuLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciByZWRlZmluZSA9IF9fd2VicGFja19yZXF1aXJlX18oMTMyMCk7XG52YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk2NzApO1xudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3MjkzKTtcbnZhciBmbGFncyA9IF9fd2VicGFja19yZXF1aXJlX18oNzA2Nik7XG5cbnZhciBUT19TVFJJTkcgPSAndG9TdHJpbmcnO1xudmFyIFJlZ0V4cFByb3RvdHlwZSA9IFJlZ0V4cC5wcm90b3R5cGU7XG52YXIgbmF0aXZlVG9TdHJpbmcgPSBSZWdFeHBQcm90b3R5cGVbVE9fU1RSSU5HXTtcblxudmFyIE5PVF9HRU5FUklDID0gZmFpbHMoZnVuY3Rpb24gKCkgeyByZXR1cm4gbmF0aXZlVG9TdHJpbmcuY2FsbCh7IHNvdXJjZTogJ2EnLCBmbGFnczogJ2InIH0pICE9ICcvYS9iJzsgfSk7XG4vLyBGRjQ0LSBSZWdFeHAjdG9TdHJpbmcgaGFzIGEgd3JvbmcgbmFtZVxudmFyIElOQ09SUkVDVF9OQU1FID0gbmF0aXZlVG9TdHJpbmcubmFtZSAhPSBUT19TVFJJTkc7XG5cbi8vIGBSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcmVnZXhwLnByb3RvdHlwZS50b3N0cmluZ1xuaWYgKE5PVF9HRU5FUklDIHx8IElOQ09SUkVDVF9OQU1FKSB7XG4gIHJlZGVmaW5lKFJlZ0V4cC5wcm90b3R5cGUsIFRPX1NUUklORywgZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgdmFyIFIgPSBhbk9iamVjdCh0aGlzKTtcbiAgICB2YXIgcCA9IFN0cmluZyhSLnNvdXJjZSk7XG4gICAgdmFyIHJmID0gUi5mbGFncztcbiAgICB2YXIgZiA9IFN0cmluZyhyZiA9PT0gdW5kZWZpbmVkICYmIFIgaW5zdGFuY2VvZiBSZWdFeHAgJiYgISgnZmxhZ3MnIGluIFJlZ0V4cFByb3RvdHlwZSkgPyBmbGFncy5jYWxsKFIpIDogcmYpO1xuICAgIHJldHVybiAnLycgKyBwICsgJy8nICsgZjtcbiAgfSwgeyB1bnNhZmU6IHRydWUgfSk7XG59XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDg3ODM6XG4vKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxudmFyIGNoYXJBdCA9IF9fd2VicGFja19yZXF1aXJlX18oODcxMCkuY2hhckF0O1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk5MDkpO1xudmFyIGRlZmluZUl0ZXJhdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NTQpO1xuXG52YXIgU1RSSU5HX0lURVJBVE9SID0gJ1N0cmluZyBJdGVyYXRvcic7XG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihTVFJJTkdfSVRFUkFUT1IpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZVtAQGl0ZXJhdG9yXWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUtQEBpdGVyYXRvclxuZGVmaW5lSXRlcmF0b3IoU3RyaW5nLCAnU3RyaW5nJywgZnVuY3Rpb24gKGl0ZXJhdGVkKSB7XG4gIHNldEludGVybmFsU3RhdGUodGhpcywge1xuICAgIHR5cGU6IFNUUklOR19JVEVSQVRPUixcbiAgICBzdHJpbmc6IFN0cmluZyhpdGVyYXRlZCksXG4gICAgaW5kZXg6IDBcbiAgfSk7XG4vLyBgJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJS5uZXh0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtJXN0cmluZ2l0ZXJhdG9ycHJvdG90eXBlJS5uZXh0XG59LCBmdW5jdGlvbiBuZXh0KCkge1xuICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICB2YXIgc3RyaW5nID0gc3RhdGUuc3RyaW5nO1xuICB2YXIgaW5kZXggPSBzdGF0ZS5pbmRleDtcbiAgdmFyIHBvaW50O1xuICBpZiAoaW5kZXggPj0gc3RyaW5nLmxlbmd0aCkgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICBwb2ludCA9IGNoYXJBdChzdHJpbmcsIGluZGV4KTtcbiAgc3RhdGUuaW5kZXggKz0gcG9pbnQubGVuZ3RoO1xuICByZXR1cm4geyB2YWx1ZTogcG9pbnQsIGRvbmU6IGZhbHNlIH07XG59KTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gNDcyMzpcbi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG52YXIgZml4UmVnRXhwV2VsbEtub3duU3ltYm9sTG9naWMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcwMDcpO1xudmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NjcwKTtcbnZhciB0b0xlbmd0aCA9IF9fd2VicGFja19yZXF1aXJlX18oNzQ2Nik7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oNDQ4OCk7XG52YXIgYWR2YW5jZVN0cmluZ0luZGV4ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNTMwKTtcbnZhciByZWdFeHBFeGVjID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NjUxKTtcblxuLy8gQEBtYXRjaCBsb2dpY1xuZml4UmVnRXhwV2VsbEtub3duU3ltYm9sTG9naWMoJ21hdGNoJywgMSwgZnVuY3Rpb24gKE1BVENILCBuYXRpdmVNYXRjaCwgbWF5YmVDYWxsTmF0aXZlKSB7XG4gIHJldHVybiBbXG4gICAgLy8gYFN0cmluZy5wcm90b3R5cGUubWF0Y2hgIG1ldGhvZFxuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5tYXRjaFxuICAgIGZ1bmN0aW9uIG1hdGNoKHJlZ2V4cCkge1xuICAgICAgdmFyIE8gPSByZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpO1xuICAgICAgdmFyIG1hdGNoZXIgPSByZWdleHAgPT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogcmVnZXhwW01BVENIXTtcbiAgICAgIHJldHVybiBtYXRjaGVyICE9PSB1bmRlZmluZWQgPyBtYXRjaGVyLmNhbGwocmVnZXhwLCBPKSA6IG5ldyBSZWdFeHAocmVnZXhwKVtNQVRDSF0oU3RyaW5nKE8pKTtcbiAgICB9LFxuICAgIC8vIGBSZWdFeHAucHJvdG90eXBlW0BAbWF0Y2hdYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXJlZ2V4cC5wcm90b3R5cGUtQEBtYXRjaFxuICAgIGZ1bmN0aW9uIChyZWdleHApIHtcbiAgICAgIHZhciByZXMgPSBtYXliZUNhbGxOYXRpdmUobmF0aXZlTWF0Y2gsIHJlZ2V4cCwgdGhpcyk7XG4gICAgICBpZiAocmVzLmRvbmUpIHJldHVybiByZXMudmFsdWU7XG5cbiAgICAgIHZhciByeCA9IGFuT2JqZWN0KHJlZ2V4cCk7XG4gICAgICB2YXIgUyA9IFN0cmluZyh0aGlzKTtcblxuICAgICAgaWYgKCFyeC5nbG9iYWwpIHJldHVybiByZWdFeHBFeGVjKHJ4LCBTKTtcblxuICAgICAgdmFyIGZ1bGxVbmljb2RlID0gcngudW5pY29kZTtcbiAgICAgIHJ4Lmxhc3RJbmRleCA9IDA7XG4gICAgICB2YXIgQSA9IFtdO1xuICAgICAgdmFyIG4gPSAwO1xuICAgICAgdmFyIHJlc3VsdDtcbiAgICAgIHdoaWxlICgocmVzdWx0ID0gcmVnRXhwRXhlYyhyeCwgUykpICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBtYXRjaFN0ciA9IFN0cmluZyhyZXN1bHRbMF0pO1xuICAgICAgICBBW25dID0gbWF0Y2hTdHI7XG4gICAgICAgIGlmIChtYXRjaFN0ciA9PT0gJycpIHJ4Lmxhc3RJbmRleCA9IGFkdmFuY2VTdHJpbmdJbmRleChTLCB0b0xlbmd0aChyeC5sYXN0SW5kZXgpLCBmdWxsVW5pY29kZSk7XG4gICAgICAgIG4rKztcbiAgICAgIH1cbiAgICAgIHJldHVybiBuID09PSAwID8gbnVsbCA6IEE7XG4gICAgfVxuICBdO1xufSk7XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDUzMDY6XG4vKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxudmFyIGZpeFJlZ0V4cFdlbGxLbm93blN5bWJvbExvZ2ljID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3MDA3KTtcbnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oOTY3MCk7XG52YXIgdG9MZW5ndGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc0NjYpO1xudmFyIHRvSW50ZWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oOTk1OCk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oNDQ4OCk7XG52YXIgYWR2YW5jZVN0cmluZ0luZGV4ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNTMwKTtcbnZhciBnZXRTdWJzdGl0dXRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY0Nyk7XG52YXIgcmVnRXhwRXhlYyA9IF9fd2VicGFja19yZXF1aXJlX18oNzY1MSk7XG5cbnZhciBtYXggPSBNYXRoLm1heDtcbnZhciBtaW4gPSBNYXRoLm1pbjtcblxudmFyIG1heWJlVG9TdHJpbmcgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ID09PSB1bmRlZmluZWQgPyBpdCA6IFN0cmluZyhpdCk7XG59O1xuXG4vLyBAQHJlcGxhY2UgbG9naWNcbmZpeFJlZ0V4cFdlbGxLbm93blN5bWJvbExvZ2ljKCdyZXBsYWNlJywgMiwgZnVuY3Rpb24gKFJFUExBQ0UsIG5hdGl2ZVJlcGxhY2UsIG1heWJlQ2FsbE5hdGl2ZSwgcmVhc29uKSB7XG4gIHZhciBSRUdFWFBfUkVQTEFDRV9TVUJTVElUVVRFU19VTkRFRklORURfQ0FQVFVSRSA9IHJlYXNvbi5SRUdFWFBfUkVQTEFDRV9TVUJTVElUVVRFU19VTkRFRklORURfQ0FQVFVSRTtcbiAgdmFyIFJFUExBQ0VfS0VFUFNfJDAgPSByZWFzb24uUkVQTEFDRV9LRUVQU18kMDtcbiAgdmFyIFVOU0FGRV9TVUJTVElUVVRFID0gUkVHRVhQX1JFUExBQ0VfU1VCU1RJVFVURVNfVU5ERUZJTkVEX0NBUFRVUkUgPyAnJCcgOiAnJDAnO1xuXG4gIHJldHVybiBbXG4gICAgLy8gYFN0cmluZy5wcm90b3R5cGUucmVwbGFjZWAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnJlcGxhY2VcbiAgICBmdW5jdGlvbiByZXBsYWNlKHNlYXJjaFZhbHVlLCByZXBsYWNlVmFsdWUpIHtcbiAgICAgIHZhciBPID0gcmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKTtcbiAgICAgIHZhciByZXBsYWNlciA9IHNlYXJjaFZhbHVlID09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHNlYXJjaFZhbHVlW1JFUExBQ0VdO1xuICAgICAgcmV0dXJuIHJlcGxhY2VyICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyByZXBsYWNlci5jYWxsKHNlYXJjaFZhbHVlLCBPLCByZXBsYWNlVmFsdWUpXG4gICAgICAgIDogbmF0aXZlUmVwbGFjZS5jYWxsKFN0cmluZyhPKSwgc2VhcmNoVmFsdWUsIHJlcGxhY2VWYWx1ZSk7XG4gICAgfSxcbiAgICAvLyBgUmVnRXhwLnByb3RvdHlwZVtAQHJlcGxhY2VdYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXJlZ2V4cC5wcm90b3R5cGUtQEByZXBsYWNlXG4gICAgZnVuY3Rpb24gKHJlZ2V4cCwgcmVwbGFjZVZhbHVlKSB7XG4gICAgICBpZiAoXG4gICAgICAgICghUkVHRVhQX1JFUExBQ0VfU1VCU1RJVFVURVNfVU5ERUZJTkVEX0NBUFRVUkUgJiYgUkVQTEFDRV9LRUVQU18kMCkgfHxcbiAgICAgICAgKHR5cGVvZiByZXBsYWNlVmFsdWUgPT09ICdzdHJpbmcnICYmIHJlcGxhY2VWYWx1ZS5pbmRleE9mKFVOU0FGRV9TVUJTVElUVVRFKSA9PT0gLTEpXG4gICAgICApIHtcbiAgICAgICAgdmFyIHJlcyA9IG1heWJlQ2FsbE5hdGl2ZShuYXRpdmVSZXBsYWNlLCByZWdleHAsIHRoaXMsIHJlcGxhY2VWYWx1ZSk7XG4gICAgICAgIGlmIChyZXMuZG9uZSkgcmV0dXJuIHJlcy52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIHJ4ID0gYW5PYmplY3QocmVnZXhwKTtcbiAgICAgIHZhciBTID0gU3RyaW5nKHRoaXMpO1xuXG4gICAgICB2YXIgZnVuY3Rpb25hbFJlcGxhY2UgPSB0eXBlb2YgcmVwbGFjZVZhbHVlID09PSAnZnVuY3Rpb24nO1xuICAgICAgaWYgKCFmdW5jdGlvbmFsUmVwbGFjZSkgcmVwbGFjZVZhbHVlID0gU3RyaW5nKHJlcGxhY2VWYWx1ZSk7XG5cbiAgICAgIHZhciBnbG9iYWwgPSByeC5nbG9iYWw7XG4gICAgICBpZiAoZ2xvYmFsKSB7XG4gICAgICAgIHZhciBmdWxsVW5pY29kZSA9IHJ4LnVuaWNvZGU7XG4gICAgICAgIHJ4Lmxhc3RJbmRleCA9IDA7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0cyA9IFtdO1xuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHJlZ0V4cEV4ZWMocngsIFMpO1xuICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSBicmVhaztcblxuICAgICAgICByZXN1bHRzLnB1c2gocmVzdWx0KTtcbiAgICAgICAgaWYgKCFnbG9iYWwpIGJyZWFrO1xuXG4gICAgICAgIHZhciBtYXRjaFN0ciA9IFN0cmluZyhyZXN1bHRbMF0pO1xuICAgICAgICBpZiAobWF0Y2hTdHIgPT09ICcnKSByeC5sYXN0SW5kZXggPSBhZHZhbmNlU3RyaW5nSW5kZXgoUywgdG9MZW5ndGgocngubGFzdEluZGV4KSwgZnVsbFVuaWNvZGUpO1xuICAgICAgfVxuXG4gICAgICB2YXIgYWNjdW11bGF0ZWRSZXN1bHQgPSAnJztcbiAgICAgIHZhciBuZXh0U291cmNlUG9zaXRpb24gPSAwO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdHNbaV07XG5cbiAgICAgICAgdmFyIG1hdGNoZWQgPSBTdHJpbmcocmVzdWx0WzBdKTtcbiAgICAgICAgdmFyIHBvc2l0aW9uID0gbWF4KG1pbih0b0ludGVnZXIocmVzdWx0LmluZGV4KSwgUy5sZW5ndGgpLCAwKTtcbiAgICAgICAgdmFyIGNhcHR1cmVzID0gW107XG4gICAgICAgIC8vIE5PVEU6IFRoaXMgaXMgZXF1aXZhbGVudCB0b1xuICAgICAgICAvLyAgIGNhcHR1cmVzID0gcmVzdWx0LnNsaWNlKDEpLm1hcChtYXliZVRvU3RyaW5nKVxuICAgICAgICAvLyBidXQgZm9yIHNvbWUgcmVhc29uIGBuYXRpdmVTbGljZS5jYWxsKHJlc3VsdCwgMSwgcmVzdWx0Lmxlbmd0aClgIChjYWxsZWQgaW5cbiAgICAgICAgLy8gdGhlIHNsaWNlIHBvbHlmaWxsIHdoZW4gc2xpY2luZyBuYXRpdmUgYXJyYXlzKSBcImRvZXNuJ3Qgd29ya1wiIGluIHNhZmFyaSA5IGFuZFxuICAgICAgICAvLyBjYXVzZXMgYSBjcmFzaCAoaHR0cHM6Ly9wYXN0ZWJpbi5jb20vTjIxUXplUUEpIHdoZW4gdHJ5aW5nIHRvIGRlYnVnIGl0LlxuICAgICAgICBmb3IgKHZhciBqID0gMTsgaiA8IHJlc3VsdC5sZW5ndGg7IGorKykgY2FwdHVyZXMucHVzaChtYXliZVRvU3RyaW5nKHJlc3VsdFtqXSkpO1xuICAgICAgICB2YXIgbmFtZWRDYXB0dXJlcyA9IHJlc3VsdC5ncm91cHM7XG4gICAgICAgIGlmIChmdW5jdGlvbmFsUmVwbGFjZSkge1xuICAgICAgICAgIHZhciByZXBsYWNlckFyZ3MgPSBbbWF0Y2hlZF0uY29uY2F0KGNhcHR1cmVzLCBwb3NpdGlvbiwgUyk7XG4gICAgICAgICAgaWYgKG5hbWVkQ2FwdHVyZXMgIT09IHVuZGVmaW5lZCkgcmVwbGFjZXJBcmdzLnB1c2gobmFtZWRDYXB0dXJlcyk7XG4gICAgICAgICAgdmFyIHJlcGxhY2VtZW50ID0gU3RyaW5nKHJlcGxhY2VWYWx1ZS5hcHBseSh1bmRlZmluZWQsIHJlcGxhY2VyQXJncykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlcGxhY2VtZW50ID0gZ2V0U3Vic3RpdHV0aW9uKG1hdGNoZWQsIFMsIHBvc2l0aW9uLCBjYXB0dXJlcywgbmFtZWRDYXB0dXJlcywgcmVwbGFjZVZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocG9zaXRpb24gPj0gbmV4dFNvdXJjZVBvc2l0aW9uKSB7XG4gICAgICAgICAgYWNjdW11bGF0ZWRSZXN1bHQgKz0gUy5zbGljZShuZXh0U291cmNlUG9zaXRpb24sIHBvc2l0aW9uKSArIHJlcGxhY2VtZW50O1xuICAgICAgICAgIG5leHRTb3VyY2VQb3NpdGlvbiA9IHBvc2l0aW9uICsgbWF0Y2hlZC5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2N1bXVsYXRlZFJlc3VsdCArIFMuc2xpY2UobmV4dFNvdXJjZVBvc2l0aW9uKTtcbiAgICB9XG4gIF07XG59KTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gMzEyMzpcbi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG52YXIgZml4UmVnRXhwV2VsbEtub3duU3ltYm9sTG9naWMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcwMDcpO1xudmFyIGlzUmVnRXhwID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3ODUwKTtcbnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oOTY3MCk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oNDQ4OCk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NzA3KTtcbnZhciBhZHZhbmNlU3RyaW5nSW5kZXggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1MzApO1xudmFyIHRvTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NDY2KTtcbnZhciBjYWxsUmVnRXhwRXhlYyA9IF9fd2VicGFja19yZXF1aXJlX18oNzY1MSk7XG52YXIgcmVnZXhwRXhlYyA9IF9fd2VicGFja19yZXF1aXJlX18oMjI2MSk7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcyOTMpO1xuXG52YXIgYXJyYXlQdXNoID0gW10ucHVzaDtcbnZhciBtaW4gPSBNYXRoLm1pbjtcbnZhciBNQVhfVUlOVDMyID0gMHhGRkZGRkZGRjtcblxuLy8gYmFiZWwtbWluaWZ5IHRyYW5zcGlsZXMgUmVnRXhwKCd4JywgJ3knKSAtPiAveC95IGFuZCBpdCBjYXVzZXMgU3ludGF4RXJyb3JcbnZhciBTVVBQT1JUU19ZID0gIWZhaWxzKGZ1bmN0aW9uICgpIHsgcmV0dXJuICFSZWdFeHAoTUFYX1VJTlQzMiwgJ3knKTsgfSk7XG5cbi8vIEBAc3BsaXQgbG9naWNcbmZpeFJlZ0V4cFdlbGxLbm93blN5bWJvbExvZ2ljKCdzcGxpdCcsIDIsIGZ1bmN0aW9uIChTUExJVCwgbmF0aXZlU3BsaXQsIG1heWJlQ2FsbE5hdGl2ZSkge1xuICB2YXIgaW50ZXJuYWxTcGxpdDtcbiAgaWYgKFxuICAgICdhYmJjJy5zcGxpdCgvKGIpKi8pWzFdID09ICdjJyB8fFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWdleHAvbm8tZW1wdHktZ3JvdXAgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgICAndGVzdCcuc3BsaXQoLyg/OikvLCAtMSkubGVuZ3RoICE9IDQgfHxcbiAgICAnYWInLnNwbGl0KC8oPzphYikqLykubGVuZ3RoICE9IDIgfHxcbiAgICAnLicuc3BsaXQoLyguPykoLj8pLykubGVuZ3RoICE9IDQgfHxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL25vLWFzc2VydGlvbi1jYXB0dXJpbmctZ3JvdXAsIHJlZ2V4cC9uby1lbXB0eS1ncm91cCAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICAgICcuJy5zcGxpdCgvKCkoKS8pLmxlbmd0aCA+IDEgfHxcbiAgICAnJy5zcGxpdCgvLj8vKS5sZW5ndGhcbiAgKSB7XG4gICAgLy8gYmFzZWQgb24gZXM1LXNoaW0gaW1wbGVtZW50YXRpb24sIG5lZWQgdG8gcmV3b3JrIGl0XG4gICAgaW50ZXJuYWxTcGxpdCA9IGZ1bmN0aW9uIChzZXBhcmF0b3IsIGxpbWl0KSB7XG4gICAgICB2YXIgc3RyaW5nID0gU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcykpO1xuICAgICAgdmFyIGxpbSA9IGxpbWl0ID09PSB1bmRlZmluZWQgPyBNQVhfVUlOVDMyIDogbGltaXQgPj4+IDA7XG4gICAgICBpZiAobGltID09PSAwKSByZXR1cm4gW107XG4gICAgICBpZiAoc2VwYXJhdG9yID09PSB1bmRlZmluZWQpIHJldHVybiBbc3RyaW5nXTtcbiAgICAgIC8vIElmIGBzZXBhcmF0b3JgIGlzIG5vdCBhIHJlZ2V4LCB1c2UgbmF0aXZlIHNwbGl0XG4gICAgICBpZiAoIWlzUmVnRXhwKHNlcGFyYXRvcikpIHtcbiAgICAgICAgcmV0dXJuIG5hdGl2ZVNwbGl0LmNhbGwoc3RyaW5nLCBzZXBhcmF0b3IsIGxpbSk7XG4gICAgICB9XG4gICAgICB2YXIgb3V0cHV0ID0gW107XG4gICAgICB2YXIgZmxhZ3MgPSAoc2VwYXJhdG9yLmlnbm9yZUNhc2UgPyAnaScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHNlcGFyYXRvci5tdWx0aWxpbmUgPyAnbScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHNlcGFyYXRvci51bmljb2RlID8gJ3UnIDogJycpICtcbiAgICAgICAgICAgICAgICAgIChzZXBhcmF0b3Iuc3RpY2t5ID8gJ3knIDogJycpO1xuICAgICAgdmFyIGxhc3RMYXN0SW5kZXggPSAwO1xuICAgICAgLy8gTWFrZSBgZ2xvYmFsYCBhbmQgYXZvaWQgYGxhc3RJbmRleGAgaXNzdWVzIGJ5IHdvcmtpbmcgd2l0aCBhIGNvcHlcbiAgICAgIHZhciBzZXBhcmF0b3JDb3B5ID0gbmV3IFJlZ0V4cChzZXBhcmF0b3Iuc291cmNlLCBmbGFncyArICdnJyk7XG4gICAgICB2YXIgbWF0Y2gsIGxhc3RJbmRleCwgbGFzdExlbmd0aDtcbiAgICAgIHdoaWxlIChtYXRjaCA9IHJlZ2V4cEV4ZWMuY2FsbChzZXBhcmF0b3JDb3B5LCBzdHJpbmcpKSB7XG4gICAgICAgIGxhc3RJbmRleCA9IHNlcGFyYXRvckNvcHkubGFzdEluZGV4O1xuICAgICAgICBpZiAobGFzdEluZGV4ID4gbGFzdExhc3RJbmRleCkge1xuICAgICAgICAgIG91dHB1dC5wdXNoKHN0cmluZy5zbGljZShsYXN0TGFzdEluZGV4LCBtYXRjaC5pbmRleCkpO1xuICAgICAgICAgIGlmIChtYXRjaC5sZW5ndGggPiAxICYmIG1hdGNoLmluZGV4IDwgc3RyaW5nLmxlbmd0aCkgYXJyYXlQdXNoLmFwcGx5KG91dHB1dCwgbWF0Y2guc2xpY2UoMSkpO1xuICAgICAgICAgIGxhc3RMZW5ndGggPSBtYXRjaFswXS5sZW5ndGg7XG4gICAgICAgICAgbGFzdExhc3RJbmRleCA9IGxhc3RJbmRleDtcbiAgICAgICAgICBpZiAob3V0cHV0Lmxlbmd0aCA+PSBsaW0pIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZXBhcmF0b3JDb3B5Lmxhc3RJbmRleCA9PT0gbWF0Y2guaW5kZXgpIHNlcGFyYXRvckNvcHkubGFzdEluZGV4Kys7IC8vIEF2b2lkIGFuIGluZmluaXRlIGxvb3BcbiAgICAgIH1cbiAgICAgIGlmIChsYXN0TGFzdEluZGV4ID09PSBzdHJpbmcubGVuZ3RoKSB7XG4gICAgICAgIGlmIChsYXN0TGVuZ3RoIHx8ICFzZXBhcmF0b3JDb3B5LnRlc3QoJycpKSBvdXRwdXQucHVzaCgnJyk7XG4gICAgICB9IGVsc2Ugb3V0cHV0LnB1c2goc3RyaW5nLnNsaWNlKGxhc3RMYXN0SW5kZXgpKTtcbiAgICAgIHJldHVybiBvdXRwdXQubGVuZ3RoID4gbGltID8gb3V0cHV0LnNsaWNlKDAsIGxpbSkgOiBvdXRwdXQ7XG4gICAgfTtcbiAgLy8gQ2hha3JhLCBWOFxuICB9IGVsc2UgaWYgKCcwJy5zcGxpdCh1bmRlZmluZWQsIDApLmxlbmd0aCkge1xuICAgIGludGVybmFsU3BsaXQgPSBmdW5jdGlvbiAoc2VwYXJhdG9yLCBsaW1pdCkge1xuICAgICAgcmV0dXJuIHNlcGFyYXRvciA9PT0gdW5kZWZpbmVkICYmIGxpbWl0ID09PSAwID8gW10gOiBuYXRpdmVTcGxpdC5jYWxsKHRoaXMsIHNlcGFyYXRvciwgbGltaXQpO1xuICAgIH07XG4gIH0gZWxzZSBpbnRlcm5hbFNwbGl0ID0gbmF0aXZlU3BsaXQ7XG5cbiAgcmV0dXJuIFtcbiAgICAvLyBgU3RyaW5nLnByb3RvdHlwZS5zcGxpdGAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnNwbGl0XG4gICAgZnVuY3Rpb24gc3BsaXQoc2VwYXJhdG9yLCBsaW1pdCkge1xuICAgICAgdmFyIE8gPSByZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpO1xuICAgICAgdmFyIHNwbGl0dGVyID0gc2VwYXJhdG9yID09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHNlcGFyYXRvcltTUExJVF07XG4gICAgICByZXR1cm4gc3BsaXR0ZXIgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHNwbGl0dGVyLmNhbGwoc2VwYXJhdG9yLCBPLCBsaW1pdClcbiAgICAgICAgOiBpbnRlcm5hbFNwbGl0LmNhbGwoU3RyaW5nKE8pLCBzZXBhcmF0b3IsIGxpbWl0KTtcbiAgICB9LFxuICAgIC8vIGBSZWdFeHAucHJvdG90eXBlW0BAc3BsaXRdYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXJlZ2V4cC5wcm90b3R5cGUtQEBzcGxpdFxuICAgIC8vXG4gICAgLy8gTk9URTogVGhpcyBjYW5ub3QgYmUgcHJvcGVybHkgcG9seWZpbGxlZCBpbiBlbmdpbmVzIHRoYXQgZG9uJ3Qgc3VwcG9ydFxuICAgIC8vIHRoZSAneScgZmxhZy5cbiAgICBmdW5jdGlvbiAocmVnZXhwLCBsaW1pdCkge1xuICAgICAgdmFyIHJlcyA9IG1heWJlQ2FsbE5hdGl2ZShpbnRlcm5hbFNwbGl0LCByZWdleHAsIHRoaXMsIGxpbWl0LCBpbnRlcm5hbFNwbGl0ICE9PSBuYXRpdmVTcGxpdCk7XG4gICAgICBpZiAocmVzLmRvbmUpIHJldHVybiByZXMudmFsdWU7XG5cbiAgICAgIHZhciByeCA9IGFuT2JqZWN0KHJlZ2V4cCk7XG4gICAgICB2YXIgUyA9IFN0cmluZyh0aGlzKTtcbiAgICAgIHZhciBDID0gc3BlY2llc0NvbnN0cnVjdG9yKHJ4LCBSZWdFeHApO1xuXG4gICAgICB2YXIgdW5pY29kZU1hdGNoaW5nID0gcngudW5pY29kZTtcbiAgICAgIHZhciBmbGFncyA9IChyeC5pZ25vcmVDYXNlID8gJ2knIDogJycpICtcbiAgICAgICAgICAgICAgICAgIChyeC5tdWx0aWxpbmUgPyAnbScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHJ4LnVuaWNvZGUgPyAndScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKFNVUFBPUlRTX1kgPyAneScgOiAnZycpO1xuXG4gICAgICAvLyBeKD8gKyByeCArICkgaXMgbmVlZGVkLCBpbiBjb21iaW5hdGlvbiB3aXRoIHNvbWUgUyBzbGljaW5nLCB0b1xuICAgICAgLy8gc2ltdWxhdGUgdGhlICd5JyBmbGFnLlxuICAgICAgdmFyIHNwbGl0dGVyID0gbmV3IEMoU1VQUE9SVFNfWSA/IHJ4IDogJ14oPzonICsgcnguc291cmNlICsgJyknLCBmbGFncyk7XG4gICAgICB2YXIgbGltID0gbGltaXQgPT09IHVuZGVmaW5lZCA/IE1BWF9VSU5UMzIgOiBsaW1pdCA+Pj4gMDtcbiAgICAgIGlmIChsaW0gPT09IDApIHJldHVybiBbXTtcbiAgICAgIGlmIChTLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGNhbGxSZWdFeHBFeGVjKHNwbGl0dGVyLCBTKSA9PT0gbnVsbCA/IFtTXSA6IFtdO1xuICAgICAgdmFyIHAgPSAwO1xuICAgICAgdmFyIHEgPSAwO1xuICAgICAgdmFyIEEgPSBbXTtcbiAgICAgIHdoaWxlIChxIDwgUy5sZW5ndGgpIHtcbiAgICAgICAgc3BsaXR0ZXIubGFzdEluZGV4ID0gU1VQUE9SVFNfWSA/IHEgOiAwO1xuICAgICAgICB2YXIgeiA9IGNhbGxSZWdFeHBFeGVjKHNwbGl0dGVyLCBTVVBQT1JUU19ZID8gUyA6IFMuc2xpY2UocSkpO1xuICAgICAgICB2YXIgZTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHogPT09IG51bGwgfHxcbiAgICAgICAgICAoZSA9IG1pbih0b0xlbmd0aChzcGxpdHRlci5sYXN0SW5kZXggKyAoU1VQUE9SVFNfWSA/IDAgOiBxKSksIFMubGVuZ3RoKSkgPT09IHBcbiAgICAgICAgKSB7XG4gICAgICAgICAgcSA9IGFkdmFuY2VTdHJpbmdJbmRleChTLCBxLCB1bmljb2RlTWF0Y2hpbmcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIEEucHVzaChTLnNsaWNlKHAsIHEpKTtcbiAgICAgICAgICBpZiAoQS5sZW5ndGggPT09IGxpbSkgcmV0dXJuIEE7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPD0gei5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgIEEucHVzaCh6W2ldKTtcbiAgICAgICAgICAgIGlmIChBLmxlbmd0aCA9PT0gbGltKSByZXR1cm4gQTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcSA9IHAgPSBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBBLnB1c2goUy5zbGljZShwKSk7XG4gICAgICByZXR1cm4gQTtcbiAgICB9XG4gIF07XG59LCAhU1VQUE9SVFNfWSk7XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDMyMTA6XG4vKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxMDkpO1xudmFyICR0cmltID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMTExKS50cmltO1xudmFyIGZvcmNlZFN0cmluZ1RyaW1NZXRob2QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYwOTEpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS50cmltYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS50cmltXG4kKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogZm9yY2VkU3RyaW5nVHJpbU1ldGhvZCgndHJpbScpIH0sIHtcbiAgdHJpbTogZnVuY3Rpb24gdHJpbSgpIHtcbiAgICByZXR1cm4gJHRyaW0odGhpcyk7XG4gIH1cbn0pO1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyAyOTkwOlxuLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBBcnJheUJ1ZmZlclZpZXdDb3JlID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNjApO1xudmFyICRjb3B5V2l0aGluID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMDQ4KTtcblxudmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTtcbnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kO1xuXG4vLyBgJVR5cGVkQXJyYXklLnByb3RvdHlwZS5jb3B5V2l0aGluYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS5jb3B5d2l0aGluXG5leHBvcnRUeXBlZEFycmF5TWV0aG9kKCdjb3B5V2l0aGluJywgZnVuY3Rpb24gY29weVdpdGhpbih0YXJnZXQsIHN0YXJ0IC8qICwgZW5kICovKSB7XG4gIHJldHVybiAkY29weVdpdGhpbi5jYWxsKGFUeXBlZEFycmF5KHRoaXMpLCB0YXJnZXQsIHN0YXJ0LCBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZCk7XG59KTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gODkyNzpcbi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG52YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oMjYwKTtcbnZhciAkZXZlcnkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwOTIpLmV2ZXJ5O1xuXG52YXIgYVR5cGVkQXJyYXkgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5O1xudmFyIGV4cG9ydFR5cGVkQXJyYXlNZXRob2QgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmV4cG9ydFR5cGVkQXJyYXlNZXRob2Q7XG5cbi8vIGAlVHlwZWRBcnJheSUucHJvdG90eXBlLmV2ZXJ5YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS5ldmVyeVxuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnZXZlcnknLCBmdW5jdGlvbiBldmVyeShjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICByZXR1cm4gJGV2ZXJ5KGFUeXBlZEFycmF5KHRoaXMpLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG59KTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gMzEwNTpcbi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG52YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oMjYwKTtcbnZhciAkZmlsbCA9IF9fd2VicGFja19yZXF1aXJlX18oMTI4NSk7XG5cbnZhciBhVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXk7XG52YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IEFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDtcblxuLy8gYCVUeXBlZEFycmF5JS5wcm90b3R5cGUuZmlsbGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUuZmlsbFxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzIC0tIHJlcXVpcmVkIGZvciBgLmxlbmd0aGBcbmV4cG9ydFR5cGVkQXJyYXlNZXRob2QoJ2ZpbGwnLCBmdW5jdGlvbiBmaWxsKHZhbHVlIC8qICwgc3RhcnQsIGVuZCAqLykge1xuICByZXR1cm4gJGZpbGwuYXBwbHkoYVR5cGVkQXJyYXkodGhpcyksIGFyZ3VtZW50cyk7XG59KTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gNTAzNTpcbi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG52YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oMjYwKTtcbnZhciAkZmlsdGVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMDkyKS5maWx0ZXI7XG52YXIgZnJvbVNwZWNpZXNBbmRMaXN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMDc0KTtcblxudmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTtcbnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kO1xuXG4vLyBgJVR5cGVkQXJyYXklLnByb3RvdHlwZS5maWx0ZXJgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy0ldHlwZWRhcnJheSUucHJvdG90eXBlLmZpbHRlclxuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnZmlsdGVyJywgZnVuY3Rpb24gZmlsdGVyKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gIHZhciBsaXN0ID0gJGZpbHRlcihhVHlwZWRBcnJheSh0aGlzKSwgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICByZXR1cm4gZnJvbVNwZWNpZXNBbmRMaXN0KHRoaXMsIGxpc3QpO1xufSk7XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDcxNzQ6XG4vKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxudmFyIEFycmF5QnVmZmVyVmlld0NvcmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI2MCk7XG52YXIgJGZpbmRJbmRleCA9IF9fd2VicGFja19yZXF1aXJlX18oMjA5MikuZmluZEluZGV4O1xuXG52YXIgYVR5cGVkQXJyYXkgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5O1xudmFyIGV4cG9ydFR5cGVkQXJyYXlNZXRob2QgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmV4cG9ydFR5cGVkQXJyYXlNZXRob2Q7XG5cbi8vIGAlVHlwZWRBcnJheSUucHJvdG90eXBlLmZpbmRJbmRleGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUuZmluZGluZGV4XG5leHBvcnRUeXBlZEFycmF5TWV0aG9kKCdmaW5kSW5kZXgnLCBmdW5jdGlvbiBmaW5kSW5kZXgocHJlZGljYXRlIC8qICwgdGhpc0FyZyAqLykge1xuICByZXR1cm4gJGZpbmRJbmRleChhVHlwZWRBcnJheSh0aGlzKSwgcHJlZGljYXRlLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG59KTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gNDM0NTpcbi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG52YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oMjYwKTtcbnZhciAkZmluZCA9IF9fd2VicGFja19yZXF1aXJlX18oMjA5MikuZmluZDtcblxudmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTtcbnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kO1xuXG4vLyBgJVR5cGVkQXJyYXklLnByb3RvdHlwZS5maW5kYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS5maW5kXG5leHBvcnRUeXBlZEFycmF5TWV0aG9kKCdmaW5kJywgZnVuY3Rpb24gZmluZChwcmVkaWNhdGUgLyogLCB0aGlzQXJnICovKSB7XG4gIHJldHVybiAkZmluZChhVHlwZWRBcnJheSh0aGlzKSwgcHJlZGljYXRlLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG59KTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gMjg0Njpcbi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG52YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oMjYwKTtcbnZhciAkZm9yRWFjaCA9IF9fd2VicGFja19yZXF1aXJlX18oMjA5MikuZm9yRWFjaDtcblxudmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTtcbnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kO1xuXG4vLyBgJVR5cGVkQXJyYXklLnByb3RvdHlwZS5mb3JFYWNoYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS5mb3JlYWNoXG5leHBvcnRUeXBlZEFycmF5TWV0aG9kKCdmb3JFYWNoJywgZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICAkZm9yRWFjaChhVHlwZWRBcnJheSh0aGlzKSwgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xufSk7XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDQ3MzE6XG4vKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxudmFyIEFycmF5QnVmZmVyVmlld0NvcmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI2MCk7XG52YXIgJGluY2x1ZGVzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMzE4KS5pbmNsdWRlcztcblxudmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTtcbnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kO1xuXG4vLyBgJVR5cGVkQXJyYXklLnByb3RvdHlwZS5pbmNsdWRlc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUuaW5jbHVkZXNcbmV4cG9ydFR5cGVkQXJyYXlNZXRob2QoJ2luY2x1ZGVzJywgZnVuY3Rpb24gaW5jbHVkZXMoc2VhcmNoRWxlbWVudCAvKiAsIGZyb21JbmRleCAqLykge1xuICByZXR1cm4gJGluY2x1ZGVzKGFUeXBlZEFycmF5KHRoaXMpLCBzZWFyY2hFbGVtZW50LCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG59KTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gNzIwOTpcbi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG52YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oMjYwKTtcbnZhciAkaW5kZXhPZiA9IF9fd2VicGFja19yZXF1aXJlX18oMTMxOCkuaW5kZXhPZjtcblxudmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTtcbnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kO1xuXG4vLyBgJVR5cGVkQXJyYXklLnByb3RvdHlwZS5pbmRleE9mYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS5pbmRleG9mXG5leHBvcnRUeXBlZEFycmF5TWV0aG9kKCdpbmRleE9mJywgZnVuY3Rpb24gaW5kZXhPZihzZWFyY2hFbGVtZW50IC8qICwgZnJvbUluZGV4ICovKSB7XG4gIHJldHVybiAkaW5kZXhPZihhVHlwZWRBcnJheSh0aGlzKSwgc2VhcmNoRWxlbWVudCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xufSk7XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDYzMTk6XG4vKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxudmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oNzg1NCk7XG52YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oMjYwKTtcbnZhciBBcnJheUl0ZXJhdG9ycyA9IF9fd2VicGFja19yZXF1aXJlX18oNjk5Mik7XG52YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1MTEyKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIFVpbnQ4QXJyYXkgPSBnbG9iYWwuVWludDhBcnJheTtcbnZhciBhcnJheVZhbHVlcyA9IEFycmF5SXRlcmF0b3JzLnZhbHVlcztcbnZhciBhcnJheUtleXMgPSBBcnJheUl0ZXJhdG9ycy5rZXlzO1xudmFyIGFycmF5RW50cmllcyA9IEFycmF5SXRlcmF0b3JzLmVudHJpZXM7XG52YXIgYVR5cGVkQXJyYXkgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5O1xudmFyIGV4cG9ydFR5cGVkQXJyYXlNZXRob2QgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmV4cG9ydFR5cGVkQXJyYXlNZXRob2Q7XG52YXIgbmF0aXZlVHlwZWRBcnJheUl0ZXJhdG9yID0gVWludDhBcnJheSAmJiBVaW50OEFycmF5LnByb3RvdHlwZVtJVEVSQVRPUl07XG5cbnZhciBDT1JSRUNUX0lURVJfTkFNRSA9ICEhbmF0aXZlVHlwZWRBcnJheUl0ZXJhdG9yXG4gICYmIChuYXRpdmVUeXBlZEFycmF5SXRlcmF0b3IubmFtZSA9PSAndmFsdWVzJyB8fCBuYXRpdmVUeXBlZEFycmF5SXRlcmF0b3IubmFtZSA9PSB1bmRlZmluZWQpO1xuXG52YXIgdHlwZWRBcnJheVZhbHVlcyA9IGZ1bmN0aW9uIHZhbHVlcygpIHtcbiAgcmV0dXJuIGFycmF5VmFsdWVzLmNhbGwoYVR5cGVkQXJyYXkodGhpcykpO1xufTtcblxuLy8gYCVUeXBlZEFycmF5JS5wcm90b3R5cGUuZW50cmllc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUuZW50cmllc1xuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnZW50cmllcycsIGZ1bmN0aW9uIGVudHJpZXMoKSB7XG4gIHJldHVybiBhcnJheUVudHJpZXMuY2FsbChhVHlwZWRBcnJheSh0aGlzKSk7XG59KTtcbi8vIGAlVHlwZWRBcnJheSUucHJvdG90eXBlLmtleXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy0ldHlwZWRhcnJheSUucHJvdG90eXBlLmtleXNcbmV4cG9ydFR5cGVkQXJyYXlNZXRob2QoJ2tleXMnLCBmdW5jdGlvbiBrZXlzKCkge1xuICByZXR1cm4gYXJyYXlLZXlzLmNhbGwoYVR5cGVkQXJyYXkodGhpcykpO1xufSk7XG4vLyBgJVR5cGVkQXJyYXklLnByb3RvdHlwZS52YWx1ZXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy0ldHlwZWRhcnJheSUucHJvdG90eXBlLnZhbHVlc1xuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgndmFsdWVzJywgdHlwZWRBcnJheVZhbHVlcywgIUNPUlJFQ1RfSVRFUl9OQU1FKTtcbi8vIGAlVHlwZWRBcnJheSUucHJvdG90eXBlW0BAaXRlcmF0b3JdYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS1AQGl0ZXJhdG9yXG5leHBvcnRUeXBlZEFycmF5TWV0aG9kKElURVJBVE9SLCB0eXBlZEFycmF5VmFsdWVzLCAhQ09SUkVDVF9JVEVSX05BTUUpO1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA4ODY3OlxuLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBBcnJheUJ1ZmZlclZpZXdDb3JlID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNjApO1xuXG52YXIgYVR5cGVkQXJyYXkgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5O1xudmFyIGV4cG9ydFR5cGVkQXJyYXlNZXRob2QgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmV4cG9ydFR5cGVkQXJyYXlNZXRob2Q7XG52YXIgJGpvaW4gPSBbXS5qb2luO1xuXG4vLyBgJVR5cGVkQXJyYXklLnByb3RvdHlwZS5qb2luYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS5qb2luXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnMgLS0gcmVxdWlyZWQgZm9yIGAubGVuZ3RoYFxuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnam9pbicsIGZ1bmN0aW9uIGpvaW4oc2VwYXJhdG9yKSB7XG4gIHJldHVybiAkam9pbi5hcHBseShhVHlwZWRBcnJheSh0aGlzKSwgYXJndW1lbnRzKTtcbn0pO1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA3Nzg5OlxuLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBBcnJheUJ1ZmZlclZpZXdDb3JlID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNjApO1xudmFyICRsYXN0SW5kZXhPZiA9IF9fd2VicGFja19yZXF1aXJlX18oNjU4Myk7XG5cbnZhciBhVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXk7XG52YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IEFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDtcblxuLy8gYCVUeXBlZEFycmF5JS5wcm90b3R5cGUubGFzdEluZGV4T2ZgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy0ldHlwZWRhcnJheSUucHJvdG90eXBlLmxhc3RpbmRleG9mXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnMgLS0gcmVxdWlyZWQgZm9yIGAubGVuZ3RoYFxuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnbGFzdEluZGV4T2YnLCBmdW5jdGlvbiBsYXN0SW5kZXhPZihzZWFyY2hFbGVtZW50IC8qICwgZnJvbUluZGV4ICovKSB7XG4gIHJldHVybiAkbGFzdEluZGV4T2YuYXBwbHkoYVR5cGVkQXJyYXkodGhpcyksIGFyZ3VtZW50cyk7XG59KTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gMzczOTpcbi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG52YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oMjYwKTtcbnZhciAkbWFwID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMDkyKS5tYXA7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NzA3KTtcblxudmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTtcbnZhciBhVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheUNvbnN0cnVjdG9yO1xudmFyIGV4cG9ydFR5cGVkQXJyYXlNZXRob2QgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmV4cG9ydFR5cGVkQXJyYXlNZXRob2Q7XG5cbi8vIGAlVHlwZWRBcnJheSUucHJvdG90eXBlLm1hcGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUubWFwXG5leHBvcnRUeXBlZEFycmF5TWV0aG9kKCdtYXAnLCBmdW5jdGlvbiBtYXAobWFwZm4gLyogLCB0aGlzQXJnICovKSB7XG4gIHJldHVybiAkbWFwKGFUeXBlZEFycmF5KHRoaXMpLCBtYXBmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIGZ1bmN0aW9uIChPLCBsZW5ndGgpIHtcbiAgICByZXR1cm4gbmV3IChhVHlwZWRBcnJheUNvbnN0cnVjdG9yKHNwZWNpZXNDb25zdHJ1Y3RvcihPLCBPLmNvbnN0cnVjdG9yKSkpKGxlbmd0aCk7XG4gIH0pO1xufSk7XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDQ0ODM6XG4vKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxudmFyIEFycmF5QnVmZmVyVmlld0NvcmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI2MCk7XG52YXIgJHJlZHVjZVJpZ2h0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNjcxKS5yaWdodDtcblxudmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTtcbnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kO1xuXG4vLyBgJVR5cGVkQXJyYXklLnByb3RvdHlwZS5yZWR1Y2VSaWNodGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUucmVkdWNlcmlnaHRcbmV4cG9ydFR5cGVkQXJyYXlNZXRob2QoJ3JlZHVjZVJpZ2h0JywgZnVuY3Rpb24gcmVkdWNlUmlnaHQoY2FsbGJhY2tmbiAvKiAsIGluaXRpYWxWYWx1ZSAqLykge1xuICByZXR1cm4gJHJlZHVjZVJpZ2h0KGFUeXBlZEFycmF5KHRoaXMpLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG59KTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gOTM2ODpcbi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG52YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oMjYwKTtcbnZhciAkcmVkdWNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNjcxKS5sZWZ0O1xuXG52YXIgYVR5cGVkQXJyYXkgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5O1xudmFyIGV4cG9ydFR5cGVkQXJyYXlNZXRob2QgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmV4cG9ydFR5cGVkQXJyYXlNZXRob2Q7XG5cbi8vIGAlVHlwZWRBcnJheSUucHJvdG90eXBlLnJlZHVjZWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUucmVkdWNlXG5leHBvcnRUeXBlZEFycmF5TWV0aG9kKCdyZWR1Y2UnLCBmdW5jdGlvbiByZWR1Y2UoY2FsbGJhY2tmbiAvKiAsIGluaXRpYWxWYWx1ZSAqLykge1xuICByZXR1cm4gJHJlZHVjZShhVHlwZWRBcnJheSh0aGlzKSwgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xufSk7XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDIwNTY6XG4vKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxudmFyIEFycmF5QnVmZmVyVmlld0NvcmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI2MCk7XG5cbnZhciBhVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXk7XG52YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IEFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDtcbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG5cbi8vIGAlVHlwZWRBcnJheSUucHJvdG90eXBlLnJldmVyc2VgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy0ldHlwZWRhcnJheSUucHJvdG90eXBlLnJldmVyc2VcbmV4cG9ydFR5cGVkQXJyYXlNZXRob2QoJ3JldmVyc2UnLCBmdW5jdGlvbiByZXZlcnNlKCkge1xuICB2YXIgdGhhdCA9IHRoaXM7XG4gIHZhciBsZW5ndGggPSBhVHlwZWRBcnJheSh0aGF0KS5sZW5ndGg7XG4gIHZhciBtaWRkbGUgPSBmbG9vcihsZW5ndGggLyAyKTtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIHZhbHVlO1xuICB3aGlsZSAoaW5kZXggPCBtaWRkbGUpIHtcbiAgICB2YWx1ZSA9IHRoYXRbaW5kZXhdO1xuICAgIHRoYXRbaW5kZXgrK10gPSB0aGF0Wy0tbGVuZ3RoXTtcbiAgICB0aGF0W2xlbmd0aF0gPSB2YWx1ZTtcbiAgfSByZXR1cm4gdGhhdDtcbn0pO1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyAzNDYyOlxuLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBBcnJheUJ1ZmZlclZpZXdDb3JlID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNjApO1xudmFyIHRvTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NDY2KTtcbnZhciB0b09mZnNldCA9IF9fd2VicGFja19yZXF1aXJlX18oNDU5MCk7XG52YXIgdG9PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5MDgpO1xudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3MjkzKTtcblxudmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTtcbnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kO1xuXG52YXIgRk9SQ0VEID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvKiBnbG9iYWwgSW50OEFycmF5IC0tIHNhZmUgKi9cbiAgbmV3IEludDhBcnJheSgxKS5zZXQoe30pO1xufSk7XG5cbi8vIGAlVHlwZWRBcnJheSUucHJvdG90eXBlLnNldGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUuc2V0XG5leHBvcnRUeXBlZEFycmF5TWV0aG9kKCdzZXQnLCBmdW5jdGlvbiBzZXQoYXJyYXlMaWtlIC8qICwgb2Zmc2V0ICovKSB7XG4gIGFUeXBlZEFycmF5KHRoaXMpO1xuICB2YXIgb2Zmc2V0ID0gdG9PZmZzZXQoYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIDEpO1xuICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGg7XG4gIHZhciBzcmMgPSB0b09iamVjdChhcnJheUxpa2UpO1xuICB2YXIgbGVuID0gdG9MZW5ndGgoc3JjLmxlbmd0aCk7XG4gIHZhciBpbmRleCA9IDA7XG4gIGlmIChsZW4gKyBvZmZzZXQgPiBsZW5ndGgpIHRocm93IFJhbmdlRXJyb3IoJ1dyb25nIGxlbmd0aCcpO1xuICB3aGlsZSAoaW5kZXggPCBsZW4pIHRoaXNbb2Zmc2V0ICsgaW5kZXhdID0gc3JjW2luZGV4KytdO1xufSwgRk9SQ0VEKTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gNjc4OlxuLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBBcnJheUJ1ZmZlclZpZXdDb3JlID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNjApO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IF9fd2VicGFja19yZXF1aXJlX18oNjcwNyk7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcyOTMpO1xuXG52YXIgYVR5cGVkQXJyYXkgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5O1xudmFyIGFUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5Q29uc3RydWN0b3I7XG52YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IEFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDtcbnZhciAkc2xpY2UgPSBbXS5zbGljZTtcblxudmFyIEZPUkNFRCA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLyogZ2xvYmFsIEludDhBcnJheSAtLSBzYWZlICovXG4gIG5ldyBJbnQ4QXJyYXkoMSkuc2xpY2UoKTtcbn0pO1xuXG4vLyBgJVR5cGVkQXJyYXklLnByb3RvdHlwZS5zbGljZWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUuc2xpY2VcbmV4cG9ydFR5cGVkQXJyYXlNZXRob2QoJ3NsaWNlJywgZnVuY3Rpb24gc2xpY2Uoc3RhcnQsIGVuZCkge1xuICB2YXIgbGlzdCA9ICRzbGljZS5jYWxsKGFUeXBlZEFycmF5KHRoaXMpLCBzdGFydCwgZW5kKTtcbiAgdmFyIEMgPSBzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBsZW5ndGggPSBsaXN0Lmxlbmd0aDtcbiAgdmFyIHJlc3VsdCA9IG5ldyAoYVR5cGVkQXJyYXlDb25zdHJ1Y3RvcihDKSkobGVuZ3RoKTtcbiAgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSByZXN1bHRbaW5kZXhdID0gbGlzdFtpbmRleCsrXTtcbiAgcmV0dXJuIHJlc3VsdDtcbn0sIEZPUkNFRCk7XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDc0NjI6XG4vKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxudmFyIEFycmF5QnVmZmVyVmlld0NvcmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI2MCk7XG52YXIgJHNvbWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwOTIpLnNvbWU7XG5cbnZhciBhVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXk7XG52YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IEFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDtcblxuLy8gYCVUeXBlZEFycmF5JS5wcm90b3R5cGUuc29tZWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUuc29tZVxuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnc29tZScsIGZ1bmN0aW9uIHNvbWUoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgcmV0dXJuICRzb21lKGFUeXBlZEFycmF5KHRoaXMpLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG59KTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gMzgyNDpcbi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG52YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oMjYwKTtcblxudmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTtcbnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kO1xudmFyICRzb3J0ID0gW10uc29ydDtcblxuLy8gYCVUeXBlZEFycmF5JS5wcm90b3R5cGUuc29ydGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUuc29ydFxuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnc29ydCcsIGZ1bmN0aW9uIHNvcnQoY29tcGFyZWZuKSB7XG4gIHJldHVybiAkc29ydC5jYWxsKGFUeXBlZEFycmF5KHRoaXMpLCBjb21wYXJlZm4pO1xufSk7XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDUwMjE6XG4vKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxudmFyIEFycmF5QnVmZmVyVmlld0NvcmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI2MCk7XG52YXIgdG9MZW5ndGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc0NjYpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IF9fd2VicGFja19yZXF1aXJlX18oMTQwMCk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NzA3KTtcblxudmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTtcbnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kO1xuXG4vLyBgJVR5cGVkQXJyYXklLnByb3RvdHlwZS5zdWJhcnJheWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUuc3ViYXJyYXlcbmV4cG9ydFR5cGVkQXJyYXlNZXRob2QoJ3N1YmFycmF5JywgZnVuY3Rpb24gc3ViYXJyYXkoYmVnaW4sIGVuZCkge1xuICB2YXIgTyA9IGFUeXBlZEFycmF5KHRoaXMpO1xuICB2YXIgbGVuZ3RoID0gTy5sZW5ndGg7XG4gIHZhciBiZWdpbkluZGV4ID0gdG9BYnNvbHV0ZUluZGV4KGJlZ2luLCBsZW5ndGgpO1xuICByZXR1cm4gbmV3IChzcGVjaWVzQ29uc3RydWN0b3IoTywgTy5jb25zdHJ1Y3RvcikpKFxuICAgIE8uYnVmZmVyLFxuICAgIE8uYnl0ZU9mZnNldCArIGJlZ2luSW5kZXggKiBPLkJZVEVTX1BFUl9FTEVNRU5ULFxuICAgIHRvTGVuZ3RoKChlbmQgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IHRvQWJzb2x1dGVJbmRleChlbmQsIGxlbmd0aCkpIC0gYmVnaW5JbmRleClcbiAgKTtcbn0pO1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyAyOTc0OlxuLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4NTQpO1xudmFyIEFycmF5QnVmZmVyVmlld0NvcmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI2MCk7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcyOTMpO1xuXG52YXIgSW50OEFycmF5ID0gZ2xvYmFsLkludDhBcnJheTtcbnZhciBhVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXk7XG52YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IEFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDtcbnZhciAkdG9Mb2NhbGVTdHJpbmcgPSBbXS50b0xvY2FsZVN0cmluZztcbnZhciAkc2xpY2UgPSBbXS5zbGljZTtcblxuLy8gaU9TIFNhZmFyaSA2LnggZmFpbHMgaGVyZVxudmFyIFRPX0xPQ0FMRV9TVFJJTkdfQlVHID0gISFJbnQ4QXJyYXkgJiYgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAkdG9Mb2NhbGVTdHJpbmcuY2FsbChuZXcgSW50OEFycmF5KDEpKTtcbn0pO1xuXG52YXIgRk9SQ0VEID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gWzEsIDJdLnRvTG9jYWxlU3RyaW5nKCkgIT0gbmV3IEludDhBcnJheShbMSwgMl0pLnRvTG9jYWxlU3RyaW5nKCk7XG59KSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICBJbnQ4QXJyYXkucHJvdG90eXBlLnRvTG9jYWxlU3RyaW5nLmNhbGwoWzEsIDJdKTtcbn0pO1xuXG4vLyBgJVR5cGVkQXJyYXklLnByb3RvdHlwZS50b0xvY2FsZVN0cmluZ2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUudG9sb2NhbGVzdHJpbmdcbmV4cG9ydFR5cGVkQXJyYXlNZXRob2QoJ3RvTG9jYWxlU3RyaW5nJywgZnVuY3Rpb24gdG9Mb2NhbGVTdHJpbmcoKSB7XG4gIHJldHVybiAkdG9Mb2NhbGVTdHJpbmcuYXBwbHkoVE9fTE9DQUxFX1NUUklOR19CVUcgPyAkc2xpY2UuY2FsbChhVHlwZWRBcnJheSh0aGlzKSkgOiBhVHlwZWRBcnJheSh0aGlzKSwgYXJndW1lbnRzKTtcbn0sIEZPUkNFRCk7XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDUwMTY6XG4vKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxudmFyIGV4cG9ydFR5cGVkQXJyYXlNZXRob2QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI2MCkuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDtcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNzI5Myk7XG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3ODU0KTtcblxudmFyIFVpbnQ4QXJyYXkgPSBnbG9iYWwuVWludDhBcnJheTtcbnZhciBVaW50OEFycmF5UHJvdG90eXBlID0gVWludDhBcnJheSAmJiBVaW50OEFycmF5LnByb3RvdHlwZSB8fCB7fTtcbnZhciBhcnJheVRvU3RyaW5nID0gW10udG9TdHJpbmc7XG52YXIgYXJyYXlKb2luID0gW10uam9pbjtcblxuaWYgKGZhaWxzKGZ1bmN0aW9uICgpIHsgYXJyYXlUb1N0cmluZy5jYWxsKHt9KTsgfSkpIHtcbiAgYXJyYXlUb1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiBhcnJheUpvaW4uY2FsbCh0aGlzKTtcbiAgfTtcbn1cblxudmFyIElTX05PVF9BUlJBWV9NRVRIT0QgPSBVaW50OEFycmF5UHJvdG90eXBlLnRvU3RyaW5nICE9IGFycmF5VG9TdHJpbmc7XG5cbi8vIGAlVHlwZWRBcnJheSUucHJvdG90eXBlLnRvU3RyaW5nYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS50b3N0cmluZ1xuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgndG9TdHJpbmcnLCBhcnJheVRvU3RyaW5nLCBJU19OT1RfQVJSQVlfTUVUSE9EKTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gMjQ3Mjpcbi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBjcmVhdGVUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk4NDMpO1xuXG4vLyBgVWludDhBcnJheWAgY29uc3RydWN0b3Jcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtdHlwZWRhcnJheS1vYmplY3RzXG5jcmVhdGVUeXBlZEFycmF5Q29uc3RydWN0b3IoJ1VpbnQ4JywgZnVuY3Rpb24gKGluaXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIFVpbnQ4QXJyYXkoZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIGluaXQodGhpcywgZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKTtcbiAgfTtcbn0pO1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA0NzQ3OlxuLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oNzg1NCk7XG52YXIgRE9NSXRlcmFibGVzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MzI0KTtcbnZhciBmb3JFYWNoID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NTMzKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg4ODApO1xuXG5mb3IgKHZhciBDT0xMRUNUSU9OX05BTUUgaW4gRE9NSXRlcmFibGVzKSB7XG4gIHZhciBDb2xsZWN0aW9uID0gZ2xvYmFsW0NPTExFQ1RJT05fTkFNRV07XG4gIHZhciBDb2xsZWN0aW9uUHJvdG90eXBlID0gQ29sbGVjdGlvbiAmJiBDb2xsZWN0aW9uLnByb3RvdHlwZTtcbiAgLy8gc29tZSBDaHJvbWUgdmVyc2lvbnMgaGF2ZSBub24tY29uZmlndXJhYmxlIG1ldGhvZHMgb24gRE9NVG9rZW5MaXN0XG4gIGlmIChDb2xsZWN0aW9uUHJvdG90eXBlICYmIENvbGxlY3Rpb25Qcm90b3R5cGUuZm9yRWFjaCAhPT0gZm9yRWFjaCkgdHJ5IHtcbiAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoQ29sbGVjdGlvblByb3RvdHlwZSwgJ2ZvckVhY2gnLCBmb3JFYWNoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBDb2xsZWN0aW9uUHJvdG90eXBlLmZvckVhY2ggPSBmb3JFYWNoO1xuICB9XG59XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDM5NDg6XG4vKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3ODU0KTtcbnZhciBET01JdGVyYWJsZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgzMjQpO1xudmFyIEFycmF5SXRlcmF0b3JNZXRob2RzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2OTkyKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg4ODApO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oNTExMik7XG5cbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpO1xudmFyIEFycmF5VmFsdWVzID0gQXJyYXlJdGVyYXRvck1ldGhvZHMudmFsdWVzO1xuXG5mb3IgKHZhciBDT0xMRUNUSU9OX05BTUUgaW4gRE9NSXRlcmFibGVzKSB7XG4gIHZhciBDb2xsZWN0aW9uID0gZ2xvYmFsW0NPTExFQ1RJT05fTkFNRV07XG4gIHZhciBDb2xsZWN0aW9uUHJvdG90eXBlID0gQ29sbGVjdGlvbiAmJiBDb2xsZWN0aW9uLnByb3RvdHlwZTtcbiAgaWYgKENvbGxlY3Rpb25Qcm90b3R5cGUpIHtcbiAgICAvLyBzb21lIENocm9tZSB2ZXJzaW9ucyBoYXZlIG5vbi1jb25maWd1cmFibGUgbWV0aG9kcyBvbiBET01Ub2tlbkxpc3RcbiAgICBpZiAoQ29sbGVjdGlvblByb3RvdHlwZVtJVEVSQVRPUl0gIT09IEFycmF5VmFsdWVzKSB0cnkge1xuICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KENvbGxlY3Rpb25Qcm90b3R5cGUsIElURVJBVE9SLCBBcnJheVZhbHVlcyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIENvbGxlY3Rpb25Qcm90b3R5cGVbSVRFUkFUT1JdID0gQXJyYXlWYWx1ZXM7XG4gICAgfVxuICAgIGlmICghQ29sbGVjdGlvblByb3RvdHlwZVtUT19TVFJJTkdfVEFHXSkge1xuICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KENvbGxlY3Rpb25Qcm90b3R5cGUsIFRPX1NUUklOR19UQUcsIENPTExFQ1RJT05fTkFNRSk7XG4gICAgfVxuICAgIGlmIChET01JdGVyYWJsZXNbQ09MTEVDVElPTl9OQU1FXSkgZm9yICh2YXIgTUVUSE9EX05BTUUgaW4gQXJyYXlJdGVyYXRvck1ldGhvZHMpIHtcbiAgICAgIC8vIHNvbWUgQ2hyb21lIHZlcnNpb25zIGhhdmUgbm9uLWNvbmZpZ3VyYWJsZSBtZXRob2RzIG9uIERPTVRva2VuTGlzdFxuICAgICAgaWYgKENvbGxlY3Rpb25Qcm90b3R5cGVbTUVUSE9EX05BTUVdICE9PSBBcnJheUl0ZXJhdG9yTWV0aG9kc1tNRVRIT0RfTkFNRV0pIHRyeSB7XG4gICAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShDb2xsZWN0aW9uUHJvdG90eXBlLCBNRVRIT0RfTkFNRSwgQXJyYXlJdGVyYXRvck1ldGhvZHNbTUVUSE9EX05BTUVdKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIENvbGxlY3Rpb25Qcm90b3R5cGVbTUVUSE9EX05BTUVdID0gQXJyYXlJdGVyYXRvck1ldGhvZHNbTUVUSE9EX05BTUVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5cbi8qKiovIH0pLFxuXG4vKioqLyAxNjM3OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG4vLyBUT0RPOiBpbiBjb3JlLWpzQDQsIG1vdmUgL21vZHVsZXMvIGRlcGVuZGVuY2llcyB0byBwdWJsaWMgZW50cmllcyBmb3IgYmV0dGVyIG9wdGltaXphdGlvbiBieSB0b29scyBsaWtlIGBwcmVzZXQtZW52YFxuX193ZWJwYWNrX3JlcXVpcmVfXyg2OTkyKTtcbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMTA5KTtcbnZhciBnZXRCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1MDA1KTtcbnZhciBVU0VfTkFUSVZFX1VSTCA9IF9fd2VicGFja19yZXF1aXJlX18oNTkwKTtcbnZhciByZWRlZmluZSA9IF9fd2VicGFja19yZXF1aXJlX18oMTMyMCk7XG52YXIgcmVkZWZpbmVBbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIyNDgpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MDAzKTtcbnZhciBjcmVhdGVJdGVyYXRvckNvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0OTk0KTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5OTA5KTtcbnZhciBhbkluc3RhbmNlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1Nzg3KTtcbnZhciBoYXNPd24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY2NTYpO1xudmFyIGJpbmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk5NzQpO1xudmFyIGNsYXNzb2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY0OCk7XG52YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk2NzApO1xudmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMTEpO1xudmFyIGNyZWF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oMzApO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IF9fd2VicGFja19yZXF1aXJlX18oOTExNCk7XG52YXIgZ2V0SXRlcmF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg1NTQpO1xudmFyIGdldEl0ZXJhdG9yTWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMjQ2KTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUxMTIpO1xuXG52YXIgJGZldGNoID0gZ2V0QnVpbHRJbignZmV0Y2gnKTtcbnZhciBIZWFkZXJzID0gZ2V0QnVpbHRJbignSGVhZGVycycpO1xudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIFVSTF9TRUFSQ0hfUEFSQU1TID0gJ1VSTFNlYXJjaFBhcmFtcyc7XG52YXIgVVJMX1NFQVJDSF9QQVJBTVNfSVRFUkFUT1IgPSBVUkxfU0VBUkNIX1BBUkFNUyArICdJdGVyYXRvcic7XG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGdldEludGVybmFsUGFyYW1zU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihVUkxfU0VBUkNIX1BBUkFNUyk7XG52YXIgZ2V0SW50ZXJuYWxJdGVyYXRvclN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3IoVVJMX1NFQVJDSF9QQVJBTVNfSVRFUkFUT1IpO1xuXG52YXIgcGx1cyA9IC9cXCsvZztcbnZhciBzZXF1ZW5jZXMgPSBBcnJheSg0KTtcblxudmFyIHBlcmNlbnRTZXF1ZW5jZSA9IGZ1bmN0aW9uIChieXRlcykge1xuICByZXR1cm4gc2VxdWVuY2VzW2J5dGVzIC0gMV0gfHwgKHNlcXVlbmNlc1tieXRlcyAtIDFdID0gUmVnRXhwKCcoKD86JVtcXFxcZGEtZl17Mn0peycgKyBieXRlcyArICd9KScsICdnaScpKTtcbn07XG5cbnZhciBwZXJjZW50RGVjb2RlID0gZnVuY3Rpb24gKHNlcXVlbmNlKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChzZXF1ZW5jZSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHNlcXVlbmNlO1xuICB9XG59O1xuXG52YXIgZGVzZXJpYWxpemUgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIHJlc3VsdCA9IGl0LnJlcGxhY2UocGx1cywgJyAnKTtcbiAgdmFyIGJ5dGVzID0gNDtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHJlc3VsdCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgd2hpbGUgKGJ5dGVzKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZShwZXJjZW50U2VxdWVuY2UoYnl0ZXMtLSksIHBlcmNlbnREZWNvZGUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59O1xuXG52YXIgZmluZCA9IC9bIScoKX5dfCUyMC9nO1xuXG52YXIgcmVwbGFjZSA9IHtcbiAgJyEnOiAnJTIxJyxcbiAgXCInXCI6ICclMjcnLFxuICAnKCc6ICclMjgnLFxuICAnKSc6ICclMjknLFxuICAnfic6ICclN0UnLFxuICAnJTIwJzogJysnXG59O1xuXG52YXIgcmVwbGFjZXIgPSBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgcmV0dXJuIHJlcGxhY2VbbWF0Y2hdO1xufTtcblxudmFyIHNlcmlhbGl6ZSA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGl0KS5yZXBsYWNlKGZpbmQsIHJlcGxhY2VyKTtcbn07XG5cbnZhciBwYXJzZVNlYXJjaFBhcmFtcyA9IGZ1bmN0aW9uIChyZXN1bHQsIHF1ZXJ5KSB7XG4gIGlmIChxdWVyeSkge1xuICAgIHZhciBhdHRyaWJ1dGVzID0gcXVlcnkuc3BsaXQoJyYnKTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciBhdHRyaWJ1dGUsIGVudHJ5O1xuICAgIHdoaWxlIChpbmRleCA8IGF0dHJpYnV0ZXMubGVuZ3RoKSB7XG4gICAgICBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzW2luZGV4KytdO1xuICAgICAgaWYgKGF0dHJpYnV0ZS5sZW5ndGgpIHtcbiAgICAgICAgZW50cnkgPSBhdHRyaWJ1dGUuc3BsaXQoJz0nKTtcbiAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgIGtleTogZGVzZXJpYWxpemUoZW50cnkuc2hpZnQoKSksXG4gICAgICAgICAgdmFsdWU6IGRlc2VyaWFsaXplKGVudHJ5LmpvaW4oJz0nKSlcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG52YXIgdXBkYXRlU2VhcmNoUGFyYW1zID0gZnVuY3Rpb24gKHF1ZXJ5KSB7XG4gIHRoaXMuZW50cmllcy5sZW5ndGggPSAwO1xuICBwYXJzZVNlYXJjaFBhcmFtcyh0aGlzLmVudHJpZXMsIHF1ZXJ5KTtcbn07XG5cbnZhciB2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aCA9IGZ1bmN0aW9uIChwYXNzZWQsIHJlcXVpcmVkKSB7XG4gIGlmIChwYXNzZWQgPCByZXF1aXJlZCkgdGhyb3cgVHlwZUVycm9yKCdOb3QgZW5vdWdoIGFyZ3VtZW50cycpO1xufTtcblxudmFyIFVSTFNlYXJjaFBhcmFtc0l0ZXJhdG9yID0gY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvcihmdW5jdGlvbiBJdGVyYXRvcihwYXJhbXMsIGtpbmQpIHtcbiAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgdHlwZTogVVJMX1NFQVJDSF9QQVJBTVNfSVRFUkFUT1IsXG4gICAgaXRlcmF0b3I6IGdldEl0ZXJhdG9yKGdldEludGVybmFsUGFyYW1zU3RhdGUocGFyYW1zKS5lbnRyaWVzKSxcbiAgICBraW5kOiBraW5kXG4gIH0pO1xufSwgJ0l0ZXJhdG9yJywgZnVuY3Rpb24gbmV4dCgpIHtcbiAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxJdGVyYXRvclN0YXRlKHRoaXMpO1xuICB2YXIga2luZCA9IHN0YXRlLmtpbmQ7XG4gIHZhciBzdGVwID0gc3RhdGUuaXRlcmF0b3IubmV4dCgpO1xuICB2YXIgZW50cnkgPSBzdGVwLnZhbHVlO1xuICBpZiAoIXN0ZXAuZG9uZSkge1xuICAgIHN0ZXAudmFsdWUgPSBraW5kID09PSAna2V5cycgPyBlbnRyeS5rZXkgOiBraW5kID09PSAndmFsdWVzJyA/IGVudHJ5LnZhbHVlIDogW2VudHJ5LmtleSwgZW50cnkudmFsdWVdO1xuICB9IHJldHVybiBzdGVwO1xufSk7XG5cbi8vIGBVUkxTZWFyY2hQYXJhbXNgIGNvbnN0cnVjdG9yXG4vLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2ludGVyZmFjZS11cmxzZWFyY2hwYXJhbXNcbnZhciBVUkxTZWFyY2hQYXJhbXNDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uIFVSTFNlYXJjaFBhcmFtcygvKiBpbml0ICovKSB7XG4gIGFuSW5zdGFuY2UodGhpcywgVVJMU2VhcmNoUGFyYW1zQ29uc3RydWN0b3IsIFVSTF9TRUFSQ0hfUEFSQU1TKTtcbiAgdmFyIGluaXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZDtcbiAgdmFyIHRoYXQgPSB0aGlzO1xuICB2YXIgZW50cmllcyA9IFtdO1xuICB2YXIgaXRlcmF0b3JNZXRob2QsIGl0ZXJhdG9yLCBuZXh0LCBzdGVwLCBlbnRyeUl0ZXJhdG9yLCBlbnRyeU5leHQsIGZpcnN0LCBzZWNvbmQsIGtleTtcblxuICBzZXRJbnRlcm5hbFN0YXRlKHRoYXQsIHtcbiAgICB0eXBlOiBVUkxfU0VBUkNIX1BBUkFNUyxcbiAgICBlbnRyaWVzOiBlbnRyaWVzLFxuICAgIHVwZGF0ZVVSTDogZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9LFxuICAgIHVwZGF0ZVNlYXJjaFBhcmFtczogdXBkYXRlU2VhcmNoUGFyYW1zXG4gIH0pO1xuXG4gIGlmIChpbml0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoaXNPYmplY3QoaW5pdCkpIHtcbiAgICAgIGl0ZXJhdG9yTWV0aG9kID0gZ2V0SXRlcmF0b3JNZXRob2QoaW5pdCk7XG4gICAgICBpZiAodHlwZW9mIGl0ZXJhdG9yTWV0aG9kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGl0ZXJhdG9yID0gaXRlcmF0b3JNZXRob2QuY2FsbChpbml0KTtcbiAgICAgICAgbmV4dCA9IGl0ZXJhdG9yLm5leHQ7XG4gICAgICAgIHdoaWxlICghKHN0ZXAgPSBuZXh0LmNhbGwoaXRlcmF0b3IpKS5kb25lKSB7XG4gICAgICAgICAgZW50cnlJdGVyYXRvciA9IGdldEl0ZXJhdG9yKGFuT2JqZWN0KHN0ZXAudmFsdWUpKTtcbiAgICAgICAgICBlbnRyeU5leHQgPSBlbnRyeUl0ZXJhdG9yLm5leHQ7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgKGZpcnN0ID0gZW50cnlOZXh0LmNhbGwoZW50cnlJdGVyYXRvcikpLmRvbmUgfHxcbiAgICAgICAgICAgIChzZWNvbmQgPSBlbnRyeU5leHQuY2FsbChlbnRyeUl0ZXJhdG9yKSkuZG9uZSB8fFxuICAgICAgICAgICAgIWVudHJ5TmV4dC5jYWxsKGVudHJ5SXRlcmF0b3IpLmRvbmVcbiAgICAgICAgICApIHRocm93IFR5cGVFcnJvcignRXhwZWN0ZWQgc2VxdWVuY2Ugd2l0aCBsZW5ndGggMicpO1xuICAgICAgICAgIGVudHJpZXMucHVzaCh7IGtleTogZmlyc3QudmFsdWUgKyAnJywgdmFsdWU6IHNlY29uZC52YWx1ZSArICcnIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgZm9yIChrZXkgaW4gaW5pdCkgaWYgKGhhc093bihpbml0LCBrZXkpKSBlbnRyaWVzLnB1c2goeyBrZXk6IGtleSwgdmFsdWU6IGluaXRba2V5XSArICcnIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJzZVNlYXJjaFBhcmFtcyhlbnRyaWVzLCB0eXBlb2YgaW5pdCA9PT0gJ3N0cmluZycgPyBpbml0LmNoYXJBdCgwKSA9PT0gJz8nID8gaW5pdC5zbGljZSgxKSA6IGluaXQgOiBpbml0ICsgJycpO1xuICAgIH1cbiAgfVxufTtcblxudmFyIFVSTFNlYXJjaFBhcmFtc1Byb3RvdHlwZSA9IFVSTFNlYXJjaFBhcmFtc0NvbnN0cnVjdG9yLnByb3RvdHlwZTtcblxucmVkZWZpbmVBbGwoVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlLCB7XG4gIC8vIGBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmFwcGVuZGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybHNlYXJjaHBhcmFtcy1hcHBlbmRcbiAgYXBwZW5kOiBmdW5jdGlvbiBhcHBlbmQobmFtZSwgdmFsdWUpIHtcbiAgICB2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aChhcmd1bWVudHMubGVuZ3RoLCAyKTtcbiAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFBhcmFtc1N0YXRlKHRoaXMpO1xuICAgIHN0YXRlLmVudHJpZXMucHVzaCh7IGtleTogbmFtZSArICcnLCB2YWx1ZTogdmFsdWUgKyAnJyB9KTtcbiAgICBzdGF0ZS51cGRhdGVVUkwoKTtcbiAgfSxcbiAgLy8gYFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuZGVsZXRlYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsc2VhcmNocGFyYW1zLWRlbGV0ZVxuICAnZGVsZXRlJzogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aChhcmd1bWVudHMubGVuZ3RoLCAxKTtcbiAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFBhcmFtc1N0YXRlKHRoaXMpO1xuICAgIHZhciBlbnRyaWVzID0gc3RhdGUuZW50cmllcztcbiAgICB2YXIga2V5ID0gbmFtZSArICcnO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgd2hpbGUgKGluZGV4IDwgZW50cmllcy5sZW5ndGgpIHtcbiAgICAgIGlmIChlbnRyaWVzW2luZGV4XS5rZXkgPT09IGtleSkgZW50cmllcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgZWxzZSBpbmRleCsrO1xuICAgIH1cbiAgICBzdGF0ZS51cGRhdGVVUkwoKTtcbiAgfSxcbiAgLy8gYFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuZ2V0YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsc2VhcmNocGFyYW1zLWdldFxuICBnZXQ6IGZ1bmN0aW9uIGdldChuYW1lKSB7XG4gICAgdmFsaWRhdGVBcmd1bWVudHNMZW5ndGgoYXJndW1lbnRzLmxlbmd0aCwgMSk7XG4gICAgdmFyIGVudHJpZXMgPSBnZXRJbnRlcm5hbFBhcmFtc1N0YXRlKHRoaXMpLmVudHJpZXM7XG4gICAgdmFyIGtleSA9IG5hbWUgKyAnJztcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIGZvciAoOyBpbmRleCA8IGVudHJpZXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBpZiAoZW50cmllc1tpbmRleF0ua2V5ID09PSBrZXkpIHJldHVybiBlbnRyaWVzW2luZGV4XS52YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH0sXG4gIC8vIGBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmdldEFsbGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybHNlYXJjaHBhcmFtcy1nZXRhbGxcbiAgZ2V0QWxsOiBmdW5jdGlvbiBnZXRBbGwobmFtZSkge1xuICAgIHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoKGFyZ3VtZW50cy5sZW5ndGgsIDEpO1xuICAgIHZhciBlbnRyaWVzID0gZ2V0SW50ZXJuYWxQYXJhbXNTdGF0ZSh0aGlzKS5lbnRyaWVzO1xuICAgIHZhciBrZXkgPSBuYW1lICsgJyc7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgZm9yICg7IGluZGV4IDwgZW50cmllcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGlmIChlbnRyaWVzW2luZGV4XS5rZXkgPT09IGtleSkgcmVzdWx0LnB1c2goZW50cmllc1tpbmRleF0udmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9LFxuICAvLyBgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5oYXNgIG1ldGhvZFxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmxzZWFyY2hwYXJhbXMtaGFzXG4gIGhhczogZnVuY3Rpb24gaGFzKG5hbWUpIHtcbiAgICB2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aChhcmd1bWVudHMubGVuZ3RoLCAxKTtcbiAgICB2YXIgZW50cmllcyA9IGdldEludGVybmFsUGFyYW1zU3RhdGUodGhpcykuZW50cmllcztcbiAgICB2YXIga2V5ID0gbmFtZSArICcnO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgd2hpbGUgKGluZGV4IDwgZW50cmllcy5sZW5ndGgpIHtcbiAgICAgIGlmIChlbnRyaWVzW2luZGV4KytdLmtleSA9PT0ga2V5KSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICAvLyBgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5zZXRgIG1ldGhvZFxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmxzZWFyY2hwYXJhbXMtc2V0XG4gIHNldDogZnVuY3Rpb24gc2V0KG5hbWUsIHZhbHVlKSB7XG4gICAgdmFsaWRhdGVBcmd1bWVudHNMZW5ndGgoYXJndW1lbnRzLmxlbmd0aCwgMSk7XG4gICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxQYXJhbXNTdGF0ZSh0aGlzKTtcbiAgICB2YXIgZW50cmllcyA9IHN0YXRlLmVudHJpZXM7XG4gICAgdmFyIGZvdW5kID0gZmFsc2U7XG4gICAgdmFyIGtleSA9IG5hbWUgKyAnJztcbiAgICB2YXIgdmFsID0gdmFsdWUgKyAnJztcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciBlbnRyeTtcbiAgICBmb3IgKDsgaW5kZXggPCBlbnRyaWVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICAgIGlmIChlbnRyeS5rZXkgPT09IGtleSkge1xuICAgICAgICBpZiAoZm91bmQpIGVudHJpZXMuc3BsaWNlKGluZGV4LS0sIDEpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgZW50cnkudmFsdWUgPSB2YWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFmb3VuZCkgZW50cmllcy5wdXNoKHsga2V5OiBrZXksIHZhbHVlOiB2YWwgfSk7XG4gICAgc3RhdGUudXBkYXRlVVJMKCk7XG4gIH0sXG4gIC8vIGBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLnNvcnRgIG1ldGhvZFxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmxzZWFyY2hwYXJhbXMtc29ydFxuICBzb3J0OiBmdW5jdGlvbiBzb3J0KCkge1xuICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsUGFyYW1zU3RhdGUodGhpcyk7XG4gICAgdmFyIGVudHJpZXMgPSBzdGF0ZS5lbnRyaWVzO1xuICAgIC8vIEFycmF5I3NvcnQgaXMgbm90IHN0YWJsZSBpbiBzb21lIGVuZ2luZXNcbiAgICB2YXIgc2xpY2UgPSBlbnRyaWVzLnNsaWNlKCk7XG4gICAgdmFyIGVudHJ5LCBlbnRyaWVzSW5kZXgsIHNsaWNlSW5kZXg7XG4gICAgZW50cmllcy5sZW5ndGggPSAwO1xuICAgIGZvciAoc2xpY2VJbmRleCA9IDA7IHNsaWNlSW5kZXggPCBzbGljZS5sZW5ndGg7IHNsaWNlSW5kZXgrKykge1xuICAgICAgZW50cnkgPSBzbGljZVtzbGljZUluZGV4XTtcbiAgICAgIGZvciAoZW50cmllc0luZGV4ID0gMDsgZW50cmllc0luZGV4IDwgc2xpY2VJbmRleDsgZW50cmllc0luZGV4KyspIHtcbiAgICAgICAgaWYgKGVudHJpZXNbZW50cmllc0luZGV4XS5rZXkgPiBlbnRyeS5rZXkpIHtcbiAgICAgICAgICBlbnRyaWVzLnNwbGljZShlbnRyaWVzSW5kZXgsIDAsIGVudHJ5KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGVudHJpZXNJbmRleCA9PT0gc2xpY2VJbmRleCkgZW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICB9XG4gICAgc3RhdGUudXBkYXRlVVJMKCk7XG4gIH0sXG4gIC8vIGBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmZvckVhY2hgIG1ldGhvZFxuICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrIC8qICwgdGhpc0FyZyAqLykge1xuICAgIHZhciBlbnRyaWVzID0gZ2V0SW50ZXJuYWxQYXJhbXNTdGF0ZSh0aGlzKS5lbnRyaWVzO1xuICAgIHZhciBib3VuZEZ1bmN0aW9uID0gYmluZChjYWxsYmFjaywgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIDMpO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGVudHJ5O1xuICAgIHdoaWxlIChpbmRleCA8IGVudHJpZXMubGVuZ3RoKSB7XG4gICAgICBlbnRyeSA9IGVudHJpZXNbaW5kZXgrK107XG4gICAgICBib3VuZEZ1bmN0aW9uKGVudHJ5LnZhbHVlLCBlbnRyeS5rZXksIHRoaXMpO1xuICAgIH1cbiAgfSxcbiAgLy8gYFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUua2V5c2AgbWV0aG9kXG4gIGtleXM6IGZ1bmN0aW9uIGtleXMoKSB7XG4gICAgcmV0dXJuIG5ldyBVUkxTZWFyY2hQYXJhbXNJdGVyYXRvcih0aGlzLCAna2V5cycpO1xuICB9LFxuICAvLyBgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS52YWx1ZXNgIG1ldGhvZFxuICB2YWx1ZXM6IGZ1bmN0aW9uIHZhbHVlcygpIHtcbiAgICByZXR1cm4gbmV3IFVSTFNlYXJjaFBhcmFtc0l0ZXJhdG9yKHRoaXMsICd2YWx1ZXMnKTtcbiAgfSxcbiAgLy8gYFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuZW50cmllc2AgbWV0aG9kXG4gIGVudHJpZXM6IGZ1bmN0aW9uIGVudHJpZXMoKSB7XG4gICAgcmV0dXJuIG5ldyBVUkxTZWFyY2hQYXJhbXNJdGVyYXRvcih0aGlzLCAnZW50cmllcycpO1xuICB9XG59LCB7IGVudW1lcmFibGU6IHRydWUgfSk7XG5cbi8vIGBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlW0BAaXRlcmF0b3JdYCBtZXRob2RcbnJlZGVmaW5lKFVSTFNlYXJjaFBhcmFtc1Byb3RvdHlwZSwgSVRFUkFUT1IsIFVSTFNlYXJjaFBhcmFtc1Byb3RvdHlwZS5lbnRyaWVzKTtcblxuLy8gYFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUudG9TdHJpbmdgIG1ldGhvZFxuLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyN1cmxzZWFyY2hwYXJhbXMtc3RyaW5naWZpY2F0aW9uLWJlaGF2aW9yXG5yZWRlZmluZShVUkxTZWFyY2hQYXJhbXNQcm90b3R5cGUsICd0b1N0cmluZycsIGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICB2YXIgZW50cmllcyA9IGdldEludGVybmFsUGFyYW1zU3RhdGUodGhpcykuZW50cmllcztcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgZW50cnk7XG4gIHdoaWxlIChpbmRleCA8IGVudHJpZXMubGVuZ3RoKSB7XG4gICAgZW50cnkgPSBlbnRyaWVzW2luZGV4KytdO1xuICAgIHJlc3VsdC5wdXNoKHNlcmlhbGl6ZShlbnRyeS5rZXkpICsgJz0nICsgc2VyaWFsaXplKGVudHJ5LnZhbHVlKSk7XG4gIH0gcmV0dXJuIHJlc3VsdC5qb2luKCcmJyk7XG59LCB7IGVudW1lcmFibGU6IHRydWUgfSk7XG5cbnNldFRvU3RyaW5nVGFnKFVSTFNlYXJjaFBhcmFtc0NvbnN0cnVjdG9yLCBVUkxfU0VBUkNIX1BBUkFNUyk7XG5cbiQoeyBnbG9iYWw6IHRydWUsIGZvcmNlZDogIVVTRV9OQVRJVkVfVVJMIH0sIHtcbiAgVVJMU2VhcmNoUGFyYW1zOiBVUkxTZWFyY2hQYXJhbXNDb25zdHJ1Y3RvclxufSk7XG5cbi8vIFdyYXAgYGZldGNoYCBmb3IgY29ycmVjdCB3b3JrIHdpdGggcG9seWZpbGxlZCBgVVJMU2VhcmNoUGFyYW1zYFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzY3NFxuaWYgKCFVU0VfTkFUSVZFX1VSTCAmJiB0eXBlb2YgJGZldGNoID09ICdmdW5jdGlvbicgJiYgdHlwZW9mIEhlYWRlcnMgPT0gJ2Z1bmN0aW9uJykge1xuICAkKHsgZ2xvYmFsOiB0cnVlLCBlbnVtZXJhYmxlOiB0cnVlLCBmb3JjZWQ6IHRydWUgfSwge1xuICAgIGZldGNoOiBmdW5jdGlvbiBmZXRjaChpbnB1dCAvKiAsIGluaXQgKi8pIHtcbiAgICAgIHZhciBhcmdzID0gW2lucHV0XTtcbiAgICAgIHZhciBpbml0LCBib2R5LCBoZWFkZXJzO1xuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGluaXQgPSBhcmd1bWVudHNbMV07XG4gICAgICAgIGlmIChpc09iamVjdChpbml0KSkge1xuICAgICAgICAgIGJvZHkgPSBpbml0LmJvZHk7XG4gICAgICAgICAgaWYgKGNsYXNzb2YoYm9keSkgPT09IFVSTF9TRUFSQ0hfUEFSQU1TKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaW5pdC5oZWFkZXJzID8gbmV3IEhlYWRlcnMoaW5pdC5oZWFkZXJzKSA6IG5ldyBIZWFkZXJzKCk7XG4gICAgICAgICAgICBpZiAoIWhlYWRlcnMuaGFzKCdjb250ZW50LXR5cGUnKSkge1xuICAgICAgICAgICAgICBoZWFkZXJzLnNldCgnY29udGVudC10eXBlJywgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PVVURi04Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbml0ID0gY3JlYXRlKGluaXQsIHtcbiAgICAgICAgICAgICAgYm9keTogY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDAsIFN0cmluZyhib2R5KSksXG4gICAgICAgICAgICAgIGhlYWRlcnM6IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigwLCBoZWFkZXJzKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFyZ3MucHVzaChpbml0KTtcbiAgICAgIH0gcmV0dXJuICRmZXRjaC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9XG4gIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgVVJMU2VhcmNoUGFyYW1zOiBVUkxTZWFyY2hQYXJhbXNDb25zdHJ1Y3RvcixcbiAgZ2V0U3RhdGU6IGdldEludGVybmFsUGFyYW1zU3RhdGVcbn07XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDI4NTpcbi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG4vLyBUT0RPOiBpbiBjb3JlLWpzQDQsIG1vdmUgL21vZHVsZXMvIGRlcGVuZGVuY2llcyB0byBwdWJsaWMgZW50cmllcyBmb3IgYmV0dGVyIG9wdGltaXphdGlvbiBieSB0b29scyBsaWtlIGBwcmVzZXQtZW52YFxuX193ZWJwYWNrX3JlcXVpcmVfXyg4NzgzKTtcbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMTA5KTtcbnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oOTc4MSk7XG52YXIgVVNFX05BVElWRV9VUkwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU5MCk7XG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3ODU0KTtcbnZhciBkZWZpbmVQcm9wZXJ0aWVzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2MDQ4KTtcbnZhciByZWRlZmluZSA9IF9fd2VicGFja19yZXF1aXJlX18oMTMyMCk7XG52YXIgYW5JbnN0YW5jZSA9IF9fd2VicGFja19yZXF1aXJlX18oNTc4Nyk7XG52YXIgaGFzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NjU2KTtcbnZhciBhc3NpZ24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1NzQpO1xudmFyIGFycmF5RnJvbSA9IF9fd2VicGFja19yZXF1aXJlX18oODQ1Nyk7XG52YXIgY29kZUF0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NzEwKS5jb2RlQXQ7XG52YXIgdG9BU0NJSSA9IF9fd2VicGFja19yZXF1aXJlX18oMzE5Nyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgwMDMpO1xudmFyIFVSTFNlYXJjaFBhcmFtc01vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oMTYzNyk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oOTkwOSk7XG5cbnZhciBOYXRpdmVVUkwgPSBnbG9iYWwuVVJMO1xudmFyIFVSTFNlYXJjaFBhcmFtcyA9IFVSTFNlYXJjaFBhcmFtc01vZHVsZS5VUkxTZWFyY2hQYXJhbXM7XG52YXIgZ2V0SW50ZXJuYWxTZWFyY2hQYXJhbXNTdGF0ZSA9IFVSTFNlYXJjaFBhcmFtc01vZHVsZS5nZXRTdGF0ZTtcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxVUkxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKCdVUkwnKTtcbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG52YXIgcG93ID0gTWF0aC5wb3c7XG5cbnZhciBJTlZBTElEX0FVVEhPUklUWSA9ICdJbnZhbGlkIGF1dGhvcml0eSc7XG52YXIgSU5WQUxJRF9TQ0hFTUUgPSAnSW52YWxpZCBzY2hlbWUnO1xudmFyIElOVkFMSURfSE9TVCA9ICdJbnZhbGlkIGhvc3QnO1xudmFyIElOVkFMSURfUE9SVCA9ICdJbnZhbGlkIHBvcnQnO1xuXG52YXIgQUxQSEEgPSAvW0EtWmEtel0vO1xudmFyIEFMUEhBTlVNRVJJQyA9IC9bXFxkKy0uQS1aYS16XS87XG52YXIgRElHSVQgPSAvXFxkLztcbnZhciBIRVhfU1RBUlQgPSAvXigweHwwWCkvO1xudmFyIE9DVCA9IC9eWzAtN10rJC87XG52YXIgREVDID0gL15cXGQrJC87XG52YXIgSEVYID0gL15bXFxkQS1GYS1mXSskLztcbi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnRyb2wtcmVnZXggLS0gc2FmZSAqL1xudmFyIEZPUkJJRERFTl9IT1NUX0NPREVfUE9JTlQgPSAvW1xcdTAwMDBcXHRcXHUwMDBBXFx1MDAwRCAjJS86P0BbXFxcXF1dLztcbnZhciBGT1JCSURERU5fSE9TVF9DT0RFX1BPSU5UX0VYQ0xVRElOR19QRVJDRU5UID0gL1tcXHUwMDAwXFx0XFx1MDAwQVxcdTAwMEQgIy86P0BbXFxcXF1dLztcbnZhciBMRUFESU5HX0FORF9UUkFJTElOR19DMF9DT05UUk9MX09SX1NQQUNFID0gL15bXFx1MDAwMC1cXHUwMDFGIF0rfFtcXHUwMDAwLVxcdTAwMUYgXSskL2c7XG52YXIgVEFCX0FORF9ORVdfTElORSA9IC9bXFx0XFx1MDAwQVxcdTAwMERdL2c7XG4vKiBlc2xpbnQtZW5hYmxlIG5vLWNvbnRyb2wtcmVnZXggLS0gc2FmZSAqL1xudmFyIEVPRjtcblxudmFyIHBhcnNlSG9zdCA9IGZ1bmN0aW9uICh1cmwsIGlucHV0KSB7XG4gIHZhciByZXN1bHQsIGNvZGVQb2ludHMsIGluZGV4O1xuICBpZiAoaW5wdXQuY2hhckF0KDApID09ICdbJykge1xuICAgIGlmIChpbnB1dC5jaGFyQXQoaW5wdXQubGVuZ3RoIC0gMSkgIT0gJ10nKSByZXR1cm4gSU5WQUxJRF9IT1NUO1xuICAgIHJlc3VsdCA9IHBhcnNlSVB2NihpbnB1dC5zbGljZSgxLCAtMSkpO1xuICAgIGlmICghcmVzdWx0KSByZXR1cm4gSU5WQUxJRF9IT1NUO1xuICAgIHVybC5ob3N0ID0gcmVzdWx0O1xuICAvLyBvcGFxdWUgaG9zdFxuICB9IGVsc2UgaWYgKCFpc1NwZWNpYWwodXJsKSkge1xuICAgIGlmIChGT1JCSURERU5fSE9TVF9DT0RFX1BPSU5UX0VYQ0xVRElOR19QRVJDRU5ULnRlc3QoaW5wdXQpKSByZXR1cm4gSU5WQUxJRF9IT1NUO1xuICAgIHJlc3VsdCA9ICcnO1xuICAgIGNvZGVQb2ludHMgPSBhcnJheUZyb20oaW5wdXQpO1xuICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IGNvZGVQb2ludHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICByZXN1bHQgKz0gcGVyY2VudEVuY29kZShjb2RlUG9pbnRzW2luZGV4XSwgQzBDb250cm9sUGVyY2VudEVuY29kZVNldCk7XG4gICAgfVxuICAgIHVybC5ob3N0ID0gcmVzdWx0O1xuICB9IGVsc2Uge1xuICAgIGlucHV0ID0gdG9BU0NJSShpbnB1dCk7XG4gICAgaWYgKEZPUkJJRERFTl9IT1NUX0NPREVfUE9JTlQudGVzdChpbnB1dCkpIHJldHVybiBJTlZBTElEX0hPU1Q7XG4gICAgcmVzdWx0ID0gcGFyc2VJUHY0KGlucHV0KTtcbiAgICBpZiAocmVzdWx0ID09PSBudWxsKSByZXR1cm4gSU5WQUxJRF9IT1NUO1xuICAgIHVybC5ob3N0ID0gcmVzdWx0O1xuICB9XG59O1xuXG52YXIgcGFyc2VJUHY0ID0gZnVuY3Rpb24gKGlucHV0KSB7XG4gIHZhciBwYXJ0cyA9IGlucHV0LnNwbGl0KCcuJyk7XG4gIHZhciBwYXJ0c0xlbmd0aCwgbnVtYmVycywgaW5kZXgsIHBhcnQsIHJhZGl4LCBudW1iZXIsIGlwdjQ7XG4gIGlmIChwYXJ0cy5sZW5ndGggJiYgcGFydHNbcGFydHMubGVuZ3RoIC0gMV0gPT0gJycpIHtcbiAgICBwYXJ0cy5wb3AoKTtcbiAgfVxuICBwYXJ0c0xlbmd0aCA9IHBhcnRzLmxlbmd0aDtcbiAgaWYgKHBhcnRzTGVuZ3RoID4gNCkgcmV0dXJuIGlucHV0O1xuICBudW1iZXJzID0gW107XG4gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHBhcnRzTGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgcGFydCA9IHBhcnRzW2luZGV4XTtcbiAgICBpZiAocGFydCA9PSAnJykgcmV0dXJuIGlucHV0O1xuICAgIHJhZGl4ID0gMTA7XG4gICAgaWYgKHBhcnQubGVuZ3RoID4gMSAmJiBwYXJ0LmNoYXJBdCgwKSA9PSAnMCcpIHtcbiAgICAgIHJhZGl4ID0gSEVYX1NUQVJULnRlc3QocGFydCkgPyAxNiA6IDg7XG4gICAgICBwYXJ0ID0gcGFydC5zbGljZShyYWRpeCA9PSA4ID8gMSA6IDIpO1xuICAgIH1cbiAgICBpZiAocGFydCA9PT0gJycpIHtcbiAgICAgIG51bWJlciA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghKHJhZGl4ID09IDEwID8gREVDIDogcmFkaXggPT0gOCA/IE9DVCA6IEhFWCkudGVzdChwYXJ0KSkgcmV0dXJuIGlucHV0O1xuICAgICAgbnVtYmVyID0gcGFyc2VJbnQocGFydCwgcmFkaXgpO1xuICAgIH1cbiAgICBudW1iZXJzLnB1c2gobnVtYmVyKTtcbiAgfVxuICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBwYXJ0c0xlbmd0aDsgaW5kZXgrKykge1xuICAgIG51bWJlciA9IG51bWJlcnNbaW5kZXhdO1xuICAgIGlmIChpbmRleCA9PSBwYXJ0c0xlbmd0aCAtIDEpIHtcbiAgICAgIGlmIChudW1iZXIgPj0gcG93KDI1NiwgNSAtIHBhcnRzTGVuZ3RoKSkgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIGlmIChudW1iZXIgPiAyNTUpIHJldHVybiBudWxsO1xuICB9XG4gIGlwdjQgPSBudW1iZXJzLnBvcCgpO1xuICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBudW1iZXJzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGlwdjQgKz0gbnVtYmVyc1tpbmRleF0gKiBwb3coMjU2LCAzIC0gaW5kZXgpO1xuICB9XG4gIHJldHVybiBpcHY0O1xufTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1zdGF0ZW1lbnRzIC0tIFRPRE9cbnZhciBwYXJzZUlQdjYgPSBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgdmFyIGFkZHJlc3MgPSBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMF07XG4gIHZhciBwaWVjZUluZGV4ID0gMDtcbiAgdmFyIGNvbXByZXNzID0gbnVsbDtcbiAgdmFyIHBvaW50ZXIgPSAwO1xuICB2YXIgdmFsdWUsIGxlbmd0aCwgbnVtYmVyc1NlZW4sIGlwdjRQaWVjZSwgbnVtYmVyLCBzd2Fwcywgc3dhcDtcblxuICB2YXIgY2hhciA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gaW5wdXQuY2hhckF0KHBvaW50ZXIpO1xuICB9O1xuXG4gIGlmIChjaGFyKCkgPT0gJzonKSB7XG4gICAgaWYgKGlucHV0LmNoYXJBdCgxKSAhPSAnOicpIHJldHVybjtcbiAgICBwb2ludGVyICs9IDI7XG4gICAgcGllY2VJbmRleCsrO1xuICAgIGNvbXByZXNzID0gcGllY2VJbmRleDtcbiAgfVxuICB3aGlsZSAoY2hhcigpKSB7XG4gICAgaWYgKHBpZWNlSW5kZXggPT0gOCkgcmV0dXJuO1xuICAgIGlmIChjaGFyKCkgPT0gJzonKSB7XG4gICAgICBpZiAoY29tcHJlc3MgIT09IG51bGwpIHJldHVybjtcbiAgICAgIHBvaW50ZXIrKztcbiAgICAgIHBpZWNlSW5kZXgrKztcbiAgICAgIGNvbXByZXNzID0gcGllY2VJbmRleDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB2YWx1ZSA9IGxlbmd0aCA9IDA7XG4gICAgd2hpbGUgKGxlbmd0aCA8IDQgJiYgSEVYLnRlc3QoY2hhcigpKSkge1xuICAgICAgdmFsdWUgPSB2YWx1ZSAqIDE2ICsgcGFyc2VJbnQoY2hhcigpLCAxNik7XG4gICAgICBwb2ludGVyKys7XG4gICAgICBsZW5ndGgrKztcbiAgICB9XG4gICAgaWYgKGNoYXIoKSA9PSAnLicpIHtcbiAgICAgIGlmIChsZW5ndGggPT0gMCkgcmV0dXJuO1xuICAgICAgcG9pbnRlciAtPSBsZW5ndGg7XG4gICAgICBpZiAocGllY2VJbmRleCA+IDYpIHJldHVybjtcbiAgICAgIG51bWJlcnNTZWVuID0gMDtcbiAgICAgIHdoaWxlIChjaGFyKCkpIHtcbiAgICAgICAgaXB2NFBpZWNlID0gbnVsbDtcbiAgICAgICAgaWYgKG51bWJlcnNTZWVuID4gMCkge1xuICAgICAgICAgIGlmIChjaGFyKCkgPT0gJy4nICYmIG51bWJlcnNTZWVuIDwgNCkgcG9pbnRlcisrO1xuICAgICAgICAgIGVsc2UgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghRElHSVQudGVzdChjaGFyKCkpKSByZXR1cm47XG4gICAgICAgIHdoaWxlIChESUdJVC50ZXN0KGNoYXIoKSkpIHtcbiAgICAgICAgICBudW1iZXIgPSBwYXJzZUludChjaGFyKCksIDEwKTtcbiAgICAgICAgICBpZiAoaXB2NFBpZWNlID09PSBudWxsKSBpcHY0UGllY2UgPSBudW1iZXI7XG4gICAgICAgICAgZWxzZSBpZiAoaXB2NFBpZWNlID09IDApIHJldHVybjtcbiAgICAgICAgICBlbHNlIGlwdjRQaWVjZSA9IGlwdjRQaWVjZSAqIDEwICsgbnVtYmVyO1xuICAgICAgICAgIGlmIChpcHY0UGllY2UgPiAyNTUpIHJldHVybjtcbiAgICAgICAgICBwb2ludGVyKys7XG4gICAgICAgIH1cbiAgICAgICAgYWRkcmVzc1twaWVjZUluZGV4XSA9IGFkZHJlc3NbcGllY2VJbmRleF0gKiAyNTYgKyBpcHY0UGllY2U7XG4gICAgICAgIG51bWJlcnNTZWVuKys7XG4gICAgICAgIGlmIChudW1iZXJzU2VlbiA9PSAyIHx8IG51bWJlcnNTZWVuID09IDQpIHBpZWNlSW5kZXgrKztcbiAgICAgIH1cbiAgICAgIGlmIChudW1iZXJzU2VlbiAhPSA0KSByZXR1cm47XG4gICAgICBicmVhaztcbiAgICB9IGVsc2UgaWYgKGNoYXIoKSA9PSAnOicpIHtcbiAgICAgIHBvaW50ZXIrKztcbiAgICAgIGlmICghY2hhcigpKSByZXR1cm47XG4gICAgfSBlbHNlIGlmIChjaGFyKCkpIHJldHVybjtcbiAgICBhZGRyZXNzW3BpZWNlSW5kZXgrK10gPSB2YWx1ZTtcbiAgfVxuICBpZiAoY29tcHJlc3MgIT09IG51bGwpIHtcbiAgICBzd2FwcyA9IHBpZWNlSW5kZXggLSBjb21wcmVzcztcbiAgICBwaWVjZUluZGV4ID0gNztcbiAgICB3aGlsZSAocGllY2VJbmRleCAhPSAwICYmIHN3YXBzID4gMCkge1xuICAgICAgc3dhcCA9IGFkZHJlc3NbcGllY2VJbmRleF07XG4gICAgICBhZGRyZXNzW3BpZWNlSW5kZXgtLV0gPSBhZGRyZXNzW2NvbXByZXNzICsgc3dhcHMgLSAxXTtcbiAgICAgIGFkZHJlc3NbY29tcHJlc3MgKyAtLXN3YXBzXSA9IHN3YXA7XG4gICAgfVxuICB9IGVsc2UgaWYgKHBpZWNlSW5kZXggIT0gOCkgcmV0dXJuO1xuICByZXR1cm4gYWRkcmVzcztcbn07XG5cbnZhciBmaW5kTG9uZ2VzdFplcm9TZXF1ZW5jZSA9IGZ1bmN0aW9uIChpcHY2KSB7XG4gIHZhciBtYXhJbmRleCA9IG51bGw7XG4gIHZhciBtYXhMZW5ndGggPSAxO1xuICB2YXIgY3VyclN0YXJ0ID0gbnVsbDtcbiAgdmFyIGN1cnJMZW5ndGggPSAwO1xuICB2YXIgaW5kZXggPSAwO1xuICBmb3IgKDsgaW5kZXggPCA4OyBpbmRleCsrKSB7XG4gICAgaWYgKGlwdjZbaW5kZXhdICE9PSAwKSB7XG4gICAgICBpZiAoY3Vyckxlbmd0aCA+IG1heExlbmd0aCkge1xuICAgICAgICBtYXhJbmRleCA9IGN1cnJTdGFydDtcbiAgICAgICAgbWF4TGVuZ3RoID0gY3Vyckxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGN1cnJTdGFydCA9IG51bGw7XG4gICAgICBjdXJyTGVuZ3RoID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGN1cnJTdGFydCA9PT0gbnVsbCkgY3VyclN0YXJ0ID0gaW5kZXg7XG4gICAgICArK2N1cnJMZW5ndGg7XG4gICAgfVxuICB9XG4gIGlmIChjdXJyTGVuZ3RoID4gbWF4TGVuZ3RoKSB7XG4gICAgbWF4SW5kZXggPSBjdXJyU3RhcnQ7XG4gICAgbWF4TGVuZ3RoID0gY3Vyckxlbmd0aDtcbiAgfVxuICByZXR1cm4gbWF4SW5kZXg7XG59O1xuXG52YXIgc2VyaWFsaXplSG9zdCA9IGZ1bmN0aW9uIChob3N0KSB7XG4gIHZhciByZXN1bHQsIGluZGV4LCBjb21wcmVzcywgaWdub3JlMDtcbiAgLy8gaXB2NFxuICBpZiAodHlwZW9mIGhvc3QgPT0gJ251bWJlcicpIHtcbiAgICByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCA0OyBpbmRleCsrKSB7XG4gICAgICByZXN1bHQudW5zaGlmdChob3N0ICUgMjU2KTtcbiAgICAgIGhvc3QgPSBmbG9vcihob3N0IC8gMjU2KTtcbiAgICB9IHJldHVybiByZXN1bHQuam9pbignLicpO1xuICAvLyBpcHY2XG4gIH0gZWxzZSBpZiAodHlwZW9mIGhvc3QgPT0gJ29iamVjdCcpIHtcbiAgICByZXN1bHQgPSAnJztcbiAgICBjb21wcmVzcyA9IGZpbmRMb25nZXN0WmVyb1NlcXVlbmNlKGhvc3QpO1xuICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IDg7IGluZGV4KyspIHtcbiAgICAgIGlmIChpZ25vcmUwICYmIGhvc3RbaW5kZXhdID09PSAwKSBjb250aW51ZTtcbiAgICAgIGlmIChpZ25vcmUwKSBpZ25vcmUwID0gZmFsc2U7XG4gICAgICBpZiAoY29tcHJlc3MgPT09IGluZGV4KSB7XG4gICAgICAgIHJlc3VsdCArPSBpbmRleCA/ICc6JyA6ICc6Oic7XG4gICAgICAgIGlnbm9yZTAgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ICs9IGhvc3RbaW5kZXhdLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgaWYgKGluZGV4IDwgNykgcmVzdWx0ICs9ICc6JztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICdbJyArIHJlc3VsdCArICddJztcbiAgfSByZXR1cm4gaG9zdDtcbn07XG5cbnZhciBDMENvbnRyb2xQZXJjZW50RW5jb2RlU2V0ID0ge307XG52YXIgZnJhZ21lbnRQZXJjZW50RW5jb2RlU2V0ID0gYXNzaWduKHt9LCBDMENvbnRyb2xQZXJjZW50RW5jb2RlU2V0LCB7XG4gICcgJzogMSwgJ1wiJzogMSwgJzwnOiAxLCAnPic6IDEsICdgJzogMVxufSk7XG52YXIgcGF0aFBlcmNlbnRFbmNvZGVTZXQgPSBhc3NpZ24oe30sIGZyYWdtZW50UGVyY2VudEVuY29kZVNldCwge1xuICAnIyc6IDEsICc/JzogMSwgJ3snOiAxLCAnfSc6IDFcbn0pO1xudmFyIHVzZXJpbmZvUGVyY2VudEVuY29kZVNldCA9IGFzc2lnbih7fSwgcGF0aFBlcmNlbnRFbmNvZGVTZXQsIHtcbiAgJy8nOiAxLCAnOic6IDEsICc7JzogMSwgJz0nOiAxLCAnQCc6IDEsICdbJzogMSwgJ1xcXFwnOiAxLCAnXSc6IDEsICdeJzogMSwgJ3wnOiAxXG59KTtcblxudmFyIHBlcmNlbnRFbmNvZGUgPSBmdW5jdGlvbiAoY2hhciwgc2V0KSB7XG4gIHZhciBjb2RlID0gY29kZUF0KGNoYXIsIDApO1xuICByZXR1cm4gY29kZSA+IDB4MjAgJiYgY29kZSA8IDB4N0YgJiYgIWhhcyhzZXQsIGNoYXIpID8gY2hhciA6IGVuY29kZVVSSUNvbXBvbmVudChjaGFyKTtcbn07XG5cbnZhciBzcGVjaWFsU2NoZW1lcyA9IHtcbiAgZnRwOiAyMSxcbiAgZmlsZTogbnVsbCxcbiAgaHR0cDogODAsXG4gIGh0dHBzOiA0NDMsXG4gIHdzOiA4MCxcbiAgd3NzOiA0NDNcbn07XG5cbnZhciBpc1NwZWNpYWwgPSBmdW5jdGlvbiAodXJsKSB7XG4gIHJldHVybiBoYXMoc3BlY2lhbFNjaGVtZXMsIHVybC5zY2hlbWUpO1xufTtcblxudmFyIGluY2x1ZGVzQ3JlZGVudGlhbHMgPSBmdW5jdGlvbiAodXJsKSB7XG4gIHJldHVybiB1cmwudXNlcm5hbWUgIT0gJycgfHwgdXJsLnBhc3N3b3JkICE9ICcnO1xufTtcblxudmFyIGNhbm5vdEhhdmVVc2VybmFtZVBhc3N3b3JkUG9ydCA9IGZ1bmN0aW9uICh1cmwpIHtcbiAgcmV0dXJuICF1cmwuaG9zdCB8fCB1cmwuY2Fubm90QmVBQmFzZVVSTCB8fCB1cmwuc2NoZW1lID09ICdmaWxlJztcbn07XG5cbnZhciBpc1dpbmRvd3NEcml2ZUxldHRlciA9IGZ1bmN0aW9uIChzdHJpbmcsIG5vcm1hbGl6ZWQpIHtcbiAgdmFyIHNlY29uZDtcbiAgcmV0dXJuIHN0cmluZy5sZW5ndGggPT0gMiAmJiBBTFBIQS50ZXN0KHN0cmluZy5jaGFyQXQoMCkpXG4gICAgJiYgKChzZWNvbmQgPSBzdHJpbmcuY2hhckF0KDEpKSA9PSAnOicgfHwgKCFub3JtYWxpemVkICYmIHNlY29uZCA9PSAnfCcpKTtcbn07XG5cbnZhciBzdGFydHNXaXRoV2luZG93c0RyaXZlTGV0dGVyID0gZnVuY3Rpb24gKHN0cmluZykge1xuICB2YXIgdGhpcmQ7XG4gIHJldHVybiBzdHJpbmcubGVuZ3RoID4gMSAmJiBpc1dpbmRvd3NEcml2ZUxldHRlcihzdHJpbmcuc2xpY2UoMCwgMikpICYmIChcbiAgICBzdHJpbmcubGVuZ3RoID09IDIgfHxcbiAgICAoKHRoaXJkID0gc3RyaW5nLmNoYXJBdCgyKSkgPT09ICcvJyB8fCB0aGlyZCA9PT0gJ1xcXFwnIHx8IHRoaXJkID09PSAnPycgfHwgdGhpcmQgPT09ICcjJylcbiAgKTtcbn07XG5cbnZhciBzaG9ydGVuVVJMc1BhdGggPSBmdW5jdGlvbiAodXJsKSB7XG4gIHZhciBwYXRoID0gdXJsLnBhdGg7XG4gIHZhciBwYXRoU2l6ZSA9IHBhdGgubGVuZ3RoO1xuICBpZiAocGF0aFNpemUgJiYgKHVybC5zY2hlbWUgIT0gJ2ZpbGUnIHx8IHBhdGhTaXplICE9IDEgfHwgIWlzV2luZG93c0RyaXZlTGV0dGVyKHBhdGhbMF0sIHRydWUpKSkge1xuICAgIHBhdGgucG9wKCk7XG4gIH1cbn07XG5cbnZhciBpc1NpbmdsZURvdCA9IGZ1bmN0aW9uIChzZWdtZW50KSB7XG4gIHJldHVybiBzZWdtZW50ID09PSAnLicgfHwgc2VnbWVudC50b0xvd2VyQ2FzZSgpID09PSAnJTJlJztcbn07XG5cbnZhciBpc0RvdWJsZURvdCA9IGZ1bmN0aW9uIChzZWdtZW50KSB7XG4gIHNlZ21lbnQgPSBzZWdtZW50LnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiBzZWdtZW50ID09PSAnLi4nIHx8IHNlZ21lbnQgPT09ICclMmUuJyB8fCBzZWdtZW50ID09PSAnLiUyZScgfHwgc2VnbWVudCA9PT0gJyUyZSUyZSc7XG59O1xuXG4vLyBTdGF0ZXM6XG52YXIgU0NIRU1FX1NUQVJUID0ge307XG52YXIgU0NIRU1FID0ge307XG52YXIgTk9fU0NIRU1FID0ge307XG52YXIgU1BFQ0lBTF9SRUxBVElWRV9PUl9BVVRIT1JJVFkgPSB7fTtcbnZhciBQQVRIX09SX0FVVEhPUklUWSA9IHt9O1xudmFyIFJFTEFUSVZFID0ge307XG52YXIgUkVMQVRJVkVfU0xBU0ggPSB7fTtcbnZhciBTUEVDSUFMX0FVVEhPUklUWV9TTEFTSEVTID0ge307XG52YXIgU1BFQ0lBTF9BVVRIT1JJVFlfSUdOT1JFX1NMQVNIRVMgPSB7fTtcbnZhciBBVVRIT1JJVFkgPSB7fTtcbnZhciBIT1NUID0ge307XG52YXIgSE9TVE5BTUUgPSB7fTtcbnZhciBQT1JUID0ge307XG52YXIgRklMRSA9IHt9O1xudmFyIEZJTEVfU0xBU0ggPSB7fTtcbnZhciBGSUxFX0hPU1QgPSB7fTtcbnZhciBQQVRIX1NUQVJUID0ge307XG52YXIgUEFUSCA9IHt9O1xudmFyIENBTk5PVF9CRV9BX0JBU0VfVVJMX1BBVEggPSB7fTtcbnZhciBRVUVSWSA9IHt9O1xudmFyIEZSQUdNRU5UID0ge307XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtc3RhdGVtZW50cyAtLSBUT0RPXG52YXIgcGFyc2VVUkwgPSBmdW5jdGlvbiAodXJsLCBpbnB1dCwgc3RhdGVPdmVycmlkZSwgYmFzZSkge1xuICB2YXIgc3RhdGUgPSBzdGF0ZU92ZXJyaWRlIHx8IFNDSEVNRV9TVEFSVDtcbiAgdmFyIHBvaW50ZXIgPSAwO1xuICB2YXIgYnVmZmVyID0gJyc7XG4gIHZhciBzZWVuQXQgPSBmYWxzZTtcbiAgdmFyIHNlZW5CcmFja2V0ID0gZmFsc2U7XG4gIHZhciBzZWVuUGFzc3dvcmRUb2tlbiA9IGZhbHNlO1xuICB2YXIgY29kZVBvaW50cywgY2hhciwgYnVmZmVyQ29kZVBvaW50cywgZmFpbHVyZTtcblxuICBpZiAoIXN0YXRlT3ZlcnJpZGUpIHtcbiAgICB1cmwuc2NoZW1lID0gJyc7XG4gICAgdXJsLnVzZXJuYW1lID0gJyc7XG4gICAgdXJsLnBhc3N3b3JkID0gJyc7XG4gICAgdXJsLmhvc3QgPSBudWxsO1xuICAgIHVybC5wb3J0ID0gbnVsbDtcbiAgICB1cmwucGF0aCA9IFtdO1xuICAgIHVybC5xdWVyeSA9IG51bGw7XG4gICAgdXJsLmZyYWdtZW50ID0gbnVsbDtcbiAgICB1cmwuY2Fubm90QmVBQmFzZVVSTCA9IGZhbHNlO1xuICAgIGlucHV0ID0gaW5wdXQucmVwbGFjZShMRUFESU5HX0FORF9UUkFJTElOR19DMF9DT05UUk9MX09SX1NQQUNFLCAnJyk7XG4gIH1cblxuICBpbnB1dCA9IGlucHV0LnJlcGxhY2UoVEFCX0FORF9ORVdfTElORSwgJycpO1xuXG4gIGNvZGVQb2ludHMgPSBhcnJheUZyb20oaW5wdXQpO1xuXG4gIHdoaWxlIChwb2ludGVyIDw9IGNvZGVQb2ludHMubGVuZ3RoKSB7XG4gICAgY2hhciA9IGNvZGVQb2ludHNbcG9pbnRlcl07XG4gICAgc3dpdGNoIChzdGF0ZSkge1xuICAgICAgY2FzZSBTQ0hFTUVfU1RBUlQ6XG4gICAgICAgIGlmIChjaGFyICYmIEFMUEhBLnRlc3QoY2hhcikpIHtcbiAgICAgICAgICBidWZmZXIgKz0gY2hhci50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIHN0YXRlID0gU0NIRU1FO1xuICAgICAgICB9IGVsc2UgaWYgKCFzdGF0ZU92ZXJyaWRlKSB7XG4gICAgICAgICAgc3RhdGUgPSBOT19TQ0hFTUU7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSByZXR1cm4gSU5WQUxJRF9TQ0hFTUU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFNDSEVNRTpcbiAgICAgICAgaWYgKGNoYXIgJiYgKEFMUEhBTlVNRVJJQy50ZXN0KGNoYXIpIHx8IGNoYXIgPT0gJysnIHx8IGNoYXIgPT0gJy0nIHx8IGNoYXIgPT0gJy4nKSkge1xuICAgICAgICAgIGJ1ZmZlciArPSBjaGFyLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PSAnOicpIHtcbiAgICAgICAgICBpZiAoc3RhdGVPdmVycmlkZSAmJiAoXG4gICAgICAgICAgICAoaXNTcGVjaWFsKHVybCkgIT0gaGFzKHNwZWNpYWxTY2hlbWVzLCBidWZmZXIpKSB8fFxuICAgICAgICAgICAgKGJ1ZmZlciA9PSAnZmlsZScgJiYgKGluY2x1ZGVzQ3JlZGVudGlhbHModXJsKSB8fCB1cmwucG9ydCAhPT0gbnVsbCkpIHx8XG4gICAgICAgICAgICAodXJsLnNjaGVtZSA9PSAnZmlsZScgJiYgIXVybC5ob3N0KVxuICAgICAgICAgICkpIHJldHVybjtcbiAgICAgICAgICB1cmwuc2NoZW1lID0gYnVmZmVyO1xuICAgICAgICAgIGlmIChzdGF0ZU92ZXJyaWRlKSB7XG4gICAgICAgICAgICBpZiAoaXNTcGVjaWFsKHVybCkgJiYgc3BlY2lhbFNjaGVtZXNbdXJsLnNjaGVtZV0gPT0gdXJsLnBvcnQpIHVybC5wb3J0ID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnVmZmVyID0gJyc7XG4gICAgICAgICAgaWYgKHVybC5zY2hlbWUgPT0gJ2ZpbGUnKSB7XG4gICAgICAgICAgICBzdGF0ZSA9IEZJTEU7XG4gICAgICAgICAgfSBlbHNlIGlmIChpc1NwZWNpYWwodXJsKSAmJiBiYXNlICYmIGJhc2Uuc2NoZW1lID09IHVybC5zY2hlbWUpIHtcbiAgICAgICAgICAgIHN0YXRlID0gU1BFQ0lBTF9SRUxBVElWRV9PUl9BVVRIT1JJVFk7XG4gICAgICAgICAgfSBlbHNlIGlmIChpc1NwZWNpYWwodXJsKSkge1xuICAgICAgICAgICAgc3RhdGUgPSBTUEVDSUFMX0FVVEhPUklUWV9TTEFTSEVTO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY29kZVBvaW50c1twb2ludGVyICsgMV0gPT0gJy8nKSB7XG4gICAgICAgICAgICBzdGF0ZSA9IFBBVEhfT1JfQVVUSE9SSVRZO1xuICAgICAgICAgICAgcG9pbnRlcisrO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB1cmwuY2Fubm90QmVBQmFzZVVSTCA9IHRydWU7XG4gICAgICAgICAgICB1cmwucGF0aC5wdXNoKCcnKTtcbiAgICAgICAgICAgIHN0YXRlID0gQ0FOTk9UX0JFX0FfQkFTRV9VUkxfUEFUSDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoIXN0YXRlT3ZlcnJpZGUpIHtcbiAgICAgICAgICBidWZmZXIgPSAnJztcbiAgICAgICAgICBzdGF0ZSA9IE5PX1NDSEVNRTtcbiAgICAgICAgICBwb2ludGVyID0gMDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlIHJldHVybiBJTlZBTElEX1NDSEVNRTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgTk9fU0NIRU1FOlxuICAgICAgICBpZiAoIWJhc2UgfHwgKGJhc2UuY2Fubm90QmVBQmFzZVVSTCAmJiBjaGFyICE9ICcjJykpIHJldHVybiBJTlZBTElEX1NDSEVNRTtcbiAgICAgICAgaWYgKGJhc2UuY2Fubm90QmVBQmFzZVVSTCAmJiBjaGFyID09ICcjJykge1xuICAgICAgICAgIHVybC5zY2hlbWUgPSBiYXNlLnNjaGVtZTtcbiAgICAgICAgICB1cmwucGF0aCA9IGJhc2UucGF0aC5zbGljZSgpO1xuICAgICAgICAgIHVybC5xdWVyeSA9IGJhc2UucXVlcnk7XG4gICAgICAgICAgdXJsLmZyYWdtZW50ID0gJyc7XG4gICAgICAgICAgdXJsLmNhbm5vdEJlQUJhc2VVUkwgPSB0cnVlO1xuICAgICAgICAgIHN0YXRlID0gRlJBR01FTlQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUgPSBiYXNlLnNjaGVtZSA9PSAnZmlsZScgPyBGSUxFIDogUkVMQVRJVkU7XG4gICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICBjYXNlIFNQRUNJQUxfUkVMQVRJVkVfT1JfQVVUSE9SSVRZOlxuICAgICAgICBpZiAoY2hhciA9PSAnLycgJiYgY29kZVBvaW50c1twb2ludGVyICsgMV0gPT0gJy8nKSB7XG4gICAgICAgICAgc3RhdGUgPSBTUEVDSUFMX0FVVEhPUklUWV9JR05PUkVfU0xBU0hFUztcbiAgICAgICAgICBwb2ludGVyKys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RhdGUgPSBSRUxBVElWRTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBicmVhaztcblxuICAgICAgY2FzZSBQQVRIX09SX0FVVEhPUklUWTpcbiAgICAgICAgaWYgKGNoYXIgPT0gJy8nKSB7XG4gICAgICAgICAgc3RhdGUgPSBBVVRIT1JJVFk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RhdGUgPSBQQVRIO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgUkVMQVRJVkU6XG4gICAgICAgIHVybC5zY2hlbWUgPSBiYXNlLnNjaGVtZTtcbiAgICAgICAgaWYgKGNoYXIgPT0gRU9GKSB7XG4gICAgICAgICAgdXJsLnVzZXJuYW1lID0gYmFzZS51c2VybmFtZTtcbiAgICAgICAgICB1cmwucGFzc3dvcmQgPSBiYXNlLnBhc3N3b3JkO1xuICAgICAgICAgIHVybC5ob3N0ID0gYmFzZS5ob3N0O1xuICAgICAgICAgIHVybC5wb3J0ID0gYmFzZS5wb3J0O1xuICAgICAgICAgIHVybC5wYXRoID0gYmFzZS5wYXRoLnNsaWNlKCk7XG4gICAgICAgICAgdXJsLnF1ZXJ5ID0gYmFzZS5xdWVyeTtcbiAgICAgICAgfSBlbHNlIGlmIChjaGFyID09ICcvJyB8fCAoY2hhciA9PSAnXFxcXCcgJiYgaXNTcGVjaWFsKHVybCkpKSB7XG4gICAgICAgICAgc3RhdGUgPSBSRUxBVElWRV9TTEFTSDtcbiAgICAgICAgfSBlbHNlIGlmIChjaGFyID09ICc/Jykge1xuICAgICAgICAgIHVybC51c2VybmFtZSA9IGJhc2UudXNlcm5hbWU7XG4gICAgICAgICAgdXJsLnBhc3N3b3JkID0gYmFzZS5wYXNzd29yZDtcbiAgICAgICAgICB1cmwuaG9zdCA9IGJhc2UuaG9zdDtcbiAgICAgICAgICB1cmwucG9ydCA9IGJhc2UucG9ydDtcbiAgICAgICAgICB1cmwucGF0aCA9IGJhc2UucGF0aC5zbGljZSgpO1xuICAgICAgICAgIHVybC5xdWVyeSA9ICcnO1xuICAgICAgICAgIHN0YXRlID0gUVVFUlk7XG4gICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PSAnIycpIHtcbiAgICAgICAgICB1cmwudXNlcm5hbWUgPSBiYXNlLnVzZXJuYW1lO1xuICAgICAgICAgIHVybC5wYXNzd29yZCA9IGJhc2UucGFzc3dvcmQ7XG4gICAgICAgICAgdXJsLmhvc3QgPSBiYXNlLmhvc3Q7XG4gICAgICAgICAgdXJsLnBvcnQgPSBiYXNlLnBvcnQ7XG4gICAgICAgICAgdXJsLnBhdGggPSBiYXNlLnBhdGguc2xpY2UoKTtcbiAgICAgICAgICB1cmwucXVlcnkgPSBiYXNlLnF1ZXJ5O1xuICAgICAgICAgIHVybC5mcmFnbWVudCA9ICcnO1xuICAgICAgICAgIHN0YXRlID0gRlJBR01FTlQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdXJsLnVzZXJuYW1lID0gYmFzZS51c2VybmFtZTtcbiAgICAgICAgICB1cmwucGFzc3dvcmQgPSBiYXNlLnBhc3N3b3JkO1xuICAgICAgICAgIHVybC5ob3N0ID0gYmFzZS5ob3N0O1xuICAgICAgICAgIHVybC5wb3J0ID0gYmFzZS5wb3J0O1xuICAgICAgICAgIHVybC5wYXRoID0gYmFzZS5wYXRoLnNsaWNlKCk7XG4gICAgICAgICAgdXJsLnBhdGgucG9wKCk7XG4gICAgICAgICAgc3RhdGUgPSBQQVRIO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGJyZWFrO1xuXG4gICAgICBjYXNlIFJFTEFUSVZFX1NMQVNIOlxuICAgICAgICBpZiAoaXNTcGVjaWFsKHVybCkgJiYgKGNoYXIgPT0gJy8nIHx8IGNoYXIgPT0gJ1xcXFwnKSkge1xuICAgICAgICAgIHN0YXRlID0gU1BFQ0lBTF9BVVRIT1JJVFlfSUdOT1JFX1NMQVNIRVM7XG4gICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PSAnLycpIHtcbiAgICAgICAgICBzdGF0ZSA9IEFVVEhPUklUWTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1cmwudXNlcm5hbWUgPSBiYXNlLnVzZXJuYW1lO1xuICAgICAgICAgIHVybC5wYXNzd29yZCA9IGJhc2UucGFzc3dvcmQ7XG4gICAgICAgICAgdXJsLmhvc3QgPSBiYXNlLmhvc3Q7XG4gICAgICAgICAgdXJsLnBvcnQgPSBiYXNlLnBvcnQ7XG4gICAgICAgICAgc3RhdGUgPSBQQVRIO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGJyZWFrO1xuXG4gICAgICBjYXNlIFNQRUNJQUxfQVVUSE9SSVRZX1NMQVNIRVM6XG4gICAgICAgIHN0YXRlID0gU1BFQ0lBTF9BVVRIT1JJVFlfSUdOT1JFX1NMQVNIRVM7XG4gICAgICAgIGlmIChjaGFyICE9ICcvJyB8fCBidWZmZXIuY2hhckF0KHBvaW50ZXIgKyAxKSAhPSAnLycpIGNvbnRpbnVlO1xuICAgICAgICBwb2ludGVyKys7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFNQRUNJQUxfQVVUSE9SSVRZX0lHTk9SRV9TTEFTSEVTOlxuICAgICAgICBpZiAoY2hhciAhPSAnLycgJiYgY2hhciAhPSAnXFxcXCcpIHtcbiAgICAgICAgICBzdGF0ZSA9IEFVVEhPUklUWTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBicmVhaztcblxuICAgICAgY2FzZSBBVVRIT1JJVFk6XG4gICAgICAgIGlmIChjaGFyID09ICdAJykge1xuICAgICAgICAgIGlmIChzZWVuQXQpIGJ1ZmZlciA9ICclNDAnICsgYnVmZmVyO1xuICAgICAgICAgIHNlZW5BdCA9IHRydWU7XG4gICAgICAgICAgYnVmZmVyQ29kZVBvaW50cyA9IGFycmF5RnJvbShidWZmZXIpO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnVmZmVyQ29kZVBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNvZGVQb2ludCA9IGJ1ZmZlckNvZGVQb2ludHNbaV07XG4gICAgICAgICAgICBpZiAoY29kZVBvaW50ID09ICc6JyAmJiAhc2VlblBhc3N3b3JkVG9rZW4pIHtcbiAgICAgICAgICAgICAgc2VlblBhc3N3b3JkVG9rZW4gPSB0cnVlO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBlbmNvZGVkQ29kZVBvaW50cyA9IHBlcmNlbnRFbmNvZGUoY29kZVBvaW50LCB1c2VyaW5mb1BlcmNlbnRFbmNvZGVTZXQpO1xuICAgICAgICAgICAgaWYgKHNlZW5QYXNzd29yZFRva2VuKSB1cmwucGFzc3dvcmQgKz0gZW5jb2RlZENvZGVQb2ludHM7XG4gICAgICAgICAgICBlbHNlIHVybC51c2VybmFtZSArPSBlbmNvZGVkQ29kZVBvaW50cztcbiAgICAgICAgICB9XG4gICAgICAgICAgYnVmZmVyID0gJyc7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgY2hhciA9PSBFT0YgfHwgY2hhciA9PSAnLycgfHwgY2hhciA9PSAnPycgfHwgY2hhciA9PSAnIycgfHxcbiAgICAgICAgICAoY2hhciA9PSAnXFxcXCcgJiYgaXNTcGVjaWFsKHVybCkpXG4gICAgICAgICkge1xuICAgICAgICAgIGlmIChzZWVuQXQgJiYgYnVmZmVyID09ICcnKSByZXR1cm4gSU5WQUxJRF9BVVRIT1JJVFk7XG4gICAgICAgICAgcG9pbnRlciAtPSBhcnJheUZyb20oYnVmZmVyKS5sZW5ndGggKyAxO1xuICAgICAgICAgIGJ1ZmZlciA9ICcnO1xuICAgICAgICAgIHN0YXRlID0gSE9TVDtcbiAgICAgICAgfSBlbHNlIGJ1ZmZlciArPSBjaGFyO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBIT1NUOlxuICAgICAgY2FzZSBIT1NUTkFNRTpcbiAgICAgICAgaWYgKHN0YXRlT3ZlcnJpZGUgJiYgdXJsLnNjaGVtZSA9PSAnZmlsZScpIHtcbiAgICAgICAgICBzdGF0ZSA9IEZJTEVfSE9TVDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlIGlmIChjaGFyID09ICc6JyAmJiAhc2VlbkJyYWNrZXQpIHtcbiAgICAgICAgICBpZiAoYnVmZmVyID09ICcnKSByZXR1cm4gSU5WQUxJRF9IT1NUO1xuICAgICAgICAgIGZhaWx1cmUgPSBwYXJzZUhvc3QodXJsLCBidWZmZXIpO1xuICAgICAgICAgIGlmIChmYWlsdXJlKSByZXR1cm4gZmFpbHVyZTtcbiAgICAgICAgICBidWZmZXIgPSAnJztcbiAgICAgICAgICBzdGF0ZSA9IFBPUlQ7XG4gICAgICAgICAgaWYgKHN0YXRlT3ZlcnJpZGUgPT0gSE9TVE5BTUUpIHJldHVybjtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICBjaGFyID09IEVPRiB8fCBjaGFyID09ICcvJyB8fCBjaGFyID09ICc/JyB8fCBjaGFyID09ICcjJyB8fFxuICAgICAgICAgIChjaGFyID09ICdcXFxcJyAmJiBpc1NwZWNpYWwodXJsKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKGlzU3BlY2lhbCh1cmwpICYmIGJ1ZmZlciA9PSAnJykgcmV0dXJuIElOVkFMSURfSE9TVDtcbiAgICAgICAgICBpZiAoc3RhdGVPdmVycmlkZSAmJiBidWZmZXIgPT0gJycgJiYgKGluY2x1ZGVzQ3JlZGVudGlhbHModXJsKSB8fCB1cmwucG9ydCAhPT0gbnVsbCkpIHJldHVybjtcbiAgICAgICAgICBmYWlsdXJlID0gcGFyc2VIb3N0KHVybCwgYnVmZmVyKTtcbiAgICAgICAgICBpZiAoZmFpbHVyZSkgcmV0dXJuIGZhaWx1cmU7XG4gICAgICAgICAgYnVmZmVyID0gJyc7XG4gICAgICAgICAgc3RhdGUgPSBQQVRIX1NUQVJUO1xuICAgICAgICAgIGlmIChzdGF0ZU92ZXJyaWRlKSByZXR1cm47XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGNoYXIgPT0gJ1snKSBzZWVuQnJhY2tldCA9IHRydWU7XG4gICAgICAgICAgZWxzZSBpZiAoY2hhciA9PSAnXScpIHNlZW5CcmFja2V0ID0gZmFsc2U7XG4gICAgICAgICAgYnVmZmVyICs9IGNoYXI7XG4gICAgICAgIH0gYnJlYWs7XG5cbiAgICAgIGNhc2UgUE9SVDpcbiAgICAgICAgaWYgKERJR0lULnRlc3QoY2hhcikpIHtcbiAgICAgICAgICBidWZmZXIgKz0gY2hhcjtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICBjaGFyID09IEVPRiB8fCBjaGFyID09ICcvJyB8fCBjaGFyID09ICc/JyB8fCBjaGFyID09ICcjJyB8fFxuICAgICAgICAgIChjaGFyID09ICdcXFxcJyAmJiBpc1NwZWNpYWwodXJsKSkgfHxcbiAgICAgICAgICBzdGF0ZU92ZXJyaWRlXG4gICAgICAgICkge1xuICAgICAgICAgIGlmIChidWZmZXIgIT0gJycpIHtcbiAgICAgICAgICAgIHZhciBwb3J0ID0gcGFyc2VJbnQoYnVmZmVyLCAxMCk7XG4gICAgICAgICAgICBpZiAocG9ydCA+IDB4RkZGRikgcmV0dXJuIElOVkFMSURfUE9SVDtcbiAgICAgICAgICAgIHVybC5wb3J0ID0gKGlzU3BlY2lhbCh1cmwpICYmIHBvcnQgPT09IHNwZWNpYWxTY2hlbWVzW3VybC5zY2hlbWVdKSA/IG51bGwgOiBwb3J0O1xuICAgICAgICAgICAgYnVmZmVyID0gJyc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzdGF0ZU92ZXJyaWRlKSByZXR1cm47XG4gICAgICAgICAgc3RhdGUgPSBQQVRIX1NUQVJUO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGVsc2UgcmV0dXJuIElOVkFMSURfUE9SVDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRklMRTpcbiAgICAgICAgdXJsLnNjaGVtZSA9ICdmaWxlJztcbiAgICAgICAgaWYgKGNoYXIgPT0gJy8nIHx8IGNoYXIgPT0gJ1xcXFwnKSBzdGF0ZSA9IEZJTEVfU0xBU0g7XG4gICAgICAgIGVsc2UgaWYgKGJhc2UgJiYgYmFzZS5zY2hlbWUgPT0gJ2ZpbGUnKSB7XG4gICAgICAgICAgaWYgKGNoYXIgPT0gRU9GKSB7XG4gICAgICAgICAgICB1cmwuaG9zdCA9IGJhc2UuaG9zdDtcbiAgICAgICAgICAgIHVybC5wYXRoID0gYmFzZS5wYXRoLnNsaWNlKCk7XG4gICAgICAgICAgICB1cmwucXVlcnkgPSBiYXNlLnF1ZXJ5O1xuICAgICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PSAnPycpIHtcbiAgICAgICAgICAgIHVybC5ob3N0ID0gYmFzZS5ob3N0O1xuICAgICAgICAgICAgdXJsLnBhdGggPSBiYXNlLnBhdGguc2xpY2UoKTtcbiAgICAgICAgICAgIHVybC5xdWVyeSA9ICcnO1xuICAgICAgICAgICAgc3RhdGUgPSBRVUVSWTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT0gJyMnKSB7XG4gICAgICAgICAgICB1cmwuaG9zdCA9IGJhc2UuaG9zdDtcbiAgICAgICAgICAgIHVybC5wYXRoID0gYmFzZS5wYXRoLnNsaWNlKCk7XG4gICAgICAgICAgICB1cmwucXVlcnkgPSBiYXNlLnF1ZXJ5O1xuICAgICAgICAgICAgdXJsLmZyYWdtZW50ID0gJyc7XG4gICAgICAgICAgICBzdGF0ZSA9IEZSQUdNRU5UO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIXN0YXJ0c1dpdGhXaW5kb3dzRHJpdmVMZXR0ZXIoY29kZVBvaW50cy5zbGljZShwb2ludGVyKS5qb2luKCcnKSkpIHtcbiAgICAgICAgICAgICAgdXJsLmhvc3QgPSBiYXNlLmhvc3Q7XG4gICAgICAgICAgICAgIHVybC5wYXRoID0gYmFzZS5wYXRoLnNsaWNlKCk7XG4gICAgICAgICAgICAgIHNob3J0ZW5VUkxzUGF0aCh1cmwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RhdGUgPSBQQVRIO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0YXRlID0gUEFUSDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBicmVhaztcblxuICAgICAgY2FzZSBGSUxFX1NMQVNIOlxuICAgICAgICBpZiAoY2hhciA9PSAnLycgfHwgY2hhciA9PSAnXFxcXCcpIHtcbiAgICAgICAgICBzdGF0ZSA9IEZJTEVfSE9TVDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoYmFzZSAmJiBiYXNlLnNjaGVtZSA9PSAnZmlsZScgJiYgIXN0YXJ0c1dpdGhXaW5kb3dzRHJpdmVMZXR0ZXIoY29kZVBvaW50cy5zbGljZShwb2ludGVyKS5qb2luKCcnKSkpIHtcbiAgICAgICAgICBpZiAoaXNXaW5kb3dzRHJpdmVMZXR0ZXIoYmFzZS5wYXRoWzBdLCB0cnVlKSkgdXJsLnBhdGgucHVzaChiYXNlLnBhdGhbMF0pO1xuICAgICAgICAgIGVsc2UgdXJsLmhvc3QgPSBiYXNlLmhvc3Q7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUgPSBQQVRIO1xuICAgICAgICBjb250aW51ZTtcblxuICAgICAgY2FzZSBGSUxFX0hPU1Q6XG4gICAgICAgIGlmIChjaGFyID09IEVPRiB8fCBjaGFyID09ICcvJyB8fCBjaGFyID09ICdcXFxcJyB8fCBjaGFyID09ICc/JyB8fCBjaGFyID09ICcjJykge1xuICAgICAgICAgIGlmICghc3RhdGVPdmVycmlkZSAmJiBpc1dpbmRvd3NEcml2ZUxldHRlcihidWZmZXIpKSB7XG4gICAgICAgICAgICBzdGF0ZSA9IFBBVEg7XG4gICAgICAgICAgfSBlbHNlIGlmIChidWZmZXIgPT0gJycpIHtcbiAgICAgICAgICAgIHVybC5ob3N0ID0gJyc7XG4gICAgICAgICAgICBpZiAoc3RhdGVPdmVycmlkZSkgcmV0dXJuO1xuICAgICAgICAgICAgc3RhdGUgPSBQQVRIX1NUQVJUO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmYWlsdXJlID0gcGFyc2VIb3N0KHVybCwgYnVmZmVyKTtcbiAgICAgICAgICAgIGlmIChmYWlsdXJlKSByZXR1cm4gZmFpbHVyZTtcbiAgICAgICAgICAgIGlmICh1cmwuaG9zdCA9PSAnbG9jYWxob3N0JykgdXJsLmhvc3QgPSAnJztcbiAgICAgICAgICAgIGlmIChzdGF0ZU92ZXJyaWRlKSByZXR1cm47XG4gICAgICAgICAgICBidWZmZXIgPSAnJztcbiAgICAgICAgICAgIHN0YXRlID0gUEFUSF9TVEFSVDtcbiAgICAgICAgICB9IGNvbnRpbnVlO1xuICAgICAgICB9IGVsc2UgYnVmZmVyICs9IGNoYXI7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFBBVEhfU1RBUlQ6XG4gICAgICAgIGlmIChpc1NwZWNpYWwodXJsKSkge1xuICAgICAgICAgIHN0YXRlID0gUEFUSDtcbiAgICAgICAgICBpZiAoY2hhciAhPSAnLycgJiYgY2hhciAhPSAnXFxcXCcpIGNvbnRpbnVlO1xuICAgICAgICB9IGVsc2UgaWYgKCFzdGF0ZU92ZXJyaWRlICYmIGNoYXIgPT0gJz8nKSB7XG4gICAgICAgICAgdXJsLnF1ZXJ5ID0gJyc7XG4gICAgICAgICAgc3RhdGUgPSBRVUVSWTtcbiAgICAgICAgfSBlbHNlIGlmICghc3RhdGVPdmVycmlkZSAmJiBjaGFyID09ICcjJykge1xuICAgICAgICAgIHVybC5mcmFnbWVudCA9ICcnO1xuICAgICAgICAgIHN0YXRlID0gRlJBR01FTlQ7XG4gICAgICAgIH0gZWxzZSBpZiAoY2hhciAhPSBFT0YpIHtcbiAgICAgICAgICBzdGF0ZSA9IFBBVEg7XG4gICAgICAgICAgaWYgKGNoYXIgIT0gJy8nKSBjb250aW51ZTtcbiAgICAgICAgfSBicmVhaztcblxuICAgICAgY2FzZSBQQVRIOlxuICAgICAgICBpZiAoXG4gICAgICAgICAgY2hhciA9PSBFT0YgfHwgY2hhciA9PSAnLycgfHxcbiAgICAgICAgICAoY2hhciA9PSAnXFxcXCcgJiYgaXNTcGVjaWFsKHVybCkpIHx8XG4gICAgICAgICAgKCFzdGF0ZU92ZXJyaWRlICYmIChjaGFyID09ICc/JyB8fCBjaGFyID09ICcjJykpXG4gICAgICAgICkge1xuICAgICAgICAgIGlmIChpc0RvdWJsZURvdChidWZmZXIpKSB7XG4gICAgICAgICAgICBzaG9ydGVuVVJMc1BhdGgodXJsKTtcbiAgICAgICAgICAgIGlmIChjaGFyICE9ICcvJyAmJiAhKGNoYXIgPT0gJ1xcXFwnICYmIGlzU3BlY2lhbCh1cmwpKSkge1xuICAgICAgICAgICAgICB1cmwucGF0aC5wdXNoKCcnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGlzU2luZ2xlRG90KGJ1ZmZlcikpIHtcbiAgICAgICAgICAgIGlmIChjaGFyICE9ICcvJyAmJiAhKGNoYXIgPT0gJ1xcXFwnICYmIGlzU3BlY2lhbCh1cmwpKSkge1xuICAgICAgICAgICAgICB1cmwucGF0aC5wdXNoKCcnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHVybC5zY2hlbWUgPT0gJ2ZpbGUnICYmICF1cmwucGF0aC5sZW5ndGggJiYgaXNXaW5kb3dzRHJpdmVMZXR0ZXIoYnVmZmVyKSkge1xuICAgICAgICAgICAgICBpZiAodXJsLmhvc3QpIHVybC5ob3N0ID0gJyc7XG4gICAgICAgICAgICAgIGJ1ZmZlciA9IGJ1ZmZlci5jaGFyQXQoMCkgKyAnOic7IC8vIG5vcm1hbGl6ZSB3aW5kb3dzIGRyaXZlIGxldHRlclxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXJsLnBhdGgucHVzaChidWZmZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBidWZmZXIgPSAnJztcbiAgICAgICAgICBpZiAodXJsLnNjaGVtZSA9PSAnZmlsZScgJiYgKGNoYXIgPT0gRU9GIHx8IGNoYXIgPT0gJz8nIHx8IGNoYXIgPT0gJyMnKSkge1xuICAgICAgICAgICAgd2hpbGUgKHVybC5wYXRoLmxlbmd0aCA+IDEgJiYgdXJsLnBhdGhbMF0gPT09ICcnKSB7XG4gICAgICAgICAgICAgIHVybC5wYXRoLnNoaWZ0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjaGFyID09ICc/Jykge1xuICAgICAgICAgICAgdXJsLnF1ZXJ5ID0gJyc7XG4gICAgICAgICAgICBzdGF0ZSA9IFFVRVJZO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PSAnIycpIHtcbiAgICAgICAgICAgIHVybC5mcmFnbWVudCA9ICcnO1xuICAgICAgICAgICAgc3RhdGUgPSBGUkFHTUVOVDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnVmZmVyICs9IHBlcmNlbnRFbmNvZGUoY2hhciwgcGF0aFBlcmNlbnRFbmNvZGVTZXQpO1xuICAgICAgICB9IGJyZWFrO1xuXG4gICAgICBjYXNlIENBTk5PVF9CRV9BX0JBU0VfVVJMX1BBVEg6XG4gICAgICAgIGlmIChjaGFyID09ICc/Jykge1xuICAgICAgICAgIHVybC5xdWVyeSA9ICcnO1xuICAgICAgICAgIHN0YXRlID0gUVVFUlk7XG4gICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PSAnIycpIHtcbiAgICAgICAgICB1cmwuZnJhZ21lbnQgPSAnJztcbiAgICAgICAgICBzdGF0ZSA9IEZSQUdNRU5UO1xuICAgICAgICB9IGVsc2UgaWYgKGNoYXIgIT0gRU9GKSB7XG4gICAgICAgICAgdXJsLnBhdGhbMF0gKz0gcGVyY2VudEVuY29kZShjaGFyLCBDMENvbnRyb2xQZXJjZW50RW5jb2RlU2V0KTtcbiAgICAgICAgfSBicmVhaztcblxuICAgICAgY2FzZSBRVUVSWTpcbiAgICAgICAgaWYgKCFzdGF0ZU92ZXJyaWRlICYmIGNoYXIgPT0gJyMnKSB7XG4gICAgICAgICAgdXJsLmZyYWdtZW50ID0gJyc7XG4gICAgICAgICAgc3RhdGUgPSBGUkFHTUVOVDtcbiAgICAgICAgfSBlbHNlIGlmIChjaGFyICE9IEVPRikge1xuICAgICAgICAgIGlmIChjaGFyID09IFwiJ1wiICYmIGlzU3BlY2lhbCh1cmwpKSB1cmwucXVlcnkgKz0gJyUyNyc7XG4gICAgICAgICAgZWxzZSBpZiAoY2hhciA9PSAnIycpIHVybC5xdWVyeSArPSAnJTIzJztcbiAgICAgICAgICBlbHNlIHVybC5xdWVyeSArPSBwZXJjZW50RW5jb2RlKGNoYXIsIEMwQ29udHJvbFBlcmNlbnRFbmNvZGVTZXQpO1xuICAgICAgICB9IGJyZWFrO1xuXG4gICAgICBjYXNlIEZSQUdNRU5UOlxuICAgICAgICBpZiAoY2hhciAhPSBFT0YpIHVybC5mcmFnbWVudCArPSBwZXJjZW50RW5jb2RlKGNoYXIsIGZyYWdtZW50UGVyY2VudEVuY29kZVNldCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHBvaW50ZXIrKztcbiAgfVxufTtcblxuLy8gYFVSTGAgY29uc3RydWN0b3Jcbi8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jdXJsLWNsYXNzXG52YXIgVVJMQ29uc3RydWN0b3IgPSBmdW5jdGlvbiBVUkwodXJsIC8qICwgYmFzZSAqLykge1xuICB2YXIgdGhhdCA9IGFuSW5zdGFuY2UodGhpcywgVVJMQ29uc3RydWN0b3IsICdVUkwnKTtcbiAgdmFyIGJhc2UgPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDtcbiAgdmFyIHVybFN0cmluZyA9IFN0cmluZyh1cmwpO1xuICB2YXIgc3RhdGUgPSBzZXRJbnRlcm5hbFN0YXRlKHRoYXQsIHsgdHlwZTogJ1VSTCcgfSk7XG4gIHZhciBiYXNlU3RhdGUsIGZhaWx1cmU7XG4gIGlmIChiYXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoYmFzZSBpbnN0YW5jZW9mIFVSTENvbnN0cnVjdG9yKSBiYXNlU3RhdGUgPSBnZXRJbnRlcm5hbFVSTFN0YXRlKGJhc2UpO1xuICAgIGVsc2Uge1xuICAgICAgZmFpbHVyZSA9IHBhcnNlVVJMKGJhc2VTdGF0ZSA9IHt9LCBTdHJpbmcoYmFzZSkpO1xuICAgICAgaWYgKGZhaWx1cmUpIHRocm93IFR5cGVFcnJvcihmYWlsdXJlKTtcbiAgICB9XG4gIH1cbiAgZmFpbHVyZSA9IHBhcnNlVVJMKHN0YXRlLCB1cmxTdHJpbmcsIG51bGwsIGJhc2VTdGF0ZSk7XG4gIGlmIChmYWlsdXJlKSB0aHJvdyBUeXBlRXJyb3IoZmFpbHVyZSk7XG4gIHZhciBzZWFyY2hQYXJhbXMgPSBzdGF0ZS5zZWFyY2hQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gIHZhciBzZWFyY2hQYXJhbXNTdGF0ZSA9IGdldEludGVybmFsU2VhcmNoUGFyYW1zU3RhdGUoc2VhcmNoUGFyYW1zKTtcbiAgc2VhcmNoUGFyYW1zU3RhdGUudXBkYXRlU2VhcmNoUGFyYW1zKHN0YXRlLnF1ZXJ5KTtcbiAgc2VhcmNoUGFyYW1zU3RhdGUudXBkYXRlVVJMID0gZnVuY3Rpb24gKCkge1xuICAgIHN0YXRlLnF1ZXJ5ID0gU3RyaW5nKHNlYXJjaFBhcmFtcykgfHwgbnVsbDtcbiAgfTtcbiAgaWYgKCFERVNDUklQVE9SUykge1xuICAgIHRoYXQuaHJlZiA9IHNlcmlhbGl6ZVVSTC5jYWxsKHRoYXQpO1xuICAgIHRoYXQub3JpZ2luID0gZ2V0T3JpZ2luLmNhbGwodGhhdCk7XG4gICAgdGhhdC5wcm90b2NvbCA9IGdldFByb3RvY29sLmNhbGwodGhhdCk7XG4gICAgdGhhdC51c2VybmFtZSA9IGdldFVzZXJuYW1lLmNhbGwodGhhdCk7XG4gICAgdGhhdC5wYXNzd29yZCA9IGdldFBhc3N3b3JkLmNhbGwodGhhdCk7XG4gICAgdGhhdC5ob3N0ID0gZ2V0SG9zdC5jYWxsKHRoYXQpO1xuICAgIHRoYXQuaG9zdG5hbWUgPSBnZXRIb3N0bmFtZS5jYWxsKHRoYXQpO1xuICAgIHRoYXQucG9ydCA9IGdldFBvcnQuY2FsbCh0aGF0KTtcbiAgICB0aGF0LnBhdGhuYW1lID0gZ2V0UGF0aG5hbWUuY2FsbCh0aGF0KTtcbiAgICB0aGF0LnNlYXJjaCA9IGdldFNlYXJjaC5jYWxsKHRoYXQpO1xuICAgIHRoYXQuc2VhcmNoUGFyYW1zID0gZ2V0U2VhcmNoUGFyYW1zLmNhbGwodGhhdCk7XG4gICAgdGhhdC5oYXNoID0gZ2V0SGFzaC5jYWxsKHRoYXQpO1xuICB9XG59O1xuXG52YXIgVVJMUHJvdG90eXBlID0gVVJMQ29uc3RydWN0b3IucHJvdG90eXBlO1xuXG52YXIgc2VyaWFsaXplVVJMID0gZnVuY3Rpb24gKCkge1xuICB2YXIgdXJsID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKTtcbiAgdmFyIHNjaGVtZSA9IHVybC5zY2hlbWU7XG4gIHZhciB1c2VybmFtZSA9IHVybC51c2VybmFtZTtcbiAgdmFyIHBhc3N3b3JkID0gdXJsLnBhc3N3b3JkO1xuICB2YXIgaG9zdCA9IHVybC5ob3N0O1xuICB2YXIgcG9ydCA9IHVybC5wb3J0O1xuICB2YXIgcGF0aCA9IHVybC5wYXRoO1xuICB2YXIgcXVlcnkgPSB1cmwucXVlcnk7XG4gIHZhciBmcmFnbWVudCA9IHVybC5mcmFnbWVudDtcbiAgdmFyIG91dHB1dCA9IHNjaGVtZSArICc6JztcbiAgaWYgKGhvc3QgIT09IG51bGwpIHtcbiAgICBvdXRwdXQgKz0gJy8vJztcbiAgICBpZiAoaW5jbHVkZXNDcmVkZW50aWFscyh1cmwpKSB7XG4gICAgICBvdXRwdXQgKz0gdXNlcm5hbWUgKyAocGFzc3dvcmQgPyAnOicgKyBwYXNzd29yZCA6ICcnKSArICdAJztcbiAgICB9XG4gICAgb3V0cHV0ICs9IHNlcmlhbGl6ZUhvc3QoaG9zdCk7XG4gICAgaWYgKHBvcnQgIT09IG51bGwpIG91dHB1dCArPSAnOicgKyBwb3J0O1xuICB9IGVsc2UgaWYgKHNjaGVtZSA9PSAnZmlsZScpIG91dHB1dCArPSAnLy8nO1xuICBvdXRwdXQgKz0gdXJsLmNhbm5vdEJlQUJhc2VVUkwgPyBwYXRoWzBdIDogcGF0aC5sZW5ndGggPyAnLycgKyBwYXRoLmpvaW4oJy8nKSA6ICcnO1xuICBpZiAocXVlcnkgIT09IG51bGwpIG91dHB1dCArPSAnPycgKyBxdWVyeTtcbiAgaWYgKGZyYWdtZW50ICE9PSBudWxsKSBvdXRwdXQgKz0gJyMnICsgZnJhZ21lbnQ7XG4gIHJldHVybiBvdXRwdXQ7XG59O1xuXG52YXIgZ2V0T3JpZ2luID0gZnVuY3Rpb24gKCkge1xuICB2YXIgdXJsID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKTtcbiAgdmFyIHNjaGVtZSA9IHVybC5zY2hlbWU7XG4gIHZhciBwb3J0ID0gdXJsLnBvcnQ7XG4gIGlmIChzY2hlbWUgPT0gJ2Jsb2InKSB0cnkge1xuICAgIHJldHVybiBuZXcgVVJMKHNjaGVtZS5wYXRoWzBdKS5vcmlnaW47XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuICdudWxsJztcbiAgfVxuICBpZiAoc2NoZW1lID09ICdmaWxlJyB8fCAhaXNTcGVjaWFsKHVybCkpIHJldHVybiAnbnVsbCc7XG4gIHJldHVybiBzY2hlbWUgKyAnOi8vJyArIHNlcmlhbGl6ZUhvc3QodXJsLmhvc3QpICsgKHBvcnQgIT09IG51bGwgPyAnOicgKyBwb3J0IDogJycpO1xufTtcblxudmFyIGdldFByb3RvY29sID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKS5zY2hlbWUgKyAnOic7XG59O1xuXG52YXIgZ2V0VXNlcm5hbWUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBnZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpLnVzZXJuYW1lO1xufTtcblxudmFyIGdldFBhc3N3b3JkID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKS5wYXNzd29yZDtcbn07XG5cbnZhciBnZXRIb3N0ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgdXJsID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKTtcbiAgdmFyIGhvc3QgPSB1cmwuaG9zdDtcbiAgdmFyIHBvcnQgPSB1cmwucG9ydDtcbiAgcmV0dXJuIGhvc3QgPT09IG51bGwgPyAnJ1xuICAgIDogcG9ydCA9PT0gbnVsbCA/IHNlcmlhbGl6ZUhvc3QoaG9zdClcbiAgICA6IHNlcmlhbGl6ZUhvc3QoaG9zdCkgKyAnOicgKyBwb3J0O1xufTtcblxudmFyIGdldEhvc3RuYW1lID0gZnVuY3Rpb24gKCkge1xuICB2YXIgaG9zdCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcykuaG9zdDtcbiAgcmV0dXJuIGhvc3QgPT09IG51bGwgPyAnJyA6IHNlcmlhbGl6ZUhvc3QoaG9zdCk7XG59O1xuXG52YXIgZ2V0UG9ydCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHBvcnQgPSBnZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpLnBvcnQ7XG4gIHJldHVybiBwb3J0ID09PSBudWxsID8gJycgOiBTdHJpbmcocG9ydCk7XG59O1xuXG52YXIgZ2V0UGF0aG5hbWUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciB1cmwgPSBnZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpO1xuICB2YXIgcGF0aCA9IHVybC5wYXRoO1xuICByZXR1cm4gdXJsLmNhbm5vdEJlQUJhc2VVUkwgPyBwYXRoWzBdIDogcGF0aC5sZW5ndGggPyAnLycgKyBwYXRoLmpvaW4oJy8nKSA6ICcnO1xufTtcblxudmFyIGdldFNlYXJjaCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHF1ZXJ5ID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKS5xdWVyeTtcbiAgcmV0dXJuIHF1ZXJ5ID8gJz8nICsgcXVlcnkgOiAnJztcbn07XG5cbnZhciBnZXRTZWFyY2hQYXJhbXMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBnZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpLnNlYXJjaFBhcmFtcztcbn07XG5cbnZhciBnZXRIYXNoID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZnJhZ21lbnQgPSBnZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpLmZyYWdtZW50O1xuICByZXR1cm4gZnJhZ21lbnQgPyAnIycgKyBmcmFnbWVudCA6ICcnO1xufTtcblxudmFyIGFjY2Vzc29yRGVzY3JpcHRvciA9IGZ1bmN0aW9uIChnZXR0ZXIsIHNldHRlcikge1xuICByZXR1cm4geyBnZXQ6IGdldHRlciwgc2V0OiBzZXR0ZXIsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgZW51bWVyYWJsZTogdHJ1ZSB9O1xufTtcblxuaWYgKERFU0NSSVBUT1JTKSB7XG4gIGRlZmluZVByb3BlcnRpZXMoVVJMUHJvdG90eXBlLCB7XG4gICAgLy8gYFVSTC5wcm90b3R5cGUuaHJlZmAgYWNjZXNzb3JzIHBhaXJcbiAgICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtaHJlZlxuICAgIGhyZWY6IGFjY2Vzc29yRGVzY3JpcHRvcihzZXJpYWxpemVVUkwsIGZ1bmN0aW9uIChocmVmKSB7XG4gICAgICB2YXIgdXJsID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKTtcbiAgICAgIHZhciB1cmxTdHJpbmcgPSBTdHJpbmcoaHJlZik7XG4gICAgICB2YXIgZmFpbHVyZSA9IHBhcnNlVVJMKHVybCwgdXJsU3RyaW5nKTtcbiAgICAgIGlmIChmYWlsdXJlKSB0aHJvdyBUeXBlRXJyb3IoZmFpbHVyZSk7XG4gICAgICBnZXRJbnRlcm5hbFNlYXJjaFBhcmFtc1N0YXRlKHVybC5zZWFyY2hQYXJhbXMpLnVwZGF0ZVNlYXJjaFBhcmFtcyh1cmwucXVlcnkpO1xuICAgIH0pLFxuICAgIC8vIGBVUkwucHJvdG90eXBlLm9yaWdpbmAgZ2V0dGVyXG4gICAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsLW9yaWdpblxuICAgIG9yaWdpbjogYWNjZXNzb3JEZXNjcmlwdG9yKGdldE9yaWdpbiksXG4gICAgLy8gYFVSTC5wcm90b3R5cGUucHJvdG9jb2xgIGFjY2Vzc29ycyBwYWlyXG4gICAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsLXByb3RvY29sXG4gICAgcHJvdG9jb2w6IGFjY2Vzc29yRGVzY3JpcHRvcihnZXRQcm90b2NvbCwgZnVuY3Rpb24gKHByb3RvY29sKSB7XG4gICAgICB2YXIgdXJsID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKTtcbiAgICAgIHBhcnNlVVJMKHVybCwgU3RyaW5nKHByb3RvY29sKSArICc6JywgU0NIRU1FX1NUQVJUKTtcbiAgICB9KSxcbiAgICAvLyBgVVJMLnByb3RvdHlwZS51c2VybmFtZWAgYWNjZXNzb3JzIHBhaXJcbiAgICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtdXNlcm5hbWVcbiAgICB1c2VybmFtZTogYWNjZXNzb3JEZXNjcmlwdG9yKGdldFVzZXJuYW1lLCBmdW5jdGlvbiAodXNlcm5hbWUpIHtcbiAgICAgIHZhciB1cmwgPSBnZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpO1xuICAgICAgdmFyIGNvZGVQb2ludHMgPSBhcnJheUZyb20oU3RyaW5nKHVzZXJuYW1lKSk7XG4gICAgICBpZiAoY2Fubm90SGF2ZVVzZXJuYW1lUGFzc3dvcmRQb3J0KHVybCkpIHJldHVybjtcbiAgICAgIHVybC51c2VybmFtZSA9ICcnO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2RlUG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHVybC51c2VybmFtZSArPSBwZXJjZW50RW5jb2RlKGNvZGVQb2ludHNbaV0sIHVzZXJpbmZvUGVyY2VudEVuY29kZVNldCk7XG4gICAgICB9XG4gICAgfSksXG4gICAgLy8gYFVSTC5wcm90b3R5cGUucGFzc3dvcmRgIGFjY2Vzc29ycyBwYWlyXG4gICAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsLXBhc3N3b3JkXG4gICAgcGFzc3dvcmQ6IGFjY2Vzc29yRGVzY3JpcHRvcihnZXRQYXNzd29yZCwgZnVuY3Rpb24gKHBhc3N3b3JkKSB7XG4gICAgICB2YXIgdXJsID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKTtcbiAgICAgIHZhciBjb2RlUG9pbnRzID0gYXJyYXlGcm9tKFN0cmluZyhwYXNzd29yZCkpO1xuICAgICAgaWYgKGNhbm5vdEhhdmVVc2VybmFtZVBhc3N3b3JkUG9ydCh1cmwpKSByZXR1cm47XG4gICAgICB1cmwucGFzc3dvcmQgPSAnJztcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29kZVBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB1cmwucGFzc3dvcmQgKz0gcGVyY2VudEVuY29kZShjb2RlUG9pbnRzW2ldLCB1c2VyaW5mb1BlcmNlbnRFbmNvZGVTZXQpO1xuICAgICAgfVxuICAgIH0pLFxuICAgIC8vIGBVUkwucHJvdG90eXBlLmhvc3RgIGFjY2Vzc29ycyBwYWlyXG4gICAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsLWhvc3RcbiAgICBob3N0OiBhY2Nlc3NvckRlc2NyaXB0b3IoZ2V0SG9zdCwgZnVuY3Rpb24gKGhvc3QpIHtcbiAgICAgIHZhciB1cmwgPSBnZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpO1xuICAgICAgaWYgKHVybC5jYW5ub3RCZUFCYXNlVVJMKSByZXR1cm47XG4gICAgICBwYXJzZVVSTCh1cmwsIFN0cmluZyhob3N0KSwgSE9TVCk7XG4gICAgfSksXG4gICAgLy8gYFVSTC5wcm90b3R5cGUuaG9zdG5hbWVgIGFjY2Vzc29ycyBwYWlyXG4gICAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsLWhvc3RuYW1lXG4gICAgaG9zdG5hbWU6IGFjY2Vzc29yRGVzY3JpcHRvcihnZXRIb3N0bmFtZSwgZnVuY3Rpb24gKGhvc3RuYW1lKSB7XG4gICAgICB2YXIgdXJsID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKTtcbiAgICAgIGlmICh1cmwuY2Fubm90QmVBQmFzZVVSTCkgcmV0dXJuO1xuICAgICAgcGFyc2VVUkwodXJsLCBTdHJpbmcoaG9zdG5hbWUpLCBIT1NUTkFNRSk7XG4gICAgfSksXG4gICAgLy8gYFVSTC5wcm90b3R5cGUucG9ydGAgYWNjZXNzb3JzIHBhaXJcbiAgICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtcG9ydFxuICAgIHBvcnQ6IGFjY2Vzc29yRGVzY3JpcHRvcihnZXRQb3J0LCBmdW5jdGlvbiAocG9ydCkge1xuICAgICAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7XG4gICAgICBpZiAoY2Fubm90SGF2ZVVzZXJuYW1lUGFzc3dvcmRQb3J0KHVybCkpIHJldHVybjtcbiAgICAgIHBvcnQgPSBTdHJpbmcocG9ydCk7XG4gICAgICBpZiAocG9ydCA9PSAnJykgdXJsLnBvcnQgPSBudWxsO1xuICAgICAgZWxzZSBwYXJzZVVSTCh1cmwsIHBvcnQsIFBPUlQpO1xuICAgIH0pLFxuICAgIC8vIGBVUkwucHJvdG90eXBlLnBhdGhuYW1lYCBhY2Nlc3NvcnMgcGFpclxuICAgIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC1wYXRobmFtZVxuICAgIHBhdGhuYW1lOiBhY2Nlc3NvckRlc2NyaXB0b3IoZ2V0UGF0aG5hbWUsIGZ1bmN0aW9uIChwYXRobmFtZSkge1xuICAgICAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7XG4gICAgICBpZiAodXJsLmNhbm5vdEJlQUJhc2VVUkwpIHJldHVybjtcbiAgICAgIHVybC5wYXRoID0gW107XG4gICAgICBwYXJzZVVSTCh1cmwsIHBhdGhuYW1lICsgJycsIFBBVEhfU1RBUlQpO1xuICAgIH0pLFxuICAgIC8vIGBVUkwucHJvdG90eXBlLnNlYXJjaGAgYWNjZXNzb3JzIHBhaXJcbiAgICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtc2VhcmNoXG4gICAgc2VhcmNoOiBhY2Nlc3NvckRlc2NyaXB0b3IoZ2V0U2VhcmNoLCBmdW5jdGlvbiAoc2VhcmNoKSB7XG4gICAgICB2YXIgdXJsID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKTtcbiAgICAgIHNlYXJjaCA9IFN0cmluZyhzZWFyY2gpO1xuICAgICAgaWYgKHNlYXJjaCA9PSAnJykge1xuICAgICAgICB1cmwucXVlcnkgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCc/JyA9PSBzZWFyY2guY2hhckF0KDApKSBzZWFyY2ggPSBzZWFyY2guc2xpY2UoMSk7XG4gICAgICAgIHVybC5xdWVyeSA9ICcnO1xuICAgICAgICBwYXJzZVVSTCh1cmwsIHNlYXJjaCwgUVVFUlkpO1xuICAgICAgfVxuICAgICAgZ2V0SW50ZXJuYWxTZWFyY2hQYXJhbXNTdGF0ZSh1cmwuc2VhcmNoUGFyYW1zKS51cGRhdGVTZWFyY2hQYXJhbXModXJsLnF1ZXJ5KTtcbiAgICB9KSxcbiAgICAvLyBgVVJMLnByb3RvdHlwZS5zZWFyY2hQYXJhbXNgIGdldHRlclxuICAgIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC1zZWFyY2hwYXJhbXNcbiAgICBzZWFyY2hQYXJhbXM6IGFjY2Vzc29yRGVzY3JpcHRvcihnZXRTZWFyY2hQYXJhbXMpLFxuICAgIC8vIGBVUkwucHJvdG90eXBlLmhhc2hgIGFjY2Vzc29ycyBwYWlyXG4gICAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsLWhhc2hcbiAgICBoYXNoOiBhY2Nlc3NvckRlc2NyaXB0b3IoZ2V0SGFzaCwgZnVuY3Rpb24gKGhhc2gpIHtcbiAgICAgIHZhciB1cmwgPSBnZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpO1xuICAgICAgaGFzaCA9IFN0cmluZyhoYXNoKTtcbiAgICAgIGlmIChoYXNoID09ICcnKSB7XG4gICAgICAgIHVybC5mcmFnbWVudCA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICgnIycgPT0gaGFzaC5jaGFyQXQoMCkpIGhhc2ggPSBoYXNoLnNsaWNlKDEpO1xuICAgICAgdXJsLmZyYWdtZW50ID0gJyc7XG4gICAgICBwYXJzZVVSTCh1cmwsIGhhc2gsIEZSQUdNRU5UKTtcbiAgICB9KVxuICB9KTtcbn1cblxuLy8gYFVSTC5wcm90b3R5cGUudG9KU09OYCBtZXRob2Rcbi8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC10b2pzb25cbnJlZGVmaW5lKFVSTFByb3RvdHlwZSwgJ3RvSlNPTicsIGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgcmV0dXJuIHNlcmlhbGl6ZVVSTC5jYWxsKHRoaXMpO1xufSwgeyBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuXG4vLyBgVVJMLnByb3RvdHlwZS50b1N0cmluZ2AgbWV0aG9kXG4vLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI1VSTC1zdHJpbmdpZmljYXRpb24tYmVoYXZpb3JcbnJlZGVmaW5lKFVSTFByb3RvdHlwZSwgJ3RvU3RyaW5nJywgZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gIHJldHVybiBzZXJpYWxpemVVUkwuY2FsbCh0aGlzKTtcbn0sIHsgZW51bWVyYWJsZTogdHJ1ZSB9KTtcblxuaWYgKE5hdGl2ZVVSTCkge1xuICB2YXIgbmF0aXZlQ3JlYXRlT2JqZWN0VVJMID0gTmF0aXZlVVJMLmNyZWF0ZU9iamVjdFVSTDtcbiAgdmFyIG5hdGl2ZVJldm9rZU9iamVjdFVSTCA9IE5hdGl2ZVVSTC5yZXZva2VPYmplY3RVUkw7XG4gIC8vIGBVUkwuY3JlYXRlT2JqZWN0VVJMYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1VSTC9jcmVhdGVPYmplY3RVUkxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzIC0tIHJlcXVpcmVkIGZvciBgLmxlbmd0aGBcbiAgaWYgKG5hdGl2ZUNyZWF0ZU9iamVjdFVSTCkgcmVkZWZpbmUoVVJMQ29uc3RydWN0b3IsICdjcmVhdGVPYmplY3RVUkwnLCBmdW5jdGlvbiBjcmVhdGVPYmplY3RVUkwoYmxvYikge1xuICAgIHJldHVybiBuYXRpdmVDcmVhdGVPYmplY3RVUkwuYXBwbHkoTmF0aXZlVVJMLCBhcmd1bWVudHMpO1xuICB9KTtcbiAgLy8gYFVSTC5yZXZva2VPYmplY3RVUkxgIG1ldGhvZFxuICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvVVJML3Jldm9rZU9iamVjdFVSTFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnMgLS0gcmVxdWlyZWQgZm9yIGAubGVuZ3RoYFxuICBpZiAobmF0aXZlUmV2b2tlT2JqZWN0VVJMKSByZWRlZmluZShVUkxDb25zdHJ1Y3RvciwgJ3Jldm9rZU9iamVjdFVSTCcsIGZ1bmN0aW9uIHJldm9rZU9iamVjdFVSTCh1cmwpIHtcbiAgICByZXR1cm4gbmF0aXZlUmV2b2tlT2JqZWN0VVJMLmFwcGx5KE5hdGl2ZVVSTCwgYXJndW1lbnRzKTtcbiAgfSk7XG59XG5cbnNldFRvU3RyaW5nVGFnKFVSTENvbnN0cnVjdG9yLCAnVVJMJyk7XG5cbiQoeyBnbG9iYWw6IHRydWUsIGZvcmNlZDogIVVTRV9OQVRJVkVfVVJMLCBzaGFtOiAhREVTQ1JJUFRPUlMgfSwge1xuICBVUkw6IFVSTENvbnN0cnVjdG9yXG59KTtcblxuXG4vKioqLyB9KVxuXG4vKioqKioqLyBcdH0pO1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0uZXhwb3J0cztcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcbi8qKioqKiovIFx0XHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi8gXHRcbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi8gXHRcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyBcdC8qIHdlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyAqL1xuLyoqKioqKi8gXHQhZnVuY3Rpb24oKSB7XG4vKioqKioqLyBcdFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIGRlZmluaXRpb24pIHtcbi8qKioqKiovIFx0XHRcdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcbi8qKioqKiovIFx0XHRcdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG4vKioqKioqLyBcdFx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcbi8qKioqKiovIFx0XHRcdFx0fVxuLyoqKioqKi8gXHRcdFx0fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqLyBcdH0oKTtcbi8qKioqKiovIFx0XG4vKioqKioqLyBcdC8qIHdlYnBhY2svcnVudGltZS9nbG9iYWwgKi9cbi8qKioqKiovIFx0IWZ1bmN0aW9uKCkge1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZyA9IChmdW5jdGlvbigpIHtcbi8qKioqKiovIFx0XHRcdGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ29iamVjdCcpIHJldHVybiBnbG9iYWxUaGlzO1xuLyoqKioqKi8gXHRcdFx0dHJ5IHtcbi8qKioqKiovIFx0XHRcdFx0cmV0dXJuIHRoaXMgfHwgbmV3IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG4vKioqKioqLyBcdFx0XHR9IGNhdGNoIChlKSB7XG4vKioqKioqLyBcdFx0XHRcdGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JykgcmV0dXJuIHdpbmRvdztcbi8qKioqKiovIFx0XHRcdH1cbi8qKioqKiovIFx0XHR9KSgpO1xuLyoqKioqKi8gXHR9KCk7XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHQvKiB3ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kICovXG4vKioqKioqLyBcdCFmdW5jdGlvbigpIHtcbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmosIHByb3ApIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApOyB9XG4vKioqKioqLyBcdH0oKTtcbi8qKioqKiovIFx0XG4vKioqKioqLyBcdC8qIHdlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QgKi9cbi8qKioqKiovIFx0IWZ1bmN0aW9uKCkge1xuLyoqKioqKi8gXHRcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4vKioqKioqLyBcdFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbi8qKioqKiovIFx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4vKioqKioqLyBcdFx0XHR9XG4vKioqKioqLyBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuLyoqKioqKi8gXHRcdH07XG4vKioqKioqLyBcdH0oKTtcbi8qKioqKiovIFx0XG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xudmFyIF9fd2VicGFja19leHBvcnRzX18gPSB7fTtcbi8vIFRoaXMgZW50cnkgbmVlZCB0byBiZSB3cmFwcGVkIGluIGFuIElJRkUgYmVjYXVzZSBpdCBuZWVkIHRvIGJlIGluIHN0cmljdCBtb2RlLlxuIWZ1bmN0aW9uKCkge1xuXCJ1c2Ugc3RyaWN0XCI7XG4vLyBFU00gQ09NUEFUIEZMQUdcbl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTtcblxuLy8gRVhQT1JUU1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIHtcbiAgXCJEcm9wem9uZVwiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIHJlZXhwb3J0ICovIERyb3B6b25lOyB9LFxuICBcImRlZmF1bHRcIjogZnVuY3Rpb24oKSB7IHJldHVybiAvKiBiaW5kaW5nICovIGRyb3B6b25lX2Rpc3Q7IH1cbn0pO1xuXG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5jb25jYXQuanNcbnZhciBlc19hcnJheV9jb25jYXQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIyMjIpO1xuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZmlsdGVyLmpzXG52YXIgZXNfYXJyYXlfZmlsdGVyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3MzI3KTtcbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmluZGV4LW9mLmpzXG52YXIgZXNfYXJyYXlfaW5kZXhfb2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI3NzIpO1xuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3IuanNcbnZhciBlc19hcnJheV9pdGVyYXRvciA9IF9fd2VicGFja19yZXF1aXJlX18oNjk5Mik7XG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5tYXAuanNcbnZhciBlc19hcnJheV9tYXAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyNDkpO1xuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuc2xpY2UuanNcbnZhciBlc19hcnJheV9zbGljZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzA0Mik7XG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5zcGxpY2UuanNcbnZhciBlc19hcnJheV9zcGxpY2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU2MSk7XG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS1idWZmZXIuY29uc3RydWN0b3IuanNcbnZhciBlc19hcnJheV9idWZmZXJfY29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgyNjQpO1xuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuZnVuY3Rpb24ubmFtZS5qc1xudmFyIGVzX2Z1bmN0aW9uX25hbWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgzMDkpO1xuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmdldC1wcm90b3R5cGUtb2YuanNcbnZhciBlc19vYmplY3RfZ2V0X3Byb3RvdHlwZV9vZiA9IF9fd2VicGFja19yZXF1aXJlX18oNDg5KTtcbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcuanNcbnZhciBlc19vYmplY3RfdG9fc3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNTM5KTtcbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5leGVjLmpzXG52YXIgZXNfcmVnZXhwX2V4ZWMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ5MTYpO1xuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLnRvLXN0cmluZy5qc1xudmFyIGVzX3JlZ2V4cF90b19zdHJpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk3MTQpO1xuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLml0ZXJhdG9yLmpzXG52YXIgZXNfc3RyaW5nX2l0ZXJhdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NzgzKTtcbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5tYXRjaC5qc1xudmFyIGVzX3N0cmluZ19tYXRjaCA9IF9fd2VicGFja19yZXF1aXJlX18oNDcyMyk7XG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcucmVwbGFjZS5qc1xudmFyIGVzX3N0cmluZ19yZXBsYWNlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1MzA2KTtcbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zcGxpdC5qc1xudmFyIGVzX3N0cmluZ19zcGxpdCA9IF9fd2VicGFja19yZXF1aXJlX18oMzEyMyk7XG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcudHJpbS5qc1xudmFyIGVzX3N0cmluZ190cmltID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMjEwKTtcbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnVpbnQ4LWFycmF5LmpzXG52YXIgZXNfdHlwZWRfYXJyYXlfdWludDhfYXJyYXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI0NzIpO1xuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuY29weS13aXRoaW4uanNcbnZhciBlc190eXBlZF9hcnJheV9jb3B5X3dpdGhpbiA9IF9fd2VicGFja19yZXF1aXJlX18oMjk5MCk7XG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5ldmVyeS5qc1xudmFyIGVzX3R5cGVkX2FycmF5X2V2ZXJ5ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4OTI3KTtcbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmZpbGwuanNcbnZhciBlc190eXBlZF9hcnJheV9maWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMTA1KTtcbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmZpbHRlci5qc1xudmFyIGVzX3R5cGVkX2FycmF5X2ZpbHRlciA9IF9fd2VicGFja19yZXF1aXJlX18oNTAzNSk7XG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5maW5kLmpzXG52YXIgZXNfdHlwZWRfYXJyYXlfZmluZCA9IF9fd2VicGFja19yZXF1aXJlX18oNDM0NSk7XG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5maW5kLWluZGV4LmpzXG52YXIgZXNfdHlwZWRfYXJyYXlfZmluZF9pbmRleCA9IF9fd2VicGFja19yZXF1aXJlX18oNzE3NCk7XG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5mb3ItZWFjaC5qc1xudmFyIGVzX3R5cGVkX2FycmF5X2Zvcl9lYWNoID0gX193ZWJwYWNrX3JlcXVpcmVfXygyODQ2KTtcbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmluY2x1ZGVzLmpzXG52YXIgZXNfdHlwZWRfYXJyYXlfaW5jbHVkZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ3MzEpO1xuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuaW5kZXgtb2YuanNcbnZhciBlc190eXBlZF9hcnJheV9pbmRleF9vZiA9IF9fd2VicGFja19yZXF1aXJlX18oNzIwOSk7XG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5pdGVyYXRvci5qc1xudmFyIGVzX3R5cGVkX2FycmF5X2l0ZXJhdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2MzE5KTtcbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmpvaW4uanNcbnZhciBlc190eXBlZF9hcnJheV9qb2luID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4ODY3KTtcbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5Lmxhc3QtaW5kZXgtb2YuanNcbnZhciBlc190eXBlZF9hcnJheV9sYXN0X2luZGV4X29mID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3Nzg5KTtcbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5Lm1hcC5qc1xudmFyIGVzX3R5cGVkX2FycmF5X21hcCA9IF9fd2VicGFja19yZXF1aXJlX18oMzczOSk7XG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5yZWR1Y2UuanNcbnZhciBlc190eXBlZF9hcnJheV9yZWR1Y2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkzNjgpO1xuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkucmVkdWNlLXJpZ2h0LmpzXG52YXIgZXNfdHlwZWRfYXJyYXlfcmVkdWNlX3JpZ2h0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NDgzKTtcbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnJldmVyc2UuanNcbnZhciBlc190eXBlZF9hcnJheV9yZXZlcnNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMDU2KTtcbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnNldC5qc1xudmFyIGVzX3R5cGVkX2FycmF5X3NldCA9IF9fd2VicGFja19yZXF1aXJlX18oMzQ2Mik7XG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5zbGljZS5qc1xudmFyIGVzX3R5cGVkX2FycmF5X3NsaWNlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NzgpO1xuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuc29tZS5qc1xudmFyIGVzX3R5cGVkX2FycmF5X3NvbWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc0NjIpO1xuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuc29ydC5qc1xudmFyIGVzX3R5cGVkX2FycmF5X3NvcnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM4MjQpO1xuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuc3ViYXJyYXkuanNcbnZhciBlc190eXBlZF9hcnJheV9zdWJhcnJheSA9IF9fd2VicGFja19yZXF1aXJlX18oNTAyMSk7XG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS50by1sb2NhbGUtc3RyaW5nLmpzXG52YXIgZXNfdHlwZWRfYXJyYXlfdG9fbG9jYWxlX3N0cmluZyA9IF9fd2VicGFja19yZXF1aXJlX18oMjk3NCk7XG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS50by1zdHJpbmcuanNcbnZhciBlc190eXBlZF9hcnJheV90b19zdHJpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUwMTYpO1xuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5mb3ItZWFjaC5qc1xudmFyIHdlYl9kb21fY29sbGVjdGlvbnNfZm9yX2VhY2ggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ3NDcpO1xuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5pdGVyYXRvci5qc1xudmFyIHdlYl9kb21fY29sbGVjdGlvbnNfaXRlcmF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM5NDgpO1xuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC5qc1xudmFyIHdlYl91cmwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI4NSk7XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZW1pdHRlci5qc1xuXG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG8sIGFsbG93QXJyYXlMaWtlKSB7IHZhciBpdDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgeyBpZiAoaXQpIG8gPSBpdDsgdmFyIGkgPSAwOyB2YXIgRiA9IGZ1bmN0aW9uIEYoKSB7fTsgcmV0dXJuIHsgczogRiwgbjogZnVuY3Rpb24gbigpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfSwgZTogZnVuY3Rpb24gZShfZSkgeyB0aHJvdyBfZTsgfSwgZjogRiB9OyB9IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSB2YXIgbm9ybWFsQ29tcGxldGlvbiA9IHRydWUsIGRpZEVyciA9IGZhbHNlLCBlcnI7IHJldHVybiB7IHM6IGZ1bmN0aW9uIHMoKSB7IGl0ID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IH0sIG46IGZ1bmN0aW9uIG4oKSB7IHZhciBzdGVwID0gaXQubmV4dCgpOyBub3JtYWxDb21wbGV0aW9uID0gc3RlcC5kb25lOyByZXR1cm4gc3RlcDsgfSwgZTogZnVuY3Rpb24gZShfZTIpIHsgZGlkRXJyID0gdHJ1ZTsgZXJyID0gX2UyOyB9LCBmOiBmdW5jdGlvbiBmKCkgeyB0cnkgeyBpZiAoIW5vcm1hbENvbXBsZXRpb24gJiYgaXQucmV0dXJuICE9IG51bGwpIGl0LnJldHVybigpOyB9IGZpbmFsbHkgeyBpZiAoZGlkRXJyKSB0aHJvdyBlcnI7IH0gfSB9OyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG4vLyBUaGUgRW1pdHRlciBjbGFzcyBwcm92aWRlcyB0aGUgYWJpbGl0eSB0byBjYWxsIGAub24oKWAgb24gRHJvcHpvbmUgdG8gbGlzdGVuXG4vLyB0byBldmVudHMuXG4vLyBJdCBpcyBzdHJvbmdseSBiYXNlZCBvbiBjb21wb25lbnQncyBlbWl0dGVyIGNsYXNzLCBhbmQgSSByZW1vdmVkIHRoZVxuLy8gZnVuY3Rpb25hbGl0eSBiZWNhdXNlIG9mIHRoZSBkZXBlbmRlbmN5IGhlbGwgd2l0aCBkaWZmZXJlbnQgZnJhbWV3b3Jrcy5cbnZhciBFbWl0dGVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRW1pdHRlcigpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRW1pdHRlcik7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoRW1pdHRlciwgW3tcbiAgICBrZXk6IFwib25cIixcbiAgICB2YWx1ZTogLy8gQWRkIGFuIGV2ZW50IGxpc3RlbmVyIGZvciBnaXZlbiBldmVudFxuICAgIGZ1bmN0aW9uIG9uKGV2ZW50LCBmbikge1xuICAgICAgdGhpcy5fY2FsbGJhY2tzID0gdGhpcy5fY2FsbGJhY2tzIHx8IHt9OyAvLyBDcmVhdGUgbmFtZXNwYWNlIGZvciB0aGlzIGV2ZW50XG5cbiAgICAgIGlmICghdGhpcy5fY2FsbGJhY2tzW2V2ZW50XSkge1xuICAgICAgICB0aGlzLl9jYWxsYmFja3NbZXZlbnRdID0gW107XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2NhbGxiYWNrc1tldmVudF0ucHVzaChmbik7XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJlbWl0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVtaXQoZXZlbnQpIHtcbiAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcyB8fCB7fTtcbiAgICAgIHZhciBjYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3NbZXZlbnRdO1xuXG4gICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2FsbGJhY2tzKSB7XG4gICAgICAgIHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihjYWxsYmFja3MsIHRydWUpLFxuICAgICAgICAgICAgX3N0ZXA7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykge1xuICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gX3N0ZXAudmFsdWU7XG4gICAgICAgICAgICBjYWxsYmFjay5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIF9pdGVyYXRvci5lKGVycik7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgX2l0ZXJhdG9yLmYoKTtcbiAgICAgICAgfVxuICAgICAgfSAvLyB0cmlnZ2VyIGEgY29ycmVzcG9uZGluZyBET00gZXZlbnRcblxuXG4gICAgICBpZiAodGhpcy5lbGVtZW50KSB7XG4gICAgICAgIHRoaXMuZWxlbWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubWFrZUV2ZW50KFwiZHJvcHpvbmU6XCIgKyBldmVudCwge1xuICAgICAgICAgIGFyZ3M6IGFyZ3NcbiAgICAgICAgfSkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibWFrZUV2ZW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1ha2VFdmVudChldmVudE5hbWUsIGRldGFpbCkge1xuICAgICAgdmFyIHBhcmFtcyA9IHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY2FuY2VsYWJsZTogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiBkZXRhaWxcbiAgICAgIH07XG5cbiAgICAgIGlmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDdXN0b21FdmVudChldmVudE5hbWUsIHBhcmFtcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJRSAxMSBzdXBwb3J0XG4gICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9DdXN0b21FdmVudC9DdXN0b21FdmVudFxuICAgICAgICB2YXIgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJDdXN0b21FdmVudFwiKTtcbiAgICAgICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudE5hbWUsIHBhcmFtcy5idWJibGVzLCBwYXJhbXMuY2FuY2VsYWJsZSwgcGFyYW1zLmRldGFpbCk7XG4gICAgICAgIHJldHVybiBldnQ7XG4gICAgICB9XG4gICAgfSAvLyBSZW1vdmUgZXZlbnQgbGlzdGVuZXIgZm9yIGdpdmVuIGV2ZW50LiBJZiBmbiBpcyBub3QgcHJvdmlkZWQsIGFsbCBldmVudFxuICAgIC8vIGxpc3RlbmVycyBmb3IgdGhhdCBldmVudCB3aWxsIGJlIHJlbW92ZWQuIElmIG5laXRoZXIgaXMgcHJvdmlkZWQsIGFsbFxuICAgIC8vIGV2ZW50IGxpc3RlbmVycyB3aWxsIGJlIHJlbW92ZWQuXG5cbiAgfSwge1xuICAgIGtleTogXCJvZmZcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gb2ZmKGV2ZW50LCBmbikge1xuICAgICAgaWYgKCF0aGlzLl9jYWxsYmFja3MgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSB7fTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IC8vIHNwZWNpZmljIGV2ZW50XG5cblxuICAgICAgdmFyIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrc1tldmVudF07XG5cbiAgICAgIGlmICghY2FsbGJhY2tzKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSAvLyByZW1vdmUgYWxsIGhhbmRsZXJzXG5cblxuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuX2NhbGxiYWNrc1tldmVudF07XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSAvLyByZW1vdmUgc3BlY2lmaWMgaGFuZGxlclxuXG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjYWxsYmFjayA9IGNhbGxiYWNrc1tpXTtcblxuICAgICAgICBpZiAoY2FsbGJhY2sgPT09IGZuKSB7XG4gICAgICAgICAgY2FsbGJhY2tzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRW1pdHRlcjtcbn0oKTtcblxuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvcHJldmlldy10ZW1wbGF0ZS5odG1sXG4vLyBNb2R1bGVcbnZhciBjb2RlID0gXCI8ZGl2IGNsYXNzPVxcXCJkei1wcmV2aWV3IGR6LWZpbGUtcHJldmlld1xcXCI+IDxkaXYgY2xhc3M9XFxcImR6LWltYWdlXFxcIj48aW1nIGRhdGEtZHotdGh1bWJuYWlsLz48L2Rpdj4gPGRpdiBjbGFzcz1cXFwiZHotZGV0YWlsc1xcXCI+IDxkaXYgY2xhc3M9XFxcImR6LXNpemVcXFwiPjxzcGFuIGRhdGEtZHotc2l6ZT48L3NwYW4+PC9kaXY+IDxkaXYgY2xhc3M9XFxcImR6LWZpbGVuYW1lXFxcIj48c3BhbiBkYXRhLWR6LW5hbWU+PC9zcGFuPjwvZGl2PiA8L2Rpdj4gPGRpdiBjbGFzcz1cXFwiZHotcHJvZ3Jlc3NcXFwiPiA8c3BhbiBjbGFzcz1cXFwiZHotdXBsb2FkXFxcIiBkYXRhLWR6LXVwbG9hZHByb2dyZXNzPjwvc3Bhbj4gPC9kaXY+IDxkaXYgY2xhc3M9XFxcImR6LWVycm9yLW1lc3NhZ2VcXFwiPjxzcGFuIGRhdGEtZHotZXJyb3JtZXNzYWdlPjwvc3Bhbj48L2Rpdj4gPGRpdiBjbGFzcz1cXFwiZHotc3VjY2Vzcy1tYXJrXFxcIj4gPHN2ZyB3aWR0aD1cXFwiNTRweFxcXCIgaGVpZ2h0PVxcXCI1NHB4XFxcIiB2aWV3Qm94PVxcXCIwIDAgNTQgNTRcXFwiIHZlcnNpb249XFxcIjEuMVxcXCIgeG1sbnM9XFxcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXFxcIiB4bWxuczp4bGluaz1cXFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1xcXCI+IDx0aXRsZT5DaGVjazwvdGl0bGU+IDxnIHN0cm9rZT1cXFwibm9uZVxcXCIgc3Ryb2tlLXdpZHRoPVxcXCIxXFxcIiBmaWxsPVxcXCJub25lXFxcIiBmaWxsLXJ1bGU9XFxcImV2ZW5vZGRcXFwiPiA8cGF0aCBkPVxcXCJNMjMuNSwzMS44NDMxNDU4IEwxNy41ODUyNDE5LDI1LjkyODM4NzcgQzE2LjAyNDgyNTMsMjQuMzY3OTcxMSAxMy40OTEwMjk0LDI0LjM2NjgzNSAxMS45Mjg5MzIyLDI1LjkyODkzMjIgQzEwLjM3MDAxMzYsMjcuNDg3ODUwOCAxMC4zNjY1OTEyLDMwLjAyMzQ0NTUgMTEuOTI4Mzg3NywzMS41ODUyNDE5IEwyMC40MTQ3NTgxLDQwLjA3MTYxMjMgQzIwLjUxMzM5OTksNDAuMTcwMjU0MSAyMC42MTU5MzE1LDQwLjI2MjY2NDkgMjAuNzIxODYxNSw0MC4zNDg4NDM1IEMyMi4yODM1NjY5LDQxLjg3MjU2NTEgMjQuNzk0MjM0LDQxLjg2MjYyMDIgMjYuMzQ2MTU2NCw0MC4zMTA2OTc4IEw0My4zMTA2OTc4LDIzLjM0NjE1NjQgQzQ0Ljg3NzEwMjEsMjEuNzc5NzUyMSA0NC44NzU4MDU3LDE5LjI0ODM4ODcgNDMuMzEzNzA4NSwxNy42ODYyOTE1IEM0MS43NTQ3ODk5LDE2LjEyNzM3MjkgMzkuMjE3NjAzNSwxNi4xMjU1NDIyIDM3LjY1Mzg0MzYsMTcuNjg5MzAyMiBMMjMuNSwzMS44NDMxNDU4IFogTTI3LDUzIEM0MS4zNTk0MDM1LDUzIDUzLDQxLjM1OTQwMzUgNTMsMjcgQzUzLDEyLjY0MDU5NjUgNDEuMzU5NDAzNSwxIDI3LDEgQzEyLjY0MDU5NjUsMSAxLDEyLjY0MDU5NjUgMSwyNyBDMSw0MS4zNTk0MDM1IDEyLjY0MDU5NjUsNTMgMjcsNTMgWlxcXCIgc3Ryb2tlLW9wYWNpdHk9XFxcIjAuMTk4Nzk0MTU4XFxcIiBzdHJva2U9XFxcIiM3NDc0NzRcXFwiIGZpbGwtb3BhY2l0eT1cXFwiMC44MTY1MTk0NzVcXFwiIGZpbGw9XFxcIiNGRkZGRkZcXFwiPjwvcGF0aD4gPC9nPiA8L3N2Zz4gPC9kaXY+IDxkaXYgY2xhc3M9XFxcImR6LWVycm9yLW1hcmtcXFwiPiA8c3ZnIHdpZHRoPVxcXCI1NHB4XFxcIiBoZWlnaHQ9XFxcIjU0cHhcXFwiIHZpZXdCb3g9XFxcIjAgMCA1NCA1NFxcXCIgdmVyc2lvbj1cXFwiMS4xXFxcIiB4bWxucz1cXFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcXFwiIHhtbG5zOnhsaW5rPVxcXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXFxcIj4gPHRpdGxlPkVycm9yPC90aXRsZT4gPGcgc3Ryb2tlPVxcXCJub25lXFxcIiBzdHJva2Utd2lkdGg9XFxcIjFcXFwiIGZpbGw9XFxcIm5vbmVcXFwiIGZpbGwtcnVsZT1cXFwiZXZlbm9kZFxcXCI+IDxnIHN0cm9rZT1cXFwiIzc0NzQ3NFxcXCIgc3Ryb2tlLW9wYWNpdHk9XFxcIjAuMTk4Nzk0MTU4XFxcIiBmaWxsPVxcXCIjRkZGRkZGXFxcIiBmaWxsLW9wYWNpdHk9XFxcIjAuODE2NTE5NDc1XFxcIj4gPHBhdGggZD1cXFwiTTMyLjY1Njg1NDIsMjkgTDM4LjMxMDY5NzgsMjMuMzQ2MTU2NCBDMzkuODc3MTAyMSwyMS43Nzk3NTIxIDM5Ljg3NTgwNTcsMTkuMjQ4Mzg4NyAzOC4zMTM3MDg1LDE3LjY4NjI5MTUgQzM2Ljc1NDc4OTksMTYuMTI3MzcyOSAzNC4yMTc2MDM1LDE2LjEyNTU0MjIgMzIuNjUzODQzNiwxNy42ODkzMDIyIEwyNywyMy4zNDMxNDU4IEwyMS4zNDYxNTY0LDE3LjY4OTMwMjIgQzE5Ljc4MjM5NjUsMTYuMTI1NTQyMiAxNy4yNDUyMTAxLDE2LjEyNzM3MjkgMTUuNjg2MjkxNSwxNy42ODYyOTE1IEMxNC4xMjQxOTQzLDE5LjI0ODM4ODcgMTQuMTIyODk3OSwyMS43Nzk3NTIxIDE1LjY4OTMwMjIsMjMuMzQ2MTU2NCBMMjEuMzQzMTQ1OCwyOSBMMTUuNjg5MzAyMiwzNC42NTM4NDM2IEMxNC4xMjI4OTc5LDM2LjIyMDI0NzkgMTQuMTI0MTk0MywzOC43NTE2MTEzIDE1LjY4NjI5MTUsNDAuMzEzNzA4NSBDMTcuMjQ1MjEwMSw0MS44NzI2MjcxIDE5Ljc4MjM5NjUsNDEuODc0NDU3OCAyMS4zNDYxNTY0LDQwLjMxMDY5NzggTDI3LDM0LjY1Njg1NDIgTDMyLjY1Mzg0MzYsNDAuMzEwNjk3OCBDMzQuMjE3NjAzNSw0MS44NzQ0NTc4IDM2Ljc1NDc4OTksNDEuODcyNjI3MSAzOC4zMTM3MDg1LDQwLjMxMzcwODUgQzM5Ljg3NTgwNTcsMzguNzUxNjExMyAzOS44NzcxMDIxLDM2LjIyMDI0NzkgMzguMzEwNjk3OCwzNC42NTM4NDM2IEwzMi42NTY4NTQyLDI5IFogTTI3LDUzIEM0MS4zNTk0MDM1LDUzIDUzLDQxLjM1OTQwMzUgNTMsMjcgQzUzLDEyLjY0MDU5NjUgNDEuMzU5NDAzNSwxIDI3LDEgQzEyLjY0MDU5NjUsMSAxLDEyLjY0MDU5NjUgMSwyNyBDMSw0MS4zNTk0MDM1IDEyLjY0MDU5NjUsNTMgMjcsNTMgWlxcXCI+PC9wYXRoPiA8L2c+IDwvZz4gPC9zdmc+IDwvZGl2PiA8L2Rpdj4gXCI7XG4vLyBFeHBvcnRzXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBwcmV2aWV3X3RlbXBsYXRlID0gKGNvZGUpO1xuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL29wdGlvbnMuanNcblxuXG5cblxuXG5mdW5jdGlvbiBvcHRpb25zX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobywgYWxsb3dBcnJheUxpa2UpIHsgdmFyIGl0OyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBvcHRpb25zX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgeyBpZiAoaXQpIG8gPSBpdDsgdmFyIGkgPSAwOyB2YXIgRiA9IGZ1bmN0aW9uIEYoKSB7fTsgcmV0dXJuIHsgczogRiwgbjogZnVuY3Rpb24gbigpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfSwgZTogZnVuY3Rpb24gZShfZSkgeyB0aHJvdyBfZTsgfSwgZjogRiB9OyB9IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSB2YXIgbm9ybWFsQ29tcGxldGlvbiA9IHRydWUsIGRpZEVyciA9IGZhbHNlLCBlcnI7IHJldHVybiB7IHM6IGZ1bmN0aW9uIHMoKSB7IGl0ID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IH0sIG46IGZ1bmN0aW9uIG4oKSB7IHZhciBzdGVwID0gaXQubmV4dCgpOyBub3JtYWxDb21wbGV0aW9uID0gc3RlcC5kb25lOyByZXR1cm4gc3RlcDsgfSwgZTogZnVuY3Rpb24gZShfZTIpIHsgZGlkRXJyID0gdHJ1ZTsgZXJyID0gX2UyOyB9LCBmOiBmdW5jdGlvbiBmKCkgeyB0cnkgeyBpZiAoIW5vcm1hbENvbXBsZXRpb24gJiYgaXQucmV0dXJuICE9IG51bGwpIGl0LnJldHVybigpOyB9IGZpbmFsbHkgeyBpZiAoZGlkRXJyKSB0aHJvdyBlcnI7IH0gfSB9OyB9XG5cbmZ1bmN0aW9uIG9wdGlvbnNfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBvcHRpb25zX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBvcHRpb25zX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBvcHRpb25zX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cblxuXG52YXIgZGVmYXVsdE9wdGlvbnMgPSB7XG4gIC8qKlxuICAgKiBIYXMgdG8gYmUgc3BlY2lmaWVkIG9uIGVsZW1lbnRzIG90aGVyIHRoYW4gZm9ybSAob3Igd2hlbiB0aGUgZm9ybVxuICAgKiBkb2Vzbid0IGhhdmUgYW4gYGFjdGlvbmAgYXR0cmlidXRlKS4gWW91IGNhbiBhbHNvXG4gICAqIHByb3ZpZGUgYSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHdpdGggYGZpbGVzYCBhbmRcbiAgICogbXVzdCByZXR1cm4gdGhlIHVybCAoc2luY2UgYHYzLjEyLjBgKVxuICAgKi9cbiAgdXJsOiBudWxsLFxuXG4gIC8qKlxuICAgKiBDYW4gYmUgY2hhbmdlZCB0byBgXCJwdXRcImAgaWYgbmVjZXNzYXJ5LiBZb3UgY2FuIGFsc28gcHJvdmlkZSBhIGZ1bmN0aW9uXG4gICAqIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2l0aCBgZmlsZXNgIGFuZCBtdXN0IHJldHVybiB0aGUgbWV0aG9kIChzaW5jZSBgdjMuMTIuMGApLlxuICAgKi9cbiAgbWV0aG9kOiBcInBvc3RcIixcblxuICAvKipcbiAgICogV2lsbCBiZSBzZXQgb24gdGhlIFhIUmVxdWVzdC5cbiAgICovXG4gIHdpdGhDcmVkZW50aWFsczogZmFsc2UsXG5cbiAgLyoqXG4gICAqIFRoZSB0aW1lb3V0IGZvciB0aGUgWEhSIHJlcXVlc3RzIGluIG1pbGxpc2Vjb25kcyAoc2luY2UgYHY0LjQuMGApLlxuICAgKiBJZiBzZXQgdG8gbnVsbCBvciAwLCBubyB0aW1lb3V0IGlzIGdvaW5nIHRvIGJlIHNldC5cbiAgICovXG4gIHRpbWVvdXQ6IG51bGwsXG5cbiAgLyoqXG4gICAqIEhvdyBtYW55IGZpbGUgdXBsb2FkcyB0byBwcm9jZXNzIGluIHBhcmFsbGVsIChTZWUgdGhlXG4gICAqIEVucXVldWluZyBmaWxlIHVwbG9hZHMgZG9jdW1lbnRhdGlvbiBzZWN0aW9uIGZvciBtb3JlIGluZm8pXG4gICAqL1xuICBwYXJhbGxlbFVwbG9hZHM6IDIsXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc2VuZCBtdWx0aXBsZSBmaWxlcyBpbiBvbmUgcmVxdWVzdC4gSWZcbiAgICogdGhpcyBpdCBzZXQgdG8gdHJ1ZSwgdGhlbiB0aGUgZmFsbGJhY2sgZmlsZSBpbnB1dCBlbGVtZW50IHdpbGxcbiAgICogaGF2ZSB0aGUgYG11bHRpcGxlYCBhdHRyaWJ1dGUgYXMgd2VsbC4gVGhpcyBvcHRpb24gd2lsbFxuICAgKiBhbHNvIHRyaWdnZXIgYWRkaXRpb25hbCBldmVudHMgKGxpa2UgYHByb2Nlc3NpbmdtdWx0aXBsZWApLiBTZWUgdGhlIGV2ZW50c1xuICAgKiBkb2N1bWVudGF0aW9uIHNlY3Rpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAqL1xuICB1cGxvYWRNdWx0aXBsZTogZmFsc2UsXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgeW91IHdhbnQgZmlsZXMgdG8gYmUgdXBsb2FkZWQgaW4gY2h1bmtzIHRvIHlvdXIgc2VydmVyLiBUaGlzIGNhbid0IGJlXG4gICAqIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aCBgdXBsb2FkTXVsdGlwbGVgLlxuICAgKlxuICAgKiBTZWUgW2NodW5rc1VwbG9hZGVkXSgjY29uZmlnLWNodW5rc1VwbG9hZGVkKSBmb3IgdGhlIGNhbGxiYWNrIHRvIGZpbmFsaXNlIGFuIHVwbG9hZC5cbiAgICovXG4gIGNodW5raW5nOiBmYWxzZSxcblxuICAvKipcbiAgICogSWYgYGNodW5raW5nYCBpcyBlbmFibGVkLCB0aGlzIGRlZmluZXMgd2hldGhlciAqKmV2ZXJ5KiogZmlsZSBzaG91bGQgYmUgY2h1bmtlZCxcbiAgICogZXZlbiBpZiB0aGUgZmlsZSBzaXplIGlzIGJlbG93IGNodW5rU2l6ZS4gVGhpcyBtZWFucywgdGhhdCB0aGUgYWRkaXRpb25hbCBjaHVua1xuICAgKiBmb3JtIGRhdGEgd2lsbCBiZSBzdWJtaXR0ZWQgYW5kIHRoZSBgY2h1bmtzVXBsb2FkZWRgIGNhbGxiYWNrIHdpbGwgYmUgaW52b2tlZC5cbiAgICovXG4gIGZvcmNlQ2h1bmtpbmc6IGZhbHNlLFxuXG4gIC8qKlxuICAgKiBJZiBgY2h1bmtpbmdgIGlzIGB0cnVlYCwgdGhlbiB0aGlzIGRlZmluZXMgdGhlIGNodW5rIHNpemUgaW4gYnl0ZXMuXG4gICAqL1xuICBjaHVua1NpemU6IDIwMDAwMDAsXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhlIGluZGl2aWR1YWwgY2h1bmtzIG9mIGEgZmlsZSBhcmUgYmVpbmcgdXBsb2FkZWQgc2ltdWx0YW5lb3VzbHkuXG4gICAqL1xuICBwYXJhbGxlbENodW5rVXBsb2FkczogZmFsc2UsXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYSBjaHVuayBzaG91bGQgYmUgcmV0cmllZCBpZiBpdCBmYWlscy5cbiAgICovXG4gIHJldHJ5Q2h1bmtzOiBmYWxzZSxcblxuICAvKipcbiAgICogSWYgYHJldHJ5Q2h1bmtzYCBpcyB0cnVlLCBob3cgbWFueSB0aW1lcyBzaG91bGQgaXQgYmUgcmV0cmllZC5cbiAgICovXG4gIHJldHJ5Q2h1bmtzTGltaXQ6IDMsXG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIGZpbGVzaXplIChpbiBieXRlcykgdGhhdCBpcyBhbGxvd2VkIHRvIGJlIHVwbG9hZGVkLlxuICAgKi9cbiAgbWF4RmlsZXNpemU6IDI1NixcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGZpbGUgcGFyYW0gdGhhdCBnZXRzIHRyYW5zZmVycmVkLlxuICAgKiAqKk5PVEUqKjogSWYgeW91IGhhdmUgdGhlIG9wdGlvbiAgYHVwbG9hZE11bHRpcGxlYCBzZXQgdG8gYHRydWVgLCB0aGVuXG4gICAqIERyb3B6b25lIHdpbGwgYXBwZW5kIGBbXWAgdG8gdGhlIG5hbWUuXG4gICAqL1xuICBwYXJhbU5hbWU6IFwiZmlsZVwiLFxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRodW1ibmFpbHMgZm9yIGltYWdlcyBzaG91bGQgYmUgZ2VuZXJhdGVkXG4gICAqL1xuICBjcmVhdGVJbWFnZVRodW1ibmFpbHM6IHRydWUsXG5cbiAgLyoqXG4gICAqIEluIE1CLiBXaGVuIHRoZSBmaWxlbmFtZSBleGNlZWRzIHRoaXMgbGltaXQsIHRoZSB0aHVtYm5haWwgd2lsbCBub3QgYmUgZ2VuZXJhdGVkLlxuICAgKi9cbiAgbWF4VGh1bWJuYWlsRmlsZXNpemU6IDEwLFxuXG4gIC8qKlxuICAgKiBJZiBgbnVsbGAsIHRoZSByYXRpbyBvZiB0aGUgaW1hZ2Ugd2lsbCBiZSB1c2VkIHRvIGNhbGN1bGF0ZSBpdC5cbiAgICovXG4gIHRodW1ibmFpbFdpZHRoOiAxMjAsXG5cbiAgLyoqXG4gICAqIFRoZSBzYW1lIGFzIGB0aHVtYm5haWxXaWR0aGAuIElmIGJvdGggYXJlIG51bGwsIGltYWdlcyB3aWxsIG5vdCBiZSByZXNpemVkLlxuICAgKi9cbiAgdGh1bWJuYWlsSGVpZ2h0OiAxMjAsXG5cbiAgLyoqXG4gICAqIEhvdyB0aGUgaW1hZ2VzIHNob3VsZCBiZSBzY2FsZWQgZG93biBpbiBjYXNlIGJvdGgsIGB0aHVtYm5haWxXaWR0aGAgYW5kIGB0aHVtYm5haWxIZWlnaHRgIGFyZSBwcm92aWRlZC5cbiAgICogQ2FuIGJlIGVpdGhlciBgY29udGFpbmAgb3IgYGNyb3BgLlxuICAgKi9cbiAgdGh1bWJuYWlsTWV0aG9kOiBcImNyb3BcIixcblxuICAvKipcbiAgICogSWYgc2V0LCBpbWFnZXMgd2lsbCBiZSByZXNpemVkIHRvIHRoZXNlIGRpbWVuc2lvbnMgYmVmb3JlIGJlaW5nICoqdXBsb2FkZWQqKi5cbiAgICogSWYgb25seSBvbmUsIGByZXNpemVXaWR0aGAgKipvcioqIGByZXNpemVIZWlnaHRgIGlzIHByb3ZpZGVkLCB0aGUgb3JpZ2luYWwgYXNwZWN0XG4gICAqIHJhdGlvIG9mIHRoZSBmaWxlIHdpbGwgYmUgcHJlc2VydmVkLlxuICAgKlxuICAgKiBUaGUgYG9wdGlvbnMudHJhbnNmb3JtRmlsZWAgZnVuY3Rpb24gdXNlcyB0aGVzZSBvcHRpb25zLCBzbyBpZiB0aGUgYHRyYW5zZm9ybUZpbGVgIGZ1bmN0aW9uXG4gICAqIGlzIG92ZXJyaWRkZW4sIHRoZXNlIG9wdGlvbnMgZG9uJ3QgZG8gYW55dGhpbmcuXG4gICAqL1xuICByZXNpemVXaWR0aDogbnVsbCxcblxuICAvKipcbiAgICogU2VlIGByZXNpemVXaWR0aGAuXG4gICAqL1xuICByZXNpemVIZWlnaHQ6IG51bGwsXG5cbiAgLyoqXG4gICAqIFRoZSBtaW1lIHR5cGUgb2YgdGhlIHJlc2l6ZWQgaW1hZ2UgKGJlZm9yZSBpdCBnZXRzIHVwbG9hZGVkIHRvIHRoZSBzZXJ2ZXIpLlxuICAgKiBJZiBgbnVsbGAgdGhlIG9yaWdpbmFsIG1pbWUgdHlwZSB3aWxsIGJlIHVzZWQuIFRvIGZvcmNlIGpwZWcsIGZvciBleGFtcGxlLCB1c2UgYGltYWdlL2pwZWdgLlxuICAgKiBTZWUgYHJlc2l6ZVdpZHRoYCBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICovXG4gIHJlc2l6ZU1pbWVUeXBlOiBudWxsLFxuXG4gIC8qKlxuICAgKiBUaGUgcXVhbGl0eSBvZiB0aGUgcmVzaXplZCBpbWFnZXMuIFNlZSBgcmVzaXplV2lkdGhgLlxuICAgKi9cbiAgcmVzaXplUXVhbGl0eTogMC44LFxuXG4gIC8qKlxuICAgKiBIb3cgdGhlIGltYWdlcyBzaG91bGQgYmUgc2NhbGVkIGRvd24gaW4gY2FzZSBib3RoLCBgcmVzaXplV2lkdGhgIGFuZCBgcmVzaXplSGVpZ2h0YCBhcmUgcHJvdmlkZWQuXG4gICAqIENhbiBiZSBlaXRoZXIgYGNvbnRhaW5gIG9yIGBjcm9wYC5cbiAgICovXG4gIHJlc2l6ZU1ldGhvZDogXCJjb250YWluXCIsXG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIHRoYXQgaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlICoqZGlzcGxheWVkKiogZmlsZXNpemUuIFlvdSBjYW5cbiAgICogY2hhbmdlIHRoaXMgdG8gMTAyNCBpZiB5b3Ugd291bGQgcmF0aGVyIGRpc3BsYXkga2liaWJ5dGVzLCBtZWJpYnl0ZXMsXG4gICAqIGV0Yy4uLiAxMDI0IGlzIHRlY2huaWNhbGx5IGluY29ycmVjdCwgYmVjYXVzZSBgMTAyNCBieXRlc2AgYXJlIGAxIGtpYmlieXRlYFxuICAgKiBub3QgYDEga2lsb2J5dGVgLiBZb3UgY2FuIGNoYW5nZSB0aGlzIHRvIGAxMDI0YCBpZiB5b3UgZG9uJ3QgY2FyZSBhYm91dFxuICAgKiB2YWxpZGl0eS5cbiAgICovXG4gIGZpbGVzaXplQmFzZTogMTAwMCxcblxuICAvKipcbiAgICogSWYgbm90IGBudWxsYCBkZWZpbmVzIGhvdyBtYW55IGZpbGVzIHRoaXMgRHJvcHpvbmUgaGFuZGxlcy4gSWYgaXQgZXhjZWVkcyxcbiAgICogdGhlIGV2ZW50IGBtYXhmaWxlc2V4Y2VlZGVkYCB3aWxsIGJlIGNhbGxlZC4gVGhlIGRyb3B6b25lIGVsZW1lbnQgZ2V0cyB0aGVcbiAgICogY2xhc3MgYGR6LW1heC1maWxlcy1yZWFjaGVkYCBhY2NvcmRpbmdseSBzbyB5b3UgY2FuIHByb3ZpZGUgdmlzdWFsXG4gICAqIGZlZWRiYWNrLlxuICAgKi9cbiAgbWF4RmlsZXM6IG51bGwsXG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBzZW5kIGFkZGl0aW9uYWwgaGVhZGVycyB0byB0aGUgc2VydmVyLiBFZzpcbiAgICogYHsgXCJNeS1Bd2Vzb21lLUhlYWRlclwiOiBcImhlYWRlciB2YWx1ZVwiIH1gXG4gICAqL1xuICBoZWFkZXJzOiBudWxsLFxuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHRoZSBkcm9wem9uZSBlbGVtZW50IGl0c2VsZiB3aWxsIGJlIGNsaWNrYWJsZSwgaWYgYGZhbHNlYFxuICAgKiBub3RoaW5nIHdpbGwgYmUgY2xpY2thYmxlLlxuICAgKlxuICAgKiBZb3UgY2FuIGFsc28gcGFzcyBhbiBIVE1MIGVsZW1lbnQsIGEgQ1NTIHNlbGVjdG9yIChmb3IgbXVsdGlwbGUgZWxlbWVudHMpXG4gICAqIG9yIGFuIGFycmF5IG9mIHRob3NlLiBJbiB0aGF0IGNhc2UsIGFsbCBvZiB0aG9zZSBlbGVtZW50cyB3aWxsIHRyaWdnZXIgYW5cbiAgICogdXBsb2FkIHdoZW4gY2xpY2tlZC5cbiAgICovXG4gIGNsaWNrYWJsZTogdHJ1ZSxcblxuICAvKipcbiAgICogV2hldGhlciBoaWRkZW4gZmlsZXMgaW4gZGlyZWN0b3JpZXMgc2hvdWxkIGJlIGlnbm9yZWQuXG4gICAqL1xuICBpZ25vcmVIaWRkZW5GaWxlczogdHJ1ZSxcblxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgYGFjY2VwdGAgY2hlY2tzIHRoZSBmaWxlJ3MgbWltZSB0eXBlIG9yXG4gICAqIGV4dGVuc2lvbiBhZ2FpbnN0IHRoaXMgbGlzdC4gVGhpcyBpcyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIG1pbWVcbiAgICogdHlwZXMgb3IgZmlsZSBleHRlbnNpb25zLlxuICAgKlxuICAgKiBFZy46IGBpbWFnZS8qLGFwcGxpY2F0aW9uL3BkZiwucHNkYFxuICAgKlxuICAgKiBJZiB0aGUgRHJvcHpvbmUgaXMgYGNsaWNrYWJsZWAgdGhpcyBvcHRpb24gd2lsbCBhbHNvIGJlIHVzZWQgYXNcbiAgICogW2BhY2NlcHRgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0hUTUwvRWxlbWVudC9pbnB1dCNhdHRyLWFjY2VwdClcbiAgICogcGFyYW1ldGVyIG9uIHRoZSBoaWRkZW4gZmlsZSBpbnB1dCBhcyB3ZWxsLlxuICAgKi9cbiAgYWNjZXB0ZWRGaWxlczogbnVsbCxcblxuICAvKipcbiAgICogKipEZXByZWNhdGVkISoqXG4gICAqIFVzZSBhY2NlcHRlZEZpbGVzIGluc3RlYWQuXG4gICAqL1xuICBhY2NlcHRlZE1pbWVUeXBlczogbnVsbCxcblxuICAvKipcbiAgICogSWYgZmFsc2UsIGZpbGVzIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHF1ZXVlIGJ1dCB0aGUgcXVldWUgd2lsbCBub3QgYmVcbiAgICogcHJvY2Vzc2VkIGF1dG9tYXRpY2FsbHkuXG4gICAqIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3UgbmVlZCBzb21lIGFkZGl0aW9uYWwgdXNlciBpbnB1dCBiZWZvcmUgc2VuZGluZ1xuICAgKiBmaWxlcyAob3IgaWYgeW91IHdhbnQgd2FudCBhbGwgZmlsZXMgc2VudCBhdCBvbmNlKS5cbiAgICogSWYgeW91J3JlIHJlYWR5IHRvIHNlbmQgdGhlIGZpbGUgc2ltcGx5IGNhbGwgYG15RHJvcHpvbmUucHJvY2Vzc1F1ZXVlKClgLlxuICAgKlxuICAgKiBTZWUgdGhlIFtlbnF1ZXVpbmcgZmlsZSB1cGxvYWRzXSgjZW5xdWV1aW5nLWZpbGUtdXBsb2FkcykgZG9jdW1lbnRhdGlvblxuICAgKiBzZWN0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgYXV0b1Byb2Nlc3NRdWV1ZTogdHJ1ZSxcblxuICAvKipcbiAgICogSWYgZmFsc2UsIGZpbGVzIGFkZGVkIHRvIHRoZSBkcm9wem9uZSB3aWxsIG5vdCBiZSBxdWV1ZWQgYnkgZGVmYXVsdC5cbiAgICogWW91J2xsIGhhdmUgdG8gY2FsbCBgZW5xdWV1ZUZpbGUoZmlsZSlgIG1hbnVhbGx5LlxuICAgKi9cbiAgYXV0b1F1ZXVlOiB0cnVlLFxuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHRoaXMgd2lsbCBhZGQgYSBsaW5rIHRvIGV2ZXJ5IGZpbGUgcHJldmlldyB0byByZW1vdmUgb3IgY2FuY2VsIChpZlxuICAgKiBhbHJlYWR5IHVwbG9hZGluZykgdGhlIGZpbGUuIFRoZSBgZGljdENhbmNlbFVwbG9hZGAsIGBkaWN0Q2FuY2VsVXBsb2FkQ29uZmlybWF0aW9uYFxuICAgKiBhbmQgYGRpY3RSZW1vdmVGaWxlYCBvcHRpb25zIGFyZSB1c2VkIGZvciB0aGUgd29yZGluZy5cbiAgICovXG4gIGFkZFJlbW92ZUxpbmtzOiBmYWxzZSxcblxuICAvKipcbiAgICogRGVmaW5lcyB3aGVyZSB0byBkaXNwbGF5IHRoZSBmaWxlIHByZXZpZXdzIOKAkyBpZiBgbnVsbGAgdGhlXG4gICAqIERyb3B6b25lIGVsZW1lbnQgaXRzZWxmIGlzIHVzZWQuIENhbiBiZSBhIHBsYWluIGBIVE1MRWxlbWVudGAgb3IgYSBDU1NcbiAgICogc2VsZWN0b3IuIFRoZSBlbGVtZW50IHNob3VsZCBoYXZlIHRoZSBgZHJvcHpvbmUtcHJldmlld3NgIGNsYXNzIHNvXG4gICAqIHRoZSBwcmV2aWV3cyBhcmUgZGlzcGxheWVkIHByb3Blcmx5LlxuICAgKi9cbiAgcHJldmlld3NDb250YWluZXI6IG51bGwsXG5cbiAgLyoqXG4gICAqIFNldCB0aGlzIHRvIGB0cnVlYCBpZiB5b3UgZG9uJ3Qgd2FudCBwcmV2aWV3cyB0byBiZSBzaG93bi5cbiAgICovXG4gIGRpc2FibGVQcmV2aWV3czogZmFsc2UsXG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgdGhlIGVsZW1lbnQgdGhlIGhpZGRlbiBpbnB1dCBmaWVsZCAod2hpY2ggaXMgdXNlZCB3aGVuIGNsaWNraW5nIG9uIHRoZVxuICAgKiBkcm9wem9uZSB0byB0cmlnZ2VyIGZpbGUgc2VsZWN0aW9uKSB3aWxsIGJlIGFwcGVuZGVkIHRvLiBUaGlzIG1pZ2h0XG4gICAqIGJlIGltcG9ydGFudCBpbiBjYXNlIHlvdSB1c2UgZnJhbWV3b3JrcyB0byBzd2l0Y2ggdGhlIGNvbnRlbnQgb2YgeW91ciBwYWdlLlxuICAgKlxuICAgKiBDYW4gYmUgYSBzZWxlY3RvciBzdHJpbmcsIG9yIGFuIGVsZW1lbnQgZGlyZWN0bHkuXG4gICAqL1xuICBoaWRkZW5JbnB1dENvbnRhaW5lcjogXCJib2R5XCIsXG5cbiAgLyoqXG4gICAqIElmIG51bGwsIG5vIGNhcHR1cmUgdHlwZSB3aWxsIGJlIHNwZWNpZmllZFxuICAgKiBJZiBjYW1lcmEsIG1vYmlsZSBkZXZpY2VzIHdpbGwgc2tpcCB0aGUgZmlsZSBzZWxlY3Rpb24gYW5kIGNob29zZSBjYW1lcmFcbiAgICogSWYgbWljcm9waG9uZSwgbW9iaWxlIGRldmljZXMgd2lsbCBza2lwIHRoZSBmaWxlIHNlbGVjdGlvbiBhbmQgY2hvb3NlIHRoZSBtaWNyb3Bob25lXG4gICAqIElmIGNhbWNvcmRlciwgbW9iaWxlIGRldmljZXMgd2lsbCBza2lwIHRoZSBmaWxlIHNlbGVjdGlvbiBhbmQgY2hvb3NlIHRoZSBjYW1lcmEgaW4gdmlkZW8gbW9kZVxuICAgKiBPbiBhcHBsZSBkZXZpY2VzIG11bHRpcGxlIG11c3QgYmUgc2V0IHRvIGZhbHNlLiAgQWNjZXB0ZWRGaWxlcyBtYXkgbmVlZCB0b1xuICAgKiBiZSBzZXQgdG8gYW4gYXBwcm9wcmlhdGUgbWltZSB0eXBlIChlLmcuIFwiaW1hZ2UvKlwiLCBcImF1ZGlvLypcIiwgb3IgXCJ2aWRlby8qXCIpLlxuICAgKi9cbiAgY2FwdHVyZTogbnVsbCxcblxuICAvKipcbiAgICogKipEZXByZWNhdGVkKiouIFVzZSBgcmVuYW1lRmlsZWAgaW5zdGVhZC5cbiAgICovXG4gIHJlbmFtZUZpbGVuYW1lOiBudWxsLFxuXG4gIC8qKlxuICAgKiBBIGZ1bmN0aW9uIHRoYXQgaXMgaW52b2tlZCBiZWZvcmUgdGhlIGZpbGUgaXMgdXBsb2FkZWQgdG8gdGhlIHNlcnZlciBhbmQgcmVuYW1lcyB0aGUgZmlsZS5cbiAgICogVGhpcyBmdW5jdGlvbiBnZXRzIHRoZSBgRmlsZWAgYXMgYXJndW1lbnQgYW5kIGNhbiB1c2UgdGhlIGBmaWxlLm5hbWVgLiBUaGUgYWN0dWFsIG5hbWUgb2YgdGhlXG4gICAqIGZpbGUgdGhhdCBnZXRzIHVzZWQgZHVyaW5nIHRoZSB1cGxvYWQgY2FuIGJlIGFjY2Vzc2VkIHRocm91Z2ggYGZpbGUudXBsb2FkLmZpbGVuYW1lYC5cbiAgICovXG4gIHJlbmFtZUZpbGU6IG51bGwsXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCB0aGUgZmFsbGJhY2sgd2lsbCBiZSBmb3JjZWQuIFRoaXMgaXMgdmVyeSB1c2VmdWwgdG8gdGVzdCB5b3VyIHNlcnZlclxuICAgKiBpbXBsZW1lbnRhdGlvbnMgZmlyc3QgYW5kIG1ha2Ugc3VyZSB0aGF0IGV2ZXJ5dGhpbmcgd29ya3MgYXNcbiAgICogZXhwZWN0ZWQgd2l0aG91dCBkcm9wem9uZSBpZiB5b3UgZXhwZXJpZW5jZSBwcm9ibGVtcywgYW5kIHRvIHRlc3RcbiAgICogaG93IHlvdXIgZmFsbGJhY2tzIHdpbGwgbG9vay5cbiAgICovXG4gIGZvcmNlRmFsbGJhY2s6IGZhbHNlLFxuXG4gIC8qKlxuICAgKiBUaGUgdGV4dCB1c2VkIGJlZm9yZSBhbnkgZmlsZXMgYXJlIGRyb3BwZWQuXG4gICAqL1xuICBkaWN0RGVmYXVsdE1lc3NhZ2U6IFwiRHJvcCBmaWxlcyBoZXJlIHRvIHVwbG9hZFwiLFxuXG4gIC8qKlxuICAgKiBUaGUgdGV4dCB0aGF0IHJlcGxhY2VzIHRoZSBkZWZhdWx0IG1lc3NhZ2UgdGV4dCBpdCB0aGUgYnJvd3NlciBpcyBub3Qgc3VwcG9ydGVkLlxuICAgKi9cbiAgZGljdEZhbGxiYWNrTWVzc2FnZTogXCJZb3VyIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBkcmFnJ24nZHJvcCBmaWxlIHVwbG9hZHMuXCIsXG5cbiAgLyoqXG4gICAqIFRoZSB0ZXh0IHRoYXQgd2lsbCBiZSBhZGRlZCBiZWZvcmUgdGhlIGZhbGxiYWNrIGZvcm0uXG4gICAqIElmIHlvdSBwcm92aWRlIGEgIGZhbGxiYWNrIGVsZW1lbnQgeW91cnNlbGYsIG9yIGlmIHRoaXMgb3B0aW9uIGlzIGBudWxsYCB0aGlzIHdpbGxcbiAgICogYmUgaWdub3JlZC5cbiAgICovXG4gIGRpY3RGYWxsYmFja1RleHQ6IFwiUGxlYXNlIHVzZSB0aGUgZmFsbGJhY2sgZm9ybSBiZWxvdyB0byB1cGxvYWQgeW91ciBmaWxlcyBsaWtlIGluIHRoZSBvbGRlbiBkYXlzLlwiLFxuXG4gIC8qKlxuICAgKiBJZiB0aGUgZmlsZXNpemUgaXMgdG9vIGJpZy5cbiAgICogYHt7ZmlsZXNpemV9fWAgYW5kIGB7e21heEZpbGVzaXplfX1gIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgcmVzcGVjdGl2ZSBjb25maWd1cmF0aW9uIHZhbHVlcy5cbiAgICovXG4gIGRpY3RGaWxlVG9vQmlnOiBcIkZpbGUgaXMgdG9vIGJpZyAoe3tmaWxlc2l6ZX19TWlCKS4gTWF4IGZpbGVzaXplOiB7e21heEZpbGVzaXplfX1NaUIuXCIsXG5cbiAgLyoqXG4gICAqIElmIHRoZSBmaWxlIGRvZXNuJ3QgbWF0Y2ggdGhlIGZpbGUgdHlwZS5cbiAgICovXG4gIGRpY3RJbnZhbGlkRmlsZVR5cGU6IFwiWW91IGNhbid0IHVwbG9hZCBmaWxlcyBvZiB0aGlzIHR5cGUuXCIsXG5cbiAgLyoqXG4gICAqIElmIHRoZSBzZXJ2ZXIgcmVzcG9uc2Ugd2FzIGludmFsaWQuXG4gICAqIGB7e3N0YXR1c0NvZGV9fWAgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSBzZXJ2ZXJzIHN0YXR1cyBjb2RlLlxuICAgKi9cbiAgZGljdFJlc3BvbnNlRXJyb3I6IFwiU2VydmVyIHJlc3BvbmRlZCB3aXRoIHt7c3RhdHVzQ29kZX19IGNvZGUuXCIsXG5cbiAgLyoqXG4gICAqIElmIGBhZGRSZW1vdmVMaW5rc2AgaXMgdHJ1ZSwgdGhlIHRleHQgdG8gYmUgdXNlZCBmb3IgdGhlIGNhbmNlbCB1cGxvYWQgbGluay5cbiAgICovXG4gIGRpY3RDYW5jZWxVcGxvYWQ6IFwiQ2FuY2VsIHVwbG9hZFwiLFxuXG4gIC8qKlxuICAgKiBUaGUgdGV4dCB0aGF0IGlzIGRpc3BsYXllZCBpZiBhbiB1cGxvYWQgd2FzIG1hbnVhbGx5IGNhbmNlbGVkXG4gICAqL1xuICBkaWN0VXBsb2FkQ2FuY2VsZWQ6IFwiVXBsb2FkIGNhbmNlbGVkLlwiLFxuXG4gIC8qKlxuICAgKiBJZiBgYWRkUmVtb3ZlTGlua3NgIGlzIHRydWUsIHRoZSB0ZXh0IHRvIGJlIHVzZWQgZm9yIGNvbmZpcm1hdGlvbiB3aGVuIGNhbmNlbGxpbmcgdXBsb2FkLlxuICAgKi9cbiAgZGljdENhbmNlbFVwbG9hZENvbmZpcm1hdGlvbjogXCJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY2FuY2VsIHRoaXMgdXBsb2FkP1wiLFxuXG4gIC8qKlxuICAgKiBJZiBgYWRkUmVtb3ZlTGlua3NgIGlzIHRydWUsIHRoZSB0ZXh0IHRvIGJlIHVzZWQgdG8gcmVtb3ZlIGEgZmlsZS5cbiAgICovXG4gIGRpY3RSZW1vdmVGaWxlOiBcIlJlbW92ZSBmaWxlXCIsXG5cbiAgLyoqXG4gICAqIElmIHRoaXMgaXMgbm90IG51bGwsIHRoZW4gdGhlIHVzZXIgd2lsbCBiZSBwcm9tcHRlZCBiZWZvcmUgcmVtb3ZpbmcgYSBmaWxlLlxuICAgKi9cbiAgZGljdFJlbW92ZUZpbGVDb25maXJtYXRpb246IG51bGwsXG5cbiAgLyoqXG4gICAqIERpc3BsYXllZCBpZiBgbWF4RmlsZXNgIGlzIHN0IGFuZCBleGNlZWRlZC5cbiAgICogVGhlIHN0cmluZyBge3ttYXhGaWxlc319YCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBjb25maWd1cmF0aW9uIHZhbHVlLlxuICAgKi9cbiAgZGljdE1heEZpbGVzRXhjZWVkZWQ6IFwiWW91IGNhbiBub3QgdXBsb2FkIGFueSBtb3JlIGZpbGVzLlwiLFxuXG4gIC8qKlxuICAgKiBBbGxvd3MgeW91IHRvIHRyYW5zbGF0ZSB0aGUgZGlmZmVyZW50IHVuaXRzLiBTdGFydGluZyB3aXRoIGB0YmAgZm9yIHRlcmFieXRlcyBhbmQgZ29pbmcgZG93biB0b1xuICAgKiBgYmAgZm9yIGJ5dGVzLlxuICAgKi9cbiAgZGljdEZpbGVTaXplVW5pdHM6IHtcbiAgICB0YjogXCJUQlwiLFxuICAgIGdiOiBcIkdCXCIsXG4gICAgbWI6IFwiTUJcIixcbiAgICBrYjogXCJLQlwiLFxuICAgIGI6IFwiYlwiXG4gIH0sXG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIGRyb3B6b25lIGluaXRpYWxpemVkXG4gICAqIFlvdSBjYW4gYWRkIGV2ZW50IGxpc3RlbmVycyBoZXJlXG4gICAqL1xuICBpbml0OiBmdW5jdGlvbiBpbml0KCkge30sXG5cbiAgLyoqXG4gICAqIENhbiBiZSBhbiAqKm9iamVjdCoqIG9mIGFkZGl0aW9uYWwgcGFyYW1ldGVycyB0byB0cmFuc2ZlciB0byB0aGUgc2VydmVyLCAqKm9yKiogYSBgRnVuY3Rpb25gXG4gICAqIHRoYXQgZ2V0cyBpbnZva2VkIHdpdGggdGhlIGBmaWxlc2AsIGB4aHJgIGFuZCwgaWYgaXQncyBhIGNodW5rZWQgdXBsb2FkLCBgY2h1bmtgIGFyZ3VtZW50cy4gSW4gY2FzZVxuICAgKiBvZiBhIGZ1bmN0aW9uLCB0aGlzIG5lZWRzIHRvIHJldHVybiBhIG1hcC5cbiAgICpcbiAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nIGZvciBub3JtYWwgdXBsb2FkcywgYnV0IGFkZHMgcmVsZXZhbnQgaW5mb3JtYXRpb24gZm9yXG4gICAqIGNodW5rZWQgdXBsb2Fkcy5cbiAgICpcbiAgICogVGhpcyBpcyB0aGUgc2FtZSBhcyBhZGRpbmcgaGlkZGVuIGlucHV0IGZpZWxkcyBpbiB0aGUgZm9ybSBlbGVtZW50LlxuICAgKi9cbiAgcGFyYW1zOiBmdW5jdGlvbiBwYXJhbXMoZmlsZXMsIHhociwgY2h1bmspIHtcbiAgICBpZiAoY2h1bmspIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGR6dXVpZDogY2h1bmsuZmlsZS51cGxvYWQudXVpZCxcbiAgICAgICAgZHpjaHVua2luZGV4OiBjaHVuay5pbmRleCxcbiAgICAgICAgZHp0b3RhbGZpbGVzaXplOiBjaHVuay5maWxlLnNpemUsXG4gICAgICAgIGR6Y2h1bmtzaXplOiB0aGlzLm9wdGlvbnMuY2h1bmtTaXplLFxuICAgICAgICBkenRvdGFsY2h1bmtjb3VudDogY2h1bmsuZmlsZS51cGxvYWQudG90YWxDaHVua0NvdW50LFxuICAgICAgICBkemNodW5rYnl0ZW9mZnNldDogY2h1bmsuaW5kZXggKiB0aGlzLm9wdGlvbnMuY2h1bmtTaXplXG4gICAgICB9O1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogQSBmdW5jdGlvbiB0aGF0IGdldHMgYSBbZmlsZV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9ET00vRmlsZSlcbiAgICogYW5kIGEgYGRvbmVgIGZ1bmN0aW9uIGFzIHBhcmFtZXRlcnMuXG4gICAqXG4gICAqIElmIHRoZSBkb25lIGZ1bmN0aW9uIGlzIGludm9rZWQgd2l0aG91dCBhcmd1bWVudHMsIHRoZSBmaWxlIGlzIFwiYWNjZXB0ZWRcIiBhbmQgd2lsbFxuICAgKiBiZSBwcm9jZXNzZWQuIElmIHlvdSBwYXNzIGFuIGVycm9yIG1lc3NhZ2UsIHRoZSBmaWxlIGlzIHJlamVjdGVkLCBhbmQgdGhlIGVycm9yXG4gICAqIG1lc3NhZ2Ugd2lsbCBiZSBkaXNwbGF5ZWQuXG4gICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBub3QgYmUgY2FsbGVkIGlmIHRoZSBmaWxlIGlzIHRvbyBiaWcgb3IgZG9lc24ndCBtYXRjaCB0aGUgbWltZSB0eXBlcy5cbiAgICovXG4gIGFjY2VwdDogZnVuY3Rpb24gYWNjZXB0KGZpbGUsIGRvbmUpIHtcbiAgICByZXR1cm4gZG9uZSgpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBUaGUgY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGludm9rZWQgd2hlbiBhbGwgY2h1bmtzIGhhdmUgYmVlbiB1cGxvYWRlZCBmb3IgYSBmaWxlLlxuICAgKiBJdCBnZXRzIHRoZSBmaWxlIGZvciB3aGljaCB0aGUgY2h1bmtzIGhhdmUgYmVlbiB1cGxvYWRlZCBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyLFxuICAgKiBhbmQgdGhlIGBkb25lYCBmdW5jdGlvbiBhcyBzZWNvbmQuIGBkb25lKClgIG5lZWRzIHRvIGJlIGludm9rZWQgd2hlbiBldmVyeXRoaW5nXG4gICAqIG5lZWRlZCB0byBmaW5pc2ggdGhlIHVwbG9hZCBwcm9jZXNzIGlzIGRvbmUuXG4gICAqL1xuICBjaHVua3NVcGxvYWRlZDogZnVuY3Rpb24gY2h1bmtzVXBsb2FkZWQoZmlsZSwgZG9uZSkge1xuICAgIGRvbmUoKTtcbiAgfSxcblxuICAvKipcbiAgICogR2V0cyBjYWxsZWQgd2hlbiB0aGUgYnJvd3NlciBpcyBub3Qgc3VwcG9ydGVkLlxuICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzaG93cyB0aGUgZmFsbGJhY2sgaW5wdXQgZmllbGQgYW5kIGFkZHNcbiAgICogYSB0ZXh0LlxuICAgKi9cbiAgZmFsbGJhY2s6IGZ1bmN0aW9uIGZhbGxiYWNrKCkge1xuICAgIC8vIFRoaXMgY29kZSBzaG91bGQgcGFzcyBpbiBJRTcuLi4gOihcbiAgICB2YXIgbWVzc2FnZUVsZW1lbnQ7XG4gICAgdGhpcy5lbGVtZW50LmNsYXNzTmFtZSA9IFwiXCIuY29uY2F0KHRoaXMuZWxlbWVudC5jbGFzc05hbWUsIFwiIGR6LWJyb3dzZXItbm90LXN1cHBvcnRlZFwiKTtcblxuICAgIHZhciBfaXRlcmF0b3IgPSBvcHRpb25zX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIodGhpcy5lbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiZGl2XCIpLCB0cnVlKSxcbiAgICAgICAgX3N0ZXA7XG5cbiAgICB0cnkge1xuICAgICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHtcbiAgICAgICAgdmFyIGNoaWxkID0gX3N0ZXAudmFsdWU7XG5cbiAgICAgICAgaWYgKC8oXnwgKWR6LW1lc3NhZ2UoJHwgKS8udGVzdChjaGlsZC5jbGFzc05hbWUpKSB7XG4gICAgICAgICAgbWVzc2FnZUVsZW1lbnQgPSBjaGlsZDtcbiAgICAgICAgICBjaGlsZC5jbGFzc05hbWUgPSBcImR6LW1lc3NhZ2VcIjsgLy8gUmVtb3ZlcyB0aGUgJ2R6LWRlZmF1bHQnIGNsYXNzXG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgX2l0ZXJhdG9yLmUoZXJyKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgX2l0ZXJhdG9yLmYoKTtcbiAgICB9XG5cbiAgICBpZiAoIW1lc3NhZ2VFbGVtZW50KSB7XG4gICAgICBtZXNzYWdlRWxlbWVudCA9IERyb3B6b25lLmNyZWF0ZUVsZW1lbnQoJzxkaXYgY2xhc3M9XCJkei1tZXNzYWdlXCI+PHNwYW4+PC9zcGFuPjwvZGl2PicpO1xuICAgICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKG1lc3NhZ2VFbGVtZW50KTtcbiAgICB9XG5cbiAgICB2YXIgc3BhbiA9IG1lc3NhZ2VFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwic3BhblwiKVswXTtcblxuICAgIGlmIChzcGFuKSB7XG4gICAgICBpZiAoc3Bhbi50ZXh0Q29udGVudCAhPSBudWxsKSB7XG4gICAgICAgIHNwYW4udGV4dENvbnRlbnQgPSB0aGlzLm9wdGlvbnMuZGljdEZhbGxiYWNrTWVzc2FnZTtcbiAgICAgIH0gZWxzZSBpZiAoc3Bhbi5pbm5lclRleHQgIT0gbnVsbCkge1xuICAgICAgICBzcGFuLmlubmVyVGV4dCA9IHRoaXMub3B0aW9ucy5kaWN0RmFsbGJhY2tNZXNzYWdlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5nZXRGYWxsYmFja0Zvcm0oKSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEdldHMgY2FsbGVkIHRvIGNhbGN1bGF0ZSB0aGUgdGh1bWJuYWlsIGRpbWVuc2lvbnMuXG4gICAqXG4gICAqIEl0IGdldHMgYGZpbGVgLCBgd2lkdGhgIGFuZCBgaGVpZ2h0YCAoYm90aCBtYXkgYmUgYG51bGxgKSBhcyBwYXJhbWV0ZXJzIGFuZCBtdXN0IHJldHVybiBhbiBvYmplY3QgY29udGFpbmluZzpcbiAgICpcbiAgICogIC0gYHNyY1dpZHRoYCAmIGBzcmNIZWlnaHRgIChyZXF1aXJlZClcbiAgICogIC0gYHRyZ1dpZHRoYCAmIGB0cmdIZWlnaHRgIChyZXF1aXJlZClcbiAgICogIC0gYHNyY1hgICYgYHNyY1lgIChvcHRpb25hbCwgZGVmYXVsdCBgMGApXG4gICAqICAtIGB0cmdYYCAmIGB0cmdZYCAob3B0aW9uYWwsIGRlZmF1bHQgYDBgKVxuICAgKlxuICAgKiBUaG9zZSB2YWx1ZXMgYXJlIGdvaW5nIHRvIGJlIHVzZWQgYnkgYGN0eC5kcmF3SW1hZ2UoKWAuXG4gICAqL1xuICByZXNpemU6IGZ1bmN0aW9uIHJlc2l6ZShmaWxlLCB3aWR0aCwgaGVpZ2h0LCByZXNpemVNZXRob2QpIHtcbiAgICB2YXIgaW5mbyA9IHtcbiAgICAgIHNyY1g6IDAsXG4gICAgICBzcmNZOiAwLFxuICAgICAgc3JjV2lkdGg6IGZpbGUud2lkdGgsXG4gICAgICBzcmNIZWlnaHQ6IGZpbGUuaGVpZ2h0XG4gICAgfTtcbiAgICB2YXIgc3JjUmF0aW8gPSBmaWxlLndpZHRoIC8gZmlsZS5oZWlnaHQ7IC8vIEF1dG9tYXRpY2FsbHkgY2FsY3VsYXRlIGRpbWVuc2lvbnMgaWYgbm90IHNwZWNpZmllZFxuXG4gICAgaWYgKHdpZHRoID09IG51bGwgJiYgaGVpZ2h0ID09IG51bGwpIHtcbiAgICAgIHdpZHRoID0gaW5mby5zcmNXaWR0aDtcbiAgICAgIGhlaWdodCA9IGluZm8uc3JjSGVpZ2h0O1xuICAgIH0gZWxzZSBpZiAod2lkdGggPT0gbnVsbCkge1xuICAgICAgd2lkdGggPSBoZWlnaHQgKiBzcmNSYXRpbztcbiAgICB9IGVsc2UgaWYgKGhlaWdodCA9PSBudWxsKSB7XG4gICAgICBoZWlnaHQgPSB3aWR0aCAvIHNyY1JhdGlvO1xuICAgIH0gLy8gTWFrZSBzdXJlIGltYWdlcyBhcmVuJ3QgdXBzY2FsZWRcblxuXG4gICAgd2lkdGggPSBNYXRoLm1pbih3aWR0aCwgaW5mby5zcmNXaWR0aCk7XG4gICAgaGVpZ2h0ID0gTWF0aC5taW4oaGVpZ2h0LCBpbmZvLnNyY0hlaWdodCk7XG4gICAgdmFyIHRyZ1JhdGlvID0gd2lkdGggLyBoZWlnaHQ7XG5cbiAgICBpZiAoaW5mby5zcmNXaWR0aCA+IHdpZHRoIHx8IGluZm8uc3JjSGVpZ2h0ID4gaGVpZ2h0KSB7XG4gICAgICAvLyBJbWFnZSBpcyBiaWdnZXIgYW5kIG5lZWRzIHJlc2NhbGluZ1xuICAgICAgaWYgKHJlc2l6ZU1ldGhvZCA9PT0gXCJjcm9wXCIpIHtcbiAgICAgICAgaWYgKHNyY1JhdGlvID4gdHJnUmF0aW8pIHtcbiAgICAgICAgICBpbmZvLnNyY0hlaWdodCA9IGZpbGUuaGVpZ2h0O1xuICAgICAgICAgIGluZm8uc3JjV2lkdGggPSBpbmZvLnNyY0hlaWdodCAqIHRyZ1JhdGlvO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGluZm8uc3JjV2lkdGggPSBmaWxlLndpZHRoO1xuICAgICAgICAgIGluZm8uc3JjSGVpZ2h0ID0gaW5mby5zcmNXaWR0aCAvIHRyZ1JhdGlvO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHJlc2l6ZU1ldGhvZCA9PT0gXCJjb250YWluXCIpIHtcbiAgICAgICAgLy8gTWV0aG9kICdjb250YWluJ1xuICAgICAgICBpZiAoc3JjUmF0aW8gPiB0cmdSYXRpbykge1xuICAgICAgICAgIGhlaWdodCA9IHdpZHRoIC8gc3JjUmF0aW87XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgd2lkdGggPSBoZWlnaHQgKiBzcmNSYXRpbztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biByZXNpemVNZXRob2QgJ1wiLmNvbmNhdChyZXNpemVNZXRob2QsIFwiJ1wiKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaW5mby5zcmNYID0gKGZpbGUud2lkdGggLSBpbmZvLnNyY1dpZHRoKSAvIDI7XG4gICAgaW5mby5zcmNZID0gKGZpbGUuaGVpZ2h0IC0gaW5mby5zcmNIZWlnaHQpIC8gMjtcbiAgICBpbmZvLnRyZ1dpZHRoID0gd2lkdGg7XG4gICAgaW5mby50cmdIZWlnaHQgPSBoZWlnaHQ7XG4gICAgcmV0dXJuIGluZm87XG4gIH0sXG5cbiAgLyoqXG4gICAqIENhbiBiZSB1c2VkIHRvIHRyYW5zZm9ybSB0aGUgZmlsZSAoZm9yIGV4YW1wbGUsIHJlc2l6ZSBhbiBpbWFnZSBpZiBuZWNlc3NhcnkpLlxuICAgKlxuICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB1c2VzIGByZXNpemVXaWR0aGAgYW5kIGByZXNpemVIZWlnaHRgIChpZiBwcm92aWRlZCkgYW5kIHJlc2l6ZXNcbiAgICogaW1hZ2VzIGFjY29yZGluZyB0byB0aG9zZSBkaW1lbnNpb25zLlxuICAgKlxuICAgKiBHZXRzIHRoZSBgZmlsZWAgYXMgdGhlIGZpcnN0IHBhcmFtZXRlciwgYW5kIGEgYGRvbmUoKWAgZnVuY3Rpb24gYXMgdGhlIHNlY29uZCwgdGhhdCBuZWVkc1xuICAgKiB0byBiZSBpbnZva2VkIHdpdGggdGhlIGZpbGUgd2hlbiB0aGUgdHJhbnNmb3JtYXRpb24gaXMgZG9uZS5cbiAgICovXG4gIHRyYW5zZm9ybUZpbGU6IGZ1bmN0aW9uIHRyYW5zZm9ybUZpbGUoZmlsZSwgZG9uZSkge1xuICAgIGlmICgodGhpcy5vcHRpb25zLnJlc2l6ZVdpZHRoIHx8IHRoaXMub3B0aW9ucy5yZXNpemVIZWlnaHQpICYmIGZpbGUudHlwZS5tYXRjaCgvaW1hZ2UuKi8pKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXNpemVJbWFnZShmaWxlLCB0aGlzLm9wdGlvbnMucmVzaXplV2lkdGgsIHRoaXMub3B0aW9ucy5yZXNpemVIZWlnaHQsIHRoaXMub3B0aW9ucy5yZXNpemVNZXRob2QsIGRvbmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZG9uZShmaWxlKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIEEgc3RyaW5nIHRoYXQgY29udGFpbnMgdGhlIHRlbXBsYXRlIHVzZWQgZm9yIGVhY2ggZHJvcHBlZFxuICAgKiBmaWxlLiBDaGFuZ2UgaXQgdG8gZnVsZmlsbCB5b3VyIG5lZWRzIGJ1dCBtYWtlIHN1cmUgdG8gcHJvcGVybHlcbiAgICogcHJvdmlkZSBhbGwgZWxlbWVudHMuXG4gICAqXG4gICAqIElmIHlvdSB3YW50IHRvIHVzZSBhbiBhY3R1YWwgSFRNTCBlbGVtZW50IGluc3RlYWQgb2YgcHJvdmlkaW5nIGEgU3RyaW5nXG4gICAqIGFzIGEgY29uZmlnIG9wdGlvbiwgeW91IGNvdWxkIGNyZWF0ZSBhIGRpdiB3aXRoIHRoZSBpZCBgdHBsYCxcbiAgICogcHV0IHRoZSB0ZW1wbGF0ZSBpbnNpZGUgaXQgYW5kIHByb3ZpZGUgdGhlIGVsZW1lbnQgbGlrZSB0aGlzOlxuICAgKlxuICAgKiAgICAgZG9jdW1lbnRcbiAgICogICAgICAgLnF1ZXJ5U2VsZWN0b3IoJyN0cGwnKVxuICAgKiAgICAgICAuaW5uZXJIVE1MXG4gICAqXG4gICAqL1xuICBwcmV2aWV3VGVtcGxhdGU6IHByZXZpZXdfdGVtcGxhdGUsXG5cbiAgLypcbiAgIFRob3NlIGZ1bmN0aW9ucyByZWdpc3RlciB0aGVtc2VsdmVzIHRvIHRoZSBldmVudHMgb24gaW5pdCBhbmQgaGFuZGxlIGFsbFxuICAgdGhlIHVzZXIgaW50ZXJmYWNlIHNwZWNpZmljIHN0dWZmLiBPdmVyd3JpdGluZyB0aGVtIHdvbid0IGJyZWFrIHRoZSB1cGxvYWRcbiAgIGJ1dCBjYW4gYnJlYWsgdGhlIHdheSBpdCdzIGRpc3BsYXllZC5cbiAgIFlvdSBjYW4gb3ZlcndyaXRlIHRoZW0gaWYgeW91IGRvbid0IGxpa2UgdGhlIGRlZmF1bHQgYmVoYXZpb3IuIElmIHlvdSBqdXN0XG4gICB3YW50IHRvIGFkZCBhbiBhZGRpdGlvbmFsIGV2ZW50IGhhbmRsZXIsIHJlZ2lzdGVyIGl0IG9uIHRoZSBkcm9wem9uZSBvYmplY3RcbiAgIGFuZCBkb24ndCBvdmVyd3JpdGUgdGhvc2Ugb3B0aW9ucy5cbiAgICovXG4gIC8vIFRob3NlIGFyZSBzZWxmIGV4cGxhbmF0b3J5IGFuZCBzaW1wbHkgY29uY2VybiB0aGUgRHJhZ25Ecm9wLlxuICBkcm9wOiBmdW5jdGlvbiBkcm9wKGUpIHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoXCJkei1kcmFnLWhvdmVyXCIpO1xuICB9LFxuICBkcmFnc3RhcnQ6IGZ1bmN0aW9uIGRyYWdzdGFydChlKSB7fSxcbiAgZHJhZ2VuZDogZnVuY3Rpb24gZHJhZ2VuZChlKSB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKFwiZHotZHJhZy1ob3ZlclwiKTtcbiAgfSxcbiAgZHJhZ2VudGVyOiBmdW5jdGlvbiBkcmFnZW50ZXIoZSkge1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZChcImR6LWRyYWctaG92ZXJcIik7XG4gIH0sXG4gIGRyYWdvdmVyOiBmdW5jdGlvbiBkcmFnb3ZlcihlKSB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiZHotZHJhZy1ob3ZlclwiKTtcbiAgfSxcbiAgZHJhZ2xlYXZlOiBmdW5jdGlvbiBkcmFnbGVhdmUoZSkge1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShcImR6LWRyYWctaG92ZXJcIik7XG4gIH0sXG4gIHBhc3RlOiBmdW5jdGlvbiBwYXN0ZShlKSB7fSxcbiAgLy8gQ2FsbGVkIHdoZW5ldmVyIHRoZXJlIGFyZSBubyBmaWxlcyBsZWZ0IGluIHRoZSBkcm9wem9uZSBhbnltb3JlLCBhbmQgdGhlXG4gIC8vIGRyb3B6b25lIHNob3VsZCBiZSBkaXNwbGF5ZWQgYXMgaWYgaW4gdGhlIGluaXRpYWwgc3RhdGUuXG4gIHJlc2V0OiBmdW5jdGlvbiByZXNldCgpIHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoXCJkei1zdGFydGVkXCIpO1xuICB9LFxuICAvLyBDYWxsZWQgd2hlbiBhIGZpbGUgaXMgYWRkZWQgdG8gdGhlIHF1ZXVlXG4gIC8vIFJlY2VpdmVzIGBmaWxlYFxuICBhZGRlZGZpbGU6IGZ1bmN0aW9uIGFkZGVkZmlsZShmaWxlKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIGlmICh0aGlzLmVsZW1lbnQgPT09IHRoaXMucHJldmlld3NDb250YWluZXIpIHtcbiAgICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiZHotc3RhcnRlZFwiKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wcmV2aWV3c0NvbnRhaW5lciAmJiAhdGhpcy5vcHRpb25zLmRpc2FibGVQcmV2aWV3cykge1xuICAgICAgZmlsZS5wcmV2aWV3RWxlbWVudCA9IERyb3B6b25lLmNyZWF0ZUVsZW1lbnQodGhpcy5vcHRpb25zLnByZXZpZXdUZW1wbGF0ZS50cmltKCkpO1xuICAgICAgZmlsZS5wcmV2aWV3VGVtcGxhdGUgPSBmaWxlLnByZXZpZXdFbGVtZW50OyAvLyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuXG4gICAgICB0aGlzLnByZXZpZXdzQ29udGFpbmVyLmFwcGVuZENoaWxkKGZpbGUucHJldmlld0VsZW1lbnQpO1xuXG4gICAgICB2YXIgX2l0ZXJhdG9yMiA9IG9wdGlvbnNfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihmaWxlLnByZXZpZXdFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbZGF0YS1kei1uYW1lXVwiKSwgdHJ1ZSksXG4gICAgICAgICAgX3N0ZXAyO1xuXG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKF9pdGVyYXRvcjIucygpOyAhKF9zdGVwMiA9IF9pdGVyYXRvcjIubigpKS5kb25lOykge1xuICAgICAgICAgIHZhciBub2RlID0gX3N0ZXAyLnZhbHVlO1xuICAgICAgICAgIG5vZGUudGV4dENvbnRlbnQgPSBmaWxlLm5hbWU7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfaXRlcmF0b3IyLmUoZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIF9pdGVyYXRvcjIuZigpO1xuICAgICAgfVxuXG4gICAgICB2YXIgX2l0ZXJhdG9yMyA9IG9wdGlvbnNfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihmaWxlLnByZXZpZXdFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbZGF0YS1kei1zaXplXVwiKSwgdHJ1ZSksXG4gICAgICAgICAgX3N0ZXAzO1xuXG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKF9pdGVyYXRvcjMucygpOyAhKF9zdGVwMyA9IF9pdGVyYXRvcjMubigpKS5kb25lOykge1xuICAgICAgICAgIG5vZGUgPSBfc3RlcDMudmFsdWU7XG4gICAgICAgICAgbm9kZS5pbm5lckhUTUwgPSB0aGlzLmZpbGVzaXplKGZpbGUuc2l6ZSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfaXRlcmF0b3IzLmUoZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIF9pdGVyYXRvcjMuZigpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmFkZFJlbW92ZUxpbmtzKSB7XG4gICAgICAgIGZpbGUuX3JlbW92ZUxpbmsgPSBEcm9wem9uZS5jcmVhdGVFbGVtZW50KFwiPGEgY2xhc3M9XFxcImR6LXJlbW92ZVxcXCIgaHJlZj1cXFwiamF2YXNjcmlwdDp1bmRlZmluZWQ7XFxcIiBkYXRhLWR6LXJlbW92ZT5cIi5jb25jYXQodGhpcy5vcHRpb25zLmRpY3RSZW1vdmVGaWxlLCBcIjwvYT5cIikpO1xuICAgICAgICBmaWxlLnByZXZpZXdFbGVtZW50LmFwcGVuZENoaWxkKGZpbGUuX3JlbW92ZUxpbmspO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVtb3ZlRmlsZUV2ZW50ID0gZnVuY3Rpb24gcmVtb3ZlRmlsZUV2ZW50KGUpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIGlmIChmaWxlLnN0YXR1cyA9PT0gRHJvcHpvbmUuVVBMT0FESU5HKSB7XG4gICAgICAgICAgcmV0dXJuIERyb3B6b25lLmNvbmZpcm0oX3RoaXMub3B0aW9ucy5kaWN0Q2FuY2VsVXBsb2FkQ29uZmlybWF0aW9uLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMucmVtb3ZlRmlsZShmaWxlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoX3RoaXMub3B0aW9ucy5kaWN0UmVtb3ZlRmlsZUNvbmZpcm1hdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIERyb3B6b25lLmNvbmZpcm0oX3RoaXMub3B0aW9ucy5kaWN0UmVtb3ZlRmlsZUNvbmZpcm1hdGlvbiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByZXR1cm4gX3RoaXMucmVtb3ZlRmlsZShmaWxlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMucmVtb3ZlRmlsZShmaWxlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHZhciBfaXRlcmF0b3I0ID0gb3B0aW9uc19jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGZpbGUucHJldmlld0VsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltkYXRhLWR6LXJlbW92ZV1cIiksIHRydWUpLFxuICAgICAgICAgIF9zdGVwNDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChfaXRlcmF0b3I0LnMoKTsgIShfc3RlcDQgPSBfaXRlcmF0b3I0Lm4oKSkuZG9uZTspIHtcbiAgICAgICAgICB2YXIgcmVtb3ZlTGluayA9IF9zdGVwNC52YWx1ZTtcbiAgICAgICAgICByZW1vdmVMaW5rLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCByZW1vdmVGaWxlRXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgX2l0ZXJhdG9yNC5lKGVycik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBfaXRlcmF0b3I0LmYoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIC8vIENhbGxlZCB3aGVuZXZlciBhIGZpbGUgaXMgcmVtb3ZlZC5cbiAgcmVtb3ZlZGZpbGU6IGZ1bmN0aW9uIHJlbW92ZWRmaWxlKGZpbGUpIHtcbiAgICBpZiAoZmlsZS5wcmV2aWV3RWxlbWVudCAhPSBudWxsICYmIGZpbGUucHJldmlld0VsZW1lbnQucGFyZW50Tm9kZSAhPSBudWxsKSB7XG4gICAgICBmaWxlLnByZXZpZXdFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZmlsZS5wcmV2aWV3RWxlbWVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3VwZGF0ZU1heEZpbGVzUmVhY2hlZENsYXNzKCk7XG4gIH0sXG4gIC8vIENhbGxlZCB3aGVuIGEgdGh1bWJuYWlsIGhhcyBiZWVuIGdlbmVyYXRlZFxuICAvLyBSZWNlaXZlcyBgZmlsZWAgYW5kIGBkYXRhVXJsYFxuICB0aHVtYm5haWw6IGZ1bmN0aW9uIHRodW1ibmFpbChmaWxlLCBkYXRhVXJsKSB7XG4gICAgaWYgKGZpbGUucHJldmlld0VsZW1lbnQpIHtcbiAgICAgIGZpbGUucHJldmlld0VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShcImR6LWZpbGUtcHJldmlld1wiKTtcblxuICAgICAgdmFyIF9pdGVyYXRvcjUgPSBvcHRpb25zX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoZmlsZS5wcmV2aWV3RWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2RhdGEtZHotdGh1bWJuYWlsXVwiKSwgdHJ1ZSksXG4gICAgICAgICAgX3N0ZXA1O1xuXG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKF9pdGVyYXRvcjUucygpOyAhKF9zdGVwNSA9IF9pdGVyYXRvcjUubigpKS5kb25lOykge1xuICAgICAgICAgIHZhciB0aHVtYm5haWxFbGVtZW50ID0gX3N0ZXA1LnZhbHVlO1xuICAgICAgICAgIHRodW1ibmFpbEVsZW1lbnQuYWx0ID0gZmlsZS5uYW1lO1xuICAgICAgICAgIHRodW1ibmFpbEVsZW1lbnQuc3JjID0gZGF0YVVybDtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9pdGVyYXRvcjUuZShlcnIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgX2l0ZXJhdG9yNS5mKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGZpbGUucHJldmlld0VsZW1lbnQuY2xhc3NMaXN0LmFkZChcImR6LWltYWdlLXByZXZpZXdcIik7XG4gICAgICB9LCAxKTtcbiAgICB9XG4gIH0sXG4gIC8vIENhbGxlZCB3aGVuZXZlciBhbiBlcnJvciBvY2N1cnNcbiAgLy8gUmVjZWl2ZXMgYGZpbGVgIGFuZCBgbWVzc2FnZWBcbiAgZXJyb3I6IGZ1bmN0aW9uIGVycm9yKGZpbGUsIG1lc3NhZ2UpIHtcbiAgICBpZiAoZmlsZS5wcmV2aWV3RWxlbWVudCkge1xuICAgICAgZmlsZS5wcmV2aWV3RWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiZHotZXJyb3JcIik7XG5cbiAgICAgIGlmICh0eXBlb2YgbWVzc2FnZSAhPT0gXCJzdHJpbmdcIiAmJiBtZXNzYWdlLmVycm9yKSB7XG4gICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlLmVycm9yO1xuICAgICAgfVxuXG4gICAgICB2YXIgX2l0ZXJhdG9yNiA9IG9wdGlvbnNfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihmaWxlLnByZXZpZXdFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbZGF0YS1kei1lcnJvcm1lc3NhZ2VdXCIpLCB0cnVlKSxcbiAgICAgICAgICBfc3RlcDY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoX2l0ZXJhdG9yNi5zKCk7ICEoX3N0ZXA2ID0gX2l0ZXJhdG9yNi5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgdmFyIG5vZGUgPSBfc3RlcDYudmFsdWU7XG4gICAgICAgICAgbm9kZS50ZXh0Q29udGVudCA9IG1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfaXRlcmF0b3I2LmUoZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIF9pdGVyYXRvcjYuZigpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgZXJyb3JtdWx0aXBsZTogZnVuY3Rpb24gZXJyb3JtdWx0aXBsZSgpIHt9LFxuICAvLyBDYWxsZWQgd2hlbiBhIGZpbGUgZ2V0cyBwcm9jZXNzZWQuIFNpbmNlIHRoZXJlIGlzIGEgY3VlLCBub3QgYWxsIGFkZGVkXG4gIC8vIGZpbGVzIGFyZSBwcm9jZXNzZWQgaW1tZWRpYXRlbHkuXG4gIC8vIFJlY2VpdmVzIGBmaWxlYFxuICBwcm9jZXNzaW5nOiBmdW5jdGlvbiBwcm9jZXNzaW5nKGZpbGUpIHtcbiAgICBpZiAoZmlsZS5wcmV2aWV3RWxlbWVudCkge1xuICAgICAgZmlsZS5wcmV2aWV3RWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiZHotcHJvY2Vzc2luZ1wiKTtcblxuICAgICAgaWYgKGZpbGUuX3JlbW92ZUxpbmspIHtcbiAgICAgICAgcmV0dXJuIGZpbGUuX3JlbW92ZUxpbmsuaW5uZXJIVE1MID0gdGhpcy5vcHRpb25zLmRpY3RDYW5jZWxVcGxvYWQ7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBwcm9jZXNzaW5nbXVsdGlwbGU6IGZ1bmN0aW9uIHByb2Nlc3NpbmdtdWx0aXBsZSgpIHt9LFxuICAvLyBDYWxsZWQgd2hlbmV2ZXIgdGhlIHVwbG9hZCBwcm9ncmVzcyBnZXRzIHVwZGF0ZWQuXG4gIC8vIFJlY2VpdmVzIGBmaWxlYCwgYHByb2dyZXNzYCAocGVyY2VudGFnZSAwLTEwMCkgYW5kIGBieXRlc1NlbnRgLlxuICAvLyBUbyBnZXQgdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyBvZiB0aGUgZmlsZSwgdXNlIGBmaWxlLnNpemVgXG4gIHVwbG9hZHByb2dyZXNzOiBmdW5jdGlvbiB1cGxvYWRwcm9ncmVzcyhmaWxlLCBwcm9ncmVzcywgYnl0ZXNTZW50KSB7XG4gICAgaWYgKGZpbGUucHJldmlld0VsZW1lbnQpIHtcbiAgICAgIHZhciBfaXRlcmF0b3I3ID0gb3B0aW9uc19jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGZpbGUucHJldmlld0VsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltkYXRhLWR6LXVwbG9hZHByb2dyZXNzXVwiKSwgdHJ1ZSksXG4gICAgICAgICAgX3N0ZXA3O1xuXG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKF9pdGVyYXRvcjcucygpOyAhKF9zdGVwNyA9IF9pdGVyYXRvcjcubigpKS5kb25lOykge1xuICAgICAgICAgIHZhciBub2RlID0gX3N0ZXA3LnZhbHVlO1xuICAgICAgICAgIG5vZGUubm9kZU5hbWUgPT09IFwiUFJPR1JFU1NcIiA/IG5vZGUudmFsdWUgPSBwcm9ncmVzcyA6IG5vZGUuc3R5bGUud2lkdGggPSBcIlwiLmNvbmNhdChwcm9ncmVzcywgXCIlXCIpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgX2l0ZXJhdG9yNy5lKGVycik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBfaXRlcmF0b3I3LmYoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIC8vIENhbGxlZCB3aGVuZXZlciB0aGUgdG90YWwgdXBsb2FkIHByb2dyZXNzIGdldHMgdXBkYXRlZC5cbiAgLy8gQ2FsbGVkIHdpdGggdG90YWxVcGxvYWRQcm9ncmVzcyAoMC0xMDApLCB0b3RhbEJ5dGVzIGFuZCB0b3RhbEJ5dGVzU2VudFxuICB0b3RhbHVwbG9hZHByb2dyZXNzOiBmdW5jdGlvbiB0b3RhbHVwbG9hZHByb2dyZXNzKCkge30sXG4gIC8vIENhbGxlZCBqdXN0IGJlZm9yZSB0aGUgZmlsZSBpcyBzZW50LiBHZXRzIHRoZSBgeGhyYCBvYmplY3QgYXMgc2Vjb25kXG4gIC8vIHBhcmFtZXRlciwgc28geW91IGNhbiBtb2RpZnkgaXQgKGZvciBleGFtcGxlIHRvIGFkZCBhIENTUkYgdG9rZW4pIGFuZCBhXG4gIC8vIGBmb3JtRGF0YWAgb2JqZWN0IHRvIGFkZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLlxuICBzZW5kaW5nOiBmdW5jdGlvbiBzZW5kaW5nKCkge30sXG4gIHNlbmRpbmdtdWx0aXBsZTogZnVuY3Rpb24gc2VuZGluZ211bHRpcGxlKCkge30sXG4gIC8vIFdoZW4gdGhlIGNvbXBsZXRlIHVwbG9hZCBpcyBmaW5pc2hlZCBhbmQgc3VjY2Vzc2Z1bFxuICAvLyBSZWNlaXZlcyBgZmlsZWBcbiAgc3VjY2VzczogZnVuY3Rpb24gc3VjY2VzcyhmaWxlKSB7XG4gICAgaWYgKGZpbGUucHJldmlld0VsZW1lbnQpIHtcbiAgICAgIHJldHVybiBmaWxlLnByZXZpZXdFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJkei1zdWNjZXNzXCIpO1xuICAgIH1cbiAgfSxcbiAgc3VjY2Vzc211bHRpcGxlOiBmdW5jdGlvbiBzdWNjZXNzbXVsdGlwbGUoKSB7fSxcbiAgLy8gV2hlbiB0aGUgdXBsb2FkIGlzIGNhbmNlbGVkLlxuICBjYW5jZWxlZDogZnVuY3Rpb24gY2FuY2VsZWQoZmlsZSkge1xuICAgIHJldHVybiB0aGlzLmVtaXQoXCJlcnJvclwiLCBmaWxlLCB0aGlzLm9wdGlvbnMuZGljdFVwbG9hZENhbmNlbGVkKTtcbiAgfSxcbiAgY2FuY2VsZWRtdWx0aXBsZTogZnVuY3Rpb24gY2FuY2VsZWRtdWx0aXBsZSgpIHt9LFxuICAvLyBXaGVuIHRoZSB1cGxvYWQgaXMgZmluaXNoZWQsIGVpdGhlciB3aXRoIHN1Y2Nlc3Mgb3IgYW4gZXJyb3IuXG4gIC8vIFJlY2VpdmVzIGBmaWxlYFxuICBjb21wbGV0ZTogZnVuY3Rpb24gY29tcGxldGUoZmlsZSkge1xuICAgIGlmIChmaWxlLl9yZW1vdmVMaW5rKSB7XG4gICAgICBmaWxlLl9yZW1vdmVMaW5rLmlubmVySFRNTCA9IHRoaXMub3B0aW9ucy5kaWN0UmVtb3ZlRmlsZTtcbiAgICB9XG5cbiAgICBpZiAoZmlsZS5wcmV2aWV3RWxlbWVudCkge1xuICAgICAgcmV0dXJuIGZpbGUucHJldmlld0VsZW1lbnQuY2xhc3NMaXN0LmFkZChcImR6LWNvbXBsZXRlXCIpO1xuICAgIH1cbiAgfSxcbiAgY29tcGxldGVtdWx0aXBsZTogZnVuY3Rpb24gY29tcGxldGVtdWx0aXBsZSgpIHt9LFxuICBtYXhmaWxlc2V4Y2VlZGVkOiBmdW5jdGlvbiBtYXhmaWxlc2V4Y2VlZGVkKCkge30sXG4gIG1heGZpbGVzcmVhY2hlZDogZnVuY3Rpb24gbWF4ZmlsZXNyZWFjaGVkKCkge30sXG4gIHF1ZXVlY29tcGxldGU6IGZ1bmN0aW9uIHF1ZXVlY29tcGxldGUoKSB7fSxcbiAgYWRkZWRmaWxlczogZnVuY3Rpb24gYWRkZWRmaWxlcygpIHt9XG59O1xuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3JjX29wdGlvbnMgPSAoZGVmYXVsdE9wdGlvbnMpO1xuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Ryb3B6b25lLmpzXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuZnVuY3Rpb24gZHJvcHpvbmVfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihvLCBhbGxvd0FycmF5TGlrZSkgeyB2YXIgaXQ7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChpdCA9IGRyb3B6b25lX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgeyBpZiAoaXQpIG8gPSBpdDsgdmFyIGkgPSAwOyB2YXIgRiA9IGZ1bmN0aW9uIEYoKSB7fTsgcmV0dXJuIHsgczogRiwgbjogZnVuY3Rpb24gbigpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfSwgZTogZnVuY3Rpb24gZShfZSkgeyB0aHJvdyBfZTsgfSwgZjogRiB9OyB9IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSB2YXIgbm9ybWFsQ29tcGxldGlvbiA9IHRydWUsIGRpZEVyciA9IGZhbHNlLCBlcnI7IHJldHVybiB7IHM6IGZ1bmN0aW9uIHMoKSB7IGl0ID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IH0sIG46IGZ1bmN0aW9uIG4oKSB7IHZhciBzdGVwID0gaXQubmV4dCgpOyBub3JtYWxDb21wbGV0aW9uID0gc3RlcC5kb25lOyByZXR1cm4gc3RlcDsgfSwgZTogZnVuY3Rpb24gZShfZTIpIHsgZGlkRXJyID0gdHJ1ZTsgZXJyID0gX2UyOyB9LCBmOiBmdW5jdGlvbiBmKCkgeyB0cnkgeyBpZiAoIW5vcm1hbENvbXBsZXRpb24gJiYgaXQucmV0dXJuICE9IG51bGwpIGl0LnJldHVybigpOyB9IGZpbmFsbHkgeyBpZiAoZGlkRXJyKSB0aHJvdyBlcnI7IH0gfSB9OyB9XG5cbmZ1bmN0aW9uIGRyb3B6b25lX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gZHJvcHpvbmVfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIGRyb3B6b25lX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBkcm9wem9uZV9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG5mdW5jdGlvbiBkcm9wem9uZV9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIGRyb3B6b25lX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5mdW5jdGlvbiBkcm9wem9uZV9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRyb3B6b25lX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkcm9wem9uZV9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgX3NldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTsgfVxuXG5mdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgby5fX3Byb3RvX18gPSBwOyByZXR1cm4gbzsgfTsgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTsgfVxuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmIChjYWxsICYmIChfdHlwZW9mKGNhbGwpID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpKSB7IHJldHVybiBjYWxsOyB9IHJldHVybiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpOyB9XG5cbmZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikgeyBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gc2VsZjsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9XG5cbmZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IHJldHVybiBvLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7IH07IHJldHVybiBfZ2V0UHJvdG90eXBlT2Yobyk7IH1cblxuXG5cblxudmFyIERyb3B6b25lID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfRW1pdHRlcikge1xuICBfaW5oZXJpdHMoRHJvcHpvbmUsIF9FbWl0dGVyKTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKERyb3B6b25lKTtcblxuICBmdW5jdGlvbiBEcm9wem9uZShlbCwgb3B0aW9ucykge1xuICAgIHZhciBfdGhpcztcblxuICAgIGRyb3B6b25lX2NsYXNzQ2FsbENoZWNrKHRoaXMsIERyb3B6b25lKTtcblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcyk7XG4gICAgdmFyIGZhbGxiYWNrLCBsZWZ0O1xuICAgIF90aGlzLmVsZW1lbnQgPSBlbDsgLy8gRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHNpbmNlIHRoZSB2ZXJzaW9uIHdhcyBpbiB0aGUgcHJvdG90eXBlIHByZXZpb3VzbHlcblxuICAgIF90aGlzLnZlcnNpb24gPSBEcm9wem9uZS52ZXJzaW9uO1xuICAgIF90aGlzLmNsaWNrYWJsZUVsZW1lbnRzID0gW107XG4gICAgX3RoaXMubGlzdGVuZXJzID0gW107XG4gICAgX3RoaXMuZmlsZXMgPSBbXTsgLy8gQWxsIGZpbGVzXG5cbiAgICBpZiAodHlwZW9mIF90aGlzLmVsZW1lbnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIF90aGlzLmVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKF90aGlzLmVsZW1lbnQpO1xuICAgIH0gLy8gTm90IGNoZWNraW5nIGlmIGluc3RhbmNlIG9mIEhUTUxFbGVtZW50IG9yIEVsZW1lbnQgc2luY2UgSUU5IGlzIGV4dHJlbWVseSB3ZWlyZC5cblxuXG4gICAgaWYgKCFfdGhpcy5lbGVtZW50IHx8IF90aGlzLmVsZW1lbnQubm9kZVR5cGUgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBkcm9wem9uZSBlbGVtZW50LlwiKTtcbiAgICB9XG5cbiAgICBpZiAoX3RoaXMuZWxlbWVudC5kcm9wem9uZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRHJvcHpvbmUgYWxyZWFkeSBhdHRhY2hlZC5cIik7XG4gICAgfSAvLyBOb3cgYWRkIHRoaXMgZHJvcHpvbmUgdG8gdGhlIGluc3RhbmNlcy5cblxuXG4gICAgRHJvcHpvbmUuaW5zdGFuY2VzLnB1c2goX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpOyAvLyBQdXQgdGhlIGRyb3B6b25lIGluc2lkZSB0aGUgZWxlbWVudCBpdHNlbGYuXG5cbiAgICBfdGhpcy5lbGVtZW50LmRyb3B6b25lID0gX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyk7XG4gICAgdmFyIGVsZW1lbnRPcHRpb25zID0gKGxlZnQgPSBEcm9wem9uZS5vcHRpb25zRm9yRWxlbWVudChfdGhpcy5lbGVtZW50KSkgIT0gbnVsbCA/IGxlZnQgOiB7fTtcbiAgICBfdGhpcy5vcHRpb25zID0gRHJvcHpvbmUuZXh0ZW5kKHt9LCBzcmNfb3B0aW9ucywgZWxlbWVudE9wdGlvbnMsIG9wdGlvbnMgIT0gbnVsbCA/IG9wdGlvbnMgOiB7fSk7XG4gICAgX3RoaXMub3B0aW9ucy5wcmV2aWV3VGVtcGxhdGUgPSBfdGhpcy5vcHRpb25zLnByZXZpZXdUZW1wbGF0ZS5yZXBsYWNlKC9cXG4qL2csIFwiXCIpOyAvLyBJZiB0aGUgYnJvd3NlciBmYWlsZWQsIGp1c3QgY2FsbCB0aGUgZmFsbGJhY2sgYW5kIGxlYXZlXG5cbiAgICBpZiAoX3RoaXMub3B0aW9ucy5mb3JjZUZhbGxiYWNrIHx8ICFEcm9wem9uZS5pc0Jyb3dzZXJTdXBwb3J0ZWQoKSkge1xuICAgICAgcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKF90aGlzLCBfdGhpcy5vcHRpb25zLmZhbGxiYWNrLmNhbGwoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpKTtcbiAgICB9IC8vIEBvcHRpb25zLnVybCA9IEBlbGVtZW50LmdldEF0dHJpYnV0ZSBcImFjdGlvblwiIHVubGVzcyBAb3B0aW9ucy51cmw/XG5cblxuICAgIGlmIChfdGhpcy5vcHRpb25zLnVybCA9PSBudWxsKSB7XG4gICAgICBfdGhpcy5vcHRpb25zLnVybCA9IF90aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiYWN0aW9uXCIpO1xuICAgIH1cblxuICAgIGlmICghX3RoaXMub3B0aW9ucy51cmwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIFVSTCBwcm92aWRlZC5cIik7XG4gICAgfVxuXG4gICAgaWYgKF90aGlzLm9wdGlvbnMuYWNjZXB0ZWRGaWxlcyAmJiBfdGhpcy5vcHRpb25zLmFjY2VwdGVkTWltZVR5cGVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJZb3UgY2FuJ3QgcHJvdmlkZSBib3RoICdhY2NlcHRlZEZpbGVzJyBhbmQgJ2FjY2VwdGVkTWltZVR5cGVzJy4gJ2FjY2VwdGVkTWltZVR5cGVzJyBpcyBkZXByZWNhdGVkLlwiKTtcbiAgICB9XG5cbiAgICBpZiAoX3RoaXMub3B0aW9ucy51cGxvYWRNdWx0aXBsZSAmJiBfdGhpcy5vcHRpb25zLmNodW5raW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJZb3UgY2Fubm90IHNldCBib3RoOiB1cGxvYWRNdWx0aXBsZSBhbmQgY2h1bmtpbmcuXCIpO1xuICAgIH0gLy8gQmFja3dhcmRzIGNvbXBhdGliaWxpdHlcblxuXG4gICAgaWYgKF90aGlzLm9wdGlvbnMuYWNjZXB0ZWRNaW1lVHlwZXMpIHtcbiAgICAgIF90aGlzLm9wdGlvbnMuYWNjZXB0ZWRGaWxlcyA9IF90aGlzLm9wdGlvbnMuYWNjZXB0ZWRNaW1lVHlwZXM7XG4gICAgICBkZWxldGUgX3RoaXMub3B0aW9ucy5hY2NlcHRlZE1pbWVUeXBlcztcbiAgICB9IC8vIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5cblxuICAgIGlmIChfdGhpcy5vcHRpb25zLnJlbmFtZUZpbGVuYW1lICE9IG51bGwpIHtcbiAgICAgIF90aGlzLm9wdGlvbnMucmVuYW1lRmlsZSA9IGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgICAgIHJldHVybiBfdGhpcy5vcHRpb25zLnJlbmFtZUZpbGVuYW1lLmNhbGwoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIGZpbGUubmFtZSwgZmlsZSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgX3RoaXMub3B0aW9ucy5tZXRob2QgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIF90aGlzLm9wdGlvbnMubWV0aG9kID0gX3RoaXMub3B0aW9ucy5tZXRob2QudG9VcHBlckNhc2UoKTtcbiAgICB9XG5cbiAgICBpZiAoKGZhbGxiYWNrID0gX3RoaXMuZ2V0RXhpc3RpbmdGYWxsYmFjaygpKSAmJiBmYWxsYmFjay5wYXJlbnROb2RlKSB7XG4gICAgICAvLyBSZW1vdmUgdGhlIGZhbGxiYWNrXG4gICAgICBmYWxsYmFjay5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGZhbGxiYWNrKTtcbiAgICB9IC8vIERpc3BsYXkgcHJldmlld3MgaW4gdGhlIHByZXZpZXdzQ29udGFpbmVyIGVsZW1lbnQgb3IgdGhlIERyb3B6b25lIGVsZW1lbnQgdW5sZXNzIGV4cGxpY2l0bHkgc2V0IHRvIGZhbHNlXG5cblxuICAgIGlmIChfdGhpcy5vcHRpb25zLnByZXZpZXdzQ29udGFpbmVyICE9PSBmYWxzZSkge1xuICAgICAgaWYgKF90aGlzLm9wdGlvbnMucHJldmlld3NDb250YWluZXIpIHtcbiAgICAgICAgX3RoaXMucHJldmlld3NDb250YWluZXIgPSBEcm9wem9uZS5nZXRFbGVtZW50KF90aGlzLm9wdGlvbnMucHJldmlld3NDb250YWluZXIsIFwicHJldmlld3NDb250YWluZXJcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfdGhpcy5wcmV2aWV3c0NvbnRhaW5lciA9IF90aGlzLmVsZW1lbnQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKF90aGlzLm9wdGlvbnMuY2xpY2thYmxlKSB7XG4gICAgICBpZiAoX3RoaXMub3B0aW9ucy5jbGlja2FibGUgPT09IHRydWUpIHtcbiAgICAgICAgX3RoaXMuY2xpY2thYmxlRWxlbWVudHMgPSBbX3RoaXMuZWxlbWVudF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfdGhpcy5jbGlja2FibGVFbGVtZW50cyA9IERyb3B6b25lLmdldEVsZW1lbnRzKF90aGlzLm9wdGlvbnMuY2xpY2thYmxlLCBcImNsaWNrYWJsZVwiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBfdGhpcy5pbml0KCk7XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH0gLy8gUmV0dXJucyBhbGwgZmlsZXMgdGhhdCBoYXZlIGJlZW4gYWNjZXB0ZWRcblxuXG4gIGRyb3B6b25lX2NyZWF0ZUNsYXNzKERyb3B6b25lLCBbe1xuICAgIGtleTogXCJnZXRBY2NlcHRlZEZpbGVzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEFjY2VwdGVkRmlsZXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWxlcy5maWx0ZXIoZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgICAgcmV0dXJuIGZpbGUuYWNjZXB0ZWQ7XG4gICAgICB9KS5tYXAoZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgICAgcmV0dXJuIGZpbGU7XG4gICAgICB9KTtcbiAgICB9IC8vIFJldHVybnMgYWxsIGZpbGVzIHRoYXQgaGF2ZSBiZWVuIHJlamVjdGVkXG4gICAgLy8gTm90IHN1cmUgd2hlbiB0aGF0J3MgZ29pbmcgdG8gYmUgdXNlZnVsLCBidXQgYWRkZWQgZm9yIGNvbXBsZXRlbmVzcy5cblxuICB9LCB7XG4gICAga2V5OiBcImdldFJlamVjdGVkRmlsZXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UmVqZWN0ZWRGaWxlcygpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbGVzLmZpbHRlcihmdW5jdGlvbiAoZmlsZSkge1xuICAgICAgICByZXR1cm4gIWZpbGUuYWNjZXB0ZWQ7XG4gICAgICB9KS5tYXAoZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgICAgcmV0dXJuIGZpbGU7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0RmlsZXNXaXRoU3RhdHVzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEZpbGVzV2l0aFN0YXR1cyhzdGF0dXMpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbGVzLmZpbHRlcihmdW5jdGlvbiAoZmlsZSkge1xuICAgICAgICByZXR1cm4gZmlsZS5zdGF0dXMgPT09IHN0YXR1cztcbiAgICAgIH0pLm1hcChmdW5jdGlvbiAoZmlsZSkge1xuICAgICAgICByZXR1cm4gZmlsZTtcbiAgICAgIH0pO1xuICAgIH0gLy8gUmV0dXJucyBhbGwgZmlsZXMgdGhhdCBhcmUgaW4gdGhlIHF1ZXVlXG5cbiAgfSwge1xuICAgIGtleTogXCJnZXRRdWV1ZWRGaWxlc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRRdWV1ZWRGaWxlcygpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEZpbGVzV2l0aFN0YXR1cyhEcm9wem9uZS5RVUVVRUQpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRVcGxvYWRpbmdGaWxlc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRVcGxvYWRpbmdGaWxlcygpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEZpbGVzV2l0aFN0YXR1cyhEcm9wem9uZS5VUExPQURJTkcpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRBZGRlZEZpbGVzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEFkZGVkRmlsZXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRGaWxlc1dpdGhTdGF0dXMoRHJvcHpvbmUuQURERUQpO1xuICAgIH0gLy8gRmlsZXMgdGhhdCBhcmUgZWl0aGVyIHF1ZXVlZCBvciB1cGxvYWRpbmdcblxuICB9LCB7XG4gICAga2V5OiBcImdldEFjdGl2ZUZpbGVzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEFjdGl2ZUZpbGVzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsZXMuZmlsdGVyKGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgICAgIHJldHVybiBmaWxlLnN0YXR1cyA9PT0gRHJvcHpvbmUuVVBMT0FESU5HIHx8IGZpbGUuc3RhdHVzID09PSBEcm9wem9uZS5RVUVVRUQ7XG4gICAgICB9KS5tYXAoZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgICAgcmV0dXJuIGZpbGU7XG4gICAgICB9KTtcbiAgICB9IC8vIFRoZSBmdW5jdGlvbiB0aGF0IGdldHMgY2FsbGVkIHdoZW4gRHJvcHpvbmUgaXMgaW5pdGlhbGl6ZWQuIFlvdVxuICAgIC8vIGNhbiAoYW5kIHNob3VsZCkgc2V0dXAgZXZlbnQgbGlzdGVuZXJzIGluc2lkZSB0aGlzIGZ1bmN0aW9uLlxuXG4gIH0sIHtcbiAgICBrZXk6IFwiaW5pdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIC8vIEluIGNhc2UgaXQgaXNuJ3Qgc2V0IGFscmVhZHlcbiAgICAgIGlmICh0aGlzLmVsZW1lbnQudGFnTmFtZSA9PT0gXCJmb3JtXCIpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZShcImVuY3R5cGVcIiwgXCJtdWx0aXBhcnQvZm9ybS1kYXRhXCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhcImRyb3B6b25lXCIpICYmICF0aGlzLmVsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5kei1tZXNzYWdlXCIpKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZChEcm9wem9uZS5jcmVhdGVFbGVtZW50KFwiPGRpdiBjbGFzcz1cXFwiZHotZGVmYXVsdCBkei1tZXNzYWdlXFxcIj48YnV0dG9uIGNsYXNzPVxcXCJkei1idXR0b25cXFwiIHR5cGU9XFxcImJ1dHRvblxcXCI+XCIuY29uY2F0KHRoaXMub3B0aW9ucy5kaWN0RGVmYXVsdE1lc3NhZ2UsIFwiPC9idXR0b24+PC9kaXY+XCIpKSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmNsaWNrYWJsZUVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICB2YXIgc2V0dXBIaWRkZW5GaWxlSW5wdXQgPSBmdW5jdGlvbiBzZXR1cEhpZGRlbkZpbGVJbnB1dCgpIHtcbiAgICAgICAgICBpZiAoX3RoaXMyLmhpZGRlbkZpbGVJbnB1dCkge1xuICAgICAgICAgICAgX3RoaXMyLmhpZGRlbkZpbGVJbnB1dC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKF90aGlzMi5oaWRkZW5GaWxlSW5wdXQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF90aGlzMi5oaWRkZW5GaWxlSW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG5cbiAgICAgICAgICBfdGhpczIuaGlkZGVuRmlsZUlucHV0LnNldEF0dHJpYnV0ZShcInR5cGVcIiwgXCJmaWxlXCIpO1xuXG4gICAgICAgICAgaWYgKF90aGlzMi5vcHRpb25zLm1heEZpbGVzID09PSBudWxsIHx8IF90aGlzMi5vcHRpb25zLm1heEZpbGVzID4gMSkge1xuICAgICAgICAgICAgX3RoaXMyLmhpZGRlbkZpbGVJbnB1dC5zZXRBdHRyaWJ1dGUoXCJtdWx0aXBsZVwiLCBcIm11bHRpcGxlXCIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF90aGlzMi5oaWRkZW5GaWxlSW5wdXQuY2xhc3NOYW1lID0gXCJkei1oaWRkZW4taW5wdXRcIjtcblxuICAgICAgICAgIGlmIChfdGhpczIub3B0aW9ucy5hY2NlcHRlZEZpbGVzICE9PSBudWxsKSB7XG4gICAgICAgICAgICBfdGhpczIuaGlkZGVuRmlsZUlucHV0LnNldEF0dHJpYnV0ZShcImFjY2VwdFwiLCBfdGhpczIub3B0aW9ucy5hY2NlcHRlZEZpbGVzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoX3RoaXMyLm9wdGlvbnMuY2FwdHVyZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgX3RoaXMyLmhpZGRlbkZpbGVJbnB1dC5zZXRBdHRyaWJ1dGUoXCJjYXB0dXJlXCIsIF90aGlzMi5vcHRpb25zLmNhcHR1cmUpO1xuICAgICAgICAgIH0gLy8gTWFraW5nIHN1cmUgdGhhdCBubyBvbmUgY2FuIFwidGFiXCIgaW50byB0aGlzIGZpZWxkLlxuXG5cbiAgICAgICAgICBfdGhpczIuaGlkZGVuRmlsZUlucHV0LnNldEF0dHJpYnV0ZShcInRhYmluZGV4XCIsIFwiLTFcIik7IC8vIE5vdCBzZXR0aW5nIGBkaXNwbGF5PVwibm9uZVwiYCBiZWNhdXNlIHNvbWUgYnJvd3NlcnMgZG9uJ3QgYWNjZXB0IGNsaWNrc1xuICAgICAgICAgIC8vIG9uIGVsZW1lbnRzIHRoYXQgYXJlbid0IGRpc3BsYXllZC5cblxuXG4gICAgICAgICAgX3RoaXMyLmhpZGRlbkZpbGVJbnB1dC5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcbiAgICAgICAgICBfdGhpczIuaGlkZGVuRmlsZUlucHV0LnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuICAgICAgICAgIF90aGlzMi5oaWRkZW5GaWxlSW5wdXQuc3R5bGUudG9wID0gXCIwXCI7XG4gICAgICAgICAgX3RoaXMyLmhpZGRlbkZpbGVJbnB1dC5zdHlsZS5sZWZ0ID0gXCIwXCI7XG4gICAgICAgICAgX3RoaXMyLmhpZGRlbkZpbGVJbnB1dC5zdHlsZS5oZWlnaHQgPSBcIjBcIjtcbiAgICAgICAgICBfdGhpczIuaGlkZGVuRmlsZUlucHV0LnN0eWxlLndpZHRoID0gXCIwXCI7XG4gICAgICAgICAgRHJvcHpvbmUuZ2V0RWxlbWVudChfdGhpczIub3B0aW9ucy5oaWRkZW5JbnB1dENvbnRhaW5lciwgXCJoaWRkZW5JbnB1dENvbnRhaW5lclwiKS5hcHBlbmRDaGlsZChfdGhpczIuaGlkZGVuRmlsZUlucHV0KTtcblxuICAgICAgICAgIF90aGlzMi5oaWRkZW5GaWxlSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZmlsZXMgPSBfdGhpczIuaGlkZGVuRmlsZUlucHV0LmZpbGVzO1xuXG4gICAgICAgICAgICBpZiAoZmlsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHZhciBfaXRlcmF0b3IgPSBkcm9wem9uZV9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGZpbGVzLCB0cnVlKSxcbiAgICAgICAgICAgICAgICAgIF9zdGVwO1xuXG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHtcbiAgICAgICAgICAgICAgICAgIHZhciBmaWxlID0gX3N0ZXAudmFsdWU7XG5cbiAgICAgICAgICAgICAgICAgIF90aGlzMi5hZGRGaWxlKGZpbGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgX2l0ZXJhdG9yLmUoZXJyKTtcbiAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBfaXRlcmF0b3IuZigpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF90aGlzMi5lbWl0KFwiYWRkZWRmaWxlc1wiLCBmaWxlcyk7XG5cbiAgICAgICAgICAgIHNldHVwSGlkZGVuRmlsZUlucHV0KCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgc2V0dXBIaWRkZW5GaWxlSW5wdXQoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5VUkwgPSB3aW5kb3cuVVJMICE9PSBudWxsID8gd2luZG93LlVSTCA6IHdpbmRvdy53ZWJraXRVUkw7IC8vIFNldHVwIGFsbCBldmVudCBsaXN0ZW5lcnMgb24gdGhlIERyb3B6b25lIG9iamVjdCBpdHNlbGYuXG4gICAgICAvLyBUaGV5J3JlIG5vdCBpbiBAc2V0dXBFdmVudExpc3RlbmVycygpIGJlY2F1c2UgdGhleSBzaG91bGRuJ3QgYmUgcmVtb3ZlZFxuICAgICAgLy8gYWdhaW4gd2hlbiB0aGUgZHJvcHpvbmUgZ2V0cyBkaXNhYmxlZC5cblxuICAgICAgdmFyIF9pdGVyYXRvcjIgPSBkcm9wem9uZV9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHRoaXMuZXZlbnRzLCB0cnVlKSxcbiAgICAgICAgICBfc3RlcDI7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoX2l0ZXJhdG9yMi5zKCk7ICEoX3N0ZXAyID0gX2l0ZXJhdG9yMi5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgdmFyIGV2ZW50TmFtZSA9IF9zdGVwMi52YWx1ZTtcbiAgICAgICAgICB0aGlzLm9uKGV2ZW50TmFtZSwgdGhpcy5vcHRpb25zW2V2ZW50TmFtZV0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgX2l0ZXJhdG9yMi5lKGVycik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBfaXRlcmF0b3IyLmYoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5vbihcInVwbG9hZHByb2dyZXNzXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMi51cGRhdGVUb3RhbFVwbG9hZFByb2dyZXNzKCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMub24oXCJyZW1vdmVkZmlsZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfdGhpczIudXBkYXRlVG90YWxVcGxvYWRQcm9ncmVzcygpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLm9uKFwiY2FuY2VsZWRcIiwgZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMi5lbWl0KFwiY29tcGxldGVcIiwgZmlsZSk7XG4gICAgICB9KTsgLy8gRW1pdCBhIGBxdWV1ZWNvbXBsZXRlYCBldmVudCBpZiBhbGwgZmlsZXMgZmluaXNoZWQgdXBsb2FkaW5nLlxuXG4gICAgICB0aGlzLm9uKFwiY29tcGxldGVcIiwgZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgICAgaWYgKF90aGlzMi5nZXRBZGRlZEZpbGVzKCkubGVuZ3RoID09PSAwICYmIF90aGlzMi5nZXRVcGxvYWRpbmdGaWxlcygpLmxlbmd0aCA9PT0gMCAmJiBfdGhpczIuZ2V0UXVldWVkRmlsZXMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAvLyBUaGlzIG5lZWRzIHRvIGJlIGRlZmVycmVkIHNvIHRoYXQgYHF1ZXVlY29tcGxldGVgIHJlYWxseSB0cmlnZ2VycyBhZnRlciBgY29tcGxldGVgXG4gICAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzMi5lbWl0KFwicXVldWVjb21wbGV0ZVwiKTtcbiAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHZhciBjb250YWluc0ZpbGVzID0gZnVuY3Rpb24gY29udGFpbnNGaWxlcyhlKSB7XG4gICAgICAgIGlmIChlLmRhdGFUcmFuc2Zlci50eXBlcykge1xuICAgICAgICAgIC8vIEJlY2F1c2UgZS5kYXRhVHJhbnNmZXIudHlwZXMgaXMgYW4gT2JqZWN0IGluXG4gICAgICAgICAgLy8gSUUsIHdlIG5lZWQgdG8gaXRlcmF0ZSBsaWtlIHRoaXMgaW5zdGVhZCBvZlxuICAgICAgICAgIC8vIHVzaW5nIGUuZGF0YVRyYW5zZmVyLnR5cGVzLnNvbWUoKVxuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZS5kYXRhVHJhbnNmZXIudHlwZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChlLmRhdGFUcmFuc2Zlci50eXBlc1tpXSA9PT0gXCJGaWxlc1wiKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9O1xuXG4gICAgICB2YXIgbm9Qcm9wYWdhdGlvbiA9IGZ1bmN0aW9uIG5vUHJvcGFnYXRpb24oZSkge1xuICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gZmlsZXMsIHdlIGRvbid0IHdhbnQgdG8gc3RvcFxuICAgICAgICAvLyBwcm9wYWdhdGlvbiBzbyB3ZSBkb24ndCBpbnRlcmZlcmUgd2l0aCBvdGhlclxuICAgICAgICAvLyBkcmFnIGFuZCBkcm9wIGJlaGF2aW91ci5cbiAgICAgICAgaWYgKCFjb250YWluc0ZpbGVzKGUpKSByZXR1cm47XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgaWYgKGUucHJldmVudERlZmF1bHQpIHtcbiAgICAgICAgICByZXR1cm4gZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBlLnJldHVyblZhbHVlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH07IC8vIENyZWF0ZSB0aGUgbGlzdGVuZXJzXG5cblxuICAgICAgdGhpcy5saXN0ZW5lcnMgPSBbe1xuICAgICAgICBlbGVtZW50OiB0aGlzLmVsZW1lbnQsXG4gICAgICAgIGV2ZW50czoge1xuICAgICAgICAgIGRyYWdzdGFydDogZnVuY3Rpb24gZHJhZ3N0YXJ0KGUpIHtcbiAgICAgICAgICAgIHJldHVybiBfdGhpczIuZW1pdChcImRyYWdzdGFydFwiLCBlKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGRyYWdlbnRlcjogZnVuY3Rpb24gZHJhZ2VudGVyKGUpIHtcbiAgICAgICAgICAgIG5vUHJvcGFnYXRpb24oZSk7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMyLmVtaXQoXCJkcmFnZW50ZXJcIiwgZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBkcmFnb3ZlcjogZnVuY3Rpb24gZHJhZ292ZXIoZSkge1xuICAgICAgICAgICAgLy8gTWFrZXMgaXQgcG9zc2libGUgdG8gZHJhZyBmaWxlcyBmcm9tIGNocm9tZSdzIGRvd25sb2FkIGJhclxuICAgICAgICAgICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xOTUyNjQzMC9kcmFnLWFuZC1kcm9wLWZpbGUtdXBsb2Fkcy1mcm9tLWNocm9tZS1kb3dubG9hZHMtYmFyXG4gICAgICAgICAgICAvLyBUcnkgaXMgcmVxdWlyZWQgdG8gcHJldmVudCBidWcgaW4gSW50ZXJuZXQgRXhwbG9yZXIgMTEgKFNDUklQVDY1NTM1IGV4Y2VwdGlvbilcbiAgICAgICAgICAgIHZhciBlZmN0O1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBlZmN0ID0gZS5kYXRhVHJhbnNmZXIuZWZmZWN0QWxsb3dlZDtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7fVxuXG4gICAgICAgICAgICBlLmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gXCJtb3ZlXCIgPT09IGVmY3QgfHwgXCJsaW5rTW92ZVwiID09PSBlZmN0ID8gXCJtb3ZlXCIgOiBcImNvcHlcIjtcbiAgICAgICAgICAgIG5vUHJvcGFnYXRpb24oZSk7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMyLmVtaXQoXCJkcmFnb3ZlclwiLCBlKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGRyYWdsZWF2ZTogZnVuY3Rpb24gZHJhZ2xlYXZlKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBfdGhpczIuZW1pdChcImRyYWdsZWF2ZVwiLCBlKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGRyb3A6IGZ1bmN0aW9uIGRyb3AoZSkge1xuICAgICAgICAgICAgbm9Qcm9wYWdhdGlvbihlKTtcbiAgICAgICAgICAgIHJldHVybiBfdGhpczIuZHJvcChlKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGRyYWdlbmQ6IGZ1bmN0aW9uIGRyYWdlbmQoZSkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzMi5lbWl0KFwiZHJhZ2VuZFwiLCBlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gVGhpcyBpcyBkaXNhYmxlZCByaWdodCBub3csIGJlY2F1c2UgdGhlIGJyb3dzZXJzIGRvbid0IGltcGxlbWVudCBpdCBwcm9wZXJseS5cbiAgICAgICAgLy8gXCJwYXN0ZVwiOiAoZSkgPT5cbiAgICAgICAgLy8gICBub1Byb3BhZ2F0aW9uIGVcbiAgICAgICAgLy8gICBAcGFzdGUgZVxuXG4gICAgICB9XTtcbiAgICAgIHRoaXMuY2xpY2thYmxlRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAoY2xpY2thYmxlRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gX3RoaXMyLmxpc3RlbmVycy5wdXNoKHtcbiAgICAgICAgICBlbGVtZW50OiBjbGlja2FibGVFbGVtZW50LFxuICAgICAgICAgIGV2ZW50czoge1xuICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uIGNsaWNrKGV2dCkge1xuICAgICAgICAgICAgICAvLyBPbmx5IHRoZSBhY3R1YWwgZHJvcHpvbmUgb3IgdGhlIG1lc3NhZ2UgZWxlbWVudCBzaG91bGQgdHJpZ2dlciBmaWxlIHNlbGVjdGlvblxuICAgICAgICAgICAgICBpZiAoY2xpY2thYmxlRWxlbWVudCAhPT0gX3RoaXMyLmVsZW1lbnQgfHwgZXZ0LnRhcmdldCA9PT0gX3RoaXMyLmVsZW1lbnQgfHwgRHJvcHpvbmUuZWxlbWVudEluc2lkZShldnQudGFyZ2V0LCBfdGhpczIuZWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiLmR6LW1lc3NhZ2VcIikpKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMyLmhpZGRlbkZpbGVJbnB1dC5jbGljaygpOyAvLyBGb3J3YXJkIHRoZSBjbGlja1xuXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmVuYWJsZSgpO1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5pbml0LmNhbGwodGhpcyk7XG4gICAgfSAvLyBOb3QgZnVsbHkgdGVzdGVkIHlldFxuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGVzdHJveVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgICAgdGhpcy5kaXNhYmxlKCk7XG4gICAgICB0aGlzLnJlbW92ZUFsbEZpbGVzKHRydWUpO1xuXG4gICAgICBpZiAodGhpcy5oaWRkZW5GaWxlSW5wdXQgIT0gbnVsbCA/IHRoaXMuaGlkZGVuRmlsZUlucHV0LnBhcmVudE5vZGUgOiB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5oaWRkZW5GaWxlSW5wdXQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmhpZGRlbkZpbGVJbnB1dCk7XG4gICAgICAgIHRoaXMuaGlkZGVuRmlsZUlucHV0ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgZGVsZXRlIHRoaXMuZWxlbWVudC5kcm9wem9uZTtcbiAgICAgIHJldHVybiBEcm9wem9uZS5pbnN0YW5jZXMuc3BsaWNlKERyb3B6b25lLmluc3RhbmNlcy5pbmRleE9mKHRoaXMpLCAxKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidXBkYXRlVG90YWxVcGxvYWRQcm9ncmVzc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGVUb3RhbFVwbG9hZFByb2dyZXNzKCkge1xuICAgICAgdmFyIHRvdGFsVXBsb2FkUHJvZ3Jlc3M7XG4gICAgICB2YXIgdG90YWxCeXRlc1NlbnQgPSAwO1xuICAgICAgdmFyIHRvdGFsQnl0ZXMgPSAwO1xuICAgICAgdmFyIGFjdGl2ZUZpbGVzID0gdGhpcy5nZXRBY3RpdmVGaWxlcygpO1xuXG4gICAgICBpZiAoYWN0aXZlRmlsZXMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBfaXRlcmF0b3IzID0gZHJvcHpvbmVfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcih0aGlzLmdldEFjdGl2ZUZpbGVzKCksIHRydWUpLFxuICAgICAgICAgICAgX3N0ZXAzO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZm9yIChfaXRlcmF0b3IzLnMoKTsgIShfc3RlcDMgPSBfaXRlcmF0b3IzLm4oKSkuZG9uZTspIHtcbiAgICAgICAgICAgIHZhciBmaWxlID0gX3N0ZXAzLnZhbHVlO1xuICAgICAgICAgICAgdG90YWxCeXRlc1NlbnQgKz0gZmlsZS51cGxvYWQuYnl0ZXNTZW50O1xuICAgICAgICAgICAgdG90YWxCeXRlcyArPSBmaWxlLnVwbG9hZC50b3RhbDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIF9pdGVyYXRvcjMuZShlcnIpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIF9pdGVyYXRvcjMuZigpO1xuICAgICAgICB9XG5cbiAgICAgICAgdG90YWxVcGxvYWRQcm9ncmVzcyA9IDEwMCAqIHRvdGFsQnl0ZXNTZW50IC8gdG90YWxCeXRlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRvdGFsVXBsb2FkUHJvZ3Jlc3MgPSAxMDA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmVtaXQoXCJ0b3RhbHVwbG9hZHByb2dyZXNzXCIsIHRvdGFsVXBsb2FkUHJvZ3Jlc3MsIHRvdGFsQnl0ZXMsIHRvdGFsQnl0ZXNTZW50KTtcbiAgICB9IC8vIEBvcHRpb25zLnBhcmFtTmFtZSBjYW4gYmUgYSBmdW5jdGlvbiB0YWtpbmcgb25lIHBhcmFtZXRlciByYXRoZXIgdGhhbiBhIHN0cmluZy5cbiAgICAvLyBBIHBhcmFtZXRlciBuYW1lIGZvciBhIGZpbGUgaXMgb2J0YWluZWQgc2ltcGx5IGJ5IGNhbGxpbmcgdGhpcyB3aXRoIGFuIGluZGV4IG51bWJlci5cblxuICB9LCB7XG4gICAga2V5OiBcIl9nZXRQYXJhbU5hbWVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2dldFBhcmFtTmFtZShuKSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5wYXJhbU5hbWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLnBhcmFtTmFtZShuKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBcIlwiLmNvbmNhdCh0aGlzLm9wdGlvbnMucGFyYW1OYW1lKS5jb25jYXQodGhpcy5vcHRpb25zLnVwbG9hZE11bHRpcGxlID8gXCJbXCIuY29uY2F0KG4sIFwiXVwiKSA6IFwiXCIpO1xuICAgICAgfVxuICAgIH0gLy8gSWYgQG9wdGlvbnMucmVuYW1lRmlsZSBpcyBhIGZ1bmN0aW9uLFxuICAgIC8vIHRoZSBmdW5jdGlvbiB3aWxsIGJlIHVzZWQgdG8gcmVuYW1lIHRoZSBmaWxlLm5hbWUgYmVmb3JlIGFwcGVuZGluZyBpdCB0byB0aGUgZm9ybURhdGFcblxuICB9LCB7XG4gICAga2V5OiBcIl9yZW5hbWVGaWxlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9yZW5hbWVGaWxlKGZpbGUpIHtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLnJlbmFtZUZpbGUgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gZmlsZS5uYW1lO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zLnJlbmFtZUZpbGUoZmlsZSk7XG4gICAgfSAvLyBSZXR1cm5zIGEgZm9ybSB0aGF0IGNhbiBiZSB1c2VkIGFzIGZhbGxiYWNrIGlmIHRoZSBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgRHJhZ25Ecm9wXG4gICAgLy9cbiAgICAvLyBJZiB0aGUgZHJvcHpvbmUgaXMgYWxyZWFkeSBhIGZvcm0sIG9ubHkgdGhlIGlucHV0IGZpZWxkIGFuZCBidXR0b24gYXJlIHJldHVybmVkLiBPdGhlcndpc2UgYSBjb21wbGV0ZSBmb3JtIGVsZW1lbnQgaXMgcHJvdmlkZWQuXG4gICAgLy8gVGhpcyBjb2RlIGhhcyB0byBwYXNzIGluIElFNyA6KFxuXG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0RmFsbGJhY2tGb3JtXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEZhbGxiYWNrRm9ybSgpIHtcbiAgICAgIHZhciBleGlzdGluZ0ZhbGxiYWNrLCBmb3JtO1xuXG4gICAgICBpZiAoZXhpc3RpbmdGYWxsYmFjayA9IHRoaXMuZ2V0RXhpc3RpbmdGYWxsYmFjaygpKSB7XG4gICAgICAgIHJldHVybiBleGlzdGluZ0ZhbGxiYWNrO1xuICAgICAgfVxuXG4gICAgICB2YXIgZmllbGRzU3RyaW5nID0gJzxkaXYgY2xhc3M9XCJkei1mYWxsYmFja1wiPic7XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZGljdEZhbGxiYWNrVGV4dCkge1xuICAgICAgICBmaWVsZHNTdHJpbmcgKz0gXCI8cD5cIi5jb25jYXQodGhpcy5vcHRpb25zLmRpY3RGYWxsYmFja1RleHQsIFwiPC9wPlwiKTtcbiAgICAgIH1cblxuICAgICAgZmllbGRzU3RyaW5nICs9IFwiPGlucHV0IHR5cGU9XFxcImZpbGVcXFwiIG5hbWU9XFxcIlwiLmNvbmNhdCh0aGlzLl9nZXRQYXJhbU5hbWUoMCksIFwiXFxcIiBcIikuY29uY2F0KHRoaXMub3B0aW9ucy51cGxvYWRNdWx0aXBsZSA/ICdtdWx0aXBsZT1cIm11bHRpcGxlXCInIDogdW5kZWZpbmVkLCBcIiAvPjxpbnB1dCB0eXBlPVxcXCJzdWJtaXRcXFwiIHZhbHVlPVxcXCJVcGxvYWQhXFxcIj48L2Rpdj5cIik7XG4gICAgICB2YXIgZmllbGRzID0gRHJvcHpvbmUuY3JlYXRlRWxlbWVudChmaWVsZHNTdHJpbmcpO1xuXG4gICAgICBpZiAodGhpcy5lbGVtZW50LnRhZ05hbWUgIT09IFwiRk9STVwiKSB7XG4gICAgICAgIGZvcm0gPSBEcm9wem9uZS5jcmVhdGVFbGVtZW50KFwiPGZvcm0gYWN0aW9uPVxcXCJcIi5jb25jYXQodGhpcy5vcHRpb25zLnVybCwgXCJcXFwiIGVuY3R5cGU9XFxcIm11bHRpcGFydC9mb3JtLWRhdGFcXFwiIG1ldGhvZD1cXFwiXCIpLmNvbmNhdCh0aGlzLm9wdGlvbnMubWV0aG9kLCBcIlxcXCI+PC9mb3JtPlwiKSk7XG4gICAgICAgIGZvcm0uYXBwZW5kQ2hpbGQoZmllbGRzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBlbmN0eXBlIGFuZCBtZXRob2QgYXR0cmlidXRlcyBhcmUgc2V0IHByb3Blcmx5XG4gICAgICAgIHRoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJlbmN0eXBlXCIsIFwibXVsdGlwYXJ0L2Zvcm0tZGF0YVwiKTtcbiAgICAgICAgdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZShcIm1ldGhvZFwiLCB0aGlzLm9wdGlvbnMubWV0aG9kKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZvcm0gIT0gbnVsbCA/IGZvcm0gOiBmaWVsZHM7XG4gICAgfSAvLyBSZXR1cm5zIHRoZSBmYWxsYmFjayBlbGVtZW50cyBpZiB0aGV5IGV4aXN0IGFscmVhZHlcbiAgICAvL1xuICAgIC8vIFRoaXMgY29kZSBoYXMgdG8gcGFzcyBpbiBJRTcgOihcblxuICB9LCB7XG4gICAga2V5OiBcImdldEV4aXN0aW5nRmFsbGJhY2tcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0RXhpc3RpbmdGYWxsYmFjaygpIHtcbiAgICAgIHZhciBnZXRGYWxsYmFjayA9IGZ1bmN0aW9uIGdldEZhbGxiYWNrKGVsZW1lbnRzKSB7XG4gICAgICAgIHZhciBfaXRlcmF0b3I0ID0gZHJvcHpvbmVfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihlbGVtZW50cywgdHJ1ZSksXG4gICAgICAgICAgICBfc3RlcDQ7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmb3IgKF9pdGVyYXRvcjQucygpOyAhKF9zdGVwNCA9IF9pdGVyYXRvcjQubigpKS5kb25lOykge1xuICAgICAgICAgICAgdmFyIGVsID0gX3N0ZXA0LnZhbHVlO1xuXG4gICAgICAgICAgICBpZiAoLyhefCApZmFsbGJhY2soJHwgKS8udGVzdChlbC5jbGFzc05hbWUpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBlbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIF9pdGVyYXRvcjQuZShlcnIpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIF9pdGVyYXRvcjQuZigpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBmb3IgKHZhciBfaSA9IDAsIF9hcnIgPSBbXCJkaXZcIiwgXCJmb3JtXCJdOyBfaSA8IF9hcnIubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHZhciB0YWdOYW1lID0gX2FycltfaV07XG4gICAgICAgIHZhciBmYWxsYmFjaztcblxuICAgICAgICBpZiAoZmFsbGJhY2sgPSBnZXRGYWxsYmFjayh0aGlzLmVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnTmFtZSkpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbGxiYWNrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSAvLyBBY3RpdmF0ZXMgYWxsIGxpc3RlbmVycyBzdG9yZWQgaW4gQGxpc3RlbmVyc1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0dXBFdmVudExpc3RlbmVyc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXR1cEV2ZW50TGlzdGVuZXJzKCkge1xuICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXJzLm1hcChmdW5jdGlvbiAoZWxlbWVudExpc3RlbmVycykge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciByZXN1bHQgPSBbXTtcblxuICAgICAgICAgIGZvciAodmFyIGV2ZW50IGluIGVsZW1lbnRMaXN0ZW5lcnMuZXZlbnRzKSB7XG4gICAgICAgICAgICB2YXIgbGlzdGVuZXIgPSBlbGVtZW50TGlzdGVuZXJzLmV2ZW50c1tldmVudF07XG4gICAgICAgICAgICByZXN1bHQucHVzaChlbGVtZW50TGlzdGVuZXJzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIsIGZhbHNlKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSgpO1xuICAgICAgfSk7XG4gICAgfSAvLyBEZWFjdGl2YXRlcyBhbGwgbGlzdGVuZXJzIHN0b3JlZCBpbiBAbGlzdGVuZXJzXG5cbiAgfSwge1xuICAgIGtleTogXCJyZW1vdmVFdmVudExpc3RlbmVyc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVycygpIHtcbiAgICAgIHJldHVybiB0aGlzLmxpc3RlbmVycy5tYXAoZnVuY3Rpb24gKGVsZW1lbnRMaXN0ZW5lcnMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gW107XG5cbiAgICAgICAgICBmb3IgKHZhciBldmVudCBpbiBlbGVtZW50TGlzdGVuZXJzLmV2ZW50cykge1xuICAgICAgICAgICAgdmFyIGxpc3RlbmVyID0gZWxlbWVudExpc3RlbmVycy5ldmVudHNbZXZlbnRdO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goZWxlbWVudExpc3RlbmVycy5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyLCBmYWxzZSkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0oKTtcbiAgICAgIH0pO1xuICAgIH0gLy8gUmVtb3ZlcyBhbGwgZXZlbnQgbGlzdGVuZXJzIGFuZCBjYW5jZWxzIGFsbCBmaWxlcyBpbiB0aGUgcXVldWUgb3IgYmVpbmcgcHJvY2Vzc2VkLlxuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGlzYWJsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkaXNhYmxlKCkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIHRoaXMuY2xpY2thYmxlRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKFwiZHotY2xpY2thYmxlXCIpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXJzKCk7XG4gICAgICB0aGlzLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0aGlzLmZpbGVzLm1hcChmdW5jdGlvbiAoZmlsZSkge1xuICAgICAgICByZXR1cm4gX3RoaXMzLmNhbmNlbFVwbG9hZChmaWxlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJlbmFibGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZW5hYmxlKCkge1xuICAgICAgZGVsZXRlIHRoaXMuZGlzYWJsZWQ7XG4gICAgICB0aGlzLmNsaWNrYWJsZUVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChcImR6LWNsaWNrYWJsZVwiKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRoaXMuc2V0dXBFdmVudExpc3RlbmVycygpO1xuICAgIH0gLy8gUmV0dXJucyBhIG5pY2VseSBmb3JtYXR0ZWQgZmlsZXNpemVcblxuICB9LCB7XG4gICAga2V5OiBcImZpbGVzaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZpbGVzaXplKHNpemUpIHtcbiAgICAgIHZhciBzZWxlY3RlZFNpemUgPSAwO1xuICAgICAgdmFyIHNlbGVjdGVkVW5pdCA9IFwiYlwiO1xuXG4gICAgICBpZiAoc2l6ZSA+IDApIHtcbiAgICAgICAgdmFyIHVuaXRzID0gW1widGJcIiwgXCJnYlwiLCBcIm1iXCIsIFwia2JcIiwgXCJiXCJdO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdW5pdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgdW5pdCA9IHVuaXRzW2ldO1xuICAgICAgICAgIHZhciBjdXRvZmYgPSBNYXRoLnBvdyh0aGlzLm9wdGlvbnMuZmlsZXNpemVCYXNlLCA0IC0gaSkgLyAxMDtcblxuICAgICAgICAgIGlmIChzaXplID49IGN1dG9mZikge1xuICAgICAgICAgICAgc2VsZWN0ZWRTaXplID0gc2l6ZSAvIE1hdGgucG93KHRoaXMub3B0aW9ucy5maWxlc2l6ZUJhc2UsIDQgLSBpKTtcbiAgICAgICAgICAgIHNlbGVjdGVkVW5pdCA9IHVuaXQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzZWxlY3RlZFNpemUgPSBNYXRoLnJvdW5kKDEwICogc2VsZWN0ZWRTaXplKSAvIDEwOyAvLyBDdXR0aW5nIG9mIGRpZ2l0c1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gXCI8c3Ryb25nPlwiLmNvbmNhdChzZWxlY3RlZFNpemUsIFwiPC9zdHJvbmc+IFwiKS5jb25jYXQodGhpcy5vcHRpb25zLmRpY3RGaWxlU2l6ZVVuaXRzW3NlbGVjdGVkVW5pdF0pO1xuICAgIH0gLy8gQWRkcyBvciByZW1vdmVzIHRoZSBgZHotbWF4LWZpbGVzLXJlYWNoZWRgIGNsYXNzIGZyb20gdGhlIGZvcm0uXG5cbiAgfSwge1xuICAgIGtleTogXCJfdXBkYXRlTWF4RmlsZXNSZWFjaGVkQ2xhc3NcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3VwZGF0ZU1heEZpbGVzUmVhY2hlZENsYXNzKCkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5tYXhGaWxlcyAhPSBudWxsICYmIHRoaXMuZ2V0QWNjZXB0ZWRGaWxlcygpLmxlbmd0aCA+PSB0aGlzLm9wdGlvbnMubWF4RmlsZXMpIHtcbiAgICAgICAgaWYgKHRoaXMuZ2V0QWNjZXB0ZWRGaWxlcygpLmxlbmd0aCA9PT0gdGhpcy5vcHRpb25zLm1heEZpbGVzKSB7XG4gICAgICAgICAgdGhpcy5lbWl0KFwibWF4ZmlsZXNyZWFjaGVkXCIsIHRoaXMuZmlsZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiZHotbWF4LWZpbGVzLXJlYWNoZWRcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoXCJkei1tYXgtZmlsZXMtcmVhY2hlZFwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZHJvcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkcm9wKGUpIHtcbiAgICAgIGlmICghZS5kYXRhVHJhbnNmZXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmVtaXQoXCJkcm9wXCIsIGUpOyAvLyBDb252ZXJ0IHRoZSBGaWxlTGlzdCB0byBhbiBBcnJheVxuICAgICAgLy8gVGhpcyBpcyBuZWNlc3NhcnkgZm9yIElFMTFcblxuICAgICAgdmFyIGZpbGVzID0gW107XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZS5kYXRhVHJhbnNmZXIuZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZmlsZXNbaV0gPSBlLmRhdGFUcmFuc2Zlci5maWxlc1tpXTtcbiAgICAgIH0gLy8gRXZlbiBpZiBpdCdzIGEgZm9sZGVyLCBmaWxlcy5sZW5ndGggd2lsbCBjb250YWluIHRoZSBmb2xkZXJzLlxuXG5cbiAgICAgIGlmIChmaWxlcy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGl0ZW1zID0gZS5kYXRhVHJhbnNmZXIuaXRlbXM7XG5cbiAgICAgICAgaWYgKGl0ZW1zICYmIGl0ZW1zLmxlbmd0aCAmJiBpdGVtc1swXS53ZWJraXRHZXRBc0VudHJ5ICE9IG51bGwpIHtcbiAgICAgICAgICAvLyBUaGUgYnJvd3NlciBzdXBwb3J0cyBkcm9wcGluZyBvZiBmb2xkZXJzLCBzbyBoYW5kbGUgaXRlbXMgaW5zdGVhZCBvZiBmaWxlc1xuICAgICAgICAgIHRoaXMuX2FkZEZpbGVzRnJvbUl0ZW1zKGl0ZW1zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmhhbmRsZUZpbGVzKGZpbGVzKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLmVtaXQoXCJhZGRlZGZpbGVzXCIsIGZpbGVzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicGFzdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGFzdGUoZSkge1xuICAgICAgaWYgKF9fZ3VhcmRfXyhlICE9IG51bGwgPyBlLmNsaXBib2FyZERhdGEgOiB1bmRlZmluZWQsIGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHJldHVybiB4Lml0ZW1zO1xuICAgICAgfSkgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZW1pdChcInBhc3RlXCIsIGUpO1xuICAgICAgdmFyIGl0ZW1zID0gZS5jbGlwYm9hcmREYXRhLml0ZW1zO1xuXG4gICAgICBpZiAoaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRGaWxlc0Zyb21JdGVtcyhpdGVtcyk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImhhbmRsZUZpbGVzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZUZpbGVzKGZpbGVzKSB7XG4gICAgICB2YXIgX2l0ZXJhdG9yNSA9IGRyb3B6b25lX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoZmlsZXMsIHRydWUpLFxuICAgICAgICAgIF9zdGVwNTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChfaXRlcmF0b3I1LnMoKTsgIShfc3RlcDUgPSBfaXRlcmF0b3I1Lm4oKSkuZG9uZTspIHtcbiAgICAgICAgICB2YXIgZmlsZSA9IF9zdGVwNS52YWx1ZTtcbiAgICAgICAgICB0aGlzLmFkZEZpbGUoZmlsZSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfaXRlcmF0b3I1LmUoZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIF9pdGVyYXRvcjUuZigpO1xuICAgICAgfVxuICAgIH0gLy8gV2hlbiBhIGZvbGRlciBpcyBkcm9wcGVkIChvciBmaWxlcyBhcmUgcGFzdGVkKSwgaXRlbXMgbXVzdCBiZSBoYW5kbGVkXG4gICAgLy8gaW5zdGVhZCBvZiBmaWxlcy5cblxuICB9LCB7XG4gICAga2V5OiBcIl9hZGRGaWxlc0Zyb21JdGVtc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfYWRkRmlsZXNGcm9tSXRlbXMoaXRlbXMpIHtcbiAgICAgIHZhciBfdGhpczQgPSB0aGlzO1xuXG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gW107XG5cbiAgICAgICAgdmFyIF9pdGVyYXRvcjYgPSBkcm9wem9uZV9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGl0ZW1zLCB0cnVlKSxcbiAgICAgICAgICAgIF9zdGVwNjtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAoX2l0ZXJhdG9yNi5zKCk7ICEoX3N0ZXA2ID0gX2l0ZXJhdG9yNi5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgICB2YXIgaXRlbSA9IF9zdGVwNi52YWx1ZTtcbiAgICAgICAgICAgIHZhciBlbnRyeTtcblxuICAgICAgICAgICAgaWYgKGl0ZW0ud2Via2l0R2V0QXNFbnRyeSAhPSBudWxsICYmIChlbnRyeSA9IGl0ZW0ud2Via2l0R2V0QXNFbnRyeSgpKSkge1xuICAgICAgICAgICAgICBpZiAoZW50cnkuaXNGaWxlKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goX3RoaXM0LmFkZEZpbGUoaXRlbS5nZXRBc0ZpbGUoKSkpO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KSB7XG4gICAgICAgICAgICAgICAgLy8gQXBwZW5kIGFsbCBmaWxlcyBmcm9tIHRoYXQgZGlyZWN0b3J5IHRvIGZpbGVzXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goX3RoaXM0Ll9hZGRGaWxlc0Zyb21EaXJlY3RvcnkoZW50cnksIGVudHJ5Lm5hbWUpKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uZ2V0QXNGaWxlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgaWYgKGl0ZW0ua2luZCA9PSBudWxsIHx8IGl0ZW0ua2luZCA9PT0gXCJmaWxlXCIpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChfdGhpczQuYWRkRmlsZShpdGVtLmdldEFzRmlsZSgpKSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzdWx0LnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIF9pdGVyYXRvcjYuZShlcnIpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIF9pdGVyYXRvcjYuZigpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0oKTtcbiAgICB9IC8vIEdvZXMgdGhyb3VnaCB0aGUgZGlyZWN0b3J5LCBhbmQgYWRkcyBlYWNoIGZpbGUgaXQgZmluZHMgcmVjdXJzaXZlbHlcblxuICB9LCB7XG4gICAga2V5OiBcIl9hZGRGaWxlc0Zyb21EaXJlY3RvcnlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2FkZEZpbGVzRnJvbURpcmVjdG9yeShkaXJlY3RvcnksIHBhdGgpIHtcbiAgICAgIHZhciBfdGhpczUgPSB0aGlzO1xuXG4gICAgICB2YXIgZGlyUmVhZGVyID0gZGlyZWN0b3J5LmNyZWF0ZVJlYWRlcigpO1xuXG4gICAgICB2YXIgZXJyb3JIYW5kbGVyID0gZnVuY3Rpb24gZXJyb3JIYW5kbGVyKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBfX2d1YXJkTWV0aG9kX18oY29uc29sZSwgXCJsb2dcIiwgZnVuY3Rpb24gKG8pIHtcbiAgICAgICAgICByZXR1cm4gby5sb2coZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIHZhciByZWFkRW50cmllcyA9IGZ1bmN0aW9uIHJlYWRFbnRyaWVzKCkge1xuICAgICAgICByZXR1cm4gZGlyUmVhZGVyLnJlYWRFbnRyaWVzKGZ1bmN0aW9uIChlbnRyaWVzKSB7XG4gICAgICAgICAgaWYgKGVudHJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdmFyIF9pdGVyYXRvcjcgPSBkcm9wem9uZV9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGVudHJpZXMsIHRydWUpLFxuICAgICAgICAgICAgICAgIF9zdGVwNztcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgZm9yIChfaXRlcmF0b3I3LnMoKTsgIShfc3RlcDcgPSBfaXRlcmF0b3I3Lm4oKSkuZG9uZTspIHtcbiAgICAgICAgICAgICAgICB2YXIgZW50cnkgPSBfc3RlcDcudmFsdWU7XG5cbiAgICAgICAgICAgICAgICBpZiAoZW50cnkuaXNGaWxlKSB7XG4gICAgICAgICAgICAgICAgICBlbnRyeS5maWxlKGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfdGhpczUub3B0aW9ucy5pZ25vcmVIaWRkZW5GaWxlcyAmJiBmaWxlLm5hbWUuc3Vic3RyaW5nKDAsIDEpID09PSBcIi5cIikge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGZpbGUuZnVsbFBhdGggPSBcIlwiLmNvbmNhdChwYXRoLCBcIi9cIikuY29uY2F0KGZpbGUubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczUuYWRkRmlsZShmaWxlKTtcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZW50cnkuaXNEaXJlY3RvcnkpIHtcbiAgICAgICAgICAgICAgICAgIF90aGlzNS5fYWRkRmlsZXNGcm9tRGlyZWN0b3J5KGVudHJ5LCBcIlwiLmNvbmNhdChwYXRoLCBcIi9cIikuY29uY2F0KGVudHJ5Lm5hbWUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gLy8gUmVjdXJzaXZlbHkgY2FsbCByZWFkRW50cmllcygpIGFnYWluLCBzaW5jZSBicm93c2VyIG9ubHkgaGFuZGxlXG4gICAgICAgICAgICAgIC8vIHRoZSBmaXJzdCAxMDAgZW50cmllcy5cbiAgICAgICAgICAgICAgLy8gU2VlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRGlyZWN0b3J5UmVhZGVyI3JlYWRFbnRyaWVzXG5cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICBfaXRlcmF0b3I3LmUoZXJyKTtcbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgIF9pdGVyYXRvcjcuZigpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZWFkRW50cmllcygpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9LCBlcnJvckhhbmRsZXIpO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHJlYWRFbnRyaWVzKCk7XG4gICAgfSAvLyBJZiBgZG9uZSgpYCBpcyBjYWxsZWQgd2l0aG91dCBhcmd1bWVudCB0aGUgZmlsZSBpcyBhY2NlcHRlZFxuICAgIC8vIElmIHlvdSBjYWxsIGl0IHdpdGggYW4gZXJyb3IgbWVzc2FnZSwgdGhlIGZpbGUgaXMgcmVqZWN0ZWRcbiAgICAvLyAoVGhpcyBhbGxvd3MgZm9yIGFzeW5jaHJvbm91cyB2YWxpZGF0aW9uKVxuICAgIC8vXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBjaGVja3MgdGhlIGZpbGVzaXplLCBhbmQgaWYgdGhlIGZpbGUudHlwZSBwYXNzZXMgdGhlXG4gICAgLy8gYGFjY2VwdGVkRmlsZXNgIGNoZWNrLlxuXG4gIH0sIHtcbiAgICBrZXk6IFwiYWNjZXB0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFjY2VwdChmaWxlLCBkb25lKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm1heEZpbGVzaXplICYmIGZpbGUuc2l6ZSA+IHRoaXMub3B0aW9ucy5tYXhGaWxlc2l6ZSAqIDEwMjQgKiAxMDI0KSB7XG4gICAgICAgIGRvbmUodGhpcy5vcHRpb25zLmRpY3RGaWxlVG9vQmlnLnJlcGxhY2UoXCJ7e2ZpbGVzaXplfX1cIiwgTWF0aC5yb3VuZChmaWxlLnNpemUgLyAxMDI0IC8gMTAuMjQpIC8gMTAwKS5yZXBsYWNlKFwie3ttYXhGaWxlc2l6ZX19XCIsIHRoaXMub3B0aW9ucy5tYXhGaWxlc2l6ZSkpO1xuICAgICAgfSBlbHNlIGlmICghRHJvcHpvbmUuaXNWYWxpZEZpbGUoZmlsZSwgdGhpcy5vcHRpb25zLmFjY2VwdGVkRmlsZXMpKSB7XG4gICAgICAgIGRvbmUodGhpcy5vcHRpb25zLmRpY3RJbnZhbGlkRmlsZVR5cGUpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbnMubWF4RmlsZXMgIT0gbnVsbCAmJiB0aGlzLmdldEFjY2VwdGVkRmlsZXMoKS5sZW5ndGggPj0gdGhpcy5vcHRpb25zLm1heEZpbGVzKSB7XG4gICAgICAgIGRvbmUodGhpcy5vcHRpb25zLmRpY3RNYXhGaWxlc0V4Y2VlZGVkLnJlcGxhY2UoXCJ7e21heEZpbGVzfX1cIiwgdGhpcy5vcHRpb25zLm1heEZpbGVzKSk7XG4gICAgICAgIHRoaXMuZW1pdChcIm1heGZpbGVzZXhjZWVkZWRcIiwgZmlsZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9wdGlvbnMuYWNjZXB0LmNhbGwodGhpcywgZmlsZSwgZG9uZSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImFkZEZpbGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkRmlsZShmaWxlKSB7XG4gICAgICB2YXIgX3RoaXM2ID0gdGhpcztcblxuICAgICAgZmlsZS51cGxvYWQgPSB7XG4gICAgICAgIHV1aWQ6IERyb3B6b25lLnV1aWR2NCgpLFxuICAgICAgICBwcm9ncmVzczogMCxcbiAgICAgICAgLy8gU2V0dGluZyB0aGUgdG90YWwgdXBsb2FkIHNpemUgdG8gZmlsZS5zaXplIGZvciB0aGUgYmVnaW5uaW5nXG4gICAgICAgIC8vIEl0J3MgYWN0dWFsIGRpZmZlcmVudCB0aGFuIHRoZSBzaXplIHRvIGJlIHRyYW5zbWl0dGVkLlxuICAgICAgICB0b3RhbDogZmlsZS5zaXplLFxuICAgICAgICBieXRlc1NlbnQ6IDAsXG4gICAgICAgIGZpbGVuYW1lOiB0aGlzLl9yZW5hbWVGaWxlKGZpbGUpIC8vIE5vdCBzZXR0aW5nIGNodW5raW5nIGluZm9ybWF0aW9uIGhlcmUsIGJlY2F1c2UgdGhlIGFjdXRhbCBkYXRhIOKAlCBhbmRcbiAgICAgICAgLy8gdGh1cyB0aGUgY2h1bmtzIOKAlCBtaWdodCBjaGFuZ2UgaWYgYG9wdGlvbnMudHJhbnNmb3JtRmlsZWAgaXMgc2V0XG4gICAgICAgIC8vIGFuZCBkb2VzIHNvbWV0aGluZyB0byB0aGUgZGF0YS5cblxuICAgICAgfTtcbiAgICAgIHRoaXMuZmlsZXMucHVzaChmaWxlKTtcbiAgICAgIGZpbGUuc3RhdHVzID0gRHJvcHpvbmUuQURERUQ7XG4gICAgICB0aGlzLmVtaXQoXCJhZGRlZGZpbGVcIiwgZmlsZSk7XG5cbiAgICAgIHRoaXMuX2VucXVldWVUaHVtYm5haWwoZmlsZSk7XG5cbiAgICAgIHRoaXMuYWNjZXB0KGZpbGUsIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICBmaWxlLmFjY2VwdGVkID0gZmFsc2U7XG5cbiAgICAgICAgICBfdGhpczYuX2Vycm9yUHJvY2Vzc2luZyhbZmlsZV0sIGVycm9yKTsgLy8gV2lsbCBzZXQgdGhlIGZpbGUuc3RhdHVzXG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaWxlLmFjY2VwdGVkID0gdHJ1ZTtcblxuICAgICAgICAgIGlmIChfdGhpczYub3B0aW9ucy5hdXRvUXVldWUpIHtcbiAgICAgICAgICAgIF90aGlzNi5lbnF1ZXVlRmlsZShmaWxlKTtcbiAgICAgICAgICB9IC8vIFdpbGwgc2V0IC5hY2NlcHRlZCA9IHRydWVcblxuICAgICAgICB9XG5cbiAgICAgICAgX3RoaXM2Ll91cGRhdGVNYXhGaWxlc1JlYWNoZWRDbGFzcygpO1xuICAgICAgfSk7XG4gICAgfSAvLyBXcmFwcGVyIGZvciBlbnF1ZXVlRmlsZVxuXG4gIH0sIHtcbiAgICBrZXk6IFwiZW5xdWV1ZUZpbGVzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVucXVldWVGaWxlcyhmaWxlcykge1xuICAgICAgdmFyIF9pdGVyYXRvcjggPSBkcm9wem9uZV9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGZpbGVzLCB0cnVlKSxcbiAgICAgICAgICBfc3RlcDg7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoX2l0ZXJhdG9yOC5zKCk7ICEoX3N0ZXA4ID0gX2l0ZXJhdG9yOC5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgdmFyIGZpbGUgPSBfc3RlcDgudmFsdWU7XG4gICAgICAgICAgdGhpcy5lbnF1ZXVlRmlsZShmaWxlKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9pdGVyYXRvcjguZShlcnIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgX2l0ZXJhdG9yOC5mKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJlbnF1ZXVlRmlsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlbnF1ZXVlRmlsZShmaWxlKSB7XG4gICAgICB2YXIgX3RoaXM3ID0gdGhpcztcblxuICAgICAgaWYgKGZpbGUuc3RhdHVzID09PSBEcm9wem9uZS5BRERFRCAmJiBmaWxlLmFjY2VwdGVkID09PSB0cnVlKSB7XG4gICAgICAgIGZpbGUuc3RhdHVzID0gRHJvcHpvbmUuUVVFVUVEO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXV0b1Byb2Nlc3NRdWV1ZSkge1xuICAgICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfdGhpczcucHJvY2Vzc1F1ZXVlKCk7XG4gICAgICAgICAgfSwgMCk7IC8vIERlZmVycmluZyB0aGUgY2FsbFxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIGZpbGUgY2FuJ3QgYmUgcXVldWVkIGJlY2F1c2UgaXQgaGFzIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQgb3Igd2FzIHJlamVjdGVkLlwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX2VucXVldWVUaHVtYm5haWxcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2VucXVldWVUaHVtYm5haWwoZmlsZSkge1xuICAgICAgdmFyIF90aGlzOCA9IHRoaXM7XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuY3JlYXRlSW1hZ2VUaHVtYm5haWxzICYmIGZpbGUudHlwZS5tYXRjaCgvaW1hZ2UuKi8pICYmIGZpbGUuc2l6ZSA8PSB0aGlzLm9wdGlvbnMubWF4VGh1bWJuYWlsRmlsZXNpemUgKiAxMDI0ICogMTAyNCkge1xuICAgICAgICB0aGlzLl90aHVtYm5haWxRdWV1ZS5wdXNoKGZpbGUpO1xuXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXM4Ll9wcm9jZXNzVGh1bWJuYWlsUXVldWUoKTtcbiAgICAgICAgfSwgMCk7IC8vIERlZmVycmluZyB0aGUgY2FsbFxuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfcHJvY2Vzc1RodW1ibmFpbFF1ZXVlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9wcm9jZXNzVGh1bWJuYWlsUXVldWUoKSB7XG4gICAgICB2YXIgX3RoaXM5ID0gdGhpcztcblxuICAgICAgaWYgKHRoaXMuX3Byb2Nlc3NpbmdUaHVtYm5haWwgfHwgdGhpcy5fdGh1bWJuYWlsUXVldWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fcHJvY2Vzc2luZ1RodW1ibmFpbCA9IHRydWU7XG5cbiAgICAgIHZhciBmaWxlID0gdGhpcy5fdGh1bWJuYWlsUXVldWUuc2hpZnQoKTtcblxuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVGh1bWJuYWlsKGZpbGUsIHRoaXMub3B0aW9ucy50aHVtYm5haWxXaWR0aCwgdGhpcy5vcHRpb25zLnRodW1ibmFpbEhlaWdodCwgdGhpcy5vcHRpb25zLnRodW1ibmFpbE1ldGhvZCwgdHJ1ZSwgZnVuY3Rpb24gKGRhdGFVcmwpIHtcbiAgICAgICAgX3RoaXM5LmVtaXQoXCJ0aHVtYm5haWxcIiwgZmlsZSwgZGF0YVVybCk7XG5cbiAgICAgICAgX3RoaXM5Ll9wcm9jZXNzaW5nVGh1bWJuYWlsID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBfdGhpczkuX3Byb2Nlc3NUaHVtYm5haWxRdWV1ZSgpO1xuICAgICAgfSk7XG4gICAgfSAvLyBDYW4gYmUgY2FsbGVkIGJ5IHRoZSB1c2VyIHRvIHJlbW92ZSBhIGZpbGVcblxuICB9LCB7XG4gICAga2V5OiBcInJlbW92ZUZpbGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlRmlsZShmaWxlKSB7XG4gICAgICBpZiAoZmlsZS5zdGF0dXMgPT09IERyb3B6b25lLlVQTE9BRElORykge1xuICAgICAgICB0aGlzLmNhbmNlbFVwbG9hZChmaWxlKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5maWxlcyA9IHdpdGhvdXQodGhpcy5maWxlcywgZmlsZSk7XG4gICAgICB0aGlzLmVtaXQoXCJyZW1vdmVkZmlsZVwiLCBmaWxlKTtcblxuICAgICAgaWYgKHRoaXMuZmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVtaXQoXCJyZXNldFwiKTtcbiAgICAgIH1cbiAgICB9IC8vIFJlbW92ZXMgYWxsIGZpbGVzIHRoYXQgYXJlbid0IGN1cnJlbnRseSBwcm9jZXNzZWQgZnJvbSB0aGUgbGlzdFxuXG4gIH0sIHtcbiAgICBrZXk6IFwicmVtb3ZlQWxsRmlsZXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlQWxsRmlsZXMoY2FuY2VsSWZOZWNlc3NhcnkpIHtcbiAgICAgIC8vIENyZWF0ZSBhIGNvcHkgb2YgZmlsZXMgc2luY2UgcmVtb3ZlRmlsZSgpIGNoYW5nZXMgdGhlIEBmaWxlcyBhcnJheS5cbiAgICAgIGlmIChjYW5jZWxJZk5lY2Vzc2FyeSA9PSBudWxsKSB7XG4gICAgICAgIGNhbmNlbElmTmVjZXNzYXJ5ID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHZhciBfaXRlcmF0b3I5ID0gZHJvcHpvbmVfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcih0aGlzLmZpbGVzLnNsaWNlKCksIHRydWUpLFxuICAgICAgICAgIF9zdGVwOTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChfaXRlcmF0b3I5LnMoKTsgIShfc3RlcDkgPSBfaXRlcmF0b3I5Lm4oKSkuZG9uZTspIHtcbiAgICAgICAgICB2YXIgZmlsZSA9IF9zdGVwOS52YWx1ZTtcblxuICAgICAgICAgIGlmIChmaWxlLnN0YXR1cyAhPT0gRHJvcHpvbmUuVVBMT0FESU5HIHx8IGNhbmNlbElmTmVjZXNzYXJ5KSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUZpbGUoZmlsZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgX2l0ZXJhdG9yOS5lKGVycik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBfaXRlcmF0b3I5LmYoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSAvLyBSZXNpemVzIGFuIGltYWdlIGJlZm9yZSBpdCBnZXRzIHNlbnQgdG8gdGhlIHNlcnZlci4gVGhpcyBmdW5jdGlvbiBpcyB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZlxuICAgIC8vIGBvcHRpb25zLnRyYW5zZm9ybUZpbGVgIGlmIGByZXNpemVXaWR0aGAgb3IgYHJlc2l6ZUhlaWdodGAgYXJlIHNldC4gVGhlIGNhbGxiYWNrIGlzIGludm9rZWQgd2l0aFxuICAgIC8vIHRoZSByZXNpemVkIGJsb2IuXG5cbiAgfSwge1xuICAgIGtleTogXCJyZXNpemVJbWFnZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXNpemVJbWFnZShmaWxlLCB3aWR0aCwgaGVpZ2h0LCByZXNpemVNZXRob2QsIGNhbGxiYWNrKSB7XG4gICAgICB2YXIgX3RoaXMxMCA9IHRoaXM7XG5cbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVRodW1ibmFpbChmaWxlLCB3aWR0aCwgaGVpZ2h0LCByZXNpemVNZXRob2QsIHRydWUsIGZ1bmN0aW9uIChkYXRhVXJsLCBjYW52YXMpIHtcbiAgICAgICAgaWYgKGNhbnZhcyA9PSBudWxsKSB7XG4gICAgICAgICAgLy8gVGhlIGltYWdlIGhhcyBub3QgYmVlbiByZXNpemVkXG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGZpbGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciByZXNpemVNaW1lVHlwZSA9IF90aGlzMTAub3B0aW9ucy5yZXNpemVNaW1lVHlwZTtcblxuICAgICAgICAgIGlmIChyZXNpemVNaW1lVHlwZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXNpemVNaW1lVHlwZSA9IGZpbGUudHlwZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgcmVzaXplZERhdGFVUkwgPSBjYW52YXMudG9EYXRhVVJMKHJlc2l6ZU1pbWVUeXBlLCBfdGhpczEwLm9wdGlvbnMucmVzaXplUXVhbGl0eSk7XG5cbiAgICAgICAgICBpZiAocmVzaXplTWltZVR5cGUgPT09IFwiaW1hZ2UvanBlZ1wiIHx8IHJlc2l6ZU1pbWVUeXBlID09PSBcImltYWdlL2pwZ1wiKSB7XG4gICAgICAgICAgICAvLyBOb3cgYWRkIHRoZSBvcmlnaW5hbCBFWElGIGluZm9ybWF0aW9uXG4gICAgICAgICAgICByZXNpemVkRGF0YVVSTCA9IEV4aWZSZXN0b3JlLnJlc3RvcmUoZmlsZS5kYXRhVVJMLCByZXNpemVkRGF0YVVSTCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKERyb3B6b25lLmRhdGFVUkl0b0Jsb2IocmVzaXplZERhdGFVUkwpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNyZWF0ZVRodW1ibmFpbFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVUaHVtYm5haWwoZmlsZSwgd2lkdGgsIGhlaWdodCwgcmVzaXplTWV0aG9kLCBmaXhPcmllbnRhdGlvbiwgY2FsbGJhY2spIHtcbiAgICAgIHZhciBfdGhpczExID0gdGhpcztcblxuICAgICAgdmFyIGZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuXG4gICAgICBmaWxlUmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZmlsZS5kYXRhVVJMID0gZmlsZVJlYWRlci5yZXN1bHQ7IC8vIERvbid0IGJvdGhlciBjcmVhdGluZyBhIHRodW1ibmFpbCBmb3IgU1ZHIGltYWdlcyBzaW5jZSB0aGV5J3JlIHZlY3RvclxuXG4gICAgICAgIGlmIChmaWxlLnR5cGUgPT09IFwiaW1hZ2Uvc3ZnK3htbFwiKSB7XG4gICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKGZpbGVSZWFkZXIucmVzdWx0KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpczExLmNyZWF0ZVRodW1ibmFpbEZyb21VcmwoZmlsZSwgd2lkdGgsIGhlaWdodCwgcmVzaXplTWV0aG9kLCBmaXhPcmllbnRhdGlvbiwgY2FsbGJhY2spO1xuICAgICAgfTtcblxuICAgICAgZmlsZVJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuICAgIH0gLy8gYG1vY2tGaWxlYCBuZWVkcyB0byBoYXZlIHRoZXNlIGF0dHJpYnV0ZXM6XG4gICAgLy9cbiAgICAvLyAgICAgeyBuYW1lOiAnbmFtZScsIHNpemU6IDEyMzQ1LCBpbWFnZVVybDogJycgfVxuICAgIC8vXG4gICAgLy8gYGNhbGxiYWNrYCB3aWxsIGJlIGludm9rZWQgd2hlbiB0aGUgaW1hZ2UgaGFzIGJlZW4gZG93bmxvYWRlZCBhbmQgZGlzcGxheWVkLlxuICAgIC8vIGBjcm9zc09yaWdpbmAgd2lsbCBiZSBhZGRlZCB0byB0aGUgYGltZ2AgdGFnIHdoZW4gYWNjZXNzaW5nIHRoZSBmaWxlLlxuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGlzcGxheUV4aXN0aW5nRmlsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkaXNwbGF5RXhpc3RpbmdGaWxlKG1vY2tGaWxlLCBpbWFnZVVybCwgY2FsbGJhY2ssIGNyb3NzT3JpZ2luKSB7XG4gICAgICB2YXIgX3RoaXMxMiA9IHRoaXM7XG5cbiAgICAgIHZhciByZXNpemVUaHVtYm5haWwgPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiBhcmd1bWVudHNbNF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s0XSA6IHRydWU7XG4gICAgICB0aGlzLmVtaXQoXCJhZGRlZGZpbGVcIiwgbW9ja0ZpbGUpO1xuICAgICAgdGhpcy5lbWl0KFwiY29tcGxldGVcIiwgbW9ja0ZpbGUpO1xuXG4gICAgICBpZiAoIXJlc2l6ZVRodW1ibmFpbCkge1xuICAgICAgICB0aGlzLmVtaXQoXCJ0aHVtYm5haWxcIiwgbW9ja0ZpbGUsIGltYWdlVXJsKTtcbiAgICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjaygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG9uRG9uZSA9IGZ1bmN0aW9uIG9uRG9uZSh0aHVtYm5haWwpIHtcbiAgICAgICAgICBfdGhpczEyLmVtaXQoXCJ0aHVtYm5haWxcIiwgbW9ja0ZpbGUsIHRodW1ibmFpbCk7XG5cbiAgICAgICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgbW9ja0ZpbGUuZGF0YVVSTCA9IGltYWdlVXJsO1xuICAgICAgICB0aGlzLmNyZWF0ZVRodW1ibmFpbEZyb21VcmwobW9ja0ZpbGUsIHRoaXMub3B0aW9ucy50aHVtYm5haWxXaWR0aCwgdGhpcy5vcHRpb25zLnRodW1ibmFpbEhlaWdodCwgdGhpcy5vcHRpb25zLnJlc2l6ZU1ldGhvZCwgdGhpcy5vcHRpb25zLmZpeE9yaWVudGF0aW9uLCBvbkRvbmUsIGNyb3NzT3JpZ2luKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY3JlYXRlVGh1bWJuYWlsRnJvbVVybFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVUaHVtYm5haWxGcm9tVXJsKGZpbGUsIHdpZHRoLCBoZWlnaHQsIHJlc2l6ZU1ldGhvZCwgZml4T3JpZW50YXRpb24sIGNhbGxiYWNrLCBjcm9zc09yaWdpbikge1xuICAgICAgdmFyIF90aGlzMTMgPSB0aGlzO1xuXG4gICAgICAvLyBOb3QgdXNpbmcgYG5ldyBJbWFnZWAgaGVyZSBiZWNhdXNlIG9mIGEgYnVnIGluIGxhdGVzdCBDaHJvbWUgdmVyc2lvbnMuXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VueW8vZHJvcHpvbmUvcHVsbC8yMjZcbiAgICAgIHZhciBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpO1xuXG4gICAgICBpZiAoY3Jvc3NPcmlnaW4pIHtcbiAgICAgICAgaW1nLmNyb3NzT3JpZ2luID0gY3Jvc3NPcmlnaW47XG4gICAgICB9IC8vIGZpeE9yaWVudGF0aW9uIGlzIG5vdCBuZWVkZWQgYW55bW9yZSB3aXRoIGJyb3dzZXJzIGhhbmRsaW5nIGltYWdlT3JpZW50YXRpb25cblxuXG4gICAgICBmaXhPcmllbnRhdGlvbiA9IGdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSlbXCJpbWFnZU9yaWVudGF0aW9uXCJdID09IFwiZnJvbS1pbWFnZVwiID8gZmFsc2UgOiBmaXhPcmllbnRhdGlvbjtcblxuICAgICAgaW1nLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGxvYWRFeGlmID0gZnVuY3Rpb24gbG9hZEV4aWYoY2FsbGJhY2spIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2soMSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHR5cGVvZiBFWElGICE9PSBcInVuZGVmaW5lZFwiICYmIEVYSUYgIT09IG51bGwgJiYgZml4T3JpZW50YXRpb24pIHtcbiAgICAgICAgICBsb2FkRXhpZiA9IGZ1bmN0aW9uIGxvYWRFeGlmKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gRVhJRi5nZXREYXRhKGltZywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soRVhJRi5nZXRUYWcodGhpcywgXCJPcmllbnRhdGlvblwiKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGxvYWRFeGlmKGZ1bmN0aW9uIChvcmllbnRhdGlvbikge1xuICAgICAgICAgIGZpbGUud2lkdGggPSBpbWcud2lkdGg7XG4gICAgICAgICAgZmlsZS5oZWlnaHQgPSBpbWcuaGVpZ2h0O1xuXG4gICAgICAgICAgdmFyIHJlc2l6ZUluZm8gPSBfdGhpczEzLm9wdGlvbnMucmVzaXplLmNhbGwoX3RoaXMxMywgZmlsZSwgd2lkdGgsIGhlaWdodCwgcmVzaXplTWV0aG9kKTtcblxuICAgICAgICAgIHZhciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgICAgICAgIHZhciBjdHggPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgICAgICAgIGNhbnZhcy53aWR0aCA9IHJlc2l6ZUluZm8udHJnV2lkdGg7XG4gICAgICAgICAgY2FudmFzLmhlaWdodCA9IHJlc2l6ZUluZm8udHJnSGVpZ2h0O1xuXG4gICAgICAgICAgaWYgKG9yaWVudGF0aW9uID4gNCkge1xuICAgICAgICAgICAgY2FudmFzLndpZHRoID0gcmVzaXplSW5mby50cmdIZWlnaHQ7XG4gICAgICAgICAgICBjYW52YXMuaGVpZ2h0ID0gcmVzaXplSW5mby50cmdXaWR0aDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzd2l0Y2ggKG9yaWVudGF0aW9uKSB7XG4gICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgIC8vIGhvcml6b250YWwgZmxpcFxuICAgICAgICAgICAgICBjdHgudHJhbnNsYXRlKGNhbnZhcy53aWR0aCwgMCk7XG4gICAgICAgICAgICAgIGN0eC5zY2FsZSgtMSwgMSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgIC8vIDE4MMKwIHJvdGF0ZSBsZWZ0XG4gICAgICAgICAgICAgIGN0eC50cmFuc2xhdGUoY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcbiAgICAgICAgICAgICAgY3R4LnJvdGF0ZShNYXRoLlBJKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgLy8gdmVydGljYWwgZmxpcFxuICAgICAgICAgICAgICBjdHgudHJhbnNsYXRlKDAsIGNhbnZhcy5oZWlnaHQpO1xuICAgICAgICAgICAgICBjdHguc2NhbGUoMSwgLTEpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAvLyB2ZXJ0aWNhbCBmbGlwICsgOTAgcm90YXRlIHJpZ2h0XG4gICAgICAgICAgICAgIGN0eC5yb3RhdGUoMC41ICogTWF0aC5QSSk7XG4gICAgICAgICAgICAgIGN0eC5zY2FsZSgxLCAtMSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgIC8vIDkwwrAgcm90YXRlIHJpZ2h0XG4gICAgICAgICAgICAgIGN0eC5yb3RhdGUoMC41ICogTWF0aC5QSSk7XG4gICAgICAgICAgICAgIGN0eC50cmFuc2xhdGUoMCwgLWNhbnZhcy53aWR0aCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgIC8vIGhvcml6b250YWwgZmxpcCArIDkwIHJvdGF0ZSByaWdodFxuICAgICAgICAgICAgICBjdHgucm90YXRlKDAuNSAqIE1hdGguUEkpO1xuICAgICAgICAgICAgICBjdHgudHJhbnNsYXRlKGNhbnZhcy5oZWlnaHQsIC1jYW52YXMud2lkdGgpO1xuICAgICAgICAgICAgICBjdHguc2NhbGUoLTEsIDEpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAvLyA5MMKwIHJvdGF0ZSBsZWZ0XG4gICAgICAgICAgICAgIGN0eC5yb3RhdGUoLTAuNSAqIE1hdGguUEkpO1xuICAgICAgICAgICAgICBjdHgudHJhbnNsYXRlKC1jYW52YXMuaGVpZ2h0LCAwKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfSAvLyBUaGlzIGlzIGEgYnVnZml4IGZvciBpT1MnIHNjYWxpbmcgYnVnLlxuXG5cbiAgICAgICAgICBkcmF3SW1hZ2VJT1NGaXgoY3R4LCBpbWcsIHJlc2l6ZUluZm8uc3JjWCAhPSBudWxsID8gcmVzaXplSW5mby5zcmNYIDogMCwgcmVzaXplSW5mby5zcmNZICE9IG51bGwgPyByZXNpemVJbmZvLnNyY1kgOiAwLCByZXNpemVJbmZvLnNyY1dpZHRoLCByZXNpemVJbmZvLnNyY0hlaWdodCwgcmVzaXplSW5mby50cmdYICE9IG51bGwgPyByZXNpemVJbmZvLnRyZ1ggOiAwLCByZXNpemVJbmZvLnRyZ1kgIT0gbnVsbCA/IHJlc2l6ZUluZm8udHJnWSA6IDAsIHJlc2l6ZUluZm8udHJnV2lkdGgsIHJlc2l6ZUluZm8udHJnSGVpZ2h0KTtcbiAgICAgICAgICB2YXIgdGh1bWJuYWlsID0gY2FudmFzLnRvRGF0YVVSTChcImltYWdlL3BuZ1wiKTtcblxuICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sodGh1bWJuYWlsLCBjYW52YXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkge1xuICAgICAgICBpbWcub25lcnJvciA9IGNhbGxiYWNrO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaW1nLnNyYyA9IGZpbGUuZGF0YVVSTDtcbiAgICB9IC8vIEdvZXMgdGhyb3VnaCB0aGUgcXVldWUgYW5kIHByb2Nlc3NlcyBmaWxlcyBpZiB0aGVyZSBhcmVuJ3QgdG9vIG1hbnkgYWxyZWFkeS5cblxuICB9LCB7XG4gICAga2V5OiBcInByb2Nlc3NRdWV1ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwcm9jZXNzUXVldWUoKSB7XG4gICAgICB2YXIgcGFyYWxsZWxVcGxvYWRzID0gdGhpcy5vcHRpb25zLnBhcmFsbGVsVXBsb2FkcztcbiAgICAgIHZhciBwcm9jZXNzaW5nTGVuZ3RoID0gdGhpcy5nZXRVcGxvYWRpbmdGaWxlcygpLmxlbmd0aDtcbiAgICAgIHZhciBpID0gcHJvY2Vzc2luZ0xlbmd0aDsgLy8gVGhlcmUgYXJlIGFscmVhZHkgYXQgbGVhc3QgYXMgbWFueSBmaWxlcyB1cGxvYWRpbmcgdGhhbiBzaG91bGQgYmVcblxuICAgICAgaWYgKHByb2Nlc3NpbmdMZW5ndGggPj0gcGFyYWxsZWxVcGxvYWRzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHF1ZXVlZEZpbGVzID0gdGhpcy5nZXRRdWV1ZWRGaWxlcygpO1xuXG4gICAgICBpZiAoIShxdWV1ZWRGaWxlcy5sZW5ndGggPiAwKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMudXBsb2FkTXVsdGlwbGUpIHtcbiAgICAgICAgLy8gVGhlIGZpbGVzIHNob3VsZCBiZSB1cGxvYWRlZCBpbiBvbmUgcmVxdWVzdFxuICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzRmlsZXMocXVldWVkRmlsZXMuc2xpY2UoMCwgcGFyYWxsZWxVcGxvYWRzIC0gcHJvY2Vzc2luZ0xlbmd0aCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2hpbGUgKGkgPCBwYXJhbGxlbFVwbG9hZHMpIHtcbiAgICAgICAgICBpZiAoIXF1ZXVlZEZpbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH0gLy8gTm90aGluZyBsZWZ0IHRvIHByb2Nlc3NcblxuXG4gICAgICAgICAgdGhpcy5wcm9jZXNzRmlsZShxdWV1ZWRGaWxlcy5zaGlmdCgpKTtcbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIFdyYXBwZXIgZm9yIGBwcm9jZXNzRmlsZXNgXG5cbiAgfSwge1xuICAgIGtleTogXCJwcm9jZXNzRmlsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwcm9jZXNzRmlsZShmaWxlKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9jZXNzRmlsZXMoW2ZpbGVdKTtcbiAgICB9IC8vIExvYWRzIHRoZSBmaWxlLCB0aGVuIGNhbGxzIGZpbmlzaGVkTG9hZGluZygpXG5cbiAgfSwge1xuICAgIGtleTogXCJwcm9jZXNzRmlsZXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcHJvY2Vzc0ZpbGVzKGZpbGVzKSB7XG4gICAgICB2YXIgX2l0ZXJhdG9yMTAgPSBkcm9wem9uZV9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGZpbGVzLCB0cnVlKSxcbiAgICAgICAgICBfc3RlcDEwO1xuXG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKF9pdGVyYXRvcjEwLnMoKTsgIShfc3RlcDEwID0gX2l0ZXJhdG9yMTAubigpKS5kb25lOykge1xuICAgICAgICAgIHZhciBmaWxlID0gX3N0ZXAxMC52YWx1ZTtcbiAgICAgICAgICBmaWxlLnByb2Nlc3NpbmcgPSB0cnVlOyAvLyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuXG4gICAgICAgICAgZmlsZS5zdGF0dXMgPSBEcm9wem9uZS5VUExPQURJTkc7XG4gICAgICAgICAgdGhpcy5lbWl0KFwicHJvY2Vzc2luZ1wiLCBmaWxlKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9pdGVyYXRvcjEwLmUoZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIF9pdGVyYXRvcjEwLmYoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy51cGxvYWRNdWx0aXBsZSkge1xuICAgICAgICB0aGlzLmVtaXQoXCJwcm9jZXNzaW5nbXVsdGlwbGVcIiwgZmlsZXMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy51cGxvYWRGaWxlcyhmaWxlcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9nZXRGaWxlc1dpdGhYaHJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2dldEZpbGVzV2l0aFhocih4aHIpIHtcbiAgICAgIHZhciBmaWxlcztcbiAgICAgIHJldHVybiBmaWxlcyA9IHRoaXMuZmlsZXMuZmlsdGVyKGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgICAgIHJldHVybiBmaWxlLnhociA9PT0geGhyO1xuICAgICAgfSkubWFwKGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgICAgIHJldHVybiBmaWxlO1xuICAgICAgfSk7XG4gICAgfSAvLyBDYW5jZWxzIHRoZSBmaWxlIHVwbG9hZCBhbmQgc2V0cyB0aGUgc3RhdHVzIHRvIENBTkNFTEVEXG4gICAgLy8gKippZioqIHRoZSBmaWxlIGlzIGFjdHVhbGx5IGJlaW5nIHVwbG9hZGVkLlxuICAgIC8vIElmIGl0J3Mgc3RpbGwgaW4gdGhlIHF1ZXVlLCB0aGUgZmlsZSBpcyBiZWluZyByZW1vdmVkIGZyb20gaXQgYW5kIHRoZSBzdGF0dXNcbiAgICAvLyBzZXQgdG8gQ0FOQ0VMRUQuXG5cbiAgfSwge1xuICAgIGtleTogXCJjYW5jZWxVcGxvYWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2FuY2VsVXBsb2FkKGZpbGUpIHtcbiAgICAgIGlmIChmaWxlLnN0YXR1cyA9PT0gRHJvcHpvbmUuVVBMT0FESU5HKSB7XG4gICAgICAgIHZhciBncm91cGVkRmlsZXMgPSB0aGlzLl9nZXRGaWxlc1dpdGhYaHIoZmlsZS54aHIpO1xuXG4gICAgICAgIHZhciBfaXRlcmF0b3IxMSA9IGRyb3B6b25lX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoZ3JvdXBlZEZpbGVzLCB0cnVlKSxcbiAgICAgICAgICAgIF9zdGVwMTE7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmb3IgKF9pdGVyYXRvcjExLnMoKTsgIShfc3RlcDExID0gX2l0ZXJhdG9yMTEubigpKS5kb25lOykge1xuICAgICAgICAgICAgdmFyIGdyb3VwZWRGaWxlID0gX3N0ZXAxMS52YWx1ZTtcbiAgICAgICAgICAgIGdyb3VwZWRGaWxlLnN0YXR1cyA9IERyb3B6b25lLkNBTkNFTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgX2l0ZXJhdG9yMTEuZShlcnIpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIF9pdGVyYXRvcjExLmYoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgZmlsZS54aHIgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICBmaWxlLnhoci5hYm9ydCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIF9pdGVyYXRvcjEyID0gZHJvcHpvbmVfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihncm91cGVkRmlsZXMsIHRydWUpLFxuICAgICAgICAgICAgX3N0ZXAxMjtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAoX2l0ZXJhdG9yMTIucygpOyAhKF9zdGVwMTIgPSBfaXRlcmF0b3IxMi5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgICB2YXIgX2dyb3VwZWRGaWxlID0gX3N0ZXAxMi52YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuZW1pdChcImNhbmNlbGVkXCIsIF9ncm91cGVkRmlsZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBfaXRlcmF0b3IxMi5lKGVycik7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgX2l0ZXJhdG9yMTIuZigpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy51cGxvYWRNdWx0aXBsZSkge1xuICAgICAgICAgIHRoaXMuZW1pdChcImNhbmNlbGVkbXVsdGlwbGVcIiwgZ3JvdXBlZEZpbGVzKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChmaWxlLnN0YXR1cyA9PT0gRHJvcHpvbmUuQURERUQgfHwgZmlsZS5zdGF0dXMgPT09IERyb3B6b25lLlFVRVVFRCkge1xuICAgICAgICBmaWxlLnN0YXR1cyA9IERyb3B6b25lLkNBTkNFTEVEO1xuICAgICAgICB0aGlzLmVtaXQoXCJjYW5jZWxlZFwiLCBmaWxlKTtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnVwbG9hZE11bHRpcGxlKSB7XG4gICAgICAgICAgdGhpcy5lbWl0KFwiY2FuY2VsZWRtdWx0aXBsZVwiLCBbZmlsZV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXV0b1Byb2Nlc3NRdWV1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzUXVldWUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVzb2x2ZU9wdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXNvbHZlT3B0aW9uKG9wdGlvbikge1xuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3B0aW9uLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb3B0aW9uO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ1cGxvYWRGaWxlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVwbG9hZEZpbGUoZmlsZSkge1xuICAgICAgcmV0dXJuIHRoaXMudXBsb2FkRmlsZXMoW2ZpbGVdKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidXBsb2FkRmlsZXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdXBsb2FkRmlsZXMoZmlsZXMpIHtcbiAgICAgIHZhciBfdGhpczE0ID0gdGhpcztcblxuICAgICAgdGhpcy5fdHJhbnNmb3JtRmlsZXMoZmlsZXMsIGZ1bmN0aW9uICh0cmFuc2Zvcm1lZEZpbGVzKSB7XG4gICAgICAgIGlmIChfdGhpczE0Lm9wdGlvbnMuY2h1bmtpbmcpIHtcbiAgICAgICAgICAvLyBDaHVua2luZyBpcyBub3QgYWxsb3dlZCB0byBiZSB1c2VkIHdpdGggYHVwbG9hZE11bHRpcGxlYCBzbyB3ZSBrbm93XG4gICAgICAgICAgLy8gdGhhdCB0aGVyZSBpcyBvbmx5IF9fb25lX19maWxlLlxuICAgICAgICAgIHZhciB0cmFuc2Zvcm1lZEZpbGUgPSB0cmFuc2Zvcm1lZEZpbGVzWzBdO1xuICAgICAgICAgIGZpbGVzWzBdLnVwbG9hZC5jaHVua2VkID0gX3RoaXMxNC5vcHRpb25zLmNodW5raW5nICYmIChfdGhpczE0Lm9wdGlvbnMuZm9yY2VDaHVua2luZyB8fCB0cmFuc2Zvcm1lZEZpbGUuc2l6ZSA+IF90aGlzMTQub3B0aW9ucy5jaHVua1NpemUpO1xuICAgICAgICAgIGZpbGVzWzBdLnVwbG9hZC50b3RhbENodW5rQ291bnQgPSBNYXRoLmNlaWwodHJhbnNmb3JtZWRGaWxlLnNpemUgLyBfdGhpczE0Lm9wdGlvbnMuY2h1bmtTaXplKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWxlc1swXS51cGxvYWQuY2h1bmtlZCkge1xuICAgICAgICAgIC8vIFRoaXMgZmlsZSBzaG91bGQgYmUgc2VudCBpbiBjaHVua3MhXG4gICAgICAgICAgLy8gSWYgdGhlIGNodW5raW5nIG9wdGlvbiBpcyBzZXQsIHdlICoqa25vdyoqIHRoYXQgdGhlcmUgY2FuIG9ubHkgYmUgKipvbmUqKiBmaWxlLCBzaW5jZVxuICAgICAgICAgIC8vIHVwbG9hZE11bHRpcGxlIGlzIG5vdCBhbGxvd2VkIHdpdGggdGhpcyBvcHRpb24uXG4gICAgICAgICAgdmFyIGZpbGUgPSBmaWxlc1swXTtcbiAgICAgICAgICB2YXIgX3RyYW5zZm9ybWVkRmlsZSA9IHRyYW5zZm9ybWVkRmlsZXNbMF07XG4gICAgICAgICAgdmFyIHN0YXJ0ZWRDaHVua0NvdW50ID0gMDtcbiAgICAgICAgICBmaWxlLnVwbG9hZC5jaHVua3MgPSBbXTtcblxuICAgICAgICAgIHZhciBoYW5kbGVOZXh0Q2h1bmsgPSBmdW5jdGlvbiBoYW5kbGVOZXh0Q2h1bmsoKSB7XG4gICAgICAgICAgICB2YXIgY2h1bmtJbmRleCA9IDA7IC8vIEZpbmQgdGhlIG5leHQgaXRlbSBpbiBmaWxlLnVwbG9hZC5jaHVua3MgdGhhdCBpcyBub3QgZGVmaW5lZCB5ZXQuXG5cbiAgICAgICAgICAgIHdoaWxlIChmaWxlLnVwbG9hZC5jaHVua3NbY2h1bmtJbmRleF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBjaHVua0luZGV4Kys7XG4gICAgICAgICAgICB9IC8vIFRoaXMgbWVhbnMsIHRoYXQgYWxsIGNodW5rcyBoYXZlIGFscmVhZHkgYmVlbiBzdGFydGVkLlxuXG5cbiAgICAgICAgICAgIGlmIChjaHVua0luZGV4ID49IGZpbGUudXBsb2FkLnRvdGFsQ2h1bmtDb3VudCkgcmV0dXJuO1xuICAgICAgICAgICAgc3RhcnRlZENodW5rQ291bnQrKztcbiAgICAgICAgICAgIHZhciBzdGFydCA9IGNodW5rSW5kZXggKiBfdGhpczE0Lm9wdGlvbnMuY2h1bmtTaXplO1xuICAgICAgICAgICAgdmFyIGVuZCA9IE1hdGgubWluKHN0YXJ0ICsgX3RoaXMxNC5vcHRpb25zLmNodW5rU2l6ZSwgX3RyYW5zZm9ybWVkRmlsZS5zaXplKTtcbiAgICAgICAgICAgIHZhciBkYXRhQmxvY2sgPSB7XG4gICAgICAgICAgICAgIG5hbWU6IF90aGlzMTQuX2dldFBhcmFtTmFtZSgwKSxcbiAgICAgICAgICAgICAgZGF0YTogX3RyYW5zZm9ybWVkRmlsZS53ZWJraXRTbGljZSA/IF90cmFuc2Zvcm1lZEZpbGUud2Via2l0U2xpY2Uoc3RhcnQsIGVuZCkgOiBfdHJhbnNmb3JtZWRGaWxlLnNsaWNlKHN0YXJ0LCBlbmQpLFxuICAgICAgICAgICAgICBmaWxlbmFtZTogZmlsZS51cGxvYWQuZmlsZW5hbWUsXG4gICAgICAgICAgICAgIGNodW5rSW5kZXg6IGNodW5rSW5kZXhcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBmaWxlLnVwbG9hZC5jaHVua3NbY2h1bmtJbmRleF0gPSB7XG4gICAgICAgICAgICAgIGZpbGU6IGZpbGUsXG4gICAgICAgICAgICAgIGluZGV4OiBjaHVua0luZGV4LFxuICAgICAgICAgICAgICBkYXRhQmxvY2s6IGRhdGFCbG9jayxcbiAgICAgICAgICAgICAgLy8gSW4gY2FzZSB3ZSB3YW50IHRvIHJldHJ5LlxuICAgICAgICAgICAgICBzdGF0dXM6IERyb3B6b25lLlVQTE9BRElORyxcbiAgICAgICAgICAgICAgcHJvZ3Jlc3M6IDAsXG4gICAgICAgICAgICAgIHJldHJpZXM6IDAgLy8gVGhlIG51bWJlciBvZiB0aW1lcyB0aGlzIGJsb2NrIGhhcyBiZWVuIHJldHJpZWQuXG5cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIF90aGlzMTQuX3VwbG9hZERhdGEoZmlsZXMsIFtkYXRhQmxvY2tdKTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgZmlsZS51cGxvYWQuZmluaXNoZWRDaHVua1VwbG9hZCA9IGZ1bmN0aW9uIChjaHVuaywgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgIHZhciBhbGxGaW5pc2hlZCA9IHRydWU7XG4gICAgICAgICAgICBjaHVuay5zdGF0dXMgPSBEcm9wem9uZS5TVUNDRVNTOyAvLyBDbGVhciB0aGUgZGF0YSBmcm9tIHRoZSBjaHVua1xuXG4gICAgICAgICAgICBjaHVuay5kYXRhQmxvY2sgPSBudWxsOyAvLyBMZWF2aW5nIHRoaXMgcmVmZXJlbmNlIHRvIHhociBpbnRhY3QgaGVyZSB3aWxsIGNhdXNlIG1lbW9yeSBsZWFrcyBpbiBzb21lIGJyb3dzZXJzXG5cbiAgICAgICAgICAgIGNodW5rLnhociA9IG51bGw7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmlsZS51cGxvYWQudG90YWxDaHVua0NvdW50OyBpKyspIHtcbiAgICAgICAgICAgICAgaWYgKGZpbGUudXBsb2FkLmNodW5rc1tpXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZU5leHRDaHVuaygpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKGZpbGUudXBsb2FkLmNodW5rc1tpXS5zdGF0dXMgIT09IERyb3B6b25lLlNVQ0NFU1MpIHtcbiAgICAgICAgICAgICAgICBhbGxGaW5pc2hlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChhbGxGaW5pc2hlZCkge1xuICAgICAgICAgICAgICBfdGhpczE0Lm9wdGlvbnMuY2h1bmtzVXBsb2FkZWQoZmlsZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIF90aGlzMTQuX2ZpbmlzaGVkKGZpbGVzLCByZXNwb25zZSwgbnVsbCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBpZiAoX3RoaXMxNC5vcHRpb25zLnBhcmFsbGVsQ2h1bmtVcGxvYWRzKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbGUudXBsb2FkLnRvdGFsQ2h1bmtDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICAgIGhhbmRsZU5leHRDaHVuaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoYW5kbGVOZXh0Q2h1bmsoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIGRhdGFCbG9ja3MgPSBbXTtcblxuICAgICAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IGZpbGVzLmxlbmd0aDsgX2kyKyspIHtcbiAgICAgICAgICAgIGRhdGFCbG9ja3NbX2kyXSA9IHtcbiAgICAgICAgICAgICAgbmFtZTogX3RoaXMxNC5fZ2V0UGFyYW1OYW1lKF9pMiksXG4gICAgICAgICAgICAgIGRhdGE6IHRyYW5zZm9ybWVkRmlsZXNbX2kyXSxcbiAgICAgICAgICAgICAgZmlsZW5hbWU6IGZpbGVzW19pMl0udXBsb2FkLmZpbGVuYW1lXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF90aGlzMTQuX3VwbG9hZERhdGEoZmlsZXMsIGRhdGFCbG9ja3MpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IC8vLyBSZXR1cm5zIHRoZSByaWdodCBjaHVuayBmb3IgZ2l2ZW4gZmlsZSBhbmQgeGhyXG5cbiAgfSwge1xuICAgIGtleTogXCJfZ2V0Q2h1bmtcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2dldENodW5rKGZpbGUsIHhocikge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWxlLnVwbG9hZC50b3RhbENodW5rQ291bnQ7IGkrKykge1xuICAgICAgICBpZiAoZmlsZS51cGxvYWQuY2h1bmtzW2ldICE9PSB1bmRlZmluZWQgJiYgZmlsZS51cGxvYWQuY2h1bmtzW2ldLnhociA9PT0geGhyKSB7XG4gICAgICAgICAgcmV0dXJuIGZpbGUudXBsb2FkLmNodW5rc1tpXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8gVGhpcyBmdW5jdGlvbiBhY3R1YWxseSB1cGxvYWRzIHRoZSBmaWxlKHMpIHRvIHRoZSBzZXJ2ZXIuXG4gICAgLy8gSWYgZGF0YUJsb2NrcyBjb250YWlucyB0aGUgYWN0dWFsIGRhdGEgdG8gdXBsb2FkIChtZWFuaW5nLCB0aGF0IHRoaXMgY291bGQgZWl0aGVyIGJlIHRyYW5zZm9ybWVkXG4gICAgLy8gZmlsZXMsIG9yIGluZGl2aWR1YWwgY2h1bmtzIGZvciBjaHVua2VkIHVwbG9hZCkuXG5cbiAgfSwge1xuICAgIGtleTogXCJfdXBsb2FkRGF0YVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfdXBsb2FkRGF0YShmaWxlcywgZGF0YUJsb2Nrcykge1xuICAgICAgdmFyIF90aGlzMTUgPSB0aGlzO1xuXG4gICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7IC8vIFB1dCB0aGUgeGhyIG9iamVjdCBpbiB0aGUgZmlsZSBvYmplY3RzIHRvIGJlIGFibGUgdG8gcmVmZXJlbmNlIGl0IGxhdGVyLlxuXG4gICAgICB2YXIgX2l0ZXJhdG9yMTMgPSBkcm9wem9uZV9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGZpbGVzLCB0cnVlKSxcbiAgICAgICAgICBfc3RlcDEzO1xuXG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKF9pdGVyYXRvcjEzLnMoKTsgIShfc3RlcDEzID0gX2l0ZXJhdG9yMTMubigpKS5kb25lOykge1xuICAgICAgICAgIHZhciBmaWxlID0gX3N0ZXAxMy52YWx1ZTtcbiAgICAgICAgICBmaWxlLnhociA9IHhocjtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9pdGVyYXRvcjEzLmUoZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIF9pdGVyYXRvcjEzLmYoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpbGVzWzBdLnVwbG9hZC5jaHVua2VkKSB7XG4gICAgICAgIC8vIFB1dCB0aGUgeGhyIG9iamVjdCBpbiB0aGUgcmlnaHQgY2h1bmsgb2JqZWN0LCBzbyBpdCBjYW4gYmUgYXNzb2NpYXRlZCBsYXRlciwgYW5kIGZvdW5kIHdpdGggX2dldENodW5rXG4gICAgICAgIGZpbGVzWzBdLnVwbG9hZC5jaHVua3NbZGF0YUJsb2Nrc1swXS5jaHVua0luZGV4XS54aHIgPSB4aHI7XG4gICAgICB9XG5cbiAgICAgIHZhciBtZXRob2QgPSB0aGlzLnJlc29sdmVPcHRpb24odGhpcy5vcHRpb25zLm1ldGhvZCwgZmlsZXMpO1xuICAgICAgdmFyIHVybCA9IHRoaXMucmVzb2x2ZU9wdGlvbih0aGlzLm9wdGlvbnMudXJsLCBmaWxlcyk7XG4gICAgICB4aHIub3BlbihtZXRob2QsIHVybCwgdHJ1ZSk7IC8vIFNldHRpbmcgdGhlIHRpbWVvdXQgYWZ0ZXIgb3BlbiBiZWNhdXNlIG9mIElFMTEgaXNzdWU6IGh0dHBzOi8vZ2l0bGFiLmNvbS9tZW5vL2Ryb3B6b25lL2lzc3Vlcy84XG5cbiAgICAgIHZhciB0aW1lb3V0ID0gdGhpcy5yZXNvbHZlT3B0aW9uKHRoaXMub3B0aW9ucy50aW1lb3V0LCBmaWxlcyk7XG4gICAgICBpZiAodGltZW91dCkgeGhyLnRpbWVvdXQgPSB0aGlzLnJlc29sdmVPcHRpb24odGhpcy5vcHRpb25zLnRpbWVvdXQsIGZpbGVzKTsgLy8gSGFzIHRvIGJlIGFmdGVyIGAub3BlbigpYC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbnlvL2Ryb3B6b25lL2lzc3Vlcy8xNzlcblxuICAgICAgeGhyLndpdGhDcmVkZW50aWFscyA9ICEhdGhpcy5vcHRpb25zLndpdGhDcmVkZW50aWFscztcblxuICAgICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIF90aGlzMTUuX2ZpbmlzaGVkVXBsb2FkaW5nKGZpbGVzLCB4aHIsIGUpO1xuICAgICAgfTtcblxuICAgICAgeGhyLm9udGltZW91dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXMxNS5faGFuZGxlVXBsb2FkRXJyb3IoZmlsZXMsIHhociwgXCJSZXF1ZXN0IHRpbWVkb3V0IGFmdGVyIFwiLmNvbmNhdChfdGhpczE1Lm9wdGlvbnMudGltZW91dCAvIDEwMDAsIFwiIHNlY29uZHNcIikpO1xuICAgICAgfTtcblxuICAgICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzMTUuX2hhbmRsZVVwbG9hZEVycm9yKGZpbGVzLCB4aHIpO1xuICAgICAgfTsgLy8gU29tZSBicm93c2VycyBkbyBub3QgaGF2ZSB0aGUgLnVwbG9hZCBwcm9wZXJ0eVxuXG5cbiAgICAgIHZhciBwcm9ncmVzc09iaiA9IHhoci51cGxvYWQgIT0gbnVsbCA/IHhoci51cGxvYWQgOiB4aHI7XG5cbiAgICAgIHByb2dyZXNzT2JqLm9ucHJvZ3Jlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gX3RoaXMxNS5fdXBkYXRlRmlsZXNVcGxvYWRQcm9ncmVzcyhmaWxlcywgeGhyLCBlKTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBoZWFkZXJzID0ge1xuICAgICAgICBBY2NlcHQ6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICBcIkNhY2hlLUNvbnRyb2xcIjogXCJuby1jYWNoZVwiLFxuICAgICAgICBcIlgtUmVxdWVzdGVkLVdpdGhcIjogXCJYTUxIdHRwUmVxdWVzdFwiXG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmhlYWRlcnMpIHtcbiAgICAgICAgRHJvcHpvbmUuZXh0ZW5kKGhlYWRlcnMsIHRoaXMub3B0aW9ucy5oZWFkZXJzKTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaGVhZGVyTmFtZSBpbiBoZWFkZXJzKSB7XG4gICAgICAgIHZhciBoZWFkZXJWYWx1ZSA9IGhlYWRlcnNbaGVhZGVyTmFtZV07XG5cbiAgICAgICAgaWYgKGhlYWRlclZhbHVlKSB7XG4gICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyTmFtZSwgaGVhZGVyVmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOyAvLyBBZGRpbmcgYWxsIEBvcHRpb25zIHBhcmFtZXRlcnNcblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5wYXJhbXMpIHtcbiAgICAgICAgdmFyIGFkZGl0aW9uYWxQYXJhbXMgPSB0aGlzLm9wdGlvbnMucGFyYW1zO1xuXG4gICAgICAgIGlmICh0eXBlb2YgYWRkaXRpb25hbFBhcmFtcyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgYWRkaXRpb25hbFBhcmFtcyA9IGFkZGl0aW9uYWxQYXJhbXMuY2FsbCh0aGlzLCBmaWxlcywgeGhyLCBmaWxlc1swXS51cGxvYWQuY2h1bmtlZCA/IHRoaXMuX2dldENodW5rKGZpbGVzWzBdLCB4aHIpIDogbnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gYWRkaXRpb25hbFBhcmFtcykge1xuICAgICAgICAgIHZhciB2YWx1ZSA9IGFkZGl0aW9uYWxQYXJhbXNba2V5XTtcblxuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgLy8gVGhlIGFkZGl0aW9uYWwgcGFyYW1ldGVyIGNvbnRhaW5zIGFuIGFycmF5LFxuICAgICAgICAgICAgLy8gc28gbGV0cyBpdGVyYXRlIG92ZXIgaXQgdG8gYXR0YWNoIGVhY2ggdmFsdWVcbiAgICAgICAgICAgIC8vIGluZGl2aWR1YWxseS5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgdmFsdWVbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IC8vIExldCB0aGUgdXNlciBhZGQgYWRkaXRpb25hbCBkYXRhIGlmIG5lY2Vzc2FyeVxuXG5cbiAgICAgIHZhciBfaXRlcmF0b3IxNCA9IGRyb3B6b25lX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoZmlsZXMsIHRydWUpLFxuICAgICAgICAgIF9zdGVwMTQ7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoX2l0ZXJhdG9yMTQucygpOyAhKF9zdGVwMTQgPSBfaXRlcmF0b3IxNC5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgdmFyIF9maWxlID0gX3N0ZXAxNC52YWx1ZTtcbiAgICAgICAgICB0aGlzLmVtaXQoXCJzZW5kaW5nXCIsIF9maWxlLCB4aHIsIGZvcm1EYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9pdGVyYXRvcjE0LmUoZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIF9pdGVyYXRvcjE0LmYoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy51cGxvYWRNdWx0aXBsZSkge1xuICAgICAgICB0aGlzLmVtaXQoXCJzZW5kaW5nbXVsdGlwbGVcIiwgZmlsZXMsIHhociwgZm9ybURhdGEpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9hZGRGb3JtRWxlbWVudERhdGEoZm9ybURhdGEpOyAvLyBGaW5hbGx5IGFkZCB0aGUgZmlsZXNcbiAgICAgIC8vIEhhcyB0byBiZSBsYXN0IGJlY2F1c2Ugc29tZSBzZXJ2ZXJzIChlZzogUzMpIGV4cGVjdCB0aGUgZmlsZSB0byBiZSB0aGUgbGFzdCBwYXJhbWV0ZXJcblxuXG4gICAgICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCBkYXRhQmxvY2tzLmxlbmd0aDsgX2kzKyspIHtcbiAgICAgICAgdmFyIGRhdGFCbG9jayA9IGRhdGFCbG9ja3NbX2kzXTtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKGRhdGFCbG9jay5uYW1lLCBkYXRhQmxvY2suZGF0YSwgZGF0YUJsb2NrLmZpbGVuYW1lKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zdWJtaXRSZXF1ZXN0KHhociwgZm9ybURhdGEsIGZpbGVzKTtcbiAgICB9IC8vIFRyYW5zZm9ybXMgYWxsIGZpbGVzIHdpdGggdGhpcy5vcHRpb25zLnRyYW5zZm9ybUZpbGUgYW5kIGludm9rZXMgZG9uZSB3aXRoIHRoZSB0cmFuc2Zvcm1lZCBmaWxlcyB3aGVuIGRvbmUuXG5cbiAgfSwge1xuICAgIGtleTogXCJfdHJhbnNmb3JtRmlsZXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3RyYW5zZm9ybUZpbGVzKGZpbGVzLCBkb25lKSB7XG4gICAgICB2YXIgX3RoaXMxNiA9IHRoaXM7XG5cbiAgICAgIHZhciB0cmFuc2Zvcm1lZEZpbGVzID0gW107IC8vIENsdW1zeSB3YXkgb2YgaGFuZGxpbmcgYXN5bmNocm9ub3VzIGNhbGxzLCB1bnRpbCBJIGdldCB0byBhZGQgYSBwcm9wZXIgRnV0dXJlIGxpYnJhcnkuXG5cbiAgICAgIHZhciBkb25lQ291bnRlciA9IDA7XG5cbiAgICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKGkpIHtcbiAgICAgICAgX3RoaXMxNi5vcHRpb25zLnRyYW5zZm9ybUZpbGUuY2FsbChfdGhpczE2LCBmaWxlc1tpXSwgZnVuY3Rpb24gKHRyYW5zZm9ybWVkRmlsZSkge1xuICAgICAgICAgIHRyYW5zZm9ybWVkRmlsZXNbaV0gPSB0cmFuc2Zvcm1lZEZpbGU7XG5cbiAgICAgICAgICBpZiAoKytkb25lQ291bnRlciA9PT0gZmlsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBkb25lKHRyYW5zZm9ybWVkRmlsZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIF9sb29wKGkpO1xuICAgICAgfVxuICAgIH0gLy8gVGFrZXMgY2FyZSBvZiBhZGRpbmcgb3RoZXIgaW5wdXQgZWxlbWVudHMgb2YgdGhlIGZvcm0gdG8gdGhlIEFKQVggcmVxdWVzdFxuXG4gIH0sIHtcbiAgICBrZXk6IFwiX2FkZEZvcm1FbGVtZW50RGF0YVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfYWRkRm9ybUVsZW1lbnREYXRhKGZvcm1EYXRhKSB7XG4gICAgICAvLyBUYWtlIGNhcmUgb2Ygb3RoZXIgaW5wdXQgZWxlbWVudHNcbiAgICAgIGlmICh0aGlzLmVsZW1lbnQudGFnTmFtZSA9PT0gXCJGT1JNXCIpIHtcbiAgICAgICAgdmFyIF9pdGVyYXRvcjE1ID0gZHJvcHpvbmVfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcih0aGlzLmVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcImlucHV0LCB0ZXh0YXJlYSwgc2VsZWN0LCBidXR0b25cIiksIHRydWUpLFxuICAgICAgICAgICAgX3N0ZXAxNTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAoX2l0ZXJhdG9yMTUucygpOyAhKF9zdGVwMTUgPSBfaXRlcmF0b3IxNS5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgICB2YXIgaW5wdXQgPSBfc3RlcDE1LnZhbHVlO1xuICAgICAgICAgICAgdmFyIGlucHV0TmFtZSA9IGlucHV0LmdldEF0dHJpYnV0ZShcIm5hbWVcIik7XG4gICAgICAgICAgICB2YXIgaW5wdXRUeXBlID0gaW5wdXQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKTtcbiAgICAgICAgICAgIGlmIChpbnB1dFR5cGUpIGlucHV0VHlwZSA9IGlucHV0VHlwZS50b0xvd2VyQ2FzZSgpOyAvLyBJZiB0aGUgaW5wdXQgZG9lc24ndCBoYXZlIGEgbmFtZSwgd2UgY2FuJ3QgdXNlIGl0LlxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGlucHV0TmFtZSA9PT0gXCJ1bmRlZmluZWRcIiB8fCBpbnB1dE5hbWUgPT09IG51bGwpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBpZiAoaW5wdXQudGFnTmFtZSA9PT0gXCJTRUxFQ1RcIiAmJiBpbnB1dC5oYXNBdHRyaWJ1dGUoXCJtdWx0aXBsZVwiKSkge1xuICAgICAgICAgICAgICAvLyBQb3NzaWJseSBtdWx0aXBsZSB2YWx1ZXNcbiAgICAgICAgICAgICAgdmFyIF9pdGVyYXRvcjE2ID0gZHJvcHpvbmVfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihpbnB1dC5vcHRpb25zLCB0cnVlKSxcbiAgICAgICAgICAgICAgICAgIF9zdGVwMTY7XG5cbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmb3IgKF9pdGVyYXRvcjE2LnMoKTsgIShfc3RlcDE2ID0gX2l0ZXJhdG9yMTYubigpKS5kb25lOykge1xuICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvbiA9IF9zdGVwMTYudmFsdWU7XG5cbiAgICAgICAgICAgICAgICAgIGlmIChvcHRpb24uc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGlucHV0TmFtZSwgb3B0aW9uLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIF9pdGVyYXRvcjE2LmUoZXJyKTtcbiAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBfaXRlcmF0b3IxNi5mKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlucHV0VHlwZSB8fCBpbnB1dFR5cGUgIT09IFwiY2hlY2tib3hcIiAmJiBpbnB1dFR5cGUgIT09IFwicmFkaW9cIiB8fCBpbnB1dC5jaGVja2VkKSB7XG4gICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChpbnB1dE5hbWUsIGlucHV0LnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIF9pdGVyYXRvcjE1LmUoZXJyKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBfaXRlcmF0b3IxNS5mKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIEludm9rZWQgd2hlbiB0aGVyZSBpcyBuZXcgcHJvZ3Jlc3MgaW5mb3JtYXRpb24gYWJvdXQgZ2l2ZW4gZmlsZXMuXG4gICAgLy8gSWYgZSBpcyBub3QgcHJvdmlkZWQsIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgdXBsb2FkIGlzIGZpbmlzaGVkLlxuXG4gIH0sIHtcbiAgICBrZXk6IFwiX3VwZGF0ZUZpbGVzVXBsb2FkUHJvZ3Jlc3NcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3VwZGF0ZUZpbGVzVXBsb2FkUHJvZ3Jlc3MoZmlsZXMsIHhociwgZSkge1xuICAgICAgaWYgKCFmaWxlc1swXS51cGxvYWQuY2h1bmtlZCkge1xuICAgICAgICAvLyBIYW5kbGUgZmlsZSB1cGxvYWRzIHdpdGhvdXQgY2h1bmtpbmdcbiAgICAgICAgdmFyIF9pdGVyYXRvcjE3ID0gZHJvcHpvbmVfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihmaWxlcywgdHJ1ZSksXG4gICAgICAgICAgICBfc3RlcDE3O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZm9yIChfaXRlcmF0b3IxNy5zKCk7ICEoX3N0ZXAxNyA9IF9pdGVyYXRvcjE3Lm4oKSkuZG9uZTspIHtcbiAgICAgICAgICAgIHZhciBmaWxlID0gX3N0ZXAxNy52YWx1ZTtcblxuICAgICAgICAgICAgaWYgKGZpbGUudXBsb2FkLnRvdGFsICYmIGZpbGUudXBsb2FkLmJ5dGVzU2VudCAmJiBmaWxlLnVwbG9hZC5ieXRlc1NlbnQgPT0gZmlsZS51cGxvYWQudG90YWwpIHtcbiAgICAgICAgICAgICAgLy8gSWYgYm90aCwgdGhlIGB0b3RhbGAgYW5kIGBieXRlc1NlbnRgIGhhdmUgYWxyZWFkeSBiZWVuIHNldCwgYW5kXG4gICAgICAgICAgICAgIC8vIHRoZXkgYXJlIGVxdWFsIChtZWFuaW5nIHByb2dyZXNzIGlzIGF0IDEwMCUpLCB3ZSBjYW4gc2tpcCB0aGlzXG4gICAgICAgICAgICAgIC8vIGZpbGUsIHNpbmNlIGFuIHVwbG9hZCBwcm9ncmVzcyBzaG91bGRuJ3QgZ28gZG93bi5cbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgICAgIGZpbGUudXBsb2FkLnByb2dyZXNzID0gMTAwICogZS5sb2FkZWQgLyBlLnRvdGFsO1xuICAgICAgICAgICAgICBmaWxlLnVwbG9hZC50b3RhbCA9IGUudG90YWw7XG4gICAgICAgICAgICAgIGZpbGUudXBsb2FkLmJ5dGVzU2VudCA9IGUubG9hZGVkO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gTm8gZXZlbnQsIHNvIHdlJ3JlIGF0IDEwMCVcbiAgICAgICAgICAgICAgZmlsZS51cGxvYWQucHJvZ3Jlc3MgPSAxMDA7XG4gICAgICAgICAgICAgIGZpbGUudXBsb2FkLmJ5dGVzU2VudCA9IGZpbGUudXBsb2FkLnRvdGFsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmVtaXQoXCJ1cGxvYWRwcm9ncmVzc1wiLCBmaWxlLCBmaWxlLnVwbG9hZC5wcm9ncmVzcywgZmlsZS51cGxvYWQuYnl0ZXNTZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIF9pdGVyYXRvcjE3LmUoZXJyKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBfaXRlcmF0b3IxNy5mKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEhhbmRsZSBjaHVua2VkIGZpbGUgdXBsb2Fkc1xuICAgICAgICAvLyBDaHVua2VkIHVwbG9hZCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHVwbG9hZGluZyBtdWx0aXBsZSBmaWxlcyBpbiBvbmVcbiAgICAgICAgLy8gcmVxdWVzdCwgc28gd2Uga25vdyB0aGVyZSdzIG9ubHkgb25lIGZpbGUuXG4gICAgICAgIHZhciBfZmlsZTIgPSBmaWxlc1swXTsgLy8gU2luY2UgdGhpcyBpcyBhIGNodW5rZWQgdXBsb2FkLCB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgYXBwcm9wcmlhdGUgY2h1bmtcbiAgICAgICAgLy8gcHJvZ3Jlc3MuXG5cbiAgICAgICAgdmFyIGNodW5rID0gdGhpcy5fZ2V0Q2h1bmsoX2ZpbGUyLCB4aHIpO1xuXG4gICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgY2h1bmsucHJvZ3Jlc3MgPSAxMDAgKiBlLmxvYWRlZCAvIGUudG90YWw7XG4gICAgICAgICAgY2h1bmsudG90YWwgPSBlLnRvdGFsO1xuICAgICAgICAgIGNodW5rLmJ5dGVzU2VudCA9IGUubG9hZGVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vIGV2ZW50LCBzbyB3ZSdyZSBhdCAxMDAlXG4gICAgICAgICAgY2h1bmsucHJvZ3Jlc3MgPSAxMDA7XG4gICAgICAgICAgY2h1bmsuYnl0ZXNTZW50ID0gY2h1bmsudG90YWw7XG4gICAgICAgIH0gLy8gTm93IHRhbGx5IHRoZSAqZmlsZSogdXBsb2FkIHByb2dyZXNzIGZyb20gaXRzIGluZGl2aWR1YWwgY2h1bmtzXG5cblxuICAgICAgICBfZmlsZTIudXBsb2FkLnByb2dyZXNzID0gMDtcbiAgICAgICAgX2ZpbGUyLnVwbG9hZC50b3RhbCA9IDA7XG4gICAgICAgIF9maWxlMi51cGxvYWQuYnl0ZXNTZW50ID0gMDtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IF9maWxlMi51cGxvYWQudG90YWxDaHVua0NvdW50OyBpKyspIHtcbiAgICAgICAgICBpZiAoX2ZpbGUyLnVwbG9hZC5jaHVua3NbaV0gJiYgdHlwZW9mIF9maWxlMi51cGxvYWQuY2h1bmtzW2ldLnByb2dyZXNzICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICBfZmlsZTIudXBsb2FkLnByb2dyZXNzICs9IF9maWxlMi51cGxvYWQuY2h1bmtzW2ldLnByb2dyZXNzO1xuICAgICAgICAgICAgX2ZpbGUyLnVwbG9hZC50b3RhbCArPSBfZmlsZTIudXBsb2FkLmNodW5rc1tpXS50b3RhbDtcbiAgICAgICAgICAgIF9maWxlMi51cGxvYWQuYnl0ZXNTZW50ICs9IF9maWxlMi51cGxvYWQuY2h1bmtzW2ldLmJ5dGVzU2VudDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gU2luY2UgdGhlIHByb2Nlc3MgaXMgYSBwZXJjZW50YWdlLCB3ZSBuZWVkIHRvIGRpdmlkZSBieSB0aGUgYW1vdW50IG9mXG4gICAgICAgIC8vIGNodW5rcyB3ZSd2ZSB1c2VkLlxuXG5cbiAgICAgICAgX2ZpbGUyLnVwbG9hZC5wcm9ncmVzcyA9IF9maWxlMi51cGxvYWQucHJvZ3Jlc3MgLyBfZmlsZTIudXBsb2FkLnRvdGFsQ2h1bmtDb3VudDtcbiAgICAgICAgdGhpcy5lbWl0KFwidXBsb2FkcHJvZ3Jlc3NcIiwgX2ZpbGUyLCBfZmlsZTIudXBsb2FkLnByb2dyZXNzLCBfZmlsZTIudXBsb2FkLmJ5dGVzU2VudCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9maW5pc2hlZFVwbG9hZGluZ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfZmluaXNoZWRVcGxvYWRpbmcoZmlsZXMsIHhociwgZSkge1xuICAgICAgdmFyIHJlc3BvbnNlO1xuXG4gICAgICBpZiAoZmlsZXNbMF0uc3RhdHVzID09PSBEcm9wem9uZS5DQU5DRUxFRCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSAhPT0gNCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh4aHIucmVzcG9uc2VUeXBlICE9PSBcImFycmF5YnVmZmVyXCIgJiYgeGhyLnJlc3BvbnNlVHlwZSAhPT0gXCJibG9iXCIpIHtcbiAgICAgICAgcmVzcG9uc2UgPSB4aHIucmVzcG9uc2VUZXh0O1xuXG4gICAgICAgIGlmICh4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoXCJjb250ZW50LXR5cGVcIikgJiYgfnhoci5nZXRSZXNwb25zZUhlYWRlcihcImNvbnRlbnQtdHlwZVwiKS5pbmRleE9mKFwiYXBwbGljYXRpb24vanNvblwiKSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXNwb25zZSA9IEpTT04ucGFyc2UocmVzcG9uc2UpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBlID0gZXJyb3I7XG4gICAgICAgICAgICByZXNwb25zZSA9IFwiSW52YWxpZCBKU09OIHJlc3BvbnNlIGZyb20gc2VydmVyLlwiO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLl91cGRhdGVGaWxlc1VwbG9hZFByb2dyZXNzKGZpbGVzLCB4aHIpO1xuXG4gICAgICBpZiAoISgyMDAgPD0geGhyLnN0YXR1cyAmJiB4aHIuc3RhdHVzIDwgMzAwKSkge1xuICAgICAgICB0aGlzLl9oYW5kbGVVcGxvYWRFcnJvcihmaWxlcywgeGhyLCByZXNwb25zZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZmlsZXNbMF0udXBsb2FkLmNodW5rZWQpIHtcbiAgICAgICAgICBmaWxlc1swXS51cGxvYWQuZmluaXNoZWRDaHVua1VwbG9hZCh0aGlzLl9nZXRDaHVuayhmaWxlc1swXSwgeGhyKSwgcmVzcG9uc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX2ZpbmlzaGVkKGZpbGVzLCByZXNwb25zZSwgZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX2hhbmRsZVVwbG9hZEVycm9yXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9oYW5kbGVVcGxvYWRFcnJvcihmaWxlcywgeGhyLCByZXNwb25zZSkge1xuICAgICAgaWYgKGZpbGVzWzBdLnN0YXR1cyA9PT0gRHJvcHpvbmUuQ0FOQ0VMRUQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmlsZXNbMF0udXBsb2FkLmNodW5rZWQgJiYgdGhpcy5vcHRpb25zLnJldHJ5Q2h1bmtzKSB7XG4gICAgICAgIHZhciBjaHVuayA9IHRoaXMuX2dldENodW5rKGZpbGVzWzBdLCB4aHIpO1xuXG4gICAgICAgIGlmIChjaHVuay5yZXRyaWVzKysgPCB0aGlzLm9wdGlvbnMucmV0cnlDaHVua3NMaW1pdCkge1xuICAgICAgICAgIHRoaXMuX3VwbG9hZERhdGEoZmlsZXMsIFtjaHVuay5kYXRhQmxvY2tdKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXCJSZXRyaWVkIHRoaXMgY2h1bmsgdG9vIG9mdGVuLiBHaXZpbmcgdXAuXCIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2Vycm9yUHJvY2Vzc2luZyhmaWxlcywgcmVzcG9uc2UgfHwgdGhpcy5vcHRpb25zLmRpY3RSZXNwb25zZUVycm9yLnJlcGxhY2UoXCJ7e3N0YXR1c0NvZGV9fVwiLCB4aHIuc3RhdHVzKSwgeGhyKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic3VibWl0UmVxdWVzdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzdWJtaXRSZXF1ZXN0KHhociwgZm9ybURhdGEsIGZpbGVzKSB7XG4gICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgIT0gMSkge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJDYW5ub3Qgc2VuZCB0aGlzIHJlcXVlc3QgYmVjYXVzZSB0aGUgWE1MSHR0cFJlcXVlc3QucmVhZHlTdGF0ZSBpcyBub3QgT1BFTkVELlwiKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB4aHIuc2VuZChmb3JtRGF0YSk7XG4gICAgfSAvLyBDYWxsZWQgaW50ZXJuYWxseSB3aGVuIHByb2Nlc3NpbmcgaXMgZmluaXNoZWQuXG4gICAgLy8gSW5kaXZpZHVhbCBjYWxsYmFja3MgaGF2ZSB0byBiZSBjYWxsZWQgaW4gdGhlIGFwcHJvcHJpYXRlIHNlY3Rpb25zLlxuXG4gIH0sIHtcbiAgICBrZXk6IFwiX2ZpbmlzaGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9maW5pc2hlZChmaWxlcywgcmVzcG9uc2VUZXh0LCBlKSB7XG4gICAgICB2YXIgX2l0ZXJhdG9yMTggPSBkcm9wem9uZV9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGZpbGVzLCB0cnVlKSxcbiAgICAgICAgICBfc3RlcDE4O1xuXG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKF9pdGVyYXRvcjE4LnMoKTsgIShfc3RlcDE4ID0gX2l0ZXJhdG9yMTgubigpKS5kb25lOykge1xuICAgICAgICAgIHZhciBmaWxlID0gX3N0ZXAxOC52YWx1ZTtcbiAgICAgICAgICBmaWxlLnN0YXR1cyA9IERyb3B6b25lLlNVQ0NFU1M7XG4gICAgICAgICAgdGhpcy5lbWl0KFwic3VjY2Vzc1wiLCBmaWxlLCByZXNwb25zZVRleHQsIGUpO1xuICAgICAgICAgIHRoaXMuZW1pdChcImNvbXBsZXRlXCIsIGZpbGUpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgX2l0ZXJhdG9yMTguZShlcnIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgX2l0ZXJhdG9yMTguZigpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnVwbG9hZE11bHRpcGxlKSB7XG4gICAgICAgIHRoaXMuZW1pdChcInN1Y2Nlc3NtdWx0aXBsZVwiLCBmaWxlcywgcmVzcG9uc2VUZXh0LCBlKTtcbiAgICAgICAgdGhpcy5lbWl0KFwiY29tcGxldGVtdWx0aXBsZVwiLCBmaWxlcyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXV0b1Byb2Nlc3NRdWV1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzUXVldWUoKTtcbiAgICAgIH1cbiAgICB9IC8vIENhbGxlZCBpbnRlcm5hbGx5IHdoZW4gcHJvY2Vzc2luZyBpcyBmaW5pc2hlZC5cbiAgICAvLyBJbmRpdmlkdWFsIGNhbGxiYWNrcyBoYXZlIHRvIGJlIGNhbGxlZCBpbiB0aGUgYXBwcm9wcmlhdGUgc2VjdGlvbnMuXG5cbiAgfSwge1xuICAgIGtleTogXCJfZXJyb3JQcm9jZXNzaW5nXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9lcnJvclByb2Nlc3NpbmcoZmlsZXMsIG1lc3NhZ2UsIHhocikge1xuICAgICAgdmFyIF9pdGVyYXRvcjE5ID0gZHJvcHpvbmVfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihmaWxlcywgdHJ1ZSksXG4gICAgICAgICAgX3N0ZXAxOTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChfaXRlcmF0b3IxOS5zKCk7ICEoX3N0ZXAxOSA9IF9pdGVyYXRvcjE5Lm4oKSkuZG9uZTspIHtcbiAgICAgICAgICB2YXIgZmlsZSA9IF9zdGVwMTkudmFsdWU7XG4gICAgICAgICAgZmlsZS5zdGF0dXMgPSBEcm9wem9uZS5FUlJPUjtcbiAgICAgICAgICB0aGlzLmVtaXQoXCJlcnJvclwiLCBmaWxlLCBtZXNzYWdlLCB4aHIpO1xuICAgICAgICAgIHRoaXMuZW1pdChcImNvbXBsZXRlXCIsIGZpbGUpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgX2l0ZXJhdG9yMTkuZShlcnIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgX2l0ZXJhdG9yMTkuZigpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnVwbG9hZE11bHRpcGxlKSB7XG4gICAgICAgIHRoaXMuZW1pdChcImVycm9ybXVsdGlwbGVcIiwgZmlsZXMsIG1lc3NhZ2UsIHhocik7XG4gICAgICAgIHRoaXMuZW1pdChcImNvbXBsZXRlbXVsdGlwbGVcIiwgZmlsZXMpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmF1dG9Qcm9jZXNzUXVldWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1F1ZXVlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6IFwiaW5pdENsYXNzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGluaXRDbGFzcygpIHtcbiAgICAgIC8vIEV4cG9zaW5nIHRoZSBlbWl0dGVyIGNsYXNzLCBtYWlubHkgZm9yIHRlc3RzXG4gICAgICB0aGlzLnByb3RvdHlwZS5FbWl0dGVyID0gRW1pdHRlcjtcbiAgICAgIC8qXG4gICAgICAgVGhpcyBpcyBhIGxpc3Qgb2YgYWxsIGF2YWlsYWJsZSBldmVudHMgeW91IGNhbiByZWdpc3RlciBvbiBhIGRyb3B6b25lIG9iamVjdC5cbiAgICAgICAgWW91IGNhbiByZWdpc3RlciBhbiBldmVudCBoYW5kbGVyIGxpa2UgdGhpczpcbiAgICAgICAgZHJvcHpvbmUub24oXCJkcmFnRW50ZXJcIiwgZnVuY3Rpb24oKSB7IH0pO1xuICAgICAgICAqL1xuXG4gICAgICB0aGlzLnByb3RvdHlwZS5ldmVudHMgPSBbXCJkcm9wXCIsIFwiZHJhZ3N0YXJ0XCIsIFwiZHJhZ2VuZFwiLCBcImRyYWdlbnRlclwiLCBcImRyYWdvdmVyXCIsIFwiZHJhZ2xlYXZlXCIsIFwiYWRkZWRmaWxlXCIsIFwiYWRkZWRmaWxlc1wiLCBcInJlbW92ZWRmaWxlXCIsIFwidGh1bWJuYWlsXCIsIFwiZXJyb3JcIiwgXCJlcnJvcm11bHRpcGxlXCIsIFwicHJvY2Vzc2luZ1wiLCBcInByb2Nlc3NpbmdtdWx0aXBsZVwiLCBcInVwbG9hZHByb2dyZXNzXCIsIFwidG90YWx1cGxvYWRwcm9ncmVzc1wiLCBcInNlbmRpbmdcIiwgXCJzZW5kaW5nbXVsdGlwbGVcIiwgXCJzdWNjZXNzXCIsIFwic3VjY2Vzc211bHRpcGxlXCIsIFwiY2FuY2VsZWRcIiwgXCJjYW5jZWxlZG11bHRpcGxlXCIsIFwiY29tcGxldGVcIiwgXCJjb21wbGV0ZW11bHRpcGxlXCIsIFwicmVzZXRcIiwgXCJtYXhmaWxlc2V4Y2VlZGVkXCIsIFwibWF4ZmlsZXNyZWFjaGVkXCIsIFwicXVldWVjb21wbGV0ZVwiXTtcbiAgICAgIHRoaXMucHJvdG90eXBlLl90aHVtYm5haWxRdWV1ZSA9IFtdO1xuICAgICAgdGhpcy5wcm90b3R5cGUuX3Byb2Nlc3NpbmdUaHVtYm5haWwgPSBmYWxzZTtcbiAgICB9IC8vIGdsb2JhbCB1dGlsaXR5XG5cbiAgfSwge1xuICAgIGtleTogXCJleHRlbmRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZXh0ZW5kKHRhcmdldCkge1xuICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBvYmplY3RzID0gbmV3IEFycmF5KF9sZW4yID4gMSA/IF9sZW4yIC0gMSA6IDApLCBfa2V5MiA9IDE7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgICAgb2JqZWN0c1tfa2V5MiAtIDFdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgX2k0ID0gMCwgX29iamVjdHMgPSBvYmplY3RzOyBfaTQgPCBfb2JqZWN0cy5sZW5ndGg7IF9pNCsrKSB7XG4gICAgICAgIHZhciBvYmplY3QgPSBfb2JqZWN0c1tfaTRdO1xuXG4gICAgICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgICB2YXIgdmFsID0gb2JqZWN0W2tleV07XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSB2YWw7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidXVpZHY0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHV1aWR2NCgpIHtcbiAgICAgIHJldHVybiBcInh4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eFwiLnJlcGxhY2UoL1t4eV0vZywgZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgdmFyIHIgPSBNYXRoLnJhbmRvbSgpICogMTYgfCAwLFxuICAgICAgICAgICAgdiA9IGMgPT09IFwieFwiID8gciA6IHIgJiAweDMgfCAweDg7XG4gICAgICAgIHJldHVybiB2LnRvU3RyaW5nKDE2KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBEcm9wem9uZTtcbn0oRW1pdHRlcik7XG5cblxuRHJvcHpvbmUuaW5pdENsYXNzKCk7XG5Ecm9wem9uZS52ZXJzaW9uID0gXCI1LjkuMlwiOyAvLyBUaGlzIGlzIGEgbWFwIG9mIG9wdGlvbnMgZm9yIHlvdXIgZGlmZmVyZW50IGRyb3B6b25lcy4gQWRkIGNvbmZpZ3VyYXRpb25zXG4vLyB0byB0aGlzIG9iamVjdCBmb3IgeW91ciBkaWZmZXJlbnQgZHJvcHpvbmUgZWxlbWVucy5cbi8vXG4vLyBFeGFtcGxlOlxuLy9cbi8vICAgICBEcm9wem9uZS5vcHRpb25zLm15RHJvcHpvbmVFbGVtZW50SWQgPSB7IG1heEZpbGVzaXplOiAxIH07XG4vL1xuLy8gVG8gZGlzYWJsZSBhdXRvRGlzY292ZXIgZm9yIGEgc3BlY2lmaWMgZWxlbWVudCwgeW91IGNhbiBzZXQgYGZhbHNlYCBhcyBhbiBvcHRpb246XG4vL1xuLy8gICAgIERyb3B6b25lLm9wdGlvbnMubXlEaXNhYmxlZEVsZW1lbnRJZCA9IGZhbHNlO1xuLy9cbi8vIEFuZCBpbiBodG1sOlxuLy9cbi8vICAgICA8Zm9ybSBhY3Rpb249XCIvdXBsb2FkXCIgaWQ9XCJteS1kcm9wem9uZS1lbGVtZW50LWlkXCIgY2xhc3M9XCJkcm9wem9uZVwiPjwvZm9ybT5cblxuRHJvcHpvbmUub3B0aW9ucyA9IHt9OyAvLyBSZXR1cm5zIHRoZSBvcHRpb25zIGZvciBhbiBlbGVtZW50IG9yIHVuZGVmaW5lZCBpZiBub25lIGF2YWlsYWJsZS5cblxuRHJvcHpvbmUub3B0aW9uc0ZvckVsZW1lbnQgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAvLyBHZXQgdGhlIGBEcm9wem9uZS5vcHRpb25zLmVsZW1lbnRJZGAgZm9yIHRoaXMgZWxlbWVudCBpZiBpdCBleGlzdHNcbiAgaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiaWRcIikpIHtcbiAgICByZXR1cm4gRHJvcHpvbmUub3B0aW9uc1tjYW1lbGl6ZShlbGVtZW50LmdldEF0dHJpYnV0ZShcImlkXCIpKV07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufTsgLy8gSG9sZHMgYSBsaXN0IG9mIGFsbCBkcm9wem9uZSBpbnN0YW5jZXNcblxuXG5Ecm9wem9uZS5pbnN0YW5jZXMgPSBbXTsgLy8gUmV0dXJucyB0aGUgZHJvcHpvbmUgZm9yIGdpdmVuIGVsZW1lbnQgaWYgYW55XG5cbkRyb3B6b25lLmZvckVsZW1lbnQgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICBpZiAodHlwZW9mIGVsZW1lbnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlbGVtZW50KTtcbiAgfVxuXG4gIGlmICgoZWxlbWVudCAhPSBudWxsID8gZWxlbWVudC5kcm9wem9uZSA6IHVuZGVmaW5lZCkgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vIERyb3B6b25lIGZvdW5kIGZvciBnaXZlbiBlbGVtZW50LiBUaGlzIGlzIHByb2JhYmx5IGJlY2F1c2UgeW91J3JlIHRyeWluZyB0byBhY2Nlc3MgaXQgYmVmb3JlIERyb3B6b25lIGhhZCB0aGUgdGltZSB0byBpbml0aWFsaXplLiBVc2UgdGhlIGBpbml0YCBvcHRpb24gdG8gc2V0dXAgYW55IGFkZGl0aW9uYWwgb2JzZXJ2ZXJzIG9uIHlvdXIgRHJvcHpvbmUuXCIpO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQuZHJvcHpvbmU7XG59OyAvLyBTZXQgdG8gZmFsc2UgaWYgeW91IGRvbid0IHdhbnQgRHJvcHpvbmUgdG8gYXV0b21hdGljYWxseSBmaW5kIGFuZCBhdHRhY2ggdG8gLmRyb3B6b25lIGVsZW1lbnRzLlxuXG5cbkRyb3B6b25lLmF1dG9EaXNjb3ZlciA9IHRydWU7IC8vIExvb2tzIGZvciBhbGwgLmRyb3B6b25lIGVsZW1lbnRzIGFuZCBjcmVhdGVzIGEgZHJvcHpvbmUgZm9yIHRoZW1cblxuRHJvcHpvbmUuZGlzY292ZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBkcm9wem9uZXM7XG5cbiAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwpIHtcbiAgICBkcm9wem9uZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiLmRyb3B6b25lXCIpO1xuICB9IGVsc2Uge1xuICAgIGRyb3B6b25lcyA9IFtdOyAvLyBJRSA6KFxuXG4gICAgdmFyIGNoZWNrRWxlbWVudHMgPSBmdW5jdGlvbiBjaGVja0VsZW1lbnRzKGVsZW1lbnRzKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gW107XG5cbiAgICAgICAgdmFyIF9pdGVyYXRvcjIwID0gZHJvcHpvbmVfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihlbGVtZW50cywgdHJ1ZSksXG4gICAgICAgICAgICBfc3RlcDIwO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZm9yIChfaXRlcmF0b3IyMC5zKCk7ICEoX3N0ZXAyMCA9IF9pdGVyYXRvcjIwLm4oKSkuZG9uZTspIHtcbiAgICAgICAgICAgIHZhciBlbCA9IF9zdGVwMjAudmFsdWU7XG5cbiAgICAgICAgICAgIGlmICgvKF58IClkcm9wem9uZSgkfCApLy50ZXN0KGVsLmNsYXNzTmFtZSkpIHtcbiAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZHJvcHpvbmVzLnB1c2goZWwpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBfaXRlcmF0b3IyMC5lKGVycik7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgX2l0ZXJhdG9yMjAuZigpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0oKTtcbiAgICB9O1xuXG4gICAgY2hlY2tFbGVtZW50cyhkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImRpdlwiKSk7XG4gICAgY2hlY2tFbGVtZW50cyhkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImZvcm1cIikpO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcmVzdWx0ID0gW107XG5cbiAgICB2YXIgX2l0ZXJhdG9yMjEgPSBkcm9wem9uZV9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGRyb3B6b25lcywgdHJ1ZSksXG4gICAgICAgIF9zdGVwMjE7XG5cbiAgICB0cnkge1xuICAgICAgZm9yIChfaXRlcmF0b3IyMS5zKCk7ICEoX3N0ZXAyMSA9IF9pdGVyYXRvcjIxLm4oKSkuZG9uZTspIHtcbiAgICAgICAgdmFyIGRyb3B6b25lID0gX3N0ZXAyMS52YWx1ZTtcblxuICAgICAgICAvLyBDcmVhdGUgYSBkcm9wem9uZSB1bmxlc3MgYXV0byBkaXNjb3ZlciBoYXMgYmVlbiBkaXNhYmxlZCBmb3Igc3BlY2lmaWMgZWxlbWVudFxuICAgICAgICBpZiAoRHJvcHpvbmUub3B0aW9uc0ZvckVsZW1lbnQoZHJvcHpvbmUpICE9PSBmYWxzZSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKG5ldyBEcm9wem9uZShkcm9wem9uZSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIF9pdGVyYXRvcjIxLmUoZXJyKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgX2l0ZXJhdG9yMjEuZigpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0oKTtcbn07IC8vIFNvbWUgYnJvd3NlcnMgc3VwcG9ydCBkcmFnIGFuZCBkcm9nIGZ1bmN0aW9uYWxpdHksIGJ1dCBub3QgY29ycmVjdGx5LlxuLy9cbi8vIFNvIEkgY3JlYXRlZCBhIGJsb2NrbGlzdCBvZiB1c2VyQWdlbnRzLiBZZXMsIHllcy4gQnJvd3NlciBzbmlmZmluZywgSSBrbm93LlxuLy8gQnV0IHdoYXQgdG8gZG8gd2hlbiBicm93c2VycyAqdGhlb3JldGljYWxseSogc3VwcG9ydCBhbiBBUEksIGJ1dCBjcmFzaFxuLy8gd2hlbiB1c2luZyBpdC5cbi8vXG4vLyBUaGlzIGlzIGEgbGlzdCBvZiByZWd1bGFyIGV4cHJlc3Npb25zIHRlc3RlZCBhZ2FpbnN0IG5hdmlnYXRvci51c2VyQWdlbnRcbi8vXG4vLyAqKiBJdCBzaG91bGQgb25seSBiZSB1c2VkIG9uIGJyb3dzZXIgdGhhdCAqZG8qIHN1cHBvcnQgdGhlIEFQSSwgYnV0XG4vLyBpbmNvcnJlY3RseSAqKlxuXG5cbkRyb3B6b25lLmJsb2NrZWRCcm93c2VycyA9IFsvLyBUaGUgbWFjIG9zIGFuZCB3aW5kb3dzIHBob25lIHZlcnNpb24gb2Ygb3BlcmEgMTIgc2VlbXMgdG8gaGF2ZSBhIHByb2JsZW0gd2l0aCB0aGUgRmlsZSBkcmFnJ24nZHJvcCBBUEkuXG4vb3BlcmEuKihNYWNpbnRvc2h8V2luZG93cyBQaG9uZSkuKnZlcnNpb25cXC8xMi9pXTsgLy8gQ2hlY2tzIGlmIHRoZSBicm93c2VyIGlzIHN1cHBvcnRlZFxuXG5Ecm9wem9uZS5pc0Jyb3dzZXJTdXBwb3J0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBjYXBhYmxlQnJvd3NlciA9IHRydWU7XG5cbiAgaWYgKHdpbmRvdy5GaWxlICYmIHdpbmRvdy5GaWxlUmVhZGVyICYmIHdpbmRvdy5GaWxlTGlzdCAmJiB3aW5kb3cuQmxvYiAmJiB3aW5kb3cuRm9ybURhdGEgJiYgZG9jdW1lbnQucXVlcnlTZWxlY3Rvcikge1xuICAgIGlmICghKFwiY2xhc3NMaXN0XCIgaW4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIikpKSB7XG4gICAgICBjYXBhYmxlQnJvd3NlciA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoRHJvcHpvbmUuYmxhY2tsaXN0ZWRCcm93c2VycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIFNpbmNlIHRoaXMgaGFzIGJlZW4gcmVuYW1lZCwgdGhpcyBtYWtlcyBzdXJlIHdlIGRvbid0IGJyZWFrIG9sZGVyXG4gICAgICAgIC8vIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgIERyb3B6b25lLmJsb2NrZWRCcm93c2VycyA9IERyb3B6b25lLmJsYWNrbGlzdGVkQnJvd3NlcnM7XG4gICAgICB9IC8vIFRoZSBicm93c2VyIHN1cHBvcnRzIHRoZSBBUEksIGJ1dCBtYXkgYmUgYmxvY2tlZC5cblxuXG4gICAgICB2YXIgX2l0ZXJhdG9yMjIgPSBkcm9wem9uZV9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKERyb3B6b25lLmJsb2NrZWRCcm93c2VycywgdHJ1ZSksXG4gICAgICAgICAgX3N0ZXAyMjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChfaXRlcmF0b3IyMi5zKCk7ICEoX3N0ZXAyMiA9IF9pdGVyYXRvcjIyLm4oKSkuZG9uZTspIHtcbiAgICAgICAgICB2YXIgcmVnZXggPSBfc3RlcDIyLnZhbHVlO1xuXG4gICAgICAgICAgaWYgKHJlZ2V4LnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpIHtcbiAgICAgICAgICAgIGNhcGFibGVCcm93c2VyID0gZmFsc2U7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfaXRlcmF0b3IyMi5lKGVycik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBfaXRlcmF0b3IyMi5mKCk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNhcGFibGVCcm93c2VyID0gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gY2FwYWJsZUJyb3dzZXI7XG59O1xuXG5Ecm9wem9uZS5kYXRhVVJJdG9CbG9iID0gZnVuY3Rpb24gKGRhdGFVUkkpIHtcbiAgLy8gY29udmVydCBiYXNlNjQgdG8gcmF3IGJpbmFyeSBkYXRhIGhlbGQgaW4gYSBzdHJpbmdcbiAgLy8gZG9lc24ndCBoYW5kbGUgVVJMRW5jb2RlZCBEYXRhVVJJcyAtIHNlZSBTTyBhbnN3ZXIgIzY4NTAyNzYgZm9yIGNvZGUgdGhhdCBkb2VzIHRoaXNcbiAgdmFyIGJ5dGVTdHJpbmcgPSBhdG9iKGRhdGFVUkkuc3BsaXQoXCIsXCIpWzFdKTsgLy8gc2VwYXJhdGUgb3V0IHRoZSBtaW1lIGNvbXBvbmVudFxuXG4gIHZhciBtaW1lU3RyaW5nID0gZGF0YVVSSS5zcGxpdChcIixcIilbMF0uc3BsaXQoXCI6XCIpWzFdLnNwbGl0KFwiO1wiKVswXTsgLy8gd3JpdGUgdGhlIGJ5dGVzIG9mIHRoZSBzdHJpbmcgdG8gYW4gQXJyYXlCdWZmZXJcblxuICB2YXIgYWIgPSBuZXcgQXJyYXlCdWZmZXIoYnl0ZVN0cmluZy5sZW5ndGgpO1xuICB2YXIgaWEgPSBuZXcgVWludDhBcnJheShhYik7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGVuZCA9IGJ5dGVTdHJpbmcubGVuZ3RoLCBhc2MgPSAwIDw9IGVuZDsgYXNjID8gaSA8PSBlbmQgOiBpID49IGVuZDsgYXNjID8gaSsrIDogaS0tKSB7XG4gICAgaWFbaV0gPSBieXRlU3RyaW5nLmNoYXJDb2RlQXQoaSk7XG4gIH0gLy8gd3JpdGUgdGhlIEFycmF5QnVmZmVyIHRvIGEgYmxvYlxuXG5cbiAgcmV0dXJuIG5ldyBCbG9iKFthYl0sIHtcbiAgICB0eXBlOiBtaW1lU3RyaW5nXG4gIH0pO1xufTsgLy8gUmV0dXJucyBhbiBhcnJheSB3aXRob3V0IHRoZSByZWplY3RlZCBpdGVtXG5cblxudmFyIHdpdGhvdXQgPSBmdW5jdGlvbiB3aXRob3V0KGxpc3QsIHJlamVjdGVkSXRlbSkge1xuICByZXR1cm4gbGlzdC5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICByZXR1cm4gaXRlbSAhPT0gcmVqZWN0ZWRJdGVtO1xuICB9KS5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICByZXR1cm4gaXRlbTtcbiAgfSk7XG59OyAvLyBhYmMtZGVmX2doaSAtPiBhYmNEZWZHaGlcblxuXG52YXIgY2FtZWxpemUgPSBmdW5jdGlvbiBjYW1lbGl6ZShzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bXFwtX10oXFx3KS9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICByZXR1cm4gbWF0Y2guY2hhckF0KDEpLnRvVXBwZXJDYXNlKCk7XG4gIH0pO1xufTsgLy8gQ3JlYXRlcyBhbiBlbGVtZW50IGZyb20gc3RyaW5nXG5cblxuRHJvcHpvbmUuY3JlYXRlRWxlbWVudCA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIGRpdi5pbm5lckhUTUwgPSBzdHJpbmc7XG4gIHJldHVybiBkaXYuY2hpbGROb2Rlc1swXTtcbn07IC8vIFRlc3RzIGlmIGdpdmVuIGVsZW1lbnQgaXMgaW5zaWRlIChvciBzaW1wbHkgaXMpIHRoZSBjb250YWluZXJcblxuXG5Ecm9wem9uZS5lbGVtZW50SW5zaWRlID0gZnVuY3Rpb24gKGVsZW1lbnQsIGNvbnRhaW5lcikge1xuICBpZiAoZWxlbWVudCA9PT0gY29udGFpbmVyKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gQ29mZmVlc2NyaXB0IGRvZXNuJ3Qgc3VwcG9ydCBkby93aGlsZSBsb29wc1xuXG5cbiAgd2hpbGUgKGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICBpZiAoZWxlbWVudCA9PT0gY29udGFpbmVyKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5Ecm9wem9uZS5nZXRFbGVtZW50ID0gZnVuY3Rpb24gKGVsLCBuYW1lKSB7XG4gIHZhciBlbGVtZW50O1xuXG4gIGlmICh0eXBlb2YgZWwgPT09IFwic3RyaW5nXCIpIHtcbiAgICBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlbCk7XG4gIH0gZWxzZSBpZiAoZWwubm9kZVR5cGUgIT0gbnVsbCkge1xuICAgIGVsZW1lbnQgPSBlbDtcbiAgfVxuXG4gIGlmIChlbGVtZW50ID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGBcIi5jb25jYXQobmFtZSwgXCJgIG9wdGlvbiBwcm92aWRlZC4gUGxlYXNlIHByb3ZpZGUgYSBDU1Mgc2VsZWN0b3Igb3IgYSBwbGFpbiBIVE1MIGVsZW1lbnQuXCIpKTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50O1xufTtcblxuRHJvcHpvbmUuZ2V0RWxlbWVudHMgPSBmdW5jdGlvbiAoZWxzLCBuYW1lKSB7XG4gIHZhciBlbCwgZWxlbWVudHM7XG5cbiAgaWYgKGVscyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgZWxlbWVudHMgPSBbXTtcblxuICAgIHRyeSB7XG4gICAgICB2YXIgX2l0ZXJhdG9yMjMgPSBkcm9wem9uZV9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGVscywgdHJ1ZSksXG4gICAgICAgICAgX3N0ZXAyMztcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChfaXRlcmF0b3IyMy5zKCk7ICEoX3N0ZXAyMyA9IF9pdGVyYXRvcjIzLm4oKSkuZG9uZTspIHtcbiAgICAgICAgICBlbCA9IF9zdGVwMjMudmFsdWU7XG4gICAgICAgICAgZWxlbWVudHMucHVzaCh0aGlzLmdldEVsZW1lbnQoZWwsIG5hbWUpKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9pdGVyYXRvcjIzLmUoZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIF9pdGVyYXRvcjIzLmYoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlbGVtZW50cyA9IG51bGw7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBlbHMgPT09IFwic3RyaW5nXCIpIHtcbiAgICBlbGVtZW50cyA9IFtdO1xuXG4gICAgdmFyIF9pdGVyYXRvcjI0ID0gZHJvcHpvbmVfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGVscyksIHRydWUpLFxuICAgICAgICBfc3RlcDI0O1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAoX2l0ZXJhdG9yMjQucygpOyAhKF9zdGVwMjQgPSBfaXRlcmF0b3IyNC5uKCkpLmRvbmU7KSB7XG4gICAgICAgIGVsID0gX3N0ZXAyNC52YWx1ZTtcbiAgICAgICAgZWxlbWVudHMucHVzaChlbCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBfaXRlcmF0b3IyNC5lKGVycik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIF9pdGVyYXRvcjI0LmYoKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZWxzLm5vZGVUeXBlICE9IG51bGwpIHtcbiAgICBlbGVtZW50cyA9IFtlbHNdO1xuICB9XG5cbiAgaWYgKGVsZW1lbnRzID09IG51bGwgfHwgIWVsZW1lbnRzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYFwiLmNvbmNhdChuYW1lLCBcImAgb3B0aW9uIHByb3ZpZGVkLiBQbGVhc2UgcHJvdmlkZSBhIENTUyBzZWxlY3RvciwgYSBwbGFpbiBIVE1MIGVsZW1lbnQgb3IgYSBsaXN0IG9mIHRob3NlLlwiKSk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudHM7XG59OyAvLyBBc2tzIHRoZSB1c2VyIHRoZSBxdWVzdGlvbiBhbmQgY2FsbHMgYWNjZXB0ZWQgb3IgcmVqZWN0ZWQgYWNjb3JkaW5nbHlcbi8vXG4vLyBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBqdXN0IHVzZXMgYHdpbmRvdy5jb25maXJtYCBhbmQgdGhlbiBjYWxscyB0aGVcbi8vIGFwcHJvcHJpYXRlIGNhbGxiYWNrLlxuXG5cbkRyb3B6b25lLmNvbmZpcm0gPSBmdW5jdGlvbiAocXVlc3Rpb24sIGFjY2VwdGVkLCByZWplY3RlZCkge1xuICBpZiAod2luZG93LmNvbmZpcm0ocXVlc3Rpb24pKSB7XG4gICAgcmV0dXJuIGFjY2VwdGVkKCk7XG4gIH0gZWxzZSBpZiAocmVqZWN0ZWQgIT0gbnVsbCkge1xuICAgIHJldHVybiByZWplY3RlZCgpO1xuICB9XG59OyAvLyBWYWxpZGF0ZXMgdGhlIG1pbWUgdHlwZSBsaWtlIHRoaXM6XG4vL1xuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9IVE1ML0VsZW1lbnQvaW5wdXQjYXR0ci1hY2NlcHRcblxuXG5Ecm9wem9uZS5pc1ZhbGlkRmlsZSA9IGZ1bmN0aW9uIChmaWxlLCBhY2NlcHRlZEZpbGVzKSB7XG4gIGlmICghYWNjZXB0ZWRGaWxlcykge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIElmIHRoZXJlIGFyZSBubyBhY2NlcHRlZCBtaW1lIHR5cGVzLCBpdCdzIE9LXG5cblxuICBhY2NlcHRlZEZpbGVzID0gYWNjZXB0ZWRGaWxlcy5zcGxpdChcIixcIik7XG4gIHZhciBtaW1lVHlwZSA9IGZpbGUudHlwZTtcbiAgdmFyIGJhc2VNaW1lVHlwZSA9IG1pbWVUeXBlLnJlcGxhY2UoL1xcLy4qJC8sIFwiXCIpO1xuXG4gIHZhciBfaXRlcmF0b3IyNSA9IGRyb3B6b25lX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoYWNjZXB0ZWRGaWxlcywgdHJ1ZSksXG4gICAgICBfc3RlcDI1O1xuXG4gIHRyeSB7XG4gICAgZm9yIChfaXRlcmF0b3IyNS5zKCk7ICEoX3N0ZXAyNSA9IF9pdGVyYXRvcjI1Lm4oKSkuZG9uZTspIHtcbiAgICAgIHZhciB2YWxpZFR5cGUgPSBfc3RlcDI1LnZhbHVlO1xuICAgICAgdmFsaWRUeXBlID0gdmFsaWRUeXBlLnRyaW0oKTtcblxuICAgICAgaWYgKHZhbGlkVHlwZS5jaGFyQXQoMCkgPT09IFwiLlwiKSB7XG4gICAgICAgIGlmIChmaWxlLm5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKHZhbGlkVHlwZS50b0xvd2VyQ2FzZSgpLCBmaWxlLm5hbWUubGVuZ3RoIC0gdmFsaWRUeXBlLmxlbmd0aCkgIT09IC0xKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoL1xcL1xcKiQvLnRlc3QodmFsaWRUeXBlKSkge1xuICAgICAgICAvLyBUaGlzIGlzIHNvbWV0aGluZyBsaWtlIGEgaW1hZ2UvKiBtaW1lIHR5cGVcbiAgICAgICAgaWYgKGJhc2VNaW1lVHlwZSA9PT0gdmFsaWRUeXBlLnJlcGxhY2UoL1xcLy4qJC8sIFwiXCIpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChtaW1lVHlwZSA9PT0gdmFsaWRUeXBlKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9pdGVyYXRvcjI1LmUoZXJyKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBfaXRlcmF0b3IyNS5mKCk7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59OyAvLyBBdWdtZW50IGpRdWVyeVxuXG5cbmlmICh0eXBlb2YgalF1ZXJ5ICE9PSBcInVuZGVmaW5lZFwiICYmIGpRdWVyeSAhPT0gbnVsbCkge1xuICBqUXVlcnkuZm4uZHJvcHpvbmUgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG5ldyBEcm9wem9uZSh0aGlzLCBvcHRpb25zKTtcbiAgICB9KTtcbiAgfTtcbn0gLy8gRHJvcHpvbmUgZmlsZSBzdGF0dXMgY29kZXNcblxuXG5Ecm9wem9uZS5BRERFRCA9IFwiYWRkZWRcIjtcbkRyb3B6b25lLlFVRVVFRCA9IFwicXVldWVkXCI7IC8vIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gTm93LCBpZiBhIGZpbGUgaXMgYWNjZXB0ZWQsIGl0J3MgZWl0aGVyIHF1ZXVlZFxuLy8gb3IgdXBsb2FkaW5nLlxuXG5Ecm9wem9uZS5BQ0NFUFRFRCA9IERyb3B6b25lLlFVRVVFRDtcbkRyb3B6b25lLlVQTE9BRElORyA9IFwidXBsb2FkaW5nXCI7XG5Ecm9wem9uZS5QUk9DRVNTSU5HID0gRHJvcHpvbmUuVVBMT0FESU5HOyAvLyBhbGlhc1xuXG5Ecm9wem9uZS5DQU5DRUxFRCA9IFwiY2FuY2VsZWRcIjtcbkRyb3B6b25lLkVSUk9SID0gXCJlcnJvclwiO1xuRHJvcHpvbmUuU1VDQ0VTUyA9IFwic3VjY2Vzc1wiO1xuLypcblxuIEJ1Z2ZpeCBmb3IgaU9TIDYgYW5kIDdcbiBTb3VyY2U6IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTE5MjkwOTkvaHRtbDUtY2FudmFzLWRyYXdpbWFnZS1yYXRpby1idWctaW9zXG4gYmFzZWQgb24gdGhlIHdvcmsgb2YgaHR0cHM6Ly9naXRodWIuY29tL3N0b21pdGEvaW9zLWltYWdlZmlsZS1tZWdhcGl4ZWxcblxuICovXG4vLyBEZXRlY3RpbmcgdmVydGljYWwgc3F1YXNoIGluIGxvYWRlZCBpbWFnZS5cbi8vIEZpeGVzIGEgYnVnIHdoaWNoIHNxdWFzaCBpbWFnZSB2ZXJ0aWNhbGx5IHdoaWxlIGRyYXdpbmcgaW50byBjYW52YXMgZm9yIHNvbWUgaW1hZ2VzLlxuLy8gVGhpcyBpcyBhIGJ1ZyBpbiBpT1M2IGRldmljZXMuIFRoaXMgZnVuY3Rpb24gZnJvbSBodHRwczovL2dpdGh1Yi5jb20vc3RvbWl0YS9pb3MtaW1hZ2VmaWxlLW1lZ2FwaXhlbFxuXG52YXIgZGV0ZWN0VmVydGljYWxTcXVhc2ggPSBmdW5jdGlvbiBkZXRlY3RWZXJ0aWNhbFNxdWFzaChpbWcpIHtcbiAgdmFyIGl3ID0gaW1nLm5hdHVyYWxXaWR0aDtcbiAgdmFyIGloID0gaW1nLm5hdHVyYWxIZWlnaHQ7XG4gIHZhciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICBjYW52YXMud2lkdGggPSAxO1xuICBjYW52YXMuaGVpZ2h0ID0gaWg7XG4gIHZhciBjdHggPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuICBjdHguZHJhd0ltYWdlKGltZywgMCwgMCk7XG5cbiAgdmFyIF9jdHgkZ2V0SW1hZ2VEYXRhID0gY3R4LmdldEltYWdlRGF0YSgxLCAwLCAxLCBpaCksXG4gICAgICBkYXRhID0gX2N0eCRnZXRJbWFnZURhdGEuZGF0YTsgLy8gc2VhcmNoIGltYWdlIGVkZ2UgcGl4ZWwgcG9zaXRpb24gaW4gY2FzZSBpdCBpcyBzcXVhc2hlZCB2ZXJ0aWNhbGx5LlxuXG5cbiAgdmFyIHN5ID0gMDtcbiAgdmFyIGV5ID0gaWg7XG4gIHZhciBweSA9IGloO1xuXG4gIHdoaWxlIChweSA+IHN5KSB7XG4gICAgdmFyIGFscGhhID0gZGF0YVsocHkgLSAxKSAqIDQgKyAzXTtcblxuICAgIGlmIChhbHBoYSA9PT0gMCkge1xuICAgICAgZXkgPSBweTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3kgPSBweTtcbiAgICB9XG5cbiAgICBweSA9IGV5ICsgc3kgPj4gMTtcbiAgfVxuXG4gIHZhciByYXRpbyA9IHB5IC8gaWg7XG5cbiAgaWYgKHJhdGlvID09PSAwKSB7XG4gICAgcmV0dXJuIDE7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHJhdGlvO1xuICB9XG59OyAvLyBBIHJlcGxhY2VtZW50IGZvciBjb250ZXh0LmRyYXdJbWFnZVxuLy8gKGFyZ3MgYXJlIGZvciBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uKS5cblxuXG52YXIgZHJhd0ltYWdlSU9TRml4ID0gZnVuY3Rpb24gZHJhd0ltYWdlSU9TRml4KGN0eCwgaW1nLCBzeCwgc3ksIHN3LCBzaCwgZHgsIGR5LCBkdywgZGgpIHtcbiAgdmFyIHZlcnRTcXVhc2hSYXRpbyA9IGRldGVjdFZlcnRpY2FsU3F1YXNoKGltZyk7XG4gIHJldHVybiBjdHguZHJhd0ltYWdlKGltZywgc3gsIHN5LCBzdywgc2gsIGR4LCBkeSwgZHcsIGRoIC8gdmVydFNxdWFzaFJhdGlvKTtcbn07IC8vIEJhc2VkIG9uIE1pbmlmeUpwZWdcbi8vIFNvdXJjZTogaHR0cDovL3d3dy5wZXJyeS5jei9maWxlcy9FeGlmUmVzdG9yZXIuanNcbi8vIGh0dHA6Ly9lbGljb24uYmxvZzU3LmZjMi5jb20vYmxvZy1lbnRyeS0yMDYuaHRtbFxuXG5cbnZhciBFeGlmUmVzdG9yZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEV4aWZSZXN0b3JlKCkge1xuICAgIGRyb3B6b25lX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEV4aWZSZXN0b3JlKTtcbiAgfVxuXG4gIGRyb3B6b25lX2NyZWF0ZUNsYXNzKEV4aWZSZXN0b3JlLCBudWxsLCBbe1xuICAgIGtleTogXCJpbml0Q2xhc3NcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5pdENsYXNzKCkge1xuICAgICAgdGhpcy5LRVlfU1RSID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPVwiO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJlbmNvZGU2NFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlbmNvZGU2NChpbnB1dCkge1xuICAgICAgdmFyIG91dHB1dCA9IFwiXCI7XG4gICAgICB2YXIgY2hyMSA9IHVuZGVmaW5lZDtcbiAgICAgIHZhciBjaHIyID0gdW5kZWZpbmVkO1xuICAgICAgdmFyIGNocjMgPSBcIlwiO1xuICAgICAgdmFyIGVuYzEgPSB1bmRlZmluZWQ7XG4gICAgICB2YXIgZW5jMiA9IHVuZGVmaW5lZDtcbiAgICAgIHZhciBlbmMzID0gdW5kZWZpbmVkO1xuICAgICAgdmFyIGVuYzQgPSBcIlwiO1xuICAgICAgdmFyIGkgPSAwO1xuXG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBjaHIxID0gaW5wdXRbaSsrXTtcbiAgICAgICAgY2hyMiA9IGlucHV0W2krK107XG4gICAgICAgIGNocjMgPSBpbnB1dFtpKytdO1xuICAgICAgICBlbmMxID0gY2hyMSA+PiAyO1xuICAgICAgICBlbmMyID0gKGNocjEgJiAzKSA8PCA0IHwgY2hyMiA+PiA0O1xuICAgICAgICBlbmMzID0gKGNocjIgJiAxNSkgPDwgMiB8IGNocjMgPj4gNjtcbiAgICAgICAgZW5jNCA9IGNocjMgJiA2MztcblxuICAgICAgICBpZiAoaXNOYU4oY2hyMikpIHtcbiAgICAgICAgICBlbmMzID0gZW5jNCA9IDY0O1xuICAgICAgICB9IGVsc2UgaWYgKGlzTmFOKGNocjMpKSB7XG4gICAgICAgICAgZW5jNCA9IDY0O1xuICAgICAgICB9XG5cbiAgICAgICAgb3V0cHV0ID0gb3V0cHV0ICsgdGhpcy5LRVlfU1RSLmNoYXJBdChlbmMxKSArIHRoaXMuS0VZX1NUUi5jaGFyQXQoZW5jMikgKyB0aGlzLktFWV9TVFIuY2hhckF0KGVuYzMpICsgdGhpcy5LRVlfU1RSLmNoYXJBdChlbmM0KTtcbiAgICAgICAgY2hyMSA9IGNocjIgPSBjaHIzID0gXCJcIjtcbiAgICAgICAgZW5jMSA9IGVuYzIgPSBlbmMzID0gZW5jNCA9IFwiXCI7XG5cbiAgICAgICAgaWYgKCEoaSA8IGlucHV0Lmxlbmd0aCkpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZXN0b3JlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc3RvcmUob3JpZ0ZpbGVCYXNlNjQsIHJlc2l6ZWRGaWxlQmFzZTY0KSB7XG4gICAgICBpZiAoIW9yaWdGaWxlQmFzZTY0Lm1hdGNoKFwiZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCxcIikpIHtcbiAgICAgICAgcmV0dXJuIHJlc2l6ZWRGaWxlQmFzZTY0O1xuICAgICAgfVxuXG4gICAgICB2YXIgcmF3SW1hZ2UgPSB0aGlzLmRlY29kZTY0KG9yaWdGaWxlQmFzZTY0LnJlcGxhY2UoXCJkYXRhOmltYWdlL2pwZWc7YmFzZTY0LFwiLCBcIlwiKSk7XG4gICAgICB2YXIgc2VnbWVudHMgPSB0aGlzLnNsaWNlMlNlZ21lbnRzKHJhd0ltYWdlKTtcbiAgICAgIHZhciBpbWFnZSA9IHRoaXMuZXhpZk1hbmlwdWxhdGlvbihyZXNpemVkRmlsZUJhc2U2NCwgc2VnbWVudHMpO1xuICAgICAgcmV0dXJuIFwiZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCxcIi5jb25jYXQodGhpcy5lbmNvZGU2NChpbWFnZSkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJleGlmTWFuaXB1bGF0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGV4aWZNYW5pcHVsYXRpb24ocmVzaXplZEZpbGVCYXNlNjQsIHNlZ21lbnRzKSB7XG4gICAgICB2YXIgZXhpZkFycmF5ID0gdGhpcy5nZXRFeGlmQXJyYXkoc2VnbWVudHMpO1xuICAgICAgdmFyIG5ld0ltYWdlQXJyYXkgPSB0aGlzLmluc2VydEV4aWYocmVzaXplZEZpbGVCYXNlNjQsIGV4aWZBcnJheSk7XG4gICAgICB2YXIgYUJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KG5ld0ltYWdlQXJyYXkpO1xuICAgICAgcmV0dXJuIGFCdWZmZXI7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldEV4aWZBcnJheVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRFeGlmQXJyYXkoc2VnbWVudHMpIHtcbiAgICAgIHZhciBzZWcgPSB1bmRlZmluZWQ7XG4gICAgICB2YXIgeCA9IDA7XG5cbiAgICAgIHdoaWxlICh4IDwgc2VnbWVudHMubGVuZ3RoKSB7XG4gICAgICAgIHNlZyA9IHNlZ21lbnRzW3hdO1xuXG4gICAgICAgIGlmIChzZWdbMF0gPT09IDI1NSAmIHNlZ1sxXSA9PT0gMjI1KSB7XG4gICAgICAgICAgcmV0dXJuIHNlZztcbiAgICAgICAgfVxuXG4gICAgICAgIHgrKztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpbnNlcnRFeGlmXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGluc2VydEV4aWYocmVzaXplZEZpbGVCYXNlNjQsIGV4aWZBcnJheSkge1xuICAgICAgdmFyIGltYWdlRGF0YSA9IHJlc2l6ZWRGaWxlQmFzZTY0LnJlcGxhY2UoXCJkYXRhOmltYWdlL2pwZWc7YmFzZTY0LFwiLCBcIlwiKTtcbiAgICAgIHZhciBidWYgPSB0aGlzLmRlY29kZTY0KGltYWdlRGF0YSk7XG4gICAgICB2YXIgc2VwYXJhdGVQb2ludCA9IGJ1Zi5pbmRleE9mKDI1NSwgMyk7XG4gICAgICB2YXIgbWFlID0gYnVmLnNsaWNlKDAsIHNlcGFyYXRlUG9pbnQpO1xuICAgICAgdmFyIGF0byA9IGJ1Zi5zbGljZShzZXBhcmF0ZVBvaW50KTtcbiAgICAgIHZhciBhcnJheSA9IG1hZTtcbiAgICAgIGFycmF5ID0gYXJyYXkuY29uY2F0KGV4aWZBcnJheSk7XG4gICAgICBhcnJheSA9IGFycmF5LmNvbmNhdChhdG8pO1xuICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzbGljZTJTZWdtZW50c1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzbGljZTJTZWdtZW50cyhyYXdJbWFnZUFycmF5KSB7XG4gICAgICB2YXIgaGVhZCA9IDA7XG4gICAgICB2YXIgc2VnbWVudHMgPSBbXTtcblxuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgdmFyIGxlbmd0aDtcblxuICAgICAgICBpZiAocmF3SW1hZ2VBcnJheVtoZWFkXSA9PT0gMjU1ICYgcmF3SW1hZ2VBcnJheVtoZWFkICsgMV0gPT09IDIxOCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJhd0ltYWdlQXJyYXlbaGVhZF0gPT09IDI1NSAmIHJhd0ltYWdlQXJyYXlbaGVhZCArIDFdID09PSAyMTYpIHtcbiAgICAgICAgICBoZWFkICs9IDI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGVuZ3RoID0gcmF3SW1hZ2VBcnJheVtoZWFkICsgMl0gKiAyNTYgKyByYXdJbWFnZUFycmF5W2hlYWQgKyAzXTtcbiAgICAgICAgICB2YXIgZW5kUG9pbnQgPSBoZWFkICsgbGVuZ3RoICsgMjtcbiAgICAgICAgICB2YXIgc2VnID0gcmF3SW1hZ2VBcnJheS5zbGljZShoZWFkLCBlbmRQb2ludCk7XG4gICAgICAgICAgc2VnbWVudHMucHVzaChzZWcpO1xuICAgICAgICAgIGhlYWQgPSBlbmRQb2ludDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoZWFkID4gcmF3SW1hZ2VBcnJheS5sZW5ndGgpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VnbWVudHM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRlY29kZTY0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlY29kZTY0KGlucHV0KSB7XG4gICAgICB2YXIgb3V0cHV0ID0gXCJcIjtcbiAgICAgIHZhciBjaHIxID0gdW5kZWZpbmVkO1xuICAgICAgdmFyIGNocjIgPSB1bmRlZmluZWQ7XG4gICAgICB2YXIgY2hyMyA9IFwiXCI7XG4gICAgICB2YXIgZW5jMSA9IHVuZGVmaW5lZDtcbiAgICAgIHZhciBlbmMyID0gdW5kZWZpbmVkO1xuICAgICAgdmFyIGVuYzMgPSB1bmRlZmluZWQ7XG4gICAgICB2YXIgZW5jNCA9IFwiXCI7XG4gICAgICB2YXIgaSA9IDA7XG4gICAgICB2YXIgYnVmID0gW107IC8vIHJlbW92ZSBhbGwgY2hhcmFjdGVycyB0aGF0IGFyZSBub3QgQS1aLCBhLXosIDAtOSwgKywgLywgb3IgPVxuXG4gICAgICB2YXIgYmFzZTY0dGVzdCA9IC9bXkEtWmEtejAtOVxcK1xcL1xcPV0vZztcblxuICAgICAgaWYgKGJhc2U2NHRlc3QuZXhlYyhpbnB1dCkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiVGhlcmUgd2VyZSBpbnZhbGlkIGJhc2U2NCBjaGFyYWN0ZXJzIGluIHRoZSBpbnB1dCB0ZXh0LlxcblZhbGlkIGJhc2U2NCBjaGFyYWN0ZXJzIGFyZSBBLVosIGEteiwgMC05LCAnKycsICcvJyxhbmQgJz0nXFxuRXhwZWN0IGVycm9ycyBpbiBkZWNvZGluZy5cIik7XG4gICAgICB9XG5cbiAgICAgIGlucHV0ID0gaW5wdXQucmVwbGFjZSgvW15BLVphLXowLTlcXCtcXC9cXD1dL2csIFwiXCIpO1xuXG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBlbmMxID0gdGhpcy5LRVlfU1RSLmluZGV4T2YoaW5wdXQuY2hhckF0KGkrKykpO1xuICAgICAgICBlbmMyID0gdGhpcy5LRVlfU1RSLmluZGV4T2YoaW5wdXQuY2hhckF0KGkrKykpO1xuICAgICAgICBlbmMzID0gdGhpcy5LRVlfU1RSLmluZGV4T2YoaW5wdXQuY2hhckF0KGkrKykpO1xuICAgICAgICBlbmM0ID0gdGhpcy5LRVlfU1RSLmluZGV4T2YoaW5wdXQuY2hhckF0KGkrKykpO1xuICAgICAgICBjaHIxID0gZW5jMSA8PCAyIHwgZW5jMiA+PiA0O1xuICAgICAgICBjaHIyID0gKGVuYzIgJiAxNSkgPDwgNCB8IGVuYzMgPj4gMjtcbiAgICAgICAgY2hyMyA9IChlbmMzICYgMykgPDwgNiB8IGVuYzQ7XG4gICAgICAgIGJ1Zi5wdXNoKGNocjEpO1xuXG4gICAgICAgIGlmIChlbmMzICE9PSA2NCkge1xuICAgICAgICAgIGJ1Zi5wdXNoKGNocjIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVuYzQgIT09IDY0KSB7XG4gICAgICAgICAgYnVmLnB1c2goY2hyMyk7XG4gICAgICAgIH1cblxuICAgICAgICBjaHIxID0gY2hyMiA9IGNocjMgPSBcIlwiO1xuICAgICAgICBlbmMxID0gZW5jMiA9IGVuYzMgPSBlbmM0ID0gXCJcIjtcblxuICAgICAgICBpZiAoIShpIDwgaW5wdXQubGVuZ3RoKSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBidWY7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEV4aWZSZXN0b3JlO1xufSgpO1xuXG5FeGlmUmVzdG9yZS5pbml0Q2xhc3MoKTtcbi8qXG4gKiBjb250ZW50bG9hZGVkLmpzXG4gKlxuICogQXV0aG9yOiBEaWVnbyBQZXJpbmkgKGRpZWdvLnBlcmluaSBhdCBnbWFpbC5jb20pXG4gKiBTdW1tYXJ5OiBjcm9zcy1icm93c2VyIHdyYXBwZXIgZm9yIERPTUNvbnRlbnRMb2FkZWRcbiAqIFVwZGF0ZWQ6IDIwMTAxMDIwXG4gKiBMaWNlbnNlOiBNSVRcbiAqIFZlcnNpb246IDEuMlxuICpcbiAqIFVSTDpcbiAqIGh0dHA6Ly9qYXZhc2NyaXB0Lm53Ym94LmNvbS9Db250ZW50TG9hZGVkL1xuICogaHR0cDovL2phdmFzY3JpcHQubndib3guY29tL0NvbnRlbnRMb2FkZWQvTUlULUxJQ0VOU0VcbiAqL1xuLy8gQHdpbiB3aW5kb3cgcmVmZXJlbmNlXG4vLyBAZm4gZnVuY3Rpb24gcmVmZXJlbmNlXG5cbnZhciBjb250ZW50TG9hZGVkID0gZnVuY3Rpb24gY29udGVudExvYWRlZCh3aW4sIGZuKSB7XG4gIHZhciBkb25lID0gZmFsc2U7XG4gIHZhciB0b3AgPSB0cnVlO1xuICB2YXIgZG9jID0gd2luLmRvY3VtZW50O1xuICB2YXIgcm9vdCA9IGRvYy5kb2N1bWVudEVsZW1lbnQ7XG4gIHZhciBhZGQgPSBkb2MuYWRkRXZlbnRMaXN0ZW5lciA/IFwiYWRkRXZlbnRMaXN0ZW5lclwiIDogXCJhdHRhY2hFdmVudFwiO1xuICB2YXIgcmVtID0gZG9jLmFkZEV2ZW50TGlzdGVuZXIgPyBcInJlbW92ZUV2ZW50TGlzdGVuZXJcIiA6IFwiZGV0YWNoRXZlbnRcIjtcbiAgdmFyIHByZSA9IGRvYy5hZGRFdmVudExpc3RlbmVyID8gXCJcIiA6IFwib25cIjtcblxuICB2YXIgaW5pdCA9IGZ1bmN0aW9uIGluaXQoZSkge1xuICAgIGlmIChlLnR5cGUgPT09IFwicmVhZHlzdGF0ZWNoYW5nZVwiICYmIGRvYy5yZWFkeVN0YXRlICE9PSBcImNvbXBsZXRlXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAoZS50eXBlID09PSBcImxvYWRcIiA/IHdpbiA6IGRvYylbcmVtXShwcmUgKyBlLnR5cGUsIGluaXQsIGZhbHNlKTtcblxuICAgIGlmICghZG9uZSAmJiAoZG9uZSA9IHRydWUpKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh3aW4sIGUudHlwZSB8fCBlKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHBvbGwgPSBmdW5jdGlvbiBwb2xsKCkge1xuICAgIHRyeSB7XG4gICAgICByb290LmRvU2Nyb2xsKFwibGVmdFwiKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzZXRUaW1lb3V0KHBvbGwsIDUwKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5pdChcInBvbGxcIik7XG4gIH07XG5cbiAgaWYgKGRvYy5yZWFkeVN0YXRlICE9PSBcImNvbXBsZXRlXCIpIHtcbiAgICBpZiAoZG9jLmNyZWF0ZUV2ZW50T2JqZWN0ICYmIHJvb3QuZG9TY3JvbGwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRvcCA9ICF3aW4uZnJhbWVFbGVtZW50O1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHt9XG5cbiAgICAgIGlmICh0b3ApIHtcbiAgICAgICAgcG9sbCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGRvY1thZGRdKHByZSArIFwiRE9NQ29udGVudExvYWRlZFwiLCBpbml0LCBmYWxzZSk7XG4gICAgZG9jW2FkZF0ocHJlICsgXCJyZWFkeXN0YXRlY2hhbmdlXCIsIGluaXQsIGZhbHNlKTtcbiAgICByZXR1cm4gd2luW2FkZF0ocHJlICsgXCJsb2FkXCIsIGluaXQsIGZhbHNlKTtcbiAgfVxufTsgLy8gQXMgYSBzaW5nbGUgZnVuY3Rpb24gdG8gYmUgYWJsZSB0byB3cml0ZSB0ZXN0cy5cblxuXG5Ecm9wem9uZS5fYXV0b0Rpc2NvdmVyRnVuY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gIGlmIChEcm9wem9uZS5hdXRvRGlzY292ZXIpIHtcbiAgICByZXR1cm4gRHJvcHpvbmUuZGlzY292ZXIoKTtcbiAgfVxufTtcblxuY29udGVudExvYWRlZCh3aW5kb3csIERyb3B6b25lLl9hdXRvRGlzY292ZXJGdW5jdGlvbik7XG5cbmZ1bmN0aW9uIF9fZ3VhcmRfXyh2YWx1ZSwgdHJhbnNmb3JtKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgIT09IFwidW5kZWZpbmVkXCIgJiYgdmFsdWUgIT09IG51bGwgPyB0cmFuc2Zvcm0odmFsdWUpIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBfX2d1YXJkTWV0aG9kX18ob2JqLCBtZXRob2ROYW1lLCB0cmFuc2Zvcm0pIHtcbiAgaWYgKHR5cGVvZiBvYmogIT09IFwidW5kZWZpbmVkXCIgJiYgb2JqICE9PSBudWxsICYmIHR5cGVvZiBvYmpbbWV0aG9kTmFtZV0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiB0cmFuc2Zvcm0ob2JqLCBtZXRob2ROYW1lKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vdG9vbC9kcm9wem9uZS5kaXN0LmpzXG4gLy8vIE1ha2UgRHJvcHpvbmUgYSBnbG9iYWwgdmFyaWFibGUuXG5cbndpbmRvdy5Ecm9wem9uZSA9IERyb3B6b25lO1xuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgZHJvcHpvbmVfZGlzdCA9IChEcm9wem9uZSk7XG5cbn0oKTtcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19leHBvcnRzX187XG4vKioqKioqLyB9KSgpXG47XG59KTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/dropzone/dist/dropzone.js\n"); /***/ }), /***/ "./node_modules/es5-ext/array/\u0000#/clear.js": -/*!************************************************!* +/*!************************************************!*\ !*** ./node_modules/es5-ext/array/#/clear.js ***! \************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -3508,7 +3485,7 @@ eval("// Inspired by Google Closure:\n// http://closure-library.googlecode.com/s /***/ }), /***/ "./node_modules/es5-ext/array/\u0000#/e-index-of.js": -/*!*****************************************************!* +/*!*****************************************************!*\ !*** ./node_modules/es5-ext/array/#/e-index-of.js ***! \*****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -3519,7 +3496,7 @@ eval("\n\nvar numberIsNaN = __webpack_require__(/*! ../../number/is-nan */ /***/ }), /***/ "./node_modules/es5-ext/array/from/index.js": -/*!**************************************************!* +/*!**************************************************!*\ !*** ./node_modules/es5-ext/array/from/index.js ***! \**************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -3530,7 +3507,7 @@ eval("\n\nmodule.exports = __webpack_require__(/*! ./is-implemented */ \"./node_ /***/ }), /***/ "./node_modules/es5-ext/array/from/is-implemented.js": -/*!***********************************************************!* +/*!***********************************************************!*\ !*** ./node_modules/es5-ext/array/from/is-implemented.js ***! \***********************************************************/ /***/ ((module) => { @@ -3541,7 +3518,7 @@ eval("\n\nmodule.exports = function () {\n\tvar from = Array.from, arr, result;\ /***/ }), /***/ "./node_modules/es5-ext/array/from/shim.js": -/*!*************************************************!* +/*!*************************************************!*\ !*** ./node_modules/es5-ext/array/from/shim.js ***! \*************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -3552,7 +3529,7 @@ eval("\n\nvar iteratorSymbol = __webpack_require__(/*! es6-symbol */ \"./node_mo /***/ }), /***/ "./node_modules/es5-ext/function/is-arguments.js": -/*!*******************************************************!* +/*!*******************************************************!*\ !*** ./node_modules/es5-ext/function/is-arguments.js ***! \*******************************************************/ /***/ ((module) => { @@ -3563,7 +3540,7 @@ eval("\n\nvar objToString = Object.prototype.toString\n , id = objToString.call /***/ }), /***/ "./node_modules/es5-ext/function/is-function.js": -/*!******************************************************!* +/*!******************************************************!*\ !*** ./node_modules/es5-ext/function/is-function.js ***! \******************************************************/ /***/ ((module) => { @@ -3574,7 +3551,7 @@ eval("\n\nvar objToString = Object.prototype.toString\n , isFunctionStringTag = /***/ }), /***/ "./node_modules/es5-ext/function/noop.js": -/*!***********************************************!* +/*!***********************************************!*\ !*** ./node_modules/es5-ext/function/noop.js ***! \***********************************************/ /***/ ((module) => { @@ -3585,7 +3562,7 @@ eval("\n\n// eslint-disable-next-line no-empty-function\nmodule.exports = functi /***/ }), /***/ "./node_modules/es5-ext/math/sign/index.js": -/*!*************************************************!* +/*!*************************************************!*\ !*** ./node_modules/es5-ext/math/sign/index.js ***! \*************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -3596,7 +3573,7 @@ eval("\n\nmodule.exports = __webpack_require__(/*! ./is-implemented */ \"./node_ /***/ }), /***/ "./node_modules/es5-ext/math/sign/is-implemented.js": -/*!**********************************************************!* +/*!**********************************************************!*\ !*** ./node_modules/es5-ext/math/sign/is-implemented.js ***! \**********************************************************/ /***/ ((module) => { @@ -3607,7 +3584,7 @@ eval("\n\nmodule.exports = function () {\n\tvar sign = Math.sign;\n\tif (typeof /***/ }), /***/ "./node_modules/es5-ext/math/sign/shim.js": -/*!************************************************!* +/*!************************************************!*\ !*** ./node_modules/es5-ext/math/sign/shim.js ***! \************************************************/ /***/ ((module) => { @@ -3618,7 +3595,7 @@ eval("\n\nmodule.exports = function (value) {\n\tvalue = Number(value);\n\tif (i /***/ }), /***/ "./node_modules/es5-ext/number/is-nan/index.js": -/*!*****************************************************!* +/*!*****************************************************!*\ !*** ./node_modules/es5-ext/number/is-nan/index.js ***! \*****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -3629,7 +3606,7 @@ eval("\n\nmodule.exports = __webpack_require__(/*! ./is-implemented */ \"./node_ /***/ }), /***/ "./node_modules/es5-ext/number/is-nan/is-implemented.js": -/*!**************************************************************!* +/*!**************************************************************!*\ !*** ./node_modules/es5-ext/number/is-nan/is-implemented.js ***! \**************************************************************/ /***/ ((module) => { @@ -3640,7 +3617,7 @@ eval("\n\nmodule.exports = function () {\n\tvar numberIsNaN = Number.isNaN;\n\ti /***/ }), /***/ "./node_modules/es5-ext/number/is-nan/shim.js": -/*!****************************************************!* +/*!****************************************************!*\ !*** ./node_modules/es5-ext/number/is-nan/shim.js ***! \****************************************************/ /***/ ((module) => { @@ -3651,7 +3628,7 @@ eval("\n\nmodule.exports = function (value) {\n\t// eslint-disable-next-line no- /***/ }), /***/ "./node_modules/es5-ext/number/to-integer.js": -/*!***************************************************!* +/*!***************************************************!*\ !*** ./node_modules/es5-ext/number/to-integer.js ***! \***************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -3662,7 +3639,7 @@ eval("\n\nvar sign = __webpack_require__(/*! ../math/sign */ \"./node_modules/e /***/ }), /***/ "./node_modules/es5-ext/number/to-pos-integer.js": -/*!*******************************************************!* +/*!*******************************************************!*\ !*** ./node_modules/es5-ext/number/to-pos-integer.js ***! \*******************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -3673,7 +3650,7 @@ eval("\n\nvar toInteger = __webpack_require__(/*! ./to-integer */ \"./node_modul /***/ }), /***/ "./node_modules/es5-ext/object/_iterate.js": -/*!*************************************************!* +/*!*************************************************!*\ !*** ./node_modules/es5-ext/object/_iterate.js ***! \*************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -3684,7 +3661,7 @@ eval("// Internal method, used by iteration functions.\n// Calls a function for /***/ }), /***/ "./node_modules/es5-ext/object/assign/index.js": -/*!*****************************************************!* +/*!*****************************************************!*\ !*** ./node_modules/es5-ext/object/assign/index.js ***! \*****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -3695,7 +3672,7 @@ eval("\n\nmodule.exports = __webpack_require__(/*! ./is-implemented */ \"./node_ /***/ }), /***/ "./node_modules/es5-ext/object/assign/is-implemented.js": -/*!**************************************************************!* +/*!**************************************************************!*\ !*** ./node_modules/es5-ext/object/assign/is-implemented.js ***! \**************************************************************/ /***/ ((module) => { @@ -3706,7 +3683,7 @@ eval("\n\nmodule.exports = function () {\n\tvar assign = Object.assign, obj;\n\t /***/ }), /***/ "./node_modules/es5-ext/object/assign/shim.js": -/*!****************************************************!* +/*!****************************************************!*\ !*** ./node_modules/es5-ext/object/assign/shim.js ***! \****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -3717,7 +3694,7 @@ eval("\n\nvar keys = __webpack_require__(/*! ../keys */ \"./node_modules/es5-ex /***/ }), /***/ "./node_modules/es5-ext/object/copy.js": -/*!*********************************************!* +/*!*********************************************!*\ !*** ./node_modules/es5-ext/object/copy.js ***! \*********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -3728,7 +3705,7 @@ eval("\n\nvar aFrom = __webpack_require__(/*! ../array/from */ \"./node_modules /***/ }), /***/ "./node_modules/es5-ext/object/create.js": -/*!***********************************************!* +/*!***********************************************!*\ !*** ./node_modules/es5-ext/object/create.js ***! \***********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -3739,7 +3716,7 @@ eval("// Workaround for http://code.google.com/p/v8/issues/detail?id=2804\n\n\n\ /***/ }), /***/ "./node_modules/es5-ext/object/for-each.js": -/*!*************************************************!* +/*!*************************************************!*\ !*** ./node_modules/es5-ext/object/for-each.js ***! \*************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -3750,7 +3727,7 @@ eval("\n\nmodule.exports = __webpack_require__(/*! ./_iterate */ \"./node_module /***/ }), /***/ "./node_modules/es5-ext/object/is-object.js": -/*!**************************************************!* +/*!**************************************************!*\ !*** ./node_modules/es5-ext/object/is-object.js ***! \**************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -3761,7 +3738,7 @@ eval("\n\nvar isValue = __webpack_require__(/*! ./is-value */ \"./node_modules/e /***/ }), /***/ "./node_modules/es5-ext/object/is-value.js": -/*!*************************************************!* +/*!*************************************************!*\ !*** ./node_modules/es5-ext/object/is-value.js ***! \*************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -3772,7 +3749,7 @@ eval("\n\nvar _undefined = __webpack_require__(/*! ../function/noop */ \"./node_ /***/ }), /***/ "./node_modules/es5-ext/object/keys/index.js": -/*!***************************************************!* +/*!***************************************************!*\ !*** ./node_modules/es5-ext/object/keys/index.js ***! \***************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -3783,7 +3760,7 @@ eval("\n\nmodule.exports = __webpack_require__(/*! ./is-implemented */ \"./node_ /***/ }), /***/ "./node_modules/es5-ext/object/keys/is-implemented.js": -/*!************************************************************!* +/*!************************************************************!*\ !*** ./node_modules/es5-ext/object/keys/is-implemented.js ***! \************************************************************/ /***/ ((module) => { @@ -3794,7 +3771,7 @@ eval("\n\nmodule.exports = function () {\n\ttry {\n\t\tObject.keys(\"primitive\" /***/ }), /***/ "./node_modules/es5-ext/object/keys/shim.js": -/*!**************************************************!* +/*!**************************************************!*\ !*** ./node_modules/es5-ext/object/keys/shim.js ***! \**************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -3805,7 +3782,7 @@ eval("\n\nvar isValue = __webpack_require__(/*! ../is-value */ \"./node_modules/ /***/ }), /***/ "./node_modules/es5-ext/object/map.js": -/*!********************************************!* +/*!********************************************!*\ !*** ./node_modules/es5-ext/object/map.js ***! \********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -3816,7 +3793,7 @@ eval("\n\nvar callable = __webpack_require__(/*! ./valid-callable */ \"./node_mo /***/ }), /***/ "./node_modules/es5-ext/object/normalize-options.js": -/*!**********************************************************!* +/*!**********************************************************!*\ !*** ./node_modules/es5-ext/object/normalize-options.js ***! \**********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -3827,7 +3804,7 @@ eval("\n\nvar isValue = __webpack_require__(/*! ./is-value */ \"./node_modules/e /***/ }), /***/ "./node_modules/es5-ext/object/primitive-set.js": -/*!******************************************************!* +/*!******************************************************!*\ !*** ./node_modules/es5-ext/object/primitive-set.js ***! \******************************************************/ /***/ ((module) => { @@ -3838,7 +3815,7 @@ eval("\n\nvar forEach = Array.prototype.forEach, create = Object.create;\n\n// e /***/ }), /***/ "./node_modules/es5-ext/object/set-prototype-of/index.js": -/*!***************************************************************!* +/*!***************************************************************!*\ !*** ./node_modules/es5-ext/object/set-prototype-of/index.js ***! \***************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -3849,7 +3826,7 @@ eval("\n\nmodule.exports = __webpack_require__(/*! ./is-implemented */ \"./node_ /***/ }), /***/ "./node_modules/es5-ext/object/set-prototype-of/is-implemented.js": -/*!************************************************************************!* +/*!************************************************************************!*\ !*** ./node_modules/es5-ext/object/set-prototype-of/is-implemented.js ***! \************************************************************************/ /***/ ((module) => { @@ -3860,7 +3837,7 @@ eval("\n\nvar create = Object.create, getPrototypeOf = Object.getPrototypeOf, pl /***/ }), /***/ "./node_modules/es5-ext/object/set-prototype-of/shim.js": -/*!**************************************************************!* +/*!**************************************************************!*\ !*** ./node_modules/es5-ext/object/set-prototype-of/shim.js ***! \**************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -3871,7 +3848,7 @@ eval("/* eslint no-proto: \"off\" */\n\n// Big thanks to @WebReflection for sort /***/ }), /***/ "./node_modules/es5-ext/object/valid-callable.js": -/*!*******************************************************!* +/*!*******************************************************!*\ !*** ./node_modules/es5-ext/object/valid-callable.js ***! \*******************************************************/ /***/ ((module) => { @@ -3882,7 +3859,7 @@ eval("\n\nmodule.exports = function (fn) {\n\tif (typeof fn !== \"function\") th /***/ }), /***/ "./node_modules/es5-ext/object/valid-value.js": -/*!****************************************************!* +/*!****************************************************!*\ !*** ./node_modules/es5-ext/object/valid-value.js ***! \****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -3893,7 +3870,7 @@ eval("\n\nvar isValue = __webpack_require__(/*! ./is-value */ \"./node_modules/e /***/ }), /***/ "./node_modules/es5-ext/string/\u0000#/contains/index.js": -/*!**********************************************************!* +/*!**********************************************************!*\ !*** ./node_modules/es5-ext/string/#/contains/index.js ***! \**********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -3904,7 +3881,7 @@ eval("\n\nmodule.exports = __webpack_require__(/*! ./is-implemented */ \"./node_ /***/ }), /***/ "./node_modules/es5-ext/string/\u0000#/contains/is-implemented.js": -/*!*******************************************************************!* +/*!*******************************************************************!*\ !*** ./node_modules/es5-ext/string/#/contains/is-implemented.js ***! \*******************************************************************/ /***/ ((module) => { @@ -3915,7 +3892,7 @@ eval("\n\nvar str = \"razdwatrzy\";\n\nmodule.exports = function () {\n\tif (typ /***/ }), /***/ "./node_modules/es5-ext/string/\u0000#/contains/shim.js": -/*!*********************************************************!* +/*!*********************************************************!*\ !*** ./node_modules/es5-ext/string/#/contains/shim.js ***! \*********************************************************/ /***/ ((module) => { @@ -3926,7 +3903,7 @@ eval("\n\nvar indexOf = String.prototype.indexOf;\n\nmodule.exports = function ( /***/ }), /***/ "./node_modules/es5-ext/string/is-string.js": -/*!**************************************************!* +/*!**************************************************!*\ !*** ./node_modules/es5-ext/string/is-string.js ***! \**************************************************/ /***/ ((module) => { @@ -3937,7 +3914,7 @@ eval("\n\nvar objToString = Object.prototype.toString, id = objToString.call(\"\ /***/ }), /***/ "./node_modules/es6-iterator/array.js": -/*!********************************************!* +/*!********************************************!*\ !*** ./node_modules/es6-iterator/array.js ***! \********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -3948,7 +3925,7 @@ eval("\n\nvar setPrototypeOf = __webpack_require__(/*! es5-ext/object/set-protot /***/ }), /***/ "./node_modules/es6-iterator/for-of.js": -/*!*********************************************!* +/*!*********************************************!*\ !*** ./node_modules/es6-iterator/for-of.js ***! \*********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -3959,7 +3936,7 @@ eval("\n\nvar isArguments = __webpack_require__(/*! es5-ext/function/is-argument /***/ }), /***/ "./node_modules/es6-iterator/get.js": -/*!******************************************!* +/*!******************************************!*\ !*** ./node_modules/es6-iterator/get.js ***! \******************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -3970,7 +3947,7 @@ eval("\n\nvar isArguments = __webpack_require__(/*! es5-ext/function/is-argum /***/ }), /***/ "./node_modules/es6-iterator/index.js": -/*!********************************************!* +/*!********************************************!*\ !*** ./node_modules/es6-iterator/index.js ***! \********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -3981,7 +3958,7 @@ eval("\n\nvar clear = __webpack_require__(/*! es5-ext/array/#/clear */ \"./no /***/ }), /***/ "./node_modules/es6-iterator/is-iterable.js": -/*!**************************************************!* +/*!**************************************************!*\ !*** ./node_modules/es6-iterator/is-iterable.js ***! \**************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -3992,7 +3969,7 @@ eval("\n\nvar isArguments = __webpack_require__(/*! es5-ext/function/is-argument /***/ }), /***/ "./node_modules/es6-iterator/string.js": -/*!*********************************************!* +/*!*********************************************!*\ !*** ./node_modules/es6-iterator/string.js ***! \*********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -4003,7 +3980,7 @@ eval("// Thanks @mathiasbynens\n// http://mathiasbynens.be/notes/javascript-unic /***/ }), /***/ "./node_modules/es6-iterator/valid-iterable.js": -/*!*****************************************************!* +/*!*****************************************************!*\ !*** ./node_modules/es6-iterator/valid-iterable.js ***! \*****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -4014,7 +3991,7 @@ eval("\n\nvar isIterable = __webpack_require__(/*! ./is-iterable */ \"./node_mod /***/ }), /***/ "./node_modules/es6-map/index.js": -/*!***************************************!* +/*!***************************************!*\ !*** ./node_modules/es6-map/index.js ***! \***************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -4025,7 +4002,7 @@ eval("\n\nmodule.exports = __webpack_require__(/*! ./is-implemented */ \"./node_ /***/ }), /***/ "./node_modules/es6-map/is-implemented.js": -/*!************************************************!* +/*!************************************************!*\ !*** ./node_modules/es6-map/is-implemented.js ***! \************************************************/ /***/ ((module) => { @@ -4036,7 +4013,7 @@ eval("\n\nmodule.exports = function () {\n\tvar map, iterator, result;\n\tif (ty /***/ }), /***/ "./node_modules/es6-map/is-native-implemented.js": -/*!*******************************************************!* +/*!*******************************************************!*\ !*** ./node_modules/es6-map/is-native-implemented.js ***! \*******************************************************/ /***/ ((module) => { @@ -4047,7 +4024,7 @@ eval("// Exports true if environment provides native `Map` implementation,\n// w /***/ }), /***/ "./node_modules/es6-map/lib/iterator-kinds.js": -/*!****************************************************!* +/*!****************************************************!*\ !*** ./node_modules/es6-map/lib/iterator-kinds.js ***! \****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -4058,7 +4035,7 @@ eval("\n\nmodule.exports = __webpack_require__(/*! es5-ext/object/primitive-set /***/ }), /***/ "./node_modules/es6-map/lib/iterator.js": -/*!**********************************************!* +/*!**********************************************!*\ !*** ./node_modules/es6-map/lib/iterator.js ***! \**********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -4069,7 +4046,7 @@ eval("\n\nvar setPrototypeOf = __webpack_require__(/*! es5-ext/object/set-pro /***/ }), /***/ "./node_modules/es6-map/polyfill.js": -/*!******************************************!* +/*!******************************************!*\ !*** ./node_modules/es6-map/polyfill.js ***! \******************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -4080,7 +4057,7 @@ eval("\n\nvar clear = __webpack_require__(/*! es5-ext/array/#/clear */ /***/ }), /***/ "./node_modules/es6-promise/dist/es6-promise.js": -/*!******************************************************!* +/*!******************************************************!*\ !*** ./node_modules/es6-promise/dist/es6-promise.js ***! \******************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { @@ -4090,7 +4067,7 @@ eval("/*!\n * @overview es6-promise - a tiny implementation of Promises/A+.\n * /***/ }), /***/ "./node_modules/es6-symbol/index.js": -/*!******************************************!* +/*!******************************************!*\ !*** ./node_modules/es6-symbol/index.js ***! \******************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -4101,7 +4078,7 @@ eval("\n\nmodule.exports = __webpack_require__(/*! ./is-implemented */ \"./node_ /***/ }), /***/ "./node_modules/es6-symbol/is-implemented.js": -/*!***************************************************!* +/*!***************************************************!*\ !*** ./node_modules/es6-symbol/is-implemented.js ***! \***************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -4112,7 +4089,7 @@ eval("\n\nvar global = __webpack_require__(/*! ext/global-this */ \"./node_m /***/ }), /***/ "./node_modules/es6-symbol/is-symbol.js": -/*!**********************************************!* +/*!**********************************************!*\ !*** ./node_modules/es6-symbol/is-symbol.js ***! \**********************************************/ /***/ ((module) => { @@ -4123,7 +4100,7 @@ eval("\n\nmodule.exports = function (value) {\n\tif (!value) return false;\n\tif /***/ }), /***/ "./node_modules/es6-symbol/lib/private/generate-name.js": -/*!**************************************************************!* +/*!**************************************************************!*\ !*** ./node_modules/es6-symbol/lib/private/generate-name.js ***! \**************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -4134,7 +4111,7 @@ eval("\n\nvar d = __webpack_require__(/*! d */ \"./node_modules/d/index.js\");\n /***/ }), /***/ "./node_modules/es6-symbol/lib/private/setup/standard-symbols.js": -/*!***********************************************************************!* +/*!***********************************************************************!*\ !*** ./node_modules/es6-symbol/lib/private/setup/standard-symbols.js ***! \***********************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -4145,7 +4122,7 @@ eval("\n\nvar d = __webpack_require__(/*! d */ \"./node_modules/d/ind /***/ }), /***/ "./node_modules/es6-symbol/lib/private/setup/symbol-registry.js": -/*!**********************************************************************!* +/*!**********************************************************************!*\ !*** ./node_modules/es6-symbol/lib/private/setup/symbol-registry.js ***! \**********************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -4156,7 +4133,7 @@ eval("\n\nvar d = __webpack_require__(/*! d */ \"./node_modules/d/i /***/ }), /***/ "./node_modules/es6-symbol/polyfill.js": -/*!*********************************************!* +/*!*********************************************!*\ !*** ./node_modules/es6-symbol/polyfill.js ***! \*********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -4167,7 +4144,7 @@ eval("// ES2015 Symbol polyfill for environments that do not (or partially) supp /***/ }), /***/ "./node_modules/es6-symbol/validate-symbol.js": -/*!****************************************************!* +/*!****************************************************!*\ !*** ./node_modules/es6-symbol/validate-symbol.js ***! \****************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -4177,18 +4154,8 @@ eval("\n\nvar isSymbol = __webpack_require__(/*! ./is-symbol */ \"./node_modules /***/ }), -/***/ "./node_modules/esprima/dist/esprima.js": -/*!**********************************************!* - !*** ./node_modules/esprima/dist/esprima.js ***! - \**********************************************/ -/***/ (function(module) { - -eval("(function webpackUniversalModuleDefinition(root, factory) {\n/* istanbul ignore next */\n\tif(true)\n\t\tmodule.exports = factory();\n\telse {}\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n\n/******/ \t// The require function\n/******/ \tfunction __nested_webpack_require_583__(moduleId) {\n\n/******/ \t\t// Check if module is in cache\n/* istanbul ignore if */\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __nested_webpack_require_583__);\n\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n\n\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__nested_webpack_require_583__.m = modules;\n\n/******/ \t// expose the module cache\n/******/ \t__nested_webpack_require_583__.c = installedModules;\n\n/******/ \t// __webpack_public_path__\n/******/ \t__nested_webpack_require_583__.p = \"\";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __nested_webpack_require_583__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __nested_webpack_require_1808__) {\n\n\t\"use strict\";\n\t/*\n\t Copyright JS Foundation and other contributors, https://js.foundation/\n\n\t Redistribution and use in source and binary forms, with or without\n\t modification, are permitted provided that the following conditions are met:\n\n\t * Redistributions of source code must retain the above copyright\n\t notice, this list of conditions and the following disclaimer.\n\t * Redistributions in binary form must reproduce the above copyright\n\t notice, this list of conditions and the following disclaimer in the\n\t documentation and/or other materials provided with the distribution.\n\n\t THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n\t AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n\t IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n\t ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY\n\t DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n\t (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n\t LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n\t ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n\t (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n\t THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\t*/\n\tObject.defineProperty(exports, \"__esModule\", { value: true });\n\tvar comment_handler_1 = __nested_webpack_require_1808__(1);\n\tvar jsx_parser_1 = __nested_webpack_require_1808__(3);\n\tvar parser_1 = __nested_webpack_require_1808__(8);\n\tvar tokenizer_1 = __nested_webpack_require_1808__(15);\n\tfunction parse(code, options, delegate) {\n\t var commentHandler = null;\n\t var proxyDelegate = function (node, metadata) {\n\t if (delegate) {\n\t delegate(node, metadata);\n\t }\n\t if (commentHandler) {\n\t commentHandler.visit(node, metadata);\n\t }\n\t };\n\t var parserDelegate = (typeof delegate === 'function') ? proxyDelegate : null;\n\t var collectComment = false;\n\t if (options) {\n\t collectComment = (typeof options.comment === 'boolean' && options.comment);\n\t var attachComment = (typeof options.attachComment === 'boolean' && options.attachComment);\n\t if (collectComment || attachComment) {\n\t commentHandler = new comment_handler_1.CommentHandler();\n\t commentHandler.attach = attachComment;\n\t options.comment = true;\n\t parserDelegate = proxyDelegate;\n\t }\n\t }\n\t var isModule = false;\n\t if (options && typeof options.sourceType === 'string') {\n\t isModule = (options.sourceType === 'module');\n\t }\n\t var parser;\n\t if (options && typeof options.jsx === 'boolean' && options.jsx) {\n\t parser = new jsx_parser_1.JSXParser(code, options, parserDelegate);\n\t }\n\t else {\n\t parser = new parser_1.Parser(code, options, parserDelegate);\n\t }\n\t var program = isModule ? parser.parseModule() : parser.parseScript();\n\t var ast = program;\n\t if (collectComment && commentHandler) {\n\t ast.comments = commentHandler.comments;\n\t }\n\t if (parser.config.tokens) {\n\t ast.tokens = parser.tokens;\n\t }\n\t if (parser.config.tolerant) {\n\t ast.errors = parser.errorHandler.errors;\n\t }\n\t return ast;\n\t}\n\texports.parse = parse;\n\tfunction parseModule(code, options, delegate) {\n\t var parsingOptions = options || {};\n\t parsingOptions.sourceType = 'module';\n\t return parse(code, parsingOptions, delegate);\n\t}\n\texports.parseModule = parseModule;\n\tfunction parseScript(code, options, delegate) {\n\t var parsingOptions = options || {};\n\t parsingOptions.sourceType = 'script';\n\t return parse(code, parsingOptions, delegate);\n\t}\n\texports.parseScript = parseScript;\n\tfunction tokenize(code, options, delegate) {\n\t var tokenizer = new tokenizer_1.Tokenizer(code, options);\n\t var tokens;\n\t tokens = [];\n\t try {\n\t while (true) {\n\t var token = tokenizer.getNextToken();\n\t if (!token) {\n\t break;\n\t }\n\t if (delegate) {\n\t token = delegate(token);\n\t }\n\t tokens.push(token);\n\t }\n\t }\n\t catch (e) {\n\t tokenizer.errorHandler.tolerate(e);\n\t }\n\t if (tokenizer.errorHandler.tolerant) {\n\t tokens.errors = tokenizer.errors();\n\t }\n\t return tokens;\n\t}\n\texports.tokenize = tokenize;\n\tvar syntax_1 = __nested_webpack_require_1808__(2);\n\texports.Syntax = syntax_1.Syntax;\n\t// Sync with *.json manifests.\n\texports.version = '4.0.1';\n\n\n/***/ },\n/* 1 */\n/***/ function(module, exports, __nested_webpack_require_6456__) {\n\n\t\"use strict\";\n\tObject.defineProperty(exports, \"__esModule\", { value: true });\n\tvar syntax_1 = __nested_webpack_require_6456__(2);\n\tvar CommentHandler = (function () {\n\t function CommentHandler() {\n\t this.attach = false;\n\t this.comments = [];\n\t this.stack = [];\n\t this.leading = [];\n\t this.trailing = [];\n\t }\n\t CommentHandler.prototype.insertInnerComments = function (node, metadata) {\n\t // innnerComments for properties empty block\n\t // `function a() {/** comments **\\/}`\n\t if (node.type === syntax_1.Syntax.BlockStatement && node.body.length === 0) {\n\t var innerComments = [];\n\t for (var i = this.leading.length - 1; i >= 0; --i) {\n\t var entry = this.leading[i];\n\t if (metadata.end.offset >= entry.start) {\n\t innerComments.unshift(entry.comment);\n\t this.leading.splice(i, 1);\n\t this.trailing.splice(i, 1);\n\t }\n\t }\n\t if (innerComments.length) {\n\t node.innerComments = innerComments;\n\t }\n\t }\n\t };\n\t CommentHandler.prototype.findTrailingComments = function (metadata) {\n\t var trailingComments = [];\n\t if (this.trailing.length > 0) {\n\t for (var i = this.trailing.length - 1; i >= 0; --i) {\n\t var entry_1 = this.trailing[i];\n\t if (entry_1.start >= metadata.end.offset) {\n\t trailingComments.unshift(entry_1.comment);\n\t }\n\t }\n\t this.trailing.length = 0;\n\t return trailingComments;\n\t }\n\t var entry = this.stack[this.stack.length - 1];\n\t if (entry && entry.node.trailingComments) {\n\t var firstComment = entry.node.trailingComments[0];\n\t if (firstComment && firstComment.range[0] >= metadata.end.offset) {\n\t trailingComments = entry.node.trailingComments;\n\t delete entry.node.trailingComments;\n\t }\n\t }\n\t return trailingComments;\n\t };\n\t CommentHandler.prototype.findLeadingComments = function (metadata) {\n\t var leadingComments = [];\n\t var target;\n\t while (this.stack.length > 0) {\n\t var entry = this.stack[this.stack.length - 1];\n\t if (entry && entry.start >= metadata.start.offset) {\n\t target = entry.node;\n\t this.stack.pop();\n\t }\n\t else {\n\t break;\n\t }\n\t }\n\t if (target) {\n\t var count = target.leadingComments ? target.leadingComments.length : 0;\n\t for (var i = count - 1; i >= 0; --i) {\n\t var comment = target.leadingComments[i];\n\t if (comment.range[1] <= metadata.start.offset) {\n\t leadingComments.unshift(comment);\n\t target.leadingComments.splice(i, 1);\n\t }\n\t }\n\t if (target.leadingComments && target.leadingComments.length === 0) {\n\t delete target.leadingComments;\n\t }\n\t return leadingComments;\n\t }\n\t for (var i = this.leading.length - 1; i >= 0; --i) {\n\t var entry = this.leading[i];\n\t if (entry.start <= metadata.start.offset) {\n\t leadingComments.unshift(entry.comment);\n\t this.leading.splice(i, 1);\n\t }\n\t }\n\t return leadingComments;\n\t };\n\t CommentHandler.prototype.visitNode = function (node, metadata) {\n\t if (node.type === syntax_1.Syntax.Program && node.body.length > 0) {\n\t return;\n\t }\n\t this.insertInnerComments(node, metadata);\n\t var trailingComments = this.findTrailingComments(metadata);\n\t var leadingComments = this.findLeadingComments(metadata);\n\t if (leadingComments.length > 0) {\n\t node.leadingComments = leadingComments;\n\t }\n\t if (trailingComments.length > 0) {\n\t node.trailingComments = trailingComments;\n\t }\n\t this.stack.push({\n\t node: node,\n\t start: metadata.start.offset\n\t });\n\t };\n\t CommentHandler.prototype.visitComment = function (node, metadata) {\n\t var type = (node.type[0] === 'L') ? 'Line' : 'Block';\n\t var comment = {\n\t type: type,\n\t value: node.value\n\t };\n\t if (node.range) {\n\t comment.range = node.range;\n\t }\n\t if (node.loc) {\n\t comment.loc = node.loc;\n\t }\n\t this.comments.push(comment);\n\t if (this.attach) {\n\t var entry = {\n\t comment: {\n\t type: type,\n\t value: node.value,\n\t range: [metadata.start.offset, metadata.end.offset]\n\t },\n\t start: metadata.start.offset\n\t };\n\t if (node.loc) {\n\t entry.comment.loc = node.loc;\n\t }\n\t node.type = type;\n\t this.leading.push(entry);\n\t this.trailing.push(entry);\n\t }\n\t };\n\t CommentHandler.prototype.visit = function (node, metadata) {\n\t if (node.type === 'LineComment') {\n\t this.visitComment(node, metadata);\n\t }\n\t else if (node.type === 'BlockComment') {\n\t this.visitComment(node, metadata);\n\t }\n\t else if (this.attach) {\n\t this.visitNode(node, metadata);\n\t }\n\t };\n\t return CommentHandler;\n\t}());\n\texports.CommentHandler = CommentHandler;\n\n\n/***/ },\n/* 2 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\tObject.defineProperty(exports, \"__esModule\", { value: true });\n\texports.Syntax = {\n\t AssignmentExpression: 'AssignmentExpression',\n\t AssignmentPattern: 'AssignmentPattern',\n\t ArrayExpression: 'ArrayExpression',\n\t ArrayPattern: 'ArrayPattern',\n\t ArrowFunctionExpression: 'ArrowFunctionExpression',\n\t AwaitExpression: 'AwaitExpression',\n\t BlockStatement: 'BlockStatement',\n\t BinaryExpression: 'BinaryExpression',\n\t BreakStatement: 'BreakStatement',\n\t CallExpression: 'CallExpression',\n\t CatchClause: 'CatchClause',\n\t ClassBody: 'ClassBody',\n\t ClassDeclaration: 'ClassDeclaration',\n\t ClassExpression: 'ClassExpression',\n\t ConditionalExpression: 'ConditionalExpression',\n\t ContinueStatement: 'ContinueStatement',\n\t DoWhileStatement: 'DoWhileStatement',\n\t DebuggerStatement: 'DebuggerStatement',\n\t EmptyStatement: 'EmptyStatement',\n\t ExportAllDeclaration: 'ExportAllDeclaration',\n\t ExportDefaultDeclaration: 'ExportDefaultDeclaration',\n\t ExportNamedDeclaration: 'ExportNamedDeclaration',\n\t ExportSpecifier: 'ExportSpecifier',\n\t ExpressionStatement: 'ExpressionStatement',\n\t ForStatement: 'ForStatement',\n\t ForOfStatement: 'ForOfStatement',\n\t ForInStatement: 'ForInStatement',\n\t FunctionDeclaration: 'FunctionDeclaration',\n\t FunctionExpression: 'FunctionExpression',\n\t Identifier: 'Identifier',\n\t IfStatement: 'IfStatement',\n\t ImportDeclaration: 'ImportDeclaration',\n\t ImportDefaultSpecifier: 'ImportDefaultSpecifier',\n\t ImportNamespaceSpecifier: 'ImportNamespaceSpecifier',\n\t ImportSpecifier: 'ImportSpecifier',\n\t Literal: 'Literal',\n\t LabeledStatement: 'LabeledStatement',\n\t LogicalExpression: 'LogicalExpression',\n\t MemberExpression: 'MemberExpression',\n\t MetaProperty: 'MetaProperty',\n\t MethodDefinition: 'MethodDefinition',\n\t NewExpression: 'NewExpression',\n\t ObjectExpression: 'ObjectExpression',\n\t ObjectPattern: 'ObjectPattern',\n\t Program: 'Program',\n\t Property: 'Property',\n\t RestElement: 'RestElement',\n\t ReturnStatement: 'ReturnStatement',\n\t SequenceExpression: 'SequenceExpression',\n\t SpreadElement: 'SpreadElement',\n\t Super: 'Super',\n\t SwitchCase: 'SwitchCase',\n\t SwitchStatement: 'SwitchStatement',\n\t TaggedTemplateExpression: 'TaggedTemplateExpression',\n\t TemplateElement: 'TemplateElement',\n\t TemplateLiteral: 'TemplateLiteral',\n\t ThisExpression: 'ThisExpression',\n\t ThrowStatement: 'ThrowStatement',\n\t TryStatement: 'TryStatement',\n\t UnaryExpression: 'UnaryExpression',\n\t UpdateExpression: 'UpdateExpression',\n\t VariableDeclaration: 'VariableDeclaration',\n\t VariableDeclarator: 'VariableDeclarator',\n\t WhileStatement: 'WhileStatement',\n\t WithStatement: 'WithStatement',\n\t YieldExpression: 'YieldExpression'\n\t};\n\n\n/***/ },\n/* 3 */\n/***/ function(module, exports, __nested_webpack_require_15019__) {\n\n\t\"use strict\";\n/* istanbul ignore next */\n\tvar __extends = (this && this.__extends) || (function () {\n\t var extendStatics = Object.setPrototypeOf ||\n\t ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n\t function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n\t return function (d, b) {\n\t extendStatics(d, b);\n\t function __() { this.constructor = d; }\n\t d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n\t };\n\t})();\n\tObject.defineProperty(exports, \"__esModule\", { value: true });\n\tvar character_1 = __nested_webpack_require_15019__(4);\n\tvar JSXNode = __nested_webpack_require_15019__(5);\n\tvar jsx_syntax_1 = __nested_webpack_require_15019__(6);\n\tvar Node = __nested_webpack_require_15019__(7);\n\tvar parser_1 = __nested_webpack_require_15019__(8);\n\tvar token_1 = __nested_webpack_require_15019__(13);\n\tvar xhtml_entities_1 = __nested_webpack_require_15019__(14);\n\ttoken_1.TokenName[100 /* Identifier */] = 'JSXIdentifier';\n\ttoken_1.TokenName[101 /* Text */] = 'JSXText';\n\t// Fully qualified element name, e.g. returns \"svg:path\"\n\tfunction getQualifiedElementName(elementName) {\n\t var qualifiedName;\n\t switch (elementName.type) {\n\t case jsx_syntax_1.JSXSyntax.JSXIdentifier:\n\t var id = elementName;\n\t qualifiedName = id.name;\n\t break;\n\t case jsx_syntax_1.JSXSyntax.JSXNamespacedName:\n\t var ns = elementName;\n\t qualifiedName = getQualifiedElementName(ns.namespace) + ':' +\n\t getQualifiedElementName(ns.name);\n\t break;\n\t case jsx_syntax_1.JSXSyntax.JSXMemberExpression:\n\t var expr = elementName;\n\t qualifiedName = getQualifiedElementName(expr.object) + '.' +\n\t getQualifiedElementName(expr.property);\n\t break;\n\t /* istanbul ignore next */\n\t default:\n\t break;\n\t }\n\t return qualifiedName;\n\t}\n\tvar JSXParser = (function (_super) {\n\t __extends(JSXParser, _super);\n\t function JSXParser(code, options, delegate) {\n\t return _super.call(this, code, options, delegate) || this;\n\t }\n\t JSXParser.prototype.parsePrimaryExpression = function () {\n\t return this.match('<') ? this.parseJSXRoot() : _super.prototype.parsePrimaryExpression.call(this);\n\t };\n\t JSXParser.prototype.startJSX = function () {\n\t // Unwind the scanner before the lookahead token.\n\t this.scanner.index = this.startMarker.index;\n\t this.scanner.lineNumber = this.startMarker.line;\n\t this.scanner.lineStart = this.startMarker.index - this.startMarker.column;\n\t };\n\t JSXParser.prototype.finishJSX = function () {\n\t // Prime the next lookahead.\n\t this.nextToken();\n\t };\n\t JSXParser.prototype.reenterJSX = function () {\n\t this.startJSX();\n\t this.expectJSX('}');\n\t // Pop the closing '}' added from the lookahead.\n\t if (this.config.tokens) {\n\t this.tokens.pop();\n\t }\n\t };\n\t JSXParser.prototype.createJSXNode = function () {\n\t this.collectComments();\n\t return {\n\t index: this.scanner.index,\n\t line: this.scanner.lineNumber,\n\t column: this.scanner.index - this.scanner.lineStart\n\t };\n\t };\n\t JSXParser.prototype.createJSXChildNode = function () {\n\t return {\n\t index: this.scanner.index,\n\t line: this.scanner.lineNumber,\n\t column: this.scanner.index - this.scanner.lineStart\n\t };\n\t };\n\t JSXParser.prototype.scanXHTMLEntity = function (quote) {\n\t var result = '&';\n\t var valid = true;\n\t var terminated = false;\n\t var numeric = false;\n\t var hex = false;\n\t while (!this.scanner.eof() && valid && !terminated) {\n\t var ch = this.scanner.source[this.scanner.index];\n\t if (ch === quote) {\n\t break;\n\t }\n\t terminated = (ch === ';');\n\t result += ch;\n\t ++this.scanner.index;\n\t if (!terminated) {\n\t switch (result.length) {\n\t case 2:\n\t // e.g. '{'\n\t numeric = (ch === '#');\n\t break;\n\t case 3:\n\t if (numeric) {\n\t // e.g. 'A'\n\t hex = (ch === 'x');\n\t valid = hex || character_1.Character.isDecimalDigit(ch.charCodeAt(0));\n\t numeric = numeric && !hex;\n\t }\n\t break;\n\t default:\n\t valid = valid && !(numeric && !character_1.Character.isDecimalDigit(ch.charCodeAt(0)));\n\t valid = valid && !(hex && !character_1.Character.isHexDigit(ch.charCodeAt(0)));\n\t break;\n\t }\n\t }\n\t }\n\t if (valid && terminated && result.length > 2) {\n\t // e.g. 'A' becomes just '#x41'\n\t var str = result.substr(1, result.length - 2);\n\t if (numeric && str.length > 1) {\n\t result = String.fromCharCode(parseInt(str.substr(1), 10));\n\t }\n\t else if (hex && str.length > 2) {\n\t result = String.fromCharCode(parseInt('0' + str.substr(1), 16));\n\t }\n\t else if (!numeric && !hex && xhtml_entities_1.XHTMLEntities[str]) {\n\t result = xhtml_entities_1.XHTMLEntities[str];\n\t }\n\t }\n\t return result;\n\t };\n\t // Scan the next JSX token. This replaces Scanner#lex when in JSX mode.\n\t JSXParser.prototype.lexJSX = function () {\n\t var cp = this.scanner.source.charCodeAt(this.scanner.index);\n\t // < > / : = { }\n\t if (cp === 60 || cp === 62 || cp === 47 || cp === 58 || cp === 61 || cp === 123 || cp === 125) {\n\t var value = this.scanner.source[this.scanner.index++];\n\t return {\n\t type: 7 /* Punctuator */,\n\t value: value,\n\t lineNumber: this.scanner.lineNumber,\n\t lineStart: this.scanner.lineStart,\n\t start: this.scanner.index - 1,\n\t end: this.scanner.index\n\t };\n\t }\n\t // \" '\n\t if (cp === 34 || cp === 39) {\n\t var start = this.scanner.index;\n\t var quote = this.scanner.source[this.scanner.index++];\n\t var str = '';\n\t while (!this.scanner.eof()) {\n\t var ch = this.scanner.source[this.scanner.index++];\n\t if (ch === quote) {\n\t break;\n\t }\n\t else if (ch === '&') {\n\t str += this.scanXHTMLEntity(quote);\n\t }\n\t else {\n\t str += ch;\n\t }\n\t }\n\t return {\n\t type: 8 /* StringLiteral */,\n\t value: str,\n\t lineNumber: this.scanner.lineNumber,\n\t lineStart: this.scanner.lineStart,\n\t start: start,\n\t end: this.scanner.index\n\t };\n\t }\n\t // ... or .\n\t if (cp === 46) {\n\t var n1 = this.scanner.source.charCodeAt(this.scanner.index + 1);\n\t var n2 = this.scanner.source.charCodeAt(this.scanner.index + 2);\n\t var value = (n1 === 46 && n2 === 46) ? '...' : '.';\n\t var start = this.scanner.index;\n\t this.scanner.index += value.length;\n\t return {\n\t type: 7 /* Punctuator */,\n\t value: value,\n\t lineNumber: this.scanner.lineNumber,\n\t lineStart: this.scanner.lineStart,\n\t start: start,\n\t end: this.scanner.index\n\t };\n\t }\n\t // `\n\t if (cp === 96) {\n\t // Only placeholder, since it will be rescanned as a real assignment expression.\n\t return {\n\t type: 10 /* Template */,\n\t value: '',\n\t lineNumber: this.scanner.lineNumber,\n\t lineStart: this.scanner.lineStart,\n\t start: this.scanner.index,\n\t end: this.scanner.index\n\t };\n\t }\n\t // Identifer can not contain backslash (char code 92).\n\t if (character_1.Character.isIdentifierStart(cp) && (cp !== 92)) {\n\t var start = this.scanner.index;\n\t ++this.scanner.index;\n\t while (!this.scanner.eof()) {\n\t var ch = this.scanner.source.charCodeAt(this.scanner.index);\n\t if (character_1.Character.isIdentifierPart(ch) && (ch !== 92)) {\n\t ++this.scanner.index;\n\t }\n\t else if (ch === 45) {\n\t // Hyphen (char code 45) can be part of an identifier.\n\t ++this.scanner.index;\n\t }\n\t else {\n\t break;\n\t }\n\t }\n\t var id = this.scanner.source.slice(start, this.scanner.index);\n\t return {\n\t type: 100 /* Identifier */,\n\t value: id,\n\t lineNumber: this.scanner.lineNumber,\n\t lineStart: this.scanner.lineStart,\n\t start: start,\n\t end: this.scanner.index\n\t };\n\t }\n\t return this.scanner.lex();\n\t };\n\t JSXParser.prototype.nextJSXToken = function () {\n\t this.collectComments();\n\t this.startMarker.index = this.scanner.index;\n\t this.startMarker.line = this.scanner.lineNumber;\n\t this.startMarker.column = this.scanner.index - this.scanner.lineStart;\n\t var token = this.lexJSX();\n\t this.lastMarker.index = this.scanner.index;\n\t this.lastMarker.line = this.scanner.lineNumber;\n\t this.lastMarker.column = this.scanner.index - this.scanner.lineStart;\n\t if (this.config.tokens) {\n\t this.tokens.push(this.convertToken(token));\n\t }\n\t return token;\n\t };\n\t JSXParser.prototype.nextJSXText = function () {\n\t this.startMarker.index = this.scanner.index;\n\t this.startMarker.line = this.scanner.lineNumber;\n\t this.startMarker.column = this.scanner.index - this.scanner.lineStart;\n\t var start = this.scanner.index;\n\t var text = '';\n\t while (!this.scanner.eof()) {\n\t var ch = this.scanner.source[this.scanner.index];\n\t if (ch === '{' || ch === '<') {\n\t break;\n\t }\n\t ++this.scanner.index;\n\t text += ch;\n\t if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) {\n\t ++this.scanner.lineNumber;\n\t if (ch === '\\r' && this.scanner.source[this.scanner.index] === '\\n') {\n\t ++this.scanner.index;\n\t }\n\t this.scanner.lineStart = this.scanner.index;\n\t }\n\t }\n\t this.lastMarker.index = this.scanner.index;\n\t this.lastMarker.line = this.scanner.lineNumber;\n\t this.lastMarker.column = this.scanner.index - this.scanner.lineStart;\n\t var token = {\n\t type: 101 /* Text */,\n\t value: text,\n\t lineNumber: this.scanner.lineNumber,\n\t lineStart: this.scanner.lineStart,\n\t start: start,\n\t end: this.scanner.index\n\t };\n\t if ((text.length > 0) && this.config.tokens) {\n\t this.tokens.push(this.convertToken(token));\n\t }\n\t return token;\n\t };\n\t JSXParser.prototype.peekJSXToken = function () {\n\t var state = this.scanner.saveState();\n\t this.scanner.scanComments();\n\t var next = this.lexJSX();\n\t this.scanner.restoreState(state);\n\t return next;\n\t };\n\t // Expect the next JSX token to match the specified punctuator.\n\t // If not, an exception will be thrown.\n\t JSXParser.prototype.expectJSX = function (value) {\n\t var token = this.nextJSXToken();\n\t if (token.type !== 7 /* Punctuator */ || token.value !== value) {\n\t this.throwUnexpectedToken(token);\n\t }\n\t };\n\t // Return true if the next JSX token matches the specified punctuator.\n\t JSXParser.prototype.matchJSX = function (value) {\n\t var next = this.peekJSXToken();\n\t return next.type === 7 /* Punctuator */ && next.value === value;\n\t };\n\t JSXParser.prototype.parseJSXIdentifier = function () {\n\t var node = this.createJSXNode();\n\t var token = this.nextJSXToken();\n\t if (token.type !== 100 /* Identifier */) {\n\t this.throwUnexpectedToken(token);\n\t }\n\t return this.finalize(node, new JSXNode.JSXIdentifier(token.value));\n\t };\n\t JSXParser.prototype.parseJSXElementName = function () {\n\t var node = this.createJSXNode();\n\t var elementName = this.parseJSXIdentifier();\n\t if (this.matchJSX(':')) {\n\t var namespace = elementName;\n\t this.expectJSX(':');\n\t var name_1 = this.parseJSXIdentifier();\n\t elementName = this.finalize(node, new JSXNode.JSXNamespacedName(namespace, name_1));\n\t }\n\t else if (this.matchJSX('.')) {\n\t while (this.matchJSX('.')) {\n\t var object = elementName;\n\t this.expectJSX('.');\n\t var property = this.parseJSXIdentifier();\n\t elementName = this.finalize(node, new JSXNode.JSXMemberExpression(object, property));\n\t }\n\t }\n\t return elementName;\n\t };\n\t JSXParser.prototype.parseJSXAttributeName = function () {\n\t var node = this.createJSXNode();\n\t var attributeName;\n\t var identifier = this.parseJSXIdentifier();\n\t if (this.matchJSX(':')) {\n\t var namespace = identifier;\n\t this.expectJSX(':');\n\t var name_2 = this.parseJSXIdentifier();\n\t attributeName = this.finalize(node, new JSXNode.JSXNamespacedName(namespace, name_2));\n\t }\n\t else {\n\t attributeName = identifier;\n\t }\n\t return attributeName;\n\t };\n\t JSXParser.prototype.parseJSXStringLiteralAttribute = function () {\n\t var node = this.createJSXNode();\n\t var token = this.nextJSXToken();\n\t if (token.type !== 8 /* StringLiteral */) {\n\t this.throwUnexpectedToken(token);\n\t }\n\t var raw = this.getTokenRaw(token);\n\t return this.finalize(node, new Node.Literal(token.value, raw));\n\t };\n\t JSXParser.prototype.parseJSXExpressionAttribute = function () {\n\t var node = this.createJSXNode();\n\t this.expectJSX('{');\n\t this.finishJSX();\n\t if (this.match('}')) {\n\t this.tolerateError('JSX attributes must only be assigned a non-empty expression');\n\t }\n\t var expression = this.parseAssignmentExpression();\n\t this.reenterJSX();\n\t return this.finalize(node, new JSXNode.JSXExpressionContainer(expression));\n\t };\n\t JSXParser.prototype.parseJSXAttributeValue = function () {\n\t return this.matchJSX('{') ? this.parseJSXExpressionAttribute() :\n\t this.matchJSX('<') ? this.parseJSXElement() : this.parseJSXStringLiteralAttribute();\n\t };\n\t JSXParser.prototype.parseJSXNameValueAttribute = function () {\n\t var node = this.createJSXNode();\n\t var name = this.parseJSXAttributeName();\n\t var value = null;\n\t if (this.matchJSX('=')) {\n\t this.expectJSX('=');\n\t value = this.parseJSXAttributeValue();\n\t }\n\t return this.finalize(node, new JSXNode.JSXAttribute(name, value));\n\t };\n\t JSXParser.prototype.parseJSXSpreadAttribute = function () {\n\t var node = this.createJSXNode();\n\t this.expectJSX('{');\n\t this.expectJSX('...');\n\t this.finishJSX();\n\t var argument = this.parseAssignmentExpression();\n\t this.reenterJSX();\n\t return this.finalize(node, new JSXNode.JSXSpreadAttribute(argument));\n\t };\n\t JSXParser.prototype.parseJSXAttributes = function () {\n\t var attributes = [];\n\t while (!this.matchJSX('/') && !this.matchJSX('>')) {\n\t var attribute = this.matchJSX('{') ? this.parseJSXSpreadAttribute() :\n\t this.parseJSXNameValueAttribute();\n\t attributes.push(attribute);\n\t }\n\t return attributes;\n\t };\n\t JSXParser.prototype.parseJSXOpeningElement = function () {\n\t var node = this.createJSXNode();\n\t this.expectJSX('<');\n\t var name = this.parseJSXElementName();\n\t var attributes = this.parseJSXAttributes();\n\t var selfClosing = this.matchJSX('/');\n\t if (selfClosing) {\n\t this.expectJSX('/');\n\t }\n\t this.expectJSX('>');\n\t return this.finalize(node, new JSXNode.JSXOpeningElement(name, selfClosing, attributes));\n\t };\n\t JSXParser.prototype.parseJSXBoundaryElement = function () {\n\t var node = this.createJSXNode();\n\t this.expectJSX('<');\n\t if (this.matchJSX('/')) {\n\t this.expectJSX('/');\n\t var name_3 = this.parseJSXElementName();\n\t this.expectJSX('>');\n\t return this.finalize(node, new JSXNode.JSXClosingElement(name_3));\n\t }\n\t var name = this.parseJSXElementName();\n\t var attributes = this.parseJSXAttributes();\n\t var selfClosing = this.matchJSX('/');\n\t if (selfClosing) {\n\t this.expectJSX('/');\n\t }\n\t this.expectJSX('>');\n\t return this.finalize(node, new JSXNode.JSXOpeningElement(name, selfClosing, attributes));\n\t };\n\t JSXParser.prototype.parseJSXEmptyExpression = function () {\n\t var node = this.createJSXChildNode();\n\t this.collectComments();\n\t this.lastMarker.index = this.scanner.index;\n\t this.lastMarker.line = this.scanner.lineNumber;\n\t this.lastMarker.column = this.scanner.index - this.scanner.lineStart;\n\t return this.finalize(node, new JSXNode.JSXEmptyExpression());\n\t };\n\t JSXParser.prototype.parseJSXExpressionContainer = function () {\n\t var node = this.createJSXNode();\n\t this.expectJSX('{');\n\t var expression;\n\t if (this.matchJSX('}')) {\n\t expression = this.parseJSXEmptyExpression();\n\t this.expectJSX('}');\n\t }\n\t else {\n\t this.finishJSX();\n\t expression = this.parseAssignmentExpression();\n\t this.reenterJSX();\n\t }\n\t return this.finalize(node, new JSXNode.JSXExpressionContainer(expression));\n\t };\n\t JSXParser.prototype.parseJSXChildren = function () {\n\t var children = [];\n\t while (!this.scanner.eof()) {\n\t var node = this.createJSXChildNode();\n\t var token = this.nextJSXText();\n\t if (token.start < token.end) {\n\t var raw = this.getTokenRaw(token);\n\t var child = this.finalize(node, new JSXNode.JSXText(token.value, raw));\n\t children.push(child);\n\t }\n\t if (this.scanner.source[this.scanner.index] === '{') {\n\t var container = this.parseJSXExpressionContainer();\n\t children.push(container);\n\t }\n\t else {\n\t break;\n\t }\n\t }\n\t return children;\n\t };\n\t JSXParser.prototype.parseComplexJSXElement = function (el) {\n\t var stack = [];\n\t while (!this.scanner.eof()) {\n\t el.children = el.children.concat(this.parseJSXChildren());\n\t var node = this.createJSXChildNode();\n\t var element = this.parseJSXBoundaryElement();\n\t if (element.type === jsx_syntax_1.JSXSyntax.JSXOpeningElement) {\n\t var opening = element;\n\t if (opening.selfClosing) {\n\t var child = this.finalize(node, new JSXNode.JSXElement(opening, [], null));\n\t el.children.push(child);\n\t }\n\t else {\n\t stack.push(el);\n\t el = { node: node, opening: opening, closing: null, children: [] };\n\t }\n\t }\n\t if (element.type === jsx_syntax_1.JSXSyntax.JSXClosingElement) {\n\t el.closing = element;\n\t var open_1 = getQualifiedElementName(el.opening.name);\n\t var close_1 = getQualifiedElementName(el.closing.name);\n\t if (open_1 !== close_1) {\n\t this.tolerateError('Expected corresponding JSX closing tag for %0', open_1);\n\t }\n\t if (stack.length > 0) {\n\t var child = this.finalize(el.node, new JSXNode.JSXElement(el.opening, el.children, el.closing));\n\t el = stack[stack.length - 1];\n\t el.children.push(child);\n\t stack.pop();\n\t }\n\t else {\n\t break;\n\t }\n\t }\n\t }\n\t return el;\n\t };\n\t JSXParser.prototype.parseJSXElement = function () {\n\t var node = this.createJSXNode();\n\t var opening = this.parseJSXOpeningElement();\n\t var children = [];\n\t var closing = null;\n\t if (!opening.selfClosing) {\n\t var el = this.parseComplexJSXElement({ node: node, opening: opening, closing: closing, children: children });\n\t children = el.children;\n\t closing = el.closing;\n\t }\n\t return this.finalize(node, new JSXNode.JSXElement(opening, children, closing));\n\t };\n\t JSXParser.prototype.parseJSXRoot = function () {\n\t // Pop the opening '<' added from the lookahead.\n\t if (this.config.tokens) {\n\t this.tokens.pop();\n\t }\n\t this.startJSX();\n\t var element = this.parseJSXElement();\n\t this.finishJSX();\n\t return element;\n\t };\n\t JSXParser.prototype.isStartOfExpression = function () {\n\t return _super.prototype.isStartOfExpression.call(this) || this.match('<');\n\t };\n\t return JSXParser;\n\t}(parser_1.Parser));\n\texports.JSXParser = JSXParser;\n\n\n/***/ },\n/* 4 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\tObject.defineProperty(exports, \"__esModule\", { value: true });\n\t// See also tools/generate-unicode-regex.js.\n\tvar Regex = {\n\t // Unicode v8.0.0 NonAsciiIdentifierStart:\n\t NonAsciiIdentifierStart: /[\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0-\\u08B4\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2118-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u309B-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6EF\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AD\\uA7B0-\\uA7B7\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]|\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDD40-\\uDD74\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDF00-\\uDF1F\\uDF30-\\uDF4A\\uDF50-\\uDF75\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF\\uDFD1-\\uDFD5]|\\uD801[\\uDC00-\\uDC9D\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00\\uDE10-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2]|\\uD804[\\uDC03-\\uDC37\\uDC83-\\uDCAF\\uDCD0-\\uDCE8\\uDD03-\\uDD26\\uDD50-\\uDD72\\uDD76\\uDD83-\\uDDB2\\uDDC1-\\uDDC4\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE2B\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEDE\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D\\uDF50\\uDF5D-\\uDF61]|\\uD805[\\uDC80-\\uDCAF\\uDCC4\\uDCC5\\uDCC7\\uDD80-\\uDDAE\\uDDD8-\\uDDDB\\uDE00-\\uDE2F\\uDE44\\uDE80-\\uDEAA\\uDF00-\\uDF19]|\\uD806[\\uDCA0-\\uDCDF\\uDCFF\\uDEC0-\\uDEF8]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC00-\\uDC6E\\uDC80-\\uDD43]|[\\uD80C\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDED0-\\uDEED\\uDF00-\\uDF2F\\uDF40-\\uDF43\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50\\uDF93-\\uDF9F]|\\uD82C[\\uDC00\\uDC01]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB]|\\uD83A[\\uDC00-\\uDCC4]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1]|\\uD87E[\\uDC00-\\uDE1D]/,\n\t // Unicode v8.0.0 NonAsciiIdentifierPart:\n\t NonAsciiIdentifierPart: /[\\xAA\\xB5\\xB7\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0300-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u0483-\\u0487\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0610-\\u061A\\u0620-\\u0669\\u066E-\\u06D3\\u06D5-\\u06DC\\u06DF-\\u06E8\\u06EA-\\u06FC\\u06FF\\u0710-\\u074A\\u074D-\\u07B1\\u07C0-\\u07F5\\u07FA\\u0800-\\u082D\\u0840-\\u085B\\u08A0-\\u08B4\\u08E3-\\u0963\\u0966-\\u096F\\u0971-\\u0983\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BC-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CE\\u09D7\\u09DC\\u09DD\\u09DF-\\u09E3\\u09E6-\\u09F1\\u0A01-\\u0A03\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A59-\\u0A5C\\u0A5E\\u0A66-\\u0A75\\u0A81-\\u0A83\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABC-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AD0\\u0AE0-\\u0AE3\\u0AE6-\\u0AEF\\u0AF9\\u0B01-\\u0B03\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3C-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B5C\\u0B5D\\u0B5F-\\u0B63\\u0B66-\\u0B6F\\u0B71\\u0B82\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD0\\u0BD7\\u0BE6-\\u0BEF\\u0C00-\\u0C03\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C58-\\u0C5A\\u0C60-\\u0C63\\u0C66-\\u0C6F\\u0C81-\\u0C83\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBC-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CDE\\u0CE0-\\u0CE3\\u0CE6-\\u0CEF\\u0CF1\\u0CF2\\u0D01-\\u0D03\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4E\\u0D57\\u0D5F-\\u0D63\\u0D66-\\u0D6F\\u0D7A-\\u0D7F\\u0D82\\u0D83\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DE6-\\u0DEF\\u0DF2\\u0DF3\\u0E01-\\u0E3A\\u0E40-\\u0E4E\\u0E50-\\u0E59\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB9\\u0EBB-\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EC8-\\u0ECD\\u0ED0-\\u0ED9\\u0EDC-\\u0EDF\\u0F00\\u0F18\\u0F19\\u0F20-\\u0F29\\u0F35\\u0F37\\u0F39\\u0F3E-\\u0F47\\u0F49-\\u0F6C\\u0F71-\\u0F84\\u0F86-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u1000-\\u1049\\u1050-\\u109D\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u135D-\\u135F\\u1369-\\u1371\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1714\\u1720-\\u1734\\u1740-\\u1753\\u1760-\\u176C\\u176E-\\u1770\\u1772\\u1773\\u1780-\\u17D3\\u17D7\\u17DC\\u17DD\\u17E0-\\u17E9\\u180B-\\u180D\\u1810-\\u1819\\u1820-\\u1877\\u1880-\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1920-\\u192B\\u1930-\\u193B\\u1946-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u19D0-\\u19DA\\u1A00-\\u1A1B\\u1A20-\\u1A5E\\u1A60-\\u1A7C\\u1A7F-\\u1A89\\u1A90-\\u1A99\\u1AA7\\u1AB0-\\u1ABD\\u1B00-\\u1B4B\\u1B50-\\u1B59\\u1B6B-\\u1B73\\u1B80-\\u1BF3\\u1C00-\\u1C37\\u1C40-\\u1C49\\u1C4D-\\u1C7D\\u1CD0-\\u1CD2\\u1CD4-\\u1CF6\\u1CF8\\u1CF9\\u1D00-\\u1DF5\\u1DFC-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u200C\\u200D\\u203F\\u2040\\u2054\\u2071\\u207F\\u2090-\\u209C\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2118-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D7F-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2DE0-\\u2DFF\\u3005-\\u3007\\u3021-\\u302F\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u3099-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA62B\\uA640-\\uA66F\\uA674-\\uA67D\\uA67F-\\uA6F1\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AD\\uA7B0-\\uA7B7\\uA7F7-\\uA827\\uA840-\\uA873\\uA880-\\uA8C4\\uA8D0-\\uA8D9\\uA8E0-\\uA8F7\\uA8FB\\uA8FD\\uA900-\\uA92D\\uA930-\\uA953\\uA960-\\uA97C\\uA980-\\uA9C0\\uA9CF-\\uA9D9\\uA9E0-\\uA9FE\\uAA00-\\uAA36\\uAA40-\\uAA4D\\uAA50-\\uAA59\\uAA60-\\uAA76\\uAA7A-\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEF\\uAAF2-\\uAAF6\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABEA\\uABEC\\uABED\\uABF0-\\uABF9\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE00-\\uFE0F\\uFE20-\\uFE2F\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF10-\\uFF19\\uFF21-\\uFF3A\\uFF3F\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]|\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDD40-\\uDD74\\uDDFD\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDEE0\\uDF00-\\uDF1F\\uDF30-\\uDF4A\\uDF50-\\uDF7A\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF\\uDFD1-\\uDFD5]|\\uD801[\\uDC00-\\uDC9D\\uDCA0-\\uDCA9\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE38-\\uDE3A\\uDE3F\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE6\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2]|\\uD804[\\uDC00-\\uDC46\\uDC66-\\uDC6F\\uDC7F-\\uDCBA\\uDCD0-\\uDCE8\\uDCF0-\\uDCF9\\uDD00-\\uDD34\\uDD36-\\uDD3F\\uDD50-\\uDD73\\uDD76\\uDD80-\\uDDC4\\uDDCA-\\uDDCC\\uDDD0-\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE37\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEEA\\uDEF0-\\uDEF9\\uDF00-\\uDF03\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3C-\\uDF44\\uDF47\\uDF48\\uDF4B-\\uDF4D\\uDF50\\uDF57\\uDF5D-\\uDF63\\uDF66-\\uDF6C\\uDF70-\\uDF74]|\\uD805[\\uDC80-\\uDCC5\\uDCC7\\uDCD0-\\uDCD9\\uDD80-\\uDDB5\\uDDB8-\\uDDC0\\uDDD8-\\uDDDD\\uDE00-\\uDE40\\uDE44\\uDE50-\\uDE59\\uDE80-\\uDEB7\\uDEC0-\\uDEC9\\uDF00-\\uDF19\\uDF1D-\\uDF2B\\uDF30-\\uDF39]|\\uD806[\\uDCA0-\\uDCE9\\uDCFF\\uDEC0-\\uDEF8]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC00-\\uDC6E\\uDC80-\\uDD43]|[\\uD80C\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDE60-\\uDE69\\uDED0-\\uDEED\\uDEF0-\\uDEF4\\uDF00-\\uDF36\\uDF40-\\uDF43\\uDF50-\\uDF59\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50-\\uDF7E\\uDF8F-\\uDF9F]|\\uD82C[\\uDC00\\uDC01]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99\\uDC9D\\uDC9E]|\\uD834[\\uDD65-\\uDD69\\uDD6D-\\uDD72\\uDD7B-\\uDD82\\uDD85-\\uDD8B\\uDDAA-\\uDDAD\\uDE42-\\uDE44]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB\\uDFCE-\\uDFFF]|\\uD836[\\uDE00-\\uDE36\\uDE3B-\\uDE6C\\uDE75\\uDE84\\uDE9B-\\uDE9F\\uDEA1-\\uDEAF]|\\uD83A[\\uDC00-\\uDCC4\\uDCD0-\\uDCD6]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1]|\\uD87E[\\uDC00-\\uDE1D]|\\uDB40[\\uDD00-\\uDDEF]/\n\t};\n\texports.Character = {\n\t /* tslint:disable:no-bitwise */\n\t fromCodePoint: function (cp) {\n\t return (cp < 0x10000) ? String.fromCharCode(cp) :\n\t String.fromCharCode(0xD800 + ((cp - 0x10000) >> 10)) +\n\t String.fromCharCode(0xDC00 + ((cp - 0x10000) & 1023));\n\t },\n\t // https://tc39.github.io/ecma262/#sec-white-space\n\t isWhiteSpace: function (cp) {\n\t return (cp === 0x20) || (cp === 0x09) || (cp === 0x0B) || (cp === 0x0C) || (cp === 0xA0) ||\n\t (cp >= 0x1680 && [0x1680, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x202F, 0x205F, 0x3000, 0xFEFF].indexOf(cp) >= 0);\n\t },\n\t // https://tc39.github.io/ecma262/#sec-line-terminators\n\t isLineTerminator: function (cp) {\n\t return (cp === 0x0A) || (cp === 0x0D) || (cp === 0x2028) || (cp === 0x2029);\n\t },\n\t // https://tc39.github.io/ecma262/#sec-names-and-keywords\n\t isIdentifierStart: function (cp) {\n\t return (cp === 0x24) || (cp === 0x5F) ||\n\t (cp >= 0x41 && cp <= 0x5A) ||\n\t (cp >= 0x61 && cp <= 0x7A) ||\n\t (cp === 0x5C) ||\n\t ((cp >= 0x80) && Regex.NonAsciiIdentifierStart.test(exports.Character.fromCodePoint(cp)));\n\t },\n\t isIdentifierPart: function (cp) {\n\t return (cp === 0x24) || (cp === 0x5F) ||\n\t (cp >= 0x41 && cp <= 0x5A) ||\n\t (cp >= 0x61 && cp <= 0x7A) ||\n\t (cp >= 0x30 && cp <= 0x39) ||\n\t (cp === 0x5C) ||\n\t ((cp >= 0x80) && Regex.NonAsciiIdentifierPart.test(exports.Character.fromCodePoint(cp)));\n\t },\n\t // https://tc39.github.io/ecma262/#sec-literals-numeric-literals\n\t isDecimalDigit: function (cp) {\n\t return (cp >= 0x30 && cp <= 0x39); // 0..9\n\t },\n\t isHexDigit: function (cp) {\n\t return (cp >= 0x30 && cp <= 0x39) ||\n\t (cp >= 0x41 && cp <= 0x46) ||\n\t (cp >= 0x61 && cp <= 0x66); // a..f\n\t },\n\t isOctalDigit: function (cp) {\n\t return (cp >= 0x30 && cp <= 0x37); // 0..7\n\t }\n\t};\n\n\n/***/ },\n/* 5 */\n/***/ function(module, exports, __nested_webpack_require_54354__) {\n\n\t\"use strict\";\n\tObject.defineProperty(exports, \"__esModule\", { value: true });\n\tvar jsx_syntax_1 = __nested_webpack_require_54354__(6);\n\t/* tslint:disable:max-classes-per-file */\n\tvar JSXClosingElement = (function () {\n\t function JSXClosingElement(name) {\n\t this.type = jsx_syntax_1.JSXSyntax.JSXClosingElement;\n\t this.name = name;\n\t }\n\t return JSXClosingElement;\n\t}());\n\texports.JSXClosingElement = JSXClosingElement;\n\tvar JSXElement = (function () {\n\t function JSXElement(openingElement, children, closingElement) {\n\t this.type = jsx_syntax_1.JSXSyntax.JSXElement;\n\t this.openingElement = openingElement;\n\t this.children = children;\n\t this.closingElement = closingElement;\n\t }\n\t return JSXElement;\n\t}());\n\texports.JSXElement = JSXElement;\n\tvar JSXEmptyExpression = (function () {\n\t function JSXEmptyExpression() {\n\t this.type = jsx_syntax_1.JSXSyntax.JSXEmptyExpression;\n\t }\n\t return JSXEmptyExpression;\n\t}());\n\texports.JSXEmptyExpression = JSXEmptyExpression;\n\tvar JSXExpressionContainer = (function () {\n\t function JSXExpressionContainer(expression) {\n\t this.type = jsx_syntax_1.JSXSyntax.JSXExpressionContainer;\n\t this.expression = expression;\n\t }\n\t return JSXExpressionContainer;\n\t}());\n\texports.JSXExpressionContainer = JSXExpressionContainer;\n\tvar JSXIdentifier = (function () {\n\t function JSXIdentifier(name) {\n\t this.type = jsx_syntax_1.JSXSyntax.JSXIdentifier;\n\t this.name = name;\n\t }\n\t return JSXIdentifier;\n\t}());\n\texports.JSXIdentifier = JSXIdentifier;\n\tvar JSXMemberExpression = (function () {\n\t function JSXMemberExpression(object, property) {\n\t this.type = jsx_syntax_1.JSXSyntax.JSXMemberExpression;\n\t this.object = object;\n\t this.property = property;\n\t }\n\t return JSXMemberExpression;\n\t}());\n\texports.JSXMemberExpression = JSXMemberExpression;\n\tvar JSXAttribute = (function () {\n\t function JSXAttribute(name, value) {\n\t this.type = jsx_syntax_1.JSXSyntax.JSXAttribute;\n\t this.name = name;\n\t this.value = value;\n\t }\n\t return JSXAttribute;\n\t}());\n\texports.JSXAttribute = JSXAttribute;\n\tvar JSXNamespacedName = (function () {\n\t function JSXNamespacedName(namespace, name) {\n\t this.type = jsx_syntax_1.JSXSyntax.JSXNamespacedName;\n\t this.namespace = namespace;\n\t this.name = name;\n\t }\n\t return JSXNamespacedName;\n\t}());\n\texports.JSXNamespacedName = JSXNamespacedName;\n\tvar JSXOpeningElement = (function () {\n\t function JSXOpeningElement(name, selfClosing, attributes) {\n\t this.type = jsx_syntax_1.JSXSyntax.JSXOpeningElement;\n\t this.name = name;\n\t this.selfClosing = selfClosing;\n\t this.attributes = attributes;\n\t }\n\t return JSXOpeningElement;\n\t}());\n\texports.JSXOpeningElement = JSXOpeningElement;\n\tvar JSXSpreadAttribute = (function () {\n\t function JSXSpreadAttribute(argument) {\n\t this.type = jsx_syntax_1.JSXSyntax.JSXSpreadAttribute;\n\t this.argument = argument;\n\t }\n\t return JSXSpreadAttribute;\n\t}());\n\texports.JSXSpreadAttribute = JSXSpreadAttribute;\n\tvar JSXText = (function () {\n\t function JSXText(value, raw) {\n\t this.type = jsx_syntax_1.JSXSyntax.JSXText;\n\t this.value = value;\n\t this.raw = raw;\n\t }\n\t return JSXText;\n\t}());\n\texports.JSXText = JSXText;\n\n\n/***/ },\n/* 6 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\tObject.defineProperty(exports, \"__esModule\", { value: true });\n\texports.JSXSyntax = {\n\t JSXAttribute: 'JSXAttribute',\n\t JSXClosingElement: 'JSXClosingElement',\n\t JSXElement: 'JSXElement',\n\t JSXEmptyExpression: 'JSXEmptyExpression',\n\t JSXExpressionContainer: 'JSXExpressionContainer',\n\t JSXIdentifier: 'JSXIdentifier',\n\t JSXMemberExpression: 'JSXMemberExpression',\n\t JSXNamespacedName: 'JSXNamespacedName',\n\t JSXOpeningElement: 'JSXOpeningElement',\n\t JSXSpreadAttribute: 'JSXSpreadAttribute',\n\t JSXText: 'JSXText'\n\t};\n\n\n/***/ },\n/* 7 */\n/***/ function(module, exports, __nested_webpack_require_58416__) {\n\n\t\"use strict\";\n\tObject.defineProperty(exports, \"__esModule\", { value: true });\n\tvar syntax_1 = __nested_webpack_require_58416__(2);\n\t/* tslint:disable:max-classes-per-file */\n\tvar ArrayExpression = (function () {\n\t function ArrayExpression(elements) {\n\t this.type = syntax_1.Syntax.ArrayExpression;\n\t this.elements = elements;\n\t }\n\t return ArrayExpression;\n\t}());\n\texports.ArrayExpression = ArrayExpression;\n\tvar ArrayPattern = (function () {\n\t function ArrayPattern(elements) {\n\t this.type = syntax_1.Syntax.ArrayPattern;\n\t this.elements = elements;\n\t }\n\t return ArrayPattern;\n\t}());\n\texports.ArrayPattern = ArrayPattern;\n\tvar ArrowFunctionExpression = (function () {\n\t function ArrowFunctionExpression(params, body, expression) {\n\t this.type = syntax_1.Syntax.ArrowFunctionExpression;\n\t this.id = null;\n\t this.params = params;\n\t this.body = body;\n\t this.generator = false;\n\t this.expression = expression;\n\t this.async = false;\n\t }\n\t return ArrowFunctionExpression;\n\t}());\n\texports.ArrowFunctionExpression = ArrowFunctionExpression;\n\tvar AssignmentExpression = (function () {\n\t function AssignmentExpression(operator, left, right) {\n\t this.type = syntax_1.Syntax.AssignmentExpression;\n\t this.operator = operator;\n\t this.left = left;\n\t this.right = right;\n\t }\n\t return AssignmentExpression;\n\t}());\n\texports.AssignmentExpression = AssignmentExpression;\n\tvar AssignmentPattern = (function () {\n\t function AssignmentPattern(left, right) {\n\t this.type = syntax_1.Syntax.AssignmentPattern;\n\t this.left = left;\n\t this.right = right;\n\t }\n\t return AssignmentPattern;\n\t}());\n\texports.AssignmentPattern = AssignmentPattern;\n\tvar AsyncArrowFunctionExpression = (function () {\n\t function AsyncArrowFunctionExpression(params, body, expression) {\n\t this.type = syntax_1.Syntax.ArrowFunctionExpression;\n\t this.id = null;\n\t this.params = params;\n\t this.body = body;\n\t this.generator = false;\n\t this.expression = expression;\n\t this.async = true;\n\t }\n\t return AsyncArrowFunctionExpression;\n\t}());\n\texports.AsyncArrowFunctionExpression = AsyncArrowFunctionExpression;\n\tvar AsyncFunctionDeclaration = (function () {\n\t function AsyncFunctionDeclaration(id, params, body) {\n\t this.type = syntax_1.Syntax.FunctionDeclaration;\n\t this.id = id;\n\t this.params = params;\n\t this.body = body;\n\t this.generator = false;\n\t this.expression = false;\n\t this.async = true;\n\t }\n\t return AsyncFunctionDeclaration;\n\t}());\n\texports.AsyncFunctionDeclaration = AsyncFunctionDeclaration;\n\tvar AsyncFunctionExpression = (function () {\n\t function AsyncFunctionExpression(id, params, body) {\n\t this.type = syntax_1.Syntax.FunctionExpression;\n\t this.id = id;\n\t this.params = params;\n\t this.body = body;\n\t this.generator = false;\n\t this.expression = false;\n\t this.async = true;\n\t }\n\t return AsyncFunctionExpression;\n\t}());\n\texports.AsyncFunctionExpression = AsyncFunctionExpression;\n\tvar AwaitExpression = (function () {\n\t function AwaitExpression(argument) {\n\t this.type = syntax_1.Syntax.AwaitExpression;\n\t this.argument = argument;\n\t }\n\t return AwaitExpression;\n\t}());\n\texports.AwaitExpression = AwaitExpression;\n\tvar BinaryExpression = (function () {\n\t function BinaryExpression(operator, left, right) {\n\t var logical = (operator === '||' || operator === '&&');\n\t this.type = logical ? syntax_1.Syntax.LogicalExpression : syntax_1.Syntax.BinaryExpression;\n\t this.operator = operator;\n\t this.left = left;\n\t this.right = right;\n\t }\n\t return BinaryExpression;\n\t}());\n\texports.BinaryExpression = BinaryExpression;\n\tvar BlockStatement = (function () {\n\t function BlockStatement(body) {\n\t this.type = syntax_1.Syntax.BlockStatement;\n\t this.body = body;\n\t }\n\t return BlockStatement;\n\t}());\n\texports.BlockStatement = BlockStatement;\n\tvar BreakStatement = (function () {\n\t function BreakStatement(label) {\n\t this.type = syntax_1.Syntax.BreakStatement;\n\t this.label = label;\n\t }\n\t return BreakStatement;\n\t}());\n\texports.BreakStatement = BreakStatement;\n\tvar CallExpression = (function () {\n\t function CallExpression(callee, args) {\n\t this.type = syntax_1.Syntax.CallExpression;\n\t this.callee = callee;\n\t this.arguments = args;\n\t }\n\t return CallExpression;\n\t}());\n\texports.CallExpression = CallExpression;\n\tvar CatchClause = (function () {\n\t function CatchClause(param, body) {\n\t this.type = syntax_1.Syntax.CatchClause;\n\t this.param = param;\n\t this.body = body;\n\t }\n\t return CatchClause;\n\t}());\n\texports.CatchClause = CatchClause;\n\tvar ClassBody = (function () {\n\t function ClassBody(body) {\n\t this.type = syntax_1.Syntax.ClassBody;\n\t this.body = body;\n\t }\n\t return ClassBody;\n\t}());\n\texports.ClassBody = ClassBody;\n\tvar ClassDeclaration = (function () {\n\t function ClassDeclaration(id, superClass, body) {\n\t this.type = syntax_1.Syntax.ClassDeclaration;\n\t this.id = id;\n\t this.superClass = superClass;\n\t this.body = body;\n\t }\n\t return ClassDeclaration;\n\t}());\n\texports.ClassDeclaration = ClassDeclaration;\n\tvar ClassExpression = (function () {\n\t function ClassExpression(id, superClass, body) {\n\t this.type = syntax_1.Syntax.ClassExpression;\n\t this.id = id;\n\t this.superClass = superClass;\n\t this.body = body;\n\t }\n\t return ClassExpression;\n\t}());\n\texports.ClassExpression = ClassExpression;\n\tvar ComputedMemberExpression = (function () {\n\t function ComputedMemberExpression(object, property) {\n\t this.type = syntax_1.Syntax.MemberExpression;\n\t this.computed = true;\n\t this.object = object;\n\t this.property = property;\n\t }\n\t return ComputedMemberExpression;\n\t}());\n\texports.ComputedMemberExpression = ComputedMemberExpression;\n\tvar ConditionalExpression = (function () {\n\t function ConditionalExpression(test, consequent, alternate) {\n\t this.type = syntax_1.Syntax.ConditionalExpression;\n\t this.test = test;\n\t this.consequent = consequent;\n\t this.alternate = alternate;\n\t }\n\t return ConditionalExpression;\n\t}());\n\texports.ConditionalExpression = ConditionalExpression;\n\tvar ContinueStatement = (function () {\n\t function ContinueStatement(label) {\n\t this.type = syntax_1.Syntax.ContinueStatement;\n\t this.label = label;\n\t }\n\t return ContinueStatement;\n\t}());\n\texports.ContinueStatement = ContinueStatement;\n\tvar DebuggerStatement = (function () {\n\t function DebuggerStatement() {\n\t this.type = syntax_1.Syntax.DebuggerStatement;\n\t }\n\t return DebuggerStatement;\n\t}());\n\texports.DebuggerStatement = DebuggerStatement;\n\tvar Directive = (function () {\n\t function Directive(expression, directive) {\n\t this.type = syntax_1.Syntax.ExpressionStatement;\n\t this.expression = expression;\n\t this.directive = directive;\n\t }\n\t return Directive;\n\t}());\n\texports.Directive = Directive;\n\tvar DoWhileStatement = (function () {\n\t function DoWhileStatement(body, test) {\n\t this.type = syntax_1.Syntax.DoWhileStatement;\n\t this.body = body;\n\t this.test = test;\n\t }\n\t return DoWhileStatement;\n\t}());\n\texports.DoWhileStatement = DoWhileStatement;\n\tvar EmptyStatement = (function () {\n\t function EmptyStatement() {\n\t this.type = syntax_1.Syntax.EmptyStatement;\n\t }\n\t return EmptyStatement;\n\t}());\n\texports.EmptyStatement = EmptyStatement;\n\tvar ExportAllDeclaration = (function () {\n\t function ExportAllDeclaration(source) {\n\t this.type = syntax_1.Syntax.ExportAllDeclaration;\n\t this.source = source;\n\t }\n\t return ExportAllDeclaration;\n\t}());\n\texports.ExportAllDeclaration = ExportAllDeclaration;\n\tvar ExportDefaultDeclaration = (function () {\n\t function ExportDefaultDeclaration(declaration) {\n\t this.type = syntax_1.Syntax.ExportDefaultDeclaration;\n\t this.declaration = declaration;\n\t }\n\t return ExportDefaultDeclaration;\n\t}());\n\texports.ExportDefaultDeclaration = ExportDefaultDeclaration;\n\tvar ExportNamedDeclaration = (function () {\n\t function ExportNamedDeclaration(declaration, specifiers, source) {\n\t this.type = syntax_1.Syntax.ExportNamedDeclaration;\n\t this.declaration = declaration;\n\t this.specifiers = specifiers;\n\t this.source = source;\n\t }\n\t return ExportNamedDeclaration;\n\t}());\n\texports.ExportNamedDeclaration = ExportNamedDeclaration;\n\tvar ExportSpecifier = (function () {\n\t function ExportSpecifier(local, exported) {\n\t this.type = syntax_1.Syntax.ExportSpecifier;\n\t this.exported = exported;\n\t this.local = local;\n\t }\n\t return ExportSpecifier;\n\t}());\n\texports.ExportSpecifier = ExportSpecifier;\n\tvar ExpressionStatement = (function () {\n\t function ExpressionStatement(expression) {\n\t this.type = syntax_1.Syntax.ExpressionStatement;\n\t this.expression = expression;\n\t }\n\t return ExpressionStatement;\n\t}());\n\texports.ExpressionStatement = ExpressionStatement;\n\tvar ForInStatement = (function () {\n\t function ForInStatement(left, right, body) {\n\t this.type = syntax_1.Syntax.ForInStatement;\n\t this.left = left;\n\t this.right = right;\n\t this.body = body;\n\t this.each = false;\n\t }\n\t return ForInStatement;\n\t}());\n\texports.ForInStatement = ForInStatement;\n\tvar ForOfStatement = (function () {\n\t function ForOfStatement(left, right, body) {\n\t this.type = syntax_1.Syntax.ForOfStatement;\n\t this.left = left;\n\t this.right = right;\n\t this.body = body;\n\t }\n\t return ForOfStatement;\n\t}());\n\texports.ForOfStatement = ForOfStatement;\n\tvar ForStatement = (function () {\n\t function ForStatement(init, test, update, body) {\n\t this.type = syntax_1.Syntax.ForStatement;\n\t this.init = init;\n\t this.test = test;\n\t this.update = update;\n\t this.body = body;\n\t }\n\t return ForStatement;\n\t}());\n\texports.ForStatement = ForStatement;\n\tvar FunctionDeclaration = (function () {\n\t function FunctionDeclaration(id, params, body, generator) {\n\t this.type = syntax_1.Syntax.FunctionDeclaration;\n\t this.id = id;\n\t this.params = params;\n\t this.body = body;\n\t this.generator = generator;\n\t this.expression = false;\n\t this.async = false;\n\t }\n\t return FunctionDeclaration;\n\t}());\n\texports.FunctionDeclaration = FunctionDeclaration;\n\tvar FunctionExpression = (function () {\n\t function FunctionExpression(id, params, body, generator) {\n\t this.type = syntax_1.Syntax.FunctionExpression;\n\t this.id = id;\n\t this.params = params;\n\t this.body = body;\n\t this.generator = generator;\n\t this.expression = false;\n\t this.async = false;\n\t }\n\t return FunctionExpression;\n\t}());\n\texports.FunctionExpression = FunctionExpression;\n\tvar Identifier = (function () {\n\t function Identifier(name) {\n\t this.type = syntax_1.Syntax.Identifier;\n\t this.name = name;\n\t }\n\t return Identifier;\n\t}());\n\texports.Identifier = Identifier;\n\tvar IfStatement = (function () {\n\t function IfStatement(test, consequent, alternate) {\n\t this.type = syntax_1.Syntax.IfStatement;\n\t this.test = test;\n\t this.consequent = consequent;\n\t this.alternate = alternate;\n\t }\n\t return IfStatement;\n\t}());\n\texports.IfStatement = IfStatement;\n\tvar ImportDeclaration = (function () {\n\t function ImportDeclaration(specifiers, source) {\n\t this.type = syntax_1.Syntax.ImportDeclaration;\n\t this.specifiers = specifiers;\n\t this.source = source;\n\t }\n\t return ImportDeclaration;\n\t}());\n\texports.ImportDeclaration = ImportDeclaration;\n\tvar ImportDefaultSpecifier = (function () {\n\t function ImportDefaultSpecifier(local) {\n\t this.type = syntax_1.Syntax.ImportDefaultSpecifier;\n\t this.local = local;\n\t }\n\t return ImportDefaultSpecifier;\n\t}());\n\texports.ImportDefaultSpecifier = ImportDefaultSpecifier;\n\tvar ImportNamespaceSpecifier = (function () {\n\t function ImportNamespaceSpecifier(local) {\n\t this.type = syntax_1.Syntax.ImportNamespaceSpecifier;\n\t this.local = local;\n\t }\n\t return ImportNamespaceSpecifier;\n\t}());\n\texports.ImportNamespaceSpecifier = ImportNamespaceSpecifier;\n\tvar ImportSpecifier = (function () {\n\t function ImportSpecifier(local, imported) {\n\t this.type = syntax_1.Syntax.ImportSpecifier;\n\t this.local = local;\n\t this.imported = imported;\n\t }\n\t return ImportSpecifier;\n\t}());\n\texports.ImportSpecifier = ImportSpecifier;\n\tvar LabeledStatement = (function () {\n\t function LabeledStatement(label, body) {\n\t this.type = syntax_1.Syntax.LabeledStatement;\n\t this.label = label;\n\t this.body = body;\n\t }\n\t return LabeledStatement;\n\t}());\n\texports.LabeledStatement = LabeledStatement;\n\tvar Literal = (function () {\n\t function Literal(value, raw) {\n\t this.type = syntax_1.Syntax.Literal;\n\t this.value = value;\n\t this.raw = raw;\n\t }\n\t return Literal;\n\t}());\n\texports.Literal = Literal;\n\tvar MetaProperty = (function () {\n\t function MetaProperty(meta, property) {\n\t this.type = syntax_1.Syntax.MetaProperty;\n\t this.meta = meta;\n\t this.property = property;\n\t }\n\t return MetaProperty;\n\t}());\n\texports.MetaProperty = MetaProperty;\n\tvar MethodDefinition = (function () {\n\t function MethodDefinition(key, computed, value, kind, isStatic) {\n\t this.type = syntax_1.Syntax.MethodDefinition;\n\t this.key = key;\n\t this.computed = computed;\n\t this.value = value;\n\t this.kind = kind;\n\t this.static = isStatic;\n\t }\n\t return MethodDefinition;\n\t}());\n\texports.MethodDefinition = MethodDefinition;\n\tvar Module = (function () {\n\t function Module(body) {\n\t this.type = syntax_1.Syntax.Program;\n\t this.body = body;\n\t this.sourceType = 'module';\n\t }\n\t return Module;\n\t}());\n\texports.Module = Module;\n\tvar NewExpression = (function () {\n\t function NewExpression(callee, args) {\n\t this.type = syntax_1.Syntax.NewExpression;\n\t this.callee = callee;\n\t this.arguments = args;\n\t }\n\t return NewExpression;\n\t}());\n\texports.NewExpression = NewExpression;\n\tvar ObjectExpression = (function () {\n\t function ObjectExpression(properties) {\n\t this.type = syntax_1.Syntax.ObjectExpression;\n\t this.properties = properties;\n\t }\n\t return ObjectExpression;\n\t}());\n\texports.ObjectExpression = ObjectExpression;\n\tvar ObjectPattern = (function () {\n\t function ObjectPattern(properties) {\n\t this.type = syntax_1.Syntax.ObjectPattern;\n\t this.properties = properties;\n\t }\n\t return ObjectPattern;\n\t}());\n\texports.ObjectPattern = ObjectPattern;\n\tvar Property = (function () {\n\t function Property(kind, key, computed, value, method, shorthand) {\n\t this.type = syntax_1.Syntax.Property;\n\t this.key = key;\n\t this.computed = computed;\n\t this.value = value;\n\t this.kind = kind;\n\t this.method = method;\n\t this.shorthand = shorthand;\n\t }\n\t return Property;\n\t}());\n\texports.Property = Property;\n\tvar RegexLiteral = (function () {\n\t function RegexLiteral(value, raw, pattern, flags) {\n\t this.type = syntax_1.Syntax.Literal;\n\t this.value = value;\n\t this.raw = raw;\n\t this.regex = { pattern: pattern, flags: flags };\n\t }\n\t return RegexLiteral;\n\t}());\n\texports.RegexLiteral = RegexLiteral;\n\tvar RestElement = (function () {\n\t function RestElement(argument) {\n\t this.type = syntax_1.Syntax.RestElement;\n\t this.argument = argument;\n\t }\n\t return RestElement;\n\t}());\n\texports.RestElement = RestElement;\n\tvar ReturnStatement = (function () {\n\t function ReturnStatement(argument) {\n\t this.type = syntax_1.Syntax.ReturnStatement;\n\t this.argument = argument;\n\t }\n\t return ReturnStatement;\n\t}());\n\texports.ReturnStatement = ReturnStatement;\n\tvar Script = (function () {\n\t function Script(body) {\n\t this.type = syntax_1.Syntax.Program;\n\t this.body = body;\n\t this.sourceType = 'script';\n\t }\n\t return Script;\n\t}());\n\texports.Script = Script;\n\tvar SequenceExpression = (function () {\n\t function SequenceExpression(expressions) {\n\t this.type = syntax_1.Syntax.SequenceExpression;\n\t this.expressions = expressions;\n\t }\n\t return SequenceExpression;\n\t}());\n\texports.SequenceExpression = SequenceExpression;\n\tvar SpreadElement = (function () {\n\t function SpreadElement(argument) {\n\t this.type = syntax_1.Syntax.SpreadElement;\n\t this.argument = argument;\n\t }\n\t return SpreadElement;\n\t}());\n\texports.SpreadElement = SpreadElement;\n\tvar StaticMemberExpression = (function () {\n\t function StaticMemberExpression(object, property) {\n\t this.type = syntax_1.Syntax.MemberExpression;\n\t this.computed = false;\n\t this.object = object;\n\t this.property = property;\n\t }\n\t return StaticMemberExpression;\n\t}());\n\texports.StaticMemberExpression = StaticMemberExpression;\n\tvar Super = (function () {\n\t function Super() {\n\t this.type = syntax_1.Syntax.Super;\n\t }\n\t return Super;\n\t}());\n\texports.Super = Super;\n\tvar SwitchCase = (function () {\n\t function SwitchCase(test, consequent) {\n\t this.type = syntax_1.Syntax.SwitchCase;\n\t this.test = test;\n\t this.consequent = consequent;\n\t }\n\t return SwitchCase;\n\t}());\n\texports.SwitchCase = SwitchCase;\n\tvar SwitchStatement = (function () {\n\t function SwitchStatement(discriminant, cases) {\n\t this.type = syntax_1.Syntax.SwitchStatement;\n\t this.discriminant = discriminant;\n\t this.cases = cases;\n\t }\n\t return SwitchStatement;\n\t}());\n\texports.SwitchStatement = SwitchStatement;\n\tvar TaggedTemplateExpression = (function () {\n\t function TaggedTemplateExpression(tag, quasi) {\n\t this.type = syntax_1.Syntax.TaggedTemplateExpression;\n\t this.tag = tag;\n\t this.quasi = quasi;\n\t }\n\t return TaggedTemplateExpression;\n\t}());\n\texports.TaggedTemplateExpression = TaggedTemplateExpression;\n\tvar TemplateElement = (function () {\n\t function TemplateElement(value, tail) {\n\t this.type = syntax_1.Syntax.TemplateElement;\n\t this.value = value;\n\t this.tail = tail;\n\t }\n\t return TemplateElement;\n\t}());\n\texports.TemplateElement = TemplateElement;\n\tvar TemplateLiteral = (function () {\n\t function TemplateLiteral(quasis, expressions) {\n\t this.type = syntax_1.Syntax.TemplateLiteral;\n\t this.quasis = quasis;\n\t this.expressions = expressions;\n\t }\n\t return TemplateLiteral;\n\t}());\n\texports.TemplateLiteral = TemplateLiteral;\n\tvar ThisExpression = (function () {\n\t function ThisExpression() {\n\t this.type = syntax_1.Syntax.ThisExpression;\n\t }\n\t return ThisExpression;\n\t}());\n\texports.ThisExpression = ThisExpression;\n\tvar ThrowStatement = (function () {\n\t function ThrowStatement(argument) {\n\t this.type = syntax_1.Syntax.ThrowStatement;\n\t this.argument = argument;\n\t }\n\t return ThrowStatement;\n\t}());\n\texports.ThrowStatement = ThrowStatement;\n\tvar TryStatement = (function () {\n\t function TryStatement(block, handler, finalizer) {\n\t this.type = syntax_1.Syntax.TryStatement;\n\t this.block = block;\n\t this.handler = handler;\n\t this.finalizer = finalizer;\n\t }\n\t return TryStatement;\n\t}());\n\texports.TryStatement = TryStatement;\n\tvar UnaryExpression = (function () {\n\t function UnaryExpression(operator, argument) {\n\t this.type = syntax_1.Syntax.UnaryExpression;\n\t this.operator = operator;\n\t this.argument = argument;\n\t this.prefix = true;\n\t }\n\t return UnaryExpression;\n\t}());\n\texports.UnaryExpression = UnaryExpression;\n\tvar UpdateExpression = (function () {\n\t function UpdateExpression(operator, argument, prefix) {\n\t this.type = syntax_1.Syntax.UpdateExpression;\n\t this.operator = operator;\n\t this.argument = argument;\n\t this.prefix = prefix;\n\t }\n\t return UpdateExpression;\n\t}());\n\texports.UpdateExpression = UpdateExpression;\n\tvar VariableDeclaration = (function () {\n\t function VariableDeclaration(declarations, kind) {\n\t this.type = syntax_1.Syntax.VariableDeclaration;\n\t this.declarations = declarations;\n\t this.kind = kind;\n\t }\n\t return VariableDeclaration;\n\t}());\n\texports.VariableDeclaration = VariableDeclaration;\n\tvar VariableDeclarator = (function () {\n\t function VariableDeclarator(id, init) {\n\t this.type = syntax_1.Syntax.VariableDeclarator;\n\t this.id = id;\n\t this.init = init;\n\t }\n\t return VariableDeclarator;\n\t}());\n\texports.VariableDeclarator = VariableDeclarator;\n\tvar WhileStatement = (function () {\n\t function WhileStatement(test, body) {\n\t this.type = syntax_1.Syntax.WhileStatement;\n\t this.test = test;\n\t this.body = body;\n\t }\n\t return WhileStatement;\n\t}());\n\texports.WhileStatement = WhileStatement;\n\tvar WithStatement = (function () {\n\t function WithStatement(object, body) {\n\t this.type = syntax_1.Syntax.WithStatement;\n\t this.object = object;\n\t this.body = body;\n\t }\n\t return WithStatement;\n\t}());\n\texports.WithStatement = WithStatement;\n\tvar YieldExpression = (function () {\n\t function YieldExpression(argument, delegate) {\n\t this.type = syntax_1.Syntax.YieldExpression;\n\t this.argument = argument;\n\t this.delegate = delegate;\n\t }\n\t return YieldExpression;\n\t}());\n\texports.YieldExpression = YieldExpression;\n\n\n/***/ },\n/* 8 */\n/***/ function(module, exports, __nested_webpack_require_80491__) {\n\n\t\"use strict\";\n\tObject.defineProperty(exports, \"__esModule\", { value: true });\n\tvar assert_1 = __nested_webpack_require_80491__(9);\n\tvar error_handler_1 = __nested_webpack_require_80491__(10);\n\tvar messages_1 = __nested_webpack_require_80491__(11);\n\tvar Node = __nested_webpack_require_80491__(7);\n\tvar scanner_1 = __nested_webpack_require_80491__(12);\n\tvar syntax_1 = __nested_webpack_require_80491__(2);\n\tvar token_1 = __nested_webpack_require_80491__(13);\n\tvar ArrowParameterPlaceHolder = 'ArrowParameterPlaceHolder';\n\tvar Parser = (function () {\n\t function Parser(code, options, delegate) {\n\t if (options === void 0) { options = {}; }\n\t this.config = {\n\t range: (typeof options.range === 'boolean') && options.range,\n\t loc: (typeof options.loc === 'boolean') && options.loc,\n\t source: null,\n\t tokens: (typeof options.tokens === 'boolean') && options.tokens,\n\t comment: (typeof options.comment === 'boolean') && options.comment,\n\t tolerant: (typeof options.tolerant === 'boolean') && options.tolerant\n\t };\n\t if (this.config.loc && options.source && options.source !== null) {\n\t this.config.source = String(options.source);\n\t }\n\t this.delegate = delegate;\n\t this.errorHandler = new error_handler_1.ErrorHandler();\n\t this.errorHandler.tolerant = this.config.tolerant;\n\t this.scanner = new scanner_1.Scanner(code, this.errorHandler);\n\t this.scanner.trackComment = this.config.comment;\n\t this.operatorPrecedence = {\n\t ')': 0,\n\t ';': 0,\n\t ',': 0,\n\t '=': 0,\n\t ']': 0,\n\t '||': 1,\n\t '&&': 2,\n\t '|': 3,\n\t '^': 4,\n\t '&': 5,\n\t '==': 6,\n\t '!=': 6,\n\t '===': 6,\n\t '!==': 6,\n\t '<': 7,\n\t '>': 7,\n\t '<=': 7,\n\t '>=': 7,\n\t '<<': 8,\n\t '>>': 8,\n\t '>>>': 8,\n\t '+': 9,\n\t '-': 9,\n\t '*': 11,\n\t '/': 11,\n\t '%': 11\n\t };\n\t this.lookahead = {\n\t type: 2 /* EOF */,\n\t value: '',\n\t lineNumber: this.scanner.lineNumber,\n\t lineStart: 0,\n\t start: 0,\n\t end: 0\n\t };\n\t this.hasLineTerminator = false;\n\t this.context = {\n\t isModule: false,\n\t await: false,\n\t allowIn: true,\n\t allowStrictDirective: true,\n\t allowYield: true,\n\t firstCoverInitializedNameError: null,\n\t isAssignmentTarget: false,\n\t isBindingElement: false,\n\t inFunctionBody: false,\n\t inIteration: false,\n\t inSwitch: false,\n\t labelSet: {},\n\t strict: false\n\t };\n\t this.tokens = [];\n\t this.startMarker = {\n\t index: 0,\n\t line: this.scanner.lineNumber,\n\t column: 0\n\t };\n\t this.lastMarker = {\n\t index: 0,\n\t line: this.scanner.lineNumber,\n\t column: 0\n\t };\n\t this.nextToken();\n\t this.lastMarker = {\n\t index: this.scanner.index,\n\t line: this.scanner.lineNumber,\n\t column: this.scanner.index - this.scanner.lineStart\n\t };\n\t }\n\t Parser.prototype.throwError = function (messageFormat) {\n\t var values = [];\n\t for (var _i = 1; _i < arguments.length; _i++) {\n\t values[_i - 1] = arguments[_i];\n\t }\n\t var args = Array.prototype.slice.call(arguments, 1);\n\t var msg = messageFormat.replace(/%(\\d)/g, function (whole, idx) {\n\t assert_1.assert(idx < args.length, 'Message reference must be in range');\n\t return args[idx];\n\t });\n\t var index = this.lastMarker.index;\n\t var line = this.lastMarker.line;\n\t var column = this.lastMarker.column + 1;\n\t throw this.errorHandler.createError(index, line, column, msg);\n\t };\n\t Parser.prototype.tolerateError = function (messageFormat) {\n\t var values = [];\n\t for (var _i = 1; _i < arguments.length; _i++) {\n\t values[_i - 1] = arguments[_i];\n\t }\n\t var args = Array.prototype.slice.call(arguments, 1);\n\t var msg = messageFormat.replace(/%(\\d)/g, function (whole, idx) {\n\t assert_1.assert(idx < args.length, 'Message reference must be in range');\n\t return args[idx];\n\t });\n\t var index = this.lastMarker.index;\n\t var line = this.scanner.lineNumber;\n\t var column = this.lastMarker.column + 1;\n\t this.errorHandler.tolerateError(index, line, column, msg);\n\t };\n\t // Throw an exception because of the token.\n\t Parser.prototype.unexpectedTokenError = function (token, message) {\n\t var msg = message || messages_1.Messages.UnexpectedToken;\n\t var value;\n\t if (token) {\n\t if (!message) {\n\t msg = (token.type === 2 /* EOF */) ? messages_1.Messages.UnexpectedEOS :\n\t (token.type === 3 /* Identifier */) ? messages_1.Messages.UnexpectedIdentifier :\n\t (token.type === 6 /* NumericLiteral */) ? messages_1.Messages.UnexpectedNumber :\n\t (token.type === 8 /* StringLiteral */) ? messages_1.Messages.UnexpectedString :\n\t (token.type === 10 /* Template */) ? messages_1.Messages.UnexpectedTemplate :\n\t messages_1.Messages.UnexpectedToken;\n\t if (token.type === 4 /* Keyword */) {\n\t if (this.scanner.isFutureReservedWord(token.value)) {\n\t msg = messages_1.Messages.UnexpectedReserved;\n\t }\n\t else if (this.context.strict && this.scanner.isStrictModeReservedWord(token.value)) {\n\t msg = messages_1.Messages.StrictReservedWord;\n\t }\n\t }\n\t }\n\t value = token.value;\n\t }\n\t else {\n\t value = 'ILLEGAL';\n\t }\n\t msg = msg.replace('%0', value);\n\t if (token && typeof token.lineNumber === 'number') {\n\t var index = token.start;\n\t var line = token.lineNumber;\n\t var lastMarkerLineStart = this.lastMarker.index - this.lastMarker.column;\n\t var column = token.start - lastMarkerLineStart + 1;\n\t return this.errorHandler.createError(index, line, column, msg);\n\t }\n\t else {\n\t var index = this.lastMarker.index;\n\t var line = this.lastMarker.line;\n\t var column = this.lastMarker.column + 1;\n\t return this.errorHandler.createError(index, line, column, msg);\n\t }\n\t };\n\t Parser.prototype.throwUnexpectedToken = function (token, message) {\n\t throw this.unexpectedTokenError(token, message);\n\t };\n\t Parser.prototype.tolerateUnexpectedToken = function (token, message) {\n\t this.errorHandler.tolerate(this.unexpectedTokenError(token, message));\n\t };\n\t Parser.prototype.collectComments = function () {\n\t if (!this.config.comment) {\n\t this.scanner.scanComments();\n\t }\n\t else {\n\t var comments = this.scanner.scanComments();\n\t if (comments.length > 0 && this.delegate) {\n\t for (var i = 0; i < comments.length; ++i) {\n\t var e = comments[i];\n\t var node = void 0;\n\t node = {\n\t type: e.multiLine ? 'BlockComment' : 'LineComment',\n\t value: this.scanner.source.slice(e.slice[0], e.slice[1])\n\t };\n\t if (this.config.range) {\n\t node.range = e.range;\n\t }\n\t if (this.config.loc) {\n\t node.loc = e.loc;\n\t }\n\t var metadata = {\n\t start: {\n\t line: e.loc.start.line,\n\t column: e.loc.start.column,\n\t offset: e.range[0]\n\t },\n\t end: {\n\t line: e.loc.end.line,\n\t column: e.loc.end.column,\n\t offset: e.range[1]\n\t }\n\t };\n\t this.delegate(node, metadata);\n\t }\n\t }\n\t }\n\t };\n\t // From internal representation to an external structure\n\t Parser.prototype.getTokenRaw = function (token) {\n\t return this.scanner.source.slice(token.start, token.end);\n\t };\n\t Parser.prototype.convertToken = function (token) {\n\t var t = {\n\t type: token_1.TokenName[token.type],\n\t value: this.getTokenRaw(token)\n\t };\n\t if (this.config.range) {\n\t t.range = [token.start, token.end];\n\t }\n\t if (this.config.loc) {\n\t t.loc = {\n\t start: {\n\t line: this.startMarker.line,\n\t column: this.startMarker.column\n\t },\n\t end: {\n\t line: this.scanner.lineNumber,\n\t column: this.scanner.index - this.scanner.lineStart\n\t }\n\t };\n\t }\n\t if (token.type === 9 /* RegularExpression */) {\n\t var pattern = token.pattern;\n\t var flags = token.flags;\n\t t.regex = { pattern: pattern, flags: flags };\n\t }\n\t return t;\n\t };\n\t Parser.prototype.nextToken = function () {\n\t var token = this.lookahead;\n\t this.lastMarker.index = this.scanner.index;\n\t this.lastMarker.line = this.scanner.lineNumber;\n\t this.lastMarker.column = this.scanner.index - this.scanner.lineStart;\n\t this.collectComments();\n\t if (this.scanner.index !== this.startMarker.index) {\n\t this.startMarker.index = this.scanner.index;\n\t this.startMarker.line = this.scanner.lineNumber;\n\t this.startMarker.column = this.scanner.index - this.scanner.lineStart;\n\t }\n\t var next = this.scanner.lex();\n\t this.hasLineTerminator = (token.lineNumber !== next.lineNumber);\n\t if (next && this.context.strict && next.type === 3 /* Identifier */) {\n\t if (this.scanner.isStrictModeReservedWord(next.value)) {\n\t next.type = 4 /* Keyword */;\n\t }\n\t }\n\t this.lookahead = next;\n\t if (this.config.tokens && next.type !== 2 /* EOF */) {\n\t this.tokens.push(this.convertToken(next));\n\t }\n\t return token;\n\t };\n\t Parser.prototype.nextRegexToken = function () {\n\t this.collectComments();\n\t var token = this.scanner.scanRegExp();\n\t if (this.config.tokens) {\n\t // Pop the previous token, '/' or '/='\n\t // This is added from the lookahead token.\n\t this.tokens.pop();\n\t this.tokens.push(this.convertToken(token));\n\t }\n\t // Prime the next lookahead.\n\t this.lookahead = token;\n\t this.nextToken();\n\t return token;\n\t };\n\t Parser.prototype.createNode = function () {\n\t return {\n\t index: this.startMarker.index,\n\t line: this.startMarker.line,\n\t column: this.startMarker.column\n\t };\n\t };\n\t Parser.prototype.startNode = function (token, lastLineStart) {\n\t if (lastLineStart === void 0) { lastLineStart = 0; }\n\t var column = token.start - token.lineStart;\n\t var line = token.lineNumber;\n\t if (column < 0) {\n\t column += lastLineStart;\n\t line--;\n\t }\n\t return {\n\t index: token.start,\n\t line: line,\n\t column: column\n\t };\n\t };\n\t Parser.prototype.finalize = function (marker, node) {\n\t if (this.config.range) {\n\t node.range = [marker.index, this.lastMarker.index];\n\t }\n\t if (this.config.loc) {\n\t node.loc = {\n\t start: {\n\t line: marker.line,\n\t column: marker.column,\n\t },\n\t end: {\n\t line: this.lastMarker.line,\n\t column: this.lastMarker.column\n\t }\n\t };\n\t if (this.config.source) {\n\t node.loc.source = this.config.source;\n\t }\n\t }\n\t if (this.delegate) {\n\t var metadata = {\n\t start: {\n\t line: marker.line,\n\t column: marker.column,\n\t offset: marker.index\n\t },\n\t end: {\n\t line: this.lastMarker.line,\n\t column: this.lastMarker.column,\n\t offset: this.lastMarker.index\n\t }\n\t };\n\t this.delegate(node, metadata);\n\t }\n\t return node;\n\t };\n\t // Expect the next token to match the specified punctuator.\n\t // If not, an exception will be thrown.\n\t Parser.prototype.expect = function (value) {\n\t var token = this.nextToken();\n\t if (token.type !== 7 /* Punctuator */ || token.value !== value) {\n\t this.throwUnexpectedToken(token);\n\t }\n\t };\n\t // Quietly expect a comma when in tolerant mode, otherwise delegates to expect().\n\t Parser.prototype.expectCommaSeparator = function () {\n\t if (this.config.tolerant) {\n\t var token = this.lookahead;\n\t if (token.type === 7 /* Punctuator */ && token.value === ',') {\n\t this.nextToken();\n\t }\n\t else if (token.type === 7 /* Punctuator */ && token.value === ';') {\n\t this.nextToken();\n\t this.tolerateUnexpectedToken(token);\n\t }\n\t else {\n\t this.tolerateUnexpectedToken(token, messages_1.Messages.UnexpectedToken);\n\t }\n\t }\n\t else {\n\t this.expect(',');\n\t }\n\t };\n\t // Expect the next token to match the specified keyword.\n\t // If not, an exception will be thrown.\n\t Parser.prototype.expectKeyword = function (keyword) {\n\t var token = this.nextToken();\n\t if (token.type !== 4 /* Keyword */ || token.value !== keyword) {\n\t this.throwUnexpectedToken(token);\n\t }\n\t };\n\t // Return true if the next token matches the specified punctuator.\n\t Parser.prototype.match = function (value) {\n\t return this.lookahead.type === 7 /* Punctuator */ && this.lookahead.value === value;\n\t };\n\t // Return true if the next token matches the specified keyword\n\t Parser.prototype.matchKeyword = function (keyword) {\n\t return this.lookahead.type === 4 /* Keyword */ && this.lookahead.value === keyword;\n\t };\n\t // Return true if the next token matches the specified contextual keyword\n\t // (where an identifier is sometimes a keyword depending on the context)\n\t Parser.prototype.matchContextualKeyword = function (keyword) {\n\t return this.lookahead.type === 3 /* Identifier */ && this.lookahead.value === keyword;\n\t };\n\t // Return true if the next token is an assignment operator\n\t Parser.prototype.matchAssign = function () {\n\t if (this.lookahead.type !== 7 /* Punctuator */) {\n\t return false;\n\t }\n\t var op = this.lookahead.value;\n\t return op === '=' ||\n\t op === '*=' ||\n\t op === '**=' ||\n\t op === '/=' ||\n\t op === '%=' ||\n\t op === '+=' ||\n\t op === '-=' ||\n\t op === '<<=' ||\n\t op === '>>=' ||\n\t op === '>>>=' ||\n\t op === '&=' ||\n\t op === '^=' ||\n\t op === '|=';\n\t };\n\t // Cover grammar support.\n\t //\n\t // When an assignment expression position starts with an left parenthesis, the determination of the type\n\t // of the syntax is to be deferred arbitrarily long until the end of the parentheses pair (plus a lookahead)\n\t // or the first comma. This situation also defers the determination of all the expressions nested in the pair.\n\t //\n\t // There are three productions that can be parsed in a parentheses pair that needs to be determined\n\t // after the outermost pair is closed. They are:\n\t //\n\t // 1. AssignmentExpression\n\t // 2. BindingElements\n\t // 3. AssignmentTargets\n\t //\n\t // In order to avoid exponential backtracking, we use two flags to denote if the production can be\n\t // binding element or assignment target.\n\t //\n\t // The three productions have the relationship:\n\t //\n\t // BindingElements ⊆ AssignmentTargets ⊆ AssignmentExpression\n\t //\n\t // with a single exception that CoverInitializedName when used directly in an Expression, generates\n\t // an early error. Therefore, we need the third state, firstCoverInitializedNameError, to track the\n\t // first usage of CoverInitializedName and report it when we reached the end of the parentheses pair.\n\t //\n\t // isolateCoverGrammar function runs the given parser function with a new cover grammar context, and it does not\n\t // effect the current flags. This means the production the parser parses is only used as an expression. Therefore\n\t // the CoverInitializedName check is conducted.\n\t //\n\t // inheritCoverGrammar function runs the given parse function with a new cover grammar context, and it propagates\n\t // the flags outside of the parser. This means the production the parser parses is used as a part of a potential\n\t // pattern. The CoverInitializedName check is deferred.\n\t Parser.prototype.isolateCoverGrammar = function (parseFunction) {\n\t var previousIsBindingElement = this.context.isBindingElement;\n\t var previousIsAssignmentTarget = this.context.isAssignmentTarget;\n\t var previousFirstCoverInitializedNameError = this.context.firstCoverInitializedNameError;\n\t this.context.isBindingElement = true;\n\t this.context.isAssignmentTarget = true;\n\t this.context.firstCoverInitializedNameError = null;\n\t var result = parseFunction.call(this);\n\t if (this.context.firstCoverInitializedNameError !== null) {\n\t this.throwUnexpectedToken(this.context.firstCoverInitializedNameError);\n\t }\n\t this.context.isBindingElement = previousIsBindingElement;\n\t this.context.isAssignmentTarget = previousIsAssignmentTarget;\n\t this.context.firstCoverInitializedNameError = previousFirstCoverInitializedNameError;\n\t return result;\n\t };\n\t Parser.prototype.inheritCoverGrammar = function (parseFunction) {\n\t var previousIsBindingElement = this.context.isBindingElement;\n\t var previousIsAssignmentTarget = this.context.isAssignmentTarget;\n\t var previousFirstCoverInitializedNameError = this.context.firstCoverInitializedNameError;\n\t this.context.isBindingElement = true;\n\t this.context.isAssignmentTarget = true;\n\t this.context.firstCoverInitializedNameError = null;\n\t var result = parseFunction.call(this);\n\t this.context.isBindingElement = this.context.isBindingElement && previousIsBindingElement;\n\t this.context.isAssignmentTarget = this.context.isAssignmentTarget && previousIsAssignmentTarget;\n\t this.context.firstCoverInitializedNameError = previousFirstCoverInitializedNameError || this.context.firstCoverInitializedNameError;\n\t return result;\n\t };\n\t Parser.prototype.consumeSemicolon = function () {\n\t if (this.match(';')) {\n\t this.nextToken();\n\t }\n\t else if (!this.hasLineTerminator) {\n\t if (this.lookahead.type !== 2 /* EOF */ && !this.match('}')) {\n\t this.throwUnexpectedToken(this.lookahead);\n\t }\n\t this.lastMarker.index = this.startMarker.index;\n\t this.lastMarker.line = this.startMarker.line;\n\t this.lastMarker.column = this.startMarker.column;\n\t }\n\t };\n\t // https://tc39.github.io/ecma262/#sec-primary-expression\n\t Parser.prototype.parsePrimaryExpression = function () {\n\t var node = this.createNode();\n\t var expr;\n\t var token, raw;\n\t switch (this.lookahead.type) {\n\t case 3 /* Identifier */:\n\t if ((this.context.isModule || this.context.await) && this.lookahead.value === 'await') {\n\t this.tolerateUnexpectedToken(this.lookahead);\n\t }\n\t expr = this.matchAsyncFunction() ? this.parseFunctionExpression() : this.finalize(node, new Node.Identifier(this.nextToken().value));\n\t break;\n\t case 6 /* NumericLiteral */:\n\t case 8 /* StringLiteral */:\n\t if (this.context.strict && this.lookahead.octal) {\n\t this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.StrictOctalLiteral);\n\t }\n\t this.context.isAssignmentTarget = false;\n\t this.context.isBindingElement = false;\n\t token = this.nextToken();\n\t raw = this.getTokenRaw(token);\n\t expr = this.finalize(node, new Node.Literal(token.value, raw));\n\t break;\n\t case 1 /* BooleanLiteral */:\n\t this.context.isAssignmentTarget = false;\n\t this.context.isBindingElement = false;\n\t token = this.nextToken();\n\t raw = this.getTokenRaw(token);\n\t expr = this.finalize(node, new Node.Literal(token.value === 'true', raw));\n\t break;\n\t case 5 /* NullLiteral */:\n\t this.context.isAssignmentTarget = false;\n\t this.context.isBindingElement = false;\n\t token = this.nextToken();\n\t raw = this.getTokenRaw(token);\n\t expr = this.finalize(node, new Node.Literal(null, raw));\n\t break;\n\t case 10 /* Template */:\n\t expr = this.parseTemplateLiteral();\n\t break;\n\t case 7 /* Punctuator */:\n\t switch (this.lookahead.value) {\n\t case '(':\n\t this.context.isBindingElement = false;\n\t expr = this.inheritCoverGrammar(this.parseGroupExpression);\n\t break;\n\t case '[':\n\t expr = this.inheritCoverGrammar(this.parseArrayInitializer);\n\t break;\n\t case '{':\n\t expr = this.inheritCoverGrammar(this.parseObjectInitializer);\n\t break;\n\t case '/':\n\t case '/=':\n\t this.context.isAssignmentTarget = false;\n\t this.context.isBindingElement = false;\n\t this.scanner.index = this.startMarker.index;\n\t token = this.nextRegexToken();\n\t raw = this.getTokenRaw(token);\n\t expr = this.finalize(node, new Node.RegexLiteral(token.regex, raw, token.pattern, token.flags));\n\t break;\n\t default:\n\t expr = this.throwUnexpectedToken(this.nextToken());\n\t }\n\t break;\n\t case 4 /* Keyword */:\n\t if (!this.context.strict && this.context.allowYield && this.matchKeyword('yield')) {\n\t expr = this.parseIdentifierName();\n\t }\n\t else if (!this.context.strict && this.matchKeyword('let')) {\n\t expr = this.finalize(node, new Node.Identifier(this.nextToken().value));\n\t }\n\t else {\n\t this.context.isAssignmentTarget = false;\n\t this.context.isBindingElement = false;\n\t if (this.matchKeyword('function')) {\n\t expr = this.parseFunctionExpression();\n\t }\n\t else if (this.matchKeyword('this')) {\n\t this.nextToken();\n\t expr = this.finalize(node, new Node.ThisExpression());\n\t }\n\t else if (this.matchKeyword('class')) {\n\t expr = this.parseClassExpression();\n\t }\n\t else {\n\t expr = this.throwUnexpectedToken(this.nextToken());\n\t }\n\t }\n\t break;\n\t default:\n\t expr = this.throwUnexpectedToken(this.nextToken());\n\t }\n\t return expr;\n\t };\n\t // https://tc39.github.io/ecma262/#sec-array-initializer\n\t Parser.prototype.parseSpreadElement = function () {\n\t var node = this.createNode();\n\t this.expect('...');\n\t var arg = this.inheritCoverGrammar(this.parseAssignmentExpression);\n\t return this.finalize(node, new Node.SpreadElement(arg));\n\t };\n\t Parser.prototype.parseArrayInitializer = function () {\n\t var node = this.createNode();\n\t var elements = [];\n\t this.expect('[');\n\t while (!this.match(']')) {\n\t if (this.match(',')) {\n\t this.nextToken();\n\t elements.push(null);\n\t }\n\t else if (this.match('...')) {\n\t var element = this.parseSpreadElement();\n\t if (!this.match(']')) {\n\t this.context.isAssignmentTarget = false;\n\t this.context.isBindingElement = false;\n\t this.expect(',');\n\t }\n\t elements.push(element);\n\t }\n\t else {\n\t elements.push(this.inheritCoverGrammar(this.parseAssignmentExpression));\n\t if (!this.match(']')) {\n\t this.expect(',');\n\t }\n\t }\n\t }\n\t this.expect(']');\n\t return this.finalize(node, new Node.ArrayExpression(elements));\n\t };\n\t // https://tc39.github.io/ecma262/#sec-object-initializer\n\t Parser.prototype.parsePropertyMethod = function (params) {\n\t this.context.isAssignmentTarget = false;\n\t this.context.isBindingElement = false;\n\t var previousStrict = this.context.strict;\n\t var previousAllowStrictDirective = this.context.allowStrictDirective;\n\t this.context.allowStrictDirective = params.simple;\n\t var body = this.isolateCoverGrammar(this.parseFunctionSourceElements);\n\t if (this.context.strict && params.firstRestricted) {\n\t this.tolerateUnexpectedToken(params.firstRestricted, params.message);\n\t }\n\t if (this.context.strict && params.stricted) {\n\t this.tolerateUnexpectedToken(params.stricted, params.message);\n\t }\n\t this.context.strict = previousStrict;\n\t this.context.allowStrictDirective = previousAllowStrictDirective;\n\t return body;\n\t };\n\t Parser.prototype.parsePropertyMethodFunction = function () {\n\t var isGenerator = false;\n\t var node = this.createNode();\n\t var previousAllowYield = this.context.allowYield;\n\t this.context.allowYield = true;\n\t var params = this.parseFormalParameters();\n\t var method = this.parsePropertyMethod(params);\n\t this.context.allowYield = previousAllowYield;\n\t return this.finalize(node, new Node.FunctionExpression(null, params.params, method, isGenerator));\n\t };\n\t Parser.prototype.parsePropertyMethodAsyncFunction = function () {\n\t var node = this.createNode();\n\t var previousAllowYield = this.context.allowYield;\n\t var previousAwait = this.context.await;\n\t this.context.allowYield = false;\n\t this.context.await = true;\n\t var params = this.parseFormalParameters();\n\t var method = this.parsePropertyMethod(params);\n\t this.context.allowYield = previousAllowYield;\n\t this.context.await = previousAwait;\n\t return this.finalize(node, new Node.AsyncFunctionExpression(null, params.params, method));\n\t };\n\t Parser.prototype.parseObjectPropertyKey = function () {\n\t var node = this.createNode();\n\t var token = this.nextToken();\n\t var key;\n\t switch (token.type) {\n\t case 8 /* StringLiteral */:\n\t case 6 /* NumericLiteral */:\n\t if (this.context.strict && token.octal) {\n\t this.tolerateUnexpectedToken(token, messages_1.Messages.StrictOctalLiteral);\n\t }\n\t var raw = this.getTokenRaw(token);\n\t key = this.finalize(node, new Node.Literal(token.value, raw));\n\t break;\n\t case 3 /* Identifier */:\n\t case 1 /* BooleanLiteral */:\n\t case 5 /* NullLiteral */:\n\t case 4 /* Keyword */:\n\t key = this.finalize(node, new Node.Identifier(token.value));\n\t break;\n\t case 7 /* Punctuator */:\n\t if (token.value === '[') {\n\t key = this.isolateCoverGrammar(this.parseAssignmentExpression);\n\t this.expect(']');\n\t }\n\t else {\n\t key = this.throwUnexpectedToken(token);\n\t }\n\t break;\n\t default:\n\t key = this.throwUnexpectedToken(token);\n\t }\n\t return key;\n\t };\n\t Parser.prototype.isPropertyKey = function (key, value) {\n\t return (key.type === syntax_1.Syntax.Identifier && key.name === value) ||\n\t (key.type === syntax_1.Syntax.Literal && key.value === value);\n\t };\n\t Parser.prototype.parseObjectProperty = function (hasProto) {\n\t var node = this.createNode();\n\t var token = this.lookahead;\n\t var kind;\n\t var key = null;\n\t var value = null;\n\t var computed = false;\n\t var method = false;\n\t var shorthand = false;\n\t var isAsync = false;\n\t if (token.type === 3 /* Identifier */) {\n\t var id = token.value;\n\t this.nextToken();\n\t computed = this.match('[');\n\t isAsync = !this.hasLineTerminator && (id === 'async') &&\n\t !this.match(':') && !this.match('(') && !this.match('*') && !this.match(',');\n\t key = isAsync ? this.parseObjectPropertyKey() : this.finalize(node, new Node.Identifier(id));\n\t }\n\t else if (this.match('*')) {\n\t this.nextToken();\n\t }\n\t else {\n\t computed = this.match('[');\n\t key = this.parseObjectPropertyKey();\n\t }\n\t var lookaheadPropertyKey = this.qualifiedPropertyName(this.lookahead);\n\t if (token.type === 3 /* Identifier */ && !isAsync && token.value === 'get' && lookaheadPropertyKey) {\n\t kind = 'get';\n\t computed = this.match('[');\n\t key = this.parseObjectPropertyKey();\n\t this.context.allowYield = false;\n\t value = this.parseGetterMethod();\n\t }\n\t else if (token.type === 3 /* Identifier */ && !isAsync && token.value === 'set' && lookaheadPropertyKey) {\n\t kind = 'set';\n\t computed = this.match('[');\n\t key = this.parseObjectPropertyKey();\n\t value = this.parseSetterMethod();\n\t }\n\t else if (token.type === 7 /* Punctuator */ && token.value === '*' && lookaheadPropertyKey) {\n\t kind = 'init';\n\t computed = this.match('[');\n\t key = this.parseObjectPropertyKey();\n\t value = this.parseGeneratorMethod();\n\t method = true;\n\t }\n\t else {\n\t if (!key) {\n\t this.throwUnexpectedToken(this.lookahead);\n\t }\n\t kind = 'init';\n\t if (this.match(':') && !isAsync) {\n\t if (!computed && this.isPropertyKey(key, '__proto__')) {\n\t if (hasProto.value) {\n\t this.tolerateError(messages_1.Messages.DuplicateProtoProperty);\n\t }\n\t hasProto.value = true;\n\t }\n\t this.nextToken();\n\t value = this.inheritCoverGrammar(this.parseAssignmentExpression);\n\t }\n\t else if (this.match('(')) {\n\t value = isAsync ? this.parsePropertyMethodAsyncFunction() : this.parsePropertyMethodFunction();\n\t method = true;\n\t }\n\t else if (token.type === 3 /* Identifier */) {\n\t var id = this.finalize(node, new Node.Identifier(token.value));\n\t if (this.match('=')) {\n\t this.context.firstCoverInitializedNameError = this.lookahead;\n\t this.nextToken();\n\t shorthand = true;\n\t var init = this.isolateCoverGrammar(this.parseAssignmentExpression);\n\t value = this.finalize(node, new Node.AssignmentPattern(id, init));\n\t }\n\t else {\n\t shorthand = true;\n\t value = id;\n\t }\n\t }\n\t else {\n\t this.throwUnexpectedToken(this.nextToken());\n\t }\n\t }\n\t return this.finalize(node, new Node.Property(kind, key, computed, value, method, shorthand));\n\t };\n\t Parser.prototype.parseObjectInitializer = function () {\n\t var node = this.createNode();\n\t this.expect('{');\n\t var properties = [];\n\t var hasProto = { value: false };\n\t while (!this.match('}')) {\n\t properties.push(this.parseObjectProperty(hasProto));\n\t if (!this.match('}')) {\n\t this.expectCommaSeparator();\n\t }\n\t }\n\t this.expect('}');\n\t return this.finalize(node, new Node.ObjectExpression(properties));\n\t };\n\t // https://tc39.github.io/ecma262/#sec-template-literals\n\t Parser.prototype.parseTemplateHead = function () {\n\t assert_1.assert(this.lookahead.head, 'Template literal must start with a template head');\n\t var node = this.createNode();\n\t var token = this.nextToken();\n\t var raw = token.value;\n\t var cooked = token.cooked;\n\t return this.finalize(node, new Node.TemplateElement({ raw: raw, cooked: cooked }, token.tail));\n\t };\n\t Parser.prototype.parseTemplateElement = function () {\n\t if (this.lookahead.type !== 10 /* Template */) {\n\t this.throwUnexpectedToken();\n\t }\n\t var node = this.createNode();\n\t var token = this.nextToken();\n\t var raw = token.value;\n\t var cooked = token.cooked;\n\t return this.finalize(node, new Node.TemplateElement({ raw: raw, cooked: cooked }, token.tail));\n\t };\n\t Parser.prototype.parseTemplateLiteral = function () {\n\t var node = this.createNode();\n\t var expressions = [];\n\t var quasis = [];\n\t var quasi = this.parseTemplateHead();\n\t quasis.push(quasi);\n\t while (!quasi.tail) {\n\t expressions.push(this.parseExpression());\n\t quasi = this.parseTemplateElement();\n\t quasis.push(quasi);\n\t }\n\t return this.finalize(node, new Node.TemplateLiteral(quasis, expressions));\n\t };\n\t // https://tc39.github.io/ecma262/#sec-grouping-operator\n\t Parser.prototype.reinterpretExpressionAsPattern = function (expr) {\n\t switch (expr.type) {\n\t case syntax_1.Syntax.Identifier:\n\t case syntax_1.Syntax.MemberExpression:\n\t case syntax_1.Syntax.RestElement:\n\t case syntax_1.Syntax.AssignmentPattern:\n\t break;\n\t case syntax_1.Syntax.SpreadElement:\n\t expr.type = syntax_1.Syntax.RestElement;\n\t this.reinterpretExpressionAsPattern(expr.argument);\n\t break;\n\t case syntax_1.Syntax.ArrayExpression:\n\t expr.type = syntax_1.Syntax.ArrayPattern;\n\t for (var i = 0; i < expr.elements.length; i++) {\n\t if (expr.elements[i] !== null) {\n\t this.reinterpretExpressionAsPattern(expr.elements[i]);\n\t }\n\t }\n\t break;\n\t case syntax_1.Syntax.ObjectExpression:\n\t expr.type = syntax_1.Syntax.ObjectPattern;\n\t for (var i = 0; i < expr.properties.length; i++) {\n\t this.reinterpretExpressionAsPattern(expr.properties[i].value);\n\t }\n\t break;\n\t case syntax_1.Syntax.AssignmentExpression:\n\t expr.type = syntax_1.Syntax.AssignmentPattern;\n\t delete expr.operator;\n\t this.reinterpretExpressionAsPattern(expr.left);\n\t break;\n\t default:\n\t // Allow other node type for tolerant parsing.\n\t break;\n\t }\n\t };\n\t Parser.prototype.parseGroupExpression = function () {\n\t var expr;\n\t this.expect('(');\n\t if (this.match(')')) {\n\t this.nextToken();\n\t if (!this.match('=>')) {\n\t this.expect('=>');\n\t }\n\t expr = {\n\t type: ArrowParameterPlaceHolder,\n\t params: [],\n\t async: false\n\t };\n\t }\n\t else {\n\t var startToken = this.lookahead;\n\t var params = [];\n\t if (this.match('...')) {\n\t expr = this.parseRestElement(params);\n\t this.expect(')');\n\t if (!this.match('=>')) {\n\t this.expect('=>');\n\t }\n\t expr = {\n\t type: ArrowParameterPlaceHolder,\n\t params: [expr],\n\t async: false\n\t };\n\t }\n\t else {\n\t var arrow = false;\n\t this.context.isBindingElement = true;\n\t expr = this.inheritCoverGrammar(this.parseAssignmentExpression);\n\t if (this.match(',')) {\n\t var expressions = [];\n\t this.context.isAssignmentTarget = false;\n\t expressions.push(expr);\n\t while (this.lookahead.type !== 2 /* EOF */) {\n\t if (!this.match(',')) {\n\t break;\n\t }\n\t this.nextToken();\n\t if (this.match(')')) {\n\t this.nextToken();\n\t for (var i = 0; i < expressions.length; i++) {\n\t this.reinterpretExpressionAsPattern(expressions[i]);\n\t }\n\t arrow = true;\n\t expr = {\n\t type: ArrowParameterPlaceHolder,\n\t params: expressions,\n\t async: false\n\t };\n\t }\n\t else if (this.match('...')) {\n\t if (!this.context.isBindingElement) {\n\t this.throwUnexpectedToken(this.lookahead);\n\t }\n\t expressions.push(this.parseRestElement(params));\n\t this.expect(')');\n\t if (!this.match('=>')) {\n\t this.expect('=>');\n\t }\n\t this.context.isBindingElement = false;\n\t for (var i = 0; i < expressions.length; i++) {\n\t this.reinterpretExpressionAsPattern(expressions[i]);\n\t }\n\t arrow = true;\n\t expr = {\n\t type: ArrowParameterPlaceHolder,\n\t params: expressions,\n\t async: false\n\t };\n\t }\n\t else {\n\t expressions.push(this.inheritCoverGrammar(this.parseAssignmentExpression));\n\t }\n\t if (arrow) {\n\t break;\n\t }\n\t }\n\t if (!arrow) {\n\t expr = this.finalize(this.startNode(startToken), new Node.SequenceExpression(expressions));\n\t }\n\t }\n\t if (!arrow) {\n\t this.expect(')');\n\t if (this.match('=>')) {\n\t if (expr.type === syntax_1.Syntax.Identifier && expr.name === 'yield') {\n\t arrow = true;\n\t expr = {\n\t type: ArrowParameterPlaceHolder,\n\t params: [expr],\n\t async: false\n\t };\n\t }\n\t if (!arrow) {\n\t if (!this.context.isBindingElement) {\n\t this.throwUnexpectedToken(this.lookahead);\n\t }\n\t if (expr.type === syntax_1.Syntax.SequenceExpression) {\n\t for (var i = 0; i < expr.expressions.length; i++) {\n\t this.reinterpretExpressionAsPattern(expr.expressions[i]);\n\t }\n\t }\n\t else {\n\t this.reinterpretExpressionAsPattern(expr);\n\t }\n\t var parameters = (expr.type === syntax_1.Syntax.SequenceExpression ? expr.expressions : [expr]);\n\t expr = {\n\t type: ArrowParameterPlaceHolder,\n\t params: parameters,\n\t async: false\n\t };\n\t }\n\t }\n\t this.context.isBindingElement = false;\n\t }\n\t }\n\t }\n\t return expr;\n\t };\n\t // https://tc39.github.io/ecma262/#sec-left-hand-side-expressions\n\t Parser.prototype.parseArguments = function () {\n\t this.expect('(');\n\t var args = [];\n\t if (!this.match(')')) {\n\t while (true) {\n\t var expr = this.match('...') ? this.parseSpreadElement() :\n\t this.isolateCoverGrammar(this.parseAssignmentExpression);\n\t args.push(expr);\n\t if (this.match(')')) {\n\t break;\n\t }\n\t this.expectCommaSeparator();\n\t if (this.match(')')) {\n\t break;\n\t }\n\t }\n\t }\n\t this.expect(')');\n\t return args;\n\t };\n\t Parser.prototype.isIdentifierName = function (token) {\n\t return token.type === 3 /* Identifier */ ||\n\t token.type === 4 /* Keyword */ ||\n\t token.type === 1 /* BooleanLiteral */ ||\n\t token.type === 5 /* NullLiteral */;\n\t };\n\t Parser.prototype.parseIdentifierName = function () {\n\t var node = this.createNode();\n\t var token = this.nextToken();\n\t if (!this.isIdentifierName(token)) {\n\t this.throwUnexpectedToken(token);\n\t }\n\t return this.finalize(node, new Node.Identifier(token.value));\n\t };\n\t Parser.prototype.parseNewExpression = function () {\n\t var node = this.createNode();\n\t var id = this.parseIdentifierName();\n\t assert_1.assert(id.name === 'new', 'New expression must start with `new`');\n\t var expr;\n\t if (this.match('.')) {\n\t this.nextToken();\n\t if (this.lookahead.type === 3 /* Identifier */ && this.context.inFunctionBody && this.lookahead.value === 'target') {\n\t var property = this.parseIdentifierName();\n\t expr = new Node.MetaProperty(id, property);\n\t }\n\t else {\n\t this.throwUnexpectedToken(this.lookahead);\n\t }\n\t }\n\t else {\n\t var callee = this.isolateCoverGrammar(this.parseLeftHandSideExpression);\n\t var args = this.match('(') ? this.parseArguments() : [];\n\t expr = new Node.NewExpression(callee, args);\n\t this.context.isAssignmentTarget = false;\n\t this.context.isBindingElement = false;\n\t }\n\t return this.finalize(node, expr);\n\t };\n\t Parser.prototype.parseAsyncArgument = function () {\n\t var arg = this.parseAssignmentExpression();\n\t this.context.firstCoverInitializedNameError = null;\n\t return arg;\n\t };\n\t Parser.prototype.parseAsyncArguments = function () {\n\t this.expect('(');\n\t var args = [];\n\t if (!this.match(')')) {\n\t while (true) {\n\t var expr = this.match('...') ? this.parseSpreadElement() :\n\t this.isolateCoverGrammar(this.parseAsyncArgument);\n\t args.push(expr);\n\t if (this.match(')')) {\n\t break;\n\t }\n\t this.expectCommaSeparator();\n\t if (this.match(')')) {\n\t break;\n\t }\n\t }\n\t }\n\t this.expect(')');\n\t return args;\n\t };\n\t Parser.prototype.parseLeftHandSideExpressionAllowCall = function () {\n\t var startToken = this.lookahead;\n\t var maybeAsync = this.matchContextualKeyword('async');\n\t var previousAllowIn = this.context.allowIn;\n\t this.context.allowIn = true;\n\t var expr;\n\t if (this.matchKeyword('super') && this.context.inFunctionBody) {\n\t expr = this.createNode();\n\t this.nextToken();\n\t expr = this.finalize(expr, new Node.Super());\n\t if (!this.match('(') && !this.match('.') && !this.match('[')) {\n\t this.throwUnexpectedToken(this.lookahead);\n\t }\n\t }\n\t else {\n\t expr = this.inheritCoverGrammar(this.matchKeyword('new') ? this.parseNewExpression : this.parsePrimaryExpression);\n\t }\n\t while (true) {\n\t if (this.match('.')) {\n\t this.context.isBindingElement = false;\n\t this.context.isAssignmentTarget = true;\n\t this.expect('.');\n\t var property = this.parseIdentifierName();\n\t expr = this.finalize(this.startNode(startToken), new Node.StaticMemberExpression(expr, property));\n\t }\n\t else if (this.match('(')) {\n\t var asyncArrow = maybeAsync && (startToken.lineNumber === this.lookahead.lineNumber);\n\t this.context.isBindingElement = false;\n\t this.context.isAssignmentTarget = false;\n\t var args = asyncArrow ? this.parseAsyncArguments() : this.parseArguments();\n\t expr = this.finalize(this.startNode(startToken), new Node.CallExpression(expr, args));\n\t if (asyncArrow && this.match('=>')) {\n\t for (var i = 0; i < args.length; ++i) {\n\t this.reinterpretExpressionAsPattern(args[i]);\n\t }\n\t expr = {\n\t type: ArrowParameterPlaceHolder,\n\t params: args,\n\t async: true\n\t };\n\t }\n\t }\n\t else if (this.match('[')) {\n\t this.context.isBindingElement = false;\n\t this.context.isAssignmentTarget = true;\n\t this.expect('[');\n\t var property = this.isolateCoverGrammar(this.parseExpression);\n\t this.expect(']');\n\t expr = this.finalize(this.startNode(startToken), new Node.ComputedMemberExpression(expr, property));\n\t }\n\t else if (this.lookahead.type === 10 /* Template */ && this.lookahead.head) {\n\t var quasi = this.parseTemplateLiteral();\n\t expr = this.finalize(this.startNode(startToken), new Node.TaggedTemplateExpression(expr, quasi));\n\t }\n\t else {\n\t break;\n\t }\n\t }\n\t this.context.allowIn = previousAllowIn;\n\t return expr;\n\t };\n\t Parser.prototype.parseSuper = function () {\n\t var node = this.createNode();\n\t this.expectKeyword('super');\n\t if (!this.match('[') && !this.match('.')) {\n\t this.throwUnexpectedToken(this.lookahead);\n\t }\n\t return this.finalize(node, new Node.Super());\n\t };\n\t Parser.prototype.parseLeftHandSideExpression = function () {\n\t assert_1.assert(this.context.allowIn, 'callee of new expression always allow in keyword.');\n\t var node = this.startNode(this.lookahead);\n\t var expr = (this.matchKeyword('super') && this.context.inFunctionBody) ? this.parseSuper() :\n\t this.inheritCoverGrammar(this.matchKeyword('new') ? this.parseNewExpression : this.parsePrimaryExpression);\n\t while (true) {\n\t if (this.match('[')) {\n\t this.context.isBindingElement = false;\n\t this.context.isAssignmentTarget = true;\n\t this.expect('[');\n\t var property = this.isolateCoverGrammar(this.parseExpression);\n\t this.expect(']');\n\t expr = this.finalize(node, new Node.ComputedMemberExpression(expr, property));\n\t }\n\t else if (this.match('.')) {\n\t this.context.isBindingElement = false;\n\t this.context.isAssignmentTarget = true;\n\t this.expect('.');\n\t var property = this.parseIdentifierName();\n\t expr = this.finalize(node, new Node.StaticMemberExpression(expr, property));\n\t }\n\t else if (this.lookahead.type === 10 /* Template */ && this.lookahead.head) {\n\t var quasi = this.parseTemplateLiteral();\n\t expr = this.finalize(node, new Node.TaggedTemplateExpression(expr, quasi));\n\t }\n\t else {\n\t break;\n\t }\n\t }\n\t return expr;\n\t };\n\t // https://tc39.github.io/ecma262/#sec-update-expressions\n\t Parser.prototype.parseUpdateExpression = function () {\n\t var expr;\n\t var startToken = this.lookahead;\n\t if (this.match('++') || this.match('--')) {\n\t var node = this.startNode(startToken);\n\t var token = this.nextToken();\n\t expr = this.inheritCoverGrammar(this.parseUnaryExpression);\n\t if (this.context.strict && expr.type === syntax_1.Syntax.Identifier && this.scanner.isRestrictedWord(expr.name)) {\n\t this.tolerateError(messages_1.Messages.StrictLHSPrefix);\n\t }\n\t if (!this.context.isAssignmentTarget) {\n\t this.tolerateError(messages_1.Messages.InvalidLHSInAssignment);\n\t }\n\t var prefix = true;\n\t expr = this.finalize(node, new Node.UpdateExpression(token.value, expr, prefix));\n\t this.context.isAssignmentTarget = false;\n\t this.context.isBindingElement = false;\n\t }\n\t else {\n\t expr = this.inheritCoverGrammar(this.parseLeftHandSideExpressionAllowCall);\n\t if (!this.hasLineTerminator && this.lookahead.type === 7 /* Punctuator */) {\n\t if (this.match('++') || this.match('--')) {\n\t if (this.context.strict && expr.type === syntax_1.Syntax.Identifier && this.scanner.isRestrictedWord(expr.name)) {\n\t this.tolerateError(messages_1.Messages.StrictLHSPostfix);\n\t }\n\t if (!this.context.isAssignmentTarget) {\n\t this.tolerateError(messages_1.Messages.InvalidLHSInAssignment);\n\t }\n\t this.context.isAssignmentTarget = false;\n\t this.context.isBindingElement = false;\n\t var operator = this.nextToken().value;\n\t var prefix = false;\n\t expr = this.finalize(this.startNode(startToken), new Node.UpdateExpression(operator, expr, prefix));\n\t }\n\t }\n\t }\n\t return expr;\n\t };\n\t // https://tc39.github.io/ecma262/#sec-unary-operators\n\t Parser.prototype.parseAwaitExpression = function () {\n\t var node = this.createNode();\n\t this.nextToken();\n\t var argument = this.parseUnaryExpression();\n\t return this.finalize(node, new Node.AwaitExpression(argument));\n\t };\n\t Parser.prototype.parseUnaryExpression = function () {\n\t var expr;\n\t if (this.match('+') || this.match('-') || this.match('~') || this.match('!') ||\n\t this.matchKeyword('delete') || this.matchKeyword('void') || this.matchKeyword('typeof')) {\n\t var node = this.startNode(this.lookahead);\n\t var token = this.nextToken();\n\t expr = this.inheritCoverGrammar(this.parseUnaryExpression);\n\t expr = this.finalize(node, new Node.UnaryExpression(token.value, expr));\n\t if (this.context.strict && expr.operator === 'delete' && expr.argument.type === syntax_1.Syntax.Identifier) {\n\t this.tolerateError(messages_1.Messages.StrictDelete);\n\t }\n\t this.context.isAssignmentTarget = false;\n\t this.context.isBindingElement = false;\n\t }\n\t else if (this.context.await && this.matchContextualKeyword('await')) {\n\t expr = this.parseAwaitExpression();\n\t }\n\t else {\n\t expr = this.parseUpdateExpression();\n\t }\n\t return expr;\n\t };\n\t Parser.prototype.parseExponentiationExpression = function () {\n\t var startToken = this.lookahead;\n\t var expr = this.inheritCoverGrammar(this.parseUnaryExpression);\n\t if (expr.type !== syntax_1.Syntax.UnaryExpression && this.match('**')) {\n\t this.nextToken();\n\t this.context.isAssignmentTarget = false;\n\t this.context.isBindingElement = false;\n\t var left = expr;\n\t var right = this.isolateCoverGrammar(this.parseExponentiationExpression);\n\t expr = this.finalize(this.startNode(startToken), new Node.BinaryExpression('**', left, right));\n\t }\n\t return expr;\n\t };\n\t // https://tc39.github.io/ecma262/#sec-exp-operator\n\t // https://tc39.github.io/ecma262/#sec-multiplicative-operators\n\t // https://tc39.github.io/ecma262/#sec-additive-operators\n\t // https://tc39.github.io/ecma262/#sec-bitwise-shift-operators\n\t // https://tc39.github.io/ecma262/#sec-relational-operators\n\t // https://tc39.github.io/ecma262/#sec-equality-operators\n\t // https://tc39.github.io/ecma262/#sec-binary-bitwise-operators\n\t // https://tc39.github.io/ecma262/#sec-binary-logical-operators\n\t Parser.prototype.binaryPrecedence = function (token) {\n\t var op = token.value;\n\t var precedence;\n\t if (token.type === 7 /* Punctuator */) {\n\t precedence = this.operatorPrecedence[op] || 0;\n\t }\n\t else if (token.type === 4 /* Keyword */) {\n\t precedence = (op === 'instanceof' || (this.context.allowIn && op === 'in')) ? 7 : 0;\n\t }\n\t else {\n\t precedence = 0;\n\t }\n\t return precedence;\n\t };\n\t Parser.prototype.parseBinaryExpression = function () {\n\t var startToken = this.lookahead;\n\t var expr = this.inheritCoverGrammar(this.parseExponentiationExpression);\n\t var token = this.lookahead;\n\t var prec = this.binaryPrecedence(token);\n\t if (prec > 0) {\n\t this.nextToken();\n\t this.context.isAssignmentTarget = false;\n\t this.context.isBindingElement = false;\n\t var markers = [startToken, this.lookahead];\n\t var left = expr;\n\t var right = this.isolateCoverGrammar(this.parseExponentiationExpression);\n\t var stack = [left, token.value, right];\n\t var precedences = [prec];\n\t while (true) {\n\t prec = this.binaryPrecedence(this.lookahead);\n\t if (prec <= 0) {\n\t break;\n\t }\n\t // Reduce: make a binary expression from the three topmost entries.\n\t while ((stack.length > 2) && (prec <= precedences[precedences.length - 1])) {\n\t right = stack.pop();\n\t var operator = stack.pop();\n\t precedences.pop();\n\t left = stack.pop();\n\t markers.pop();\n\t var node = this.startNode(markers[markers.length - 1]);\n\t stack.push(this.finalize(node, new Node.BinaryExpression(operator, left, right)));\n\t }\n\t // Shift.\n\t stack.push(this.nextToken().value);\n\t precedences.push(prec);\n\t markers.push(this.lookahead);\n\t stack.push(this.isolateCoverGrammar(this.parseExponentiationExpression));\n\t }\n\t // Final reduce to clean-up the stack.\n\t var i = stack.length - 1;\n\t expr = stack[i];\n\t var lastMarker = markers.pop();\n\t while (i > 1) {\n\t var marker = markers.pop();\n\t var lastLineStart = lastMarker && lastMarker.lineStart;\n\t var node = this.startNode(marker, lastLineStart);\n\t var operator = stack[i - 1];\n\t expr = this.finalize(node, new Node.BinaryExpression(operator, stack[i - 2], expr));\n\t i -= 2;\n\t lastMarker = marker;\n\t }\n\t }\n\t return expr;\n\t };\n\t // https://tc39.github.io/ecma262/#sec-conditional-operator\n\t Parser.prototype.parseConditionalExpression = function () {\n\t var startToken = this.lookahead;\n\t var expr = this.inheritCoverGrammar(this.parseBinaryExpression);\n\t if (this.match('?')) {\n\t this.nextToken();\n\t var previousAllowIn = this.context.allowIn;\n\t this.context.allowIn = true;\n\t var consequent = this.isolateCoverGrammar(this.parseAssignmentExpression);\n\t this.context.allowIn = previousAllowIn;\n\t this.expect(':');\n\t var alternate = this.isolateCoverGrammar(this.parseAssignmentExpression);\n\t expr = this.finalize(this.startNode(startToken), new Node.ConditionalExpression(expr, consequent, alternate));\n\t this.context.isAssignmentTarget = false;\n\t this.context.isBindingElement = false;\n\t }\n\t return expr;\n\t };\n\t // https://tc39.github.io/ecma262/#sec-assignment-operators\n\t Parser.prototype.checkPatternParam = function (options, param) {\n\t switch (param.type) {\n\t case syntax_1.Syntax.Identifier:\n\t this.validateParam(options, param, param.name);\n\t break;\n\t case syntax_1.Syntax.RestElement:\n\t this.checkPatternParam(options, param.argument);\n\t break;\n\t case syntax_1.Syntax.AssignmentPattern:\n\t this.checkPatternParam(options, param.left);\n\t break;\n\t case syntax_1.Syntax.ArrayPattern:\n\t for (var i = 0; i < param.elements.length; i++) {\n\t if (param.elements[i] !== null) {\n\t this.checkPatternParam(options, param.elements[i]);\n\t }\n\t }\n\t break;\n\t case syntax_1.Syntax.ObjectPattern:\n\t for (var i = 0; i < param.properties.length; i++) {\n\t this.checkPatternParam(options, param.properties[i].value);\n\t }\n\t break;\n\t default:\n\t break;\n\t }\n\t options.simple = options.simple && (param instanceof Node.Identifier);\n\t };\n\t Parser.prototype.reinterpretAsCoverFormalsList = function (expr) {\n\t var params = [expr];\n\t var options;\n\t var asyncArrow = false;\n\t switch (expr.type) {\n\t case syntax_1.Syntax.Identifier:\n\t break;\n\t case ArrowParameterPlaceHolder:\n\t params = expr.params;\n\t asyncArrow = expr.async;\n\t break;\n\t default:\n\t return null;\n\t }\n\t options = {\n\t simple: true,\n\t paramSet: {}\n\t };\n\t for (var i = 0; i < params.length; ++i) {\n\t var param = params[i];\n\t if (param.type === syntax_1.Syntax.AssignmentPattern) {\n\t if (param.right.type === syntax_1.Syntax.YieldExpression) {\n\t if (param.right.argument) {\n\t this.throwUnexpectedToken(this.lookahead);\n\t }\n\t param.right.type = syntax_1.Syntax.Identifier;\n\t param.right.name = 'yield';\n\t delete param.right.argument;\n\t delete param.right.delegate;\n\t }\n\t }\n\t else if (asyncArrow && param.type === syntax_1.Syntax.Identifier && param.name === 'await') {\n\t this.throwUnexpectedToken(this.lookahead);\n\t }\n\t this.checkPatternParam(options, param);\n\t params[i] = param;\n\t }\n\t if (this.context.strict || !this.context.allowYield) {\n\t for (var i = 0; i < params.length; ++i) {\n\t var param = params[i];\n\t if (param.type === syntax_1.Syntax.YieldExpression) {\n\t this.throwUnexpectedToken(this.lookahead);\n\t }\n\t }\n\t }\n\t if (options.message === messages_1.Messages.StrictParamDupe) {\n\t var token = this.context.strict ? options.stricted : options.firstRestricted;\n\t this.throwUnexpectedToken(token, options.message);\n\t }\n\t return {\n\t simple: options.simple,\n\t params: params,\n\t stricted: options.stricted,\n\t firstRestricted: options.firstRestricted,\n\t message: options.message\n\t };\n\t };\n\t Parser.prototype.parseAssignmentExpression = function () {\n\t var expr;\n\t if (!this.context.allowYield && this.matchKeyword('yield')) {\n\t expr = this.parseYieldExpression();\n\t }\n\t else {\n\t var startToken = this.lookahead;\n\t var token = startToken;\n\t expr = this.parseConditionalExpression();\n\t if (token.type === 3 /* Identifier */ && (token.lineNumber === this.lookahead.lineNumber) && token.value === 'async') {\n\t if (this.lookahead.type === 3 /* Identifier */ || this.matchKeyword('yield')) {\n\t var arg = this.parsePrimaryExpression();\n\t this.reinterpretExpressionAsPattern(arg);\n\t expr = {\n\t type: ArrowParameterPlaceHolder,\n\t params: [arg],\n\t async: true\n\t };\n\t }\n\t }\n\t if (expr.type === ArrowParameterPlaceHolder || this.match('=>')) {\n\t // https://tc39.github.io/ecma262/#sec-arrow-function-definitions\n\t this.context.isAssignmentTarget = false;\n\t this.context.isBindingElement = false;\n\t var isAsync = expr.async;\n\t var list = this.reinterpretAsCoverFormalsList(expr);\n\t if (list) {\n\t if (this.hasLineTerminator) {\n\t this.tolerateUnexpectedToken(this.lookahead);\n\t }\n\t this.context.firstCoverInitializedNameError = null;\n\t var previousStrict = this.context.strict;\n\t var previousAllowStrictDirective = this.context.allowStrictDirective;\n\t this.context.allowStrictDirective = list.simple;\n\t var previousAllowYield = this.context.allowYield;\n\t var previousAwait = this.context.await;\n\t this.context.allowYield = true;\n\t this.context.await = isAsync;\n\t var node = this.startNode(startToken);\n\t this.expect('=>');\n\t var body = void 0;\n\t if (this.match('{')) {\n\t var previousAllowIn = this.context.allowIn;\n\t this.context.allowIn = true;\n\t body = this.parseFunctionSourceElements();\n\t this.context.allowIn = previousAllowIn;\n\t }\n\t else {\n\t body = this.isolateCoverGrammar(this.parseAssignmentExpression);\n\t }\n\t var expression = body.type !== syntax_1.Syntax.BlockStatement;\n\t if (this.context.strict && list.firstRestricted) {\n\t this.throwUnexpectedToken(list.firstRestricted, list.message);\n\t }\n\t if (this.context.strict && list.stricted) {\n\t this.tolerateUnexpectedToken(list.stricted, list.message);\n\t }\n\t expr = isAsync ? this.finalize(node, new Node.AsyncArrowFunctionExpression(list.params, body, expression)) :\n\t this.finalize(node, new Node.ArrowFunctionExpression(list.params, body, expression));\n\t this.context.strict = previousStrict;\n\t this.context.allowStrictDirective = previousAllowStrictDirective;\n\t this.context.allowYield = previousAllowYield;\n\t this.context.await = previousAwait;\n\t }\n\t }\n\t else {\n\t if (this.matchAssign()) {\n\t if (!this.context.isAssignmentTarget) {\n\t this.tolerateError(messages_1.Messages.InvalidLHSInAssignment);\n\t }\n\t if (this.context.strict && expr.type === syntax_1.Syntax.Identifier) {\n\t var id = expr;\n\t if (this.scanner.isRestrictedWord(id.name)) {\n\t this.tolerateUnexpectedToken(token, messages_1.Messages.StrictLHSAssignment);\n\t }\n\t if (this.scanner.isStrictModeReservedWord(id.name)) {\n\t this.tolerateUnexpectedToken(token, messages_1.Messages.StrictReservedWord);\n\t }\n\t }\n\t if (!this.match('=')) {\n\t this.context.isAssignmentTarget = false;\n\t this.context.isBindingElement = false;\n\t }\n\t else {\n\t this.reinterpretExpressionAsPattern(expr);\n\t }\n\t token = this.nextToken();\n\t var operator = token.value;\n\t var right = this.isolateCoverGrammar(this.parseAssignmentExpression);\n\t expr = this.finalize(this.startNode(startToken), new Node.AssignmentExpression(operator, expr, right));\n\t this.context.firstCoverInitializedNameError = null;\n\t }\n\t }\n\t }\n\t return expr;\n\t };\n\t // https://tc39.github.io/ecma262/#sec-comma-operator\n\t Parser.prototype.parseExpression = function () {\n\t var startToken = this.lookahead;\n\t var expr = this.isolateCoverGrammar(this.parseAssignmentExpression);\n\t if (this.match(',')) {\n\t var expressions = [];\n\t expressions.push(expr);\n\t while (this.lookahead.type !== 2 /* EOF */) {\n\t if (!this.match(',')) {\n\t break;\n\t }\n\t this.nextToken();\n\t expressions.push(this.isolateCoverGrammar(this.parseAssignmentExpression));\n\t }\n\t expr = this.finalize(this.startNode(startToken), new Node.SequenceExpression(expressions));\n\t }\n\t return expr;\n\t };\n\t // https://tc39.github.io/ecma262/#sec-block\n\t Parser.prototype.parseStatementListItem = function () {\n\t var statement;\n\t this.context.isAssignmentTarget = true;\n\t this.context.isBindingElement = true;\n\t if (this.lookahead.type === 4 /* Keyword */) {\n\t switch (this.lookahead.value) {\n\t case 'export':\n\t if (!this.context.isModule) {\n\t this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.IllegalExportDeclaration);\n\t }\n\t statement = this.parseExportDeclaration();\n\t break;\n\t case 'import':\n\t if (!this.context.isModule) {\n\t this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.IllegalImportDeclaration);\n\t }\n\t statement = this.parseImportDeclaration();\n\t break;\n\t case 'const':\n\t statement = this.parseLexicalDeclaration({ inFor: false });\n\t break;\n\t case 'function':\n\t statement = this.parseFunctionDeclaration();\n\t break;\n\t case 'class':\n\t statement = this.parseClassDeclaration();\n\t break;\n\t case 'let':\n\t statement = this.isLexicalDeclaration() ? this.parseLexicalDeclaration({ inFor: false }) : this.parseStatement();\n\t break;\n\t default:\n\t statement = this.parseStatement();\n\t break;\n\t }\n\t }\n\t else {\n\t statement = this.parseStatement();\n\t }\n\t return statement;\n\t };\n\t Parser.prototype.parseBlock = function () {\n\t var node = this.createNode();\n\t this.expect('{');\n\t var block = [];\n\t while (true) {\n\t if (this.match('}')) {\n\t break;\n\t }\n\t block.push(this.parseStatementListItem());\n\t }\n\t this.expect('}');\n\t return this.finalize(node, new Node.BlockStatement(block));\n\t };\n\t // https://tc39.github.io/ecma262/#sec-let-and-const-declarations\n\t Parser.prototype.parseLexicalBinding = function (kind, options) {\n\t var node = this.createNode();\n\t var params = [];\n\t var id = this.parsePattern(params, kind);\n\t if (this.context.strict && id.type === syntax_1.Syntax.Identifier) {\n\t if (this.scanner.isRestrictedWord(id.name)) {\n\t this.tolerateError(messages_1.Messages.StrictVarName);\n\t }\n\t }\n\t var init = null;\n\t if (kind === 'const') {\n\t if (!this.matchKeyword('in') && !this.matchContextualKeyword('of')) {\n\t if (this.match('=')) {\n\t this.nextToken();\n\t init = this.isolateCoverGrammar(this.parseAssignmentExpression);\n\t }\n\t else {\n\t this.throwError(messages_1.Messages.DeclarationMissingInitializer, 'const');\n\t }\n\t }\n\t }\n\t else if ((!options.inFor && id.type !== syntax_1.Syntax.Identifier) || this.match('=')) {\n\t this.expect('=');\n\t init = this.isolateCoverGrammar(this.parseAssignmentExpression);\n\t }\n\t return this.finalize(node, new Node.VariableDeclarator(id, init));\n\t };\n\t Parser.prototype.parseBindingList = function (kind, options) {\n\t var list = [this.parseLexicalBinding(kind, options)];\n\t while (this.match(',')) {\n\t this.nextToken();\n\t list.push(this.parseLexicalBinding(kind, options));\n\t }\n\t return list;\n\t };\n\t Parser.prototype.isLexicalDeclaration = function () {\n\t var state = this.scanner.saveState();\n\t this.scanner.scanComments();\n\t var next = this.scanner.lex();\n\t this.scanner.restoreState(state);\n\t return (next.type === 3 /* Identifier */) ||\n\t (next.type === 7 /* Punctuator */ && next.value === '[') ||\n\t (next.type === 7 /* Punctuator */ && next.value === '{') ||\n\t (next.type === 4 /* Keyword */ && next.value === 'let') ||\n\t (next.type === 4 /* Keyword */ && next.value === 'yield');\n\t };\n\t Parser.prototype.parseLexicalDeclaration = function (options) {\n\t var node = this.createNode();\n\t var kind = this.nextToken().value;\n\t assert_1.assert(kind === 'let' || kind === 'const', 'Lexical declaration must be either let or const');\n\t var declarations = this.parseBindingList(kind, options);\n\t this.consumeSemicolon();\n\t return this.finalize(node, new Node.VariableDeclaration(declarations, kind));\n\t };\n\t // https://tc39.github.io/ecma262/#sec-destructuring-binding-patterns\n\t Parser.prototype.parseBindingRestElement = function (params, kind) {\n\t var node = this.createNode();\n\t this.expect('...');\n\t var arg = this.parsePattern(params, kind);\n\t return this.finalize(node, new Node.RestElement(arg));\n\t };\n\t Parser.prototype.parseArrayPattern = function (params, kind) {\n\t var node = this.createNode();\n\t this.expect('[');\n\t var elements = [];\n\t while (!this.match(']')) {\n\t if (this.match(',')) {\n\t this.nextToken();\n\t elements.push(null);\n\t }\n\t else {\n\t if (this.match('...')) {\n\t elements.push(this.parseBindingRestElement(params, kind));\n\t break;\n\t }\n\t else {\n\t elements.push(this.parsePatternWithDefault(params, kind));\n\t }\n\t if (!this.match(']')) {\n\t this.expect(',');\n\t }\n\t }\n\t }\n\t this.expect(']');\n\t return this.finalize(node, new Node.ArrayPattern(elements));\n\t };\n\t Parser.prototype.parsePropertyPattern = function (params, kind) {\n\t var node = this.createNode();\n\t var computed = false;\n\t var shorthand = false;\n\t var method = false;\n\t var key;\n\t var value;\n\t if (this.lookahead.type === 3 /* Identifier */) {\n\t var keyToken = this.lookahead;\n\t key = this.parseVariableIdentifier();\n\t var init = this.finalize(node, new Node.Identifier(keyToken.value));\n\t if (this.match('=')) {\n\t params.push(keyToken);\n\t shorthand = true;\n\t this.nextToken();\n\t var expr = this.parseAssignmentExpression();\n\t value = this.finalize(this.startNode(keyToken), new Node.AssignmentPattern(init, expr));\n\t }\n\t else if (!this.match(':')) {\n\t params.push(keyToken);\n\t shorthand = true;\n\t value = init;\n\t }\n\t else {\n\t this.expect(':');\n\t value = this.parsePatternWithDefault(params, kind);\n\t }\n\t }\n\t else {\n\t computed = this.match('[');\n\t key = this.parseObjectPropertyKey();\n\t this.expect(':');\n\t value = this.parsePatternWithDefault(params, kind);\n\t }\n\t return this.finalize(node, new Node.Property('init', key, computed, value, method, shorthand));\n\t };\n\t Parser.prototype.parseObjectPattern = function (params, kind) {\n\t var node = this.createNode();\n\t var properties = [];\n\t this.expect('{');\n\t while (!this.match('}')) {\n\t properties.push(this.parsePropertyPattern(params, kind));\n\t if (!this.match('}')) {\n\t this.expect(',');\n\t }\n\t }\n\t this.expect('}');\n\t return this.finalize(node, new Node.ObjectPattern(properties));\n\t };\n\t Parser.prototype.parsePattern = function (params, kind) {\n\t var pattern;\n\t if (this.match('[')) {\n\t pattern = this.parseArrayPattern(params, kind);\n\t }\n\t else if (this.match('{')) {\n\t pattern = this.parseObjectPattern(params, kind);\n\t }\n\t else {\n\t if (this.matchKeyword('let') && (kind === 'const' || kind === 'let')) {\n\t this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.LetInLexicalBinding);\n\t }\n\t params.push(this.lookahead);\n\t pattern = this.parseVariableIdentifier(kind);\n\t }\n\t return pattern;\n\t };\n\t Parser.prototype.parsePatternWithDefault = function (params, kind) {\n\t var startToken = this.lookahead;\n\t var pattern = this.parsePattern(params, kind);\n\t if (this.match('=')) {\n\t this.nextToken();\n\t var previousAllowYield = this.context.allowYield;\n\t this.context.allowYield = true;\n\t var right = this.isolateCoverGrammar(this.parseAssignmentExpression);\n\t this.context.allowYield = previousAllowYield;\n\t pattern = this.finalize(this.startNode(startToken), new Node.AssignmentPattern(pattern, right));\n\t }\n\t return pattern;\n\t };\n\t // https://tc39.github.io/ecma262/#sec-variable-statement\n\t Parser.prototype.parseVariableIdentifier = function (kind) {\n\t var node = this.createNode();\n\t var token = this.nextToken();\n\t if (token.type === 4 /* Keyword */ && token.value === 'yield') {\n\t if (this.context.strict) {\n\t this.tolerateUnexpectedToken(token, messages_1.Messages.StrictReservedWord);\n\t }\n\t else if (!this.context.allowYield) {\n\t this.throwUnexpectedToken(token);\n\t }\n\t }\n\t else if (token.type !== 3 /* Identifier */) {\n\t if (this.context.strict && token.type === 4 /* Keyword */ && this.scanner.isStrictModeReservedWord(token.value)) {\n\t this.tolerateUnexpectedToken(token, messages_1.Messages.StrictReservedWord);\n\t }\n\t else {\n\t if (this.context.strict || token.value !== 'let' || kind !== 'var') {\n\t this.throwUnexpectedToken(token);\n\t }\n\t }\n\t }\n\t else if ((this.context.isModule || this.context.await) && token.type === 3 /* Identifier */ && token.value === 'await') {\n\t this.tolerateUnexpectedToken(token);\n\t }\n\t return this.finalize(node, new Node.Identifier(token.value));\n\t };\n\t Parser.prototype.parseVariableDeclaration = function (options) {\n\t var node = this.createNode();\n\t var params = [];\n\t var id = this.parsePattern(params, 'var');\n\t if (this.context.strict && id.type === syntax_1.Syntax.Identifier) {\n\t if (this.scanner.isRestrictedWord(id.name)) {\n\t this.tolerateError(messages_1.Messages.StrictVarName);\n\t }\n\t }\n\t var init = null;\n\t if (this.match('=')) {\n\t this.nextToken();\n\t init = this.isolateCoverGrammar(this.parseAssignmentExpression);\n\t }\n\t else if (id.type !== syntax_1.Syntax.Identifier && !options.inFor) {\n\t this.expect('=');\n\t }\n\t return this.finalize(node, new Node.VariableDeclarator(id, init));\n\t };\n\t Parser.prototype.parseVariableDeclarationList = function (options) {\n\t var opt = { inFor: options.inFor };\n\t var list = [];\n\t list.push(this.parseVariableDeclaration(opt));\n\t while (this.match(',')) {\n\t this.nextToken();\n\t list.push(this.parseVariableDeclaration(opt));\n\t }\n\t return list;\n\t };\n\t Parser.prototype.parseVariableStatement = function () {\n\t var node = this.createNode();\n\t this.expectKeyword('var');\n\t var declarations = this.parseVariableDeclarationList({ inFor: false });\n\t this.consumeSemicolon();\n\t return this.finalize(node, new Node.VariableDeclaration(declarations, 'var'));\n\t };\n\t // https://tc39.github.io/ecma262/#sec-empty-statement\n\t Parser.prototype.parseEmptyStatement = function () {\n\t var node = this.createNode();\n\t this.expect(';');\n\t return this.finalize(node, new Node.EmptyStatement());\n\t };\n\t // https://tc39.github.io/ecma262/#sec-expression-statement\n\t Parser.prototype.parseExpressionStatement = function () {\n\t var node = this.createNode();\n\t var expr = this.parseExpression();\n\t this.consumeSemicolon();\n\t return this.finalize(node, new Node.ExpressionStatement(expr));\n\t };\n\t // https://tc39.github.io/ecma262/#sec-if-statement\n\t Parser.prototype.parseIfClause = function () {\n\t if (this.context.strict && this.matchKeyword('function')) {\n\t this.tolerateError(messages_1.Messages.StrictFunction);\n\t }\n\t return this.parseStatement();\n\t };\n\t Parser.prototype.parseIfStatement = function () {\n\t var node = this.createNode();\n\t var consequent;\n\t var alternate = null;\n\t this.expectKeyword('if');\n\t this.expect('(');\n\t var test = this.parseExpression();\n\t if (!this.match(')') && this.config.tolerant) {\n\t this.tolerateUnexpectedToken(this.nextToken());\n\t consequent = this.finalize(this.createNode(), new Node.EmptyStatement());\n\t }\n\t else {\n\t this.expect(')');\n\t consequent = this.parseIfClause();\n\t if (this.matchKeyword('else')) {\n\t this.nextToken();\n\t alternate = this.parseIfClause();\n\t }\n\t }\n\t return this.finalize(node, new Node.IfStatement(test, consequent, alternate));\n\t };\n\t // https://tc39.github.io/ecma262/#sec-do-while-statement\n\t Parser.prototype.parseDoWhileStatement = function () {\n\t var node = this.createNode();\n\t this.expectKeyword('do');\n\t var previousInIteration = this.context.inIteration;\n\t this.context.inIteration = true;\n\t var body = this.parseStatement();\n\t this.context.inIteration = previousInIteration;\n\t this.expectKeyword('while');\n\t this.expect('(');\n\t var test = this.parseExpression();\n\t if (!this.match(')') && this.config.tolerant) {\n\t this.tolerateUnexpectedToken(this.nextToken());\n\t }\n\t else {\n\t this.expect(')');\n\t if (this.match(';')) {\n\t this.nextToken();\n\t }\n\t }\n\t return this.finalize(node, new Node.DoWhileStatement(body, test));\n\t };\n\t // https://tc39.github.io/ecma262/#sec-while-statement\n\t Parser.prototype.parseWhileStatement = function () {\n\t var node = this.createNode();\n\t var body;\n\t this.expectKeyword('while');\n\t this.expect('(');\n\t var test = this.parseExpression();\n\t if (!this.match(')') && this.config.tolerant) {\n\t this.tolerateUnexpectedToken(this.nextToken());\n\t body = this.finalize(this.createNode(), new Node.EmptyStatement());\n\t }\n\t else {\n\t this.expect(')');\n\t var previousInIteration = this.context.inIteration;\n\t this.context.inIteration = true;\n\t body = this.parseStatement();\n\t this.context.inIteration = previousInIteration;\n\t }\n\t return this.finalize(node, new Node.WhileStatement(test, body));\n\t };\n\t // https://tc39.github.io/ecma262/#sec-for-statement\n\t // https://tc39.github.io/ecma262/#sec-for-in-and-for-of-statements\n\t Parser.prototype.parseForStatement = function () {\n\t var init = null;\n\t var test = null;\n\t var update = null;\n\t var forIn = true;\n\t var left, right;\n\t var node = this.createNode();\n\t this.expectKeyword('for');\n\t this.expect('(');\n\t if (this.match(';')) {\n\t this.nextToken();\n\t }\n\t else {\n\t if (this.matchKeyword('var')) {\n\t init = this.createNode();\n\t this.nextToken();\n\t var previousAllowIn = this.context.allowIn;\n\t this.context.allowIn = false;\n\t var declarations = this.parseVariableDeclarationList({ inFor: true });\n\t this.context.allowIn = previousAllowIn;\n\t if (declarations.length === 1 && this.matchKeyword('in')) {\n\t var decl = declarations[0];\n\t if (decl.init && (decl.id.type === syntax_1.Syntax.ArrayPattern || decl.id.type === syntax_1.Syntax.ObjectPattern || this.context.strict)) {\n\t this.tolerateError(messages_1.Messages.ForInOfLoopInitializer, 'for-in');\n\t }\n\t init = this.finalize(init, new Node.VariableDeclaration(declarations, 'var'));\n\t this.nextToken();\n\t left = init;\n\t right = this.parseExpression();\n\t init = null;\n\t }\n\t else if (declarations.length === 1 && declarations[0].init === null && this.matchContextualKeyword('of')) {\n\t init = this.finalize(init, new Node.VariableDeclaration(declarations, 'var'));\n\t this.nextToken();\n\t left = init;\n\t right = this.parseAssignmentExpression();\n\t init = null;\n\t forIn = false;\n\t }\n\t else {\n\t init = this.finalize(init, new Node.VariableDeclaration(declarations, 'var'));\n\t this.expect(';');\n\t }\n\t }\n\t else if (this.matchKeyword('const') || this.matchKeyword('let')) {\n\t init = this.createNode();\n\t var kind = this.nextToken().value;\n\t if (!this.context.strict && this.lookahead.value === 'in') {\n\t init = this.finalize(init, new Node.Identifier(kind));\n\t this.nextToken();\n\t left = init;\n\t right = this.parseExpression();\n\t init = null;\n\t }\n\t else {\n\t var previousAllowIn = this.context.allowIn;\n\t this.context.allowIn = false;\n\t var declarations = this.parseBindingList(kind, { inFor: true });\n\t this.context.allowIn = previousAllowIn;\n\t if (declarations.length === 1 && declarations[0].init === null && this.matchKeyword('in')) {\n\t init = this.finalize(init, new Node.VariableDeclaration(declarations, kind));\n\t this.nextToken();\n\t left = init;\n\t right = this.parseExpression();\n\t init = null;\n\t }\n\t else if (declarations.length === 1 && declarations[0].init === null && this.matchContextualKeyword('of')) {\n\t init = this.finalize(init, new Node.VariableDeclaration(declarations, kind));\n\t this.nextToken();\n\t left = init;\n\t right = this.parseAssignmentExpression();\n\t init = null;\n\t forIn = false;\n\t }\n\t else {\n\t this.consumeSemicolon();\n\t init = this.finalize(init, new Node.VariableDeclaration(declarations, kind));\n\t }\n\t }\n\t }\n\t else {\n\t var initStartToken = this.lookahead;\n\t var previousAllowIn = this.context.allowIn;\n\t this.context.allowIn = false;\n\t init = this.inheritCoverGrammar(this.parseAssignmentExpression);\n\t this.context.allowIn = previousAllowIn;\n\t if (this.matchKeyword('in')) {\n\t if (!this.context.isAssignmentTarget || init.type === syntax_1.Syntax.AssignmentExpression) {\n\t this.tolerateError(messages_1.Messages.InvalidLHSInForIn);\n\t }\n\t this.nextToken();\n\t this.reinterpretExpressionAsPattern(init);\n\t left = init;\n\t right = this.parseExpression();\n\t init = null;\n\t }\n\t else if (this.matchContextualKeyword('of')) {\n\t if (!this.context.isAssignmentTarget || init.type === syntax_1.Syntax.AssignmentExpression) {\n\t this.tolerateError(messages_1.Messages.InvalidLHSInForLoop);\n\t }\n\t this.nextToken();\n\t this.reinterpretExpressionAsPattern(init);\n\t left = init;\n\t right = this.parseAssignmentExpression();\n\t init = null;\n\t forIn = false;\n\t }\n\t else {\n\t if (this.match(',')) {\n\t var initSeq = [init];\n\t while (this.match(',')) {\n\t this.nextToken();\n\t initSeq.push(this.isolateCoverGrammar(this.parseAssignmentExpression));\n\t }\n\t init = this.finalize(this.startNode(initStartToken), new Node.SequenceExpression(initSeq));\n\t }\n\t this.expect(';');\n\t }\n\t }\n\t }\n\t if (typeof left === 'undefined') {\n\t if (!this.match(';')) {\n\t test = this.parseExpression();\n\t }\n\t this.expect(';');\n\t if (!this.match(')')) {\n\t update = this.parseExpression();\n\t }\n\t }\n\t var body;\n\t if (!this.match(')') && this.config.tolerant) {\n\t this.tolerateUnexpectedToken(this.nextToken());\n\t body = this.finalize(this.createNode(), new Node.EmptyStatement());\n\t }\n\t else {\n\t this.expect(')');\n\t var previousInIteration = this.context.inIteration;\n\t this.context.inIteration = true;\n\t body = this.isolateCoverGrammar(this.parseStatement);\n\t this.context.inIteration = previousInIteration;\n\t }\n\t return (typeof left === 'undefined') ?\n\t this.finalize(node, new Node.ForStatement(init, test, update, body)) :\n\t forIn ? this.finalize(node, new Node.ForInStatement(left, right, body)) :\n\t this.finalize(node, new Node.ForOfStatement(left, right, body));\n\t };\n\t // https://tc39.github.io/ecma262/#sec-continue-statement\n\t Parser.prototype.parseContinueStatement = function () {\n\t var node = this.createNode();\n\t this.expectKeyword('continue');\n\t var label = null;\n\t if (this.lookahead.type === 3 /* Identifier */ && !this.hasLineTerminator) {\n\t var id = this.parseVariableIdentifier();\n\t label = id;\n\t var key = '$' + id.name;\n\t if (!Object.prototype.hasOwnProperty.call(this.context.labelSet, key)) {\n\t this.throwError(messages_1.Messages.UnknownLabel, id.name);\n\t }\n\t }\n\t this.consumeSemicolon();\n\t if (label === null && !this.context.inIteration) {\n\t this.throwError(messages_1.Messages.IllegalContinue);\n\t }\n\t return this.finalize(node, new Node.ContinueStatement(label));\n\t };\n\t // https://tc39.github.io/ecma262/#sec-break-statement\n\t Parser.prototype.parseBreakStatement = function () {\n\t var node = this.createNode();\n\t this.expectKeyword('break');\n\t var label = null;\n\t if (this.lookahead.type === 3 /* Identifier */ && !this.hasLineTerminator) {\n\t var id = this.parseVariableIdentifier();\n\t var key = '$' + id.name;\n\t if (!Object.prototype.hasOwnProperty.call(this.context.labelSet, key)) {\n\t this.throwError(messages_1.Messages.UnknownLabel, id.name);\n\t }\n\t label = id;\n\t }\n\t this.consumeSemicolon();\n\t if (label === null && !this.context.inIteration && !this.context.inSwitch) {\n\t this.throwError(messages_1.Messages.IllegalBreak);\n\t }\n\t return this.finalize(node, new Node.BreakStatement(label));\n\t };\n\t // https://tc39.github.io/ecma262/#sec-return-statement\n\t Parser.prototype.parseReturnStatement = function () {\n\t if (!this.context.inFunctionBody) {\n\t this.tolerateError(messages_1.Messages.IllegalReturn);\n\t }\n\t var node = this.createNode();\n\t this.expectKeyword('return');\n\t var hasArgument = (!this.match(';') && !this.match('}') &&\n\t !this.hasLineTerminator && this.lookahead.type !== 2 /* EOF */) ||\n\t this.lookahead.type === 8 /* StringLiteral */ ||\n\t this.lookahead.type === 10 /* Template */;\n\t var argument = hasArgument ? this.parseExpression() : null;\n\t this.consumeSemicolon();\n\t return this.finalize(node, new Node.ReturnStatement(argument));\n\t };\n\t // https://tc39.github.io/ecma262/#sec-with-statement\n\t Parser.prototype.parseWithStatement = function () {\n\t if (this.context.strict) {\n\t this.tolerateError(messages_1.Messages.StrictModeWith);\n\t }\n\t var node = this.createNode();\n\t var body;\n\t this.expectKeyword('with');\n\t this.expect('(');\n\t var object = this.parseExpression();\n\t if (!this.match(')') && this.config.tolerant) {\n\t this.tolerateUnexpectedToken(this.nextToken());\n\t body = this.finalize(this.createNode(), new Node.EmptyStatement());\n\t }\n\t else {\n\t this.expect(')');\n\t body = this.parseStatement();\n\t }\n\t return this.finalize(node, new Node.WithStatement(object, body));\n\t };\n\t // https://tc39.github.io/ecma262/#sec-switch-statement\n\t Parser.prototype.parseSwitchCase = function () {\n\t var node = this.createNode();\n\t var test;\n\t if (this.matchKeyword('default')) {\n\t this.nextToken();\n\t test = null;\n\t }\n\t else {\n\t this.expectKeyword('case');\n\t test = this.parseExpression();\n\t }\n\t this.expect(':');\n\t var consequent = [];\n\t while (true) {\n\t if (this.match('}') || this.matchKeyword('default') || this.matchKeyword('case')) {\n\t break;\n\t }\n\t consequent.push(this.parseStatementListItem());\n\t }\n\t return this.finalize(node, new Node.SwitchCase(test, consequent));\n\t };\n\t Parser.prototype.parseSwitchStatement = function () {\n\t var node = this.createNode();\n\t this.expectKeyword('switch');\n\t this.expect('(');\n\t var discriminant = this.parseExpression();\n\t this.expect(')');\n\t var previousInSwitch = this.context.inSwitch;\n\t this.context.inSwitch = true;\n\t var cases = [];\n\t var defaultFound = false;\n\t this.expect('{');\n\t while (true) {\n\t if (this.match('}')) {\n\t break;\n\t }\n\t var clause = this.parseSwitchCase();\n\t if (clause.test === null) {\n\t if (defaultFound) {\n\t this.throwError(messages_1.Messages.MultipleDefaultsInSwitch);\n\t }\n\t defaultFound = true;\n\t }\n\t cases.push(clause);\n\t }\n\t this.expect('}');\n\t this.context.inSwitch = previousInSwitch;\n\t return this.finalize(node, new Node.SwitchStatement(discriminant, cases));\n\t };\n\t // https://tc39.github.io/ecma262/#sec-labelled-statements\n\t Parser.prototype.parseLabelledStatement = function () {\n\t var node = this.createNode();\n\t var expr = this.parseExpression();\n\t var statement;\n\t if ((expr.type === syntax_1.Syntax.Identifier) && this.match(':')) {\n\t this.nextToken();\n\t var id = expr;\n\t var key = '$' + id.name;\n\t if (Object.prototype.hasOwnProperty.call(this.context.labelSet, key)) {\n\t this.throwError(messages_1.Messages.Redeclaration, 'Label', id.name);\n\t }\n\t this.context.labelSet[key] = true;\n\t var body = void 0;\n\t if (this.matchKeyword('class')) {\n\t this.tolerateUnexpectedToken(this.lookahead);\n\t body = this.parseClassDeclaration();\n\t }\n\t else if (this.matchKeyword('function')) {\n\t var token = this.lookahead;\n\t var declaration = this.parseFunctionDeclaration();\n\t if (this.context.strict) {\n\t this.tolerateUnexpectedToken(token, messages_1.Messages.StrictFunction);\n\t }\n\t else if (declaration.generator) {\n\t this.tolerateUnexpectedToken(token, messages_1.Messages.GeneratorInLegacyContext);\n\t }\n\t body = declaration;\n\t }\n\t else {\n\t body = this.parseStatement();\n\t }\n\t delete this.context.labelSet[key];\n\t statement = new Node.LabeledStatement(id, body);\n\t }\n\t else {\n\t this.consumeSemicolon();\n\t statement = new Node.ExpressionStatement(expr);\n\t }\n\t return this.finalize(node, statement);\n\t };\n\t // https://tc39.github.io/ecma262/#sec-throw-statement\n\t Parser.prototype.parseThrowStatement = function () {\n\t var node = this.createNode();\n\t this.expectKeyword('throw');\n\t if (this.hasLineTerminator) {\n\t this.throwError(messages_1.Messages.NewlineAfterThrow);\n\t }\n\t var argument = this.parseExpression();\n\t this.consumeSemicolon();\n\t return this.finalize(node, new Node.ThrowStatement(argument));\n\t };\n\t // https://tc39.github.io/ecma262/#sec-try-statement\n\t Parser.prototype.parseCatchClause = function () {\n\t var node = this.createNode();\n\t this.expectKeyword('catch');\n\t this.expect('(');\n\t if (this.match(')')) {\n\t this.throwUnexpectedToken(this.lookahead);\n\t }\n\t var params = [];\n\t var param = this.parsePattern(params);\n\t var paramMap = {};\n\t for (var i = 0; i < params.length; i++) {\n\t var key = '$' + params[i].value;\n\t if (Object.prototype.hasOwnProperty.call(paramMap, key)) {\n\t this.tolerateError(messages_1.Messages.DuplicateBinding, params[i].value);\n\t }\n\t paramMap[key] = true;\n\t }\n\t if (this.context.strict && param.type === syntax_1.Syntax.Identifier) {\n\t if (this.scanner.isRestrictedWord(param.name)) {\n\t this.tolerateError(messages_1.Messages.StrictCatchVariable);\n\t }\n\t }\n\t this.expect(')');\n\t var body = this.parseBlock();\n\t return this.finalize(node, new Node.CatchClause(param, body));\n\t };\n\t Parser.prototype.parseFinallyClause = function () {\n\t this.expectKeyword('finally');\n\t return this.parseBlock();\n\t };\n\t Parser.prototype.parseTryStatement = function () {\n\t var node = this.createNode();\n\t this.expectKeyword('try');\n\t var block = this.parseBlock();\n\t var handler = this.matchKeyword('catch') ? this.parseCatchClause() : null;\n\t var finalizer = this.matchKeyword('finally') ? this.parseFinallyClause() : null;\n\t if (!handler && !finalizer) {\n\t this.throwError(messages_1.Messages.NoCatchOrFinally);\n\t }\n\t return this.finalize(node, new Node.TryStatement(block, handler, finalizer));\n\t };\n\t // https://tc39.github.io/ecma262/#sec-debugger-statement\n\t Parser.prototype.parseDebuggerStatement = function () {\n\t var node = this.createNode();\n\t this.expectKeyword('debugger');\n\t this.consumeSemicolon();\n\t return this.finalize(node, new Node.DebuggerStatement());\n\t };\n\t // https://tc39.github.io/ecma262/#sec-ecmascript-language-statements-and-declarations\n\t Parser.prototype.parseStatement = function () {\n\t var statement;\n\t switch (this.lookahead.type) {\n\t case 1 /* BooleanLiteral */:\n\t case 5 /* NullLiteral */:\n\t case 6 /* NumericLiteral */:\n\t case 8 /* StringLiteral */:\n\t case 10 /* Template */:\n\t case 9 /* RegularExpression */:\n\t statement = this.parseExpressionStatement();\n\t break;\n\t case 7 /* Punctuator */:\n\t var value = this.lookahead.value;\n\t if (value === '{') {\n\t statement = this.parseBlock();\n\t }\n\t else if (value === '(') {\n\t statement = this.parseExpressionStatement();\n\t }\n\t else if (value === ';') {\n\t statement = this.parseEmptyStatement();\n\t }\n\t else {\n\t statement = this.parseExpressionStatement();\n\t }\n\t break;\n\t case 3 /* Identifier */:\n\t statement = this.matchAsyncFunction() ? this.parseFunctionDeclaration() : this.parseLabelledStatement();\n\t break;\n\t case 4 /* Keyword */:\n\t switch (this.lookahead.value) {\n\t case 'break':\n\t statement = this.parseBreakStatement();\n\t break;\n\t case 'continue':\n\t statement = this.parseContinueStatement();\n\t break;\n\t case 'debugger':\n\t statement = this.parseDebuggerStatement();\n\t break;\n\t case 'do':\n\t statement = this.parseDoWhileStatement();\n\t break;\n\t case 'for':\n\t statement = this.parseForStatement();\n\t break;\n\t case 'function':\n\t statement = this.parseFunctionDeclaration();\n\t break;\n\t case 'if':\n\t statement = this.parseIfStatement();\n\t break;\n\t case 'return':\n\t statement = this.parseReturnStatement();\n\t break;\n\t case 'switch':\n\t statement = this.parseSwitchStatement();\n\t break;\n\t case 'throw':\n\t statement = this.parseThrowStatement();\n\t break;\n\t case 'try':\n\t statement = this.parseTryStatement();\n\t break;\n\t case 'var':\n\t statement = this.parseVariableStatement();\n\t break;\n\t case 'while':\n\t statement = this.parseWhileStatement();\n\t break;\n\t case 'with':\n\t statement = this.parseWithStatement();\n\t break;\n\t default:\n\t statement = this.parseExpressionStatement();\n\t break;\n\t }\n\t break;\n\t default:\n\t statement = this.throwUnexpectedToken(this.lookahead);\n\t }\n\t return statement;\n\t };\n\t // https://tc39.github.io/ecma262/#sec-function-definitions\n\t Parser.prototype.parseFunctionSourceElements = function () {\n\t var node = this.createNode();\n\t this.expect('{');\n\t var body = this.parseDirectivePrologues();\n\t var previousLabelSet = this.context.labelSet;\n\t var previousInIteration = this.context.inIteration;\n\t var previousInSwitch = this.context.inSwitch;\n\t var previousInFunctionBody = this.context.inFunctionBody;\n\t this.context.labelSet = {};\n\t this.context.inIteration = false;\n\t this.context.inSwitch = false;\n\t this.context.inFunctionBody = true;\n\t while (this.lookahead.type !== 2 /* EOF */) {\n\t if (this.match('}')) {\n\t break;\n\t }\n\t body.push(this.parseStatementListItem());\n\t }\n\t this.expect('}');\n\t this.context.labelSet = previousLabelSet;\n\t this.context.inIteration = previousInIteration;\n\t this.context.inSwitch = previousInSwitch;\n\t this.context.inFunctionBody = previousInFunctionBody;\n\t return this.finalize(node, new Node.BlockStatement(body));\n\t };\n\t Parser.prototype.validateParam = function (options, param, name) {\n\t var key = '$' + name;\n\t if (this.context.strict) {\n\t if (this.scanner.isRestrictedWord(name)) {\n\t options.stricted = param;\n\t options.message = messages_1.Messages.StrictParamName;\n\t }\n\t if (Object.prototype.hasOwnProperty.call(options.paramSet, key)) {\n\t options.stricted = param;\n\t options.message = messages_1.Messages.StrictParamDupe;\n\t }\n\t }\n\t else if (!options.firstRestricted) {\n\t if (this.scanner.isRestrictedWord(name)) {\n\t options.firstRestricted = param;\n\t options.message = messages_1.Messages.StrictParamName;\n\t }\n\t else if (this.scanner.isStrictModeReservedWord(name)) {\n\t options.firstRestricted = param;\n\t options.message = messages_1.Messages.StrictReservedWord;\n\t }\n\t else if (Object.prototype.hasOwnProperty.call(options.paramSet, key)) {\n\t options.stricted = param;\n\t options.message = messages_1.Messages.StrictParamDupe;\n\t }\n\t }\n\t /* istanbul ignore next */\n\t if (typeof Object.defineProperty === 'function') {\n\t Object.defineProperty(options.paramSet, key, { value: true, enumerable: true, writable: true, configurable: true });\n\t }\n\t else {\n\t options.paramSet[key] = true;\n\t }\n\t };\n\t Parser.prototype.parseRestElement = function (params) {\n\t var node = this.createNode();\n\t this.expect('...');\n\t var arg = this.parsePattern(params);\n\t if (this.match('=')) {\n\t this.throwError(messages_1.Messages.DefaultRestParameter);\n\t }\n\t if (!this.match(')')) {\n\t this.throwError(messages_1.Messages.ParameterAfterRestParameter);\n\t }\n\t return this.finalize(node, new Node.RestElement(arg));\n\t };\n\t Parser.prototype.parseFormalParameter = function (options) {\n\t var params = [];\n\t var param = this.match('...') ? this.parseRestElement(params) : this.parsePatternWithDefault(params);\n\t for (var i = 0; i < params.length; i++) {\n\t this.validateParam(options, params[i], params[i].value);\n\t }\n\t options.simple = options.simple && (param instanceof Node.Identifier);\n\t options.params.push(param);\n\t };\n\t Parser.prototype.parseFormalParameters = function (firstRestricted) {\n\t var options;\n\t options = {\n\t simple: true,\n\t params: [],\n\t firstRestricted: firstRestricted\n\t };\n\t this.expect('(');\n\t if (!this.match(')')) {\n\t options.paramSet = {};\n\t while (this.lookahead.type !== 2 /* EOF */) {\n\t this.parseFormalParameter(options);\n\t if (this.match(')')) {\n\t break;\n\t }\n\t this.expect(',');\n\t if (this.match(')')) {\n\t break;\n\t }\n\t }\n\t }\n\t this.expect(')');\n\t return {\n\t simple: options.simple,\n\t params: options.params,\n\t stricted: options.stricted,\n\t firstRestricted: options.firstRestricted,\n\t message: options.message\n\t };\n\t };\n\t Parser.prototype.matchAsyncFunction = function () {\n\t var match = this.matchContextualKeyword('async');\n\t if (match) {\n\t var state = this.scanner.saveState();\n\t this.scanner.scanComments();\n\t var next = this.scanner.lex();\n\t this.scanner.restoreState(state);\n\t match = (state.lineNumber === next.lineNumber) && (next.type === 4 /* Keyword */) && (next.value === 'function');\n\t }\n\t return match;\n\t };\n\t Parser.prototype.parseFunctionDeclaration = function (identifierIsOptional) {\n\t var node = this.createNode();\n\t var isAsync = this.matchContextualKeyword('async');\n\t if (isAsync) {\n\t this.nextToken();\n\t }\n\t this.expectKeyword('function');\n\t var isGenerator = isAsync ? false : this.match('*');\n\t if (isGenerator) {\n\t this.nextToken();\n\t }\n\t var message;\n\t var id = null;\n\t var firstRestricted = null;\n\t if (!identifierIsOptional || !this.match('(')) {\n\t var token = this.lookahead;\n\t id = this.parseVariableIdentifier();\n\t if (this.context.strict) {\n\t if (this.scanner.isRestrictedWord(token.value)) {\n\t this.tolerateUnexpectedToken(token, messages_1.Messages.StrictFunctionName);\n\t }\n\t }\n\t else {\n\t if (this.scanner.isRestrictedWord(token.value)) {\n\t firstRestricted = token;\n\t message = messages_1.Messages.StrictFunctionName;\n\t }\n\t else if (this.scanner.isStrictModeReservedWord(token.value)) {\n\t firstRestricted = token;\n\t message = messages_1.Messages.StrictReservedWord;\n\t }\n\t }\n\t }\n\t var previousAllowAwait = this.context.await;\n\t var previousAllowYield = this.context.allowYield;\n\t this.context.await = isAsync;\n\t this.context.allowYield = !isGenerator;\n\t var formalParameters = this.parseFormalParameters(firstRestricted);\n\t var params = formalParameters.params;\n\t var stricted = formalParameters.stricted;\n\t firstRestricted = formalParameters.firstRestricted;\n\t if (formalParameters.message) {\n\t message = formalParameters.message;\n\t }\n\t var previousStrict = this.context.strict;\n\t var previousAllowStrictDirective = this.context.allowStrictDirective;\n\t this.context.allowStrictDirective = formalParameters.simple;\n\t var body = this.parseFunctionSourceElements();\n\t if (this.context.strict && firstRestricted) {\n\t this.throwUnexpectedToken(firstRestricted, message);\n\t }\n\t if (this.context.strict && stricted) {\n\t this.tolerateUnexpectedToken(stricted, message);\n\t }\n\t this.context.strict = previousStrict;\n\t this.context.allowStrictDirective = previousAllowStrictDirective;\n\t this.context.await = previousAllowAwait;\n\t this.context.allowYield = previousAllowYield;\n\t return isAsync ? this.finalize(node, new Node.AsyncFunctionDeclaration(id, params, body)) :\n\t this.finalize(node, new Node.FunctionDeclaration(id, params, body, isGenerator));\n\t };\n\t Parser.prototype.parseFunctionExpression = function () {\n\t var node = this.createNode();\n\t var isAsync = this.matchContextualKeyword('async');\n\t if (isAsync) {\n\t this.nextToken();\n\t }\n\t this.expectKeyword('function');\n\t var isGenerator = isAsync ? false : this.match('*');\n\t if (isGenerator) {\n\t this.nextToken();\n\t }\n\t var message;\n\t var id = null;\n\t var firstRestricted;\n\t var previousAllowAwait = this.context.await;\n\t var previousAllowYield = this.context.allowYield;\n\t this.context.await = isAsync;\n\t this.context.allowYield = !isGenerator;\n\t if (!this.match('(')) {\n\t var token = this.lookahead;\n\t id = (!this.context.strict && !isGenerator && this.matchKeyword('yield')) ? this.parseIdentifierName() : this.parseVariableIdentifier();\n\t if (this.context.strict) {\n\t if (this.scanner.isRestrictedWord(token.value)) {\n\t this.tolerateUnexpectedToken(token, messages_1.Messages.StrictFunctionName);\n\t }\n\t }\n\t else {\n\t if (this.scanner.isRestrictedWord(token.value)) {\n\t firstRestricted = token;\n\t message = messages_1.Messages.StrictFunctionName;\n\t }\n\t else if (this.scanner.isStrictModeReservedWord(token.value)) {\n\t firstRestricted = token;\n\t message = messages_1.Messages.StrictReservedWord;\n\t }\n\t }\n\t }\n\t var formalParameters = this.parseFormalParameters(firstRestricted);\n\t var params = formalParameters.params;\n\t var stricted = formalParameters.stricted;\n\t firstRestricted = formalParameters.firstRestricted;\n\t if (formalParameters.message) {\n\t message = formalParameters.message;\n\t }\n\t var previousStrict = this.context.strict;\n\t var previousAllowStrictDirective = this.context.allowStrictDirective;\n\t this.context.allowStrictDirective = formalParameters.simple;\n\t var body = this.parseFunctionSourceElements();\n\t if (this.context.strict && firstRestricted) {\n\t this.throwUnexpectedToken(firstRestricted, message);\n\t }\n\t if (this.context.strict && stricted) {\n\t this.tolerateUnexpectedToken(stricted, message);\n\t }\n\t this.context.strict = previousStrict;\n\t this.context.allowStrictDirective = previousAllowStrictDirective;\n\t this.context.await = previousAllowAwait;\n\t this.context.allowYield = previousAllowYield;\n\t return isAsync ? this.finalize(node, new Node.AsyncFunctionExpression(id, params, body)) :\n\t this.finalize(node, new Node.FunctionExpression(id, params, body, isGenerator));\n\t };\n\t // https://tc39.github.io/ecma262/#sec-directive-prologues-and-the-use-strict-directive\n\t Parser.prototype.parseDirective = function () {\n\t var token = this.lookahead;\n\t var node = this.createNode();\n\t var expr = this.parseExpression();\n\t var directive = (expr.type === syntax_1.Syntax.Literal) ? this.getTokenRaw(token).slice(1, -1) : null;\n\t this.consumeSemicolon();\n\t return this.finalize(node, directive ? new Node.Directive(expr, directive) : new Node.ExpressionStatement(expr));\n\t };\n\t Parser.prototype.parseDirectivePrologues = function () {\n\t var firstRestricted = null;\n\t var body = [];\n\t while (true) {\n\t var token = this.lookahead;\n\t if (token.type !== 8 /* StringLiteral */) {\n\t break;\n\t }\n\t var statement = this.parseDirective();\n\t body.push(statement);\n\t var directive = statement.directive;\n\t if (typeof directive !== 'string') {\n\t break;\n\t }\n\t if (directive === 'use strict') {\n\t this.context.strict = true;\n\t if (firstRestricted) {\n\t this.tolerateUnexpectedToken(firstRestricted, messages_1.Messages.StrictOctalLiteral);\n\t }\n\t if (!this.context.allowStrictDirective) {\n\t this.tolerateUnexpectedToken(token, messages_1.Messages.IllegalLanguageModeDirective);\n\t }\n\t }\n\t else {\n\t if (!firstRestricted && token.octal) {\n\t firstRestricted = token;\n\t }\n\t }\n\t }\n\t return body;\n\t };\n\t // https://tc39.github.io/ecma262/#sec-method-definitions\n\t Parser.prototype.qualifiedPropertyName = function (token) {\n\t switch (token.type) {\n\t case 3 /* Identifier */:\n\t case 8 /* StringLiteral */:\n\t case 1 /* BooleanLiteral */:\n\t case 5 /* NullLiteral */:\n\t case 6 /* NumericLiteral */:\n\t case 4 /* Keyword */:\n\t return true;\n\t case 7 /* Punctuator */:\n\t return token.value === '[';\n\t default:\n\t break;\n\t }\n\t return false;\n\t };\n\t Parser.prototype.parseGetterMethod = function () {\n\t var node = this.createNode();\n\t var isGenerator = false;\n\t var previousAllowYield = this.context.allowYield;\n\t this.context.allowYield = !isGenerator;\n\t var formalParameters = this.parseFormalParameters();\n\t if (formalParameters.params.length > 0) {\n\t this.tolerateError(messages_1.Messages.BadGetterArity);\n\t }\n\t var method = this.parsePropertyMethod(formalParameters);\n\t this.context.allowYield = previousAllowYield;\n\t return this.finalize(node, new Node.FunctionExpression(null, formalParameters.params, method, isGenerator));\n\t };\n\t Parser.prototype.parseSetterMethod = function () {\n\t var node = this.createNode();\n\t var isGenerator = false;\n\t var previousAllowYield = this.context.allowYield;\n\t this.context.allowYield = !isGenerator;\n\t var formalParameters = this.parseFormalParameters();\n\t if (formalParameters.params.length !== 1) {\n\t this.tolerateError(messages_1.Messages.BadSetterArity);\n\t }\n\t else if (formalParameters.params[0] instanceof Node.RestElement) {\n\t this.tolerateError(messages_1.Messages.BadSetterRestParameter);\n\t }\n\t var method = this.parsePropertyMethod(formalParameters);\n\t this.context.allowYield = previousAllowYield;\n\t return this.finalize(node, new Node.FunctionExpression(null, formalParameters.params, method, isGenerator));\n\t };\n\t Parser.prototype.parseGeneratorMethod = function () {\n\t var node = this.createNode();\n\t var isGenerator = true;\n\t var previousAllowYield = this.context.allowYield;\n\t this.context.allowYield = true;\n\t var params = this.parseFormalParameters();\n\t this.context.allowYield = false;\n\t var method = this.parsePropertyMethod(params);\n\t this.context.allowYield = previousAllowYield;\n\t return this.finalize(node, new Node.FunctionExpression(null, params.params, method, isGenerator));\n\t };\n\t // https://tc39.github.io/ecma262/#sec-generator-function-definitions\n\t Parser.prototype.isStartOfExpression = function () {\n\t var start = true;\n\t var value = this.lookahead.value;\n\t switch (this.lookahead.type) {\n\t case 7 /* Punctuator */:\n\t start = (value === '[') || (value === '(') || (value === '{') ||\n\t (value === '+') || (value === '-') ||\n\t (value === '!') || (value === '~') ||\n\t (value === '++') || (value === '--') ||\n\t (value === '/') || (value === '/='); // regular expression literal\n\t break;\n\t case 4 /* Keyword */:\n\t start = (value === 'class') || (value === 'delete') ||\n\t (value === 'function') || (value === 'let') || (value === 'new') ||\n\t (value === 'super') || (value === 'this') || (value === 'typeof') ||\n\t (value === 'void') || (value === 'yield');\n\t break;\n\t default:\n\t break;\n\t }\n\t return start;\n\t };\n\t Parser.prototype.parseYieldExpression = function () {\n\t var node = this.createNode();\n\t this.expectKeyword('yield');\n\t var argument = null;\n\t var delegate = false;\n\t if (!this.hasLineTerminator) {\n\t var previousAllowYield = this.context.allowYield;\n\t this.context.allowYield = false;\n\t delegate = this.match('*');\n\t if (delegate) {\n\t this.nextToken();\n\t argument = this.parseAssignmentExpression();\n\t }\n\t else if (this.isStartOfExpression()) {\n\t argument = this.parseAssignmentExpression();\n\t }\n\t this.context.allowYield = previousAllowYield;\n\t }\n\t return this.finalize(node, new Node.YieldExpression(argument, delegate));\n\t };\n\t // https://tc39.github.io/ecma262/#sec-class-definitions\n\t Parser.prototype.parseClassElement = function (hasConstructor) {\n\t var token = this.lookahead;\n\t var node = this.createNode();\n\t var kind = '';\n\t var key = null;\n\t var value = null;\n\t var computed = false;\n\t var method = false;\n\t var isStatic = false;\n\t var isAsync = false;\n\t if (this.match('*')) {\n\t this.nextToken();\n\t }\n\t else {\n\t computed = this.match('[');\n\t key = this.parseObjectPropertyKey();\n\t var id = key;\n\t if (id.name === 'static' && (this.qualifiedPropertyName(this.lookahead) || this.match('*'))) {\n\t token = this.lookahead;\n\t isStatic = true;\n\t computed = this.match('[');\n\t if (this.match('*')) {\n\t this.nextToken();\n\t }\n\t else {\n\t key = this.parseObjectPropertyKey();\n\t }\n\t }\n\t if ((token.type === 3 /* Identifier */) && !this.hasLineTerminator && (token.value === 'async')) {\n\t var punctuator = this.lookahead.value;\n\t if (punctuator !== ':' && punctuator !== '(' && punctuator !== '*') {\n\t isAsync = true;\n\t token = this.lookahead;\n\t key = this.parseObjectPropertyKey();\n\t if (token.type === 3 /* Identifier */ && token.value === 'constructor') {\n\t this.tolerateUnexpectedToken(token, messages_1.Messages.ConstructorIsAsync);\n\t }\n\t }\n\t }\n\t }\n\t var lookaheadPropertyKey = this.qualifiedPropertyName(this.lookahead);\n\t if (token.type === 3 /* Identifier */) {\n\t if (token.value === 'get' && lookaheadPropertyKey) {\n\t kind = 'get';\n\t computed = this.match('[');\n\t key = this.parseObjectPropertyKey();\n\t this.context.allowYield = false;\n\t value = this.parseGetterMethod();\n\t }\n\t else if (token.value === 'set' && lookaheadPropertyKey) {\n\t kind = 'set';\n\t computed = this.match('[');\n\t key = this.parseObjectPropertyKey();\n\t value = this.parseSetterMethod();\n\t }\n\t }\n\t else if (token.type === 7 /* Punctuator */ && token.value === '*' && lookaheadPropertyKey) {\n\t kind = 'init';\n\t computed = this.match('[');\n\t key = this.parseObjectPropertyKey();\n\t value = this.parseGeneratorMethod();\n\t method = true;\n\t }\n\t if (!kind && key && this.match('(')) {\n\t kind = 'init';\n\t value = isAsync ? this.parsePropertyMethodAsyncFunction() : this.parsePropertyMethodFunction();\n\t method = true;\n\t }\n\t if (!kind) {\n\t this.throwUnexpectedToken(this.lookahead);\n\t }\n\t if (kind === 'init') {\n\t kind = 'method';\n\t }\n\t if (!computed) {\n\t if (isStatic && this.isPropertyKey(key, 'prototype')) {\n\t this.throwUnexpectedToken(token, messages_1.Messages.StaticPrototype);\n\t }\n\t if (!isStatic && this.isPropertyKey(key, 'constructor')) {\n\t if (kind !== 'method' || !method || (value && value.generator)) {\n\t this.throwUnexpectedToken(token, messages_1.Messages.ConstructorSpecialMethod);\n\t }\n\t if (hasConstructor.value) {\n\t this.throwUnexpectedToken(token, messages_1.Messages.DuplicateConstructor);\n\t }\n\t else {\n\t hasConstructor.value = true;\n\t }\n\t kind = 'constructor';\n\t }\n\t }\n\t return this.finalize(node, new Node.MethodDefinition(key, computed, value, kind, isStatic));\n\t };\n\t Parser.prototype.parseClassElementList = function () {\n\t var body = [];\n\t var hasConstructor = { value: false };\n\t this.expect('{');\n\t while (!this.match('}')) {\n\t if (this.match(';')) {\n\t this.nextToken();\n\t }\n\t else {\n\t body.push(this.parseClassElement(hasConstructor));\n\t }\n\t }\n\t this.expect('}');\n\t return body;\n\t };\n\t Parser.prototype.parseClassBody = function () {\n\t var node = this.createNode();\n\t var elementList = this.parseClassElementList();\n\t return this.finalize(node, new Node.ClassBody(elementList));\n\t };\n\t Parser.prototype.parseClassDeclaration = function (identifierIsOptional) {\n\t var node = this.createNode();\n\t var previousStrict = this.context.strict;\n\t this.context.strict = true;\n\t this.expectKeyword('class');\n\t var id = (identifierIsOptional && (this.lookahead.type !== 3 /* Identifier */)) ? null : this.parseVariableIdentifier();\n\t var superClass = null;\n\t if (this.matchKeyword('extends')) {\n\t this.nextToken();\n\t superClass = this.isolateCoverGrammar(this.parseLeftHandSideExpressionAllowCall);\n\t }\n\t var classBody = this.parseClassBody();\n\t this.context.strict = previousStrict;\n\t return this.finalize(node, new Node.ClassDeclaration(id, superClass, classBody));\n\t };\n\t Parser.prototype.parseClassExpression = function () {\n\t var node = this.createNode();\n\t var previousStrict = this.context.strict;\n\t this.context.strict = true;\n\t this.expectKeyword('class');\n\t var id = (this.lookahead.type === 3 /* Identifier */) ? this.parseVariableIdentifier() : null;\n\t var superClass = null;\n\t if (this.matchKeyword('extends')) {\n\t this.nextToken();\n\t superClass = this.isolateCoverGrammar(this.parseLeftHandSideExpressionAllowCall);\n\t }\n\t var classBody = this.parseClassBody();\n\t this.context.strict = previousStrict;\n\t return this.finalize(node, new Node.ClassExpression(id, superClass, classBody));\n\t };\n\t // https://tc39.github.io/ecma262/#sec-scripts\n\t // https://tc39.github.io/ecma262/#sec-modules\n\t Parser.prototype.parseModule = function () {\n\t this.context.strict = true;\n\t this.context.isModule = true;\n\t this.scanner.isModule = true;\n\t var node = this.createNode();\n\t var body = this.parseDirectivePrologues();\n\t while (this.lookahead.type !== 2 /* EOF */) {\n\t body.push(this.parseStatementListItem());\n\t }\n\t return this.finalize(node, new Node.Module(body));\n\t };\n\t Parser.prototype.parseScript = function () {\n\t var node = this.createNode();\n\t var body = this.parseDirectivePrologues();\n\t while (this.lookahead.type !== 2 /* EOF */) {\n\t body.push(this.parseStatementListItem());\n\t }\n\t return this.finalize(node, new Node.Script(body));\n\t };\n\t // https://tc39.github.io/ecma262/#sec-imports\n\t Parser.prototype.parseModuleSpecifier = function () {\n\t var node = this.createNode();\n\t if (this.lookahead.type !== 8 /* StringLiteral */) {\n\t this.throwError(messages_1.Messages.InvalidModuleSpecifier);\n\t }\n\t var token = this.nextToken();\n\t var raw = this.getTokenRaw(token);\n\t return this.finalize(node, new Node.Literal(token.value, raw));\n\t };\n\t // import {} ...;\n\t Parser.prototype.parseImportSpecifier = function () {\n\t var node = this.createNode();\n\t var imported;\n\t var local;\n\t if (this.lookahead.type === 3 /* Identifier */) {\n\t imported = this.parseVariableIdentifier();\n\t local = imported;\n\t if (this.matchContextualKeyword('as')) {\n\t this.nextToken();\n\t local = this.parseVariableIdentifier();\n\t }\n\t }\n\t else {\n\t imported = this.parseIdentifierName();\n\t local = imported;\n\t if (this.matchContextualKeyword('as')) {\n\t this.nextToken();\n\t local = this.parseVariableIdentifier();\n\t }\n\t else {\n\t this.throwUnexpectedToken(this.nextToken());\n\t }\n\t }\n\t return this.finalize(node, new Node.ImportSpecifier(local, imported));\n\t };\n\t // {foo, bar as bas}\n\t Parser.prototype.parseNamedImports = function () {\n\t this.expect('{');\n\t var specifiers = [];\n\t while (!this.match('}')) {\n\t specifiers.push(this.parseImportSpecifier());\n\t if (!this.match('}')) {\n\t this.expect(',');\n\t }\n\t }\n\t this.expect('}');\n\t return specifiers;\n\t };\n\t // import ...;\n\t Parser.prototype.parseImportDefaultSpecifier = function () {\n\t var node = this.createNode();\n\t var local = this.parseIdentifierName();\n\t return this.finalize(node, new Node.ImportDefaultSpecifier(local));\n\t };\n\t // import <* as foo> ...;\n\t Parser.prototype.parseImportNamespaceSpecifier = function () {\n\t var node = this.createNode();\n\t this.expect('*');\n\t if (!this.matchContextualKeyword('as')) {\n\t this.throwError(messages_1.Messages.NoAsAfterImportNamespace);\n\t }\n\t this.nextToken();\n\t var local = this.parseIdentifierName();\n\t return this.finalize(node, new Node.ImportNamespaceSpecifier(local));\n\t };\n\t Parser.prototype.parseImportDeclaration = function () {\n\t if (this.context.inFunctionBody) {\n\t this.throwError(messages_1.Messages.IllegalImportDeclaration);\n\t }\n\t var node = this.createNode();\n\t this.expectKeyword('import');\n\t var src;\n\t var specifiers = [];\n\t if (this.lookahead.type === 8 /* StringLiteral */) {\n\t // import 'foo';\n\t src = this.parseModuleSpecifier();\n\t }\n\t else {\n\t if (this.match('{')) {\n\t // import {bar}\n\t specifiers = specifiers.concat(this.parseNamedImports());\n\t }\n\t else if (this.match('*')) {\n\t // import * as foo\n\t specifiers.push(this.parseImportNamespaceSpecifier());\n\t }\n\t else if (this.isIdentifierName(this.lookahead) && !this.matchKeyword('default')) {\n\t // import foo\n\t specifiers.push(this.parseImportDefaultSpecifier());\n\t if (this.match(',')) {\n\t this.nextToken();\n\t if (this.match('*')) {\n\t // import foo, * as foo\n\t specifiers.push(this.parseImportNamespaceSpecifier());\n\t }\n\t else if (this.match('{')) {\n\t // import foo, {bar}\n\t specifiers = specifiers.concat(this.parseNamedImports());\n\t }\n\t else {\n\t this.throwUnexpectedToken(this.lookahead);\n\t }\n\t }\n\t }\n\t else {\n\t this.throwUnexpectedToken(this.nextToken());\n\t }\n\t if (!this.matchContextualKeyword('from')) {\n\t var message = this.lookahead.value ? messages_1.Messages.UnexpectedToken : messages_1.Messages.MissingFromClause;\n\t this.throwError(message, this.lookahead.value);\n\t }\n\t this.nextToken();\n\t src = this.parseModuleSpecifier();\n\t }\n\t this.consumeSemicolon();\n\t return this.finalize(node, new Node.ImportDeclaration(specifiers, src));\n\t };\n\t // https://tc39.github.io/ecma262/#sec-exports\n\t Parser.prototype.parseExportSpecifier = function () {\n\t var node = this.createNode();\n\t var local = this.parseIdentifierName();\n\t var exported = local;\n\t if (this.matchContextualKeyword('as')) {\n\t this.nextToken();\n\t exported = this.parseIdentifierName();\n\t }\n\t return this.finalize(node, new Node.ExportSpecifier(local, exported));\n\t };\n\t Parser.prototype.parseExportDeclaration = function () {\n\t if (this.context.inFunctionBody) {\n\t this.throwError(messages_1.Messages.IllegalExportDeclaration);\n\t }\n\t var node = this.createNode();\n\t this.expectKeyword('export');\n\t var exportDeclaration;\n\t if (this.matchKeyword('default')) {\n\t // export default ...\n\t this.nextToken();\n\t if (this.matchKeyword('function')) {\n\t // export default function foo () {}\n\t // export default function () {}\n\t var declaration = this.parseFunctionDeclaration(true);\n\t exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration));\n\t }\n\t else if (this.matchKeyword('class')) {\n\t // export default class foo {}\n\t var declaration = this.parseClassDeclaration(true);\n\t exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration));\n\t }\n\t else if (this.matchContextualKeyword('async')) {\n\t // export default async function f () {}\n\t // export default async function () {}\n\t // export default async x => x\n\t var declaration = this.matchAsyncFunction() ? this.parseFunctionDeclaration(true) : this.parseAssignmentExpression();\n\t exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration));\n\t }\n\t else {\n\t if (this.matchContextualKeyword('from')) {\n\t this.throwError(messages_1.Messages.UnexpectedToken, this.lookahead.value);\n\t }\n\t // export default {};\n\t // export default [];\n\t // export default (1 + 2);\n\t var declaration = this.match('{') ? this.parseObjectInitializer() :\n\t this.match('[') ? this.parseArrayInitializer() : this.parseAssignmentExpression();\n\t this.consumeSemicolon();\n\t exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration));\n\t }\n\t }\n\t else if (this.match('*')) {\n\t // export * from 'foo';\n\t this.nextToken();\n\t if (!this.matchContextualKeyword('from')) {\n\t var message = this.lookahead.value ? messages_1.Messages.UnexpectedToken : messages_1.Messages.MissingFromClause;\n\t this.throwError(message, this.lookahead.value);\n\t }\n\t this.nextToken();\n\t var src = this.parseModuleSpecifier();\n\t this.consumeSemicolon();\n\t exportDeclaration = this.finalize(node, new Node.ExportAllDeclaration(src));\n\t }\n\t else if (this.lookahead.type === 4 /* Keyword */) {\n\t // export var f = 1;\n\t var declaration = void 0;\n\t switch (this.lookahead.value) {\n\t case 'let':\n\t case 'const':\n\t declaration = this.parseLexicalDeclaration({ inFor: false });\n\t break;\n\t case 'var':\n\t case 'class':\n\t case 'function':\n\t declaration = this.parseStatementListItem();\n\t break;\n\t default:\n\t this.throwUnexpectedToken(this.lookahead);\n\t }\n\t exportDeclaration = this.finalize(node, new Node.ExportNamedDeclaration(declaration, [], null));\n\t }\n\t else if (this.matchAsyncFunction()) {\n\t var declaration = this.parseFunctionDeclaration();\n\t exportDeclaration = this.finalize(node, new Node.ExportNamedDeclaration(declaration, [], null));\n\t }\n\t else {\n\t var specifiers = [];\n\t var source = null;\n\t var isExportFromIdentifier = false;\n\t this.expect('{');\n\t while (!this.match('}')) {\n\t isExportFromIdentifier = isExportFromIdentifier || this.matchKeyword('default');\n\t specifiers.push(this.parseExportSpecifier());\n\t if (!this.match('}')) {\n\t this.expect(',');\n\t }\n\t }\n\t this.expect('}');\n\t if (this.matchContextualKeyword('from')) {\n\t // export {default} from 'foo';\n\t // export {foo} from 'foo';\n\t this.nextToken();\n\t source = this.parseModuleSpecifier();\n\t this.consumeSemicolon();\n\t }\n\t else if (isExportFromIdentifier) {\n\t // export {default}; // missing fromClause\n\t var message = this.lookahead.value ? messages_1.Messages.UnexpectedToken : messages_1.Messages.MissingFromClause;\n\t this.throwError(message, this.lookahead.value);\n\t }\n\t else {\n\t // export {foo};\n\t this.consumeSemicolon();\n\t }\n\t exportDeclaration = this.finalize(node, new Node.ExportNamedDeclaration(null, specifiers, source));\n\t }\n\t return exportDeclaration;\n\t };\n\t return Parser;\n\t}());\n\texports.Parser = Parser;\n\n\n/***/ },\n/* 9 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\t// Ensure the condition is true, otherwise throw an error.\n\t// This is only to have a better contract semantic, i.e. another safety net\n\t// to catch a logic error. The condition shall be fulfilled in normal case.\n\t// Do NOT use this to enforce a certain condition on any user input.\n\tObject.defineProperty(exports, \"__esModule\", { value: true });\n\tfunction assert(condition, message) {\n\t /* istanbul ignore if */\n\t if (!condition) {\n\t throw new Error('ASSERT: ' + message);\n\t }\n\t}\n\texports.assert = assert;\n\n\n/***/ },\n/* 10 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\t/* tslint:disable:max-classes-per-file */\n\tObject.defineProperty(exports, \"__esModule\", { value: true });\n\tvar ErrorHandler = (function () {\n\t function ErrorHandler() {\n\t this.errors = [];\n\t this.tolerant = false;\n\t }\n\t ErrorHandler.prototype.recordError = function (error) {\n\t this.errors.push(error);\n\t };\n\t ErrorHandler.prototype.tolerate = function (error) {\n\t if (this.tolerant) {\n\t this.recordError(error);\n\t }\n\t else {\n\t throw error;\n\t }\n\t };\n\t ErrorHandler.prototype.constructError = function (msg, column) {\n\t var error = new Error(msg);\n\t try {\n\t throw error;\n\t }\n\t catch (base) {\n\t /* istanbul ignore else */\n\t if (Object.create && Object.defineProperty) {\n\t error = Object.create(base);\n\t Object.defineProperty(error, 'column', { value: column });\n\t }\n\t }\n\t /* istanbul ignore next */\n\t return error;\n\t };\n\t ErrorHandler.prototype.createError = function (index, line, col, description) {\n\t var msg = 'Line ' + line + ': ' + description;\n\t var error = this.constructError(msg, col);\n\t error.index = index;\n\t error.lineNumber = line;\n\t error.description = description;\n\t return error;\n\t };\n\t ErrorHandler.prototype.throwError = function (index, line, col, description) {\n\t throw this.createError(index, line, col, description);\n\t };\n\t ErrorHandler.prototype.tolerateError = function (index, line, col, description) {\n\t var error = this.createError(index, line, col, description);\n\t if (this.tolerant) {\n\t this.recordError(error);\n\t }\n\t else {\n\t throw error;\n\t }\n\t };\n\t return ErrorHandler;\n\t}());\n\texports.ErrorHandler = ErrorHandler;\n\n\n/***/ },\n/* 11 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\tObject.defineProperty(exports, \"__esModule\", { value: true });\n\t// Error messages should be identical to V8.\n\texports.Messages = {\n\t BadGetterArity: 'Getter must not have any formal parameters',\n\t BadSetterArity: 'Setter must have exactly one formal parameter',\n\t BadSetterRestParameter: 'Setter function argument must not be a rest parameter',\n\t ConstructorIsAsync: 'Class constructor may not be an async method',\n\t ConstructorSpecialMethod: 'Class constructor may not be an accessor',\n\t DeclarationMissingInitializer: 'Missing initializer in %0 declaration',\n\t DefaultRestParameter: 'Unexpected token =',\n\t DuplicateBinding: 'Duplicate binding %0',\n\t DuplicateConstructor: 'A class may only have one constructor',\n\t DuplicateProtoProperty: 'Duplicate __proto__ fields are not allowed in object literals',\n\t ForInOfLoopInitializer: '%0 loop variable declaration may not have an initializer',\n\t GeneratorInLegacyContext: 'Generator declarations are not allowed in legacy contexts',\n\t IllegalBreak: 'Illegal break statement',\n\t IllegalContinue: 'Illegal continue statement',\n\t IllegalExportDeclaration: 'Unexpected token',\n\t IllegalImportDeclaration: 'Unexpected token',\n\t IllegalLanguageModeDirective: 'Illegal \\'use strict\\' directive in function with non-simple parameter list',\n\t IllegalReturn: 'Illegal return statement',\n\t InvalidEscapedReservedWord: 'Keyword must not contain escaped characters',\n\t InvalidHexEscapeSequence: 'Invalid hexadecimal escape sequence',\n\t InvalidLHSInAssignment: 'Invalid left-hand side in assignment',\n\t InvalidLHSInForIn: 'Invalid left-hand side in for-in',\n\t InvalidLHSInForLoop: 'Invalid left-hand side in for-loop',\n\t InvalidModuleSpecifier: 'Unexpected token',\n\t InvalidRegExp: 'Invalid regular expression',\n\t LetInLexicalBinding: 'let is disallowed as a lexically bound name',\n\t MissingFromClause: 'Unexpected token',\n\t MultipleDefaultsInSwitch: 'More than one default clause in switch statement',\n\t NewlineAfterThrow: 'Illegal newline after throw',\n\t NoAsAfterImportNamespace: 'Unexpected token',\n\t NoCatchOrFinally: 'Missing catch or finally after try',\n\t ParameterAfterRestParameter: 'Rest parameter must be last formal parameter',\n\t Redeclaration: '%0 \\'%1\\' has already been declared',\n\t StaticPrototype: 'Classes may not have static property named prototype',\n\t StrictCatchVariable: 'Catch variable may not be eval or arguments in strict mode',\n\t StrictDelete: 'Delete of an unqualified identifier in strict mode.',\n\t StrictFunction: 'In strict mode code, functions can only be declared at top level or inside a block',\n\t StrictFunctionName: 'Function name may not be eval or arguments in strict mode',\n\t StrictLHSAssignment: 'Assignment to eval or arguments is not allowed in strict mode',\n\t StrictLHSPostfix: 'Postfix increment/decrement may not have eval or arguments operand in strict mode',\n\t StrictLHSPrefix: 'Prefix increment/decrement may not have eval or arguments operand in strict mode',\n\t StrictModeWith: 'Strict mode code may not include a with statement',\n\t StrictOctalLiteral: 'Octal literals are not allowed in strict mode.',\n\t StrictParamDupe: 'Strict mode function may not have duplicate parameter names',\n\t StrictParamName: 'Parameter name eval or arguments is not allowed in strict mode',\n\t StrictReservedWord: 'Use of future reserved word in strict mode',\n\t StrictVarName: 'Variable name may not be eval or arguments in strict mode',\n\t TemplateOctalLiteral: 'Octal literals are not allowed in template strings.',\n\t UnexpectedEOS: 'Unexpected end of input',\n\t UnexpectedIdentifier: 'Unexpected identifier',\n\t UnexpectedNumber: 'Unexpected number',\n\t UnexpectedReserved: 'Unexpected reserved word',\n\t UnexpectedString: 'Unexpected string',\n\t UnexpectedTemplate: 'Unexpected quasi %0',\n\t UnexpectedToken: 'Unexpected token %0',\n\t UnexpectedTokenIllegal: 'Unexpected token ILLEGAL',\n\t UnknownLabel: 'Undefined label \\'%0\\'',\n\t UnterminatedRegExp: 'Invalid regular expression: missing /'\n\t};\n\n\n/***/ },\n/* 12 */\n/***/ function(module, exports, __nested_webpack_require_226595__) {\n\n\t\"use strict\";\n\tObject.defineProperty(exports, \"__esModule\", { value: true });\n\tvar assert_1 = __nested_webpack_require_226595__(9);\n\tvar character_1 = __nested_webpack_require_226595__(4);\n\tvar messages_1 = __nested_webpack_require_226595__(11);\n\tfunction hexValue(ch) {\n\t return '0123456789abcdef'.indexOf(ch.toLowerCase());\n\t}\n\tfunction octalValue(ch) {\n\t return '01234567'.indexOf(ch);\n\t}\n\tvar Scanner = (function () {\n\t function Scanner(code, handler) {\n\t this.source = code;\n\t this.errorHandler = handler;\n\t this.trackComment = false;\n\t this.isModule = false;\n\t this.length = code.length;\n\t this.index = 0;\n\t this.lineNumber = (code.length > 0) ? 1 : 0;\n\t this.lineStart = 0;\n\t this.curlyStack = [];\n\t }\n\t Scanner.prototype.saveState = function () {\n\t return {\n\t index: this.index,\n\t lineNumber: this.lineNumber,\n\t lineStart: this.lineStart\n\t };\n\t };\n\t Scanner.prototype.restoreState = function (state) {\n\t this.index = state.index;\n\t this.lineNumber = state.lineNumber;\n\t this.lineStart = state.lineStart;\n\t };\n\t Scanner.prototype.eof = function () {\n\t return this.index >= this.length;\n\t };\n\t Scanner.prototype.throwUnexpectedToken = function (message) {\n\t if (message === void 0) { message = messages_1.Messages.UnexpectedTokenIllegal; }\n\t return this.errorHandler.throwError(this.index, this.lineNumber, this.index - this.lineStart + 1, message);\n\t };\n\t Scanner.prototype.tolerateUnexpectedToken = function (message) {\n\t if (message === void 0) { message = messages_1.Messages.UnexpectedTokenIllegal; }\n\t this.errorHandler.tolerateError(this.index, this.lineNumber, this.index - this.lineStart + 1, message);\n\t };\n\t // https://tc39.github.io/ecma262/#sec-comments\n\t Scanner.prototype.skipSingleLineComment = function (offset) {\n\t var comments = [];\n\t var start, loc;\n\t if (this.trackComment) {\n\t comments = [];\n\t start = this.index - offset;\n\t loc = {\n\t start: {\n\t line: this.lineNumber,\n\t column: this.index - this.lineStart - offset\n\t },\n\t end: {}\n\t };\n\t }\n\t while (!this.eof()) {\n\t var ch = this.source.charCodeAt(this.index);\n\t ++this.index;\n\t if (character_1.Character.isLineTerminator(ch)) {\n\t if (this.trackComment) {\n\t loc.end = {\n\t line: this.lineNumber,\n\t column: this.index - this.lineStart - 1\n\t };\n\t var entry = {\n\t multiLine: false,\n\t slice: [start + offset, this.index - 1],\n\t range: [start, this.index - 1],\n\t loc: loc\n\t };\n\t comments.push(entry);\n\t }\n\t if (ch === 13 && this.source.charCodeAt(this.index) === 10) {\n\t ++this.index;\n\t }\n\t ++this.lineNumber;\n\t this.lineStart = this.index;\n\t return comments;\n\t }\n\t }\n\t if (this.trackComment) {\n\t loc.end = {\n\t line: this.lineNumber,\n\t column: this.index - this.lineStart\n\t };\n\t var entry = {\n\t multiLine: false,\n\t slice: [start + offset, this.index],\n\t range: [start, this.index],\n\t loc: loc\n\t };\n\t comments.push(entry);\n\t }\n\t return comments;\n\t };\n\t Scanner.prototype.skipMultiLineComment = function () {\n\t var comments = [];\n\t var start, loc;\n\t if (this.trackComment) {\n\t comments = [];\n\t start = this.index - 2;\n\t loc = {\n\t start: {\n\t line: this.lineNumber,\n\t column: this.index - this.lineStart - 2\n\t },\n\t end: {}\n\t };\n\t }\n\t while (!this.eof()) {\n\t var ch = this.source.charCodeAt(this.index);\n\t if (character_1.Character.isLineTerminator(ch)) {\n\t if (ch === 0x0D && this.source.charCodeAt(this.index + 1) === 0x0A) {\n\t ++this.index;\n\t }\n\t ++this.lineNumber;\n\t ++this.index;\n\t this.lineStart = this.index;\n\t }\n\t else if (ch === 0x2A) {\n\t // Block comment ends with '*/'.\n\t if (this.source.charCodeAt(this.index + 1) === 0x2F) {\n\t this.index += 2;\n\t if (this.trackComment) {\n\t loc.end = {\n\t line: this.lineNumber,\n\t column: this.index - this.lineStart\n\t };\n\t var entry = {\n\t multiLine: true,\n\t slice: [start + 2, this.index - 2],\n\t range: [start, this.index],\n\t loc: loc\n\t };\n\t comments.push(entry);\n\t }\n\t return comments;\n\t }\n\t ++this.index;\n\t }\n\t else {\n\t ++this.index;\n\t }\n\t }\n\t // Ran off the end of the file - the whole thing is a comment\n\t if (this.trackComment) {\n\t loc.end = {\n\t line: this.lineNumber,\n\t column: this.index - this.lineStart\n\t };\n\t var entry = {\n\t multiLine: true,\n\t slice: [start + 2, this.index],\n\t range: [start, this.index],\n\t loc: loc\n\t };\n\t comments.push(entry);\n\t }\n\t this.tolerateUnexpectedToken();\n\t return comments;\n\t };\n\t Scanner.prototype.scanComments = function () {\n\t var comments;\n\t if (this.trackComment) {\n\t comments = [];\n\t }\n\t var start = (this.index === 0);\n\t while (!this.eof()) {\n\t var ch = this.source.charCodeAt(this.index);\n\t if (character_1.Character.isWhiteSpace(ch)) {\n\t ++this.index;\n\t }\n\t else if (character_1.Character.isLineTerminator(ch)) {\n\t ++this.index;\n\t if (ch === 0x0D && this.source.charCodeAt(this.index) === 0x0A) {\n\t ++this.index;\n\t }\n\t ++this.lineNumber;\n\t this.lineStart = this.index;\n\t start = true;\n\t }\n\t else if (ch === 0x2F) {\n\t ch = this.source.charCodeAt(this.index + 1);\n\t if (ch === 0x2F) {\n\t this.index += 2;\n\t var comment = this.skipSingleLineComment(2);\n\t if (this.trackComment) {\n\t comments = comments.concat(comment);\n\t }\n\t start = true;\n\t }\n\t else if (ch === 0x2A) {\n\t this.index += 2;\n\t var comment = this.skipMultiLineComment();\n\t if (this.trackComment) {\n\t comments = comments.concat(comment);\n\t }\n\t }\n\t else {\n\t break;\n\t }\n\t }\n\t else if (start && ch === 0x2D) {\n\t // U+003E is '>'\n\t if ((this.source.charCodeAt(this.index + 1) === 0x2D) && (this.source.charCodeAt(this.index + 2) === 0x3E)) {\n\t // '-->' is a single-line comment\n\t this.index += 3;\n\t var comment = this.skipSingleLineComment(3);\n\t if (this.trackComment) {\n\t comments = comments.concat(comment);\n\t }\n\t }\n\t else {\n\t break;\n\t }\n\t }\n\t else if (ch === 0x3C && !this.isModule) {\n\t if (this.source.slice(this.index + 1, this.index + 4) === '!--') {\n\t this.index += 4; // `