diff --git a/cli/commands.c b/cli/commands.c index 501246ed..6dcea998 100644 --- a/cli/commands.c +++ b/cli/commands.c @@ -1479,8 +1479,11 @@ cmd_knownhosts(const char *arg, char **UNUSED(tmp_config_file)) goto cleanup; } + opts.knownhosts_mode = knownhosts_mode; nc_client_ssh_set_knownhosts_mode(knownhosts_mode); nc_client_ssh_ch_set_knownhosts_mode(knownhosts_mode); + + store_config(); goto cleanup; } diff --git a/cli/configuration.c b/cli/configuration.c index a5c94ee7..b14619b7 100644 --- a/cli/configuration.c +++ b/cli/configuration.c @@ -38,6 +38,7 @@ #include "compat.h" #include "configuration.h" #include "linenoise/linenoise.h" +#include "netopeer2_cli_yang.h" struct cli_opts opts = {.output_format = LYD_XML}; @@ -251,16 +252,45 @@ store_history(void) free(history_file); } +static void +load_auth_pref(struct lyd_node *match, int auth_pref_type) +{ + uint16_t pref_value; + + if (!strcmp(lyd_get_value(match), "disabled")) { + pref_value = -1; + } else { + pref_value = strtoul(lyd_get_value(match), NULL, 10); + } + nc_client_ssh_set_auth_pref(auth_pref_type, pref_value); +} + +static void +str2knownhosts_mode(const char *mode_str, NC_SSH_KNOWNHOSTS_MODE *mode) +{ + if (!strcmp(mode_str, "accept")) { + *mode = NC_SSH_KNOWNHOSTS_ACCEPT; + } else if (!strcmp(mode_str, "accept-new")) { + *mode = NC_SSH_KNOWNHOSTS_ACCEPT_NEW; + } else if (!strcmp(mode_str, "skip")) { + *mode = NC_SSH_KNOWNHOSTS_SKIP; + } else if (!strcmp(mode_str, "strict")) { + *mode = NC_SSH_KNOWNHOSTS_STRICT; + } else { + *mode = NC_SSH_KNOWNHOSTS_ASK; + } +} + void load_config(void) { char *netconf_dir = NULL, *config_file = NULL; - struct lyd_node *config = NULL, *child; + struct lyd_node *config = NULL, *match = NULL, *client; struct ly_ctx *ctx = NULL; #ifdef NC_ENABLED_SSH_TLS const char *key_pub, *key_priv; - struct lyd_node *auth_child, *pref_child, *key_child, *pair_child; + struct lyd_node *parent = NULL, *key = NULL, *auth_pref = NULL; #endif if ((netconf_dir = get_netconf_dir()) == NULL) { @@ -273,6 +303,11 @@ load_config(void) goto cleanup; } + if (lys_parse_mem(ctx, netopeer2_cli_yang, LYS_IN_YANG, NULL)) { + ERROR(__func__, "Failed to load netopeer2-cli YANG module from memory."); + goto cleanup; + } + if (asprintf(&config_file, "%s/config.xml", netconf_dir) == -1) { ERROR(__func__, "asprintf() failed (%s:%d).", __FILE__, __LINE__); ERROR(__func__, "Unable to load configuration due to the previous error."); @@ -283,83 +318,92 @@ load_config(void) goto cleanup; } - if (lyd_parse_data_path(ctx, config_file, LYD_XML, LYD_PARSE_ONLY | LYD_PARSE_OPAQ, 0, &config)) { + if (lyd_parse_data_path(ctx, config_file, LYD_XML, 0, LYD_VALIDATE_PRESENT, &config)) { ERROR(__func__, "Failed to load configuration of NETCONF client (lyxml_read_path failed)."); goto cleanup; } - if (strcmp(LYD_NAME(config), "netconf-client")) { + if (!config || strcmp(LYD_NAME(config), "netconf-client")) { ERROR(__func__, "Unknown stored configuration data."); goto cleanup; } - LY_LIST_FOR(lyd_child(config), child) { - if (!strcmp(LYD_NAME(child), "editor")) { - /* -> */ - free(opts.config_editor); - opts.config_editor = strdup(lyd_get_value(child)); - } else if (!strcmp(LYD_NAME(child), "searchpath")) { - /* -> */ - errno = 0; - if (!mkdir(lyd_get_value(child), 00700) || (errno == EEXIST)) { - if (errno == 0) { - ERROR(__func__, "Search path \"%s\" did not exist, created.", lyd_get_value(child)); - } - nc_client_set_schema_searchpath(lyd_get_value(child)); - } else { - ERROR(__func__, "Search path \"%s\" cannot be created (%s).", lyd_get_value(child), strerror(errno)); + client = config; + + /* -> */ + lyd_find_path(client, "editor", 0, &match); + if (match) { + free(opts.config_editor); + opts.config_editor = strdup(lyd_get_value(match)); + } + + /* -> */ + lyd_find_path(client, "search-path", 0, &match); + if (match) { + errno = 0; + if (!mkdir(lyd_get_value(match), 00700) || (errno == EEXIST)) { + if (errno == 0) { + ERROR(__func__, "Search path \"%s\" did not exist, created.", lyd_get_value(match)); } - } else if (!strcmp(LYD_NAME(child), "output-format")) { - /* -> */ - if (!strcmp(lyd_get_value(child), "json")) { - opts.output_format = LYD_JSON; - opts.output_flag = 0; - } else if (!strcmp(lyd_get_value(child), "json_noformat")) { - opts.output_format = LYD_JSON; - opts.output_flag = LYD_PRINT_SHRINK; - } else if (!strcmp(lyd_get_value(child), "xml_noformat")) { - opts.output_format = LYD_XML; - opts.output_flag = LYD_PRINT_SHRINK; - } /* else default (formatted XML) */ + nc_client_set_schema_searchpath(lyd_get_value(match)); + } else { + ERROR(__func__, "Search path \"%s\" cannot be created (%s).", lyd_get_value(match), strerror(errno)); } + } + + /* -> */ + lyd_find_path(client, "output-format", 0, &match); + if (!strcmp(lyd_get_value(match), "json")) { + opts.output_format = LYD_JSON; + } /* else default (formatted XML) */ + + /* -> */ + lyd_find_path(client, "shrink", 0, &match); + if (!strcmp(lyd_get_value(match), "true")) { + opts.output_flag = 1; + } /* else default (formatted XML) */ #ifdef NC_ENABLED_SSH_TLS - else if (!strcmp(LYD_NAME(child), "authentication")) { - /* -> */ - LY_LIST_FOR(lyd_child(child), auth_child) { - if (!strcmp(LYD_NAME(auth_child), "pref")) { - LY_LIST_FOR(lyd_child(auth_child), pref_child) { - if (!strcmp(LYD_NAME(pref_child), "publickey")) { - nc_client_ssh_set_auth_pref(NC_SSH_AUTH_PUBLICKEY, atoi(lyd_get_value(pref_child))); - } else if (!strcmp(LYD_NAME(pref_child), "interactive")) { - nc_client_ssh_set_auth_pref(NC_SSH_AUTH_INTERACTIVE, atoi(lyd_get_value(pref_child))); - } else if (!strcmp(LYD_NAME(pref_child), "password")) { - nc_client_ssh_set_auth_pref(NC_SSH_AUTH_PASSWORD, atoi(lyd_get_value(pref_child))); - } - } - } else if (!strcmp(LYD_NAME(auth_child), "keys")) { - LY_LIST_FOR(lyd_child(auth_child), key_child) { - if (!strcmp(LYD_NAME(key_child), "pair")) { - key_pub = NULL; - key_priv = NULL; - LY_LIST_FOR(lyd_child(key_child), pair_child) { - if (!strcmp(LYD_NAME(pair_child), "public")) { - key_pub = lyd_get_value(pair_child); - } else if (!strcmp(LYD_NAME(pair_child), "private")) { - key_priv = lyd_get_value(pair_child); - } - } - if (key_pub && key_priv) { - nc_client_ssh_ch_add_keypair(key_pub, key_priv); - nc_client_ssh_add_keypair(key_pub, key_priv); - } - } - } - } + lyd_find_path(client, "authentication", 0, &auth_pref); + + /* -> -> */ + lyd_find_path(auth_pref, "method-preference", 0, &parent); + lyd_find_path(parent, "publickey", 0, &match); + load_auth_pref(match, NC_SSH_AUTH_PUBLICKEY); + + lyd_find_path(parent, "interactive", 0, &match); + load_auth_pref(match, NC_SSH_AUTH_INTERACTIVE); + + lyd_find_path(parent, "password", 0, &match); + load_auth_pref(match, NC_SSH_AUTH_PASSWORD); + + /* -> -> */ + lyd_find_path(auth_pref, "keys", 0, &parent); + if (parent) { + LY_LIST_FOR(lyd_child(parent), key) { + key_pub = NULL; + key_priv = NULL; + + lyd_find_path(key, "public", 0, &match); + key_pub = lyd_get_value(match); + + lyd_find_path(key, "private", 0, &match); + key_priv = lyd_get_value(match); + + if (key_pub && key_priv) { + nc_client_ssh_ch_add_keypair(key_pub, key_priv); + nc_client_ssh_add_keypair(key_pub, key_priv); } } -#endif /* NC_ENABLED_SSH_TLS */ } + /* -> -> */ + lyd_find_path(auth_pref, "knownhost-mode", 0, &match); + str2knownhosts_mode(lyd_get_value(match), &opts.knownhosts_mode); + + nc_client_ssh_set_knownhosts_mode(opts.knownhosts_mode); + nc_client_ssh_ch_set_knownhosts_mode(opts.knownhosts_mode); +#endif /* NC_ENABLED_SSH_TLS */ + cleanup: lyd_free_tree(config); ly_ctx_destroy(ctx); @@ -367,17 +411,56 @@ load_config(void) free(netconf_dir); } +static int +store_auth_pref(int pref_type, struct lyd_node *auth_pref_parent, const char *auth_pref_name) +{ + int pref_value; + char buf[23]; + + pref_value = nc_client_ssh_get_auth_pref(pref_type); + if (pref_value < 0) { + if (lyd_new_term(auth_pref_parent, NULL, auth_pref_name, "disabled", 0, NULL)) { + return 1; + } + } else { + sprintf(buf, "%d", pref_value); + if (lyd_new_term(auth_pref_parent, NULL, auth_pref_name, buf, 0, NULL)) { + return 1; + } + } + + return 0; +} + +static void +knownhosts_mode2str(NC_SSH_KNOWNHOSTS_MODE mode, const char **str) +{ + if (mode == NC_SSH_KNOWNHOSTS_ACCEPT) { + *str = "accept"; + } else if (mode == NC_SSH_KNOWNHOSTS_ACCEPT_NEW) { + *str = "accept-new"; + } else if (mode == NC_SSH_KNOWNHOSTS_ASK) { + *str = "ask"; + } else if (mode == NC_SSH_KNOWNHOSTS_SKIP) { + *str = "skip"; + } else if (mode == NC_SSH_KNOWNHOSTS_STRICT) { + *str = "strict"; + } else { + *str = NULL; + } +} + void store_config(void) { #ifdef NC_ENABLED_SSH_TLS - char buf[23]; struct lyd_node *auth, *pref, *keys, *pair; #endif /* NC_ENABLED_SSH_TLS */ char *netconf_dir = NULL, *history_file = NULL, *config_file = NULL; struct ly_ctx *ctx = NULL; struct lyd_node *root = NULL; - const char *str, *ns = "urn:cesnet:netconf-client"; + struct lys_module *cli = NULL; + const char *str; if (ly_ctx_new(NULL, 0, &ctx)) { ERROR(__func__, "Failed to create context."); @@ -385,59 +468,73 @@ store_config(void) goto cleanup; } - if (lyd_new_opaq2(NULL, ctx, "netconf-client", NULL, NULL, ns, &root)) { + if (lys_parse_mem(ctx, netopeer2_cli_yang, LYS_IN_YANG, &cli)) { + ERROR(__func__, "Failed to load netopeer2-cli YANG module from memory."); goto cleanup; } - /* editor */ - if (lyd_new_opaq2(root, NULL, "editor", opts.config_editor, NULL, ns, NULL)) { + if (lyd_new_inner(NULL, cli, "netconf-client", 0, &root)) { + ERROR(__func__, "Failed to create contanier netconf-client."); goto cleanup; } - /* search-path */ - if (nc_client_get_schema_searchpath()) { - if (lyd_new_opaq2(root, NULL, "searchpath", nc_client_get_schema_searchpath(), NULL, ns, NULL)) { - goto cleanup; - } + /* editor */ + if (lyd_new_term(root, NULL, "editor", opts.config_editor, 0, NULL)) { + goto cleanup; } /* output-format */ if (opts.output_format == LYD_JSON) { - str = opts.output_flag ? "json_noformat" : "json"; + str = "json"; + } else if (opts.output_format == LYD_XML) { + str = "xml"; } else { - str = opts.output_flag ? "xml_noformat" : "xml"; + ERROR(__func__, "Unknown format."); + goto cleanup; + } + + if (lyd_new_term(root, NULL, "output-format", str, 0, NULL)) { + goto cleanup; } - if (lyd_new_opaq2(root, NULL, "output-format", str, NULL, ns, NULL)) { + + /* shrink*/ + if (lyd_new_term(root, NULL, "shrink", opts.output_flag ? "true" : "false", 0, NULL)) { goto cleanup; } + /* search-path */ + if (nc_client_get_schema_searchpath()) { + if (lyd_new_term(root, NULL, "searchpath", nc_client_get_schema_searchpath(), 0, NULL)) { + goto cleanup; + } + } + #ifdef NC_ENABLED_SSH_TLS /* SSH authentication */ - if (lyd_new_opaq2(root, NULL, "authentication", NULL, NULL, ns, &auth)) { + if (lyd_new_inner(root, NULL, "authentication", 0, &auth)) { goto cleanup; } /* pref */ - if (lyd_new_opaq2(auth, NULL, "pref", NULL, NULL, ns, &pref)) { + if (lyd_new_inner(auth, NULL, "method-preference", 0, &pref)) { goto cleanup; } - sprintf(buf, "%d", nc_client_ssh_get_auth_pref(NC_SSH_AUTH_PUBLICKEY)); - if (lyd_new_opaq2(pref, NULL, "publickey", buf, NULL, ns, NULL)) { + if (store_auth_pref(NC_SSH_AUTH_PUBLICKEY, pref, "publickey")) { goto cleanup; } - sprintf(buf, "%d", nc_client_ssh_get_auth_pref(NC_SSH_AUTH_PASSWORD)); - if (lyd_new_opaq2(pref, NULL, "password", buf, NULL, ns, NULL)) { + + if (store_auth_pref(NC_SSH_AUTH_PASSWORD, pref, "password")) { goto cleanup; } - sprintf(buf, "%d", nc_client_ssh_get_auth_pref(NC_SSH_AUTH_INTERACTIVE)); - if (lyd_new_opaq2(pref, NULL, "interactive", buf, NULL, ns, NULL)) { + + if (store_auth_pref(NC_SSH_AUTH_INTERACTIVE, pref, "interactive")) { goto cleanup; } /* keys */ if (nc_client_ssh_get_keypair_count()) { - if (lyd_new_opaq2(auth, NULL, "keys", NULL, NULL, ns, &keys)) { + if (lyd_new_inner(auth, NULL, "keys", 0, &keys)) { goto cleanup; } @@ -446,17 +543,25 @@ store_config(void) const char *priv_key, *pub_key; nc_client_ssh_get_keypair(i, &pub_key, &priv_key); - if (lyd_new_opaq2(keys, NULL, "pair", NULL, NULL, ns, &pair)) { - goto cleanup; - } - if (lyd_new_opaq2(pair, NULL, "public", pub_key, NULL, ns, NULL)) { + if (lyd_new_list(keys, NULL, "pair", 0, &pair, pub_key)) { goto cleanup; } - if (lyd_new_opaq2(pair, NULL, "private", priv_key, NULL, ns, NULL)) { + if (lyd_new_term(pair, NULL, "private", priv_key, 0, NULL)) { goto cleanup; } } } + + /* knownhost-mode */ + knownhosts_mode2str(opts.knownhosts_mode, &str); + if (!str) { + ERROR(__func__, "Unknown known host mode."); + goto cleanup; + } + + if (lyd_new_term(auth, NULL, "knownhost-mode", str, 0, NULL)) { + goto cleanup; + } #endif /* NC_ENABLED_SSH_TLS */ /* get netconf dir */ diff --git a/cli/configuration.h b/cli/configuration.h index 9959dcf0..ad6d3ff7 100644 --- a/cli/configuration.h +++ b/cli/configuration.h @@ -26,6 +26,7 @@ struct cli_opts { LYD_FORMAT output_format; uint32_t output_flag; char *config_editor; + NC_SSH_KNOWNHOSTS_MODE knownhosts_mode; }; extern struct cli_opts opts; diff --git a/cli/netopeer2-cli@2026-04-24.yang b/cli/netopeer2-cli@2026-04-24.yang new file mode 100644 index 00000000..66adea6f --- /dev/null +++ b/cli/netopeer2-cli@2026-04-24.yang @@ -0,0 +1,139 @@ +module netopeer2-cli { + namespace "urn:cesnet:netopeer2-cli"; + prefix cli; + + yang-version 1.1; + + organization + "CESNET"; + + contact + "Author: Petr Hanzlik + "; + + description + "This module contains the configuration data for the Netopeer2 NETCONF + Command Line Interface (CLI) client."; + + revision "2026-04-24" { + description + "Initial revision."; + } + + typedef auth-preference { + type union { + type uint16; + type enumeration { + enum disabled { + description "Authentication method is disabled."; + } + } + } + description + "Specifies the preference level for an authentication method. + A higher number indicates a higher priority."; + } + + container netconf-client { + description + "Global configuration and settings for the Netopeer2 CLI client."; + + leaf output-format { + type enumeration { + enum xml; + enum json; + } + default "xml"; + description + "Determines the data format in which the server's replies will be displayed."; + } + + leaf shrink { + type boolean; + default false; + description + "If set to true, the client will print the output minimized, + removing extra whitespaces and indentation."; + } + + leaf editor { + type string; + description + "Specifies the path or command for the preferred text editor + to be used for interactive inputs (e.g., 'vim', 'nano')."; + } + + leaf search-path { + type string; + description + "Specifies the directory path where the client will search + for required YANG schemas."; + } + + container authentication { + description + "Configuration related to the SSH/TLS authentication methods + used by the client to connect to a NETCONF server."; + + container method-preference { + description + "Preferences for different SSH authentication methods. + The client will attempt methods in the order of their preference."; + + leaf publickey { + type auth-preference; + default 3; + description + "Preference level for public key authentication."; + } + + leaf password { + type auth-preference; + default 2; + description + "Preference level for password authentication."; + } + + leaf interactive { + type auth-preference; + default 1; + description + "Preference level for keyboard-interactive authentication."; + } + } + + container keys { + description + "Configuration of cryptographic key pairs used for client authentication."; + + list pair { + key public; + description + "A list of associated public and private key pairs."; + + leaf public { + type string; + description + "File path to the public key (e.g., '~/.ssh/id_rsa.pub')."; + } + + leaf private { + type string; + mandatory true; + description + "File path to the corresponding private key (e.g., '~/.ssh/id_rsa')."; + } + } + } + + leaf knownhost-mode { + type string; + default "ask"; + description + "Specifies the mode for handling known host keys. + Possible values include 'accept', 'accept-new', 'ask', 'skip' and 'strict'. + If does not exist, the default is 'ask'."; + } + } + } +} diff --git a/cli/netopeer2_cli_yang.h b/cli/netopeer2_cli_yang.h new file mode 100644 index 00000000..b6c5398f --- /dev/null +++ b/cli/netopeer2_cli_yang.h @@ -0,0 +1,367 @@ +char netopeer2_cli_yang[] = { + 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x6e, 0x65, 0x74, 0x6f, 0x70, + 0x65, 0x65, 0x72, 0x32, 0x2d, 0x63, 0x6c, 0x69, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x20, 0x22, 0x75, 0x72, 0x6e, 0x3a, 0x63, 0x65, 0x73, 0x6e, 0x65, 0x74, + 0x3a, 0x6e, 0x65, 0x74, 0x6f, 0x70, 0x65, 0x65, 0x72, 0x32, 0x2d, 0x63, + 0x6c, 0x69, 0x22, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x65, + 0x66, 0x69, 0x78, 0x20, 0x63, 0x6c, 0x69, 0x3b, 0x0a, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x79, 0x61, 0x6e, 0x67, 0x2d, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x20, 0x31, 0x2e, 0x31, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x43, + 0x45, 0x53, 0x4e, 0x45, 0x54, 0x22, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, + 0x3a, 0x20, 0x50, 0x65, 0x74, 0x72, 0x20, 0x48, 0x61, 0x6e, 0x7a, 0x6c, + 0x69, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70, 0x68, 0x61, + 0x6e, 0x7a, 0x6c, 0x69, 0x6b, 0x40, 0x63, 0x65, 0x73, 0x6e, 0x65, 0x74, + 0x2e, 0x63, 0x7a, 0x3e, 0x22, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x54, 0x68, 0x69, + 0x73, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x64, 0x61, 0x74, 0x61, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x4e, 0x65, 0x74, 0x6f, 0x70, 0x65, 0x65, 0x72, 0x32, 0x20, 0x4e, + 0x45, 0x54, 0x43, 0x4f, 0x4e, 0x46, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x20, 0x4c, 0x69, 0x6e, 0x65, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, + 0x61, 0x63, 0x65, 0x20, 0x28, 0x43, 0x4c, 0x49, 0x29, 0x20, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x22, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x22, 0x32, + 0x30, 0x32, 0x36, 0x2d, 0x30, 0x34, 0x2d, 0x32, 0x34, 0x22, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x49, 0x6e, + 0x69, 0x74, 0x69, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x2e, 0x22, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, + 0x20, 0x61, 0x75, 0x74, 0x68, 0x2d, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x75, 0x6e, 0x69, 0x6f, + 0x6e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x75, 0x69, 0x6e, + 0x74, 0x31, 0x36, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x6e, + 0x75, 0x6d, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x75, 0x6d, 0x20, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x22, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x68, + 0x6f, 0x64, 0x20, 0x69, 0x73, 0x20, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x2e, 0x22, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x53, 0x70, 0x65, + 0x63, 0x69, 0x66, 0x69, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, + 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x6c, 0x65, + 0x76, 0x65, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x20, 0x61, + 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x2e, 0x20, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x41, 0x20, 0x68, 0x69, 0x67, 0x68, 0x65, 0x72, 0x20, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, + 0x73, 0x20, 0x61, 0x20, 0x68, 0x69, 0x67, 0x68, 0x65, 0x72, 0x20, 0x70, + 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x2e, 0x22, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x20, 0x6e, 0x65, 0x74, 0x63, + 0x6f, 0x6e, 0x66, 0x2d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x47, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x4e, 0x65, 0x74, 0x6f, 0x70, 0x65, 0x65, 0x72, + 0x32, 0x20, 0x43, 0x4c, 0x49, 0x20, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x2e, 0x22, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x65, 0x61, 0x66, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x2d, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x20, 0x65, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x75, + 0x6d, 0x20, 0x78, 0x6d, 0x6c, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x75, 0x6d, 0x20, 0x6a, 0x73, 0x6f, 0x6e, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x22, 0x78, 0x6d, 0x6c, + 0x22, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x44, 0x65, 0x74, 0x65, + 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, + 0x61, 0x74, 0x61, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x69, + 0x6e, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x27, 0x73, 0x20, 0x72, 0x65, 0x70, + 0x6c, 0x69, 0x65, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, + 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x2e, 0x22, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x61, + 0x66, 0x20, 0x73, 0x68, 0x72, 0x69, 0x6e, 0x6b, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x3b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x66, 0x61, 0x6c, + 0x73, 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x49, 0x66, 0x20, + 0x73, 0x65, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x20, + 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x6d, 0x69, + 0x6e, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x2c, 0x20, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x20, + 0x65, 0x78, 0x74, 0x72, 0x61, 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x6e, + 0x64, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x3b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x61, 0x66, + 0x20, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x6f, + 0x72, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, + 0x72, 0x65, 0x64, 0x20, 0x74, 0x65, 0x78, 0x74, 0x20, 0x65, 0x64, 0x69, + 0x74, 0x6f, 0x72, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6f, + 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x20, 0x28, 0x65, 0x2e, 0x67, + 0x2e, 0x2c, 0x20, 0x27, 0x76, 0x69, 0x6d, 0x27, 0x2c, 0x20, 0x27, 0x6e, + 0x61, 0x6e, 0x6f, 0x27, 0x29, 0x2e, 0x22, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x61, 0x66, 0x20, 0x73, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x2d, 0x70, 0x61, 0x74, 0x68, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, + 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x79, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x77, 0x68, + 0x65, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x73, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x20, 0x59, 0x41, + 0x4e, 0x47, 0x20, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2e, 0x22, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, + 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, + 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x53, + 0x48, 0x2f, 0x54, 0x4c, 0x53, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, + 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x73, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, + 0x73, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x4e, 0x45, + 0x54, 0x43, 0x4f, 0x4e, 0x46, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x2e, 0x22, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x2d, 0x70, 0x72, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x74, 0x20, 0x53, 0x53, 0x48, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, + 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x73, 0x2e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x54, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x74, 0x74, 0x65, + 0x6d, 0x70, 0x74, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x20, + 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x70, 0x72, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x22, 0x3b, 0x0a, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x61, 0x66, 0x20, 0x70, 0x75, + 0x62, 0x6c, 0x69, 0x63, 0x6b, 0x65, 0x79, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x61, + 0x75, 0x74, 0x68, 0x2d, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x33, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, + 0x6b, 0x65, 0x79, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x61, + 0x66, 0x20, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x20, 0x61, 0x75, 0x74, 0x68, 0x2d, 0x70, 0x72, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x32, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, + 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x6c, 0x65, + 0x76, 0x65, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, + 0x61, 0x66, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x61, 0x75, 0x74, 0x68, 0x2d, 0x70, + 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x20, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x6b, 0x65, 0x79, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2d, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x20, 0x61, 0x75, 0x74, + 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x22, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x20, 0x6b, 0x65, + 0x79, 0x73, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x63, + 0x72, 0x79, 0x70, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, + 0x20, 0x6b, 0x65, 0x79, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x75, + 0x73, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x3b, 0x0a, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x70, 0x61, 0x69, 0x72, 0x20, + 0x7b, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6b, + 0x65, 0x79, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x41, 0x20, 0x6c, 0x69, + 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, + 0x61, 0x74, 0x65, 0x64, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, + 0x6b, 0x65, 0x79, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x2e, 0x22, 0x3b, + 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, + 0x61, 0x66, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x46, 0x69, 0x6c, 0x65, 0x20, 0x70, + 0x61, 0x74, 0x68, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x28, 0x65, + 0x2e, 0x67, 0x2e, 0x2c, 0x20, 0x27, 0x7e, 0x2f, 0x2e, 0x73, 0x73, 0x68, + 0x2f, 0x69, 0x64, 0x5f, 0x72, 0x73, 0x61, 0x2e, 0x70, 0x75, 0x62, 0x27, + 0x29, 0x2e, 0x22, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x65, 0x61, 0x66, 0x20, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x6f, 0x72, + 0x79, 0x20, 0x74, 0x72, 0x75, 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x46, 0x69, 0x6c, 0x65, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x72, 0x69, 0x76, + 0x61, 0x74, 0x65, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x28, 0x65, 0x2e, 0x67, + 0x2e, 0x2c, 0x20, 0x27, 0x7e, 0x2f, 0x2e, 0x73, 0x73, 0x68, 0x2f, 0x69, + 0x64, 0x5f, 0x72, 0x73, 0x61, 0x27, 0x29, 0x2e, 0x22, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x61, 0x66, 0x20, 0x6b, + 0x6e, 0x6f, 0x77, 0x6e, 0x68, 0x6f, 0x73, 0x74, 0x2d, 0x6d, 0x6f, 0x64, + 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x22, 0x61, 0x73, + 0x6b, 0x22, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, + 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x69, 0x6e, 0x67, + 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x68, 0x6f, 0x73, 0x74, 0x20, + 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x50, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x20, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x20, 0x27, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x27, 0x2c, 0x20, + 0x27, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x2d, 0x6e, 0x65, 0x77, 0x27, + 0x2c, 0x20, 0x27, 0x61, 0x73, 0x6b, 0x27, 0x2c, 0x20, 0x27, 0x73, 0x6b, + 0x69, 0x70, 0x27, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x27, 0x73, 0x74, 0x72, + 0x69, 0x63, 0x74, 0x27, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x49, 0x66, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x69, 0x73, 0x20, + 0x27, 0x61, 0x73, 0x6b, 0x27, 0x2e, 0x22, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x0a, 0x7d, 0x0a, 0x00 +};