diff --git a/src/ui/builder/advanced_mode.py b/src/ui/builder/advanced_mode.py deleted file mode 100644 index 115a5d828..000000000 --- a/src/ui/builder/advanced_mode.py +++ /dev/null @@ -1,38 +0,0 @@ -from .utils.form import get_forms, get_service_settings - - -def advanced_mode_builder(templates: list[dict], plugins: list, global_config: dict, total_config: dict, service_name: str, is_new: bool = False) -> str: - """Render forms with global config data. - ATM we don't need templates but we need to pass at least one to the function (it will simply not override anything). - """ - settings = get_service_settings(service_name, global_config, total_config) - - builder = [ - { - "type": "card", - "containerColumns": {"pc": 12, "tablet": 12, "mobile": 12}, - "widgets": [ - { - "type": "Title", - "data": { - "title": service_name, - "type": "container", - "lowercase": True, - }, - }, - { - "type": "Subtitle", - "data": {"subtitle": "services_manage_subtitle", "type": "container"}, - }, - { - "type": "Templates", - "data": { - "templates": get_forms(templates, plugins, settings, ("advanced",), is_new, True), - "operation": "new" if is_new else "edit", - "oldServerName": service_name if service_name else "", - }, - }, - ], - } - ] - return builder diff --git a/src/ui/builder/easy_mode.py b/src/ui/builder/easy_mode.py deleted file mode 100644 index 66adeaa3d..000000000 --- a/src/ui/builder/easy_mode.py +++ /dev/null @@ -1,39 +0,0 @@ -from .utils.form import get_forms, get_service_settings - - -def easy_mode_builder(templates: list[dict], plugins: list, global_config: dict, total_config: dict, service_name: str, is_new: bool = False) -> str: - """Render forms with global config data. - ATM we don't need templates but we need to pass at least one to the function (it will simply not override anything). - """ - - # We need - settings = get_service_settings(service_name, global_config, total_config) - builder = [ - { - "type": "card", - "containerColumns": {"pc": 12, "tablet": 12, "mobile": 12}, - "widgets": [ - { - "type": "Title", - "data": { - "title": service_name, - "type": "container", - "lowercase": True, - }, - }, - { - "type": "Subtitle", - "data": {"subtitle": "services_manage_subtitle", "type": "container"}, - }, - { - "type": "Templates", - "data": { - "templates": get_forms(templates, plugins, settings, ("easy",), is_new, True), - "operation": "new" if is_new else "edit", - "oldServerName": service_name if service_name else "", - }, - }, - ], - } - ] - return builder diff --git a/src/ui/builder/global_config.py b/src/ui/builder/global_config.py deleted file mode 100644 index 039408e94..000000000 --- a/src/ui/builder/global_config.py +++ /dev/null @@ -1,31 +0,0 @@ -from .utils.form import get_forms - - -def global_config_builder(templates: list[dict], plugins: list, settings: dict) -> str: - """Render forms with global config data. - ATM we don't need templates but we need to pass at least one to the function (it will simply not override anything). - """ - - builder = [ - { - "type": "card", - "containerColumns": {"pc": 12, "tablet": 12, "mobile": 12}, - "widgets": [ - { - "type": "Title", - "data": {"title": "global_config_title", "type": "container"}, - }, - { - "type": "Subtitle", - "data": {"subtitle": "global_config_subtitle", "type": "container"}, - }, - { - "type": "Templates", - "data": { - "templates": get_forms(templates, plugins, settings, ("advanced", "raw")), - }, - }, - ], - } - ] - return builder diff --git a/src/ui/builder/home.py b/src/ui/builder/home.py deleted file mode 100644 index d310d90ff..000000000 --- a/src/ui/builder/home.py +++ /dev/null @@ -1,84 +0,0 @@ -from .utils.widgets import stat_widget - - -def home_builder(data: dict) -> str: - """ - It returns the needed format from data to render the home page in JSON format for the Vue.js builder - """ - version_card = stat_widget( - link="https://panel.bunkerweb.io/?utm_campaign=self&utm_source=ui#pro", - containerColums={"pc": 4, "tablet": 6, "mobile": 12}, - title="home_version", - subtitle=( - "home_all_features_available" - if data.get("is_pro_version") - else ( - "home_awaiting_compliance" - if data.get("pro_status") == "active" and data.get("pro_overlapped") - else ( - "home_renew_license" - if data.get("pro_status") == "expired" - else "home_talk_to_team" if data.get("pro_status") == "suspended" else "home_upgrade_to_pro" - ) - ) - ), - subtitle_color="success" if data.get("is_pro_version") else "warning", - stat=( - "home_pro" - if data.get("is_pro_version") - else ( - "home_pro_locked" - if data.get("pro_status") == "active" and data.get("pro_overlapped") - else "home_expired" if data.get("pro_status") == "expired" else "home_suspended" if data.get("pro_status") == "suspended" else "home_free" - ) - ), - icon_name="crown" if data.get("is_pro_version") else "key", - ) - - version_num_card = stat_widget( - link="https://github.com/bunkerity/bunkerweb", - containerColums={"pc": 4, "tablet": 6, "mobile": 12}, - title="home_version_number", - subtitle=( - "home_couldnt_find_remote" - if not data.get("remote_version") - else "home_latest_version" if data.get("remote_version") and data.get("check_version") else "home_update_available" - ), - subtitle_color=("error" if not data.get("remote_version") else "success" if data.get("remote_version") and data.get("check_version") else "warning"), - stat=data.get("version"), - icon_name="wire", - ) - - instances_card = stat_widget( - link="instances", - containerColums={"pc": 4, "tablet": 6, "mobile": 12}, - title="home_instances", - subtitle="home_total_number", - subtitle_color="info", - stat=data.get("instances_number"), - icon_name="box", - ) - - services_card = stat_widget( - link="services", - containerColums={"pc": 4, "tablet": 6, "mobile": 12}, - title="home_services", - subtitle="home_all_methods_included", - subtitle_color="info", - stat=data.get("services_number"), - icon_name="disk", - ) - - plugins_card = stat_widget( - link="plugins", - containerColums={"pc": 4, "tablet": 6, "mobile": 12}, - title="home_plugins", - subtitle="home_errors_found" if data.get("plugins_errors") > 0 else "home_no_error", - subtitle_color="error" if data.get("plugins_errors") > 0 else "success", - stat=data.get("plugins_number"), - icon_name="puzzle", - ) - - builder = [version_card, version_num_card, instances_card, services_card, plugins_card] - - return builder diff --git a/src/ui/builder/instances.py b/src/ui/builder/instances.py deleted file mode 100644 index f74238123..000000000 --- a/src/ui/builder/instances.py +++ /dev/null @@ -1,42 +0,0 @@ -from .utils.widgets import instance_widget - - -def instances_builder(instances: List[Instance]) -> str: - """ - It returns the needed format from data to render the instances page in JSON format for the Vue.js builder - """ - builder = [] - - for instance in instances: - # setup actions buttons - actions = ["reload", "stop"] if instance.status == "up" else ["start"] - - buttons = [ - { - "attrs": { - "data-submit-form": f"""{{"INSTANCE_ID" : "{instance.hostname}", "operation" : "{action}" }}""", - }, - "text": f"action_{action}", - "color": "success" if action == "start" else "error" if action == "stop" else "warning", - } - for action in actions - ] - - instance = instance_widget( - containerColumns={"pc": 6, "tablet": 6, "mobile": 12}, - pairs=[ - {"key": "instances_name", "value": instance.name}, - {"key": "instances_hostname", "value": instance.hostname}, - {"key": "instances_type", "value": instance.type}, - {"key": "instances_method", "value": instance.method}, - {"key": "instances_creation_date", "value": instance.creation_date.strftime("%d-%m-%Y %H:%M:%S")}, - {"key": "instances_last_seen", "value": instance.last_seen.strftime("%d-%m-%Y %H:%M:%S")}, - ], - status="success" if instance.status == "up" else "error", - title=instance.hostname, - buttons=buttons, - ) - - builder.append(instance) - - return builder diff --git a/src/ui/builder/jobs.py b/src/ui/builder/jobs.py deleted file mode 100644 index 0ebbbd7e5..000000000 --- a/src/ui/builder/jobs.py +++ /dev/null @@ -1,290 +0,0 @@ -from .utils.widgets import title_widget, table_widget - - -def jobs_builder(jobs): - - jobs_list = get_jobs_list(jobs) - - intervals = ["all"] - - # loop on each job - for job in jobs_list: - # loop on each item - for item in job: - # get the interval if not already in intervals - if item.get("every") and item.get("every") not in intervals: - intervals.append(item.get("every")) - - builder = [ - { - "type": "card", - "containerColumns": {"pc": 12, "tablet": 12, "mobile": 12}, - "widgets": [ - title_widget("jobs_title"), - table_widget( - positions=[3, 2, 1, 1, 1, 1, 3], - header=[ - "jobs_table_name", - "jobs_table_plugin_id", - "jobs_table_interval", - "jobs_table_reload", - "jobs_table_success", - "jobs_table_history", - "jobs_table_cache_downloadable", - ], - items=jobs_list, - filters=[ - { - "filter": "table", - "filterName": "keyword", - "type": "keyword", - "value": "", - "keys": ["name", "plugin_id"], - "field": { - "id": "jobs-keyword", - "value": "", - "type": "text", - "name": "jobs-keyword", - "label": "jobs_search", - "placeholder": "inp_keyword", - "isClipboard": False, - "popovers": [ - { - "text": "jobs_search_desc", - "iconName": "info", - }, - ], - "columns": {"pc": 3, "tablet": 4, "mobile": 12}, - }, - }, - { - "filter": "table", - "filterName": "every", - "type": "select", - "value": "all", - "keys": ["every"], - "field": { - "id": "jobs-every", - "value": "all", - "values": intervals, - "name": "jobs-every", - "onlyDown": True, - "label": "jobs_interval", - "popovers": [ - { - "text": "jobs_interval_desc", - "iconName": "info", - }, - ], - "columns": {"pc": 3, "tablet": 4, "mobile": 12}, - }, - }, - { - "filter": "table", - "filterName": "reload", - "type": "select", - "value": "all", - "keys": ["reload"], - "field": { - "id": "jobs-last-run", - "value": "all", - "values": ["all", "success", "failed"], - "name": "jobs-last-run", - "onlyDown": True, - "label": "jobs_reload", - "popovers": [ - { - "text": "jobs_reload_desc", - "iconName": "info", - }, - ], - "columns": {"pc": 3, "tablet": 4, "mobile": 12}, - }, - }, - { - "filter": "table", - "filterName": "success", - "type": "select", - "value": "all", - "keys": ["success"], - "field": { - "id": "jobs-success", - "value": "all", - "values": ["all", "success", "failed"], - "name": "jobs-success", - "onlyDown": True, - "label": "jobs_success", - "popovers": [ - { - "text": "jobs_success_desc", - "iconName": "info", - }, - ], - "columns": {"pc": 3, "tablet": 4, "mobile": 12}, - }, - }, - ], - minWidth="lg", - title="jobs_table_title", - ), - ], - } - ] - - return builder - - -def get_jobs_list(jobs): - data = [] - # loop on each dict - for key, value in jobs.items(): - item = [] - item.append({"name": key, "type": "Text", "data": {"text": key}}) - # loop on each value - for k, v in value.items(): - # override widget type for some keys - if k in ("reload", "history"): - is_success = v if k == "reload" else v[0].get("success") - item.append( - { - k: "success" if is_success else "failed", - "type": "Icons", - "data": { - "iconName": "check" if is_success else "cross", - }, - } - ) - - if k not in ("history"): - continue - - if k in ("plugin_id", "every"): - item.append({k: v, "type": "Text", "data": {"text": v}}) - continue - - if k in ("history"): - items = [] - for hist in v: - items.append( - [ - { - "type": "Text", - "data": { - "text": hist["start_date"], - }, - }, - { - "type": "Text", - "data": { - "text": hist["end_date"], - }, - }, - { - "type": "Icons", - "data": { - "iconName": "check" if hist["success"] else "cross", - }, - }, - ] - ) - - item.append( - { - "type": "Button", - "data": { - "id": f"open-modal-history-{k}", - "text": "jobs_history", - "hideText": True, - "color": "blue", - "size": "normal", - "iconName": "document", - "iconColor": "white", - "modal": { - "widgets": [ - {"type": "Title", "data": {"title": key}}, - {"type": "Subtitle", "data": {"subtitle": "jobs_history_subtitle"}}, - { - "type": "Table", - "data": { - "title": "jobs_history_table_title", - "minWidth": "", - "header": [ - "jobs_table_start_run", - "jobs_table_end_run", - "jobs_table_success", - ], - "positions": [5, 5, 2], - "items": items, - }, - }, - { - "type": "ButtonGroup", - "data": { - "buttons": [ - { - "id": f"close-history-{k}", - "text": "action_close", - "color": "close", - "size": "normal", - "attrs": {"data-close-modal": ""}, - } - ] - }, - }, - ] - }, - }, - } - ) - - if k in ("cache") and len(v) <= 0: - item.append({k: v, "type": "Text", "data": {"text": ""}}) - continue - - if k in ("cache") and len(v) > 0: - files = [] - # loop on each cache item - for cache in v: - file_name = f"{cache['file_name']} [{cache['service_id']}]" if cache["service_id"] else f"{cache['file_name']}" - files.append(file_name) - - item.append( - { - k: " ".join(files), - "type": "Fields", - "data": { - "setting": { - "attrs": { - "data-plugin-id": value.get("plugin_id", ""), - "data-job-name": key, - }, - "id": f"{key}_cache", - "label": f"{key}_cache", - "hideLabel": True, - "inpType": "select", - "name": f"{key}_cache", - "value": "download file", - "values": files, - "columns": { - "pc": 12, - "tablet": 12, - "mobile": 12, - }, - "overflowAttrEl": "data-table-body", - "containerClass": "table download-cache-file", - "maxBtnChars": 16, - "popovers": [ - { - "iconName": "info", - "text": "jobs_download_cache_file", - }, - ], - } - }, - } - ) - continue - - data.append(item) - - return data diff --git a/src/ui/builder/logs.py b/src/ui/builder/logs.py deleted file mode 100644 index 94297bdee..000000000 --- a/src/ui/builder/logs.py +++ /dev/null @@ -1,83 +0,0 @@ -from .utils.widgets import title_widget - - -def logs_builder(files: list[str] = [], current_file: str = "", raw_data: str = "") -> str: - - if not files: - builder = [ - { - "type": "void", - "widgets": [{"type": "MessageUnmatch", "data": {"text": "logs_no_files_found"}}], - } - ] - return builder - - file_select = { - "type": "Fields", - "data": { - "setting": { - "id": "logs-select-file", - "label": "logs_log_file", - "inpType": "select", - "name": "logs-select-file", - "onlyDown": True, - "value": current_file or "Select a file", - "values": files, - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12, - }, - "maxBtnChars": 20, - "attrs": { - "data-log": "true", - }, - "popovers": [ - { - "iconName": "info", - "text": "logs_select_file_info", - }, - ], - } - }, - } - - if not raw_data: - builder = [ - { - "type": "card", - "containerColumns": {"pc": 12, "tablet": 12, "mobile": 12}, - "widgets": [title_widget("logs_title"), file_select, {"type": "MessageUnmatch", "data": {"text": "logs_not_selected_or_not_found"}}], - } - ] - return builder - - editor = { - "type": "Fields", - "data": { - "setting": { - "containerClass": "mt-4", - "id": "logs-file-content", - "label": "logs_file_content", - "inpType": "editor", - "name": "logs-file-content", - "value": raw_data, - "columns": { - "pc": 12, - "tablet": 12, - "mobile": 12, - }, - "editorClass" : "min-h-[500px]", - } - }, - } - - builder = [ - { - "type": "card", - "containerColumns": {"pc": 12, "tablet": 12, "mobile": 12}, - "widgets": [title_widget("logs_title"), file_select, editor], - } - ] - - return builder diff --git a/src/ui/builder/raw_mode.py b/src/ui/builder/raw_mode.py deleted file mode 100644 index 866360f48..000000000 --- a/src/ui/builder/raw_mode.py +++ /dev/null @@ -1,40 +0,0 @@ -from .utils.form import get_forms, get_service_settings - - -def raw_mode_builder(templates: list[dict], plugins: list, global_config: dict, total_config: dict, service_name: str, is_new: bool = False) -> str: - """Render forms with global config data. - ATM we don't need templates but we need to pass at least one to the function (it will simply not override anything). - """ - - # We need - settings = get_service_settings(service_name, global_config, total_config) - - builder = [ - { - "type": "card", - "containerColumns": {"pc": 12, "tablet": 12, "mobile": 12}, - "widgets": [ - { - "type": "Title", - "data": { - "title": service_name, - "type": "container", - "lowercase": True, - }, - }, - { - "type": "Subtitle", - "data": {"subtitle": "services_manage_subtitle", "type": "container"}, - }, - { - "type": "Templates", - "data": { - "templates": get_forms(templates, plugins, settings, ("raw",), is_new, True), - "operation": "new" if is_new else "edit", - "oldServerName": service_name if service_name else "", - }, - }, - ], - } - ] - return builder diff --git a/src/ui/builder/services.py b/src/ui/builder/services.py deleted file mode 100644 index c30d88f90..000000000 --- a/src/ui/builder/services.py +++ /dev/null @@ -1,379 +0,0 @@ -from typing import Union - -from .utils.widgets import title_widget, table_widget - - -def services_builder(services): - # get method for each service["SERVER_NAME"]["method"] - methods = list(set([service["SERVER_NAME"]["method"] for service in services])) - - services_list = get_services_list(services) - - builder = [ - { - "type": "card", - "containerColumns": {"pc": 12, "tablet": 12, "mobile": 12}, - "widgets": [ - title_widget("services_title"), - { - "type": "Button", - "data": { - "id": "services-new", - "text": "services_new", - "color": "success", - "size": "normal", - "iconName": "plus", - "iconColor": "white", - "modal": services_action(server_name="new", operation="new", title="services_new_title", subtitle="services_new_subtitle"), - "containerClass": "col-span-12 flex justify-center", - }, - }, - table_widget( - positions=[4, 4, 4], - header=[ - "services_table_name", - "services_table_method", - "services_table_actions", - ], - items=services_list, - filters=[ - { - "filter": "table", - "filterName": "keyword", - "type": "keyword", - "value": "", - "keys": ["name"], - "field": { - "id": "services-keyword", - "value": "", - "type": "text", - "name": "services-keyword", - "label": "services_search", - "placeholder": "inp_keyword", - "isClipboard": False, - "popovers": [ - { - "text": "services_search_desc", - "iconName": "info", - }, - ], - "columns": {"pc": 3, "tablet": 4, "mobile": 12}, - }, - }, - { - "filter": "table", - "filterName": "method", - "type": "select", - "value": "all", - "keys": ["method"], - "field": { - "id": "services-methods", - "value": "all", - "values": methods, - "name": "services-methods", - "onlyDown": True, - "label": "services_methods", - "popovers": [ - { - "text": "services_methods_desc", - "iconName": "info", - }, - ], - "columns": {"pc": 3, "tablet": 4, "mobile": 12}, - }, - }, - { - "filter": "table", - "filterName": "draft", - "type": "select", - "value": "all", - "keys": ["draft"], - "field": { - "id": "services-draft", - "value": "all", - "values": ["all", "online", "draft"], - "name": "services-draft", - "onlyDown": True, - "label": "services_draft", - "popovers": [ - { - "text": "services_draft_desc", - "iconName": "info", - }, - ], - "columns": {"pc": 3, "tablet": 4, "mobile": 12}, - }, - }, - ], - minWidth="md", - title="services_table_title", - ), - ], - }, - ] - - return builder - - -def services_settings(settings: dict) -> dict: - # deep copy settings dict - settings = settings.copy() - # remove "SERVER_NAME" and "IS_DRAFT" key - settings.pop("SERVER_NAME", None) - settings.pop("IS_DRAFT", None) - # Create table with settings remaining keys - settings_table_items = [] - for key, value in settings.items(): - format_key = key.replace("USE_", "").replace("_", " ") - settings_table_items.append( - [ - { - "type": "Text", - "data": {"text": format_key}, - }, - { - "type": "Icons", - "data": { - "iconName": "check" if value.get("value") == "yes" else "cross", - }, - }, - ] - ) - - table = table_widget( - positions=[8, 4], - header=["services_settings_table_name", "services_settings_table_status"], - items=settings_table_items, - filters=[], - minWidth="", - title="services_settings_table_title", - ) - - return table - - -def services_action( - server_name: str = "", - operation: str = "", - title: str = "", - subtitle: str = "", - additional: str = "", - is_draft: Union[bool, None] = None, - service: dict = None, -) -> dict: - - buttons = [ - { - "id": f"close-service-btn-{server_name}", - "text": "action_close", - "disabled": False, - "color": "close", - "size": "normal", - "attrs": {"data-close-modal": ""}, - }, - ] - - if operation == "delete": - buttons.append( - { - "id": f"{operation}-service-btn-{server_name}", - "text": f"action_{operation}", - "disabled": False, - "color": "delete", - "size": "normal", - "attrs": { - "data-submit-form": f"""{{"SERVER_NAME" : "{server_name}", "operation" : "{operation}" }}""", - }, - }, - ) - - if operation == "draft": - draft_value = "yes" if is_draft else "no" - buttons.append( - { - "id": f"{operation}-service-btn-{server_name}", - "text": "action_switch", - "disabled": False, - "color": "success", - "size": "normal", - "attrs": { - "data-submit-form": f"""{{"SERVER_NAME" : "{server_name}", "OLD_SERVER_NAME" : "{server_name}", "operation" : "edit", "IS_DRAFT" : "{draft_value}" }}""", - }, - }, - ) - - content = [ - { - "type": "Title", - "data": { - "title": title, - }, - }, - ] - - if subtitle: - content.append( - { - "type": "Text", - "data": { - "text": subtitle, - }, - }, - ) - - if additional: - content.append( - { - "type": "Text", - "data": { - "bold": True, - "text": additional, - }, - } - ) - - if operation == "plugins": - settings = services_settings(service) - content.append(settings) - - if operation == "delete": - content.append( - { - "type": "Text", - "data": { - "text": "", - "bold": True, - "text": server_name, - }, - } - ) - - if operation == "edit" or operation == "new": - modes = ("easy", "advanced", "raw") - mode_buttons = [] - for mode in modes: - mode_buttons.append( - { - "id": f"{operation}-service-btn-{server_name}", - "text": f"services_mode_{mode}", - "disabled": False, - "color": "info", - "size": "normal", - "attrs": { - "role": "link", - "data-link": f"modes?service_name={server_name}&mode={mode}" if operation != "new" else f"modes?mode={mode}", - }, - }, - ) - - content.append( - { - "type": "ButtonGroup", - "data": {"buttons": mode_buttons}, - } - ) - - content.append( - { - "type": "ButtonGroup", - "data": {"buttons": buttons}, - }, - ) - - modal = { - "widgets": content, - } - - return modal - - -def get_services_list(services): - data = [] - for index, service in enumerate(services): - server_name = service["SERVER_NAME"]["value"] - server_method = service["SERVER_NAME"]["method"] - is_draft = True if service["IS_DRAFT"]["value"] == "yes" else False - is_deletable = False if server_method in ("autoconf", "scheduler") else True - - item = [] - # Get name - item.append({"name": server_name, "type": "Text", "data": {"text": server_name}}) - item.append({"method": server_method, "type": "Text", "data": {"text": server_method}}) - item.append( - { - "type": "ButtonGroup", - "data": { - "buttons": [ - { - "id": f"open-modal-plugins-{index}", - "text": "plugins", - "hideText": True, - "color": "success", - "size": "normal", - "iconName": "eye", - "iconColor": "white", - "modal": services_action( - server_name=server_name, - operation="plugins", - title="services_plugins_title", - subtitle="", - service=service, - ), - }, - { - "attrs": {"data-server-name": server_name}, - "id": f"open-modal-manage-{index}", - "text": "manage", - "hideText": True, - "color": "edit", - "size": "normal", - "iconName": "pen", - "iconColor": "white", - "modal": services_action( - server_name=server_name, - operation="edit", - title="services_edit_title", - subtitle="services_edit_subtitle", - additional=server_name, - ), - }, - { - "attrs": {"data-server-name": server_name, "data-is-draft": "yes" if is_draft else "no"}, - "id": f"open-modal-draft-{index}", - "text": "draft" if is_draft else "online", - "hideText": True, - "color": "blue", - "size": "normal", - "iconName": "document" if is_draft else "globe", - "iconColor": "white", - "modal": services_action( - server_name=server_name, - operation="draft", - title="services_draft_title", - subtitle="services_draft_subtitle" if is_draft else "services_online_subtitle", - additional="services_draft_switch_subtitle" if is_draft else "services_online_switch_subtitle", - is_draft=is_draft, - ), - }, - { - "attrs": {"data-server-name": server_name}, - "id": f"open-modal-delete-{index}", - "text": "delete", - "disabled": not is_deletable, - "hideText": True, - "color": "red", - "size": "normal", - "iconName": "trash", - "iconColor": "white", - "modal": services_action( - server_name=server_name, operation="delete", title="services_delete_title", subtitle="services_delete_subtitle" - ), - }, - ] - }, - } - ) - - data.append(item) - - return data diff --git a/src/ui/builder/utils/form.py b/src/ui/builder/utils/form.py deleted file mode 100644 index 297ab7597..000000000 --- a/src/ui/builder/utils/form.py +++ /dev/null @@ -1,494 +0,0 @@ -import copy -from typing import Union - - -def get_setting_data(template_settings: dict, settings: dict, setting: str, value: dict, is_multiple_setting: bool = False, is_new: bool = False) -> tuple: - template_value = template_settings.get(setting, None) - current_value = settings[setting].get("value", None) if setting in settings else None - default_value = value.get("default") - is_disabled_method = ( - True if settings.get(setting, {}).get("method", "ui") not in ("ui", "default", "manual") and not is_new and not is_multiple_setting else False - ) - is_current_from_template = True if settings.get(setting, {}).get("template", None) is not None and template_value is not None else False - is_current_default = current_value is not None and current_value == default_value - setting_value = current_value if current_value is not None and not is_new and not is_multiple_setting else default_value - return template_value, current_value, default_value, is_disabled_method, is_current_from_template, is_current_default, setting_value - - -def get_service_settings(service_name: str, global_config: dict, total_config: dict) -> dict: - """ - total_config is a dict that contains global settings and services settings (format SERVICE_NAME_SETTING - www.example.com_USE_ANTIBOT for example -). - We will only keep settings that are related to the service_name (with prefix SERVICE_NAME_). - Then we will loop on global key and override value from global config by service config if exists. - """ - - # Get service settings - service_settings = {} - for key, value in total_config.items(): - if not key.startswith(f"{service_name}_"): - continue - - service_settings[key.replace(f"{service_name}_", "")] = value - - # Loop on global settings to override by service settings - for key, value in service_settings.items(): - global_config[key] = value - - return global_config - - -def get_plugins_multisite(plugins: list) -> list: - # loop on plugins with list index - plugins_multisite = [] - for index, plugin in enumerate(plugins): - multisite_settings = {} - # loop on settings - for setting, value in plugin.get("settings").items(): - # check if setting is multisite - if value.get("context") != "multisite": - continue - # add multisite key to plugin - multisite_settings[setting] = value - - # add multisite settings to plugin - if len(multisite_settings): - plugin_multisite = copy.deepcopy(plugin) - plugin_multisite["settings"] = multisite_settings - plugins_multisite.append(plugin_multisite) - - return plugins_multisite - - -def get_forms( - templates_ui: list = [], - plugins: list = [], - settings: dict = {}, - render_forms: tuple = ("advanced", "easy", "raw"), - is_new: bool = False, - only_multisite: bool = False, -) -> dict: - """ - Will generate every needed form using templates, plugins and settings. - We will run on each plugins, set template value if one, and override by the custom settings value if exists. - We will format to fit each form type (easy, advanced, raw) in case - """ - # Copy of the plugins, and get the plugins by context if needed - # In services page, we want only multisite settings, but in global config we want both - plugins_base = get_plugins_multisite(plugins) if only_multisite else plugins - - # This template will be used to show default value or value if exists - templates = [ - { - "name": "default", - "steps": [], - "configs": {}, - "settings": {}, - } - ] - - for key, value in templates_ui.items(): - value["label"] = value["name"] - value["name"] = key - templates.append(value) - - # Update SERVER_NAME to be empty if new - if is_new and "SERVER_NAME" in settings: - settings["SERVER_NAME"]["value"] = "" - - if is_new and not "SERVER_NAME" in settings: - settings["SERVER_NAME"] = {"value": "", "method": "ui", "global": False} - - forms = {} - for form in render_forms: - forms[form] = {} - - for template in templates: - if "advanced" in forms: - forms["advanced"][template.get("name")] = set_advanced(template, plugins_base, settings, is_new) - - if "raw" in forms: - forms["raw"][template.get("name")] = set_raw(template, plugins_base, settings, is_new) - - if "easy" in forms: - forms["easy"][template.get("name")] = set_easy(template, plugins_base, settings, is_new) - - return forms - - -def set_easy(template: list, plugins_base: list, settings: dict, is_new: bool) -> dict: - """ - Prepare the easy form based on the template and plugins data. - We need to loop on each steps and prepare settings and configs for each step. - """ - - template_settings = template.get("settings") - plugins = copy.deepcopy(plugins_base) - # Copy of the plugins base data - plugins = copy.deepcopy(plugins_base) - # Update settings with global config data - for plugin in plugins: - loop_id = 0 - total_settings = len(plugin.get("settings")) - for setting, value in plugin.get("settings").items(): - loop_id += 1 - value = format_setting(setting, value, total_settings, loop_id, template_settings, settings, is_new) - - set_multiples(template, plugins, settings) - - steps = template.get("steps") - for step in steps: - step_settings = step.get("settings", {}) - - for plugin in plugins: - step_settings_output = {} - for setting, value in plugin.get("settings").items(): - if setting not in step_settings: - continue - - step_settings_output[setting] = value - - # Case at least one key in step settings, we can add the plugin settings to the step - if len(step_settings_output) and not "plugins" in step: - step["plugins"] = [] - - if len(step_settings_output): - step_plugin = copy.deepcopy(plugin) - step_plugin["settings"] = step_settings_output - step["plugins"].append(step_plugin) - - # remove settings key form step - step.pop("settings", None) - return steps - - -def set_raw(template: list, plugins_base: list, settings: dict, is_new: bool = False) -> dict: - """ - Set the raw form based on the template and plugins data. - It consists of keeping only the value or default value for each plugin settings. - """ - template_settings = template.get("settings") - raw_settings = {} - # Copy of the plugins base - plugins = copy.deepcopy(plugins_base) - # Update settings with global config data - for plugin in plugins: - for setting, value in plugin.get("settings").items(): - - is_multiple_setting = "multiple" in value - - # By default, we will loop on one setting (not multiple) - total_settings = {setting: value} - - # Case multiple, retrieve all settings that start with setting name - if is_multiple_setting: - # get all settings that start with setting name - total_settings = {k: v for k, v in settings.items() if k.startswith(f"{setting}")} - - # Loop in a same way it is a multiple or regular setting - for mult_setting, mult_value in total_settings.items(): - - # Get setting data - # We need to send setting and not mult_setting because mult_setting is unknown on plugin side - template_value, current_value, default_value, is_disabled_method, is_current_from_template, is_current_default, setting_value = ( - get_setting_data(template_settings, settings, mult_setting, mult_value) - ) - - if current_value is not None: - raw_settings[mult_setting] = current_value - continue - - if template_value is not None: - raw_settings[mult_setting] = template_value - continue - - return raw_settings - - -def set_advanced(template: list, plugins_base: list, settings: dict, is_new: bool) -> dict: - """ - Set the advanced form based on the template and plugins data. - It consists of formatting each plugin settings to be used in the advanced form. - """ - template_settings = template.get("settings") - # Copy of the plugins base data - plugins = copy.deepcopy(plugins_base) - # Update settings with global config data - for plugin in plugins: - loop_id = 0 - total_settings = len(plugin.get("settings")) - for setting, value in plugin.get("settings").items(): - loop_id += 1 - value = format_setting(setting, value, total_settings, loop_id, template_settings, settings, is_new) - - set_multiples(template, plugins, settings) - - return plugins - - -def get_multiple_from_template(template, multiples): - """ - We are gonna loop on each plugins multiples group, in case a setting is matching a template setting, - we will create a group using the prefix as key (or "0" if no prefix) with default settings at first. - Then we will override by the template value in case there is one. - This will return something of this type : - {'0' : {'setting' : value, 'setting2': value2}, '1' : {'setting_1': value, 'setting2_1': value}} } - """ - # Loop on each plugin and loop on multiples key - # Check if the name us matching a template key - multiple_plugin = copy.deepcopy(multiples) - - multiple_template = {} - for setting, value in template.get("settings").items(): - # Sanitize setting name to remove prefix of type _1 if exists - # Slipt by _ and check if last element is a digit - format_setting = setting - setting_split = setting.split("_") - prefix = "0" - if setting_split[-1].isdigit(): - prefix = setting_split[-1] - format_setting = "_".join(setting_split[:-1]) - # loop on settings of a multiple group - for mult_name, mult_settings in multiple_plugin.items(): - - # Check if at least one setting is matching a multiple setting - if not format_setting in mult_settings: - continue - - # Case we have at least one multiple setting, we can check if multiple name exists or create it - if not mult_name in multiple_template: - multiple_template[mult_name] = {} - - # Case it is, we will check if already a group with the right prefix exists - # If not, we will create it - if not prefix in multiple_template[mult_name]: - # We want each settings to have the prefix if exists - # We will get the value of the setting without the prefix and create a prefix key with the same value - # And after that we can delete the original setting - new_multiple_group = {} - for multSett, multValue in mult_settings.items(): - new_multiple_group[f"{multSett}{f'_{prefix}' if prefix != '0' else ''}"] = multValue - - new_multiple_group = copy.deepcopy(new_multiple_group) - - # Update id for each settings - for multSett, multValue in new_multiple_group.items(): - multValue["id"] = f"{multValue['id']}{f'-{prefix}' if prefix != '0' else ''}" - - multiple_template[mult_name][prefix] = new_multiple_group - - # We can now add the template value to setting using the same setting name with prefix - multiple_template[mult_name][prefix][setting]["value"] = value - multiple_template[mult_name][prefix][setting]["prev_value"] = value - multiple_template[mult_name][prefix][setting]["method"] = "default" - - # Sort key incrementally - for mult_name, mult_settings in multiple_template.items(): - multiple_template[mult_name] = dict(sorted(mult_settings.items(), key=lambda item: int(item[0]))) - return multiple_template - - -def get_multiple_from_settings(settings, multiples): - """ - We are gonna loop on each plugins multiples group, in case a setting is matching a service / global config setting, - we will create a group using the prefix as key (or "0" if no prefix) with default settings at first. - Then we will override by the service / global config value in case there is one. - This will return something of this type : - {'0' : {'setting' : value, 'setting2': value2}, '1' : {'setting_1': value, 'setting2_1': value}} } - """ - - # Loop on each plugin and loop on multiples key - # Check if the name us matching a template key - multiple_plugins = copy.deepcopy(multiples) - - multiple_settings = {} - for setting, value in settings.items(): - # Sanitize setting name to remove prefix of type _1 if exists - # Slipt by _ and check if last element is a digit - format_setting = setting - setting_split = setting.split("_") - prefix = "0" - if setting_split[-1].isdigit(): - prefix = setting_split[-1] - format_setting = "_".join(setting_split[:-1]) - - # loop on settings of a multiple group - for mult_name, mult_settings in multiple_plugins.items(): - - # Check if at least one setting is matching a multiple setting - if not format_setting in mult_settings: - continue - - # Case we have at least one multiple setting, we can check if multiple name exists or create it - if not mult_name in multiple_settings: - multiple_settings[mult_name] = {} - # Now check if prefix exist for this mult - if not prefix in multiple_settings[mult_name]: - # We want each settings to have the prefix if exists - # We will get the value of the setting without the prefix and create a prefix key with the same value - # And after that we can delete the original setting - new_multiple_group = {} - for multSett, multValue in mult_settings.items(): - new_multiple_group[f"{multSett}{f'_{prefix}' if prefix != '0' else ''}"] = multValue - - new_multiple_group = copy.deepcopy(new_multiple_group) - - # Update id for each settings - for multSett, multValue in new_multiple_group.items(): - multValue["id"] = f"{multValue['id']}{f'-{prefix}' if prefix != '0' else ''}" - - multiple_settings[mult_name][prefix] = new_multiple_group - - # Update multiple template with real data - multiple_settings[mult_name][prefix][setting]["value"] = value.get("value", multiple_settings[mult_name][prefix][setting]["value"]) - multiple_settings[mult_name][prefix][setting]["prev_value"] = value.get("value", multiple_settings[mult_name][prefix][setting]["value"]) - multiple_settings[mult_name][prefix][setting]["method"] = value.get("method", "ui") - multiple_settings[mult_name][prefix][setting]["disabled"] = False if value.get("method", "ui") in ("ui", "default", "manual") else True - - # Add popovers if setting is disabled else stop - if not multiple_settings[mult_name][prefix][setting].get("disabled", False): - continue - - multiple_settings[mult_name][prefix][setting]["popovers"] = [ - { - "iconName": "trespass", - "text": "inp_popover_method_disabled", - } - ] + multiple_settings[ - mult_name - ][prefix][setting].get("popovers", []) - - return multiple_settings - - -def set_multiples(template, format_plugins, settings): - """ - Set the multiples settings for each plugin. - """ - # copy of format plugins - for plugin in format_plugins: - # Get multiples - multiples = {} - settings_to_delete = [] - total_settings = len(plugin.get("settings")) - zindex = 0 - for setting, value in plugin.get("settings").items(): - - if not value.get("multiple"): - continue - - zindex += 1 - - value["containerClass"] = f"z-{total_settings - zindex}" - - mult_name = value.get("multiple") - # Get the multiple value and set it as key if not in multiples dict - if mult_name not in multiples: - multiples[mult_name] = {} - - multiples[mult_name][setting] = value - settings_to_delete.append(setting) - - # Delete multiple settings from regular settings - for setting in settings_to_delete: - del plugin["settings"][setting] - - if len(multiples): - # Add multiple schema with default values to plugin - plugin["multiples_schema"] = multiples - # Now that we have for each plugin the multiples settings, we need to do the following - # Get all settings from template that are multiples - template_multiples = get_multiple_from_template(template, multiples) - # Get all settings from service settings / global config that are multiples - service_multiples = get_multiple_from_settings(settings, multiples) - # Get service multiples if at least one, else use template multiples - plugin["multiples"] = service_multiples if len(service_multiples) else template_multiples - - return format_plugins - - -def format_setting( - name: str, - value: Union[str, int], - total_settings: Union[str, int], - loop_id: Union[str, int], - template_settings: dict, - settings: dict, - is_new: bool = False, -) -> dict: - """ - Format a setting in order to be used with form builder. - This will only set value for none multiple settings. - Additionnel set_multiples function will handle multiple settings. - """ - - is_multiple_setting = value.get("multiple", False) - - template_value, current_value, default_value, is_disabled_method, is_current_from_template, is_current_default, setting_value = get_setting_data( - template_settings, settings, name, value, is_multiple_setting, is_new - ) # regex by pattern - - value["pattern"] = value.get("regex", "") - - # set inpType based on type define for each settings - inpType = ( - "checkbox" - if value.get("type") == "check" - else ("select" if value.get("type") == "select" else "datepicker" if value.get("type") == "date" else "input") - ) - value["inpType"] = inpType - - if inpType == "select": - # replace "select" key by "values" - value["values"] = value.pop("select") - - value["columns"] = {"pc": 4, "tablet": 6, "mobile": 12} - value["disabled"] = is_disabled_method - value["value"] = default_value - value["name"] = value.get("label") - value["prev_value"] = value.get("value") - - # Prepare popover checking "help", "context" - popovers = [] - - if is_disabled_method: - popovers.append( - { - "iconName": "trespass", - "text": "inp_popover_method_disabled", - } - ) - - if value.get("context"): - popovers.append( - { - "iconName": ("disk" if value.get("context") == "multisite" else "globe"), - "text": ("inp_popover_multisite" if value.get("context") == "multisite" else "inp_popover_global"), - } - ) - - if value.get("help"): - popovers.append( - { - "iconName": "info", - "text": value.get("help"), - } - ) - - value["popovers"] = popovers - - # Case multiple, stop here - if "multiple" in value: - return value - - # Else, we can add additional final data - value["method"] = settings.get(name, {}).get("method", "ui") - value["containerClass"] = f"z-{total_settings - loop_id}" - - if current_value is not None and not is_current_default: - value["value"] = current_value - elif template_value is not None: - value["value"] = template_value - else: - value["value"] = setting_value - - return value diff --git a/src/ui/builder/utils/widgets.py b/src/ui/builder/utils/widgets.py deleted file mode 100644 index 907fa9b14..000000000 --- a/src/ui/builder/utils/widgets.py +++ /dev/null @@ -1,2176 +0,0 @@ - -from typing import Union - -# Add params to data dict only if value is not the default one -def add_key_value(data, key, value, default): - if value == default: - return - data[key] = value - -def advanced_widget( - template: dict, - containerClass: str, - columns: dict, - operation: str = "edit", - oldServerName: str = "" - ): - """ - This component is used to create a complete advanced form with plugin selection. - - PARAMETERS - - - `template` **object** Template object with plugin and settings data. - - `containerClass` **string** Container - - `operation` **string** Operation type (edit, new, delete). (optional, default `"edit"`) - - `oldServerName` **string** Old server name. This is a server name before any changes. (optional, default `""`) - - `columns` **object** Columns object. - - EXAMPLE - - { - template: [ - { - columns: { pc: 6, tablet: 12, mobile: 12 }, - id: "test-check", - value: "yes", - label: "Checkbox", - name: "checkbox", - required: true, - hideLabel: false, - headerClass: "text-red-500", - inpType: "checkbox", - }, - { - id: "test-input", - value: "yes", - type: "text", - name: "test-input", - disabled: false, - required: true, - label: "Test input", - pattern: "(test)", - inpType: "input", - }, - ], - } - - """ - - data = { - "template" : template, - "containerClass" : containerClass, - "columns" : columns, - } - - - # List of params that will be add only if not default value - list_params = [("operation", operation, "edit"),("oldServerName", oldServerName, "")] - for param in list_params: - add_key_value(data, param[0], param[1], param[2]) - - return { "type" : "Advanced", "data" : data } - - -def button_widget( - text: str, - id: str = "", - type: str = "button", - disabled: bool = False, - hideText: bool = False, - color: str = "primary", - iconColor: str = "", - size: str = "normal", - iconName: str = "", - attrs: dict = {}, - modal: Union[dict, bool] = False, - tabId: Union[str, int] = "", - containerClass: str = "" - ): - """ - This component is a standard button. - - PARAMETERS - - - `id` **string** Unique id of the button (optional, default `uuidv4()`) - - `text` **string** Content of the button. Can be a translation key or by default raw text. - - `type` **string** Can be of type button || submit (optional, default `"button"`) - - `disabled` **boolean** (optional, default `false`) - - `hideText` **boolean** Hide text to only display icon (optional, default `false`) - - `color` **string** (optional, default `"primary"`) - - `iconColor` **string** Color we want to apply to the icon. If falsy value, default icon color is applied. (optional, default `""`) - - `size` **string** Can be of size sm || normal || lg || xl (optional, default `"normal"`) - - `iconName` **string** Name in lowercase of icons store on /Icons. If falsy value, no icon displayed. (optional, default `""`) - - `attrs` **Object** List of attributes to add to the button. Some attributes will conduct to additional script (optional, default `{}`) - - `modal` **(Object | boolean)** We can link the button to a Modal component. We need to pass the widgets inside the modal. Button click will open the modal. (optional, default `false`) - - `tabId` **(string | number)** The tabindex of the field, by default it is the contentIndex (optional, default `contentIndex`) - - `containerClass` **string** Additional class to the container (optional, default `""`) - - EXAMPLE - - { - id: "open-modal-btn", - text: "Open modal", - disabled: false, - hideText: true, - color: "green", - size: "normal", - iconName: "modal", - attrs: { data-toggle: "modal", "data-target": "#modal"}, - } - - """ - - data = { - "text" : text, - } - - - # List of params that will be add only if not default value - list_params = [("id", id, ""),("type", type, "button"),("disabled", disabled, False),("hideText", hideText, False),("color", color, "primary"),("iconColor", iconColor, ""),("size", size, "normal"),("iconName", iconName, ""),("attrs", attrs, {}),("modal", modal, False),("tabId", tabId, ""),("containerClass", containerClass, "")] - for param in list_params: - add_key_value(data, param[0], param[1], param[2]) - - return { "type" : "Button", "data" : data } - - -def button_group_widget( - buttons: list, - boutonGroupClass: str = "" - ): - """ - This component allow to display multiple buttons in the same row using flex. - We can define additional class too for the flex container. - We need a list of buttons to display. - - PARAMETERS - - - `buttons` **array** List of buttons to display. Button component is used. - - `boutonGroupClass` **string** Additional class for the flex container (optional, default `""`) - - EXAMPLE - - { - id: "group-btn", - boutonGroupClass : "justify-center", - buttons: [ - { - id: "open-modal-btn", - text: "Open modal", - disabled: false, - hideText: true, - color: "green", - size: "normal", - iconName: "modal", - eventAttr: {"store" : "modal", "value" : "open", "target" : "modal_id", "valueExpanded" : "open"}, - }, - { - id: "close-modal-btn", - text: "Close modal", - disabled: false, - hideText: true, - color: "red", - size: "normal", - iconName: "modal", - eventAttr: {"store" : "modal", "value" : "close", "target" : "modal_id", "valueExpanded" : "close"}, - }, - ], - } - - """ - - data = { - "buttons" : buttons, - } - - - # List of params that will be add only if not default value - list_params = [("boutonGroupClass", boutonGroupClass, "")] - for param in list_params: - add_key_value(data, param[0], param[1], param[2]) - - return { "type" : "Buttongroup", "data" : data } - - -def cell_widget( - type: str, - data: dict - ): - """ - This component includes all elements that can be shown in a table cell. - - PARAMETERS - - - `type` **string** The type of the cell. This needs to be a Vue component. - - `data` **object** The data to display in the cell. This needs to be the props of the Vue component. - - EXAMPLE - - { - type : "button", - data : { - id: "open-modal-btn", - text: "Open modal", - disabled: false, - hideText: true, - color: "green", - size: "normal", - iconName: "modal", - attrs: { data-toggle: "modal", "data-target": "#modal"}, - } - } - - """ - - data = { - "type" : type, - "data" : data, - } - - - return { "type" : "Cell", "data" : data } - - -def checkbox_widget( - popovers, - label: str, - name: str, - value: str, - id: str = "", - attrs: dict = {}, - inpType: str = "checkbox", - disabled: bool = False, - required: bool = False, - columns: dict = {"pc":"12","tablet":"12","mobile":"12"}, - hideLabel: bool = False, - containerClass: str = "", - headerClass: str = "", - inpClass: str = "", - tabId: Union[str, int] = "" - ): - """ - This component is used to create a complete checkbox field input with error handling and label. - We can also add popover to display more information. - It is mainly use in forms. - - PARAMETERS - - - `id` **string** Unique id (optional, default `uuidv4()`) - - `label` **string** The label of the field. Can be a translation key or by default raw text. - - `name` **string** The name of the field. Case no label, this is the fallback. Can be a translation key or by default raw text. - - `value` **string**; - - `attrs` **object** Additional attributes to add to the field (optional, default `{}`) - - `popovers` **array?** List of popovers to display more information - - `inpType` **string** The type of the field, useful when we have multiple fields in the same container to display the right field (optional, default `"checkbox"`) - - `disabled` **boolean** (optional, default `false`) - - `required` **boolean** (optional, default `false`) - - `columns` **object** Field has a grid system. This allow to get multiple field in the same row if needed. (optional, default `{"pc":"12","tablet":"12","mobile":"12"}`) - - `hideLabel` **boolean** (optional, default `false`) - - `containerClass` **string** (optional, default `""`) - - `headerClass` **string** (optional, default `""`) - - `inpClass` **string** (optional, default `""`) - - `tabId` **(string | number)** The tabindex of the field, by default it is the contentIndex (optional, default `contentIndex`) - - EXAMPLE - - { - columns : {"pc": 6, "tablet": 12, "mobile": 12}, - id:"test-check", - value: "yes", - label: "Checkbox", - name: "checkbox", - required: true, - hideLabel: false, - inpType: "checkbox", - headerClass: "text-red-500" - popovers : [ - { - text: "This is a popover text", - iconName: "info", - }, - ] - } - - """ - - data = { - "popovers" : popovers, - "label" : label, - "name" : name, - "value" : value, - } - - - # List of params that will be add only if not default value - list_params = [("id", id, ""),("attrs", attrs, {}),("inpType", inpType, "checkbox"),("disabled", disabled, False),("required", required, False),("columns", columns, {"pc":"12","tablet":"12","mobile":"12"}),("hideLabel", hideLabel, False),("containerClass", containerClass, ""),("headerClass", headerClass, ""),("inpClass", inpClass, ""),("tabId", tabId, "")] - for param in list_params: - add_key_value(data, param[0], param[1], param[2]) - - return { "type" : "Checkbox", "data" : data } - - -def clipboard_widget( - id, - isClipboard, - valueToCopy, - clipboadClass, - copyClass - ): - """ - This component can be add to some fields to allow to copy the value of the field. - Additional clipboardClass and copyClass can be added to fit the parent container. - - PARAMETERS - - - `id` **id** Unique id (optional, default `uuidv4()`) - - `isClipboard` **isClipboard** Display a clipboard button to copy a value (optional, default `false`) - - `valueToCopy` **valueToCopy** The value to copy (optional, default `""`) - - `clipboadClass` **clipboadClass** Additional class for the clipboard container. Useful to fit the component in a specific container. (optional, default `""`) - - `copyClass` **copyClass** The class of the copy message. Useful to fit the component in a specific container. (optional, default `""`) - - EXAMPLE - - { - id: 'test-input', - isClipboard: true, - valueToCopy: 'yes', - clipboadClass: 'mx-2', - copyClass: 'mt-2', - } - - """ - - data = { - } - - - # List of params that will be add only if not default value - list_params = [("id", id, ""),("isClipboard", isClipboard, False),("valueToCopy", valueToCopy, ""),("clipboadClass", clipboadClass, ""),("copyClass", copyClass, "")] - for param in list_params: - add_key_value(data, param[0], param[1], param[2]) - - return { "type" : "Clipboard", "data" : data } - - -def combobox_widget( - popovers, - label: str, - name: str, - value: str, - values: list, - id: str = "", - attrs: dict = {}, - maxBtnChars: str = "", - inpType: str = "select", - disabled: bool = False, - required: bool = False, - requiredValues: list = [], - columns: dict = {"pc":"12","tablet":"12","mobile":"12"}, - hideLabel: bool = False, - onlyDown: bool = False, - overflowAttrEl: bool = "", - containerClass: str = "", - inpClass: str = "", - headerClass: str = "", - tabId: Union[str, int] = "" - ): - """ - This component is used to create a complete combobox field input with error handling and label. - We can be more precise by adding values that need to be selected to be valid. - We can also add popover to display more information. - - PARAMETERS - - - `id` **string** Unique id (optional, default `uuidv4()`) - - `label` **string** The label of the field. Can be a translation key or by default raw text. - - `name` **string** The name of the field. Case no label, this is the fallback. Can be a translation key or by default raw text. - - `value` **string**; - - `values` **array**; - - `attrs` **object** Additional attributes to add to the field (optional, default `{}`) - - `maxBtnChars` **string** Max char to display in the dropdown button handler. (optional, default `""`) - - `popovers` **array?** List of popovers to display more information - - `inpType` **string** The type of the field, useful when we have multiple fields in the same container to display the right field (optional, default `"select"`) - - `disabled` **boolean** (optional, default `false`) - - `required` **boolean** (optional, default `false`) - - `requiredValues` **array** values that need to be selected to be valid, works only if required is true (optional, default `[]`) - - `columns` **object** Field has a grid system. This allow to get multiple field in the same row if needed. (optional, default `{"pc":"12","tablet":"12","mobile":"12"}`) - - `hideLabel` **boolean** (optional, default `false`) - - `onlyDown` **boolean** If the dropdown should check the bottom of the (optional, default `false`) - - `overflowAttrEl` **boolean** Attribute to select the container the element has to check for overflow (optional, default `""`) - - `containerClass` **string** (optional, default `""`) - - `inpClass` **string** (optional, default `""`) - - `headerClass` **string** (optional, default `""`) - - `tabId` **(string | number)** The tabindex of the field, by default it is the contentIndex (optional, default `contentIndex`) - - EXAMPLE - - { - id: 'test-input', - value: 'yes', - values : ['yes', 'no'], - name: 'test-input', - disabled: false, - required: true, - requiredValues : ['no'], // need required to be checked - label: 'Test select', - inpType: "select", - popovers : [ - { - text: "This is a popover text", - iconName: "info", - }, - ] - } - - """ - - data = { - "popovers" : popovers, - "label" : label, - "name" : name, - "value" : value, - "values" : values, - } - - - # List of params that will be add only if not default value - list_params = [("id", id, ""),("attrs", attrs, {}),("maxBtnChars", maxBtnChars, ""),("inpType", inpType, "select"),("disabled", disabled, False),("required", required, False),("requiredValues", requiredValues, []),("columns", columns, {"pc":"12","tablet":"12","mobile":"12"}),("hideLabel", hideLabel, False),("onlyDown", onlyDown, False),("overflowAttrEl", overflowAttrEl, ""),("containerClass", containerClass, ""),("inpClass", inpClass, ""),("headerClass", headerClass, ""),("tabId", tabId, "")] - for param in list_params: - add_key_value(data, param[0], param[1], param[2]) - - return { "type" : "Combobox", "data" : data } - - -def container_widget( - containerClass: str = "", - columns: Union[dict, bool] = False, - tag: str = "div" - ): - """ - This component is a basic container that can be used to wrap other components. - In case we are working with grid system, we can add columns to position the container. - We can define additional class too. - This component is mainly use as widget container. - - PARAMETERS - - - `containerClass` **string** Additional class (optional, default `""`) - - `columns` **(object | boolean)** Work with grid system { pc: 12, tablet: 12, mobile: 12} (optional, default `false`) - - `tag` **string** The tag for the container (optional, default `"div"`) - - EXAMPLE - - { - containerClass: "w-full h-full bg-white rounded shadow-md", - columns: { pc: 12, tablet: 12, mobile: 12} - } - - """ - - data = { - } - - - # List of params that will be add only if not default value - list_params = [("containerClass", containerClass, ""),("columns", columns, False),("tag", tag, "div")] - for param in list_params: - add_key_value(data, param[0], param[1], param[2]) - - return { "type" : "Container", "data" : data } - - -def datepicker_widget( - value, - minDate, - maxDate, - label: str, - name: str, - popovers: list, - id: str = "", - attrs: dict = {}, - inpType: str = "datepicker", - isClipboard: bool = True, - hideLabel: bool = False, - columns: dict = {"pc":"12","tablet":"12","mobile":"12"}, - disabled: bool = False, - required: bool = False, - headerClass: str = "", - containerClass: str = "", - tabId: Union[str, int] = "" - ): - """ - This component is used to create a complete datepicker field input with error handling and label. - You can define a default date, a min and max date, and a format. - We can also add popover to display more information. - It is mainly use in forms. - - PARAMETERS - - - `id` **string** Unique id (optional, default `uuidv4()`) - - `label` **string** The label of the field. Can be a translation key or by default raw text. - - `name` **string** The name of the field. Case no label, this is the fallback. Can be a translation key or by default raw text. - - `popovers` **array** List of popovers to display more information - - `attrs` **object** Additional attributes to add to the field (optional, default `{}`) - - `inpType` **string** The type of the field, useful when we have multiple fields in the same container to display the right field (optional, default `"datepicker"`) - - `value` **number\** Default date when instantiate (optional, default `""`) - - `minDate` **number\** Impossible to pick a date before this date. (optional, default `""`) - - `maxDate` **number\** Impossible to pick a date after this date. (optional, default `""`) - - `isClipboard` **boolean** allow to copy the timestamp value (optional, default `true`) - - `hideLabel` **boolean** (optional, default `false`) - - `columns` **object** Field has a grid system. This allow to get multiple field in the same row if needed. (optional, default `{"pc":"12","tablet":"12","mobile":"12"}`) - - `disabled` **boolean** (optional, default `false`) - - `required` **boolean** (optional, default `false`) - - `headerClass` **string** (optional, default `""`) - - `containerClass` **string** (optional, default `""`) - - `tabId` **(string | number)** The tabindex of the field, by default it is the contentIndex (optional, default `contentIndex`) - - EXAMPLE - - { - id: 'test-date', - columns : {"pc": 6, "tablet": 12, "mobile": 12}, - disabled: false, - required: true, - value: 1735682600000, - minDate: 1735682600000, - maxDate: 1735689600000, - inpClass: "text-center", - inpType : "" - popovers : [ - { - text: "This is a popover text", - iconName: "info", - }, - ], - } - - """ - - data = { - "label" : label, - "name" : name, - "popovers" : popovers, - } - - - # List of params that will be add only if not default value - list_params = [("value", value, ""),("minDate", minDate, ""),("maxDate", maxDate, ""),("id", id, ""),("attrs", attrs, {}),("inpType", inpType, "datepicker"),("isClipboard", isClipboard, True),("hideLabel", hideLabel, False),("columns", columns, {"pc":"12","tablet":"12","mobile":"12"}),("disabled", disabled, False),("required", required, False),("headerClass", headerClass, ""),("containerClass", containerClass, ""),("tabId", tabId, "")] - for param in list_params: - add_key_value(data, param[0], param[1], param[2]) - - return { "type" : "Datepicker", "data" : data } - - -def details_widget( - columns, - details: str, - filters: list = [] - ): - """ - This component is a list of items separate on two columns : one for the title, and other for a list of popovers related to the plugin (type, link...) - - PARAMETERS - - - `details` **string** List of details item that contains a text, disabled state, attrs and list of popovers. We can also add a disabled key to disable the item. - - `filters` **array** List of filters to apply on the list of items. (optional, default `[]`) - - `columns` **columns** Determine the position of the items in the grid system. (optional, default `{"pc":"4","tablet":"6","mobile":"12"}`) - - EXAMPLE - - { - details : [{ - text: "name", - disabled : false, - attrs: { - id: "id", - value: "value", - }, - popovers: [ - { - text: "This is a popover text", - iconName: "info", - }, - { - text: "This is a popover text", - iconName: "info", - }, - ], - }] - - """ - - data = { - "details" : details, - } - - - # List of params that will be add only if not default value - list_params = [("columns", columns, {"pc":"4","tablet":"6","mobile":"12"}),("filters", filters, [])] - for param in list_params: - add_key_value(data, param[0], param[1], param[2]) - - return { "type" : "Details", "data" : data } - - -def easy_widget( - template: dict, - containerClass: str, - columns: dict, - operation: str = "edit", - oldServerName: str = "" - ): - """ - This component is used to create a complete easy form with plugin selection. - - PARAMETERS - - - `template` **object** Template object with plugin and settings data. - - `containerClass` **string** Container - - `operation` **string** Operation type (edit, new, delete). (optional, default `"edit"`) - - `oldServerName` **string** Old server name. This is a server name before any changes. (optional, default `""`) - - `columns` **object** Columns object. - - EXAMPLE - - { - template: [ - { - columns: { pc: 6, tablet: 12, mobile: 12 }, - id: "test-check", - value: "yes", - label: "Checkbox", - name: "checkbox", - required: true, - hideLabel: false, - headerClass: "text-red-500", - inpType: "checkbox", - }, - { - id: "test-input", - value: "yes", - type: "text", - name: "test-input", - disabled: false, - required: true, - label: "Test input", - pattern: "(test)", - inpType: "input", - }, - ], - } - - """ - - data = { - "template" : template, - "containerClass" : containerClass, - "columns" : columns, - } - - - # List of params that will be add only if not default value - list_params = [("operation", operation, "edit"),("oldServerName", oldServerName, "")] - for param in list_params: - add_key_value(data, param[0], param[1], param[2]) - - return { "type" : "Easy", "data" : data } - - -def editor_widget( - popovers, - label: str, - name: str, - value: str, - id: str = "", - attrs: dict = {}, - inpType: str = "editor", - columns: dict = {"pc":"12","tablet":"12","mobile":"12"}, - pattern: str = "", - disabled: bool = False, - required: bool = False, - isClipboard: bool = True, - hideLabel: bool = False, - containerClass: str = "", - editorClass: str = "", - headerClass: str = "", - tabId: Union[str, int] = "" - ): - """ - This component is used to create a complete editor field with error handling and label. - We can also add popover to display more information. - It is mainly use in forms. - - PARAMETERS - - - `id` **string** Unique id (optional, default `uuidv4()`) - - `label` **string** The label of the field. Can be a translation key or by default raw text. - - `name` **string** The name of the field. Case no label, this is the fallback. Can be a translation key or by default raw text.\* @param {string} label - - `value` **string**; - - `attrs` **object** Additional attributes to add to the field (optional, default `{}`) - - `popovers` **array?** List of popovers to display more information - - `inpType` **string** The type of the field, useful when we have multiple fields in the same container to display the right field (optional, default `"editor"`) - - `columns` **object** Field has a grid system. This allow to get multiple field in the same row if needed. (optional, default `{"pc":"12","tablet":"12","mobile":"12"}`) - - `pattern` **string** (optional, default `""`) - - `disabled` **boolean** (optional, default `false`) - - `required` **boolean** (optional, default `false`) - - `isClipboard` **boolean** allow to copy the input value (optional, default `true`) - - `hideLabel` **boolean** (optional, default `false`) - - `containerClass` **string** (optional, default `""`) - - `editorClass` **string** (optional, default `""`) - - `headerClass` **string** (optional, default `""`) - - `tabId` **(string | number)** The tabindex of the field, by default it is the contentIndex (optional, default `contentIndex`) - - EXAMPLE - - { - id: "test-editor", - value: "yes", - name: "test-editor", - disabled: false, - required: true, - pattern: "(test)", - label: "Test editor", - tabId: "1", - columns: { pc: 12, tablet: 12, mobile: 12 }, - }; - - """ - - data = { - "popovers" : popovers, - "label" : label, - "name" : name, - "value" : value, - } - - - # List of params that will be add only if not default value - list_params = [("id", id, ""),("attrs", attrs, {}),("inpType", inpType, "editor"),("columns", columns, {"pc":"12","tablet":"12","mobile":"12"}),("pattern", pattern, ""),("disabled", disabled, False),("required", required, False),("isClipboard", isClipboard, True),("hideLabel", hideLabel, False),("containerClass", containerClass, ""),("editorClass", editorClass, ""),("headerClass", headerClass, ""),("tabId", tabId, "")] - for param in list_params: - add_key_value(data, param[0], param[1], param[2]) - - return { "type" : "Editor", "data" : data } - - -def field_widget( - popovers, - label: str, - id: str, - name: str, - required: bool = False, - hideLabel: bool = False, - headerClass: str = "" - ): - """ - This component is used with field in order to link a label to field type. - We can add popover to display more information. - Always use with field component. - - PARAMETERS - - - `label` **string** The label of the field. Can be a translation key or by default raw text. - - `id` **string** The id of the field. This is used to link the label to the field. - - `name` **string** The name of the field. Case no label, this is the fallback. Can be a translation key or by default raw text. - - `popovers` **array?** List of popovers to display more information - - `required` **boolean** (optional, default `false`) - - `hideLabel` **boolean** (optional, default `false`) - - `headerClass` **string** (optional, default `""`) - - EXAMPLE - - { - label: 'Test', - version : "0.1.0", - name: 'test-input', - required: true, - popovers : [ - { - text: "This is a popover text", - iconName: "info", - }, - ], - } - - """ - - data = { - "popovers" : popovers, - "label" : label, - "id" : id, - "name" : name, - } - - - # List of params that will be add only if not default value - list_params = [("required", required, False),("hideLabel", hideLabel, False),("headerClass", headerClass, "")] - for param in list_params: - add_key_value(data, param[0], param[1], param[2]) - - return { "type" : "Field", "data" : data } - - -def fields_widget( - setting: dict - ): - """ - This component wraps all available fields for a form. - - PARAMETERS - - - `setting` **object** Setting needed to render a field. - - EXAMPLE - - { - columns : {"pc": 6, "tablet": 12, "mobile": 12}, - id:"test-check", - value: "yes", - label: "Checkbox", - name: "checkbox", - required: true, - hideLabel: false, - inpType: "checkbox", - headerClass: "text-red-500" - popovers : [ - { - text: "This is a popover text", - iconName: "info", - }, - ] - } - - """ - - data = { - "setting" : setting, - } - - - return { "type" : "Fields", "data" : data } - - -def filter_widget( - filters: list = [], - data: Union[dict, list] = {}, - containerClass: str = "" - ): - """ - This component allow to filter any data object or array with a list of filters. - For the moment, we have 2 types of filters: select and keyword. - We have default values that avoid filter ("all" for select and "" for keyword). - Filters are fields so we need to provide a "field" key with same structure as a Field. - We have to define "keys" that will be the keys the filter value will check. - We can set filter "default" in order to filter the base keys of an object. - We can set filter "settings" in order to filter settings, data must be an advanced template. - We can set filter "table" in order to filter table items. - Check example for more details. - - PARAMETERS - - - `filters` **array** Fields with additional data to be used as filters. (optional, default `[]`) - - `data` **(object | array)** Data object or array to filter. Emit a filter event with the filtered data. (optional, default `{}`) - - `containerClass` **string** Additional class for the container. (optional, default `""`) - - EXAMPLE - - [ - { - filter: "default", // or "settings" or "table" - type: "select", - value: "all", - keys: ["type"], - field: { - inpType: "select", - id: uuidv4(), - value: "all", - // add 'all' as first value - values: ["all"].concat(plugin_types), - name: uuidv4(), - onlyDown: true, - label: "inp_select_plugin_type", - popovers: [ - { - text: "inp_select_plugin_type_desc", - iconName: "info", - }, - ], - columns: { pc: 3, tablet: 4, mobile: 12 }, - }, - }, - ] - - """ - - data = { - } - - - # List of params that will be add only if not default value - list_params = [("filters", filters, []),("data", data, {}),("containerClass", containerClass, "")] - for param in list_params: - add_key_value(data, param[0], param[1], param[2]) - - return { "type" : "Filter", "data" : data } - - -def grid_widget( - gridClass: str = "items-start" - ): - """ - This component is a basic container that can be used to wrap other components. - This container is based on a grid system and will return a grid container with 12 columns. - We can define additional class too. - This component is mainly use as widget container or as a child of a GridLayout. - - PARAMETERS - - - `gridClass` **string** Additional class (optional, default `"items-start"`) - - EXAMPLE - - { - columns: { pc: 12, tablet: 12, mobile: 12}, - gridClass: "items-start" - } - - """ - - data = { - } - - - # List of params that will be add only if not default value - list_params = [("gridClass", gridClass, "items-start")] - for param in list_params: - add_key_value(data, param[0], param[1], param[2]) - - return { "type" : "Grid", "data" : data } - - -def grid_layout_widget( - type: str = "card", - id: str = "", - title: str = "", - link: str = "", - columns: dict = {"pc":12,"tablet":12,"mobile":12}, - gridLayoutClass: str = "items-start", - tabId: str = "" - ): - """ - This component is used for top level page layout. - This will determine the position of layout components based on the grid system. - We can create card, modal, table and others top level layout using this component. - This component is mainly use as Grid parent component. - - PARAMETERS - - - `type` **string** Type of layout component, we can have "card" (optional, default `"card"`) - - `id` **string** Id of the layout component, will be used to identify the component. (optional, default `uuidv4()`) - - `title` **string** Title of the layout component, will be displayed at the top if exists. Type of layout component will determine the style of the title. (optional, default `""`) - - `link` **string** Will transform the container tag from a div to an a tag with the link as href. Useful with card type. (optional, default `""`) - - `columns` **object** Work with grid system { pc: 12, tablet: 12, mobile: 12} (optional, default `{"pc":12,"tablet":12,"mobile":12}`) - - `gridLayoutClass` **string** Additional class (optional, default `"items-start"`) - - `tabId` **string** Case the container is converted to an anchor with a link, we can define the tabId, by default it is the contentIndex (optional, default `contentIndex`) - - EXAMPLE - - { - type: "card", - title: "Test", - columns: { pc: 12, tablet: 12, mobile: 12}, - gridLayoutClass: "items-start" - } - - """ - - data = { - } - - - # List of params that will be add only if not default value - list_params = [("type", type, "card"),("id", id, ""),("title", title, ""),("link", link, ""),("columns", columns, {"pc":12,"tablet":12,"mobile":12}),("gridLayoutClass", gridLayoutClass, "items-start"),("tabId", tabId, "")] - for param in list_params: - add_key_value(data, param[0], param[1], param[2]) - - return { "type" : "Gridlayout", "data" : data } - - -def icons_widget( - iconName: str, - iconClass: str = "base", - color: str = "", - isStick: bool = False, - disabled: bool = False - ): - """ - This component is a wrapper that contains all the icons available in the application (Icons folder). - This component is used to display the icon based on the icon name. - This component is mainly use inside others widgets. - - PARAMETERS - - - `iconName` **string** The name of the icon to display. The icon name is the name of the file without the extension on lowercase. - - `iconClass` **string** Class to apply to the icon. In case the icon is related to a widget, the widget will set the right class automatically. (optional, default `"base"`) - - `color` **string** The color of the icon between some tailwind css available colors (purple, green, red, orange, blue, yellow, gray, dark, amber, emerald, teal, indigo, cyan, sky, pink...). Darker colors are also available using the base color and adding '-darker' (e.g. 'red-darker'). (optional, default `""`) - - `isStick` **boolean** If true, the icon will be stick to the top right of the parent container. (optional, default `false`) - - `disabled` **boolean** If true, the icon will be disabled. (optional, default `false`) - - EXAMPLE - - { - iconName: 'box', - iconClass: 'base', - color: 'amber', - } - - """ - - data = { - "iconName" : iconName, - } - - - # List of params that will be add only if not default value - list_params = [("iconClass", iconClass, "base"),("color", color, ""),("isStick", isStick, False),("disabled", disabled, False)] - for param in list_params: - add_key_value(data, param[0], param[1], param[2]) - - return { "type" : "Icons", "data" : data } - - -def input_widget( - popovers, - type: str, - label: str, - name: str, - value: str, - id: str = "", - attrs: dict = {}, - inpType: str = "input", - columns: dict = {"pc":"12","tablet":"12","mobile":"12"}, - disabled: bool = False, - required: bool = False, - placeholder: str = "", - pattern: str = "(?.*)", - isClipboard: bool = True, - readonly: bool = False, - hideLabel: bool = False, - containerClass: str = "", - inpClass: str = "", - headerClass: str = "", - tabId: Union[str, int] = "" - ): - """ - This component is used to create a complete input field input with error handling and label. - We can add a clipboard button to copy the input value. - We can also add a password button to show the password. - We can also add popover to display more information. - It is mainly use in forms. - - PARAMETERS - - - `id` **string** Unique id (optional, default `uuidv4()`) - - `type` **string** text, email, password, number, tel, url - - `label` **string** The label of the field. Can be a translation key or by default raw text. - - `name` **string** The name of the field. Case no label, this is the fallback. Can be a translation key or by default raw text.\* @param {string} label - - `value` **string**; - - `attrs` **object** Additional attributes to add to the field (optional, default `{}`) - - `popovers` **array?** List of popovers to display more information - - `inpType` **string** The type of the field, useful when we have multiple fields in the same container to display the right field (optional, default `"input"`) - - `columns` **object** Field has a grid system. This allow to get multiple field in the same row if needed. (optional, default `{"pc":"12","tablet":"12","mobile":"12"}`) - - `disabled` **boolean** (optional, default `false`) - - `required` **boolean** (optional, default `false`) - - `placeholder` **string** (optional, default `""`) - - `pattern` **string** (optional, default `"(?.*)"`) - - `isClipboard` **boolean** allow to copy the input value (optional, default `true`) - - `readonly` **boolean** allow to read only the input value (optional, default `false`) - - `hideLabel` **boolean** (optional, default `false`) - - `containerClass` **string** (optional, default `""`) - - `inpClass` **string** (optional, default `""`) - - `headerClass` **string** (optional, default `""`) - - `tabId` **(string | number)** The tabindex of the field, by default it is the contentIndex (optional, default `contentIndex`) - - EXAMPLE - - { - id: 'test-input', - value: 'yes', - type: "text", - name: 'test-input', - disabled: false, - required: true, - label: 'Test input', - pattern : "(test)", - inpType: "input", - popovers : [ - { - text: "This is a popover text", - iconName: "info", - }, - ], - } - - """ - - data = { - "popovers" : popovers, - "type" : type, - "label" : label, - "name" : name, - "value" : value, - } - - - # List of params that will be add only if not default value - list_params = [("id", id, ""),("attrs", attrs, {}),("inpType", inpType, "input"),("columns", columns, {"pc":"12","tablet":"12","mobile":"12"}),("disabled", disabled, False),("required", required, False),("placeholder", placeholder, ""),("pattern", pattern, "(?.*)"),("isClipboard", isClipboard, True),("readonly", readonly, False),("hideLabel", hideLabel, False),("containerClass", containerClass, ""),("inpClass", inpClass, ""),("headerClass", headerClass, ""),("tabId", tabId, "")] - for param in list_params: - add_key_value(data, param[0], param[1], param[2]) - - return { "type" : "Input", "data" : data } - - -def instance_widget( - title: str, - status: str, - details: list, - buttons: list - ): - """ - This component is an instance widget. - This component is using the Container, TitleCard, IconStatus, ListPairs and ButtonGroup components. - - PARAMETERS - - - `title` **string**; - - `status` **string**; - - `details` **array** List of details to display - - `buttons` **array** List of buttons to display - - EXAMPLE - - { - id: "instance-1", - title: "Instance 1", - status: "success", - details: [ - { key: "Version", value: "1.0.0" }, - { key: "Status", value: "Running" }, - { key: "Created", value: "2021-01-01" }, - ], - buttons : [ - { - id: "open-modal-btn", - text: "Open modal", - disabled: false, - hideText: true, - color: "green", - size: "normal", - iconName: "modal", - }, - ] - } - - """ - - data = { - "title" : title, - "status" : status, - "details" : details, - "buttons" : buttons, - } - - - return { "type" : "Instance", "data" : data } - - -def list_widget( - popovers, - label: str, - name: str, - value: str, - id: str = "", - attrs: dict = {}, - separator: str = " ", - maxBtnChars: str = "", - inpType: str = "list", - disabled: bool = False, - required: bool = False, - columns: dict = {"pc":"12","tablet":"12","mobile":"12"}, - hideLabel: bool = False, - onlyDown: bool = False, - overflowAttrEl: bool = "", - containerClass: str = "", - inpClass: str = "", - headerClass: str = "", - tabId: Union[str, int] = "" - ): - """ - This component is used display list of values in a dropdown, remove or add an item in an easy way. - We can also add popover to display more information. - - PARAMETERS - - - `id` **string** Unique id (optional, default `uuidv4()`) - - `label` **string** The label of the field. Can be a translation key or by default raw text. - - `name` **string** The name of the field. Case no label, this is the fallback. Can be a translation key or by default raw text. - - `value` **string**; - - `attrs` **object** Additional attributes to add to the field (optional, default `{}`) - - `separator` **string** Separator to split the value, by default it is a space (optional, default `" "`) - - `maxBtnChars` **string** Max char to display in the dropdown button handler. (optional, default `""`) - - `popovers` **array?** List of popovers to display more information - - `inpType` **string** The type of the field, useful when we have multiple fields in the same container to display the right field (optional, default `"list"`) - - `disabled` **boolean** (optional, default `false`) - - `required` **boolean** (optional, default `false`) - - `columns` **object** Field has a grid system. This allow to get multiple field in the same row if needed. (optional, default `{"pc":"12","tablet":"12","mobile":"12"}`) - - `hideLabel` **boolean** (optional, default `false`) - - `onlyDown` **boolean** If the dropdown should stay down (optional, default `false`) - - `overflowAttrEl` **boolean** Attribute the element has to check for overflow (optional, default `""`) - - `containerClass` **string** (optional, default `""`) - - `inpClass` **string** (optional, default `""`) - - `headerClass` **string** (optional, default `""`) - - `tabId` **(string | number)** The tabindex of the field, by default it is the contentIndex (optional, default `contentIndex`) - - EXAMPLE - - { - id: 'test-input', - value: 'yes no maybe', - name: 'test-list', - label: 'Test list', - inpType: "list", - popovers : [ - { - text: "This is a popover text", - iconName: "info", - }, - ] - } - - """ - - data = { - "popovers" : popovers, - "label" : label, - "name" : name, - "value" : value, - } - - - # List of params that will be add only if not default value - list_params = [("id", id, ""),("attrs", attrs, {}),("separator", separator, " "),("maxBtnChars", maxBtnChars, ""),("inpType", inpType, "list"),("disabled", disabled, False),("required", required, False),("columns", columns, {"pc":"12","tablet":"12","mobile":"12"}),("hideLabel", hideLabel, False),("onlyDown", onlyDown, False),("overflowAttrEl", overflowAttrEl, ""),("containerClass", containerClass, ""),("inpClass", inpClass, ""),("headerClass", headerClass, ""),("tabId", tabId, "")] - for param in list_params: - add_key_value(data, param[0], param[1], param[2]) - - return { "type" : "List", "data" : data } - - -def modal_widget( - widgets: list - ): - """ - This component contains all widgets needed on a modal. - This is different from a page builder as we don't need to define the container and grid layout. - We can't create multiple grids or containers in a modal. - - PARAMETERS - - - `widgets` **array** Array of containers and widgets - - EXAMPLE - - [ - "id": "modal-delete-plugin", - "widgets": [ - { - "type": "Title", - "data": { - "title": "plugins_modal_delete_title", - "type": "modal" - } - }, - { - "type": "Text", - "data": { - "text": "plugins_modal_delete_confirm" - } - }, - { - "type": "Text", - "data": { - "text": "", - "bold": true, - "attrs": { - "data-modal-plugin-name": "true" - } - } - }, - { - "type": "ButtonGroup", - "data": { - "buttons": [ - { - "id": "delete-plugin-btn", - "text": "action_close", - "disabled": false, - "color": "close", - "size": "normal", - "attrs": { - "data-hide-el": "modal-delete-plugin" - } - }, - { - "id": "delete-plugin-btn", - "text": "action_delete", - "disabled": false, - "color": "delete", - "size": "normal", - "attrs": { - "data-delete-plugin-submit": "" - } - } - ], - } - } - ] - ]; - - """ - - data = { - "widgets" : widgets, - } - - - return { "type" : "Modal", "data" : data } - - -def multiple_widget( - multiples, - columns: dict = {"pc":"12","tablet":"12","mobile":"12"}, - containerClass: str = "", - tadId: str = "" - ): - """ - This Will regroup all multiples settings with add and remove logic. - This component under the hood is rendering default fields but by group with possibility to add or remove a multiple group. - - PARAMETERS - - - `multiples` **object** The multiples settings to display. This needs to be a dict of settings using default field format. - - `columns` **object** Field has a grid system. This allow to get multiple field in the same row if needed. (optional, default `{"pc":"12","tablet":"12","mobile":"12"}`) - - `containerClass` **string** Additionnal class to add to the container (optional, default `""`) - - `tadId` **string** The tabindex of the field, by default it is the contentIndex (optional, default `contentIndex`) - - EXAMPLE - - { - "columns": {"pc": 6, "tablet": 12, "mobile": 12}, - "multiples": { - "reverse-proxy": { - "0": { - "REVERSE_PROXY_HOST": { - "context": "multisite", - "default": "", - "help": "Full URL of the proxied resource (proxy_pass).", - "id": "reverse-proxy-host", - "label": "Reverse proxy host", - "regex": "^.*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^.*$", - "inpType": "input", - "name": "Reverse proxy host", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "service", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Full URL of the proxied resource (proxy_pass)." - } - ], - "containerClass": "z-26", - "method": "ui" - }, - "REVERSE_PROXY_KEEPALIVE": { - "context": "multisite", - "default": "no", - "help": "Enable or disable keepalive connections with the proxied resource.", - "id": "reverse-proxy-keepalive", - "label": "Reverse proxy keepalive", - "regex": "^(yes|no)$", - "type": "check", - "multiple": "reverse-proxy", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Reverse proxy keepalive", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable or disable keepalive connections with the proxied resource." - } - ], - "containerClass": "z-20" - }, - "REVERSE_PROXY_AUTH_REQUEST": { - "context": "multisite", - "default": "", - "help": "Enable authentication using an external provider (value of auth_request directive).", - "id": "reverse-proxy-auth-request", - "label": "Reverse proxy auth request", - "regex": "^(\\/[\\w\\].~:\\/?#\\[@!$\\&'\\(\\)*+,;=\\-]*|off)?$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(\\/[\\w\\].~:\\/?#\\[@!$\\&'\\(\\)*+,;=\\-]*|off)?$", - "inpType": "input", - "name": "Reverse proxy auth request", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable authentication using an external provider (value of auth_request directive)." - } - ], - "containerClass": "z-19" - }, - "REVERSE_PROXY_AUTH_REQUEST_SIGNIN_URL": { - "context": "multisite", - "default": "", - "help": "Redirect clients to sign-in URL when using REVERSE_PROXY_AUTH_REQUEST (used when auth_request call returned 401).", - "id": "reverse-proxy-auth-request-signin-url", - "label": "Auth request signin URL", - "regex": "^(https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)?$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)?$", - "inpType": "input", - "name": "Auth request signin URL", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Redirect clients to sign-in URL when using REVERSE_PROXY_AUTH_REQUEST (used when auth_request call returned 401)." - } - ], - "containerClass": "z-18" - }, - }, - } - } - } - }, - - """ - - data = { - "multiples" : multiples, - } - - - # List of params that will be add only if not default value - list_params = [("columns", columns, {"pc":"12","tablet":"12","mobile":"12"}),("containerClass", containerClass, ""),("tadId", tadId, "")] - for param in list_params: - add_key_value(data, param[0], param[1], param[2]) - - return { "type" : "Multiple", "data" : data } - - -def pairs_widget( - pairs: list, - columns: dict = {"pc":"12","tablet":"12","mobile":"12"} - ): - """ - This component is used to display key value information in a list. - - PARAMETERS - - - `pairs` **array** The list of key value information. The key and value can be a translation key or a raw text. - - `columns` **object** Determine the position of the items in the grid system. (optional, default `{"pc":"12","tablet":"12","mobile":"12"}`) - - EXAMPLE - - { - pairs : [ - { key: "Total Users", value: "100" } - ], - columns: { pc: 12, tablet: 12, mobile: 12 } - } - - """ - - data = { - "pairs" : pairs, - } - - - # List of params that will be add only if not default value - list_params = [("columns", columns, {"pc":"12","tablet":"12","mobile":"12"})] - for param in list_params: - add_key_value(data, param[0], param[1], param[2]) - - return { "type" : "Pairs", "data" : data } - - -def popover_widget( - text: str, - color: str, - href: str = "#", - attrs: dict = {}, - tag: str = "a", - iconClass: str = "icon-default", - tabId: Union[str, int] = "" - ): - """ - This component is a standard popover. - - PARAMETERS - - - `text` **string** Content of the popover. Can be a translation key or by default raw text. - - `href` **string** Link of the anchor. By default it is a # link. (optional, default `"#"`) - - `color` **string** Color of the icon between tailwind colors - - `attrs` **object** List of attributs to add to the text. (optional, default `{}`) - - `tag` **string** By default it is a anchor tag, but we can use other tag like div in case of popover on another anchor (optional, default `"a"`) - - `iconClass` **string** (optional, default `"icon-default"`) - - `tabId` **(string | number)** The tabindex of the field, by default it is the contentIndex (optional, default `contentIndex`) - - EXAMPLE - - { - text: "This is a popover text", - href: "#", - iconName: "info", - attrs: { "data-popover": "test" }, - } - - """ - - data = { - "text" : text, - "color" : color, - } - - - # List of params that will be add only if not default value - list_params = [("href", href, "#"),("attrs", attrs, {}),("tag", tag, "a"),("iconClass", iconClass, "icon-default"),("tabId", tabId, "")] - for param in list_params: - add_key_value(data, param[0], param[1], param[2]) - - return { "type" : "Popover", "data" : data } - - -def popover_group_widget( - popovers: list, - groupClasss: str = "" - ): - """ - This component allow to display multiple popovers in the same row using flex. - We can define additional class too for the flex container. - We need a list of popovers to display. - - PARAMETERS - - - `popovers` **array** List of popovers to display. Popover component is used. - - `groupClasss` **string** Additional class for the flex container (optional, default `""`) - - EXAMPLE - - { - flexClass : "justify-center", - popovers: [ - { - text: "This is a popover text", - iconName: "info", - }, - { - text: "This is a popover text", - iconName: "info", - }, - ], - } - - """ - - data = { - "popovers" : popovers, - } - - - # List of params that will be add only if not default value - list_params = [("groupClasss", groupClasss, "")] - for param in list_params: - add_key_value(data, param[0], param[1], param[2]) - - return { "type" : "Popovergroup", "data" : data } - - -def raw_widget( - template: dict, - containerClass: str, - columns: dict, - operation: str = "edit", - oldServerName: str = "" - ): - """ - This component is used to create a complete raw form with settings as JSON format. - - PARAMETERS - - - `template` **object** Template object with plugin and settings data. - - `operation` **string** Operation type (edit, new, delete). (optional, default `"edit"`) - - `oldServerName` **string** Old server name. This is a server name before any changes. (optional, default `""`) - - `containerClass` **string** Container - - `columns` **object** Columns object. - - EXAMPLE - - { - "IS_LOADING": "no", - "NGINX_PREFIX": "/etc/nginx/", - "HTTP_PORT": "8080", - "HTTPS_PORT": "8443", - "MULTISITE": "yes" - } - - """ - - data = { - "template" : template, - "containerClass" : containerClass, - "columns" : columns, - } - - - # List of params that will be add only if not default value - list_params = [("operation", operation, "edit"),("oldServerName", oldServerName, "")] - for param in list_params: - add_key_value(data, param[0], param[1], param[2]) - - return { "type" : "Raw", "data" : data } - - -def select_widget( - popovers, - label: str, - name: str, - value: str, - values: list, - id: str = "", - attrs: dict = {}, - inpType: str = "select", - maxBtnChars: str = "", - disabled: bool = False, - required: bool = False, - requiredValues: list = [], - columns: dict = {"pc":"12","tablet":"12","mobile":"12"}, - hideLabel: bool = False, - onlyDown: bool = False, - overflowAttrEl: bool = "", - containerClass: str = "", - inpClass: str = "", - headerClass: str = "", - tabId: Union[str, int] = "" - ): - """ - This component is used to create a complete select field input with error handling and label. - We can be more precise by adding values that need to be selected to be valid. - We can also add popover to display more information. - It is mainly use in forms. - - PARAMETERS - - - `id` **string** Unique id (optional, default `uuidv4()`) - - `label` **string** The label of the field. Can be a translation key or by default raw text. - - `name` **string** The name of the field. Case no label, this is the fallback. Can be a translation key or by default raw text. - - `value` **string**; - - `values` **array**; - - `attrs` **object** Additional attributes to add to the field (optional, default `{}`) - - `popovers` **array?** List of popovers to display more information - - `inpType` **string** The type of the field, useful when we have multiple fields in the same container to display the right field (optional, default `"select"`) - - `maxBtnChars` **string** Max char to display in the dropdown button handler. (optional, default `""`) - - `disabled` **boolean** (optional, default `false`) - - `required` **boolean** (optional, default `false`) - - `requiredValues` **array** values that need to be selected to be valid, works only if required is true (optional, default `[]`) - - `columns` **object** Field has a grid system. This allow to get multiple field in the same row if needed. (optional, default `{"pc":"12","tablet":"12","mobile":"12"}`) - - `hideLabel` **boolean** (optional, default `false`) - - `onlyDown` **boolean** If the dropdown should check the bottom of the container (optional, default `false`) - - `overflowAttrEl` **boolean** Attribute to select the container the element has to check for overflow (optional, default `""`) - - `containerClass` **string** (optional, default `""`) - - `inpClass` **string** (optional, default `""`) - - `headerClass` **string** (optional, default `""`) - - `tabId` **(string | number)** The tabindex of the field, by default it is the contentIndex (optional, default `contentIndex`) - - EXAMPLE - - { - id: 'test-input', - value: 'yes', - values : ['yes', 'no'], - name: 'test-input', - disabled: false, - required: true, - requiredValues : ['no'], // need required to be checked - label: 'Test select', - inpType: "select", - popovers : [ - { - text: "This is a popover text", - iconName: "info", - }, - ] - } - - """ - - data = { - "popovers" : popovers, - "label" : label, - "name" : name, - "value" : value, - "values" : values, - } - - - # List of params that will be add only if not default value - list_params = [("id", id, ""),("attrs", attrs, {}),("inpType", inpType, "select"),("maxBtnChars", maxBtnChars, ""),("disabled", disabled, False),("required", required, False),("requiredValues", requiredValues, []),("columns", columns, {"pc":"12","tablet":"12","mobile":"12"}),("hideLabel", hideLabel, False),("onlyDown", onlyDown, False),("overflowAttrEl", overflowAttrEl, ""),("containerClass", containerClass, ""),("inpClass", inpClass, ""),("headerClass", headerClass, ""),("tabId", tabId, "")] - for param in list_params: - add_key_value(data, param[0], param[1], param[2]) - - return { "type" : "Select", "data" : data } - - -def stat_widget( - title: str, - value: Union[str, int], - subtitle: str = "", - iconName: str = "", - subtitleColor: str = "info", - statClass: str = "" - ): - """ - This component is wrapper of all stat components. - This component has no grid system and will always get the full width of the parent. - This component is mainly use inside a blank card. - - PARAMETERS - - - `title` **string** The title of the stat. Can be a translation key or by default raw text. - - `value` **(string | number)** The value of the stat - - `subtitle` **string** The subtitle of the stat. Can be a translation key or by default raw text. (optional, default `""`) - - `iconName` **string** A top-right icon to display between icon available in Icons/Stat. Case falsy value, no icon displayed. The icon name is the name of the file without the extension on lowercase. (optional, default `""`) - - `subtitleColor` **string** The color of the subtitle between error, success, warning, info (optional, default `"info"`) - - `statClass` **string** Additional class (optional, default `""`) - - EXAMPLE - - { - title: "Total Users", - value: 100, - subtitle : "Last 30 days", - iconName: "user", - link: "/users", - subtitleColor: "info", - } - - """ - - data = { - "title" : title, - "value" : value, - } - - - # List of params that will be add only if not default value - list_params = [("subtitle", subtitle, ""),("iconName", iconName, ""),("subtitleColor", subtitleColor, "info"),("statClass", statClass, "")] - for param in list_params: - add_key_value(data, param[0], param[1], param[2]) - - return { "type" : "Stat", "data" : data } - - -def status_widget( - id: str, - status: str = "info", - statusClass: str = "" - ): - """ - This component is a icon used with status. - - PARAMETERS - - - `id` **string** The id of the status icon. - - `status` **string** The color of the icon between error, success, warning, info (optional, default `"info"`) - - `statusClass` **string** Additional class, for example to use with grid system. (optional, default `""`) - - EXAMPLE - - { - id: "instance-1", - status: "success", - statusClass: "col-span-12", - } - - """ - - data = { - "id" : id, - } - - - # List of params that will be add only if not default value - list_params = [("status", status, "info"),("statusClass", statusClass, "")] - for param in list_params: - add_key_value(data, param[0], param[1], param[2]) - - return { "type" : "Status", "data" : data } - - -def subtitle_widget( - subtitle: str, - type: str = "card", - tag: str = "", - color: str = "", - bold: bool = False, - uppercase: bool = False, - lowercase: bool = False, - subtitleClass: str = "" - ): - """ - This component is a general subtitle wrapper. - - PARAMETERS - - - `subtitle` **string** Can be a translation key or by default raw text. - - `type` **string** The type of title between "container", "card", "content", "min" or "stat" (optional, default `"card"`) - - `tag` **string** The tag of the subtitle. Can be h1, h2, h3, h4, h5, h6 or p. If empty, will be determine by the type of subtitle. (optional, default `""`) - - `color` **string** The color of the subtitle between error, success, warning, info or tailwind color (optional, default `""`) - - `bold` **boolean** If the subtitle should be bold or not. (optional, default `false`) - - `uppercase` **boolean** If the subtitle should be uppercase or not. (optional, default `false`) - - `lowercase` **boolean** If the subtitle should be lowercase or not. (optional, default `false`) - - `subtitleClass` **string** Additional class, useful when component is used directly on a grid system (optional, default `""`) - - EXAMPLE - - { - subtitle: "Total Users", - type: "card", - subtitleClass: "text-lg", - color : "info", - tag: "h2" - } - - """ - - data = { - "subtitle" : subtitle, - } - - - # List of params that will be add only if not default value - list_params = [("type", type, "card"),("tag", tag, ""),("color", color, ""),("bold", bold, False),("uppercase", uppercase, False),("lowercase", lowercase, False),("subtitleClass", subtitleClass, "")] - for param in list_params: - add_key_value(data, param[0], param[1], param[2]) - - return { "type" : "Subtitle", "data" : data } - - -def table_widget( - title: str, - header: list, - positions: list, - items: list, - filters: list = [], - minWidth: str = "base", - containerClass: str = "", - containerWrapClass: str = "", - tableClass: str = "" - ): - """ - This component is used to create a table. - You need to provide a title, a header, a list of positions, and a list of items. - Items need to be an array of array with a cell being a regular widget. Not all widget are supported. Check this component import list to see which widget are supported. - For example, Text, Icons, Icons, Buttons and Fields are supported. - - PARAMETERS - - - `title` **string** Determine the title of the table. - - `header` **array** Determine the header of the table. - - `positions` **array** Determine the position of each item in the table in a list of number based on 12 columns grid. - - `items` **array** items to render in the table. This need to be an array (row) of array (cols) with a cell being a regular widget. - - `filters` **array** Determine the filters of the table. (optional, default `[]`) - - `minWidth` **string** Determine the minimum size of the table. Can be "base", "sm", "md", "lg", "xl". (optional, default `"base"`) - - `containerClass` **string** Container additional class. (optional, default `""`) - - `containerWrapClass` **string** Container wrap additional class. (optional, default `""`) - - `tableClass` **string** Table additional class. (optional, default `""`) - - EXAMPLE - - { - "title": "Table title", - "header": ["Header 1", "Header 2", "Header 3"], - "minWidth": "base", - "positions": [4,4,4], - "items": [ - [ - { - "type": "Text", - "data": { - "text": "whitelist-download" - - } - }, - ], - ], - - filters : [ - { - filter: "default", - filterName: "type", - type: "select", - value: "all", - keys: ["type"], - field: { - id: uuidv4(), - value: "all", - // add 'all' as first value - values: ["all"].concat(plugin_types), - name: uuidv4(), - onlyDown: true, - label: "inp_select_plugin_type", - containerClass: "setting", - popovers: [ - { - text: "inp_select_plugin_type_desc", - iconName: "info", - }, - ], - columns: { pc: 3, tablet: 4, mobile: 12 }, - }, - }, - ]; - } - - """ - - data = { - "title" : title, - "header" : header, - "positions" : positions, - "items" : items, - } - - - # List of params that will be add only if not default value - list_params = [("filters", filters, []),("minWidth", minWidth, "base"),("containerClass", containerClass, ""),("containerWrapClass", containerWrapClass, ""),("tableClass", tableClass, "")] - for param in list_params: - add_key_value(data, param[0], param[1], param[2]) - - return { "type" : "Table", "data" : data } - - -def templates_widget( - templates: dict, - operation: str = "edit", - oldServerName: str = "" - ): - """ - This component is used to create a complete settings form with all modes (advanced, raw, easy). - - PARAMETERS - - - `templates` **object** List of advanced templates that contains settings. Must be a dict with mode as key, then the template name as key with a list of data (different for each modes). - - `operation` **string** Operation type (edit, new, delete). (optional, default `"edit"`) - - `oldServerName` **string** Old server name. This is a server name before any changes. (optional, default `""`) - - EXAMPLE - - { - advanced : { - default : [{SETTING_1}, {SETTING_2}...], - low : [{SETTING_1}, {SETTING_2}...], - }, - easy : { - default : [...], - low : [...], - } - } - - """ - - data = { - "templates" : templates, - } - - - # List of params that will be add only if not default value - list_params = [("operation", operation, "edit"),("oldServerName", oldServerName, "")] - for param in list_params: - add_key_value(data, param[0], param[1], param[2]) - - return { "type" : "Templates", "data" : data } - - -def text_widget( - text: str, - textClass: str = "", - color: str = "", - bold: bool = False, - uppercase: bool = False, - tag: str = "p", - icon: Union[bool, dict] = False, - attrs: dict = {} - ): - """ - This component is used for regular paragraph. - - PARAMETERS - - - `text` **string** The text value. Can be a translation key or by default raw text. - - `textClass` **string** Style of text. Can be replace by any class starting by 'text-' like 'text-stat'. (optional, default `""`) - - `color` **string** The color of the text between error, success, warning, info or tailwind color (optional, default `""`) - - `bold` **boolean** If the text should be bold or not. (optional, default `false`) - - `uppercase` **boolean** If the text should be uppercase or not. (optional, default `false`) - - `tag` **string** The tag of the text. Can be p, span, div, h1, h2, h3, h4, h5, h6 (optional, default `"p"`) - - `icon` **(boolean | object)** The icon to add before the text. If true, will add a default icon. If object, will add the icon with the name and the color. (optional, default `false`) - - `attrs` **object** List of attributes to add to the text. (optional, default `{}`) - - EXAMPLE - - { - text: "This is a paragraph", - textClass: "text-3xl" - attrs: { id: "paragraph" }, - } - - """ - - data = { - "text" : text, - } - - - # List of params that will be add only if not default value - list_params = [("textClass", textClass, ""),("color", color, ""),("bold", bold, False),("uppercase", uppercase, False),("tag", tag, "p"),("icon", icon, False),("attrs", attrs, {})] - for param in list_params: - add_key_value(data, param[0], param[1], param[2]) - - return { "type" : "Text", "data" : data } - - -def title_widget( - title: str, - type: str = "card", - tag: str = "", - color: str = "", - uppercase: bool = False, - lowercase: bool = False, - titleClass: str = "" - ): - """ - This component is a general title wrapper. - - PARAMETERS - - - `title` **string** Can be a translation key or by default raw text. - - `type` **string** The type of title between "container", "card", "content", "min" or "stat" (optional, default `"card"`) - - `tag` **string** The tag of the title. Can be h1, h2, h3, h4, h5, h6 or p. If empty, will be determine by the type of title. (optional, default `""`) - - `color` **string** The color of the title between error, success, warning, info or tailwind color (optional, default `""`) - - `uppercase` **boolean** If the title should be uppercase or not. (optional, default `false`) - - `lowercase` **boolean** If the title should be lowercase or not. (optional, default `false`) - - `titleClass` **string** Additional class, useful when component is used directly on a grid system (optional, default `""`) - - EXAMPLE - - { - title: "Total Users", - type: "card", - titleClass: "text-lg", - color : "info", - tag: "h2" - } - - """ - - data = { - "title" : title, - } - - - # List of params that will be add only if not default value - list_params = [("type", type, "card"),("tag", tag, ""),("color", color, ""),("uppercase", uppercase, False),("lowercase", lowercase, False),("titleClass", titleClass, "")] - for param in list_params: - add_key_value(data, param[0], param[1], param[2]) - - return { "type" : "Title", "data" : data } - - -def unmatch_widget( - text: str, - unmatchClass: str = "" - ): - """ - Display a default message "no match" with dedicated icon. - The message text can be overridden by passing a text prop. - - PARAMETERS - - - `text` **string** The text to display - - `unmatchClass` **string** The class to apply to the message. If not provided, the class will be based on the parent component. (optional, default `""`) - - EXAMPLE - - { - text: "dashboard_no_match", - } - - """ - - data = { - "text" : text, - } - - - # List of params that will be add only if not default value - list_params = [("unmatchClass", unmatchClass, "")] - for param in list_params: - add_key_value(data, param[0], param[1], param[2]) - - return { "type" : "Unmatch", "data" : data } - diff --git a/src/ui/client/builder/advanced.py b/src/ui/client/builder/advanced.py index 20dd4cc6b..4f87d80e3 100644 --- a/src/ui/client/builder/advanced.py +++ b/src/ui/client/builder/advanced.py @@ -1,7 +1,7 @@ import json import base64 -from pages.advanced_mode import advanced_mode_builder +from builder.advanced_mode import advanced_mode_builder # Default plugins from docker-compose.ui.yml plugins = [ diff --git a/src/ui/client/builder/advanced_mode.py b/src/ui/client/builder/advanced_mode.py deleted file mode 100644 index 115a5d828..000000000 --- a/src/ui/client/builder/advanced_mode.py +++ /dev/null @@ -1,38 +0,0 @@ -from .utils.form import get_forms, get_service_settings - - -def advanced_mode_builder(templates: list[dict], plugins: list, global_config: dict, total_config: dict, service_name: str, is_new: bool = False) -> str: - """Render forms with global config data. - ATM we don't need templates but we need to pass at least one to the function (it will simply not override anything). - """ - settings = get_service_settings(service_name, global_config, total_config) - - builder = [ - { - "type": "card", - "containerColumns": {"pc": 12, "tablet": 12, "mobile": 12}, - "widgets": [ - { - "type": "Title", - "data": { - "title": service_name, - "type": "container", - "lowercase": True, - }, - }, - { - "type": "Subtitle", - "data": {"subtitle": "services_manage_subtitle", "type": "container"}, - }, - { - "type": "Templates", - "data": { - "templates": get_forms(templates, plugins, settings, ("advanced",), is_new, True), - "operation": "new" if is_new else "edit", - "oldServerName": service_name if service_name else "", - }, - }, - ], - } - ] - return builder diff --git a/src/ui/client/tests/bans2.py b/src/ui/client/builder/bans2.py similarity index 98% rename from src/ui/client/tests/bans2.py rename to src/ui/client/builder/bans2.py index 258a6dce2..05b4a4f0b 100644 --- a/src/ui/client/tests/bans2.py +++ b/src/ui/client/builder/bans2.py @@ -1,6 +1,8 @@ import json import base64 +# TODO : REMOVE operation by custom endpoint + from builder.utils.widgets import button, button_group, title, text, tabulator, fields, upload, datepicker, input, select bans_columns = [ @@ -33,7 +35,7 @@ bans_filters = [ "name": "select-ban-reason", "label": "bans_select_reason", # keep it (a18n) "value": "all", # keep "all" - "values": ["all", "antibot"], # keep "all" and add your reasons + "values": ["all", "antibot"], # keep "all" and add your reasons dynamically "inpType": "select", "onlyDown": True, "columns": {"pc": 3, "tablet": 4, " mobile": 12}, @@ -165,7 +167,7 @@ builder = [ "display": ["main", 1], "widgets": [ tabulator( - id="table-core-plugins", + id="table-bans-list", columns=bans_columns, items=bans_items, filters=bans_filters, diff --git a/src/ui/client/tests/configs2.py b/src/ui/client/builder/configs2.py similarity index 99% rename from src/ui/client/tests/configs2.py rename to src/ui/client/builder/configs2.py index 2639cdb48..daa1b6005 100644 --- a/src/ui/client/tests/configs2.py +++ b/src/ui/client/builder/configs2.py @@ -241,7 +241,7 @@ configs_items = [ hideText=True, color="yellow", size="normal", - attrs={"data-display": "display_index"}, # replace by the display index of the related in order to display it + attrs={"data-display": "display_index"}, # replace by the display index of the related form in order to display it )["data"], # Delete button with modal to confirm button( diff --git a/src/ui/client/builder/easy.py b/src/ui/client/builder/easy.py index af8a597ed..6d5b00b32 100644 --- a/src/ui/client/builder/easy.py +++ b/src/ui/client/builder/easy.py @@ -1,7 +1,7 @@ import json import base64 -from pages.easy_mode import easy_mode_builder +from builder.easy_mode import easy_mode_builder # Default plugins from docker-compose.ui.yml plugins = [ diff --git a/src/ui/client/builder/easy_mode.py b/src/ui/client/builder/easy_mode.py deleted file mode 100644 index 66adeaa3d..000000000 --- a/src/ui/client/builder/easy_mode.py +++ /dev/null @@ -1,39 +0,0 @@ -from .utils.form import get_forms, get_service_settings - - -def easy_mode_builder(templates: list[dict], plugins: list, global_config: dict, total_config: dict, service_name: str, is_new: bool = False) -> str: - """Render forms with global config data. - ATM we don't need templates but we need to pass at least one to the function (it will simply not override anything). - """ - - # We need - settings = get_service_settings(service_name, global_config, total_config) - builder = [ - { - "type": "card", - "containerColumns": {"pc": 12, "tablet": 12, "mobile": 12}, - "widgets": [ - { - "type": "Title", - "data": { - "title": service_name, - "type": "container", - "lowercase": True, - }, - }, - { - "type": "Subtitle", - "data": {"subtitle": "services_manage_subtitle", "type": "container"}, - }, - { - "type": "Templates", - "data": { - "templates": get_forms(templates, plugins, settings, ("easy",), is_new, True), - "operation": "new" if is_new else "edit", - "oldServerName": service_name if service_name else "", - }, - }, - ], - } - ] - return builder diff --git a/src/ui/client/builder/global_config.py b/src/ui/client/builder/global_config.py deleted file mode 100644 index 039408e94..000000000 --- a/src/ui/client/builder/global_config.py +++ /dev/null @@ -1,31 +0,0 @@ -from .utils.form import get_forms - - -def global_config_builder(templates: list[dict], plugins: list, settings: dict) -> str: - """Render forms with global config data. - ATM we don't need templates but we need to pass at least one to the function (it will simply not override anything). - """ - - builder = [ - { - "type": "card", - "containerColumns": {"pc": 12, "tablet": 12, "mobile": 12}, - "widgets": [ - { - "type": "Title", - "data": {"title": "global_config_title", "type": "container"}, - }, - { - "type": "Subtitle", - "data": {"subtitle": "global_config_subtitle", "type": "container"}, - }, - { - "type": "Templates", - "data": { - "templates": get_forms(templates, plugins, settings, ("advanced", "raw")), - }, - }, - ], - } - ] - return builder diff --git a/src/ui/client/builder/globalconfig.py b/src/ui/client/builder/globalconfig.py index 418c53fdb..605518d83 100644 --- a/src/ui/client/builder/globalconfig.py +++ b/src/ui/client/builder/globalconfig.py @@ -1,7 +1,7 @@ import json import base64 -from pages.global_config import global_config_builder +from builder.global_config import global_config_builder # Default plugins from docker-compose.ui.yml plugins = [ diff --git a/src/ui/client/builder/home.py b/src/ui/client/builder/home.py index d310d90ff..4d09c1611 100644 --- a/src/ui/client/builder/home.py +++ b/src/ui/client/builder/home.py @@ -1,84 +1,99 @@ -from .utils.widgets import stat_widget +import json +import base64 +home = [ + { + "type": "card", + "link": "https://panel.bunkerweb.io/?utm_campaign=self&utm_source=ui#pro", + "containerColumns": {"pc": 4, "tablet": 6, "mobile": 12}, + "widgets": [ + { + "type": "Stat", + "data": { + "title": "home_version", + "subtitle": "home_upgrade_to_pro", + "subtitleColor": "warning", + "stat": "home_free", + "iconName": "key", + }, + } + ], + }, + { + "type": "card", + "link": "https://github.com/bunkerity/bunkerweb", + "containerColumns": {"pc": 4, "tablet": 6, "mobile": 12}, + "widgets": [ + { + "type": "Stat", + "data": { + "title": "home_version_number", + "subtitle": "home_update_available", + "subtitleColor": "warning", + "stat": "1.5.8", + "iconName": "wire", + }, + } + ], + }, + { + "type": "card", + "link": "/instances", + "containerColumns": {"pc": 4, "tablet": 6, "mobile": 12}, + "widgets": [ + { + "type": "Stat", + "data": { + "title": "home_instances", + "subtitle": "home_total_number", + "subtitleColor": "info", + "stat": 1, + "iconName": "box", + }, + } + ], + }, + { + "type": "card", + "link": "/services", + "containerColumns": {"pc": 4, "tablet": 6, "mobile": 12}, + "widgets": [ + { + "type": "Stat", + "data": { + "title": "home_services", + "subtitle": "home_all_methods_included", + "subtitleColor": "info", + "stat": 2, + "iconName": "disk", + }, + } + ], + }, + { + "type": "card", + "link": "/plugins", + "containerColumns": {"pc": 4, "tablet": 6, "mobile": 12}, + "widgets": [ + { + "type": "Stat", + "data": { + "title": "home_plugins", + "subtitle": "home_no_error", + "subtitleColor": "success", + "stat": "42", + "iconName": "puzzle", + }, + } + ], + }, +] -def home_builder(data: dict) -> str: - """ - It returns the needed format from data to render the home page in JSON format for the Vue.js builder - """ - version_card = stat_widget( - link="https://panel.bunkerweb.io/?utm_campaign=self&utm_source=ui#pro", - containerColums={"pc": 4, "tablet": 6, "mobile": 12}, - title="home_version", - subtitle=( - "home_all_features_available" - if data.get("is_pro_version") - else ( - "home_awaiting_compliance" - if data.get("pro_status") == "active" and data.get("pro_overlapped") - else ( - "home_renew_license" - if data.get("pro_status") == "expired" - else "home_talk_to_team" if data.get("pro_status") == "suspended" else "home_upgrade_to_pro" - ) - ) - ), - subtitle_color="success" if data.get("is_pro_version") else "warning", - stat=( - "home_pro" - if data.get("is_pro_version") - else ( - "home_pro_locked" - if data.get("pro_status") == "active" and data.get("pro_overlapped") - else "home_expired" if data.get("pro_status") == "expired" else "home_suspended" if data.get("pro_status") == "suspended" else "home_free" - ) - ), - icon_name="crown" if data.get("is_pro_version") else "key", - ) +# store on a file +with open("home.json", "w") as f: + json.dump(home, f, indent=4) +output_base64_bytes = base64.b64encode(bytes(json.dumps(home), "utf-8")) +output_base64_string = output_base64_bytes.decode("ascii") - version_num_card = stat_widget( - link="https://github.com/bunkerity/bunkerweb", - containerColums={"pc": 4, "tablet": 6, "mobile": 12}, - title="home_version_number", - subtitle=( - "home_couldnt_find_remote" - if not data.get("remote_version") - else "home_latest_version" if data.get("remote_version") and data.get("check_version") else "home_update_available" - ), - subtitle_color=("error" if not data.get("remote_version") else "success" if data.get("remote_version") and data.get("check_version") else "warning"), - stat=data.get("version"), - icon_name="wire", - ) - - instances_card = stat_widget( - link="instances", - containerColums={"pc": 4, "tablet": 6, "mobile": 12}, - title="home_instances", - subtitle="home_total_number", - subtitle_color="info", - stat=data.get("instances_number"), - icon_name="box", - ) - - services_card = stat_widget( - link="services", - containerColums={"pc": 4, "tablet": 6, "mobile": 12}, - title="home_services", - subtitle="home_all_methods_included", - subtitle_color="info", - stat=data.get("services_number"), - icon_name="disk", - ) - - plugins_card = stat_widget( - link="plugins", - containerColums={"pc": 4, "tablet": 6, "mobile": 12}, - title="home_plugins", - subtitle="home_errors_found" if data.get("plugins_errors") > 0 else "home_no_error", - subtitle_color="error" if data.get("plugins_errors") > 0 else "success", - stat=data.get("plugins_number"), - icon_name="puzzle", - ) - - builder = [version_card, version_num_card, instances_card, services_card, plugins_card] - - return builder +with open("home.txt", "w") as f: + f.write(output_base64_string) diff --git a/src/ui/client/tests/home.txt b/src/ui/client/builder/home.txt similarity index 100% rename from src/ui/client/tests/home.txt rename to src/ui/client/builder/home.txt diff --git a/src/ui/client/tests/instances.json b/src/ui/client/builder/instances.json similarity index 100% rename from src/ui/client/tests/instances.json rename to src/ui/client/builder/instances.json diff --git a/src/ui/client/builder/instances.py b/src/ui/client/builder/instances.py index edf154c9b..9be4c1024 100644 --- a/src/ui/client/builder/instances.py +++ b/src/ui/client/builder/instances.py @@ -1,46 +1,33 @@ -from .utils.widgets import instance_widget +import json +import base64 -from typing import List - -# from src.instance import Instance +from builder.instances import instances_builder -def instances_builder(instances: List[Instance]) -> str: - """ - It returns the needed format from data to render the instances page in JSON format for the Vue.js builder - """ - builder = [] +# Create instance class using keys from the instances list +class Instance: + def __init__(self, _type, health, _id, hostname, name): + self._type = _type + self.health = health + self._id = _id + self.hostname = hostname + self.name = name - for instance in instances: - # setup actions buttons - actions = ["reload", "stop"] if instance.status == "up" else ["start"] - buttons = [ - { - "attrs": { - "data-submit-form": f"""{{"INSTANCE_ID" : "{instance.hostname}", "operation" : "{action}" }}""", - }, - "text": f"action_{action}", - "color": "success" if action == "start" else "error" if action == "stop" else "warning", - } - for action in actions - ] +instances = [ + Instance("manual", True, "bunkerweb", "bunkerweb", "bunkerweb"), + Instance("manual", True, "bunkerweb", "bunkerweb", "bunkerweb"), +] - instance = instance_widget( - containerColumns={"pc": 6, "tablet": 6, "mobile": 12}, - pairs=[ - {"key": "instances_name", "value": instance.name}, - {"key": "instances_hostname", "value": instance.hostname}, - {"key": "instances_type", "value": instance.type}, - {"key": "instances_method", "value": instance.method}, - {"key": "instances_creation_date", "value": instance.creation_date.strftime("%d-%m-%Y %H:%M:%S")}, - {"key": "instances_last_seen", "value": instance.last_seen.strftime("%d-%m-%Y %H:%M:%S")}, - ], - status="success" if instance.status == "up" else "error", - title=instance.hostname, - buttons=buttons, - ) - builder.append(instance) +builder = instances_builder(instances) - return builder +# store on a file +with open("instances.json", "w") as f: + json.dump(builder, f) + +output_base64_bytes = base64.b64encode(bytes(json.dumps(builder), "utf-8")) +output_base64_string = output_base64_bytes.decode("ascii") + +with open("instances.txt", "w") as f: + f.write(output_base64_string) diff --git a/src/ui/client/tests/instances.txt b/src/ui/client/builder/instances.txt similarity index 100% rename from src/ui/client/tests/instances.txt rename to src/ui/client/builder/instances.txt diff --git a/src/ui/client/tests/instances2.json b/src/ui/client/builder/instances2.json similarity index 100% rename from src/ui/client/tests/instances2.json rename to src/ui/client/builder/instances2.json diff --git a/src/ui/client/tests/instances2.py b/src/ui/client/builder/instances2.py similarity index 97% rename from src/ui/client/tests/instances2.py rename to src/ui/client/builder/instances2.py index a6a8eaa98..a734ff330 100644 --- a/src/ui/client/tests/instances2.py +++ b/src/ui/client/builder/instances2.py @@ -1,6 +1,8 @@ import json import base64 +# TODO : REMOVE operation by custom endpoint + from builder.utils.widgets import button, button_group, title, text, tabulator, input columns = [ @@ -10,6 +12,7 @@ columns = [ {"title": "Method", "field": "method", "formatter": "text"}, {"title": "Creation date", "field": "creation_date", "formatter": "text"}, {"title": "Last seen", "field": "last_seen", "formatter": "text"}, + {"title": "health", "field": "health", "formatter": "text"}, # up, down, loading { "title": "Actions", "field": "actions", @@ -157,6 +160,7 @@ items = [ ] +# TODO : Add warning that port and server_name will be override by scheduler instance_create_form_widgets = [ input( id="instance-name", diff --git a/src/ui/client/tests/instances2.txt b/src/ui/client/builder/instances2.txt similarity index 100% rename from src/ui/client/tests/instances2.txt rename to src/ui/client/builder/instances2.txt diff --git a/src/ui/client/tests/jobs.json b/src/ui/client/builder/jobs.json similarity index 100% rename from src/ui/client/tests/jobs.json rename to src/ui/client/builder/jobs.json diff --git a/src/ui/client/builder/jobs.py b/src/ui/client/builder/jobs.py index 0ebbbd7e5..f38dd4b19 100644 --- a/src/ui/client/builder/jobs.py +++ b/src/ui/client/builder/jobs.py @@ -1,290 +1,226 @@ -from .utils.widgets import title_widget, table_widget +import json +import base64 + +from builder.jobs import jobs_builder -def jobs_builder(jobs): +jobs = { + "anonymous-report": { + "plugin_id": "misc", + "every": "day", + "reload": False, + "history": [{"start_date": "07/08/2024, 01:10:03 PM", "end_date": "07/08/2024, 01:10:04 PM", "success": True}], + "cache": [], + }, + "backup-data": { + "plugin_id": "backup", + "every": "day", + "reload": False, + "history": [{"start_date": "07/08/2024, 01:10:02 PM", "end_date": "07/08/2024, 01:10:03 PM", "success": True}], + "cache": [], + }, + "blacklist-download": { + "plugin_id": "blacklist", + "every": "hour", + "reload": True, + "history": [{"start_date": "07/08/2024, 01:10:01 PM", "end_date": "07/08/2024, 01:10:02 PM", "success": True}], + "cache": [], + }, + "bunkernet-data": { + "plugin_id": "bunkernet", + "every": "day", + "reload": True, + "history": [{"start_date": "07/08/2024, 01:10:02 PM", "end_date": "07/08/2024, 01:10:03 PM", "success": True}], + "cache": [], + }, + "bunkernet-register": { + "plugin_id": "bunkernet", + "every": "hour", + "reload": True, + "history": [{"start_date": "07/08/2024, 01:10:02 PM", "end_date": "07/08/2024, 01:10:02 PM", "success": True}], + "cache": [], + }, + "certbot-new": { + "plugin_id": "letsencrypt", + "every": "once", + "reload": False, + "history": [{"start_date": "07/08/2024, 01:10:02 PM", "end_date": "07/08/2024, 01:10:03 PM", "success": True}], + "cache": [], + }, + "certbot-renew": { + "plugin_id": "letsencrypt", + "every": "day", + "reload": True, + "history": [{"start_date": "07/08/2024, 01:10:03 PM", "end_date": "07/08/2024, 01:10:03 PM", "success": True}], + "cache": [], + }, + "cleanup-excess-jobs-runs": { + "plugin_id": "db", + "every": "day", + "reload": False, + "history": [{"start_date": "07/08/2024, 01:10:02 PM", "end_date": "07/08/2024, 01:10:03 PM", "success": True}], + "cache": [], + }, + "coreruleset-nightly": { + "plugin_id": "modsecurity", + "every": "day", + "reload": True, + "history": [{"start_date": "07/08/2024, 01:10:01 PM", "end_date": "07/08/2024, 01:10:03 PM", "success": True}], + "cache": [], + }, + "custom-cert": { + "plugin_id": "customcert", + "every": "day", + "reload": True, + "history": [{"start_date": "07/08/2024, 01:10:02 PM", "end_date": "07/08/2024, 01:10:03 PM", "success": True}], + "cache": [], + }, + "default-server-cert": { + "plugin_id": "misc", + "every": "once", + "reload": False, + "history": [{"start_date": "07/08/2024, 01:10:02 PM", "end_date": "07/08/2024, 01:10:03 PM", "success": True}], + "cache": [ + { + "service_id": None, + "file_name": "default-server-cert.pem", + "last_update": "07/08/2024, 01:10:03 PM", + "checksum": "203da9e16dabe522a3080c3b9efc5c2dc8054f47e98d995fe1812f4c498b4feb519ef080b7dfeaba0095c1393793815c23f22072daf5703b02762504b211db20", + }, + { + "service_id": None, + "file_name": "default-server-cert.key", + "last_update": "07/08/2024, 01:10:03 PM", + "checksum": "7f86b1fffb8fe2011365d76e5a0955344a03c3bdb7b04aff13f8ad5b6178804290c0cd6c8f29dda9e981e3193cf5acda2a92f72312d514514305b8485667d573", + }, + ], + }, + "download-crs-plugins": { + "plugin_id": "modsecurity", + "every": "day", + "reload": True, + "history": [{"start_date": "07/08/2024, 01:10:03 PM", "end_date": "07/08/2024, 01:10:03 PM", "success": True}], + "cache": [], + }, + "download-plugins": { + "plugin_id": "misc", + "every": "once", + "reload": False, + "history": [ + {"start_date": "07/08/2024, 01:10:04 PM", "end_date": "07/08/2024, 01:10:05 PM", "success": True}, + {"start_date": "07/08/2024, 01:09:59 PM", "end_date": "07/08/2024, 01:10:00 PM", "success": True}, + ], + "cache": [], + }, + "download-pro-plugins": { + "plugin_id": "pro", + "every": "day", + "reload": True, + "history": [ + {"start_date": "07/08/2024, 01:10:02 PM", "end_date": "07/08/2024, 01:10:04 PM", "success": True}, + {"start_date": "07/08/2024, 01:10:00 PM", "end_date": "07/08/2024, 01:10:01 PM", "success": False}, + ], + "cache": [], + }, + "failover-backup": { + "plugin_id": "jobs", + "every": "once", + "reload": False, + "history": [{"start_date": "07/08/2024, 01:10:07 PM", "end_date": "07/08/2024, 01:10:08 PM", "success": True}], + "cache": [ + { + "service_id": None, + "file_name": "folder:/var/tmp/bunkerweb/failover.tgz", + "last_update": "07/08/2024, 01:10:14 PM", + "checksum": "d22a7a696d4b44bcef6a3ac06b2d7e2b2de128243000f58202c0e82b0bf54510ade7329eca14ca478a28d46201410ea1fd8002349b7b9aa51dd0d07d2fb2f51e", + } + ], + }, + "greylist-download": { + "plugin_id": "greylist", + "every": "hour", + "reload": True, + "history": [{"start_date": "07/08/2024, 01:10:02 PM", "end_date": "07/08/2024, 01:10:03 PM", "success": True}], + "cache": [], + }, + "mmdb-asn": { + "plugin_id": "jobs", + "every": "day", + "reload": True, + "history": [{"start_date": "07/08/2024, 01:10:04 PM", "end_date": "07/08/2024, 01:10:06 PM", "success": True}], + "cache": [ + { + "service_id": None, + "file_name": "asn.mmdb", + "last_update": "07/08/2024, 01:10:05 PM", + "checksum": "0beed65a84e63cf5dd6753ecc1aa6399dddaf5eb24fb22839f4cd72cbc9805cddf72be068649d111a3c21e2ac7de4a6f930c859286a25a7e937da017406d2596", + } + ], + }, + "mmdb-country": { + "plugin_id": "jobs", + "every": "day", + "reload": True, + "history": [{"start_date": "07/08/2024, 01:10:02 PM", "end_date": "07/08/2024, 01:10:04 PM", "success": True}], + "cache": [ + { + "service_id": None, + "file_name": "country.mmdb", + "last_update": "07/08/2024, 01:10:03 PM", + "checksum": "5f0d2e2c92840747886924adc1e6ff3668882990e0cd8a4d60750fe1bddb66c3e175c8717d073b48ebda41cce4c505d434dc2a6a469823fcd41c62c4f875b212", + } + ], + }, + "realip-download": { + "plugin_id": "realip", + "every": "hour", + "reload": True, + "history": [{"start_date": "07/08/2024, 01:10:02 PM", "end_date": "07/08/2024, 01:10:03 PM", "success": True}], + "cache": [], + }, + "self-signed": { + "plugin_id": "selfsigned", + "every": "day", + "reload": True, + "history": [{"start_date": "07/08/2024, 01:10:02 PM", "end_date": "07/08/2024, 01:10:03 PM", "success": True}], + "cache": [ + { + "service_id": "www.example.com", + "file_name": "cert.pem", + "last_update": "07/08/2024, 01:10:03 PM", + "checksum": "fc33700719f6a58336e3c3b735ad3fdf0b15ebd0afbe6b4a3b02a4a92e0ab4f1761409a7a1d1ca965d59b4196a81c1d150a12ae0170f7bb3a1bc7cf02300fbe9", + }, + { + "service_id": "www.example.com", + "file_name": "key.pem", + "last_update": "07/08/2024, 01:10:03 PM", + "checksum": "0e6eee34ab7b2a41cb21e49ebd35ce29a1b8d12b55aad3911b6357c73792eef7084fbb4eeba8bff73eb7a8789b5f486f6edb6d4b1c38a54bd0dcee1bf438f23d", + }, + ], + }, + "update-check": { + "plugin_id": "jobs", + "every": "day", + "reload": False, + "history": [{"start_date": "07/08/2024, 01:10:06 PM", "end_date": "07/08/2024, 01:10:07 PM", "success": True}], + "cache": [], + }, + "whitelist-download": { + "plugin_id": "whitelist", + "every": "hour", + "reload": True, + "history": [{"start_date": "07/08/2024, 01:10:02 PM", "end_date": "07/08/2024, 01:10:02 PM", "success": True}], + "cache": [], + }, +} - jobs_list = get_jobs_list(jobs) +output = jobs_builder(jobs) - intervals = ["all"] +# store on a file +with open("jobs.json", "w") as f: + json.dump(output, f, indent=4) +output_base64_bytes = base64.b64encode(bytes(json.dumps(output), "utf-8")) +output_base64_string = output_base64_bytes.decode("ascii") - # loop on each job - for job in jobs_list: - # loop on each item - for item in job: - # get the interval if not already in intervals - if item.get("every") and item.get("every") not in intervals: - intervals.append(item.get("every")) - - builder = [ - { - "type": "card", - "containerColumns": {"pc": 12, "tablet": 12, "mobile": 12}, - "widgets": [ - title_widget("jobs_title"), - table_widget( - positions=[3, 2, 1, 1, 1, 1, 3], - header=[ - "jobs_table_name", - "jobs_table_plugin_id", - "jobs_table_interval", - "jobs_table_reload", - "jobs_table_success", - "jobs_table_history", - "jobs_table_cache_downloadable", - ], - items=jobs_list, - filters=[ - { - "filter": "table", - "filterName": "keyword", - "type": "keyword", - "value": "", - "keys": ["name", "plugin_id"], - "field": { - "id": "jobs-keyword", - "value": "", - "type": "text", - "name": "jobs-keyword", - "label": "jobs_search", - "placeholder": "inp_keyword", - "isClipboard": False, - "popovers": [ - { - "text": "jobs_search_desc", - "iconName": "info", - }, - ], - "columns": {"pc": 3, "tablet": 4, "mobile": 12}, - }, - }, - { - "filter": "table", - "filterName": "every", - "type": "select", - "value": "all", - "keys": ["every"], - "field": { - "id": "jobs-every", - "value": "all", - "values": intervals, - "name": "jobs-every", - "onlyDown": True, - "label": "jobs_interval", - "popovers": [ - { - "text": "jobs_interval_desc", - "iconName": "info", - }, - ], - "columns": {"pc": 3, "tablet": 4, "mobile": 12}, - }, - }, - { - "filter": "table", - "filterName": "reload", - "type": "select", - "value": "all", - "keys": ["reload"], - "field": { - "id": "jobs-last-run", - "value": "all", - "values": ["all", "success", "failed"], - "name": "jobs-last-run", - "onlyDown": True, - "label": "jobs_reload", - "popovers": [ - { - "text": "jobs_reload_desc", - "iconName": "info", - }, - ], - "columns": {"pc": 3, "tablet": 4, "mobile": 12}, - }, - }, - { - "filter": "table", - "filterName": "success", - "type": "select", - "value": "all", - "keys": ["success"], - "field": { - "id": "jobs-success", - "value": "all", - "values": ["all", "success", "failed"], - "name": "jobs-success", - "onlyDown": True, - "label": "jobs_success", - "popovers": [ - { - "text": "jobs_success_desc", - "iconName": "info", - }, - ], - "columns": {"pc": 3, "tablet": 4, "mobile": 12}, - }, - }, - ], - minWidth="lg", - title="jobs_table_title", - ), - ], - } - ] - - return builder - - -def get_jobs_list(jobs): - data = [] - # loop on each dict - for key, value in jobs.items(): - item = [] - item.append({"name": key, "type": "Text", "data": {"text": key}}) - # loop on each value - for k, v in value.items(): - # override widget type for some keys - if k in ("reload", "history"): - is_success = v if k == "reload" else v[0].get("success") - item.append( - { - k: "success" if is_success else "failed", - "type": "Icons", - "data": { - "iconName": "check" if is_success else "cross", - }, - } - ) - - if k not in ("history"): - continue - - if k in ("plugin_id", "every"): - item.append({k: v, "type": "Text", "data": {"text": v}}) - continue - - if k in ("history"): - items = [] - for hist in v: - items.append( - [ - { - "type": "Text", - "data": { - "text": hist["start_date"], - }, - }, - { - "type": "Text", - "data": { - "text": hist["end_date"], - }, - }, - { - "type": "Icons", - "data": { - "iconName": "check" if hist["success"] else "cross", - }, - }, - ] - ) - - item.append( - { - "type": "Button", - "data": { - "id": f"open-modal-history-{k}", - "text": "jobs_history", - "hideText": True, - "color": "blue", - "size": "normal", - "iconName": "document", - "iconColor": "white", - "modal": { - "widgets": [ - {"type": "Title", "data": {"title": key}}, - {"type": "Subtitle", "data": {"subtitle": "jobs_history_subtitle"}}, - { - "type": "Table", - "data": { - "title": "jobs_history_table_title", - "minWidth": "", - "header": [ - "jobs_table_start_run", - "jobs_table_end_run", - "jobs_table_success", - ], - "positions": [5, 5, 2], - "items": items, - }, - }, - { - "type": "ButtonGroup", - "data": { - "buttons": [ - { - "id": f"close-history-{k}", - "text": "action_close", - "color": "close", - "size": "normal", - "attrs": {"data-close-modal": ""}, - } - ] - }, - }, - ] - }, - }, - } - ) - - if k in ("cache") and len(v) <= 0: - item.append({k: v, "type": "Text", "data": {"text": ""}}) - continue - - if k in ("cache") and len(v) > 0: - files = [] - # loop on each cache item - for cache in v: - file_name = f"{cache['file_name']} [{cache['service_id']}]" if cache["service_id"] else f"{cache['file_name']}" - files.append(file_name) - - item.append( - { - k: " ".join(files), - "type": "Fields", - "data": { - "setting": { - "attrs": { - "data-plugin-id": value.get("plugin_id", ""), - "data-job-name": key, - }, - "id": f"{key}_cache", - "label": f"{key}_cache", - "hideLabel": True, - "inpType": "select", - "name": f"{key}_cache", - "value": "download file", - "values": files, - "columns": { - "pc": 12, - "tablet": 12, - "mobile": 12, - }, - "overflowAttrEl": "data-table-body", - "containerClass": "table download-cache-file", - "maxBtnChars": 16, - "popovers": [ - { - "iconName": "info", - "text": "jobs_download_cache_file", - }, - ], - } - }, - } - ) - continue - - data.append(item) - - return data +with open("jobs.txt", "w") as f: + f.write(output_base64_string) diff --git a/src/ui/client/tests/jobs.txt b/src/ui/client/builder/jobs.txt similarity index 100% rename from src/ui/client/tests/jobs.txt rename to src/ui/client/builder/jobs.txt diff --git a/src/ui/client/tests/logs.json b/src/ui/client/builder/logs.json similarity index 100% rename from src/ui/client/tests/logs.json rename to src/ui/client/builder/logs.json diff --git a/src/ui/client/builder/logs.py b/src/ui/client/builder/logs.py index 94297bdee..bc4b0fd44 100644 --- a/src/ui/client/builder/logs.py +++ b/src/ui/client/builder/logs.py @@ -1,83 +1,17 @@ -from .utils.widgets import title_widget +import json +import base64 +from builder.logs import logs_builder -def logs_builder(files: list[str] = [], current_file: str = "", raw_data: str = "") -> str: +files = ["file1", "file2"] +current_file = "" +raw_data = "gefesfesfsefes" +output = logs_builder(files, current_file, raw_data) - if not files: - builder = [ - { - "type": "void", - "widgets": [{"type": "MessageUnmatch", "data": {"text": "logs_no_files_found"}}], - } - ] - return builder +with open("logs.json", "w") as f: + json.dump(output, f, indent=4) - file_select = { - "type": "Fields", - "data": { - "setting": { - "id": "logs-select-file", - "label": "logs_log_file", - "inpType": "select", - "name": "logs-select-file", - "onlyDown": True, - "value": current_file or "Select a file", - "values": files, - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12, - }, - "maxBtnChars": 20, - "attrs": { - "data-log": "true", - }, - "popovers": [ - { - "iconName": "info", - "text": "logs_select_file_info", - }, - ], - } - }, - } - - if not raw_data: - builder = [ - { - "type": "card", - "containerColumns": {"pc": 12, "tablet": 12, "mobile": 12}, - "widgets": [title_widget("logs_title"), file_select, {"type": "MessageUnmatch", "data": {"text": "logs_not_selected_or_not_found"}}], - } - ] - return builder - - editor = { - "type": "Fields", - "data": { - "setting": { - "containerClass": "mt-4", - "id": "logs-file-content", - "label": "logs_file_content", - "inpType": "editor", - "name": "logs-file-content", - "value": raw_data, - "columns": { - "pc": 12, - "tablet": 12, - "mobile": 12, - }, - "editorClass" : "min-h-[500px]", - } - }, - } - - builder = [ - { - "type": "card", - "containerColumns": {"pc": 12, "tablet": 12, "mobile": 12}, - "widgets": [title_widget("logs_title"), file_select, editor], - } - ] - - return builder +output_base64_bytes = base64.b64encode(bytes(json.dumps(output), "utf-8")) +output_base64_string = output_base64_bytes.decode("ascii") +with open("logs.txt", "w") as f: + f.write(output_base64_string) diff --git a/src/ui/client/tests/logs.txt b/src/ui/client/builder/logs.txt similarity index 100% rename from src/ui/client/tests/logs.txt rename to src/ui/client/builder/logs.txt diff --git a/src/ui/client/tests/plugins.json b/src/ui/client/builder/plugins.json similarity index 100% rename from src/ui/client/tests/plugins.json rename to src/ui/client/builder/plugins.json diff --git a/src/ui/client/tests/plugins.py b/src/ui/client/builder/plugins.py similarity index 100% rename from src/ui/client/tests/plugins.py rename to src/ui/client/builder/plugins.py diff --git a/src/ui/client/tests/plugins2.py b/src/ui/client/builder/plugins2.py similarity index 89% rename from src/ui/client/tests/plugins2.py rename to src/ui/client/builder/plugins2.py index 708c96661..9673dff9f 100644 --- a/src/ui/client/tests/plugins2.py +++ b/src/ui/client/builder/plugins2.py @@ -1,17 +1,24 @@ import json import base64 +# TODO : REMOVE operation by custom endpoint + from builder.utils.widgets import button, button_group, title, text, tabulator, fields, upload, checkbox -core_columns = [ + +# Here all plugins unless external +core_pro_columns = [ {"title": "Name", "field": "name", "formatter": "text"}, {"title": "Description", "field": "description", "formatter": "text"}, + {"title": "Type", "field": "type", "formatter": "text"}, + {"title": "version", "field": "version", "formatter": "text"}, + {"title": "stream", "field": "type", "stream": "text"}, # "yes" "no" "partial" {"title": "Documentation page", "field": "documentation_page", "formatter": "buttonGroup"}, {"title": "Plugin page", "field": "plugin_page", "formatter": "buttonGroup"}, ] -core_filters = [ +core_pro_filters = [ { "type": "like", "fields": ["name"], @@ -27,7 +34,7 @@ core_filters = [ ] -core_items = [ +core_pro_items = [ { "name": text(text="Name")["data"], "description": text(text="Description")["data"], @@ -63,24 +70,25 @@ core_items = [ ] -register_columns = [ +registry_columns = [ {"title": "Select", "field": "select", "formatter": "fields"}, # checkbox {"title": "Name", "field": "name", "formatter": "text"}, {"title": "Description", "field": "description", "formatter": "text"}, - {"title": "Type", "field": "type", "formatter": "text"}, {"title": "Install", "field": "install", "formatter": "text"}, {"title": "Documentation page", "field": "documentation_page", "formatter": "buttonGroup"}, + {"title": "version", "field": "version", "formatter": "text"}, + {"title": "stream", "field": "type", "stream": "text"}, # "yes" "no" "partial" {"title": "Plugin page", "field": "plugin_page", "formatter": "buttonGroup"}, ] -register_filters = [ +registry_filters = [ { "type": "like", "fields": ["name"], "setting": { - "id": "input-search-register-name", - "name": "input-search-register-name", + "id": "input-search-registry-name", + "name": "input-search-registry-name", "label": "plugins_search_name", # keep it (a18n) "value": "", "inpType": "input", @@ -91,8 +99,8 @@ register_filters = [ "type": "=", "fields": ["type"], "setting": { - "id": "select-register-type", - "name": "select-register-type", + "id": "select-registry-type", + "name": "select-registry-type", "label": "plugins_select_type", # keep it (a18n) "value": "all", "values": ["all", "pro", "external"], @@ -105,8 +113,8 @@ register_filters = [ "type": "=", "fields": ["install"], "setting": { - "id": "select-register-install", - "name": "select-register-install", + "id": "select-registry-install", + "name": "select-registry-install", "label": "plugins_select_install", # keep it (a18n) "value": "all", "values": ["all", "yes", "no"], @@ -118,7 +126,7 @@ register_filters = [ ] -register_items = [ +registry_items = [ { "select": checkbox( inputType="checkbox", @@ -164,6 +172,7 @@ register_items = [ }, ] +# Here all plugins with type external upload_columns = [ {"title": "Select", "field": "select", "formatter": "fields"}, # checkbox {"title": "Name", "field": "name", "formatter": "text"}, @@ -241,9 +250,9 @@ builder = [ "widgets": [ tabulator( id="table-core-plugins", - columns=core_columns, - items=core_items, - filters=core_filters, + columns=core_pro_columns, + items=core_pro_items, + filters=core_pro_filters, ) ], }, @@ -252,10 +261,10 @@ builder = [ "display": ["main", 2], "widgets": [ tabulator( - id="table-register-plugins", - columns=register_columns, - items=register_items, - filters=register_filters, + id="table-registry-plugins", + columns=registry_columns, + items=registry_items, + filters=registry_filters, ) ], }, diff --git a/src/ui/client/tests/plugins_page.json b/src/ui/client/builder/plugins_page.json similarity index 100% rename from src/ui/client/tests/plugins_page.json rename to src/ui/client/builder/plugins_page.json diff --git a/src/ui/client/tests/profile2.py b/src/ui/client/builder/profile2.py similarity index 57% rename from src/ui/client/tests/profile2.py rename to src/ui/client/builder/profile2.py index 27ed5c840..868a56a7b 100644 --- a/src/ui/client/tests/profile2.py +++ b/src/ui/client/builder/profile2.py @@ -1,20 +1,37 @@ import json import base64 +# TODO : REMOVE operation by custom endpoint + from builder.utils.widgets import button, button_group, title, text, tabulator, fields, upload, input, combobox, checkbox, select, editor # Define data to put in profile widgets +# - username +# - email +# - created_method +# - is_superadmin +# - role +# - role_description +# - permissions (liste of permissions []) +# - creation_date +# - last_update (last time update user info) profile_widgets = [] # Define data to put in profile form widgets # - update password # - update email -# - update username -user_widgets = [] +account_widgets = [] # Define data to put in totp widgets -# - enable totp: what we need ? -# - disable totp: what we need ? +# if want to enable totp (currently disabled): +# text with state +# show QRcode SVG +# - form (endpoint /totp-enable) : totp secret (type password), totp code, password +# Case currently enabled : +# text with state +# after first totp setup, show recovery codes +# form refresh recovery codes button that will redisplay recovery (endpoint /totp-refresh) : password (warning that will remove previous) +# form disabled (endpoint /totp-disable) : totp code || recovery code, password totp_widgets = [] builder = [ @@ -29,7 +46,7 @@ builder = [ "type": "card", "display": ["main", 2], "widgets": [ - user_widgets, + account_widgets, ], }, { diff --git a/src/ui/client/tests/raw.json b/src/ui/client/builder/raw.json similarity index 100% rename from src/ui/client/tests/raw.json rename to src/ui/client/builder/raw.json diff --git a/src/ui/client/tests/raw.py b/src/ui/client/builder/raw.py similarity index 100% rename from src/ui/client/tests/raw.py rename to src/ui/client/builder/raw.py diff --git a/src/ui/client/tests/raw.txt b/src/ui/client/builder/raw.txt similarity index 100% rename from src/ui/client/tests/raw.txt rename to src/ui/client/builder/raw.txt diff --git a/src/ui/client/tests/raw64.txt b/src/ui/client/builder/raw64.txt similarity index 100% rename from src/ui/client/tests/raw64.txt rename to src/ui/client/builder/raw64.txt diff --git a/src/ui/client/builder/raw_mode.py b/src/ui/client/builder/raw_mode.py deleted file mode 100644 index 866360f48..000000000 --- a/src/ui/client/builder/raw_mode.py +++ /dev/null @@ -1,40 +0,0 @@ -from .utils.form import get_forms, get_service_settings - - -def raw_mode_builder(templates: list[dict], plugins: list, global_config: dict, total_config: dict, service_name: str, is_new: bool = False) -> str: - """Render forms with global config data. - ATM we don't need templates but we need to pass at least one to the function (it will simply not override anything). - """ - - # We need - settings = get_service_settings(service_name, global_config, total_config) - - builder = [ - { - "type": "card", - "containerColumns": {"pc": 12, "tablet": 12, "mobile": 12}, - "widgets": [ - { - "type": "Title", - "data": { - "title": service_name, - "type": "container", - "lowercase": True, - }, - }, - { - "type": "Subtitle", - "data": {"subtitle": "services_manage_subtitle", "type": "container"}, - }, - { - "type": "Templates", - "data": { - "templates": get_forms(templates, plugins, settings, ("raw",), is_new, True), - "operation": "new" if is_new else "edit", - "oldServerName": service_name if service_name else "", - }, - }, - ], - } - ] - return builder diff --git a/src/ui/client/tests/reports.json b/src/ui/client/builder/reports.json similarity index 100% rename from src/ui/client/tests/reports.json rename to src/ui/client/builder/reports.json diff --git a/src/ui/client/tests/reports.py b/src/ui/client/builder/reports.py similarity index 100% rename from src/ui/client/tests/reports.py rename to src/ui/client/builder/reports.py diff --git a/src/ui/client/tests/reports2.py b/src/ui/client/builder/reports2.py similarity index 97% rename from src/ui/client/tests/reports2.py rename to src/ui/client/builder/reports2.py index 463514cd8..2c8fc201b 100644 --- a/src/ui/client/tests/reports2.py +++ b/src/ui/client/builder/reports2.py @@ -3,10 +3,13 @@ import base64 from builder.utils.widgets import button, button_group, title, text, tabulator, fields, upload, datepicker +# TODO : REMOVE operation by custom endpoint + reports_columns = [ {"title": "Date", "field": "date", "formatter": "fields"}, # datepicker {"title": "IP", "field": "ip", "formatter": "text"}, {"title": "Country", "field": "country", "formatter": "text"}, + {"title": "Server name", "field": "server_name", "formatter": "text"}, {"title": "Method", "field": "method", "formatter": "text"}, {"title": "URL", "field": "url", "formatter": "text"}, {"title": "Code", "field": "code", "formatter": "text"}, diff --git a/src/ui/client/tests/services.json b/src/ui/client/builder/services.json similarity index 100% rename from src/ui/client/tests/services.json rename to src/ui/client/builder/services.json diff --git a/src/ui/client/builder/services.py b/src/ui/client/builder/services.py index c30d88f90..2128f9e7d 100644 --- a/src/ui/client/builder/services.py +++ b/src/ui/client/builder/services.py @@ -1,379 +1,46 @@ +import json +import base64 from typing import Union -from .utils.widgets import title_widget, table_widget +from builder.services import services_builder + +services = [ + { + "USE_REVERSE_PROXY": {"value": "yes", "method": "scheduler", "global": False}, + "IS_DRAFT": {"value": "no", "method": "default", "global": False}, + "SERVE_FILES": {"value": "no", "method": "scheduler", "global": True}, + "REMOTE_PHP": {"value": "", "method": "default", "global": True}, + "AUTO_LETS_ENCRYPT": {"value": "no", "method": "default", "global": True}, + "USE_CUSTOM_SSL": {"value": "no", "method": "default", "global": True}, + "USE_MODSECURITY": {"value": "yes", "method": "default", "global": True}, + "USE_BAD_BEHAVIOR": {"value": "yes", "method": "default", "global": True}, + "USE_LIMIT_REQ": {"value": "yes", "method": "default", "global": True}, + "USE_DNSBL": {"value": "yes", "method": "default", "global": True}, + "SERVER_NAME": {"value": "app1.example.com", "method": "scheduler", "global": False}, + }, + { + "USE_REVERSE_PROXY": {"value": "yes", "method": "scheduler", "global": False}, + "IS_DRAFT": {"value": "yes", "method": "default", "global": False}, + "SERVE_FILES": {"value": "no", "method": "scheduler", "global": True}, + "REMOTE_PHP": {"value": "", "method": "default", "global": True}, + "AUTO_LETS_ENCRYPT": {"value": "no", "method": "default", "global": True}, + "USE_CUSTOM_SSL": {"value": "no", "method": "default", "global": True}, + "USE_MODSECURITY": {"value": "yes", "method": "default", "global": True}, + "USE_BAD_BEHAVIOR": {"value": "yes", "method": "default", "global": True}, + "USE_LIMIT_REQ": {"value": "yes", "method": "default", "global": True}, + "USE_DNSBL": {"value": "yes", "method": "default", "global": True}, + "SERVER_NAME": {"value": "www.example.com", "method": "ui", "global": False}, + }, +] -def services_builder(services): - # get method for each service["SERVER_NAME"]["method"] - methods = list(set([service["SERVER_NAME"]["method"] for service in services])) +output = services_builder(services) - services_list = get_services_list(services) +# store on a file +with open("services.json", "w") as f: + json.dump(output, f, indent=4) +output_base64_bytes = base64.b64encode(bytes(json.dumps(output), "utf-8")) +output_base64_string = output_base64_bytes.decode("ascii") - builder = [ - { - "type": "card", - "containerColumns": {"pc": 12, "tablet": 12, "mobile": 12}, - "widgets": [ - title_widget("services_title"), - { - "type": "Button", - "data": { - "id": "services-new", - "text": "services_new", - "color": "success", - "size": "normal", - "iconName": "plus", - "iconColor": "white", - "modal": services_action(server_name="new", operation="new", title="services_new_title", subtitle="services_new_subtitle"), - "containerClass": "col-span-12 flex justify-center", - }, - }, - table_widget( - positions=[4, 4, 4], - header=[ - "services_table_name", - "services_table_method", - "services_table_actions", - ], - items=services_list, - filters=[ - { - "filter": "table", - "filterName": "keyword", - "type": "keyword", - "value": "", - "keys": ["name"], - "field": { - "id": "services-keyword", - "value": "", - "type": "text", - "name": "services-keyword", - "label": "services_search", - "placeholder": "inp_keyword", - "isClipboard": False, - "popovers": [ - { - "text": "services_search_desc", - "iconName": "info", - }, - ], - "columns": {"pc": 3, "tablet": 4, "mobile": 12}, - }, - }, - { - "filter": "table", - "filterName": "method", - "type": "select", - "value": "all", - "keys": ["method"], - "field": { - "id": "services-methods", - "value": "all", - "values": methods, - "name": "services-methods", - "onlyDown": True, - "label": "services_methods", - "popovers": [ - { - "text": "services_methods_desc", - "iconName": "info", - }, - ], - "columns": {"pc": 3, "tablet": 4, "mobile": 12}, - }, - }, - { - "filter": "table", - "filterName": "draft", - "type": "select", - "value": "all", - "keys": ["draft"], - "field": { - "id": "services-draft", - "value": "all", - "values": ["all", "online", "draft"], - "name": "services-draft", - "onlyDown": True, - "label": "services_draft", - "popovers": [ - { - "text": "services_draft_desc", - "iconName": "info", - }, - ], - "columns": {"pc": 3, "tablet": 4, "mobile": 12}, - }, - }, - ], - minWidth="md", - title="services_table_title", - ), - ], - }, - ] - - return builder - - -def services_settings(settings: dict) -> dict: - # deep copy settings dict - settings = settings.copy() - # remove "SERVER_NAME" and "IS_DRAFT" key - settings.pop("SERVER_NAME", None) - settings.pop("IS_DRAFT", None) - # Create table with settings remaining keys - settings_table_items = [] - for key, value in settings.items(): - format_key = key.replace("USE_", "").replace("_", " ") - settings_table_items.append( - [ - { - "type": "Text", - "data": {"text": format_key}, - }, - { - "type": "Icons", - "data": { - "iconName": "check" if value.get("value") == "yes" else "cross", - }, - }, - ] - ) - - table = table_widget( - positions=[8, 4], - header=["services_settings_table_name", "services_settings_table_status"], - items=settings_table_items, - filters=[], - minWidth="", - title="services_settings_table_title", - ) - - return table - - -def services_action( - server_name: str = "", - operation: str = "", - title: str = "", - subtitle: str = "", - additional: str = "", - is_draft: Union[bool, None] = None, - service: dict = None, -) -> dict: - - buttons = [ - { - "id": f"close-service-btn-{server_name}", - "text": "action_close", - "disabled": False, - "color": "close", - "size": "normal", - "attrs": {"data-close-modal": ""}, - }, - ] - - if operation == "delete": - buttons.append( - { - "id": f"{operation}-service-btn-{server_name}", - "text": f"action_{operation}", - "disabled": False, - "color": "delete", - "size": "normal", - "attrs": { - "data-submit-form": f"""{{"SERVER_NAME" : "{server_name}", "operation" : "{operation}" }}""", - }, - }, - ) - - if operation == "draft": - draft_value = "yes" if is_draft else "no" - buttons.append( - { - "id": f"{operation}-service-btn-{server_name}", - "text": "action_switch", - "disabled": False, - "color": "success", - "size": "normal", - "attrs": { - "data-submit-form": f"""{{"SERVER_NAME" : "{server_name}", "OLD_SERVER_NAME" : "{server_name}", "operation" : "edit", "IS_DRAFT" : "{draft_value}" }}""", - }, - }, - ) - - content = [ - { - "type": "Title", - "data": { - "title": title, - }, - }, - ] - - if subtitle: - content.append( - { - "type": "Text", - "data": { - "text": subtitle, - }, - }, - ) - - if additional: - content.append( - { - "type": "Text", - "data": { - "bold": True, - "text": additional, - }, - } - ) - - if operation == "plugins": - settings = services_settings(service) - content.append(settings) - - if operation == "delete": - content.append( - { - "type": "Text", - "data": { - "text": "", - "bold": True, - "text": server_name, - }, - } - ) - - if operation == "edit" or operation == "new": - modes = ("easy", "advanced", "raw") - mode_buttons = [] - for mode in modes: - mode_buttons.append( - { - "id": f"{operation}-service-btn-{server_name}", - "text": f"services_mode_{mode}", - "disabled": False, - "color": "info", - "size": "normal", - "attrs": { - "role": "link", - "data-link": f"modes?service_name={server_name}&mode={mode}" if operation != "new" else f"modes?mode={mode}", - }, - }, - ) - - content.append( - { - "type": "ButtonGroup", - "data": {"buttons": mode_buttons}, - } - ) - - content.append( - { - "type": "ButtonGroup", - "data": {"buttons": buttons}, - }, - ) - - modal = { - "widgets": content, - } - - return modal - - -def get_services_list(services): - data = [] - for index, service in enumerate(services): - server_name = service["SERVER_NAME"]["value"] - server_method = service["SERVER_NAME"]["method"] - is_draft = True if service["IS_DRAFT"]["value"] == "yes" else False - is_deletable = False if server_method in ("autoconf", "scheduler") else True - - item = [] - # Get name - item.append({"name": server_name, "type": "Text", "data": {"text": server_name}}) - item.append({"method": server_method, "type": "Text", "data": {"text": server_method}}) - item.append( - { - "type": "ButtonGroup", - "data": { - "buttons": [ - { - "id": f"open-modal-plugins-{index}", - "text": "plugins", - "hideText": True, - "color": "success", - "size": "normal", - "iconName": "eye", - "iconColor": "white", - "modal": services_action( - server_name=server_name, - operation="plugins", - title="services_plugins_title", - subtitle="", - service=service, - ), - }, - { - "attrs": {"data-server-name": server_name}, - "id": f"open-modal-manage-{index}", - "text": "manage", - "hideText": True, - "color": "edit", - "size": "normal", - "iconName": "pen", - "iconColor": "white", - "modal": services_action( - server_name=server_name, - operation="edit", - title="services_edit_title", - subtitle="services_edit_subtitle", - additional=server_name, - ), - }, - { - "attrs": {"data-server-name": server_name, "data-is-draft": "yes" if is_draft else "no"}, - "id": f"open-modal-draft-{index}", - "text": "draft" if is_draft else "online", - "hideText": True, - "color": "blue", - "size": "normal", - "iconName": "document" if is_draft else "globe", - "iconColor": "white", - "modal": services_action( - server_name=server_name, - operation="draft", - title="services_draft_title", - subtitle="services_draft_subtitle" if is_draft else "services_online_subtitle", - additional="services_draft_switch_subtitle" if is_draft else "services_online_switch_subtitle", - is_draft=is_draft, - ), - }, - { - "attrs": {"data-server-name": server_name}, - "id": f"open-modal-delete-{index}", - "text": "delete", - "disabled": not is_deletable, - "hideText": True, - "color": "red", - "size": "normal", - "iconName": "trash", - "iconColor": "white", - "modal": services_action( - server_name=server_name, operation="delete", title="services_delete_title", subtitle="services_delete_subtitle" - ), - }, - ] - }, - } - ) - - data.append(item) - - return data +with open("services.txt", "w") as f: + f.write(output_base64_string) diff --git a/src/ui/client/tests/services.txt b/src/ui/client/builder/services.txt similarity index 100% rename from src/ui/client/tests/services.txt rename to src/ui/client/builder/services.txt diff --git a/src/ui/client/tests/temp.py b/src/ui/client/builder/temp.py similarity index 100% rename from src/ui/client/tests/temp.py rename to src/ui/client/builder/temp.py diff --git a/src/ui/client/tests/usermanagement2.py b/src/ui/client/builder/usermanagement2.py similarity index 96% rename from src/ui/client/tests/usermanagement2.py rename to src/ui/client/builder/usermanagement2.py index 8bcbaac30..a2cb32932 100644 --- a/src/ui/client/tests/usermanagement2.py +++ b/src/ui/client/builder/usermanagement2.py @@ -4,12 +4,14 @@ import base64 from builder.utils.widgets import button, button_group, title, text, tabulator, fields, upload, input, combobox, checkbox, select, editor, datepicker +# TODO : REMOVE operation by custom endpoint def generate_form( username: str = "", + password: str = "", + email: str = "", is_new: bool = True, role: str = "", roles: list = [], - password: str = "", display_index: int = 1, ): @@ -88,8 +90,10 @@ def get_forms(): users_columns = [ {"title": "Username", "field": "username", "formatter": "text"}, {"title": "Role", "field": "role", "formatter": "text"}, - {"title": "creation_date", "field": "creation_date", "formatter": "fields"}, # datepicker - {"title": "last_login", "field": "last_login", "formatter": "fields"}, # datepicker + {"title": "Creation date", "field": "creation_date", "formatter": "fields"}, # datepicker + {"title": "Last login", "field": "last_login", "formatter": "fields"}, # datepicker of last login + {"title": "Last login IP", "field": "last_login_ip", "formatter": "fields"}, # datepicker of last login + {"title": "Login count", "field": "login_count", "formatter": "fields"}, # datepicker of last login {"title": "totp (state)", "field": "totp", "formatter": "icons"}, # icon check or cross { "title": "actions", diff --git a/src/ui/client/dashboard/components/Forms/Group/Multiple.vue b/src/ui/client/dashboard/components/Forms/Group/Multiple.vue index 14cb2e483..0fb902453 100644 --- a/src/ui/client/dashboard/components/Forms/Group/Multiple.vue +++ b/src/ui/client/dashboard/components/Forms/Group/Multiple.vue @@ -146,7 +146,7 @@ import Container from "@components/Widget/Container.vue"; * } * } * }, - * @param {object} multiples - The multiples settings to display. This needs to be a dict of settings using default field format. + * @param {object} multiples - The multiples settings to display. This needs to be a dict of settings using default field format. * @param {object} [columns={"pc": "12", "tablet": "12", "mobile": "12"}] - Field has a grid system. This allow to get multiple field in the same row if needed. * @param {string} [containerClass=""] - Additionnal class to add to the container * @param {string} [tadId=contentIndex] - The tabindex of the field, by default it is the contentIndex diff --git a/src/ui/client/tests/advanced.json b/src/ui/client/tests/advanced.json deleted file mode 100644 index e3ee5aac9..000000000 --- a/src/ui/client/tests/advanced.json +++ /dev/null @@ -1,13770 +0,0 @@ -[ - { - "type": "card", - "containerColumns": { - "pc": 12, - "tablet": 12, - "mobile": 12 - }, - "widgets": [ - { - "type": "Title", - "data": { - "title": "app1.example.com", - "type": "container", - "lowercase": true - } - }, - { - "type": "Subtitle", - "data": { - "subtitle": "services_manage_subtitle", - "type": "container" - } - }, - { - "type": "Templates", - "data": { - "templates": { - "advanced": { - "default": [ - { - "id": "general", - "stream": "partial", - "name": "General", - "description": "The general settings for the server", - "version": "0.1", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "SERVER_NAME": { - "context": "multisite", - "default": "www.example.com", - "help": "List of the virtual hosts served by bunkerweb.", - "id": "server-name", - "label": "Server name", - "regex": "^((\\S{1,255})(?!.*\\s\\2(\\s|$)))?(\\s(\\S{1,255})(?!.*\\s\\5(\\s|$)))*$", - "type": "text", - "pattern": "^((\\S{1,255})(?!.*\\s\\2(\\s|$)))?(\\s(\\S{1,255})(?!.*\\s\\5(\\s|$)))*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "app1.example.com", - "name": "Server name", - "prev_value": "www.example.com", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of the virtual hosts served by bunkerweb." - } - ], - "method": "ui", - "containerClass": "z-6" - }, - "SERVER_TYPE": { - "context": "multisite", - "default": "http", - "help": "Server type : http or stream.", - "id": "server-type", - "label": "Server type", - "regex": "^(http|stream)$", - "type": "select", - "pattern": "^(http|stream)$", - "inpType": "select", - "values": ["http", "stream"], - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "http", - "name": "Server type", - "prev_value": "http", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Server type : http or stream." - } - ], - "method": "default", - "containerClass": "z-5" - }, - "LISTEN_STREAM": { - "context": "multisite", - "default": "yes", - "help": "Enable listening for non-ssl (passthrough).", - "id": "listen-stream", - "label": "Listen stream", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "Listen stream", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable listening for non-ssl (passthrough)." - } - ], - "method": "default", - "containerClass": "z-4" - }, - "LISTEN_STREAM_PORT": { - "context": "multisite", - "default": "1337", - "help": "Listening port for non-ssl (passthrough).", - "id": "listen-stream-port", - "label": "Listen stream port", - "regex": "^[0-9]+$", - "type": "text", - "pattern": "^[0-9]+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "1337", - "name": "Listen stream port", - "prev_value": "1337", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Listening port for non-ssl (passthrough)." - } - ], - "method": "default", - "containerClass": "z-3" - }, - "LISTEN_STREAM_PORT_SSL": { - "context": "multisite", - "default": "4242", - "help": "Listening port for ssl (passthrough).", - "id": "listen-stream-port-ssl", - "label": "Listen stream port ssl", - "regex": "^[0-9]+$", - "type": "text", - "pattern": "^[0-9]+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "4242", - "name": "Listen stream port ssl", - "prev_value": "4242", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Listening port for ssl (passthrough)." - } - ], - "method": "default", - "containerClass": "z-2" - }, - "USE_UDP": { - "context": "multisite", - "default": "no", - "help": "UDP listen instead of TCP (stream).", - "id": "use-udp", - "label": "Listen UDP", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Listen UDP", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "UDP listen instead of TCP (stream)." - } - ], - "method": "default", - "containerClass": "z-1" - }, - "IS_DRAFT": { - "context": "multisite", - "default": "no", - "help": "Internal use : set to yes when the service is in draft mode.", - "id": "internal-use-draft", - "label": "internal use draft", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "internal use draft", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Internal use : set to yes when the service is in draft mode." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "antibot", - "stream": "no", - "name": "Antibot", - "description": "Bot detection by using a challenge.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": true, - "settings": { - "USE_ANTIBOT": { - "context": "multisite", - "default": "no", - "help": "Activate antibot feature.", - "id": "use-antibot", - "label": "Antibot challenge", - "regex": "^(no|cookie|javascript|captcha|recaptcha|hcaptcha|turnstile)$", - "type": "select", - "pattern": "^(no|cookie|javascript|captcha|recaptcha|hcaptcha|turnstile)$", - "inpType": "select", - "values": [ - "captcha", - "cookie", - "hcaptcha", - "javascript", - "no", - "recaptcha", - "turnstile" - ], - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Antibot challenge", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Activate antibot feature." - } - ], - "method": "default", - "containerClass": "z-10" - }, - "ANTIBOT_URI": { - "context": "multisite", - "default": "/challenge", - "help": "Unused URI that clients will be redirected to to solve the challenge.", - "id": "antibot-uri", - "label": "Antibot URL", - "regex": "^\\/[\\w\\].~:\\/?#\\[@!$\\&'\\(\\)*+,;=\\-]*$", - "type": "text", - "pattern": "^\\/[\\w\\].~:\\/?#\\[@!$\\&'\\(\\)*+,;=\\-]*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "/challenge", - "name": "Antibot URL", - "prev_value": "/challenge", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Unused URI that clients will be redirected to to solve the challenge." - } - ], - "method": "default", - "containerClass": "z-9" - }, - "ANTIBOT_TIME_RESOLVE": { - "context": "multisite", - "default": "60", - "help": "Maximum time (in seconds) clients have to resolve the challenge. Once this time has passed, a new challenge will be generated.", - "id": "antibot-time-resolve", - "label": "Time to resolve", - "regex": "^[0-9]+$", - "type": "text", - "pattern": "^[0-9]+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "60", - "name": "Time to resolve", - "prev_value": "60", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Maximum time (in seconds) clients have to resolve the challenge. Once this time has passed, a new challenge will be generated." - } - ], - "method": "default", - "containerClass": "z-8" - }, - "ANTIBOT_TIME_VALID": { - "context": "multisite", - "default": "86400", - "help": "Maximum validity time of solved challenges. Once this time has passed, clients will need to resolve a new one.", - "id": "antibot-time-valid", - "label": "Time valid", - "regex": "^[0-9]+$", - "type": "text", - "pattern": "^[0-9]+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "86400", - "name": "Time valid", - "prev_value": "86400", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Maximum validity time of solved challenges. Once this time has passed, clients will need to resolve a new one." - } - ], - "method": "default", - "containerClass": "z-7" - }, - "ANTIBOT_RECAPTCHA_SCORE": { - "context": "multisite", - "default": "0.7", - "help": "Minimum score required for reCAPTCHA challenge.", - "id": "antibot-recaptcha-score", - "label": "reCAPTCHA score", - "regex": "^(0\\.[1-9]|1\\.0)$", - "type": "text", - "pattern": "^(0\\.[1-9]|1\\.0)$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "0.7", - "name": "reCAPTCHA score", - "prev_value": "0.7", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Minimum score required for reCAPTCHA challenge." - } - ], - "method": "default", - "containerClass": "z-6" - }, - "ANTIBOT_RECAPTCHA_SITEKEY": { - "context": "multisite", - "default": "", - "help": "Sitekey for reCAPTCHA challenge.", - "id": "antibot-recaptcha-sitekey", - "label": "reCAPTCHA sitekey", - "regex": "^[\\w\\-]*$", - "type": "text", - "pattern": "^[\\w\\-]*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "reCAPTCHA sitekey", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Sitekey for reCAPTCHA challenge." - } - ], - "method": "default", - "containerClass": "z-5" - }, - "ANTIBOT_RECAPTCHA_SECRET": { - "context": "multisite", - "default": "", - "help": "Secret for reCAPTCHA challenge.", - "id": "antibot-recaptcha-secret", - "label": "reCAPTCHA secret", - "regex": "^[\\w\\-]*$", - "type": "password", - "pattern": "^[\\w\\-]*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "reCAPTCHA secret", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Secret for reCAPTCHA challenge." - } - ], - "method": "default", - "containerClass": "z-4" - }, - "ANTIBOT_HCAPTCHA_SITEKEY": { - "context": "multisite", - "default": "", - "help": "Sitekey for hCaptcha challenge.", - "id": "antibot-hcaptcha-sitekey", - "label": "hCaptcha sitekey", - "regex": "^[a-zA-Z0-9\\-]*$", - "type": "text", - "pattern": "^[a-zA-Z0-9\\-]*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "hCaptcha sitekey", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Sitekey for hCaptcha challenge." - } - ], - "method": "default", - "containerClass": "z-3" - }, - "ANTIBOT_HCAPTCHA_SECRET": { - "context": "multisite", - "default": "", - "help": "Secret for hCaptcha challenge.", - "id": "antibot-hcaptcha-secret", - "label": "hCaptcha secret", - "regex": "^\\w*$", - "type": "password", - "pattern": "^\\w*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "hCaptcha secret", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Secret for hCaptcha challenge." - } - ], - "method": "default", - "containerClass": "z-2" - }, - "ANTIBOT_TURNSTILE_SITEKEY": { - "context": "multisite", - "default": "", - "help": "Sitekey for Turnstile challenge.", - "id": "antibot-turnstile-sitekey", - "label": "Turnstile sitekey", - "regex": "^(0x[\\w\\-]+)?$", - "type": "text", - "pattern": "^(0x[\\w\\-]+)?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Turnstile sitekey", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Sitekey for Turnstile challenge." - } - ], - "method": "default", - "containerClass": "z-1" - }, - "ANTIBOT_TURNSTILE_SECRET": { - "context": "multisite", - "default": "", - "help": "Secret for Turnstile challenge.", - "id": "antibot-turnstile-secret", - "label": "Turnstile secret", - "regex": "^(0x[\\w\\-]+)?$", - "type": "password", - "pattern": "^(0x[\\w\\-]+)?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Turnstile secret", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Secret for Turnstile challenge." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "authbasic", - "stream": "no", - "name": "Auth basic", - "description": "Enforce login before accessing a resource or the whole site using HTTP basic auth method.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "USE_AUTH_BASIC": { - "context": "multisite", - "default": "no", - "help": "Use HTTP basic auth", - "id": "use-auth-basic", - "label": "Use HTTP basic auth", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Use HTTP basic auth", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Use HTTP basic auth" - } - ], - "method": "default", - "containerClass": "z-4" - }, - "AUTH_BASIC_LOCATION": { - "context": "multisite", - "default": "sitewide", - "help": "URL of the protected resource or sitewide value.", - "id": "auth-basic-location", - "label": "Auth basic Location", - "regex": "^(sitewide|/[a-zA-Z0-9.\\/\\-]*)$", - "type": "text", - "pattern": "^(sitewide|/[a-zA-Z0-9.\\/\\-]*)$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "sitewide", - "name": "Auth basic Location", - "prev_value": "sitewide", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "URL of the protected resource or sitewide value." - } - ], - "method": "default", - "containerClass": "z-3" - }, - "AUTH_BASIC_USER": { - "context": "multisite", - "default": "changeme", - "help": "Username", - "id": "auth-basic-user", - "label": "Auth basic Username", - "regex": "^[\\w\\-]+", - "type": "text", - "pattern": "^[\\w\\-]+", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "changeme", - "name": "Auth basic Username", - "prev_value": "changeme", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Username" - } - ], - "method": "default", - "containerClass": "z-2" - }, - "AUTH_BASIC_PASSWORD": { - "context": "multisite", - "default": "changeme", - "help": "Password", - "id": "auth-basic-password", - "label": "Password", - "regex": "^.+", - "type": "password", - "pattern": "^.+", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "changeme", - "name": "Password", - "prev_value": "changeme", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Password" - } - ], - "method": "default", - "containerClass": "z-1" - }, - "AUTH_BASIC_TEXT": { - "context": "multisite", - "default": "Restricted area", - "help": "Text to display", - "id": "auth-basic-text", - "label": "Text", - "regex": "^.+", - "type": "text", - "pattern": "^.+", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "Restricted area", - "name": "Text", - "prev_value": "Restricted area", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Text to display" - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "badbehavior", - "stream": "yes", - "name": "Bad behavior", - "description": "Ban IP generating too much 'bad' HTTP status code in a period of time.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": true, - "settings": { - "USE_BAD_BEHAVIOR": { - "context": "multisite", - "default": "yes", - "help": "Activate Bad behavior feature.", - "id": "use-bad-behavior", - "label": "Activate bad behavior", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "Activate bad behavior", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Activate Bad behavior feature." - } - ], - "method": "default", - "containerClass": "z-4" - }, - "BAD_BEHAVIOR_STATUS_CODES": { - "context": "multisite", - "default": "400 401 403 404 405 429 444", - "help": "List of HTTP status codes considered as 'bad'.", - "id": "bad-behavior-status-code", - "label": "Bad status codes", - "regex": "^( *([1-5]\\d{2})(?!.*\\2) *)+$", - "type": "text", - "pattern": "^( *([1-5]\\d{2})(?!.*\\2) *)+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "400 401 403 404 405 429 444", - "name": "Bad status codes", - "prev_value": "400 401 403 404 405 429 444", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of HTTP status codes considered as 'bad'." - } - ], - "method": "default", - "containerClass": "z-3" - }, - "BAD_BEHAVIOR_THRESHOLD": { - "context": "multisite", - "default": "10", - "help": "Maximum number of 'bad' HTTP status codes within the period of time before IP is banned.", - "id": "bad-behavior-threshold", - "label": "Threshold", - "regex": "^[1-9][0-9]*", - "type": "text", - "pattern": "^[1-9][0-9]*", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "10", - "name": "Threshold", - "prev_value": "10", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Maximum number of 'bad' HTTP status codes within the period of time before IP is banned." - } - ], - "method": "default", - "containerClass": "z-2" - }, - "BAD_BEHAVIOR_COUNT_TIME": { - "context": "multisite", - "default": "60", - "help": "Period of time (in seconds) during which we count 'bad' HTTP status codes.", - "id": "bad-behavior-period", - "label": "Period (in seconds)", - "regex": "^\\d+", - "type": "text", - "pattern": "^\\d+", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "60", - "name": "Period (in seconds)", - "prev_value": "60", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Period of time (in seconds) during which we count 'bad' HTTP status codes." - } - ], - "method": "default", - "containerClass": "z-1" - }, - "BAD_BEHAVIOR_BAN_TIME": { - "context": "multisite", - "default": "86400", - "help": "The duration time (in seconds) of a ban when the corresponding IP has reached the threshold.", - "id": "bad-behavior-ban-time", - "label": "Ban duration (in seconds)", - "regex": "^\\d+", - "type": "text", - "pattern": "^\\d+", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "86400", - "name": "Ban duration (in seconds)", - "prev_value": "86400", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "The duration time (in seconds) of a ban when the corresponding IP has reached the threshold." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "blacklist", - "stream": "partial", - "name": "Blacklist", - "description": "Deny access based on internal and external IP/network/rDNS/ASN blacklists.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": true, - "settings": { - "USE_BLACKLIST": { - "context": "multisite", - "default": "yes", - "help": "Activate blacklist feature.", - "id": "use-blacklist", - "label": "Activate blacklisting", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": true, - "value": "no", - "name": "Activate blacklisting", - "prev_value": "yes", - "popovers": [ - { - "iconName": "trespass", - "text": "inp_popover_method_disabled" - }, - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Activate blacklist feature." - } - ], - "method": "scheduler", - "containerClass": "z-11" - }, - "BLACKLIST_IP": { - "context": "multisite", - "default": "", - "help": "List of IP/network, separated with spaces, to block.", - "id": "blacklist-ip", - "label": "Blacklist IP/network", - "regex": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "type": "text", - "pattern": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Blacklist IP/network", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of IP/network, separated with spaces, to block." - } - ], - "method": "default", - "containerClass": "z-10" - }, - "BLACKLIST_RDNS": { - "context": "multisite", - "default": ".shodan.io .censys.io", - "help": "List of reverse DNS suffixes, separated with spaces, to block.", - "id": "blacklist-rdns", - "label": "Blacklist reverse DNS", - "regex": "^( *(([^ ]+)(?!.*\\3( |$))) *)*$", - "type": "text", - "pattern": "^( *(([^ ]+)(?!.*\\3( |$))) *)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": ".shodan.io .censys.io", - "name": "Blacklist reverse DNS", - "prev_value": ".shodan.io .censys.io", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of reverse DNS suffixes, separated with spaces, to block." - } - ], - "method": "default", - "containerClass": "z-9" - }, - "BLACKLIST_RDNS_GLOBAL": { - "context": "multisite", - "default": "yes", - "help": "Only perform RDNS blacklist checks on global IP addresses.", - "id": "blacklist-rdns-global", - "label": "Blacklist reverse DNS global IPs", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "Blacklist reverse DNS global IPs", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Only perform RDNS blacklist checks on global IP addresses." - } - ], - "method": "default", - "containerClass": "z-8" - }, - "BLACKLIST_ASN": { - "context": "multisite", - "default": "", - "help": "List of ASN numbers, separated with spaces, to block.", - "id": "blacklist-asn", - "label": "Blacklist ASN", - "regex": "^^( *((ASN?)?(\\d+)\\b(?!.*[SN ]\\4\\b)) *)*$", - "type": "text", - "pattern": "^^( *((ASN?)?(\\d+)\\b(?!.*[SN ]\\4\\b)) *)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Blacklist ASN", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of ASN numbers, separated with spaces, to block." - } - ], - "method": "default", - "containerClass": "z-7" - }, - "BLACKLIST_USER_AGENT": { - "context": "multisite", - "default": "", - "help": "List of User-Agent (PCRE regex), separated with spaces, to block.", - "id": "blacklist-user-agent", - "label": "Blacklist User-Agent", - "regex": "^.*$", - "type": "text", - "pattern": "^.*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Blacklist User-Agent", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of User-Agent (PCRE regex), separated with spaces, to block." - } - ], - "method": "default", - "containerClass": "z-6" - }, - "BLACKLIST_URI": { - "context": "multisite", - "default": "", - "help": "List of URI (PCRE regex), separated with spaces, to block.", - "id": "blacklist-uri", - "label": "Blacklist URI", - "regex": "^( *(.*)(?!.*\\2(?!.)) *)*$", - "type": "text", - "pattern": "^( *(.*)(?!.*\\2(?!.)) *)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Blacklist URI", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of URI (PCRE regex), separated with spaces, to block." - } - ], - "method": "default", - "containerClass": "z-5" - }, - "BLACKLIST_IGNORE_IP": { - "context": "multisite", - "default": "", - "help": "List of IP/network, separated with spaces, to ignore in the blacklist.", - "id": "blacklist-ignore-ip", - "label": "Blacklist ignore IP/network", - "regex": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "type": "text", - "pattern": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Blacklist ignore IP/network", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of IP/network, separated with spaces, to ignore in the blacklist." - } - ], - "method": "default", - "containerClass": "z-4" - }, - "BLACKLIST_IGNORE_RDNS": { - "context": "multisite", - "default": "", - "help": "List of reverse DNS suffixes, separated with spaces, to ignore in the blacklist.", - "id": "blacklist-ignore-rdns", - "label": "Blacklist ignore reverse DNS", - "regex": "^( *(([^ ]+)(?!.*\\3( |$))) *)*$", - "type": "text", - "pattern": "^( *(([^ ]+)(?!.*\\3( |$))) *)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Blacklist ignore reverse DNS", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of reverse DNS suffixes, separated with spaces, to ignore in the blacklist." - } - ], - "method": "default", - "containerClass": "z-3" - }, - "BLACKLIST_IGNORE_ASN": { - "context": "multisite", - "default": "", - "help": "List of ASN numbers, separated with spaces, to ignore in the blacklist.", - "id": "blacklist-ignore-asn", - "label": "Blacklist ignore ASN", - "regex": "^^( *((ASN?)?(\\d+)\\b(?!.*[SN ]\\4\\b)) *)*$", - "type": "text", - "pattern": "^^( *((ASN?)?(\\d+)\\b(?!.*[SN ]\\4\\b)) *)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Blacklist ignore ASN", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of ASN numbers, separated with spaces, to ignore in the blacklist." - } - ], - "method": "default", - "containerClass": "z-2" - }, - "BLACKLIST_IGNORE_USER_AGENT": { - "context": "multisite", - "default": "", - "help": "List of User-Agent (PCRE regex), separated with spaces, to ignore in the blacklist.", - "id": "blacklist-ignore-user-agent", - "label": "Blacklist ignore User-Agent", - "regex": "^.*$", - "type": "text", - "pattern": "^.*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Blacklist ignore User-Agent", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of User-Agent (PCRE regex), separated with spaces, to ignore in the blacklist." - } - ], - "method": "default", - "containerClass": "z-1" - }, - "BLACKLIST_IGNORE_URI": { - "context": "multisite", - "default": "", - "help": "List of URI (PCRE regex), separated with spaces, to ignore in the blacklist.", - "id": "blacklist-ignore-uri", - "label": "Blacklist ignore URI", - "regex": "^( *(.*)(?!.*\\2(?!.)) *)*$", - "type": "text", - "pattern": "^( *(.*)(?!.*\\2(?!.)) *)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Blacklist ignore URI", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of URI (PCRE regex), separated with spaces, to ignore in the blacklist." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "brotli", - "stream": "no", - "name": "Brotli", - "description": "Compress HTTP requests with the brotli algorithm.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "USE_BROTLI": { - "context": "multisite", - "default": "no", - "help": "Use brotli", - "id": "use-brotli", - "label": "Use brotli", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Use brotli", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Use brotli" - } - ], - "method": "default", - "containerClass": "z-3" - }, - "BROTLI_TYPES": { - "context": "multisite", - "default": "application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml", - "help": "List of MIME types that will be compressed with brotli.", - "id": "brotli-types", - "label": "MIME types", - "regex": "^(?! )( ?([\\-\\w.]+/[\\-\\w.+]+)(?!.*\\2(?!.)))+$", - "type": "text", - "pattern": "^(?! )( ?([\\-\\w.]+/[\\-\\w.+]+)(?!.*\\2(?!.)))+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml", - "name": "MIME types", - "prev_value": "application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of MIME types that will be compressed with brotli." - } - ], - "method": "default", - "containerClass": "z-2" - }, - "BROTLI_MIN_LENGTH": { - "context": "multisite", - "default": "1000", - "help": "Minimum length for brotli compression.", - "id": "brotli-min-length", - "label": "Minimum length", - "regex": "^\\d+", - "type": "text", - "pattern": "^\\d+", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "1000", - "name": "Minimum length", - "prev_value": "1000", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Minimum length for brotli compression." - } - ], - "method": "default", - "containerClass": "z-1" - }, - "BROTLI_COMP_LEVEL": { - "context": "multisite", - "default": "6", - "help": "The compression level of the brotli algorithm.", - "id": "brotli-comp-level", - "label": "Compression level", - "regex": "^([02-9]|1[01]?)$", - "type": "select", - "pattern": "^([02-9]|1[01]?)$", - "inpType": "select", - "values": [ - "0", - "1", - "10", - "11", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9" - ], - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "6", - "name": "Compression level", - "prev_value": "6", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "The compression level of the brotli algorithm." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "bunkernet", - "stream": "yes", - "name": "BunkerNet", - "description": "Share threat data with other BunkerWeb instances via BunkerNet.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": true, - "settings": { - "USE_BUNKERNET": { - "context": "multisite", - "default": "yes", - "help": "Activate BunkerNet feature.", - "id": "use-bunkernet", - "label": "Activate BunkerNet", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": true, - "value": "no", - "name": "Activate BunkerNet", - "prev_value": "yes", - "popovers": [ - { - "iconName": "trespass", - "text": "inp_popover_method_disabled" - }, - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Activate BunkerNet feature." - } - ], - "method": "scheduler", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "cors", - "stream": "no", - "name": "CORS", - "description": "Cross-Origin Resource Sharing.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": true, - "settings": { - "USE_CORS": { - "context": "multisite", - "default": "no", - "help": "Use CORS", - "id": "use-cors", - "label": "Use CORS", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Use CORS", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Use CORS" - } - ], - "method": "default", - "containerClass": "z-10" - }, - "CORS_ALLOW_ORIGIN": { - "context": "multisite", - "default": "*", - "help": "Allowed origins to make CORS requests : PCRE regex or *.", - "id": "cors-allow-origin", - "label": "Allowed origins", - "regex": "^.*$", - "type": "text", - "pattern": "^.*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "self", - "name": "Allowed origins", - "prev_value": "*", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Allowed origins to make CORS requests : PCRE regex or *." - } - ], - "method": "default", - "containerClass": "z-9" - }, - "CORS_ALLOW_METHODS": { - "context": "multisite", - "default": "GET, POST, OPTIONS", - "help": "Value of the Access-Control-Allow-Methods header.", - "id": "cors-allow-methods", - "label": "Access-Control-Allow-Methods value", - "regex": "^(\\*|(?![, ])(,? ?(GET|HEAD|POST|PUT|DELETE|CONNECT|OPTIONS|TRACE|PATCH)(?!.*\\3))*)?$", - "type": "text", - "pattern": "^(\\*|(?![, ])(,? ?(GET|HEAD|POST|PUT|DELETE|CONNECT|OPTIONS|TRACE|PATCH)(?!.*\\3))*)?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "GET, POST, OPTIONS", - "name": "Access-Control-Allow-Methods value", - "prev_value": "GET, POST, OPTIONS", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value of the Access-Control-Allow-Methods header." - } - ], - "method": "default", - "containerClass": "z-8" - }, - "CORS_ALLOW_HEADERS": { - "context": "multisite", - "default": "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range", - "help": "Value of the Access-Control-Allow-Headers header.", - "id": "cors-allow-headers", - "label": "Access-Control-Allow-Headers value", - "regex": "^(\\*|(?![, ])(,? ?([\\w\\-]+)(?!.*\\3(?!.)))*)?$", - "type": "text", - "pattern": "^(\\*|(?![, ])(,? ?([\\w\\-]+)(?!.*\\3(?!.)))*)?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range", - "name": "Access-Control-Allow-Headers value", - "prev_value": "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value of the Access-Control-Allow-Headers header." - } - ], - "method": "default", - "containerClass": "z-7" - }, - "CORS_ALLOW_CREDENTIALS": { - "context": "multisite", - "default": "no", - "help": "Send the Access-Control-Allow-Credentials header.", - "id": "cors-allow-credentials", - "label": "Send Access-Control-Allow-Credentials", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Send Access-Control-Allow-Credentials", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Send the Access-Control-Allow-Credentials header." - } - ], - "method": "default", - "containerClass": "z-6" - }, - "CORS_EXPOSE_HEADERS": { - "context": "multisite", - "default": "Content-Length,Content-Range", - "help": "Value of the Access-Control-Expose-Headers header.", - "id": "cors-expose-headers", - "label": "Access-Control-Expose-Headers value", - "regex": "^(\\*|(?![, ]+)(,? ?([\\w\\-]+)(?!.*\\3(?!.)))*)?$", - "type": "text", - "pattern": "^(\\*|(?![, ]+)(,? ?([\\w\\-]+)(?!.*\\3(?!.)))*)?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "Content-Length,Content-Range", - "name": "Access-Control-Expose-Headers value", - "prev_value": "Content-Length,Content-Range", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value of the Access-Control-Expose-Headers header." - } - ], - "method": "default", - "containerClass": "z-5" - }, - "CROSS_ORIGIN_OPENER_POLICY": { - "context": "multisite", - "default": "", - "help": "Value for the Cross-Origin-Opener-Policy header.", - "id": "cross-origin-opener-policy", - "label": "Cross-Origin-Opener-Policy", - "regex": "^(unsafe-none|same-origin-allow-popups|same-origin)?$", - "type": "select", - "pattern": "^(unsafe-none|same-origin-allow-popups|same-origin)?$", - "inpType": "select", - "values": [ - "", - "same-origin", - "same-origin-allow-popups", - "unsafe-none" - ], - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "same-origin", - "name": "Cross-Origin-Opener-Policy", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value for the Cross-Origin-Opener-Policy header." - } - ], - "method": "default", - "containerClass": "z-4" - }, - "CROSS_ORIGIN_EMBEDDER_POLICY": { - "context": "multisite", - "default": "", - "help": "Value for the Cross-Origin-Embedder-Policy header.", - "id": "cross-origin-embedder-policy", - "label": "Cross-Origin-Embedder-Policy", - "regex": "^(unsafe-none|require-corp|credentialless)?$", - "type": "select", - "pattern": "^(unsafe-none|require-corp|credentialless)?$", - "inpType": "select", - "values": [ - "", - "credentialless", - "require-corp", - "unsafe-none" - ], - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "require-corp", - "name": "Cross-Origin-Embedder-Policy", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value for the Cross-Origin-Embedder-Policy header." - } - ], - "method": "default", - "containerClass": "z-3" - }, - "CROSS_ORIGIN_RESOURCE_POLICY": { - "context": "multisite", - "default": "", - "help": "Value for the Cross-Origin-Resource-Policy header.", - "id": "cross-origin-resource-policy", - "label": "Cross-Origin-Resource-Policy", - "regex": "^(same-site|same-origin|cross-origin)?$", - "type": "select", - "pattern": "^(same-site|same-origin|cross-origin)?$", - "inpType": "select", - "values": [ - "", - "cross-origin", - "same-origin", - "same-site" - ], - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "same-site", - "name": "Cross-Origin-Resource-Policy", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value for the Cross-Origin-Resource-Policy header." - } - ], - "method": "default", - "containerClass": "z-2" - }, - "CORS_MAX_AGE": { - "context": "multisite", - "default": "86400", - "help": "Value of the Access-Control-Max-Age header.", - "id": "cors-max-age", - "label": "Access-Control-Max-Age value", - "regex": "^\\d+$", - "type": "text", - "pattern": "^\\d+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "86400", - "name": "Access-Control-Max-Age value", - "prev_value": "86400", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value of the Access-Control-Max-Age header." - } - ], - "method": "default", - "containerClass": "z-1" - }, - "CORS_DENY_REQUEST": { - "context": "multisite", - "default": "yes", - "help": "Deny request and don't send it to backend if Origin is not allowed.", - "id": "cors-deny-request", - "label": "Deny request", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "Deny request", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Deny request and don't send it to backend if Origin is not allowed." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "clientcache", - "stream": "no", - "name": "Client cache", - "description": "Manage caching for clients.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "USE_CLIENT_CACHE": { - "context": "multisite", - "default": "no", - "help": "Tell client to store locally static files.", - "id": "use-client-cache", - "label": "Use client cache", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": true, - "value": "yes", - "name": "Use client cache", - "prev_value": "no", - "popovers": [ - { - "iconName": "trespass", - "text": "inp_popover_method_disabled" - }, - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Tell client to store locally static files." - } - ], - "method": "scheduler", - "containerClass": "z-2" - }, - "CLIENT_CACHE_ETAG": { - "context": "multisite", - "default": "yes", - "help": "Send the HTTP ETag header for static resources.", - "id": "client-cache-etag", - "label": "ETag", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "ETag", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Send the HTTP ETag header for static resources." - } - ], - "method": "default", - "containerClass": "z-1" - }, - "CLIENT_CACHE_CONTROL": { - "context": "multisite", - "default": "public, max-age=15552000", - "help": "Value of the Cache-Control HTTP header.", - "id": "client-cache-control", - "label": "Cache-Control header", - "regex": "^(?!(, ?| ))((, )?(((max-age|s-maxage|stale-while-revalidate|stale-if-error)=\\d+(?!.*\\6))|((?!.*public)private|(?!.*private)public)|(must|proxy)-revalidate|must-understand|immutable|no-(cache|store|transform))(?!.*\\4))+$", - "type": "text", - "pattern": "^(?!(, ?| ))((, )?(((max-age|s-maxage|stale-while-revalidate|stale-if-error)=\\d+(?!.*\\6))|((?!.*public)private|(?!.*private)public)|(must|proxy)-revalidate|must-understand|immutable|no-(cache|store|transform))(?!.*\\4))+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "public, max-age=15552000", - "name": "Cache-Control header", - "prev_value": "public, max-age=15552000", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value of the Cache-Control HTTP header." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "country", - "stream": "yes", - "name": "Country", - "description": "Deny access based on the country of the client IP.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": true, - "settings": { - "BLACKLIST_COUNTRY": { - "context": "multisite", - "default": "", - "help": "Deny access if the country of the client is in the list (ISO 3166-1 alpha-2 format separated with spaces).", - "id": "country-blacklist", - "label": "Country blacklist", - "regex": "^(?! )( *([A-Z]{2})(?!.*\\2) *)*$", - "type": "text", - "pattern": "^(?! )( *([A-Z]{2})(?!.*\\2) *)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Country blacklist", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Deny access if the country of the client is in the list (ISO 3166-1 alpha-2 format separated with spaces)." - } - ], - "method": "default", - "containerClass": "z-1" - }, - "WHITELIST_COUNTRY": { - "context": "multisite", - "default": "", - "help": "Deny access if the country of the client is not in the list (ISO 3166-1 alpha-2 format separated with spaces).", - "id": "country-whitelist", - "label": "Country whitelist", - "regex": "^(?! )( *([A-Z]{2})(?!.*\\2) *)*$", - "type": "text", - "pattern": "^(?! )( *([A-Z]{2})(?!.*\\2) *)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Country whitelist", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Deny access if the country of the client is not in the list (ISO 3166-1 alpha-2 format separated with spaces)." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "customcert", - "stream": "yes", - "name": "Custom HTTPS certificate", - "description": "Choose custom certificate for HTTPS.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "USE_CUSTOM_SSL": { - "context": "multisite", - "default": "no", - "help": "Use custom HTTPS certificate.", - "id": "use-custom-https", - "label": "Use custom certificate", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Use custom certificate", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Use custom HTTPS certificate." - } - ], - "method": "default", - "containerClass": "z-4" - }, - "CUSTOM_SSL_CERT": { - "context": "multisite", - "default": "", - "help": "Full path of the certificate or bundle file (must be readable by the scheduler).", - "id": "custom-https-cert", - "label": "Certificate path", - "regex": "^(/[\\w. \\-]+)*/?$", - "type": "text", - "pattern": "^(/[\\w. \\-]+)*/?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Certificate path", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Full path of the certificate or bundle file (must be readable by the scheduler)." - } - ], - "method": "default", - "containerClass": "z-3" - }, - "CUSTOM_SSL_KEY": { - "context": "multisite", - "default": "", - "help": "Full path of the key file (must be readable by the scheduler).", - "id": "custom-https-key", - "label": "Key path", - "regex": "^(/[\\w. \\-]+)*/?$", - "type": "text", - "pattern": "^(/[\\w. \\-]+)*/?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Key path", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Full path of the key file (must be readable by the scheduler)." - } - ], - "method": "default", - "containerClass": "z-2" - }, - "CUSTOM_SSL_CERT_DATA": { - "context": "multisite", - "default": "", - "help": "Certificate data encoded in base64.", - "id": "custom-https-cert-data", - "label": "Certificate data (base64)", - "regex": "^.*$", - "type": "text", - "pattern": "^.*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Certificate data (base64)", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Certificate data encoded in base64." - } - ], - "method": "default", - "containerClass": "z-1" - }, - "CUSTOM_SSL_KEY_DATA": { - "context": "multisite", - "default": "", - "help": "Key data encoded in base64.", - "id": "custom-https-key-data", - "label": "Key data (base64)", - "regex": "^.*$", - "type": "text", - "pattern": "^.*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Key data (base64)", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Key data encoded in base64." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "dnsbl", - "stream": "yes", - "name": "DNSBL", - "description": "Deny access based on external DNSBL servers.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": true, - "settings": { - "USE_DNSBL": { - "context": "multisite", - "default": "yes", - "help": "Activate DNSBL feature.", - "id": "use-dnsbl", - "label": "Activate DNSBL", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "Activate DNSBL", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Activate DNSBL feature." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "errors", - "stream": "no", - "name": "Errors", - "description": "Manage default error pages", - "version": "1.0", - "type": "core", - "method": "manual", - "page": true, - "settings": { - "ERRORS": { - "context": "multisite", - "default": "", - "help": "List of HTTP error code and corresponding error pages, separated with spaces (404=/my404.html 403=/errors/403.html ...).", - "id": "errors", - "label": "Errors", - "regex": "^(?! )( ?([1-5]\\d{2})(?!.*\\2(?![^=]))=(\\/[\\w\\].~:\\/?#\\[@!$\\&'\\(\\)*+,;=\\-]*)(?!.*\\3(?!.)))*$", - "type": "text", - "pattern": "^(?! )( ?([1-5]\\d{2})(?!.*\\2(?![^=]))=(\\/[\\w\\].~:\\/?#\\[@!$\\&'\\(\\)*+,;=\\-]*)(?!.*\\3(?!.)))*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Errors", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of HTTP error code and corresponding error pages, separated with spaces (404=/my404.html 403=/errors/403.html ...)." - } - ], - "method": "default", - "containerClass": "z-1" - }, - "INTERCEPTED_ERROR_CODES": { - "context": "multisite", - "default": "400 401 403 404 405 413 429 500 501 502 503 504", - "help": "List of HTTP error code intercepted by BunkerWeb", - "id": "intercepted-error-codes", - "label": "Intercepted error codes", - "regex": "^( *([1-5]\\d{2})(?!.*\\2) *)+$", - "type": "text", - "pattern": "^( *([1-5]\\d{2})(?!.*\\2) *)+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "400 401 403 404 405 413 429 500 501 502 503 504", - "name": "Intercepted error codes", - "prev_value": "400 401 403 404 405 413 429 500 501 502 503 504", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of HTTP error code intercepted by BunkerWeb" - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "greylist", - "stream": "partial", - "name": "Greylist", - "description": "Allow access while keeping security features based on internal and external IP/network/rDNS/ASN greylists.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": true, - "settings": { - "USE_GREYLIST": { - "context": "multisite", - "default": "no", - "help": "Activate greylist feature.", - "id": "use-greylist", - "label": "Activate greylisting", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Activate greylisting", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Activate greylist feature." - } - ], - "method": "default", - "containerClass": "z-6" - }, - "GREYLIST_IP": { - "context": "multisite", - "default": "", - "help": "List of IP/network, separated with spaces, to put into the greylist.", - "id": "greylist-ip", - "label": "Greylist IP/network", - "regex": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "type": "text", - "pattern": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Greylist IP/network", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of IP/network, separated with spaces, to put into the greylist." - } - ], - "method": "default", - "containerClass": "z-5" - }, - "GREYLIST_RDNS": { - "context": "multisite", - "default": "", - "help": "List of reverse DNS suffixes, separated with spaces, to put into the greylist.", - "id": "greylist-rdns", - "label": "Greylist reverse DNS", - "regex": "^( *(([^ ]+)(?!.*\\3( |$))) *)*$", - "type": "text", - "pattern": "^( *(([^ ]+)(?!.*\\3( |$))) *)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Greylist reverse DNS", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of reverse DNS suffixes, separated with spaces, to put into the greylist." - } - ], - "method": "default", - "containerClass": "z-4" - }, - "GREYLIST_RDNS_GLOBAL": { - "context": "multisite", - "default": "yes", - "help": "Only perform RDNS greylist checks on global IP addresses.", - "id": "greylist-rdns-global", - "label": "Greylist reverse DNS global IPs", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "Greylist reverse DNS global IPs", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Only perform RDNS greylist checks on global IP addresses." - } - ], - "method": "default", - "containerClass": "z-3" - }, - "GREYLIST_ASN": { - "context": "multisite", - "default": "", - "help": "List of ASN numbers, separated with spaces, to put into the greylist.", - "id": "greylist-asn", - "label": "Greylist ASN", - "regex": "^^( *((ASN?)?(\\d+)\\b(?!.*[SN ]\\4\\b)) *)*$", - "type": "text", - "pattern": "^^( *((ASN?)?(\\d+)\\b(?!.*[SN ]\\4\\b)) *)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Greylist ASN", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of ASN numbers, separated with spaces, to put into the greylist." - } - ], - "method": "default", - "containerClass": "z-2" - }, - "GREYLIST_USER_AGENT": { - "context": "multisite", - "default": "", - "help": "List of User-Agent (PCRE regex), separated with spaces, to put into the greylist.", - "id": "greylist-user-agent", - "label": "Greylist User-Agent", - "regex": "^.*$", - "type": "text", - "pattern": "^.*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Greylist User-Agent", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of User-Agent (PCRE regex), separated with spaces, to put into the greylist." - } - ], - "method": "default", - "containerClass": "z-1" - }, - "GREYLIST_URI": { - "context": "multisite", - "default": "", - "help": "List of URI (PCRE regex), separated with spaces, to put into the greylist.", - "id": "greylist-uri", - "label": "Greylist URI", - "regex": "^.*$", - "type": "text", - "pattern": "^.*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Greylist URI", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of URI (PCRE regex), separated with spaces, to put into the greylist." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "gzip", - "stream": "no", - "name": "Gzip", - "description": "Compress HTTP requests with the gzip algorithm.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "USE_GZIP": { - "context": "multisite", - "default": "no", - "help": "Use gzip", - "id": "use-gzip", - "label": "Use gzip", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": true, - "value": "yes", - "name": "Use gzip", - "prev_value": "no", - "popovers": [ - { - "iconName": "trespass", - "text": "inp_popover_method_disabled" - }, - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Use gzip" - } - ], - "method": "scheduler", - "containerClass": "z-4" - }, - "GZIP_TYPES": { - "context": "multisite", - "default": "application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml", - "help": "List of MIME types that will be compressed with gzip.", - "id": "gzip-types", - "label": "MIME types", - "regex": "^(?! )( ?([\\-\\w.]+/[\\-\\w.+]+)(?!.*\\2(?!.)))+$", - "type": "text", - "pattern": "^(?! )( ?([\\-\\w.]+/[\\-\\w.+]+)(?!.*\\2(?!.)))+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml", - "name": "MIME types", - "prev_value": "application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of MIME types that will be compressed with gzip." - } - ], - "method": "default", - "containerClass": "z-3" - }, - "GZIP_MIN_LENGTH": { - "context": "multisite", - "default": "1000", - "help": "Minimum length for gzip compression.", - "id": "gzip-min-length", - "label": "Minimum length", - "regex": "^\\d+$", - "type": "text", - "pattern": "^\\d+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "1000", - "name": "Minimum length", - "prev_value": "1000", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Minimum length for gzip compression." - } - ], - "method": "default", - "containerClass": "z-2" - }, - "GZIP_COMP_LEVEL": { - "context": "multisite", - "default": "5", - "help": "The compression level of the gzip algorithm.", - "id": "gzip-comp-level", - "label": "Compression level", - "regex": "^[1-9]$", - "type": "select", - "pattern": "^[1-9]$", - "inpType": "select", - "values": ["1", "2", "3", "4", "5", "6", "7", "8", "9"], - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "5", - "name": "Compression level", - "prev_value": "5", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "The compression level of the gzip algorithm." - } - ], - "method": "default", - "containerClass": "z-1" - }, - "GZIP_PROXIED": { - "context": "multisite", - "default": "no-cache no-store private expired auth", - "help": "Which kind of proxied requests we should compress.", - "id": "gzip-proxied", - "label": "Proxied requests", - "regex": "^.*$", - "type": "text", - "pattern": "^.*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no-cache no-store private expired auth", - "name": "Proxied requests", - "prev_value": "no-cache no-store private expired auth", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Which kind of proxied requests we should compress." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "inject", - "stream": "no", - "name": "HTML injection", - "description": "Inject custom HTML code before the tag.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "INJECT_BODY": { - "context": "multisite", - "default": "", - "help": "The HTML code to inject.", - "id": "inject-body", - "label": "HTML code", - "regex": "^.*$", - "type": "text", - "pattern": "^.*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "HTML code", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "The HTML code to inject." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "headers", - "stream": "no", - "name": "Headers", - "description": "Manage HTTP headers sent to clients.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "REMOVE_HEADERS": { - "context": "multisite", - "default": "Server Expect-CT X-Powered-By X-AspNet-Version X-AspNetMvc-Version", - "help": "Headers to remove (Header1 Header2 Header3 ...)", - "id": "remove-headers", - "label": "Remove headers", - "regex": "^(?! )( ?[\\w\\-]+)*$", - "type": "text", - "pattern": "^(?! )( ?[\\w\\-]+)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "Server Expect-CT X-Powered-By X-AspNet-Version X-AspNetMvc-Version Public-Key-Pins", - "name": "Remove headers", - "prev_value": "Server Expect-CT X-Powered-By X-AspNet-Version X-AspNetMvc-Version", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Headers to remove (Header1 Header2 Header3 ...)" - } - ], - "method": "default", - "containerClass": "z-12" - }, - "KEEP_UPSTREAM_HEADERS": { - "context": "multisite", - "default": "Content-Security-Policy Permissions-Policy Feature-Policy X-Frame-Options", - "help": "Headers to keep from upstream (Header1 Header2 Header3 ... or * for all).", - "id": "keep-upstream-headers", - "label": "Keep upstream headers", - "regex": "^((?! )( ?[\\w\\-]+)+|\\*)?$", - "type": "text", - "pattern": "^((?! )( ?[\\w\\-]+)+|\\*)?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "Content-Security-Policy Permissions-Policy X-Frame-Options", - "name": "Keep upstream headers", - "prev_value": "Content-Security-Policy Permissions-Policy Feature-Policy X-Frame-Options", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Headers to keep from upstream (Header1 Header2 Header3 ... or * for all)." - } - ], - "method": "default", - "containerClass": "z-11" - }, - "STRICT_TRANSPORT_SECURITY": { - "context": "multisite", - "default": "max-age=31536000", - "help": "Value for the Strict-Transport-Security header.", - "id": "strict-transport-security", - "label": "Strict-Transport-Security", - "regex": "^max-age=\\d+(; includeSubDomains(; preload)?)?$", - "type": "text", - "pattern": "^max-age=\\d+(; includeSubDomains(; preload)?)?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "max-age=31536000; includeSubDomains; preload", - "name": "Strict-Transport-Security", - "prev_value": "max-age=31536000", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value for the Strict-Transport-Security header." - } - ], - "method": "default", - "containerClass": "z-10" - }, - "COOKIE_AUTO_SECURE_FLAG": { - "context": "multisite", - "default": "yes", - "help": "Automatically add the Secure flag to all cookies.", - "id": "cookie-auto-secure-flag", - "label": "Cookie auto Secure flag", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "Cookie auto Secure flag", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Automatically add the Secure flag to all cookies." - } - ], - "method": "default", - "containerClass": "z-8" - }, - "CONTENT_SECURITY_POLICY": { - "context": "multisite", - "default": "object-src 'none'; form-action 'self'; frame-ancestors 'self';", - "help": "Value for the Content-Security-Policy header.", - "id": "content-security-policy", - "label": "Content-Security-Policy", - "regex": "^.*$", - "type": "text", - "pattern": "^.*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "object-src 'none'; form-action 'self'; frame-ancestors 'self';", - "name": "Content-Security-Policy", - "prev_value": "object-src 'none'; form-action 'self'; frame-ancestors 'self';", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value for the Content-Security-Policy header." - } - ], - "method": "default", - "containerClass": "z-7" - }, - "CONTENT_SECURITY_POLICY_REPORT_ONLY": { - "context": "multisite", - "default": "no", - "help": "Send reports for violations of the Content-Security-Policy header instead of blocking them.", - "id": "content-security-policy-report-only", - "label": "Content-Security-Policy-Report-Only", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Content-Security-Policy-Report-Only", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Send reports for violations of the Content-Security-Policy header instead of blocking them." - } - ], - "method": "default", - "containerClass": "z-6" - }, - "REFERRER_POLICY": { - "context": "multisite", - "default": "strict-origin-when-cross-origin", - "help": "Value for the Referrer-Policy header.", - "id": "referrer-policy", - "label": "Referrer-Policy", - "regex": "^(?!^(,| ))((, )?(no-referrer-when-downgrade|no-referrer|origin-when-cross-origin|same-origin|strict-origin-when-cross-origin|strict-origin|origin|unsafe-url)(?!\\b.*, \\4\\b))*$", - "type": "text", - "pattern": "^(?!^(,| ))((, )?(no-referrer-when-downgrade|no-referrer|origin-when-cross-origin|same-origin|strict-origin-when-cross-origin|strict-origin|origin|unsafe-url)(?!\\b.*, \\4\\b))*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "strict-origin-when-cross-origin", - "name": "Referrer-Policy", - "prev_value": "strict-origin-when-cross-origin", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value for the Referrer-Policy header." - } - ], - "method": "default", - "containerClass": "z-5" - }, - "PERMISSIONS_POLICY": { - "context": "multisite", - "default": "accelerometer=(), ambient-light-sensor=(), autoplay=(), battery=(), camera=(), cross-origin-isolated=(), display-capture=(), document-domain=(), encrypted-media=(), execution-while-not-rendered=(), execution-while-out-of-viewport=(), fullscreen=(), geolocation=(), gyroscope=(), hid=(), idle-detection=(), magnetometer=(), microphone=(), midi=(), navigation-override=(), payment=(), picture-in-picture=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), usb=(), web-share=(), xr-spatial-tracking=()", - "help": "Value for the Permissions-Policy header.", - "id": "permissions-policy", - "label": "Permissions-Policy", - "regex": "^(?![, ])(,? ?([a-z\\-]+)(?!.*[^\\-]\\2=)=(\\*|\\(( ?(self|\\u0022https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*\\u0022)(?=[ \\)]))*\\)))*$", - "type": "text", - "pattern": "^(?![, ])(,? ?([a-z\\-]+)(?!.*[^\\-]\\2=)=(\\*|\\(( ?(self|\\u0022https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*\\u0022)(?=[ \\)]))*\\)))*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), battery=(), bluetooth=(), browsing-topics=(), camera=(), compute-pressure=(), display-capture=(), document-domain=(), encrypted-media=(), execution-while-not-rendered=(), execution-while-out-of-viewport=(), fullscreen=(), gamepad=(), geolocation=(), gyroscope=(), hid=(), identity-credentials-get=(), idle-detection=(), local-fonts=(), magnetometer=(), microphone=(), midi=(), otp-credentials=(), payment=(), picture-in-picture=(), publickey-credentials-create=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), speaker-selection=(), storage-access=(), usb=(), web-share=(), window-management=(), xr-spatial-tracking=()", - "name": "Permissions-Policy", - "prev_value": "accelerometer=(), ambient-light-sensor=(), autoplay=(), battery=(), camera=(), cross-origin-isolated=(), display-capture=(), document-domain=(), encrypted-media=(), execution-while-not-rendered=(), execution-while-out-of-viewport=(), fullscreen=(), geolocation=(), gyroscope=(), hid=(), idle-detection=(), magnetometer=(), microphone=(), midi=(), navigation-override=(), payment=(), picture-in-picture=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), usb=(), web-share=(), xr-spatial-tracking=()", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value for the Permissions-Policy header." - } - ], - "method": "default", - "containerClass": "z-4" - }, - "FEATURE_POLICY": { - "context": "multisite", - "default": "accelerometer 'none'; ambient-light-sensor 'none'; autoplay 'none'; battery 'none'; camera 'none'; display-capture 'none'; document-domain 'none'; encrypted-media 'none'; execution-while-not-rendered 'none'; execution-while-out-of-viewport 'none'; fullscreen 'none'; geolocation 'none'; gyroscope 'none'; layout-animation 'none'; legacy-image-formats 'none'; magnetometer 'none'; microphone 'none'; midi 'none'; navigation-override 'none'; payment 'none'; picture-in-picture 'none'; publickey-credentials-get 'none'; speaker-selection 'none'; sync-xhr 'none'; unoptimized-images 'none'; unsized-media 'none'; usb 'none'; screen-wake-lock 'none'; web-share 'none'; xr-spatial-tracking 'none';", - "help": "Value for the Feature-Policy header.", - "id": "feature-policy", - "label": "Feature-Policy", - "regex": "^(?![; ])( ?([\\w\\-]+)(?!.*[^\\-]\\2 )( ('(none|self|strict-dynamic|report-sample|unsafe-inline|unsafe-eval|unsafe-hashes|unsafe-allow-redirects)'|https?:\\/\\/[\\w@:%.+~#=\\-]+[\\w\\(\\)!@:%+.~#?&\\/=$\\-]*))+;)*$", - "type": "text", - "pattern": "^(?![; ])( ?([\\w\\-]+)(?!.*[^\\-]\\2 )( ('(none|self|strict-dynamic|report-sample|unsafe-inline|unsafe-eval|unsafe-hashes|unsafe-allow-redirects)'|https?:\\/\\/[\\w@:%.+~#=\\-]+[\\w\\(\\)!@:%+.~#?&\\/=$\\-]*))+;)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "accelerometer 'none'; ambient-light-sensor 'none'; autoplay 'none'; battery 'none'; camera 'none'; display-capture 'none'; document-domain 'none'; encrypted-media 'none'; execution-while-not-rendered 'none'; execution-while-out-of-viewport 'none'; fullscreen 'none'; geolocation 'none'; gyroscope 'none'; layout-animation 'none'; legacy-image-formats 'none'; magnetometer 'none'; microphone 'none'; midi 'none'; navigation-override 'none'; payment 'none'; picture-in-picture 'none'; publickey-credentials-get 'none'; speaker-selection 'none'; sync-xhr 'none'; unoptimized-images 'none'; unsized-media 'none'; usb 'none'; screen-wake-lock 'none'; web-share 'none'; xr-spatial-tracking 'none';", - "name": "Feature-Policy", - "prev_value": "accelerometer 'none'; ambient-light-sensor 'none'; autoplay 'none'; battery 'none'; camera 'none'; display-capture 'none'; document-domain 'none'; encrypted-media 'none'; execution-while-not-rendered 'none'; execution-while-out-of-viewport 'none'; fullscreen 'none'; geolocation 'none'; gyroscope 'none'; layout-animation 'none'; legacy-image-formats 'none'; magnetometer 'none'; microphone 'none'; midi 'none'; navigation-override 'none'; payment 'none'; picture-in-picture 'none'; publickey-credentials-get 'none'; speaker-selection 'none'; sync-xhr 'none'; unoptimized-images 'none'; unsized-media 'none'; usb 'none'; screen-wake-lock 'none'; web-share 'none'; xr-spatial-tracking 'none';", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value for the Feature-Policy header." - } - ], - "method": "ui", - "containerClass": "z-3" - }, - "X_FRAME_OPTIONS": { - "context": "multisite", - "default": "SAMEORIGIN", - "help": "Value for the X-Frame-Options header.", - "id": "x-frame-options", - "label": "X-Frame-Options", - "regex": "^(DENY|SAMEORIGIN)?$", - "type": "select", - "pattern": "^(DENY|SAMEORIGIN)?$", - "inpType": "select", - "values": ["", "DENY", "SAMEORIGIN"], - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "SAMEORIGIN", - "name": "X-Frame-Options", - "prev_value": "SAMEORIGIN", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value for the X-Frame-Options header." - } - ], - "method": "default", - "containerClass": "z-2" - }, - "X_CONTENT_TYPE_OPTIONS": { - "context": "multisite", - "default": "nosniff", - "help": "Value for the X-Content-Type-Options header.", - "id": "x-content-type-options", - "label": "X-Content-Type-Options", - "regex": "^(nosniff)?$", - "type": "select", - "pattern": "^(nosniff)?$", - "inpType": "select", - "values": ["", "nosniff"], - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "nosniff", - "name": "X-Content-Type-Options", - "prev_value": "nosniff", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value for the X-Content-Type-Options header." - } - ], - "method": "default", - "containerClass": "z-1" - }, - "X_XSS_PROTECTION": { - "context": "multisite", - "default": "1; mode=block", - "help": "Value for the X-XSS-Protection header.", - "id": "x-xss-protection", - "label": "X-XSS-Protection", - "regex": "^0|1(; (mode=block|report=https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*))?$", - "type": "text", - "pattern": "^0|1(; (mode=block|report=https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*))?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "1; mode=block", - "name": "X-XSS-Protection", - "prev_value": "1; mode=block", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value for the X-XSS-Protection header." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null, - "multiples_schema": { - "custom-headers": { - "CUSTOM_HEADER": { - "context": "multisite", - "default": "", - "help": "Custom header to add (HeaderName: HeaderValue).", - "id": "custom-header", - "label": "Custom header (HeaderName: HeaderValue)", - "regex": "^([\\w\\-]+: .+)?$", - "type": "text", - "multiple": "custom-headers", - "pattern": "^([\\w\\-]+: .+)?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Custom header (HeaderName: HeaderValue)", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Custom header to add (HeaderName: HeaderValue)." - } - ], - "containerClass": "z-13" - } - }, - "cookie-flags": { - "COOKIE_FLAGS": { - "context": "multisite", - "default": "* HttpOnly SameSite=Lax", - "help": "Cookie flags automatically added to all cookies (value accepted for nginx_cookie_flag_module).", - "id": "cookie-flags", - "label": "Cookie flags", - "regex": "^(\\*|[^;]+)( (HttpOnly|(SameSite)(?!.*\\4)(=(Lax|Strict))?)(?!.*\\3))*$", - "type": "text", - "multiple": "cookie-flags", - "pattern": "^(\\*|[^;]+)( (HttpOnly|(SameSite)(?!.*\\4)(=(Lax|Strict))?)(?!.*\\3))*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "* HttpOnly SameSite=Lax", - "name": "Cookie flags", - "prev_value": "* HttpOnly SameSite=Lax", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Cookie flags automatically added to all cookies (value accepted for nginx_cookie_flag_module)." - } - ], - "containerClass": "z-12" - } - } - }, - "multiples": { - "custom-headers": { - "0": { - "CUSTOM_HEADER": { - "context": "multisite", - "default": "", - "help": "Custom header to add (HeaderName: HeaderValue).", - "id": "custom-header", - "label": "Custom header (HeaderName: HeaderValue)", - "regex": "^([\\w\\-]+: .+)?$", - "type": "text", - "multiple": "custom-headers", - "pattern": "^([\\w\\-]+: .+)?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Custom header (HeaderName: HeaderValue)", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Custom header to add (HeaderName: HeaderValue)." - } - ], - "containerClass": "z-13", - "method": "default" - } - }, - "2": { - "CUSTOM_HEADER_2": { - "context": "multisite", - "default": "", - "help": "Custom header to add (HeaderName: HeaderValue).", - "id": "custom-header-2", - "label": "Custom header (HeaderName: HeaderValue)", - "regex": "^([\\w\\-]+: .+)?$", - "type": "text", - "multiple": "custom-headers", - "pattern": "^([\\w\\-]+: .+)?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "dzdz", - "name": "Custom header (HeaderName: HeaderValue)", - "prev_value": "dzdz", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Custom header to add (HeaderName: HeaderValue)." - } - ], - "containerClass": "z-13", - "method": "default" - } - } - }, - "cookie-flags": { - "0": { - "COOKIE_FLAGS": { - "context": "multisite", - "default": "* HttpOnly SameSite=Lax", - "help": "Cookie flags automatically added to all cookies (value accepted for nginx_cookie_flag_module).", - "id": "cookie-flags", - "label": "Cookie flags", - "regex": "^(\\*|[^;]+)( (HttpOnly|(SameSite)(?!.*\\4)(=(Lax|Strict))?)(?!.*\\3))*$", - "type": "text", - "multiple": "cookie-flags", - "pattern": "^(\\*|[^;]+)( (HttpOnly|(SameSite)(?!.*\\4)(=(Lax|Strict))?)(?!.*\\3))*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "* HttpOnly SameSite=Lax", - "name": "Cookie flags", - "prev_value": "* HttpOnly SameSite=Lax", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Cookie flags automatically added to all cookies (value accepted for nginx_cookie_flag_module)." - } - ], - "containerClass": "z-12", - "method": "default" - } - } - } - } - }, - { - "id": "letsencrypt", - "stream": "yes", - "name": "Let's Encrypt", - "description": "Automatic creation, renewal and configuration of Let's Encrypt certificates.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "AUTO_LETS_ENCRYPT": { - "context": "multisite", - "default": "no", - "help": "Activate automatic Let's Encrypt mode.", - "id": "auto-lets-encrypt", - "label": "Automatic Let's Encrypt", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Automatic Let's Encrypt", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Activate automatic Let's Encrypt mode." - } - ], - "method": "default", - "containerClass": "z-2" - }, - "EMAIL_LETS_ENCRYPT": { - "context": "multisite", - "default": "", - "help": "Email used for Let's Encrypt notification and in certificate.", - "id": "email-lets-encrypt", - "label": "Email Let's Encrypt", - "regex": "^([^@ \\t\\r\\n]+@[^@ \\t\\r\\n]+\\.[^@ \\t\\r\\n]+)?$", - "type": "text", - "pattern": "^([^@ \\t\\r\\n]+@[^@ \\t\\r\\n]+\\.[^@ \\t\\r\\n]+)?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Email Let's Encrypt", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Email used for Let's Encrypt notification and in certificate." - } - ], - "method": "default", - "containerClass": "z-1" - }, - "USE_LETS_ENCRYPT_STAGING": { - "context": "multisite", - "default": "no", - "help": "Use the staging environment for Let\u2019s Encrypt certificate generation. Useful when you are testing your deployments to avoid being rate limited in the production environment.", - "id": "use-lets-encrypt-staging", - "label": "Use Let's Encrypt Staging", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Use Let's Encrypt Staging", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Use the staging environment for Let\u2019s Encrypt certificate generation. Useful when you are testing your deployments to avoid being rate limited in the production environment." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "limit", - "stream": "partial", - "name": "Limit", - "description": "Limit maximum number of requests and connections.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": true, - "settings": { - "USE_LIMIT_REQ": { - "context": "multisite", - "default": "yes", - "help": "Activate limit requests feature.", - "id": "use-limit-req", - "label": "Activate limit requests", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "Activate limit requests", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Activate limit requests feature." - } - ], - "method": "default", - "containerClass": "z-6" - }, - "USE_LIMIT_CONN": { - "context": "multisite", - "default": "yes", - "help": "Activate limit connections feature.", - "id": "use-limit-conn", - "label": "Activate limit connections", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "Activate limit connections", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Activate limit connections feature." - } - ], - "method": "default", - "containerClass": "z-3" - }, - "LIMIT_CONN_MAX_HTTP1": { - "context": "multisite", - "default": "10", - "help": "Maximum number of connections per IP when using HTTP/1.X protocol.", - "id": "limit-conn-max-http1", - "label": "Maximum number of HTTP/1.X connections", - "regex": "^\\d+$", - "type": "text", - "pattern": "^\\d+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "10", - "name": "Maximum number of HTTP/1.X connections", - "prev_value": "10", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Maximum number of connections per IP when using HTTP/1.X protocol." - } - ], - "method": "default", - "containerClass": "z-2" - }, - "LIMIT_CONN_MAX_HTTP2": { - "context": "multisite", - "default": "100", - "help": "Maximum number of streams per IP when using HTTP/2 protocol.", - "id": "limit-conn-max-http2", - "label": "Maximum number of HTTP/2 streams", - "regex": "^\\d+$", - "type": "text", - "pattern": "^\\d+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "100", - "name": "Maximum number of HTTP/2 streams", - "prev_value": "100", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Maximum number of streams per IP when using HTTP/2 protocol." - } - ], - "method": "default", - "containerClass": "z-1" - }, - "LIMIT_CONN_MAX_STREAM": { - "context": "multisite", - "default": "10", - "help": "Maximum number of connections per IP when using stream.", - "id": "limit-conn-max-stream", - "label": "Maximum number of stream connections", - "regex": "^\\d+$", - "type": "text", - "pattern": "^\\d+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "10", - "name": "Maximum number of stream connections", - "prev_value": "10", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Maximum number of connections per IP when using stream." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null, - "multiples_schema": { - "limit-req": { - "LIMIT_REQ_URL": { - "context": "multisite", - "default": "/", - "help": "URL (PCRE regex) where the limit request will be applied or special value / for all requests.", - "id": "limit-req-url", - "label": "Limit request URL", - "regex": "^.+$", - "type": "text", - "multiple": "limit-req", - "pattern": "^.+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "/", - "name": "Limit request URL", - "prev_value": "/", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "URL (PCRE regex) where the limit request will be applied or special value / for all requests." - } - ], - "containerClass": "z-6" - }, - "LIMIT_REQ_RATE": { - "context": "multisite", - "default": "2r/s", - "help": "Rate to apply to the URL (s for second, m for minute, h for hour and d for day).", - "id": "limit-req-rate", - "label": "Limit request Rate", - "regex": "^\\d+r/[smhd]$", - "type": "text", - "multiple": "limit-req", - "pattern": "^\\d+r/[smhd]$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "2r/s", - "name": "Limit request Rate", - "prev_value": "2r/s", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Rate to apply to the URL (s for second, m for minute, h for hour and d for day)." - } - ], - "containerClass": "z-5" - } - } - }, - "multiples": { - "limit-req": { - "0": { - "LIMIT_REQ_URL": { - "context": "multisite", - "default": "/", - "help": "URL (PCRE regex) where the limit request will be applied or special value / for all requests.", - "id": "limit-req-url", - "label": "Limit request URL", - "regex": "^.+$", - "type": "text", - "multiple": "limit-req", - "pattern": "^.+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "/", - "name": "Limit request URL", - "prev_value": "/", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "URL (PCRE regex) where the limit request will be applied or special value / for all requests." - } - ], - "containerClass": "z-6", - "method": "default" - }, - "LIMIT_REQ_RATE": { - "context": "multisite", - "default": "2r/s", - "help": "Rate to apply to the URL (s for second, m for minute, h for hour and d for day).", - "id": "limit-req-rate", - "label": "Limit request Rate", - "regex": "^\\d+r/[smhd]$", - "type": "text", - "multiple": "limit-req", - "pattern": "^\\d+r/[smhd]$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "2r/s", - "name": "Limit request Rate", - "prev_value": "2r/s", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Rate to apply to the URL (s for second, m for minute, h for hour and d for day)." - } - ], - "containerClass": "z-5", - "method": "default" - } - } - } - } - }, - { - "id": "metrics", - "stream": "partial", - "name": "Metrics", - "description": "Metrics collection and retrieve.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "USE_METRICS": { - "context": "multisite", - "default": "yes", - "help": "Enable collection and retrieval of internal metrics.", - "id": "use-metrics", - "label": "Use metrics", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "Use metrics", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable collection and retrieval of internal metrics." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "misc", - "stream": "partial", - "name": "Miscellaneous", - "description": "Miscellaneous settings.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": true, - "settings": { - "REDIRECT_HTTP_TO_HTTPS": { - "context": "multisite", - "default": "no", - "help": "Redirect all HTTP request to HTTPS.", - "id": "redirect-http-to-https", - "label": "Redirect HTTP to HTTPS", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Redirect HTTP to HTTPS", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Redirect all HTTP request to HTTPS." - } - ], - "method": "default", - "containerClass": "z-15" - }, - "AUTO_REDIRECT_HTTP_TO_HTTPS": { - "context": "multisite", - "default": "yes", - "help": "Try to detect if HTTPS is used and activate HTTP to HTTPS redirection if that's the case.", - "id": "auto-redirect-http-to-https", - "label": "Auto redirect HTTP to HTTPS", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "Auto redirect HTTP to HTTPS", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Try to detect if HTTPS is used and activate HTTP to HTTPS redirection if that's the case." - } - ], - "method": "default", - "containerClass": "z-14" - }, - "ALLOWED_METHODS": { - "context": "multisite", - "default": "GET|POST|HEAD", - "help": "Allowed HTTP and WebDAV methods, separated with pipes to be sent by clients.", - "id": "allowed-methods", - "label": "Allowed methods", - "regex": "^(?!\\|)(\\|?([A-Z]{3,})(?!.*(^|\\|)\\2))+$", - "type": "text", - "pattern": "^(?!\\|)(\\|?([A-Z]{3,})(?!.*(^|\\|)\\2))+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "GET|POST|HEAD", - "name": "Allowed methods", - "prev_value": "GET|POST|HEAD", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Allowed HTTP and WebDAV methods, separated with pipes to be sent by clients." - } - ], - "method": "default", - "containerClass": "z-13" - }, - "MAX_CLIENT_SIZE": { - "context": "multisite", - "default": "10m", - "help": "Maximum body size (0 for infinite).", - "id": "max-client-size", - "label": "Maximum body size", - "regex": "^\\d+[kKmMgG]?$", - "type": "text", - "pattern": "^\\d+[kKmMgG]?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "10m", - "name": "Maximum body size", - "prev_value": "10m", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Maximum body size (0 for infinite)." - } - ], - "method": "default", - "containerClass": "z-12" - }, - "SERVE_FILES": { - "context": "multisite", - "default": "yes", - "help": "Serve files from the local folder.", - "id": "serve-files", - "label": "Serve files", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": true, - "value": "no", - "name": "Serve files", - "prev_value": "yes", - "popovers": [ - { - "iconName": "trespass", - "text": "inp_popover_method_disabled" - }, - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Serve files from the local folder." - } - ], - "method": "scheduler", - "containerClass": "z-11" - }, - "ROOT_FOLDER": { - "context": "multisite", - "default": "", - "help": "Root folder containing files to serve (/var/www/html/{server_name} if unset).", - "id": "root-folder", - "label": "Root folder", - "regex": "^(/[\\w. \\-]+)*/?$", - "type": "text", - "pattern": "^(/[\\w. \\-]+)*/?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Root folder", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Root folder containing files to serve (/var/www/html/{server_name} if unset)." - } - ], - "method": "default", - "containerClass": "z-10" - }, - "SSL_PROTOCOLS": { - "context": "multisite", - "default": "TLSv1.2 TLSv1.3", - "help": "The supported version of TLS. We recommend the default value TLSv1.2 TLSv1.3 for compatibility reasons.", - "id": "https-protocols", - "label": "HTTPS protocols", - "regex": "^(?! )( ?TLSv1\\.[0-3])*$", - "type": "text", - "pattern": "^(?! )( ?TLSv1\\.[0-3])*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "TLSv1.2 TLSv1.3", - "name": "HTTPS protocols", - "prev_value": "TLSv1.2 TLSv1.3", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "The supported version of TLS. We recommend the default value TLSv1.2 TLSv1.3 for compatibility reasons." - } - ], - "method": "default", - "containerClass": "z-9" - }, - "HTTP2": { - "context": "multisite", - "default": "yes", - "help": "Support HTTP2 protocol when HTTPS is enabled.", - "id": "http2", - "label": "HTTP2", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "HTTP2", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Support HTTP2 protocol when HTTPS is enabled." - } - ], - "method": "default", - "containerClass": "z-8" - }, - "HTTP3": { - "context": "multisite", - "default": "no", - "help": "Support HTTP3 protocol when HTTPS is enabled.", - "id": "http3", - "label": "HTTP3", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "HTTP3", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Support HTTP3 protocol when HTTPS is enabled." - } - ], - "method": "default", - "containerClass": "z-7" - }, - "HTTP3_ALT_SVC_PORT": { - "context": "multisite", - "default": "443", - "help": "HTTP3 alternate service port. This value will be used as part of the Alt-Svc header.", - "id": "http3-alt-svc-port", - "label": "HTTP3 Alt-Svc port", - "regex": "^\\d+$", - "type": "text", - "pattern": "^\\d+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "443", - "name": "HTTP3 Alt-Svc port", - "prev_value": "443", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "HTTP3 alternate service port. This value will be used as part of the Alt-Svc header." - } - ], - "method": "default", - "containerClass": "z-6" - }, - "LISTEN_HTTP": { - "context": "multisite", - "default": "yes", - "help": "Respond to (insecure) HTTP requests.", - "id": "http-listen", - "label": "HTTP listen", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "HTTP listen", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Respond to (insecure) HTTP requests." - } - ], - "method": "default", - "containerClass": "z-5" - }, - "USE_OPEN_FILE_CACHE": { - "context": "multisite", - "default": "no", - "help": "Enable open file cache feature", - "id": "use-open-file-cache", - "label": "Use open file cache", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Use open file cache", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable open file cache feature" - } - ], - "method": "default", - "containerClass": "z-4" - }, - "OPEN_FILE_CACHE": { - "context": "multisite", - "default": "max=1000 inactive=20s", - "help": "Open file cache directive", - "id": "open-file-cache", - "label": "Use open file cache", - "regex": "^(off|max=\\d+( inactive=\\d+(ms?|[shdwMy]))?)$", - "type": "text", - "pattern": "^(off|max=\\d+( inactive=\\d+(ms?|[shdwMy]))?)$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "max=1000 inactive=20s", - "name": "Use open file cache", - "prev_value": "max=1000 inactive=20s", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Open file cache directive" - } - ], - "method": "default", - "containerClass": "z-3" - }, - "OPEN_FILE_CACHE_ERRORS": { - "context": "multisite", - "default": "yes", - "help": "Enable open file cache for errors", - "id": "open-file-cache-errors", - "label": "Open file cache errors", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "Open file cache errors", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable open file cache for errors" - } - ], - "method": "default", - "containerClass": "z-2" - }, - "OPEN_FILE_CACHE_MIN_USES": { - "context": "multisite", - "default": "2", - "help": "Enable open file cache minimum uses", - "id": "open-file-cache-min-uses", - "label": "Open file cache min uses", - "regex": "^[1-9]\\d*$", - "type": "text", - "pattern": "^[1-9]\\d*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "2", - "name": "Open file cache min uses", - "prev_value": "2", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable open file cache minimum uses" - } - ], - "method": "default", - "containerClass": "z-1" - }, - "OPEN_FILE_CACHE_VALID": { - "context": "multisite", - "default": "30s", - "help": "Open file cache valid time", - "id": "open-file-cache-valid", - "label": "Open file cache valid time", - "regex": "^\\d+(ms?|[shdwMy])$", - "type": "text", - "pattern": "^\\d+(ms?|[shdwMy])$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "30s", - "name": "Open file cache valid time", - "prev_value": "30s", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Open file cache valid time" - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "modsecurity", - "stream": "no", - "name": "ModSecurity", - "description": "Management of the ModSecurity WAF.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "USE_MODSECURITY": { - "context": "multisite", - "default": "yes", - "help": "Enable ModSecurity WAF.", - "id": "use-modsecurity", - "label": "Use ModSecurity", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "Use ModSecurity", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable ModSecurity WAF." - } - ], - "method": "default", - "containerClass": "z-5" - }, - "USE_MODSECURITY_CRS": { - "context": "multisite", - "default": "yes", - "help": "Enable OWASP Core Rule Set.", - "id": "use-modsecurity-crs", - "label": "Use Core Rule Set", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "Use Core Rule Set", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable OWASP Core Rule Set." - } - ], - "method": "default", - "containerClass": "z-4" - }, - "MODSECURITY_CRS_VERSION": { - "context": "multisite", - "default": "3", - "help": "Version of the OWASP Core Rule Set to use with ModSecurity (3, 4 or nightly).", - "id": "modsecurity-crs-version", - "label": "Core Rule Set Version", - "regex": "^(3|4|nightly)$", - "type": "select", - "pattern": "^(3|4|nightly)$", - "inpType": "select", - "values": ["3", "4", "nightly"], - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "4", - "name": "Core Rule Set Version", - "prev_value": "3", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Version of the OWASP Core Rule Set to use with ModSecurity (3, 4 or nightly)." - } - ], - "method": "default", - "containerClass": "z-3" - }, - "MODSECURITY_SEC_AUDIT_ENGINE": { - "context": "multisite", - "default": "RelevantOnly", - "help": "SecAuditEngine directive of ModSecurity.", - "id": "modsecurity-sec-audit-engine", - "label": "SecAuditEngine", - "regex": "^(On|RelevantOnly|Off)$", - "type": "select", - "pattern": "^(On|RelevantOnly|Off)$", - "inpType": "select", - "values": ["Off", "On", "RelevantOnly"], - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "RelevantOnly", - "name": "SecAuditEngine", - "prev_value": "RelevantOnly", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "SecAuditEngine directive of ModSecurity." - } - ], - "method": "default", - "containerClass": "z-2" - }, - "MODSECURITY_SEC_RULE_ENGINE": { - "context": "multisite", - "default": "On", - "help": "SecRuleEngine directive of ModSecurity.", - "id": "modsecurity-sec-rule-engine", - "label": "SecRuleEngine", - "regex": "^(On|DetectionOnly|Off)$", - "type": "select", - "pattern": "^(On|DetectionOnly|Off)$", - "inpType": "select", - "values": ["DetectionOnly", "Off", "On"], - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "On", - "name": "SecRuleEngine", - "prev_value": "On", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "SecRuleEngine directive of ModSecurity." - } - ], - "method": "default", - "containerClass": "z-1" - }, - "MODSECURITY_SEC_AUDIT_LOG_PARTS": { - "context": "multisite", - "default": "ABCFHZ", - "help": "SecAuditLogParts directive of ModSecurity.", - "id": "modsecurity-sec-audit-log-parts", - "label": "SecAuditLogParts", - "regex": "^A(([B-K])(?!.*\\2))+Z$", - "type": "text", - "pattern": "^A(([B-K])(?!.*\\2))+Z$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "ABCFHZ", - "name": "SecAuditLogParts", - "prev_value": "ABCFHZ", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "SecAuditLogParts directive of ModSecurity." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "php", - "stream": "no", - "name": "PHP", - "description": "Manage local or remote PHP-FPM.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "REMOTE_PHP": { - "context": "multisite", - "default": "", - "help": "Hostname of the remote PHP-FPM instance.", - "id": "remote-php", - "label": "Remote PHP", - "regex": "^((?=.{1,255}$)[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?(?:\\.[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?)*\\.?)?$", - "type": "text", - "pattern": "^((?=.{1,255}$)[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?(?:\\.[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?)*\\.?)?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Remote PHP", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Hostname of the remote PHP-FPM instance." - } - ], - "method": "default", - "containerClass": "z-3" - }, - "REMOTE_PHP_PATH": { - "context": "multisite", - "default": "", - "help": "Root folder containing files in the remote PHP-FPM instance.", - "id": "remote-php-path", - "label": "Remote PHP path", - "regex": "^(/[\\w. \\-]+)*/?$", - "type": "text", - "pattern": "^(/[\\w. \\-]+)*/?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Remote PHP path", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Root folder containing files in the remote PHP-FPM instance." - } - ], - "method": "default", - "containerClass": "z-2" - }, - "LOCAL_PHP": { - "context": "multisite", - "default": "", - "help": "Path to the PHP-FPM socket file.", - "id": "local", - "label": "Local PHP", - "regex": "^(/[\\w. \\-]+)*/?$", - "type": "text", - "pattern": "^(/[\\w. \\-]+)*/?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Local PHP", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Path to the PHP-FPM socket file." - } - ], - "method": "default", - "containerClass": "z-1" - }, - "LOCAL_PHP_PATH": { - "context": "multisite", - "default": "", - "help": "Root folder containing files in the local PHP-FPM instance.", - "id": "local-php-path", - "label": "Local PHP path", - "regex": "^(/[\\w. \\-]+)*/?$", - "type": "text", - "pattern": "^(/[\\w. \\-]+)*/?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Local PHP path", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Root folder containing files in the local PHP-FPM instance." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "realip", - "stream": "partial", - "name": "Real IP", - "description": "Get real IP of clients when BunkerWeb is behind a reverse proxy / load balancer.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "USE_REAL_IP": { - "context": "multisite", - "default": "no", - "help": "Retrieve the real IP of client.", - "id": "use-real-ip", - "label": "Use real ip", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Use real ip", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Retrieve the real IP of client." - } - ], - "method": "default", - "containerClass": "z-4" - }, - "USE_PROXY_PROTOCOL": { - "context": "multisite", - "default": "no", - "help": "Enable PROXY protocol communication.", - "id": "use-proxy-protocol", - "label": "Use PROXY protocol", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Use PROXY protocol", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable PROXY protocol communication." - } - ], - "method": "default", - "containerClass": "z-3" - }, - "REAL_IP_FROM": { - "context": "multisite", - "default": "192.168.0.0/16 172.16.0.0/12 10.0.0.0/8", - "help": "List of trusted IPs / networks, separated with spaces, where proxied requests come from.", - "id": "real-ip-from", - "label": "Real IP from", - "regex": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "type": "text", - "pattern": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "192.168.0.0/16 172.16.0.0/12 10.0.0.0/8", - "name": "Real IP from", - "prev_value": "192.168.0.0/16 172.16.0.0/12 10.0.0.0/8", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of trusted IPs / networks, separated with spaces, where proxied requests come from." - } - ], - "method": "default", - "containerClass": "z-2" - }, - "REAL_IP_HEADER": { - "context": "multisite", - "default": "X-Forwarded-For", - "help": "HTTP header containing the real IP or special value proxy_protocol for PROXY protocol.", - "id": "real-ip-header", - "label": "Real IP header", - "regex": "^(?! )(( ?(?!proxy_protocol)[\\w\\-]+)*|proxy_protocol)$", - "type": "text", - "pattern": "^(?! )(( ?(?!proxy_protocol)[\\w\\-]+)*|proxy_protocol)$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "X-Forwarded-For", - "name": "Real IP header", - "prev_value": "X-Forwarded-For", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "HTTP header containing the real IP or special value proxy_protocol for PROXY protocol." - } - ], - "method": "default", - "containerClass": "z-1" - }, - "REAL_IP_RECURSIVE": { - "context": "multisite", - "default": "yes", - "help": "Perform a recursive search in the header container IP address.", - "id": "real-ip-recursive", - "label": "Real IP recursive", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "Real IP recursive", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Perform a recursive search in the header container IP address." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "redirect", - "stream": "no", - "name": "Redirect", - "description": "Manage HTTP redirects.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "REDIRECT_TO": { - "context": "multisite", - "default": "", - "help": "Redirect a whole site to another one.", - "id": "redirect-to", - "label": "Redirect to", - "regex": "^(https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)?$", - "type": "text", - "pattern": "^(https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Redirect to", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Redirect a whole site to another one." - } - ], - "method": "default", - "containerClass": "z-2" - }, - "REDIRECT_TO_REQUEST_URI": { - "context": "multisite", - "default": "no", - "help": "Append the requested URI to the redirect address.", - "id": "redirect-to-request-uri", - "label": "Append request URI", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Append request URI", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Append the requested URI to the redirect address." - } - ], - "method": "default", - "containerClass": "z-1" - }, - "REDIRECT_TO_STATUS_CODE": { - "context": "multisite", - "default": "301", - "help": "Status code to send to client when redirecting.", - "id": "redirect-to-status-code", - "label": "Append request URI", - "regex": "^(301|302)$", - "type": "select", - "pattern": "^(301|302)$", - "inpType": "select", - "values": ["301", "302"], - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "301", - "name": "Append request URI", - "prev_value": "301", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Status code to send to client when redirecting." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "reverseproxy", - "stream": "partial", - "name": "Reverse proxy", - "description": "Manage reverse proxy configurations.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "USE_REVERSE_PROXY": { - "context": "multisite", - "default": "no", - "help": "Activate reverse proxy mode.", - "id": "use-reverse-proxy", - "label": "Use reverse proxy", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": true, - "value": "yes", - "name": "Use reverse proxy", - "prev_value": "no", - "popovers": [ - { - "iconName": "trespass", - "text": "inp_popover_method_disabled" - }, - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Activate reverse proxy mode." - } - ], - "method": "scheduler", - "containerClass": "z-23" - }, - "REVERSE_PROXY_INTERCEPT_ERRORS": { - "context": "multisite", - "default": "yes", - "help": "Intercept and rewrite errors.", - "id": "reverse-proxy-intercept-errors", - "label": "Intercept errors", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "Intercept errors", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Intercept and rewrite errors." - } - ], - "method": "default", - "containerClass": "z-22" - }, - "REVERSE_PROXY_CUSTOM_HOST": { - "context": "multisite", - "default": "", - "help": "Override Host header sent to upstream server.", - "id": "reverse-proxy-custom-host", - "label": "Reverse proxy custom host", - "regex": "^.*$", - "type": "text", - "pattern": "^.*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Reverse proxy custom host", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Override Host header sent to upstream server." - } - ], - "method": "default", - "containerClass": "z-21" - }, - "USE_PROXY_CACHE": { - "context": "multisite", - "default": "no", - "help": "Enable or disable caching of the proxied resources.", - "id": "use-proxy-cache", - "label": "Reverse proxy cache", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Reverse proxy cache", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable or disable caching of the proxied resources." - } - ], - "method": "default", - "containerClass": "z-6" - }, - "PROXY_CACHE_METHODS": { - "context": "multisite", - "default": "GET HEAD", - "help": "HTTP methods that should trigger a cache operation.", - "id": "proxy-cache-methods", - "label": "Reverse proxy cache methods", - "regex": "^(?! )( ?(GET|HEAD|POST|PUT|DELETE|CONNECT|OPTIONS|TRACE|PATCH)(?!.*\\2))+$", - "type": "text", - "pattern": "^(?! )( ?(GET|HEAD|POST|PUT|DELETE|CONNECT|OPTIONS|TRACE|PATCH)(?!.*\\2))+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "GET HEAD", - "name": "Reverse proxy cache methods", - "prev_value": "GET HEAD", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "HTTP methods that should trigger a cache operation." - } - ], - "method": "default", - "containerClass": "z-5" - }, - "PROXY_CACHE_MIN_USES": { - "context": "multisite", - "default": "2", - "help": "The minimum number of requests before a response is cached.", - "id": "proxy-cache-min-uses", - "label": "Reverse proxy cache minimum uses", - "regex": "^[1-9]\\d*$", - "type": "text", - "pattern": "^[1-9]\\d*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "2", - "name": "Reverse proxy cache minimum uses", - "prev_value": "2", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "The minimum number of requests before a response is cached." - } - ], - "method": "default", - "containerClass": "z-4" - }, - "PROXY_CACHE_KEY": { - "context": "multisite", - "default": "$scheme$host$request_uri", - "help": "The key used to uniquely identify a cached response.", - "id": "proxy-cache-key", - "label": "Reverse proxy cache key", - "regex": "^(?! )( ?(\\$[a-z_]+)(?!.*\\2))+$", - "type": "text", - "pattern": "^(?! )( ?(\\$[a-z_]+)(?!.*\\2))+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "$scheme$host$request_uri", - "name": "Reverse proxy cache key", - "prev_value": "$scheme$host$request_uri", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "The key used to uniquely identify a cached response." - } - ], - "method": "default", - "containerClass": "z-3" - }, - "PROXY_CACHE_VALID": { - "context": "multisite", - "default": "200=24h 301=1h 302=24h", - "help": "Define the caching time depending on the HTTP status code (list of status=time), separated with spaces.", - "id": "proxy-cache-valid", - "label": "Reverse proxy cache valid", - "regex": "^(?! )( ?([1-5]\\d{2})(?!.*\\2=)=\\d+(ms?|[shdwMy]))*$", - "type": "text", - "pattern": "^(?! )( ?([1-5]\\d{2})(?!.*\\2=)=\\d+(ms?|[shdwMy]))*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "200=24h 301=1h 302=24h", - "name": "Reverse proxy cache valid", - "prev_value": "200=24h 301=1h 302=24h", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Define the caching time depending on the HTTP status code (list of status=time), separated with spaces." - } - ], - "method": "default", - "containerClass": "z-2" - }, - "PROXY_NO_CACHE": { - "context": "multisite", - "default": "$http_pragma $http_authorization", - "help": "Conditions to disable caching of responses.", - "id": "proxy-no-cache", - "label": "Reverse proxy no cache", - "regex": "^.*$", - "type": "text", - "pattern": "^.*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "$http_pragma $http_authorization", - "name": "Reverse proxy no cache", - "prev_value": "$http_pragma $http_authorization", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Conditions to disable caching of responses." - } - ], - "method": "default", - "containerClass": "z-1" - }, - "PROXY_CACHE_BYPASS": { - "context": "multisite", - "default": "0", - "help": "Conditions to bypass caching of responses.", - "id": "proxy-cache-bypass", - "label": "Reverse proxy bypass", - "regex": "^.*$", - "type": "text", - "pattern": "^.*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "0", - "name": "Reverse proxy bypass", - "prev_value": "0", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Conditions to bypass caching of responses." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null, - "multiples_schema": { - "reverse-proxy": { - "REVERSE_PROXY_HOST": { - "context": "multisite", - "default": "", - "help": "Full URL of the proxied resource (proxy_pass).", - "id": "reverse-proxy-host", - "label": "Reverse proxy host", - "regex": "^.*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^.*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Reverse proxy host", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Full URL of the proxied resource (proxy_pass)." - } - ], - "containerClass": "z-23" - }, - "REVERSE_PROXY_URL": { - "context": "multisite", - "default": "/", - "help": "Location URL that will be proxied.", - "id": "reverse-proxy-url", - "label": "Reverse proxy url", - "regex": "^.*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^.*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "/", - "name": "Reverse proxy url", - "prev_value": "/", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Location URL that will be proxied." - } - ], - "containerClass": "z-22" - }, - "REVERSE_PROXY_WS": { - "context": "multisite", - "default": "no", - "help": "Enable websocket on the proxied resource.", - "id": "reverse-proxy-ws", - "label": "Reverse proxy WS", - "regex": "^(yes|no)$", - "type": "check", - "multiple": "reverse-proxy", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Reverse proxy WS", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable websocket on the proxied resource." - } - ], - "containerClass": "z-21" - }, - "REVERSE_PROXY_HEADERS": { - "context": "multisite", - "default": "", - "help": "List of HTTP headers to send to proxied resource separated with semicolons (values for proxy_set_header directive).", - "id": "reverse-proxy-headers", - "label": "Reverse proxy headers", - "regex": "^(?![; ])(;? ?([\\w\\-]+)(?!.*\\2 ) [^;]+)*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(?![; ])(;? ?([\\w\\-]+)(?!.*\\2 ) [^;]+)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Reverse proxy headers", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of HTTP headers to send to proxied resource separated with semicolons (values for proxy_set_header directive)." - } - ], - "containerClass": "z-20" - }, - "REVERSE_PROXY_HEADERS_CLIENT": { - "context": "multisite", - "default": "", - "help": "List of HTTP headers to send to client separated with semicolons (values for add_header directive).", - "id": "reverse-proxy-headers-client", - "label": "Reverse proxy headers-client", - "regex": "^(?![; ])(;? ?([\\w\\-]+)(?!.*\\2 ) [^;]+)*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(?![; ])(;? ?([\\w\\-]+)(?!.*\\2 ) [^;]+)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Reverse proxy headers-client", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of HTTP headers to send to client separated with semicolons (values for add_header directive)." - } - ], - "containerClass": "z-19" - }, - "REVERSE_PROXY_BUFFERING": { - "context": "multisite", - "default": "yes", - "help": "Enable or disable buffering of responses from proxied resource.", - "id": "reverse-proxy-buffering", - "label": "Reverse proxy buffering", - "regex": "^(yes|no)$", - "type": "check", - "multiple": "reverse-proxy", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "Reverse proxy buffering", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable or disable buffering of responses from proxied resource." - } - ], - "containerClass": "z-18" - }, - "REVERSE_PROXY_KEEPALIVE": { - "context": "multisite", - "default": "no", - "help": "Enable or disable keepalive connections with the proxied resource.", - "id": "reverse-proxy-keepalive", - "label": "Reverse proxy keepalive", - "regex": "^(yes|no)$", - "type": "check", - "multiple": "reverse-proxy", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Reverse proxy keepalive", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable or disable keepalive connections with the proxied resource." - } - ], - "containerClass": "z-17" - }, - "REVERSE_PROXY_AUTH_REQUEST": { - "context": "multisite", - "default": "", - "help": "Enable authentication using an external provider (value of auth_request directive).", - "id": "reverse-proxy-auth-request", - "label": "Reverse proxy auth request", - "regex": "^(\\/[\\w\\].~:\\/?#\\[@!$\\&'\\(\\)*+,;=\\-]*|off)?$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(\\/[\\w\\].~:\\/?#\\[@!$\\&'\\(\\)*+,;=\\-]*|off)?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Reverse proxy auth request", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable authentication using an external provider (value of auth_request directive)." - } - ], - "containerClass": "z-16" - }, - "REVERSE_PROXY_AUTH_REQUEST_SIGNIN_URL": { - "context": "multisite", - "default": "", - "help": "Redirect clients to sign-in URL when using REVERSE_PROXY_AUTH_REQUEST (used when auth_request call returned 401).", - "id": "reverse-proxy-auth-request-signin-url", - "label": "Auth request signin URL", - "regex": "^(https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)?$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Auth request signin URL", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Redirect clients to sign-in URL when using REVERSE_PROXY_AUTH_REQUEST (used when auth_request call returned 401)." - } - ], - "containerClass": "z-15" - }, - "REVERSE_PROXY_AUTH_REQUEST_SET": { - "context": "multisite", - "default": "", - "help": "List of variables to set from the authentication provider, separated with semicolons (values of auth_request_set directives).", - "id": "reverse-proxy-auth-request-set", - "label": "Reverse proxy auth request set", - "regex": "^(?! ;)(;? ?(\\$[a-z_\\-]+)(?!.*\\2 ) [^;]+)*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(?! ;)(;? ?(\\$[a-z_\\-]+)(?!.*\\2 ) [^;]+)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Reverse proxy auth request set", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of variables to set from the authentication provider, separated with semicolons (values of auth_request_set directives)." - } - ], - "containerClass": "z-14" - }, - "REVERSE_PROXY_CONNECT_TIMEOUT": { - "context": "multisite", - "default": "60s", - "help": "Timeout when connecting to the proxied resource.", - "id": "reverse-proxy-connect-timeout", - "label": "Reverse proxy connect timeout", - "regex": "^\\d+(ms?|[shdwMy])$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^\\d+(ms?|[shdwMy])$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "60s", - "name": "Reverse proxy connect timeout", - "prev_value": "60s", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Timeout when connecting to the proxied resource." - } - ], - "containerClass": "z-13" - }, - "REVERSE_PROXY_READ_TIMEOUT": { - "context": "multisite", - "default": "60s", - "help": "Timeout when reading from the proxied resource.", - "id": "reverse-proxy-read-timeout", - "label": "Reverse proxy read timeout", - "regex": "^\\d+(ms?|[shdwMy])$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^\\d+(ms?|[shdwMy])$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "60s", - "name": "Reverse proxy read timeout", - "prev_value": "60s", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Timeout when reading from the proxied resource." - } - ], - "containerClass": "z-12" - }, - "REVERSE_PROXY_SEND_TIMEOUT": { - "context": "multisite", - "default": "60s", - "help": "Timeout when sending to the proxied resource.", - "id": "reverse-proxy-send-timeout", - "label": "Reverse proxy send timeout", - "regex": "^\\d+(ms?|[shdwMy])$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^\\d+(ms?|[shdwMy])$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "60s", - "name": "Reverse proxy send timeout", - "prev_value": "60s", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Timeout when sending to the proxied resource." - } - ], - "containerClass": "z-11" - }, - "REVERSE_PROXY_INCLUDES": { - "context": "multisite", - "default": "", - "help": "Additional configuration to include in the location block, separated with spaces.", - "id": "reverse-proxy-includes", - "label": "Reverse proxy includes", - "regex": "^(?! )( ?(\\w+)(?!.*\\b\\2\\b))*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(?! )( ?(\\w+)(?!.*\\b\\2\\b))*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Reverse proxy includes", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Additional configuration to include in the location block, separated with spaces." - } - ], - "containerClass": "z-10" - } - } - }, - "multiples": { - "reverse-proxy": { - "0": { - "REVERSE_PROXY_HOST": { - "context": "multisite", - "default": "", - "help": "Full URL of the proxied resource (proxy_pass).", - "id": "reverse-proxy-host", - "label": "Reverse proxy host", - "regex": "^.*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^.*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": true, - "value": "http://app1:8080", - "name": "Reverse proxy host", - "prev_value": "http://app1:8080", - "popovers": [ - { - "iconName": "trespass", - "text": "inp_popover_method_disabled" - }, - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Full URL of the proxied resource (proxy_pass)." - } - ], - "containerClass": "z-23", - "method": "scheduler" - }, - "REVERSE_PROXY_URL": { - "context": "multisite", - "default": "/", - "help": "Location URL that will be proxied.", - "id": "reverse-proxy-url", - "label": "Reverse proxy url", - "regex": "^.*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^.*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "/", - "name": "Reverse proxy url", - "prev_value": "/", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Location URL that will be proxied." - } - ], - "containerClass": "z-22", - "method": "default" - }, - "REVERSE_PROXY_WS": { - "context": "multisite", - "default": "no", - "help": "Enable websocket on the proxied resource.", - "id": "reverse-proxy-ws", - "label": "Reverse proxy WS", - "regex": "^(yes|no)$", - "type": "check", - "multiple": "reverse-proxy", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Reverse proxy WS", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable websocket on the proxied resource." - } - ], - "containerClass": "z-21", - "method": "default" - }, - "REVERSE_PROXY_HEADERS": { - "context": "multisite", - "default": "", - "help": "List of HTTP headers to send to proxied resource separated with semicolons (values for proxy_set_header directive).", - "id": "reverse-proxy-headers", - "label": "Reverse proxy headers", - "regex": "^(?![; ])(;? ?([\\w\\-]+)(?!.*\\2 ) [^;]+)*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(?![; ])(;? ?([\\w\\-]+)(?!.*\\2 ) [^;]+)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Reverse proxy headers", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of HTTP headers to send to proxied resource separated with semicolons (values for proxy_set_header directive)." - } - ], - "containerClass": "z-20", - "method": "default" - }, - "REVERSE_PROXY_HEADERS_CLIENT": { - "context": "multisite", - "default": "", - "help": "List of HTTP headers to send to client separated with semicolons (values for add_header directive).", - "id": "reverse-proxy-headers-client", - "label": "Reverse proxy headers-client", - "regex": "^(?![; ])(;? ?([\\w\\-]+)(?!.*\\2 ) [^;]+)*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(?![; ])(;? ?([\\w\\-]+)(?!.*\\2 ) [^;]+)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Reverse proxy headers-client", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of HTTP headers to send to client separated with semicolons (values for add_header directive)." - } - ], - "containerClass": "z-19", - "method": "default" - }, - "REVERSE_PROXY_BUFFERING": { - "context": "multisite", - "default": "yes", - "help": "Enable or disable buffering of responses from proxied resource.", - "id": "reverse-proxy-buffering", - "label": "Reverse proxy buffering", - "regex": "^(yes|no)$", - "type": "check", - "multiple": "reverse-proxy", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "Reverse proxy buffering", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable or disable buffering of responses from proxied resource." - } - ], - "containerClass": "z-18", - "method": "default" - }, - "REVERSE_PROXY_KEEPALIVE": { - "context": "multisite", - "default": "no", - "help": "Enable or disable keepalive connections with the proxied resource.", - "id": "reverse-proxy-keepalive", - "label": "Reverse proxy keepalive", - "regex": "^(yes|no)$", - "type": "check", - "multiple": "reverse-proxy", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Reverse proxy keepalive", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable or disable keepalive connections with the proxied resource." - } - ], - "containerClass": "z-17", - "method": "default" - }, - "REVERSE_PROXY_AUTH_REQUEST": { - "context": "multisite", - "default": "", - "help": "Enable authentication using an external provider (value of auth_request directive).", - "id": "reverse-proxy-auth-request", - "label": "Reverse proxy auth request", - "regex": "^(\\/[\\w\\].~:\\/?#\\[@!$\\&'\\(\\)*+,;=\\-]*|off)?$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(\\/[\\w\\].~:\\/?#\\[@!$\\&'\\(\\)*+,;=\\-]*|off)?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Reverse proxy auth request", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable authentication using an external provider (value of auth_request directive)." - } - ], - "containerClass": "z-16", - "method": "default" - }, - "REVERSE_PROXY_AUTH_REQUEST_SIGNIN_URL": { - "context": "multisite", - "default": "", - "help": "Redirect clients to sign-in URL when using REVERSE_PROXY_AUTH_REQUEST (used when auth_request call returned 401).", - "id": "reverse-proxy-auth-request-signin-url", - "label": "Auth request signin URL", - "regex": "^(https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)?$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Auth request signin URL", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Redirect clients to sign-in URL when using REVERSE_PROXY_AUTH_REQUEST (used when auth_request call returned 401)." - } - ], - "containerClass": "z-15", - "method": "default" - }, - "REVERSE_PROXY_AUTH_REQUEST_SET": { - "context": "multisite", - "default": "", - "help": "List of variables to set from the authentication provider, separated with semicolons (values of auth_request_set directives).", - "id": "reverse-proxy-auth-request-set", - "label": "Reverse proxy auth request set", - "regex": "^(?! ;)(;? ?(\\$[a-z_\\-]+)(?!.*\\2 ) [^;]+)*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(?! ;)(;? ?(\\$[a-z_\\-]+)(?!.*\\2 ) [^;]+)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Reverse proxy auth request set", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of variables to set from the authentication provider, separated with semicolons (values of auth_request_set directives)." - } - ], - "containerClass": "z-14", - "method": "default" - }, - "REVERSE_PROXY_CONNECT_TIMEOUT": { - "context": "multisite", - "default": "60s", - "help": "Timeout when connecting to the proxied resource.", - "id": "reverse-proxy-connect-timeout", - "label": "Reverse proxy connect timeout", - "regex": "^\\d+(ms?|[shdwMy])$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^\\d+(ms?|[shdwMy])$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "60s", - "name": "Reverse proxy connect timeout", - "prev_value": "60s", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Timeout when connecting to the proxied resource." - } - ], - "containerClass": "z-13", - "method": "default" - }, - "REVERSE_PROXY_READ_TIMEOUT": { - "context": "multisite", - "default": "60s", - "help": "Timeout when reading from the proxied resource.", - "id": "reverse-proxy-read-timeout", - "label": "Reverse proxy read timeout", - "regex": "^\\d+(ms?|[shdwMy])$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^\\d+(ms?|[shdwMy])$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "60s", - "name": "Reverse proxy read timeout", - "prev_value": "60s", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Timeout when reading from the proxied resource." - } - ], - "containerClass": "z-12", - "method": "default" - }, - "REVERSE_PROXY_SEND_TIMEOUT": { - "context": "multisite", - "default": "60s", - "help": "Timeout when sending to the proxied resource.", - "id": "reverse-proxy-send-timeout", - "label": "Reverse proxy send timeout", - "regex": "^\\d+(ms?|[shdwMy])$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^\\d+(ms?|[shdwMy])$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "60s", - "name": "Reverse proxy send timeout", - "prev_value": "60s", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Timeout when sending to the proxied resource." - } - ], - "containerClass": "z-11", - "method": "default" - }, - "REVERSE_PROXY_INCLUDES": { - "context": "multisite", - "default": "", - "help": "Additional configuration to include in the location block, separated with spaces.", - "id": "reverse-proxy-includes", - "label": "Reverse proxy includes", - "regex": "^(?! )( ?(\\w+)(?!.*\\b\\2\\b))*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(?! )( ?(\\w+)(?!.*\\b\\2\\b))*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Reverse proxy includes", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Additional configuration to include in the location block, separated with spaces." - } - ], - "containerClass": "z-10", - "method": "default" - } - } - } - } - }, - { - "id": "reversescan", - "stream": "yes", - "name": "Reverse scan", - "description": "Scan clients ports to detect proxies or servers.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": true, - "settings": { - "USE_REVERSE_SCAN": { - "context": "multisite", - "default": "no", - "help": "Enable scanning of clients ports and deny access if one is opened.", - "id": "use-reverse-scan", - "label": "Reverse scan", - "regex": "^(no|yes)$", - "type": "check", - "pattern": "^(no|yes)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Reverse scan", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable scanning of clients ports and deny access if one is opened." - } - ], - "method": "default", - "containerClass": "z-2" - }, - "REVERSE_SCAN_PORTS": { - "context": "multisite", - "default": "22 80 443 3128 8000 8080", - "help": "List of port to scan when using reverse scan feature.", - "id": "reverse-scan-ports", - "label": "Reverse scan ports", - "regex": "^.*$", - "type": "text", - "pattern": "^.*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "22 80 443 3128 8000 8080", - "name": "Reverse scan ports", - "prev_value": "22 80 443 3128 8000 8080", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of port to scan when using reverse scan feature." - } - ], - "method": "default", - "containerClass": "z-1" - }, - "REVERSE_SCAN_TIMEOUT": { - "context": "multisite", - "default": "500", - "help": "Specify the maximum timeout (in ms) when scanning a port.", - "id": "reverse-scan-timeout", - "label": "Reverse scan timeout", - "regex": "^.*$", - "type": "text", - "pattern": "^.*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "500", - "name": "Reverse scan timeout", - "prev_value": "500", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Specify the maximum timeout (in ms) when scanning a port." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "selfsigned", - "stream": "yes", - "name": "Self-signed certificate", - "description": "Generate self-signed certificate.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "GENERATE_SELF_SIGNED_SSL": { - "context": "multisite", - "default": "no", - "help": "Generate and use self-signed certificate.", - "id": "generate-self-signed-ssl", - "label": "Activate self-signed certificate", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Activate self-signed certificate", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Generate and use self-signed certificate." - } - ], - "method": "default", - "containerClass": "z-2" - }, - "SELF_SIGNED_SSL_EXPIRY": { - "context": "multisite", - "default": "365", - "help": "Self-signed certificate expiry in days.", - "id": "self-signed-ssl-expiry", - "label": "Certificate expiry", - "regex": "^\\d+$", - "type": "text", - "pattern": "^\\d+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "365", - "name": "Certificate expiry", - "prev_value": "365", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Self-signed certificate expiry in days." - } - ], - "method": "default", - "containerClass": "z-1" - }, - "SELF_SIGNED_SSL_SUBJ": { - "context": "multisite", - "default": "/CN=www.example.com/", - "help": "Self-signed certificate subject.", - "id": "self-signed-ssl-subj", - "label": "Certificate subject", - "regex": "^/CN=[^,]+$", - "type": "text", - "pattern": "^/CN=[^,]+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "/CN=www.example.com/", - "name": "Certificate subject", - "prev_value": "/CN=www.example.com/", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Self-signed certificate subject." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "ui", - "stream": "no", - "name": "UI", - "description": "Integrate easily the BunkerWeb UI.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "USE_UI": { - "context": "multisite", - "default": "no", - "help": "Use UI", - "id": "use-ui", - "label": "Use UI", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Use UI", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Use UI" - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "whitelist", - "stream": "partial", - "name": "Whitelist", - "description": "Allow access based on internal and external IP/network/rDNS/ASN whitelists.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": true, - "settings": { - "USE_WHITELIST": { - "context": "multisite", - "default": "yes", - "help": "Activate whitelist feature.", - "id": "use-whitelist", - "label": "Activate whitelisting", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": true, - "value": "no", - "name": "Activate whitelisting", - "prev_value": "yes", - "popovers": [ - { - "iconName": "trespass", - "text": "inp_popover_method_disabled" - }, - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Activate whitelist feature." - } - ], - "method": "scheduler", - "containerClass": "z-6" - }, - "WHITELIST_IP": { - "context": "multisite", - "default": "20.191.45.212 40.88.21.235 40.76.173.151 40.76.163.7 20.185.79.47 52.142.26.175 20.185.79.15 52.142.24.149 40.76.162.208 40.76.163.23 40.76.162.191 40.76.162.247", - "help": "List of IP/network, separated with spaces, to put into the whitelist.", - "id": "whitelist-ip", - "label": "Whitelist IP/network", - "regex": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "type": "text", - "pattern": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "20.191.45.212 40.88.21.235 40.76.173.151 40.76.163.7 20.185.79.47 52.142.26.175 20.185.79.15 52.142.24.149 40.76.162.208 40.76.163.23 40.76.162.191 40.76.162.247", - "name": "Whitelist IP/network", - "prev_value": "20.191.45.212 40.88.21.235 40.76.173.151 40.76.163.7 20.185.79.47 52.142.26.175 20.185.79.15 52.142.24.149 40.76.162.208 40.76.163.23 40.76.162.191 40.76.162.247", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of IP/network, separated with spaces, to put into the whitelist." - } - ], - "method": "default", - "containerClass": "z-5" - }, - "WHITELIST_RDNS": { - "context": "multisite", - "default": ".google.com .googlebot.com .yandex.ru .yandex.net .yandex.com .search.msn.com .baidu.com .baidu.jp .crawl.yahoo.net .fwd.linkedin.com .twitter.com .twttr.com .discord.com", - "help": "List of reverse DNS suffixes, separated with spaces, to whitelist.", - "id": "whitelist-rdns", - "label": "Whitelist reverse DNS", - "regex": "^( *(([^ ]+)(?!.*\\3( |$))) *)*$", - "type": "text", - "pattern": "^( *(([^ ]+)(?!.*\\3( |$))) *)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": ".google.com .googlebot.com .yandex.ru .yandex.net .yandex.com .search.msn.com .baidu.com .baidu.jp .crawl.yahoo.net .fwd.linkedin.com .twitter.com .twttr.com .discord.com", - "name": "Whitelist reverse DNS", - "prev_value": ".google.com .googlebot.com .yandex.ru .yandex.net .yandex.com .search.msn.com .baidu.com .baidu.jp .crawl.yahoo.net .fwd.linkedin.com .twitter.com .twttr.com .discord.com", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of reverse DNS suffixes, separated with spaces, to whitelist." - } - ], - "method": "default", - "containerClass": "z-4" - }, - "WHITELIST_RDNS_GLOBAL": { - "context": "multisite", - "default": "yes", - "help": "Only perform RDNS whitelist checks on global IP addresses.", - "id": "whitelist-rdns-global", - "label": "Whitelist reverse DNS global IPs", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "Whitelist reverse DNS global IPs", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Only perform RDNS whitelist checks on global IP addresses." - } - ], - "method": "default", - "containerClass": "z-3" - }, - "WHITELIST_ASN": { - "context": "multisite", - "default": "32934", - "help": "List of ASN numbers, separated with spaces, to whitelist.", - "id": "whitelist-asn", - "label": "Whitelist ASN", - "regex": "^^( *((ASN?)?(\\d+)\\b(?!.*[SN ]\\4\\b)) *)*$", - "type": "text", - "pattern": "^^( *((ASN?)?(\\d+)\\b(?!.*[SN ]\\4\\b)) *)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "32934", - "name": "Whitelist ASN", - "prev_value": "32934", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of ASN numbers, separated with spaces, to whitelist." - } - ], - "method": "default", - "containerClass": "z-2" - }, - "WHITELIST_USER_AGENT": { - "context": "multisite", - "default": "", - "help": "List of User-Agent (PCRE regex), separated with spaces, to whitelist.", - "id": "whitelist-user-agent", - "label": "Whitelist User-Agent", - "regex": "^.*$", - "type": "text", - "pattern": "^.*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Whitelist User-Agent", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of User-Agent (PCRE regex), separated with spaces, to whitelist." - } - ], - "method": "default", - "containerClass": "z-1" - }, - "WHITELIST_URI": { - "context": "multisite", - "default": "", - "help": "List of URI (PCRE regex), separated with spaces, to whitelist.", - "id": "whitelist-uri", - "label": "Whitelist URI", - "regex": "^( *(.*)(?!.*\\2(?!.)) *)*$", - "type": "text", - "pattern": "^( *(.*)(?!.*\\2(?!.)) *)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Whitelist URI", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of URI (PCRE regex), separated with spaces, to whitelist." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - } - ], - "low": [ - { - "id": "general", - "stream": "partial", - "name": "General", - "description": "The general settings for the server", - "version": "0.1", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "SERVER_NAME": { - "context": "multisite", - "default": "www.example.com", - "help": "List of the virtual hosts served by bunkerweb.", - "id": "server-name", - "label": "Server name", - "regex": "^((\\S{1,255})(?!.*\\s\\2(\\s|$)))?(\\s(\\S{1,255})(?!.*\\s\\5(\\s|$)))*$", - "type": "text", - "pattern": "^((\\S{1,255})(?!.*\\s\\2(\\s|$)))?(\\s(\\S{1,255})(?!.*\\s\\5(\\s|$)))*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "app1.example.com", - "name": "Server name", - "prev_value": "www.example.com", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of the virtual hosts served by bunkerweb." - } - ], - "method": "ui", - "containerClass": "z-6" - }, - "SERVER_TYPE": { - "context": "multisite", - "default": "http", - "help": "Server type : http or stream.", - "id": "server-type", - "label": "Server type", - "regex": "^(http|stream)$", - "type": "select", - "pattern": "^(http|stream)$", - "inpType": "select", - "values": ["http", "stream"], - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "http", - "name": "Server type", - "prev_value": "http", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Server type : http or stream." - } - ], - "method": "default", - "containerClass": "z-5" - }, - "LISTEN_STREAM": { - "context": "multisite", - "default": "yes", - "help": "Enable listening for non-ssl (passthrough).", - "id": "listen-stream", - "label": "Listen stream", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "Listen stream", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable listening for non-ssl (passthrough)." - } - ], - "method": "default", - "containerClass": "z-4" - }, - "LISTEN_STREAM_PORT": { - "context": "multisite", - "default": "1337", - "help": "Listening port for non-ssl (passthrough).", - "id": "listen-stream-port", - "label": "Listen stream port", - "regex": "^[0-9]+$", - "type": "text", - "pattern": "^[0-9]+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "1337", - "name": "Listen stream port", - "prev_value": "1337", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Listening port for non-ssl (passthrough)." - } - ], - "method": "default", - "containerClass": "z-3" - }, - "LISTEN_STREAM_PORT_SSL": { - "context": "multisite", - "default": "4242", - "help": "Listening port for ssl (passthrough).", - "id": "listen-stream-port-ssl", - "label": "Listen stream port ssl", - "regex": "^[0-9]+$", - "type": "text", - "pattern": "^[0-9]+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "4242", - "name": "Listen stream port ssl", - "prev_value": "4242", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Listening port for ssl (passthrough)." - } - ], - "method": "default", - "containerClass": "z-2" - }, - "USE_UDP": { - "context": "multisite", - "default": "no", - "help": "UDP listen instead of TCP (stream).", - "id": "use-udp", - "label": "Listen UDP", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Listen UDP", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "UDP listen instead of TCP (stream)." - } - ], - "method": "default", - "containerClass": "z-1" - }, - "IS_DRAFT": { - "context": "multisite", - "default": "no", - "help": "Internal use : set to yes when the service is in draft mode.", - "id": "internal-use-draft", - "label": "internal use draft", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "internal use draft", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Internal use : set to yes when the service is in draft mode." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "antibot", - "stream": "no", - "name": "Antibot", - "description": "Bot detection by using a challenge.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": true, - "settings": { - "USE_ANTIBOT": { - "context": "multisite", - "default": "no", - "help": "Activate antibot feature.", - "id": "use-antibot", - "label": "Antibot challenge", - "regex": "^(no|cookie|javascript|captcha|recaptcha|hcaptcha|turnstile)$", - "type": "select", - "pattern": "^(no|cookie|javascript|captcha|recaptcha|hcaptcha|turnstile)$", - "inpType": "select", - "values": [ - "captcha", - "cookie", - "hcaptcha", - "javascript", - "no", - "recaptcha", - "turnstile" - ], - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "Antibot challenge", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Activate antibot feature." - } - ], - "method": "default", - "containerClass": "z-10" - }, - "ANTIBOT_URI": { - "context": "multisite", - "default": "/challenge", - "help": "Unused URI that clients will be redirected to to solve the challenge.", - "id": "antibot-uri", - "label": "Antibot URL", - "regex": "^\\/[\\w\\].~:\\/?#\\[@!$\\&'\\(\\)*+,;=\\-]*$", - "type": "text", - "pattern": "^\\/[\\w\\].~:\\/?#\\[@!$\\&'\\(\\)*+,;=\\-]*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "/challenge", - "name": "Antibot URL", - "prev_value": "/challenge", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Unused URI that clients will be redirected to to solve the challenge." - } - ], - "method": "default", - "containerClass": "z-9" - }, - "ANTIBOT_TIME_RESOLVE": { - "context": "multisite", - "default": "60", - "help": "Maximum time (in seconds) clients have to resolve the challenge. Once this time has passed, a new challenge will be generated.", - "id": "antibot-time-resolve", - "label": "Time to resolve", - "regex": "^[0-9]+$", - "type": "text", - "pattern": "^[0-9]+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "60", - "name": "Time to resolve", - "prev_value": "60", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Maximum time (in seconds) clients have to resolve the challenge. Once this time has passed, a new challenge will be generated." - } - ], - "method": "default", - "containerClass": "z-8" - }, - "ANTIBOT_TIME_VALID": { - "context": "multisite", - "default": "86400", - "help": "Maximum validity time of solved challenges. Once this time has passed, clients will need to resolve a new one.", - "id": "antibot-time-valid", - "label": "Time valid", - "regex": "^[0-9]+$", - "type": "text", - "pattern": "^[0-9]+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "86400", - "name": "Time valid", - "prev_value": "86400", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Maximum validity time of solved challenges. Once this time has passed, clients will need to resolve a new one." - } - ], - "method": "default", - "containerClass": "z-7" - }, - "ANTIBOT_RECAPTCHA_SCORE": { - "context": "multisite", - "default": "0.7", - "help": "Minimum score required for reCAPTCHA challenge.", - "id": "antibot-recaptcha-score", - "label": "reCAPTCHA score", - "regex": "^(0\\.[1-9]|1\\.0)$", - "type": "text", - "pattern": "^(0\\.[1-9]|1\\.0)$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "0.7", - "name": "reCAPTCHA score", - "prev_value": "0.7", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Minimum score required for reCAPTCHA challenge." - } - ], - "method": "default", - "containerClass": "z-6" - }, - "ANTIBOT_RECAPTCHA_SITEKEY": { - "context": "multisite", - "default": "", - "help": "Sitekey for reCAPTCHA challenge.", - "id": "antibot-recaptcha-sitekey", - "label": "reCAPTCHA sitekey", - "regex": "^[\\w\\-]*$", - "type": "text", - "pattern": "^[\\w\\-]*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "reCAPTCHA sitekey", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Sitekey for reCAPTCHA challenge." - } - ], - "method": "default", - "containerClass": "z-5" - }, - "ANTIBOT_RECAPTCHA_SECRET": { - "context": "multisite", - "default": "", - "help": "Secret for reCAPTCHA challenge.", - "id": "antibot-recaptcha-secret", - "label": "reCAPTCHA secret", - "regex": "^[\\w\\-]*$", - "type": "password", - "pattern": "^[\\w\\-]*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "reCAPTCHA secret", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Secret for reCAPTCHA challenge." - } - ], - "method": "default", - "containerClass": "z-4" - }, - "ANTIBOT_HCAPTCHA_SITEKEY": { - "context": "multisite", - "default": "", - "help": "Sitekey for hCaptcha challenge.", - "id": "antibot-hcaptcha-sitekey", - "label": "hCaptcha sitekey", - "regex": "^[a-zA-Z0-9\\-]*$", - "type": "text", - "pattern": "^[a-zA-Z0-9\\-]*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "hCaptcha sitekey", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Sitekey for hCaptcha challenge." - } - ], - "method": "default", - "containerClass": "z-3" - }, - "ANTIBOT_HCAPTCHA_SECRET": { - "context": "multisite", - "default": "", - "help": "Secret for hCaptcha challenge.", - "id": "antibot-hcaptcha-secret", - "label": "hCaptcha secret", - "regex": "^\\w*$", - "type": "password", - "pattern": "^\\w*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "hCaptcha secret", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Secret for hCaptcha challenge." - } - ], - "method": "default", - "containerClass": "z-2" - }, - "ANTIBOT_TURNSTILE_SITEKEY": { - "context": "multisite", - "default": "", - "help": "Sitekey for Turnstile challenge.", - "id": "antibot-turnstile-sitekey", - "label": "Turnstile sitekey", - "regex": "^(0x[\\w\\-]+)?$", - "type": "text", - "pattern": "^(0x[\\w\\-]+)?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Turnstile sitekey", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Sitekey for Turnstile challenge." - } - ], - "method": "default", - "containerClass": "z-1" - }, - "ANTIBOT_TURNSTILE_SECRET": { - "context": "multisite", - "default": "", - "help": "Secret for Turnstile challenge.", - "id": "antibot-turnstile-secret", - "label": "Turnstile secret", - "regex": "^(0x[\\w\\-]+)?$", - "type": "password", - "pattern": "^(0x[\\w\\-]+)?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Turnstile secret", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Secret for Turnstile challenge." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "authbasic", - "stream": "no", - "name": "Auth basic", - "description": "Enforce login before accessing a resource or the whole site using HTTP basic auth method.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "USE_AUTH_BASIC": { - "context": "multisite", - "default": "no", - "help": "Use HTTP basic auth", - "id": "use-auth-basic", - "label": "Use HTTP basic auth", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Use HTTP basic auth", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Use HTTP basic auth" - } - ], - "method": "default", - "containerClass": "z-4" - }, - "AUTH_BASIC_LOCATION": { - "context": "multisite", - "default": "sitewide", - "help": "URL of the protected resource or sitewide value.", - "id": "auth-basic-location", - "label": "Auth basic Location", - "regex": "^(sitewide|/[a-zA-Z0-9.\\/\\-]*)$", - "type": "text", - "pattern": "^(sitewide|/[a-zA-Z0-9.\\/\\-]*)$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "sitewide", - "name": "Auth basic Location", - "prev_value": "sitewide", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "URL of the protected resource or sitewide value." - } - ], - "method": "default", - "containerClass": "z-3" - }, - "AUTH_BASIC_USER": { - "context": "multisite", - "default": "changeme", - "help": "Username", - "id": "auth-basic-user", - "label": "Auth basic Username", - "regex": "^[\\w\\-]+", - "type": "text", - "pattern": "^[\\w\\-]+", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "changeme", - "name": "Auth basic Username", - "prev_value": "changeme", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Username" - } - ], - "method": "default", - "containerClass": "z-2" - }, - "AUTH_BASIC_PASSWORD": { - "context": "multisite", - "default": "changeme", - "help": "Password", - "id": "auth-basic-password", - "label": "Password", - "regex": "^.+", - "type": "password", - "pattern": "^.+", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "changeme", - "name": "Password", - "prev_value": "changeme", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Password" - } - ], - "method": "default", - "containerClass": "z-1" - }, - "AUTH_BASIC_TEXT": { - "context": "multisite", - "default": "Restricted area", - "help": "Text to display", - "id": "auth-basic-text", - "label": "Text", - "regex": "^.+", - "type": "text", - "pattern": "^.+", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "Restricted area", - "name": "Text", - "prev_value": "Restricted area", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Text to display" - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "badbehavior", - "stream": "yes", - "name": "Bad behavior", - "description": "Ban IP generating too much 'bad' HTTP status code in a period of time.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": true, - "settings": { - "USE_BAD_BEHAVIOR": { - "context": "multisite", - "default": "yes", - "help": "Activate Bad behavior feature.", - "id": "use-bad-behavior", - "label": "Activate bad behavior", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "Activate bad behavior", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Activate Bad behavior feature." - } - ], - "method": "default", - "containerClass": "z-4" - }, - "BAD_BEHAVIOR_STATUS_CODES": { - "context": "multisite", - "default": "400 401 403 404 405 429 444", - "help": "List of HTTP status codes considered as 'bad'.", - "id": "bad-behavior-status-code", - "label": "Bad status codes", - "regex": "^( *([1-5]\\d{2})(?!.*\\2) *)+$", - "type": "text", - "pattern": "^( *([1-5]\\d{2})(?!.*\\2) *)+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "400 401 403 404 405 429 444", - "name": "Bad status codes", - "prev_value": "400 401 403 404 405 429 444", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of HTTP status codes considered as 'bad'." - } - ], - "method": "default", - "containerClass": "z-3" - }, - "BAD_BEHAVIOR_THRESHOLD": { - "context": "multisite", - "default": "10", - "help": "Maximum number of 'bad' HTTP status codes within the period of time before IP is banned.", - "id": "bad-behavior-threshold", - "label": "Threshold", - "regex": "^[1-9][0-9]*", - "type": "text", - "pattern": "^[1-9][0-9]*", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "30", - "name": "Threshold", - "prev_value": "10", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Maximum number of 'bad' HTTP status codes within the period of time before IP is banned." - } - ], - "method": "default", - "containerClass": "z-2" - }, - "BAD_BEHAVIOR_COUNT_TIME": { - "context": "multisite", - "default": "60", - "help": "Period of time (in seconds) during which we count 'bad' HTTP status codes.", - "id": "bad-behavior-period", - "label": "Period (in seconds)", - "regex": "^\\d+", - "type": "text", - "pattern": "^\\d+", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "60", - "name": "Period (in seconds)", - "prev_value": "60", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Period of time (in seconds) during which we count 'bad' HTTP status codes." - } - ], - "method": "default", - "containerClass": "z-1" - }, - "BAD_BEHAVIOR_BAN_TIME": { - "context": "multisite", - "default": "86400", - "help": "The duration time (in seconds) of a ban when the corresponding IP has reached the threshold.", - "id": "bad-behavior-ban-time", - "label": "Ban duration (in seconds)", - "regex": "^\\d+", - "type": "text", - "pattern": "^\\d+", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "3600", - "name": "Ban duration (in seconds)", - "prev_value": "86400", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "The duration time (in seconds) of a ban when the corresponding IP has reached the threshold." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "blacklist", - "stream": "partial", - "name": "Blacklist", - "description": "Deny access based on internal and external IP/network/rDNS/ASN blacklists.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": true, - "settings": { - "USE_BLACKLIST": { - "context": "multisite", - "default": "yes", - "help": "Activate blacklist feature.", - "id": "use-blacklist", - "label": "Activate blacklisting", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": true, - "value": "no", - "name": "Activate blacklisting", - "prev_value": "yes", - "popovers": [ - { - "iconName": "trespass", - "text": "inp_popover_method_disabled" - }, - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Activate blacklist feature." - } - ], - "method": "scheduler", - "containerClass": "z-11" - }, - "BLACKLIST_IP": { - "context": "multisite", - "default": "", - "help": "List of IP/network, separated with spaces, to block.", - "id": "blacklist-ip", - "label": "Blacklist IP/network", - "regex": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "type": "text", - "pattern": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Blacklist IP/network", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of IP/network, separated with spaces, to block." - } - ], - "method": "default", - "containerClass": "z-10" - }, - "BLACKLIST_RDNS": { - "context": "multisite", - "default": ".shodan.io .censys.io", - "help": "List of reverse DNS suffixes, separated with spaces, to block.", - "id": "blacklist-rdns", - "label": "Blacklist reverse DNS", - "regex": "^( *(([^ ]+)(?!.*\\3( |$))) *)*$", - "type": "text", - "pattern": "^( *(([^ ]+)(?!.*\\3( |$))) *)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": ".shodan.io .censys.io", - "name": "Blacklist reverse DNS", - "prev_value": ".shodan.io .censys.io", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of reverse DNS suffixes, separated with spaces, to block." - } - ], - "method": "default", - "containerClass": "z-9" - }, - "BLACKLIST_RDNS_GLOBAL": { - "context": "multisite", - "default": "yes", - "help": "Only perform RDNS blacklist checks on global IP addresses.", - "id": "blacklist-rdns-global", - "label": "Blacklist reverse DNS global IPs", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "Blacklist reverse DNS global IPs", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Only perform RDNS blacklist checks on global IP addresses." - } - ], - "method": "default", - "containerClass": "z-8" - }, - "BLACKLIST_ASN": { - "context": "multisite", - "default": "", - "help": "List of ASN numbers, separated with spaces, to block.", - "id": "blacklist-asn", - "label": "Blacklist ASN", - "regex": "^^( *((ASN?)?(\\d+)\\b(?!.*[SN ]\\4\\b)) *)*$", - "type": "text", - "pattern": "^^( *((ASN?)?(\\d+)\\b(?!.*[SN ]\\4\\b)) *)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Blacklist ASN", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of ASN numbers, separated with spaces, to block." - } - ], - "method": "default", - "containerClass": "z-7" - }, - "BLACKLIST_USER_AGENT": { - "context": "multisite", - "default": "", - "help": "List of User-Agent (PCRE regex), separated with spaces, to block.", - "id": "blacklist-user-agent", - "label": "Blacklist User-Agent", - "regex": "^.*$", - "type": "text", - "pattern": "^.*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Blacklist User-Agent", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of User-Agent (PCRE regex), separated with spaces, to block." - } - ], - "method": "default", - "containerClass": "z-6" - }, - "BLACKLIST_URI": { - "context": "multisite", - "default": "", - "help": "List of URI (PCRE regex), separated with spaces, to block.", - "id": "blacklist-uri", - "label": "Blacklist URI", - "regex": "^( *(.*)(?!.*\\2(?!.)) *)*$", - "type": "text", - "pattern": "^( *(.*)(?!.*\\2(?!.)) *)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Blacklist URI", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of URI (PCRE regex), separated with spaces, to block." - } - ], - "method": "default", - "containerClass": "z-5" - }, - "BLACKLIST_IGNORE_IP": { - "context": "multisite", - "default": "", - "help": "List of IP/network, separated with spaces, to ignore in the blacklist.", - "id": "blacklist-ignore-ip", - "label": "Blacklist ignore IP/network", - "regex": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "type": "text", - "pattern": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Blacklist ignore IP/network", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of IP/network, separated with spaces, to ignore in the blacklist." - } - ], - "method": "default", - "containerClass": "z-4" - }, - "BLACKLIST_IGNORE_RDNS": { - "context": "multisite", - "default": "", - "help": "List of reverse DNS suffixes, separated with spaces, to ignore in the blacklist.", - "id": "blacklist-ignore-rdns", - "label": "Blacklist ignore reverse DNS", - "regex": "^( *(([^ ]+)(?!.*\\3( |$))) *)*$", - "type": "text", - "pattern": "^( *(([^ ]+)(?!.*\\3( |$))) *)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Blacklist ignore reverse DNS", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of reverse DNS suffixes, separated with spaces, to ignore in the blacklist." - } - ], - "method": "default", - "containerClass": "z-3" - }, - "BLACKLIST_IGNORE_ASN": { - "context": "multisite", - "default": "", - "help": "List of ASN numbers, separated with spaces, to ignore in the blacklist.", - "id": "blacklist-ignore-asn", - "label": "Blacklist ignore ASN", - "regex": "^^( *((ASN?)?(\\d+)\\b(?!.*[SN ]\\4\\b)) *)*$", - "type": "text", - "pattern": "^^( *((ASN?)?(\\d+)\\b(?!.*[SN ]\\4\\b)) *)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Blacklist ignore ASN", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of ASN numbers, separated with spaces, to ignore in the blacklist." - } - ], - "method": "default", - "containerClass": "z-2" - }, - "BLACKLIST_IGNORE_USER_AGENT": { - "context": "multisite", - "default": "", - "help": "List of User-Agent (PCRE regex), separated with spaces, to ignore in the blacklist.", - "id": "blacklist-ignore-user-agent", - "label": "Blacklist ignore User-Agent", - "regex": "^.*$", - "type": "text", - "pattern": "^.*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Blacklist ignore User-Agent", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of User-Agent (PCRE regex), separated with spaces, to ignore in the blacklist." - } - ], - "method": "default", - "containerClass": "z-1" - }, - "BLACKLIST_IGNORE_URI": { - "context": "multisite", - "default": "", - "help": "List of URI (PCRE regex), separated with spaces, to ignore in the blacklist.", - "id": "blacklist-ignore-uri", - "label": "Blacklist ignore URI", - "regex": "^( *(.*)(?!.*\\2(?!.)) *)*$", - "type": "text", - "pattern": "^( *(.*)(?!.*\\2(?!.)) *)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Blacklist ignore URI", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of URI (PCRE regex), separated with spaces, to ignore in the blacklist." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "brotli", - "stream": "no", - "name": "Brotli", - "description": "Compress HTTP requests with the brotli algorithm.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "USE_BROTLI": { - "context": "multisite", - "default": "no", - "help": "Use brotli", - "id": "use-brotli", - "label": "Use brotli", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Use brotli", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Use brotli" - } - ], - "method": "default", - "containerClass": "z-3" - }, - "BROTLI_TYPES": { - "context": "multisite", - "default": "application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml", - "help": "List of MIME types that will be compressed with brotli.", - "id": "brotli-types", - "label": "MIME types", - "regex": "^(?! )( ?([\\-\\w.]+/[\\-\\w.+]+)(?!.*\\2(?!.)))+$", - "type": "text", - "pattern": "^(?! )( ?([\\-\\w.]+/[\\-\\w.+]+)(?!.*\\2(?!.)))+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml", - "name": "MIME types", - "prev_value": "application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of MIME types that will be compressed with brotli." - } - ], - "method": "default", - "containerClass": "z-2" - }, - "BROTLI_MIN_LENGTH": { - "context": "multisite", - "default": "1000", - "help": "Minimum length for brotli compression.", - "id": "brotli-min-length", - "label": "Minimum length", - "regex": "^\\d+", - "type": "text", - "pattern": "^\\d+", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "1000", - "name": "Minimum length", - "prev_value": "1000", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Minimum length for brotli compression." - } - ], - "method": "default", - "containerClass": "z-1" - }, - "BROTLI_COMP_LEVEL": { - "context": "multisite", - "default": "6", - "help": "The compression level of the brotli algorithm.", - "id": "brotli-comp-level", - "label": "Compression level", - "regex": "^([02-9]|1[01]?)$", - "type": "select", - "pattern": "^([02-9]|1[01]?)$", - "inpType": "select", - "values": [ - "0", - "1", - "10", - "11", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9" - ], - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "6", - "name": "Compression level", - "prev_value": "6", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "The compression level of the brotli algorithm." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "bunkernet", - "stream": "yes", - "name": "BunkerNet", - "description": "Share threat data with other BunkerWeb instances via BunkerNet.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": true, - "settings": { - "USE_BUNKERNET": { - "context": "multisite", - "default": "yes", - "help": "Activate BunkerNet feature.", - "id": "use-bunkernet", - "label": "Activate BunkerNet", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": true, - "value": "no", - "name": "Activate BunkerNet", - "prev_value": "yes", - "popovers": [ - { - "iconName": "trespass", - "text": "inp_popover_method_disabled" - }, - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Activate BunkerNet feature." - } - ], - "method": "scheduler", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "cors", - "stream": "no", - "name": "CORS", - "description": "Cross-Origin Resource Sharing.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": true, - "settings": { - "USE_CORS": { - "context": "multisite", - "default": "no", - "help": "Use CORS", - "id": "use-cors", - "label": "Use CORS", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "Use CORS", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Use CORS" - } - ], - "method": "default", - "containerClass": "z-10" - }, - "CORS_ALLOW_ORIGIN": { - "context": "multisite", - "default": "*", - "help": "Allowed origins to make CORS requests : PCRE regex or *.", - "id": "cors-allow-origin", - "label": "Allowed origins", - "regex": "^.*$", - "type": "text", - "pattern": "^.*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "self", - "name": "Allowed origins", - "prev_value": "*", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Allowed origins to make CORS requests : PCRE regex or *." - } - ], - "method": "default", - "containerClass": "z-9" - }, - "CORS_ALLOW_METHODS": { - "context": "multisite", - "default": "GET, POST, OPTIONS", - "help": "Value of the Access-Control-Allow-Methods header.", - "id": "cors-allow-methods", - "label": "Access-Control-Allow-Methods value", - "regex": "^(\\*|(?![, ])(,? ?(GET|HEAD|POST|PUT|DELETE|CONNECT|OPTIONS|TRACE|PATCH)(?!.*\\3))*)?$", - "type": "text", - "pattern": "^(\\*|(?![, ])(,? ?(GET|HEAD|POST|PUT|DELETE|CONNECT|OPTIONS|TRACE|PATCH)(?!.*\\3))*)?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "GET, POST, OPTIONS", - "name": "Access-Control-Allow-Methods value", - "prev_value": "GET, POST, OPTIONS", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value of the Access-Control-Allow-Methods header." - } - ], - "method": "default", - "containerClass": "z-8" - }, - "CORS_ALLOW_HEADERS": { - "context": "multisite", - "default": "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range", - "help": "Value of the Access-Control-Allow-Headers header.", - "id": "cors-allow-headers", - "label": "Access-Control-Allow-Headers value", - "regex": "^(\\*|(?![, ])(,? ?([\\w\\-]+)(?!.*\\3(?!.)))*)?$", - "type": "text", - "pattern": "^(\\*|(?![, ])(,? ?([\\w\\-]+)(?!.*\\3(?!.)))*)?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range", - "name": "Access-Control-Allow-Headers value", - "prev_value": "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value of the Access-Control-Allow-Headers header." - } - ], - "method": "default", - "containerClass": "z-7" - }, - "CORS_ALLOW_CREDENTIALS": { - "context": "multisite", - "default": "no", - "help": "Send the Access-Control-Allow-Credentials header.", - "id": "cors-allow-credentials", - "label": "Send Access-Control-Allow-Credentials", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Send Access-Control-Allow-Credentials", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Send the Access-Control-Allow-Credentials header." - } - ], - "method": "default", - "containerClass": "z-6" - }, - "CORS_EXPOSE_HEADERS": { - "context": "multisite", - "default": "Content-Length,Content-Range", - "help": "Value of the Access-Control-Expose-Headers header.", - "id": "cors-expose-headers", - "label": "Access-Control-Expose-Headers value", - "regex": "^(\\*|(?![, ]+)(,? ?([\\w\\-]+)(?!.*\\3(?!.)))*)?$", - "type": "text", - "pattern": "^(\\*|(?![, ]+)(,? ?([\\w\\-]+)(?!.*\\3(?!.)))*)?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "Content-Length,Content-Range", - "name": "Access-Control-Expose-Headers value", - "prev_value": "Content-Length,Content-Range", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value of the Access-Control-Expose-Headers header." - } - ], - "method": "default", - "containerClass": "z-5" - }, - "CROSS_ORIGIN_OPENER_POLICY": { - "context": "multisite", - "default": "", - "help": "Value for the Cross-Origin-Opener-Policy header.", - "id": "cross-origin-opener-policy", - "label": "Cross-Origin-Opener-Policy", - "regex": "^(unsafe-none|same-origin-allow-popups|same-origin)?$", - "type": "select", - "pattern": "^(unsafe-none|same-origin-allow-popups|same-origin)?$", - "inpType": "select", - "values": [ - "", - "same-origin", - "same-origin-allow-popups", - "unsafe-none" - ], - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "same-origin", - "name": "Cross-Origin-Opener-Policy", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value for the Cross-Origin-Opener-Policy header." - } - ], - "method": "default", - "containerClass": "z-4" - }, - "CROSS_ORIGIN_EMBEDDER_POLICY": { - "context": "multisite", - "default": "", - "help": "Value for the Cross-Origin-Embedder-Policy header.", - "id": "cross-origin-embedder-policy", - "label": "Cross-Origin-Embedder-Policy", - "regex": "^(unsafe-none|require-corp|credentialless)?$", - "type": "select", - "pattern": "^(unsafe-none|require-corp|credentialless)?$", - "inpType": "select", - "values": [ - "", - "credentialless", - "require-corp", - "unsafe-none" - ], - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "require-corp", - "name": "Cross-Origin-Embedder-Policy", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value for the Cross-Origin-Embedder-Policy header." - } - ], - "method": "default", - "containerClass": "z-3" - }, - "CROSS_ORIGIN_RESOURCE_POLICY": { - "context": "multisite", - "default": "", - "help": "Value for the Cross-Origin-Resource-Policy header.", - "id": "cross-origin-resource-policy", - "label": "Cross-Origin-Resource-Policy", - "regex": "^(same-site|same-origin|cross-origin)?$", - "type": "select", - "pattern": "^(same-site|same-origin|cross-origin)?$", - "inpType": "select", - "values": [ - "", - "cross-origin", - "same-origin", - "same-site" - ], - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "same-site", - "name": "Cross-Origin-Resource-Policy", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value for the Cross-Origin-Resource-Policy header." - } - ], - "method": "default", - "containerClass": "z-2" - }, - "CORS_MAX_AGE": { - "context": "multisite", - "default": "86400", - "help": "Value of the Access-Control-Max-Age header.", - "id": "cors-max-age", - "label": "Access-Control-Max-Age value", - "regex": "^\\d+$", - "type": "text", - "pattern": "^\\d+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "86400", - "name": "Access-Control-Max-Age value", - "prev_value": "86400", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value of the Access-Control-Max-Age header." - } - ], - "method": "default", - "containerClass": "z-1" - }, - "CORS_DENY_REQUEST": { - "context": "multisite", - "default": "yes", - "help": "Deny request and don't send it to backend if Origin is not allowed.", - "id": "cors-deny-request", - "label": "Deny request", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "Deny request", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Deny request and don't send it to backend if Origin is not allowed." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "clientcache", - "stream": "no", - "name": "Client cache", - "description": "Manage caching for clients.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "USE_CLIENT_CACHE": { - "context": "multisite", - "default": "no", - "help": "Tell client to store locally static files.", - "id": "use-client-cache", - "label": "Use client cache", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": true, - "value": "yes", - "name": "Use client cache", - "prev_value": "no", - "popovers": [ - { - "iconName": "trespass", - "text": "inp_popover_method_disabled" - }, - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Tell client to store locally static files." - } - ], - "method": "scheduler", - "containerClass": "z-2" - }, - "CLIENT_CACHE_ETAG": { - "context": "multisite", - "default": "yes", - "help": "Send the HTTP ETag header for static resources.", - "id": "client-cache-etag", - "label": "ETag", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "ETag", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Send the HTTP ETag header for static resources." - } - ], - "method": "default", - "containerClass": "z-1" - }, - "CLIENT_CACHE_CONTROL": { - "context": "multisite", - "default": "public, max-age=15552000", - "help": "Value of the Cache-Control HTTP header.", - "id": "client-cache-control", - "label": "Cache-Control header", - "regex": "^(?!(, ?| ))((, )?(((max-age|s-maxage|stale-while-revalidate|stale-if-error)=\\d+(?!.*\\6))|((?!.*public)private|(?!.*private)public)|(must|proxy)-revalidate|must-understand|immutable|no-(cache|store|transform))(?!.*\\4))+$", - "type": "text", - "pattern": "^(?!(, ?| ))((, )?(((max-age|s-maxage|stale-while-revalidate|stale-if-error)=\\d+(?!.*\\6))|((?!.*public)private|(?!.*private)public)|(must|proxy)-revalidate|must-understand|immutable|no-(cache|store|transform))(?!.*\\4))+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "public, max-age=15552000", - "name": "Cache-Control header", - "prev_value": "public, max-age=15552000", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value of the Cache-Control HTTP header." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "country", - "stream": "yes", - "name": "Country", - "description": "Deny access based on the country of the client IP.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": true, - "settings": { - "BLACKLIST_COUNTRY": { - "context": "multisite", - "default": "", - "help": "Deny access if the country of the client is in the list (ISO 3166-1 alpha-2 format separated with spaces).", - "id": "country-blacklist", - "label": "Country blacklist", - "regex": "^(?! )( *([A-Z]{2})(?!.*\\2) *)*$", - "type": "text", - "pattern": "^(?! )( *([A-Z]{2})(?!.*\\2) *)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Country blacklist", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Deny access if the country of the client is in the list (ISO 3166-1 alpha-2 format separated with spaces)." - } - ], - "method": "default", - "containerClass": "z-1" - }, - "WHITELIST_COUNTRY": { - "context": "multisite", - "default": "", - "help": "Deny access if the country of the client is not in the list (ISO 3166-1 alpha-2 format separated with spaces).", - "id": "country-whitelist", - "label": "Country whitelist", - "regex": "^(?! )( *([A-Z]{2})(?!.*\\2) *)*$", - "type": "text", - "pattern": "^(?! )( *([A-Z]{2})(?!.*\\2) *)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Country whitelist", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Deny access if the country of the client is not in the list (ISO 3166-1 alpha-2 format separated with spaces)." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "customcert", - "stream": "yes", - "name": "Custom HTTPS certificate", - "description": "Choose custom certificate for HTTPS.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "USE_CUSTOM_SSL": { - "context": "multisite", - "default": "no", - "help": "Use custom HTTPS certificate.", - "id": "use-custom-https", - "label": "Use custom certificate", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Use custom certificate", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Use custom HTTPS certificate." - } - ], - "method": "default", - "containerClass": "z-4" - }, - "CUSTOM_SSL_CERT": { - "context": "multisite", - "default": "", - "help": "Full path of the certificate or bundle file (must be readable by the scheduler).", - "id": "custom-https-cert", - "label": "Certificate path", - "regex": "^(/[\\w. \\-]+)*/?$", - "type": "text", - "pattern": "^(/[\\w. \\-]+)*/?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Certificate path", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Full path of the certificate or bundle file (must be readable by the scheduler)." - } - ], - "method": "default", - "containerClass": "z-3" - }, - "CUSTOM_SSL_KEY": { - "context": "multisite", - "default": "", - "help": "Full path of the key file (must be readable by the scheduler).", - "id": "custom-https-key", - "label": "Key path", - "regex": "^(/[\\w. \\-]+)*/?$", - "type": "text", - "pattern": "^(/[\\w. \\-]+)*/?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Key path", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Full path of the key file (must be readable by the scheduler)." - } - ], - "method": "default", - "containerClass": "z-2" - }, - "CUSTOM_SSL_CERT_DATA": { - "context": "multisite", - "default": "", - "help": "Certificate data encoded in base64.", - "id": "custom-https-cert-data", - "label": "Certificate data (base64)", - "regex": "^.*$", - "type": "text", - "pattern": "^.*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Certificate data (base64)", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Certificate data encoded in base64." - } - ], - "method": "default", - "containerClass": "z-1" - }, - "CUSTOM_SSL_KEY_DATA": { - "context": "multisite", - "default": "", - "help": "Key data encoded in base64.", - "id": "custom-https-key-data", - "label": "Key data (base64)", - "regex": "^.*$", - "type": "text", - "pattern": "^.*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Key data (base64)", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Key data encoded in base64." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "dnsbl", - "stream": "yes", - "name": "DNSBL", - "description": "Deny access based on external DNSBL servers.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": true, - "settings": { - "USE_DNSBL": { - "context": "multisite", - "default": "yes", - "help": "Activate DNSBL feature.", - "id": "use-dnsbl", - "label": "Activate DNSBL", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Activate DNSBL", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Activate DNSBL feature." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "errors", - "stream": "no", - "name": "Errors", - "description": "Manage default error pages", - "version": "1.0", - "type": "core", - "method": "manual", - "page": true, - "settings": { - "ERRORS": { - "context": "multisite", - "default": "", - "help": "List of HTTP error code and corresponding error pages, separated with spaces (404=/my404.html 403=/errors/403.html ...).", - "id": "errors", - "label": "Errors", - "regex": "^(?! )( ?([1-5]\\d{2})(?!.*\\2(?![^=]))=(\\/[\\w\\].~:\\/?#\\[@!$\\&'\\(\\)*+,;=\\-]*)(?!.*\\3(?!.)))*$", - "type": "text", - "pattern": "^(?! )( ?([1-5]\\d{2})(?!.*\\2(?![^=]))=(\\/[\\w\\].~:\\/?#\\[@!$\\&'\\(\\)*+,;=\\-]*)(?!.*\\3(?!.)))*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Errors", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of HTTP error code and corresponding error pages, separated with spaces (404=/my404.html 403=/errors/403.html ...)." - } - ], - "method": "default", - "containerClass": "z-1" - }, - "INTERCEPTED_ERROR_CODES": { - "context": "multisite", - "default": "400 401 403 404 405 413 429 500 501 502 503 504", - "help": "List of HTTP error code intercepted by BunkerWeb", - "id": "intercepted-error-codes", - "label": "Intercepted error codes", - "regex": "^( *([1-5]\\d{2})(?!.*\\2) *)+$", - "type": "text", - "pattern": "^( *([1-5]\\d{2})(?!.*\\2) *)+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "400 401 403 404 405 413 429 500 501 502 503 504", - "name": "Intercepted error codes", - "prev_value": "400 401 403 404 405 413 429 500 501 502 503 504", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of HTTP error code intercepted by BunkerWeb" - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "greylist", - "stream": "partial", - "name": "Greylist", - "description": "Allow access while keeping security features based on internal and external IP/network/rDNS/ASN greylists.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": true, - "settings": { - "USE_GREYLIST": { - "context": "multisite", - "default": "no", - "help": "Activate greylist feature.", - "id": "use-greylist", - "label": "Activate greylisting", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Activate greylisting", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Activate greylist feature." - } - ], - "method": "default", - "containerClass": "z-6" - }, - "GREYLIST_IP": { - "context": "multisite", - "default": "", - "help": "List of IP/network, separated with spaces, to put into the greylist.", - "id": "greylist-ip", - "label": "Greylist IP/network", - "regex": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "type": "text", - "pattern": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Greylist IP/network", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of IP/network, separated with spaces, to put into the greylist." - } - ], - "method": "default", - "containerClass": "z-5" - }, - "GREYLIST_RDNS": { - "context": "multisite", - "default": "", - "help": "List of reverse DNS suffixes, separated with spaces, to put into the greylist.", - "id": "greylist-rdns", - "label": "Greylist reverse DNS", - "regex": "^( *(([^ ]+)(?!.*\\3( |$))) *)*$", - "type": "text", - "pattern": "^( *(([^ ]+)(?!.*\\3( |$))) *)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Greylist reverse DNS", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of reverse DNS suffixes, separated with spaces, to put into the greylist." - } - ], - "method": "default", - "containerClass": "z-4" - }, - "GREYLIST_RDNS_GLOBAL": { - "context": "multisite", - "default": "yes", - "help": "Only perform RDNS greylist checks on global IP addresses.", - "id": "greylist-rdns-global", - "label": "Greylist reverse DNS global IPs", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "Greylist reverse DNS global IPs", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Only perform RDNS greylist checks on global IP addresses." - } - ], - "method": "default", - "containerClass": "z-3" - }, - "GREYLIST_ASN": { - "context": "multisite", - "default": "", - "help": "List of ASN numbers, separated with spaces, to put into the greylist.", - "id": "greylist-asn", - "label": "Greylist ASN", - "regex": "^^( *((ASN?)?(\\d+)\\b(?!.*[SN ]\\4\\b)) *)*$", - "type": "text", - "pattern": "^^( *((ASN?)?(\\d+)\\b(?!.*[SN ]\\4\\b)) *)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Greylist ASN", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of ASN numbers, separated with spaces, to put into the greylist." - } - ], - "method": "default", - "containerClass": "z-2" - }, - "GREYLIST_USER_AGENT": { - "context": "multisite", - "default": "", - "help": "List of User-Agent (PCRE regex), separated with spaces, to put into the greylist.", - "id": "greylist-user-agent", - "label": "Greylist User-Agent", - "regex": "^.*$", - "type": "text", - "pattern": "^.*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Greylist User-Agent", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of User-Agent (PCRE regex), separated with spaces, to put into the greylist." - } - ], - "method": "default", - "containerClass": "z-1" - }, - "GREYLIST_URI": { - "context": "multisite", - "default": "", - "help": "List of URI (PCRE regex), separated with spaces, to put into the greylist.", - "id": "greylist-uri", - "label": "Greylist URI", - "regex": "^.*$", - "type": "text", - "pattern": "^.*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Greylist URI", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of URI (PCRE regex), separated with spaces, to put into the greylist." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "gzip", - "stream": "no", - "name": "Gzip", - "description": "Compress HTTP requests with the gzip algorithm.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "USE_GZIP": { - "context": "multisite", - "default": "no", - "help": "Use gzip", - "id": "use-gzip", - "label": "Use gzip", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": true, - "value": "yes", - "name": "Use gzip", - "prev_value": "no", - "popovers": [ - { - "iconName": "trespass", - "text": "inp_popover_method_disabled" - }, - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Use gzip" - } - ], - "method": "scheduler", - "containerClass": "z-4" - }, - "GZIP_TYPES": { - "context": "multisite", - "default": "application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml", - "help": "List of MIME types that will be compressed with gzip.", - "id": "gzip-types", - "label": "MIME types", - "regex": "^(?! )( ?([\\-\\w.]+/[\\-\\w.+]+)(?!.*\\2(?!.)))+$", - "type": "text", - "pattern": "^(?! )( ?([\\-\\w.]+/[\\-\\w.+]+)(?!.*\\2(?!.)))+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml", - "name": "MIME types", - "prev_value": "application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of MIME types that will be compressed with gzip." - } - ], - "method": "default", - "containerClass": "z-3" - }, - "GZIP_MIN_LENGTH": { - "context": "multisite", - "default": "1000", - "help": "Minimum length for gzip compression.", - "id": "gzip-min-length", - "label": "Minimum length", - "regex": "^\\d+$", - "type": "text", - "pattern": "^\\d+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "1000", - "name": "Minimum length", - "prev_value": "1000", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Minimum length for gzip compression." - } - ], - "method": "default", - "containerClass": "z-2" - }, - "GZIP_COMP_LEVEL": { - "context": "multisite", - "default": "5", - "help": "The compression level of the gzip algorithm.", - "id": "gzip-comp-level", - "label": "Compression level", - "regex": "^[1-9]$", - "type": "select", - "pattern": "^[1-9]$", - "inpType": "select", - "values": ["1", "2", "3", "4", "5", "6", "7", "8", "9"], - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "5", - "name": "Compression level", - "prev_value": "5", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "The compression level of the gzip algorithm." - } - ], - "method": "default", - "containerClass": "z-1" - }, - "GZIP_PROXIED": { - "context": "multisite", - "default": "no-cache no-store private expired auth", - "help": "Which kind of proxied requests we should compress.", - "id": "gzip-proxied", - "label": "Proxied requests", - "regex": "^.*$", - "type": "text", - "pattern": "^.*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no-cache no-store private expired auth", - "name": "Proxied requests", - "prev_value": "no-cache no-store private expired auth", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Which kind of proxied requests we should compress." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "inject", - "stream": "no", - "name": "HTML injection", - "description": "Inject custom HTML code before the tag.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "INJECT_BODY": { - "context": "multisite", - "default": "", - "help": "The HTML code to inject.", - "id": "inject-body", - "label": "HTML code", - "regex": "^.*$", - "type": "text", - "pattern": "^.*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "HTML code", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "The HTML code to inject." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "headers", - "stream": "no", - "name": "Headers", - "description": "Manage HTTP headers sent to clients.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "REMOVE_HEADERS": { - "context": "multisite", - "default": "Server Expect-CT X-Powered-By X-AspNet-Version X-AspNetMvc-Version", - "help": "Headers to remove (Header1 Header2 Header3 ...)", - "id": "remove-headers", - "label": "Remove headers", - "regex": "^(?! )( ?[\\w\\-]+)*$", - "type": "text", - "pattern": "^(?! )( ?[\\w\\-]+)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "Server Expect-CT X-Powered-By X-AspNet-Version X-AspNetMvc-Version Public-Key-Pins", - "name": "Remove headers", - "prev_value": "Server Expect-CT X-Powered-By X-AspNet-Version X-AspNetMvc-Version", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Headers to remove (Header1 Header2 Header3 ...)" - } - ], - "method": "default", - "containerClass": "z-12" - }, - "KEEP_UPSTREAM_HEADERS": { - "context": "multisite", - "default": "Content-Security-Policy Permissions-Policy Feature-Policy X-Frame-Options", - "help": "Headers to keep from upstream (Header1 Header2 Header3 ... or * for all).", - "id": "keep-upstream-headers", - "label": "Keep upstream headers", - "regex": "^((?! )( ?[\\w\\-]+)+|\\*)?$", - "type": "text", - "pattern": "^((?! )( ?[\\w\\-]+)+|\\*)?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "Content-Security-Policy Permissions-Policy X-Frame-Options", - "name": "Keep upstream headers", - "prev_value": "Content-Security-Policy Permissions-Policy Feature-Policy X-Frame-Options", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Headers to keep from upstream (Header1 Header2 Header3 ... or * for all)." - } - ], - "method": "default", - "containerClass": "z-11" - }, - "STRICT_TRANSPORT_SECURITY": { - "context": "multisite", - "default": "max-age=31536000", - "help": "Value for the Strict-Transport-Security header.", - "id": "strict-transport-security", - "label": "Strict-Transport-Security", - "regex": "^max-age=\\d+(; includeSubDomains(; preload)?)?$", - "type": "text", - "pattern": "^max-age=\\d+(; includeSubDomains(; preload)?)?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "max-age=31536000; includeSubDomains; preload", - "name": "Strict-Transport-Security", - "prev_value": "max-age=31536000", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value for the Strict-Transport-Security header." - } - ], - "method": "default", - "containerClass": "z-10" - }, - "COOKIE_AUTO_SECURE_FLAG": { - "context": "multisite", - "default": "yes", - "help": "Automatically add the Secure flag to all cookies.", - "id": "cookie-auto-secure-flag", - "label": "Cookie auto Secure flag", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "Cookie auto Secure flag", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Automatically add the Secure flag to all cookies." - } - ], - "method": "default", - "containerClass": "z-8" - }, - "CONTENT_SECURITY_POLICY": { - "context": "multisite", - "default": "object-src 'none'; form-action 'self'; frame-ancestors 'self';", - "help": "Value for the Content-Security-Policy header.", - "id": "content-security-policy", - "label": "Content-Security-Policy", - "regex": "^.*$", - "type": "text", - "pattern": "^.*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Content-Security-Policy", - "prev_value": "object-src 'none'; form-action 'self'; frame-ancestors 'self';", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value for the Content-Security-Policy header." - } - ], - "method": "default", - "containerClass": "z-7" - }, - "CONTENT_SECURITY_POLICY_REPORT_ONLY": { - "context": "multisite", - "default": "no", - "help": "Send reports for violations of the Content-Security-Policy header instead of blocking them.", - "id": "content-security-policy-report-only", - "label": "Content-Security-Policy-Report-Only", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Content-Security-Policy-Report-Only", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Send reports for violations of the Content-Security-Policy header instead of blocking them." - } - ], - "method": "default", - "containerClass": "z-6" - }, - "REFERRER_POLICY": { - "context": "multisite", - "default": "strict-origin-when-cross-origin", - "help": "Value for the Referrer-Policy header.", - "id": "referrer-policy", - "label": "Referrer-Policy", - "regex": "^(?!^(,| ))((, )?(no-referrer-when-downgrade|no-referrer|origin-when-cross-origin|same-origin|strict-origin-when-cross-origin|strict-origin|origin|unsafe-url)(?!\\b.*, \\4\\b))*$", - "type": "text", - "pattern": "^(?!^(,| ))((, )?(no-referrer-when-downgrade|no-referrer|origin-when-cross-origin|same-origin|strict-origin-when-cross-origin|strict-origin|origin|unsafe-url)(?!\\b.*, \\4\\b))*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no-referrer-when-downgrade", - "name": "Referrer-Policy", - "prev_value": "strict-origin-when-cross-origin", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value for the Referrer-Policy header." - } - ], - "method": "default", - "containerClass": "z-5" - }, - "PERMISSIONS_POLICY": { - "context": "multisite", - "default": "accelerometer=(), ambient-light-sensor=(), autoplay=(), battery=(), camera=(), cross-origin-isolated=(), display-capture=(), document-domain=(), encrypted-media=(), execution-while-not-rendered=(), execution-while-out-of-viewport=(), fullscreen=(), geolocation=(), gyroscope=(), hid=(), idle-detection=(), magnetometer=(), microphone=(), midi=(), navigation-override=(), payment=(), picture-in-picture=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), usb=(), web-share=(), xr-spatial-tracking=()", - "help": "Value for the Permissions-Policy header.", - "id": "permissions-policy", - "label": "Permissions-Policy", - "regex": "^(?![, ])(,? ?([a-z\\-]+)(?!.*[^\\-]\\2=)=(\\*|\\(( ?(self|\\u0022https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*\\u0022)(?=[ \\)]))*\\)))*$", - "type": "text", - "pattern": "^(?![, ])(,? ?([a-z\\-]+)(?!.*[^\\-]\\2=)=(\\*|\\(( ?(self|\\u0022https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*\\u0022)(?=[ \\)]))*\\)))*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), battery=(), bluetooth=(), browsing-topics=(), camera=(), compute-pressure=(), display-capture=(), document-domain=(), encrypted-media=(), execution-while-not-rendered=(), execution-while-out-of-viewport=(), fullscreen=(), gamepad=(), geolocation=(), gyroscope=(), hid=(), identity-credentials-get=(), idle-detection=(), local-fonts=(), magnetometer=(), microphone=(), midi=(), otp-credentials=(), payment=(), picture-in-picture=(), publickey-credentials-create=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), speaker-selection=(), storage-access=(), usb=(), web-share=(), window-management=(), xr-spatial-tracking=()", - "name": "Permissions-Policy", - "prev_value": "accelerometer=(), ambient-light-sensor=(), autoplay=(), battery=(), camera=(), cross-origin-isolated=(), display-capture=(), document-domain=(), encrypted-media=(), execution-while-not-rendered=(), execution-while-out-of-viewport=(), fullscreen=(), geolocation=(), gyroscope=(), hid=(), idle-detection=(), magnetometer=(), microphone=(), midi=(), navigation-override=(), payment=(), picture-in-picture=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), usb=(), web-share=(), xr-spatial-tracking=()", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value for the Permissions-Policy header." - } - ], - "method": "default", - "containerClass": "z-4" - }, - "FEATURE_POLICY": { - "context": "multisite", - "default": "accelerometer 'none'; ambient-light-sensor 'none'; autoplay 'none'; battery 'none'; camera 'none'; display-capture 'none'; document-domain 'none'; encrypted-media 'none'; execution-while-not-rendered 'none'; execution-while-out-of-viewport 'none'; fullscreen 'none'; geolocation 'none'; gyroscope 'none'; layout-animation 'none'; legacy-image-formats 'none'; magnetometer 'none'; microphone 'none'; midi 'none'; navigation-override 'none'; payment 'none'; picture-in-picture 'none'; publickey-credentials-get 'none'; speaker-selection 'none'; sync-xhr 'none'; unoptimized-images 'none'; unsized-media 'none'; usb 'none'; screen-wake-lock 'none'; web-share 'none'; xr-spatial-tracking 'none';", - "help": "Value for the Feature-Policy header.", - "id": "feature-policy", - "label": "Feature-Policy", - "regex": "^(?![; ])( ?([\\w\\-]+)(?!.*[^\\-]\\2 )( ('(none|self|strict-dynamic|report-sample|unsafe-inline|unsafe-eval|unsafe-hashes|unsafe-allow-redirects)'|https?:\\/\\/[\\w@:%.+~#=\\-]+[\\w\\(\\)!@:%+.~#?&\\/=$\\-]*))+;)*$", - "type": "text", - "pattern": "^(?![; ])( ?([\\w\\-]+)(?!.*[^\\-]\\2 )( ('(none|self|strict-dynamic|report-sample|unsafe-inline|unsafe-eval|unsafe-hashes|unsafe-allow-redirects)'|https?:\\/\\/[\\w@:%.+~#=\\-]+[\\w\\(\\)!@:%+.~#?&\\/=$\\-]*))+;)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "accelerometer 'none'; ambient-light-sensor 'none'; autoplay 'none'; battery 'none'; camera 'none'; display-capture 'none'; document-domain 'none'; encrypted-media 'none'; execution-while-not-rendered 'none'; execution-while-out-of-viewport 'none'; fullscreen 'none'; geolocation 'none'; gyroscope 'none'; layout-animation 'none'; legacy-image-formats 'none'; magnetometer 'none'; microphone 'none'; midi 'none'; navigation-override 'none'; payment 'none'; picture-in-picture 'none'; publickey-credentials-get 'none'; speaker-selection 'none'; sync-xhr 'none'; unoptimized-images 'none'; unsized-media 'none'; usb 'none'; screen-wake-lock 'none'; web-share 'none'; xr-spatial-tracking 'none';", - "name": "Feature-Policy", - "prev_value": "accelerometer 'none'; ambient-light-sensor 'none'; autoplay 'none'; battery 'none'; camera 'none'; display-capture 'none'; document-domain 'none'; encrypted-media 'none'; execution-while-not-rendered 'none'; execution-while-out-of-viewport 'none'; fullscreen 'none'; geolocation 'none'; gyroscope 'none'; layout-animation 'none'; legacy-image-formats 'none'; magnetometer 'none'; microphone 'none'; midi 'none'; navigation-override 'none'; payment 'none'; picture-in-picture 'none'; publickey-credentials-get 'none'; speaker-selection 'none'; sync-xhr 'none'; unoptimized-images 'none'; unsized-media 'none'; usb 'none'; screen-wake-lock 'none'; web-share 'none'; xr-spatial-tracking 'none';", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value for the Feature-Policy header." - } - ], - "method": "ui", - "containerClass": "z-3" - }, - "X_FRAME_OPTIONS": { - "context": "multisite", - "default": "SAMEORIGIN", - "help": "Value for the X-Frame-Options header.", - "id": "x-frame-options", - "label": "X-Frame-Options", - "regex": "^(DENY|SAMEORIGIN)?$", - "type": "select", - "pattern": "^(DENY|SAMEORIGIN)?$", - "inpType": "select", - "values": ["", "DENY", "SAMEORIGIN"], - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "SAMEORIGIN", - "name": "X-Frame-Options", - "prev_value": "SAMEORIGIN", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value for the X-Frame-Options header." - } - ], - "method": "default", - "containerClass": "z-2" - }, - "X_CONTENT_TYPE_OPTIONS": { - "context": "multisite", - "default": "nosniff", - "help": "Value for the X-Content-Type-Options header.", - "id": "x-content-type-options", - "label": "X-Content-Type-Options", - "regex": "^(nosniff)?$", - "type": "select", - "pattern": "^(nosniff)?$", - "inpType": "select", - "values": ["", "nosniff"], - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "nosniff", - "name": "X-Content-Type-Options", - "prev_value": "nosniff", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value for the X-Content-Type-Options header." - } - ], - "method": "default", - "containerClass": "z-1" - }, - "X_XSS_PROTECTION": { - "context": "multisite", - "default": "1; mode=block", - "help": "Value for the X-XSS-Protection header.", - "id": "x-xss-protection", - "label": "X-XSS-Protection", - "regex": "^0|1(; (mode=block|report=https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*))?$", - "type": "text", - "pattern": "^0|1(; (mode=block|report=https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*))?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "1; mode=block", - "name": "X-XSS-Protection", - "prev_value": "1; mode=block", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value for the X-XSS-Protection header." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null, - "multiples_schema": { - "custom-headers": { - "CUSTOM_HEADER": { - "context": "multisite", - "default": "", - "help": "Custom header to add (HeaderName: HeaderValue).", - "id": "custom-header", - "label": "Custom header (HeaderName: HeaderValue)", - "regex": "^([\\w\\-]+: .+)?$", - "type": "text", - "multiple": "custom-headers", - "pattern": "^([\\w\\-]+: .+)?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Custom header (HeaderName: HeaderValue)", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Custom header to add (HeaderName: HeaderValue)." - } - ], - "containerClass": "z-13" - } - }, - "cookie-flags": { - "COOKIE_FLAGS": { - "context": "multisite", - "default": "* HttpOnly SameSite=Lax", - "help": "Cookie flags automatically added to all cookies (value accepted for nginx_cookie_flag_module).", - "id": "cookie-flags", - "label": "Cookie flags", - "regex": "^(\\*|[^;]+)( (HttpOnly|(SameSite)(?!.*\\4)(=(Lax|Strict))?)(?!.*\\3))*$", - "type": "text", - "multiple": "cookie-flags", - "pattern": "^(\\*|[^;]+)( (HttpOnly|(SameSite)(?!.*\\4)(=(Lax|Strict))?)(?!.*\\3))*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "* HttpOnly SameSite=Lax", - "name": "Cookie flags", - "prev_value": "* HttpOnly SameSite=Lax", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Cookie flags automatically added to all cookies (value accepted for nginx_cookie_flag_module)." - } - ], - "containerClass": "z-12" - } - } - }, - "multiples": { - "custom-headers": { - "0": { - "CUSTOM_HEADER": { - "context": "multisite", - "default": "", - "help": "Custom header to add (HeaderName: HeaderValue).", - "id": "custom-header", - "label": "Custom header (HeaderName: HeaderValue)", - "regex": "^([\\w\\-]+: .+)?$", - "type": "text", - "multiple": "custom-headers", - "pattern": "^([\\w\\-]+: .+)?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Custom header (HeaderName: HeaderValue)", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Custom header to add (HeaderName: HeaderValue)." - } - ], - "containerClass": "z-13", - "method": "default" - } - }, - "2": { - "CUSTOM_HEADER_2": { - "context": "multisite", - "default": "", - "help": "Custom header to add (HeaderName: HeaderValue).", - "id": "custom-header-2", - "label": "Custom header (HeaderName: HeaderValue)", - "regex": "^([\\w\\-]+: .+)?$", - "type": "text", - "multiple": "custom-headers", - "pattern": "^([\\w\\-]+: .+)?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "dzdz", - "name": "Custom header (HeaderName: HeaderValue)", - "prev_value": "dzdz", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Custom header to add (HeaderName: HeaderValue)." - } - ], - "containerClass": "z-13", - "method": "default" - } - } - }, - "cookie-flags": { - "0": { - "COOKIE_FLAGS": { - "context": "multisite", - "default": "* HttpOnly SameSite=Lax", - "help": "Cookie flags automatically added to all cookies (value accepted for nginx_cookie_flag_module).", - "id": "cookie-flags", - "label": "Cookie flags", - "regex": "^(\\*|[^;]+)( (HttpOnly|(SameSite)(?!.*\\4)(=(Lax|Strict))?)(?!.*\\3))*$", - "type": "text", - "multiple": "cookie-flags", - "pattern": "^(\\*|[^;]+)( (HttpOnly|(SameSite)(?!.*\\4)(=(Lax|Strict))?)(?!.*\\3))*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "* HttpOnly SameSite=Lax", - "name": "Cookie flags", - "prev_value": "* HttpOnly SameSite=Lax", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Cookie flags automatically added to all cookies (value accepted for nginx_cookie_flag_module)." - } - ], - "containerClass": "z-12", - "method": "default" - } - } - } - } - }, - { - "id": "letsencrypt", - "stream": "yes", - "name": "Let's Encrypt", - "description": "Automatic creation, renewal and configuration of Let's Encrypt certificates.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "AUTO_LETS_ENCRYPT": { - "context": "multisite", - "default": "no", - "help": "Activate automatic Let's Encrypt mode.", - "id": "auto-lets-encrypt", - "label": "Automatic Let's Encrypt", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "Automatic Let's Encrypt", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Activate automatic Let's Encrypt mode." - } - ], - "method": "default", - "containerClass": "z-2" - }, - "EMAIL_LETS_ENCRYPT": { - "context": "multisite", - "default": "", - "help": "Email used for Let's Encrypt notification and in certificate.", - "id": "email-lets-encrypt", - "label": "Email Let's Encrypt", - "regex": "^([^@ \\t\\r\\n]+@[^@ \\t\\r\\n]+\\.[^@ \\t\\r\\n]+)?$", - "type": "text", - "pattern": "^([^@ \\t\\r\\n]+@[^@ \\t\\r\\n]+\\.[^@ \\t\\r\\n]+)?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Email Let's Encrypt", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Email used for Let's Encrypt notification and in certificate." - } - ], - "method": "default", - "containerClass": "z-1" - }, - "USE_LETS_ENCRYPT_STAGING": { - "context": "multisite", - "default": "no", - "help": "Use the staging environment for Let\u2019s Encrypt certificate generation. Useful when you are testing your deployments to avoid being rate limited in the production environment.", - "id": "use-lets-encrypt-staging", - "label": "Use Let's Encrypt Staging", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Use Let's Encrypt Staging", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Use the staging environment for Let\u2019s Encrypt certificate generation. Useful when you are testing your deployments to avoid being rate limited in the production environment." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "limit", - "stream": "partial", - "name": "Limit", - "description": "Limit maximum number of requests and connections.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": true, - "settings": { - "USE_LIMIT_REQ": { - "context": "multisite", - "default": "yes", - "help": "Activate limit requests feature.", - "id": "use-limit-req", - "label": "Activate limit requests", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "Activate limit requests", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Activate limit requests feature." - } - ], - "method": "default", - "containerClass": "z-6" - }, - "USE_LIMIT_CONN": { - "context": "multisite", - "default": "yes", - "help": "Activate limit connections feature.", - "id": "use-limit-conn", - "label": "Activate limit connections", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "Activate limit connections", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Activate limit connections feature." - } - ], - "method": "default", - "containerClass": "z-3" - }, - "LIMIT_CONN_MAX_HTTP1": { - "context": "multisite", - "default": "10", - "help": "Maximum number of connections per IP when using HTTP/1.X protocol.", - "id": "limit-conn-max-http1", - "label": "Maximum number of HTTP/1.X connections", - "regex": "^\\d+$", - "type": "text", - "pattern": "^\\d+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "25", - "name": "Maximum number of HTTP/1.X connections", - "prev_value": "10", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Maximum number of connections per IP when using HTTP/1.X protocol." - } - ], - "method": "default", - "containerClass": "z-2" - }, - "LIMIT_CONN_MAX_HTTP2": { - "context": "multisite", - "default": "100", - "help": "Maximum number of streams per IP when using HTTP/2 protocol.", - "id": "limit-conn-max-http2", - "label": "Maximum number of HTTP/2 streams", - "regex": "^\\d+$", - "type": "text", - "pattern": "^\\d+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "200", - "name": "Maximum number of HTTP/2 streams", - "prev_value": "100", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Maximum number of streams per IP when using HTTP/2 protocol." - } - ], - "method": "default", - "containerClass": "z-1" - }, - "LIMIT_CONN_MAX_STREAM": { - "context": "multisite", - "default": "10", - "help": "Maximum number of connections per IP when using stream.", - "id": "limit-conn-max-stream", - "label": "Maximum number of stream connections", - "regex": "^\\d+$", - "type": "text", - "pattern": "^\\d+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "10", - "name": "Maximum number of stream connections", - "prev_value": "10", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Maximum number of connections per IP when using stream." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null, - "multiples_schema": { - "limit-req": { - "LIMIT_REQ_URL": { - "context": "multisite", - "default": "/", - "help": "URL (PCRE regex) where the limit request will be applied or special value / for all requests.", - "id": "limit-req-url", - "label": "Limit request URL", - "regex": "^.+$", - "type": "text", - "multiple": "limit-req", - "pattern": "^.+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "/", - "name": "Limit request URL", - "prev_value": "/", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "URL (PCRE regex) where the limit request will be applied or special value / for all requests." - } - ], - "containerClass": "z-6" - }, - "LIMIT_REQ_RATE": { - "context": "multisite", - "default": "2r/s", - "help": "Rate to apply to the URL (s for second, m for minute, h for hour and d for day).", - "id": "limit-req-rate", - "label": "Limit request Rate", - "regex": "^\\d+r/[smhd]$", - "type": "text", - "multiple": "limit-req", - "pattern": "^\\d+r/[smhd]$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "2r/s", - "name": "Limit request Rate", - "prev_value": "2r/s", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Rate to apply to the URL (s for second, m for minute, h for hour and d for day)." - } - ], - "containerClass": "z-5" - } - } - }, - "multiples": { - "limit-req": { - "0": { - "LIMIT_REQ_URL": { - "context": "multisite", - "default": "/", - "help": "URL (PCRE regex) where the limit request will be applied or special value / for all requests.", - "id": "limit-req-url", - "label": "Limit request URL", - "regex": "^.+$", - "type": "text", - "multiple": "limit-req", - "pattern": "^.+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "/", - "name": "Limit request URL", - "prev_value": "/", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "URL (PCRE regex) where the limit request will be applied or special value / for all requests." - } - ], - "containerClass": "z-6", - "method": "default" - }, - "LIMIT_REQ_RATE": { - "context": "multisite", - "default": "2r/s", - "help": "Rate to apply to the URL (s for second, m for minute, h for hour and d for day).", - "id": "limit-req-rate", - "label": "Limit request Rate", - "regex": "^\\d+r/[smhd]$", - "type": "text", - "multiple": "limit-req", - "pattern": "^\\d+r/[smhd]$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "2r/s", - "name": "Limit request Rate", - "prev_value": "2r/s", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Rate to apply to the URL (s for second, m for minute, h for hour and d for day)." - } - ], - "containerClass": "z-5", - "method": "default" - } - } - } - } - }, - { - "id": "metrics", - "stream": "partial", - "name": "Metrics", - "description": "Metrics collection and retrieve.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "USE_METRICS": { - "context": "multisite", - "default": "yes", - "help": "Enable collection and retrieval of internal metrics.", - "id": "use-metrics", - "label": "Use metrics", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "Use metrics", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable collection and retrieval of internal metrics." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "misc", - "stream": "partial", - "name": "Miscellaneous", - "description": "Miscellaneous settings.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": true, - "settings": { - "REDIRECT_HTTP_TO_HTTPS": { - "context": "multisite", - "default": "no", - "help": "Redirect all HTTP request to HTTPS.", - "id": "redirect-http-to-https", - "label": "Redirect HTTP to HTTPS", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Redirect HTTP to HTTPS", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Redirect all HTTP request to HTTPS." - } - ], - "method": "default", - "containerClass": "z-15" - }, - "AUTO_REDIRECT_HTTP_TO_HTTPS": { - "context": "multisite", - "default": "yes", - "help": "Try to detect if HTTPS is used and activate HTTP to HTTPS redirection if that's the case.", - "id": "auto-redirect-http-to-https", - "label": "Auto redirect HTTP to HTTPS", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "Auto redirect HTTP to HTTPS", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Try to detect if HTTPS is used and activate HTTP to HTTPS redirection if that's the case." - } - ], - "method": "default", - "containerClass": "z-14" - }, - "ALLOWED_METHODS": { - "context": "multisite", - "default": "GET|POST|HEAD", - "help": "Allowed HTTP and WebDAV methods, separated with pipes to be sent by clients.", - "id": "allowed-methods", - "label": "Allowed methods", - "regex": "^(?!\\|)(\\|?([A-Z]{3,})(?!.*(^|\\|)\\2))+$", - "type": "text", - "pattern": "^(?!\\|)(\\|?([A-Z]{3,})(?!.*(^|\\|)\\2))+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "GET|POST|HEAD|OPTIONS|PUT|DELETE|PATCH", - "name": "Allowed methods", - "prev_value": "GET|POST|HEAD", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Allowed HTTP and WebDAV methods, separated with pipes to be sent by clients." - } - ], - "method": "default", - "containerClass": "z-13" - }, - "MAX_CLIENT_SIZE": { - "context": "multisite", - "default": "10m", - "help": "Maximum body size (0 for infinite).", - "id": "max-client-size", - "label": "Maximum body size", - "regex": "^\\d+[kKmMgG]?$", - "type": "text", - "pattern": "^\\d+[kKmMgG]?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "100m", - "name": "Maximum body size", - "prev_value": "10m", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Maximum body size (0 for infinite)." - } - ], - "method": "default", - "containerClass": "z-12" - }, - "SERVE_FILES": { - "context": "multisite", - "default": "yes", - "help": "Serve files from the local folder.", - "id": "serve-files", - "label": "Serve files", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": true, - "value": "no", - "name": "Serve files", - "prev_value": "yes", - "popovers": [ - { - "iconName": "trespass", - "text": "inp_popover_method_disabled" - }, - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Serve files from the local folder." - } - ], - "method": "scheduler", - "containerClass": "z-11" - }, - "ROOT_FOLDER": { - "context": "multisite", - "default": "", - "help": "Root folder containing files to serve (/var/www/html/{server_name} if unset).", - "id": "root-folder", - "label": "Root folder", - "regex": "^(/[\\w. \\-]+)*/?$", - "type": "text", - "pattern": "^(/[\\w. \\-]+)*/?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Root folder", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Root folder containing files to serve (/var/www/html/{server_name} if unset)." - } - ], - "method": "default", - "containerClass": "z-10" - }, - "SSL_PROTOCOLS": { - "context": "multisite", - "default": "TLSv1.2 TLSv1.3", - "help": "The supported version of TLS. We recommend the default value TLSv1.2 TLSv1.3 for compatibility reasons.", - "id": "https-protocols", - "label": "HTTPS protocols", - "regex": "^(?! )( ?TLSv1\\.[0-3])*$", - "type": "text", - "pattern": "^(?! )( ?TLSv1\\.[0-3])*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "TLSv1.2 TLSv1.3", - "name": "HTTPS protocols", - "prev_value": "TLSv1.2 TLSv1.3", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "The supported version of TLS. We recommend the default value TLSv1.2 TLSv1.3 for compatibility reasons." - } - ], - "method": "default", - "containerClass": "z-9" - }, - "HTTP2": { - "context": "multisite", - "default": "yes", - "help": "Support HTTP2 protocol when HTTPS is enabled.", - "id": "http2", - "label": "HTTP2", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "HTTP2", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Support HTTP2 protocol when HTTPS is enabled." - } - ], - "method": "default", - "containerClass": "z-8" - }, - "HTTP3": { - "context": "multisite", - "default": "no", - "help": "Support HTTP3 protocol when HTTPS is enabled.", - "id": "http3", - "label": "HTTP3", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "HTTP3", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Support HTTP3 protocol when HTTPS is enabled." - } - ], - "method": "default", - "containerClass": "z-7" - }, - "HTTP3_ALT_SVC_PORT": { - "context": "multisite", - "default": "443", - "help": "HTTP3 alternate service port. This value will be used as part of the Alt-Svc header.", - "id": "http3-alt-svc-port", - "label": "HTTP3 Alt-Svc port", - "regex": "^\\d+$", - "type": "text", - "pattern": "^\\d+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "443", - "name": "HTTP3 Alt-Svc port", - "prev_value": "443", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "HTTP3 alternate service port. This value will be used as part of the Alt-Svc header." - } - ], - "method": "default", - "containerClass": "z-6" - }, - "LISTEN_HTTP": { - "context": "multisite", - "default": "yes", - "help": "Respond to (insecure) HTTP requests.", - "id": "http-listen", - "label": "HTTP listen", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "HTTP listen", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Respond to (insecure) HTTP requests." - } - ], - "method": "default", - "containerClass": "z-5" - }, - "USE_OPEN_FILE_CACHE": { - "context": "multisite", - "default": "no", - "help": "Enable open file cache feature", - "id": "use-open-file-cache", - "label": "Use open file cache", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Use open file cache", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable open file cache feature" - } - ], - "method": "default", - "containerClass": "z-4" - }, - "OPEN_FILE_CACHE": { - "context": "multisite", - "default": "max=1000 inactive=20s", - "help": "Open file cache directive", - "id": "open-file-cache", - "label": "Use open file cache", - "regex": "^(off|max=\\d+( inactive=\\d+(ms?|[shdwMy]))?)$", - "type": "text", - "pattern": "^(off|max=\\d+( inactive=\\d+(ms?|[shdwMy]))?)$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "max=1000 inactive=20s", - "name": "Use open file cache", - "prev_value": "max=1000 inactive=20s", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Open file cache directive" - } - ], - "method": "default", - "containerClass": "z-3" - }, - "OPEN_FILE_CACHE_ERRORS": { - "context": "multisite", - "default": "yes", - "help": "Enable open file cache for errors", - "id": "open-file-cache-errors", - "label": "Open file cache errors", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "Open file cache errors", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable open file cache for errors" - } - ], - "method": "default", - "containerClass": "z-2" - }, - "OPEN_FILE_CACHE_MIN_USES": { - "context": "multisite", - "default": "2", - "help": "Enable open file cache minimum uses", - "id": "open-file-cache-min-uses", - "label": "Open file cache min uses", - "regex": "^[1-9]\\d*$", - "type": "text", - "pattern": "^[1-9]\\d*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "2", - "name": "Open file cache min uses", - "prev_value": "2", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable open file cache minimum uses" - } - ], - "method": "default", - "containerClass": "z-1" - }, - "OPEN_FILE_CACHE_VALID": { - "context": "multisite", - "default": "30s", - "help": "Open file cache valid time", - "id": "open-file-cache-valid", - "label": "Open file cache valid time", - "regex": "^\\d+(ms?|[shdwMy])$", - "type": "text", - "pattern": "^\\d+(ms?|[shdwMy])$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "30s", - "name": "Open file cache valid time", - "prev_value": "30s", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Open file cache valid time" - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "modsecurity", - "stream": "no", - "name": "ModSecurity", - "description": "Management of the ModSecurity WAF.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "USE_MODSECURITY": { - "context": "multisite", - "default": "yes", - "help": "Enable ModSecurity WAF.", - "id": "use-modsecurity", - "label": "Use ModSecurity", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "Use ModSecurity", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable ModSecurity WAF." - } - ], - "method": "default", - "containerClass": "z-5" - }, - "USE_MODSECURITY_CRS": { - "context": "multisite", - "default": "yes", - "help": "Enable OWASP Core Rule Set.", - "id": "use-modsecurity-crs", - "label": "Use Core Rule Set", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "Use Core Rule Set", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable OWASP Core Rule Set." - } - ], - "method": "default", - "containerClass": "z-4" - }, - "MODSECURITY_CRS_VERSION": { - "context": "multisite", - "default": "3", - "help": "Version of the OWASP Core Rule Set to use with ModSecurity (3, 4 or nightly).", - "id": "modsecurity-crs-version", - "label": "Core Rule Set Version", - "regex": "^(3|4|nightly)$", - "type": "select", - "pattern": "^(3|4|nightly)$", - "inpType": "select", - "values": ["3", "4", "nightly"], - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "4", - "name": "Core Rule Set Version", - "prev_value": "3", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Version of the OWASP Core Rule Set to use with ModSecurity (3, 4 or nightly)." - } - ], - "method": "default", - "containerClass": "z-3" - }, - "MODSECURITY_SEC_AUDIT_ENGINE": { - "context": "multisite", - "default": "RelevantOnly", - "help": "SecAuditEngine directive of ModSecurity.", - "id": "modsecurity-sec-audit-engine", - "label": "SecAuditEngine", - "regex": "^(On|RelevantOnly|Off)$", - "type": "select", - "pattern": "^(On|RelevantOnly|Off)$", - "inpType": "select", - "values": ["Off", "On", "RelevantOnly"], - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "RelevantOnly", - "name": "SecAuditEngine", - "prev_value": "RelevantOnly", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "SecAuditEngine directive of ModSecurity." - } - ], - "method": "default", - "containerClass": "z-2" - }, - "MODSECURITY_SEC_RULE_ENGINE": { - "context": "multisite", - "default": "On", - "help": "SecRuleEngine directive of ModSecurity.", - "id": "modsecurity-sec-rule-engine", - "label": "SecRuleEngine", - "regex": "^(On|DetectionOnly|Off)$", - "type": "select", - "pattern": "^(On|DetectionOnly|Off)$", - "inpType": "select", - "values": ["DetectionOnly", "Off", "On"], - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "On", - "name": "SecRuleEngine", - "prev_value": "On", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "SecRuleEngine directive of ModSecurity." - } - ], - "method": "default", - "containerClass": "z-1" - }, - "MODSECURITY_SEC_AUDIT_LOG_PARTS": { - "context": "multisite", - "default": "ABCFHZ", - "help": "SecAuditLogParts directive of ModSecurity.", - "id": "modsecurity-sec-audit-log-parts", - "label": "SecAuditLogParts", - "regex": "^A(([B-K])(?!.*\\2))+Z$", - "type": "text", - "pattern": "^A(([B-K])(?!.*\\2))+Z$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "ABCFHZ", - "name": "SecAuditLogParts", - "prev_value": "ABCFHZ", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "SecAuditLogParts directive of ModSecurity." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "php", - "stream": "no", - "name": "PHP", - "description": "Manage local or remote PHP-FPM.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "REMOTE_PHP": { - "context": "multisite", - "default": "", - "help": "Hostname of the remote PHP-FPM instance.", - "id": "remote-php", - "label": "Remote PHP", - "regex": "^((?=.{1,255}$)[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?(?:\\.[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?)*\\.?)?$", - "type": "text", - "pattern": "^((?=.{1,255}$)[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?(?:\\.[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?)*\\.?)?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Remote PHP", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Hostname of the remote PHP-FPM instance." - } - ], - "method": "default", - "containerClass": "z-3" - }, - "REMOTE_PHP_PATH": { - "context": "multisite", - "default": "", - "help": "Root folder containing files in the remote PHP-FPM instance.", - "id": "remote-php-path", - "label": "Remote PHP path", - "regex": "^(/[\\w. \\-]+)*/?$", - "type": "text", - "pattern": "^(/[\\w. \\-]+)*/?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Remote PHP path", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Root folder containing files in the remote PHP-FPM instance." - } - ], - "method": "default", - "containerClass": "z-2" - }, - "LOCAL_PHP": { - "context": "multisite", - "default": "", - "help": "Path to the PHP-FPM socket file.", - "id": "local", - "label": "Local PHP", - "regex": "^(/[\\w. \\-]+)*/?$", - "type": "text", - "pattern": "^(/[\\w. \\-]+)*/?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Local PHP", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Path to the PHP-FPM socket file." - } - ], - "method": "default", - "containerClass": "z-1" - }, - "LOCAL_PHP_PATH": { - "context": "multisite", - "default": "", - "help": "Root folder containing files in the local PHP-FPM instance.", - "id": "local-php-path", - "label": "Local PHP path", - "regex": "^(/[\\w. \\-]+)*/?$", - "type": "text", - "pattern": "^(/[\\w. \\-]+)*/?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Local PHP path", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Root folder containing files in the local PHP-FPM instance." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "realip", - "stream": "partial", - "name": "Real IP", - "description": "Get real IP of clients when BunkerWeb is behind a reverse proxy / load balancer.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "USE_REAL_IP": { - "context": "multisite", - "default": "no", - "help": "Retrieve the real IP of client.", - "id": "use-real-ip", - "label": "Use real ip", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Use real ip", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Retrieve the real IP of client." - } - ], - "method": "default", - "containerClass": "z-4" - }, - "USE_PROXY_PROTOCOL": { - "context": "multisite", - "default": "no", - "help": "Enable PROXY protocol communication.", - "id": "use-proxy-protocol", - "label": "Use PROXY protocol", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Use PROXY protocol", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable PROXY protocol communication." - } - ], - "method": "default", - "containerClass": "z-3" - }, - "REAL_IP_FROM": { - "context": "multisite", - "default": "192.168.0.0/16 172.16.0.0/12 10.0.0.0/8", - "help": "List of trusted IPs / networks, separated with spaces, where proxied requests come from.", - "id": "real-ip-from", - "label": "Real IP from", - "regex": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "type": "text", - "pattern": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "192.168.0.0/16 172.16.0.0/12 10.0.0.0/8", - "name": "Real IP from", - "prev_value": "192.168.0.0/16 172.16.0.0/12 10.0.0.0/8", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of trusted IPs / networks, separated with spaces, where proxied requests come from." - } - ], - "method": "default", - "containerClass": "z-2" - }, - "REAL_IP_HEADER": { - "context": "multisite", - "default": "X-Forwarded-For", - "help": "HTTP header containing the real IP or special value proxy_protocol for PROXY protocol.", - "id": "real-ip-header", - "label": "Real IP header", - "regex": "^(?! )(( ?(?!proxy_protocol)[\\w\\-]+)*|proxy_protocol)$", - "type": "text", - "pattern": "^(?! )(( ?(?!proxy_protocol)[\\w\\-]+)*|proxy_protocol)$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "X-Forwarded-For", - "name": "Real IP header", - "prev_value": "X-Forwarded-For", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "HTTP header containing the real IP or special value proxy_protocol for PROXY protocol." - } - ], - "method": "default", - "containerClass": "z-1" - }, - "REAL_IP_RECURSIVE": { - "context": "multisite", - "default": "yes", - "help": "Perform a recursive search in the header container IP address.", - "id": "real-ip-recursive", - "label": "Real IP recursive", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "Real IP recursive", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Perform a recursive search in the header container IP address." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "redirect", - "stream": "no", - "name": "Redirect", - "description": "Manage HTTP redirects.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "REDIRECT_TO": { - "context": "multisite", - "default": "", - "help": "Redirect a whole site to another one.", - "id": "redirect-to", - "label": "Redirect to", - "regex": "^(https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)?$", - "type": "text", - "pattern": "^(https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Redirect to", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Redirect a whole site to another one." - } - ], - "method": "default", - "containerClass": "z-2" - }, - "REDIRECT_TO_REQUEST_URI": { - "context": "multisite", - "default": "no", - "help": "Append the requested URI to the redirect address.", - "id": "redirect-to-request-uri", - "label": "Append request URI", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Append request URI", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Append the requested URI to the redirect address." - } - ], - "method": "default", - "containerClass": "z-1" - }, - "REDIRECT_TO_STATUS_CODE": { - "context": "multisite", - "default": "301", - "help": "Status code to send to client when redirecting.", - "id": "redirect-to-status-code", - "label": "Append request URI", - "regex": "^(301|302)$", - "type": "select", - "pattern": "^(301|302)$", - "inpType": "select", - "values": ["301", "302"], - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "301", - "name": "Append request URI", - "prev_value": "301", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Status code to send to client when redirecting." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "reverseproxy", - "stream": "partial", - "name": "Reverse proxy", - "description": "Manage reverse proxy configurations.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "USE_REVERSE_PROXY": { - "context": "multisite", - "default": "no", - "help": "Activate reverse proxy mode.", - "id": "use-reverse-proxy", - "label": "Use reverse proxy", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": true, - "value": "yes", - "name": "Use reverse proxy", - "prev_value": "no", - "popovers": [ - { - "iconName": "trespass", - "text": "inp_popover_method_disabled" - }, - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Activate reverse proxy mode." - } - ], - "method": "scheduler", - "containerClass": "z-23" - }, - "REVERSE_PROXY_INTERCEPT_ERRORS": { - "context": "multisite", - "default": "yes", - "help": "Intercept and rewrite errors.", - "id": "reverse-proxy-intercept-errors", - "label": "Intercept errors", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "Intercept errors", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Intercept and rewrite errors." - } - ], - "method": "default", - "containerClass": "z-22" - }, - "REVERSE_PROXY_CUSTOM_HOST": { - "context": "multisite", - "default": "", - "help": "Override Host header sent to upstream server.", - "id": "reverse-proxy-custom-host", - "label": "Reverse proxy custom host", - "regex": "^.*$", - "type": "text", - "pattern": "^.*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Reverse proxy custom host", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Override Host header sent to upstream server." - } - ], - "method": "default", - "containerClass": "z-21" - }, - "USE_PROXY_CACHE": { - "context": "multisite", - "default": "no", - "help": "Enable or disable caching of the proxied resources.", - "id": "use-proxy-cache", - "label": "Reverse proxy cache", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Reverse proxy cache", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable or disable caching of the proxied resources." - } - ], - "method": "default", - "containerClass": "z-6" - }, - "PROXY_CACHE_METHODS": { - "context": "multisite", - "default": "GET HEAD", - "help": "HTTP methods that should trigger a cache operation.", - "id": "proxy-cache-methods", - "label": "Reverse proxy cache methods", - "regex": "^(?! )( ?(GET|HEAD|POST|PUT|DELETE|CONNECT|OPTIONS|TRACE|PATCH)(?!.*\\2))+$", - "type": "text", - "pattern": "^(?! )( ?(GET|HEAD|POST|PUT|DELETE|CONNECT|OPTIONS|TRACE|PATCH)(?!.*\\2))+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "GET HEAD", - "name": "Reverse proxy cache methods", - "prev_value": "GET HEAD", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "HTTP methods that should trigger a cache operation." - } - ], - "method": "default", - "containerClass": "z-5" - }, - "PROXY_CACHE_MIN_USES": { - "context": "multisite", - "default": "2", - "help": "The minimum number of requests before a response is cached.", - "id": "proxy-cache-min-uses", - "label": "Reverse proxy cache minimum uses", - "regex": "^[1-9]\\d*$", - "type": "text", - "pattern": "^[1-9]\\d*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "2", - "name": "Reverse proxy cache minimum uses", - "prev_value": "2", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "The minimum number of requests before a response is cached." - } - ], - "method": "default", - "containerClass": "z-4" - }, - "PROXY_CACHE_KEY": { - "context": "multisite", - "default": "$scheme$host$request_uri", - "help": "The key used to uniquely identify a cached response.", - "id": "proxy-cache-key", - "label": "Reverse proxy cache key", - "regex": "^(?! )( ?(\\$[a-z_]+)(?!.*\\2))+$", - "type": "text", - "pattern": "^(?! )( ?(\\$[a-z_]+)(?!.*\\2))+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "$scheme$host$request_uri", - "name": "Reverse proxy cache key", - "prev_value": "$scheme$host$request_uri", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "The key used to uniquely identify a cached response." - } - ], - "method": "default", - "containerClass": "z-3" - }, - "PROXY_CACHE_VALID": { - "context": "multisite", - "default": "200=24h 301=1h 302=24h", - "help": "Define the caching time depending on the HTTP status code (list of status=time), separated with spaces.", - "id": "proxy-cache-valid", - "label": "Reverse proxy cache valid", - "regex": "^(?! )( ?([1-5]\\d{2})(?!.*\\2=)=\\d+(ms?|[shdwMy]))*$", - "type": "text", - "pattern": "^(?! )( ?([1-5]\\d{2})(?!.*\\2=)=\\d+(ms?|[shdwMy]))*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "200=24h 301=1h 302=24h", - "name": "Reverse proxy cache valid", - "prev_value": "200=24h 301=1h 302=24h", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Define the caching time depending on the HTTP status code (list of status=time), separated with spaces." - } - ], - "method": "default", - "containerClass": "z-2" - }, - "PROXY_NO_CACHE": { - "context": "multisite", - "default": "$http_pragma $http_authorization", - "help": "Conditions to disable caching of responses.", - "id": "proxy-no-cache", - "label": "Reverse proxy no cache", - "regex": "^.*$", - "type": "text", - "pattern": "^.*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "$http_pragma $http_authorization", - "name": "Reverse proxy no cache", - "prev_value": "$http_pragma $http_authorization", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Conditions to disable caching of responses." - } - ], - "method": "default", - "containerClass": "z-1" - }, - "PROXY_CACHE_BYPASS": { - "context": "multisite", - "default": "0", - "help": "Conditions to bypass caching of responses.", - "id": "proxy-cache-bypass", - "label": "Reverse proxy bypass", - "regex": "^.*$", - "type": "text", - "pattern": "^.*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "0", - "name": "Reverse proxy bypass", - "prev_value": "0", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Conditions to bypass caching of responses." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null, - "multiples_schema": { - "reverse-proxy": { - "REVERSE_PROXY_HOST": { - "context": "multisite", - "default": "", - "help": "Full URL of the proxied resource (proxy_pass).", - "id": "reverse-proxy-host", - "label": "Reverse proxy host", - "regex": "^.*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^.*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Reverse proxy host", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Full URL of the proxied resource (proxy_pass)." - } - ], - "containerClass": "z-23" - }, - "REVERSE_PROXY_URL": { - "context": "multisite", - "default": "/", - "help": "Location URL that will be proxied.", - "id": "reverse-proxy-url", - "label": "Reverse proxy url", - "regex": "^.*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^.*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "/", - "name": "Reverse proxy url", - "prev_value": "/", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Location URL that will be proxied." - } - ], - "containerClass": "z-22" - }, - "REVERSE_PROXY_WS": { - "context": "multisite", - "default": "no", - "help": "Enable websocket on the proxied resource.", - "id": "reverse-proxy-ws", - "label": "Reverse proxy WS", - "regex": "^(yes|no)$", - "type": "check", - "multiple": "reverse-proxy", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Reverse proxy WS", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable websocket on the proxied resource." - } - ], - "containerClass": "z-21" - }, - "REVERSE_PROXY_HEADERS": { - "context": "multisite", - "default": "", - "help": "List of HTTP headers to send to proxied resource separated with semicolons (values for proxy_set_header directive).", - "id": "reverse-proxy-headers", - "label": "Reverse proxy headers", - "regex": "^(?![; ])(;? ?([\\w\\-]+)(?!.*\\2 ) [^;]+)*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(?![; ])(;? ?([\\w\\-]+)(?!.*\\2 ) [^;]+)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Reverse proxy headers", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of HTTP headers to send to proxied resource separated with semicolons (values for proxy_set_header directive)." - } - ], - "containerClass": "z-20" - }, - "REVERSE_PROXY_HEADERS_CLIENT": { - "context": "multisite", - "default": "", - "help": "List of HTTP headers to send to client separated with semicolons (values for add_header directive).", - "id": "reverse-proxy-headers-client", - "label": "Reverse proxy headers-client", - "regex": "^(?![; ])(;? ?([\\w\\-]+)(?!.*\\2 ) [^;]+)*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(?![; ])(;? ?([\\w\\-]+)(?!.*\\2 ) [^;]+)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Reverse proxy headers-client", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of HTTP headers to send to client separated with semicolons (values for add_header directive)." - } - ], - "containerClass": "z-19" - }, - "REVERSE_PROXY_BUFFERING": { - "context": "multisite", - "default": "yes", - "help": "Enable or disable buffering of responses from proxied resource.", - "id": "reverse-proxy-buffering", - "label": "Reverse proxy buffering", - "regex": "^(yes|no)$", - "type": "check", - "multiple": "reverse-proxy", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "Reverse proxy buffering", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable or disable buffering of responses from proxied resource." - } - ], - "containerClass": "z-18" - }, - "REVERSE_PROXY_KEEPALIVE": { - "context": "multisite", - "default": "no", - "help": "Enable or disable keepalive connections with the proxied resource.", - "id": "reverse-proxy-keepalive", - "label": "Reverse proxy keepalive", - "regex": "^(yes|no)$", - "type": "check", - "multiple": "reverse-proxy", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Reverse proxy keepalive", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable or disable keepalive connections with the proxied resource." - } - ], - "containerClass": "z-17" - }, - "REVERSE_PROXY_AUTH_REQUEST": { - "context": "multisite", - "default": "", - "help": "Enable authentication using an external provider (value of auth_request directive).", - "id": "reverse-proxy-auth-request", - "label": "Reverse proxy auth request", - "regex": "^(\\/[\\w\\].~:\\/?#\\[@!$\\&'\\(\\)*+,;=\\-]*|off)?$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(\\/[\\w\\].~:\\/?#\\[@!$\\&'\\(\\)*+,;=\\-]*|off)?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Reverse proxy auth request", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable authentication using an external provider (value of auth_request directive)." - } - ], - "containerClass": "z-16" - }, - "REVERSE_PROXY_AUTH_REQUEST_SIGNIN_URL": { - "context": "multisite", - "default": "", - "help": "Redirect clients to sign-in URL when using REVERSE_PROXY_AUTH_REQUEST (used when auth_request call returned 401).", - "id": "reverse-proxy-auth-request-signin-url", - "label": "Auth request signin URL", - "regex": "^(https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)?$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Auth request signin URL", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Redirect clients to sign-in URL when using REVERSE_PROXY_AUTH_REQUEST (used when auth_request call returned 401)." - } - ], - "containerClass": "z-15" - }, - "REVERSE_PROXY_AUTH_REQUEST_SET": { - "context": "multisite", - "default": "", - "help": "List of variables to set from the authentication provider, separated with semicolons (values of auth_request_set directives).", - "id": "reverse-proxy-auth-request-set", - "label": "Reverse proxy auth request set", - "regex": "^(?! ;)(;? ?(\\$[a-z_\\-]+)(?!.*\\2 ) [^;]+)*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(?! ;)(;? ?(\\$[a-z_\\-]+)(?!.*\\2 ) [^;]+)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Reverse proxy auth request set", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of variables to set from the authentication provider, separated with semicolons (values of auth_request_set directives)." - } - ], - "containerClass": "z-14" - }, - "REVERSE_PROXY_CONNECT_TIMEOUT": { - "context": "multisite", - "default": "60s", - "help": "Timeout when connecting to the proxied resource.", - "id": "reverse-proxy-connect-timeout", - "label": "Reverse proxy connect timeout", - "regex": "^\\d+(ms?|[shdwMy])$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^\\d+(ms?|[shdwMy])$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "60s", - "name": "Reverse proxy connect timeout", - "prev_value": "60s", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Timeout when connecting to the proxied resource." - } - ], - "containerClass": "z-13" - }, - "REVERSE_PROXY_READ_TIMEOUT": { - "context": "multisite", - "default": "60s", - "help": "Timeout when reading from the proxied resource.", - "id": "reverse-proxy-read-timeout", - "label": "Reverse proxy read timeout", - "regex": "^\\d+(ms?|[shdwMy])$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^\\d+(ms?|[shdwMy])$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "60s", - "name": "Reverse proxy read timeout", - "prev_value": "60s", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Timeout when reading from the proxied resource." - } - ], - "containerClass": "z-12" - }, - "REVERSE_PROXY_SEND_TIMEOUT": { - "context": "multisite", - "default": "60s", - "help": "Timeout when sending to the proxied resource.", - "id": "reverse-proxy-send-timeout", - "label": "Reverse proxy send timeout", - "regex": "^\\d+(ms?|[shdwMy])$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^\\d+(ms?|[shdwMy])$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "60s", - "name": "Reverse proxy send timeout", - "prev_value": "60s", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Timeout when sending to the proxied resource." - } - ], - "containerClass": "z-11" - }, - "REVERSE_PROXY_INCLUDES": { - "context": "multisite", - "default": "", - "help": "Additional configuration to include in the location block, separated with spaces.", - "id": "reverse-proxy-includes", - "label": "Reverse proxy includes", - "regex": "^(?! )( ?(\\w+)(?!.*\\b\\2\\b))*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(?! )( ?(\\w+)(?!.*\\b\\2\\b))*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Reverse proxy includes", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Additional configuration to include in the location block, separated with spaces." - } - ], - "containerClass": "z-10" - } - } - }, - "multiples": { - "reverse-proxy": { - "0": { - "REVERSE_PROXY_HOST": { - "context": "multisite", - "default": "", - "help": "Full URL of the proxied resource (proxy_pass).", - "id": "reverse-proxy-host", - "label": "Reverse proxy host", - "regex": "^.*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^.*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": true, - "value": "http://app1:8080", - "name": "Reverse proxy host", - "prev_value": "http://app1:8080", - "popovers": [ - { - "iconName": "trespass", - "text": "inp_popover_method_disabled" - }, - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Full URL of the proxied resource (proxy_pass)." - } - ], - "containerClass": "z-23", - "method": "scheduler" - }, - "REVERSE_PROXY_URL": { - "context": "multisite", - "default": "/", - "help": "Location URL that will be proxied.", - "id": "reverse-proxy-url", - "label": "Reverse proxy url", - "regex": "^.*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^.*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "/", - "name": "Reverse proxy url", - "prev_value": "/", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Location URL that will be proxied." - } - ], - "containerClass": "z-22", - "method": "default" - }, - "REVERSE_PROXY_WS": { - "context": "multisite", - "default": "no", - "help": "Enable websocket on the proxied resource.", - "id": "reverse-proxy-ws", - "label": "Reverse proxy WS", - "regex": "^(yes|no)$", - "type": "check", - "multiple": "reverse-proxy", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Reverse proxy WS", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable websocket on the proxied resource." - } - ], - "containerClass": "z-21", - "method": "default" - }, - "REVERSE_PROXY_HEADERS": { - "context": "multisite", - "default": "", - "help": "List of HTTP headers to send to proxied resource separated with semicolons (values for proxy_set_header directive).", - "id": "reverse-proxy-headers", - "label": "Reverse proxy headers", - "regex": "^(?![; ])(;? ?([\\w\\-]+)(?!.*\\2 ) [^;]+)*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(?![; ])(;? ?([\\w\\-]+)(?!.*\\2 ) [^;]+)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Reverse proxy headers", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of HTTP headers to send to proxied resource separated with semicolons (values for proxy_set_header directive)." - } - ], - "containerClass": "z-20", - "method": "default" - }, - "REVERSE_PROXY_HEADERS_CLIENT": { - "context": "multisite", - "default": "", - "help": "List of HTTP headers to send to client separated with semicolons (values for add_header directive).", - "id": "reverse-proxy-headers-client", - "label": "Reverse proxy headers-client", - "regex": "^(?![; ])(;? ?([\\w\\-]+)(?!.*\\2 ) [^;]+)*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(?![; ])(;? ?([\\w\\-]+)(?!.*\\2 ) [^;]+)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Reverse proxy headers-client", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of HTTP headers to send to client separated with semicolons (values for add_header directive)." - } - ], - "containerClass": "z-19", - "method": "default" - }, - "REVERSE_PROXY_BUFFERING": { - "context": "multisite", - "default": "yes", - "help": "Enable or disable buffering of responses from proxied resource.", - "id": "reverse-proxy-buffering", - "label": "Reverse proxy buffering", - "regex": "^(yes|no)$", - "type": "check", - "multiple": "reverse-proxy", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "Reverse proxy buffering", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable or disable buffering of responses from proxied resource." - } - ], - "containerClass": "z-18", - "method": "default" - }, - "REVERSE_PROXY_KEEPALIVE": { - "context": "multisite", - "default": "no", - "help": "Enable or disable keepalive connections with the proxied resource.", - "id": "reverse-proxy-keepalive", - "label": "Reverse proxy keepalive", - "regex": "^(yes|no)$", - "type": "check", - "multiple": "reverse-proxy", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Reverse proxy keepalive", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable or disable keepalive connections with the proxied resource." - } - ], - "containerClass": "z-17", - "method": "default" - }, - "REVERSE_PROXY_AUTH_REQUEST": { - "context": "multisite", - "default": "", - "help": "Enable authentication using an external provider (value of auth_request directive).", - "id": "reverse-proxy-auth-request", - "label": "Reverse proxy auth request", - "regex": "^(\\/[\\w\\].~:\\/?#\\[@!$\\&'\\(\\)*+,;=\\-]*|off)?$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(\\/[\\w\\].~:\\/?#\\[@!$\\&'\\(\\)*+,;=\\-]*|off)?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Reverse proxy auth request", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable authentication using an external provider (value of auth_request directive)." - } - ], - "containerClass": "z-16", - "method": "default" - }, - "REVERSE_PROXY_AUTH_REQUEST_SIGNIN_URL": { - "context": "multisite", - "default": "", - "help": "Redirect clients to sign-in URL when using REVERSE_PROXY_AUTH_REQUEST (used when auth_request call returned 401).", - "id": "reverse-proxy-auth-request-signin-url", - "label": "Auth request signin URL", - "regex": "^(https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)?$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Auth request signin URL", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Redirect clients to sign-in URL when using REVERSE_PROXY_AUTH_REQUEST (used when auth_request call returned 401)." - } - ], - "containerClass": "z-15", - "method": "default" - }, - "REVERSE_PROXY_AUTH_REQUEST_SET": { - "context": "multisite", - "default": "", - "help": "List of variables to set from the authentication provider, separated with semicolons (values of auth_request_set directives).", - "id": "reverse-proxy-auth-request-set", - "label": "Reverse proxy auth request set", - "regex": "^(?! ;)(;? ?(\\$[a-z_\\-]+)(?!.*\\2 ) [^;]+)*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(?! ;)(;? ?(\\$[a-z_\\-]+)(?!.*\\2 ) [^;]+)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Reverse proxy auth request set", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of variables to set from the authentication provider, separated with semicolons (values of auth_request_set directives)." - } - ], - "containerClass": "z-14", - "method": "default" - }, - "REVERSE_PROXY_CONNECT_TIMEOUT": { - "context": "multisite", - "default": "60s", - "help": "Timeout when connecting to the proxied resource.", - "id": "reverse-proxy-connect-timeout", - "label": "Reverse proxy connect timeout", - "regex": "^\\d+(ms?|[shdwMy])$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^\\d+(ms?|[shdwMy])$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "60s", - "name": "Reverse proxy connect timeout", - "prev_value": "60s", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Timeout when connecting to the proxied resource." - } - ], - "containerClass": "z-13", - "method": "default" - }, - "REVERSE_PROXY_READ_TIMEOUT": { - "context": "multisite", - "default": "60s", - "help": "Timeout when reading from the proxied resource.", - "id": "reverse-proxy-read-timeout", - "label": "Reverse proxy read timeout", - "regex": "^\\d+(ms?|[shdwMy])$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^\\d+(ms?|[shdwMy])$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "60s", - "name": "Reverse proxy read timeout", - "prev_value": "60s", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Timeout when reading from the proxied resource." - } - ], - "containerClass": "z-12", - "method": "default" - }, - "REVERSE_PROXY_SEND_TIMEOUT": { - "context": "multisite", - "default": "60s", - "help": "Timeout when sending to the proxied resource.", - "id": "reverse-proxy-send-timeout", - "label": "Reverse proxy send timeout", - "regex": "^\\d+(ms?|[shdwMy])$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^\\d+(ms?|[shdwMy])$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "60s", - "name": "Reverse proxy send timeout", - "prev_value": "60s", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Timeout when sending to the proxied resource." - } - ], - "containerClass": "z-11", - "method": "default" - }, - "REVERSE_PROXY_INCLUDES": { - "context": "multisite", - "default": "", - "help": "Additional configuration to include in the location block, separated with spaces.", - "id": "reverse-proxy-includes", - "label": "Reverse proxy includes", - "regex": "^(?! )( ?(\\w+)(?!.*\\b\\2\\b))*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(?! )( ?(\\w+)(?!.*\\b\\2\\b))*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Reverse proxy includes", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Additional configuration to include in the location block, separated with spaces." - } - ], - "containerClass": "z-10", - "method": "default" - } - } - } - } - }, - { - "id": "reversescan", - "stream": "yes", - "name": "Reverse scan", - "description": "Scan clients ports to detect proxies or servers.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": true, - "settings": { - "USE_REVERSE_SCAN": { - "context": "multisite", - "default": "no", - "help": "Enable scanning of clients ports and deny access if one is opened.", - "id": "use-reverse-scan", - "label": "Reverse scan", - "regex": "^(no|yes)$", - "type": "check", - "pattern": "^(no|yes)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Reverse scan", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable scanning of clients ports and deny access if one is opened." - } - ], - "method": "default", - "containerClass": "z-2" - }, - "REVERSE_SCAN_PORTS": { - "context": "multisite", - "default": "22 80 443 3128 8000 8080", - "help": "List of port to scan when using reverse scan feature.", - "id": "reverse-scan-ports", - "label": "Reverse scan ports", - "regex": "^.*$", - "type": "text", - "pattern": "^.*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "22 80 443 3128 8000 8080", - "name": "Reverse scan ports", - "prev_value": "22 80 443 3128 8000 8080", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of port to scan when using reverse scan feature." - } - ], - "method": "default", - "containerClass": "z-1" - }, - "REVERSE_SCAN_TIMEOUT": { - "context": "multisite", - "default": "500", - "help": "Specify the maximum timeout (in ms) when scanning a port.", - "id": "reverse-scan-timeout", - "label": "Reverse scan timeout", - "regex": "^.*$", - "type": "text", - "pattern": "^.*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "500", - "name": "Reverse scan timeout", - "prev_value": "500", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Specify the maximum timeout (in ms) when scanning a port." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "selfsigned", - "stream": "yes", - "name": "Self-signed certificate", - "description": "Generate self-signed certificate.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "GENERATE_SELF_SIGNED_SSL": { - "context": "multisite", - "default": "no", - "help": "Generate and use self-signed certificate.", - "id": "generate-self-signed-ssl", - "label": "Activate self-signed certificate", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Activate self-signed certificate", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Generate and use self-signed certificate." - } - ], - "method": "default", - "containerClass": "z-2" - }, - "SELF_SIGNED_SSL_EXPIRY": { - "context": "multisite", - "default": "365", - "help": "Self-signed certificate expiry in days.", - "id": "self-signed-ssl-expiry", - "label": "Certificate expiry", - "regex": "^\\d+$", - "type": "text", - "pattern": "^\\d+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "365", - "name": "Certificate expiry", - "prev_value": "365", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Self-signed certificate expiry in days." - } - ], - "method": "default", - "containerClass": "z-1" - }, - "SELF_SIGNED_SSL_SUBJ": { - "context": "multisite", - "default": "/CN=www.example.com/", - "help": "Self-signed certificate subject.", - "id": "self-signed-ssl-subj", - "label": "Certificate subject", - "regex": "^/CN=[^,]+$", - "type": "text", - "pattern": "^/CN=[^,]+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "/CN=www.example.com/", - "name": "Certificate subject", - "prev_value": "/CN=www.example.com/", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Self-signed certificate subject." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "ui", - "stream": "no", - "name": "UI", - "description": "Integrate easily the BunkerWeb UI.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "USE_UI": { - "context": "multisite", - "default": "no", - "help": "Use UI", - "id": "use-ui", - "label": "Use UI", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Use UI", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Use UI" - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - }, - { - "id": "whitelist", - "stream": "partial", - "name": "Whitelist", - "description": "Allow access based on internal and external IP/network/rDNS/ASN whitelists.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": true, - "settings": { - "USE_WHITELIST": { - "context": "multisite", - "default": "yes", - "help": "Activate whitelist feature.", - "id": "use-whitelist", - "label": "Activate whitelisting", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": true, - "value": "no", - "name": "Activate whitelisting", - "prev_value": "yes", - "popovers": [ - { - "iconName": "trespass", - "text": "inp_popover_method_disabled" - }, - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Activate whitelist feature." - } - ], - "method": "scheduler", - "containerClass": "z-6" - }, - "WHITELIST_IP": { - "context": "multisite", - "default": "20.191.45.212 40.88.21.235 40.76.173.151 40.76.163.7 20.185.79.47 52.142.26.175 20.185.79.15 52.142.24.149 40.76.162.208 40.76.163.23 40.76.162.191 40.76.162.247", - "help": "List of IP/network, separated with spaces, to put into the whitelist.", - "id": "whitelist-ip", - "label": "Whitelist IP/network", - "regex": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "type": "text", - "pattern": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "20.191.45.212 40.88.21.235 40.76.173.151 40.76.163.7 20.185.79.47 52.142.26.175 20.185.79.15 52.142.24.149 40.76.162.208 40.76.163.23 40.76.162.191 40.76.162.247", - "name": "Whitelist IP/network", - "prev_value": "20.191.45.212 40.88.21.235 40.76.173.151 40.76.163.7 20.185.79.47 52.142.26.175 20.185.79.15 52.142.24.149 40.76.162.208 40.76.163.23 40.76.162.191 40.76.162.247", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of IP/network, separated with spaces, to put into the whitelist." - } - ], - "method": "default", - "containerClass": "z-5" - }, - "WHITELIST_RDNS": { - "context": "multisite", - "default": ".google.com .googlebot.com .yandex.ru .yandex.net .yandex.com .search.msn.com .baidu.com .baidu.jp .crawl.yahoo.net .fwd.linkedin.com .twitter.com .twttr.com .discord.com", - "help": "List of reverse DNS suffixes, separated with spaces, to whitelist.", - "id": "whitelist-rdns", - "label": "Whitelist reverse DNS", - "regex": "^( *(([^ ]+)(?!.*\\3( |$))) *)*$", - "type": "text", - "pattern": "^( *(([^ ]+)(?!.*\\3( |$))) *)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": ".google.com .googlebot.com .yandex.ru .yandex.net .yandex.com .search.msn.com .baidu.com .baidu.jp .crawl.yahoo.net .fwd.linkedin.com .twitter.com .twttr.com .discord.com", - "name": "Whitelist reverse DNS", - "prev_value": ".google.com .googlebot.com .yandex.ru .yandex.net .yandex.com .search.msn.com .baidu.com .baidu.jp .crawl.yahoo.net .fwd.linkedin.com .twitter.com .twttr.com .discord.com", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of reverse DNS suffixes, separated with spaces, to whitelist." - } - ], - "method": "default", - "containerClass": "z-4" - }, - "WHITELIST_RDNS_GLOBAL": { - "context": "multisite", - "default": "yes", - "help": "Only perform RDNS whitelist checks on global IP addresses.", - "id": "whitelist-rdns-global", - "label": "Whitelist reverse DNS global IPs", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "Whitelist reverse DNS global IPs", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Only perform RDNS whitelist checks on global IP addresses." - } - ], - "method": "default", - "containerClass": "z-3" - }, - "WHITELIST_ASN": { - "context": "multisite", - "default": "32934", - "help": "List of ASN numbers, separated with spaces, to whitelist.", - "id": "whitelist-asn", - "label": "Whitelist ASN", - "regex": "^^( *((ASN?)?(\\d+)\\b(?!.*[SN ]\\4\\b)) *)*$", - "type": "text", - "pattern": "^^( *((ASN?)?(\\d+)\\b(?!.*[SN ]\\4\\b)) *)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "32934", - "name": "Whitelist ASN", - "prev_value": "32934", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of ASN numbers, separated with spaces, to whitelist." - } - ], - "method": "default", - "containerClass": "z-2" - }, - "WHITELIST_USER_AGENT": { - "context": "multisite", - "default": "", - "help": "List of User-Agent (PCRE regex), separated with spaces, to whitelist.", - "id": "whitelist-user-agent", - "label": "Whitelist User-Agent", - "regex": "^.*$", - "type": "text", - "pattern": "^.*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Whitelist User-Agent", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of User-Agent (PCRE regex), separated with spaces, to whitelist." - } - ], - "method": "default", - "containerClass": "z-1" - }, - "WHITELIST_URI": { - "context": "multisite", - "default": "", - "help": "List of URI (PCRE regex), separated with spaces, to whitelist.", - "id": "whitelist-uri", - "label": "Whitelist URI", - "regex": "^( *(.*)(?!.*\\2(?!.)) *)*$", - "type": "text", - "pattern": "^( *(.*)(?!.*\\2(?!.)) *)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Whitelist URI", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of URI (PCRE regex), separated with spaces, to whitelist." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - } - ] - } - }, - "operation": "edit", - "oldServerName": "app1.example.com" - } - } - ] - } -] diff --git a/src/ui/client/tests/advanced.py b/src/ui/client/tests/advanced.py deleted file mode 100644 index 4f87d80e3..000000000 --- a/src/ui/client/tests/advanced.py +++ /dev/null @@ -1,4313 +0,0 @@ -import json -import base64 - -from builder.advanced_mode import advanced_mode_builder - -# Default plugins from docker-compose.ui.yml -plugins = [ - { - "id": "general", - "stream": "partial", - "name": "General", - "description": "The general settings for the server", - "version": "0.1", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "IS_LOADING": { - "context": "global", - "default": "no", - "help": "Internal use : set to yes when BW is loading.", - "id": "internal-use-loading", - "label": "internal use loading", - "regex": "^(yes|no)$", - "type": "check", - }, - "NGINX_PREFIX": { - "context": "global", - "default": "/etc/nginx/", - "help": "Where nginx will search for configurations.", - "id": "nginx-prefix", - "label": "nginx prefix", - "regex": "^(\\/[\\-\\w.\\s]+)*\\/$", - "type": "text", - }, - "HTTP_PORT": { - "context": "global", - "default": "8080", - "help": "HTTP port number which bunkerweb binds to.", - "id": "http-port", - "label": "HTTP port", - "regex": "^\\d+$", - "type": "text", - }, - "HTTPS_PORT": { - "context": "global", - "default": "8443", - "help": "HTTPS port number which bunkerweb binds to.", - "id": "https-port", - "label": "HTTPS port", - "regex": "^\\d+$", - "type": "text", - }, - "MULTISITE": { - "context": "global", - "default": "no", - "help": "Multi site activation.", - "id": "multisite", - "label": "Multisite", - "regex": "^(yes|no)$", - "type": "check", - }, - "SERVER_NAME": { - "context": "multisite", - "default": "www.example.com", - "help": "List of the virtual hosts served by bunkerweb.", - "id": "server-name", - "label": "Server name", - "regex": "^((\\S{1,255})(?!.*\\s\\2(\\s|$)))?(\\s(\\S{1,255})(?!.*\\s\\5(\\s|$)))*$", - "type": "text", - }, - "WORKER_PROCESSES": { - "context": "global", - "default": "auto", - "help": "Number of worker processes.", - "id": "worker-processes", - "label": "Worker processes", - "regex": "^(auto|\\d+)$", - "type": "text", - }, - "WORKER_RLIMIT_NOFILE": { - "context": "global", - "default": "2048", - "help": "Maximum number of open files for worker processes.", - "id": "worker-rlimit-nofile", - "label": "Open files per worker", - "regex": "^\\d+$", - "type": "text", - }, - "WORKER_CONNECTIONS": { - "context": "global", - "default": "1024", - "help": "Maximum number of connections per worker.", - "id": "worker-connections", - "label": "Connections per worker", - "regex": "^\\d+$", - "type": "text", - }, - "LOG_FORMAT": { - "context": "global", - "default": '$host $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"', - "help": "The format to use for access logs.", - "id": "log-format", - "label": "Log format", - "regex": "^.*$", - "type": "text", - }, - "LOG_LEVEL": { - "context": "global", - "default": "notice", - "help": "The level to use for error logs.", - "id": "log-level", - "label": "Log level", - "regex": "^(debug|info|notice|warn|error|crit|alert|emerg)$", - "type": "select", - "select": [ - "alert", - "crit", - "debug", - "emerg", - "error", - "info", - "notice", - "warn", - ], - }, - "DNS_RESOLVERS": { - "context": "global", - "default": "127.0.0.11", - "help": "DNS addresses of resolvers to use.", - "id": "dns-resolvers", - "label": "DNS resolvers", - "regex": "^(?! )(( *[^ ]+)(?!.*\\2))*$", - "type": "text", - }, - "DATASTORE_MEMORY_SIZE": { - "context": "global", - "default": "64m", - "help": "Size of the internal datastore.", - "id": "datastore-memory-size", - "label": "Datastore memory size", - "regex": "^\\d+[kKmMgG]?$", - "type": "text", - }, - "CACHESTORE_MEMORY_SIZE": { - "context": "global", - "default": "64m", - "help": "Size of the internal cachestore.", - "id": "cachestore-memory-size", - "label": "Cachestore memory size", - "regex": "^\\d+[kKmMgG]?$", - "type": "text", - }, - "CACHESTORE_IPC_MEMORY_SIZE": { - "context": "global", - "default": "16m", - "help": "Size of the internal cachestore (ipc).", - "id": "cachestore-ipc-memory-size", - "label": "Cachestore ipc memory size", - "regex": "^\\d+[kKmMgG]?$", - "type": "text", - }, - "CACHESTORE_MISS_MEMORY_SIZE": { - "context": "global", - "default": "16m", - "help": "Size of the internal cachestore (miss).", - "id": "cachestore-miss-memory-size", - "label": "Cachestore miss memory size", - "regex": "^\\d+[kKmMgG]?$", - "type": "text", - }, - "CACHESTORE_LOCKS_MEMORY_SIZE": { - "context": "global", - "default": "16m", - "help": "Size of the internal cachestore (locks).", - "id": "cachestore-locks-memory-size", - "label": "Cachestore locks memory size", - "regex": "^\\d+[kKmMgG]?$", - "type": "text", - }, - "USE_API": { - "context": "global", - "default": "yes", - "help": "Activate the API to control BunkerWeb.", - "id": "use-api", - "label": "Activate API", - "regex": "^(yes|no)$", - "type": "check", - }, - "API_HTTP_PORT": { - "context": "global", - "default": "5000", - "help": "Listen port number for the API.", - "id": "api-http-listen", - "label": "API port number", - "regex": "^\\d+$", - "type": "text", - }, - "API_LISTEN_IP": { - "context": "global", - "default": "0.0.0.0", - "help": "Listen IP address for the API.", - "id": "api-ip-listen", - "label": "API listen IP", - "regex": "^.*$", - "type": "text", - }, - "API_SERVER_NAME": { - "context": "global", - "default": "bwapi", - "help": "Server name (virtual host) for the API.", - "id": "api-server-name", - "label": "API server name", - "regex": "^[^ ]{1,255}$", - "type": "text", - }, - "API_WHITELIST_IP": { - "context": "global", - "default": "127.0.0.0/8", - "help": "List of IP/network allowed to contact the API.", - "id": "api-whitelist-ip", - "label": "API whitelist IP", - "regex": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "type": "text", - }, - "AUTOCONF_MODE": { - "context": "global", - "default": "no", - "help": "Enable Autoconf Docker integration.", - "id": "autoconf-mode", - "label": "Autoconf mode", - "regex": "^(yes|no)$", - "type": "check", - }, - "SWARM_MODE": { - "context": "global", - "default": "no", - "help": "Enable Docker Swarm integration.", - "id": "swarm-mode", - "label": "Swarm mode", - "regex": "^(yes|no)$", - "type": "check", - }, - "KUBERNETES_MODE": { - "context": "global", - "default": "no", - "help": "Enable Kubernetes integration.", - "id": "kubernetes-mode", - "label": "Kubernetes mode", - "regex": "^(yes|no)$", - "type": "check", - }, - "SERVER_TYPE": { - "context": "multisite", - "default": "http", - "help": "Server type : http or stream.", - "id": "server-type", - "label": "Server type", - "regex": "^(http|stream)$", - "type": "select", - "select": ["http", "stream"], - }, - "LISTEN_STREAM": { - "context": "multisite", - "default": "yes", - "help": "Enable listening for non-ssl (passthrough).", - "id": "listen-stream", - "label": "Listen stream", - "regex": "^(yes|no)$", - "type": "check", - }, - "LISTEN_STREAM_PORT": { - "context": "multisite", - "default": "1337", - "help": "Listening port for non-ssl (passthrough).", - "id": "listen-stream-port", - "label": "Listen stream port", - "regex": "^[0-9]+$", - "type": "text", - }, - "LISTEN_STREAM_PORT_SSL": { - "context": "multisite", - "default": "4242", - "help": "Listening port for ssl (passthrough).", - "id": "listen-stream-port-ssl", - "label": "Listen stream port ssl", - "regex": "^[0-9]+$", - "type": "text", - }, - "USE_UDP": { - "context": "multisite", - "default": "no", - "help": "UDP listen instead of TCP (stream).", - "id": "use-udp", - "label": "Listen UDP", - "regex": "^(yes|no)$", - "type": "check", - }, - "USE_IPV6": { - "context": "global", - "default": "no", - "help": "Enable IPv6 connectivity.", - "id": "use-ipv6", - "label": "Use IPv6", - "regex": "^(yes|no)$", - "type": "check", - }, - "IS_DRAFT": { - "context": "multisite", - "default": "no", - "help": "Internal use : set to yes when the service is in draft mode.", - "id": "internal-use-draft", - "label": "internal use draft", - "regex": "^(yes|no)$", - "type": "check", - }, - "TIMERS_LOG_LEVEL": { - "context": "global", - "default": "debug", - "help": "Log level for timers.", - "id": "timers-log-level", - "label": "Timers log level", - "regex": "^(debug|info|notice|warn|err|crit|alert|emerg)$", - "type": "select", - "select": [ - "alert", - "crit", - "debug", - "emerg", - "err", - "info", - "notice", - "warn", - ], - }, - "BUNKERWEB_INSTANCES": { - "context": "global", - "default": "127.0.0.1", - "help": "List of BunkerWeb instances separated with spaces (format : fqdn-or-ip:5000 http://fqdn-or-ip:5000)", - "id": "bunkerweb-instances", - "label": "BunkerWeb instances", - "regex": "^.*$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "antibot", - "stream": "no", - "name": "Antibot", - "description": "Bot detection by using a challenge.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": True, - "settings": { - "USE_ANTIBOT": { - "context": "multisite", - "default": "no", - "help": "Activate antibot feature.", - "id": "use-antibot", - "label": "Antibot challenge", - "regex": "^(no|cookie|javascript|captcha|recaptcha|hcaptcha|turnstile)$", - "type": "select", - "select": [ - "captcha", - "cookie", - "hcaptcha", - "javascript", - "no", - "recaptcha", - "turnstile", - ], - }, - "ANTIBOT_URI": { - "context": "multisite", - "default": "/challenge", - "help": "Unused URI that clients will be redirected to to solve the challenge.", - "id": "antibot-uri", - "label": "Antibot URL", - "regex": "^\\/[\\w\\].~:\\/?#\\[@!$\\&'\\(\\)*+,;=\\-]*$", - "type": "text", - }, - "ANTIBOT_TIME_RESOLVE": { - "context": "multisite", - "default": "60", - "help": "Maximum time (in seconds) clients have to resolve the challenge. Once this time has passed, a new challenge will be generated.", - "id": "antibot-time-resolve", - "label": "Time to resolve", - "regex": "^[0-9]+$", - "type": "text", - }, - "ANTIBOT_TIME_VALID": { - "context": "multisite", - "default": "86400", - "help": "Maximum validity time of solved challenges. Once this time has passed, clients will need to resolve a new one.", - "id": "antibot-time-valid", - "label": "Time valid", - "regex": "^[0-9]+$", - "type": "text", - }, - "ANTIBOT_RECAPTCHA_SCORE": { - "context": "multisite", - "default": "0.7", - "help": "Minimum score required for reCAPTCHA challenge.", - "id": "antibot-recaptcha-score", - "label": "reCAPTCHA score", - "regex": "^(0\\.[1-9]|1\\.0)$", - "type": "text", - }, - "ANTIBOT_RECAPTCHA_SITEKEY": { - "context": "multisite", - "default": "", - "help": "Sitekey for reCAPTCHA challenge.", - "id": "antibot-recaptcha-sitekey", - "label": "reCAPTCHA sitekey", - "regex": "^[\\w\\-]*$", - "type": "text", - }, - "ANTIBOT_RECAPTCHA_SECRET": { - "context": "multisite", - "default": "", - "help": "Secret for reCAPTCHA challenge.", - "id": "antibot-recaptcha-secret", - "label": "reCAPTCHA secret", - "regex": "^[\\w\\-]*$", - "type": "password", - }, - "ANTIBOT_HCAPTCHA_SITEKEY": { - "context": "multisite", - "default": "", - "help": "Sitekey for hCaptcha challenge.", - "id": "antibot-hcaptcha-sitekey", - "label": "hCaptcha sitekey", - "regex": "^[a-zA-Z0-9\\-]*$", - "type": "text", - }, - "ANTIBOT_HCAPTCHA_SECRET": { - "context": "multisite", - "default": "", - "help": "Secret for hCaptcha challenge.", - "id": "antibot-hcaptcha-secret", - "label": "hCaptcha secret", - "regex": "^\\w*$", - "type": "password", - }, - "ANTIBOT_TURNSTILE_SITEKEY": { - "context": "multisite", - "default": "", - "help": "Sitekey for Turnstile challenge.", - "id": "antibot-turnstile-sitekey", - "label": "Turnstile sitekey", - "regex": "^(0x[\\w\\-]+)?$", - "type": "text", - }, - "ANTIBOT_TURNSTILE_SECRET": { - "context": "multisite", - "default": "", - "help": "Secret for Turnstile challenge.", - "id": "antibot-turnstile-secret", - "label": "Turnstile secret", - "regex": "^(0x[\\w\\-]+)?$", - "type": "password", - }, - }, - "checksum": None, - }, - { - "id": "authbasic", - "stream": "no", - "name": "Auth basic", - "description": "Enforce login before accessing a resource or the whole site using HTTP basic auth method.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "USE_AUTH_BASIC": { - "context": "multisite", - "default": "no", - "help": "Use HTTP basic auth", - "id": "use-auth-basic", - "label": "Use HTTP basic auth", - "regex": "^(yes|no)$", - "type": "check", - }, - "AUTH_BASIC_LOCATION": { - "context": "multisite", - "default": "sitewide", - "help": "URL of the protected resource or sitewide value.", - "id": "auth-basic-location", - "label": "Auth basic Location", - "regex": "^(sitewide|/[a-zA-Z0-9.\\/\\-]*)$", - "type": "text", - }, - "AUTH_BASIC_USER": { - "context": "multisite", - "default": "changeme", - "help": "Username", - "id": "auth-basic-user", - "label": "Auth basic Username", - "regex": "^[\\w\\-]+", - "type": "text", - }, - "AUTH_BASIC_PASSWORD": { - "context": "multisite", - "default": "changeme", - "help": "Password", - "id": "auth-basic-password", - "label": "Password", - "regex": "^.+", - "type": "password", - }, - "AUTH_BASIC_TEXT": { - "context": "multisite", - "default": "Restricted area", - "help": "Text to display", - "id": "auth-basic-text", - "label": "Text", - "regex": "^.+", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "backup", - "stream": "yes", - "name": "Backup", - "description": "Backup your data to a custom location. Ensure the safety and availability of your important files by creating regular backups.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": True, - "settings": { - "USE_BACKUP": { - "context": "global", - "default": "yes", - "help": "Enable or disable the backup feature", - "id": "use-backup", - "label": "Activate automatic backup", - "regex": "^(yes|no)$", - "type": "check", - }, - "BACKUP_SCHEDULE": { - "context": "global", - "default": "daily", - "help": "The frequency of the backup (daily, weekly or monthly)", - "id": "backup-schedule", - "label": "Backup schedule", - "regex": "^(daily|weekly|monthly)$", - "type": "select", - "select": ["daily", "monthly", "weekly"], - }, - "BACKUP_ROTATION": { - "context": "global", - "default": "7", - "help": "The number of backups to keep", - "id": "backup-rotation", - "label": "Backup rotation", - "regex": "^[1-9][0-9]*$", - "type": "text", - }, - "BACKUP_DIRECTORY": { - "context": "global", - "default": "/var/lib/bunkerweb/backups", - "help": "The directory where the backup will be stored", - "id": "backup-directory", - "label": "Backup directory", - "regex": "^.*$", - "type": "text", - }, - }, - "checksum": None, - "bwcli": {"list": "list.py", "restore": "restore.py", "save": "save.py"}, - }, - { - "id": "badbehavior", - "stream": "yes", - "name": "Bad behavior", - "description": "Ban IP generating too much 'bad' HTTP status code in a period of time.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": True, - "settings": { - "USE_BAD_BEHAVIOR": { - "context": "multisite", - "default": "yes", - "help": "Activate Bad behavior feature.", - "id": "use-bad-behavior", - "label": "Activate bad behavior", - "regex": "^(yes|no)$", - "type": "check", - }, - "BAD_BEHAVIOR_STATUS_CODES": { - "context": "multisite", - "default": "400 401 403 404 405 429 444", - "help": "List of HTTP status codes considered as 'bad'.", - "id": "bad-behavior-status-code", - "label": "Bad status codes", - "regex": "^( *([1-5]\\d{2})(?!.*\\2) *)+$", - "type": "text", - }, - "BAD_BEHAVIOR_THRESHOLD": { - "context": "multisite", - "default": "10", - "help": "Maximum number of 'bad' HTTP status codes within the period of time before IP is banned.", - "id": "bad-behavior-threshold", - "label": "Threshold", - "regex": "^[1-9][0-9]*", - "type": "text", - }, - "BAD_BEHAVIOR_COUNT_TIME": { - "context": "multisite", - "default": "60", - "help": "Period of time (in seconds) during which we count 'bad' HTTP status codes.", - "id": "bad-behavior-period", - "label": "Period (in seconds)", - "regex": "^\\d+", - "type": "text", - }, - "BAD_BEHAVIOR_BAN_TIME": { - "context": "multisite", - "default": "86400", - "help": "The duration time (in seconds) of a ban when the corresponding IP has reached the threshold.", - "id": "bad-behavior-ban-time", - "label": "Ban duration (in seconds)", - "regex": "^\\d+", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "blacklist", - "stream": "partial", - "name": "Blacklist", - "description": "Deny access based on internal and external IP/network/rDNS/ASN blacklists.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": True, - "settings": { - "USE_BLACKLIST": { - "context": "multisite", - "default": "yes", - "help": "Activate blacklist feature.", - "id": "use-blacklist", - "label": "Activate blacklisting", - "regex": "^(yes|no)$", - "type": "check", - }, - "BLACKLIST_IP": { - "context": "multisite", - "default": "", - "help": "List of IP/network, separated with spaces, to block.", - "id": "blacklist-ip", - "label": "Blacklist IP/network", - "regex": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "type": "text", - }, - "BLACKLIST_RDNS": { - "context": "multisite", - "default": ".shodan.io .censys.io", - "help": "List of reverse DNS suffixes, separated with spaces, to block.", - "id": "blacklist-rdns", - "label": "Blacklist reverse DNS", - "regex": "^( *(([^ ]+)(?!.*\\3( |$))) *)*$", - "type": "text", - }, - "BLACKLIST_RDNS_GLOBAL": { - "context": "multisite", - "default": "yes", - "help": "Only perform RDNS blacklist checks on global IP addresses.", - "id": "blacklist-rdns-global", - "label": "Blacklist reverse DNS global IPs", - "regex": "^(yes|no)$", - "type": "check", - }, - "BLACKLIST_ASN": { - "context": "multisite", - "default": "", - "help": "List of ASN numbers, separated with spaces, to block.", - "id": "blacklist-asn", - "label": "Blacklist ASN", - "regex": "^^( *((ASN?)?(\\d+)\\b(?!.*[SN ]\\4\\b)) *)*$", - "type": "text", - }, - "BLACKLIST_USER_AGENT": { - "context": "multisite", - "default": "", - "help": "List of User-Agent (PCRE regex), separated with spaces, to block.", - "id": "blacklist-user-agent", - "label": "Blacklist User-Agent", - "regex": "^.*$", - "type": "text", - }, - "BLACKLIST_URI": { - "context": "multisite", - "default": "", - "help": "List of URI (PCRE regex), separated with spaces, to block.", - "id": "blacklist-uri", - "label": "Blacklist URI", - "regex": "^( *(.*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "BLACKLIST_IGNORE_IP": { - "context": "multisite", - "default": "", - "help": "List of IP/network, separated with spaces, to ignore in the blacklist.", - "id": "blacklist-ignore-ip", - "label": "Blacklist ignore IP/network", - "regex": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "type": "text", - }, - "BLACKLIST_IGNORE_RDNS": { - "context": "multisite", - "default": "", - "help": "List of reverse DNS suffixes, separated with spaces, to ignore in the blacklist.", - "id": "blacklist-ignore-rdns", - "label": "Blacklist ignore reverse DNS", - "regex": "^( *(([^ ]+)(?!.*\\3( |$))) *)*$", - "type": "text", - }, - "BLACKLIST_IGNORE_ASN": { - "context": "multisite", - "default": "", - "help": "List of ASN numbers, separated with spaces, to ignore in the blacklist.", - "id": "blacklist-ignore-asn", - "label": "Blacklist ignore ASN", - "regex": "^^( *((ASN?)?(\\d+)\\b(?!.*[SN ]\\4\\b)) *)*$", - "type": "text", - }, - "BLACKLIST_IGNORE_USER_AGENT": { - "context": "multisite", - "default": "", - "help": "List of User-Agent (PCRE regex), separated with spaces, to ignore in the blacklist.", - "id": "blacklist-ignore-user-agent", - "label": "Blacklist ignore User-Agent", - "regex": "^.*$", - "type": "text", - }, - "BLACKLIST_IGNORE_URI": { - "context": "multisite", - "default": "", - "help": "List of URI (PCRE regex), separated with spaces, to ignore in the blacklist.", - "id": "blacklist-ignore-uri", - "label": "Blacklist ignore URI", - "regex": "^( *(.*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "BLACKLIST_IP_URLS": { - "context": "global", - "default": "https://www.dan.me.uk/torlist/?exit", - "help": "List of URLs, separated with spaces, containing bad IP/network to block.", - "id": "blacklist-ip-urls", - "label": "Blacklist IP/network URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "BLACKLIST_RDNS_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing reverse DNS suffixes to block.", - "id": "blacklist-rdns-urls", - "label": "Blacklist reverse DNS URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "BLACKLIST_ASN_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing ASN to block.", - "id": "blacklist-asn-urls", - "label": "Blacklist ASN URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "BLACKLIST_USER_AGENT_URLS": { - "context": "global", - "default": "https://raw.githubusercontent.com/mitchellkrogza/nginx-ultimate-bad-bot-blocker/master/_generator_lists/bad-user-agents.list", - "help": "List of URLs, separated with spaces, containing bad User-Agent to block.", - "id": "blacklist-user-agent-urls", - "label": "Blacklist User-Agent URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "BLACKLIST_URI_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing bad URI to block.", - "id": "blacklist-uri-urls", - "label": "Blacklist URI URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "BLACKLIST_IGNORE_IP_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing IP/network to ignore in the blacklist.", - "id": "blacklist-ignore-ip-urls", - "label": "Blacklist ignore IP/network URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "BLACKLIST_IGNORE_RDNS_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing reverse DNS suffixes to ignore in the blacklist.", - "id": "blacklist-ignore-rdns-urls", - "label": "Blacklist ignore reverse DNS URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "BLACKLIST_IGNORE_ASN_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing ASN to ignore in the blacklist.", - "id": "blacklist-ignore-asn-urls", - "label": "Blacklist ignore ASN URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "BLACKLIST_IGNORE_USER_AGENT_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing User-Agent to ignore in the blacklist.", - "id": "blacklist-ignore-user-agent-urls", - "label": "Blacklist ignore User-Agent URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "BLACKLIST_IGNORE_URI_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing URI to ignore in the blacklist.", - "id": "blacklist-ignore-uri-urls", - "label": "Blacklist ignore URI URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "brotli", - "stream": "no", - "name": "Brotli", - "description": "Compress HTTP requests with the brotli algorithm.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "USE_BROTLI": { - "context": "multisite", - "default": "no", - "help": "Use brotli", - "id": "use-brotli", - "label": "Use brotli", - "regex": "^(yes|no)$", - "type": "check", - }, - "BROTLI_TYPES": { - "context": "multisite", - "default": "application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml", - "help": "List of MIME types that will be compressed with brotli.", - "id": "brotli-types", - "label": "MIME types", - "regex": "^(?! )( ?([\\-\\w.]+/[\\-\\w.+]+)(?!.*\\2(?!.)))+$", - "type": "text", - }, - "BROTLI_MIN_LENGTH": { - "context": "multisite", - "default": "1000", - "help": "Minimum length for brotli compression.", - "id": "brotli-min-length", - "label": "Minimum length", - "regex": "^\\d+", - "type": "text", - }, - "BROTLI_COMP_LEVEL": { - "context": "multisite", - "default": "6", - "help": "The compression level of the brotli algorithm.", - "id": "brotli-comp-level", - "label": "Compression level", - "regex": "^([02-9]|1[01]?)$", - "type": "select", - "select": [ - "0", - "1", - "10", - "11", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - ], - }, - }, - "checksum": None, - }, - { - "id": "bunkernet", - "stream": "yes", - "name": "BunkerNet", - "description": "Share threat data with other BunkerWeb instances via BunkerNet.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": True, - "settings": { - "USE_BUNKERNET": { - "context": "multisite", - "default": "yes", - "help": "Activate BunkerNet feature.", - "id": "use-bunkernet", - "label": "Activate BunkerNet", - "regex": "^(yes|no)$", - "type": "check", - }, - "BUNKERNET_SERVER": { - "context": "global", - "default": "https://api.bunkerweb.io", - "help": "Address of the BunkerNet API.", - "id": "bunkernet-server", - "label": "BunkerNet server", - "regex": "^https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "cors", - "stream": "no", - "name": "CORS", - "description": "Cross-Origin Resource Sharing.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": True, - "settings": { - "USE_CORS": { - "context": "multisite", - "default": "no", - "help": "Use CORS", - "id": "use-cors", - "label": "Use CORS", - "regex": "^(yes|no)$", - "type": "check", - }, - "CORS_ALLOW_ORIGIN": { - "context": "multisite", - "default": "*", - "help": "Allowed origins to make CORS requests : PCRE regex or *.", - "id": "cors-allow-origin", - "label": "Allowed origins", - "regex": "^.*$", - "type": "text", - }, - "CORS_ALLOW_METHODS": { - "context": "multisite", - "default": "GET, POST, OPTIONS", - "help": "Value of the Access-Control-Allow-Methods header.", - "id": "cors-allow-methods", - "label": "Access-Control-Allow-Methods value", - "regex": "^(\\*|(?![, ])(,? ?(GET|HEAD|POST|PUT|DELETE|CONNECT|OPTIONS|TRACE|PATCH)(?!.*\\3))*)?$", - "type": "text", - }, - "CORS_ALLOW_HEADERS": { - "context": "multisite", - "default": "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range", - "help": "Value of the Access-Control-Allow-Headers header.", - "id": "cors-allow-headers", - "label": "Access-Control-Allow-Headers value", - "regex": "^(\\*|(?![, ])(,? ?([\\w\\-]+)(?!.*\\3(?!.)))*)?$", - "type": "text", - }, - "CORS_ALLOW_CREDENTIALS": { - "context": "multisite", - "default": "no", - "help": "Send the Access-Control-Allow-Credentials header.", - "id": "cors-allow-credentials", - "label": "Send Access-Control-Allow-Credentials", - "regex": "^(yes|no)$", - "type": "check", - }, - "CORS_EXPOSE_HEADERS": { - "context": "multisite", - "default": "Content-Length,Content-Range", - "help": "Value of the Access-Control-Expose-Headers header.", - "id": "cors-expose-headers", - "label": "Access-Control-Expose-Headers value", - "regex": "^(\\*|(?![, ]+)(,? ?([\\w\\-]+)(?!.*\\3(?!.)))*)?$", - "type": "text", - }, - "CROSS_ORIGIN_OPENER_POLICY": { - "context": "multisite", - "default": "", - "help": "Value for the Cross-Origin-Opener-Policy header.", - "id": "cross-origin-opener-policy", - "label": "Cross-Origin-Opener-Policy", - "regex": "^(unsafe-none|same-origin-allow-popups|same-origin)?$", - "type": "select", - "select": [ - "", - "same-origin", - "same-origin-allow-popups", - "unsafe-none", - ], - }, - "CROSS_ORIGIN_EMBEDDER_POLICY": { - "context": "multisite", - "default": "", - "help": "Value for the Cross-Origin-Embedder-Policy header.", - "id": "cross-origin-embedder-policy", - "label": "Cross-Origin-Embedder-Policy", - "regex": "^(unsafe-none|require-corp|credentialless)?$", - "type": "select", - "select": ["", "credentialless", "require-corp", "unsafe-none"], - }, - "CROSS_ORIGIN_RESOURCE_POLICY": { - "context": "multisite", - "default": "", - "help": "Value for the Cross-Origin-Resource-Policy header.", - "id": "cross-origin-resource-policy", - "label": "Cross-Origin-Resource-Policy", - "regex": "^(same-site|same-origin|cross-origin)?$", - "type": "select", - "select": ["", "cross-origin", "same-origin", "same-site"], - }, - "CORS_MAX_AGE": { - "context": "multisite", - "default": "86400", - "help": "Value of the Access-Control-Max-Age header.", - "id": "cors-max-age", - "label": "Access-Control-Max-Age value", - "regex": "^\\d+$", - "type": "text", - }, - "CORS_DENY_REQUEST": { - "context": "multisite", - "default": "yes", - "help": "Deny request and don't send it to backend if Origin is not allowed.", - "id": "cors-deny-request", - "label": "Deny request", - "regex": "^(yes|no)$", - "type": "check", - }, - }, - "checksum": None, - }, - { - "id": "clientcache", - "stream": "no", - "name": "Client cache", - "description": "Manage caching for clients.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "USE_CLIENT_CACHE": { - "context": "multisite", - "default": "no", - "help": "Tell client to store locally static files.", - "id": "use-client-cache", - "label": "Use client cache", - "regex": "^(yes|no)$", - "type": "check", - }, - "CLIENT_CACHE_EXTENSIONS": { - "context": "global", - "default": "jpg|jpeg|png|bmp|ico|svg|tif|css|js|otf|ttf|eot|woff|woff2", - "help": "List of file extensions, separated with pipes that should be cached.", - "id": "client-cache-extensions", - "label": "Extensions that should be cached by the client", - "regex": "^(?!\\|)(\\|?([a-z0-9]+)(?!.*\\2(?!.)))+$", - "type": "text", - }, - "CLIENT_CACHE_ETAG": { - "context": "multisite", - "default": "yes", - "help": "Send the HTTP ETag header for static resources.", - "id": "client-cache-etag", - "label": "ETag", - "regex": "^(yes|no)$", - "type": "check", - }, - "CLIENT_CACHE_CONTROL": { - "context": "multisite", - "default": "public, max-age=15552000", - "help": "Value of the Cache-Control HTTP header.", - "id": "client-cache-control", - "label": "Cache-Control header", - "regex": "^(?!(, ?| ))((, )?(((max-age|s-maxage|stale-while-revalidate|stale-if-error)=\\d+(?!.*\\6))|((?!.*public)private|(?!.*private)public)|(must|proxy)-revalidate|must-understand|immutable|no-(cache|store|transform))(?!.*\\4))+$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "country", - "stream": "yes", - "name": "Country", - "description": "Deny access based on the country of the client IP.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": True, - "settings": { - "BLACKLIST_COUNTRY": { - "context": "multisite", - "default": "", - "help": "Deny access if the country of the client is in the list (ISO 3166-1 alpha-2 format separated with spaces).", - "id": "country-blacklist", - "label": "Country blacklist", - "regex": "^(?! )( *([A-Z]{2})(?!.*\\2) *)*$", - "type": "text", - }, - "WHITELIST_COUNTRY": { - "context": "multisite", - "default": "", - "help": "Deny access if the country of the client is not in the list (ISO 3166-1 alpha-2 format separated with spaces).", - "id": "country-whitelist", - "label": "Country whitelist", - "regex": "^(?! )( *([A-Z]{2})(?!.*\\2) *)*$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "customcert", - "stream": "yes", - "name": "Custom HTTPS certificate", - "description": "Choose custom certificate for HTTPS.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "USE_CUSTOM_SSL": { - "context": "multisite", - "default": "no", - "help": "Use custom HTTPS certificate.", - "id": "use-custom-https", - "label": "Use custom certificate", - "regex": "^(yes|no)$", - "type": "check", - }, - "CUSTOM_SSL_CERT": { - "context": "multisite", - "default": "", - "help": "Full path of the certificate or bundle file (must be readable by the scheduler).", - "id": "custom-https-cert", - "label": "Certificate path", - "regex": "^(/[\\w. \\-]+)*/?$", - "type": "text", - }, - "CUSTOM_SSL_KEY": { - "context": "multisite", - "default": "", - "help": "Full path of the key file (must be readable by the scheduler).", - "id": "custom-https-key", - "label": "Key path", - "regex": "^(/[\\w. \\-]+)*/?$", - "type": "text", - }, - "CUSTOM_SSL_CERT_DATA": { - "context": "multisite", - "default": "", - "help": "Certificate data encoded in base64.", - "id": "custom-https-cert-data", - "label": "Certificate data (base64)", - "regex": "^.*$", - "type": "text", - }, - "CUSTOM_SSL_KEY_DATA": { - "context": "multisite", - "default": "", - "help": "Key data encoded in base64.", - "id": "custom-https-key-data", - "label": "Key data (base64)", - "regex": "^.*$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "db", - "stream": "yes", - "name": "DB", - "description": "Integrate easily the Database.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "DATABASE_URI": { - "context": "global", - "default": "sqlite:////var/lib/bunkerweb/db.sqlite3", - "help": "The database URI, following the sqlalchemy format.", - "id": "database-uri", - "label": "The database URI", - "regex": "^((postgresql|mysql|mariadb|sqlite)(\\+[\\w\\-]+)?:.+)?$", - "type": "text", - }, - "DATABASE_URI_READONLY": { - "context": "global", - "default": "", - "help": "The database URI for read-only operations, it can also serve as a fallback if the main database is down. Following the sqlalchemy format.", - "id": "database-uri-readonly", - "label": "The database URI for read-only operations", - "regex": "^((postgresql|mysql|mariadb|sqlite)(\\+[\\w\\-]+)?:.+)?$", - "type": "text", - }, - "DATABASE_LOG_LEVEL": { - "context": "global", - "default": "warning", - "help": "The level to use for database logs.", - "id": "database-log-level", - "label": "Database log level", - "regex": "^(debug|info|warn|warning|error)$", - "type": "select", - "select": ["debug", "error", "info", "warn", "warning"], - }, - }, - "checksum": None, - }, - { - "id": "dnsbl", - "stream": "yes", - "name": "DNSBL", - "description": "Deny access based on external DNSBL servers.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": True, - "settings": { - "USE_DNSBL": { - "context": "multisite", - "default": "yes", - "help": "Activate DNSBL feature.", - "id": "use-dnsbl", - "label": "Activate DNSBL", - "regex": "^(yes|no)$", - "type": "check", - }, - "DNSBL_LIST": { - "context": "global", - "default": "bl.blocklist.de problems.dnsbl.sorbs.net sbl.spamhaus.org xbl.spamhaus.org", - "help": "List of DNSBL servers.", - "id": "dnsbl-list", - "label": "DNSBL list", - "regex": "^(?! )( ?((?!\\.)[\\w.]+)(?!.*\\2(?!.)))*$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "errors", - "stream": "no", - "name": "Errors", - "description": "Manage default error pages", - "version": "1.0", - "type": "core", - "method": "manual", - "page": True, - "settings": { - "ERRORS": { - "context": "multisite", - "default": "", - "help": "List of HTTP error code and corresponding error pages, separated with spaces (404=/my404.html 403=/errors/403.html ...).", - "id": "errors", - "label": "Errors", - "regex": "^(?! )( ?([1-5]\\d{2})(?!.*\\2(?![^=]))=(\\/[\\w\\].~:\\/?#\\[@!$\\&'\\(\\)*+,;=\\-]*)(?!.*\\3(?!.)))*$", - "type": "text", - }, - "INTERCEPTED_ERROR_CODES": { - "context": "multisite", - "default": "400 401 403 404 405 413 429 500 501 502 503 504", - "help": "List of HTTP error code intercepted by BunkerWeb", - "id": "intercepted-error-codes", - "label": "Intercepted error codes", - "regex": "^( *([1-5]\\d{2})(?!.*\\2) *)+$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "greylist", - "stream": "partial", - "name": "Greylist", - "description": "Allow access while keeping security features based on internal and external IP/network/rDNS/ASN greylists.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": True, - "settings": { - "USE_GREYLIST": { - "context": "multisite", - "default": "no", - "help": "Activate greylist feature.", - "id": "use-greylist", - "label": "Activate greylisting", - "regex": "^(yes|no)$", - "type": "check", - }, - "GREYLIST_IP": { - "context": "multisite", - "default": "", - "help": "List of IP/network, separated with spaces, to put into the greylist.", - "id": "greylist-ip", - "label": "Greylist IP/network", - "regex": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "type": "text", - }, - "GREYLIST_RDNS": { - "context": "multisite", - "default": "", - "help": "List of reverse DNS suffixes, separated with spaces, to put into the greylist.", - "id": "greylist-rdns", - "label": "Greylist reverse DNS", - "regex": "^( *(([^ ]+)(?!.*\\3( |$))) *)*$", - "type": "text", - }, - "GREYLIST_RDNS_GLOBAL": { - "context": "multisite", - "default": "yes", - "help": "Only perform RDNS greylist checks on global IP addresses.", - "id": "greylist-rdns-global", - "label": "Greylist reverse DNS global IPs", - "regex": "^(yes|no)$", - "type": "check", - }, - "GREYLIST_ASN": { - "context": "multisite", - "default": "", - "help": "List of ASN numbers, separated with spaces, to put into the greylist.", - "id": "greylist-asn", - "label": "Greylist ASN", - "regex": "^^( *((ASN?)?(\\d+)\\b(?!.*[SN ]\\4\\b)) *)*$", - "type": "text", - }, - "GREYLIST_USER_AGENT": { - "context": "multisite", - "default": "", - "help": "List of User-Agent (PCRE regex), separated with spaces, to put into the greylist.", - "id": "greylist-user-agent", - "label": "Greylist User-Agent", - "regex": "^.*$", - "type": "text", - }, - "GREYLIST_URI": { - "context": "multisite", - "default": "", - "help": "List of URI (PCRE regex), separated with spaces, to put into the greylist.", - "id": "greylist-uri", - "label": "Greylist URI", - "regex": "^.*$", - "type": "text", - }, - "GREYLIST_IP_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing good IP/network to put into the greylist.", - "id": "greylist-ip-urls", - "label": "Greylist IP/network URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "GREYLIST_RDNS_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing reverse DNS suffixes to put into the greylist.", - "id": "greylist-rdns-urls", - "label": "Greylist reverse DNS URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "GREYLIST_ASN_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing ASN to put into the greylist.", - "id": "greylist-asn-urls", - "label": "Greylist ASN URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "GREYLIST_USER_AGENT_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing good User-Agent to put into the greylist.", - "id": "greylist-user-agent-urls", - "label": "Greylist User-Agent URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "GREYLIST_URI_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing bad URI to put into the greylist.", - "id": "greylist-uri-urls", - "label": "Greylist URI URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "gzip", - "stream": "no", - "name": "Gzip", - "description": "Compress HTTP requests with the gzip algorithm.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "USE_GZIP": { - "context": "multisite", - "default": "no", - "help": "Use gzip", - "id": "use-gzip", - "label": "Use gzip", - "regex": "^(yes|no)$", - "type": "check", - }, - "GZIP_TYPES": { - "context": "multisite", - "default": "application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml", - "help": "List of MIME types that will be compressed with gzip.", - "id": "gzip-types", - "label": "MIME types", - "regex": "^(?! )( ?([\\-\\w.]+/[\\-\\w.+]+)(?!.*\\2(?!.)))+$", - "type": "text", - }, - "GZIP_MIN_LENGTH": { - "context": "multisite", - "default": "1000", - "help": "Minimum length for gzip compression.", - "id": "gzip-min-length", - "label": "Minimum length", - "regex": "^\\d+$", - "type": "text", - }, - "GZIP_COMP_LEVEL": { - "context": "multisite", - "default": "5", - "help": "The compression level of the gzip algorithm.", - "id": "gzip-comp-level", - "label": "Compression level", - "regex": "^[1-9]$", - "type": "select", - "select": ["1", "2", "3", "4", "5", "6", "7", "8", "9"], - }, - "GZIP_PROXIED": { - "context": "multisite", - "default": "no-cache no-store private expired auth", - "help": "Which kind of proxied requests we should compress.", - "id": "gzip-proxied", - "label": "Proxied requests", - "regex": "^.*$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "inject", - "stream": "no", - "name": "HTML injection", - "description": "Inject custom HTML code before the tag.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "INJECT_BODY": { - "context": "multisite", - "default": "", - "help": "The HTML code to inject.", - "id": "inject-body", - "label": "HTML code", - "regex": "^.*$", - "type": "text", - } - }, - "checksum": None, - }, - { - "id": "headers", - "stream": "no", - "name": "Headers", - "description": "Manage HTTP headers sent to clients.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "CUSTOM_HEADER": { - "context": "multisite", - "default": "", - "help": "Custom header to add (HeaderName: HeaderValue).", - "id": "custom-header", - "label": "Custom header (HeaderName: HeaderValue)", - "regex": "^([\\w\\-]+: .+)?$", - "type": "text", - "multiple": "custom-headers", - }, - "REMOVE_HEADERS": { - "context": "multisite", - "default": "Server Expect-CT X-Powered-By X-AspNet-Version X-AspNetMvc-Version", - "help": "Headers to remove (Header1 Header2 Header3 ...)", - "id": "remove-headers", - "label": "Remove headers", - "regex": "^(?! )( ?[\\w\\-]+)*$", - "type": "text", - }, - "KEEP_UPSTREAM_HEADERS": { - "context": "multisite", - "default": "Content-Security-Policy Permissions-Policy Feature-Policy X-Frame-Options", - "help": "Headers to keep from upstream (Header1 Header2 Header3 ... or * for all).", - "id": "keep-upstream-headers", - "label": "Keep upstream headers", - "regex": "^((?! )( ?[\\w\\-]+)+|\\*)?$", - "type": "text", - }, - "STRICT_TRANSPORT_SECURITY": { - "context": "multisite", - "default": "max-age=31536000", - "help": "Value for the Strict-Transport-Security header.", - "id": "strict-transport-security", - "label": "Strict-Transport-Security", - "regex": "^max-age=\\d+(; includeSubDomains(; preload)?)?$", - "type": "text", - }, - "COOKIE_FLAGS": { - "context": "multisite", - "default": "* HttpOnly SameSite=Lax", - "help": "Cookie flags automatically added to all cookies (value accepted for nginx_cookie_flag_module).", - "id": "cookie-flags", - "label": "Cookie flags", - "regex": "^(\\*|[^;]+)( (HttpOnly|(SameSite)(?!.*\\4)(=(Lax|Strict))?)(?!.*\\3))*$", - "type": "text", - "multiple": "cookie-flags", - }, - "COOKIE_AUTO_SECURE_FLAG": { - "context": "multisite", - "default": "yes", - "help": "Automatically add the Secure flag to all cookies.", - "id": "cookie-auto-secure-flag", - "label": "Cookie auto Secure flag", - "regex": "^(yes|no)$", - "type": "check", - }, - "CONTENT_SECURITY_POLICY": { - "context": "multisite", - "default": "object-src 'none'; form-action 'self'; frame-ancestors 'self';", - "help": "Value for the Content-Security-Policy header.", - "id": "content-security-policy", - "label": "Content-Security-Policy", - "regex": "^.*$", - "type": "text", - }, - "CONTENT_SECURITY_POLICY_REPORT_ONLY": { - "context": "multisite", - "default": "no", - "help": "Send reports for violations of the Content-Security-Policy header instead of blocking them.", - "id": "content-security-policy-report-only", - "label": "Content-Security-Policy-Report-Only", - "regex": "^(yes|no)$", - "type": "check", - }, - "REFERRER_POLICY": { - "context": "multisite", - "default": "strict-origin-when-cross-origin", - "help": "Value for the Referrer-Policy header.", - "id": "referrer-policy", - "label": "Referrer-Policy", - "regex": "^(?!^(,| ))((, )?(no-referrer-when-downgrade|no-referrer|origin-when-cross-origin|same-origin|strict-origin-when-cross-origin|strict-origin|origin|unsafe-url)(?!\\b.*, \\4\\b))*$", - "type": "text", - }, - "PERMISSIONS_POLICY": { - "context": "multisite", - "default": "accelerometer=(), ambient-light-sensor=(), autoplay=(), battery=(), camera=(), cross-origin-isolated=(), display-capture=(), document-domain=(), encrypted-media=(), execution-while-not-rendered=(), execution-while-out-of-viewport=(), fullscreen=(), geolocation=(), gyroscope=(), hid=(), idle-detection=(), magnetometer=(), microphone=(), midi=(), navigation-override=(), payment=(), picture-in-picture=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), usb=(), web-share=(), xr-spatial-tracking=()", - "help": "Value for the Permissions-Policy header.", - "id": "permissions-policy", - "label": "Permissions-Policy", - "regex": "^(?![, ])(,? ?([a-z\\-]+)(?!.*[^\\-]\\2=)=(\\*|\\(( ?(self|\\u0022https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*\\u0022)(?=[ \\)]))*\\)))*$", - "type": "text", - }, - "FEATURE_POLICY": { - "context": "multisite", - "default": "accelerometer 'none'; ambient-light-sensor 'none'; autoplay 'none'; battery 'none'; camera 'none'; display-capture 'none'; document-domain 'none'; encrypted-media 'none'; execution-while-not-rendered 'none'; execution-while-out-of-viewport 'none'; fullscreen 'none'; geolocation 'none'; gyroscope 'none'; layout-animation 'none'; legacy-image-formats 'none'; magnetometer 'none'; microphone 'none'; midi 'none'; navigation-override 'none'; payment 'none'; picture-in-picture 'none'; publickey-credentials-get 'none'; speaker-selection 'none'; sync-xhr 'none'; unoptimized-images 'none'; unsized-media 'none'; usb 'none'; screen-wake-lock 'none'; web-share 'none'; xr-spatial-tracking 'none';", - "help": "Value for the Feature-Policy header.", - "id": "feature-policy", - "label": "Feature-Policy", - "regex": "^(?![; ])( ?([\\w\\-]+)(?!.*[^\\-]\\2 )( ('(none|self|strict-dynamic|report-sample|unsafe-inline|unsafe-eval|unsafe-hashes|unsafe-allow-redirects)'|https?:\\/\\/[\\w@:%.+~#=\\-]+[\\w\\(\\)!@:%+.~#?&\\/=$\\-]*))+;)*$", - "type": "text", - }, - "X_FRAME_OPTIONS": { - "context": "multisite", - "default": "SAMEORIGIN", - "help": "Value for the X-Frame-Options header.", - "id": "x-frame-options", - "label": "X-Frame-Options", - "regex": "^(DENY|SAMEORIGIN)?$", - "type": "select", - "select": ["", "DENY", "SAMEORIGIN"], - }, - "X_CONTENT_TYPE_OPTIONS": { - "context": "multisite", - "default": "nosniff", - "help": "Value for the X-Content-Type-Options header.", - "id": "x-content-type-options", - "label": "X-Content-Type-Options", - "regex": "^(nosniff)?$", - "type": "select", - "select": ["", "nosniff"], - }, - "X_XSS_PROTECTION": { - "context": "multisite", - "default": "1; mode=block", - "help": "Value for the X-XSS-Protection header.", - "id": "x-xss-protection", - "label": "X-XSS-Protection", - "regex": "^0|1(; (mode=block|report=https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*))?$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "jobs", - "stream": "yes", - "name": "Jobs", - "description": "Fake core plugin for internal jobs.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": {}, - "checksum": None, - }, - { - "id": "letsencrypt", - "stream": "yes", - "name": "Let's Encrypt", - "description": "Automatic creation, renewal and configuration of Let's Encrypt certificates.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "AUTO_LETS_ENCRYPT": { - "context": "multisite", - "default": "no", - "help": "Activate automatic Let's Encrypt mode.", - "id": "auto-lets-encrypt", - "label": "Automatic Let's Encrypt", - "regex": "^(yes|no)$", - "type": "check", - }, - "EMAIL_LETS_ENCRYPT": { - "context": "multisite", - "default": "", - "help": "Email used for Let's Encrypt notification and in certificate.", - "id": "email-lets-encrypt", - "label": "Email Let's Encrypt", - "regex": "^([^@ \\t\\r\\n]+@[^@ \\t\\r\\n]+\\.[^@ \\t\\r\\n]+)?$", - "type": "text", - }, - "USE_LETS_ENCRYPT_STAGING": { - "context": "multisite", - "default": "no", - "help": "Use the staging environment for Let’s Encrypt certificate generation. Useful when you are testing your deployments to avoid being rate limited in the production environment.", - "id": "use-lets-encrypt-staging", - "label": "Use Let's Encrypt Staging", - "regex": "^(yes|no)$", - "type": "check", - }, - "LETS_ENCRYPT_CLEAR_OLD_CERTS": { - "context": "global", - "default": "no", - "help": "Clear old certificates when renewing.", - "id": "lets-encrypt-clear-old-certs", - "label": "Clear old certificates when they are no longer needed", - "regex": "^(yes|no)$", - "type": "check", - }, - }, - "checksum": None, - }, - { - "id": "limit", - "stream": "partial", - "name": "Limit", - "description": "Limit maximum number of requests and connections.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": True, - "settings": { - "USE_LIMIT_REQ": { - "context": "multisite", - "default": "yes", - "help": "Activate limit requests feature.", - "id": "use-limit-req", - "label": "Activate limit requests", - "regex": "^(yes|no)$", - "type": "check", - }, - "LIMIT_REQ_URL": { - "context": "multisite", - "default": "/", - "help": "URL (PCRE regex) where the limit request will be applied or special value / for all requests.", - "id": "limit-req-url", - "label": "Limit request URL", - "regex": "^.+$", - "type": "text", - "multiple": "limit-req", - }, - "LIMIT_REQ_RATE": { - "context": "multisite", - "default": "2r/s", - "help": "Rate to apply to the URL (s for second, m for minute, h for hour and d for day).", - "id": "limit-req-rate", - "label": "Limit request Rate", - "regex": "^\\d+r/[smhd]$", - "type": "text", - "multiple": "limit-req", - }, - "USE_LIMIT_CONN": { - "context": "multisite", - "default": "yes", - "help": "Activate limit connections feature.", - "id": "use-limit-conn", - "label": "Activate limit connections", - "regex": "^(yes|no)$", - "type": "check", - }, - "LIMIT_CONN_MAX_HTTP1": { - "context": "multisite", - "default": "10", - "help": "Maximum number of connections per IP when using HTTP/1.X protocol.", - "id": "limit-conn-max-http1", - "label": "Maximum number of HTTP/1.X connections", - "regex": "^\\d+$", - "type": "text", - }, - "LIMIT_CONN_MAX_HTTP2": { - "context": "multisite", - "default": "100", - "help": "Maximum number of streams per IP when using HTTP/2 protocol.", - "id": "limit-conn-max-http2", - "label": "Maximum number of HTTP/2 streams", - "regex": "^\\d+$", - "type": "text", - }, - "LIMIT_CONN_MAX_STREAM": { - "context": "multisite", - "default": "10", - "help": "Maximum number of connections per IP when using stream.", - "id": "limit-conn-max-stream", - "label": "Maximum number of stream connections", - "regex": "^\\d+$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "metrics", - "stream": "partial", - "name": "Metrics", - "description": "Metrics collection and retrieve.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "USE_METRICS": { - "context": "multisite", - "default": "yes", - "help": "Enable collection and retrieval of internal metrics.", - "id": "use-metrics", - "label": "Use metrics", - "regex": "^(yes|no)$", - "type": "check", - }, - "METRICS_MEMORY_SIZE": { - "context": "global", - "default": "16m", - "help": "Size of the internal storage for metrics.", - "id": "metrics-memory-size", - "label": "Metrics memory size", - "regex": "^\\d+[kKmMgG]?$", - "type": "text", - }, - "METRICS_MAX_BLOCKED_REQUESTS": { - "context": "global", - "default": "100", - "help": "Maximum number of blocked requests to store (per worker).", - "id": "metrics-max-blocked-requests", - "label": "Metrics max blocked requests", - "regex": "^\\d+$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "misc", - "stream": "partial", - "name": "Miscellaneous", - "description": "Miscellaneous settings.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": True, - "settings": { - "DISABLE_DEFAULT_SERVER": { - "context": "global", - "default": "no", - "help": "Deny HTTP request if the request vhost is unknown.", - "id": "disable-default-server", - "label": "Disable default server", - "regex": "^(yes|no)$", - "type": "check", - }, - "DISABLE_DEFAULT_SERVER_STRICT_SNI": { - "context": "global", - "default": "no", - "help": "Close SSL/TLS connection if the SNI is unknown.", - "id": "disable-default-server-strict-sni", - "label": "Disable default server strict SNI", - "regex": "^(yes|no)$", - "type": "check", - }, - "REDIRECT_HTTP_TO_HTTPS": { - "context": "multisite", - "default": "no", - "help": "Redirect all HTTP request to HTTPS.", - "id": "redirect-http-to-https", - "label": "Redirect HTTP to HTTPS", - "regex": "^(yes|no)$", - "type": "check", - }, - "AUTO_REDIRECT_HTTP_TO_HTTPS": { - "context": "multisite", - "default": "yes", - "help": "Try to detect if HTTPS is used and activate HTTP to HTTPS redirection if that's the case.", - "id": "auto-redirect-http-to-https", - "label": "Auto redirect HTTP to HTTPS", - "regex": "^(yes|no)$", - "type": "check", - }, - "ALLOWED_METHODS": { - "context": "multisite", - "default": "GET|POST|HEAD", - "help": "Allowed HTTP and WebDAV methods, separated with pipes to be sent by clients.", - "id": "allowed-methods", - "label": "Allowed methods", - "regex": "^(?!\\|)(\\|?([A-Z]{3,})(?!.*(^|\\|)\\2))+$", - "type": "text", - }, - "MAX_CLIENT_SIZE": { - "context": "multisite", - "default": "10m", - "help": "Maximum body size (0 for infinite).", - "id": "max-client-size", - "label": "Maximum body size", - "regex": "^\\d+[kKmMgG]?$", - "type": "text", - }, - "SERVE_FILES": { - "context": "multisite", - "default": "yes", - "help": "Serve files from the local folder.", - "id": "serve-files", - "label": "Serve files", - "regex": "^(yes|no)$", - "type": "check", - }, - "ROOT_FOLDER": { - "context": "multisite", - "default": "", - "help": "Root folder containing files to serve (/var/www/html/{server_name} if unset).", - "id": "root-folder", - "label": "Root folder", - "regex": "^(/[\\w. \\-]+)*/?$", - "type": "text", - }, - "SSL_PROTOCOLS": { - "context": "multisite", - "default": "TLSv1.2 TLSv1.3", - "help": "The supported version of TLS. We recommend the default value TLSv1.2 TLSv1.3 for compatibility reasons.", - "id": "https-protocols", - "label": "HTTPS protocols", - "regex": "^(?! )( ?TLSv1\\.[0-3])*$", - "type": "text", - }, - "HTTP2": { - "context": "multisite", - "default": "yes", - "help": "Support HTTP2 protocol when HTTPS is enabled.", - "id": "http2", - "label": "HTTP2", - "regex": "^(yes|no)$", - "type": "check", - }, - "HTTP3": { - "context": "multisite", - "default": "no", - "help": "Support HTTP3 protocol when HTTPS is enabled.", - "id": "http3", - "label": "HTTP3", - "regex": "^(yes|no)$", - "type": "check", - }, - "HTTP3_ALT_SVC_PORT": { - "context": "multisite", - "default": "443", - "help": "HTTP3 alternate service port. This value will be used as part of the Alt-Svc header.", - "id": "http3-alt-svc-port", - "label": "HTTP3 Alt-Svc port", - "regex": "^\\d+$", - "type": "text", - }, - "LISTEN_HTTP": { - "context": "multisite", - "default": "yes", - "help": "Respond to (insecure) HTTP requests.", - "id": "http-listen", - "label": "HTTP listen", - "regex": "^(yes|no)$", - "type": "check", - }, - "USE_OPEN_FILE_CACHE": { - "context": "multisite", - "default": "no", - "help": "Enable open file cache feature", - "id": "use-open-file-cache", - "label": "Use open file cache", - "regex": "^(yes|no)$", - "type": "check", - }, - "OPEN_FILE_CACHE": { - "context": "multisite", - "default": "max=1000 inactive=20s", - "help": "Open file cache directive", - "id": "open-file-cache", - "label": "Use open file cache", - "regex": "^(off|max=\\d+( inactive=\\d+(ms?|[shdwMy]))?)$", - "type": "text", - }, - "OPEN_FILE_CACHE_ERRORS": { - "context": "multisite", - "default": "yes", - "help": "Enable open file cache for errors", - "id": "open-file-cache-errors", - "label": "Open file cache errors", - "regex": "^(yes|no)$", - "type": "check", - }, - "OPEN_FILE_CACHE_MIN_USES": { - "context": "multisite", - "default": "2", - "help": "Enable open file cache minimum uses", - "id": "open-file-cache-min-uses", - "label": "Open file cache min uses", - "regex": "^[1-9]\\d*$", - "type": "text", - }, - "OPEN_FILE_CACHE_VALID": { - "context": "multisite", - "default": "30s", - "help": "Open file cache valid time", - "id": "open-file-cache-valid", - "label": "Open file cache valid time", - "regex": "^\\d+(ms?|[shdwMy])$", - "type": "text", - }, - "EXTERNAL_PLUGIN_URLS": { - "context": "global", - "default": "", - "help": "List of external plugins URLs (direct download to .zip or .tar file) to download and install (URLs are separated with space).", - "id": "external-plugin-urls", - "label": "External plugin URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "DENY_HTTP_STATUS": { - "context": "global", - "default": "403", - "help": "HTTP status code to send when the request is denied (403 or 444). When using 444, BunkerWeb will close the connection.", - "id": "deny-http-status", - "label": "Deny HTTP status", - "regex": "^(403|444)$", - "type": "select", - "select": ["403", "444"], - }, - "SEND_ANONYMOUS_REPORT": { - "context": "global", - "default": "yes", - "help": "Send anonymous report to BunkerWeb maintainers.", - "id": "send-anonymous-report", - "label": "Send anonymous report", - "regex": "^(yes|no)$", - "type": "check", - }, - }, - "checksum": None, - }, - { - "id": "modsecurity", - "stream": "no", - "name": "ModSecurity", - "description": "Management of the ModSecurity WAF.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "USE_MODSECURITY": { - "context": "multisite", - "default": "yes", - "help": "Enable ModSecurity WAF.", - "id": "use-modsecurity", - "label": "Use ModSecurity", - "regex": "^(yes|no)$", - "type": "check", - }, - "USE_MODSECURITY_CRS": { - "context": "multisite", - "default": "yes", - "help": "Enable OWASP Core Rule Set.", - "id": "use-modsecurity-crs", - "label": "Use Core Rule Set", - "regex": "^(yes|no)$", - "type": "check", - }, - "MODSECURITY_CRS_VERSION": { - "context": "multisite", - "default": "3", - "help": "Version of the OWASP Core Rule Set to use with ModSecurity (3, 4 or nightly).", - "id": "modsecurity-crs-version", - "label": "Core Rule Set Version", - "regex": "^(3|4|nightly)$", - "type": "select", - "select": ["3", "4", "nightly"], - }, - "MODSECURITY_SEC_AUDIT_ENGINE": { - "context": "multisite", - "default": "RelevantOnly", - "help": "SecAuditEngine directive of ModSecurity.", - "id": "modsecurity-sec-audit-engine", - "label": "SecAuditEngine", - "regex": "^(On|RelevantOnly|Off)$", - "type": "select", - "select": ["Off", "On", "RelevantOnly"], - }, - "MODSECURITY_SEC_RULE_ENGINE": { - "context": "multisite", - "default": "On", - "help": "SecRuleEngine directive of ModSecurity.", - "id": "modsecurity-sec-rule-engine", - "label": "SecRuleEngine", - "regex": "^(On|DetectionOnly|Off)$", - "type": "select", - "select": ["DetectionOnly", "Off", "On"], - }, - "MODSECURITY_SEC_AUDIT_LOG_PARTS": { - "context": "multisite", - "default": "ABCFHZ", - "help": "SecAuditLogParts directive of ModSecurity.", - "id": "modsecurity-sec-audit-log-parts", - "label": "SecAuditLogParts", - "regex": "^A(([B-K])(?!.*\\2))+Z$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "php", - "stream": "no", - "name": "PHP", - "description": "Manage local or remote PHP-FPM.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "REMOTE_PHP": { - "context": "multisite", - "default": "", - "help": "Hostname of the remote PHP-FPM instance.", - "id": "remote-php", - "label": "Remote PHP", - "regex": "^((?=.{1,255}$)[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?(?:\\.[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?)*\\.?)?$", - "type": "text", - }, - "REMOTE_PHP_PATH": { - "context": "multisite", - "default": "", - "help": "Root folder containing files in the remote PHP-FPM instance.", - "id": "remote-php-path", - "label": "Remote PHP path", - "regex": "^(/[\\w. \\-]+)*/?$", - "type": "text", - }, - "LOCAL_PHP": { - "context": "multisite", - "default": "", - "help": "Path to the PHP-FPM socket file.", - "id": "local", - "label": "Local PHP", - "regex": "^(/[\\w. \\-]+)*/?$", - "type": "text", - }, - "LOCAL_PHP_PATH": { - "context": "multisite", - "default": "", - "help": "Root folder containing files in the local PHP-FPM instance.", - "id": "local-php-path", - "label": "Local PHP path", - "regex": "^(/[\\w. \\-]+)*/?$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "pro", - "stream": "no", - "name": "Pro", - "description": "Pro settings for the Pro version of BunkerWeb.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "PRO_LICENSE_KEY": { - "context": "global", - "default": "", - "help": "The License Key for the Pro version of BunkerWeb.", - "id": "pro-license-key", - "label": "Pro License Key", - "regex": "^.*$", - "type": "password", - } - }, - "checksum": None, - }, - { - "id": "realip", - "stream": "partial", - "name": "Real IP", - "description": "Get real IP of clients when BunkerWeb is behind a reverse proxy / load balancer.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "USE_REAL_IP": { - "context": "multisite", - "default": "no", - "help": "Retrieve the real IP of client.", - "id": "use-real-ip", - "label": "Use real ip", - "regex": "^(yes|no)$", - "type": "check", - }, - "USE_PROXY_PROTOCOL": { - "context": "multisite", - "default": "no", - "help": "Enable PROXY protocol communication.", - "id": "use-proxy-protocol", - "label": "Use PROXY protocol", - "regex": "^(yes|no)$", - "type": "check", - }, - "REAL_IP_FROM": { - "context": "multisite", - "default": "192.168.0.0/16 172.16.0.0/12 10.0.0.0/8", - "help": "List of trusted IPs / networks, separated with spaces, where proxied requests come from.", - "id": "real-ip-from", - "label": "Real IP from", - "regex": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "type": "text", - }, - "REAL_IP_HEADER": { - "context": "multisite", - "default": "X-Forwarded-For", - "help": "HTTP header containing the real IP or special value proxy_protocol for PROXY protocol.", - "id": "real-ip-header", - "label": "Real IP header", - "regex": "^(?! )(( ?(?!proxy_protocol)[\\w\\-]+)*|proxy_protocol)$", - "type": "text", - }, - "REAL_IP_RECURSIVE": { - "context": "multisite", - "default": "yes", - "help": "Perform a recursive search in the header container IP address.", - "id": "real-ip-recursive", - "label": "Real IP recursive", - "regex": "^(yes|no)$", - "type": "check", - }, - "REAL_IP_FROM_URLS": { - "context": "global", - "default": "", - "help": "List of URLs containing trusted IPs / networks, separated with spaces, where proxied requests come from.", - "id": "real-ip-from-urls", - "label": "Real IP from URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "redirect", - "stream": "no", - "name": "Redirect", - "description": "Manage HTTP redirects.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "REDIRECT_TO": { - "context": "multisite", - "default": "", - "help": "Redirect a whole site to another one.", - "id": "redirect-to", - "label": "Redirect to", - "regex": "^(https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)?$", - "type": "text", - }, - "REDIRECT_TO_REQUEST_URI": { - "context": "multisite", - "default": "no", - "help": "Append the requested URI to the redirect address.", - "id": "redirect-to-request-uri", - "label": "Append request URI", - "regex": "^(yes|no)$", - "type": "check", - }, - "REDIRECT_TO_STATUS_CODE": { - "context": "multisite", - "default": "301", - "help": "Status code to send to client when redirecting.", - "id": "redirect-to-status-code", - "label": "Append request URI", - "regex": "^(301|302)$", - "type": "select", - "select": ["301", "302"], - }, - }, - "checksum": None, - }, - { - "id": "redis", - "stream": "yes", - "name": "Redis", - "description": "Redis server configuration when using BunkerWeb in cluster mode.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": True, - "settings": { - "USE_REDIS": { - "context": "global", - "default": "no", - "help": "Activate Redis.", - "id": "use-redis", - "label": "Activate Redis", - "regex": "^(yes|no)$", - "type": "check", - }, - "REDIS_HOST": { - "context": "global", - "default": "", - "help": "Redis server IP or hostname.", - "id": "redis-host", - "label": "Redis server", - "regex": "^((?!-)[a-zA-Z0-9\\-]{1,63}(.[a-zA-Z]{2,})+|(\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3}|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)))?$", - "type": "text", - }, - "REDIS_PORT": { - "context": "global", - "default": "6379", - "help": "Redis server port.", - "id": "redis-port", - "label": "Redis port", - "regex": "^[0-9]+$", - "type": "text", - }, - "REDIS_DATABASE": { - "context": "global", - "default": "0", - "help": "Redis database number.", - "id": "redis-database", - "label": "Redis database", - "regex": "^[0-9]+$", - "type": "text", - }, - "REDIS_SSL": { - "context": "global", - "default": "no", - "help": "Use SSL/TLS connection with Redis server.", - "id": "redis-ssl", - "label": "Redis SSL/TLS", - "regex": "^(yes|no)$", - "type": "check", - }, - "REDIS_SSL_VERIFY": { - "context": "global", - "default": "no", - "help": "Verify the certificate of Redis server.", - "id": "redis-ssl-verify", - "label": "Redis SSL/TLS verify", - "regex": "^(yes|no)$", - "type": "check", - }, - "REDIS_TIMEOUT": { - "context": "global", - "default": "1000", - "help": "Redis server timeout (in ms) for connect, read and write.", - "id": "redis-timeout", - "label": "Redis timeout (ms)", - "regex": "^[0-9]+$", - "type": "text", - }, - "REDIS_USERNAME": { - "context": "global", - "default": "", - "help": "Redis username used in AUTH command.", - "id": "redis-username", - "label": "Redis username", - "regex": "^.*$", - "type": "text", - }, - "REDIS_PASSWORD": { - "context": "global", - "default": "", - "help": "Redis password used in AUTH command.", - "id": "redis-password", - "label": "Redis password", - "regex": "^.*$", - "type": "password", - }, - "REDIS_SENTINEL_HOSTS": { - "context": "global", - "default": "", - "help": "Redis sentinel hosts with format host:[port] separated with spaces.", - "id": "redis-sentinel-hosts", - "label": "Redis sentinel hosts", - "regex": "^.*$", - "type": "text", - }, - "REDIS_SENTINEL_USERNAME": { - "context": "global", - "default": "", - "help": "Redis sentinel username.", - "id": "redis-sentinel-username", - "label": "Redis sentinel username", - "regex": "^.*$", - "type": "text", - }, - "REDIS_SENTINEL_PASSWORD": { - "context": "global", - "default": "", - "help": "Redis sentinel password.", - "id": "redis-sentinel-password", - "label": "Redis sentinel password", - "regex": "^.*$", - "type": "password", - }, - "REDIS_SENTINEL_MASTER": { - "context": "global", - "default": "", - "help": "Redis sentinel master name.", - "id": "redis-sentinel-master", - "label": "Redis sentinel master", - "regex": "^.*$", - "type": "text", - }, - "REDIS_KEEPALIVE_IDLE": { - "context": "global", - "default": "30000", - "help": "Max idle time (in ms) before closing redis connection in the pool.", - "id": "redis-keepalive-idle", - "label": "Redis keepalive idle (ms)", - "regex": "^[0-9]+$", - "type": "text", - }, - "REDIS_KEEPALIVE_POOL": { - "context": "global", - "default": "10", - "help": "Max number of redis connection(s) kept in the pool.", - "id": "redis-keepalive-pool", - "label": "Redis keepalive pool", - "regex": "^[0-9]+$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "reverseproxy", - "stream": "partial", - "name": "Reverse proxy", - "description": "Manage reverse proxy configurations.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "USE_REVERSE_PROXY": { - "context": "multisite", - "default": "no", - "help": "Activate reverse proxy mode.", - "id": "use-reverse-proxy", - "label": "Use reverse proxy", - "regex": "^(yes|no)$", - "type": "check", - }, - "REVERSE_PROXY_INTERCEPT_ERRORS": { - "context": "multisite", - "default": "yes", - "help": "Intercept and rewrite errors.", - "id": "reverse-proxy-intercept-errors", - "label": "Intercept errors", - "regex": "^(yes|no)$", - "type": "check", - }, - "REVERSE_PROXY_CUSTOM_HOST": { - "context": "multisite", - "default": "", - "help": "Override Host header sent to upstream server.", - "id": "reverse-proxy-custom-host", - "label": "Reverse proxy custom host", - "regex": "^.*$", - "type": "text", - }, - "REVERSE_PROXY_HOST": { - "context": "multisite", - "default": "", - "help": "Full URL of the proxied resource (proxy_pass).", - "id": "reverse-proxy-host", - "label": "Reverse proxy host", - "regex": "^.*$", - "type": "text", - "multiple": "reverse-proxy", - }, - "REVERSE_PROXY_URL": { - "context": "multisite", - "default": "/", - "help": "Location URL that will be proxied.", - "id": "reverse-proxy-url", - "label": "Reverse proxy url", - "regex": "^.*$", - "type": "text", - "multiple": "reverse-proxy", - }, - "REVERSE_PROXY_WS": { - "context": "multisite", - "default": "no", - "help": "Enable websocket on the proxied resource.", - "id": "reverse-proxy-ws", - "label": "Reverse proxy WS", - "regex": "^(yes|no)$", - "type": "check", - "multiple": "reverse-proxy", - }, - "REVERSE_PROXY_HEADERS": { - "context": "multisite", - "default": "", - "help": "List of HTTP headers to send to proxied resource separated with semicolons (values for proxy_set_header directive).", - "id": "reverse-proxy-headers", - "label": "Reverse proxy headers", - "regex": "^(?![; ])(;? ?([\\w\\-]+)(?!.*\\2 ) [^;]+)*$", - "type": "text", - "multiple": "reverse-proxy", - }, - "REVERSE_PROXY_HEADERS_CLIENT": { - "context": "multisite", - "default": "", - "help": "List of HTTP headers to send to client separated with semicolons (values for add_header directive).", - "id": "reverse-proxy-headers-client", - "label": "Reverse proxy headers-client", - "regex": "^(?![; ])(;? ?([\\w\\-]+)(?!.*\\2 ) [^;]+)*$", - "type": "text", - "multiple": "reverse-proxy", - }, - "REVERSE_PROXY_BUFFERING": { - "context": "multisite", - "default": "yes", - "help": "Enable or disable buffering of responses from proxied resource.", - "id": "reverse-proxy-buffering", - "label": "Reverse proxy buffering", - "regex": "^(yes|no)$", - "type": "check", - "multiple": "reverse-proxy", - }, - "REVERSE_PROXY_KEEPALIVE": { - "context": "multisite", - "default": "no", - "help": "Enable or disable keepalive connections with the proxied resource.", - "id": "reverse-proxy-keepalive", - "label": "Reverse proxy keepalive", - "regex": "^(yes|no)$", - "type": "check", - "multiple": "reverse-proxy", - }, - "REVERSE_PROXY_AUTH_REQUEST": { - "context": "multisite", - "default": "", - "help": "Enable authentication using an external provider (value of auth_request directive).", - "id": "reverse-proxy-auth-request", - "label": "Reverse proxy auth request", - "regex": "^(\\/[\\w\\].~:\\/?#\\[@!$\\&'\\(\\)*+,;=\\-]*|off)?$", - "type": "text", - "multiple": "reverse-proxy", - }, - "REVERSE_PROXY_AUTH_REQUEST_SIGNIN_URL": { - "context": "multisite", - "default": "", - "help": "Redirect clients to sign-in URL when using REVERSE_PROXY_AUTH_REQUEST (used when auth_request call returned 401).", - "id": "reverse-proxy-auth-request-signin-url", - "label": "Auth request signin URL", - "regex": "^(https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)?$", - "type": "text", - "multiple": "reverse-proxy", - }, - "REVERSE_PROXY_AUTH_REQUEST_SET": { - "context": "multisite", - "default": "", - "help": "List of variables to set from the authentication provider, separated with semicolons (values of auth_request_set directives).", - "id": "reverse-proxy-auth-request-set", - "label": "Reverse proxy auth request set", - "regex": "^(?! ;)(;? ?(\\$[a-z_\\-]+)(?!.*\\2 ) [^;]+)*$", - "type": "text", - "multiple": "reverse-proxy", - }, - "REVERSE_PROXY_CONNECT_TIMEOUT": { - "context": "multisite", - "default": "60s", - "help": "Timeout when connecting to the proxied resource.", - "id": "reverse-proxy-connect-timeout", - "label": "Reverse proxy connect timeout", - "regex": "^\\d+(ms?|[shdwMy])$", - "type": "text", - "multiple": "reverse-proxy", - }, - "REVERSE_PROXY_READ_TIMEOUT": { - "context": "multisite", - "default": "60s", - "help": "Timeout when reading from the proxied resource.", - "id": "reverse-proxy-read-timeout", - "label": "Reverse proxy read timeout", - "regex": "^\\d+(ms?|[shdwMy])$", - "type": "text", - "multiple": "reverse-proxy", - }, - "REVERSE_PROXY_SEND_TIMEOUT": { - "context": "multisite", - "default": "60s", - "help": "Timeout when sending to the proxied resource.", - "id": "reverse-proxy-send-timeout", - "label": "Reverse proxy send timeout", - "regex": "^\\d+(ms?|[shdwMy])$", - "type": "text", - "multiple": "reverse-proxy", - }, - "REVERSE_PROXY_INCLUDES": { - "context": "multisite", - "default": "", - "help": "Additional configuration to include in the location block, separated with spaces.", - "id": "reverse-proxy-includes", - "label": "Reverse proxy includes", - "regex": "^(?! )( ?(\\w+)(?!.*\\b\\2\\b))*$", - "type": "text", - "multiple": "reverse-proxy", - }, - "USE_PROXY_CACHE": { - "context": "multisite", - "default": "no", - "help": "Enable or disable caching of the proxied resources.", - "id": "use-proxy-cache", - "label": "Reverse proxy cache", - "regex": "^(yes|no)$", - "type": "check", - }, - "PROXY_CACHE_PATH_LEVELS": { - "context": "global", - "default": "1:2", - "help": "Hierarchy levels of the cache.", - "id": "proxy-cache-path-levels", - "label": "Hierarchy levels", - "regex": "^(:?[12]){1,3}$", - "type": "text", - }, - "PROXY_CACHE_PATH_ZONE_SIZE": { - "context": "global", - "default": "10m", - "help": "Maximum size of cached metadata when caching proxied resources.", - "id": "proxy-cache-path-zone-size", - "label": "Reverse proxy cache zone size", - "regex": "^\\d+[kKmMgG]?$", - "type": "text", - }, - "PROXY_CACHE_PATH_PARAMS": { - "context": "global", - "default": "max_size=100m", - "help": "Additional parameters to add to the proxy_cache directive.", - "id": "proxy-cache-path-params", - "label": "Reverse proxy cache params", - "regex": "^.*$", - "type": "text", - }, - "PROXY_CACHE_METHODS": { - "context": "multisite", - "default": "GET HEAD", - "help": "HTTP methods that should trigger a cache operation.", - "id": "proxy-cache-methods", - "label": "Reverse proxy cache methods", - "regex": "^(?! )( ?(GET|HEAD|POST|PUT|DELETE|CONNECT|OPTIONS|TRACE|PATCH)(?!.*\\2))+$", - "type": "text", - }, - "PROXY_CACHE_MIN_USES": { - "context": "multisite", - "default": "2", - "help": "The minimum number of requests before a response is cached.", - "id": "proxy-cache-min-uses", - "label": "Reverse proxy cache minimum uses", - "regex": "^[1-9]\\d*$", - "type": "text", - }, - "PROXY_CACHE_KEY": { - "context": "multisite", - "default": "$scheme$host$request_uri", - "help": "The key used to uniquely identify a cached response.", - "id": "proxy-cache-key", - "label": "Reverse proxy cache key", - "regex": "^(?! )( ?(\\$[a-z_]+)(?!.*\\2))+$", - "type": "text", - }, - "PROXY_CACHE_VALID": { - "context": "multisite", - "default": "200=24h 301=1h 302=24h", - "help": "Define the caching time depending on the HTTP status code (list of status=time), separated with spaces.", - "id": "proxy-cache-valid", - "label": "Reverse proxy cache valid", - "regex": "^(?! )( ?([1-5]\\d{2})(?!.*\\2=)=\\d+(ms?|[shdwMy]))*$", - "type": "text", - }, - "PROXY_NO_CACHE": { - "context": "multisite", - "default": "$http_pragma $http_authorization", - "help": "Conditions to disable caching of responses.", - "id": "proxy-no-cache", - "label": "Reverse proxy no cache", - "regex": "^.*$", - "type": "text", - }, - "PROXY_CACHE_BYPASS": { - "context": "multisite", - "default": "0", - "help": "Conditions to bypass caching of responses.", - "id": "proxy-cache-bypass", - "label": "Reverse proxy bypass", - "regex": "^.*$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "reversescan", - "stream": "yes", - "name": "Reverse scan", - "description": "Scan clients ports to detect proxies or servers.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": True, - "settings": { - "USE_REVERSE_SCAN": { - "context": "multisite", - "default": "no", - "help": "Enable scanning of clients ports and deny access if one is opened.", - "id": "use-reverse-scan", - "label": "Reverse scan", - "regex": "^(no|yes)$", - "type": "check", - }, - "REVERSE_SCAN_PORTS": { - "context": "multisite", - "default": "22 80 443 3128 8000 8080", - "help": "List of port to scan when using reverse scan feature.", - "id": "reverse-scan-ports", - "label": "Reverse scan ports", - "regex": "^.*$", - "type": "text", - }, - "REVERSE_SCAN_TIMEOUT": { - "context": "multisite", - "default": "500", - "help": "Specify the maximum timeout (in ms) when scanning a port.", - "id": "reverse-scan-timeout", - "label": "Reverse scan timeout", - "regex": "^.*$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "selfsigned", - "stream": "yes", - "name": "Self-signed certificate", - "description": "Generate self-signed certificate.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "GENERATE_SELF_SIGNED_SSL": { - "context": "multisite", - "default": "no", - "help": "Generate and use self-signed certificate.", - "id": "generate-self-signed-ssl", - "label": "Activate self-signed certificate", - "regex": "^(yes|no)$", - "type": "check", - }, - "SELF_SIGNED_SSL_EXPIRY": { - "context": "multisite", - "default": "365", - "help": "Self-signed certificate expiry in days.", - "id": "self-signed-ssl-expiry", - "label": "Certificate expiry", - "regex": "^\\d+$", - "type": "text", - }, - "SELF_SIGNED_SSL_SUBJ": { - "context": "multisite", - "default": "/CN=www.example.com/", - "help": "Self-signed certificate subject.", - "id": "self-signed-ssl-subj", - "label": "Certificate subject", - "regex": "^/CN=[^,]+$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "sessions", - "stream": "yes", - "name": "Sessions", - "description": "Management of session used by other plugins.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "SESSIONS_SECRET": { - "context": "global", - "default": "random", - "help": "Secret used to encrypt sessions variables for storing data related to challenges.", - "id": "session-secret", - "label": "Sessions secret", - "regex": "^\\w+$", - "type": "password", - }, - "SESSIONS_NAME": { - "context": "global", - "default": "random", - "help": "Name of the cookie given to clients.", - "id": "sessions-name", - "label": "Sessions name", - "regex": "^\\w+$", - "type": "text", - }, - "SESSIONS_IDLING_TIMEOUT": { - "context": "global", - "default": "1800", - "help": "Maximum time (in seconds) of inactivity before the session is invalidated.", - "id": "sessions-idling-timeout", - "label": "Sessions idling timeout", - "regex": "^\\d+$", - "type": "text", - }, - "SESSIONS_ROLLING_TIMEOUT": { - "context": "global", - "default": "3600", - "help": "Maximum time (in seconds) before a session must be renewed.", - "id": "sessions-rolling-timeout", - "label": "Sessions rolling timeout", - "regex": "^\\d+$", - "type": "text", - }, - "SESSIONS_ABSOLUTE_TIMEOUT": { - "context": "global", - "default": "86400", - "help": "Maximum time (in seconds) before a session is destroyed.", - "id": "sessions-absolute-timeout", - "label": "Sessions absolute timeout", - "regex": "^\\d+$", - "type": "text", - }, - "SESSIONS_CHECK_IP": { - "context": "global", - "default": "yes", - "help": "Destroy session if IP address is different than original one.", - "id": "sessions-check-ip", - "label": "Sessions check IP", - "regex": "^(yes|no)$", - "type": "check", - }, - "SESSIONS_CHECK_USER_AGENT": { - "context": "global", - "default": "yes", - "help": "Destroy session if User-Agent is different than original one.", - "id": "sessions-user-agent", - "label": "Sessions check User-Agent", - "regex": "^(yes|no)$", - "type": "check", - }, - }, - "checksum": None, - }, - { - "id": "ui", - "stream": "no", - "name": "UI", - "description": "Integrate easily the BunkerWeb UI.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "USE_UI": { - "context": "multisite", - "default": "no", - "help": "Use UI", - "id": "use-ui", - "label": "Use UI", - "regex": "^(yes|no)$", - "type": "check", - }, - "UI_HOST": { - "context": "global", - "default": "", - "help": "Address of the web UI used for initial setup", - "id": "ui-host", - "label": "UI host", - "regex": "^.*$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "whitelist", - "stream": "partial", - "name": "Whitelist", - "description": "Allow access based on internal and external IP/network/rDNS/ASN whitelists.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": True, - "settings": { - "USE_WHITELIST": { - "context": "multisite", - "default": "yes", - "help": "Activate whitelist feature.", - "id": "use-whitelist", - "label": "Activate whitelisting", - "regex": "^(yes|no)$", - "type": "check", - }, - "WHITELIST_IP": { - "context": "multisite", - "default": "20.191.45.212 40.88.21.235 40.76.173.151 40.76.163.7 20.185.79.47 52.142.26.175 20.185.79.15 52.142.24.149 40.76.162.208 40.76.163.23 40.76.162.191 40.76.162.247", - "help": "List of IP/network, separated with spaces, to put into the whitelist.", - "id": "whitelist-ip", - "label": "Whitelist IP/network", - "regex": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "type": "text", - }, - "WHITELIST_RDNS": { - "context": "multisite", - "default": ".google.com .googlebot.com .yandex.ru .yandex.net .yandex.com .search.msn.com .baidu.com .baidu.jp .crawl.yahoo.net .fwd.linkedin.com .twitter.com .twttr.com .discord.com", - "help": "List of reverse DNS suffixes, separated with spaces, to whitelist.", - "id": "whitelist-rdns", - "label": "Whitelist reverse DNS", - "regex": "^( *(([^ ]+)(?!.*\\3( |$))) *)*$", - "type": "text", - }, - "WHITELIST_RDNS_GLOBAL": { - "context": "multisite", - "default": "yes", - "help": "Only perform RDNS whitelist checks on global IP addresses.", - "id": "whitelist-rdns-global", - "label": "Whitelist reverse DNS global IPs", - "regex": "^(yes|no)$", - "type": "check", - }, - "WHITELIST_ASN": { - "context": "multisite", - "default": "32934", - "help": "List of ASN numbers, separated with spaces, to whitelist.", - "id": "whitelist-asn", - "label": "Whitelist ASN", - "regex": "^^( *((ASN?)?(\\d+)\\b(?!.*[SN ]\\4\\b)) *)*$", - "type": "text", - }, - "WHITELIST_USER_AGENT": { - "context": "multisite", - "default": "", - "help": "List of User-Agent (PCRE regex), separated with spaces, to whitelist.", - "id": "whitelist-user-agent", - "label": "Whitelist User-Agent", - "regex": "^.*$", - "type": "text", - }, - "WHITELIST_URI": { - "context": "multisite", - "default": "", - "help": "List of URI (PCRE regex), separated with spaces, to whitelist.", - "id": "whitelist-uri", - "label": "Whitelist URI", - "regex": "^( *(.*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "WHITELIST_IP_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing good IP/network to whitelist.", - "id": "whitelist-ip-urls", - "label": "Whitelist IP/network URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "WHITELIST_RDNS_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing reverse DNS suffixes to whitelist.", - "id": "whitelist-rdns-urls", - "label": "Whitelist reverse DNS URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "WHITELIST_ASN_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing ASN to whitelist.", - "id": "whitelist-asn-urls", - "label": "Whitelist ASN URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "WHITELIST_USER_AGENT_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing good User-Agent to whitelist.", - "id": "whitelist-user-agent-urls", - "label": "Whitelist User-Agent URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "WHITELIST_URI_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing bad URI to whitelist.", - "id": "whitelist-uri-urls", - "label": "Whitelist URI URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - }, - "checksum": None, - }, -] - -# Global config -# Default global config with methods=True from docker-compose.ui.yml -global_config = { - "ERRORS": {"value": "", "global": True, "method": "default"}, - "USE_UI": {"value": "no", "global": True, "method": "default"}, - "USE_CORS": {"value": "no", "global": True, "method": "default"}, - "USE_GZIP": {"value": "yes", "global": True, "method": "scheduler"}, - "USE_DNSBL": {"value": "yes", "global": True, "method": "default"}, - "USE_REDIS": {"value": "no", "global": True, "method": "default"}, - "IS_LOADING": {"value": "no", "global": True, "method": "default"}, - "REMOTE_PHP": {"value": "", "global": True, "method": "default"}, - "USE_BACKUP": {"value": "yes", "global": True, "method": "default"}, - "USE_BROTLI": {"value": "no", "global": True, "method": "default"}, - "INJECT_BODY": {"value": "", "global": True, "method": "default"}, - "REDIRECT_TO": {"value": "", "global": True, "method": "default"}, - "USE_ANTIBOT": {"value": "no", "global": True, "method": "default"}, - "USE_METRICS": {"value": "yes", "global": True, "method": "default"}, - "USE_REAL_IP": {"value": "no", "global": True, "method": "default"}, - "DATABASE_URI": {"value": "sqlite:////var/lib/bunkerweb/db.sqlite3", "global": True, "method": "default"}, - "USE_GREYLIST": {"value": "no", "global": True, "method": "default"}, - "CUSTOM_HEADER": {"value": "", "global": True, "method": "default"}, - "USE_BLACKLIST": {"value": "no", "global": True, "method": "scheduler"}, - "USE_BUNKERNET": {"value": "no", "global": True, "method": "scheduler"}, - "USE_LIMIT_REQ": {"value": "yes", "global": True, "method": "default"}, - "USE_WHITELIST": {"value": "no", "global": True, "method": "scheduler"}, - "USE_AUTH_BASIC": {"value": "no", "global": True, "method": "default"}, - "USE_CUSTOM_SSL": {"value": "no", "global": True, "method": "default"}, - "PRO_LICENSE_KEY": {"value": "", "global": True, "method": "default"}, - "SESSIONS_SECRET": {"value": "random", "global": True, "method": "default"}, - "USE_MODSECURITY": {"value": "yes", "global": True, "method": "default"}, - "USE_SECURITYTXT": {"value": "no", "global": True, "method": "default"}, - "USE_BAD_BEHAVIOR": {"value": "yes", "global": True, "method": "default"}, - "USE_CLIENT_CACHE": {"value": "yes", "global": True, "method": "scheduler"}, - "USE_REVERSE_SCAN": {"value": "no", "global": True, "method": "default"}, - "AUTO_LETS_ENCRYPT": {"value": "no", "global": True, "method": "default"}, - "BLACKLIST_COUNTRY": {"value": "", "global": True, "method": "default"}, - "USE_REVERSE_PROXY": {"value": "no", "global": True, "method": "default"}, - "DISABLE_DEFAULT_SERVER": {"value": "yes", "global": True, "method": "scheduler"}, - "GENERATE_SELF_SIGNED_SSL": {"value": "no", "global": True, "method": "default"}, - "UI_HOST": {"value": "", "global": True, "method": "default"}, - "DNSBL_LIST": {"value": "bl.blocklist.de problems.dnsbl.sorbs.net sbl.spamhaus.org xbl.spamhaus.org", "global": True, "method": "default"}, - "GZIP_TYPES": { - "value": "application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml", - "global": True, - "method": "default", - }, - "REDIS_HOST": {"value": "", "global": True, "method": "default"}, - "ANTIBOT_URI": {"value": "/challenge", "global": True, "method": "default"}, - "GREYLIST_IP": {"value": "", "global": True, "method": "default"}, - "BLACKLIST_IP": {"value": "", "global": True, "method": "default"}, - "BROTLI_TYPES": { - "value": "application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml", - "global": True, - "method": "default", - }, - "NGINX_PREFIX": {"value": "/etc/nginx/", "global": True, "method": "default"}, - "WHITELIST_IP": { - "value": "20.191.45.212 40.88.21.235 40.76.173.151 40.76.163.7 20.185.79.47 52.142.26.175 20.185.79.15 52.142.24.149 40.76.162.208 40.76.163.23 40.76.162.191 40.76.162.247", - "global": True, - "method": "default", - }, - "LIMIT_REQ_URL": {"value": "/", "global": True, "method": "default"}, - "SESSIONS_NAME": {"value": "random", "global": True, "method": "default"}, - "REMOVE_HEADERS": {"value": "Server Expect-CT X-Powered-By X-AspNet-Version X-AspNetMvc-Version Public-Key-Pins", "global": True, "method": "default"}, - "BACKUP_SCHEDULE": {"value": "daily", "global": True, "method": "default"}, - "CUSTOM_SSL_CERT": {"value": "", "global": True, "method": "default"}, - "REMOTE_PHP_PATH": {"value": "", "global": True, "method": "default"}, - "SECURITYTXT_URI": {"value": "/.well-known/security.txt", "global": True, "method": "default"}, - "BUNKERNET_SERVER": {"value": "https://api.bunkerweb.io", "global": True, "method": "default"}, - "CORS_ALLOW_ORIGIN": {"value": "self", "global": True, "method": "default"}, - "WHITELIST_COUNTRY": {"value": "", "global": True, "method": "default"}, - "EMAIL_LETS_ENCRYPT": {"value": "", "global": True, "method": "default"}, - "REVERSE_SCAN_PORTS": {"value": "22 80 443 3128 8000 8080", "global": True, "method": "default"}, - "USE_PROXY_PROTOCOL": {"value": "no", "global": True, "method": "default"}, - "AUTH_BASIC_LOCATION": {"value": "sitewide", "global": True, "method": "default"}, - "METRICS_MEMORY_SIZE": {"value": "16m", "global": True, "method": "default"}, - "USE_MODSECURITY_CRS": {"value": "yes", "global": True, "method": "default"}, - "DATABASE_URI_READONLY": {"value": "", "global": True, "method": "default"}, - "SELF_SIGNED_SSL_EXPIRY": {"value": "365", "global": True, "method": "default"}, - "CLIENT_CACHE_EXTENSIONS": {"value": "jpg|jpeg|png|bmp|ico|svg|tif|css|js|otf|ttf|eot|woff|woff2", "global": True, "method": "default"}, - "INTERCEPTED_ERROR_CODES": {"value": "400 401 403 404 405 413 429 500 501 502 503 504", "global": True, "method": "default"}, - "REDIRECT_TO_REQUEST_URI": {"value": "no", "global": True, "method": "default"}, - "BAD_BEHAVIOR_STATUS_CODES": {"value": "400 401 403 404 405 429 444", "global": True, "method": "default"}, - "REVERSE_PROXY_INTERCEPT_ERRORS": {"value": "yes", "global": True, "method": "default"}, - "DISABLE_DEFAULT_SERVER_STRICT_SNI": {"value": "no", "global": True, "method": "default"}, - "HTTP_PORT": {"value": "8080", "global": True, "method": "default"}, - "LOCAL_PHP": {"value": "", "global": True, "method": "default"}, - "REDIS_PORT": {"value": "6379", "global": True, "method": "default"}, - "REAL_IP_FROM": {"value": "192.168.0.0/16 172.16.0.0/12 10.0.0.0/8", "global": True, "method": "default"}, - "GREYLIST_RDNS": {"value": "", "global": True, "method": "default"}, - "BLACKLIST_RDNS": {"value": ".shodan.io .censys.io", "global": True, "method": "default"}, - "CUSTOM_SSL_KEY": {"value": "", "global": True, "method": "default"}, - "LIMIT_REQ_RATE": {"value": "2r/s", "global": True, "method": "default"}, - "WHITELIST_RDNS": { - "value": ".google.com .googlebot.com .yandex.ru .yandex.net .yandex.com .search.msn.com .baidu.com .baidu.jp .crawl.yahoo.net .fwd.linkedin.com .twitter.com .twttr.com .discord.com", - "global": True, - "method": "default", - }, - "AUTH_BASIC_USER": {"value": "changeme", "global": True, "method": "default"}, - "BACKUP_ROTATION": {"value": "7", "global": True, "method": "default"}, - "GZIP_MIN_LENGTH": {"value": "1000", "global": True, "method": "default"}, - "BROTLI_MIN_LENGTH": {"value": "1000", "global": True, "method": "default"}, - "CLIENT_CACHE_ETAG": {"value": "yes", "global": True, "method": "default"}, - "CORS_ALLOW_METHODS": {"value": "GET, POST, OPTIONS", "global": True, "method": "default"}, - "DATABASE_LOG_LEVEL": {"value": "warning", "global": True, "method": "default"}, - "SECURITYTXT_CONTACT": {"value": "", "global": True, "method": "default"}, - "ANTIBOT_TIME_RESOLVE": {"value": "60", "global": True, "method": "default"}, - "REVERSE_SCAN_TIMEOUT": {"value": "500", "global": True, "method": "default"}, - "SELF_SIGNED_SSL_SUBJ": {"value": "/CN=www.example.com/", "global": True, "method": "default"}, - "KEEP_UPSTREAM_HEADERS": {"value": "Content-Security-Policy Permissions-Policy X-Frame-Options", "global": True, "method": "default"}, - "BAD_BEHAVIOR_THRESHOLD": {"value": "10", "global": True, "method": "default"}, - "REDIRECT_HTTP_TO_HTTPS": {"value": "no", "global": True, "method": "default"}, - "REDIRECT_TO_STATUS_CODE": {"value": "301", "global": True, "method": "default"}, - "SESSIONS_IDLING_TIMEOUT": {"value": "1800", "global": True, "method": "default"}, - "USE_LETS_ENCRYPT_STAGING": {"value": "no", "global": True, "method": "default"}, - "REVERSE_PROXY_CUSTOM_HOST": {"value": "", "global": True, "method": "default"}, - "USE_MODSECURITY_CRS_PLUGINS": {"value": "yes", "global": True, "method": "default"}, - "METRICS_MAX_BLOCKED_REQUESTS": {"value": "100", "global": True, "method": "default"}, - "HTTPS_PORT": {"value": "8443", "global": True, "method": "default"}, - "LOCAL_PHP_PATH": {"value": "", "global": True, "method": "default"}, - "REAL_IP_HEADER": {"value": "X-Forwarded-For", "global": True, "method": "default"}, - "REDIS_DATABASE": {"value": "0", "global": True, "method": "default"}, - "USE_LIMIT_CONN": {"value": "yes", "global": True, "method": "default"}, - "GZIP_COMP_LEVEL": {"value": "5", "global": True, "method": "default"}, - "BACKUP_DIRECTORY": {"value": "/var/lib/bunkerweb/backups", "global": True, "method": "default"}, - "BROTLI_COMP_LEVEL": {"value": "6", "global": True, "method": "default"}, - "ANTIBOT_TIME_VALID": {"value": "86400", "global": True, "method": "default"}, - "CORS_ALLOW_HEADERS": {"value": "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range", "global": True, "method": "default"}, - "AUTH_BASIC_PASSWORD": {"value": "changeme", "global": True, "method": "default"}, - "SECURITYTXT_EXPIRES": {"value": "", "global": True, "method": "default"}, - "CLIENT_CACHE_CONTROL": {"value": "public, max-age=15552000", "global": True, "method": "default"}, - "CUSTOM_SSL_CERT_DATA": {"value": "", "global": True, "method": "default"}, - "GREYLIST_RDNS_GLOBAL": {"value": "yes", "global": True, "method": "default"}, - "BLACKLIST_RDNS_GLOBAL": {"value": "yes", "global": True, "method": "default"}, - "REVERSE_PROXY_SSL_SNI": {"value": "no", "global": True, "method": "default"}, - "WHITELIST_RDNS_GLOBAL": {"value": "yes", "global": True, "method": "default"}, - "BAD_BEHAVIOR_COUNT_TIME": {"value": "60", "global": True, "method": "default"}, - "MODSECURITY_CRS_VERSION": {"value": "4", "global": True, "method": "default"}, - "SESSIONS_ROLLING_TIMEOUT": {"value": "3600", "global": True, "method": "default"}, - "STRICT_TRANSPORT_SECURITY": {"value": "max-age=31536000; includeSubDomains; preload", "global": True, "method": "default"}, - "AUTO_REDIRECT_HTTP_TO_HTTPS": {"value": "yes", "global": True, "method": "default"}, - "LETS_ENCRYPT_CLEAR_OLD_CERTS": {"value": "no", "global": True, "method": "default"}, - "MULTISITE": {"value": "yes", "global": True, "method": "scheduler"}, - "REDIS_SSL": {"value": "no", "global": True, "method": "default"}, - "COOKIE_FLAGS": {"value": "* HttpOnly SameSite=Lax", "global": True, "method": "default"}, - "GREYLIST_ASN": {"value": "", "global": True, "method": "default"}, - "GZIP_PROXIED": {"value": "no-cache no-store private expired auth", "global": True, "method": "default"}, - "BLACKLIST_ASN": {"value": "", "global": True, "method": "default"}, - "WHITELIST_ASN": {"value": "32934", "global": True, "method": "default"}, - "ALLOWED_METHODS": {"value": "GET|POST|HEAD", "global": True, "method": "default"}, - "AUTH_BASIC_TEXT": {"value": "Restricted area", "global": True, "method": "default"}, - "REAL_IP_RECURSIVE": {"value": "yes", "global": True, "method": "default"}, - "CUSTOM_SSL_KEY_DATA": {"value": "", "global": True, "method": "default"}, - "LIMIT_CONN_MAX_HTTP1": {"value": "10", "global": True, "method": "default"}, - "BAD_BEHAVIOR_BAN_TIME": {"value": "86400", "global": True, "method": "default"}, - "CORS_ALLOW_CREDENTIALS": {"value": "no", "global": True, "method": "default"}, - "SECURITYTXT_ENCRYPTION": {"value": "", "global": True, "method": "default"}, - "ANTIBOT_RECAPTCHA_SCORE": {"value": "0.7", "global": True, "method": "default"}, - "SESSIONS_ABSOLUTE_TIMEOUT": {"value": "86400", "global": True, "method": "default"}, - "REVERSE_PROXY_SSL_SNI_NAME": {"value": "", "global": True, "method": "default"}, - "MODSECURITY_CRS_PLUGIN_URLS": {"value": "", "global": True, "method": "default"}, - "SERVER_NAME": {"value": "app1.example.com www.example.com", "global": True, "method": "default"}, - "MAX_CLIENT_SIZE": {"value": "10m", "global": True, "method": "default"}, - "REDIS_SSL_VERIFY": {"value": "no", "global": True, "method": "default"}, - "REAL_IP_FROM_URLS": {"value": "", "global": True, "method": "default"}, - "SESSIONS_CHECK_IP": {"value": "yes", "global": True, "method": "default"}, - "REVERSE_PROXY_HOST": {"value": "dzq", "global": True, "method": "ui"}, - "CORS_EXPOSE_HEADERS": {"value": "Content-Length,Content-Range", "global": True, "method": "default"}, - "GREYLIST_USER_AGENT": {"value": "", "global": True, "method": "default"}, - "BLACKLIST_USER_AGENT": {"value": "", "global": True, "method": "default"}, - "LIMIT_CONN_MAX_HTTP2": {"value": "100", "global": True, "method": "default"}, - "WHITELIST_USER_AGENT": {"value": "", "global": True, "method": "default"}, - "COOKIE_AUTO_SECURE_FLAG": {"value": "yes", "global": True, "method": "default"}, - "ANTIBOT_RECAPTCHA_SITEKEY": {"value": "", "global": True, "method": "default"}, - "MODSECURITY_SEC_AUDIT_ENGINE": {"value": "RelevantOnly", "global": True, "method": "default"}, - "SECURITYTXT_ACKNOWLEDGEMENTS": {"value": "", "global": True, "method": "default"}, - "SERVE_FILES": {"value": "no", "global": True, "method": "scheduler"}, - "GREYLIST_URI": {"value": "", "global": True, "method": "default"}, - "BLACKLIST_URI": {"value": "", "global": True, "method": "default"}, - "REDIS_TIMEOUT": {"value": "1000", "global": True, "method": "default"}, - "WHITELIST_URI": {"value": "", "global": True, "method": "default"}, - "WORKER_PROCESSES": {"value": "auto", "global": True, "method": "default"}, - "REVERSE_PROXY_URL": {"value": "/", "global": True, "method": "default"}, - "LIMIT_CONN_MAX_STREAM": {"value": "10", "global": True, "method": "default"}, - "CONTENT_SECURITY_POLICY": {"value": "object-src 'none'; form-action 'self'; frame-ancestors 'self';", "global": True, "method": "default"}, - "ANTIBOT_RECAPTCHA_SECRET": {"value": "", "global": True, "method": "default"}, - "SESSIONS_CHECK_USER_AGENT": {"value": "yes", "global": True, "method": "default"}, - "CROSS_ORIGIN_OPENER_POLICY": {"value": "same-origin", "global": True, "method": "default"}, - "SECURITYTXT_PREFERRED_LANG": {"value": "en", "global": True, "method": "default"}, - "MODSECURITY_SEC_RULE_ENGINE": {"value": "On", "global": True, "method": "default"}, - "ROOT_FOLDER": {"value": "", "global": True, "method": "default"}, - "REDIS_USERNAME": {"value": "", "global": True, "method": "default"}, - "GREYLIST_IP_URLS": {"value": "", "global": True, "method": "default"}, - "REVERSE_PROXY_WS": {"value": "no", "global": True, "method": "default"}, - "WHITELIST_IP_URLS": {"value": "", "global": True, "method": "default"}, - "BLACKLIST_IGNORE_IP": {"value": "", "global": True, "method": "default"}, - "WORKER_RLIMIT_NOFILE": {"value": "2048", "global": True, "method": "default"}, - "SECURITYTXT_CANONICAL": {"value": "", "global": True, "method": "default"}, - "ANTIBOT_HCAPTCHA_SITEKEY": {"value": "", "global": True, "method": "default"}, - "CROSS_ORIGIN_EMBEDDER_POLICY": {"value": "require-corp", "global": True, "method": "default"}, - "MODSECURITY_SEC_AUDIT_LOG_PARTS": {"value": "ABCFHZ", "global": True, "method": "default"}, - "CONTENT_SECURITY_POLICY_REPORT_ONLY": {"value": "no", "global": True, "method": "default"}, - "SSL_PROTOCOLS": {"value": "TLSv1.2 TLSv1.3", "global": True, "method": "default"}, - "REDIS_PASSWORD": {"value": "", "global": True, "method": "default"}, - "REFERRER_POLICY": {"value": "strict-origin-when-cross-origin", "global": True, "method": "default"}, - "GREYLIST_RDNS_URLS": {"value": "", "global": True, "method": "default"}, - "SECURITYTXT_POLICY": {"value": "", "global": True, "method": "default"}, - "WORKER_CONNECTIONS": {"value": "1024", "global": True, "method": "default"}, - "WHITELIST_2024-07-27T15:51:01.203516525Z RDNS_URLS": {"value": "", "global": True, "method": "default"}, - "BLACKLIST_IGNORE_RDNS": {"value": "", "global": True, "method": "default"}, - "REVERSE_PROXY_HEADERS": {"value": "", "global": True, "method": "default"}, - "ANTIBOT_HCAPTCHA_SECRET": {"value": "", "global": True, "method": "default"}, - "CROSS_ORIGIN_RESOURCE_POLICY": {"value": "same-site", "global": True, "method": "default"}, - "HTTP2": {"value": "yes", "global": True, "method": "default"}, - "LOG_FORMAT": { - "value": '$host $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"', - "global": True, - "method": "default", - }, - "CORS_MAX_AGE": {"value": "86400", "global": True, "method": "default"}, - "GREYLIST_ASN_URLS": {"value": "", "global": True, "method": "default"}, - "PERMISSIONS_POLICY": { - "value": "accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), battery=(), bluetooth=(), browsing-topics=(), camera=(), compute-pressure=(), display-capture=(), document-domain=(), encrypted-media=(), execution-while-not-rendered=(), execution-while-out-of-viewport=(), fullscreen=(), gamepad=(), geolocation=(), gyroscope=(), hid=(), identity-credentials-get=(), idle-detection=(), local-fonts=(), magnetometer=(), microphone=(), midi=(), otp-credentials=(), payment=(), picture-in-picture=(), publickey-credentials-create=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), speaker-selection=(), storage-access=(), usb=(), web-share=(), window-management=(), xr-spatial-tracking=()", - "global": True, - "method": "default", - }, - "SECURITYTXT_HIRING": {"value": "", "global": True, "method": "default"}, - "WHITELIST_ASN_URLS": {"value": "", "global": True, "method": "default"}, - "BLACKLIST_IGNORE_ASN": {"value": "", "global": True, "method": "default"}, - "REDIS_SENTINEL_HOSTS": {"value": "", "global": True, "method": "default"}, - "ANTIBOT_TURNSTILE_SITEKEY": {"value": "", "global": True, "method": "default"}, - "REVERSE_PROXY_HEADERS_CLIENT": {"value": "", "global": True, "method": "default"}, - "HTTP3": {"value": "no", "global": True, "method": "default"}, - "LOG_LEVEL": {"value": "info", "global": True, "method": "scheduler"}, - "DISABLE_FLOC": {"value": "yes", "global": True, "method": "default"}, - "SECURITYTXT_CSAF": {"value": "", "global": True, "method": "default"}, - "CORS_DENY_REQUEST": {"value": "yes", "global": True, "method": "default"}, - "REDIS_SENTINEL_USERNAME": {"value": "", "global": True, "method": "default"}, - "REVERSE_PROXY_BUFFERING": {"value": "yes", "global": True, "method": "default"}, - "ANTIBOT_TURNSTILE_SECRET": {"value": "", "global": True, "method": "default"}, - "GREYLIST_USER_AGENT_URLS": {"value": "", "global": True, "method": "default"}, - "WHITELIST_USER_AGENT_URLS": {"value": "", "global": True, "method": "default"}, - "BLACKLIST_IGNORE_USER_AGENT": {"value": "", "global": True, "method": "default"}, - "DNS_RESOLVERS": {"value": "127.0.0.11", "global": True, "method": "default"}, - "X_FRAME_OPTIONS": {"value": "SAMEORIGIN", "global": True, "method": "default"}, - "GREYLIST_URI_URLS": {"value": "", "global": True, "method": "default"}, - "HTTP3_ALT_SVC_PORT": {"value": "443", "global": True, "method": "default"}, - "WHITELIST_URI_URLS": {"value": "", "global": True, "method": "default"}, - "BLACKLIST_IGNORE_URI": {"value": "", "global": True, "method": "default"}, - "REDIS_SENTINEL_PASSWORD": {"value": "", "global": True, "method": "default"}, - "REVERSE_PROXY_KEEPALIVE": {"value": "no", "global": True, "method": "default"}, - "LISTEN_HTTP": {"value": "yes", "global": True, "method": "default"}, - "BLACKLIST_IP_URLS": {"value": "https://www.dan.me.uk/torlist/?exit", "global": True, "method": "default"}, - "DATASTORE_MEMORY_SIZE": {"value": "64m", "global": True, "method": "default"}, - "REDIS_SENTINEL_MASTER": {"value": "", "global": True, "method": "default"}, - "X_CONTENT_TYPE_OPTIONS": {"value": "nosniff", "global": True, "method": "default"}, - "REVERSE_PROXY_AUTH_REQUEST": {"value": "", "global": True, "method": "default"}, - "X_XSS_PROTECTION": {"value": "1; mode=block", "global": True, "method": "default"}, - "BLACKLIST_RDNS_URLS": {"value": "", "global": True, "method": "default"}, - "USE_OPEN_FILE_CACHE": {"value": "no", "global": True, "method": "default"}, - "REDIS_KEEPALIVE_IDLE": {"value": "30000", "global": True, "method": "default"}, - "CACHESTORE_MEMORY_SIZE": {"value": "64m", "global": True, "method": "default"}, - "REVERSE_PROXY_AUTH_REQUEST_SIGNIN_URL": {"value": "", "global": True, "method": "default"}, - "OPEN_FILE_CACHE": {"value": "max=1000 inactive=20s", "global": True, "method": "default"}, - "BLACKLIST_ASN_URLS": {"value": "", "global": True, "method": "default"}, - "REDIS_KEEPALIVE_POOL": {"value": "10", "global": True, "method": "default"}, - "X_DNS_PREFETCH_CONTROL": {"value": "off", "global": True, "method": "default"}, - "CACHESTORE_IPC_MEMORY_SIZE": {"value": "16m", "global": True, "method": "default"}, - "REVERSE_PROXY_AUTH_REQUEST_SET": {"value": "", "global": True, "method": "default"}, - "OPEN_FILE_CACHE_ERRORS": {"value": "yes", "global": True, "method": "default"}, - "BLACKLIST_USER_AGENT_URLS": { - "value": "https://raw.githubusercontent.com/mitchellkrogza/nginx-ultimate-bad-bot-blocker/master/_generator_lists/bad-user-agents.list", - "global": True, - "method": "default", - }, - "CACHESTORE_MISS_MEMORY_SIZE": {"value": "16m", "global": True, "method": "default"}, - "REVERSE_PROXY_CONNECT_TIMEOUT": {"value": "60s", "global": True, "method": "default"}, - "BLACKLIST_URI_URLS": {"value": "", "global": True, "method": "default"}, - "OPEN_FILE_CACHE_MIN_USES": {"value": "2", "global": True, "method": "default"}, - "REVERSE_PROXY_READ_TIMEOUT": {"value": "60s", "global": True, "method": "default"}, - "CACHESTORE_LOCKS_MEMORY_SIZE": {"value": "16m", "global": True, "method": "default"}, - "USE_API": {"value": "yes", "global": True, "method": "default"}, - "OPEN_FILE_CACHE_VALID": {"value": "30s", "global": True, "method": "default"}, - "BLACKLIST_IGNORE_IP_URLS": {"value": "", "global": True, "method": "default"}, - "REVERSE_PROXY_SEND_TIMEOUT": {"value": "60s", "global": True, "method": "default"}, - "API_HTTP_PORT": {"value": "5000", "global": True, "method": "default"}, - "EXTERNAL_PLUGIN_URLS": {"value": "", "global": True, "method": "default"}, - "REVERSE_PROXY_INCLUDES": {"value": "", "global": True, "method": "default"}, - "BLACKLIST_IGNORE_RDNS_URLS": {"value": "", "global": True, "method": "default"}, - "API_LISTEN_IP": {"value": "0.0.0.0", "global": True, "method": "default"}, - "DENY_HTTP_STATUS": {"value": "403", "global": True, "method": "default"}, - "BLACKLIST_IGNORE_ASN_URLS": {"value": "", "global": True, "method": "default"}, - "REVERSE_PROXY_PASS_REQUEST_BODY": {"value": "yes", "global": True, "method": "default"}, - "API_SERVER_NAME": {"value": "bwapi", "global": True, "method": "default"}, - "USE_PROXY_CACHE": {"value": "no", "global": True, "method": "default"}, - "SEND_ANONYMOUS_REPORT": {"value": "no", "global": True, "method": "scheduler"}, - "BLACKLIST_IGNORE_USER_AGENT_URLS": {"value": "", "global": True, "method": "default"}, - "API_WHITELIST_IP": {"value": "127.0.0.0/24 10.20.30.0/24", "global": True, "method": "scheduler"}, - "PROXY_CACHE_PATH_LEVELS": {"value": "1:2", "global": True, "method": "default"}, - "BLACKLIST_IGNORE_URI_URLS": {"value": "", "global": True, "method": "default"}, - "AUTOCONF_MODE": {"value": "no", "global": True, "method": "default"}, - "PROXY_CACHE_PATH_ZONE_SIZE": {"value": "10m", "global": True, "method": "default"}, - "SWARM_MODE": {"value": "no", "global": True, "method": "default"}, - "PROXY_CACHE_PATH_PARAMS": {"value": "max_size=100m", "global": True, "method": "default"}, - "KUBERNETES_MODE": {"value": "no", "global": True, "method": "default"}, - "PROXY_CACHE_METHODS": {"value": "GET HEAD", "global": True, "method": "default"}, - "SERVER_TYPE": {"value": "http", "global": True, "method": "default"}, - "PROXY_CACHE_MIN_USES": {"value": "2", "global": True, "method": "default"}, - "LISTEN_STREAM": {"value": "yes", "global": True, "method": "default"}, - "PROXY_CACHE_KEY": {"value": "$scheme$host$request_uri", "global": True, "method": "default"}, - "PROXY_CACHE_VALID": {"value": "200=24h 301=1h 302=24h", "global": True, "method": "default"}, - "LISTEN_STREAM_PORT": {"value": "1337", "global": True, "method": "default"}, - "PROXY_NO_CACHE": {"value": "$http_pragma $http_authorization", "global": True, "method": "default"}, - "LISTEN_STREAM_PORT_SSL": {"value": "4242", "global": True, "method": "default"}, - "USE_UDP": {"value": "no", "global": True, "method": "default"}, - "PROXY_CACHE_BYPASS": {"value": "0", "global": True, "method": "default"}, - "USE_IPV6": {"value": "no", "global": True, "method": "default"}, - "IS_DRAFT": {"value": "no", "global": True, "method": "default"}, - "TIMERS_LOG_LEVEL": {"value": "debug", "global": True, "method": "default"}, - "BUNKERWEB_INSTANCES": {"value": "bunkerweb", "global": True, "method": "scheduler"}, -} - -# Service name we want the configuration for -service_name = "app1.example.com" -# Mix of global and service settings -total_config = { - "ERRORS": {"value": "", "global": True, "method": "default", "template": None}, - "USE_UI": {"value": "no", "global": True, "method": "default", "template": None}, - "USE_CORS": {"value": "no", "global": True, "method": "default", "template": None}, - "USE_GZIP": {"value": "yes", "global": True, "method": "scheduler"}, - "USE_DNSBL": {"value": "yes", "global": True, "method": "default", "template": None}, - "USE_REDIS": {"value": "no", "global": True, "method": "default", "template": None}, - "IS_LOADING": {"value": "no", "global": True, "method": "default", "template": None}, - "REMOTE_PHP": {"value": "", "global": True, "method": "default", "template": None}, - "USE_BACKUP": {"value": "yes", "global": True, "method": "default", "template": None}, - "USE_BROTLI": {"value": "no", "global": True, "method": "default", "template": None}, - "INJECT_BODY": {"value": "", "global": True, "method": "default", "template": None}, - "REDIRECT_TO": {"value": "", "global": True, "method": "default", "template": None}, - "USE_ANTIBOT": {"value": "no", "global": True, "method": "default", "template": None}, - "USE_METRICS": {"value": "yes", "global": True, "method": "default", "template": None}, - "USE_REAL_IP": {"value": "no", "global": True, "method": "default", "template": None}, - "DATABASE_URI": {"value": "sqlite:////var/lib/bunkerweb/db.sqlite3", "global": True, "method": "default", "template": None}, - "USE_GREYLIST": {"value": "no", "global": True, "method": "default", "template": None}, - "CUSTOM_HEADER": {"value": "", "global": True, "method": "default", "template": None}, - "USE_BLACKLIST": {"value": "no", "global": True, "method": "scheduler"}, - "USE_BUNKERNET": {"value": "no", "global": True, "method": "scheduler"}, - "USE_LIMIT_REQ": {"value": "yes", "global": True, "method": "default", "template": None}, - "USE_WHITELIST": {"value": "no", "global": True, "method": "scheduler"}, - "USE_AUTH_BASIC": {"value": "no", "global": True, "method": "default", "template": None}, - "USE_CUSTOM_SSL": {"value": "no", "global": True, "method": "default", "template": None}, - "PRO_LICENSE_KEY": {"value": "", "global": True, "method": "default", "template": None}, - "SESSIONS_SECRET": {"value": "random", "global": True, "method": "default", "template": None}, - "USE_MODSECURITY": {"value": "yes", "global": True, "method": "default", "template": None}, - "USE_SECURITYTXT": {"value": "no", "global": True, "method": "default", "template": None}, - "USE_BAD_BEHAVIOR": {"value": "yes", "global": True, "method": "default", "template": None}, - "USE_CLIENT_CACHE": {"value": "yes", "global": True, "method": "scheduler"}, - "USE_REVERSE_SCAN": {"value": "no", "global": True, "method": "default", "template": None}, - "AUTO_LETS_ENCRYPT": {"value": "no", "global": True, "method": "default", "template": None}, - "BLACKLIST_COUNTRY": {"value": "", "global": True, "method": "default", "template": None}, - "USE_REVERSE_PROXY": {"value": "no", "global": True, "method": "default", "template": None}, - "DISABLE_DEFAULT_SERVER": {"value": "yes", "global": True, "method": "scheduler"}, - "GENERATE_SELF_SIGNED_SSL": {"value": "no", "global": True, "method": "default", "template": None}, - "UI_HOST": {"value": "", "global": True, "method": "default", "template": None}, - "DNSBL_LIST": { - "value": "bl.blocklist.de problems.dnsbl.sorbs.net sbl.spamhaus.org xbl.spamhaus.org", - "global": True, - "method": "default", - "template": None, - }, - "GZIP_TYPES": { - "value": "application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml", - "global": True, - "method": "default", - }, - "REDIS_HOST": {"value": "", "global": True, "method": "default", "template": None}, - "ANTIBOT_URI": {"value": "/challenge", "global": True, "method": "default", "template": None}, - "GREYLIST_IP": {"value": "", "global": True, "method": "default", "template": None}, - "BLACKLIST_IP": {"value": "", "global": True, "method": "default", "template": None}, - "BROTLI_TYPES": { - "value": "application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml", - "global": True, - "method": "default", - }, - "NGINX_PREFIX": {"value": "/etc/nginx/", "global": True, "method": "default"}, - "WHITELIST_IP": { - "value": "20.191.45.212 40.88.21.235 40.76.173.151 40.76.163.7 20.185.79.47 52.142.26.175 20.185.79.15 52.142.24.149 40.76.162.208 40.76.163.23 40.76.162.191 40.76.162.247", - "global": True, - "method": "default", - }, - "LIMIT_REQ_URL": {"value": "/", "global": True, "method": "default", "template": None}, - "SESSIONS_NAME": {"value": "random", "global": True, "method": "default", "template": None}, - "REMOVE_HEADERS": { - "value": "Server Expect-CT X-Powered-By X-AspNet-Version X-AspNetMvc-Version Public-Key-Pins", - "global": True, - "method": "default", - "template": None, - }, - "BACKUP_SCHEDULE": {"value": "daily", "global": True, "method": "default", "template": None}, - "CUSTOM_SSL_CERT": {"value": "", "global": True, "method": "default", "template": None}, - "REMOTE_PHP_PATH": {"value": "", "global": True, "method": "default", "template": None}, - "SECURITYTXT_URI": {"value": "/.well-known/security.txt", "global": True, "method": "default", "template": None}, - "BUNKERNET_SERVER": {"value": "https://api.bunkerweb.io", "global": True, "method": "default", "template": None}, - "CORS_ALLOW_ORIGIN": {"value": "self", "global": True, "method": "default", "template": None}, - "WHITELIST_COUNTRY": {"value": "", "global": True, "method": "default", "template": None}, - "EMAIL_LETS_ENCRYPT": {"value": "", "global": True, "method": "default", "template": None}, - "REVERSE_SCAN_PORTS": {"value": "22 80 443 3128 8000 8080", "global": True, "method": "default", "template": None}, - "USE_PROXY_PROTOCOL": {"value": "no", "global": True, "method": "default", "template": None}, - "AUTH_BASIC_LOCATION": {"value": "sitewide", "global": True, "method": "default", "template": None}, - "METRICS_MEMORY_SIZE": {"value": "16m", "global": True, "method": "default", "template": None}, - "USE_MODSECURITY_CRS": {"value": "yes", "global": True, "method": "default", "template": None}, - "DATABASE_URI_READONLY": {"value": "", "global": True, "method": "default", "template": None}, - "SELF_SIGNED_SSL_EXPIRY": {"value": "365", "global": True, "method": "default", "template": None}, - "CLIENT_CACHE_EXTENSIONS": {"value": "jpg|jpeg|png|bmp|ico|svg|tif|css|js|otf|ttf|eot|woff|woff2", "global": True, "method": "default", "template": None}, - "INTERCEPTED_ERROR_CODES": {"value": "400 401 403 404 405 413 429 500 501 502 503 504", "global": True, "method": "default", "template": None}, - "REDIRECT_TO_REQUEST_URI": {"value": "no", "global": True, "method": "default", "template": None}, - "BAD_BEHAVIOR_STATUS_CODES": {"value": "400 401 403 404 405 429 444", "global": True, "method": "default", "template": None}, - "REVERSE_PROXY_INTERCEPT_ERRORS": {"value": "yes", "global": True, "method": "default", "template": None}, - "DISABLE_DEFAULT_SERVER_STRICT_SNI": {"value": "no", "global": True, "method": "default", "template": None}, - "HTTP_PORT": {"value": "8080", "global": True, "method": "default", "template": None}, - "LOCAL_PHP": {"value": "", "global": True, "method": "default", "template": None}, - "REDIS_PORT": {"value": "6379", "global": True, "method": "default", "template": None}, - "REAL_IP_FROM": {"value": "192.168.0.0/16 172.16.0.0/12 10.0.0.0/8", "global": True, "method": "default", "template": None}, - "GREYLIST_RDNS": {"value": "", "global": True, "method": "default", "template": None}, - "BLACKLIST_RDNS": {"value": ".shodan.io .censys.io", "global": True, "method": "default", "template": None}, - "CUSTOM_SSL_KEY": {"value": "", "global": True, "method": "default", "template": None}, - "LIMIT_REQ_RATE": {"value": "2r/s", "global": True, "method": "default", "template": None}, - "WHITELIST_RDNS": { - "value": ".google.com .googlebot.com .yandex.ru .yandex.net .yandex.com .search.msn.com .baidu.com .baidu.jp .crawl.yahoo.net .fwd.linkedin.com .twitter.com .twttr.com .discord.com", - "global": True, - "method": "default", - "template": None, - }, - "AUTH_BASIC_USER": {"value": "changeme", "global": True, "method": "default", "template": None}, - "BACKUP_ROTATION": {"value": "7", "global": True, "method": "default", "template": None}, - "GZIP_MIN_LENGTH": {"value": "1000", "global": True, "method": "default", "template": None}, - "BROTLI_MIN_LENGTH": {"value": "1000", "global": True, "method": "default", "template": None}, - "CLIENT_CACHE_ETAG": {"value": "yes", "global": True, "method": "default", "template": None}, - "CORS_ALLOW_METHODS": {"value": "GET, POST, OPTIONS", "global": True, "method": "default", "template": None}, - "DATABASE_LOG_LEVEL": {"value": "warning", "global": True, "method": "default", "template": None}, - "SECURITYTXT_CONTACT": {"value": "", "global": True, "method": "default", "template": None}, - "ANTIBOT_TIME_RESOLVE": {"value": "60", "global": True, "method": "default", "template": None}, - "REVERSE_SCAN_TIMEOUT": {"value": "500", "global": True, "method": "default", "template": None}, - "SELF_SIGNED_SSL_SUBJ": {"value": "/CN=www.example.com/", "global": True, "method": "default", "template": None}, - "KEEP_UPSTREAM_HEADERS": {"value": "Content-Security-Policy Permissions-Policy X-Frame-Options", "global": True, "method": "default", "template": None}, - "BAD_BEHAVIOR_THRESHOLD": {"value": "10", "global": True, "method": "default", "template": None}, - "REDIRECT_HTTP_TO_HTTPS": {"value": "no", "global": True, "method": "default", "template": None}, - "REDIRECT_TO_STATUS_CODE": {"value": "301", "global": True, "method": "default", "template": None}, - "SESSIONS_IDLING_TIMEOUT": {"value": "1800", "global": True, "method": "default", "template": None}, - "USE_LETS_ENCRYPT_STAGING": {"value": "no", "global": True, "method": "default", "template": None}, - "REVERSE_PROXY_CUSTOM_HOST": {"value": "", "global": True, "method": "default", "template": None}, - "USE_MODSECURITY_CRS_PLUGINS": {"value": "yes", "global": True, "method": "default", "template": None}, - "METRICS_MAX_BLOCKED_REQUESTS": {"value": "100", "global": True, "method": "default", "template": None}, - "HTTPS_PORT": {"value": "8443", "global": True, "method": "default", "template": None}, - "LOCAL_PHP_PATH": {"value": "", "global": True, "method": "default", "template": None}, - "REAL_IP_HEADER": {"value": "X-Forwarded-For", "global": True, "method": "default", "template": None}, - "REDIS_DATABASE": {"value": "0", "global": True, "method": "default", "template": None}, - "USE_LIMIT_CONN": {"value": "yes", "global": True, "method": "default", "template": None}, - "GZIP_COMP_LEVEL": {"value": "5", "global": True, "method": "default", "template": None}, - "BACKUP_DIRECTORY": {"value": "/var/lib/bunkerweb/backups", "global": True, "method": "default", "template": None}, - "BROTLI_COMP_LEVEL": {"value": "6", "global": True, "method": "default", "template": None}, - "ANTIBOT_TIME_VALID": {"value": "86400", "global": True, "method": "default", "template": None}, - "CORS_ALLOW_HEADERS": { - "value": "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range", - "global": True, - "method": "default", - "template": None, - }, - "AUTH_BASIC_PASSWORD": {"value": "changeme", "global": True, "method": "default", "template": None}, - "SECURITYTXT_EXPIRES": {"value": "", "global": True, "method": "default", "template": None}, - "CLIENT_CACHE_CONTROL": {"value": "public, max-age=15552000", "global": True, "method": "default", "template": None}, - "CUSTOM_SSL_CERT_DATA": {"value": "", "global": True, "method": "default", "template": None}, - "GREYLIST_RDNS_GLOBAL": {"value": "yes", "global": True, "method": "default", "template": None}, - "BLACKLIST_RDNS_GLOBAL": {"value": "yes", "global": True, "method": "default", "template": None}, - "REVERSE_PROXY_SSL_SNI": {"value": "no", "global": True, "method": "default", "template": None}, - "WHITELIST_RDNS_GLOBAL": {"value": "yes", "global": True, "method": "default", "template": None}, - "BAD_BEHAVIOR_COUNT_TIME": {"value": "60", "global": True, "method": "default", "template": None}, - "MODSECURITY_CRS_VERSION": {"value": "4", "global": True, "method": "default", "template": None}, - "SESSIONS_ROLLING_TIMEOUT": {"value": "3600", "global": True, "method": "default", "template": None}, - "STRICT_TRANSPORT_SECURITY": {"value": "max-age=31536000; includeSubDomains; preload", "global": True, "method": "default", "template": None}, - "AUTO_REDIRECT_HTTP_TO_HTTPS": {"value": "yes", "global": True, "method": "default", "template": None}, - "LETS_ENCRYPT_CLEAR_OLD_CERTS": {"value": "no", "global": True, "method": "default", "template": None}, - "MULTISITE": {"value": "yes", "global": True, "method": "scheduler"}, - "REDIS_SSL": {"value": "no", "global": True, "method": "default", "template": None}, - "COOKIE_FLAGS": {"value": "* HttpOnly SameSite=Lax", "global": True, "method": "default", "template": None}, - "GREYLIST_ASN": {"value": "", "global": True, "method": "default", "template": None}, - "GZIP_PROXIED": {"value": "no-cache no-store private expired auth", "global": True, "method": "default", "template": None}, - "BLACKLIST_ASN": {"value": "", "global": True, "method": "default", "template": None}, - "WHITELIST_ASN": {"value": "32934", "global": True, "method": "default", "template": None}, - "ALLOWED_METHODS": {"value": "GET|POST|HEAD", "global": True, "method": "default", "template": None}, - "AUTH_BASIC_TEXT": {"value": "Restricted area", "global": True, "method": "default", "template": None}, - "REAL_IP_RECURSIVE": {"value": "yes", "global": True, "method": "default", "template": None}, - "CUSTOM_SSL_KEY_DATA": {"value": "", "global": True, "method": "default", "template": None}, - "LIMIT_CONN_MAX_HTTP1": {"value": "10", "global": True, "method": "default", "template": None}, - "BAD_BEHAVIOR_BAN_TIME": {"value": "86400", "global": True, "method": "default", "template": None}, - "CORS_ALLOW_CREDENTIALS": {"value": "no", "global": True, "method": "default", "template": None}, - "SECURITYTXT_ENCRYPTION": {"value": "", "global": True, "method": "default", "template": None}, - "ANTIBOT_RECAPTCHA_SCORE": {"value": "0.7", "global": True, "method": "default", "template": None}, - "SESSIONS_ABSOLUTE_TIMEOUT": {"value": "86400", "global": True, "method": "default", "template": None}, - "REVERSE_PROXY_SSL_SNI_NAME": {"value": "", "global": True, "method": "default", "template": None}, - "MODSECURITY_CRS_PLUGIN_URLS": {"value": "", "global": True, "method": "default", "template": None}, - "SERVER_NAME": {"value": "app1.example.com www.example.com", "global": True, "method": "default", "template": None}, - "MAX_CLIENT_SIZE": {"value": "10m", "global": True, "method": "default", "template": None}, - "REDIS_SSL_VERIFY": {"value": "no", "global": True, "method": "default", "template": None}, - "REAL_IP_FROM_URLS": {"value": "", "global": True, "method": "default", "template": None}, - "SESSIONS_CHECK_IP": {"value": "yes", "global": True, "method": "default", "template": None}, - "REVERSE_PROXY_HOST": {"value": "", "global": True, "method": "default", "template": None}, - "CORS_EXPOSE_HEADERS": {"value": "Content-Length,Content-Range", "global": True, "method": "default", "template": None}, - "GREYLIST_USER_AGENT": {"value": "", "global": True, "method": "default", "template": None}, - "BLACKLIST_USER_AGENT": {"value": "", "global": True, "method": "default", "template": None}, - "LIMIT_CONN_MAX_HTTP2": {"value": "100", "global": True, "method": "default", "template": None}, - "WHITELIST_USER_AGENT": {"value": "", "global": True, "method": "default", "template": None}, - "COOKIE_AUTO_SECURE_FLAG": {"value": "yes", "global": True, "method": "default", "template": None}, - "ANTIBOT_RECAPTCHA_SITEKEY": {"value": "", "global": True, "method": "default", "template": None}, - "MODSECURITY_SEC_AUDIT_ENGINE": {"value": "RelevantOnly", "global": True, "method": "default", "template": None}, - "SECURITYTXT_ACKNOWLEDGEMENTS": {"value": "", "global": True, "method": "default", "template": None}, - "SERVE_FILES": {"value": "no", "global": True, "method": "scheduler"}, - "GREYLIST_URI": {"value": "", "global": True, "method": "default", "template": None}, - "BLACKLIST_URI": {"value": "", "global": True, "method": "default", "template": None}, - "REDIS_TIMEOUT": {"value": "1000", "global": True, "method": "default", "template": None}, - "WHITELIST_URI": {"value": "", "global": True, "method": "default", "template": None}, - "WORKER_PROCESSES": {"value": "auto", "global": True, "method": "default", "template": None}, - "REVERSE_PROXY_URL": {"value": "/", "global": True, "method": "default", "template": None}, - "LIMIT_CONN_MAX_STREAM": {"value": "10", "global": True, "method": "default", "template": None}, - "CONTENT_SECURITY_POLICY": { - "value": "object-src 'none'; form-action 'self'; frame-ancestors 'self';", - "global": True, - "method": "default", - "template": None, - }, - "ANTIBOT_RECAPTCHA_SECRET": {"value": "", "global": True, "method": "default", "template": None}, - "SESSIONS_CHECK_USER_AGENT": {"value": "yes", "global": True, "method": "default", "template": None}, - "CROSS_ORIGIN_OPENER_POLICY": {"value": "same-origin", "global": True, "method": "default", "template": None}, - "SECURITYTXT_PREFERRED_LANG": {"value": "en", "global": True, "method": "default", "template": None}, - "MODSECURITY_SEC_RULE_ENGINE": {"value": "On", "global": True, "method": "default", "template": None}, - "ROOT_FOLDER": {"value": "", "global": True, "method": "default", "template": None}, - "REDIS_USERNAME": {"value": "", "global": True, "method": "default", "template": None}, - "GREYLIST_IP_URLS": {"value": "", "global": True, "method": "default", "template": None}, - "REVERSE_PROXY_WS": {"value": "no", "global": True, "method": "default", "template": None}, - "WHITELIST_IP_URLS": {"value": "", "global": True, "method": "default", "template": None}, - "BLACKLIST_IGNORE_IP": {"value": "", "global": True, "method": "default", "template": None}, - "WORKER_RLIMIT_NOFILE": {"value": "2048", "global": True, "method": "default", "template": None}, - "SECURITYTXT_CANONICAL": {"value": "", "global": True, "method": "default", "template": None}, - "ANTIBOT_HCAPTCHA_SITEKEY": {"value": "", "global": True, "method": "default", "template": None}, - "CROSS_ORIGIN_EMBEDDER_POLICY": {"value": "require-corp", "global": True, "method": "default", "template": None}, - "MODSECURITY_SEC_AUDIT_LOG_PARTS": {"value": "ABCFHZ", "global": True, "method": "default", "template": None}, - "CONTENT_SECURITY_POLICY_REPORT_ONLY": {"value": "no", "global": True, "method": "default", "template": None}, - "SSL_PROTOCOLS": {"value": "TLSv1.2 TLSv1.3", "global": True, "method": "default", "template": None}, - "REDIS_PASSWORD": {"value": "", "global": True, "method": "default", "template": None}, - "REFERRER_POLICY": {"value": "strict-origin-when-cross-origin", "global": True, "method": "default", "template": None}, - "GREYLIST_RDNS_URLS": {"value": "", "global": True, "method": "default", "template": None}, - "SECURITYTXT_POLICY": {"value": "", "global": True, "method": "default", "template": None}, - "WORKER_CONNECTIONS": {"value": "1024", "global": True, "method": "default", "template": None}, - "WHITELIS2024-07-31T13:58:29.679295487Z T_RDNS_URLS": {"value": "", "global": True, "method": "default", "template": None}, - "BLACKLIST_IGNORE_RDNS": {"value": "", "global": True, "method": "default", "template": None}, - "REVERSE_PROXY_HEADERS": {"value": "", "global": True, "method": "default", "template": None}, - "ANTIBOT_HCAPTCHA_SECRET": {"value": "", "global": True, "method": "default", "template": None}, - "CROSS_ORIGIN_RESOURCE_POLICY": {"value": "same-site", "global": True, "method": "default", "template": None}, - "HTTP2": {"value": "yes", "global": True, "method": "default", "template": None}, - "LOG_FORMAT": { - "value": '$host $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"', - "global": True, - "method": "default", - "template": None, - }, - "CORS_MAX_AGE": {"value": "86400", "global": True, "method": "default", "template": None}, - "GREYLIST_ASN_URLS": {"value": "", "global": True, "method": "default", "template": None}, - "PERMISSIONS_POLICY": { - "value": "accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), battery=(), bluetooth=(), browsing-topics=(), camera=(), compute-pressure=(), display-capture=(), document-domain=(), encrypted-media=(), execution-while-not-rendered=(), execution-while-out-of-viewport=(), fullscreen=(), gamepad=(), geolocation=(), gyroscope=(), hid=(), identity-credentials-get=(), idle-detection=(), local-fonts=(), magnetometer=(), microphone=(), midi=(), otp-credentials=(), payment=(), picture-in-picture=(), publickey-credentials-create=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), speaker-selection=(), storage-access=(), usb=(), web-share=(), window-management=(), xr-spatial-tracking=()", - "global": True, - "method": "default", - "template": None, - }, - "SECURITYTXT_HIRING": {"value": "", "global": True, "method": "default", "template": None}, - "WHITELIST_ASN_URLS": {"value": "", "global": True, "method": "default", "template": None}, - "BLACKLIST_IGNORE_ASN": {"value": "", "global": True, "method": "default", "template": None}, - "REDIS_SENTINEL_HOSTS": {"value": "", "global": True, "method": "default", "template": None}, - "ANTIBOT_TURNSTILE_SITEKEY": {"value": "", "global": True, "method": "default", "template": None}, - "REVERSE_PROXY_HEADERS_CLIENT": {"value": "", "global": True, "method": "default", "template": None}, - "HTTP3": {"value": "no", "global": True, "method": "default", "template": None}, - "LOG_LEVEL": {"value": "info", "global": True, "method": "scheduler"}, - "DISABLE_FLOC": {"value": "yes", "global": True, "method": "default", "template": None}, - "SECURITYTXT_CSAF": {"value": "", "global": True, "method": "default", "template": None}, - "CORS_DENY_REQUEST": {"value": "yes", "global": True, "method": "default", "template": None}, - "REDIS_SENTINEL_USERNAME": {"value": "", "global": True, "method": "default", "template": None}, - "REVERSE_PROXY_BUFFERING": {"value": "yes", "global": True, "method": "default", "template": None}, - "ANTIBOT_TURNSTILE_SECRET": {"value": "", "global": True, "method": "default", "template": None}, - "GREYLIST_USER_AGENT_URLS": {"value": "", "global": True, "method": "default", "template": None}, - "WHITELIST_USER_AGENT_URLS": {"value": "", "global": True, "method": "default", "template": None}, - "BLACKLIST_IGNORE_USER_AGENT": {"value": "", "global": True, "method": "default", "template": None}, - "DNS_RESOLVERS": {"value": "127.0.0.11", "global": True, "method": "default", "template": None}, - "X_FRAME_OPTIONS": {"value": "SAMEORIGIN", "global": True, "method": "default", "template": None}, - "GREYLIST_URI_URLS": {"value": "", "global": True, "method": "default", "template": None}, - "HTTP3_ALT_SVC_PORT": {"value": "443", "global": True, "method": "default", "template": None}, - "WHITELIST_URI_URLS": {"value": "", "global": True, "method": "default", "template": None}, - "BLACKLIST_IGNORE_URI": {"value": "", "global": True, "method": "default", "template": None}, - "REDIS_SENTINEL_PASSWORD": {"value": "", "global": True, "method": "default", "template": None}, - "REVERSE_PROXY_KEEPALIVE": {"value": "no", "global": True, "method": "default", "template": None}, - "LISTEN_HTTP": {"value": "yes", "global": True, "method": "default", "template": None}, - "BLACKLIST_IP_URLS": {"value": "https://www.dan.me.uk/torlist/?exit", "global": True, "method": "default", "template": None}, - "DATASTORE_MEMORY_SIZE": {"value": "64m", "global": True, "method": "default", "template": None}, - "REDIS_SENTINEL_MASTER": {"value": "", "global": True, "method": "default", "template": None}, - "X_CONTENT_TYPE_OPTIONS": {"value": "nosniff", "global": True, "method": "default", "template": None}, - "REVERSE_PROXY_AUTH_REQUEST": {"value": "", "global": True, "method": "default", "template": None}, - "X_XSS_PROTECTION": {"value": "1; mode=block", "global": True, "method": "default", "template": None}, - "BLACKLIST_RDNS_URLS": {"value": "", "global": True, "method": "default", "template": None}, - "USE_OPEN_FILE_CACHE": {"value": "no", "global": True, "method": "default", "template": None}, - "REDIS_KEEPALIVE_IDLE": {"value": "30000", "global": True, "method": "default", "template": None}, - "CACHESTORE_MEMORY_SIZE": {"value": "64m", "global": True, "method": "default", "template": None}, - "REVERSE_PROXY_AUTH_REQUEST_SIGNIN_URL": {"value": "", "global": True, "method": "default", "template": None}, - "OPEN_FILE_CACHE": {"value": "max=1000 inactive=20s", "global": True, "method": "default", "template": None}, - "BLACKLIST_ASN_URLS": {"value": "", "global": True, "method": "default", "template": None}, - "REDIS_KEEPALIVE_POOL": {"value": "10", "global": True, "method": "default", "template": None}, - "X_DNS_PREFETCH_CONTROL": {"value": "off", "global": True, "method": "default", "template": None}, - "CACHESTORE_IPC_MEMORY_SIZE": {"value": "16m", "global": True, "method": "default", "template": None}, - "REVERSE_PROXY_AUTH_REQUEST_SET": {"value": "", "global": True, "method": "default", "template": None}, - "OPEN_FILE_CACHE_ERRORS": {"value": "yes", "global": True, "method": "default", "template": None}, - "BLACKLIST_USER_AGENT_URLS": { - "value": "https://raw.githubusercontent.com/mitchellkrogza/nginx-ultimate-bad-bot-blocker/master/_generator_lists/bad-user-agents.list", - "global": True, - "method": "default", - "template": None, - }, - "CACHESTORE_MISS_MEMORY_SIZE": {"value": "16m", "global": True, "method": "default", "template": None}, - "REVERSE_PROXY_CONNECT_TIMEOUT": {"value": "60s", "global": True, "method": "default", "template": None}, - "BLACKLIST_URI_URLS": {"value": "", "global": True, "method": "default", "template": None}, - "OPEN_FILE_CACHE_MIN_USES": {"value": "2", "global": True, "method": "default", "template": None}, - "REVERSE_PROXY_READ_TIMEOUT": {"value": "60s", "global": True, "method": "default", "template": None}, - "CACHESTORE_LOCKS_MEMORY_SIZE": {"value": "16m", "global": True, "method": "default", "template": None}, - "USE_API": {"value": "yes", "global": True, "method": "default", "template": None}, - "OPEN_FILE_CACHE_VALID": {"value": "30s", "global": True, "method": "default", "template": None}, - "BLACKLIST_IGNORE_IP_URLS": {"value": "", "global": True, "method": "default", "template": None}, - "REVERSE_PROXY_SEND_TIMEOUT": {"value": "60s", "global": True, "method": "default", "template": None}, - "API_HTTP_PORT": {"value": "5000", "global": True, "method": "default", "template": None}, - "EXTERNAL_PLUGIN_URLS": {"value": "", "global": True, "method": "default", "template": None}, - "REVERSE_PROXY_INCLUDES": {"value": "", "global": True, "method": "default", "template": None}, - "BLACKLIST_IGNORE_RDNS_URLS": {"value": "", "global": True, "method": "default", "template": None}, - "API_LISTEN_IP": {"value": "0.0.0.0", "global": True, "method": "default", "template": None}, - "DENY_HTTP_STATUS": {"value": "403", "global": True, "method": "default", "template": None}, - "BLACKLIST_IGNORE_ASN_URLS": {"value": "", "global": True, "method": "default", "template": None}, - "REVERSE_PROXY_PASS_REQUEST_BODY": {"value": "yes", "global": True, "method": "default", "template": None}, - "API_SERVER_NAME": {"value": "bwapi", "global": True, "method": "default", "template": None}, - "USE_PROXY_CACHE": {"value": "no", "global": True, "method": "default", "template": None}, - "SEND_ANONYMOUS_REPORT": {"value": "no", "global": True, "method": "scheduler"}, - "BLACKLIST_IGNORE_USER_AGENT_URLS": {"value": "", "global": True, "method": "default", "template": None}, - "API_WHITELIST_IP": {"value": "127.0.0.0/24 10.20.30.0/24", "global": True, "method": "scheduler"}, - "PROXY_CACHE_PATH_LEVELS": {"value": "1:2", "global": True, "method": "default", "template": None}, - "BLACKLIST_IGNORE_URI_URLS": {"value": "", "global": True, "method": "default", "template": None}, - "AUTOCONF_MODE": {"value": "no", "global": True, "method": "default", "template": None}, - "PROXY_CACHE_PATH_ZONE_SIZE": {"value": "10m", "global": True, "method": "default", "template": None}, - "SWARM_MODE": {"value": "no", "global": True, "method": "default", "template": None}, - "PROXY_CACHE_PATH_PARAMS": {"value": "max_size=100m", "global": True, "method": "default", "template": None}, - "KUBERNETES_MODE": {"value": "no", "global": True, "method": "default", "template": None}, - "PROXY_CACHE_METHODS": {"value": "GET HEAD", "global": True, "method": "default", "template": None}, - "SERVER_TYPE": {"value": "http", "global": True, "method": "default", "template": None}, - "PROXY_CACHE_MIN_USES": {"value": "2", "global": True, "method": "default", "template": None}, - "LISTEN_STREAM": {"value": "yes", "global": True, "method": "default", "template": None}, - "PROXY_CACHE_KEY": {"value": "$scheme$host$request_uri", "global": True, "method": "default", "template": None}, - "PROXY_CACHE_VALID": {"value": "200=24h 301=1h 302=24h", "global": True, "method": "default", "template": None}, - "LISTEN_STREAM_PORT": {"value": "1337", "global": True, "method": "default", "template": None}, - "PROXY_NO_CACHE": {"value": "$http_pragma $http_authorization", "global": True, "method": "default", "template": None}, - "LISTEN_STREAM_PORT_SSL": {"value": "4242", "global": True, "method": "default", "template": None}, - "USE_UDP": {"value": "no", "global": True, "method": "default", "template": None}, - "PROXY_CACHE_BYPASS": {"value": "0", "global": True, "method": "default", "template": None}, - "USE_IPV6": {"value": "no", "global": True, "method": "default", "template": None}, - "IS_DRAFT": {"value": "no", "global": True, "method": "default", "template": None}, - "TIMERS_LOG_LEVEL": {"value": "debug", "global": True, "method": "default", "template": None}, - "BUNKERWEB_INSTANCES": {"value": "bunkerweb", "global": True, "method": "scheduler"}, - "app1.example.com_BLACKLIST_IGNORE_IP": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_LISTEN_STREAM_PORT": {"value": "1337", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_SECURITYTXT": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_PROXY_PROTOCOL": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_UI": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_GZIP_PROXIED": {"value": "no-cache no-store private expired auth", "global": True, "method": "default", "template": None}, - "app1.example.com_COOKIE_AUTO_SECURE_FLAG": {"value": "yes", "global": True, "method": "default", "template": None}, - "app1.example.com_BLACKLIST_URI": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_SECURITYTXT_POLICY": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_SERVER_TYPE": {"value": "http", "global": True, "method": "default", "template": None}, - "app1.example.com_SECURITYTXT_CANONICAL": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_REVERSE_PROXY_SSL_SNI": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_AUTH_BASIC": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_REMOTE_PHP": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_PROXY_CACHE": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_UDP": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_MODSECURITY_SEC_AUDIT_LOG_PARTS": {"value": "ABCFHZ", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_OPEN_FILE_CACHE": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_LIMIT_CONN": {"value": "yes", "global": True, "method": "default", "template": None}, - "app1.example.com_EMAIL_LETS_ENCRYPT": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_LIMIT_REQ_RATE": {"value": "2r/s", "global": True, "method": "default", "template": None}, - "app1.example.com_AUTH_BASIC_PASSWORD": {"value": "changeme", "global": True, "method": "default", "template": None}, - "app1.example.com_SECURITYTXT_ACKNOWLEDGEMENTS": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_ANTIBOT_HCAPTCHA_SITEKEY": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_REVERSE_PROXY_HEADERS_CLIENT": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_REVERSE_PROXY_CONNECT_TIMEOUT": {"value": "60s", "global": True, "method": "default", "template": None}, - "app1.example.com_PROXY_CACHE_METHODS": {"value": "GET HEAD", "global": True, "method": "default", "template": None}, - "app1.example.com_GZIP_TYPES": { - "value": "application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml", - "global": True, - "method": "default", - "template": None, - }, - "app1.example.com_LISTEN_STREAM": {"value": "yes", "global": True, "method": "default", "template": None}, - "app1.example.com_REVERSE_PROXY_CUSTOM_HOST": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_CUSTOM_HEADER": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_CUSTOM_HEADER_2": {"value": "dzdz", "global": True, "method": "default", "template": None}, - "app1.example.com_OPEN_FILE_CACHE_ERRORS": {"value": "yes", "global": True, "method": "default", "template": None}, - "app1.example.com_LIMIT_REQ_URL": {"value": "/", "global": True, "method": "default", "template": None}, - "app1.example.com_LIMIT_CONN_MAX_HTTP2": {"value": "100", "global": True, "method": "default", "template": None}, - "app1.example.com_AUTH_BASIC_TEXT": {"value": "Restricted area", "global": True, "method": "default", "template": None}, - "app1.example.com_ANTIBOT_TURNSTILE_SITEKEY": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_SECURITYTXT_HIRING": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_BLACKLIST_IP": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_CUSTOM_SSL": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_GREYLIST_USER_AGENT": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_OPEN_FILE_CACHE_MIN_USES": {"value": "2", "global": True, "method": "default", "template": None}, - "app1.example.com_MODSECURITY_CRS_VERSION": {"value": "4", "global": True, "method": "default", "template": None}, - "app1.example.com_CROSS_ORIGIN_OPENER_POLICY": {"value": "same-origin", "global": True, "method": "default", "template": None}, - "app1.example.com_CONTENT_SECURITY_POLICY_REPORT_ONLY": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_CLIENT_CACHE_ETAG": {"value": "yes", "global": True, "method": "default", "template": None}, - "app1.example.com_PROXY_CACHE_MIN_USES": {"value": "2", "global": True, "method": "default", "template": None}, - "app1.example.com_REDIRECT_TO": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_CLIENT_CACHE_CONTROL": {"value": "public, max-age=15552000", "global": True, "method": "default", "template": None}, - "app1.example.com_LISTEN_HTTP": {"value": "yes", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_REVERSE_SCAN": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_CROSS_ORIGIN_RESOURCE_POLICY": {"value": "same-site", "global": True, "method": "default", "template": None}, - "app1.example.com_PROXY_NO_CACHE": {"value": "$http_pragma $http_authorization", "global": True, "method": "default", "template": None}, - "app1.example.com_LOCAL_PHP": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_INTERCEPTED_ERROR_CODES": { - "value": "400 401 403 404 405 413 429 500 501 502 503 504", - "global": True, - "method": "default", - "template": None, - }, - "app1.example.com_REVERSE_PROXY_AUTH_REQUEST": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_BLACKLIST_RDNS_GLOBAL": {"value": "yes", "global": True, "method": "default", "template": None}, - "app1.example.com_CORS_DENY_REQUEST": {"value": "yes", "global": True, "method": "default", "template": None}, - "app1.example.com_ANTIBOT_TIME_VALID": {"value": "86400", "global": True, "method": "default", "template": None}, - "app1.example.com_HTTP3": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_CUSTOM_SSL_CERT": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_BROTLI_TYPES": { - "value": "application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml", - "global": True, - "method": "default", - "template": None, - }, - "app1.example.com_CORS_ALLOW_ORIGIN": {"value": "self", "global": True, "method": "default", "template": None}, - "app1.example.com_MAX_CLIENT_SIZE": {"value": "10m", "global": True, "method": "default", "template": None}, - "app1.example.com_LOCAL_PHP_PATH": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_REVERSE_PROXY_BUFFERING": {"value": "yes", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_BUNKERNET": {"value": "no", "global": True, "method": "scheduler"}, - "app1.example.com_WHITELIST_IP": { - "value": "20.191.45.212 40.88.21.235 40.76.173.151 40.76.163.7 20.185.79.47 52.142.26.175 20.185.79.15 52.142.24.149 40.76.162.208 40.76.163.23 40.76.162.191 40.76.162.247", - "global": True, - "method": "default", - "template": None, - }, - "app1.example.com_ALLOWED_METHODS": {"value": "GET|POST|HEAD", "global": True, "method": "default", "template": None}, - "app1.example.com_SECURITYTXT_URI": { - "value": "/.w2024-07-31T13:58:29.679295487Z ell-known/security.txt", - "global": True, - "method": "default", - "template": None, - }, - "app1.example.com_OPEN_FILE_CACHE_VALID": {"value": "30s", "global": True, "method": "default", "template": None}, - "app1.example.com_REMOTE_PHP_PATH": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_REAL_IP_HEADER": {"value": "X-Forwarded-For", "global": True, "method": "default", "template": None}, - "app1.example.com_REVERSE_PROXY_PASS_REQUEST_BODY": {"value": "yes", "global": True, "method": "default", "template": None}, - "app1.example.com_GENERATE_SELF_SIGNED_SSL": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_REVERSE_PROXY_WS": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_CUSTOM_SSL_KEY_DATA": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_REVERSE_PROXY_AUTH_REQUEST_SET": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_REVERSE_PROXY_HOST": {"value": "http://app1:8080", "global": False, "method": "scheduler"}, - "app1.example.com_BLACKLIST_COUNTRY": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_PROXY_CACHE_VALID": {"value": "200=24h 301=1h 302=24h", "global": True, "method": "default", "template": None}, - "app1.example.com_BLACKLIST_IGNORE_RDNS": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_SECURITYTXT_EXPIRES": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_WHITELIST_COUNTRY": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_PERMISSIONS_POLICY": { - "value": "accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), battery=(), bluetooth=(), browsing-topics=(), camera=(), compute-pressure=(), display-capture=(), document-domain=(), encrypted-media=(), execution-while-not-rendered=(), execution-while-out-of-viewport=(), fullscreen=(), gamepad=(), geolocation=(), gyroscope=(), hid=(), identity-credentials-get=(), idle-detection=(), local-fonts=(), magnetometer=(), microphone=(), midi=(), otp-credentials=(), payment=(), picture-in-picture=(), publickey-credentials-create=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), speaker-selection=(), storage-access=(), usb=(), web-share=(), window-management=(), xr-spatial-tracking=()", - "global": True, - "method": "default", - "template": None, - }, - "app1.example.com_GREYLIST_ASN": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_BROTLI": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_BAD_BEHAVIOR_STATUS_CODES": {"value": "400 401 403 404 405 429 444", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_GZIP": {"value": "yes", "global": True, "method": "scheduler"}, - "app1.example.com_USE_GREYLIST": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_LETS_ENCRYPT_STAGING": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_BLACKLIST_ASN": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_CORS_ALLOW_METHODS": {"value": "GET, POST, OPTIONS", "global": True, "method": "default", "template": None}, - "app1.example.com_REVERSE_PROXY_SEND_TIMEOUT": {"value": "60s", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_BAD_BEHAVIOR": {"value": "yes", "global": True, "method": "default", "template": None}, - "app1.example.com_MODSECURITY_CRS_PLUGIN_URLS": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_METRICS": {"value": "yes", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_MODSECURITY": {"value": "yes", "global": True, "method": "default", "template": None}, - "app1.example.com_REVERSE_PROXY_KEEPALIVE": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_ANTIBOT": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_REFERRER_POLICY": {"value": "strict-origin-when-cross-origin", "global": True, "method": "default", "template": None}, - "app1.example.com_SELF_SIGNED_SSL_SUBJ": {"value": "/CN=www.example.com/", "global": True, "method": "default", "template": None}, - "app1.example.com_PROXY_CACHE_BYPASS": {"value": "0", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_WHITELIST": {"value": "no", "global": True, "method": "scheduler"}, - "app1.example.com_ANTIBOT_TIME_RESOLVE": {"value": "60", "global": True, "method": "default", "template": None}, - "app1.example.com_CORS_ALLOW_HEADERS": { - "value": "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range", - "global": True, - "method": "default", - "template": None, - }, - "app1.example.com_BLACKLIST_USER_AGENT": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_WHITELIST_USER_AGENT": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_MODSECURITY_SEC_RULE_ENGINE": {"value": "On", "global": True, "method": "default", "template": None}, - "app1.example.com_GZIP_COMP_LEVEL": {"value": "5", "global": True, "method": "default", "template": None}, - "app1.example.com_CUSTOM_SSL_CERT_DATA": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_REVERSE_SCAN_TIMEOUT": {"value": "500", "global": True, "method": "default", "template": None}, - "app1.example.com_ANTIBOT_RECAPTCHA_SITEKEY": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_CUSTOM_SSL_KEY": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_BROTLI_COMP_LEVEL": {"value": "6", "global": True, "method": "default", "template": None}, - "app1.example.com_AUTH_BASIC_USER": {"value": "changeme", "global": True, "method": "default", "template": None}, - "app1.example.com_WHITELIST_RDNS_GLOBAL": {"value": "yes", "global": True, "method": "default", "template": None}, - "app1.example.com_REAL_IP_RECURSIVE": {"value": "yes", "global": True, "method": "default", "template": None}, - "app1.example.com_BROTLI_MIN_LENGTH": {"value": "1000", "global": True, "method": "default", "template": None}, - "app1.example.com_REAL_IP_FROM": {"value": "192.168.0.0/16 172.16.0.0/12 10.0.0.0/8", "global": True, "method": "default", "template": None}, - "app1.example.com_BAD_BEHAVIOR_COUNT_TIME": {"value": "60", "global": True, "method": "default", "template": None}, - "app1.example.com_X_FRAME_OPTIONS": {"value": "SAMEORIGIN", "global": True, "method": "default", "template": None}, - "app1.example.com_REVERSE_SCAN_PORTS": {"value": "22 80 443 3128 8000 8080", "global": True, "method": "default", "template": None}, - "app1.example.com_LIMIT_CONN_MAX_HTTP1": {"value": "10", "global": True, "method": "default", "template": None}, - "app1.example.com_HTTP2": {"value": "yes", "global": True, "method": "default", "template": None}, - "app1.example.com_REVERSE_PROXY_AUTH_REQUEST_SIGNIN_URL": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_X_XSS_PROTECTION": {"value": "1; mode=block", "global": True, "method": "default", "template": None}, - "app1.example.com_WHITELIST_RDNS": { - "value": ".google.com .googlebot.com .yandex.ru .yandex.net .yandex.com .search.msn.com .baidu.com .baidu.jp .crawl.yahoo.net .fwd.linkedin.com .twitter.com .twttr.com .discord.com", - "global": True, - "method": "default", - "template": None, - }, - "app1.example.com_USE_REVERSE_PROXY": {"value": "yes", "global": False, "method": "scheduler"}, - "app1.example.com_LISTEN_STREAM_PORT_SSL": {"value": "4242", "global": True, "method": "default", "template": None}, - "app1.example.com_X_DNS_PREFETCH_CONTROL": {"value": "off", "global": True, "method": "default", "template": None}, - "app1.example.com_GREYLIST_IP": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_REDIRECT_HTTP_TO_HTTPS": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_ANTIBOT_RECAPTCHA_SECRET": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_SECURITYTXT_PREFERRED_LANG": {"value": "en", "global": True, "method": "default", "template": None}, - "app1.example.com_CORS_ALLOW_CREDENTIALS": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_BLACKLIST": {"value": "no", "global": True, "method": "scheduler"}, - "app1.example.com_CROSS_ORIGIN_EMBEDDER_POLICY": {"value": "require-corp", "global": True, "method": "default", "template": None}, - "app1.example.com_ANTIBOT_RECAPTCHA_SCORE": {"value": "0.7", "global": True, "method": "default", "template": None}, - "app1.example.com_IS_DRAFT": {"value": "no", "global": False, "method": "default", "template": None}, - "app1.example.com_ANTIBOT_URI": {"value": "/challenge", "global": True, "method": "default", "template": None}, - "app1.example.com_BAD_BEHAVIOR_THRESHOLD": {"value": "10", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_CLIENT_CACHE": {"value": "yes", "global": True, "method": "scheduler"}, - "app1.example.com_KEEP_UPSTREAM_HEADERS": { - "value": "Content-Security-Policy Permissions-Policy X-Frame-Options", - "global": True, - "method": "default", - "template": None, - }, - "app1.example.com_BLACKLIST_RDNS": {"value": ".shodan.io .censys.io", "global": True, "method": "default", "template": None}, - "app1.example.com_COOKIE_FLAGS": {"value": "* HttpOnly SameSite=Lax", "global": True, "method": "default", "template": None}, - "app1.example.com_REDIRECT_TO_STATUS_CODE": {"value": "301", "global": True, "method": "default", "template": None}, - "app1.example.com_MODSECURITY_SEC_AUDIT_ENGINE": {"value": "RelevantOnly", "global": True, "method": "default", "template": None}, - "app1.example.com_REVERSE_PROXY_HEADERS": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_STRICT_TRANSPORT_SECURITY": { - "value": "max-age=31536000; includeSubDomains; preload", - "global": True, - "method": "default", - "template": None, - }, - "app1.example.com_USE_MODSECURITY_CRS_PLUGINS": {"value": "yes", "global": True, "method": "default", "template": None}, - "app1.example.com_SSL_PROTOCOLS": {"value": "TLSv1.2 TLSv1.3", "global": True, "method": "default", "template": None}, - "app1.example.com_DISABLE_FLOC": {"value": "yes", "global": True, "method": "default", "template": None}, - "app1.example.com_REVERSE_PROXY_INTERCEPT_ERRORS": {"value": "yes", "global": True, "method": "default", "template": None}, - "app1.example.com_BLACKLIST_IGNORE_URI": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_REVERSE_PROXY_SSL_SNI_NAME": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_ROOT_FOLDER": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_BLACKLIST_IGNORE_USER_AGENT": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_OPEN_FILE_CACHE": {"value": "max=1000 inactive=20s", "global": True, "method": "default", "template": None}, - "app1.example.com_SERVE_FILES": {"value": "no", "global": True, "method": "scheduler"}, - "app1.example.com_REVERSE_PROXY_READ_TIMEOUT": {"value": "60s", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_LIMIT_REQ": {"value": "yes", "global": True, "method": "default", "template": None}, - "app1.example.com_REVERSE_PROXY_INCLUDES": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_CORS_EXPOSE_HEADERS": {"value": "Content-Length,Content-Range", "global": True, "method": "default", "template": None}, - "app1.example.com_CORS_MAX_AGE": {"value": "86400", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_DNSBL": {"value": "yes", "global": True, "method": "default", "template": None}, - "app1.example.com_ANTIBOT_TURNSTILE_SECRET": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_REAL_IP": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_X_CONTENT_TYPE_OPTIONS": {"value": "nosniff", "global": True, "method": "default", "template": None}, - "app1.example.com_GREYLIST_URI": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_BLACKLIST_IGNORE_ASN": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_GREYLIST_RDNS": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_WHITELIST_URI": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_AUTH_BASIC_LOCATION": {"value": "sitewide", "global": True, "method": "default", "template": None}, - "app1.example.com_GZIP_MIN_LENGTH": {"value": "1000", "global": True, "method": "default", "template": None}, - "app1.example.com_SECURITYTXT_CONTACT": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_SERVER_NAME": {"value": "app1.example.com", "global": False, "method": "ui"}, - "app1.example.com_ERRORS": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_CORS": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_SECURITYTXT_CSAF": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_INJECT_BODY": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_AUTO_REDIRECT_HTTP_TO_HTTPS": {"value": "yes", "global": True, "method": "default", "template": None}, - "app1.example.com_GREYLIST_RDNS_GLOBAL": {"value": "yes", "global": True, "method": "default", "template": None}, - "app1.example.com_ANTIBOT_HCAPTCHA_SECRET": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_REVERSE_PROXY_URL": {"value": "/", "global": True, "method": "default", "template": None}, - "app1.example.com_SECURITYTXT_ENCRYPTION": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_LIMIT_CONN_MAX_STREAM": {"value": "10", "global": True, "method": "default", "template": None}, - "app1.example.com_PROXY_CACHE_KEY": {"value": "$scheme$host$request_uri", "global": True, "method": "default", "template": None}, - "app1.example.com_CONTENT_SECURITY_POLICY": { - "value": "object-src 'none'; form-action 'self'; frame-ancestors 'self';", - "global": True, - "method": "default", - "template": None, - }, - "app1.example.com_AUTO_LETS_ENCRYPT": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_REMOVE_HEADERS": { - "value": "Server Expect-CT X-Powered-By X-AspNet-Version X-AspNetMvc-Version Public-Key-Pins", - "global": True, - "method": "default", - "template": None, - }, - "app1.example.com_USE_MODSECURITY_CRS": {"value": "yes", "global": True, "method": "default", "template": None}, - "app1.example.com_WHITELIST_ASN": {"value": "32934", "global": True, "method": "default", "template": None}, - "app1.example.com_SELF_SIGNED_SSL_EXPIRY": {"value": "365", "global": True, "method": "default", "template": None}, - "app1.example.com_REDIRECT_TO_REQUEST_URI": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_HTTP3_ALT_SVC_PORT": {"value": "443", "global": True, "method": "default", "template": None}, - "app1.example.com_BAD_BEHAVIOR_BAN_TIME": {"value": "86400", "global": True, "method": "default", "template": None}, - "www.example.com_BLACKLIST_IGNORE_IP": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_LISTEN_STREAM_PORT": {"value": "1337", "global": True, "method": "default", "template": None}, - "www.example.com_USE_SECURITYTXT": {"value": "no", "global": True, "method": "default", "template": None}, - "www.example.com_USE_PROXY_PROTOCOL": {"value": "no", "global": True, "method": "default", "template": None}, - "www.example.com_USE_UI": {"value": "yes", "global": False, "method": "scheduler"}, - "www.example.com_GZIP_PROXIED": {"value": "no-cache no-store private expired auth", "global": True, "method": "default", "template": None}, - "www.example.com_COOKIE_AUTO_SECURE_FLAG": {"value": "yes", "global": True, "method": "default", "template": None}, - "www.example.com_BLACKLIST_URI": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_SECURITYTXT_POLICY": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_SERVER_TYPE": {"value": "http", "global": True, "method": "default", "template": None}, - "www.example.com_SECURITYTXT_CANONICAL": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_REVERSE_PROXY_SSL_SNI": {"value": "no", "global": True, "method": "default", "template": None}, - "www.example.com_USE_AUTH_BASIC": {"value": "no", "global": True, "method": "default", "template": None}, - "www.example.com_REMOTE_PHP": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_USE_PROXY_CACHE": {"value": "no", "global": True, "method": "default", "template": None}, - "www.example.com_USE_UDP": {"value": "no", "global": True, "method": "default", "template": None}, - "www.example.com_MODSECURITY_SEC_AUDIT_LOG_PARTS": {"value": "ABCFHZ", "global": True, "method": "default", "template": None}, - "www.example.com_USE_OPEN_FILE_CACHE": {"value": "no", "global": True, "method": "default", "template": None}, - "www.example.com_USE_LIMIT_CONN": {"value": "yes", "global": True, "method": "default", "template": None}, - "www.example.com_EMAIL_LETS_ENCRYPT": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_LIMIT_REQ_RATE": {"value": "2r/s", "global": True, "method": "default", "template": None}, - "www.example.com_AUTH_BASIC_PASSWORD": {"value": "changeme", "global": True, "method": "default", "template": None}, - "www.example.com_SECURITYTXT_ACKNOWLEDGEMENTS": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_ANTIBOT_HCAPTCHA_SITEKEY": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_REVERSE_PROXY_HEADERS_CLIENT": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_REVERSE_PROXY_CONNECT_TIMEOUT": {"value": "60s", "global": True, "method": "default", "template": None}, - "www.example.com_PROXY_CACHE_METHODS": {"value": "GET HEAD", "global": True, "method": "default", "template": None}, - "www.example.com_GZIP_TYPES": { - "value": "application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.micr2024-07-31T13:58:29.679295487Z osoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml", - "global": True, - "method": "default", - "template": None, - }, - "www.example.com_LISTEN_STREAM": {"value": "yes", "global": True, "method": "default", "template": None}, - "www.example.com_REVERSE_PROXY_CUSTOM_HOST": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_CUSTOM_HEADER": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_OPEN_FILE_CACHE_ERRORS": {"value": "yes", "global": True, "method": "default", "template": None}, - "www.example.com_LIMIT_REQ_URL": {"value": "/", "global": True, "method": "default", "template": None}, - "www.example.com_LIMIT_CONN_MAX_HTTP2": {"value": "100", "global": True, "method": "default", "template": None}, - "www.example.com_AUTH_BASIC_TEXT": {"value": "Restricted area", "global": True, "method": "default", "template": None}, - "www.example.com_ANTIBOT_TURNSTILE_SITEKEY": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_SECURITYTXT_HIRING": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_BLACKLIST_IP": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_USE_CUSTOM_SSL": {"value": "no", "global": True, "method": "default", "template": None}, - "www.example.com_GREYLIST_USER_AGENT": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_OPEN_FILE_CACHE_MIN_USES": {"value": "2", "global": True, "method": "default", "template": None}, - "www.example.com_MODSECURITY_CRS_VERSION": {"value": "4", "global": True, "method": "default", "template": None}, - "www.example.com_CROSS_ORIGIN_OPENER_POLICY": {"value": "same-origin", "global": True, "method": "default", "template": None}, - "www.example.com_CONTENT_SECURITY_POLICY_REPORT_ONLY": {"value": "no", "global": True, "method": "default", "template": None}, - "www.example.com_CLIENT_CACHE_ETAG": {"value": "yes", "global": True, "method": "default", "template": None}, - "www.example.com_PROXY_CACHE_MIN_USES": {"value": "2", "global": True, "method": "default", "template": None}, - "www.example.com_REDIRECT_TO": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_CLIENT_CACHE_CONTROL": {"value": "public, max-age=15552000", "global": True, "method": "default", "template": None}, - "www.example.com_LISTEN_HTTP": {"value": "yes", "global": True, "method": "default", "template": None}, - "www.example.com_USE_REVERSE_SCAN": {"value": "no", "global": True, "method": "default", "template": None}, - "www.example.com_CROSS_ORIGIN_RESOURCE_POLICY": {"value": "same-site", "global": True, "method": "default", "template": None}, - "www.example.com_PROXY_NO_CACHE": {"value": "$http_pragma $http_authorization", "global": True, "method": "default", "template": None}, - "www.example.com_LOCAL_PHP": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_INTERCEPTED_ERROR_CODES": {"value": "400 404 405 413 429 500 501 502 503 504", "global": False, "method": "scheduler"}, - "www.example.com_REVERSE_PROXY_AUTH_REQUEST": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_BLACKLIST_RDNS_GLOBAL": {"value": "yes", "global": True, "method": "default", "template": None}, - "www.example.com_CORS_DENY_REQUEST": {"value": "yes", "global": True, "method": "default", "template": None}, - "www.example.com_ANTIBOT_TIME_VALID": {"value": "86400", "global": True, "method": "default", "template": None}, - "www.example.com_HTTP3": {"value": "no", "global": True, "method": "default", "template": None}, - "www.example.com_CUSTOM_SSL_CERT": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_BROTLI_TYPES": { - "value": "application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml", - "global": True, - "method": "default", - "template": None, - }, - "www.example.com_CORS_ALLOW_ORIGIN": {"value": "self", "global": True, "method": "default", "template": None}, - "www.example.com_MAX_CLIENT_SIZE": {"value": "10m", "global": True, "method": "default", "template": None}, - "www.example.com_LOCAL_PHP_PATH": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_REVERSE_PROXY_BUFFERING": {"value": "yes", "global": True, "method": "default", "template": None}, - "www.example.com_USE_BUNKERNET": {"value": "no", "global": True, "method": "scheduler"}, - "www.example.com_WHITELIST_IP": { - "value": "20.191.45.212 40.88.21.235 40.76.173.151 40.76.163.7 20.185.79.47 52.142.26.175 20.185.79.15 52.142.24.149 40.76.162.208 40.76.163.23 40.76.162.191 40.76.162.247", - "global": True, - "method": "default", - "template": None, - }, - "www.example.com_ALLOWED_METHODS": {"value": "GET|POST|HEAD", "global": True, "method": "default", "template": None}, - "www.example.com_SECURITYTXT_URI": {"value": "/.well-known/security.txt", "global": True, "method": "default", "template": None}, - "www.example.com_OPEN_FILE_CACHE_VALID": {"value": "30s", "global": True, "method": "default", "template": None}, - "www.example.com_REMOTE_PHP_PATH": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_REAL_IP_HEADER": {"value": "X-Forwarded-For", "global": True, "method": "default", "template": None}, - "www.example.com_REVERSE_PROXY_PASS_REQUEST_BODY": {"value": "yes", "global": True, "method": "default", "template": None}, - "www.example.com_GENERATE_SELF_SIGNED_SSL": {"value": "yes", "global": False, "method": "scheduler"}, - "www.example.com_REVERSE_PROXY_WS": {"value": "no", "global": True, "method": "default", "template": None}, - "www.example.com_CUSTOM_SSL_KEY_DATA": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_REVERSE_PROXY_AUTH_REQUEST_SET": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_REVERSE_PROXY_HOST": {"value": "http://bw-ui:7000", "global": False, "method": "scheduler"}, - "www.example.com_BLACKLIST_COUNTRY": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_PROXY_CACHE_VALID": {"value": "200=24h 301=1h 302=24h", "global": True, "method": "default", "template": None}, - "www.example.com_BLACKLIST_IGNORE_RDNS": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_SECURITYTXT_EXPIRES": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_WHITELIST_COUNTRY": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_PERMISSIONS_POLICY": { - "value": "accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), battery=(), bluetooth=(), browsing-topics=(), camera=(), compute-pressure=(), display-capture=(), document-domain=(), encrypted-media=(), execution-while-not-rendered=(), execution-while-out-of-viewport=(), fullscreen=(), gamepad=(), geolocation=(), gyroscope=(), hid=(), identity-credentials-get=(), idle-detection=(), local-fonts=(), magnetometer=(), microphone=(), midi=(), otp-credentials=(), payment=(), picture-in-picture=(), publickey-credentials-create=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), speaker-selection=(), storage-access=(), usb=(), web-share=(), window-management=(), xr-spatial-tracking=()", - "global": True, - "method": "default", - "template": None, - }, - "www.example.com_GREYLIST_ASN": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_USE_BROTLI": {"value": "no", "global": True, "method": "default", "template": None}, - "www.example.com_BAD_BEHAVIOR_STATUS_CODES": {"value": "400 401 403 404 405 429 444", "global": True, "method": "default", "template": None}, - "www.example.com_USE_GZIP": {"value": "yes", "global": True, "method": "scheduler"}, - "www.example.com_USE_GREYLIST": {"value": "no", "global": True, "method": "default", "template": None}, - "www.example.com_USE_LETS_ENCRYPT_STAGING": {"value": "no", "global": True, "method": "default", "template": None}, - "www.example.com_BLACKLIST_ASN": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_CORS_ALLOW_METHODS": {"value": "GET, POST, OPTIONS", "global": True, "method": "default", "template": None}, - "www.example.com_REVERSE_PROXY_SEND_TIMEOUT": {"value": "60s", "global": True, "method": "default", "template": None}, - "www.example.com_USE_BAD_BEHAVIOR": {"value": "yes", "global": True, "method": "default", "template": None}, - "www.example.com_MODSECURITY_CRS_PLUGIN_URLS": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_USE_METRICS": {"value": "yes", "global": True, "method": "default", "template": None}, - "www.example.com_USE_MODSECURITY": {"value": "yes", "global": True, "method": "default", "template": None}, - "www.example.com_REVERSE_PROXY_KEEPALIVE": {"value": "no", "global": True, "method": "default", "template": None}, - "www.example.com_USE_ANTIBOT": {"value": "no", "global": True, "method": "default", "template": None}, - "www.example.com_REFERRER_POLICY": {"value": "strict-origin-when-cross-origin", "global": True, "method": "default", "template": None}, - "www.example.com_SELF_SIGNED_SSL_SUBJ": {"value": "/CN=www.example.com/", "global": True, "method": "default", "template": None}, - "www.example.com_PROXY_CACHE_BYPASS": {"value": "0", "global": True, "method": "default", "template": None}, - "www.example.com_USE_WHITELIST": {"value": "no", "global": True, "method": "scheduler"}, - "www.example.com_ANTIBOT_TIME_RESOLVE": {"value": "60", "global": True, "method": "default", "template": None}, - "www.example.com_CORS_ALLOW_HEADERS": { - "value": "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range", - "global": True, - "method": "default", - "template": None, - }, - "www.example.com_BLACKLIST_USER_AGENT": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_WHITELIST_USER_AGENT": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_MODSECURITY_SEC_RULE_ENGINE": {"value": "On", "global": True, "method": "default", "template": None}, - "www.example.com_GZIP_COMP_LEVEL": {"value": "5", "global": True, "method": "default", "template": None}, - "www.example.com_CUSTOM_SSL_CERT_DATA": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_REVERSE_SCAN_TIMEOUT": {"value": "500", "global": True, "method": "default", "template": None}, - "www.example.com_ANTIBOT_RECAPTCHA_SITEKEY": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_CUSTOM_SSL_KEY": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_BROTLI_COMP_LEVEL": {"value": "6", "global": True, "method": "default", "template": None}, - "www.example.com_AUTH_BASIC_USER": {"value": "changeme", "global": True, "method": "default", "template": None}, - "www.example.com_WHITELIST_RDNS_GLOBAL": {"value": "yes", "global": True, "method": "default", "template": None}, - "www.example.com_REAL_IP_RECURSIVE": {"value": "yes", "global": True, "method": "default", "template": None}, - "www.example.com_BROTLI_MIN_LENGTH": {"value": "1000", "global": True, "method": "default", "template": None}, - "www.example.com_REAL_IP_FROM": {"value": "192.168.0.0/16 172.16.0.0/12 10.0.0.0/8", "global": True, "method": "default", "template": None}, - "www.example.com_BAD_BEHAVIOR_COUNT_TIME": {"value": "60", "global": True, "method": "default", "template": None}, - "www.example.com_X_FRAME_OPTIONS": {"value": "SAMEORIGIN", "global": True, "method": "default", "template": None}, - "www.example.com_REVERSE_SCAN_PORTS": {"value": "22 80 443 3128 8000 8080", "global": True, "method": "default", "template": None}, - "www.example.com_LIMIT_CONN_MAX_HTTP1": {"value": "10", "global": True, "method": "default", "template": None}, - "www.example.com_HTTP2": {"value": "yes", "global": True, "method": "default", "template": None}, - "www.example.com_REVERSE_PROXY_AUTH_REQUEST_SIGNIN_URL": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_X_XSS_PROTECTION": {"value": "1; mode=block", "global": True, "method": "default", "template": None}, - "www.example.com_WHITELIST_RDNS": { - "value": ".google.com .googlebot.com .yandex.ru .yandex.net .yandex.com .search.msn.com .baidu.com .baidu.jp .crawl.yahoo.net .fwd.linkedin.com .twitter.com .twttr.com .discord.com", - "global": True, - "method": "default", - "template": None, - }, - "www.example.com_USE_REVERSE_PROXY": {"value": "yes", "global": False, "method": "scheduler"}, - "www.example.com_LISTEN_STREAM_PORT_SSL": {"value": "4242", "global": True, "method": "default", "template": None}, - "www.example.com_X_DNS_PREFETCH_CONTROL": {"value": "off", "global": True, "method": "default", "template": None}, - "www.example.com_GREYLIST_IP": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_REDIRECT_HTTP_TO_HTTPS": {"value": "no", "global": True, "method": "default", "template": None}, - "www.example.com_ANTIBOT_RECAPTCHA_SECRET": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_SECURITYTXT_PREFERRED_LANG": {"value": "en", "global": True, "method": "default", "template": None}, - "www.example.com_CORS_ALLOW_CREDENTIALS": {"value": "no", "global": True, "method": "default", "template": None}, - "www.example.com_USE_BLACKLIST": {"value": "no", "global": True, "method": "scheduler"}, - "www.example.com_CROSS_ORIGIN_EMBEDDER_POLICY": {"value": "require-corp", "global": True, "method": "default", "template": None}, - "www.example.com_ANTIBOT_RECAPTCHA_SCORE": {"value": "0.7", "global": True, "method": "default", "template": None}, - "www.example.com_IS_DRAFT": {"value": "no", "global": False, "method": "default", "template": None}, - "www.example.com_ANTIBOT_URI": {"value": "/challenge", "global": True, "method": "default", "template": None}, - "www.example.com_BAD_BEHAVIOR_THRESHOLD": {"value": "10", "global": True, "method": "default", "template": None}, - "www.example.com_USE_CLIENT_CACHE": {"value": "yes", "global": True, "method": "scheduler"}, - "www.example.com_KEEP_UPSTREAM_HEADERS": { - "value": "Content-Security-Policy Permissions-Policy X-Frame-Options", - "global": True, - "method": "default", - "template": None, - }, - "www.example.com_BLACKLIST_RDNS": {"value": ".shodan.io .censys.io", "global": True, "method": "default", "template": None}, - "www.example.com_COOKIE_FLAGS": {"value": "* HttpOnly SameSite=Lax", "global": True, "method": "default", "template": None}, - "www.example.com_REDIRECT_TO_STATUS_CODE": {"value": "301", "global": True, "method": "default", "template": None}, - "www.example.com_MODSECURITY_SEC_AUDIT_ENGINE": {"value": "RelevantOnly", "global": True, "method": "default", "template": None}, - "www.example.com_REVERSE_PROXY_HEADERS": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_STRICT_TRANSPORT_SECURITY": { - "value": "max-age=31536000; includeSubDomains; preload", - "global": True, - "method": "default", - "template": None, - }, - "www.example.com_USE_MODSECURITY_CRS_PLUGINS": {"value": "yes", "global": True, "method": "default", "template": None}, - "www.example.com_SSL_PROTOCOLS": {"value": "TLSv1.2 TLSv1.3", "global": True, "method": "default", "template": None}, - "www.example.com_DISABLE_FLOC": {"value": "yes", "global": True, "method": "default", "template": None}, - "www.example.com_REVERSE_PROXY_INTERCEPT_ERRORS": {"value": "yes", "global": True, "method": "default", "template": None}, - "www.example.com_BLACKLIST_IGNORE_URI": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_REVERSE_PROXY_SSL_SNI_NAME": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_ROOT_FOLDER": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_BLACKLIST_IGNORE_USER_AGENT": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_OPEN_FILE_CACHE": {"value": "max=1000 inactive=20s", "global": True, "method": "default", "template": None}, - "www.example.com_SERVE_FILES": {"value": "no", "global": True, "method": "scheduler"}, - "www.example.com_REVERSE_PROXY_READ_TIMEOUT": {"value": "60s", "global": True, "method": "default", "template": None}, - "www.example.com_USE_LIMIT_REQ": {"value": "yes", "global": True, "method": "default", "template": None}, - "www.example.com_REVERSE_PROXY_INCLUDES": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_CORS_EXPOSE_HEADERS": {"value": "Content-Length,Content-Range", "global": True, "method": "default", "template": None}, - "www.example.com_CORS_MAX_AGE": {"value": "86400", "global": True, "method": "default", "template": None}, - "www.example.com_USE_DNSBL": {"value": "yes", "global": True, "method": "default", "template": None}, - "www.example.com_ANTIBOT_TURNSTILE_SECRET": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_USE_REAL_IP": {"value": "no", "global": True, "method": "default", "template": None}, - "www.example.com_X_CONTENT_TYPE_OPTIONS": {"value": "nosniff", "global": True, "method": "default", "template": None}, - "www.example.com_GREYLIST_URI": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_BLACKLIST_IGNORE_ASN": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_GREYLIST_RDNS": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_WHITELIST_URI": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_AUTH_BASIC_LOCATION": {"value": "sitewide", "global": True, "method": "default", "template": None}, - "www.example.com_GZIP_MIN_LENGTH": {"value": "1000", "global": True, "method": "default", "template": None}, - "www.example.com_SECURITYTXT_CONTACT": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_SERVER_NAME": {"value": "www.example.com", "global": False, "method": "scheduler"}, - "www.example.com_ERRORS": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_USE_CORS": {"value": "no", "global": True, "method": "default", "template": None}, - "www.example.com_SECURITYTXT_CSAF": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_INJECT_BODY": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_AUTO_REDIRECT_HTTP_TO_HTTPS": {"value": "yes", "global": True, "method": "default", "template": None}, - "www.example.com_GREYLIST_RDNS_GLOBAL": {"valu2024-07-31T13:58:29.679295487Z e": "yes", "global": True, "method": "default", "template": None}, - "www.example.com_ANTIBOT_HCAPTCHA_SECRET": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_REVERSE_PROXY_URL": {"value": "/admin", "global": False, "method": "scheduler"}, - "www.example.com_SECURITYTXT_ENCRYPTION": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_LIMIT_CONN_MAX_STREAM": {"value": "10", "global": True, "method": "default", "template": None}, - "www.example.com_PROXY_CACHE_KEY": {"value": "$scheme$host$request_uri", "global": True, "method": "default", "template": None}, - "www.example.com_CONTENT_SECURITY_POLICY": { - "value": "object-src 'none'; form-action 'self'; frame-ancestors 'self';", - "global": True, - "method": "default", - "template": None, - }, - "www.example.com_AUTO_LETS_ENCRYPT": {"value": "no", "global": True, "method": "default", "template": None}, - "www.example.com_REMOVE_HEADERS": { - "value": "Server Expect-CT X-Powered-By X-AspNet-Version X-AspNetMvc-Version Public-Key-Pins", - "global": True, - "method": "default", - "template": None, - }, - "www.example.com_USE_MODSECURITY_CRS": {"value": "yes", "global": True, "method": "default", "template": None}, - "www.example.com_WHITELIST_ASN": {"value": "32934", "global": True, "method": "default", "template": None}, - "www.example.com_SELF_SIGNED_SSL_EXPIRY": {"value": "365", "global": True, "method": "default", "template": None}, - "www.example.com_REDIRECT_TO_REQUEST_URI": {"value": "no", "global": True, "method": "default", "template": None}, - "www.example.com_HTTP3_ALT_SVC_PORT": {"value": "443", "global": True, "method": "default", "template": None}, - "www.example.com_BAD_BEHAVIOR_BAN_TIME": {"value": "86400", "global": True, "method": "default", "template": None}, -} - - -templates_ui = { - "low": { - "plugin_id": "templates", - "name": "Basic security level", - "settings": { - "SERVER_NAME": "www.example.com", - "USE_REVERSE_PROXY": "yes", - "REVERSE_PROXY_HOST": "http://upstream-server:8080", - "REVERSE_PROXY_URL": "/", - "REVERSE_PROXY_CUSTOM_HOST": "", - "REVERSE_PROXY_SSL_SNI": "no", - "REVERSE_PROXY_SSL_SNI_NAME": "", - "REVERSE_PROXY_WS": "no", - "REVERSE_PROXY_KEEPALIVE": "no", - "AUTO_LETS_ENCRYPT": "yes", - "USE_LETS_ENCRYPT_STAGING": "no", - "ALLOWED_METHODS": "GET|POST|HEAD|OPTIONS|PUT|DELETE|PATCH", - "MAX_CLIENT_SIZE": "100m", - "HTTP2": "yes", - "HTTP3": "yes", - "SSL_PROTOCOLS": "TLSv1.2 TLSv1.3", - "COOKIE_FLAGS": "* SameSite=Lax", - "CONTENT_SECURITY_POLICY": "", - "PERMISSIONS_POLICY": "", - "KEEP_UPSTREAM_HEADERS": "*", - "REFERRER_POLICY": "no-referrer-when-downgrade", - "USE_CORS": "yes", - "CORS_ALLOW_ORIGIN": "*", - "USE_BAD_BEHAVIOR": "yes", - "BAD_BEHAVIOR_STATUS_CODES": "400 401 403 404 405 429 444", - "BAD_BEHAVIOR_BAN_TIME": "3600", - "BAD_BEHAVIOR_THRESHOLD": "30", - "BAD_BEHAVIOR_COUNT_TIME": "60", - "USE_ANTIBOT": "yes", - "ANTIBOT_URI": "/challenge", - "ANTIBOT_RECAPTCHA_SCORE": "0.7", - "ANTIBOT_RECAPTCHA_SITEKEY": "", - "ANTIBOT_RECAPTCHA_SECRET": "", - "ANTIBOT_HCAPTCHA_SITEKEY": "", - "ANTIBOT_HCAPTCHA_SECRET": "", - "ANTIBOT_TURNSTILE_SITEKEY": "", - "ANTIBOT_TURNSTILE_SECRET": "", - "USE_BLACKLIST": "yes", - "USE_DNSBL": "no", - "USE_LIMIT_CONN": "yes", - "LIMIT_CONN_MAX_HTTP1": "25", - "LIMIT_CONN_MAX_HTTP2": "200", - "USE_LIMIT_REQ": "yes", - "LIMIT_REQ_URL": "/", - "LIMIT_REQ_RATE": "5r/s", - }, - "configs": { - "modsec/anomaly_score.conf": "SecAction \\\n \"id:900110,\\\n phase:1,\\\n pass,\\\n t:none,\\\n nolog,\\\n tag:'OWASP_CRS',\\\n setvar:tx.inbound_anomaly_score_threshold=6,\\\n setvar:tx.outbound_anomaly_score_threshold=5\"\n" - }, - "steps": { - 1: { - "title": "Web service - Front service", - "subtitle": "Configure your web service facing your clients", - "settings": ["SERVER_NAME", "AUTO_LETS_ENCRYPT", "USE_LETS_ENCRYPT_STAGING"], - }, - 2: { - "title": "Web service - Upstream server", - "subtitle": "Configure the upstream server to be protected by BunkerWeb", - "settings": [ - "USE_REVERSE_PROXY", - "REVERSE_PROXY_HOST", - "REVERSE_PROXY_URL", - "REVERSE_PROXY_CUSTOM_HOST", - "REVERSE_PROXY_SSL_SNI", - "REVERSE_PROXY_SSL_SNI_NAME", - "REVERSE_PROXY_WS", - "REVERSE_PROXY_KEEPALIVE", - ], - }, - 3: { - "title": "HTTP - General", - "subtitle": "Configure the settings related to the HTTP(S) protocol", - "settings": ["ALLOWED_METHODS", "MAX_CLIENT_SIZE", "HTTP2", "HTTP3", "SSL_PROTOCOLS"], - }, - 4: { - "title": "HTTP - Headers", - "subtitle": "Configure the settings related to the HTTP headers", - "settings": [ - "COOKIE_FLAGS", - "CONTENT_SECURITY_POLICY", - "PERMISSIONS_POLICY", - "KEEP_UPSTREAM_HEADERS", - "REFERRER_POLICY", - "USE_CORS", - "CORS_ALLOW_ORIGIN", - ], - }, - 5: { - "title": "Security - Bad behavior", - "subtitle": "Configure the settings related to the automatic ban when a bad behavior is detected.", - "settings": ["USE_BAD_BEHAVIOR", "BAD_BEHAVIOR_STATUS_CODES", "BAD_BEHAVIOR_BAN_TIME", "BAD_BEHAVIOR_THRESHOLD", "BAD_BEHAVIOR_COUNT_TIME"], - }, - 6: { - "title": "Security - Blacklisting", - "subtitle": "Configure the settings related to the external blacklists.", - "settings": ["USE_BLACKLIST", "USE_DNSBL"], - }, - 7: { - "title": "Security - Limiting", - "subtitle": "Configure the settings related to limiting requests and connections.", - "settings": ["USE_LIMIT_CONN", "LIMIT_CONN_MAX_HTTP1", "LIMIT_CONN_MAX_HTTP2", "USE_LIMIT_REQ", "LIMIT_REQ_URL", "LIMIT_REQ_RATE"], - }, - 8: { - "title": "Security - Antibot", - "subtitle": "Configure the settings about bot detection", - "settings": [ - "USE_ANTIBOT", - "ANTIBOT_URI", - "ANTIBOT_RECAPTCHA_SCORE", - "ANTIBOT_RECAPTCHA_SITEKEY", - "ANTIBOT_RECAPTCHA_SECRET", - "ANTIBOT_HCAPTCHA_SITEKEY", - "ANTIBOT_HCAPTCHA_SECRET", - "ANTIBOT_TURNSTILE_SITEKEY", - "ANTIBOT_TURNSTILE_SECRET", - ], - }, - }, - } -} - - -output = advanced_mode_builder(templates_ui, plugins, global_config, total_config, service_name) -with open("advanced.json", "w") as f: - json.dump(output, f, indent=4) - -output_base64_bytes = base64.b64encode(bytes(json.dumps(output), "utf-8")) -output_base64_string = output_base64_bytes.decode("ascii") -with open("advanced.txt", "w") as f: - f.write(output_base64_string) diff --git a/src/ui/client/tests/advanced.txt b/src/ui/client/tests/advanced.txt deleted file mode 100644 index 742d7dfa4..000000000 --- a/src/ui/client/tests/advanced.txt +++ /dev/null @@ -1 +0,0 @@ -W3sidHlwZSI6ICJjYXJkIiwgImNvbnRhaW5lckNvbHVtbnMiOiB7InBjIjogMTIsICJ0YWJsZXQiOiAxMiwgIm1vYmlsZSI6IDEyfSwgIndpZGdldHMiOiBbeyJ0eXBlIjogIlRpdGxlIiwgImRhdGEiOiB7InRpdGxlIjogImFwcDEuZXhhbXBsZS5jb20iLCAidHlwZSI6ICJjb250YWluZXIiLCAibG93ZXJjYXNlIjogdHJ1ZX19LCB7InR5cGUiOiAiU3VidGl0bGUiLCAiZGF0YSI6IHsic3VidGl0bGUiOiAic2VydmljZXNfbWFuYWdlX3N1YnRpdGxlIiwgInR5cGUiOiAiY29udGFpbmVyIn19LCB7InR5cGUiOiAiVGVtcGxhdGVzIiwgImRhdGEiOiB7InRlbXBsYXRlcyI6IHsiYWR2YW5jZWQiOiB7ImRlZmF1bHQiOiBbeyJpZCI6ICJnZW5lcmFsIiwgInN0cmVhbSI6ICJwYXJ0aWFsIiwgIm5hbWUiOiAiR2VuZXJhbCIsICJkZXNjcmlwdGlvbiI6ICJUaGUgZ2VuZXJhbCBzZXR0aW5ncyBmb3IgdGhlIHNlcnZlciIsICJ2ZXJzaW9uIjogIjAuMSIsICJ0eXBlIjogImNvcmUiLCAibWV0aG9kIjogIm1hbnVhbCIsICJwYWdlIjogZmFsc2UsICJzZXR0aW5ncyI6IHsiU0VSVkVSX05BTUUiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAid3d3LmV4YW1wbGUuY29tIiwgImhlbHAiOiAiTGlzdCBvZiB0aGUgdmlydHVhbCBob3N0cyBzZXJ2ZWQgYnkgYnVua2Vyd2ViLiIsICJpZCI6ICJzZXJ2ZXItbmFtZSIsICJsYWJlbCI6ICJTZXJ2ZXIgbmFtZSIsICJyZWdleCI6ICJeKChcXFN7MSwyNTV9KSg/IS4qXFxzXFwyKFxcc3wkKSkpPyhcXHMoXFxTezEsMjU1fSkoPyEuKlxcc1xcNShcXHN8JCkpKSokIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4oKFxcU3sxLDI1NX0pKD8hLipcXHNcXDIoXFxzfCQpKSk/KFxccyhcXFN7MSwyNTV9KSg/IS4qXFxzXFw1KFxcc3wkKSkpKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogImFwcDEuZXhhbXBsZS5jb20iLCAibmFtZSI6ICJTZXJ2ZXIgbmFtZSIsICJwcmV2X3ZhbHVlIjogInd3dy5leGFtcGxlLmNvbSIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiB0aGUgdmlydHVhbCBob3N0cyBzZXJ2ZWQgYnkgYnVua2Vyd2ViLiJ9XSwgIm1ldGhvZCI6ICJ1aSIsICJjb250YWluZXJDbGFzcyI6ICJ6LTYifSwgIlNFUlZFUl9UWVBFIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogImh0dHAiLCAiaGVscCI6ICJTZXJ2ZXIgdHlwZSA6IGh0dHAgb3Igc3RyZWFtLiIsICJpZCI6ICJzZXJ2ZXItdHlwZSIsICJsYWJlbCI6ICJTZXJ2ZXIgdHlwZSIsICJyZWdleCI6ICJeKGh0dHB8c3RyZWFtKSQiLCAidHlwZSI6ICJzZWxlY3QiLCAicGF0dGVybiI6ICJeKGh0dHB8c3RyZWFtKSQiLCAiaW5wVHlwZSI6ICJzZWxlY3QiLCAidmFsdWVzIjogWyJodHRwIiwgInN0cmVhbSJdLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJodHRwIiwgIm5hbWUiOiAiU2VydmVyIHR5cGUiLCAicHJldl92YWx1ZSI6ICJodHRwIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJTZXJ2ZXIgdHlwZSA6IGh0dHAgb3Igc3RyZWFtLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotNSJ9LCAiTElTVEVOX1NUUkVBTSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJ5ZXMiLCAiaGVscCI6ICJFbmFibGUgbGlzdGVuaW5nIGZvciBub24tc3NsIChwYXNzdGhyb3VnaCkuIiwgImlkIjogImxpc3Rlbi1zdHJlYW0iLCAibGFiZWwiOiAiTGlzdGVuIHN0cmVhbSIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJ5ZXMiLCAibmFtZSI6ICJMaXN0ZW4gc3RyZWFtIiwgInByZXZfdmFsdWUiOiAieWVzIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJFbmFibGUgbGlzdGVuaW5nIGZvciBub24tc3NsIChwYXNzdGhyb3VnaCkuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei00In0sICJMSVNURU5fU1RSRUFNX1BPUlQiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiMTMzNyIsICJoZWxwIjogIkxpc3RlbmluZyBwb3J0IGZvciBub24tc3NsIChwYXNzdGhyb3VnaCkuIiwgImlkIjogImxpc3Rlbi1zdHJlYW0tcG9ydCIsICJsYWJlbCI6ICJMaXN0ZW4gc3RyZWFtIHBvcnQiLCAicmVnZXgiOiAiXlswLTldKyQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXlswLTldKyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjEzMzciLCAibmFtZSI6ICJMaXN0ZW4gc3RyZWFtIHBvcnQiLCAicHJldl92YWx1ZSI6ICIxMzM3IiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJMaXN0ZW5pbmcgcG9ydCBmb3Igbm9uLXNzbCAocGFzc3Rocm91Z2gpLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMyJ9LCAiTElTVEVOX1NUUkVBTV9QT1JUX1NTTCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICI0MjQyIiwgImhlbHAiOiAiTGlzdGVuaW5nIHBvcnQgZm9yIHNzbCAocGFzc3Rocm91Z2gpLiIsICJpZCI6ICJsaXN0ZW4tc3RyZWFtLXBvcnQtc3NsIiwgImxhYmVsIjogIkxpc3RlbiBzdHJlYW0gcG9ydCBzc2wiLCAicmVnZXgiOiAiXlswLTldKyQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXlswLTldKyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjQyNDIiLCAibmFtZSI6ICJMaXN0ZW4gc3RyZWFtIHBvcnQgc3NsIiwgInByZXZfdmFsdWUiOiAiNDI0MiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdGVuaW5nIHBvcnQgZm9yIHNzbCAocGFzc3Rocm91Z2gpLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMiJ9LCAiVVNFX1VEUCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJubyIsICJoZWxwIjogIlVEUCBsaXN0ZW4gaW5zdGVhZCBvZiBUQ1AgKHN0cmVhbSkuIiwgImlkIjogInVzZS11ZHAiLCAibGFiZWwiOiAiTGlzdGVuIFVEUCIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJubyIsICJuYW1lIjogIkxpc3RlbiBVRFAiLCAicHJldl92YWx1ZSI6ICJubyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVURQIGxpc3RlbiBpbnN0ZWFkIG9mIFRDUCAoc3RyZWFtKS4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTEifSwgIklTX0RSQUZUIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIm5vIiwgImhlbHAiOiAiSW50ZXJuYWwgdXNlIDogc2V0IHRvIHllcyB3aGVuIHRoZSBzZXJ2aWNlIGlzIGluIGRyYWZ0IG1vZGUuIiwgImlkIjogImludGVybmFsLXVzZS1kcmFmdCIsICJsYWJlbCI6ICJpbnRlcm5hbCB1c2UgZHJhZnQiLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAibm8iLCAibmFtZSI6ICJpbnRlcm5hbCB1c2UgZHJhZnQiLCAicHJldl92YWx1ZSI6ICJubyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiSW50ZXJuYWwgdXNlIDogc2V0IHRvIHllcyB3aGVuIHRoZSBzZXJ2aWNlIGlzIGluIGRyYWZ0IG1vZGUuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0wIn19LCAiY2hlY2tzdW0iOiBudWxsfSwgeyJpZCI6ICJhbnRpYm90IiwgInN0cmVhbSI6ICJubyIsICJuYW1lIjogIkFudGlib3QiLCAiZGVzY3JpcHRpb24iOiAiQm90IGRldGVjdGlvbiBieSB1c2luZyBhIGNoYWxsZW5nZS4iLCAidmVyc2lvbiI6ICIxLjAiLCAidHlwZSI6ICJjb3JlIiwgIm1ldGhvZCI6ICJtYW51YWwiLCAicGFnZSI6IHRydWUsICJzZXR0aW5ncyI6IHsiVVNFX0FOVElCT1QiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAibm8iLCAiaGVscCI6ICJBY3RpdmF0ZSBhbnRpYm90IGZlYXR1cmUuIiwgImlkIjogInVzZS1hbnRpYm90IiwgImxhYmVsIjogIkFudGlib3QgY2hhbGxlbmdlIiwgInJlZ2V4IjogIl4obm98Y29va2llfGphdmFzY3JpcHR8Y2FwdGNoYXxyZWNhcHRjaGF8aGNhcHRjaGF8dHVybnN0aWxlKSQiLCAidHlwZSI6ICJzZWxlY3QiLCAicGF0dGVybiI6ICJeKG5vfGNvb2tpZXxqYXZhc2NyaXB0fGNhcHRjaGF8cmVjYXB0Y2hhfGhjYXB0Y2hhfHR1cm5zdGlsZSkkIiwgImlucFR5cGUiOiAic2VsZWN0IiwgInZhbHVlcyI6IFsiY2FwdGNoYSIsICJjb29raWUiLCAiaGNhcHRjaGEiLCAiamF2YXNjcmlwdCIsICJubyIsICJyZWNhcHRjaGEiLCAidHVybnN0aWxlIl0sICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIm5vIiwgIm5hbWUiOiAiQW50aWJvdCBjaGFsbGVuZ2UiLCAicHJldl92YWx1ZSI6ICJubyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiQWN0aXZhdGUgYW50aWJvdCBmZWF0dXJlLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMTAifSwgIkFOVElCT1RfVVJJIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIi9jaGFsbGVuZ2UiLCAiaGVscCI6ICJVbnVzZWQgVVJJIHRoYXQgY2xpZW50cyB3aWxsIGJlIHJlZGlyZWN0ZWQgdG8gdG8gc29sdmUgdGhlIGNoYWxsZW5nZS4iLCAiaWQiOiAiYW50aWJvdC11cmkiLCAibGFiZWwiOiAiQW50aWJvdCBVUkwiLCAicmVnZXgiOiAiXlxcL1tcXHdcXF0ufjpcXC8/I1xcW0AhJFxcJidcXChcXCkqKyw7PVxcLV0qJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeXFwvW1xcd1xcXS5+OlxcLz8jXFxbQCEkXFwmJ1xcKFxcKSorLDs9XFwtXSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIvY2hhbGxlbmdlIiwgIm5hbWUiOiAiQW50aWJvdCBVUkwiLCAicHJldl92YWx1ZSI6ICIvY2hhbGxlbmdlIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJVbnVzZWQgVVJJIHRoYXQgY2xpZW50cyB3aWxsIGJlIHJlZGlyZWN0ZWQgdG8gdG8gc29sdmUgdGhlIGNoYWxsZW5nZS4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTkifSwgIkFOVElCT1RfVElNRV9SRVNPTFZFIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIjYwIiwgImhlbHAiOiAiTWF4aW11bSB0aW1lIChpbiBzZWNvbmRzKSBjbGllbnRzIGhhdmUgdG8gcmVzb2x2ZSB0aGUgY2hhbGxlbmdlLiBPbmNlIHRoaXMgdGltZSBoYXMgcGFzc2VkLCBhIG5ldyBjaGFsbGVuZ2Ugd2lsbCBiZSBnZW5lcmF0ZWQuIiwgImlkIjogImFudGlib3QtdGltZS1yZXNvbHZlIiwgImxhYmVsIjogIlRpbWUgdG8gcmVzb2x2ZSIsICJyZWdleCI6ICJeWzAtOV0rJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeWzAtOV0rJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiNjAiLCAibmFtZSI6ICJUaW1lIHRvIHJlc29sdmUiLCAicHJldl92YWx1ZSI6ICI2MCIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTWF4aW11bSB0aW1lIChpbiBzZWNvbmRzKSBjbGllbnRzIGhhdmUgdG8gcmVzb2x2ZSB0aGUgY2hhbGxlbmdlLiBPbmNlIHRoaXMgdGltZSBoYXMgcGFzc2VkLCBhIG5ldyBjaGFsbGVuZ2Ugd2lsbCBiZSBnZW5lcmF0ZWQuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei04In0sICJBTlRJQk9UX1RJTUVfVkFMSUQiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiODY0MDAiLCAiaGVscCI6ICJNYXhpbXVtIHZhbGlkaXR5IHRpbWUgb2Ygc29sdmVkIGNoYWxsZW5nZXMuIE9uY2UgdGhpcyB0aW1lIGhhcyBwYXNzZWQsIGNsaWVudHMgd2lsbCBuZWVkIHRvIHJlc29sdmUgYSBuZXcgb25lLiIsICJpZCI6ICJhbnRpYm90LXRpbWUtdmFsaWQiLCAibGFiZWwiOiAiVGltZSB2YWxpZCIsICJyZWdleCI6ICJeWzAtOV0rJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeWzAtOV0rJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiODY0MDAiLCAibmFtZSI6ICJUaW1lIHZhbGlkIiwgInByZXZfdmFsdWUiOiAiODY0MDAiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIk1heGltdW0gdmFsaWRpdHkgdGltZSBvZiBzb2x2ZWQgY2hhbGxlbmdlcy4gT25jZSB0aGlzIHRpbWUgaGFzIHBhc3NlZCwgY2xpZW50cyB3aWxsIG5lZWQgdG8gcmVzb2x2ZSBhIG5ldyBvbmUuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei03In0sICJBTlRJQk9UX1JFQ0FQVENIQV9TQ09SRSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIwLjciLCAiaGVscCI6ICJNaW5pbXVtIHNjb3JlIHJlcXVpcmVkIGZvciByZUNBUFRDSEEgY2hhbGxlbmdlLiIsICJpZCI6ICJhbnRpYm90LXJlY2FwdGNoYS1zY29yZSIsICJsYWJlbCI6ICJyZUNBUFRDSEEgc2NvcmUiLCAicmVnZXgiOiAiXigwXFwuWzEtOV18MVxcLjApJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeKDBcXC5bMS05XXwxXFwuMCkkIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIwLjciLCAibmFtZSI6ICJyZUNBUFRDSEEgc2NvcmUiLCAicHJldl92YWx1ZSI6ICIwLjciLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIk1pbmltdW0gc2NvcmUgcmVxdWlyZWQgZm9yIHJlQ0FQVENIQSBjaGFsbGVuZ2UuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei02In0sICJBTlRJQk9UX1JFQ0FQVENIQV9TSVRFS0VZIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIlNpdGVrZXkgZm9yIHJlQ0FQVENIQSBjaGFsbGVuZ2UuIiwgImlkIjogImFudGlib3QtcmVjYXB0Y2hhLXNpdGVrZXkiLCAibGFiZWwiOiAicmVDQVBUQ0hBIHNpdGVrZXkiLCAicmVnZXgiOiAiXltcXHdcXC1dKiQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXltcXHdcXC1dKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJuYW1lIjogInJlQ0FQVENIQSBzaXRla2V5IiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJTaXRla2V5IGZvciByZUNBUFRDSEEgY2hhbGxlbmdlLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotNSJ9LCAiQU5USUJPVF9SRUNBUFRDSEFfU0VDUkVUIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIlNlY3JldCBmb3IgcmVDQVBUQ0hBIGNoYWxsZW5nZS4iLCAiaWQiOiAiYW50aWJvdC1yZWNhcHRjaGEtc2VjcmV0IiwgImxhYmVsIjogInJlQ0FQVENIQSBzZWNyZXQiLCAicmVnZXgiOiAiXltcXHdcXC1dKiQiLCAidHlwZSI6ICJwYXNzd29yZCIsICJwYXR0ZXJuIjogIl5bXFx3XFwtXSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibmFtZSI6ICJyZUNBUFRDSEEgc2VjcmV0IiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJTZWNyZXQgZm9yIHJlQ0FQVENIQSBjaGFsbGVuZ2UuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei00In0sICJBTlRJQk9UX0hDQVBUQ0hBX1NJVEVLRVkiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiU2l0ZWtleSBmb3IgaENhcHRjaGEgY2hhbGxlbmdlLiIsICJpZCI6ICJhbnRpYm90LWhjYXB0Y2hhLXNpdGVrZXkiLCAibGFiZWwiOiAiaENhcHRjaGEgc2l0ZWtleSIsICJyZWdleCI6ICJeW2EtekEtWjAtOVxcLV0qJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeW2EtekEtWjAtOVxcLV0qJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm5hbWUiOiAiaENhcHRjaGEgc2l0ZWtleSIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiU2l0ZWtleSBmb3IgaENhcHRjaGEgY2hhbGxlbmdlLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMyJ9LCAiQU5USUJPVF9IQ0FQVENIQV9TRUNSRVQiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiU2VjcmV0IGZvciBoQ2FwdGNoYSBjaGFsbGVuZ2UuIiwgImlkIjogImFudGlib3QtaGNhcHRjaGEtc2VjcmV0IiwgImxhYmVsIjogImhDYXB0Y2hhIHNlY3JldCIsICJyZWdleCI6ICJeXFx3KiQiLCAidHlwZSI6ICJwYXNzd29yZCIsICJwYXR0ZXJuIjogIl5cXHcqJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm5hbWUiOiAiaENhcHRjaGEgc2VjcmV0IiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJTZWNyZXQgZm9yIGhDYXB0Y2hhIGNoYWxsZW5nZS4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTIifSwgIkFOVElCT1RfVFVSTlNUSUxFX1NJVEVLRVkiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiU2l0ZWtleSBmb3IgVHVybnN0aWxlIGNoYWxsZW5nZS4iLCAiaWQiOiAiYW50aWJvdC10dXJuc3RpbGUtc2l0ZWtleSIsICJsYWJlbCI6ICJUdXJuc3RpbGUgc2l0ZWtleSIsICJyZWdleCI6ICJeKDB4W1xcd1xcLV0rKT8kIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4oMHhbXFx3XFwtXSspPyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJuYW1lIjogIlR1cm5zdGlsZSBzaXRla2V5IiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJTaXRla2V5IGZvciBUdXJuc3RpbGUgY2hhbGxlbmdlLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMSJ9LCAiQU5USUJPVF9UVVJOU1RJTEVfU0VDUkVUIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIlNlY3JldCBmb3IgVHVybnN0aWxlIGNoYWxsZW5nZS4iLCAiaWQiOiAiYW50aWJvdC10dXJuc3RpbGUtc2VjcmV0IiwgImxhYmVsIjogIlR1cm5zdGlsZSBzZWNyZXQiLCAicmVnZXgiOiAiXigweFtcXHdcXC1dKyk/JCIsICJ0eXBlIjogInBhc3N3b3JkIiwgInBhdHRlcm4iOiAiXigweFtcXHdcXC1dKyk/JCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm5hbWUiOiAiVHVybnN0aWxlIHNlY3JldCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiU2VjcmV0IGZvciBUdXJuc3RpbGUgY2hhbGxlbmdlLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMCJ9fSwgImNoZWNrc3VtIjogbnVsbH0sIHsiaWQiOiAiYXV0aGJhc2ljIiwgInN0cmVhbSI6ICJubyIsICJuYW1lIjogIkF1dGggYmFzaWMiLCAiZGVzY3JpcHRpb24iOiAiRW5mb3JjZSBsb2dpbiBiZWZvcmUgYWNjZXNzaW5nIGEgcmVzb3VyY2Ugb3IgdGhlIHdob2xlIHNpdGUgdXNpbmcgSFRUUCBiYXNpYyBhdXRoIG1ldGhvZC4iLCAidmVyc2lvbiI6ICIxLjAiLCAidHlwZSI6ICJjb3JlIiwgIm1ldGhvZCI6ICJtYW51YWwiLCAicGFnZSI6IGZhbHNlLCAic2V0dGluZ3MiOiB7IlVTRV9BVVRIX0JBU0lDIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIm5vIiwgImhlbHAiOiAiVXNlIEhUVFAgYmFzaWMgYXV0aCIsICJpZCI6ICJ1c2UtYXV0aC1iYXNpYyIsICJsYWJlbCI6ICJVc2UgSFRUUCBiYXNpYyBhdXRoIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIm5vIiwgIm5hbWUiOiAiVXNlIEhUVFAgYmFzaWMgYXV0aCIsICJwcmV2X3ZhbHVlIjogIm5vIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJVc2UgSFRUUCBiYXNpYyBhdXRoIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei00In0sICJBVVRIX0JBU0lDX0xPQ0FUSU9OIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogInNpdGV3aWRlIiwgImhlbHAiOiAiVVJMIG9mIHRoZSBwcm90ZWN0ZWQgcmVzb3VyY2Ugb3Igc2l0ZXdpZGUgdmFsdWUuIiwgImlkIjogImF1dGgtYmFzaWMtbG9jYXRpb24iLCAibGFiZWwiOiAiQXV0aCBiYXNpYyBMb2NhdGlvbiIsICJyZWdleCI6ICJeKHNpdGV3aWRlfC9bYS16QS1aMC05LlxcL1xcLV0qKSQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXihzaXRld2lkZXwvW2EtekEtWjAtOS5cXC9cXC1dKikkIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJzaXRld2lkZSIsICJuYW1lIjogIkF1dGggYmFzaWMgTG9jYXRpb24iLCAicHJldl92YWx1ZSI6ICJzaXRld2lkZSIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVVJMIG9mIHRoZSBwcm90ZWN0ZWQgcmVzb3VyY2Ugb3Igc2l0ZXdpZGUgdmFsdWUuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0zIn0sICJBVVRIX0JBU0lDX1VTRVIiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiY2hhbmdlbWUiLCAiaGVscCI6ICJVc2VybmFtZSIsICJpZCI6ICJhdXRoLWJhc2ljLXVzZXIiLCAibGFiZWwiOiAiQXV0aCBiYXNpYyBVc2VybmFtZSIsICJyZWdleCI6ICJeW1xcd1xcLV0rIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl5bXFx3XFwtXSsiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogImNoYW5nZW1lIiwgIm5hbWUiOiAiQXV0aCBiYXNpYyBVc2VybmFtZSIsICJwcmV2X3ZhbHVlIjogImNoYW5nZW1lIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJVc2VybmFtZSJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMiJ9LCAiQVVUSF9CQVNJQ19QQVNTV09SRCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJjaGFuZ2VtZSIsICJoZWxwIjogIlBhc3N3b3JkIiwgImlkIjogImF1dGgtYmFzaWMtcGFzc3dvcmQiLCAibGFiZWwiOiAiUGFzc3dvcmQiLCAicmVnZXgiOiAiXi4rIiwgInR5cGUiOiAicGFzc3dvcmQiLCAicGF0dGVybiI6ICJeLisiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogImNoYW5nZW1lIiwgIm5hbWUiOiAiUGFzc3dvcmQiLCAicHJldl92YWx1ZSI6ICJjaGFuZ2VtZSIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiUGFzc3dvcmQifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTEifSwgIkFVVEhfQkFTSUNfVEVYVCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJSZXN0cmljdGVkIGFyZWEiLCAiaGVscCI6ICJUZXh0IHRvIGRpc3BsYXkiLCAiaWQiOiAiYXV0aC1iYXNpYy10ZXh0IiwgImxhYmVsIjogIlRleHQiLCAicmVnZXgiOiAiXi4rIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4uKyIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiUmVzdHJpY3RlZCBhcmVhIiwgIm5hbWUiOiAiVGV4dCIsICJwcmV2X3ZhbHVlIjogIlJlc3RyaWN0ZWQgYXJlYSIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVGV4dCB0byBkaXNwbGF5In1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0wIn19LCAiY2hlY2tzdW0iOiBudWxsfSwgeyJpZCI6ICJiYWRiZWhhdmlvciIsICJzdHJlYW0iOiAieWVzIiwgIm5hbWUiOiAiQmFkIGJlaGF2aW9yIiwgImRlc2NyaXB0aW9uIjogIkJhbiBJUCBnZW5lcmF0aW5nIHRvbyBtdWNoICdiYWQnIEhUVFAgc3RhdHVzIGNvZGUgaW4gYSBwZXJpb2Qgb2YgdGltZS4iLCAidmVyc2lvbiI6ICIxLjAiLCAidHlwZSI6ICJjb3JlIiwgIm1ldGhvZCI6ICJtYW51YWwiLCAicGFnZSI6IHRydWUsICJzZXR0aW5ncyI6IHsiVVNFX0JBRF9CRUhBVklPUiI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJ5ZXMiLCAiaGVscCI6ICJBY3RpdmF0ZSBCYWQgYmVoYXZpb3IgZmVhdHVyZS4iLCAiaWQiOiAidXNlLWJhZC1iZWhhdmlvciIsICJsYWJlbCI6ICJBY3RpdmF0ZSBiYWQgYmVoYXZpb3IiLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAieWVzIiwgIm5hbWUiOiAiQWN0aXZhdGUgYmFkIGJlaGF2aW9yIiwgInByZXZfdmFsdWUiOiAieWVzIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJBY3RpdmF0ZSBCYWQgYmVoYXZpb3IgZmVhdHVyZS4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTQifSwgIkJBRF9CRUhBVklPUl9TVEFUVVNfQ09ERVMiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiNDAwIDQwMSA0MDMgNDA0IDQwNSA0MjkgNDQ0IiwgImhlbHAiOiAiTGlzdCBvZiBIVFRQIHN0YXR1cyBjb2RlcyBjb25zaWRlcmVkIGFzICdiYWQnLiIsICJpZCI6ICJiYWQtYmVoYXZpb3Itc3RhdHVzLWNvZGUiLCAibGFiZWwiOiAiQmFkIHN0YXR1cyBjb2RlcyIsICJyZWdleCI6ICJeKCAqKFsxLTVdXFxkezJ9KSg/IS4qXFwyKSAqKSskIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4oICooWzEtNV1cXGR7Mn0pKD8hLipcXDIpICopKyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjQwMCA0MDEgNDAzIDQwNCA0MDUgNDI5IDQ0NCIsICJuYW1lIjogIkJhZCBzdGF0dXMgY29kZXMiLCAicHJldl92YWx1ZSI6ICI0MDAgNDAxIDQwMyA0MDQgNDA1IDQyOSA0NDQiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkxpc3Qgb2YgSFRUUCBzdGF0dXMgY29kZXMgY29uc2lkZXJlZCBhcyAnYmFkJy4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTMifSwgIkJBRF9CRUhBVklPUl9USFJFU0hPTEQiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiMTAiLCAiaGVscCI6ICJNYXhpbXVtIG51bWJlciBvZiAnYmFkJyBIVFRQIHN0YXR1cyBjb2RlcyB3aXRoaW4gdGhlIHBlcmlvZCBvZiB0aW1lIGJlZm9yZSBJUCBpcyBiYW5uZWQuIiwgImlkIjogImJhZC1iZWhhdmlvci10aHJlc2hvbGQiLCAibGFiZWwiOiAiVGhyZXNob2xkIiwgInJlZ2V4IjogIl5bMS05XVswLTldKiIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeWzEtOV1bMC05XSoiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjEwIiwgIm5hbWUiOiAiVGhyZXNob2xkIiwgInByZXZfdmFsdWUiOiAiMTAiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIk1heGltdW0gbnVtYmVyIG9mICdiYWQnIEhUVFAgc3RhdHVzIGNvZGVzIHdpdGhpbiB0aGUgcGVyaW9kIG9mIHRpbWUgYmVmb3JlIElQIGlzIGJhbm5lZC4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTIifSwgIkJBRF9CRUhBVklPUl9DT1VOVF9USU1FIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIjYwIiwgImhlbHAiOiAiUGVyaW9kIG9mIHRpbWUgKGluIHNlY29uZHMpIGR1cmluZyB3aGljaCB3ZSBjb3VudCAnYmFkJyBIVFRQIHN0YXR1cyBjb2Rlcy4iLCAiaWQiOiAiYmFkLWJlaGF2aW9yLXBlcmlvZCIsICJsYWJlbCI6ICJQZXJpb2QgKGluIHNlY29uZHMpIiwgInJlZ2V4IjogIl5cXGQrIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl5cXGQrIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICI2MCIsICJuYW1lIjogIlBlcmlvZCAoaW4gc2Vjb25kcykiLCAicHJldl92YWx1ZSI6ICI2MCIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiUGVyaW9kIG9mIHRpbWUgKGluIHNlY29uZHMpIGR1cmluZyB3aGljaCB3ZSBjb3VudCAnYmFkJyBIVFRQIHN0YXR1cyBjb2Rlcy4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTEifSwgIkJBRF9CRUhBVklPUl9CQU5fVElNRSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICI4NjQwMCIsICJoZWxwIjogIlRoZSBkdXJhdGlvbiB0aW1lIChpbiBzZWNvbmRzKSBvZiBhIGJhbiB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIElQIGhhcyByZWFjaGVkIHRoZSB0aHJlc2hvbGQuIiwgImlkIjogImJhZC1iZWhhdmlvci1iYW4tdGltZSIsICJsYWJlbCI6ICJCYW4gZHVyYXRpb24gKGluIHNlY29uZHMpIiwgInJlZ2V4IjogIl5cXGQrIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl5cXGQrIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICI4NjQwMCIsICJuYW1lIjogIkJhbiBkdXJhdGlvbiAoaW4gc2Vjb25kcykiLCAicHJldl92YWx1ZSI6ICI4NjQwMCIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVGhlIGR1cmF0aW9uIHRpbWUgKGluIHNlY29uZHMpIG9mIGEgYmFuIHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcgSVAgaGFzIHJlYWNoZWQgdGhlIHRocmVzaG9sZC4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTAifX0sICJjaGVja3N1bSI6IG51bGx9LCB7ImlkIjogImJsYWNrbGlzdCIsICJzdHJlYW0iOiAicGFydGlhbCIsICJuYW1lIjogIkJsYWNrbGlzdCIsICJkZXNjcmlwdGlvbiI6ICJEZW55IGFjY2VzcyBiYXNlZCBvbiBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgSVAvbmV0d29yay9yRE5TL0FTTiBibGFja2xpc3RzLiIsICJ2ZXJzaW9uIjogIjEuMCIsICJ0eXBlIjogImNvcmUiLCAibWV0aG9kIjogIm1hbnVhbCIsICJwYWdlIjogdHJ1ZSwgInNldHRpbmdzIjogeyJVU0VfQkxBQ0tMSVNUIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogInllcyIsICJoZWxwIjogIkFjdGl2YXRlIGJsYWNrbGlzdCBmZWF0dXJlLiIsICJpZCI6ICJ1c2UtYmxhY2tsaXN0IiwgImxhYmVsIjogIkFjdGl2YXRlIGJsYWNrbGlzdGluZyIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogdHJ1ZSwgInZhbHVlIjogIm5vIiwgIm5hbWUiOiAiQWN0aXZhdGUgYmxhY2tsaXN0aW5nIiwgInByZXZfdmFsdWUiOiAieWVzIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAidHJlc3Bhc3MiLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tZXRob2RfZGlzYWJsZWQifSwgeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkFjdGl2YXRlIGJsYWNrbGlzdCBmZWF0dXJlLiJ9XSwgIm1ldGhvZCI6ICJzY2hlZHVsZXIiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xMSJ9LCAiQkxBQ0tMSVNUX0lQIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkxpc3Qgb2YgSVAvbmV0d29yaywgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCB0byBibG9jay4iLCAiaWQiOiAiYmxhY2tsaXN0LWlwIiwgImxhYmVsIjogIkJsYWNrbGlzdCBJUC9uZXR3b3JrIiwgInJlZ2V4IjogIl4oPyEgKSggKigoKFxcYjI1WzAtNV18XFxiMlswLTRdXFxkfFxcYlswMV0/XFxkXFxkPykoXFwuKDI1WzAtNV18MlswLTRdXFxkfFswMV0/XFxkXFxkPykpezN9KShcXC8oWzEtMl1bMC05XT98M1swLTJdP3xbMDQtOV0pKT98KChbMC05YS1mQS1GXXsxLDR9Oil7N31bMC05YS1mQS1GXXsxLDR9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw3fTp8KFswLTlhLWZBLUZdezEsNH06KXsxLDZ9OlswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDV9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDJ9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw0fSg6WzAtOWEtZkEtRl17MSw0fSl7MSwzfXwoWzAtOWEtZkEtRl17MSw0fTopezEsM30oOlswLTlhLWZBLUZdezEsNH0pezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDJ9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDV9fFswLTlhLWZBLUZdezEsNH06KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw2fSl8OigoOlswLTlhLWZBLUZdezEsNH0pezEsN318Oil8ZmU4MDooOlswLTlhLWZBLUZdWnswLDR9KXswLDR9JVswLTlhLXpBLVpdK3w6OihmZmZmKDowezEsNH0pPzopPygoMjVbMC01XXwoMlswLTRdfDE/XFxkKT9cXGQpXFwuKXszfSgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZCl8KFswLTlhLWZBLUZdezEsNH06KXsxLDR9OigoMjVbMC01XXwoMlswLTRdfDE/XFxkKT9cXGQpXFwuKXszfSgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZCkpKFxcLygxMlswLThdfDFbMDFdWzAtOV18WzAtOV1bMC05XT8pKT8pKD8hLipcXERcXDIoW15cXGRcXC9dfCQpKSAqKSokIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4oPyEgKSggKigoKFxcYjI1WzAtNV18XFxiMlswLTRdXFxkfFxcYlswMV0/XFxkXFxkPykoXFwuKDI1WzAtNV18MlswLTRdXFxkfFswMV0/XFxkXFxkPykpezN9KShcXC8oWzEtMl1bMC05XT98M1swLTJdP3xbMDQtOV0pKT98KChbMC05YS1mQS1GXXsxLDR9Oil7N31bMC05YS1mQS1GXXsxLDR9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw3fTp8KFswLTlhLWZBLUZdezEsNH06KXsxLDZ9OlswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDV9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDJ9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw0fSg6WzAtOWEtZkEtRl17MSw0fSl7MSwzfXwoWzAtOWEtZkEtRl17MSw0fTopezEsM30oOlswLTlhLWZBLUZdezEsNH0pezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDJ9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDV9fFswLTlhLWZBLUZdezEsNH06KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw2fSl8OigoOlswLTlhLWZBLUZdezEsNH0pezEsN318Oil8ZmU4MDooOlswLTlhLWZBLUZdWnswLDR9KXswLDR9JVswLTlhLXpBLVpdK3w6OihmZmZmKDowezEsNH0pPzopPygoMjVbMC01XXwoMlswLTRdfDE/XFxkKT9cXGQpXFwuKXszfSgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZCl8KFswLTlhLWZBLUZdezEsNH06KXsxLDR9OigoMjVbMC01XXwoMlswLTRdfDE/XFxkKT9cXGQpXFwuKXszfSgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZCkpKFxcLygxMlswLThdfDFbMDFdWzAtOV18WzAtOV1bMC05XT8pKT8pKD8hLipcXERcXDIoW15cXGRcXC9dfCQpKSAqKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibmFtZSI6ICJCbGFja2xpc3QgSVAvbmV0d29yayIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBJUC9uZXR3b3JrLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIHRvIGJsb2NrLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMTAifSwgIkJMQUNLTElTVF9SRE5TIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIi5zaG9kYW4uaW8gLmNlbnN5cy5pbyIsICJoZWxwIjogIkxpc3Qgb2YgcmV2ZXJzZSBETlMgc3VmZml4ZXMsIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgdG8gYmxvY2suIiwgImlkIjogImJsYWNrbGlzdC1yZG5zIiwgImxhYmVsIjogIkJsYWNrbGlzdCByZXZlcnNlIEROUyIsICJyZWdleCI6ICJeKCAqKChbXiBdKykoPyEuKlxcMyggfCQpKSkgKikqJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeKCAqKChbXiBdKykoPyEuKlxcMyggfCQpKSkgKikqJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiLnNob2Rhbi5pbyAuY2Vuc3lzLmlvIiwgIm5hbWUiOiAiQmxhY2tsaXN0IHJldmVyc2UgRE5TIiwgInByZXZfdmFsdWUiOiAiLnNob2Rhbi5pbyAuY2Vuc3lzLmlvIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJMaXN0IG9mIHJldmVyc2UgRE5TIHN1ZmZpeGVzLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIHRvIGJsb2NrLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotOSJ9LCAiQkxBQ0tMSVNUX1JETlNfR0xPQkFMIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogInllcyIsICJoZWxwIjogIk9ubHkgcGVyZm9ybSBSRE5TIGJsYWNrbGlzdCBjaGVja3Mgb24gZ2xvYmFsIElQIGFkZHJlc3Nlcy4iLCAiaWQiOiAiYmxhY2tsaXN0LXJkbnMtZ2xvYmFsIiwgImxhYmVsIjogIkJsYWNrbGlzdCByZXZlcnNlIEROUyBnbG9iYWwgSVBzIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogInllcyIsICJuYW1lIjogIkJsYWNrbGlzdCByZXZlcnNlIEROUyBnbG9iYWwgSVBzIiwgInByZXZfdmFsdWUiOiAieWVzIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJPbmx5IHBlcmZvcm0gUkROUyBibGFja2xpc3QgY2hlY2tzIG9uIGdsb2JhbCBJUCBhZGRyZXNzZXMuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei04In0sICJCTEFDS0xJU1RfQVNOIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkxpc3Qgb2YgQVNOIG51bWJlcnMsIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgdG8gYmxvY2suIiwgImlkIjogImJsYWNrbGlzdC1hc24iLCAibGFiZWwiOiAiQmxhY2tsaXN0IEFTTiIsICJyZWdleCI6ICJeXiggKigoQVNOPyk/KFxcZCspXFxiKD8hLipbU04gXVxcNFxcYikpICopKiQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXl4oICooKEFTTj8pPyhcXGQrKVxcYig/IS4qW1NOIF1cXDRcXGIpKSAqKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibmFtZSI6ICJCbGFja2xpc3QgQVNOIiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJMaXN0IG9mIEFTTiBudW1iZXJzLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIHRvIGJsb2NrLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotNyJ9LCAiQkxBQ0tMSVNUX1VTRVJfQUdFTlQiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiTGlzdCBvZiBVc2VyLUFnZW50IChQQ1JFIHJlZ2V4KSwgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCB0byBibG9jay4iLCAiaWQiOiAiYmxhY2tsaXN0LXVzZXItYWdlbnQiLCAibGFiZWwiOiAiQmxhY2tsaXN0IFVzZXItQWdlbnQiLCAicmVnZXgiOiAiXi4qJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeLiokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibmFtZSI6ICJCbGFja2xpc3QgVXNlci1BZ2VudCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBVc2VyLUFnZW50IChQQ1JFIHJlZ2V4KSwgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCB0byBibG9jay4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTYifSwgIkJMQUNLTElTVF9VUkkiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiTGlzdCBvZiBVUkkgKFBDUkUgcmVnZXgpLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIHRvIGJsb2NrLiIsICJpZCI6ICJibGFja2xpc3QtdXJpIiwgImxhYmVsIjogIkJsYWNrbGlzdCBVUkkiLCAicmVnZXgiOiAiXiggKiguKikoPyEuKlxcMig/IS4pKSAqKSokIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4oICooLiopKD8hLipcXDIoPyEuKSkgKikqJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm5hbWUiOiAiQmxhY2tsaXN0IFVSSSIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBVUkkgKFBDUkUgcmVnZXgpLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIHRvIGJsb2NrLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotNSJ9LCAiQkxBQ0tMSVNUX0lHTk9SRV9JUCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJMaXN0IG9mIElQL25ldHdvcmssIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgdG8gaWdub3JlIGluIHRoZSBibGFja2xpc3QuIiwgImlkIjogImJsYWNrbGlzdC1pZ25vcmUtaXAiLCAibGFiZWwiOiAiQmxhY2tsaXN0IGlnbm9yZSBJUC9uZXR3b3JrIiwgInJlZ2V4IjogIl4oPyEgKSggKigoKFxcYjI1WzAtNV18XFxiMlswLTRdXFxkfFxcYlswMV0/XFxkXFxkPykoXFwuKDI1WzAtNV18MlswLTRdXFxkfFswMV0/XFxkXFxkPykpezN9KShcXC8oWzEtMl1bMC05XT98M1swLTJdP3xbMDQtOV0pKT98KChbMC05YS1mQS1GXXsxLDR9Oil7N31bMC05YS1mQS1GXXsxLDR9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw3fTp8KFswLTlhLWZBLUZdezEsNH06KXsxLDZ9OlswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDV9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDJ9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw0fSg6WzAtOWEtZkEtRl17MSw0fSl7MSwzfXwoWzAtOWEtZkEtRl17MSw0fTopezEsM30oOlswLTlhLWZBLUZdezEsNH0pezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDJ9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDV9fFswLTlhLWZBLUZdezEsNH06KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw2fSl8OigoOlswLTlhLWZBLUZdezEsNH0pezEsN318Oil8ZmU4MDooOlswLTlhLWZBLUZdWnswLDR9KXswLDR9JVswLTlhLXpBLVpdK3w6OihmZmZmKDowezEsNH0pPzopPygoMjVbMC01XXwoMlswLTRdfDE/XFxkKT9cXGQpXFwuKXszfSgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZCl8KFswLTlhLWZBLUZdezEsNH06KXsxLDR9OigoMjVbMC01XXwoMlswLTRdfDE/XFxkKT9cXGQpXFwuKXszfSgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZCkpKFxcLygxMlswLThdfDFbMDFdWzAtOV18WzAtOV1bMC05XT8pKT8pKD8hLipcXERcXDIoW15cXGRcXC9dfCQpKSAqKSokIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4oPyEgKSggKigoKFxcYjI1WzAtNV18XFxiMlswLTRdXFxkfFxcYlswMV0/XFxkXFxkPykoXFwuKDI1WzAtNV18MlswLTRdXFxkfFswMV0/XFxkXFxkPykpezN9KShcXC8oWzEtMl1bMC05XT98M1swLTJdP3xbMDQtOV0pKT98KChbMC05YS1mQS1GXXsxLDR9Oil7N31bMC05YS1mQS1GXXsxLDR9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw3fTp8KFswLTlhLWZBLUZdezEsNH06KXsxLDZ9OlswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDV9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDJ9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw0fSg6WzAtOWEtZkEtRl17MSw0fSl7MSwzfXwoWzAtOWEtZkEtRl17MSw0fTopezEsM30oOlswLTlhLWZBLUZdezEsNH0pezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDJ9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDV9fFswLTlhLWZBLUZdezEsNH06KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw2fSl8OigoOlswLTlhLWZBLUZdezEsNH0pezEsN318Oil8ZmU4MDooOlswLTlhLWZBLUZdWnswLDR9KXswLDR9JVswLTlhLXpBLVpdK3w6OihmZmZmKDowezEsNH0pPzopPygoMjVbMC01XXwoMlswLTRdfDE/XFxkKT9cXGQpXFwuKXszfSgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZCl8KFswLTlhLWZBLUZdezEsNH06KXsxLDR9OigoMjVbMC01XXwoMlswLTRdfDE/XFxkKT9cXGQpXFwuKXszfSgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZCkpKFxcLygxMlswLThdfDFbMDFdWzAtOV18WzAtOV1bMC05XT8pKT8pKD8hLipcXERcXDIoW15cXGRcXC9dfCQpKSAqKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibmFtZSI6ICJCbGFja2xpc3QgaWdub3JlIElQL25ldHdvcmsiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkxpc3Qgb2YgSVAvbmV0d29yaywgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCB0byBpZ25vcmUgaW4gdGhlIGJsYWNrbGlzdC4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTQifSwgIkJMQUNLTElTVF9JR05PUkVfUkROUyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJMaXN0IG9mIHJldmVyc2UgRE5TIHN1ZmZpeGVzLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIHRvIGlnbm9yZSBpbiB0aGUgYmxhY2tsaXN0LiIsICJpZCI6ICJibGFja2xpc3QtaWdub3JlLXJkbnMiLCAibGFiZWwiOiAiQmxhY2tsaXN0IGlnbm9yZSByZXZlcnNlIEROUyIsICJyZWdleCI6ICJeKCAqKChbXiBdKykoPyEuKlxcMyggfCQpKSkgKikqJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeKCAqKChbXiBdKykoPyEuKlxcMyggfCQpKSkgKikqJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm5hbWUiOiAiQmxhY2tsaXN0IGlnbm9yZSByZXZlcnNlIEROUyIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiByZXZlcnNlIEROUyBzdWZmaXhlcywgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCB0byBpZ25vcmUgaW4gdGhlIGJsYWNrbGlzdC4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTMifSwgIkJMQUNLTElTVF9JR05PUkVfQVNOIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkxpc3Qgb2YgQVNOIG51bWJlcnMsIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgdG8gaWdub3JlIGluIHRoZSBibGFja2xpc3QuIiwgImlkIjogImJsYWNrbGlzdC1pZ25vcmUtYXNuIiwgImxhYmVsIjogIkJsYWNrbGlzdCBpZ25vcmUgQVNOIiwgInJlZ2V4IjogIl5eKCAqKChBU04/KT8oXFxkKylcXGIoPyEuKltTTiBdXFw0XFxiKSkgKikqJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeXiggKigoQVNOPyk/KFxcZCspXFxiKD8hLipbU04gXVxcNFxcYikpICopKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJuYW1lIjogIkJsYWNrbGlzdCBpZ25vcmUgQVNOIiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJMaXN0IG9mIEFTTiBudW1iZXJzLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIHRvIGlnbm9yZSBpbiB0aGUgYmxhY2tsaXN0LiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMiJ9LCAiQkxBQ0tMSVNUX0lHTk9SRV9VU0VSX0FHRU5UIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkxpc3Qgb2YgVXNlci1BZ2VudCAoUENSRSByZWdleCksIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgdG8gaWdub3JlIGluIHRoZSBibGFja2xpc3QuIiwgImlkIjogImJsYWNrbGlzdC1pZ25vcmUtdXNlci1hZ2VudCIsICJsYWJlbCI6ICJCbGFja2xpc3QgaWdub3JlIFVzZXItQWdlbnQiLCAicmVnZXgiOiAiXi4qJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeLiokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibmFtZSI6ICJCbGFja2xpc3QgaWdub3JlIFVzZXItQWdlbnQiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkxpc3Qgb2YgVXNlci1BZ2VudCAoUENSRSByZWdleCksIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgdG8gaWdub3JlIGluIHRoZSBibGFja2xpc3QuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xIn0sICJCTEFDS0xJU1RfSUdOT1JFX1VSSSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJMaXN0IG9mIFVSSSAoUENSRSByZWdleCksIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgdG8gaWdub3JlIGluIHRoZSBibGFja2xpc3QuIiwgImlkIjogImJsYWNrbGlzdC1pZ25vcmUtdXJpIiwgImxhYmVsIjogIkJsYWNrbGlzdCBpZ25vcmUgVVJJIiwgInJlZ2V4IjogIl4oICooLiopKD8hLipcXDIoPyEuKSkgKikqJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeKCAqKC4qKSg/IS4qXFwyKD8hLikpICopKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJuYW1lIjogIkJsYWNrbGlzdCBpZ25vcmUgVVJJIiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJMaXN0IG9mIFVSSSAoUENSRSByZWdleCksIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgdG8gaWdub3JlIGluIHRoZSBibGFja2xpc3QuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0wIn19LCAiY2hlY2tzdW0iOiBudWxsfSwgeyJpZCI6ICJicm90bGkiLCAic3RyZWFtIjogIm5vIiwgIm5hbWUiOiAiQnJvdGxpIiwgImRlc2NyaXB0aW9uIjogIkNvbXByZXNzIEhUVFAgcmVxdWVzdHMgd2l0aCB0aGUgYnJvdGxpIGFsZ29yaXRobS4iLCAidmVyc2lvbiI6ICIxLjAiLCAidHlwZSI6ICJjb3JlIiwgIm1ldGhvZCI6ICJtYW51YWwiLCAicGFnZSI6IGZhbHNlLCAic2V0dGluZ3MiOiB7IlVTRV9CUk9UTEkiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAibm8iLCAiaGVscCI6ICJVc2UgYnJvdGxpIiwgImlkIjogInVzZS1icm90bGkiLCAibGFiZWwiOiAiVXNlIGJyb3RsaSIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJubyIsICJuYW1lIjogIlVzZSBicm90bGkiLCAicHJldl92YWx1ZSI6ICJubyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVXNlIGJyb3RsaSJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMyJ9LCAiQlJPVExJX1RZUEVTIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogImFwcGxpY2F0aW9uL2F0b20reG1sIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQgYXBwbGljYXRpb24vanNvbiBhcHBsaWNhdGlvbi9yc3MreG1sIGFwcGxpY2F0aW9uL3ZuZC5tcy1mb250b2JqZWN0IGFwcGxpY2F0aW9uL3gtZm9udC1vcGVudHlwZSBhcHBsaWNhdGlvbi94LWZvbnQtdHJ1ZXR5cGUgYXBwbGljYXRpb24veC1mb250LXR0ZiBhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQgYXBwbGljYXRpb24veGh0bWwreG1sIGFwcGxpY2F0aW9uL3htbCBmb250L2VvdCBmb250L29wZW50eXBlIGZvbnQvb3RmIGZvbnQvdHJ1ZXR5cGUgaW1hZ2Uvc3ZnK3htbCBpbWFnZS92bmQubWljcm9zb2Z0Lmljb24gaW1hZ2UveC1pY29uIGltYWdlL3gtd2luLWJpdG1hcCB0ZXh0L2NzcyB0ZXh0L2phdmFzY3JpcHQgdGV4dC9wbGFpbiB0ZXh0L3htbCIsICJoZWxwIjogIkxpc3Qgb2YgTUlNRSB0eXBlcyB0aGF0IHdpbGwgYmUgY29tcHJlc3NlZCB3aXRoIGJyb3RsaS4iLCAiaWQiOiAiYnJvdGxpLXR5cGVzIiwgImxhYmVsIjogIk1JTUUgdHlwZXMiLCAicmVnZXgiOiAiXig/ISApKCA/KFtcXC1cXHcuXSsvW1xcLVxcdy4rXSspKD8hLipcXDIoPyEuKSkpKyQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXig/ISApKCA/KFtcXC1cXHcuXSsvW1xcLVxcdy4rXSspKD8hLipcXDIoPyEuKSkpKyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogImFwcGxpY2F0aW9uL2F0b20reG1sIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQgYXBwbGljYXRpb24vanNvbiBhcHBsaWNhdGlvbi9yc3MreG1sIGFwcGxpY2F0aW9uL3ZuZC5tcy1mb250b2JqZWN0IGFwcGxpY2F0aW9uL3gtZm9udC1vcGVudHlwZSBhcHBsaWNhdGlvbi94LWZvbnQtdHJ1ZXR5cGUgYXBwbGljYXRpb24veC1mb250LXR0ZiBhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQgYXBwbGljYXRpb24veGh0bWwreG1sIGFwcGxpY2F0aW9uL3htbCBmb250L2VvdCBmb250L29wZW50eXBlIGZvbnQvb3RmIGZvbnQvdHJ1ZXR5cGUgaW1hZ2Uvc3ZnK3htbCBpbWFnZS92bmQubWljcm9zb2Z0Lmljb24gaW1hZ2UveC1pY29uIGltYWdlL3gtd2luLWJpdG1hcCB0ZXh0L2NzcyB0ZXh0L2phdmFzY3JpcHQgdGV4dC9wbGFpbiB0ZXh0L3htbCIsICJuYW1lIjogIk1JTUUgdHlwZXMiLCAicHJldl92YWx1ZSI6ICJhcHBsaWNhdGlvbi9hdG9tK3htbCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0IGFwcGxpY2F0aW9uL2pzb24gYXBwbGljYXRpb24vcnNzK3htbCBhcHBsaWNhdGlvbi92bmQubXMtZm9udG9iamVjdCBhcHBsaWNhdGlvbi94LWZvbnQtb3BlbnR5cGUgYXBwbGljYXRpb24veC1mb250LXRydWV0eXBlIGFwcGxpY2F0aW9uL3gtZm9udC10dGYgYXBwbGljYXRpb24veC1qYXZhc2NyaXB0IGFwcGxpY2F0aW9uL3hodG1sK3htbCBhcHBsaWNhdGlvbi94bWwgZm9udC9lb3QgZm9udC9vcGVudHlwZSBmb250L290ZiBmb250L3RydWV0eXBlIGltYWdlL3N2Zyt4bWwgaW1hZ2Uvdm5kLm1pY3Jvc29mdC5pY29uIGltYWdlL3gtaWNvbiBpbWFnZS94LXdpbi1iaXRtYXAgdGV4dC9jc3MgdGV4dC9qYXZhc2NyaXB0IHRleHQvcGxhaW4gdGV4dC94bWwiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkxpc3Qgb2YgTUlNRSB0eXBlcyB0aGF0IHdpbGwgYmUgY29tcHJlc3NlZCB3aXRoIGJyb3RsaS4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTIifSwgIkJST1RMSV9NSU5fTEVOR1RIIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIjEwMDAiLCAiaGVscCI6ICJNaW5pbXVtIGxlbmd0aCBmb3IgYnJvdGxpIGNvbXByZXNzaW9uLiIsICJpZCI6ICJicm90bGktbWluLWxlbmd0aCIsICJsYWJlbCI6ICJNaW5pbXVtIGxlbmd0aCIsICJyZWdleCI6ICJeXFxkKyIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeXFxkKyIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiMTAwMCIsICJuYW1lIjogIk1pbmltdW0gbGVuZ3RoIiwgInByZXZfdmFsdWUiOiAiMTAwMCIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTWluaW11bSBsZW5ndGggZm9yIGJyb3RsaSBjb21wcmVzc2lvbi4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTEifSwgIkJST1RMSV9DT01QX0xFVkVMIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIjYiLCAiaGVscCI6ICJUaGUgY29tcHJlc3Npb24gbGV2ZWwgb2YgdGhlIGJyb3RsaSBhbGdvcml0aG0uIiwgImlkIjogImJyb3RsaS1jb21wLWxldmVsIiwgImxhYmVsIjogIkNvbXByZXNzaW9uIGxldmVsIiwgInJlZ2V4IjogIl4oWzAyLTldfDFbMDFdPykkIiwgInR5cGUiOiAic2VsZWN0IiwgInBhdHRlcm4iOiAiXihbMDItOV18MVswMV0/KSQiLCAiaW5wVHlwZSI6ICJzZWxlY3QiLCAidmFsdWVzIjogWyIwIiwgIjEiLCAiMTAiLCAiMTEiLCAiMiIsICIzIiwgIjQiLCAiNSIsICI2IiwgIjciLCAiOCIsICI5Il0sICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjYiLCAibmFtZSI6ICJDb21wcmVzc2lvbiBsZXZlbCIsICJwcmV2X3ZhbHVlIjogIjYiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlRoZSBjb21wcmVzc2lvbiBsZXZlbCBvZiB0aGUgYnJvdGxpIGFsZ29yaXRobS4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTAifX0sICJjaGVja3N1bSI6IG51bGx9LCB7ImlkIjogImJ1bmtlcm5ldCIsICJzdHJlYW0iOiAieWVzIiwgIm5hbWUiOiAiQnVua2VyTmV0IiwgImRlc2NyaXB0aW9uIjogIlNoYXJlIHRocmVhdCBkYXRhIHdpdGggb3RoZXIgQnVua2VyV2ViIGluc3RhbmNlcyB2aWEgQnVua2VyTmV0LiIsICJ2ZXJzaW9uIjogIjEuMCIsICJ0eXBlIjogImNvcmUiLCAibWV0aG9kIjogIm1hbnVhbCIsICJwYWdlIjogdHJ1ZSwgInNldHRpbmdzIjogeyJVU0VfQlVOS0VSTkVUIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogInllcyIsICJoZWxwIjogIkFjdGl2YXRlIEJ1bmtlck5ldCBmZWF0dXJlLiIsICJpZCI6ICJ1c2UtYnVua2VybmV0IiwgImxhYmVsIjogIkFjdGl2YXRlIEJ1bmtlck5ldCIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogdHJ1ZSwgInZhbHVlIjogIm5vIiwgIm5hbWUiOiAiQWN0aXZhdGUgQnVua2VyTmV0IiwgInByZXZfdmFsdWUiOiAieWVzIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAidHJlc3Bhc3MiLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tZXRob2RfZGlzYWJsZWQifSwgeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkFjdGl2YXRlIEJ1bmtlck5ldCBmZWF0dXJlLiJ9XSwgIm1ldGhvZCI6ICJzY2hlZHVsZXIiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0wIn19LCAiY2hlY2tzdW0iOiBudWxsfSwgeyJpZCI6ICJjb3JzIiwgInN0cmVhbSI6ICJubyIsICJuYW1lIjogIkNPUlMiLCAiZGVzY3JpcHRpb24iOiAiQ3Jvc3MtT3JpZ2luIFJlc291cmNlIFNoYXJpbmcuIiwgInZlcnNpb24iOiAiMS4wIiwgInR5cGUiOiAiY29yZSIsICJtZXRob2QiOiAibWFudWFsIiwgInBhZ2UiOiB0cnVlLCAic2V0dGluZ3MiOiB7IlVTRV9DT1JTIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIm5vIiwgImhlbHAiOiAiVXNlIENPUlMiLCAiaWQiOiAidXNlLWNvcnMiLCAibGFiZWwiOiAiVXNlIENPUlMiLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAibm8iLCAibmFtZSI6ICJVc2UgQ09SUyIsICJwcmV2X3ZhbHVlIjogIm5vIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJVc2UgQ09SUyJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMTAifSwgIkNPUlNfQUxMT1dfT1JJR0lOIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIioiLCAiaGVscCI6ICJBbGxvd2VkIG9yaWdpbnMgdG8gbWFrZSBDT1JTIHJlcXVlc3RzIDogUENSRSByZWdleCBvciAqLiIsICJpZCI6ICJjb3JzLWFsbG93LW9yaWdpbiIsICJsYWJlbCI6ICJBbGxvd2VkIG9yaWdpbnMiLCAicmVnZXgiOiAiXi4qJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeLiokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJzZWxmIiwgIm5hbWUiOiAiQWxsb3dlZCBvcmlnaW5zIiwgInByZXZfdmFsdWUiOiAiKiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiQWxsb3dlZCBvcmlnaW5zIHRvIG1ha2UgQ09SUyByZXF1ZXN0cyA6IFBDUkUgcmVnZXggb3IgKi4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTkifSwgIkNPUlNfQUxMT1dfTUVUSE9EUyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJHRVQsIFBPU1QsIE9QVElPTlMiLCAiaGVscCI6ICJWYWx1ZSBvZiB0aGUgQWNjZXNzLUNvbnRyb2wtQWxsb3ctTWV0aG9kcyBoZWFkZXIuIiwgImlkIjogImNvcnMtYWxsb3ctbWV0aG9kcyIsICJsYWJlbCI6ICJBY2Nlc3MtQ29udHJvbC1BbGxvdy1NZXRob2RzIHZhbHVlIiwgInJlZ2V4IjogIl4oXFwqfCg/IVssIF0pKCw/ID8oR0VUfEhFQUR8UE9TVHxQVVR8REVMRVRFfENPTk5FQ1R8T1BUSU9OU3xUUkFDRXxQQVRDSCkoPyEuKlxcMykpKik/JCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeKFxcKnwoPyFbLCBdKSgsPyA/KEdFVHxIRUFEfFBPU1R8UFVUfERFTEVURXxDT05ORUNUfE9QVElPTlN8VFJBQ0V8UEFUQ0gpKD8hLipcXDMpKSopPyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIkdFVCwgUE9TVCwgT1BUSU9OUyIsICJuYW1lIjogIkFjY2Vzcy1Db250cm9sLUFsbG93LU1ldGhvZHMgdmFsdWUiLCAicHJldl92YWx1ZSI6ICJHRVQsIFBPU1QsIE9QVElPTlMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlZhbHVlIG9mIHRoZSBBY2Nlc3MtQ29udHJvbC1BbGxvdy1NZXRob2RzIGhlYWRlci4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTgifSwgIkNPUlNfQUxMT1dfSEVBREVSUyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJETlQsVXNlci1BZ2VudCxYLVJlcXVlc3RlZC1XaXRoLElmLU1vZGlmaWVkLVNpbmNlLENhY2hlLUNvbnRyb2wsQ29udGVudC1UeXBlLFJhbmdlIiwgImhlbHAiOiAiVmFsdWUgb2YgdGhlIEFjY2Vzcy1Db250cm9sLUFsbG93LUhlYWRlcnMgaGVhZGVyLiIsICJpZCI6ICJjb3JzLWFsbG93LWhlYWRlcnMiLCAibGFiZWwiOiAiQWNjZXNzLUNvbnRyb2wtQWxsb3ctSGVhZGVycyB2YWx1ZSIsICJyZWdleCI6ICJeKFxcKnwoPyFbLCBdKSgsPyA/KFtcXHdcXC1dKykoPyEuKlxcMyg/IS4pKSkqKT8kIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4oXFwqfCg/IVssIF0pKCw/ID8oW1xcd1xcLV0rKSg/IS4qXFwzKD8hLikpKSopPyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIkROVCxVc2VyLUFnZW50LFgtUmVxdWVzdGVkLVdpdGgsSWYtTW9kaWZpZWQtU2luY2UsQ2FjaGUtQ29udHJvbCxDb250ZW50LVR5cGUsUmFuZ2UiLCAibmFtZSI6ICJBY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzIHZhbHVlIiwgInByZXZfdmFsdWUiOiAiRE5ULFVzZXItQWdlbnQsWC1SZXF1ZXN0ZWQtV2l0aCxJZi1Nb2RpZmllZC1TaW5jZSxDYWNoZS1Db250cm9sLENvbnRlbnQtVHlwZSxSYW5nZSIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVmFsdWUgb2YgdGhlIEFjY2Vzcy1Db250cm9sLUFsbG93LUhlYWRlcnMgaGVhZGVyLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotNyJ9LCAiQ09SU19BTExPV19DUkVERU5USUFMUyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJubyIsICJoZWxwIjogIlNlbmQgdGhlIEFjY2Vzcy1Db250cm9sLUFsbG93LUNyZWRlbnRpYWxzIGhlYWRlci4iLCAiaWQiOiAiY29ycy1hbGxvdy1jcmVkZW50aWFscyIsICJsYWJlbCI6ICJTZW5kIEFjY2Vzcy1Db250cm9sLUFsbG93LUNyZWRlbnRpYWxzIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIm5vIiwgIm5hbWUiOiAiU2VuZCBBY2Nlc3MtQ29udHJvbC1BbGxvdy1DcmVkZW50aWFscyIsICJwcmV2X3ZhbHVlIjogIm5vIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJTZW5kIHRoZSBBY2Nlc3MtQ29udHJvbC1BbGxvdy1DcmVkZW50aWFscyBoZWFkZXIuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei02In0sICJDT1JTX0VYUE9TRV9IRUFERVJTIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIkNvbnRlbnQtTGVuZ3RoLENvbnRlbnQtUmFuZ2UiLCAiaGVscCI6ICJWYWx1ZSBvZiB0aGUgQWNjZXNzLUNvbnRyb2wtRXhwb3NlLUhlYWRlcnMgaGVhZGVyLiIsICJpZCI6ICJjb3JzLWV4cG9zZS1oZWFkZXJzIiwgImxhYmVsIjogIkFjY2Vzcy1Db250cm9sLUV4cG9zZS1IZWFkZXJzIHZhbHVlIiwgInJlZ2V4IjogIl4oXFwqfCg/IVssIF0rKSgsPyA/KFtcXHdcXC1dKykoPyEuKlxcMyg/IS4pKSkqKT8kIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4oXFwqfCg/IVssIF0rKSgsPyA/KFtcXHdcXC1dKykoPyEuKlxcMyg/IS4pKSkqKT8kIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJDb250ZW50LUxlbmd0aCxDb250ZW50LVJhbmdlIiwgIm5hbWUiOiAiQWNjZXNzLUNvbnRyb2wtRXhwb3NlLUhlYWRlcnMgdmFsdWUiLCAicHJldl92YWx1ZSI6ICJDb250ZW50LUxlbmd0aCxDb250ZW50LVJhbmdlIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJWYWx1ZSBvZiB0aGUgQWNjZXNzLUNvbnRyb2wtRXhwb3NlLUhlYWRlcnMgaGVhZGVyLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotNSJ9LCAiQ1JPU1NfT1JJR0lOX09QRU5FUl9QT0xJQ1kiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiVmFsdWUgZm9yIHRoZSBDcm9zcy1PcmlnaW4tT3BlbmVyLVBvbGljeSBoZWFkZXIuIiwgImlkIjogImNyb3NzLW9yaWdpbi1vcGVuZXItcG9saWN5IiwgImxhYmVsIjogIkNyb3NzLU9yaWdpbi1PcGVuZXItUG9saWN5IiwgInJlZ2V4IjogIl4odW5zYWZlLW5vbmV8c2FtZS1vcmlnaW4tYWxsb3ctcG9wdXBzfHNhbWUtb3JpZ2luKT8kIiwgInR5cGUiOiAic2VsZWN0IiwgInBhdHRlcm4iOiAiXih1bnNhZmUtbm9uZXxzYW1lLW9yaWdpbi1hbGxvdy1wb3B1cHN8c2FtZS1vcmlnaW4pPyQiLCAiaW5wVHlwZSI6ICJzZWxlY3QiLCAidmFsdWVzIjogWyIiLCAic2FtZS1vcmlnaW4iLCAic2FtZS1vcmlnaW4tYWxsb3ctcG9wdXBzIiwgInVuc2FmZS1ub25lIl0sICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogInNhbWUtb3JpZ2luIiwgIm5hbWUiOiAiQ3Jvc3MtT3JpZ2luLU9wZW5lci1Qb2xpY3kiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlZhbHVlIGZvciB0aGUgQ3Jvc3MtT3JpZ2luLU9wZW5lci1Qb2xpY3kgaGVhZGVyLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotNCJ9LCAiQ1JPU1NfT1JJR0lOX0VNQkVEREVSX1BPTElDWSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJWYWx1ZSBmb3IgdGhlIENyb3NzLU9yaWdpbi1FbWJlZGRlci1Qb2xpY3kgaGVhZGVyLiIsICJpZCI6ICJjcm9zcy1vcmlnaW4tZW1iZWRkZXItcG9saWN5IiwgImxhYmVsIjogIkNyb3NzLU9yaWdpbi1FbWJlZGRlci1Qb2xpY3kiLCAicmVnZXgiOiAiXih1bnNhZmUtbm9uZXxyZXF1aXJlLWNvcnB8Y3JlZGVudGlhbGxlc3MpPyQiLCAidHlwZSI6ICJzZWxlY3QiLCAicGF0dGVybiI6ICJeKHVuc2FmZS1ub25lfHJlcXVpcmUtY29ycHxjcmVkZW50aWFsbGVzcyk/JCIsICJpbnBUeXBlIjogInNlbGVjdCIsICJ2YWx1ZXMiOiBbIiIsICJjcmVkZW50aWFsbGVzcyIsICJyZXF1aXJlLWNvcnAiLCAidW5zYWZlLW5vbmUiXSwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAicmVxdWlyZS1jb3JwIiwgIm5hbWUiOiAiQ3Jvc3MtT3JpZ2luLUVtYmVkZGVyLVBvbGljeSIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVmFsdWUgZm9yIHRoZSBDcm9zcy1PcmlnaW4tRW1iZWRkZXItUG9saWN5IGhlYWRlci4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTMifSwgIkNST1NTX09SSUdJTl9SRVNPVVJDRV9QT0xJQ1kiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiVmFsdWUgZm9yIHRoZSBDcm9zcy1PcmlnaW4tUmVzb3VyY2UtUG9saWN5IGhlYWRlci4iLCAiaWQiOiAiY3Jvc3Mtb3JpZ2luLXJlc291cmNlLXBvbGljeSIsICJsYWJlbCI6ICJDcm9zcy1PcmlnaW4tUmVzb3VyY2UtUG9saWN5IiwgInJlZ2V4IjogIl4oc2FtZS1zaXRlfHNhbWUtb3JpZ2lufGNyb3NzLW9yaWdpbik/JCIsICJ0eXBlIjogInNlbGVjdCIsICJwYXR0ZXJuIjogIl4oc2FtZS1zaXRlfHNhbWUtb3JpZ2lufGNyb3NzLW9yaWdpbik/JCIsICJpbnBUeXBlIjogInNlbGVjdCIsICJ2YWx1ZXMiOiBbIiIsICJjcm9zcy1vcmlnaW4iLCAic2FtZS1vcmlnaW4iLCAic2FtZS1zaXRlIl0sICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogInNhbWUtc2l0ZSIsICJuYW1lIjogIkNyb3NzLU9yaWdpbi1SZXNvdXJjZS1Qb2xpY3kiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlZhbHVlIGZvciB0aGUgQ3Jvc3MtT3JpZ2luLVJlc291cmNlLVBvbGljeSBoZWFkZXIuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yIn0sICJDT1JTX01BWF9BR0UiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiODY0MDAiLCAiaGVscCI6ICJWYWx1ZSBvZiB0aGUgQWNjZXNzLUNvbnRyb2wtTWF4LUFnZSBoZWFkZXIuIiwgImlkIjogImNvcnMtbWF4LWFnZSIsICJsYWJlbCI6ICJBY2Nlc3MtQ29udHJvbC1NYXgtQWdlIHZhbHVlIiwgInJlZ2V4IjogIl5cXGQrJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeXFxkKyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjg2NDAwIiwgIm5hbWUiOiAiQWNjZXNzLUNvbnRyb2wtTWF4LUFnZSB2YWx1ZSIsICJwcmV2X3ZhbHVlIjogIjg2NDAwIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJWYWx1ZSBvZiB0aGUgQWNjZXNzLUNvbnRyb2wtTWF4LUFnZSBoZWFkZXIuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xIn0sICJDT1JTX0RFTllfUkVRVUVTVCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJ5ZXMiLCAiaGVscCI6ICJEZW55IHJlcXVlc3QgYW5kIGRvbid0IHNlbmQgaXQgdG8gYmFja2VuZCBpZiBPcmlnaW4gaXMgbm90IGFsbG93ZWQuIiwgImlkIjogImNvcnMtZGVueS1yZXF1ZXN0IiwgImxhYmVsIjogIkRlbnkgcmVxdWVzdCIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJ5ZXMiLCAibmFtZSI6ICJEZW55IHJlcXVlc3QiLCAicHJldl92YWx1ZSI6ICJ5ZXMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkRlbnkgcmVxdWVzdCBhbmQgZG9uJ3Qgc2VuZCBpdCB0byBiYWNrZW5kIGlmIE9yaWdpbiBpcyBub3QgYWxsb3dlZC4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTAifX0sICJjaGVja3N1bSI6IG51bGx9LCB7ImlkIjogImNsaWVudGNhY2hlIiwgInN0cmVhbSI6ICJubyIsICJuYW1lIjogIkNsaWVudCBjYWNoZSIsICJkZXNjcmlwdGlvbiI6ICJNYW5hZ2UgY2FjaGluZyBmb3IgY2xpZW50cy4iLCAidmVyc2lvbiI6ICIxLjAiLCAidHlwZSI6ICJjb3JlIiwgIm1ldGhvZCI6ICJtYW51YWwiLCAicGFnZSI6IGZhbHNlLCAic2V0dGluZ3MiOiB7IlVTRV9DTElFTlRfQ0FDSEUiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAibm8iLCAiaGVscCI6ICJUZWxsIGNsaWVudCB0byBzdG9yZSBsb2NhbGx5IHN0YXRpYyBmaWxlcy4iLCAiaWQiOiAidXNlLWNsaWVudC1jYWNoZSIsICJsYWJlbCI6ICJVc2UgY2xpZW50IGNhY2hlIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiB0cnVlLCAidmFsdWUiOiAieWVzIiwgIm5hbWUiOiAiVXNlIGNsaWVudCBjYWNoZSIsICJwcmV2X3ZhbHVlIjogIm5vIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAidHJlc3Bhc3MiLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tZXRob2RfZGlzYWJsZWQifSwgeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlRlbGwgY2xpZW50IHRvIHN0b3JlIGxvY2FsbHkgc3RhdGljIGZpbGVzLiJ9XSwgIm1ldGhvZCI6ICJzY2hlZHVsZXIiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yIn0sICJDTElFTlRfQ0FDSEVfRVRBRyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJ5ZXMiLCAiaGVscCI6ICJTZW5kIHRoZSBIVFRQIEVUYWcgaGVhZGVyIGZvciBzdGF0aWMgcmVzb3VyY2VzLiIsICJpZCI6ICJjbGllbnQtY2FjaGUtZXRhZyIsICJsYWJlbCI6ICJFVGFnIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogInllcyIsICJuYW1lIjogIkVUYWciLCAicHJldl92YWx1ZSI6ICJ5ZXMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlNlbmQgdGhlIEhUVFAgRVRhZyBoZWFkZXIgZm9yIHN0YXRpYyByZXNvdXJjZXMuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xIn0sICJDTElFTlRfQ0FDSEVfQ09OVFJPTCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJwdWJsaWMsIG1heC1hZ2U9MTU1NTIwMDAiLCAiaGVscCI6ICJWYWx1ZSBvZiB0aGUgQ2FjaGUtQ29udHJvbCBIVFRQIGhlYWRlci4iLCAiaWQiOiAiY2xpZW50LWNhY2hlLWNvbnRyb2wiLCAibGFiZWwiOiAiQ2FjaGUtQ29udHJvbCBoZWFkZXIiLCAicmVnZXgiOiAiXig/ISgsID98ICkpKCgsICk/KCgobWF4LWFnZXxzLW1heGFnZXxzdGFsZS13aGlsZS1yZXZhbGlkYXRlfHN0YWxlLWlmLWVycm9yKT1cXGQrKD8hLipcXDYpKXwoKD8hLipwdWJsaWMpcHJpdmF0ZXwoPyEuKnByaXZhdGUpcHVibGljKXwobXVzdHxwcm94eSktcmV2YWxpZGF0ZXxtdXN0LXVuZGVyc3RhbmR8aW1tdXRhYmxlfG5vLShjYWNoZXxzdG9yZXx0cmFuc2Zvcm0pKSg/IS4qXFw0KSkrJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeKD8hKCwgP3wgKSkoKCwgKT8oKChtYXgtYWdlfHMtbWF4YWdlfHN0YWxlLXdoaWxlLXJldmFsaWRhdGV8c3RhbGUtaWYtZXJyb3IpPVxcZCsoPyEuKlxcNikpfCgoPyEuKnB1YmxpYylwcml2YXRlfCg/IS4qcHJpdmF0ZSlwdWJsaWMpfChtdXN0fHByb3h5KS1yZXZhbGlkYXRlfG11c3QtdW5kZXJzdGFuZHxpbW11dGFibGV8bm8tKGNhY2hlfHN0b3JlfHRyYW5zZm9ybSkpKD8hLipcXDQpKSskIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJwdWJsaWMsIG1heC1hZ2U9MTU1NTIwMDAiLCAibmFtZSI6ICJDYWNoZS1Db250cm9sIGhlYWRlciIsICJwcmV2X3ZhbHVlIjogInB1YmxpYywgbWF4LWFnZT0xNTU1MjAwMCIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVmFsdWUgb2YgdGhlIENhY2hlLUNvbnRyb2wgSFRUUCBoZWFkZXIuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0wIn19LCAiY2hlY2tzdW0iOiBudWxsfSwgeyJpZCI6ICJjb3VudHJ5IiwgInN0cmVhbSI6ICJ5ZXMiLCAibmFtZSI6ICJDb3VudHJ5IiwgImRlc2NyaXB0aW9uIjogIkRlbnkgYWNjZXNzIGJhc2VkIG9uIHRoZSBjb3VudHJ5IG9mIHRoZSBjbGllbnQgSVAuIiwgInZlcnNpb24iOiAiMS4wIiwgInR5cGUiOiAiY29yZSIsICJtZXRob2QiOiAibWFudWFsIiwgInBhZ2UiOiB0cnVlLCAic2V0dGluZ3MiOiB7IkJMQUNLTElTVF9DT1VOVFJZIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkRlbnkgYWNjZXNzIGlmIHRoZSBjb3VudHJ5IG9mIHRoZSBjbGllbnQgaXMgaW4gdGhlIGxpc3QgKElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtYXQgc2VwYXJhdGVkIHdpdGggc3BhY2VzKS4iLCAiaWQiOiAiY291bnRyeS1ibGFja2xpc3QiLCAibGFiZWwiOiAiQ291bnRyeSBibGFja2xpc3QiLCAicmVnZXgiOiAiXig/ISApKCAqKFtBLVpdezJ9KSg/IS4qXFwyKSAqKSokIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4oPyEgKSggKihbQS1aXXsyfSkoPyEuKlxcMikgKikqJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm5hbWUiOiAiQ291bnRyeSBibGFja2xpc3QiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkRlbnkgYWNjZXNzIGlmIHRoZSBjb3VudHJ5IG9mIHRoZSBjbGllbnQgaXMgaW4gdGhlIGxpc3QgKElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtYXQgc2VwYXJhdGVkIHdpdGggc3BhY2VzKS4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTEifSwgIldISVRFTElTVF9DT1VOVFJZIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkRlbnkgYWNjZXNzIGlmIHRoZSBjb3VudHJ5IG9mIHRoZSBjbGllbnQgaXMgbm90IGluIHRoZSBsaXN0IChJU08gMzE2Ni0xIGFscGhhLTIgZm9ybWF0IHNlcGFyYXRlZCB3aXRoIHNwYWNlcykuIiwgImlkIjogImNvdW50cnktd2hpdGVsaXN0IiwgImxhYmVsIjogIkNvdW50cnkgd2hpdGVsaXN0IiwgInJlZ2V4IjogIl4oPyEgKSggKihbQS1aXXsyfSkoPyEuKlxcMikgKikqJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeKD8hICkoICooW0EtWl17Mn0pKD8hLipcXDIpICopKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJuYW1lIjogIkNvdW50cnkgd2hpdGVsaXN0IiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJEZW55IGFjY2VzcyBpZiB0aGUgY291bnRyeSBvZiB0aGUgY2xpZW50IGlzIG5vdCBpbiB0aGUgbGlzdCAoSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm1hdCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMpLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMCJ9fSwgImNoZWNrc3VtIjogbnVsbH0sIHsiaWQiOiAiY3VzdG9tY2VydCIsICJzdHJlYW0iOiAieWVzIiwgIm5hbWUiOiAiQ3VzdG9tIEhUVFBTIGNlcnRpZmljYXRlIiwgImRlc2NyaXB0aW9uIjogIkNob29zZSBjdXN0b20gY2VydGlmaWNhdGUgZm9yIEhUVFBTLiIsICJ2ZXJzaW9uIjogIjEuMCIsICJ0eXBlIjogImNvcmUiLCAibWV0aG9kIjogIm1hbnVhbCIsICJwYWdlIjogZmFsc2UsICJzZXR0aW5ncyI6IHsiVVNFX0NVU1RPTV9TU0wiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAibm8iLCAiaGVscCI6ICJVc2UgY3VzdG9tIEhUVFBTIGNlcnRpZmljYXRlLiIsICJpZCI6ICJ1c2UtY3VzdG9tLWh0dHBzIiwgImxhYmVsIjogIlVzZSBjdXN0b20gY2VydGlmaWNhdGUiLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAibm8iLCAibmFtZSI6ICJVc2UgY3VzdG9tIGNlcnRpZmljYXRlIiwgInByZXZfdmFsdWUiOiAibm8iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlVzZSBjdXN0b20gSFRUUFMgY2VydGlmaWNhdGUuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei00In0sICJDVVNUT01fU1NMX0NFUlQiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiRnVsbCBwYXRoIG9mIHRoZSBjZXJ0aWZpY2F0ZSBvciBidW5kbGUgZmlsZSAobXVzdCBiZSByZWFkYWJsZSBieSB0aGUgc2NoZWR1bGVyKS4iLCAiaWQiOiAiY3VzdG9tLWh0dHBzLWNlcnQiLCAibGFiZWwiOiAiQ2VydGlmaWNhdGUgcGF0aCIsICJyZWdleCI6ICJeKC9bXFx3LiBcXC1dKykqLz8kIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4oL1tcXHcuIFxcLV0rKSovPyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJuYW1lIjogIkNlcnRpZmljYXRlIHBhdGgiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkZ1bGwgcGF0aCBvZiB0aGUgY2VydGlmaWNhdGUgb3IgYnVuZGxlIGZpbGUgKG11c3QgYmUgcmVhZGFibGUgYnkgdGhlIHNjaGVkdWxlcikuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0zIn0sICJDVVNUT01fU1NMX0tFWSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJGdWxsIHBhdGggb2YgdGhlIGtleSBmaWxlIChtdXN0IGJlIHJlYWRhYmxlIGJ5IHRoZSBzY2hlZHVsZXIpLiIsICJpZCI6ICJjdXN0b20taHR0cHMta2V5IiwgImxhYmVsIjogIktleSBwYXRoIiwgInJlZ2V4IjogIl4oL1tcXHcuIFxcLV0rKSovPyQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXigvW1xcdy4gXFwtXSspKi8/JCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm5hbWUiOiAiS2V5IHBhdGgiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkZ1bGwgcGF0aCBvZiB0aGUga2V5IGZpbGUgKG11c3QgYmUgcmVhZGFibGUgYnkgdGhlIHNjaGVkdWxlcikuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yIn0sICJDVVNUT01fU1NMX0NFUlRfREFUQSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJDZXJ0aWZpY2F0ZSBkYXRhIGVuY29kZWQgaW4gYmFzZTY0LiIsICJpZCI6ICJjdXN0b20taHR0cHMtY2VydC1kYXRhIiwgImxhYmVsIjogIkNlcnRpZmljYXRlIGRhdGEgKGJhc2U2NCkiLCAicmVnZXgiOiAiXi4qJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeLiokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibmFtZSI6ICJDZXJ0aWZpY2F0ZSBkYXRhIChiYXNlNjQpIiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJDZXJ0aWZpY2F0ZSBkYXRhIGVuY29kZWQgaW4gYmFzZTY0LiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMSJ9LCAiQ1VTVE9NX1NTTF9LRVlfREFUQSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJLZXkgZGF0YSBlbmNvZGVkIGluIGJhc2U2NC4iLCAiaWQiOiAiY3VzdG9tLWh0dHBzLWtleS1kYXRhIiwgImxhYmVsIjogIktleSBkYXRhIChiYXNlNjQpIiwgInJlZ2V4IjogIl4uKiQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXi4qJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm5hbWUiOiAiS2V5IGRhdGEgKGJhc2U2NCkiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIktleSBkYXRhIGVuY29kZWQgaW4gYmFzZTY0LiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMCJ9fSwgImNoZWNrc3VtIjogbnVsbH0sIHsiaWQiOiAiZG5zYmwiLCAic3RyZWFtIjogInllcyIsICJuYW1lIjogIkROU0JMIiwgImRlc2NyaXB0aW9uIjogIkRlbnkgYWNjZXNzIGJhc2VkIG9uIGV4dGVybmFsIEROU0JMIHNlcnZlcnMuIiwgInZlcnNpb24iOiAiMS4wIiwgInR5cGUiOiAiY29yZSIsICJtZXRob2QiOiAibWFudWFsIiwgInBhZ2UiOiB0cnVlLCAic2V0dGluZ3MiOiB7IlVTRV9ETlNCTCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJ5ZXMiLCAiaGVscCI6ICJBY3RpdmF0ZSBETlNCTCBmZWF0dXJlLiIsICJpZCI6ICJ1c2UtZG5zYmwiLCAibGFiZWwiOiAiQWN0aXZhdGUgRE5TQkwiLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAieWVzIiwgIm5hbWUiOiAiQWN0aXZhdGUgRE5TQkwiLCAicHJldl92YWx1ZSI6ICJ5ZXMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkFjdGl2YXRlIEROU0JMIGZlYXR1cmUuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0wIn19LCAiY2hlY2tzdW0iOiBudWxsfSwgeyJpZCI6ICJlcnJvcnMiLCAic3RyZWFtIjogIm5vIiwgIm5hbWUiOiAiRXJyb3JzIiwgImRlc2NyaXB0aW9uIjogIk1hbmFnZSBkZWZhdWx0IGVycm9yIHBhZ2VzIiwgInZlcnNpb24iOiAiMS4wIiwgInR5cGUiOiAiY29yZSIsICJtZXRob2QiOiAibWFudWFsIiwgInBhZ2UiOiB0cnVlLCAic2V0dGluZ3MiOiB7IkVSUk9SUyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJMaXN0IG9mIEhUVFAgZXJyb3IgY29kZSBhbmQgY29ycmVzcG9uZGluZyBlcnJvciBwYWdlcywgc2VwYXJhdGVkIHdpdGggc3BhY2VzICg0MDQ9L215NDA0Lmh0bWwgNDAzPS9lcnJvcnMvNDAzLmh0bWwgLi4uKS4iLCAiaWQiOiAiZXJyb3JzIiwgImxhYmVsIjogIkVycm9ycyIsICJyZWdleCI6ICJeKD8hICkoID8oWzEtNV1cXGR7Mn0pKD8hLipcXDIoPyFbXj1dKSk9KFxcL1tcXHdcXF0ufjpcXC8/I1xcW0AhJFxcJidcXChcXCkqKyw7PVxcLV0qKSg/IS4qXFwzKD8hLikpKSokIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4oPyEgKSggPyhbMS01XVxcZHsyfSkoPyEuKlxcMig/IVtePV0pKT0oXFwvW1xcd1xcXS5+OlxcLz8jXFxbQCEkXFwmJ1xcKFxcKSorLDs9XFwtXSopKD8hLipcXDMoPyEuKSkpKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJuYW1lIjogIkVycm9ycyIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBIVFRQIGVycm9yIGNvZGUgYW5kIGNvcnJlc3BvbmRpbmcgZXJyb3IgcGFnZXMsIHNlcGFyYXRlZCB3aXRoIHNwYWNlcyAoNDA0PS9teTQwNC5odG1sIDQwMz0vZXJyb3JzLzQwMy5odG1sIC4uLikuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xIn0sICJJTlRFUkNFUFRFRF9FUlJPUl9DT0RFUyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICI0MDAgNDAxIDQwMyA0MDQgNDA1IDQxMyA0MjkgNTAwIDUwMSA1MDIgNTAzIDUwNCIsICJoZWxwIjogIkxpc3Qgb2YgSFRUUCBlcnJvciBjb2RlIGludGVyY2VwdGVkIGJ5IEJ1bmtlcldlYiIsICJpZCI6ICJpbnRlcmNlcHRlZC1lcnJvci1jb2RlcyIsICJsYWJlbCI6ICJJbnRlcmNlcHRlZCBlcnJvciBjb2RlcyIsICJyZWdleCI6ICJeKCAqKFsxLTVdXFxkezJ9KSg/IS4qXFwyKSAqKSskIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4oICooWzEtNV1cXGR7Mn0pKD8hLipcXDIpICopKyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjQwMCA0MDEgNDAzIDQwNCA0MDUgNDEzIDQyOSA1MDAgNTAxIDUwMiA1MDMgNTA0IiwgIm5hbWUiOiAiSW50ZXJjZXB0ZWQgZXJyb3IgY29kZXMiLCAicHJldl92YWx1ZSI6ICI0MDAgNDAxIDQwMyA0MDQgNDA1IDQxMyA0MjkgNTAwIDUwMSA1MDIgNTAzIDUwNCIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBIVFRQIGVycm9yIGNvZGUgaW50ZXJjZXB0ZWQgYnkgQnVua2VyV2ViIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0wIn19LCAiY2hlY2tzdW0iOiBudWxsfSwgeyJpZCI6ICJncmV5bGlzdCIsICJzdHJlYW0iOiAicGFydGlhbCIsICJuYW1lIjogIkdyZXlsaXN0IiwgImRlc2NyaXB0aW9uIjogIkFsbG93IGFjY2VzcyB3aGlsZSBrZWVwaW5nIHNlY3VyaXR5IGZlYXR1cmVzIGJhc2VkIG9uIGludGVybmFsIGFuZCBleHRlcm5hbCBJUC9uZXR3b3JrL3JETlMvQVNOIGdyZXlsaXN0cy4iLCAidmVyc2lvbiI6ICIxLjAiLCAidHlwZSI6ICJjb3JlIiwgIm1ldGhvZCI6ICJtYW51YWwiLCAicGFnZSI6IHRydWUsICJzZXR0aW5ncyI6IHsiVVNFX0dSRVlMSVNUIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIm5vIiwgImhlbHAiOiAiQWN0aXZhdGUgZ3JleWxpc3QgZmVhdHVyZS4iLCAiaWQiOiAidXNlLWdyZXlsaXN0IiwgImxhYmVsIjogIkFjdGl2YXRlIGdyZXlsaXN0aW5nIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIm5vIiwgIm5hbWUiOiAiQWN0aXZhdGUgZ3JleWxpc3RpbmciLCAicHJldl92YWx1ZSI6ICJubyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiQWN0aXZhdGUgZ3JleWxpc3QgZmVhdHVyZS4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTYifSwgIkdSRVlMSVNUX0lQIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkxpc3Qgb2YgSVAvbmV0d29yaywgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCB0byBwdXQgaW50byB0aGUgZ3JleWxpc3QuIiwgImlkIjogImdyZXlsaXN0LWlwIiwgImxhYmVsIjogIkdyZXlsaXN0IElQL25ldHdvcmsiLCAicmVnZXgiOiAiXig/ISApKCAqKCgoXFxiMjVbMC01XXxcXGIyWzAtNF1cXGR8XFxiWzAxXT9cXGRcXGQ/KShcXC4oMjVbMC01XXwyWzAtNF1cXGR8WzAxXT9cXGRcXGQ/KSl7M30pKFxcLyhbMS0yXVswLTldP3wzWzAtMl0/fFswNC05XSkpP3woKFswLTlhLWZBLUZdezEsNH06KXs3fVswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDd9OnwoWzAtOWEtZkEtRl17MSw0fTopezEsNn06WzAtOWEtZkEtRl17MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsNX0oOlswLTlhLWZBLUZdezEsNH0pezEsMn18KFswLTlhLWZBLUZdezEsNH06KXsxLDR9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDN9fChbMC05YS1mQS1GXXsxLDR9Oil7MSwzfSg6WzAtOWEtZkEtRl17MSw0fSl7MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsMn0oOlswLTlhLWZBLUZdezEsNH0pezEsNX18WzAtOWEtZkEtRl17MSw0fTooKDpbMC05YS1mQS1GXXsxLDR9KXsxLDZ9KXw6KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw3fXw6KXxmZTgwOig6WzAtOWEtZkEtRl1aezAsNH0pezAsNH0lWzAtOWEtekEtWl0rfDo6KGZmZmYoOjB7MSw0fSk/Oik/KCgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZClcXC4pezN9KDI1WzAtNV18KDJbMC00XXwxP1xcZCk/XFxkKXwoWzAtOWEtZkEtRl17MSw0fTopezEsNH06KCgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZClcXC4pezN9KDI1WzAtNV18KDJbMC00XXwxP1xcZCk/XFxkKSkoXFwvKDEyWzAtOF18MVswMV1bMC05XXxbMC05XVswLTldPykpPykoPyEuKlxcRFxcMihbXlxcZFxcL118JCkpICopKiQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXig/ISApKCAqKCgoXFxiMjVbMC01XXxcXGIyWzAtNF1cXGR8XFxiWzAxXT9cXGRcXGQ/KShcXC4oMjVbMC01XXwyWzAtNF1cXGR8WzAxXT9cXGRcXGQ/KSl7M30pKFxcLyhbMS0yXVswLTldP3wzWzAtMl0/fFswNC05XSkpP3woKFswLTlhLWZBLUZdezEsNH06KXs3fVswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDd9OnwoWzAtOWEtZkEtRl17MSw0fTopezEsNn06WzAtOWEtZkEtRl17MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsNX0oOlswLTlhLWZBLUZdezEsNH0pezEsMn18KFswLTlhLWZBLUZdezEsNH06KXsxLDR9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDN9fChbMC05YS1mQS1GXXsxLDR9Oil7MSwzfSg6WzAtOWEtZkEtRl17MSw0fSl7MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsMn0oOlswLTlhLWZBLUZdezEsNH0pezEsNX18WzAtOWEtZkEtRl17MSw0fTooKDpbMC05YS1mQS1GXXsxLDR9KXsxLDZ9KXw6KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw3fXw6KXxmZTgwOig6WzAtOWEtZkEtRl1aezAsNH0pezAsNH0lWzAtOWEtekEtWl0rfDo6KGZmZmYoOjB7MSw0fSk/Oik/KCgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZClcXC4pezN9KDI1WzAtNV18KDJbMC00XXwxP1xcZCk/XFxkKXwoWzAtOWEtZkEtRl17MSw0fTopezEsNH06KCgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZClcXC4pezN9KDI1WzAtNV18KDJbMC00XXwxP1xcZCk/XFxkKSkoXFwvKDEyWzAtOF18MVswMV1bMC05XXxbMC05XVswLTldPykpPykoPyEuKlxcRFxcMihbXlxcZFxcL118JCkpICopKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJuYW1lIjogIkdyZXlsaXN0IElQL25ldHdvcmsiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkxpc3Qgb2YgSVAvbmV0d29yaywgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCB0byBwdXQgaW50byB0aGUgZ3JleWxpc3QuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei01In0sICJHUkVZTElTVF9SRE5TIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkxpc3Qgb2YgcmV2ZXJzZSBETlMgc3VmZml4ZXMsIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgdG8gcHV0IGludG8gdGhlIGdyZXlsaXN0LiIsICJpZCI6ICJncmV5bGlzdC1yZG5zIiwgImxhYmVsIjogIkdyZXlsaXN0IHJldmVyc2UgRE5TIiwgInJlZ2V4IjogIl4oICooKFteIF0rKSg/IS4qXFwzKCB8JCkpKSAqKSokIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4oICooKFteIF0rKSg/IS4qXFwzKCB8JCkpKSAqKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibmFtZSI6ICJHcmV5bGlzdCByZXZlcnNlIEROUyIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiByZXZlcnNlIEROUyBzdWZmaXhlcywgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCB0byBwdXQgaW50byB0aGUgZ3JleWxpc3QuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei00In0sICJHUkVZTElTVF9SRE5TX0dMT0JBTCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJ5ZXMiLCAiaGVscCI6ICJPbmx5IHBlcmZvcm0gUkROUyBncmV5bGlzdCBjaGVja3Mgb24gZ2xvYmFsIElQIGFkZHJlc3Nlcy4iLCAiaWQiOiAiZ3JleWxpc3QtcmRucy1nbG9iYWwiLCAibGFiZWwiOiAiR3JleWxpc3QgcmV2ZXJzZSBETlMgZ2xvYmFsIElQcyIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJ5ZXMiLCAibmFtZSI6ICJHcmV5bGlzdCByZXZlcnNlIEROUyBnbG9iYWwgSVBzIiwgInByZXZfdmFsdWUiOiAieWVzIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJPbmx5IHBlcmZvcm0gUkROUyBncmV5bGlzdCBjaGVja3Mgb24gZ2xvYmFsIElQIGFkZHJlc3Nlcy4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTMifSwgIkdSRVlMSVNUX0FTTiI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJMaXN0IG9mIEFTTiBudW1iZXJzLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIHRvIHB1dCBpbnRvIHRoZSBncmV5bGlzdC4iLCAiaWQiOiAiZ3JleWxpc3QtYXNuIiwgImxhYmVsIjogIkdyZXlsaXN0IEFTTiIsICJyZWdleCI6ICJeXiggKigoQVNOPyk/KFxcZCspXFxiKD8hLipbU04gXVxcNFxcYikpICopKiQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXl4oICooKEFTTj8pPyhcXGQrKVxcYig/IS4qW1NOIF1cXDRcXGIpKSAqKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibmFtZSI6ICJHcmV5bGlzdCBBU04iLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkxpc3Qgb2YgQVNOIG51bWJlcnMsIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgdG8gcHV0IGludG8gdGhlIGdyZXlsaXN0LiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMiJ9LCAiR1JFWUxJU1RfVVNFUl9BR0VOVCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJMaXN0IG9mIFVzZXItQWdlbnQgKFBDUkUgcmVnZXgpLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIHRvIHB1dCBpbnRvIHRoZSBncmV5bGlzdC4iLCAiaWQiOiAiZ3JleWxpc3QtdXNlci1hZ2VudCIsICJsYWJlbCI6ICJHcmV5bGlzdCBVc2VyLUFnZW50IiwgInJlZ2V4IjogIl4uKiQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXi4qJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm5hbWUiOiAiR3JleWxpc3QgVXNlci1BZ2VudCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBVc2VyLUFnZW50IChQQ1JFIHJlZ2V4KSwgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCB0byBwdXQgaW50byB0aGUgZ3JleWxpc3QuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xIn0sICJHUkVZTElTVF9VUkkiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiTGlzdCBvZiBVUkkgKFBDUkUgcmVnZXgpLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIHRvIHB1dCBpbnRvIHRoZSBncmV5bGlzdC4iLCAiaWQiOiAiZ3JleWxpc3QtdXJpIiwgImxhYmVsIjogIkdyZXlsaXN0IFVSSSIsICJyZWdleCI6ICJeLiokIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4uKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJuYW1lIjogIkdyZXlsaXN0IFVSSSIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBVUkkgKFBDUkUgcmVnZXgpLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIHRvIHB1dCBpbnRvIHRoZSBncmV5bGlzdC4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTAifX0sICJjaGVja3N1bSI6IG51bGx9LCB7ImlkIjogImd6aXAiLCAic3RyZWFtIjogIm5vIiwgIm5hbWUiOiAiR3ppcCIsICJkZXNjcmlwdGlvbiI6ICJDb21wcmVzcyBIVFRQIHJlcXVlc3RzIHdpdGggdGhlIGd6aXAgYWxnb3JpdGhtLiIsICJ2ZXJzaW9uIjogIjEuMCIsICJ0eXBlIjogImNvcmUiLCAibWV0aG9kIjogIm1hbnVhbCIsICJwYWdlIjogZmFsc2UsICJzZXR0aW5ncyI6IHsiVVNFX0daSVAiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAibm8iLCAiaGVscCI6ICJVc2UgZ3ppcCIsICJpZCI6ICJ1c2UtZ3ppcCIsICJsYWJlbCI6ICJVc2UgZ3ppcCIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogdHJ1ZSwgInZhbHVlIjogInllcyIsICJuYW1lIjogIlVzZSBnemlwIiwgInByZXZfdmFsdWUiOiAibm8iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJ0cmVzcGFzcyIsICJ0ZXh0IjogImlucF9wb3BvdmVyX21ldGhvZF9kaXNhYmxlZCJ9LCB7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVXNlIGd6aXAifV0sICJtZXRob2QiOiAic2NoZWR1bGVyIiwgImNvbnRhaW5lckNsYXNzIjogInotNCJ9LCAiR1pJUF9UWVBFUyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJhcHBsaWNhdGlvbi9hdG9tK3htbCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0IGFwcGxpY2F0aW9uL2pzb24gYXBwbGljYXRpb24vcnNzK3htbCBhcHBsaWNhdGlvbi92bmQubXMtZm9udG9iamVjdCBhcHBsaWNhdGlvbi94LWZvbnQtb3BlbnR5cGUgYXBwbGljYXRpb24veC1mb250LXRydWV0eXBlIGFwcGxpY2F0aW9uL3gtZm9udC10dGYgYXBwbGljYXRpb24veC1qYXZhc2NyaXB0IGFwcGxpY2F0aW9uL3hodG1sK3htbCBhcHBsaWNhdGlvbi94bWwgZm9udC9lb3QgZm9udC9vcGVudHlwZSBmb250L290ZiBmb250L3RydWV0eXBlIGltYWdlL3N2Zyt4bWwgaW1hZ2Uvdm5kLm1pY3Jvc29mdC5pY29uIGltYWdlL3gtaWNvbiBpbWFnZS94LXdpbi1iaXRtYXAgdGV4dC9jc3MgdGV4dC9qYXZhc2NyaXB0IHRleHQvcGxhaW4gdGV4dC94bWwiLCAiaGVscCI6ICJMaXN0IG9mIE1JTUUgdHlwZXMgdGhhdCB3aWxsIGJlIGNvbXByZXNzZWQgd2l0aCBnemlwLiIsICJpZCI6ICJnemlwLXR5cGVzIiwgImxhYmVsIjogIk1JTUUgdHlwZXMiLCAicmVnZXgiOiAiXig/ISApKCA/KFtcXC1cXHcuXSsvW1xcLVxcdy4rXSspKD8hLipcXDIoPyEuKSkpKyQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXig/ISApKCA/KFtcXC1cXHcuXSsvW1xcLVxcdy4rXSspKD8hLipcXDIoPyEuKSkpKyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogImFwcGxpY2F0aW9uL2F0b20reG1sIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQgYXBwbGljYXRpb24vanNvbiBhcHBsaWNhdGlvbi9yc3MreG1sIGFwcGxpY2F0aW9uL3ZuZC5tcy1mb250b2JqZWN0IGFwcGxpY2F0aW9uL3gtZm9udC1vcGVudHlwZSBhcHBsaWNhdGlvbi94LWZvbnQtdHJ1ZXR5cGUgYXBwbGljYXRpb24veC1mb250LXR0ZiBhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQgYXBwbGljYXRpb24veGh0bWwreG1sIGFwcGxpY2F0aW9uL3htbCBmb250L2VvdCBmb250L29wZW50eXBlIGZvbnQvb3RmIGZvbnQvdHJ1ZXR5cGUgaW1hZ2Uvc3ZnK3htbCBpbWFnZS92bmQubWljcm9zb2Z0Lmljb24gaW1hZ2UveC1pY29uIGltYWdlL3gtd2luLWJpdG1hcCB0ZXh0L2NzcyB0ZXh0L2phdmFzY3JpcHQgdGV4dC9wbGFpbiB0ZXh0L3htbCIsICJuYW1lIjogIk1JTUUgdHlwZXMiLCAicHJldl92YWx1ZSI6ICJhcHBsaWNhdGlvbi9hdG9tK3htbCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0IGFwcGxpY2F0aW9uL2pzb24gYXBwbGljYXRpb24vcnNzK3htbCBhcHBsaWNhdGlvbi92bmQubXMtZm9udG9iamVjdCBhcHBsaWNhdGlvbi94LWZvbnQtb3BlbnR5cGUgYXBwbGljYXRpb24veC1mb250LXRydWV0eXBlIGFwcGxpY2F0aW9uL3gtZm9udC10dGYgYXBwbGljYXRpb24veC1qYXZhc2NyaXB0IGFwcGxpY2F0aW9uL3hodG1sK3htbCBhcHBsaWNhdGlvbi94bWwgZm9udC9lb3QgZm9udC9vcGVudHlwZSBmb250L290ZiBmb250L3RydWV0eXBlIGltYWdlL3N2Zyt4bWwgaW1hZ2Uvdm5kLm1pY3Jvc29mdC5pY29uIGltYWdlL3gtaWNvbiBpbWFnZS94LXdpbi1iaXRtYXAgdGV4dC9jc3MgdGV4dC9qYXZhc2NyaXB0IHRleHQvcGxhaW4gdGV4dC94bWwiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkxpc3Qgb2YgTUlNRSB0eXBlcyB0aGF0IHdpbGwgYmUgY29tcHJlc3NlZCB3aXRoIGd6aXAuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0zIn0sICJHWklQX01JTl9MRU5HVEgiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiMTAwMCIsICJoZWxwIjogIk1pbmltdW0gbGVuZ3RoIGZvciBnemlwIGNvbXByZXNzaW9uLiIsICJpZCI6ICJnemlwLW1pbi1sZW5ndGgiLCAibGFiZWwiOiAiTWluaW11bSBsZW5ndGgiLCAicmVnZXgiOiAiXlxcZCskIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl5cXGQrJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiMTAwMCIsICJuYW1lIjogIk1pbmltdW0gbGVuZ3RoIiwgInByZXZfdmFsdWUiOiAiMTAwMCIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTWluaW11bSBsZW5ndGggZm9yIGd6aXAgY29tcHJlc3Npb24uIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yIn0sICJHWklQX0NPTVBfTEVWRUwiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiNSIsICJoZWxwIjogIlRoZSBjb21wcmVzc2lvbiBsZXZlbCBvZiB0aGUgZ3ppcCBhbGdvcml0aG0uIiwgImlkIjogImd6aXAtY29tcC1sZXZlbCIsICJsYWJlbCI6ICJDb21wcmVzc2lvbiBsZXZlbCIsICJyZWdleCI6ICJeWzEtOV0kIiwgInR5cGUiOiAic2VsZWN0IiwgInBhdHRlcm4iOiAiXlsxLTldJCIsICJpbnBUeXBlIjogInNlbGVjdCIsICJ2YWx1ZXMiOiBbIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIsICI2IiwgIjciLCAiOCIsICI5Il0sICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjUiLCAibmFtZSI6ICJDb21wcmVzc2lvbiBsZXZlbCIsICJwcmV2X3ZhbHVlIjogIjUiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlRoZSBjb21wcmVzc2lvbiBsZXZlbCBvZiB0aGUgZ3ppcCBhbGdvcml0aG0uIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xIn0sICJHWklQX1BST1hJRUQiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAibm8tY2FjaGUgbm8tc3RvcmUgcHJpdmF0ZSBleHBpcmVkIGF1dGgiLCAiaGVscCI6ICJXaGljaCBraW5kIG9mIHByb3hpZWQgcmVxdWVzdHMgd2Ugc2hvdWxkIGNvbXByZXNzLiIsICJpZCI6ICJnemlwLXByb3hpZWQiLCAibGFiZWwiOiAiUHJveGllZCByZXF1ZXN0cyIsICJyZWdleCI6ICJeLiokIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4uKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIm5vLWNhY2hlIG5vLXN0b3JlIHByaXZhdGUgZXhwaXJlZCBhdXRoIiwgIm5hbWUiOiAiUHJveGllZCByZXF1ZXN0cyIsICJwcmV2X3ZhbHVlIjogIm5vLWNhY2hlIG5vLXN0b3JlIHByaXZhdGUgZXhwaXJlZCBhdXRoIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJXaGljaCBraW5kIG9mIHByb3hpZWQgcmVxdWVzdHMgd2Ugc2hvdWxkIGNvbXByZXNzLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMCJ9fSwgImNoZWNrc3VtIjogbnVsbH0sIHsiaWQiOiAiaW5qZWN0IiwgInN0cmVhbSI6ICJubyIsICJuYW1lIjogIkhUTUwgaW5qZWN0aW9uIiwgImRlc2NyaXB0aW9uIjogIkluamVjdCBjdXN0b20gSFRNTCBjb2RlIGJlZm9yZSB0aGUgPC9ib2R5PiB0YWcuIiwgInZlcnNpb24iOiAiMS4wIiwgInR5cGUiOiAiY29yZSIsICJtZXRob2QiOiAibWFudWFsIiwgInBhZ2UiOiBmYWxzZSwgInNldHRpbmdzIjogeyJJTkpFQ1RfQk9EWSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJUaGUgSFRNTCBjb2RlIHRvIGluamVjdC4iLCAiaWQiOiAiaW5qZWN0LWJvZHkiLCAibGFiZWwiOiAiSFRNTCBjb2RlIiwgInJlZ2V4IjogIl4uKiQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXi4qJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm5hbWUiOiAiSFRNTCBjb2RlIiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJUaGUgSFRNTCBjb2RlIHRvIGluamVjdC4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTAifX0sICJjaGVja3N1bSI6IG51bGx9LCB7ImlkIjogImhlYWRlcnMiLCAic3RyZWFtIjogIm5vIiwgIm5hbWUiOiAiSGVhZGVycyIsICJkZXNjcmlwdGlvbiI6ICJNYW5hZ2UgSFRUUCBoZWFkZXJzIHNlbnQgdG8gY2xpZW50cy4iLCAidmVyc2lvbiI6ICIxLjAiLCAidHlwZSI6ICJjb3JlIiwgIm1ldGhvZCI6ICJtYW51YWwiLCAicGFnZSI6IGZhbHNlLCAic2V0dGluZ3MiOiB7IlJFTU9WRV9IRUFERVJTIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIlNlcnZlciBFeHBlY3QtQ1QgWC1Qb3dlcmVkLUJ5IFgtQXNwTmV0LVZlcnNpb24gWC1Bc3BOZXRNdmMtVmVyc2lvbiIsICJoZWxwIjogIkhlYWRlcnMgdG8gcmVtb3ZlIChIZWFkZXIxIEhlYWRlcjIgSGVhZGVyMyAuLi4pIiwgImlkIjogInJlbW92ZS1oZWFkZXJzIiwgImxhYmVsIjogIlJlbW92ZSBoZWFkZXJzIiwgInJlZ2V4IjogIl4oPyEgKSggP1tcXHdcXC1dKykqJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeKD8hICkoID9bXFx3XFwtXSspKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIlNlcnZlciBFeHBlY3QtQ1QgWC1Qb3dlcmVkLUJ5IFgtQXNwTmV0LVZlcnNpb24gWC1Bc3BOZXRNdmMtVmVyc2lvbiBQdWJsaWMtS2V5LVBpbnMiLCAibmFtZSI6ICJSZW1vdmUgaGVhZGVycyIsICJwcmV2X3ZhbHVlIjogIlNlcnZlciBFeHBlY3QtQ1QgWC1Qb3dlcmVkLUJ5IFgtQXNwTmV0LVZlcnNpb24gWC1Bc3BOZXRNdmMtVmVyc2lvbiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiSGVhZGVycyB0byByZW1vdmUgKEhlYWRlcjEgSGVhZGVyMiBIZWFkZXIzIC4uLikifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTEyIn0sICJLRUVQX1VQU1RSRUFNX0hFQURFUlMiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiQ29udGVudC1TZWN1cml0eS1Qb2xpY3kgUGVybWlzc2lvbnMtUG9saWN5IEZlYXR1cmUtUG9saWN5IFgtRnJhbWUtT3B0aW9ucyIsICJoZWxwIjogIkhlYWRlcnMgdG8ga2VlcCBmcm9tIHVwc3RyZWFtIChIZWFkZXIxIEhlYWRlcjIgSGVhZGVyMyAuLi4gb3IgKiBmb3IgYWxsKS4iLCAiaWQiOiAia2VlcC11cHN0cmVhbS1oZWFkZXJzIiwgImxhYmVsIjogIktlZXAgdXBzdHJlYW0gaGVhZGVycyIsICJyZWdleCI6ICJeKCg/ISApKCA/W1xcd1xcLV0rKSt8XFwqKT8kIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4oKD8hICkoID9bXFx3XFwtXSspK3xcXCopPyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIkNvbnRlbnQtU2VjdXJpdHktUG9saWN5IFBlcm1pc3Npb25zLVBvbGljeSBYLUZyYW1lLU9wdGlvbnMiLCAibmFtZSI6ICJLZWVwIHVwc3RyZWFtIGhlYWRlcnMiLCAicHJldl92YWx1ZSI6ICJDb250ZW50LVNlY3VyaXR5LVBvbGljeSBQZXJtaXNzaW9ucy1Qb2xpY3kgRmVhdHVyZS1Qb2xpY3kgWC1GcmFtZS1PcHRpb25zIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJIZWFkZXJzIHRvIGtlZXAgZnJvbSB1cHN0cmVhbSAoSGVhZGVyMSBIZWFkZXIyIEhlYWRlcjMgLi4uIG9yICogZm9yIGFsbCkuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xMSJ9LCAiU1RSSUNUX1RSQU5TUE9SVF9TRUNVUklUWSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJtYXgtYWdlPTMxNTM2MDAwIiwgImhlbHAiOiAiVmFsdWUgZm9yIHRoZSBTdHJpY3QtVHJhbnNwb3J0LVNlY3VyaXR5IGhlYWRlci4iLCAiaWQiOiAic3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eSIsICJsYWJlbCI6ICJTdHJpY3QtVHJhbnNwb3J0LVNlY3VyaXR5IiwgInJlZ2V4IjogIl5tYXgtYWdlPVxcZCsoOyBpbmNsdWRlU3ViRG9tYWlucyg7IHByZWxvYWQpPyk/JCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJebWF4LWFnZT1cXGQrKDsgaW5jbHVkZVN1YkRvbWFpbnMoOyBwcmVsb2FkKT8pPyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIm1heC1hZ2U9MzE1MzYwMDA7IGluY2x1ZGVTdWJEb21haW5zOyBwcmVsb2FkIiwgIm5hbWUiOiAiU3RyaWN0LVRyYW5zcG9ydC1TZWN1cml0eSIsICJwcmV2X3ZhbHVlIjogIm1heC1hZ2U9MzE1MzYwMDAiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlZhbHVlIGZvciB0aGUgU3RyaWN0LVRyYW5zcG9ydC1TZWN1cml0eSBoZWFkZXIuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xMCJ9LCAiQ09PS0lFX0FVVE9fU0VDVVJFX0ZMQUciOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAieWVzIiwgImhlbHAiOiAiQXV0b21hdGljYWxseSBhZGQgdGhlIFNlY3VyZSBmbGFnIHRvIGFsbCBjb29raWVzLiIsICJpZCI6ICJjb29raWUtYXV0by1zZWN1cmUtZmxhZyIsICJsYWJlbCI6ICJDb29raWUgYXV0byBTZWN1cmUgZmxhZyIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJ5ZXMiLCAibmFtZSI6ICJDb29raWUgYXV0byBTZWN1cmUgZmxhZyIsICJwcmV2X3ZhbHVlIjogInllcyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiQXV0b21hdGljYWxseSBhZGQgdGhlIFNlY3VyZSBmbGFnIHRvIGFsbCBjb29raWVzLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotOCJ9LCAiQ09OVEVOVF9TRUNVUklUWV9QT0xJQ1kiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAib2JqZWN0LXNyYyAnbm9uZSc7IGZvcm0tYWN0aW9uICdzZWxmJzsgZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsiLCAiaGVscCI6ICJWYWx1ZSBmb3IgdGhlIENvbnRlbnQtU2VjdXJpdHktUG9saWN5IGhlYWRlci4iLCAiaWQiOiAiY29udGVudC1zZWN1cml0eS1wb2xpY3kiLCAibGFiZWwiOiAiQ29udGVudC1TZWN1cml0eS1Qb2xpY3kiLCAicmVnZXgiOiAiXi4qJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeLiokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJvYmplY3Qtc3JjICdub25lJzsgZm9ybS1hY3Rpb24gJ3NlbGYnOyBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyIsICJuYW1lIjogIkNvbnRlbnQtU2VjdXJpdHktUG9saWN5IiwgInByZXZfdmFsdWUiOiAib2JqZWN0LXNyYyAnbm9uZSc7IGZvcm0tYWN0aW9uICdzZWxmJzsgZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlZhbHVlIGZvciB0aGUgQ29udGVudC1TZWN1cml0eS1Qb2xpY3kgaGVhZGVyLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotNyJ9LCAiQ09OVEVOVF9TRUNVUklUWV9QT0xJQ1lfUkVQT1JUX09OTFkiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAibm8iLCAiaGVscCI6ICJTZW5kIHJlcG9ydHMgZm9yIHZpb2xhdGlvbnMgb2YgdGhlIENvbnRlbnQtU2VjdXJpdHktUG9saWN5IGhlYWRlciBpbnN0ZWFkIG9mIGJsb2NraW5nIHRoZW0uIiwgImlkIjogImNvbnRlbnQtc2VjdXJpdHktcG9saWN5LXJlcG9ydC1vbmx5IiwgImxhYmVsIjogIkNvbnRlbnQtU2VjdXJpdHktUG9saWN5LVJlcG9ydC1Pbmx5IiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIm5vIiwgIm5hbWUiOiAiQ29udGVudC1TZWN1cml0eS1Qb2xpY3ktUmVwb3J0LU9ubHkiLCAicHJldl92YWx1ZSI6ICJubyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiU2VuZCByZXBvcnRzIGZvciB2aW9sYXRpb25zIG9mIHRoZSBDb250ZW50LVNlY3VyaXR5LVBvbGljeSBoZWFkZXIgaW5zdGVhZCBvZiBibG9ja2luZyB0aGVtLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotNiJ9LCAiUkVGRVJSRVJfUE9MSUNZIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogInN0cmljdC1vcmlnaW4td2hlbi1jcm9zcy1vcmlnaW4iLCAiaGVscCI6ICJWYWx1ZSBmb3IgdGhlIFJlZmVycmVyLVBvbGljeSBoZWFkZXIuIiwgImlkIjogInJlZmVycmVyLXBvbGljeSIsICJsYWJlbCI6ICJSZWZlcnJlci1Qb2xpY3kiLCAicmVnZXgiOiAiXig/IV4oLHwgKSkoKCwgKT8obm8tcmVmZXJyZXItd2hlbi1kb3duZ3JhZGV8bm8tcmVmZXJyZXJ8b3JpZ2luLXdoZW4tY3Jvc3Mtb3JpZ2lufHNhbWUtb3JpZ2lufHN0cmljdC1vcmlnaW4td2hlbi1jcm9zcy1vcmlnaW58c3RyaWN0LW9yaWdpbnxvcmlnaW58dW5zYWZlLXVybCkoPyFcXGIuKiwgXFw0XFxiKSkqJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeKD8hXigsfCApKSgoLCApPyhuby1yZWZlcnJlci13aGVuLWRvd25ncmFkZXxuby1yZWZlcnJlcnxvcmlnaW4td2hlbi1jcm9zcy1vcmlnaW58c2FtZS1vcmlnaW58c3RyaWN0LW9yaWdpbi13aGVuLWNyb3NzLW9yaWdpbnxzdHJpY3Qtb3JpZ2lufG9yaWdpbnx1bnNhZmUtdXJsKSg/IVxcYi4qLCBcXDRcXGIpKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJzdHJpY3Qtb3JpZ2luLXdoZW4tY3Jvc3Mtb3JpZ2luIiwgIm5hbWUiOiAiUmVmZXJyZXItUG9saWN5IiwgInByZXZfdmFsdWUiOiAic3RyaWN0LW9yaWdpbi13aGVuLWNyb3NzLW9yaWdpbiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVmFsdWUgZm9yIHRoZSBSZWZlcnJlci1Qb2xpY3kgaGVhZGVyLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotNSJ9LCAiUEVSTUlTU0lPTlNfUE9MSUNZIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogImFjY2VsZXJvbWV0ZXI9KCksIGFtYmllbnQtbGlnaHQtc2Vuc29yPSgpLCBhdXRvcGxheT0oKSwgYmF0dGVyeT0oKSwgY2FtZXJhPSgpLCBjcm9zcy1vcmlnaW4taXNvbGF0ZWQ9KCksIGRpc3BsYXktY2FwdHVyZT0oKSwgZG9jdW1lbnQtZG9tYWluPSgpLCBlbmNyeXB0ZWQtbWVkaWE9KCksIGV4ZWN1dGlvbi13aGlsZS1ub3QtcmVuZGVyZWQ9KCksIGV4ZWN1dGlvbi13aGlsZS1vdXQtb2Ytdmlld3BvcnQ9KCksIGZ1bGxzY3JlZW49KCksIGdlb2xvY2F0aW9uPSgpLCBneXJvc2NvcGU9KCksIGhpZD0oKSwgaWRsZS1kZXRlY3Rpb249KCksIG1hZ25ldG9tZXRlcj0oKSwgbWljcm9waG9uZT0oKSwgbWlkaT0oKSwgbmF2aWdhdGlvbi1vdmVycmlkZT0oKSwgcGF5bWVudD0oKSwgcGljdHVyZS1pbi1waWN0dXJlPSgpLCBwdWJsaWNrZXktY3JlZGVudGlhbHMtZ2V0PSgpLCBzY3JlZW4td2FrZS1sb2NrPSgpLCBzZXJpYWw9KCksIHVzYj0oKSwgd2ViLXNoYXJlPSgpLCB4ci1zcGF0aWFsLXRyYWNraW5nPSgpIiwgImhlbHAiOiAiVmFsdWUgZm9yIHRoZSBQZXJtaXNzaW9ucy1Qb2xpY3kgaGVhZGVyLiIsICJpZCI6ICJwZXJtaXNzaW9ucy1wb2xpY3kiLCAibGFiZWwiOiAiUGVybWlzc2lvbnMtUG9saWN5IiwgInJlZ2V4IjogIl4oPyFbLCBdKSgsPyA/KFthLXpcXC1dKykoPyEuKlteXFwtXVxcMj0pPShcXCp8XFwoKCA/KHNlbGZ8XFx1MDAyMmh0dHBzPzpcXC9cXC9bXFwtXFx3QDolLit+Iz1dK1tcXC1cXHdcXChcXCkhQDolKy5+Iz8mXFwvPSRdKlxcdTAwMjIpKD89WyBcXCldKSkqXFwpKSkqJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeKD8hWywgXSkoLD8gPyhbYS16XFwtXSspKD8hLipbXlxcLV1cXDI9KT0oXFwqfFxcKCggPyhzZWxmfFxcdTAwMjJodHRwcz86XFwvXFwvW1xcLVxcd0A6JS4rfiM9XStbXFwtXFx3XFwoXFwpIUA6JSsufiM/JlxcLz0kXSpcXHUwMDIyKSg/PVsgXFwpXSkpKlxcKSkpKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogImFjY2VsZXJvbWV0ZXI9KCksIGFtYmllbnQtbGlnaHQtc2Vuc29yPSgpLCBhdHRyaWJ1dGlvbi1yZXBvcnRpbmc9KCksIGF1dG9wbGF5PSgpLCBiYXR0ZXJ5PSgpLCBibHVldG9vdGg9KCksIGJyb3dzaW5nLXRvcGljcz0oKSwgY2FtZXJhPSgpLCBjb21wdXRlLXByZXNzdXJlPSgpLCBkaXNwbGF5LWNhcHR1cmU9KCksIGRvY3VtZW50LWRvbWFpbj0oKSwgZW5jcnlwdGVkLW1lZGlhPSgpLCBleGVjdXRpb24td2hpbGUtbm90LXJlbmRlcmVkPSgpLCBleGVjdXRpb24td2hpbGUtb3V0LW9mLXZpZXdwb3J0PSgpLCBmdWxsc2NyZWVuPSgpLCBnYW1lcGFkPSgpLCBnZW9sb2NhdGlvbj0oKSwgZ3lyb3Njb3BlPSgpLCBoaWQ9KCksIGlkZW50aXR5LWNyZWRlbnRpYWxzLWdldD0oKSwgaWRsZS1kZXRlY3Rpb249KCksIGxvY2FsLWZvbnRzPSgpLCBtYWduZXRvbWV0ZXI9KCksIG1pY3JvcGhvbmU9KCksIG1pZGk9KCksIG90cC1jcmVkZW50aWFscz0oKSwgcGF5bWVudD0oKSwgcGljdHVyZS1pbi1waWN0dXJlPSgpLCBwdWJsaWNrZXktY3JlZGVudGlhbHMtY3JlYXRlPSgpLCBwdWJsaWNrZXktY3JlZGVudGlhbHMtZ2V0PSgpLCBzY3JlZW4td2FrZS1sb2NrPSgpLCBzZXJpYWw9KCksIHNwZWFrZXItc2VsZWN0aW9uPSgpLCBzdG9yYWdlLWFjY2Vzcz0oKSwgdXNiPSgpLCB3ZWItc2hhcmU9KCksIHdpbmRvdy1tYW5hZ2VtZW50PSgpLCB4ci1zcGF0aWFsLXRyYWNraW5nPSgpIiwgIm5hbWUiOiAiUGVybWlzc2lvbnMtUG9saWN5IiwgInByZXZfdmFsdWUiOiAiYWNjZWxlcm9tZXRlcj0oKSwgYW1iaWVudC1saWdodC1zZW5zb3I9KCksIGF1dG9wbGF5PSgpLCBiYXR0ZXJ5PSgpLCBjYW1lcmE9KCksIGNyb3NzLW9yaWdpbi1pc29sYXRlZD0oKSwgZGlzcGxheS1jYXB0dXJlPSgpLCBkb2N1bWVudC1kb21haW49KCksIGVuY3J5cHRlZC1tZWRpYT0oKSwgZXhlY3V0aW9uLXdoaWxlLW5vdC1yZW5kZXJlZD0oKSwgZXhlY3V0aW9uLXdoaWxlLW91dC1vZi12aWV3cG9ydD0oKSwgZnVsbHNjcmVlbj0oKSwgZ2VvbG9jYXRpb249KCksIGd5cm9zY29wZT0oKSwgaGlkPSgpLCBpZGxlLWRldGVjdGlvbj0oKSwgbWFnbmV0b21ldGVyPSgpLCBtaWNyb3Bob25lPSgpLCBtaWRpPSgpLCBuYXZpZ2F0aW9uLW92ZXJyaWRlPSgpLCBwYXltZW50PSgpLCBwaWN0dXJlLWluLXBpY3R1cmU9KCksIHB1YmxpY2tleS1jcmVkZW50aWFscy1nZXQ9KCksIHNjcmVlbi13YWtlLWxvY2s9KCksIHNlcmlhbD0oKSwgdXNiPSgpLCB3ZWItc2hhcmU9KCksIHhyLXNwYXRpYWwtdHJhY2tpbmc9KCkiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlZhbHVlIGZvciB0aGUgUGVybWlzc2lvbnMtUG9saWN5IGhlYWRlci4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTQifSwgIkZFQVRVUkVfUE9MSUNZIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogImFjY2VsZXJvbWV0ZXIgJ25vbmUnOyBhbWJpZW50LWxpZ2h0LXNlbnNvciAnbm9uZSc7IGF1dG9wbGF5ICdub25lJzsgYmF0dGVyeSAnbm9uZSc7IGNhbWVyYSAnbm9uZSc7IGRpc3BsYXktY2FwdHVyZSAnbm9uZSc7IGRvY3VtZW50LWRvbWFpbiAnbm9uZSc7IGVuY3J5cHRlZC1tZWRpYSAnbm9uZSc7IGV4ZWN1dGlvbi13aGlsZS1ub3QtcmVuZGVyZWQgJ25vbmUnOyBleGVjdXRpb24td2hpbGUtb3V0LW9mLXZpZXdwb3J0ICdub25lJzsgZnVsbHNjcmVlbiAnbm9uZSc7IGdlb2xvY2F0aW9uICdub25lJzsgZ3lyb3Njb3BlICdub25lJzsgbGF5b3V0LWFuaW1hdGlvbiAnbm9uZSc7IGxlZ2FjeS1pbWFnZS1mb3JtYXRzICdub25lJzsgbWFnbmV0b21ldGVyICdub25lJzsgbWljcm9waG9uZSAnbm9uZSc7IG1pZGkgJ25vbmUnOyBuYXZpZ2F0aW9uLW92ZXJyaWRlICdub25lJzsgcGF5bWVudCAnbm9uZSc7IHBpY3R1cmUtaW4tcGljdHVyZSAnbm9uZSc7IHB1YmxpY2tleS1jcmVkZW50aWFscy1nZXQgJ25vbmUnOyBzcGVha2VyLXNlbGVjdGlvbiAnbm9uZSc7IHN5bmMteGhyICdub25lJzsgdW5vcHRpbWl6ZWQtaW1hZ2VzICdub25lJzsgdW5zaXplZC1tZWRpYSAnbm9uZSc7IHVzYiAnbm9uZSc7IHNjcmVlbi13YWtlLWxvY2sgJ25vbmUnOyB3ZWItc2hhcmUgJ25vbmUnOyB4ci1zcGF0aWFsLXRyYWNraW5nICdub25lJzsiLCAiaGVscCI6ICJWYWx1ZSBmb3IgdGhlIEZlYXR1cmUtUG9saWN5IGhlYWRlci4iLCAiaWQiOiAiZmVhdHVyZS1wb2xpY3kiLCAibGFiZWwiOiAiRmVhdHVyZS1Qb2xpY3kiLCAicmVnZXgiOiAiXig/IVs7IF0pKCA/KFtcXHdcXC1dKykoPyEuKlteXFwtXVxcMiApKCAoJyhub25lfHNlbGZ8c3RyaWN0LWR5bmFtaWN8cmVwb3J0LXNhbXBsZXx1bnNhZmUtaW5saW5lfHVuc2FmZS1ldmFsfHVuc2FmZS1oYXNoZXN8dW5zYWZlLWFsbG93LXJlZGlyZWN0cyknfGh0dHBzPzpcXC9cXC9bXFx3QDolLit+Iz1cXC1dK1tcXHdcXChcXCkhQDolKy5+Iz8mXFwvPSRcXC1dKikpKzspKiQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXig/IVs7IF0pKCA/KFtcXHdcXC1dKykoPyEuKlteXFwtXVxcMiApKCAoJyhub25lfHNlbGZ8c3RyaWN0LWR5bmFtaWN8cmVwb3J0LXNhbXBsZXx1bnNhZmUtaW5saW5lfHVuc2FmZS1ldmFsfHVuc2FmZS1oYXNoZXN8dW5zYWZlLWFsbG93LXJlZGlyZWN0cyknfGh0dHBzPzpcXC9cXC9bXFx3QDolLit+Iz1cXC1dK1tcXHdcXChcXCkhQDolKy5+Iz8mXFwvPSRcXC1dKikpKzspKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogImFjY2VsZXJvbWV0ZXIgJ25vbmUnOyBhbWJpZW50LWxpZ2h0LXNlbnNvciAnbm9uZSc7IGF1dG9wbGF5ICdub25lJzsgYmF0dGVyeSAnbm9uZSc7IGNhbWVyYSAnbm9uZSc7IGRpc3BsYXktY2FwdHVyZSAnbm9uZSc7IGRvY3VtZW50LWRvbWFpbiAnbm9uZSc7IGVuY3J5cHRlZC1tZWRpYSAnbm9uZSc7IGV4ZWN1dGlvbi13aGlsZS1ub3QtcmVuZGVyZWQgJ25vbmUnOyBleGVjdXRpb24td2hpbGUtb3V0LW9mLXZpZXdwb3J0ICdub25lJzsgZnVsbHNjcmVlbiAnbm9uZSc7IGdlb2xvY2F0aW9uICdub25lJzsgZ3lyb3Njb3BlICdub25lJzsgbGF5b3V0LWFuaW1hdGlvbiAnbm9uZSc7IGxlZ2FjeS1pbWFnZS1mb3JtYXRzICdub25lJzsgbWFnbmV0b21ldGVyICdub25lJzsgbWljcm9waG9uZSAnbm9uZSc7IG1pZGkgJ25vbmUnOyBuYXZpZ2F0aW9uLW92ZXJyaWRlICdub25lJzsgcGF5bWVudCAnbm9uZSc7IHBpY3R1cmUtaW4tcGljdHVyZSAnbm9uZSc7IHB1YmxpY2tleS1jcmVkZW50aWFscy1nZXQgJ25vbmUnOyBzcGVha2VyLXNlbGVjdGlvbiAnbm9uZSc7IHN5bmMteGhyICdub25lJzsgdW5vcHRpbWl6ZWQtaW1hZ2VzICdub25lJzsgdW5zaXplZC1tZWRpYSAnbm9uZSc7IHVzYiAnbm9uZSc7IHNjcmVlbi13YWtlLWxvY2sgJ25vbmUnOyB3ZWItc2hhcmUgJ25vbmUnOyB4ci1zcGF0aWFsLXRyYWNraW5nICdub25lJzsiLCAibmFtZSI6ICJGZWF0dXJlLVBvbGljeSIsICJwcmV2X3ZhbHVlIjogImFjY2VsZXJvbWV0ZXIgJ25vbmUnOyBhbWJpZW50LWxpZ2h0LXNlbnNvciAnbm9uZSc7IGF1dG9wbGF5ICdub25lJzsgYmF0dGVyeSAnbm9uZSc7IGNhbWVyYSAnbm9uZSc7IGRpc3BsYXktY2FwdHVyZSAnbm9uZSc7IGRvY3VtZW50LWRvbWFpbiAnbm9uZSc7IGVuY3J5cHRlZC1tZWRpYSAnbm9uZSc7IGV4ZWN1dGlvbi13aGlsZS1ub3QtcmVuZGVyZWQgJ25vbmUnOyBleGVjdXRpb24td2hpbGUtb3V0LW9mLXZpZXdwb3J0ICdub25lJzsgZnVsbHNjcmVlbiAnbm9uZSc7IGdlb2xvY2F0aW9uICdub25lJzsgZ3lyb3Njb3BlICdub25lJzsgbGF5b3V0LWFuaW1hdGlvbiAnbm9uZSc7IGxlZ2FjeS1pbWFnZS1mb3JtYXRzICdub25lJzsgbWFnbmV0b21ldGVyICdub25lJzsgbWljcm9waG9uZSAnbm9uZSc7IG1pZGkgJ25vbmUnOyBuYXZpZ2F0aW9uLW92ZXJyaWRlICdub25lJzsgcGF5bWVudCAnbm9uZSc7IHBpY3R1cmUtaW4tcGljdHVyZSAnbm9uZSc7IHB1YmxpY2tleS1jcmVkZW50aWFscy1nZXQgJ25vbmUnOyBzcGVha2VyLXNlbGVjdGlvbiAnbm9uZSc7IHN5bmMteGhyICdub25lJzsgdW5vcHRpbWl6ZWQtaW1hZ2VzICdub25lJzsgdW5zaXplZC1tZWRpYSAnbm9uZSc7IHVzYiAnbm9uZSc7IHNjcmVlbi13YWtlLWxvY2sgJ25vbmUnOyB3ZWItc2hhcmUgJ25vbmUnOyB4ci1zcGF0aWFsLXRyYWNraW5nICdub25lJzsiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlZhbHVlIGZvciB0aGUgRmVhdHVyZS1Qb2xpY3kgaGVhZGVyLiJ9XSwgIm1ldGhvZCI6ICJ1aSIsICJjb250YWluZXJDbGFzcyI6ICJ6LTMifSwgIlhfRlJBTUVfT1BUSU9OUyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJTQU1FT1JJR0lOIiwgImhlbHAiOiAiVmFsdWUgZm9yIHRoZSBYLUZyYW1lLU9wdGlvbnMgaGVhZGVyLiIsICJpZCI6ICJ4LWZyYW1lLW9wdGlvbnMiLCAibGFiZWwiOiAiWC1GcmFtZS1PcHRpb25zIiwgInJlZ2V4IjogIl4oREVOWXxTQU1FT1JJR0lOKT8kIiwgInR5cGUiOiAic2VsZWN0IiwgInBhdHRlcm4iOiAiXihERU5ZfFNBTUVPUklHSU4pPyQiLCAiaW5wVHlwZSI6ICJzZWxlY3QiLCAidmFsdWVzIjogWyIiLCAiREVOWSIsICJTQU1FT1JJR0lOIl0sICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIlNBTUVPUklHSU4iLCAibmFtZSI6ICJYLUZyYW1lLU9wdGlvbnMiLCAicHJldl92YWx1ZSI6ICJTQU1FT1JJR0lOIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJWYWx1ZSBmb3IgdGhlIFgtRnJhbWUtT3B0aW9ucyBoZWFkZXIuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yIn0sICJYX0NPTlRFTlRfVFlQRV9PUFRJT05TIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIm5vc25pZmYiLCAiaGVscCI6ICJWYWx1ZSBmb3IgdGhlIFgtQ29udGVudC1UeXBlLU9wdGlvbnMgaGVhZGVyLiIsICJpZCI6ICJ4LWNvbnRlbnQtdHlwZS1vcHRpb25zIiwgImxhYmVsIjogIlgtQ29udGVudC1UeXBlLU9wdGlvbnMiLCAicmVnZXgiOiAiXihub3NuaWZmKT8kIiwgInR5cGUiOiAic2VsZWN0IiwgInBhdHRlcm4iOiAiXihub3NuaWZmKT8kIiwgImlucFR5cGUiOiAic2VsZWN0IiwgInZhbHVlcyI6IFsiIiwgIm5vc25pZmYiXSwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAibm9zbmlmZiIsICJuYW1lIjogIlgtQ29udGVudC1UeXBlLU9wdGlvbnMiLCAicHJldl92YWx1ZSI6ICJub3NuaWZmIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJWYWx1ZSBmb3IgdGhlIFgtQ29udGVudC1UeXBlLU9wdGlvbnMgaGVhZGVyLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMSJ9LCAiWF9YU1NfUFJPVEVDVElPTiI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIxOyBtb2RlPWJsb2NrIiwgImhlbHAiOiAiVmFsdWUgZm9yIHRoZSBYLVhTUy1Qcm90ZWN0aW9uIGhlYWRlci4iLCAiaWQiOiAieC14c3MtcHJvdGVjdGlvbiIsICJsYWJlbCI6ICJYLVhTUy1Qcm90ZWN0aW9uIiwgInJlZ2V4IjogIl4wfDEoOyAobW9kZT1ibG9ja3xyZXBvcnQ9aHR0cHM/OlxcL1xcL1tcXC1cXHdAOiUuK34jPV0rW1xcLVxcd1xcKFxcKSFAOiUrLn4jPyZcXC89JF0qKSk/JCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeMHwxKDsgKG1vZGU9YmxvY2t8cmVwb3J0PWh0dHBzPzpcXC9cXC9bXFwtXFx3QDolLit+Iz1dK1tcXC1cXHdcXChcXCkhQDolKy5+Iz8mXFwvPSRdKikpPyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjE7IG1vZGU9YmxvY2siLCAibmFtZSI6ICJYLVhTUy1Qcm90ZWN0aW9uIiwgInByZXZfdmFsdWUiOiAiMTsgbW9kZT1ibG9jayIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVmFsdWUgZm9yIHRoZSBYLVhTUy1Qcm90ZWN0aW9uIGhlYWRlci4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTAifX0sICJjaGVja3N1bSI6IG51bGwsICJtdWx0aXBsZXNfc2NoZW1hIjogeyJjdXN0b20taGVhZGVycyI6IHsiQ1VTVE9NX0hFQURFUiI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJDdXN0b20gaGVhZGVyIHRvIGFkZCAoSGVhZGVyTmFtZTogSGVhZGVyVmFsdWUpLiIsICJpZCI6ICJjdXN0b20taGVhZGVyIiwgImxhYmVsIjogIkN1c3RvbSBoZWFkZXIgKEhlYWRlck5hbWU6IEhlYWRlclZhbHVlKSIsICJyZWdleCI6ICJeKFtcXHdcXC1dKzogLispPyQiLCAidHlwZSI6ICJ0ZXh0IiwgIm11bHRpcGxlIjogImN1c3RvbS1oZWFkZXJzIiwgInBhdHRlcm4iOiAiXihbXFx3XFwtXSs6IC4rKT8kIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibmFtZSI6ICJDdXN0b20gaGVhZGVyIChIZWFkZXJOYW1lOiBIZWFkZXJWYWx1ZSkiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkN1c3RvbSBoZWFkZXIgdG8gYWRkIChIZWFkZXJOYW1lOiBIZWFkZXJWYWx1ZSkuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xMyJ9fSwgImNvb2tpZS1mbGFncyI6IHsiQ09PS0lFX0ZMQUdTIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiogSHR0cE9ubHkgU2FtZVNpdGU9TGF4IiwgImhlbHAiOiAiQ29va2llIGZsYWdzIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gYWxsIGNvb2tpZXMgKHZhbHVlIGFjY2VwdGVkIGZvciBuZ2lueF9jb29raWVfZmxhZ19tb2R1bGUpLiIsICJpZCI6ICJjb29raWUtZmxhZ3MiLCAibGFiZWwiOiAiQ29va2llIGZsYWdzIiwgInJlZ2V4IjogIl4oXFwqfFteO10rKSggKEh0dHBPbmx5fChTYW1lU2l0ZSkoPyEuKlxcNCkoPShMYXh8U3RyaWN0KSk/KSg/IS4qXFwzKSkqJCIsICJ0eXBlIjogInRleHQiLCAibXVsdGlwbGUiOiAiY29va2llLWZsYWdzIiwgInBhdHRlcm4iOiAiXihcXCp8W147XSspKCAoSHR0cE9ubHl8KFNhbWVTaXRlKSg/IS4qXFw0KSg9KExheHxTdHJpY3QpKT8pKD8hLipcXDMpKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIqIEh0dHBPbmx5IFNhbWVTaXRlPUxheCIsICJuYW1lIjogIkNvb2tpZSBmbGFncyIsICJwcmV2X3ZhbHVlIjogIiogSHR0cE9ubHkgU2FtZVNpdGU9TGF4IiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJDb29raWUgZmxhZ3MgYXV0b21hdGljYWxseSBhZGRlZCB0byBhbGwgY29va2llcyAodmFsdWUgYWNjZXB0ZWQgZm9yIG5naW54X2Nvb2tpZV9mbGFnX21vZHVsZSkuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xMiJ9fX0sICJtdWx0aXBsZXMiOiB7ImN1c3RvbS1oZWFkZXJzIjogeyIwIjogeyJDVVNUT01fSEVBREVSIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkN1c3RvbSBoZWFkZXIgdG8gYWRkIChIZWFkZXJOYW1lOiBIZWFkZXJWYWx1ZSkuIiwgImlkIjogImN1c3RvbS1oZWFkZXIiLCAibGFiZWwiOiAiQ3VzdG9tIGhlYWRlciAoSGVhZGVyTmFtZTogSGVhZGVyVmFsdWUpIiwgInJlZ2V4IjogIl4oW1xcd1xcLV0rOiAuKyk/JCIsICJ0eXBlIjogInRleHQiLCAibXVsdGlwbGUiOiAiY3VzdG9tLWhlYWRlcnMiLCAicGF0dGVybiI6ICJeKFtcXHdcXC1dKzogLispPyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJuYW1lIjogIkN1c3RvbSBoZWFkZXIgKEhlYWRlck5hbWU6IEhlYWRlclZhbHVlKSIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiQ3VzdG9tIGhlYWRlciB0byBhZGQgKEhlYWRlck5hbWU6IEhlYWRlclZhbHVlKS4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTEzIiwgIm1ldGhvZCI6ICJkZWZhdWx0In19LCAiMiI6IHsiQ1VTVE9NX0hFQURFUl8yIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkN1c3RvbSBoZWFkZXIgdG8gYWRkIChIZWFkZXJOYW1lOiBIZWFkZXJWYWx1ZSkuIiwgImlkIjogImN1c3RvbS1oZWFkZXItMiIsICJsYWJlbCI6ICJDdXN0b20gaGVhZGVyIChIZWFkZXJOYW1lOiBIZWFkZXJWYWx1ZSkiLCAicmVnZXgiOiAiXihbXFx3XFwtXSs6IC4rKT8kIiwgInR5cGUiOiAidGV4dCIsICJtdWx0aXBsZSI6ICJjdXN0b20taGVhZGVycyIsICJwYXR0ZXJuIjogIl4oW1xcd1xcLV0rOiAuKyk/JCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiZHpkeiIsICJuYW1lIjogIkN1c3RvbSBoZWFkZXIgKEhlYWRlck5hbWU6IEhlYWRlclZhbHVlKSIsICJwcmV2X3ZhbHVlIjogImR6ZHoiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkN1c3RvbSBoZWFkZXIgdG8gYWRkIChIZWFkZXJOYW1lOiBIZWFkZXJWYWx1ZSkuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xMyIsICJtZXRob2QiOiAiZGVmYXVsdCJ9fX0sICJjb29raWUtZmxhZ3MiOiB7IjAiOiB7IkNPT0tJRV9GTEFHUyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIqIEh0dHBPbmx5IFNhbWVTaXRlPUxheCIsICJoZWxwIjogIkNvb2tpZSBmbGFncyBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIGFsbCBjb29raWVzICh2YWx1ZSBhY2NlcHRlZCBmb3IgbmdpbnhfY29va2llX2ZsYWdfbW9kdWxlKS4iLCAiaWQiOiAiY29va2llLWZsYWdzIiwgImxhYmVsIjogIkNvb2tpZSBmbGFncyIsICJyZWdleCI6ICJeKFxcKnxbXjtdKykoIChIdHRwT25seXwoU2FtZVNpdGUpKD8hLipcXDQpKD0oTGF4fFN0cmljdCkpPykoPyEuKlxcMykpKiQiLCAidHlwZSI6ICJ0ZXh0IiwgIm11bHRpcGxlIjogImNvb2tpZS1mbGFncyIsICJwYXR0ZXJuIjogIl4oXFwqfFteO10rKSggKEh0dHBPbmx5fChTYW1lU2l0ZSkoPyEuKlxcNCkoPShMYXh8U3RyaWN0KSk/KSg/IS4qXFwzKSkqJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiKiBIdHRwT25seSBTYW1lU2l0ZT1MYXgiLCAibmFtZSI6ICJDb29raWUgZmxhZ3MiLCAicHJldl92YWx1ZSI6ICIqIEh0dHBPbmx5IFNhbWVTaXRlPUxheCIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiQ29va2llIGZsYWdzIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gYWxsIGNvb2tpZXMgKHZhbHVlIGFjY2VwdGVkIGZvciBuZ2lueF9jb29raWVfZmxhZ19tb2R1bGUpLiJ9XSwgImNvbnRhaW5lckNsYXNzIjogInotMTIiLCAibWV0aG9kIjogImRlZmF1bHQifX19fX0sIHsiaWQiOiAibGV0c2VuY3J5cHQiLCAic3RyZWFtIjogInllcyIsICJuYW1lIjogIkxldCdzIEVuY3J5cHQiLCAiZGVzY3JpcHRpb24iOiAiQXV0b21hdGljIGNyZWF0aW9uLCByZW5ld2FsIGFuZCBjb25maWd1cmF0aW9uIG9mIExldCdzIEVuY3J5cHQgY2VydGlmaWNhdGVzLiIsICJ2ZXJzaW9uIjogIjEuMCIsICJ0eXBlIjogImNvcmUiLCAibWV0aG9kIjogIm1hbnVhbCIsICJwYWdlIjogZmFsc2UsICJzZXR0aW5ncyI6IHsiQVVUT19MRVRTX0VOQ1JZUFQiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAibm8iLCAiaGVscCI6ICJBY3RpdmF0ZSBhdXRvbWF0aWMgTGV0J3MgRW5jcnlwdCBtb2RlLiIsICJpZCI6ICJhdXRvLWxldHMtZW5jcnlwdCIsICJsYWJlbCI6ICJBdXRvbWF0aWMgTGV0J3MgRW5jcnlwdCIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJubyIsICJuYW1lIjogIkF1dG9tYXRpYyBMZXQncyBFbmNyeXB0IiwgInByZXZfdmFsdWUiOiAibm8iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkFjdGl2YXRlIGF1dG9tYXRpYyBMZXQncyBFbmNyeXB0IG1vZGUuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yIn0sICJFTUFJTF9MRVRTX0VOQ1JZUFQiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiRW1haWwgdXNlZCBmb3IgTGV0J3MgRW5jcnlwdCBub3RpZmljYXRpb24gYW5kIGluIGNlcnRpZmljYXRlLiIsICJpZCI6ICJlbWFpbC1sZXRzLWVuY3J5cHQiLCAibGFiZWwiOiAiRW1haWwgTGV0J3MgRW5jcnlwdCIsICJyZWdleCI6ICJeKFteQCBcXHRcXHJcXG5dK0BbXkAgXFx0XFxyXFxuXStcXC5bXkAgXFx0XFxyXFxuXSspPyQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXihbXkAgXFx0XFxyXFxuXStAW15AIFxcdFxcclxcbl0rXFwuW15AIFxcdFxcclxcbl0rKT8kIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibmFtZSI6ICJFbWFpbCBMZXQncyBFbmNyeXB0IiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJFbWFpbCB1c2VkIGZvciBMZXQncyBFbmNyeXB0IG5vdGlmaWNhdGlvbiBhbmQgaW4gY2VydGlmaWNhdGUuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xIn0sICJVU0VfTEVUU19FTkNSWVBUX1NUQUdJTkciOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAibm8iLCAiaGVscCI6ICJVc2UgdGhlIHN0YWdpbmcgZW52aXJvbm1lbnQgZm9yIExldFx1MjAxOXMgRW5jcnlwdCBjZXJ0aWZpY2F0ZSBnZW5lcmF0aW9uLiBVc2VmdWwgd2hlbiB5b3UgYXJlIHRlc3RpbmcgeW91ciBkZXBsb3ltZW50cyB0byBhdm9pZCBiZWluZyByYXRlIGxpbWl0ZWQgaW4gdGhlIHByb2R1Y3Rpb24gZW52aXJvbm1lbnQuIiwgImlkIjogInVzZS1sZXRzLWVuY3J5cHQtc3RhZ2luZyIsICJsYWJlbCI6ICJVc2UgTGV0J3MgRW5jcnlwdCBTdGFnaW5nIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIm5vIiwgIm5hbWUiOiAiVXNlIExldCdzIEVuY3J5cHQgU3RhZ2luZyIsICJwcmV2X3ZhbHVlIjogIm5vIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJVc2UgdGhlIHN0YWdpbmcgZW52aXJvbm1lbnQgZm9yIExldFx1MjAxOXMgRW5jcnlwdCBjZXJ0aWZpY2F0ZSBnZW5lcmF0aW9uLiBVc2VmdWwgd2hlbiB5b3UgYXJlIHRlc3RpbmcgeW91ciBkZXBsb3ltZW50cyB0byBhdm9pZCBiZWluZyByYXRlIGxpbWl0ZWQgaW4gdGhlIHByb2R1Y3Rpb24gZW52aXJvbm1lbnQuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0wIn19LCAiY2hlY2tzdW0iOiBudWxsfSwgeyJpZCI6ICJsaW1pdCIsICJzdHJlYW0iOiAicGFydGlhbCIsICJuYW1lIjogIkxpbWl0IiwgImRlc2NyaXB0aW9uIjogIkxpbWl0IG1heGltdW0gbnVtYmVyIG9mIHJlcXVlc3RzIGFuZCBjb25uZWN0aW9ucy4iLCAidmVyc2lvbiI6ICIxLjAiLCAidHlwZSI6ICJjb3JlIiwgIm1ldGhvZCI6ICJtYW51YWwiLCAicGFnZSI6IHRydWUsICJzZXR0aW5ncyI6IHsiVVNFX0xJTUlUX1JFUSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJ5ZXMiLCAiaGVscCI6ICJBY3RpdmF0ZSBsaW1pdCByZXF1ZXN0cyBmZWF0dXJlLiIsICJpZCI6ICJ1c2UtbGltaXQtcmVxIiwgImxhYmVsIjogIkFjdGl2YXRlIGxpbWl0IHJlcXVlc3RzIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogInllcyIsICJuYW1lIjogIkFjdGl2YXRlIGxpbWl0IHJlcXVlc3RzIiwgInByZXZfdmFsdWUiOiAieWVzIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJBY3RpdmF0ZSBsaW1pdCByZXF1ZXN0cyBmZWF0dXJlLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotNiJ9LCAiVVNFX0xJTUlUX0NPTk4iOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAieWVzIiwgImhlbHAiOiAiQWN0aXZhdGUgbGltaXQgY29ubmVjdGlvbnMgZmVhdHVyZS4iLCAiaWQiOiAidXNlLWxpbWl0LWNvbm4iLCAibGFiZWwiOiAiQWN0aXZhdGUgbGltaXQgY29ubmVjdGlvbnMiLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAieWVzIiwgIm5hbWUiOiAiQWN0aXZhdGUgbGltaXQgY29ubmVjdGlvbnMiLCAicHJldl92YWx1ZSI6ICJ5ZXMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkFjdGl2YXRlIGxpbWl0IGNvbm5lY3Rpb25zIGZlYXR1cmUuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0zIn0sICJMSU1JVF9DT05OX01BWF9IVFRQMSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIxMCIsICJoZWxwIjogIk1heGltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHBlciBJUCB3aGVuIHVzaW5nIEhUVFAvMS5YIHByb3RvY29sLiIsICJpZCI6ICJsaW1pdC1jb25uLW1heC1odHRwMSIsICJsYWJlbCI6ICJNYXhpbXVtIG51bWJlciBvZiBIVFRQLzEuWCBjb25uZWN0aW9ucyIsICJyZWdleCI6ICJeXFxkKyQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXlxcZCskIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIxMCIsICJuYW1lIjogIk1heGltdW0gbnVtYmVyIG9mIEhUVFAvMS5YIGNvbm5lY3Rpb25zIiwgInByZXZfdmFsdWUiOiAiMTAiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIk1heGltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHBlciBJUCB3aGVuIHVzaW5nIEhUVFAvMS5YIHByb3RvY29sLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMiJ9LCAiTElNSVRfQ09OTl9NQVhfSFRUUDIiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiMTAwIiwgImhlbHAiOiAiTWF4aW11bSBudW1iZXIgb2Ygc3RyZWFtcyBwZXIgSVAgd2hlbiB1c2luZyBIVFRQLzIgcHJvdG9jb2wuIiwgImlkIjogImxpbWl0LWNvbm4tbWF4LWh0dHAyIiwgImxhYmVsIjogIk1heGltdW0gbnVtYmVyIG9mIEhUVFAvMiBzdHJlYW1zIiwgInJlZ2V4IjogIl5cXGQrJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeXFxkKyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjEwMCIsICJuYW1lIjogIk1heGltdW0gbnVtYmVyIG9mIEhUVFAvMiBzdHJlYW1zIiwgInByZXZfdmFsdWUiOiAiMTAwIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJNYXhpbXVtIG51bWJlciBvZiBzdHJlYW1zIHBlciBJUCB3aGVuIHVzaW5nIEhUVFAvMiBwcm90b2NvbC4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTEifSwgIkxJTUlUX0NPTk5fTUFYX1NUUkVBTSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIxMCIsICJoZWxwIjogIk1heGltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHBlciBJUCB3aGVuIHVzaW5nIHN0cmVhbS4iLCAiaWQiOiAibGltaXQtY29ubi1tYXgtc3RyZWFtIiwgImxhYmVsIjogIk1heGltdW0gbnVtYmVyIG9mIHN0cmVhbSBjb25uZWN0aW9ucyIsICJyZWdleCI6ICJeXFxkKyQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXlxcZCskIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIxMCIsICJuYW1lIjogIk1heGltdW0gbnVtYmVyIG9mIHN0cmVhbSBjb25uZWN0aW9ucyIsICJwcmV2X3ZhbHVlIjogIjEwIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJNYXhpbXVtIG51bWJlciBvZiBjb25uZWN0aW9ucyBwZXIgSVAgd2hlbiB1c2luZyBzdHJlYW0uIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0wIn19LCAiY2hlY2tzdW0iOiBudWxsLCAibXVsdGlwbGVzX3NjaGVtYSI6IHsibGltaXQtcmVxIjogeyJMSU1JVF9SRVFfVVJMIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIi8iLCAiaGVscCI6ICJVUkwgKFBDUkUgcmVnZXgpIHdoZXJlIHRoZSBsaW1pdCByZXF1ZXN0IHdpbGwgYmUgYXBwbGllZCBvciBzcGVjaWFsIHZhbHVlIC8gZm9yIGFsbCByZXF1ZXN0cy4iLCAiaWQiOiAibGltaXQtcmVxLXVybCIsICJsYWJlbCI6ICJMaW1pdCByZXF1ZXN0IFVSTCIsICJyZWdleCI6ICJeLiskIiwgInR5cGUiOiAidGV4dCIsICJtdWx0aXBsZSI6ICJsaW1pdC1yZXEiLCAicGF0dGVybiI6ICJeLiskIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIvIiwgIm5hbWUiOiAiTGltaXQgcmVxdWVzdCBVUkwiLCAicHJldl92YWx1ZSI6ICIvIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJVUkwgKFBDUkUgcmVnZXgpIHdoZXJlIHRoZSBsaW1pdCByZXF1ZXN0IHdpbGwgYmUgYXBwbGllZCBvciBzcGVjaWFsIHZhbHVlIC8gZm9yIGFsbCByZXF1ZXN0cy4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTYifSwgIkxJTUlUX1JFUV9SQVRFIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIjJyL3MiLCAiaGVscCI6ICJSYXRlIHRvIGFwcGx5IHRvIHRoZSBVUkwgKHMgZm9yIHNlY29uZCwgbSBmb3IgbWludXRlLCBoIGZvciBob3VyIGFuZCBkIGZvciBkYXkpLiIsICJpZCI6ICJsaW1pdC1yZXEtcmF0ZSIsICJsYWJlbCI6ICJMaW1pdCByZXF1ZXN0IFJhdGUiLCAicmVnZXgiOiAiXlxcZCtyL1tzbWhkXSQiLCAidHlwZSI6ICJ0ZXh0IiwgIm11bHRpcGxlIjogImxpbWl0LXJlcSIsICJwYXR0ZXJuIjogIl5cXGQrci9bc21oZF0kIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIyci9zIiwgIm5hbWUiOiAiTGltaXQgcmVxdWVzdCBSYXRlIiwgInByZXZfdmFsdWUiOiAiMnIvcyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiUmF0ZSB0byBhcHBseSB0byB0aGUgVVJMIChzIGZvciBzZWNvbmQsIG0gZm9yIG1pbnV0ZSwgaCBmb3IgaG91ciBhbmQgZCBmb3IgZGF5KS4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTUifX19LCAibXVsdGlwbGVzIjogeyJsaW1pdC1yZXEiOiB7IjAiOiB7IkxJTUlUX1JFUV9VUkwiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiLyIsICJoZWxwIjogIlVSTCAoUENSRSByZWdleCkgd2hlcmUgdGhlIGxpbWl0IHJlcXVlc3Qgd2lsbCBiZSBhcHBsaWVkIG9yIHNwZWNpYWwgdmFsdWUgLyBmb3IgYWxsIHJlcXVlc3RzLiIsICJpZCI6ICJsaW1pdC1yZXEtdXJsIiwgImxhYmVsIjogIkxpbWl0IHJlcXVlc3QgVVJMIiwgInJlZ2V4IjogIl4uKyQiLCAidHlwZSI6ICJ0ZXh0IiwgIm11bHRpcGxlIjogImxpbWl0LXJlcSIsICJwYXR0ZXJuIjogIl4uKyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIi8iLCAibmFtZSI6ICJMaW1pdCByZXF1ZXN0IFVSTCIsICJwcmV2X3ZhbHVlIjogIi8iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlVSTCAoUENSRSByZWdleCkgd2hlcmUgdGhlIGxpbWl0IHJlcXVlc3Qgd2lsbCBiZSBhcHBsaWVkIG9yIHNwZWNpYWwgdmFsdWUgLyBmb3IgYWxsIHJlcXVlc3RzLiJ9XSwgImNvbnRhaW5lckNsYXNzIjogInotNiIsICJtZXRob2QiOiAiZGVmYXVsdCJ9LCAiTElNSVRfUkVRX1JBVEUiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiMnIvcyIsICJoZWxwIjogIlJhdGUgdG8gYXBwbHkgdG8gdGhlIFVSTCAocyBmb3Igc2Vjb25kLCBtIGZvciBtaW51dGUsIGggZm9yIGhvdXIgYW5kIGQgZm9yIGRheSkuIiwgImlkIjogImxpbWl0LXJlcS1yYXRlIiwgImxhYmVsIjogIkxpbWl0IHJlcXVlc3QgUmF0ZSIsICJyZWdleCI6ICJeXFxkK3IvW3NtaGRdJCIsICJ0eXBlIjogInRleHQiLCAibXVsdGlwbGUiOiAibGltaXQtcmVxIiwgInBhdHRlcm4iOiAiXlxcZCtyL1tzbWhkXSQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjJyL3MiLCAibmFtZSI6ICJMaW1pdCByZXF1ZXN0IFJhdGUiLCAicHJldl92YWx1ZSI6ICIyci9zIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJSYXRlIHRvIGFwcGx5IHRvIHRoZSBVUkwgKHMgZm9yIHNlY29uZCwgbSBmb3IgbWludXRlLCBoIGZvciBob3VyIGFuZCBkIGZvciBkYXkpLiJ9XSwgImNvbnRhaW5lckNsYXNzIjogInotNSIsICJtZXRob2QiOiAiZGVmYXVsdCJ9fX19fSwgeyJpZCI6ICJtZXRyaWNzIiwgInN0cmVhbSI6ICJwYXJ0aWFsIiwgIm5hbWUiOiAiTWV0cmljcyIsICJkZXNjcmlwdGlvbiI6ICJNZXRyaWNzIGNvbGxlY3Rpb24gYW5kIHJldHJpZXZlLiIsICJ2ZXJzaW9uIjogIjEuMCIsICJ0eXBlIjogImNvcmUiLCAibWV0aG9kIjogIm1hbnVhbCIsICJwYWdlIjogZmFsc2UsICJzZXR0aW5ncyI6IHsiVVNFX01FVFJJQ1MiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAieWVzIiwgImhlbHAiOiAiRW5hYmxlIGNvbGxlY3Rpb24gYW5kIHJldHJpZXZhbCBvZiBpbnRlcm5hbCBtZXRyaWNzLiIsICJpZCI6ICJ1c2UtbWV0cmljcyIsICJsYWJlbCI6ICJVc2UgbWV0cmljcyIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJ5ZXMiLCAibmFtZSI6ICJVc2UgbWV0cmljcyIsICJwcmV2X3ZhbHVlIjogInllcyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiRW5hYmxlIGNvbGxlY3Rpb24gYW5kIHJldHJpZXZhbCBvZiBpbnRlcm5hbCBtZXRyaWNzLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMCJ9fSwgImNoZWNrc3VtIjogbnVsbH0sIHsiaWQiOiAibWlzYyIsICJzdHJlYW0iOiAicGFydGlhbCIsICJuYW1lIjogIk1pc2NlbGxhbmVvdXMiLCAiZGVzY3JpcHRpb24iOiAiTWlzY2VsbGFuZW91cyBzZXR0aW5ncy4iLCAidmVyc2lvbiI6ICIxLjAiLCAidHlwZSI6ICJjb3JlIiwgIm1ldGhvZCI6ICJtYW51YWwiLCAicGFnZSI6IHRydWUsICJzZXR0aW5ncyI6IHsiUkVESVJFQ1RfSFRUUF9UT19IVFRQUyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJubyIsICJoZWxwIjogIlJlZGlyZWN0IGFsbCBIVFRQIHJlcXVlc3QgdG8gSFRUUFMuIiwgImlkIjogInJlZGlyZWN0LWh0dHAtdG8taHR0cHMiLCAibGFiZWwiOiAiUmVkaXJlY3QgSFRUUCB0byBIVFRQUyIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJubyIsICJuYW1lIjogIlJlZGlyZWN0IEhUVFAgdG8gSFRUUFMiLCAicHJldl92YWx1ZSI6ICJubyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiUmVkaXJlY3QgYWxsIEhUVFAgcmVxdWVzdCB0byBIVFRQUy4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTE1In0sICJBVVRPX1JFRElSRUNUX0hUVFBfVE9fSFRUUFMiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAieWVzIiwgImhlbHAiOiAiVHJ5IHRvIGRldGVjdCBpZiBIVFRQUyBpcyB1c2VkIGFuZCBhY3RpdmF0ZSBIVFRQIHRvIEhUVFBTIHJlZGlyZWN0aW9uIGlmIHRoYXQncyB0aGUgY2FzZS4iLCAiaWQiOiAiYXV0by1yZWRpcmVjdC1odHRwLXRvLWh0dHBzIiwgImxhYmVsIjogIkF1dG8gcmVkaXJlY3QgSFRUUCB0byBIVFRQUyIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJ5ZXMiLCAibmFtZSI6ICJBdXRvIHJlZGlyZWN0IEhUVFAgdG8gSFRUUFMiLCAicHJldl92YWx1ZSI6ICJ5ZXMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlRyeSB0byBkZXRlY3QgaWYgSFRUUFMgaXMgdXNlZCBhbmQgYWN0aXZhdGUgSFRUUCB0byBIVFRQUyByZWRpcmVjdGlvbiBpZiB0aGF0J3MgdGhlIGNhc2UuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xNCJ9LCAiQUxMT1dFRF9NRVRIT0RTIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIkdFVHxQT1NUfEhFQUQiLCAiaGVscCI6ICJBbGxvd2VkIEhUVFAgYW5kIFdlYkRBViBtZXRob2RzLCBzZXBhcmF0ZWQgd2l0aCBwaXBlcyB0byBiZSBzZW50IGJ5IGNsaWVudHMuIiwgImlkIjogImFsbG93ZWQtbWV0aG9kcyIsICJsYWJlbCI6ICJBbGxvd2VkIG1ldGhvZHMiLCAicmVnZXgiOiAiXig/IVxcfCkoXFx8PyhbQS1aXXszLH0pKD8hLiooXnxcXHwpXFwyKSkrJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeKD8hXFx8KShcXHw/KFtBLVpdezMsfSkoPyEuKihefFxcfClcXDIpKSskIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJHRVR8UE9TVHxIRUFEIiwgIm5hbWUiOiAiQWxsb3dlZCBtZXRob2RzIiwgInByZXZfdmFsdWUiOiAiR0VUfFBPU1R8SEVBRCIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiQWxsb3dlZCBIVFRQIGFuZCBXZWJEQVYgbWV0aG9kcywgc2VwYXJhdGVkIHdpdGggcGlwZXMgdG8gYmUgc2VudCBieSBjbGllbnRzLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMTMifSwgIk1BWF9DTElFTlRfU0laRSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIxMG0iLCAiaGVscCI6ICJNYXhpbXVtIGJvZHkgc2l6ZSAoMCBmb3IgaW5maW5pdGUpLiIsICJpZCI6ICJtYXgtY2xpZW50LXNpemUiLCAibGFiZWwiOiAiTWF4aW11bSBib2R5IHNpemUiLCAicmVnZXgiOiAiXlxcZCtba0ttTWdHXT8kIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl5cXGQrW2tLbU1nR10/JCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiMTBtIiwgIm5hbWUiOiAiTWF4aW11bSBib2R5IHNpemUiLCAicHJldl92YWx1ZSI6ICIxMG0iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIk1heGltdW0gYm9keSBzaXplICgwIGZvciBpbmZpbml0ZSkuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xMiJ9LCAiU0VSVkVfRklMRVMiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAieWVzIiwgImhlbHAiOiAiU2VydmUgZmlsZXMgZnJvbSB0aGUgbG9jYWwgZm9sZGVyLiIsICJpZCI6ICJzZXJ2ZS1maWxlcyIsICJsYWJlbCI6ICJTZXJ2ZSBmaWxlcyIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogdHJ1ZSwgInZhbHVlIjogIm5vIiwgIm5hbWUiOiAiU2VydmUgZmlsZXMiLCAicHJldl92YWx1ZSI6ICJ5ZXMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJ0cmVzcGFzcyIsICJ0ZXh0IjogImlucF9wb3BvdmVyX21ldGhvZF9kaXNhYmxlZCJ9LCB7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiU2VydmUgZmlsZXMgZnJvbSB0aGUgbG9jYWwgZm9sZGVyLiJ9XSwgIm1ldGhvZCI6ICJzY2hlZHVsZXIiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xMSJ9LCAiUk9PVF9GT0xERVIiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiUm9vdCBmb2xkZXIgY29udGFpbmluZyBmaWxlcyB0byBzZXJ2ZSAoL3Zhci93d3cvaHRtbC97c2VydmVyX25hbWV9IGlmIHVuc2V0KS4iLCAiaWQiOiAicm9vdC1mb2xkZXIiLCAibGFiZWwiOiAiUm9vdCBmb2xkZXIiLCAicmVnZXgiOiAiXigvW1xcdy4gXFwtXSspKi8/JCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeKC9bXFx3LiBcXC1dKykqLz8kIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibmFtZSI6ICJSb290IGZvbGRlciIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiUm9vdCBmb2xkZXIgY29udGFpbmluZyBmaWxlcyB0byBzZXJ2ZSAoL3Zhci93d3cvaHRtbC97c2VydmVyX25hbWV9IGlmIHVuc2V0KS4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTEwIn0sICJTU0xfUFJPVE9DT0xTIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIlRMU3YxLjIgVExTdjEuMyIsICJoZWxwIjogIlRoZSBzdXBwb3J0ZWQgdmVyc2lvbiBvZiBUTFMuIFdlIHJlY29tbWVuZCB0aGUgZGVmYXVsdCB2YWx1ZSBUTFN2MS4yIFRMU3YxLjMgZm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucy4iLCAiaWQiOiAiaHR0cHMtcHJvdG9jb2xzIiwgImxhYmVsIjogIkhUVFBTIHByb3RvY29scyIsICJyZWdleCI6ICJeKD8hICkoID9UTFN2MVxcLlswLTNdKSokIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4oPyEgKSggP1RMU3YxXFwuWzAtM10pKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIlRMU3YxLjIgVExTdjEuMyIsICJuYW1lIjogIkhUVFBTIHByb3RvY29scyIsICJwcmV2X3ZhbHVlIjogIlRMU3YxLjIgVExTdjEuMyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVGhlIHN1cHBvcnRlZCB2ZXJzaW9uIG9mIFRMUy4gV2UgcmVjb21tZW5kIHRoZSBkZWZhdWx0IHZhbHVlIFRMU3YxLjIgVExTdjEuMyBmb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotOSJ9LCAiSFRUUDIiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAieWVzIiwgImhlbHAiOiAiU3VwcG9ydCBIVFRQMiBwcm90b2NvbCB3aGVuIEhUVFBTIGlzIGVuYWJsZWQuIiwgImlkIjogImh0dHAyIiwgImxhYmVsIjogIkhUVFAyIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogInllcyIsICJuYW1lIjogIkhUVFAyIiwgInByZXZfdmFsdWUiOiAieWVzIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJTdXBwb3J0IEhUVFAyIHByb3RvY29sIHdoZW4gSFRUUFMgaXMgZW5hYmxlZC4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTgifSwgIkhUVFAzIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIm5vIiwgImhlbHAiOiAiU3VwcG9ydCBIVFRQMyBwcm90b2NvbCB3aGVuIEhUVFBTIGlzIGVuYWJsZWQuIiwgImlkIjogImh0dHAzIiwgImxhYmVsIjogIkhUVFAzIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIm5vIiwgIm5hbWUiOiAiSFRUUDMiLCAicHJldl92YWx1ZSI6ICJubyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiU3VwcG9ydCBIVFRQMyBwcm90b2NvbCB3aGVuIEhUVFBTIGlzIGVuYWJsZWQuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei03In0sICJIVFRQM19BTFRfU1ZDX1BPUlQiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiNDQzIiwgImhlbHAiOiAiSFRUUDMgYWx0ZXJuYXRlIHNlcnZpY2UgcG9ydC4gVGhpcyB2YWx1ZSB3aWxsIGJlIHVzZWQgYXMgcGFydCBvZiB0aGUgQWx0LVN2YyBoZWFkZXIuIiwgImlkIjogImh0dHAzLWFsdC1zdmMtcG9ydCIsICJsYWJlbCI6ICJIVFRQMyBBbHQtU3ZjIHBvcnQiLCAicmVnZXgiOiAiXlxcZCskIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl5cXGQrJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiNDQzIiwgIm5hbWUiOiAiSFRUUDMgQWx0LVN2YyBwb3J0IiwgInByZXZfdmFsdWUiOiAiNDQzIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJIVFRQMyBhbHRlcm5hdGUgc2VydmljZSBwb3J0LiBUaGlzIHZhbHVlIHdpbGwgYmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBBbHQtU3ZjIGhlYWRlci4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTYifSwgIkxJU1RFTl9IVFRQIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogInllcyIsICJoZWxwIjogIlJlc3BvbmQgdG8gKGluc2VjdXJlKSBIVFRQIHJlcXVlc3RzLiIsICJpZCI6ICJodHRwLWxpc3RlbiIsICJsYWJlbCI6ICJIVFRQIGxpc3RlbiIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJ5ZXMiLCAibmFtZSI6ICJIVFRQIGxpc3RlbiIsICJwcmV2X3ZhbHVlIjogInllcyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiUmVzcG9uZCB0byAoaW5zZWN1cmUpIEhUVFAgcmVxdWVzdHMuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei01In0sICJVU0VfT1BFTl9GSUxFX0NBQ0hFIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIm5vIiwgImhlbHAiOiAiRW5hYmxlIG9wZW4gZmlsZSBjYWNoZSBmZWF0dXJlIiwgImlkIjogInVzZS1vcGVuLWZpbGUtY2FjaGUiLCAibGFiZWwiOiAiVXNlIG9wZW4gZmlsZSBjYWNoZSIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJubyIsICJuYW1lIjogIlVzZSBvcGVuIGZpbGUgY2FjaGUiLCAicHJldl92YWx1ZSI6ICJubyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiRW5hYmxlIG9wZW4gZmlsZSBjYWNoZSBmZWF0dXJlIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei00In0sICJPUEVOX0ZJTEVfQ0FDSEUiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAibWF4PTEwMDAgaW5hY3RpdmU9MjBzIiwgImhlbHAiOiAiT3BlbiBmaWxlIGNhY2hlIGRpcmVjdGl2ZSIsICJpZCI6ICJvcGVuLWZpbGUtY2FjaGUiLCAibGFiZWwiOiAiVXNlIG9wZW4gZmlsZSBjYWNoZSIsICJyZWdleCI6ICJeKG9mZnxtYXg9XFxkKyggaW5hY3RpdmU9XFxkKyhtcz98W3NoZHdNeV0pKT8pJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeKG9mZnxtYXg9XFxkKyggaW5hY3RpdmU9XFxkKyhtcz98W3NoZHdNeV0pKT8pJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAibWF4PTEwMDAgaW5hY3RpdmU9MjBzIiwgIm5hbWUiOiAiVXNlIG9wZW4gZmlsZSBjYWNoZSIsICJwcmV2X3ZhbHVlIjogIm1heD0xMDAwIGluYWN0aXZlPTIwcyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiT3BlbiBmaWxlIGNhY2hlIGRpcmVjdGl2ZSJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMyJ9LCAiT1BFTl9GSUxFX0NBQ0hFX0VSUk9SUyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJ5ZXMiLCAiaGVscCI6ICJFbmFibGUgb3BlbiBmaWxlIGNhY2hlIGZvciBlcnJvcnMiLCAiaWQiOiAib3Blbi1maWxlLWNhY2hlLWVycm9ycyIsICJsYWJlbCI6ICJPcGVuIGZpbGUgY2FjaGUgZXJyb3JzIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogInllcyIsICJuYW1lIjogIk9wZW4gZmlsZSBjYWNoZSBlcnJvcnMiLCAicHJldl92YWx1ZSI6ICJ5ZXMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkVuYWJsZSBvcGVuIGZpbGUgY2FjaGUgZm9yIGVycm9ycyJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMiJ9LCAiT1BFTl9GSUxFX0NBQ0hFX01JTl9VU0VTIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIjIiLCAiaGVscCI6ICJFbmFibGUgb3BlbiBmaWxlIGNhY2hlIG1pbmltdW0gdXNlcyIsICJpZCI6ICJvcGVuLWZpbGUtY2FjaGUtbWluLXVzZXMiLCAibGFiZWwiOiAiT3BlbiBmaWxlIGNhY2hlIG1pbiB1c2VzIiwgInJlZ2V4IjogIl5bMS05XVxcZCokIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl5bMS05XVxcZCokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIyIiwgIm5hbWUiOiAiT3BlbiBmaWxlIGNhY2hlIG1pbiB1c2VzIiwgInByZXZfdmFsdWUiOiAiMiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiRW5hYmxlIG9wZW4gZmlsZSBjYWNoZSBtaW5pbXVtIHVzZXMifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTEifSwgIk9QRU5fRklMRV9DQUNIRV9WQUxJRCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIzMHMiLCAiaGVscCI6ICJPcGVuIGZpbGUgY2FjaGUgdmFsaWQgdGltZSIsICJpZCI6ICJvcGVuLWZpbGUtY2FjaGUtdmFsaWQiLCAibGFiZWwiOiAiT3BlbiBmaWxlIGNhY2hlIHZhbGlkIHRpbWUiLCAicmVnZXgiOiAiXlxcZCsobXM/fFtzaGR3TXldKSQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXlxcZCsobXM/fFtzaGR3TXldKSQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjMwcyIsICJuYW1lIjogIk9wZW4gZmlsZSBjYWNoZSB2YWxpZCB0aW1lIiwgInByZXZfdmFsdWUiOiAiMzBzIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJPcGVuIGZpbGUgY2FjaGUgdmFsaWQgdGltZSJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMCJ9fSwgImNoZWNrc3VtIjogbnVsbH0sIHsiaWQiOiAibW9kc2VjdXJpdHkiLCAic3RyZWFtIjogIm5vIiwgIm5hbWUiOiAiTW9kU2VjdXJpdHkiLCAiZGVzY3JpcHRpb24iOiAiTWFuYWdlbWVudCBvZiB0aGUgTW9kU2VjdXJpdHkgV0FGLiIsICJ2ZXJzaW9uIjogIjEuMCIsICJ0eXBlIjogImNvcmUiLCAibWV0aG9kIjogIm1hbnVhbCIsICJwYWdlIjogZmFsc2UsICJzZXR0aW5ncyI6IHsiVVNFX01PRFNFQ1VSSVRZIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogInllcyIsICJoZWxwIjogIkVuYWJsZSBNb2RTZWN1cml0eSBXQUYuIiwgImlkIjogInVzZS1tb2RzZWN1cml0eSIsICJsYWJlbCI6ICJVc2UgTW9kU2VjdXJpdHkiLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAieWVzIiwgIm5hbWUiOiAiVXNlIE1vZFNlY3VyaXR5IiwgInByZXZfdmFsdWUiOiAieWVzIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJFbmFibGUgTW9kU2VjdXJpdHkgV0FGLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotNSJ9LCAiVVNFX01PRFNFQ1VSSVRZX0NSUyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJ5ZXMiLCAiaGVscCI6ICJFbmFibGUgT1dBU1AgQ29yZSBSdWxlIFNldC4iLCAiaWQiOiAidXNlLW1vZHNlY3VyaXR5LWNycyIsICJsYWJlbCI6ICJVc2UgQ29yZSBSdWxlIFNldCIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJ5ZXMiLCAibmFtZSI6ICJVc2UgQ29yZSBSdWxlIFNldCIsICJwcmV2X3ZhbHVlIjogInllcyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiRW5hYmxlIE9XQVNQIENvcmUgUnVsZSBTZXQuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei00In0sICJNT0RTRUNVUklUWV9DUlNfVkVSU0lPTiI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIzIiwgImhlbHAiOiAiVmVyc2lvbiBvZiB0aGUgT1dBU1AgQ29yZSBSdWxlIFNldCB0byB1c2Ugd2l0aCBNb2RTZWN1cml0eSAoMywgNCBvciBuaWdodGx5KS4iLCAiaWQiOiAibW9kc2VjdXJpdHktY3JzLXZlcnNpb24iLCAibGFiZWwiOiAiQ29yZSBSdWxlIFNldCBWZXJzaW9uIiwgInJlZ2V4IjogIl4oM3w0fG5pZ2h0bHkpJCIsICJ0eXBlIjogInNlbGVjdCIsICJwYXR0ZXJuIjogIl4oM3w0fG5pZ2h0bHkpJCIsICJpbnBUeXBlIjogInNlbGVjdCIsICJ2YWx1ZXMiOiBbIjMiLCAiNCIsICJuaWdodGx5Il0sICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjQiLCAibmFtZSI6ICJDb3JlIFJ1bGUgU2V0IFZlcnNpb24iLCAicHJldl92YWx1ZSI6ICIzIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJWZXJzaW9uIG9mIHRoZSBPV0FTUCBDb3JlIFJ1bGUgU2V0IHRvIHVzZSB3aXRoIE1vZFNlY3VyaXR5ICgzLCA0IG9yIG5pZ2h0bHkpLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMyJ9LCAiTU9EU0VDVVJJVFlfU0VDX0FVRElUX0VOR0lORSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJSZWxldmFudE9ubHkiLCAiaGVscCI6ICJTZWNBdWRpdEVuZ2luZSBkaXJlY3RpdmUgb2YgTW9kU2VjdXJpdHkuIiwgImlkIjogIm1vZHNlY3VyaXR5LXNlYy1hdWRpdC1lbmdpbmUiLCAibGFiZWwiOiAiU2VjQXVkaXRFbmdpbmUiLCAicmVnZXgiOiAiXihPbnxSZWxldmFudE9ubHl8T2ZmKSQiLCAidHlwZSI6ICJzZWxlY3QiLCAicGF0dGVybiI6ICJeKE9ufFJlbGV2YW50T25seXxPZmYpJCIsICJpbnBUeXBlIjogInNlbGVjdCIsICJ2YWx1ZXMiOiBbIk9mZiIsICJPbiIsICJSZWxldmFudE9ubHkiXSwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiUmVsZXZhbnRPbmx5IiwgIm5hbWUiOiAiU2VjQXVkaXRFbmdpbmUiLCAicHJldl92YWx1ZSI6ICJSZWxldmFudE9ubHkiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlNlY0F1ZGl0RW5naW5lIGRpcmVjdGl2ZSBvZiBNb2RTZWN1cml0eS4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTIifSwgIk1PRFNFQ1VSSVRZX1NFQ19SVUxFX0VOR0lORSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJPbiIsICJoZWxwIjogIlNlY1J1bGVFbmdpbmUgZGlyZWN0aXZlIG9mIE1vZFNlY3VyaXR5LiIsICJpZCI6ICJtb2RzZWN1cml0eS1zZWMtcnVsZS1lbmdpbmUiLCAibGFiZWwiOiAiU2VjUnVsZUVuZ2luZSIsICJyZWdleCI6ICJeKE9ufERldGVjdGlvbk9ubHl8T2ZmKSQiLCAidHlwZSI6ICJzZWxlY3QiLCAicGF0dGVybiI6ICJeKE9ufERldGVjdGlvbk9ubHl8T2ZmKSQiLCAiaW5wVHlwZSI6ICJzZWxlY3QiLCAidmFsdWVzIjogWyJEZXRlY3Rpb25Pbmx5IiwgIk9mZiIsICJPbiJdLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJPbiIsICJuYW1lIjogIlNlY1J1bGVFbmdpbmUiLCAicHJldl92YWx1ZSI6ICJPbiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiU2VjUnVsZUVuZ2luZSBkaXJlY3RpdmUgb2YgTW9kU2VjdXJpdHkuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xIn0sICJNT0RTRUNVUklUWV9TRUNfQVVESVRfTE9HX1BBUlRTIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIkFCQ0ZIWiIsICJoZWxwIjogIlNlY0F1ZGl0TG9nUGFydHMgZGlyZWN0aXZlIG9mIE1vZFNlY3VyaXR5LiIsICJpZCI6ICJtb2RzZWN1cml0eS1zZWMtYXVkaXQtbG9nLXBhcnRzIiwgImxhYmVsIjogIlNlY0F1ZGl0TG9nUGFydHMiLCAicmVnZXgiOiAiXkEoKFtCLUtdKSg/IS4qXFwyKSkrWiQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXkEoKFtCLUtdKSg/IS4qXFwyKSkrWiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIkFCQ0ZIWiIsICJuYW1lIjogIlNlY0F1ZGl0TG9nUGFydHMiLCAicHJldl92YWx1ZSI6ICJBQkNGSFoiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlNlY0F1ZGl0TG9nUGFydHMgZGlyZWN0aXZlIG9mIE1vZFNlY3VyaXR5LiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMCJ9fSwgImNoZWNrc3VtIjogbnVsbH0sIHsiaWQiOiAicGhwIiwgInN0cmVhbSI6ICJubyIsICJuYW1lIjogIlBIUCIsICJkZXNjcmlwdGlvbiI6ICJNYW5hZ2UgbG9jYWwgb3IgcmVtb3RlIFBIUC1GUE0uIiwgInZlcnNpb24iOiAiMS4wIiwgInR5cGUiOiAiY29yZSIsICJtZXRob2QiOiAibWFudWFsIiwgInBhZ2UiOiBmYWxzZSwgInNldHRpbmdzIjogeyJSRU1PVEVfUEhQIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkhvc3RuYW1lIG9mIHRoZSByZW1vdGUgUEhQLUZQTSBpbnN0YW5jZS4iLCAiaWQiOiAicmVtb3RlLXBocCIsICJsYWJlbCI6ICJSZW1vdGUgUEhQIiwgInJlZ2V4IjogIl4oKD89LnsxLDI1NX0kKVswLTlBLVphLXpdKD86KD86WzAtOUEtWmEtel18LSl7MCw2MX1bMC05QS1aYS16XSk/KD86XFwuWzAtOUEtWmEtel0oPzooPzpbMC05QS1aYS16XXwtKXswLDYxfVswLTlBLVphLXpdKT8pKlxcLj8pPyQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXigoPz0uezEsMjU1fSQpWzAtOUEtWmEtel0oPzooPzpbMC05QS1aYS16XXwtKXswLDYxfVswLTlBLVphLXpdKT8oPzpcXC5bMC05QS1aYS16XSg/Oig/OlswLTlBLVphLXpdfC0pezAsNjF9WzAtOUEtWmEtel0pPykqXFwuPyk/JCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm5hbWUiOiAiUmVtb3RlIFBIUCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiSG9zdG5hbWUgb2YgdGhlIHJlbW90ZSBQSFAtRlBNIGluc3RhbmNlLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMyJ9LCAiUkVNT1RFX1BIUF9QQVRIIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIlJvb3QgZm9sZGVyIGNvbnRhaW5pbmcgZmlsZXMgaW4gdGhlIHJlbW90ZSBQSFAtRlBNIGluc3RhbmNlLiIsICJpZCI6ICJyZW1vdGUtcGhwLXBhdGgiLCAibGFiZWwiOiAiUmVtb3RlIFBIUCBwYXRoIiwgInJlZ2V4IjogIl4oL1tcXHcuIFxcLV0rKSovPyQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXigvW1xcdy4gXFwtXSspKi8/JCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm5hbWUiOiAiUmVtb3RlIFBIUCBwYXRoIiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJSb290IGZvbGRlciBjb250YWluaW5nIGZpbGVzIGluIHRoZSByZW1vdGUgUEhQLUZQTSBpbnN0YW5jZS4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTIifSwgIkxPQ0FMX1BIUCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJQYXRoIHRvIHRoZSBQSFAtRlBNIHNvY2tldCBmaWxlLiIsICJpZCI6ICJsb2NhbCIsICJsYWJlbCI6ICJMb2NhbCBQSFAiLCAicmVnZXgiOiAiXigvW1xcdy4gXFwtXSspKi8/JCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeKC9bXFx3LiBcXC1dKykqLz8kIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibmFtZSI6ICJMb2NhbCBQSFAiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlBhdGggdG8gdGhlIFBIUC1GUE0gc29ja2V0IGZpbGUuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xIn0sICJMT0NBTF9QSFBfUEFUSCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJSb290IGZvbGRlciBjb250YWluaW5nIGZpbGVzIGluIHRoZSBsb2NhbCBQSFAtRlBNIGluc3RhbmNlLiIsICJpZCI6ICJsb2NhbC1waHAtcGF0aCIsICJsYWJlbCI6ICJMb2NhbCBQSFAgcGF0aCIsICJyZWdleCI6ICJeKC9bXFx3LiBcXC1dKykqLz8kIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4oL1tcXHcuIFxcLV0rKSovPyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJuYW1lIjogIkxvY2FsIFBIUCBwYXRoIiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJSb290IGZvbGRlciBjb250YWluaW5nIGZpbGVzIGluIHRoZSBsb2NhbCBQSFAtRlBNIGluc3RhbmNlLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMCJ9fSwgImNoZWNrc3VtIjogbnVsbH0sIHsiaWQiOiAicmVhbGlwIiwgInN0cmVhbSI6ICJwYXJ0aWFsIiwgIm5hbWUiOiAiUmVhbCBJUCIsICJkZXNjcmlwdGlvbiI6ICJHZXQgcmVhbCBJUCBvZiBjbGllbnRzIHdoZW4gQnVua2VyV2ViIGlzIGJlaGluZCBhIHJldmVyc2UgcHJveHkgLyBsb2FkIGJhbGFuY2VyLiIsICJ2ZXJzaW9uIjogIjEuMCIsICJ0eXBlIjogImNvcmUiLCAibWV0aG9kIjogIm1hbnVhbCIsICJwYWdlIjogZmFsc2UsICJzZXR0aW5ncyI6IHsiVVNFX1JFQUxfSVAiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAibm8iLCAiaGVscCI6ICJSZXRyaWV2ZSB0aGUgcmVhbCBJUCBvZiBjbGllbnQuIiwgImlkIjogInVzZS1yZWFsLWlwIiwgImxhYmVsIjogIlVzZSByZWFsIGlwIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIm5vIiwgIm5hbWUiOiAiVXNlIHJlYWwgaXAiLCAicHJldl92YWx1ZSI6ICJubyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiUmV0cmlldmUgdGhlIHJlYWwgSVAgb2YgY2xpZW50LiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotNCJ9LCAiVVNFX1BST1hZX1BST1RPQ09MIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIm5vIiwgImhlbHAiOiAiRW5hYmxlIFBST1hZIHByb3RvY29sIGNvbW11bmljYXRpb24uIiwgImlkIjogInVzZS1wcm94eS1wcm90b2NvbCIsICJsYWJlbCI6ICJVc2UgUFJPWFkgcHJvdG9jb2wiLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAibm8iLCAibmFtZSI6ICJVc2UgUFJPWFkgcHJvdG9jb2wiLCAicHJldl92YWx1ZSI6ICJubyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiRW5hYmxlIFBST1hZIHByb3RvY29sIGNvbW11bmljYXRpb24uIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0zIn0sICJSRUFMX0lQX0ZST00iOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiMTkyLjE2OC4wLjAvMTYgMTcyLjE2LjAuMC8xMiAxMC4wLjAuMC84IiwgImhlbHAiOiAiTGlzdCBvZiB0cnVzdGVkIElQcyAvIG5ldHdvcmtzLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIHdoZXJlIHByb3hpZWQgcmVxdWVzdHMgY29tZSBmcm9tLiIsICJpZCI6ICJyZWFsLWlwLWZyb20iLCAibGFiZWwiOiAiUmVhbCBJUCBmcm9tIiwgInJlZ2V4IjogIl4oPyEgKSggKigoKFxcYjI1WzAtNV18XFxiMlswLTRdXFxkfFxcYlswMV0/XFxkXFxkPykoXFwuKDI1WzAtNV18MlswLTRdXFxkfFswMV0/XFxkXFxkPykpezN9KShcXC8oWzEtMl1bMC05XT98M1swLTJdP3xbMDQtOV0pKT98KChbMC05YS1mQS1GXXsxLDR9Oil7N31bMC05YS1mQS1GXXsxLDR9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw3fTp8KFswLTlhLWZBLUZdezEsNH06KXsxLDZ9OlswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDV9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDJ9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw0fSg6WzAtOWEtZkEtRl17MSw0fSl7MSwzfXwoWzAtOWEtZkEtRl17MSw0fTopezEsM30oOlswLTlhLWZBLUZdezEsNH0pezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDJ9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDV9fFswLTlhLWZBLUZdezEsNH06KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw2fSl8OigoOlswLTlhLWZBLUZdezEsNH0pezEsN318Oil8ZmU4MDooOlswLTlhLWZBLUZdWnswLDR9KXswLDR9JVswLTlhLXpBLVpdK3w6OihmZmZmKDowezEsNH0pPzopPygoMjVbMC01XXwoMlswLTRdfDE/XFxkKT9cXGQpXFwuKXszfSgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZCl8KFswLTlhLWZBLUZdezEsNH06KXsxLDR9OigoMjVbMC01XXwoMlswLTRdfDE/XFxkKT9cXGQpXFwuKXszfSgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZCkpKFxcLygxMlswLThdfDFbMDFdWzAtOV18WzAtOV1bMC05XT8pKT8pKD8hLipcXERcXDIoW15cXGRcXC9dfCQpKSAqKSokIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4oPyEgKSggKigoKFxcYjI1WzAtNV18XFxiMlswLTRdXFxkfFxcYlswMV0/XFxkXFxkPykoXFwuKDI1WzAtNV18MlswLTRdXFxkfFswMV0/XFxkXFxkPykpezN9KShcXC8oWzEtMl1bMC05XT98M1swLTJdP3xbMDQtOV0pKT98KChbMC05YS1mQS1GXXsxLDR9Oil7N31bMC05YS1mQS1GXXsxLDR9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw3fTp8KFswLTlhLWZBLUZdezEsNH06KXsxLDZ9OlswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDV9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDJ9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw0fSg6WzAtOWEtZkEtRl17MSw0fSl7MSwzfXwoWzAtOWEtZkEtRl17MSw0fTopezEsM30oOlswLTlhLWZBLUZdezEsNH0pezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDJ9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDV9fFswLTlhLWZBLUZdezEsNH06KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw2fSl8OigoOlswLTlhLWZBLUZdezEsNH0pezEsN318Oil8ZmU4MDooOlswLTlhLWZBLUZdWnswLDR9KXswLDR9JVswLTlhLXpBLVpdK3w6OihmZmZmKDowezEsNH0pPzopPygoMjVbMC01XXwoMlswLTRdfDE/XFxkKT9cXGQpXFwuKXszfSgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZCl8KFswLTlhLWZBLUZdezEsNH06KXsxLDR9OigoMjVbMC01XXwoMlswLTRdfDE/XFxkKT9cXGQpXFwuKXszfSgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZCkpKFxcLygxMlswLThdfDFbMDFdWzAtOV18WzAtOV1bMC05XT8pKT8pKD8hLipcXERcXDIoW15cXGRcXC9dfCQpKSAqKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIxOTIuMTY4LjAuMC8xNiAxNzIuMTYuMC4wLzEyIDEwLjAuMC4wLzgiLCAibmFtZSI6ICJSZWFsIElQIGZyb20iLCAicHJldl92YWx1ZSI6ICIxOTIuMTY4LjAuMC8xNiAxNzIuMTYuMC4wLzEyIDEwLjAuMC4wLzgiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkxpc3Qgb2YgdHJ1c3RlZCBJUHMgLyBuZXR3b3Jrcywgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCB3aGVyZSBwcm94aWVkIHJlcXVlc3RzIGNvbWUgZnJvbS4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTIifSwgIlJFQUxfSVBfSEVBREVSIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIlgtRm9yd2FyZGVkLUZvciIsICJoZWxwIjogIkhUVFAgaGVhZGVyIGNvbnRhaW5pbmcgdGhlIHJlYWwgSVAgb3Igc3BlY2lhbCB2YWx1ZSBwcm94eV9wcm90b2NvbCBmb3IgUFJPWFkgcHJvdG9jb2wuIiwgImlkIjogInJlYWwtaXAtaGVhZGVyIiwgImxhYmVsIjogIlJlYWwgSVAgaGVhZGVyIiwgInJlZ2V4IjogIl4oPyEgKSgoID8oPyFwcm94eV9wcm90b2NvbClbXFx3XFwtXSspKnxwcm94eV9wcm90b2NvbCkkIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4oPyEgKSgoID8oPyFwcm94eV9wcm90b2NvbClbXFx3XFwtXSspKnxwcm94eV9wcm90b2NvbCkkIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJYLUZvcndhcmRlZC1Gb3IiLCAibmFtZSI6ICJSZWFsIElQIGhlYWRlciIsICJwcmV2X3ZhbHVlIjogIlgtRm9yd2FyZGVkLUZvciIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiSFRUUCBoZWFkZXIgY29udGFpbmluZyB0aGUgcmVhbCBJUCBvciBzcGVjaWFsIHZhbHVlIHByb3h5X3Byb3RvY29sIGZvciBQUk9YWSBwcm90b2NvbC4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTEifSwgIlJFQUxfSVBfUkVDVVJTSVZFIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogInllcyIsICJoZWxwIjogIlBlcmZvcm0gYSByZWN1cnNpdmUgc2VhcmNoIGluIHRoZSBoZWFkZXIgY29udGFpbmVyIElQIGFkZHJlc3MuIiwgImlkIjogInJlYWwtaXAtcmVjdXJzaXZlIiwgImxhYmVsIjogIlJlYWwgSVAgcmVjdXJzaXZlIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogInllcyIsICJuYW1lIjogIlJlYWwgSVAgcmVjdXJzaXZlIiwgInByZXZfdmFsdWUiOiAieWVzIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJQZXJmb3JtIGEgcmVjdXJzaXZlIHNlYXJjaCBpbiB0aGUgaGVhZGVyIGNvbnRhaW5lciBJUCBhZGRyZXNzLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMCJ9fSwgImNoZWNrc3VtIjogbnVsbH0sIHsiaWQiOiAicmVkaXJlY3QiLCAic3RyZWFtIjogIm5vIiwgIm5hbWUiOiAiUmVkaXJlY3QiLCAiZGVzY3JpcHRpb24iOiAiTWFuYWdlIEhUVFAgcmVkaXJlY3RzLiIsICJ2ZXJzaW9uIjogIjEuMCIsICJ0eXBlIjogImNvcmUiLCAibWV0aG9kIjogIm1hbnVhbCIsICJwYWdlIjogZmFsc2UsICJzZXR0aW5ncyI6IHsiUkVESVJFQ1RfVE8iOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiUmVkaXJlY3QgYSB3aG9sZSBzaXRlIHRvIGFub3RoZXIgb25lLiIsICJpZCI6ICJyZWRpcmVjdC10byIsICJsYWJlbCI6ICJSZWRpcmVjdCB0byIsICJyZWdleCI6ICJeKGh0dHBzPzpcXC9cXC9bXFwtXFx3QDolLit+Iz1dK1tcXC1cXHdcXChcXCkhQDolKy5+Iz8mXFwvPSRdKik/JCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeKGh0dHBzPzpcXC9cXC9bXFwtXFx3QDolLit+Iz1dK1tcXC1cXHdcXChcXCkhQDolKy5+Iz8mXFwvPSRdKik/JCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm5hbWUiOiAiUmVkaXJlY3QgdG8iLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlJlZGlyZWN0IGEgd2hvbGUgc2l0ZSB0byBhbm90aGVyIG9uZS4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTIifSwgIlJFRElSRUNUX1RPX1JFUVVFU1RfVVJJIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIm5vIiwgImhlbHAiOiAiQXBwZW5kIHRoZSByZXF1ZXN0ZWQgVVJJIHRvIHRoZSByZWRpcmVjdCBhZGRyZXNzLiIsICJpZCI6ICJyZWRpcmVjdC10by1yZXF1ZXN0LXVyaSIsICJsYWJlbCI6ICJBcHBlbmQgcmVxdWVzdCBVUkkiLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAibm8iLCAibmFtZSI6ICJBcHBlbmQgcmVxdWVzdCBVUkkiLCAicHJldl92YWx1ZSI6ICJubyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiQXBwZW5kIHRoZSByZXF1ZXN0ZWQgVVJJIHRvIHRoZSByZWRpcmVjdCBhZGRyZXNzLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMSJ9LCAiUkVESVJFQ1RfVE9fU1RBVFVTX0NPREUiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiMzAxIiwgImhlbHAiOiAiU3RhdHVzIGNvZGUgdG8gc2VuZCB0byBjbGllbnQgd2hlbiByZWRpcmVjdGluZy4iLCAiaWQiOiAicmVkaXJlY3QtdG8tc3RhdHVzLWNvZGUiLCAibGFiZWwiOiAiQXBwZW5kIHJlcXVlc3QgVVJJIiwgInJlZ2V4IjogIl4oMzAxfDMwMikkIiwgInR5cGUiOiAic2VsZWN0IiwgInBhdHRlcm4iOiAiXigzMDF8MzAyKSQiLCAiaW5wVHlwZSI6ICJzZWxlY3QiLCAidmFsdWVzIjogWyIzMDEiLCAiMzAyIl0sICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjMwMSIsICJuYW1lIjogIkFwcGVuZCByZXF1ZXN0IFVSSSIsICJwcmV2X3ZhbHVlIjogIjMwMSIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiU3RhdHVzIGNvZGUgdG8gc2VuZCB0byBjbGllbnQgd2hlbiByZWRpcmVjdGluZy4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTAifX0sICJjaGVja3N1bSI6IG51bGx9LCB7ImlkIjogInJldmVyc2Vwcm94eSIsICJzdHJlYW0iOiAicGFydGlhbCIsICJuYW1lIjogIlJldmVyc2UgcHJveHkiLCAiZGVzY3JpcHRpb24iOiAiTWFuYWdlIHJldmVyc2UgcHJveHkgY29uZmlndXJhdGlvbnMuIiwgInZlcnNpb24iOiAiMS4wIiwgInR5cGUiOiAiY29yZSIsICJtZXRob2QiOiAibWFudWFsIiwgInBhZ2UiOiBmYWxzZSwgInNldHRpbmdzIjogeyJVU0VfUkVWRVJTRV9QUk9YWSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJubyIsICJoZWxwIjogIkFjdGl2YXRlIHJldmVyc2UgcHJveHkgbW9kZS4iLCAiaWQiOiAidXNlLXJldmVyc2UtcHJveHkiLCAibGFiZWwiOiAiVXNlIHJldmVyc2UgcHJveHkiLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IHRydWUsICJ2YWx1ZSI6ICJ5ZXMiLCAibmFtZSI6ICJVc2UgcmV2ZXJzZSBwcm94eSIsICJwcmV2X3ZhbHVlIjogIm5vIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAidHJlc3Bhc3MiLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tZXRob2RfZGlzYWJsZWQifSwgeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkFjdGl2YXRlIHJldmVyc2UgcHJveHkgbW9kZS4ifV0sICJtZXRob2QiOiAic2NoZWR1bGVyIiwgImNvbnRhaW5lckNsYXNzIjogInotMjMifSwgIlJFVkVSU0VfUFJPWFlfSU5URVJDRVBUX0VSUk9SUyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJ5ZXMiLCAiaGVscCI6ICJJbnRlcmNlcHQgYW5kIHJld3JpdGUgZXJyb3JzLiIsICJpZCI6ICJyZXZlcnNlLXByb3h5LWludGVyY2VwdC1lcnJvcnMiLCAibGFiZWwiOiAiSW50ZXJjZXB0IGVycm9ycyIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJ5ZXMiLCAibmFtZSI6ICJJbnRlcmNlcHQgZXJyb3JzIiwgInByZXZfdmFsdWUiOiAieWVzIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJJbnRlcmNlcHQgYW5kIHJld3JpdGUgZXJyb3JzLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMjIifSwgIlJFVkVSU0VfUFJPWFlfQ1VTVE9NX0hPU1QiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiT3ZlcnJpZGUgSG9zdCBoZWFkZXIgc2VudCB0byB1cHN0cmVhbSBzZXJ2ZXIuIiwgImlkIjogInJldmVyc2UtcHJveHktY3VzdG9tLWhvc3QiLCAibGFiZWwiOiAiUmV2ZXJzZSBwcm94eSBjdXN0b20gaG9zdCIsICJyZWdleCI6ICJeLiokIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4uKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJuYW1lIjogIlJldmVyc2UgcHJveHkgY3VzdG9tIGhvc3QiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIk92ZXJyaWRlIEhvc3QgaGVhZGVyIHNlbnQgdG8gdXBzdHJlYW0gc2VydmVyLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMjEifSwgIlVTRV9QUk9YWV9DQUNIRSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJubyIsICJoZWxwIjogIkVuYWJsZSBvciBkaXNhYmxlIGNhY2hpbmcgb2YgdGhlIHByb3hpZWQgcmVzb3VyY2VzLiIsICJpZCI6ICJ1c2UtcHJveHktY2FjaGUiLCAibGFiZWwiOiAiUmV2ZXJzZSBwcm94eSBjYWNoZSIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJubyIsICJuYW1lIjogIlJldmVyc2UgcHJveHkgY2FjaGUiLCAicHJldl92YWx1ZSI6ICJubyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiRW5hYmxlIG9yIGRpc2FibGUgY2FjaGluZyBvZiB0aGUgcHJveGllZCByZXNvdXJjZXMuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei02In0sICJQUk9YWV9DQUNIRV9NRVRIT0RTIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIkdFVCBIRUFEIiwgImhlbHAiOiAiSFRUUCBtZXRob2RzIHRoYXQgc2hvdWxkIHRyaWdnZXIgYSBjYWNoZSBvcGVyYXRpb24uIiwgImlkIjogInByb3h5LWNhY2hlLW1ldGhvZHMiLCAibGFiZWwiOiAiUmV2ZXJzZSBwcm94eSBjYWNoZSBtZXRob2RzIiwgInJlZ2V4IjogIl4oPyEgKSggPyhHRVR8SEVBRHxQT1NUfFBVVHxERUxFVEV8Q09OTkVDVHxPUFRJT05TfFRSQUNFfFBBVENIKSg/IS4qXFwyKSkrJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeKD8hICkoID8oR0VUfEhFQUR8UE9TVHxQVVR8REVMRVRFfENPTk5FQ1R8T1BUSU9OU3xUUkFDRXxQQVRDSCkoPyEuKlxcMikpKyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIkdFVCBIRUFEIiwgIm5hbWUiOiAiUmV2ZXJzZSBwcm94eSBjYWNoZSBtZXRob2RzIiwgInByZXZfdmFsdWUiOiAiR0VUIEhFQUQiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkhUVFAgbWV0aG9kcyB0aGF0IHNob3VsZCB0cmlnZ2VyIGEgY2FjaGUgb3BlcmF0aW9uLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotNSJ9LCAiUFJPWFlfQ0FDSEVfTUlOX1VTRVMiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiMiIsICJoZWxwIjogIlRoZSBtaW5pbXVtIG51bWJlciBvZiByZXF1ZXN0cyBiZWZvcmUgYSByZXNwb25zZSBpcyBjYWNoZWQuIiwgImlkIjogInByb3h5LWNhY2hlLW1pbi11c2VzIiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkgY2FjaGUgbWluaW11bSB1c2VzIiwgInJlZ2V4IjogIl5bMS05XVxcZCokIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl5bMS05XVxcZCokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIyIiwgIm5hbWUiOiAiUmV2ZXJzZSBwcm94eSBjYWNoZSBtaW5pbXVtIHVzZXMiLCAicHJldl92YWx1ZSI6ICIyIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJUaGUgbWluaW11bSBudW1iZXIgb2YgcmVxdWVzdHMgYmVmb3JlIGEgcmVzcG9uc2UgaXMgY2FjaGVkLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotNCJ9LCAiUFJPWFlfQ0FDSEVfS0VZIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiRzY2hlbWUkaG9zdCRyZXF1ZXN0X3VyaSIsICJoZWxwIjogIlRoZSBrZXkgdXNlZCB0byB1bmlxdWVseSBpZGVudGlmeSBhIGNhY2hlZCByZXNwb25zZS4iLCAiaWQiOiAicHJveHktY2FjaGUta2V5IiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkgY2FjaGUga2V5IiwgInJlZ2V4IjogIl4oPyEgKSggPyhcXCRbYS16X10rKSg/IS4qXFwyKSkrJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeKD8hICkoID8oXFwkW2Etel9dKykoPyEuKlxcMikpKyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiRzY2hlbWUkaG9zdCRyZXF1ZXN0X3VyaSIsICJuYW1lIjogIlJldmVyc2UgcHJveHkgY2FjaGUga2V5IiwgInByZXZfdmFsdWUiOiAiJHNjaGVtZSRob3N0JHJlcXVlc3RfdXJpIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJUaGUga2V5IHVzZWQgdG8gdW5pcXVlbHkgaWRlbnRpZnkgYSBjYWNoZWQgcmVzcG9uc2UuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0zIn0sICJQUk9YWV9DQUNIRV9WQUxJRCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIyMDA9MjRoIDMwMT0xaCAzMDI9MjRoIiwgImhlbHAiOiAiRGVmaW5lIHRoZSBjYWNoaW5nIHRpbWUgZGVwZW5kaW5nIG9uIHRoZSBIVFRQIHN0YXR1cyBjb2RlIChsaXN0IG9mIHN0YXR1cz10aW1lKSwgc2VwYXJhdGVkIHdpdGggc3BhY2VzLiIsICJpZCI6ICJwcm94eS1jYWNoZS12YWxpZCIsICJsYWJlbCI6ICJSZXZlcnNlIHByb3h5IGNhY2hlIHZhbGlkIiwgInJlZ2V4IjogIl4oPyEgKSggPyhbMS01XVxcZHsyfSkoPyEuKlxcMj0pPVxcZCsobXM/fFtzaGR3TXldKSkqJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeKD8hICkoID8oWzEtNV1cXGR7Mn0pKD8hLipcXDI9KT1cXGQrKG1zP3xbc2hkd015XSkpKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjIwMD0yNGggMzAxPTFoIDMwMj0yNGgiLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IGNhY2hlIHZhbGlkIiwgInByZXZfdmFsdWUiOiAiMjAwPTI0aCAzMDE9MWggMzAyPTI0aCIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiRGVmaW5lIHRoZSBjYWNoaW5nIHRpbWUgZGVwZW5kaW5nIG9uIHRoZSBIVFRQIHN0YXR1cyBjb2RlIChsaXN0IG9mIHN0YXR1cz10aW1lKSwgc2VwYXJhdGVkIHdpdGggc3BhY2VzLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMiJ9LCAiUFJPWFlfTk9fQ0FDSEUiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiJGh0dHBfcHJhZ21hICRodHRwX2F1dGhvcml6YXRpb24iLCAiaGVscCI6ICJDb25kaXRpb25zIHRvIGRpc2FibGUgY2FjaGluZyBvZiByZXNwb25zZXMuIiwgImlkIjogInByb3h5LW5vLWNhY2hlIiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkgbm8gY2FjaGUiLCAicmVnZXgiOiAiXi4qJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeLiokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIkaHR0cF9wcmFnbWEgJGh0dHBfYXV0aG9yaXphdGlvbiIsICJuYW1lIjogIlJldmVyc2UgcHJveHkgbm8gY2FjaGUiLCAicHJldl92YWx1ZSI6ICIkaHR0cF9wcmFnbWEgJGh0dHBfYXV0aG9yaXphdGlvbiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiQ29uZGl0aW9ucyB0byBkaXNhYmxlIGNhY2hpbmcgb2YgcmVzcG9uc2VzLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMSJ9LCAiUFJPWFlfQ0FDSEVfQllQQVNTIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIjAiLCAiaGVscCI6ICJDb25kaXRpb25zIHRvIGJ5cGFzcyBjYWNoaW5nIG9mIHJlc3BvbnNlcy4iLCAiaWQiOiAicHJveHktY2FjaGUtYnlwYXNzIiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkgYnlwYXNzIiwgInJlZ2V4IjogIl4uKiQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXi4qJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiMCIsICJuYW1lIjogIlJldmVyc2UgcHJveHkgYnlwYXNzIiwgInByZXZfdmFsdWUiOiAiMCIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiQ29uZGl0aW9ucyB0byBieXBhc3MgY2FjaGluZyBvZiByZXNwb25zZXMuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0wIn19LCAiY2hlY2tzdW0iOiBudWxsLCAibXVsdGlwbGVzX3NjaGVtYSI6IHsicmV2ZXJzZS1wcm94eSI6IHsiUkVWRVJTRV9QUk9YWV9IT1NUIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkZ1bGwgVVJMIG9mIHRoZSBwcm94aWVkIHJlc291cmNlIChwcm94eV9wYXNzKS4iLCAiaWQiOiAicmV2ZXJzZS1wcm94eS1ob3N0IiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkgaG9zdCIsICJyZWdleCI6ICJeLiokIiwgInR5cGUiOiAidGV4dCIsICJtdWx0aXBsZSI6ICJyZXZlcnNlLXByb3h5IiwgInBhdHRlcm4iOiAiXi4qJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm5hbWUiOiAiUmV2ZXJzZSBwcm94eSBob3N0IiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJGdWxsIFVSTCBvZiB0aGUgcHJveGllZCByZXNvdXJjZSAocHJveHlfcGFzcykuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yMyJ9LCAiUkVWRVJTRV9QUk9YWV9VUkwiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiLyIsICJoZWxwIjogIkxvY2F0aW9uIFVSTCB0aGF0IHdpbGwgYmUgcHJveGllZC4iLCAiaWQiOiAicmV2ZXJzZS1wcm94eS11cmwiLCAibGFiZWwiOiAiUmV2ZXJzZSBwcm94eSB1cmwiLCAicmVnZXgiOiAiXi4qJCIsICJ0eXBlIjogInRleHQiLCAibXVsdGlwbGUiOiAicmV2ZXJzZS1wcm94eSIsICJwYXR0ZXJuIjogIl4uKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIi8iLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IHVybCIsICJwcmV2X3ZhbHVlIjogIi8iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkxvY2F0aW9uIFVSTCB0aGF0IHdpbGwgYmUgcHJveGllZC4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTIyIn0sICJSRVZFUlNFX1BST1hZX1dTIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIm5vIiwgImhlbHAiOiAiRW5hYmxlIHdlYnNvY2tldCBvbiB0aGUgcHJveGllZCByZXNvdXJjZS4iLCAiaWQiOiAicmV2ZXJzZS1wcm94eS13cyIsICJsYWJlbCI6ICJSZXZlcnNlIHByb3h5IFdTIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJtdWx0aXBsZSI6ICJyZXZlcnNlLXByb3h5IiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAibm8iLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IFdTIiwgInByZXZfdmFsdWUiOiAibm8iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkVuYWJsZSB3ZWJzb2NrZXQgb24gdGhlIHByb3hpZWQgcmVzb3VyY2UuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yMSJ9LCAiUkVWRVJTRV9QUk9YWV9IRUFERVJTIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkxpc3Qgb2YgSFRUUCBoZWFkZXJzIHRvIHNlbmQgdG8gcHJveGllZCByZXNvdXJjZSBzZXBhcmF0ZWQgd2l0aCBzZW1pY29sb25zICh2YWx1ZXMgZm9yIHByb3h5X3NldF9oZWFkZXIgZGlyZWN0aXZlKS4iLCAiaWQiOiAicmV2ZXJzZS1wcm94eS1oZWFkZXJzIiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkgaGVhZGVycyIsICJyZWdleCI6ICJeKD8hWzsgXSkoOz8gPyhbXFx3XFwtXSspKD8hLipcXDIgKSBbXjtdKykqJCIsICJ0eXBlIjogInRleHQiLCAibXVsdGlwbGUiOiAicmV2ZXJzZS1wcm94eSIsICJwYXR0ZXJuIjogIl4oPyFbOyBdKSg7PyA/KFtcXHdcXC1dKykoPyEuKlxcMiApIFteO10rKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IGhlYWRlcnMiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkxpc3Qgb2YgSFRUUCBoZWFkZXJzIHRvIHNlbmQgdG8gcHJveGllZCByZXNvdXJjZSBzZXBhcmF0ZWQgd2l0aCBzZW1pY29sb25zICh2YWx1ZXMgZm9yIHByb3h5X3NldF9oZWFkZXIgZGlyZWN0aXZlKS4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTIwIn0sICJSRVZFUlNFX1BST1hZX0hFQURFUlNfQ0xJRU5UIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkxpc3Qgb2YgSFRUUCBoZWFkZXJzIHRvIHNlbmQgdG8gY2xpZW50IHNlcGFyYXRlZCB3aXRoIHNlbWljb2xvbnMgKHZhbHVlcyBmb3IgYWRkX2hlYWRlciBkaXJlY3RpdmUpLiIsICJpZCI6ICJyZXZlcnNlLXByb3h5LWhlYWRlcnMtY2xpZW50IiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkgaGVhZGVycy1jbGllbnQiLCAicmVnZXgiOiAiXig/IVs7IF0pKDs/ID8oW1xcd1xcLV0rKSg/IS4qXFwyICkgW147XSspKiQiLCAidHlwZSI6ICJ0ZXh0IiwgIm11bHRpcGxlIjogInJldmVyc2UtcHJveHkiLCAicGF0dGVybiI6ICJeKD8hWzsgXSkoOz8gPyhbXFx3XFwtXSspKD8hLipcXDIgKSBbXjtdKykqJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm5hbWUiOiAiUmV2ZXJzZSBwcm94eSBoZWFkZXJzLWNsaWVudCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBIVFRQIGhlYWRlcnMgdG8gc2VuZCB0byBjbGllbnQgc2VwYXJhdGVkIHdpdGggc2VtaWNvbG9ucyAodmFsdWVzIGZvciBhZGRfaGVhZGVyIGRpcmVjdGl2ZSkuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xOSJ9LCAiUkVWRVJTRV9QUk9YWV9CVUZGRVJJTkciOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAieWVzIiwgImhlbHAiOiAiRW5hYmxlIG9yIGRpc2FibGUgYnVmZmVyaW5nIG9mIHJlc3BvbnNlcyBmcm9tIHByb3hpZWQgcmVzb3VyY2UuIiwgImlkIjogInJldmVyc2UtcHJveHktYnVmZmVyaW5nIiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkgYnVmZmVyaW5nIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJtdWx0aXBsZSI6ICJyZXZlcnNlLXByb3h5IiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAieWVzIiwgIm5hbWUiOiAiUmV2ZXJzZSBwcm94eSBidWZmZXJpbmciLCAicHJldl92YWx1ZSI6ICJ5ZXMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkVuYWJsZSBvciBkaXNhYmxlIGJ1ZmZlcmluZyBvZiByZXNwb25zZXMgZnJvbSBwcm94aWVkIHJlc291cmNlLiJ9XSwgImNvbnRhaW5lckNsYXNzIjogInotMTgifSwgIlJFVkVSU0VfUFJPWFlfS0VFUEFMSVZFIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIm5vIiwgImhlbHAiOiAiRW5hYmxlIG9yIGRpc2FibGUga2VlcGFsaXZlIGNvbm5lY3Rpb25zIHdpdGggdGhlIHByb3hpZWQgcmVzb3VyY2UuIiwgImlkIjogInJldmVyc2UtcHJveHkta2VlcGFsaXZlIiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkga2VlcGFsaXZlIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJtdWx0aXBsZSI6ICJyZXZlcnNlLXByb3h5IiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAibm8iLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IGtlZXBhbGl2ZSIsICJwcmV2X3ZhbHVlIjogIm5vIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJFbmFibGUgb3IgZGlzYWJsZSBrZWVwYWxpdmUgY29ubmVjdGlvbnMgd2l0aCB0aGUgcHJveGllZCByZXNvdXJjZS4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTE3In0sICJSRVZFUlNFX1BST1hZX0FVVEhfUkVRVUVTVCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJFbmFibGUgYXV0aGVudGljYXRpb24gdXNpbmcgYW4gZXh0ZXJuYWwgcHJvdmlkZXIgKHZhbHVlIG9mIGF1dGhfcmVxdWVzdCBkaXJlY3RpdmUpLiIsICJpZCI6ICJyZXZlcnNlLXByb3h5LWF1dGgtcmVxdWVzdCIsICJsYWJlbCI6ICJSZXZlcnNlIHByb3h5IGF1dGggcmVxdWVzdCIsICJyZWdleCI6ICJeKFxcL1tcXHdcXF0ufjpcXC8/I1xcW0AhJFxcJidcXChcXCkqKyw7PVxcLV0qfG9mZik/JCIsICJ0eXBlIjogInRleHQiLCAibXVsdGlwbGUiOiAicmV2ZXJzZS1wcm94eSIsICJwYXR0ZXJuIjogIl4oXFwvW1xcd1xcXS5+OlxcLz8jXFxbQCEkXFwmJ1xcKFxcKSorLDs9XFwtXSp8b2ZmKT8kIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IGF1dGggcmVxdWVzdCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiRW5hYmxlIGF1dGhlbnRpY2F0aW9uIHVzaW5nIGFuIGV4dGVybmFsIHByb3ZpZGVyICh2YWx1ZSBvZiBhdXRoX3JlcXVlc3QgZGlyZWN0aXZlKS4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTE2In0sICJSRVZFUlNFX1BST1hZX0FVVEhfUkVRVUVTVF9TSUdOSU5fVVJMIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIlJlZGlyZWN0IGNsaWVudHMgdG8gc2lnbi1pbiBVUkwgd2hlbiB1c2luZyBSRVZFUlNFX1BST1hZX0FVVEhfUkVRVUVTVCAodXNlZCB3aGVuIGF1dGhfcmVxdWVzdCBjYWxsIHJldHVybmVkIDQwMSkuIiwgImlkIjogInJldmVyc2UtcHJveHktYXV0aC1yZXF1ZXN0LXNpZ25pbi11cmwiLCAibGFiZWwiOiAiQXV0aCByZXF1ZXN0IHNpZ25pbiBVUkwiLCAicmVnZXgiOiAiXihodHRwcz86XFwvXFwvW1xcLVxcd0A6JS4rfiM9XStbXFwtXFx3XFwoXFwpIUA6JSsufiM/JlxcLz0kXSopPyQiLCAidHlwZSI6ICJ0ZXh0IiwgIm11bHRpcGxlIjogInJldmVyc2UtcHJveHkiLCAicGF0dGVybiI6ICJeKGh0dHBzPzpcXC9cXC9bXFwtXFx3QDolLit+Iz1dK1tcXC1cXHdcXChcXCkhQDolKy5+Iz8mXFwvPSRdKik/JCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm5hbWUiOiAiQXV0aCByZXF1ZXN0IHNpZ25pbiBVUkwiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlJlZGlyZWN0IGNsaWVudHMgdG8gc2lnbi1pbiBVUkwgd2hlbiB1c2luZyBSRVZFUlNFX1BST1hZX0FVVEhfUkVRVUVTVCAodXNlZCB3aGVuIGF1dGhfcmVxdWVzdCBjYWxsIHJldHVybmVkIDQwMSkuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xNSJ9LCAiUkVWRVJTRV9QUk9YWV9BVVRIX1JFUVVFU1RfU0VUIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkxpc3Qgb2YgdmFyaWFibGVzIHRvIHNldCBmcm9tIHRoZSBhdXRoZW50aWNhdGlvbiBwcm92aWRlciwgc2VwYXJhdGVkIHdpdGggc2VtaWNvbG9ucyAodmFsdWVzIG9mIGF1dGhfcmVxdWVzdF9zZXQgZGlyZWN0aXZlcykuIiwgImlkIjogInJldmVyc2UtcHJveHktYXV0aC1yZXF1ZXN0LXNldCIsICJsYWJlbCI6ICJSZXZlcnNlIHByb3h5IGF1dGggcmVxdWVzdCBzZXQiLCAicmVnZXgiOiAiXig/ISA7KSg7PyA/KFxcJFthLXpfXFwtXSspKD8hLipcXDIgKSBbXjtdKykqJCIsICJ0eXBlIjogInRleHQiLCAibXVsdGlwbGUiOiAicmV2ZXJzZS1wcm94eSIsICJwYXR0ZXJuIjogIl4oPyEgOykoOz8gPyhcXCRbYS16X1xcLV0rKSg/IS4qXFwyICkgW147XSspKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJuYW1lIjogIlJldmVyc2UgcHJveHkgYXV0aCByZXF1ZXN0IHNldCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiB2YXJpYWJsZXMgdG8gc2V0IGZyb20gdGhlIGF1dGhlbnRpY2F0aW9uIHByb3ZpZGVyLCBzZXBhcmF0ZWQgd2l0aCBzZW1pY29sb25zICh2YWx1ZXMgb2YgYXV0aF9yZXF1ZXN0X3NldCBkaXJlY3RpdmVzKS4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTE0In0sICJSRVZFUlNFX1BST1hZX0NPTk5FQ1RfVElNRU9VVCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICI2MHMiLCAiaGVscCI6ICJUaW1lb3V0IHdoZW4gY29ubmVjdGluZyB0byB0aGUgcHJveGllZCByZXNvdXJjZS4iLCAiaWQiOiAicmV2ZXJzZS1wcm94eS1jb25uZWN0LXRpbWVvdXQiLCAibGFiZWwiOiAiUmV2ZXJzZSBwcm94eSBjb25uZWN0IHRpbWVvdXQiLCAicmVnZXgiOiAiXlxcZCsobXM/fFtzaGR3TXldKSQiLCAidHlwZSI6ICJ0ZXh0IiwgIm11bHRpcGxlIjogInJldmVyc2UtcHJveHkiLCAicGF0dGVybiI6ICJeXFxkKyhtcz98W3NoZHdNeV0pJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiNjBzIiwgIm5hbWUiOiAiUmV2ZXJzZSBwcm94eSBjb25uZWN0IHRpbWVvdXQiLCAicHJldl92YWx1ZSI6ICI2MHMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlRpbWVvdXQgd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBwcm94aWVkIHJlc291cmNlLiJ9XSwgImNvbnRhaW5lckNsYXNzIjogInotMTMifSwgIlJFVkVSU0VfUFJPWFlfUkVBRF9USU1FT1VUIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIjYwcyIsICJoZWxwIjogIlRpbWVvdXQgd2hlbiByZWFkaW5nIGZyb20gdGhlIHByb3hpZWQgcmVzb3VyY2UuIiwgImlkIjogInJldmVyc2UtcHJveHktcmVhZC10aW1lb3V0IiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkgcmVhZCB0aW1lb3V0IiwgInJlZ2V4IjogIl5cXGQrKG1zP3xbc2hkd015XSkkIiwgInR5cGUiOiAidGV4dCIsICJtdWx0aXBsZSI6ICJyZXZlcnNlLXByb3h5IiwgInBhdHRlcm4iOiAiXlxcZCsobXM/fFtzaGR3TXldKSQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjYwcyIsICJuYW1lIjogIlJldmVyc2UgcHJveHkgcmVhZCB0aW1lb3V0IiwgInByZXZfdmFsdWUiOiAiNjBzIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJUaW1lb3V0IHdoZW4gcmVhZGluZyBmcm9tIHRoZSBwcm94aWVkIHJlc291cmNlLiJ9XSwgImNvbnRhaW5lckNsYXNzIjogInotMTIifSwgIlJFVkVSU0VfUFJPWFlfU0VORF9USU1FT1VUIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIjYwcyIsICJoZWxwIjogIlRpbWVvdXQgd2hlbiBzZW5kaW5nIHRvIHRoZSBwcm94aWVkIHJlc291cmNlLiIsICJpZCI6ICJyZXZlcnNlLXByb3h5LXNlbmQtdGltZW91dCIsICJsYWJlbCI6ICJSZXZlcnNlIHByb3h5IHNlbmQgdGltZW91dCIsICJyZWdleCI6ICJeXFxkKyhtcz98W3NoZHdNeV0pJCIsICJ0eXBlIjogInRleHQiLCAibXVsdGlwbGUiOiAicmV2ZXJzZS1wcm94eSIsICJwYXR0ZXJuIjogIl5cXGQrKG1zP3xbc2hkd015XSkkIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICI2MHMiLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IHNlbmQgdGltZW91dCIsICJwcmV2X3ZhbHVlIjogIjYwcyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVGltZW91dCB3aGVuIHNlbmRpbmcgdG8gdGhlIHByb3hpZWQgcmVzb3VyY2UuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xMSJ9LCAiUkVWRVJTRV9QUk9YWV9JTkNMVURFUyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJBZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gdG8gaW5jbHVkZSBpbiB0aGUgbG9jYXRpb24gYmxvY2ssIHNlcGFyYXRlZCB3aXRoIHNwYWNlcy4iLCAiaWQiOiAicmV2ZXJzZS1wcm94eS1pbmNsdWRlcyIsICJsYWJlbCI6ICJSZXZlcnNlIHByb3h5IGluY2x1ZGVzIiwgInJlZ2V4IjogIl4oPyEgKSggPyhcXHcrKSg/IS4qXFxiXFwyXFxiKSkqJCIsICJ0eXBlIjogInRleHQiLCAibXVsdGlwbGUiOiAicmV2ZXJzZS1wcm94eSIsICJwYXR0ZXJuIjogIl4oPyEgKSggPyhcXHcrKSg/IS4qXFxiXFwyXFxiKSkqJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm5hbWUiOiAiUmV2ZXJzZSBwcm94eSBpbmNsdWRlcyIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiQWRkaXRpb25hbCBjb25maWd1cmF0aW9uIHRvIGluY2x1ZGUgaW4gdGhlIGxvY2F0aW9uIGJsb2NrLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xMCJ9fX0sICJtdWx0aXBsZXMiOiB7InJldmVyc2UtcHJveHkiOiB7IjAiOiB7IlJFVkVSU0VfUFJPWFlfSE9TVCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJGdWxsIFVSTCBvZiB0aGUgcHJveGllZCByZXNvdXJjZSAocHJveHlfcGFzcykuIiwgImlkIjogInJldmVyc2UtcHJveHktaG9zdCIsICJsYWJlbCI6ICJSZXZlcnNlIHByb3h5IGhvc3QiLCAicmVnZXgiOiAiXi4qJCIsICJ0eXBlIjogInRleHQiLCAibXVsdGlwbGUiOiAicmV2ZXJzZS1wcm94eSIsICJwYXR0ZXJuIjogIl4uKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiB0cnVlLCAidmFsdWUiOiAiaHR0cDovL2FwcDE6ODA4MCIsICJuYW1lIjogIlJldmVyc2UgcHJveHkgaG9zdCIsICJwcmV2X3ZhbHVlIjogImh0dHA6Ly9hcHAxOjgwODAiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJ0cmVzcGFzcyIsICJ0ZXh0IjogImlucF9wb3BvdmVyX21ldGhvZF9kaXNhYmxlZCJ9LCB7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiRnVsbCBVUkwgb2YgdGhlIHByb3hpZWQgcmVzb3VyY2UgKHByb3h5X3Bhc3MpLiJ9XSwgImNvbnRhaW5lckNsYXNzIjogInotMjMiLCAibWV0aG9kIjogInNjaGVkdWxlciJ9LCAiUkVWRVJTRV9QUk9YWV9VUkwiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiLyIsICJoZWxwIjogIkxvY2F0aW9uIFVSTCB0aGF0IHdpbGwgYmUgcHJveGllZC4iLCAiaWQiOiAicmV2ZXJzZS1wcm94eS11cmwiLCAibGFiZWwiOiAiUmV2ZXJzZSBwcm94eSB1cmwiLCAicmVnZXgiOiAiXi4qJCIsICJ0eXBlIjogInRleHQiLCAibXVsdGlwbGUiOiAicmV2ZXJzZS1wcm94eSIsICJwYXR0ZXJuIjogIl4uKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIi8iLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IHVybCIsICJwcmV2X3ZhbHVlIjogIi8iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkxvY2F0aW9uIFVSTCB0aGF0IHdpbGwgYmUgcHJveGllZC4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTIyIiwgIm1ldGhvZCI6ICJkZWZhdWx0In0sICJSRVZFUlNFX1BST1hZX1dTIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIm5vIiwgImhlbHAiOiAiRW5hYmxlIHdlYnNvY2tldCBvbiB0aGUgcHJveGllZCByZXNvdXJjZS4iLCAiaWQiOiAicmV2ZXJzZS1wcm94eS13cyIsICJsYWJlbCI6ICJSZXZlcnNlIHByb3h5IFdTIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJtdWx0aXBsZSI6ICJyZXZlcnNlLXByb3h5IiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAibm8iLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IFdTIiwgInByZXZfdmFsdWUiOiAibm8iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkVuYWJsZSB3ZWJzb2NrZXQgb24gdGhlIHByb3hpZWQgcmVzb3VyY2UuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yMSIsICJtZXRob2QiOiAiZGVmYXVsdCJ9LCAiUkVWRVJTRV9QUk9YWV9IRUFERVJTIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkxpc3Qgb2YgSFRUUCBoZWFkZXJzIHRvIHNlbmQgdG8gcHJveGllZCByZXNvdXJjZSBzZXBhcmF0ZWQgd2l0aCBzZW1pY29sb25zICh2YWx1ZXMgZm9yIHByb3h5X3NldF9oZWFkZXIgZGlyZWN0aXZlKS4iLCAiaWQiOiAicmV2ZXJzZS1wcm94eS1oZWFkZXJzIiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkgaGVhZGVycyIsICJyZWdleCI6ICJeKD8hWzsgXSkoOz8gPyhbXFx3XFwtXSspKD8hLipcXDIgKSBbXjtdKykqJCIsICJ0eXBlIjogInRleHQiLCAibXVsdGlwbGUiOiAicmV2ZXJzZS1wcm94eSIsICJwYXR0ZXJuIjogIl4oPyFbOyBdKSg7PyA/KFtcXHdcXC1dKykoPyEuKlxcMiApIFteO10rKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IGhlYWRlcnMiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkxpc3Qgb2YgSFRUUCBoZWFkZXJzIHRvIHNlbmQgdG8gcHJveGllZCByZXNvdXJjZSBzZXBhcmF0ZWQgd2l0aCBzZW1pY29sb25zICh2YWx1ZXMgZm9yIHByb3h5X3NldF9oZWFkZXIgZGlyZWN0aXZlKS4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTIwIiwgIm1ldGhvZCI6ICJkZWZhdWx0In0sICJSRVZFUlNFX1BST1hZX0hFQURFUlNfQ0xJRU5UIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkxpc3Qgb2YgSFRUUCBoZWFkZXJzIHRvIHNlbmQgdG8gY2xpZW50IHNlcGFyYXRlZCB3aXRoIHNlbWljb2xvbnMgKHZhbHVlcyBmb3IgYWRkX2hlYWRlciBkaXJlY3RpdmUpLiIsICJpZCI6ICJyZXZlcnNlLXByb3h5LWhlYWRlcnMtY2xpZW50IiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkgaGVhZGVycy1jbGllbnQiLCAicmVnZXgiOiAiXig/IVs7IF0pKDs/ID8oW1xcd1xcLV0rKSg/IS4qXFwyICkgW147XSspKiQiLCAidHlwZSI6ICJ0ZXh0IiwgIm11bHRpcGxlIjogInJldmVyc2UtcHJveHkiLCAicGF0dGVybiI6ICJeKD8hWzsgXSkoOz8gPyhbXFx3XFwtXSspKD8hLipcXDIgKSBbXjtdKykqJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm5hbWUiOiAiUmV2ZXJzZSBwcm94eSBoZWFkZXJzLWNsaWVudCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBIVFRQIGhlYWRlcnMgdG8gc2VuZCB0byBjbGllbnQgc2VwYXJhdGVkIHdpdGggc2VtaWNvbG9ucyAodmFsdWVzIGZvciBhZGRfaGVhZGVyIGRpcmVjdGl2ZSkuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xOSIsICJtZXRob2QiOiAiZGVmYXVsdCJ9LCAiUkVWRVJTRV9QUk9YWV9CVUZGRVJJTkciOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAieWVzIiwgImhlbHAiOiAiRW5hYmxlIG9yIGRpc2FibGUgYnVmZmVyaW5nIG9mIHJlc3BvbnNlcyBmcm9tIHByb3hpZWQgcmVzb3VyY2UuIiwgImlkIjogInJldmVyc2UtcHJveHktYnVmZmVyaW5nIiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkgYnVmZmVyaW5nIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJtdWx0aXBsZSI6ICJyZXZlcnNlLXByb3h5IiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAieWVzIiwgIm5hbWUiOiAiUmV2ZXJzZSBwcm94eSBidWZmZXJpbmciLCAicHJldl92YWx1ZSI6ICJ5ZXMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkVuYWJsZSBvciBkaXNhYmxlIGJ1ZmZlcmluZyBvZiByZXNwb25zZXMgZnJvbSBwcm94aWVkIHJlc291cmNlLiJ9XSwgImNvbnRhaW5lckNsYXNzIjogInotMTgiLCAibWV0aG9kIjogImRlZmF1bHQifSwgIlJFVkVSU0VfUFJPWFlfS0VFUEFMSVZFIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIm5vIiwgImhlbHAiOiAiRW5hYmxlIG9yIGRpc2FibGUga2VlcGFsaXZlIGNvbm5lY3Rpb25zIHdpdGggdGhlIHByb3hpZWQgcmVzb3VyY2UuIiwgImlkIjogInJldmVyc2UtcHJveHkta2VlcGFsaXZlIiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkga2VlcGFsaXZlIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJtdWx0aXBsZSI6ICJyZXZlcnNlLXByb3h5IiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAibm8iLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IGtlZXBhbGl2ZSIsICJwcmV2X3ZhbHVlIjogIm5vIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJFbmFibGUgb3IgZGlzYWJsZSBrZWVwYWxpdmUgY29ubmVjdGlvbnMgd2l0aCB0aGUgcHJveGllZCByZXNvdXJjZS4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTE3IiwgIm1ldGhvZCI6ICJkZWZhdWx0In0sICJSRVZFUlNFX1BST1hZX0FVVEhfUkVRVUVTVCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJFbmFibGUgYXV0aGVudGljYXRpb24gdXNpbmcgYW4gZXh0ZXJuYWwgcHJvdmlkZXIgKHZhbHVlIG9mIGF1dGhfcmVxdWVzdCBkaXJlY3RpdmUpLiIsICJpZCI6ICJyZXZlcnNlLXByb3h5LWF1dGgtcmVxdWVzdCIsICJsYWJlbCI6ICJSZXZlcnNlIHByb3h5IGF1dGggcmVxdWVzdCIsICJyZWdleCI6ICJeKFxcL1tcXHdcXF0ufjpcXC8/I1xcW0AhJFxcJidcXChcXCkqKyw7PVxcLV0qfG9mZik/JCIsICJ0eXBlIjogInRleHQiLCAibXVsdGlwbGUiOiAicmV2ZXJzZS1wcm94eSIsICJwYXR0ZXJuIjogIl4oXFwvW1xcd1xcXS5+OlxcLz8jXFxbQCEkXFwmJ1xcKFxcKSorLDs9XFwtXSp8b2ZmKT8kIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IGF1dGggcmVxdWVzdCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiRW5hYmxlIGF1dGhlbnRpY2F0aW9uIHVzaW5nIGFuIGV4dGVybmFsIHByb3ZpZGVyICh2YWx1ZSBvZiBhdXRoX3JlcXVlc3QgZGlyZWN0aXZlKS4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTE2IiwgIm1ldGhvZCI6ICJkZWZhdWx0In0sICJSRVZFUlNFX1BST1hZX0FVVEhfUkVRVUVTVF9TSUdOSU5fVVJMIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIlJlZGlyZWN0IGNsaWVudHMgdG8gc2lnbi1pbiBVUkwgd2hlbiB1c2luZyBSRVZFUlNFX1BST1hZX0FVVEhfUkVRVUVTVCAodXNlZCB3aGVuIGF1dGhfcmVxdWVzdCBjYWxsIHJldHVybmVkIDQwMSkuIiwgImlkIjogInJldmVyc2UtcHJveHktYXV0aC1yZXF1ZXN0LXNpZ25pbi11cmwiLCAibGFiZWwiOiAiQXV0aCByZXF1ZXN0IHNpZ25pbiBVUkwiLCAicmVnZXgiOiAiXihodHRwcz86XFwvXFwvW1xcLVxcd0A6JS4rfiM9XStbXFwtXFx3XFwoXFwpIUA6JSsufiM/JlxcLz0kXSopPyQiLCAidHlwZSI6ICJ0ZXh0IiwgIm11bHRpcGxlIjogInJldmVyc2UtcHJveHkiLCAicGF0dGVybiI6ICJeKGh0dHBzPzpcXC9cXC9bXFwtXFx3QDolLit+Iz1dK1tcXC1cXHdcXChcXCkhQDolKy5+Iz8mXFwvPSRdKik/JCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm5hbWUiOiAiQXV0aCByZXF1ZXN0IHNpZ25pbiBVUkwiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlJlZGlyZWN0IGNsaWVudHMgdG8gc2lnbi1pbiBVUkwgd2hlbiB1c2luZyBSRVZFUlNFX1BST1hZX0FVVEhfUkVRVUVTVCAodXNlZCB3aGVuIGF1dGhfcmVxdWVzdCBjYWxsIHJldHVybmVkIDQwMSkuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xNSIsICJtZXRob2QiOiAiZGVmYXVsdCJ9LCAiUkVWRVJTRV9QUk9YWV9BVVRIX1JFUVVFU1RfU0VUIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkxpc3Qgb2YgdmFyaWFibGVzIHRvIHNldCBmcm9tIHRoZSBhdXRoZW50aWNhdGlvbiBwcm92aWRlciwgc2VwYXJhdGVkIHdpdGggc2VtaWNvbG9ucyAodmFsdWVzIG9mIGF1dGhfcmVxdWVzdF9zZXQgZGlyZWN0aXZlcykuIiwgImlkIjogInJldmVyc2UtcHJveHktYXV0aC1yZXF1ZXN0LXNldCIsICJsYWJlbCI6ICJSZXZlcnNlIHByb3h5IGF1dGggcmVxdWVzdCBzZXQiLCAicmVnZXgiOiAiXig/ISA7KSg7PyA/KFxcJFthLXpfXFwtXSspKD8hLipcXDIgKSBbXjtdKykqJCIsICJ0eXBlIjogInRleHQiLCAibXVsdGlwbGUiOiAicmV2ZXJzZS1wcm94eSIsICJwYXR0ZXJuIjogIl4oPyEgOykoOz8gPyhcXCRbYS16X1xcLV0rKSg/IS4qXFwyICkgW147XSspKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJuYW1lIjogIlJldmVyc2UgcHJveHkgYXV0aCByZXF1ZXN0IHNldCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiB2YXJpYWJsZXMgdG8gc2V0IGZyb20gdGhlIGF1dGhlbnRpY2F0aW9uIHByb3ZpZGVyLCBzZXBhcmF0ZWQgd2l0aCBzZW1pY29sb25zICh2YWx1ZXMgb2YgYXV0aF9yZXF1ZXN0X3NldCBkaXJlY3RpdmVzKS4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTE0IiwgIm1ldGhvZCI6ICJkZWZhdWx0In0sICJSRVZFUlNFX1BST1hZX0NPTk5FQ1RfVElNRU9VVCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICI2MHMiLCAiaGVscCI6ICJUaW1lb3V0IHdoZW4gY29ubmVjdGluZyB0byB0aGUgcHJveGllZCByZXNvdXJjZS4iLCAiaWQiOiAicmV2ZXJzZS1wcm94eS1jb25uZWN0LXRpbWVvdXQiLCAibGFiZWwiOiAiUmV2ZXJzZSBwcm94eSBjb25uZWN0IHRpbWVvdXQiLCAicmVnZXgiOiAiXlxcZCsobXM/fFtzaGR3TXldKSQiLCAidHlwZSI6ICJ0ZXh0IiwgIm11bHRpcGxlIjogInJldmVyc2UtcHJveHkiLCAicGF0dGVybiI6ICJeXFxkKyhtcz98W3NoZHdNeV0pJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiNjBzIiwgIm5hbWUiOiAiUmV2ZXJzZSBwcm94eSBjb25uZWN0IHRpbWVvdXQiLCAicHJldl92YWx1ZSI6ICI2MHMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlRpbWVvdXQgd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBwcm94aWVkIHJlc291cmNlLiJ9XSwgImNvbnRhaW5lckNsYXNzIjogInotMTMiLCAibWV0aG9kIjogImRlZmF1bHQifSwgIlJFVkVSU0VfUFJPWFlfUkVBRF9USU1FT1VUIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIjYwcyIsICJoZWxwIjogIlRpbWVvdXQgd2hlbiByZWFkaW5nIGZyb20gdGhlIHByb3hpZWQgcmVzb3VyY2UuIiwgImlkIjogInJldmVyc2UtcHJveHktcmVhZC10aW1lb3V0IiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkgcmVhZCB0aW1lb3V0IiwgInJlZ2V4IjogIl5cXGQrKG1zP3xbc2hkd015XSkkIiwgInR5cGUiOiAidGV4dCIsICJtdWx0aXBsZSI6ICJyZXZlcnNlLXByb3h5IiwgInBhdHRlcm4iOiAiXlxcZCsobXM/fFtzaGR3TXldKSQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjYwcyIsICJuYW1lIjogIlJldmVyc2UgcHJveHkgcmVhZCB0aW1lb3V0IiwgInByZXZfdmFsdWUiOiAiNjBzIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJUaW1lb3V0IHdoZW4gcmVhZGluZyBmcm9tIHRoZSBwcm94aWVkIHJlc291cmNlLiJ9XSwgImNvbnRhaW5lckNsYXNzIjogInotMTIiLCAibWV0aG9kIjogImRlZmF1bHQifSwgIlJFVkVSU0VfUFJPWFlfU0VORF9USU1FT1VUIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIjYwcyIsICJoZWxwIjogIlRpbWVvdXQgd2hlbiBzZW5kaW5nIHRvIHRoZSBwcm94aWVkIHJlc291cmNlLiIsICJpZCI6ICJyZXZlcnNlLXByb3h5LXNlbmQtdGltZW91dCIsICJsYWJlbCI6ICJSZXZlcnNlIHByb3h5IHNlbmQgdGltZW91dCIsICJyZWdleCI6ICJeXFxkKyhtcz98W3NoZHdNeV0pJCIsICJ0eXBlIjogInRleHQiLCAibXVsdGlwbGUiOiAicmV2ZXJzZS1wcm94eSIsICJwYXR0ZXJuIjogIl5cXGQrKG1zP3xbc2hkd015XSkkIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICI2MHMiLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IHNlbmQgdGltZW91dCIsICJwcmV2X3ZhbHVlIjogIjYwcyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVGltZW91dCB3aGVuIHNlbmRpbmcgdG8gdGhlIHByb3hpZWQgcmVzb3VyY2UuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xMSIsICJtZXRob2QiOiAiZGVmYXVsdCJ9LCAiUkVWRVJTRV9QUk9YWV9JTkNMVURFUyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJBZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gdG8gaW5jbHVkZSBpbiB0aGUgbG9jYXRpb24gYmxvY2ssIHNlcGFyYXRlZCB3aXRoIHNwYWNlcy4iLCAiaWQiOiAicmV2ZXJzZS1wcm94eS1pbmNsdWRlcyIsICJsYWJlbCI6ICJSZXZlcnNlIHByb3h5IGluY2x1ZGVzIiwgInJlZ2V4IjogIl4oPyEgKSggPyhcXHcrKSg/IS4qXFxiXFwyXFxiKSkqJCIsICJ0eXBlIjogInRleHQiLCAibXVsdGlwbGUiOiAicmV2ZXJzZS1wcm94eSIsICJwYXR0ZXJuIjogIl4oPyEgKSggPyhcXHcrKSg/IS4qXFxiXFwyXFxiKSkqJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm5hbWUiOiAiUmV2ZXJzZSBwcm94eSBpbmNsdWRlcyIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiQWRkaXRpb25hbCBjb25maWd1cmF0aW9uIHRvIGluY2x1ZGUgaW4gdGhlIGxvY2F0aW9uIGJsb2NrLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xMCIsICJtZXRob2QiOiAiZGVmYXVsdCJ9fX19fSwgeyJpZCI6ICJyZXZlcnNlc2NhbiIsICJzdHJlYW0iOiAieWVzIiwgIm5hbWUiOiAiUmV2ZXJzZSBzY2FuIiwgImRlc2NyaXB0aW9uIjogIlNjYW4gY2xpZW50cyBwb3J0cyB0byBkZXRlY3QgcHJveGllcyBvciBzZXJ2ZXJzLiIsICJ2ZXJzaW9uIjogIjEuMCIsICJ0eXBlIjogImNvcmUiLCAibWV0aG9kIjogIm1hbnVhbCIsICJwYWdlIjogdHJ1ZSwgInNldHRpbmdzIjogeyJVU0VfUkVWRVJTRV9TQ0FOIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIm5vIiwgImhlbHAiOiAiRW5hYmxlIHNjYW5uaW5nIG9mIGNsaWVudHMgcG9ydHMgYW5kIGRlbnkgYWNjZXNzIGlmIG9uZSBpcyBvcGVuZWQuIiwgImlkIjogInVzZS1yZXZlcnNlLXNjYW4iLCAibGFiZWwiOiAiUmV2ZXJzZSBzY2FuIiwgInJlZ2V4IjogIl4obm98eWVzKSQiLCAidHlwZSI6ICJjaGVjayIsICJwYXR0ZXJuIjogIl4obm98eWVzKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIm5vIiwgIm5hbWUiOiAiUmV2ZXJzZSBzY2FuIiwgInByZXZfdmFsdWUiOiAibm8iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkVuYWJsZSBzY2FubmluZyBvZiBjbGllbnRzIHBvcnRzIGFuZCBkZW55IGFjY2VzcyBpZiBvbmUgaXMgb3BlbmVkLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMiJ9LCAiUkVWRVJTRV9TQ0FOX1BPUlRTIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIjIyIDgwIDQ0MyAzMTI4IDgwMDAgODA4MCIsICJoZWxwIjogIkxpc3Qgb2YgcG9ydCB0byBzY2FuIHdoZW4gdXNpbmcgcmV2ZXJzZSBzY2FuIGZlYXR1cmUuIiwgImlkIjogInJldmVyc2Utc2Nhbi1wb3J0cyIsICJsYWJlbCI6ICJSZXZlcnNlIHNjYW4gcG9ydHMiLCAicmVnZXgiOiAiXi4qJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeLiokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIyMiA4MCA0NDMgMzEyOCA4MDAwIDgwODAiLCAibmFtZSI6ICJSZXZlcnNlIHNjYW4gcG9ydHMiLCAicHJldl92YWx1ZSI6ICIyMiA4MCA0NDMgMzEyOCA4MDAwIDgwODAiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkxpc3Qgb2YgcG9ydCB0byBzY2FuIHdoZW4gdXNpbmcgcmV2ZXJzZSBzY2FuIGZlYXR1cmUuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xIn0sICJSRVZFUlNFX1NDQU5fVElNRU9VVCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICI1MDAiLCAiaGVscCI6ICJTcGVjaWZ5IHRoZSBtYXhpbXVtIHRpbWVvdXQgKGluIG1zKSB3aGVuIHNjYW5uaW5nIGEgcG9ydC4iLCAiaWQiOiAicmV2ZXJzZS1zY2FuLXRpbWVvdXQiLCAibGFiZWwiOiAiUmV2ZXJzZSBzY2FuIHRpbWVvdXQiLCAicmVnZXgiOiAiXi4qJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeLiokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICI1MDAiLCAibmFtZSI6ICJSZXZlcnNlIHNjYW4gdGltZW91dCIsICJwcmV2X3ZhbHVlIjogIjUwMCIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiU3BlY2lmeSB0aGUgbWF4aW11bSB0aW1lb3V0IChpbiBtcykgd2hlbiBzY2FubmluZyBhIHBvcnQuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0wIn19LCAiY2hlY2tzdW0iOiBudWxsfSwgeyJpZCI6ICJzZWxmc2lnbmVkIiwgInN0cmVhbSI6ICJ5ZXMiLCAibmFtZSI6ICJTZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZSIsICJkZXNjcmlwdGlvbiI6ICJHZW5lcmF0ZSBzZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZS4iLCAidmVyc2lvbiI6ICIxLjAiLCAidHlwZSI6ICJjb3JlIiwgIm1ldGhvZCI6ICJtYW51YWwiLCAicGFnZSI6IGZhbHNlLCAic2V0dGluZ3MiOiB7IkdFTkVSQVRFX1NFTEZfU0lHTkVEX1NTTCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJubyIsICJoZWxwIjogIkdlbmVyYXRlIGFuZCB1c2Ugc2VsZi1zaWduZWQgY2VydGlmaWNhdGUuIiwgImlkIjogImdlbmVyYXRlLXNlbGYtc2lnbmVkLXNzbCIsICJsYWJlbCI6ICJBY3RpdmF0ZSBzZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZSIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJubyIsICJuYW1lIjogIkFjdGl2YXRlIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlIiwgInByZXZfdmFsdWUiOiAibm8iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkdlbmVyYXRlIGFuZCB1c2Ugc2VsZi1zaWduZWQgY2VydGlmaWNhdGUuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yIn0sICJTRUxGX1NJR05FRF9TU0xfRVhQSVJZIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIjM2NSIsICJoZWxwIjogIlNlbGYtc2lnbmVkIGNlcnRpZmljYXRlIGV4cGlyeSBpbiBkYXlzLiIsICJpZCI6ICJzZWxmLXNpZ25lZC1zc2wtZXhwaXJ5IiwgImxhYmVsIjogIkNlcnRpZmljYXRlIGV4cGlyeSIsICJyZWdleCI6ICJeXFxkKyQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXlxcZCskIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIzNjUiLCAibmFtZSI6ICJDZXJ0aWZpY2F0ZSBleHBpcnkiLCAicHJldl92YWx1ZSI6ICIzNjUiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlNlbGYtc2lnbmVkIGNlcnRpZmljYXRlIGV4cGlyeSBpbiBkYXlzLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMSJ9LCAiU0VMRl9TSUdORURfU1NMX1NVQkoiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiL0NOPXd3dy5leGFtcGxlLmNvbS8iLCAiaGVscCI6ICJTZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZSBzdWJqZWN0LiIsICJpZCI6ICJzZWxmLXNpZ25lZC1zc2wtc3ViaiIsICJsYWJlbCI6ICJDZXJ0aWZpY2F0ZSBzdWJqZWN0IiwgInJlZ2V4IjogIl4vQ049W14sXSskIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4vQ049W14sXSskIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIvQ049d3d3LmV4YW1wbGUuY29tLyIsICJuYW1lIjogIkNlcnRpZmljYXRlIHN1YmplY3QiLCAicHJldl92YWx1ZSI6ICIvQ049d3d3LmV4YW1wbGUuY29tLyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiU2VsZi1zaWduZWQgY2VydGlmaWNhdGUgc3ViamVjdC4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTAifX0sICJjaGVja3N1bSI6IG51bGx9LCB7ImlkIjogInVpIiwgInN0cmVhbSI6ICJubyIsICJuYW1lIjogIlVJIiwgImRlc2NyaXB0aW9uIjogIkludGVncmF0ZSBlYXNpbHkgdGhlIEJ1bmtlcldlYiBVSS4iLCAidmVyc2lvbiI6ICIxLjAiLCAidHlwZSI6ICJjb3JlIiwgIm1ldGhvZCI6ICJtYW51YWwiLCAicGFnZSI6IGZhbHNlLCAic2V0dGluZ3MiOiB7IlVTRV9VSSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJubyIsICJoZWxwIjogIlVzZSBVSSIsICJpZCI6ICJ1c2UtdWkiLCAibGFiZWwiOiAiVXNlIFVJIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIm5vIiwgIm5hbWUiOiAiVXNlIFVJIiwgInByZXZfdmFsdWUiOiAibm8iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlVzZSBVSSJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMCJ9fSwgImNoZWNrc3VtIjogbnVsbH0sIHsiaWQiOiAid2hpdGVsaXN0IiwgInN0cmVhbSI6ICJwYXJ0aWFsIiwgIm5hbWUiOiAiV2hpdGVsaXN0IiwgImRlc2NyaXB0aW9uIjogIkFsbG93IGFjY2VzcyBiYXNlZCBvbiBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgSVAvbmV0d29yay9yRE5TL0FTTiB3aGl0ZWxpc3RzLiIsICJ2ZXJzaW9uIjogIjEuMCIsICJ0eXBlIjogImNvcmUiLCAibWV0aG9kIjogIm1hbnVhbCIsICJwYWdlIjogdHJ1ZSwgInNldHRpbmdzIjogeyJVU0VfV0hJVEVMSVNUIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogInllcyIsICJoZWxwIjogIkFjdGl2YXRlIHdoaXRlbGlzdCBmZWF0dXJlLiIsICJpZCI6ICJ1c2Utd2hpdGVsaXN0IiwgImxhYmVsIjogIkFjdGl2YXRlIHdoaXRlbGlzdGluZyIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogdHJ1ZSwgInZhbHVlIjogIm5vIiwgIm5hbWUiOiAiQWN0aXZhdGUgd2hpdGVsaXN0aW5nIiwgInByZXZfdmFsdWUiOiAieWVzIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAidHJlc3Bhc3MiLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tZXRob2RfZGlzYWJsZWQifSwgeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkFjdGl2YXRlIHdoaXRlbGlzdCBmZWF0dXJlLiJ9XSwgIm1ldGhvZCI6ICJzY2hlZHVsZXIiLCAiY29udGFpbmVyQ2xhc3MiOiAiei02In0sICJXSElURUxJU1RfSVAiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiMjAuMTkxLjQ1LjIxMiA0MC44OC4yMS4yMzUgNDAuNzYuMTczLjE1MSA0MC43Ni4xNjMuNyAyMC4xODUuNzkuNDcgNTIuMTQyLjI2LjE3NSAyMC4xODUuNzkuMTUgNTIuMTQyLjI0LjE0OSA0MC43Ni4xNjIuMjA4IDQwLjc2LjE2My4yMyA0MC43Ni4xNjIuMTkxIDQwLjc2LjE2Mi4yNDciLCAiaGVscCI6ICJMaXN0IG9mIElQL25ldHdvcmssIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgdG8gcHV0IGludG8gdGhlIHdoaXRlbGlzdC4iLCAiaWQiOiAid2hpdGVsaXN0LWlwIiwgImxhYmVsIjogIldoaXRlbGlzdCBJUC9uZXR3b3JrIiwgInJlZ2V4IjogIl4oPyEgKSggKigoKFxcYjI1WzAtNV18XFxiMlswLTRdXFxkfFxcYlswMV0/XFxkXFxkPykoXFwuKDI1WzAtNV18MlswLTRdXFxkfFswMV0/XFxkXFxkPykpezN9KShcXC8oWzEtMl1bMC05XT98M1swLTJdP3xbMDQtOV0pKT98KChbMC05YS1mQS1GXXsxLDR9Oil7N31bMC05YS1mQS1GXXsxLDR9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw3fTp8KFswLTlhLWZBLUZdezEsNH06KXsxLDZ9OlswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDV9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDJ9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw0fSg6WzAtOWEtZkEtRl17MSw0fSl7MSwzfXwoWzAtOWEtZkEtRl17MSw0fTopezEsM30oOlswLTlhLWZBLUZdezEsNH0pezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDJ9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDV9fFswLTlhLWZBLUZdezEsNH06KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw2fSl8OigoOlswLTlhLWZBLUZdezEsNH0pezEsN318Oil8ZmU4MDooOlswLTlhLWZBLUZdWnswLDR9KXswLDR9JVswLTlhLXpBLVpdK3w6OihmZmZmKDowezEsNH0pPzopPygoMjVbMC01XXwoMlswLTRdfDE/XFxkKT9cXGQpXFwuKXszfSgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZCl8KFswLTlhLWZBLUZdezEsNH06KXsxLDR9OigoMjVbMC01XXwoMlswLTRdfDE/XFxkKT9cXGQpXFwuKXszfSgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZCkpKFxcLygxMlswLThdfDFbMDFdWzAtOV18WzAtOV1bMC05XT8pKT8pKD8hLipcXERcXDIoW15cXGRcXC9dfCQpKSAqKSokIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4oPyEgKSggKigoKFxcYjI1WzAtNV18XFxiMlswLTRdXFxkfFxcYlswMV0/XFxkXFxkPykoXFwuKDI1WzAtNV18MlswLTRdXFxkfFswMV0/XFxkXFxkPykpezN9KShcXC8oWzEtMl1bMC05XT98M1swLTJdP3xbMDQtOV0pKT98KChbMC05YS1mQS1GXXsxLDR9Oil7N31bMC05YS1mQS1GXXsxLDR9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw3fTp8KFswLTlhLWZBLUZdezEsNH06KXsxLDZ9OlswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDV9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDJ9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw0fSg6WzAtOWEtZkEtRl17MSw0fSl7MSwzfXwoWzAtOWEtZkEtRl17MSw0fTopezEsM30oOlswLTlhLWZBLUZdezEsNH0pezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDJ9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDV9fFswLTlhLWZBLUZdezEsNH06KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw2fSl8OigoOlswLTlhLWZBLUZdezEsNH0pezEsN318Oil8ZmU4MDooOlswLTlhLWZBLUZdWnswLDR9KXswLDR9JVswLTlhLXpBLVpdK3w6OihmZmZmKDowezEsNH0pPzopPygoMjVbMC01XXwoMlswLTRdfDE/XFxkKT9cXGQpXFwuKXszfSgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZCl8KFswLTlhLWZBLUZdezEsNH06KXsxLDR9OigoMjVbMC01XXwoMlswLTRdfDE/XFxkKT9cXGQpXFwuKXszfSgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZCkpKFxcLygxMlswLThdfDFbMDFdWzAtOV18WzAtOV1bMC05XT8pKT8pKD8hLipcXERcXDIoW15cXGRcXC9dfCQpKSAqKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIyMC4xOTEuNDUuMjEyIDQwLjg4LjIxLjIzNSA0MC43Ni4xNzMuMTUxIDQwLjc2LjE2My43IDIwLjE4NS43OS40NyA1Mi4xNDIuMjYuMTc1IDIwLjE4NS43OS4xNSA1Mi4xNDIuMjQuMTQ5IDQwLjc2LjE2Mi4yMDggNDAuNzYuMTYzLjIzIDQwLjc2LjE2Mi4xOTEgNDAuNzYuMTYyLjI0NyIsICJuYW1lIjogIldoaXRlbGlzdCBJUC9uZXR3b3JrIiwgInByZXZfdmFsdWUiOiAiMjAuMTkxLjQ1LjIxMiA0MC44OC4yMS4yMzUgNDAuNzYuMTczLjE1MSA0MC43Ni4xNjMuNyAyMC4xODUuNzkuNDcgNTIuMTQyLjI2LjE3NSAyMC4xODUuNzkuMTUgNTIuMTQyLjI0LjE0OSA0MC43Ni4xNjIuMjA4IDQwLjc2LjE2My4yMyA0MC43Ni4xNjIuMTkxIDQwLjc2LjE2Mi4yNDciLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkxpc3Qgb2YgSVAvbmV0d29yaywgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCB0byBwdXQgaW50byB0aGUgd2hpdGVsaXN0LiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotNSJ9LCAiV0hJVEVMSVNUX1JETlMiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiLmdvb2dsZS5jb20gLmdvb2dsZWJvdC5jb20gLnlhbmRleC5ydSAueWFuZGV4Lm5ldCAueWFuZGV4LmNvbSAuc2VhcmNoLm1zbi5jb20gLmJhaWR1LmNvbSAuYmFpZHUuanAgLmNyYXdsLnlhaG9vLm5ldCAuZndkLmxpbmtlZGluLmNvbSAudHdpdHRlci5jb20gLnR3dHRyLmNvbSAuZGlzY29yZC5jb20iLCAiaGVscCI6ICJMaXN0IG9mIHJldmVyc2UgRE5TIHN1ZmZpeGVzLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIHRvIHdoaXRlbGlzdC4iLCAiaWQiOiAid2hpdGVsaXN0LXJkbnMiLCAibGFiZWwiOiAiV2hpdGVsaXN0IHJldmVyc2UgRE5TIiwgInJlZ2V4IjogIl4oICooKFteIF0rKSg/IS4qXFwzKCB8JCkpKSAqKSokIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4oICooKFteIF0rKSg/IS4qXFwzKCB8JCkpKSAqKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIuZ29vZ2xlLmNvbSAuZ29vZ2xlYm90LmNvbSAueWFuZGV4LnJ1IC55YW5kZXgubmV0IC55YW5kZXguY29tIC5zZWFyY2gubXNuLmNvbSAuYmFpZHUuY29tIC5iYWlkdS5qcCAuY3Jhd2wueWFob28ubmV0IC5md2QubGlua2VkaW4uY29tIC50d2l0dGVyLmNvbSAudHd0dHIuY29tIC5kaXNjb3JkLmNvbSIsICJuYW1lIjogIldoaXRlbGlzdCByZXZlcnNlIEROUyIsICJwcmV2X3ZhbHVlIjogIi5nb29nbGUuY29tIC5nb29nbGVib3QuY29tIC55YW5kZXgucnUgLnlhbmRleC5uZXQgLnlhbmRleC5jb20gLnNlYXJjaC5tc24uY29tIC5iYWlkdS5jb20gLmJhaWR1LmpwIC5jcmF3bC55YWhvby5uZXQgLmZ3ZC5saW5rZWRpbi5jb20gLnR3aXR0ZXIuY29tIC50d3R0ci5jb20gLmRpc2NvcmQuY29tIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJMaXN0IG9mIHJldmVyc2UgRE5TIHN1ZmZpeGVzLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIHRvIHdoaXRlbGlzdC4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTQifSwgIldISVRFTElTVF9SRE5TX0dMT0JBTCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJ5ZXMiLCAiaGVscCI6ICJPbmx5IHBlcmZvcm0gUkROUyB3aGl0ZWxpc3QgY2hlY2tzIG9uIGdsb2JhbCBJUCBhZGRyZXNzZXMuIiwgImlkIjogIndoaXRlbGlzdC1yZG5zLWdsb2JhbCIsICJsYWJlbCI6ICJXaGl0ZWxpc3QgcmV2ZXJzZSBETlMgZ2xvYmFsIElQcyIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJ5ZXMiLCAibmFtZSI6ICJXaGl0ZWxpc3QgcmV2ZXJzZSBETlMgZ2xvYmFsIElQcyIsICJwcmV2X3ZhbHVlIjogInllcyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiT25seSBwZXJmb3JtIFJETlMgd2hpdGVsaXN0IGNoZWNrcyBvbiBnbG9iYWwgSVAgYWRkcmVzc2VzLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMyJ9LCAiV0hJVEVMSVNUX0FTTiI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIzMjkzNCIsICJoZWxwIjogIkxpc3Qgb2YgQVNOIG51bWJlcnMsIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgdG8gd2hpdGVsaXN0LiIsICJpZCI6ICJ3aGl0ZWxpc3QtYXNuIiwgImxhYmVsIjogIldoaXRlbGlzdCBBU04iLCAicmVnZXgiOiAiXl4oICooKEFTTj8pPyhcXGQrKVxcYig/IS4qW1NOIF1cXDRcXGIpKSAqKSokIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl5eKCAqKChBU04/KT8oXFxkKylcXGIoPyEuKltTTiBdXFw0XFxiKSkgKikqJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiMzI5MzQiLCAibmFtZSI6ICJXaGl0ZWxpc3QgQVNOIiwgInByZXZfdmFsdWUiOiAiMzI5MzQiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkxpc3Qgb2YgQVNOIG51bWJlcnMsIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgdG8gd2hpdGVsaXN0LiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMiJ9LCAiV0hJVEVMSVNUX1VTRVJfQUdFTlQiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiTGlzdCBvZiBVc2VyLUFnZW50IChQQ1JFIHJlZ2V4KSwgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCB0byB3aGl0ZWxpc3QuIiwgImlkIjogIndoaXRlbGlzdC11c2VyLWFnZW50IiwgImxhYmVsIjogIldoaXRlbGlzdCBVc2VyLUFnZW50IiwgInJlZ2V4IjogIl4uKiQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXi4qJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm5hbWUiOiAiV2hpdGVsaXN0IFVzZXItQWdlbnQiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkxpc3Qgb2YgVXNlci1BZ2VudCAoUENSRSByZWdleCksIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgdG8gd2hpdGVsaXN0LiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMSJ9LCAiV0hJVEVMSVNUX1VSSSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJMaXN0IG9mIFVSSSAoUENSRSByZWdleCksIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgdG8gd2hpdGVsaXN0LiIsICJpZCI6ICJ3aGl0ZWxpc3QtdXJpIiwgImxhYmVsIjogIldoaXRlbGlzdCBVUkkiLCAicmVnZXgiOiAiXiggKiguKikoPyEuKlxcMig/IS4pKSAqKSokIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4oICooLiopKD8hLipcXDIoPyEuKSkgKikqJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm5hbWUiOiAiV2hpdGVsaXN0IFVSSSIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBVUkkgKFBDUkUgcmVnZXgpLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIHRvIHdoaXRlbGlzdC4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTAifX0sICJjaGVja3N1bSI6IG51bGx9XSwgImxvdyI6IFt7ImlkIjogImdlbmVyYWwiLCAic3RyZWFtIjogInBhcnRpYWwiLCAibmFtZSI6ICJHZW5lcmFsIiwgImRlc2NyaXB0aW9uIjogIlRoZSBnZW5lcmFsIHNldHRpbmdzIGZvciB0aGUgc2VydmVyIiwgInZlcnNpb24iOiAiMC4xIiwgInR5cGUiOiAiY29yZSIsICJtZXRob2QiOiAibWFudWFsIiwgInBhZ2UiOiBmYWxzZSwgInNldHRpbmdzIjogeyJTRVJWRVJfTkFNRSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJ3d3cuZXhhbXBsZS5jb20iLCAiaGVscCI6ICJMaXN0IG9mIHRoZSB2aXJ0dWFsIGhvc3RzIHNlcnZlZCBieSBidW5rZXJ3ZWIuIiwgImlkIjogInNlcnZlci1uYW1lIiwgImxhYmVsIjogIlNlcnZlciBuYW1lIiwgInJlZ2V4IjogIl4oKFxcU3sxLDI1NX0pKD8hLipcXHNcXDIoXFxzfCQpKSk/KFxccyhcXFN7MSwyNTV9KSg/IS4qXFxzXFw1KFxcc3wkKSkpKiQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXigoXFxTezEsMjU1fSkoPyEuKlxcc1xcMihcXHN8JCkpKT8oXFxzKFxcU3sxLDI1NX0pKD8hLipcXHNcXDUoXFxzfCQpKSkqJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiYXBwMS5leGFtcGxlLmNvbSIsICJuYW1lIjogIlNlcnZlciBuYW1lIiwgInByZXZfdmFsdWUiOiAid3d3LmV4YW1wbGUuY29tIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJMaXN0IG9mIHRoZSB2aXJ0dWFsIGhvc3RzIHNlcnZlZCBieSBidW5rZXJ3ZWIuIn1dLCAibWV0aG9kIjogInVpIiwgImNvbnRhaW5lckNsYXNzIjogInotNiJ9LCAiU0VSVkVSX1RZUEUiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiaHR0cCIsICJoZWxwIjogIlNlcnZlciB0eXBlIDogaHR0cCBvciBzdHJlYW0uIiwgImlkIjogInNlcnZlci10eXBlIiwgImxhYmVsIjogIlNlcnZlciB0eXBlIiwgInJlZ2V4IjogIl4oaHR0cHxzdHJlYW0pJCIsICJ0eXBlIjogInNlbGVjdCIsICJwYXR0ZXJuIjogIl4oaHR0cHxzdHJlYW0pJCIsICJpbnBUeXBlIjogInNlbGVjdCIsICJ2YWx1ZXMiOiBbImh0dHAiLCAic3RyZWFtIl0sICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogImh0dHAiLCAibmFtZSI6ICJTZXJ2ZXIgdHlwZSIsICJwcmV2X3ZhbHVlIjogImh0dHAiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlNlcnZlciB0eXBlIDogaHR0cCBvciBzdHJlYW0uIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei01In0sICJMSVNURU5fU1RSRUFNIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogInllcyIsICJoZWxwIjogIkVuYWJsZSBsaXN0ZW5pbmcgZm9yIG5vbi1zc2wgKHBhc3N0aHJvdWdoKS4iLCAiaWQiOiAibGlzdGVuLXN0cmVhbSIsICJsYWJlbCI6ICJMaXN0ZW4gc3RyZWFtIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogInllcyIsICJuYW1lIjogIkxpc3RlbiBzdHJlYW0iLCAicHJldl92YWx1ZSI6ICJ5ZXMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkVuYWJsZSBsaXN0ZW5pbmcgZm9yIG5vbi1zc2wgKHBhc3N0aHJvdWdoKS4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTQifSwgIkxJU1RFTl9TVFJFQU1fUE9SVCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIxMzM3IiwgImhlbHAiOiAiTGlzdGVuaW5nIHBvcnQgZm9yIG5vbi1zc2wgKHBhc3N0aHJvdWdoKS4iLCAiaWQiOiAibGlzdGVuLXN0cmVhbS1wb3J0IiwgImxhYmVsIjogIkxpc3RlbiBzdHJlYW0gcG9ydCIsICJyZWdleCI6ICJeWzAtOV0rJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeWzAtOV0rJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiMTMzNyIsICJuYW1lIjogIkxpc3RlbiBzdHJlYW0gcG9ydCIsICJwcmV2X3ZhbHVlIjogIjEzMzciLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkxpc3RlbmluZyBwb3J0IGZvciBub24tc3NsIChwYXNzdGhyb3VnaCkuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0zIn0sICJMSVNURU5fU1RSRUFNX1BPUlRfU1NMIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIjQyNDIiLCAiaGVscCI6ICJMaXN0ZW5pbmcgcG9ydCBmb3Igc3NsIChwYXNzdGhyb3VnaCkuIiwgImlkIjogImxpc3Rlbi1zdHJlYW0tcG9ydC1zc2wiLCAibGFiZWwiOiAiTGlzdGVuIHN0cmVhbSBwb3J0IHNzbCIsICJyZWdleCI6ICJeWzAtOV0rJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeWzAtOV0rJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiNDI0MiIsICJuYW1lIjogIkxpc3RlbiBzdHJlYW0gcG9ydCBzc2wiLCAicHJldl92YWx1ZSI6ICI0MjQyIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJMaXN0ZW5pbmcgcG9ydCBmb3Igc3NsIChwYXNzdGhyb3VnaCkuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yIn0sICJVU0VfVURQIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIm5vIiwgImhlbHAiOiAiVURQIGxpc3RlbiBpbnN0ZWFkIG9mIFRDUCAoc3RyZWFtKS4iLCAiaWQiOiAidXNlLXVkcCIsICJsYWJlbCI6ICJMaXN0ZW4gVURQIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIm5vIiwgIm5hbWUiOiAiTGlzdGVuIFVEUCIsICJwcmV2X3ZhbHVlIjogIm5vIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJVRFAgbGlzdGVuIGluc3RlYWQgb2YgVENQIChzdHJlYW0pLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMSJ9LCAiSVNfRFJBRlQiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAibm8iLCAiaGVscCI6ICJJbnRlcm5hbCB1c2UgOiBzZXQgdG8geWVzIHdoZW4gdGhlIHNlcnZpY2UgaXMgaW4gZHJhZnQgbW9kZS4iLCAiaWQiOiAiaW50ZXJuYWwtdXNlLWRyYWZ0IiwgImxhYmVsIjogImludGVybmFsIHVzZSBkcmFmdCIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJubyIsICJuYW1lIjogImludGVybmFsIHVzZSBkcmFmdCIsICJwcmV2X3ZhbHVlIjogIm5vIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJJbnRlcm5hbCB1c2UgOiBzZXQgdG8geWVzIHdoZW4gdGhlIHNlcnZpY2UgaXMgaW4gZHJhZnQgbW9kZS4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTAifX0sICJjaGVja3N1bSI6IG51bGx9LCB7ImlkIjogImFudGlib3QiLCAic3RyZWFtIjogIm5vIiwgIm5hbWUiOiAiQW50aWJvdCIsICJkZXNjcmlwdGlvbiI6ICJCb3QgZGV0ZWN0aW9uIGJ5IHVzaW5nIGEgY2hhbGxlbmdlLiIsICJ2ZXJzaW9uIjogIjEuMCIsICJ0eXBlIjogImNvcmUiLCAibWV0aG9kIjogIm1hbnVhbCIsICJwYWdlIjogdHJ1ZSwgInNldHRpbmdzIjogeyJVU0VfQU5USUJPVCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJubyIsICJoZWxwIjogIkFjdGl2YXRlIGFudGlib3QgZmVhdHVyZS4iLCAiaWQiOiAidXNlLWFudGlib3QiLCAibGFiZWwiOiAiQW50aWJvdCBjaGFsbGVuZ2UiLCAicmVnZXgiOiAiXihub3xjb29raWV8amF2YXNjcmlwdHxjYXB0Y2hhfHJlY2FwdGNoYXxoY2FwdGNoYXx0dXJuc3RpbGUpJCIsICJ0eXBlIjogInNlbGVjdCIsICJwYXR0ZXJuIjogIl4obm98Y29va2llfGphdmFzY3JpcHR8Y2FwdGNoYXxyZWNhcHRjaGF8aGNhcHRjaGF8dHVybnN0aWxlKSQiLCAiaW5wVHlwZSI6ICJzZWxlY3QiLCAidmFsdWVzIjogWyJjYXB0Y2hhIiwgImNvb2tpZSIsICJoY2FwdGNoYSIsICJqYXZhc2NyaXB0IiwgIm5vIiwgInJlY2FwdGNoYSIsICJ0dXJuc3RpbGUiXSwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAieWVzIiwgIm5hbWUiOiAiQW50aWJvdCBjaGFsbGVuZ2UiLCAicHJldl92YWx1ZSI6ICJubyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiQWN0aXZhdGUgYW50aWJvdCBmZWF0dXJlLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMTAifSwgIkFOVElCT1RfVVJJIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIi9jaGFsbGVuZ2UiLCAiaGVscCI6ICJVbnVzZWQgVVJJIHRoYXQgY2xpZW50cyB3aWxsIGJlIHJlZGlyZWN0ZWQgdG8gdG8gc29sdmUgdGhlIGNoYWxsZW5nZS4iLCAiaWQiOiAiYW50aWJvdC11cmkiLCAibGFiZWwiOiAiQW50aWJvdCBVUkwiLCAicmVnZXgiOiAiXlxcL1tcXHdcXF0ufjpcXC8/I1xcW0AhJFxcJidcXChcXCkqKyw7PVxcLV0qJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeXFwvW1xcd1xcXS5+OlxcLz8jXFxbQCEkXFwmJ1xcKFxcKSorLDs9XFwtXSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIvY2hhbGxlbmdlIiwgIm5hbWUiOiAiQW50aWJvdCBVUkwiLCAicHJldl92YWx1ZSI6ICIvY2hhbGxlbmdlIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJVbnVzZWQgVVJJIHRoYXQgY2xpZW50cyB3aWxsIGJlIHJlZGlyZWN0ZWQgdG8gdG8gc29sdmUgdGhlIGNoYWxsZW5nZS4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTkifSwgIkFOVElCT1RfVElNRV9SRVNPTFZFIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIjYwIiwgImhlbHAiOiAiTWF4aW11bSB0aW1lIChpbiBzZWNvbmRzKSBjbGllbnRzIGhhdmUgdG8gcmVzb2x2ZSB0aGUgY2hhbGxlbmdlLiBPbmNlIHRoaXMgdGltZSBoYXMgcGFzc2VkLCBhIG5ldyBjaGFsbGVuZ2Ugd2lsbCBiZSBnZW5lcmF0ZWQuIiwgImlkIjogImFudGlib3QtdGltZS1yZXNvbHZlIiwgImxhYmVsIjogIlRpbWUgdG8gcmVzb2x2ZSIsICJyZWdleCI6ICJeWzAtOV0rJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeWzAtOV0rJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiNjAiLCAibmFtZSI6ICJUaW1lIHRvIHJlc29sdmUiLCAicHJldl92YWx1ZSI6ICI2MCIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTWF4aW11bSB0aW1lIChpbiBzZWNvbmRzKSBjbGllbnRzIGhhdmUgdG8gcmVzb2x2ZSB0aGUgY2hhbGxlbmdlLiBPbmNlIHRoaXMgdGltZSBoYXMgcGFzc2VkLCBhIG5ldyBjaGFsbGVuZ2Ugd2lsbCBiZSBnZW5lcmF0ZWQuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei04In0sICJBTlRJQk9UX1RJTUVfVkFMSUQiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiODY0MDAiLCAiaGVscCI6ICJNYXhpbXVtIHZhbGlkaXR5IHRpbWUgb2Ygc29sdmVkIGNoYWxsZW5nZXMuIE9uY2UgdGhpcyB0aW1lIGhhcyBwYXNzZWQsIGNsaWVudHMgd2lsbCBuZWVkIHRvIHJlc29sdmUgYSBuZXcgb25lLiIsICJpZCI6ICJhbnRpYm90LXRpbWUtdmFsaWQiLCAibGFiZWwiOiAiVGltZSB2YWxpZCIsICJyZWdleCI6ICJeWzAtOV0rJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeWzAtOV0rJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiODY0MDAiLCAibmFtZSI6ICJUaW1lIHZhbGlkIiwgInByZXZfdmFsdWUiOiAiODY0MDAiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIk1heGltdW0gdmFsaWRpdHkgdGltZSBvZiBzb2x2ZWQgY2hhbGxlbmdlcy4gT25jZSB0aGlzIHRpbWUgaGFzIHBhc3NlZCwgY2xpZW50cyB3aWxsIG5lZWQgdG8gcmVzb2x2ZSBhIG5ldyBvbmUuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei03In0sICJBTlRJQk9UX1JFQ0FQVENIQV9TQ09SRSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIwLjciLCAiaGVscCI6ICJNaW5pbXVtIHNjb3JlIHJlcXVpcmVkIGZvciByZUNBUFRDSEEgY2hhbGxlbmdlLiIsICJpZCI6ICJhbnRpYm90LXJlY2FwdGNoYS1zY29yZSIsICJsYWJlbCI6ICJyZUNBUFRDSEEgc2NvcmUiLCAicmVnZXgiOiAiXigwXFwuWzEtOV18MVxcLjApJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeKDBcXC5bMS05XXwxXFwuMCkkIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIwLjciLCAibmFtZSI6ICJyZUNBUFRDSEEgc2NvcmUiLCAicHJldl92YWx1ZSI6ICIwLjciLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIk1pbmltdW0gc2NvcmUgcmVxdWlyZWQgZm9yIHJlQ0FQVENIQSBjaGFsbGVuZ2UuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei02In0sICJBTlRJQk9UX1JFQ0FQVENIQV9TSVRFS0VZIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIlNpdGVrZXkgZm9yIHJlQ0FQVENIQSBjaGFsbGVuZ2UuIiwgImlkIjogImFudGlib3QtcmVjYXB0Y2hhLXNpdGVrZXkiLCAibGFiZWwiOiAicmVDQVBUQ0hBIHNpdGVrZXkiLCAicmVnZXgiOiAiXltcXHdcXC1dKiQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXltcXHdcXC1dKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJuYW1lIjogInJlQ0FQVENIQSBzaXRla2V5IiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJTaXRla2V5IGZvciByZUNBUFRDSEEgY2hhbGxlbmdlLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotNSJ9LCAiQU5USUJPVF9SRUNBUFRDSEFfU0VDUkVUIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIlNlY3JldCBmb3IgcmVDQVBUQ0hBIGNoYWxsZW5nZS4iLCAiaWQiOiAiYW50aWJvdC1yZWNhcHRjaGEtc2VjcmV0IiwgImxhYmVsIjogInJlQ0FQVENIQSBzZWNyZXQiLCAicmVnZXgiOiAiXltcXHdcXC1dKiQiLCAidHlwZSI6ICJwYXNzd29yZCIsICJwYXR0ZXJuIjogIl5bXFx3XFwtXSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibmFtZSI6ICJyZUNBUFRDSEEgc2VjcmV0IiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJTZWNyZXQgZm9yIHJlQ0FQVENIQSBjaGFsbGVuZ2UuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei00In0sICJBTlRJQk9UX0hDQVBUQ0hBX1NJVEVLRVkiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiU2l0ZWtleSBmb3IgaENhcHRjaGEgY2hhbGxlbmdlLiIsICJpZCI6ICJhbnRpYm90LWhjYXB0Y2hhLXNpdGVrZXkiLCAibGFiZWwiOiAiaENhcHRjaGEgc2l0ZWtleSIsICJyZWdleCI6ICJeW2EtekEtWjAtOVxcLV0qJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeW2EtekEtWjAtOVxcLV0qJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm5hbWUiOiAiaENhcHRjaGEgc2l0ZWtleSIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiU2l0ZWtleSBmb3IgaENhcHRjaGEgY2hhbGxlbmdlLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMyJ9LCAiQU5USUJPVF9IQ0FQVENIQV9TRUNSRVQiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiU2VjcmV0IGZvciBoQ2FwdGNoYSBjaGFsbGVuZ2UuIiwgImlkIjogImFudGlib3QtaGNhcHRjaGEtc2VjcmV0IiwgImxhYmVsIjogImhDYXB0Y2hhIHNlY3JldCIsICJyZWdleCI6ICJeXFx3KiQiLCAidHlwZSI6ICJwYXNzd29yZCIsICJwYXR0ZXJuIjogIl5cXHcqJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm5hbWUiOiAiaENhcHRjaGEgc2VjcmV0IiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJTZWNyZXQgZm9yIGhDYXB0Y2hhIGNoYWxsZW5nZS4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTIifSwgIkFOVElCT1RfVFVSTlNUSUxFX1NJVEVLRVkiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiU2l0ZWtleSBmb3IgVHVybnN0aWxlIGNoYWxsZW5nZS4iLCAiaWQiOiAiYW50aWJvdC10dXJuc3RpbGUtc2l0ZWtleSIsICJsYWJlbCI6ICJUdXJuc3RpbGUgc2l0ZWtleSIsICJyZWdleCI6ICJeKDB4W1xcd1xcLV0rKT8kIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4oMHhbXFx3XFwtXSspPyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJuYW1lIjogIlR1cm5zdGlsZSBzaXRla2V5IiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJTaXRla2V5IGZvciBUdXJuc3RpbGUgY2hhbGxlbmdlLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMSJ9LCAiQU5USUJPVF9UVVJOU1RJTEVfU0VDUkVUIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIlNlY3JldCBmb3IgVHVybnN0aWxlIGNoYWxsZW5nZS4iLCAiaWQiOiAiYW50aWJvdC10dXJuc3RpbGUtc2VjcmV0IiwgImxhYmVsIjogIlR1cm5zdGlsZSBzZWNyZXQiLCAicmVnZXgiOiAiXigweFtcXHdcXC1dKyk/JCIsICJ0eXBlIjogInBhc3N3b3JkIiwgInBhdHRlcm4iOiAiXigweFtcXHdcXC1dKyk/JCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm5hbWUiOiAiVHVybnN0aWxlIHNlY3JldCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiU2VjcmV0IGZvciBUdXJuc3RpbGUgY2hhbGxlbmdlLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMCJ9fSwgImNoZWNrc3VtIjogbnVsbH0sIHsiaWQiOiAiYXV0aGJhc2ljIiwgInN0cmVhbSI6ICJubyIsICJuYW1lIjogIkF1dGggYmFzaWMiLCAiZGVzY3JpcHRpb24iOiAiRW5mb3JjZSBsb2dpbiBiZWZvcmUgYWNjZXNzaW5nIGEgcmVzb3VyY2Ugb3IgdGhlIHdob2xlIHNpdGUgdXNpbmcgSFRUUCBiYXNpYyBhdXRoIG1ldGhvZC4iLCAidmVyc2lvbiI6ICIxLjAiLCAidHlwZSI6ICJjb3JlIiwgIm1ldGhvZCI6ICJtYW51YWwiLCAicGFnZSI6IGZhbHNlLCAic2V0dGluZ3MiOiB7IlVTRV9BVVRIX0JBU0lDIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIm5vIiwgImhlbHAiOiAiVXNlIEhUVFAgYmFzaWMgYXV0aCIsICJpZCI6ICJ1c2UtYXV0aC1iYXNpYyIsICJsYWJlbCI6ICJVc2UgSFRUUCBiYXNpYyBhdXRoIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIm5vIiwgIm5hbWUiOiAiVXNlIEhUVFAgYmFzaWMgYXV0aCIsICJwcmV2X3ZhbHVlIjogIm5vIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJVc2UgSFRUUCBiYXNpYyBhdXRoIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei00In0sICJBVVRIX0JBU0lDX0xPQ0FUSU9OIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogInNpdGV3aWRlIiwgImhlbHAiOiAiVVJMIG9mIHRoZSBwcm90ZWN0ZWQgcmVzb3VyY2Ugb3Igc2l0ZXdpZGUgdmFsdWUuIiwgImlkIjogImF1dGgtYmFzaWMtbG9jYXRpb24iLCAibGFiZWwiOiAiQXV0aCBiYXNpYyBMb2NhdGlvbiIsICJyZWdleCI6ICJeKHNpdGV3aWRlfC9bYS16QS1aMC05LlxcL1xcLV0qKSQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXihzaXRld2lkZXwvW2EtekEtWjAtOS5cXC9cXC1dKikkIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJzaXRld2lkZSIsICJuYW1lIjogIkF1dGggYmFzaWMgTG9jYXRpb24iLCAicHJldl92YWx1ZSI6ICJzaXRld2lkZSIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVVJMIG9mIHRoZSBwcm90ZWN0ZWQgcmVzb3VyY2Ugb3Igc2l0ZXdpZGUgdmFsdWUuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0zIn0sICJBVVRIX0JBU0lDX1VTRVIiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiY2hhbmdlbWUiLCAiaGVscCI6ICJVc2VybmFtZSIsICJpZCI6ICJhdXRoLWJhc2ljLXVzZXIiLCAibGFiZWwiOiAiQXV0aCBiYXNpYyBVc2VybmFtZSIsICJyZWdleCI6ICJeW1xcd1xcLV0rIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl5bXFx3XFwtXSsiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogImNoYW5nZW1lIiwgIm5hbWUiOiAiQXV0aCBiYXNpYyBVc2VybmFtZSIsICJwcmV2X3ZhbHVlIjogImNoYW5nZW1lIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJVc2VybmFtZSJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMiJ9LCAiQVVUSF9CQVNJQ19QQVNTV09SRCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJjaGFuZ2VtZSIsICJoZWxwIjogIlBhc3N3b3JkIiwgImlkIjogImF1dGgtYmFzaWMtcGFzc3dvcmQiLCAibGFiZWwiOiAiUGFzc3dvcmQiLCAicmVnZXgiOiAiXi4rIiwgInR5cGUiOiAicGFzc3dvcmQiLCAicGF0dGVybiI6ICJeLisiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogImNoYW5nZW1lIiwgIm5hbWUiOiAiUGFzc3dvcmQiLCAicHJldl92YWx1ZSI6ICJjaGFuZ2VtZSIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiUGFzc3dvcmQifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTEifSwgIkFVVEhfQkFTSUNfVEVYVCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJSZXN0cmljdGVkIGFyZWEiLCAiaGVscCI6ICJUZXh0IHRvIGRpc3BsYXkiLCAiaWQiOiAiYXV0aC1iYXNpYy10ZXh0IiwgImxhYmVsIjogIlRleHQiLCAicmVnZXgiOiAiXi4rIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4uKyIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiUmVzdHJpY3RlZCBhcmVhIiwgIm5hbWUiOiAiVGV4dCIsICJwcmV2X3ZhbHVlIjogIlJlc3RyaWN0ZWQgYXJlYSIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVGV4dCB0byBkaXNwbGF5In1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0wIn19LCAiY2hlY2tzdW0iOiBudWxsfSwgeyJpZCI6ICJiYWRiZWhhdmlvciIsICJzdHJlYW0iOiAieWVzIiwgIm5hbWUiOiAiQmFkIGJlaGF2aW9yIiwgImRlc2NyaXB0aW9uIjogIkJhbiBJUCBnZW5lcmF0aW5nIHRvbyBtdWNoICdiYWQnIEhUVFAgc3RhdHVzIGNvZGUgaW4gYSBwZXJpb2Qgb2YgdGltZS4iLCAidmVyc2lvbiI6ICIxLjAiLCAidHlwZSI6ICJjb3JlIiwgIm1ldGhvZCI6ICJtYW51YWwiLCAicGFnZSI6IHRydWUsICJzZXR0aW5ncyI6IHsiVVNFX0JBRF9CRUhBVklPUiI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJ5ZXMiLCAiaGVscCI6ICJBY3RpdmF0ZSBCYWQgYmVoYXZpb3IgZmVhdHVyZS4iLCAiaWQiOiAidXNlLWJhZC1iZWhhdmlvciIsICJsYWJlbCI6ICJBY3RpdmF0ZSBiYWQgYmVoYXZpb3IiLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAieWVzIiwgIm5hbWUiOiAiQWN0aXZhdGUgYmFkIGJlaGF2aW9yIiwgInByZXZfdmFsdWUiOiAieWVzIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJBY3RpdmF0ZSBCYWQgYmVoYXZpb3IgZmVhdHVyZS4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTQifSwgIkJBRF9CRUhBVklPUl9TVEFUVVNfQ09ERVMiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiNDAwIDQwMSA0MDMgNDA0IDQwNSA0MjkgNDQ0IiwgImhlbHAiOiAiTGlzdCBvZiBIVFRQIHN0YXR1cyBjb2RlcyBjb25zaWRlcmVkIGFzICdiYWQnLiIsICJpZCI6ICJiYWQtYmVoYXZpb3Itc3RhdHVzLWNvZGUiLCAibGFiZWwiOiAiQmFkIHN0YXR1cyBjb2RlcyIsICJyZWdleCI6ICJeKCAqKFsxLTVdXFxkezJ9KSg/IS4qXFwyKSAqKSskIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4oICooWzEtNV1cXGR7Mn0pKD8hLipcXDIpICopKyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjQwMCA0MDEgNDAzIDQwNCA0MDUgNDI5IDQ0NCIsICJuYW1lIjogIkJhZCBzdGF0dXMgY29kZXMiLCAicHJldl92YWx1ZSI6ICI0MDAgNDAxIDQwMyA0MDQgNDA1IDQyOSA0NDQiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkxpc3Qgb2YgSFRUUCBzdGF0dXMgY29kZXMgY29uc2lkZXJlZCBhcyAnYmFkJy4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTMifSwgIkJBRF9CRUhBVklPUl9USFJFU0hPTEQiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiMTAiLCAiaGVscCI6ICJNYXhpbXVtIG51bWJlciBvZiAnYmFkJyBIVFRQIHN0YXR1cyBjb2RlcyB3aXRoaW4gdGhlIHBlcmlvZCBvZiB0aW1lIGJlZm9yZSBJUCBpcyBiYW5uZWQuIiwgImlkIjogImJhZC1iZWhhdmlvci10aHJlc2hvbGQiLCAibGFiZWwiOiAiVGhyZXNob2xkIiwgInJlZ2V4IjogIl5bMS05XVswLTldKiIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeWzEtOV1bMC05XSoiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjMwIiwgIm5hbWUiOiAiVGhyZXNob2xkIiwgInByZXZfdmFsdWUiOiAiMTAiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIk1heGltdW0gbnVtYmVyIG9mICdiYWQnIEhUVFAgc3RhdHVzIGNvZGVzIHdpdGhpbiB0aGUgcGVyaW9kIG9mIHRpbWUgYmVmb3JlIElQIGlzIGJhbm5lZC4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTIifSwgIkJBRF9CRUhBVklPUl9DT1VOVF9USU1FIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIjYwIiwgImhlbHAiOiAiUGVyaW9kIG9mIHRpbWUgKGluIHNlY29uZHMpIGR1cmluZyB3aGljaCB3ZSBjb3VudCAnYmFkJyBIVFRQIHN0YXR1cyBjb2Rlcy4iLCAiaWQiOiAiYmFkLWJlaGF2aW9yLXBlcmlvZCIsICJsYWJlbCI6ICJQZXJpb2QgKGluIHNlY29uZHMpIiwgInJlZ2V4IjogIl5cXGQrIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl5cXGQrIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICI2MCIsICJuYW1lIjogIlBlcmlvZCAoaW4gc2Vjb25kcykiLCAicHJldl92YWx1ZSI6ICI2MCIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiUGVyaW9kIG9mIHRpbWUgKGluIHNlY29uZHMpIGR1cmluZyB3aGljaCB3ZSBjb3VudCAnYmFkJyBIVFRQIHN0YXR1cyBjb2Rlcy4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTEifSwgIkJBRF9CRUhBVklPUl9CQU5fVElNRSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICI4NjQwMCIsICJoZWxwIjogIlRoZSBkdXJhdGlvbiB0aW1lIChpbiBzZWNvbmRzKSBvZiBhIGJhbiB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIElQIGhhcyByZWFjaGVkIHRoZSB0aHJlc2hvbGQuIiwgImlkIjogImJhZC1iZWhhdmlvci1iYW4tdGltZSIsICJsYWJlbCI6ICJCYW4gZHVyYXRpb24gKGluIHNlY29uZHMpIiwgInJlZ2V4IjogIl5cXGQrIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl5cXGQrIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIzNjAwIiwgIm5hbWUiOiAiQmFuIGR1cmF0aW9uIChpbiBzZWNvbmRzKSIsICJwcmV2X3ZhbHVlIjogIjg2NDAwIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJUaGUgZHVyYXRpb24gdGltZSAoaW4gc2Vjb25kcykgb2YgYSBiYW4gd2hlbiB0aGUgY29ycmVzcG9uZGluZyBJUCBoYXMgcmVhY2hlZCB0aGUgdGhyZXNob2xkLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMCJ9fSwgImNoZWNrc3VtIjogbnVsbH0sIHsiaWQiOiAiYmxhY2tsaXN0IiwgInN0cmVhbSI6ICJwYXJ0aWFsIiwgIm5hbWUiOiAiQmxhY2tsaXN0IiwgImRlc2NyaXB0aW9uIjogIkRlbnkgYWNjZXNzIGJhc2VkIG9uIGludGVybmFsIGFuZCBleHRlcm5hbCBJUC9uZXR3b3JrL3JETlMvQVNOIGJsYWNrbGlzdHMuIiwgInZlcnNpb24iOiAiMS4wIiwgInR5cGUiOiAiY29yZSIsICJtZXRob2QiOiAibWFudWFsIiwgInBhZ2UiOiB0cnVlLCAic2V0dGluZ3MiOiB7IlVTRV9CTEFDS0xJU1QiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAieWVzIiwgImhlbHAiOiAiQWN0aXZhdGUgYmxhY2tsaXN0IGZlYXR1cmUuIiwgImlkIjogInVzZS1ibGFja2xpc3QiLCAibGFiZWwiOiAiQWN0aXZhdGUgYmxhY2tsaXN0aW5nIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiB0cnVlLCAidmFsdWUiOiAibm8iLCAibmFtZSI6ICJBY3RpdmF0ZSBibGFja2xpc3RpbmciLCAicHJldl92YWx1ZSI6ICJ5ZXMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJ0cmVzcGFzcyIsICJ0ZXh0IjogImlucF9wb3BvdmVyX21ldGhvZF9kaXNhYmxlZCJ9LCB7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiQWN0aXZhdGUgYmxhY2tsaXN0IGZlYXR1cmUuIn1dLCAibWV0aG9kIjogInNjaGVkdWxlciIsICJjb250YWluZXJDbGFzcyI6ICJ6LTExIn0sICJCTEFDS0xJU1RfSVAiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiTGlzdCBvZiBJUC9uZXR3b3JrLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIHRvIGJsb2NrLiIsICJpZCI6ICJibGFja2xpc3QtaXAiLCAibGFiZWwiOiAiQmxhY2tsaXN0IElQL25ldHdvcmsiLCAicmVnZXgiOiAiXig/ISApKCAqKCgoXFxiMjVbMC01XXxcXGIyWzAtNF1cXGR8XFxiWzAxXT9cXGRcXGQ/KShcXC4oMjVbMC01XXwyWzAtNF1cXGR8WzAxXT9cXGRcXGQ/KSl7M30pKFxcLyhbMS0yXVswLTldP3wzWzAtMl0/fFswNC05XSkpP3woKFswLTlhLWZBLUZdezEsNH06KXs3fVswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDd9OnwoWzAtOWEtZkEtRl17MSw0fTopezEsNn06WzAtOWEtZkEtRl17MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsNX0oOlswLTlhLWZBLUZdezEsNH0pezEsMn18KFswLTlhLWZBLUZdezEsNH06KXsxLDR9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDN9fChbMC05YS1mQS1GXXsxLDR9Oil7MSwzfSg6WzAtOWEtZkEtRl17MSw0fSl7MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsMn0oOlswLTlhLWZBLUZdezEsNH0pezEsNX18WzAtOWEtZkEtRl17MSw0fTooKDpbMC05YS1mQS1GXXsxLDR9KXsxLDZ9KXw6KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw3fXw6KXxmZTgwOig6WzAtOWEtZkEtRl1aezAsNH0pezAsNH0lWzAtOWEtekEtWl0rfDo6KGZmZmYoOjB7MSw0fSk/Oik/KCgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZClcXC4pezN9KDI1WzAtNV18KDJbMC00XXwxP1xcZCk/XFxkKXwoWzAtOWEtZkEtRl17MSw0fTopezEsNH06KCgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZClcXC4pezN9KDI1WzAtNV18KDJbMC00XXwxP1xcZCk/XFxkKSkoXFwvKDEyWzAtOF18MVswMV1bMC05XXxbMC05XVswLTldPykpPykoPyEuKlxcRFxcMihbXlxcZFxcL118JCkpICopKiQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXig/ISApKCAqKCgoXFxiMjVbMC01XXxcXGIyWzAtNF1cXGR8XFxiWzAxXT9cXGRcXGQ/KShcXC4oMjVbMC01XXwyWzAtNF1cXGR8WzAxXT9cXGRcXGQ/KSl7M30pKFxcLyhbMS0yXVswLTldP3wzWzAtMl0/fFswNC05XSkpP3woKFswLTlhLWZBLUZdezEsNH06KXs3fVswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDd9OnwoWzAtOWEtZkEtRl17MSw0fTopezEsNn06WzAtOWEtZkEtRl17MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsNX0oOlswLTlhLWZBLUZdezEsNH0pezEsMn18KFswLTlhLWZBLUZdezEsNH06KXsxLDR9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDN9fChbMC05YS1mQS1GXXsxLDR9Oil7MSwzfSg6WzAtOWEtZkEtRl17MSw0fSl7MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsMn0oOlswLTlhLWZBLUZdezEsNH0pezEsNX18WzAtOWEtZkEtRl17MSw0fTooKDpbMC05YS1mQS1GXXsxLDR9KXsxLDZ9KXw6KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw3fXw6KXxmZTgwOig6WzAtOWEtZkEtRl1aezAsNH0pezAsNH0lWzAtOWEtekEtWl0rfDo6KGZmZmYoOjB7MSw0fSk/Oik/KCgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZClcXC4pezN9KDI1WzAtNV18KDJbMC00XXwxP1xcZCk/XFxkKXwoWzAtOWEtZkEtRl17MSw0fTopezEsNH06KCgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZClcXC4pezN9KDI1WzAtNV18KDJbMC00XXwxP1xcZCk/XFxkKSkoXFwvKDEyWzAtOF18MVswMV1bMC05XXxbMC05XVswLTldPykpPykoPyEuKlxcRFxcMihbXlxcZFxcL118JCkpICopKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJuYW1lIjogIkJsYWNrbGlzdCBJUC9uZXR3b3JrIiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJMaXN0IG9mIElQL25ldHdvcmssIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgdG8gYmxvY2suIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xMCJ9LCAiQkxBQ0tMSVNUX1JETlMiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiLnNob2Rhbi5pbyAuY2Vuc3lzLmlvIiwgImhlbHAiOiAiTGlzdCBvZiByZXZlcnNlIEROUyBzdWZmaXhlcywgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCB0byBibG9jay4iLCAiaWQiOiAiYmxhY2tsaXN0LXJkbnMiLCAibGFiZWwiOiAiQmxhY2tsaXN0IHJldmVyc2UgRE5TIiwgInJlZ2V4IjogIl4oICooKFteIF0rKSg/IS4qXFwzKCB8JCkpKSAqKSokIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4oICooKFteIF0rKSg/IS4qXFwzKCB8JCkpKSAqKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIuc2hvZGFuLmlvIC5jZW5zeXMuaW8iLCAibmFtZSI6ICJCbGFja2xpc3QgcmV2ZXJzZSBETlMiLCAicHJldl92YWx1ZSI6ICIuc2hvZGFuLmlvIC5jZW5zeXMuaW8iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkxpc3Qgb2YgcmV2ZXJzZSBETlMgc3VmZml4ZXMsIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgdG8gYmxvY2suIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei05In0sICJCTEFDS0xJU1RfUkROU19HTE9CQUwiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAieWVzIiwgImhlbHAiOiAiT25seSBwZXJmb3JtIFJETlMgYmxhY2tsaXN0IGNoZWNrcyBvbiBnbG9iYWwgSVAgYWRkcmVzc2VzLiIsICJpZCI6ICJibGFja2xpc3QtcmRucy1nbG9iYWwiLCAibGFiZWwiOiAiQmxhY2tsaXN0IHJldmVyc2UgRE5TIGdsb2JhbCBJUHMiLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAieWVzIiwgIm5hbWUiOiAiQmxhY2tsaXN0IHJldmVyc2UgRE5TIGdsb2JhbCBJUHMiLCAicHJldl92YWx1ZSI6ICJ5ZXMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIk9ubHkgcGVyZm9ybSBSRE5TIGJsYWNrbGlzdCBjaGVja3Mgb24gZ2xvYmFsIElQIGFkZHJlc3Nlcy4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTgifSwgIkJMQUNLTElTVF9BU04iOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiTGlzdCBvZiBBU04gbnVtYmVycywgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCB0byBibG9jay4iLCAiaWQiOiAiYmxhY2tsaXN0LWFzbiIsICJsYWJlbCI6ICJCbGFja2xpc3QgQVNOIiwgInJlZ2V4IjogIl5eKCAqKChBU04/KT8oXFxkKylcXGIoPyEuKltTTiBdXFw0XFxiKSkgKikqJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeXiggKigoQVNOPyk/KFxcZCspXFxiKD8hLipbU04gXVxcNFxcYikpICopKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJuYW1lIjogIkJsYWNrbGlzdCBBU04iLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkxpc3Qgb2YgQVNOIG51bWJlcnMsIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgdG8gYmxvY2suIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei03In0sICJCTEFDS0xJU1RfVVNFUl9BR0VOVCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJMaXN0IG9mIFVzZXItQWdlbnQgKFBDUkUgcmVnZXgpLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIHRvIGJsb2NrLiIsICJpZCI6ICJibGFja2xpc3QtdXNlci1hZ2VudCIsICJsYWJlbCI6ICJCbGFja2xpc3QgVXNlci1BZ2VudCIsICJyZWdleCI6ICJeLiokIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4uKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJuYW1lIjogIkJsYWNrbGlzdCBVc2VyLUFnZW50IiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJMaXN0IG9mIFVzZXItQWdlbnQgKFBDUkUgcmVnZXgpLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIHRvIGJsb2NrLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotNiJ9LCAiQkxBQ0tMSVNUX1VSSSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJMaXN0IG9mIFVSSSAoUENSRSByZWdleCksIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgdG8gYmxvY2suIiwgImlkIjogImJsYWNrbGlzdC11cmkiLCAibGFiZWwiOiAiQmxhY2tsaXN0IFVSSSIsICJyZWdleCI6ICJeKCAqKC4qKSg/IS4qXFwyKD8hLikpICopKiQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXiggKiguKikoPyEuKlxcMig/IS4pKSAqKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibmFtZSI6ICJCbGFja2xpc3QgVVJJIiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJMaXN0IG9mIFVSSSAoUENSRSByZWdleCksIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgdG8gYmxvY2suIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei01In0sICJCTEFDS0xJU1RfSUdOT1JFX0lQIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkxpc3Qgb2YgSVAvbmV0d29yaywgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCB0byBpZ25vcmUgaW4gdGhlIGJsYWNrbGlzdC4iLCAiaWQiOiAiYmxhY2tsaXN0LWlnbm9yZS1pcCIsICJsYWJlbCI6ICJCbGFja2xpc3QgaWdub3JlIElQL25ldHdvcmsiLCAicmVnZXgiOiAiXig/ISApKCAqKCgoXFxiMjVbMC01XXxcXGIyWzAtNF1cXGR8XFxiWzAxXT9cXGRcXGQ/KShcXC4oMjVbMC01XXwyWzAtNF1cXGR8WzAxXT9cXGRcXGQ/KSl7M30pKFxcLyhbMS0yXVswLTldP3wzWzAtMl0/fFswNC05XSkpP3woKFswLTlhLWZBLUZdezEsNH06KXs3fVswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDd9OnwoWzAtOWEtZkEtRl17MSw0fTopezEsNn06WzAtOWEtZkEtRl17MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsNX0oOlswLTlhLWZBLUZdezEsNH0pezEsMn18KFswLTlhLWZBLUZdezEsNH06KXsxLDR9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDN9fChbMC05YS1mQS1GXXsxLDR9Oil7MSwzfSg6WzAtOWEtZkEtRl17MSw0fSl7MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsMn0oOlswLTlhLWZBLUZdezEsNH0pezEsNX18WzAtOWEtZkEtRl17MSw0fTooKDpbMC05YS1mQS1GXXsxLDR9KXsxLDZ9KXw6KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw3fXw6KXxmZTgwOig6WzAtOWEtZkEtRl1aezAsNH0pezAsNH0lWzAtOWEtekEtWl0rfDo6KGZmZmYoOjB7MSw0fSk/Oik/KCgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZClcXC4pezN9KDI1WzAtNV18KDJbMC00XXwxP1xcZCk/XFxkKXwoWzAtOWEtZkEtRl17MSw0fTopezEsNH06KCgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZClcXC4pezN9KDI1WzAtNV18KDJbMC00XXwxP1xcZCk/XFxkKSkoXFwvKDEyWzAtOF18MVswMV1bMC05XXxbMC05XVswLTldPykpPykoPyEuKlxcRFxcMihbXlxcZFxcL118JCkpICopKiQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXig/ISApKCAqKCgoXFxiMjVbMC01XXxcXGIyWzAtNF1cXGR8XFxiWzAxXT9cXGRcXGQ/KShcXC4oMjVbMC01XXwyWzAtNF1cXGR8WzAxXT9cXGRcXGQ/KSl7M30pKFxcLyhbMS0yXVswLTldP3wzWzAtMl0/fFswNC05XSkpP3woKFswLTlhLWZBLUZdezEsNH06KXs3fVswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDd9OnwoWzAtOWEtZkEtRl17MSw0fTopezEsNn06WzAtOWEtZkEtRl17MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsNX0oOlswLTlhLWZBLUZdezEsNH0pezEsMn18KFswLTlhLWZBLUZdezEsNH06KXsxLDR9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDN9fChbMC05YS1mQS1GXXsxLDR9Oil7MSwzfSg6WzAtOWEtZkEtRl17MSw0fSl7MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsMn0oOlswLTlhLWZBLUZdezEsNH0pezEsNX18WzAtOWEtZkEtRl17MSw0fTooKDpbMC05YS1mQS1GXXsxLDR9KXsxLDZ9KXw6KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw3fXw6KXxmZTgwOig6WzAtOWEtZkEtRl1aezAsNH0pezAsNH0lWzAtOWEtekEtWl0rfDo6KGZmZmYoOjB7MSw0fSk/Oik/KCgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZClcXC4pezN9KDI1WzAtNV18KDJbMC00XXwxP1xcZCk/XFxkKXwoWzAtOWEtZkEtRl17MSw0fTopezEsNH06KCgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZClcXC4pezN9KDI1WzAtNV18KDJbMC00XXwxP1xcZCk/XFxkKSkoXFwvKDEyWzAtOF18MVswMV1bMC05XXxbMC05XVswLTldPykpPykoPyEuKlxcRFxcMihbXlxcZFxcL118JCkpICopKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJuYW1lIjogIkJsYWNrbGlzdCBpZ25vcmUgSVAvbmV0d29yayIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBJUC9uZXR3b3JrLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIHRvIGlnbm9yZSBpbiB0aGUgYmxhY2tsaXN0LiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotNCJ9LCAiQkxBQ0tMSVNUX0lHTk9SRV9SRE5TIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkxpc3Qgb2YgcmV2ZXJzZSBETlMgc3VmZml4ZXMsIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgdG8gaWdub3JlIGluIHRoZSBibGFja2xpc3QuIiwgImlkIjogImJsYWNrbGlzdC1pZ25vcmUtcmRucyIsICJsYWJlbCI6ICJCbGFja2xpc3QgaWdub3JlIHJldmVyc2UgRE5TIiwgInJlZ2V4IjogIl4oICooKFteIF0rKSg/IS4qXFwzKCB8JCkpKSAqKSokIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4oICooKFteIF0rKSg/IS4qXFwzKCB8JCkpKSAqKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibmFtZSI6ICJCbGFja2xpc3QgaWdub3JlIHJldmVyc2UgRE5TIiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJMaXN0IG9mIHJldmVyc2UgRE5TIHN1ZmZpeGVzLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIHRvIGlnbm9yZSBpbiB0aGUgYmxhY2tsaXN0LiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMyJ9LCAiQkxBQ0tMSVNUX0lHTk9SRV9BU04iOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiTGlzdCBvZiBBU04gbnVtYmVycywgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCB0byBpZ25vcmUgaW4gdGhlIGJsYWNrbGlzdC4iLCAiaWQiOiAiYmxhY2tsaXN0LWlnbm9yZS1hc24iLCAibGFiZWwiOiAiQmxhY2tsaXN0IGlnbm9yZSBBU04iLCAicmVnZXgiOiAiXl4oICooKEFTTj8pPyhcXGQrKVxcYig/IS4qW1NOIF1cXDRcXGIpKSAqKSokIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl5eKCAqKChBU04/KT8oXFxkKylcXGIoPyEuKltTTiBdXFw0XFxiKSkgKikqJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm5hbWUiOiAiQmxhY2tsaXN0IGlnbm9yZSBBU04iLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkxpc3Qgb2YgQVNOIG51bWJlcnMsIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgdG8gaWdub3JlIGluIHRoZSBibGFja2xpc3QuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yIn0sICJCTEFDS0xJU1RfSUdOT1JFX1VTRVJfQUdFTlQiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiTGlzdCBvZiBVc2VyLUFnZW50IChQQ1JFIHJlZ2V4KSwgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCB0byBpZ25vcmUgaW4gdGhlIGJsYWNrbGlzdC4iLCAiaWQiOiAiYmxhY2tsaXN0LWlnbm9yZS11c2VyLWFnZW50IiwgImxhYmVsIjogIkJsYWNrbGlzdCBpZ25vcmUgVXNlci1BZ2VudCIsICJyZWdleCI6ICJeLiokIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4uKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJuYW1lIjogIkJsYWNrbGlzdCBpZ25vcmUgVXNlci1BZ2VudCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBVc2VyLUFnZW50IChQQ1JFIHJlZ2V4KSwgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCB0byBpZ25vcmUgaW4gdGhlIGJsYWNrbGlzdC4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTEifSwgIkJMQUNLTElTVF9JR05PUkVfVVJJIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkxpc3Qgb2YgVVJJIChQQ1JFIHJlZ2V4KSwgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCB0byBpZ25vcmUgaW4gdGhlIGJsYWNrbGlzdC4iLCAiaWQiOiAiYmxhY2tsaXN0LWlnbm9yZS11cmkiLCAibGFiZWwiOiAiQmxhY2tsaXN0IGlnbm9yZSBVUkkiLCAicmVnZXgiOiAiXiggKiguKikoPyEuKlxcMig/IS4pKSAqKSokIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4oICooLiopKD8hLipcXDIoPyEuKSkgKikqJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm5hbWUiOiAiQmxhY2tsaXN0IGlnbm9yZSBVUkkiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkxpc3Qgb2YgVVJJIChQQ1JFIHJlZ2V4KSwgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCB0byBpZ25vcmUgaW4gdGhlIGJsYWNrbGlzdC4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTAifX0sICJjaGVja3N1bSI6IG51bGx9LCB7ImlkIjogImJyb3RsaSIsICJzdHJlYW0iOiAibm8iLCAibmFtZSI6ICJCcm90bGkiLCAiZGVzY3JpcHRpb24iOiAiQ29tcHJlc3MgSFRUUCByZXF1ZXN0cyB3aXRoIHRoZSBicm90bGkgYWxnb3JpdGhtLiIsICJ2ZXJzaW9uIjogIjEuMCIsICJ0eXBlIjogImNvcmUiLCAibWV0aG9kIjogIm1hbnVhbCIsICJwYWdlIjogZmFsc2UsICJzZXR0aW5ncyI6IHsiVVNFX0JST1RMSSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJubyIsICJoZWxwIjogIlVzZSBicm90bGkiLCAiaWQiOiAidXNlLWJyb3RsaSIsICJsYWJlbCI6ICJVc2UgYnJvdGxpIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIm5vIiwgIm5hbWUiOiAiVXNlIGJyb3RsaSIsICJwcmV2X3ZhbHVlIjogIm5vIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJVc2UgYnJvdGxpIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0zIn0sICJCUk9UTElfVFlQRVMiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiYXBwbGljYXRpb24vYXRvbSt4bWwgYXBwbGljYXRpb24vamF2YXNjcmlwdCBhcHBsaWNhdGlvbi9qc29uIGFwcGxpY2F0aW9uL3Jzcyt4bWwgYXBwbGljYXRpb24vdm5kLm1zLWZvbnRvYmplY3QgYXBwbGljYXRpb24veC1mb250LW9wZW50eXBlIGFwcGxpY2F0aW9uL3gtZm9udC10cnVldHlwZSBhcHBsaWNhdGlvbi94LWZvbnQtdHRmIGFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCBhcHBsaWNhdGlvbi94aHRtbCt4bWwgYXBwbGljYXRpb24veG1sIGZvbnQvZW90IGZvbnQvb3BlbnR5cGUgZm9udC9vdGYgZm9udC90cnVldHlwZSBpbWFnZS9zdmcreG1sIGltYWdlL3ZuZC5taWNyb3NvZnQuaWNvbiBpbWFnZS94LWljb24gaW1hZ2UveC13aW4tYml0bWFwIHRleHQvY3NzIHRleHQvamF2YXNjcmlwdCB0ZXh0L3BsYWluIHRleHQveG1sIiwgImhlbHAiOiAiTGlzdCBvZiBNSU1FIHR5cGVzIHRoYXQgd2lsbCBiZSBjb21wcmVzc2VkIHdpdGggYnJvdGxpLiIsICJpZCI6ICJicm90bGktdHlwZXMiLCAibGFiZWwiOiAiTUlNRSB0eXBlcyIsICJyZWdleCI6ICJeKD8hICkoID8oW1xcLVxcdy5dKy9bXFwtXFx3LitdKykoPyEuKlxcMig/IS4pKSkrJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeKD8hICkoID8oW1xcLVxcdy5dKy9bXFwtXFx3LitdKykoPyEuKlxcMig/IS4pKSkrJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiYXBwbGljYXRpb24vYXRvbSt4bWwgYXBwbGljYXRpb24vamF2YXNjcmlwdCBhcHBsaWNhdGlvbi9qc29uIGFwcGxpY2F0aW9uL3Jzcyt4bWwgYXBwbGljYXRpb24vdm5kLm1zLWZvbnRvYmplY3QgYXBwbGljYXRpb24veC1mb250LW9wZW50eXBlIGFwcGxpY2F0aW9uL3gtZm9udC10cnVldHlwZSBhcHBsaWNhdGlvbi94LWZvbnQtdHRmIGFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCBhcHBsaWNhdGlvbi94aHRtbCt4bWwgYXBwbGljYXRpb24veG1sIGZvbnQvZW90IGZvbnQvb3BlbnR5cGUgZm9udC9vdGYgZm9udC90cnVldHlwZSBpbWFnZS9zdmcreG1sIGltYWdlL3ZuZC5taWNyb3NvZnQuaWNvbiBpbWFnZS94LWljb24gaW1hZ2UveC13aW4tYml0bWFwIHRleHQvY3NzIHRleHQvamF2YXNjcmlwdCB0ZXh0L3BsYWluIHRleHQveG1sIiwgIm5hbWUiOiAiTUlNRSB0eXBlcyIsICJwcmV2X3ZhbHVlIjogImFwcGxpY2F0aW9uL2F0b20reG1sIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQgYXBwbGljYXRpb24vanNvbiBhcHBsaWNhdGlvbi9yc3MreG1sIGFwcGxpY2F0aW9uL3ZuZC5tcy1mb250b2JqZWN0IGFwcGxpY2F0aW9uL3gtZm9udC1vcGVudHlwZSBhcHBsaWNhdGlvbi94LWZvbnQtdHJ1ZXR5cGUgYXBwbGljYXRpb24veC1mb250LXR0ZiBhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQgYXBwbGljYXRpb24veGh0bWwreG1sIGFwcGxpY2F0aW9uL3htbCBmb250L2VvdCBmb250L29wZW50eXBlIGZvbnQvb3RmIGZvbnQvdHJ1ZXR5cGUgaW1hZ2Uvc3ZnK3htbCBpbWFnZS92bmQubWljcm9zb2Z0Lmljb24gaW1hZ2UveC1pY29uIGltYWdlL3gtd2luLWJpdG1hcCB0ZXh0L2NzcyB0ZXh0L2phdmFzY3JpcHQgdGV4dC9wbGFpbiB0ZXh0L3htbCIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBNSU1FIHR5cGVzIHRoYXQgd2lsbCBiZSBjb21wcmVzc2VkIHdpdGggYnJvdGxpLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMiJ9LCAiQlJPVExJX01JTl9MRU5HVEgiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiMTAwMCIsICJoZWxwIjogIk1pbmltdW0gbGVuZ3RoIGZvciBicm90bGkgY29tcHJlc3Npb24uIiwgImlkIjogImJyb3RsaS1taW4tbGVuZ3RoIiwgImxhYmVsIjogIk1pbmltdW0gbGVuZ3RoIiwgInJlZ2V4IjogIl5cXGQrIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl5cXGQrIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIxMDAwIiwgIm5hbWUiOiAiTWluaW11bSBsZW5ndGgiLCAicHJldl92YWx1ZSI6ICIxMDAwIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJNaW5pbXVtIGxlbmd0aCBmb3IgYnJvdGxpIGNvbXByZXNzaW9uLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMSJ9LCAiQlJPVExJX0NPTVBfTEVWRUwiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiNiIsICJoZWxwIjogIlRoZSBjb21wcmVzc2lvbiBsZXZlbCBvZiB0aGUgYnJvdGxpIGFsZ29yaXRobS4iLCAiaWQiOiAiYnJvdGxpLWNvbXAtbGV2ZWwiLCAibGFiZWwiOiAiQ29tcHJlc3Npb24gbGV2ZWwiLCAicmVnZXgiOiAiXihbMDItOV18MVswMV0/KSQiLCAidHlwZSI6ICJzZWxlY3QiLCAicGF0dGVybiI6ICJeKFswMi05XXwxWzAxXT8pJCIsICJpbnBUeXBlIjogInNlbGVjdCIsICJ2YWx1ZXMiOiBbIjAiLCAiMSIsICIxMCIsICIxMSIsICIyIiwgIjMiLCAiNCIsICI1IiwgIjYiLCAiNyIsICI4IiwgIjkiXSwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiNiIsICJuYW1lIjogIkNvbXByZXNzaW9uIGxldmVsIiwgInByZXZfdmFsdWUiOiAiNiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVGhlIGNvbXByZXNzaW9uIGxldmVsIG9mIHRoZSBicm90bGkgYWxnb3JpdGhtLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMCJ9fSwgImNoZWNrc3VtIjogbnVsbH0sIHsiaWQiOiAiYnVua2VybmV0IiwgInN0cmVhbSI6ICJ5ZXMiLCAibmFtZSI6ICJCdW5rZXJOZXQiLCAiZGVzY3JpcHRpb24iOiAiU2hhcmUgdGhyZWF0IGRhdGEgd2l0aCBvdGhlciBCdW5rZXJXZWIgaW5zdGFuY2VzIHZpYSBCdW5rZXJOZXQuIiwgInZlcnNpb24iOiAiMS4wIiwgInR5cGUiOiAiY29yZSIsICJtZXRob2QiOiAibWFudWFsIiwgInBhZ2UiOiB0cnVlLCAic2V0dGluZ3MiOiB7IlVTRV9CVU5LRVJORVQiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAieWVzIiwgImhlbHAiOiAiQWN0aXZhdGUgQnVua2VyTmV0IGZlYXR1cmUuIiwgImlkIjogInVzZS1idW5rZXJuZXQiLCAibGFiZWwiOiAiQWN0aXZhdGUgQnVua2VyTmV0IiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiB0cnVlLCAidmFsdWUiOiAibm8iLCAibmFtZSI6ICJBY3RpdmF0ZSBCdW5rZXJOZXQiLCAicHJldl92YWx1ZSI6ICJ5ZXMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJ0cmVzcGFzcyIsICJ0ZXh0IjogImlucF9wb3BvdmVyX21ldGhvZF9kaXNhYmxlZCJ9LCB7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiQWN0aXZhdGUgQnVua2VyTmV0IGZlYXR1cmUuIn1dLCAibWV0aG9kIjogInNjaGVkdWxlciIsICJjb250YWluZXJDbGFzcyI6ICJ6LTAifX0sICJjaGVja3N1bSI6IG51bGx9LCB7ImlkIjogImNvcnMiLCAic3RyZWFtIjogIm5vIiwgIm5hbWUiOiAiQ09SUyIsICJkZXNjcmlwdGlvbiI6ICJDcm9zcy1PcmlnaW4gUmVzb3VyY2UgU2hhcmluZy4iLCAidmVyc2lvbiI6ICIxLjAiLCAidHlwZSI6ICJjb3JlIiwgIm1ldGhvZCI6ICJtYW51YWwiLCAicGFnZSI6IHRydWUsICJzZXR0aW5ncyI6IHsiVVNFX0NPUlMiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAibm8iLCAiaGVscCI6ICJVc2UgQ09SUyIsICJpZCI6ICJ1c2UtY29ycyIsICJsYWJlbCI6ICJVc2UgQ09SUyIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJ5ZXMiLCAibmFtZSI6ICJVc2UgQ09SUyIsICJwcmV2X3ZhbHVlIjogIm5vIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJVc2UgQ09SUyJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMTAifSwgIkNPUlNfQUxMT1dfT1JJR0lOIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIioiLCAiaGVscCI6ICJBbGxvd2VkIG9yaWdpbnMgdG8gbWFrZSBDT1JTIHJlcXVlc3RzIDogUENSRSByZWdleCBvciAqLiIsICJpZCI6ICJjb3JzLWFsbG93LW9yaWdpbiIsICJsYWJlbCI6ICJBbGxvd2VkIG9yaWdpbnMiLCAicmVnZXgiOiAiXi4qJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeLiokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJzZWxmIiwgIm5hbWUiOiAiQWxsb3dlZCBvcmlnaW5zIiwgInByZXZfdmFsdWUiOiAiKiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiQWxsb3dlZCBvcmlnaW5zIHRvIG1ha2UgQ09SUyByZXF1ZXN0cyA6IFBDUkUgcmVnZXggb3IgKi4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTkifSwgIkNPUlNfQUxMT1dfTUVUSE9EUyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJHRVQsIFBPU1QsIE9QVElPTlMiLCAiaGVscCI6ICJWYWx1ZSBvZiB0aGUgQWNjZXNzLUNvbnRyb2wtQWxsb3ctTWV0aG9kcyBoZWFkZXIuIiwgImlkIjogImNvcnMtYWxsb3ctbWV0aG9kcyIsICJsYWJlbCI6ICJBY2Nlc3MtQ29udHJvbC1BbGxvdy1NZXRob2RzIHZhbHVlIiwgInJlZ2V4IjogIl4oXFwqfCg/IVssIF0pKCw/ID8oR0VUfEhFQUR8UE9TVHxQVVR8REVMRVRFfENPTk5FQ1R8T1BUSU9OU3xUUkFDRXxQQVRDSCkoPyEuKlxcMykpKik/JCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeKFxcKnwoPyFbLCBdKSgsPyA/KEdFVHxIRUFEfFBPU1R8UFVUfERFTEVURXxDT05ORUNUfE9QVElPTlN8VFJBQ0V8UEFUQ0gpKD8hLipcXDMpKSopPyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIkdFVCwgUE9TVCwgT1BUSU9OUyIsICJuYW1lIjogIkFjY2Vzcy1Db250cm9sLUFsbG93LU1ldGhvZHMgdmFsdWUiLCAicHJldl92YWx1ZSI6ICJHRVQsIFBPU1QsIE9QVElPTlMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlZhbHVlIG9mIHRoZSBBY2Nlc3MtQ29udHJvbC1BbGxvdy1NZXRob2RzIGhlYWRlci4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTgifSwgIkNPUlNfQUxMT1dfSEVBREVSUyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJETlQsVXNlci1BZ2VudCxYLVJlcXVlc3RlZC1XaXRoLElmLU1vZGlmaWVkLVNpbmNlLENhY2hlLUNvbnRyb2wsQ29udGVudC1UeXBlLFJhbmdlIiwgImhlbHAiOiAiVmFsdWUgb2YgdGhlIEFjY2Vzcy1Db250cm9sLUFsbG93LUhlYWRlcnMgaGVhZGVyLiIsICJpZCI6ICJjb3JzLWFsbG93LWhlYWRlcnMiLCAibGFiZWwiOiAiQWNjZXNzLUNvbnRyb2wtQWxsb3ctSGVhZGVycyB2YWx1ZSIsICJyZWdleCI6ICJeKFxcKnwoPyFbLCBdKSgsPyA/KFtcXHdcXC1dKykoPyEuKlxcMyg/IS4pKSkqKT8kIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4oXFwqfCg/IVssIF0pKCw/ID8oW1xcd1xcLV0rKSg/IS4qXFwzKD8hLikpKSopPyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIkROVCxVc2VyLUFnZW50LFgtUmVxdWVzdGVkLVdpdGgsSWYtTW9kaWZpZWQtU2luY2UsQ2FjaGUtQ29udHJvbCxDb250ZW50LVR5cGUsUmFuZ2UiLCAibmFtZSI6ICJBY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzIHZhbHVlIiwgInByZXZfdmFsdWUiOiAiRE5ULFVzZXItQWdlbnQsWC1SZXF1ZXN0ZWQtV2l0aCxJZi1Nb2RpZmllZC1TaW5jZSxDYWNoZS1Db250cm9sLENvbnRlbnQtVHlwZSxSYW5nZSIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVmFsdWUgb2YgdGhlIEFjY2Vzcy1Db250cm9sLUFsbG93LUhlYWRlcnMgaGVhZGVyLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotNyJ9LCAiQ09SU19BTExPV19DUkVERU5USUFMUyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJubyIsICJoZWxwIjogIlNlbmQgdGhlIEFjY2Vzcy1Db250cm9sLUFsbG93LUNyZWRlbnRpYWxzIGhlYWRlci4iLCAiaWQiOiAiY29ycy1hbGxvdy1jcmVkZW50aWFscyIsICJsYWJlbCI6ICJTZW5kIEFjY2Vzcy1Db250cm9sLUFsbG93LUNyZWRlbnRpYWxzIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIm5vIiwgIm5hbWUiOiAiU2VuZCBBY2Nlc3MtQ29udHJvbC1BbGxvdy1DcmVkZW50aWFscyIsICJwcmV2X3ZhbHVlIjogIm5vIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJTZW5kIHRoZSBBY2Nlc3MtQ29udHJvbC1BbGxvdy1DcmVkZW50aWFscyBoZWFkZXIuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei02In0sICJDT1JTX0VYUE9TRV9IRUFERVJTIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIkNvbnRlbnQtTGVuZ3RoLENvbnRlbnQtUmFuZ2UiLCAiaGVscCI6ICJWYWx1ZSBvZiB0aGUgQWNjZXNzLUNvbnRyb2wtRXhwb3NlLUhlYWRlcnMgaGVhZGVyLiIsICJpZCI6ICJjb3JzLWV4cG9zZS1oZWFkZXJzIiwgImxhYmVsIjogIkFjY2Vzcy1Db250cm9sLUV4cG9zZS1IZWFkZXJzIHZhbHVlIiwgInJlZ2V4IjogIl4oXFwqfCg/IVssIF0rKSgsPyA/KFtcXHdcXC1dKykoPyEuKlxcMyg/IS4pKSkqKT8kIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4oXFwqfCg/IVssIF0rKSgsPyA/KFtcXHdcXC1dKykoPyEuKlxcMyg/IS4pKSkqKT8kIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJDb250ZW50LUxlbmd0aCxDb250ZW50LVJhbmdlIiwgIm5hbWUiOiAiQWNjZXNzLUNvbnRyb2wtRXhwb3NlLUhlYWRlcnMgdmFsdWUiLCAicHJldl92YWx1ZSI6ICJDb250ZW50LUxlbmd0aCxDb250ZW50LVJhbmdlIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJWYWx1ZSBvZiB0aGUgQWNjZXNzLUNvbnRyb2wtRXhwb3NlLUhlYWRlcnMgaGVhZGVyLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotNSJ9LCAiQ1JPU1NfT1JJR0lOX09QRU5FUl9QT0xJQ1kiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiVmFsdWUgZm9yIHRoZSBDcm9zcy1PcmlnaW4tT3BlbmVyLVBvbGljeSBoZWFkZXIuIiwgImlkIjogImNyb3NzLW9yaWdpbi1vcGVuZXItcG9saWN5IiwgImxhYmVsIjogIkNyb3NzLU9yaWdpbi1PcGVuZXItUG9saWN5IiwgInJlZ2V4IjogIl4odW5zYWZlLW5vbmV8c2FtZS1vcmlnaW4tYWxsb3ctcG9wdXBzfHNhbWUtb3JpZ2luKT8kIiwgInR5cGUiOiAic2VsZWN0IiwgInBhdHRlcm4iOiAiXih1bnNhZmUtbm9uZXxzYW1lLW9yaWdpbi1hbGxvdy1wb3B1cHN8c2FtZS1vcmlnaW4pPyQiLCAiaW5wVHlwZSI6ICJzZWxlY3QiLCAidmFsdWVzIjogWyIiLCAic2FtZS1vcmlnaW4iLCAic2FtZS1vcmlnaW4tYWxsb3ctcG9wdXBzIiwgInVuc2FmZS1ub25lIl0sICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogInNhbWUtb3JpZ2luIiwgIm5hbWUiOiAiQ3Jvc3MtT3JpZ2luLU9wZW5lci1Qb2xpY3kiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlZhbHVlIGZvciB0aGUgQ3Jvc3MtT3JpZ2luLU9wZW5lci1Qb2xpY3kgaGVhZGVyLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotNCJ9LCAiQ1JPU1NfT1JJR0lOX0VNQkVEREVSX1BPTElDWSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJWYWx1ZSBmb3IgdGhlIENyb3NzLU9yaWdpbi1FbWJlZGRlci1Qb2xpY3kgaGVhZGVyLiIsICJpZCI6ICJjcm9zcy1vcmlnaW4tZW1iZWRkZXItcG9saWN5IiwgImxhYmVsIjogIkNyb3NzLU9yaWdpbi1FbWJlZGRlci1Qb2xpY3kiLCAicmVnZXgiOiAiXih1bnNhZmUtbm9uZXxyZXF1aXJlLWNvcnB8Y3JlZGVudGlhbGxlc3MpPyQiLCAidHlwZSI6ICJzZWxlY3QiLCAicGF0dGVybiI6ICJeKHVuc2FmZS1ub25lfHJlcXVpcmUtY29ycHxjcmVkZW50aWFsbGVzcyk/JCIsICJpbnBUeXBlIjogInNlbGVjdCIsICJ2YWx1ZXMiOiBbIiIsICJjcmVkZW50aWFsbGVzcyIsICJyZXF1aXJlLWNvcnAiLCAidW5zYWZlLW5vbmUiXSwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAicmVxdWlyZS1jb3JwIiwgIm5hbWUiOiAiQ3Jvc3MtT3JpZ2luLUVtYmVkZGVyLVBvbGljeSIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVmFsdWUgZm9yIHRoZSBDcm9zcy1PcmlnaW4tRW1iZWRkZXItUG9saWN5IGhlYWRlci4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTMifSwgIkNST1NTX09SSUdJTl9SRVNPVVJDRV9QT0xJQ1kiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiVmFsdWUgZm9yIHRoZSBDcm9zcy1PcmlnaW4tUmVzb3VyY2UtUG9saWN5IGhlYWRlci4iLCAiaWQiOiAiY3Jvc3Mtb3JpZ2luLXJlc291cmNlLXBvbGljeSIsICJsYWJlbCI6ICJDcm9zcy1PcmlnaW4tUmVzb3VyY2UtUG9saWN5IiwgInJlZ2V4IjogIl4oc2FtZS1zaXRlfHNhbWUtb3JpZ2lufGNyb3NzLW9yaWdpbik/JCIsICJ0eXBlIjogInNlbGVjdCIsICJwYXR0ZXJuIjogIl4oc2FtZS1zaXRlfHNhbWUtb3JpZ2lufGNyb3NzLW9yaWdpbik/JCIsICJpbnBUeXBlIjogInNlbGVjdCIsICJ2YWx1ZXMiOiBbIiIsICJjcm9zcy1vcmlnaW4iLCAic2FtZS1vcmlnaW4iLCAic2FtZS1zaXRlIl0sICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogInNhbWUtc2l0ZSIsICJuYW1lIjogIkNyb3NzLU9yaWdpbi1SZXNvdXJjZS1Qb2xpY3kiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlZhbHVlIGZvciB0aGUgQ3Jvc3MtT3JpZ2luLVJlc291cmNlLVBvbGljeSBoZWFkZXIuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yIn0sICJDT1JTX01BWF9BR0UiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiODY0MDAiLCAiaGVscCI6ICJWYWx1ZSBvZiB0aGUgQWNjZXNzLUNvbnRyb2wtTWF4LUFnZSBoZWFkZXIuIiwgImlkIjogImNvcnMtbWF4LWFnZSIsICJsYWJlbCI6ICJBY2Nlc3MtQ29udHJvbC1NYXgtQWdlIHZhbHVlIiwgInJlZ2V4IjogIl5cXGQrJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeXFxkKyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjg2NDAwIiwgIm5hbWUiOiAiQWNjZXNzLUNvbnRyb2wtTWF4LUFnZSB2YWx1ZSIsICJwcmV2X3ZhbHVlIjogIjg2NDAwIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJWYWx1ZSBvZiB0aGUgQWNjZXNzLUNvbnRyb2wtTWF4LUFnZSBoZWFkZXIuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xIn0sICJDT1JTX0RFTllfUkVRVUVTVCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJ5ZXMiLCAiaGVscCI6ICJEZW55IHJlcXVlc3QgYW5kIGRvbid0IHNlbmQgaXQgdG8gYmFja2VuZCBpZiBPcmlnaW4gaXMgbm90IGFsbG93ZWQuIiwgImlkIjogImNvcnMtZGVueS1yZXF1ZXN0IiwgImxhYmVsIjogIkRlbnkgcmVxdWVzdCIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJ5ZXMiLCAibmFtZSI6ICJEZW55IHJlcXVlc3QiLCAicHJldl92YWx1ZSI6ICJ5ZXMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkRlbnkgcmVxdWVzdCBhbmQgZG9uJ3Qgc2VuZCBpdCB0byBiYWNrZW5kIGlmIE9yaWdpbiBpcyBub3QgYWxsb3dlZC4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTAifX0sICJjaGVja3N1bSI6IG51bGx9LCB7ImlkIjogImNsaWVudGNhY2hlIiwgInN0cmVhbSI6ICJubyIsICJuYW1lIjogIkNsaWVudCBjYWNoZSIsICJkZXNjcmlwdGlvbiI6ICJNYW5hZ2UgY2FjaGluZyBmb3IgY2xpZW50cy4iLCAidmVyc2lvbiI6ICIxLjAiLCAidHlwZSI6ICJjb3JlIiwgIm1ldGhvZCI6ICJtYW51YWwiLCAicGFnZSI6IGZhbHNlLCAic2V0dGluZ3MiOiB7IlVTRV9DTElFTlRfQ0FDSEUiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAibm8iLCAiaGVscCI6ICJUZWxsIGNsaWVudCB0byBzdG9yZSBsb2NhbGx5IHN0YXRpYyBmaWxlcy4iLCAiaWQiOiAidXNlLWNsaWVudC1jYWNoZSIsICJsYWJlbCI6ICJVc2UgY2xpZW50IGNhY2hlIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiB0cnVlLCAidmFsdWUiOiAieWVzIiwgIm5hbWUiOiAiVXNlIGNsaWVudCBjYWNoZSIsICJwcmV2X3ZhbHVlIjogIm5vIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAidHJlc3Bhc3MiLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tZXRob2RfZGlzYWJsZWQifSwgeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlRlbGwgY2xpZW50IHRvIHN0b3JlIGxvY2FsbHkgc3RhdGljIGZpbGVzLiJ9XSwgIm1ldGhvZCI6ICJzY2hlZHVsZXIiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yIn0sICJDTElFTlRfQ0FDSEVfRVRBRyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJ5ZXMiLCAiaGVscCI6ICJTZW5kIHRoZSBIVFRQIEVUYWcgaGVhZGVyIGZvciBzdGF0aWMgcmVzb3VyY2VzLiIsICJpZCI6ICJjbGllbnQtY2FjaGUtZXRhZyIsICJsYWJlbCI6ICJFVGFnIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogInllcyIsICJuYW1lIjogIkVUYWciLCAicHJldl92YWx1ZSI6ICJ5ZXMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlNlbmQgdGhlIEhUVFAgRVRhZyBoZWFkZXIgZm9yIHN0YXRpYyByZXNvdXJjZXMuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xIn0sICJDTElFTlRfQ0FDSEVfQ09OVFJPTCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJwdWJsaWMsIG1heC1hZ2U9MTU1NTIwMDAiLCAiaGVscCI6ICJWYWx1ZSBvZiB0aGUgQ2FjaGUtQ29udHJvbCBIVFRQIGhlYWRlci4iLCAiaWQiOiAiY2xpZW50LWNhY2hlLWNvbnRyb2wiLCAibGFiZWwiOiAiQ2FjaGUtQ29udHJvbCBoZWFkZXIiLCAicmVnZXgiOiAiXig/ISgsID98ICkpKCgsICk/KCgobWF4LWFnZXxzLW1heGFnZXxzdGFsZS13aGlsZS1yZXZhbGlkYXRlfHN0YWxlLWlmLWVycm9yKT1cXGQrKD8hLipcXDYpKXwoKD8hLipwdWJsaWMpcHJpdmF0ZXwoPyEuKnByaXZhdGUpcHVibGljKXwobXVzdHxwcm94eSktcmV2YWxpZGF0ZXxtdXN0LXVuZGVyc3RhbmR8aW1tdXRhYmxlfG5vLShjYWNoZXxzdG9yZXx0cmFuc2Zvcm0pKSg/IS4qXFw0KSkrJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeKD8hKCwgP3wgKSkoKCwgKT8oKChtYXgtYWdlfHMtbWF4YWdlfHN0YWxlLXdoaWxlLXJldmFsaWRhdGV8c3RhbGUtaWYtZXJyb3IpPVxcZCsoPyEuKlxcNikpfCgoPyEuKnB1YmxpYylwcml2YXRlfCg/IS4qcHJpdmF0ZSlwdWJsaWMpfChtdXN0fHByb3h5KS1yZXZhbGlkYXRlfG11c3QtdW5kZXJzdGFuZHxpbW11dGFibGV8bm8tKGNhY2hlfHN0b3JlfHRyYW5zZm9ybSkpKD8hLipcXDQpKSskIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJwdWJsaWMsIG1heC1hZ2U9MTU1NTIwMDAiLCAibmFtZSI6ICJDYWNoZS1Db250cm9sIGhlYWRlciIsICJwcmV2X3ZhbHVlIjogInB1YmxpYywgbWF4LWFnZT0xNTU1MjAwMCIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVmFsdWUgb2YgdGhlIENhY2hlLUNvbnRyb2wgSFRUUCBoZWFkZXIuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0wIn19LCAiY2hlY2tzdW0iOiBudWxsfSwgeyJpZCI6ICJjb3VudHJ5IiwgInN0cmVhbSI6ICJ5ZXMiLCAibmFtZSI6ICJDb3VudHJ5IiwgImRlc2NyaXB0aW9uIjogIkRlbnkgYWNjZXNzIGJhc2VkIG9uIHRoZSBjb3VudHJ5IG9mIHRoZSBjbGllbnQgSVAuIiwgInZlcnNpb24iOiAiMS4wIiwgInR5cGUiOiAiY29yZSIsICJtZXRob2QiOiAibWFudWFsIiwgInBhZ2UiOiB0cnVlLCAic2V0dGluZ3MiOiB7IkJMQUNLTElTVF9DT1VOVFJZIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkRlbnkgYWNjZXNzIGlmIHRoZSBjb3VudHJ5IG9mIHRoZSBjbGllbnQgaXMgaW4gdGhlIGxpc3QgKElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtYXQgc2VwYXJhdGVkIHdpdGggc3BhY2VzKS4iLCAiaWQiOiAiY291bnRyeS1ibGFja2xpc3QiLCAibGFiZWwiOiAiQ291bnRyeSBibGFja2xpc3QiLCAicmVnZXgiOiAiXig/ISApKCAqKFtBLVpdezJ9KSg/IS4qXFwyKSAqKSokIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4oPyEgKSggKihbQS1aXXsyfSkoPyEuKlxcMikgKikqJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm5hbWUiOiAiQ291bnRyeSBibGFja2xpc3QiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkRlbnkgYWNjZXNzIGlmIHRoZSBjb3VudHJ5IG9mIHRoZSBjbGllbnQgaXMgaW4gdGhlIGxpc3QgKElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtYXQgc2VwYXJhdGVkIHdpdGggc3BhY2VzKS4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTEifSwgIldISVRFTElTVF9DT1VOVFJZIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkRlbnkgYWNjZXNzIGlmIHRoZSBjb3VudHJ5IG9mIHRoZSBjbGllbnQgaXMgbm90IGluIHRoZSBsaXN0IChJU08gMzE2Ni0xIGFscGhhLTIgZm9ybWF0IHNlcGFyYXRlZCB3aXRoIHNwYWNlcykuIiwgImlkIjogImNvdW50cnktd2hpdGVsaXN0IiwgImxhYmVsIjogIkNvdW50cnkgd2hpdGVsaXN0IiwgInJlZ2V4IjogIl4oPyEgKSggKihbQS1aXXsyfSkoPyEuKlxcMikgKikqJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeKD8hICkoICooW0EtWl17Mn0pKD8hLipcXDIpICopKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJuYW1lIjogIkNvdW50cnkgd2hpdGVsaXN0IiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJEZW55IGFjY2VzcyBpZiB0aGUgY291bnRyeSBvZiB0aGUgY2xpZW50IGlzIG5vdCBpbiB0aGUgbGlzdCAoSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm1hdCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMpLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMCJ9fSwgImNoZWNrc3VtIjogbnVsbH0sIHsiaWQiOiAiY3VzdG9tY2VydCIsICJzdHJlYW0iOiAieWVzIiwgIm5hbWUiOiAiQ3VzdG9tIEhUVFBTIGNlcnRpZmljYXRlIiwgImRlc2NyaXB0aW9uIjogIkNob29zZSBjdXN0b20gY2VydGlmaWNhdGUgZm9yIEhUVFBTLiIsICJ2ZXJzaW9uIjogIjEuMCIsICJ0eXBlIjogImNvcmUiLCAibWV0aG9kIjogIm1hbnVhbCIsICJwYWdlIjogZmFsc2UsICJzZXR0aW5ncyI6IHsiVVNFX0NVU1RPTV9TU0wiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAibm8iLCAiaGVscCI6ICJVc2UgY3VzdG9tIEhUVFBTIGNlcnRpZmljYXRlLiIsICJpZCI6ICJ1c2UtY3VzdG9tLWh0dHBzIiwgImxhYmVsIjogIlVzZSBjdXN0b20gY2VydGlmaWNhdGUiLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAibm8iLCAibmFtZSI6ICJVc2UgY3VzdG9tIGNlcnRpZmljYXRlIiwgInByZXZfdmFsdWUiOiAibm8iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlVzZSBjdXN0b20gSFRUUFMgY2VydGlmaWNhdGUuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei00In0sICJDVVNUT01fU1NMX0NFUlQiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiRnVsbCBwYXRoIG9mIHRoZSBjZXJ0aWZpY2F0ZSBvciBidW5kbGUgZmlsZSAobXVzdCBiZSByZWFkYWJsZSBieSB0aGUgc2NoZWR1bGVyKS4iLCAiaWQiOiAiY3VzdG9tLWh0dHBzLWNlcnQiLCAibGFiZWwiOiAiQ2VydGlmaWNhdGUgcGF0aCIsICJyZWdleCI6ICJeKC9bXFx3LiBcXC1dKykqLz8kIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4oL1tcXHcuIFxcLV0rKSovPyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJuYW1lIjogIkNlcnRpZmljYXRlIHBhdGgiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkZ1bGwgcGF0aCBvZiB0aGUgY2VydGlmaWNhdGUgb3IgYnVuZGxlIGZpbGUgKG11c3QgYmUgcmVhZGFibGUgYnkgdGhlIHNjaGVkdWxlcikuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0zIn0sICJDVVNUT01fU1NMX0tFWSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJGdWxsIHBhdGggb2YgdGhlIGtleSBmaWxlIChtdXN0IGJlIHJlYWRhYmxlIGJ5IHRoZSBzY2hlZHVsZXIpLiIsICJpZCI6ICJjdXN0b20taHR0cHMta2V5IiwgImxhYmVsIjogIktleSBwYXRoIiwgInJlZ2V4IjogIl4oL1tcXHcuIFxcLV0rKSovPyQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXigvW1xcdy4gXFwtXSspKi8/JCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm5hbWUiOiAiS2V5IHBhdGgiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkZ1bGwgcGF0aCBvZiB0aGUga2V5IGZpbGUgKG11c3QgYmUgcmVhZGFibGUgYnkgdGhlIHNjaGVkdWxlcikuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yIn0sICJDVVNUT01fU1NMX0NFUlRfREFUQSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJDZXJ0aWZpY2F0ZSBkYXRhIGVuY29kZWQgaW4gYmFzZTY0LiIsICJpZCI6ICJjdXN0b20taHR0cHMtY2VydC1kYXRhIiwgImxhYmVsIjogIkNlcnRpZmljYXRlIGRhdGEgKGJhc2U2NCkiLCAicmVnZXgiOiAiXi4qJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeLiokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibmFtZSI6ICJDZXJ0aWZpY2F0ZSBkYXRhIChiYXNlNjQpIiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJDZXJ0aWZpY2F0ZSBkYXRhIGVuY29kZWQgaW4gYmFzZTY0LiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMSJ9LCAiQ1VTVE9NX1NTTF9LRVlfREFUQSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJLZXkgZGF0YSBlbmNvZGVkIGluIGJhc2U2NC4iLCAiaWQiOiAiY3VzdG9tLWh0dHBzLWtleS1kYXRhIiwgImxhYmVsIjogIktleSBkYXRhIChiYXNlNjQpIiwgInJlZ2V4IjogIl4uKiQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXi4qJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm5hbWUiOiAiS2V5IGRhdGEgKGJhc2U2NCkiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIktleSBkYXRhIGVuY29kZWQgaW4gYmFzZTY0LiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMCJ9fSwgImNoZWNrc3VtIjogbnVsbH0sIHsiaWQiOiAiZG5zYmwiLCAic3RyZWFtIjogInllcyIsICJuYW1lIjogIkROU0JMIiwgImRlc2NyaXB0aW9uIjogIkRlbnkgYWNjZXNzIGJhc2VkIG9uIGV4dGVybmFsIEROU0JMIHNlcnZlcnMuIiwgInZlcnNpb24iOiAiMS4wIiwgInR5cGUiOiAiY29yZSIsICJtZXRob2QiOiAibWFudWFsIiwgInBhZ2UiOiB0cnVlLCAic2V0dGluZ3MiOiB7IlVTRV9ETlNCTCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJ5ZXMiLCAiaGVscCI6ICJBY3RpdmF0ZSBETlNCTCBmZWF0dXJlLiIsICJpZCI6ICJ1c2UtZG5zYmwiLCAibGFiZWwiOiAiQWN0aXZhdGUgRE5TQkwiLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAibm8iLCAibmFtZSI6ICJBY3RpdmF0ZSBETlNCTCIsICJwcmV2X3ZhbHVlIjogInllcyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiQWN0aXZhdGUgRE5TQkwgZmVhdHVyZS4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTAifX0sICJjaGVja3N1bSI6IG51bGx9LCB7ImlkIjogImVycm9ycyIsICJzdHJlYW0iOiAibm8iLCAibmFtZSI6ICJFcnJvcnMiLCAiZGVzY3JpcHRpb24iOiAiTWFuYWdlIGRlZmF1bHQgZXJyb3IgcGFnZXMiLCAidmVyc2lvbiI6ICIxLjAiLCAidHlwZSI6ICJjb3JlIiwgIm1ldGhvZCI6ICJtYW51YWwiLCAicGFnZSI6IHRydWUsICJzZXR0aW5ncyI6IHsiRVJST1JTIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkxpc3Qgb2YgSFRUUCBlcnJvciBjb2RlIGFuZCBjb3JyZXNwb25kaW5nIGVycm9yIHBhZ2VzLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMgKDQwND0vbXk0MDQuaHRtbCA0MDM9L2Vycm9ycy80MDMuaHRtbCAuLi4pLiIsICJpZCI6ICJlcnJvcnMiLCAibGFiZWwiOiAiRXJyb3JzIiwgInJlZ2V4IjogIl4oPyEgKSggPyhbMS01XVxcZHsyfSkoPyEuKlxcMig/IVtePV0pKT0oXFwvW1xcd1xcXS5+OlxcLz8jXFxbQCEkXFwmJ1xcKFxcKSorLDs9XFwtXSopKD8hLipcXDMoPyEuKSkpKiQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXig/ISApKCA/KFsxLTVdXFxkezJ9KSg/IS4qXFwyKD8hW149XSkpPShcXC9bXFx3XFxdLn46XFwvPyNcXFtAISRcXCYnXFwoXFwpKissOz1cXC1dKikoPyEuKlxcMyg/IS4pKSkqJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm5hbWUiOiAiRXJyb3JzIiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJMaXN0IG9mIEhUVFAgZXJyb3IgY29kZSBhbmQgY29ycmVzcG9uZGluZyBlcnJvciBwYWdlcywgc2VwYXJhdGVkIHdpdGggc3BhY2VzICg0MDQ9L215NDA0Lmh0bWwgNDAzPS9lcnJvcnMvNDAzLmh0bWwgLi4uKS4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTEifSwgIklOVEVSQ0VQVEVEX0VSUk9SX0NPREVTIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIjQwMCA0MDEgNDAzIDQwNCA0MDUgNDEzIDQyOSA1MDAgNTAxIDUwMiA1MDMgNTA0IiwgImhlbHAiOiAiTGlzdCBvZiBIVFRQIGVycm9yIGNvZGUgaW50ZXJjZXB0ZWQgYnkgQnVua2VyV2ViIiwgImlkIjogImludGVyY2VwdGVkLWVycm9yLWNvZGVzIiwgImxhYmVsIjogIkludGVyY2VwdGVkIGVycm9yIGNvZGVzIiwgInJlZ2V4IjogIl4oICooWzEtNV1cXGR7Mn0pKD8hLipcXDIpICopKyQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXiggKihbMS01XVxcZHsyfSkoPyEuKlxcMikgKikrJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiNDAwIDQwMSA0MDMgNDA0IDQwNSA0MTMgNDI5IDUwMCA1MDEgNTAyIDUwMyA1MDQiLCAibmFtZSI6ICJJbnRlcmNlcHRlZCBlcnJvciBjb2RlcyIsICJwcmV2X3ZhbHVlIjogIjQwMCA0MDEgNDAzIDQwNCA0MDUgNDEzIDQyOSA1MDAgNTAxIDUwMiA1MDMgNTA0IiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJMaXN0IG9mIEhUVFAgZXJyb3IgY29kZSBpbnRlcmNlcHRlZCBieSBCdW5rZXJXZWIifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTAifX0sICJjaGVja3N1bSI6IG51bGx9LCB7ImlkIjogImdyZXlsaXN0IiwgInN0cmVhbSI6ICJwYXJ0aWFsIiwgIm5hbWUiOiAiR3JleWxpc3QiLCAiZGVzY3JpcHRpb24iOiAiQWxsb3cgYWNjZXNzIHdoaWxlIGtlZXBpbmcgc2VjdXJpdHkgZmVhdHVyZXMgYmFzZWQgb24gaW50ZXJuYWwgYW5kIGV4dGVybmFsIElQL25ldHdvcmsvckROUy9BU04gZ3JleWxpc3RzLiIsICJ2ZXJzaW9uIjogIjEuMCIsICJ0eXBlIjogImNvcmUiLCAibWV0aG9kIjogIm1hbnVhbCIsICJwYWdlIjogdHJ1ZSwgInNldHRpbmdzIjogeyJVU0VfR1JFWUxJU1QiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAibm8iLCAiaGVscCI6ICJBY3RpdmF0ZSBncmV5bGlzdCBmZWF0dXJlLiIsICJpZCI6ICJ1c2UtZ3JleWxpc3QiLCAibGFiZWwiOiAiQWN0aXZhdGUgZ3JleWxpc3RpbmciLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAibm8iLCAibmFtZSI6ICJBY3RpdmF0ZSBncmV5bGlzdGluZyIsICJwcmV2X3ZhbHVlIjogIm5vIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJBY3RpdmF0ZSBncmV5bGlzdCBmZWF0dXJlLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotNiJ9LCAiR1JFWUxJU1RfSVAiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiTGlzdCBvZiBJUC9uZXR3b3JrLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIHRvIHB1dCBpbnRvIHRoZSBncmV5bGlzdC4iLCAiaWQiOiAiZ3JleWxpc3QtaXAiLCAibGFiZWwiOiAiR3JleWxpc3QgSVAvbmV0d29yayIsICJyZWdleCI6ICJeKD8hICkoICooKChcXGIyNVswLTVdfFxcYjJbMC00XVxcZHxcXGJbMDFdP1xcZFxcZD8pKFxcLigyNVswLTVdfDJbMC00XVxcZHxbMDFdP1xcZFxcZD8pKXszfSkoXFwvKFsxLTJdWzAtOV0/fDNbMC0yXT98WzA0LTldKSk/fCgoWzAtOWEtZkEtRl17MSw0fTopezd9WzAtOWEtZkEtRl17MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsN306fChbMC05YS1mQS1GXXsxLDR9Oil7MSw2fTpbMC05YS1mQS1GXXsxLDR9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw1fSg6WzAtOWEtZkEtRl17MSw0fSl7MSwyfXwoWzAtOWEtZkEtRl17MSw0fTopezEsNH0oOlswLTlhLWZBLUZdezEsNH0pezEsM318KFswLTlhLWZBLUZdezEsNH06KXsxLDN9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDR9fChbMC05YS1mQS1GXXsxLDR9Oil7MSwyfSg6WzAtOWEtZkEtRl17MSw0fSl7MSw1fXxbMC05YS1mQS1GXXsxLDR9OigoOlswLTlhLWZBLUZdezEsNH0pezEsNn0pfDooKDpbMC05YS1mQS1GXXsxLDR9KXsxLDd9fDopfGZlODA6KDpbMC05YS1mQS1GXVp7MCw0fSl7MCw0fSVbMC05YS16QS1aXSt8OjooZmZmZig6MHsxLDR9KT86KT8oKDI1WzAtNV18KDJbMC00XXwxP1xcZCk/XFxkKVxcLil7M30oMjVbMC01XXwoMlswLTRdfDE/XFxkKT9cXGQpfChbMC05YS1mQS1GXXsxLDR9Oil7MSw0fTooKDI1WzAtNV18KDJbMC00XXwxP1xcZCk/XFxkKVxcLil7M30oMjVbMC01XXwoMlswLTRdfDE/XFxkKT9cXGQpKShcXC8oMTJbMC04XXwxWzAxXVswLTldfFswLTldWzAtOV0/KSk/KSg/IS4qXFxEXFwyKFteXFxkXFwvXXwkKSkgKikqJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeKD8hICkoICooKChcXGIyNVswLTVdfFxcYjJbMC00XVxcZHxcXGJbMDFdP1xcZFxcZD8pKFxcLigyNVswLTVdfDJbMC00XVxcZHxbMDFdP1xcZFxcZD8pKXszfSkoXFwvKFsxLTJdWzAtOV0/fDNbMC0yXT98WzA0LTldKSk/fCgoWzAtOWEtZkEtRl17MSw0fTopezd9WzAtOWEtZkEtRl17MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsN306fChbMC05YS1mQS1GXXsxLDR9Oil7MSw2fTpbMC05YS1mQS1GXXsxLDR9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw1fSg6WzAtOWEtZkEtRl17MSw0fSl7MSwyfXwoWzAtOWEtZkEtRl17MSw0fTopezEsNH0oOlswLTlhLWZBLUZdezEsNH0pezEsM318KFswLTlhLWZBLUZdezEsNH06KXsxLDN9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDR9fChbMC05YS1mQS1GXXsxLDR9Oil7MSwyfSg6WzAtOWEtZkEtRl17MSw0fSl7MSw1fXxbMC05YS1mQS1GXXsxLDR9OigoOlswLTlhLWZBLUZdezEsNH0pezEsNn0pfDooKDpbMC05YS1mQS1GXXsxLDR9KXsxLDd9fDopfGZlODA6KDpbMC05YS1mQS1GXVp7MCw0fSl7MCw0fSVbMC05YS16QS1aXSt8OjooZmZmZig6MHsxLDR9KT86KT8oKDI1WzAtNV18KDJbMC00XXwxP1xcZCk/XFxkKVxcLil7M30oMjVbMC01XXwoMlswLTRdfDE/XFxkKT9cXGQpfChbMC05YS1mQS1GXXsxLDR9Oil7MSw0fTooKDI1WzAtNV18KDJbMC00XXwxP1xcZCk/XFxkKVxcLil7M30oMjVbMC01XXwoMlswLTRdfDE/XFxkKT9cXGQpKShcXC8oMTJbMC04XXwxWzAxXVswLTldfFswLTldWzAtOV0/KSk/KSg/IS4qXFxEXFwyKFteXFxkXFwvXXwkKSkgKikqJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm5hbWUiOiAiR3JleWxpc3QgSVAvbmV0d29yayIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBJUC9uZXR3b3JrLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIHRvIHB1dCBpbnRvIHRoZSBncmV5bGlzdC4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTUifSwgIkdSRVlMSVNUX1JETlMiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiTGlzdCBvZiByZXZlcnNlIEROUyBzdWZmaXhlcywgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCB0byBwdXQgaW50byB0aGUgZ3JleWxpc3QuIiwgImlkIjogImdyZXlsaXN0LXJkbnMiLCAibGFiZWwiOiAiR3JleWxpc3QgcmV2ZXJzZSBETlMiLCAicmVnZXgiOiAiXiggKigoW14gXSspKD8hLipcXDMoIHwkKSkpICopKiQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXiggKigoW14gXSspKD8hLipcXDMoIHwkKSkpICopKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJuYW1lIjogIkdyZXlsaXN0IHJldmVyc2UgRE5TIiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJMaXN0IG9mIHJldmVyc2UgRE5TIHN1ZmZpeGVzLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIHRvIHB1dCBpbnRvIHRoZSBncmV5bGlzdC4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTQifSwgIkdSRVlMSVNUX1JETlNfR0xPQkFMIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogInllcyIsICJoZWxwIjogIk9ubHkgcGVyZm9ybSBSRE5TIGdyZXlsaXN0IGNoZWNrcyBvbiBnbG9iYWwgSVAgYWRkcmVzc2VzLiIsICJpZCI6ICJncmV5bGlzdC1yZG5zLWdsb2JhbCIsICJsYWJlbCI6ICJHcmV5bGlzdCByZXZlcnNlIEROUyBnbG9iYWwgSVBzIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogInllcyIsICJuYW1lIjogIkdyZXlsaXN0IHJldmVyc2UgRE5TIGdsb2JhbCBJUHMiLCAicHJldl92YWx1ZSI6ICJ5ZXMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIk9ubHkgcGVyZm9ybSBSRE5TIGdyZXlsaXN0IGNoZWNrcyBvbiBnbG9iYWwgSVAgYWRkcmVzc2VzLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMyJ9LCAiR1JFWUxJU1RfQVNOIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkxpc3Qgb2YgQVNOIG51bWJlcnMsIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgdG8gcHV0IGludG8gdGhlIGdyZXlsaXN0LiIsICJpZCI6ICJncmV5bGlzdC1hc24iLCAibGFiZWwiOiAiR3JleWxpc3QgQVNOIiwgInJlZ2V4IjogIl5eKCAqKChBU04/KT8oXFxkKylcXGIoPyEuKltTTiBdXFw0XFxiKSkgKikqJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeXiggKigoQVNOPyk/KFxcZCspXFxiKD8hLipbU04gXVxcNFxcYikpICopKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJuYW1lIjogIkdyZXlsaXN0IEFTTiIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBBU04gbnVtYmVycywgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCB0byBwdXQgaW50byB0aGUgZ3JleWxpc3QuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yIn0sICJHUkVZTElTVF9VU0VSX0FHRU5UIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkxpc3Qgb2YgVXNlci1BZ2VudCAoUENSRSByZWdleCksIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgdG8gcHV0IGludG8gdGhlIGdyZXlsaXN0LiIsICJpZCI6ICJncmV5bGlzdC11c2VyLWFnZW50IiwgImxhYmVsIjogIkdyZXlsaXN0IFVzZXItQWdlbnQiLCAicmVnZXgiOiAiXi4qJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeLiokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibmFtZSI6ICJHcmV5bGlzdCBVc2VyLUFnZW50IiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJMaXN0IG9mIFVzZXItQWdlbnQgKFBDUkUgcmVnZXgpLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIHRvIHB1dCBpbnRvIHRoZSBncmV5bGlzdC4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTEifSwgIkdSRVlMSVNUX1VSSSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJMaXN0IG9mIFVSSSAoUENSRSByZWdleCksIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgdG8gcHV0IGludG8gdGhlIGdyZXlsaXN0LiIsICJpZCI6ICJncmV5bGlzdC11cmkiLCAibGFiZWwiOiAiR3JleWxpc3QgVVJJIiwgInJlZ2V4IjogIl4uKiQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXi4qJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm5hbWUiOiAiR3JleWxpc3QgVVJJIiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJMaXN0IG9mIFVSSSAoUENSRSByZWdleCksIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgdG8gcHV0IGludG8gdGhlIGdyZXlsaXN0LiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMCJ9fSwgImNoZWNrc3VtIjogbnVsbH0sIHsiaWQiOiAiZ3ppcCIsICJzdHJlYW0iOiAibm8iLCAibmFtZSI6ICJHemlwIiwgImRlc2NyaXB0aW9uIjogIkNvbXByZXNzIEhUVFAgcmVxdWVzdHMgd2l0aCB0aGUgZ3ppcCBhbGdvcml0aG0uIiwgInZlcnNpb24iOiAiMS4wIiwgInR5cGUiOiAiY29yZSIsICJtZXRob2QiOiAibWFudWFsIiwgInBhZ2UiOiBmYWxzZSwgInNldHRpbmdzIjogeyJVU0VfR1pJUCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJubyIsICJoZWxwIjogIlVzZSBnemlwIiwgImlkIjogInVzZS1nemlwIiwgImxhYmVsIjogIlVzZSBnemlwIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiB0cnVlLCAidmFsdWUiOiAieWVzIiwgIm5hbWUiOiAiVXNlIGd6aXAiLCAicHJldl92YWx1ZSI6ICJubyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogInRyZXNwYXNzIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbWV0aG9kX2Rpc2FibGVkIn0sIHsiaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJVc2UgZ3ppcCJ9XSwgIm1ldGhvZCI6ICJzY2hlZHVsZXIiLCAiY29udGFpbmVyQ2xhc3MiOiAiei00In0sICJHWklQX1RZUEVTIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogImFwcGxpY2F0aW9uL2F0b20reG1sIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQgYXBwbGljYXRpb24vanNvbiBhcHBsaWNhdGlvbi9yc3MreG1sIGFwcGxpY2F0aW9uL3ZuZC5tcy1mb250b2JqZWN0IGFwcGxpY2F0aW9uL3gtZm9udC1vcGVudHlwZSBhcHBsaWNhdGlvbi94LWZvbnQtdHJ1ZXR5cGUgYXBwbGljYXRpb24veC1mb250LXR0ZiBhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQgYXBwbGljYXRpb24veGh0bWwreG1sIGFwcGxpY2F0aW9uL3htbCBmb250L2VvdCBmb250L29wZW50eXBlIGZvbnQvb3RmIGZvbnQvdHJ1ZXR5cGUgaW1hZ2Uvc3ZnK3htbCBpbWFnZS92bmQubWljcm9zb2Z0Lmljb24gaW1hZ2UveC1pY29uIGltYWdlL3gtd2luLWJpdG1hcCB0ZXh0L2NzcyB0ZXh0L2phdmFzY3JpcHQgdGV4dC9wbGFpbiB0ZXh0L3htbCIsICJoZWxwIjogIkxpc3Qgb2YgTUlNRSB0eXBlcyB0aGF0IHdpbGwgYmUgY29tcHJlc3NlZCB3aXRoIGd6aXAuIiwgImlkIjogImd6aXAtdHlwZXMiLCAibGFiZWwiOiAiTUlNRSB0eXBlcyIsICJyZWdleCI6ICJeKD8hICkoID8oW1xcLVxcdy5dKy9bXFwtXFx3LitdKykoPyEuKlxcMig/IS4pKSkrJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeKD8hICkoID8oW1xcLVxcdy5dKy9bXFwtXFx3LitdKykoPyEuKlxcMig/IS4pKSkrJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiYXBwbGljYXRpb24vYXRvbSt4bWwgYXBwbGljYXRpb24vamF2YXNjcmlwdCBhcHBsaWNhdGlvbi9qc29uIGFwcGxpY2F0aW9uL3Jzcyt4bWwgYXBwbGljYXRpb24vdm5kLm1zLWZvbnRvYmplY3QgYXBwbGljYXRpb24veC1mb250LW9wZW50eXBlIGFwcGxpY2F0aW9uL3gtZm9udC10cnVldHlwZSBhcHBsaWNhdGlvbi94LWZvbnQtdHRmIGFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCBhcHBsaWNhdGlvbi94aHRtbCt4bWwgYXBwbGljYXRpb24veG1sIGZvbnQvZW90IGZvbnQvb3BlbnR5cGUgZm9udC9vdGYgZm9udC90cnVldHlwZSBpbWFnZS9zdmcreG1sIGltYWdlL3ZuZC5taWNyb3NvZnQuaWNvbiBpbWFnZS94LWljb24gaW1hZ2UveC13aW4tYml0bWFwIHRleHQvY3NzIHRleHQvamF2YXNjcmlwdCB0ZXh0L3BsYWluIHRleHQveG1sIiwgIm5hbWUiOiAiTUlNRSB0eXBlcyIsICJwcmV2X3ZhbHVlIjogImFwcGxpY2F0aW9uL2F0b20reG1sIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQgYXBwbGljYXRpb24vanNvbiBhcHBsaWNhdGlvbi9yc3MreG1sIGFwcGxpY2F0aW9uL3ZuZC5tcy1mb250b2JqZWN0IGFwcGxpY2F0aW9uL3gtZm9udC1vcGVudHlwZSBhcHBsaWNhdGlvbi94LWZvbnQtdHJ1ZXR5cGUgYXBwbGljYXRpb24veC1mb250LXR0ZiBhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQgYXBwbGljYXRpb24veGh0bWwreG1sIGFwcGxpY2F0aW9uL3htbCBmb250L2VvdCBmb250L29wZW50eXBlIGZvbnQvb3RmIGZvbnQvdHJ1ZXR5cGUgaW1hZ2Uvc3ZnK3htbCBpbWFnZS92bmQubWljcm9zb2Z0Lmljb24gaW1hZ2UveC1pY29uIGltYWdlL3gtd2luLWJpdG1hcCB0ZXh0L2NzcyB0ZXh0L2phdmFzY3JpcHQgdGV4dC9wbGFpbiB0ZXh0L3htbCIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBNSU1FIHR5cGVzIHRoYXQgd2lsbCBiZSBjb21wcmVzc2VkIHdpdGggZ3ppcC4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTMifSwgIkdaSVBfTUlOX0xFTkdUSCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIxMDAwIiwgImhlbHAiOiAiTWluaW11bSBsZW5ndGggZm9yIGd6aXAgY29tcHJlc3Npb24uIiwgImlkIjogImd6aXAtbWluLWxlbmd0aCIsICJsYWJlbCI6ICJNaW5pbXVtIGxlbmd0aCIsICJyZWdleCI6ICJeXFxkKyQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXlxcZCskIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIxMDAwIiwgIm5hbWUiOiAiTWluaW11bSBsZW5ndGgiLCAicHJldl92YWx1ZSI6ICIxMDAwIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJNaW5pbXVtIGxlbmd0aCBmb3IgZ3ppcCBjb21wcmVzc2lvbi4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTIifSwgIkdaSVBfQ09NUF9MRVZFTCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICI1IiwgImhlbHAiOiAiVGhlIGNvbXByZXNzaW9uIGxldmVsIG9mIHRoZSBnemlwIGFsZ29yaXRobS4iLCAiaWQiOiAiZ3ppcC1jb21wLWxldmVsIiwgImxhYmVsIjogIkNvbXByZXNzaW9uIGxldmVsIiwgInJlZ2V4IjogIl5bMS05XSQiLCAidHlwZSI6ICJzZWxlY3QiLCAicGF0dGVybiI6ICJeWzEtOV0kIiwgImlucFR5cGUiOiAic2VsZWN0IiwgInZhbHVlcyI6IFsiMSIsICIyIiwgIjMiLCAiNCIsICI1IiwgIjYiLCAiNyIsICI4IiwgIjkiXSwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiNSIsICJuYW1lIjogIkNvbXByZXNzaW9uIGxldmVsIiwgInByZXZfdmFsdWUiOiAiNSIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVGhlIGNvbXByZXNzaW9uIGxldmVsIG9mIHRoZSBnemlwIGFsZ29yaXRobS4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTEifSwgIkdaSVBfUFJPWElFRCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJuby1jYWNoZSBuby1zdG9yZSBwcml2YXRlIGV4cGlyZWQgYXV0aCIsICJoZWxwIjogIldoaWNoIGtpbmQgb2YgcHJveGllZCByZXF1ZXN0cyB3ZSBzaG91bGQgY29tcHJlc3MuIiwgImlkIjogImd6aXAtcHJveGllZCIsICJsYWJlbCI6ICJQcm94aWVkIHJlcXVlc3RzIiwgInJlZ2V4IjogIl4uKiQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXi4qJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAibm8tY2FjaGUgbm8tc3RvcmUgcHJpdmF0ZSBleHBpcmVkIGF1dGgiLCAibmFtZSI6ICJQcm94aWVkIHJlcXVlc3RzIiwgInByZXZfdmFsdWUiOiAibm8tY2FjaGUgbm8tc3RvcmUgcHJpdmF0ZSBleHBpcmVkIGF1dGgiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIldoaWNoIGtpbmQgb2YgcHJveGllZCByZXF1ZXN0cyB3ZSBzaG91bGQgY29tcHJlc3MuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0wIn19LCAiY2hlY2tzdW0iOiBudWxsfSwgeyJpZCI6ICJpbmplY3QiLCAic3RyZWFtIjogIm5vIiwgIm5hbWUiOiAiSFRNTCBpbmplY3Rpb24iLCAiZGVzY3JpcHRpb24iOiAiSW5qZWN0IGN1c3RvbSBIVE1MIGNvZGUgYmVmb3JlIHRoZSA8L2JvZHk+IHRhZy4iLCAidmVyc2lvbiI6ICIxLjAiLCAidHlwZSI6ICJjb3JlIiwgIm1ldGhvZCI6ICJtYW51YWwiLCAicGFnZSI6IGZhbHNlLCAic2V0dGluZ3MiOiB7IklOSkVDVF9CT0RZIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIlRoZSBIVE1MIGNvZGUgdG8gaW5qZWN0LiIsICJpZCI6ICJpbmplY3QtYm9keSIsICJsYWJlbCI6ICJIVE1MIGNvZGUiLCAicmVnZXgiOiAiXi4qJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeLiokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibmFtZSI6ICJIVE1MIGNvZGUiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlRoZSBIVE1MIGNvZGUgdG8gaW5qZWN0LiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMCJ9fSwgImNoZWNrc3VtIjogbnVsbH0sIHsiaWQiOiAiaGVhZGVycyIsICJzdHJlYW0iOiAibm8iLCAibmFtZSI6ICJIZWFkZXJzIiwgImRlc2NyaXB0aW9uIjogIk1hbmFnZSBIVFRQIGhlYWRlcnMgc2VudCB0byBjbGllbnRzLiIsICJ2ZXJzaW9uIjogIjEuMCIsICJ0eXBlIjogImNvcmUiLCAibWV0aG9kIjogIm1hbnVhbCIsICJwYWdlIjogZmFsc2UsICJzZXR0aW5ncyI6IHsiUkVNT1ZFX0hFQURFUlMiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiU2VydmVyIEV4cGVjdC1DVCBYLVBvd2VyZWQtQnkgWC1Bc3BOZXQtVmVyc2lvbiBYLUFzcE5ldE12Yy1WZXJzaW9uIiwgImhlbHAiOiAiSGVhZGVycyB0byByZW1vdmUgKEhlYWRlcjEgSGVhZGVyMiBIZWFkZXIzIC4uLikiLCAiaWQiOiAicmVtb3ZlLWhlYWRlcnMiLCAibGFiZWwiOiAiUmVtb3ZlIGhlYWRlcnMiLCAicmVnZXgiOiAiXig/ISApKCA/W1xcd1xcLV0rKSokIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4oPyEgKSggP1tcXHdcXC1dKykqJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiU2VydmVyIEV4cGVjdC1DVCBYLVBvd2VyZWQtQnkgWC1Bc3BOZXQtVmVyc2lvbiBYLUFzcE5ldE12Yy1WZXJzaW9uIFB1YmxpYy1LZXktUGlucyIsICJuYW1lIjogIlJlbW92ZSBoZWFkZXJzIiwgInByZXZfdmFsdWUiOiAiU2VydmVyIEV4cGVjdC1DVCBYLVBvd2VyZWQtQnkgWC1Bc3BOZXQtVmVyc2lvbiBYLUFzcE5ldE12Yy1WZXJzaW9uIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJIZWFkZXJzIHRvIHJlbW92ZSAoSGVhZGVyMSBIZWFkZXIyIEhlYWRlcjMgLi4uKSJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMTIifSwgIktFRVBfVVBTVFJFQU1fSEVBREVSUyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJDb250ZW50LVNlY3VyaXR5LVBvbGljeSBQZXJtaXNzaW9ucy1Qb2xpY3kgRmVhdHVyZS1Qb2xpY3kgWC1GcmFtZS1PcHRpb25zIiwgImhlbHAiOiAiSGVhZGVycyB0byBrZWVwIGZyb20gdXBzdHJlYW0gKEhlYWRlcjEgSGVhZGVyMiBIZWFkZXIzIC4uLiBvciAqIGZvciBhbGwpLiIsICJpZCI6ICJrZWVwLXVwc3RyZWFtLWhlYWRlcnMiLCAibGFiZWwiOiAiS2VlcCB1cHN0cmVhbSBoZWFkZXJzIiwgInJlZ2V4IjogIl4oKD8hICkoID9bXFx3XFwtXSspK3xcXCopPyQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXigoPyEgKSggP1tcXHdcXC1dKykrfFxcKik/JCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiQ29udGVudC1TZWN1cml0eS1Qb2xpY3kgUGVybWlzc2lvbnMtUG9saWN5IFgtRnJhbWUtT3B0aW9ucyIsICJuYW1lIjogIktlZXAgdXBzdHJlYW0gaGVhZGVycyIsICJwcmV2X3ZhbHVlIjogIkNvbnRlbnQtU2VjdXJpdHktUG9saWN5IFBlcm1pc3Npb25zLVBvbGljeSBGZWF0dXJlLVBvbGljeSBYLUZyYW1lLU9wdGlvbnMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkhlYWRlcnMgdG8ga2VlcCBmcm9tIHVwc3RyZWFtIChIZWFkZXIxIEhlYWRlcjIgSGVhZGVyMyAuLi4gb3IgKiBmb3IgYWxsKS4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTExIn0sICJTVFJJQ1RfVFJBTlNQT1JUX1NFQ1VSSVRZIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIm1heC1hZ2U9MzE1MzYwMDAiLCAiaGVscCI6ICJWYWx1ZSBmb3IgdGhlIFN0cmljdC1UcmFuc3BvcnQtU2VjdXJpdHkgaGVhZGVyLiIsICJpZCI6ICJzdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5IiwgImxhYmVsIjogIlN0cmljdC1UcmFuc3BvcnQtU2VjdXJpdHkiLCAicmVnZXgiOiAiXm1heC1hZ2U9XFxkKyg7IGluY2x1ZGVTdWJEb21haW5zKDsgcHJlbG9hZCk/KT8kIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl5tYXgtYWdlPVxcZCsoOyBpbmNsdWRlU3ViRG9tYWlucyg7IHByZWxvYWQpPyk/JCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAibWF4LWFnZT0zMTUzNjAwMDsgaW5jbHVkZVN1YkRvbWFpbnM7IHByZWxvYWQiLCAibmFtZSI6ICJTdHJpY3QtVHJhbnNwb3J0LVNlY3VyaXR5IiwgInByZXZfdmFsdWUiOiAibWF4LWFnZT0zMTUzNjAwMCIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVmFsdWUgZm9yIHRoZSBTdHJpY3QtVHJhbnNwb3J0LVNlY3VyaXR5IGhlYWRlci4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTEwIn0sICJDT09LSUVfQVVUT19TRUNVUkVfRkxBRyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJ5ZXMiLCAiaGVscCI6ICJBdXRvbWF0aWNhbGx5IGFkZCB0aGUgU2VjdXJlIGZsYWcgdG8gYWxsIGNvb2tpZXMuIiwgImlkIjogImNvb2tpZS1hdXRvLXNlY3VyZS1mbGFnIiwgImxhYmVsIjogIkNvb2tpZSBhdXRvIFNlY3VyZSBmbGFnIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogInllcyIsICJuYW1lIjogIkNvb2tpZSBhdXRvIFNlY3VyZSBmbGFnIiwgInByZXZfdmFsdWUiOiAieWVzIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJBdXRvbWF0aWNhbGx5IGFkZCB0aGUgU2VjdXJlIGZsYWcgdG8gYWxsIGNvb2tpZXMuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei04In0sICJDT05URU5UX1NFQ1VSSVRZX1BPTElDWSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJvYmplY3Qtc3JjICdub25lJzsgZm9ybS1hY3Rpb24gJ3NlbGYnOyBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyIsICJoZWxwIjogIlZhbHVlIGZvciB0aGUgQ29udGVudC1TZWN1cml0eS1Qb2xpY3kgaGVhZGVyLiIsICJpZCI6ICJjb250ZW50LXNlY3VyaXR5LXBvbGljeSIsICJsYWJlbCI6ICJDb250ZW50LVNlY3VyaXR5LVBvbGljeSIsICJyZWdleCI6ICJeLiokIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4uKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJuYW1lIjogIkNvbnRlbnQtU2VjdXJpdHktUG9saWN5IiwgInByZXZfdmFsdWUiOiAib2JqZWN0LXNyYyAnbm9uZSc7IGZvcm0tYWN0aW9uICdzZWxmJzsgZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlZhbHVlIGZvciB0aGUgQ29udGVudC1TZWN1cml0eS1Qb2xpY3kgaGVhZGVyLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotNyJ9LCAiQ09OVEVOVF9TRUNVUklUWV9QT0xJQ1lfUkVQT1JUX09OTFkiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAibm8iLCAiaGVscCI6ICJTZW5kIHJlcG9ydHMgZm9yIHZpb2xhdGlvbnMgb2YgdGhlIENvbnRlbnQtU2VjdXJpdHktUG9saWN5IGhlYWRlciBpbnN0ZWFkIG9mIGJsb2NraW5nIHRoZW0uIiwgImlkIjogImNvbnRlbnQtc2VjdXJpdHktcG9saWN5LXJlcG9ydC1vbmx5IiwgImxhYmVsIjogIkNvbnRlbnQtU2VjdXJpdHktUG9saWN5LVJlcG9ydC1Pbmx5IiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIm5vIiwgIm5hbWUiOiAiQ29udGVudC1TZWN1cml0eS1Qb2xpY3ktUmVwb3J0LU9ubHkiLCAicHJldl92YWx1ZSI6ICJubyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiU2VuZCByZXBvcnRzIGZvciB2aW9sYXRpb25zIG9mIHRoZSBDb250ZW50LVNlY3VyaXR5LVBvbGljeSBoZWFkZXIgaW5zdGVhZCBvZiBibG9ja2luZyB0aGVtLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotNiJ9LCAiUkVGRVJSRVJfUE9MSUNZIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogInN0cmljdC1vcmlnaW4td2hlbi1jcm9zcy1vcmlnaW4iLCAiaGVscCI6ICJWYWx1ZSBmb3IgdGhlIFJlZmVycmVyLVBvbGljeSBoZWFkZXIuIiwgImlkIjogInJlZmVycmVyLXBvbGljeSIsICJsYWJlbCI6ICJSZWZlcnJlci1Qb2xpY3kiLCAicmVnZXgiOiAiXig/IV4oLHwgKSkoKCwgKT8obm8tcmVmZXJyZXItd2hlbi1kb3duZ3JhZGV8bm8tcmVmZXJyZXJ8b3JpZ2luLXdoZW4tY3Jvc3Mtb3JpZ2lufHNhbWUtb3JpZ2lufHN0cmljdC1vcmlnaW4td2hlbi1jcm9zcy1vcmlnaW58c3RyaWN0LW9yaWdpbnxvcmlnaW58dW5zYWZlLXVybCkoPyFcXGIuKiwgXFw0XFxiKSkqJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeKD8hXigsfCApKSgoLCApPyhuby1yZWZlcnJlci13aGVuLWRvd25ncmFkZXxuby1yZWZlcnJlcnxvcmlnaW4td2hlbi1jcm9zcy1vcmlnaW58c2FtZS1vcmlnaW58c3RyaWN0LW9yaWdpbi13aGVuLWNyb3NzLW9yaWdpbnxzdHJpY3Qtb3JpZ2lufG9yaWdpbnx1bnNhZmUtdXJsKSg/IVxcYi4qLCBcXDRcXGIpKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJuby1yZWZlcnJlci13aGVuLWRvd25ncmFkZSIsICJuYW1lIjogIlJlZmVycmVyLVBvbGljeSIsICJwcmV2X3ZhbHVlIjogInN0cmljdC1vcmlnaW4td2hlbi1jcm9zcy1vcmlnaW4iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlZhbHVlIGZvciB0aGUgUmVmZXJyZXItUG9saWN5IGhlYWRlci4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTUifSwgIlBFUk1JU1NJT05TX1BPTElDWSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJhY2NlbGVyb21ldGVyPSgpLCBhbWJpZW50LWxpZ2h0LXNlbnNvcj0oKSwgYXV0b3BsYXk9KCksIGJhdHRlcnk9KCksIGNhbWVyYT0oKSwgY3Jvc3Mtb3JpZ2luLWlzb2xhdGVkPSgpLCBkaXNwbGF5LWNhcHR1cmU9KCksIGRvY3VtZW50LWRvbWFpbj0oKSwgZW5jcnlwdGVkLW1lZGlhPSgpLCBleGVjdXRpb24td2hpbGUtbm90LXJlbmRlcmVkPSgpLCBleGVjdXRpb24td2hpbGUtb3V0LW9mLXZpZXdwb3J0PSgpLCBmdWxsc2NyZWVuPSgpLCBnZW9sb2NhdGlvbj0oKSwgZ3lyb3Njb3BlPSgpLCBoaWQ9KCksIGlkbGUtZGV0ZWN0aW9uPSgpLCBtYWduZXRvbWV0ZXI9KCksIG1pY3JvcGhvbmU9KCksIG1pZGk9KCksIG5hdmlnYXRpb24tb3ZlcnJpZGU9KCksIHBheW1lbnQ9KCksIHBpY3R1cmUtaW4tcGljdHVyZT0oKSwgcHVibGlja2V5LWNyZWRlbnRpYWxzLWdldD0oKSwgc2NyZWVuLXdha2UtbG9jaz0oKSwgc2VyaWFsPSgpLCB1c2I9KCksIHdlYi1zaGFyZT0oKSwgeHItc3BhdGlhbC10cmFja2luZz0oKSIsICJoZWxwIjogIlZhbHVlIGZvciB0aGUgUGVybWlzc2lvbnMtUG9saWN5IGhlYWRlci4iLCAiaWQiOiAicGVybWlzc2lvbnMtcG9saWN5IiwgImxhYmVsIjogIlBlcm1pc3Npb25zLVBvbGljeSIsICJyZWdleCI6ICJeKD8hWywgXSkoLD8gPyhbYS16XFwtXSspKD8hLipbXlxcLV1cXDI9KT0oXFwqfFxcKCggPyhzZWxmfFxcdTAwMjJodHRwcz86XFwvXFwvW1xcLVxcd0A6JS4rfiM9XStbXFwtXFx3XFwoXFwpIUA6JSsufiM/JlxcLz0kXSpcXHUwMDIyKSg/PVsgXFwpXSkpKlxcKSkpKiQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXig/IVssIF0pKCw/ID8oW2EtelxcLV0rKSg/IS4qW15cXC1dXFwyPSk9KFxcKnxcXCgoID8oc2VsZnxcXHUwMDIyaHR0cHM/OlxcL1xcL1tcXC1cXHdAOiUuK34jPV0rW1xcLVxcd1xcKFxcKSFAOiUrLn4jPyZcXC89JF0qXFx1MDAyMikoPz1bIFxcKV0pKSpcXCkpKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJhY2NlbGVyb21ldGVyPSgpLCBhbWJpZW50LWxpZ2h0LXNlbnNvcj0oKSwgYXR0cmlidXRpb24tcmVwb3J0aW5nPSgpLCBhdXRvcGxheT0oKSwgYmF0dGVyeT0oKSwgYmx1ZXRvb3RoPSgpLCBicm93c2luZy10b3BpY3M9KCksIGNhbWVyYT0oKSwgY29tcHV0ZS1wcmVzc3VyZT0oKSwgZGlzcGxheS1jYXB0dXJlPSgpLCBkb2N1bWVudC1kb21haW49KCksIGVuY3J5cHRlZC1tZWRpYT0oKSwgZXhlY3V0aW9uLXdoaWxlLW5vdC1yZW5kZXJlZD0oKSwgZXhlY3V0aW9uLXdoaWxlLW91dC1vZi12aWV3cG9ydD0oKSwgZnVsbHNjcmVlbj0oKSwgZ2FtZXBhZD0oKSwgZ2VvbG9jYXRpb249KCksIGd5cm9zY29wZT0oKSwgaGlkPSgpLCBpZGVudGl0eS1jcmVkZW50aWFscy1nZXQ9KCksIGlkbGUtZGV0ZWN0aW9uPSgpLCBsb2NhbC1mb250cz0oKSwgbWFnbmV0b21ldGVyPSgpLCBtaWNyb3Bob25lPSgpLCBtaWRpPSgpLCBvdHAtY3JlZGVudGlhbHM9KCksIHBheW1lbnQ9KCksIHBpY3R1cmUtaW4tcGljdHVyZT0oKSwgcHVibGlja2V5LWNyZWRlbnRpYWxzLWNyZWF0ZT0oKSwgcHVibGlja2V5LWNyZWRlbnRpYWxzLWdldD0oKSwgc2NyZWVuLXdha2UtbG9jaz0oKSwgc2VyaWFsPSgpLCBzcGVha2VyLXNlbGVjdGlvbj0oKSwgc3RvcmFnZS1hY2Nlc3M9KCksIHVzYj0oKSwgd2ViLXNoYXJlPSgpLCB3aW5kb3ctbWFuYWdlbWVudD0oKSwgeHItc3BhdGlhbC10cmFja2luZz0oKSIsICJuYW1lIjogIlBlcm1pc3Npb25zLVBvbGljeSIsICJwcmV2X3ZhbHVlIjogImFjY2VsZXJvbWV0ZXI9KCksIGFtYmllbnQtbGlnaHQtc2Vuc29yPSgpLCBhdXRvcGxheT0oKSwgYmF0dGVyeT0oKSwgY2FtZXJhPSgpLCBjcm9zcy1vcmlnaW4taXNvbGF0ZWQ9KCksIGRpc3BsYXktY2FwdHVyZT0oKSwgZG9jdW1lbnQtZG9tYWluPSgpLCBlbmNyeXB0ZWQtbWVkaWE9KCksIGV4ZWN1dGlvbi13aGlsZS1ub3QtcmVuZGVyZWQ9KCksIGV4ZWN1dGlvbi13aGlsZS1vdXQtb2Ytdmlld3BvcnQ9KCksIGZ1bGxzY3JlZW49KCksIGdlb2xvY2F0aW9uPSgpLCBneXJvc2NvcGU9KCksIGhpZD0oKSwgaWRsZS1kZXRlY3Rpb249KCksIG1hZ25ldG9tZXRlcj0oKSwgbWljcm9waG9uZT0oKSwgbWlkaT0oKSwgbmF2aWdhdGlvbi1vdmVycmlkZT0oKSwgcGF5bWVudD0oKSwgcGljdHVyZS1pbi1waWN0dXJlPSgpLCBwdWJsaWNrZXktY3JlZGVudGlhbHMtZ2V0PSgpLCBzY3JlZW4td2FrZS1sb2NrPSgpLCBzZXJpYWw9KCksIHVzYj0oKSwgd2ViLXNoYXJlPSgpLCB4ci1zcGF0aWFsLXRyYWNraW5nPSgpIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJWYWx1ZSBmb3IgdGhlIFBlcm1pc3Npb25zLVBvbGljeSBoZWFkZXIuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei00In0sICJGRUFUVVJFX1BPTElDWSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJhY2NlbGVyb21ldGVyICdub25lJzsgYW1iaWVudC1saWdodC1zZW5zb3IgJ25vbmUnOyBhdXRvcGxheSAnbm9uZSc7IGJhdHRlcnkgJ25vbmUnOyBjYW1lcmEgJ25vbmUnOyBkaXNwbGF5LWNhcHR1cmUgJ25vbmUnOyBkb2N1bWVudC1kb21haW4gJ25vbmUnOyBlbmNyeXB0ZWQtbWVkaWEgJ25vbmUnOyBleGVjdXRpb24td2hpbGUtbm90LXJlbmRlcmVkICdub25lJzsgZXhlY3V0aW9uLXdoaWxlLW91dC1vZi12aWV3cG9ydCAnbm9uZSc7IGZ1bGxzY3JlZW4gJ25vbmUnOyBnZW9sb2NhdGlvbiAnbm9uZSc7IGd5cm9zY29wZSAnbm9uZSc7IGxheW91dC1hbmltYXRpb24gJ25vbmUnOyBsZWdhY3ktaW1hZ2UtZm9ybWF0cyAnbm9uZSc7IG1hZ25ldG9tZXRlciAnbm9uZSc7IG1pY3JvcGhvbmUgJ25vbmUnOyBtaWRpICdub25lJzsgbmF2aWdhdGlvbi1vdmVycmlkZSAnbm9uZSc7IHBheW1lbnQgJ25vbmUnOyBwaWN0dXJlLWluLXBpY3R1cmUgJ25vbmUnOyBwdWJsaWNrZXktY3JlZGVudGlhbHMtZ2V0ICdub25lJzsgc3BlYWtlci1zZWxlY3Rpb24gJ25vbmUnOyBzeW5jLXhociAnbm9uZSc7IHVub3B0aW1pemVkLWltYWdlcyAnbm9uZSc7IHVuc2l6ZWQtbWVkaWEgJ25vbmUnOyB1c2IgJ25vbmUnOyBzY3JlZW4td2FrZS1sb2NrICdub25lJzsgd2ViLXNoYXJlICdub25lJzsgeHItc3BhdGlhbC10cmFja2luZyAnbm9uZSc7IiwgImhlbHAiOiAiVmFsdWUgZm9yIHRoZSBGZWF0dXJlLVBvbGljeSBoZWFkZXIuIiwgImlkIjogImZlYXR1cmUtcG9saWN5IiwgImxhYmVsIjogIkZlYXR1cmUtUG9saWN5IiwgInJlZ2V4IjogIl4oPyFbOyBdKSggPyhbXFx3XFwtXSspKD8hLipbXlxcLV1cXDIgKSggKCcobm9uZXxzZWxmfHN0cmljdC1keW5hbWljfHJlcG9ydC1zYW1wbGV8dW5zYWZlLWlubGluZXx1bnNhZmUtZXZhbHx1bnNhZmUtaGFzaGVzfHVuc2FmZS1hbGxvdy1yZWRpcmVjdHMpJ3xodHRwcz86XFwvXFwvW1xcd0A6JS4rfiM9XFwtXStbXFx3XFwoXFwpIUA6JSsufiM/JlxcLz0kXFwtXSopKSs7KSokIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4oPyFbOyBdKSggPyhbXFx3XFwtXSspKD8hLipbXlxcLV1cXDIgKSggKCcobm9uZXxzZWxmfHN0cmljdC1keW5hbWljfHJlcG9ydC1zYW1wbGV8dW5zYWZlLWlubGluZXx1bnNhZmUtZXZhbHx1bnNhZmUtaGFzaGVzfHVuc2FmZS1hbGxvdy1yZWRpcmVjdHMpJ3xodHRwcz86XFwvXFwvW1xcd0A6JS4rfiM9XFwtXStbXFx3XFwoXFwpIUA6JSsufiM/JlxcLz0kXFwtXSopKSs7KSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJhY2NlbGVyb21ldGVyICdub25lJzsgYW1iaWVudC1saWdodC1zZW5zb3IgJ25vbmUnOyBhdXRvcGxheSAnbm9uZSc7IGJhdHRlcnkgJ25vbmUnOyBjYW1lcmEgJ25vbmUnOyBkaXNwbGF5LWNhcHR1cmUgJ25vbmUnOyBkb2N1bWVudC1kb21haW4gJ25vbmUnOyBlbmNyeXB0ZWQtbWVkaWEgJ25vbmUnOyBleGVjdXRpb24td2hpbGUtbm90LXJlbmRlcmVkICdub25lJzsgZXhlY3V0aW9uLXdoaWxlLW91dC1vZi12aWV3cG9ydCAnbm9uZSc7IGZ1bGxzY3JlZW4gJ25vbmUnOyBnZW9sb2NhdGlvbiAnbm9uZSc7IGd5cm9zY29wZSAnbm9uZSc7IGxheW91dC1hbmltYXRpb24gJ25vbmUnOyBsZWdhY3ktaW1hZ2UtZm9ybWF0cyAnbm9uZSc7IG1hZ25ldG9tZXRlciAnbm9uZSc7IG1pY3JvcGhvbmUgJ25vbmUnOyBtaWRpICdub25lJzsgbmF2aWdhdGlvbi1vdmVycmlkZSAnbm9uZSc7IHBheW1lbnQgJ25vbmUnOyBwaWN0dXJlLWluLXBpY3R1cmUgJ25vbmUnOyBwdWJsaWNrZXktY3JlZGVudGlhbHMtZ2V0ICdub25lJzsgc3BlYWtlci1zZWxlY3Rpb24gJ25vbmUnOyBzeW5jLXhociAnbm9uZSc7IHVub3B0aW1pemVkLWltYWdlcyAnbm9uZSc7IHVuc2l6ZWQtbWVkaWEgJ25vbmUnOyB1c2IgJ25vbmUnOyBzY3JlZW4td2FrZS1sb2NrICdub25lJzsgd2ViLXNoYXJlICdub25lJzsgeHItc3BhdGlhbC10cmFja2luZyAnbm9uZSc7IiwgIm5hbWUiOiAiRmVhdHVyZS1Qb2xpY3kiLCAicHJldl92YWx1ZSI6ICJhY2NlbGVyb21ldGVyICdub25lJzsgYW1iaWVudC1saWdodC1zZW5zb3IgJ25vbmUnOyBhdXRvcGxheSAnbm9uZSc7IGJhdHRlcnkgJ25vbmUnOyBjYW1lcmEgJ25vbmUnOyBkaXNwbGF5LWNhcHR1cmUgJ25vbmUnOyBkb2N1bWVudC1kb21haW4gJ25vbmUnOyBlbmNyeXB0ZWQtbWVkaWEgJ25vbmUnOyBleGVjdXRpb24td2hpbGUtbm90LXJlbmRlcmVkICdub25lJzsgZXhlY3V0aW9uLXdoaWxlLW91dC1vZi12aWV3cG9ydCAnbm9uZSc7IGZ1bGxzY3JlZW4gJ25vbmUnOyBnZW9sb2NhdGlvbiAnbm9uZSc7IGd5cm9zY29wZSAnbm9uZSc7IGxheW91dC1hbmltYXRpb24gJ25vbmUnOyBsZWdhY3ktaW1hZ2UtZm9ybWF0cyAnbm9uZSc7IG1hZ25ldG9tZXRlciAnbm9uZSc7IG1pY3JvcGhvbmUgJ25vbmUnOyBtaWRpICdub25lJzsgbmF2aWdhdGlvbi1vdmVycmlkZSAnbm9uZSc7IHBheW1lbnQgJ25vbmUnOyBwaWN0dXJlLWluLXBpY3R1cmUgJ25vbmUnOyBwdWJsaWNrZXktY3JlZGVudGlhbHMtZ2V0ICdub25lJzsgc3BlYWtlci1zZWxlY3Rpb24gJ25vbmUnOyBzeW5jLXhociAnbm9uZSc7IHVub3B0aW1pemVkLWltYWdlcyAnbm9uZSc7IHVuc2l6ZWQtbWVkaWEgJ25vbmUnOyB1c2IgJ25vbmUnOyBzY3JlZW4td2FrZS1sb2NrICdub25lJzsgd2ViLXNoYXJlICdub25lJzsgeHItc3BhdGlhbC10cmFja2luZyAnbm9uZSc7IiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJWYWx1ZSBmb3IgdGhlIEZlYXR1cmUtUG9saWN5IGhlYWRlci4ifV0sICJtZXRob2QiOiAidWkiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0zIn0sICJYX0ZSQU1FX09QVElPTlMiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiU0FNRU9SSUdJTiIsICJoZWxwIjogIlZhbHVlIGZvciB0aGUgWC1GcmFtZS1PcHRpb25zIGhlYWRlci4iLCAiaWQiOiAieC1mcmFtZS1vcHRpb25zIiwgImxhYmVsIjogIlgtRnJhbWUtT3B0aW9ucyIsICJyZWdleCI6ICJeKERFTll8U0FNRU9SSUdJTik/JCIsICJ0eXBlIjogInNlbGVjdCIsICJwYXR0ZXJuIjogIl4oREVOWXxTQU1FT1JJR0lOKT8kIiwgImlucFR5cGUiOiAic2VsZWN0IiwgInZhbHVlcyI6IFsiIiwgIkRFTlkiLCAiU0FNRU9SSUdJTiJdLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJTQU1FT1JJR0lOIiwgIm5hbWUiOiAiWC1GcmFtZS1PcHRpb25zIiwgInByZXZfdmFsdWUiOiAiU0FNRU9SSUdJTiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVmFsdWUgZm9yIHRoZSBYLUZyYW1lLU9wdGlvbnMgaGVhZGVyLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMiJ9LCAiWF9DT05URU5UX1RZUEVfT1BUSU9OUyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJub3NuaWZmIiwgImhlbHAiOiAiVmFsdWUgZm9yIHRoZSBYLUNvbnRlbnQtVHlwZS1PcHRpb25zIGhlYWRlci4iLCAiaWQiOiAieC1jb250ZW50LXR5cGUtb3B0aW9ucyIsICJsYWJlbCI6ICJYLUNvbnRlbnQtVHlwZS1PcHRpb25zIiwgInJlZ2V4IjogIl4obm9zbmlmZik/JCIsICJ0eXBlIjogInNlbGVjdCIsICJwYXR0ZXJuIjogIl4obm9zbmlmZik/JCIsICJpbnBUeXBlIjogInNlbGVjdCIsICJ2YWx1ZXMiOiBbIiIsICJub3NuaWZmIl0sICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIm5vc25pZmYiLCAibmFtZSI6ICJYLUNvbnRlbnQtVHlwZS1PcHRpb25zIiwgInByZXZfdmFsdWUiOiAibm9zbmlmZiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVmFsdWUgZm9yIHRoZSBYLUNvbnRlbnQtVHlwZS1PcHRpb25zIGhlYWRlci4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTEifSwgIlhfWFNTX1BST1RFQ1RJT04iOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiMTsgbW9kZT1ibG9jayIsICJoZWxwIjogIlZhbHVlIGZvciB0aGUgWC1YU1MtUHJvdGVjdGlvbiBoZWFkZXIuIiwgImlkIjogIngteHNzLXByb3RlY3Rpb24iLCAibGFiZWwiOiAiWC1YU1MtUHJvdGVjdGlvbiIsICJyZWdleCI6ICJeMHwxKDsgKG1vZGU9YmxvY2t8cmVwb3J0PWh0dHBzPzpcXC9cXC9bXFwtXFx3QDolLit+Iz1dK1tcXC1cXHdcXChcXCkhQDolKy5+Iz8mXFwvPSRdKikpPyQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXjB8MSg7IChtb2RlPWJsb2NrfHJlcG9ydD1odHRwcz86XFwvXFwvW1xcLVxcd0A6JS4rfiM9XStbXFwtXFx3XFwoXFwpIUA6JSsufiM/JlxcLz0kXSopKT8kIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIxOyBtb2RlPWJsb2NrIiwgIm5hbWUiOiAiWC1YU1MtUHJvdGVjdGlvbiIsICJwcmV2X3ZhbHVlIjogIjE7IG1vZGU9YmxvY2siLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlZhbHVlIGZvciB0aGUgWC1YU1MtUHJvdGVjdGlvbiBoZWFkZXIuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0wIn19LCAiY2hlY2tzdW0iOiBudWxsLCAibXVsdGlwbGVzX3NjaGVtYSI6IHsiY3VzdG9tLWhlYWRlcnMiOiB7IkNVU1RPTV9IRUFERVIiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiQ3VzdG9tIGhlYWRlciB0byBhZGQgKEhlYWRlck5hbWU6IEhlYWRlclZhbHVlKS4iLCAiaWQiOiAiY3VzdG9tLWhlYWRlciIsICJsYWJlbCI6ICJDdXN0b20gaGVhZGVyIChIZWFkZXJOYW1lOiBIZWFkZXJWYWx1ZSkiLCAicmVnZXgiOiAiXihbXFx3XFwtXSs6IC4rKT8kIiwgInR5cGUiOiAidGV4dCIsICJtdWx0aXBsZSI6ICJjdXN0b20taGVhZGVycyIsICJwYXR0ZXJuIjogIl4oW1xcd1xcLV0rOiAuKyk/JCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm5hbWUiOiAiQ3VzdG9tIGhlYWRlciAoSGVhZGVyTmFtZTogSGVhZGVyVmFsdWUpIiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJDdXN0b20gaGVhZGVyIHRvIGFkZCAoSGVhZGVyTmFtZTogSGVhZGVyVmFsdWUpLiJ9XSwgImNvbnRhaW5lckNsYXNzIjogInotMTMifX0sICJjb29raWUtZmxhZ3MiOiB7IkNPT0tJRV9GTEFHUyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIqIEh0dHBPbmx5IFNhbWVTaXRlPUxheCIsICJoZWxwIjogIkNvb2tpZSBmbGFncyBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIGFsbCBjb29raWVzICh2YWx1ZSBhY2NlcHRlZCBmb3IgbmdpbnhfY29va2llX2ZsYWdfbW9kdWxlKS4iLCAiaWQiOiAiY29va2llLWZsYWdzIiwgImxhYmVsIjogIkNvb2tpZSBmbGFncyIsICJyZWdleCI6ICJeKFxcKnxbXjtdKykoIChIdHRwT25seXwoU2FtZVNpdGUpKD8hLipcXDQpKD0oTGF4fFN0cmljdCkpPykoPyEuKlxcMykpKiQiLCAidHlwZSI6ICJ0ZXh0IiwgIm11bHRpcGxlIjogImNvb2tpZS1mbGFncyIsICJwYXR0ZXJuIjogIl4oXFwqfFteO10rKSggKEh0dHBPbmx5fChTYW1lU2l0ZSkoPyEuKlxcNCkoPShMYXh8U3RyaWN0KSk/KSg/IS4qXFwzKSkqJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiKiBIdHRwT25seSBTYW1lU2l0ZT1MYXgiLCAibmFtZSI6ICJDb29raWUgZmxhZ3MiLCAicHJldl92YWx1ZSI6ICIqIEh0dHBPbmx5IFNhbWVTaXRlPUxheCIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiQ29va2llIGZsYWdzIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gYWxsIGNvb2tpZXMgKHZhbHVlIGFjY2VwdGVkIGZvciBuZ2lueF9jb29raWVfZmxhZ19tb2R1bGUpLiJ9XSwgImNvbnRhaW5lckNsYXNzIjogInotMTIifX19LCAibXVsdGlwbGVzIjogeyJjdXN0b20taGVhZGVycyI6IHsiMCI6IHsiQ1VTVE9NX0hFQURFUiI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJDdXN0b20gaGVhZGVyIHRvIGFkZCAoSGVhZGVyTmFtZTogSGVhZGVyVmFsdWUpLiIsICJpZCI6ICJjdXN0b20taGVhZGVyIiwgImxhYmVsIjogIkN1c3RvbSBoZWFkZXIgKEhlYWRlck5hbWU6IEhlYWRlclZhbHVlKSIsICJyZWdleCI6ICJeKFtcXHdcXC1dKzogLispPyQiLCAidHlwZSI6ICJ0ZXh0IiwgIm11bHRpcGxlIjogImN1c3RvbS1oZWFkZXJzIiwgInBhdHRlcm4iOiAiXihbXFx3XFwtXSs6IC4rKT8kIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibmFtZSI6ICJDdXN0b20gaGVhZGVyIChIZWFkZXJOYW1lOiBIZWFkZXJWYWx1ZSkiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkN1c3RvbSBoZWFkZXIgdG8gYWRkIChIZWFkZXJOYW1lOiBIZWFkZXJWYWx1ZSkuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xMyIsICJtZXRob2QiOiAiZGVmYXVsdCJ9fSwgIjIiOiB7IkNVU1RPTV9IRUFERVJfMiI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJDdXN0b20gaGVhZGVyIHRvIGFkZCAoSGVhZGVyTmFtZTogSGVhZGVyVmFsdWUpLiIsICJpZCI6ICJjdXN0b20taGVhZGVyLTIiLCAibGFiZWwiOiAiQ3VzdG9tIGhlYWRlciAoSGVhZGVyTmFtZTogSGVhZGVyVmFsdWUpIiwgInJlZ2V4IjogIl4oW1xcd1xcLV0rOiAuKyk/JCIsICJ0eXBlIjogInRleHQiLCAibXVsdGlwbGUiOiAiY3VzdG9tLWhlYWRlcnMiLCAicGF0dGVybiI6ICJeKFtcXHdcXC1dKzogLispPyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogImR6ZHoiLCAibmFtZSI6ICJDdXN0b20gaGVhZGVyIChIZWFkZXJOYW1lOiBIZWFkZXJWYWx1ZSkiLCAicHJldl92YWx1ZSI6ICJkemR6IiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJDdXN0b20gaGVhZGVyIHRvIGFkZCAoSGVhZGVyTmFtZTogSGVhZGVyVmFsdWUpLiJ9XSwgImNvbnRhaW5lckNsYXNzIjogInotMTMiLCAibWV0aG9kIjogImRlZmF1bHQifX19LCAiY29va2llLWZsYWdzIjogeyIwIjogeyJDT09LSUVfRkxBR1MiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiKiBIdHRwT25seSBTYW1lU2l0ZT1MYXgiLCAiaGVscCI6ICJDb29raWUgZmxhZ3MgYXV0b21hdGljYWxseSBhZGRlZCB0byBhbGwgY29va2llcyAodmFsdWUgYWNjZXB0ZWQgZm9yIG5naW54X2Nvb2tpZV9mbGFnX21vZHVsZSkuIiwgImlkIjogImNvb2tpZS1mbGFncyIsICJsYWJlbCI6ICJDb29raWUgZmxhZ3MiLCAicmVnZXgiOiAiXihcXCp8W147XSspKCAoSHR0cE9ubHl8KFNhbWVTaXRlKSg/IS4qXFw0KSg9KExheHxTdHJpY3QpKT8pKD8hLipcXDMpKSokIiwgInR5cGUiOiAidGV4dCIsICJtdWx0aXBsZSI6ICJjb29raWUtZmxhZ3MiLCAicGF0dGVybiI6ICJeKFxcKnxbXjtdKykoIChIdHRwT25seXwoU2FtZVNpdGUpKD8hLipcXDQpKD0oTGF4fFN0cmljdCkpPykoPyEuKlxcMykpKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiogSHR0cE9ubHkgU2FtZVNpdGU9TGF4IiwgIm5hbWUiOiAiQ29va2llIGZsYWdzIiwgInByZXZfdmFsdWUiOiAiKiBIdHRwT25seSBTYW1lU2l0ZT1MYXgiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkNvb2tpZSBmbGFncyBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIGFsbCBjb29raWVzICh2YWx1ZSBhY2NlcHRlZCBmb3IgbmdpbnhfY29va2llX2ZsYWdfbW9kdWxlKS4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTEyIiwgIm1ldGhvZCI6ICJkZWZhdWx0In19fX19LCB7ImlkIjogImxldHNlbmNyeXB0IiwgInN0cmVhbSI6ICJ5ZXMiLCAibmFtZSI6ICJMZXQncyBFbmNyeXB0IiwgImRlc2NyaXB0aW9uIjogIkF1dG9tYXRpYyBjcmVhdGlvbiwgcmVuZXdhbCBhbmQgY29uZmlndXJhdGlvbiBvZiBMZXQncyBFbmNyeXB0IGNlcnRpZmljYXRlcy4iLCAidmVyc2lvbiI6ICIxLjAiLCAidHlwZSI6ICJjb3JlIiwgIm1ldGhvZCI6ICJtYW51YWwiLCAicGFnZSI6IGZhbHNlLCAic2V0dGluZ3MiOiB7IkFVVE9fTEVUU19FTkNSWVBUIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIm5vIiwgImhlbHAiOiAiQWN0aXZhdGUgYXV0b21hdGljIExldCdzIEVuY3J5cHQgbW9kZS4iLCAiaWQiOiAiYXV0by1sZXRzLWVuY3J5cHQiLCAibGFiZWwiOiAiQXV0b21hdGljIExldCdzIEVuY3J5cHQiLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAieWVzIiwgIm5hbWUiOiAiQXV0b21hdGljIExldCdzIEVuY3J5cHQiLCAicHJldl92YWx1ZSI6ICJubyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiQWN0aXZhdGUgYXV0b21hdGljIExldCdzIEVuY3J5cHQgbW9kZS4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTIifSwgIkVNQUlMX0xFVFNfRU5DUllQVCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJFbWFpbCB1c2VkIGZvciBMZXQncyBFbmNyeXB0IG5vdGlmaWNhdGlvbiBhbmQgaW4gY2VydGlmaWNhdGUuIiwgImlkIjogImVtYWlsLWxldHMtZW5jcnlwdCIsICJsYWJlbCI6ICJFbWFpbCBMZXQncyBFbmNyeXB0IiwgInJlZ2V4IjogIl4oW15AIFxcdFxcclxcbl0rQFteQCBcXHRcXHJcXG5dK1xcLlteQCBcXHRcXHJcXG5dKyk/JCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeKFteQCBcXHRcXHJcXG5dK0BbXkAgXFx0XFxyXFxuXStcXC5bXkAgXFx0XFxyXFxuXSspPyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJuYW1lIjogIkVtYWlsIExldCdzIEVuY3J5cHQiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkVtYWlsIHVzZWQgZm9yIExldCdzIEVuY3J5cHQgbm90aWZpY2F0aW9uIGFuZCBpbiBjZXJ0aWZpY2F0ZS4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTEifSwgIlVTRV9MRVRTX0VOQ1JZUFRfU1RBR0lORyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJubyIsICJoZWxwIjogIlVzZSB0aGUgc3RhZ2luZyBlbnZpcm9ubWVudCBmb3IgTGV0XHUyMDE5cyBFbmNyeXB0IGNlcnRpZmljYXRlIGdlbmVyYXRpb24uIFVzZWZ1bCB3aGVuIHlvdSBhcmUgdGVzdGluZyB5b3VyIGRlcGxveW1lbnRzIHRvIGF2b2lkIGJlaW5nIHJhdGUgbGltaXRlZCBpbiB0aGUgcHJvZHVjdGlvbiBlbnZpcm9ubWVudC4iLCAiaWQiOiAidXNlLWxldHMtZW5jcnlwdC1zdGFnaW5nIiwgImxhYmVsIjogIlVzZSBMZXQncyBFbmNyeXB0IFN0YWdpbmciLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAibm8iLCAibmFtZSI6ICJVc2UgTGV0J3MgRW5jcnlwdCBTdGFnaW5nIiwgInByZXZfdmFsdWUiOiAibm8iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlVzZSB0aGUgc3RhZ2luZyBlbnZpcm9ubWVudCBmb3IgTGV0XHUyMDE5cyBFbmNyeXB0IGNlcnRpZmljYXRlIGdlbmVyYXRpb24uIFVzZWZ1bCB3aGVuIHlvdSBhcmUgdGVzdGluZyB5b3VyIGRlcGxveW1lbnRzIHRvIGF2b2lkIGJlaW5nIHJhdGUgbGltaXRlZCBpbiB0aGUgcHJvZHVjdGlvbiBlbnZpcm9ubWVudC4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTAifX0sICJjaGVja3N1bSI6IG51bGx9LCB7ImlkIjogImxpbWl0IiwgInN0cmVhbSI6ICJwYXJ0aWFsIiwgIm5hbWUiOiAiTGltaXQiLCAiZGVzY3JpcHRpb24iOiAiTGltaXQgbWF4aW11bSBudW1iZXIgb2YgcmVxdWVzdHMgYW5kIGNvbm5lY3Rpb25zLiIsICJ2ZXJzaW9uIjogIjEuMCIsICJ0eXBlIjogImNvcmUiLCAibWV0aG9kIjogIm1hbnVhbCIsICJwYWdlIjogdHJ1ZSwgInNldHRpbmdzIjogeyJVU0VfTElNSVRfUkVRIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogInllcyIsICJoZWxwIjogIkFjdGl2YXRlIGxpbWl0IHJlcXVlc3RzIGZlYXR1cmUuIiwgImlkIjogInVzZS1saW1pdC1yZXEiLCAibGFiZWwiOiAiQWN0aXZhdGUgbGltaXQgcmVxdWVzdHMiLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAieWVzIiwgIm5hbWUiOiAiQWN0aXZhdGUgbGltaXQgcmVxdWVzdHMiLCAicHJldl92YWx1ZSI6ICJ5ZXMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkFjdGl2YXRlIGxpbWl0IHJlcXVlc3RzIGZlYXR1cmUuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei02In0sICJVU0VfTElNSVRfQ09OTiI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJ5ZXMiLCAiaGVscCI6ICJBY3RpdmF0ZSBsaW1pdCBjb25uZWN0aW9ucyBmZWF0dXJlLiIsICJpZCI6ICJ1c2UtbGltaXQtY29ubiIsICJsYWJlbCI6ICJBY3RpdmF0ZSBsaW1pdCBjb25uZWN0aW9ucyIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJ5ZXMiLCAibmFtZSI6ICJBY3RpdmF0ZSBsaW1pdCBjb25uZWN0aW9ucyIsICJwcmV2X3ZhbHVlIjogInllcyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiQWN0aXZhdGUgbGltaXQgY29ubmVjdGlvbnMgZmVhdHVyZS4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTMifSwgIkxJTUlUX0NPTk5fTUFYX0hUVFAxIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIjEwIiwgImhlbHAiOiAiTWF4aW11bSBudW1iZXIgb2YgY29ubmVjdGlvbnMgcGVyIElQIHdoZW4gdXNpbmcgSFRUUC8xLlggcHJvdG9jb2wuIiwgImlkIjogImxpbWl0LWNvbm4tbWF4LWh0dHAxIiwgImxhYmVsIjogIk1heGltdW0gbnVtYmVyIG9mIEhUVFAvMS5YIGNvbm5lY3Rpb25zIiwgInJlZ2V4IjogIl5cXGQrJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeXFxkKyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjI1IiwgIm5hbWUiOiAiTWF4aW11bSBudW1iZXIgb2YgSFRUUC8xLlggY29ubmVjdGlvbnMiLCAicHJldl92YWx1ZSI6ICIxMCIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTWF4aW11bSBudW1iZXIgb2YgY29ubmVjdGlvbnMgcGVyIElQIHdoZW4gdXNpbmcgSFRUUC8xLlggcHJvdG9jb2wuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yIn0sICJMSU1JVF9DT05OX01BWF9IVFRQMiI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIxMDAiLCAiaGVscCI6ICJNYXhpbXVtIG51bWJlciBvZiBzdHJlYW1zIHBlciBJUCB3aGVuIHVzaW5nIEhUVFAvMiBwcm90b2NvbC4iLCAiaWQiOiAibGltaXQtY29ubi1tYXgtaHR0cDIiLCAibGFiZWwiOiAiTWF4aW11bSBudW1iZXIgb2YgSFRUUC8yIHN0cmVhbXMiLCAicmVnZXgiOiAiXlxcZCskIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl5cXGQrJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiMjAwIiwgIm5hbWUiOiAiTWF4aW11bSBudW1iZXIgb2YgSFRUUC8yIHN0cmVhbXMiLCAicHJldl92YWx1ZSI6ICIxMDAiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIk1heGltdW0gbnVtYmVyIG9mIHN0cmVhbXMgcGVyIElQIHdoZW4gdXNpbmcgSFRUUC8yIHByb3RvY29sLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMSJ9LCAiTElNSVRfQ09OTl9NQVhfU1RSRUFNIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIjEwIiwgImhlbHAiOiAiTWF4aW11bSBudW1iZXIgb2YgY29ubmVjdGlvbnMgcGVyIElQIHdoZW4gdXNpbmcgc3RyZWFtLiIsICJpZCI6ICJsaW1pdC1jb25uLW1heC1zdHJlYW0iLCAibGFiZWwiOiAiTWF4aW11bSBudW1iZXIgb2Ygc3RyZWFtIGNvbm5lY3Rpb25zIiwgInJlZ2V4IjogIl5cXGQrJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeXFxkKyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjEwIiwgIm5hbWUiOiAiTWF4aW11bSBudW1iZXIgb2Ygc3RyZWFtIGNvbm5lY3Rpb25zIiwgInByZXZfdmFsdWUiOiAiMTAiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIk1heGltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHBlciBJUCB3aGVuIHVzaW5nIHN0cmVhbS4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTAifX0sICJjaGVja3N1bSI6IG51bGwsICJtdWx0aXBsZXNfc2NoZW1hIjogeyJsaW1pdC1yZXEiOiB7IkxJTUlUX1JFUV9VUkwiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiLyIsICJoZWxwIjogIlVSTCAoUENSRSByZWdleCkgd2hlcmUgdGhlIGxpbWl0IHJlcXVlc3Qgd2lsbCBiZSBhcHBsaWVkIG9yIHNwZWNpYWwgdmFsdWUgLyBmb3IgYWxsIHJlcXVlc3RzLiIsICJpZCI6ICJsaW1pdC1yZXEtdXJsIiwgImxhYmVsIjogIkxpbWl0IHJlcXVlc3QgVVJMIiwgInJlZ2V4IjogIl4uKyQiLCAidHlwZSI6ICJ0ZXh0IiwgIm11bHRpcGxlIjogImxpbWl0LXJlcSIsICJwYXR0ZXJuIjogIl4uKyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIi8iLCAibmFtZSI6ICJMaW1pdCByZXF1ZXN0IFVSTCIsICJwcmV2X3ZhbHVlIjogIi8iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlVSTCAoUENSRSByZWdleCkgd2hlcmUgdGhlIGxpbWl0IHJlcXVlc3Qgd2lsbCBiZSBhcHBsaWVkIG9yIHNwZWNpYWwgdmFsdWUgLyBmb3IgYWxsIHJlcXVlc3RzLiJ9XSwgImNvbnRhaW5lckNsYXNzIjogInotNiJ9LCAiTElNSVRfUkVRX1JBVEUiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiMnIvcyIsICJoZWxwIjogIlJhdGUgdG8gYXBwbHkgdG8gdGhlIFVSTCAocyBmb3Igc2Vjb25kLCBtIGZvciBtaW51dGUsIGggZm9yIGhvdXIgYW5kIGQgZm9yIGRheSkuIiwgImlkIjogImxpbWl0LXJlcS1yYXRlIiwgImxhYmVsIjogIkxpbWl0IHJlcXVlc3QgUmF0ZSIsICJyZWdleCI6ICJeXFxkK3IvW3NtaGRdJCIsICJ0eXBlIjogInRleHQiLCAibXVsdGlwbGUiOiAibGltaXQtcmVxIiwgInBhdHRlcm4iOiAiXlxcZCtyL1tzbWhkXSQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjJyL3MiLCAibmFtZSI6ICJMaW1pdCByZXF1ZXN0IFJhdGUiLCAicHJldl92YWx1ZSI6ICIyci9zIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJSYXRlIHRvIGFwcGx5IHRvIHRoZSBVUkwgKHMgZm9yIHNlY29uZCwgbSBmb3IgbWludXRlLCBoIGZvciBob3VyIGFuZCBkIGZvciBkYXkpLiJ9XSwgImNvbnRhaW5lckNsYXNzIjogInotNSJ9fX0sICJtdWx0aXBsZXMiOiB7ImxpbWl0LXJlcSI6IHsiMCI6IHsiTElNSVRfUkVRX1VSTCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIvIiwgImhlbHAiOiAiVVJMIChQQ1JFIHJlZ2V4KSB3aGVyZSB0aGUgbGltaXQgcmVxdWVzdCB3aWxsIGJlIGFwcGxpZWQgb3Igc3BlY2lhbCB2YWx1ZSAvIGZvciBhbGwgcmVxdWVzdHMuIiwgImlkIjogImxpbWl0LXJlcS11cmwiLCAibGFiZWwiOiAiTGltaXQgcmVxdWVzdCBVUkwiLCAicmVnZXgiOiAiXi4rJCIsICJ0eXBlIjogInRleHQiLCAibXVsdGlwbGUiOiAibGltaXQtcmVxIiwgInBhdHRlcm4iOiAiXi4rJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiLyIsICJuYW1lIjogIkxpbWl0IHJlcXVlc3QgVVJMIiwgInByZXZfdmFsdWUiOiAiLyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVVJMIChQQ1JFIHJlZ2V4KSB3aGVyZSB0aGUgbGltaXQgcmVxdWVzdCB3aWxsIGJlIGFwcGxpZWQgb3Igc3BlY2lhbCB2YWx1ZSAvIGZvciBhbGwgcmVxdWVzdHMuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei02IiwgIm1ldGhvZCI6ICJkZWZhdWx0In0sICJMSU1JVF9SRVFfUkFURSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIyci9zIiwgImhlbHAiOiAiUmF0ZSB0byBhcHBseSB0byB0aGUgVVJMIChzIGZvciBzZWNvbmQsIG0gZm9yIG1pbnV0ZSwgaCBmb3IgaG91ciBhbmQgZCBmb3IgZGF5KS4iLCAiaWQiOiAibGltaXQtcmVxLXJhdGUiLCAibGFiZWwiOiAiTGltaXQgcmVxdWVzdCBSYXRlIiwgInJlZ2V4IjogIl5cXGQrci9bc21oZF0kIiwgInR5cGUiOiAidGV4dCIsICJtdWx0aXBsZSI6ICJsaW1pdC1yZXEiLCAicGF0dGVybiI6ICJeXFxkK3IvW3NtaGRdJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiMnIvcyIsICJuYW1lIjogIkxpbWl0IHJlcXVlc3QgUmF0ZSIsICJwcmV2X3ZhbHVlIjogIjJyL3MiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlJhdGUgdG8gYXBwbHkgdG8gdGhlIFVSTCAocyBmb3Igc2Vjb25kLCBtIGZvciBtaW51dGUsIGggZm9yIGhvdXIgYW5kIGQgZm9yIGRheSkuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei01IiwgIm1ldGhvZCI6ICJkZWZhdWx0In19fX19LCB7ImlkIjogIm1ldHJpY3MiLCAic3RyZWFtIjogInBhcnRpYWwiLCAibmFtZSI6ICJNZXRyaWNzIiwgImRlc2NyaXB0aW9uIjogIk1ldHJpY3MgY29sbGVjdGlvbiBhbmQgcmV0cmlldmUuIiwgInZlcnNpb24iOiAiMS4wIiwgInR5cGUiOiAiY29yZSIsICJtZXRob2QiOiAibWFudWFsIiwgInBhZ2UiOiBmYWxzZSwgInNldHRpbmdzIjogeyJVU0VfTUVUUklDUyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJ5ZXMiLCAiaGVscCI6ICJFbmFibGUgY29sbGVjdGlvbiBhbmQgcmV0cmlldmFsIG9mIGludGVybmFsIG1ldHJpY3MuIiwgImlkIjogInVzZS1tZXRyaWNzIiwgImxhYmVsIjogIlVzZSBtZXRyaWNzIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogInllcyIsICJuYW1lIjogIlVzZSBtZXRyaWNzIiwgInByZXZfdmFsdWUiOiAieWVzIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJFbmFibGUgY29sbGVjdGlvbiBhbmQgcmV0cmlldmFsIG9mIGludGVybmFsIG1ldHJpY3MuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0wIn19LCAiY2hlY2tzdW0iOiBudWxsfSwgeyJpZCI6ICJtaXNjIiwgInN0cmVhbSI6ICJwYXJ0aWFsIiwgIm5hbWUiOiAiTWlzY2VsbGFuZW91cyIsICJkZXNjcmlwdGlvbiI6ICJNaXNjZWxsYW5lb3VzIHNldHRpbmdzLiIsICJ2ZXJzaW9uIjogIjEuMCIsICJ0eXBlIjogImNvcmUiLCAibWV0aG9kIjogIm1hbnVhbCIsICJwYWdlIjogdHJ1ZSwgInNldHRpbmdzIjogeyJSRURJUkVDVF9IVFRQX1RPX0hUVFBTIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIm5vIiwgImhlbHAiOiAiUmVkaXJlY3QgYWxsIEhUVFAgcmVxdWVzdCB0byBIVFRQUy4iLCAiaWQiOiAicmVkaXJlY3QtaHR0cC10by1odHRwcyIsICJsYWJlbCI6ICJSZWRpcmVjdCBIVFRQIHRvIEhUVFBTIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIm5vIiwgIm5hbWUiOiAiUmVkaXJlY3QgSFRUUCB0byBIVFRQUyIsICJwcmV2X3ZhbHVlIjogIm5vIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJSZWRpcmVjdCBhbGwgSFRUUCByZXF1ZXN0IHRvIEhUVFBTLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMTUifSwgIkFVVE9fUkVESVJFQ1RfSFRUUF9UT19IVFRQUyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJ5ZXMiLCAiaGVscCI6ICJUcnkgdG8gZGV0ZWN0IGlmIEhUVFBTIGlzIHVzZWQgYW5kIGFjdGl2YXRlIEhUVFAgdG8gSFRUUFMgcmVkaXJlY3Rpb24gaWYgdGhhdCdzIHRoZSBjYXNlLiIsICJpZCI6ICJhdXRvLXJlZGlyZWN0LWh0dHAtdG8taHR0cHMiLCAibGFiZWwiOiAiQXV0byByZWRpcmVjdCBIVFRQIHRvIEhUVFBTIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogInllcyIsICJuYW1lIjogIkF1dG8gcmVkaXJlY3QgSFRUUCB0byBIVFRQUyIsICJwcmV2X3ZhbHVlIjogInllcyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVHJ5IHRvIGRldGVjdCBpZiBIVFRQUyBpcyB1c2VkIGFuZCBhY3RpdmF0ZSBIVFRQIHRvIEhUVFBTIHJlZGlyZWN0aW9uIGlmIHRoYXQncyB0aGUgY2FzZS4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTE0In0sICJBTExPV0VEX01FVEhPRFMiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiR0VUfFBPU1R8SEVBRCIsICJoZWxwIjogIkFsbG93ZWQgSFRUUCBhbmQgV2ViREFWIG1ldGhvZHMsIHNlcGFyYXRlZCB3aXRoIHBpcGVzIHRvIGJlIHNlbnQgYnkgY2xpZW50cy4iLCAiaWQiOiAiYWxsb3dlZC1tZXRob2RzIiwgImxhYmVsIjogIkFsbG93ZWQgbWV0aG9kcyIsICJyZWdleCI6ICJeKD8hXFx8KShcXHw/KFtBLVpdezMsfSkoPyEuKihefFxcfClcXDIpKSskIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4oPyFcXHwpKFxcfD8oW0EtWl17Myx9KSg/IS4qKF58XFx8KVxcMikpKyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIkdFVHxQT1NUfEhFQUR8T1BUSU9OU3xQVVR8REVMRVRFfFBBVENIIiwgIm5hbWUiOiAiQWxsb3dlZCBtZXRob2RzIiwgInByZXZfdmFsdWUiOiAiR0VUfFBPU1R8SEVBRCIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiQWxsb3dlZCBIVFRQIGFuZCBXZWJEQVYgbWV0aG9kcywgc2VwYXJhdGVkIHdpdGggcGlwZXMgdG8gYmUgc2VudCBieSBjbGllbnRzLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMTMifSwgIk1BWF9DTElFTlRfU0laRSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIxMG0iLCAiaGVscCI6ICJNYXhpbXVtIGJvZHkgc2l6ZSAoMCBmb3IgaW5maW5pdGUpLiIsICJpZCI6ICJtYXgtY2xpZW50LXNpemUiLCAibGFiZWwiOiAiTWF4aW11bSBib2R5IHNpemUiLCAicmVnZXgiOiAiXlxcZCtba0ttTWdHXT8kIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl5cXGQrW2tLbU1nR10/JCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiMTAwbSIsICJuYW1lIjogIk1heGltdW0gYm9keSBzaXplIiwgInByZXZfdmFsdWUiOiAiMTBtIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJNYXhpbXVtIGJvZHkgc2l6ZSAoMCBmb3IgaW5maW5pdGUpLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMTIifSwgIlNFUlZFX0ZJTEVTIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogInllcyIsICJoZWxwIjogIlNlcnZlIGZpbGVzIGZyb20gdGhlIGxvY2FsIGZvbGRlci4iLCAiaWQiOiAic2VydmUtZmlsZXMiLCAibGFiZWwiOiAiU2VydmUgZmlsZXMiLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IHRydWUsICJ2YWx1ZSI6ICJubyIsICJuYW1lIjogIlNlcnZlIGZpbGVzIiwgInByZXZfdmFsdWUiOiAieWVzIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAidHJlc3Bhc3MiLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tZXRob2RfZGlzYWJsZWQifSwgeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlNlcnZlIGZpbGVzIGZyb20gdGhlIGxvY2FsIGZvbGRlci4ifV0sICJtZXRob2QiOiAic2NoZWR1bGVyIiwgImNvbnRhaW5lckNsYXNzIjogInotMTEifSwgIlJPT1RfRk9MREVSIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIlJvb3QgZm9sZGVyIGNvbnRhaW5pbmcgZmlsZXMgdG8gc2VydmUgKC92YXIvd3d3L2h0bWwve3NlcnZlcl9uYW1lfSBpZiB1bnNldCkuIiwgImlkIjogInJvb3QtZm9sZGVyIiwgImxhYmVsIjogIlJvb3QgZm9sZGVyIiwgInJlZ2V4IjogIl4oL1tcXHcuIFxcLV0rKSovPyQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXigvW1xcdy4gXFwtXSspKi8/JCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm5hbWUiOiAiUm9vdCBmb2xkZXIiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlJvb3QgZm9sZGVyIGNvbnRhaW5pbmcgZmlsZXMgdG8gc2VydmUgKC92YXIvd3d3L2h0bWwve3NlcnZlcl9uYW1lfSBpZiB1bnNldCkuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xMCJ9LCAiU1NMX1BST1RPQ09MUyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJUTFN2MS4yIFRMU3YxLjMiLCAiaGVscCI6ICJUaGUgc3VwcG9ydGVkIHZlcnNpb24gb2YgVExTLiBXZSByZWNvbW1lbmQgdGhlIGRlZmF1bHQgdmFsdWUgVExTdjEuMiBUTFN2MS4zIGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMuIiwgImlkIjogImh0dHBzLXByb3RvY29scyIsICJsYWJlbCI6ICJIVFRQUyBwcm90b2NvbHMiLCAicmVnZXgiOiAiXig/ISApKCA/VExTdjFcXC5bMC0zXSkqJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeKD8hICkoID9UTFN2MVxcLlswLTNdKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJUTFN2MS4yIFRMU3YxLjMiLCAibmFtZSI6ICJIVFRQUyBwcm90b2NvbHMiLCAicHJldl92YWx1ZSI6ICJUTFN2MS4yIFRMU3YxLjMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlRoZSBzdXBwb3J0ZWQgdmVyc2lvbiBvZiBUTFMuIFdlIHJlY29tbWVuZCB0aGUgZGVmYXVsdCB2YWx1ZSBUTFN2MS4yIFRMU3YxLjMgZm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucy4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTkifSwgIkhUVFAyIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogInllcyIsICJoZWxwIjogIlN1cHBvcnQgSFRUUDIgcHJvdG9jb2wgd2hlbiBIVFRQUyBpcyBlbmFibGVkLiIsICJpZCI6ICJodHRwMiIsICJsYWJlbCI6ICJIVFRQMiIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJ5ZXMiLCAibmFtZSI6ICJIVFRQMiIsICJwcmV2X3ZhbHVlIjogInllcyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiU3VwcG9ydCBIVFRQMiBwcm90b2NvbCB3aGVuIEhUVFBTIGlzIGVuYWJsZWQuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei04In0sICJIVFRQMyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJubyIsICJoZWxwIjogIlN1cHBvcnQgSFRUUDMgcHJvdG9jb2wgd2hlbiBIVFRQUyBpcyBlbmFibGVkLiIsICJpZCI6ICJodHRwMyIsICJsYWJlbCI6ICJIVFRQMyIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJ5ZXMiLCAibmFtZSI6ICJIVFRQMyIsICJwcmV2X3ZhbHVlIjogIm5vIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJTdXBwb3J0IEhUVFAzIHByb3RvY29sIHdoZW4gSFRUUFMgaXMgZW5hYmxlZC4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTcifSwgIkhUVFAzX0FMVF9TVkNfUE9SVCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICI0NDMiLCAiaGVscCI6ICJIVFRQMyBhbHRlcm5hdGUgc2VydmljZSBwb3J0LiBUaGlzIHZhbHVlIHdpbGwgYmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBBbHQtU3ZjIGhlYWRlci4iLCAiaWQiOiAiaHR0cDMtYWx0LXN2Yy1wb3J0IiwgImxhYmVsIjogIkhUVFAzIEFsdC1TdmMgcG9ydCIsICJyZWdleCI6ICJeXFxkKyQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXlxcZCskIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICI0NDMiLCAibmFtZSI6ICJIVFRQMyBBbHQtU3ZjIHBvcnQiLCAicHJldl92YWx1ZSI6ICI0NDMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkhUVFAzIGFsdGVybmF0ZSBzZXJ2aWNlIHBvcnQuIFRoaXMgdmFsdWUgd2lsbCBiZSB1c2VkIGFzIHBhcnQgb2YgdGhlIEFsdC1TdmMgaGVhZGVyLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotNiJ9LCAiTElTVEVOX0hUVFAiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAieWVzIiwgImhlbHAiOiAiUmVzcG9uZCB0byAoaW5zZWN1cmUpIEhUVFAgcmVxdWVzdHMuIiwgImlkIjogImh0dHAtbGlzdGVuIiwgImxhYmVsIjogIkhUVFAgbGlzdGVuIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogInllcyIsICJuYW1lIjogIkhUVFAgbGlzdGVuIiwgInByZXZfdmFsdWUiOiAieWVzIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJSZXNwb25kIHRvIChpbnNlY3VyZSkgSFRUUCByZXF1ZXN0cy4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTUifSwgIlVTRV9PUEVOX0ZJTEVfQ0FDSEUiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAibm8iLCAiaGVscCI6ICJFbmFibGUgb3BlbiBmaWxlIGNhY2hlIGZlYXR1cmUiLCAiaWQiOiAidXNlLW9wZW4tZmlsZS1jYWNoZSIsICJsYWJlbCI6ICJVc2Ugb3BlbiBmaWxlIGNhY2hlIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIm5vIiwgIm5hbWUiOiAiVXNlIG9wZW4gZmlsZSBjYWNoZSIsICJwcmV2X3ZhbHVlIjogIm5vIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJFbmFibGUgb3BlbiBmaWxlIGNhY2hlIGZlYXR1cmUifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTQifSwgIk9QRU5fRklMRV9DQUNIRSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJtYXg9MTAwMCBpbmFjdGl2ZT0yMHMiLCAiaGVscCI6ICJPcGVuIGZpbGUgY2FjaGUgZGlyZWN0aXZlIiwgImlkIjogIm9wZW4tZmlsZS1jYWNoZSIsICJsYWJlbCI6ICJVc2Ugb3BlbiBmaWxlIGNhY2hlIiwgInJlZ2V4IjogIl4ob2ZmfG1heD1cXGQrKCBpbmFjdGl2ZT1cXGQrKG1zP3xbc2hkd015XSkpPykkIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4ob2ZmfG1heD1cXGQrKCBpbmFjdGl2ZT1cXGQrKG1zP3xbc2hkd015XSkpPykkIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJtYXg9MTAwMCBpbmFjdGl2ZT0yMHMiLCAibmFtZSI6ICJVc2Ugb3BlbiBmaWxlIGNhY2hlIiwgInByZXZfdmFsdWUiOiAibWF4PTEwMDAgaW5hY3RpdmU9MjBzIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJPcGVuIGZpbGUgY2FjaGUgZGlyZWN0aXZlIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0zIn0sICJPUEVOX0ZJTEVfQ0FDSEVfRVJST1JTIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogInllcyIsICJoZWxwIjogIkVuYWJsZSBvcGVuIGZpbGUgY2FjaGUgZm9yIGVycm9ycyIsICJpZCI6ICJvcGVuLWZpbGUtY2FjaGUtZXJyb3JzIiwgImxhYmVsIjogIk9wZW4gZmlsZSBjYWNoZSBlcnJvcnMiLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAieWVzIiwgIm5hbWUiOiAiT3BlbiBmaWxlIGNhY2hlIGVycm9ycyIsICJwcmV2X3ZhbHVlIjogInllcyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiRW5hYmxlIG9wZW4gZmlsZSBjYWNoZSBmb3IgZXJyb3JzIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yIn0sICJPUEVOX0ZJTEVfQ0FDSEVfTUlOX1VTRVMiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiMiIsICJoZWxwIjogIkVuYWJsZSBvcGVuIGZpbGUgY2FjaGUgbWluaW11bSB1c2VzIiwgImlkIjogIm9wZW4tZmlsZS1jYWNoZS1taW4tdXNlcyIsICJsYWJlbCI6ICJPcGVuIGZpbGUgY2FjaGUgbWluIHVzZXMiLCAicmVnZXgiOiAiXlsxLTldXFxkKiQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXlsxLTldXFxkKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjIiLCAibmFtZSI6ICJPcGVuIGZpbGUgY2FjaGUgbWluIHVzZXMiLCAicHJldl92YWx1ZSI6ICIyIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJFbmFibGUgb3BlbiBmaWxlIGNhY2hlIG1pbmltdW0gdXNlcyJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMSJ9LCAiT1BFTl9GSUxFX0NBQ0hFX1ZBTElEIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIjMwcyIsICJoZWxwIjogIk9wZW4gZmlsZSBjYWNoZSB2YWxpZCB0aW1lIiwgImlkIjogIm9wZW4tZmlsZS1jYWNoZS12YWxpZCIsICJsYWJlbCI6ICJPcGVuIGZpbGUgY2FjaGUgdmFsaWQgdGltZSIsICJyZWdleCI6ICJeXFxkKyhtcz98W3NoZHdNeV0pJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeXFxkKyhtcz98W3NoZHdNeV0pJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiMzBzIiwgIm5hbWUiOiAiT3BlbiBmaWxlIGNhY2hlIHZhbGlkIHRpbWUiLCAicHJldl92YWx1ZSI6ICIzMHMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIk9wZW4gZmlsZSBjYWNoZSB2YWxpZCB0aW1lIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0wIn19LCAiY2hlY2tzdW0iOiBudWxsfSwgeyJpZCI6ICJtb2RzZWN1cml0eSIsICJzdHJlYW0iOiAibm8iLCAibmFtZSI6ICJNb2RTZWN1cml0eSIsICJkZXNjcmlwdGlvbiI6ICJNYW5hZ2VtZW50IG9mIHRoZSBNb2RTZWN1cml0eSBXQUYuIiwgInZlcnNpb24iOiAiMS4wIiwgInR5cGUiOiAiY29yZSIsICJtZXRob2QiOiAibWFudWFsIiwgInBhZ2UiOiBmYWxzZSwgInNldHRpbmdzIjogeyJVU0VfTU9EU0VDVVJJVFkiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAieWVzIiwgImhlbHAiOiAiRW5hYmxlIE1vZFNlY3VyaXR5IFdBRi4iLCAiaWQiOiAidXNlLW1vZHNlY3VyaXR5IiwgImxhYmVsIjogIlVzZSBNb2RTZWN1cml0eSIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJ5ZXMiLCAibmFtZSI6ICJVc2UgTW9kU2VjdXJpdHkiLCAicHJldl92YWx1ZSI6ICJ5ZXMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkVuYWJsZSBNb2RTZWN1cml0eSBXQUYuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei01In0sICJVU0VfTU9EU0VDVVJJVFlfQ1JTIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogInllcyIsICJoZWxwIjogIkVuYWJsZSBPV0FTUCBDb3JlIFJ1bGUgU2V0LiIsICJpZCI6ICJ1c2UtbW9kc2VjdXJpdHktY3JzIiwgImxhYmVsIjogIlVzZSBDb3JlIFJ1bGUgU2V0IiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogInllcyIsICJuYW1lIjogIlVzZSBDb3JlIFJ1bGUgU2V0IiwgInByZXZfdmFsdWUiOiAieWVzIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJFbmFibGUgT1dBU1AgQ29yZSBSdWxlIFNldC4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTQifSwgIk1PRFNFQ1VSSVRZX0NSU19WRVJTSU9OIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIjMiLCAiaGVscCI6ICJWZXJzaW9uIG9mIHRoZSBPV0FTUCBDb3JlIFJ1bGUgU2V0IHRvIHVzZSB3aXRoIE1vZFNlY3VyaXR5ICgzLCA0IG9yIG5pZ2h0bHkpLiIsICJpZCI6ICJtb2RzZWN1cml0eS1jcnMtdmVyc2lvbiIsICJsYWJlbCI6ICJDb3JlIFJ1bGUgU2V0IFZlcnNpb24iLCAicmVnZXgiOiAiXigzfDR8bmlnaHRseSkkIiwgInR5cGUiOiAic2VsZWN0IiwgInBhdHRlcm4iOiAiXigzfDR8bmlnaHRseSkkIiwgImlucFR5cGUiOiAic2VsZWN0IiwgInZhbHVlcyI6IFsiMyIsICI0IiwgIm5pZ2h0bHkiXSwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiNCIsICJuYW1lIjogIkNvcmUgUnVsZSBTZXQgVmVyc2lvbiIsICJwcmV2X3ZhbHVlIjogIjMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlZlcnNpb24gb2YgdGhlIE9XQVNQIENvcmUgUnVsZSBTZXQgdG8gdXNlIHdpdGggTW9kU2VjdXJpdHkgKDMsIDQgb3IgbmlnaHRseSkuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0zIn0sICJNT0RTRUNVUklUWV9TRUNfQVVESVRfRU5HSU5FIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIlJlbGV2YW50T25seSIsICJoZWxwIjogIlNlY0F1ZGl0RW5naW5lIGRpcmVjdGl2ZSBvZiBNb2RTZWN1cml0eS4iLCAiaWQiOiAibW9kc2VjdXJpdHktc2VjLWF1ZGl0LWVuZ2luZSIsICJsYWJlbCI6ICJTZWNBdWRpdEVuZ2luZSIsICJyZWdleCI6ICJeKE9ufFJlbGV2YW50T25seXxPZmYpJCIsICJ0eXBlIjogInNlbGVjdCIsICJwYXR0ZXJuIjogIl4oT258UmVsZXZhbnRPbmx5fE9mZikkIiwgImlucFR5cGUiOiAic2VsZWN0IiwgInZhbHVlcyI6IFsiT2ZmIiwgIk9uIiwgIlJlbGV2YW50T25seSJdLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJSZWxldmFudE9ubHkiLCAibmFtZSI6ICJTZWNBdWRpdEVuZ2luZSIsICJwcmV2X3ZhbHVlIjogIlJlbGV2YW50T25seSIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiU2VjQXVkaXRFbmdpbmUgZGlyZWN0aXZlIG9mIE1vZFNlY3VyaXR5LiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMiJ9LCAiTU9EU0VDVVJJVFlfU0VDX1JVTEVfRU5HSU5FIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIk9uIiwgImhlbHAiOiAiU2VjUnVsZUVuZ2luZSBkaXJlY3RpdmUgb2YgTW9kU2VjdXJpdHkuIiwgImlkIjogIm1vZHNlY3VyaXR5LXNlYy1ydWxlLWVuZ2luZSIsICJsYWJlbCI6ICJTZWNSdWxlRW5naW5lIiwgInJlZ2V4IjogIl4oT258RGV0ZWN0aW9uT25seXxPZmYpJCIsICJ0eXBlIjogInNlbGVjdCIsICJwYXR0ZXJuIjogIl4oT258RGV0ZWN0aW9uT25seXxPZmYpJCIsICJpbnBUeXBlIjogInNlbGVjdCIsICJ2YWx1ZXMiOiBbIkRldGVjdGlvbk9ubHkiLCAiT2ZmIiwgIk9uIl0sICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIk9uIiwgIm5hbWUiOiAiU2VjUnVsZUVuZ2luZSIsICJwcmV2X3ZhbHVlIjogIk9uIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJTZWNSdWxlRW5naW5lIGRpcmVjdGl2ZSBvZiBNb2RTZWN1cml0eS4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTEifSwgIk1PRFNFQ1VSSVRZX1NFQ19BVURJVF9MT0dfUEFSVFMiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiQUJDRkhaIiwgImhlbHAiOiAiU2VjQXVkaXRMb2dQYXJ0cyBkaXJlY3RpdmUgb2YgTW9kU2VjdXJpdHkuIiwgImlkIjogIm1vZHNlY3VyaXR5LXNlYy1hdWRpdC1sb2ctcGFydHMiLCAibGFiZWwiOiAiU2VjQXVkaXRMb2dQYXJ0cyIsICJyZWdleCI6ICJeQSgoW0ItS10pKD8hLipcXDIpKStaJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeQSgoW0ItS10pKD8hLipcXDIpKStaJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiQUJDRkhaIiwgIm5hbWUiOiAiU2VjQXVkaXRMb2dQYXJ0cyIsICJwcmV2X3ZhbHVlIjogIkFCQ0ZIWiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiU2VjQXVkaXRMb2dQYXJ0cyBkaXJlY3RpdmUgb2YgTW9kU2VjdXJpdHkuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0wIn19LCAiY2hlY2tzdW0iOiBudWxsfSwgeyJpZCI6ICJwaHAiLCAic3RyZWFtIjogIm5vIiwgIm5hbWUiOiAiUEhQIiwgImRlc2NyaXB0aW9uIjogIk1hbmFnZSBsb2NhbCBvciByZW1vdGUgUEhQLUZQTS4iLCAidmVyc2lvbiI6ICIxLjAiLCAidHlwZSI6ICJjb3JlIiwgIm1ldGhvZCI6ICJtYW51YWwiLCAicGFnZSI6IGZhbHNlLCAic2V0dGluZ3MiOiB7IlJFTU9URV9QSFAiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiSG9zdG5hbWUgb2YgdGhlIHJlbW90ZSBQSFAtRlBNIGluc3RhbmNlLiIsICJpZCI6ICJyZW1vdGUtcGhwIiwgImxhYmVsIjogIlJlbW90ZSBQSFAiLCAicmVnZXgiOiAiXigoPz0uezEsMjU1fSQpWzAtOUEtWmEtel0oPzooPzpbMC05QS1aYS16XXwtKXswLDYxfVswLTlBLVphLXpdKT8oPzpcXC5bMC05QS1aYS16XSg/Oig/OlswLTlBLVphLXpdfC0pezAsNjF9WzAtOUEtWmEtel0pPykqXFwuPyk/JCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeKCg/PS57MSwyNTV9JClbMC05QS1aYS16XSg/Oig/OlswLTlBLVphLXpdfC0pezAsNjF9WzAtOUEtWmEtel0pPyg/OlxcLlswLTlBLVphLXpdKD86KD86WzAtOUEtWmEtel18LSl7MCw2MX1bMC05QS1aYS16XSk/KSpcXC4/KT8kIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibmFtZSI6ICJSZW1vdGUgUEhQIiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJIb3N0bmFtZSBvZiB0aGUgcmVtb3RlIFBIUC1GUE0gaW5zdGFuY2UuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0zIn0sICJSRU1PVEVfUEhQX1BBVEgiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiUm9vdCBmb2xkZXIgY29udGFpbmluZyBmaWxlcyBpbiB0aGUgcmVtb3RlIFBIUC1GUE0gaW5zdGFuY2UuIiwgImlkIjogInJlbW90ZS1waHAtcGF0aCIsICJsYWJlbCI6ICJSZW1vdGUgUEhQIHBhdGgiLCAicmVnZXgiOiAiXigvW1xcdy4gXFwtXSspKi8/JCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeKC9bXFx3LiBcXC1dKykqLz8kIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibmFtZSI6ICJSZW1vdGUgUEhQIHBhdGgiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlJvb3QgZm9sZGVyIGNvbnRhaW5pbmcgZmlsZXMgaW4gdGhlIHJlbW90ZSBQSFAtRlBNIGluc3RhbmNlLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMiJ9LCAiTE9DQUxfUEhQIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIlBhdGggdG8gdGhlIFBIUC1GUE0gc29ja2V0IGZpbGUuIiwgImlkIjogImxvY2FsIiwgImxhYmVsIjogIkxvY2FsIFBIUCIsICJyZWdleCI6ICJeKC9bXFx3LiBcXC1dKykqLz8kIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4oL1tcXHcuIFxcLV0rKSovPyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJuYW1lIjogIkxvY2FsIFBIUCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiUGF0aCB0byB0aGUgUEhQLUZQTSBzb2NrZXQgZmlsZS4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTEifSwgIkxPQ0FMX1BIUF9QQVRIIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIlJvb3QgZm9sZGVyIGNvbnRhaW5pbmcgZmlsZXMgaW4gdGhlIGxvY2FsIFBIUC1GUE0gaW5zdGFuY2UuIiwgImlkIjogImxvY2FsLXBocC1wYXRoIiwgImxhYmVsIjogIkxvY2FsIFBIUCBwYXRoIiwgInJlZ2V4IjogIl4oL1tcXHcuIFxcLV0rKSovPyQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXigvW1xcdy4gXFwtXSspKi8/JCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm5hbWUiOiAiTG9jYWwgUEhQIHBhdGgiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlJvb3QgZm9sZGVyIGNvbnRhaW5pbmcgZmlsZXMgaW4gdGhlIGxvY2FsIFBIUC1GUE0gaW5zdGFuY2UuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0wIn19LCAiY2hlY2tzdW0iOiBudWxsfSwgeyJpZCI6ICJyZWFsaXAiLCAic3RyZWFtIjogInBhcnRpYWwiLCAibmFtZSI6ICJSZWFsIElQIiwgImRlc2NyaXB0aW9uIjogIkdldCByZWFsIElQIG9mIGNsaWVudHMgd2hlbiBCdW5rZXJXZWIgaXMgYmVoaW5kIGEgcmV2ZXJzZSBwcm94eSAvIGxvYWQgYmFsYW5jZXIuIiwgInZlcnNpb24iOiAiMS4wIiwgInR5cGUiOiAiY29yZSIsICJtZXRob2QiOiAibWFudWFsIiwgInBhZ2UiOiBmYWxzZSwgInNldHRpbmdzIjogeyJVU0VfUkVBTF9JUCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJubyIsICJoZWxwIjogIlJldHJpZXZlIHRoZSByZWFsIElQIG9mIGNsaWVudC4iLCAiaWQiOiAidXNlLXJlYWwtaXAiLCAibGFiZWwiOiAiVXNlIHJlYWwgaXAiLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAibm8iLCAibmFtZSI6ICJVc2UgcmVhbCBpcCIsICJwcmV2X3ZhbHVlIjogIm5vIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJSZXRyaWV2ZSB0aGUgcmVhbCBJUCBvZiBjbGllbnQuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei00In0sICJVU0VfUFJPWFlfUFJPVE9DT0wiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAibm8iLCAiaGVscCI6ICJFbmFibGUgUFJPWFkgcHJvdG9jb2wgY29tbXVuaWNhdGlvbi4iLCAiaWQiOiAidXNlLXByb3h5LXByb3RvY29sIiwgImxhYmVsIjogIlVzZSBQUk9YWSBwcm90b2NvbCIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJubyIsICJuYW1lIjogIlVzZSBQUk9YWSBwcm90b2NvbCIsICJwcmV2X3ZhbHVlIjogIm5vIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJFbmFibGUgUFJPWFkgcHJvdG9jb2wgY29tbXVuaWNhdGlvbi4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTMifSwgIlJFQUxfSVBfRlJPTSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIxOTIuMTY4LjAuMC8xNiAxNzIuMTYuMC4wLzEyIDEwLjAuMC4wLzgiLCAiaGVscCI6ICJMaXN0IG9mIHRydXN0ZWQgSVBzIC8gbmV0d29ya3MsIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgd2hlcmUgcHJveGllZCByZXF1ZXN0cyBjb21lIGZyb20uIiwgImlkIjogInJlYWwtaXAtZnJvbSIsICJsYWJlbCI6ICJSZWFsIElQIGZyb20iLCAicmVnZXgiOiAiXig/ISApKCAqKCgoXFxiMjVbMC01XXxcXGIyWzAtNF1cXGR8XFxiWzAxXT9cXGRcXGQ/KShcXC4oMjVbMC01XXwyWzAtNF1cXGR8WzAxXT9cXGRcXGQ/KSl7M30pKFxcLyhbMS0yXVswLTldP3wzWzAtMl0/fFswNC05XSkpP3woKFswLTlhLWZBLUZdezEsNH06KXs3fVswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDd9OnwoWzAtOWEtZkEtRl17MSw0fTopezEsNn06WzAtOWEtZkEtRl17MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsNX0oOlswLTlhLWZBLUZdezEsNH0pezEsMn18KFswLTlhLWZBLUZdezEsNH06KXsxLDR9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDN9fChbMC05YS1mQS1GXXsxLDR9Oil7MSwzfSg6WzAtOWEtZkEtRl17MSw0fSl7MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsMn0oOlswLTlhLWZBLUZdezEsNH0pezEsNX18WzAtOWEtZkEtRl17MSw0fTooKDpbMC05YS1mQS1GXXsxLDR9KXsxLDZ9KXw6KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw3fXw6KXxmZTgwOig6WzAtOWEtZkEtRl1aezAsNH0pezAsNH0lWzAtOWEtekEtWl0rfDo6KGZmZmYoOjB7MSw0fSk/Oik/KCgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZClcXC4pezN9KDI1WzAtNV18KDJbMC00XXwxP1xcZCk/XFxkKXwoWzAtOWEtZkEtRl17MSw0fTopezEsNH06KCgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZClcXC4pezN9KDI1WzAtNV18KDJbMC00XXwxP1xcZCk/XFxkKSkoXFwvKDEyWzAtOF18MVswMV1bMC05XXxbMC05XVswLTldPykpPykoPyEuKlxcRFxcMihbXlxcZFxcL118JCkpICopKiQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXig/ISApKCAqKCgoXFxiMjVbMC01XXxcXGIyWzAtNF1cXGR8XFxiWzAxXT9cXGRcXGQ/KShcXC4oMjVbMC01XXwyWzAtNF1cXGR8WzAxXT9cXGRcXGQ/KSl7M30pKFxcLyhbMS0yXVswLTldP3wzWzAtMl0/fFswNC05XSkpP3woKFswLTlhLWZBLUZdezEsNH06KXs3fVswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDd9OnwoWzAtOWEtZkEtRl17MSw0fTopezEsNn06WzAtOWEtZkEtRl17MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsNX0oOlswLTlhLWZBLUZdezEsNH0pezEsMn18KFswLTlhLWZBLUZdezEsNH06KXsxLDR9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDN9fChbMC05YS1mQS1GXXsxLDR9Oil7MSwzfSg6WzAtOWEtZkEtRl17MSw0fSl7MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsMn0oOlswLTlhLWZBLUZdezEsNH0pezEsNX18WzAtOWEtZkEtRl17MSw0fTooKDpbMC05YS1mQS1GXXsxLDR9KXsxLDZ9KXw6KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw3fXw6KXxmZTgwOig6WzAtOWEtZkEtRl1aezAsNH0pezAsNH0lWzAtOWEtekEtWl0rfDo6KGZmZmYoOjB7MSw0fSk/Oik/KCgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZClcXC4pezN9KDI1WzAtNV18KDJbMC00XXwxP1xcZCk/XFxkKXwoWzAtOWEtZkEtRl17MSw0fTopezEsNH06KCgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZClcXC4pezN9KDI1WzAtNV18KDJbMC00XXwxP1xcZCk/XFxkKSkoXFwvKDEyWzAtOF18MVswMV1bMC05XXxbMC05XVswLTldPykpPykoPyEuKlxcRFxcMihbXlxcZFxcL118JCkpICopKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjE5Mi4xNjguMC4wLzE2IDE3Mi4xNi4wLjAvMTIgMTAuMC4wLjAvOCIsICJuYW1lIjogIlJlYWwgSVAgZnJvbSIsICJwcmV2X3ZhbHVlIjogIjE5Mi4xNjguMC4wLzE2IDE3Mi4xNi4wLjAvMTIgMTAuMC4wLjAvOCIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiB0cnVzdGVkIElQcyAvIG5ldHdvcmtzLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIHdoZXJlIHByb3hpZWQgcmVxdWVzdHMgY29tZSBmcm9tLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMiJ9LCAiUkVBTF9JUF9IRUFERVIiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiWC1Gb3J3YXJkZWQtRm9yIiwgImhlbHAiOiAiSFRUUCBoZWFkZXIgY29udGFpbmluZyB0aGUgcmVhbCBJUCBvciBzcGVjaWFsIHZhbHVlIHByb3h5X3Byb3RvY29sIGZvciBQUk9YWSBwcm90b2NvbC4iLCAiaWQiOiAicmVhbC1pcC1oZWFkZXIiLCAibGFiZWwiOiAiUmVhbCBJUCBoZWFkZXIiLCAicmVnZXgiOiAiXig/ISApKCggPyg/IXByb3h5X3Byb3RvY29sKVtcXHdcXC1dKykqfHByb3h5X3Byb3RvY29sKSQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXig/ISApKCggPyg/IXByb3h5X3Byb3RvY29sKVtcXHdcXC1dKykqfHByb3h5X3Byb3RvY29sKSQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIlgtRm9yd2FyZGVkLUZvciIsICJuYW1lIjogIlJlYWwgSVAgaGVhZGVyIiwgInByZXZfdmFsdWUiOiAiWC1Gb3J3YXJkZWQtRm9yIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJIVFRQIGhlYWRlciBjb250YWluaW5nIHRoZSByZWFsIElQIG9yIHNwZWNpYWwgdmFsdWUgcHJveHlfcHJvdG9jb2wgZm9yIFBST1hZIHByb3RvY29sLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMSJ9LCAiUkVBTF9JUF9SRUNVUlNJVkUiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAieWVzIiwgImhlbHAiOiAiUGVyZm9ybSBhIHJlY3Vyc2l2ZSBzZWFyY2ggaW4gdGhlIGhlYWRlciBjb250YWluZXIgSVAgYWRkcmVzcy4iLCAiaWQiOiAicmVhbC1pcC1yZWN1cnNpdmUiLCAibGFiZWwiOiAiUmVhbCBJUCByZWN1cnNpdmUiLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAieWVzIiwgIm5hbWUiOiAiUmVhbCBJUCByZWN1cnNpdmUiLCAicHJldl92YWx1ZSI6ICJ5ZXMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlBlcmZvcm0gYSByZWN1cnNpdmUgc2VhcmNoIGluIHRoZSBoZWFkZXIgY29udGFpbmVyIElQIGFkZHJlc3MuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0wIn19LCAiY2hlY2tzdW0iOiBudWxsfSwgeyJpZCI6ICJyZWRpcmVjdCIsICJzdHJlYW0iOiAibm8iLCAibmFtZSI6ICJSZWRpcmVjdCIsICJkZXNjcmlwdGlvbiI6ICJNYW5hZ2UgSFRUUCByZWRpcmVjdHMuIiwgInZlcnNpb24iOiAiMS4wIiwgInR5cGUiOiAiY29yZSIsICJtZXRob2QiOiAibWFudWFsIiwgInBhZ2UiOiBmYWxzZSwgInNldHRpbmdzIjogeyJSRURJUkVDVF9UTyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJSZWRpcmVjdCBhIHdob2xlIHNpdGUgdG8gYW5vdGhlciBvbmUuIiwgImlkIjogInJlZGlyZWN0LXRvIiwgImxhYmVsIjogIlJlZGlyZWN0IHRvIiwgInJlZ2V4IjogIl4oaHR0cHM/OlxcL1xcL1tcXC1cXHdAOiUuK34jPV0rW1xcLVxcd1xcKFxcKSFAOiUrLn4jPyZcXC89JF0qKT8kIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4oaHR0cHM/OlxcL1xcL1tcXC1cXHdAOiUuK34jPV0rW1xcLVxcd1xcKFxcKSFAOiUrLn4jPyZcXC89JF0qKT8kIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibmFtZSI6ICJSZWRpcmVjdCB0byIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiUmVkaXJlY3QgYSB3aG9sZSBzaXRlIHRvIGFub3RoZXIgb25lLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMiJ9LCAiUkVESVJFQ1RfVE9fUkVRVUVTVF9VUkkiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAibm8iLCAiaGVscCI6ICJBcHBlbmQgdGhlIHJlcXVlc3RlZCBVUkkgdG8gdGhlIHJlZGlyZWN0IGFkZHJlc3MuIiwgImlkIjogInJlZGlyZWN0LXRvLXJlcXVlc3QtdXJpIiwgImxhYmVsIjogIkFwcGVuZCByZXF1ZXN0IFVSSSIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJubyIsICJuYW1lIjogIkFwcGVuZCByZXF1ZXN0IFVSSSIsICJwcmV2X3ZhbHVlIjogIm5vIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJBcHBlbmQgdGhlIHJlcXVlc3RlZCBVUkkgdG8gdGhlIHJlZGlyZWN0IGFkZHJlc3MuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xIn0sICJSRURJUkVDVF9UT19TVEFUVVNfQ09ERSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIzMDEiLCAiaGVscCI6ICJTdGF0dXMgY29kZSB0byBzZW5kIHRvIGNsaWVudCB3aGVuIHJlZGlyZWN0aW5nLiIsICJpZCI6ICJyZWRpcmVjdC10by1zdGF0dXMtY29kZSIsICJsYWJlbCI6ICJBcHBlbmQgcmVxdWVzdCBVUkkiLCAicmVnZXgiOiAiXigzMDF8MzAyKSQiLCAidHlwZSI6ICJzZWxlY3QiLCAicGF0dGVybiI6ICJeKDMwMXwzMDIpJCIsICJpbnBUeXBlIjogInNlbGVjdCIsICJ2YWx1ZXMiOiBbIjMwMSIsICIzMDIiXSwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiMzAxIiwgIm5hbWUiOiAiQXBwZW5kIHJlcXVlc3QgVVJJIiwgInByZXZfdmFsdWUiOiAiMzAxIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJTdGF0dXMgY29kZSB0byBzZW5kIHRvIGNsaWVudCB3aGVuIHJlZGlyZWN0aW5nLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMCJ9fSwgImNoZWNrc3VtIjogbnVsbH0sIHsiaWQiOiAicmV2ZXJzZXByb3h5IiwgInN0cmVhbSI6ICJwYXJ0aWFsIiwgIm5hbWUiOiAiUmV2ZXJzZSBwcm94eSIsICJkZXNjcmlwdGlvbiI6ICJNYW5hZ2UgcmV2ZXJzZSBwcm94eSBjb25maWd1cmF0aW9ucy4iLCAidmVyc2lvbiI6ICIxLjAiLCAidHlwZSI6ICJjb3JlIiwgIm1ldGhvZCI6ICJtYW51YWwiLCAicGFnZSI6IGZhbHNlLCAic2V0dGluZ3MiOiB7IlVTRV9SRVZFUlNFX1BST1hZIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIm5vIiwgImhlbHAiOiAiQWN0aXZhdGUgcmV2ZXJzZSBwcm94eSBtb2RlLiIsICJpZCI6ICJ1c2UtcmV2ZXJzZS1wcm94eSIsICJsYWJlbCI6ICJVc2UgcmV2ZXJzZSBwcm94eSIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogdHJ1ZSwgInZhbHVlIjogInllcyIsICJuYW1lIjogIlVzZSByZXZlcnNlIHByb3h5IiwgInByZXZfdmFsdWUiOiAibm8iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJ0cmVzcGFzcyIsICJ0ZXh0IjogImlucF9wb3BvdmVyX21ldGhvZF9kaXNhYmxlZCJ9LCB7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiQWN0aXZhdGUgcmV2ZXJzZSBwcm94eSBtb2RlLiJ9XSwgIm1ldGhvZCI6ICJzY2hlZHVsZXIiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yMyJ9LCAiUkVWRVJTRV9QUk9YWV9JTlRFUkNFUFRfRVJST1JTIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogInllcyIsICJoZWxwIjogIkludGVyY2VwdCBhbmQgcmV3cml0ZSBlcnJvcnMuIiwgImlkIjogInJldmVyc2UtcHJveHktaW50ZXJjZXB0LWVycm9ycyIsICJsYWJlbCI6ICJJbnRlcmNlcHQgZXJyb3JzIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogInllcyIsICJuYW1lIjogIkludGVyY2VwdCBlcnJvcnMiLCAicHJldl92YWx1ZSI6ICJ5ZXMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkludGVyY2VwdCBhbmQgcmV3cml0ZSBlcnJvcnMuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yMiJ9LCAiUkVWRVJTRV9QUk9YWV9DVVNUT01fSE9TVCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJPdmVycmlkZSBIb3N0IGhlYWRlciBzZW50IHRvIHVwc3RyZWFtIHNlcnZlci4iLCAiaWQiOiAicmV2ZXJzZS1wcm94eS1jdXN0b20taG9zdCIsICJsYWJlbCI6ICJSZXZlcnNlIHByb3h5IGN1c3RvbSBob3N0IiwgInJlZ2V4IjogIl4uKiQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXi4qJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm5hbWUiOiAiUmV2ZXJzZSBwcm94eSBjdXN0b20gaG9zdCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiT3ZlcnJpZGUgSG9zdCBoZWFkZXIgc2VudCB0byB1cHN0cmVhbSBzZXJ2ZXIuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yMSJ9LCAiVVNFX1BST1hZX0NBQ0hFIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIm5vIiwgImhlbHAiOiAiRW5hYmxlIG9yIGRpc2FibGUgY2FjaGluZyBvZiB0aGUgcHJveGllZCByZXNvdXJjZXMuIiwgImlkIjogInVzZS1wcm94eS1jYWNoZSIsICJsYWJlbCI6ICJSZXZlcnNlIHByb3h5IGNhY2hlIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIm5vIiwgIm5hbWUiOiAiUmV2ZXJzZSBwcm94eSBjYWNoZSIsICJwcmV2X3ZhbHVlIjogIm5vIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJFbmFibGUgb3IgZGlzYWJsZSBjYWNoaW5nIG9mIHRoZSBwcm94aWVkIHJlc291cmNlcy4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTYifSwgIlBST1hZX0NBQ0hFX01FVEhPRFMiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiR0VUIEhFQUQiLCAiaGVscCI6ICJIVFRQIG1ldGhvZHMgdGhhdCBzaG91bGQgdHJpZ2dlciBhIGNhY2hlIG9wZXJhdGlvbi4iLCAiaWQiOiAicHJveHktY2FjaGUtbWV0aG9kcyIsICJsYWJlbCI6ICJSZXZlcnNlIHByb3h5IGNhY2hlIG1ldGhvZHMiLCAicmVnZXgiOiAiXig/ISApKCA/KEdFVHxIRUFEfFBPU1R8UFVUfERFTEVURXxDT05ORUNUfE9QVElPTlN8VFJBQ0V8UEFUQ0gpKD8hLipcXDIpKSskIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4oPyEgKSggPyhHRVR8SEVBRHxQT1NUfFBVVHxERUxFVEV8Q09OTkVDVHxPUFRJT05TfFRSQUNFfFBBVENIKSg/IS4qXFwyKSkrJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiR0VUIEhFQUQiLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IGNhY2hlIG1ldGhvZHMiLCAicHJldl92YWx1ZSI6ICJHRVQgSEVBRCIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiSFRUUCBtZXRob2RzIHRoYXQgc2hvdWxkIHRyaWdnZXIgYSBjYWNoZSBvcGVyYXRpb24uIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei01In0sICJQUk9YWV9DQUNIRV9NSU5fVVNFUyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIyIiwgImhlbHAiOiAiVGhlIG1pbmltdW0gbnVtYmVyIG9mIHJlcXVlc3RzIGJlZm9yZSBhIHJlc3BvbnNlIGlzIGNhY2hlZC4iLCAiaWQiOiAicHJveHktY2FjaGUtbWluLXVzZXMiLCAibGFiZWwiOiAiUmV2ZXJzZSBwcm94eSBjYWNoZSBtaW5pbXVtIHVzZXMiLCAicmVnZXgiOiAiXlsxLTldXFxkKiQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXlsxLTldXFxkKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjIiLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IGNhY2hlIG1pbmltdW0gdXNlcyIsICJwcmV2X3ZhbHVlIjogIjIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlRoZSBtaW5pbXVtIG51bWJlciBvZiByZXF1ZXN0cyBiZWZvcmUgYSByZXNwb25zZSBpcyBjYWNoZWQuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei00In0sICJQUk9YWV9DQUNIRV9LRVkiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiJHNjaGVtZSRob3N0JHJlcXVlc3RfdXJpIiwgImhlbHAiOiAiVGhlIGtleSB1c2VkIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGEgY2FjaGVkIHJlc3BvbnNlLiIsICJpZCI6ICJwcm94eS1jYWNoZS1rZXkiLCAibGFiZWwiOiAiUmV2ZXJzZSBwcm94eSBjYWNoZSBrZXkiLCAicmVnZXgiOiAiXig/ISApKCA/KFxcJFthLXpfXSspKD8hLipcXDIpKSskIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4oPyEgKSggPyhcXCRbYS16X10rKSg/IS4qXFwyKSkrJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiJHNjaGVtZSRob3N0JHJlcXVlc3RfdXJpIiwgIm5hbWUiOiAiUmV2ZXJzZSBwcm94eSBjYWNoZSBrZXkiLCAicHJldl92YWx1ZSI6ICIkc2NoZW1lJGhvc3QkcmVxdWVzdF91cmkiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlRoZSBrZXkgdXNlZCB0byB1bmlxdWVseSBpZGVudGlmeSBhIGNhY2hlZCByZXNwb25zZS4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTMifSwgIlBST1hZX0NBQ0hFX1ZBTElEIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIjIwMD0yNGggMzAxPTFoIDMwMj0yNGgiLCAiaGVscCI6ICJEZWZpbmUgdGhlIGNhY2hpbmcgdGltZSBkZXBlbmRpbmcgb24gdGhlIEhUVFAgc3RhdHVzIGNvZGUgKGxpc3Qgb2Ygc3RhdHVzPXRpbWUpLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMuIiwgImlkIjogInByb3h5LWNhY2hlLXZhbGlkIiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkgY2FjaGUgdmFsaWQiLCAicmVnZXgiOiAiXig/ISApKCA/KFsxLTVdXFxkezJ9KSg/IS4qXFwyPSk9XFxkKyhtcz98W3NoZHdNeV0pKSokIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4oPyEgKSggPyhbMS01XVxcZHsyfSkoPyEuKlxcMj0pPVxcZCsobXM/fFtzaGR3TXldKSkqJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiMjAwPTI0aCAzMDE9MWggMzAyPTI0aCIsICJuYW1lIjogIlJldmVyc2UgcHJveHkgY2FjaGUgdmFsaWQiLCAicHJldl92YWx1ZSI6ICIyMDA9MjRoIDMwMT0xaCAzMDI9MjRoIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJEZWZpbmUgdGhlIGNhY2hpbmcgdGltZSBkZXBlbmRpbmcgb24gdGhlIEhUVFAgc3RhdHVzIGNvZGUgKGxpc3Qgb2Ygc3RhdHVzPXRpbWUpLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yIn0sICJQUk9YWV9OT19DQUNIRSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIkaHR0cF9wcmFnbWEgJGh0dHBfYXV0aG9yaXphdGlvbiIsICJoZWxwIjogIkNvbmRpdGlvbnMgdG8gZGlzYWJsZSBjYWNoaW5nIG9mIHJlc3BvbnNlcy4iLCAiaWQiOiAicHJveHktbm8tY2FjaGUiLCAibGFiZWwiOiAiUmV2ZXJzZSBwcm94eSBubyBjYWNoZSIsICJyZWdleCI6ICJeLiokIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4uKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiRodHRwX3ByYWdtYSAkaHR0cF9hdXRob3JpemF0aW9uIiwgIm5hbWUiOiAiUmV2ZXJzZSBwcm94eSBubyBjYWNoZSIsICJwcmV2X3ZhbHVlIjogIiRodHRwX3ByYWdtYSAkaHR0cF9hdXRob3JpemF0aW9uIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJDb25kaXRpb25zIHRvIGRpc2FibGUgY2FjaGluZyBvZiByZXNwb25zZXMuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xIn0sICJQUk9YWV9DQUNIRV9CWVBBU1MiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiMCIsICJoZWxwIjogIkNvbmRpdGlvbnMgdG8gYnlwYXNzIGNhY2hpbmcgb2YgcmVzcG9uc2VzLiIsICJpZCI6ICJwcm94eS1jYWNoZS1ieXBhc3MiLCAibGFiZWwiOiAiUmV2ZXJzZSBwcm94eSBieXBhc3MiLCAicmVnZXgiOiAiXi4qJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeLiokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIwIiwgIm5hbWUiOiAiUmV2ZXJzZSBwcm94eSBieXBhc3MiLCAicHJldl92YWx1ZSI6ICIwIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJDb25kaXRpb25zIHRvIGJ5cGFzcyBjYWNoaW5nIG9mIHJlc3BvbnNlcy4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTAifX0sICJjaGVja3N1bSI6IG51bGwsICJtdWx0aXBsZXNfc2NoZW1hIjogeyJyZXZlcnNlLXByb3h5IjogeyJSRVZFUlNFX1BST1hZX0hPU1QiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiRnVsbCBVUkwgb2YgdGhlIHByb3hpZWQgcmVzb3VyY2UgKHByb3h5X3Bhc3MpLiIsICJpZCI6ICJyZXZlcnNlLXByb3h5LWhvc3QiLCAibGFiZWwiOiAiUmV2ZXJzZSBwcm94eSBob3N0IiwgInJlZ2V4IjogIl4uKiQiLCAidHlwZSI6ICJ0ZXh0IiwgIm11bHRpcGxlIjogInJldmVyc2UtcHJveHkiLCAicGF0dGVybiI6ICJeLiokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IGhvc3QiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkZ1bGwgVVJMIG9mIHRoZSBwcm94aWVkIHJlc291cmNlIChwcm94eV9wYXNzKS4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTIzIn0sICJSRVZFUlNFX1BST1hZX1VSTCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIvIiwgImhlbHAiOiAiTG9jYXRpb24gVVJMIHRoYXQgd2lsbCBiZSBwcm94aWVkLiIsICJpZCI6ICJyZXZlcnNlLXByb3h5LXVybCIsICJsYWJlbCI6ICJSZXZlcnNlIHByb3h5IHVybCIsICJyZWdleCI6ICJeLiokIiwgInR5cGUiOiAidGV4dCIsICJtdWx0aXBsZSI6ICJyZXZlcnNlLXByb3h5IiwgInBhdHRlcm4iOiAiXi4qJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiLyIsICJuYW1lIjogIlJldmVyc2UgcHJveHkgdXJsIiwgInByZXZfdmFsdWUiOiAiLyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTG9jYXRpb24gVVJMIHRoYXQgd2lsbCBiZSBwcm94aWVkLiJ9XSwgImNvbnRhaW5lckNsYXNzIjogInotMjIifSwgIlJFVkVSU0VfUFJPWFlfV1MiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAibm8iLCAiaGVscCI6ICJFbmFibGUgd2Vic29ja2V0IG9uIHRoZSBwcm94aWVkIHJlc291cmNlLiIsICJpZCI6ICJyZXZlcnNlLXByb3h5LXdzIiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkgV1MiLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgIm11bHRpcGxlIjogInJldmVyc2UtcHJveHkiLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJubyIsICJuYW1lIjogIlJldmVyc2UgcHJveHkgV1MiLCAicHJldl92YWx1ZSI6ICJubyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiRW5hYmxlIHdlYnNvY2tldCBvbiB0aGUgcHJveGllZCByZXNvdXJjZS4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTIxIn0sICJSRVZFUlNFX1BST1hZX0hFQURFUlMiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiTGlzdCBvZiBIVFRQIGhlYWRlcnMgdG8gc2VuZCB0byBwcm94aWVkIHJlc291cmNlIHNlcGFyYXRlZCB3aXRoIHNlbWljb2xvbnMgKHZhbHVlcyBmb3IgcHJveHlfc2V0X2hlYWRlciBkaXJlY3RpdmUpLiIsICJpZCI6ICJyZXZlcnNlLXByb3h5LWhlYWRlcnMiLCAibGFiZWwiOiAiUmV2ZXJzZSBwcm94eSBoZWFkZXJzIiwgInJlZ2V4IjogIl4oPyFbOyBdKSg7PyA/KFtcXHdcXC1dKykoPyEuKlxcMiApIFteO10rKSokIiwgInR5cGUiOiAidGV4dCIsICJtdWx0aXBsZSI6ICJyZXZlcnNlLXByb3h5IiwgInBhdHRlcm4iOiAiXig/IVs7IF0pKDs/ID8oW1xcd1xcLV0rKSg/IS4qXFwyICkgW147XSspKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJuYW1lIjogIlJldmVyc2UgcHJveHkgaGVhZGVycyIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBIVFRQIGhlYWRlcnMgdG8gc2VuZCB0byBwcm94aWVkIHJlc291cmNlIHNlcGFyYXRlZCB3aXRoIHNlbWljb2xvbnMgKHZhbHVlcyBmb3IgcHJveHlfc2V0X2hlYWRlciBkaXJlY3RpdmUpLiJ9XSwgImNvbnRhaW5lckNsYXNzIjogInotMjAifSwgIlJFVkVSU0VfUFJPWFlfSEVBREVSU19DTElFTlQiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiTGlzdCBvZiBIVFRQIGhlYWRlcnMgdG8gc2VuZCB0byBjbGllbnQgc2VwYXJhdGVkIHdpdGggc2VtaWNvbG9ucyAodmFsdWVzIGZvciBhZGRfaGVhZGVyIGRpcmVjdGl2ZSkuIiwgImlkIjogInJldmVyc2UtcHJveHktaGVhZGVycy1jbGllbnQiLCAibGFiZWwiOiAiUmV2ZXJzZSBwcm94eSBoZWFkZXJzLWNsaWVudCIsICJyZWdleCI6ICJeKD8hWzsgXSkoOz8gPyhbXFx3XFwtXSspKD8hLipcXDIgKSBbXjtdKykqJCIsICJ0eXBlIjogInRleHQiLCAibXVsdGlwbGUiOiAicmV2ZXJzZS1wcm94eSIsICJwYXR0ZXJuIjogIl4oPyFbOyBdKSg7PyA/KFtcXHdcXC1dKykoPyEuKlxcMiApIFteO10rKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IGhlYWRlcnMtY2xpZW50IiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJMaXN0IG9mIEhUVFAgaGVhZGVycyB0byBzZW5kIHRvIGNsaWVudCBzZXBhcmF0ZWQgd2l0aCBzZW1pY29sb25zICh2YWx1ZXMgZm9yIGFkZF9oZWFkZXIgZGlyZWN0aXZlKS4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTE5In0sICJSRVZFUlNFX1BST1hZX0JVRkZFUklORyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJ5ZXMiLCAiaGVscCI6ICJFbmFibGUgb3IgZGlzYWJsZSBidWZmZXJpbmcgb2YgcmVzcG9uc2VzIGZyb20gcHJveGllZCByZXNvdXJjZS4iLCAiaWQiOiAicmV2ZXJzZS1wcm94eS1idWZmZXJpbmciLCAibGFiZWwiOiAiUmV2ZXJzZSBwcm94eSBidWZmZXJpbmciLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgIm11bHRpcGxlIjogInJldmVyc2UtcHJveHkiLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJ5ZXMiLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IGJ1ZmZlcmluZyIsICJwcmV2X3ZhbHVlIjogInllcyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiRW5hYmxlIG9yIGRpc2FibGUgYnVmZmVyaW5nIG9mIHJlc3BvbnNlcyBmcm9tIHByb3hpZWQgcmVzb3VyY2UuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xOCJ9LCAiUkVWRVJTRV9QUk9YWV9LRUVQQUxJVkUiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAibm8iLCAiaGVscCI6ICJFbmFibGUgb3IgZGlzYWJsZSBrZWVwYWxpdmUgY29ubmVjdGlvbnMgd2l0aCB0aGUgcHJveGllZCByZXNvdXJjZS4iLCAiaWQiOiAicmV2ZXJzZS1wcm94eS1rZWVwYWxpdmUiLCAibGFiZWwiOiAiUmV2ZXJzZSBwcm94eSBrZWVwYWxpdmUiLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgIm11bHRpcGxlIjogInJldmVyc2UtcHJveHkiLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJubyIsICJuYW1lIjogIlJldmVyc2UgcHJveHkga2VlcGFsaXZlIiwgInByZXZfdmFsdWUiOiAibm8iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkVuYWJsZSBvciBkaXNhYmxlIGtlZXBhbGl2ZSBjb25uZWN0aW9ucyB3aXRoIHRoZSBwcm94aWVkIHJlc291cmNlLiJ9XSwgImNvbnRhaW5lckNsYXNzIjogInotMTcifSwgIlJFVkVSU0VfUFJPWFlfQVVUSF9SRVFVRVNUIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkVuYWJsZSBhdXRoZW50aWNhdGlvbiB1c2luZyBhbiBleHRlcm5hbCBwcm92aWRlciAodmFsdWUgb2YgYXV0aF9yZXF1ZXN0IGRpcmVjdGl2ZSkuIiwgImlkIjogInJldmVyc2UtcHJveHktYXV0aC1yZXF1ZXN0IiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkgYXV0aCByZXF1ZXN0IiwgInJlZ2V4IjogIl4oXFwvW1xcd1xcXS5+OlxcLz8jXFxbQCEkXFwmJ1xcKFxcKSorLDs9XFwtXSp8b2ZmKT8kIiwgInR5cGUiOiAidGV4dCIsICJtdWx0aXBsZSI6ICJyZXZlcnNlLXByb3h5IiwgInBhdHRlcm4iOiAiXihcXC9bXFx3XFxdLn46XFwvPyNcXFtAISRcXCYnXFwoXFwpKissOz1cXC1dKnxvZmYpPyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJuYW1lIjogIlJldmVyc2UgcHJveHkgYXV0aCByZXF1ZXN0IiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJFbmFibGUgYXV0aGVudGljYXRpb24gdXNpbmcgYW4gZXh0ZXJuYWwgcHJvdmlkZXIgKHZhbHVlIG9mIGF1dGhfcmVxdWVzdCBkaXJlY3RpdmUpLiJ9XSwgImNvbnRhaW5lckNsYXNzIjogInotMTYifSwgIlJFVkVSU0VfUFJPWFlfQVVUSF9SRVFVRVNUX1NJR05JTl9VUkwiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiUmVkaXJlY3QgY2xpZW50cyB0byBzaWduLWluIFVSTCB3aGVuIHVzaW5nIFJFVkVSU0VfUFJPWFlfQVVUSF9SRVFVRVNUICh1c2VkIHdoZW4gYXV0aF9yZXF1ZXN0IGNhbGwgcmV0dXJuZWQgNDAxKS4iLCAiaWQiOiAicmV2ZXJzZS1wcm94eS1hdXRoLXJlcXVlc3Qtc2lnbmluLXVybCIsICJsYWJlbCI6ICJBdXRoIHJlcXVlc3Qgc2lnbmluIFVSTCIsICJyZWdleCI6ICJeKGh0dHBzPzpcXC9cXC9bXFwtXFx3QDolLit+Iz1dK1tcXC1cXHdcXChcXCkhQDolKy5+Iz8mXFwvPSRdKik/JCIsICJ0eXBlIjogInRleHQiLCAibXVsdGlwbGUiOiAicmV2ZXJzZS1wcm94eSIsICJwYXR0ZXJuIjogIl4oaHR0cHM/OlxcL1xcL1tcXC1cXHdAOiUuK34jPV0rW1xcLVxcd1xcKFxcKSFAOiUrLn4jPyZcXC89JF0qKT8kIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibmFtZSI6ICJBdXRoIHJlcXVlc3Qgc2lnbmluIFVSTCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiUmVkaXJlY3QgY2xpZW50cyB0byBzaWduLWluIFVSTCB3aGVuIHVzaW5nIFJFVkVSU0VfUFJPWFlfQVVUSF9SRVFVRVNUICh1c2VkIHdoZW4gYXV0aF9yZXF1ZXN0IGNhbGwgcmV0dXJuZWQgNDAxKS4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTE1In0sICJSRVZFUlNFX1BST1hZX0FVVEhfUkVRVUVTVF9TRVQiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiTGlzdCBvZiB2YXJpYWJsZXMgdG8gc2V0IGZyb20gdGhlIGF1dGhlbnRpY2F0aW9uIHByb3ZpZGVyLCBzZXBhcmF0ZWQgd2l0aCBzZW1pY29sb25zICh2YWx1ZXMgb2YgYXV0aF9yZXF1ZXN0X3NldCBkaXJlY3RpdmVzKS4iLCAiaWQiOiAicmV2ZXJzZS1wcm94eS1hdXRoLXJlcXVlc3Qtc2V0IiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkgYXV0aCByZXF1ZXN0IHNldCIsICJyZWdleCI6ICJeKD8hIDspKDs/ID8oXFwkW2Etel9cXC1dKykoPyEuKlxcMiApIFteO10rKSokIiwgInR5cGUiOiAidGV4dCIsICJtdWx0aXBsZSI6ICJyZXZlcnNlLXByb3h5IiwgInBhdHRlcm4iOiAiXig/ISA7KSg7PyA/KFxcJFthLXpfXFwtXSspKD8hLipcXDIgKSBbXjtdKykqJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm5hbWUiOiAiUmV2ZXJzZSBwcm94eSBhdXRoIHJlcXVlc3Qgc2V0IiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJMaXN0IG9mIHZhcmlhYmxlcyB0byBzZXQgZnJvbSB0aGUgYXV0aGVudGljYXRpb24gcHJvdmlkZXIsIHNlcGFyYXRlZCB3aXRoIHNlbWljb2xvbnMgKHZhbHVlcyBvZiBhdXRoX3JlcXVlc3Rfc2V0IGRpcmVjdGl2ZXMpLiJ9XSwgImNvbnRhaW5lckNsYXNzIjogInotMTQifSwgIlJFVkVSU0VfUFJPWFlfQ09OTkVDVF9USU1FT1VUIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIjYwcyIsICJoZWxwIjogIlRpbWVvdXQgd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBwcm94aWVkIHJlc291cmNlLiIsICJpZCI6ICJyZXZlcnNlLXByb3h5LWNvbm5lY3QtdGltZW91dCIsICJsYWJlbCI6ICJSZXZlcnNlIHByb3h5IGNvbm5lY3QgdGltZW91dCIsICJyZWdleCI6ICJeXFxkKyhtcz98W3NoZHdNeV0pJCIsICJ0eXBlIjogInRleHQiLCAibXVsdGlwbGUiOiAicmV2ZXJzZS1wcm94eSIsICJwYXR0ZXJuIjogIl5cXGQrKG1zP3xbc2hkd015XSkkIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICI2MHMiLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IGNvbm5lY3QgdGltZW91dCIsICJwcmV2X3ZhbHVlIjogIjYwcyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVGltZW91dCB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlIHByb3hpZWQgcmVzb3VyY2UuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xMyJ9LCAiUkVWRVJTRV9QUk9YWV9SRUFEX1RJTUVPVVQiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiNjBzIiwgImhlbHAiOiAiVGltZW91dCB3aGVuIHJlYWRpbmcgZnJvbSB0aGUgcHJveGllZCByZXNvdXJjZS4iLCAiaWQiOiAicmV2ZXJzZS1wcm94eS1yZWFkLXRpbWVvdXQiLCAibGFiZWwiOiAiUmV2ZXJzZSBwcm94eSByZWFkIHRpbWVvdXQiLCAicmVnZXgiOiAiXlxcZCsobXM/fFtzaGR3TXldKSQiLCAidHlwZSI6ICJ0ZXh0IiwgIm11bHRpcGxlIjogInJldmVyc2UtcHJveHkiLCAicGF0dGVybiI6ICJeXFxkKyhtcz98W3NoZHdNeV0pJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiNjBzIiwgIm5hbWUiOiAiUmV2ZXJzZSBwcm94eSByZWFkIHRpbWVvdXQiLCAicHJldl92YWx1ZSI6ICI2MHMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlRpbWVvdXQgd2hlbiByZWFkaW5nIGZyb20gdGhlIHByb3hpZWQgcmVzb3VyY2UuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xMiJ9LCAiUkVWRVJTRV9QUk9YWV9TRU5EX1RJTUVPVVQiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiNjBzIiwgImhlbHAiOiAiVGltZW91dCB3aGVuIHNlbmRpbmcgdG8gdGhlIHByb3hpZWQgcmVzb3VyY2UuIiwgImlkIjogInJldmVyc2UtcHJveHktc2VuZC10aW1lb3V0IiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkgc2VuZCB0aW1lb3V0IiwgInJlZ2V4IjogIl5cXGQrKG1zP3xbc2hkd015XSkkIiwgInR5cGUiOiAidGV4dCIsICJtdWx0aXBsZSI6ICJyZXZlcnNlLXByb3h5IiwgInBhdHRlcm4iOiAiXlxcZCsobXM/fFtzaGR3TXldKSQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjYwcyIsICJuYW1lIjogIlJldmVyc2UgcHJveHkgc2VuZCB0aW1lb3V0IiwgInByZXZfdmFsdWUiOiAiNjBzIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJUaW1lb3V0IHdoZW4gc2VuZGluZyB0byB0aGUgcHJveGllZCByZXNvdXJjZS4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTExIn0sICJSRVZFUlNFX1BST1hZX0lOQ0xVREVTIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiB0byBpbmNsdWRlIGluIHRoZSBsb2NhdGlvbiBibG9jaywgc2VwYXJhdGVkIHdpdGggc3BhY2VzLiIsICJpZCI6ICJyZXZlcnNlLXByb3h5LWluY2x1ZGVzIiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkgaW5jbHVkZXMiLCAicmVnZXgiOiAiXig/ISApKCA/KFxcdyspKD8hLipcXGJcXDJcXGIpKSokIiwgInR5cGUiOiAidGV4dCIsICJtdWx0aXBsZSI6ICJyZXZlcnNlLXByb3h5IiwgInBhdHRlcm4iOiAiXig/ISApKCA/KFxcdyspKD8hLipcXGJcXDJcXGIpKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IGluY2x1ZGVzIiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJBZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gdG8gaW5jbHVkZSBpbiB0aGUgbG9jYXRpb24gYmxvY2ssIHNlcGFyYXRlZCB3aXRoIHNwYWNlcy4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTEwIn19fSwgIm11bHRpcGxlcyI6IHsicmV2ZXJzZS1wcm94eSI6IHsiMCI6IHsiUkVWRVJTRV9QUk9YWV9IT1NUIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkZ1bGwgVVJMIG9mIHRoZSBwcm94aWVkIHJlc291cmNlIChwcm94eV9wYXNzKS4iLCAiaWQiOiAicmV2ZXJzZS1wcm94eS1ob3N0IiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkgaG9zdCIsICJyZWdleCI6ICJeLiokIiwgInR5cGUiOiAidGV4dCIsICJtdWx0aXBsZSI6ICJyZXZlcnNlLXByb3h5IiwgInBhdHRlcm4iOiAiXi4qJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IHRydWUsICJ2YWx1ZSI6ICJodHRwOi8vYXBwMTo4MDgwIiwgIm5hbWUiOiAiUmV2ZXJzZSBwcm94eSBob3N0IiwgInByZXZfdmFsdWUiOiAiaHR0cDovL2FwcDE6ODA4MCIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogInRyZXNwYXNzIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbWV0aG9kX2Rpc2FibGVkIn0sIHsiaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJGdWxsIFVSTCBvZiB0aGUgcHJveGllZCByZXNvdXJjZSAocHJveHlfcGFzcykuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yMyIsICJtZXRob2QiOiAic2NoZWR1bGVyIn0sICJSRVZFUlNFX1BST1hZX1VSTCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIvIiwgImhlbHAiOiAiTG9jYXRpb24gVVJMIHRoYXQgd2lsbCBiZSBwcm94aWVkLiIsICJpZCI6ICJyZXZlcnNlLXByb3h5LXVybCIsICJsYWJlbCI6ICJSZXZlcnNlIHByb3h5IHVybCIsICJyZWdleCI6ICJeLiokIiwgInR5cGUiOiAidGV4dCIsICJtdWx0aXBsZSI6ICJyZXZlcnNlLXByb3h5IiwgInBhdHRlcm4iOiAiXi4qJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiLyIsICJuYW1lIjogIlJldmVyc2UgcHJveHkgdXJsIiwgInByZXZfdmFsdWUiOiAiLyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTG9jYXRpb24gVVJMIHRoYXQgd2lsbCBiZSBwcm94aWVkLiJ9XSwgImNvbnRhaW5lckNsYXNzIjogInotMjIiLCAibWV0aG9kIjogImRlZmF1bHQifSwgIlJFVkVSU0VfUFJPWFlfV1MiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAibm8iLCAiaGVscCI6ICJFbmFibGUgd2Vic29ja2V0IG9uIHRoZSBwcm94aWVkIHJlc291cmNlLiIsICJpZCI6ICJyZXZlcnNlLXByb3h5LXdzIiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkgV1MiLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgIm11bHRpcGxlIjogInJldmVyc2UtcHJveHkiLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJubyIsICJuYW1lIjogIlJldmVyc2UgcHJveHkgV1MiLCAicHJldl92YWx1ZSI6ICJubyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiRW5hYmxlIHdlYnNvY2tldCBvbiB0aGUgcHJveGllZCByZXNvdXJjZS4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTIxIiwgIm1ldGhvZCI6ICJkZWZhdWx0In0sICJSRVZFUlNFX1BST1hZX0hFQURFUlMiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiTGlzdCBvZiBIVFRQIGhlYWRlcnMgdG8gc2VuZCB0byBwcm94aWVkIHJlc291cmNlIHNlcGFyYXRlZCB3aXRoIHNlbWljb2xvbnMgKHZhbHVlcyBmb3IgcHJveHlfc2V0X2hlYWRlciBkaXJlY3RpdmUpLiIsICJpZCI6ICJyZXZlcnNlLXByb3h5LWhlYWRlcnMiLCAibGFiZWwiOiAiUmV2ZXJzZSBwcm94eSBoZWFkZXJzIiwgInJlZ2V4IjogIl4oPyFbOyBdKSg7PyA/KFtcXHdcXC1dKykoPyEuKlxcMiApIFteO10rKSokIiwgInR5cGUiOiAidGV4dCIsICJtdWx0aXBsZSI6ICJyZXZlcnNlLXByb3h5IiwgInBhdHRlcm4iOiAiXig/IVs7IF0pKDs/ID8oW1xcd1xcLV0rKSg/IS4qXFwyICkgW147XSspKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJuYW1lIjogIlJldmVyc2UgcHJveHkgaGVhZGVycyIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBIVFRQIGhlYWRlcnMgdG8gc2VuZCB0byBwcm94aWVkIHJlc291cmNlIHNlcGFyYXRlZCB3aXRoIHNlbWljb2xvbnMgKHZhbHVlcyBmb3IgcHJveHlfc2V0X2hlYWRlciBkaXJlY3RpdmUpLiJ9XSwgImNvbnRhaW5lckNsYXNzIjogInotMjAiLCAibWV0aG9kIjogImRlZmF1bHQifSwgIlJFVkVSU0VfUFJPWFlfSEVBREVSU19DTElFTlQiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiTGlzdCBvZiBIVFRQIGhlYWRlcnMgdG8gc2VuZCB0byBjbGllbnQgc2VwYXJhdGVkIHdpdGggc2VtaWNvbG9ucyAodmFsdWVzIGZvciBhZGRfaGVhZGVyIGRpcmVjdGl2ZSkuIiwgImlkIjogInJldmVyc2UtcHJveHktaGVhZGVycy1jbGllbnQiLCAibGFiZWwiOiAiUmV2ZXJzZSBwcm94eSBoZWFkZXJzLWNsaWVudCIsICJyZWdleCI6ICJeKD8hWzsgXSkoOz8gPyhbXFx3XFwtXSspKD8hLipcXDIgKSBbXjtdKykqJCIsICJ0eXBlIjogInRleHQiLCAibXVsdGlwbGUiOiAicmV2ZXJzZS1wcm94eSIsICJwYXR0ZXJuIjogIl4oPyFbOyBdKSg7PyA/KFtcXHdcXC1dKykoPyEuKlxcMiApIFteO10rKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IGhlYWRlcnMtY2xpZW50IiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJMaXN0IG9mIEhUVFAgaGVhZGVycyB0byBzZW5kIHRvIGNsaWVudCBzZXBhcmF0ZWQgd2l0aCBzZW1pY29sb25zICh2YWx1ZXMgZm9yIGFkZF9oZWFkZXIgZGlyZWN0aXZlKS4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTE5IiwgIm1ldGhvZCI6ICJkZWZhdWx0In0sICJSRVZFUlNFX1BST1hZX0JVRkZFUklORyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJ5ZXMiLCAiaGVscCI6ICJFbmFibGUgb3IgZGlzYWJsZSBidWZmZXJpbmcgb2YgcmVzcG9uc2VzIGZyb20gcHJveGllZCByZXNvdXJjZS4iLCAiaWQiOiAicmV2ZXJzZS1wcm94eS1idWZmZXJpbmciLCAibGFiZWwiOiAiUmV2ZXJzZSBwcm94eSBidWZmZXJpbmciLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgIm11bHRpcGxlIjogInJldmVyc2UtcHJveHkiLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJ5ZXMiLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IGJ1ZmZlcmluZyIsICJwcmV2X3ZhbHVlIjogInllcyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiRW5hYmxlIG9yIGRpc2FibGUgYnVmZmVyaW5nIG9mIHJlc3BvbnNlcyBmcm9tIHByb3hpZWQgcmVzb3VyY2UuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xOCIsICJtZXRob2QiOiAiZGVmYXVsdCJ9LCAiUkVWRVJTRV9QUk9YWV9LRUVQQUxJVkUiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAibm8iLCAiaGVscCI6ICJFbmFibGUgb3IgZGlzYWJsZSBrZWVwYWxpdmUgY29ubmVjdGlvbnMgd2l0aCB0aGUgcHJveGllZCByZXNvdXJjZS4iLCAiaWQiOiAicmV2ZXJzZS1wcm94eS1rZWVwYWxpdmUiLCAibGFiZWwiOiAiUmV2ZXJzZSBwcm94eSBrZWVwYWxpdmUiLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgIm11bHRpcGxlIjogInJldmVyc2UtcHJveHkiLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJubyIsICJuYW1lIjogIlJldmVyc2UgcHJveHkga2VlcGFsaXZlIiwgInByZXZfdmFsdWUiOiAibm8iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkVuYWJsZSBvciBkaXNhYmxlIGtlZXBhbGl2ZSBjb25uZWN0aW9ucyB3aXRoIHRoZSBwcm94aWVkIHJlc291cmNlLiJ9XSwgImNvbnRhaW5lckNsYXNzIjogInotMTciLCAibWV0aG9kIjogImRlZmF1bHQifSwgIlJFVkVSU0VfUFJPWFlfQVVUSF9SRVFVRVNUIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkVuYWJsZSBhdXRoZW50aWNhdGlvbiB1c2luZyBhbiBleHRlcm5hbCBwcm92aWRlciAodmFsdWUgb2YgYXV0aF9yZXF1ZXN0IGRpcmVjdGl2ZSkuIiwgImlkIjogInJldmVyc2UtcHJveHktYXV0aC1yZXF1ZXN0IiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkgYXV0aCByZXF1ZXN0IiwgInJlZ2V4IjogIl4oXFwvW1xcd1xcXS5+OlxcLz8jXFxbQCEkXFwmJ1xcKFxcKSorLDs9XFwtXSp8b2ZmKT8kIiwgInR5cGUiOiAidGV4dCIsICJtdWx0aXBsZSI6ICJyZXZlcnNlLXByb3h5IiwgInBhdHRlcm4iOiAiXihcXC9bXFx3XFxdLn46XFwvPyNcXFtAISRcXCYnXFwoXFwpKissOz1cXC1dKnxvZmYpPyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJuYW1lIjogIlJldmVyc2UgcHJveHkgYXV0aCByZXF1ZXN0IiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJFbmFibGUgYXV0aGVudGljYXRpb24gdXNpbmcgYW4gZXh0ZXJuYWwgcHJvdmlkZXIgKHZhbHVlIG9mIGF1dGhfcmVxdWVzdCBkaXJlY3RpdmUpLiJ9XSwgImNvbnRhaW5lckNsYXNzIjogInotMTYiLCAibWV0aG9kIjogImRlZmF1bHQifSwgIlJFVkVSU0VfUFJPWFlfQVVUSF9SRVFVRVNUX1NJR05JTl9VUkwiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiUmVkaXJlY3QgY2xpZW50cyB0byBzaWduLWluIFVSTCB3aGVuIHVzaW5nIFJFVkVSU0VfUFJPWFlfQVVUSF9SRVFVRVNUICh1c2VkIHdoZW4gYXV0aF9yZXF1ZXN0IGNhbGwgcmV0dXJuZWQgNDAxKS4iLCAiaWQiOiAicmV2ZXJzZS1wcm94eS1hdXRoLXJlcXVlc3Qtc2lnbmluLXVybCIsICJsYWJlbCI6ICJBdXRoIHJlcXVlc3Qgc2lnbmluIFVSTCIsICJyZWdleCI6ICJeKGh0dHBzPzpcXC9cXC9bXFwtXFx3QDolLit+Iz1dK1tcXC1cXHdcXChcXCkhQDolKy5+Iz8mXFwvPSRdKik/JCIsICJ0eXBlIjogInRleHQiLCAibXVsdGlwbGUiOiAicmV2ZXJzZS1wcm94eSIsICJwYXR0ZXJuIjogIl4oaHR0cHM/OlxcL1xcL1tcXC1cXHdAOiUuK34jPV0rW1xcLVxcd1xcKFxcKSFAOiUrLn4jPyZcXC89JF0qKT8kIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibmFtZSI6ICJBdXRoIHJlcXVlc3Qgc2lnbmluIFVSTCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiUmVkaXJlY3QgY2xpZW50cyB0byBzaWduLWluIFVSTCB3aGVuIHVzaW5nIFJFVkVSU0VfUFJPWFlfQVVUSF9SRVFVRVNUICh1c2VkIHdoZW4gYXV0aF9yZXF1ZXN0IGNhbGwgcmV0dXJuZWQgNDAxKS4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTE1IiwgIm1ldGhvZCI6ICJkZWZhdWx0In0sICJSRVZFUlNFX1BST1hZX0FVVEhfUkVRVUVTVF9TRVQiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiTGlzdCBvZiB2YXJpYWJsZXMgdG8gc2V0IGZyb20gdGhlIGF1dGhlbnRpY2F0aW9uIHByb3ZpZGVyLCBzZXBhcmF0ZWQgd2l0aCBzZW1pY29sb25zICh2YWx1ZXMgb2YgYXV0aF9yZXF1ZXN0X3NldCBkaXJlY3RpdmVzKS4iLCAiaWQiOiAicmV2ZXJzZS1wcm94eS1hdXRoLXJlcXVlc3Qtc2V0IiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkgYXV0aCByZXF1ZXN0IHNldCIsICJyZWdleCI6ICJeKD8hIDspKDs/ID8oXFwkW2Etel9cXC1dKykoPyEuKlxcMiApIFteO10rKSokIiwgInR5cGUiOiAidGV4dCIsICJtdWx0aXBsZSI6ICJyZXZlcnNlLXByb3h5IiwgInBhdHRlcm4iOiAiXig/ISA7KSg7PyA/KFxcJFthLXpfXFwtXSspKD8hLipcXDIgKSBbXjtdKykqJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm5hbWUiOiAiUmV2ZXJzZSBwcm94eSBhdXRoIHJlcXVlc3Qgc2V0IiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJMaXN0IG9mIHZhcmlhYmxlcyB0byBzZXQgZnJvbSB0aGUgYXV0aGVudGljYXRpb24gcHJvdmlkZXIsIHNlcGFyYXRlZCB3aXRoIHNlbWljb2xvbnMgKHZhbHVlcyBvZiBhdXRoX3JlcXVlc3Rfc2V0IGRpcmVjdGl2ZXMpLiJ9XSwgImNvbnRhaW5lckNsYXNzIjogInotMTQiLCAibWV0aG9kIjogImRlZmF1bHQifSwgIlJFVkVSU0VfUFJPWFlfQ09OTkVDVF9USU1FT1VUIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIjYwcyIsICJoZWxwIjogIlRpbWVvdXQgd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBwcm94aWVkIHJlc291cmNlLiIsICJpZCI6ICJyZXZlcnNlLXByb3h5LWNvbm5lY3QtdGltZW91dCIsICJsYWJlbCI6ICJSZXZlcnNlIHByb3h5IGNvbm5lY3QgdGltZW91dCIsICJyZWdleCI6ICJeXFxkKyhtcz98W3NoZHdNeV0pJCIsICJ0eXBlIjogInRleHQiLCAibXVsdGlwbGUiOiAicmV2ZXJzZS1wcm94eSIsICJwYXR0ZXJuIjogIl5cXGQrKG1zP3xbc2hkd015XSkkIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICI2MHMiLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IGNvbm5lY3QgdGltZW91dCIsICJwcmV2X3ZhbHVlIjogIjYwcyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVGltZW91dCB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlIHByb3hpZWQgcmVzb3VyY2UuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xMyIsICJtZXRob2QiOiAiZGVmYXVsdCJ9LCAiUkVWRVJTRV9QUk9YWV9SRUFEX1RJTUVPVVQiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiNjBzIiwgImhlbHAiOiAiVGltZW91dCB3aGVuIHJlYWRpbmcgZnJvbSB0aGUgcHJveGllZCByZXNvdXJjZS4iLCAiaWQiOiAicmV2ZXJzZS1wcm94eS1yZWFkLXRpbWVvdXQiLCAibGFiZWwiOiAiUmV2ZXJzZSBwcm94eSByZWFkIHRpbWVvdXQiLCAicmVnZXgiOiAiXlxcZCsobXM/fFtzaGR3TXldKSQiLCAidHlwZSI6ICJ0ZXh0IiwgIm11bHRpcGxlIjogInJldmVyc2UtcHJveHkiLCAicGF0dGVybiI6ICJeXFxkKyhtcz98W3NoZHdNeV0pJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiNjBzIiwgIm5hbWUiOiAiUmV2ZXJzZSBwcm94eSByZWFkIHRpbWVvdXQiLCAicHJldl92YWx1ZSI6ICI2MHMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlRpbWVvdXQgd2hlbiByZWFkaW5nIGZyb20gdGhlIHByb3hpZWQgcmVzb3VyY2UuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xMiIsICJtZXRob2QiOiAiZGVmYXVsdCJ9LCAiUkVWRVJTRV9QUk9YWV9TRU5EX1RJTUVPVVQiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiNjBzIiwgImhlbHAiOiAiVGltZW91dCB3aGVuIHNlbmRpbmcgdG8gdGhlIHByb3hpZWQgcmVzb3VyY2UuIiwgImlkIjogInJldmVyc2UtcHJveHktc2VuZC10aW1lb3V0IiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkgc2VuZCB0aW1lb3V0IiwgInJlZ2V4IjogIl5cXGQrKG1zP3xbc2hkd015XSkkIiwgInR5cGUiOiAidGV4dCIsICJtdWx0aXBsZSI6ICJyZXZlcnNlLXByb3h5IiwgInBhdHRlcm4iOiAiXlxcZCsobXM/fFtzaGR3TXldKSQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjYwcyIsICJuYW1lIjogIlJldmVyc2UgcHJveHkgc2VuZCB0aW1lb3V0IiwgInByZXZfdmFsdWUiOiAiNjBzIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJUaW1lb3V0IHdoZW4gc2VuZGluZyB0byB0aGUgcHJveGllZCByZXNvdXJjZS4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTExIiwgIm1ldGhvZCI6ICJkZWZhdWx0In0sICJSRVZFUlNFX1BST1hZX0lOQ0xVREVTIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiB0byBpbmNsdWRlIGluIHRoZSBsb2NhdGlvbiBibG9jaywgc2VwYXJhdGVkIHdpdGggc3BhY2VzLiIsICJpZCI6ICJyZXZlcnNlLXByb3h5LWluY2x1ZGVzIiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkgaW5jbHVkZXMiLCAicmVnZXgiOiAiXig/ISApKCA/KFxcdyspKD8hLipcXGJcXDJcXGIpKSokIiwgInR5cGUiOiAidGV4dCIsICJtdWx0aXBsZSI6ICJyZXZlcnNlLXByb3h5IiwgInBhdHRlcm4iOiAiXig/ISApKCA/KFxcdyspKD8hLipcXGJcXDJcXGIpKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IGluY2x1ZGVzIiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJBZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gdG8gaW5jbHVkZSBpbiB0aGUgbG9jYXRpb24gYmxvY2ssIHNlcGFyYXRlZCB3aXRoIHNwYWNlcy4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTEwIiwgIm1ldGhvZCI6ICJkZWZhdWx0In19fX19LCB7ImlkIjogInJldmVyc2VzY2FuIiwgInN0cmVhbSI6ICJ5ZXMiLCAibmFtZSI6ICJSZXZlcnNlIHNjYW4iLCAiZGVzY3JpcHRpb24iOiAiU2NhbiBjbGllbnRzIHBvcnRzIHRvIGRldGVjdCBwcm94aWVzIG9yIHNlcnZlcnMuIiwgInZlcnNpb24iOiAiMS4wIiwgInR5cGUiOiAiY29yZSIsICJtZXRob2QiOiAibWFudWFsIiwgInBhZ2UiOiB0cnVlLCAic2V0dGluZ3MiOiB7IlVTRV9SRVZFUlNFX1NDQU4iOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAibm8iLCAiaGVscCI6ICJFbmFibGUgc2Nhbm5pbmcgb2YgY2xpZW50cyBwb3J0cyBhbmQgZGVueSBhY2Nlc3MgaWYgb25lIGlzIG9wZW5lZC4iLCAiaWQiOiAidXNlLXJldmVyc2Utc2NhbiIsICJsYWJlbCI6ICJSZXZlcnNlIHNjYW4iLCAicmVnZXgiOiAiXihub3x5ZXMpJCIsICJ0eXBlIjogImNoZWNrIiwgInBhdHRlcm4iOiAiXihub3x5ZXMpJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAibm8iLCAibmFtZSI6ICJSZXZlcnNlIHNjYW4iLCAicHJldl92YWx1ZSI6ICJubyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiRW5hYmxlIHNjYW5uaW5nIG9mIGNsaWVudHMgcG9ydHMgYW5kIGRlbnkgYWNjZXNzIGlmIG9uZSBpcyBvcGVuZWQuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yIn0sICJSRVZFUlNFX1NDQU5fUE9SVFMiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiMjIgODAgNDQzIDMxMjggODAwMCA4MDgwIiwgImhlbHAiOiAiTGlzdCBvZiBwb3J0IHRvIHNjYW4gd2hlbiB1c2luZyByZXZlcnNlIHNjYW4gZmVhdHVyZS4iLCAiaWQiOiAicmV2ZXJzZS1zY2FuLXBvcnRzIiwgImxhYmVsIjogIlJldmVyc2Ugc2NhbiBwb3J0cyIsICJyZWdleCI6ICJeLiokIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4uKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjIyIDgwIDQ0MyAzMTI4IDgwMDAgODA4MCIsICJuYW1lIjogIlJldmVyc2Ugc2NhbiBwb3J0cyIsICJwcmV2X3ZhbHVlIjogIjIyIDgwIDQ0MyAzMTI4IDgwMDAgODA4MCIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBwb3J0IHRvIHNjYW4gd2hlbiB1c2luZyByZXZlcnNlIHNjYW4gZmVhdHVyZS4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTEifSwgIlJFVkVSU0VfU0NBTl9USU1FT1VUIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIjUwMCIsICJoZWxwIjogIlNwZWNpZnkgdGhlIG1heGltdW0gdGltZW91dCAoaW4gbXMpIHdoZW4gc2Nhbm5pbmcgYSBwb3J0LiIsICJpZCI6ICJyZXZlcnNlLXNjYW4tdGltZW91dCIsICJsYWJlbCI6ICJSZXZlcnNlIHNjYW4gdGltZW91dCIsICJyZWdleCI6ICJeLiokIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4uKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjUwMCIsICJuYW1lIjogIlJldmVyc2Ugc2NhbiB0aW1lb3V0IiwgInByZXZfdmFsdWUiOiAiNTAwIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJTcGVjaWZ5IHRoZSBtYXhpbXVtIHRpbWVvdXQgKGluIG1zKSB3aGVuIHNjYW5uaW5nIGEgcG9ydC4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTAifX0sICJjaGVja3N1bSI6IG51bGx9LCB7ImlkIjogInNlbGZzaWduZWQiLCAic3RyZWFtIjogInllcyIsICJuYW1lIjogIlNlbGYtc2lnbmVkIGNlcnRpZmljYXRlIiwgImRlc2NyaXB0aW9uIjogIkdlbmVyYXRlIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlLiIsICJ2ZXJzaW9uIjogIjEuMCIsICJ0eXBlIjogImNvcmUiLCAibWV0aG9kIjogIm1hbnVhbCIsICJwYWdlIjogZmFsc2UsICJzZXR0aW5ncyI6IHsiR0VORVJBVEVfU0VMRl9TSUdORURfU1NMIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIm5vIiwgImhlbHAiOiAiR2VuZXJhdGUgYW5kIHVzZSBzZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZS4iLCAiaWQiOiAiZ2VuZXJhdGUtc2VsZi1zaWduZWQtc3NsIiwgImxhYmVsIjogIkFjdGl2YXRlIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIm5vIiwgIm5hbWUiOiAiQWN0aXZhdGUgc2VsZi1zaWduZWQgY2VydGlmaWNhdGUiLCAicHJldl92YWx1ZSI6ICJubyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiR2VuZXJhdGUgYW5kIHVzZSBzZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZS4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTIifSwgIlNFTEZfU0lHTkVEX1NTTF9FWFBJUlkiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiMzY1IiwgImhlbHAiOiAiU2VsZi1zaWduZWQgY2VydGlmaWNhdGUgZXhwaXJ5IGluIGRheXMuIiwgImlkIjogInNlbGYtc2lnbmVkLXNzbC1leHBpcnkiLCAibGFiZWwiOiAiQ2VydGlmaWNhdGUgZXhwaXJ5IiwgInJlZ2V4IjogIl5cXGQrJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeXFxkKyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjM2NSIsICJuYW1lIjogIkNlcnRpZmljYXRlIGV4cGlyeSIsICJwcmV2X3ZhbHVlIjogIjM2NSIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiU2VsZi1zaWduZWQgY2VydGlmaWNhdGUgZXhwaXJ5IGluIGRheXMuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xIn0sICJTRUxGX1NJR05FRF9TU0xfU1VCSiI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIvQ049d3d3LmV4YW1wbGUuY29tLyIsICJoZWxwIjogIlNlbGYtc2lnbmVkIGNlcnRpZmljYXRlIHN1YmplY3QuIiwgImlkIjogInNlbGYtc2lnbmVkLXNzbC1zdWJqIiwgImxhYmVsIjogIkNlcnRpZmljYXRlIHN1YmplY3QiLCAicmVnZXgiOiAiXi9DTj1bXixdKyQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXi9DTj1bXixdKyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIi9DTj13d3cuZXhhbXBsZS5jb20vIiwgIm5hbWUiOiAiQ2VydGlmaWNhdGUgc3ViamVjdCIsICJwcmV2X3ZhbHVlIjogIi9DTj13d3cuZXhhbXBsZS5jb20vIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJTZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZSBzdWJqZWN0LiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMCJ9fSwgImNoZWNrc3VtIjogbnVsbH0sIHsiaWQiOiAidWkiLCAic3RyZWFtIjogIm5vIiwgIm5hbWUiOiAiVUkiLCAiZGVzY3JpcHRpb24iOiAiSW50ZWdyYXRlIGVhc2lseSB0aGUgQnVua2VyV2ViIFVJLiIsICJ2ZXJzaW9uIjogIjEuMCIsICJ0eXBlIjogImNvcmUiLCAibWV0aG9kIjogIm1hbnVhbCIsICJwYWdlIjogZmFsc2UsICJzZXR0aW5ncyI6IHsiVVNFX1VJIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIm5vIiwgImhlbHAiOiAiVXNlIFVJIiwgImlkIjogInVzZS11aSIsICJsYWJlbCI6ICJVc2UgVUkiLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAibm8iLCAibmFtZSI6ICJVc2UgVUkiLCAicHJldl92YWx1ZSI6ICJubyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVXNlIFVJIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0wIn19LCAiY2hlY2tzdW0iOiBudWxsfSwgeyJpZCI6ICJ3aGl0ZWxpc3QiLCAic3RyZWFtIjogInBhcnRpYWwiLCAibmFtZSI6ICJXaGl0ZWxpc3QiLCAiZGVzY3JpcHRpb24iOiAiQWxsb3cgYWNjZXNzIGJhc2VkIG9uIGludGVybmFsIGFuZCBleHRlcm5hbCBJUC9uZXR3b3JrL3JETlMvQVNOIHdoaXRlbGlzdHMuIiwgInZlcnNpb24iOiAiMS4wIiwgInR5cGUiOiAiY29yZSIsICJtZXRob2QiOiAibWFudWFsIiwgInBhZ2UiOiB0cnVlLCAic2V0dGluZ3MiOiB7IlVTRV9XSElURUxJU1QiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAieWVzIiwgImhlbHAiOiAiQWN0aXZhdGUgd2hpdGVsaXN0IGZlYXR1cmUuIiwgImlkIjogInVzZS13aGl0ZWxpc3QiLCAibGFiZWwiOiAiQWN0aXZhdGUgd2hpdGVsaXN0aW5nIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiB0cnVlLCAidmFsdWUiOiAibm8iLCAibmFtZSI6ICJBY3RpdmF0ZSB3aGl0ZWxpc3RpbmciLCAicHJldl92YWx1ZSI6ICJ5ZXMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJ0cmVzcGFzcyIsICJ0ZXh0IjogImlucF9wb3BvdmVyX21ldGhvZF9kaXNhYmxlZCJ9LCB7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiQWN0aXZhdGUgd2hpdGVsaXN0IGZlYXR1cmUuIn1dLCAibWV0aG9kIjogInNjaGVkdWxlciIsICJjb250YWluZXJDbGFzcyI6ICJ6LTYifSwgIldISVRFTElTVF9JUCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIyMC4xOTEuNDUuMjEyIDQwLjg4LjIxLjIzNSA0MC43Ni4xNzMuMTUxIDQwLjc2LjE2My43IDIwLjE4NS43OS40NyA1Mi4xNDIuMjYuMTc1IDIwLjE4NS43OS4xNSA1Mi4xNDIuMjQuMTQ5IDQwLjc2LjE2Mi4yMDggNDAuNzYuMTYzLjIzIDQwLjc2LjE2Mi4xOTEgNDAuNzYuMTYyLjI0NyIsICJoZWxwIjogIkxpc3Qgb2YgSVAvbmV0d29yaywgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCB0byBwdXQgaW50byB0aGUgd2hpdGVsaXN0LiIsICJpZCI6ICJ3aGl0ZWxpc3QtaXAiLCAibGFiZWwiOiAiV2hpdGVsaXN0IElQL25ldHdvcmsiLCAicmVnZXgiOiAiXig/ISApKCAqKCgoXFxiMjVbMC01XXxcXGIyWzAtNF1cXGR8XFxiWzAxXT9cXGRcXGQ/KShcXC4oMjVbMC01XXwyWzAtNF1cXGR8WzAxXT9cXGRcXGQ/KSl7M30pKFxcLyhbMS0yXVswLTldP3wzWzAtMl0/fFswNC05XSkpP3woKFswLTlhLWZBLUZdezEsNH06KXs3fVswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDd9OnwoWzAtOWEtZkEtRl17MSw0fTopezEsNn06WzAtOWEtZkEtRl17MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsNX0oOlswLTlhLWZBLUZdezEsNH0pezEsMn18KFswLTlhLWZBLUZdezEsNH06KXsxLDR9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDN9fChbMC05YS1mQS1GXXsxLDR9Oil7MSwzfSg6WzAtOWEtZkEtRl17MSw0fSl7MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsMn0oOlswLTlhLWZBLUZdezEsNH0pezEsNX18WzAtOWEtZkEtRl17MSw0fTooKDpbMC05YS1mQS1GXXsxLDR9KXsxLDZ9KXw6KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw3fXw6KXxmZTgwOig6WzAtOWEtZkEtRl1aezAsNH0pezAsNH0lWzAtOWEtekEtWl0rfDo6KGZmZmYoOjB7MSw0fSk/Oik/KCgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZClcXC4pezN9KDI1WzAtNV18KDJbMC00XXwxP1xcZCk/XFxkKXwoWzAtOWEtZkEtRl17MSw0fTopezEsNH06KCgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZClcXC4pezN9KDI1WzAtNV18KDJbMC00XXwxP1xcZCk/XFxkKSkoXFwvKDEyWzAtOF18MVswMV1bMC05XXxbMC05XVswLTldPykpPykoPyEuKlxcRFxcMihbXlxcZFxcL118JCkpICopKiQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXig/ISApKCAqKCgoXFxiMjVbMC01XXxcXGIyWzAtNF1cXGR8XFxiWzAxXT9cXGRcXGQ/KShcXC4oMjVbMC01XXwyWzAtNF1cXGR8WzAxXT9cXGRcXGQ/KSl7M30pKFxcLyhbMS0yXVswLTldP3wzWzAtMl0/fFswNC05XSkpP3woKFswLTlhLWZBLUZdezEsNH06KXs3fVswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDd9OnwoWzAtOWEtZkEtRl17MSw0fTopezEsNn06WzAtOWEtZkEtRl17MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsNX0oOlswLTlhLWZBLUZdezEsNH0pezEsMn18KFswLTlhLWZBLUZdezEsNH06KXsxLDR9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDN9fChbMC05YS1mQS1GXXsxLDR9Oil7MSwzfSg6WzAtOWEtZkEtRl17MSw0fSl7MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsMn0oOlswLTlhLWZBLUZdezEsNH0pezEsNX18WzAtOWEtZkEtRl17MSw0fTooKDpbMC05YS1mQS1GXXsxLDR9KXsxLDZ9KXw6KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw3fXw6KXxmZTgwOig6WzAtOWEtZkEtRl1aezAsNH0pezAsNH0lWzAtOWEtekEtWl0rfDo6KGZmZmYoOjB7MSw0fSk/Oik/KCgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZClcXC4pezN9KDI1WzAtNV18KDJbMC00XXwxP1xcZCk/XFxkKXwoWzAtOWEtZkEtRl17MSw0fTopezEsNH06KCgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZClcXC4pezN9KDI1WzAtNV18KDJbMC00XXwxP1xcZCk/XFxkKSkoXFwvKDEyWzAtOF18MVswMV1bMC05XXxbMC05XVswLTldPykpPykoPyEuKlxcRFxcMihbXlxcZFxcL118JCkpICopKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjIwLjE5MS40NS4yMTIgNDAuODguMjEuMjM1IDQwLjc2LjE3My4xNTEgNDAuNzYuMTYzLjcgMjAuMTg1Ljc5LjQ3IDUyLjE0Mi4yNi4xNzUgMjAuMTg1Ljc5LjE1IDUyLjE0Mi4yNC4xNDkgNDAuNzYuMTYyLjIwOCA0MC43Ni4xNjMuMjMgNDAuNzYuMTYyLjE5MSA0MC43Ni4xNjIuMjQ3IiwgIm5hbWUiOiAiV2hpdGVsaXN0IElQL25ldHdvcmsiLCAicHJldl92YWx1ZSI6ICIyMC4xOTEuNDUuMjEyIDQwLjg4LjIxLjIzNSA0MC43Ni4xNzMuMTUxIDQwLjc2LjE2My43IDIwLjE4NS43OS40NyA1Mi4xNDIuMjYuMTc1IDIwLjE4NS43OS4xNSA1Mi4xNDIuMjQuMTQ5IDQwLjc2LjE2Mi4yMDggNDAuNzYuMTYzLjIzIDQwLjc2LjE2Mi4xOTEgNDAuNzYuMTYyLjI0NyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBJUC9uZXR3b3JrLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIHRvIHB1dCBpbnRvIHRoZSB3aGl0ZWxpc3QuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei01In0sICJXSElURUxJU1RfUkROUyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIuZ29vZ2xlLmNvbSAuZ29vZ2xlYm90LmNvbSAueWFuZGV4LnJ1IC55YW5kZXgubmV0IC55YW5kZXguY29tIC5zZWFyY2gubXNuLmNvbSAuYmFpZHUuY29tIC5iYWlkdS5qcCAuY3Jhd2wueWFob28ubmV0IC5md2QubGlua2VkaW4uY29tIC50d2l0dGVyLmNvbSAudHd0dHIuY29tIC5kaXNjb3JkLmNvbSIsICJoZWxwIjogIkxpc3Qgb2YgcmV2ZXJzZSBETlMgc3VmZml4ZXMsIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgdG8gd2hpdGVsaXN0LiIsICJpZCI6ICJ3aGl0ZWxpc3QtcmRucyIsICJsYWJlbCI6ICJXaGl0ZWxpc3QgcmV2ZXJzZSBETlMiLCAicmVnZXgiOiAiXiggKigoW14gXSspKD8hLipcXDMoIHwkKSkpICopKiQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXiggKigoW14gXSspKD8hLipcXDMoIHwkKSkpICopKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIi5nb29nbGUuY29tIC5nb29nbGVib3QuY29tIC55YW5kZXgucnUgLnlhbmRleC5uZXQgLnlhbmRleC5jb20gLnNlYXJjaC5tc24uY29tIC5iYWlkdS5jb20gLmJhaWR1LmpwIC5jcmF3bC55YWhvby5uZXQgLmZ3ZC5saW5rZWRpbi5jb20gLnR3aXR0ZXIuY29tIC50d3R0ci5jb20gLmRpc2NvcmQuY29tIiwgIm5hbWUiOiAiV2hpdGVsaXN0IHJldmVyc2UgRE5TIiwgInByZXZfdmFsdWUiOiAiLmdvb2dsZS5jb20gLmdvb2dsZWJvdC5jb20gLnlhbmRleC5ydSAueWFuZGV4Lm5ldCAueWFuZGV4LmNvbSAuc2VhcmNoLm1zbi5jb20gLmJhaWR1LmNvbSAuYmFpZHUuanAgLmNyYXdsLnlhaG9vLm5ldCAuZndkLmxpbmtlZGluLmNvbSAudHdpdHRlci5jb20gLnR3dHRyLmNvbSAuZGlzY29yZC5jb20iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkxpc3Qgb2YgcmV2ZXJzZSBETlMgc3VmZml4ZXMsIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgdG8gd2hpdGVsaXN0LiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotNCJ9LCAiV0hJVEVMSVNUX1JETlNfR0xPQkFMIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogInllcyIsICJoZWxwIjogIk9ubHkgcGVyZm9ybSBSRE5TIHdoaXRlbGlzdCBjaGVja3Mgb24gZ2xvYmFsIElQIGFkZHJlc3Nlcy4iLCAiaWQiOiAid2hpdGVsaXN0LXJkbnMtZ2xvYmFsIiwgImxhYmVsIjogIldoaXRlbGlzdCByZXZlcnNlIEROUyBnbG9iYWwgSVBzIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogInllcyIsICJuYW1lIjogIldoaXRlbGlzdCByZXZlcnNlIEROUyBnbG9iYWwgSVBzIiwgInByZXZfdmFsdWUiOiAieWVzIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJPbmx5IHBlcmZvcm0gUkROUyB3aGl0ZWxpc3QgY2hlY2tzIG9uIGdsb2JhbCBJUCBhZGRyZXNzZXMuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0zIn0sICJXSElURUxJU1RfQVNOIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIjMyOTM0IiwgImhlbHAiOiAiTGlzdCBvZiBBU04gbnVtYmVycywgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCB0byB3aGl0ZWxpc3QuIiwgImlkIjogIndoaXRlbGlzdC1hc24iLCAibGFiZWwiOiAiV2hpdGVsaXN0IEFTTiIsICJyZWdleCI6ICJeXiggKigoQVNOPyk/KFxcZCspXFxiKD8hLipbU04gXVxcNFxcYikpICopKiQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXl4oICooKEFTTj8pPyhcXGQrKVxcYig/IS4qW1NOIF1cXDRcXGIpKSAqKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIzMjkzNCIsICJuYW1lIjogIldoaXRlbGlzdCBBU04iLCAicHJldl92YWx1ZSI6ICIzMjkzNCIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBBU04gbnVtYmVycywgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCB0byB3aGl0ZWxpc3QuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yIn0sICJXSElURUxJU1RfVVNFUl9BR0VOVCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJMaXN0IG9mIFVzZXItQWdlbnQgKFBDUkUgcmVnZXgpLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIHRvIHdoaXRlbGlzdC4iLCAiaWQiOiAid2hpdGVsaXN0LXVzZXItYWdlbnQiLCAibGFiZWwiOiAiV2hpdGVsaXN0IFVzZXItQWdlbnQiLCAicmVnZXgiOiAiXi4qJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeLiokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibmFtZSI6ICJXaGl0ZWxpc3QgVXNlci1BZ2VudCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBVc2VyLUFnZW50IChQQ1JFIHJlZ2V4KSwgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCB0byB3aGl0ZWxpc3QuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xIn0sICJXSElURUxJU1RfVVJJIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkxpc3Qgb2YgVVJJIChQQ1JFIHJlZ2V4KSwgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCB0byB3aGl0ZWxpc3QuIiwgImlkIjogIndoaXRlbGlzdC11cmkiLCAibGFiZWwiOiAiV2hpdGVsaXN0IFVSSSIsICJyZWdleCI6ICJeKCAqKC4qKSg/IS4qXFwyKD8hLikpICopKiQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXiggKiguKikoPyEuKlxcMig/IS4pKSAqKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibmFtZSI6ICJXaGl0ZWxpc3QgVVJJIiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJMaXN0IG9mIFVSSSAoUENSRSByZWdleCksIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgdG8gd2hpdGVsaXN0LiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMCJ9fSwgImNoZWNrc3VtIjogbnVsbH1dfX0sICJvcGVyYXRpb24iOiAiZWRpdCIsICJvbGRTZXJ2ZXJOYW1lIjogImFwcDEuZXhhbXBsZS5jb20ifX1dfV0= diff --git a/src/ui/client/tests/bans.json b/src/ui/client/tests/bans.json deleted file mode 100644 index 2f154e75e..000000000 --- a/src/ui/client/tests/bans.json +++ /dev/null @@ -1,669 +0,0 @@ -[ - { - "type": "void", - "widgets": [ - { - "type": "Button", - "data": { - "text": "bans_not_found" - } - } - ] - }, - { - "type": "card", - "containerColumns": { - "pc": 12, - "tablet": 12, - "mobile": 12 - }, - "widgets": [ - { - "type": "Title", - "data": { - "title": "bans_title" - } - }, - { - "type": "Table", - "data": { - "title": "bans_table_title", - "minWidth": "xl", - "header": [ - "bans_table_select", - "bans_table_ip", - "bans_table_reason", - "bans_table_ban_start", - "bans_table_ban_end", - "bans_table_remain", - "bans_table_term" - ], - "positions": [1, 1, 1, 3, 3, 2, 1], - "items": [ - [ - { - "select": false, - "type": "Fields", - "data": { - "setting": { - "columns": { - "pc": 12, - "tablet": 12, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "inpType": "checkbox", - "id": "select-ban-1", - "name": "select-ban-1", - "label": "select-ban-1", - "hideLabel": true - } - } - }, - { - "ip": "127.0.0.1", - "type": "Text", - "data": { - "text": "127.0.0.1" - } - }, - { - "reason": "ui", - "type": "Text", - "data": { - "text": "ui" - } - }, - { - "ban_start": "1719393920", - "type": "Fields", - "data": { - "setting": { - "columns": { - "pc": 12, - "tablet": 12, - "mobile": 12 - }, - "disabled": true, - "value": 1719393920, - "inpType": "datepicker", - "id": "datepicker-ban-ban-start-1", - "name": "datepicker-ban-ban-start-1", - "label": "datepicker-ban-ban-start-1", - "hideLabel": true - } - } - }, - { - "ban_end": "1719393920", - "type": "Fields", - "data": { - "setting": { - "columns": { - "pc": 12, - "tablet": 12, - "mobile": 12 - }, - "disabled": true, - "value": 1719393920, - "inpType": "datepicker", - "id": "datepicker-ban-ban-end-1", - "name": "datepicker-ban-ban-end-1", - "label": "datepicker-ban-ban-end-1", - "hideLabel": true - } - } - }, - { - "remain": "23 hours and 49 minutes", - "type": "Text", - "data": { - "text": "23 hours and 49 minutes" - } - }, - { - "term": "hour(s)", - "type": "Text", - "data": { - "text": "hour(s)" - } - } - ], - [ - { - "select": false, - "type": "Fields", - "data": { - "setting": { - "columns": { - "pc": 12, - "tablet": 12, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "inpType": "checkbox", - "id": "select-ban-2", - "name": "select-ban-2", - "label": "select-ban-2", - "hideLabel": true - } - } - }, - { - "ip": "127.0.0.1", - "type": "Text", - "data": { - "text": "127.0.0.1" - } - }, - { - "reason": "ui", - "type": "Text", - "data": { - "text": "ui" - } - }, - { - "ban_start": "1719393920", - "type": "Fields", - "data": { - "setting": { - "columns": { - "pc": 12, - "tablet": 12, - "mobile": 12 - }, - "disabled": true, - "value": 1719393920, - "inpType": "datepicker", - "id": "datepicker-ban-ban-start-2", - "name": "datepicker-ban-ban-start-2", - "label": "datepicker-ban-ban-start-2", - "hideLabel": true - } - } - }, - { - "ban_end": "1719393920", - "type": "Fields", - "data": { - "setting": { - "columns": { - "pc": 12, - "tablet": 12, - "mobile": 12 - }, - "disabled": true, - "value": 1719393920, - "inpType": "datepicker", - "id": "datepicker-ban-ban-end-2", - "name": "datepicker-ban-ban-end-2", - "label": "datepicker-ban-ban-end-2", - "hideLabel": true - } - } - }, - { - "remain": "23 hours and 49 minutes", - "type": "Text", - "data": { - "text": "23 hours and 49 minutes" - } - }, - { - "term": "day(s)", - "type": "Text", - "data": { - "text": "day(s)" - } - } - ], - [ - { - "select": false, - "type": "Fields", - "data": { - "setting": { - "columns": { - "pc": 12, - "tablet": 12, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "inpType": "checkbox", - "id": "select-ban-3", - "name": "select-ban-3", - "label": "select-ban-3", - "hideLabel": true - } - } - }, - { - "ip": "127.0.0.1", - "type": "Text", - "data": { - "text": "127.0.0.1" - } - }, - { - "reason": "cor", - "type": "Text", - "data": { - "text": "cor" - } - }, - { - "ban_start": "1719393920", - "type": "Fields", - "data": { - "setting": { - "columns": { - "pc": 12, - "tablet": 12, - "mobile": 12 - }, - "disabled": true, - "value": 1719393920, - "inpType": "datepicker", - "id": "datepicker-ban-ban-start-3", - "name": "datepicker-ban-ban-start-3", - "label": "datepicker-ban-ban-start-3", - "hideLabel": true - } - } - }, - { - "ban_end": "1719393920", - "type": "Fields", - "data": { - "setting": { - "columns": { - "pc": 12, - "tablet": 12, - "mobile": 12 - }, - "disabled": true, - "value": 1719393920, - "inpType": "datepicker", - "id": "datepicker-ban-ban-end-3", - "name": "datepicker-ban-ban-end-3", - "label": "datepicker-ban-ban-end-3", - "hideLabel": true - } - } - }, - { - "remain": "23 hours and 49 minutes", - "type": "Text", - "data": { - "text": "23 hours and 49 minutes" - } - }, - { - "term": "hour(s)", - "type": "Text", - "data": { - "text": "hour(s)" - } - } - ], - [ - { - "select": false, - "type": "Fields", - "data": { - "setting": { - "columns": { - "pc": 12, - "tablet": 12, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "inpType": "checkbox", - "id": "select-ban-4", - "name": "select-ban-4", - "label": "select-ban-4", - "hideLabel": true - } - } - }, - { - "ip": "127.0.0.1", - "type": "Text", - "data": { - "text": "127.0.0.1" - } - }, - { - "reason": "ui", - "type": "Text", - "data": { - "text": "ui" - } - }, - { - "ban_start": "1719393920", - "type": "Fields", - "data": { - "setting": { - "columns": { - "pc": 12, - "tablet": 12, - "mobile": 12 - }, - "disabled": true, - "value": 1719393920, - "inpType": "datepicker", - "id": "datepicker-ban-ban-start-4", - "name": "datepicker-ban-ban-start-4", - "label": "datepicker-ban-ban-start-4", - "hideLabel": true - } - } - }, - { - "ban_end": "1719393920", - "type": "Fields", - "data": { - "setting": { - "columns": { - "pc": 12, - "tablet": 12, - "mobile": 12 - }, - "disabled": true, - "value": 1719393920, - "inpType": "datepicker", - "id": "datepicker-ban-ban-end-4", - "name": "datepicker-ban-ban-end-4", - "label": "datepicker-ban-ban-end-4", - "hideLabel": true - } - } - }, - { - "remain": "23 hours and 49 minutes", - "type": "Text", - "data": { - "text": "23 hours and 49 minutes" - } - }, - { - "term": "hour(s)", - "type": "Text", - "data": { - "text": "hour(s)" - } - } - ], - [ - { - "select": false, - "type": "Fields", - "data": { - "setting": { - "columns": { - "pc": 12, - "tablet": 12, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "inpType": "checkbox", - "id": "select-ban-5", - "name": "select-ban-5", - "label": "select-ban-5", - "hideLabel": true - } - } - }, - { - "ip": "127.0.0.1", - "type": "Text", - "data": { - "text": "127.0.0.1" - } - }, - { - "reason": "ui", - "type": "Text", - "data": { - "text": "ui" - } - }, - { - "ban_start": "1719393920", - "type": "Fields", - "data": { - "setting": { - "columns": { - "pc": 12, - "tablet": 12, - "mobile": 12 - }, - "disabled": true, - "value": 1719393920, - "inpType": "datepicker", - "id": "datepicker-ban-ban-start-5", - "name": "datepicker-ban-ban-start-5", - "label": "datepicker-ban-ban-start-5", - "hideLabel": true - } - } - }, - { - "ban_end": "1719393920", - "type": "Fields", - "data": { - "setting": { - "columns": { - "pc": 12, - "tablet": 12, - "mobile": 12 - }, - "disabled": true, - "value": 1719393920, - "inpType": "datepicker", - "id": "datepicker-ban-ban-end-5", - "name": "datepicker-ban-ban-end-5", - "label": "datepicker-ban-ban-end-5", - "hideLabel": true - } - } - }, - { - "remain": "23 hours and 49 minutes", - "type": "Text", - "data": { - "text": "23 hours and 49 minutes" - } - }, - { - "term": "hour(s)", - "type": "Text", - "data": { - "text": "hour(s)" - } - } - ], - [ - { - "select": false, - "type": "Fields", - "data": { - "setting": { - "columns": { - "pc": 12, - "tablet": 12, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "inpType": "checkbox", - "id": "select-ban-6", - "name": "select-ban-6", - "label": "select-ban-6", - "hideLabel": true - } - } - }, - { - "ip": "127.0.0.1", - "type": "Text", - "data": { - "text": "127.0.0.1" - } - }, - { - "reason": "ui", - "type": "Text", - "data": { - "text": "ui" - } - }, - { - "ban_start": "1719393920", - "type": "Fields", - "data": { - "setting": { - "columns": { - "pc": 12, - "tablet": 12, - "mobile": 12 - }, - "disabled": true, - "value": 1719393920, - "inpType": "datepicker", - "id": "datepicker-ban-ban-start-6", - "name": "datepicker-ban-ban-start-6", - "label": "datepicker-ban-ban-start-6", - "hideLabel": true - } - } - }, - { - "ban_end": "1719393920", - "type": "Fields", - "data": { - "setting": { - "columns": { - "pc": 12, - "tablet": 12, - "mobile": 12 - }, - "disabled": true, - "value": 1719393920, - "inpType": "datepicker", - "id": "datepicker-ban-ban-end-6", - "name": "datepicker-ban-ban-end-6", - "label": "datepicker-ban-ban-end-6", - "hideLabel": true - } - } - }, - { - "remain": "23 hours and 49 minutes", - "type": "Text", - "data": { - "text": "23 hours and 49 minutes" - } - }, - { - "term": "hour(s)", - "type": "Text", - "data": { - "text": "hour(s)" - } - } - ] - ], - "filters": [ - { - "filter": "table", - "filterName": "keyword", - "type": "keyword", - "value": "", - "keys": ["ip", "ban_start", "ban_end"], - "field": { - "id": "bans-keyword", - "value": "", - "type": "text", - "name": "bans-keyword", - "label": "bans_search", - "placeholder": "inp_keyword", - "isClipboard": false, - "popovers": [ - { - "text": "bans_search_desc", - "iconName": "info" - } - ], - "columns": { - "pc": 3, - "tablet": 4, - "mobile": 12 - } - } - }, - { - "filter": "table", - "filterName": "reason", - "type": "select", - "value": "all", - "keys": ["reason"], - "field": { - "id": "bans-reason", - "value": "all", - "values": ["all", "ui", "cor"], - "name": "bans-reason", - "onlyDown": true, - "label": "bans_reason", - "popovers": [ - { - "text": "bans_reason_desc", - "iconName": "info" - } - ], - "columns": { - "pc": 3, - "tablet": 4, - "mobile": 12 - } - } - }, - { - "filter": "table", - "filterName": "term", - "type": "select", - "value": "all", - "keys": ["term"], - "field": { - "id": "bans-terms", - "value": "all", - "values": ["all", "hour(s)", "day(s)"], - "name": "bans-terms", - "onlyDown": true, - "label": "bans_terms", - "popovers": [ - { - "text": "bans_terms_desc", - "iconName": "info" - } - ], - "columns": { - "pc": 3, - "tablet": 4, - "mobile": 12 - } - } - } - ] - } - } - ] - } -] diff --git a/src/ui/client/tests/bans.py b/src/ui/client/tests/bans.py deleted file mode 100644 index 63538c388..000000000 --- a/src/ui/client/tests/bans.py +++ /dev/null @@ -1,296 +0,0 @@ -import json - -no_bans = [] - - -bans = [ - { - "reason": "ui", - "date": 1719393920, - "ip": "127.0.0.1", - "remain": "23 hours and 49 minutes", - "term": "hour(s)", - "ban_start": 1719393920, - "ban_end": 1719393920, - }, - { - "reason": "ui", - "date": 1719393920, - "ip": "127.0.0.1", - "remain": "23 hours and 49 minutes", - "term": "day(s)", - "ban_start": 1719393920, - "ban_end": 1719393920, - }, - { - "reason": "core", - "date": 1719393920, - "ip": "127.0.0.1", - "remain": "23 hours and 49 minutes", - "term": "hour(s)", - "ban_start": 1719393920, - "ban_end": 1719393920, - }, - { - "reason": "ui", - "date": 1719393920, - "ip": "127.0.0.1", - "remain": "23 hours and 49 minutes", - "term": "hour(s)", - "ban_start": 1719393920, - "ban_end": 1719393920, - }, - { - "reason": "ui", - "date": 1719393920, - "ip": "127.0.0.1", - "remain": "23 hours and 49 minutes", - "term": "hour(s)", - "ban_start": 1719393920, - "ban_end": 1719393920, - }, - { - "reason": "ui", - "date": 1719393920, - "ip": "127.0.0.1", - "remain": "23 hours and 49 minutes", - "term": "hour(s)", - "ban_start": 1719393920, - "ban_end": 1719393920, - }, -] -# Reorder bans dict -for ban in bans: - ban.pop("date") - ban["ip"] = ban.pop("ip") - ban["reason"] = ban.pop("reason") - ban["ban_start"] = ban.pop("ban_start") - ban["ban_end"] = ban.pop("ban_end") - ban["remain"] = ban.pop("remain") - ban["term"] = ban.pop("term") - - -def get_bans_filter(bans): - - if len(bans) <= 5: - return [] - - total_reasons = ["all"] - total_terms = ["all"] - - for ban in bans: - if ban.get("reason") and ban.get("reason") not in total_reasons: - total_reasons.append(ban.get("reason")) - - if ban.get("term") and ban.get("term") not in total_terms: - total_terms.append(ban.get("term")) - - filters = [] - - filters.append( - { - "filter": "table", - "filterName": "keyword", - "type": "keyword", - "value": "", - "keys": ["ip", "ban_start", "ban_end"], - "field": { - "id": "bans-keyword", - "value": "", - "type": "text", - "name": "bans-keyword", - "label": "bans_search", - "placeholder": "inp_keyword", - "isClipboard": False, - "popovers": [ - { - "text": "bans_search_desc", - "iconName": "info", - }, - ], - "columns": {"pc": 3, "tablet": 4, "mobile": 12}, - }, - }, - ) - - if len(total_reasons) > 2: - filters.append( - { - "filter": "table", - "filterName": "reason", - "type": "select", - "value": "all", - "keys": ["reason"], - "field": { - "id": "bans-reason", - "value": "all", - "values": total_reasons, - "name": "bans-reason", - "onlyDown": True, - "label": "bans_reason", - "popovers": [ - { - "text": "bans_reason_desc", - "iconName": "info", - }, - ], - "columns": {"pc": 3, "tablet": 4, "mobile": 12}, - }, - }, - ) - - if len(total_terms) > 2: - filters.append( - { - "filter": "table", - "filterName": "term", - "type": "select", - "value": "all", - "keys": ["term"], - "field": { - "id": "bans-terms", - "value": "all", - "values": total_terms, - "name": "bans-terms", - "onlyDown": True, - "label": "bans_terms", - "popovers": [ - { - "text": "bans_terms_desc", - "iconName": "info", - }, - ], - "columns": {"pc": 3, "tablet": 4, "mobile": 12}, - }, - }, - ) - return filters - - -def get_bans_list(bans): - data = [] - # loop on each dict - id = 0 - for ban in bans: - id += 1 - item = [] - item.append( - { - "select": False, - "type": "Fields", - "data": { - "setting": { - "columns": {"pc": 12, "tablet": 12, "mobile": 12}, - "disabled": False, - "value": "no", - "inpType": "checkbox", - "id": f"select-ban-{id}", - "name": f"select-ban-{id}", - "label": f"select-ban-{id}", - "hideLabel": True, - }, - }, - } - ) - for k, v in ban.items(): - - if k in ("date", "ban_start", "ban_end"): - item.append( - { - k: json.dumps(v) if isinstance(v, dict) else str(v), - "type": "Fields", - "data": { - "setting": { - "columns": {"pc": 12, "tablet": 12, "mobile": 12}, - "disabled": True, - "value": v, - "inpType": "datepicker", - "id": f"datepicker-ban-{k}-{id}".replace("_", "-"), - "name": f"datepicker-ban-{k}-{id}".replace("_", "-"), - "label": f"datepicker-ban-{k}-{id}".replace("_", "-"), - "hideLabel": True, - }, - }, - } - ) - continue - - item.append( - { - k: json.dumps(v) if isinstance(v, dict) else str(v), - "type": "Text", - "data": { - "text": json.dumps(v) if isinstance(v, dict) else str(v), - }, - } - ) - - data.append(item) - - return data - - -def bans_builder(bans): - - builder = [ - { - "type": "void", - "widgets": [{"type": "Button", "data": {"text": "bans_not_found"}}], - }, - ] - - if not bans: - builder.append( - { - "type": "void", - "widgets": [ - {"type": "MessageUnmatch", "data": {"text": "bans_not_found"}} - ], - } - ) - return builder - - filters = get_bans_filter(bans) - bans_list = get_bans_list(bans) - - bans_table = { - "type": "card", - "containerColumns": {"pc": 12, "tablet": 12, "mobile": 12}, - "widgets": [ - { - "type": "Title", - "data": {"title": "bans_title"}, - }, - { - "type": "Table", - "data": { - "title": "bans_table_title", - "minWidth": "xl", - "header": [ - "bans_table_select", - "bans_table_ip", - "bans_table_reason", - "bans_table_ban_start", - "bans_table_ban_end", - "bans_table_remain", - "bans_table_term", - ], - "positions": [1, 1, 1, 3, 3, 2, 1], - "items": bans_list, - "filters": filters, - }, - }, - ], - } - - builder.append(bans_table) - - return builder - - -output = bans_builder(bans) -# output = bans_builder(no_bans) - -# store on a file -with open("bans.json", "w") as f: - json.dump(output, f, indent=4) diff --git a/src/ui/client/tests/builder/advanced_mode.py b/src/ui/client/tests/builder/advanced_mode.py deleted file mode 100644 index 115a5d828..000000000 --- a/src/ui/client/tests/builder/advanced_mode.py +++ /dev/null @@ -1,38 +0,0 @@ -from .utils.form import get_forms, get_service_settings - - -def advanced_mode_builder(templates: list[dict], plugins: list, global_config: dict, total_config: dict, service_name: str, is_new: bool = False) -> str: - """Render forms with global config data. - ATM we don't need templates but we need to pass at least one to the function (it will simply not override anything). - """ - settings = get_service_settings(service_name, global_config, total_config) - - builder = [ - { - "type": "card", - "containerColumns": {"pc": 12, "tablet": 12, "mobile": 12}, - "widgets": [ - { - "type": "Title", - "data": { - "title": service_name, - "type": "container", - "lowercase": True, - }, - }, - { - "type": "Subtitle", - "data": {"subtitle": "services_manage_subtitle", "type": "container"}, - }, - { - "type": "Templates", - "data": { - "templates": get_forms(templates, plugins, settings, ("advanced",), is_new, True), - "operation": "new" if is_new else "edit", - "oldServerName": service_name if service_name else "", - }, - }, - ], - } - ] - return builder diff --git a/src/ui/client/tests/builder/easy_mode.py b/src/ui/client/tests/builder/easy_mode.py deleted file mode 100644 index 66adeaa3d..000000000 --- a/src/ui/client/tests/builder/easy_mode.py +++ /dev/null @@ -1,39 +0,0 @@ -from .utils.form import get_forms, get_service_settings - - -def easy_mode_builder(templates: list[dict], plugins: list, global_config: dict, total_config: dict, service_name: str, is_new: bool = False) -> str: - """Render forms with global config data. - ATM we don't need templates but we need to pass at least one to the function (it will simply not override anything). - """ - - # We need - settings = get_service_settings(service_name, global_config, total_config) - builder = [ - { - "type": "card", - "containerColumns": {"pc": 12, "tablet": 12, "mobile": 12}, - "widgets": [ - { - "type": "Title", - "data": { - "title": service_name, - "type": "container", - "lowercase": True, - }, - }, - { - "type": "Subtitle", - "data": {"subtitle": "services_manage_subtitle", "type": "container"}, - }, - { - "type": "Templates", - "data": { - "templates": get_forms(templates, plugins, settings, ("easy",), is_new, True), - "operation": "new" if is_new else "edit", - "oldServerName": service_name if service_name else "", - }, - }, - ], - } - ] - return builder diff --git a/src/ui/client/tests/builder/global_config.py b/src/ui/client/tests/builder/global_config.py deleted file mode 100644 index 039408e94..000000000 --- a/src/ui/client/tests/builder/global_config.py +++ /dev/null @@ -1,31 +0,0 @@ -from .utils.form import get_forms - - -def global_config_builder(templates: list[dict], plugins: list, settings: dict) -> str: - """Render forms with global config data. - ATM we don't need templates but we need to pass at least one to the function (it will simply not override anything). - """ - - builder = [ - { - "type": "card", - "containerColumns": {"pc": 12, "tablet": 12, "mobile": 12}, - "widgets": [ - { - "type": "Title", - "data": {"title": "global_config_title", "type": "container"}, - }, - { - "type": "Subtitle", - "data": {"subtitle": "global_config_subtitle", "type": "container"}, - }, - { - "type": "Templates", - "data": { - "templates": get_forms(templates, plugins, settings, ("advanced", "raw")), - }, - }, - ], - } - ] - return builder diff --git a/src/ui/client/tests/builder/home.py b/src/ui/client/tests/builder/home.py deleted file mode 100644 index d310d90ff..000000000 --- a/src/ui/client/tests/builder/home.py +++ /dev/null @@ -1,84 +0,0 @@ -from .utils.widgets import stat_widget - - -def home_builder(data: dict) -> str: - """ - It returns the needed format from data to render the home page in JSON format for the Vue.js builder - """ - version_card = stat_widget( - link="https://panel.bunkerweb.io/?utm_campaign=self&utm_source=ui#pro", - containerColums={"pc": 4, "tablet": 6, "mobile": 12}, - title="home_version", - subtitle=( - "home_all_features_available" - if data.get("is_pro_version") - else ( - "home_awaiting_compliance" - if data.get("pro_status") == "active" and data.get("pro_overlapped") - else ( - "home_renew_license" - if data.get("pro_status") == "expired" - else "home_talk_to_team" if data.get("pro_status") == "suspended" else "home_upgrade_to_pro" - ) - ) - ), - subtitle_color="success" if data.get("is_pro_version") else "warning", - stat=( - "home_pro" - if data.get("is_pro_version") - else ( - "home_pro_locked" - if data.get("pro_status") == "active" and data.get("pro_overlapped") - else "home_expired" if data.get("pro_status") == "expired" else "home_suspended" if data.get("pro_status") == "suspended" else "home_free" - ) - ), - icon_name="crown" if data.get("is_pro_version") else "key", - ) - - version_num_card = stat_widget( - link="https://github.com/bunkerity/bunkerweb", - containerColums={"pc": 4, "tablet": 6, "mobile": 12}, - title="home_version_number", - subtitle=( - "home_couldnt_find_remote" - if not data.get("remote_version") - else "home_latest_version" if data.get("remote_version") and data.get("check_version") else "home_update_available" - ), - subtitle_color=("error" if not data.get("remote_version") else "success" if data.get("remote_version") and data.get("check_version") else "warning"), - stat=data.get("version"), - icon_name="wire", - ) - - instances_card = stat_widget( - link="instances", - containerColums={"pc": 4, "tablet": 6, "mobile": 12}, - title="home_instances", - subtitle="home_total_number", - subtitle_color="info", - stat=data.get("instances_number"), - icon_name="box", - ) - - services_card = stat_widget( - link="services", - containerColums={"pc": 4, "tablet": 6, "mobile": 12}, - title="home_services", - subtitle="home_all_methods_included", - subtitle_color="info", - stat=data.get("services_number"), - icon_name="disk", - ) - - plugins_card = stat_widget( - link="plugins", - containerColums={"pc": 4, "tablet": 6, "mobile": 12}, - title="home_plugins", - subtitle="home_errors_found" if data.get("plugins_errors") > 0 else "home_no_error", - subtitle_color="error" if data.get("plugins_errors") > 0 else "success", - stat=data.get("plugins_number"), - icon_name="puzzle", - ) - - builder = [version_card, version_num_card, instances_card, services_card, plugins_card] - - return builder diff --git a/src/ui/client/tests/builder/instances.py b/src/ui/client/tests/builder/instances.py deleted file mode 100644 index c6706f232..000000000 --- a/src/ui/client/tests/builder/instances.py +++ /dev/null @@ -1,42 +0,0 @@ -from .utils.widgets import instance_widget - - -def instances_builder(instances) -> str: - """ - It returns the needed format from data to render the instances page in JSON format for the Vue.js builder - """ - builder = [] - - for instance in instances: - # setup actions buttons - actions = ["reload", "stop"] if instance.status == "up" else ["start"] - - buttons = [ - { - "attrs": { - "data-submit-form": f"""{{"INSTANCE_ID" : "{instance.hostname}", "operation" : "{action}" }}""", - }, - "text": f"action_{action}", - "color": "success" if action == "start" else "error" if action == "stop" else "warning", - } - for action in actions - ] - - instance = instance_widget( - containerColumns={"pc": 6, "tablet": 6, "mobile": 12}, - pairs=[ - {"key": "instances_name", "value": instance.name}, - {"key": "instances_hostname", "value": instance.hostname}, - {"key": "instances_type", "value": instance.type}, - {"key": "instances_method", "value": instance.method}, - {"key": "instances_creation_date", "value": instance.creation_date.strftime("%d-%m-%Y %H:%M:%S")}, - {"key": "instances_last_seen", "value": instance.last_seen.strftime("%d-%m-%Y %H:%M:%S")}, - ], - status="success" if instance.status == "up" else "error", - title=instance.hostname, - buttons=buttons, - ) - - builder.append(instance) - - return builder diff --git a/src/ui/client/tests/builder/jobs.py b/src/ui/client/tests/builder/jobs.py deleted file mode 100644 index 0ebbbd7e5..000000000 --- a/src/ui/client/tests/builder/jobs.py +++ /dev/null @@ -1,290 +0,0 @@ -from .utils.widgets import title_widget, table_widget - - -def jobs_builder(jobs): - - jobs_list = get_jobs_list(jobs) - - intervals = ["all"] - - # loop on each job - for job in jobs_list: - # loop on each item - for item in job: - # get the interval if not already in intervals - if item.get("every") and item.get("every") not in intervals: - intervals.append(item.get("every")) - - builder = [ - { - "type": "card", - "containerColumns": {"pc": 12, "tablet": 12, "mobile": 12}, - "widgets": [ - title_widget("jobs_title"), - table_widget( - positions=[3, 2, 1, 1, 1, 1, 3], - header=[ - "jobs_table_name", - "jobs_table_plugin_id", - "jobs_table_interval", - "jobs_table_reload", - "jobs_table_success", - "jobs_table_history", - "jobs_table_cache_downloadable", - ], - items=jobs_list, - filters=[ - { - "filter": "table", - "filterName": "keyword", - "type": "keyword", - "value": "", - "keys": ["name", "plugin_id"], - "field": { - "id": "jobs-keyword", - "value": "", - "type": "text", - "name": "jobs-keyword", - "label": "jobs_search", - "placeholder": "inp_keyword", - "isClipboard": False, - "popovers": [ - { - "text": "jobs_search_desc", - "iconName": "info", - }, - ], - "columns": {"pc": 3, "tablet": 4, "mobile": 12}, - }, - }, - { - "filter": "table", - "filterName": "every", - "type": "select", - "value": "all", - "keys": ["every"], - "field": { - "id": "jobs-every", - "value": "all", - "values": intervals, - "name": "jobs-every", - "onlyDown": True, - "label": "jobs_interval", - "popovers": [ - { - "text": "jobs_interval_desc", - "iconName": "info", - }, - ], - "columns": {"pc": 3, "tablet": 4, "mobile": 12}, - }, - }, - { - "filter": "table", - "filterName": "reload", - "type": "select", - "value": "all", - "keys": ["reload"], - "field": { - "id": "jobs-last-run", - "value": "all", - "values": ["all", "success", "failed"], - "name": "jobs-last-run", - "onlyDown": True, - "label": "jobs_reload", - "popovers": [ - { - "text": "jobs_reload_desc", - "iconName": "info", - }, - ], - "columns": {"pc": 3, "tablet": 4, "mobile": 12}, - }, - }, - { - "filter": "table", - "filterName": "success", - "type": "select", - "value": "all", - "keys": ["success"], - "field": { - "id": "jobs-success", - "value": "all", - "values": ["all", "success", "failed"], - "name": "jobs-success", - "onlyDown": True, - "label": "jobs_success", - "popovers": [ - { - "text": "jobs_success_desc", - "iconName": "info", - }, - ], - "columns": {"pc": 3, "tablet": 4, "mobile": 12}, - }, - }, - ], - minWidth="lg", - title="jobs_table_title", - ), - ], - } - ] - - return builder - - -def get_jobs_list(jobs): - data = [] - # loop on each dict - for key, value in jobs.items(): - item = [] - item.append({"name": key, "type": "Text", "data": {"text": key}}) - # loop on each value - for k, v in value.items(): - # override widget type for some keys - if k in ("reload", "history"): - is_success = v if k == "reload" else v[0].get("success") - item.append( - { - k: "success" if is_success else "failed", - "type": "Icons", - "data": { - "iconName": "check" if is_success else "cross", - }, - } - ) - - if k not in ("history"): - continue - - if k in ("plugin_id", "every"): - item.append({k: v, "type": "Text", "data": {"text": v}}) - continue - - if k in ("history"): - items = [] - for hist in v: - items.append( - [ - { - "type": "Text", - "data": { - "text": hist["start_date"], - }, - }, - { - "type": "Text", - "data": { - "text": hist["end_date"], - }, - }, - { - "type": "Icons", - "data": { - "iconName": "check" if hist["success"] else "cross", - }, - }, - ] - ) - - item.append( - { - "type": "Button", - "data": { - "id": f"open-modal-history-{k}", - "text": "jobs_history", - "hideText": True, - "color": "blue", - "size": "normal", - "iconName": "document", - "iconColor": "white", - "modal": { - "widgets": [ - {"type": "Title", "data": {"title": key}}, - {"type": "Subtitle", "data": {"subtitle": "jobs_history_subtitle"}}, - { - "type": "Table", - "data": { - "title": "jobs_history_table_title", - "minWidth": "", - "header": [ - "jobs_table_start_run", - "jobs_table_end_run", - "jobs_table_success", - ], - "positions": [5, 5, 2], - "items": items, - }, - }, - { - "type": "ButtonGroup", - "data": { - "buttons": [ - { - "id": f"close-history-{k}", - "text": "action_close", - "color": "close", - "size": "normal", - "attrs": {"data-close-modal": ""}, - } - ] - }, - }, - ] - }, - }, - } - ) - - if k in ("cache") and len(v) <= 0: - item.append({k: v, "type": "Text", "data": {"text": ""}}) - continue - - if k in ("cache") and len(v) > 0: - files = [] - # loop on each cache item - for cache in v: - file_name = f"{cache['file_name']} [{cache['service_id']}]" if cache["service_id"] else f"{cache['file_name']}" - files.append(file_name) - - item.append( - { - k: " ".join(files), - "type": "Fields", - "data": { - "setting": { - "attrs": { - "data-plugin-id": value.get("plugin_id", ""), - "data-job-name": key, - }, - "id": f"{key}_cache", - "label": f"{key}_cache", - "hideLabel": True, - "inpType": "select", - "name": f"{key}_cache", - "value": "download file", - "values": files, - "columns": { - "pc": 12, - "tablet": 12, - "mobile": 12, - }, - "overflowAttrEl": "data-table-body", - "containerClass": "table download-cache-file", - "maxBtnChars": 16, - "popovers": [ - { - "iconName": "info", - "text": "jobs_download_cache_file", - }, - ], - } - }, - } - ) - continue - - data.append(item) - - return data diff --git a/src/ui/client/tests/builder/logs.py b/src/ui/client/tests/builder/logs.py deleted file mode 100644 index 94297bdee..000000000 --- a/src/ui/client/tests/builder/logs.py +++ /dev/null @@ -1,83 +0,0 @@ -from .utils.widgets import title_widget - - -def logs_builder(files: list[str] = [], current_file: str = "", raw_data: str = "") -> str: - - if not files: - builder = [ - { - "type": "void", - "widgets": [{"type": "MessageUnmatch", "data": {"text": "logs_no_files_found"}}], - } - ] - return builder - - file_select = { - "type": "Fields", - "data": { - "setting": { - "id": "logs-select-file", - "label": "logs_log_file", - "inpType": "select", - "name": "logs-select-file", - "onlyDown": True, - "value": current_file or "Select a file", - "values": files, - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12, - }, - "maxBtnChars": 20, - "attrs": { - "data-log": "true", - }, - "popovers": [ - { - "iconName": "info", - "text": "logs_select_file_info", - }, - ], - } - }, - } - - if not raw_data: - builder = [ - { - "type": "card", - "containerColumns": {"pc": 12, "tablet": 12, "mobile": 12}, - "widgets": [title_widget("logs_title"), file_select, {"type": "MessageUnmatch", "data": {"text": "logs_not_selected_or_not_found"}}], - } - ] - return builder - - editor = { - "type": "Fields", - "data": { - "setting": { - "containerClass": "mt-4", - "id": "logs-file-content", - "label": "logs_file_content", - "inpType": "editor", - "name": "logs-file-content", - "value": raw_data, - "columns": { - "pc": 12, - "tablet": 12, - "mobile": 12, - }, - "editorClass" : "min-h-[500px]", - } - }, - } - - builder = [ - { - "type": "card", - "containerColumns": {"pc": 12, "tablet": 12, "mobile": 12}, - "widgets": [title_widget("logs_title"), file_select, editor], - } - ] - - return builder diff --git a/src/ui/client/tests/builder/raw_mode.py b/src/ui/client/tests/builder/raw_mode.py deleted file mode 100644 index 866360f48..000000000 --- a/src/ui/client/tests/builder/raw_mode.py +++ /dev/null @@ -1,40 +0,0 @@ -from .utils.form import get_forms, get_service_settings - - -def raw_mode_builder(templates: list[dict], plugins: list, global_config: dict, total_config: dict, service_name: str, is_new: bool = False) -> str: - """Render forms with global config data. - ATM we don't need templates but we need to pass at least one to the function (it will simply not override anything). - """ - - # We need - settings = get_service_settings(service_name, global_config, total_config) - - builder = [ - { - "type": "card", - "containerColumns": {"pc": 12, "tablet": 12, "mobile": 12}, - "widgets": [ - { - "type": "Title", - "data": { - "title": service_name, - "type": "container", - "lowercase": True, - }, - }, - { - "type": "Subtitle", - "data": {"subtitle": "services_manage_subtitle", "type": "container"}, - }, - { - "type": "Templates", - "data": { - "templates": get_forms(templates, plugins, settings, ("raw",), is_new, True), - "operation": "new" if is_new else "edit", - "oldServerName": service_name if service_name else "", - }, - }, - ], - } - ] - return builder diff --git a/src/ui/client/tests/builder/services.py b/src/ui/client/tests/builder/services.py deleted file mode 100644 index c30d88f90..000000000 --- a/src/ui/client/tests/builder/services.py +++ /dev/null @@ -1,379 +0,0 @@ -from typing import Union - -from .utils.widgets import title_widget, table_widget - - -def services_builder(services): - # get method for each service["SERVER_NAME"]["method"] - methods = list(set([service["SERVER_NAME"]["method"] for service in services])) - - services_list = get_services_list(services) - - builder = [ - { - "type": "card", - "containerColumns": {"pc": 12, "tablet": 12, "mobile": 12}, - "widgets": [ - title_widget("services_title"), - { - "type": "Button", - "data": { - "id": "services-new", - "text": "services_new", - "color": "success", - "size": "normal", - "iconName": "plus", - "iconColor": "white", - "modal": services_action(server_name="new", operation="new", title="services_new_title", subtitle="services_new_subtitle"), - "containerClass": "col-span-12 flex justify-center", - }, - }, - table_widget( - positions=[4, 4, 4], - header=[ - "services_table_name", - "services_table_method", - "services_table_actions", - ], - items=services_list, - filters=[ - { - "filter": "table", - "filterName": "keyword", - "type": "keyword", - "value": "", - "keys": ["name"], - "field": { - "id": "services-keyword", - "value": "", - "type": "text", - "name": "services-keyword", - "label": "services_search", - "placeholder": "inp_keyword", - "isClipboard": False, - "popovers": [ - { - "text": "services_search_desc", - "iconName": "info", - }, - ], - "columns": {"pc": 3, "tablet": 4, "mobile": 12}, - }, - }, - { - "filter": "table", - "filterName": "method", - "type": "select", - "value": "all", - "keys": ["method"], - "field": { - "id": "services-methods", - "value": "all", - "values": methods, - "name": "services-methods", - "onlyDown": True, - "label": "services_methods", - "popovers": [ - { - "text": "services_methods_desc", - "iconName": "info", - }, - ], - "columns": {"pc": 3, "tablet": 4, "mobile": 12}, - }, - }, - { - "filter": "table", - "filterName": "draft", - "type": "select", - "value": "all", - "keys": ["draft"], - "field": { - "id": "services-draft", - "value": "all", - "values": ["all", "online", "draft"], - "name": "services-draft", - "onlyDown": True, - "label": "services_draft", - "popovers": [ - { - "text": "services_draft_desc", - "iconName": "info", - }, - ], - "columns": {"pc": 3, "tablet": 4, "mobile": 12}, - }, - }, - ], - minWidth="md", - title="services_table_title", - ), - ], - }, - ] - - return builder - - -def services_settings(settings: dict) -> dict: - # deep copy settings dict - settings = settings.copy() - # remove "SERVER_NAME" and "IS_DRAFT" key - settings.pop("SERVER_NAME", None) - settings.pop("IS_DRAFT", None) - # Create table with settings remaining keys - settings_table_items = [] - for key, value in settings.items(): - format_key = key.replace("USE_", "").replace("_", " ") - settings_table_items.append( - [ - { - "type": "Text", - "data": {"text": format_key}, - }, - { - "type": "Icons", - "data": { - "iconName": "check" if value.get("value") == "yes" else "cross", - }, - }, - ] - ) - - table = table_widget( - positions=[8, 4], - header=["services_settings_table_name", "services_settings_table_status"], - items=settings_table_items, - filters=[], - minWidth="", - title="services_settings_table_title", - ) - - return table - - -def services_action( - server_name: str = "", - operation: str = "", - title: str = "", - subtitle: str = "", - additional: str = "", - is_draft: Union[bool, None] = None, - service: dict = None, -) -> dict: - - buttons = [ - { - "id": f"close-service-btn-{server_name}", - "text": "action_close", - "disabled": False, - "color": "close", - "size": "normal", - "attrs": {"data-close-modal": ""}, - }, - ] - - if operation == "delete": - buttons.append( - { - "id": f"{operation}-service-btn-{server_name}", - "text": f"action_{operation}", - "disabled": False, - "color": "delete", - "size": "normal", - "attrs": { - "data-submit-form": f"""{{"SERVER_NAME" : "{server_name}", "operation" : "{operation}" }}""", - }, - }, - ) - - if operation == "draft": - draft_value = "yes" if is_draft else "no" - buttons.append( - { - "id": f"{operation}-service-btn-{server_name}", - "text": "action_switch", - "disabled": False, - "color": "success", - "size": "normal", - "attrs": { - "data-submit-form": f"""{{"SERVER_NAME" : "{server_name}", "OLD_SERVER_NAME" : "{server_name}", "operation" : "edit", "IS_DRAFT" : "{draft_value}" }}""", - }, - }, - ) - - content = [ - { - "type": "Title", - "data": { - "title": title, - }, - }, - ] - - if subtitle: - content.append( - { - "type": "Text", - "data": { - "text": subtitle, - }, - }, - ) - - if additional: - content.append( - { - "type": "Text", - "data": { - "bold": True, - "text": additional, - }, - } - ) - - if operation == "plugins": - settings = services_settings(service) - content.append(settings) - - if operation == "delete": - content.append( - { - "type": "Text", - "data": { - "text": "", - "bold": True, - "text": server_name, - }, - } - ) - - if operation == "edit" or operation == "new": - modes = ("easy", "advanced", "raw") - mode_buttons = [] - for mode in modes: - mode_buttons.append( - { - "id": f"{operation}-service-btn-{server_name}", - "text": f"services_mode_{mode}", - "disabled": False, - "color": "info", - "size": "normal", - "attrs": { - "role": "link", - "data-link": f"modes?service_name={server_name}&mode={mode}" if operation != "new" else f"modes?mode={mode}", - }, - }, - ) - - content.append( - { - "type": "ButtonGroup", - "data": {"buttons": mode_buttons}, - } - ) - - content.append( - { - "type": "ButtonGroup", - "data": {"buttons": buttons}, - }, - ) - - modal = { - "widgets": content, - } - - return modal - - -def get_services_list(services): - data = [] - for index, service in enumerate(services): - server_name = service["SERVER_NAME"]["value"] - server_method = service["SERVER_NAME"]["method"] - is_draft = True if service["IS_DRAFT"]["value"] == "yes" else False - is_deletable = False if server_method in ("autoconf", "scheduler") else True - - item = [] - # Get name - item.append({"name": server_name, "type": "Text", "data": {"text": server_name}}) - item.append({"method": server_method, "type": "Text", "data": {"text": server_method}}) - item.append( - { - "type": "ButtonGroup", - "data": { - "buttons": [ - { - "id": f"open-modal-plugins-{index}", - "text": "plugins", - "hideText": True, - "color": "success", - "size": "normal", - "iconName": "eye", - "iconColor": "white", - "modal": services_action( - server_name=server_name, - operation="plugins", - title="services_plugins_title", - subtitle="", - service=service, - ), - }, - { - "attrs": {"data-server-name": server_name}, - "id": f"open-modal-manage-{index}", - "text": "manage", - "hideText": True, - "color": "edit", - "size": "normal", - "iconName": "pen", - "iconColor": "white", - "modal": services_action( - server_name=server_name, - operation="edit", - title="services_edit_title", - subtitle="services_edit_subtitle", - additional=server_name, - ), - }, - { - "attrs": {"data-server-name": server_name, "data-is-draft": "yes" if is_draft else "no"}, - "id": f"open-modal-draft-{index}", - "text": "draft" if is_draft else "online", - "hideText": True, - "color": "blue", - "size": "normal", - "iconName": "document" if is_draft else "globe", - "iconColor": "white", - "modal": services_action( - server_name=server_name, - operation="draft", - title="services_draft_title", - subtitle="services_draft_subtitle" if is_draft else "services_online_subtitle", - additional="services_draft_switch_subtitle" if is_draft else "services_online_switch_subtitle", - is_draft=is_draft, - ), - }, - { - "attrs": {"data-server-name": server_name}, - "id": f"open-modal-delete-{index}", - "text": "delete", - "disabled": not is_deletable, - "hideText": True, - "color": "red", - "size": "normal", - "iconName": "trash", - "iconColor": "white", - "modal": services_action( - server_name=server_name, operation="delete", title="services_delete_title", subtitle="services_delete_subtitle" - ), - }, - ] - }, - } - ) - - data.append(item) - - return data diff --git a/src/ui/client/tests/builder/utils/form.py b/src/ui/client/tests/builder/utils/form.py deleted file mode 100644 index 297ab7597..000000000 --- a/src/ui/client/tests/builder/utils/form.py +++ /dev/null @@ -1,494 +0,0 @@ -import copy -from typing import Union - - -def get_setting_data(template_settings: dict, settings: dict, setting: str, value: dict, is_multiple_setting: bool = False, is_new: bool = False) -> tuple: - template_value = template_settings.get(setting, None) - current_value = settings[setting].get("value", None) if setting in settings else None - default_value = value.get("default") - is_disabled_method = ( - True if settings.get(setting, {}).get("method", "ui") not in ("ui", "default", "manual") and not is_new and not is_multiple_setting else False - ) - is_current_from_template = True if settings.get(setting, {}).get("template", None) is not None and template_value is not None else False - is_current_default = current_value is not None and current_value == default_value - setting_value = current_value if current_value is not None and not is_new and not is_multiple_setting else default_value - return template_value, current_value, default_value, is_disabled_method, is_current_from_template, is_current_default, setting_value - - -def get_service_settings(service_name: str, global_config: dict, total_config: dict) -> dict: - """ - total_config is a dict that contains global settings and services settings (format SERVICE_NAME_SETTING - www.example.com_USE_ANTIBOT for example -). - We will only keep settings that are related to the service_name (with prefix SERVICE_NAME_). - Then we will loop on global key and override value from global config by service config if exists. - """ - - # Get service settings - service_settings = {} - for key, value in total_config.items(): - if not key.startswith(f"{service_name}_"): - continue - - service_settings[key.replace(f"{service_name}_", "")] = value - - # Loop on global settings to override by service settings - for key, value in service_settings.items(): - global_config[key] = value - - return global_config - - -def get_plugins_multisite(plugins: list) -> list: - # loop on plugins with list index - plugins_multisite = [] - for index, plugin in enumerate(plugins): - multisite_settings = {} - # loop on settings - for setting, value in plugin.get("settings").items(): - # check if setting is multisite - if value.get("context") != "multisite": - continue - # add multisite key to plugin - multisite_settings[setting] = value - - # add multisite settings to plugin - if len(multisite_settings): - plugin_multisite = copy.deepcopy(plugin) - plugin_multisite["settings"] = multisite_settings - plugins_multisite.append(plugin_multisite) - - return plugins_multisite - - -def get_forms( - templates_ui: list = [], - plugins: list = [], - settings: dict = {}, - render_forms: tuple = ("advanced", "easy", "raw"), - is_new: bool = False, - only_multisite: bool = False, -) -> dict: - """ - Will generate every needed form using templates, plugins and settings. - We will run on each plugins, set template value if one, and override by the custom settings value if exists. - We will format to fit each form type (easy, advanced, raw) in case - """ - # Copy of the plugins, and get the plugins by context if needed - # In services page, we want only multisite settings, but in global config we want both - plugins_base = get_plugins_multisite(plugins) if only_multisite else plugins - - # This template will be used to show default value or value if exists - templates = [ - { - "name": "default", - "steps": [], - "configs": {}, - "settings": {}, - } - ] - - for key, value in templates_ui.items(): - value["label"] = value["name"] - value["name"] = key - templates.append(value) - - # Update SERVER_NAME to be empty if new - if is_new and "SERVER_NAME" in settings: - settings["SERVER_NAME"]["value"] = "" - - if is_new and not "SERVER_NAME" in settings: - settings["SERVER_NAME"] = {"value": "", "method": "ui", "global": False} - - forms = {} - for form in render_forms: - forms[form] = {} - - for template in templates: - if "advanced" in forms: - forms["advanced"][template.get("name")] = set_advanced(template, plugins_base, settings, is_new) - - if "raw" in forms: - forms["raw"][template.get("name")] = set_raw(template, plugins_base, settings, is_new) - - if "easy" in forms: - forms["easy"][template.get("name")] = set_easy(template, plugins_base, settings, is_new) - - return forms - - -def set_easy(template: list, plugins_base: list, settings: dict, is_new: bool) -> dict: - """ - Prepare the easy form based on the template and plugins data. - We need to loop on each steps and prepare settings and configs for each step. - """ - - template_settings = template.get("settings") - plugins = copy.deepcopy(plugins_base) - # Copy of the plugins base data - plugins = copy.deepcopy(plugins_base) - # Update settings with global config data - for plugin in plugins: - loop_id = 0 - total_settings = len(plugin.get("settings")) - for setting, value in plugin.get("settings").items(): - loop_id += 1 - value = format_setting(setting, value, total_settings, loop_id, template_settings, settings, is_new) - - set_multiples(template, plugins, settings) - - steps = template.get("steps") - for step in steps: - step_settings = step.get("settings", {}) - - for plugin in plugins: - step_settings_output = {} - for setting, value in plugin.get("settings").items(): - if setting not in step_settings: - continue - - step_settings_output[setting] = value - - # Case at least one key in step settings, we can add the plugin settings to the step - if len(step_settings_output) and not "plugins" in step: - step["plugins"] = [] - - if len(step_settings_output): - step_plugin = copy.deepcopy(plugin) - step_plugin["settings"] = step_settings_output - step["plugins"].append(step_plugin) - - # remove settings key form step - step.pop("settings", None) - return steps - - -def set_raw(template: list, plugins_base: list, settings: dict, is_new: bool = False) -> dict: - """ - Set the raw form based on the template and plugins data. - It consists of keeping only the value or default value for each plugin settings. - """ - template_settings = template.get("settings") - raw_settings = {} - # Copy of the plugins base - plugins = copy.deepcopy(plugins_base) - # Update settings with global config data - for plugin in plugins: - for setting, value in plugin.get("settings").items(): - - is_multiple_setting = "multiple" in value - - # By default, we will loop on one setting (not multiple) - total_settings = {setting: value} - - # Case multiple, retrieve all settings that start with setting name - if is_multiple_setting: - # get all settings that start with setting name - total_settings = {k: v for k, v in settings.items() if k.startswith(f"{setting}")} - - # Loop in a same way it is a multiple or regular setting - for mult_setting, mult_value in total_settings.items(): - - # Get setting data - # We need to send setting and not mult_setting because mult_setting is unknown on plugin side - template_value, current_value, default_value, is_disabled_method, is_current_from_template, is_current_default, setting_value = ( - get_setting_data(template_settings, settings, mult_setting, mult_value) - ) - - if current_value is not None: - raw_settings[mult_setting] = current_value - continue - - if template_value is not None: - raw_settings[mult_setting] = template_value - continue - - return raw_settings - - -def set_advanced(template: list, plugins_base: list, settings: dict, is_new: bool) -> dict: - """ - Set the advanced form based on the template and plugins data. - It consists of formatting each plugin settings to be used in the advanced form. - """ - template_settings = template.get("settings") - # Copy of the plugins base data - plugins = copy.deepcopy(plugins_base) - # Update settings with global config data - for plugin in plugins: - loop_id = 0 - total_settings = len(plugin.get("settings")) - for setting, value in plugin.get("settings").items(): - loop_id += 1 - value = format_setting(setting, value, total_settings, loop_id, template_settings, settings, is_new) - - set_multiples(template, plugins, settings) - - return plugins - - -def get_multiple_from_template(template, multiples): - """ - We are gonna loop on each plugins multiples group, in case a setting is matching a template setting, - we will create a group using the prefix as key (or "0" if no prefix) with default settings at first. - Then we will override by the template value in case there is one. - This will return something of this type : - {'0' : {'setting' : value, 'setting2': value2}, '1' : {'setting_1': value, 'setting2_1': value}} } - """ - # Loop on each plugin and loop on multiples key - # Check if the name us matching a template key - multiple_plugin = copy.deepcopy(multiples) - - multiple_template = {} - for setting, value in template.get("settings").items(): - # Sanitize setting name to remove prefix of type _1 if exists - # Slipt by _ and check if last element is a digit - format_setting = setting - setting_split = setting.split("_") - prefix = "0" - if setting_split[-1].isdigit(): - prefix = setting_split[-1] - format_setting = "_".join(setting_split[:-1]) - # loop on settings of a multiple group - for mult_name, mult_settings in multiple_plugin.items(): - - # Check if at least one setting is matching a multiple setting - if not format_setting in mult_settings: - continue - - # Case we have at least one multiple setting, we can check if multiple name exists or create it - if not mult_name in multiple_template: - multiple_template[mult_name] = {} - - # Case it is, we will check if already a group with the right prefix exists - # If not, we will create it - if not prefix in multiple_template[mult_name]: - # We want each settings to have the prefix if exists - # We will get the value of the setting without the prefix and create a prefix key with the same value - # And after that we can delete the original setting - new_multiple_group = {} - for multSett, multValue in mult_settings.items(): - new_multiple_group[f"{multSett}{f'_{prefix}' if prefix != '0' else ''}"] = multValue - - new_multiple_group = copy.deepcopy(new_multiple_group) - - # Update id for each settings - for multSett, multValue in new_multiple_group.items(): - multValue["id"] = f"{multValue['id']}{f'-{prefix}' if prefix != '0' else ''}" - - multiple_template[mult_name][prefix] = new_multiple_group - - # We can now add the template value to setting using the same setting name with prefix - multiple_template[mult_name][prefix][setting]["value"] = value - multiple_template[mult_name][prefix][setting]["prev_value"] = value - multiple_template[mult_name][prefix][setting]["method"] = "default" - - # Sort key incrementally - for mult_name, mult_settings in multiple_template.items(): - multiple_template[mult_name] = dict(sorted(mult_settings.items(), key=lambda item: int(item[0]))) - return multiple_template - - -def get_multiple_from_settings(settings, multiples): - """ - We are gonna loop on each plugins multiples group, in case a setting is matching a service / global config setting, - we will create a group using the prefix as key (or "0" if no prefix) with default settings at first. - Then we will override by the service / global config value in case there is one. - This will return something of this type : - {'0' : {'setting' : value, 'setting2': value2}, '1' : {'setting_1': value, 'setting2_1': value}} } - """ - - # Loop on each plugin and loop on multiples key - # Check if the name us matching a template key - multiple_plugins = copy.deepcopy(multiples) - - multiple_settings = {} - for setting, value in settings.items(): - # Sanitize setting name to remove prefix of type _1 if exists - # Slipt by _ and check if last element is a digit - format_setting = setting - setting_split = setting.split("_") - prefix = "0" - if setting_split[-1].isdigit(): - prefix = setting_split[-1] - format_setting = "_".join(setting_split[:-1]) - - # loop on settings of a multiple group - for mult_name, mult_settings in multiple_plugins.items(): - - # Check if at least one setting is matching a multiple setting - if not format_setting in mult_settings: - continue - - # Case we have at least one multiple setting, we can check if multiple name exists or create it - if not mult_name in multiple_settings: - multiple_settings[mult_name] = {} - # Now check if prefix exist for this mult - if not prefix in multiple_settings[mult_name]: - # We want each settings to have the prefix if exists - # We will get the value of the setting without the prefix and create a prefix key with the same value - # And after that we can delete the original setting - new_multiple_group = {} - for multSett, multValue in mult_settings.items(): - new_multiple_group[f"{multSett}{f'_{prefix}' if prefix != '0' else ''}"] = multValue - - new_multiple_group = copy.deepcopy(new_multiple_group) - - # Update id for each settings - for multSett, multValue in new_multiple_group.items(): - multValue["id"] = f"{multValue['id']}{f'-{prefix}' if prefix != '0' else ''}" - - multiple_settings[mult_name][prefix] = new_multiple_group - - # Update multiple template with real data - multiple_settings[mult_name][prefix][setting]["value"] = value.get("value", multiple_settings[mult_name][prefix][setting]["value"]) - multiple_settings[mult_name][prefix][setting]["prev_value"] = value.get("value", multiple_settings[mult_name][prefix][setting]["value"]) - multiple_settings[mult_name][prefix][setting]["method"] = value.get("method", "ui") - multiple_settings[mult_name][prefix][setting]["disabled"] = False if value.get("method", "ui") in ("ui", "default", "manual") else True - - # Add popovers if setting is disabled else stop - if not multiple_settings[mult_name][prefix][setting].get("disabled", False): - continue - - multiple_settings[mult_name][prefix][setting]["popovers"] = [ - { - "iconName": "trespass", - "text": "inp_popover_method_disabled", - } - ] + multiple_settings[ - mult_name - ][prefix][setting].get("popovers", []) - - return multiple_settings - - -def set_multiples(template, format_plugins, settings): - """ - Set the multiples settings for each plugin. - """ - # copy of format plugins - for plugin in format_plugins: - # Get multiples - multiples = {} - settings_to_delete = [] - total_settings = len(plugin.get("settings")) - zindex = 0 - for setting, value in plugin.get("settings").items(): - - if not value.get("multiple"): - continue - - zindex += 1 - - value["containerClass"] = f"z-{total_settings - zindex}" - - mult_name = value.get("multiple") - # Get the multiple value and set it as key if not in multiples dict - if mult_name not in multiples: - multiples[mult_name] = {} - - multiples[mult_name][setting] = value - settings_to_delete.append(setting) - - # Delete multiple settings from regular settings - for setting in settings_to_delete: - del plugin["settings"][setting] - - if len(multiples): - # Add multiple schema with default values to plugin - plugin["multiples_schema"] = multiples - # Now that we have for each plugin the multiples settings, we need to do the following - # Get all settings from template that are multiples - template_multiples = get_multiple_from_template(template, multiples) - # Get all settings from service settings / global config that are multiples - service_multiples = get_multiple_from_settings(settings, multiples) - # Get service multiples if at least one, else use template multiples - plugin["multiples"] = service_multiples if len(service_multiples) else template_multiples - - return format_plugins - - -def format_setting( - name: str, - value: Union[str, int], - total_settings: Union[str, int], - loop_id: Union[str, int], - template_settings: dict, - settings: dict, - is_new: bool = False, -) -> dict: - """ - Format a setting in order to be used with form builder. - This will only set value for none multiple settings. - Additionnel set_multiples function will handle multiple settings. - """ - - is_multiple_setting = value.get("multiple", False) - - template_value, current_value, default_value, is_disabled_method, is_current_from_template, is_current_default, setting_value = get_setting_data( - template_settings, settings, name, value, is_multiple_setting, is_new - ) # regex by pattern - - value["pattern"] = value.get("regex", "") - - # set inpType based on type define for each settings - inpType = ( - "checkbox" - if value.get("type") == "check" - else ("select" if value.get("type") == "select" else "datepicker" if value.get("type") == "date" else "input") - ) - value["inpType"] = inpType - - if inpType == "select": - # replace "select" key by "values" - value["values"] = value.pop("select") - - value["columns"] = {"pc": 4, "tablet": 6, "mobile": 12} - value["disabled"] = is_disabled_method - value["value"] = default_value - value["name"] = value.get("label") - value["prev_value"] = value.get("value") - - # Prepare popover checking "help", "context" - popovers = [] - - if is_disabled_method: - popovers.append( - { - "iconName": "trespass", - "text": "inp_popover_method_disabled", - } - ) - - if value.get("context"): - popovers.append( - { - "iconName": ("disk" if value.get("context") == "multisite" else "globe"), - "text": ("inp_popover_multisite" if value.get("context") == "multisite" else "inp_popover_global"), - } - ) - - if value.get("help"): - popovers.append( - { - "iconName": "info", - "text": value.get("help"), - } - ) - - value["popovers"] = popovers - - # Case multiple, stop here - if "multiple" in value: - return value - - # Else, we can add additional final data - value["method"] = settings.get(name, {}).get("method", "ui") - value["containerClass"] = f"z-{total_settings - loop_id}" - - if current_value is not None and not is_current_default: - value["value"] = current_value - elif template_value is not None: - value["value"] = template_value - else: - value["value"] = setting_value - - return value diff --git a/src/ui/client/tests/builder/utils/widgets.py b/src/ui/client/tests/builder/utils/widgets.py deleted file mode 100644 index 871a72a20..000000000 --- a/src/ui/client/tests/builder/utils/widgets.py +++ /dev/null @@ -1,64 +0,0 @@ -from typing import Union - - -def title_widget(title: str) -> dict: - return { - "type": "Title", - "data": {"title": title}, - } - - -def table_widget(positions: list[int], header: list[str], items: list[dict], filters: list[dict], minWidth: str, title: str) -> dict: - return { - "type": "Table", - "data": { - "title": title, - "minWidth": minWidth, - "header": header, - "positions": positions, - "items": items, - "filters": filters, - }, - } - - -def stat_widget( - link: str, containerColums: dict, title: Union[str, int], subtitle: Union[str, int], subtitle_color: str, stat: Union[str, int], icon_name: str -) -> dict: - """Return a valid format to render a Stat widget""" - return { - "type": "card", - "link": link, - "containerColumns": containerColums, - "widgets": [ - { - "type": "Stat", - "data": { - "title": title, - "subtitle": subtitle, - "subtitleColor": subtitle_color, - "stat": stat, - "iconName": icon_name, - }, - } - ], - } - - -def instance_widget(containerColumns: dict, pairs: list[dict], status: str, title: Union[str, int], buttons: list[dict]) -> dict: - """Return a valid format to render an Instance widget""" - return { - "type": "card", - "containerColumns": containerColumns, - "widgets": [ - { - "type": "Instance", - "data": { - "pairs": pairs, - "status": status, - "title": title, - "buttons": buttons, - }, - } - ], - } diff --git a/src/ui/client/tests/easy.json b/src/ui/client/tests/easy.json deleted file mode 100644 index ac994b926..000000000 --- a/src/ui/client/tests/easy.json +++ /dev/null @@ -1,2646 +0,0 @@ -[ - { - "type": "card", - "containerColumns": { - "pc": 12, - "tablet": 12, - "mobile": 12 - }, - "widgets": [ - { - "type": "Title", - "data": { - "title": "app1.example.com", - "type": "container", - "lowercase": true - } - }, - { - "type": "Subtitle", - "data": { - "subtitle": "services_manage_subtitle", - "type": "container" - } - }, - { - "type": "Templates", - "data": { - "templates": { - "easy": { - "default": [], - "low": [ - { - "title": "Web service - Front service", - "subtitle": "Configure your web service facing your clients", - "plugins": [ - { - "id": "general", - "stream": "partial", - "name": "General", - "description": "The general settings for the server", - "version": "0.1", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "SERVER_NAME": { - "context": "multisite", - "default": "www.example.com", - "help": "List of the virtual hosts served by bunkerweb.", - "id": "server-name", - "label": "Server name", - "regex": "^((\\S{1,255})(?!.*\\s\\2(\\s|$)))?(\\s(\\S{1,255})(?!.*\\s\\5(\\s|$)))*$", - "type": "text", - "pattern": "^((\\S{1,255})(?!.*\\s\\2(\\s|$)))?(\\s(\\S{1,255})(?!.*\\s\\5(\\s|$)))*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "app1.example.com", - "name": "Server name", - "prev_value": "www.example.com", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of the virtual hosts served by bunkerweb." - } - ], - "method": "ui", - "containerClass": "z-6" - } - }, - "checksum": null - }, - { - "id": "letsencrypt", - "stream": "yes", - "name": "Let's Encrypt", - "description": "Automatic creation, renewal and configuration of Let's Encrypt certificates.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "AUTO_LETS_ENCRYPT": { - "context": "multisite", - "default": "no", - "help": "Activate automatic Let's Encrypt mode.", - "id": "auto-lets-encrypt", - "label": "Automatic Let's Encrypt", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "Automatic Let's Encrypt", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Activate automatic Let's Encrypt mode." - } - ], - "method": "default", - "containerClass": "z-2" - }, - "USE_LETS_ENCRYPT_STAGING": { - "context": "multisite", - "default": "no", - "help": "Use the staging environment for Let\u2019s Encrypt certificate generation. Useful when you are testing your deployments to avoid being rate limited in the production environment.", - "id": "use-lets-encrypt-staging", - "label": "Use Let's Encrypt Staging", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Use Let's Encrypt Staging", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Use the staging environment for Let\u2019s Encrypt certificate generation. Useful when you are testing your deployments to avoid being rate limited in the production environment." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - } - ] - }, - { - "title": "Web service - Upstream server", - "subtitle": "Configure the upstream server to be protected by BunkerWeb", - "plugins": [ - { - "id": "reverseproxy", - "stream": "partial", - "name": "Reverse proxy", - "description": "Manage reverse proxy configurations.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "USE_REVERSE_PROXY": { - "context": "multisite", - "default": "no", - "help": "Activate reverse proxy mode.", - "id": "use-reverse-proxy", - "label": "Use reverse proxy", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": true, - "value": "yes", - "name": "Use reverse proxy", - "prev_value": "no", - "popovers": [ - { - "iconName": "trespass", - "text": "inp_popover_method_disabled" - }, - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Activate reverse proxy mode." - } - ], - "method": "scheduler", - "containerClass": "z-23" - }, - "REVERSE_PROXY_CUSTOM_HOST": { - "context": "multisite", - "default": "", - "help": "Override Host header sent to upstream server.", - "id": "reverse-proxy-custom-host", - "label": "Reverse proxy custom host", - "regex": "^.*$", - "type": "text", - "pattern": "^.*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Reverse proxy custom host", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Override Host header sent to upstream server." - } - ], - "method": "default", - "containerClass": "z-21" - } - }, - "checksum": null, - "multiples_schema": { - "reverse-proxy": { - "REVERSE_PROXY_HOST": { - "context": "multisite", - "default": "", - "help": "Full URL of the proxied resource (proxy_pass).", - "id": "reverse-proxy-host", - "label": "Reverse proxy host", - "regex": "^.*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^.*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Reverse proxy host", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Full URL of the proxied resource (proxy_pass)." - } - ], - "containerClass": "z-23" - }, - "REVERSE_PROXY_URL": { - "context": "multisite", - "default": "/", - "help": "Location URL that will be proxied.", - "id": "reverse-proxy-url", - "label": "Reverse proxy url", - "regex": "^.*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^.*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "/", - "name": "Reverse proxy url", - "prev_value": "/", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Location URL that will be proxied." - } - ], - "containerClass": "z-22" - }, - "REVERSE_PROXY_WS": { - "context": "multisite", - "default": "no", - "help": "Enable websocket on the proxied resource.", - "id": "reverse-proxy-ws", - "label": "Reverse proxy WS", - "regex": "^(yes|no)$", - "type": "check", - "multiple": "reverse-proxy", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Reverse proxy WS", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable websocket on the proxied resource." - } - ], - "containerClass": "z-21" - }, - "REVERSE_PROXY_HEADERS": { - "context": "multisite", - "default": "", - "help": "List of HTTP headers to send to proxied resource separated with semicolons (values for proxy_set_header directive).", - "id": "reverse-proxy-headers", - "label": "Reverse proxy headers", - "regex": "^(?![; ])(;? ?([\\w\\-]+)(?!.*\\2 ) [^;]+)*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(?![; ])(;? ?([\\w\\-]+)(?!.*\\2 ) [^;]+)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Reverse proxy headers", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of HTTP headers to send to proxied resource separated with semicolons (values for proxy_set_header directive)." - } - ], - "containerClass": "z-20" - }, - "REVERSE_PROXY_HEADERS_CLIENT": { - "context": "multisite", - "default": "", - "help": "List of HTTP headers to send to client separated with semicolons (values for add_header directive).", - "id": "reverse-proxy-headers-client", - "label": "Reverse proxy headers-client", - "regex": "^(?![; ])(;? ?([\\w\\-]+)(?!.*\\2 ) [^;]+)*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(?![; ])(;? ?([\\w\\-]+)(?!.*\\2 ) [^;]+)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Reverse proxy headers-client", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of HTTP headers to send to client separated with semicolons (values for add_header directive)." - } - ], - "containerClass": "z-19" - }, - "REVERSE_PROXY_BUFFERING": { - "context": "multisite", - "default": "yes", - "help": "Enable or disable buffering of responses from proxied resource.", - "id": "reverse-proxy-buffering", - "label": "Reverse proxy buffering", - "regex": "^(yes|no)$", - "type": "check", - "multiple": "reverse-proxy", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "Reverse proxy buffering", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable or disable buffering of responses from proxied resource." - } - ], - "containerClass": "z-18" - }, - "REVERSE_PROXY_KEEPALIVE": { - "context": "multisite", - "default": "no", - "help": "Enable or disable keepalive connections with the proxied resource.", - "id": "reverse-proxy-keepalive", - "label": "Reverse proxy keepalive", - "regex": "^(yes|no)$", - "type": "check", - "multiple": "reverse-proxy", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Reverse proxy keepalive", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable or disable keepalive connections with the proxied resource." - } - ], - "containerClass": "z-17" - }, - "REVERSE_PROXY_AUTH_REQUEST": { - "context": "multisite", - "default": "", - "help": "Enable authentication using an external provider (value of auth_request directive).", - "id": "reverse-proxy-auth-request", - "label": "Reverse proxy auth request", - "regex": "^(\\/[\\w\\].~:\\/?#\\[@!$\\&'\\(\\)*+,;=\\-]*|off)?$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(\\/[\\w\\].~:\\/?#\\[@!$\\&'\\(\\)*+,;=\\-]*|off)?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Reverse proxy auth request", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable authentication using an external provider (value of auth_request directive)." - } - ], - "containerClass": "z-16" - }, - "REVERSE_PROXY_AUTH_REQUEST_SIGNIN_URL": { - "context": "multisite", - "default": "", - "help": "Redirect clients to sign-in URL when using REVERSE_PROXY_AUTH_REQUEST (used when auth_request call returned 401).", - "id": "reverse-proxy-auth-request-signin-url", - "label": "Auth request signin URL", - "regex": "^(https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)?$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Auth request signin URL", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Redirect clients to sign-in URL when using REVERSE_PROXY_AUTH_REQUEST (used when auth_request call returned 401)." - } - ], - "containerClass": "z-15" - }, - "REVERSE_PROXY_AUTH_REQUEST_SET": { - "context": "multisite", - "default": "", - "help": "List of variables to set from the authentication provider, separated with semicolons (values of auth_request_set directives).", - "id": "reverse-proxy-auth-request-set", - "label": "Reverse proxy auth request set", - "regex": "^(?! ;)(;? ?(\\$[a-z_\\-]+)(?!.*\\2 ) [^;]+)*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(?! ;)(;? ?(\\$[a-z_\\-]+)(?!.*\\2 ) [^;]+)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Reverse proxy auth request set", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of variables to set from the authentication provider, separated with semicolons (values of auth_request_set directives)." - } - ], - "containerClass": "z-14" - }, - "REVERSE_PROXY_CONNECT_TIMEOUT": { - "context": "multisite", - "default": "60s", - "help": "Timeout when connecting to the proxied resource.", - "id": "reverse-proxy-connect-timeout", - "label": "Reverse proxy connect timeout", - "regex": "^\\d+(ms?|[shdwMy])$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^\\d+(ms?|[shdwMy])$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "60s", - "name": "Reverse proxy connect timeout", - "prev_value": "60s", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Timeout when connecting to the proxied resource." - } - ], - "containerClass": "z-13" - }, - "REVERSE_PROXY_READ_TIMEOUT": { - "context": "multisite", - "default": "60s", - "help": "Timeout when reading from the proxied resource.", - "id": "reverse-proxy-read-timeout", - "label": "Reverse proxy read timeout", - "regex": "^\\d+(ms?|[shdwMy])$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^\\d+(ms?|[shdwMy])$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "60s", - "name": "Reverse proxy read timeout", - "prev_value": "60s", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Timeout when reading from the proxied resource." - } - ], - "containerClass": "z-12" - }, - "REVERSE_PROXY_SEND_TIMEOUT": { - "context": "multisite", - "default": "60s", - "help": "Timeout when sending to the proxied resource.", - "id": "reverse-proxy-send-timeout", - "label": "Reverse proxy send timeout", - "regex": "^\\d+(ms?|[shdwMy])$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^\\d+(ms?|[shdwMy])$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "60s", - "name": "Reverse proxy send timeout", - "prev_value": "60s", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Timeout when sending to the proxied resource." - } - ], - "containerClass": "z-11" - }, - "REVERSE_PROXY_INCLUDES": { - "context": "multisite", - "default": "", - "help": "Additional configuration to include in the location block, separated with spaces.", - "id": "reverse-proxy-includes", - "label": "Reverse proxy includes", - "regex": "^(?! )( ?(\\w+)(?!.*\\b\\2\\b))*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(?! )( ?(\\w+)(?!.*\\b\\2\\b))*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Reverse proxy includes", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Additional configuration to include in the location block, separated with spaces." - } - ], - "containerClass": "z-10" - } - } - }, - "multiples": { - "reverse-proxy": { - "0": { - "REVERSE_PROXY_HOST": { - "context": "multisite", - "default": "", - "help": "Full URL of the proxied resource (proxy_pass).", - "id": "reverse-proxy-host", - "label": "Reverse proxy host", - "regex": "^.*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^.*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": true, - "value": "http://app1:8080", - "name": "Reverse proxy host", - "prev_value": "http://app1:8080", - "popovers": [ - { - "iconName": "trespass", - "text": "inp_popover_method_disabled" - }, - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Full URL of the proxied resource (proxy_pass)." - } - ], - "containerClass": "z-23", - "method": "scheduler" - }, - "REVERSE_PROXY_URL": { - "context": "multisite", - "default": "/", - "help": "Location URL that will be proxied.", - "id": "reverse-proxy-url", - "label": "Reverse proxy url", - "regex": "^.*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^.*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "/", - "name": "Reverse proxy url", - "prev_value": "/", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Location URL that will be proxied." - } - ], - "containerClass": "z-22", - "method": "default" - }, - "REVERSE_PROXY_WS": { - "context": "multisite", - "default": "no", - "help": "Enable websocket on the proxied resource.", - "id": "reverse-proxy-ws", - "label": "Reverse proxy WS", - "regex": "^(yes|no)$", - "type": "check", - "multiple": "reverse-proxy", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Reverse proxy WS", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable websocket on the proxied resource." - } - ], - "containerClass": "z-21", - "method": "default" - }, - "REVERSE_PROXY_HEADERS": { - "context": "multisite", - "default": "", - "help": "List of HTTP headers to send to proxied resource separated with semicolons (values for proxy_set_header directive).", - "id": "reverse-proxy-headers", - "label": "Reverse proxy headers", - "regex": "^(?![; ])(;? ?([\\w\\-]+)(?!.*\\2 ) [^;]+)*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(?![; ])(;? ?([\\w\\-]+)(?!.*\\2 ) [^;]+)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Reverse proxy headers", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of HTTP headers to send to proxied resource separated with semicolons (values for proxy_set_header directive)." - } - ], - "containerClass": "z-20", - "method": "default" - }, - "REVERSE_PROXY_HEADERS_CLIENT": { - "context": "multisite", - "default": "", - "help": "List of HTTP headers to send to client separated with semicolons (values for add_header directive).", - "id": "reverse-proxy-headers-client", - "label": "Reverse proxy headers-client", - "regex": "^(?![; ])(;? ?([\\w\\-]+)(?!.*\\2 ) [^;]+)*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(?![; ])(;? ?([\\w\\-]+)(?!.*\\2 ) [^;]+)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Reverse proxy headers-client", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of HTTP headers to send to client separated with semicolons (values for add_header directive)." - } - ], - "containerClass": "z-19", - "method": "default" - }, - "REVERSE_PROXY_BUFFERING": { - "context": "multisite", - "default": "yes", - "help": "Enable or disable buffering of responses from proxied resource.", - "id": "reverse-proxy-buffering", - "label": "Reverse proxy buffering", - "regex": "^(yes|no)$", - "type": "check", - "multiple": "reverse-proxy", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "Reverse proxy buffering", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable or disable buffering of responses from proxied resource." - } - ], - "containerClass": "z-18", - "method": "default" - }, - "REVERSE_PROXY_KEEPALIVE": { - "context": "multisite", - "default": "no", - "help": "Enable or disable keepalive connections with the proxied resource.", - "id": "reverse-proxy-keepalive", - "label": "Reverse proxy keepalive", - "regex": "^(yes|no)$", - "type": "check", - "multiple": "reverse-proxy", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Reverse proxy keepalive", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable or disable keepalive connections with the proxied resource." - } - ], - "containerClass": "z-17", - "method": "default" - }, - "REVERSE_PROXY_AUTH_REQUEST": { - "context": "multisite", - "default": "", - "help": "Enable authentication using an external provider (value of auth_request directive).", - "id": "reverse-proxy-auth-request", - "label": "Reverse proxy auth request", - "regex": "^(\\/[\\w\\].~:\\/?#\\[@!$\\&'\\(\\)*+,;=\\-]*|off)?$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(\\/[\\w\\].~:\\/?#\\[@!$\\&'\\(\\)*+,;=\\-]*|off)?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Reverse proxy auth request", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable authentication using an external provider (value of auth_request directive)." - } - ], - "containerClass": "z-16", - "method": "default" - }, - "REVERSE_PROXY_AUTH_REQUEST_SIGNIN_URL": { - "context": "multisite", - "default": "", - "help": "Redirect clients to sign-in URL when using REVERSE_PROXY_AUTH_REQUEST (used when auth_request call returned 401).", - "id": "reverse-proxy-auth-request-signin-url", - "label": "Auth request signin URL", - "regex": "^(https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)?$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Auth request signin URL", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Redirect clients to sign-in URL when using REVERSE_PROXY_AUTH_REQUEST (used when auth_request call returned 401)." - } - ], - "containerClass": "z-15", - "method": "default" - }, - "REVERSE_PROXY_AUTH_REQUEST_SET": { - "context": "multisite", - "default": "", - "help": "List of variables to set from the authentication provider, separated with semicolons (values of auth_request_set directives).", - "id": "reverse-proxy-auth-request-set", - "label": "Reverse proxy auth request set", - "regex": "^(?! ;)(;? ?(\\$[a-z_\\-]+)(?!.*\\2 ) [^;]+)*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(?! ;)(;? ?(\\$[a-z_\\-]+)(?!.*\\2 ) [^;]+)*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Reverse proxy auth request set", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of variables to set from the authentication provider, separated with semicolons (values of auth_request_set directives)." - } - ], - "containerClass": "z-14", - "method": "default" - }, - "REVERSE_PROXY_CONNECT_TIMEOUT": { - "context": "multisite", - "default": "60s", - "help": "Timeout when connecting to the proxied resource.", - "id": "reverse-proxy-connect-timeout", - "label": "Reverse proxy connect timeout", - "regex": "^\\d+(ms?|[shdwMy])$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^\\d+(ms?|[shdwMy])$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "60s", - "name": "Reverse proxy connect timeout", - "prev_value": "60s", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Timeout when connecting to the proxied resource." - } - ], - "containerClass": "z-13", - "method": "default" - }, - "REVERSE_PROXY_READ_TIMEOUT": { - "context": "multisite", - "default": "60s", - "help": "Timeout when reading from the proxied resource.", - "id": "reverse-proxy-read-timeout", - "label": "Reverse proxy read timeout", - "regex": "^\\d+(ms?|[shdwMy])$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^\\d+(ms?|[shdwMy])$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "60s", - "name": "Reverse proxy read timeout", - "prev_value": "60s", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Timeout when reading from the proxied resource." - } - ], - "containerClass": "z-12", - "method": "default" - }, - "REVERSE_PROXY_SEND_TIMEOUT": { - "context": "multisite", - "default": "60s", - "help": "Timeout when sending to the proxied resource.", - "id": "reverse-proxy-send-timeout", - "label": "Reverse proxy send timeout", - "regex": "^\\d+(ms?|[shdwMy])$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^\\d+(ms?|[shdwMy])$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "60s", - "name": "Reverse proxy send timeout", - "prev_value": "60s", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Timeout when sending to the proxied resource." - } - ], - "containerClass": "z-11", - "method": "default" - }, - "REVERSE_PROXY_INCLUDES": { - "context": "multisite", - "default": "", - "help": "Additional configuration to include in the location block, separated with spaces.", - "id": "reverse-proxy-includes", - "label": "Reverse proxy includes", - "regex": "^(?! )( ?(\\w+)(?!.*\\b\\2\\b))*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(?! )( ?(\\w+)(?!.*\\b\\2\\b))*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Reverse proxy includes", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Additional configuration to include in the location block, separated with spaces." - } - ], - "containerClass": "z-10", - "method": "default" - } - } - } - } - } - ] - }, - { - "title": "HTTP - General", - "subtitle": "Configure the settings related to the HTTP(S) protocol", - "plugins": [ - { - "id": "misc", - "stream": "partial", - "name": "Miscellaneous", - "description": "Miscellaneous settings.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": true, - "settings": { - "ALLOWED_METHODS": { - "context": "multisite", - "default": "GET|POST|HEAD", - "help": "Allowed HTTP and WebDAV methods, separated with pipes to be sent by clients.", - "id": "allowed-methods", - "label": "Allowed methods", - "regex": "^(?!\\|)(\\|?([A-Z]{3,})(?!.*(^|\\|)\\2))+$", - "type": "text", - "pattern": "^(?!\\|)(\\|?([A-Z]{3,})(?!.*(^|\\|)\\2))+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "GET|POST|HEAD|OPTIONS|PUT|DELETE|PATCH", - "name": "Allowed methods", - "prev_value": "GET|POST|HEAD", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Allowed HTTP and WebDAV methods, separated with pipes to be sent by clients." - } - ], - "method": "default", - "containerClass": "z-13" - }, - "MAX_CLIENT_SIZE": { - "context": "multisite", - "default": "10m", - "help": "Maximum body size (0 for infinite).", - "id": "max-client-size", - "label": "Maximum body size", - "regex": "^\\d+[kKmMgG]?$", - "type": "text", - "pattern": "^\\d+[kKmMgG]?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "100m", - "name": "Maximum body size", - "prev_value": "10m", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Maximum body size (0 for infinite)." - } - ], - "method": "default", - "containerClass": "z-12" - }, - "SSL_PROTOCOLS": { - "context": "multisite", - "default": "TLSv1.2 TLSv1.3", - "help": "The supported version of TLS. We recommend the default value TLSv1.2 TLSv1.3 for compatibility reasons.", - "id": "https-protocols", - "label": "HTTPS protocols", - "regex": "^(?! )( ?TLSv1\\.[0-3])*$", - "type": "text", - "pattern": "^(?! )( ?TLSv1\\.[0-3])*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "TLSv1.2 TLSv1.3", - "name": "HTTPS protocols", - "prev_value": "TLSv1.2 TLSv1.3", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "The supported version of TLS. We recommend the default value TLSv1.2 TLSv1.3 for compatibility reasons." - } - ], - "method": "default", - "containerClass": "z-9" - }, - "HTTP2": { - "context": "multisite", - "default": "yes", - "help": "Support HTTP2 protocol when HTTPS is enabled.", - "id": "http2", - "label": "HTTP2", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "HTTP2", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Support HTTP2 protocol when HTTPS is enabled." - } - ], - "method": "default", - "containerClass": "z-8" - }, - "HTTP3": { - "context": "multisite", - "default": "no", - "help": "Support HTTP3 protocol when HTTPS is enabled.", - "id": "http3", - "label": "HTTP3", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "HTTP3", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Support HTTP3 protocol when HTTPS is enabled." - } - ], - "method": "default", - "containerClass": "z-7" - } - }, - "checksum": null - } - ] - }, - { - "title": "HTTP - Headers", - "subtitle": "Configure the settings related to the HTTP headers", - "plugins": [ - { - "id": "cors", - "stream": "no", - "name": "CORS", - "description": "Cross-Origin Resource Sharing.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": true, - "settings": { - "USE_CORS": { - "context": "multisite", - "default": "no", - "help": "Use CORS", - "id": "use-cors", - "label": "Use CORS", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "Use CORS", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Use CORS" - } - ], - "method": "default", - "containerClass": "z-10" - }, - "CORS_ALLOW_ORIGIN": { - "context": "multisite", - "default": "*", - "help": "Allowed origins to make CORS requests : PCRE regex or *.", - "id": "cors-allow-origin", - "label": "Allowed origins", - "regex": "^.*$", - "type": "text", - "pattern": "^.*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "self", - "name": "Allowed origins", - "prev_value": "*", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Allowed origins to make CORS requests : PCRE regex or *." - } - ], - "method": "default", - "containerClass": "z-9" - } - }, - "checksum": null - }, - { - "id": "headers", - "stream": "no", - "name": "Headers", - "description": "Manage HTTP headers sent to clients.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "KEEP_UPSTREAM_HEADERS": { - "context": "multisite", - "default": "Content-Security-Policy Permissions-Policy Feature-Policy X-Frame-Options", - "help": "Headers to keep from upstream (Header1 Header2 Header3 ... or * for all).", - "id": "keep-upstream-headers", - "label": "Keep upstream headers", - "regex": "^((?! )( ?[\\w\\-]+)+|\\*)?$", - "type": "text", - "pattern": "^((?! )( ?[\\w\\-]+)+|\\*)?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "Content-Security-Policy Permissions-Policy X-Frame-Options", - "name": "Keep upstream headers", - "prev_value": "Content-Security-Policy Permissions-Policy Feature-Policy X-Frame-Options", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Headers to keep from upstream (Header1 Header2 Header3 ... or * for all)." - } - ], - "method": "default", - "containerClass": "z-11" - }, - "CONTENT_SECURITY_POLICY": { - "context": "multisite", - "default": "object-src 'none'; form-action 'self'; frame-ancestors 'self';", - "help": "Value for the Content-Security-Policy header.", - "id": "content-security-policy", - "label": "Content-Security-Policy", - "regex": "^.*$", - "type": "text", - "pattern": "^.*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Content-Security-Policy", - "prev_value": "object-src 'none'; form-action 'self'; frame-ancestors 'self';", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value for the Content-Security-Policy header." - } - ], - "method": "default", - "containerClass": "z-7" - }, - "REFERRER_POLICY": { - "context": "multisite", - "default": "strict-origin-when-cross-origin", - "help": "Value for the Referrer-Policy header.", - "id": "referrer-policy", - "label": "Referrer-Policy", - "regex": "^(?!^(,| ))((, )?(no-referrer-when-downgrade|no-referrer|origin-when-cross-origin|same-origin|strict-origin-when-cross-origin|strict-origin|origin|unsafe-url)(?!\\b.*, \\4\\b))*$", - "type": "text", - "pattern": "^(?!^(,| ))((, )?(no-referrer-when-downgrade|no-referrer|origin-when-cross-origin|same-origin|strict-origin-when-cross-origin|strict-origin|origin|unsafe-url)(?!\\b.*, \\4\\b))*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no-referrer-when-downgrade", - "name": "Referrer-Policy", - "prev_value": "strict-origin-when-cross-origin", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value for the Referrer-Policy header." - } - ], - "method": "default", - "containerClass": "z-5" - }, - "PERMISSIONS_POLICY": { - "context": "multisite", - "default": "accelerometer=(), ambient-light-sensor=(), autoplay=(), battery=(), camera=(), cross-origin-isolated=(), display-capture=(), document-domain=(), encrypted-media=(), execution-while-not-rendered=(), execution-while-out-of-viewport=(), fullscreen=(), geolocation=(), gyroscope=(), hid=(), idle-detection=(), magnetometer=(), microphone=(), midi=(), navigation-override=(), payment=(), picture-in-picture=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), usb=(), web-share=(), xr-spatial-tracking=()", - "help": "Value for the Permissions-Policy header.", - "id": "permissions-policy", - "label": "Permissions-Policy", - "regex": "^(?![, ])(,? ?([a-z\\-]+)(?!.*[^\\-]\\2=)=(\\*|\\(( ?(self|\\u0022https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*\\u0022)(?=[ \\)]))*\\)))*$", - "type": "text", - "pattern": "^(?![, ])(,? ?([a-z\\-]+)(?!.*[^\\-]\\2=)=(\\*|\\(( ?(self|\\u0022https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*\\u0022)(?=[ \\)]))*\\)))*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), battery=(), bluetooth=(), browsing-topics=(), camera=(), compute-pressure=(), display-capture=(), document-domain=(), encrypted-media=(), execution-while-not-rendered=(), execution-while-out-of-viewport=(), fullscreen=(), gamepad=(), geolocation=(), gyroscope=(), hid=(), identity-credentials-get=(), idle-detection=(), local-fonts=(), magnetometer=(), microphone=(), midi=(), otp-credentials=(), payment=(), picture-in-picture=(), publickey-credentials-create=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), speaker-selection=(), storage-access=(), usb=(), web-share=(), window-management=(), xr-spatial-tracking=()", - "name": "Permissions-Policy", - "prev_value": "accelerometer=(), ambient-light-sensor=(), autoplay=(), battery=(), camera=(), cross-origin-isolated=(), display-capture=(), document-domain=(), encrypted-media=(), execution-while-not-rendered=(), execution-while-out-of-viewport=(), fullscreen=(), geolocation=(), gyroscope=(), hid=(), idle-detection=(), magnetometer=(), microphone=(), midi=(), navigation-override=(), payment=(), picture-in-picture=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), usb=(), web-share=(), xr-spatial-tracking=()", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value for the Permissions-Policy header." - } - ], - "method": "default", - "containerClass": "z-4" - } - }, - "checksum": null, - "multiples_schema": { - "custom-headers": { - "CUSTOM_HEADER": { - "context": "multisite", - "default": "", - "help": "Custom header to add (HeaderName: HeaderValue).", - "id": "custom-header", - "label": "Custom header (HeaderName: HeaderValue)", - "regex": "^([\\w\\-]+: .+)?$", - "type": "text", - "multiple": "custom-headers", - "pattern": "^([\\w\\-]+: .+)?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Custom header (HeaderName: HeaderValue)", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Custom header to add (HeaderName: HeaderValue)." - } - ], - "containerClass": "z-13" - } - }, - "cookie-flags": { - "COOKIE_FLAGS": { - "context": "multisite", - "default": "* HttpOnly SameSite=Lax", - "help": "Cookie flags automatically added to all cookies (value accepted for nginx_cookie_flag_module).", - "id": "cookie-flags", - "label": "Cookie flags", - "regex": "^(\\*|[^;]+)( (HttpOnly|(SameSite)(?!.*\\4)(=(Lax|Strict))?)(?!.*\\3))*$", - "type": "text", - "multiple": "cookie-flags", - "pattern": "^(\\*|[^;]+)( (HttpOnly|(SameSite)(?!.*\\4)(=(Lax|Strict))?)(?!.*\\3))*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "* HttpOnly SameSite=Lax", - "name": "Cookie flags", - "prev_value": "* HttpOnly SameSite=Lax", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Cookie flags automatically added to all cookies (value accepted for nginx_cookie_flag_module)." - } - ], - "containerClass": "z-12" - } - } - }, - "multiples": { - "custom-headers": { - "0": { - "CUSTOM_HEADER": { - "context": "multisite", - "default": "", - "help": "Custom header to add (HeaderName: HeaderValue).", - "id": "custom-header", - "label": "Custom header (HeaderName: HeaderValue)", - "regex": "^([\\w\\-]+: .+)?$", - "type": "text", - "multiple": "custom-headers", - "pattern": "^([\\w\\-]+: .+)?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Custom header (HeaderName: HeaderValue)", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Custom header to add (HeaderName: HeaderValue)." - } - ], - "containerClass": "z-13", - "method": "default" - } - }, - "2": { - "CUSTOM_HEADER_2": { - "context": "multisite", - "default": "", - "help": "Custom header to add (HeaderName: HeaderValue).", - "id": "custom-header-2", - "label": "Custom header (HeaderName: HeaderValue)", - "regex": "^([\\w\\-]+: .+)?$", - "type": "text", - "multiple": "custom-headers", - "pattern": "^([\\w\\-]+: .+)?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "dzdz", - "name": "Custom header (HeaderName: HeaderValue)", - "prev_value": "dzdz", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Custom header to add (HeaderName: HeaderValue)." - } - ], - "containerClass": "z-13", - "method": "default" - } - } - }, - "cookie-flags": { - "0": { - "COOKIE_FLAGS": { - "context": "multisite", - "default": "* HttpOnly SameSite=Lax", - "help": "Cookie flags automatically added to all cookies (value accepted for nginx_cookie_flag_module).", - "id": "cookie-flags", - "label": "Cookie flags", - "regex": "^(\\*|[^;]+)( (HttpOnly|(SameSite)(?!.*\\4)(=(Lax|Strict))?)(?!.*\\3))*$", - "type": "text", - "multiple": "cookie-flags", - "pattern": "^(\\*|[^;]+)( (HttpOnly|(SameSite)(?!.*\\4)(=(Lax|Strict))?)(?!.*\\3))*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "* HttpOnly SameSite=Lax", - "name": "Cookie flags", - "prev_value": "* HttpOnly SameSite=Lax", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Cookie flags automatically added to all cookies (value accepted for nginx_cookie_flag_module)." - } - ], - "containerClass": "z-12", - "method": "default" - } - } - } - } - } - ] - }, - { - "title": "Security - Bad behavior", - "subtitle": "Configure the settings related to the automatic ban when a bad behavior is detected.", - "plugins": [ - { - "id": "badbehavior", - "stream": "yes", - "name": "Bad behavior", - "description": "Ban IP generating too much 'bad' HTTP status code in a period of time.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": true, - "settings": { - "USE_BAD_BEHAVIOR": { - "context": "multisite", - "default": "yes", - "help": "Activate Bad behavior feature.", - "id": "use-bad-behavior", - "label": "Activate bad behavior", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "Activate bad behavior", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Activate Bad behavior feature." - } - ], - "method": "default", - "containerClass": "z-4" - }, - "BAD_BEHAVIOR_STATUS_CODES": { - "context": "multisite", - "default": "400 401 403 404 405 429 444", - "help": "List of HTTP status codes considered as 'bad'.", - "id": "bad-behavior-status-code", - "label": "Bad status codes", - "regex": "^( *([1-5]\\d{2})(?!.*\\2) *)+$", - "type": "text", - "pattern": "^( *([1-5]\\d{2})(?!.*\\2) *)+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "400 401 403 404 405 429 444", - "name": "Bad status codes", - "prev_value": "400 401 403 404 405 429 444", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of HTTP status codes considered as 'bad'." - } - ], - "method": "default", - "containerClass": "z-3" - }, - "BAD_BEHAVIOR_THRESHOLD": { - "context": "multisite", - "default": "10", - "help": "Maximum number of 'bad' HTTP status codes within the period of time before IP is banned.", - "id": "bad-behavior-threshold", - "label": "Threshold", - "regex": "^[1-9][0-9]*", - "type": "text", - "pattern": "^[1-9][0-9]*", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "30", - "name": "Threshold", - "prev_value": "10", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Maximum number of 'bad' HTTP status codes within the period of time before IP is banned." - } - ], - "method": "default", - "containerClass": "z-2" - }, - "BAD_BEHAVIOR_COUNT_TIME": { - "context": "multisite", - "default": "60", - "help": "Period of time (in seconds) during which we count 'bad' HTTP status codes.", - "id": "bad-behavior-period", - "label": "Period (in seconds)", - "regex": "^\\d+", - "type": "text", - "pattern": "^\\d+", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "60", - "name": "Period (in seconds)", - "prev_value": "60", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Period of time (in seconds) during which we count 'bad' HTTP status codes." - } - ], - "method": "default", - "containerClass": "z-1" - }, - "BAD_BEHAVIOR_BAN_TIME": { - "context": "multisite", - "default": "86400", - "help": "The duration time (in seconds) of a ban when the corresponding IP has reached the threshold.", - "id": "bad-behavior-ban-time", - "label": "Ban duration (in seconds)", - "regex": "^\\d+", - "type": "text", - "pattern": "^\\d+", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "3600", - "name": "Ban duration (in seconds)", - "prev_value": "86400", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "The duration time (in seconds) of a ban when the corresponding IP has reached the threshold." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - } - ] - }, - { - "title": "Security - Blacklisting", - "subtitle": "Configure the settings related to the external blacklists.", - "plugins": [ - { - "id": "blacklist", - "stream": "partial", - "name": "Blacklist", - "description": "Deny access based on internal and external IP/network/rDNS/ASN blacklists.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": true, - "settings": { - "USE_BLACKLIST": { - "context": "multisite", - "default": "yes", - "help": "Activate blacklist feature.", - "id": "use-blacklist", - "label": "Activate blacklisting", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": true, - "value": "no", - "name": "Activate blacklisting", - "prev_value": "yes", - "popovers": [ - { - "iconName": "trespass", - "text": "inp_popover_method_disabled" - }, - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Activate blacklist feature." - } - ], - "method": "scheduler", - "containerClass": "z-11" - } - }, - "checksum": null - }, - { - "id": "dnsbl", - "stream": "yes", - "name": "DNSBL", - "description": "Deny access based on external DNSBL servers.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": true, - "settings": { - "USE_DNSBL": { - "context": "multisite", - "default": "yes", - "help": "Activate DNSBL feature.", - "id": "use-dnsbl", - "label": "Activate DNSBL", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Activate DNSBL", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Activate DNSBL feature." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - } - ] - }, - { - "title": "Security - Limiting", - "subtitle": "Configure the settings related to limiting requests and connections.", - "plugins": [ - { - "id": "limit", - "stream": "partial", - "name": "Limit", - "description": "Limit maximum number of requests and connections.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": true, - "settings": { - "USE_LIMIT_REQ": { - "context": "multisite", - "default": "yes", - "help": "Activate limit requests feature.", - "id": "use-limit-req", - "label": "Activate limit requests", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "Activate limit requests", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Activate limit requests feature." - } - ], - "method": "default", - "containerClass": "z-6" - }, - "USE_LIMIT_CONN": { - "context": "multisite", - "default": "yes", - "help": "Activate limit connections feature.", - "id": "use-limit-conn", - "label": "Activate limit connections", - "regex": "^(yes|no)$", - "type": "check", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "name": "Activate limit connections", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Activate limit connections feature." - } - ], - "method": "default", - "containerClass": "z-3" - }, - "LIMIT_CONN_MAX_HTTP1": { - "context": "multisite", - "default": "10", - "help": "Maximum number of connections per IP when using HTTP/1.X protocol.", - "id": "limit-conn-max-http1", - "label": "Maximum number of HTTP/1.X connections", - "regex": "^\\d+$", - "type": "text", - "pattern": "^\\d+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "25", - "name": "Maximum number of HTTP/1.X connections", - "prev_value": "10", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Maximum number of connections per IP when using HTTP/1.X protocol." - } - ], - "method": "default", - "containerClass": "z-2" - }, - "LIMIT_CONN_MAX_HTTP2": { - "context": "multisite", - "default": "100", - "help": "Maximum number of streams per IP when using HTTP/2 protocol.", - "id": "limit-conn-max-http2", - "label": "Maximum number of HTTP/2 streams", - "regex": "^\\d+$", - "type": "text", - "pattern": "^\\d+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "200", - "name": "Maximum number of HTTP/2 streams", - "prev_value": "100", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Maximum number of streams per IP when using HTTP/2 protocol." - } - ], - "method": "default", - "containerClass": "z-1" - } - }, - "checksum": null, - "multiples_schema": { - "limit-req": { - "LIMIT_REQ_URL": { - "context": "multisite", - "default": "/", - "help": "URL (PCRE regex) where the limit request will be applied or special value / for all requests.", - "id": "limit-req-url", - "label": "Limit request URL", - "regex": "^.+$", - "type": "text", - "multiple": "limit-req", - "pattern": "^.+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "/", - "name": "Limit request URL", - "prev_value": "/", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "URL (PCRE regex) where the limit request will be applied or special value / for all requests." - } - ], - "containerClass": "z-6" - }, - "LIMIT_REQ_RATE": { - "context": "multisite", - "default": "2r/s", - "help": "Rate to apply to the URL (s for second, m for minute, h for hour and d for day).", - "id": "limit-req-rate", - "label": "Limit request Rate", - "regex": "^\\d+r/[smhd]$", - "type": "text", - "multiple": "limit-req", - "pattern": "^\\d+r/[smhd]$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "2r/s", - "name": "Limit request Rate", - "prev_value": "2r/s", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Rate to apply to the URL (s for second, m for minute, h for hour and d for day)." - } - ], - "containerClass": "z-5" - } - } - }, - "multiples": { - "limit-req": { - "0": { - "LIMIT_REQ_URL": { - "context": "multisite", - "default": "/", - "help": "URL (PCRE regex) where the limit request will be applied or special value / for all requests.", - "id": "limit-req-url", - "label": "Limit request URL", - "regex": "^.+$", - "type": "text", - "multiple": "limit-req", - "pattern": "^.+$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "/", - "name": "Limit request URL", - "prev_value": "/", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "URL (PCRE regex) where the limit request will be applied or special value / for all requests." - } - ], - "containerClass": "z-6", - "method": "default" - }, - "LIMIT_REQ_RATE": { - "context": "multisite", - "default": "2r/s", - "help": "Rate to apply to the URL (s for second, m for minute, h for hour and d for day).", - "id": "limit-req-rate", - "label": "Limit request Rate", - "regex": "^\\d+r/[smhd]$", - "type": "text", - "multiple": "limit-req", - "pattern": "^\\d+r/[smhd]$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "2r/s", - "name": "Limit request Rate", - "prev_value": "2r/s", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Rate to apply to the URL (s for second, m for minute, h for hour and d for day)." - } - ], - "containerClass": "z-5", - "method": "default" - } - } - } - } - } - ] - }, - { - "title": "Security - Antibot", - "subtitle": "Configure the settings about bot detection", - "plugins": [ - { - "id": "antibot", - "stream": "no", - "name": "Antibot", - "description": "Bot detection by using a challenge.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": true, - "settings": { - "USE_ANTIBOT": { - "context": "multisite", - "default": "no", - "help": "Activate antibot feature.", - "id": "use-antibot", - "label": "Antibot challenge", - "regex": "^(no|cookie|javascript|captcha|recaptcha|hcaptcha|turnstile)$", - "type": "select", - "pattern": "^(no|cookie|javascript|captcha|recaptcha|hcaptcha|turnstile)$", - "inpType": "select", - "values": [ - "captcha", - "cookie", - "hcaptcha", - "javascript", - "no", - "recaptcha", - "turnstile" - ], - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "name": "Antibot challenge", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Activate antibot feature." - } - ], - "method": "default", - "containerClass": "z-10" - }, - "ANTIBOT_URI": { - "context": "multisite", - "default": "/challenge", - "help": "Unused URI that clients will be redirected to to solve the challenge.", - "id": "antibot-uri", - "label": "Antibot URL", - "regex": "^\\/[\\w\\].~:\\/?#\\[@!$\\&'\\(\\)*+,;=\\-]*$", - "type": "text", - "pattern": "^\\/[\\w\\].~:\\/?#\\[@!$\\&'\\(\\)*+,;=\\-]*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "/challenge", - "name": "Antibot URL", - "prev_value": "/challenge", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Unused URI that clients will be redirected to to solve the challenge." - } - ], - "method": "default", - "containerClass": "z-9" - }, - "ANTIBOT_RECAPTCHA_SCORE": { - "context": "multisite", - "default": "0.7", - "help": "Minimum score required for reCAPTCHA challenge.", - "id": "antibot-recaptcha-score", - "label": "reCAPTCHA score", - "regex": "^(0\\.[1-9]|1\\.0)$", - "type": "text", - "pattern": "^(0\\.[1-9]|1\\.0)$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "0.7", - "name": "reCAPTCHA score", - "prev_value": "0.7", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Minimum score required for reCAPTCHA challenge." - } - ], - "method": "default", - "containerClass": "z-6" - }, - "ANTIBOT_RECAPTCHA_SITEKEY": { - "context": "multisite", - "default": "", - "help": "Sitekey for reCAPTCHA challenge.", - "id": "antibot-recaptcha-sitekey", - "label": "reCAPTCHA sitekey", - "regex": "^[\\w\\-]*$", - "type": "text", - "pattern": "^[\\w\\-]*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "reCAPTCHA sitekey", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Sitekey for reCAPTCHA challenge." - } - ], - "method": "default", - "containerClass": "z-5" - }, - "ANTIBOT_RECAPTCHA_SECRET": { - "context": "multisite", - "default": "", - "help": "Secret for reCAPTCHA challenge.", - "id": "antibot-recaptcha-secret", - "label": "reCAPTCHA secret", - "regex": "^[\\w\\-]*$", - "type": "password", - "pattern": "^[\\w\\-]*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "reCAPTCHA secret", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Secret for reCAPTCHA challenge." - } - ], - "method": "default", - "containerClass": "z-4" - }, - "ANTIBOT_HCAPTCHA_SITEKEY": { - "context": "multisite", - "default": "", - "help": "Sitekey for hCaptcha challenge.", - "id": "antibot-hcaptcha-sitekey", - "label": "hCaptcha sitekey", - "regex": "^[a-zA-Z0-9\\-]*$", - "type": "text", - "pattern": "^[a-zA-Z0-9\\-]*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "hCaptcha sitekey", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Sitekey for hCaptcha challenge." - } - ], - "method": "default", - "containerClass": "z-3" - }, - "ANTIBOT_HCAPTCHA_SECRET": { - "context": "multisite", - "default": "", - "help": "Secret for hCaptcha challenge.", - "id": "antibot-hcaptcha-secret", - "label": "hCaptcha secret", - "regex": "^\\w*$", - "type": "password", - "pattern": "^\\w*$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "hCaptcha secret", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Secret for hCaptcha challenge." - } - ], - "method": "default", - "containerClass": "z-2" - }, - "ANTIBOT_TURNSTILE_SITEKEY": { - "context": "multisite", - "default": "", - "help": "Sitekey for Turnstile challenge.", - "id": "antibot-turnstile-sitekey", - "label": "Turnstile sitekey", - "regex": "^(0x[\\w\\-]+)?$", - "type": "text", - "pattern": "^(0x[\\w\\-]+)?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Turnstile sitekey", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Sitekey for Turnstile challenge." - } - ], - "method": "default", - "containerClass": "z-1" - }, - "ANTIBOT_TURNSTILE_SECRET": { - "context": "multisite", - "default": "", - "help": "Secret for Turnstile challenge.", - "id": "antibot-turnstile-secret", - "label": "Turnstile secret", - "regex": "^(0x[\\w\\-]+)?$", - "type": "password", - "pattern": "^(0x[\\w\\-]+)?$", - "inpType": "input", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "name": "Turnstile secret", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Secret for Turnstile challenge." - } - ], - "method": "default", - "containerClass": "z-0" - } - }, - "checksum": null - } - ] - } - ] - } - }, - "operation": "edit", - "oldServerName": "app1.example.com" - } - } - ] - } -] \ No newline at end of file diff --git a/src/ui/client/tests/easy.py b/src/ui/client/tests/easy.py deleted file mode 100644 index 6d5b00b32..000000000 --- a/src/ui/client/tests/easy.py +++ /dev/null @@ -1,4313 +0,0 @@ -import json -import base64 - -from builder.easy_mode import easy_mode_builder - -# Default plugins from docker-compose.ui.yml -plugins = [ - { - "id": "general", - "stream": "partial", - "name": "General", - "description": "The general settings for the server", - "version": "0.1", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "IS_LOADING": { - "context": "global", - "default": "no", - "help": "Internal use : set to yes when BW is loading.", - "id": "internal-use-loading", - "label": "internal use loading", - "regex": "^(yes|no)$", - "type": "check", - }, - "NGINX_PREFIX": { - "context": "global", - "default": "/etc/nginx/", - "help": "Where nginx will search for configurations.", - "id": "nginx-prefix", - "label": "nginx prefix", - "regex": "^(\\/[\\-\\w.\\s]+)*\\/$", - "type": "text", - }, - "HTTP_PORT": { - "context": "global", - "default": "8080", - "help": "HTTP port number which bunkerweb binds to.", - "id": "http-port", - "label": "HTTP port", - "regex": "^\\d+$", - "type": "text", - }, - "HTTPS_PORT": { - "context": "global", - "default": "8443", - "help": "HTTPS port number which bunkerweb binds to.", - "id": "https-port", - "label": "HTTPS port", - "regex": "^\\d+$", - "type": "text", - }, - "MULTISITE": { - "context": "global", - "default": "no", - "help": "Multi site activation.", - "id": "multisite", - "label": "Multisite", - "regex": "^(yes|no)$", - "type": "check", - }, - "SERVER_NAME": { - "context": "multisite", - "default": "www.example.com", - "help": "List of the virtual hosts served by bunkerweb.", - "id": "server-name", - "label": "Server name", - "regex": "^((\\S{1,255})(?!.*\\s\\2(\\s|$)))?(\\s(\\S{1,255})(?!.*\\s\\5(\\s|$)))*$", - "type": "text", - }, - "WORKER_PROCESSES": { - "context": "global", - "default": "auto", - "help": "Number of worker processes.", - "id": "worker-processes", - "label": "Worker processes", - "regex": "^(auto|\\d+)$", - "type": "text", - }, - "WORKER_RLIMIT_NOFILE": { - "context": "global", - "default": "2048", - "help": "Maximum number of open files for worker processes.", - "id": "worker-rlimit-nofile", - "label": "Open files per worker", - "regex": "^\\d+$", - "type": "text", - }, - "WORKER_CONNECTIONS": { - "context": "global", - "default": "1024", - "help": "Maximum number of connections per worker.", - "id": "worker-connections", - "label": "Connections per worker", - "regex": "^\\d+$", - "type": "text", - }, - "LOG_FORMAT": { - "context": "global", - "default": '$host $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"', - "help": "The format to use for access logs.", - "id": "log-format", - "label": "Log format", - "regex": "^.*$", - "type": "text", - }, - "LOG_LEVEL": { - "context": "global", - "default": "notice", - "help": "The level to use for error logs.", - "id": "log-level", - "label": "Log level", - "regex": "^(debug|info|notice|warn|error|crit|alert|emerg)$", - "type": "select", - "select": [ - "alert", - "crit", - "debug", - "emerg", - "error", - "info", - "notice", - "warn", - ], - }, - "DNS_RESOLVERS": { - "context": "global", - "default": "127.0.0.11", - "help": "DNS addresses of resolvers to use.", - "id": "dns-resolvers", - "label": "DNS resolvers", - "regex": "^(?! )(( *[^ ]+)(?!.*\\2))*$", - "type": "text", - }, - "DATASTORE_MEMORY_SIZE": { - "context": "global", - "default": "64m", - "help": "Size of the internal datastore.", - "id": "datastore-memory-size", - "label": "Datastore memory size", - "regex": "^\\d+[kKmMgG]?$", - "type": "text", - }, - "CACHESTORE_MEMORY_SIZE": { - "context": "global", - "default": "64m", - "help": "Size of the internal cachestore.", - "id": "cachestore-memory-size", - "label": "Cachestore memory size", - "regex": "^\\d+[kKmMgG]?$", - "type": "text", - }, - "CACHESTORE_IPC_MEMORY_SIZE": { - "context": "global", - "default": "16m", - "help": "Size of the internal cachestore (ipc).", - "id": "cachestore-ipc-memory-size", - "label": "Cachestore ipc memory size", - "regex": "^\\d+[kKmMgG]?$", - "type": "text", - }, - "CACHESTORE_MISS_MEMORY_SIZE": { - "context": "global", - "default": "16m", - "help": "Size of the internal cachestore (miss).", - "id": "cachestore-miss-memory-size", - "label": "Cachestore miss memory size", - "regex": "^\\d+[kKmMgG]?$", - "type": "text", - }, - "CACHESTORE_LOCKS_MEMORY_SIZE": { - "context": "global", - "default": "16m", - "help": "Size of the internal cachestore (locks).", - "id": "cachestore-locks-memory-size", - "label": "Cachestore locks memory size", - "regex": "^\\d+[kKmMgG]?$", - "type": "text", - }, - "USE_API": { - "context": "global", - "default": "yes", - "help": "Activate the API to control BunkerWeb.", - "id": "use-api", - "label": "Activate API", - "regex": "^(yes|no)$", - "type": "check", - }, - "API_HTTP_PORT": { - "context": "global", - "default": "5000", - "help": "Listen port number for the API.", - "id": "api-http-listen", - "label": "API port number", - "regex": "^\\d+$", - "type": "text", - }, - "API_LISTEN_IP": { - "context": "global", - "default": "0.0.0.0", - "help": "Listen IP address for the API.", - "id": "api-ip-listen", - "label": "API listen IP", - "regex": "^.*$", - "type": "text", - }, - "API_SERVER_NAME": { - "context": "global", - "default": "bwapi", - "help": "Server name (virtual host) for the API.", - "id": "api-server-name", - "label": "API server name", - "regex": "^[^ ]{1,255}$", - "type": "text", - }, - "API_WHITELIST_IP": { - "context": "global", - "default": "127.0.0.0/8", - "help": "List of IP/network allowed to contact the API.", - "id": "api-whitelist-ip", - "label": "API whitelist IP", - "regex": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "type": "text", - }, - "AUTOCONF_MODE": { - "context": "global", - "default": "no", - "help": "Enable Autoconf Docker integration.", - "id": "autoconf-mode", - "label": "Autoconf mode", - "regex": "^(yes|no)$", - "type": "check", - }, - "SWARM_MODE": { - "context": "global", - "default": "no", - "help": "Enable Docker Swarm integration.", - "id": "swarm-mode", - "label": "Swarm mode", - "regex": "^(yes|no)$", - "type": "check", - }, - "KUBERNETES_MODE": { - "context": "global", - "default": "no", - "help": "Enable Kubernetes integration.", - "id": "kubernetes-mode", - "label": "Kubernetes mode", - "regex": "^(yes|no)$", - "type": "check", - }, - "SERVER_TYPE": { - "context": "multisite", - "default": "http", - "help": "Server type : http or stream.", - "id": "server-type", - "label": "Server type", - "regex": "^(http|stream)$", - "type": "select", - "select": ["http", "stream"], - }, - "LISTEN_STREAM": { - "context": "multisite", - "default": "yes", - "help": "Enable listening for non-ssl (passthrough).", - "id": "listen-stream", - "label": "Listen stream", - "regex": "^(yes|no)$", - "type": "check", - }, - "LISTEN_STREAM_PORT": { - "context": "multisite", - "default": "1337", - "help": "Listening port for non-ssl (passthrough).", - "id": "listen-stream-port", - "label": "Listen stream port", - "regex": "^[0-9]+$", - "type": "text", - }, - "LISTEN_STREAM_PORT_SSL": { - "context": "multisite", - "default": "4242", - "help": "Listening port for ssl (passthrough).", - "id": "listen-stream-port-ssl", - "label": "Listen stream port ssl", - "regex": "^[0-9]+$", - "type": "text", - }, - "USE_UDP": { - "context": "multisite", - "default": "no", - "help": "UDP listen instead of TCP (stream).", - "id": "use-udp", - "label": "Listen UDP", - "regex": "^(yes|no)$", - "type": "check", - }, - "USE_IPV6": { - "context": "global", - "default": "no", - "help": "Enable IPv6 connectivity.", - "id": "use-ipv6", - "label": "Use IPv6", - "regex": "^(yes|no)$", - "type": "check", - }, - "IS_DRAFT": { - "context": "multisite", - "default": "no", - "help": "Internal use : set to yes when the service is in draft mode.", - "id": "internal-use-draft", - "label": "internal use draft", - "regex": "^(yes|no)$", - "type": "check", - }, - "TIMERS_LOG_LEVEL": { - "context": "global", - "default": "debug", - "help": "Log level for timers.", - "id": "timers-log-level", - "label": "Timers log level", - "regex": "^(debug|info|notice|warn|err|crit|alert|emerg)$", - "type": "select", - "select": [ - "alert", - "crit", - "debug", - "emerg", - "err", - "info", - "notice", - "warn", - ], - }, - "BUNKERWEB_INSTANCES": { - "context": "global", - "default": "127.0.0.1", - "help": "List of BunkerWeb instances separated with spaces (format : fqdn-or-ip:5000 http://fqdn-or-ip:5000)", - "id": "bunkerweb-instances", - "label": "BunkerWeb instances", - "regex": "^.*$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "antibot", - "stream": "no", - "name": "Antibot", - "description": "Bot detection by using a challenge.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": True, - "settings": { - "USE_ANTIBOT": { - "context": "multisite", - "default": "no", - "help": "Activate antibot feature.", - "id": "use-antibot", - "label": "Antibot challenge", - "regex": "^(no|cookie|javascript|captcha|recaptcha|hcaptcha|turnstile)$", - "type": "select", - "select": [ - "captcha", - "cookie", - "hcaptcha", - "javascript", - "no", - "recaptcha", - "turnstile", - ], - }, - "ANTIBOT_URI": { - "context": "multisite", - "default": "/challenge", - "help": "Unused URI that clients will be redirected to to solve the challenge.", - "id": "antibot-uri", - "label": "Antibot URL", - "regex": "^\\/[\\w\\].~:\\/?#\\[@!$\\&'\\(\\)*+,;=\\-]*$", - "type": "text", - }, - "ANTIBOT_TIME_RESOLVE": { - "context": "multisite", - "default": "60", - "help": "Maximum time (in seconds) clients have to resolve the challenge. Once this time has passed, a new challenge will be generated.", - "id": "antibot-time-resolve", - "label": "Time to resolve", - "regex": "^[0-9]+$", - "type": "text", - }, - "ANTIBOT_TIME_VALID": { - "context": "multisite", - "default": "86400", - "help": "Maximum validity time of solved challenges. Once this time has passed, clients will need to resolve a new one.", - "id": "antibot-time-valid", - "label": "Time valid", - "regex": "^[0-9]+$", - "type": "text", - }, - "ANTIBOT_RECAPTCHA_SCORE": { - "context": "multisite", - "default": "0.7", - "help": "Minimum score required for reCAPTCHA challenge.", - "id": "antibot-recaptcha-score", - "label": "reCAPTCHA score", - "regex": "^(0\\.[1-9]|1\\.0)$", - "type": "text", - }, - "ANTIBOT_RECAPTCHA_SITEKEY": { - "context": "multisite", - "default": "", - "help": "Sitekey for reCAPTCHA challenge.", - "id": "antibot-recaptcha-sitekey", - "label": "reCAPTCHA sitekey", - "regex": "^[\\w\\-]*$", - "type": "text", - }, - "ANTIBOT_RECAPTCHA_SECRET": { - "context": "multisite", - "default": "", - "help": "Secret for reCAPTCHA challenge.", - "id": "antibot-recaptcha-secret", - "label": "reCAPTCHA secret", - "regex": "^[\\w\\-]*$", - "type": "password", - }, - "ANTIBOT_HCAPTCHA_SITEKEY": { - "context": "multisite", - "default": "", - "help": "Sitekey for hCaptcha challenge.", - "id": "antibot-hcaptcha-sitekey", - "label": "hCaptcha sitekey", - "regex": "^[a-zA-Z0-9\\-]*$", - "type": "text", - }, - "ANTIBOT_HCAPTCHA_SECRET": { - "context": "multisite", - "default": "", - "help": "Secret for hCaptcha challenge.", - "id": "antibot-hcaptcha-secret", - "label": "hCaptcha secret", - "regex": "^\\w*$", - "type": "password", - }, - "ANTIBOT_TURNSTILE_SITEKEY": { - "context": "multisite", - "default": "", - "help": "Sitekey for Turnstile challenge.", - "id": "antibot-turnstile-sitekey", - "label": "Turnstile sitekey", - "regex": "^(0x[\\w\\-]+)?$", - "type": "text", - }, - "ANTIBOT_TURNSTILE_SECRET": { - "context": "multisite", - "default": "", - "help": "Secret for Turnstile challenge.", - "id": "antibot-turnstile-secret", - "label": "Turnstile secret", - "regex": "^(0x[\\w\\-]+)?$", - "type": "password", - }, - }, - "checksum": None, - }, - { - "id": "authbasic", - "stream": "no", - "name": "Auth basic", - "description": "Enforce login before accessing a resource or the whole site using HTTP basic auth method.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "USE_AUTH_BASIC": { - "context": "multisite", - "default": "no", - "help": "Use HTTP basic auth", - "id": "use-auth-basic", - "label": "Use HTTP basic auth", - "regex": "^(yes|no)$", - "type": "check", - }, - "AUTH_BASIC_LOCATION": { - "context": "multisite", - "default": "sitewide", - "help": "URL of the protected resource or sitewide value.", - "id": "auth-basic-location", - "label": "Auth basic Location", - "regex": "^(sitewide|/[a-zA-Z0-9.\\/\\-]*)$", - "type": "text", - }, - "AUTH_BASIC_USER": { - "context": "multisite", - "default": "changeme", - "help": "Username", - "id": "auth-basic-user", - "label": "Auth basic Username", - "regex": "^[\\w\\-]+", - "type": "text", - }, - "AUTH_BASIC_PASSWORD": { - "context": "multisite", - "default": "changeme", - "help": "Password", - "id": "auth-basic-password", - "label": "Password", - "regex": "^.+", - "type": "password", - }, - "AUTH_BASIC_TEXT": { - "context": "multisite", - "default": "Restricted area", - "help": "Text to display", - "id": "auth-basic-text", - "label": "Text", - "regex": "^.+", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "backup", - "stream": "yes", - "name": "Backup", - "description": "Backup your data to a custom location. Ensure the safety and availability of your important files by creating regular backups.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": True, - "settings": { - "USE_BACKUP": { - "context": "global", - "default": "yes", - "help": "Enable or disable the backup feature", - "id": "use-backup", - "label": "Activate automatic backup", - "regex": "^(yes|no)$", - "type": "check", - }, - "BACKUP_SCHEDULE": { - "context": "global", - "default": "daily", - "help": "The frequency of the backup (daily, weekly or monthly)", - "id": "backup-schedule", - "label": "Backup schedule", - "regex": "^(daily|weekly|monthly)$", - "type": "select", - "select": ["daily", "monthly", "weekly"], - }, - "BACKUP_ROTATION": { - "context": "global", - "default": "7", - "help": "The number of backups to keep", - "id": "backup-rotation", - "label": "Backup rotation", - "regex": "^[1-9][0-9]*$", - "type": "text", - }, - "BACKUP_DIRECTORY": { - "context": "global", - "default": "/var/lib/bunkerweb/backups", - "help": "The directory where the backup will be stored", - "id": "backup-directory", - "label": "Backup directory", - "regex": "^.*$", - "type": "text", - }, - }, - "checksum": None, - "bwcli": {"list": "list.py", "restore": "restore.py", "save": "save.py"}, - }, - { - "id": "badbehavior", - "stream": "yes", - "name": "Bad behavior", - "description": "Ban IP generating too much 'bad' HTTP status code in a period of time.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": True, - "settings": { - "USE_BAD_BEHAVIOR": { - "context": "multisite", - "default": "yes", - "help": "Activate Bad behavior feature.", - "id": "use-bad-behavior", - "label": "Activate bad behavior", - "regex": "^(yes|no)$", - "type": "check", - }, - "BAD_BEHAVIOR_STATUS_CODES": { - "context": "multisite", - "default": "400 401 403 404 405 429 444", - "help": "List of HTTP status codes considered as 'bad'.", - "id": "bad-behavior-status-code", - "label": "Bad status codes", - "regex": "^( *([1-5]\\d{2})(?!.*\\2) *)+$", - "type": "text", - }, - "BAD_BEHAVIOR_THRESHOLD": { - "context": "multisite", - "default": "10", - "help": "Maximum number of 'bad' HTTP status codes within the period of time before IP is banned.", - "id": "bad-behavior-threshold", - "label": "Threshold", - "regex": "^[1-9][0-9]*", - "type": "text", - }, - "BAD_BEHAVIOR_COUNT_TIME": { - "context": "multisite", - "default": "60", - "help": "Period of time (in seconds) during which we count 'bad' HTTP status codes.", - "id": "bad-behavior-period", - "label": "Period (in seconds)", - "regex": "^\\d+", - "type": "text", - }, - "BAD_BEHAVIOR_BAN_TIME": { - "context": "multisite", - "default": "86400", - "help": "The duration time (in seconds) of a ban when the corresponding IP has reached the threshold.", - "id": "bad-behavior-ban-time", - "label": "Ban duration (in seconds)", - "regex": "^\\d+", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "blacklist", - "stream": "partial", - "name": "Blacklist", - "description": "Deny access based on internal and external IP/network/rDNS/ASN blacklists.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": True, - "settings": { - "USE_BLACKLIST": { - "context": "multisite", - "default": "yes", - "help": "Activate blacklist feature.", - "id": "use-blacklist", - "label": "Activate blacklisting", - "regex": "^(yes|no)$", - "type": "check", - }, - "BLACKLIST_IP": { - "context": "multisite", - "default": "", - "help": "List of IP/network, separated with spaces, to block.", - "id": "blacklist-ip", - "label": "Blacklist IP/network", - "regex": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "type": "text", - }, - "BLACKLIST_RDNS": { - "context": "multisite", - "default": ".shodan.io .censys.io", - "help": "List of reverse DNS suffixes, separated with spaces, to block.", - "id": "blacklist-rdns", - "label": "Blacklist reverse DNS", - "regex": "^( *(([^ ]+)(?!.*\\3( |$))) *)*$", - "type": "text", - }, - "BLACKLIST_RDNS_GLOBAL": { - "context": "multisite", - "default": "yes", - "help": "Only perform RDNS blacklist checks on global IP addresses.", - "id": "blacklist-rdns-global", - "label": "Blacklist reverse DNS global IPs", - "regex": "^(yes|no)$", - "type": "check", - }, - "BLACKLIST_ASN": { - "context": "multisite", - "default": "", - "help": "List of ASN numbers, separated with spaces, to block.", - "id": "blacklist-asn", - "label": "Blacklist ASN", - "regex": "^^( *((ASN?)?(\\d+)\\b(?!.*[SN ]\\4\\b)) *)*$", - "type": "text", - }, - "BLACKLIST_USER_AGENT": { - "context": "multisite", - "default": "", - "help": "List of User-Agent (PCRE regex), separated with spaces, to block.", - "id": "blacklist-user-agent", - "label": "Blacklist User-Agent", - "regex": "^.*$", - "type": "text", - }, - "BLACKLIST_URI": { - "context": "multisite", - "default": "", - "help": "List of URI (PCRE regex), separated with spaces, to block.", - "id": "blacklist-uri", - "label": "Blacklist URI", - "regex": "^( *(.*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "BLACKLIST_IGNORE_IP": { - "context": "multisite", - "default": "", - "help": "List of IP/network, separated with spaces, to ignore in the blacklist.", - "id": "blacklist-ignore-ip", - "label": "Blacklist ignore IP/network", - "regex": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "type": "text", - }, - "BLACKLIST_IGNORE_RDNS": { - "context": "multisite", - "default": "", - "help": "List of reverse DNS suffixes, separated with spaces, to ignore in the blacklist.", - "id": "blacklist-ignore-rdns", - "label": "Blacklist ignore reverse DNS", - "regex": "^( *(([^ ]+)(?!.*\\3( |$))) *)*$", - "type": "text", - }, - "BLACKLIST_IGNORE_ASN": { - "context": "multisite", - "default": "", - "help": "List of ASN numbers, separated with spaces, to ignore in the blacklist.", - "id": "blacklist-ignore-asn", - "label": "Blacklist ignore ASN", - "regex": "^^( *((ASN?)?(\\d+)\\b(?!.*[SN ]\\4\\b)) *)*$", - "type": "text", - }, - "BLACKLIST_IGNORE_USER_AGENT": { - "context": "multisite", - "default": "", - "help": "List of User-Agent (PCRE regex), separated with spaces, to ignore in the blacklist.", - "id": "blacklist-ignore-user-agent", - "label": "Blacklist ignore User-Agent", - "regex": "^.*$", - "type": "text", - }, - "BLACKLIST_IGNORE_URI": { - "context": "multisite", - "default": "", - "help": "List of URI (PCRE regex), separated with spaces, to ignore in the blacklist.", - "id": "blacklist-ignore-uri", - "label": "Blacklist ignore URI", - "regex": "^( *(.*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "BLACKLIST_IP_URLS": { - "context": "global", - "default": "https://www.dan.me.uk/torlist/?exit", - "help": "List of URLs, separated with spaces, containing bad IP/network to block.", - "id": "blacklist-ip-urls", - "label": "Blacklist IP/network URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "BLACKLIST_RDNS_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing reverse DNS suffixes to block.", - "id": "blacklist-rdns-urls", - "label": "Blacklist reverse DNS URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "BLACKLIST_ASN_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing ASN to block.", - "id": "blacklist-asn-urls", - "label": "Blacklist ASN URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "BLACKLIST_USER_AGENT_URLS": { - "context": "global", - "default": "https://raw.githubusercontent.com/mitchellkrogza/nginx-ultimate-bad-bot-blocker/master/_generator_lists/bad-user-agents.list", - "help": "List of URLs, separated with spaces, containing bad User-Agent to block.", - "id": "blacklist-user-agent-urls", - "label": "Blacklist User-Agent URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "BLACKLIST_URI_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing bad URI to block.", - "id": "blacklist-uri-urls", - "label": "Blacklist URI URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "BLACKLIST_IGNORE_IP_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing IP/network to ignore in the blacklist.", - "id": "blacklist-ignore-ip-urls", - "label": "Blacklist ignore IP/network URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "BLACKLIST_IGNORE_RDNS_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing reverse DNS suffixes to ignore in the blacklist.", - "id": "blacklist-ignore-rdns-urls", - "label": "Blacklist ignore reverse DNS URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "BLACKLIST_IGNORE_ASN_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing ASN to ignore in the blacklist.", - "id": "blacklist-ignore-asn-urls", - "label": "Blacklist ignore ASN URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "BLACKLIST_IGNORE_USER_AGENT_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing User-Agent to ignore in the blacklist.", - "id": "blacklist-ignore-user-agent-urls", - "label": "Blacklist ignore User-Agent URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "BLACKLIST_IGNORE_URI_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing URI to ignore in the blacklist.", - "id": "blacklist-ignore-uri-urls", - "label": "Blacklist ignore URI URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "brotli", - "stream": "no", - "name": "Brotli", - "description": "Compress HTTP requests with the brotli algorithm.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "USE_BROTLI": { - "context": "multisite", - "default": "no", - "help": "Use brotli", - "id": "use-brotli", - "label": "Use brotli", - "regex": "^(yes|no)$", - "type": "check", - }, - "BROTLI_TYPES": { - "context": "multisite", - "default": "application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml", - "help": "List of MIME types that will be compressed with brotli.", - "id": "brotli-types", - "label": "MIME types", - "regex": "^(?! )( ?([\\-\\w.]+/[\\-\\w.+]+)(?!.*\\2(?!.)))+$", - "type": "text", - }, - "BROTLI_MIN_LENGTH": { - "context": "multisite", - "default": "1000", - "help": "Minimum length for brotli compression.", - "id": "brotli-min-length", - "label": "Minimum length", - "regex": "^\\d+", - "type": "text", - }, - "BROTLI_COMP_LEVEL": { - "context": "multisite", - "default": "6", - "help": "The compression level of the brotli algorithm.", - "id": "brotli-comp-level", - "label": "Compression level", - "regex": "^([02-9]|1[01]?)$", - "type": "select", - "select": [ - "0", - "1", - "10", - "11", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - ], - }, - }, - "checksum": None, - }, - { - "id": "bunkernet", - "stream": "yes", - "name": "BunkerNet", - "description": "Share threat data with other BunkerWeb instances via BunkerNet.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": True, - "settings": { - "USE_BUNKERNET": { - "context": "multisite", - "default": "yes", - "help": "Activate BunkerNet feature.", - "id": "use-bunkernet", - "label": "Activate BunkerNet", - "regex": "^(yes|no)$", - "type": "check", - }, - "BUNKERNET_SERVER": { - "context": "global", - "default": "https://api.bunkerweb.io", - "help": "Address of the BunkerNet API.", - "id": "bunkernet-server", - "label": "BunkerNet server", - "regex": "^https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "cors", - "stream": "no", - "name": "CORS", - "description": "Cross-Origin Resource Sharing.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": True, - "settings": { - "USE_CORS": { - "context": "multisite", - "default": "no", - "help": "Use CORS", - "id": "use-cors", - "label": "Use CORS", - "regex": "^(yes|no)$", - "type": "check", - }, - "CORS_ALLOW_ORIGIN": { - "context": "multisite", - "default": "*", - "help": "Allowed origins to make CORS requests : PCRE regex or *.", - "id": "cors-allow-origin", - "label": "Allowed origins", - "regex": "^.*$", - "type": "text", - }, - "CORS_ALLOW_METHODS": { - "context": "multisite", - "default": "GET, POST, OPTIONS", - "help": "Value of the Access-Control-Allow-Methods header.", - "id": "cors-allow-methods", - "label": "Access-Control-Allow-Methods value", - "regex": "^(\\*|(?![, ])(,? ?(GET|HEAD|POST|PUT|DELETE|CONNECT|OPTIONS|TRACE|PATCH)(?!.*\\3))*)?$", - "type": "text", - }, - "CORS_ALLOW_HEADERS": { - "context": "multisite", - "default": "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range", - "help": "Value of the Access-Control-Allow-Headers header.", - "id": "cors-allow-headers", - "label": "Access-Control-Allow-Headers value", - "regex": "^(\\*|(?![, ])(,? ?([\\w\\-]+)(?!.*\\3(?!.)))*)?$", - "type": "text", - }, - "CORS_ALLOW_CREDENTIALS": { - "context": "multisite", - "default": "no", - "help": "Send the Access-Control-Allow-Credentials header.", - "id": "cors-allow-credentials", - "label": "Send Access-Control-Allow-Credentials", - "regex": "^(yes|no)$", - "type": "check", - }, - "CORS_EXPOSE_HEADERS": { - "context": "multisite", - "default": "Content-Length,Content-Range", - "help": "Value of the Access-Control-Expose-Headers header.", - "id": "cors-expose-headers", - "label": "Access-Control-Expose-Headers value", - "regex": "^(\\*|(?![, ]+)(,? ?([\\w\\-]+)(?!.*\\3(?!.)))*)?$", - "type": "text", - }, - "CROSS_ORIGIN_OPENER_POLICY": { - "context": "multisite", - "default": "", - "help": "Value for the Cross-Origin-Opener-Policy header.", - "id": "cross-origin-opener-policy", - "label": "Cross-Origin-Opener-Policy", - "regex": "^(unsafe-none|same-origin-allow-popups|same-origin)?$", - "type": "select", - "select": [ - "", - "same-origin", - "same-origin-allow-popups", - "unsafe-none", - ], - }, - "CROSS_ORIGIN_EMBEDDER_POLICY": { - "context": "multisite", - "default": "", - "help": "Value for the Cross-Origin-Embedder-Policy header.", - "id": "cross-origin-embedder-policy", - "label": "Cross-Origin-Embedder-Policy", - "regex": "^(unsafe-none|require-corp|credentialless)?$", - "type": "select", - "select": ["", "credentialless", "require-corp", "unsafe-none"], - }, - "CROSS_ORIGIN_RESOURCE_POLICY": { - "context": "multisite", - "default": "", - "help": "Value for the Cross-Origin-Resource-Policy header.", - "id": "cross-origin-resource-policy", - "label": "Cross-Origin-Resource-Policy", - "regex": "^(same-site|same-origin|cross-origin)?$", - "type": "select", - "select": ["", "cross-origin", "same-origin", "same-site"], - }, - "CORS_MAX_AGE": { - "context": "multisite", - "default": "86400", - "help": "Value of the Access-Control-Max-Age header.", - "id": "cors-max-age", - "label": "Access-Control-Max-Age value", - "regex": "^\\d+$", - "type": "text", - }, - "CORS_DENY_REQUEST": { - "context": "multisite", - "default": "yes", - "help": "Deny request and don't send it to backend if Origin is not allowed.", - "id": "cors-deny-request", - "label": "Deny request", - "regex": "^(yes|no)$", - "type": "check", - }, - }, - "checksum": None, - }, - { - "id": "clientcache", - "stream": "no", - "name": "Client cache", - "description": "Manage caching for clients.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "USE_CLIENT_CACHE": { - "context": "multisite", - "default": "no", - "help": "Tell client to store locally static files.", - "id": "use-client-cache", - "label": "Use client cache", - "regex": "^(yes|no)$", - "type": "check", - }, - "CLIENT_CACHE_EXTENSIONS": { - "context": "global", - "default": "jpg|jpeg|png|bmp|ico|svg|tif|css|js|otf|ttf|eot|woff|woff2", - "help": "List of file extensions, separated with pipes that should be cached.", - "id": "client-cache-extensions", - "label": "Extensions that should be cached by the client", - "regex": "^(?!\\|)(\\|?([a-z0-9]+)(?!.*\\2(?!.)))+$", - "type": "text", - }, - "CLIENT_CACHE_ETAG": { - "context": "multisite", - "default": "yes", - "help": "Send the HTTP ETag header for static resources.", - "id": "client-cache-etag", - "label": "ETag", - "regex": "^(yes|no)$", - "type": "check", - }, - "CLIENT_CACHE_CONTROL": { - "context": "multisite", - "default": "public, max-age=15552000", - "help": "Value of the Cache-Control HTTP header.", - "id": "client-cache-control", - "label": "Cache-Control header", - "regex": "^(?!(, ?| ))((, )?(((max-age|s-maxage|stale-while-revalidate|stale-if-error)=\\d+(?!.*\\6))|((?!.*public)private|(?!.*private)public)|(must|proxy)-revalidate|must-understand|immutable|no-(cache|store|transform))(?!.*\\4))+$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "country", - "stream": "yes", - "name": "Country", - "description": "Deny access based on the country of the client IP.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": True, - "settings": { - "BLACKLIST_COUNTRY": { - "context": "multisite", - "default": "", - "help": "Deny access if the country of the client is in the list (ISO 3166-1 alpha-2 format separated with spaces).", - "id": "country-blacklist", - "label": "Country blacklist", - "regex": "^(?! )( *([A-Z]{2})(?!.*\\2) *)*$", - "type": "text", - }, - "WHITELIST_COUNTRY": { - "context": "multisite", - "default": "", - "help": "Deny access if the country of the client is not in the list (ISO 3166-1 alpha-2 format separated with spaces).", - "id": "country-whitelist", - "label": "Country whitelist", - "regex": "^(?! )( *([A-Z]{2})(?!.*\\2) *)*$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "customcert", - "stream": "yes", - "name": "Custom HTTPS certificate", - "description": "Choose custom certificate for HTTPS.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "USE_CUSTOM_SSL": { - "context": "multisite", - "default": "no", - "help": "Use custom HTTPS certificate.", - "id": "use-custom-https", - "label": "Use custom certificate", - "regex": "^(yes|no)$", - "type": "check", - }, - "CUSTOM_SSL_CERT": { - "context": "multisite", - "default": "", - "help": "Full path of the certificate or bundle file (must be readable by the scheduler).", - "id": "custom-https-cert", - "label": "Certificate path", - "regex": "^(/[\\w. \\-]+)*/?$", - "type": "text", - }, - "CUSTOM_SSL_KEY": { - "context": "multisite", - "default": "", - "help": "Full path of the key file (must be readable by the scheduler).", - "id": "custom-https-key", - "label": "Key path", - "regex": "^(/[\\w. \\-]+)*/?$", - "type": "text", - }, - "CUSTOM_SSL_CERT_DATA": { - "context": "multisite", - "default": "", - "help": "Certificate data encoded in base64.", - "id": "custom-https-cert-data", - "label": "Certificate data (base64)", - "regex": "^.*$", - "type": "text", - }, - "CUSTOM_SSL_KEY_DATA": { - "context": "multisite", - "default": "", - "help": "Key data encoded in base64.", - "id": "custom-https-key-data", - "label": "Key data (base64)", - "regex": "^.*$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "db", - "stream": "yes", - "name": "DB", - "description": "Integrate easily the Database.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "DATABASE_URI": { - "context": "global", - "default": "sqlite:////var/lib/bunkerweb/db.sqlite3", - "help": "The database URI, following the sqlalchemy format.", - "id": "database-uri", - "label": "The database URI", - "regex": "^((postgresql|mysql|mariadb|sqlite)(\\+[\\w\\-]+)?:.+)?$", - "type": "text", - }, - "DATABASE_URI_READONLY": { - "context": "global", - "default": "", - "help": "The database URI for read-only operations, it can also serve as a fallback if the main database is down. Following the sqlalchemy format.", - "id": "database-uri-readonly", - "label": "The database URI for read-only operations", - "regex": "^((postgresql|mysql|mariadb|sqlite)(\\+[\\w\\-]+)?:.+)?$", - "type": "text", - }, - "DATABASE_LOG_LEVEL": { - "context": "global", - "default": "warning", - "help": "The level to use for database logs.", - "id": "database-log-level", - "label": "Database log level", - "regex": "^(debug|info|warn|warning|error)$", - "type": "select", - "select": ["debug", "error", "info", "warn", "warning"], - }, - }, - "checksum": None, - }, - { - "id": "dnsbl", - "stream": "yes", - "name": "DNSBL", - "description": "Deny access based on external DNSBL servers.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": True, - "settings": { - "USE_DNSBL": { - "context": "multisite", - "default": "yes", - "help": "Activate DNSBL feature.", - "id": "use-dnsbl", - "label": "Activate DNSBL", - "regex": "^(yes|no)$", - "type": "check", - }, - "DNSBL_LIST": { - "context": "global", - "default": "bl.blocklist.de problems.dnsbl.sorbs.net sbl.spamhaus.org xbl.spamhaus.org", - "help": "List of DNSBL servers.", - "id": "dnsbl-list", - "label": "DNSBL list", - "regex": "^(?! )( ?((?!\\.)[\\w.]+)(?!.*\\2(?!.)))*$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "errors", - "stream": "no", - "name": "Errors", - "description": "Manage default error pages", - "version": "1.0", - "type": "core", - "method": "manual", - "page": True, - "settings": { - "ERRORS": { - "context": "multisite", - "default": "", - "help": "List of HTTP error code and corresponding error pages, separated with spaces (404=/my404.html 403=/errors/403.html ...).", - "id": "errors", - "label": "Errors", - "regex": "^(?! )( ?([1-5]\\d{2})(?!.*\\2(?![^=]))=(\\/[\\w\\].~:\\/?#\\[@!$\\&'\\(\\)*+,;=\\-]*)(?!.*\\3(?!.)))*$", - "type": "text", - }, - "INTERCEPTED_ERROR_CODES": { - "context": "multisite", - "default": "400 401 403 404 405 413 429 500 501 502 503 504", - "help": "List of HTTP error code intercepted by BunkerWeb", - "id": "intercepted-error-codes", - "label": "Intercepted error codes", - "regex": "^( *([1-5]\\d{2})(?!.*\\2) *)+$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "greylist", - "stream": "partial", - "name": "Greylist", - "description": "Allow access while keeping security features based on internal and external IP/network/rDNS/ASN greylists.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": True, - "settings": { - "USE_GREYLIST": { - "context": "multisite", - "default": "no", - "help": "Activate greylist feature.", - "id": "use-greylist", - "label": "Activate greylisting", - "regex": "^(yes|no)$", - "type": "check", - }, - "GREYLIST_IP": { - "context": "multisite", - "default": "", - "help": "List of IP/network, separated with spaces, to put into the greylist.", - "id": "greylist-ip", - "label": "Greylist IP/network", - "regex": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "type": "text", - }, - "GREYLIST_RDNS": { - "context": "multisite", - "default": "", - "help": "List of reverse DNS suffixes, separated with spaces, to put into the greylist.", - "id": "greylist-rdns", - "label": "Greylist reverse DNS", - "regex": "^( *(([^ ]+)(?!.*\\3( |$))) *)*$", - "type": "text", - }, - "GREYLIST_RDNS_GLOBAL": { - "context": "multisite", - "default": "yes", - "help": "Only perform RDNS greylist checks on global IP addresses.", - "id": "greylist-rdns-global", - "label": "Greylist reverse DNS global IPs", - "regex": "^(yes|no)$", - "type": "check", - }, - "GREYLIST_ASN": { - "context": "multisite", - "default": "", - "help": "List of ASN numbers, separated with spaces, to put into the greylist.", - "id": "greylist-asn", - "label": "Greylist ASN", - "regex": "^^( *((ASN?)?(\\d+)\\b(?!.*[SN ]\\4\\b)) *)*$", - "type": "text", - }, - "GREYLIST_USER_AGENT": { - "context": "multisite", - "default": "", - "help": "List of User-Agent (PCRE regex), separated with spaces, to put into the greylist.", - "id": "greylist-user-agent", - "label": "Greylist User-Agent", - "regex": "^.*$", - "type": "text", - }, - "GREYLIST_URI": { - "context": "multisite", - "default": "", - "help": "List of URI (PCRE regex), separated with spaces, to put into the greylist.", - "id": "greylist-uri", - "label": "Greylist URI", - "regex": "^.*$", - "type": "text", - }, - "GREYLIST_IP_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing good IP/network to put into the greylist.", - "id": "greylist-ip-urls", - "label": "Greylist IP/network URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "GREYLIST_RDNS_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing reverse DNS suffixes to put into the greylist.", - "id": "greylist-rdns-urls", - "label": "Greylist reverse DNS URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "GREYLIST_ASN_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing ASN to put into the greylist.", - "id": "greylist-asn-urls", - "label": "Greylist ASN URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "GREYLIST_USER_AGENT_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing good User-Agent to put into the greylist.", - "id": "greylist-user-agent-urls", - "label": "Greylist User-Agent URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "GREYLIST_URI_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing bad URI to put into the greylist.", - "id": "greylist-uri-urls", - "label": "Greylist URI URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "gzip", - "stream": "no", - "name": "Gzip", - "description": "Compress HTTP requests with the gzip algorithm.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "USE_GZIP": { - "context": "multisite", - "default": "no", - "help": "Use gzip", - "id": "use-gzip", - "label": "Use gzip", - "regex": "^(yes|no)$", - "type": "check", - }, - "GZIP_TYPES": { - "context": "multisite", - "default": "application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml", - "help": "List of MIME types that will be compressed with gzip.", - "id": "gzip-types", - "label": "MIME types", - "regex": "^(?! )( ?([\\-\\w.]+/[\\-\\w.+]+)(?!.*\\2(?!.)))+$", - "type": "text", - }, - "GZIP_MIN_LENGTH": { - "context": "multisite", - "default": "1000", - "help": "Minimum length for gzip compression.", - "id": "gzip-min-length", - "label": "Minimum length", - "regex": "^\\d+$", - "type": "text", - }, - "GZIP_COMP_LEVEL": { - "context": "multisite", - "default": "5", - "help": "The compression level of the gzip algorithm.", - "id": "gzip-comp-level", - "label": "Compression level", - "regex": "^[1-9]$", - "type": "select", - "select": ["1", "2", "3", "4", "5", "6", "7", "8", "9"], - }, - "GZIP_PROXIED": { - "context": "multisite", - "default": "no-cache no-store private expired auth", - "help": "Which kind of proxied requests we should compress.", - "id": "gzip-proxied", - "label": "Proxied requests", - "regex": "^.*$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "inject", - "stream": "no", - "name": "HTML injection", - "description": "Inject custom HTML code before the tag.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "INJECT_BODY": { - "context": "multisite", - "default": "", - "help": "The HTML code to inject.", - "id": "inject-body", - "label": "HTML code", - "regex": "^.*$", - "type": "text", - } - }, - "checksum": None, - }, - { - "id": "headers", - "stream": "no", - "name": "Headers", - "description": "Manage HTTP headers sent to clients.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "CUSTOM_HEADER": { - "context": "multisite", - "default": "", - "help": "Custom header to add (HeaderName: HeaderValue).", - "id": "custom-header", - "label": "Custom header (HeaderName: HeaderValue)", - "regex": "^([\\w\\-]+: .+)?$", - "type": "text", - "multiple": "custom-headers", - }, - "REMOVE_HEADERS": { - "context": "multisite", - "default": "Server Expect-CT X-Powered-By X-AspNet-Version X-AspNetMvc-Version", - "help": "Headers to remove (Header1 Header2 Header3 ...)", - "id": "remove-headers", - "label": "Remove headers", - "regex": "^(?! )( ?[\\w\\-]+)*$", - "type": "text", - }, - "KEEP_UPSTREAM_HEADERS": { - "context": "multisite", - "default": "Content-Security-Policy Permissions-Policy Feature-Policy X-Frame-Options", - "help": "Headers to keep from upstream (Header1 Header2 Header3 ... or * for all).", - "id": "keep-upstream-headers", - "label": "Keep upstream headers", - "regex": "^((?! )( ?[\\w\\-]+)+|\\*)?$", - "type": "text", - }, - "STRICT_TRANSPORT_SECURITY": { - "context": "multisite", - "default": "max-age=31536000", - "help": "Value for the Strict-Transport-Security header.", - "id": "strict-transport-security", - "label": "Strict-Transport-Security", - "regex": "^max-age=\\d+(; includeSubDomains(; preload)?)?$", - "type": "text", - }, - "COOKIE_FLAGS": { - "context": "multisite", - "default": "* HttpOnly SameSite=Lax", - "help": "Cookie flags automatically added to all cookies (value accepted for nginx_cookie_flag_module).", - "id": "cookie-flags", - "label": "Cookie flags", - "regex": "^(\\*|[^;]+)( (HttpOnly|(SameSite)(?!.*\\4)(=(Lax|Strict))?)(?!.*\\3))*$", - "type": "text", - "multiple": "cookie-flags", - }, - "COOKIE_AUTO_SECURE_FLAG": { - "context": "multisite", - "default": "yes", - "help": "Automatically add the Secure flag to all cookies.", - "id": "cookie-auto-secure-flag", - "label": "Cookie auto Secure flag", - "regex": "^(yes|no)$", - "type": "check", - }, - "CONTENT_SECURITY_POLICY": { - "context": "multisite", - "default": "object-src 'none'; form-action 'self'; frame-ancestors 'self';", - "help": "Value for the Content-Security-Policy header.", - "id": "content-security-policy", - "label": "Content-Security-Policy", - "regex": "^.*$", - "type": "text", - }, - "CONTENT_SECURITY_POLICY_REPORT_ONLY": { - "context": "multisite", - "default": "no", - "help": "Send reports for violations of the Content-Security-Policy header instead of blocking them.", - "id": "content-security-policy-report-only", - "label": "Content-Security-Policy-Report-Only", - "regex": "^(yes|no)$", - "type": "check", - }, - "REFERRER_POLICY": { - "context": "multisite", - "default": "strict-origin-when-cross-origin", - "help": "Value for the Referrer-Policy header.", - "id": "referrer-policy", - "label": "Referrer-Policy", - "regex": "^(?!^(,| ))((, )?(no-referrer-when-downgrade|no-referrer|origin-when-cross-origin|same-origin|strict-origin-when-cross-origin|strict-origin|origin|unsafe-url)(?!\\b.*, \\4\\b))*$", - "type": "text", - }, - "PERMISSIONS_POLICY": { - "context": "multisite", - "default": "accelerometer=(), ambient-light-sensor=(), autoplay=(), battery=(), camera=(), cross-origin-isolated=(), display-capture=(), document-domain=(), encrypted-media=(), execution-while-not-rendered=(), execution-while-out-of-viewport=(), fullscreen=(), geolocation=(), gyroscope=(), hid=(), idle-detection=(), magnetometer=(), microphone=(), midi=(), navigation-override=(), payment=(), picture-in-picture=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), usb=(), web-share=(), xr-spatial-tracking=()", - "help": "Value for the Permissions-Policy header.", - "id": "permissions-policy", - "label": "Permissions-Policy", - "regex": "^(?![, ])(,? ?([a-z\\-]+)(?!.*[^\\-]\\2=)=(\\*|\\(( ?(self|\\u0022https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*\\u0022)(?=[ \\)]))*\\)))*$", - "type": "text", - }, - "FEATURE_POLICY": { - "context": "multisite", - "default": "accelerometer 'none'; ambient-light-sensor 'none'; autoplay 'none'; battery 'none'; camera 'none'; display-capture 'none'; document-domain 'none'; encrypted-media 'none'; execution-while-not-rendered 'none'; execution-while-out-of-viewport 'none'; fullscreen 'none'; geolocation 'none'; gyroscope 'none'; layout-animation 'none'; legacy-image-formats 'none'; magnetometer 'none'; microphone 'none'; midi 'none'; navigation-override 'none'; payment 'none'; picture-in-picture 'none'; publickey-credentials-get 'none'; speaker-selection 'none'; sync-xhr 'none'; unoptimized-images 'none'; unsized-media 'none'; usb 'none'; screen-wake-lock 'none'; web-share 'none'; xr-spatial-tracking 'none';", - "help": "Value for the Feature-Policy header.", - "id": "feature-policy", - "label": "Feature-Policy", - "regex": "^(?![; ])( ?([\\w\\-]+)(?!.*[^\\-]\\2 )( ('(none|self|strict-dynamic|report-sample|unsafe-inline|unsafe-eval|unsafe-hashes|unsafe-allow-redirects)'|https?:\\/\\/[\\w@:%.+~#=\\-]+[\\w\\(\\)!@:%+.~#?&\\/=$\\-]*))+;)*$", - "type": "text", - }, - "X_FRAME_OPTIONS": { - "context": "multisite", - "default": "SAMEORIGIN", - "help": "Value for the X-Frame-Options header.", - "id": "x-frame-options", - "label": "X-Frame-Options", - "regex": "^(DENY|SAMEORIGIN)?$", - "type": "select", - "select": ["", "DENY", "SAMEORIGIN"], - }, - "X_CONTENT_TYPE_OPTIONS": { - "context": "multisite", - "default": "nosniff", - "help": "Value for the X-Content-Type-Options header.", - "id": "x-content-type-options", - "label": "X-Content-Type-Options", - "regex": "^(nosniff)?$", - "type": "select", - "select": ["", "nosniff"], - }, - "X_XSS_PROTECTION": { - "context": "multisite", - "default": "1; mode=block", - "help": "Value for the X-XSS-Protection header.", - "id": "x-xss-protection", - "label": "X-XSS-Protection", - "regex": "^0|1(; (mode=block|report=https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*))?$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "jobs", - "stream": "yes", - "name": "Jobs", - "description": "Fake core plugin for internal jobs.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": {}, - "checksum": None, - }, - { - "id": "letsencrypt", - "stream": "yes", - "name": "Let's Encrypt", - "description": "Automatic creation, renewal and configuration of Let's Encrypt certificates.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "AUTO_LETS_ENCRYPT": { - "context": "multisite", - "default": "no", - "help": "Activate automatic Let's Encrypt mode.", - "id": "auto-lets-encrypt", - "label": "Automatic Let's Encrypt", - "regex": "^(yes|no)$", - "type": "check", - }, - "EMAIL_LETS_ENCRYPT": { - "context": "multisite", - "default": "", - "help": "Email used for Let's Encrypt notification and in certificate.", - "id": "email-lets-encrypt", - "label": "Email Let's Encrypt", - "regex": "^([^@ \\t\\r\\n]+@[^@ \\t\\r\\n]+\\.[^@ \\t\\r\\n]+)?$", - "type": "text", - }, - "USE_LETS_ENCRYPT_STAGING": { - "context": "multisite", - "default": "no", - "help": "Use the staging environment for Let’s Encrypt certificate generation. Useful when you are testing your deployments to avoid being rate limited in the production environment.", - "id": "use-lets-encrypt-staging", - "label": "Use Let's Encrypt Staging", - "regex": "^(yes|no)$", - "type": "check", - }, - "LETS_ENCRYPT_CLEAR_OLD_CERTS": { - "context": "global", - "default": "no", - "help": "Clear old certificates when renewing.", - "id": "lets-encrypt-clear-old-certs", - "label": "Clear old certificates when they are no longer needed", - "regex": "^(yes|no)$", - "type": "check", - }, - }, - "checksum": None, - }, - { - "id": "limit", - "stream": "partial", - "name": "Limit", - "description": "Limit maximum number of requests and connections.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": True, - "settings": { - "USE_LIMIT_REQ": { - "context": "multisite", - "default": "yes", - "help": "Activate limit requests feature.", - "id": "use-limit-req", - "label": "Activate limit requests", - "regex": "^(yes|no)$", - "type": "check", - }, - "LIMIT_REQ_URL": { - "context": "multisite", - "default": "/", - "help": "URL (PCRE regex) where the limit request will be applied or special value / for all requests.", - "id": "limit-req-url", - "label": "Limit request URL", - "regex": "^.+$", - "type": "text", - "multiple": "limit-req", - }, - "LIMIT_REQ_RATE": { - "context": "multisite", - "default": "2r/s", - "help": "Rate to apply to the URL (s for second, m for minute, h for hour and d for day).", - "id": "limit-req-rate", - "label": "Limit request Rate", - "regex": "^\\d+r/[smhd]$", - "type": "text", - "multiple": "limit-req", - }, - "USE_LIMIT_CONN": { - "context": "multisite", - "default": "yes", - "help": "Activate limit connections feature.", - "id": "use-limit-conn", - "label": "Activate limit connections", - "regex": "^(yes|no)$", - "type": "check", - }, - "LIMIT_CONN_MAX_HTTP1": { - "context": "multisite", - "default": "10", - "help": "Maximum number of connections per IP when using HTTP/1.X protocol.", - "id": "limit-conn-max-http1", - "label": "Maximum number of HTTP/1.X connections", - "regex": "^\\d+$", - "type": "text", - }, - "LIMIT_CONN_MAX_HTTP2": { - "context": "multisite", - "default": "100", - "help": "Maximum number of streams per IP when using HTTP/2 protocol.", - "id": "limit-conn-max-http2", - "label": "Maximum number of HTTP/2 streams", - "regex": "^\\d+$", - "type": "text", - }, - "LIMIT_CONN_MAX_STREAM": { - "context": "multisite", - "default": "10", - "help": "Maximum number of connections per IP when using stream.", - "id": "limit-conn-max-stream", - "label": "Maximum number of stream connections", - "regex": "^\\d+$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "metrics", - "stream": "partial", - "name": "Metrics", - "description": "Metrics collection and retrieve.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "USE_METRICS": { - "context": "multisite", - "default": "yes", - "help": "Enable collection and retrieval of internal metrics.", - "id": "use-metrics", - "label": "Use metrics", - "regex": "^(yes|no)$", - "type": "check", - }, - "METRICS_MEMORY_SIZE": { - "context": "global", - "default": "16m", - "help": "Size of the internal storage for metrics.", - "id": "metrics-memory-size", - "label": "Metrics memory size", - "regex": "^\\d+[kKmMgG]?$", - "type": "text", - }, - "METRICS_MAX_BLOCKED_REQUESTS": { - "context": "global", - "default": "100", - "help": "Maximum number of blocked requests to store (per worker).", - "id": "metrics-max-blocked-requests", - "label": "Metrics max blocked requests", - "regex": "^\\d+$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "misc", - "stream": "partial", - "name": "Miscellaneous", - "description": "Miscellaneous settings.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": True, - "settings": { - "DISABLE_DEFAULT_SERVER": { - "context": "global", - "default": "no", - "help": "Deny HTTP request if the request vhost is unknown.", - "id": "disable-default-server", - "label": "Disable default server", - "regex": "^(yes|no)$", - "type": "check", - }, - "DISABLE_DEFAULT_SERVER_STRICT_SNI": { - "context": "global", - "default": "no", - "help": "Close SSL/TLS connection if the SNI is unknown.", - "id": "disable-default-server-strict-sni", - "label": "Disable default server strict SNI", - "regex": "^(yes|no)$", - "type": "check", - }, - "REDIRECT_HTTP_TO_HTTPS": { - "context": "multisite", - "default": "no", - "help": "Redirect all HTTP request to HTTPS.", - "id": "redirect-http-to-https", - "label": "Redirect HTTP to HTTPS", - "regex": "^(yes|no)$", - "type": "check", - }, - "AUTO_REDIRECT_HTTP_TO_HTTPS": { - "context": "multisite", - "default": "yes", - "help": "Try to detect if HTTPS is used and activate HTTP to HTTPS redirection if that's the case.", - "id": "auto-redirect-http-to-https", - "label": "Auto redirect HTTP to HTTPS", - "regex": "^(yes|no)$", - "type": "check", - }, - "ALLOWED_METHODS": { - "context": "multisite", - "default": "GET|POST|HEAD", - "help": "Allowed HTTP and WebDAV methods, separated with pipes to be sent by clients.", - "id": "allowed-methods", - "label": "Allowed methods", - "regex": "^(?!\\|)(\\|?([A-Z]{3,})(?!.*(^|\\|)\\2))+$", - "type": "text", - }, - "MAX_CLIENT_SIZE": { - "context": "multisite", - "default": "10m", - "help": "Maximum body size (0 for infinite).", - "id": "max-client-size", - "label": "Maximum body size", - "regex": "^\\d+[kKmMgG]?$", - "type": "text", - }, - "SERVE_FILES": { - "context": "multisite", - "default": "yes", - "help": "Serve files from the local folder.", - "id": "serve-files", - "label": "Serve files", - "regex": "^(yes|no)$", - "type": "check", - }, - "ROOT_FOLDER": { - "context": "multisite", - "default": "", - "help": "Root folder containing files to serve (/var/www/html/{server_name} if unset).", - "id": "root-folder", - "label": "Root folder", - "regex": "^(/[\\w. \\-]+)*/?$", - "type": "text", - }, - "SSL_PROTOCOLS": { - "context": "multisite", - "default": "TLSv1.2 TLSv1.3", - "help": "The supported version of TLS. We recommend the default value TLSv1.2 TLSv1.3 for compatibility reasons.", - "id": "https-protocols", - "label": "HTTPS protocols", - "regex": "^(?! )( ?TLSv1\\.[0-3])*$", - "type": "text", - }, - "HTTP2": { - "context": "multisite", - "default": "yes", - "help": "Support HTTP2 protocol when HTTPS is enabled.", - "id": "http2", - "label": "HTTP2", - "regex": "^(yes|no)$", - "type": "check", - }, - "HTTP3": { - "context": "multisite", - "default": "no", - "help": "Support HTTP3 protocol when HTTPS is enabled.", - "id": "http3", - "label": "HTTP3", - "regex": "^(yes|no)$", - "type": "check", - }, - "HTTP3_ALT_SVC_PORT": { - "context": "multisite", - "default": "443", - "help": "HTTP3 alternate service port. This value will be used as part of the Alt-Svc header.", - "id": "http3-alt-svc-port", - "label": "HTTP3 Alt-Svc port", - "regex": "^\\d+$", - "type": "text", - }, - "LISTEN_HTTP": { - "context": "multisite", - "default": "yes", - "help": "Respond to (insecure) HTTP requests.", - "id": "http-listen", - "label": "HTTP listen", - "regex": "^(yes|no)$", - "type": "check", - }, - "USE_OPEN_FILE_CACHE": { - "context": "multisite", - "default": "no", - "help": "Enable open file cache feature", - "id": "use-open-file-cache", - "label": "Use open file cache", - "regex": "^(yes|no)$", - "type": "check", - }, - "OPEN_FILE_CACHE": { - "context": "multisite", - "default": "max=1000 inactive=20s", - "help": "Open file cache directive", - "id": "open-file-cache", - "label": "Use open file cache", - "regex": "^(off|max=\\d+( inactive=\\d+(ms?|[shdwMy]))?)$", - "type": "text", - }, - "OPEN_FILE_CACHE_ERRORS": { - "context": "multisite", - "default": "yes", - "help": "Enable open file cache for errors", - "id": "open-file-cache-errors", - "label": "Open file cache errors", - "regex": "^(yes|no)$", - "type": "check", - }, - "OPEN_FILE_CACHE_MIN_USES": { - "context": "multisite", - "default": "2", - "help": "Enable open file cache minimum uses", - "id": "open-file-cache-min-uses", - "label": "Open file cache min uses", - "regex": "^[1-9]\\d*$", - "type": "text", - }, - "OPEN_FILE_CACHE_VALID": { - "context": "multisite", - "default": "30s", - "help": "Open file cache valid time", - "id": "open-file-cache-valid", - "label": "Open file cache valid time", - "regex": "^\\d+(ms?|[shdwMy])$", - "type": "text", - }, - "EXTERNAL_PLUGIN_URLS": { - "context": "global", - "default": "", - "help": "List of external plugins URLs (direct download to .zip or .tar file) to download and install (URLs are separated with space).", - "id": "external-plugin-urls", - "label": "External plugin URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "DENY_HTTP_STATUS": { - "context": "global", - "default": "403", - "help": "HTTP status code to send when the request is denied (403 or 444). When using 444, BunkerWeb will close the connection.", - "id": "deny-http-status", - "label": "Deny HTTP status", - "regex": "^(403|444)$", - "type": "select", - "select": ["403", "444"], - }, - "SEND_ANONYMOUS_REPORT": { - "context": "global", - "default": "yes", - "help": "Send anonymous report to BunkerWeb maintainers.", - "id": "send-anonymous-report", - "label": "Send anonymous report", - "regex": "^(yes|no)$", - "type": "check", - }, - }, - "checksum": None, - }, - { - "id": "modsecurity", - "stream": "no", - "name": "ModSecurity", - "description": "Management of the ModSecurity WAF.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "USE_MODSECURITY": { - "context": "multisite", - "default": "yes", - "help": "Enable ModSecurity WAF.", - "id": "use-modsecurity", - "label": "Use ModSecurity", - "regex": "^(yes|no)$", - "type": "check", - }, - "USE_MODSECURITY_CRS": { - "context": "multisite", - "default": "yes", - "help": "Enable OWASP Core Rule Set.", - "id": "use-modsecurity-crs", - "label": "Use Core Rule Set", - "regex": "^(yes|no)$", - "type": "check", - }, - "MODSECURITY_CRS_VERSION": { - "context": "multisite", - "default": "3", - "help": "Version of the OWASP Core Rule Set to use with ModSecurity (3, 4 or nightly).", - "id": "modsecurity-crs-version", - "label": "Core Rule Set Version", - "regex": "^(3|4|nightly)$", - "type": "select", - "select": ["3", "4", "nightly"], - }, - "MODSECURITY_SEC_AUDIT_ENGINE": { - "context": "multisite", - "default": "RelevantOnly", - "help": "SecAuditEngine directive of ModSecurity.", - "id": "modsecurity-sec-audit-engine", - "label": "SecAuditEngine", - "regex": "^(On|RelevantOnly|Off)$", - "type": "select", - "select": ["Off", "On", "RelevantOnly"], - }, - "MODSECURITY_SEC_RULE_ENGINE": { - "context": "multisite", - "default": "On", - "help": "SecRuleEngine directive of ModSecurity.", - "id": "modsecurity-sec-rule-engine", - "label": "SecRuleEngine", - "regex": "^(On|DetectionOnly|Off)$", - "type": "select", - "select": ["DetectionOnly", "Off", "On"], - }, - "MODSECURITY_SEC_AUDIT_LOG_PARTS": { - "context": "multisite", - "default": "ABCFHZ", - "help": "SecAuditLogParts directive of ModSecurity.", - "id": "modsecurity-sec-audit-log-parts", - "label": "SecAuditLogParts", - "regex": "^A(([B-K])(?!.*\\2))+Z$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "php", - "stream": "no", - "name": "PHP", - "description": "Manage local or remote PHP-FPM.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "REMOTE_PHP": { - "context": "multisite", - "default": "", - "help": "Hostname of the remote PHP-FPM instance.", - "id": "remote-php", - "label": "Remote PHP", - "regex": "^((?=.{1,255}$)[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?(?:\\.[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?)*\\.?)?$", - "type": "text", - }, - "REMOTE_PHP_PATH": { - "context": "multisite", - "default": "", - "help": "Root folder containing files in the remote PHP-FPM instance.", - "id": "remote-php-path", - "label": "Remote PHP path", - "regex": "^(/[\\w. \\-]+)*/?$", - "type": "text", - }, - "LOCAL_PHP": { - "context": "multisite", - "default": "", - "help": "Path to the PHP-FPM socket file.", - "id": "local", - "label": "Local PHP", - "regex": "^(/[\\w. \\-]+)*/?$", - "type": "text", - }, - "LOCAL_PHP_PATH": { - "context": "multisite", - "default": "", - "help": "Root folder containing files in the local PHP-FPM instance.", - "id": "local-php-path", - "label": "Local PHP path", - "regex": "^(/[\\w. \\-]+)*/?$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "pro", - "stream": "no", - "name": "Pro", - "description": "Pro settings for the Pro version of BunkerWeb.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "PRO_LICENSE_KEY": { - "context": "global", - "default": "", - "help": "The License Key for the Pro version of BunkerWeb.", - "id": "pro-license-key", - "label": "Pro License Key", - "regex": "^.*$", - "type": "password", - } - }, - "checksum": None, - }, - { - "id": "realip", - "stream": "partial", - "name": "Real IP", - "description": "Get real IP of clients when BunkerWeb is behind a reverse proxy / load balancer.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "USE_REAL_IP": { - "context": "multisite", - "default": "no", - "help": "Retrieve the real IP of client.", - "id": "use-real-ip", - "label": "Use real ip", - "regex": "^(yes|no)$", - "type": "check", - }, - "USE_PROXY_PROTOCOL": { - "context": "multisite", - "default": "no", - "help": "Enable PROXY protocol communication.", - "id": "use-proxy-protocol", - "label": "Use PROXY protocol", - "regex": "^(yes|no)$", - "type": "check", - }, - "REAL_IP_FROM": { - "context": "multisite", - "default": "192.168.0.0/16 172.16.0.0/12 10.0.0.0/8", - "help": "List of trusted IPs / networks, separated with spaces, where proxied requests come from.", - "id": "real-ip-from", - "label": "Real IP from", - "regex": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "type": "text", - }, - "REAL_IP_HEADER": { - "context": "multisite", - "default": "X-Forwarded-For", - "help": "HTTP header containing the real IP or special value proxy_protocol for PROXY protocol.", - "id": "real-ip-header", - "label": "Real IP header", - "regex": "^(?! )(( ?(?!proxy_protocol)[\\w\\-]+)*|proxy_protocol)$", - "type": "text", - }, - "REAL_IP_RECURSIVE": { - "context": "multisite", - "default": "yes", - "help": "Perform a recursive search in the header container IP address.", - "id": "real-ip-recursive", - "label": "Real IP recursive", - "regex": "^(yes|no)$", - "type": "check", - }, - "REAL_IP_FROM_URLS": { - "context": "global", - "default": "", - "help": "List of URLs containing trusted IPs / networks, separated with spaces, where proxied requests come from.", - "id": "real-ip-from-urls", - "label": "Real IP from URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "redirect", - "stream": "no", - "name": "Redirect", - "description": "Manage HTTP redirects.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "REDIRECT_TO": { - "context": "multisite", - "default": "", - "help": "Redirect a whole site to another one.", - "id": "redirect-to", - "label": "Redirect to", - "regex": "^(https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)?$", - "type": "text", - }, - "REDIRECT_TO_REQUEST_URI": { - "context": "multisite", - "default": "no", - "help": "Append the requested URI to the redirect address.", - "id": "redirect-to-request-uri", - "label": "Append request URI", - "regex": "^(yes|no)$", - "type": "check", - }, - "REDIRECT_TO_STATUS_CODE": { - "context": "multisite", - "default": "301", - "help": "Status code to send to client when redirecting.", - "id": "redirect-to-status-code", - "label": "Append request URI", - "regex": "^(301|302)$", - "type": "select", - "select": ["301", "302"], - }, - }, - "checksum": None, - }, - { - "id": "redis", - "stream": "yes", - "name": "Redis", - "description": "Redis server configuration when using BunkerWeb in cluster mode.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": True, - "settings": { - "USE_REDIS": { - "context": "global", - "default": "no", - "help": "Activate Redis.", - "id": "use-redis", - "label": "Activate Redis", - "regex": "^(yes|no)$", - "type": "check", - }, - "REDIS_HOST": { - "context": "global", - "default": "", - "help": "Redis server IP or hostname.", - "id": "redis-host", - "label": "Redis server", - "regex": "^((?!-)[a-zA-Z0-9\\-]{1,63}(.[a-zA-Z]{2,})+|(\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3}|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)))?$", - "type": "text", - }, - "REDIS_PORT": { - "context": "global", - "default": "6379", - "help": "Redis server port.", - "id": "redis-port", - "label": "Redis port", - "regex": "^[0-9]+$", - "type": "text", - }, - "REDIS_DATABASE": { - "context": "global", - "default": "0", - "help": "Redis database number.", - "id": "redis-database", - "label": "Redis database", - "regex": "^[0-9]+$", - "type": "text", - }, - "REDIS_SSL": { - "context": "global", - "default": "no", - "help": "Use SSL/TLS connection with Redis server.", - "id": "redis-ssl", - "label": "Redis SSL/TLS", - "regex": "^(yes|no)$", - "type": "check", - }, - "REDIS_SSL_VERIFY": { - "context": "global", - "default": "no", - "help": "Verify the certificate of Redis server.", - "id": "redis-ssl-verify", - "label": "Redis SSL/TLS verify", - "regex": "^(yes|no)$", - "type": "check", - }, - "REDIS_TIMEOUT": { - "context": "global", - "default": "1000", - "help": "Redis server timeout (in ms) for connect, read and write.", - "id": "redis-timeout", - "label": "Redis timeout (ms)", - "regex": "^[0-9]+$", - "type": "text", - }, - "REDIS_USERNAME": { - "context": "global", - "default": "", - "help": "Redis username used in AUTH command.", - "id": "redis-username", - "label": "Redis username", - "regex": "^.*$", - "type": "text", - }, - "REDIS_PASSWORD": { - "context": "global", - "default": "", - "help": "Redis password used in AUTH command.", - "id": "redis-password", - "label": "Redis password", - "regex": "^.*$", - "type": "password", - }, - "REDIS_SENTINEL_HOSTS": { - "context": "global", - "default": "", - "help": "Redis sentinel hosts with format host:[port] separated with spaces.", - "id": "redis-sentinel-hosts", - "label": "Redis sentinel hosts", - "regex": "^.*$", - "type": "text", - }, - "REDIS_SENTINEL_USERNAME": { - "context": "global", - "default": "", - "help": "Redis sentinel username.", - "id": "redis-sentinel-username", - "label": "Redis sentinel username", - "regex": "^.*$", - "type": "text", - }, - "REDIS_SENTINEL_PASSWORD": { - "context": "global", - "default": "", - "help": "Redis sentinel password.", - "id": "redis-sentinel-password", - "label": "Redis sentinel password", - "regex": "^.*$", - "type": "password", - }, - "REDIS_SENTINEL_MASTER": { - "context": "global", - "default": "", - "help": "Redis sentinel master name.", - "id": "redis-sentinel-master", - "label": "Redis sentinel master", - "regex": "^.*$", - "type": "text", - }, - "REDIS_KEEPALIVE_IDLE": { - "context": "global", - "default": "30000", - "help": "Max idle time (in ms) before closing redis connection in the pool.", - "id": "redis-keepalive-idle", - "label": "Redis keepalive idle (ms)", - "regex": "^[0-9]+$", - "type": "text", - }, - "REDIS_KEEPALIVE_POOL": { - "context": "global", - "default": "10", - "help": "Max number of redis connection(s) kept in the pool.", - "id": "redis-keepalive-pool", - "label": "Redis keepalive pool", - "regex": "^[0-9]+$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "reverseproxy", - "stream": "partial", - "name": "Reverse proxy", - "description": "Manage reverse proxy configurations.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "USE_REVERSE_PROXY": { - "context": "multisite", - "default": "no", - "help": "Activate reverse proxy mode.", - "id": "use-reverse-proxy", - "label": "Use reverse proxy", - "regex": "^(yes|no)$", - "type": "check", - }, - "REVERSE_PROXY_INTERCEPT_ERRORS": { - "context": "multisite", - "default": "yes", - "help": "Intercept and rewrite errors.", - "id": "reverse-proxy-intercept-errors", - "label": "Intercept errors", - "regex": "^(yes|no)$", - "type": "check", - }, - "REVERSE_PROXY_CUSTOM_HOST": { - "context": "multisite", - "default": "", - "help": "Override Host header sent to upstream server.", - "id": "reverse-proxy-custom-host", - "label": "Reverse proxy custom host", - "regex": "^.*$", - "type": "text", - }, - "REVERSE_PROXY_HOST": { - "context": "multisite", - "default": "", - "help": "Full URL of the proxied resource (proxy_pass).", - "id": "reverse-proxy-host", - "label": "Reverse proxy host", - "regex": "^.*$", - "type": "text", - "multiple": "reverse-proxy", - }, - "REVERSE_PROXY_URL": { - "context": "multisite", - "default": "/", - "help": "Location URL that will be proxied.", - "id": "reverse-proxy-url", - "label": "Reverse proxy url", - "regex": "^.*$", - "type": "text", - "multiple": "reverse-proxy", - }, - "REVERSE_PROXY_WS": { - "context": "multisite", - "default": "no", - "help": "Enable websocket on the proxied resource.", - "id": "reverse-proxy-ws", - "label": "Reverse proxy WS", - "regex": "^(yes|no)$", - "type": "check", - "multiple": "reverse-proxy", - }, - "REVERSE_PROXY_HEADERS": { - "context": "multisite", - "default": "", - "help": "List of HTTP headers to send to proxied resource separated with semicolons (values for proxy_set_header directive).", - "id": "reverse-proxy-headers", - "label": "Reverse proxy headers", - "regex": "^(?![; ])(;? ?([\\w\\-]+)(?!.*\\2 ) [^;]+)*$", - "type": "text", - "multiple": "reverse-proxy", - }, - "REVERSE_PROXY_HEADERS_CLIENT": { - "context": "multisite", - "default": "", - "help": "List of HTTP headers to send to client separated with semicolons (values for add_header directive).", - "id": "reverse-proxy-headers-client", - "label": "Reverse proxy headers-client", - "regex": "^(?![; ])(;? ?([\\w\\-]+)(?!.*\\2 ) [^;]+)*$", - "type": "text", - "multiple": "reverse-proxy", - }, - "REVERSE_PROXY_BUFFERING": { - "context": "multisite", - "default": "yes", - "help": "Enable or disable buffering of responses from proxied resource.", - "id": "reverse-proxy-buffering", - "label": "Reverse proxy buffering", - "regex": "^(yes|no)$", - "type": "check", - "multiple": "reverse-proxy", - }, - "REVERSE_PROXY_KEEPALIVE": { - "context": "multisite", - "default": "no", - "help": "Enable or disable keepalive connections with the proxied resource.", - "id": "reverse-proxy-keepalive", - "label": "Reverse proxy keepalive", - "regex": "^(yes|no)$", - "type": "check", - "multiple": "reverse-proxy", - }, - "REVERSE_PROXY_AUTH_REQUEST": { - "context": "multisite", - "default": "", - "help": "Enable authentication using an external provider (value of auth_request directive).", - "id": "reverse-proxy-auth-request", - "label": "Reverse proxy auth request", - "regex": "^(\\/[\\w\\].~:\\/?#\\[@!$\\&'\\(\\)*+,;=\\-]*|off)?$", - "type": "text", - "multiple": "reverse-proxy", - }, - "REVERSE_PROXY_AUTH_REQUEST_SIGNIN_URL": { - "context": "multisite", - "default": "", - "help": "Redirect clients to sign-in URL when using REVERSE_PROXY_AUTH_REQUEST (used when auth_request call returned 401).", - "id": "reverse-proxy-auth-request-signin-url", - "label": "Auth request signin URL", - "regex": "^(https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)?$", - "type": "text", - "multiple": "reverse-proxy", - }, - "REVERSE_PROXY_AUTH_REQUEST_SET": { - "context": "multisite", - "default": "", - "help": "List of variables to set from the authentication provider, separated with semicolons (values of auth_request_set directives).", - "id": "reverse-proxy-auth-request-set", - "label": "Reverse proxy auth request set", - "regex": "^(?! ;)(;? ?(\\$[a-z_\\-]+)(?!.*\\2 ) [^;]+)*$", - "type": "text", - "multiple": "reverse-proxy", - }, - "REVERSE_PROXY_CONNECT_TIMEOUT": { - "context": "multisite", - "default": "60s", - "help": "Timeout when connecting to the proxied resource.", - "id": "reverse-proxy-connect-timeout", - "label": "Reverse proxy connect timeout", - "regex": "^\\d+(ms?|[shdwMy])$", - "type": "text", - "multiple": "reverse-proxy", - }, - "REVERSE_PROXY_READ_TIMEOUT": { - "context": "multisite", - "default": "60s", - "help": "Timeout when reading from the proxied resource.", - "id": "reverse-proxy-read-timeout", - "label": "Reverse proxy read timeout", - "regex": "^\\d+(ms?|[shdwMy])$", - "type": "text", - "multiple": "reverse-proxy", - }, - "REVERSE_PROXY_SEND_TIMEOUT": { - "context": "multisite", - "default": "60s", - "help": "Timeout when sending to the proxied resource.", - "id": "reverse-proxy-send-timeout", - "label": "Reverse proxy send timeout", - "regex": "^\\d+(ms?|[shdwMy])$", - "type": "text", - "multiple": "reverse-proxy", - }, - "REVERSE_PROXY_INCLUDES": { - "context": "multisite", - "default": "", - "help": "Additional configuration to include in the location block, separated with spaces.", - "id": "reverse-proxy-includes", - "label": "Reverse proxy includes", - "regex": "^(?! )( ?(\\w+)(?!.*\\b\\2\\b))*$", - "type": "text", - "multiple": "reverse-proxy", - }, - "USE_PROXY_CACHE": { - "context": "multisite", - "default": "no", - "help": "Enable or disable caching of the proxied resources.", - "id": "use-proxy-cache", - "label": "Reverse proxy cache", - "regex": "^(yes|no)$", - "type": "check", - }, - "PROXY_CACHE_PATH_LEVELS": { - "context": "global", - "default": "1:2", - "help": "Hierarchy levels of the cache.", - "id": "proxy-cache-path-levels", - "label": "Hierarchy levels", - "regex": "^(:?[12]){1,3}$", - "type": "text", - }, - "PROXY_CACHE_PATH_ZONE_SIZE": { - "context": "global", - "default": "10m", - "help": "Maximum size of cached metadata when caching proxied resources.", - "id": "proxy-cache-path-zone-size", - "label": "Reverse proxy cache zone size", - "regex": "^\\d+[kKmMgG]?$", - "type": "text", - }, - "PROXY_CACHE_PATH_PARAMS": { - "context": "global", - "default": "max_size=100m", - "help": "Additional parameters to add to the proxy_cache directive.", - "id": "proxy-cache-path-params", - "label": "Reverse proxy cache params", - "regex": "^.*$", - "type": "text", - }, - "PROXY_CACHE_METHODS": { - "context": "multisite", - "default": "GET HEAD", - "help": "HTTP methods that should trigger a cache operation.", - "id": "proxy-cache-methods", - "label": "Reverse proxy cache methods", - "regex": "^(?! )( ?(GET|HEAD|POST|PUT|DELETE|CONNECT|OPTIONS|TRACE|PATCH)(?!.*\\2))+$", - "type": "text", - }, - "PROXY_CACHE_MIN_USES": { - "context": "multisite", - "default": "2", - "help": "The minimum number of requests before a response is cached.", - "id": "proxy-cache-min-uses", - "label": "Reverse proxy cache minimum uses", - "regex": "^[1-9]\\d*$", - "type": "text", - }, - "PROXY_CACHE_KEY": { - "context": "multisite", - "default": "$scheme$host$request_uri", - "help": "The key used to uniquely identify a cached response.", - "id": "proxy-cache-key", - "label": "Reverse proxy cache key", - "regex": "^(?! )( ?(\\$[a-z_]+)(?!.*\\2))+$", - "type": "text", - }, - "PROXY_CACHE_VALID": { - "context": "multisite", - "default": "200=24h 301=1h 302=24h", - "help": "Define the caching time depending on the HTTP status code (list of status=time), separated with spaces.", - "id": "proxy-cache-valid", - "label": "Reverse proxy cache valid", - "regex": "^(?! )( ?([1-5]\\d{2})(?!.*\\2=)=\\d+(ms?|[shdwMy]))*$", - "type": "text", - }, - "PROXY_NO_CACHE": { - "context": "multisite", - "default": "$http_pragma $http_authorization", - "help": "Conditions to disable caching of responses.", - "id": "proxy-no-cache", - "label": "Reverse proxy no cache", - "regex": "^.*$", - "type": "text", - }, - "PROXY_CACHE_BYPASS": { - "context": "multisite", - "default": "0", - "help": "Conditions to bypass caching of responses.", - "id": "proxy-cache-bypass", - "label": "Reverse proxy bypass", - "regex": "^.*$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "reversescan", - "stream": "yes", - "name": "Reverse scan", - "description": "Scan clients ports to detect proxies or servers.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": True, - "settings": { - "USE_REVERSE_SCAN": { - "context": "multisite", - "default": "no", - "help": "Enable scanning of clients ports and deny access if one is opened.", - "id": "use-reverse-scan", - "label": "Reverse scan", - "regex": "^(no|yes)$", - "type": "check", - }, - "REVERSE_SCAN_PORTS": { - "context": "multisite", - "default": "22 80 443 3128 8000 8080", - "help": "List of port to scan when using reverse scan feature.", - "id": "reverse-scan-ports", - "label": "Reverse scan ports", - "regex": "^.*$", - "type": "text", - }, - "REVERSE_SCAN_TIMEOUT": { - "context": "multisite", - "default": "500", - "help": "Specify the maximum timeout (in ms) when scanning a port.", - "id": "reverse-scan-timeout", - "label": "Reverse scan timeout", - "regex": "^.*$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "selfsigned", - "stream": "yes", - "name": "Self-signed certificate", - "description": "Generate self-signed certificate.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "GENERATE_SELF_SIGNED_SSL": { - "context": "multisite", - "default": "no", - "help": "Generate and use self-signed certificate.", - "id": "generate-self-signed-ssl", - "label": "Activate self-signed certificate", - "regex": "^(yes|no)$", - "type": "check", - }, - "SELF_SIGNED_SSL_EXPIRY": { - "context": "multisite", - "default": "365", - "help": "Self-signed certificate expiry in days.", - "id": "self-signed-ssl-expiry", - "label": "Certificate expiry", - "regex": "^\\d+$", - "type": "text", - }, - "SELF_SIGNED_SSL_SUBJ": { - "context": "multisite", - "default": "/CN=www.example.com/", - "help": "Self-signed certificate subject.", - "id": "self-signed-ssl-subj", - "label": "Certificate subject", - "regex": "^/CN=[^,]+$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "sessions", - "stream": "yes", - "name": "Sessions", - "description": "Management of session used by other plugins.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "SESSIONS_SECRET": { - "context": "global", - "default": "random", - "help": "Secret used to encrypt sessions variables for storing data related to challenges.", - "id": "session-secret", - "label": "Sessions secret", - "regex": "^\\w+$", - "type": "password", - }, - "SESSIONS_NAME": { - "context": "global", - "default": "random", - "help": "Name of the cookie given to clients.", - "id": "sessions-name", - "label": "Sessions name", - "regex": "^\\w+$", - "type": "text", - }, - "SESSIONS_IDLING_TIMEOUT": { - "context": "global", - "default": "1800", - "help": "Maximum time (in seconds) of inactivity before the session is invalidated.", - "id": "sessions-idling-timeout", - "label": "Sessions idling timeout", - "regex": "^\\d+$", - "type": "text", - }, - "SESSIONS_ROLLING_TIMEOUT": { - "context": "global", - "default": "3600", - "help": "Maximum time (in seconds) before a session must be renewed.", - "id": "sessions-rolling-timeout", - "label": "Sessions rolling timeout", - "regex": "^\\d+$", - "type": "text", - }, - "SESSIONS_ABSOLUTE_TIMEOUT": { - "context": "global", - "default": "86400", - "help": "Maximum time (in seconds) before a session is destroyed.", - "id": "sessions-absolute-timeout", - "label": "Sessions absolute timeout", - "regex": "^\\d+$", - "type": "text", - }, - "SESSIONS_CHECK_IP": { - "context": "global", - "default": "yes", - "help": "Destroy session if IP address is different than original one.", - "id": "sessions-check-ip", - "label": "Sessions check IP", - "regex": "^(yes|no)$", - "type": "check", - }, - "SESSIONS_CHECK_USER_AGENT": { - "context": "global", - "default": "yes", - "help": "Destroy session if User-Agent is different than original one.", - "id": "sessions-user-agent", - "label": "Sessions check User-Agent", - "regex": "^(yes|no)$", - "type": "check", - }, - }, - "checksum": None, - }, - { - "id": "ui", - "stream": "no", - "name": "UI", - "description": "Integrate easily the BunkerWeb UI.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "USE_UI": { - "context": "multisite", - "default": "no", - "help": "Use UI", - "id": "use-ui", - "label": "Use UI", - "regex": "^(yes|no)$", - "type": "check", - }, - "UI_HOST": { - "context": "global", - "default": "", - "help": "Address of the web UI used for initial setup", - "id": "ui-host", - "label": "UI host", - "regex": "^.*$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "whitelist", - "stream": "partial", - "name": "Whitelist", - "description": "Allow access based on internal and external IP/network/rDNS/ASN whitelists.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": True, - "settings": { - "USE_WHITELIST": { - "context": "multisite", - "default": "yes", - "help": "Activate whitelist feature.", - "id": "use-whitelist", - "label": "Activate whitelisting", - "regex": "^(yes|no)$", - "type": "check", - }, - "WHITELIST_IP": { - "context": "multisite", - "default": "20.191.45.212 40.88.21.235 40.76.173.151 40.76.163.7 20.185.79.47 52.142.26.175 20.185.79.15 52.142.24.149 40.76.162.208 40.76.163.23 40.76.162.191 40.76.162.247", - "help": "List of IP/network, separated with spaces, to put into the whitelist.", - "id": "whitelist-ip", - "label": "Whitelist IP/network", - "regex": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "type": "text", - }, - "WHITELIST_RDNS": { - "context": "multisite", - "default": ".google.com .googlebot.com .yandex.ru .yandex.net .yandex.com .search.msn.com .baidu.com .baidu.jp .crawl.yahoo.net .fwd.linkedin.com .twitter.com .twttr.com .discord.com", - "help": "List of reverse DNS suffixes, separated with spaces, to whitelist.", - "id": "whitelist-rdns", - "label": "Whitelist reverse DNS", - "regex": "^( *(([^ ]+)(?!.*\\3( |$))) *)*$", - "type": "text", - }, - "WHITELIST_RDNS_GLOBAL": { - "context": "multisite", - "default": "yes", - "help": "Only perform RDNS whitelist checks on global IP addresses.", - "id": "whitelist-rdns-global", - "label": "Whitelist reverse DNS global IPs", - "regex": "^(yes|no)$", - "type": "check", - }, - "WHITELIST_ASN": { - "context": "multisite", - "default": "32934", - "help": "List of ASN numbers, separated with spaces, to whitelist.", - "id": "whitelist-asn", - "label": "Whitelist ASN", - "regex": "^^( *((ASN?)?(\\d+)\\b(?!.*[SN ]\\4\\b)) *)*$", - "type": "text", - }, - "WHITELIST_USER_AGENT": { - "context": "multisite", - "default": "", - "help": "List of User-Agent (PCRE regex), separated with spaces, to whitelist.", - "id": "whitelist-user-agent", - "label": "Whitelist User-Agent", - "regex": "^.*$", - "type": "text", - }, - "WHITELIST_URI": { - "context": "multisite", - "default": "", - "help": "List of URI (PCRE regex), separated with spaces, to whitelist.", - "id": "whitelist-uri", - "label": "Whitelist URI", - "regex": "^( *(.*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "WHITELIST_IP_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing good IP/network to whitelist.", - "id": "whitelist-ip-urls", - "label": "Whitelist IP/network URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "WHITELIST_RDNS_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing reverse DNS suffixes to whitelist.", - "id": "whitelist-rdns-urls", - "label": "Whitelist reverse DNS URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "WHITELIST_ASN_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing ASN to whitelist.", - "id": "whitelist-asn-urls", - "label": "Whitelist ASN URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "WHITELIST_USER_AGENT_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing good User-Agent to whitelist.", - "id": "whitelist-user-agent-urls", - "label": "Whitelist User-Agent URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "WHITELIST_URI_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing bad URI to whitelist.", - "id": "whitelist-uri-urls", - "label": "Whitelist URI URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - }, - "checksum": None, - }, -] - -# Global config -# Default global config with methods=True from docker-compose.ui.yml -global_config = { - "ERRORS": {"value": "", "global": True, "method": "default"}, - "USE_UI": {"value": "no", "global": True, "method": "default"}, - "USE_CORS": {"value": "no", "global": True, "method": "default"}, - "USE_GZIP": {"value": "yes", "global": True, "method": "scheduler"}, - "USE_DNSBL": {"value": "yes", "global": True, "method": "default"}, - "USE_REDIS": {"value": "no", "global": True, "method": "default"}, - "IS_LOADING": {"value": "no", "global": True, "method": "default"}, - "REMOTE_PHP": {"value": "", "global": True, "method": "default"}, - "USE_BACKUP": {"value": "yes", "global": True, "method": "default"}, - "USE_BROTLI": {"value": "no", "global": True, "method": "default"}, - "INJECT_BODY": {"value": "", "global": True, "method": "default"}, - "REDIRECT_TO": {"value": "", "global": True, "method": "default"}, - "USE_ANTIBOT": {"value": "no", "global": True, "method": "default"}, - "USE_METRICS": {"value": "yes", "global": True, "method": "default"}, - "USE_REAL_IP": {"value": "no", "global": True, "method": "default"}, - "DATABASE_URI": {"value": "sqlite:////var/lib/bunkerweb/db.sqlite3", "global": True, "method": "default"}, - "USE_GREYLIST": {"value": "no", "global": True, "method": "default"}, - "CUSTOM_HEADER": {"value": "", "global": True, "method": "default"}, - "USE_BLACKLIST": {"value": "no", "global": True, "method": "scheduler"}, - "USE_BUNKERNET": {"value": "no", "global": True, "method": "scheduler"}, - "USE_LIMIT_REQ": {"value": "yes", "global": True, "method": "default"}, - "USE_WHITELIST": {"value": "no", "global": True, "method": "scheduler"}, - "USE_AUTH_BASIC": {"value": "no", "global": True, "method": "default"}, - "USE_CUSTOM_SSL": {"value": "no", "global": True, "method": "default"}, - "PRO_LICENSE_KEY": {"value": "", "global": True, "method": "default"}, - "SESSIONS_SECRET": {"value": "random", "global": True, "method": "default"}, - "USE_MODSECURITY": {"value": "yes", "global": True, "method": "default"}, - "USE_SECURITYTXT": {"value": "no", "global": True, "method": "default"}, - "USE_BAD_BEHAVIOR": {"value": "yes", "global": True, "method": "default"}, - "USE_CLIENT_CACHE": {"value": "yes", "global": True, "method": "scheduler"}, - "USE_REVERSE_SCAN": {"value": "no", "global": True, "method": "default"}, - "AUTO_LETS_ENCRYPT": {"value": "no", "global": True, "method": "default"}, - "BLACKLIST_COUNTRY": {"value": "", "global": True, "method": "default"}, - "USE_REVERSE_PROXY": {"value": "no", "global": True, "method": "default"}, - "DISABLE_DEFAULT_SERVER": {"value": "yes", "global": True, "method": "scheduler"}, - "GENERATE_SELF_SIGNED_SSL": {"value": "no", "global": True, "method": "default"}, - "UI_HOST": {"value": "", "global": True, "method": "default"}, - "DNSBL_LIST": {"value": "bl.blocklist.de problems.dnsbl.sorbs.net sbl.spamhaus.org xbl.spamhaus.org", "global": True, "method": "default"}, - "GZIP_TYPES": { - "value": "application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml", - "global": True, - "method": "default", - }, - "REDIS_HOST": {"value": "", "global": True, "method": "default"}, - "ANTIBOT_URI": {"value": "/challenge", "global": True, "method": "default"}, - "GREYLIST_IP": {"value": "", "global": True, "method": "default"}, - "BLACKLIST_IP": {"value": "", "global": True, "method": "default"}, - "BROTLI_TYPES": { - "value": "application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml", - "global": True, - "method": "default", - }, - "NGINX_PREFIX": {"value": "/etc/nginx/", "global": True, "method": "default"}, - "WHITELIST_IP": { - "value": "20.191.45.212 40.88.21.235 40.76.173.151 40.76.163.7 20.185.79.47 52.142.26.175 20.185.79.15 52.142.24.149 40.76.162.208 40.76.163.23 40.76.162.191 40.76.162.247", - "global": True, - "method": "default", - }, - "LIMIT_REQ_URL": {"value": "/", "global": True, "method": "default"}, - "SESSIONS_NAME": {"value": "random", "global": True, "method": "default"}, - "REMOVE_HEADERS": {"value": "Server Expect-CT X-Powered-By X-AspNet-Version X-AspNetMvc-Version Public-Key-Pins", "global": True, "method": "default"}, - "BACKUP_SCHEDULE": {"value": "daily", "global": True, "method": "default"}, - "CUSTOM_SSL_CERT": {"value": "", "global": True, "method": "default"}, - "REMOTE_PHP_PATH": {"value": "", "global": True, "method": "default"}, - "SECURITYTXT_URI": {"value": "/.well-known/security.txt", "global": True, "method": "default"}, - "BUNKERNET_SERVER": {"value": "https://api.bunkerweb.io", "global": True, "method": "default"}, - "CORS_ALLOW_ORIGIN": {"value": "self", "global": True, "method": "default"}, - "WHITELIST_COUNTRY": {"value": "", "global": True, "method": "default"}, - "EMAIL_LETS_ENCRYPT": {"value": "", "global": True, "method": "default"}, - "REVERSE_SCAN_PORTS": {"value": "22 80 443 3128 8000 8080", "global": True, "method": "default"}, - "USE_PROXY_PROTOCOL": {"value": "no", "global": True, "method": "default"}, - "AUTH_BASIC_LOCATION": {"value": "sitewide", "global": True, "method": "default"}, - "METRICS_MEMORY_SIZE": {"value": "16m", "global": True, "method": "default"}, - "USE_MODSECURITY_CRS": {"value": "yes", "global": True, "method": "default"}, - "DATABASE_URI_READONLY": {"value": "", "global": True, "method": "default"}, - "SELF_SIGNED_SSL_EXPIRY": {"value": "365", "global": True, "method": "default"}, - "CLIENT_CACHE_EXTENSIONS": {"value": "jpg|jpeg|png|bmp|ico|svg|tif|css|js|otf|ttf|eot|woff|woff2", "global": True, "method": "default"}, - "INTERCEPTED_ERROR_CODES": {"value": "400 401 403 404 405 413 429 500 501 502 503 504", "global": True, "method": "default"}, - "REDIRECT_TO_REQUEST_URI": {"value": "no", "global": True, "method": "default"}, - "BAD_BEHAVIOR_STATUS_CODES": {"value": "400 401 403 404 405 429 444", "global": True, "method": "default"}, - "REVERSE_PROXY_INTERCEPT_ERRORS": {"value": "yes", "global": True, "method": "default"}, - "DISABLE_DEFAULT_SERVER_STRICT_SNI": {"value": "no", "global": True, "method": "default"}, - "HTTP_PORT": {"value": "8080", "global": True, "method": "default"}, - "LOCAL_PHP": {"value": "", "global": True, "method": "default"}, - "REDIS_PORT": {"value": "6379", "global": True, "method": "default"}, - "REAL_IP_FROM": {"value": "192.168.0.0/16 172.16.0.0/12 10.0.0.0/8", "global": True, "method": "default"}, - "GREYLIST_RDNS": {"value": "", "global": True, "method": "default"}, - "BLACKLIST_RDNS": {"value": ".shodan.io .censys.io", "global": True, "method": "default"}, - "CUSTOM_SSL_KEY": {"value": "", "global": True, "method": "default"}, - "LIMIT_REQ_RATE": {"value": "2r/s", "global": True, "method": "default"}, - "WHITELIST_RDNS": { - "value": ".google.com .googlebot.com .yandex.ru .yandex.net .yandex.com .search.msn.com .baidu.com .baidu.jp .crawl.yahoo.net .fwd.linkedin.com .twitter.com .twttr.com .discord.com", - "global": True, - "method": "default", - }, - "AUTH_BASIC_USER": {"value": "changeme", "global": True, "method": "default"}, - "BACKUP_ROTATION": {"value": "7", "global": True, "method": "default"}, - "GZIP_MIN_LENGTH": {"value": "1000", "global": True, "method": "default"}, - "BROTLI_MIN_LENGTH": {"value": "1000", "global": True, "method": "default"}, - "CLIENT_CACHE_ETAG": {"value": "yes", "global": True, "method": "default"}, - "CORS_ALLOW_METHODS": {"value": "GET, POST, OPTIONS", "global": True, "method": "default"}, - "DATABASE_LOG_LEVEL": {"value": "warning", "global": True, "method": "default"}, - "SECURITYTXT_CONTACT": {"value": "", "global": True, "method": "default"}, - "ANTIBOT_TIME_RESOLVE": {"value": "60", "global": True, "method": "default"}, - "REVERSE_SCAN_TIMEOUT": {"value": "500", "global": True, "method": "default"}, - "SELF_SIGNED_SSL_SUBJ": {"value": "/CN=www.example.com/", "global": True, "method": "default"}, - "KEEP_UPSTREAM_HEADERS": {"value": "Content-Security-Policy Permissions-Policy X-Frame-Options", "global": True, "method": "default"}, - "BAD_BEHAVIOR_THRESHOLD": {"value": "10", "global": True, "method": "default"}, - "REDIRECT_HTTP_TO_HTTPS": {"value": "no", "global": True, "method": "default"}, - "REDIRECT_TO_STATUS_CODE": {"value": "301", "global": True, "method": "default"}, - "SESSIONS_IDLING_TIMEOUT": {"value": "1800", "global": True, "method": "default"}, - "USE_LETS_ENCRYPT_STAGING": {"value": "no", "global": True, "method": "default"}, - "REVERSE_PROXY_CUSTOM_HOST": {"value": "", "global": True, "method": "default"}, - "USE_MODSECURITY_CRS_PLUGINS": {"value": "yes", "global": True, "method": "default"}, - "METRICS_MAX_BLOCKED_REQUESTS": {"value": "100", "global": True, "method": "default"}, - "HTTPS_PORT": {"value": "8443", "global": True, "method": "default"}, - "LOCAL_PHP_PATH": {"value": "", "global": True, "method": "default"}, - "REAL_IP_HEADER": {"value": "X-Forwarded-For", "global": True, "method": "default"}, - "REDIS_DATABASE": {"value": "0", "global": True, "method": "default"}, - "USE_LIMIT_CONN": {"value": "yes", "global": True, "method": "default"}, - "GZIP_COMP_LEVEL": {"value": "5", "global": True, "method": "default"}, - "BACKUP_DIRECTORY": {"value": "/var/lib/bunkerweb/backups", "global": True, "method": "default"}, - "BROTLI_COMP_LEVEL": {"value": "6", "global": True, "method": "default"}, - "ANTIBOT_TIME_VALID": {"value": "86400", "global": True, "method": "default"}, - "CORS_ALLOW_HEADERS": {"value": "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range", "global": True, "method": "default"}, - "AUTH_BASIC_PASSWORD": {"value": "changeme", "global": True, "method": "default"}, - "SECURITYTXT_EXPIRES": {"value": "", "global": True, "method": "default"}, - "CLIENT_CACHE_CONTROL": {"value": "public, max-age=15552000", "global": True, "method": "default"}, - "CUSTOM_SSL_CERT_DATA": {"value": "", "global": True, "method": "default"}, - "GREYLIST_RDNS_GLOBAL": {"value": "yes", "global": True, "method": "default"}, - "BLACKLIST_RDNS_GLOBAL": {"value": "yes", "global": True, "method": "default"}, - "REVERSE_PROXY_SSL_SNI": {"value": "no", "global": True, "method": "default"}, - "WHITELIST_RDNS_GLOBAL": {"value": "yes", "global": True, "method": "default"}, - "BAD_BEHAVIOR_COUNT_TIME": {"value": "60", "global": True, "method": "default"}, - "MODSECURITY_CRS_VERSION": {"value": "4", "global": True, "method": "default"}, - "SESSIONS_ROLLING_TIMEOUT": {"value": "3600", "global": True, "method": "default"}, - "STRICT_TRANSPORT_SECURITY": {"value": "max-age=31536000; includeSubDomains; preload", "global": True, "method": "default"}, - "AUTO_REDIRECT_HTTP_TO_HTTPS": {"value": "yes", "global": True, "method": "default"}, - "LETS_ENCRYPT_CLEAR_OLD_CERTS": {"value": "no", "global": True, "method": "default"}, - "MULTISITE": {"value": "yes", "global": True, "method": "scheduler"}, - "REDIS_SSL": {"value": "no", "global": True, "method": "default"}, - "COOKIE_FLAGS": {"value": "* HttpOnly SameSite=Lax", "global": True, "method": "default"}, - "GREYLIST_ASN": {"value": "", "global": True, "method": "default"}, - "GZIP_PROXIED": {"value": "no-cache no-store private expired auth", "global": True, "method": "default"}, - "BLACKLIST_ASN": {"value": "", "global": True, "method": "default"}, - "WHITELIST_ASN": {"value": "32934", "global": True, "method": "default"}, - "ALLOWED_METHODS": {"value": "GET|POST|HEAD", "global": True, "method": "default"}, - "AUTH_BASIC_TEXT": {"value": "Restricted area", "global": True, "method": "default"}, - "REAL_IP_RECURSIVE": {"value": "yes", "global": True, "method": "default"}, - "CUSTOM_SSL_KEY_DATA": {"value": "", "global": True, "method": "default"}, - "LIMIT_CONN_MAX_HTTP1": {"value": "10", "global": True, "method": "default"}, - "BAD_BEHAVIOR_BAN_TIME": {"value": "86400", "global": True, "method": "default"}, - "CORS_ALLOW_CREDENTIALS": {"value": "no", "global": True, "method": "default"}, - "SECURITYTXT_ENCRYPTION": {"value": "", "global": True, "method": "default"}, - "ANTIBOT_RECAPTCHA_SCORE": {"value": "0.7", "global": True, "method": "default"}, - "SESSIONS_ABSOLUTE_TIMEOUT": {"value": "86400", "global": True, "method": "default"}, - "REVERSE_PROXY_SSL_SNI_NAME": {"value": "", "global": True, "method": "default"}, - "MODSECURITY_CRS_PLUGIN_URLS": {"value": "", "global": True, "method": "default"}, - "SERVER_NAME": {"value": "app1.example.com www.example.com", "global": True, "method": "default"}, - "MAX_CLIENT_SIZE": {"value": "10m", "global": True, "method": "default"}, - "REDIS_SSL_VERIFY": {"value": "no", "global": True, "method": "default"}, - "REAL_IP_FROM_URLS": {"value": "", "global": True, "method": "default"}, - "SESSIONS_CHECK_IP": {"value": "yes", "global": True, "method": "default"}, - "REVERSE_PROXY_HOST": {"value": "dzq", "global": True, "method": "ui"}, - "CORS_EXPOSE_HEADERS": {"value": "Content-Length,Content-Range", "global": True, "method": "default"}, - "GREYLIST_USER_AGENT": {"value": "", "global": True, "method": "default"}, - "BLACKLIST_USER_AGENT": {"value": "", "global": True, "method": "default"}, - "LIMIT_CONN_MAX_HTTP2": {"value": "100", "global": True, "method": "default"}, - "WHITELIST_USER_AGENT": {"value": "", "global": True, "method": "default"}, - "COOKIE_AUTO_SECURE_FLAG": {"value": "yes", "global": True, "method": "default"}, - "ANTIBOT_RECAPTCHA_SITEKEY": {"value": "", "global": True, "method": "default"}, - "MODSECURITY_SEC_AUDIT_ENGINE": {"value": "RelevantOnly", "global": True, "method": "default"}, - "SECURITYTXT_ACKNOWLEDGEMENTS": {"value": "", "global": True, "method": "default"}, - "SERVE_FILES": {"value": "no", "global": True, "method": "scheduler"}, - "GREYLIST_URI": {"value": "", "global": True, "method": "default"}, - "BLACKLIST_URI": {"value": "", "global": True, "method": "default"}, - "REDIS_TIMEOUT": {"value": "1000", "global": True, "method": "default"}, - "WHITELIST_URI": {"value": "", "global": True, "method": "default"}, - "WORKER_PROCESSES": {"value": "auto", "global": True, "method": "default"}, - "REVERSE_PROXY_URL": {"value": "/", "global": True, "method": "default"}, - "LIMIT_CONN_MAX_STREAM": {"value": "10", "global": True, "method": "default"}, - "CONTENT_SECURITY_POLICY": {"value": "object-src 'none'; form-action 'self'; frame-ancestors 'self';", "global": True, "method": "default"}, - "ANTIBOT_RECAPTCHA_SECRET": {"value": "", "global": True, "method": "default"}, - "SESSIONS_CHECK_USER_AGENT": {"value": "yes", "global": True, "method": "default"}, - "CROSS_ORIGIN_OPENER_POLICY": {"value": "same-origin", "global": True, "method": "default"}, - "SECURITYTXT_PREFERRED_LANG": {"value": "en", "global": True, "method": "default"}, - "MODSECURITY_SEC_RULE_ENGINE": {"value": "On", "global": True, "method": "default"}, - "ROOT_FOLDER": {"value": "", "global": True, "method": "default"}, - "REDIS_USERNAME": {"value": "", "global": True, "method": "default"}, - "GREYLIST_IP_URLS": {"value": "", "global": True, "method": "default"}, - "REVERSE_PROXY_WS": {"value": "no", "global": True, "method": "default"}, - "WHITELIST_IP_URLS": {"value": "", "global": True, "method": "default"}, - "BLACKLIST_IGNORE_IP": {"value": "", "global": True, "method": "default"}, - "WORKER_RLIMIT_NOFILE": {"value": "2048", "global": True, "method": "default"}, - "SECURITYTXT_CANONICAL": {"value": "", "global": True, "method": "default"}, - "ANTIBOT_HCAPTCHA_SITEKEY": {"value": "", "global": True, "method": "default"}, - "CROSS_ORIGIN_EMBEDDER_POLICY": {"value": "require-corp", "global": True, "method": "default"}, - "MODSECURITY_SEC_AUDIT_LOG_PARTS": {"value": "ABCFHZ", "global": True, "method": "default"}, - "CONTENT_SECURITY_POLICY_REPORT_ONLY": {"value": "no", "global": True, "method": "default"}, - "SSL_PROTOCOLS": {"value": "TLSv1.2 TLSv1.3", "global": True, "method": "default"}, - "REDIS_PASSWORD": {"value": "", "global": True, "method": "default"}, - "REFERRER_POLICY": {"value": "strict-origin-when-cross-origin", "global": True, "method": "default"}, - "GREYLIST_RDNS_URLS": {"value": "", "global": True, "method": "default"}, - "SECURITYTXT_POLICY": {"value": "", "global": True, "method": "default"}, - "WORKER_CONNECTIONS": {"value": "1024", "global": True, "method": "default"}, - "WHITELIST_2024-07-27T15:51:01.203516525Z RDNS_URLS": {"value": "", "global": True, "method": "default"}, - "BLACKLIST_IGNORE_RDNS": {"value": "", "global": True, "method": "default"}, - "REVERSE_PROXY_HEADERS": {"value": "", "global": True, "method": "default"}, - "ANTIBOT_HCAPTCHA_SECRET": {"value": "", "global": True, "method": "default"}, - "CROSS_ORIGIN_RESOURCE_POLICY": {"value": "same-site", "global": True, "method": "default"}, - "HTTP2": {"value": "yes", "global": True, "method": "default"}, - "LOG_FORMAT": { - "value": '$host $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"', - "global": True, - "method": "default", - }, - "CORS_MAX_AGE": {"value": "86400", "global": True, "method": "default"}, - "GREYLIST_ASN_URLS": {"value": "", "global": True, "method": "default"}, - "PERMISSIONS_POLICY": { - "value": "accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), battery=(), bluetooth=(), browsing-topics=(), camera=(), compute-pressure=(), display-capture=(), document-domain=(), encrypted-media=(), execution-while-not-rendered=(), execution-while-out-of-viewport=(), fullscreen=(), gamepad=(), geolocation=(), gyroscope=(), hid=(), identity-credentials-get=(), idle-detection=(), local-fonts=(), magnetometer=(), microphone=(), midi=(), otp-credentials=(), payment=(), picture-in-picture=(), publickey-credentials-create=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), speaker-selection=(), storage-access=(), usb=(), web-share=(), window-management=(), xr-spatial-tracking=()", - "global": True, - "method": "default", - }, - "SECURITYTXT_HIRING": {"value": "", "global": True, "method": "default"}, - "WHITELIST_ASN_URLS": {"value": "", "global": True, "method": "default"}, - "BLACKLIST_IGNORE_ASN": {"value": "", "global": True, "method": "default"}, - "REDIS_SENTINEL_HOSTS": {"value": "", "global": True, "method": "default"}, - "ANTIBOT_TURNSTILE_SITEKEY": {"value": "", "global": True, "method": "default"}, - "REVERSE_PROXY_HEADERS_CLIENT": {"value": "", "global": True, "method": "default"}, - "HTTP3": {"value": "no", "global": True, "method": "default"}, - "LOG_LEVEL": {"value": "info", "global": True, "method": "scheduler"}, - "DISABLE_FLOC": {"value": "yes", "global": True, "method": "default"}, - "SECURITYTXT_CSAF": {"value": "", "global": True, "method": "default"}, - "CORS_DENY_REQUEST": {"value": "yes", "global": True, "method": "default"}, - "REDIS_SENTINEL_USERNAME": {"value": "", "global": True, "method": "default"}, - "REVERSE_PROXY_BUFFERING": {"value": "yes", "global": True, "method": "default"}, - "ANTIBOT_TURNSTILE_SECRET": {"value": "", "global": True, "method": "default"}, - "GREYLIST_USER_AGENT_URLS": {"value": "", "global": True, "method": "default"}, - "WHITELIST_USER_AGENT_URLS": {"value": "", "global": True, "method": "default"}, - "BLACKLIST_IGNORE_USER_AGENT": {"value": "", "global": True, "method": "default"}, - "DNS_RESOLVERS": {"value": "127.0.0.11", "global": True, "method": "default"}, - "X_FRAME_OPTIONS": {"value": "SAMEORIGIN", "global": True, "method": "default"}, - "GREYLIST_URI_URLS": {"value": "", "global": True, "method": "default"}, - "HTTP3_ALT_SVC_PORT": {"value": "443", "global": True, "method": "default"}, - "WHITELIST_URI_URLS": {"value": "", "global": True, "method": "default"}, - "BLACKLIST_IGNORE_URI": {"value": "", "global": True, "method": "default"}, - "REDIS_SENTINEL_PASSWORD": {"value": "", "global": True, "method": "default"}, - "REVERSE_PROXY_KEEPALIVE": {"value": "no", "global": True, "method": "default"}, - "LISTEN_HTTP": {"value": "yes", "global": True, "method": "default"}, - "BLACKLIST_IP_URLS": {"value": "https://www.dan.me.uk/torlist/?exit", "global": True, "method": "default"}, - "DATASTORE_MEMORY_SIZE": {"value": "64m", "global": True, "method": "default"}, - "REDIS_SENTINEL_MASTER": {"value": "", "global": True, "method": "default"}, - "X_CONTENT_TYPE_OPTIONS": {"value": "nosniff", "global": True, "method": "default"}, - "REVERSE_PROXY_AUTH_REQUEST": {"value": "", "global": True, "method": "default"}, - "X_XSS_PROTECTION": {"value": "1; mode=block", "global": True, "method": "default"}, - "BLACKLIST_RDNS_URLS": {"value": "", "global": True, "method": "default"}, - "USE_OPEN_FILE_CACHE": {"value": "no", "global": True, "method": "default"}, - "REDIS_KEEPALIVE_IDLE": {"value": "30000", "global": True, "method": "default"}, - "CACHESTORE_MEMORY_SIZE": {"value": "64m", "global": True, "method": "default"}, - "REVERSE_PROXY_AUTH_REQUEST_SIGNIN_URL": {"value": "", "global": True, "method": "default"}, - "OPEN_FILE_CACHE": {"value": "max=1000 inactive=20s", "global": True, "method": "default"}, - "BLACKLIST_ASN_URLS": {"value": "", "global": True, "method": "default"}, - "REDIS_KEEPALIVE_POOL": {"value": "10", "global": True, "method": "default"}, - "X_DNS_PREFETCH_CONTROL": {"value": "off", "global": True, "method": "default"}, - "CACHESTORE_IPC_MEMORY_SIZE": {"value": "16m", "global": True, "method": "default"}, - "REVERSE_PROXY_AUTH_REQUEST_SET": {"value": "", "global": True, "method": "default"}, - "OPEN_FILE_CACHE_ERRORS": {"value": "yes", "global": True, "method": "default"}, - "BLACKLIST_USER_AGENT_URLS": { - "value": "https://raw.githubusercontent.com/mitchellkrogza/nginx-ultimate-bad-bot-blocker/master/_generator_lists/bad-user-agents.list", - "global": True, - "method": "default", - }, - "CACHESTORE_MISS_MEMORY_SIZE": {"value": "16m", "global": True, "method": "default"}, - "REVERSE_PROXY_CONNECT_TIMEOUT": {"value": "60s", "global": True, "method": "default"}, - "BLACKLIST_URI_URLS": {"value": "", "global": True, "method": "default"}, - "OPEN_FILE_CACHE_MIN_USES": {"value": "2", "global": True, "method": "default"}, - "REVERSE_PROXY_READ_TIMEOUT": {"value": "60s", "global": True, "method": "default"}, - "CACHESTORE_LOCKS_MEMORY_SIZE": {"value": "16m", "global": True, "method": "default"}, - "USE_API": {"value": "yes", "global": True, "method": "default"}, - "OPEN_FILE_CACHE_VALID": {"value": "30s", "global": True, "method": "default"}, - "BLACKLIST_IGNORE_IP_URLS": {"value": "", "global": True, "method": "default"}, - "REVERSE_PROXY_SEND_TIMEOUT": {"value": "60s", "global": True, "method": "default"}, - "API_HTTP_PORT": {"value": "5000", "global": True, "method": "default"}, - "EXTERNAL_PLUGIN_URLS": {"value": "", "global": True, "method": "default"}, - "REVERSE_PROXY_INCLUDES": {"value": "", "global": True, "method": "default"}, - "BLACKLIST_IGNORE_RDNS_URLS": {"value": "", "global": True, "method": "default"}, - "API_LISTEN_IP": {"value": "0.0.0.0", "global": True, "method": "default"}, - "DENY_HTTP_STATUS": {"value": "403", "global": True, "method": "default"}, - "BLACKLIST_IGNORE_ASN_URLS": {"value": "", "global": True, "method": "default"}, - "REVERSE_PROXY_PASS_REQUEST_BODY": {"value": "yes", "global": True, "method": "default"}, - "API_SERVER_NAME": {"value": "bwapi", "global": True, "method": "default"}, - "USE_PROXY_CACHE": {"value": "no", "global": True, "method": "default"}, - "SEND_ANONYMOUS_REPORT": {"value": "no", "global": True, "method": "scheduler"}, - "BLACKLIST_IGNORE_USER_AGENT_URLS": {"value": "", "global": True, "method": "default"}, - "API_WHITELIST_IP": {"value": "127.0.0.0/24 10.20.30.0/24", "global": True, "method": "scheduler"}, - "PROXY_CACHE_PATH_LEVELS": {"value": "1:2", "global": True, "method": "default"}, - "BLACKLIST_IGNORE_URI_URLS": {"value": "", "global": True, "method": "default"}, - "AUTOCONF_MODE": {"value": "no", "global": True, "method": "default"}, - "PROXY_CACHE_PATH_ZONE_SIZE": {"value": "10m", "global": True, "method": "default"}, - "SWARM_MODE": {"value": "no", "global": True, "method": "default"}, - "PROXY_CACHE_PATH_PARAMS": {"value": "max_size=100m", "global": True, "method": "default"}, - "KUBERNETES_MODE": {"value": "no", "global": True, "method": "default"}, - "PROXY_CACHE_METHODS": {"value": "GET HEAD", "global": True, "method": "default"}, - "SERVER_TYPE": {"value": "http", "global": True, "method": "default"}, - "PROXY_CACHE_MIN_USES": {"value": "2", "global": True, "method": "default"}, - "LISTEN_STREAM": {"value": "yes", "global": True, "method": "default"}, - "PROXY_CACHE_KEY": {"value": "$scheme$host$request_uri", "global": True, "method": "default"}, - "PROXY_CACHE_VALID": {"value": "200=24h 301=1h 302=24h", "global": True, "method": "default"}, - "LISTEN_STREAM_PORT": {"value": "1337", "global": True, "method": "default"}, - "PROXY_NO_CACHE": {"value": "$http_pragma $http_authorization", "global": True, "method": "default"}, - "LISTEN_STREAM_PORT_SSL": {"value": "4242", "global": True, "method": "default"}, - "USE_UDP": {"value": "no", "global": True, "method": "default"}, - "PROXY_CACHE_BYPASS": {"value": "0", "global": True, "method": "default"}, - "USE_IPV6": {"value": "no", "global": True, "method": "default"}, - "IS_DRAFT": {"value": "no", "global": True, "method": "default"}, - "TIMERS_LOG_LEVEL": {"value": "debug", "global": True, "method": "default"}, - "BUNKERWEB_INSTANCES": {"value": "bunkerweb", "global": True, "method": "scheduler"}, -} - -# Service name we want the configuration for -service_name = "app1.example.com" -# Mix of global and service settings -total_config = { - "ERRORS": {"value": "", "global": True, "method": "default", "template": None}, - "USE_UI": {"value": "no", "global": True, "method": "default", "template": None}, - "USE_CORS": {"value": "no", "global": True, "method": "default", "template": None}, - "USE_GZIP": {"value": "yes", "global": True, "method": "scheduler"}, - "USE_DNSBL": {"value": "yes", "global": True, "method": "default", "template": None}, - "USE_REDIS": {"value": "no", "global": True, "method": "default", "template": None}, - "IS_LOADING": {"value": "no", "global": True, "method": "default", "template": None}, - "REMOTE_PHP": {"value": "", "global": True, "method": "default", "template": None}, - "USE_BACKUP": {"value": "yes", "global": True, "method": "default", "template": None}, - "USE_BROTLI": {"value": "no", "global": True, "method": "default", "template": None}, - "INJECT_BODY": {"value": "", "global": True, "method": "default", "template": None}, - "REDIRECT_TO": {"value": "", "global": True, "method": "default", "template": None}, - "USE_ANTIBOT": {"value": "no", "global": True, "method": "default", "template": None}, - "USE_METRICS": {"value": "yes", "global": True, "method": "default", "template": None}, - "USE_REAL_IP": {"value": "no", "global": True, "method": "default", "template": None}, - "DATABASE_URI": {"value": "sqlite:////var/lib/bunkerweb/db.sqlite3", "global": True, "method": "default", "template": None}, - "USE_GREYLIST": {"value": "no", "global": True, "method": "default", "template": None}, - "CUSTOM_HEADER": {"value": "", "global": True, "method": "default", "template": None}, - "USE_BLACKLIST": {"value": "no", "global": True, "method": "scheduler"}, - "USE_BUNKERNET": {"value": "no", "global": True, "method": "scheduler"}, - "USE_LIMIT_REQ": {"value": "yes", "global": True, "method": "default", "template": None}, - "USE_WHITELIST": {"value": "no", "global": True, "method": "scheduler"}, - "USE_AUTH_BASIC": {"value": "no", "global": True, "method": "default", "template": None}, - "USE_CUSTOM_SSL": {"value": "no", "global": True, "method": "default", "template": None}, - "PRO_LICENSE_KEY": {"value": "", "global": True, "method": "default", "template": None}, - "SESSIONS_SECRET": {"value": "random", "global": True, "method": "default", "template": None}, - "USE_MODSECURITY": {"value": "yes", "global": True, "method": "default", "template": None}, - "USE_SECURITYTXT": {"value": "no", "global": True, "method": "default", "template": None}, - "USE_BAD_BEHAVIOR": {"value": "yes", "global": True, "method": "default", "template": None}, - "USE_CLIENT_CACHE": {"value": "yes", "global": True, "method": "scheduler"}, - "USE_REVERSE_SCAN": {"value": "no", "global": True, "method": "default", "template": None}, - "AUTO_LETS_ENCRYPT": {"value": "no", "global": True, "method": "default", "template": None}, - "BLACKLIST_COUNTRY": {"value": "", "global": True, "method": "default", "template": None}, - "USE_REVERSE_PROXY": {"value": "no", "global": True, "method": "default", "template": None}, - "DISABLE_DEFAULT_SERVER": {"value": "yes", "global": True, "method": "scheduler"}, - "GENERATE_SELF_SIGNED_SSL": {"value": "no", "global": True, "method": "default", "template": None}, - "UI_HOST": {"value": "", "global": True, "method": "default", "template": None}, - "DNSBL_LIST": { - "value": "bl.blocklist.de problems.dnsbl.sorbs.net sbl.spamhaus.org xbl.spamhaus.org", - "global": True, - "method": "default", - "template": None, - }, - "GZIP_TYPES": { - "value": "application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml", - "global": True, - "method": "default", - }, - "REDIS_HOST": {"value": "", "global": True, "method": "default", "template": None}, - "ANTIBOT_URI": {"value": "/challenge", "global": True, "method": "default", "template": None}, - "GREYLIST_IP": {"value": "", "global": True, "method": "default", "template": None}, - "BLACKLIST_IP": {"value": "", "global": True, "method": "default", "template": None}, - "BROTLI_TYPES": { - "value": "application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml", - "global": True, - "method": "default", - }, - "NGINX_PREFIX": {"value": "/etc/nginx/", "global": True, "method": "default"}, - "WHITELIST_IP": { - "value": "20.191.45.212 40.88.21.235 40.76.173.151 40.76.163.7 20.185.79.47 52.142.26.175 20.185.79.15 52.142.24.149 40.76.162.208 40.76.163.23 40.76.162.191 40.76.162.247", - "global": True, - "method": "default", - }, - "LIMIT_REQ_URL": {"value": "/", "global": True, "method": "default", "template": None}, - "SESSIONS_NAME": {"value": "random", "global": True, "method": "default", "template": None}, - "REMOVE_HEADERS": { - "value": "Server Expect-CT X-Powered-By X-AspNet-Version X-AspNetMvc-Version Public-Key-Pins", - "global": True, - "method": "default", - "template": None, - }, - "BACKUP_SCHEDULE": {"value": "daily", "global": True, "method": "default", "template": None}, - "CUSTOM_SSL_CERT": {"value": "", "global": True, "method": "default", "template": None}, - "REMOTE_PHP_PATH": {"value": "", "global": True, "method": "default", "template": None}, - "SECURITYTXT_URI": {"value": "/.well-known/security.txt", "global": True, "method": "default", "template": None}, - "BUNKERNET_SERVER": {"value": "https://api.bunkerweb.io", "global": True, "method": "default", "template": None}, - "CORS_ALLOW_ORIGIN": {"value": "self", "global": True, "method": "default", "template": None}, - "WHITELIST_COUNTRY": {"value": "", "global": True, "method": "default", "template": None}, - "EMAIL_LETS_ENCRYPT": {"value": "", "global": True, "method": "default", "template": None}, - "REVERSE_SCAN_PORTS": {"value": "22 80 443 3128 8000 8080", "global": True, "method": "default", "template": None}, - "USE_PROXY_PROTOCOL": {"value": "no", "global": True, "method": "default", "template": None}, - "AUTH_BASIC_LOCATION": {"value": "sitewide", "global": True, "method": "default", "template": None}, - "METRICS_MEMORY_SIZE": {"value": "16m", "global": True, "method": "default", "template": None}, - "USE_MODSECURITY_CRS": {"value": "yes", "global": True, "method": "default", "template": None}, - "DATABASE_URI_READONLY": {"value": "", "global": True, "method": "default", "template": None}, - "SELF_SIGNED_SSL_EXPIRY": {"value": "365", "global": True, "method": "default", "template": None}, - "CLIENT_CACHE_EXTENSIONS": {"value": "jpg|jpeg|png|bmp|ico|svg|tif|css|js|otf|ttf|eot|woff|woff2", "global": True, "method": "default", "template": None}, - "INTERCEPTED_ERROR_CODES": {"value": "400 401 403 404 405 413 429 500 501 502 503 504", "global": True, "method": "default", "template": None}, - "REDIRECT_TO_REQUEST_URI": {"value": "no", "global": True, "method": "default", "template": None}, - "BAD_BEHAVIOR_STATUS_CODES": {"value": "400 401 403 404 405 429 444", "global": True, "method": "default", "template": None}, - "REVERSE_PROXY_INTERCEPT_ERRORS": {"value": "yes", "global": True, "method": "default", "template": None}, - "DISABLE_DEFAULT_SERVER_STRICT_SNI": {"value": "no", "global": True, "method": "default", "template": None}, - "HTTP_PORT": {"value": "8080", "global": True, "method": "default", "template": None}, - "LOCAL_PHP": {"value": "", "global": True, "method": "default", "template": None}, - "REDIS_PORT": {"value": "6379", "global": True, "method": "default", "template": None}, - "REAL_IP_FROM": {"value": "192.168.0.0/16 172.16.0.0/12 10.0.0.0/8", "global": True, "method": "default", "template": None}, - "GREYLIST_RDNS": {"value": "", "global": True, "method": "default", "template": None}, - "BLACKLIST_RDNS": {"value": ".shodan.io .censys.io", "global": True, "method": "default", "template": None}, - "CUSTOM_SSL_KEY": {"value": "", "global": True, "method": "default", "template": None}, - "LIMIT_REQ_RATE": {"value": "2r/s", "global": True, "method": "default", "template": None}, - "WHITELIST_RDNS": { - "value": ".google.com .googlebot.com .yandex.ru .yandex.net .yandex.com .search.msn.com .baidu.com .baidu.jp .crawl.yahoo.net .fwd.linkedin.com .twitter.com .twttr.com .discord.com", - "global": True, - "method": "default", - "template": None, - }, - "AUTH_BASIC_USER": {"value": "changeme", "global": True, "method": "default", "template": None}, - "BACKUP_ROTATION": {"value": "7", "global": True, "method": "default", "template": None}, - "GZIP_MIN_LENGTH": {"value": "1000", "global": True, "method": "default", "template": None}, - "BROTLI_MIN_LENGTH": {"value": "1000", "global": True, "method": "default", "template": None}, - "CLIENT_CACHE_ETAG": {"value": "yes", "global": True, "method": "default", "template": None}, - "CORS_ALLOW_METHODS": {"value": "GET, POST, OPTIONS", "global": True, "method": "default", "template": None}, - "DATABASE_LOG_LEVEL": {"value": "warning", "global": True, "method": "default", "template": None}, - "SECURITYTXT_CONTACT": {"value": "", "global": True, "method": "default", "template": None}, - "ANTIBOT_TIME_RESOLVE": {"value": "60", "global": True, "method": "default", "template": None}, - "REVERSE_SCAN_TIMEOUT": {"value": "500", "global": True, "method": "default", "template": None}, - "SELF_SIGNED_SSL_SUBJ": {"value": "/CN=www.example.com/", "global": True, "method": "default", "template": None}, - "KEEP_UPSTREAM_HEADERS": {"value": "Content-Security-Policy Permissions-Policy X-Frame-Options", "global": True, "method": "default", "template": None}, - "BAD_BEHAVIOR_THRESHOLD": {"value": "10", "global": True, "method": "default", "template": None}, - "REDIRECT_HTTP_TO_HTTPS": {"value": "no", "global": True, "method": "default", "template": None}, - "REDIRECT_TO_STATUS_CODE": {"value": "301", "global": True, "method": "default", "template": None}, - "SESSIONS_IDLING_TIMEOUT": {"value": "1800", "global": True, "method": "default", "template": None}, - "USE_LETS_ENCRYPT_STAGING": {"value": "no", "global": True, "method": "default", "template": None}, - "REVERSE_PROXY_CUSTOM_HOST": {"value": "", "global": True, "method": "default", "template": None}, - "USE_MODSECURITY_CRS_PLUGINS": {"value": "yes", "global": True, "method": "default", "template": None}, - "METRICS_MAX_BLOCKED_REQUESTS": {"value": "100", "global": True, "method": "default", "template": None}, - "HTTPS_PORT": {"value": "8443", "global": True, "method": "default", "template": None}, - "LOCAL_PHP_PATH": {"value": "", "global": True, "method": "default", "template": None}, - "REAL_IP_HEADER": {"value": "X-Forwarded-For", "global": True, "method": "default", "template": None}, - "REDIS_DATABASE": {"value": "0", "global": True, "method": "default", "template": None}, - "USE_LIMIT_CONN": {"value": "yes", "global": True, "method": "default", "template": None}, - "GZIP_COMP_LEVEL": {"value": "5", "global": True, "method": "default", "template": None}, - "BACKUP_DIRECTORY": {"value": "/var/lib/bunkerweb/backups", "global": True, "method": "default", "template": None}, - "BROTLI_COMP_LEVEL": {"value": "6", "global": True, "method": "default", "template": None}, - "ANTIBOT_TIME_VALID": {"value": "86400", "global": True, "method": "default", "template": None}, - "CORS_ALLOW_HEADERS": { - "value": "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range", - "global": True, - "method": "default", - "template": None, - }, - "AUTH_BASIC_PASSWORD": {"value": "changeme", "global": True, "method": "default", "template": None}, - "SECURITYTXT_EXPIRES": {"value": "", "global": True, "method": "default", "template": None}, - "CLIENT_CACHE_CONTROL": {"value": "public, max-age=15552000", "global": True, "method": "default", "template": None}, - "CUSTOM_SSL_CERT_DATA": {"value": "", "global": True, "method": "default", "template": None}, - "GREYLIST_RDNS_GLOBAL": {"value": "yes", "global": True, "method": "default", "template": None}, - "BLACKLIST_RDNS_GLOBAL": {"value": "yes", "global": True, "method": "default", "template": None}, - "REVERSE_PROXY_SSL_SNI": {"value": "no", "global": True, "method": "default", "template": None}, - "WHITELIST_RDNS_GLOBAL": {"value": "yes", "global": True, "method": "default", "template": None}, - "BAD_BEHAVIOR_COUNT_TIME": {"value": "60", "global": True, "method": "default", "template": None}, - "MODSECURITY_CRS_VERSION": {"value": "4", "global": True, "method": "default", "template": None}, - "SESSIONS_ROLLING_TIMEOUT": {"value": "3600", "global": True, "method": "default", "template": None}, - "STRICT_TRANSPORT_SECURITY": {"value": "max-age=31536000; includeSubDomains; preload", "global": True, "method": "default", "template": None}, - "AUTO_REDIRECT_HTTP_TO_HTTPS": {"value": "yes", "global": True, "method": "default", "template": None}, - "LETS_ENCRYPT_CLEAR_OLD_CERTS": {"value": "no", "global": True, "method": "default", "template": None}, - "MULTISITE": {"value": "yes", "global": True, "method": "scheduler"}, - "REDIS_SSL": {"value": "no", "global": True, "method": "default", "template": None}, - "COOKIE_FLAGS": {"value": "* HttpOnly SameSite=Lax", "global": True, "method": "default", "template": None}, - "GREYLIST_ASN": {"value": "", "global": True, "method": "default", "template": None}, - "GZIP_PROXIED": {"value": "no-cache no-store private expired auth", "global": True, "method": "default", "template": None}, - "BLACKLIST_ASN": {"value": "", "global": True, "method": "default", "template": None}, - "WHITELIST_ASN": {"value": "32934", "global": True, "method": "default", "template": None}, - "ALLOWED_METHODS": {"value": "GET|POST|HEAD", "global": True, "method": "default", "template": None}, - "AUTH_BASIC_TEXT": {"value": "Restricted area", "global": True, "method": "default", "template": None}, - "REAL_IP_RECURSIVE": {"value": "yes", "global": True, "method": "default", "template": None}, - "CUSTOM_SSL_KEY_DATA": {"value": "", "global": True, "method": "default", "template": None}, - "LIMIT_CONN_MAX_HTTP1": {"value": "10", "global": True, "method": "default", "template": None}, - "BAD_BEHAVIOR_BAN_TIME": {"value": "86400", "global": True, "method": "default", "template": None}, - "CORS_ALLOW_CREDENTIALS": {"value": "no", "global": True, "method": "default", "template": None}, - "SECURITYTXT_ENCRYPTION": {"value": "", "global": True, "method": "default", "template": None}, - "ANTIBOT_RECAPTCHA_SCORE": {"value": "0.7", "global": True, "method": "default", "template": None}, - "SESSIONS_ABSOLUTE_TIMEOUT": {"value": "86400", "global": True, "method": "default", "template": None}, - "REVERSE_PROXY_SSL_SNI_NAME": {"value": "", "global": True, "method": "default", "template": None}, - "MODSECURITY_CRS_PLUGIN_URLS": {"value": "", "global": True, "method": "default", "template": None}, - "SERVER_NAME": {"value": "app1.example.com www.example.com", "global": True, "method": "default", "template": None}, - "MAX_CLIENT_SIZE": {"value": "10m", "global": True, "method": "default", "template": None}, - "REDIS_SSL_VERIFY": {"value": "no", "global": True, "method": "default", "template": None}, - "REAL_IP_FROM_URLS": {"value": "", "global": True, "method": "default", "template": None}, - "SESSIONS_CHECK_IP": {"value": "yes", "global": True, "method": "default", "template": None}, - "REVERSE_PROXY_HOST": {"value": "", "global": True, "method": "default", "template": None}, - "CORS_EXPOSE_HEADERS": {"value": "Content-Length,Content-Range", "global": True, "method": "default", "template": None}, - "GREYLIST_USER_AGENT": {"value": "", "global": True, "method": "default", "template": None}, - "BLACKLIST_USER_AGENT": {"value": "", "global": True, "method": "default", "template": None}, - "LIMIT_CONN_MAX_HTTP2": {"value": "100", "global": True, "method": "default", "template": None}, - "WHITELIST_USER_AGENT": {"value": "", "global": True, "method": "default", "template": None}, - "COOKIE_AUTO_SECURE_FLAG": {"value": "yes", "global": True, "method": "default", "template": None}, - "ANTIBOT_RECAPTCHA_SITEKEY": {"value": "", "global": True, "method": "default", "template": None}, - "MODSECURITY_SEC_AUDIT_ENGINE": {"value": "RelevantOnly", "global": True, "method": "default", "template": None}, - "SECURITYTXT_ACKNOWLEDGEMENTS": {"value": "", "global": True, "method": "default", "template": None}, - "SERVE_FILES": {"value": "no", "global": True, "method": "scheduler"}, - "GREYLIST_URI": {"value": "", "global": True, "method": "default", "template": None}, - "BLACKLIST_URI": {"value": "", "global": True, "method": "default", "template": None}, - "REDIS_TIMEOUT": {"value": "1000", "global": True, "method": "default", "template": None}, - "WHITELIST_URI": {"value": "", "global": True, "method": "default", "template": None}, - "WORKER_PROCESSES": {"value": "auto", "global": True, "method": "default", "template": None}, - "REVERSE_PROXY_URL": {"value": "/", "global": True, "method": "default", "template": None}, - "LIMIT_CONN_MAX_STREAM": {"value": "10", "global": True, "method": "default", "template": None}, - "CONTENT_SECURITY_POLICY": { - "value": "object-src 'none'; form-action 'self'; frame-ancestors 'self';", - "global": True, - "method": "default", - "template": None, - }, - "ANTIBOT_RECAPTCHA_SECRET": {"value": "", "global": True, "method": "default", "template": None}, - "SESSIONS_CHECK_USER_AGENT": {"value": "yes", "global": True, "method": "default", "template": None}, - "CROSS_ORIGIN_OPENER_POLICY": {"value": "same-origin", "global": True, "method": "default", "template": None}, - "SECURITYTXT_PREFERRED_LANG": {"value": "en", "global": True, "method": "default", "template": None}, - "MODSECURITY_SEC_RULE_ENGINE": {"value": "On", "global": True, "method": "default", "template": None}, - "ROOT_FOLDER": {"value": "", "global": True, "method": "default", "template": None}, - "REDIS_USERNAME": {"value": "", "global": True, "method": "default", "template": None}, - "GREYLIST_IP_URLS": {"value": "", "global": True, "method": "default", "template": None}, - "REVERSE_PROXY_WS": {"value": "no", "global": True, "method": "default", "template": None}, - "WHITELIST_IP_URLS": {"value": "", "global": True, "method": "default", "template": None}, - "BLACKLIST_IGNORE_IP": {"value": "", "global": True, "method": "default", "template": None}, - "WORKER_RLIMIT_NOFILE": {"value": "2048", "global": True, "method": "default", "template": None}, - "SECURITYTXT_CANONICAL": {"value": "", "global": True, "method": "default", "template": None}, - "ANTIBOT_HCAPTCHA_SITEKEY": {"value": "", "global": True, "method": "default", "template": None}, - "CROSS_ORIGIN_EMBEDDER_POLICY": {"value": "require-corp", "global": True, "method": "default", "template": None}, - "MODSECURITY_SEC_AUDIT_LOG_PARTS": {"value": "ABCFHZ", "global": True, "method": "default", "template": None}, - "CONTENT_SECURITY_POLICY_REPORT_ONLY": {"value": "no", "global": True, "method": "default", "template": None}, - "SSL_PROTOCOLS": {"value": "TLSv1.2 TLSv1.3", "global": True, "method": "default", "template": None}, - "REDIS_PASSWORD": {"value": "", "global": True, "method": "default", "template": None}, - "REFERRER_POLICY": {"value": "strict-origin-when-cross-origin", "global": True, "method": "default", "template": None}, - "GREYLIST_RDNS_URLS": {"value": "", "global": True, "method": "default", "template": None}, - "SECURITYTXT_POLICY": {"value": "", "global": True, "method": "default", "template": None}, - "WORKER_CONNECTIONS": {"value": "1024", "global": True, "method": "default", "template": None}, - "WHITELIS2024-07-31T13:58:29.679295487Z T_RDNS_URLS": {"value": "", "global": True, "method": "default", "template": None}, - "BLACKLIST_IGNORE_RDNS": {"value": "", "global": True, "method": "default", "template": None}, - "REVERSE_PROXY_HEADERS": {"value": "", "global": True, "method": "default", "template": None}, - "ANTIBOT_HCAPTCHA_SECRET": {"value": "", "global": True, "method": "default", "template": None}, - "CROSS_ORIGIN_RESOURCE_POLICY": {"value": "same-site", "global": True, "method": "default", "template": None}, - "HTTP2": {"value": "yes", "global": True, "method": "default", "template": None}, - "LOG_FORMAT": { - "value": '$host $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"', - "global": True, - "method": "default", - "template": None, - }, - "CORS_MAX_AGE": {"value": "86400", "global": True, "method": "default", "template": None}, - "GREYLIST_ASN_URLS": {"value": "", "global": True, "method": "default", "template": None}, - "PERMISSIONS_POLICY": { - "value": "accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), battery=(), bluetooth=(), browsing-topics=(), camera=(), compute-pressure=(), display-capture=(), document-domain=(), encrypted-media=(), execution-while-not-rendered=(), execution-while-out-of-viewport=(), fullscreen=(), gamepad=(), geolocation=(), gyroscope=(), hid=(), identity-credentials-get=(), idle-detection=(), local-fonts=(), magnetometer=(), microphone=(), midi=(), otp-credentials=(), payment=(), picture-in-picture=(), publickey-credentials-create=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), speaker-selection=(), storage-access=(), usb=(), web-share=(), window-management=(), xr-spatial-tracking=()", - "global": True, - "method": "default", - "template": None, - }, - "SECURITYTXT_HIRING": {"value": "", "global": True, "method": "default", "template": None}, - "WHITELIST_ASN_URLS": {"value": "", "global": True, "method": "default", "template": None}, - "BLACKLIST_IGNORE_ASN": {"value": "", "global": True, "method": "default", "template": None}, - "REDIS_SENTINEL_HOSTS": {"value": "", "global": True, "method": "default", "template": None}, - "ANTIBOT_TURNSTILE_SITEKEY": {"value": "", "global": True, "method": "default", "template": None}, - "REVERSE_PROXY_HEADERS_CLIENT": {"value": "", "global": True, "method": "default", "template": None}, - "HTTP3": {"value": "no", "global": True, "method": "default", "template": None}, - "LOG_LEVEL": {"value": "info", "global": True, "method": "scheduler"}, - "DISABLE_FLOC": {"value": "yes", "global": True, "method": "default", "template": None}, - "SECURITYTXT_CSAF": {"value": "", "global": True, "method": "default", "template": None}, - "CORS_DENY_REQUEST": {"value": "yes", "global": True, "method": "default", "template": None}, - "REDIS_SENTINEL_USERNAME": {"value": "", "global": True, "method": "default", "template": None}, - "REVERSE_PROXY_BUFFERING": {"value": "yes", "global": True, "method": "default", "template": None}, - "ANTIBOT_TURNSTILE_SECRET": {"value": "", "global": True, "method": "default", "template": None}, - "GREYLIST_USER_AGENT_URLS": {"value": "", "global": True, "method": "default", "template": None}, - "WHITELIST_USER_AGENT_URLS": {"value": "", "global": True, "method": "default", "template": None}, - "BLACKLIST_IGNORE_USER_AGENT": {"value": "", "global": True, "method": "default", "template": None}, - "DNS_RESOLVERS": {"value": "127.0.0.11", "global": True, "method": "default", "template": None}, - "X_FRAME_OPTIONS": {"value": "SAMEORIGIN", "global": True, "method": "default", "template": None}, - "GREYLIST_URI_URLS": {"value": "", "global": True, "method": "default", "template": None}, - "HTTP3_ALT_SVC_PORT": {"value": "443", "global": True, "method": "default", "template": None}, - "WHITELIST_URI_URLS": {"value": "", "global": True, "method": "default", "template": None}, - "BLACKLIST_IGNORE_URI": {"value": "", "global": True, "method": "default", "template": None}, - "REDIS_SENTINEL_PASSWORD": {"value": "", "global": True, "method": "default", "template": None}, - "REVERSE_PROXY_KEEPALIVE": {"value": "no", "global": True, "method": "default", "template": None}, - "LISTEN_HTTP": {"value": "yes", "global": True, "method": "default", "template": None}, - "BLACKLIST_IP_URLS": {"value": "https://www.dan.me.uk/torlist/?exit", "global": True, "method": "default", "template": None}, - "DATASTORE_MEMORY_SIZE": {"value": "64m", "global": True, "method": "default", "template": None}, - "REDIS_SENTINEL_MASTER": {"value": "", "global": True, "method": "default", "template": None}, - "X_CONTENT_TYPE_OPTIONS": {"value": "nosniff", "global": True, "method": "default", "template": None}, - "REVERSE_PROXY_AUTH_REQUEST": {"value": "", "global": True, "method": "default", "template": None}, - "X_XSS_PROTECTION": {"value": "1; mode=block", "global": True, "method": "default", "template": None}, - "BLACKLIST_RDNS_URLS": {"value": "", "global": True, "method": "default", "template": None}, - "USE_OPEN_FILE_CACHE": {"value": "no", "global": True, "method": "default", "template": None}, - "REDIS_KEEPALIVE_IDLE": {"value": "30000", "global": True, "method": "default", "template": None}, - "CACHESTORE_MEMORY_SIZE": {"value": "64m", "global": True, "method": "default", "template": None}, - "REVERSE_PROXY_AUTH_REQUEST_SIGNIN_URL": {"value": "", "global": True, "method": "default", "template": None}, - "OPEN_FILE_CACHE": {"value": "max=1000 inactive=20s", "global": True, "method": "default", "template": None}, - "BLACKLIST_ASN_URLS": {"value": "", "global": True, "method": "default", "template": None}, - "REDIS_KEEPALIVE_POOL": {"value": "10", "global": True, "method": "default", "template": None}, - "X_DNS_PREFETCH_CONTROL": {"value": "off", "global": True, "method": "default", "template": None}, - "CACHESTORE_IPC_MEMORY_SIZE": {"value": "16m", "global": True, "method": "default", "template": None}, - "REVERSE_PROXY_AUTH_REQUEST_SET": {"value": "", "global": True, "method": "default", "template": None}, - "OPEN_FILE_CACHE_ERRORS": {"value": "yes", "global": True, "method": "default", "template": None}, - "BLACKLIST_USER_AGENT_URLS": { - "value": "https://raw.githubusercontent.com/mitchellkrogza/nginx-ultimate-bad-bot-blocker/master/_generator_lists/bad-user-agents.list", - "global": True, - "method": "default", - "template": None, - }, - "CACHESTORE_MISS_MEMORY_SIZE": {"value": "16m", "global": True, "method": "default", "template": None}, - "REVERSE_PROXY_CONNECT_TIMEOUT": {"value": "60s", "global": True, "method": "default", "template": None}, - "BLACKLIST_URI_URLS": {"value": "", "global": True, "method": "default", "template": None}, - "OPEN_FILE_CACHE_MIN_USES": {"value": "2", "global": True, "method": "default", "template": None}, - "REVERSE_PROXY_READ_TIMEOUT": {"value": "60s", "global": True, "method": "default", "template": None}, - "CACHESTORE_LOCKS_MEMORY_SIZE": {"value": "16m", "global": True, "method": "default", "template": None}, - "USE_API": {"value": "yes", "global": True, "method": "default", "template": None}, - "OPEN_FILE_CACHE_VALID": {"value": "30s", "global": True, "method": "default", "template": None}, - "BLACKLIST_IGNORE_IP_URLS": {"value": "", "global": True, "method": "default", "template": None}, - "REVERSE_PROXY_SEND_TIMEOUT": {"value": "60s", "global": True, "method": "default", "template": None}, - "API_HTTP_PORT": {"value": "5000", "global": True, "method": "default", "template": None}, - "EXTERNAL_PLUGIN_URLS": {"value": "", "global": True, "method": "default", "template": None}, - "REVERSE_PROXY_INCLUDES": {"value": "", "global": True, "method": "default", "template": None}, - "BLACKLIST_IGNORE_RDNS_URLS": {"value": "", "global": True, "method": "default", "template": None}, - "API_LISTEN_IP": {"value": "0.0.0.0", "global": True, "method": "default", "template": None}, - "DENY_HTTP_STATUS": {"value": "403", "global": True, "method": "default", "template": None}, - "BLACKLIST_IGNORE_ASN_URLS": {"value": "", "global": True, "method": "default", "template": None}, - "REVERSE_PROXY_PASS_REQUEST_BODY": {"value": "yes", "global": True, "method": "default", "template": None}, - "API_SERVER_NAME": {"value": "bwapi", "global": True, "method": "default", "template": None}, - "USE_PROXY_CACHE": {"value": "no", "global": True, "method": "default", "template": None}, - "SEND_ANONYMOUS_REPORT": {"value": "no", "global": True, "method": "scheduler"}, - "BLACKLIST_IGNORE_USER_AGENT_URLS": {"value": "", "global": True, "method": "default", "template": None}, - "API_WHITELIST_IP": {"value": "127.0.0.0/24 10.20.30.0/24", "global": True, "method": "scheduler"}, - "PROXY_CACHE_PATH_LEVELS": {"value": "1:2", "global": True, "method": "default", "template": None}, - "BLACKLIST_IGNORE_URI_URLS": {"value": "", "global": True, "method": "default", "template": None}, - "AUTOCONF_MODE": {"value": "no", "global": True, "method": "default", "template": None}, - "PROXY_CACHE_PATH_ZONE_SIZE": {"value": "10m", "global": True, "method": "default", "template": None}, - "SWARM_MODE": {"value": "no", "global": True, "method": "default", "template": None}, - "PROXY_CACHE_PATH_PARAMS": {"value": "max_size=100m", "global": True, "method": "default", "template": None}, - "KUBERNETES_MODE": {"value": "no", "global": True, "method": "default", "template": None}, - "PROXY_CACHE_METHODS": {"value": "GET HEAD", "global": True, "method": "default", "template": None}, - "SERVER_TYPE": {"value": "http", "global": True, "method": "default", "template": None}, - "PROXY_CACHE_MIN_USES": {"value": "2", "global": True, "method": "default", "template": None}, - "LISTEN_STREAM": {"value": "yes", "global": True, "method": "default", "template": None}, - "PROXY_CACHE_KEY": {"value": "$scheme$host$request_uri", "global": True, "method": "default", "template": None}, - "PROXY_CACHE_VALID": {"value": "200=24h 301=1h 302=24h", "global": True, "method": "default", "template": None}, - "LISTEN_STREAM_PORT": {"value": "1337", "global": True, "method": "default", "template": None}, - "PROXY_NO_CACHE": {"value": "$http_pragma $http_authorization", "global": True, "method": "default", "template": None}, - "LISTEN_STREAM_PORT_SSL": {"value": "4242", "global": True, "method": "default", "template": None}, - "USE_UDP": {"value": "no", "global": True, "method": "default", "template": None}, - "PROXY_CACHE_BYPASS": {"value": "0", "global": True, "method": "default", "template": None}, - "USE_IPV6": {"value": "no", "global": True, "method": "default", "template": None}, - "IS_DRAFT": {"value": "no", "global": True, "method": "default", "template": None}, - "TIMERS_LOG_LEVEL": {"value": "debug", "global": True, "method": "default", "template": None}, - "BUNKERWEB_INSTANCES": {"value": "bunkerweb", "global": True, "method": "scheduler"}, - "app1.example.com_BLACKLIST_IGNORE_IP": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_LISTEN_STREAM_PORT": {"value": "1337", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_SECURITYTXT": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_PROXY_PROTOCOL": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_UI": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_GZIP_PROXIED": {"value": "no-cache no-store private expired auth", "global": True, "method": "default", "template": None}, - "app1.example.com_COOKIE_AUTO_SECURE_FLAG": {"value": "yes", "global": True, "method": "default", "template": None}, - "app1.example.com_BLACKLIST_URI": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_SECURITYTXT_POLICY": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_SERVER_TYPE": {"value": "http", "global": True, "method": "default", "template": None}, - "app1.example.com_SECURITYTXT_CANONICAL": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_REVERSE_PROXY_SSL_SNI": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_AUTH_BASIC": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_REMOTE_PHP": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_PROXY_CACHE": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_UDP": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_MODSECURITY_SEC_AUDIT_LOG_PARTS": {"value": "ABCFHZ", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_OPEN_FILE_CACHE": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_LIMIT_CONN": {"value": "yes", "global": True, "method": "default", "template": None}, - "app1.example.com_EMAIL_LETS_ENCRYPT": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_LIMIT_REQ_RATE": {"value": "2r/s", "global": True, "method": "default", "template": None}, - "app1.example.com_AUTH_BASIC_PASSWORD": {"value": "changeme", "global": True, "method": "default", "template": None}, - "app1.example.com_SECURITYTXT_ACKNOWLEDGEMENTS": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_ANTIBOT_HCAPTCHA_SITEKEY": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_REVERSE_PROXY_HEADERS_CLIENT": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_REVERSE_PROXY_CONNECT_TIMEOUT": {"value": "60s", "global": True, "method": "default", "template": None}, - "app1.example.com_PROXY_CACHE_METHODS": {"value": "GET HEAD", "global": True, "method": "default", "template": None}, - "app1.example.com_GZIP_TYPES": { - "value": "application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml", - "global": True, - "method": "default", - "template": None, - }, - "app1.example.com_LISTEN_STREAM": {"value": "yes", "global": True, "method": "default", "template": None}, - "app1.example.com_REVERSE_PROXY_CUSTOM_HOST": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_CUSTOM_HEADER": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_CUSTOM_HEADER_2": {"value": "dzdz", "global": True, "method": "default", "template": None}, - "app1.example.com_OPEN_FILE_CACHE_ERRORS": {"value": "yes", "global": True, "method": "default", "template": None}, - "app1.example.com_LIMIT_REQ_URL": {"value": "/", "global": True, "method": "default", "template": None}, - "app1.example.com_LIMIT_CONN_MAX_HTTP2": {"value": "100", "global": True, "method": "default", "template": None}, - "app1.example.com_AUTH_BASIC_TEXT": {"value": "Restricted area", "global": True, "method": "default", "template": None}, - "app1.example.com_ANTIBOT_TURNSTILE_SITEKEY": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_SECURITYTXT_HIRING": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_BLACKLIST_IP": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_CUSTOM_SSL": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_GREYLIST_USER_AGENT": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_OPEN_FILE_CACHE_MIN_USES": {"value": "2", "global": True, "method": "default", "template": None}, - "app1.example.com_MODSECURITY_CRS_VERSION": {"value": "4", "global": True, "method": "default", "template": None}, - "app1.example.com_CROSS_ORIGIN_OPENER_POLICY": {"value": "same-origin", "global": True, "method": "default", "template": None}, - "app1.example.com_CONTENT_SECURITY_POLICY_REPORT_ONLY": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_CLIENT_CACHE_ETAG": {"value": "yes", "global": True, "method": "default", "template": None}, - "app1.example.com_PROXY_CACHE_MIN_USES": {"value": "2", "global": True, "method": "default", "template": None}, - "app1.example.com_REDIRECT_TO": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_CLIENT_CACHE_CONTROL": {"value": "public, max-age=15552000", "global": True, "method": "default", "template": None}, - "app1.example.com_LISTEN_HTTP": {"value": "yes", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_REVERSE_SCAN": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_CROSS_ORIGIN_RESOURCE_POLICY": {"value": "same-site", "global": True, "method": "default", "template": None}, - "app1.example.com_PROXY_NO_CACHE": {"value": "$http_pragma $http_authorization", "global": True, "method": "default", "template": None}, - "app1.example.com_LOCAL_PHP": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_INTERCEPTED_ERROR_CODES": { - "value": "400 401 403 404 405 413 429 500 501 502 503 504", - "global": True, - "method": "default", - "template": None, - }, - "app1.example.com_REVERSE_PROXY_AUTH_REQUEST": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_BLACKLIST_RDNS_GLOBAL": {"value": "yes", "global": True, "method": "default", "template": None}, - "app1.example.com_CORS_DENY_REQUEST": {"value": "yes", "global": True, "method": "default", "template": None}, - "app1.example.com_ANTIBOT_TIME_VALID": {"value": "86400", "global": True, "method": "default", "template": None}, - "app1.example.com_HTTP3": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_CUSTOM_SSL_CERT": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_BROTLI_TYPES": { - "value": "application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml", - "global": True, - "method": "default", - "template": None, - }, - "app1.example.com_CORS_ALLOW_ORIGIN": {"value": "self", "global": True, "method": "default", "template": None}, - "app1.example.com_MAX_CLIENT_SIZE": {"value": "10m", "global": True, "method": "default", "template": None}, - "app1.example.com_LOCAL_PHP_PATH": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_REVERSE_PROXY_BUFFERING": {"value": "yes", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_BUNKERNET": {"value": "no", "global": True, "method": "scheduler"}, - "app1.example.com_WHITELIST_IP": { - "value": "20.191.45.212 40.88.21.235 40.76.173.151 40.76.163.7 20.185.79.47 52.142.26.175 20.185.79.15 52.142.24.149 40.76.162.208 40.76.163.23 40.76.162.191 40.76.162.247", - "global": True, - "method": "default", - "template": None, - }, - "app1.example.com_ALLOWED_METHODS": {"value": "GET|POST|HEAD", "global": True, "method": "default", "template": None}, - "app1.example.com_SECURITYTXT_URI": { - "value": "/.w2024-07-31T13:58:29.679295487Z ell-known/security.txt", - "global": True, - "method": "default", - "template": None, - }, - "app1.example.com_OPEN_FILE_CACHE_VALID": {"value": "30s", "global": True, "method": "default", "template": None}, - "app1.example.com_REMOTE_PHP_PATH": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_REAL_IP_HEADER": {"value": "X-Forwarded-For", "global": True, "method": "default", "template": None}, - "app1.example.com_REVERSE_PROXY_PASS_REQUEST_BODY": {"value": "yes", "global": True, "method": "default", "template": None}, - "app1.example.com_GENERATE_SELF_SIGNED_SSL": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_REVERSE_PROXY_WS": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_CUSTOM_SSL_KEY_DATA": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_REVERSE_PROXY_AUTH_REQUEST_SET": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_REVERSE_PROXY_HOST": {"value": "http://app1:8080", "global": False, "method": "scheduler"}, - "app1.example.com_BLACKLIST_COUNTRY": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_PROXY_CACHE_VALID": {"value": "200=24h 301=1h 302=24h", "global": True, "method": "default", "template": None}, - "app1.example.com_BLACKLIST_IGNORE_RDNS": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_SECURITYTXT_EXPIRES": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_WHITELIST_COUNTRY": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_PERMISSIONS_POLICY": { - "value": "accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), battery=(), bluetooth=(), browsing-topics=(), camera=(), compute-pressure=(), display-capture=(), document-domain=(), encrypted-media=(), execution-while-not-rendered=(), execution-while-out-of-viewport=(), fullscreen=(), gamepad=(), geolocation=(), gyroscope=(), hid=(), identity-credentials-get=(), idle-detection=(), local-fonts=(), magnetometer=(), microphone=(), midi=(), otp-credentials=(), payment=(), picture-in-picture=(), publickey-credentials-create=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), speaker-selection=(), storage-access=(), usb=(), web-share=(), window-management=(), xr-spatial-tracking=()", - "global": True, - "method": "default", - "template": None, - }, - "app1.example.com_GREYLIST_ASN": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_BROTLI": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_BAD_BEHAVIOR_STATUS_CODES": {"value": "400 401 403 404 405 429 444", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_GZIP": {"value": "yes", "global": True, "method": "scheduler"}, - "app1.example.com_USE_GREYLIST": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_LETS_ENCRYPT_STAGING": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_BLACKLIST_ASN": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_CORS_ALLOW_METHODS": {"value": "GET, POST, OPTIONS", "global": True, "method": "default", "template": None}, - "app1.example.com_REVERSE_PROXY_SEND_TIMEOUT": {"value": "60s", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_BAD_BEHAVIOR": {"value": "yes", "global": True, "method": "default", "template": None}, - "app1.example.com_MODSECURITY_CRS_PLUGIN_URLS": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_METRICS": {"value": "yes", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_MODSECURITY": {"value": "yes", "global": True, "method": "default", "template": None}, - "app1.example.com_REVERSE_PROXY_KEEPALIVE": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_ANTIBOT": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_REFERRER_POLICY": {"value": "strict-origin-when-cross-origin", "global": True, "method": "default", "template": None}, - "app1.example.com_SELF_SIGNED_SSL_SUBJ": {"value": "/CN=www.example.com/", "global": True, "method": "default", "template": None}, - "app1.example.com_PROXY_CACHE_BYPASS": {"value": "0", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_WHITELIST": {"value": "no", "global": True, "method": "scheduler"}, - "app1.example.com_ANTIBOT_TIME_RESOLVE": {"value": "60", "global": True, "method": "default", "template": None}, - "app1.example.com_CORS_ALLOW_HEADERS": { - "value": "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range", - "global": True, - "method": "default", - "template": None, - }, - "app1.example.com_BLACKLIST_USER_AGENT": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_WHITELIST_USER_AGENT": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_MODSECURITY_SEC_RULE_ENGINE": {"value": "On", "global": True, "method": "default", "template": None}, - "app1.example.com_GZIP_COMP_LEVEL": {"value": "5", "global": True, "method": "default", "template": None}, - "app1.example.com_CUSTOM_SSL_CERT_DATA": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_REVERSE_SCAN_TIMEOUT": {"value": "500", "global": True, "method": "default", "template": None}, - "app1.example.com_ANTIBOT_RECAPTCHA_SITEKEY": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_CUSTOM_SSL_KEY": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_BROTLI_COMP_LEVEL": {"value": "6", "global": True, "method": "default", "template": None}, - "app1.example.com_AUTH_BASIC_USER": {"value": "changeme", "global": True, "method": "default", "template": None}, - "app1.example.com_WHITELIST_RDNS_GLOBAL": {"value": "yes", "global": True, "method": "default", "template": None}, - "app1.example.com_REAL_IP_RECURSIVE": {"value": "yes", "global": True, "method": "default", "template": None}, - "app1.example.com_BROTLI_MIN_LENGTH": {"value": "1000", "global": True, "method": "default", "template": None}, - "app1.example.com_REAL_IP_FROM": {"value": "192.168.0.0/16 172.16.0.0/12 10.0.0.0/8", "global": True, "method": "default", "template": None}, - "app1.example.com_BAD_BEHAVIOR_COUNT_TIME": {"value": "60", "global": True, "method": "default", "template": None}, - "app1.example.com_X_FRAME_OPTIONS": {"value": "SAMEORIGIN", "global": True, "method": "default", "template": None}, - "app1.example.com_REVERSE_SCAN_PORTS": {"value": "22 80 443 3128 8000 8080", "global": True, "method": "default", "template": None}, - "app1.example.com_LIMIT_CONN_MAX_HTTP1": {"value": "10", "global": True, "method": "default", "template": None}, - "app1.example.com_HTTP2": {"value": "yes", "global": True, "method": "default", "template": None}, - "app1.example.com_REVERSE_PROXY_AUTH_REQUEST_SIGNIN_URL": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_X_XSS_PROTECTION": {"value": "1; mode=block", "global": True, "method": "default", "template": None}, - "app1.example.com_WHITELIST_RDNS": { - "value": ".google.com .googlebot.com .yandex.ru .yandex.net .yandex.com .search.msn.com .baidu.com .baidu.jp .crawl.yahoo.net .fwd.linkedin.com .twitter.com .twttr.com .discord.com", - "global": True, - "method": "default", - "template": None, - }, - "app1.example.com_USE_REVERSE_PROXY": {"value": "yes", "global": False, "method": "scheduler"}, - "app1.example.com_LISTEN_STREAM_PORT_SSL": {"value": "4242", "global": True, "method": "default", "template": None}, - "app1.example.com_X_DNS_PREFETCH_CONTROL": {"value": "off", "global": True, "method": "default", "template": None}, - "app1.example.com_GREYLIST_IP": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_REDIRECT_HTTP_TO_HTTPS": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_ANTIBOT_RECAPTCHA_SECRET": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_SECURITYTXT_PREFERRED_LANG": {"value": "en", "global": True, "method": "default", "template": None}, - "app1.example.com_CORS_ALLOW_CREDENTIALS": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_BLACKLIST": {"value": "no", "global": True, "method": "scheduler"}, - "app1.example.com_CROSS_ORIGIN_EMBEDDER_POLICY": {"value": "require-corp", "global": True, "method": "default", "template": None}, - "app1.example.com_ANTIBOT_RECAPTCHA_SCORE": {"value": "0.7", "global": True, "method": "default", "template": None}, - "app1.example.com_IS_DRAFT": {"value": "no", "global": False, "method": "default", "template": None}, - "app1.example.com_ANTIBOT_URI": {"value": "/challenge", "global": True, "method": "default", "template": None}, - "app1.example.com_BAD_BEHAVIOR_THRESHOLD": {"value": "10", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_CLIENT_CACHE": {"value": "yes", "global": True, "method": "scheduler"}, - "app1.example.com_KEEP_UPSTREAM_HEADERS": { - "value": "Content-Security-Policy Permissions-Policy X-Frame-Options", - "global": True, - "method": "default", - "template": None, - }, - "app1.example.com_BLACKLIST_RDNS": {"value": ".shodan.io .censys.io", "global": True, "method": "default", "template": None}, - "app1.example.com_COOKIE_FLAGS": {"value": "* HttpOnly SameSite=Lax", "global": True, "method": "default", "template": None}, - "app1.example.com_REDIRECT_TO_STATUS_CODE": {"value": "301", "global": True, "method": "default", "template": None}, - "app1.example.com_MODSECURITY_SEC_AUDIT_ENGINE": {"value": "RelevantOnly", "global": True, "method": "default", "template": None}, - "app1.example.com_REVERSE_PROXY_HEADERS": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_STRICT_TRANSPORT_SECURITY": { - "value": "max-age=31536000; includeSubDomains; preload", - "global": True, - "method": "default", - "template": None, - }, - "app1.example.com_USE_MODSECURITY_CRS_PLUGINS": {"value": "yes", "global": True, "method": "default", "template": None}, - "app1.example.com_SSL_PROTOCOLS": {"value": "TLSv1.2 TLSv1.3", "global": True, "method": "default", "template": None}, - "app1.example.com_DISABLE_FLOC": {"value": "yes", "global": True, "method": "default", "template": None}, - "app1.example.com_REVERSE_PROXY_INTERCEPT_ERRORS": {"value": "yes", "global": True, "method": "default", "template": None}, - "app1.example.com_BLACKLIST_IGNORE_URI": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_REVERSE_PROXY_SSL_SNI_NAME": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_ROOT_FOLDER": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_BLACKLIST_IGNORE_USER_AGENT": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_OPEN_FILE_CACHE": {"value": "max=1000 inactive=20s", "global": True, "method": "default", "template": None}, - "app1.example.com_SERVE_FILES": {"value": "no", "global": True, "method": "scheduler"}, - "app1.example.com_REVERSE_PROXY_READ_TIMEOUT": {"value": "60s", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_LIMIT_REQ": {"value": "yes", "global": True, "method": "default", "template": None}, - "app1.example.com_REVERSE_PROXY_INCLUDES": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_CORS_EXPOSE_HEADERS": {"value": "Content-Length,Content-Range", "global": True, "method": "default", "template": None}, - "app1.example.com_CORS_MAX_AGE": {"value": "86400", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_DNSBL": {"value": "yes", "global": True, "method": "default", "template": None}, - "app1.example.com_ANTIBOT_TURNSTILE_SECRET": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_REAL_IP": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_X_CONTENT_TYPE_OPTIONS": {"value": "nosniff", "global": True, "method": "default", "template": None}, - "app1.example.com_GREYLIST_URI": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_BLACKLIST_IGNORE_ASN": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_GREYLIST_RDNS": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_WHITELIST_URI": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_AUTH_BASIC_LOCATION": {"value": "sitewide", "global": True, "method": "default", "template": None}, - "app1.example.com_GZIP_MIN_LENGTH": {"value": "1000", "global": True, "method": "default", "template": None}, - "app1.example.com_SECURITYTXT_CONTACT": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_SERVER_NAME": {"value": "app1.example.com", "global": False, "method": "ui"}, - "app1.example.com_ERRORS": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_USE_CORS": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_SECURITYTXT_CSAF": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_INJECT_BODY": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_AUTO_REDIRECT_HTTP_TO_HTTPS": {"value": "yes", "global": True, "method": "default", "template": None}, - "app1.example.com_GREYLIST_RDNS_GLOBAL": {"value": "yes", "global": True, "method": "default", "template": None}, - "app1.example.com_ANTIBOT_HCAPTCHA_SECRET": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_REVERSE_PROXY_URL": {"value": "/", "global": True, "method": "default", "template": None}, - "app1.example.com_SECURITYTXT_ENCRYPTION": {"value": "", "global": True, "method": "default", "template": None}, - "app1.example.com_LIMIT_CONN_MAX_STREAM": {"value": "10", "global": True, "method": "default", "template": None}, - "app1.example.com_PROXY_CACHE_KEY": {"value": "$scheme$host$request_uri", "global": True, "method": "default", "template": None}, - "app1.example.com_CONTENT_SECURITY_POLICY": { - "value": "object-src 'none'; form-action 'self'; frame-ancestors 'self';", - "global": True, - "method": "default", - "template": None, - }, - "app1.example.com_AUTO_LETS_ENCRYPT": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_REMOVE_HEADERS": { - "value": "Server Expect-CT X-Powered-By X-AspNet-Version X-AspNetMvc-Version Public-Key-Pins", - "global": True, - "method": "default", - "template": None, - }, - "app1.example.com_USE_MODSECURITY_CRS": {"value": "yes", "global": True, "method": "default", "template": None}, - "app1.example.com_WHITELIST_ASN": {"value": "32934", "global": True, "method": "default", "template": None}, - "app1.example.com_SELF_SIGNED_SSL_EXPIRY": {"value": "365", "global": True, "method": "default", "template": None}, - "app1.example.com_REDIRECT_TO_REQUEST_URI": {"value": "no", "global": True, "method": "default", "template": None}, - "app1.example.com_HTTP3_ALT_SVC_PORT": {"value": "443", "global": True, "method": "default", "template": None}, - "app1.example.com_BAD_BEHAVIOR_BAN_TIME": {"value": "86400", "global": True, "method": "default", "template": None}, - "www.example.com_BLACKLIST_IGNORE_IP": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_LISTEN_STREAM_PORT": {"value": "1337", "global": True, "method": "default", "template": None}, - "www.example.com_USE_SECURITYTXT": {"value": "no", "global": True, "method": "default", "template": None}, - "www.example.com_USE_PROXY_PROTOCOL": {"value": "no", "global": True, "method": "default", "template": None}, - "www.example.com_USE_UI": {"value": "yes", "global": False, "method": "scheduler"}, - "www.example.com_GZIP_PROXIED": {"value": "no-cache no-store private expired auth", "global": True, "method": "default", "template": None}, - "www.example.com_COOKIE_AUTO_SECURE_FLAG": {"value": "yes", "global": True, "method": "default", "template": None}, - "www.example.com_BLACKLIST_URI": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_SECURITYTXT_POLICY": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_SERVER_TYPE": {"value": "http", "global": True, "method": "default", "template": None}, - "www.example.com_SECURITYTXT_CANONICAL": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_REVERSE_PROXY_SSL_SNI": {"value": "no", "global": True, "method": "default", "template": None}, - "www.example.com_USE_AUTH_BASIC": {"value": "no", "global": True, "method": "default", "template": None}, - "www.example.com_REMOTE_PHP": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_USE_PROXY_CACHE": {"value": "no", "global": True, "method": "default", "template": None}, - "www.example.com_USE_UDP": {"value": "no", "global": True, "method": "default", "template": None}, - "www.example.com_MODSECURITY_SEC_AUDIT_LOG_PARTS": {"value": "ABCFHZ", "global": True, "method": "default", "template": None}, - "www.example.com_USE_OPEN_FILE_CACHE": {"value": "no", "global": True, "method": "default", "template": None}, - "www.example.com_USE_LIMIT_CONN": {"value": "yes", "global": True, "method": "default", "template": None}, - "www.example.com_EMAIL_LETS_ENCRYPT": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_LIMIT_REQ_RATE": {"value": "2r/s", "global": True, "method": "default", "template": None}, - "www.example.com_AUTH_BASIC_PASSWORD": {"value": "changeme", "global": True, "method": "default", "template": None}, - "www.example.com_SECURITYTXT_ACKNOWLEDGEMENTS": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_ANTIBOT_HCAPTCHA_SITEKEY": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_REVERSE_PROXY_HEADERS_CLIENT": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_REVERSE_PROXY_CONNECT_TIMEOUT": {"value": "60s", "global": True, "method": "default", "template": None}, - "www.example.com_PROXY_CACHE_METHODS": {"value": "GET HEAD", "global": True, "method": "default", "template": None}, - "www.example.com_GZIP_TYPES": { - "value": "application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.micr2024-07-31T13:58:29.679295487Z osoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml", - "global": True, - "method": "default", - "template": None, - }, - "www.example.com_LISTEN_STREAM": {"value": "yes", "global": True, "method": "default", "template": None}, - "www.example.com_REVERSE_PROXY_CUSTOM_HOST": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_CUSTOM_HEADER": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_OPEN_FILE_CACHE_ERRORS": {"value": "yes", "global": True, "method": "default", "template": None}, - "www.example.com_LIMIT_REQ_URL": {"value": "/", "global": True, "method": "default", "template": None}, - "www.example.com_LIMIT_CONN_MAX_HTTP2": {"value": "100", "global": True, "method": "default", "template": None}, - "www.example.com_AUTH_BASIC_TEXT": {"value": "Restricted area", "global": True, "method": "default", "template": None}, - "www.example.com_ANTIBOT_TURNSTILE_SITEKEY": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_SECURITYTXT_HIRING": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_BLACKLIST_IP": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_USE_CUSTOM_SSL": {"value": "no", "global": True, "method": "default", "template": None}, - "www.example.com_GREYLIST_USER_AGENT": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_OPEN_FILE_CACHE_MIN_USES": {"value": "2", "global": True, "method": "default", "template": None}, - "www.example.com_MODSECURITY_CRS_VERSION": {"value": "4", "global": True, "method": "default", "template": None}, - "www.example.com_CROSS_ORIGIN_OPENER_POLICY": {"value": "same-origin", "global": True, "method": "default", "template": None}, - "www.example.com_CONTENT_SECURITY_POLICY_REPORT_ONLY": {"value": "no", "global": True, "method": "default", "template": None}, - "www.example.com_CLIENT_CACHE_ETAG": {"value": "yes", "global": True, "method": "default", "template": None}, - "www.example.com_PROXY_CACHE_MIN_USES": {"value": "2", "global": True, "method": "default", "template": None}, - "www.example.com_REDIRECT_TO": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_CLIENT_CACHE_CONTROL": {"value": "public, max-age=15552000", "global": True, "method": "default", "template": None}, - "www.example.com_LISTEN_HTTP": {"value": "yes", "global": True, "method": "default", "template": None}, - "www.example.com_USE_REVERSE_SCAN": {"value": "no", "global": True, "method": "default", "template": None}, - "www.example.com_CROSS_ORIGIN_RESOURCE_POLICY": {"value": "same-site", "global": True, "method": "default", "template": None}, - "www.example.com_PROXY_NO_CACHE": {"value": "$http_pragma $http_authorization", "global": True, "method": "default", "template": None}, - "www.example.com_LOCAL_PHP": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_INTERCEPTED_ERROR_CODES": {"value": "400 404 405 413 429 500 501 502 503 504", "global": False, "method": "scheduler"}, - "www.example.com_REVERSE_PROXY_AUTH_REQUEST": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_BLACKLIST_RDNS_GLOBAL": {"value": "yes", "global": True, "method": "default", "template": None}, - "www.example.com_CORS_DENY_REQUEST": {"value": "yes", "global": True, "method": "default", "template": None}, - "www.example.com_ANTIBOT_TIME_VALID": {"value": "86400", "global": True, "method": "default", "template": None}, - "www.example.com_HTTP3": {"value": "no", "global": True, "method": "default", "template": None}, - "www.example.com_CUSTOM_SSL_CERT": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_BROTLI_TYPES": { - "value": "application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml", - "global": True, - "method": "default", - "template": None, - }, - "www.example.com_CORS_ALLOW_ORIGIN": {"value": "self", "global": True, "method": "default", "template": None}, - "www.example.com_MAX_CLIENT_SIZE": {"value": "10m", "global": True, "method": "default", "template": None}, - "www.example.com_LOCAL_PHP_PATH": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_REVERSE_PROXY_BUFFERING": {"value": "yes", "global": True, "method": "default", "template": None}, - "www.example.com_USE_BUNKERNET": {"value": "no", "global": True, "method": "scheduler"}, - "www.example.com_WHITELIST_IP": { - "value": "20.191.45.212 40.88.21.235 40.76.173.151 40.76.163.7 20.185.79.47 52.142.26.175 20.185.79.15 52.142.24.149 40.76.162.208 40.76.163.23 40.76.162.191 40.76.162.247", - "global": True, - "method": "default", - "template": None, - }, - "www.example.com_ALLOWED_METHODS": {"value": "GET|POST|HEAD", "global": True, "method": "default", "template": None}, - "www.example.com_SECURITYTXT_URI": {"value": "/.well-known/security.txt", "global": True, "method": "default", "template": None}, - "www.example.com_OPEN_FILE_CACHE_VALID": {"value": "30s", "global": True, "method": "default", "template": None}, - "www.example.com_REMOTE_PHP_PATH": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_REAL_IP_HEADER": {"value": "X-Forwarded-For", "global": True, "method": "default", "template": None}, - "www.example.com_REVERSE_PROXY_PASS_REQUEST_BODY": {"value": "yes", "global": True, "method": "default", "template": None}, - "www.example.com_GENERATE_SELF_SIGNED_SSL": {"value": "yes", "global": False, "method": "scheduler"}, - "www.example.com_REVERSE_PROXY_WS": {"value": "no", "global": True, "method": "default", "template": None}, - "www.example.com_CUSTOM_SSL_KEY_DATA": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_REVERSE_PROXY_AUTH_REQUEST_SET": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_REVERSE_PROXY_HOST": {"value": "http://bw-ui:7000", "global": False, "method": "scheduler"}, - "www.example.com_BLACKLIST_COUNTRY": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_PROXY_CACHE_VALID": {"value": "200=24h 301=1h 302=24h", "global": True, "method": "default", "template": None}, - "www.example.com_BLACKLIST_IGNORE_RDNS": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_SECURITYTXT_EXPIRES": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_WHITELIST_COUNTRY": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_PERMISSIONS_POLICY": { - "value": "accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), battery=(), bluetooth=(), browsing-topics=(), camera=(), compute-pressure=(), display-capture=(), document-domain=(), encrypted-media=(), execution-while-not-rendered=(), execution-while-out-of-viewport=(), fullscreen=(), gamepad=(), geolocation=(), gyroscope=(), hid=(), identity-credentials-get=(), idle-detection=(), local-fonts=(), magnetometer=(), microphone=(), midi=(), otp-credentials=(), payment=(), picture-in-picture=(), publickey-credentials-create=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), speaker-selection=(), storage-access=(), usb=(), web-share=(), window-management=(), xr-spatial-tracking=()", - "global": True, - "method": "default", - "template": None, - }, - "www.example.com_GREYLIST_ASN": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_USE_BROTLI": {"value": "no", "global": True, "method": "default", "template": None}, - "www.example.com_BAD_BEHAVIOR_STATUS_CODES": {"value": "400 401 403 404 405 429 444", "global": True, "method": "default", "template": None}, - "www.example.com_USE_GZIP": {"value": "yes", "global": True, "method": "scheduler"}, - "www.example.com_USE_GREYLIST": {"value": "no", "global": True, "method": "default", "template": None}, - "www.example.com_USE_LETS_ENCRYPT_STAGING": {"value": "no", "global": True, "method": "default", "template": None}, - "www.example.com_BLACKLIST_ASN": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_CORS_ALLOW_METHODS": {"value": "GET, POST, OPTIONS", "global": True, "method": "default", "template": None}, - "www.example.com_REVERSE_PROXY_SEND_TIMEOUT": {"value": "60s", "global": True, "method": "default", "template": None}, - "www.example.com_USE_BAD_BEHAVIOR": {"value": "yes", "global": True, "method": "default", "template": None}, - "www.example.com_MODSECURITY_CRS_PLUGIN_URLS": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_USE_METRICS": {"value": "yes", "global": True, "method": "default", "template": None}, - "www.example.com_USE_MODSECURITY": {"value": "yes", "global": True, "method": "default", "template": None}, - "www.example.com_REVERSE_PROXY_KEEPALIVE": {"value": "no", "global": True, "method": "default", "template": None}, - "www.example.com_USE_ANTIBOT": {"value": "no", "global": True, "method": "default", "template": None}, - "www.example.com_REFERRER_POLICY": {"value": "strict-origin-when-cross-origin", "global": True, "method": "default", "template": None}, - "www.example.com_SELF_SIGNED_SSL_SUBJ": {"value": "/CN=www.example.com/", "global": True, "method": "default", "template": None}, - "www.example.com_PROXY_CACHE_BYPASS": {"value": "0", "global": True, "method": "default", "template": None}, - "www.example.com_USE_WHITELIST": {"value": "no", "global": True, "method": "scheduler"}, - "www.example.com_ANTIBOT_TIME_RESOLVE": {"value": "60", "global": True, "method": "default", "template": None}, - "www.example.com_CORS_ALLOW_HEADERS": { - "value": "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range", - "global": True, - "method": "default", - "template": None, - }, - "www.example.com_BLACKLIST_USER_AGENT": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_WHITELIST_USER_AGENT": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_MODSECURITY_SEC_RULE_ENGINE": {"value": "On", "global": True, "method": "default", "template": None}, - "www.example.com_GZIP_COMP_LEVEL": {"value": "5", "global": True, "method": "default", "template": None}, - "www.example.com_CUSTOM_SSL_CERT_DATA": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_REVERSE_SCAN_TIMEOUT": {"value": "500", "global": True, "method": "default", "template": None}, - "www.example.com_ANTIBOT_RECAPTCHA_SITEKEY": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_CUSTOM_SSL_KEY": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_BROTLI_COMP_LEVEL": {"value": "6", "global": True, "method": "default", "template": None}, - "www.example.com_AUTH_BASIC_USER": {"value": "changeme", "global": True, "method": "default", "template": None}, - "www.example.com_WHITELIST_RDNS_GLOBAL": {"value": "yes", "global": True, "method": "default", "template": None}, - "www.example.com_REAL_IP_RECURSIVE": {"value": "yes", "global": True, "method": "default", "template": None}, - "www.example.com_BROTLI_MIN_LENGTH": {"value": "1000", "global": True, "method": "default", "template": None}, - "www.example.com_REAL_IP_FROM": {"value": "192.168.0.0/16 172.16.0.0/12 10.0.0.0/8", "global": True, "method": "default", "template": None}, - "www.example.com_BAD_BEHAVIOR_COUNT_TIME": {"value": "60", "global": True, "method": "default", "template": None}, - "www.example.com_X_FRAME_OPTIONS": {"value": "SAMEORIGIN", "global": True, "method": "default", "template": None}, - "www.example.com_REVERSE_SCAN_PORTS": {"value": "22 80 443 3128 8000 8080", "global": True, "method": "default", "template": None}, - "www.example.com_LIMIT_CONN_MAX_HTTP1": {"value": "10", "global": True, "method": "default", "template": None}, - "www.example.com_HTTP2": {"value": "yes", "global": True, "method": "default", "template": None}, - "www.example.com_REVERSE_PROXY_AUTH_REQUEST_SIGNIN_URL": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_X_XSS_PROTECTION": {"value": "1; mode=block", "global": True, "method": "default", "template": None}, - "www.example.com_WHITELIST_RDNS": { - "value": ".google.com .googlebot.com .yandex.ru .yandex.net .yandex.com .search.msn.com .baidu.com .baidu.jp .crawl.yahoo.net .fwd.linkedin.com .twitter.com .twttr.com .discord.com", - "global": True, - "method": "default", - "template": None, - }, - "www.example.com_USE_REVERSE_PROXY": {"value": "yes", "global": False, "method": "scheduler"}, - "www.example.com_LISTEN_STREAM_PORT_SSL": {"value": "4242", "global": True, "method": "default", "template": None}, - "www.example.com_X_DNS_PREFETCH_CONTROL": {"value": "off", "global": True, "method": "default", "template": None}, - "www.example.com_GREYLIST_IP": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_REDIRECT_HTTP_TO_HTTPS": {"value": "no", "global": True, "method": "default", "template": None}, - "www.example.com_ANTIBOT_RECAPTCHA_SECRET": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_SECURITYTXT_PREFERRED_LANG": {"value": "en", "global": True, "method": "default", "template": None}, - "www.example.com_CORS_ALLOW_CREDENTIALS": {"value": "no", "global": True, "method": "default", "template": None}, - "www.example.com_USE_BLACKLIST": {"value": "no", "global": True, "method": "scheduler"}, - "www.example.com_CROSS_ORIGIN_EMBEDDER_POLICY": {"value": "require-corp", "global": True, "method": "default", "template": None}, - "www.example.com_ANTIBOT_RECAPTCHA_SCORE": {"value": "0.7", "global": True, "method": "default", "template": None}, - "www.example.com_IS_DRAFT": {"value": "no", "global": False, "method": "default", "template": None}, - "www.example.com_ANTIBOT_URI": {"value": "/challenge", "global": True, "method": "default", "template": None}, - "www.example.com_BAD_BEHAVIOR_THRESHOLD": {"value": "10", "global": True, "method": "default", "template": None}, - "www.example.com_USE_CLIENT_CACHE": {"value": "yes", "global": True, "method": "scheduler"}, - "www.example.com_KEEP_UPSTREAM_HEADERS": { - "value": "Content-Security-Policy Permissions-Policy X-Frame-Options", - "global": True, - "method": "default", - "template": None, - }, - "www.example.com_BLACKLIST_RDNS": {"value": ".shodan.io .censys.io", "global": True, "method": "default", "template": None}, - "www.example.com_COOKIE_FLAGS": {"value": "* HttpOnly SameSite=Lax", "global": True, "method": "default", "template": None}, - "www.example.com_REDIRECT_TO_STATUS_CODE": {"value": "301", "global": True, "method": "default", "template": None}, - "www.example.com_MODSECURITY_SEC_AUDIT_ENGINE": {"value": "RelevantOnly", "global": True, "method": "default", "template": None}, - "www.example.com_REVERSE_PROXY_HEADERS": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_STRICT_TRANSPORT_SECURITY": { - "value": "max-age=31536000; includeSubDomains; preload", - "global": True, - "method": "default", - "template": None, - }, - "www.example.com_USE_MODSECURITY_CRS_PLUGINS": {"value": "yes", "global": True, "method": "default", "template": None}, - "www.example.com_SSL_PROTOCOLS": {"value": "TLSv1.2 TLSv1.3", "global": True, "method": "default", "template": None}, - "www.example.com_DISABLE_FLOC": {"value": "yes", "global": True, "method": "default", "template": None}, - "www.example.com_REVERSE_PROXY_INTERCEPT_ERRORS": {"value": "yes", "global": True, "method": "default", "template": None}, - "www.example.com_BLACKLIST_IGNORE_URI": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_REVERSE_PROXY_SSL_SNI_NAME": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_ROOT_FOLDER": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_BLACKLIST_IGNORE_USER_AGENT": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_OPEN_FILE_CACHE": {"value": "max=1000 inactive=20s", "global": True, "method": "default", "template": None}, - "www.example.com_SERVE_FILES": {"value": "no", "global": True, "method": "scheduler"}, - "www.example.com_REVERSE_PROXY_READ_TIMEOUT": {"value": "60s", "global": True, "method": "default", "template": None}, - "www.example.com_USE_LIMIT_REQ": {"value": "yes", "global": True, "method": "default", "template": None}, - "www.example.com_REVERSE_PROXY_INCLUDES": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_CORS_EXPOSE_HEADERS": {"value": "Content-Length,Content-Range", "global": True, "method": "default", "template": None}, - "www.example.com_CORS_MAX_AGE": {"value": "86400", "global": True, "method": "default", "template": None}, - "www.example.com_USE_DNSBL": {"value": "yes", "global": True, "method": "default", "template": None}, - "www.example.com_ANTIBOT_TURNSTILE_SECRET": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_USE_REAL_IP": {"value": "no", "global": True, "method": "default", "template": None}, - "www.example.com_X_CONTENT_TYPE_OPTIONS": {"value": "nosniff", "global": True, "method": "default", "template": None}, - "www.example.com_GREYLIST_URI": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_BLACKLIST_IGNORE_ASN": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_GREYLIST_RDNS": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_WHITELIST_URI": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_AUTH_BASIC_LOCATION": {"value": "sitewide", "global": True, "method": "default", "template": None}, - "www.example.com_GZIP_MIN_LENGTH": {"value": "1000", "global": True, "method": "default", "template": None}, - "www.example.com_SECURITYTXT_CONTACT": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_SERVER_NAME": {"value": "www.example.com", "global": False, "method": "scheduler"}, - "www.example.com_ERRORS": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_USE_CORS": {"value": "no", "global": True, "method": "default", "template": None}, - "www.example.com_SECURITYTXT_CSAF": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_INJECT_BODY": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_AUTO_REDIRECT_HTTP_TO_HTTPS": {"value": "yes", "global": True, "method": "default", "template": None}, - "www.example.com_GREYLIST_RDNS_GLOBAL": {"valu2024-07-31T13:58:29.679295487Z e": "yes", "global": True, "method": "default", "template": None}, - "www.example.com_ANTIBOT_HCAPTCHA_SECRET": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_REVERSE_PROXY_URL": {"value": "/admin", "global": False, "method": "scheduler"}, - "www.example.com_SECURITYTXT_ENCRYPTION": {"value": "", "global": True, "method": "default", "template": None}, - "www.example.com_LIMIT_CONN_MAX_STREAM": {"value": "10", "global": True, "method": "default", "template": None}, - "www.example.com_PROXY_CACHE_KEY": {"value": "$scheme$host$request_uri", "global": True, "method": "default", "template": None}, - "www.example.com_CONTENT_SECURITY_POLICY": { - "value": "object-src 'none'; form-action 'self'; frame-ancestors 'self';", - "global": True, - "method": "default", - "template": None, - }, - "www.example.com_AUTO_LETS_ENCRYPT": {"value": "no", "global": True, "method": "default", "template": None}, - "www.example.com_REMOVE_HEADERS": { - "value": "Server Expect-CT X-Powered-By X-AspNet-Version X-AspNetMvc-Version Public-Key-Pins", - "global": True, - "method": "default", - "template": None, - }, - "www.example.com_USE_MODSECURITY_CRS": {"value": "yes", "global": True, "method": "default", "template": None}, - "www.example.com_WHITELIST_ASN": {"value": "32934", "global": True, "method": "default", "template": None}, - "www.example.com_SELF_SIGNED_SSL_EXPIRY": {"value": "365", "global": True, "method": "default", "template": None}, - "www.example.com_REDIRECT_TO_REQUEST_URI": {"value": "no", "global": True, "method": "default", "template": None}, - "www.example.com_HTTP3_ALT_SVC_PORT": {"value": "443", "global": True, "method": "default", "template": None}, - "www.example.com_BAD_BEHAVIOR_BAN_TIME": {"value": "86400", "global": True, "method": "default", "template": None}, -} - - -templates_ui = { - "low": { - "plugin_id": "templates", - "name": "Basic security level", - "settings": { - "SERVER_NAME": "www.example.com", - "USE_REVERSE_PROXY": "yes", - "REVERSE_PROXY_HOST": "http://upstream-server:8080", - "REVERSE_PROXY_URL": "/", - "REVERSE_PROXY_CUSTOM_HOST": "", - "REVERSE_PROXY_SSL_SNI": "no", - "REVERSE_PROXY_SSL_SNI_NAME": "", - "REVERSE_PROXY_WS": "no", - "REVERSE_PROXY_KEEPALIVE": "no", - "AUTO_LETS_ENCRYPT": "yes", - "USE_LETS_ENCRYPT_STAGING": "no", - "ALLOWED_METHODS": "GET|POST|HEAD|OPTIONS|PUT|DELETE|PATCH", - "MAX_CLIENT_SIZE": "100m", - "HTTP2": "yes", - "HTTP3": "yes", - "SSL_PROTOCOLS": "TLSv1.2 TLSv1.3", - "COOKIE_FLAGS": "* SameSite=Lax", - "CONTENT_SECURITY_POLICY": "", - "PERMISSIONS_POLICY": "", - "KEEP_UPSTREAM_HEADERS": "*", - "REFERRER_POLICY": "no-referrer-when-downgrade", - "USE_CORS": "yes", - "CORS_ALLOW_ORIGIN": "*", - "USE_BAD_BEHAVIOR": "yes", - "BAD_BEHAVIOR_STATUS_CODES": "400 401 403 404 405 429 444", - "BAD_BEHAVIOR_BAN_TIME": "3600", - "BAD_BEHAVIOR_THRESHOLD": "30", - "BAD_BEHAVIOR_COUNT_TIME": "60", - "USE_ANTIBOT": "no", - "ANTIBOT_URI": "/challenge", - "ANTIBOT_RECAPTCHA_SCORE": "0.7", - "ANTIBOT_RECAPTCHA_SITEKEY": "", - "ANTIBOT_RECAPTCHA_SECRET": "", - "ANTIBOT_HCAPTCHA_SITEKEY": "", - "ANTIBOT_HCAPTCHA_SECRET": "", - "ANTIBOT_TURNSTILE_SITEKEY": "", - "ANTIBOT_TURNSTILE_SECRET": "", - "USE_BLACKLIST": "yes", - "USE_DNSBL": "no", - "USE_LIMIT_CONN": "yes", - "LIMIT_CONN_MAX_HTTP1": "25", - "LIMIT_CONN_MAX_HTTP2": "200", - "USE_LIMIT_REQ": "yes", - "LIMIT_REQ_URL": "/", - "LIMIT_REQ_RATE": "5r/s", - }, - "configs": { - "modsec/anomaly_score.conf": "SecAction \\\n \"id:900110,\\\n phase:1,\\\n pass,\\\n t:none,\\\n nolog,\\\n tag:'OWASP_CRS',\\\n setvar:tx.inbound_anomaly_score_threshold=6,\\\n setvar:tx.outbound_anomaly_score_threshold=5\"\n" - }, - "steps": [ - { - "title": "Web service - Front service", - "subtitle": "Configure your web service facing your clients", - "settings": ["SERVER_NAME", "AUTO_LETS_ENCRYPT", "USE_LETS_ENCRYPT_STAGING"], - }, - { - "title": "Web service - Upstream server", - "subtitle": "Configure the upstream server to be protected by BunkerWeb", - "settings": [ - "USE_REVERSE_PROXY", - "REVERSE_PROXY_HOST", - "REVERSE_PROXY_URL", - "REVERSE_PROXY_CUSTOM_HOST", - "REVERSE_PROXY_SSL_SNI", - "REVERSE_PROXY_SSL_SNI_NAME", - "REVERSE_PROXY_WS", - "REVERSE_PROXY_KEEPALIVE", - ], - }, - { - "title": "HTTP - General", - "subtitle": "Configure the settings related to the HTTP(S) protocol", - "settings": ["ALLOWED_METHODS", "MAX_CLIENT_SIZE", "HTTP2", "HTTP3", "SSL_PROTOCOLS"], - }, - { - "title": "HTTP - Headers", - "subtitle": "Configure the settings related to the HTTP headers", - "settings": [ - "COOKIE_FLAGS", - "CONTENT_SECURITY_POLICY", - "PERMISSIONS_POLICY", - "KEEP_UPSTREAM_HEADERS", - "REFERRER_POLICY", - "USE_CORS", - "CORS_ALLOW_ORIGIN", - ], - }, - { - "title": "Security - Bad behavior", - "subtitle": "Configure the settings related to the automatic ban when a bad behavior is detected.", - "settings": ["USE_BAD_BEHAVIOR", "BAD_BEHAVIOR_STATUS_CODES", "BAD_BEHAVIOR_BAN_TIME", "BAD_BEHAVIOR_THRESHOLD", "BAD_BEHAVIOR_COUNT_TIME"], - }, - { - "title": "Security - Blacklisting", - "subtitle": "Configure the settings related to the external blacklists.", - "settings": ["USE_BLACKLIST", "USE_DNSBL"], - }, - { - "title": "Security - Limiting", - "subtitle": "Configure the settings related to limiting requests and connections.", - "settings": ["USE_LIMIT_CONN", "LIMIT_CONN_MAX_HTTP1", "LIMIT_CONN_MAX_HTTP2", "USE_LIMIT_REQ", "LIMIT_REQ_URL", "LIMIT_REQ_RATE"], - }, - { - "title": "Security - Antibot", - "subtitle": "Configure the settings about bot detection", - "settings": [ - "USE_ANTIBOT", - "ANTIBOT_URI", - "ANTIBOT_RECAPTCHA_SCORE", - "ANTIBOT_RECAPTCHA_SITEKEY", - "ANTIBOT_RECAPTCHA_SECRET", - "ANTIBOT_HCAPTCHA_SITEKEY", - "ANTIBOT_HCAPTCHA_SECRET", - "ANTIBOT_TURNSTILE_SITEKEY", - "ANTIBOT_TURNSTILE_SECRET", - ], - }, - ], - } -} - - -output = easy_mode_builder(templates_ui, plugins, global_config, total_config, service_name) -with open("easy.json", "w") as f: - json.dump(output, f, indent=4) - -output_base64_bytes = base64.b64encode(bytes(json.dumps(output), "utf-8")) -output_base64_string = output_base64_bytes.decode("ascii") -with open("easy.txt", "w") as f: - f.write(output_base64_string) diff --git a/src/ui/client/tests/easy.txt b/src/ui/client/tests/easy.txt deleted file mode 100644 index 2843ffe93..000000000 --- a/src/ui/client/tests/easy.txt +++ /dev/null @@ -1 +0,0 @@ -W3sidHlwZSI6ICJjYXJkIiwgImNvbnRhaW5lckNvbHVtbnMiOiB7InBjIjogMTIsICJ0YWJsZXQiOiAxMiwgIm1vYmlsZSI6IDEyfSwgIndpZGdldHMiOiBbeyJ0eXBlIjogIlRpdGxlIiwgImRhdGEiOiB7InRpdGxlIjogImFwcDEuZXhhbXBsZS5jb20iLCAidHlwZSI6ICJjb250YWluZXIiLCAibG93ZXJjYXNlIjogdHJ1ZX19LCB7InR5cGUiOiAiU3VidGl0bGUiLCAiZGF0YSI6IHsic3VidGl0bGUiOiAic2VydmljZXNfbWFuYWdlX3N1YnRpdGxlIiwgInR5cGUiOiAiY29udGFpbmVyIn19LCB7InR5cGUiOiAiVGVtcGxhdGVzIiwgImRhdGEiOiB7InRlbXBsYXRlcyI6IHsiZWFzeSI6IHsiZGVmYXVsdCI6IFtdLCAibG93IjogW3sidGl0bGUiOiAiV2ViIHNlcnZpY2UgLSBGcm9udCBzZXJ2aWNlIiwgInN1YnRpdGxlIjogIkNvbmZpZ3VyZSB5b3VyIHdlYiBzZXJ2aWNlIGZhY2luZyB5b3VyIGNsaWVudHMiLCAicGx1Z2lucyI6IFt7ImlkIjogImdlbmVyYWwiLCAic3RyZWFtIjogInBhcnRpYWwiLCAibmFtZSI6ICJHZW5lcmFsIiwgImRlc2NyaXB0aW9uIjogIlRoZSBnZW5lcmFsIHNldHRpbmdzIGZvciB0aGUgc2VydmVyIiwgInZlcnNpb24iOiAiMC4xIiwgInR5cGUiOiAiY29yZSIsICJtZXRob2QiOiAibWFudWFsIiwgInBhZ2UiOiBmYWxzZSwgInNldHRpbmdzIjogeyJTRVJWRVJfTkFNRSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJ3d3cuZXhhbXBsZS5jb20iLCAiaGVscCI6ICJMaXN0IG9mIHRoZSB2aXJ0dWFsIGhvc3RzIHNlcnZlZCBieSBidW5rZXJ3ZWIuIiwgImlkIjogInNlcnZlci1uYW1lIiwgImxhYmVsIjogIlNlcnZlciBuYW1lIiwgInJlZ2V4IjogIl4oKFxcU3sxLDI1NX0pKD8hLipcXHNcXDIoXFxzfCQpKSk/KFxccyhcXFN7MSwyNTV9KSg/IS4qXFxzXFw1KFxcc3wkKSkpKiQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXigoXFxTezEsMjU1fSkoPyEuKlxcc1xcMihcXHN8JCkpKT8oXFxzKFxcU3sxLDI1NX0pKD8hLipcXHNcXDUoXFxzfCQpKSkqJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiYXBwMS5leGFtcGxlLmNvbSIsICJuYW1lIjogIlNlcnZlciBuYW1lIiwgInByZXZfdmFsdWUiOiAid3d3LmV4YW1wbGUuY29tIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJMaXN0IG9mIHRoZSB2aXJ0dWFsIGhvc3RzIHNlcnZlZCBieSBidW5rZXJ3ZWIuIn1dLCAibWV0aG9kIjogInVpIiwgImNvbnRhaW5lckNsYXNzIjogInotNiJ9fSwgImNoZWNrc3VtIjogbnVsbH0sIHsiaWQiOiAibGV0c2VuY3J5cHQiLCAic3RyZWFtIjogInllcyIsICJuYW1lIjogIkxldCdzIEVuY3J5cHQiLCAiZGVzY3JpcHRpb24iOiAiQXV0b21hdGljIGNyZWF0aW9uLCByZW5ld2FsIGFuZCBjb25maWd1cmF0aW9uIG9mIExldCdzIEVuY3J5cHQgY2VydGlmaWNhdGVzLiIsICJ2ZXJzaW9uIjogIjEuMCIsICJ0eXBlIjogImNvcmUiLCAibWV0aG9kIjogIm1hbnVhbCIsICJwYWdlIjogZmFsc2UsICJzZXR0aW5ncyI6IHsiQVVUT19MRVRTX0VOQ1JZUFQiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAibm8iLCAiaGVscCI6ICJBY3RpdmF0ZSBhdXRvbWF0aWMgTGV0J3MgRW5jcnlwdCBtb2RlLiIsICJpZCI6ICJhdXRvLWxldHMtZW5jcnlwdCIsICJsYWJlbCI6ICJBdXRvbWF0aWMgTGV0J3MgRW5jcnlwdCIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJ5ZXMiLCAibmFtZSI6ICJBdXRvbWF0aWMgTGV0J3MgRW5jcnlwdCIsICJwcmV2X3ZhbHVlIjogIm5vIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJBY3RpdmF0ZSBhdXRvbWF0aWMgTGV0J3MgRW5jcnlwdCBtb2RlLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMiJ9LCAiVVNFX0xFVFNfRU5DUllQVF9TVEFHSU5HIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIm5vIiwgImhlbHAiOiAiVXNlIHRoZSBzdGFnaW5nIGVudmlyb25tZW50IGZvciBMZXRcdTIwMTlzIEVuY3J5cHQgY2VydGlmaWNhdGUgZ2VuZXJhdGlvbi4gVXNlZnVsIHdoZW4geW91IGFyZSB0ZXN0aW5nIHlvdXIgZGVwbG95bWVudHMgdG8gYXZvaWQgYmVpbmcgcmF0ZSBsaW1pdGVkIGluIHRoZSBwcm9kdWN0aW9uIGVudmlyb25tZW50LiIsICJpZCI6ICJ1c2UtbGV0cy1lbmNyeXB0LXN0YWdpbmciLCAibGFiZWwiOiAiVXNlIExldCdzIEVuY3J5cHQgU3RhZ2luZyIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJubyIsICJuYW1lIjogIlVzZSBMZXQncyBFbmNyeXB0IFN0YWdpbmciLCAicHJldl92YWx1ZSI6ICJubyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVXNlIHRoZSBzdGFnaW5nIGVudmlyb25tZW50IGZvciBMZXRcdTIwMTlzIEVuY3J5cHQgY2VydGlmaWNhdGUgZ2VuZXJhdGlvbi4gVXNlZnVsIHdoZW4geW91IGFyZSB0ZXN0aW5nIHlvdXIgZGVwbG95bWVudHMgdG8gYXZvaWQgYmVpbmcgcmF0ZSBsaW1pdGVkIGluIHRoZSBwcm9kdWN0aW9uIGVudmlyb25tZW50LiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMCJ9fSwgImNoZWNrc3VtIjogbnVsbH1dfSwgeyJ0aXRsZSI6ICJXZWIgc2VydmljZSAtIFVwc3RyZWFtIHNlcnZlciIsICJzdWJ0aXRsZSI6ICJDb25maWd1cmUgdGhlIHVwc3RyZWFtIHNlcnZlciB0byBiZSBwcm90ZWN0ZWQgYnkgQnVua2VyV2ViIiwgInBsdWdpbnMiOiBbeyJpZCI6ICJyZXZlcnNlcHJveHkiLCAic3RyZWFtIjogInBhcnRpYWwiLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IiwgImRlc2NyaXB0aW9uIjogIk1hbmFnZSByZXZlcnNlIHByb3h5IGNvbmZpZ3VyYXRpb25zLiIsICJ2ZXJzaW9uIjogIjEuMCIsICJ0eXBlIjogImNvcmUiLCAibWV0aG9kIjogIm1hbnVhbCIsICJwYWdlIjogZmFsc2UsICJzZXR0aW5ncyI6IHsiVVNFX1JFVkVSU0VfUFJPWFkiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAibm8iLCAiaGVscCI6ICJBY3RpdmF0ZSByZXZlcnNlIHByb3h5IG1vZGUuIiwgImlkIjogInVzZS1yZXZlcnNlLXByb3h5IiwgImxhYmVsIjogIlVzZSByZXZlcnNlIHByb3h5IiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiB0cnVlLCAidmFsdWUiOiAieWVzIiwgIm5hbWUiOiAiVXNlIHJldmVyc2UgcHJveHkiLCAicHJldl92YWx1ZSI6ICJubyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogInRyZXNwYXNzIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbWV0aG9kX2Rpc2FibGVkIn0sIHsiaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJBY3RpdmF0ZSByZXZlcnNlIHByb3h5IG1vZGUuIn1dLCAibWV0aG9kIjogInNjaGVkdWxlciIsICJjb250YWluZXJDbGFzcyI6ICJ6LTIzIn0sICJSRVZFUlNFX1BST1hZX0NVU1RPTV9IT1NUIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIk92ZXJyaWRlIEhvc3QgaGVhZGVyIHNlbnQgdG8gdXBzdHJlYW0gc2VydmVyLiIsICJpZCI6ICJyZXZlcnNlLXByb3h5LWN1c3RvbS1ob3N0IiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkgY3VzdG9tIGhvc3QiLCAicmVnZXgiOiAiXi4qJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeLiokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IGN1c3RvbSBob3N0IiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJPdmVycmlkZSBIb3N0IGhlYWRlciBzZW50IHRvIHVwc3RyZWFtIHNlcnZlci4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTIxIn19LCAiY2hlY2tzdW0iOiBudWxsLCAibXVsdGlwbGVzX3NjaGVtYSI6IHsicmV2ZXJzZS1wcm94eSI6IHsiUkVWRVJTRV9QUk9YWV9IT1NUIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkZ1bGwgVVJMIG9mIHRoZSBwcm94aWVkIHJlc291cmNlIChwcm94eV9wYXNzKS4iLCAiaWQiOiAicmV2ZXJzZS1wcm94eS1ob3N0IiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkgaG9zdCIsICJyZWdleCI6ICJeLiokIiwgInR5cGUiOiAidGV4dCIsICJtdWx0aXBsZSI6ICJyZXZlcnNlLXByb3h5IiwgInBhdHRlcm4iOiAiXi4qJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm5hbWUiOiAiUmV2ZXJzZSBwcm94eSBob3N0IiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJGdWxsIFVSTCBvZiB0aGUgcHJveGllZCByZXNvdXJjZSAocHJveHlfcGFzcykuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yMyJ9LCAiUkVWRVJTRV9QUk9YWV9VUkwiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiLyIsICJoZWxwIjogIkxvY2F0aW9uIFVSTCB0aGF0IHdpbGwgYmUgcHJveGllZC4iLCAiaWQiOiAicmV2ZXJzZS1wcm94eS11cmwiLCAibGFiZWwiOiAiUmV2ZXJzZSBwcm94eSB1cmwiLCAicmVnZXgiOiAiXi4qJCIsICJ0eXBlIjogInRleHQiLCAibXVsdGlwbGUiOiAicmV2ZXJzZS1wcm94eSIsICJwYXR0ZXJuIjogIl4uKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIi8iLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IHVybCIsICJwcmV2X3ZhbHVlIjogIi8iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkxvY2F0aW9uIFVSTCB0aGF0IHdpbGwgYmUgcHJveGllZC4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTIyIn0sICJSRVZFUlNFX1BST1hZX1dTIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIm5vIiwgImhlbHAiOiAiRW5hYmxlIHdlYnNvY2tldCBvbiB0aGUgcHJveGllZCByZXNvdXJjZS4iLCAiaWQiOiAicmV2ZXJzZS1wcm94eS13cyIsICJsYWJlbCI6ICJSZXZlcnNlIHByb3h5IFdTIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJtdWx0aXBsZSI6ICJyZXZlcnNlLXByb3h5IiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAibm8iLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IFdTIiwgInByZXZfdmFsdWUiOiAibm8iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkVuYWJsZSB3ZWJzb2NrZXQgb24gdGhlIHByb3hpZWQgcmVzb3VyY2UuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yMSJ9LCAiUkVWRVJTRV9QUk9YWV9IRUFERVJTIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkxpc3Qgb2YgSFRUUCBoZWFkZXJzIHRvIHNlbmQgdG8gcHJveGllZCByZXNvdXJjZSBzZXBhcmF0ZWQgd2l0aCBzZW1pY29sb25zICh2YWx1ZXMgZm9yIHByb3h5X3NldF9oZWFkZXIgZGlyZWN0aXZlKS4iLCAiaWQiOiAicmV2ZXJzZS1wcm94eS1oZWFkZXJzIiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkgaGVhZGVycyIsICJyZWdleCI6ICJeKD8hWzsgXSkoOz8gPyhbXFx3XFwtXSspKD8hLipcXDIgKSBbXjtdKykqJCIsICJ0eXBlIjogInRleHQiLCAibXVsdGlwbGUiOiAicmV2ZXJzZS1wcm94eSIsICJwYXR0ZXJuIjogIl4oPyFbOyBdKSg7PyA/KFtcXHdcXC1dKykoPyEuKlxcMiApIFteO10rKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IGhlYWRlcnMiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkxpc3Qgb2YgSFRUUCBoZWFkZXJzIHRvIHNlbmQgdG8gcHJveGllZCByZXNvdXJjZSBzZXBhcmF0ZWQgd2l0aCBzZW1pY29sb25zICh2YWx1ZXMgZm9yIHByb3h5X3NldF9oZWFkZXIgZGlyZWN0aXZlKS4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTIwIn0sICJSRVZFUlNFX1BST1hZX0hFQURFUlNfQ0xJRU5UIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkxpc3Qgb2YgSFRUUCBoZWFkZXJzIHRvIHNlbmQgdG8gY2xpZW50IHNlcGFyYXRlZCB3aXRoIHNlbWljb2xvbnMgKHZhbHVlcyBmb3IgYWRkX2hlYWRlciBkaXJlY3RpdmUpLiIsICJpZCI6ICJyZXZlcnNlLXByb3h5LWhlYWRlcnMtY2xpZW50IiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkgaGVhZGVycy1jbGllbnQiLCAicmVnZXgiOiAiXig/IVs7IF0pKDs/ID8oW1xcd1xcLV0rKSg/IS4qXFwyICkgW147XSspKiQiLCAidHlwZSI6ICJ0ZXh0IiwgIm11bHRpcGxlIjogInJldmVyc2UtcHJveHkiLCAicGF0dGVybiI6ICJeKD8hWzsgXSkoOz8gPyhbXFx3XFwtXSspKD8hLipcXDIgKSBbXjtdKykqJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm5hbWUiOiAiUmV2ZXJzZSBwcm94eSBoZWFkZXJzLWNsaWVudCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBIVFRQIGhlYWRlcnMgdG8gc2VuZCB0byBjbGllbnQgc2VwYXJhdGVkIHdpdGggc2VtaWNvbG9ucyAodmFsdWVzIGZvciBhZGRfaGVhZGVyIGRpcmVjdGl2ZSkuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xOSJ9LCAiUkVWRVJTRV9QUk9YWV9CVUZGRVJJTkciOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAieWVzIiwgImhlbHAiOiAiRW5hYmxlIG9yIGRpc2FibGUgYnVmZmVyaW5nIG9mIHJlc3BvbnNlcyBmcm9tIHByb3hpZWQgcmVzb3VyY2UuIiwgImlkIjogInJldmVyc2UtcHJveHktYnVmZmVyaW5nIiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkgYnVmZmVyaW5nIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJtdWx0aXBsZSI6ICJyZXZlcnNlLXByb3h5IiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAieWVzIiwgIm5hbWUiOiAiUmV2ZXJzZSBwcm94eSBidWZmZXJpbmciLCAicHJldl92YWx1ZSI6ICJ5ZXMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkVuYWJsZSBvciBkaXNhYmxlIGJ1ZmZlcmluZyBvZiByZXNwb25zZXMgZnJvbSBwcm94aWVkIHJlc291cmNlLiJ9XSwgImNvbnRhaW5lckNsYXNzIjogInotMTgifSwgIlJFVkVSU0VfUFJPWFlfS0VFUEFMSVZFIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIm5vIiwgImhlbHAiOiAiRW5hYmxlIG9yIGRpc2FibGUga2VlcGFsaXZlIGNvbm5lY3Rpb25zIHdpdGggdGhlIHByb3hpZWQgcmVzb3VyY2UuIiwgImlkIjogInJldmVyc2UtcHJveHkta2VlcGFsaXZlIiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkga2VlcGFsaXZlIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJtdWx0aXBsZSI6ICJyZXZlcnNlLXByb3h5IiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAibm8iLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IGtlZXBhbGl2ZSIsICJwcmV2X3ZhbHVlIjogIm5vIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJFbmFibGUgb3IgZGlzYWJsZSBrZWVwYWxpdmUgY29ubmVjdGlvbnMgd2l0aCB0aGUgcHJveGllZCByZXNvdXJjZS4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTE3In0sICJSRVZFUlNFX1BST1hZX0FVVEhfUkVRVUVTVCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJFbmFibGUgYXV0aGVudGljYXRpb24gdXNpbmcgYW4gZXh0ZXJuYWwgcHJvdmlkZXIgKHZhbHVlIG9mIGF1dGhfcmVxdWVzdCBkaXJlY3RpdmUpLiIsICJpZCI6ICJyZXZlcnNlLXByb3h5LWF1dGgtcmVxdWVzdCIsICJsYWJlbCI6ICJSZXZlcnNlIHByb3h5IGF1dGggcmVxdWVzdCIsICJyZWdleCI6ICJeKFxcL1tcXHdcXF0ufjpcXC8/I1xcW0AhJFxcJidcXChcXCkqKyw7PVxcLV0qfG9mZik/JCIsICJ0eXBlIjogInRleHQiLCAibXVsdGlwbGUiOiAicmV2ZXJzZS1wcm94eSIsICJwYXR0ZXJuIjogIl4oXFwvW1xcd1xcXS5+OlxcLz8jXFxbQCEkXFwmJ1xcKFxcKSorLDs9XFwtXSp8b2ZmKT8kIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IGF1dGggcmVxdWVzdCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiRW5hYmxlIGF1dGhlbnRpY2F0aW9uIHVzaW5nIGFuIGV4dGVybmFsIHByb3ZpZGVyICh2YWx1ZSBvZiBhdXRoX3JlcXVlc3QgZGlyZWN0aXZlKS4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTE2In0sICJSRVZFUlNFX1BST1hZX0FVVEhfUkVRVUVTVF9TSUdOSU5fVVJMIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIlJlZGlyZWN0IGNsaWVudHMgdG8gc2lnbi1pbiBVUkwgd2hlbiB1c2luZyBSRVZFUlNFX1BST1hZX0FVVEhfUkVRVUVTVCAodXNlZCB3aGVuIGF1dGhfcmVxdWVzdCBjYWxsIHJldHVybmVkIDQwMSkuIiwgImlkIjogInJldmVyc2UtcHJveHktYXV0aC1yZXF1ZXN0LXNpZ25pbi11cmwiLCAibGFiZWwiOiAiQXV0aCByZXF1ZXN0IHNpZ25pbiBVUkwiLCAicmVnZXgiOiAiXihodHRwcz86XFwvXFwvW1xcLVxcd0A6JS4rfiM9XStbXFwtXFx3XFwoXFwpIUA6JSsufiM/JlxcLz0kXSopPyQiLCAidHlwZSI6ICJ0ZXh0IiwgIm11bHRpcGxlIjogInJldmVyc2UtcHJveHkiLCAicGF0dGVybiI6ICJeKGh0dHBzPzpcXC9cXC9bXFwtXFx3QDolLit+Iz1dK1tcXC1cXHdcXChcXCkhQDolKy5+Iz8mXFwvPSRdKik/JCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm5hbWUiOiAiQXV0aCByZXF1ZXN0IHNpZ25pbiBVUkwiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlJlZGlyZWN0IGNsaWVudHMgdG8gc2lnbi1pbiBVUkwgd2hlbiB1c2luZyBSRVZFUlNFX1BST1hZX0FVVEhfUkVRVUVTVCAodXNlZCB3aGVuIGF1dGhfcmVxdWVzdCBjYWxsIHJldHVybmVkIDQwMSkuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xNSJ9LCAiUkVWRVJTRV9QUk9YWV9BVVRIX1JFUVVFU1RfU0VUIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkxpc3Qgb2YgdmFyaWFibGVzIHRvIHNldCBmcm9tIHRoZSBhdXRoZW50aWNhdGlvbiBwcm92aWRlciwgc2VwYXJhdGVkIHdpdGggc2VtaWNvbG9ucyAodmFsdWVzIG9mIGF1dGhfcmVxdWVzdF9zZXQgZGlyZWN0aXZlcykuIiwgImlkIjogInJldmVyc2UtcHJveHktYXV0aC1yZXF1ZXN0LXNldCIsICJsYWJlbCI6ICJSZXZlcnNlIHByb3h5IGF1dGggcmVxdWVzdCBzZXQiLCAicmVnZXgiOiAiXig/ISA7KSg7PyA/KFxcJFthLXpfXFwtXSspKD8hLipcXDIgKSBbXjtdKykqJCIsICJ0eXBlIjogInRleHQiLCAibXVsdGlwbGUiOiAicmV2ZXJzZS1wcm94eSIsICJwYXR0ZXJuIjogIl4oPyEgOykoOz8gPyhcXCRbYS16X1xcLV0rKSg/IS4qXFwyICkgW147XSspKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJuYW1lIjogIlJldmVyc2UgcHJveHkgYXV0aCByZXF1ZXN0IHNldCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiB2YXJpYWJsZXMgdG8gc2V0IGZyb20gdGhlIGF1dGhlbnRpY2F0aW9uIHByb3ZpZGVyLCBzZXBhcmF0ZWQgd2l0aCBzZW1pY29sb25zICh2YWx1ZXMgb2YgYXV0aF9yZXF1ZXN0X3NldCBkaXJlY3RpdmVzKS4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTE0In0sICJSRVZFUlNFX1BST1hZX0NPTk5FQ1RfVElNRU9VVCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICI2MHMiLCAiaGVscCI6ICJUaW1lb3V0IHdoZW4gY29ubmVjdGluZyB0byB0aGUgcHJveGllZCByZXNvdXJjZS4iLCAiaWQiOiAicmV2ZXJzZS1wcm94eS1jb25uZWN0LXRpbWVvdXQiLCAibGFiZWwiOiAiUmV2ZXJzZSBwcm94eSBjb25uZWN0IHRpbWVvdXQiLCAicmVnZXgiOiAiXlxcZCsobXM/fFtzaGR3TXldKSQiLCAidHlwZSI6ICJ0ZXh0IiwgIm11bHRpcGxlIjogInJldmVyc2UtcHJveHkiLCAicGF0dGVybiI6ICJeXFxkKyhtcz98W3NoZHdNeV0pJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiNjBzIiwgIm5hbWUiOiAiUmV2ZXJzZSBwcm94eSBjb25uZWN0IHRpbWVvdXQiLCAicHJldl92YWx1ZSI6ICI2MHMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlRpbWVvdXQgd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBwcm94aWVkIHJlc291cmNlLiJ9XSwgImNvbnRhaW5lckNsYXNzIjogInotMTMifSwgIlJFVkVSU0VfUFJPWFlfUkVBRF9USU1FT1VUIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIjYwcyIsICJoZWxwIjogIlRpbWVvdXQgd2hlbiByZWFkaW5nIGZyb20gdGhlIHByb3hpZWQgcmVzb3VyY2UuIiwgImlkIjogInJldmVyc2UtcHJveHktcmVhZC10aW1lb3V0IiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkgcmVhZCB0aW1lb3V0IiwgInJlZ2V4IjogIl5cXGQrKG1zP3xbc2hkd015XSkkIiwgInR5cGUiOiAidGV4dCIsICJtdWx0aXBsZSI6ICJyZXZlcnNlLXByb3h5IiwgInBhdHRlcm4iOiAiXlxcZCsobXM/fFtzaGR3TXldKSQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjYwcyIsICJuYW1lIjogIlJldmVyc2UgcHJveHkgcmVhZCB0aW1lb3V0IiwgInByZXZfdmFsdWUiOiAiNjBzIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJUaW1lb3V0IHdoZW4gcmVhZGluZyBmcm9tIHRoZSBwcm94aWVkIHJlc291cmNlLiJ9XSwgImNvbnRhaW5lckNsYXNzIjogInotMTIifSwgIlJFVkVSU0VfUFJPWFlfU0VORF9USU1FT1VUIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIjYwcyIsICJoZWxwIjogIlRpbWVvdXQgd2hlbiBzZW5kaW5nIHRvIHRoZSBwcm94aWVkIHJlc291cmNlLiIsICJpZCI6ICJyZXZlcnNlLXByb3h5LXNlbmQtdGltZW91dCIsICJsYWJlbCI6ICJSZXZlcnNlIHByb3h5IHNlbmQgdGltZW91dCIsICJyZWdleCI6ICJeXFxkKyhtcz98W3NoZHdNeV0pJCIsICJ0eXBlIjogInRleHQiLCAibXVsdGlwbGUiOiAicmV2ZXJzZS1wcm94eSIsICJwYXR0ZXJuIjogIl5cXGQrKG1zP3xbc2hkd015XSkkIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICI2MHMiLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IHNlbmQgdGltZW91dCIsICJwcmV2X3ZhbHVlIjogIjYwcyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVGltZW91dCB3aGVuIHNlbmRpbmcgdG8gdGhlIHByb3hpZWQgcmVzb3VyY2UuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xMSJ9LCAiUkVWRVJTRV9QUk9YWV9JTkNMVURFUyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJBZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gdG8gaW5jbHVkZSBpbiB0aGUgbG9jYXRpb24gYmxvY2ssIHNlcGFyYXRlZCB3aXRoIHNwYWNlcy4iLCAiaWQiOiAicmV2ZXJzZS1wcm94eS1pbmNsdWRlcyIsICJsYWJlbCI6ICJSZXZlcnNlIHByb3h5IGluY2x1ZGVzIiwgInJlZ2V4IjogIl4oPyEgKSggPyhcXHcrKSg/IS4qXFxiXFwyXFxiKSkqJCIsICJ0eXBlIjogInRleHQiLCAibXVsdGlwbGUiOiAicmV2ZXJzZS1wcm94eSIsICJwYXR0ZXJuIjogIl4oPyEgKSggPyhcXHcrKSg/IS4qXFxiXFwyXFxiKSkqJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm5hbWUiOiAiUmV2ZXJzZSBwcm94eSBpbmNsdWRlcyIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiQWRkaXRpb25hbCBjb25maWd1cmF0aW9uIHRvIGluY2x1ZGUgaW4gdGhlIGxvY2F0aW9uIGJsb2NrLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xMCJ9fX0sICJtdWx0aXBsZXMiOiB7InJldmVyc2UtcHJveHkiOiB7IjAiOiB7IlJFVkVSU0VfUFJPWFlfSE9TVCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJGdWxsIFVSTCBvZiB0aGUgcHJveGllZCByZXNvdXJjZSAocHJveHlfcGFzcykuIiwgImlkIjogInJldmVyc2UtcHJveHktaG9zdCIsICJsYWJlbCI6ICJSZXZlcnNlIHByb3h5IGhvc3QiLCAicmVnZXgiOiAiXi4qJCIsICJ0eXBlIjogInRleHQiLCAibXVsdGlwbGUiOiAicmV2ZXJzZS1wcm94eSIsICJwYXR0ZXJuIjogIl4uKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiB0cnVlLCAidmFsdWUiOiAiaHR0cDovL2FwcDE6ODA4MCIsICJuYW1lIjogIlJldmVyc2UgcHJveHkgaG9zdCIsICJwcmV2X3ZhbHVlIjogImh0dHA6Ly9hcHAxOjgwODAiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJ0cmVzcGFzcyIsICJ0ZXh0IjogImlucF9wb3BvdmVyX21ldGhvZF9kaXNhYmxlZCJ9LCB7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiRnVsbCBVUkwgb2YgdGhlIHByb3hpZWQgcmVzb3VyY2UgKHByb3h5X3Bhc3MpLiJ9XSwgImNvbnRhaW5lckNsYXNzIjogInotMjMiLCAibWV0aG9kIjogInNjaGVkdWxlciJ9LCAiUkVWRVJTRV9QUk9YWV9VUkwiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiLyIsICJoZWxwIjogIkxvY2F0aW9uIFVSTCB0aGF0IHdpbGwgYmUgcHJveGllZC4iLCAiaWQiOiAicmV2ZXJzZS1wcm94eS11cmwiLCAibGFiZWwiOiAiUmV2ZXJzZSBwcm94eSB1cmwiLCAicmVnZXgiOiAiXi4qJCIsICJ0eXBlIjogInRleHQiLCAibXVsdGlwbGUiOiAicmV2ZXJzZS1wcm94eSIsICJwYXR0ZXJuIjogIl4uKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIi8iLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IHVybCIsICJwcmV2X3ZhbHVlIjogIi8iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkxvY2F0aW9uIFVSTCB0aGF0IHdpbGwgYmUgcHJveGllZC4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTIyIiwgIm1ldGhvZCI6ICJkZWZhdWx0In0sICJSRVZFUlNFX1BST1hZX1dTIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIm5vIiwgImhlbHAiOiAiRW5hYmxlIHdlYnNvY2tldCBvbiB0aGUgcHJveGllZCByZXNvdXJjZS4iLCAiaWQiOiAicmV2ZXJzZS1wcm94eS13cyIsICJsYWJlbCI6ICJSZXZlcnNlIHByb3h5IFdTIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJtdWx0aXBsZSI6ICJyZXZlcnNlLXByb3h5IiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAibm8iLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IFdTIiwgInByZXZfdmFsdWUiOiAibm8iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkVuYWJsZSB3ZWJzb2NrZXQgb24gdGhlIHByb3hpZWQgcmVzb3VyY2UuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yMSIsICJtZXRob2QiOiAiZGVmYXVsdCJ9LCAiUkVWRVJTRV9QUk9YWV9IRUFERVJTIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkxpc3Qgb2YgSFRUUCBoZWFkZXJzIHRvIHNlbmQgdG8gcHJveGllZCByZXNvdXJjZSBzZXBhcmF0ZWQgd2l0aCBzZW1pY29sb25zICh2YWx1ZXMgZm9yIHByb3h5X3NldF9oZWFkZXIgZGlyZWN0aXZlKS4iLCAiaWQiOiAicmV2ZXJzZS1wcm94eS1oZWFkZXJzIiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkgaGVhZGVycyIsICJyZWdleCI6ICJeKD8hWzsgXSkoOz8gPyhbXFx3XFwtXSspKD8hLipcXDIgKSBbXjtdKykqJCIsICJ0eXBlIjogInRleHQiLCAibXVsdGlwbGUiOiAicmV2ZXJzZS1wcm94eSIsICJwYXR0ZXJuIjogIl4oPyFbOyBdKSg7PyA/KFtcXHdcXC1dKykoPyEuKlxcMiApIFteO10rKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IGhlYWRlcnMiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkxpc3Qgb2YgSFRUUCBoZWFkZXJzIHRvIHNlbmQgdG8gcHJveGllZCByZXNvdXJjZSBzZXBhcmF0ZWQgd2l0aCBzZW1pY29sb25zICh2YWx1ZXMgZm9yIHByb3h5X3NldF9oZWFkZXIgZGlyZWN0aXZlKS4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTIwIiwgIm1ldGhvZCI6ICJkZWZhdWx0In0sICJSRVZFUlNFX1BST1hZX0hFQURFUlNfQ0xJRU5UIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkxpc3Qgb2YgSFRUUCBoZWFkZXJzIHRvIHNlbmQgdG8gY2xpZW50IHNlcGFyYXRlZCB3aXRoIHNlbWljb2xvbnMgKHZhbHVlcyBmb3IgYWRkX2hlYWRlciBkaXJlY3RpdmUpLiIsICJpZCI6ICJyZXZlcnNlLXByb3h5LWhlYWRlcnMtY2xpZW50IiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkgaGVhZGVycy1jbGllbnQiLCAicmVnZXgiOiAiXig/IVs7IF0pKDs/ID8oW1xcd1xcLV0rKSg/IS4qXFwyICkgW147XSspKiQiLCAidHlwZSI6ICJ0ZXh0IiwgIm11bHRpcGxlIjogInJldmVyc2UtcHJveHkiLCAicGF0dGVybiI6ICJeKD8hWzsgXSkoOz8gPyhbXFx3XFwtXSspKD8hLipcXDIgKSBbXjtdKykqJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm5hbWUiOiAiUmV2ZXJzZSBwcm94eSBoZWFkZXJzLWNsaWVudCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBIVFRQIGhlYWRlcnMgdG8gc2VuZCB0byBjbGllbnQgc2VwYXJhdGVkIHdpdGggc2VtaWNvbG9ucyAodmFsdWVzIGZvciBhZGRfaGVhZGVyIGRpcmVjdGl2ZSkuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xOSIsICJtZXRob2QiOiAiZGVmYXVsdCJ9LCAiUkVWRVJTRV9QUk9YWV9CVUZGRVJJTkciOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAieWVzIiwgImhlbHAiOiAiRW5hYmxlIG9yIGRpc2FibGUgYnVmZmVyaW5nIG9mIHJlc3BvbnNlcyBmcm9tIHByb3hpZWQgcmVzb3VyY2UuIiwgImlkIjogInJldmVyc2UtcHJveHktYnVmZmVyaW5nIiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkgYnVmZmVyaW5nIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJtdWx0aXBsZSI6ICJyZXZlcnNlLXByb3h5IiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAieWVzIiwgIm5hbWUiOiAiUmV2ZXJzZSBwcm94eSBidWZmZXJpbmciLCAicHJldl92YWx1ZSI6ICJ5ZXMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkVuYWJsZSBvciBkaXNhYmxlIGJ1ZmZlcmluZyBvZiByZXNwb25zZXMgZnJvbSBwcm94aWVkIHJlc291cmNlLiJ9XSwgImNvbnRhaW5lckNsYXNzIjogInotMTgiLCAibWV0aG9kIjogImRlZmF1bHQifSwgIlJFVkVSU0VfUFJPWFlfS0VFUEFMSVZFIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIm5vIiwgImhlbHAiOiAiRW5hYmxlIG9yIGRpc2FibGUga2VlcGFsaXZlIGNvbm5lY3Rpb25zIHdpdGggdGhlIHByb3hpZWQgcmVzb3VyY2UuIiwgImlkIjogInJldmVyc2UtcHJveHkta2VlcGFsaXZlIiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkga2VlcGFsaXZlIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJtdWx0aXBsZSI6ICJyZXZlcnNlLXByb3h5IiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAibm8iLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IGtlZXBhbGl2ZSIsICJwcmV2X3ZhbHVlIjogIm5vIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJFbmFibGUgb3IgZGlzYWJsZSBrZWVwYWxpdmUgY29ubmVjdGlvbnMgd2l0aCB0aGUgcHJveGllZCByZXNvdXJjZS4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTE3IiwgIm1ldGhvZCI6ICJkZWZhdWx0In0sICJSRVZFUlNFX1BST1hZX0FVVEhfUkVRVUVTVCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJFbmFibGUgYXV0aGVudGljYXRpb24gdXNpbmcgYW4gZXh0ZXJuYWwgcHJvdmlkZXIgKHZhbHVlIG9mIGF1dGhfcmVxdWVzdCBkaXJlY3RpdmUpLiIsICJpZCI6ICJyZXZlcnNlLXByb3h5LWF1dGgtcmVxdWVzdCIsICJsYWJlbCI6ICJSZXZlcnNlIHByb3h5IGF1dGggcmVxdWVzdCIsICJyZWdleCI6ICJeKFxcL1tcXHdcXF0ufjpcXC8/I1xcW0AhJFxcJidcXChcXCkqKyw7PVxcLV0qfG9mZik/JCIsICJ0eXBlIjogInRleHQiLCAibXVsdGlwbGUiOiAicmV2ZXJzZS1wcm94eSIsICJwYXR0ZXJuIjogIl4oXFwvW1xcd1xcXS5+OlxcLz8jXFxbQCEkXFwmJ1xcKFxcKSorLDs9XFwtXSp8b2ZmKT8kIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IGF1dGggcmVxdWVzdCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiRW5hYmxlIGF1dGhlbnRpY2F0aW9uIHVzaW5nIGFuIGV4dGVybmFsIHByb3ZpZGVyICh2YWx1ZSBvZiBhdXRoX3JlcXVlc3QgZGlyZWN0aXZlKS4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTE2IiwgIm1ldGhvZCI6ICJkZWZhdWx0In0sICJSRVZFUlNFX1BST1hZX0FVVEhfUkVRVUVTVF9TSUdOSU5fVVJMIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIlJlZGlyZWN0IGNsaWVudHMgdG8gc2lnbi1pbiBVUkwgd2hlbiB1c2luZyBSRVZFUlNFX1BST1hZX0FVVEhfUkVRVUVTVCAodXNlZCB3aGVuIGF1dGhfcmVxdWVzdCBjYWxsIHJldHVybmVkIDQwMSkuIiwgImlkIjogInJldmVyc2UtcHJveHktYXV0aC1yZXF1ZXN0LXNpZ25pbi11cmwiLCAibGFiZWwiOiAiQXV0aCByZXF1ZXN0IHNpZ25pbiBVUkwiLCAicmVnZXgiOiAiXihodHRwcz86XFwvXFwvW1xcLVxcd0A6JS4rfiM9XStbXFwtXFx3XFwoXFwpIUA6JSsufiM/JlxcLz0kXSopPyQiLCAidHlwZSI6ICJ0ZXh0IiwgIm11bHRpcGxlIjogInJldmVyc2UtcHJveHkiLCAicGF0dGVybiI6ICJeKGh0dHBzPzpcXC9cXC9bXFwtXFx3QDolLit+Iz1dK1tcXC1cXHdcXChcXCkhQDolKy5+Iz8mXFwvPSRdKik/JCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm5hbWUiOiAiQXV0aCByZXF1ZXN0IHNpZ25pbiBVUkwiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlJlZGlyZWN0IGNsaWVudHMgdG8gc2lnbi1pbiBVUkwgd2hlbiB1c2luZyBSRVZFUlNFX1BST1hZX0FVVEhfUkVRVUVTVCAodXNlZCB3aGVuIGF1dGhfcmVxdWVzdCBjYWxsIHJldHVybmVkIDQwMSkuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xNSIsICJtZXRob2QiOiAiZGVmYXVsdCJ9LCAiUkVWRVJTRV9QUk9YWV9BVVRIX1JFUVVFU1RfU0VUIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkxpc3Qgb2YgdmFyaWFibGVzIHRvIHNldCBmcm9tIHRoZSBhdXRoZW50aWNhdGlvbiBwcm92aWRlciwgc2VwYXJhdGVkIHdpdGggc2VtaWNvbG9ucyAodmFsdWVzIG9mIGF1dGhfcmVxdWVzdF9zZXQgZGlyZWN0aXZlcykuIiwgImlkIjogInJldmVyc2UtcHJveHktYXV0aC1yZXF1ZXN0LXNldCIsICJsYWJlbCI6ICJSZXZlcnNlIHByb3h5IGF1dGggcmVxdWVzdCBzZXQiLCAicmVnZXgiOiAiXig/ISA7KSg7PyA/KFxcJFthLXpfXFwtXSspKD8hLipcXDIgKSBbXjtdKykqJCIsICJ0eXBlIjogInRleHQiLCAibXVsdGlwbGUiOiAicmV2ZXJzZS1wcm94eSIsICJwYXR0ZXJuIjogIl4oPyEgOykoOz8gPyhcXCRbYS16X1xcLV0rKSg/IS4qXFwyICkgW147XSspKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJuYW1lIjogIlJldmVyc2UgcHJveHkgYXV0aCByZXF1ZXN0IHNldCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiB2YXJpYWJsZXMgdG8gc2V0IGZyb20gdGhlIGF1dGhlbnRpY2F0aW9uIHByb3ZpZGVyLCBzZXBhcmF0ZWQgd2l0aCBzZW1pY29sb25zICh2YWx1ZXMgb2YgYXV0aF9yZXF1ZXN0X3NldCBkaXJlY3RpdmVzKS4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTE0IiwgIm1ldGhvZCI6ICJkZWZhdWx0In0sICJSRVZFUlNFX1BST1hZX0NPTk5FQ1RfVElNRU9VVCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICI2MHMiLCAiaGVscCI6ICJUaW1lb3V0IHdoZW4gY29ubmVjdGluZyB0byB0aGUgcHJveGllZCByZXNvdXJjZS4iLCAiaWQiOiAicmV2ZXJzZS1wcm94eS1jb25uZWN0LXRpbWVvdXQiLCAibGFiZWwiOiAiUmV2ZXJzZSBwcm94eSBjb25uZWN0IHRpbWVvdXQiLCAicmVnZXgiOiAiXlxcZCsobXM/fFtzaGR3TXldKSQiLCAidHlwZSI6ICJ0ZXh0IiwgIm11bHRpcGxlIjogInJldmVyc2UtcHJveHkiLCAicGF0dGVybiI6ICJeXFxkKyhtcz98W3NoZHdNeV0pJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiNjBzIiwgIm5hbWUiOiAiUmV2ZXJzZSBwcm94eSBjb25uZWN0IHRpbWVvdXQiLCAicHJldl92YWx1ZSI6ICI2MHMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlRpbWVvdXQgd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBwcm94aWVkIHJlc291cmNlLiJ9XSwgImNvbnRhaW5lckNsYXNzIjogInotMTMiLCAibWV0aG9kIjogImRlZmF1bHQifSwgIlJFVkVSU0VfUFJPWFlfUkVBRF9USU1FT1VUIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIjYwcyIsICJoZWxwIjogIlRpbWVvdXQgd2hlbiByZWFkaW5nIGZyb20gdGhlIHByb3hpZWQgcmVzb3VyY2UuIiwgImlkIjogInJldmVyc2UtcHJveHktcmVhZC10aW1lb3V0IiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkgcmVhZCB0aW1lb3V0IiwgInJlZ2V4IjogIl5cXGQrKG1zP3xbc2hkd015XSkkIiwgInR5cGUiOiAidGV4dCIsICJtdWx0aXBsZSI6ICJyZXZlcnNlLXByb3h5IiwgInBhdHRlcm4iOiAiXlxcZCsobXM/fFtzaGR3TXldKSQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjYwcyIsICJuYW1lIjogIlJldmVyc2UgcHJveHkgcmVhZCB0aW1lb3V0IiwgInByZXZfdmFsdWUiOiAiNjBzIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJUaW1lb3V0IHdoZW4gcmVhZGluZyBmcm9tIHRoZSBwcm94aWVkIHJlc291cmNlLiJ9XSwgImNvbnRhaW5lckNsYXNzIjogInotMTIiLCAibWV0aG9kIjogImRlZmF1bHQifSwgIlJFVkVSU0VfUFJPWFlfU0VORF9USU1FT1VUIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIjYwcyIsICJoZWxwIjogIlRpbWVvdXQgd2hlbiBzZW5kaW5nIHRvIHRoZSBwcm94aWVkIHJlc291cmNlLiIsICJpZCI6ICJyZXZlcnNlLXByb3h5LXNlbmQtdGltZW91dCIsICJsYWJlbCI6ICJSZXZlcnNlIHByb3h5IHNlbmQgdGltZW91dCIsICJyZWdleCI6ICJeXFxkKyhtcz98W3NoZHdNeV0pJCIsICJ0eXBlIjogInRleHQiLCAibXVsdGlwbGUiOiAicmV2ZXJzZS1wcm94eSIsICJwYXR0ZXJuIjogIl5cXGQrKG1zP3xbc2hkd015XSkkIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICI2MHMiLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IHNlbmQgdGltZW91dCIsICJwcmV2X3ZhbHVlIjogIjYwcyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVGltZW91dCB3aGVuIHNlbmRpbmcgdG8gdGhlIHByb3hpZWQgcmVzb3VyY2UuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xMSIsICJtZXRob2QiOiAiZGVmYXVsdCJ9LCAiUkVWRVJTRV9QUk9YWV9JTkNMVURFUyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJBZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gdG8gaW5jbHVkZSBpbiB0aGUgbG9jYXRpb24gYmxvY2ssIHNlcGFyYXRlZCB3aXRoIHNwYWNlcy4iLCAiaWQiOiAicmV2ZXJzZS1wcm94eS1pbmNsdWRlcyIsICJsYWJlbCI6ICJSZXZlcnNlIHByb3h5IGluY2x1ZGVzIiwgInJlZ2V4IjogIl4oPyEgKSggPyhcXHcrKSg/IS4qXFxiXFwyXFxiKSkqJCIsICJ0eXBlIjogInRleHQiLCAibXVsdGlwbGUiOiAicmV2ZXJzZS1wcm94eSIsICJwYXR0ZXJuIjogIl4oPyEgKSggPyhcXHcrKSg/IS4qXFxiXFwyXFxiKSkqJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm5hbWUiOiAiUmV2ZXJzZSBwcm94eSBpbmNsdWRlcyIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiQWRkaXRpb25hbCBjb25maWd1cmF0aW9uIHRvIGluY2x1ZGUgaW4gdGhlIGxvY2F0aW9uIGJsb2NrLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xMCIsICJtZXRob2QiOiAiZGVmYXVsdCJ9fX19fV19LCB7InRpdGxlIjogIkhUVFAgLSBHZW5lcmFsIiwgInN1YnRpdGxlIjogIkNvbmZpZ3VyZSB0aGUgc2V0dGluZ3MgcmVsYXRlZCB0byB0aGUgSFRUUChTKSBwcm90b2NvbCIsICJwbHVnaW5zIjogW3siaWQiOiAibWlzYyIsICJzdHJlYW0iOiAicGFydGlhbCIsICJuYW1lIjogIk1pc2NlbGxhbmVvdXMiLCAiZGVzY3JpcHRpb24iOiAiTWlzY2VsbGFuZW91cyBzZXR0aW5ncy4iLCAidmVyc2lvbiI6ICIxLjAiLCAidHlwZSI6ICJjb3JlIiwgIm1ldGhvZCI6ICJtYW51YWwiLCAicGFnZSI6IHRydWUsICJzZXR0aW5ncyI6IHsiQUxMT1dFRF9NRVRIT0RTIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIkdFVHxQT1NUfEhFQUQiLCAiaGVscCI6ICJBbGxvd2VkIEhUVFAgYW5kIFdlYkRBViBtZXRob2RzLCBzZXBhcmF0ZWQgd2l0aCBwaXBlcyB0byBiZSBzZW50IGJ5IGNsaWVudHMuIiwgImlkIjogImFsbG93ZWQtbWV0aG9kcyIsICJsYWJlbCI6ICJBbGxvd2VkIG1ldGhvZHMiLCAicmVnZXgiOiAiXig/IVxcfCkoXFx8PyhbQS1aXXszLH0pKD8hLiooXnxcXHwpXFwyKSkrJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeKD8hXFx8KShcXHw/KFtBLVpdezMsfSkoPyEuKihefFxcfClcXDIpKSskIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJHRVR8UE9TVHxIRUFEfE9QVElPTlN8UFVUfERFTEVURXxQQVRDSCIsICJuYW1lIjogIkFsbG93ZWQgbWV0aG9kcyIsICJwcmV2X3ZhbHVlIjogIkdFVHxQT1NUfEhFQUQiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkFsbG93ZWQgSFRUUCBhbmQgV2ViREFWIG1ldGhvZHMsIHNlcGFyYXRlZCB3aXRoIHBpcGVzIHRvIGJlIHNlbnQgYnkgY2xpZW50cy4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTEzIn0sICJNQVhfQ0xJRU5UX1NJWkUiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiMTBtIiwgImhlbHAiOiAiTWF4aW11bSBib2R5IHNpemUgKDAgZm9yIGluZmluaXRlKS4iLCAiaWQiOiAibWF4LWNsaWVudC1zaXplIiwgImxhYmVsIjogIk1heGltdW0gYm9keSBzaXplIiwgInJlZ2V4IjogIl5cXGQrW2tLbU1nR10/JCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeXFxkK1trS21NZ0ddPyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjEwMG0iLCAibmFtZSI6ICJNYXhpbXVtIGJvZHkgc2l6ZSIsICJwcmV2X3ZhbHVlIjogIjEwbSIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTWF4aW11bSBib2R5IHNpemUgKDAgZm9yIGluZmluaXRlKS4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTEyIn0sICJTU0xfUFJPVE9DT0xTIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIlRMU3YxLjIgVExTdjEuMyIsICJoZWxwIjogIlRoZSBzdXBwb3J0ZWQgdmVyc2lvbiBvZiBUTFMuIFdlIHJlY29tbWVuZCB0aGUgZGVmYXVsdCB2YWx1ZSBUTFN2MS4yIFRMU3YxLjMgZm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucy4iLCAiaWQiOiAiaHR0cHMtcHJvdG9jb2xzIiwgImxhYmVsIjogIkhUVFBTIHByb3RvY29scyIsICJyZWdleCI6ICJeKD8hICkoID9UTFN2MVxcLlswLTNdKSokIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4oPyEgKSggP1RMU3YxXFwuWzAtM10pKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIlRMU3YxLjIgVExTdjEuMyIsICJuYW1lIjogIkhUVFBTIHByb3RvY29scyIsICJwcmV2X3ZhbHVlIjogIlRMU3YxLjIgVExTdjEuMyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVGhlIHN1cHBvcnRlZCB2ZXJzaW9uIG9mIFRMUy4gV2UgcmVjb21tZW5kIHRoZSBkZWZhdWx0IHZhbHVlIFRMU3YxLjIgVExTdjEuMyBmb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotOSJ9LCAiSFRUUDIiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAieWVzIiwgImhlbHAiOiAiU3VwcG9ydCBIVFRQMiBwcm90b2NvbCB3aGVuIEhUVFBTIGlzIGVuYWJsZWQuIiwgImlkIjogImh0dHAyIiwgImxhYmVsIjogIkhUVFAyIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogInllcyIsICJuYW1lIjogIkhUVFAyIiwgInByZXZfdmFsdWUiOiAieWVzIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJTdXBwb3J0IEhUVFAyIHByb3RvY29sIHdoZW4gSFRUUFMgaXMgZW5hYmxlZC4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTgifSwgIkhUVFAzIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIm5vIiwgImhlbHAiOiAiU3VwcG9ydCBIVFRQMyBwcm90b2NvbCB3aGVuIEhUVFBTIGlzIGVuYWJsZWQuIiwgImlkIjogImh0dHAzIiwgImxhYmVsIjogIkhUVFAzIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogInllcyIsICJuYW1lIjogIkhUVFAzIiwgInByZXZfdmFsdWUiOiAibm8iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlN1cHBvcnQgSFRUUDMgcHJvdG9jb2wgd2hlbiBIVFRQUyBpcyBlbmFibGVkLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotNyJ9fSwgImNoZWNrc3VtIjogbnVsbH1dfSwgeyJ0aXRsZSI6ICJIVFRQIC0gSGVhZGVycyIsICJzdWJ0aXRsZSI6ICJDb25maWd1cmUgdGhlIHNldHRpbmdzIHJlbGF0ZWQgdG8gdGhlIEhUVFAgaGVhZGVycyIsICJwbHVnaW5zIjogW3siaWQiOiAiY29ycyIsICJzdHJlYW0iOiAibm8iLCAibmFtZSI6ICJDT1JTIiwgImRlc2NyaXB0aW9uIjogIkNyb3NzLU9yaWdpbiBSZXNvdXJjZSBTaGFyaW5nLiIsICJ2ZXJzaW9uIjogIjEuMCIsICJ0eXBlIjogImNvcmUiLCAibWV0aG9kIjogIm1hbnVhbCIsICJwYWdlIjogdHJ1ZSwgInNldHRpbmdzIjogeyJVU0VfQ09SUyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJubyIsICJoZWxwIjogIlVzZSBDT1JTIiwgImlkIjogInVzZS1jb3JzIiwgImxhYmVsIjogIlVzZSBDT1JTIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogInllcyIsICJuYW1lIjogIlVzZSBDT1JTIiwgInByZXZfdmFsdWUiOiAibm8iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlVzZSBDT1JTIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xMCJ9LCAiQ09SU19BTExPV19PUklHSU4iOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiKiIsICJoZWxwIjogIkFsbG93ZWQgb3JpZ2lucyB0byBtYWtlIENPUlMgcmVxdWVzdHMgOiBQQ1JFIHJlZ2V4IG9yICouIiwgImlkIjogImNvcnMtYWxsb3ctb3JpZ2luIiwgImxhYmVsIjogIkFsbG93ZWQgb3JpZ2lucyIsICJyZWdleCI6ICJeLiokIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4uKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogInNlbGYiLCAibmFtZSI6ICJBbGxvd2VkIG9yaWdpbnMiLCAicHJldl92YWx1ZSI6ICIqIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJBbGxvd2VkIG9yaWdpbnMgdG8gbWFrZSBDT1JTIHJlcXVlc3RzIDogUENSRSByZWdleCBvciAqLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotOSJ9fSwgImNoZWNrc3VtIjogbnVsbH0sIHsiaWQiOiAiaGVhZGVycyIsICJzdHJlYW0iOiAibm8iLCAibmFtZSI6ICJIZWFkZXJzIiwgImRlc2NyaXB0aW9uIjogIk1hbmFnZSBIVFRQIGhlYWRlcnMgc2VudCB0byBjbGllbnRzLiIsICJ2ZXJzaW9uIjogIjEuMCIsICJ0eXBlIjogImNvcmUiLCAibWV0aG9kIjogIm1hbnVhbCIsICJwYWdlIjogZmFsc2UsICJzZXR0aW5ncyI6IHsiS0VFUF9VUFNUUkVBTV9IRUFERVJTIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIkNvbnRlbnQtU2VjdXJpdHktUG9saWN5IFBlcm1pc3Npb25zLVBvbGljeSBGZWF0dXJlLVBvbGljeSBYLUZyYW1lLU9wdGlvbnMiLCAiaGVscCI6ICJIZWFkZXJzIHRvIGtlZXAgZnJvbSB1cHN0cmVhbSAoSGVhZGVyMSBIZWFkZXIyIEhlYWRlcjMgLi4uIG9yICogZm9yIGFsbCkuIiwgImlkIjogImtlZXAtdXBzdHJlYW0taGVhZGVycyIsICJsYWJlbCI6ICJLZWVwIHVwc3RyZWFtIGhlYWRlcnMiLCAicmVnZXgiOiAiXigoPyEgKSggP1tcXHdcXC1dKykrfFxcKik/JCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeKCg/ISApKCA/W1xcd1xcLV0rKSt8XFwqKT8kIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJDb250ZW50LVNlY3VyaXR5LVBvbGljeSBQZXJtaXNzaW9ucy1Qb2xpY3kgWC1GcmFtZS1PcHRpb25zIiwgIm5hbWUiOiAiS2VlcCB1cHN0cmVhbSBoZWFkZXJzIiwgInByZXZfdmFsdWUiOiAiQ29udGVudC1TZWN1cml0eS1Qb2xpY3kgUGVybWlzc2lvbnMtUG9saWN5IEZlYXR1cmUtUG9saWN5IFgtRnJhbWUtT3B0aW9ucyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiSGVhZGVycyB0byBrZWVwIGZyb20gdXBzdHJlYW0gKEhlYWRlcjEgSGVhZGVyMiBIZWFkZXIzIC4uLiBvciAqIGZvciBhbGwpLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMTEifSwgIkNPTlRFTlRfU0VDVVJJVFlfUE9MSUNZIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIm9iamVjdC1zcmMgJ25vbmUnOyBmb3JtLWFjdGlvbiAnc2VsZic7IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IiwgImhlbHAiOiAiVmFsdWUgZm9yIHRoZSBDb250ZW50LVNlY3VyaXR5LVBvbGljeSBoZWFkZXIuIiwgImlkIjogImNvbnRlbnQtc2VjdXJpdHktcG9saWN5IiwgImxhYmVsIjogIkNvbnRlbnQtU2VjdXJpdHktUG9saWN5IiwgInJlZ2V4IjogIl4uKiQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXi4qJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm5hbWUiOiAiQ29udGVudC1TZWN1cml0eS1Qb2xpY3kiLCAicHJldl92YWx1ZSI6ICJvYmplY3Qtc3JjICdub25lJzsgZm9ybS1hY3Rpb24gJ3NlbGYnOyBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVmFsdWUgZm9yIHRoZSBDb250ZW50LVNlY3VyaXR5LVBvbGljeSBoZWFkZXIuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei03In0sICJSRUZFUlJFUl9QT0xJQ1kiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAic3RyaWN0LW9yaWdpbi13aGVuLWNyb3NzLW9yaWdpbiIsICJoZWxwIjogIlZhbHVlIGZvciB0aGUgUmVmZXJyZXItUG9saWN5IGhlYWRlci4iLCAiaWQiOiAicmVmZXJyZXItcG9saWN5IiwgImxhYmVsIjogIlJlZmVycmVyLVBvbGljeSIsICJyZWdleCI6ICJeKD8hXigsfCApKSgoLCApPyhuby1yZWZlcnJlci13aGVuLWRvd25ncmFkZXxuby1yZWZlcnJlcnxvcmlnaW4td2hlbi1jcm9zcy1vcmlnaW58c2FtZS1vcmlnaW58c3RyaWN0LW9yaWdpbi13aGVuLWNyb3NzLW9yaWdpbnxzdHJpY3Qtb3JpZ2lufG9yaWdpbnx1bnNhZmUtdXJsKSg/IVxcYi4qLCBcXDRcXGIpKSokIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl4oPyFeKCx8ICkpKCgsICk/KG5vLXJlZmVycmVyLXdoZW4tZG93bmdyYWRlfG5vLXJlZmVycmVyfG9yaWdpbi13aGVuLWNyb3NzLW9yaWdpbnxzYW1lLW9yaWdpbnxzdHJpY3Qtb3JpZ2luLXdoZW4tY3Jvc3Mtb3JpZ2lufHN0cmljdC1vcmlnaW58b3JpZ2lufHVuc2FmZS11cmwpKD8hXFxiLiosIFxcNFxcYikpKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIm5vLXJlZmVycmVyLXdoZW4tZG93bmdyYWRlIiwgIm5hbWUiOiAiUmVmZXJyZXItUG9saWN5IiwgInByZXZfdmFsdWUiOiAic3RyaWN0LW9yaWdpbi13aGVuLWNyb3NzLW9yaWdpbiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVmFsdWUgZm9yIHRoZSBSZWZlcnJlci1Qb2xpY3kgaGVhZGVyLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotNSJ9LCAiUEVSTUlTU0lPTlNfUE9MSUNZIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogImFjY2VsZXJvbWV0ZXI9KCksIGFtYmllbnQtbGlnaHQtc2Vuc29yPSgpLCBhdXRvcGxheT0oKSwgYmF0dGVyeT0oKSwgY2FtZXJhPSgpLCBjcm9zcy1vcmlnaW4taXNvbGF0ZWQ9KCksIGRpc3BsYXktY2FwdHVyZT0oKSwgZG9jdW1lbnQtZG9tYWluPSgpLCBlbmNyeXB0ZWQtbWVkaWE9KCksIGV4ZWN1dGlvbi13aGlsZS1ub3QtcmVuZGVyZWQ9KCksIGV4ZWN1dGlvbi13aGlsZS1vdXQtb2Ytdmlld3BvcnQ9KCksIGZ1bGxzY3JlZW49KCksIGdlb2xvY2F0aW9uPSgpLCBneXJvc2NvcGU9KCksIGhpZD0oKSwgaWRsZS1kZXRlY3Rpb249KCksIG1hZ25ldG9tZXRlcj0oKSwgbWljcm9waG9uZT0oKSwgbWlkaT0oKSwgbmF2aWdhdGlvbi1vdmVycmlkZT0oKSwgcGF5bWVudD0oKSwgcGljdHVyZS1pbi1waWN0dXJlPSgpLCBwdWJsaWNrZXktY3JlZGVudGlhbHMtZ2V0PSgpLCBzY3JlZW4td2FrZS1sb2NrPSgpLCBzZXJpYWw9KCksIHVzYj0oKSwgd2ViLXNoYXJlPSgpLCB4ci1zcGF0aWFsLXRyYWNraW5nPSgpIiwgImhlbHAiOiAiVmFsdWUgZm9yIHRoZSBQZXJtaXNzaW9ucy1Qb2xpY3kgaGVhZGVyLiIsICJpZCI6ICJwZXJtaXNzaW9ucy1wb2xpY3kiLCAibGFiZWwiOiAiUGVybWlzc2lvbnMtUG9saWN5IiwgInJlZ2V4IjogIl4oPyFbLCBdKSgsPyA/KFthLXpcXC1dKykoPyEuKlteXFwtXVxcMj0pPShcXCp8XFwoKCA/KHNlbGZ8XFx1MDAyMmh0dHBzPzpcXC9cXC9bXFwtXFx3QDolLit+Iz1dK1tcXC1cXHdcXChcXCkhQDolKy5+Iz8mXFwvPSRdKlxcdTAwMjIpKD89WyBcXCldKSkqXFwpKSkqJCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeKD8hWywgXSkoLD8gPyhbYS16XFwtXSspKD8hLipbXlxcLV1cXDI9KT0oXFwqfFxcKCggPyhzZWxmfFxcdTAwMjJodHRwcz86XFwvXFwvW1xcLVxcd0A6JS4rfiM9XStbXFwtXFx3XFwoXFwpIUA6JSsufiM/JlxcLz0kXSpcXHUwMDIyKSg/PVsgXFwpXSkpKlxcKSkpKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogImFjY2VsZXJvbWV0ZXI9KCksIGFtYmllbnQtbGlnaHQtc2Vuc29yPSgpLCBhdHRyaWJ1dGlvbi1yZXBvcnRpbmc9KCksIGF1dG9wbGF5PSgpLCBiYXR0ZXJ5PSgpLCBibHVldG9vdGg9KCksIGJyb3dzaW5nLXRvcGljcz0oKSwgY2FtZXJhPSgpLCBjb21wdXRlLXByZXNzdXJlPSgpLCBkaXNwbGF5LWNhcHR1cmU9KCksIGRvY3VtZW50LWRvbWFpbj0oKSwgZW5jcnlwdGVkLW1lZGlhPSgpLCBleGVjdXRpb24td2hpbGUtbm90LXJlbmRlcmVkPSgpLCBleGVjdXRpb24td2hpbGUtb3V0LW9mLXZpZXdwb3J0PSgpLCBmdWxsc2NyZWVuPSgpLCBnYW1lcGFkPSgpLCBnZW9sb2NhdGlvbj0oKSwgZ3lyb3Njb3BlPSgpLCBoaWQ9KCksIGlkZW50aXR5LWNyZWRlbnRpYWxzLWdldD0oKSwgaWRsZS1kZXRlY3Rpb249KCksIGxvY2FsLWZvbnRzPSgpLCBtYWduZXRvbWV0ZXI9KCksIG1pY3JvcGhvbmU9KCksIG1pZGk9KCksIG90cC1jcmVkZW50aWFscz0oKSwgcGF5bWVudD0oKSwgcGljdHVyZS1pbi1waWN0dXJlPSgpLCBwdWJsaWNrZXktY3JlZGVudGlhbHMtY3JlYXRlPSgpLCBwdWJsaWNrZXktY3JlZGVudGlhbHMtZ2V0PSgpLCBzY3JlZW4td2FrZS1sb2NrPSgpLCBzZXJpYWw9KCksIHNwZWFrZXItc2VsZWN0aW9uPSgpLCBzdG9yYWdlLWFjY2Vzcz0oKSwgdXNiPSgpLCB3ZWItc2hhcmU9KCksIHdpbmRvdy1tYW5hZ2VtZW50PSgpLCB4ci1zcGF0aWFsLXRyYWNraW5nPSgpIiwgIm5hbWUiOiAiUGVybWlzc2lvbnMtUG9saWN5IiwgInByZXZfdmFsdWUiOiAiYWNjZWxlcm9tZXRlcj0oKSwgYW1iaWVudC1saWdodC1zZW5zb3I9KCksIGF1dG9wbGF5PSgpLCBiYXR0ZXJ5PSgpLCBjYW1lcmE9KCksIGNyb3NzLW9yaWdpbi1pc29sYXRlZD0oKSwgZGlzcGxheS1jYXB0dXJlPSgpLCBkb2N1bWVudC1kb21haW49KCksIGVuY3J5cHRlZC1tZWRpYT0oKSwgZXhlY3V0aW9uLXdoaWxlLW5vdC1yZW5kZXJlZD0oKSwgZXhlY3V0aW9uLXdoaWxlLW91dC1vZi12aWV3cG9ydD0oKSwgZnVsbHNjcmVlbj0oKSwgZ2VvbG9jYXRpb249KCksIGd5cm9zY29wZT0oKSwgaGlkPSgpLCBpZGxlLWRldGVjdGlvbj0oKSwgbWFnbmV0b21ldGVyPSgpLCBtaWNyb3Bob25lPSgpLCBtaWRpPSgpLCBuYXZpZ2F0aW9uLW92ZXJyaWRlPSgpLCBwYXltZW50PSgpLCBwaWN0dXJlLWluLXBpY3R1cmU9KCksIHB1YmxpY2tleS1jcmVkZW50aWFscy1nZXQ9KCksIHNjcmVlbi13YWtlLWxvY2s9KCksIHNlcmlhbD0oKSwgdXNiPSgpLCB3ZWItc2hhcmU9KCksIHhyLXNwYXRpYWwtdHJhY2tpbmc9KCkiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlZhbHVlIGZvciB0aGUgUGVybWlzc2lvbnMtUG9saWN5IGhlYWRlci4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTQifX0sICJjaGVja3N1bSI6IG51bGwsICJtdWx0aXBsZXNfc2NoZW1hIjogeyJjdXN0b20taGVhZGVycyI6IHsiQ1VTVE9NX0hFQURFUiI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJDdXN0b20gaGVhZGVyIHRvIGFkZCAoSGVhZGVyTmFtZTogSGVhZGVyVmFsdWUpLiIsICJpZCI6ICJjdXN0b20taGVhZGVyIiwgImxhYmVsIjogIkN1c3RvbSBoZWFkZXIgKEhlYWRlck5hbWU6IEhlYWRlclZhbHVlKSIsICJyZWdleCI6ICJeKFtcXHdcXC1dKzogLispPyQiLCAidHlwZSI6ICJ0ZXh0IiwgIm11bHRpcGxlIjogImN1c3RvbS1oZWFkZXJzIiwgInBhdHRlcm4iOiAiXihbXFx3XFwtXSs6IC4rKT8kIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibmFtZSI6ICJDdXN0b20gaGVhZGVyIChIZWFkZXJOYW1lOiBIZWFkZXJWYWx1ZSkiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkN1c3RvbSBoZWFkZXIgdG8gYWRkIChIZWFkZXJOYW1lOiBIZWFkZXJWYWx1ZSkuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xMyJ9fSwgImNvb2tpZS1mbGFncyI6IHsiQ09PS0lFX0ZMQUdTIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiogSHR0cE9ubHkgU2FtZVNpdGU9TGF4IiwgImhlbHAiOiAiQ29va2llIGZsYWdzIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gYWxsIGNvb2tpZXMgKHZhbHVlIGFjY2VwdGVkIGZvciBuZ2lueF9jb29raWVfZmxhZ19tb2R1bGUpLiIsICJpZCI6ICJjb29raWUtZmxhZ3MiLCAibGFiZWwiOiAiQ29va2llIGZsYWdzIiwgInJlZ2V4IjogIl4oXFwqfFteO10rKSggKEh0dHBPbmx5fChTYW1lU2l0ZSkoPyEuKlxcNCkoPShMYXh8U3RyaWN0KSk/KSg/IS4qXFwzKSkqJCIsICJ0eXBlIjogInRleHQiLCAibXVsdGlwbGUiOiAiY29va2llLWZsYWdzIiwgInBhdHRlcm4iOiAiXihcXCp8W147XSspKCAoSHR0cE9ubHl8KFNhbWVTaXRlKSg/IS4qXFw0KSg9KExheHxTdHJpY3QpKT8pKD8hLipcXDMpKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIqIEh0dHBPbmx5IFNhbWVTaXRlPUxheCIsICJuYW1lIjogIkNvb2tpZSBmbGFncyIsICJwcmV2X3ZhbHVlIjogIiogSHR0cE9ubHkgU2FtZVNpdGU9TGF4IiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJDb29raWUgZmxhZ3MgYXV0b21hdGljYWxseSBhZGRlZCB0byBhbGwgY29va2llcyAodmFsdWUgYWNjZXB0ZWQgZm9yIG5naW54X2Nvb2tpZV9mbGFnX21vZHVsZSkuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xMiJ9fX0sICJtdWx0aXBsZXMiOiB7ImN1c3RvbS1oZWFkZXJzIjogeyIwIjogeyJDVVNUT01fSEVBREVSIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkN1c3RvbSBoZWFkZXIgdG8gYWRkIChIZWFkZXJOYW1lOiBIZWFkZXJWYWx1ZSkuIiwgImlkIjogImN1c3RvbS1oZWFkZXIiLCAibGFiZWwiOiAiQ3VzdG9tIGhlYWRlciAoSGVhZGVyTmFtZTogSGVhZGVyVmFsdWUpIiwgInJlZ2V4IjogIl4oW1xcd1xcLV0rOiAuKyk/JCIsICJ0eXBlIjogInRleHQiLCAibXVsdGlwbGUiOiAiY3VzdG9tLWhlYWRlcnMiLCAicGF0dGVybiI6ICJeKFtcXHdcXC1dKzogLispPyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJuYW1lIjogIkN1c3RvbSBoZWFkZXIgKEhlYWRlck5hbWU6IEhlYWRlclZhbHVlKSIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiQ3VzdG9tIGhlYWRlciB0byBhZGQgKEhlYWRlck5hbWU6IEhlYWRlclZhbHVlKS4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTEzIiwgIm1ldGhvZCI6ICJkZWZhdWx0In19LCAiMiI6IHsiQ1VTVE9NX0hFQURFUl8yIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkN1c3RvbSBoZWFkZXIgdG8gYWRkIChIZWFkZXJOYW1lOiBIZWFkZXJWYWx1ZSkuIiwgImlkIjogImN1c3RvbS1oZWFkZXItMiIsICJsYWJlbCI6ICJDdXN0b20gaGVhZGVyIChIZWFkZXJOYW1lOiBIZWFkZXJWYWx1ZSkiLCAicmVnZXgiOiAiXihbXFx3XFwtXSs6IC4rKT8kIiwgInR5cGUiOiAidGV4dCIsICJtdWx0aXBsZSI6ICJjdXN0b20taGVhZGVycyIsICJwYXR0ZXJuIjogIl4oW1xcd1xcLV0rOiAuKyk/JCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiZHpkeiIsICJuYW1lIjogIkN1c3RvbSBoZWFkZXIgKEhlYWRlck5hbWU6IEhlYWRlclZhbHVlKSIsICJwcmV2X3ZhbHVlIjogImR6ZHoiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkN1c3RvbSBoZWFkZXIgdG8gYWRkIChIZWFkZXJOYW1lOiBIZWFkZXJWYWx1ZSkuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xMyIsICJtZXRob2QiOiAiZGVmYXVsdCJ9fX0sICJjb29raWUtZmxhZ3MiOiB7IjAiOiB7IkNPT0tJRV9GTEFHUyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIqIEh0dHBPbmx5IFNhbWVTaXRlPUxheCIsICJoZWxwIjogIkNvb2tpZSBmbGFncyBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIGFsbCBjb29raWVzICh2YWx1ZSBhY2NlcHRlZCBmb3IgbmdpbnhfY29va2llX2ZsYWdfbW9kdWxlKS4iLCAiaWQiOiAiY29va2llLWZsYWdzIiwgImxhYmVsIjogIkNvb2tpZSBmbGFncyIsICJyZWdleCI6ICJeKFxcKnxbXjtdKykoIChIdHRwT25seXwoU2FtZVNpdGUpKD8hLipcXDQpKD0oTGF4fFN0cmljdCkpPykoPyEuKlxcMykpKiQiLCAidHlwZSI6ICJ0ZXh0IiwgIm11bHRpcGxlIjogImNvb2tpZS1mbGFncyIsICJwYXR0ZXJuIjogIl4oXFwqfFteO10rKSggKEh0dHBPbmx5fChTYW1lU2l0ZSkoPyEuKlxcNCkoPShMYXh8U3RyaWN0KSk/KSg/IS4qXFwzKSkqJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiKiBIdHRwT25seSBTYW1lU2l0ZT1MYXgiLCAibmFtZSI6ICJDb29raWUgZmxhZ3MiLCAicHJldl92YWx1ZSI6ICIqIEh0dHBPbmx5IFNhbWVTaXRlPUxheCIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiQ29va2llIGZsYWdzIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gYWxsIGNvb2tpZXMgKHZhbHVlIGFjY2VwdGVkIGZvciBuZ2lueF9jb29raWVfZmxhZ19tb2R1bGUpLiJ9XSwgImNvbnRhaW5lckNsYXNzIjogInotMTIiLCAibWV0aG9kIjogImRlZmF1bHQifX19fX1dfSwgeyJ0aXRsZSI6ICJTZWN1cml0eSAtIEJhZCBiZWhhdmlvciIsICJzdWJ0aXRsZSI6ICJDb25maWd1cmUgdGhlIHNldHRpbmdzIHJlbGF0ZWQgdG8gdGhlIGF1dG9tYXRpYyBiYW4gd2hlbiBhIGJhZCBiZWhhdmlvciBpcyBkZXRlY3RlZC4iLCAicGx1Z2lucyI6IFt7ImlkIjogImJhZGJlaGF2aW9yIiwgInN0cmVhbSI6ICJ5ZXMiLCAibmFtZSI6ICJCYWQgYmVoYXZpb3IiLCAiZGVzY3JpcHRpb24iOiAiQmFuIElQIGdlbmVyYXRpbmcgdG9vIG11Y2ggJ2JhZCcgSFRUUCBzdGF0dXMgY29kZSBpbiBhIHBlcmlvZCBvZiB0aW1lLiIsICJ2ZXJzaW9uIjogIjEuMCIsICJ0eXBlIjogImNvcmUiLCAibWV0aG9kIjogIm1hbnVhbCIsICJwYWdlIjogdHJ1ZSwgInNldHRpbmdzIjogeyJVU0VfQkFEX0JFSEFWSU9SIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogInllcyIsICJoZWxwIjogIkFjdGl2YXRlIEJhZCBiZWhhdmlvciBmZWF0dXJlLiIsICJpZCI6ICJ1c2UtYmFkLWJlaGF2aW9yIiwgImxhYmVsIjogIkFjdGl2YXRlIGJhZCBiZWhhdmlvciIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJ5ZXMiLCAibmFtZSI6ICJBY3RpdmF0ZSBiYWQgYmVoYXZpb3IiLCAicHJldl92YWx1ZSI6ICJ5ZXMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkFjdGl2YXRlIEJhZCBiZWhhdmlvciBmZWF0dXJlLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotNCJ9LCAiQkFEX0JFSEFWSU9SX1NUQVRVU19DT0RFUyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICI0MDAgNDAxIDQwMyA0MDQgNDA1IDQyOSA0NDQiLCAiaGVscCI6ICJMaXN0IG9mIEhUVFAgc3RhdHVzIGNvZGVzIGNvbnNpZGVyZWQgYXMgJ2JhZCcuIiwgImlkIjogImJhZC1iZWhhdmlvci1zdGF0dXMtY29kZSIsICJsYWJlbCI6ICJCYWQgc3RhdHVzIGNvZGVzIiwgInJlZ2V4IjogIl4oICooWzEtNV1cXGR7Mn0pKD8hLipcXDIpICopKyQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXiggKihbMS01XVxcZHsyfSkoPyEuKlxcMikgKikrJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiNDAwIDQwMSA0MDMgNDA0IDQwNSA0MjkgNDQ0IiwgIm5hbWUiOiAiQmFkIHN0YXR1cyBjb2RlcyIsICJwcmV2X3ZhbHVlIjogIjQwMCA0MDEgNDAzIDQwNCA0MDUgNDI5IDQ0NCIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBIVFRQIHN0YXR1cyBjb2RlcyBjb25zaWRlcmVkIGFzICdiYWQnLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMyJ9LCAiQkFEX0JFSEFWSU9SX1RIUkVTSE9MRCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIxMCIsICJoZWxwIjogIk1heGltdW0gbnVtYmVyIG9mICdiYWQnIEhUVFAgc3RhdHVzIGNvZGVzIHdpdGhpbiB0aGUgcGVyaW9kIG9mIHRpbWUgYmVmb3JlIElQIGlzIGJhbm5lZC4iLCAiaWQiOiAiYmFkLWJlaGF2aW9yLXRocmVzaG9sZCIsICJsYWJlbCI6ICJUaHJlc2hvbGQiLCAicmVnZXgiOiAiXlsxLTldWzAtOV0qIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl5bMS05XVswLTldKiIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiMzAiLCAibmFtZSI6ICJUaHJlc2hvbGQiLCAicHJldl92YWx1ZSI6ICIxMCIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTWF4aW11bSBudW1iZXIgb2YgJ2JhZCcgSFRUUCBzdGF0dXMgY29kZXMgd2l0aGluIHRoZSBwZXJpb2Qgb2YgdGltZSBiZWZvcmUgSVAgaXMgYmFubmVkLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMiJ9LCAiQkFEX0JFSEFWSU9SX0NPVU5UX1RJTUUiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiNjAiLCAiaGVscCI6ICJQZXJpb2Qgb2YgdGltZSAoaW4gc2Vjb25kcykgZHVyaW5nIHdoaWNoIHdlIGNvdW50ICdiYWQnIEhUVFAgc3RhdHVzIGNvZGVzLiIsICJpZCI6ICJiYWQtYmVoYXZpb3ItcGVyaW9kIiwgImxhYmVsIjogIlBlcmlvZCAoaW4gc2Vjb25kcykiLCAicmVnZXgiOiAiXlxcZCsiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXlxcZCsiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjYwIiwgIm5hbWUiOiAiUGVyaW9kIChpbiBzZWNvbmRzKSIsICJwcmV2X3ZhbHVlIjogIjYwIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJQZXJpb2Qgb2YgdGltZSAoaW4gc2Vjb25kcykgZHVyaW5nIHdoaWNoIHdlIGNvdW50ICdiYWQnIEhUVFAgc3RhdHVzIGNvZGVzLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMSJ9LCAiQkFEX0JFSEFWSU9SX0JBTl9USU1FIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIjg2NDAwIiwgImhlbHAiOiAiVGhlIGR1cmF0aW9uIHRpbWUgKGluIHNlY29uZHMpIG9mIGEgYmFuIHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcgSVAgaGFzIHJlYWNoZWQgdGhlIHRocmVzaG9sZC4iLCAiaWQiOiAiYmFkLWJlaGF2aW9yLWJhbi10aW1lIiwgImxhYmVsIjogIkJhbiBkdXJhdGlvbiAoaW4gc2Vjb25kcykiLCAicmVnZXgiOiAiXlxcZCsiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXlxcZCsiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjM2MDAiLCAibmFtZSI6ICJCYW4gZHVyYXRpb24gKGluIHNlY29uZHMpIiwgInByZXZfdmFsdWUiOiAiODY0MDAiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlRoZSBkdXJhdGlvbiB0aW1lIChpbiBzZWNvbmRzKSBvZiBhIGJhbiB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIElQIGhhcyByZWFjaGVkIHRoZSB0aHJlc2hvbGQuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0wIn19LCAiY2hlY2tzdW0iOiBudWxsfV19LCB7InRpdGxlIjogIlNlY3VyaXR5IC0gQmxhY2tsaXN0aW5nIiwgInN1YnRpdGxlIjogIkNvbmZpZ3VyZSB0aGUgc2V0dGluZ3MgcmVsYXRlZCB0byB0aGUgZXh0ZXJuYWwgYmxhY2tsaXN0cy4iLCAicGx1Z2lucyI6IFt7ImlkIjogImJsYWNrbGlzdCIsICJzdHJlYW0iOiAicGFydGlhbCIsICJuYW1lIjogIkJsYWNrbGlzdCIsICJkZXNjcmlwdGlvbiI6ICJEZW55IGFjY2VzcyBiYXNlZCBvbiBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgSVAvbmV0d29yay9yRE5TL0FTTiBibGFja2xpc3RzLiIsICJ2ZXJzaW9uIjogIjEuMCIsICJ0eXBlIjogImNvcmUiLCAibWV0aG9kIjogIm1hbnVhbCIsICJwYWdlIjogdHJ1ZSwgInNldHRpbmdzIjogeyJVU0VfQkxBQ0tMSVNUIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogInllcyIsICJoZWxwIjogIkFjdGl2YXRlIGJsYWNrbGlzdCBmZWF0dXJlLiIsICJpZCI6ICJ1c2UtYmxhY2tsaXN0IiwgImxhYmVsIjogIkFjdGl2YXRlIGJsYWNrbGlzdGluZyIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogdHJ1ZSwgInZhbHVlIjogIm5vIiwgIm5hbWUiOiAiQWN0aXZhdGUgYmxhY2tsaXN0aW5nIiwgInByZXZfdmFsdWUiOiAieWVzIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAidHJlc3Bhc3MiLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tZXRob2RfZGlzYWJsZWQifSwgeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkFjdGl2YXRlIGJsYWNrbGlzdCBmZWF0dXJlLiJ9XSwgIm1ldGhvZCI6ICJzY2hlZHVsZXIiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xMSJ9fSwgImNoZWNrc3VtIjogbnVsbH0sIHsiaWQiOiAiZG5zYmwiLCAic3RyZWFtIjogInllcyIsICJuYW1lIjogIkROU0JMIiwgImRlc2NyaXB0aW9uIjogIkRlbnkgYWNjZXNzIGJhc2VkIG9uIGV4dGVybmFsIEROU0JMIHNlcnZlcnMuIiwgInZlcnNpb24iOiAiMS4wIiwgInR5cGUiOiAiY29yZSIsICJtZXRob2QiOiAibWFudWFsIiwgInBhZ2UiOiB0cnVlLCAic2V0dGluZ3MiOiB7IlVTRV9ETlNCTCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJ5ZXMiLCAiaGVscCI6ICJBY3RpdmF0ZSBETlNCTCBmZWF0dXJlLiIsICJpZCI6ICJ1c2UtZG5zYmwiLCAibGFiZWwiOiAiQWN0aXZhdGUgRE5TQkwiLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAibm8iLCAibmFtZSI6ICJBY3RpdmF0ZSBETlNCTCIsICJwcmV2X3ZhbHVlIjogInllcyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiQWN0aXZhdGUgRE5TQkwgZmVhdHVyZS4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTAifX0sICJjaGVja3N1bSI6IG51bGx9XX0sIHsidGl0bGUiOiAiU2VjdXJpdHkgLSBMaW1pdGluZyIsICJzdWJ0aXRsZSI6ICJDb25maWd1cmUgdGhlIHNldHRpbmdzIHJlbGF0ZWQgdG8gbGltaXRpbmcgcmVxdWVzdHMgYW5kIGNvbm5lY3Rpb25zLiIsICJwbHVnaW5zIjogW3siaWQiOiAibGltaXQiLCAic3RyZWFtIjogInBhcnRpYWwiLCAibmFtZSI6ICJMaW1pdCIsICJkZXNjcmlwdGlvbiI6ICJMaW1pdCBtYXhpbXVtIG51bWJlciBvZiByZXF1ZXN0cyBhbmQgY29ubmVjdGlvbnMuIiwgInZlcnNpb24iOiAiMS4wIiwgInR5cGUiOiAiY29yZSIsICJtZXRob2QiOiAibWFudWFsIiwgInBhZ2UiOiB0cnVlLCAic2V0dGluZ3MiOiB7IlVTRV9MSU1JVF9SRVEiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAieWVzIiwgImhlbHAiOiAiQWN0aXZhdGUgbGltaXQgcmVxdWVzdHMgZmVhdHVyZS4iLCAiaWQiOiAidXNlLWxpbWl0LXJlcSIsICJsYWJlbCI6ICJBY3RpdmF0ZSBsaW1pdCByZXF1ZXN0cyIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJ5ZXMiLCAibmFtZSI6ICJBY3RpdmF0ZSBsaW1pdCByZXF1ZXN0cyIsICJwcmV2X3ZhbHVlIjogInllcyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiQWN0aXZhdGUgbGltaXQgcmVxdWVzdHMgZmVhdHVyZS4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTYifSwgIlVTRV9MSU1JVF9DT05OIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogInllcyIsICJoZWxwIjogIkFjdGl2YXRlIGxpbWl0IGNvbm5lY3Rpb25zIGZlYXR1cmUuIiwgImlkIjogInVzZS1saW1pdC1jb25uIiwgImxhYmVsIjogIkFjdGl2YXRlIGxpbWl0IGNvbm5lY3Rpb25zIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogInllcyIsICJuYW1lIjogIkFjdGl2YXRlIGxpbWl0IGNvbm5lY3Rpb25zIiwgInByZXZfdmFsdWUiOiAieWVzIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJBY3RpdmF0ZSBsaW1pdCBjb25uZWN0aW9ucyBmZWF0dXJlLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotMyJ9LCAiTElNSVRfQ09OTl9NQVhfSFRUUDEiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiMTAiLCAiaGVscCI6ICJNYXhpbXVtIG51bWJlciBvZiBjb25uZWN0aW9ucyBwZXIgSVAgd2hlbiB1c2luZyBIVFRQLzEuWCBwcm90b2NvbC4iLCAiaWQiOiAibGltaXQtY29ubi1tYXgtaHR0cDEiLCAibGFiZWwiOiAiTWF4aW11bSBudW1iZXIgb2YgSFRUUC8xLlggY29ubmVjdGlvbnMiLCAicmVnZXgiOiAiXlxcZCskIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl5cXGQrJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiMjUiLCAibmFtZSI6ICJNYXhpbXVtIG51bWJlciBvZiBIVFRQLzEuWCBjb25uZWN0aW9ucyIsICJwcmV2X3ZhbHVlIjogIjEwIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJNYXhpbXVtIG51bWJlciBvZiBjb25uZWN0aW9ucyBwZXIgSVAgd2hlbiB1c2luZyBIVFRQLzEuWCBwcm90b2NvbC4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTIifSwgIkxJTUlUX0NPTk5fTUFYX0hUVFAyIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIjEwMCIsICJoZWxwIjogIk1heGltdW0gbnVtYmVyIG9mIHN0cmVhbXMgcGVyIElQIHdoZW4gdXNpbmcgSFRUUC8yIHByb3RvY29sLiIsICJpZCI6ICJsaW1pdC1jb25uLW1heC1odHRwMiIsICJsYWJlbCI6ICJNYXhpbXVtIG51bWJlciBvZiBIVFRQLzIgc3RyZWFtcyIsICJyZWdleCI6ICJeXFxkKyQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXlxcZCskIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIyMDAiLCAibmFtZSI6ICJNYXhpbXVtIG51bWJlciBvZiBIVFRQLzIgc3RyZWFtcyIsICJwcmV2X3ZhbHVlIjogIjEwMCIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTWF4aW11bSBudW1iZXIgb2Ygc3RyZWFtcyBwZXIgSVAgd2hlbiB1c2luZyBIVFRQLzIgcHJvdG9jb2wuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xIn19LCAiY2hlY2tzdW0iOiBudWxsLCAibXVsdGlwbGVzX3NjaGVtYSI6IHsibGltaXQtcmVxIjogeyJMSU1JVF9SRVFfVVJMIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIi8iLCAiaGVscCI6ICJVUkwgKFBDUkUgcmVnZXgpIHdoZXJlIHRoZSBsaW1pdCByZXF1ZXN0IHdpbGwgYmUgYXBwbGllZCBvciBzcGVjaWFsIHZhbHVlIC8gZm9yIGFsbCByZXF1ZXN0cy4iLCAiaWQiOiAibGltaXQtcmVxLXVybCIsICJsYWJlbCI6ICJMaW1pdCByZXF1ZXN0IFVSTCIsICJyZWdleCI6ICJeLiskIiwgInR5cGUiOiAidGV4dCIsICJtdWx0aXBsZSI6ICJsaW1pdC1yZXEiLCAicGF0dGVybiI6ICJeLiskIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIvIiwgIm5hbWUiOiAiTGltaXQgcmVxdWVzdCBVUkwiLCAicHJldl92YWx1ZSI6ICIvIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJVUkwgKFBDUkUgcmVnZXgpIHdoZXJlIHRoZSBsaW1pdCByZXF1ZXN0IHdpbGwgYmUgYXBwbGllZCBvciBzcGVjaWFsIHZhbHVlIC8gZm9yIGFsbCByZXF1ZXN0cy4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTYifSwgIkxJTUlUX1JFUV9SQVRFIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIjJyL3MiLCAiaGVscCI6ICJSYXRlIHRvIGFwcGx5IHRvIHRoZSBVUkwgKHMgZm9yIHNlY29uZCwgbSBmb3IgbWludXRlLCBoIGZvciBob3VyIGFuZCBkIGZvciBkYXkpLiIsICJpZCI6ICJsaW1pdC1yZXEtcmF0ZSIsICJsYWJlbCI6ICJMaW1pdCByZXF1ZXN0IFJhdGUiLCAicmVnZXgiOiAiXlxcZCtyL1tzbWhkXSQiLCAidHlwZSI6ICJ0ZXh0IiwgIm11bHRpcGxlIjogImxpbWl0LXJlcSIsICJwYXR0ZXJuIjogIl5cXGQrci9bc21oZF0kIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIyci9zIiwgIm5hbWUiOiAiTGltaXQgcmVxdWVzdCBSYXRlIiwgInByZXZfdmFsdWUiOiAiMnIvcyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiUmF0ZSB0byBhcHBseSB0byB0aGUgVVJMIChzIGZvciBzZWNvbmQsIG0gZm9yIG1pbnV0ZSwgaCBmb3IgaG91ciBhbmQgZCBmb3IgZGF5KS4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTUifX19LCAibXVsdGlwbGVzIjogeyJsaW1pdC1yZXEiOiB7IjAiOiB7IkxJTUlUX1JFUV9VUkwiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiLyIsICJoZWxwIjogIlVSTCAoUENSRSByZWdleCkgd2hlcmUgdGhlIGxpbWl0IHJlcXVlc3Qgd2lsbCBiZSBhcHBsaWVkIG9yIHNwZWNpYWwgdmFsdWUgLyBmb3IgYWxsIHJlcXVlc3RzLiIsICJpZCI6ICJsaW1pdC1yZXEtdXJsIiwgImxhYmVsIjogIkxpbWl0IHJlcXVlc3QgVVJMIiwgInJlZ2V4IjogIl4uKyQiLCAidHlwZSI6ICJ0ZXh0IiwgIm11bHRpcGxlIjogImxpbWl0LXJlcSIsICJwYXR0ZXJuIjogIl4uKyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIi8iLCAibmFtZSI6ICJMaW1pdCByZXF1ZXN0IFVSTCIsICJwcmV2X3ZhbHVlIjogIi8iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlVSTCAoUENSRSByZWdleCkgd2hlcmUgdGhlIGxpbWl0IHJlcXVlc3Qgd2lsbCBiZSBhcHBsaWVkIG9yIHNwZWNpYWwgdmFsdWUgLyBmb3IgYWxsIHJlcXVlc3RzLiJ9XSwgImNvbnRhaW5lckNsYXNzIjogInotNiIsICJtZXRob2QiOiAiZGVmYXVsdCJ9LCAiTElNSVRfUkVRX1JBVEUiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiMnIvcyIsICJoZWxwIjogIlJhdGUgdG8gYXBwbHkgdG8gdGhlIFVSTCAocyBmb3Igc2Vjb25kLCBtIGZvciBtaW51dGUsIGggZm9yIGhvdXIgYW5kIGQgZm9yIGRheSkuIiwgImlkIjogImxpbWl0LXJlcS1yYXRlIiwgImxhYmVsIjogIkxpbWl0IHJlcXVlc3QgUmF0ZSIsICJyZWdleCI6ICJeXFxkK3IvW3NtaGRdJCIsICJ0eXBlIjogInRleHQiLCAibXVsdGlwbGUiOiAibGltaXQtcmVxIiwgInBhdHRlcm4iOiAiXlxcZCtyL1tzbWhkXSQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjJyL3MiLCAibmFtZSI6ICJMaW1pdCByZXF1ZXN0IFJhdGUiLCAicHJldl92YWx1ZSI6ICIyci9zIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJSYXRlIHRvIGFwcGx5IHRvIHRoZSBVUkwgKHMgZm9yIHNlY29uZCwgbSBmb3IgbWludXRlLCBoIGZvciBob3VyIGFuZCBkIGZvciBkYXkpLiJ9XSwgImNvbnRhaW5lckNsYXNzIjogInotNSIsICJtZXRob2QiOiAiZGVmYXVsdCJ9fX19fV19LCB7InRpdGxlIjogIlNlY3VyaXR5IC0gQW50aWJvdCIsICJzdWJ0aXRsZSI6ICJDb25maWd1cmUgdGhlIHNldHRpbmdzIGFib3V0IGJvdCBkZXRlY3Rpb24iLCAicGx1Z2lucyI6IFt7ImlkIjogImFudGlib3QiLCAic3RyZWFtIjogIm5vIiwgIm5hbWUiOiAiQW50aWJvdCIsICJkZXNjcmlwdGlvbiI6ICJCb3QgZGV0ZWN0aW9uIGJ5IHVzaW5nIGEgY2hhbGxlbmdlLiIsICJ2ZXJzaW9uIjogIjEuMCIsICJ0eXBlIjogImNvcmUiLCAibWV0aG9kIjogIm1hbnVhbCIsICJwYWdlIjogdHJ1ZSwgInNldHRpbmdzIjogeyJVU0VfQU5USUJPVCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJubyIsICJoZWxwIjogIkFjdGl2YXRlIGFudGlib3QgZmVhdHVyZS4iLCAiaWQiOiAidXNlLWFudGlib3QiLCAibGFiZWwiOiAiQW50aWJvdCBjaGFsbGVuZ2UiLCAicmVnZXgiOiAiXihub3xjb29raWV8amF2YXNjcmlwdHxjYXB0Y2hhfHJlY2FwdGNoYXxoY2FwdGNoYXx0dXJuc3RpbGUpJCIsICJ0eXBlIjogInNlbGVjdCIsICJwYXR0ZXJuIjogIl4obm98Y29va2llfGphdmFzY3JpcHR8Y2FwdGNoYXxyZWNhcHRjaGF8aGNhcHRjaGF8dHVybnN0aWxlKSQiLCAiaW5wVHlwZSI6ICJzZWxlY3QiLCAidmFsdWVzIjogWyJjYXB0Y2hhIiwgImNvb2tpZSIsICJoY2FwdGNoYSIsICJqYXZhc2NyaXB0IiwgIm5vIiwgInJlY2FwdGNoYSIsICJ0dXJuc3RpbGUiXSwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAibm8iLCAibmFtZSI6ICJBbnRpYm90IGNoYWxsZW5nZSIsICJwcmV2X3ZhbHVlIjogIm5vIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJBY3RpdmF0ZSBhbnRpYm90IGZlYXR1cmUuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xMCJ9LCAiQU5USUJPVF9VUkkiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiL2NoYWxsZW5nZSIsICJoZWxwIjogIlVudXNlZCBVUkkgdGhhdCBjbGllbnRzIHdpbGwgYmUgcmVkaXJlY3RlZCB0byB0byBzb2x2ZSB0aGUgY2hhbGxlbmdlLiIsICJpZCI6ICJhbnRpYm90LXVyaSIsICJsYWJlbCI6ICJBbnRpYm90IFVSTCIsICJyZWdleCI6ICJeXFwvW1xcd1xcXS5+OlxcLz8jXFxbQCEkXFwmJ1xcKFxcKSorLDs9XFwtXSokIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl5cXC9bXFx3XFxdLn46XFwvPyNcXFtAISRcXCYnXFwoXFwpKissOz1cXC1dKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIi9jaGFsbGVuZ2UiLCAibmFtZSI6ICJBbnRpYm90IFVSTCIsICJwcmV2X3ZhbHVlIjogIi9jaGFsbGVuZ2UiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlVudXNlZCBVUkkgdGhhdCBjbGllbnRzIHdpbGwgYmUgcmVkaXJlY3RlZCB0byB0byBzb2x2ZSB0aGUgY2hhbGxlbmdlLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotOSJ9LCAiQU5USUJPVF9SRUNBUFRDSEFfU0NPUkUiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiMC43IiwgImhlbHAiOiAiTWluaW11bSBzY29yZSByZXF1aXJlZCBmb3IgcmVDQVBUQ0hBIGNoYWxsZW5nZS4iLCAiaWQiOiAiYW50aWJvdC1yZWNhcHRjaGEtc2NvcmUiLCAibGFiZWwiOiAicmVDQVBUQ0hBIHNjb3JlIiwgInJlZ2V4IjogIl4oMFxcLlsxLTldfDFcXC4wKSQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXigwXFwuWzEtOV18MVxcLjApJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiMC43IiwgIm5hbWUiOiAicmVDQVBUQ0hBIHNjb3JlIiwgInByZXZfdmFsdWUiOiAiMC43IiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJNaW5pbXVtIHNjb3JlIHJlcXVpcmVkIGZvciByZUNBUFRDSEEgY2hhbGxlbmdlLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotNiJ9LCAiQU5USUJPVF9SRUNBUFRDSEFfU0lURUtFWSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJTaXRla2V5IGZvciByZUNBUFRDSEEgY2hhbGxlbmdlLiIsICJpZCI6ICJhbnRpYm90LXJlY2FwdGNoYS1zaXRla2V5IiwgImxhYmVsIjogInJlQ0FQVENIQSBzaXRla2V5IiwgInJlZ2V4IjogIl5bXFx3XFwtXSokIiwgInR5cGUiOiAidGV4dCIsICJwYXR0ZXJuIjogIl5bXFx3XFwtXSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibmFtZSI6ICJyZUNBUFRDSEEgc2l0ZWtleSIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiU2l0ZWtleSBmb3IgcmVDQVBUQ0hBIGNoYWxsZW5nZS4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTUifSwgIkFOVElCT1RfUkVDQVBUQ0hBX1NFQ1JFVCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJTZWNyZXQgZm9yIHJlQ0FQVENIQSBjaGFsbGVuZ2UuIiwgImlkIjogImFudGlib3QtcmVjYXB0Y2hhLXNlY3JldCIsICJsYWJlbCI6ICJyZUNBUFRDSEEgc2VjcmV0IiwgInJlZ2V4IjogIl5bXFx3XFwtXSokIiwgInR5cGUiOiAicGFzc3dvcmQiLCAicGF0dGVybiI6ICJeW1xcd1xcLV0qJCIsICJpbnBUeXBlIjogImlucHV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm5hbWUiOiAicmVDQVBUQ0hBIHNlY3JldCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiU2VjcmV0IGZvciByZUNBUFRDSEEgY2hhbGxlbmdlLiJ9XSwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgImNvbnRhaW5lckNsYXNzIjogInotNCJ9LCAiQU5USUJPVF9IQ0FQVENIQV9TSVRFS0VZIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIlNpdGVrZXkgZm9yIGhDYXB0Y2hhIGNoYWxsZW5nZS4iLCAiaWQiOiAiYW50aWJvdC1oY2FwdGNoYS1zaXRla2V5IiwgImxhYmVsIjogImhDYXB0Y2hhIHNpdGVrZXkiLCAicmVnZXgiOiAiXlthLXpBLVowLTlcXC1dKiQiLCAidHlwZSI6ICJ0ZXh0IiwgInBhdHRlcm4iOiAiXlthLXpBLVowLTlcXC1dKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJuYW1lIjogImhDYXB0Y2hhIHNpdGVrZXkiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlNpdGVrZXkgZm9yIGhDYXB0Y2hhIGNoYWxsZW5nZS4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTMifSwgIkFOVElCT1RfSENBUFRDSEFfU0VDUkVUIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIlNlY3JldCBmb3IgaENhcHRjaGEgY2hhbGxlbmdlLiIsICJpZCI6ICJhbnRpYm90LWhjYXB0Y2hhLXNlY3JldCIsICJsYWJlbCI6ICJoQ2FwdGNoYSBzZWNyZXQiLCAicmVnZXgiOiAiXlxcdyokIiwgInR5cGUiOiAicGFzc3dvcmQiLCAicGF0dGVybiI6ICJeXFx3KiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJuYW1lIjogImhDYXB0Y2hhIHNlY3JldCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiU2VjcmV0IGZvciBoQ2FwdGNoYSBjaGFsbGVuZ2UuIn1dLCAibWV0aG9kIjogImRlZmF1bHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yIn0sICJBTlRJQk9UX1RVUk5TVElMRV9TSVRFS0VZIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIlNpdGVrZXkgZm9yIFR1cm5zdGlsZSBjaGFsbGVuZ2UuIiwgImlkIjogImFudGlib3QtdHVybnN0aWxlLXNpdGVrZXkiLCAibGFiZWwiOiAiVHVybnN0aWxlIHNpdGVrZXkiLCAicmVnZXgiOiAiXigweFtcXHdcXC1dKyk/JCIsICJ0eXBlIjogInRleHQiLCAicGF0dGVybiI6ICJeKDB4W1xcd1xcLV0rKT8kIiwgImlucFR5cGUiOiAiaW5wdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibmFtZSI6ICJUdXJuc3RpbGUgc2l0ZWtleSIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiU2l0ZWtleSBmb3IgVHVybnN0aWxlIGNoYWxsZW5nZS4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTEifSwgIkFOVElCT1RfVFVSTlNUSUxFX1NFQ1JFVCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJTZWNyZXQgZm9yIFR1cm5zdGlsZSBjaGFsbGVuZ2UuIiwgImlkIjogImFudGlib3QtdHVybnN0aWxlLXNlY3JldCIsICJsYWJlbCI6ICJUdXJuc3RpbGUgc2VjcmV0IiwgInJlZ2V4IjogIl4oMHhbXFx3XFwtXSspPyQiLCAidHlwZSI6ICJwYXNzd29yZCIsICJwYXR0ZXJuIjogIl4oMHhbXFx3XFwtXSspPyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJuYW1lIjogIlR1cm5zdGlsZSBzZWNyZXQiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlNlY3JldCBmb3IgVHVybnN0aWxlIGNoYWxsZW5nZS4ifV0sICJtZXRob2QiOiAiZGVmYXVsdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTAifX0sICJjaGVja3N1bSI6IG51bGx9XX1dfX0sICJvcGVyYXRpb24iOiAiZWRpdCIsICJvbGRTZXJ2ZXJOYW1lIjogImFwcDEuZXhhbXBsZS5jb20ifX1dfV0= \ No newline at end of file diff --git a/src/ui/client/tests/globalconfig.json b/src/ui/client/tests/globalconfig.json deleted file mode 100644 index a08ac423c..000000000 --- a/src/ui/client/tests/globalconfig.json +++ /dev/null @@ -1,9988 +0,0 @@ -[ - { - "type": "card", - "containerColumns": { - "pc": 12, - "tablet": 12, - "mobile": 12 - }, - "widgets": [ - { - "type": "Title", - "data": { - "title": "global_config_title", - "type": "container" - } - }, - { - "type": "Subtitle", - "data": { - "subtitle": "global_config_subtitle", - "type": "container" - } - }, - { - "type": "Templates", - "data": { - "templates": { - "advanced": { - "default": [ - { - "id": "general", - "stream": "partial", - "name": "General", - "description": "The general settings for the server", - "version": "0.1", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "IS_LOADING": { - "context": "global", - "default": "no", - "help": "Internal use : set to yes when BW is loading.", - "id": "internal-use-loading", - "label": "internal use loading", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-33", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "internal use loading", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "method": "default", - "prev_value": "no", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Internal use : set to yes when BW is loading." - } - ] - }, - "NGINX_PREFIX": { - "context": "global", - "default": "/etc/nginx/", - "help": "Where nginx will search for configurations.", - "id": "nginx-prefix", - "label": "nginx prefix", - "regex": "^(\\/[\\-\\w.\\s]+)*\\/$", - "type": "text", - "containerClass": "z-32", - "pattern": "^(\\/[\\-\\w.\\s]+)*\\/$", - "inpType": "input", - "name": "nginx prefix", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "/etc/nginx/", - "method": "default", - "prev_value": "/etc/nginx/", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Where nginx will search for configurations." - } - ] - }, - "HTTP_PORT": { - "context": "global", - "default": "8080", - "help": "HTTP port number which bunkerweb binds to.", - "id": "http-port", - "label": "HTTP port", - "regex": "^\\d+$", - "type": "text", - "containerClass": "z-31", - "pattern": "^\\d+$", - "inpType": "input", - "name": "HTTP port", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "8080", - "method": "default", - "prev_value": "8080", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "HTTP port number which bunkerweb binds to." - } - ] - }, - "HTTPS_PORT": { - "context": "global", - "default": "8443", - "help": "HTTPS port number which bunkerweb binds to.", - "id": "https-port", - "label": "HTTPS port", - "regex": "^\\d+$", - "type": "text", - "containerClass": "z-30", - "pattern": "^\\d+$", - "inpType": "input", - "name": "HTTPS port", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "8443", - "method": "default", - "prev_value": "8443", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "HTTPS port number which bunkerweb binds to." - } - ] - }, - "MULTISITE": { - "context": "global", - "default": "no", - "help": "Multi site activation.", - "id": "multisite", - "label": "Multisite", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-29", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Multisite", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": true, - "value": "yes", - "method": "scheduler", - "prev_value": "yes", - "popovers": [ - { - "iconName": "trespass", - "text": "inp_popover_method_disabled" - }, - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Multi site activation." - } - ] - }, - "SERVER_NAME": { - "context": "multisite", - "default": "www.example.com", - "help": "List of the virtual hosts served by bunkerweb.", - "id": "server-name", - "label": "Server name", - "regex": "^((\\S{1,255})(?!.*\\s\\2(\\s|$)))?(\\s(\\S{1,255})(?!.*\\s\\5(\\s|$)))*$", - "type": "text", - "containerClass": "z-28", - "pattern": "^((\\S{1,255})(?!.*\\s\\2(\\s|$)))?(\\s(\\S{1,255})(?!.*\\s\\5(\\s|$)))*$", - "inpType": "input", - "name": "Server name", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "app1.example.com www.example.com", - "method": "default", - "prev_value": "app1.example.com www.example.com", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of the virtual hosts served by bunkerweb." - } - ] - }, - "WORKER_PROCESSES": { - "context": "global", - "default": "auto", - "help": "Number of worker processes.", - "id": "worker-processes", - "label": "Worker processes", - "regex": "^(auto|\\d+)$", - "type": "text", - "containerClass": "z-27", - "pattern": "^(auto|\\d+)$", - "inpType": "input", - "name": "Worker processes", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "auto", - "method": "default", - "prev_value": "auto", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Number of worker processes." - } - ] - }, - "WORKER_RLIMIT_NOFILE": { - "context": "global", - "default": "2048", - "help": "Maximum number of open files for worker processes.", - "id": "worker-rlimit-nofile", - "label": "Open files per worker", - "regex": "^\\d+$", - "type": "text", - "containerClass": "z-26", - "pattern": "^\\d+$", - "inpType": "input", - "name": "Open files per worker", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "2048", - "method": "default", - "prev_value": "2048", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Maximum number of open files for worker processes." - } - ] - }, - "WORKER_CONNECTIONS": { - "context": "global", - "default": "1024", - "help": "Maximum number of connections per worker.", - "id": "worker-connections", - "label": "Connections per worker", - "regex": "^\\d+$", - "type": "text", - "containerClass": "z-25", - "pattern": "^\\d+$", - "inpType": "input", - "name": "Connections per worker", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "1024", - "method": "default", - "prev_value": "1024", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Maximum number of connections per worker." - } - ] - }, - "LOG_FORMAT": { - "context": "global", - "default": "$host $remote_addr - $remote_user [$time_local] \"$request\" $status $body_bytes_sent \"$http_referer\" \"$http_user_agent\"", - "help": "The format to use for access logs.", - "id": "log-format", - "label": "Log format", - "regex": "^.*$", - "type": "text", - "containerClass": "z-24", - "pattern": "^.*$", - "inpType": "input", - "name": "Log format", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "$host $remote_addr - $remote_user [$time_local] \"$request\" $status $body_bytes_sent \"$http_referer\" \"$http_user_agent\"", - "method": "default", - "prev_value": "$host $remote_addr - $remote_user [$time_local] \"$request\" $status $body_bytes_sent \"$http_referer\" \"$http_user_agent\"", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "The format to use for access logs." - } - ] - }, - "LOG_LEVEL": { - "context": "global", - "default": "notice", - "help": "The level to use for error logs.", - "id": "log-level", - "label": "Log level", - "regex": "^(debug|info|notice|warn|error|crit|alert|emerg)$", - "type": "select", - "containerClass": "z-23", - "pattern": "^(debug|info|notice|warn|error|crit|alert|emerg)$", - "inpType": "select", - "name": "Log level", - "values": [ - "alert", - "crit", - "debug", - "emerg", - "error", - "info", - "notice", - "warn" - ], - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": true, - "value": "info", - "method": "scheduler", - "prev_value": "info", - "popovers": [ - { - "iconName": "trespass", - "text": "inp_popover_method_disabled" - }, - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "The level to use for error logs." - } - ] - }, - "DNS_RESOLVERS": { - "context": "global", - "default": "127.0.0.11", - "help": "DNS addresses of resolvers to use.", - "id": "dns-resolvers", - "label": "DNS resolvers", - "regex": "^(?! )(( *[^ ]+)(?!.*\\2))*$", - "type": "text", - "containerClass": "z-22", - "pattern": "^(?! )(( *[^ ]+)(?!.*\\2))*$", - "inpType": "input", - "name": "DNS resolvers", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "127.0.0.11", - "method": "default", - "prev_value": "127.0.0.11", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "DNS addresses of resolvers to use." - } - ] - }, - "DATASTORE_MEMORY_SIZE": { - "context": "global", - "default": "64m", - "help": "Size of the internal datastore.", - "id": "datastore-memory-size", - "label": "Datastore memory size", - "regex": "^\\d+[kKmMgG]?$", - "type": "text", - "containerClass": "z-21", - "pattern": "^\\d+[kKmMgG]?$", - "inpType": "input", - "name": "Datastore memory size", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "64m", - "method": "default", - "prev_value": "64m", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Size of the internal datastore." - } - ] - }, - "CACHESTORE_MEMORY_SIZE": { - "context": "global", - "default": "64m", - "help": "Size of the internal cachestore.", - "id": "cachestore-memory-size", - "label": "Cachestore memory size", - "regex": "^\\d+[kKmMgG]?$", - "type": "text", - "containerClass": "z-20", - "pattern": "^\\d+[kKmMgG]?$", - "inpType": "input", - "name": "Cachestore memory size", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "64m", - "method": "default", - "prev_value": "64m", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Size of the internal cachestore." - } - ] - }, - "CACHESTORE_IPC_MEMORY_SIZE": { - "context": "global", - "default": "16m", - "help": "Size of the internal cachestore (ipc).", - "id": "cachestore-ipc-memory-size", - "label": "Cachestore ipc memory size", - "regex": "^\\d+[kKmMgG]?$", - "type": "text", - "containerClass": "z-19", - "pattern": "^\\d+[kKmMgG]?$", - "inpType": "input", - "name": "Cachestore ipc memory size", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "16m", - "method": "default", - "prev_value": "16m", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Size of the internal cachestore (ipc)." - } - ] - }, - "CACHESTORE_MISS_MEMORY_SIZE": { - "context": "global", - "default": "16m", - "help": "Size of the internal cachestore (miss).", - "id": "cachestore-miss-memory-size", - "label": "Cachestore miss memory size", - "regex": "^\\d+[kKmMgG]?$", - "type": "text", - "containerClass": "z-18", - "pattern": "^\\d+[kKmMgG]?$", - "inpType": "input", - "name": "Cachestore miss memory size", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "16m", - "method": "default", - "prev_value": "16m", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Size of the internal cachestore (miss)." - } - ] - }, - "CACHESTORE_LOCKS_MEMORY_SIZE": { - "context": "global", - "default": "16m", - "help": "Size of the internal cachestore (locks).", - "id": "cachestore-locks-memory-size", - "label": "Cachestore locks memory size", - "regex": "^\\d+[kKmMgG]?$", - "type": "text", - "containerClass": "z-17", - "pattern": "^\\d+[kKmMgG]?$", - "inpType": "input", - "name": "Cachestore locks memory size", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "16m", - "method": "default", - "prev_value": "16m", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Size of the internal cachestore (locks)." - } - ] - }, - "USE_API": { - "context": "global", - "default": "yes", - "help": "Activate the API to control BunkerWeb.", - "id": "use-api", - "label": "Activate API", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-16", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Activate API", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "method": "default", - "prev_value": "yes", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Activate the API to control BunkerWeb." - } - ] - }, - "API_HTTP_PORT": { - "context": "global", - "default": "5000", - "help": "Listen port number for the API.", - "id": "api-http-listen", - "label": "API port number", - "regex": "^\\d+$", - "type": "text", - "containerClass": "z-15", - "pattern": "^\\d+$", - "inpType": "input", - "name": "API port number", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "5000", - "method": "default", - "prev_value": "5000", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Listen port number for the API." - } - ] - }, - "API_LISTEN_IP": { - "context": "global", - "default": "0.0.0.0", - "help": "Listen IP address for the API.", - "id": "api-ip-listen", - "label": "API listen IP", - "regex": "^.*$", - "type": "text", - "containerClass": "z-14", - "pattern": "^.*$", - "inpType": "input", - "name": "API listen IP", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "0.0.0.0", - "method": "default", - "prev_value": "0.0.0.0", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Listen IP address for the API." - } - ] - }, - "API_SERVER_NAME": { - "context": "global", - "default": "bwapi", - "help": "Server name (virtual host) for the API.", - "id": "api-server-name", - "label": "API server name", - "regex": "^[^ ]{1,255}$", - "type": "text", - "containerClass": "z-13", - "pattern": "^[^ ]{1,255}$", - "inpType": "input", - "name": "API server name", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "bwapi", - "method": "default", - "prev_value": "bwapi", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Server name (virtual host) for the API." - } - ] - }, - "API_WHITELIST_IP": { - "context": "global", - "default": "127.0.0.0/8", - "help": "List of IP/network allowed to contact the API.", - "id": "api-whitelist-ip", - "label": "API whitelist IP", - "regex": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "type": "text", - "containerClass": "z-12", - "pattern": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "inpType": "input", - "name": "API whitelist IP", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": true, - "value": "127.0.0.0/24 10.20.30.0/24", - "method": "scheduler", - "prev_value": "127.0.0.0/24 10.20.30.0/24", - "popovers": [ - { - "iconName": "trespass", - "text": "inp_popover_method_disabled" - }, - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "List of IP/network allowed to contact the API." - } - ] - }, - "AUTOCONF_MODE": { - "context": "global", - "default": "no", - "help": "Enable Autoconf Docker integration.", - "id": "autoconf-mode", - "label": "Autoconf mode", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-11", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Autoconf mode", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "method": "default", - "prev_value": "no", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Enable Autoconf Docker integration." - } - ] - }, - "SWARM_MODE": { - "context": "global", - "default": "no", - "help": "Enable Docker Swarm integration.", - "id": "swarm-mode", - "label": "Swarm mode", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-10", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Swarm mode", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "method": "default", - "prev_value": "no", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Enable Docker Swarm integration." - } - ] - }, - "KUBERNETES_MODE": { - "context": "global", - "default": "no", - "help": "Enable Kubernetes integration.", - "id": "kubernetes-mode", - "label": "Kubernetes mode", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-9", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Kubernetes mode", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "method": "default", - "prev_value": "no", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Enable Kubernetes integration." - } - ] - }, - "SERVER_TYPE": { - "context": "multisite", - "default": "http", - "help": "Server type : http or stream.", - "id": "server-type", - "label": "Server type", - "regex": "^(http|stream)$", - "type": "select", - "containerClass": "z-8", - "pattern": "^(http|stream)$", - "inpType": "select", - "name": "Server type", - "values": ["http", "stream"], - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "http", - "method": "default", - "prev_value": "http", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Server type : http or stream." - } - ] - }, - "LISTEN_STREAM": { - "context": "multisite", - "default": "yes", - "help": "Enable listening for non-ssl (passthrough).", - "id": "listen-stream", - "label": "Listen stream", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-7", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Listen stream", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "method": "default", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable listening for non-ssl (passthrough)." - } - ] - }, - "LISTEN_STREAM_PORT": { - "context": "multisite", - "default": "1337", - "help": "Listening port for non-ssl (passthrough).", - "id": "listen-stream-port", - "label": "Listen stream port", - "regex": "^[0-9]+$", - "type": "text", - "containerClass": "z-6", - "pattern": "^[0-9]+$", - "inpType": "input", - "name": "Listen stream port", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "1337", - "method": "default", - "prev_value": "1337", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Listening port for non-ssl (passthrough)." - } - ] - }, - "LISTEN_STREAM_PORT_SSL": { - "context": "multisite", - "default": "4242", - "help": "Listening port for ssl (passthrough).", - "id": "listen-stream-port-ssl", - "label": "Listen stream port ssl", - "regex": "^[0-9]+$", - "type": "text", - "containerClass": "z-5", - "pattern": "^[0-9]+$", - "inpType": "input", - "name": "Listen stream port ssl", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "4242", - "method": "default", - "prev_value": "4242", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Listening port for ssl (passthrough)." - } - ] - }, - "USE_UDP": { - "context": "multisite", - "default": "no", - "help": "UDP listen instead of TCP (stream).", - "id": "use-udp", - "label": "Listen UDP", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-4", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Listen UDP", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "method": "default", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "UDP listen instead of TCP (stream)." - } - ] - }, - "USE_IPV6": { - "context": "global", - "default": "no", - "help": "Enable IPv6 connectivity.", - "id": "use-ipv6", - "label": "Use IPv6", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-3", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Use IPv6", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "method": "default", - "prev_value": "no", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Enable IPv6 connectivity." - } - ] - }, - "IS_DRAFT": { - "context": "multisite", - "default": "no", - "help": "Internal use : set to yes when the service is in draft mode.", - "id": "internal-use-draft", - "label": "internal use draft", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-2", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "internal use draft", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "method": "default", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Internal use : set to yes when the service is in draft mode." - } - ] - }, - "TIMERS_LOG_LEVEL": { - "context": "global", - "default": "debug", - "help": "Log level for timers.", - "id": "timers-log-level", - "label": "Timers log level", - "regex": "^(debug|info|notice|warn|err|crit|alert|emerg)$", - "type": "select", - "containerClass": "z-1", - "pattern": "^(debug|info|notice|warn|err|crit|alert|emerg)$", - "inpType": "select", - "name": "Timers log level", - "values": [ - "alert", - "crit", - "debug", - "emerg", - "err", - "info", - "notice", - "warn" - ], - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "debug", - "method": "default", - "prev_value": "debug", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Log level for timers." - } - ] - }, - "BUNKERWEB_INSTANCES": { - "context": "global", - "default": "127.0.0.1", - "help": "List of BunkerWeb instances separated with spaces (format : fqdn-or-ip:5000 http://fqdn-or-ip:5000)", - "id": "bunkerweb-instances", - "label": "BunkerWeb instances", - "regex": "^.*$", - "type": "text", - "containerClass": "z-0", - "pattern": "^.*$", - "inpType": "input", - "name": "BunkerWeb instances", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": true, - "value": "bunkerweb", - "method": "scheduler", - "prev_value": "bunkerweb", - "popovers": [ - { - "iconName": "trespass", - "text": "inp_popover_method_disabled" - }, - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "List of BunkerWeb instances separated with spaces (format : fqdn-or-ip:5000 http://fqdn-or-ip:5000)" - } - ] - } - }, - "checksum": null - }, - { - "id": "antibot", - "stream": "no", - "name": "Antibot", - "description": "Bot detection by using a challenge.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": true, - "settings": { - "USE_ANTIBOT": { - "context": "multisite", - "default": "no", - "help": "Activate antibot feature.", - "id": "use-antibot", - "label": "Antibot challenge", - "regex": "^(no|cookie|javascript|captcha|recaptcha|hcaptcha|turnstile)$", - "type": "select", - "containerClass": "z-10", - "pattern": "^(no|cookie|javascript|captcha|recaptcha|hcaptcha|turnstile)$", - "inpType": "select", - "name": "Antibot challenge", - "values": [ - "captcha", - "cookie", - "hcaptcha", - "javascript", - "no", - "recaptcha", - "turnstile" - ], - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "method": "default", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Activate antibot feature." - } - ] - }, - "ANTIBOT_URI": { - "context": "multisite", - "default": "/challenge", - "help": "Unused URI that clients will be redirected to to solve the challenge.", - "id": "antibot-uri", - "label": "Antibot URL", - "regex": "^\\/[\\w\\].~:\\/?#\\[@!$\\&'\\(\\)*+,;=\\-]*$", - "type": "text", - "containerClass": "z-9", - "pattern": "^\\/[\\w\\].~:\\/?#\\[@!$\\&'\\(\\)*+,;=\\-]*$", - "inpType": "input", - "name": "Antibot URL", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "/challenge", - "method": "default", - "prev_value": "/challenge", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Unused URI that clients will be redirected to to solve the challenge." - } - ] - }, - "ANTIBOT_TIME_RESOLVE": { - "context": "multisite", - "default": "60", - "help": "Maximum time (in seconds) clients have to resolve the challenge. Once this time has passed, a new challenge will be generated.", - "id": "antibot-time-resolve", - "label": "Time to resolve", - "regex": "^[0-9]+$", - "type": "text", - "containerClass": "z-8", - "pattern": "^[0-9]+$", - "inpType": "input", - "name": "Time to resolve", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "60", - "method": "default", - "prev_value": "60", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Maximum time (in seconds) clients have to resolve the challenge. Once this time has passed, a new challenge will be generated." - } - ] - }, - "ANTIBOT_TIME_VALID": { - "context": "multisite", - "default": "86400", - "help": "Maximum validity time of solved challenges. Once this time has passed, clients will need to resolve a new one.", - "id": "antibot-time-valid", - "label": "Time valid", - "regex": "^[0-9]+$", - "type": "text", - "containerClass": "z-7", - "pattern": "^[0-9]+$", - "inpType": "input", - "name": "Time valid", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "86400", - "method": "default", - "prev_value": "86400", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Maximum validity time of solved challenges. Once this time has passed, clients will need to resolve a new one." - } - ] - }, - "ANTIBOT_RECAPTCHA_SCORE": { - "context": "multisite", - "default": "0.7", - "help": "Minimum score required for reCAPTCHA challenge.", - "id": "antibot-recaptcha-score", - "label": "reCAPTCHA score", - "regex": "^(0\\.[1-9]|1\\.0)$", - "type": "text", - "containerClass": "z-6", - "pattern": "^(0\\.[1-9]|1\\.0)$", - "inpType": "input", - "name": "reCAPTCHA score", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "0.7", - "method": "default", - "prev_value": "0.7", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Minimum score required for reCAPTCHA challenge." - } - ] - }, - "ANTIBOT_RECAPTCHA_SITEKEY": { - "context": "multisite", - "default": "", - "help": "Sitekey for reCAPTCHA challenge.", - "id": "antibot-recaptcha-sitekey", - "label": "reCAPTCHA sitekey", - "regex": "^[\\w\\-]*$", - "type": "text", - "containerClass": "z-5", - "pattern": "^[\\w\\-]*$", - "inpType": "input", - "name": "reCAPTCHA sitekey", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Sitekey for reCAPTCHA challenge." - } - ] - }, - "ANTIBOT_RECAPTCHA_SECRET": { - "context": "multisite", - "default": "", - "help": "Secret for reCAPTCHA challenge.", - "id": "antibot-recaptcha-secret", - "label": "reCAPTCHA secret", - "regex": "^[\\w\\-]*$", - "type": "password", - "containerClass": "z-4", - "pattern": "^[\\w\\-]*$", - "inpType": "input", - "name": "reCAPTCHA secret", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Secret for reCAPTCHA challenge." - } - ] - }, - "ANTIBOT_HCAPTCHA_SITEKEY": { - "context": "multisite", - "default": "", - "help": "Sitekey for hCaptcha challenge.", - "id": "antibot-hcaptcha-sitekey", - "label": "hCaptcha sitekey", - "regex": "^[a-zA-Z0-9\\-]*$", - "type": "text", - "containerClass": "z-3", - "pattern": "^[a-zA-Z0-9\\-]*$", - "inpType": "input", - "name": "hCaptcha sitekey", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Sitekey for hCaptcha challenge." - } - ] - }, - "ANTIBOT_HCAPTCHA_SECRET": { - "context": "multisite", - "default": "", - "help": "Secret for hCaptcha challenge.", - "id": "antibot-hcaptcha-secret", - "label": "hCaptcha secret", - "regex": "^\\w*$", - "type": "password", - "containerClass": "z-2", - "pattern": "^\\w*$", - "inpType": "input", - "name": "hCaptcha secret", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Secret for hCaptcha challenge." - } - ] - }, - "ANTIBOT_TURNSTILE_SITEKEY": { - "context": "multisite", - "default": "", - "help": "Sitekey for Turnstile challenge.", - "id": "antibot-turnstile-sitekey", - "label": "Turnstile sitekey", - "regex": "^(0x[\\w\\-]+)?$", - "type": "text", - "containerClass": "z-1", - "pattern": "^(0x[\\w\\-]+)?$", - "inpType": "input", - "name": "Turnstile sitekey", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Sitekey for Turnstile challenge." - } - ] - }, - "ANTIBOT_TURNSTILE_SECRET": { - "context": "multisite", - "default": "", - "help": "Secret for Turnstile challenge.", - "id": "antibot-turnstile-secret", - "label": "Turnstile secret", - "regex": "^(0x[\\w\\-]+)?$", - "type": "password", - "containerClass": "z-0", - "pattern": "^(0x[\\w\\-]+)?$", - "inpType": "input", - "name": "Turnstile secret", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Secret for Turnstile challenge." - } - ] - } - }, - "checksum": null - }, - { - "id": "authbasic", - "stream": "no", - "name": "Auth basic", - "description": "Enforce login before accessing a resource or the whole site using HTTP basic auth method.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "USE_AUTH_BASIC": { - "context": "multisite", - "default": "no", - "help": "Use HTTP basic auth", - "id": "use-auth-basic", - "label": "Use HTTP basic auth", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-4", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Use HTTP basic auth", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "method": "default", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Use HTTP basic auth" - } - ] - }, - "AUTH_BASIC_LOCATION": { - "context": "multisite", - "default": "sitewide", - "help": "URL of the protected resource or sitewide value.", - "id": "auth-basic-location", - "label": "Auth basic Location", - "regex": "^(sitewide|/[a-zA-Z0-9.\\/\\-]*)$", - "type": "text", - "containerClass": "z-3", - "pattern": "^(sitewide|/[a-zA-Z0-9.\\/\\-]*)$", - "inpType": "input", - "name": "Auth basic Location", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "sitewide", - "method": "default", - "prev_value": "sitewide", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "URL of the protected resource or sitewide value." - } - ] - }, - "AUTH_BASIC_USER": { - "context": "multisite", - "default": "changeme", - "help": "Username", - "id": "auth-basic-user", - "label": "Auth basic Username", - "regex": "^[\\w\\-]+", - "type": "text", - "containerClass": "z-2", - "pattern": "^[\\w\\-]+", - "inpType": "input", - "name": "Auth basic Username", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "changeme", - "method": "default", - "prev_value": "changeme", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Username" - } - ] - }, - "AUTH_BASIC_PASSWORD": { - "context": "multisite", - "default": "changeme", - "help": "Password", - "id": "auth-basic-password", - "label": "Password", - "regex": "^.+", - "type": "password", - "containerClass": "z-1", - "pattern": "^.+", - "inpType": "input", - "name": "Password", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "changeme", - "method": "default", - "prev_value": "changeme", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Password" - } - ] - }, - "AUTH_BASIC_TEXT": { - "context": "multisite", - "default": "Restricted area", - "help": "Text to display", - "id": "auth-basic-text", - "label": "Text", - "regex": "^.+", - "type": "text", - "containerClass": "z-0", - "pattern": "^.+", - "inpType": "input", - "name": "Text", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "Restricted area", - "method": "default", - "prev_value": "Restricted area", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Text to display" - } - ] - } - }, - "checksum": null - }, - { - "id": "backup", - "stream": "yes", - "name": "Backup", - "description": "Backup your data to a custom location. Ensure the safety and availability of your important files by creating regular backups.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": true, - "settings": { - "USE_BACKUP": { - "context": "global", - "default": "yes", - "help": "Enable or disable the backup feature", - "id": "use-backup", - "label": "Activate automatic backup", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-3", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Activate automatic backup", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "method": "default", - "prev_value": "yes", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Enable or disable the backup feature" - } - ] - }, - "BACKUP_SCHEDULE": { - "context": "global", - "default": "daily", - "help": "The frequency of the backup (daily, weekly or monthly)", - "id": "backup-schedule", - "label": "Backup schedule", - "regex": "^(daily|weekly|monthly)$", - "type": "select", - "containerClass": "z-2", - "pattern": "^(daily|weekly|monthly)$", - "inpType": "select", - "name": "Backup schedule", - "values": ["daily", "monthly", "weekly"], - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "daily", - "method": "default", - "prev_value": "daily", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "The frequency of the backup (daily, weekly or monthly)" - } - ] - }, - "BACKUP_ROTATION": { - "context": "global", - "default": "7", - "help": "The number of backups to keep", - "id": "backup-rotation", - "label": "Backup rotation", - "regex": "^[1-9][0-9]*$", - "type": "text", - "containerClass": "z-1", - "pattern": "^[1-9][0-9]*$", - "inpType": "input", - "name": "Backup rotation", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "7", - "method": "default", - "prev_value": "7", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "The number of backups to keep" - } - ] - }, - "BACKUP_DIRECTORY": { - "context": "global", - "default": "/var/lib/bunkerweb/backups", - "help": "The directory where the backup will be stored", - "id": "backup-directory", - "label": "Backup directory", - "regex": "^.*$", - "type": "text", - "containerClass": "z-0", - "pattern": "^.*$", - "inpType": "input", - "name": "Backup directory", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "/var/lib/bunkerweb/backups", - "method": "default", - "prev_value": "/var/lib/bunkerweb/backups", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "The directory where the backup will be stored" - } - ] - } - }, - "checksum": null, - "bwcli": { - "list": "list.py", - "restore": "restore.py", - "save": "save.py" - } - }, - { - "id": "badbehavior", - "stream": "yes", - "name": "Bad behavior", - "description": "Ban IP generating too much 'bad' HTTP status code in a period of time.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": true, - "settings": { - "USE_BAD_BEHAVIOR": { - "context": "multisite", - "default": "yes", - "help": "Activate Bad behavior feature.", - "id": "use-bad-behavior", - "label": "Activate bad behavior", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-4", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Activate bad behavior", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "method": "default", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Activate Bad behavior feature." - } - ] - }, - "BAD_BEHAVIOR_STATUS_CODES": { - "context": "multisite", - "default": "400 401 403 404 405 429 444", - "help": "List of HTTP status codes considered as 'bad'.", - "id": "bad-behavior-status-code", - "label": "Bad status codes", - "regex": "^( *([1-5]\\d{2})(?!.*\\2) *)+$", - "type": "text", - "containerClass": "z-3", - "pattern": "^( *([1-5]\\d{2})(?!.*\\2) *)+$", - "inpType": "input", - "name": "Bad status codes", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "400 401 403 404 405 429 444", - "method": "default", - "prev_value": "400 401 403 404 405 429 444", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of HTTP status codes considered as 'bad'." - } - ] - }, - "BAD_BEHAVIOR_THRESHOLD": { - "context": "multisite", - "default": "10", - "help": "Maximum number of 'bad' HTTP status codes within the period of time before IP is banned.", - "id": "bad-behavior-threshold", - "label": "Threshold", - "regex": "^[1-9][0-9]*", - "type": "text", - "containerClass": "z-2", - "pattern": "^[1-9][0-9]*", - "inpType": "input", - "name": "Threshold", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "10", - "method": "default", - "prev_value": "10", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Maximum number of 'bad' HTTP status codes within the period of time before IP is banned." - } - ] - }, - "BAD_BEHAVIOR_COUNT_TIME": { - "context": "multisite", - "default": "60", - "help": "Period of time (in seconds) during which we count 'bad' HTTP status codes.", - "id": "bad-behavior-period", - "label": "Period (in seconds)", - "regex": "^\\d+", - "type": "text", - "containerClass": "z-1", - "pattern": "^\\d+", - "inpType": "input", - "name": "Period (in seconds)", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "60", - "method": "default", - "prev_value": "60", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Period of time (in seconds) during which we count 'bad' HTTP status codes." - } - ] - }, - "BAD_BEHAVIOR_BAN_TIME": { - "context": "multisite", - "default": "86400", - "help": "The duration time (in seconds) of a ban when the corresponding IP has reached the threshold.", - "id": "bad-behavior-ban-time", - "label": "Ban duration (in seconds)", - "regex": "^\\d+", - "type": "text", - "containerClass": "z-0", - "pattern": "^\\d+", - "inpType": "input", - "name": "Ban duration (in seconds)", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "86400", - "method": "default", - "prev_value": "86400", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "The duration time (in seconds) of a ban when the corresponding IP has reached the threshold." - } - ] - } - }, - "checksum": null - }, - { - "id": "blacklist", - "stream": "partial", - "name": "Blacklist", - "description": "Deny access based on internal and external IP/network/rDNS/ASN blacklists.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": true, - "settings": { - "USE_BLACKLIST": { - "context": "multisite", - "default": "yes", - "help": "Activate blacklist feature.", - "id": "use-blacklist", - "label": "Activate blacklisting", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-21", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Activate blacklisting", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": true, - "value": "no", - "method": "scheduler", - "prev_value": "no", - "popovers": [ - { - "iconName": "trespass", - "text": "inp_popover_method_disabled" - }, - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Activate blacklist feature." - } - ] - }, - "BLACKLIST_IP": { - "context": "multisite", - "default": "", - "help": "List of IP/network, separated with spaces, to block.", - "id": "blacklist-ip", - "label": "Blacklist IP/network", - "regex": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "type": "text", - "containerClass": "z-20", - "pattern": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "inpType": "input", - "name": "Blacklist IP/network", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of IP/network, separated with spaces, to block." - } - ] - }, - "BLACKLIST_RDNS": { - "context": "multisite", - "default": ".shodan.io .censys.io", - "help": "List of reverse DNS suffixes, separated with spaces, to block.", - "id": "blacklist-rdns", - "label": "Blacklist reverse DNS", - "regex": "^( *(([^ ]+)(?!.*\\3( |$))) *)*$", - "type": "text", - "containerClass": "z-19", - "pattern": "^( *(([^ ]+)(?!.*\\3( |$))) *)*$", - "inpType": "input", - "name": "Blacklist reverse DNS", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": ".shodan.io .censys.io", - "method": "default", - "prev_value": ".shodan.io .censys.io", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of reverse DNS suffixes, separated with spaces, to block." - } - ] - }, - "BLACKLIST_RDNS_GLOBAL": { - "context": "multisite", - "default": "yes", - "help": "Only perform RDNS blacklist checks on global IP addresses.", - "id": "blacklist-rdns-global", - "label": "Blacklist reverse DNS global IPs", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-18", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Blacklist reverse DNS global IPs", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "method": "default", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Only perform RDNS blacklist checks on global IP addresses." - } - ] - }, - "BLACKLIST_ASN": { - "context": "multisite", - "default": "", - "help": "List of ASN numbers, separated with spaces, to block.", - "id": "blacklist-asn", - "label": "Blacklist ASN", - "regex": "^^( *((ASN?)?(\\d+)\\b(?!.*[SN ]\\4\\b)) *)*$", - "type": "text", - "containerClass": "z-17", - "pattern": "^^( *((ASN?)?(\\d+)\\b(?!.*[SN ]\\4\\b)) *)*$", - "inpType": "input", - "name": "Blacklist ASN", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of ASN numbers, separated with spaces, to block." - } - ] - }, - "BLACKLIST_USER_AGENT": { - "context": "multisite", - "default": "", - "help": "List of User-Agent (PCRE regex), separated with spaces, to block.", - "id": "blacklist-user-agent", - "label": "Blacklist User-Agent", - "regex": "^.*$", - "type": "text", - "containerClass": "z-16", - "pattern": "^.*$", - "inpType": "input", - "name": "Blacklist User-Agent", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of User-Agent (PCRE regex), separated with spaces, to block." - } - ] - }, - "BLACKLIST_URI": { - "context": "multisite", - "default": "", - "help": "List of URI (PCRE regex), separated with spaces, to block.", - "id": "blacklist-uri", - "label": "Blacklist URI", - "regex": "^( *(.*)(?!.*\\2(?!.)) *)*$", - "type": "text", - "containerClass": "z-15", - "pattern": "^( *(.*)(?!.*\\2(?!.)) *)*$", - "inpType": "input", - "name": "Blacklist URI", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of URI (PCRE regex), separated with spaces, to block." - } - ] - }, - "BLACKLIST_IGNORE_IP": { - "context": "multisite", - "default": "", - "help": "List of IP/network, separated with spaces, to ignore in the blacklist.", - "id": "blacklist-ignore-ip", - "label": "Blacklist ignore IP/network", - "regex": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "type": "text", - "containerClass": "z-14", - "pattern": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "inpType": "input", - "name": "Blacklist ignore IP/network", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of IP/network, separated with spaces, to ignore in the blacklist." - } - ] - }, - "BLACKLIST_IGNORE_RDNS": { - "context": "multisite", - "default": "", - "help": "List of reverse DNS suffixes, separated with spaces, to ignore in the blacklist.", - "id": "blacklist-ignore-rdns", - "label": "Blacklist ignore reverse DNS", - "regex": "^( *(([^ ]+)(?!.*\\3( |$))) *)*$", - "type": "text", - "containerClass": "z-13", - "pattern": "^( *(([^ ]+)(?!.*\\3( |$))) *)*$", - "inpType": "input", - "name": "Blacklist ignore reverse DNS", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of reverse DNS suffixes, separated with spaces, to ignore in the blacklist." - } - ] - }, - "BLACKLIST_IGNORE_ASN": { - "context": "multisite", - "default": "", - "help": "List of ASN numbers, separated with spaces, to ignore in the blacklist.", - "id": "blacklist-ignore-asn", - "label": "Blacklist ignore ASN", - "regex": "^^( *((ASN?)?(\\d+)\\b(?!.*[SN ]\\4\\b)) *)*$", - "type": "text", - "containerClass": "z-12", - "pattern": "^^( *((ASN?)?(\\d+)\\b(?!.*[SN ]\\4\\b)) *)*$", - "inpType": "input", - "name": "Blacklist ignore ASN", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of ASN numbers, separated with spaces, to ignore in the blacklist." - } - ] - }, - "BLACKLIST_IGNORE_USER_AGENT": { - "context": "multisite", - "default": "", - "help": "List of User-Agent (PCRE regex), separated with spaces, to ignore in the blacklist.", - "id": "blacklist-ignore-user-agent", - "label": "Blacklist ignore User-Agent", - "regex": "^.*$", - "type": "text", - "containerClass": "z-11", - "pattern": "^.*$", - "inpType": "input", - "name": "Blacklist ignore User-Agent", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of User-Agent (PCRE regex), separated with spaces, to ignore in the blacklist." - } - ] - }, - "BLACKLIST_IGNORE_URI": { - "context": "multisite", - "default": "", - "help": "List of URI (PCRE regex), separated with spaces, to ignore in the blacklist.", - "id": "blacklist-ignore-uri", - "label": "Blacklist ignore URI", - "regex": "^( *(.*)(?!.*\\2(?!.)) *)*$", - "type": "text", - "containerClass": "z-10", - "pattern": "^( *(.*)(?!.*\\2(?!.)) *)*$", - "inpType": "input", - "name": "Blacklist ignore URI", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of URI (PCRE regex), separated with spaces, to ignore in the blacklist." - } - ] - }, - "BLACKLIST_IP_URLS": { - "context": "global", - "default": "https://www.dan.me.uk/torlist/?exit", - "help": "List of URLs, separated with spaces, containing bad IP/network to block.", - "id": "blacklist-ip-urls", - "label": "Blacklist IP/network URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - "containerClass": "z-9", - "pattern": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "inpType": "input", - "name": "Blacklist IP/network URLs", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "https://www.dan.me.uk/torlist/?exit", - "method": "default", - "prev_value": "https://www.dan.me.uk/torlist/?exit", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "List of URLs, separated with spaces, containing bad IP/network to block." - } - ] - }, - "BLACKLIST_RDNS_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing reverse DNS suffixes to block.", - "id": "blacklist-rdns-urls", - "label": "Blacklist reverse DNS URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - "containerClass": "z-8", - "pattern": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "inpType": "input", - "name": "Blacklist reverse DNS URLs", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "List of URLs, separated with spaces, containing reverse DNS suffixes to block." - } - ] - }, - "BLACKLIST_ASN_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing ASN to block.", - "id": "blacklist-asn-urls", - "label": "Blacklist ASN URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - "containerClass": "z-7", - "pattern": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "inpType": "input", - "name": "Blacklist ASN URLs", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "List of URLs, separated with spaces, containing ASN to block." - } - ] - }, - "BLACKLIST_USER_AGENT_URLS": { - "context": "global", - "default": "https://raw.githubusercontent.com/mitchellkrogza/nginx-ultimate-bad-bot-blocker/master/_generator_lists/bad-user-agents.list", - "help": "List of URLs, separated with spaces, containing bad User-Agent to block.", - "id": "blacklist-user-agent-urls", - "label": "Blacklist User-Agent URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - "containerClass": "z-6", - "pattern": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "inpType": "input", - "name": "Blacklist User-Agent URLs", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "https://raw.githubusercontent.com/mitchellkrogza/nginx-ultimate-bad-bot-blocker/master/_generator_lists/bad-user-agents.list", - "method": "default", - "prev_value": "https://raw.githubusercontent.com/mitchellkrogza/nginx-ultimate-bad-bot-blocker/master/_generator_lists/bad-user-agents.list", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "List of URLs, separated with spaces, containing bad User-Agent to block." - } - ] - }, - "BLACKLIST_URI_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing bad URI to block.", - "id": "blacklist-uri-urls", - "label": "Blacklist URI URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - "containerClass": "z-5", - "pattern": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "inpType": "input", - "name": "Blacklist URI URLs", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "List of URLs, separated with spaces, containing bad URI to block." - } - ] - }, - "BLACKLIST_IGNORE_IP_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing IP/network to ignore in the blacklist.", - "id": "blacklist-ignore-ip-urls", - "label": "Blacklist ignore IP/network URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - "containerClass": "z-4", - "pattern": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "inpType": "input", - "name": "Blacklist ignore IP/network URLs", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "List of URLs, separated with spaces, containing IP/network to ignore in the blacklist." - } - ] - }, - "BLACKLIST_IGNORE_RDNS_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing reverse DNS suffixes to ignore in the blacklist.", - "id": "blacklist-ignore-rdns-urls", - "label": "Blacklist ignore reverse DNS URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - "containerClass": "z-3", - "pattern": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "inpType": "input", - "name": "Blacklist ignore reverse DNS URLs", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "List of URLs, separated with spaces, containing reverse DNS suffixes to ignore in the blacklist." - } - ] - }, - "BLACKLIST_IGNORE_ASN_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing ASN to ignore in the blacklist.", - "id": "blacklist-ignore-asn-urls", - "label": "Blacklist ignore ASN URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - "containerClass": "z-2", - "pattern": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "inpType": "input", - "name": "Blacklist ignore ASN URLs", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "List of URLs, separated with spaces, containing ASN to ignore in the blacklist." - } - ] - }, - "BLACKLIST_IGNORE_USER_AGENT_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing User-Agent to ignore in the blacklist.", - "id": "blacklist-ignore-user-agent-urls", - "label": "Blacklist ignore User-Agent URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - "containerClass": "z-1", - "pattern": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "inpType": "input", - "name": "Blacklist ignore User-Agent URLs", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "List of URLs, separated with spaces, containing User-Agent to ignore in the blacklist." - } - ] - }, - "BLACKLIST_IGNORE_URI_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing URI to ignore in the blacklist.", - "id": "blacklist-ignore-uri-urls", - "label": "Blacklist ignore URI URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - "containerClass": "z-0", - "pattern": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "inpType": "input", - "name": "Blacklist ignore URI URLs", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "List of URLs, separated with spaces, containing URI to ignore in the blacklist." - } - ] - } - }, - "checksum": null - }, - { - "id": "brotli", - "stream": "no", - "name": "Brotli", - "description": "Compress HTTP requests with the brotli algorithm.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "USE_BROTLI": { - "context": "multisite", - "default": "no", - "help": "Use brotli", - "id": "use-brotli", - "label": "Use brotli", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-3", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Use brotli", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "method": "default", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Use brotli" - } - ] - }, - "BROTLI_TYPES": { - "context": "multisite", - "default": "application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml", - "help": "List of MIME types that will be compressed with brotli.", - "id": "brotli-types", - "label": "MIME types", - "regex": "^(?! )( ?([\\-\\w.]+/[\\-\\w.+]+)(?!.*\\2(?!.)))+$", - "type": "text", - "containerClass": "z-2", - "pattern": "^(?! )( ?([\\-\\w.]+/[\\-\\w.+]+)(?!.*\\2(?!.)))+$", - "inpType": "input", - "name": "MIME types", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml", - "method": "default", - "prev_value": "application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of MIME types that will be compressed with brotli." - } - ] - }, - "BROTLI_MIN_LENGTH": { - "context": "multisite", - "default": "1000", - "help": "Minimum length for brotli compression.", - "id": "brotli-min-length", - "label": "Minimum length", - "regex": "^\\d+", - "type": "text", - "containerClass": "z-1", - "pattern": "^\\d+", - "inpType": "input", - "name": "Minimum length", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "1000", - "method": "default", - "prev_value": "1000", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Minimum length for brotli compression." - } - ] - }, - "BROTLI_COMP_LEVEL": { - "context": "multisite", - "default": "6", - "help": "The compression level of the brotli algorithm.", - "id": "brotli-comp-level", - "label": "Compression level", - "regex": "^([02-9]|1[01]?)$", - "type": "select", - "containerClass": "z-0", - "pattern": "^([02-9]|1[01]?)$", - "inpType": "select", - "name": "Compression level", - "values": [ - "0", - "1", - "10", - "11", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9" - ], - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "6", - "method": "default", - "prev_value": "6", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "The compression level of the brotli algorithm." - } - ] - } - }, - "checksum": null - }, - { - "id": "bunkernet", - "stream": "yes", - "name": "BunkerNet", - "description": "Share threat data with other BunkerWeb instances via BunkerNet.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": true, - "settings": { - "USE_BUNKERNET": { - "context": "multisite", - "default": "yes", - "help": "Activate BunkerNet feature.", - "id": "use-bunkernet", - "label": "Activate BunkerNet", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-1", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Activate BunkerNet", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": true, - "value": "no", - "method": "scheduler", - "prev_value": "no", - "popovers": [ - { - "iconName": "trespass", - "text": "inp_popover_method_disabled" - }, - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Activate BunkerNet feature." - } - ] - }, - "BUNKERNET_SERVER": { - "context": "global", - "default": "https://api.bunkerweb.io", - "help": "Address of the BunkerNet API.", - "id": "bunkernet-server", - "label": "BunkerNet server", - "regex": "^https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*$", - "type": "text", - "containerClass": "z-0", - "pattern": "^https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*$", - "inpType": "input", - "name": "BunkerNet server", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "https://api.bunkerweb.io", - "method": "default", - "prev_value": "https://api.bunkerweb.io", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Address of the BunkerNet API." - } - ] - } - }, - "checksum": null - }, - { - "id": "cors", - "stream": "no", - "name": "CORS", - "description": "Cross-Origin Resource Sharing.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": true, - "settings": { - "USE_CORS": { - "context": "multisite", - "default": "no", - "help": "Use CORS", - "id": "use-cors", - "label": "Use CORS", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-10", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Use CORS", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "method": "default", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Use CORS" - } - ] - }, - "CORS_ALLOW_ORIGIN": { - "context": "multisite", - "default": "*", - "help": "Allowed origins to make CORS requests : PCRE regex or *.", - "id": "cors-allow-origin", - "label": "Allowed origins", - "regex": "^.*$", - "type": "text", - "containerClass": "z-9", - "pattern": "^.*$", - "inpType": "input", - "name": "Allowed origins", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "self", - "method": "default", - "prev_value": "self", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Allowed origins to make CORS requests : PCRE regex or *." - } - ] - }, - "CORS_ALLOW_METHODS": { - "context": "multisite", - "default": "GET, POST, OPTIONS", - "help": "Value of the Access-Control-Allow-Methods header.", - "id": "cors-allow-methods", - "label": "Access-Control-Allow-Methods value", - "regex": "^(\\*|(?![, ])(,? ?(GET|HEAD|POST|PUT|DELETE|CONNECT|OPTIONS|TRACE|PATCH)(?!.*\\3))*)?$", - "type": "text", - "containerClass": "z-8", - "pattern": "^(\\*|(?![, ])(,? ?(GET|HEAD|POST|PUT|DELETE|CONNECT|OPTIONS|TRACE|PATCH)(?!.*\\3))*)?$", - "inpType": "input", - "name": "Access-Control-Allow-Methods value", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "GET, POST, OPTIONS", - "method": "default", - "prev_value": "GET, POST, OPTIONS", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value of the Access-Control-Allow-Methods header." - } - ] - }, - "CORS_ALLOW_HEADERS": { - "context": "multisite", - "default": "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range", - "help": "Value of the Access-Control-Allow-Headers header.", - "id": "cors-allow-headers", - "label": "Access-Control-Allow-Headers value", - "regex": "^(\\*|(?![, ])(,? ?([\\w\\-]+)(?!.*\\3(?!.)))*)?$", - "type": "text", - "containerClass": "z-7", - "pattern": "^(\\*|(?![, ])(,? ?([\\w\\-]+)(?!.*\\3(?!.)))*)?$", - "inpType": "input", - "name": "Access-Control-Allow-Headers value", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range", - "method": "default", - "prev_value": "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value of the Access-Control-Allow-Headers header." - } - ] - }, - "CORS_ALLOW_CREDENTIALS": { - "context": "multisite", - "default": "no", - "help": "Send the Access-Control-Allow-Credentials header.", - "id": "cors-allow-credentials", - "label": "Send Access-Control-Allow-Credentials", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-6", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Send Access-Control-Allow-Credentials", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "method": "default", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Send the Access-Control-Allow-Credentials header." - } - ] - }, - "CORS_EXPOSE_HEADERS": { - "context": "multisite", - "default": "Content-Length,Content-Range", - "help": "Value of the Access-Control-Expose-Headers header.", - "id": "cors-expose-headers", - "label": "Access-Control-Expose-Headers value", - "regex": "^(\\*|(?![, ]+)(,? ?([\\w\\-]+)(?!.*\\3(?!.)))*)?$", - "type": "text", - "containerClass": "z-5", - "pattern": "^(\\*|(?![, ]+)(,? ?([\\w\\-]+)(?!.*\\3(?!.)))*)?$", - "inpType": "input", - "name": "Access-Control-Expose-Headers value", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "Content-Length,Content-Range", - "method": "default", - "prev_value": "Content-Length,Content-Range", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value of the Access-Control-Expose-Headers header." - } - ] - }, - "CROSS_ORIGIN_OPENER_POLICY": { - "context": "multisite", - "default": "", - "help": "Value for the Cross-Origin-Opener-Policy header.", - "id": "cross-origin-opener-policy", - "label": "Cross-Origin-Opener-Policy", - "regex": "^(unsafe-none|same-origin-allow-popups|same-origin)?$", - "type": "select", - "containerClass": "z-4", - "pattern": "^(unsafe-none|same-origin-allow-popups|same-origin)?$", - "inpType": "select", - "name": "Cross-Origin-Opener-Policy", - "values": [ - "", - "same-origin", - "same-origin-allow-popups", - "unsafe-none" - ], - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "same-origin", - "method": "default", - "prev_value": "same-origin", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value for the Cross-Origin-Opener-Policy header." - } - ] - }, - "CROSS_ORIGIN_EMBEDDER_POLICY": { - "context": "multisite", - "default": "", - "help": "Value for the Cross-Origin-Embedder-Policy header.", - "id": "cross-origin-embedder-policy", - "label": "Cross-Origin-Embedder-Policy", - "regex": "^(unsafe-none|require-corp|credentialless)?$", - "type": "select", - "containerClass": "z-3", - "pattern": "^(unsafe-none|require-corp|credentialless)?$", - "inpType": "select", - "name": "Cross-Origin-Embedder-Policy", - "values": [ - "", - "credentialless", - "require-corp", - "unsafe-none" - ], - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "require-corp", - "method": "default", - "prev_value": "require-corp", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value for the Cross-Origin-Embedder-Policy header." - } - ] - }, - "CROSS_ORIGIN_RESOURCE_POLICY": { - "context": "multisite", - "default": "", - "help": "Value for the Cross-Origin-Resource-Policy header.", - "id": "cross-origin-resource-policy", - "label": "Cross-Origin-Resource-Policy", - "regex": "^(same-site|same-origin|cross-origin)?$", - "type": "select", - "containerClass": "z-2", - "pattern": "^(same-site|same-origin|cross-origin)?$", - "inpType": "select", - "name": "Cross-Origin-Resource-Policy", - "values": [ - "", - "cross-origin", - "same-origin", - "same-site" - ], - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "same-site", - "method": "default", - "prev_value": "same-site", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value for the Cross-Origin-Resource-Policy header." - } - ] - }, - "CORS_MAX_AGE": { - "context": "multisite", - "default": "86400", - "help": "Value of the Access-Control-Max-Age header.", - "id": "cors-max-age", - "label": "Access-Control-Max-Age value", - "regex": "^\\d+$", - "type": "text", - "containerClass": "z-1", - "pattern": "^\\d+$", - "inpType": "input", - "name": "Access-Control-Max-Age value", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "86400", - "method": "default", - "prev_value": "86400", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value of the Access-Control-Max-Age header." - } - ] - }, - "CORS_DENY_REQUEST": { - "context": "multisite", - "default": "yes", - "help": "Deny request and don't send it to backend if Origin is not allowed.", - "id": "cors-deny-request", - "label": "Deny request", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-0", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Deny request", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "method": "default", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Deny request and don't send it to backend if Origin is not allowed." - } - ] - } - }, - "checksum": null - }, - { - "id": "clientcache", - "stream": "no", - "name": "Client cache", - "description": "Manage caching for clients.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "USE_CLIENT_CACHE": { - "context": "multisite", - "default": "no", - "help": "Tell client to store locally static files.", - "id": "use-client-cache", - "label": "Use client cache", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-3", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Use client cache", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": true, - "value": "yes", - "method": "scheduler", - "prev_value": "yes", - "popovers": [ - { - "iconName": "trespass", - "text": "inp_popover_method_disabled" - }, - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Tell client to store locally static files." - } - ] - }, - "CLIENT_CACHE_EXTENSIONS": { - "context": "global", - "default": "jpg|jpeg|png|bmp|ico|svg|tif|css|js|otf|ttf|eot|woff|woff2", - "help": "List of file extensions, separated with pipes that should be cached.", - "id": "client-cache-extensions", - "label": "Extensions that should be cached by the client", - "regex": "^(?!\\|)(\\|?([a-z0-9]+)(?!.*\\2(?!.)))+$", - "type": "text", - "containerClass": "z-2", - "pattern": "^(?!\\|)(\\|?([a-z0-9]+)(?!.*\\2(?!.)))+$", - "inpType": "input", - "name": "Extensions that should be cached by the client", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "jpg|jpeg|png|bmp|ico|svg|tif|css|js|otf|ttf|eot|woff|woff2", - "method": "default", - "prev_value": "jpg|jpeg|png|bmp|ico|svg|tif|css|js|otf|ttf|eot|woff|woff2", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "List of file extensions, separated with pipes that should be cached." - } - ] - }, - "CLIENT_CACHE_ETAG": { - "context": "multisite", - "default": "yes", - "help": "Send the HTTP ETag header for static resources.", - "id": "client-cache-etag", - "label": "ETag", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-1", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "ETag", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "method": "default", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Send the HTTP ETag header for static resources." - } - ] - }, - "CLIENT_CACHE_CONTROL": { - "context": "multisite", - "default": "public, max-age=15552000", - "help": "Value of the Cache-Control HTTP header.", - "id": "client-cache-control", - "label": "Cache-Control header", - "regex": "^(?!(, ?| ))((, )?(((max-age|s-maxage|stale-while-revalidate|stale-if-error)=\\d+(?!.*\\6))|((?!.*public)private|(?!.*private)public)|(must|proxy)-revalidate|must-understand|immutable|no-(cache|store|transform))(?!.*\\4))+$", - "type": "text", - "containerClass": "z-0", - "pattern": "^(?!(, ?| ))((, )?(((max-age|s-maxage|stale-while-revalidate|stale-if-error)=\\d+(?!.*\\6))|((?!.*public)private|(?!.*private)public)|(must|proxy)-revalidate|must-understand|immutable|no-(cache|store|transform))(?!.*\\4))+$", - "inpType": "input", - "name": "Cache-Control header", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "public, max-age=15552000", - "method": "default", - "prev_value": "public, max-age=15552000", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value of the Cache-Control HTTP header." - } - ] - } - }, - "checksum": null - }, - { - "id": "country", - "stream": "yes", - "name": "Country", - "description": "Deny access based on the country of the client IP.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": true, - "settings": { - "BLACKLIST_COUNTRY": { - "context": "multisite", - "default": "", - "help": "Deny access if the country of the client is in the list (ISO 3166-1 alpha-2 format separated with spaces).", - "id": "country-blacklist", - "label": "Country blacklist", - "regex": "^(?! )( *([A-Z]{2})(?!.*\\2) *)*$", - "type": "text", - "containerClass": "z-1", - "pattern": "^(?! )( *([A-Z]{2})(?!.*\\2) *)*$", - "inpType": "input", - "name": "Country blacklist", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Deny access if the country of the client is in the list (ISO 3166-1 alpha-2 format separated with spaces)." - } - ] - }, - "WHITELIST_COUNTRY": { - "context": "multisite", - "default": "", - "help": "Deny access if the country of the client is not in the list (ISO 3166-1 alpha-2 format separated with spaces).", - "id": "country-whitelist", - "label": "Country whitelist", - "regex": "^(?! )( *([A-Z]{2})(?!.*\\2) *)*$", - "type": "text", - "containerClass": "z-0", - "pattern": "^(?! )( *([A-Z]{2})(?!.*\\2) *)*$", - "inpType": "input", - "name": "Country whitelist", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Deny access if the country of the client is not in the list (ISO 3166-1 alpha-2 format separated with spaces)." - } - ] - } - }, - "checksum": null - }, - { - "id": "customcert", - "stream": "yes", - "name": "Custom HTTPS certificate", - "description": "Choose custom certificate for HTTPS.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "USE_CUSTOM_SSL": { - "context": "multisite", - "default": "no", - "help": "Use custom HTTPS certificate.", - "id": "use-custom-https", - "label": "Use custom certificate", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-4", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Use custom certificate", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "method": "default", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Use custom HTTPS certificate." - } - ] - }, - "CUSTOM_SSL_CERT": { - "context": "multisite", - "default": "", - "help": "Full path of the certificate or bundle file (must be readable by the scheduler).", - "id": "custom-https-cert", - "label": "Certificate path", - "regex": "^(/[\\w. \\-]+)*/?$", - "type": "text", - "containerClass": "z-3", - "pattern": "^(/[\\w. \\-]+)*/?$", - "inpType": "input", - "name": "Certificate path", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Full path of the certificate or bundle file (must be readable by the scheduler)." - } - ] - }, - "CUSTOM_SSL_KEY": { - "context": "multisite", - "default": "", - "help": "Full path of the key file (must be readable by the scheduler).", - "id": "custom-https-key", - "label": "Key path", - "regex": "^(/[\\w. \\-]+)*/?$", - "type": "text", - "containerClass": "z-2", - "pattern": "^(/[\\w. \\-]+)*/?$", - "inpType": "input", - "name": "Key path", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Full path of the key file (must be readable by the scheduler)." - } - ] - }, - "CUSTOM_SSL_CERT_DATA": { - "context": "multisite", - "default": "", - "help": "Certificate data encoded in base64.", - "id": "custom-https-cert-data", - "label": "Certificate data (base64)", - "regex": "^.*$", - "type": "text", - "containerClass": "z-1", - "pattern": "^.*$", - "inpType": "input", - "name": "Certificate data (base64)", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Certificate data encoded in base64." - } - ] - }, - "CUSTOM_SSL_KEY_DATA": { - "context": "multisite", - "default": "", - "help": "Key data encoded in base64.", - "id": "custom-https-key-data", - "label": "Key data (base64)", - "regex": "^.*$", - "type": "text", - "containerClass": "z-0", - "pattern": "^.*$", - "inpType": "input", - "name": "Key data (base64)", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Key data encoded in base64." - } - ] - } - }, - "checksum": null - }, - { - "id": "db", - "stream": "yes", - "name": "DB", - "description": "Integrate easily the Database.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "DATABASE_URI": { - "context": "global", - "default": "sqlite:////var/lib/bunkerweb/db.sqlite3", - "help": "The database URI, following the sqlalchemy format.", - "id": "database-uri", - "label": "The database URI", - "regex": "^((postgresql|mysql|mariadb|sqlite)(\\+[\\w\\-]+)?:.+)?$", - "type": "text", - "containerClass": "z-2", - "pattern": "^((postgresql|mysql|mariadb|sqlite)(\\+[\\w\\-]+)?:.+)?$", - "inpType": "input", - "name": "The database URI", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "sqlite:////var/lib/bunkerweb/db.sqlite3", - "method": "default", - "prev_value": "sqlite:////var/lib/bunkerweb/db.sqlite3", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "The database URI, following the sqlalchemy format." - } - ] - }, - "DATABASE_URI_READONLY": { - "context": "global", - "default": "", - "help": "The database URI for read-only operations, it can also serve as a fallback if the main database is down. Following the sqlalchemy format.", - "id": "database-uri-readonly", - "label": "The database URI for read-only operations", - "regex": "^((postgresql|mysql|mariadb|sqlite)(\\+[\\w\\-]+)?:.+)?$", - "type": "text", - "containerClass": "z-1", - "pattern": "^((postgresql|mysql|mariadb|sqlite)(\\+[\\w\\-]+)?:.+)?$", - "inpType": "input", - "name": "The database URI for read-only operations", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "The database URI for read-only operations, it can also serve as a fallback if the main database is down. Following the sqlalchemy format." - } - ] - }, - "DATABASE_LOG_LEVEL": { - "context": "global", - "default": "warning", - "help": "The level to use for database logs.", - "id": "database-log-level", - "label": "Database log level", - "regex": "^(debug|info|warn|warning|error)$", - "type": "select", - "containerClass": "z-0", - "pattern": "^(debug|info|warn|warning|error)$", - "inpType": "select", - "name": "Database log level", - "values": ["debug", "error", "info", "warn", "warning"], - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "warning", - "method": "default", - "prev_value": "warning", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "The level to use for database logs." - } - ] - } - }, - "checksum": null - }, - { - "id": "dnsbl", - "stream": "yes", - "name": "DNSBL", - "description": "Deny access based on external DNSBL servers.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": true, - "settings": { - "USE_DNSBL": { - "context": "multisite", - "default": "yes", - "help": "Activate DNSBL feature.", - "id": "use-dnsbl", - "label": "Activate DNSBL", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-1", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Activate DNSBL", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "method": "default", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Activate DNSBL feature." - } - ] - }, - "DNSBL_LIST": { - "context": "global", - "default": "bl.blocklist.de problems.dnsbl.sorbs.net sbl.spamhaus.org xbl.spamhaus.org", - "help": "List of DNSBL servers.", - "id": "dnsbl-list", - "label": "DNSBL list", - "regex": "^(?! )( ?((?!\\.)[\\w.]+)(?!.*\\2(?!.)))*$", - "type": "text", - "containerClass": "z-0", - "pattern": "^(?! )( ?((?!\\.)[\\w.]+)(?!.*\\2(?!.)))*$", - "inpType": "input", - "name": "DNSBL list", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "bl.blocklist.de problems.dnsbl.sorbs.net sbl.spamhaus.org xbl.spamhaus.org", - "method": "default", - "prev_value": "bl.blocklist.de problems.dnsbl.sorbs.net sbl.spamhaus.org xbl.spamhaus.org", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "List of DNSBL servers." - } - ] - } - }, - "checksum": null - }, - { - "id": "errors", - "stream": "no", - "name": "Errors", - "description": "Manage default error pages", - "version": "1.0", - "type": "core", - "method": "manual", - "page": true, - "settings": { - "ERRORS": { - "context": "multisite", - "default": "", - "help": "List of HTTP error code and corresponding error pages, separated with spaces (404=/my404.html 403=/errors/403.html ...).", - "id": "errors", - "label": "Errors", - "regex": "^(?! )( ?([1-5]\\d{2})(?!.*\\2(?![^=]))=(\\/[\\w\\].~:\\/?#\\[@!$\\&'\\(\\)*+,;=\\-]*)(?!.*\\3(?!.)))*$", - "type": "text", - "containerClass": "z-1", - "pattern": "^(?! )( ?([1-5]\\d{2})(?!.*\\2(?![^=]))=(\\/[\\w\\].~:\\/?#\\[@!$\\&'\\(\\)*+,;=\\-]*)(?!.*\\3(?!.)))*$", - "inpType": "input", - "name": "Errors", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of HTTP error code and corresponding error pages, separated with spaces (404=/my404.html 403=/errors/403.html ...)." - } - ] - }, - "INTERCEPTED_ERROR_CODES": { - "context": "multisite", - "default": "400 401 403 404 405 413 429 500 501 502 503 504", - "help": "List of HTTP error code intercepted by BunkerWeb", - "id": "intercepted-error-codes", - "label": "Intercepted error codes", - "regex": "^( *([1-5]\\d{2})(?!.*\\2) *)+$", - "type": "text", - "containerClass": "z-0", - "pattern": "^( *([1-5]\\d{2})(?!.*\\2) *)+$", - "inpType": "input", - "name": "Intercepted error codes", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "400 401 403 404 405 413 429 500 501 502 503 504", - "method": "default", - "prev_value": "400 401 403 404 405 413 429 500 501 502 503 504", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of HTTP error code intercepted by BunkerWeb" - } - ] - } - }, - "checksum": null - }, - { - "id": "greylist", - "stream": "partial", - "name": "Greylist", - "description": "Allow access while keeping security features based on internal and external IP/network/rDNS/ASN greylists.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": true, - "settings": { - "USE_GREYLIST": { - "context": "multisite", - "default": "no", - "help": "Activate greylist feature.", - "id": "use-greylist", - "label": "Activate greylisting", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-11", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Activate greylisting", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "method": "default", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Activate greylist feature." - } - ] - }, - "GREYLIST_IP": { - "context": "multisite", - "default": "", - "help": "List of IP/network, separated with spaces, to put into the greylist.", - "id": "greylist-ip", - "label": "Greylist IP/network", - "regex": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "type": "text", - "containerClass": "z-10", - "pattern": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "inpType": "input", - "name": "Greylist IP/network", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of IP/network, separated with spaces, to put into the greylist." - } - ] - }, - "GREYLIST_RDNS": { - "context": "multisite", - "default": "", - "help": "List of reverse DNS suffixes, separated with spaces, to put into the greylist.", - "id": "greylist-rdns", - "label": "Greylist reverse DNS", - "regex": "^( *(([^ ]+)(?!.*\\3( |$))) *)*$", - "type": "text", - "containerClass": "z-9", - "pattern": "^( *(([^ ]+)(?!.*\\3( |$))) *)*$", - "inpType": "input", - "name": "Greylist reverse DNS", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of reverse DNS suffixes, separated with spaces, to put into the greylist." - } - ] - }, - "GREYLIST_RDNS_GLOBAL": { - "context": "multisite", - "default": "yes", - "help": "Only perform RDNS greylist checks on global IP addresses.", - "id": "greylist-rdns-global", - "label": "Greylist reverse DNS global IPs", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-8", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Greylist reverse DNS global IPs", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "method": "default", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Only perform RDNS greylist checks on global IP addresses." - } - ] - }, - "GREYLIST_ASN": { - "context": "multisite", - "default": "", - "help": "List of ASN numbers, separated with spaces, to put into the greylist.", - "id": "greylist-asn", - "label": "Greylist ASN", - "regex": "^^( *((ASN?)?(\\d+)\\b(?!.*[SN ]\\4\\b)) *)*$", - "type": "text", - "containerClass": "z-7", - "pattern": "^^( *((ASN?)?(\\d+)\\b(?!.*[SN ]\\4\\b)) *)*$", - "inpType": "input", - "name": "Greylist ASN", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of ASN numbers, separated with spaces, to put into the greylist." - } - ] - }, - "GREYLIST_USER_AGENT": { - "context": "multisite", - "default": "", - "help": "List of User-Agent (PCRE regex), separated with spaces, to put into the greylist.", - "id": "greylist-user-agent", - "label": "Greylist User-Agent", - "regex": "^.*$", - "type": "text", - "containerClass": "z-6", - "pattern": "^.*$", - "inpType": "input", - "name": "Greylist User-Agent", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of User-Agent (PCRE regex), separated with spaces, to put into the greylist." - } - ] - }, - "GREYLIST_URI": { - "context": "multisite", - "default": "", - "help": "List of URI (PCRE regex), separated with spaces, to put into the greylist.", - "id": "greylist-uri", - "label": "Greylist URI", - "regex": "^.*$", - "type": "text", - "containerClass": "z-5", - "pattern": "^.*$", - "inpType": "input", - "name": "Greylist URI", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of URI (PCRE regex), separated with spaces, to put into the greylist." - } - ] - }, - "GREYLIST_IP_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing good IP/network to put into the greylist.", - "id": "greylist-ip-urls", - "label": "Greylist IP/network URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - "containerClass": "z-4", - "pattern": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "inpType": "input", - "name": "Greylist IP/network URLs", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "List of URLs, separated with spaces, containing good IP/network to put into the greylist." - } - ] - }, - "GREYLIST_RDNS_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing reverse DNS suffixes to put into the greylist.", - "id": "greylist-rdns-urls", - "label": "Greylist reverse DNS URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - "containerClass": "z-3", - "pattern": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "inpType": "input", - "name": "Greylist reverse DNS URLs", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "List of URLs, separated with spaces, containing reverse DNS suffixes to put into the greylist." - } - ] - }, - "GREYLIST_ASN_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing ASN to put into the greylist.", - "id": "greylist-asn-urls", - "label": "Greylist ASN URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - "containerClass": "z-2", - "pattern": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "inpType": "input", - "name": "Greylist ASN URLs", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "List of URLs, separated with spaces, containing ASN to put into the greylist." - } - ] - }, - "GREYLIST_USER_AGENT_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing good User-Agent to put into the greylist.", - "id": "greylist-user-agent-urls", - "label": "Greylist User-Agent URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - "containerClass": "z-1", - "pattern": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "inpType": "input", - "name": "Greylist User-Agent URLs", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "List of URLs, separated with spaces, containing good User-Agent to put into the greylist." - } - ] - }, - "GREYLIST_URI_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing bad URI to put into the greylist.", - "id": "greylist-uri-urls", - "label": "Greylist URI URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - "containerClass": "z-0", - "pattern": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "inpType": "input", - "name": "Greylist URI URLs", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "List of URLs, separated with spaces, containing bad URI to put into the greylist." - } - ] - } - }, - "checksum": null - }, - { - "id": "gzip", - "stream": "no", - "name": "Gzip", - "description": "Compress HTTP requests with the gzip algorithm.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "USE_GZIP": { - "context": "multisite", - "default": "no", - "help": "Use gzip", - "id": "use-gzip", - "label": "Use gzip", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-4", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Use gzip", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": true, - "value": "yes", - "method": "scheduler", - "prev_value": "yes", - "popovers": [ - { - "iconName": "trespass", - "text": "inp_popover_method_disabled" - }, - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Use gzip" - } - ] - }, - "GZIP_TYPES": { - "context": "multisite", - "default": "application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml", - "help": "List of MIME types that will be compressed with gzip.", - "id": "gzip-types", - "label": "MIME types", - "regex": "^(?! )( ?([\\-\\w.]+/[\\-\\w.+]+)(?!.*\\2(?!.)))+$", - "type": "text", - "containerClass": "z-3", - "pattern": "^(?! )( ?([\\-\\w.]+/[\\-\\w.+]+)(?!.*\\2(?!.)))+$", - "inpType": "input", - "name": "MIME types", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml", - "method": "default", - "prev_value": "application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of MIME types that will be compressed with gzip." - } - ] - }, - "GZIP_MIN_LENGTH": { - "context": "multisite", - "default": "1000", - "help": "Minimum length for gzip compression.", - "id": "gzip-min-length", - "label": "Minimum length", - "regex": "^\\d+$", - "type": "text", - "containerClass": "z-2", - "pattern": "^\\d+$", - "inpType": "input", - "name": "Minimum length", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "1000", - "method": "default", - "prev_value": "1000", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Minimum length for gzip compression." - } - ] - }, - "GZIP_COMP_LEVEL": { - "context": "multisite", - "default": "5", - "help": "The compression level of the gzip algorithm.", - "id": "gzip-comp-level", - "label": "Compression level", - "regex": "^[1-9]$", - "type": "select", - "containerClass": "z-1", - "pattern": "^[1-9]$", - "inpType": "select", - "name": "Compression level", - "values": ["1", "2", "3", "4", "5", "6", "7", "8", "9"], - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "5", - "method": "default", - "prev_value": "5", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "The compression level of the gzip algorithm." - } - ] - }, - "GZIP_PROXIED": { - "context": "multisite", - "default": "no-cache no-store private expired auth", - "help": "Which kind of proxied requests we should compress.", - "id": "gzip-proxied", - "label": "Proxied requests", - "regex": "^.*$", - "type": "text", - "containerClass": "z-0", - "pattern": "^.*$", - "inpType": "input", - "name": "Proxied requests", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no-cache no-store private expired auth", - "method": "default", - "prev_value": "no-cache no-store private expired auth", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Which kind of proxied requests we should compress." - } - ] - } - }, - "checksum": null - }, - { - "id": "inject", - "stream": "no", - "name": "HTML injection", - "description": "Inject custom HTML code before the tag.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "INJECT_BODY": { - "context": "multisite", - "default": "", - "help": "The HTML code to inject.", - "id": "inject-body", - "label": "HTML code", - "regex": "^.*$", - "type": "text", - "containerClass": "z-0", - "pattern": "^.*$", - "inpType": "input", - "name": "HTML code", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "The HTML code to inject." - } - ] - } - }, - "checksum": null - }, - { - "id": "headers", - "stream": "no", - "name": "Headers", - "description": "Manage HTTP headers sent to clients.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "REMOVE_HEADERS": { - "context": "multisite", - "default": "Server Expect-CT X-Powered-By X-AspNet-Version X-AspNetMvc-Version", - "help": "Headers to remove (Header1 Header2 Header3 ...)", - "id": "remove-headers", - "label": "Remove headers", - "regex": "^(?! )( ?[\\w\\-]+)*$", - "type": "text", - "containerClass": "z-12", - "pattern": "^(?! )( ?[\\w\\-]+)*$", - "inpType": "input", - "name": "Remove headers", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "Server Expect-CT X-Powered-By X-AspNet-Version X-AspNetMvc-Version Public-Key-Pins", - "method": "default", - "prev_value": "Server Expect-CT X-Powered-By X-AspNet-Version X-AspNetMvc-Version Public-Key-Pins", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Headers to remove (Header1 Header2 Header3 ...)" - } - ] - }, - "KEEP_UPSTREAM_HEADERS": { - "context": "multisite", - "default": "Content-Security-Policy Permissions-Policy Feature-Policy X-Frame-Options", - "help": "Headers to keep from upstream (Header1 Header2 Header3 ... or * for all).", - "id": "keep-upstream-headers", - "label": "Keep upstream headers", - "regex": "^((?! )( ?[\\w\\-]+)+|\\*)?$", - "type": "text", - "containerClass": "z-11", - "pattern": "^((?! )( ?[\\w\\-]+)+|\\*)?$", - "inpType": "input", - "name": "Keep upstream headers", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "Content-Security-Policy Permissions-Policy X-Frame-Options", - "method": "default", - "prev_value": "Content-Security-Policy Permissions-Policy X-Frame-Options", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Headers to keep from upstream (Header1 Header2 Header3 ... or * for all)." - } - ] - }, - "STRICT_TRANSPORT_SECURITY": { - "context": "multisite", - "default": "max-age=31536000", - "help": "Value for the Strict-Transport-Security header.", - "id": "strict-transport-security", - "label": "Strict-Transport-Security", - "regex": "^max-age=\\d+(; includeSubDomains(; preload)?)?$", - "type": "text", - "containerClass": "z-10", - "pattern": "^max-age=\\d+(; includeSubDomains(; preload)?)?$", - "inpType": "input", - "name": "Strict-Transport-Security", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "max-age=31536000; includeSubDomains; preload", - "method": "default", - "prev_value": "max-age=31536000; includeSubDomains; preload", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value for the Strict-Transport-Security header." - } - ] - }, - "COOKIE_AUTO_SECURE_FLAG": { - "context": "multisite", - "default": "yes", - "help": "Automatically add the Secure flag to all cookies.", - "id": "cookie-auto-secure-flag", - "label": "Cookie auto Secure flag", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-8", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Cookie auto Secure flag", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "method": "default", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Automatically add the Secure flag to all cookies." - } - ] - }, - "CONTENT_SECURITY_POLICY": { - "context": "multisite", - "default": "object-src 'none'; form-action 'self'; frame-ancestors 'self';", - "help": "Value for the Content-Security-Policy header.", - "id": "content-security-policy", - "label": "Content-Security-Policy", - "regex": "^.*$", - "type": "text", - "containerClass": "z-7", - "pattern": "^.*$", - "inpType": "input", - "name": "Content-Security-Policy", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "object-src 'none'; form-action 'self'; frame-ancestors 'self';", - "method": "default", - "prev_value": "object-src 'none'; form-action 'self'; frame-ancestors 'self';", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value for the Content-Security-Policy header." - } - ] - }, - "CONTENT_SECURITY_POLICY_REPORT_ONLY": { - "context": "multisite", - "default": "no", - "help": "Send reports for violations of the Content-Security-Policy header instead of blocking them.", - "id": "content-security-policy-report-only", - "label": "Content-Security-Policy-Report-Only", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-6", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Content-Security-Policy-Report-Only", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "method": "default", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Send reports for violations of the Content-Security-Policy header instead of blocking them." - } - ] - }, - "REFERRER_POLICY": { - "context": "multisite", - "default": "strict-origin-when-cross-origin", - "help": "Value for the Referrer-Policy header.", - "id": "referrer-policy", - "label": "Referrer-Policy", - "regex": "^(?!^(,| ))((, )?(no-referrer-when-downgrade|no-referrer|origin-when-cross-origin|same-origin|strict-origin-when-cross-origin|strict-origin|origin|unsafe-url)(?!\\b.*, \\4\\b))*$", - "type": "text", - "containerClass": "z-5", - "pattern": "^(?!^(,| ))((, )?(no-referrer-when-downgrade|no-referrer|origin-when-cross-origin|same-origin|strict-origin-when-cross-origin|strict-origin|origin|unsafe-url)(?!\\b.*, \\4\\b))*$", - "inpType": "input", - "name": "Referrer-Policy", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "strict-origin-when-cross-origin", - "method": "default", - "prev_value": "strict-origin-when-cross-origin", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value for the Referrer-Policy header." - } - ] - }, - "PERMISSIONS_POLICY": { - "context": "multisite", - "default": "accelerometer=(), ambient-light-sensor=(), autoplay=(), battery=(), camera=(), cross-origin-isolated=(), display-capture=(), document-domain=(), encrypted-media=(), execution-while-not-rendered=(), execution-while-out-of-viewport=(), fullscreen=(), geolocation=(), gyroscope=(), hid=(), idle-detection=(), magnetometer=(), microphone=(), midi=(), navigation-override=(), payment=(), picture-in-picture=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), usb=(), web-share=(), xr-spatial-tracking=()", - "help": "Value for the Permissions-Policy header.", - "id": "permissions-policy", - "label": "Permissions-Policy", - "regex": "^(?![, ])(,? ?([a-z\\-]+)(?!.*[^\\-]\\2=)=(\\*|\\(( ?(self|\\u0022https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*\\u0022)(?=[ \\)]))*\\)))*$", - "type": "text", - "containerClass": "z-4", - "pattern": "^(?![, ])(,? ?([a-z\\-]+)(?!.*[^\\-]\\2=)=(\\*|\\(( ?(self|\\u0022https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*\\u0022)(?=[ \\)]))*\\)))*$", - "inpType": "input", - "name": "Permissions-Policy", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), battery=(), bluetooth=(), browsing-topics=(), camera=(), compute-pressure=(), display-capture=(), document-domain=(), encrypted-media=(), execution-while-not-rendered=(), execution-while-out-of-viewport=(), fullscreen=(), gamepad=(), geolocation=(), gyroscope=(), hid=(), identity-credentials-get=(), idle-detection=(), local-fonts=(), magnetometer=(), microphone=(), midi=(), otp-credentials=(), payment=(), picture-in-picture=(), publickey-credentials-create=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), speaker-selection=(), storage-access=(), usb=(), web-share=(), window-management=(), xr-spatial-tracking=()", - "method": "default", - "prev_value": "accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), battery=(), bluetooth=(), browsing-topics=(), camera=(), compute-pressure=(), display-capture=(), document-domain=(), encrypted-media=(), execution-while-not-rendered=(), execution-while-out-of-viewport=(), fullscreen=(), gamepad=(), geolocation=(), gyroscope=(), hid=(), identity-credentials-get=(), idle-detection=(), local-fonts=(), magnetometer=(), microphone=(), midi=(), otp-credentials=(), payment=(), picture-in-picture=(), publickey-credentials-create=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), speaker-selection=(), storage-access=(), usb=(), web-share=(), window-management=(), xr-spatial-tracking=()", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value for the Permissions-Policy header." - } - ] - }, - "FEATURE_POLICY": { - "context": "multisite", - "default": "accelerometer 'none'; ambient-light-sensor 'none'; autoplay 'none'; battery 'none'; camera 'none'; display-capture 'none'; document-domain 'none'; encrypted-media 'none'; execution-while-not-rendered 'none'; execution-while-out-of-viewport 'none'; fullscreen 'none'; geolocation 'none'; gyroscope 'none'; layout-animation 'none'; legacy-image-formats 'none'; magnetometer 'none'; microphone 'none'; midi 'none'; navigation-override 'none'; payment 'none'; picture-in-picture 'none'; publickey-credentials-get 'none'; speaker-selection 'none'; sync-xhr 'none'; unoptimized-images 'none'; unsized-media 'none'; usb 'none'; screen-wake-lock 'none'; web-share 'none'; xr-spatial-tracking 'none';", - "help": "Value for the Feature-Policy header.", - "id": "feature-policy", - "label": "Feature-Policy", - "regex": "^(?![; ])( ?([\\w\\-]+)(?!.*[^\\-]\\2 )( ('(none|self|strict-dynamic|report-sample|unsafe-inline|unsafe-eval|unsafe-hashes|unsafe-allow-redirects)'|https?:\\/\\/[\\w@:%.+~#=\\-]+[\\w\\(\\)!@:%+.~#?&\\/=$\\-]*))+;)*$", - "type": "text", - "containerClass": "z-3", - "pattern": "^(?![; ])( ?([\\w\\-]+)(?!.*[^\\-]\\2 )( ('(none|self|strict-dynamic|report-sample|unsafe-inline|unsafe-eval|unsafe-hashes|unsafe-allow-redirects)'|https?:\\/\\/[\\w@:%.+~#=\\-]+[\\w\\(\\)!@:%+.~#?&\\/=$\\-]*))+;)*$", - "inpType": "input", - "name": "Feature-Policy", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "accelerometer 'none'; ambient-light-sensor 'none'; autoplay 'none'; battery 'none'; camera 'none'; display-capture 'none'; document-domain 'none'; encrypted-media 'none'; execution-while-not-rendered 'none'; execution-while-out-of-viewport 'none'; fullscreen 'none'; geolocation 'none'; gyroscope 'none'; layout-animation 'none'; legacy-image-formats 'none'; magnetometer 'none'; microphone 'none'; midi 'none'; navigation-override 'none'; payment 'none'; picture-in-picture 'none'; publickey-credentials-get 'none'; speaker-selection 'none'; sync-xhr 'none'; unoptimized-images 'none'; unsized-media 'none'; usb 'none'; screen-wake-lock 'none'; web-share 'none'; xr-spatial-tracking 'none';", - "prev_value": "accelerometer 'none'; ambient-light-sensor 'none'; autoplay 'none'; battery 'none'; camera 'none'; display-capture 'none'; document-domain 'none'; encrypted-media 'none'; execution-while-not-rendered 'none'; execution-while-out-of-viewport 'none'; fullscreen 'none'; geolocation 'none'; gyroscope 'none'; layout-animation 'none'; legacy-image-formats 'none'; magnetometer 'none'; microphone 'none'; midi 'none'; navigation-override 'none'; payment 'none'; picture-in-picture 'none'; publickey-credentials-get 'none'; speaker-selection 'none'; sync-xhr 'none'; unoptimized-images 'none'; unsized-media 'none'; usb 'none'; screen-wake-lock 'none'; web-share 'none'; xr-spatial-tracking 'none';", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value for the Feature-Policy header." - } - ] - }, - "X_FRAME_OPTIONS": { - "context": "multisite", - "default": "SAMEORIGIN", - "help": "Value for the X-Frame-Options header.", - "id": "x-frame-options", - "label": "X-Frame-Options", - "regex": "^(DENY|SAMEORIGIN)?$", - "type": "select", - "containerClass": "z-2", - "pattern": "^(DENY|SAMEORIGIN)?$", - "inpType": "select", - "name": "X-Frame-Options", - "values": ["", "DENY", "SAMEORIGIN"], - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "SAMEORIGIN", - "method": "default", - "prev_value": "SAMEORIGIN", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value for the X-Frame-Options header." - } - ] - }, - "X_CONTENT_TYPE_OPTIONS": { - "context": "multisite", - "default": "nosniff", - "help": "Value for the X-Content-Type-Options header.", - "id": "x-content-type-options", - "label": "X-Content-Type-Options", - "regex": "^(nosniff)?$", - "type": "select", - "containerClass": "z-1", - "pattern": "^(nosniff)?$", - "inpType": "select", - "name": "X-Content-Type-Options", - "values": ["", "nosniff"], - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "nosniff", - "method": "default", - "prev_value": "nosniff", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value for the X-Content-Type-Options header." - } - ] - }, - "X_XSS_PROTECTION": { - "context": "multisite", - "default": "1; mode=block", - "help": "Value for the X-XSS-Protection header.", - "id": "x-xss-protection", - "label": "X-XSS-Protection", - "regex": "^0|1(; (mode=block|report=https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*))?$", - "type": "text", - "containerClass": "z-0", - "pattern": "^0|1(; (mode=block|report=https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*))?$", - "inpType": "input", - "name": "X-XSS-Protection", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "1; mode=block", - "method": "default", - "prev_value": "1; mode=block", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Value for the X-XSS-Protection header." - } - ] - } - }, - "checksum": null, - "multiples_schema": { - "custom-headers": { - "CUSTOM_HEADER": { - "context": "multisite", - "default": "", - "help": "Custom header to add (HeaderName: HeaderValue).", - "id": "custom-header", - "label": "Custom header (HeaderName: HeaderValue)", - "regex": "^([\\w\\-]+: .+)?$", - "type": "text", - "multiple": "custom-headers", - "pattern": "^([\\w\\-]+: .+)?$", - "inpType": "input", - "name": "Custom header (HeaderName: HeaderValue)", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Custom header to add (HeaderName: HeaderValue)." - } - ], - "containerClass": "z-13" - } - }, - "cookie-flags": { - "COOKIE_FLAGS": { - "context": "multisite", - "default": "* HttpOnly SameSite=Lax", - "help": "Cookie flags automatically added to all cookies (value accepted for nginx_cookie_flag_module).", - "id": "cookie-flags", - "label": "Cookie flags", - "regex": "^(\\*|[^;]+)( (HttpOnly|(SameSite)(?!.*\\4)(=(Lax|Strict))?)(?!.*\\3))*$", - "type": "text", - "multiple": "cookie-flags", - "pattern": "^(\\*|[^;]+)( (HttpOnly|(SameSite)(?!.*\\4)(=(Lax|Strict))?)(?!.*\\3))*$", - "inpType": "input", - "name": "Cookie flags", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "* HttpOnly SameSite=Lax", - "prev_value": "* HttpOnly SameSite=Lax", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Cookie flags automatically added to all cookies (value accepted for nginx_cookie_flag_module)." - } - ], - "containerClass": "z-12" - } - } - }, - "multiples": { - "custom-headers": { - "0": { - "CUSTOM_HEADER": { - "context": "multisite", - "default": "", - "help": "Custom header to add (HeaderName: HeaderValue).", - "id": "custom-header", - "label": "Custom header (HeaderName: HeaderValue)", - "regex": "^([\\w\\-]+: .+)?$", - "type": "text", - "multiple": "custom-headers", - "pattern": "^([\\w\\-]+: .+)?$", - "inpType": "input", - "name": "Custom header (HeaderName: HeaderValue)", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Custom header to add (HeaderName: HeaderValue)." - } - ], - "containerClass": "z-13", - "method": "default" - } - } - }, - "cookie-flags": { - "0": { - "COOKIE_FLAGS": { - "context": "multisite", - "default": "* HttpOnly SameSite=Lax", - "help": "Cookie flags automatically added to all cookies (value accepted for nginx_cookie_flag_module).", - "id": "cookie-flags", - "label": "Cookie flags", - "regex": "^(\\*|[^;]+)( (HttpOnly|(SameSite)(?!.*\\4)(=(Lax|Strict))?)(?!.*\\3))*$", - "type": "text", - "multiple": "cookie-flags", - "pattern": "^(\\*|[^;]+)( (HttpOnly|(SameSite)(?!.*\\4)(=(Lax|Strict))?)(?!.*\\3))*$", - "inpType": "input", - "name": "Cookie flags", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "* HttpOnly SameSite=Lax", - "prev_value": "* HttpOnly SameSite=Lax", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Cookie flags automatically added to all cookies (value accepted for nginx_cookie_flag_module)." - } - ], - "containerClass": "z-12", - "method": "default" - } - } - } - } - }, - { - "id": "jobs", - "stream": "yes", - "name": "Jobs", - "description": "Fake core plugin for internal jobs.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": {}, - "checksum": null - }, - { - "id": "letsencrypt", - "stream": "yes", - "name": "Let's Encrypt", - "description": "Automatic creation, renewal and configuration of Let's Encrypt certificates.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "AUTO_LETS_ENCRYPT": { - "context": "multisite", - "default": "no", - "help": "Activate automatic Let's Encrypt mode.", - "id": "auto-lets-encrypt", - "label": "Automatic Let's Encrypt", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-3", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Automatic Let's Encrypt", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "method": "default", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Activate automatic Let's Encrypt mode." - } - ] - }, - "EMAIL_LETS_ENCRYPT": { - "context": "multisite", - "default": "", - "help": "Email used for Let's Encrypt notification and in certificate.", - "id": "email-lets-encrypt", - "label": "Email Let's Encrypt", - "regex": "^([^@ \\t\\r\\n]+@[^@ \\t\\r\\n]+\\.[^@ \\t\\r\\n]+)?$", - "type": "text", - "containerClass": "z-2", - "pattern": "^([^@ \\t\\r\\n]+@[^@ \\t\\r\\n]+\\.[^@ \\t\\r\\n]+)?$", - "inpType": "input", - "name": "Email Let's Encrypt", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Email used for Let's Encrypt notification and in certificate." - } - ] - }, - "USE_LETS_ENCRYPT_STAGING": { - "context": "multisite", - "default": "no", - "help": "Use the staging environment for Let\u2019s Encrypt certificate generation. Useful when you are testing your deployments to avoid being rate limited in the production environment.", - "id": "use-lets-encrypt-staging", - "label": "Use Let's Encrypt Staging", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-1", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Use Let's Encrypt Staging", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "method": "default", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Use the staging environment for Let\u2019s Encrypt certificate generation. Useful when you are testing your deployments to avoid being rate limited in the production environment." - } - ] - }, - "LETS_ENCRYPT_CLEAR_OLD_CERTS": { - "context": "global", - "default": "no", - "help": "Clear old certificates when renewing.", - "id": "lets-encrypt-clear-old-certs", - "label": "Clear old certificates when they are no longer needed", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-0", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Clear old certificates when they are no longer needed", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "method": "default", - "prev_value": "no", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Clear old certificates when renewing." - } - ] - } - }, - "checksum": null - }, - { - "id": "limit", - "stream": "partial", - "name": "Limit", - "description": "Limit maximum number of requests and connections.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": true, - "settings": { - "USE_LIMIT_REQ": { - "context": "multisite", - "default": "yes", - "help": "Activate limit requests feature.", - "id": "use-limit-req", - "label": "Activate limit requests", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-6", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Activate limit requests", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "method": "default", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Activate limit requests feature." - } - ] - }, - "USE_LIMIT_CONN": { - "context": "multisite", - "default": "yes", - "help": "Activate limit connections feature.", - "id": "use-limit-conn", - "label": "Activate limit connections", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-3", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Activate limit connections", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "method": "default", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Activate limit connections feature." - } - ] - }, - "LIMIT_CONN_MAX_HTTP1": { - "context": "multisite", - "default": "10", - "help": "Maximum number of connections per IP when using HTTP/1.X protocol.", - "id": "limit-conn-max-http1", - "label": "Maximum number of HTTP/1.X connections", - "regex": "^\\d+$", - "type": "text", - "containerClass": "z-2", - "pattern": "^\\d+$", - "inpType": "input", - "name": "Maximum number of HTTP/1.X connections", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "10", - "method": "default", - "prev_value": "10", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Maximum number of connections per IP when using HTTP/1.X protocol." - } - ] - }, - "LIMIT_CONN_MAX_HTTP2": { - "context": "multisite", - "default": "100", - "help": "Maximum number of streams per IP when using HTTP/2 protocol.", - "id": "limit-conn-max-http2", - "label": "Maximum number of HTTP/2 streams", - "regex": "^\\d+$", - "type": "text", - "containerClass": "z-1", - "pattern": "^\\d+$", - "inpType": "input", - "name": "Maximum number of HTTP/2 streams", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "100", - "method": "default", - "prev_value": "100", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Maximum number of streams per IP when using HTTP/2 protocol." - } - ] - }, - "LIMIT_CONN_MAX_STREAM": { - "context": "multisite", - "default": "10", - "help": "Maximum number of connections per IP when using stream.", - "id": "limit-conn-max-stream", - "label": "Maximum number of stream connections", - "regex": "^\\d+$", - "type": "text", - "containerClass": "z-0", - "pattern": "^\\d+$", - "inpType": "input", - "name": "Maximum number of stream connections", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "10", - "method": "default", - "prev_value": "10", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Maximum number of connections per IP when using stream." - } - ] - } - }, - "checksum": null, - "multiples_schema": { - "limit-req": { - "LIMIT_REQ_URL": { - "context": "multisite", - "default": "/", - "help": "URL (PCRE regex) where the limit request will be applied or special value / for all requests.", - "id": "limit-req-url", - "label": "Limit request URL", - "regex": "^.+$", - "type": "text", - "multiple": "limit-req", - "pattern": "^.+$", - "inpType": "input", - "name": "Limit request URL", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "/", - "prev_value": "/", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "URL (PCRE regex) where the limit request will be applied or special value / for all requests." - } - ], - "containerClass": "z-6" - }, - "LIMIT_REQ_RATE": { - "context": "multisite", - "default": "2r/s", - "help": "Rate to apply to the URL (s for second, m for minute, h for hour and d for day).", - "id": "limit-req-rate", - "label": "Limit request Rate", - "regex": "^\\d+r/[smhd]$", - "type": "text", - "multiple": "limit-req", - "pattern": "^\\d+r/[smhd]$", - "inpType": "input", - "name": "Limit request Rate", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "2r/s", - "prev_value": "2r/s", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Rate to apply to the URL (s for second, m for minute, h for hour and d for day)." - } - ], - "containerClass": "z-5" - } - } - }, - "multiples": { - "limit-req": { - "0": { - "LIMIT_REQ_URL": { - "context": "multisite", - "default": "/", - "help": "URL (PCRE regex) where the limit request will be applied or special value / for all requests.", - "id": "limit-req-url", - "label": "Limit request URL", - "regex": "^.+$", - "type": "text", - "multiple": "limit-req", - "pattern": "^.+$", - "inpType": "input", - "name": "Limit request URL", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "/", - "prev_value": "/", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "URL (PCRE regex) where the limit request will be applied or special value / for all requests." - } - ], - "containerClass": "z-6", - "method": "default" - }, - "LIMIT_REQ_RATE": { - "context": "multisite", - "default": "2r/s", - "help": "Rate to apply to the URL (s for second, m for minute, h for hour and d for day).", - "id": "limit-req-rate", - "label": "Limit request Rate", - "regex": "^\\d+r/[smhd]$", - "type": "text", - "multiple": "limit-req", - "pattern": "^\\d+r/[smhd]$", - "inpType": "input", - "name": "Limit request Rate", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "2r/s", - "prev_value": "2r/s", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Rate to apply to the URL (s for second, m for minute, h for hour and d for day)." - } - ], - "containerClass": "z-5", - "method": "default" - } - } - } - } - }, - { - "id": "metrics", - "stream": "partial", - "name": "Metrics", - "description": "Metrics collection and retrieve.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "USE_METRICS": { - "context": "multisite", - "default": "yes", - "help": "Enable collection and retrieval of internal metrics.", - "id": "use-metrics", - "label": "Use metrics", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-2", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Use metrics", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "method": "default", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable collection and retrieval of internal metrics." - } - ] - }, - "METRICS_MEMORY_SIZE": { - "context": "global", - "default": "16m", - "help": "Size of the internal storage for metrics.", - "id": "metrics-memory-size", - "label": "Metrics memory size", - "regex": "^\\d+[kKmMgG]?$", - "type": "text", - "containerClass": "z-1", - "pattern": "^\\d+[kKmMgG]?$", - "inpType": "input", - "name": "Metrics memory size", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "16m", - "method": "default", - "prev_value": "16m", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Size of the internal storage for metrics." - } - ] - }, - "METRICS_MAX_BLOCKED_REQUESTS": { - "context": "global", - "default": "100", - "help": "Maximum number of blocked requests to store (per worker).", - "id": "metrics-max-blocked-requests", - "label": "Metrics max blocked requests", - "regex": "^\\d+$", - "type": "text", - "containerClass": "z-0", - "pattern": "^\\d+$", - "inpType": "input", - "name": "Metrics max blocked requests", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "100", - "method": "default", - "prev_value": "100", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Maximum number of blocked requests to store (per worker)." - } - ] - } - }, - "checksum": null - }, - { - "id": "misc", - "stream": "partial", - "name": "Miscellaneous", - "description": "Miscellaneous settings.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": true, - "settings": { - "DISABLE_DEFAULT_SERVER": { - "context": "global", - "default": "no", - "help": "Deny HTTP request if the request vhost is unknown.", - "id": "disable-default-server", - "label": "Disable default server", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-20", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Disable default server", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": true, - "value": "yes", - "method": "scheduler", - "prev_value": "yes", - "popovers": [ - { - "iconName": "trespass", - "text": "inp_popover_method_disabled" - }, - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Deny HTTP request if the request vhost is unknown." - } - ] - }, - "DISABLE_DEFAULT_SERVER_STRICT_SNI": { - "context": "global", - "default": "no", - "help": "Close SSL/TLS connection if the SNI is unknown.", - "id": "disable-default-server-strict-sni", - "label": "Disable default server strict SNI", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-19", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Disable default server strict SNI", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "method": "default", - "prev_value": "no", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Close SSL/TLS connection if the SNI is unknown." - } - ] - }, - "REDIRECT_HTTP_TO_HTTPS": { - "context": "multisite", - "default": "no", - "help": "Redirect all HTTP request to HTTPS.", - "id": "redirect-http-to-https", - "label": "Redirect HTTP to HTTPS", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-18", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Redirect HTTP to HTTPS", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "method": "default", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Redirect all HTTP request to HTTPS." - } - ] - }, - "AUTO_REDIRECT_HTTP_TO_HTTPS": { - "context": "multisite", - "default": "yes", - "help": "Try to detect if HTTPS is used and activate HTTP to HTTPS redirection if that's the case.", - "id": "auto-redirect-http-to-https", - "label": "Auto redirect HTTP to HTTPS", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-17", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Auto redirect HTTP to HTTPS", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "method": "default", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Try to detect if HTTPS is used and activate HTTP to HTTPS redirection if that's the case." - } - ] - }, - "ALLOWED_METHODS": { - "context": "multisite", - "default": "GET|POST|HEAD", - "help": "Allowed HTTP and WebDAV methods, separated with pipes to be sent by clients.", - "id": "allowed-methods", - "label": "Allowed methods", - "regex": "^(?!\\|)(\\|?([A-Z]{3,})(?!.*(^|\\|)\\2))+$", - "type": "text", - "containerClass": "z-16", - "pattern": "^(?!\\|)(\\|?([A-Z]{3,})(?!.*(^|\\|)\\2))+$", - "inpType": "input", - "name": "Allowed methods", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "GET|POST|HEAD", - "method": "default", - "prev_value": "GET|POST|HEAD", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Allowed HTTP and WebDAV methods, separated with pipes to be sent by clients." - } - ] - }, - "MAX_CLIENT_SIZE": { - "context": "multisite", - "default": "10m", - "help": "Maximum body size (0 for infinite).", - "id": "max-client-size", - "label": "Maximum body size", - "regex": "^\\d+[kKmMgG]?$", - "type": "text", - "containerClass": "z-15", - "pattern": "^\\d+[kKmMgG]?$", - "inpType": "input", - "name": "Maximum body size", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "10m", - "method": "default", - "prev_value": "10m", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Maximum body size (0 for infinite)." - } - ] - }, - "SERVE_FILES": { - "context": "multisite", - "default": "yes", - "help": "Serve files from the local folder.", - "id": "serve-files", - "label": "Serve files", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-14", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Serve files", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": true, - "value": "no", - "method": "scheduler", - "prev_value": "no", - "popovers": [ - { - "iconName": "trespass", - "text": "inp_popover_method_disabled" - }, - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Serve files from the local folder." - } - ] - }, - "ROOT_FOLDER": { - "context": "multisite", - "default": "", - "help": "Root folder containing files to serve (/var/www/html/{server_name} if unset).", - "id": "root-folder", - "label": "Root folder", - "regex": "^(/[\\w. \\-]+)*/?$", - "type": "text", - "containerClass": "z-13", - "pattern": "^(/[\\w. \\-]+)*/?$", - "inpType": "input", - "name": "Root folder", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Root folder containing files to serve (/var/www/html/{server_name} if unset)." - } - ] - }, - "SSL_PROTOCOLS": { - "context": "multisite", - "default": "TLSv1.2 TLSv1.3", - "help": "The supported version of TLS. We recommend the default value TLSv1.2 TLSv1.3 for compatibility reasons.", - "id": "https-protocols", - "label": "HTTPS protocols", - "regex": "^(?! )( ?TLSv1\\.[0-3])*$", - "type": "text", - "containerClass": "z-12", - "pattern": "^(?! )( ?TLSv1\\.[0-3])*$", - "inpType": "input", - "name": "HTTPS protocols", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "TLSv1.2 TLSv1.3", - "method": "default", - "prev_value": "TLSv1.2 TLSv1.3", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "The supported version of TLS. We recommend the default value TLSv1.2 TLSv1.3 for compatibility reasons." - } - ] - }, - "HTTP2": { - "context": "multisite", - "default": "yes", - "help": "Support HTTP2 protocol when HTTPS is enabled.", - "id": "http2", - "label": "HTTP2", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-11", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "HTTP2", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "method": "default", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Support HTTP2 protocol when HTTPS is enabled." - } - ] - }, - "HTTP3": { - "context": "multisite", - "default": "no", - "help": "Support HTTP3 protocol when HTTPS is enabled.", - "id": "http3", - "label": "HTTP3", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-10", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "HTTP3", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "method": "default", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Support HTTP3 protocol when HTTPS is enabled." - } - ] - }, - "HTTP3_ALT_SVC_PORT": { - "context": "multisite", - "default": "443", - "help": "HTTP3 alternate service port. This value will be used as part of the Alt-Svc header.", - "id": "http3-alt-svc-port", - "label": "HTTP3 Alt-Svc port", - "regex": "^\\d+$", - "type": "text", - "containerClass": "z-9", - "pattern": "^\\d+$", - "inpType": "input", - "name": "HTTP3 Alt-Svc port", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "443", - "method": "default", - "prev_value": "443", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "HTTP3 alternate service port. This value will be used as part of the Alt-Svc header." - } - ] - }, - "LISTEN_HTTP": { - "context": "multisite", - "default": "yes", - "help": "Respond to (insecure) HTTP requests.", - "id": "http-listen", - "label": "HTTP listen", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-8", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "HTTP listen", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "method": "default", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Respond to (insecure) HTTP requests." - } - ] - }, - "USE_OPEN_FILE_CACHE": { - "context": "multisite", - "default": "no", - "help": "Enable open file cache feature", - "id": "use-open-file-cache", - "label": "Use open file cache", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-7", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Use open file cache", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "method": "default", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable open file cache feature" - } - ] - }, - "OPEN_FILE_CACHE": { - "context": "multisite", - "default": "max=1000 inactive=20s", - "help": "Open file cache directive", - "id": "open-file-cache", - "label": "Use open file cache", - "regex": "^(off|max=\\d+( inactive=\\d+(ms?|[shdwMy]))?)$", - "type": "text", - "containerClass": "z-6", - "pattern": "^(off|max=\\d+( inactive=\\d+(ms?|[shdwMy]))?)$", - "inpType": "input", - "name": "Use open file cache", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "max=1000 inactive=20s", - "method": "default", - "prev_value": "max=1000 inactive=20s", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Open file cache directive" - } - ] - }, - "OPEN_FILE_CACHE_ERRORS": { - "context": "multisite", - "default": "yes", - "help": "Enable open file cache for errors", - "id": "open-file-cache-errors", - "label": "Open file cache errors", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-5", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Open file cache errors", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "method": "default", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable open file cache for errors" - } - ] - }, - "OPEN_FILE_CACHE_MIN_USES": { - "context": "multisite", - "default": "2", - "help": "Enable open file cache minimum uses", - "id": "open-file-cache-min-uses", - "label": "Open file cache min uses", - "regex": "^[1-9]\\d*$", - "type": "text", - "containerClass": "z-4", - "pattern": "^[1-9]\\d*$", - "inpType": "input", - "name": "Open file cache min uses", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "2", - "method": "default", - "prev_value": "2", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable open file cache minimum uses" - } - ] - }, - "OPEN_FILE_CACHE_VALID": { - "context": "multisite", - "default": "30s", - "help": "Open file cache valid time", - "id": "open-file-cache-valid", - "label": "Open file cache valid time", - "regex": "^\\d+(ms?|[shdwMy])$", - "type": "text", - "containerClass": "z-3", - "pattern": "^\\d+(ms?|[shdwMy])$", - "inpType": "input", - "name": "Open file cache valid time", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "30s", - "method": "default", - "prev_value": "30s", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Open file cache valid time" - } - ] - }, - "EXTERNAL_PLUGIN_URLS": { - "context": "global", - "default": "", - "help": "List of external plugins URLs (direct download to .zip or .tar file) to download and install (URLs are separated with space).", - "id": "external-plugin-urls", - "label": "External plugin URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - "containerClass": "z-2", - "pattern": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "inpType": "input", - "name": "External plugin URLs", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "List of external plugins URLs (direct download to .zip or .tar file) to download and install (URLs are separated with space)." - } - ] - }, - "DENY_HTTP_STATUS": { - "context": "global", - "default": "403", - "help": "HTTP status code to send when the request is denied (403 or 444). When using 444, BunkerWeb will close the connection.", - "id": "deny-http-status", - "label": "Deny HTTP status", - "regex": "^(403|444)$", - "type": "select", - "containerClass": "z-1", - "pattern": "^(403|444)$", - "inpType": "select", - "name": "Deny HTTP status", - "values": ["403", "444"], - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "403", - "method": "default", - "prev_value": "403", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "HTTP status code to send when the request is denied (403 or 444). When using 444, BunkerWeb will close the connection." - } - ] - }, - "SEND_ANONYMOUS_REPORT": { - "context": "global", - "default": "yes", - "help": "Send anonymous report to BunkerWeb maintainers.", - "id": "send-anonymous-report", - "label": "Send anonymous report", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-0", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Send anonymous report", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": true, - "value": "no", - "method": "scheduler", - "prev_value": "no", - "popovers": [ - { - "iconName": "trespass", - "text": "inp_popover_method_disabled" - }, - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Send anonymous report to BunkerWeb maintainers." - } - ] - } - }, - "checksum": null - }, - { - "id": "modsecurity", - "stream": "no", - "name": "ModSecurity", - "description": "Management of the ModSecurity WAF.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "USE_MODSECURITY": { - "context": "multisite", - "default": "yes", - "help": "Enable ModSecurity WAF.", - "id": "use-modsecurity", - "label": "Use ModSecurity", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-5", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Use ModSecurity", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "method": "default", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable ModSecurity WAF." - } - ] - }, - "USE_MODSECURITY_CRS": { - "context": "multisite", - "default": "yes", - "help": "Enable OWASP Core Rule Set.", - "id": "use-modsecurity-crs", - "label": "Use Core Rule Set", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-4", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Use Core Rule Set", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "method": "default", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable OWASP Core Rule Set." - } - ] - }, - "MODSECURITY_CRS_VERSION": { - "context": "multisite", - "default": "3", - "help": "Version of the OWASP Core Rule Set to use with ModSecurity (3, 4 or nightly).", - "id": "modsecurity-crs-version", - "label": "Core Rule Set Version", - "regex": "^(3|4|nightly)$", - "type": "select", - "containerClass": "z-3", - "pattern": "^(3|4|nightly)$", - "inpType": "select", - "name": "Core Rule Set Version", - "values": ["3", "4", "nightly"], - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "4", - "method": "default", - "prev_value": "4", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Version of the OWASP Core Rule Set to use with ModSecurity (3, 4 or nightly)." - } - ] - }, - "MODSECURITY_SEC_AUDIT_ENGINE": { - "context": "multisite", - "default": "RelevantOnly", - "help": "SecAuditEngine directive of ModSecurity.", - "id": "modsecurity-sec-audit-engine", - "label": "SecAuditEngine", - "regex": "^(On|RelevantOnly|Off)$", - "type": "select", - "containerClass": "z-2", - "pattern": "^(On|RelevantOnly|Off)$", - "inpType": "select", - "name": "SecAuditEngine", - "values": ["Off", "On", "RelevantOnly"], - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "RelevantOnly", - "method": "default", - "prev_value": "RelevantOnly", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "SecAuditEngine directive of ModSecurity." - } - ] - }, - "MODSECURITY_SEC_RULE_ENGINE": { - "context": "multisite", - "default": "On", - "help": "SecRuleEngine directive of ModSecurity.", - "id": "modsecurity-sec-rule-engine", - "label": "SecRuleEngine", - "regex": "^(On|DetectionOnly|Off)$", - "type": "select", - "containerClass": "z-1", - "pattern": "^(On|DetectionOnly|Off)$", - "inpType": "select", - "name": "SecRuleEngine", - "values": ["DetectionOnly", "Off", "On"], - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "On", - "method": "default", - "prev_value": "On", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "SecRuleEngine directive of ModSecurity." - } - ] - }, - "MODSECURITY_SEC_AUDIT_LOG_PARTS": { - "context": "multisite", - "default": "ABCFHZ", - "help": "SecAuditLogParts directive of ModSecurity.", - "id": "modsecurity-sec-audit-log-parts", - "label": "SecAuditLogParts", - "regex": "^A(([B-K])(?!.*\\2))+Z$", - "type": "text", - "containerClass": "z-0", - "pattern": "^A(([B-K])(?!.*\\2))+Z$", - "inpType": "input", - "name": "SecAuditLogParts", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "ABCFHZ", - "method": "default", - "prev_value": "ABCFHZ", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "SecAuditLogParts directive of ModSecurity." - } - ] - } - }, - "checksum": null - }, - { - "id": "php", - "stream": "no", - "name": "PHP", - "description": "Manage local or remote PHP-FPM.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "REMOTE_PHP": { - "context": "multisite", - "default": "", - "help": "Hostname of the remote PHP-FPM instance.", - "id": "remote-php", - "label": "Remote PHP", - "regex": "^((?=.{1,255}$)[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?(?:\\.[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?)*\\.?)?$", - "type": "text", - "containerClass": "z-3", - "pattern": "^((?=.{1,255}$)[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?(?:\\.[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?)*\\.?)?$", - "inpType": "input", - "name": "Remote PHP", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Hostname of the remote PHP-FPM instance." - } - ] - }, - "REMOTE_PHP_PATH": { - "context": "multisite", - "default": "", - "help": "Root folder containing files in the remote PHP-FPM instance.", - "id": "remote-php-path", - "label": "Remote PHP path", - "regex": "^(/[\\w. \\-]+)*/?$", - "type": "text", - "containerClass": "z-2", - "pattern": "^(/[\\w. \\-]+)*/?$", - "inpType": "input", - "name": "Remote PHP path", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Root folder containing files in the remote PHP-FPM instance." - } - ] - }, - "LOCAL_PHP": { - "context": "multisite", - "default": "", - "help": "Path to the PHP-FPM socket file.", - "id": "local", - "label": "Local PHP", - "regex": "^(/[\\w. \\-]+)*/?$", - "type": "text", - "containerClass": "z-1", - "pattern": "^(/[\\w. \\-]+)*/?$", - "inpType": "input", - "name": "Local PHP", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Path to the PHP-FPM socket file." - } - ] - }, - "LOCAL_PHP_PATH": { - "context": "multisite", - "default": "", - "help": "Root folder containing files in the local PHP-FPM instance.", - "id": "local-php-path", - "label": "Local PHP path", - "regex": "^(/[\\w. \\-]+)*/?$", - "type": "text", - "containerClass": "z-0", - "pattern": "^(/[\\w. \\-]+)*/?$", - "inpType": "input", - "name": "Local PHP path", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Root folder containing files in the local PHP-FPM instance." - } - ] - } - }, - "checksum": null - }, - { - "id": "pro", - "stream": "no", - "name": "Pro", - "description": "Pro settings for the Pro version of BunkerWeb.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "PRO_LICENSE_KEY": { - "context": "global", - "default": "", - "help": "The License Key for the Pro version of BunkerWeb.", - "id": "pro-license-key", - "label": "Pro License Key", - "regex": "^.*$", - "type": "password", - "containerClass": "z-0", - "pattern": "^.*$", - "inpType": "input", - "name": "Pro License Key", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "The License Key for the Pro version of BunkerWeb." - } - ] - } - }, - "checksum": null - }, - { - "id": "realip", - "stream": "partial", - "name": "Real IP", - "description": "Get real IP of clients when BunkerWeb is behind a reverse proxy / load balancer.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "USE_REAL_IP": { - "context": "multisite", - "default": "no", - "help": "Retrieve the real IP of client.", - "id": "use-real-ip", - "label": "Use real ip", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-5", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Use real ip", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "method": "default", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Retrieve the real IP of client." - } - ] - }, - "USE_PROXY_PROTOCOL": { - "context": "multisite", - "default": "no", - "help": "Enable PROXY protocol communication.", - "id": "use-proxy-protocol", - "label": "Use PROXY protocol", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-4", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Use PROXY protocol", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "method": "default", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable PROXY protocol communication." - } - ] - }, - "REAL_IP_FROM": { - "context": "multisite", - "default": "192.168.0.0/16 172.16.0.0/12 10.0.0.0/8", - "help": "List of trusted IPs / networks, separated with spaces, where proxied requests come from.", - "id": "real-ip-from", - "label": "Real IP from", - "regex": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "type": "text", - "containerClass": "z-3", - "pattern": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "inpType": "input", - "name": "Real IP from", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "192.168.0.0/16 172.16.0.0/12 10.0.0.0/8", - "method": "default", - "prev_value": "192.168.0.0/16 172.16.0.0/12 10.0.0.0/8", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of trusted IPs / networks, separated with spaces, where proxied requests come from." - } - ] - }, - "REAL_IP_HEADER": { - "context": "multisite", - "default": "X-Forwarded-For", - "help": "HTTP header containing the real IP or special value proxy_protocol for PROXY protocol.", - "id": "real-ip-header", - "label": "Real IP header", - "regex": "^(?! )(( ?(?!proxy_protocol)[\\w\\-]+)*|proxy_protocol)$", - "type": "text", - "containerClass": "z-2", - "pattern": "^(?! )(( ?(?!proxy_protocol)[\\w\\-]+)*|proxy_protocol)$", - "inpType": "input", - "name": "Real IP header", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "X-Forwarded-For", - "method": "default", - "prev_value": "X-Forwarded-For", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "HTTP header containing the real IP or special value proxy_protocol for PROXY protocol." - } - ] - }, - "REAL_IP_RECURSIVE": { - "context": "multisite", - "default": "yes", - "help": "Perform a recursive search in the header container IP address.", - "id": "real-ip-recursive", - "label": "Real IP recursive", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-1", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Real IP recursive", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "method": "default", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Perform a recursive search in the header container IP address." - } - ] - }, - "REAL_IP_FROM_URLS": { - "context": "global", - "default": "", - "help": "List of URLs containing trusted IPs / networks, separated with spaces, where proxied requests come from.", - "id": "real-ip-from-urls", - "label": "Real IP from URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - "containerClass": "z-0", - "pattern": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "inpType": "input", - "name": "Real IP from URLs", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "List of URLs containing trusted IPs / networks, separated with spaces, where proxied requests come from." - } - ] - } - }, - "checksum": null - }, - { - "id": "redirect", - "stream": "no", - "name": "Redirect", - "description": "Manage HTTP redirects.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "REDIRECT_TO": { - "context": "multisite", - "default": "", - "help": "Redirect a whole site to another one.", - "id": "redirect-to", - "label": "Redirect to", - "regex": "^(https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)?$", - "type": "text", - "containerClass": "z-2", - "pattern": "^(https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)?$", - "inpType": "input", - "name": "Redirect to", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Redirect a whole site to another one." - } - ] - }, - "REDIRECT_TO_REQUEST_URI": { - "context": "multisite", - "default": "no", - "help": "Append the requested URI to the redirect address.", - "id": "redirect-to-request-uri", - "label": "Append request URI", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-1", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Append request URI", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "method": "default", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Append the requested URI to the redirect address." - } - ] - }, - "REDIRECT_TO_STATUS_CODE": { - "context": "multisite", - "default": "301", - "help": "Status code to send to client when redirecting.", - "id": "redirect-to-status-code", - "label": "Append request URI", - "regex": "^(301|302)$", - "type": "select", - "containerClass": "z-0", - "pattern": "^(301|302)$", - "inpType": "select", - "name": "Append request URI", - "values": ["301", "302"], - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "301", - "method": "default", - "prev_value": "301", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Status code to send to client when redirecting." - } - ] - } - }, - "checksum": null - }, - { - "id": "redis", - "stream": "yes", - "name": "Redis", - "description": "Redis server configuration when using BunkerWeb in cluster mode.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": true, - "settings": { - "USE_REDIS": { - "context": "global", - "default": "no", - "help": "Activate Redis.", - "id": "use-redis", - "label": "Activate Redis", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-14", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Activate Redis", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "method": "default", - "prev_value": "no", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Activate Redis." - } - ] - }, - "REDIS_HOST": { - "context": "global", - "default": "", - "help": "Redis server IP or hostname.", - "id": "redis-host", - "label": "Redis server", - "regex": "^((?!-)[a-zA-Z0-9\\-]{1,63}(.[a-zA-Z]{2,})+|(\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3}|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)))?$", - "type": "text", - "containerClass": "z-13", - "pattern": "^((?!-)[a-zA-Z0-9\\-]{1,63}(.[a-zA-Z]{2,})+|(\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3}|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)))?$", - "inpType": "input", - "name": "Redis server", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Redis server IP or hostname." - } - ] - }, - "REDIS_PORT": { - "context": "global", - "default": "6379", - "help": "Redis server port.", - "id": "redis-port", - "label": "Redis port", - "regex": "^[0-9]+$", - "type": "text", - "containerClass": "z-12", - "pattern": "^[0-9]+$", - "inpType": "input", - "name": "Redis port", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "6379", - "method": "default", - "prev_value": "6379", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Redis server port." - } - ] - }, - "REDIS_DATABASE": { - "context": "global", - "default": "0", - "help": "Redis database number.", - "id": "redis-database", - "label": "Redis database", - "regex": "^[0-9]+$", - "type": "text", - "containerClass": "z-11", - "pattern": "^[0-9]+$", - "inpType": "input", - "name": "Redis database", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "0", - "method": "default", - "prev_value": "0", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Redis database number." - } - ] - }, - "REDIS_SSL": { - "context": "global", - "default": "no", - "help": "Use SSL/TLS connection with Redis server.", - "id": "redis-ssl", - "label": "Redis SSL/TLS", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-10", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Redis SSL/TLS", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "method": "default", - "prev_value": "no", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Use SSL/TLS connection with Redis server." - } - ] - }, - "REDIS_SSL_VERIFY": { - "context": "global", - "default": "no", - "help": "Verify the certificate of Redis server.", - "id": "redis-ssl-verify", - "label": "Redis SSL/TLS verify", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-9", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Redis SSL/TLS verify", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "method": "default", - "prev_value": "no", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Verify the certificate of Redis server." - } - ] - }, - "REDIS_TIMEOUT": { - "context": "global", - "default": "1000", - "help": "Redis server timeout (in ms) for connect, read and write.", - "id": "redis-timeout", - "label": "Redis timeout (ms)", - "regex": "^[0-9]+$", - "type": "text", - "containerClass": "z-8", - "pattern": "^[0-9]+$", - "inpType": "input", - "name": "Redis timeout (ms)", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "1000", - "method": "default", - "prev_value": "1000", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Redis server timeout (in ms) for connect, read and write." - } - ] - }, - "REDIS_USERNAME": { - "context": "global", - "default": "", - "help": "Redis username used in AUTH command.", - "id": "redis-username", - "label": "Redis username", - "regex": "^.*$", - "type": "text", - "containerClass": "z-7", - "pattern": "^.*$", - "inpType": "input", - "name": "Redis username", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Redis username used in AUTH command." - } - ] - }, - "REDIS_PASSWORD": { - "context": "global", - "default": "", - "help": "Redis password used in AUTH command.", - "id": "redis-password", - "label": "Redis password", - "regex": "^.*$", - "type": "password", - "containerClass": "z-6", - "pattern": "^.*$", - "inpType": "input", - "name": "Redis password", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Redis password used in AUTH command." - } - ] - }, - "REDIS_SENTINEL_HOSTS": { - "context": "global", - "default": "", - "help": "Redis sentinel hosts with format host:[port] separated with spaces.", - "id": "redis-sentinel-hosts", - "label": "Redis sentinel hosts", - "regex": "^.*$", - "type": "text", - "containerClass": "z-5", - "pattern": "^.*$", - "inpType": "input", - "name": "Redis sentinel hosts", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Redis sentinel hosts with format host:[port] separated with spaces." - } - ] - }, - "REDIS_SENTINEL_USERNAME": { - "context": "global", - "default": "", - "help": "Redis sentinel username.", - "id": "redis-sentinel-username", - "label": "Redis sentinel username", - "regex": "^.*$", - "type": "text", - "containerClass": "z-4", - "pattern": "^.*$", - "inpType": "input", - "name": "Redis sentinel username", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Redis sentinel username." - } - ] - }, - "REDIS_SENTINEL_PASSWORD": { - "context": "global", - "default": "", - "help": "Redis sentinel password.", - "id": "redis-sentinel-password", - "label": "Redis sentinel password", - "regex": "^.*$", - "type": "password", - "containerClass": "z-3", - "pattern": "^.*$", - "inpType": "input", - "name": "Redis sentinel password", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Redis sentinel password." - } - ] - }, - "REDIS_SENTINEL_MASTER": { - "context": "global", - "default": "", - "help": "Redis sentinel master name.", - "id": "redis-sentinel-master", - "label": "Redis sentinel master", - "regex": "^.*$", - "type": "text", - "containerClass": "z-2", - "pattern": "^.*$", - "inpType": "input", - "name": "Redis sentinel master", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Redis sentinel master name." - } - ] - }, - "REDIS_KEEPALIVE_IDLE": { - "context": "global", - "default": "30000", - "help": "Max idle time (in ms) before closing redis connection in the pool.", - "id": "redis-keepalive-idle", - "label": "Redis keepalive idle (ms)", - "regex": "^[0-9]+$", - "type": "text", - "containerClass": "z-1", - "pattern": "^[0-9]+$", - "inpType": "input", - "name": "Redis keepalive idle (ms)", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "30000", - "method": "default", - "prev_value": "30000", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Max idle time (in ms) before closing redis connection in the pool." - } - ] - }, - "REDIS_KEEPALIVE_POOL": { - "context": "global", - "default": "10", - "help": "Max number of redis connection(s) kept in the pool.", - "id": "redis-keepalive-pool", - "label": "Redis keepalive pool", - "regex": "^[0-9]+$", - "type": "text", - "containerClass": "z-0", - "pattern": "^[0-9]+$", - "inpType": "input", - "name": "Redis keepalive pool", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "10", - "method": "default", - "prev_value": "10", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Max number of redis connection(s) kept in the pool." - } - ] - } - }, - "checksum": null - }, - { - "id": "reverseproxy", - "stream": "partial", - "name": "Reverse proxy", - "description": "Manage reverse proxy configurations.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "USE_REVERSE_PROXY": { - "context": "multisite", - "default": "no", - "help": "Activate reverse proxy mode.", - "id": "use-reverse-proxy", - "label": "Use reverse proxy", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-26", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Use reverse proxy", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "method": "default", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Activate reverse proxy mode." - } - ] - }, - "REVERSE_PROXY_INTERCEPT_ERRORS": { - "context": "multisite", - "default": "yes", - "help": "Intercept and rewrite errors.", - "id": "reverse-proxy-intercept-errors", - "label": "Intercept errors", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-25", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Intercept errors", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "method": "default", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Intercept and rewrite errors." - } - ] - }, - "REVERSE_PROXY_CUSTOM_HOST": { - "context": "multisite", - "default": "", - "help": "Override Host header sent to upstream server.", - "id": "reverse-proxy-custom-host", - "label": "Reverse proxy custom host", - "regex": "^.*$", - "type": "text", - "containerClass": "z-24", - "pattern": "^.*$", - "inpType": "input", - "name": "Reverse proxy custom host", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Override Host header sent to upstream server." - } - ] - }, - "USE_PROXY_CACHE": { - "context": "multisite", - "default": "no", - "help": "Enable or disable caching of the proxied resources.", - "id": "use-proxy-cache", - "label": "Reverse proxy cache", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-9", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Reverse proxy cache", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "method": "default", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable or disable caching of the proxied resources." - } - ] - }, - "PROXY_CACHE_PATH_LEVELS": { - "context": "global", - "default": "1:2", - "help": "Hierarchy levels of the cache.", - "id": "proxy-cache-path-levels", - "label": "Hierarchy levels", - "regex": "^(:?[12]){1,3}$", - "type": "text", - "containerClass": "z-8", - "pattern": "^(:?[12]){1,3}$", - "inpType": "input", - "name": "Hierarchy levels", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "1:2", - "method": "default", - "prev_value": "1:2", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Hierarchy levels of the cache." - } - ] - }, - "PROXY_CACHE_PATH_ZONE_SIZE": { - "context": "global", - "default": "10m", - "help": "Maximum size of cached metadata when caching proxied resources.", - "id": "proxy-cache-path-zone-size", - "label": "Reverse proxy cache zone size", - "regex": "^\\d+[kKmMgG]?$", - "type": "text", - "containerClass": "z-7", - "pattern": "^\\d+[kKmMgG]?$", - "inpType": "input", - "name": "Reverse proxy cache zone size", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "10m", - "method": "default", - "prev_value": "10m", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Maximum size of cached metadata when caching proxied resources." - } - ] - }, - "PROXY_CACHE_PATH_PARAMS": { - "context": "global", - "default": "max_size=100m", - "help": "Additional parameters to add to the proxy_cache directive.", - "id": "proxy-cache-path-params", - "label": "Reverse proxy cache params", - "regex": "^.*$", - "type": "text", - "containerClass": "z-6", - "pattern": "^.*$", - "inpType": "input", - "name": "Reverse proxy cache params", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "max_size=100m", - "method": "default", - "prev_value": "max_size=100m", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Additional parameters to add to the proxy_cache directive." - } - ] - }, - "PROXY_CACHE_METHODS": { - "context": "multisite", - "default": "GET HEAD", - "help": "HTTP methods that should trigger a cache operation.", - "id": "proxy-cache-methods", - "label": "Reverse proxy cache methods", - "regex": "^(?! )( ?(GET|HEAD|POST|PUT|DELETE|CONNECT|OPTIONS|TRACE|PATCH)(?!.*\\2))+$", - "type": "text", - "containerClass": "z-5", - "pattern": "^(?! )( ?(GET|HEAD|POST|PUT|DELETE|CONNECT|OPTIONS|TRACE|PATCH)(?!.*\\2))+$", - "inpType": "input", - "name": "Reverse proxy cache methods", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "GET HEAD", - "method": "default", - "prev_value": "GET HEAD", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "HTTP methods that should trigger a cache operation." - } - ] - }, - "PROXY_CACHE_MIN_USES": { - "context": "multisite", - "default": "2", - "help": "The minimum number of requests before a response is cached.", - "id": "proxy-cache-min-uses", - "label": "Reverse proxy cache minimum uses", - "regex": "^[1-9]\\d*$", - "type": "text", - "containerClass": "z-4", - "pattern": "^[1-9]\\d*$", - "inpType": "input", - "name": "Reverse proxy cache minimum uses", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "2", - "method": "default", - "prev_value": "2", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "The minimum number of requests before a response is cached." - } - ] - }, - "PROXY_CACHE_KEY": { - "context": "multisite", - "default": "$scheme$host$request_uri", - "help": "The key used to uniquely identify a cached response.", - "id": "proxy-cache-key", - "label": "Reverse proxy cache key", - "regex": "^(?! )( ?(\\$[a-z_]+)(?!.*\\2))+$", - "type": "text", - "containerClass": "z-3", - "pattern": "^(?! )( ?(\\$[a-z_]+)(?!.*\\2))+$", - "inpType": "input", - "name": "Reverse proxy cache key", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "$scheme$host$request_uri", - "method": "default", - "prev_value": "$scheme$host$request_uri", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "The key used to uniquely identify a cached response." - } - ] - }, - "PROXY_CACHE_VALID": { - "context": "multisite", - "default": "200=24h 301=1h 302=24h", - "help": "Define the caching time depending on the HTTP status code (list of status=time), separated with spaces.", - "id": "proxy-cache-valid", - "label": "Reverse proxy cache valid", - "regex": "^(?! )( ?([1-5]\\d{2})(?!.*\\2=)=\\d+(ms?|[shdwMy]))*$", - "type": "text", - "containerClass": "z-2", - "pattern": "^(?! )( ?([1-5]\\d{2})(?!.*\\2=)=\\d+(ms?|[shdwMy]))*$", - "inpType": "input", - "name": "Reverse proxy cache valid", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "200=24h 301=1h 302=24h", - "method": "default", - "prev_value": "200=24h 301=1h 302=24h", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Define the caching time depending on the HTTP status code (list of status=time), separated with spaces." - } - ] - }, - "PROXY_NO_CACHE": { - "context": "multisite", - "default": "$http_pragma $http_authorization", - "help": "Conditions to disable caching of responses.", - "id": "proxy-no-cache", - "label": "Reverse proxy no cache", - "regex": "^.*$", - "type": "text", - "containerClass": "z-1", - "pattern": "^.*$", - "inpType": "input", - "name": "Reverse proxy no cache", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "$http_pragma $http_authorization", - "method": "default", - "prev_value": "$http_pragma $http_authorization", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Conditions to disable caching of responses." - } - ] - }, - "PROXY_CACHE_BYPASS": { - "context": "multisite", - "default": "0", - "help": "Conditions to bypass caching of responses.", - "id": "proxy-cache-bypass", - "label": "Reverse proxy bypass", - "regex": "^.*$", - "type": "text", - "containerClass": "z-0", - "pattern": "^.*$", - "inpType": "input", - "name": "Reverse proxy bypass", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "0", - "method": "default", - "prev_value": "0", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Conditions to bypass caching of responses." - } - ] - } - }, - "checksum": null, - "multiples_schema": { - "reverse-proxy": { - "REVERSE_PROXY_HOST": { - "context": "multisite", - "default": "", - "help": "Full URL of the proxied resource (proxy_pass).", - "id": "reverse-proxy-host", - "label": "Reverse proxy host", - "regex": "^.*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^.*$", - "inpType": "input", - "name": "Reverse proxy host", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Full URL of the proxied resource (proxy_pass)." - } - ], - "containerClass": "z-26" - }, - "REVERSE_PROXY_URL": { - "context": "multisite", - "default": "/", - "help": "Location URL that will be proxied.", - "id": "reverse-proxy-url", - "label": "Reverse proxy url", - "regex": "^.*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^.*$", - "inpType": "input", - "name": "Reverse proxy url", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "/", - "prev_value": "/", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Location URL that will be proxied." - } - ], - "containerClass": "z-25" - }, - "REVERSE_PROXY_WS": { - "context": "multisite", - "default": "no", - "help": "Enable websocket on the proxied resource.", - "id": "reverse-proxy-ws", - "label": "Reverse proxy WS", - "regex": "^(yes|no)$", - "type": "check", - "multiple": "reverse-proxy", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Reverse proxy WS", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable websocket on the proxied resource." - } - ], - "containerClass": "z-24" - }, - "REVERSE_PROXY_HEADERS": { - "context": "multisite", - "default": "", - "help": "List of HTTP headers to send to proxied resource separated with semicolons (values for proxy_set_header directive).", - "id": "reverse-proxy-headers", - "label": "Reverse proxy headers", - "regex": "^(?![; ])(;? ?([\\w\\-]+)(?!.*\\2 ) [^;]+)*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(?![; ])(;? ?([\\w\\-]+)(?!.*\\2 ) [^;]+)*$", - "inpType": "input", - "name": "Reverse proxy headers", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of HTTP headers to send to proxied resource separated with semicolons (values for proxy_set_header directive)." - } - ], - "containerClass": "z-23" - }, - "REVERSE_PROXY_HEADERS_CLIENT": { - "context": "multisite", - "default": "", - "help": "List of HTTP headers to send to client separated with semicolons (values for add_header directive).", - "id": "reverse-proxy-headers-client", - "label": "Reverse proxy headers-client", - "regex": "^(?![; ])(;? ?([\\w\\-]+)(?!.*\\2 ) [^;]+)*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(?![; ])(;? ?([\\w\\-]+)(?!.*\\2 ) [^;]+)*$", - "inpType": "input", - "name": "Reverse proxy headers-client", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of HTTP headers to send to client separated with semicolons (values for add_header directive)." - } - ], - "containerClass": "z-22" - }, - "REVERSE_PROXY_BUFFERING": { - "context": "multisite", - "default": "yes", - "help": "Enable or disable buffering of responses from proxied resource.", - "id": "reverse-proxy-buffering", - "label": "Reverse proxy buffering", - "regex": "^(yes|no)$", - "type": "check", - "multiple": "reverse-proxy", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Reverse proxy buffering", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable or disable buffering of responses from proxied resource." - } - ], - "containerClass": "z-21" - }, - "REVERSE_PROXY_KEEPALIVE": { - "context": "multisite", - "default": "no", - "help": "Enable or disable keepalive connections with the proxied resource.", - "id": "reverse-proxy-keepalive", - "label": "Reverse proxy keepalive", - "regex": "^(yes|no)$", - "type": "check", - "multiple": "reverse-proxy", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Reverse proxy keepalive", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable or disable keepalive connections with the proxied resource." - } - ], - "containerClass": "z-20" - }, - "REVERSE_PROXY_AUTH_REQUEST": { - "context": "multisite", - "default": "", - "help": "Enable authentication using an external provider (value of auth_request directive).", - "id": "reverse-proxy-auth-request", - "label": "Reverse proxy auth request", - "regex": "^(\\/[\\w\\].~:\\/?#\\[@!$\\&'\\(\\)*+,;=\\-]*|off)?$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(\\/[\\w\\].~:\\/?#\\[@!$\\&'\\(\\)*+,;=\\-]*|off)?$", - "inpType": "input", - "name": "Reverse proxy auth request", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable authentication using an external provider (value of auth_request directive)." - } - ], - "containerClass": "z-19" - }, - "REVERSE_PROXY_AUTH_REQUEST_SIGNIN_URL": { - "context": "multisite", - "default": "", - "help": "Redirect clients to sign-in URL when using REVERSE_PROXY_AUTH_REQUEST (used when auth_request call returned 401).", - "id": "reverse-proxy-auth-request-signin-url", - "label": "Auth request signin URL", - "regex": "^(https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)?$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)?$", - "inpType": "input", - "name": "Auth request signin URL", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Redirect clients to sign-in URL when using REVERSE_PROXY_AUTH_REQUEST (used when auth_request call returned 401)." - } - ], - "containerClass": "z-18" - }, - "REVERSE_PROXY_AUTH_REQUEST_SET": { - "context": "multisite", - "default": "", - "help": "List of variables to set from the authentication provider, separated with semicolons (values of auth_request_set directives).", - "id": "reverse-proxy-auth-request-set", - "label": "Reverse proxy auth request set", - "regex": "^(?! ;)(;? ?(\\$[a-z_\\-]+)(?!.*\\2 ) [^;]+)*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(?! ;)(;? ?(\\$[a-z_\\-]+)(?!.*\\2 ) [^;]+)*$", - "inpType": "input", - "name": "Reverse proxy auth request set", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of variables to set from the authentication provider, separated with semicolons (values of auth_request_set directives)." - } - ], - "containerClass": "z-17" - }, - "REVERSE_PROXY_CONNECT_TIMEOUT": { - "context": "multisite", - "default": "60s", - "help": "Timeout when connecting to the proxied resource.", - "id": "reverse-proxy-connect-timeout", - "label": "Reverse proxy connect timeout", - "regex": "^\\d+(ms?|[shdwMy])$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^\\d+(ms?|[shdwMy])$", - "inpType": "input", - "name": "Reverse proxy connect timeout", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "60s", - "prev_value": "60s", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Timeout when connecting to the proxied resource." - } - ], - "containerClass": "z-16" - }, - "REVERSE_PROXY_READ_TIMEOUT": { - "context": "multisite", - "default": "60s", - "help": "Timeout when reading from the proxied resource.", - "id": "reverse-proxy-read-timeout", - "label": "Reverse proxy read timeout", - "regex": "^\\d+(ms?|[shdwMy])$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^\\d+(ms?|[shdwMy])$", - "inpType": "input", - "name": "Reverse proxy read timeout", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "60s", - "prev_value": "60s", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Timeout when reading from the proxied resource." - } - ], - "containerClass": "z-15" - }, - "REVERSE_PROXY_SEND_TIMEOUT": { - "context": "multisite", - "default": "60s", - "help": "Timeout when sending to the proxied resource.", - "id": "reverse-proxy-send-timeout", - "label": "Reverse proxy send timeout", - "regex": "^\\d+(ms?|[shdwMy])$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^\\d+(ms?|[shdwMy])$", - "inpType": "input", - "name": "Reverse proxy send timeout", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "60s", - "prev_value": "60s", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Timeout when sending to the proxied resource." - } - ], - "containerClass": "z-14" - }, - "REVERSE_PROXY_INCLUDES": { - "context": "multisite", - "default": "", - "help": "Additional configuration to include in the location block, separated with spaces.", - "id": "reverse-proxy-includes", - "label": "Reverse proxy includes", - "regex": "^(?! )( ?(\\w+)(?!.*\\b\\2\\b))*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(?! )( ?(\\w+)(?!.*\\b\\2\\b))*$", - "inpType": "input", - "name": "Reverse proxy includes", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Additional configuration to include in the location block, separated with spaces." - } - ], - "containerClass": "z-13" - } - } - }, - "multiples": { - "reverse-proxy": { - "0": { - "REVERSE_PROXY_HOST": { - "context": "multisite", - "default": "", - "help": "Full URL of the proxied resource (proxy_pass).", - "id": "reverse-proxy-host", - "label": "Reverse proxy host", - "regex": "^.*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^.*$", - "inpType": "input", - "name": "Reverse proxy host", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "dzq", - "prev_value": "dzq", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Full URL of the proxied resource (proxy_pass)." - } - ], - "containerClass": "z-26", - "method": "ui" - }, - "REVERSE_PROXY_URL": { - "context": "multisite", - "default": "/", - "help": "Location URL that will be proxied.", - "id": "reverse-proxy-url", - "label": "Reverse proxy url", - "regex": "^.*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^.*$", - "inpType": "input", - "name": "Reverse proxy url", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "/", - "prev_value": "/", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Location URL that will be proxied." - } - ], - "containerClass": "z-25", - "method": "default" - }, - "REVERSE_PROXY_WS": { - "context": "multisite", - "default": "no", - "help": "Enable websocket on the proxied resource.", - "id": "reverse-proxy-ws", - "label": "Reverse proxy WS", - "regex": "^(yes|no)$", - "type": "check", - "multiple": "reverse-proxy", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Reverse proxy WS", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable websocket on the proxied resource." - } - ], - "containerClass": "z-24", - "method": "default" - }, - "REVERSE_PROXY_HEADERS": { - "context": "multisite", - "default": "", - "help": "List of HTTP headers to send to proxied resource separated with semicolons (values for proxy_set_header directive).", - "id": "reverse-proxy-headers", - "label": "Reverse proxy headers", - "regex": "^(?![; ])(;? ?([\\w\\-]+)(?!.*\\2 ) [^;]+)*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(?![; ])(;? ?([\\w\\-]+)(?!.*\\2 ) [^;]+)*$", - "inpType": "input", - "name": "Reverse proxy headers", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of HTTP headers to send to proxied resource separated with semicolons (values for proxy_set_header directive)." - } - ], - "containerClass": "z-23", - "method": "default" - }, - "REVERSE_PROXY_HEADERS_CLIENT": { - "context": "multisite", - "default": "", - "help": "List of HTTP headers to send to client separated with semicolons (values for add_header directive).", - "id": "reverse-proxy-headers-client", - "label": "Reverse proxy headers-client", - "regex": "^(?![; ])(;? ?([\\w\\-]+)(?!.*\\2 ) [^;]+)*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(?![; ])(;? ?([\\w\\-]+)(?!.*\\2 ) [^;]+)*$", - "inpType": "input", - "name": "Reverse proxy headers-client", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of HTTP headers to send to client separated with semicolons (values for add_header directive)." - } - ], - "containerClass": "z-22", - "method": "default" - }, - "REVERSE_PROXY_BUFFERING": { - "context": "multisite", - "default": "yes", - "help": "Enable or disable buffering of responses from proxied resource.", - "id": "reverse-proxy-buffering", - "label": "Reverse proxy buffering", - "regex": "^(yes|no)$", - "type": "check", - "multiple": "reverse-proxy", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Reverse proxy buffering", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable or disable buffering of responses from proxied resource." - } - ], - "containerClass": "z-21", - "method": "default" - }, - "REVERSE_PROXY_KEEPALIVE": { - "context": "multisite", - "default": "no", - "help": "Enable or disable keepalive connections with the proxied resource.", - "id": "reverse-proxy-keepalive", - "label": "Reverse proxy keepalive", - "regex": "^(yes|no)$", - "type": "check", - "multiple": "reverse-proxy", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Reverse proxy keepalive", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable or disable keepalive connections with the proxied resource." - } - ], - "containerClass": "z-20", - "method": "default" - }, - "REVERSE_PROXY_AUTH_REQUEST": { - "context": "multisite", - "default": "", - "help": "Enable authentication using an external provider (value of auth_request directive).", - "id": "reverse-proxy-auth-request", - "label": "Reverse proxy auth request", - "regex": "^(\\/[\\w\\].~:\\/?#\\[@!$\\&'\\(\\)*+,;=\\-]*|off)?$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(\\/[\\w\\].~:\\/?#\\[@!$\\&'\\(\\)*+,;=\\-]*|off)?$", - "inpType": "input", - "name": "Reverse proxy auth request", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable authentication using an external provider (value of auth_request directive)." - } - ], - "containerClass": "z-19", - "method": "default" - }, - "REVERSE_PROXY_AUTH_REQUEST_SIGNIN_URL": { - "context": "multisite", - "default": "", - "help": "Redirect clients to sign-in URL when using REVERSE_PROXY_AUTH_REQUEST (used when auth_request call returned 401).", - "id": "reverse-proxy-auth-request-signin-url", - "label": "Auth request signin URL", - "regex": "^(https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)?$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)?$", - "inpType": "input", - "name": "Auth request signin URL", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Redirect clients to sign-in URL when using REVERSE_PROXY_AUTH_REQUEST (used when auth_request call returned 401)." - } - ], - "containerClass": "z-18", - "method": "default" - }, - "REVERSE_PROXY_AUTH_REQUEST_SET": { - "context": "multisite", - "default": "", - "help": "List of variables to set from the authentication provider, separated with semicolons (values of auth_request_set directives).", - "id": "reverse-proxy-auth-request-set", - "label": "Reverse proxy auth request set", - "regex": "^(?! ;)(;? ?(\\$[a-z_\\-]+)(?!.*\\2 ) [^;]+)*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(?! ;)(;? ?(\\$[a-z_\\-]+)(?!.*\\2 ) [^;]+)*$", - "inpType": "input", - "name": "Reverse proxy auth request set", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of variables to set from the authentication provider, separated with semicolons (values of auth_request_set directives)." - } - ], - "containerClass": "z-17", - "method": "default" - }, - "REVERSE_PROXY_CONNECT_TIMEOUT": { - "context": "multisite", - "default": "60s", - "help": "Timeout when connecting to the proxied resource.", - "id": "reverse-proxy-connect-timeout", - "label": "Reverse proxy connect timeout", - "regex": "^\\d+(ms?|[shdwMy])$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^\\d+(ms?|[shdwMy])$", - "inpType": "input", - "name": "Reverse proxy connect timeout", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "60s", - "prev_value": "60s", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Timeout when connecting to the proxied resource." - } - ], - "containerClass": "z-16", - "method": "default" - }, - "REVERSE_PROXY_READ_TIMEOUT": { - "context": "multisite", - "default": "60s", - "help": "Timeout when reading from the proxied resource.", - "id": "reverse-proxy-read-timeout", - "label": "Reverse proxy read timeout", - "regex": "^\\d+(ms?|[shdwMy])$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^\\d+(ms?|[shdwMy])$", - "inpType": "input", - "name": "Reverse proxy read timeout", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "60s", - "prev_value": "60s", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Timeout when reading from the proxied resource." - } - ], - "containerClass": "z-15", - "method": "default" - }, - "REVERSE_PROXY_SEND_TIMEOUT": { - "context": "multisite", - "default": "60s", - "help": "Timeout when sending to the proxied resource.", - "id": "reverse-proxy-send-timeout", - "label": "Reverse proxy send timeout", - "regex": "^\\d+(ms?|[shdwMy])$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^\\d+(ms?|[shdwMy])$", - "inpType": "input", - "name": "Reverse proxy send timeout", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "60s", - "prev_value": "60s", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Timeout when sending to the proxied resource." - } - ], - "containerClass": "z-14", - "method": "default" - }, - "REVERSE_PROXY_INCLUDES": { - "context": "multisite", - "default": "", - "help": "Additional configuration to include in the location block, separated with spaces.", - "id": "reverse-proxy-includes", - "label": "Reverse proxy includes", - "regex": "^(?! )( ?(\\w+)(?!.*\\b\\2\\b))*$", - "type": "text", - "multiple": "reverse-proxy", - "pattern": "^(?! )( ?(\\w+)(?!.*\\b\\2\\b))*$", - "inpType": "input", - "name": "Reverse proxy includes", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Additional configuration to include in the location block, separated with spaces." - } - ], - "containerClass": "z-13", - "method": "default" - } - } - } - } - }, - { - "id": "reversescan", - "stream": "yes", - "name": "Reverse scan", - "description": "Scan clients ports to detect proxies or servers.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": true, - "settings": { - "USE_REVERSE_SCAN": { - "context": "multisite", - "default": "no", - "help": "Enable scanning of clients ports and deny access if one is opened.", - "id": "use-reverse-scan", - "label": "Reverse scan", - "regex": "^(no|yes)$", - "type": "check", - "containerClass": "z-2", - "pattern": "^(no|yes)$", - "inpType": "checkbox", - "name": "Reverse scan", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "method": "default", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Enable scanning of clients ports and deny access if one is opened." - } - ] - }, - "REVERSE_SCAN_PORTS": { - "context": "multisite", - "default": "22 80 443 3128 8000 8080", - "help": "List of port to scan when using reverse scan feature.", - "id": "reverse-scan-ports", - "label": "Reverse scan ports", - "regex": "^.*$", - "type": "text", - "containerClass": "z-1", - "pattern": "^.*$", - "inpType": "input", - "name": "Reverse scan ports", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "22 80 443 3128 8000 8080", - "method": "default", - "prev_value": "22 80 443 3128 8000 8080", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of port to scan when using reverse scan feature." - } - ] - }, - "REVERSE_SCAN_TIMEOUT": { - "context": "multisite", - "default": "500", - "help": "Specify the maximum timeout (in ms) when scanning a port.", - "id": "reverse-scan-timeout", - "label": "Reverse scan timeout", - "regex": "^.*$", - "type": "text", - "containerClass": "z-0", - "pattern": "^.*$", - "inpType": "input", - "name": "Reverse scan timeout", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "500", - "method": "default", - "prev_value": "500", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Specify the maximum timeout (in ms) when scanning a port." - } - ] - } - }, - "checksum": null - }, - { - "id": "selfsigned", - "stream": "yes", - "name": "Self-signed certificate", - "description": "Generate self-signed certificate.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "GENERATE_SELF_SIGNED_SSL": { - "context": "multisite", - "default": "no", - "help": "Generate and use self-signed certificate.", - "id": "generate-self-signed-ssl", - "label": "Activate self-signed certificate", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-2", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Activate self-signed certificate", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "method": "default", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Generate and use self-signed certificate." - } - ] - }, - "SELF_SIGNED_SSL_EXPIRY": { - "context": "multisite", - "default": "365", - "help": "Self-signed certificate expiry in days.", - "id": "self-signed-ssl-expiry", - "label": "Certificate expiry", - "regex": "^\\d+$", - "type": "text", - "containerClass": "z-1", - "pattern": "^\\d+$", - "inpType": "input", - "name": "Certificate expiry", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "365", - "method": "default", - "prev_value": "365", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Self-signed certificate expiry in days." - } - ] - }, - "SELF_SIGNED_SSL_SUBJ": { - "context": "multisite", - "default": "/CN=www.example.com/", - "help": "Self-signed certificate subject.", - "id": "self-signed-ssl-subj", - "label": "Certificate subject", - "regex": "^/CN=[^,]+$", - "type": "text", - "containerClass": "z-0", - "pattern": "^/CN=[^,]+$", - "inpType": "input", - "name": "Certificate subject", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "/CN=www.example.com/", - "method": "default", - "prev_value": "/CN=www.example.com/", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Self-signed certificate subject." - } - ] - } - }, - "checksum": null - }, - { - "id": "sessions", - "stream": "yes", - "name": "Sessions", - "description": "Management of session used by other plugins.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "SESSIONS_SECRET": { - "context": "global", - "default": "random", - "help": "Secret used to encrypt sessions variables for storing data related to challenges.", - "id": "session-secret", - "label": "Sessions secret", - "regex": "^\\w+$", - "type": "password", - "containerClass": "z-6", - "pattern": "^\\w+$", - "inpType": "input", - "name": "Sessions secret", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "random", - "method": "default", - "prev_value": "random", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Secret used to encrypt sessions variables for storing data related to challenges." - } - ] - }, - "SESSIONS_NAME": { - "context": "global", - "default": "random", - "help": "Name of the cookie given to clients.", - "id": "sessions-name", - "label": "Sessions name", - "regex": "^\\w+$", - "type": "text", - "containerClass": "z-5", - "pattern": "^\\w+$", - "inpType": "input", - "name": "Sessions name", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "random", - "method": "default", - "prev_value": "random", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Name of the cookie given to clients." - } - ] - }, - "SESSIONS_IDLING_TIMEOUT": { - "context": "global", - "default": "1800", - "help": "Maximum time (in seconds) of inactivity before the session is invalidated.", - "id": "sessions-idling-timeout", - "label": "Sessions idling timeout", - "regex": "^\\d+$", - "type": "text", - "containerClass": "z-4", - "pattern": "^\\d+$", - "inpType": "input", - "name": "Sessions idling timeout", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "1800", - "method": "default", - "prev_value": "1800", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Maximum time (in seconds) of inactivity before the session is invalidated." - } - ] - }, - "SESSIONS_ROLLING_TIMEOUT": { - "context": "global", - "default": "3600", - "help": "Maximum time (in seconds) before a session must be renewed.", - "id": "sessions-rolling-timeout", - "label": "Sessions rolling timeout", - "regex": "^\\d+$", - "type": "text", - "containerClass": "z-3", - "pattern": "^\\d+$", - "inpType": "input", - "name": "Sessions rolling timeout", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "3600", - "method": "default", - "prev_value": "3600", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Maximum time (in seconds) before a session must be renewed." - } - ] - }, - "SESSIONS_ABSOLUTE_TIMEOUT": { - "context": "global", - "default": "86400", - "help": "Maximum time (in seconds) before a session is destroyed.", - "id": "sessions-absolute-timeout", - "label": "Sessions absolute timeout", - "regex": "^\\d+$", - "type": "text", - "containerClass": "z-2", - "pattern": "^\\d+$", - "inpType": "input", - "name": "Sessions absolute timeout", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "86400", - "method": "default", - "prev_value": "86400", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Maximum time (in seconds) before a session is destroyed." - } - ] - }, - "SESSIONS_CHECK_IP": { - "context": "global", - "default": "yes", - "help": "Destroy session if IP address is different than original one.", - "id": "sessions-check-ip", - "label": "Sessions check IP", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-1", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Sessions check IP", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "method": "default", - "prev_value": "yes", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Destroy session if IP address is different than original one." - } - ] - }, - "SESSIONS_CHECK_USER_AGENT": { - "context": "global", - "default": "yes", - "help": "Destroy session if User-Agent is different than original one.", - "id": "sessions-user-agent", - "label": "Sessions check User-Agent", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-0", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Sessions check User-Agent", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "method": "default", - "prev_value": "yes", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Destroy session if User-Agent is different than original one." - } - ] - } - }, - "checksum": null - }, - { - "id": "ui", - "stream": "no", - "name": "UI", - "description": "Integrate easily the BunkerWeb UI.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": false, - "settings": { - "USE_UI": { - "context": "multisite", - "default": "no", - "help": "Use UI", - "id": "use-ui", - "label": "Use UI", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-1", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Use UI", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "no", - "method": "default", - "prev_value": "no", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Use UI" - } - ] - }, - "UI_HOST": { - "context": "global", - "default": "", - "help": "Address of the web UI used for initial setup", - "id": "ui-host", - "label": "UI host", - "regex": "^.*$", - "type": "text", - "containerClass": "z-0", - "pattern": "^.*$", - "inpType": "input", - "name": "UI host", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "Address of the web UI used for initial setup" - } - ] - } - }, - "checksum": null - }, - { - "id": "whitelist", - "stream": "partial", - "name": "Whitelist", - "description": "Allow access based on internal and external IP/network/rDNS/ASN whitelists.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": true, - "settings": { - "USE_WHITELIST": { - "context": "multisite", - "default": "yes", - "help": "Activate whitelist feature.", - "id": "use-whitelist", - "label": "Activate whitelisting", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-11", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Activate whitelisting", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": true, - "value": "no", - "method": "scheduler", - "prev_value": "no", - "popovers": [ - { - "iconName": "trespass", - "text": "inp_popover_method_disabled" - }, - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Activate whitelist feature." - } - ] - }, - "WHITELIST_IP": { - "context": "multisite", - "default": "20.191.45.212 40.88.21.235 40.76.173.151 40.76.163.7 20.185.79.47 52.142.26.175 20.185.79.15 52.142.24.149 40.76.162.208 40.76.163.23 40.76.162.191 40.76.162.247", - "help": "List of IP/network, separated with spaces, to put into the whitelist.", - "id": "whitelist-ip", - "label": "Whitelist IP/network", - "regex": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "type": "text", - "containerClass": "z-10", - "pattern": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "inpType": "input", - "name": "Whitelist IP/network", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "20.191.45.212 40.88.21.235 40.76.173.151 40.76.163.7 20.185.79.47 52.142.26.175 20.185.79.15 52.142.24.149 40.76.162.208 40.76.163.23 40.76.162.191 40.76.162.247", - "method": "default", - "prev_value": "20.191.45.212 40.88.21.235 40.76.173.151 40.76.163.7 20.185.79.47 52.142.26.175 20.185.79.15 52.142.24.149 40.76.162.208 40.76.163.23 40.76.162.191 40.76.162.247", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of IP/network, separated with spaces, to put into the whitelist." - } - ] - }, - "WHITELIST_RDNS": { - "context": "multisite", - "default": ".google.com .googlebot.com .yandex.ru .yandex.net .yandex.com .search.msn.com .baidu.com .baidu.jp .crawl.yahoo.net .fwd.linkedin.com .twitter.com .twttr.com .discord.com", - "help": "List of reverse DNS suffixes, separated with spaces, to whitelist.", - "id": "whitelist-rdns", - "label": "Whitelist reverse DNS", - "regex": "^( *(([^ ]+)(?!.*\\3( |$))) *)*$", - "type": "text", - "containerClass": "z-9", - "pattern": "^( *(([^ ]+)(?!.*\\3( |$))) *)*$", - "inpType": "input", - "name": "Whitelist reverse DNS", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": ".google.com .googlebot.com .yandex.ru .yandex.net .yandex.com .search.msn.com .baidu.com .baidu.jp .crawl.yahoo.net .fwd.linkedin.com .twitter.com .twttr.com .discord.com", - "method": "default", - "prev_value": ".google.com .googlebot.com .yandex.ru .yandex.net .yandex.com .search.msn.com .baidu.com .baidu.jp .crawl.yahoo.net .fwd.linkedin.com .twitter.com .twttr.com .discord.com", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of reverse DNS suffixes, separated with spaces, to whitelist." - } - ] - }, - "WHITELIST_RDNS_GLOBAL": { - "context": "multisite", - "default": "yes", - "help": "Only perform RDNS whitelist checks on global IP addresses.", - "id": "whitelist-rdns-global", - "label": "Whitelist reverse DNS global IPs", - "regex": "^(yes|no)$", - "type": "check", - "containerClass": "z-8", - "pattern": "^(yes|no)$", - "inpType": "checkbox", - "name": "Whitelist reverse DNS global IPs", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "yes", - "method": "default", - "prev_value": "yes", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "Only perform RDNS whitelist checks on global IP addresses." - } - ] - }, - "WHITELIST_ASN": { - "context": "multisite", - "default": "32934", - "help": "List of ASN numbers, separated with spaces, to whitelist.", - "id": "whitelist-asn", - "label": "Whitelist ASN", - "regex": "^^( *((ASN?)?(\\d+)\\b(?!.*[SN ]\\4\\b)) *)*$", - "type": "text", - "containerClass": "z-7", - "pattern": "^^( *((ASN?)?(\\d+)\\b(?!.*[SN ]\\4\\b)) *)*$", - "inpType": "input", - "name": "Whitelist ASN", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "32934", - "method": "default", - "prev_value": "32934", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of ASN numbers, separated with spaces, to whitelist." - } - ] - }, - "WHITELIST_USER_AGENT": { - "context": "multisite", - "default": "", - "help": "List of User-Agent (PCRE regex), separated with spaces, to whitelist.", - "id": "whitelist-user-agent", - "label": "Whitelist User-Agent", - "regex": "^.*$", - "type": "text", - "containerClass": "z-6", - "pattern": "^.*$", - "inpType": "input", - "name": "Whitelist User-Agent", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of User-Agent (PCRE regex), separated with spaces, to whitelist." - } - ] - }, - "WHITELIST_URI": { - "context": "multisite", - "default": "", - "help": "List of URI (PCRE regex), separated with spaces, to whitelist.", - "id": "whitelist-uri", - "label": "Whitelist URI", - "regex": "^( *(.*)(?!.*\\2(?!.)) *)*$", - "type": "text", - "containerClass": "z-5", - "pattern": "^( *(.*)(?!.*\\2(?!.)) *)*$", - "inpType": "input", - "name": "Whitelist URI", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "disk", - "text": "inp_popover_multisite" - }, - { - "iconName": "info", - "text": "List of URI (PCRE regex), separated with spaces, to whitelist." - } - ] - }, - "WHITELIST_IP_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing good IP/network to whitelist.", - "id": "whitelist-ip-urls", - "label": "Whitelist IP/network URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - "containerClass": "z-4", - "pattern": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "inpType": "input", - "name": "Whitelist IP/network URLs", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "List of URLs, separated with spaces, containing good IP/network to whitelist." - } - ] - }, - "WHITELIST_RDNS_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing reverse DNS suffixes to whitelist.", - "id": "whitelist-rdns-urls", - "label": "Whitelist reverse DNS URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - "containerClass": "z-3", - "pattern": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "inpType": "input", - "name": "Whitelist reverse DNS URLs", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "prev_value": "", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "List of URLs, separated with spaces, containing reverse DNS suffixes to whitelist." - } - ] - }, - "WHITELIST_ASN_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing ASN to whitelist.", - "id": "whitelist-asn-urls", - "label": "Whitelist ASN URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - "containerClass": "z-2", - "pattern": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "inpType": "input", - "name": "Whitelist ASN URLs", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "List of URLs, separated with spaces, containing ASN to whitelist." - } - ] - }, - "WHITELIST_USER_AGENT_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing good User-Agent to whitelist.", - "id": "whitelist-user-agent-urls", - "label": "Whitelist User-Agent URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - "containerClass": "z-1", - "pattern": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "inpType": "input", - "name": "Whitelist User-Agent URLs", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "List of URLs, separated with spaces, containing good User-Agent to whitelist." - } - ] - }, - "WHITELIST_URI_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing bad URI to whitelist.", - "id": "whitelist-uri-urls", - "label": "Whitelist URI URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - "containerClass": "z-0", - "pattern": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "inpType": "input", - "name": "Whitelist URI URLs", - "columns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "disabled": false, - "value": "", - "method": "default", - "prev_value": "", - "popovers": [ - { - "iconName": "globe", - "text": "inp_popover_global" - }, - { - "iconName": "info", - "text": "List of URLs, separated with spaces, containing bad URI to whitelist." - } - ] - } - }, - "checksum": null - } - ] - }, - "raw": { - "default": { - "MULTISITE": "yes", - "SERVER_NAME": "app1.example.com www.example.com", - "LOG_LEVEL": "info", - "API_WHITELIST_IP": "127.0.0.0/24 10.20.30.0/24", - "BUNKERWEB_INSTANCES": "bunkerweb", - "USE_BLACKLIST": "no", - "USE_BUNKERNET": "no", - "CORS_ALLOW_ORIGIN": "self", - "CROSS_ORIGIN_OPENER_POLICY": "same-origin", - "CROSS_ORIGIN_EMBEDDER_POLICY": "require-corp", - "CROSS_ORIGIN_RESOURCE_POLICY": "same-site", - "USE_CLIENT_CACHE": "yes", - "USE_GZIP": "yes", - "REMOVE_HEADERS": "Server Expect-CT X-Powered-By X-AspNet-Version X-AspNetMvc-Version Public-Key-Pins", - "KEEP_UPSTREAM_HEADERS": "Content-Security-Policy Permissions-Policy X-Frame-Options", - "STRICT_TRANSPORT_SECURITY": "max-age=31536000; includeSubDomains; preload", - "PERMISSIONS_POLICY": "accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), battery=(), bluetooth=(), browsing-topics=(), camera=(), compute-pressure=(), display-capture=(), document-domain=(), encrypted-media=(), execution-while-not-rendered=(), execution-while-out-of-viewport=(), fullscreen=(), gamepad=(), geolocation=(), gyroscope=(), hid=(), identity-credentials-get=(), idle-detection=(), local-fonts=(), magnetometer=(), microphone=(), midi=(), otp-credentials=(), payment=(), picture-in-picture=(), publickey-credentials-create=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), speaker-selection=(), storage-access=(), usb=(), web-share=(), window-management=(), xr-spatial-tracking=()", - "DISABLE_DEFAULT_SERVER": "yes", - "SERVE_FILES": "no", - "SEND_ANONYMOUS_REPORT": "no", - "MODSECURITY_CRS_VERSION": "4", - "REVERSE_PROXY_HOST": "dzq", - "USE_WHITELIST": "no" - } - } - } - } - } - ] - } -] diff --git a/src/ui/client/tests/globalconfig.py b/src/ui/client/tests/globalconfig.py deleted file mode 100644 index 605518d83..000000000 --- a/src/ui/client/tests/globalconfig.py +++ /dev/null @@ -1,3343 +0,0 @@ -import json -import base64 - -from builder.global_config import global_config_builder - -# Default plugins from docker-compose.ui.yml -plugins = [ - { - "id": "general", - "stream": "partial", - "name": "General", - "description": "The general settings for the server", - "version": "0.1", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "IS_LOADING": { - "context": "global", - "default": "no", - "help": "Internal use : set to yes when BW is loading.", - "id": "internal-use-loading", - "label": "internal use loading", - "regex": "^(yes|no)$", - "type": "check", - }, - "NGINX_PREFIX": { - "context": "global", - "default": "/etc/nginx/", - "help": "Where nginx will search for configurations.", - "id": "nginx-prefix", - "label": "nginx prefix", - "regex": "^(\\/[\\-\\w.\\s]+)*\\/$", - "type": "text", - }, - "HTTP_PORT": { - "context": "global", - "default": "8080", - "help": "HTTP port number which bunkerweb binds to.", - "id": "http-port", - "label": "HTTP port", - "regex": "^\\d+$", - "type": "text", - }, - "HTTPS_PORT": { - "context": "global", - "default": "8443", - "help": "HTTPS port number which bunkerweb binds to.", - "id": "https-port", - "label": "HTTPS port", - "regex": "^\\d+$", - "type": "text", - }, - "MULTISITE": { - "context": "global", - "default": "no", - "help": "Multi site activation.", - "id": "multisite", - "label": "Multisite", - "regex": "^(yes|no)$", - "type": "check", - }, - "SERVER_NAME": { - "context": "multisite", - "default": "www.example.com", - "help": "List of the virtual hosts served by bunkerweb.", - "id": "server-name", - "label": "Server name", - "regex": "^((\\S{1,255})(?!.*\\s\\2(\\s|$)))?(\\s(\\S{1,255})(?!.*\\s\\5(\\s|$)))*$", - "type": "text", - }, - "WORKER_PROCESSES": { - "context": "global", - "default": "auto", - "help": "Number of worker processes.", - "id": "worker-processes", - "label": "Worker processes", - "regex": "^(auto|\\d+)$", - "type": "text", - }, - "WORKER_RLIMIT_NOFILE": { - "context": "global", - "default": "2048", - "help": "Maximum number of open files for worker processes.", - "id": "worker-rlimit-nofile", - "label": "Open files per worker", - "regex": "^\\d+$", - "type": "text", - }, - "WORKER_CONNECTIONS": { - "context": "global", - "default": "1024", - "help": "Maximum number of connections per worker.", - "id": "worker-connections", - "label": "Connections per worker", - "regex": "^\\d+$", - "type": "text", - }, - "LOG_FORMAT": { - "context": "global", - "default": '$host $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"', - "help": "The format to use for access logs.", - "id": "log-format", - "label": "Log format", - "regex": "^.*$", - "type": "text", - }, - "LOG_LEVEL": { - "context": "global", - "default": "notice", - "help": "The level to use for error logs.", - "id": "log-level", - "label": "Log level", - "regex": "^(debug|info|notice|warn|error|crit|alert|emerg)$", - "type": "select", - "select": [ - "alert", - "crit", - "debug", - "emerg", - "error", - "info", - "notice", - "warn", - ], - }, - "DNS_RESOLVERS": { - "context": "global", - "default": "127.0.0.11", - "help": "DNS addresses of resolvers to use.", - "id": "dns-resolvers", - "label": "DNS resolvers", - "regex": "^(?! )(( *[^ ]+)(?!.*\\2))*$", - "type": "text", - }, - "DATASTORE_MEMORY_SIZE": { - "context": "global", - "default": "64m", - "help": "Size of the internal datastore.", - "id": "datastore-memory-size", - "label": "Datastore memory size", - "regex": "^\\d+[kKmMgG]?$", - "type": "text", - }, - "CACHESTORE_MEMORY_SIZE": { - "context": "global", - "default": "64m", - "help": "Size of the internal cachestore.", - "id": "cachestore-memory-size", - "label": "Cachestore memory size", - "regex": "^\\d+[kKmMgG]?$", - "type": "text", - }, - "CACHESTORE_IPC_MEMORY_SIZE": { - "context": "global", - "default": "16m", - "help": "Size of the internal cachestore (ipc).", - "id": "cachestore-ipc-memory-size", - "label": "Cachestore ipc memory size", - "regex": "^\\d+[kKmMgG]?$", - "type": "text", - }, - "CACHESTORE_MISS_MEMORY_SIZE": { - "context": "global", - "default": "16m", - "help": "Size of the internal cachestore (miss).", - "id": "cachestore-miss-memory-size", - "label": "Cachestore miss memory size", - "regex": "^\\d+[kKmMgG]?$", - "type": "text", - }, - "CACHESTORE_LOCKS_MEMORY_SIZE": { - "context": "global", - "default": "16m", - "help": "Size of the internal cachestore (locks).", - "id": "cachestore-locks-memory-size", - "label": "Cachestore locks memory size", - "regex": "^\\d+[kKmMgG]?$", - "type": "text", - }, - "USE_API": { - "context": "global", - "default": "yes", - "help": "Activate the API to control BunkerWeb.", - "id": "use-api", - "label": "Activate API", - "regex": "^(yes|no)$", - "type": "check", - }, - "API_HTTP_PORT": { - "context": "global", - "default": "5000", - "help": "Listen port number for the API.", - "id": "api-http-listen", - "label": "API port number", - "regex": "^\\d+$", - "type": "text", - }, - "API_LISTEN_IP": { - "context": "global", - "default": "0.0.0.0", - "help": "Listen IP address for the API.", - "id": "api-ip-listen", - "label": "API listen IP", - "regex": "^.*$", - "type": "text", - }, - "API_SERVER_NAME": { - "context": "global", - "default": "bwapi", - "help": "Server name (virtual host) for the API.", - "id": "api-server-name", - "label": "API server name", - "regex": "^[^ ]{1,255}$", - "type": "text", - }, - "API_WHITELIST_IP": { - "context": "global", - "default": "127.0.0.0/8", - "help": "List of IP/network allowed to contact the API.", - "id": "api-whitelist-ip", - "label": "API whitelist IP", - "regex": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "type": "text", - }, - "AUTOCONF_MODE": { - "context": "global", - "default": "no", - "help": "Enable Autoconf Docker integration.", - "id": "autoconf-mode", - "label": "Autoconf mode", - "regex": "^(yes|no)$", - "type": "check", - }, - "SWARM_MODE": { - "context": "global", - "default": "no", - "help": "Enable Docker Swarm integration.", - "id": "swarm-mode", - "label": "Swarm mode", - "regex": "^(yes|no)$", - "type": "check", - }, - "KUBERNETES_MODE": { - "context": "global", - "default": "no", - "help": "Enable Kubernetes integration.", - "id": "kubernetes-mode", - "label": "Kubernetes mode", - "regex": "^(yes|no)$", - "type": "check", - }, - "SERVER_TYPE": { - "context": "multisite", - "default": "http", - "help": "Server type : http or stream.", - "id": "server-type", - "label": "Server type", - "regex": "^(http|stream)$", - "type": "select", - "select": ["http", "stream"], - }, - "LISTEN_STREAM": { - "context": "multisite", - "default": "yes", - "help": "Enable listening for non-ssl (passthrough).", - "id": "listen-stream", - "label": "Listen stream", - "regex": "^(yes|no)$", - "type": "check", - }, - "LISTEN_STREAM_PORT": { - "context": "multisite", - "default": "1337", - "help": "Listening port for non-ssl (passthrough).", - "id": "listen-stream-port", - "label": "Listen stream port", - "regex": "^[0-9]+$", - "type": "text", - }, - "LISTEN_STREAM_PORT_SSL": { - "context": "multisite", - "default": "4242", - "help": "Listening port for ssl (passthrough).", - "id": "listen-stream-port-ssl", - "label": "Listen stream port ssl", - "regex": "^[0-9]+$", - "type": "text", - }, - "USE_UDP": { - "context": "multisite", - "default": "no", - "help": "UDP listen instead of TCP (stream).", - "id": "use-udp", - "label": "Listen UDP", - "regex": "^(yes|no)$", - "type": "check", - }, - "USE_IPV6": { - "context": "global", - "default": "no", - "help": "Enable IPv6 connectivity.", - "id": "use-ipv6", - "label": "Use IPv6", - "regex": "^(yes|no)$", - "type": "check", - }, - "IS_DRAFT": { - "context": "multisite", - "default": "no", - "help": "Internal use : set to yes when the service is in draft mode.", - "id": "internal-use-draft", - "label": "internal use draft", - "regex": "^(yes|no)$", - "type": "check", - }, - "TIMERS_LOG_LEVEL": { - "context": "global", - "default": "debug", - "help": "Log level for timers.", - "id": "timers-log-level", - "label": "Timers log level", - "regex": "^(debug|info|notice|warn|err|crit|alert|emerg)$", - "type": "select", - "select": [ - "alert", - "crit", - "debug", - "emerg", - "err", - "info", - "notice", - "warn", - ], - }, - "BUNKERWEB_INSTANCES": { - "context": "global", - "default": "127.0.0.1", - "help": "List of BunkerWeb instances separated with spaces (format : fqdn-or-ip:5000 http://fqdn-or-ip:5000)", - "id": "bunkerweb-instances", - "label": "BunkerWeb instances", - "regex": "^.*$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "antibot", - "stream": "no", - "name": "Antibot", - "description": "Bot detection by using a challenge.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": True, - "settings": { - "USE_ANTIBOT": { - "context": "multisite", - "default": "no", - "help": "Activate antibot feature.", - "id": "use-antibot", - "label": "Antibot challenge", - "regex": "^(no|cookie|javascript|captcha|recaptcha|hcaptcha|turnstile)$", - "type": "select", - "select": [ - "captcha", - "cookie", - "hcaptcha", - "javascript", - "no", - "recaptcha", - "turnstile", - ], - }, - "ANTIBOT_URI": { - "context": "multisite", - "default": "/challenge", - "help": "Unused URI that clients will be redirected to to solve the challenge.", - "id": "antibot-uri", - "label": "Antibot URL", - "regex": "^\\/[\\w\\].~:\\/?#\\[@!$\\&'\\(\\)*+,;=\\-]*$", - "type": "text", - }, - "ANTIBOT_TIME_RESOLVE": { - "context": "multisite", - "default": "60", - "help": "Maximum time (in seconds) clients have to resolve the challenge. Once this time has passed, a new challenge will be generated.", - "id": "antibot-time-resolve", - "label": "Time to resolve", - "regex": "^[0-9]+$", - "type": "text", - }, - "ANTIBOT_TIME_VALID": { - "context": "multisite", - "default": "86400", - "help": "Maximum validity time of solved challenges. Once this time has passed, clients will need to resolve a new one.", - "id": "antibot-time-valid", - "label": "Time valid", - "regex": "^[0-9]+$", - "type": "text", - }, - "ANTIBOT_RECAPTCHA_SCORE": { - "context": "multisite", - "default": "0.7", - "help": "Minimum score required for reCAPTCHA challenge.", - "id": "antibot-recaptcha-score", - "label": "reCAPTCHA score", - "regex": "^(0\\.[1-9]|1\\.0)$", - "type": "text", - }, - "ANTIBOT_RECAPTCHA_SITEKEY": { - "context": "multisite", - "default": "", - "help": "Sitekey for reCAPTCHA challenge.", - "id": "antibot-recaptcha-sitekey", - "label": "reCAPTCHA sitekey", - "regex": "^[\\w\\-]*$", - "type": "text", - }, - "ANTIBOT_RECAPTCHA_SECRET": { - "context": "multisite", - "default": "", - "help": "Secret for reCAPTCHA challenge.", - "id": "antibot-recaptcha-secret", - "label": "reCAPTCHA secret", - "regex": "^[\\w\\-]*$", - "type": "password", - }, - "ANTIBOT_HCAPTCHA_SITEKEY": { - "context": "multisite", - "default": "", - "help": "Sitekey for hCaptcha challenge.", - "id": "antibot-hcaptcha-sitekey", - "label": "hCaptcha sitekey", - "regex": "^[a-zA-Z0-9\\-]*$", - "type": "text", - }, - "ANTIBOT_HCAPTCHA_SECRET": { - "context": "multisite", - "default": "", - "help": "Secret for hCaptcha challenge.", - "id": "antibot-hcaptcha-secret", - "label": "hCaptcha secret", - "regex": "^\\w*$", - "type": "password", - }, - "ANTIBOT_TURNSTILE_SITEKEY": { - "context": "multisite", - "default": "", - "help": "Sitekey for Turnstile challenge.", - "id": "antibot-turnstile-sitekey", - "label": "Turnstile sitekey", - "regex": "^(0x[\\w\\-]+)?$", - "type": "text", - }, - "ANTIBOT_TURNSTILE_SECRET": { - "context": "multisite", - "default": "", - "help": "Secret for Turnstile challenge.", - "id": "antibot-turnstile-secret", - "label": "Turnstile secret", - "regex": "^(0x[\\w\\-]+)?$", - "type": "password", - }, - }, - "checksum": None, - }, - { - "id": "authbasic", - "stream": "no", - "name": "Auth basic", - "description": "Enforce login before accessing a resource or the whole site using HTTP basic auth method.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "USE_AUTH_BASIC": { - "context": "multisite", - "default": "no", - "help": "Use HTTP basic auth", - "id": "use-auth-basic", - "label": "Use HTTP basic auth", - "regex": "^(yes|no)$", - "type": "check", - }, - "AUTH_BASIC_LOCATION": { - "context": "multisite", - "default": "sitewide", - "help": "URL of the protected resource or sitewide value.", - "id": "auth-basic-location", - "label": "Auth basic Location", - "regex": "^(sitewide|/[a-zA-Z0-9.\\/\\-]*)$", - "type": "text", - }, - "AUTH_BASIC_USER": { - "context": "multisite", - "default": "changeme", - "help": "Username", - "id": "auth-basic-user", - "label": "Auth basic Username", - "regex": "^[\\w\\-]+", - "type": "text", - }, - "AUTH_BASIC_PASSWORD": { - "context": "multisite", - "default": "changeme", - "help": "Password", - "id": "auth-basic-password", - "label": "Password", - "regex": "^.+", - "type": "password", - }, - "AUTH_BASIC_TEXT": { - "context": "multisite", - "default": "Restricted area", - "help": "Text to display", - "id": "auth-basic-text", - "label": "Text", - "regex": "^.+", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "backup", - "stream": "yes", - "name": "Backup", - "description": "Backup your data to a custom location. Ensure the safety and availability of your important files by creating regular backups.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": True, - "settings": { - "USE_BACKUP": { - "context": "global", - "default": "yes", - "help": "Enable or disable the backup feature", - "id": "use-backup", - "label": "Activate automatic backup", - "regex": "^(yes|no)$", - "type": "check", - }, - "BACKUP_SCHEDULE": { - "context": "global", - "default": "daily", - "help": "The frequency of the backup (daily, weekly or monthly)", - "id": "backup-schedule", - "label": "Backup schedule", - "regex": "^(daily|weekly|monthly)$", - "type": "select", - "select": ["daily", "monthly", "weekly"], - }, - "BACKUP_ROTATION": { - "context": "global", - "default": "7", - "help": "The number of backups to keep", - "id": "backup-rotation", - "label": "Backup rotation", - "regex": "^[1-9][0-9]*$", - "type": "text", - }, - "BACKUP_DIRECTORY": { - "context": "global", - "default": "/var/lib/bunkerweb/backups", - "help": "The directory where the backup will be stored", - "id": "backup-directory", - "label": "Backup directory", - "regex": "^.*$", - "type": "text", - }, - }, - "checksum": None, - "bwcli": {"list": "list.py", "restore": "restore.py", "save": "save.py"}, - }, - { - "id": "badbehavior", - "stream": "yes", - "name": "Bad behavior", - "description": "Ban IP generating too much 'bad' HTTP status code in a period of time.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": True, - "settings": { - "USE_BAD_BEHAVIOR": { - "context": "multisite", - "default": "yes", - "help": "Activate Bad behavior feature.", - "id": "use-bad-behavior", - "label": "Activate bad behavior", - "regex": "^(yes|no)$", - "type": "check", - }, - "BAD_BEHAVIOR_STATUS_CODES": { - "context": "multisite", - "default": "400 401 403 404 405 429 444", - "help": "List of HTTP status codes considered as 'bad'.", - "id": "bad-behavior-status-code", - "label": "Bad status codes", - "regex": "^( *([1-5]\\d{2})(?!.*\\2) *)+$", - "type": "text", - }, - "BAD_BEHAVIOR_THRESHOLD": { - "context": "multisite", - "default": "10", - "help": "Maximum number of 'bad' HTTP status codes within the period of time before IP is banned.", - "id": "bad-behavior-threshold", - "label": "Threshold", - "regex": "^[1-9][0-9]*", - "type": "text", - }, - "BAD_BEHAVIOR_COUNT_TIME": { - "context": "multisite", - "default": "60", - "help": "Period of time (in seconds) during which we count 'bad' HTTP status codes.", - "id": "bad-behavior-period", - "label": "Period (in seconds)", - "regex": "^\\d+", - "type": "text", - }, - "BAD_BEHAVIOR_BAN_TIME": { - "context": "multisite", - "default": "86400", - "help": "The duration time (in seconds) of a ban when the corresponding IP has reached the threshold.", - "id": "bad-behavior-ban-time", - "label": "Ban duration (in seconds)", - "regex": "^\\d+", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "blacklist", - "stream": "partial", - "name": "Blacklist", - "description": "Deny access based on internal and external IP/network/rDNS/ASN blacklists.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": True, - "settings": { - "USE_BLACKLIST": { - "context": "multisite", - "default": "yes", - "help": "Activate blacklist feature.", - "id": "use-blacklist", - "label": "Activate blacklisting", - "regex": "^(yes|no)$", - "type": "check", - }, - "BLACKLIST_IP": { - "context": "multisite", - "default": "", - "help": "List of IP/network, separated with spaces, to block.", - "id": "blacklist-ip", - "label": "Blacklist IP/network", - "regex": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "type": "text", - }, - "BLACKLIST_RDNS": { - "context": "multisite", - "default": ".shodan.io .censys.io", - "help": "List of reverse DNS suffixes, separated with spaces, to block.", - "id": "blacklist-rdns", - "label": "Blacklist reverse DNS", - "regex": "^( *(([^ ]+)(?!.*\\3( |$))) *)*$", - "type": "text", - }, - "BLACKLIST_RDNS_GLOBAL": { - "context": "multisite", - "default": "yes", - "help": "Only perform RDNS blacklist checks on global IP addresses.", - "id": "blacklist-rdns-global", - "label": "Blacklist reverse DNS global IPs", - "regex": "^(yes|no)$", - "type": "check", - }, - "BLACKLIST_ASN": { - "context": "multisite", - "default": "", - "help": "List of ASN numbers, separated with spaces, to block.", - "id": "blacklist-asn", - "label": "Blacklist ASN", - "regex": "^^( *((ASN?)?(\\d+)\\b(?!.*[SN ]\\4\\b)) *)*$", - "type": "text", - }, - "BLACKLIST_USER_AGENT": { - "context": "multisite", - "default": "", - "help": "List of User-Agent (PCRE regex), separated with spaces, to block.", - "id": "blacklist-user-agent", - "label": "Blacklist User-Agent", - "regex": "^.*$", - "type": "text", - }, - "BLACKLIST_URI": { - "context": "multisite", - "default": "", - "help": "List of URI (PCRE regex), separated with spaces, to block.", - "id": "blacklist-uri", - "label": "Blacklist URI", - "regex": "^( *(.*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "BLACKLIST_IGNORE_IP": { - "context": "multisite", - "default": "", - "help": "List of IP/network, separated with spaces, to ignore in the blacklist.", - "id": "blacklist-ignore-ip", - "label": "Blacklist ignore IP/network", - "regex": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "type": "text", - }, - "BLACKLIST_IGNORE_RDNS": { - "context": "multisite", - "default": "", - "help": "List of reverse DNS suffixes, separated with spaces, to ignore in the blacklist.", - "id": "blacklist-ignore-rdns", - "label": "Blacklist ignore reverse DNS", - "regex": "^( *(([^ ]+)(?!.*\\3( |$))) *)*$", - "type": "text", - }, - "BLACKLIST_IGNORE_ASN": { - "context": "multisite", - "default": "", - "help": "List of ASN numbers, separated with spaces, to ignore in the blacklist.", - "id": "blacklist-ignore-asn", - "label": "Blacklist ignore ASN", - "regex": "^^( *((ASN?)?(\\d+)\\b(?!.*[SN ]\\4\\b)) *)*$", - "type": "text", - }, - "BLACKLIST_IGNORE_USER_AGENT": { - "context": "multisite", - "default": "", - "help": "List of User-Agent (PCRE regex), separated with spaces, to ignore in the blacklist.", - "id": "blacklist-ignore-user-agent", - "label": "Blacklist ignore User-Agent", - "regex": "^.*$", - "type": "text", - }, - "BLACKLIST_IGNORE_URI": { - "context": "multisite", - "default": "", - "help": "List of URI (PCRE regex), separated with spaces, to ignore in the blacklist.", - "id": "blacklist-ignore-uri", - "label": "Blacklist ignore URI", - "regex": "^( *(.*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "BLACKLIST_IP_URLS": { - "context": "global", - "default": "https://www.dan.me.uk/torlist/?exit", - "help": "List of URLs, separated with spaces, containing bad IP/network to block.", - "id": "blacklist-ip-urls", - "label": "Blacklist IP/network URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "BLACKLIST_RDNS_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing reverse DNS suffixes to block.", - "id": "blacklist-rdns-urls", - "label": "Blacklist reverse DNS URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "BLACKLIST_ASN_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing ASN to block.", - "id": "blacklist-asn-urls", - "label": "Blacklist ASN URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "BLACKLIST_USER_AGENT_URLS": { - "context": "global", - "default": "https://raw.githubusercontent.com/mitchellkrogza/nginx-ultimate-bad-bot-blocker/master/_generator_lists/bad-user-agents.list", - "help": "List of URLs, separated with spaces, containing bad User-Agent to block.", - "id": "blacklist-user-agent-urls", - "label": "Blacklist User-Agent URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "BLACKLIST_URI_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing bad URI to block.", - "id": "blacklist-uri-urls", - "label": "Blacklist URI URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "BLACKLIST_IGNORE_IP_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing IP/network to ignore in the blacklist.", - "id": "blacklist-ignore-ip-urls", - "label": "Blacklist ignore IP/network URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "BLACKLIST_IGNORE_RDNS_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing reverse DNS suffixes to ignore in the blacklist.", - "id": "blacklist-ignore-rdns-urls", - "label": "Blacklist ignore reverse DNS URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "BLACKLIST_IGNORE_ASN_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing ASN to ignore in the blacklist.", - "id": "blacklist-ignore-asn-urls", - "label": "Blacklist ignore ASN URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "BLACKLIST_IGNORE_USER_AGENT_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing User-Agent to ignore in the blacklist.", - "id": "blacklist-ignore-user-agent-urls", - "label": "Blacklist ignore User-Agent URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "BLACKLIST_IGNORE_URI_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing URI to ignore in the blacklist.", - "id": "blacklist-ignore-uri-urls", - "label": "Blacklist ignore URI URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "brotli", - "stream": "no", - "name": "Brotli", - "description": "Compress HTTP requests with the brotli algorithm.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "USE_BROTLI": { - "context": "multisite", - "default": "no", - "help": "Use brotli", - "id": "use-brotli", - "label": "Use brotli", - "regex": "^(yes|no)$", - "type": "check", - }, - "BROTLI_TYPES": { - "context": "multisite", - "default": "application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml", - "help": "List of MIME types that will be compressed with brotli.", - "id": "brotli-types", - "label": "MIME types", - "regex": "^(?! )( ?([\\-\\w.]+/[\\-\\w.+]+)(?!.*\\2(?!.)))+$", - "type": "text", - }, - "BROTLI_MIN_LENGTH": { - "context": "multisite", - "default": "1000", - "help": "Minimum length for brotli compression.", - "id": "brotli-min-length", - "label": "Minimum length", - "regex": "^\\d+", - "type": "text", - }, - "BROTLI_COMP_LEVEL": { - "context": "multisite", - "default": "6", - "help": "The compression level of the brotli algorithm.", - "id": "brotli-comp-level", - "label": "Compression level", - "regex": "^([02-9]|1[01]?)$", - "type": "select", - "select": [ - "0", - "1", - "10", - "11", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - ], - }, - }, - "checksum": None, - }, - { - "id": "bunkernet", - "stream": "yes", - "name": "BunkerNet", - "description": "Share threat data with other BunkerWeb instances via BunkerNet.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": True, - "settings": { - "USE_BUNKERNET": { - "context": "multisite", - "default": "yes", - "help": "Activate BunkerNet feature.", - "id": "use-bunkernet", - "label": "Activate BunkerNet", - "regex": "^(yes|no)$", - "type": "check", - }, - "BUNKERNET_SERVER": { - "context": "global", - "default": "https://api.bunkerweb.io", - "help": "Address of the BunkerNet API.", - "id": "bunkernet-server", - "label": "BunkerNet server", - "regex": "^https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "cors", - "stream": "no", - "name": "CORS", - "description": "Cross-Origin Resource Sharing.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": True, - "settings": { - "USE_CORS": { - "context": "multisite", - "default": "no", - "help": "Use CORS", - "id": "use-cors", - "label": "Use CORS", - "regex": "^(yes|no)$", - "type": "check", - }, - "CORS_ALLOW_ORIGIN": { - "context": "multisite", - "default": "*", - "help": "Allowed origins to make CORS requests : PCRE regex or *.", - "id": "cors-allow-origin", - "label": "Allowed origins", - "regex": "^.*$", - "type": "text", - }, - "CORS_ALLOW_METHODS": { - "context": "multisite", - "default": "GET, POST, OPTIONS", - "help": "Value of the Access-Control-Allow-Methods header.", - "id": "cors-allow-methods", - "label": "Access-Control-Allow-Methods value", - "regex": "^(\\*|(?![, ])(,? ?(GET|HEAD|POST|PUT|DELETE|CONNECT|OPTIONS|TRACE|PATCH)(?!.*\\3))*)?$", - "type": "text", - }, - "CORS_ALLOW_HEADERS": { - "context": "multisite", - "default": "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range", - "help": "Value of the Access-Control-Allow-Headers header.", - "id": "cors-allow-headers", - "label": "Access-Control-Allow-Headers value", - "regex": "^(\\*|(?![, ])(,? ?([\\w\\-]+)(?!.*\\3(?!.)))*)?$", - "type": "text", - }, - "CORS_ALLOW_CREDENTIALS": { - "context": "multisite", - "default": "no", - "help": "Send the Access-Control-Allow-Credentials header.", - "id": "cors-allow-credentials", - "label": "Send Access-Control-Allow-Credentials", - "regex": "^(yes|no)$", - "type": "check", - }, - "CORS_EXPOSE_HEADERS": { - "context": "multisite", - "default": "Content-Length,Content-Range", - "help": "Value of the Access-Control-Expose-Headers header.", - "id": "cors-expose-headers", - "label": "Access-Control-Expose-Headers value", - "regex": "^(\\*|(?![, ]+)(,? ?([\\w\\-]+)(?!.*\\3(?!.)))*)?$", - "type": "text", - }, - "CROSS_ORIGIN_OPENER_POLICY": { - "context": "multisite", - "default": "", - "help": "Value for the Cross-Origin-Opener-Policy header.", - "id": "cross-origin-opener-policy", - "label": "Cross-Origin-Opener-Policy", - "regex": "^(unsafe-none|same-origin-allow-popups|same-origin)?$", - "type": "select", - "select": [ - "", - "same-origin", - "same-origin-allow-popups", - "unsafe-none", - ], - }, - "CROSS_ORIGIN_EMBEDDER_POLICY": { - "context": "multisite", - "default": "", - "help": "Value for the Cross-Origin-Embedder-Policy header.", - "id": "cross-origin-embedder-policy", - "label": "Cross-Origin-Embedder-Policy", - "regex": "^(unsafe-none|require-corp|credentialless)?$", - "type": "select", - "select": ["", "credentialless", "require-corp", "unsafe-none"], - }, - "CROSS_ORIGIN_RESOURCE_POLICY": { - "context": "multisite", - "default": "", - "help": "Value for the Cross-Origin-Resource-Policy header.", - "id": "cross-origin-resource-policy", - "label": "Cross-Origin-Resource-Policy", - "regex": "^(same-site|same-origin|cross-origin)?$", - "type": "select", - "select": ["", "cross-origin", "same-origin", "same-site"], - }, - "CORS_MAX_AGE": { - "context": "multisite", - "default": "86400", - "help": "Value of the Access-Control-Max-Age header.", - "id": "cors-max-age", - "label": "Access-Control-Max-Age value", - "regex": "^\\d+$", - "type": "text", - }, - "CORS_DENY_REQUEST": { - "context": "multisite", - "default": "yes", - "help": "Deny request and don't send it to backend if Origin is not allowed.", - "id": "cors-deny-request", - "label": "Deny request", - "regex": "^(yes|no)$", - "type": "check", - }, - }, - "checksum": None, - }, - { - "id": "clientcache", - "stream": "no", - "name": "Client cache", - "description": "Manage caching for clients.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "USE_CLIENT_CACHE": { - "context": "multisite", - "default": "no", - "help": "Tell client to store locally static files.", - "id": "use-client-cache", - "label": "Use client cache", - "regex": "^(yes|no)$", - "type": "check", - }, - "CLIENT_CACHE_EXTENSIONS": { - "context": "global", - "default": "jpg|jpeg|png|bmp|ico|svg|tif|css|js|otf|ttf|eot|woff|woff2", - "help": "List of file extensions, separated with pipes that should be cached.", - "id": "client-cache-extensions", - "label": "Extensions that should be cached by the client", - "regex": "^(?!\\|)(\\|?([a-z0-9]+)(?!.*\\2(?!.)))+$", - "type": "text", - }, - "CLIENT_CACHE_ETAG": { - "context": "multisite", - "default": "yes", - "help": "Send the HTTP ETag header for static resources.", - "id": "client-cache-etag", - "label": "ETag", - "regex": "^(yes|no)$", - "type": "check", - }, - "CLIENT_CACHE_CONTROL": { - "context": "multisite", - "default": "public, max-age=15552000", - "help": "Value of the Cache-Control HTTP header.", - "id": "client-cache-control", - "label": "Cache-Control header", - "regex": "^(?!(, ?| ))((, )?(((max-age|s-maxage|stale-while-revalidate|stale-if-error)=\\d+(?!.*\\6))|((?!.*public)private|(?!.*private)public)|(must|proxy)-revalidate|must-understand|immutable|no-(cache|store|transform))(?!.*\\4))+$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "country", - "stream": "yes", - "name": "Country", - "description": "Deny access based on the country of the client IP.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": True, - "settings": { - "BLACKLIST_COUNTRY": { - "context": "multisite", - "default": "", - "help": "Deny access if the country of the client is in the list (ISO 3166-1 alpha-2 format separated with spaces).", - "id": "country-blacklist", - "label": "Country blacklist", - "regex": "^(?! )( *([A-Z]{2})(?!.*\\2) *)*$", - "type": "text", - }, - "WHITELIST_COUNTRY": { - "context": "multisite", - "default": "", - "help": "Deny access if the country of the client is not in the list (ISO 3166-1 alpha-2 format separated with spaces).", - "id": "country-whitelist", - "label": "Country whitelist", - "regex": "^(?! )( *([A-Z]{2})(?!.*\\2) *)*$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "customcert", - "stream": "yes", - "name": "Custom HTTPS certificate", - "description": "Choose custom certificate for HTTPS.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "USE_CUSTOM_SSL": { - "context": "multisite", - "default": "no", - "help": "Use custom HTTPS certificate.", - "id": "use-custom-https", - "label": "Use custom certificate", - "regex": "^(yes|no)$", - "type": "check", - }, - "CUSTOM_SSL_CERT": { - "context": "multisite", - "default": "", - "help": "Full path of the certificate or bundle file (must be readable by the scheduler).", - "id": "custom-https-cert", - "label": "Certificate path", - "regex": "^(/[\\w. \\-]+)*/?$", - "type": "text", - }, - "CUSTOM_SSL_KEY": { - "context": "multisite", - "default": "", - "help": "Full path of the key file (must be readable by the scheduler).", - "id": "custom-https-key", - "label": "Key path", - "regex": "^(/[\\w. \\-]+)*/?$", - "type": "text", - }, - "CUSTOM_SSL_CERT_DATA": { - "context": "multisite", - "default": "", - "help": "Certificate data encoded in base64.", - "id": "custom-https-cert-data", - "label": "Certificate data (base64)", - "regex": "^.*$", - "type": "text", - }, - "CUSTOM_SSL_KEY_DATA": { - "context": "multisite", - "default": "", - "help": "Key data encoded in base64.", - "id": "custom-https-key-data", - "label": "Key data (base64)", - "regex": "^.*$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "db", - "stream": "yes", - "name": "DB", - "description": "Integrate easily the Database.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "DATABASE_URI": { - "context": "global", - "default": "sqlite:////var/lib/bunkerweb/db.sqlite3", - "help": "The database URI, following the sqlalchemy format.", - "id": "database-uri", - "label": "The database URI", - "regex": "^((postgresql|mysql|mariadb|sqlite)(\\+[\\w\\-]+)?:.+)?$", - "type": "text", - }, - "DATABASE_URI_READONLY": { - "context": "global", - "default": "", - "help": "The database URI for read-only operations, it can also serve as a fallback if the main database is down. Following the sqlalchemy format.", - "id": "database-uri-readonly", - "label": "The database URI for read-only operations", - "regex": "^((postgresql|mysql|mariadb|sqlite)(\\+[\\w\\-]+)?:.+)?$", - "type": "text", - }, - "DATABASE_LOG_LEVEL": { - "context": "global", - "default": "warning", - "help": "The level to use for database logs.", - "id": "database-log-level", - "label": "Database log level", - "regex": "^(debug|info|warn|warning|error)$", - "type": "select", - "select": ["debug", "error", "info", "warn", "warning"], - }, - }, - "checksum": None, - }, - { - "id": "dnsbl", - "stream": "yes", - "name": "DNSBL", - "description": "Deny access based on external DNSBL servers.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": True, - "settings": { - "USE_DNSBL": { - "context": "multisite", - "default": "yes", - "help": "Activate DNSBL feature.", - "id": "use-dnsbl", - "label": "Activate DNSBL", - "regex": "^(yes|no)$", - "type": "check", - }, - "DNSBL_LIST": { - "context": "global", - "default": "bl.blocklist.de problems.dnsbl.sorbs.net sbl.spamhaus.org xbl.spamhaus.org", - "help": "List of DNSBL servers.", - "id": "dnsbl-list", - "label": "DNSBL list", - "regex": "^(?! )( ?((?!\\.)[\\w.]+)(?!.*\\2(?!.)))*$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "errors", - "stream": "no", - "name": "Errors", - "description": "Manage default error pages", - "version": "1.0", - "type": "core", - "method": "manual", - "page": True, - "settings": { - "ERRORS": { - "context": "multisite", - "default": "", - "help": "List of HTTP error code and corresponding error pages, separated with spaces (404=/my404.html 403=/errors/403.html ...).", - "id": "errors", - "label": "Errors", - "regex": "^(?! )( ?([1-5]\\d{2})(?!.*\\2(?![^=]))=(\\/[\\w\\].~:\\/?#\\[@!$\\&'\\(\\)*+,;=\\-]*)(?!.*\\3(?!.)))*$", - "type": "text", - }, - "INTERCEPTED_ERROR_CODES": { - "context": "multisite", - "default": "400 401 403 404 405 413 429 500 501 502 503 504", - "help": "List of HTTP error code intercepted by BunkerWeb", - "id": "intercepted-error-codes", - "label": "Intercepted error codes", - "regex": "^( *([1-5]\\d{2})(?!.*\\2) *)+$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "greylist", - "stream": "partial", - "name": "Greylist", - "description": "Allow access while keeping security features based on internal and external IP/network/rDNS/ASN greylists.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": True, - "settings": { - "USE_GREYLIST": { - "context": "multisite", - "default": "no", - "help": "Activate greylist feature.", - "id": "use-greylist", - "label": "Activate greylisting", - "regex": "^(yes|no)$", - "type": "check", - }, - "GREYLIST_IP": { - "context": "multisite", - "default": "", - "help": "List of IP/network, separated with spaces, to put into the greylist.", - "id": "greylist-ip", - "label": "Greylist IP/network", - "regex": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "type": "text", - }, - "GREYLIST_RDNS": { - "context": "multisite", - "default": "", - "help": "List of reverse DNS suffixes, separated with spaces, to put into the greylist.", - "id": "greylist-rdns", - "label": "Greylist reverse DNS", - "regex": "^( *(([^ ]+)(?!.*\\3( |$))) *)*$", - "type": "text", - }, - "GREYLIST_RDNS_GLOBAL": { - "context": "multisite", - "default": "yes", - "help": "Only perform RDNS greylist checks on global IP addresses.", - "id": "greylist-rdns-global", - "label": "Greylist reverse DNS global IPs", - "regex": "^(yes|no)$", - "type": "check", - }, - "GREYLIST_ASN": { - "context": "multisite", - "default": "", - "help": "List of ASN numbers, separated with spaces, to put into the greylist.", - "id": "greylist-asn", - "label": "Greylist ASN", - "regex": "^^( *((ASN?)?(\\d+)\\b(?!.*[SN ]\\4\\b)) *)*$", - "type": "text", - }, - "GREYLIST_USER_AGENT": { - "context": "multisite", - "default": "", - "help": "List of User-Agent (PCRE regex), separated with spaces, to put into the greylist.", - "id": "greylist-user-agent", - "label": "Greylist User-Agent", - "regex": "^.*$", - "type": "text", - }, - "GREYLIST_URI": { - "context": "multisite", - "default": "", - "help": "List of URI (PCRE regex), separated with spaces, to put into the greylist.", - "id": "greylist-uri", - "label": "Greylist URI", - "regex": "^.*$", - "type": "text", - }, - "GREYLIST_IP_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing good IP/network to put into the greylist.", - "id": "greylist-ip-urls", - "label": "Greylist IP/network URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "GREYLIST_RDNS_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing reverse DNS suffixes to put into the greylist.", - "id": "greylist-rdns-urls", - "label": "Greylist reverse DNS URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "GREYLIST_ASN_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing ASN to put into the greylist.", - "id": "greylist-asn-urls", - "label": "Greylist ASN URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "GREYLIST_USER_AGENT_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing good User-Agent to put into the greylist.", - "id": "greylist-user-agent-urls", - "label": "Greylist User-Agent URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "GREYLIST_URI_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing bad URI to put into the greylist.", - "id": "greylist-uri-urls", - "label": "Greylist URI URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "gzip", - "stream": "no", - "name": "Gzip", - "description": "Compress HTTP requests with the gzip algorithm.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "USE_GZIP": { - "context": "multisite", - "default": "no", - "help": "Use gzip", - "id": "use-gzip", - "label": "Use gzip", - "regex": "^(yes|no)$", - "type": "check", - }, - "GZIP_TYPES": { - "context": "multisite", - "default": "application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml", - "help": "List of MIME types that will be compressed with gzip.", - "id": "gzip-types", - "label": "MIME types", - "regex": "^(?! )( ?([\\-\\w.]+/[\\-\\w.+]+)(?!.*\\2(?!.)))+$", - "type": "text", - }, - "GZIP_MIN_LENGTH": { - "context": "multisite", - "default": "1000", - "help": "Minimum length for gzip compression.", - "id": "gzip-min-length", - "label": "Minimum length", - "regex": "^\\d+$", - "type": "text", - }, - "GZIP_COMP_LEVEL": { - "context": "multisite", - "default": "5", - "help": "The compression level of the gzip algorithm.", - "id": "gzip-comp-level", - "label": "Compression level", - "regex": "^[1-9]$", - "type": "select", - "select": ["1", "2", "3", "4", "5", "6", "7", "8", "9"], - }, - "GZIP_PROXIED": { - "context": "multisite", - "default": "no-cache no-store private expired auth", - "help": "Which kind of proxied requests we should compress.", - "id": "gzip-proxied", - "label": "Proxied requests", - "regex": "^.*$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "inject", - "stream": "no", - "name": "HTML injection", - "description": "Inject custom HTML code before the tag.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "INJECT_BODY": { - "context": "multisite", - "default": "", - "help": "The HTML code to inject.", - "id": "inject-body", - "label": "HTML code", - "regex": "^.*$", - "type": "text", - } - }, - "checksum": None, - }, - { - "id": "headers", - "stream": "no", - "name": "Headers", - "description": "Manage HTTP headers sent to clients.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "CUSTOM_HEADER": { - "context": "multisite", - "default": "", - "help": "Custom header to add (HeaderName: HeaderValue).", - "id": "custom-header", - "label": "Custom header (HeaderName: HeaderValue)", - "regex": "^([\\w\\-]+: .+)?$", - "type": "text", - "multiple": "custom-headers", - }, - "REMOVE_HEADERS": { - "context": "multisite", - "default": "Server Expect-CT X-Powered-By X-AspNet-Version X-AspNetMvc-Version", - "help": "Headers to remove (Header1 Header2 Header3 ...)", - "id": "remove-headers", - "label": "Remove headers", - "regex": "^(?! )( ?[\\w\\-]+)*$", - "type": "text", - }, - "KEEP_UPSTREAM_HEADERS": { - "context": "multisite", - "default": "Content-Security-Policy Permissions-Policy Feature-Policy X-Frame-Options", - "help": "Headers to keep from upstream (Header1 Header2 Header3 ... or * for all).", - "id": "keep-upstream-headers", - "label": "Keep upstream headers", - "regex": "^((?! )( ?[\\w\\-]+)+|\\*)?$", - "type": "text", - }, - "STRICT_TRANSPORT_SECURITY": { - "context": "multisite", - "default": "max-age=31536000", - "help": "Value for the Strict-Transport-Security header.", - "id": "strict-transport-security", - "label": "Strict-Transport-Security", - "regex": "^max-age=\\d+(; includeSubDomains(; preload)?)?$", - "type": "text", - }, - "COOKIE_FLAGS": { - "context": "multisite", - "default": "* HttpOnly SameSite=Lax", - "help": "Cookie flags automatically added to all cookies (value accepted for nginx_cookie_flag_module).", - "id": "cookie-flags", - "label": "Cookie flags", - "regex": "^(\\*|[^;]+)( (HttpOnly|(SameSite)(?!.*\\4)(=(Lax|Strict))?)(?!.*\\3))*$", - "type": "text", - "multiple": "cookie-flags", - }, - "COOKIE_AUTO_SECURE_FLAG": { - "context": "multisite", - "default": "yes", - "help": "Automatically add the Secure flag to all cookies.", - "id": "cookie-auto-secure-flag", - "label": "Cookie auto Secure flag", - "regex": "^(yes|no)$", - "type": "check", - }, - "CONTENT_SECURITY_POLICY": { - "context": "multisite", - "default": "object-src 'none'; form-action 'self'; frame-ancestors 'self';", - "help": "Value for the Content-Security-Policy header.", - "id": "content-security-policy", - "label": "Content-Security-Policy", - "regex": "^.*$", - "type": "text", - }, - "CONTENT_SECURITY_POLICY_REPORT_ONLY": { - "context": "multisite", - "default": "no", - "help": "Send reports for violations of the Content-Security-Policy header instead of blocking them.", - "id": "content-security-policy-report-only", - "label": "Content-Security-Policy-Report-Only", - "regex": "^(yes|no)$", - "type": "check", - }, - "REFERRER_POLICY": { - "context": "multisite", - "default": "strict-origin-when-cross-origin", - "help": "Value for the Referrer-Policy header.", - "id": "referrer-policy", - "label": "Referrer-Policy", - "regex": "^(?!^(,| ))((, )?(no-referrer-when-downgrade|no-referrer|origin-when-cross-origin|same-origin|strict-origin-when-cross-origin|strict-origin|origin|unsafe-url)(?!\\b.*, \\4\\b))*$", - "type": "text", - }, - "PERMISSIONS_POLICY": { - "context": "multisite", - "default": "accelerometer=(), ambient-light-sensor=(), autoplay=(), battery=(), camera=(), cross-origin-isolated=(), display-capture=(), document-domain=(), encrypted-media=(), execution-while-not-rendered=(), execution-while-out-of-viewport=(), fullscreen=(), geolocation=(), gyroscope=(), hid=(), idle-detection=(), magnetometer=(), microphone=(), midi=(), navigation-override=(), payment=(), picture-in-picture=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), usb=(), web-share=(), xr-spatial-tracking=()", - "help": "Value for the Permissions-Policy header.", - "id": "permissions-policy", - "label": "Permissions-Policy", - "regex": "^(?![, ])(,? ?([a-z\\-]+)(?!.*[^\\-]\\2=)=(\\*|\\(( ?(self|\\u0022https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*\\u0022)(?=[ \\)]))*\\)))*$", - "type": "text", - }, - "FEATURE_POLICY": { - "context": "multisite", - "default": "accelerometer 'none'; ambient-light-sensor 'none'; autoplay 'none'; battery 'none'; camera 'none'; display-capture 'none'; document-domain 'none'; encrypted-media 'none'; execution-while-not-rendered 'none'; execution-while-out-of-viewport 'none'; fullscreen 'none'; geolocation 'none'; gyroscope 'none'; layout-animation 'none'; legacy-image-formats 'none'; magnetometer 'none'; microphone 'none'; midi 'none'; navigation-override 'none'; payment 'none'; picture-in-picture 'none'; publickey-credentials-get 'none'; speaker-selection 'none'; sync-xhr 'none'; unoptimized-images 'none'; unsized-media 'none'; usb 'none'; screen-wake-lock 'none'; web-share 'none'; xr-spatial-tracking 'none';", - "help": "Value for the Feature-Policy header.", - "id": "feature-policy", - "label": "Feature-Policy", - "regex": "^(?![; ])( ?([\\w\\-]+)(?!.*[^\\-]\\2 )( ('(none|self|strict-dynamic|report-sample|unsafe-inline|unsafe-eval|unsafe-hashes|unsafe-allow-redirects)'|https?:\\/\\/[\\w@:%.+~#=\\-]+[\\w\\(\\)!@:%+.~#?&\\/=$\\-]*))+;)*$", - "type": "text", - }, - "X_FRAME_OPTIONS": { - "context": "multisite", - "default": "SAMEORIGIN", - "help": "Value for the X-Frame-Options header.", - "id": "x-frame-options", - "label": "X-Frame-Options", - "regex": "^(DENY|SAMEORIGIN)?$", - "type": "select", - "select": ["", "DENY", "SAMEORIGIN"], - }, - "X_CONTENT_TYPE_OPTIONS": { - "context": "multisite", - "default": "nosniff", - "help": "Value for the X-Content-Type-Options header.", - "id": "x-content-type-options", - "label": "X-Content-Type-Options", - "regex": "^(nosniff)?$", - "type": "select", - "select": ["", "nosniff"], - }, - "X_XSS_PROTECTION": { - "context": "multisite", - "default": "1; mode=block", - "help": "Value for the X-XSS-Protection header.", - "id": "x-xss-protection", - "label": "X-XSS-Protection", - "regex": "^0|1(; (mode=block|report=https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*))?$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "jobs", - "stream": "yes", - "name": "Jobs", - "description": "Fake core plugin for internal jobs.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": {}, - "checksum": None, - }, - { - "id": "letsencrypt", - "stream": "yes", - "name": "Let's Encrypt", - "description": "Automatic creation, renewal and configuration of Let's Encrypt certificates.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "AUTO_LETS_ENCRYPT": { - "context": "multisite", - "default": "no", - "help": "Activate automatic Let's Encrypt mode.", - "id": "auto-lets-encrypt", - "label": "Automatic Let's Encrypt", - "regex": "^(yes|no)$", - "type": "check", - }, - "EMAIL_LETS_ENCRYPT": { - "context": "multisite", - "default": "", - "help": "Email used for Let's Encrypt notification and in certificate.", - "id": "email-lets-encrypt", - "label": "Email Let's Encrypt", - "regex": "^([^@ \\t\\r\\n]+@[^@ \\t\\r\\n]+\\.[^@ \\t\\r\\n]+)?$", - "type": "text", - }, - "USE_LETS_ENCRYPT_STAGING": { - "context": "multisite", - "default": "no", - "help": "Use the staging environment for Let’s Encrypt certificate generation. Useful when you are testing your deployments to avoid being rate limited in the production environment.", - "id": "use-lets-encrypt-staging", - "label": "Use Let's Encrypt Staging", - "regex": "^(yes|no)$", - "type": "check", - }, - "LETS_ENCRYPT_CLEAR_OLD_CERTS": { - "context": "global", - "default": "no", - "help": "Clear old certificates when renewing.", - "id": "lets-encrypt-clear-old-certs", - "label": "Clear old certificates when they are no longer needed", - "regex": "^(yes|no)$", - "type": "check", - }, - }, - "checksum": None, - }, - { - "id": "limit", - "stream": "partial", - "name": "Limit", - "description": "Limit maximum number of requests and connections.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": True, - "settings": { - "USE_LIMIT_REQ": { - "context": "multisite", - "default": "yes", - "help": "Activate limit requests feature.", - "id": "use-limit-req", - "label": "Activate limit requests", - "regex": "^(yes|no)$", - "type": "check", - }, - "LIMIT_REQ_URL": { - "context": "multisite", - "default": "/", - "help": "URL (PCRE regex) where the limit request will be applied or special value / for all requests.", - "id": "limit-req-url", - "label": "Limit request URL", - "regex": "^.+$", - "type": "text", - "multiple": "limit-req", - }, - "LIMIT_REQ_RATE": { - "context": "multisite", - "default": "2r/s", - "help": "Rate to apply to the URL (s for second, m for minute, h for hour and d for day).", - "id": "limit-req-rate", - "label": "Limit request Rate", - "regex": "^\\d+r/[smhd]$", - "type": "text", - "multiple": "limit-req", - }, - "USE_LIMIT_CONN": { - "context": "multisite", - "default": "yes", - "help": "Activate limit connections feature.", - "id": "use-limit-conn", - "label": "Activate limit connections", - "regex": "^(yes|no)$", - "type": "check", - }, - "LIMIT_CONN_MAX_HTTP1": { - "context": "multisite", - "default": "10", - "help": "Maximum number of connections per IP when using HTTP/1.X protocol.", - "id": "limit-conn-max-http1", - "label": "Maximum number of HTTP/1.X connections", - "regex": "^\\d+$", - "type": "text", - }, - "LIMIT_CONN_MAX_HTTP2": { - "context": "multisite", - "default": "100", - "help": "Maximum number of streams per IP when using HTTP/2 protocol.", - "id": "limit-conn-max-http2", - "label": "Maximum number of HTTP/2 streams", - "regex": "^\\d+$", - "type": "text", - }, - "LIMIT_CONN_MAX_STREAM": { - "context": "multisite", - "default": "10", - "help": "Maximum number of connections per IP when using stream.", - "id": "limit-conn-max-stream", - "label": "Maximum number of stream connections", - "regex": "^\\d+$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "metrics", - "stream": "partial", - "name": "Metrics", - "description": "Metrics collection and retrieve.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "USE_METRICS": { - "context": "multisite", - "default": "yes", - "help": "Enable collection and retrieval of internal metrics.", - "id": "use-metrics", - "label": "Use metrics", - "regex": "^(yes|no)$", - "type": "check", - }, - "METRICS_MEMORY_SIZE": { - "context": "global", - "default": "16m", - "help": "Size of the internal storage for metrics.", - "id": "metrics-memory-size", - "label": "Metrics memory size", - "regex": "^\\d+[kKmMgG]?$", - "type": "text", - }, - "METRICS_MAX_BLOCKED_REQUESTS": { - "context": "global", - "default": "100", - "help": "Maximum number of blocked requests to store (per worker).", - "id": "metrics-max-blocked-requests", - "label": "Metrics max blocked requests", - "regex": "^\\d+$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "misc", - "stream": "partial", - "name": "Miscellaneous", - "description": "Miscellaneous settings.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": True, - "settings": { - "DISABLE_DEFAULT_SERVER": { - "context": "global", - "default": "no", - "help": "Deny HTTP request if the request vhost is unknown.", - "id": "disable-default-server", - "label": "Disable default server", - "regex": "^(yes|no)$", - "type": "check", - }, - "DISABLE_DEFAULT_SERVER_STRICT_SNI": { - "context": "global", - "default": "no", - "help": "Close SSL/TLS connection if the SNI is unknown.", - "id": "disable-default-server-strict-sni", - "label": "Disable default server strict SNI", - "regex": "^(yes|no)$", - "type": "check", - }, - "REDIRECT_HTTP_TO_HTTPS": { - "context": "multisite", - "default": "no", - "help": "Redirect all HTTP request to HTTPS.", - "id": "redirect-http-to-https", - "label": "Redirect HTTP to HTTPS", - "regex": "^(yes|no)$", - "type": "check", - }, - "AUTO_REDIRECT_HTTP_TO_HTTPS": { - "context": "multisite", - "default": "yes", - "help": "Try to detect if HTTPS is used and activate HTTP to HTTPS redirection if that's the case.", - "id": "auto-redirect-http-to-https", - "label": "Auto redirect HTTP to HTTPS", - "regex": "^(yes|no)$", - "type": "check", - }, - "ALLOWED_METHODS": { - "context": "multisite", - "default": "GET|POST|HEAD", - "help": "Allowed HTTP and WebDAV methods, separated with pipes to be sent by clients.", - "id": "allowed-methods", - "label": "Allowed methods", - "regex": "^(?!\\|)(\\|?([A-Z]{3,})(?!.*(^|\\|)\\2))+$", - "type": "text", - }, - "MAX_CLIENT_SIZE": { - "context": "multisite", - "default": "10m", - "help": "Maximum body size (0 for infinite).", - "id": "max-client-size", - "label": "Maximum body size", - "regex": "^\\d+[kKmMgG]?$", - "type": "text", - }, - "SERVE_FILES": { - "context": "multisite", - "default": "yes", - "help": "Serve files from the local folder.", - "id": "serve-files", - "label": "Serve files", - "regex": "^(yes|no)$", - "type": "check", - }, - "ROOT_FOLDER": { - "context": "multisite", - "default": "", - "help": "Root folder containing files to serve (/var/www/html/{server_name} if unset).", - "id": "root-folder", - "label": "Root folder", - "regex": "^(/[\\w. \\-]+)*/?$", - "type": "text", - }, - "SSL_PROTOCOLS": { - "context": "multisite", - "default": "TLSv1.2 TLSv1.3", - "help": "The supported version of TLS. We recommend the default value TLSv1.2 TLSv1.3 for compatibility reasons.", - "id": "https-protocols", - "label": "HTTPS protocols", - "regex": "^(?! )( ?TLSv1\\.[0-3])*$", - "type": "text", - }, - "HTTP2": { - "context": "multisite", - "default": "yes", - "help": "Support HTTP2 protocol when HTTPS is enabled.", - "id": "http2", - "label": "HTTP2", - "regex": "^(yes|no)$", - "type": "check", - }, - "HTTP3": { - "context": "multisite", - "default": "no", - "help": "Support HTTP3 protocol when HTTPS is enabled.", - "id": "http3", - "label": "HTTP3", - "regex": "^(yes|no)$", - "type": "check", - }, - "HTTP3_ALT_SVC_PORT": { - "context": "multisite", - "default": "443", - "help": "HTTP3 alternate service port. This value will be used as part of the Alt-Svc header.", - "id": "http3-alt-svc-port", - "label": "HTTP3 Alt-Svc port", - "regex": "^\\d+$", - "type": "text", - }, - "LISTEN_HTTP": { - "context": "multisite", - "default": "yes", - "help": "Respond to (insecure) HTTP requests.", - "id": "http-listen", - "label": "HTTP listen", - "regex": "^(yes|no)$", - "type": "check", - }, - "USE_OPEN_FILE_CACHE": { - "context": "multisite", - "default": "no", - "help": "Enable open file cache feature", - "id": "use-open-file-cache", - "label": "Use open file cache", - "regex": "^(yes|no)$", - "type": "check", - }, - "OPEN_FILE_CACHE": { - "context": "multisite", - "default": "max=1000 inactive=20s", - "help": "Open file cache directive", - "id": "open-file-cache", - "label": "Use open file cache", - "regex": "^(off|max=\\d+( inactive=\\d+(ms?|[shdwMy]))?)$", - "type": "text", - }, - "OPEN_FILE_CACHE_ERRORS": { - "context": "multisite", - "default": "yes", - "help": "Enable open file cache for errors", - "id": "open-file-cache-errors", - "label": "Open file cache errors", - "regex": "^(yes|no)$", - "type": "check", - }, - "OPEN_FILE_CACHE_MIN_USES": { - "context": "multisite", - "default": "2", - "help": "Enable open file cache minimum uses", - "id": "open-file-cache-min-uses", - "label": "Open file cache min uses", - "regex": "^[1-9]\\d*$", - "type": "text", - }, - "OPEN_FILE_CACHE_VALID": { - "context": "multisite", - "default": "30s", - "help": "Open file cache valid time", - "id": "open-file-cache-valid", - "label": "Open file cache valid time", - "regex": "^\\d+(ms?|[shdwMy])$", - "type": "text", - }, - "EXTERNAL_PLUGIN_URLS": { - "context": "global", - "default": "", - "help": "List of external plugins URLs (direct download to .zip or .tar file) to download and install (URLs are separated with space).", - "id": "external-plugin-urls", - "label": "External plugin URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "DENY_HTTP_STATUS": { - "context": "global", - "default": "403", - "help": "HTTP status code to send when the request is denied (403 or 444). When using 444, BunkerWeb will close the connection.", - "id": "deny-http-status", - "label": "Deny HTTP status", - "regex": "^(403|444)$", - "type": "select", - "select": ["403", "444"], - }, - "SEND_ANONYMOUS_REPORT": { - "context": "global", - "default": "yes", - "help": "Send anonymous report to BunkerWeb maintainers.", - "id": "send-anonymous-report", - "label": "Send anonymous report", - "regex": "^(yes|no)$", - "type": "check", - }, - }, - "checksum": None, - }, - { - "id": "modsecurity", - "stream": "no", - "name": "ModSecurity", - "description": "Management of the ModSecurity WAF.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "USE_MODSECURITY": { - "context": "multisite", - "default": "yes", - "help": "Enable ModSecurity WAF.", - "id": "use-modsecurity", - "label": "Use ModSecurity", - "regex": "^(yes|no)$", - "type": "check", - }, - "USE_MODSECURITY_CRS": { - "context": "multisite", - "default": "yes", - "help": "Enable OWASP Core Rule Set.", - "id": "use-modsecurity-crs", - "label": "Use Core Rule Set", - "regex": "^(yes|no)$", - "type": "check", - }, - "MODSECURITY_CRS_VERSION": { - "context": "multisite", - "default": "3", - "help": "Version of the OWASP Core Rule Set to use with ModSecurity (3, 4 or nightly).", - "id": "modsecurity-crs-version", - "label": "Core Rule Set Version", - "regex": "^(3|4|nightly)$", - "type": "select", - "select": ["3", "4", "nightly"], - }, - "MODSECURITY_SEC_AUDIT_ENGINE": { - "context": "multisite", - "default": "RelevantOnly", - "help": "SecAuditEngine directive of ModSecurity.", - "id": "modsecurity-sec-audit-engine", - "label": "SecAuditEngine", - "regex": "^(On|RelevantOnly|Off)$", - "type": "select", - "select": ["Off", "On", "RelevantOnly"], - }, - "MODSECURITY_SEC_RULE_ENGINE": { - "context": "multisite", - "default": "On", - "help": "SecRuleEngine directive of ModSecurity.", - "id": "modsecurity-sec-rule-engine", - "label": "SecRuleEngine", - "regex": "^(On|DetectionOnly|Off)$", - "type": "select", - "select": ["DetectionOnly", "Off", "On"], - }, - "MODSECURITY_SEC_AUDIT_LOG_PARTS": { - "context": "multisite", - "default": "ABCFHZ", - "help": "SecAuditLogParts directive of ModSecurity.", - "id": "modsecurity-sec-audit-log-parts", - "label": "SecAuditLogParts", - "regex": "^A(([B-K])(?!.*\\2))+Z$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "php", - "stream": "no", - "name": "PHP", - "description": "Manage local or remote PHP-FPM.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "REMOTE_PHP": { - "context": "multisite", - "default": "", - "help": "Hostname of the remote PHP-FPM instance.", - "id": "remote-php", - "label": "Remote PHP", - "regex": "^((?=.{1,255}$)[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?(?:\\.[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?)*\\.?)?$", - "type": "text", - }, - "REMOTE_PHP_PATH": { - "context": "multisite", - "default": "", - "help": "Root folder containing files in the remote PHP-FPM instance.", - "id": "remote-php-path", - "label": "Remote PHP path", - "regex": "^(/[\\w. \\-]+)*/?$", - "type": "text", - }, - "LOCAL_PHP": { - "context": "multisite", - "default": "", - "help": "Path to the PHP-FPM socket file.", - "id": "local", - "label": "Local PHP", - "regex": "^(/[\\w. \\-]+)*/?$", - "type": "text", - }, - "LOCAL_PHP_PATH": { - "context": "multisite", - "default": "", - "help": "Root folder containing files in the local PHP-FPM instance.", - "id": "local-php-path", - "label": "Local PHP path", - "regex": "^(/[\\w. \\-]+)*/?$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "pro", - "stream": "no", - "name": "Pro", - "description": "Pro settings for the Pro version of BunkerWeb.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "PRO_LICENSE_KEY": { - "context": "global", - "default": "", - "help": "The License Key for the Pro version of BunkerWeb.", - "id": "pro-license-key", - "label": "Pro License Key", - "regex": "^.*$", - "type": "password", - } - }, - "checksum": None, - }, - { - "id": "realip", - "stream": "partial", - "name": "Real IP", - "description": "Get real IP of clients when BunkerWeb is behind a reverse proxy / load balancer.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "USE_REAL_IP": { - "context": "multisite", - "default": "no", - "help": "Retrieve the real IP of client.", - "id": "use-real-ip", - "label": "Use real ip", - "regex": "^(yes|no)$", - "type": "check", - }, - "USE_PROXY_PROTOCOL": { - "context": "multisite", - "default": "no", - "help": "Enable PROXY protocol communication.", - "id": "use-proxy-protocol", - "label": "Use PROXY protocol", - "regex": "^(yes|no)$", - "type": "check", - }, - "REAL_IP_FROM": { - "context": "multisite", - "default": "192.168.0.0/16 172.16.0.0/12 10.0.0.0/8", - "help": "List of trusted IPs / networks, separated with spaces, where proxied requests come from.", - "id": "real-ip-from", - "label": "Real IP from", - "regex": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "type": "text", - }, - "REAL_IP_HEADER": { - "context": "multisite", - "default": "X-Forwarded-For", - "help": "HTTP header containing the real IP or special value proxy_protocol for PROXY protocol.", - "id": "real-ip-header", - "label": "Real IP header", - "regex": "^(?! )(( ?(?!proxy_protocol)[\\w\\-]+)*|proxy_protocol)$", - "type": "text", - }, - "REAL_IP_RECURSIVE": { - "context": "multisite", - "default": "yes", - "help": "Perform a recursive search in the header container IP address.", - "id": "real-ip-recursive", - "label": "Real IP recursive", - "regex": "^(yes|no)$", - "type": "check", - }, - "REAL_IP_FROM_URLS": { - "context": "global", - "default": "", - "help": "List of URLs containing trusted IPs / networks, separated with spaces, where proxied requests come from.", - "id": "real-ip-from-urls", - "label": "Real IP from URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "redirect", - "stream": "no", - "name": "Redirect", - "description": "Manage HTTP redirects.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "REDIRECT_TO": { - "context": "multisite", - "default": "", - "help": "Redirect a whole site to another one.", - "id": "redirect-to", - "label": "Redirect to", - "regex": "^(https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)?$", - "type": "text", - }, - "REDIRECT_TO_REQUEST_URI": { - "context": "multisite", - "default": "no", - "help": "Append the requested URI to the redirect address.", - "id": "redirect-to-request-uri", - "label": "Append request URI", - "regex": "^(yes|no)$", - "type": "check", - }, - "REDIRECT_TO_STATUS_CODE": { - "context": "multisite", - "default": "301", - "help": "Status code to send to client when redirecting.", - "id": "redirect-to-status-code", - "label": "Append request URI", - "regex": "^(301|302)$", - "type": "select", - "select": ["301", "302"], - }, - }, - "checksum": None, - }, - { - "id": "redis", - "stream": "yes", - "name": "Redis", - "description": "Redis server configuration when using BunkerWeb in cluster mode.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": True, - "settings": { - "USE_REDIS": { - "context": "global", - "default": "no", - "help": "Activate Redis.", - "id": "use-redis", - "label": "Activate Redis", - "regex": "^(yes|no)$", - "type": "check", - }, - "REDIS_HOST": { - "context": "global", - "default": "", - "help": "Redis server IP or hostname.", - "id": "redis-host", - "label": "Redis server", - "regex": "^((?!-)[a-zA-Z0-9\\-]{1,63}(.[a-zA-Z]{2,})+|(\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3}|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)))?$", - "type": "text", - }, - "REDIS_PORT": { - "context": "global", - "default": "6379", - "help": "Redis server port.", - "id": "redis-port", - "label": "Redis port", - "regex": "^[0-9]+$", - "type": "text", - }, - "REDIS_DATABASE": { - "context": "global", - "default": "0", - "help": "Redis database number.", - "id": "redis-database", - "label": "Redis database", - "regex": "^[0-9]+$", - "type": "text", - }, - "REDIS_SSL": { - "context": "global", - "default": "no", - "help": "Use SSL/TLS connection with Redis server.", - "id": "redis-ssl", - "label": "Redis SSL/TLS", - "regex": "^(yes|no)$", - "type": "check", - }, - "REDIS_SSL_VERIFY": { - "context": "global", - "default": "no", - "help": "Verify the certificate of Redis server.", - "id": "redis-ssl-verify", - "label": "Redis SSL/TLS verify", - "regex": "^(yes|no)$", - "type": "check", - }, - "REDIS_TIMEOUT": { - "context": "global", - "default": "1000", - "help": "Redis server timeout (in ms) for connect, read and write.", - "id": "redis-timeout", - "label": "Redis timeout (ms)", - "regex": "^[0-9]+$", - "type": "text", - }, - "REDIS_USERNAME": { - "context": "global", - "default": "", - "help": "Redis username used in AUTH command.", - "id": "redis-username", - "label": "Redis username", - "regex": "^.*$", - "type": "text", - }, - "REDIS_PASSWORD": { - "context": "global", - "default": "", - "help": "Redis password used in AUTH command.", - "id": "redis-password", - "label": "Redis password", - "regex": "^.*$", - "type": "password", - }, - "REDIS_SENTINEL_HOSTS": { - "context": "global", - "default": "", - "help": "Redis sentinel hosts with format host:[port] separated with spaces.", - "id": "redis-sentinel-hosts", - "label": "Redis sentinel hosts", - "regex": "^.*$", - "type": "text", - }, - "REDIS_SENTINEL_USERNAME": { - "context": "global", - "default": "", - "help": "Redis sentinel username.", - "id": "redis-sentinel-username", - "label": "Redis sentinel username", - "regex": "^.*$", - "type": "text", - }, - "REDIS_SENTINEL_PASSWORD": { - "context": "global", - "default": "", - "help": "Redis sentinel password.", - "id": "redis-sentinel-password", - "label": "Redis sentinel password", - "regex": "^.*$", - "type": "password", - }, - "REDIS_SENTINEL_MASTER": { - "context": "global", - "default": "", - "help": "Redis sentinel master name.", - "id": "redis-sentinel-master", - "label": "Redis sentinel master", - "regex": "^.*$", - "type": "text", - }, - "REDIS_KEEPALIVE_IDLE": { - "context": "global", - "default": "30000", - "help": "Max idle time (in ms) before closing redis connection in the pool.", - "id": "redis-keepalive-idle", - "label": "Redis keepalive idle (ms)", - "regex": "^[0-9]+$", - "type": "text", - }, - "REDIS_KEEPALIVE_POOL": { - "context": "global", - "default": "10", - "help": "Max number of redis connection(s) kept in the pool.", - "id": "redis-keepalive-pool", - "label": "Redis keepalive pool", - "regex": "^[0-9]+$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "reverseproxy", - "stream": "partial", - "name": "Reverse proxy", - "description": "Manage reverse proxy configurations.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "USE_REVERSE_PROXY": { - "context": "multisite", - "default": "no", - "help": "Activate reverse proxy mode.", - "id": "use-reverse-proxy", - "label": "Use reverse proxy", - "regex": "^(yes|no)$", - "type": "check", - }, - "REVERSE_PROXY_INTERCEPT_ERRORS": { - "context": "multisite", - "default": "yes", - "help": "Intercept and rewrite errors.", - "id": "reverse-proxy-intercept-errors", - "label": "Intercept errors", - "regex": "^(yes|no)$", - "type": "check", - }, - "REVERSE_PROXY_CUSTOM_HOST": { - "context": "multisite", - "default": "", - "help": "Override Host header sent to upstream server.", - "id": "reverse-proxy-custom-host", - "label": "Reverse proxy custom host", - "regex": "^.*$", - "type": "text", - }, - "REVERSE_PROXY_HOST": { - "context": "multisite", - "default": "", - "help": "Full URL of the proxied resource (proxy_pass).", - "id": "reverse-proxy-host", - "label": "Reverse proxy host", - "regex": "^.*$", - "type": "text", - "multiple": "reverse-proxy", - }, - "REVERSE_PROXY_URL": { - "context": "multisite", - "default": "/", - "help": "Location URL that will be proxied.", - "id": "reverse-proxy-url", - "label": "Reverse proxy url", - "regex": "^.*$", - "type": "text", - "multiple": "reverse-proxy", - }, - "REVERSE_PROXY_WS": { - "context": "multisite", - "default": "no", - "help": "Enable websocket on the proxied resource.", - "id": "reverse-proxy-ws", - "label": "Reverse proxy WS", - "regex": "^(yes|no)$", - "type": "check", - "multiple": "reverse-proxy", - }, - "REVERSE_PROXY_HEADERS": { - "context": "multisite", - "default": "", - "help": "List of HTTP headers to send to proxied resource separated with semicolons (values for proxy_set_header directive).", - "id": "reverse-proxy-headers", - "label": "Reverse proxy headers", - "regex": "^(?![; ])(;? ?([\\w\\-]+)(?!.*\\2 ) [^;]+)*$", - "type": "text", - "multiple": "reverse-proxy", - }, - "REVERSE_PROXY_HEADERS_CLIENT": { - "context": "multisite", - "default": "", - "help": "List of HTTP headers to send to client separated with semicolons (values for add_header directive).", - "id": "reverse-proxy-headers-client", - "label": "Reverse proxy headers-client", - "regex": "^(?![; ])(;? ?([\\w\\-]+)(?!.*\\2 ) [^;]+)*$", - "type": "text", - "multiple": "reverse-proxy", - }, - "REVERSE_PROXY_BUFFERING": { - "context": "multisite", - "default": "yes", - "help": "Enable or disable buffering of responses from proxied resource.", - "id": "reverse-proxy-buffering", - "label": "Reverse proxy buffering", - "regex": "^(yes|no)$", - "type": "check", - "multiple": "reverse-proxy", - }, - "REVERSE_PROXY_KEEPALIVE": { - "context": "multisite", - "default": "no", - "help": "Enable or disable keepalive connections with the proxied resource.", - "id": "reverse-proxy-keepalive", - "label": "Reverse proxy keepalive", - "regex": "^(yes|no)$", - "type": "check", - "multiple": "reverse-proxy", - }, - "REVERSE_PROXY_AUTH_REQUEST": { - "context": "multisite", - "default": "", - "help": "Enable authentication using an external provider (value of auth_request directive).", - "id": "reverse-proxy-auth-request", - "label": "Reverse proxy auth request", - "regex": "^(\\/[\\w\\].~:\\/?#\\[@!$\\&'\\(\\)*+,;=\\-]*|off)?$", - "type": "text", - "multiple": "reverse-proxy", - }, - "REVERSE_PROXY_AUTH_REQUEST_SIGNIN_URL": { - "context": "multisite", - "default": "", - "help": "Redirect clients to sign-in URL when using REVERSE_PROXY_AUTH_REQUEST (used when auth_request call returned 401).", - "id": "reverse-proxy-auth-request-signin-url", - "label": "Auth request signin URL", - "regex": "^(https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)?$", - "type": "text", - "multiple": "reverse-proxy", - }, - "REVERSE_PROXY_AUTH_REQUEST_SET": { - "context": "multisite", - "default": "", - "help": "List of variables to set from the authentication provider, separated with semicolons (values of auth_request_set directives).", - "id": "reverse-proxy-auth-request-set", - "label": "Reverse proxy auth request set", - "regex": "^(?! ;)(;? ?(\\$[a-z_\\-]+)(?!.*\\2 ) [^;]+)*$", - "type": "text", - "multiple": "reverse-proxy", - }, - "REVERSE_PROXY_CONNECT_TIMEOUT": { - "context": "multisite", - "default": "60s", - "help": "Timeout when connecting to the proxied resource.", - "id": "reverse-proxy-connect-timeout", - "label": "Reverse proxy connect timeout", - "regex": "^\\d+(ms?|[shdwMy])$", - "type": "text", - "multiple": "reverse-proxy", - }, - "REVERSE_PROXY_READ_TIMEOUT": { - "context": "multisite", - "default": "60s", - "help": "Timeout when reading from the proxied resource.", - "id": "reverse-proxy-read-timeout", - "label": "Reverse proxy read timeout", - "regex": "^\\d+(ms?|[shdwMy])$", - "type": "text", - "multiple": "reverse-proxy", - }, - "REVERSE_PROXY_SEND_TIMEOUT": { - "context": "multisite", - "default": "60s", - "help": "Timeout when sending to the proxied resource.", - "id": "reverse-proxy-send-timeout", - "label": "Reverse proxy send timeout", - "regex": "^\\d+(ms?|[shdwMy])$", - "type": "text", - "multiple": "reverse-proxy", - }, - "REVERSE_PROXY_INCLUDES": { - "context": "multisite", - "default": "", - "help": "Additional configuration to include in the location block, separated with spaces.", - "id": "reverse-proxy-includes", - "label": "Reverse proxy includes", - "regex": "^(?! )( ?(\\w+)(?!.*\\b\\2\\b))*$", - "type": "text", - "multiple": "reverse-proxy", - }, - "USE_PROXY_CACHE": { - "context": "multisite", - "default": "no", - "help": "Enable or disable caching of the proxied resources.", - "id": "use-proxy-cache", - "label": "Reverse proxy cache", - "regex": "^(yes|no)$", - "type": "check", - }, - "PROXY_CACHE_PATH_LEVELS": { - "context": "global", - "default": "1:2", - "help": "Hierarchy levels of the cache.", - "id": "proxy-cache-path-levels", - "label": "Hierarchy levels", - "regex": "^(:?[12]){1,3}$", - "type": "text", - }, - "PROXY_CACHE_PATH_ZONE_SIZE": { - "context": "global", - "default": "10m", - "help": "Maximum size of cached metadata when caching proxied resources.", - "id": "proxy-cache-path-zone-size", - "label": "Reverse proxy cache zone size", - "regex": "^\\d+[kKmMgG]?$", - "type": "text", - }, - "PROXY_CACHE_PATH_PARAMS": { - "context": "global", - "default": "max_size=100m", - "help": "Additional parameters to add to the proxy_cache directive.", - "id": "proxy-cache-path-params", - "label": "Reverse proxy cache params", - "regex": "^.*$", - "type": "text", - }, - "PROXY_CACHE_METHODS": { - "context": "multisite", - "default": "GET HEAD", - "help": "HTTP methods that should trigger a cache operation.", - "id": "proxy-cache-methods", - "label": "Reverse proxy cache methods", - "regex": "^(?! )( ?(GET|HEAD|POST|PUT|DELETE|CONNECT|OPTIONS|TRACE|PATCH)(?!.*\\2))+$", - "type": "text", - }, - "PROXY_CACHE_MIN_USES": { - "context": "multisite", - "default": "2", - "help": "The minimum number of requests before a response is cached.", - "id": "proxy-cache-min-uses", - "label": "Reverse proxy cache minimum uses", - "regex": "^[1-9]\\d*$", - "type": "text", - }, - "PROXY_CACHE_KEY": { - "context": "multisite", - "default": "$scheme$host$request_uri", - "help": "The key used to uniquely identify a cached response.", - "id": "proxy-cache-key", - "label": "Reverse proxy cache key", - "regex": "^(?! )( ?(\\$[a-z_]+)(?!.*\\2))+$", - "type": "text", - }, - "PROXY_CACHE_VALID": { - "context": "multisite", - "default": "200=24h 301=1h 302=24h", - "help": "Define the caching time depending on the HTTP status code (list of status=time), separated with spaces.", - "id": "proxy-cache-valid", - "label": "Reverse proxy cache valid", - "regex": "^(?! )( ?([1-5]\\d{2})(?!.*\\2=)=\\d+(ms?|[shdwMy]))*$", - "type": "text", - }, - "PROXY_NO_CACHE": { - "context": "multisite", - "default": "$http_pragma $http_authorization", - "help": "Conditions to disable caching of responses.", - "id": "proxy-no-cache", - "label": "Reverse proxy no cache", - "regex": "^.*$", - "type": "text", - }, - "PROXY_CACHE_BYPASS": { - "context": "multisite", - "default": "0", - "help": "Conditions to bypass caching of responses.", - "id": "proxy-cache-bypass", - "label": "Reverse proxy bypass", - "regex": "^.*$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "reversescan", - "stream": "yes", - "name": "Reverse scan", - "description": "Scan clients ports to detect proxies or servers.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": True, - "settings": { - "USE_REVERSE_SCAN": { - "context": "multisite", - "default": "no", - "help": "Enable scanning of clients ports and deny access if one is opened.", - "id": "use-reverse-scan", - "label": "Reverse scan", - "regex": "^(no|yes)$", - "type": "check", - }, - "REVERSE_SCAN_PORTS": { - "context": "multisite", - "default": "22 80 443 3128 8000 8080", - "help": "List of port to scan when using reverse scan feature.", - "id": "reverse-scan-ports", - "label": "Reverse scan ports", - "regex": "^.*$", - "type": "text", - }, - "REVERSE_SCAN_TIMEOUT": { - "context": "multisite", - "default": "500", - "help": "Specify the maximum timeout (in ms) when scanning a port.", - "id": "reverse-scan-timeout", - "label": "Reverse scan timeout", - "regex": "^.*$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "selfsigned", - "stream": "yes", - "name": "Self-signed certificate", - "description": "Generate self-signed certificate.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "GENERATE_SELF_SIGNED_SSL": { - "context": "multisite", - "default": "no", - "help": "Generate and use self-signed certificate.", - "id": "generate-self-signed-ssl", - "label": "Activate self-signed certificate", - "regex": "^(yes|no)$", - "type": "check", - }, - "SELF_SIGNED_SSL_EXPIRY": { - "context": "multisite", - "default": "365", - "help": "Self-signed certificate expiry in days.", - "id": "self-signed-ssl-expiry", - "label": "Certificate expiry", - "regex": "^\\d+$", - "type": "text", - }, - "SELF_SIGNED_SSL_SUBJ": { - "context": "multisite", - "default": "/CN=www.example.com/", - "help": "Self-signed certificate subject.", - "id": "self-signed-ssl-subj", - "label": "Certificate subject", - "regex": "^/CN=[^,]+$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "sessions", - "stream": "yes", - "name": "Sessions", - "description": "Management of session used by other plugins.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "SESSIONS_SECRET": { - "context": "global", - "default": "random", - "help": "Secret used to encrypt sessions variables for storing data related to challenges.", - "id": "session-secret", - "label": "Sessions secret", - "regex": "^\\w+$", - "type": "password", - }, - "SESSIONS_NAME": { - "context": "global", - "default": "random", - "help": "Name of the cookie given to clients.", - "id": "sessions-name", - "label": "Sessions name", - "regex": "^\\w+$", - "type": "text", - }, - "SESSIONS_IDLING_TIMEOUT": { - "context": "global", - "default": "1800", - "help": "Maximum time (in seconds) of inactivity before the session is invalidated.", - "id": "sessions-idling-timeout", - "label": "Sessions idling timeout", - "regex": "^\\d+$", - "type": "text", - }, - "SESSIONS_ROLLING_TIMEOUT": { - "context": "global", - "default": "3600", - "help": "Maximum time (in seconds) before a session must be renewed.", - "id": "sessions-rolling-timeout", - "label": "Sessions rolling timeout", - "regex": "^\\d+$", - "type": "text", - }, - "SESSIONS_ABSOLUTE_TIMEOUT": { - "context": "global", - "default": "86400", - "help": "Maximum time (in seconds) before a session is destroyed.", - "id": "sessions-absolute-timeout", - "label": "Sessions absolute timeout", - "regex": "^\\d+$", - "type": "text", - }, - "SESSIONS_CHECK_IP": { - "context": "global", - "default": "yes", - "help": "Destroy session if IP address is different than original one.", - "id": "sessions-check-ip", - "label": "Sessions check IP", - "regex": "^(yes|no)$", - "type": "check", - }, - "SESSIONS_CHECK_USER_AGENT": { - "context": "global", - "default": "yes", - "help": "Destroy session if User-Agent is different than original one.", - "id": "sessions-user-agent", - "label": "Sessions check User-Agent", - "regex": "^(yes|no)$", - "type": "check", - }, - }, - "checksum": None, - }, - { - "id": "ui", - "stream": "no", - "name": "UI", - "description": "Integrate easily the BunkerWeb UI.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": False, - "settings": { - "USE_UI": { - "context": "multisite", - "default": "no", - "help": "Use UI", - "id": "use-ui", - "label": "Use UI", - "regex": "^(yes|no)$", - "type": "check", - }, - "UI_HOST": { - "context": "global", - "default": "", - "help": "Address of the web UI used for initial setup", - "id": "ui-host", - "label": "UI host", - "regex": "^.*$", - "type": "text", - }, - }, - "checksum": None, - }, - { - "id": "whitelist", - "stream": "partial", - "name": "Whitelist", - "description": "Allow access based on internal and external IP/network/rDNS/ASN whitelists.", - "version": "1.0", - "type": "core", - "method": "manual", - "page": True, - "settings": { - "USE_WHITELIST": { - "context": "multisite", - "default": "yes", - "help": "Activate whitelist feature.", - "id": "use-whitelist", - "label": "Activate whitelisting", - "regex": "^(yes|no)$", - "type": "check", - }, - "WHITELIST_IP": { - "context": "multisite", - "default": "20.191.45.212 40.88.21.235 40.76.173.151 40.76.163.7 20.185.79.47 52.142.26.175 20.185.79.15 52.142.24.149 40.76.162.208 40.76.163.23 40.76.162.191 40.76.162.247", - "help": "List of IP/network, separated with spaces, to put into the whitelist.", - "id": "whitelist-ip", - "label": "Whitelist IP/network", - "regex": "^(?! )( *(((\\b25[0-5]|\\b2[0-4]\\d|\\b[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3})(\\/([1-2][0-9]?|3[0-2]?|[04-9]))?|(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]Z{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\\d)?\\d)\\.){3}(25[0-5]|(2[0-4]|1?\\d)?\\d))(\\/(12[0-8]|1[01][0-9]|[0-9][0-9]?))?)(?!.*\\D\\2([^\\d\\/]|$)) *)*$", - "type": "text", - }, - "WHITELIST_RDNS": { - "context": "multisite", - "default": ".google.com .googlebot.com .yandex.ru .yandex.net .yandex.com .search.msn.com .baidu.com .baidu.jp .crawl.yahoo.net .fwd.linkedin.com .twitter.com .twttr.com .discord.com", - "help": "List of reverse DNS suffixes, separated with spaces, to whitelist.", - "id": "whitelist-rdns", - "label": "Whitelist reverse DNS", - "regex": "^( *(([^ ]+)(?!.*\\3( |$))) *)*$", - "type": "text", - }, - "WHITELIST_RDNS_GLOBAL": { - "context": "multisite", - "default": "yes", - "help": "Only perform RDNS whitelist checks on global IP addresses.", - "id": "whitelist-rdns-global", - "label": "Whitelist reverse DNS global IPs", - "regex": "^(yes|no)$", - "type": "check", - }, - "WHITELIST_ASN": { - "context": "multisite", - "default": "32934", - "help": "List of ASN numbers, separated with spaces, to whitelist.", - "id": "whitelist-asn", - "label": "Whitelist ASN", - "regex": "^^( *((ASN?)?(\\d+)\\b(?!.*[SN ]\\4\\b)) *)*$", - "type": "text", - }, - "WHITELIST_USER_AGENT": { - "context": "multisite", - "default": "", - "help": "List of User-Agent (PCRE regex), separated with spaces, to whitelist.", - "id": "whitelist-user-agent", - "label": "Whitelist User-Agent", - "regex": "^.*$", - "type": "text", - }, - "WHITELIST_URI": { - "context": "multisite", - "default": "", - "help": "List of URI (PCRE regex), separated with spaces, to whitelist.", - "id": "whitelist-uri", - "label": "Whitelist URI", - "regex": "^( *(.*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "WHITELIST_IP_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing good IP/network to whitelist.", - "id": "whitelist-ip-urls", - "label": "Whitelist IP/network URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "WHITELIST_RDNS_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing reverse DNS suffixes to whitelist.", - "id": "whitelist-rdns-urls", - "label": "Whitelist reverse DNS URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "WHITELIST_ASN_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing ASN to whitelist.", - "id": "whitelist-asn-urls", - "label": "Whitelist ASN URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "WHITELIST_USER_AGENT_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing good User-Agent to whitelist.", - "id": "whitelist-user-agent-urls", - "label": "Whitelist User-Agent URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - "WHITELIST_URI_URLS": { - "context": "global", - "default": "", - "help": "List of URLs, separated with spaces, containing bad URI to whitelist.", - "id": "whitelist-uri-urls", - "label": "Whitelist URI URLs", - "regex": "^( *((https?:\\/\\/|file:\\/\\/\\/)[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*)(?!.*\\2(?!.)) *)*$", - "type": "text", - }, - }, - "checksum": None, - }, -] - -# Default global config with methods=True from docker-compose.ui.yml -global_config = { - "ERRORS": {"value": "", "global": True, "method": "default"}, - "USE_UI": {"value": "no", "global": True, "method": "default"}, - "USE_CORS": {"value": "no", "global": True, "method": "default"}, - "USE_GZIP": {"value": "yes", "global": True, "method": "scheduler"}, - "USE_DNSBL": {"value": "yes", "global": True, "method": "default"}, - "USE_REDIS": {"value": "no", "global": True, "method": "default"}, - "IS_LOADING": {"value": "no", "global": True, "method": "default"}, - "REMOTE_PHP": {"value": "", "global": True, "method": "default"}, - "USE_BACKUP": {"value": "yes", "global": True, "method": "default"}, - "USE_BROTLI": {"value": "no", "global": True, "method": "default"}, - "INJECT_BODY": {"value": "", "global": True, "method": "default"}, - "REDIRECT_TO": {"value": "", "global": True, "method": "default"}, - "USE_ANTIBOT": {"value": "no", "global": True, "method": "default"}, - "USE_METRICS": {"value": "yes", "global": True, "method": "default"}, - "USE_REAL_IP": {"value": "no", "global": True, "method": "default"}, - "DATABASE_URI": {"value": "sqlite:////var/lib/bunkerweb/db.sqlite3", "global": True, "method": "default"}, - "USE_GREYLIST": {"value": "no", "global": True, "method": "default"}, - "CUSTOM_HEADER": {"value": "", "global": True, "method": "default"}, - "USE_BLACKLIST": {"value": "no", "global": True, "method": "scheduler"}, - "USE_BUNKERNET": {"value": "no", "global": True, "method": "scheduler"}, - "USE_LIMIT_REQ": {"value": "yes", "global": True, "method": "default"}, - "USE_WHITELIST": {"value": "no", "global": True, "method": "scheduler"}, - "USE_AUTH_BASIC": {"value": "no", "global": True, "method": "default"}, - "USE_CUSTOM_SSL": {"value": "no", "global": True, "method": "default"}, - "PRO_LICENSE_KEY": {"value": "", "global": True, "method": "default"}, - "SESSIONS_SECRET": {"value": "random", "global": True, "method": "default"}, - "USE_MODSECURITY": {"value": "yes", "global": True, "method": "default"}, - "USE_SECURITYTXT": {"value": "no", "global": True, "method": "default"}, - "USE_BAD_BEHAVIOR": {"value": "yes", "global": True, "method": "default"}, - "USE_CLIENT_CACHE": {"value": "yes", "global": True, "method": "scheduler"}, - "USE_REVERSE_SCAN": {"value": "no", "global": True, "method": "default"}, - "AUTO_LETS_ENCRYPT": {"value": "no", "global": True, "method": "default"}, - "BLACKLIST_COUNTRY": {"value": "", "global": True, "method": "default"}, - "USE_REVERSE_PROXY": {"value": "no", "global": True, "method": "default"}, - "DISABLE_DEFAULT_SERVER": {"value": "yes", "global": True, "method": "scheduler"}, - "GENERATE_SELF_SIGNED_SSL": {"value": "no", "global": True, "method": "default"}, - "UI_HOST": {"value": "", "global": True, "method": "default"}, - "DNSBL_LIST": {"value": "bl.blocklist.de problems.dnsbl.sorbs.net sbl.spamhaus.org xbl.spamhaus.org", "global": True, "method": "default"}, - "GZIP_TYPES": { - "value": "application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml", - "global": True, - "method": "default", - }, - "REDIS_HOST": {"value": "", "global": True, "method": "default"}, - "ANTIBOT_URI": {"value": "/challenge", "global": True, "method": "default"}, - "GREYLIST_IP": {"value": "", "global": True, "method": "default"}, - "BLACKLIST_IP": {"value": "", "global": True, "method": "default"}, - "BROTLI_TYPES": { - "value": "application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml", - "global": True, - "method": "default", - }, - "NGINX_PREFIX": {"value": "/etc/nginx/", "global": True, "method": "default"}, - "WHITELIST_IP": { - "value": "20.191.45.212 40.88.21.235 40.76.173.151 40.76.163.7 20.185.79.47 52.142.26.175 20.185.79.15 52.142.24.149 40.76.162.208 40.76.163.23 40.76.162.191 40.76.162.247", - "global": True, - "method": "default", - }, - "LIMIT_REQ_URL": {"value": "/", "global": True, "method": "default"}, - "SESSIONS_NAME": {"value": "random", "global": True, "method": "default"}, - "REMOVE_HEADERS": {"value": "Server Expect-CT X-Powered-By X-AspNet-Version X-AspNetMvc-Version Public-Key-Pins", "global": True, "method": "default"}, - "BACKUP_SCHEDULE": {"value": "daily", "global": True, "method": "default"}, - "CUSTOM_SSL_CERT": {"value": "", "global": True, "method": "default"}, - "REMOTE_PHP_PATH": {"value": "", "global": True, "method": "default"}, - "SECURITYTXT_URI": {"value": "/.well-known/security.txt", "global": True, "method": "default"}, - "BUNKERNET_SERVER": {"value": "https://api.bunkerweb.io", "global": True, "method": "default"}, - "CORS_ALLOW_ORIGIN": {"value": "self", "global": True, "method": "default"}, - "WHITELIST_COUNTRY": {"value": "", "global": True, "method": "default"}, - "EMAIL_LETS_ENCRYPT": {"value": "", "global": True, "method": "default"}, - "REVERSE_SCAN_PORTS": {"value": "22 80 443 3128 8000 8080", "global": True, "method": "default"}, - "USE_PROXY_PROTOCOL": {"value": "no", "global": True, "method": "default"}, - "AUTH_BASIC_LOCATION": {"value": "sitewide", "global": True, "method": "default"}, - "METRICS_MEMORY_SIZE": {"value": "16m", "global": True, "method": "default"}, - "USE_MODSECURITY_CRS": {"value": "yes", "global": True, "method": "default"}, - "DATABASE_URI_READONLY": {"value": "", "global": True, "method": "default"}, - "SELF_SIGNED_SSL_EXPIRY": {"value": "365", "global": True, "method": "default"}, - "CLIENT_CACHE_EXTENSIONS": {"value": "jpg|jpeg|png|bmp|ico|svg|tif|css|js|otf|ttf|eot|woff|woff2", "global": True, "method": "default"}, - "INTERCEPTED_ERROR_CODES": {"value": "400 401 403 404 405 413 429 500 501 502 503 504", "global": True, "method": "default"}, - "REDIRECT_TO_REQUEST_URI": {"value": "no", "global": True, "method": "default"}, - "BAD_BEHAVIOR_STATUS_CODES": {"value": "400 401 403 404 405 429 444", "global": True, "method": "default"}, - "REVERSE_PROXY_INTERCEPT_ERRORS": {"value": "yes", "global": True, "method": "default"}, - "DISABLE_DEFAULT_SERVER_STRICT_SNI": {"value": "no", "global": True, "method": "default"}, - "HTTP_PORT": {"value": "8080", "global": True, "method": "default"}, - "LOCAL_PHP": {"value": "", "global": True, "method": "default"}, - "REDIS_PORT": {"value": "6379", "global": True, "method": "default"}, - "REAL_IP_FROM": {"value": "192.168.0.0/16 172.16.0.0/12 10.0.0.0/8", "global": True, "method": "default"}, - "GREYLIST_RDNS": {"value": "", "global": True, "method": "default"}, - "BLACKLIST_RDNS": {"value": ".shodan.io .censys.io", "global": True, "method": "default"}, - "CUSTOM_SSL_KEY": {"value": "", "global": True, "method": "default"}, - "LIMIT_REQ_RATE": {"value": "2r/s", "global": True, "method": "default"}, - "WHITELIST_RDNS": { - "value": ".google.com .googlebot.com .yandex.ru .yandex.net .yandex.com .search.msn.com .baidu.com .baidu.jp .crawl.yahoo.net .fwd.linkedin.com .twitter.com .twttr.com .discord.com", - "global": True, - "method": "default", - }, - "AUTH_BASIC_USER": {"value": "changeme", "global": True, "method": "default"}, - "BACKUP_ROTATION": {"value": "7", "global": True, "method": "default"}, - "GZIP_MIN_LENGTH": {"value": "1000", "global": True, "method": "default"}, - "BROTLI_MIN_LENGTH": {"value": "1000", "global": True, "method": "default"}, - "CLIENT_CACHE_ETAG": {"value": "yes", "global": True, "method": "default"}, - "CORS_ALLOW_METHODS": {"value": "GET, POST, OPTIONS", "global": True, "method": "default"}, - "DATABASE_LOG_LEVEL": {"value": "warning", "global": True, "method": "default"}, - "SECURITYTXT_CONTACT": {"value": "", "global": True, "method": "default"}, - "ANTIBOT_TIME_RESOLVE": {"value": "60", "global": True, "method": "default"}, - "REVERSE_SCAN_TIMEOUT": {"value": "500", "global": True, "method": "default"}, - "SELF_SIGNED_SSL_SUBJ": {"value": "/CN=www.example.com/", "global": True, "method": "default"}, - "KEEP_UPSTREAM_HEADERS": {"value": "Content-Security-Policy Permissions-Policy X-Frame-Options", "global": True, "method": "default"}, - "BAD_BEHAVIOR_THRESHOLD": {"value": "10", "global": True, "method": "default"}, - "REDIRECT_HTTP_TO_HTTPS": {"value": "no", "global": True, "method": "default"}, - "REDIRECT_TO_STATUS_CODE": {"value": "301", "global": True, "method": "default"}, - "SESSIONS_IDLING_TIMEOUT": {"value": "1800", "global": True, "method": "default"}, - "USE_LETS_ENCRYPT_STAGING": {"value": "no", "global": True, "method": "default"}, - "REVERSE_PROXY_CUSTOM_HOST": {"value": "", "global": True, "method": "default"}, - "USE_MODSECURITY_CRS_PLUGINS": {"value": "yes", "global": True, "method": "default"}, - "METRICS_MAX_BLOCKED_REQUESTS": {"value": "100", "global": True, "method": "default"}, - "HTTPS_PORT": {"value": "8443", "global": True, "method": "default"}, - "LOCAL_PHP_PATH": {"value": "", "global": True, "method": "default"}, - "REAL_IP_HEADER": {"value": "X-Forwarded-For", "global": True, "method": "default"}, - "REDIS_DATABASE": {"value": "0", "global": True, "method": "default"}, - "USE_LIMIT_CONN": {"value": "yes", "global": True, "method": "default"}, - "GZIP_COMP_LEVEL": {"value": "5", "global": True, "method": "default"}, - "BACKUP_DIRECTORY": {"value": "/var/lib/bunkerweb/backups", "global": True, "method": "default"}, - "BROTLI_COMP_LEVEL": {"value": "6", "global": True, "method": "default"}, - "ANTIBOT_TIME_VALID": {"value": "86400", "global": True, "method": "default"}, - "CORS_ALLOW_HEADERS": {"value": "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range", "global": True, "method": "default"}, - "AUTH_BASIC_PASSWORD": {"value": "changeme", "global": True, "method": "default"}, - "SECURITYTXT_EXPIRES": {"value": "", "global": True, "method": "default"}, - "CLIENT_CACHE_CONTROL": {"value": "public, max-age=15552000", "global": True, "method": "default"}, - "CUSTOM_SSL_CERT_DATA": {"value": "", "global": True, "method": "default"}, - "GREYLIST_RDNS_GLOBAL": {"value": "yes", "global": True, "method": "default"}, - "BLACKLIST_RDNS_GLOBAL": {"value": "yes", "global": True, "method": "default"}, - "REVERSE_PROXY_SSL_SNI": {"value": "no", "global": True, "method": "default"}, - "WHITELIST_RDNS_GLOBAL": {"value": "yes", "global": True, "method": "default"}, - "BAD_BEHAVIOR_COUNT_TIME": {"value": "60", "global": True, "method": "default"}, - "MODSECURITY_CRS_VERSION": {"value": "4", "global": True, "method": "default"}, - "SESSIONS_ROLLING_TIMEOUT": {"value": "3600", "global": True, "method": "default"}, - "STRICT_TRANSPORT_SECURITY": {"value": "max-age=31536000; includeSubDomains; preload", "global": True, "method": "default"}, - "AUTO_REDIRECT_HTTP_TO_HTTPS": {"value": "yes", "global": True, "method": "default"}, - "LETS_ENCRYPT_CLEAR_OLD_CERTS": {"value": "no", "global": True, "method": "default"}, - "MULTISITE": {"value": "yes", "global": True, "method": "scheduler"}, - "REDIS_SSL": {"value": "no", "global": True, "method": "default"}, - "COOKIE_FLAGS": {"value": "* HttpOnly SameSite=Lax", "global": True, "method": "default"}, - "GREYLIST_ASN": {"value": "", "global": True, "method": "default"}, - "GZIP_PROXIED": {"value": "no-cache no-store private expired auth", "global": True, "method": "default"}, - "BLACKLIST_ASN": {"value": "", "global": True, "method": "default"}, - "WHITELIST_ASN": {"value": "32934", "global": True, "method": "default"}, - "ALLOWED_METHODS": {"value": "GET|POST|HEAD", "global": True, "method": "default"}, - "AUTH_BASIC_TEXT": {"value": "Restricted area", "global": True, "method": "default"}, - "REAL_IP_RECURSIVE": {"value": "yes", "global": True, "method": "default"}, - "CUSTOM_SSL_KEY_DATA": {"value": "", "global": True, "method": "default"}, - "LIMIT_CONN_MAX_HTTP1": {"value": "10", "global": True, "method": "default"}, - "BAD_BEHAVIOR_BAN_TIME": {"value": "86400", "global": True, "method": "default"}, - "CORS_ALLOW_CREDENTIALS": {"value": "no", "global": True, "method": "default"}, - "SECURITYTXT_ENCRYPTION": {"value": "", "global": True, "method": "default"}, - "ANTIBOT_RECAPTCHA_SCORE": {"value": "0.7", "global": True, "method": "default"}, - "SESSIONS_ABSOLUTE_TIMEOUT": {"value": "86400", "global": True, "method": "default"}, - "REVERSE_PROXY_SSL_SNI_NAME": {"value": "", "global": True, "method": "default"}, - "MODSECURITY_CRS_PLUGIN_URLS": {"value": "", "global": True, "method": "default"}, - "SERVER_NAME": {"value": "app1.example.com www.example.com", "global": True, "method": "default"}, - "MAX_CLIENT_SIZE": {"value": "10m", "global": True, "method": "default"}, - "REDIS_SSL_VERIFY": {"value": "no", "global": True, "method": "default"}, - "REAL_IP_FROM_URLS": {"value": "", "global": True, "method": "default"}, - "SESSIONS_CHECK_IP": {"value": "yes", "global": True, "method": "default"}, - "REVERSE_PROXY_HOST": {"value": "dzq", "global": True, "method": "ui"}, - "CORS_EXPOSE_HEADERS": {"value": "Content-Length,Content-Range", "global": True, "method": "default"}, - "GREYLIST_USER_AGENT": {"value": "", "global": True, "method": "default"}, - "BLACKLIST_USER_AGENT": {"value": "", "global": True, "method": "default"}, - "LIMIT_CONN_MAX_HTTP2": {"value": "100", "global": True, "method": "default"}, - "WHITELIST_USER_AGENT": {"value": "", "global": True, "method": "default"}, - "COOKIE_AUTO_SECURE_FLAG": {"value": "yes", "global": True, "method": "default"}, - "ANTIBOT_RECAPTCHA_SITEKEY": {"value": "", "global": True, "method": "default"}, - "MODSECURITY_SEC_AUDIT_ENGINE": {"value": "RelevantOnly", "global": True, "method": "default"}, - "SECURITYTXT_ACKNOWLEDGEMENTS": {"value": "", "global": True, "method": "default"}, - "SERVE_FILES": {"value": "no", "global": True, "method": "scheduler"}, - "GREYLIST_URI": {"value": "", "global": True, "method": "default"}, - "BLACKLIST_URI": {"value": "", "global": True, "method": "default"}, - "REDIS_TIMEOUT": {"value": "1000", "global": True, "method": "default"}, - "WHITELIST_URI": {"value": "", "global": True, "method": "default"}, - "WORKER_PROCESSES": {"value": "auto", "global": True, "method": "default"}, - "REVERSE_PROXY_URL": {"value": "/", "global": True, "method": "default"}, - "LIMIT_CONN_MAX_STREAM": {"value": "10", "global": True, "method": "default"}, - "CONTENT_SECURITY_POLICY": {"value": "object-src 'none'; form-action 'self'; frame-ancestors 'self';", "global": True, "method": "default"}, - "ANTIBOT_RECAPTCHA_SECRET": {"value": "", "global": True, "method": "default"}, - "SESSIONS_CHECK_USER_AGENT": {"value": "yes", "global": True, "method": "default"}, - "CROSS_ORIGIN_OPENER_POLICY": {"value": "same-origin", "global": True, "method": "default"}, - "SECURITYTXT_PREFERRED_LANG": {"value": "en", "global": True, "method": "default"}, - "MODSECURITY_SEC_RULE_ENGINE": {"value": "On", "global": True, "method": "default"}, - "ROOT_FOLDER": {"value": "", "global": True, "method": "default"}, - "REDIS_USERNAME": {"value": "", "global": True, "method": "default"}, - "GREYLIST_IP_URLS": {"value": "", "global": True, "method": "default"}, - "REVERSE_PROXY_WS": {"value": "no", "global": True, "method": "default"}, - "WHITELIST_IP_URLS": {"value": "", "global": True, "method": "default"}, - "BLACKLIST_IGNORE_IP": {"value": "", "global": True, "method": "default"}, - "WORKER_RLIMIT_NOFILE": {"value": "2048", "global": True, "method": "default"}, - "SECURITYTXT_CANONICAL": {"value": "", "global": True, "method": "default"}, - "ANTIBOT_HCAPTCHA_SITEKEY": {"value": "", "global": True, "method": "default"}, - "CROSS_ORIGIN_EMBEDDER_POLICY": {"value": "require-corp", "global": True, "method": "default"}, - "MODSECURITY_SEC_AUDIT_LOG_PARTS": {"value": "ABCFHZ", "global": True, "method": "default"}, - "CONTENT_SECURITY_POLICY_REPORT_ONLY": {"value": "no", "global": True, "method": "default"}, - "SSL_PROTOCOLS": {"value": "TLSv1.2 TLSv1.3", "global": True, "method": "default"}, - "REDIS_PASSWORD": {"value": "", "global": True, "method": "default"}, - "REFERRER_POLICY": {"value": "strict-origin-when-cross-origin", "global": True, "method": "default"}, - "GREYLIST_RDNS_URLS": {"value": "", "global": True, "method": "default"}, - "SECURITYTXT_POLICY": {"value": "", "global": True, "method": "default"}, - "WORKER_CONNECTIONS": {"value": "1024", "global": True, "method": "default"}, - "WHITELIST_2024-07-27T15:51:01.203516525Z RDNS_URLS": {"value": "", "global": True, "method": "default"}, - "BLACKLIST_IGNORE_RDNS": {"value": "", "global": True, "method": "default"}, - "REVERSE_PROXY_HEADERS": {"value": "", "global": True, "method": "default"}, - "ANTIBOT_HCAPTCHA_SECRET": {"value": "", "global": True, "method": "default"}, - "CROSS_ORIGIN_RESOURCE_POLICY": {"value": "same-site", "global": True, "method": "default"}, - "HTTP2": {"value": "yes", "global": True, "method": "default"}, - "LOG_FORMAT": { - "value": '$host $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"', - "global": True, - "method": "default", - }, - "CORS_MAX_AGE": {"value": "86400", "global": True, "method": "default"}, - "GREYLIST_ASN_URLS": {"value": "", "global": True, "method": "default"}, - "PERMISSIONS_POLICY": { - "value": "accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), battery=(), bluetooth=(), browsing-topics=(), camera=(), compute-pressure=(), display-capture=(), document-domain=(), encrypted-media=(), execution-while-not-rendered=(), execution-while-out-of-viewport=(), fullscreen=(), gamepad=(), geolocation=(), gyroscope=(), hid=(), identity-credentials-get=(), idle-detection=(), local-fonts=(), magnetometer=(), microphone=(), midi=(), otp-credentials=(), payment=(), picture-in-picture=(), publickey-credentials-create=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), speaker-selection=(), storage-access=(), usb=(), web-share=(), window-management=(), xr-spatial-tracking=()", - "global": True, - "method": "default", - }, - "SECURITYTXT_HIRING": {"value": "", "global": True, "method": "default"}, - "WHITELIST_ASN_URLS": {"value": "", "global": True, "method": "default"}, - "BLACKLIST_IGNORE_ASN": {"value": "", "global": True, "method": "default"}, - "REDIS_SENTINEL_HOSTS": {"value": "", "global": True, "method": "default"}, - "ANTIBOT_TURNSTILE_SITEKEY": {"value": "", "global": True, "method": "default"}, - "REVERSE_PROXY_HEADERS_CLIENT": {"value": "", "global": True, "method": "default"}, - "HTTP3": {"value": "no", "global": True, "method": "default"}, - "LOG_LEVEL": {"value": "info", "global": True, "method": "scheduler"}, - "DISABLE_FLOC": {"value": "yes", "global": True, "method": "default"}, - "SECURITYTXT_CSAF": {"value": "", "global": True, "method": "default"}, - "CORS_DENY_REQUEST": {"value": "yes", "global": True, "method": "default"}, - "REDIS_SENTINEL_USERNAME": {"value": "", "global": True, "method": "default"}, - "REVERSE_PROXY_BUFFERING": {"value": "yes", "global": True, "method": "default"}, - "ANTIBOT_TURNSTILE_SECRET": {"value": "", "global": True, "method": "default"}, - "GREYLIST_USER_AGENT_URLS": {"value": "", "global": True, "method": "default"}, - "WHITELIST_USER_AGENT_URLS": {"value": "", "global": True, "method": "default"}, - "BLACKLIST_IGNORE_USER_AGENT": {"value": "", "global": True, "method": "default"}, - "DNS_RESOLVERS": {"value": "127.0.0.11", "global": True, "method": "default"}, - "X_FRAME_OPTIONS": {"value": "SAMEORIGIN", "global": True, "method": "default"}, - "GREYLIST_URI_URLS": {"value": "", "global": True, "method": "default"}, - "HTTP3_ALT_SVC_PORT": {"value": "443", "global": True, "method": "default"}, - "WHITELIST_URI_URLS": {"value": "", "global": True, "method": "default"}, - "BLACKLIST_IGNORE_URI": {"value": "", "global": True, "method": "default"}, - "REDIS_SENTINEL_PASSWORD": {"value": "", "global": True, "method": "default"}, - "REVERSE_PROXY_KEEPALIVE": {"value": "no", "global": True, "method": "default"}, - "LISTEN_HTTP": {"value": "yes", "global": True, "method": "default"}, - "BLACKLIST_IP_URLS": {"value": "https://www.dan.me.uk/torlist/?exit", "global": True, "method": "default"}, - "DATASTORE_MEMORY_SIZE": {"value": "64m", "global": True, "method": "default"}, - "REDIS_SENTINEL_MASTER": {"value": "", "global": True, "method": "default"}, - "X_CONTENT_TYPE_OPTIONS": {"value": "nosniff", "global": True, "method": "default"}, - "REVERSE_PROXY_AUTH_REQUEST": {"value": "", "global": True, "method": "default"}, - "X_XSS_PROTECTION": {"value": "1; mode=block", "global": True, "method": "default"}, - "BLACKLIST_RDNS_URLS": {"value": "", "global": True, "method": "default"}, - "USE_OPEN_FILE_CACHE": {"value": "no", "global": True, "method": "default"}, - "REDIS_KEEPALIVE_IDLE": {"value": "30000", "global": True, "method": "default"}, - "CACHESTORE_MEMORY_SIZE": {"value": "64m", "global": True, "method": "default"}, - "REVERSE_PROXY_AUTH_REQUEST_SIGNIN_URL": {"value": "", "global": True, "method": "default"}, - "OPEN_FILE_CACHE": {"value": "max=1000 inactive=20s", "global": True, "method": "default"}, - "BLACKLIST_ASN_URLS": {"value": "", "global": True, "method": "default"}, - "REDIS_KEEPALIVE_POOL": {"value": "10", "global": True, "method": "default"}, - "X_DNS_PREFETCH_CONTROL": {"value": "off", "global": True, "method": "default"}, - "CACHESTORE_IPC_MEMORY_SIZE": {"value": "16m", "global": True, "method": "default"}, - "REVERSE_PROXY_AUTH_REQUEST_SET": {"value": "", "global": True, "method": "default"}, - "OPEN_FILE_CACHE_ERRORS": {"value": "yes", "global": True, "method": "default"}, - "BLACKLIST_USER_AGENT_URLS": { - "value": "https://raw.githubusercontent.com/mitchellkrogza/nginx-ultimate-bad-bot-blocker/master/_generator_lists/bad-user-agents.list", - "global": True, - "method": "default", - }, - "CACHESTORE_MISS_MEMORY_SIZE": {"value": "16m", "global": True, "method": "default"}, - "REVERSE_PROXY_CONNECT_TIMEOUT": {"value": "60s", "global": True, "method": "default"}, - "BLACKLIST_URI_URLS": {"value": "", "global": True, "method": "default"}, - "OPEN_FILE_CACHE_MIN_USES": {"value": "2", "global": True, "method": "default"}, - "REVERSE_PROXY_READ_TIMEOUT": {"value": "60s", "global": True, "method": "default"}, - "CACHESTORE_LOCKS_MEMORY_SIZE": {"value": "16m", "global": True, "method": "default"}, - "USE_API": {"value": "yes", "global": True, "method": "default"}, - "OPEN_FILE_CACHE_VALID": {"value": "30s", "global": True, "method": "default"}, - "BLACKLIST_IGNORE_IP_URLS": {"value": "", "global": True, "method": "default"}, - "REVERSE_PROXY_SEND_TIMEOUT": {"value": "60s", "global": True, "method": "default"}, - "API_HTTP_PORT": {"value": "5000", "global": True, "method": "default"}, - "EXTERNAL_PLUGIN_URLS": {"value": "", "global": True, "method": "default"}, - "REVERSE_PROXY_INCLUDES": {"value": "", "global": True, "method": "default"}, - "BLACKLIST_IGNORE_RDNS_URLS": {"value": "", "global": True, "method": "default"}, - "API_LISTEN_IP": {"value": "0.0.0.0", "global": True, "method": "default"}, - "DENY_HTTP_STATUS": {"value": "403", "global": True, "method": "default"}, - "BLACKLIST_IGNORE_ASN_URLS": {"value": "", "global": True, "method": "default"}, - "REVERSE_PROXY_PASS_REQUEST_BODY": {"value": "yes", "global": True, "method": "default"}, - "API_SERVER_NAME": {"value": "bwapi", "global": True, "method": "default"}, - "USE_PROXY_CACHE": {"value": "no", "global": True, "method": "default"}, - "SEND_ANONYMOUS_REPORT": {"value": "no", "global": True, "method": "scheduler"}, - "BLACKLIST_IGNORE_USER_AGENT_URLS": {"value": "", "global": True, "method": "default"}, - "API_WHITELIST_IP": {"value": "127.0.0.0/24 10.20.30.0/24", "global": True, "method": "scheduler"}, - "PROXY_CACHE_PATH_LEVELS": {"value": "1:2", "global": True, "method": "default"}, - "BLACKLIST_IGNORE_URI_URLS": {"value": "", "global": True, "method": "default"}, - "AUTOCONF_MODE": {"value": "no", "global": True, "method": "default"}, - "PROXY_CACHE_PATH_ZONE_SIZE": {"value": "10m", "global": True, "method": "default"}, - "SWARM_MODE": {"value": "no", "global": True, "method": "default"}, - "PROXY_CACHE_PATH_PARAMS": {"value": "max_size=100m", "global": True, "method": "default"}, - "KUBERNETES_MODE": {"value": "no", "global": True, "method": "default"}, - "PROXY_CACHE_METHODS": {"value": "GET HEAD", "global": True, "method": "default"}, - "SERVER_TYPE": {"value": "http", "global": True, "method": "default"}, - "PROXY_CACHE_MIN_USES": {"value": "2", "global": True, "method": "default"}, - "LISTEN_STREAM": {"value": "yes", "global": True, "method": "default"}, - "PROXY_CACHE_KEY": {"value": "$scheme$host$request_uri", "global": True, "method": "default"}, - "PROXY_CACHE_VALID": {"value": "200=24h 301=1h 302=24h", "global": True, "method": "default"}, - "LISTEN_STREAM_PORT": {"value": "1337", "global": True, "method": "default"}, - "PROXY_NO_CACHE": {"value": "$http_pragma $http_authorization", "global": True, "method": "default"}, - "LISTEN_STREAM_PORT_SSL": {"value": "4242", "global": True, "method": "default"}, - "USE_UDP": {"value": "no", "global": True, "method": "default"}, - "PROXY_CACHE_BYPASS": {"value": "0", "global": True, "method": "default"}, - "USE_IPV6": {"value": "no", "global": True, "method": "default"}, - "IS_DRAFT": {"value": "no", "global": True, "method": "default"}, - "TIMERS_LOG_LEVEL": {"value": "debug", "global": True, "method": "default"}, - "BUNKERWEB_INSTANCES": {"value": "bunkerweb", "global": True, "method": "scheduler"}, -} - -templates = [ - { - "name": "default", - "steps": [], - "configs": {}, - "settings": {}, - } -] - -output = global_config_builder(templates, plugins, global_config) -with open("globalconfig.json", "w") as f: - json.dump(output, f, indent=4) - -output_base64_bytes = base64.b64encode(bytes(json.dumps(output), "utf-8")) -output_base64_string = output_base64_bytes.decode("ascii") -with open("globalconfig64.txt", "w") as f: - f.write(output_base64_string) diff --git a/src/ui/client/tests/globalconfig64.txt b/src/ui/client/tests/globalconfig64.txt deleted file mode 100644 index a28d0ce5d..000000000 --- a/src/ui/client/tests/globalconfig64.txt +++ /dev/null @@ -1 +0,0 @@ -W3sidHlwZSI6ICJjYXJkIiwgImNvbnRhaW5lckNvbHVtbnMiOiB7InBjIjogMTIsICJ0YWJsZXQiOiAxMiwgIm1vYmlsZSI6IDEyfSwgIndpZGdldHMiOiBbeyJ0eXBlIjogIlRpdGxlIiwgImRhdGEiOiB7InRpdGxlIjogImdsb2JhbF9jb25maWdfdGl0bGUiLCAidHlwZSI6ICJjb250YWluZXIifX0sIHsidHlwZSI6ICJTdWJ0aXRsZSIsICJkYXRhIjogeyJzdWJ0aXRsZSI6ICJnbG9iYWxfY29uZmlnX3N1YnRpdGxlIiwgInR5cGUiOiAiY29udGFpbmVyIn19LCB7InR5cGUiOiAiVGVtcGxhdGVzIiwgImRhdGEiOiB7InRlbXBsYXRlcyI6IHsiYWR2YW5jZWQiOiB7ImRlZmF1bHQiOiBbeyJpZCI6ICJnZW5lcmFsIiwgInN0cmVhbSI6ICJwYXJ0aWFsIiwgIm5hbWUiOiAiR2VuZXJhbCIsICJkZXNjcmlwdGlvbiI6ICJUaGUgZ2VuZXJhbCBzZXR0aW5ncyBmb3IgdGhlIHNlcnZlciIsICJ2ZXJzaW9uIjogIjAuMSIsICJ0eXBlIjogImNvcmUiLCAibWV0aG9kIjogIm1hbnVhbCIsICJwYWdlIjogZmFsc2UsICJzZXR0aW5ncyI6IHsiSVNfTE9BRElORyI6IHsiY29udGV4dCI6ICJnbG9iYWwiLCAiZGVmYXVsdCI6ICJubyIsICJoZWxwIjogIkludGVybmFsIHVzZSA6IHNldCB0byB5ZXMgd2hlbiBCVyBpcyBsb2FkaW5nLiIsICJpZCI6ICJpbnRlcm5hbC11c2UtbG9hZGluZyIsICJsYWJlbCI6ICJpbnRlcm5hbCB1c2UgbG9hZGluZyIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAiY29udGFpbmVyQ2xhc3MiOiAiei0zMyIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJuYW1lIjogImludGVybmFsIHVzZSBsb2FkaW5nIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAibm8iLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICJubyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImdsb2JlIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfZ2xvYmFsIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkludGVybmFsIHVzZSA6IHNldCB0byB5ZXMgd2hlbiBCVyBpcyBsb2FkaW5nLiJ9XX0sICJOR0lOWF9QUkVGSVgiOiB7ImNvbnRleHQiOiAiZ2xvYmFsIiwgImRlZmF1bHQiOiAiL2V0Yy9uZ2lueC8iLCAiaGVscCI6ICJXaGVyZSBuZ2lueCB3aWxsIHNlYXJjaCBmb3IgY29uZmlndXJhdGlvbnMuIiwgImlkIjogIm5naW54LXByZWZpeCIsICJsYWJlbCI6ICJuZ2lueCBwcmVmaXgiLCAicmVnZXgiOiAiXihcXC9bXFwtXFx3Llxcc10rKSpcXC8kIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTMyIiwgInBhdHRlcm4iOiAiXihcXC9bXFwtXFx3Llxcc10rKSpcXC8kIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJuZ2lueCBwcmVmaXgiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIvZXRjL25naW54LyIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIi9ldGMvbmdpbngvIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZ2xvYmUiLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9nbG9iYWwifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiV2hlcmUgbmdpbnggd2lsbCBzZWFyY2ggZm9yIGNvbmZpZ3VyYXRpb25zLiJ9XX0sICJIVFRQX1BPUlQiOiB7ImNvbnRleHQiOiAiZ2xvYmFsIiwgImRlZmF1bHQiOiAiODA4MCIsICJoZWxwIjogIkhUVFAgcG9ydCBudW1iZXIgd2hpY2ggYnVua2Vyd2ViIGJpbmRzIHRvLiIsICJpZCI6ICJodHRwLXBvcnQiLCAibGFiZWwiOiAiSFRUUCBwb3J0IiwgInJlZ2V4IjogIl5cXGQrJCIsICJ0eXBlIjogInRleHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0zMSIsICJwYXR0ZXJuIjogIl5cXGQrJCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiSFRUUCBwb3J0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiODA4MCIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIjgwODAiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJnbG9iZSIsICJ0ZXh0IjogImlucF9wb3BvdmVyX2dsb2JhbCJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJIVFRQIHBvcnQgbnVtYmVyIHdoaWNoIGJ1bmtlcndlYiBiaW5kcyB0by4ifV19LCAiSFRUUFNfUE9SVCI6IHsiY29udGV4dCI6ICJnbG9iYWwiLCAiZGVmYXVsdCI6ICI4NDQzIiwgImhlbHAiOiAiSFRUUFMgcG9ydCBudW1iZXIgd2hpY2ggYnVua2Vyd2ViIGJpbmRzIHRvLiIsICJpZCI6ICJodHRwcy1wb3J0IiwgImxhYmVsIjogIkhUVFBTIHBvcnQiLCAicmVnZXgiOiAiXlxcZCskIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTMwIiwgInBhdHRlcm4iOiAiXlxcZCskIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJIVFRQUyBwb3J0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiODQ0MyIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIjg0NDMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJnbG9iZSIsICJ0ZXh0IjogImlucF9wb3BvdmVyX2dsb2JhbCJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJIVFRQUyBwb3J0IG51bWJlciB3aGljaCBidW5rZXJ3ZWIgYmluZHMgdG8uIn1dfSwgIk1VTFRJU0lURSI6IHsiY29udGV4dCI6ICJnbG9iYWwiLCAiZGVmYXVsdCI6ICJubyIsICJoZWxwIjogIk11bHRpIHNpdGUgYWN0aXZhdGlvbi4iLCAiaWQiOiAibXVsdGlzaXRlIiwgImxhYmVsIjogIk11bHRpc2l0ZSIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yOSIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJuYW1lIjogIk11bHRpc2l0ZSIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiB0cnVlLCAidmFsdWUiOiAieWVzIiwgIm1ldGhvZCI6ICJzY2hlZHVsZXIiLCAicHJldl92YWx1ZSI6ICJ5ZXMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJ0cmVzcGFzcyIsICJ0ZXh0IjogImlucF9wb3BvdmVyX21ldGhvZF9kaXNhYmxlZCJ9LCB7Imljb25OYW1lIjogImdsb2JlIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfZ2xvYmFsIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIk11bHRpIHNpdGUgYWN0aXZhdGlvbi4ifV19LCAiU0VSVkVSX05BTUUiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAid3d3LmV4YW1wbGUuY29tIiwgImhlbHAiOiAiTGlzdCBvZiB0aGUgdmlydHVhbCBob3N0cyBzZXJ2ZWQgYnkgYnVua2Vyd2ViLiIsICJpZCI6ICJzZXJ2ZXItbmFtZSIsICJsYWJlbCI6ICJTZXJ2ZXIgbmFtZSIsICJyZWdleCI6ICJeKChcXFN7MSwyNTV9KSg/IS4qXFxzXFwyKFxcc3wkKSkpPyhcXHMoXFxTezEsMjU1fSkoPyEuKlxcc1xcNShcXHN8JCkpKSokIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTI4IiwgInBhdHRlcm4iOiAiXigoXFxTezEsMjU1fSkoPyEuKlxcc1xcMihcXHN8JCkpKT8oXFxzKFxcU3sxLDI1NX0pKD8hLipcXHNcXDUoXFxzfCQpKSkqJCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiU2VydmVyIG5hbWUiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJhcHAxLmV4YW1wbGUuY29tIHd3dy5leGFtcGxlLmNvbSIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogImFwcDEuZXhhbXBsZS5jb20gd3d3LmV4YW1wbGUuY29tIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJMaXN0IG9mIHRoZSB2aXJ0dWFsIGhvc3RzIHNlcnZlZCBieSBidW5rZXJ3ZWIuIn1dfSwgIldPUktFUl9QUk9DRVNTRVMiOiB7ImNvbnRleHQiOiAiZ2xvYmFsIiwgImRlZmF1bHQiOiAiYXV0byIsICJoZWxwIjogIk51bWJlciBvZiB3b3JrZXIgcHJvY2Vzc2VzLiIsICJpZCI6ICJ3b3JrZXItcHJvY2Vzc2VzIiwgImxhYmVsIjogIldvcmtlciBwcm9jZXNzZXMiLCAicmVnZXgiOiAiXihhdXRvfFxcZCspJCIsICJ0eXBlIjogInRleHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yNyIsICJwYXR0ZXJuIjogIl4oYXV0b3xcXGQrKSQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIldvcmtlciBwcm9jZXNzZXMiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJhdXRvIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAiYXV0byIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImdsb2JlIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfZ2xvYmFsIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIk51bWJlciBvZiB3b3JrZXIgcHJvY2Vzc2VzLiJ9XX0sICJXT1JLRVJfUkxJTUlUX05PRklMRSI6IHsiY29udGV4dCI6ICJnbG9iYWwiLCAiZGVmYXVsdCI6ICIyMDQ4IiwgImhlbHAiOiAiTWF4aW11bSBudW1iZXIgb2Ygb3BlbiBmaWxlcyBmb3Igd29ya2VyIHByb2Nlc3Nlcy4iLCAiaWQiOiAid29ya2VyLXJsaW1pdC1ub2ZpbGUiLCAibGFiZWwiOiAiT3BlbiBmaWxlcyBwZXIgd29ya2VyIiwgInJlZ2V4IjogIl5cXGQrJCIsICJ0eXBlIjogInRleHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yNiIsICJwYXR0ZXJuIjogIl5cXGQrJCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiT3BlbiBmaWxlcyBwZXIgd29ya2VyIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiMjA0OCIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIjIwNDgiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJnbG9iZSIsICJ0ZXh0IjogImlucF9wb3BvdmVyX2dsb2JhbCJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJNYXhpbXVtIG51bWJlciBvZiBvcGVuIGZpbGVzIGZvciB3b3JrZXIgcHJvY2Vzc2VzLiJ9XX0sICJXT1JLRVJfQ09OTkVDVElPTlMiOiB7ImNvbnRleHQiOiAiZ2xvYmFsIiwgImRlZmF1bHQiOiAiMTAyNCIsICJoZWxwIjogIk1heGltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHBlciB3b3JrZXIuIiwgImlkIjogIndvcmtlci1jb25uZWN0aW9ucyIsICJsYWJlbCI6ICJDb25uZWN0aW9ucyBwZXIgd29ya2VyIiwgInJlZ2V4IjogIl5cXGQrJCIsICJ0eXBlIjogInRleHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yNSIsICJwYXR0ZXJuIjogIl5cXGQrJCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiQ29ubmVjdGlvbnMgcGVyIHdvcmtlciIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjEwMjQiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICIxMDI0IiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZ2xvYmUiLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9nbG9iYWwifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTWF4aW11bSBudW1iZXIgb2YgY29ubmVjdGlvbnMgcGVyIHdvcmtlci4ifV19LCAiTE9HX0ZPUk1BVCI6IHsiY29udGV4dCI6ICJnbG9iYWwiLCAiZGVmYXVsdCI6ICIkaG9zdCAkcmVtb3RlX2FkZHIgLSAkcmVtb3RlX3VzZXIgWyR0aW1lX2xvY2FsXSBcIiRyZXF1ZXN0XCIgJHN0YXR1cyAkYm9keV9ieXRlc19zZW50IFwiJGh0dHBfcmVmZXJlclwiIFwiJGh0dHBfdXNlcl9hZ2VudFwiIiwgImhlbHAiOiAiVGhlIGZvcm1hdCB0byB1c2UgZm9yIGFjY2VzcyBsb2dzLiIsICJpZCI6ICJsb2ctZm9ybWF0IiwgImxhYmVsIjogIkxvZyBmb3JtYXQiLCAicmVnZXgiOiAiXi4qJCIsICJ0eXBlIjogInRleHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yNCIsICJwYXR0ZXJuIjogIl4uKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIkxvZyBmb3JtYXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIkaG9zdCAkcmVtb3RlX2FkZHIgLSAkcmVtb3RlX3VzZXIgWyR0aW1lX2xvY2FsXSBcIiRyZXF1ZXN0XCIgJHN0YXR1cyAkYm9keV9ieXRlc19zZW50IFwiJGh0dHBfcmVmZXJlclwiIFwiJGh0dHBfdXNlcl9hZ2VudFwiIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAiJGhvc3QgJHJlbW90ZV9hZGRyIC0gJHJlbW90ZV91c2VyIFskdGltZV9sb2NhbF0gXCIkcmVxdWVzdFwiICRzdGF0dXMgJGJvZHlfYnl0ZXNfc2VudCBcIiRodHRwX3JlZmVyZXJcIiBcIiRodHRwX3VzZXJfYWdlbnRcIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImdsb2JlIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfZ2xvYmFsIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlRoZSBmb3JtYXQgdG8gdXNlIGZvciBhY2Nlc3MgbG9ncy4ifV19LCAiTE9HX0xFVkVMIjogeyJjb250ZXh0IjogImdsb2JhbCIsICJkZWZhdWx0IjogIm5vdGljZSIsICJoZWxwIjogIlRoZSBsZXZlbCB0byB1c2UgZm9yIGVycm9yIGxvZ3MuIiwgImlkIjogImxvZy1sZXZlbCIsICJsYWJlbCI6ICJMb2cgbGV2ZWwiLCAicmVnZXgiOiAiXihkZWJ1Z3xpbmZvfG5vdGljZXx3YXJufGVycm9yfGNyaXR8YWxlcnR8ZW1lcmcpJCIsICJ0eXBlIjogInNlbGVjdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTIzIiwgInBhdHRlcm4iOiAiXihkZWJ1Z3xpbmZvfG5vdGljZXx3YXJufGVycm9yfGNyaXR8YWxlcnR8ZW1lcmcpJCIsICJpbnBUeXBlIjogInNlbGVjdCIsICJuYW1lIjogIkxvZyBsZXZlbCIsICJ2YWx1ZXMiOiBbImFsZXJ0IiwgImNyaXQiLCAiZGVidWciLCAiZW1lcmciLCAiZXJyb3IiLCAiaW5mbyIsICJub3RpY2UiLCAid2FybiJdLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogdHJ1ZSwgInZhbHVlIjogImluZm8iLCAibWV0aG9kIjogInNjaGVkdWxlciIsICJwcmV2X3ZhbHVlIjogImluZm8iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJ0cmVzcGFzcyIsICJ0ZXh0IjogImlucF9wb3BvdmVyX21ldGhvZF9kaXNhYmxlZCJ9LCB7Imljb25OYW1lIjogImdsb2JlIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfZ2xvYmFsIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlRoZSBsZXZlbCB0byB1c2UgZm9yIGVycm9yIGxvZ3MuIn1dfSwgIkROU19SRVNPTFZFUlMiOiB7ImNvbnRleHQiOiAiZ2xvYmFsIiwgImRlZmF1bHQiOiAiMTI3LjAuMC4xMSIsICJoZWxwIjogIkROUyBhZGRyZXNzZXMgb2YgcmVzb2x2ZXJzIHRvIHVzZS4iLCAiaWQiOiAiZG5zLXJlc29sdmVycyIsICJsYWJlbCI6ICJETlMgcmVzb2x2ZXJzIiwgInJlZ2V4IjogIl4oPyEgKSgoICpbXiBdKykoPyEuKlxcMikpKiQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotMjIiLCAicGF0dGVybiI6ICJeKD8hICkoKCAqW14gXSspKD8hLipcXDIpKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJETlMgcmVzb2x2ZXJzIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiMTI3LjAuMC4xMSIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIjEyNy4wLjAuMTEiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJnbG9iZSIsICJ0ZXh0IjogImlucF9wb3BvdmVyX2dsb2JhbCJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJETlMgYWRkcmVzc2VzIG9mIHJlc29sdmVycyB0byB1c2UuIn1dfSwgIkRBVEFTVE9SRV9NRU1PUllfU0laRSI6IHsiY29udGV4dCI6ICJnbG9iYWwiLCAiZGVmYXVsdCI6ICI2NG0iLCAiaGVscCI6ICJTaXplIG9mIHRoZSBpbnRlcm5hbCBkYXRhc3RvcmUuIiwgImlkIjogImRhdGFzdG9yZS1tZW1vcnktc2l6ZSIsICJsYWJlbCI6ICJEYXRhc3RvcmUgbWVtb3J5IHNpemUiLCAicmVnZXgiOiAiXlxcZCtba0ttTWdHXT8kIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTIxIiwgInBhdHRlcm4iOiAiXlxcZCtba0ttTWdHXT8kIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJEYXRhc3RvcmUgbWVtb3J5IHNpemUiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICI2NG0iLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICI2NG0iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJnbG9iZSIsICJ0ZXh0IjogImlucF9wb3BvdmVyX2dsb2JhbCJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJTaXplIG9mIHRoZSBpbnRlcm5hbCBkYXRhc3RvcmUuIn1dfSwgIkNBQ0hFU1RPUkVfTUVNT1JZX1NJWkUiOiB7ImNvbnRleHQiOiAiZ2xvYmFsIiwgImRlZmF1bHQiOiAiNjRtIiwgImhlbHAiOiAiU2l6ZSBvZiB0aGUgaW50ZXJuYWwgY2FjaGVzdG9yZS4iLCAiaWQiOiAiY2FjaGVzdG9yZS1tZW1vcnktc2l6ZSIsICJsYWJlbCI6ICJDYWNoZXN0b3JlIG1lbW9yeSBzaXplIiwgInJlZ2V4IjogIl5cXGQrW2tLbU1nR10/JCIsICJ0eXBlIjogInRleHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yMCIsICJwYXR0ZXJuIjogIl5cXGQrW2tLbU1nR10/JCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiQ2FjaGVzdG9yZSBtZW1vcnkgc2l6ZSIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjY0bSIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIjY0bSIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImdsb2JlIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfZ2xvYmFsIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlNpemUgb2YgdGhlIGludGVybmFsIGNhY2hlc3RvcmUuIn1dfSwgIkNBQ0hFU1RPUkVfSVBDX01FTU9SWV9TSVpFIjogeyJjb250ZXh0IjogImdsb2JhbCIsICJkZWZhdWx0IjogIjE2bSIsICJoZWxwIjogIlNpemUgb2YgdGhlIGludGVybmFsIGNhY2hlc3RvcmUgKGlwYykuIiwgImlkIjogImNhY2hlc3RvcmUtaXBjLW1lbW9yeS1zaXplIiwgImxhYmVsIjogIkNhY2hlc3RvcmUgaXBjIG1lbW9yeSBzaXplIiwgInJlZ2V4IjogIl5cXGQrW2tLbU1nR10/JCIsICJ0eXBlIjogInRleHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xOSIsICJwYXR0ZXJuIjogIl5cXGQrW2tLbU1nR10/JCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiQ2FjaGVzdG9yZSBpcGMgbWVtb3J5IHNpemUiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIxNm0iLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICIxNm0iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJnbG9iZSIsICJ0ZXh0IjogImlucF9wb3BvdmVyX2dsb2JhbCJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJTaXplIG9mIHRoZSBpbnRlcm5hbCBjYWNoZXN0b3JlIChpcGMpLiJ9XX0sICJDQUNIRVNUT1JFX01JU1NfTUVNT1JZX1NJWkUiOiB7ImNvbnRleHQiOiAiZ2xvYmFsIiwgImRlZmF1bHQiOiAiMTZtIiwgImhlbHAiOiAiU2l6ZSBvZiB0aGUgaW50ZXJuYWwgY2FjaGVzdG9yZSAobWlzcykuIiwgImlkIjogImNhY2hlc3RvcmUtbWlzcy1tZW1vcnktc2l6ZSIsICJsYWJlbCI6ICJDYWNoZXN0b3JlIG1pc3MgbWVtb3J5IHNpemUiLCAicmVnZXgiOiAiXlxcZCtba0ttTWdHXT8kIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTE4IiwgInBhdHRlcm4iOiAiXlxcZCtba0ttTWdHXT8kIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJDYWNoZXN0b3JlIG1pc3MgbWVtb3J5IHNpemUiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIxNm0iLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICIxNm0iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJnbG9iZSIsICJ0ZXh0IjogImlucF9wb3BvdmVyX2dsb2JhbCJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJTaXplIG9mIHRoZSBpbnRlcm5hbCBjYWNoZXN0b3JlIChtaXNzKS4ifV19LCAiQ0FDSEVTVE9SRV9MT0NLU19NRU1PUllfU0laRSI6IHsiY29udGV4dCI6ICJnbG9iYWwiLCAiZGVmYXVsdCI6ICIxNm0iLCAiaGVscCI6ICJTaXplIG9mIHRoZSBpbnRlcm5hbCBjYWNoZXN0b3JlIChsb2NrcykuIiwgImlkIjogImNhY2hlc3RvcmUtbG9ja3MtbWVtb3J5LXNpemUiLCAibGFiZWwiOiAiQ2FjaGVzdG9yZSBsb2NrcyBtZW1vcnkgc2l6ZSIsICJyZWdleCI6ICJeXFxkK1trS21NZ0ddPyQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotMTciLCAicGF0dGVybiI6ICJeXFxkK1trS21NZ0ddPyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIkNhY2hlc3RvcmUgbG9ja3MgbWVtb3J5IHNpemUiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIxNm0iLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICIxNm0iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJnbG9iZSIsICJ0ZXh0IjogImlucF9wb3BvdmVyX2dsb2JhbCJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJTaXplIG9mIHRoZSBpbnRlcm5hbCBjYWNoZXN0b3JlIChsb2NrcykuIn1dfSwgIlVTRV9BUEkiOiB7ImNvbnRleHQiOiAiZ2xvYmFsIiwgImRlZmF1bHQiOiAieWVzIiwgImhlbHAiOiAiQWN0aXZhdGUgdGhlIEFQSSB0byBjb250cm9sIEJ1bmtlcldlYi4iLCAiaWQiOiAidXNlLWFwaSIsICJsYWJlbCI6ICJBY3RpdmF0ZSBBUEkiLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgImNvbnRhaW5lckNsYXNzIjogInotMTYiLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAibmFtZSI6ICJBY3RpdmF0ZSBBUEkiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJ5ZXMiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICJ5ZXMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJnbG9iZSIsICJ0ZXh0IjogImlucF9wb3BvdmVyX2dsb2JhbCJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJBY3RpdmF0ZSB0aGUgQVBJIHRvIGNvbnRyb2wgQnVua2VyV2ViLiJ9XX0sICJBUElfSFRUUF9QT1JUIjogeyJjb250ZXh0IjogImdsb2JhbCIsICJkZWZhdWx0IjogIjUwMDAiLCAiaGVscCI6ICJMaXN0ZW4gcG9ydCBudW1iZXIgZm9yIHRoZSBBUEkuIiwgImlkIjogImFwaS1odHRwLWxpc3RlbiIsICJsYWJlbCI6ICJBUEkgcG9ydCBudW1iZXIiLCAicmVnZXgiOiAiXlxcZCskIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTE1IiwgInBhdHRlcm4iOiAiXlxcZCskIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJBUEkgcG9ydCBudW1iZXIiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICI1MDAwIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAiNTAwMCIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImdsb2JlIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfZ2xvYmFsIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkxpc3RlbiBwb3J0IG51bWJlciBmb3IgdGhlIEFQSS4ifV19LCAiQVBJX0xJU1RFTl9JUCI6IHsiY29udGV4dCI6ICJnbG9iYWwiLCAiZGVmYXVsdCI6ICIwLjAuMC4wIiwgImhlbHAiOiAiTGlzdGVuIElQIGFkZHJlc3MgZm9yIHRoZSBBUEkuIiwgImlkIjogImFwaS1pcC1saXN0ZW4iLCAibGFiZWwiOiAiQVBJIGxpc3RlbiBJUCIsICJyZWdleCI6ICJeLiokIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTE0IiwgInBhdHRlcm4iOiAiXi4qJCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiQVBJIGxpc3RlbiBJUCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjAuMC4wLjAiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICIwLjAuMC4wIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZ2xvYmUiLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9nbG9iYWwifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdGVuIElQIGFkZHJlc3MgZm9yIHRoZSBBUEkuIn1dfSwgIkFQSV9TRVJWRVJfTkFNRSI6IHsiY29udGV4dCI6ICJnbG9iYWwiLCAiZGVmYXVsdCI6ICJid2FwaSIsICJoZWxwIjogIlNlcnZlciBuYW1lICh2aXJ0dWFsIGhvc3QpIGZvciB0aGUgQVBJLiIsICJpZCI6ICJhcGktc2VydmVyLW5hbWUiLCAibGFiZWwiOiAiQVBJIHNlcnZlciBuYW1lIiwgInJlZ2V4IjogIl5bXiBdezEsMjU1fSQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotMTMiLCAicGF0dGVybiI6ICJeW14gXXsxLDI1NX0kIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJBUEkgc2VydmVyIG5hbWUiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJid2FwaSIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogImJ3YXBpIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZ2xvYmUiLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9nbG9iYWwifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiU2VydmVyIG5hbWUgKHZpcnR1YWwgaG9zdCkgZm9yIHRoZSBBUEkuIn1dfSwgIkFQSV9XSElURUxJU1RfSVAiOiB7ImNvbnRleHQiOiAiZ2xvYmFsIiwgImRlZmF1bHQiOiAiMTI3LjAuMC4wLzgiLCAiaGVscCI6ICJMaXN0IG9mIElQL25ldHdvcmsgYWxsb3dlZCB0byBjb250YWN0IHRoZSBBUEkuIiwgImlkIjogImFwaS13aGl0ZWxpc3QtaXAiLCAibGFiZWwiOiAiQVBJIHdoaXRlbGlzdCBJUCIsICJyZWdleCI6ICJeKD8hICkoICooKChcXGIyNVswLTVdfFxcYjJbMC00XVxcZHxcXGJbMDFdP1xcZFxcZD8pKFxcLigyNVswLTVdfDJbMC00XVxcZHxbMDFdP1xcZFxcZD8pKXszfSkoXFwvKFsxLTJdWzAtOV0/fDNbMC0yXT98WzA0LTldKSk/fCgoWzAtOWEtZkEtRl17MSw0fTopezd9WzAtOWEtZkEtRl17MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsN306fChbMC05YS1mQS1GXXsxLDR9Oil7MSw2fTpbMC05YS1mQS1GXXsxLDR9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw1fSg6WzAtOWEtZkEtRl17MSw0fSl7MSwyfXwoWzAtOWEtZkEtRl17MSw0fTopezEsNH0oOlswLTlhLWZBLUZdezEsNH0pezEsM318KFswLTlhLWZBLUZdezEsNH06KXsxLDN9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDR9fChbMC05YS1mQS1GXXsxLDR9Oil7MSwyfSg6WzAtOWEtZkEtRl17MSw0fSl7MSw1fXxbMC05YS1mQS1GXXsxLDR9OigoOlswLTlhLWZBLUZdezEsNH0pezEsNn0pfDooKDpbMC05YS1mQS1GXXsxLDR9KXsxLDd9fDopfGZlODA6KDpbMC05YS1mQS1GXVp7MCw0fSl7MCw0fSVbMC05YS16QS1aXSt8OjooZmZmZig6MHsxLDR9KT86KT8oKDI1WzAtNV18KDJbMC00XXwxP1xcZCk/XFxkKVxcLil7M30oMjVbMC01XXwoMlswLTRdfDE/XFxkKT9cXGQpfChbMC05YS1mQS1GXXsxLDR9Oil7MSw0fTooKDI1WzAtNV18KDJbMC00XXwxP1xcZCk/XFxkKVxcLil7M30oMjVbMC01XXwoMlswLTRdfDE/XFxkKT9cXGQpKShcXC8oMTJbMC04XXwxWzAxXVswLTldfFswLTldWzAtOV0/KSk/KSg/IS4qXFxEXFwyKFteXFxkXFwvXXwkKSkgKikqJCIsICJ0eXBlIjogInRleHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xMiIsICJwYXR0ZXJuIjogIl4oPyEgKSggKigoKFxcYjI1WzAtNV18XFxiMlswLTRdXFxkfFxcYlswMV0/XFxkXFxkPykoXFwuKDI1WzAtNV18MlswLTRdXFxkfFswMV0/XFxkXFxkPykpezN9KShcXC8oWzEtMl1bMC05XT98M1swLTJdP3xbMDQtOV0pKT98KChbMC05YS1mQS1GXXsxLDR9Oil7N31bMC05YS1mQS1GXXsxLDR9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw3fTp8KFswLTlhLWZBLUZdezEsNH06KXsxLDZ9OlswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDV9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDJ9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw0fSg6WzAtOWEtZkEtRl17MSw0fSl7MSwzfXwoWzAtOWEtZkEtRl17MSw0fTopezEsM30oOlswLTlhLWZBLUZdezEsNH0pezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDJ9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDV9fFswLTlhLWZBLUZdezEsNH06KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw2fSl8OigoOlswLTlhLWZBLUZdezEsNH0pezEsN318Oil8ZmU4MDooOlswLTlhLWZBLUZdWnswLDR9KXswLDR9JVswLTlhLXpBLVpdK3w6OihmZmZmKDowezEsNH0pPzopPygoMjVbMC01XXwoMlswLTRdfDE/XFxkKT9cXGQpXFwuKXszfSgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZCl8KFswLTlhLWZBLUZdezEsNH06KXsxLDR9OigoMjVbMC01XXwoMlswLTRdfDE/XFxkKT9cXGQpXFwuKXszfSgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZCkpKFxcLygxMlswLThdfDFbMDFdWzAtOV18WzAtOV1bMC05XT8pKT8pKD8hLipcXERcXDIoW15cXGRcXC9dfCQpKSAqKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJBUEkgd2hpdGVsaXN0IElQIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IHRydWUsICJ2YWx1ZSI6ICIxMjcuMC4wLjAvMjQgMTAuMjAuMzAuMC8yNCIsICJtZXRob2QiOiAic2NoZWR1bGVyIiwgInByZXZfdmFsdWUiOiAiMTI3LjAuMC4wLzI0IDEwLjIwLjMwLjAvMjQiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJ0cmVzcGFzcyIsICJ0ZXh0IjogImlucF9wb3BvdmVyX21ldGhvZF9kaXNhYmxlZCJ9LCB7Imljb25OYW1lIjogImdsb2JlIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfZ2xvYmFsIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkxpc3Qgb2YgSVAvbmV0d29yayBhbGxvd2VkIHRvIGNvbnRhY3QgdGhlIEFQSS4ifV19LCAiQVVUT0NPTkZfTU9ERSI6IHsiY29udGV4dCI6ICJnbG9iYWwiLCAiZGVmYXVsdCI6ICJubyIsICJoZWxwIjogIkVuYWJsZSBBdXRvY29uZiBEb2NrZXIgaW50ZWdyYXRpb24uIiwgImlkIjogImF1dG9jb25mLW1vZGUiLCAibGFiZWwiOiAiQXV0b2NvbmYgbW9kZSIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xMSIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJuYW1lIjogIkF1dG9jb25mIG1vZGUiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJubyIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIm5vIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZ2xvYmUiLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9nbG9iYWwifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiRW5hYmxlIEF1dG9jb25mIERvY2tlciBpbnRlZ3JhdGlvbi4ifV19LCAiU1dBUk1fTU9ERSI6IHsiY29udGV4dCI6ICJnbG9iYWwiLCAiZGVmYXVsdCI6ICJubyIsICJoZWxwIjogIkVuYWJsZSBEb2NrZXIgU3dhcm0gaW50ZWdyYXRpb24uIiwgImlkIjogInN3YXJtLW1vZGUiLCAibGFiZWwiOiAiU3dhcm0gbW9kZSIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xMCIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJuYW1lIjogIlN3YXJtIG1vZGUiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJubyIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIm5vIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZ2xvYmUiLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9nbG9iYWwifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiRW5hYmxlIERvY2tlciBTd2FybSBpbnRlZ3JhdGlvbi4ifV19LCAiS1VCRVJORVRFU19NT0RFIjogeyJjb250ZXh0IjogImdsb2JhbCIsICJkZWZhdWx0IjogIm5vIiwgImhlbHAiOiAiRW5hYmxlIEt1YmVybmV0ZXMgaW50ZWdyYXRpb24uIiwgImlkIjogImt1YmVybmV0ZXMtbW9kZSIsICJsYWJlbCI6ICJLdWJlcm5ldGVzIG1vZGUiLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgImNvbnRhaW5lckNsYXNzIjogInotOSIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJuYW1lIjogIkt1YmVybmV0ZXMgbW9kZSIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIm5vIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAibm8iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJnbG9iZSIsICJ0ZXh0IjogImlucF9wb3BvdmVyX2dsb2JhbCJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJFbmFibGUgS3ViZXJuZXRlcyBpbnRlZ3JhdGlvbi4ifV19LCAiU0VSVkVSX1RZUEUiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiaHR0cCIsICJoZWxwIjogIlNlcnZlciB0eXBlIDogaHR0cCBvciBzdHJlYW0uIiwgImlkIjogInNlcnZlci10eXBlIiwgImxhYmVsIjogIlNlcnZlciB0eXBlIiwgInJlZ2V4IjogIl4oaHR0cHxzdHJlYW0pJCIsICJ0eXBlIjogInNlbGVjdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTgiLCAicGF0dGVybiI6ICJeKGh0dHB8c3RyZWFtKSQiLCAiaW5wVHlwZSI6ICJzZWxlY3QiLCAibmFtZSI6ICJTZXJ2ZXIgdHlwZSIsICJ2YWx1ZXMiOiBbImh0dHAiLCAic3RyZWFtIl0sICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogImh0dHAiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICJodHRwIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJTZXJ2ZXIgdHlwZSA6IGh0dHAgb3Igc3RyZWFtLiJ9XX0sICJMSVNURU5fU1RSRUFNIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogInllcyIsICJoZWxwIjogIkVuYWJsZSBsaXN0ZW5pbmcgZm9yIG5vbi1zc2wgKHBhc3N0aHJvdWdoKS4iLCAiaWQiOiAibGlzdGVuLXN0cmVhbSIsICJsYWJlbCI6ICJMaXN0ZW4gc3RyZWFtIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJjb250YWluZXJDbGFzcyI6ICJ6LTciLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAibmFtZSI6ICJMaXN0ZW4gc3RyZWFtIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAieWVzIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAieWVzIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJFbmFibGUgbGlzdGVuaW5nIGZvciBub24tc3NsIChwYXNzdGhyb3VnaCkuIn1dfSwgIkxJU1RFTl9TVFJFQU1fUE9SVCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIxMzM3IiwgImhlbHAiOiAiTGlzdGVuaW5nIHBvcnQgZm9yIG5vbi1zc2wgKHBhc3N0aHJvdWdoKS4iLCAiaWQiOiAibGlzdGVuLXN0cmVhbS1wb3J0IiwgImxhYmVsIjogIkxpc3RlbiBzdHJlYW0gcG9ydCIsICJyZWdleCI6ICJeWzAtOV0rJCIsICJ0eXBlIjogInRleHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei02IiwgInBhdHRlcm4iOiAiXlswLTldKyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIkxpc3RlbiBzdHJlYW0gcG9ydCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjEzMzciLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICIxMzM3IiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJMaXN0ZW5pbmcgcG9ydCBmb3Igbm9uLXNzbCAocGFzc3Rocm91Z2gpLiJ9XX0sICJMSVNURU5fU1RSRUFNX1BPUlRfU1NMIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIjQyNDIiLCAiaGVscCI6ICJMaXN0ZW5pbmcgcG9ydCBmb3Igc3NsIChwYXNzdGhyb3VnaCkuIiwgImlkIjogImxpc3Rlbi1zdHJlYW0tcG9ydC1zc2wiLCAibGFiZWwiOiAiTGlzdGVuIHN0cmVhbSBwb3J0IHNzbCIsICJyZWdleCI6ICJeWzAtOV0rJCIsICJ0eXBlIjogInRleHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei01IiwgInBhdHRlcm4iOiAiXlswLTldKyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIkxpc3RlbiBzdHJlYW0gcG9ydCBzc2wiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICI0MjQyIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAiNDI0MiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdGVuaW5nIHBvcnQgZm9yIHNzbCAocGFzc3Rocm91Z2gpLiJ9XX0sICJVU0VfVURQIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIm5vIiwgImhlbHAiOiAiVURQIGxpc3RlbiBpbnN0ZWFkIG9mIFRDUCAoc3RyZWFtKS4iLCAiaWQiOiAidXNlLXVkcCIsICJsYWJlbCI6ICJMaXN0ZW4gVURQIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJjb250YWluZXJDbGFzcyI6ICJ6LTQiLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAibmFtZSI6ICJMaXN0ZW4gVURQIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAibm8iLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICJubyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVURQIGxpc3RlbiBpbnN0ZWFkIG9mIFRDUCAoc3RyZWFtKS4ifV19LCAiVVNFX0lQVjYiOiB7ImNvbnRleHQiOiAiZ2xvYmFsIiwgImRlZmF1bHQiOiAibm8iLCAiaGVscCI6ICJFbmFibGUgSVB2NiBjb25uZWN0aXZpdHkuIiwgImlkIjogInVzZS1pcHY2IiwgImxhYmVsIjogIlVzZSBJUHY2IiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJjb250YWluZXJDbGFzcyI6ICJ6LTMiLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAibmFtZSI6ICJVc2UgSVB2NiIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIm5vIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAibm8iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJnbG9iZSIsICJ0ZXh0IjogImlucF9wb3BvdmVyX2dsb2JhbCJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJFbmFibGUgSVB2NiBjb25uZWN0aXZpdHkuIn1dfSwgIklTX0RSQUZUIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIm5vIiwgImhlbHAiOiAiSW50ZXJuYWwgdXNlIDogc2V0IHRvIHllcyB3aGVuIHRoZSBzZXJ2aWNlIGlzIGluIGRyYWZ0IG1vZGUuIiwgImlkIjogImludGVybmFsLXVzZS1kcmFmdCIsICJsYWJlbCI6ICJpbnRlcm5hbCB1c2UgZHJhZnQiLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgImNvbnRhaW5lckNsYXNzIjogInotMiIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJuYW1lIjogImludGVybmFsIHVzZSBkcmFmdCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIm5vIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAibm8iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkludGVybmFsIHVzZSA6IHNldCB0byB5ZXMgd2hlbiB0aGUgc2VydmljZSBpcyBpbiBkcmFmdCBtb2RlLiJ9XX0sICJUSU1FUlNfTE9HX0xFVkVMIjogeyJjb250ZXh0IjogImdsb2JhbCIsICJkZWZhdWx0IjogImRlYnVnIiwgImhlbHAiOiAiTG9nIGxldmVsIGZvciB0aW1lcnMuIiwgImlkIjogInRpbWVycy1sb2ctbGV2ZWwiLCAibGFiZWwiOiAiVGltZXJzIGxvZyBsZXZlbCIsICJyZWdleCI6ICJeKGRlYnVnfGluZm98bm90aWNlfHdhcm58ZXJyfGNyaXR8YWxlcnR8ZW1lcmcpJCIsICJ0eXBlIjogInNlbGVjdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTEiLCAicGF0dGVybiI6ICJeKGRlYnVnfGluZm98bm90aWNlfHdhcm58ZXJyfGNyaXR8YWxlcnR8ZW1lcmcpJCIsICJpbnBUeXBlIjogInNlbGVjdCIsICJuYW1lIjogIlRpbWVycyBsb2cgbGV2ZWwiLCAidmFsdWVzIjogWyJhbGVydCIsICJjcml0IiwgImRlYnVnIiwgImVtZXJnIiwgImVyciIsICJpbmZvIiwgIm5vdGljZSIsICJ3YXJuIl0sICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogImRlYnVnIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAiZGVidWciLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJnbG9iZSIsICJ0ZXh0IjogImlucF9wb3BvdmVyX2dsb2JhbCJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJMb2cgbGV2ZWwgZm9yIHRpbWVycy4ifV19LCAiQlVOS0VSV0VCX0lOU1RBTkNFUyI6IHsiY29udGV4dCI6ICJnbG9iYWwiLCAiZGVmYXVsdCI6ICIxMjcuMC4wLjEiLCAiaGVscCI6ICJMaXN0IG9mIEJ1bmtlcldlYiBpbnN0YW5jZXMgc2VwYXJhdGVkIHdpdGggc3BhY2VzIChmb3JtYXQgOiBmcWRuLW9yLWlwOjUwMDAgaHR0cDovL2ZxZG4tb3ItaXA6NTAwMCkiLCAiaWQiOiAiYnVua2Vyd2ViLWluc3RhbmNlcyIsICJsYWJlbCI6ICJCdW5rZXJXZWIgaW5zdGFuY2VzIiwgInJlZ2V4IjogIl4uKiQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotMCIsICJwYXR0ZXJuIjogIl4uKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIkJ1bmtlcldlYiBpbnN0YW5jZXMiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogdHJ1ZSwgInZhbHVlIjogImJ1bmtlcndlYiIsICJtZXRob2QiOiAic2NoZWR1bGVyIiwgInByZXZfdmFsdWUiOiAiYnVua2Vyd2ViIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAidHJlc3Bhc3MiLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tZXRob2RfZGlzYWJsZWQifSwgeyJpY29uTmFtZSI6ICJnbG9iZSIsICJ0ZXh0IjogImlucF9wb3BvdmVyX2dsb2JhbCJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJMaXN0IG9mIEJ1bmtlcldlYiBpbnN0YW5jZXMgc2VwYXJhdGVkIHdpdGggc3BhY2VzIChmb3JtYXQgOiBmcWRuLW9yLWlwOjUwMDAgaHR0cDovL2ZxZG4tb3ItaXA6NTAwMCkifV19fSwgImNoZWNrc3VtIjogbnVsbH0sIHsiaWQiOiAiYW50aWJvdCIsICJzdHJlYW0iOiAibm8iLCAibmFtZSI6ICJBbnRpYm90IiwgImRlc2NyaXB0aW9uIjogIkJvdCBkZXRlY3Rpb24gYnkgdXNpbmcgYSBjaGFsbGVuZ2UuIiwgInZlcnNpb24iOiAiMS4wIiwgInR5cGUiOiAiY29yZSIsICJtZXRob2QiOiAibWFudWFsIiwgInBhZ2UiOiB0cnVlLCAic2V0dGluZ3MiOiB7IlVTRV9BTlRJQk9UIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIm5vIiwgImhlbHAiOiAiQWN0aXZhdGUgYW50aWJvdCBmZWF0dXJlLiIsICJpZCI6ICJ1c2UtYW50aWJvdCIsICJsYWJlbCI6ICJBbnRpYm90IGNoYWxsZW5nZSIsICJyZWdleCI6ICJeKG5vfGNvb2tpZXxqYXZhc2NyaXB0fGNhcHRjaGF8cmVjYXB0Y2hhfGhjYXB0Y2hhfHR1cm5zdGlsZSkkIiwgInR5cGUiOiAic2VsZWN0IiwgImNvbnRhaW5lckNsYXNzIjogInotMTAiLCAicGF0dGVybiI6ICJeKG5vfGNvb2tpZXxqYXZhc2NyaXB0fGNhcHRjaGF8cmVjYXB0Y2hhfGhjYXB0Y2hhfHR1cm5zdGlsZSkkIiwgImlucFR5cGUiOiAic2VsZWN0IiwgIm5hbWUiOiAiQW50aWJvdCBjaGFsbGVuZ2UiLCAidmFsdWVzIjogWyJjYXB0Y2hhIiwgImNvb2tpZSIsICJoY2FwdGNoYSIsICJqYXZhc2NyaXB0IiwgIm5vIiwgInJlY2FwdGNoYSIsICJ0dXJuc3RpbGUiXSwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAibm8iLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICJubyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiQWN0aXZhdGUgYW50aWJvdCBmZWF0dXJlLiJ9XX0sICJBTlRJQk9UX1VSSSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIvY2hhbGxlbmdlIiwgImhlbHAiOiAiVW51c2VkIFVSSSB0aGF0IGNsaWVudHMgd2lsbCBiZSByZWRpcmVjdGVkIHRvIHRvIHNvbHZlIHRoZSBjaGFsbGVuZ2UuIiwgImlkIjogImFudGlib3QtdXJpIiwgImxhYmVsIjogIkFudGlib3QgVVJMIiwgInJlZ2V4IjogIl5cXC9bXFx3XFxdLn46XFwvPyNcXFtAISRcXCYnXFwoXFwpKissOz1cXC1dKiQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotOSIsICJwYXR0ZXJuIjogIl5cXC9bXFx3XFxdLn46XFwvPyNcXFtAISRcXCYnXFwoXFwpKissOz1cXC1dKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIkFudGlib3QgVVJMIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiL2NoYWxsZW5nZSIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIi9jaGFsbGVuZ2UiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlVudXNlZCBVUkkgdGhhdCBjbGllbnRzIHdpbGwgYmUgcmVkaXJlY3RlZCB0byB0byBzb2x2ZSB0aGUgY2hhbGxlbmdlLiJ9XX0sICJBTlRJQk9UX1RJTUVfUkVTT0xWRSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICI2MCIsICJoZWxwIjogIk1heGltdW0gdGltZSAoaW4gc2Vjb25kcykgY2xpZW50cyBoYXZlIHRvIHJlc29sdmUgdGhlIGNoYWxsZW5nZS4gT25jZSB0aGlzIHRpbWUgaGFzIHBhc3NlZCwgYSBuZXcgY2hhbGxlbmdlIHdpbGwgYmUgZ2VuZXJhdGVkLiIsICJpZCI6ICJhbnRpYm90LXRpbWUtcmVzb2x2ZSIsICJsYWJlbCI6ICJUaW1lIHRvIHJlc29sdmUiLCAicmVnZXgiOiAiXlswLTldKyQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotOCIsICJwYXR0ZXJuIjogIl5bMC05XSskIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJUaW1lIHRvIHJlc29sdmUiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICI2MCIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIjYwIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJNYXhpbXVtIHRpbWUgKGluIHNlY29uZHMpIGNsaWVudHMgaGF2ZSB0byByZXNvbHZlIHRoZSBjaGFsbGVuZ2UuIE9uY2UgdGhpcyB0aW1lIGhhcyBwYXNzZWQsIGEgbmV3IGNoYWxsZW5nZSB3aWxsIGJlIGdlbmVyYXRlZC4ifV19LCAiQU5USUJPVF9USU1FX1ZBTElEIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIjg2NDAwIiwgImhlbHAiOiAiTWF4aW11bSB2YWxpZGl0eSB0aW1lIG9mIHNvbHZlZCBjaGFsbGVuZ2VzLiBPbmNlIHRoaXMgdGltZSBoYXMgcGFzc2VkLCBjbGllbnRzIHdpbGwgbmVlZCB0byByZXNvbHZlIGEgbmV3IG9uZS4iLCAiaWQiOiAiYW50aWJvdC10aW1lLXZhbGlkIiwgImxhYmVsIjogIlRpbWUgdmFsaWQiLCAicmVnZXgiOiAiXlswLTldKyQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotNyIsICJwYXR0ZXJuIjogIl5bMC05XSskIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJUaW1lIHZhbGlkIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiODY0MDAiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICI4NjQwMCIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTWF4aW11bSB2YWxpZGl0eSB0aW1lIG9mIHNvbHZlZCBjaGFsbGVuZ2VzLiBPbmNlIHRoaXMgdGltZSBoYXMgcGFzc2VkLCBjbGllbnRzIHdpbGwgbmVlZCB0byByZXNvbHZlIGEgbmV3IG9uZS4ifV19LCAiQU5USUJPVF9SRUNBUFRDSEFfU0NPUkUiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiMC43IiwgImhlbHAiOiAiTWluaW11bSBzY29yZSByZXF1aXJlZCBmb3IgcmVDQVBUQ0hBIGNoYWxsZW5nZS4iLCAiaWQiOiAiYW50aWJvdC1yZWNhcHRjaGEtc2NvcmUiLCAibGFiZWwiOiAicmVDQVBUQ0hBIHNjb3JlIiwgInJlZ2V4IjogIl4oMFxcLlsxLTldfDFcXC4wKSQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotNiIsICJwYXR0ZXJuIjogIl4oMFxcLlsxLTldfDFcXC4wKSQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogInJlQ0FQVENIQSBzY29yZSIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjAuNyIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIjAuNyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTWluaW11bSBzY29yZSByZXF1aXJlZCBmb3IgcmVDQVBUQ0hBIGNoYWxsZW5nZS4ifV19LCAiQU5USUJPVF9SRUNBUFRDSEFfU0lURUtFWSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJTaXRla2V5IGZvciByZUNBUFRDSEEgY2hhbGxlbmdlLiIsICJpZCI6ICJhbnRpYm90LXJlY2FwdGNoYS1zaXRla2V5IiwgImxhYmVsIjogInJlQ0FQVENIQSBzaXRla2V5IiwgInJlZ2V4IjogIl5bXFx3XFwtXSokIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTUiLCAicGF0dGVybiI6ICJeW1xcd1xcLV0qJCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAicmVDQVBUQ0hBIHNpdGVrZXkiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlNpdGVrZXkgZm9yIHJlQ0FQVENIQSBjaGFsbGVuZ2UuIn1dfSwgIkFOVElCT1RfUkVDQVBUQ0hBX1NFQ1JFVCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJTZWNyZXQgZm9yIHJlQ0FQVENIQSBjaGFsbGVuZ2UuIiwgImlkIjogImFudGlib3QtcmVjYXB0Y2hhLXNlY3JldCIsICJsYWJlbCI6ICJyZUNBUFRDSEEgc2VjcmV0IiwgInJlZ2V4IjogIl5bXFx3XFwtXSokIiwgInR5cGUiOiAicGFzc3dvcmQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei00IiwgInBhdHRlcm4iOiAiXltcXHdcXC1dKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogInJlQ0FQVENIQSBzZWNyZXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlNlY3JldCBmb3IgcmVDQVBUQ0hBIGNoYWxsZW5nZS4ifV19LCAiQU5USUJPVF9IQ0FQVENIQV9TSVRFS0VZIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIlNpdGVrZXkgZm9yIGhDYXB0Y2hhIGNoYWxsZW5nZS4iLCAiaWQiOiAiYW50aWJvdC1oY2FwdGNoYS1zaXRla2V5IiwgImxhYmVsIjogImhDYXB0Y2hhIHNpdGVrZXkiLCAicmVnZXgiOiAiXlthLXpBLVowLTlcXC1dKiQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotMyIsICJwYXR0ZXJuIjogIl5bYS16QS1aMC05XFwtXSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJoQ2FwdGNoYSBzaXRla2V5IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJTaXRla2V5IGZvciBoQ2FwdGNoYSBjaGFsbGVuZ2UuIn1dfSwgIkFOVElCT1RfSENBUFRDSEFfU0VDUkVUIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIlNlY3JldCBmb3IgaENhcHRjaGEgY2hhbGxlbmdlLiIsICJpZCI6ICJhbnRpYm90LWhjYXB0Y2hhLXNlY3JldCIsICJsYWJlbCI6ICJoQ2FwdGNoYSBzZWNyZXQiLCAicmVnZXgiOiAiXlxcdyokIiwgInR5cGUiOiAicGFzc3dvcmQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yIiwgInBhdHRlcm4iOiAiXlxcdyokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJoQ2FwdGNoYSBzZWNyZXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlNlY3JldCBmb3IgaENhcHRjaGEgY2hhbGxlbmdlLiJ9XX0sICJBTlRJQk9UX1RVUk5TVElMRV9TSVRFS0VZIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIlNpdGVrZXkgZm9yIFR1cm5zdGlsZSBjaGFsbGVuZ2UuIiwgImlkIjogImFudGlib3QtdHVybnN0aWxlLXNpdGVrZXkiLCAibGFiZWwiOiAiVHVybnN0aWxlIHNpdGVrZXkiLCAicmVnZXgiOiAiXigweFtcXHdcXC1dKyk/JCIsICJ0eXBlIjogInRleHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xIiwgInBhdHRlcm4iOiAiXigweFtcXHdcXC1dKyk/JCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiVHVybnN0aWxlIHNpdGVrZXkiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlNpdGVrZXkgZm9yIFR1cm5zdGlsZSBjaGFsbGVuZ2UuIn1dfSwgIkFOVElCT1RfVFVSTlNUSUxFX1NFQ1JFVCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJTZWNyZXQgZm9yIFR1cm5zdGlsZSBjaGFsbGVuZ2UuIiwgImlkIjogImFudGlib3QtdHVybnN0aWxlLXNlY3JldCIsICJsYWJlbCI6ICJUdXJuc3RpbGUgc2VjcmV0IiwgInJlZ2V4IjogIl4oMHhbXFx3XFwtXSspPyQiLCAidHlwZSI6ICJwYXNzd29yZCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTAiLCAicGF0dGVybiI6ICJeKDB4W1xcd1xcLV0rKT8kIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJUdXJuc3RpbGUgc2VjcmV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJTZWNyZXQgZm9yIFR1cm5zdGlsZSBjaGFsbGVuZ2UuIn1dfX0sICJjaGVja3N1bSI6IG51bGx9LCB7ImlkIjogImF1dGhiYXNpYyIsICJzdHJlYW0iOiAibm8iLCAibmFtZSI6ICJBdXRoIGJhc2ljIiwgImRlc2NyaXB0aW9uIjogIkVuZm9yY2UgbG9naW4gYmVmb3JlIGFjY2Vzc2luZyBhIHJlc291cmNlIG9yIHRoZSB3aG9sZSBzaXRlIHVzaW5nIEhUVFAgYmFzaWMgYXV0aCBtZXRob2QuIiwgInZlcnNpb24iOiAiMS4wIiwgInR5cGUiOiAiY29yZSIsICJtZXRob2QiOiAibWFudWFsIiwgInBhZ2UiOiBmYWxzZSwgInNldHRpbmdzIjogeyJVU0VfQVVUSF9CQVNJQyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJubyIsICJoZWxwIjogIlVzZSBIVFRQIGJhc2ljIGF1dGgiLCAiaWQiOiAidXNlLWF1dGgtYmFzaWMiLCAibGFiZWwiOiAiVXNlIEhUVFAgYmFzaWMgYXV0aCIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAiY29udGFpbmVyQ2xhc3MiOiAiei00IiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgIm5hbWUiOiAiVXNlIEhUVFAgYmFzaWMgYXV0aCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIm5vIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAibm8iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlVzZSBIVFRQIGJhc2ljIGF1dGgifV19LCAiQVVUSF9CQVNJQ19MT0NBVElPTiI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJzaXRld2lkZSIsICJoZWxwIjogIlVSTCBvZiB0aGUgcHJvdGVjdGVkIHJlc291cmNlIG9yIHNpdGV3aWRlIHZhbHVlLiIsICJpZCI6ICJhdXRoLWJhc2ljLWxvY2F0aW9uIiwgImxhYmVsIjogIkF1dGggYmFzaWMgTG9jYXRpb24iLCAicmVnZXgiOiAiXihzaXRld2lkZXwvW2EtekEtWjAtOS5cXC9cXC1dKikkIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTMiLCAicGF0dGVybiI6ICJeKHNpdGV3aWRlfC9bYS16QS1aMC05LlxcL1xcLV0qKSQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIkF1dGggYmFzaWMgTG9jYXRpb24iLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJzaXRld2lkZSIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogInNpdGV3aWRlIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJVUkwgb2YgdGhlIHByb3RlY3RlZCByZXNvdXJjZSBvciBzaXRld2lkZSB2YWx1ZS4ifV19LCAiQVVUSF9CQVNJQ19VU0VSIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogImNoYW5nZW1lIiwgImhlbHAiOiAiVXNlcm5hbWUiLCAiaWQiOiAiYXV0aC1iYXNpYy11c2VyIiwgImxhYmVsIjogIkF1dGggYmFzaWMgVXNlcm5hbWUiLCAicmVnZXgiOiAiXltcXHdcXC1dKyIsICJ0eXBlIjogInRleHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yIiwgInBhdHRlcm4iOiAiXltcXHdcXC1dKyIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiQXV0aCBiYXNpYyBVc2VybmFtZSIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogImNoYW5nZW1lIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAiY2hhbmdlbWUiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlVzZXJuYW1lIn1dfSwgIkFVVEhfQkFTSUNfUEFTU1dPUkQiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiY2hhbmdlbWUiLCAiaGVscCI6ICJQYXNzd29yZCIsICJpZCI6ICJhdXRoLWJhc2ljLXBhc3N3b3JkIiwgImxhYmVsIjogIlBhc3N3b3JkIiwgInJlZ2V4IjogIl4uKyIsICJ0eXBlIjogInBhc3N3b3JkIiwgImNvbnRhaW5lckNsYXNzIjogInotMSIsICJwYXR0ZXJuIjogIl4uKyIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiUGFzc3dvcmQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJjaGFuZ2VtZSIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogImNoYW5nZW1lIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJQYXNzd29yZCJ9XX0sICJBVVRIX0JBU0lDX1RFWFQiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiUmVzdHJpY3RlZCBhcmVhIiwgImhlbHAiOiAiVGV4dCB0byBkaXNwbGF5IiwgImlkIjogImF1dGgtYmFzaWMtdGV4dCIsICJsYWJlbCI6ICJUZXh0IiwgInJlZ2V4IjogIl4uKyIsICJ0eXBlIjogInRleHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0wIiwgInBhdHRlcm4iOiAiXi4rIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJUZXh0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiUmVzdHJpY3RlZCBhcmVhIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAiUmVzdHJpY3RlZCBhcmVhIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJUZXh0IHRvIGRpc3BsYXkifV19fSwgImNoZWNrc3VtIjogbnVsbH0sIHsiaWQiOiAiYmFja3VwIiwgInN0cmVhbSI6ICJ5ZXMiLCAibmFtZSI6ICJCYWNrdXAiLCAiZGVzY3JpcHRpb24iOiAiQmFja3VwIHlvdXIgZGF0YSB0byBhIGN1c3RvbSBsb2NhdGlvbi4gRW5zdXJlIHRoZSBzYWZldHkgYW5kIGF2YWlsYWJpbGl0eSBvZiB5b3VyIGltcG9ydGFudCBmaWxlcyBieSBjcmVhdGluZyByZWd1bGFyIGJhY2t1cHMuIiwgInZlcnNpb24iOiAiMS4wIiwgInR5cGUiOiAiY29yZSIsICJtZXRob2QiOiAibWFudWFsIiwgInBhZ2UiOiB0cnVlLCAic2V0dGluZ3MiOiB7IlVTRV9CQUNLVVAiOiB7ImNvbnRleHQiOiAiZ2xvYmFsIiwgImRlZmF1bHQiOiAieWVzIiwgImhlbHAiOiAiRW5hYmxlIG9yIGRpc2FibGUgdGhlIGJhY2t1cCBmZWF0dXJlIiwgImlkIjogInVzZS1iYWNrdXAiLCAibGFiZWwiOiAiQWN0aXZhdGUgYXV0b21hdGljIGJhY2t1cCIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAiY29udGFpbmVyQ2xhc3MiOiAiei0zIiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgIm5hbWUiOiAiQWN0aXZhdGUgYXV0b21hdGljIGJhY2t1cCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogInllcyIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogInllcyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImdsb2JlIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfZ2xvYmFsIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkVuYWJsZSBvciBkaXNhYmxlIHRoZSBiYWNrdXAgZmVhdHVyZSJ9XX0sICJCQUNLVVBfU0NIRURVTEUiOiB7ImNvbnRleHQiOiAiZ2xvYmFsIiwgImRlZmF1bHQiOiAiZGFpbHkiLCAiaGVscCI6ICJUaGUgZnJlcXVlbmN5IG9mIHRoZSBiYWNrdXAgKGRhaWx5LCB3ZWVrbHkgb3IgbW9udGhseSkiLCAiaWQiOiAiYmFja3VwLXNjaGVkdWxlIiwgImxhYmVsIjogIkJhY2t1cCBzY2hlZHVsZSIsICJyZWdleCI6ICJeKGRhaWx5fHdlZWtseXxtb250aGx5KSQiLCAidHlwZSI6ICJzZWxlY3QiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yIiwgInBhdHRlcm4iOiAiXihkYWlseXx3ZWVrbHl8bW9udGhseSkkIiwgImlucFR5cGUiOiAic2VsZWN0IiwgIm5hbWUiOiAiQmFja3VwIHNjaGVkdWxlIiwgInZhbHVlcyI6IFsiZGFpbHkiLCAibW9udGhseSIsICJ3ZWVrbHkiXSwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiZGFpbHkiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICJkYWlseSIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImdsb2JlIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfZ2xvYmFsIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlRoZSBmcmVxdWVuY3kgb2YgdGhlIGJhY2t1cCAoZGFpbHksIHdlZWtseSBvciBtb250aGx5KSJ9XX0sICJCQUNLVVBfUk9UQVRJT04iOiB7ImNvbnRleHQiOiAiZ2xvYmFsIiwgImRlZmF1bHQiOiAiNyIsICJoZWxwIjogIlRoZSBudW1iZXIgb2YgYmFja3VwcyB0byBrZWVwIiwgImlkIjogImJhY2t1cC1yb3RhdGlvbiIsICJsYWJlbCI6ICJCYWNrdXAgcm90YXRpb24iLCAicmVnZXgiOiAiXlsxLTldWzAtOV0qJCIsICJ0eXBlIjogInRleHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xIiwgInBhdHRlcm4iOiAiXlsxLTldWzAtOV0qJCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiQmFja3VwIHJvdGF0aW9uIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiNyIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIjciLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJnbG9iZSIsICJ0ZXh0IjogImlucF9wb3BvdmVyX2dsb2JhbCJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJUaGUgbnVtYmVyIG9mIGJhY2t1cHMgdG8ga2VlcCJ9XX0sICJCQUNLVVBfRElSRUNUT1JZIjogeyJjb250ZXh0IjogImdsb2JhbCIsICJkZWZhdWx0IjogIi92YXIvbGliL2J1bmtlcndlYi9iYWNrdXBzIiwgImhlbHAiOiAiVGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgYmFja3VwIHdpbGwgYmUgc3RvcmVkIiwgImlkIjogImJhY2t1cC1kaXJlY3RvcnkiLCAibGFiZWwiOiAiQmFja3VwIGRpcmVjdG9yeSIsICJyZWdleCI6ICJeLiokIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTAiLCAicGF0dGVybiI6ICJeLiokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJCYWNrdXAgZGlyZWN0b3J5IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiL3Zhci9saWIvYnVua2Vyd2ViL2JhY2t1cHMiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICIvdmFyL2xpYi9idW5rZXJ3ZWIvYmFja3VwcyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImdsb2JlIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfZ2xvYmFsIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGJhY2t1cCB3aWxsIGJlIHN0b3JlZCJ9XX19LCAiY2hlY2tzdW0iOiBudWxsLCAiYndjbGkiOiB7Imxpc3QiOiAibGlzdC5weSIsICJyZXN0b3JlIjogInJlc3RvcmUucHkiLCAic2F2ZSI6ICJzYXZlLnB5In19LCB7ImlkIjogImJhZGJlaGF2aW9yIiwgInN0cmVhbSI6ICJ5ZXMiLCAibmFtZSI6ICJCYWQgYmVoYXZpb3IiLCAiZGVzY3JpcHRpb24iOiAiQmFuIElQIGdlbmVyYXRpbmcgdG9vIG11Y2ggJ2JhZCcgSFRUUCBzdGF0dXMgY29kZSBpbiBhIHBlcmlvZCBvZiB0aW1lLiIsICJ2ZXJzaW9uIjogIjEuMCIsICJ0eXBlIjogImNvcmUiLCAibWV0aG9kIjogIm1hbnVhbCIsICJwYWdlIjogdHJ1ZSwgInNldHRpbmdzIjogeyJVU0VfQkFEX0JFSEFWSU9SIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogInllcyIsICJoZWxwIjogIkFjdGl2YXRlIEJhZCBiZWhhdmlvciBmZWF0dXJlLiIsICJpZCI6ICJ1c2UtYmFkLWJlaGF2aW9yIiwgImxhYmVsIjogIkFjdGl2YXRlIGJhZCBiZWhhdmlvciIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAiY29udGFpbmVyQ2xhc3MiOiAiei00IiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgIm5hbWUiOiAiQWN0aXZhdGUgYmFkIGJlaGF2aW9yIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAieWVzIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAieWVzIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJBY3RpdmF0ZSBCYWQgYmVoYXZpb3IgZmVhdHVyZS4ifV19LCAiQkFEX0JFSEFWSU9SX1NUQVRVU19DT0RFUyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICI0MDAgNDAxIDQwMyA0MDQgNDA1IDQyOSA0NDQiLCAiaGVscCI6ICJMaXN0IG9mIEhUVFAgc3RhdHVzIGNvZGVzIGNvbnNpZGVyZWQgYXMgJ2JhZCcuIiwgImlkIjogImJhZC1iZWhhdmlvci1zdGF0dXMtY29kZSIsICJsYWJlbCI6ICJCYWQgc3RhdHVzIGNvZGVzIiwgInJlZ2V4IjogIl4oICooWzEtNV1cXGR7Mn0pKD8hLipcXDIpICopKyQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotMyIsICJwYXR0ZXJuIjogIl4oICooWzEtNV1cXGR7Mn0pKD8hLipcXDIpICopKyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIkJhZCBzdGF0dXMgY29kZXMiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICI0MDAgNDAxIDQwMyA0MDQgNDA1IDQyOSA0NDQiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICI0MDAgNDAxIDQwMyA0MDQgNDA1IDQyOSA0NDQiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkxpc3Qgb2YgSFRUUCBzdGF0dXMgY29kZXMgY29uc2lkZXJlZCBhcyAnYmFkJy4ifV19LCAiQkFEX0JFSEFWSU9SX1RIUkVTSE9MRCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIxMCIsICJoZWxwIjogIk1heGltdW0gbnVtYmVyIG9mICdiYWQnIEhUVFAgc3RhdHVzIGNvZGVzIHdpdGhpbiB0aGUgcGVyaW9kIG9mIHRpbWUgYmVmb3JlIElQIGlzIGJhbm5lZC4iLCAiaWQiOiAiYmFkLWJlaGF2aW9yLXRocmVzaG9sZCIsICJsYWJlbCI6ICJUaHJlc2hvbGQiLCAicmVnZXgiOiAiXlsxLTldWzAtOV0qIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTIiLCAicGF0dGVybiI6ICJeWzEtOV1bMC05XSoiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIlRocmVzaG9sZCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjEwIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAiMTAiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIk1heGltdW0gbnVtYmVyIG9mICdiYWQnIEhUVFAgc3RhdHVzIGNvZGVzIHdpdGhpbiB0aGUgcGVyaW9kIG9mIHRpbWUgYmVmb3JlIElQIGlzIGJhbm5lZC4ifV19LCAiQkFEX0JFSEFWSU9SX0NPVU5UX1RJTUUiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiNjAiLCAiaGVscCI6ICJQZXJpb2Qgb2YgdGltZSAoaW4gc2Vjb25kcykgZHVyaW5nIHdoaWNoIHdlIGNvdW50ICdiYWQnIEhUVFAgc3RhdHVzIGNvZGVzLiIsICJpZCI6ICJiYWQtYmVoYXZpb3ItcGVyaW9kIiwgImxhYmVsIjogIlBlcmlvZCAoaW4gc2Vjb25kcykiLCAicmVnZXgiOiAiXlxcZCsiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotMSIsICJwYXR0ZXJuIjogIl5cXGQrIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJQZXJpb2QgKGluIHNlY29uZHMpIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiNjAiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICI2MCIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiUGVyaW9kIG9mIHRpbWUgKGluIHNlY29uZHMpIGR1cmluZyB3aGljaCB3ZSBjb3VudCAnYmFkJyBIVFRQIHN0YXR1cyBjb2Rlcy4ifV19LCAiQkFEX0JFSEFWSU9SX0JBTl9USU1FIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIjg2NDAwIiwgImhlbHAiOiAiVGhlIGR1cmF0aW9uIHRpbWUgKGluIHNlY29uZHMpIG9mIGEgYmFuIHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcgSVAgaGFzIHJlYWNoZWQgdGhlIHRocmVzaG9sZC4iLCAiaWQiOiAiYmFkLWJlaGF2aW9yLWJhbi10aW1lIiwgImxhYmVsIjogIkJhbiBkdXJhdGlvbiAoaW4gc2Vjb25kcykiLCAicmVnZXgiOiAiXlxcZCsiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotMCIsICJwYXR0ZXJuIjogIl5cXGQrIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJCYW4gZHVyYXRpb24gKGluIHNlY29uZHMpIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiODY0MDAiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICI4NjQwMCIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVGhlIGR1cmF0aW9uIHRpbWUgKGluIHNlY29uZHMpIG9mIGEgYmFuIHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcgSVAgaGFzIHJlYWNoZWQgdGhlIHRocmVzaG9sZC4ifV19fSwgImNoZWNrc3VtIjogbnVsbH0sIHsiaWQiOiAiYmxhY2tsaXN0IiwgInN0cmVhbSI6ICJwYXJ0aWFsIiwgIm5hbWUiOiAiQmxhY2tsaXN0IiwgImRlc2NyaXB0aW9uIjogIkRlbnkgYWNjZXNzIGJhc2VkIG9uIGludGVybmFsIGFuZCBleHRlcm5hbCBJUC9uZXR3b3JrL3JETlMvQVNOIGJsYWNrbGlzdHMuIiwgInZlcnNpb24iOiAiMS4wIiwgInR5cGUiOiAiY29yZSIsICJtZXRob2QiOiAibWFudWFsIiwgInBhZ2UiOiB0cnVlLCAic2V0dGluZ3MiOiB7IlVTRV9CTEFDS0xJU1QiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAieWVzIiwgImhlbHAiOiAiQWN0aXZhdGUgYmxhY2tsaXN0IGZlYXR1cmUuIiwgImlkIjogInVzZS1ibGFja2xpc3QiLCAibGFiZWwiOiAiQWN0aXZhdGUgYmxhY2tsaXN0aW5nIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJjb250YWluZXJDbGFzcyI6ICJ6LTIxIiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgIm5hbWUiOiAiQWN0aXZhdGUgYmxhY2tsaXN0aW5nIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IHRydWUsICJ2YWx1ZSI6ICJubyIsICJtZXRob2QiOiAic2NoZWR1bGVyIiwgInByZXZfdmFsdWUiOiAibm8iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJ0cmVzcGFzcyIsICJ0ZXh0IjogImlucF9wb3BvdmVyX21ldGhvZF9kaXNhYmxlZCJ9LCB7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiQWN0aXZhdGUgYmxhY2tsaXN0IGZlYXR1cmUuIn1dfSwgIkJMQUNLTElTVF9JUCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJMaXN0IG9mIElQL25ldHdvcmssIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgdG8gYmxvY2suIiwgImlkIjogImJsYWNrbGlzdC1pcCIsICJsYWJlbCI6ICJCbGFja2xpc3QgSVAvbmV0d29yayIsICJyZWdleCI6ICJeKD8hICkoICooKChcXGIyNVswLTVdfFxcYjJbMC00XVxcZHxcXGJbMDFdP1xcZFxcZD8pKFxcLigyNVswLTVdfDJbMC00XVxcZHxbMDFdP1xcZFxcZD8pKXszfSkoXFwvKFsxLTJdWzAtOV0/fDNbMC0yXT98WzA0LTldKSk/fCgoWzAtOWEtZkEtRl17MSw0fTopezd9WzAtOWEtZkEtRl17MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsN306fChbMC05YS1mQS1GXXsxLDR9Oil7MSw2fTpbMC05YS1mQS1GXXsxLDR9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw1fSg6WzAtOWEtZkEtRl17MSw0fSl7MSwyfXwoWzAtOWEtZkEtRl17MSw0fTopezEsNH0oOlswLTlhLWZBLUZdezEsNH0pezEsM318KFswLTlhLWZBLUZdezEsNH06KXsxLDN9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDR9fChbMC05YS1mQS1GXXsxLDR9Oil7MSwyfSg6WzAtOWEtZkEtRl17MSw0fSl7MSw1fXxbMC05YS1mQS1GXXsxLDR9OigoOlswLTlhLWZBLUZdezEsNH0pezEsNn0pfDooKDpbMC05YS1mQS1GXXsxLDR9KXsxLDd9fDopfGZlODA6KDpbMC05YS1mQS1GXVp7MCw0fSl7MCw0fSVbMC05YS16QS1aXSt8OjooZmZmZig6MHsxLDR9KT86KT8oKDI1WzAtNV18KDJbMC00XXwxP1xcZCk/XFxkKVxcLil7M30oMjVbMC01XXwoMlswLTRdfDE/XFxkKT9cXGQpfChbMC05YS1mQS1GXXsxLDR9Oil7MSw0fTooKDI1WzAtNV18KDJbMC00XXwxP1xcZCk/XFxkKVxcLil7M30oMjVbMC01XXwoMlswLTRdfDE/XFxkKT9cXGQpKShcXC8oMTJbMC04XXwxWzAxXVswLTldfFswLTldWzAtOV0/KSk/KSg/IS4qXFxEXFwyKFteXFxkXFwvXXwkKSkgKikqJCIsICJ0eXBlIjogInRleHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yMCIsICJwYXR0ZXJuIjogIl4oPyEgKSggKigoKFxcYjI1WzAtNV18XFxiMlswLTRdXFxkfFxcYlswMV0/XFxkXFxkPykoXFwuKDI1WzAtNV18MlswLTRdXFxkfFswMV0/XFxkXFxkPykpezN9KShcXC8oWzEtMl1bMC05XT98M1swLTJdP3xbMDQtOV0pKT98KChbMC05YS1mQS1GXXsxLDR9Oil7N31bMC05YS1mQS1GXXsxLDR9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw3fTp8KFswLTlhLWZBLUZdezEsNH06KXsxLDZ9OlswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDV9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDJ9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw0fSg6WzAtOWEtZkEtRl17MSw0fSl7MSwzfXwoWzAtOWEtZkEtRl17MSw0fTopezEsM30oOlswLTlhLWZBLUZdezEsNH0pezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDJ9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDV9fFswLTlhLWZBLUZdezEsNH06KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw2fSl8OigoOlswLTlhLWZBLUZdezEsNH0pezEsN318Oil8ZmU4MDooOlswLTlhLWZBLUZdWnswLDR9KXswLDR9JVswLTlhLXpBLVpdK3w6OihmZmZmKDowezEsNH0pPzopPygoMjVbMC01XXwoMlswLTRdfDE/XFxkKT9cXGQpXFwuKXszfSgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZCl8KFswLTlhLWZBLUZdezEsNH06KXsxLDR9OigoMjVbMC01XXwoMlswLTRdfDE/XFxkKT9cXGQpXFwuKXszfSgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZCkpKFxcLygxMlswLThdfDFbMDFdWzAtOV18WzAtOV1bMC05XT8pKT8pKD8hLipcXERcXDIoW15cXGRcXC9dfCQpKSAqKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJCbGFja2xpc3QgSVAvbmV0d29yayIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBJUC9uZXR3b3JrLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIHRvIGJsb2NrLiJ9XX0sICJCTEFDS0xJU1RfUkROUyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIuc2hvZGFuLmlvIC5jZW5zeXMuaW8iLCAiaGVscCI6ICJMaXN0IG9mIHJldmVyc2UgRE5TIHN1ZmZpeGVzLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIHRvIGJsb2NrLiIsICJpZCI6ICJibGFja2xpc3QtcmRucyIsICJsYWJlbCI6ICJCbGFja2xpc3QgcmV2ZXJzZSBETlMiLCAicmVnZXgiOiAiXiggKigoW14gXSspKD8hLipcXDMoIHwkKSkpICopKiQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotMTkiLCAicGF0dGVybiI6ICJeKCAqKChbXiBdKykoPyEuKlxcMyggfCQpKSkgKikqJCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiQmxhY2tsaXN0IHJldmVyc2UgRE5TIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiLnNob2Rhbi5pbyAuY2Vuc3lzLmlvIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAiLnNob2Rhbi5pbyAuY2Vuc3lzLmlvIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJMaXN0IG9mIHJldmVyc2UgRE5TIHN1ZmZpeGVzLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIHRvIGJsb2NrLiJ9XX0sICJCTEFDS0xJU1RfUkROU19HTE9CQUwiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAieWVzIiwgImhlbHAiOiAiT25seSBwZXJmb3JtIFJETlMgYmxhY2tsaXN0IGNoZWNrcyBvbiBnbG9iYWwgSVAgYWRkcmVzc2VzLiIsICJpZCI6ICJibGFja2xpc3QtcmRucy1nbG9iYWwiLCAibGFiZWwiOiAiQmxhY2tsaXN0IHJldmVyc2UgRE5TIGdsb2JhbCBJUHMiLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgImNvbnRhaW5lckNsYXNzIjogInotMTgiLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAibmFtZSI6ICJCbGFja2xpc3QgcmV2ZXJzZSBETlMgZ2xvYmFsIElQcyIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogInllcyIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogInllcyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiT25seSBwZXJmb3JtIFJETlMgYmxhY2tsaXN0IGNoZWNrcyBvbiBnbG9iYWwgSVAgYWRkcmVzc2VzLiJ9XX0sICJCTEFDS0xJU1RfQVNOIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkxpc3Qgb2YgQVNOIG51bWJlcnMsIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgdG8gYmxvY2suIiwgImlkIjogImJsYWNrbGlzdC1hc24iLCAibGFiZWwiOiAiQmxhY2tsaXN0IEFTTiIsICJyZWdleCI6ICJeXiggKigoQVNOPyk/KFxcZCspXFxiKD8hLipbU04gXVxcNFxcYikpICopKiQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotMTciLCAicGF0dGVybiI6ICJeXiggKigoQVNOPyk/KFxcZCspXFxiKD8hLipbU04gXVxcNFxcYikpICopKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIkJsYWNrbGlzdCBBU04iLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkxpc3Qgb2YgQVNOIG51bWJlcnMsIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgdG8gYmxvY2suIn1dfSwgIkJMQUNLTElTVF9VU0VSX0FHRU5UIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkxpc3Qgb2YgVXNlci1BZ2VudCAoUENSRSByZWdleCksIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgdG8gYmxvY2suIiwgImlkIjogImJsYWNrbGlzdC11c2VyLWFnZW50IiwgImxhYmVsIjogIkJsYWNrbGlzdCBVc2VyLUFnZW50IiwgInJlZ2V4IjogIl4uKiQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotMTYiLCAicGF0dGVybiI6ICJeLiokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJCbGFja2xpc3QgVXNlci1BZ2VudCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBVc2VyLUFnZW50IChQQ1JFIHJlZ2V4KSwgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCB0byBibG9jay4ifV19LCAiQkxBQ0tMSVNUX1VSSSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJMaXN0IG9mIFVSSSAoUENSRSByZWdleCksIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgdG8gYmxvY2suIiwgImlkIjogImJsYWNrbGlzdC11cmkiLCAibGFiZWwiOiAiQmxhY2tsaXN0IFVSSSIsICJyZWdleCI6ICJeKCAqKC4qKSg/IS4qXFwyKD8hLikpICopKiQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotMTUiLCAicGF0dGVybiI6ICJeKCAqKC4qKSg/IS4qXFwyKD8hLikpICopKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIkJsYWNrbGlzdCBVUkkiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkxpc3Qgb2YgVVJJIChQQ1JFIHJlZ2V4KSwgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCB0byBibG9jay4ifV19LCAiQkxBQ0tMSVNUX0lHTk9SRV9JUCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJMaXN0IG9mIElQL25ldHdvcmssIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgdG8gaWdub3JlIGluIHRoZSBibGFja2xpc3QuIiwgImlkIjogImJsYWNrbGlzdC1pZ25vcmUtaXAiLCAibGFiZWwiOiAiQmxhY2tsaXN0IGlnbm9yZSBJUC9uZXR3b3JrIiwgInJlZ2V4IjogIl4oPyEgKSggKigoKFxcYjI1WzAtNV18XFxiMlswLTRdXFxkfFxcYlswMV0/XFxkXFxkPykoXFwuKDI1WzAtNV18MlswLTRdXFxkfFswMV0/XFxkXFxkPykpezN9KShcXC8oWzEtMl1bMC05XT98M1swLTJdP3xbMDQtOV0pKT98KChbMC05YS1mQS1GXXsxLDR9Oil7N31bMC05YS1mQS1GXXsxLDR9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw3fTp8KFswLTlhLWZBLUZdezEsNH06KXsxLDZ9OlswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDV9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDJ9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw0fSg6WzAtOWEtZkEtRl17MSw0fSl7MSwzfXwoWzAtOWEtZkEtRl17MSw0fTopezEsM30oOlswLTlhLWZBLUZdezEsNH0pezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDJ9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDV9fFswLTlhLWZBLUZdezEsNH06KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw2fSl8OigoOlswLTlhLWZBLUZdezEsNH0pezEsN318Oil8ZmU4MDooOlswLTlhLWZBLUZdWnswLDR9KXswLDR9JVswLTlhLXpBLVpdK3w6OihmZmZmKDowezEsNH0pPzopPygoMjVbMC01XXwoMlswLTRdfDE/XFxkKT9cXGQpXFwuKXszfSgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZCl8KFswLTlhLWZBLUZdezEsNH06KXsxLDR9OigoMjVbMC01XXwoMlswLTRdfDE/XFxkKT9cXGQpXFwuKXszfSgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZCkpKFxcLygxMlswLThdfDFbMDFdWzAtOV18WzAtOV1bMC05XT8pKT8pKD8hLipcXERcXDIoW15cXGRcXC9dfCQpKSAqKSokIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTE0IiwgInBhdHRlcm4iOiAiXig/ISApKCAqKCgoXFxiMjVbMC01XXxcXGIyWzAtNF1cXGR8XFxiWzAxXT9cXGRcXGQ/KShcXC4oMjVbMC01XXwyWzAtNF1cXGR8WzAxXT9cXGRcXGQ/KSl7M30pKFxcLyhbMS0yXVswLTldP3wzWzAtMl0/fFswNC05XSkpP3woKFswLTlhLWZBLUZdezEsNH06KXs3fVswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDd9OnwoWzAtOWEtZkEtRl17MSw0fTopezEsNn06WzAtOWEtZkEtRl17MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsNX0oOlswLTlhLWZBLUZdezEsNH0pezEsMn18KFswLTlhLWZBLUZdezEsNH06KXsxLDR9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDN9fChbMC05YS1mQS1GXXsxLDR9Oil7MSwzfSg6WzAtOWEtZkEtRl17MSw0fSl7MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsMn0oOlswLTlhLWZBLUZdezEsNH0pezEsNX18WzAtOWEtZkEtRl17MSw0fTooKDpbMC05YS1mQS1GXXsxLDR9KXsxLDZ9KXw6KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw3fXw6KXxmZTgwOig6WzAtOWEtZkEtRl1aezAsNH0pezAsNH0lWzAtOWEtekEtWl0rfDo6KGZmZmYoOjB7MSw0fSk/Oik/KCgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZClcXC4pezN9KDI1WzAtNV18KDJbMC00XXwxP1xcZCk/XFxkKXwoWzAtOWEtZkEtRl17MSw0fTopezEsNH06KCgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZClcXC4pezN9KDI1WzAtNV18KDJbMC00XXwxP1xcZCk/XFxkKSkoXFwvKDEyWzAtOF18MVswMV1bMC05XXxbMC05XVswLTldPykpPykoPyEuKlxcRFxcMihbXlxcZFxcL118JCkpICopKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIkJsYWNrbGlzdCBpZ25vcmUgSVAvbmV0d29yayIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBJUC9uZXR3b3JrLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIHRvIGlnbm9yZSBpbiB0aGUgYmxhY2tsaXN0LiJ9XX0sICJCTEFDS0xJU1RfSUdOT1JFX1JETlMiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiTGlzdCBvZiByZXZlcnNlIEROUyBzdWZmaXhlcywgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCB0byBpZ25vcmUgaW4gdGhlIGJsYWNrbGlzdC4iLCAiaWQiOiAiYmxhY2tsaXN0LWlnbm9yZS1yZG5zIiwgImxhYmVsIjogIkJsYWNrbGlzdCBpZ25vcmUgcmV2ZXJzZSBETlMiLCAicmVnZXgiOiAiXiggKigoW14gXSspKD8hLipcXDMoIHwkKSkpICopKiQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotMTMiLCAicGF0dGVybiI6ICJeKCAqKChbXiBdKykoPyEuKlxcMyggfCQpKSkgKikqJCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiQmxhY2tsaXN0IGlnbm9yZSByZXZlcnNlIEROUyIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiByZXZlcnNlIEROUyBzdWZmaXhlcywgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCB0byBpZ25vcmUgaW4gdGhlIGJsYWNrbGlzdC4ifV19LCAiQkxBQ0tMSVNUX0lHTk9SRV9BU04iOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiTGlzdCBvZiBBU04gbnVtYmVycywgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCB0byBpZ25vcmUgaW4gdGhlIGJsYWNrbGlzdC4iLCAiaWQiOiAiYmxhY2tsaXN0LWlnbm9yZS1hc24iLCAibGFiZWwiOiAiQmxhY2tsaXN0IGlnbm9yZSBBU04iLCAicmVnZXgiOiAiXl4oICooKEFTTj8pPyhcXGQrKVxcYig/IS4qW1NOIF1cXDRcXGIpKSAqKSokIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTEyIiwgInBhdHRlcm4iOiAiXl4oICooKEFTTj8pPyhcXGQrKVxcYig/IS4qW1NOIF1cXDRcXGIpKSAqKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJCbGFja2xpc3QgaWdub3JlIEFTTiIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBBU04gbnVtYmVycywgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCB0byBpZ25vcmUgaW4gdGhlIGJsYWNrbGlzdC4ifV19LCAiQkxBQ0tMSVNUX0lHTk9SRV9VU0VSX0FHRU5UIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkxpc3Qgb2YgVXNlci1BZ2VudCAoUENSRSByZWdleCksIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgdG8gaWdub3JlIGluIHRoZSBibGFja2xpc3QuIiwgImlkIjogImJsYWNrbGlzdC1pZ25vcmUtdXNlci1hZ2VudCIsICJsYWJlbCI6ICJCbGFja2xpc3QgaWdub3JlIFVzZXItQWdlbnQiLCAicmVnZXgiOiAiXi4qJCIsICJ0eXBlIjogInRleHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xMSIsICJwYXR0ZXJuIjogIl4uKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIkJsYWNrbGlzdCBpZ25vcmUgVXNlci1BZ2VudCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBVc2VyLUFnZW50IChQQ1JFIHJlZ2V4KSwgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCB0byBpZ25vcmUgaW4gdGhlIGJsYWNrbGlzdC4ifV19LCAiQkxBQ0tMSVNUX0lHTk9SRV9VUkkiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiTGlzdCBvZiBVUkkgKFBDUkUgcmVnZXgpLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIHRvIGlnbm9yZSBpbiB0aGUgYmxhY2tsaXN0LiIsICJpZCI6ICJibGFja2xpc3QtaWdub3JlLXVyaSIsICJsYWJlbCI6ICJCbGFja2xpc3QgaWdub3JlIFVSSSIsICJyZWdleCI6ICJeKCAqKC4qKSg/IS4qXFwyKD8hLikpICopKiQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotMTAiLCAicGF0dGVybiI6ICJeKCAqKC4qKSg/IS4qXFwyKD8hLikpICopKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIkJsYWNrbGlzdCBpZ25vcmUgVVJJIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJMaXN0IG9mIFVSSSAoUENSRSByZWdleCksIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgdG8gaWdub3JlIGluIHRoZSBibGFja2xpc3QuIn1dfSwgIkJMQUNLTElTVF9JUF9VUkxTIjogeyJjb250ZXh0IjogImdsb2JhbCIsICJkZWZhdWx0IjogImh0dHBzOi8vd3d3LmRhbi5tZS51ay90b3JsaXN0Lz9leGl0IiwgImhlbHAiOiAiTGlzdCBvZiBVUkxzLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIGNvbnRhaW5pbmcgYmFkIElQL25ldHdvcmsgdG8gYmxvY2suIiwgImlkIjogImJsYWNrbGlzdC1pcC11cmxzIiwgImxhYmVsIjogIkJsYWNrbGlzdCBJUC9uZXR3b3JrIFVSTHMiLCAicmVnZXgiOiAiXiggKigoaHR0cHM/OlxcL1xcL3xmaWxlOlxcL1xcL1xcLylbXFwtXFx3QDolLit+Iz1dK1tcXC1cXHdcXChcXCkhQDolKy5+Iz8mXFwvPSRdKikoPyEuKlxcMig/IS4pKSAqKSokIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTkiLCAicGF0dGVybiI6ICJeKCAqKChodHRwcz86XFwvXFwvfGZpbGU6XFwvXFwvXFwvKVtcXC1cXHdAOiUuK34jPV0rW1xcLVxcd1xcKFxcKSFAOiUrLn4jPyZcXC89JF0qKSg/IS4qXFwyKD8hLikpICopKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIkJsYWNrbGlzdCBJUC9uZXR3b3JrIFVSTHMiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJodHRwczovL3d3dy5kYW4ubWUudWsvdG9ybGlzdC8/ZXhpdCIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogImh0dHBzOi8vd3d3LmRhbi5tZS51ay90b3JsaXN0Lz9leGl0IiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZ2xvYmUiLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9nbG9iYWwifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBVUkxzLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIGNvbnRhaW5pbmcgYmFkIElQL25ldHdvcmsgdG8gYmxvY2suIn1dfSwgIkJMQUNLTElTVF9SRE5TX1VSTFMiOiB7ImNvbnRleHQiOiAiZ2xvYmFsIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiTGlzdCBvZiBVUkxzLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIGNvbnRhaW5pbmcgcmV2ZXJzZSBETlMgc3VmZml4ZXMgdG8gYmxvY2suIiwgImlkIjogImJsYWNrbGlzdC1yZG5zLXVybHMiLCAibGFiZWwiOiAiQmxhY2tsaXN0IHJldmVyc2UgRE5TIFVSTHMiLCAicmVnZXgiOiAiXiggKigoaHR0cHM/OlxcL1xcL3xmaWxlOlxcL1xcL1xcLylbXFwtXFx3QDolLit+Iz1dK1tcXC1cXHdcXChcXCkhQDolKy5+Iz8mXFwvPSRdKikoPyEuKlxcMig/IS4pKSAqKSokIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTgiLCAicGF0dGVybiI6ICJeKCAqKChodHRwcz86XFwvXFwvfGZpbGU6XFwvXFwvXFwvKVtcXC1cXHdAOiUuK34jPV0rW1xcLVxcd1xcKFxcKSFAOiUrLn4jPyZcXC89JF0qKSg/IS4qXFwyKD8hLikpICopKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIkJsYWNrbGlzdCByZXZlcnNlIEROUyBVUkxzIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZ2xvYmUiLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9nbG9iYWwifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBVUkxzLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIGNvbnRhaW5pbmcgcmV2ZXJzZSBETlMgc3VmZml4ZXMgdG8gYmxvY2suIn1dfSwgIkJMQUNLTElTVF9BU05fVVJMUyI6IHsiY29udGV4dCI6ICJnbG9iYWwiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJMaXN0IG9mIFVSTHMsIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgY29udGFpbmluZyBBU04gdG8gYmxvY2suIiwgImlkIjogImJsYWNrbGlzdC1hc24tdXJscyIsICJsYWJlbCI6ICJCbGFja2xpc3QgQVNOIFVSTHMiLCAicmVnZXgiOiAiXiggKigoaHR0cHM/OlxcL1xcL3xmaWxlOlxcL1xcL1xcLylbXFwtXFx3QDolLit+Iz1dK1tcXC1cXHdcXChcXCkhQDolKy5+Iz8mXFwvPSRdKikoPyEuKlxcMig/IS4pKSAqKSokIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTciLCAicGF0dGVybiI6ICJeKCAqKChodHRwcz86XFwvXFwvfGZpbGU6XFwvXFwvXFwvKVtcXC1cXHdAOiUuK34jPV0rW1xcLVxcd1xcKFxcKSFAOiUrLn4jPyZcXC89JF0qKSg/IS4qXFwyKD8hLikpICopKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIkJsYWNrbGlzdCBBU04gVVJMcyIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImdsb2JlIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfZ2xvYmFsIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkxpc3Qgb2YgVVJMcywgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCBjb250YWluaW5nIEFTTiB0byBibG9jay4ifV19LCAiQkxBQ0tMSVNUX1VTRVJfQUdFTlRfVVJMUyI6IHsiY29udGV4dCI6ICJnbG9iYWwiLCAiZGVmYXVsdCI6ICJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vbWl0Y2hlbGxrcm9nemEvbmdpbngtdWx0aW1hdGUtYmFkLWJvdC1ibG9ja2VyL21hc3Rlci9fZ2VuZXJhdG9yX2xpc3RzL2JhZC11c2VyLWFnZW50cy5saXN0IiwgImhlbHAiOiAiTGlzdCBvZiBVUkxzLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIGNvbnRhaW5pbmcgYmFkIFVzZXItQWdlbnQgdG8gYmxvY2suIiwgImlkIjogImJsYWNrbGlzdC11c2VyLWFnZW50LXVybHMiLCAibGFiZWwiOiAiQmxhY2tsaXN0IFVzZXItQWdlbnQgVVJMcyIsICJyZWdleCI6ICJeKCAqKChodHRwcz86XFwvXFwvfGZpbGU6XFwvXFwvXFwvKVtcXC1cXHdAOiUuK34jPV0rW1xcLVxcd1xcKFxcKSFAOiUrLn4jPyZcXC89JF0qKSg/IS4qXFwyKD8hLikpICopKiQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotNiIsICJwYXR0ZXJuIjogIl4oICooKGh0dHBzPzpcXC9cXC98ZmlsZTpcXC9cXC9cXC8pW1xcLVxcd0A6JS4rfiM9XStbXFwtXFx3XFwoXFwpIUA6JSsufiM/JlxcLz0kXSopKD8hLipcXDIoPyEuKSkgKikqJCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiQmxhY2tsaXN0IFVzZXItQWdlbnQgVVJMcyIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9taXRjaGVsbGtyb2d6YS9uZ2lueC11bHRpbWF0ZS1iYWQtYm90LWJsb2NrZXIvbWFzdGVyL19nZW5lcmF0b3JfbGlzdHMvYmFkLXVzZXItYWdlbnRzLmxpc3QiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vbWl0Y2hlbGxrcm9nemEvbmdpbngtdWx0aW1hdGUtYmFkLWJvdC1ibG9ja2VyL21hc3Rlci9fZ2VuZXJhdG9yX2xpc3RzL2JhZC11c2VyLWFnZW50cy5saXN0IiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZ2xvYmUiLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9nbG9iYWwifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBVUkxzLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIGNvbnRhaW5pbmcgYmFkIFVzZXItQWdlbnQgdG8gYmxvY2suIn1dfSwgIkJMQUNLTElTVF9VUklfVVJMUyI6IHsiY29udGV4dCI6ICJnbG9iYWwiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJMaXN0IG9mIFVSTHMsIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgY29udGFpbmluZyBiYWQgVVJJIHRvIGJsb2NrLiIsICJpZCI6ICJibGFja2xpc3QtdXJpLXVybHMiLCAibGFiZWwiOiAiQmxhY2tsaXN0IFVSSSBVUkxzIiwgInJlZ2V4IjogIl4oICooKGh0dHBzPzpcXC9cXC98ZmlsZTpcXC9cXC9cXC8pW1xcLVxcd0A6JS4rfiM9XStbXFwtXFx3XFwoXFwpIUA6JSsufiM/JlxcLz0kXSopKD8hLipcXDIoPyEuKSkgKikqJCIsICJ0eXBlIjogInRleHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei01IiwgInBhdHRlcm4iOiAiXiggKigoaHR0cHM/OlxcL1xcL3xmaWxlOlxcL1xcL1xcLylbXFwtXFx3QDolLit+Iz1dK1tcXC1cXHdcXChcXCkhQDolKy5+Iz8mXFwvPSRdKikoPyEuKlxcMig/IS4pKSAqKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJCbGFja2xpc3QgVVJJIFVSTHMiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJnbG9iZSIsICJ0ZXh0IjogImlucF9wb3BvdmVyX2dsb2JhbCJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJMaXN0IG9mIFVSTHMsIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgY29udGFpbmluZyBiYWQgVVJJIHRvIGJsb2NrLiJ9XX0sICJCTEFDS0xJU1RfSUdOT1JFX0lQX1VSTFMiOiB7ImNvbnRleHQiOiAiZ2xvYmFsIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiTGlzdCBvZiBVUkxzLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIGNvbnRhaW5pbmcgSVAvbmV0d29yayB0byBpZ25vcmUgaW4gdGhlIGJsYWNrbGlzdC4iLCAiaWQiOiAiYmxhY2tsaXN0LWlnbm9yZS1pcC11cmxzIiwgImxhYmVsIjogIkJsYWNrbGlzdCBpZ25vcmUgSVAvbmV0d29yayBVUkxzIiwgInJlZ2V4IjogIl4oICooKGh0dHBzPzpcXC9cXC98ZmlsZTpcXC9cXC9cXC8pW1xcLVxcd0A6JS4rfiM9XStbXFwtXFx3XFwoXFwpIUA6JSsufiM/JlxcLz0kXSopKD8hLipcXDIoPyEuKSkgKikqJCIsICJ0eXBlIjogInRleHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei00IiwgInBhdHRlcm4iOiAiXiggKigoaHR0cHM/OlxcL1xcL3xmaWxlOlxcL1xcL1xcLylbXFwtXFx3QDolLit+Iz1dK1tcXC1cXHdcXChcXCkhQDolKy5+Iz8mXFwvPSRdKikoPyEuKlxcMig/IS4pKSAqKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJCbGFja2xpc3QgaWdub3JlIElQL25ldHdvcmsgVVJMcyIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImdsb2JlIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfZ2xvYmFsIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkxpc3Qgb2YgVVJMcywgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCBjb250YWluaW5nIElQL25ldHdvcmsgdG8gaWdub3JlIGluIHRoZSBibGFja2xpc3QuIn1dfSwgIkJMQUNLTElTVF9JR05PUkVfUkROU19VUkxTIjogeyJjb250ZXh0IjogImdsb2JhbCIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkxpc3Qgb2YgVVJMcywgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCBjb250YWluaW5nIHJldmVyc2UgRE5TIHN1ZmZpeGVzIHRvIGlnbm9yZSBpbiB0aGUgYmxhY2tsaXN0LiIsICJpZCI6ICJibGFja2xpc3QtaWdub3JlLXJkbnMtdXJscyIsICJsYWJlbCI6ICJCbGFja2xpc3QgaWdub3JlIHJldmVyc2UgRE5TIFVSTHMiLCAicmVnZXgiOiAiXiggKigoaHR0cHM/OlxcL1xcL3xmaWxlOlxcL1xcL1xcLylbXFwtXFx3QDolLit+Iz1dK1tcXC1cXHdcXChcXCkhQDolKy5+Iz8mXFwvPSRdKikoPyEuKlxcMig/IS4pKSAqKSokIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTMiLCAicGF0dGVybiI6ICJeKCAqKChodHRwcz86XFwvXFwvfGZpbGU6XFwvXFwvXFwvKVtcXC1cXHdAOiUuK34jPV0rW1xcLVxcd1xcKFxcKSFAOiUrLn4jPyZcXC89JF0qKSg/IS4qXFwyKD8hLikpICopKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIkJsYWNrbGlzdCBpZ25vcmUgcmV2ZXJzZSBETlMgVVJMcyIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImdsb2JlIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfZ2xvYmFsIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkxpc3Qgb2YgVVJMcywgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCBjb250YWluaW5nIHJldmVyc2UgRE5TIHN1ZmZpeGVzIHRvIGlnbm9yZSBpbiB0aGUgYmxhY2tsaXN0LiJ9XX0sICJCTEFDS0xJU1RfSUdOT1JFX0FTTl9VUkxTIjogeyJjb250ZXh0IjogImdsb2JhbCIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkxpc3Qgb2YgVVJMcywgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCBjb250YWluaW5nIEFTTiB0byBpZ25vcmUgaW4gdGhlIGJsYWNrbGlzdC4iLCAiaWQiOiAiYmxhY2tsaXN0LWlnbm9yZS1hc24tdXJscyIsICJsYWJlbCI6ICJCbGFja2xpc3QgaWdub3JlIEFTTiBVUkxzIiwgInJlZ2V4IjogIl4oICooKGh0dHBzPzpcXC9cXC98ZmlsZTpcXC9cXC9cXC8pW1xcLVxcd0A6JS4rfiM9XStbXFwtXFx3XFwoXFwpIUA6JSsufiM/JlxcLz0kXSopKD8hLipcXDIoPyEuKSkgKikqJCIsICJ0eXBlIjogInRleHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yIiwgInBhdHRlcm4iOiAiXiggKigoaHR0cHM/OlxcL1xcL3xmaWxlOlxcL1xcL1xcLylbXFwtXFx3QDolLit+Iz1dK1tcXC1cXHdcXChcXCkhQDolKy5+Iz8mXFwvPSRdKikoPyEuKlxcMig/IS4pKSAqKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJCbGFja2xpc3QgaWdub3JlIEFTTiBVUkxzIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZ2xvYmUiLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9nbG9iYWwifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBVUkxzLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIGNvbnRhaW5pbmcgQVNOIHRvIGlnbm9yZSBpbiB0aGUgYmxhY2tsaXN0LiJ9XX0sICJCTEFDS0xJU1RfSUdOT1JFX1VTRVJfQUdFTlRfVVJMUyI6IHsiY29udGV4dCI6ICJnbG9iYWwiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJMaXN0IG9mIFVSTHMsIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgY29udGFpbmluZyBVc2VyLUFnZW50IHRvIGlnbm9yZSBpbiB0aGUgYmxhY2tsaXN0LiIsICJpZCI6ICJibGFja2xpc3QtaWdub3JlLXVzZXItYWdlbnQtdXJscyIsICJsYWJlbCI6ICJCbGFja2xpc3QgaWdub3JlIFVzZXItQWdlbnQgVVJMcyIsICJyZWdleCI6ICJeKCAqKChodHRwcz86XFwvXFwvfGZpbGU6XFwvXFwvXFwvKVtcXC1cXHdAOiUuK34jPV0rW1xcLVxcd1xcKFxcKSFAOiUrLn4jPyZcXC89JF0qKSg/IS4qXFwyKD8hLikpICopKiQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotMSIsICJwYXR0ZXJuIjogIl4oICooKGh0dHBzPzpcXC9cXC98ZmlsZTpcXC9cXC9cXC8pW1xcLVxcd0A6JS4rfiM9XStbXFwtXFx3XFwoXFwpIUA6JSsufiM/JlxcLz0kXSopKD8hLipcXDIoPyEuKSkgKikqJCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiQmxhY2tsaXN0IGlnbm9yZSBVc2VyLUFnZW50IFVSTHMiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJnbG9iZSIsICJ0ZXh0IjogImlucF9wb3BvdmVyX2dsb2JhbCJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJMaXN0IG9mIFVSTHMsIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgY29udGFpbmluZyBVc2VyLUFnZW50IHRvIGlnbm9yZSBpbiB0aGUgYmxhY2tsaXN0LiJ9XX0sICJCTEFDS0xJU1RfSUdOT1JFX1VSSV9VUkxTIjogeyJjb250ZXh0IjogImdsb2JhbCIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkxpc3Qgb2YgVVJMcywgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCBjb250YWluaW5nIFVSSSB0byBpZ25vcmUgaW4gdGhlIGJsYWNrbGlzdC4iLCAiaWQiOiAiYmxhY2tsaXN0LWlnbm9yZS11cmktdXJscyIsICJsYWJlbCI6ICJCbGFja2xpc3QgaWdub3JlIFVSSSBVUkxzIiwgInJlZ2V4IjogIl4oICooKGh0dHBzPzpcXC9cXC98ZmlsZTpcXC9cXC9cXC8pW1xcLVxcd0A6JS4rfiM9XStbXFwtXFx3XFwoXFwpIUA6JSsufiM/JlxcLz0kXSopKD8hLipcXDIoPyEuKSkgKikqJCIsICJ0eXBlIjogInRleHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0wIiwgInBhdHRlcm4iOiAiXiggKigoaHR0cHM/OlxcL1xcL3xmaWxlOlxcL1xcL1xcLylbXFwtXFx3QDolLit+Iz1dK1tcXC1cXHdcXChcXCkhQDolKy5+Iz8mXFwvPSRdKikoPyEuKlxcMig/IS4pKSAqKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJCbGFja2xpc3QgaWdub3JlIFVSSSBVUkxzIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZ2xvYmUiLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9nbG9iYWwifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBVUkxzLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIGNvbnRhaW5pbmcgVVJJIHRvIGlnbm9yZSBpbiB0aGUgYmxhY2tsaXN0LiJ9XX19LCAiY2hlY2tzdW0iOiBudWxsfSwgeyJpZCI6ICJicm90bGkiLCAic3RyZWFtIjogIm5vIiwgIm5hbWUiOiAiQnJvdGxpIiwgImRlc2NyaXB0aW9uIjogIkNvbXByZXNzIEhUVFAgcmVxdWVzdHMgd2l0aCB0aGUgYnJvdGxpIGFsZ29yaXRobS4iLCAidmVyc2lvbiI6ICIxLjAiLCAidHlwZSI6ICJjb3JlIiwgIm1ldGhvZCI6ICJtYW51YWwiLCAicGFnZSI6IGZhbHNlLCAic2V0dGluZ3MiOiB7IlVTRV9CUk9UTEkiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAibm8iLCAiaGVscCI6ICJVc2UgYnJvdGxpIiwgImlkIjogInVzZS1icm90bGkiLCAibGFiZWwiOiAiVXNlIGJyb3RsaSIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAiY29udGFpbmVyQ2xhc3MiOiAiei0zIiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgIm5hbWUiOiAiVXNlIGJyb3RsaSIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIm5vIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAibm8iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlVzZSBicm90bGkifV19LCAiQlJPVExJX1RZUEVTIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogImFwcGxpY2F0aW9uL2F0b20reG1sIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQgYXBwbGljYXRpb24vanNvbiBhcHBsaWNhdGlvbi9yc3MreG1sIGFwcGxpY2F0aW9uL3ZuZC5tcy1mb250b2JqZWN0IGFwcGxpY2F0aW9uL3gtZm9udC1vcGVudHlwZSBhcHBsaWNhdGlvbi94LWZvbnQtdHJ1ZXR5cGUgYXBwbGljYXRpb24veC1mb250LXR0ZiBhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQgYXBwbGljYXRpb24veGh0bWwreG1sIGFwcGxpY2F0aW9uL3htbCBmb250L2VvdCBmb250L29wZW50eXBlIGZvbnQvb3RmIGZvbnQvdHJ1ZXR5cGUgaW1hZ2Uvc3ZnK3htbCBpbWFnZS92bmQubWljcm9zb2Z0Lmljb24gaW1hZ2UveC1pY29uIGltYWdlL3gtd2luLWJpdG1hcCB0ZXh0L2NzcyB0ZXh0L2phdmFzY3JpcHQgdGV4dC9wbGFpbiB0ZXh0L3htbCIsICJoZWxwIjogIkxpc3Qgb2YgTUlNRSB0eXBlcyB0aGF0IHdpbGwgYmUgY29tcHJlc3NlZCB3aXRoIGJyb3RsaS4iLCAiaWQiOiAiYnJvdGxpLXR5cGVzIiwgImxhYmVsIjogIk1JTUUgdHlwZXMiLCAicmVnZXgiOiAiXig/ISApKCA/KFtcXC1cXHcuXSsvW1xcLVxcdy4rXSspKD8hLipcXDIoPyEuKSkpKyQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotMiIsICJwYXR0ZXJuIjogIl4oPyEgKSggPyhbXFwtXFx3Ll0rL1tcXC1cXHcuK10rKSg/IS4qXFwyKD8hLikpKSskIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJNSU1FIHR5cGVzIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiYXBwbGljYXRpb24vYXRvbSt4bWwgYXBwbGljYXRpb24vamF2YXNjcmlwdCBhcHBsaWNhdGlvbi9qc29uIGFwcGxpY2F0aW9uL3Jzcyt4bWwgYXBwbGljYXRpb24vdm5kLm1zLWZvbnRvYmplY3QgYXBwbGljYXRpb24veC1mb250LW9wZW50eXBlIGFwcGxpY2F0aW9uL3gtZm9udC10cnVldHlwZSBhcHBsaWNhdGlvbi94LWZvbnQtdHRmIGFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCBhcHBsaWNhdGlvbi94aHRtbCt4bWwgYXBwbGljYXRpb24veG1sIGZvbnQvZW90IGZvbnQvb3BlbnR5cGUgZm9udC9vdGYgZm9udC90cnVldHlwZSBpbWFnZS9zdmcreG1sIGltYWdlL3ZuZC5taWNyb3NvZnQuaWNvbiBpbWFnZS94LWljb24gaW1hZ2UveC13aW4tYml0bWFwIHRleHQvY3NzIHRleHQvamF2YXNjcmlwdCB0ZXh0L3BsYWluIHRleHQveG1sIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAiYXBwbGljYXRpb24vYXRvbSt4bWwgYXBwbGljYXRpb24vamF2YXNjcmlwdCBhcHBsaWNhdGlvbi9qc29uIGFwcGxpY2F0aW9uL3Jzcyt4bWwgYXBwbGljYXRpb24vdm5kLm1zLWZvbnRvYmplY3QgYXBwbGljYXRpb24veC1mb250LW9wZW50eXBlIGFwcGxpY2F0aW9uL3gtZm9udC10cnVldHlwZSBhcHBsaWNhdGlvbi94LWZvbnQtdHRmIGFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCBhcHBsaWNhdGlvbi94aHRtbCt4bWwgYXBwbGljYXRpb24veG1sIGZvbnQvZW90IGZvbnQvb3BlbnR5cGUgZm9udC9vdGYgZm9udC90cnVldHlwZSBpbWFnZS9zdmcreG1sIGltYWdlL3ZuZC5taWNyb3NvZnQuaWNvbiBpbWFnZS94LWljb24gaW1hZ2UveC13aW4tYml0bWFwIHRleHQvY3NzIHRleHQvamF2YXNjcmlwdCB0ZXh0L3BsYWluIHRleHQveG1sIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJMaXN0IG9mIE1JTUUgdHlwZXMgdGhhdCB3aWxsIGJlIGNvbXByZXNzZWQgd2l0aCBicm90bGkuIn1dfSwgIkJST1RMSV9NSU5fTEVOR1RIIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIjEwMDAiLCAiaGVscCI6ICJNaW5pbXVtIGxlbmd0aCBmb3IgYnJvdGxpIGNvbXByZXNzaW9uLiIsICJpZCI6ICJicm90bGktbWluLWxlbmd0aCIsICJsYWJlbCI6ICJNaW5pbXVtIGxlbmd0aCIsICJyZWdleCI6ICJeXFxkKyIsICJ0eXBlIjogInRleHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xIiwgInBhdHRlcm4iOiAiXlxcZCsiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIk1pbmltdW0gbGVuZ3RoIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiMTAwMCIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIjEwMDAiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIk1pbmltdW0gbGVuZ3RoIGZvciBicm90bGkgY29tcHJlc3Npb24uIn1dfSwgIkJST1RMSV9DT01QX0xFVkVMIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIjYiLCAiaGVscCI6ICJUaGUgY29tcHJlc3Npb24gbGV2ZWwgb2YgdGhlIGJyb3RsaSBhbGdvcml0aG0uIiwgImlkIjogImJyb3RsaS1jb21wLWxldmVsIiwgImxhYmVsIjogIkNvbXByZXNzaW9uIGxldmVsIiwgInJlZ2V4IjogIl4oWzAyLTldfDFbMDFdPykkIiwgInR5cGUiOiAic2VsZWN0IiwgImNvbnRhaW5lckNsYXNzIjogInotMCIsICJwYXR0ZXJuIjogIl4oWzAyLTldfDFbMDFdPykkIiwgImlucFR5cGUiOiAic2VsZWN0IiwgIm5hbWUiOiAiQ29tcHJlc3Npb24gbGV2ZWwiLCAidmFsdWVzIjogWyIwIiwgIjEiLCAiMTAiLCAiMTEiLCAiMiIsICIzIiwgIjQiLCAiNSIsICI2IiwgIjciLCAiOCIsICI5Il0sICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjYiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICI2IiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJUaGUgY29tcHJlc3Npb24gbGV2ZWwgb2YgdGhlIGJyb3RsaSBhbGdvcml0aG0uIn1dfX0sICJjaGVja3N1bSI6IG51bGx9LCB7ImlkIjogImJ1bmtlcm5ldCIsICJzdHJlYW0iOiAieWVzIiwgIm5hbWUiOiAiQnVua2VyTmV0IiwgImRlc2NyaXB0aW9uIjogIlNoYXJlIHRocmVhdCBkYXRhIHdpdGggb3RoZXIgQnVua2VyV2ViIGluc3RhbmNlcyB2aWEgQnVua2VyTmV0LiIsICJ2ZXJzaW9uIjogIjEuMCIsICJ0eXBlIjogImNvcmUiLCAibWV0aG9kIjogIm1hbnVhbCIsICJwYWdlIjogdHJ1ZSwgInNldHRpbmdzIjogeyJVU0VfQlVOS0VSTkVUIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogInllcyIsICJoZWxwIjogIkFjdGl2YXRlIEJ1bmtlck5ldCBmZWF0dXJlLiIsICJpZCI6ICJ1c2UtYnVua2VybmV0IiwgImxhYmVsIjogIkFjdGl2YXRlIEJ1bmtlck5ldCIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xIiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgIm5hbWUiOiAiQWN0aXZhdGUgQnVua2VyTmV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IHRydWUsICJ2YWx1ZSI6ICJubyIsICJtZXRob2QiOiAic2NoZWR1bGVyIiwgInByZXZfdmFsdWUiOiAibm8iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJ0cmVzcGFzcyIsICJ0ZXh0IjogImlucF9wb3BvdmVyX21ldGhvZF9kaXNhYmxlZCJ9LCB7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiQWN0aXZhdGUgQnVua2VyTmV0IGZlYXR1cmUuIn1dfSwgIkJVTktFUk5FVF9TRVJWRVIiOiB7ImNvbnRleHQiOiAiZ2xvYmFsIiwgImRlZmF1bHQiOiAiaHR0cHM6Ly9hcGkuYnVua2Vyd2ViLmlvIiwgImhlbHAiOiAiQWRkcmVzcyBvZiB0aGUgQnVua2VyTmV0IEFQSS4iLCAiaWQiOiAiYnVua2VybmV0LXNlcnZlciIsICJsYWJlbCI6ICJCdW5rZXJOZXQgc2VydmVyIiwgInJlZ2V4IjogIl5odHRwcz86XFwvXFwvW1xcLVxcd0A6JS4rfiM9XStbXFwtXFx3XFwoXFwpIUA6JSsufiM/JlxcLz0kXSokIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTAiLCAicGF0dGVybiI6ICJeaHR0cHM/OlxcL1xcL1tcXC1cXHdAOiUuK34jPV0rW1xcLVxcd1xcKFxcKSFAOiUrLn4jPyZcXC89JF0qJCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiQnVua2VyTmV0IHNlcnZlciIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogImh0dHBzOi8vYXBpLmJ1bmtlcndlYi5pbyIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogImh0dHBzOi8vYXBpLmJ1bmtlcndlYi5pbyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImdsb2JlIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfZ2xvYmFsIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkFkZHJlc3Mgb2YgdGhlIEJ1bmtlck5ldCBBUEkuIn1dfX0sICJjaGVja3N1bSI6IG51bGx9LCB7ImlkIjogImNvcnMiLCAic3RyZWFtIjogIm5vIiwgIm5hbWUiOiAiQ09SUyIsICJkZXNjcmlwdGlvbiI6ICJDcm9zcy1PcmlnaW4gUmVzb3VyY2UgU2hhcmluZy4iLCAidmVyc2lvbiI6ICIxLjAiLCAidHlwZSI6ICJjb3JlIiwgIm1ldGhvZCI6ICJtYW51YWwiLCAicGFnZSI6IHRydWUsICJzZXR0aW5ncyI6IHsiVVNFX0NPUlMiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAibm8iLCAiaGVscCI6ICJVc2UgQ09SUyIsICJpZCI6ICJ1c2UtY29ycyIsICJsYWJlbCI6ICJVc2UgQ09SUyIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xMCIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJuYW1lIjogIlVzZSBDT1JTIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAibm8iLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICJubyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVXNlIENPUlMifV19LCAiQ09SU19BTExPV19PUklHSU4iOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiKiIsICJoZWxwIjogIkFsbG93ZWQgb3JpZ2lucyB0byBtYWtlIENPUlMgcmVxdWVzdHMgOiBQQ1JFIHJlZ2V4IG9yICouIiwgImlkIjogImNvcnMtYWxsb3ctb3JpZ2luIiwgImxhYmVsIjogIkFsbG93ZWQgb3JpZ2lucyIsICJyZWdleCI6ICJeLiokIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTkiLCAicGF0dGVybiI6ICJeLiokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJBbGxvd2VkIG9yaWdpbnMiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJzZWxmIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAic2VsZiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiQWxsb3dlZCBvcmlnaW5zIHRvIG1ha2UgQ09SUyByZXF1ZXN0cyA6IFBDUkUgcmVnZXggb3IgKi4ifV19LCAiQ09SU19BTExPV19NRVRIT0RTIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIkdFVCwgUE9TVCwgT1BUSU9OUyIsICJoZWxwIjogIlZhbHVlIG9mIHRoZSBBY2Nlc3MtQ29udHJvbC1BbGxvdy1NZXRob2RzIGhlYWRlci4iLCAiaWQiOiAiY29ycy1hbGxvdy1tZXRob2RzIiwgImxhYmVsIjogIkFjY2Vzcy1Db250cm9sLUFsbG93LU1ldGhvZHMgdmFsdWUiLCAicmVnZXgiOiAiXihcXCp8KD8hWywgXSkoLD8gPyhHRVR8SEVBRHxQT1NUfFBVVHxERUxFVEV8Q09OTkVDVHxPUFRJT05TfFRSQUNFfFBBVENIKSg/IS4qXFwzKSkqKT8kIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTgiLCAicGF0dGVybiI6ICJeKFxcKnwoPyFbLCBdKSgsPyA/KEdFVHxIRUFEfFBPU1R8UFVUfERFTEVURXxDT05ORUNUfE9QVElPTlN8VFJBQ0V8UEFUQ0gpKD8hLipcXDMpKSopPyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIkFjY2Vzcy1Db250cm9sLUFsbG93LU1ldGhvZHMgdmFsdWUiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJHRVQsIFBPU1QsIE9QVElPTlMiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICJHRVQsIFBPU1QsIE9QVElPTlMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlZhbHVlIG9mIHRoZSBBY2Nlc3MtQ29udHJvbC1BbGxvdy1NZXRob2RzIGhlYWRlci4ifV19LCAiQ09SU19BTExPV19IRUFERVJTIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIkROVCxVc2VyLUFnZW50LFgtUmVxdWVzdGVkLVdpdGgsSWYtTW9kaWZpZWQtU2luY2UsQ2FjaGUtQ29udHJvbCxDb250ZW50LVR5cGUsUmFuZ2UiLCAiaGVscCI6ICJWYWx1ZSBvZiB0aGUgQWNjZXNzLUNvbnRyb2wtQWxsb3ctSGVhZGVycyBoZWFkZXIuIiwgImlkIjogImNvcnMtYWxsb3ctaGVhZGVycyIsICJsYWJlbCI6ICJBY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzIHZhbHVlIiwgInJlZ2V4IjogIl4oXFwqfCg/IVssIF0pKCw/ID8oW1xcd1xcLV0rKSg/IS4qXFwzKD8hLikpKSopPyQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotNyIsICJwYXR0ZXJuIjogIl4oXFwqfCg/IVssIF0pKCw/ID8oW1xcd1xcLV0rKSg/IS4qXFwzKD8hLikpKSopPyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIkFjY2Vzcy1Db250cm9sLUFsbG93LUhlYWRlcnMgdmFsdWUiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJETlQsVXNlci1BZ2VudCxYLVJlcXVlc3RlZC1XaXRoLElmLU1vZGlmaWVkLVNpbmNlLENhY2hlLUNvbnRyb2wsQ29udGVudC1UeXBlLFJhbmdlIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAiRE5ULFVzZXItQWdlbnQsWC1SZXF1ZXN0ZWQtV2l0aCxJZi1Nb2RpZmllZC1TaW5jZSxDYWNoZS1Db250cm9sLENvbnRlbnQtVHlwZSxSYW5nZSIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVmFsdWUgb2YgdGhlIEFjY2Vzcy1Db250cm9sLUFsbG93LUhlYWRlcnMgaGVhZGVyLiJ9XX0sICJDT1JTX0FMTE9XX0NSRURFTlRJQUxTIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIm5vIiwgImhlbHAiOiAiU2VuZCB0aGUgQWNjZXNzLUNvbnRyb2wtQWxsb3ctQ3JlZGVudGlhbHMgaGVhZGVyLiIsICJpZCI6ICJjb3JzLWFsbG93LWNyZWRlbnRpYWxzIiwgImxhYmVsIjogIlNlbmQgQWNjZXNzLUNvbnRyb2wtQWxsb3ctQ3JlZGVudGlhbHMiLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgImNvbnRhaW5lckNsYXNzIjogInotNiIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJuYW1lIjogIlNlbmQgQWNjZXNzLUNvbnRyb2wtQWxsb3ctQ3JlZGVudGlhbHMiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJubyIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIm5vIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJTZW5kIHRoZSBBY2Nlc3MtQ29udHJvbC1BbGxvdy1DcmVkZW50aWFscyBoZWFkZXIuIn1dfSwgIkNPUlNfRVhQT1NFX0hFQURFUlMiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiQ29udGVudC1MZW5ndGgsQ29udGVudC1SYW5nZSIsICJoZWxwIjogIlZhbHVlIG9mIHRoZSBBY2Nlc3MtQ29udHJvbC1FeHBvc2UtSGVhZGVycyBoZWFkZXIuIiwgImlkIjogImNvcnMtZXhwb3NlLWhlYWRlcnMiLCAibGFiZWwiOiAiQWNjZXNzLUNvbnRyb2wtRXhwb3NlLUhlYWRlcnMgdmFsdWUiLCAicmVnZXgiOiAiXihcXCp8KD8hWywgXSspKCw/ID8oW1xcd1xcLV0rKSg/IS4qXFwzKD8hLikpKSopPyQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotNSIsICJwYXR0ZXJuIjogIl4oXFwqfCg/IVssIF0rKSgsPyA/KFtcXHdcXC1dKykoPyEuKlxcMyg/IS4pKSkqKT8kIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJBY2Nlc3MtQ29udHJvbC1FeHBvc2UtSGVhZGVycyB2YWx1ZSIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIkNvbnRlbnQtTGVuZ3RoLENvbnRlbnQtUmFuZ2UiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICJDb250ZW50LUxlbmd0aCxDb250ZW50LVJhbmdlIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJWYWx1ZSBvZiB0aGUgQWNjZXNzLUNvbnRyb2wtRXhwb3NlLUhlYWRlcnMgaGVhZGVyLiJ9XX0sICJDUk9TU19PUklHSU5fT1BFTkVSX1BPTElDWSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJWYWx1ZSBmb3IgdGhlIENyb3NzLU9yaWdpbi1PcGVuZXItUG9saWN5IGhlYWRlci4iLCAiaWQiOiAiY3Jvc3Mtb3JpZ2luLW9wZW5lci1wb2xpY3kiLCAibGFiZWwiOiAiQ3Jvc3MtT3JpZ2luLU9wZW5lci1Qb2xpY3kiLCAicmVnZXgiOiAiXih1bnNhZmUtbm9uZXxzYW1lLW9yaWdpbi1hbGxvdy1wb3B1cHN8c2FtZS1vcmlnaW4pPyQiLCAidHlwZSI6ICJzZWxlY3QiLCAiY29udGFpbmVyQ2xhc3MiOiAiei00IiwgInBhdHRlcm4iOiAiXih1bnNhZmUtbm9uZXxzYW1lLW9yaWdpbi1hbGxvdy1wb3B1cHN8c2FtZS1vcmlnaW4pPyQiLCAiaW5wVHlwZSI6ICJzZWxlY3QiLCAibmFtZSI6ICJDcm9zcy1PcmlnaW4tT3BlbmVyLVBvbGljeSIsICJ2YWx1ZXMiOiBbIiIsICJzYW1lLW9yaWdpbiIsICJzYW1lLW9yaWdpbi1hbGxvdy1wb3B1cHMiLCAidW5zYWZlLW5vbmUiXSwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAic2FtZS1vcmlnaW4iLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICJzYW1lLW9yaWdpbiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVmFsdWUgZm9yIHRoZSBDcm9zcy1PcmlnaW4tT3BlbmVyLVBvbGljeSBoZWFkZXIuIn1dfSwgIkNST1NTX09SSUdJTl9FTUJFRERFUl9QT0xJQ1kiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiVmFsdWUgZm9yIHRoZSBDcm9zcy1PcmlnaW4tRW1iZWRkZXItUG9saWN5IGhlYWRlci4iLCAiaWQiOiAiY3Jvc3Mtb3JpZ2luLWVtYmVkZGVyLXBvbGljeSIsICJsYWJlbCI6ICJDcm9zcy1PcmlnaW4tRW1iZWRkZXItUG9saWN5IiwgInJlZ2V4IjogIl4odW5zYWZlLW5vbmV8cmVxdWlyZS1jb3JwfGNyZWRlbnRpYWxsZXNzKT8kIiwgInR5cGUiOiAic2VsZWN0IiwgImNvbnRhaW5lckNsYXNzIjogInotMyIsICJwYXR0ZXJuIjogIl4odW5zYWZlLW5vbmV8cmVxdWlyZS1jb3JwfGNyZWRlbnRpYWxsZXNzKT8kIiwgImlucFR5cGUiOiAic2VsZWN0IiwgIm5hbWUiOiAiQ3Jvc3MtT3JpZ2luLUVtYmVkZGVyLVBvbGljeSIsICJ2YWx1ZXMiOiBbIiIsICJjcmVkZW50aWFsbGVzcyIsICJyZXF1aXJlLWNvcnAiLCAidW5zYWZlLW5vbmUiXSwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAicmVxdWlyZS1jb3JwIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAicmVxdWlyZS1jb3JwIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJWYWx1ZSBmb3IgdGhlIENyb3NzLU9yaWdpbi1FbWJlZGRlci1Qb2xpY3kgaGVhZGVyLiJ9XX0sICJDUk9TU19PUklHSU5fUkVTT1VSQ0VfUE9MSUNZIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIlZhbHVlIGZvciB0aGUgQ3Jvc3MtT3JpZ2luLVJlc291cmNlLVBvbGljeSBoZWFkZXIuIiwgImlkIjogImNyb3NzLW9yaWdpbi1yZXNvdXJjZS1wb2xpY3kiLCAibGFiZWwiOiAiQ3Jvc3MtT3JpZ2luLVJlc291cmNlLVBvbGljeSIsICJyZWdleCI6ICJeKHNhbWUtc2l0ZXxzYW1lLW9yaWdpbnxjcm9zcy1vcmlnaW4pPyQiLCAidHlwZSI6ICJzZWxlY3QiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yIiwgInBhdHRlcm4iOiAiXihzYW1lLXNpdGV8c2FtZS1vcmlnaW58Y3Jvc3Mtb3JpZ2luKT8kIiwgImlucFR5cGUiOiAic2VsZWN0IiwgIm5hbWUiOiAiQ3Jvc3MtT3JpZ2luLVJlc291cmNlLVBvbGljeSIsICJ2YWx1ZXMiOiBbIiIsICJjcm9zcy1vcmlnaW4iLCAic2FtZS1vcmlnaW4iLCAic2FtZS1zaXRlIl0sICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogInNhbWUtc2l0ZSIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogInNhbWUtc2l0ZSIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVmFsdWUgZm9yIHRoZSBDcm9zcy1PcmlnaW4tUmVzb3VyY2UtUG9saWN5IGhlYWRlci4ifV19LCAiQ09SU19NQVhfQUdFIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIjg2NDAwIiwgImhlbHAiOiAiVmFsdWUgb2YgdGhlIEFjY2Vzcy1Db250cm9sLU1heC1BZ2UgaGVhZGVyLiIsICJpZCI6ICJjb3JzLW1heC1hZ2UiLCAibGFiZWwiOiAiQWNjZXNzLUNvbnRyb2wtTWF4LUFnZSB2YWx1ZSIsICJyZWdleCI6ICJeXFxkKyQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotMSIsICJwYXR0ZXJuIjogIl5cXGQrJCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiQWNjZXNzLUNvbnRyb2wtTWF4LUFnZSB2YWx1ZSIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjg2NDAwIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAiODY0MDAiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlZhbHVlIG9mIHRoZSBBY2Nlc3MtQ29udHJvbC1NYXgtQWdlIGhlYWRlci4ifV19LCAiQ09SU19ERU5ZX1JFUVVFU1QiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAieWVzIiwgImhlbHAiOiAiRGVueSByZXF1ZXN0IGFuZCBkb24ndCBzZW5kIGl0IHRvIGJhY2tlbmQgaWYgT3JpZ2luIGlzIG5vdCBhbGxvd2VkLiIsICJpZCI6ICJjb3JzLWRlbnktcmVxdWVzdCIsICJsYWJlbCI6ICJEZW55IHJlcXVlc3QiLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgImNvbnRhaW5lckNsYXNzIjogInotMCIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJuYW1lIjogIkRlbnkgcmVxdWVzdCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogInllcyIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogInllcyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiRGVueSByZXF1ZXN0IGFuZCBkb24ndCBzZW5kIGl0IHRvIGJhY2tlbmQgaWYgT3JpZ2luIGlzIG5vdCBhbGxvd2VkLiJ9XX19LCAiY2hlY2tzdW0iOiBudWxsfSwgeyJpZCI6ICJjbGllbnRjYWNoZSIsICJzdHJlYW0iOiAibm8iLCAibmFtZSI6ICJDbGllbnQgY2FjaGUiLCAiZGVzY3JpcHRpb24iOiAiTWFuYWdlIGNhY2hpbmcgZm9yIGNsaWVudHMuIiwgInZlcnNpb24iOiAiMS4wIiwgInR5cGUiOiAiY29yZSIsICJtZXRob2QiOiAibWFudWFsIiwgInBhZ2UiOiBmYWxzZSwgInNldHRpbmdzIjogeyJVU0VfQ0xJRU5UX0NBQ0hFIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIm5vIiwgImhlbHAiOiAiVGVsbCBjbGllbnQgdG8gc3RvcmUgbG9jYWxseSBzdGF0aWMgZmlsZXMuIiwgImlkIjogInVzZS1jbGllbnQtY2FjaGUiLCAibGFiZWwiOiAiVXNlIGNsaWVudCBjYWNoZSIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAiY29udGFpbmVyQ2xhc3MiOiAiei0zIiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgIm5hbWUiOiAiVXNlIGNsaWVudCBjYWNoZSIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiB0cnVlLCAidmFsdWUiOiAieWVzIiwgIm1ldGhvZCI6ICJzY2hlZHVsZXIiLCAicHJldl92YWx1ZSI6ICJ5ZXMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJ0cmVzcGFzcyIsICJ0ZXh0IjogImlucF9wb3BvdmVyX21ldGhvZF9kaXNhYmxlZCJ9LCB7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVGVsbCBjbGllbnQgdG8gc3RvcmUgbG9jYWxseSBzdGF0aWMgZmlsZXMuIn1dfSwgIkNMSUVOVF9DQUNIRV9FWFRFTlNJT05TIjogeyJjb250ZXh0IjogImdsb2JhbCIsICJkZWZhdWx0IjogImpwZ3xqcGVnfHBuZ3xibXB8aWNvfHN2Z3x0aWZ8Y3NzfGpzfG90Znx0dGZ8ZW90fHdvZmZ8d29mZjIiLCAiaGVscCI6ICJMaXN0IG9mIGZpbGUgZXh0ZW5zaW9ucywgc2VwYXJhdGVkIHdpdGggcGlwZXMgdGhhdCBzaG91bGQgYmUgY2FjaGVkLiIsICJpZCI6ICJjbGllbnQtY2FjaGUtZXh0ZW5zaW9ucyIsICJsYWJlbCI6ICJFeHRlbnNpb25zIHRoYXQgc2hvdWxkIGJlIGNhY2hlZCBieSB0aGUgY2xpZW50IiwgInJlZ2V4IjogIl4oPyFcXHwpKFxcfD8oW2EtejAtOV0rKSg/IS4qXFwyKD8hLikpKSskIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTIiLCAicGF0dGVybiI6ICJeKD8hXFx8KShcXHw/KFthLXowLTldKykoPyEuKlxcMig/IS4pKSkrJCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiRXh0ZW5zaW9ucyB0aGF0IHNob3VsZCBiZSBjYWNoZWQgYnkgdGhlIGNsaWVudCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogImpwZ3xqcGVnfHBuZ3xibXB8aWNvfHN2Z3x0aWZ8Y3NzfGpzfG90Znx0dGZ8ZW90fHdvZmZ8d29mZjIiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICJqcGd8anBlZ3xwbmd8Ym1wfGljb3xzdmd8dGlmfGNzc3xqc3xvdGZ8dHRmfGVvdHx3b2ZmfHdvZmYyIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZ2xvYmUiLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9nbG9iYWwifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBmaWxlIGV4dGVuc2lvbnMsIHNlcGFyYXRlZCB3aXRoIHBpcGVzIHRoYXQgc2hvdWxkIGJlIGNhY2hlZC4ifV19LCAiQ0xJRU5UX0NBQ0hFX0VUQUciOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAieWVzIiwgImhlbHAiOiAiU2VuZCB0aGUgSFRUUCBFVGFnIGhlYWRlciBmb3Igc3RhdGljIHJlc291cmNlcy4iLCAiaWQiOiAiY2xpZW50LWNhY2hlLWV0YWciLCAibGFiZWwiOiAiRVRhZyIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xIiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgIm5hbWUiOiAiRVRhZyIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogInllcyIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogInllcyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiU2VuZCB0aGUgSFRUUCBFVGFnIGhlYWRlciBmb3Igc3RhdGljIHJlc291cmNlcy4ifV19LCAiQ0xJRU5UX0NBQ0hFX0NPTlRST0wiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAicHVibGljLCBtYXgtYWdlPTE1NTUyMDAwIiwgImhlbHAiOiAiVmFsdWUgb2YgdGhlIENhY2hlLUNvbnRyb2wgSFRUUCBoZWFkZXIuIiwgImlkIjogImNsaWVudC1jYWNoZS1jb250cm9sIiwgImxhYmVsIjogIkNhY2hlLUNvbnRyb2wgaGVhZGVyIiwgInJlZ2V4IjogIl4oPyEoLCA/fCApKSgoLCApPygoKG1heC1hZ2V8cy1tYXhhZ2V8c3RhbGUtd2hpbGUtcmV2YWxpZGF0ZXxzdGFsZS1pZi1lcnJvcik9XFxkKyg/IS4qXFw2KSl8KCg/IS4qcHVibGljKXByaXZhdGV8KD8hLipwcml2YXRlKXB1YmxpYyl8KG11c3R8cHJveHkpLXJldmFsaWRhdGV8bXVzdC11bmRlcnN0YW5kfGltbXV0YWJsZXxuby0oY2FjaGV8c3RvcmV8dHJhbnNmb3JtKSkoPyEuKlxcNCkpKyQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotMCIsICJwYXR0ZXJuIjogIl4oPyEoLCA/fCApKSgoLCApPygoKG1heC1hZ2V8cy1tYXhhZ2V8c3RhbGUtd2hpbGUtcmV2YWxpZGF0ZXxzdGFsZS1pZi1lcnJvcik9XFxkKyg/IS4qXFw2KSl8KCg/IS4qcHVibGljKXByaXZhdGV8KD8hLipwcml2YXRlKXB1YmxpYyl8KG11c3R8cHJveHkpLXJldmFsaWRhdGV8bXVzdC11bmRlcnN0YW5kfGltbXV0YWJsZXxuby0oY2FjaGV8c3RvcmV8dHJhbnNmb3JtKSkoPyEuKlxcNCkpKyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIkNhY2hlLUNvbnRyb2wgaGVhZGVyIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAicHVibGljLCBtYXgtYWdlPTE1NTUyMDAwIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAicHVibGljLCBtYXgtYWdlPTE1NTUyMDAwIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJWYWx1ZSBvZiB0aGUgQ2FjaGUtQ29udHJvbCBIVFRQIGhlYWRlci4ifV19fSwgImNoZWNrc3VtIjogbnVsbH0sIHsiaWQiOiAiY291bnRyeSIsICJzdHJlYW0iOiAieWVzIiwgIm5hbWUiOiAiQ291bnRyeSIsICJkZXNjcmlwdGlvbiI6ICJEZW55IGFjY2VzcyBiYXNlZCBvbiB0aGUgY291bnRyeSBvZiB0aGUgY2xpZW50IElQLiIsICJ2ZXJzaW9uIjogIjEuMCIsICJ0eXBlIjogImNvcmUiLCAibWV0aG9kIjogIm1hbnVhbCIsICJwYWdlIjogdHJ1ZSwgInNldHRpbmdzIjogeyJCTEFDS0xJU1RfQ09VTlRSWSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJEZW55IGFjY2VzcyBpZiB0aGUgY291bnRyeSBvZiB0aGUgY2xpZW50IGlzIGluIHRoZSBsaXN0IChJU08gMzE2Ni0xIGFscGhhLTIgZm9ybWF0IHNlcGFyYXRlZCB3aXRoIHNwYWNlcykuIiwgImlkIjogImNvdW50cnktYmxhY2tsaXN0IiwgImxhYmVsIjogIkNvdW50cnkgYmxhY2tsaXN0IiwgInJlZ2V4IjogIl4oPyEgKSggKihbQS1aXXsyfSkoPyEuKlxcMikgKikqJCIsICJ0eXBlIjogInRleHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xIiwgInBhdHRlcm4iOiAiXig/ISApKCAqKFtBLVpdezJ9KSg/IS4qXFwyKSAqKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJDb3VudHJ5IGJsYWNrbGlzdCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiRGVueSBhY2Nlc3MgaWYgdGhlIGNvdW50cnkgb2YgdGhlIGNsaWVudCBpcyBpbiB0aGUgbGlzdCAoSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm1hdCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMpLiJ9XX0sICJXSElURUxJU1RfQ09VTlRSWSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJEZW55IGFjY2VzcyBpZiB0aGUgY291bnRyeSBvZiB0aGUgY2xpZW50IGlzIG5vdCBpbiB0aGUgbGlzdCAoSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm1hdCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMpLiIsICJpZCI6ICJjb3VudHJ5LXdoaXRlbGlzdCIsICJsYWJlbCI6ICJDb3VudHJ5IHdoaXRlbGlzdCIsICJyZWdleCI6ICJeKD8hICkoICooW0EtWl17Mn0pKD8hLipcXDIpICopKiQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotMCIsICJwYXR0ZXJuIjogIl4oPyEgKSggKihbQS1aXXsyfSkoPyEuKlxcMikgKikqJCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiQ291bnRyeSB3aGl0ZWxpc3QiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkRlbnkgYWNjZXNzIGlmIHRoZSBjb3VudHJ5IG9mIHRoZSBjbGllbnQgaXMgbm90IGluIHRoZSBsaXN0IChJU08gMzE2Ni0xIGFscGhhLTIgZm9ybWF0IHNlcGFyYXRlZCB3aXRoIHNwYWNlcykuIn1dfX0sICJjaGVja3N1bSI6IG51bGx9LCB7ImlkIjogImN1c3RvbWNlcnQiLCAic3RyZWFtIjogInllcyIsICJuYW1lIjogIkN1c3RvbSBIVFRQUyBjZXJ0aWZpY2F0ZSIsICJkZXNjcmlwdGlvbiI6ICJDaG9vc2UgY3VzdG9tIGNlcnRpZmljYXRlIGZvciBIVFRQUy4iLCAidmVyc2lvbiI6ICIxLjAiLCAidHlwZSI6ICJjb3JlIiwgIm1ldGhvZCI6ICJtYW51YWwiLCAicGFnZSI6IGZhbHNlLCAic2V0dGluZ3MiOiB7IlVTRV9DVVNUT01fU1NMIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIm5vIiwgImhlbHAiOiAiVXNlIGN1c3RvbSBIVFRQUyBjZXJ0aWZpY2F0ZS4iLCAiaWQiOiAidXNlLWN1c3RvbS1odHRwcyIsICJsYWJlbCI6ICJVc2UgY3VzdG9tIGNlcnRpZmljYXRlIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJjb250YWluZXJDbGFzcyI6ICJ6LTQiLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAibmFtZSI6ICJVc2UgY3VzdG9tIGNlcnRpZmljYXRlIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAibm8iLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICJubyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVXNlIGN1c3RvbSBIVFRQUyBjZXJ0aWZpY2F0ZS4ifV19LCAiQ1VTVE9NX1NTTF9DRVJUIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkZ1bGwgcGF0aCBvZiB0aGUgY2VydGlmaWNhdGUgb3IgYnVuZGxlIGZpbGUgKG11c3QgYmUgcmVhZGFibGUgYnkgdGhlIHNjaGVkdWxlcikuIiwgImlkIjogImN1c3RvbS1odHRwcy1jZXJ0IiwgImxhYmVsIjogIkNlcnRpZmljYXRlIHBhdGgiLCAicmVnZXgiOiAiXigvW1xcdy4gXFwtXSspKi8/JCIsICJ0eXBlIjogInRleHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0zIiwgInBhdHRlcm4iOiAiXigvW1xcdy4gXFwtXSspKi8/JCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiQ2VydGlmaWNhdGUgcGF0aCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiRnVsbCBwYXRoIG9mIHRoZSBjZXJ0aWZpY2F0ZSBvciBidW5kbGUgZmlsZSAobXVzdCBiZSByZWFkYWJsZSBieSB0aGUgc2NoZWR1bGVyKS4ifV19LCAiQ1VTVE9NX1NTTF9LRVkiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiRnVsbCBwYXRoIG9mIHRoZSBrZXkgZmlsZSAobXVzdCBiZSByZWFkYWJsZSBieSB0aGUgc2NoZWR1bGVyKS4iLCAiaWQiOiAiY3VzdG9tLWh0dHBzLWtleSIsICJsYWJlbCI6ICJLZXkgcGF0aCIsICJyZWdleCI6ICJeKC9bXFx3LiBcXC1dKykqLz8kIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTIiLCAicGF0dGVybiI6ICJeKC9bXFx3LiBcXC1dKykqLz8kIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJLZXkgcGF0aCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiRnVsbCBwYXRoIG9mIHRoZSBrZXkgZmlsZSAobXVzdCBiZSByZWFkYWJsZSBieSB0aGUgc2NoZWR1bGVyKS4ifV19LCAiQ1VTVE9NX1NTTF9DRVJUX0RBVEEiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiQ2VydGlmaWNhdGUgZGF0YSBlbmNvZGVkIGluIGJhc2U2NC4iLCAiaWQiOiAiY3VzdG9tLWh0dHBzLWNlcnQtZGF0YSIsICJsYWJlbCI6ICJDZXJ0aWZpY2F0ZSBkYXRhIChiYXNlNjQpIiwgInJlZ2V4IjogIl4uKiQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotMSIsICJwYXR0ZXJuIjogIl4uKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIkNlcnRpZmljYXRlIGRhdGEgKGJhc2U2NCkiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkNlcnRpZmljYXRlIGRhdGEgZW5jb2RlZCBpbiBiYXNlNjQuIn1dfSwgIkNVU1RPTV9TU0xfS0VZX0RBVEEiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiS2V5IGRhdGEgZW5jb2RlZCBpbiBiYXNlNjQuIiwgImlkIjogImN1c3RvbS1odHRwcy1rZXktZGF0YSIsICJsYWJlbCI6ICJLZXkgZGF0YSAoYmFzZTY0KSIsICJyZWdleCI6ICJeLiokIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTAiLCAicGF0dGVybiI6ICJeLiokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJLZXkgZGF0YSAoYmFzZTY0KSIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiS2V5IGRhdGEgZW5jb2RlZCBpbiBiYXNlNjQuIn1dfX0sICJjaGVja3N1bSI6IG51bGx9LCB7ImlkIjogImRiIiwgInN0cmVhbSI6ICJ5ZXMiLCAibmFtZSI6ICJEQiIsICJkZXNjcmlwdGlvbiI6ICJJbnRlZ3JhdGUgZWFzaWx5IHRoZSBEYXRhYmFzZS4iLCAidmVyc2lvbiI6ICIxLjAiLCAidHlwZSI6ICJjb3JlIiwgIm1ldGhvZCI6ICJtYW51YWwiLCAicGFnZSI6IGZhbHNlLCAic2V0dGluZ3MiOiB7IkRBVEFCQVNFX1VSSSI6IHsiY29udGV4dCI6ICJnbG9iYWwiLCAiZGVmYXVsdCI6ICJzcWxpdGU6Ly8vL3Zhci9saWIvYnVua2Vyd2ViL2RiLnNxbGl0ZTMiLCAiaGVscCI6ICJUaGUgZGF0YWJhc2UgVVJJLCBmb2xsb3dpbmcgdGhlIHNxbGFsY2hlbXkgZm9ybWF0LiIsICJpZCI6ICJkYXRhYmFzZS11cmkiLCAibGFiZWwiOiAiVGhlIGRhdGFiYXNlIFVSSSIsICJyZWdleCI6ICJeKChwb3N0Z3Jlc3FsfG15c3FsfG1hcmlhZGJ8c3FsaXRlKShcXCtbXFx3XFwtXSspPzouKyk/JCIsICJ0eXBlIjogInRleHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yIiwgInBhdHRlcm4iOiAiXigocG9zdGdyZXNxbHxteXNxbHxtYXJpYWRifHNxbGl0ZSkoXFwrW1xcd1xcLV0rKT86LispPyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIlRoZSBkYXRhYmFzZSBVUkkiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJzcWxpdGU6Ly8vL3Zhci9saWIvYnVua2Vyd2ViL2RiLnNxbGl0ZTMiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICJzcWxpdGU6Ly8vL3Zhci9saWIvYnVua2Vyd2ViL2RiLnNxbGl0ZTMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJnbG9iZSIsICJ0ZXh0IjogImlucF9wb3BvdmVyX2dsb2JhbCJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJUaGUgZGF0YWJhc2UgVVJJLCBmb2xsb3dpbmcgdGhlIHNxbGFsY2hlbXkgZm9ybWF0LiJ9XX0sICJEQVRBQkFTRV9VUklfUkVBRE9OTFkiOiB7ImNvbnRleHQiOiAiZ2xvYmFsIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiVGhlIGRhdGFiYXNlIFVSSSBmb3IgcmVhZC1vbmx5IG9wZXJhdGlvbnMsIGl0IGNhbiBhbHNvIHNlcnZlIGFzIGEgZmFsbGJhY2sgaWYgdGhlIG1haW4gZGF0YWJhc2UgaXMgZG93bi4gRm9sbG93aW5nIHRoZSBzcWxhbGNoZW15IGZvcm1hdC4iLCAiaWQiOiAiZGF0YWJhc2UtdXJpLXJlYWRvbmx5IiwgImxhYmVsIjogIlRoZSBkYXRhYmFzZSBVUkkgZm9yIHJlYWQtb25seSBvcGVyYXRpb25zIiwgInJlZ2V4IjogIl4oKHBvc3RncmVzcWx8bXlzcWx8bWFyaWFkYnxzcWxpdGUpKFxcK1tcXHdcXC1dKyk/Oi4rKT8kIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTEiLCAicGF0dGVybiI6ICJeKChwb3N0Z3Jlc3FsfG15c3FsfG1hcmlhZGJ8c3FsaXRlKShcXCtbXFx3XFwtXSspPzouKyk/JCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiVGhlIGRhdGFiYXNlIFVSSSBmb3IgcmVhZC1vbmx5IG9wZXJhdGlvbnMiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJnbG9iZSIsICJ0ZXh0IjogImlucF9wb3BvdmVyX2dsb2JhbCJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJUaGUgZGF0YWJhc2UgVVJJIGZvciByZWFkLW9ubHkgb3BlcmF0aW9ucywgaXQgY2FuIGFsc28gc2VydmUgYXMgYSBmYWxsYmFjayBpZiB0aGUgbWFpbiBkYXRhYmFzZSBpcyBkb3duLiBGb2xsb3dpbmcgdGhlIHNxbGFsY2hlbXkgZm9ybWF0LiJ9XX0sICJEQVRBQkFTRV9MT0dfTEVWRUwiOiB7ImNvbnRleHQiOiAiZ2xvYmFsIiwgImRlZmF1bHQiOiAid2FybmluZyIsICJoZWxwIjogIlRoZSBsZXZlbCB0byB1c2UgZm9yIGRhdGFiYXNlIGxvZ3MuIiwgImlkIjogImRhdGFiYXNlLWxvZy1sZXZlbCIsICJsYWJlbCI6ICJEYXRhYmFzZSBsb2cgbGV2ZWwiLCAicmVnZXgiOiAiXihkZWJ1Z3xpbmZvfHdhcm58d2FybmluZ3xlcnJvcikkIiwgInR5cGUiOiAic2VsZWN0IiwgImNvbnRhaW5lckNsYXNzIjogInotMCIsICJwYXR0ZXJuIjogIl4oZGVidWd8aW5mb3x3YXJufHdhcm5pbmd8ZXJyb3IpJCIsICJpbnBUeXBlIjogInNlbGVjdCIsICJuYW1lIjogIkRhdGFiYXNlIGxvZyBsZXZlbCIsICJ2YWx1ZXMiOiBbImRlYnVnIiwgImVycm9yIiwgImluZm8iLCAid2FybiIsICJ3YXJuaW5nIl0sICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIndhcm5pbmciLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICJ3YXJuaW5nIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZ2xvYmUiLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9nbG9iYWwifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVGhlIGxldmVsIHRvIHVzZSBmb3IgZGF0YWJhc2UgbG9ncy4ifV19fSwgImNoZWNrc3VtIjogbnVsbH0sIHsiaWQiOiAiZG5zYmwiLCAic3RyZWFtIjogInllcyIsICJuYW1lIjogIkROU0JMIiwgImRlc2NyaXB0aW9uIjogIkRlbnkgYWNjZXNzIGJhc2VkIG9uIGV4dGVybmFsIEROU0JMIHNlcnZlcnMuIiwgInZlcnNpb24iOiAiMS4wIiwgInR5cGUiOiAiY29yZSIsICJtZXRob2QiOiAibWFudWFsIiwgInBhZ2UiOiB0cnVlLCAic2V0dGluZ3MiOiB7IlVTRV9ETlNCTCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJ5ZXMiLCAiaGVscCI6ICJBY3RpdmF0ZSBETlNCTCBmZWF0dXJlLiIsICJpZCI6ICJ1c2UtZG5zYmwiLCAibGFiZWwiOiAiQWN0aXZhdGUgRE5TQkwiLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgImNvbnRhaW5lckNsYXNzIjogInotMSIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJuYW1lIjogIkFjdGl2YXRlIEROU0JMIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAieWVzIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAieWVzIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJBY3RpdmF0ZSBETlNCTCBmZWF0dXJlLiJ9XX0sICJETlNCTF9MSVNUIjogeyJjb250ZXh0IjogImdsb2JhbCIsICJkZWZhdWx0IjogImJsLmJsb2NrbGlzdC5kZSBwcm9ibGVtcy5kbnNibC5zb3Jicy5uZXQgc2JsLnNwYW1oYXVzLm9yZyB4Ymwuc3BhbWhhdXMub3JnIiwgImhlbHAiOiAiTGlzdCBvZiBETlNCTCBzZXJ2ZXJzLiIsICJpZCI6ICJkbnNibC1saXN0IiwgImxhYmVsIjogIkROU0JMIGxpc3QiLCAicmVnZXgiOiAiXig/ISApKCA/KCg/IVxcLilbXFx3Ll0rKSg/IS4qXFwyKD8hLikpKSokIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTAiLCAicGF0dGVybiI6ICJeKD8hICkoID8oKD8hXFwuKVtcXHcuXSspKD8hLipcXDIoPyEuKSkpKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIkROU0JMIGxpc3QiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJibC5ibG9ja2xpc3QuZGUgcHJvYmxlbXMuZG5zYmwuc29yYnMubmV0IHNibC5zcGFtaGF1cy5vcmcgeGJsLnNwYW1oYXVzLm9yZyIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogImJsLmJsb2NrbGlzdC5kZSBwcm9ibGVtcy5kbnNibC5zb3Jicy5uZXQgc2JsLnNwYW1oYXVzLm9yZyB4Ymwuc3BhbWhhdXMub3JnIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZ2xvYmUiLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9nbG9iYWwifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBETlNCTCBzZXJ2ZXJzLiJ9XX19LCAiY2hlY2tzdW0iOiBudWxsfSwgeyJpZCI6ICJlcnJvcnMiLCAic3RyZWFtIjogIm5vIiwgIm5hbWUiOiAiRXJyb3JzIiwgImRlc2NyaXB0aW9uIjogIk1hbmFnZSBkZWZhdWx0IGVycm9yIHBhZ2VzIiwgInZlcnNpb24iOiAiMS4wIiwgInR5cGUiOiAiY29yZSIsICJtZXRob2QiOiAibWFudWFsIiwgInBhZ2UiOiB0cnVlLCAic2V0dGluZ3MiOiB7IkVSUk9SUyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJMaXN0IG9mIEhUVFAgZXJyb3IgY29kZSBhbmQgY29ycmVzcG9uZGluZyBlcnJvciBwYWdlcywgc2VwYXJhdGVkIHdpdGggc3BhY2VzICg0MDQ9L215NDA0Lmh0bWwgNDAzPS9lcnJvcnMvNDAzLmh0bWwgLi4uKS4iLCAiaWQiOiAiZXJyb3JzIiwgImxhYmVsIjogIkVycm9ycyIsICJyZWdleCI6ICJeKD8hICkoID8oWzEtNV1cXGR7Mn0pKD8hLipcXDIoPyFbXj1dKSk9KFxcL1tcXHdcXF0ufjpcXC8/I1xcW0AhJFxcJidcXChcXCkqKyw7PVxcLV0qKSg/IS4qXFwzKD8hLikpKSokIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTEiLCAicGF0dGVybiI6ICJeKD8hICkoID8oWzEtNV1cXGR7Mn0pKD8hLipcXDIoPyFbXj1dKSk9KFxcL1tcXHdcXF0ufjpcXC8/I1xcW0AhJFxcJidcXChcXCkqKyw7PVxcLV0qKSg/IS4qXFwzKD8hLikpKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJFcnJvcnMiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkxpc3Qgb2YgSFRUUCBlcnJvciBjb2RlIGFuZCBjb3JyZXNwb25kaW5nIGVycm9yIHBhZ2VzLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMgKDQwND0vbXk0MDQuaHRtbCA0MDM9L2Vycm9ycy80MDMuaHRtbCAuLi4pLiJ9XX0sICJJTlRFUkNFUFRFRF9FUlJPUl9DT0RFUyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICI0MDAgNDAxIDQwMyA0MDQgNDA1IDQxMyA0MjkgNTAwIDUwMSA1MDIgNTAzIDUwNCIsICJoZWxwIjogIkxpc3Qgb2YgSFRUUCBlcnJvciBjb2RlIGludGVyY2VwdGVkIGJ5IEJ1bmtlcldlYiIsICJpZCI6ICJpbnRlcmNlcHRlZC1lcnJvci1jb2RlcyIsICJsYWJlbCI6ICJJbnRlcmNlcHRlZCBlcnJvciBjb2RlcyIsICJyZWdleCI6ICJeKCAqKFsxLTVdXFxkezJ9KSg/IS4qXFwyKSAqKSskIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTAiLCAicGF0dGVybiI6ICJeKCAqKFsxLTVdXFxkezJ9KSg/IS4qXFwyKSAqKSskIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJJbnRlcmNlcHRlZCBlcnJvciBjb2RlcyIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjQwMCA0MDEgNDAzIDQwNCA0MDUgNDEzIDQyOSA1MDAgNTAxIDUwMiA1MDMgNTA0IiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAiNDAwIDQwMSA0MDMgNDA0IDQwNSA0MTMgNDI5IDUwMCA1MDEgNTAyIDUwMyA1MDQiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkxpc3Qgb2YgSFRUUCBlcnJvciBjb2RlIGludGVyY2VwdGVkIGJ5IEJ1bmtlcldlYiJ9XX19LCAiY2hlY2tzdW0iOiBudWxsfSwgeyJpZCI6ICJncmV5bGlzdCIsICJzdHJlYW0iOiAicGFydGlhbCIsICJuYW1lIjogIkdyZXlsaXN0IiwgImRlc2NyaXB0aW9uIjogIkFsbG93IGFjY2VzcyB3aGlsZSBrZWVwaW5nIHNlY3VyaXR5IGZlYXR1cmVzIGJhc2VkIG9uIGludGVybmFsIGFuZCBleHRlcm5hbCBJUC9uZXR3b3JrL3JETlMvQVNOIGdyZXlsaXN0cy4iLCAidmVyc2lvbiI6ICIxLjAiLCAidHlwZSI6ICJjb3JlIiwgIm1ldGhvZCI6ICJtYW51YWwiLCAicGFnZSI6IHRydWUsICJzZXR0aW5ncyI6IHsiVVNFX0dSRVlMSVNUIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIm5vIiwgImhlbHAiOiAiQWN0aXZhdGUgZ3JleWxpc3QgZmVhdHVyZS4iLCAiaWQiOiAidXNlLWdyZXlsaXN0IiwgImxhYmVsIjogIkFjdGl2YXRlIGdyZXlsaXN0aW5nIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJjb250YWluZXJDbGFzcyI6ICJ6LTExIiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgIm5hbWUiOiAiQWN0aXZhdGUgZ3JleWxpc3RpbmciLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJubyIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIm5vIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJBY3RpdmF0ZSBncmV5bGlzdCBmZWF0dXJlLiJ9XX0sICJHUkVZTElTVF9JUCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJMaXN0IG9mIElQL25ldHdvcmssIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgdG8gcHV0IGludG8gdGhlIGdyZXlsaXN0LiIsICJpZCI6ICJncmV5bGlzdC1pcCIsICJsYWJlbCI6ICJHcmV5bGlzdCBJUC9uZXR3b3JrIiwgInJlZ2V4IjogIl4oPyEgKSggKigoKFxcYjI1WzAtNV18XFxiMlswLTRdXFxkfFxcYlswMV0/XFxkXFxkPykoXFwuKDI1WzAtNV18MlswLTRdXFxkfFswMV0/XFxkXFxkPykpezN9KShcXC8oWzEtMl1bMC05XT98M1swLTJdP3xbMDQtOV0pKT98KChbMC05YS1mQS1GXXsxLDR9Oil7N31bMC05YS1mQS1GXXsxLDR9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw3fTp8KFswLTlhLWZBLUZdezEsNH06KXsxLDZ9OlswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDV9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDJ9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw0fSg6WzAtOWEtZkEtRl17MSw0fSl7MSwzfXwoWzAtOWEtZkEtRl17MSw0fTopezEsM30oOlswLTlhLWZBLUZdezEsNH0pezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDJ9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDV9fFswLTlhLWZBLUZdezEsNH06KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw2fSl8OigoOlswLTlhLWZBLUZdezEsNH0pezEsN318Oil8ZmU4MDooOlswLTlhLWZBLUZdWnswLDR9KXswLDR9JVswLTlhLXpBLVpdK3w6OihmZmZmKDowezEsNH0pPzopPygoMjVbMC01XXwoMlswLTRdfDE/XFxkKT9cXGQpXFwuKXszfSgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZCl8KFswLTlhLWZBLUZdezEsNH06KXsxLDR9OigoMjVbMC01XXwoMlswLTRdfDE/XFxkKT9cXGQpXFwuKXszfSgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZCkpKFxcLygxMlswLThdfDFbMDFdWzAtOV18WzAtOV1bMC05XT8pKT8pKD8hLipcXERcXDIoW15cXGRcXC9dfCQpKSAqKSokIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTEwIiwgInBhdHRlcm4iOiAiXig/ISApKCAqKCgoXFxiMjVbMC01XXxcXGIyWzAtNF1cXGR8XFxiWzAxXT9cXGRcXGQ/KShcXC4oMjVbMC01XXwyWzAtNF1cXGR8WzAxXT9cXGRcXGQ/KSl7M30pKFxcLyhbMS0yXVswLTldP3wzWzAtMl0/fFswNC05XSkpP3woKFswLTlhLWZBLUZdezEsNH06KXs3fVswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDd9OnwoWzAtOWEtZkEtRl17MSw0fTopezEsNn06WzAtOWEtZkEtRl17MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsNX0oOlswLTlhLWZBLUZdezEsNH0pezEsMn18KFswLTlhLWZBLUZdezEsNH06KXsxLDR9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDN9fChbMC05YS1mQS1GXXsxLDR9Oil7MSwzfSg6WzAtOWEtZkEtRl17MSw0fSl7MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsMn0oOlswLTlhLWZBLUZdezEsNH0pezEsNX18WzAtOWEtZkEtRl17MSw0fTooKDpbMC05YS1mQS1GXXsxLDR9KXsxLDZ9KXw6KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw3fXw6KXxmZTgwOig6WzAtOWEtZkEtRl1aezAsNH0pezAsNH0lWzAtOWEtekEtWl0rfDo6KGZmZmYoOjB7MSw0fSk/Oik/KCgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZClcXC4pezN9KDI1WzAtNV18KDJbMC00XXwxP1xcZCk/XFxkKXwoWzAtOWEtZkEtRl17MSw0fTopezEsNH06KCgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZClcXC4pezN9KDI1WzAtNV18KDJbMC00XXwxP1xcZCk/XFxkKSkoXFwvKDEyWzAtOF18MVswMV1bMC05XXxbMC05XVswLTldPykpPykoPyEuKlxcRFxcMihbXlxcZFxcL118JCkpICopKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIkdyZXlsaXN0IElQL25ldHdvcmsiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkxpc3Qgb2YgSVAvbmV0d29yaywgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCB0byBwdXQgaW50byB0aGUgZ3JleWxpc3QuIn1dfSwgIkdSRVlMSVNUX1JETlMiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiTGlzdCBvZiByZXZlcnNlIEROUyBzdWZmaXhlcywgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCB0byBwdXQgaW50byB0aGUgZ3JleWxpc3QuIiwgImlkIjogImdyZXlsaXN0LXJkbnMiLCAibGFiZWwiOiAiR3JleWxpc3QgcmV2ZXJzZSBETlMiLCAicmVnZXgiOiAiXiggKigoW14gXSspKD8hLipcXDMoIHwkKSkpICopKiQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotOSIsICJwYXR0ZXJuIjogIl4oICooKFteIF0rKSg/IS4qXFwzKCB8JCkpKSAqKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJHcmV5bGlzdCByZXZlcnNlIEROUyIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiByZXZlcnNlIEROUyBzdWZmaXhlcywgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCB0byBwdXQgaW50byB0aGUgZ3JleWxpc3QuIn1dfSwgIkdSRVlMSVNUX1JETlNfR0xPQkFMIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogInllcyIsICJoZWxwIjogIk9ubHkgcGVyZm9ybSBSRE5TIGdyZXlsaXN0IGNoZWNrcyBvbiBnbG9iYWwgSVAgYWRkcmVzc2VzLiIsICJpZCI6ICJncmV5bGlzdC1yZG5zLWdsb2JhbCIsICJsYWJlbCI6ICJHcmV5bGlzdCByZXZlcnNlIEROUyBnbG9iYWwgSVBzIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJjb250YWluZXJDbGFzcyI6ICJ6LTgiLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAibmFtZSI6ICJHcmV5bGlzdCByZXZlcnNlIEROUyBnbG9iYWwgSVBzIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAieWVzIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAieWVzIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJPbmx5IHBlcmZvcm0gUkROUyBncmV5bGlzdCBjaGVja3Mgb24gZ2xvYmFsIElQIGFkZHJlc3Nlcy4ifV19LCAiR1JFWUxJU1RfQVNOIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkxpc3Qgb2YgQVNOIG51bWJlcnMsIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgdG8gcHV0IGludG8gdGhlIGdyZXlsaXN0LiIsICJpZCI6ICJncmV5bGlzdC1hc24iLCAibGFiZWwiOiAiR3JleWxpc3QgQVNOIiwgInJlZ2V4IjogIl5eKCAqKChBU04/KT8oXFxkKylcXGIoPyEuKltTTiBdXFw0XFxiKSkgKikqJCIsICJ0eXBlIjogInRleHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei03IiwgInBhdHRlcm4iOiAiXl4oICooKEFTTj8pPyhcXGQrKVxcYig/IS4qW1NOIF1cXDRcXGIpKSAqKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJHcmV5bGlzdCBBU04iLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkxpc3Qgb2YgQVNOIG51bWJlcnMsIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgdG8gcHV0IGludG8gdGhlIGdyZXlsaXN0LiJ9XX0sICJHUkVZTElTVF9VU0VSX0FHRU5UIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkxpc3Qgb2YgVXNlci1BZ2VudCAoUENSRSByZWdleCksIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgdG8gcHV0IGludG8gdGhlIGdyZXlsaXN0LiIsICJpZCI6ICJncmV5bGlzdC11c2VyLWFnZW50IiwgImxhYmVsIjogIkdyZXlsaXN0IFVzZXItQWdlbnQiLCAicmVnZXgiOiAiXi4qJCIsICJ0eXBlIjogInRleHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei02IiwgInBhdHRlcm4iOiAiXi4qJCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiR3JleWxpc3QgVXNlci1BZ2VudCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBVc2VyLUFnZW50IChQQ1JFIHJlZ2V4KSwgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCB0byBwdXQgaW50byB0aGUgZ3JleWxpc3QuIn1dfSwgIkdSRVlMSVNUX1VSSSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJMaXN0IG9mIFVSSSAoUENSRSByZWdleCksIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgdG8gcHV0IGludG8gdGhlIGdyZXlsaXN0LiIsICJpZCI6ICJncmV5bGlzdC11cmkiLCAibGFiZWwiOiAiR3JleWxpc3QgVVJJIiwgInJlZ2V4IjogIl4uKiQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotNSIsICJwYXR0ZXJuIjogIl4uKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIkdyZXlsaXN0IFVSSSIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBVUkkgKFBDUkUgcmVnZXgpLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIHRvIHB1dCBpbnRvIHRoZSBncmV5bGlzdC4ifV19LCAiR1JFWUxJU1RfSVBfVVJMUyI6IHsiY29udGV4dCI6ICJnbG9iYWwiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJMaXN0IG9mIFVSTHMsIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgY29udGFpbmluZyBnb29kIElQL25ldHdvcmsgdG8gcHV0IGludG8gdGhlIGdyZXlsaXN0LiIsICJpZCI6ICJncmV5bGlzdC1pcC11cmxzIiwgImxhYmVsIjogIkdyZXlsaXN0IElQL25ldHdvcmsgVVJMcyIsICJyZWdleCI6ICJeKCAqKChodHRwcz86XFwvXFwvfGZpbGU6XFwvXFwvXFwvKVtcXC1cXHdAOiUuK34jPV0rW1xcLVxcd1xcKFxcKSFAOiUrLn4jPyZcXC89JF0qKSg/IS4qXFwyKD8hLikpICopKiQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotNCIsICJwYXR0ZXJuIjogIl4oICooKGh0dHBzPzpcXC9cXC98ZmlsZTpcXC9cXC9cXC8pW1xcLVxcd0A6JS4rfiM9XStbXFwtXFx3XFwoXFwpIUA6JSsufiM/JlxcLz0kXSopKD8hLipcXDIoPyEuKSkgKikqJCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiR3JleWxpc3QgSVAvbmV0d29yayBVUkxzIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZ2xvYmUiLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9nbG9iYWwifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBVUkxzLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIGNvbnRhaW5pbmcgZ29vZCBJUC9uZXR3b3JrIHRvIHB1dCBpbnRvIHRoZSBncmV5bGlzdC4ifV19LCAiR1JFWUxJU1RfUkROU19VUkxTIjogeyJjb250ZXh0IjogImdsb2JhbCIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkxpc3Qgb2YgVVJMcywgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCBjb250YWluaW5nIHJldmVyc2UgRE5TIHN1ZmZpeGVzIHRvIHB1dCBpbnRvIHRoZSBncmV5bGlzdC4iLCAiaWQiOiAiZ3JleWxpc3QtcmRucy11cmxzIiwgImxhYmVsIjogIkdyZXlsaXN0IHJldmVyc2UgRE5TIFVSTHMiLCAicmVnZXgiOiAiXiggKigoaHR0cHM/OlxcL1xcL3xmaWxlOlxcL1xcL1xcLylbXFwtXFx3QDolLit+Iz1dK1tcXC1cXHdcXChcXCkhQDolKy5+Iz8mXFwvPSRdKikoPyEuKlxcMig/IS4pKSAqKSokIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTMiLCAicGF0dGVybiI6ICJeKCAqKChodHRwcz86XFwvXFwvfGZpbGU6XFwvXFwvXFwvKVtcXC1cXHdAOiUuK34jPV0rW1xcLVxcd1xcKFxcKSFAOiUrLn4jPyZcXC89JF0qKSg/IS4qXFwyKD8hLikpICopKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIkdyZXlsaXN0IHJldmVyc2UgRE5TIFVSTHMiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJnbG9iZSIsICJ0ZXh0IjogImlucF9wb3BvdmVyX2dsb2JhbCJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJMaXN0IG9mIFVSTHMsIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgY29udGFpbmluZyByZXZlcnNlIEROUyBzdWZmaXhlcyB0byBwdXQgaW50byB0aGUgZ3JleWxpc3QuIn1dfSwgIkdSRVlMSVNUX0FTTl9VUkxTIjogeyJjb250ZXh0IjogImdsb2JhbCIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkxpc3Qgb2YgVVJMcywgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCBjb250YWluaW5nIEFTTiB0byBwdXQgaW50byB0aGUgZ3JleWxpc3QuIiwgImlkIjogImdyZXlsaXN0LWFzbi11cmxzIiwgImxhYmVsIjogIkdyZXlsaXN0IEFTTiBVUkxzIiwgInJlZ2V4IjogIl4oICooKGh0dHBzPzpcXC9cXC98ZmlsZTpcXC9cXC9cXC8pW1xcLVxcd0A6JS4rfiM9XStbXFwtXFx3XFwoXFwpIUA6JSsufiM/JlxcLz0kXSopKD8hLipcXDIoPyEuKSkgKikqJCIsICJ0eXBlIjogInRleHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yIiwgInBhdHRlcm4iOiAiXiggKigoaHR0cHM/OlxcL1xcL3xmaWxlOlxcL1xcL1xcLylbXFwtXFx3QDolLit+Iz1dK1tcXC1cXHdcXChcXCkhQDolKy5+Iz8mXFwvPSRdKikoPyEuKlxcMig/IS4pKSAqKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJHcmV5bGlzdCBBU04gVVJMcyIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImdsb2JlIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfZ2xvYmFsIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkxpc3Qgb2YgVVJMcywgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCBjb250YWluaW5nIEFTTiB0byBwdXQgaW50byB0aGUgZ3JleWxpc3QuIn1dfSwgIkdSRVlMSVNUX1VTRVJfQUdFTlRfVVJMUyI6IHsiY29udGV4dCI6ICJnbG9iYWwiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJMaXN0IG9mIFVSTHMsIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgY29udGFpbmluZyBnb29kIFVzZXItQWdlbnQgdG8gcHV0IGludG8gdGhlIGdyZXlsaXN0LiIsICJpZCI6ICJncmV5bGlzdC11c2VyLWFnZW50LXVybHMiLCAibGFiZWwiOiAiR3JleWxpc3QgVXNlci1BZ2VudCBVUkxzIiwgInJlZ2V4IjogIl4oICooKGh0dHBzPzpcXC9cXC98ZmlsZTpcXC9cXC9cXC8pW1xcLVxcd0A6JS4rfiM9XStbXFwtXFx3XFwoXFwpIUA6JSsufiM/JlxcLz0kXSopKD8hLipcXDIoPyEuKSkgKikqJCIsICJ0eXBlIjogInRleHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xIiwgInBhdHRlcm4iOiAiXiggKigoaHR0cHM/OlxcL1xcL3xmaWxlOlxcL1xcL1xcLylbXFwtXFx3QDolLit+Iz1dK1tcXC1cXHdcXChcXCkhQDolKy5+Iz8mXFwvPSRdKikoPyEuKlxcMig/IS4pKSAqKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJHcmV5bGlzdCBVc2VyLUFnZW50IFVSTHMiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJnbG9iZSIsICJ0ZXh0IjogImlucF9wb3BvdmVyX2dsb2JhbCJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJMaXN0IG9mIFVSTHMsIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgY29udGFpbmluZyBnb29kIFVzZXItQWdlbnQgdG8gcHV0IGludG8gdGhlIGdyZXlsaXN0LiJ9XX0sICJHUkVZTElTVF9VUklfVVJMUyI6IHsiY29udGV4dCI6ICJnbG9iYWwiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJMaXN0IG9mIFVSTHMsIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgY29udGFpbmluZyBiYWQgVVJJIHRvIHB1dCBpbnRvIHRoZSBncmV5bGlzdC4iLCAiaWQiOiAiZ3JleWxpc3QtdXJpLXVybHMiLCAibGFiZWwiOiAiR3JleWxpc3QgVVJJIFVSTHMiLCAicmVnZXgiOiAiXiggKigoaHR0cHM/OlxcL1xcL3xmaWxlOlxcL1xcL1xcLylbXFwtXFx3QDolLit+Iz1dK1tcXC1cXHdcXChcXCkhQDolKy5+Iz8mXFwvPSRdKikoPyEuKlxcMig/IS4pKSAqKSokIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTAiLCAicGF0dGVybiI6ICJeKCAqKChodHRwcz86XFwvXFwvfGZpbGU6XFwvXFwvXFwvKVtcXC1cXHdAOiUuK34jPV0rW1xcLVxcd1xcKFxcKSFAOiUrLn4jPyZcXC89JF0qKSg/IS4qXFwyKD8hLikpICopKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIkdyZXlsaXN0IFVSSSBVUkxzIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZ2xvYmUiLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9nbG9iYWwifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBVUkxzLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIGNvbnRhaW5pbmcgYmFkIFVSSSB0byBwdXQgaW50byB0aGUgZ3JleWxpc3QuIn1dfX0sICJjaGVja3N1bSI6IG51bGx9LCB7ImlkIjogImd6aXAiLCAic3RyZWFtIjogIm5vIiwgIm5hbWUiOiAiR3ppcCIsICJkZXNjcmlwdGlvbiI6ICJDb21wcmVzcyBIVFRQIHJlcXVlc3RzIHdpdGggdGhlIGd6aXAgYWxnb3JpdGhtLiIsICJ2ZXJzaW9uIjogIjEuMCIsICJ0eXBlIjogImNvcmUiLCAibWV0aG9kIjogIm1hbnVhbCIsICJwYWdlIjogZmFsc2UsICJzZXR0aW5ncyI6IHsiVVNFX0daSVAiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAibm8iLCAiaGVscCI6ICJVc2UgZ3ppcCIsICJpZCI6ICJ1c2UtZ3ppcCIsICJsYWJlbCI6ICJVc2UgZ3ppcCIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAiY29udGFpbmVyQ2xhc3MiOiAiei00IiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgIm5hbWUiOiAiVXNlIGd6aXAiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogdHJ1ZSwgInZhbHVlIjogInllcyIsICJtZXRob2QiOiAic2NoZWR1bGVyIiwgInByZXZfdmFsdWUiOiAieWVzIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAidHJlc3Bhc3MiLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tZXRob2RfZGlzYWJsZWQifSwgeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlVzZSBnemlwIn1dfSwgIkdaSVBfVFlQRVMiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiYXBwbGljYXRpb24vYXRvbSt4bWwgYXBwbGljYXRpb24vamF2YXNjcmlwdCBhcHBsaWNhdGlvbi9qc29uIGFwcGxpY2F0aW9uL3Jzcyt4bWwgYXBwbGljYXRpb24vdm5kLm1zLWZvbnRvYmplY3QgYXBwbGljYXRpb24veC1mb250LW9wZW50eXBlIGFwcGxpY2F0aW9uL3gtZm9udC10cnVldHlwZSBhcHBsaWNhdGlvbi94LWZvbnQtdHRmIGFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCBhcHBsaWNhdGlvbi94aHRtbCt4bWwgYXBwbGljYXRpb24veG1sIGZvbnQvZW90IGZvbnQvb3BlbnR5cGUgZm9udC9vdGYgZm9udC90cnVldHlwZSBpbWFnZS9zdmcreG1sIGltYWdlL3ZuZC5taWNyb3NvZnQuaWNvbiBpbWFnZS94LWljb24gaW1hZ2UveC13aW4tYml0bWFwIHRleHQvY3NzIHRleHQvamF2YXNjcmlwdCB0ZXh0L3BsYWluIHRleHQveG1sIiwgImhlbHAiOiAiTGlzdCBvZiBNSU1FIHR5cGVzIHRoYXQgd2lsbCBiZSBjb21wcmVzc2VkIHdpdGggZ3ppcC4iLCAiaWQiOiAiZ3ppcC10eXBlcyIsICJsYWJlbCI6ICJNSU1FIHR5cGVzIiwgInJlZ2V4IjogIl4oPyEgKSggPyhbXFwtXFx3Ll0rL1tcXC1cXHcuK10rKSg/IS4qXFwyKD8hLikpKSskIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTMiLCAicGF0dGVybiI6ICJeKD8hICkoID8oW1xcLVxcdy5dKy9bXFwtXFx3LitdKykoPyEuKlxcMig/IS4pKSkrJCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiTUlNRSB0eXBlcyIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogImFwcGxpY2F0aW9uL2F0b20reG1sIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQgYXBwbGljYXRpb24vanNvbiBhcHBsaWNhdGlvbi9yc3MreG1sIGFwcGxpY2F0aW9uL3ZuZC5tcy1mb250b2JqZWN0IGFwcGxpY2F0aW9uL3gtZm9udC1vcGVudHlwZSBhcHBsaWNhdGlvbi94LWZvbnQtdHJ1ZXR5cGUgYXBwbGljYXRpb24veC1mb250LXR0ZiBhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQgYXBwbGljYXRpb24veGh0bWwreG1sIGFwcGxpY2F0aW9uL3htbCBmb250L2VvdCBmb250L29wZW50eXBlIGZvbnQvb3RmIGZvbnQvdHJ1ZXR5cGUgaW1hZ2Uvc3ZnK3htbCBpbWFnZS92bmQubWljcm9zb2Z0Lmljb24gaW1hZ2UveC1pY29uIGltYWdlL3gtd2luLWJpdG1hcCB0ZXh0L2NzcyB0ZXh0L2phdmFzY3JpcHQgdGV4dC9wbGFpbiB0ZXh0L3htbCIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogImFwcGxpY2F0aW9uL2F0b20reG1sIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQgYXBwbGljYXRpb24vanNvbiBhcHBsaWNhdGlvbi9yc3MreG1sIGFwcGxpY2F0aW9uL3ZuZC5tcy1mb250b2JqZWN0IGFwcGxpY2F0aW9uL3gtZm9udC1vcGVudHlwZSBhcHBsaWNhdGlvbi94LWZvbnQtdHJ1ZXR5cGUgYXBwbGljYXRpb24veC1mb250LXR0ZiBhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQgYXBwbGljYXRpb24veGh0bWwreG1sIGFwcGxpY2F0aW9uL3htbCBmb250L2VvdCBmb250L29wZW50eXBlIGZvbnQvb3RmIGZvbnQvdHJ1ZXR5cGUgaW1hZ2Uvc3ZnK3htbCBpbWFnZS92bmQubWljcm9zb2Z0Lmljb24gaW1hZ2UveC1pY29uIGltYWdlL3gtd2luLWJpdG1hcCB0ZXh0L2NzcyB0ZXh0L2phdmFzY3JpcHQgdGV4dC9wbGFpbiB0ZXh0L3htbCIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBNSU1FIHR5cGVzIHRoYXQgd2lsbCBiZSBjb21wcmVzc2VkIHdpdGggZ3ppcC4ifV19LCAiR1pJUF9NSU5fTEVOR1RIIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIjEwMDAiLCAiaGVscCI6ICJNaW5pbXVtIGxlbmd0aCBmb3IgZ3ppcCBjb21wcmVzc2lvbi4iLCAiaWQiOiAiZ3ppcC1taW4tbGVuZ3RoIiwgImxhYmVsIjogIk1pbmltdW0gbGVuZ3RoIiwgInJlZ2V4IjogIl5cXGQrJCIsICJ0eXBlIjogInRleHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yIiwgInBhdHRlcm4iOiAiXlxcZCskIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJNaW5pbXVtIGxlbmd0aCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjEwMDAiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICIxMDAwIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJNaW5pbXVtIGxlbmd0aCBmb3IgZ3ppcCBjb21wcmVzc2lvbi4ifV19LCAiR1pJUF9DT01QX0xFVkVMIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIjUiLCAiaGVscCI6ICJUaGUgY29tcHJlc3Npb24gbGV2ZWwgb2YgdGhlIGd6aXAgYWxnb3JpdGhtLiIsICJpZCI6ICJnemlwLWNvbXAtbGV2ZWwiLCAibGFiZWwiOiAiQ29tcHJlc3Npb24gbGV2ZWwiLCAicmVnZXgiOiAiXlsxLTldJCIsICJ0eXBlIjogInNlbGVjdCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTEiLCAicGF0dGVybiI6ICJeWzEtOV0kIiwgImlucFR5cGUiOiAic2VsZWN0IiwgIm5hbWUiOiAiQ29tcHJlc3Npb24gbGV2ZWwiLCAidmFsdWVzIjogWyIxIiwgIjIiLCAiMyIsICI0IiwgIjUiLCAiNiIsICI3IiwgIjgiLCAiOSJdLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICI1IiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAiNSIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVGhlIGNvbXByZXNzaW9uIGxldmVsIG9mIHRoZSBnemlwIGFsZ29yaXRobS4ifV19LCAiR1pJUF9QUk9YSUVEIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIm5vLWNhY2hlIG5vLXN0b3JlIHByaXZhdGUgZXhwaXJlZCBhdXRoIiwgImhlbHAiOiAiV2hpY2gga2luZCBvZiBwcm94aWVkIHJlcXVlc3RzIHdlIHNob3VsZCBjb21wcmVzcy4iLCAiaWQiOiAiZ3ppcC1wcm94aWVkIiwgImxhYmVsIjogIlByb3hpZWQgcmVxdWVzdHMiLCAicmVnZXgiOiAiXi4qJCIsICJ0eXBlIjogInRleHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0wIiwgInBhdHRlcm4iOiAiXi4qJCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiUHJveGllZCByZXF1ZXN0cyIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIm5vLWNhY2hlIG5vLXN0b3JlIHByaXZhdGUgZXhwaXJlZCBhdXRoIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAibm8tY2FjaGUgbm8tc3RvcmUgcHJpdmF0ZSBleHBpcmVkIGF1dGgiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIldoaWNoIGtpbmQgb2YgcHJveGllZCByZXF1ZXN0cyB3ZSBzaG91bGQgY29tcHJlc3MuIn1dfX0sICJjaGVja3N1bSI6IG51bGx9LCB7ImlkIjogImluamVjdCIsICJzdHJlYW0iOiAibm8iLCAibmFtZSI6ICJIVE1MIGluamVjdGlvbiIsICJkZXNjcmlwdGlvbiI6ICJJbmplY3QgY3VzdG9tIEhUTUwgY29kZSBiZWZvcmUgdGhlIDwvYm9keT4gdGFnLiIsICJ2ZXJzaW9uIjogIjEuMCIsICJ0eXBlIjogImNvcmUiLCAibWV0aG9kIjogIm1hbnVhbCIsICJwYWdlIjogZmFsc2UsICJzZXR0aW5ncyI6IHsiSU5KRUNUX0JPRFkiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiVGhlIEhUTUwgY29kZSB0byBpbmplY3QuIiwgImlkIjogImluamVjdC1ib2R5IiwgImxhYmVsIjogIkhUTUwgY29kZSIsICJyZWdleCI6ICJeLiokIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTAiLCAicGF0dGVybiI6ICJeLiokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJIVE1MIGNvZGUiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlRoZSBIVE1MIGNvZGUgdG8gaW5qZWN0LiJ9XX19LCAiY2hlY2tzdW0iOiBudWxsfSwgeyJpZCI6ICJoZWFkZXJzIiwgInN0cmVhbSI6ICJubyIsICJuYW1lIjogIkhlYWRlcnMiLCAiZGVzY3JpcHRpb24iOiAiTWFuYWdlIEhUVFAgaGVhZGVycyBzZW50IHRvIGNsaWVudHMuIiwgInZlcnNpb24iOiAiMS4wIiwgInR5cGUiOiAiY29yZSIsICJtZXRob2QiOiAibWFudWFsIiwgInBhZ2UiOiBmYWxzZSwgInNldHRpbmdzIjogeyJSRU1PVkVfSEVBREVSUyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJTZXJ2ZXIgRXhwZWN0LUNUIFgtUG93ZXJlZC1CeSBYLUFzcE5ldC1WZXJzaW9uIFgtQXNwTmV0TXZjLVZlcnNpb24iLCAiaGVscCI6ICJIZWFkZXJzIHRvIHJlbW92ZSAoSGVhZGVyMSBIZWFkZXIyIEhlYWRlcjMgLi4uKSIsICJpZCI6ICJyZW1vdmUtaGVhZGVycyIsICJsYWJlbCI6ICJSZW1vdmUgaGVhZGVycyIsICJyZWdleCI6ICJeKD8hICkoID9bXFx3XFwtXSspKiQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotMTIiLCAicGF0dGVybiI6ICJeKD8hICkoID9bXFx3XFwtXSspKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIlJlbW92ZSBoZWFkZXJzIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiU2VydmVyIEV4cGVjdC1DVCBYLVBvd2VyZWQtQnkgWC1Bc3BOZXQtVmVyc2lvbiBYLUFzcE5ldE12Yy1WZXJzaW9uIFB1YmxpYy1LZXktUGlucyIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIlNlcnZlciBFeHBlY3QtQ1QgWC1Qb3dlcmVkLUJ5IFgtQXNwTmV0LVZlcnNpb24gWC1Bc3BOZXRNdmMtVmVyc2lvbiBQdWJsaWMtS2V5LVBpbnMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkhlYWRlcnMgdG8gcmVtb3ZlIChIZWFkZXIxIEhlYWRlcjIgSGVhZGVyMyAuLi4pIn1dfSwgIktFRVBfVVBTVFJFQU1fSEVBREVSUyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJDb250ZW50LVNlY3VyaXR5LVBvbGljeSBQZXJtaXNzaW9ucy1Qb2xpY3kgRmVhdHVyZS1Qb2xpY3kgWC1GcmFtZS1PcHRpb25zIiwgImhlbHAiOiAiSGVhZGVycyB0byBrZWVwIGZyb20gdXBzdHJlYW0gKEhlYWRlcjEgSGVhZGVyMiBIZWFkZXIzIC4uLiBvciAqIGZvciBhbGwpLiIsICJpZCI6ICJrZWVwLXVwc3RyZWFtLWhlYWRlcnMiLCAibGFiZWwiOiAiS2VlcCB1cHN0cmVhbSBoZWFkZXJzIiwgInJlZ2V4IjogIl4oKD8hICkoID9bXFx3XFwtXSspK3xcXCopPyQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotMTEiLCAicGF0dGVybiI6ICJeKCg/ISApKCA/W1xcd1xcLV0rKSt8XFwqKT8kIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJLZWVwIHVwc3RyZWFtIGhlYWRlcnMiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJDb250ZW50LVNlY3VyaXR5LVBvbGljeSBQZXJtaXNzaW9ucy1Qb2xpY3kgWC1GcmFtZS1PcHRpb25zIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAiQ29udGVudC1TZWN1cml0eS1Qb2xpY3kgUGVybWlzc2lvbnMtUG9saWN5IFgtRnJhbWUtT3B0aW9ucyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiSGVhZGVycyB0byBrZWVwIGZyb20gdXBzdHJlYW0gKEhlYWRlcjEgSGVhZGVyMiBIZWFkZXIzIC4uLiBvciAqIGZvciBhbGwpLiJ9XX0sICJTVFJJQ1RfVFJBTlNQT1JUX1NFQ1VSSVRZIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIm1heC1hZ2U9MzE1MzYwMDAiLCAiaGVscCI6ICJWYWx1ZSBmb3IgdGhlIFN0cmljdC1UcmFuc3BvcnQtU2VjdXJpdHkgaGVhZGVyLiIsICJpZCI6ICJzdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5IiwgImxhYmVsIjogIlN0cmljdC1UcmFuc3BvcnQtU2VjdXJpdHkiLCAicmVnZXgiOiAiXm1heC1hZ2U9XFxkKyg7IGluY2x1ZGVTdWJEb21haW5zKDsgcHJlbG9hZCk/KT8kIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTEwIiwgInBhdHRlcm4iOiAiXm1heC1hZ2U9XFxkKyg7IGluY2x1ZGVTdWJEb21haW5zKDsgcHJlbG9hZCk/KT8kIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJTdHJpY3QtVHJhbnNwb3J0LVNlY3VyaXR5IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAibWF4LWFnZT0zMTUzNjAwMDsgaW5jbHVkZVN1YkRvbWFpbnM7IHByZWxvYWQiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICJtYXgtYWdlPTMxNTM2MDAwOyBpbmNsdWRlU3ViRG9tYWluczsgcHJlbG9hZCIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVmFsdWUgZm9yIHRoZSBTdHJpY3QtVHJhbnNwb3J0LVNlY3VyaXR5IGhlYWRlci4ifV19LCAiQ09PS0lFX0FVVE9fU0VDVVJFX0ZMQUciOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAieWVzIiwgImhlbHAiOiAiQXV0b21hdGljYWxseSBhZGQgdGhlIFNlY3VyZSBmbGFnIHRvIGFsbCBjb29raWVzLiIsICJpZCI6ICJjb29raWUtYXV0by1zZWN1cmUtZmxhZyIsICJsYWJlbCI6ICJDb29raWUgYXV0byBTZWN1cmUgZmxhZyIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAiY29udGFpbmVyQ2xhc3MiOiAiei04IiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgIm5hbWUiOiAiQ29va2llIGF1dG8gU2VjdXJlIGZsYWciLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJ5ZXMiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICJ5ZXMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkF1dG9tYXRpY2FsbHkgYWRkIHRoZSBTZWN1cmUgZmxhZyB0byBhbGwgY29va2llcy4ifV19LCAiQ09OVEVOVF9TRUNVUklUWV9QT0xJQ1kiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAib2JqZWN0LXNyYyAnbm9uZSc7IGZvcm0tYWN0aW9uICdzZWxmJzsgZnJhbWUtYW5jZXN0b3JzICdzZWxmJzsiLCAiaGVscCI6ICJWYWx1ZSBmb3IgdGhlIENvbnRlbnQtU2VjdXJpdHktUG9saWN5IGhlYWRlci4iLCAiaWQiOiAiY29udGVudC1zZWN1cml0eS1wb2xpY3kiLCAibGFiZWwiOiAiQ29udGVudC1TZWN1cml0eS1Qb2xpY3kiLCAicmVnZXgiOiAiXi4qJCIsICJ0eXBlIjogInRleHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei03IiwgInBhdHRlcm4iOiAiXi4qJCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiQ29udGVudC1TZWN1cml0eS1Qb2xpY3kiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJvYmplY3Qtc3JjICdub25lJzsgZm9ybS1hY3Rpb24gJ3NlbGYnOyBmcmFtZS1hbmNlc3RvcnMgJ3NlbGYnOyIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIm9iamVjdC1zcmMgJ25vbmUnOyBmb3JtLWFjdGlvbiAnc2VsZic7IGZyYW1lLWFuY2VzdG9ycyAnc2VsZic7IiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJWYWx1ZSBmb3IgdGhlIENvbnRlbnQtU2VjdXJpdHktUG9saWN5IGhlYWRlci4ifV19LCAiQ09OVEVOVF9TRUNVUklUWV9QT0xJQ1lfUkVQT1JUX09OTFkiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAibm8iLCAiaGVscCI6ICJTZW5kIHJlcG9ydHMgZm9yIHZpb2xhdGlvbnMgb2YgdGhlIENvbnRlbnQtU2VjdXJpdHktUG9saWN5IGhlYWRlciBpbnN0ZWFkIG9mIGJsb2NraW5nIHRoZW0uIiwgImlkIjogImNvbnRlbnQtc2VjdXJpdHktcG9saWN5LXJlcG9ydC1vbmx5IiwgImxhYmVsIjogIkNvbnRlbnQtU2VjdXJpdHktUG9saWN5LVJlcG9ydC1Pbmx5IiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJjb250YWluZXJDbGFzcyI6ICJ6LTYiLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAibmFtZSI6ICJDb250ZW50LVNlY3VyaXR5LVBvbGljeS1SZXBvcnQtT25seSIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIm5vIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAibm8iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlNlbmQgcmVwb3J0cyBmb3IgdmlvbGF0aW9ucyBvZiB0aGUgQ29udGVudC1TZWN1cml0eS1Qb2xpY3kgaGVhZGVyIGluc3RlYWQgb2YgYmxvY2tpbmcgdGhlbS4ifV19LCAiUkVGRVJSRVJfUE9MSUNZIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogInN0cmljdC1vcmlnaW4td2hlbi1jcm9zcy1vcmlnaW4iLCAiaGVscCI6ICJWYWx1ZSBmb3IgdGhlIFJlZmVycmVyLVBvbGljeSBoZWFkZXIuIiwgImlkIjogInJlZmVycmVyLXBvbGljeSIsICJsYWJlbCI6ICJSZWZlcnJlci1Qb2xpY3kiLCAicmVnZXgiOiAiXig/IV4oLHwgKSkoKCwgKT8obm8tcmVmZXJyZXItd2hlbi1kb3duZ3JhZGV8bm8tcmVmZXJyZXJ8b3JpZ2luLXdoZW4tY3Jvc3Mtb3JpZ2lufHNhbWUtb3JpZ2lufHN0cmljdC1vcmlnaW4td2hlbi1jcm9zcy1vcmlnaW58c3RyaWN0LW9yaWdpbnxvcmlnaW58dW5zYWZlLXVybCkoPyFcXGIuKiwgXFw0XFxiKSkqJCIsICJ0eXBlIjogInRleHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei01IiwgInBhdHRlcm4iOiAiXig/IV4oLHwgKSkoKCwgKT8obm8tcmVmZXJyZXItd2hlbi1kb3duZ3JhZGV8bm8tcmVmZXJyZXJ8b3JpZ2luLXdoZW4tY3Jvc3Mtb3JpZ2lufHNhbWUtb3JpZ2lufHN0cmljdC1vcmlnaW4td2hlbi1jcm9zcy1vcmlnaW58c3RyaWN0LW9yaWdpbnxvcmlnaW58dW5zYWZlLXVybCkoPyFcXGIuKiwgXFw0XFxiKSkqJCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiUmVmZXJyZXItUG9saWN5IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAic3RyaWN0LW9yaWdpbi13aGVuLWNyb3NzLW9yaWdpbiIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogInN0cmljdC1vcmlnaW4td2hlbi1jcm9zcy1vcmlnaW4iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlZhbHVlIGZvciB0aGUgUmVmZXJyZXItUG9saWN5IGhlYWRlci4ifV19LCAiUEVSTUlTU0lPTlNfUE9MSUNZIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogImFjY2VsZXJvbWV0ZXI9KCksIGFtYmllbnQtbGlnaHQtc2Vuc29yPSgpLCBhdXRvcGxheT0oKSwgYmF0dGVyeT0oKSwgY2FtZXJhPSgpLCBjcm9zcy1vcmlnaW4taXNvbGF0ZWQ9KCksIGRpc3BsYXktY2FwdHVyZT0oKSwgZG9jdW1lbnQtZG9tYWluPSgpLCBlbmNyeXB0ZWQtbWVkaWE9KCksIGV4ZWN1dGlvbi13aGlsZS1ub3QtcmVuZGVyZWQ9KCksIGV4ZWN1dGlvbi13aGlsZS1vdXQtb2Ytdmlld3BvcnQ9KCksIGZ1bGxzY3JlZW49KCksIGdlb2xvY2F0aW9uPSgpLCBneXJvc2NvcGU9KCksIGhpZD0oKSwgaWRsZS1kZXRlY3Rpb249KCksIG1hZ25ldG9tZXRlcj0oKSwgbWljcm9waG9uZT0oKSwgbWlkaT0oKSwgbmF2aWdhdGlvbi1vdmVycmlkZT0oKSwgcGF5bWVudD0oKSwgcGljdHVyZS1pbi1waWN0dXJlPSgpLCBwdWJsaWNrZXktY3JlZGVudGlhbHMtZ2V0PSgpLCBzY3JlZW4td2FrZS1sb2NrPSgpLCBzZXJpYWw9KCksIHVzYj0oKSwgd2ViLXNoYXJlPSgpLCB4ci1zcGF0aWFsLXRyYWNraW5nPSgpIiwgImhlbHAiOiAiVmFsdWUgZm9yIHRoZSBQZXJtaXNzaW9ucy1Qb2xpY3kgaGVhZGVyLiIsICJpZCI6ICJwZXJtaXNzaW9ucy1wb2xpY3kiLCAibGFiZWwiOiAiUGVybWlzc2lvbnMtUG9saWN5IiwgInJlZ2V4IjogIl4oPyFbLCBdKSgsPyA/KFthLXpcXC1dKykoPyEuKlteXFwtXVxcMj0pPShcXCp8XFwoKCA/KHNlbGZ8XFx1MDAyMmh0dHBzPzpcXC9cXC9bXFwtXFx3QDolLit+Iz1dK1tcXC1cXHdcXChcXCkhQDolKy5+Iz8mXFwvPSRdKlxcdTAwMjIpKD89WyBcXCldKSkqXFwpKSkqJCIsICJ0eXBlIjogInRleHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei00IiwgInBhdHRlcm4iOiAiXig/IVssIF0pKCw/ID8oW2EtelxcLV0rKSg/IS4qW15cXC1dXFwyPSk9KFxcKnxcXCgoID8oc2VsZnxcXHUwMDIyaHR0cHM/OlxcL1xcL1tcXC1cXHdAOiUuK34jPV0rW1xcLVxcd1xcKFxcKSFAOiUrLn4jPyZcXC89JF0qXFx1MDAyMikoPz1bIFxcKV0pKSpcXCkpKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJQZXJtaXNzaW9ucy1Qb2xpY3kiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJhY2NlbGVyb21ldGVyPSgpLCBhbWJpZW50LWxpZ2h0LXNlbnNvcj0oKSwgYXR0cmlidXRpb24tcmVwb3J0aW5nPSgpLCBhdXRvcGxheT0oKSwgYmF0dGVyeT0oKSwgYmx1ZXRvb3RoPSgpLCBicm93c2luZy10b3BpY3M9KCksIGNhbWVyYT0oKSwgY29tcHV0ZS1wcmVzc3VyZT0oKSwgZGlzcGxheS1jYXB0dXJlPSgpLCBkb2N1bWVudC1kb21haW49KCksIGVuY3J5cHRlZC1tZWRpYT0oKSwgZXhlY3V0aW9uLXdoaWxlLW5vdC1yZW5kZXJlZD0oKSwgZXhlY3V0aW9uLXdoaWxlLW91dC1vZi12aWV3cG9ydD0oKSwgZnVsbHNjcmVlbj0oKSwgZ2FtZXBhZD0oKSwgZ2VvbG9jYXRpb249KCksIGd5cm9zY29wZT0oKSwgaGlkPSgpLCBpZGVudGl0eS1jcmVkZW50aWFscy1nZXQ9KCksIGlkbGUtZGV0ZWN0aW9uPSgpLCBsb2NhbC1mb250cz0oKSwgbWFnbmV0b21ldGVyPSgpLCBtaWNyb3Bob25lPSgpLCBtaWRpPSgpLCBvdHAtY3JlZGVudGlhbHM9KCksIHBheW1lbnQ9KCksIHBpY3R1cmUtaW4tcGljdHVyZT0oKSwgcHVibGlja2V5LWNyZWRlbnRpYWxzLWNyZWF0ZT0oKSwgcHVibGlja2V5LWNyZWRlbnRpYWxzLWdldD0oKSwgc2NyZWVuLXdha2UtbG9jaz0oKSwgc2VyaWFsPSgpLCBzcGVha2VyLXNlbGVjdGlvbj0oKSwgc3RvcmFnZS1hY2Nlc3M9KCksIHVzYj0oKSwgd2ViLXNoYXJlPSgpLCB3aW5kb3ctbWFuYWdlbWVudD0oKSwgeHItc3BhdGlhbC10cmFja2luZz0oKSIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogImFjY2VsZXJvbWV0ZXI9KCksIGFtYmllbnQtbGlnaHQtc2Vuc29yPSgpLCBhdHRyaWJ1dGlvbi1yZXBvcnRpbmc9KCksIGF1dG9wbGF5PSgpLCBiYXR0ZXJ5PSgpLCBibHVldG9vdGg9KCksIGJyb3dzaW5nLXRvcGljcz0oKSwgY2FtZXJhPSgpLCBjb21wdXRlLXByZXNzdXJlPSgpLCBkaXNwbGF5LWNhcHR1cmU9KCksIGRvY3VtZW50LWRvbWFpbj0oKSwgZW5jcnlwdGVkLW1lZGlhPSgpLCBleGVjdXRpb24td2hpbGUtbm90LXJlbmRlcmVkPSgpLCBleGVjdXRpb24td2hpbGUtb3V0LW9mLXZpZXdwb3J0PSgpLCBmdWxsc2NyZWVuPSgpLCBnYW1lcGFkPSgpLCBnZW9sb2NhdGlvbj0oKSwgZ3lyb3Njb3BlPSgpLCBoaWQ9KCksIGlkZW50aXR5LWNyZWRlbnRpYWxzLWdldD0oKSwgaWRsZS1kZXRlY3Rpb249KCksIGxvY2FsLWZvbnRzPSgpLCBtYWduZXRvbWV0ZXI9KCksIG1pY3JvcGhvbmU9KCksIG1pZGk9KCksIG90cC1jcmVkZW50aWFscz0oKSwgcGF5bWVudD0oKSwgcGljdHVyZS1pbi1waWN0dXJlPSgpLCBwdWJsaWNrZXktY3JlZGVudGlhbHMtY3JlYXRlPSgpLCBwdWJsaWNrZXktY3JlZGVudGlhbHMtZ2V0PSgpLCBzY3JlZW4td2FrZS1sb2NrPSgpLCBzZXJpYWw9KCksIHNwZWFrZXItc2VsZWN0aW9uPSgpLCBzdG9yYWdlLWFjY2Vzcz0oKSwgdXNiPSgpLCB3ZWItc2hhcmU9KCksIHdpbmRvdy1tYW5hZ2VtZW50PSgpLCB4ci1zcGF0aWFsLXRyYWNraW5nPSgpIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJWYWx1ZSBmb3IgdGhlIFBlcm1pc3Npb25zLVBvbGljeSBoZWFkZXIuIn1dfSwgIkZFQVRVUkVfUE9MSUNZIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogImFjY2VsZXJvbWV0ZXIgJ25vbmUnOyBhbWJpZW50LWxpZ2h0LXNlbnNvciAnbm9uZSc7IGF1dG9wbGF5ICdub25lJzsgYmF0dGVyeSAnbm9uZSc7IGNhbWVyYSAnbm9uZSc7IGRpc3BsYXktY2FwdHVyZSAnbm9uZSc7IGRvY3VtZW50LWRvbWFpbiAnbm9uZSc7IGVuY3J5cHRlZC1tZWRpYSAnbm9uZSc7IGV4ZWN1dGlvbi13aGlsZS1ub3QtcmVuZGVyZWQgJ25vbmUnOyBleGVjdXRpb24td2hpbGUtb3V0LW9mLXZpZXdwb3J0ICdub25lJzsgZnVsbHNjcmVlbiAnbm9uZSc7IGdlb2xvY2F0aW9uICdub25lJzsgZ3lyb3Njb3BlICdub25lJzsgbGF5b3V0LWFuaW1hdGlvbiAnbm9uZSc7IGxlZ2FjeS1pbWFnZS1mb3JtYXRzICdub25lJzsgbWFnbmV0b21ldGVyICdub25lJzsgbWljcm9waG9uZSAnbm9uZSc7IG1pZGkgJ25vbmUnOyBuYXZpZ2F0aW9uLW92ZXJyaWRlICdub25lJzsgcGF5bWVudCAnbm9uZSc7IHBpY3R1cmUtaW4tcGljdHVyZSAnbm9uZSc7IHB1YmxpY2tleS1jcmVkZW50aWFscy1nZXQgJ25vbmUnOyBzcGVha2VyLXNlbGVjdGlvbiAnbm9uZSc7IHN5bmMteGhyICdub25lJzsgdW5vcHRpbWl6ZWQtaW1hZ2VzICdub25lJzsgdW5zaXplZC1tZWRpYSAnbm9uZSc7IHVzYiAnbm9uZSc7IHNjcmVlbi13YWtlLWxvY2sgJ25vbmUnOyB3ZWItc2hhcmUgJ25vbmUnOyB4ci1zcGF0aWFsLXRyYWNraW5nICdub25lJzsiLCAiaGVscCI6ICJWYWx1ZSBmb3IgdGhlIEZlYXR1cmUtUG9saWN5IGhlYWRlci4iLCAiaWQiOiAiZmVhdHVyZS1wb2xpY3kiLCAibGFiZWwiOiAiRmVhdHVyZS1Qb2xpY3kiLCAicmVnZXgiOiAiXig/IVs7IF0pKCA/KFtcXHdcXC1dKykoPyEuKlteXFwtXVxcMiApKCAoJyhub25lfHNlbGZ8c3RyaWN0LWR5bmFtaWN8cmVwb3J0LXNhbXBsZXx1bnNhZmUtaW5saW5lfHVuc2FmZS1ldmFsfHVuc2FmZS1oYXNoZXN8dW5zYWZlLWFsbG93LXJlZGlyZWN0cyknfGh0dHBzPzpcXC9cXC9bXFx3QDolLit+Iz1cXC1dK1tcXHdcXChcXCkhQDolKy5+Iz8mXFwvPSRcXC1dKikpKzspKiQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotMyIsICJwYXR0ZXJuIjogIl4oPyFbOyBdKSggPyhbXFx3XFwtXSspKD8hLipbXlxcLV1cXDIgKSggKCcobm9uZXxzZWxmfHN0cmljdC1keW5hbWljfHJlcG9ydC1zYW1wbGV8dW5zYWZlLWlubGluZXx1bnNhZmUtZXZhbHx1bnNhZmUtaGFzaGVzfHVuc2FmZS1hbGxvdy1yZWRpcmVjdHMpJ3xodHRwcz86XFwvXFwvW1xcd0A6JS4rfiM9XFwtXStbXFx3XFwoXFwpIUA6JSsufiM/JlxcLz0kXFwtXSopKSs7KSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJGZWF0dXJlLVBvbGljeSIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogImFjY2VsZXJvbWV0ZXIgJ25vbmUnOyBhbWJpZW50LWxpZ2h0LXNlbnNvciAnbm9uZSc7IGF1dG9wbGF5ICdub25lJzsgYmF0dGVyeSAnbm9uZSc7IGNhbWVyYSAnbm9uZSc7IGRpc3BsYXktY2FwdHVyZSAnbm9uZSc7IGRvY3VtZW50LWRvbWFpbiAnbm9uZSc7IGVuY3J5cHRlZC1tZWRpYSAnbm9uZSc7IGV4ZWN1dGlvbi13aGlsZS1ub3QtcmVuZGVyZWQgJ25vbmUnOyBleGVjdXRpb24td2hpbGUtb3V0LW9mLXZpZXdwb3J0ICdub25lJzsgZnVsbHNjcmVlbiAnbm9uZSc7IGdlb2xvY2F0aW9uICdub25lJzsgZ3lyb3Njb3BlICdub25lJzsgbGF5b3V0LWFuaW1hdGlvbiAnbm9uZSc7IGxlZ2FjeS1pbWFnZS1mb3JtYXRzICdub25lJzsgbWFnbmV0b21ldGVyICdub25lJzsgbWljcm9waG9uZSAnbm9uZSc7IG1pZGkgJ25vbmUnOyBuYXZpZ2F0aW9uLW92ZXJyaWRlICdub25lJzsgcGF5bWVudCAnbm9uZSc7IHBpY3R1cmUtaW4tcGljdHVyZSAnbm9uZSc7IHB1YmxpY2tleS1jcmVkZW50aWFscy1nZXQgJ25vbmUnOyBzcGVha2VyLXNlbGVjdGlvbiAnbm9uZSc7IHN5bmMteGhyICdub25lJzsgdW5vcHRpbWl6ZWQtaW1hZ2VzICdub25lJzsgdW5zaXplZC1tZWRpYSAnbm9uZSc7IHVzYiAnbm9uZSc7IHNjcmVlbi13YWtlLWxvY2sgJ25vbmUnOyB3ZWItc2hhcmUgJ25vbmUnOyB4ci1zcGF0aWFsLXRyYWNraW5nICdub25lJzsiLCAicHJldl92YWx1ZSI6ICJhY2NlbGVyb21ldGVyICdub25lJzsgYW1iaWVudC1saWdodC1zZW5zb3IgJ25vbmUnOyBhdXRvcGxheSAnbm9uZSc7IGJhdHRlcnkgJ25vbmUnOyBjYW1lcmEgJ25vbmUnOyBkaXNwbGF5LWNhcHR1cmUgJ25vbmUnOyBkb2N1bWVudC1kb21haW4gJ25vbmUnOyBlbmNyeXB0ZWQtbWVkaWEgJ25vbmUnOyBleGVjdXRpb24td2hpbGUtbm90LXJlbmRlcmVkICdub25lJzsgZXhlY3V0aW9uLXdoaWxlLW91dC1vZi12aWV3cG9ydCAnbm9uZSc7IGZ1bGxzY3JlZW4gJ25vbmUnOyBnZW9sb2NhdGlvbiAnbm9uZSc7IGd5cm9zY29wZSAnbm9uZSc7IGxheW91dC1hbmltYXRpb24gJ25vbmUnOyBsZWdhY3ktaW1hZ2UtZm9ybWF0cyAnbm9uZSc7IG1hZ25ldG9tZXRlciAnbm9uZSc7IG1pY3JvcGhvbmUgJ25vbmUnOyBtaWRpICdub25lJzsgbmF2aWdhdGlvbi1vdmVycmlkZSAnbm9uZSc7IHBheW1lbnQgJ25vbmUnOyBwaWN0dXJlLWluLXBpY3R1cmUgJ25vbmUnOyBwdWJsaWNrZXktY3JlZGVudGlhbHMtZ2V0ICdub25lJzsgc3BlYWtlci1zZWxlY3Rpb24gJ25vbmUnOyBzeW5jLXhociAnbm9uZSc7IHVub3B0aW1pemVkLWltYWdlcyAnbm9uZSc7IHVuc2l6ZWQtbWVkaWEgJ25vbmUnOyB1c2IgJ25vbmUnOyBzY3JlZW4td2FrZS1sb2NrICdub25lJzsgd2ViLXNoYXJlICdub25lJzsgeHItc3BhdGlhbC10cmFja2luZyAnbm9uZSc7IiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJWYWx1ZSBmb3IgdGhlIEZlYXR1cmUtUG9saWN5IGhlYWRlci4ifV19LCAiWF9GUkFNRV9PUFRJT05TIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIlNBTUVPUklHSU4iLCAiaGVscCI6ICJWYWx1ZSBmb3IgdGhlIFgtRnJhbWUtT3B0aW9ucyBoZWFkZXIuIiwgImlkIjogIngtZnJhbWUtb3B0aW9ucyIsICJsYWJlbCI6ICJYLUZyYW1lLU9wdGlvbnMiLCAicmVnZXgiOiAiXihERU5ZfFNBTUVPUklHSU4pPyQiLCAidHlwZSI6ICJzZWxlY3QiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yIiwgInBhdHRlcm4iOiAiXihERU5ZfFNBTUVPUklHSU4pPyQiLCAiaW5wVHlwZSI6ICJzZWxlY3QiLCAibmFtZSI6ICJYLUZyYW1lLU9wdGlvbnMiLCAidmFsdWVzIjogWyIiLCAiREVOWSIsICJTQU1FT1JJR0lOIl0sICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIlNBTUVPUklHSU4iLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICJTQU1FT1JJR0lOIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJWYWx1ZSBmb3IgdGhlIFgtRnJhbWUtT3B0aW9ucyBoZWFkZXIuIn1dfSwgIlhfQ09OVEVOVF9UWVBFX09QVElPTlMiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAibm9zbmlmZiIsICJoZWxwIjogIlZhbHVlIGZvciB0aGUgWC1Db250ZW50LVR5cGUtT3B0aW9ucyBoZWFkZXIuIiwgImlkIjogIngtY29udGVudC10eXBlLW9wdGlvbnMiLCAibGFiZWwiOiAiWC1Db250ZW50LVR5cGUtT3B0aW9ucyIsICJyZWdleCI6ICJeKG5vc25pZmYpPyQiLCAidHlwZSI6ICJzZWxlY3QiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xIiwgInBhdHRlcm4iOiAiXihub3NuaWZmKT8kIiwgImlucFR5cGUiOiAic2VsZWN0IiwgIm5hbWUiOiAiWC1Db250ZW50LVR5cGUtT3B0aW9ucyIsICJ2YWx1ZXMiOiBbIiIsICJub3NuaWZmIl0sICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIm5vc25pZmYiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICJub3NuaWZmIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJWYWx1ZSBmb3IgdGhlIFgtQ29udGVudC1UeXBlLU9wdGlvbnMgaGVhZGVyLiJ9XX0sICJYX1hTU19QUk9URUNUSU9OIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIjE7IG1vZGU9YmxvY2siLCAiaGVscCI6ICJWYWx1ZSBmb3IgdGhlIFgtWFNTLVByb3RlY3Rpb24gaGVhZGVyLiIsICJpZCI6ICJ4LXhzcy1wcm90ZWN0aW9uIiwgImxhYmVsIjogIlgtWFNTLVByb3RlY3Rpb24iLCAicmVnZXgiOiAiXjB8MSg7IChtb2RlPWJsb2NrfHJlcG9ydD1odHRwcz86XFwvXFwvW1xcLVxcd0A6JS4rfiM9XStbXFwtXFx3XFwoXFwpIUA6JSsufiM/JlxcLz0kXSopKT8kIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTAiLCAicGF0dGVybiI6ICJeMHwxKDsgKG1vZGU9YmxvY2t8cmVwb3J0PWh0dHBzPzpcXC9cXC9bXFwtXFx3QDolLit+Iz1dK1tcXC1cXHdcXChcXCkhQDolKy5+Iz8mXFwvPSRdKikpPyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIlgtWFNTLVByb3RlY3Rpb24iLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIxOyBtb2RlPWJsb2NrIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAiMTsgbW9kZT1ibG9jayIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVmFsdWUgZm9yIHRoZSBYLVhTUy1Qcm90ZWN0aW9uIGhlYWRlci4ifV19fSwgImNoZWNrc3VtIjogbnVsbCwgIm11bHRpcGxlc19zY2hlbWEiOiB7ImN1c3RvbS1oZWFkZXJzIjogeyJDVVNUT01fSEVBREVSIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkN1c3RvbSBoZWFkZXIgdG8gYWRkIChIZWFkZXJOYW1lOiBIZWFkZXJWYWx1ZSkuIiwgImlkIjogImN1c3RvbS1oZWFkZXIiLCAibGFiZWwiOiAiQ3VzdG9tIGhlYWRlciAoSGVhZGVyTmFtZTogSGVhZGVyVmFsdWUpIiwgInJlZ2V4IjogIl4oW1xcd1xcLV0rOiAuKyk/JCIsICJ0eXBlIjogInRleHQiLCAibXVsdGlwbGUiOiAiY3VzdG9tLWhlYWRlcnMiLCAicGF0dGVybiI6ICJeKFtcXHdcXC1dKzogLispPyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIkN1c3RvbSBoZWFkZXIgKEhlYWRlck5hbWU6IEhlYWRlclZhbHVlKSIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiQ3VzdG9tIGhlYWRlciB0byBhZGQgKEhlYWRlck5hbWU6IEhlYWRlclZhbHVlKS4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTEzIn19LCAiY29va2llLWZsYWdzIjogeyJDT09LSUVfRkxBR1MiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiKiBIdHRwT25seSBTYW1lU2l0ZT1MYXgiLCAiaGVscCI6ICJDb29raWUgZmxhZ3MgYXV0b21hdGljYWxseSBhZGRlZCB0byBhbGwgY29va2llcyAodmFsdWUgYWNjZXB0ZWQgZm9yIG5naW54X2Nvb2tpZV9mbGFnX21vZHVsZSkuIiwgImlkIjogImNvb2tpZS1mbGFncyIsICJsYWJlbCI6ICJDb29raWUgZmxhZ3MiLCAicmVnZXgiOiAiXihcXCp8W147XSspKCAoSHR0cE9ubHl8KFNhbWVTaXRlKSg/IS4qXFw0KSg9KExheHxTdHJpY3QpKT8pKD8hLipcXDMpKSokIiwgInR5cGUiOiAidGV4dCIsICJtdWx0aXBsZSI6ICJjb29raWUtZmxhZ3MiLCAicGF0dGVybiI6ICJeKFxcKnxbXjtdKykoIChIdHRwT25seXwoU2FtZVNpdGUpKD8hLipcXDQpKD0oTGF4fFN0cmljdCkpPykoPyEuKlxcMykpKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIkNvb2tpZSBmbGFncyIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiogSHR0cE9ubHkgU2FtZVNpdGU9TGF4IiwgInByZXZfdmFsdWUiOiAiKiBIdHRwT25seSBTYW1lU2l0ZT1MYXgiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkNvb2tpZSBmbGFncyBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIGFsbCBjb29raWVzICh2YWx1ZSBhY2NlcHRlZCBmb3IgbmdpbnhfY29va2llX2ZsYWdfbW9kdWxlKS4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTEyIn19fSwgIm11bHRpcGxlcyI6IHsiY3VzdG9tLWhlYWRlcnMiOiB7IjAiOiB7IkNVU1RPTV9IRUFERVIiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiQ3VzdG9tIGhlYWRlciB0byBhZGQgKEhlYWRlck5hbWU6IEhlYWRlclZhbHVlKS4iLCAiaWQiOiAiY3VzdG9tLWhlYWRlciIsICJsYWJlbCI6ICJDdXN0b20gaGVhZGVyIChIZWFkZXJOYW1lOiBIZWFkZXJWYWx1ZSkiLCAicmVnZXgiOiAiXihbXFx3XFwtXSs6IC4rKT8kIiwgInR5cGUiOiAidGV4dCIsICJtdWx0aXBsZSI6ICJjdXN0b20taGVhZGVycyIsICJwYXR0ZXJuIjogIl4oW1xcd1xcLV0rOiAuKyk/JCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiQ3VzdG9tIGhlYWRlciAoSGVhZGVyTmFtZTogSGVhZGVyVmFsdWUpIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJDdXN0b20gaGVhZGVyIHRvIGFkZCAoSGVhZGVyTmFtZTogSGVhZGVyVmFsdWUpLiJ9XSwgImNvbnRhaW5lckNsYXNzIjogInotMTMiLCAibWV0aG9kIjogImRlZmF1bHQifX19LCAiY29va2llLWZsYWdzIjogeyIwIjogeyJDT09LSUVfRkxBR1MiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiKiBIdHRwT25seSBTYW1lU2l0ZT1MYXgiLCAiaGVscCI6ICJDb29raWUgZmxhZ3MgYXV0b21hdGljYWxseSBhZGRlZCB0byBhbGwgY29va2llcyAodmFsdWUgYWNjZXB0ZWQgZm9yIG5naW54X2Nvb2tpZV9mbGFnX21vZHVsZSkuIiwgImlkIjogImNvb2tpZS1mbGFncyIsICJsYWJlbCI6ICJDb29raWUgZmxhZ3MiLCAicmVnZXgiOiAiXihcXCp8W147XSspKCAoSHR0cE9ubHl8KFNhbWVTaXRlKSg/IS4qXFw0KSg9KExheHxTdHJpY3QpKT8pKD8hLipcXDMpKSokIiwgInR5cGUiOiAidGV4dCIsICJtdWx0aXBsZSI6ICJjb29raWUtZmxhZ3MiLCAicGF0dGVybiI6ICJeKFxcKnxbXjtdKykoIChIdHRwT25seXwoU2FtZVNpdGUpKD8hLipcXDQpKD0oTGF4fFN0cmljdCkpPykoPyEuKlxcMykpKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIkNvb2tpZSBmbGFncyIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiogSHR0cE9ubHkgU2FtZVNpdGU9TGF4IiwgInByZXZfdmFsdWUiOiAiKiBIdHRwT25seSBTYW1lU2l0ZT1MYXgiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkNvb2tpZSBmbGFncyBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIGFsbCBjb29raWVzICh2YWx1ZSBhY2NlcHRlZCBmb3IgbmdpbnhfY29va2llX2ZsYWdfbW9kdWxlKS4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTEyIiwgIm1ldGhvZCI6ICJkZWZhdWx0In19fX19LCB7ImlkIjogImpvYnMiLCAic3RyZWFtIjogInllcyIsICJuYW1lIjogIkpvYnMiLCAiZGVzY3JpcHRpb24iOiAiRmFrZSBjb3JlIHBsdWdpbiBmb3IgaW50ZXJuYWwgam9icy4iLCAidmVyc2lvbiI6ICIxLjAiLCAidHlwZSI6ICJjb3JlIiwgIm1ldGhvZCI6ICJtYW51YWwiLCAicGFnZSI6IGZhbHNlLCAic2V0dGluZ3MiOiB7fSwgImNoZWNrc3VtIjogbnVsbH0sIHsiaWQiOiAibGV0c2VuY3J5cHQiLCAic3RyZWFtIjogInllcyIsICJuYW1lIjogIkxldCdzIEVuY3J5cHQiLCAiZGVzY3JpcHRpb24iOiAiQXV0b21hdGljIGNyZWF0aW9uLCByZW5ld2FsIGFuZCBjb25maWd1cmF0aW9uIG9mIExldCdzIEVuY3J5cHQgY2VydGlmaWNhdGVzLiIsICJ2ZXJzaW9uIjogIjEuMCIsICJ0eXBlIjogImNvcmUiLCAibWV0aG9kIjogIm1hbnVhbCIsICJwYWdlIjogZmFsc2UsICJzZXR0aW5ncyI6IHsiQVVUT19MRVRTX0VOQ1JZUFQiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAibm8iLCAiaGVscCI6ICJBY3RpdmF0ZSBhdXRvbWF0aWMgTGV0J3MgRW5jcnlwdCBtb2RlLiIsICJpZCI6ICJhdXRvLWxldHMtZW5jcnlwdCIsICJsYWJlbCI6ICJBdXRvbWF0aWMgTGV0J3MgRW5jcnlwdCIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAiY29udGFpbmVyQ2xhc3MiOiAiei0zIiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgIm5hbWUiOiAiQXV0b21hdGljIExldCdzIEVuY3J5cHQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJubyIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIm5vIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJBY3RpdmF0ZSBhdXRvbWF0aWMgTGV0J3MgRW5jcnlwdCBtb2RlLiJ9XX0sICJFTUFJTF9MRVRTX0VOQ1JZUFQiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiRW1haWwgdXNlZCBmb3IgTGV0J3MgRW5jcnlwdCBub3RpZmljYXRpb24gYW5kIGluIGNlcnRpZmljYXRlLiIsICJpZCI6ICJlbWFpbC1sZXRzLWVuY3J5cHQiLCAibGFiZWwiOiAiRW1haWwgTGV0J3MgRW5jcnlwdCIsICJyZWdleCI6ICJeKFteQCBcXHRcXHJcXG5dK0BbXkAgXFx0XFxyXFxuXStcXC5bXkAgXFx0XFxyXFxuXSspPyQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotMiIsICJwYXR0ZXJuIjogIl4oW15AIFxcdFxcclxcbl0rQFteQCBcXHRcXHJcXG5dK1xcLlteQCBcXHRcXHJcXG5dKyk/JCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiRW1haWwgTGV0J3MgRW5jcnlwdCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiRW1haWwgdXNlZCBmb3IgTGV0J3MgRW5jcnlwdCBub3RpZmljYXRpb24gYW5kIGluIGNlcnRpZmljYXRlLiJ9XX0sICJVU0VfTEVUU19FTkNSWVBUX1NUQUdJTkciOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAibm8iLCAiaGVscCI6ICJVc2UgdGhlIHN0YWdpbmcgZW52aXJvbm1lbnQgZm9yIExldFx1MjAxOXMgRW5jcnlwdCBjZXJ0aWZpY2F0ZSBnZW5lcmF0aW9uLiBVc2VmdWwgd2hlbiB5b3UgYXJlIHRlc3RpbmcgeW91ciBkZXBsb3ltZW50cyB0byBhdm9pZCBiZWluZyByYXRlIGxpbWl0ZWQgaW4gdGhlIHByb2R1Y3Rpb24gZW52aXJvbm1lbnQuIiwgImlkIjogInVzZS1sZXRzLWVuY3J5cHQtc3RhZ2luZyIsICJsYWJlbCI6ICJVc2UgTGV0J3MgRW5jcnlwdCBTdGFnaW5nIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJjb250YWluZXJDbGFzcyI6ICJ6LTEiLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAibmFtZSI6ICJVc2UgTGV0J3MgRW5jcnlwdCBTdGFnaW5nIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAibm8iLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICJubyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVXNlIHRoZSBzdGFnaW5nIGVudmlyb25tZW50IGZvciBMZXRcdTIwMTlzIEVuY3J5cHQgY2VydGlmaWNhdGUgZ2VuZXJhdGlvbi4gVXNlZnVsIHdoZW4geW91IGFyZSB0ZXN0aW5nIHlvdXIgZGVwbG95bWVudHMgdG8gYXZvaWQgYmVpbmcgcmF0ZSBsaW1pdGVkIGluIHRoZSBwcm9kdWN0aW9uIGVudmlyb25tZW50LiJ9XX0sICJMRVRTX0VOQ1JZUFRfQ0xFQVJfT0xEX0NFUlRTIjogeyJjb250ZXh0IjogImdsb2JhbCIsICJkZWZhdWx0IjogIm5vIiwgImhlbHAiOiAiQ2xlYXIgb2xkIGNlcnRpZmljYXRlcyB3aGVuIHJlbmV3aW5nLiIsICJpZCI6ICJsZXRzLWVuY3J5cHQtY2xlYXItb2xkLWNlcnRzIiwgImxhYmVsIjogIkNsZWFyIG9sZCBjZXJ0aWZpY2F0ZXMgd2hlbiB0aGV5IGFyZSBubyBsb25nZXIgbmVlZGVkIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJjb250YWluZXJDbGFzcyI6ICJ6LTAiLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAibmFtZSI6ICJDbGVhciBvbGQgY2VydGlmaWNhdGVzIHdoZW4gdGhleSBhcmUgbm8gbG9uZ2VyIG5lZWRlZCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIm5vIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAibm8iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJnbG9iZSIsICJ0ZXh0IjogImlucF9wb3BvdmVyX2dsb2JhbCJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJDbGVhciBvbGQgY2VydGlmaWNhdGVzIHdoZW4gcmVuZXdpbmcuIn1dfX0sICJjaGVja3N1bSI6IG51bGx9LCB7ImlkIjogImxpbWl0IiwgInN0cmVhbSI6ICJwYXJ0aWFsIiwgIm5hbWUiOiAiTGltaXQiLCAiZGVzY3JpcHRpb24iOiAiTGltaXQgbWF4aW11bSBudW1iZXIgb2YgcmVxdWVzdHMgYW5kIGNvbm5lY3Rpb25zLiIsICJ2ZXJzaW9uIjogIjEuMCIsICJ0eXBlIjogImNvcmUiLCAibWV0aG9kIjogIm1hbnVhbCIsICJwYWdlIjogdHJ1ZSwgInNldHRpbmdzIjogeyJVU0VfTElNSVRfUkVRIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogInllcyIsICJoZWxwIjogIkFjdGl2YXRlIGxpbWl0IHJlcXVlc3RzIGZlYXR1cmUuIiwgImlkIjogInVzZS1saW1pdC1yZXEiLCAibGFiZWwiOiAiQWN0aXZhdGUgbGltaXQgcmVxdWVzdHMiLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgImNvbnRhaW5lckNsYXNzIjogInotNiIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJuYW1lIjogIkFjdGl2YXRlIGxpbWl0IHJlcXVlc3RzIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAieWVzIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAieWVzIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJBY3RpdmF0ZSBsaW1pdCByZXF1ZXN0cyBmZWF0dXJlLiJ9XX0sICJVU0VfTElNSVRfQ09OTiI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJ5ZXMiLCAiaGVscCI6ICJBY3RpdmF0ZSBsaW1pdCBjb25uZWN0aW9ucyBmZWF0dXJlLiIsICJpZCI6ICJ1c2UtbGltaXQtY29ubiIsICJsYWJlbCI6ICJBY3RpdmF0ZSBsaW1pdCBjb25uZWN0aW9ucyIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAiY29udGFpbmVyQ2xhc3MiOiAiei0zIiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgIm5hbWUiOiAiQWN0aXZhdGUgbGltaXQgY29ubmVjdGlvbnMiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJ5ZXMiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICJ5ZXMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkFjdGl2YXRlIGxpbWl0IGNvbm5lY3Rpb25zIGZlYXR1cmUuIn1dfSwgIkxJTUlUX0NPTk5fTUFYX0hUVFAxIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIjEwIiwgImhlbHAiOiAiTWF4aW11bSBudW1iZXIgb2YgY29ubmVjdGlvbnMgcGVyIElQIHdoZW4gdXNpbmcgSFRUUC8xLlggcHJvdG9jb2wuIiwgImlkIjogImxpbWl0LWNvbm4tbWF4LWh0dHAxIiwgImxhYmVsIjogIk1heGltdW0gbnVtYmVyIG9mIEhUVFAvMS5YIGNvbm5lY3Rpb25zIiwgInJlZ2V4IjogIl5cXGQrJCIsICJ0eXBlIjogInRleHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yIiwgInBhdHRlcm4iOiAiXlxcZCskIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJNYXhpbXVtIG51bWJlciBvZiBIVFRQLzEuWCBjb25uZWN0aW9ucyIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjEwIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAiMTAiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIk1heGltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHBlciBJUCB3aGVuIHVzaW5nIEhUVFAvMS5YIHByb3RvY29sLiJ9XX0sICJMSU1JVF9DT05OX01BWF9IVFRQMiI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIxMDAiLCAiaGVscCI6ICJNYXhpbXVtIG51bWJlciBvZiBzdHJlYW1zIHBlciBJUCB3aGVuIHVzaW5nIEhUVFAvMiBwcm90b2NvbC4iLCAiaWQiOiAibGltaXQtY29ubi1tYXgtaHR0cDIiLCAibGFiZWwiOiAiTWF4aW11bSBudW1iZXIgb2YgSFRUUC8yIHN0cmVhbXMiLCAicmVnZXgiOiAiXlxcZCskIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTEiLCAicGF0dGVybiI6ICJeXFxkKyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIk1heGltdW0gbnVtYmVyIG9mIEhUVFAvMiBzdHJlYW1zIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiMTAwIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAiMTAwIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJNYXhpbXVtIG51bWJlciBvZiBzdHJlYW1zIHBlciBJUCB3aGVuIHVzaW5nIEhUVFAvMiBwcm90b2NvbC4ifV19LCAiTElNSVRfQ09OTl9NQVhfU1RSRUFNIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIjEwIiwgImhlbHAiOiAiTWF4aW11bSBudW1iZXIgb2YgY29ubmVjdGlvbnMgcGVyIElQIHdoZW4gdXNpbmcgc3RyZWFtLiIsICJpZCI6ICJsaW1pdC1jb25uLW1heC1zdHJlYW0iLCAibGFiZWwiOiAiTWF4aW11bSBudW1iZXIgb2Ygc3RyZWFtIGNvbm5lY3Rpb25zIiwgInJlZ2V4IjogIl5cXGQrJCIsICJ0eXBlIjogInRleHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0wIiwgInBhdHRlcm4iOiAiXlxcZCskIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJNYXhpbXVtIG51bWJlciBvZiBzdHJlYW0gY29ubmVjdGlvbnMiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIxMCIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIjEwIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJNYXhpbXVtIG51bWJlciBvZiBjb25uZWN0aW9ucyBwZXIgSVAgd2hlbiB1c2luZyBzdHJlYW0uIn1dfX0sICJjaGVja3N1bSI6IG51bGwsICJtdWx0aXBsZXNfc2NoZW1hIjogeyJsaW1pdC1yZXEiOiB7IkxJTUlUX1JFUV9VUkwiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiLyIsICJoZWxwIjogIlVSTCAoUENSRSByZWdleCkgd2hlcmUgdGhlIGxpbWl0IHJlcXVlc3Qgd2lsbCBiZSBhcHBsaWVkIG9yIHNwZWNpYWwgdmFsdWUgLyBmb3IgYWxsIHJlcXVlc3RzLiIsICJpZCI6ICJsaW1pdC1yZXEtdXJsIiwgImxhYmVsIjogIkxpbWl0IHJlcXVlc3QgVVJMIiwgInJlZ2V4IjogIl4uKyQiLCAidHlwZSI6ICJ0ZXh0IiwgIm11bHRpcGxlIjogImxpbWl0LXJlcSIsICJwYXR0ZXJuIjogIl4uKyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIkxpbWl0IHJlcXVlc3QgVVJMIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiLyIsICJwcmV2X3ZhbHVlIjogIi8iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlVSTCAoUENSRSByZWdleCkgd2hlcmUgdGhlIGxpbWl0IHJlcXVlc3Qgd2lsbCBiZSBhcHBsaWVkIG9yIHNwZWNpYWwgdmFsdWUgLyBmb3IgYWxsIHJlcXVlc3RzLiJ9XSwgImNvbnRhaW5lckNsYXNzIjogInotNiJ9LCAiTElNSVRfUkVRX1JBVEUiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiMnIvcyIsICJoZWxwIjogIlJhdGUgdG8gYXBwbHkgdG8gdGhlIFVSTCAocyBmb3Igc2Vjb25kLCBtIGZvciBtaW51dGUsIGggZm9yIGhvdXIgYW5kIGQgZm9yIGRheSkuIiwgImlkIjogImxpbWl0LXJlcS1yYXRlIiwgImxhYmVsIjogIkxpbWl0IHJlcXVlc3QgUmF0ZSIsICJyZWdleCI6ICJeXFxkK3IvW3NtaGRdJCIsICJ0eXBlIjogInRleHQiLCAibXVsdGlwbGUiOiAibGltaXQtcmVxIiwgInBhdHRlcm4iOiAiXlxcZCtyL1tzbWhkXSQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIkxpbWl0IHJlcXVlc3QgUmF0ZSIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjJyL3MiLCAicHJldl92YWx1ZSI6ICIyci9zIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJSYXRlIHRvIGFwcGx5IHRvIHRoZSBVUkwgKHMgZm9yIHNlY29uZCwgbSBmb3IgbWludXRlLCBoIGZvciBob3VyIGFuZCBkIGZvciBkYXkpLiJ9XSwgImNvbnRhaW5lckNsYXNzIjogInotNSJ9fX0sICJtdWx0aXBsZXMiOiB7ImxpbWl0LXJlcSI6IHsiMCI6IHsiTElNSVRfUkVRX1VSTCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIvIiwgImhlbHAiOiAiVVJMIChQQ1JFIHJlZ2V4KSB3aGVyZSB0aGUgbGltaXQgcmVxdWVzdCB3aWxsIGJlIGFwcGxpZWQgb3Igc3BlY2lhbCB2YWx1ZSAvIGZvciBhbGwgcmVxdWVzdHMuIiwgImlkIjogImxpbWl0LXJlcS11cmwiLCAibGFiZWwiOiAiTGltaXQgcmVxdWVzdCBVUkwiLCAicmVnZXgiOiAiXi4rJCIsICJ0eXBlIjogInRleHQiLCAibXVsdGlwbGUiOiAibGltaXQtcmVxIiwgInBhdHRlcm4iOiAiXi4rJCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiTGltaXQgcmVxdWVzdCBVUkwiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIvIiwgInByZXZfdmFsdWUiOiAiLyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVVJMIChQQ1JFIHJlZ2V4KSB3aGVyZSB0aGUgbGltaXQgcmVxdWVzdCB3aWxsIGJlIGFwcGxpZWQgb3Igc3BlY2lhbCB2YWx1ZSAvIGZvciBhbGwgcmVxdWVzdHMuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei02IiwgIm1ldGhvZCI6ICJkZWZhdWx0In0sICJMSU1JVF9SRVFfUkFURSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIyci9zIiwgImhlbHAiOiAiUmF0ZSB0byBhcHBseSB0byB0aGUgVVJMIChzIGZvciBzZWNvbmQsIG0gZm9yIG1pbnV0ZSwgaCBmb3IgaG91ciBhbmQgZCBmb3IgZGF5KS4iLCAiaWQiOiAibGltaXQtcmVxLXJhdGUiLCAibGFiZWwiOiAiTGltaXQgcmVxdWVzdCBSYXRlIiwgInJlZ2V4IjogIl5cXGQrci9bc21oZF0kIiwgInR5cGUiOiAidGV4dCIsICJtdWx0aXBsZSI6ICJsaW1pdC1yZXEiLCAicGF0dGVybiI6ICJeXFxkK3IvW3NtaGRdJCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiTGltaXQgcmVxdWVzdCBSYXRlIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiMnIvcyIsICJwcmV2X3ZhbHVlIjogIjJyL3MiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlJhdGUgdG8gYXBwbHkgdG8gdGhlIFVSTCAocyBmb3Igc2Vjb25kLCBtIGZvciBtaW51dGUsIGggZm9yIGhvdXIgYW5kIGQgZm9yIGRheSkuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei01IiwgIm1ldGhvZCI6ICJkZWZhdWx0In19fX19LCB7ImlkIjogIm1ldHJpY3MiLCAic3RyZWFtIjogInBhcnRpYWwiLCAibmFtZSI6ICJNZXRyaWNzIiwgImRlc2NyaXB0aW9uIjogIk1ldHJpY3MgY29sbGVjdGlvbiBhbmQgcmV0cmlldmUuIiwgInZlcnNpb24iOiAiMS4wIiwgInR5cGUiOiAiY29yZSIsICJtZXRob2QiOiAibWFudWFsIiwgInBhZ2UiOiBmYWxzZSwgInNldHRpbmdzIjogeyJVU0VfTUVUUklDUyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJ5ZXMiLCAiaGVscCI6ICJFbmFibGUgY29sbGVjdGlvbiBhbmQgcmV0cmlldmFsIG9mIGludGVybmFsIG1ldHJpY3MuIiwgImlkIjogInVzZS1tZXRyaWNzIiwgImxhYmVsIjogIlVzZSBtZXRyaWNzIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJjb250YWluZXJDbGFzcyI6ICJ6LTIiLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAibmFtZSI6ICJVc2UgbWV0cmljcyIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogInllcyIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogInllcyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiRW5hYmxlIGNvbGxlY3Rpb24gYW5kIHJldHJpZXZhbCBvZiBpbnRlcm5hbCBtZXRyaWNzLiJ9XX0sICJNRVRSSUNTX01FTU9SWV9TSVpFIjogeyJjb250ZXh0IjogImdsb2JhbCIsICJkZWZhdWx0IjogIjE2bSIsICJoZWxwIjogIlNpemUgb2YgdGhlIGludGVybmFsIHN0b3JhZ2UgZm9yIG1ldHJpY3MuIiwgImlkIjogIm1ldHJpY3MtbWVtb3J5LXNpemUiLCAibGFiZWwiOiAiTWV0cmljcyBtZW1vcnkgc2l6ZSIsICJyZWdleCI6ICJeXFxkK1trS21NZ0ddPyQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotMSIsICJwYXR0ZXJuIjogIl5cXGQrW2tLbU1nR10/JCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiTWV0cmljcyBtZW1vcnkgc2l6ZSIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjE2bSIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIjE2bSIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImdsb2JlIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfZ2xvYmFsIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlNpemUgb2YgdGhlIGludGVybmFsIHN0b3JhZ2UgZm9yIG1ldHJpY3MuIn1dfSwgIk1FVFJJQ1NfTUFYX0JMT0NLRURfUkVRVUVTVFMiOiB7ImNvbnRleHQiOiAiZ2xvYmFsIiwgImRlZmF1bHQiOiAiMTAwIiwgImhlbHAiOiAiTWF4aW11bSBudW1iZXIgb2YgYmxvY2tlZCByZXF1ZXN0cyB0byBzdG9yZSAocGVyIHdvcmtlcikuIiwgImlkIjogIm1ldHJpY3MtbWF4LWJsb2NrZWQtcmVxdWVzdHMiLCAibGFiZWwiOiAiTWV0cmljcyBtYXggYmxvY2tlZCByZXF1ZXN0cyIsICJyZWdleCI6ICJeXFxkKyQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotMCIsICJwYXR0ZXJuIjogIl5cXGQrJCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiTWV0cmljcyBtYXggYmxvY2tlZCByZXF1ZXN0cyIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjEwMCIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIjEwMCIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImdsb2JlIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfZ2xvYmFsIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIk1heGltdW0gbnVtYmVyIG9mIGJsb2NrZWQgcmVxdWVzdHMgdG8gc3RvcmUgKHBlciB3b3JrZXIpLiJ9XX19LCAiY2hlY2tzdW0iOiBudWxsfSwgeyJpZCI6ICJtaXNjIiwgInN0cmVhbSI6ICJwYXJ0aWFsIiwgIm5hbWUiOiAiTWlzY2VsbGFuZW91cyIsICJkZXNjcmlwdGlvbiI6ICJNaXNjZWxsYW5lb3VzIHNldHRpbmdzLiIsICJ2ZXJzaW9uIjogIjEuMCIsICJ0eXBlIjogImNvcmUiLCAibWV0aG9kIjogIm1hbnVhbCIsICJwYWdlIjogdHJ1ZSwgInNldHRpbmdzIjogeyJESVNBQkxFX0RFRkFVTFRfU0VSVkVSIjogeyJjb250ZXh0IjogImdsb2JhbCIsICJkZWZhdWx0IjogIm5vIiwgImhlbHAiOiAiRGVueSBIVFRQIHJlcXVlc3QgaWYgdGhlIHJlcXVlc3Qgdmhvc3QgaXMgdW5rbm93bi4iLCAiaWQiOiAiZGlzYWJsZS1kZWZhdWx0LXNlcnZlciIsICJsYWJlbCI6ICJEaXNhYmxlIGRlZmF1bHQgc2VydmVyIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJjb250YWluZXJDbGFzcyI6ICJ6LTIwIiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgIm5hbWUiOiAiRGlzYWJsZSBkZWZhdWx0IHNlcnZlciIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiB0cnVlLCAidmFsdWUiOiAieWVzIiwgIm1ldGhvZCI6ICJzY2hlZHVsZXIiLCAicHJldl92YWx1ZSI6ICJ5ZXMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJ0cmVzcGFzcyIsICJ0ZXh0IjogImlucF9wb3BvdmVyX21ldGhvZF9kaXNhYmxlZCJ9LCB7Imljb25OYW1lIjogImdsb2JlIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfZ2xvYmFsIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkRlbnkgSFRUUCByZXF1ZXN0IGlmIHRoZSByZXF1ZXN0IHZob3N0IGlzIHVua25vd24uIn1dfSwgIkRJU0FCTEVfREVGQVVMVF9TRVJWRVJfU1RSSUNUX1NOSSI6IHsiY29udGV4dCI6ICJnbG9iYWwiLCAiZGVmYXVsdCI6ICJubyIsICJoZWxwIjogIkNsb3NlIFNTTC9UTFMgY29ubmVjdGlvbiBpZiB0aGUgU05JIGlzIHVua25vd24uIiwgImlkIjogImRpc2FibGUtZGVmYXVsdC1zZXJ2ZXItc3RyaWN0LXNuaSIsICJsYWJlbCI6ICJEaXNhYmxlIGRlZmF1bHQgc2VydmVyIHN0cmljdCBTTkkiLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgImNvbnRhaW5lckNsYXNzIjogInotMTkiLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAibmFtZSI6ICJEaXNhYmxlIGRlZmF1bHQgc2VydmVyIHN0cmljdCBTTkkiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJubyIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIm5vIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZ2xvYmUiLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9nbG9iYWwifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiQ2xvc2UgU1NML1RMUyBjb25uZWN0aW9uIGlmIHRoZSBTTkkgaXMgdW5rbm93bi4ifV19LCAiUkVESVJFQ1RfSFRUUF9UT19IVFRQUyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJubyIsICJoZWxwIjogIlJlZGlyZWN0IGFsbCBIVFRQIHJlcXVlc3QgdG8gSFRUUFMuIiwgImlkIjogInJlZGlyZWN0LWh0dHAtdG8taHR0cHMiLCAibGFiZWwiOiAiUmVkaXJlY3QgSFRUUCB0byBIVFRQUyIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xOCIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJuYW1lIjogIlJlZGlyZWN0IEhUVFAgdG8gSFRUUFMiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJubyIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIm5vIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJSZWRpcmVjdCBhbGwgSFRUUCByZXF1ZXN0IHRvIEhUVFBTLiJ9XX0sICJBVVRPX1JFRElSRUNUX0hUVFBfVE9fSFRUUFMiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAieWVzIiwgImhlbHAiOiAiVHJ5IHRvIGRldGVjdCBpZiBIVFRQUyBpcyB1c2VkIGFuZCBhY3RpdmF0ZSBIVFRQIHRvIEhUVFBTIHJlZGlyZWN0aW9uIGlmIHRoYXQncyB0aGUgY2FzZS4iLCAiaWQiOiAiYXV0by1yZWRpcmVjdC1odHRwLXRvLWh0dHBzIiwgImxhYmVsIjogIkF1dG8gcmVkaXJlY3QgSFRUUCB0byBIVFRQUyIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xNyIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJuYW1lIjogIkF1dG8gcmVkaXJlY3QgSFRUUCB0byBIVFRQUyIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogInllcyIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogInllcyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVHJ5IHRvIGRldGVjdCBpZiBIVFRQUyBpcyB1c2VkIGFuZCBhY3RpdmF0ZSBIVFRQIHRvIEhUVFBTIHJlZGlyZWN0aW9uIGlmIHRoYXQncyB0aGUgY2FzZS4ifV19LCAiQUxMT1dFRF9NRVRIT0RTIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIkdFVHxQT1NUfEhFQUQiLCAiaGVscCI6ICJBbGxvd2VkIEhUVFAgYW5kIFdlYkRBViBtZXRob2RzLCBzZXBhcmF0ZWQgd2l0aCBwaXBlcyB0byBiZSBzZW50IGJ5IGNsaWVudHMuIiwgImlkIjogImFsbG93ZWQtbWV0aG9kcyIsICJsYWJlbCI6ICJBbGxvd2VkIG1ldGhvZHMiLCAicmVnZXgiOiAiXig/IVxcfCkoXFx8PyhbQS1aXXszLH0pKD8hLiooXnxcXHwpXFwyKSkrJCIsICJ0eXBlIjogInRleHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xNiIsICJwYXR0ZXJuIjogIl4oPyFcXHwpKFxcfD8oW0EtWl17Myx9KSg/IS4qKF58XFx8KVxcMikpKyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIkFsbG93ZWQgbWV0aG9kcyIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIkdFVHxQT1NUfEhFQUQiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICJHRVR8UE9TVHxIRUFEIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJBbGxvd2VkIEhUVFAgYW5kIFdlYkRBViBtZXRob2RzLCBzZXBhcmF0ZWQgd2l0aCBwaXBlcyB0byBiZSBzZW50IGJ5IGNsaWVudHMuIn1dfSwgIk1BWF9DTElFTlRfU0laRSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIxMG0iLCAiaGVscCI6ICJNYXhpbXVtIGJvZHkgc2l6ZSAoMCBmb3IgaW5maW5pdGUpLiIsICJpZCI6ICJtYXgtY2xpZW50LXNpemUiLCAibGFiZWwiOiAiTWF4aW11bSBib2R5IHNpemUiLCAicmVnZXgiOiAiXlxcZCtba0ttTWdHXT8kIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTE1IiwgInBhdHRlcm4iOiAiXlxcZCtba0ttTWdHXT8kIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJNYXhpbXVtIGJvZHkgc2l6ZSIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjEwbSIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIjEwbSIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTWF4aW11bSBib2R5IHNpemUgKDAgZm9yIGluZmluaXRlKS4ifV19LCAiU0VSVkVfRklMRVMiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAieWVzIiwgImhlbHAiOiAiU2VydmUgZmlsZXMgZnJvbSB0aGUgbG9jYWwgZm9sZGVyLiIsICJpZCI6ICJzZXJ2ZS1maWxlcyIsICJsYWJlbCI6ICJTZXJ2ZSBmaWxlcyIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xNCIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJuYW1lIjogIlNlcnZlIGZpbGVzIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IHRydWUsICJ2YWx1ZSI6ICJubyIsICJtZXRob2QiOiAic2NoZWR1bGVyIiwgInByZXZfdmFsdWUiOiAibm8iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJ0cmVzcGFzcyIsICJ0ZXh0IjogImlucF9wb3BvdmVyX21ldGhvZF9kaXNhYmxlZCJ9LCB7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiU2VydmUgZmlsZXMgZnJvbSB0aGUgbG9jYWwgZm9sZGVyLiJ9XX0sICJST09UX0ZPTERFUiI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJSb290IGZvbGRlciBjb250YWluaW5nIGZpbGVzIHRvIHNlcnZlICgvdmFyL3d3dy9odG1sL3tzZXJ2ZXJfbmFtZX0gaWYgdW5zZXQpLiIsICJpZCI6ICJyb290LWZvbGRlciIsICJsYWJlbCI6ICJSb290IGZvbGRlciIsICJyZWdleCI6ICJeKC9bXFx3LiBcXC1dKykqLz8kIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTEzIiwgInBhdHRlcm4iOiAiXigvW1xcdy4gXFwtXSspKi8/JCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiUm9vdCBmb2xkZXIiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlJvb3QgZm9sZGVyIGNvbnRhaW5pbmcgZmlsZXMgdG8gc2VydmUgKC92YXIvd3d3L2h0bWwve3NlcnZlcl9uYW1lfSBpZiB1bnNldCkuIn1dfSwgIlNTTF9QUk9UT0NPTFMiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiVExTdjEuMiBUTFN2MS4zIiwgImhlbHAiOiAiVGhlIHN1cHBvcnRlZCB2ZXJzaW9uIG9mIFRMUy4gV2UgcmVjb21tZW5kIHRoZSBkZWZhdWx0IHZhbHVlIFRMU3YxLjIgVExTdjEuMyBmb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLiIsICJpZCI6ICJodHRwcy1wcm90b2NvbHMiLCAibGFiZWwiOiAiSFRUUFMgcHJvdG9jb2xzIiwgInJlZ2V4IjogIl4oPyEgKSggP1RMU3YxXFwuWzAtM10pKiQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotMTIiLCAicGF0dGVybiI6ICJeKD8hICkoID9UTFN2MVxcLlswLTNdKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJIVFRQUyBwcm90b2NvbHMiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJUTFN2MS4yIFRMU3YxLjMiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICJUTFN2MS4yIFRMU3YxLjMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlRoZSBzdXBwb3J0ZWQgdmVyc2lvbiBvZiBUTFMuIFdlIHJlY29tbWVuZCB0aGUgZGVmYXVsdCB2YWx1ZSBUTFN2MS4yIFRMU3YxLjMgZm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucy4ifV19LCAiSFRUUDIiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAieWVzIiwgImhlbHAiOiAiU3VwcG9ydCBIVFRQMiBwcm90b2NvbCB3aGVuIEhUVFBTIGlzIGVuYWJsZWQuIiwgImlkIjogImh0dHAyIiwgImxhYmVsIjogIkhUVFAyIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJjb250YWluZXJDbGFzcyI6ICJ6LTExIiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgIm5hbWUiOiAiSFRUUDIiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJ5ZXMiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICJ5ZXMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlN1cHBvcnQgSFRUUDIgcHJvdG9jb2wgd2hlbiBIVFRQUyBpcyBlbmFibGVkLiJ9XX0sICJIVFRQMyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJubyIsICJoZWxwIjogIlN1cHBvcnQgSFRUUDMgcHJvdG9jb2wgd2hlbiBIVFRQUyBpcyBlbmFibGVkLiIsICJpZCI6ICJodHRwMyIsICJsYWJlbCI6ICJIVFRQMyIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xMCIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJuYW1lIjogIkhUVFAzIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAibm8iLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICJubyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiU3VwcG9ydCBIVFRQMyBwcm90b2NvbCB3aGVuIEhUVFBTIGlzIGVuYWJsZWQuIn1dfSwgIkhUVFAzX0FMVF9TVkNfUE9SVCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICI0NDMiLCAiaGVscCI6ICJIVFRQMyBhbHRlcm5hdGUgc2VydmljZSBwb3J0LiBUaGlzIHZhbHVlIHdpbGwgYmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBBbHQtU3ZjIGhlYWRlci4iLCAiaWQiOiAiaHR0cDMtYWx0LXN2Yy1wb3J0IiwgImxhYmVsIjogIkhUVFAzIEFsdC1TdmMgcG9ydCIsICJyZWdleCI6ICJeXFxkKyQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotOSIsICJwYXR0ZXJuIjogIl5cXGQrJCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiSFRUUDMgQWx0LVN2YyBwb3J0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiNDQzIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAiNDQzIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJIVFRQMyBhbHRlcm5hdGUgc2VydmljZSBwb3J0LiBUaGlzIHZhbHVlIHdpbGwgYmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBBbHQtU3ZjIGhlYWRlci4ifV19LCAiTElTVEVOX0hUVFAiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAieWVzIiwgImhlbHAiOiAiUmVzcG9uZCB0byAoaW5zZWN1cmUpIEhUVFAgcmVxdWVzdHMuIiwgImlkIjogImh0dHAtbGlzdGVuIiwgImxhYmVsIjogIkhUVFAgbGlzdGVuIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJjb250YWluZXJDbGFzcyI6ICJ6LTgiLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAibmFtZSI6ICJIVFRQIGxpc3RlbiIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogInllcyIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogInllcyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiUmVzcG9uZCB0byAoaW5zZWN1cmUpIEhUVFAgcmVxdWVzdHMuIn1dfSwgIlVTRV9PUEVOX0ZJTEVfQ0FDSEUiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAibm8iLCAiaGVscCI6ICJFbmFibGUgb3BlbiBmaWxlIGNhY2hlIGZlYXR1cmUiLCAiaWQiOiAidXNlLW9wZW4tZmlsZS1jYWNoZSIsICJsYWJlbCI6ICJVc2Ugb3BlbiBmaWxlIGNhY2hlIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJjb250YWluZXJDbGFzcyI6ICJ6LTciLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAibmFtZSI6ICJVc2Ugb3BlbiBmaWxlIGNhY2hlIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAibm8iLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICJubyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiRW5hYmxlIG9wZW4gZmlsZSBjYWNoZSBmZWF0dXJlIn1dfSwgIk9QRU5fRklMRV9DQUNIRSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJtYXg9MTAwMCBpbmFjdGl2ZT0yMHMiLCAiaGVscCI6ICJPcGVuIGZpbGUgY2FjaGUgZGlyZWN0aXZlIiwgImlkIjogIm9wZW4tZmlsZS1jYWNoZSIsICJsYWJlbCI6ICJVc2Ugb3BlbiBmaWxlIGNhY2hlIiwgInJlZ2V4IjogIl4ob2ZmfG1heD1cXGQrKCBpbmFjdGl2ZT1cXGQrKG1zP3xbc2hkd015XSkpPykkIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTYiLCAicGF0dGVybiI6ICJeKG9mZnxtYXg9XFxkKyggaW5hY3RpdmU9XFxkKyhtcz98W3NoZHdNeV0pKT8pJCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiVXNlIG9wZW4gZmlsZSBjYWNoZSIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIm1heD0xMDAwIGluYWN0aXZlPTIwcyIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIm1heD0xMDAwIGluYWN0aXZlPTIwcyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiT3BlbiBmaWxlIGNhY2hlIGRpcmVjdGl2ZSJ9XX0sICJPUEVOX0ZJTEVfQ0FDSEVfRVJST1JTIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogInllcyIsICJoZWxwIjogIkVuYWJsZSBvcGVuIGZpbGUgY2FjaGUgZm9yIGVycm9ycyIsICJpZCI6ICJvcGVuLWZpbGUtY2FjaGUtZXJyb3JzIiwgImxhYmVsIjogIk9wZW4gZmlsZSBjYWNoZSBlcnJvcnMiLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgImNvbnRhaW5lckNsYXNzIjogInotNSIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJuYW1lIjogIk9wZW4gZmlsZSBjYWNoZSBlcnJvcnMiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJ5ZXMiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICJ5ZXMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkVuYWJsZSBvcGVuIGZpbGUgY2FjaGUgZm9yIGVycm9ycyJ9XX0sICJPUEVOX0ZJTEVfQ0FDSEVfTUlOX1VTRVMiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiMiIsICJoZWxwIjogIkVuYWJsZSBvcGVuIGZpbGUgY2FjaGUgbWluaW11bSB1c2VzIiwgImlkIjogIm9wZW4tZmlsZS1jYWNoZS1taW4tdXNlcyIsICJsYWJlbCI6ICJPcGVuIGZpbGUgY2FjaGUgbWluIHVzZXMiLCAicmVnZXgiOiAiXlsxLTldXFxkKiQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotNCIsICJwYXR0ZXJuIjogIl5bMS05XVxcZCokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJPcGVuIGZpbGUgY2FjaGUgbWluIHVzZXMiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIyIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAiMiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiRW5hYmxlIG9wZW4gZmlsZSBjYWNoZSBtaW5pbXVtIHVzZXMifV19LCAiT1BFTl9GSUxFX0NBQ0hFX1ZBTElEIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIjMwcyIsICJoZWxwIjogIk9wZW4gZmlsZSBjYWNoZSB2YWxpZCB0aW1lIiwgImlkIjogIm9wZW4tZmlsZS1jYWNoZS12YWxpZCIsICJsYWJlbCI6ICJPcGVuIGZpbGUgY2FjaGUgdmFsaWQgdGltZSIsICJyZWdleCI6ICJeXFxkKyhtcz98W3NoZHdNeV0pJCIsICJ0eXBlIjogInRleHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0zIiwgInBhdHRlcm4iOiAiXlxcZCsobXM/fFtzaGR3TXldKSQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIk9wZW4gZmlsZSBjYWNoZSB2YWxpZCB0aW1lIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiMzBzIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAiMzBzIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJPcGVuIGZpbGUgY2FjaGUgdmFsaWQgdGltZSJ9XX0sICJFWFRFUk5BTF9QTFVHSU5fVVJMUyI6IHsiY29udGV4dCI6ICJnbG9iYWwiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJMaXN0IG9mIGV4dGVybmFsIHBsdWdpbnMgVVJMcyAoZGlyZWN0IGRvd25sb2FkIHRvIC56aXAgb3IgLnRhciBmaWxlKSB0byBkb3dubG9hZCBhbmQgaW5zdGFsbCAoVVJMcyBhcmUgc2VwYXJhdGVkIHdpdGggc3BhY2UpLiIsICJpZCI6ICJleHRlcm5hbC1wbHVnaW4tdXJscyIsICJsYWJlbCI6ICJFeHRlcm5hbCBwbHVnaW4gVVJMcyIsICJyZWdleCI6ICJeKCAqKChodHRwcz86XFwvXFwvfGZpbGU6XFwvXFwvXFwvKVtcXC1cXHdAOiUuK34jPV0rW1xcLVxcd1xcKFxcKSFAOiUrLn4jPyZcXC89JF0qKSg/IS4qXFwyKD8hLikpICopKiQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotMiIsICJwYXR0ZXJuIjogIl4oICooKGh0dHBzPzpcXC9cXC98ZmlsZTpcXC9cXC9cXC8pW1xcLVxcd0A6JS4rfiM9XStbXFwtXFx3XFwoXFwpIUA6JSsufiM/JlxcLz0kXSopKD8hLipcXDIoPyEuKSkgKikqJCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiRXh0ZXJuYWwgcGx1Z2luIFVSTHMiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJnbG9iZSIsICJ0ZXh0IjogImlucF9wb3BvdmVyX2dsb2JhbCJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJMaXN0IG9mIGV4dGVybmFsIHBsdWdpbnMgVVJMcyAoZGlyZWN0IGRvd25sb2FkIHRvIC56aXAgb3IgLnRhciBmaWxlKSB0byBkb3dubG9hZCBhbmQgaW5zdGFsbCAoVVJMcyBhcmUgc2VwYXJhdGVkIHdpdGggc3BhY2UpLiJ9XX0sICJERU5ZX0hUVFBfU1RBVFVTIjogeyJjb250ZXh0IjogImdsb2JhbCIsICJkZWZhdWx0IjogIjQwMyIsICJoZWxwIjogIkhUVFAgc3RhdHVzIGNvZGUgdG8gc2VuZCB3aGVuIHRoZSByZXF1ZXN0IGlzIGRlbmllZCAoNDAzIG9yIDQ0NCkuIFdoZW4gdXNpbmcgNDQ0LCBCdW5rZXJXZWIgd2lsbCBjbG9zZSB0aGUgY29ubmVjdGlvbi4iLCAiaWQiOiAiZGVueS1odHRwLXN0YXR1cyIsICJsYWJlbCI6ICJEZW55IEhUVFAgc3RhdHVzIiwgInJlZ2V4IjogIl4oNDAzfDQ0NCkkIiwgInR5cGUiOiAic2VsZWN0IiwgImNvbnRhaW5lckNsYXNzIjogInotMSIsICJwYXR0ZXJuIjogIl4oNDAzfDQ0NCkkIiwgImlucFR5cGUiOiAic2VsZWN0IiwgIm5hbWUiOiAiRGVueSBIVFRQIHN0YXR1cyIsICJ2YWx1ZXMiOiBbIjQwMyIsICI0NDQiXSwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiNDAzIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAiNDAzIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZ2xvYmUiLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9nbG9iYWwifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiSFRUUCBzdGF0dXMgY29kZSB0byBzZW5kIHdoZW4gdGhlIHJlcXVlc3QgaXMgZGVuaWVkICg0MDMgb3IgNDQ0KS4gV2hlbiB1c2luZyA0NDQsIEJ1bmtlcldlYiB3aWxsIGNsb3NlIHRoZSBjb25uZWN0aW9uLiJ9XX0sICJTRU5EX0FOT05ZTU9VU19SRVBPUlQiOiB7ImNvbnRleHQiOiAiZ2xvYmFsIiwgImRlZmF1bHQiOiAieWVzIiwgImhlbHAiOiAiU2VuZCBhbm9ueW1vdXMgcmVwb3J0IHRvIEJ1bmtlcldlYiBtYWludGFpbmVycy4iLCAiaWQiOiAic2VuZC1hbm9ueW1vdXMtcmVwb3J0IiwgImxhYmVsIjogIlNlbmQgYW5vbnltb3VzIHJlcG9ydCIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAiY29udGFpbmVyQ2xhc3MiOiAiei0wIiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgIm5hbWUiOiAiU2VuZCBhbm9ueW1vdXMgcmVwb3J0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IHRydWUsICJ2YWx1ZSI6ICJubyIsICJtZXRob2QiOiAic2NoZWR1bGVyIiwgInByZXZfdmFsdWUiOiAibm8iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJ0cmVzcGFzcyIsICJ0ZXh0IjogImlucF9wb3BvdmVyX21ldGhvZF9kaXNhYmxlZCJ9LCB7Imljb25OYW1lIjogImdsb2JlIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfZ2xvYmFsIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlNlbmQgYW5vbnltb3VzIHJlcG9ydCB0byBCdW5rZXJXZWIgbWFpbnRhaW5lcnMuIn1dfX0sICJjaGVja3N1bSI6IG51bGx9LCB7ImlkIjogIm1vZHNlY3VyaXR5IiwgInN0cmVhbSI6ICJubyIsICJuYW1lIjogIk1vZFNlY3VyaXR5IiwgImRlc2NyaXB0aW9uIjogIk1hbmFnZW1lbnQgb2YgdGhlIE1vZFNlY3VyaXR5IFdBRi4iLCAidmVyc2lvbiI6ICIxLjAiLCAidHlwZSI6ICJjb3JlIiwgIm1ldGhvZCI6ICJtYW51YWwiLCAicGFnZSI6IGZhbHNlLCAic2V0dGluZ3MiOiB7IlVTRV9NT0RTRUNVUklUWSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJ5ZXMiLCAiaGVscCI6ICJFbmFibGUgTW9kU2VjdXJpdHkgV0FGLiIsICJpZCI6ICJ1c2UtbW9kc2VjdXJpdHkiLCAibGFiZWwiOiAiVXNlIE1vZFNlY3VyaXR5IiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJjb250YWluZXJDbGFzcyI6ICJ6LTUiLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAibmFtZSI6ICJVc2UgTW9kU2VjdXJpdHkiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJ5ZXMiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICJ5ZXMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkVuYWJsZSBNb2RTZWN1cml0eSBXQUYuIn1dfSwgIlVTRV9NT0RTRUNVUklUWV9DUlMiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAieWVzIiwgImhlbHAiOiAiRW5hYmxlIE9XQVNQIENvcmUgUnVsZSBTZXQuIiwgImlkIjogInVzZS1tb2RzZWN1cml0eS1jcnMiLCAibGFiZWwiOiAiVXNlIENvcmUgUnVsZSBTZXQiLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgImNvbnRhaW5lckNsYXNzIjogInotNCIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJuYW1lIjogIlVzZSBDb3JlIFJ1bGUgU2V0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAieWVzIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAieWVzIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJFbmFibGUgT1dBU1AgQ29yZSBSdWxlIFNldC4ifV19LCAiTU9EU0VDVVJJVFlfQ1JTX1ZFUlNJT04iOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiMyIsICJoZWxwIjogIlZlcnNpb24gb2YgdGhlIE9XQVNQIENvcmUgUnVsZSBTZXQgdG8gdXNlIHdpdGggTW9kU2VjdXJpdHkgKDMsIDQgb3IgbmlnaHRseSkuIiwgImlkIjogIm1vZHNlY3VyaXR5LWNycy12ZXJzaW9uIiwgImxhYmVsIjogIkNvcmUgUnVsZSBTZXQgVmVyc2lvbiIsICJyZWdleCI6ICJeKDN8NHxuaWdodGx5KSQiLCAidHlwZSI6ICJzZWxlY3QiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0zIiwgInBhdHRlcm4iOiAiXigzfDR8bmlnaHRseSkkIiwgImlucFR5cGUiOiAic2VsZWN0IiwgIm5hbWUiOiAiQ29yZSBSdWxlIFNldCBWZXJzaW9uIiwgInZhbHVlcyI6IFsiMyIsICI0IiwgIm5pZ2h0bHkiXSwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiNCIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIjQiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlZlcnNpb24gb2YgdGhlIE9XQVNQIENvcmUgUnVsZSBTZXQgdG8gdXNlIHdpdGggTW9kU2VjdXJpdHkgKDMsIDQgb3IgbmlnaHRseSkuIn1dfSwgIk1PRFNFQ1VSSVRZX1NFQ19BVURJVF9FTkdJTkUiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiUmVsZXZhbnRPbmx5IiwgImhlbHAiOiAiU2VjQXVkaXRFbmdpbmUgZGlyZWN0aXZlIG9mIE1vZFNlY3VyaXR5LiIsICJpZCI6ICJtb2RzZWN1cml0eS1zZWMtYXVkaXQtZW5naW5lIiwgImxhYmVsIjogIlNlY0F1ZGl0RW5naW5lIiwgInJlZ2V4IjogIl4oT258UmVsZXZhbnRPbmx5fE9mZikkIiwgInR5cGUiOiAic2VsZWN0IiwgImNvbnRhaW5lckNsYXNzIjogInotMiIsICJwYXR0ZXJuIjogIl4oT258UmVsZXZhbnRPbmx5fE9mZikkIiwgImlucFR5cGUiOiAic2VsZWN0IiwgIm5hbWUiOiAiU2VjQXVkaXRFbmdpbmUiLCAidmFsdWVzIjogWyJPZmYiLCAiT24iLCAiUmVsZXZhbnRPbmx5Il0sICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIlJlbGV2YW50T25seSIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIlJlbGV2YW50T25seSIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiU2VjQXVkaXRFbmdpbmUgZGlyZWN0aXZlIG9mIE1vZFNlY3VyaXR5LiJ9XX0sICJNT0RTRUNVUklUWV9TRUNfUlVMRV9FTkdJTkUiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiT24iLCAiaGVscCI6ICJTZWNSdWxlRW5naW5lIGRpcmVjdGl2ZSBvZiBNb2RTZWN1cml0eS4iLCAiaWQiOiAibW9kc2VjdXJpdHktc2VjLXJ1bGUtZW5naW5lIiwgImxhYmVsIjogIlNlY1J1bGVFbmdpbmUiLCAicmVnZXgiOiAiXihPbnxEZXRlY3Rpb25Pbmx5fE9mZikkIiwgInR5cGUiOiAic2VsZWN0IiwgImNvbnRhaW5lckNsYXNzIjogInotMSIsICJwYXR0ZXJuIjogIl4oT258RGV0ZWN0aW9uT25seXxPZmYpJCIsICJpbnBUeXBlIjogInNlbGVjdCIsICJuYW1lIjogIlNlY1J1bGVFbmdpbmUiLCAidmFsdWVzIjogWyJEZXRlY3Rpb25Pbmx5IiwgIk9mZiIsICJPbiJdLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJPbiIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIk9uIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJTZWNSdWxlRW5naW5lIGRpcmVjdGl2ZSBvZiBNb2RTZWN1cml0eS4ifV19LCAiTU9EU0VDVVJJVFlfU0VDX0FVRElUX0xPR19QQVJUUyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJBQkNGSFoiLCAiaGVscCI6ICJTZWNBdWRpdExvZ1BhcnRzIGRpcmVjdGl2ZSBvZiBNb2RTZWN1cml0eS4iLCAiaWQiOiAibW9kc2VjdXJpdHktc2VjLWF1ZGl0LWxvZy1wYXJ0cyIsICJsYWJlbCI6ICJTZWNBdWRpdExvZ1BhcnRzIiwgInJlZ2V4IjogIl5BKChbQi1LXSkoPyEuKlxcMikpK1okIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTAiLCAicGF0dGVybiI6ICJeQSgoW0ItS10pKD8hLipcXDIpKStaJCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiU2VjQXVkaXRMb2dQYXJ0cyIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIkFCQ0ZIWiIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIkFCQ0ZIWiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiU2VjQXVkaXRMb2dQYXJ0cyBkaXJlY3RpdmUgb2YgTW9kU2VjdXJpdHkuIn1dfX0sICJjaGVja3N1bSI6IG51bGx9LCB7ImlkIjogInBocCIsICJzdHJlYW0iOiAibm8iLCAibmFtZSI6ICJQSFAiLCAiZGVzY3JpcHRpb24iOiAiTWFuYWdlIGxvY2FsIG9yIHJlbW90ZSBQSFAtRlBNLiIsICJ2ZXJzaW9uIjogIjEuMCIsICJ0eXBlIjogImNvcmUiLCAibWV0aG9kIjogIm1hbnVhbCIsICJwYWdlIjogZmFsc2UsICJzZXR0aW5ncyI6IHsiUkVNT1RFX1BIUCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJIb3N0bmFtZSBvZiB0aGUgcmVtb3RlIFBIUC1GUE0gaW5zdGFuY2UuIiwgImlkIjogInJlbW90ZS1waHAiLCAibGFiZWwiOiAiUmVtb3RlIFBIUCIsICJyZWdleCI6ICJeKCg/PS57MSwyNTV9JClbMC05QS1aYS16XSg/Oig/OlswLTlBLVphLXpdfC0pezAsNjF9WzAtOUEtWmEtel0pPyg/OlxcLlswLTlBLVphLXpdKD86KD86WzAtOUEtWmEtel18LSl7MCw2MX1bMC05QS1aYS16XSk/KSpcXC4/KT8kIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTMiLCAicGF0dGVybiI6ICJeKCg/PS57MSwyNTV9JClbMC05QS1aYS16XSg/Oig/OlswLTlBLVphLXpdfC0pezAsNjF9WzAtOUEtWmEtel0pPyg/OlxcLlswLTlBLVphLXpdKD86KD86WzAtOUEtWmEtel18LSl7MCw2MX1bMC05QS1aYS16XSk/KSpcXC4/KT8kIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJSZW1vdGUgUEhQIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJIb3N0bmFtZSBvZiB0aGUgcmVtb3RlIFBIUC1GUE0gaW5zdGFuY2UuIn1dfSwgIlJFTU9URV9QSFBfUEFUSCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJSb290IGZvbGRlciBjb250YWluaW5nIGZpbGVzIGluIHRoZSByZW1vdGUgUEhQLUZQTSBpbnN0YW5jZS4iLCAiaWQiOiAicmVtb3RlLXBocC1wYXRoIiwgImxhYmVsIjogIlJlbW90ZSBQSFAgcGF0aCIsICJyZWdleCI6ICJeKC9bXFx3LiBcXC1dKykqLz8kIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTIiLCAicGF0dGVybiI6ICJeKC9bXFx3LiBcXC1dKykqLz8kIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJSZW1vdGUgUEhQIHBhdGgiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlJvb3QgZm9sZGVyIGNvbnRhaW5pbmcgZmlsZXMgaW4gdGhlIHJlbW90ZSBQSFAtRlBNIGluc3RhbmNlLiJ9XX0sICJMT0NBTF9QSFAiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiUGF0aCB0byB0aGUgUEhQLUZQTSBzb2NrZXQgZmlsZS4iLCAiaWQiOiAibG9jYWwiLCAibGFiZWwiOiAiTG9jYWwgUEhQIiwgInJlZ2V4IjogIl4oL1tcXHcuIFxcLV0rKSovPyQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotMSIsICJwYXR0ZXJuIjogIl4oL1tcXHcuIFxcLV0rKSovPyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIkxvY2FsIFBIUCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiUGF0aCB0byB0aGUgUEhQLUZQTSBzb2NrZXQgZmlsZS4ifV19LCAiTE9DQUxfUEhQX1BBVEgiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiUm9vdCBmb2xkZXIgY29udGFpbmluZyBmaWxlcyBpbiB0aGUgbG9jYWwgUEhQLUZQTSBpbnN0YW5jZS4iLCAiaWQiOiAibG9jYWwtcGhwLXBhdGgiLCAibGFiZWwiOiAiTG9jYWwgUEhQIHBhdGgiLCAicmVnZXgiOiAiXigvW1xcdy4gXFwtXSspKi8/JCIsICJ0eXBlIjogInRleHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0wIiwgInBhdHRlcm4iOiAiXigvW1xcdy4gXFwtXSspKi8/JCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiTG9jYWwgUEhQIHBhdGgiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlJvb3QgZm9sZGVyIGNvbnRhaW5pbmcgZmlsZXMgaW4gdGhlIGxvY2FsIFBIUC1GUE0gaW5zdGFuY2UuIn1dfX0sICJjaGVja3N1bSI6IG51bGx9LCB7ImlkIjogInBybyIsICJzdHJlYW0iOiAibm8iLCAibmFtZSI6ICJQcm8iLCAiZGVzY3JpcHRpb24iOiAiUHJvIHNldHRpbmdzIGZvciB0aGUgUHJvIHZlcnNpb24gb2YgQnVua2VyV2ViLiIsICJ2ZXJzaW9uIjogIjEuMCIsICJ0eXBlIjogImNvcmUiLCAibWV0aG9kIjogIm1hbnVhbCIsICJwYWdlIjogZmFsc2UsICJzZXR0aW5ncyI6IHsiUFJPX0xJQ0VOU0VfS0VZIjogeyJjb250ZXh0IjogImdsb2JhbCIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIlRoZSBMaWNlbnNlIEtleSBmb3IgdGhlIFBybyB2ZXJzaW9uIG9mIEJ1bmtlcldlYi4iLCAiaWQiOiAicHJvLWxpY2Vuc2Uta2V5IiwgImxhYmVsIjogIlBybyBMaWNlbnNlIEtleSIsICJyZWdleCI6ICJeLiokIiwgInR5cGUiOiAicGFzc3dvcmQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0wIiwgInBhdHRlcm4iOiAiXi4qJCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiUHJvIExpY2Vuc2UgS2V5IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZ2xvYmUiLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9nbG9iYWwifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVGhlIExpY2Vuc2UgS2V5IGZvciB0aGUgUHJvIHZlcnNpb24gb2YgQnVua2VyV2ViLiJ9XX19LCAiY2hlY2tzdW0iOiBudWxsfSwgeyJpZCI6ICJyZWFsaXAiLCAic3RyZWFtIjogInBhcnRpYWwiLCAibmFtZSI6ICJSZWFsIElQIiwgImRlc2NyaXB0aW9uIjogIkdldCByZWFsIElQIG9mIGNsaWVudHMgd2hlbiBCdW5rZXJXZWIgaXMgYmVoaW5kIGEgcmV2ZXJzZSBwcm94eSAvIGxvYWQgYmFsYW5jZXIuIiwgInZlcnNpb24iOiAiMS4wIiwgInR5cGUiOiAiY29yZSIsICJtZXRob2QiOiAibWFudWFsIiwgInBhZ2UiOiBmYWxzZSwgInNldHRpbmdzIjogeyJVU0VfUkVBTF9JUCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJubyIsICJoZWxwIjogIlJldHJpZXZlIHRoZSByZWFsIElQIG9mIGNsaWVudC4iLCAiaWQiOiAidXNlLXJlYWwtaXAiLCAibGFiZWwiOiAiVXNlIHJlYWwgaXAiLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgImNvbnRhaW5lckNsYXNzIjogInotNSIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJuYW1lIjogIlVzZSByZWFsIGlwIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAibm8iLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICJubyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiUmV0cmlldmUgdGhlIHJlYWwgSVAgb2YgY2xpZW50LiJ9XX0sICJVU0VfUFJPWFlfUFJPVE9DT0wiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAibm8iLCAiaGVscCI6ICJFbmFibGUgUFJPWFkgcHJvdG9jb2wgY29tbXVuaWNhdGlvbi4iLCAiaWQiOiAidXNlLXByb3h5LXByb3RvY29sIiwgImxhYmVsIjogIlVzZSBQUk9YWSBwcm90b2NvbCIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAiY29udGFpbmVyQ2xhc3MiOiAiei00IiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgIm5hbWUiOiAiVXNlIFBST1hZIHByb3RvY29sIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAibm8iLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICJubyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiRW5hYmxlIFBST1hZIHByb3RvY29sIGNvbW11bmljYXRpb24uIn1dfSwgIlJFQUxfSVBfRlJPTSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIxOTIuMTY4LjAuMC8xNiAxNzIuMTYuMC4wLzEyIDEwLjAuMC4wLzgiLCAiaGVscCI6ICJMaXN0IG9mIHRydXN0ZWQgSVBzIC8gbmV0d29ya3MsIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgd2hlcmUgcHJveGllZCByZXF1ZXN0cyBjb21lIGZyb20uIiwgImlkIjogInJlYWwtaXAtZnJvbSIsICJsYWJlbCI6ICJSZWFsIElQIGZyb20iLCAicmVnZXgiOiAiXig/ISApKCAqKCgoXFxiMjVbMC01XXxcXGIyWzAtNF1cXGR8XFxiWzAxXT9cXGRcXGQ/KShcXC4oMjVbMC01XXwyWzAtNF1cXGR8WzAxXT9cXGRcXGQ/KSl7M30pKFxcLyhbMS0yXVswLTldP3wzWzAtMl0/fFswNC05XSkpP3woKFswLTlhLWZBLUZdezEsNH06KXs3fVswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDd9OnwoWzAtOWEtZkEtRl17MSw0fTopezEsNn06WzAtOWEtZkEtRl17MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsNX0oOlswLTlhLWZBLUZdezEsNH0pezEsMn18KFswLTlhLWZBLUZdezEsNH06KXsxLDR9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDN9fChbMC05YS1mQS1GXXsxLDR9Oil7MSwzfSg6WzAtOWEtZkEtRl17MSw0fSl7MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsMn0oOlswLTlhLWZBLUZdezEsNH0pezEsNX18WzAtOWEtZkEtRl17MSw0fTooKDpbMC05YS1mQS1GXXsxLDR9KXsxLDZ9KXw6KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw3fXw6KXxmZTgwOig6WzAtOWEtZkEtRl1aezAsNH0pezAsNH0lWzAtOWEtekEtWl0rfDo6KGZmZmYoOjB7MSw0fSk/Oik/KCgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZClcXC4pezN9KDI1WzAtNV18KDJbMC00XXwxP1xcZCk/XFxkKXwoWzAtOWEtZkEtRl17MSw0fTopezEsNH06KCgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZClcXC4pezN9KDI1WzAtNV18KDJbMC00XXwxP1xcZCk/XFxkKSkoXFwvKDEyWzAtOF18MVswMV1bMC05XXxbMC05XVswLTldPykpPykoPyEuKlxcRFxcMihbXlxcZFxcL118JCkpICopKiQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotMyIsICJwYXR0ZXJuIjogIl4oPyEgKSggKigoKFxcYjI1WzAtNV18XFxiMlswLTRdXFxkfFxcYlswMV0/XFxkXFxkPykoXFwuKDI1WzAtNV18MlswLTRdXFxkfFswMV0/XFxkXFxkPykpezN9KShcXC8oWzEtMl1bMC05XT98M1swLTJdP3xbMDQtOV0pKT98KChbMC05YS1mQS1GXXsxLDR9Oil7N31bMC05YS1mQS1GXXsxLDR9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw3fTp8KFswLTlhLWZBLUZdezEsNH06KXsxLDZ9OlswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDV9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDJ9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw0fSg6WzAtOWEtZkEtRl17MSw0fSl7MSwzfXwoWzAtOWEtZkEtRl17MSw0fTopezEsM30oOlswLTlhLWZBLUZdezEsNH0pezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDJ9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDV9fFswLTlhLWZBLUZdezEsNH06KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw2fSl8OigoOlswLTlhLWZBLUZdezEsNH0pezEsN318Oil8ZmU4MDooOlswLTlhLWZBLUZdWnswLDR9KXswLDR9JVswLTlhLXpBLVpdK3w6OihmZmZmKDowezEsNH0pPzopPygoMjVbMC01XXwoMlswLTRdfDE/XFxkKT9cXGQpXFwuKXszfSgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZCl8KFswLTlhLWZBLUZdezEsNH06KXsxLDR9OigoMjVbMC01XXwoMlswLTRdfDE/XFxkKT9cXGQpXFwuKXszfSgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZCkpKFxcLygxMlswLThdfDFbMDFdWzAtOV18WzAtOV1bMC05XT8pKT8pKD8hLipcXERcXDIoW15cXGRcXC9dfCQpKSAqKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJSZWFsIElQIGZyb20iLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIxOTIuMTY4LjAuMC8xNiAxNzIuMTYuMC4wLzEyIDEwLjAuMC4wLzgiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICIxOTIuMTY4LjAuMC8xNiAxNzIuMTYuMC4wLzEyIDEwLjAuMC4wLzgiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkxpc3Qgb2YgdHJ1c3RlZCBJUHMgLyBuZXR3b3Jrcywgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCB3aGVyZSBwcm94aWVkIHJlcXVlc3RzIGNvbWUgZnJvbS4ifV19LCAiUkVBTF9JUF9IRUFERVIiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiWC1Gb3J3YXJkZWQtRm9yIiwgImhlbHAiOiAiSFRUUCBoZWFkZXIgY29udGFpbmluZyB0aGUgcmVhbCBJUCBvciBzcGVjaWFsIHZhbHVlIHByb3h5X3Byb3RvY29sIGZvciBQUk9YWSBwcm90b2NvbC4iLCAiaWQiOiAicmVhbC1pcC1oZWFkZXIiLCAibGFiZWwiOiAiUmVhbCBJUCBoZWFkZXIiLCAicmVnZXgiOiAiXig/ISApKCggPyg/IXByb3h5X3Byb3RvY29sKVtcXHdcXC1dKykqfHByb3h5X3Byb3RvY29sKSQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotMiIsICJwYXR0ZXJuIjogIl4oPyEgKSgoID8oPyFwcm94eV9wcm90b2NvbClbXFx3XFwtXSspKnxwcm94eV9wcm90b2NvbCkkIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJSZWFsIElQIGhlYWRlciIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIlgtRm9yd2FyZGVkLUZvciIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIlgtRm9yd2FyZGVkLUZvciIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiSFRUUCBoZWFkZXIgY29udGFpbmluZyB0aGUgcmVhbCBJUCBvciBzcGVjaWFsIHZhbHVlIHByb3h5X3Byb3RvY29sIGZvciBQUk9YWSBwcm90b2NvbC4ifV19LCAiUkVBTF9JUF9SRUNVUlNJVkUiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAieWVzIiwgImhlbHAiOiAiUGVyZm9ybSBhIHJlY3Vyc2l2ZSBzZWFyY2ggaW4gdGhlIGhlYWRlciBjb250YWluZXIgSVAgYWRkcmVzcy4iLCAiaWQiOiAicmVhbC1pcC1yZWN1cnNpdmUiLCAibGFiZWwiOiAiUmVhbCBJUCByZWN1cnNpdmUiLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgImNvbnRhaW5lckNsYXNzIjogInotMSIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJuYW1lIjogIlJlYWwgSVAgcmVjdXJzaXZlIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAieWVzIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAieWVzIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJQZXJmb3JtIGEgcmVjdXJzaXZlIHNlYXJjaCBpbiB0aGUgaGVhZGVyIGNvbnRhaW5lciBJUCBhZGRyZXNzLiJ9XX0sICJSRUFMX0lQX0ZST01fVVJMUyI6IHsiY29udGV4dCI6ICJnbG9iYWwiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJMaXN0IG9mIFVSTHMgY29udGFpbmluZyB0cnVzdGVkIElQcyAvIG5ldHdvcmtzLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIHdoZXJlIHByb3hpZWQgcmVxdWVzdHMgY29tZSBmcm9tLiIsICJpZCI6ICJyZWFsLWlwLWZyb20tdXJscyIsICJsYWJlbCI6ICJSZWFsIElQIGZyb20gVVJMcyIsICJyZWdleCI6ICJeKCAqKChodHRwcz86XFwvXFwvfGZpbGU6XFwvXFwvXFwvKVtcXC1cXHdAOiUuK34jPV0rW1xcLVxcd1xcKFxcKSFAOiUrLn4jPyZcXC89JF0qKSg/IS4qXFwyKD8hLikpICopKiQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotMCIsICJwYXR0ZXJuIjogIl4oICooKGh0dHBzPzpcXC9cXC98ZmlsZTpcXC9cXC9cXC8pW1xcLVxcd0A6JS4rfiM9XStbXFwtXFx3XFwoXFwpIUA6JSsufiM/JlxcLz0kXSopKD8hLipcXDIoPyEuKSkgKikqJCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiUmVhbCBJUCBmcm9tIFVSTHMiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJnbG9iZSIsICJ0ZXh0IjogImlucF9wb3BvdmVyX2dsb2JhbCJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJMaXN0IG9mIFVSTHMgY29udGFpbmluZyB0cnVzdGVkIElQcyAvIG5ldHdvcmtzLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIHdoZXJlIHByb3hpZWQgcmVxdWVzdHMgY29tZSBmcm9tLiJ9XX19LCAiY2hlY2tzdW0iOiBudWxsfSwgeyJpZCI6ICJyZWRpcmVjdCIsICJzdHJlYW0iOiAibm8iLCAibmFtZSI6ICJSZWRpcmVjdCIsICJkZXNjcmlwdGlvbiI6ICJNYW5hZ2UgSFRUUCByZWRpcmVjdHMuIiwgInZlcnNpb24iOiAiMS4wIiwgInR5cGUiOiAiY29yZSIsICJtZXRob2QiOiAibWFudWFsIiwgInBhZ2UiOiBmYWxzZSwgInNldHRpbmdzIjogeyJSRURJUkVDVF9UTyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJSZWRpcmVjdCBhIHdob2xlIHNpdGUgdG8gYW5vdGhlciBvbmUuIiwgImlkIjogInJlZGlyZWN0LXRvIiwgImxhYmVsIjogIlJlZGlyZWN0IHRvIiwgInJlZ2V4IjogIl4oaHR0cHM/OlxcL1xcL1tcXC1cXHdAOiUuK34jPV0rW1xcLVxcd1xcKFxcKSFAOiUrLn4jPyZcXC89JF0qKT8kIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTIiLCAicGF0dGVybiI6ICJeKGh0dHBzPzpcXC9cXC9bXFwtXFx3QDolLit+Iz1dK1tcXC1cXHdcXChcXCkhQDolKy5+Iz8mXFwvPSRdKik/JCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiUmVkaXJlY3QgdG8iLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlJlZGlyZWN0IGEgd2hvbGUgc2l0ZSB0byBhbm90aGVyIG9uZS4ifV19LCAiUkVESVJFQ1RfVE9fUkVRVUVTVF9VUkkiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAibm8iLCAiaGVscCI6ICJBcHBlbmQgdGhlIHJlcXVlc3RlZCBVUkkgdG8gdGhlIHJlZGlyZWN0IGFkZHJlc3MuIiwgImlkIjogInJlZGlyZWN0LXRvLXJlcXVlc3QtdXJpIiwgImxhYmVsIjogIkFwcGVuZCByZXF1ZXN0IFVSSSIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xIiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgIm5hbWUiOiAiQXBwZW5kIHJlcXVlc3QgVVJJIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAibm8iLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICJubyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiQXBwZW5kIHRoZSByZXF1ZXN0ZWQgVVJJIHRvIHRoZSByZWRpcmVjdCBhZGRyZXNzLiJ9XX0sICJSRURJUkVDVF9UT19TVEFUVVNfQ09ERSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIzMDEiLCAiaGVscCI6ICJTdGF0dXMgY29kZSB0byBzZW5kIHRvIGNsaWVudCB3aGVuIHJlZGlyZWN0aW5nLiIsICJpZCI6ICJyZWRpcmVjdC10by1zdGF0dXMtY29kZSIsICJsYWJlbCI6ICJBcHBlbmQgcmVxdWVzdCBVUkkiLCAicmVnZXgiOiAiXigzMDF8MzAyKSQiLCAidHlwZSI6ICJzZWxlY3QiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0wIiwgInBhdHRlcm4iOiAiXigzMDF8MzAyKSQiLCAiaW5wVHlwZSI6ICJzZWxlY3QiLCAibmFtZSI6ICJBcHBlbmQgcmVxdWVzdCBVUkkiLCAidmFsdWVzIjogWyIzMDEiLCAiMzAyIl0sICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjMwMSIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIjMwMSIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiU3RhdHVzIGNvZGUgdG8gc2VuZCB0byBjbGllbnQgd2hlbiByZWRpcmVjdGluZy4ifV19fSwgImNoZWNrc3VtIjogbnVsbH0sIHsiaWQiOiAicmVkaXMiLCAic3RyZWFtIjogInllcyIsICJuYW1lIjogIlJlZGlzIiwgImRlc2NyaXB0aW9uIjogIlJlZGlzIHNlcnZlciBjb25maWd1cmF0aW9uIHdoZW4gdXNpbmcgQnVua2VyV2ViIGluIGNsdXN0ZXIgbW9kZS4iLCAidmVyc2lvbiI6ICIxLjAiLCAidHlwZSI6ICJjb3JlIiwgIm1ldGhvZCI6ICJtYW51YWwiLCAicGFnZSI6IHRydWUsICJzZXR0aW5ncyI6IHsiVVNFX1JFRElTIjogeyJjb250ZXh0IjogImdsb2JhbCIsICJkZWZhdWx0IjogIm5vIiwgImhlbHAiOiAiQWN0aXZhdGUgUmVkaXMuIiwgImlkIjogInVzZS1yZWRpcyIsICJsYWJlbCI6ICJBY3RpdmF0ZSBSZWRpcyIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xNCIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJuYW1lIjogIkFjdGl2YXRlIFJlZGlzIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAibm8iLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICJubyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImdsb2JlIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfZ2xvYmFsIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkFjdGl2YXRlIFJlZGlzLiJ9XX0sICJSRURJU19IT1NUIjogeyJjb250ZXh0IjogImdsb2JhbCIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIlJlZGlzIHNlcnZlciBJUCBvciBob3N0bmFtZS4iLCAiaWQiOiAicmVkaXMtaG9zdCIsICJsYWJlbCI6ICJSZWRpcyBzZXJ2ZXIiLCAicmVnZXgiOiAiXigoPyEtKVthLXpBLVowLTlcXC1dezEsNjN9KC5bYS16QS1aXXsyLH0pK3woXFxiMjVbMC01XXxcXGIyWzAtNF1cXGR8XFxiWzAxXT9cXGRcXGQ/KShcXC4oMjVbMC01XXwyWzAtNF1cXGR8WzAxXT9cXGRcXGQ/KSl7M318KChbMC05YS1mQS1GXXsxLDR9Oil7N31bMC05YS1mQS1GXXsxLDR9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw3fTp8KFswLTlhLWZBLUZdezEsNH06KXsxLDZ9OlswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDV9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDJ9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw0fSg6WzAtOWEtZkEtRl17MSw0fSl7MSwzfXwoWzAtOWEtZkEtRl17MSw0fTopezEsM30oOlswLTlhLWZBLUZdezEsNH0pezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDJ9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDV9fFswLTlhLWZBLUZdezEsNH06KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw2fSl8OigoOlswLTlhLWZBLUZdezEsNH0pezEsN318Oil8ZmU4MDooOlswLTlhLWZBLUZdWnswLDR9KXswLDR9JVswLTlhLXpBLVpdK3w6OihmZmZmKDowezEsNH0pPzopPygoMjVbMC01XXwoMlswLTRdfDE/XFxkKT9cXGQpXFwuKXszfSgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZCl8KFswLTlhLWZBLUZdezEsNH06KXsxLDR9OigoMjVbMC01XXwoMlswLTRdfDE/XFxkKT9cXGQpXFwuKXszfSgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZCkpKT8kIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTEzIiwgInBhdHRlcm4iOiAiXigoPyEtKVthLXpBLVowLTlcXC1dezEsNjN9KC5bYS16QS1aXXsyLH0pK3woXFxiMjVbMC01XXxcXGIyWzAtNF1cXGR8XFxiWzAxXT9cXGRcXGQ/KShcXC4oMjVbMC01XXwyWzAtNF1cXGR8WzAxXT9cXGRcXGQ/KSl7M318KChbMC05YS1mQS1GXXsxLDR9Oil7N31bMC05YS1mQS1GXXsxLDR9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw3fTp8KFswLTlhLWZBLUZdezEsNH06KXsxLDZ9OlswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDV9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDJ9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw0fSg6WzAtOWEtZkEtRl17MSw0fSl7MSwzfXwoWzAtOWEtZkEtRl17MSw0fTopezEsM30oOlswLTlhLWZBLUZdezEsNH0pezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDJ9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDV9fFswLTlhLWZBLUZdezEsNH06KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw2fSl8OigoOlswLTlhLWZBLUZdezEsNH0pezEsN318Oil8ZmU4MDooOlswLTlhLWZBLUZdWnswLDR9KXswLDR9JVswLTlhLXpBLVpdK3w6OihmZmZmKDowezEsNH0pPzopPygoMjVbMC01XXwoMlswLTRdfDE/XFxkKT9cXGQpXFwuKXszfSgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZCl8KFswLTlhLWZBLUZdezEsNH06KXsxLDR9OigoMjVbMC01XXwoMlswLTRdfDE/XFxkKT9cXGQpXFwuKXszfSgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZCkpKT8kIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJSZWRpcyBzZXJ2ZXIiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJnbG9iZSIsICJ0ZXh0IjogImlucF9wb3BvdmVyX2dsb2JhbCJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJSZWRpcyBzZXJ2ZXIgSVAgb3IgaG9zdG5hbWUuIn1dfSwgIlJFRElTX1BPUlQiOiB7ImNvbnRleHQiOiAiZ2xvYmFsIiwgImRlZmF1bHQiOiAiNjM3OSIsICJoZWxwIjogIlJlZGlzIHNlcnZlciBwb3J0LiIsICJpZCI6ICJyZWRpcy1wb3J0IiwgImxhYmVsIjogIlJlZGlzIHBvcnQiLCAicmVnZXgiOiAiXlswLTldKyQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotMTIiLCAicGF0dGVybiI6ICJeWzAtOV0rJCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiUmVkaXMgcG9ydCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjYzNzkiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICI2Mzc5IiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZ2xvYmUiLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9nbG9iYWwifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiUmVkaXMgc2VydmVyIHBvcnQuIn1dfSwgIlJFRElTX0RBVEFCQVNFIjogeyJjb250ZXh0IjogImdsb2JhbCIsICJkZWZhdWx0IjogIjAiLCAiaGVscCI6ICJSZWRpcyBkYXRhYmFzZSBudW1iZXIuIiwgImlkIjogInJlZGlzLWRhdGFiYXNlIiwgImxhYmVsIjogIlJlZGlzIGRhdGFiYXNlIiwgInJlZ2V4IjogIl5bMC05XSskIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTExIiwgInBhdHRlcm4iOiAiXlswLTldKyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIlJlZGlzIGRhdGFiYXNlIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiMCIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIjAiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJnbG9iZSIsICJ0ZXh0IjogImlucF9wb3BvdmVyX2dsb2JhbCJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJSZWRpcyBkYXRhYmFzZSBudW1iZXIuIn1dfSwgIlJFRElTX1NTTCI6IHsiY29udGV4dCI6ICJnbG9iYWwiLCAiZGVmYXVsdCI6ICJubyIsICJoZWxwIjogIlVzZSBTU0wvVExTIGNvbm5lY3Rpb24gd2l0aCBSZWRpcyBzZXJ2ZXIuIiwgImlkIjogInJlZGlzLXNzbCIsICJsYWJlbCI6ICJSZWRpcyBTU0wvVExTIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJjb250YWluZXJDbGFzcyI6ICJ6LTEwIiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgIm5hbWUiOiAiUmVkaXMgU1NML1RMUyIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIm5vIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAibm8iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJnbG9iZSIsICJ0ZXh0IjogImlucF9wb3BvdmVyX2dsb2JhbCJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJVc2UgU1NML1RMUyBjb25uZWN0aW9uIHdpdGggUmVkaXMgc2VydmVyLiJ9XX0sICJSRURJU19TU0xfVkVSSUZZIjogeyJjb250ZXh0IjogImdsb2JhbCIsICJkZWZhdWx0IjogIm5vIiwgImhlbHAiOiAiVmVyaWZ5IHRoZSBjZXJ0aWZpY2F0ZSBvZiBSZWRpcyBzZXJ2ZXIuIiwgImlkIjogInJlZGlzLXNzbC12ZXJpZnkiLCAibGFiZWwiOiAiUmVkaXMgU1NML1RMUyB2ZXJpZnkiLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgImNvbnRhaW5lckNsYXNzIjogInotOSIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJuYW1lIjogIlJlZGlzIFNTTC9UTFMgdmVyaWZ5IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAibm8iLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICJubyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImdsb2JlIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfZ2xvYmFsIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlZlcmlmeSB0aGUgY2VydGlmaWNhdGUgb2YgUmVkaXMgc2VydmVyLiJ9XX0sICJSRURJU19USU1FT1VUIjogeyJjb250ZXh0IjogImdsb2JhbCIsICJkZWZhdWx0IjogIjEwMDAiLCAiaGVscCI6ICJSZWRpcyBzZXJ2ZXIgdGltZW91dCAoaW4gbXMpIGZvciBjb25uZWN0LCByZWFkIGFuZCB3cml0ZS4iLCAiaWQiOiAicmVkaXMtdGltZW91dCIsICJsYWJlbCI6ICJSZWRpcyB0aW1lb3V0IChtcykiLCAicmVnZXgiOiAiXlswLTldKyQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotOCIsICJwYXR0ZXJuIjogIl5bMC05XSskIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJSZWRpcyB0aW1lb3V0IChtcykiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIxMDAwIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAiMTAwMCIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImdsb2JlIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfZ2xvYmFsIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlJlZGlzIHNlcnZlciB0aW1lb3V0IChpbiBtcykgZm9yIGNvbm5lY3QsIHJlYWQgYW5kIHdyaXRlLiJ9XX0sICJSRURJU19VU0VSTkFNRSI6IHsiY29udGV4dCI6ICJnbG9iYWwiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJSZWRpcyB1c2VybmFtZSB1c2VkIGluIEFVVEggY29tbWFuZC4iLCAiaWQiOiAicmVkaXMtdXNlcm5hbWUiLCAibGFiZWwiOiAiUmVkaXMgdXNlcm5hbWUiLCAicmVnZXgiOiAiXi4qJCIsICJ0eXBlIjogInRleHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei03IiwgInBhdHRlcm4iOiAiXi4qJCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiUmVkaXMgdXNlcm5hbWUiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJnbG9iZSIsICJ0ZXh0IjogImlucF9wb3BvdmVyX2dsb2JhbCJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJSZWRpcyB1c2VybmFtZSB1c2VkIGluIEFVVEggY29tbWFuZC4ifV19LCAiUkVESVNfUEFTU1dPUkQiOiB7ImNvbnRleHQiOiAiZ2xvYmFsIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiUmVkaXMgcGFzc3dvcmQgdXNlZCBpbiBBVVRIIGNvbW1hbmQuIiwgImlkIjogInJlZGlzLXBhc3N3b3JkIiwgImxhYmVsIjogIlJlZGlzIHBhc3N3b3JkIiwgInJlZ2V4IjogIl4uKiQiLCAidHlwZSI6ICJwYXNzd29yZCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTYiLCAicGF0dGVybiI6ICJeLiokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJSZWRpcyBwYXNzd29yZCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImdsb2JlIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfZ2xvYmFsIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlJlZGlzIHBhc3N3b3JkIHVzZWQgaW4gQVVUSCBjb21tYW5kLiJ9XX0sICJSRURJU19TRU5USU5FTF9IT1NUUyI6IHsiY29udGV4dCI6ICJnbG9iYWwiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJSZWRpcyBzZW50aW5lbCBob3N0cyB3aXRoIGZvcm1hdCBob3N0Oltwb3J0XSBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMuIiwgImlkIjogInJlZGlzLXNlbnRpbmVsLWhvc3RzIiwgImxhYmVsIjogIlJlZGlzIHNlbnRpbmVsIGhvc3RzIiwgInJlZ2V4IjogIl4uKiQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotNSIsICJwYXR0ZXJuIjogIl4uKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIlJlZGlzIHNlbnRpbmVsIGhvc3RzIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZ2xvYmUiLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9nbG9iYWwifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiUmVkaXMgc2VudGluZWwgaG9zdHMgd2l0aCBmb3JtYXQgaG9zdDpbcG9ydF0gc2VwYXJhdGVkIHdpdGggc3BhY2VzLiJ9XX0sICJSRURJU19TRU5USU5FTF9VU0VSTkFNRSI6IHsiY29udGV4dCI6ICJnbG9iYWwiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJSZWRpcyBzZW50aW5lbCB1c2VybmFtZS4iLCAiaWQiOiAicmVkaXMtc2VudGluZWwtdXNlcm5hbWUiLCAibGFiZWwiOiAiUmVkaXMgc2VudGluZWwgdXNlcm5hbWUiLCAicmVnZXgiOiAiXi4qJCIsICJ0eXBlIjogInRleHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei00IiwgInBhdHRlcm4iOiAiXi4qJCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiUmVkaXMgc2VudGluZWwgdXNlcm5hbWUiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJnbG9iZSIsICJ0ZXh0IjogImlucF9wb3BvdmVyX2dsb2JhbCJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJSZWRpcyBzZW50aW5lbCB1c2VybmFtZS4ifV19LCAiUkVESVNfU0VOVElORUxfUEFTU1dPUkQiOiB7ImNvbnRleHQiOiAiZ2xvYmFsIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiUmVkaXMgc2VudGluZWwgcGFzc3dvcmQuIiwgImlkIjogInJlZGlzLXNlbnRpbmVsLXBhc3N3b3JkIiwgImxhYmVsIjogIlJlZGlzIHNlbnRpbmVsIHBhc3N3b3JkIiwgInJlZ2V4IjogIl4uKiQiLCAidHlwZSI6ICJwYXNzd29yZCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTMiLCAicGF0dGVybiI6ICJeLiokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJSZWRpcyBzZW50aW5lbCBwYXNzd29yZCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImdsb2JlIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfZ2xvYmFsIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlJlZGlzIHNlbnRpbmVsIHBhc3N3b3JkLiJ9XX0sICJSRURJU19TRU5USU5FTF9NQVNURVIiOiB7ImNvbnRleHQiOiAiZ2xvYmFsIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiUmVkaXMgc2VudGluZWwgbWFzdGVyIG5hbWUuIiwgImlkIjogInJlZGlzLXNlbnRpbmVsLW1hc3RlciIsICJsYWJlbCI6ICJSZWRpcyBzZW50aW5lbCBtYXN0ZXIiLCAicmVnZXgiOiAiXi4qJCIsICJ0eXBlIjogInRleHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yIiwgInBhdHRlcm4iOiAiXi4qJCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiUmVkaXMgc2VudGluZWwgbWFzdGVyIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZ2xvYmUiLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9nbG9iYWwifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiUmVkaXMgc2VudGluZWwgbWFzdGVyIG5hbWUuIn1dfSwgIlJFRElTX0tFRVBBTElWRV9JRExFIjogeyJjb250ZXh0IjogImdsb2JhbCIsICJkZWZhdWx0IjogIjMwMDAwIiwgImhlbHAiOiAiTWF4IGlkbGUgdGltZSAoaW4gbXMpIGJlZm9yZSBjbG9zaW5nIHJlZGlzIGNvbm5lY3Rpb24gaW4gdGhlIHBvb2wuIiwgImlkIjogInJlZGlzLWtlZXBhbGl2ZS1pZGxlIiwgImxhYmVsIjogIlJlZGlzIGtlZXBhbGl2ZSBpZGxlIChtcykiLCAicmVnZXgiOiAiXlswLTldKyQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotMSIsICJwYXR0ZXJuIjogIl5bMC05XSskIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJSZWRpcyBrZWVwYWxpdmUgaWRsZSAobXMpIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiMzAwMDAiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICIzMDAwMCIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImdsb2JlIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfZ2xvYmFsIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIk1heCBpZGxlIHRpbWUgKGluIG1zKSBiZWZvcmUgY2xvc2luZyByZWRpcyBjb25uZWN0aW9uIGluIHRoZSBwb29sLiJ9XX0sICJSRURJU19LRUVQQUxJVkVfUE9PTCI6IHsiY29udGV4dCI6ICJnbG9iYWwiLCAiZGVmYXVsdCI6ICIxMCIsICJoZWxwIjogIk1heCBudW1iZXIgb2YgcmVkaXMgY29ubmVjdGlvbihzKSBrZXB0IGluIHRoZSBwb29sLiIsICJpZCI6ICJyZWRpcy1rZWVwYWxpdmUtcG9vbCIsICJsYWJlbCI6ICJSZWRpcyBrZWVwYWxpdmUgcG9vbCIsICJyZWdleCI6ICJeWzAtOV0rJCIsICJ0eXBlIjogInRleHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0wIiwgInBhdHRlcm4iOiAiXlswLTldKyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIlJlZGlzIGtlZXBhbGl2ZSBwb29sIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiMTAiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICIxMCIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImdsb2JlIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfZ2xvYmFsIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIk1heCBudW1iZXIgb2YgcmVkaXMgY29ubmVjdGlvbihzKSBrZXB0IGluIHRoZSBwb29sLiJ9XX19LCAiY2hlY2tzdW0iOiBudWxsfSwgeyJpZCI6ICJyZXZlcnNlcHJveHkiLCAic3RyZWFtIjogInBhcnRpYWwiLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IiwgImRlc2NyaXB0aW9uIjogIk1hbmFnZSByZXZlcnNlIHByb3h5IGNvbmZpZ3VyYXRpb25zLiIsICJ2ZXJzaW9uIjogIjEuMCIsICJ0eXBlIjogImNvcmUiLCAibWV0aG9kIjogIm1hbnVhbCIsICJwYWdlIjogZmFsc2UsICJzZXR0aW5ncyI6IHsiVVNFX1JFVkVSU0VfUFJPWFkiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAibm8iLCAiaGVscCI6ICJBY3RpdmF0ZSByZXZlcnNlIHByb3h5IG1vZGUuIiwgImlkIjogInVzZS1yZXZlcnNlLXByb3h5IiwgImxhYmVsIjogIlVzZSByZXZlcnNlIHByb3h5IiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJjb250YWluZXJDbGFzcyI6ICJ6LTI2IiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgIm5hbWUiOiAiVXNlIHJldmVyc2UgcHJveHkiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJubyIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIm5vIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJBY3RpdmF0ZSByZXZlcnNlIHByb3h5IG1vZGUuIn1dfSwgIlJFVkVSU0VfUFJPWFlfSU5URVJDRVBUX0VSUk9SUyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJ5ZXMiLCAiaGVscCI6ICJJbnRlcmNlcHQgYW5kIHJld3JpdGUgZXJyb3JzLiIsICJpZCI6ICJyZXZlcnNlLXByb3h5LWludGVyY2VwdC1lcnJvcnMiLCAibGFiZWwiOiAiSW50ZXJjZXB0IGVycm9ycyIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yNSIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJuYW1lIjogIkludGVyY2VwdCBlcnJvcnMiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJ5ZXMiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICJ5ZXMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkludGVyY2VwdCBhbmQgcmV3cml0ZSBlcnJvcnMuIn1dfSwgIlJFVkVSU0VfUFJPWFlfQ1VTVE9NX0hPU1QiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiT3ZlcnJpZGUgSG9zdCBoZWFkZXIgc2VudCB0byB1cHN0cmVhbSBzZXJ2ZXIuIiwgImlkIjogInJldmVyc2UtcHJveHktY3VzdG9tLWhvc3QiLCAibGFiZWwiOiAiUmV2ZXJzZSBwcm94eSBjdXN0b20gaG9zdCIsICJyZWdleCI6ICJeLiokIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTI0IiwgInBhdHRlcm4iOiAiXi4qJCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiUmV2ZXJzZSBwcm94eSBjdXN0b20gaG9zdCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiT3ZlcnJpZGUgSG9zdCBoZWFkZXIgc2VudCB0byB1cHN0cmVhbSBzZXJ2ZXIuIn1dfSwgIlVTRV9QUk9YWV9DQUNIRSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJubyIsICJoZWxwIjogIkVuYWJsZSBvciBkaXNhYmxlIGNhY2hpbmcgb2YgdGhlIHByb3hpZWQgcmVzb3VyY2VzLiIsICJpZCI6ICJ1c2UtcHJveHktY2FjaGUiLCAibGFiZWwiOiAiUmV2ZXJzZSBwcm94eSBjYWNoZSIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAiY29udGFpbmVyQ2xhc3MiOiAiei05IiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgIm5hbWUiOiAiUmV2ZXJzZSBwcm94eSBjYWNoZSIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIm5vIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAibm8iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkVuYWJsZSBvciBkaXNhYmxlIGNhY2hpbmcgb2YgdGhlIHByb3hpZWQgcmVzb3VyY2VzLiJ9XX0sICJQUk9YWV9DQUNIRV9QQVRIX0xFVkVMUyI6IHsiY29udGV4dCI6ICJnbG9iYWwiLCAiZGVmYXVsdCI6ICIxOjIiLCAiaGVscCI6ICJIaWVyYXJjaHkgbGV2ZWxzIG9mIHRoZSBjYWNoZS4iLCAiaWQiOiAicHJveHktY2FjaGUtcGF0aC1sZXZlbHMiLCAibGFiZWwiOiAiSGllcmFyY2h5IGxldmVscyIsICJyZWdleCI6ICJeKDo/WzEyXSl7MSwzfSQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotOCIsICJwYXR0ZXJuIjogIl4oOj9bMTJdKXsxLDN9JCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiSGllcmFyY2h5IGxldmVscyIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjE6MiIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIjE6MiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImdsb2JlIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfZ2xvYmFsIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkhpZXJhcmNoeSBsZXZlbHMgb2YgdGhlIGNhY2hlLiJ9XX0sICJQUk9YWV9DQUNIRV9QQVRIX1pPTkVfU0laRSI6IHsiY29udGV4dCI6ICJnbG9iYWwiLCAiZGVmYXVsdCI6ICIxMG0iLCAiaGVscCI6ICJNYXhpbXVtIHNpemUgb2YgY2FjaGVkIG1ldGFkYXRhIHdoZW4gY2FjaGluZyBwcm94aWVkIHJlc291cmNlcy4iLCAiaWQiOiAicHJveHktY2FjaGUtcGF0aC16b25lLXNpemUiLCAibGFiZWwiOiAiUmV2ZXJzZSBwcm94eSBjYWNoZSB6b25lIHNpemUiLCAicmVnZXgiOiAiXlxcZCtba0ttTWdHXT8kIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTciLCAicGF0dGVybiI6ICJeXFxkK1trS21NZ0ddPyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIlJldmVyc2UgcHJveHkgY2FjaGUgem9uZSBzaXplIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiMTBtIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAiMTBtIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZ2xvYmUiLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9nbG9iYWwifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTWF4aW11bSBzaXplIG9mIGNhY2hlZCBtZXRhZGF0YSB3aGVuIGNhY2hpbmcgcHJveGllZCByZXNvdXJjZXMuIn1dfSwgIlBST1hZX0NBQ0hFX1BBVEhfUEFSQU1TIjogeyJjb250ZXh0IjogImdsb2JhbCIsICJkZWZhdWx0IjogIm1heF9zaXplPTEwMG0iLCAiaGVscCI6ICJBZGRpdGlvbmFsIHBhcmFtZXRlcnMgdG8gYWRkIHRvIHRoZSBwcm94eV9jYWNoZSBkaXJlY3RpdmUuIiwgImlkIjogInByb3h5LWNhY2hlLXBhdGgtcGFyYW1zIiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkgY2FjaGUgcGFyYW1zIiwgInJlZ2V4IjogIl4uKiQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotNiIsICJwYXR0ZXJuIjogIl4uKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIlJldmVyc2UgcHJveHkgY2FjaGUgcGFyYW1zIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAibWF4X3NpemU9MTAwbSIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIm1heF9zaXplPTEwMG0iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJnbG9iZSIsICJ0ZXh0IjogImlucF9wb3BvdmVyX2dsb2JhbCJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJBZGRpdGlvbmFsIHBhcmFtZXRlcnMgdG8gYWRkIHRvIHRoZSBwcm94eV9jYWNoZSBkaXJlY3RpdmUuIn1dfSwgIlBST1hZX0NBQ0hFX01FVEhPRFMiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiR0VUIEhFQUQiLCAiaGVscCI6ICJIVFRQIG1ldGhvZHMgdGhhdCBzaG91bGQgdHJpZ2dlciBhIGNhY2hlIG9wZXJhdGlvbi4iLCAiaWQiOiAicHJveHktY2FjaGUtbWV0aG9kcyIsICJsYWJlbCI6ICJSZXZlcnNlIHByb3h5IGNhY2hlIG1ldGhvZHMiLCAicmVnZXgiOiAiXig/ISApKCA/KEdFVHxIRUFEfFBPU1R8UFVUfERFTEVURXxDT05ORUNUfE9QVElPTlN8VFJBQ0V8UEFUQ0gpKD8hLipcXDIpKSskIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTUiLCAicGF0dGVybiI6ICJeKD8hICkoID8oR0VUfEhFQUR8UE9TVHxQVVR8REVMRVRFfENPTk5FQ1R8T1BUSU9OU3xUUkFDRXxQQVRDSCkoPyEuKlxcMikpKyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIlJldmVyc2UgcHJveHkgY2FjaGUgbWV0aG9kcyIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIkdFVCBIRUFEIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAiR0VUIEhFQUQiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkhUVFAgbWV0aG9kcyB0aGF0IHNob3VsZCB0cmlnZ2VyIGEgY2FjaGUgb3BlcmF0aW9uLiJ9XX0sICJQUk9YWV9DQUNIRV9NSU5fVVNFUyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIyIiwgImhlbHAiOiAiVGhlIG1pbmltdW0gbnVtYmVyIG9mIHJlcXVlc3RzIGJlZm9yZSBhIHJlc3BvbnNlIGlzIGNhY2hlZC4iLCAiaWQiOiAicHJveHktY2FjaGUtbWluLXVzZXMiLCAibGFiZWwiOiAiUmV2ZXJzZSBwcm94eSBjYWNoZSBtaW5pbXVtIHVzZXMiLCAicmVnZXgiOiAiXlsxLTldXFxkKiQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotNCIsICJwYXR0ZXJuIjogIl5bMS05XVxcZCokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IGNhY2hlIG1pbmltdW0gdXNlcyIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjIiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICIyIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJUaGUgbWluaW11bSBudW1iZXIgb2YgcmVxdWVzdHMgYmVmb3JlIGEgcmVzcG9uc2UgaXMgY2FjaGVkLiJ9XX0sICJQUk9YWV9DQUNIRV9LRVkiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiJHNjaGVtZSRob3N0JHJlcXVlc3RfdXJpIiwgImhlbHAiOiAiVGhlIGtleSB1c2VkIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGEgY2FjaGVkIHJlc3BvbnNlLiIsICJpZCI6ICJwcm94eS1jYWNoZS1rZXkiLCAibGFiZWwiOiAiUmV2ZXJzZSBwcm94eSBjYWNoZSBrZXkiLCAicmVnZXgiOiAiXig/ISApKCA/KFxcJFthLXpfXSspKD8hLipcXDIpKSskIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTMiLCAicGF0dGVybiI6ICJeKD8hICkoID8oXFwkW2Etel9dKykoPyEuKlxcMikpKyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIlJldmVyc2UgcHJveHkgY2FjaGUga2V5IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiJHNjaGVtZSRob3N0JHJlcXVlc3RfdXJpIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAiJHNjaGVtZSRob3N0JHJlcXVlc3RfdXJpIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJUaGUga2V5IHVzZWQgdG8gdW5pcXVlbHkgaWRlbnRpZnkgYSBjYWNoZWQgcmVzcG9uc2UuIn1dfSwgIlBST1hZX0NBQ0hFX1ZBTElEIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIjIwMD0yNGggMzAxPTFoIDMwMj0yNGgiLCAiaGVscCI6ICJEZWZpbmUgdGhlIGNhY2hpbmcgdGltZSBkZXBlbmRpbmcgb24gdGhlIEhUVFAgc3RhdHVzIGNvZGUgKGxpc3Qgb2Ygc3RhdHVzPXRpbWUpLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMuIiwgImlkIjogInByb3h5LWNhY2hlLXZhbGlkIiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkgY2FjaGUgdmFsaWQiLCAicmVnZXgiOiAiXig/ISApKCA/KFsxLTVdXFxkezJ9KSg/IS4qXFwyPSk9XFxkKyhtcz98W3NoZHdNeV0pKSokIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTIiLCAicGF0dGVybiI6ICJeKD8hICkoID8oWzEtNV1cXGR7Mn0pKD8hLipcXDI9KT1cXGQrKG1zP3xbc2hkd015XSkpKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIlJldmVyc2UgcHJveHkgY2FjaGUgdmFsaWQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIyMDA9MjRoIDMwMT0xaCAzMDI9MjRoIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAiMjAwPTI0aCAzMDE9MWggMzAyPTI0aCIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiRGVmaW5lIHRoZSBjYWNoaW5nIHRpbWUgZGVwZW5kaW5nIG9uIHRoZSBIVFRQIHN0YXR1cyBjb2RlIChsaXN0IG9mIHN0YXR1cz10aW1lKSwgc2VwYXJhdGVkIHdpdGggc3BhY2VzLiJ9XX0sICJQUk9YWV9OT19DQUNIRSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIkaHR0cF9wcmFnbWEgJGh0dHBfYXV0aG9yaXphdGlvbiIsICJoZWxwIjogIkNvbmRpdGlvbnMgdG8gZGlzYWJsZSBjYWNoaW5nIG9mIHJlc3BvbnNlcy4iLCAiaWQiOiAicHJveHktbm8tY2FjaGUiLCAibGFiZWwiOiAiUmV2ZXJzZSBwcm94eSBubyBjYWNoZSIsICJyZWdleCI6ICJeLiokIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTEiLCAicGF0dGVybiI6ICJeLiokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IG5vIGNhY2hlIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiJGh0dHBfcHJhZ21hICRodHRwX2F1dGhvcml6YXRpb24iLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICIkaHR0cF9wcmFnbWEgJGh0dHBfYXV0aG9yaXphdGlvbiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiQ29uZGl0aW9ucyB0byBkaXNhYmxlIGNhY2hpbmcgb2YgcmVzcG9uc2VzLiJ9XX0sICJQUk9YWV9DQUNIRV9CWVBBU1MiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiMCIsICJoZWxwIjogIkNvbmRpdGlvbnMgdG8gYnlwYXNzIGNhY2hpbmcgb2YgcmVzcG9uc2VzLiIsICJpZCI6ICJwcm94eS1jYWNoZS1ieXBhc3MiLCAibGFiZWwiOiAiUmV2ZXJzZSBwcm94eSBieXBhc3MiLCAicmVnZXgiOiAiXi4qJCIsICJ0eXBlIjogInRleHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0wIiwgInBhdHRlcm4iOiAiXi4qJCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiUmV2ZXJzZSBwcm94eSBieXBhc3MiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIwIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAiMCIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiQ29uZGl0aW9ucyB0byBieXBhc3MgY2FjaGluZyBvZiByZXNwb25zZXMuIn1dfX0sICJjaGVja3N1bSI6IG51bGwsICJtdWx0aXBsZXNfc2NoZW1hIjogeyJyZXZlcnNlLXByb3h5IjogeyJSRVZFUlNFX1BST1hZX0hPU1QiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiRnVsbCBVUkwgb2YgdGhlIHByb3hpZWQgcmVzb3VyY2UgKHByb3h5X3Bhc3MpLiIsICJpZCI6ICJyZXZlcnNlLXByb3h5LWhvc3QiLCAibGFiZWwiOiAiUmV2ZXJzZSBwcm94eSBob3N0IiwgInJlZ2V4IjogIl4uKiQiLCAidHlwZSI6ICJ0ZXh0IiwgIm11bHRpcGxlIjogInJldmVyc2UtcHJveHkiLCAicGF0dGVybiI6ICJeLiokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IGhvc3QiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkZ1bGwgVVJMIG9mIHRoZSBwcm94aWVkIHJlc291cmNlIChwcm94eV9wYXNzKS4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTI2In0sICJSRVZFUlNFX1BST1hZX1VSTCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIvIiwgImhlbHAiOiAiTG9jYXRpb24gVVJMIHRoYXQgd2lsbCBiZSBwcm94aWVkLiIsICJpZCI6ICJyZXZlcnNlLXByb3h5LXVybCIsICJsYWJlbCI6ICJSZXZlcnNlIHByb3h5IHVybCIsICJyZWdleCI6ICJeLiokIiwgInR5cGUiOiAidGV4dCIsICJtdWx0aXBsZSI6ICJyZXZlcnNlLXByb3h5IiwgInBhdHRlcm4iOiAiXi4qJCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiUmV2ZXJzZSBwcm94eSB1cmwiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIvIiwgInByZXZfdmFsdWUiOiAiLyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTG9jYXRpb24gVVJMIHRoYXQgd2lsbCBiZSBwcm94aWVkLiJ9XSwgImNvbnRhaW5lckNsYXNzIjogInotMjUifSwgIlJFVkVSU0VfUFJPWFlfV1MiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAibm8iLCAiaGVscCI6ICJFbmFibGUgd2Vic29ja2V0IG9uIHRoZSBwcm94aWVkIHJlc291cmNlLiIsICJpZCI6ICJyZXZlcnNlLXByb3h5LXdzIiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkgV1MiLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgIm11bHRpcGxlIjogInJldmVyc2UtcHJveHkiLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IFdTIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAibm8iLCAicHJldl92YWx1ZSI6ICJubyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiRW5hYmxlIHdlYnNvY2tldCBvbiB0aGUgcHJveGllZCByZXNvdXJjZS4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTI0In0sICJSRVZFUlNFX1BST1hZX0hFQURFUlMiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiTGlzdCBvZiBIVFRQIGhlYWRlcnMgdG8gc2VuZCB0byBwcm94aWVkIHJlc291cmNlIHNlcGFyYXRlZCB3aXRoIHNlbWljb2xvbnMgKHZhbHVlcyBmb3IgcHJveHlfc2V0X2hlYWRlciBkaXJlY3RpdmUpLiIsICJpZCI6ICJyZXZlcnNlLXByb3h5LWhlYWRlcnMiLCAibGFiZWwiOiAiUmV2ZXJzZSBwcm94eSBoZWFkZXJzIiwgInJlZ2V4IjogIl4oPyFbOyBdKSg7PyA/KFtcXHdcXC1dKykoPyEuKlxcMiApIFteO10rKSokIiwgInR5cGUiOiAidGV4dCIsICJtdWx0aXBsZSI6ICJyZXZlcnNlLXByb3h5IiwgInBhdHRlcm4iOiAiXig/IVs7IF0pKDs/ID8oW1xcd1xcLV0rKSg/IS4qXFwyICkgW147XSspKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIlJldmVyc2UgcHJveHkgaGVhZGVycyIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBIVFRQIGhlYWRlcnMgdG8gc2VuZCB0byBwcm94aWVkIHJlc291cmNlIHNlcGFyYXRlZCB3aXRoIHNlbWljb2xvbnMgKHZhbHVlcyBmb3IgcHJveHlfc2V0X2hlYWRlciBkaXJlY3RpdmUpLiJ9XSwgImNvbnRhaW5lckNsYXNzIjogInotMjMifSwgIlJFVkVSU0VfUFJPWFlfSEVBREVSU19DTElFTlQiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiTGlzdCBvZiBIVFRQIGhlYWRlcnMgdG8gc2VuZCB0byBjbGllbnQgc2VwYXJhdGVkIHdpdGggc2VtaWNvbG9ucyAodmFsdWVzIGZvciBhZGRfaGVhZGVyIGRpcmVjdGl2ZSkuIiwgImlkIjogInJldmVyc2UtcHJveHktaGVhZGVycy1jbGllbnQiLCAibGFiZWwiOiAiUmV2ZXJzZSBwcm94eSBoZWFkZXJzLWNsaWVudCIsICJyZWdleCI6ICJeKD8hWzsgXSkoOz8gPyhbXFx3XFwtXSspKD8hLipcXDIgKSBbXjtdKykqJCIsICJ0eXBlIjogInRleHQiLCAibXVsdGlwbGUiOiAicmV2ZXJzZS1wcm94eSIsICJwYXR0ZXJuIjogIl4oPyFbOyBdKSg7PyA/KFtcXHdcXC1dKykoPyEuKlxcMiApIFteO10rKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IGhlYWRlcnMtY2xpZW50IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJMaXN0IG9mIEhUVFAgaGVhZGVycyB0byBzZW5kIHRvIGNsaWVudCBzZXBhcmF0ZWQgd2l0aCBzZW1pY29sb25zICh2YWx1ZXMgZm9yIGFkZF9oZWFkZXIgZGlyZWN0aXZlKS4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTIyIn0sICJSRVZFUlNFX1BST1hZX0JVRkZFUklORyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJ5ZXMiLCAiaGVscCI6ICJFbmFibGUgb3IgZGlzYWJsZSBidWZmZXJpbmcgb2YgcmVzcG9uc2VzIGZyb20gcHJveGllZCByZXNvdXJjZS4iLCAiaWQiOiAicmV2ZXJzZS1wcm94eS1idWZmZXJpbmciLCAibGFiZWwiOiAiUmV2ZXJzZSBwcm94eSBidWZmZXJpbmciLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgIm11bHRpcGxlIjogInJldmVyc2UtcHJveHkiLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IGJ1ZmZlcmluZyIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogInllcyIsICJwcmV2X3ZhbHVlIjogInllcyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiRW5hYmxlIG9yIGRpc2FibGUgYnVmZmVyaW5nIG9mIHJlc3BvbnNlcyBmcm9tIHByb3hpZWQgcmVzb3VyY2UuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yMSJ9LCAiUkVWRVJTRV9QUk9YWV9LRUVQQUxJVkUiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAibm8iLCAiaGVscCI6ICJFbmFibGUgb3IgZGlzYWJsZSBrZWVwYWxpdmUgY29ubmVjdGlvbnMgd2l0aCB0aGUgcHJveGllZCByZXNvdXJjZS4iLCAiaWQiOiAicmV2ZXJzZS1wcm94eS1rZWVwYWxpdmUiLCAibGFiZWwiOiAiUmV2ZXJzZSBwcm94eSBrZWVwYWxpdmUiLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgIm11bHRpcGxlIjogInJldmVyc2UtcHJveHkiLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IGtlZXBhbGl2ZSIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIm5vIiwgInByZXZfdmFsdWUiOiAibm8iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkVuYWJsZSBvciBkaXNhYmxlIGtlZXBhbGl2ZSBjb25uZWN0aW9ucyB3aXRoIHRoZSBwcm94aWVkIHJlc291cmNlLiJ9XSwgImNvbnRhaW5lckNsYXNzIjogInotMjAifSwgIlJFVkVSU0VfUFJPWFlfQVVUSF9SRVFVRVNUIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkVuYWJsZSBhdXRoZW50aWNhdGlvbiB1c2luZyBhbiBleHRlcm5hbCBwcm92aWRlciAodmFsdWUgb2YgYXV0aF9yZXF1ZXN0IGRpcmVjdGl2ZSkuIiwgImlkIjogInJldmVyc2UtcHJveHktYXV0aC1yZXF1ZXN0IiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkgYXV0aCByZXF1ZXN0IiwgInJlZ2V4IjogIl4oXFwvW1xcd1xcXS5+OlxcLz8jXFxbQCEkXFwmJ1xcKFxcKSorLDs9XFwtXSp8b2ZmKT8kIiwgInR5cGUiOiAidGV4dCIsICJtdWx0aXBsZSI6ICJyZXZlcnNlLXByb3h5IiwgInBhdHRlcm4iOiAiXihcXC9bXFx3XFxdLn46XFwvPyNcXFtAISRcXCYnXFwoXFwpKissOz1cXC1dKnxvZmYpPyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIlJldmVyc2UgcHJveHkgYXV0aCByZXF1ZXN0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJFbmFibGUgYXV0aGVudGljYXRpb24gdXNpbmcgYW4gZXh0ZXJuYWwgcHJvdmlkZXIgKHZhbHVlIG9mIGF1dGhfcmVxdWVzdCBkaXJlY3RpdmUpLiJ9XSwgImNvbnRhaW5lckNsYXNzIjogInotMTkifSwgIlJFVkVSU0VfUFJPWFlfQVVUSF9SRVFVRVNUX1NJR05JTl9VUkwiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiUmVkaXJlY3QgY2xpZW50cyB0byBzaWduLWluIFVSTCB3aGVuIHVzaW5nIFJFVkVSU0VfUFJPWFlfQVVUSF9SRVFVRVNUICh1c2VkIHdoZW4gYXV0aF9yZXF1ZXN0IGNhbGwgcmV0dXJuZWQgNDAxKS4iLCAiaWQiOiAicmV2ZXJzZS1wcm94eS1hdXRoLXJlcXVlc3Qtc2lnbmluLXVybCIsICJsYWJlbCI6ICJBdXRoIHJlcXVlc3Qgc2lnbmluIFVSTCIsICJyZWdleCI6ICJeKGh0dHBzPzpcXC9cXC9bXFwtXFx3QDolLit+Iz1dK1tcXC1cXHdcXChcXCkhQDolKy5+Iz8mXFwvPSRdKik/JCIsICJ0eXBlIjogInRleHQiLCAibXVsdGlwbGUiOiAicmV2ZXJzZS1wcm94eSIsICJwYXR0ZXJuIjogIl4oaHR0cHM/OlxcL1xcL1tcXC1cXHdAOiUuK34jPV0rW1xcLVxcd1xcKFxcKSFAOiUrLn4jPyZcXC89JF0qKT8kIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJBdXRoIHJlcXVlc3Qgc2lnbmluIFVSTCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiUmVkaXJlY3QgY2xpZW50cyB0byBzaWduLWluIFVSTCB3aGVuIHVzaW5nIFJFVkVSU0VfUFJPWFlfQVVUSF9SRVFVRVNUICh1c2VkIHdoZW4gYXV0aF9yZXF1ZXN0IGNhbGwgcmV0dXJuZWQgNDAxKS4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTE4In0sICJSRVZFUlNFX1BST1hZX0FVVEhfUkVRVUVTVF9TRVQiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiTGlzdCBvZiB2YXJpYWJsZXMgdG8gc2V0IGZyb20gdGhlIGF1dGhlbnRpY2F0aW9uIHByb3ZpZGVyLCBzZXBhcmF0ZWQgd2l0aCBzZW1pY29sb25zICh2YWx1ZXMgb2YgYXV0aF9yZXF1ZXN0X3NldCBkaXJlY3RpdmVzKS4iLCAiaWQiOiAicmV2ZXJzZS1wcm94eS1hdXRoLXJlcXVlc3Qtc2V0IiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkgYXV0aCByZXF1ZXN0IHNldCIsICJyZWdleCI6ICJeKD8hIDspKDs/ID8oXFwkW2Etel9cXC1dKykoPyEuKlxcMiApIFteO10rKSokIiwgInR5cGUiOiAidGV4dCIsICJtdWx0aXBsZSI6ICJyZXZlcnNlLXByb3h5IiwgInBhdHRlcm4iOiAiXig/ISA7KSg7PyA/KFxcJFthLXpfXFwtXSspKD8hLipcXDIgKSBbXjtdKykqJCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiUmV2ZXJzZSBwcm94eSBhdXRoIHJlcXVlc3Qgc2V0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJMaXN0IG9mIHZhcmlhYmxlcyB0byBzZXQgZnJvbSB0aGUgYXV0aGVudGljYXRpb24gcHJvdmlkZXIsIHNlcGFyYXRlZCB3aXRoIHNlbWljb2xvbnMgKHZhbHVlcyBvZiBhdXRoX3JlcXVlc3Rfc2V0IGRpcmVjdGl2ZXMpLiJ9XSwgImNvbnRhaW5lckNsYXNzIjogInotMTcifSwgIlJFVkVSU0VfUFJPWFlfQ09OTkVDVF9USU1FT1VUIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIjYwcyIsICJoZWxwIjogIlRpbWVvdXQgd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBwcm94aWVkIHJlc291cmNlLiIsICJpZCI6ICJyZXZlcnNlLXByb3h5LWNvbm5lY3QtdGltZW91dCIsICJsYWJlbCI6ICJSZXZlcnNlIHByb3h5IGNvbm5lY3QgdGltZW91dCIsICJyZWdleCI6ICJeXFxkKyhtcz98W3NoZHdNeV0pJCIsICJ0eXBlIjogInRleHQiLCAibXVsdGlwbGUiOiAicmV2ZXJzZS1wcm94eSIsICJwYXR0ZXJuIjogIl5cXGQrKG1zP3xbc2hkd015XSkkIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IGNvbm5lY3QgdGltZW91dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjYwcyIsICJwcmV2X3ZhbHVlIjogIjYwcyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVGltZW91dCB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlIHByb3hpZWQgcmVzb3VyY2UuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xNiJ9LCAiUkVWRVJTRV9QUk9YWV9SRUFEX1RJTUVPVVQiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiNjBzIiwgImhlbHAiOiAiVGltZW91dCB3aGVuIHJlYWRpbmcgZnJvbSB0aGUgcHJveGllZCByZXNvdXJjZS4iLCAiaWQiOiAicmV2ZXJzZS1wcm94eS1yZWFkLXRpbWVvdXQiLCAibGFiZWwiOiAiUmV2ZXJzZSBwcm94eSByZWFkIHRpbWVvdXQiLCAicmVnZXgiOiAiXlxcZCsobXM/fFtzaGR3TXldKSQiLCAidHlwZSI6ICJ0ZXh0IiwgIm11bHRpcGxlIjogInJldmVyc2UtcHJveHkiLCAicGF0dGVybiI6ICJeXFxkKyhtcz98W3NoZHdNeV0pJCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiUmV2ZXJzZSBwcm94eSByZWFkIHRpbWVvdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICI2MHMiLCAicHJldl92YWx1ZSI6ICI2MHMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlRpbWVvdXQgd2hlbiByZWFkaW5nIGZyb20gdGhlIHByb3hpZWQgcmVzb3VyY2UuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xNSJ9LCAiUkVWRVJTRV9QUk9YWV9TRU5EX1RJTUVPVVQiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiNjBzIiwgImhlbHAiOiAiVGltZW91dCB3aGVuIHNlbmRpbmcgdG8gdGhlIHByb3hpZWQgcmVzb3VyY2UuIiwgImlkIjogInJldmVyc2UtcHJveHktc2VuZC10aW1lb3V0IiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkgc2VuZCB0aW1lb3V0IiwgInJlZ2V4IjogIl5cXGQrKG1zP3xbc2hkd015XSkkIiwgInR5cGUiOiAidGV4dCIsICJtdWx0aXBsZSI6ICJyZXZlcnNlLXByb3h5IiwgInBhdHRlcm4iOiAiXlxcZCsobXM/fFtzaGR3TXldKSQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIlJldmVyc2UgcHJveHkgc2VuZCB0aW1lb3V0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiNjBzIiwgInByZXZfdmFsdWUiOiAiNjBzIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJUaW1lb3V0IHdoZW4gc2VuZGluZyB0byB0aGUgcHJveGllZCByZXNvdXJjZS4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTE0In0sICJSRVZFUlNFX1BST1hZX0lOQ0xVREVTIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiB0byBpbmNsdWRlIGluIHRoZSBsb2NhdGlvbiBibG9jaywgc2VwYXJhdGVkIHdpdGggc3BhY2VzLiIsICJpZCI6ICJyZXZlcnNlLXByb3h5LWluY2x1ZGVzIiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkgaW5jbHVkZXMiLCAicmVnZXgiOiAiXig/ISApKCA/KFxcdyspKD8hLipcXGJcXDJcXGIpKSokIiwgInR5cGUiOiAidGV4dCIsICJtdWx0aXBsZSI6ICJyZXZlcnNlLXByb3h5IiwgInBhdHRlcm4iOiAiXig/ISApKCA/KFxcdyspKD8hLipcXGJcXDJcXGIpKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IGluY2x1ZGVzIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJBZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gdG8gaW5jbHVkZSBpbiB0aGUgbG9jYXRpb24gYmxvY2ssIHNlcGFyYXRlZCB3aXRoIHNwYWNlcy4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTEzIn19fSwgIm11bHRpcGxlcyI6IHsicmV2ZXJzZS1wcm94eSI6IHsiMCI6IHsiUkVWRVJTRV9QUk9YWV9IT1NUIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkZ1bGwgVVJMIG9mIHRoZSBwcm94aWVkIHJlc291cmNlIChwcm94eV9wYXNzKS4iLCAiaWQiOiAicmV2ZXJzZS1wcm94eS1ob3N0IiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkgaG9zdCIsICJyZWdleCI6ICJeLiokIiwgInR5cGUiOiAidGV4dCIsICJtdWx0aXBsZSI6ICJyZXZlcnNlLXByb3h5IiwgInBhdHRlcm4iOiAiXi4qJCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiUmV2ZXJzZSBwcm94eSBob3N0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiZHpxIiwgInByZXZfdmFsdWUiOiAiZHpxIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJGdWxsIFVSTCBvZiB0aGUgcHJveGllZCByZXNvdXJjZSAocHJveHlfcGFzcykuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yNiIsICJtZXRob2QiOiAidWkifSwgIlJFVkVSU0VfUFJPWFlfVVJMIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIi8iLCAiaGVscCI6ICJMb2NhdGlvbiBVUkwgdGhhdCB3aWxsIGJlIHByb3hpZWQuIiwgImlkIjogInJldmVyc2UtcHJveHktdXJsIiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkgdXJsIiwgInJlZ2V4IjogIl4uKiQiLCAidHlwZSI6ICJ0ZXh0IiwgIm11bHRpcGxlIjogInJldmVyc2UtcHJveHkiLCAicGF0dGVybiI6ICJeLiokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IHVybCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIi8iLCAicHJldl92YWx1ZSI6ICIvIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJMb2NhdGlvbiBVUkwgdGhhdCB3aWxsIGJlIHByb3hpZWQuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yNSIsICJtZXRob2QiOiAiZGVmYXVsdCJ9LCAiUkVWRVJTRV9QUk9YWV9XUyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJubyIsICJoZWxwIjogIkVuYWJsZSB3ZWJzb2NrZXQgb24gdGhlIHByb3hpZWQgcmVzb3VyY2UuIiwgImlkIjogInJldmVyc2UtcHJveHktd3MiLCAibGFiZWwiOiAiUmV2ZXJzZSBwcm94eSBXUyIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAibXVsdGlwbGUiOiAicmV2ZXJzZS1wcm94eSIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJuYW1lIjogIlJldmVyc2UgcHJveHkgV1MiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICJubyIsICJwcmV2X3ZhbHVlIjogIm5vIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJFbmFibGUgd2Vic29ja2V0IG9uIHRoZSBwcm94aWVkIHJlc291cmNlLiJ9XSwgImNvbnRhaW5lckNsYXNzIjogInotMjQiLCAibWV0aG9kIjogImRlZmF1bHQifSwgIlJFVkVSU0VfUFJPWFlfSEVBREVSUyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJMaXN0IG9mIEhUVFAgaGVhZGVycyB0byBzZW5kIHRvIHByb3hpZWQgcmVzb3VyY2Ugc2VwYXJhdGVkIHdpdGggc2VtaWNvbG9ucyAodmFsdWVzIGZvciBwcm94eV9zZXRfaGVhZGVyIGRpcmVjdGl2ZSkuIiwgImlkIjogInJldmVyc2UtcHJveHktaGVhZGVycyIsICJsYWJlbCI6ICJSZXZlcnNlIHByb3h5IGhlYWRlcnMiLCAicmVnZXgiOiAiXig/IVs7IF0pKDs/ID8oW1xcd1xcLV0rKSg/IS4qXFwyICkgW147XSspKiQiLCAidHlwZSI6ICJ0ZXh0IiwgIm11bHRpcGxlIjogInJldmVyc2UtcHJveHkiLCAicGF0dGVybiI6ICJeKD8hWzsgXSkoOz8gPyhbXFx3XFwtXSspKD8hLipcXDIgKSBbXjtdKykqJCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiUmV2ZXJzZSBwcm94eSBoZWFkZXJzIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJMaXN0IG9mIEhUVFAgaGVhZGVycyB0byBzZW5kIHRvIHByb3hpZWQgcmVzb3VyY2Ugc2VwYXJhdGVkIHdpdGggc2VtaWNvbG9ucyAodmFsdWVzIGZvciBwcm94eV9zZXRfaGVhZGVyIGRpcmVjdGl2ZSkuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yMyIsICJtZXRob2QiOiAiZGVmYXVsdCJ9LCAiUkVWRVJTRV9QUk9YWV9IRUFERVJTX0NMSUVOVCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJMaXN0IG9mIEhUVFAgaGVhZGVycyB0byBzZW5kIHRvIGNsaWVudCBzZXBhcmF0ZWQgd2l0aCBzZW1pY29sb25zICh2YWx1ZXMgZm9yIGFkZF9oZWFkZXIgZGlyZWN0aXZlKS4iLCAiaWQiOiAicmV2ZXJzZS1wcm94eS1oZWFkZXJzLWNsaWVudCIsICJsYWJlbCI6ICJSZXZlcnNlIHByb3h5IGhlYWRlcnMtY2xpZW50IiwgInJlZ2V4IjogIl4oPyFbOyBdKSg7PyA/KFtcXHdcXC1dKykoPyEuKlxcMiApIFteO10rKSokIiwgInR5cGUiOiAidGV4dCIsICJtdWx0aXBsZSI6ICJyZXZlcnNlLXByb3h5IiwgInBhdHRlcm4iOiAiXig/IVs7IF0pKDs/ID8oW1xcd1xcLV0rKSg/IS4qXFwyICkgW147XSspKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIlJldmVyc2UgcHJveHkgaGVhZGVycy1jbGllbnQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkxpc3Qgb2YgSFRUUCBoZWFkZXJzIHRvIHNlbmQgdG8gY2xpZW50IHNlcGFyYXRlZCB3aXRoIHNlbWljb2xvbnMgKHZhbHVlcyBmb3IgYWRkX2hlYWRlciBkaXJlY3RpdmUpLiJ9XSwgImNvbnRhaW5lckNsYXNzIjogInotMjIiLCAibWV0aG9kIjogImRlZmF1bHQifSwgIlJFVkVSU0VfUFJPWFlfQlVGRkVSSU5HIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogInllcyIsICJoZWxwIjogIkVuYWJsZSBvciBkaXNhYmxlIGJ1ZmZlcmluZyBvZiByZXNwb25zZXMgZnJvbSBwcm94aWVkIHJlc291cmNlLiIsICJpZCI6ICJyZXZlcnNlLXByb3h5LWJ1ZmZlcmluZyIsICJsYWJlbCI6ICJSZXZlcnNlIHByb3h5IGJ1ZmZlcmluZyIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAibXVsdGlwbGUiOiAicmV2ZXJzZS1wcm94eSIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJuYW1lIjogIlJldmVyc2UgcHJveHkgYnVmZmVyaW5nIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAieWVzIiwgInByZXZfdmFsdWUiOiAieWVzIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJFbmFibGUgb3IgZGlzYWJsZSBidWZmZXJpbmcgb2YgcmVzcG9uc2VzIGZyb20gcHJveGllZCByZXNvdXJjZS4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTIxIiwgIm1ldGhvZCI6ICJkZWZhdWx0In0sICJSRVZFUlNFX1BST1hZX0tFRVBBTElWRSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJubyIsICJoZWxwIjogIkVuYWJsZSBvciBkaXNhYmxlIGtlZXBhbGl2ZSBjb25uZWN0aW9ucyB3aXRoIHRoZSBwcm94aWVkIHJlc291cmNlLiIsICJpZCI6ICJyZXZlcnNlLXByb3h5LWtlZXBhbGl2ZSIsICJsYWJlbCI6ICJSZXZlcnNlIHByb3h5IGtlZXBhbGl2ZSIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAibXVsdGlwbGUiOiAicmV2ZXJzZS1wcm94eSIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJuYW1lIjogIlJldmVyc2UgcHJveHkga2VlcGFsaXZlIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAibm8iLCAicHJldl92YWx1ZSI6ICJubyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiRW5hYmxlIG9yIGRpc2FibGUga2VlcGFsaXZlIGNvbm5lY3Rpb25zIHdpdGggdGhlIHByb3hpZWQgcmVzb3VyY2UuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yMCIsICJtZXRob2QiOiAiZGVmYXVsdCJ9LCAiUkVWRVJTRV9QUk9YWV9BVVRIX1JFUVVFU1QiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiRW5hYmxlIGF1dGhlbnRpY2F0aW9uIHVzaW5nIGFuIGV4dGVybmFsIHByb3ZpZGVyICh2YWx1ZSBvZiBhdXRoX3JlcXVlc3QgZGlyZWN0aXZlKS4iLCAiaWQiOiAicmV2ZXJzZS1wcm94eS1hdXRoLXJlcXVlc3QiLCAibGFiZWwiOiAiUmV2ZXJzZSBwcm94eSBhdXRoIHJlcXVlc3QiLCAicmVnZXgiOiAiXihcXC9bXFx3XFxdLn46XFwvPyNcXFtAISRcXCYnXFwoXFwpKissOz1cXC1dKnxvZmYpPyQiLCAidHlwZSI6ICJ0ZXh0IiwgIm11bHRpcGxlIjogInJldmVyc2UtcHJveHkiLCAicGF0dGVybiI6ICJeKFxcL1tcXHdcXF0ufjpcXC8/I1xcW0AhJFxcJidcXChcXCkqKyw7PVxcLV0qfG9mZik/JCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiUmV2ZXJzZSBwcm94eSBhdXRoIHJlcXVlc3QiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkVuYWJsZSBhdXRoZW50aWNhdGlvbiB1c2luZyBhbiBleHRlcm5hbCBwcm92aWRlciAodmFsdWUgb2YgYXV0aF9yZXF1ZXN0IGRpcmVjdGl2ZSkuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xOSIsICJtZXRob2QiOiAiZGVmYXVsdCJ9LCAiUkVWRVJTRV9QUk9YWV9BVVRIX1JFUVVFU1RfU0lHTklOX1VSTCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJSZWRpcmVjdCBjbGllbnRzIHRvIHNpZ24taW4gVVJMIHdoZW4gdXNpbmcgUkVWRVJTRV9QUk9YWV9BVVRIX1JFUVVFU1QgKHVzZWQgd2hlbiBhdXRoX3JlcXVlc3QgY2FsbCByZXR1cm5lZCA0MDEpLiIsICJpZCI6ICJyZXZlcnNlLXByb3h5LWF1dGgtcmVxdWVzdC1zaWduaW4tdXJsIiwgImxhYmVsIjogIkF1dGggcmVxdWVzdCBzaWduaW4gVVJMIiwgInJlZ2V4IjogIl4oaHR0cHM/OlxcL1xcL1tcXC1cXHdAOiUuK34jPV0rW1xcLVxcd1xcKFxcKSFAOiUrLn4jPyZcXC89JF0qKT8kIiwgInR5cGUiOiAidGV4dCIsICJtdWx0aXBsZSI6ICJyZXZlcnNlLXByb3h5IiwgInBhdHRlcm4iOiAiXihodHRwcz86XFwvXFwvW1xcLVxcd0A6JS4rfiM9XStbXFwtXFx3XFwoXFwpIUA6JSsufiM/JlxcLz0kXSopPyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIkF1dGggcmVxdWVzdCBzaWduaW4gVVJMIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJSZWRpcmVjdCBjbGllbnRzIHRvIHNpZ24taW4gVVJMIHdoZW4gdXNpbmcgUkVWRVJTRV9QUk9YWV9BVVRIX1JFUVVFU1QgKHVzZWQgd2hlbiBhdXRoX3JlcXVlc3QgY2FsbCByZXR1cm5lZCA0MDEpLiJ9XSwgImNvbnRhaW5lckNsYXNzIjogInotMTgiLCAibWV0aG9kIjogImRlZmF1bHQifSwgIlJFVkVSU0VfUFJPWFlfQVVUSF9SRVFVRVNUX1NFVCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJMaXN0IG9mIHZhcmlhYmxlcyB0byBzZXQgZnJvbSB0aGUgYXV0aGVudGljYXRpb24gcHJvdmlkZXIsIHNlcGFyYXRlZCB3aXRoIHNlbWljb2xvbnMgKHZhbHVlcyBvZiBhdXRoX3JlcXVlc3Rfc2V0IGRpcmVjdGl2ZXMpLiIsICJpZCI6ICJyZXZlcnNlLXByb3h5LWF1dGgtcmVxdWVzdC1zZXQiLCAibGFiZWwiOiAiUmV2ZXJzZSBwcm94eSBhdXRoIHJlcXVlc3Qgc2V0IiwgInJlZ2V4IjogIl4oPyEgOykoOz8gPyhcXCRbYS16X1xcLV0rKSg/IS4qXFwyICkgW147XSspKiQiLCAidHlwZSI6ICJ0ZXh0IiwgIm11bHRpcGxlIjogInJldmVyc2UtcHJveHkiLCAicGF0dGVybiI6ICJeKD8hIDspKDs/ID8oXFwkW2Etel9cXC1dKykoPyEuKlxcMiApIFteO10rKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IGF1dGggcmVxdWVzdCBzZXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkxpc3Qgb2YgdmFyaWFibGVzIHRvIHNldCBmcm9tIHRoZSBhdXRoZW50aWNhdGlvbiBwcm92aWRlciwgc2VwYXJhdGVkIHdpdGggc2VtaWNvbG9ucyAodmFsdWVzIG9mIGF1dGhfcmVxdWVzdF9zZXQgZGlyZWN0aXZlcykuIn1dLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xNyIsICJtZXRob2QiOiAiZGVmYXVsdCJ9LCAiUkVWRVJTRV9QUk9YWV9DT05ORUNUX1RJTUVPVVQiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiNjBzIiwgImhlbHAiOiAiVGltZW91dCB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlIHByb3hpZWQgcmVzb3VyY2UuIiwgImlkIjogInJldmVyc2UtcHJveHktY29ubmVjdC10aW1lb3V0IiwgImxhYmVsIjogIlJldmVyc2UgcHJveHkgY29ubmVjdCB0aW1lb3V0IiwgInJlZ2V4IjogIl5cXGQrKG1zP3xbc2hkd015XSkkIiwgInR5cGUiOiAidGV4dCIsICJtdWx0aXBsZSI6ICJyZXZlcnNlLXByb3h5IiwgInBhdHRlcm4iOiAiXlxcZCsobXM/fFtzaGR3TXldKSQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIlJldmVyc2UgcHJveHkgY29ubmVjdCB0aW1lb3V0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiNjBzIiwgInByZXZfdmFsdWUiOiAiNjBzIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJUaW1lb3V0IHdoZW4gY29ubmVjdGluZyB0byB0aGUgcHJveGllZCByZXNvdXJjZS4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTE2IiwgIm1ldGhvZCI6ICJkZWZhdWx0In0sICJSRVZFUlNFX1BST1hZX1JFQURfVElNRU9VVCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICI2MHMiLCAiaGVscCI6ICJUaW1lb3V0IHdoZW4gcmVhZGluZyBmcm9tIHRoZSBwcm94aWVkIHJlc291cmNlLiIsICJpZCI6ICJyZXZlcnNlLXByb3h5LXJlYWQtdGltZW91dCIsICJsYWJlbCI6ICJSZXZlcnNlIHByb3h5IHJlYWQgdGltZW91dCIsICJyZWdleCI6ICJeXFxkKyhtcz98W3NoZHdNeV0pJCIsICJ0eXBlIjogInRleHQiLCAibXVsdGlwbGUiOiAicmV2ZXJzZS1wcm94eSIsICJwYXR0ZXJuIjogIl5cXGQrKG1zP3xbc2hkd015XSkkIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJSZXZlcnNlIHByb3h5IHJlYWQgdGltZW91dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjYwcyIsICJwcmV2X3ZhbHVlIjogIjYwcyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiVGltZW91dCB3aGVuIHJlYWRpbmcgZnJvbSB0aGUgcHJveGllZCByZXNvdXJjZS4ifV0sICJjb250YWluZXJDbGFzcyI6ICJ6LTE1IiwgIm1ldGhvZCI6ICJkZWZhdWx0In0sICJSRVZFUlNFX1BST1hZX1NFTkRfVElNRU9VVCI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICI2MHMiLCAiaGVscCI6ICJUaW1lb3V0IHdoZW4gc2VuZGluZyB0byB0aGUgcHJveGllZCByZXNvdXJjZS4iLCAiaWQiOiAicmV2ZXJzZS1wcm94eS1zZW5kLXRpbWVvdXQiLCAibGFiZWwiOiAiUmV2ZXJzZSBwcm94eSBzZW5kIHRpbWVvdXQiLCAicmVnZXgiOiAiXlxcZCsobXM/fFtzaGR3TXldKSQiLCAidHlwZSI6ICJ0ZXh0IiwgIm11bHRpcGxlIjogInJldmVyc2UtcHJveHkiLCAicGF0dGVybiI6ICJeXFxkKyhtcz98W3NoZHdNeV0pJCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiUmV2ZXJzZSBwcm94eSBzZW5kIHRpbWVvdXQiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICI2MHMiLCAicHJldl92YWx1ZSI6ICI2MHMiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlRpbWVvdXQgd2hlbiBzZW5kaW5nIHRvIHRoZSBwcm94aWVkIHJlc291cmNlLiJ9XSwgImNvbnRhaW5lckNsYXNzIjogInotMTQiLCAibWV0aG9kIjogImRlZmF1bHQifSwgIlJFVkVSU0VfUFJPWFlfSU5DTFVERVMiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiQWRkaXRpb25hbCBjb25maWd1cmF0aW9uIHRvIGluY2x1ZGUgaW4gdGhlIGxvY2F0aW9uIGJsb2NrLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMuIiwgImlkIjogInJldmVyc2UtcHJveHktaW5jbHVkZXMiLCAibGFiZWwiOiAiUmV2ZXJzZSBwcm94eSBpbmNsdWRlcyIsICJyZWdleCI6ICJeKD8hICkoID8oXFx3KykoPyEuKlxcYlxcMlxcYikpKiQiLCAidHlwZSI6ICJ0ZXh0IiwgIm11bHRpcGxlIjogInJldmVyc2UtcHJveHkiLCAicGF0dGVybiI6ICJeKD8hICkoID8oXFx3KykoPyEuKlxcYlxcMlxcYikpKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIlJldmVyc2UgcHJveHkgaW5jbHVkZXMiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiB0byBpbmNsdWRlIGluIHRoZSBsb2NhdGlvbiBibG9jaywgc2VwYXJhdGVkIHdpdGggc3BhY2VzLiJ9XSwgImNvbnRhaW5lckNsYXNzIjogInotMTMiLCAibWV0aG9kIjogImRlZmF1bHQifX19fX0sIHsiaWQiOiAicmV2ZXJzZXNjYW4iLCAic3RyZWFtIjogInllcyIsICJuYW1lIjogIlJldmVyc2Ugc2NhbiIsICJkZXNjcmlwdGlvbiI6ICJTY2FuIGNsaWVudHMgcG9ydHMgdG8gZGV0ZWN0IHByb3hpZXMgb3Igc2VydmVycy4iLCAidmVyc2lvbiI6ICIxLjAiLCAidHlwZSI6ICJjb3JlIiwgIm1ldGhvZCI6ICJtYW51YWwiLCAicGFnZSI6IHRydWUsICJzZXR0aW5ncyI6IHsiVVNFX1JFVkVSU0VfU0NBTiI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICJubyIsICJoZWxwIjogIkVuYWJsZSBzY2FubmluZyBvZiBjbGllbnRzIHBvcnRzIGFuZCBkZW55IGFjY2VzcyBpZiBvbmUgaXMgb3BlbmVkLiIsICJpZCI6ICJ1c2UtcmV2ZXJzZS1zY2FuIiwgImxhYmVsIjogIlJldmVyc2Ugc2NhbiIsICJyZWdleCI6ICJeKG5vfHllcykkIiwgInR5cGUiOiAiY2hlY2siLCAiY29udGFpbmVyQ2xhc3MiOiAiei0yIiwgInBhdHRlcm4iOiAiXihub3x5ZXMpJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgIm5hbWUiOiAiUmV2ZXJzZSBzY2FuIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAibm8iLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICJubyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiRW5hYmxlIHNjYW5uaW5nIG9mIGNsaWVudHMgcG9ydHMgYW5kIGRlbnkgYWNjZXNzIGlmIG9uZSBpcyBvcGVuZWQuIn1dfSwgIlJFVkVSU0VfU0NBTl9QT1JUUyI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIyMiA4MCA0NDMgMzEyOCA4MDAwIDgwODAiLCAiaGVscCI6ICJMaXN0IG9mIHBvcnQgdG8gc2NhbiB3aGVuIHVzaW5nIHJldmVyc2Ugc2NhbiBmZWF0dXJlLiIsICJpZCI6ICJyZXZlcnNlLXNjYW4tcG9ydHMiLCAibGFiZWwiOiAiUmV2ZXJzZSBzY2FuIHBvcnRzIiwgInJlZ2V4IjogIl4uKiQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotMSIsICJwYXR0ZXJuIjogIl4uKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIlJldmVyc2Ugc2NhbiBwb3J0cyIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjIyIDgwIDQ0MyAzMTI4IDgwMDAgODA4MCIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIjIyIDgwIDQ0MyAzMTI4IDgwMDAgODA4MCIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBwb3J0IHRvIHNjYW4gd2hlbiB1c2luZyByZXZlcnNlIHNjYW4gZmVhdHVyZS4ifV19LCAiUkVWRVJTRV9TQ0FOX1RJTUVPVVQiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiNTAwIiwgImhlbHAiOiAiU3BlY2lmeSB0aGUgbWF4aW11bSB0aW1lb3V0IChpbiBtcykgd2hlbiBzY2FubmluZyBhIHBvcnQuIiwgImlkIjogInJldmVyc2Utc2Nhbi10aW1lb3V0IiwgImxhYmVsIjogIlJldmVyc2Ugc2NhbiB0aW1lb3V0IiwgInJlZ2V4IjogIl4uKiQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotMCIsICJwYXR0ZXJuIjogIl4uKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIlJldmVyc2Ugc2NhbiB0aW1lb3V0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiNTAwIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAiNTAwIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJTcGVjaWZ5IHRoZSBtYXhpbXVtIHRpbWVvdXQgKGluIG1zKSB3aGVuIHNjYW5uaW5nIGEgcG9ydC4ifV19fSwgImNoZWNrc3VtIjogbnVsbH0sIHsiaWQiOiAic2VsZnNpZ25lZCIsICJzdHJlYW0iOiAieWVzIiwgIm5hbWUiOiAiU2VsZi1zaWduZWQgY2VydGlmaWNhdGUiLCAiZGVzY3JpcHRpb24iOiAiR2VuZXJhdGUgc2VsZi1zaWduZWQgY2VydGlmaWNhdGUuIiwgInZlcnNpb24iOiAiMS4wIiwgInR5cGUiOiAiY29yZSIsICJtZXRob2QiOiAibWFudWFsIiwgInBhZ2UiOiBmYWxzZSwgInNldHRpbmdzIjogeyJHRU5FUkFURV9TRUxGX1NJR05FRF9TU0wiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAibm8iLCAiaGVscCI6ICJHZW5lcmF0ZSBhbmQgdXNlIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlLiIsICJpZCI6ICJnZW5lcmF0ZS1zZWxmLXNpZ25lZC1zc2wiLCAibGFiZWwiOiAiQWN0aXZhdGUgc2VsZi1zaWduZWQgY2VydGlmaWNhdGUiLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgImNvbnRhaW5lckNsYXNzIjogInotMiIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJuYW1lIjogIkFjdGl2YXRlIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAibm8iLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICJubyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiR2VuZXJhdGUgYW5kIHVzZSBzZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZS4ifV19LCAiU0VMRl9TSUdORURfU1NMX0VYUElSWSI6IHsiY29udGV4dCI6ICJtdWx0aXNpdGUiLCAiZGVmYXVsdCI6ICIzNjUiLCAiaGVscCI6ICJTZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZSBleHBpcnkgaW4gZGF5cy4iLCAiaWQiOiAic2VsZi1zaWduZWQtc3NsLWV4cGlyeSIsICJsYWJlbCI6ICJDZXJ0aWZpY2F0ZSBleHBpcnkiLCAicmVnZXgiOiAiXlxcZCskIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTEiLCAicGF0dGVybiI6ICJeXFxkKyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIkNlcnRpZmljYXRlIGV4cGlyeSIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjM2NSIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIjM2NSIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiU2VsZi1zaWduZWQgY2VydGlmaWNhdGUgZXhwaXJ5IGluIGRheXMuIn1dfSwgIlNFTEZfU0lHTkVEX1NTTF9TVUJKIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIi9DTj13d3cuZXhhbXBsZS5jb20vIiwgImhlbHAiOiAiU2VsZi1zaWduZWQgY2VydGlmaWNhdGUgc3ViamVjdC4iLCAiaWQiOiAic2VsZi1zaWduZWQtc3NsLXN1YmoiLCAibGFiZWwiOiAiQ2VydGlmaWNhdGUgc3ViamVjdCIsICJyZWdleCI6ICJeL0NOPVteLF0rJCIsICJ0eXBlIjogInRleHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei0wIiwgInBhdHRlcm4iOiAiXi9DTj1bXixdKyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIkNlcnRpZmljYXRlIHN1YmplY3QiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIvQ049d3d3LmV4YW1wbGUuY29tLyIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIi9DTj13d3cuZXhhbXBsZS5jb20vIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJTZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZSBzdWJqZWN0LiJ9XX19LCAiY2hlY2tzdW0iOiBudWxsfSwgeyJpZCI6ICJzZXNzaW9ucyIsICJzdHJlYW0iOiAieWVzIiwgIm5hbWUiOiAiU2Vzc2lvbnMiLCAiZGVzY3JpcHRpb24iOiAiTWFuYWdlbWVudCBvZiBzZXNzaW9uIHVzZWQgYnkgb3RoZXIgcGx1Z2lucy4iLCAidmVyc2lvbiI6ICIxLjAiLCAidHlwZSI6ICJjb3JlIiwgIm1ldGhvZCI6ICJtYW51YWwiLCAicGFnZSI6IGZhbHNlLCAic2V0dGluZ3MiOiB7IlNFU1NJT05TX1NFQ1JFVCI6IHsiY29udGV4dCI6ICJnbG9iYWwiLCAiZGVmYXVsdCI6ICJyYW5kb20iLCAiaGVscCI6ICJTZWNyZXQgdXNlZCB0byBlbmNyeXB0IHNlc3Npb25zIHZhcmlhYmxlcyBmb3Igc3RvcmluZyBkYXRhIHJlbGF0ZWQgdG8gY2hhbGxlbmdlcy4iLCAiaWQiOiAic2Vzc2lvbi1zZWNyZXQiLCAibGFiZWwiOiAiU2Vzc2lvbnMgc2VjcmV0IiwgInJlZ2V4IjogIl5cXHcrJCIsICJ0eXBlIjogInBhc3N3b3JkIiwgImNvbnRhaW5lckNsYXNzIjogInotNiIsICJwYXR0ZXJuIjogIl5cXHcrJCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiU2Vzc2lvbnMgc2VjcmV0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAicmFuZG9tIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAicmFuZG9tIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZ2xvYmUiLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9nbG9iYWwifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiU2VjcmV0IHVzZWQgdG8gZW5jcnlwdCBzZXNzaW9ucyB2YXJpYWJsZXMgZm9yIHN0b3JpbmcgZGF0YSByZWxhdGVkIHRvIGNoYWxsZW5nZXMuIn1dfSwgIlNFU1NJT05TX05BTUUiOiB7ImNvbnRleHQiOiAiZ2xvYmFsIiwgImRlZmF1bHQiOiAicmFuZG9tIiwgImhlbHAiOiAiTmFtZSBvZiB0aGUgY29va2llIGdpdmVuIHRvIGNsaWVudHMuIiwgImlkIjogInNlc3Npb25zLW5hbWUiLCAibGFiZWwiOiAiU2Vzc2lvbnMgbmFtZSIsICJyZWdleCI6ICJeXFx3KyQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotNSIsICJwYXR0ZXJuIjogIl5cXHcrJCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiU2Vzc2lvbnMgbmFtZSIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogInJhbmRvbSIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogInJhbmRvbSIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImdsb2JlIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfZ2xvYmFsIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIk5hbWUgb2YgdGhlIGNvb2tpZSBnaXZlbiB0byBjbGllbnRzLiJ9XX0sICJTRVNTSU9OU19JRExJTkdfVElNRU9VVCI6IHsiY29udGV4dCI6ICJnbG9iYWwiLCAiZGVmYXVsdCI6ICIxODAwIiwgImhlbHAiOiAiTWF4aW11bSB0aW1lIChpbiBzZWNvbmRzKSBvZiBpbmFjdGl2aXR5IGJlZm9yZSB0aGUgc2Vzc2lvbiBpcyBpbnZhbGlkYXRlZC4iLCAiaWQiOiAic2Vzc2lvbnMtaWRsaW5nLXRpbWVvdXQiLCAibGFiZWwiOiAiU2Vzc2lvbnMgaWRsaW5nIHRpbWVvdXQiLCAicmVnZXgiOiAiXlxcZCskIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTQiLCAicGF0dGVybiI6ICJeXFxkKyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIlNlc3Npb25zIGlkbGluZyB0aW1lb3V0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiMTgwMCIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIjE4MDAiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJnbG9iZSIsICJ0ZXh0IjogImlucF9wb3BvdmVyX2dsb2JhbCJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJNYXhpbXVtIHRpbWUgKGluIHNlY29uZHMpIG9mIGluYWN0aXZpdHkgYmVmb3JlIHRoZSBzZXNzaW9uIGlzIGludmFsaWRhdGVkLiJ9XX0sICJTRVNTSU9OU19ST0xMSU5HX1RJTUVPVVQiOiB7ImNvbnRleHQiOiAiZ2xvYmFsIiwgImRlZmF1bHQiOiAiMzYwMCIsICJoZWxwIjogIk1heGltdW0gdGltZSAoaW4gc2Vjb25kcykgYmVmb3JlIGEgc2Vzc2lvbiBtdXN0IGJlIHJlbmV3ZWQuIiwgImlkIjogInNlc3Npb25zLXJvbGxpbmctdGltZW91dCIsICJsYWJlbCI6ICJTZXNzaW9ucyByb2xsaW5nIHRpbWVvdXQiLCAicmVnZXgiOiAiXlxcZCskIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTMiLCAicGF0dGVybiI6ICJeXFxkKyQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIlNlc3Npb25zIHJvbGxpbmcgdGltZW91dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjM2MDAiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICIzNjAwIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZ2xvYmUiLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9nbG9iYWwifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTWF4aW11bSB0aW1lIChpbiBzZWNvbmRzKSBiZWZvcmUgYSBzZXNzaW9uIG11c3QgYmUgcmVuZXdlZC4ifV19LCAiU0VTU0lPTlNfQUJTT0xVVEVfVElNRU9VVCI6IHsiY29udGV4dCI6ICJnbG9iYWwiLCAiZGVmYXVsdCI6ICI4NjQwMCIsICJoZWxwIjogIk1heGltdW0gdGltZSAoaW4gc2Vjb25kcykgYmVmb3JlIGEgc2Vzc2lvbiBpcyBkZXN0cm95ZWQuIiwgImlkIjogInNlc3Npb25zLWFic29sdXRlLXRpbWVvdXQiLCAibGFiZWwiOiAiU2Vzc2lvbnMgYWJzb2x1dGUgdGltZW91dCIsICJyZWdleCI6ICJeXFxkKyQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotMiIsICJwYXR0ZXJuIjogIl5cXGQrJCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiU2Vzc2lvbnMgYWJzb2x1dGUgdGltZW91dCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIjg2NDAwIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAiODY0MDAiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJnbG9iZSIsICJ0ZXh0IjogImlucF9wb3BvdmVyX2dsb2JhbCJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJNYXhpbXVtIHRpbWUgKGluIHNlY29uZHMpIGJlZm9yZSBhIHNlc3Npb24gaXMgZGVzdHJveWVkLiJ9XX0sICJTRVNTSU9OU19DSEVDS19JUCI6IHsiY29udGV4dCI6ICJnbG9iYWwiLCAiZGVmYXVsdCI6ICJ5ZXMiLCAiaGVscCI6ICJEZXN0cm95IHNlc3Npb24gaWYgSVAgYWRkcmVzcyBpcyBkaWZmZXJlbnQgdGhhbiBvcmlnaW5hbCBvbmUuIiwgImlkIjogInNlc3Npb25zLWNoZWNrLWlwIiwgImxhYmVsIjogIlNlc3Npb25zIGNoZWNrIElQIiwgInJlZ2V4IjogIl4oeWVzfG5vKSQiLCAidHlwZSI6ICJjaGVjayIsICJjb250YWluZXJDbGFzcyI6ICJ6LTEiLCAicGF0dGVybiI6ICJeKHllc3xubykkIiwgImlucFR5cGUiOiAiY2hlY2tib3giLCAibmFtZSI6ICJTZXNzaW9ucyBjaGVjayBJUCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogInllcyIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogInllcyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImdsb2JlIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfZ2xvYmFsIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkRlc3Ryb3kgc2Vzc2lvbiBpZiBJUCBhZGRyZXNzIGlzIGRpZmZlcmVudCB0aGFuIG9yaWdpbmFsIG9uZS4ifV19LCAiU0VTU0lPTlNfQ0hFQ0tfVVNFUl9BR0VOVCI6IHsiY29udGV4dCI6ICJnbG9iYWwiLCAiZGVmYXVsdCI6ICJ5ZXMiLCAiaGVscCI6ICJEZXN0cm95IHNlc3Npb24gaWYgVXNlci1BZ2VudCBpcyBkaWZmZXJlbnQgdGhhbiBvcmlnaW5hbCBvbmUuIiwgImlkIjogInNlc3Npb25zLXVzZXItYWdlbnQiLCAibGFiZWwiOiAiU2Vzc2lvbnMgY2hlY2sgVXNlci1BZ2VudCIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAiY29udGFpbmVyQ2xhc3MiOiAiei0wIiwgInBhdHRlcm4iOiAiXih5ZXN8bm8pJCIsICJpbnBUeXBlIjogImNoZWNrYm94IiwgIm5hbWUiOiAiU2Vzc2lvbnMgY2hlY2sgVXNlci1BZ2VudCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogInllcyIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogInllcyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImdsb2JlIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfZ2xvYmFsIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkRlc3Ryb3kgc2Vzc2lvbiBpZiBVc2VyLUFnZW50IGlzIGRpZmZlcmVudCB0aGFuIG9yaWdpbmFsIG9uZS4ifV19fSwgImNoZWNrc3VtIjogbnVsbH0sIHsiaWQiOiAidWkiLCAic3RyZWFtIjogIm5vIiwgIm5hbWUiOiAiVUkiLCAiZGVzY3JpcHRpb24iOiAiSW50ZWdyYXRlIGVhc2lseSB0aGUgQnVua2VyV2ViIFVJLiIsICJ2ZXJzaW9uIjogIjEuMCIsICJ0eXBlIjogImNvcmUiLCAibWV0aG9kIjogIm1hbnVhbCIsICJwYWdlIjogZmFsc2UsICJzZXR0aW5ncyI6IHsiVVNFX1VJIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIm5vIiwgImhlbHAiOiAiVXNlIFVJIiwgImlkIjogInVzZS11aSIsICJsYWJlbCI6ICJVc2UgVUkiLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgImNvbnRhaW5lckNsYXNzIjogInotMSIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJuYW1lIjogIlVzZSBVSSIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIm5vIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAibm8iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIlVzZSBVSSJ9XX0sICJVSV9IT1NUIjogeyJjb250ZXh0IjogImdsb2JhbCIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkFkZHJlc3Mgb2YgdGhlIHdlYiBVSSB1c2VkIGZvciBpbml0aWFsIHNldHVwIiwgImlkIjogInVpLWhvc3QiLCAibGFiZWwiOiAiVUkgaG9zdCIsICJyZWdleCI6ICJeLiokIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTAiLCAicGF0dGVybiI6ICJeLiokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJVSSBob3N0IiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZ2xvYmUiLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9nbG9iYWwifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiQWRkcmVzcyBvZiB0aGUgd2ViIFVJIHVzZWQgZm9yIGluaXRpYWwgc2V0dXAifV19fSwgImNoZWNrc3VtIjogbnVsbH0sIHsiaWQiOiAid2hpdGVsaXN0IiwgInN0cmVhbSI6ICJwYXJ0aWFsIiwgIm5hbWUiOiAiV2hpdGVsaXN0IiwgImRlc2NyaXB0aW9uIjogIkFsbG93IGFjY2VzcyBiYXNlZCBvbiBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgSVAvbmV0d29yay9yRE5TL0FTTiB3aGl0ZWxpc3RzLiIsICJ2ZXJzaW9uIjogIjEuMCIsICJ0eXBlIjogImNvcmUiLCAibWV0aG9kIjogIm1hbnVhbCIsICJwYWdlIjogdHJ1ZSwgInNldHRpbmdzIjogeyJVU0VfV0hJVEVMSVNUIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogInllcyIsICJoZWxwIjogIkFjdGl2YXRlIHdoaXRlbGlzdCBmZWF0dXJlLiIsICJpZCI6ICJ1c2Utd2hpdGVsaXN0IiwgImxhYmVsIjogIkFjdGl2YXRlIHdoaXRlbGlzdGluZyIsICJyZWdleCI6ICJeKHllc3xubykkIiwgInR5cGUiOiAiY2hlY2siLCAiY29udGFpbmVyQ2xhc3MiOiAiei0xMSIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJuYW1lIjogIkFjdGl2YXRlIHdoaXRlbGlzdGluZyIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiB0cnVlLCAidmFsdWUiOiAibm8iLCAibWV0aG9kIjogInNjaGVkdWxlciIsICJwcmV2X3ZhbHVlIjogIm5vIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAidHJlc3Bhc3MiLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tZXRob2RfZGlzYWJsZWQifSwgeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkFjdGl2YXRlIHdoaXRlbGlzdCBmZWF0dXJlLiJ9XX0sICJXSElURUxJU1RfSVAiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiMjAuMTkxLjQ1LjIxMiA0MC44OC4yMS4yMzUgNDAuNzYuMTczLjE1MSA0MC43Ni4xNjMuNyAyMC4xODUuNzkuNDcgNTIuMTQyLjI2LjE3NSAyMC4xODUuNzkuMTUgNTIuMTQyLjI0LjE0OSA0MC43Ni4xNjIuMjA4IDQwLjc2LjE2My4yMyA0MC43Ni4xNjIuMTkxIDQwLjc2LjE2Mi4yNDciLCAiaGVscCI6ICJMaXN0IG9mIElQL25ldHdvcmssIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgdG8gcHV0IGludG8gdGhlIHdoaXRlbGlzdC4iLCAiaWQiOiAid2hpdGVsaXN0LWlwIiwgImxhYmVsIjogIldoaXRlbGlzdCBJUC9uZXR3b3JrIiwgInJlZ2V4IjogIl4oPyEgKSggKigoKFxcYjI1WzAtNV18XFxiMlswLTRdXFxkfFxcYlswMV0/XFxkXFxkPykoXFwuKDI1WzAtNV18MlswLTRdXFxkfFswMV0/XFxkXFxkPykpezN9KShcXC8oWzEtMl1bMC05XT98M1swLTJdP3xbMDQtOV0pKT98KChbMC05YS1mQS1GXXsxLDR9Oil7N31bMC05YS1mQS1GXXsxLDR9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw3fTp8KFswLTlhLWZBLUZdezEsNH06KXsxLDZ9OlswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDV9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDJ9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw0fSg6WzAtOWEtZkEtRl17MSw0fSl7MSwzfXwoWzAtOWEtZkEtRl17MSw0fTopezEsM30oOlswLTlhLWZBLUZdezEsNH0pezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDJ9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDV9fFswLTlhLWZBLUZdezEsNH06KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw2fSl8OigoOlswLTlhLWZBLUZdezEsNH0pezEsN318Oil8ZmU4MDooOlswLTlhLWZBLUZdWnswLDR9KXswLDR9JVswLTlhLXpBLVpdK3w6OihmZmZmKDowezEsNH0pPzopPygoMjVbMC01XXwoMlswLTRdfDE/XFxkKT9cXGQpXFwuKXszfSgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZCl8KFswLTlhLWZBLUZdezEsNH06KXsxLDR9OigoMjVbMC01XXwoMlswLTRdfDE/XFxkKT9cXGQpXFwuKXszfSgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZCkpKFxcLygxMlswLThdfDFbMDFdWzAtOV18WzAtOV1bMC05XT8pKT8pKD8hLipcXERcXDIoW15cXGRcXC9dfCQpKSAqKSokIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTEwIiwgInBhdHRlcm4iOiAiXig/ISApKCAqKCgoXFxiMjVbMC01XXxcXGIyWzAtNF1cXGR8XFxiWzAxXT9cXGRcXGQ/KShcXC4oMjVbMC01XXwyWzAtNF1cXGR8WzAxXT9cXGRcXGQ/KSl7M30pKFxcLyhbMS0yXVswLTldP3wzWzAtMl0/fFswNC05XSkpP3woKFswLTlhLWZBLUZdezEsNH06KXs3fVswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDd9OnwoWzAtOWEtZkEtRl17MSw0fTopezEsNn06WzAtOWEtZkEtRl17MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsNX0oOlswLTlhLWZBLUZdezEsNH0pezEsMn18KFswLTlhLWZBLUZdezEsNH06KXsxLDR9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDN9fChbMC05YS1mQS1GXXsxLDR9Oil7MSwzfSg6WzAtOWEtZkEtRl17MSw0fSl7MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsMn0oOlswLTlhLWZBLUZdezEsNH0pezEsNX18WzAtOWEtZkEtRl17MSw0fTooKDpbMC05YS1mQS1GXXsxLDR9KXsxLDZ9KXw6KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw3fXw6KXxmZTgwOig6WzAtOWEtZkEtRl1aezAsNH0pezAsNH0lWzAtOWEtekEtWl0rfDo6KGZmZmYoOjB7MSw0fSk/Oik/KCgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZClcXC4pezN9KDI1WzAtNV18KDJbMC00XXwxP1xcZCk/XFxkKXwoWzAtOWEtZkEtRl17MSw0fTopezEsNH06KCgyNVswLTVdfCgyWzAtNF18MT9cXGQpP1xcZClcXC4pezN9KDI1WzAtNV18KDJbMC00XXwxP1xcZCk/XFxkKSkoXFwvKDEyWzAtOF18MVswMV1bMC05XXxbMC05XVswLTldPykpPykoPyEuKlxcRFxcMihbXlxcZFxcL118JCkpICopKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIldoaXRlbGlzdCBJUC9uZXR3b3JrIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiMjAuMTkxLjQ1LjIxMiA0MC44OC4yMS4yMzUgNDAuNzYuMTczLjE1MSA0MC43Ni4xNjMuNyAyMC4xODUuNzkuNDcgNTIuMTQyLjI2LjE3NSAyMC4xODUuNzkuMTUgNTIuMTQyLjI0LjE0OSA0MC43Ni4xNjIuMjA4IDQwLjc2LjE2My4yMyA0MC43Ni4xNjIuMTkxIDQwLjc2LjE2Mi4yNDciLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICIyMC4xOTEuNDUuMjEyIDQwLjg4LjIxLjIzNSA0MC43Ni4xNzMuMTUxIDQwLjc2LjE2My43IDIwLjE4NS43OS40NyA1Mi4xNDIuMjYuMTc1IDIwLjE4NS43OS4xNSA1Mi4xNDIuMjQuMTQ5IDQwLjc2LjE2Mi4yMDggNDAuNzYuMTYzLjIzIDQwLjc2LjE2Mi4xOTEgNDAuNzYuMTYyLjI0NyIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBJUC9uZXR3b3JrLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIHRvIHB1dCBpbnRvIHRoZSB3aGl0ZWxpc3QuIn1dfSwgIldISVRFTElTVF9SRE5TIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIi5nb29nbGUuY29tIC5nb29nbGVib3QuY29tIC55YW5kZXgucnUgLnlhbmRleC5uZXQgLnlhbmRleC5jb20gLnNlYXJjaC5tc24uY29tIC5iYWlkdS5jb20gLmJhaWR1LmpwIC5jcmF3bC55YWhvby5uZXQgLmZ3ZC5saW5rZWRpbi5jb20gLnR3aXR0ZXIuY29tIC50d3R0ci5jb20gLmRpc2NvcmQuY29tIiwgImhlbHAiOiAiTGlzdCBvZiByZXZlcnNlIEROUyBzdWZmaXhlcywgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCB0byB3aGl0ZWxpc3QuIiwgImlkIjogIndoaXRlbGlzdC1yZG5zIiwgImxhYmVsIjogIldoaXRlbGlzdCByZXZlcnNlIEROUyIsICJyZWdleCI6ICJeKCAqKChbXiBdKykoPyEuKlxcMyggfCQpKSkgKikqJCIsICJ0eXBlIjogInRleHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei05IiwgInBhdHRlcm4iOiAiXiggKigoW14gXSspKD8hLipcXDMoIHwkKSkpICopKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIldoaXRlbGlzdCByZXZlcnNlIEROUyIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIi5nb29nbGUuY29tIC5nb29nbGVib3QuY29tIC55YW5kZXgucnUgLnlhbmRleC5uZXQgLnlhbmRleC5jb20gLnNlYXJjaC5tc24uY29tIC5iYWlkdS5jb20gLmJhaWR1LmpwIC5jcmF3bC55YWhvby5uZXQgLmZ3ZC5saW5rZWRpbi5jb20gLnR3aXR0ZXIuY29tIC50d3R0ci5jb20gLmRpc2NvcmQuY29tIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAiLmdvb2dsZS5jb20gLmdvb2dsZWJvdC5jb20gLnlhbmRleC5ydSAueWFuZGV4Lm5ldCAueWFuZGV4LmNvbSAuc2VhcmNoLm1zbi5jb20gLmJhaWR1LmNvbSAuYmFpZHUuanAgLmNyYXdsLnlhaG9vLm5ldCAuZndkLmxpbmtlZGluLmNvbSAudHdpdHRlci5jb20gLnR3dHRyLmNvbSAuZGlzY29yZC5jb20iLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJkaXNrIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfbXVsdGlzaXRlIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkxpc3Qgb2YgcmV2ZXJzZSBETlMgc3VmZml4ZXMsIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgdG8gd2hpdGVsaXN0LiJ9XX0sICJXSElURUxJU1RfUkROU19HTE9CQUwiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAieWVzIiwgImhlbHAiOiAiT25seSBwZXJmb3JtIFJETlMgd2hpdGVsaXN0IGNoZWNrcyBvbiBnbG9iYWwgSVAgYWRkcmVzc2VzLiIsICJpZCI6ICJ3aGl0ZWxpc3QtcmRucy1nbG9iYWwiLCAibGFiZWwiOiAiV2hpdGVsaXN0IHJldmVyc2UgRE5TIGdsb2JhbCBJUHMiLCAicmVnZXgiOiAiXih5ZXN8bm8pJCIsICJ0eXBlIjogImNoZWNrIiwgImNvbnRhaW5lckNsYXNzIjogInotOCIsICJwYXR0ZXJuIjogIl4oeWVzfG5vKSQiLCAiaW5wVHlwZSI6ICJjaGVja2JveCIsICJuYW1lIjogIldoaXRlbGlzdCByZXZlcnNlIEROUyBnbG9iYWwgSVBzIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAieWVzIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAieWVzIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJPbmx5IHBlcmZvcm0gUkROUyB3aGl0ZWxpc3QgY2hlY2tzIG9uIGdsb2JhbCBJUCBhZGRyZXNzZXMuIn1dfSwgIldISVRFTElTVF9BU04iOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiMzI5MzQiLCAiaGVscCI6ICJMaXN0IG9mIEFTTiBudW1iZXJzLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIHRvIHdoaXRlbGlzdC4iLCAiaWQiOiAid2hpdGVsaXN0LWFzbiIsICJsYWJlbCI6ICJXaGl0ZWxpc3QgQVNOIiwgInJlZ2V4IjogIl5eKCAqKChBU04/KT8oXFxkKylcXGIoPyEuKltTTiBdXFw0XFxiKSkgKikqJCIsICJ0eXBlIjogInRleHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei03IiwgInBhdHRlcm4iOiAiXl4oICooKEFTTj8pPyhcXGQrKVxcYig/IS4qW1NOIF1cXDRcXGIpKSAqKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJXaGl0ZWxpc3QgQVNOIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiMzI5MzQiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICIzMjkzNCIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBBU04gbnVtYmVycywgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCB0byB3aGl0ZWxpc3QuIn1dfSwgIldISVRFTElTVF9VU0VSX0FHRU5UIjogeyJjb250ZXh0IjogIm11bHRpc2l0ZSIsICJkZWZhdWx0IjogIiIsICJoZWxwIjogIkxpc3Qgb2YgVXNlci1BZ2VudCAoUENSRSByZWdleCksIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgdG8gd2hpdGVsaXN0LiIsICJpZCI6ICJ3aGl0ZWxpc3QtdXNlci1hZ2VudCIsICJsYWJlbCI6ICJXaGl0ZWxpc3QgVXNlci1BZ2VudCIsICJyZWdleCI6ICJeLiokIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTYiLCAicGF0dGVybiI6ICJeLiokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJXaGl0ZWxpc3QgVXNlci1BZ2VudCIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImRpc2siLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9tdWx0aXNpdGUifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBVc2VyLUFnZW50IChQQ1JFIHJlZ2V4KSwgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCB0byB3aGl0ZWxpc3QuIn1dfSwgIldISVRFTElTVF9VUkkiOiB7ImNvbnRleHQiOiAibXVsdGlzaXRlIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiTGlzdCBvZiBVUkkgKFBDUkUgcmVnZXgpLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIHRvIHdoaXRlbGlzdC4iLCAiaWQiOiAid2hpdGVsaXN0LXVyaSIsICJsYWJlbCI6ICJXaGl0ZWxpc3QgVVJJIiwgInJlZ2V4IjogIl4oICooLiopKD8hLipcXDIoPyEuKSkgKikqJCIsICJ0eXBlIjogInRleHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei01IiwgInBhdHRlcm4iOiAiXiggKiguKikoPyEuKlxcMig/IS4pKSAqKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJXaGl0ZWxpc3QgVVJJIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZGlzayIsICJ0ZXh0IjogImlucF9wb3BvdmVyX211bHRpc2l0ZSJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJMaXN0IG9mIFVSSSAoUENSRSByZWdleCksIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgdG8gd2hpdGVsaXN0LiJ9XX0sICJXSElURUxJU1RfSVBfVVJMUyI6IHsiY29udGV4dCI6ICJnbG9iYWwiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJMaXN0IG9mIFVSTHMsIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgY29udGFpbmluZyBnb29kIElQL25ldHdvcmsgdG8gd2hpdGVsaXN0LiIsICJpZCI6ICJ3aGl0ZWxpc3QtaXAtdXJscyIsICJsYWJlbCI6ICJXaGl0ZWxpc3QgSVAvbmV0d29yayBVUkxzIiwgInJlZ2V4IjogIl4oICooKGh0dHBzPzpcXC9cXC98ZmlsZTpcXC9cXC9cXC8pW1xcLVxcd0A6JS4rfiM9XStbXFwtXFx3XFwoXFwpIUA6JSsufiM/JlxcLz0kXSopKD8hLipcXDIoPyEuKSkgKikqJCIsICJ0eXBlIjogInRleHQiLCAiY29udGFpbmVyQ2xhc3MiOiAiei00IiwgInBhdHRlcm4iOiAiXiggKigoaHR0cHM/OlxcL1xcL3xmaWxlOlxcL1xcL1xcLylbXFwtXFx3QDolLit+Iz1dK1tcXC1cXHdcXChcXCkhQDolKy5+Iz8mXFwvPSRdKikoPyEuKlxcMig/IS4pKSAqKSokIiwgImlucFR5cGUiOiAiaW5wdXQiLCAibmFtZSI6ICJXaGl0ZWxpc3QgSVAvbmV0d29yayBVUkxzIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZ2xvYmUiLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9nbG9iYWwifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBVUkxzLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIGNvbnRhaW5pbmcgZ29vZCBJUC9uZXR3b3JrIHRvIHdoaXRlbGlzdC4ifV19LCAiV0hJVEVMSVNUX1JETlNfVVJMUyI6IHsiY29udGV4dCI6ICJnbG9iYWwiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJMaXN0IG9mIFVSTHMsIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgY29udGFpbmluZyByZXZlcnNlIEROUyBzdWZmaXhlcyB0byB3aGl0ZWxpc3QuIiwgImlkIjogIndoaXRlbGlzdC1yZG5zLXVybHMiLCAibGFiZWwiOiAiV2hpdGVsaXN0IHJldmVyc2UgRE5TIFVSTHMiLCAicmVnZXgiOiAiXiggKigoaHR0cHM/OlxcL1xcL3xmaWxlOlxcL1xcL1xcLylbXFwtXFx3QDolLit+Iz1dK1tcXC1cXHdcXChcXCkhQDolKy5+Iz8mXFwvPSRdKikoPyEuKlxcMig/IS4pKSAqKSokIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTMiLCAicGF0dGVybiI6ICJeKCAqKChodHRwcz86XFwvXFwvfGZpbGU6XFwvXFwvXFwvKVtcXC1cXHdAOiUuK34jPV0rW1xcLVxcd1xcKFxcKSFAOiUrLn4jPyZcXC89JF0qKSg/IS4qXFwyKD8hLikpICopKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIldoaXRlbGlzdCByZXZlcnNlIEROUyBVUkxzIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZ2xvYmUiLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9nbG9iYWwifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBVUkxzLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIGNvbnRhaW5pbmcgcmV2ZXJzZSBETlMgc3VmZml4ZXMgdG8gd2hpdGVsaXN0LiJ9XX0sICJXSElURUxJU1RfQVNOX1VSTFMiOiB7ImNvbnRleHQiOiAiZ2xvYmFsIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiTGlzdCBvZiBVUkxzLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIGNvbnRhaW5pbmcgQVNOIHRvIHdoaXRlbGlzdC4iLCAiaWQiOiAid2hpdGVsaXN0LWFzbi11cmxzIiwgImxhYmVsIjogIldoaXRlbGlzdCBBU04gVVJMcyIsICJyZWdleCI6ICJeKCAqKChodHRwcz86XFwvXFwvfGZpbGU6XFwvXFwvXFwvKVtcXC1cXHdAOiUuK34jPV0rW1xcLVxcd1xcKFxcKSFAOiUrLn4jPyZcXC89JF0qKSg/IS4qXFwyKD8hLikpICopKiQiLCAidHlwZSI6ICJ0ZXh0IiwgImNvbnRhaW5lckNsYXNzIjogInotMiIsICJwYXR0ZXJuIjogIl4oICooKGh0dHBzPzpcXC9cXC98ZmlsZTpcXC9cXC9cXC8pW1xcLVxcd0A6JS4rfiM9XStbXFwtXFx3XFwoXFwpIUA6JSsufiM/JlxcLz0kXSopKD8hLipcXDIoPyEuKSkgKikqJCIsICJpbnBUeXBlIjogImlucHV0IiwgIm5hbWUiOiAiV2hpdGVsaXN0IEFTTiBVUkxzIiwgImNvbHVtbnMiOiB7InBjIjogNCwgInRhYmxldCI6IDYsICJtb2JpbGUiOiAxMn0sICJkaXNhYmxlZCI6IGZhbHNlLCAidmFsdWUiOiAiIiwgIm1ldGhvZCI6ICJkZWZhdWx0IiwgInByZXZfdmFsdWUiOiAiIiwgInBvcG92ZXJzIjogW3siaWNvbk5hbWUiOiAiZ2xvYmUiLCAidGV4dCI6ICJpbnBfcG9wb3Zlcl9nbG9iYWwifSwgeyJpY29uTmFtZSI6ICJpbmZvIiwgInRleHQiOiAiTGlzdCBvZiBVUkxzLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIGNvbnRhaW5pbmcgQVNOIHRvIHdoaXRlbGlzdC4ifV19LCAiV0hJVEVMSVNUX1VTRVJfQUdFTlRfVVJMUyI6IHsiY29udGV4dCI6ICJnbG9iYWwiLCAiZGVmYXVsdCI6ICIiLCAiaGVscCI6ICJMaXN0IG9mIFVSTHMsIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgY29udGFpbmluZyBnb29kIFVzZXItQWdlbnQgdG8gd2hpdGVsaXN0LiIsICJpZCI6ICJ3aGl0ZWxpc3QtdXNlci1hZ2VudC11cmxzIiwgImxhYmVsIjogIldoaXRlbGlzdCBVc2VyLUFnZW50IFVSTHMiLCAicmVnZXgiOiAiXiggKigoaHR0cHM/OlxcL1xcL3xmaWxlOlxcL1xcL1xcLylbXFwtXFx3QDolLit+Iz1dK1tcXC1cXHdcXChcXCkhQDolKy5+Iz8mXFwvPSRdKikoPyEuKlxcMig/IS4pKSAqKSokIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTEiLCAicGF0dGVybiI6ICJeKCAqKChodHRwcz86XFwvXFwvfGZpbGU6XFwvXFwvXFwvKVtcXC1cXHdAOiUuK34jPV0rW1xcLVxcd1xcKFxcKSFAOiUrLn4jPyZcXC89JF0qKSg/IS4qXFwyKD8hLikpICopKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIldoaXRlbGlzdCBVc2VyLUFnZW50IFVSTHMiLCAiY29sdW1ucyI6IHsicGMiOiA0LCAidGFibGV0IjogNiwgIm1vYmlsZSI6IDEyfSwgImRpc2FibGVkIjogZmFsc2UsICJ2YWx1ZSI6ICIiLCAibWV0aG9kIjogImRlZmF1bHQiLCAicHJldl92YWx1ZSI6ICIiLCAicG9wb3ZlcnMiOiBbeyJpY29uTmFtZSI6ICJnbG9iZSIsICJ0ZXh0IjogImlucF9wb3BvdmVyX2dsb2JhbCJ9LCB7Imljb25OYW1lIjogImluZm8iLCAidGV4dCI6ICJMaXN0IG9mIFVSTHMsIHNlcGFyYXRlZCB3aXRoIHNwYWNlcywgY29udGFpbmluZyBnb29kIFVzZXItQWdlbnQgdG8gd2hpdGVsaXN0LiJ9XX0sICJXSElURUxJU1RfVVJJX1VSTFMiOiB7ImNvbnRleHQiOiAiZ2xvYmFsIiwgImRlZmF1bHQiOiAiIiwgImhlbHAiOiAiTGlzdCBvZiBVUkxzLCBzZXBhcmF0ZWQgd2l0aCBzcGFjZXMsIGNvbnRhaW5pbmcgYmFkIFVSSSB0byB3aGl0ZWxpc3QuIiwgImlkIjogIndoaXRlbGlzdC11cmktdXJscyIsICJsYWJlbCI6ICJXaGl0ZWxpc3QgVVJJIFVSTHMiLCAicmVnZXgiOiAiXiggKigoaHR0cHM/OlxcL1xcL3xmaWxlOlxcL1xcL1xcLylbXFwtXFx3QDolLit+Iz1dK1tcXC1cXHdcXChcXCkhQDolKy5+Iz8mXFwvPSRdKikoPyEuKlxcMig/IS4pKSAqKSokIiwgInR5cGUiOiAidGV4dCIsICJjb250YWluZXJDbGFzcyI6ICJ6LTAiLCAicGF0dGVybiI6ICJeKCAqKChodHRwcz86XFwvXFwvfGZpbGU6XFwvXFwvXFwvKVtcXC1cXHdAOiUuK34jPV0rW1xcLVxcd1xcKFxcKSFAOiUrLn4jPyZcXC89JF0qKSg/IS4qXFwyKD8hLikpICopKiQiLCAiaW5wVHlwZSI6ICJpbnB1dCIsICJuYW1lIjogIldoaXRlbGlzdCBVUkkgVVJMcyIsICJjb2x1bW5zIjogeyJwYyI6IDQsICJ0YWJsZXQiOiA2LCAibW9iaWxlIjogMTJ9LCAiZGlzYWJsZWQiOiBmYWxzZSwgInZhbHVlIjogIiIsICJtZXRob2QiOiAiZGVmYXVsdCIsICJwcmV2X3ZhbHVlIjogIiIsICJwb3BvdmVycyI6IFt7Imljb25OYW1lIjogImdsb2JlIiwgInRleHQiOiAiaW5wX3BvcG92ZXJfZ2xvYmFsIn0sIHsiaWNvbk5hbWUiOiAiaW5mbyIsICJ0ZXh0IjogIkxpc3Qgb2YgVVJMcywgc2VwYXJhdGVkIHdpdGggc3BhY2VzLCBjb250YWluaW5nIGJhZCBVUkkgdG8gd2hpdGVsaXN0LiJ9XX19LCAiY2hlY2tzdW0iOiBudWxsfV19LCAicmF3IjogeyJkZWZhdWx0IjogeyJNVUxUSVNJVEUiOiAieWVzIiwgIlNFUlZFUl9OQU1FIjogImFwcDEuZXhhbXBsZS5jb20gd3d3LmV4YW1wbGUuY29tIiwgIkxPR19MRVZFTCI6ICJpbmZvIiwgIkFQSV9XSElURUxJU1RfSVAiOiAiMTI3LjAuMC4wLzI0IDEwLjIwLjMwLjAvMjQiLCAiQlVOS0VSV0VCX0lOU1RBTkNFUyI6ICJidW5rZXJ3ZWIiLCAiVVNFX0JMQUNLTElTVCI6ICJubyIsICJVU0VfQlVOS0VSTkVUIjogIm5vIiwgIkNPUlNfQUxMT1dfT1JJR0lOIjogInNlbGYiLCAiQ1JPU1NfT1JJR0lOX09QRU5FUl9QT0xJQ1kiOiAic2FtZS1vcmlnaW4iLCAiQ1JPU1NfT1JJR0lOX0VNQkVEREVSX1BPTElDWSI6ICJyZXF1aXJlLWNvcnAiLCAiQ1JPU1NfT1JJR0lOX1JFU09VUkNFX1BPTElDWSI6ICJzYW1lLXNpdGUiLCAiVVNFX0NMSUVOVF9DQUNIRSI6ICJ5ZXMiLCAiVVNFX0daSVAiOiAieWVzIiwgIlJFTU9WRV9IRUFERVJTIjogIlNlcnZlciBFeHBlY3QtQ1QgWC1Qb3dlcmVkLUJ5IFgtQXNwTmV0LVZlcnNpb24gWC1Bc3BOZXRNdmMtVmVyc2lvbiBQdWJsaWMtS2V5LVBpbnMiLCAiS0VFUF9VUFNUUkVBTV9IRUFERVJTIjogIkNvbnRlbnQtU2VjdXJpdHktUG9saWN5IFBlcm1pc3Npb25zLVBvbGljeSBYLUZyYW1lLU9wdGlvbnMiLCAiU1RSSUNUX1RSQU5TUE9SVF9TRUNVUklUWSI6ICJtYXgtYWdlPTMxNTM2MDAwOyBpbmNsdWRlU3ViRG9tYWluczsgcHJlbG9hZCIsICJQRVJNSVNTSU9OU19QT0xJQ1kiOiAiYWNjZWxlcm9tZXRlcj0oKSwgYW1iaWVudC1saWdodC1zZW5zb3I9KCksIGF0dHJpYnV0aW9uLXJlcG9ydGluZz0oKSwgYXV0b3BsYXk9KCksIGJhdHRlcnk9KCksIGJsdWV0b290aD0oKSwgYnJvd3NpbmctdG9waWNzPSgpLCBjYW1lcmE9KCksIGNvbXB1dGUtcHJlc3N1cmU9KCksIGRpc3BsYXktY2FwdHVyZT0oKSwgZG9jdW1lbnQtZG9tYWluPSgpLCBlbmNyeXB0ZWQtbWVkaWE9KCksIGV4ZWN1dGlvbi13aGlsZS1ub3QtcmVuZGVyZWQ9KCksIGV4ZWN1dGlvbi13aGlsZS1vdXQtb2Ytdmlld3BvcnQ9KCksIGZ1bGxzY3JlZW49KCksIGdhbWVwYWQ9KCksIGdlb2xvY2F0aW9uPSgpLCBneXJvc2NvcGU9KCksIGhpZD0oKSwgaWRlbnRpdHktY3JlZGVudGlhbHMtZ2V0PSgpLCBpZGxlLWRldGVjdGlvbj0oKSwgbG9jYWwtZm9udHM9KCksIG1hZ25ldG9tZXRlcj0oKSwgbWljcm9waG9uZT0oKSwgbWlkaT0oKSwgb3RwLWNyZWRlbnRpYWxzPSgpLCBwYXltZW50PSgpLCBwaWN0dXJlLWluLXBpY3R1cmU9KCksIHB1YmxpY2tleS1jcmVkZW50aWFscy1jcmVhdGU9KCksIHB1YmxpY2tleS1jcmVkZW50aWFscy1nZXQ9KCksIHNjcmVlbi13YWtlLWxvY2s9KCksIHNlcmlhbD0oKSwgc3BlYWtlci1zZWxlY3Rpb249KCksIHN0b3JhZ2UtYWNjZXNzPSgpLCB1c2I9KCksIHdlYi1zaGFyZT0oKSwgd2luZG93LW1hbmFnZW1lbnQ9KCksIHhyLXNwYXRpYWwtdHJhY2tpbmc9KCkiLCAiRElTQUJMRV9ERUZBVUxUX1NFUlZFUiI6ICJ5ZXMiLCAiU0VSVkVfRklMRVMiOiAibm8iLCAiU0VORF9BTk9OWU1PVVNfUkVQT1JUIjogIm5vIiwgIk1PRFNFQ1VSSVRZX0NSU19WRVJTSU9OIjogIjQiLCAiUkVWRVJTRV9QUk9YWV9IT1NUIjogImR6cSIsICJVU0VfV0hJVEVMSVNUIjogIm5vIn19fX19XX1d diff --git a/src/ui/client/tests/home.json b/src/ui/client/tests/home.json deleted file mode 100644 index 0cc154e0c..000000000 --- a/src/ui/client/tests/home.json +++ /dev/null @@ -1,107 +0,0 @@ -[ - { - "type": "card", - "link": "https://panel.bunkerweb.io/?utm_campaign=self&utm_source=ui#pro", - "containerColumns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "widgets": [ - { - "type": "Stat", - "data": { - "title": "home_version", - "subtitle": "home_upgrade_to_pro", - "subtitleColor": "warning", - "stat": "home_free", - "iconName": "key" - } - } - ] - }, - { - "type": "card", - "link": "https://github.com/bunkerity/bunkerweb", - "containerColumns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "widgets": [ - { - "type": "Stat", - "data": { - "title": "home_version_number", - "subtitle": "home_update_available", - "subtitleColor": "warning", - "stat": "1.5.8", - "iconName": "wire" - } - } - ] - }, - { - "type": "card", - "link": "/instances", - "containerColumns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "widgets": [ - { - "type": "Stat", - "data": { - "title": "home_instances", - "subtitle": "home_total_number", - "subtitleColor": "info", - "stat": 1, - "iconName": "box" - } - } - ] - }, - { - "type": "card", - "link": "/services", - "containerColumns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "widgets": [ - { - "type": "Stat", - "data": { - "title": "home_services", - "subtitle": "home_all_methods_included", - "subtitleColor": "info", - "stat": 2, - "iconName": "disk" - } - } - ] - }, - { - "type": "card", - "link": "/plugins", - "containerColumns": { - "pc": 4, - "tablet": 6, - "mobile": 12 - }, - "widgets": [ - { - "type": "Stat", - "data": { - "title": "home_plugins", - "subtitle": "home_no_error", - "subtitleColor": "success", - "stat": "42", - "iconName": "puzzle" - } - } - ] - } -] diff --git a/src/ui/client/tests/home.py b/src/ui/client/tests/home.py deleted file mode 100644 index 4d09c1611..000000000 --- a/src/ui/client/tests/home.py +++ /dev/null @@ -1,99 +0,0 @@ -import json -import base64 - -home = [ - { - "type": "card", - "link": "https://panel.bunkerweb.io/?utm_campaign=self&utm_source=ui#pro", - "containerColumns": {"pc": 4, "tablet": 6, "mobile": 12}, - "widgets": [ - { - "type": "Stat", - "data": { - "title": "home_version", - "subtitle": "home_upgrade_to_pro", - "subtitleColor": "warning", - "stat": "home_free", - "iconName": "key", - }, - } - ], - }, - { - "type": "card", - "link": "https://github.com/bunkerity/bunkerweb", - "containerColumns": {"pc": 4, "tablet": 6, "mobile": 12}, - "widgets": [ - { - "type": "Stat", - "data": { - "title": "home_version_number", - "subtitle": "home_update_available", - "subtitleColor": "warning", - "stat": "1.5.8", - "iconName": "wire", - }, - } - ], - }, - { - "type": "card", - "link": "/instances", - "containerColumns": {"pc": 4, "tablet": 6, "mobile": 12}, - "widgets": [ - { - "type": "Stat", - "data": { - "title": "home_instances", - "subtitle": "home_total_number", - "subtitleColor": "info", - "stat": 1, - "iconName": "box", - }, - } - ], - }, - { - "type": "card", - "link": "/services", - "containerColumns": {"pc": 4, "tablet": 6, "mobile": 12}, - "widgets": [ - { - "type": "Stat", - "data": { - "title": "home_services", - "subtitle": "home_all_methods_included", - "subtitleColor": "info", - "stat": 2, - "iconName": "disk", - }, - } - ], - }, - { - "type": "card", - "link": "/plugins", - "containerColumns": {"pc": 4, "tablet": 6, "mobile": 12}, - "widgets": [ - { - "type": "Stat", - "data": { - "title": "home_plugins", - "subtitle": "home_no_error", - "subtitleColor": "success", - "stat": "42", - "iconName": "puzzle", - }, - } - ], - }, -] - -# store on a file -with open("home.json", "w") as f: - json.dump(home, f, indent=4) -output_base64_bytes = base64.b64encode(bytes(json.dumps(home), "utf-8")) -output_base64_string = output_base64_bytes.decode("ascii") - -with open("home.txt", "w") as f: - f.write(output_base64_string) diff --git a/src/ui/client/tests/instances.py b/src/ui/client/tests/instances.py deleted file mode 100644 index 9be4c1024..000000000 --- a/src/ui/client/tests/instances.py +++ /dev/null @@ -1,33 +0,0 @@ -import json -import base64 - -from builder.instances import instances_builder - - -# Create instance class using keys from the instances list -class Instance: - def __init__(self, _type, health, _id, hostname, name): - self._type = _type - self.health = health - self._id = _id - self.hostname = hostname - self.name = name - - -instances = [ - Instance("manual", True, "bunkerweb", "bunkerweb", "bunkerweb"), - Instance("manual", True, "bunkerweb", "bunkerweb", "bunkerweb"), -] - - -builder = instances_builder(instances) - -# store on a file -with open("instances.json", "w") as f: - json.dump(builder, f) - -output_base64_bytes = base64.b64encode(bytes(json.dumps(builder), "utf-8")) -output_base64_string = output_base64_bytes.decode("ascii") - -with open("instances.txt", "w") as f: - f.write(output_base64_string) diff --git a/src/ui/client/tests/jobs.py b/src/ui/client/tests/jobs.py deleted file mode 100644 index f38dd4b19..000000000 --- a/src/ui/client/tests/jobs.py +++ /dev/null @@ -1,226 +0,0 @@ -import json -import base64 - -from builder.jobs import jobs_builder - - -jobs = { - "anonymous-report": { - "plugin_id": "misc", - "every": "day", - "reload": False, - "history": [{"start_date": "07/08/2024, 01:10:03 PM", "end_date": "07/08/2024, 01:10:04 PM", "success": True}], - "cache": [], - }, - "backup-data": { - "plugin_id": "backup", - "every": "day", - "reload": False, - "history": [{"start_date": "07/08/2024, 01:10:02 PM", "end_date": "07/08/2024, 01:10:03 PM", "success": True}], - "cache": [], - }, - "blacklist-download": { - "plugin_id": "blacklist", - "every": "hour", - "reload": True, - "history": [{"start_date": "07/08/2024, 01:10:01 PM", "end_date": "07/08/2024, 01:10:02 PM", "success": True}], - "cache": [], - }, - "bunkernet-data": { - "plugin_id": "bunkernet", - "every": "day", - "reload": True, - "history": [{"start_date": "07/08/2024, 01:10:02 PM", "end_date": "07/08/2024, 01:10:03 PM", "success": True}], - "cache": [], - }, - "bunkernet-register": { - "plugin_id": "bunkernet", - "every": "hour", - "reload": True, - "history": [{"start_date": "07/08/2024, 01:10:02 PM", "end_date": "07/08/2024, 01:10:02 PM", "success": True}], - "cache": [], - }, - "certbot-new": { - "plugin_id": "letsencrypt", - "every": "once", - "reload": False, - "history": [{"start_date": "07/08/2024, 01:10:02 PM", "end_date": "07/08/2024, 01:10:03 PM", "success": True}], - "cache": [], - }, - "certbot-renew": { - "plugin_id": "letsencrypt", - "every": "day", - "reload": True, - "history": [{"start_date": "07/08/2024, 01:10:03 PM", "end_date": "07/08/2024, 01:10:03 PM", "success": True}], - "cache": [], - }, - "cleanup-excess-jobs-runs": { - "plugin_id": "db", - "every": "day", - "reload": False, - "history": [{"start_date": "07/08/2024, 01:10:02 PM", "end_date": "07/08/2024, 01:10:03 PM", "success": True}], - "cache": [], - }, - "coreruleset-nightly": { - "plugin_id": "modsecurity", - "every": "day", - "reload": True, - "history": [{"start_date": "07/08/2024, 01:10:01 PM", "end_date": "07/08/2024, 01:10:03 PM", "success": True}], - "cache": [], - }, - "custom-cert": { - "plugin_id": "customcert", - "every": "day", - "reload": True, - "history": [{"start_date": "07/08/2024, 01:10:02 PM", "end_date": "07/08/2024, 01:10:03 PM", "success": True}], - "cache": [], - }, - "default-server-cert": { - "plugin_id": "misc", - "every": "once", - "reload": False, - "history": [{"start_date": "07/08/2024, 01:10:02 PM", "end_date": "07/08/2024, 01:10:03 PM", "success": True}], - "cache": [ - { - "service_id": None, - "file_name": "default-server-cert.pem", - "last_update": "07/08/2024, 01:10:03 PM", - "checksum": "203da9e16dabe522a3080c3b9efc5c2dc8054f47e98d995fe1812f4c498b4feb519ef080b7dfeaba0095c1393793815c23f22072daf5703b02762504b211db20", - }, - { - "service_id": None, - "file_name": "default-server-cert.key", - "last_update": "07/08/2024, 01:10:03 PM", - "checksum": "7f86b1fffb8fe2011365d76e5a0955344a03c3bdb7b04aff13f8ad5b6178804290c0cd6c8f29dda9e981e3193cf5acda2a92f72312d514514305b8485667d573", - }, - ], - }, - "download-crs-plugins": { - "plugin_id": "modsecurity", - "every": "day", - "reload": True, - "history": [{"start_date": "07/08/2024, 01:10:03 PM", "end_date": "07/08/2024, 01:10:03 PM", "success": True}], - "cache": [], - }, - "download-plugins": { - "plugin_id": "misc", - "every": "once", - "reload": False, - "history": [ - {"start_date": "07/08/2024, 01:10:04 PM", "end_date": "07/08/2024, 01:10:05 PM", "success": True}, - {"start_date": "07/08/2024, 01:09:59 PM", "end_date": "07/08/2024, 01:10:00 PM", "success": True}, - ], - "cache": [], - }, - "download-pro-plugins": { - "plugin_id": "pro", - "every": "day", - "reload": True, - "history": [ - {"start_date": "07/08/2024, 01:10:02 PM", "end_date": "07/08/2024, 01:10:04 PM", "success": True}, - {"start_date": "07/08/2024, 01:10:00 PM", "end_date": "07/08/2024, 01:10:01 PM", "success": False}, - ], - "cache": [], - }, - "failover-backup": { - "plugin_id": "jobs", - "every": "once", - "reload": False, - "history": [{"start_date": "07/08/2024, 01:10:07 PM", "end_date": "07/08/2024, 01:10:08 PM", "success": True}], - "cache": [ - { - "service_id": None, - "file_name": "folder:/var/tmp/bunkerweb/failover.tgz", - "last_update": "07/08/2024, 01:10:14 PM", - "checksum": "d22a7a696d4b44bcef6a3ac06b2d7e2b2de128243000f58202c0e82b0bf54510ade7329eca14ca478a28d46201410ea1fd8002349b7b9aa51dd0d07d2fb2f51e", - } - ], - }, - "greylist-download": { - "plugin_id": "greylist", - "every": "hour", - "reload": True, - "history": [{"start_date": "07/08/2024, 01:10:02 PM", "end_date": "07/08/2024, 01:10:03 PM", "success": True}], - "cache": [], - }, - "mmdb-asn": { - "plugin_id": "jobs", - "every": "day", - "reload": True, - "history": [{"start_date": "07/08/2024, 01:10:04 PM", "end_date": "07/08/2024, 01:10:06 PM", "success": True}], - "cache": [ - { - "service_id": None, - "file_name": "asn.mmdb", - "last_update": "07/08/2024, 01:10:05 PM", - "checksum": "0beed65a84e63cf5dd6753ecc1aa6399dddaf5eb24fb22839f4cd72cbc9805cddf72be068649d111a3c21e2ac7de4a6f930c859286a25a7e937da017406d2596", - } - ], - }, - "mmdb-country": { - "plugin_id": "jobs", - "every": "day", - "reload": True, - "history": [{"start_date": "07/08/2024, 01:10:02 PM", "end_date": "07/08/2024, 01:10:04 PM", "success": True}], - "cache": [ - { - "service_id": None, - "file_name": "country.mmdb", - "last_update": "07/08/2024, 01:10:03 PM", - "checksum": "5f0d2e2c92840747886924adc1e6ff3668882990e0cd8a4d60750fe1bddb66c3e175c8717d073b48ebda41cce4c505d434dc2a6a469823fcd41c62c4f875b212", - } - ], - }, - "realip-download": { - "plugin_id": "realip", - "every": "hour", - "reload": True, - "history": [{"start_date": "07/08/2024, 01:10:02 PM", "end_date": "07/08/2024, 01:10:03 PM", "success": True}], - "cache": [], - }, - "self-signed": { - "plugin_id": "selfsigned", - "every": "day", - "reload": True, - "history": [{"start_date": "07/08/2024, 01:10:02 PM", "end_date": "07/08/2024, 01:10:03 PM", "success": True}], - "cache": [ - { - "service_id": "www.example.com", - "file_name": "cert.pem", - "last_update": "07/08/2024, 01:10:03 PM", - "checksum": "fc33700719f6a58336e3c3b735ad3fdf0b15ebd0afbe6b4a3b02a4a92e0ab4f1761409a7a1d1ca965d59b4196a81c1d150a12ae0170f7bb3a1bc7cf02300fbe9", - }, - { - "service_id": "www.example.com", - "file_name": "key.pem", - "last_update": "07/08/2024, 01:10:03 PM", - "checksum": "0e6eee34ab7b2a41cb21e49ebd35ce29a1b8d12b55aad3911b6357c73792eef7084fbb4eeba8bff73eb7a8789b5f486f6edb6d4b1c38a54bd0dcee1bf438f23d", - }, - ], - }, - "update-check": { - "plugin_id": "jobs", - "every": "day", - "reload": False, - "history": [{"start_date": "07/08/2024, 01:10:06 PM", "end_date": "07/08/2024, 01:10:07 PM", "success": True}], - "cache": [], - }, - "whitelist-download": { - "plugin_id": "whitelist", - "every": "hour", - "reload": True, - "history": [{"start_date": "07/08/2024, 01:10:02 PM", "end_date": "07/08/2024, 01:10:02 PM", "success": True}], - "cache": [], - }, -} - -output = jobs_builder(jobs) - -# store on a file -with open("jobs.json", "w") as f: - json.dump(output, f, indent=4) -output_base64_bytes = base64.b64encode(bytes(json.dumps(output), "utf-8")) -output_base64_string = output_base64_bytes.decode("ascii") - -with open("jobs.txt", "w") as f: - f.write(output_base64_string) diff --git a/src/ui/client/tests/logs.py b/src/ui/client/tests/logs.py deleted file mode 100644 index bc4b0fd44..000000000 --- a/src/ui/client/tests/logs.py +++ /dev/null @@ -1,17 +0,0 @@ -import json -import base64 - -from builder.logs import logs_builder - -files = ["file1", "file2"] -current_file = "" -raw_data = "gefesfesfsefes" -output = logs_builder(files, current_file, raw_data) - -with open("logs.json", "w") as f: - json.dump(output, f, indent=4) - -output_base64_bytes = base64.b64encode(bytes(json.dumps(output), "utf-8")) -output_base64_string = output_base64_bytes.decode("ascii") -with open("logs.txt", "w") as f: - f.write(output_base64_string) diff --git a/src/ui/client/tests/services.py b/src/ui/client/tests/services.py deleted file mode 100644 index 2128f9e7d..000000000 --- a/src/ui/client/tests/services.py +++ /dev/null @@ -1,46 +0,0 @@ -import json -import base64 -from typing import Union - -from builder.services import services_builder - -services = [ - { - "USE_REVERSE_PROXY": {"value": "yes", "method": "scheduler", "global": False}, - "IS_DRAFT": {"value": "no", "method": "default", "global": False}, - "SERVE_FILES": {"value": "no", "method": "scheduler", "global": True}, - "REMOTE_PHP": {"value": "", "method": "default", "global": True}, - "AUTO_LETS_ENCRYPT": {"value": "no", "method": "default", "global": True}, - "USE_CUSTOM_SSL": {"value": "no", "method": "default", "global": True}, - "USE_MODSECURITY": {"value": "yes", "method": "default", "global": True}, - "USE_BAD_BEHAVIOR": {"value": "yes", "method": "default", "global": True}, - "USE_LIMIT_REQ": {"value": "yes", "method": "default", "global": True}, - "USE_DNSBL": {"value": "yes", "method": "default", "global": True}, - "SERVER_NAME": {"value": "app1.example.com", "method": "scheduler", "global": False}, - }, - { - "USE_REVERSE_PROXY": {"value": "yes", "method": "scheduler", "global": False}, - "IS_DRAFT": {"value": "yes", "method": "default", "global": False}, - "SERVE_FILES": {"value": "no", "method": "scheduler", "global": True}, - "REMOTE_PHP": {"value": "", "method": "default", "global": True}, - "AUTO_LETS_ENCRYPT": {"value": "no", "method": "default", "global": True}, - "USE_CUSTOM_SSL": {"value": "no", "method": "default", "global": True}, - "USE_MODSECURITY": {"value": "yes", "method": "default", "global": True}, - "USE_BAD_BEHAVIOR": {"value": "yes", "method": "default", "global": True}, - "USE_LIMIT_REQ": {"value": "yes", "method": "default", "global": True}, - "USE_DNSBL": {"value": "yes", "method": "default", "global": True}, - "SERVER_NAME": {"value": "www.example.com", "method": "ui", "global": False}, - }, -] - - -output = services_builder(services) - -# store on a file -with open("services.json", "w") as f: - json.dump(output, f, indent=4) -output_base64_bytes = base64.b64encode(bytes(json.dumps(output), "utf-8")) -output_base64_string = output_base64_bytes.decode("ascii") - -with open("services.txt", "w") as f: - f.write(output_base64_string) diff --git a/src/ui/client/widgets_generator.py b/src/ui/client/widgets_generator.py index feb4f9f4b..fb65c68ce 100644 --- a/src/ui/client/widgets_generator.py +++ b/src/ui/client/widgets_generator.py @@ -1,4 +1,4 @@ -from os import cpu_count +from os import cpu_count, getpid from os.path import abspath from pathlib import Path from threading import Semaphore, Thread @@ -73,15 +73,23 @@ def js2md(): def convert_json_to_md(file: Path): semaphore.acquire() - # Run the command - output = run_command(["documentation", "build", file.as_posix(), "-f", "md"], with_output=True) - if output == 1: - print("Error while running command", flush=True) - exit(1) + print(f"Acquiring Semaphore for: {getpid()} (file {file})", flush=True) + try: + # Run the command + output = run_command(["documentation", "build", file.as_posix(), "-f", "md"], with_output=True) + if output == 1: + print("Error while running command", flush=True) + exit(1) - # Create a new file with the same name but with .md extension - file.with_suffix(".md").write_text(output) - semaphore.release() + # Create a new file with the same name but with .md extension + file.with_suffix(".md").write_text(output) + except BaseException: + print(format_exc(), flush=True) + print("Error while running documentation", str(file.name), flush=True) + exit(1) + finally: + print(f"Releasing Semaphore for: {getpid()} (file {file})", flush=True) + semaphore.release() threads = [] # Create a markdown file for each JS file